diff --git a/character/clan.js b/character/clan.js index 5965e5668..af3fafa2f 100644 --- a/character/clan.js +++ b/character/clan.js @@ -1,2854 +1,5161 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character',function(){ +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { //clan n.宗派;(尤指苏格兰的)宗族,氏族,家族;庞大的家族;帮派;小集团 - name:'clan', - connect:true, - character:{ - clan_wuxian:['female','shu',3,['clanyirong','clanguixiang','clanmuyin'],['clan:陈留吴氏']], - clan_wuban:['male','shu',4,['clanzhanding','clanmuyin'],['clan:陈留吴氏']], - clan_xunshu:['male','qun',3,['clanshenjun','clanbalong','clandaojie'],['clan:颍川荀氏']], - clan_xunchen:['male','qun',3,['clansankuang','clanbeishi','clandaojie'],['clan:颍川荀氏']], - clan_xuncai:['female','qun',3,['clanlieshi','clandianzhan','clanhuanyin','clandaojie'],['clan:颍川荀氏']], - clan_xuncan:['male','wei',3,['clanyunshen','clanshangshen','clanfenchai','clandaojie'],['clan:颍川荀氏']], - clan_hanshao:['male','qun',3,['clanfangzhen','clanliuju','clanxumin'],['clan:颍川韩氏']], - clan_hanrong:['male','qun',3,['clanlianhe','clanhuanjia','clanxumin'],['clan:颍川韩氏']], - clan_wukuang:['male','qun',4,['clanlianzhu','clanmuyin'],['clan:陈留吴氏']], - clan_wangling:['male','wei',4,['clanbolong','clanzhongliu'],['clan:太原王氏']], - clan_zhongyan:['female','jin',3,['clanguangu','clanxiaoyong','clanbaozu'],['clan:颍川钟氏']], - clan_wangyun:['male','qun',3,['clanjiexuan','clanmingjie','clanzhongliu'],['clan:太原王氏']], - clan_wanghun:['male','jin',3,['clanfuxun','clanchenya','clanzhongliu'],['clan:太原王氏']], - clan_zhonghui:['male','wei','3/4',['clanyuzhi','clanxieshu','clanbaozu'],['clan:颍川钟氏']], - clan_zhongyu:['male','wei',3,['clanjiejian','clanhuanghan','clanbaozu'],['clan:颍川钟氏']], - clan_wanglun:['male','jin',3,['clanqiuxin','clanjianyuan','clanzhongliu'],['clan:太原王氏']], - clan_xunyou:['male','wei',3,['clanbaichu','clandaojie'],['clan:颍川荀氏']], - clan_wuqiao:['male','jin',4,['clanqiajue','clanmuyin'],['clan:陈留吴氏']], - clan_wangguang:['male','wei',3,['clanlilun','clanjianji','clanzhongliu'],['clan:太原王氏']], - clan_wangmingshan:['male','wei',3,['clantanque','clanshengmo','clanzhongliu'],['clan:太原王氏']], + name: "clan", + connect: true, + character: { + clan_wuxian: [ + "female", + "shu", + 3, + ["clanyirong", "clanguixiang", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_wuban: [ + "male", + "shu", + 4, + ["clanzhanding", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_xunshu: [ + "male", + "qun", + 3, + ["clanshenjun", "clanbalong", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_xunchen: [ + "male", + "qun", + 3, + ["clansankuang", "clanbeishi", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_xuncai: [ + "female", + "qun", + 3, + ["clanlieshi", "clandianzhan", "clanhuanyin", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_xuncan: [ + "male", + "wei", + 3, + ["clanyunshen", "clanshangshen", "clanfenchai", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_hanshao: [ + "male", + "qun", + 3, + ["clanfangzhen", "clanliuju", "clanxumin"], + ["clan:颍川韩氏"], + ], + clan_hanrong: [ + "male", + "qun", + 3, + ["clanlianhe", "clanhuanjia", "clanxumin"], + ["clan:颍川韩氏"], + ], + clan_wukuang: [ + "male", + "qun", + 4, + ["clanlianzhu", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_wangling: [ + "male", + "wei", + 4, + ["clanbolong", "clanzhongliu"], + ["clan:太原王氏"], + ], + clan_zhongyan: [ + "female", + "jin", + 3, + ["clanguangu", "clanxiaoyong", "clanbaozu"], + ["clan:颍川钟氏"], + ], + clan_wangyun: [ + "male", + "qun", + 3, + ["clanjiexuan", "clanmingjie", "clanzhongliu"], + ["clan:太原王氏"], + ], + clan_wanghun: [ + "male", + "jin", + 3, + ["clanfuxun", "clanchenya", "clanzhongliu"], + ["clan:太原王氏"], + ], + clan_zhonghui: [ + "male", + "wei", + "3/4", + ["clanyuzhi", "clanxieshu", "clanbaozu"], + ["clan:颍川钟氏"], + ], + clan_zhongyu: [ + "male", + "wei", + 3, + ["clanjiejian", "clanhuanghan", "clanbaozu"], + ["clan:颍川钟氏"], + ], + clan_wanglun: [ + "male", + "jin", + 3, + ["clanqiuxin", "clanjianyuan", "clanzhongliu"], + ["clan:太原王氏"], + ], + clan_xunyou: [ + "male", + "wei", + 3, + ["clanbaichu", "clandaojie"], + ["clan:颍川荀氏"], + ], + clan_wuqiao: [ + "male", + "jin", + 4, + ["clanqiajue", "clanmuyin"], + ["clan:陈留吴氏"], + ], + clan_wangguang: [ + "male", + "wei", + 3, + ["clanlilun", "clanjianji", "clanzhongliu"], + ["clan:太原王氏"], + ], + clan_wangmingshan: [ + "male", + "wei", + 3, + ["clantanque", "clanshengmo", "clanzhongliu"], + ["clan:太原王氏"], + ], }, - characterSort:{ - clan:{ - clan_wu:['clan_wuxian','clan_wuban','clan_wukuang','clan_wuqiao'], - clan_xun:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan','clan_xunyou'], - clan_han:['clan_hanshao','clan_hanrong'], - clan_wang:['clan_wangling','clan_wangyun','clan_wanghun','clan_wanglun','clan_wangguang','clan_wangmingshan'], - clan_zhong:['clan_zhongyan','clan_zhonghui','clan_zhongyu'], + characterSort: { + clan: { + clan_wu: [ + "clan_wuxian", + "clan_wuban", + "clan_wukuang", + "clan_wuqiao", + ], + clan_xun: [ + "clan_xunshu", + "clan_xunchen", + "clan_xuncai", + "clan_xuncan", + "clan_xunyou", + ], + clan_han: ["clan_hanshao", "clan_hanrong"], + clan_wang: [ + "clan_wangling", + "clan_wangyun", + "clan_wanghun", + "clan_wanglun", + "clan_wangguang", + "clan_wangmingshan", + ], + clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu"], }, }, /** @type { importCharacterConfig['skill'] } */ - skill:{ + skill: { //族王明山 - clantanque:{ - audio:2, - trigger:{player:'useCardAfter'}, - usable:1, - filter(event,player){ - const evt=lib.skill.dcjianying.getLastUsed(player,event); - if(!evt||!evt.card) return false; - const curCard=event.card,prevCard=evt.card; - const curNum=get.number(curCard),prevNum=get.number(prevCard); - if(typeof curNum!='number'||typeof prevNum!='number') return false; - const delNum=Math.abs(curNum-prevNum); - if(delNum===0) return false; - return game.hasPlayer(current=>{ - return current.getHp()===delNum; + clantanque: { + audio: 2, + trigger: { player: "useCardAfter" }, + usable: 1, + filter(event, player) { + const evt = lib.skill.dcjianying.getLastUsed(player, event); + if (!evt || !evt.card) return false; + const curCard = event.card, + prevCard = evt.card; + const curNum = get.number(curCard), + prevNum = get.number(prevCard); + if (typeof curNum != "number" || typeof prevNum != "number") + return false; + const delNum = Math.abs(curNum - prevNum); + if (delNum === 0) return false; + return game.hasPlayer((current) => { + return current.getHp() === delNum; }); }, - locked:false, - async cost(event,trigger,player){ - const evt=lib.skill.dcjianying.getLastUsed(player,trigger); - const curCard=trigger.card,prevCard=evt.card; - const curNum=get.number(curCard),prevNum=get.number(prevCard); - const delNum=Math.abs(curNum-prevNum); - event.result=await player.chooseTarget(get.prompt('clantanque'),`对一名体力值为${delNum}的角色造成1点伤害`,(card,player,target)=>{ - return target.getHp()===get.event('delNum'); - }).set('delNum',delNum).set('ai',target=>{ - return get.damageEffect(target,get.player(),get.player()); - }).forResult(); + locked: false, + async cost(event, trigger, player) { + const evt = lib.skill.dcjianying.getLastUsed( + player, + trigger + ); + const curCard = trigger.card, + prevCard = evt.card; + const curNum = get.number(curCard), + prevNum = get.number(prevCard); + const delNum = Math.abs(curNum - prevNum); + event.result = await player + .chooseTarget( + get.prompt("clantanque"), + `对一名体力值为${delNum}的角色造成1点伤害`, + (card, player, target) => { + return target.getHp() === get.event("delNum"); + } + ) + .set("delNum", delNum) + .set("ai", (target) => { + return get.damageEffect( + target, + get.player(), + get.player() + ); + }) + .forResult(); }, - async content(event,trigger,player){ - const target=event.targets[0]; + async content(event, trigger, player) { + const target = event.targets[0]; await target.damage(); await game.asyncDelayx(); }, - mod:{ - aiOrder(player,card,num){ - if(typeof card!='object') return; - const evt=lib.skill.dcjianying.getLastUsed(player); - if(!evt||!evt.card) return; - const curNum=get.number(card),prevNum=get.number(evt.card); - if(typeof curNum!='number'||typeof prevNum!='number') return; - const pairs=game.filterPlayer().map(current=>{ - return [current.getHp(),get.damageEffect(current,player,player)]; - }).filter(pair=>pair[1]>0); - if(!pairs.length) return; - const delNum=Math.abs(curNum-prevNum); - for(const [hp,eff] of pairs){ - if(hp!=delNum) continue; - return num+10+(pairs.filter(pair=>pair[0]===hp).sort((a,b)=>b[1]-a[1])[0][1])/20; + mod: { + aiOrder(player, card, num) { + if (typeof card != "object") return; + const evt = lib.skill.dcjianying.getLastUsed(player); + if (!evt || !evt.card) return; + const curNum = get.number(card), + prevNum = get.number(evt.card); + if ( + typeof curNum != "number" || + typeof prevNum != "number" + ) + return; + const pairs = game + .filterPlayer() + .map((current) => { + return [ + current.getHp(), + get.damageEffect(current, player, player), + ]; + }) + .filter((pair) => pair[1] > 0); + if (!pairs.length) return; + const delNum = Math.abs(curNum - prevNum); + for (const [hp, eff] of pairs) { + if (hp != delNum) continue; + return ( + num + + 10 + + pairs + .filter((pair) => pair[0] === hp) + .sort((a, b) => b[1] - a[1])[0][1] / + 20 + ); } }, - } + }, }, - clanshengmo:{ - audio:2, - enable:'chooseToUse', - hiddenCard(player,name){ - if(get.type(name)!='basic') return false; - if(!player.getStorage('clanshengmo').includes(name)&&(get.event('clanshengmo_cards')||[]).length>0) return true; + clanshengmo: { + audio: 2, + enable: "chooseToUse", + hiddenCard(player, name) { + if (get.type(name) != "basic") return false; + if ( + !player.getStorage("clanshengmo").includes(name) && + (get.event("clanshengmo_cards") || []).length > 0 + ) + return true; }, - filter(event,player){ - if(event.responded) return false; - const names=lib.inpile.filter(name=>get.type(name)=='basic'&&!player.getStorage('clanshengmo').includes(name)),cards=get.event('clanshengmo_cards')||[]; - return cards.length>0&&names.some(name=>{ - return event.filterCard({name,isCard:true},player,event); - }); + filter(event, player) { + if (event.responded) return false; + const names = lib.inpile.filter( + (name) => + get.type(name) == "basic" && + !player.getStorage("clanshengmo").includes(name) + ), + cards = get.event("clanshengmo_cards") || []; + return ( + cards.length > 0 && + names.some((name) => { + return event.filterCard( + { name, isCard: true }, + player, + event + ); + }) + ); }, - onChooseToUse(event){ - if(game.online) return; - if(!event.clanshengmo_cards){ - let cards=[]; - game.checkGlobalHistory('cardMove',evt=>{ - if(evt.name!='cardsDiscard'&&(evt.name!='lose'||evt.position!=ui.discardPile)) return; - cards.addArray(evt.cards.filter(card=>get.position(card,true)=='d')); + onChooseToUse(event) { + if (game.online) return; + if (!event.clanshengmo_cards) { + let cards = []; + game.checkGlobalHistory("cardMove", (evt) => { + if ( + evt.name != "cardsDiscard" && + (evt.name != "lose" || + evt.position != ui.discardPile) + ) + return; + cards.addArray( + evt.cards.filter( + (card) => get.position(card, true) == "d" + ) + ); }); - const numbers=cards.map(card=>get.number(card,false)).unique(); - const [min,max]=[Math.min(...numbers),Math.max(...numbers)]; - event.set('clanshengmo_cards',cards.filter(card=>{ - const num=get.number(card,false); - return num>min&&num get.number(card, false)) + .unique(); + const [min, max] = [ + Math.min(...numbers), + Math.max(...numbers), + ]; + event.set( + "clanshengmo_cards", + cards.filter((card) => { + const num = get.number(card, false); + return num > min && num < max; + }) + ); } }, - async content(event,trigger,player){ + async content(event, trigger, player) { const evt = event.getParent(2); - const names = lib.inpile.filter(name => get.type(name) == 'basic' && !player.getStorage('clanshengmo').includes(name)), cards = evt.clanshengmo_cards; - const links = await player.chooseButton(['剩墨:获得其中一张牌', cards], true).set('ai', button => { - return get.value(button.link); - }).forResultLinks(); + const names = lib.inpile.filter( + (name) => + get.type(name) == "basic" && + !player.getStorage("clanshengmo").includes(name) + ), + cards = evt.clanshengmo_cards; + const links = await player + .chooseButton(["剩墨:获得其中一张牌", cards], true) + .set("ai", (button) => { + return get.value(button.link); + }) + .forResultLinks(); if (!links || !links.length) return; const list = []; for (const name of names) { const card = { name, isCard: true }; if (evt.filterCard(card, player, evt)) { - list.push(['基本', '', name]); + list.push(["基本", "", name]); } - if (name == 'sha') { + if (name == "sha") { for (const nature of lib.inpile_nature) { card.nature = nature; if (evt.filterCard(card, player, evt)) { - list.push(['基本', '', name, nature]); + list.push(["基本", "", name, nature]); } } } } if (!list.length) return; - const links2 = await player.chooseButton(['视为使用一张未以此法使用过的基本牌', [list, 'vcard']], true).set('ai', button => { - return get.player().getUseValue(button.link) + 1; - }).forResultLinks(); - const name = links2[0][2], nature = links2[0][3]; - game.broadcastAll((name, nature, toGain) => { - lib.skill.clanshengmo_backup.viewAs = { - name, - nature, - isCard: true, - }; - lib.skill.clanshengmo_backup.prompt = `选择${get.translation(nature)}【${get.translation(name)}】的目标`; - lib.skill.clanshengmo_backup.cardToGain = toGain; - }, name, nature, links[0]); - evt.set('_backupevent', 'clanshengmo_backup'); - evt.backup('clanshengmo_backup'); - evt.set('openskilldialog', `选择${get.translation(nature)}【${get.translation(name)}】的目标`); - evt.set('norestore', true); - evt.set('custom', { + const links2 = await player + .chooseButton( + [ + "视为使用一张未以此法使用过的基本牌", + [list, "vcard"], + ], + true + ) + .set("ai", (button) => { + return get.player().getUseValue(button.link) + 1; + }) + .forResultLinks(); + const name = links2[0][2], + nature = links2[0][3]; + game.broadcastAll( + (name, nature, toGain) => { + lib.skill.clanshengmo_backup.viewAs = { + name, + nature, + isCard: true, + }; + lib.skill.clanshengmo_backup.prompt = `选择${get.translation( + nature + )}【${get.translation(name)}】的目标`; + lib.skill.clanshengmo_backup.cardToGain = toGain; + }, + name, + nature, + links[0] + ); + evt.set("_backupevent", "clanshengmo_backup"); + evt.backup("clanshengmo_backup"); + evt.set( + "openskilldialog", + `选择${get.translation(nature)}【${get.translation( + name + )}】的目标` + ); + evt.set("norestore", true); + evt.set("custom", { add: {}, - replace: { window() { } } + replace: { window() {} }, }); evt.goto(0); }, - marktext:'墨', - intro:{ - content:'已以此法使用过$' + marktext: "墨", + intro: { + content: "已以此法使用过$", }, - subSkill:{ - backup:{ - precontent(){ + subSkill: { + backup: { + precontent() { delete event.result.skill; event.result.card.storage.clanshengmo = true; - player.markAuto('clanshengmo',event.result.card.name); - player.gain(lib.skill.clanshengmo_backup.cardToGain, 'gain2'); + player.markAuto( + "clanshengmo", + event.result.card.name + ); + player.gain( + lib.skill.clanshengmo_backup.cardToGain, + "gain2" + ); }, - filterCard:()=>false, - selectCard:-1, + filterCard: () => false, + selectCard: -1, }, }, - ai:{ - order:3, - result:{ - player(player){ - if(get.event().dying) return get.attitude(player, get.event().dying); - if(get.event().type!='phase') return 1; - const names=lib.inpile.filter(name=>get.type(name)=='basic'&&!player.getStorage('clanshengmo').includes(name)); - if(Array.isArray(names)){ - return names.some(name=>{ - return player.getUseValue({name})>0; + ai: { + order: 3, + result: { + player(player) { + if (get.event().dying) + return get.attitude(player, get.event().dying); + if (get.event().type != "phase") return 1; + const names = lib.inpile.filter( + (name) => + get.type(name) == "basic" && + !player + .getStorage("clanshengmo") + .includes(name) + ); + if (Array.isArray(names)) { + return names.some((name) => { + return player.getUseValue({ name }) > 0; }); } return 0; - } - } - } + }, + }, + }, }, //族贝斯塔[doge] - clanlilun:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return player.hasCard(card=>get.info('clanlilun').filterCard(card,player),'h'); + clanlilun: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.hasCard( + (card) => + get.info("clanlilun").filterCard(card, player), + "h" + ); }, - filterCard(card,player){ - if(player.getStorage('clanlilun').includes(card.name)) return false; - if(ui.selected.cards.length&&ui.selected.cards[0].name!=card.name) return false; - const cards=player.getCards('h',cardx=>player.canRecast(cardx)); - return cards.includes(card)&&cards.filter(i=>i.name==card.name).length>1; + filterCard(card, player) { + if (player.getStorage("clanlilun").includes(card.name)) + return false; + if ( + ui.selected.cards.length && + ui.selected.cards[0].name != card.name + ) + return false; + const cards = player.getCards("h", (cardx) => + player.canRecast(cardx) + ); + return ( + cards.includes(card) && + cards.filter((i) => i.name == card.name).length > 1 + ); }, - selectCard:2, - position:'h', - check(card){ - const player=get.event('player'); - const value=function(card,player){ - const num=player.getUseValue(card); - return num>0?(num+(1/(get.value(card)||0.5))+7):7-get.value(card); + selectCard: 2, + position: "h", + check(card) { + const player = get.event("player"); + const value = function (card, player) { + const num = player.getUseValue(card); + return num > 0 + ? num + 1 / (get.value(card) || 0.5) + 7 + : 7 - get.value(card); }; - if(ui.selected.cards.length&&value(card,player){ - player.unmarkSkill('clanlilun'); + if (!player.storage.clanlilun) { + player.when({ global: "phaseAfter" }).then(() => { + player.unmarkSkill("clanlilun"); delete player.storage.clanlilun; }); } - player.markAuto('clanlilun',event.cards.slice().map(card=>card.name)); - const cards=event.cards.filterInD('d'); - if(cards.some(card=>player.hasUseTarget(card))){ - const {result:{bool,links}}=await player.chooseButton(['离论:是否使用其中的一张牌?',cards]).set('filterButton',button=>{ - return get.event('player').hasUseTarget(button.link); - }).set('ai',button=>{ - return get.event('player').getUseValue(button.link); - }); - if(bool){ - const card=links[0]; - player.$gain2(card,false); + player.markAuto( + "clanlilun", + event.cards.slice().map((card) => card.name) + ); + const cards = event.cards.filterInD("d"); + if (cards.some((card) => player.hasUseTarget(card))) { + const { + result: { bool, links }, + } = await player + .chooseButton([ + "离论:是否使用其中的一张牌?", + cards, + ]) + .set("filterButton", (button) => { + return get + .event("player") + .hasUseTarget(button.link); + }) + .set("ai", (button) => { + return get + .event("player") + .getUseValue(button.link); + }); + if (bool) { + const card = links[0]; + player.$gain2(card, false); await game.asyncDelayx(); - await player.chooseUseTarget(true,card,false); + await player.chooseUseTarget(true, card, false); } } }, - onremove:true, - intro:{content:'本回合已重铸过$'}, - ai:{ - order(item,player){ - let cards=player.getCards('h',card=>get.info('clanlilun').filterCard(card,player)&&player.getUseValue(card)>0); - cards=cards.filter(card=>cards.filter(i=>i.name==card.name).length>1); - if(!cards.length) return 1; - cards.sort((a,b)=>get.order(b)-get.order(a)); - return get.order(cards[0])-0.001; + onremove: true, + intro: { content: "本回合已重铸过$" }, + ai: { + order(item, player) { + let cards = player.getCards( + "h", + (card) => + get + .info("clanlilun") + .filterCard(card, player) && + player.getUseValue(card) > 0 + ); + cards = cards.filter( + (card) => + cards.filter((i) => i.name == card.name) + .length > 1 + ); + if (!cards.length) return 1; + cards.sort((a, b) => get.order(b) - get.order(a)); + return get.order(cards[0]) - 0.001; }, - result:{player:1}, + result: { player: 1 }, }, }, - clanjianji:{ - unique:true, - limited:true, - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter(event,player){ - if(!event.player.isIn()) return false; - const targets=game.filterPlayer(target=>{ - return event.player.getPrevious()==target||event.player.getNext()==target; + clanjianji: { + unique: true, + limited: true, + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + if (!event.player.isIn()) return false; + const targets = game.filterPlayer((target) => { + return ( + event.player.getPrevious() == target || + event.player.getNext() == target + ); }); - if(!targets.length) return false; - const card=new lib.element.VCard({name:'sha'}); - return !targets.some(target=>{ - return target.getHistory('useCard').length; - })||(player.hasUseTarget(card)&&!targets.some(target=>{ - return game.hasPlayer2(current=>{ - return current.getHistory('useCard',evt=>{ - return evt.targets&&evt.targets.includes(target); - }).length; - }); - })); + if (!targets.length) return false; + const card = new lib.element.VCard({ name: "sha" }); + return ( + !targets.some((target) => { + return target.getHistory("useCard").length; + }) || + (player.hasUseTarget(card) && + !targets.some((target) => { + return game.hasPlayer2((current) => { + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; + }); + })) + ); }, - skillAnimation:true, - animationColor:'watar', - prompt2(event,player){ - let str=''; - const card=new lib.element.VCard({name:'sha'}); - const targets=game.filterPlayer(target=>{ - return event.player.getPrevious()==target||event.player.getNext()==target; - }),bool=(!targets.some(target=>{ - return target.getHistory('useCard').length; - })),goon=(player.hasUseTarget(card)&&!targets.some(target=>{ - return game.hasPlayer2(current=>{ - return current.getHistory('useCard',evt=>{ - return evt.targets&&evt.targets.includes(target); - }).length; - }); - })); - if(bool){ - if(goon) str+='你可以'; - str+='与'+get.translation(get.translation(event.player))+'各摸一张牌'; + skillAnimation: true, + animationColor: "watar", + prompt2(event, player) { + let str = ""; + const card = new lib.element.VCard({ name: "sha" }); + const targets = game.filterPlayer((target) => { + return ( + event.player.getPrevious() == target || + event.player.getNext() == target + ); + }), + bool = !targets.some((target) => { + return target.getHistory("useCard").length; + }), + goon = + player.hasUseTarget(card) && + !targets.some((target) => { + return game.hasPlayer2((current) => { + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; + }); + }); + if (bool) { + if (goon) str += "你可以"; + str += + "与" + + get.translation(get.translation(event.player)) + + "各摸一张牌"; } - if(goon){ - if(bool) str+=',然后你可以'; - str+='视为使用一张【杀】'; + if (goon) { + if (bool) str += ",然后你可以"; + str += "视为使用一张【杀】"; } return str; }, - check(event,player){ - const card=new lib.element.VCard({name:'sha'}); - const targets=game.filterPlayer(target=>{ - return event.player.getPrevious()==target||event.player.getNext()==target; - }),bool=(!targets.some(target=>{ - return target.getHistory('useCard').length; - })),goon=(player.hasUseTarget(card)&&!targets.some(target=>{ - return game.hasPlayer2(current=>{ - return current.getHistory('useCard',evt=>{ - return evt.targets&&evt.targets.includes(target); - }).length; - }); - })); - return (bool&&(get.attitude(player,event.player)>0||event.player.countCards('h')>player.countCards('h')))||(goon&&player.hasValueTarget(card)); + check(event, player) { + const card = new lib.element.VCard({ name: "sha" }); + const targets = game.filterPlayer((target) => { + return ( + event.player.getPrevious() == target || + event.player.getNext() == target + ); + }), + bool = !targets.some((target) => { + return target.getHistory("useCard").length; + }), + goon = + player.hasUseTarget(card) && + !targets.some((target) => { + return game.hasPlayer2((current) => { + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; + }); + }); + return ( + (bool && + (get.attitude(player, event.player) > 0 || + event.player.countCards("h") > + player.countCards("h"))) || + (goon && player.hasValueTarget(card)) + ); }, - logTarget:'player', - async content(event,trigger,player){ - player.awakenSkill('clanjianji'); - const card=new lib.element.VCard({name:'sha'}); - const targets=game.filterPlayer(target=>{ - return trigger.player.getPrevious()==target||trigger.player.getNext()==target; - }),boolx=(!targets.some(target=>{ - return target.getHistory('useCard').length; - })),goon=(player.hasUseTarget(card)&&!targets.some(target=>{ - return game.hasPlayer2(current=>{ - return current.getHistory('useCard',evt=>{ - return evt.targets&&evt.targets.includes(target); - }).length; - }); - })); - if(boolx){ - let draw=false; - if(goon){ - const {result:{bool}}=await player.chooseBool('是否与'+get.translation(trigger.player)+'各摸一张牌?').set('choice',get.attitude(player,trigger.player)>0||trigger.player.countCards('h')>player.countCards('h')); - if(bool) draw=true; - } - else draw=true; - if(draw){ - await player.draw('nodelay'); + logTarget: "player", + async content(event, trigger, player) { + player.awakenSkill("clanjianji"); + const card = new lib.element.VCard({ name: "sha" }); + const targets = game.filterPlayer((target) => { + return ( + trigger.player.getPrevious() == target || + trigger.player.getNext() == target + ); + }), + boolx = !targets.some((target) => { + return target.getHistory("useCard").length; + }), + goon = + player.hasUseTarget(card) && + !targets.some((target) => { + return game.hasPlayer2((current) => { + return current.getHistory( + "useCard", + (evt) => { + return ( + evt.targets && + evt.targets.includes(target) + ); + } + ).length; + }); + }); + if (boolx) { + let draw = false; + if (goon) { + const { + result: { bool }, + } = await player + .chooseBool( + "是否与" + + get.translation(trigger.player) + + "各摸一张牌?" + ) + .set( + "choice", + get.attitude(player, trigger.player) > 0 || + trigger.player.countCards("h") > + player.countCards("h") + ); + if (bool) draw = true; + } else draw = true; + if (draw) { + await player.draw("nodelay"); await trigger.player.draw(); } } - if(goon) await player.chooseUseTarget(card,false,!boolx); + if (goon) await player.chooseUseTarget(card, false, !boolx); }, }, //族吴乔 - clanqiajue:{ - audio:2, - trigger:{player:'phaseDrawBegin'}, - filter(event,player){ - return player.countCards('he',card=>{ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.color(card,player)=='black'&&lib.filter.cardDiscardable(card,player); - })>0; + clanqiajue: { + audio: 2, + trigger: { player: "phaseDrawBegin" }, + filter(event, player) { + return ( + player.countCards("he", (card) => { + if ( + _status.connectMode && + get.position(card) == "h" + ) + return true; + return ( + get.color(card, player) == "black" && + lib.filter.cardDiscardable(card, player) + ); + }) > 0 + ); }, - direct:true, - async content(event,trigger,player){ - const {result:{bool}}=await player.chooseToDiscard((card,player)=>{ - return get.color(card,player)=='black'&&lib.filter.cardDiscardable(card,player); - },'he') - .set('prompt','当前手牌点数和为'+player.getCards('h').reduce((sum,card)=>sum+get.number(card),0)+','+get.prompt('clanqiajue')) - .set('prompt2',lib.translate.clanqiajue_info.slice(lib.translate.clanqiajue_info.indexOf('弃置')).slice(0,-1)) - .set('ai',card=>{ - const player=get.event('player'),goon=get.position(card)=='h'; - let num=player.getCards('h').reduce((sum,card)=>sum+get.number(card),0); - if(num-(goon?get.number(card):0)>30) return 0; - return goon?get.number(card):1/(get.value(card)||0.5); - }).set('logSkill','clanqiajue'); - if(bool){ - player.when({player:['phaseDrawEnd','phaseDrawCancelled','phaseUseSkipped']}) - .filter(evt=>evt==trigger) - .then(()=>{ - const cards=player.getCards('h'),num=cards.reduce((sum,card)=>sum+get.number(card),0); - if(cards.length) player.showCards(cards,get.translation(player)+'【跒倔】展示'); - if(num>30){ - player.popup('杯具'); - lib.skill.chenliuwushi.change(player,-2); - } - else{ - player.popup('洗具'); - const next=player.phaseDraw(); - event.next.remove(next); - trigger.getParent('phase').next.push(next); - } + direct: true, + async content(event, trigger, player) { + const { + result: { bool }, + } = await player + .chooseToDiscard((card, player) => { + return ( + get.color(card, player) == "black" && + lib.filter.cardDiscardable(card, player) + ); + }, "he") + .set( + "prompt", + "当前手牌点数和为" + + player + .getCards("h") + .reduce( + (sum, card) => sum + get.number(card), + 0 + ) + + "," + + get.prompt("clanqiajue") + ) + .set( + "prompt2", + lib.translate.clanqiajue_info + .slice( + lib.translate.clanqiajue_info.indexOf( + "弃置" + ) + ) + .slice(0, -1) + ) + .set("ai", (card) => { + const player = get.event("player"), + goon = get.position(card) == "h"; + let num = player + .getCards("h") + .reduce( + (sum, card) => sum + get.number(card), + 0 + ); + if (num - (goon ? get.number(card) : 0) > 30) + return 0; + return goon + ? get.number(card) + : 1 / (get.value(card) || 0.5); }) + .set("logSkill", "clanqiajue"); + if (bool) { + player + .when({ + player: [ + "phaseDrawEnd", + "phaseDrawCancelled", + "phaseUseSkipped", + ], + }) + .filter((evt) => evt == trigger) + .then(() => { + const cards = player.getCards("h"), + num = cards.reduce( + (sum, card) => sum + get.number(card), + 0 + ); + if (cards.length) + player.showCards( + cards, + get.translation(player) + "【跒倔】展示" + ); + if (num > 30) { + player.popup("杯具"); + lib.skill.chenliuwushi.change(player, -2); + } else { + player.popup("洗具"); + const next = player.phaseDraw(); + event.next.remove(next); + trigger.getParent("phase").next.push(next); + } + }); } }, }, //族荀攸 - clanbaichu:{ - derivation:'qice', - audio:2, - trigger:{player:'useCardAfter'}, - filter(event,player){ - const storage=player.storage.clanbaichu||{}; - if(Object.values(storage).includes(event.card.name)) return true; - const suit=get.suit(event.card); - if(suit=='none') return false; - if(!player.hasSkill('qice')) return true; - const key=`${suit}+${get.type2(event.card)}`; - return !(key in storage) + clanbaichu: { + derivation: "qice", + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + const storage = player.storage.clanbaichu || {}; + if (Object.values(storage).includes(event.card.name)) + return true; + const suit = get.suit(event.card); + if (suit == "none") return false; + if (!player.hasSkill("qice")) return true; + const key = `${suit}+${get.type2(event.card)}`; + return !(key in storage); }, - forced:true, - content(){ - 'step 0' - var storage=player.storage.clanbaichu||{},suit=get.suit(trigger.card); - if(suit!='none'){ - var key=`${suit}+${get.type2(trigger.card)}`; - if(key in storage){ - if(!player.hasSkill('qice')){ - player.addTempSkills('qice','roundStart'); - player.popup('奇策'); + forced: true, + content() { + "step 0"; + var storage = player.storage.clanbaichu || {}, + suit = get.suit(trigger.card); + if (suit != "none") { + var key = `${suit}+${get.type2(trigger.card)}`; + if (key in storage) { + if (!player.hasSkill("qice")) { + player.addTempSkills("qice", "roundStart"); + player.popup("奇策"); // game.log(player,'获得了技能','#g【奇策】'); } event.goto(2); - } - else{ - var list=lib.inpile.filter(name=>get.type(name)=='trick'); + } else { + var list = lib.inpile.filter( + (name) => get.type(name) == "trick" + ); list.removeArray(Object.values(storage)); - if(list.length>0){ - var dialog=['百出:选择记录一种普通锦囊牌',[list,'vcard']]; - player.chooseButton(dialog,true).set('ai',function(button){ - var player=_status.event.player,name=button.link[2]; - if(name==_status.event.getTrigger().card.name) return 1919810; - if(name=='wuxie') return 114514; - return get.effect(player,{name:name},player,player)*(1+player.countCards('hs',name)); - }); - } - else event.goto(2); + if (list.length > 0) { + var dialog = [ + "百出:选择记录一种普通锦囊牌", + [list, "vcard"], + ]; + player + .chooseButton(dialog, true) + .set("ai", function (button) { + var player = _status.event.player, + name = button.link[2]; + if ( + name == + _status.event.getTrigger().card.name + ) + return 1919810; + if (name == "wuxie") return 114514; + return ( + get.effect( + player, + { name: name }, + player, + player + ) * + (1 + player.countCards("hs", name)) + ); + }); + } else event.goto(2); } - } - else event.goto(2); - 'step 1' - if(result.bool){ - var key=`${get.suit(trigger.card)}+${get.type2(trigger.card)}`,name=result.links[0][2]; - if(!player.storage.clanbaichu) player.storage.clanbaichu={}; - player.storage.clanbaichu[key]=name; - player.markSkill('clanbaichu'); - game.log(player,'记录了','#y'+get.translation(name)); + } else event.goto(2); + ("step 1"); + if (result.bool) { + var key = `${get.suit(trigger.card)}+${get.type2( + trigger.card + )}`, + name = result.links[0][2]; + if (!player.storage.clanbaichu) + player.storage.clanbaichu = {}; + player.storage.clanbaichu[key] = name; + player.markSkill("clanbaichu"); + game.log( + player, + "记录了", + "#y" + get.translation(name) + ); game.delayx(); } - 'step 2' - if(Object.values(player.getStorage('clanbaichu')).includes(trigger.card.name)){ + ("step 2"); + if ( + Object.values(player.getStorage("clanbaichu")).includes( + trigger.card.name + ) + ) { player.chooseDrawRecover(true); } }, - intro:{ - markcount(storage){ + intro: { + markcount(storage) { return Object.keys(storage).length; }, - content(storage){ - if(!storage) return '当前暂无记录'; - const keys=Object.keys(storage).map(i=>i.split('+')); - keys.sort((a,b)=>{ - if(a[0]!=b[0]) return lib.suit.indexOf(b[0])-lib.suit.indexOf(a[0]); - return lib.sort.name(a[1],b[1]); + content(storage) { + if (!storage) return "当前暂无记录"; + const keys = Object.keys(storage).map((i) => + i.split("+") + ); + keys.sort((a, b) => { + if (a[0] != b[0]) + return ( + lib.suit.indexOf(b[0]) - + lib.suit.indexOf(a[0]) + ); + return lib.sort.name(a[1], b[1]); }); - return keys.map(item=>{ - return `
  • ${get.translation(item[0])}+${get.translation(item[1])}:【${get.translation(storage[item.join('+')])}】`; - }).join('
    '); + return keys + .map((item) => { + return `
  • ${get.translation( + item[0] + )}+${get.translation( + item[1] + )}:【${get.translation( + storage[item.join("+")] + )}】`; + }) + .join("
    "); }, }, }, //族王沦 - clanqiuxin:{ - audio:2, - enable:'phaseUse', - filterTarget:lib.filter.notMe, - usable:1, - content(){ - 'step 0' - var str=get.translation(player); - target.chooseControl().set('choiceList',[ - str+'下次对你使用【杀】后,其视为对你使用任意普通锦囊牌', - str+'下次对你使用任意普通锦囊牌后,其视为对你使用【杀】', - ]).set('ai',function(){ - var target=_status.event.player; - var player=_status.event.target; - var num1=get.effect(target,get.autoViewAs({name:'sha'},[]),player,player); - if(!player.canUse(get.autoViewAs({name:'sha'},[]),target)) num1=0; - var num2=0; - for(var name of lib.inpile){ - if(get.type(name)!='trick') continue; - if(!player.canUse(get.autoViewAs({name:name},[]),target)) continue; - if(num2=num2?1:0; - }).set('target',player); - 'step 1' - player.addSkill('clanqiuxin_effect'); - player.markAuto('clanqiuxin_effect',[[target,result.index]]); + clanqiuxin: { + audio: 2, + enable: "phaseUse", + filterTarget: lib.filter.notMe, + usable: 1, + content() { + "step 0"; + var str = get.translation(player); + target + .chooseControl() + .set("choiceList", [ + str + + "下次对你使用【杀】后,其视为对你使用任意普通锦囊牌", + str + + "下次对你使用任意普通锦囊牌后,其视为对你使用【杀】", + ]) + .set("ai", function () { + var target = _status.event.player; + var player = _status.event.target; + var num1 = get.effect( + target, + get.autoViewAs({ name: "sha" }, []), + player, + player + ); + if ( + !player.canUse( + get.autoViewAs({ name: "sha" }, []), + target + ) + ) + num1 = 0; + var num2 = 0; + for (var name of lib.inpile) { + if (get.type(name) != "trick") continue; + if ( + !player.canUse( + get.autoViewAs({ name: name }, []), + target + ) + ) + continue; + if ( + num2 < + get.effect( + target, + get.autoViewAs({ name: name }, []), + player, + player + ) + ) + num2 = get.effect( + target, + get.autoViewAs({ name: name }, []), + player, + player + ); + } + return num1 >= num2 ? 1 : 0; + }) + .set("target", player); + ("step 1"); + player.addSkill("clanqiuxin_effect"); + player.markAuto("clanqiuxin_effect", [ + [target, result.index], + ]); }, - ai:{ - order:9, - result:{ - target(player,target){ - var cards=player.getCards('hs',card=>{ - if(get.name(card,player)!='sha'&&get.type(card,player)!='trick') return false; + ai: { + order: 9, + result: { + target(player, target) { + var cards = player.getCards("hs", (card) => { + if ( + get.name(card, player) != "sha" && + get.type(card, player) != "trick" + ) + return false; return player.hasValueTarget(card); }); - if(cards.some(card=>player.canUse(card,target)&&get.effect(target,card,player,player)>0)){ - var att=get.attitude(player,target); - if(att>0) return 9; - if(att<0) return -6; + if ( + cards.some( + (card) => + player.canUse(card, target) && + get.effect( + target, + card, + player, + player + ) > 0 + ) + ) { + var att = get.attitude(player, target); + if (att > 0) return 9; + if (att < 0) return -6; return 0; - } - else{ - var att=get.attitude(player,target); - if(att<0) return -3; - if(att>0) return 1; + } else { + var att = get.attitude(player, target); + if (att < 0) return -3; + if (att > 0) return 1; return 2; } }, }, }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - intro:{ - content(storage,player){ - var str=''; - for(var i=0;i{ - return player.getStorage('clanqiuxin_effect').some(list=>list[0]==target&&list[1]==0); - }); - if(get.type(event.card)=='trick') return event.targets.some(target=>{ - return player.getStorage('clanqiuxin_effect').some(list=>list[0]==target&&list[1]==1); - }); + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (!event.targets || !event.targets.length) + return false; + if (event.card.name == "sha") + return event.targets.some((target) => { + return player + .getStorage("clanqiuxin_effect") + .some( + (list) => + list[0] == target && + list[1] == 0 + ); + }); + if (get.type(event.card) == "trick") + return event.targets.some((target) => { + return player + .getStorage("clanqiuxin_effect") + .some( + (list) => + list[0] == target && + list[1] == 1 + ); + }); return false; }, - forced:true, - popup:false, - content(){ - 'step 0' + forced: true, + popup: false, + content() { + "step 0"; var list; - if(trigger.card.name=='sha') list=player.getStorage('clanqiuxin_effect').filter(listx=>trigger.targets.includes(listx[0])&&listx[1]==0); - if(get.type(trigger.card)=='trick') list=player.getStorage('clanqiuxin_effect').filter(listx=>trigger.targets.includes(listx[0])&&listx[1]==1); - player.unmarkAuto('clanqiuxin_effect',list); - var targets=list.map(listx=>listx[0]); - event.targets=targets; - 'step 1' - var target=event.targets.shift(); - event.target=target; - var list=[]; - for(var name of lib.inpile){ - if(name!='sha'&&get.type(name)!='trick') continue; - if(trigger.card.name=='sha'&&get.type(name)!='trick') continue; - if(name=='sha'&&get.type(trigger.card)!='trick') continue; - if(!player.canUse(get.autoViewAs({name:name},[]),target)) continue; - list.push([get.translation(get.type(name)),'',name]); + if (trigger.card.name == "sha") + list = player + .getStorage("clanqiuxin_effect") + .filter( + (listx) => + trigger.targets.includes( + listx[0] + ) && listx[1] == 0 + ); + if (get.type(trigger.card) == "trick") + list = player + .getStorage("clanqiuxin_effect") + .filter( + (listx) => + trigger.targets.includes( + listx[0] + ) && listx[1] == 1 + ); + player.unmarkAuto("clanqiuxin_effect", list); + var targets = list.map((listx) => listx[0]); + event.targets = targets; + ("step 1"); + var target = event.targets.shift(); + event.target = target; + var list = []; + for (var name of lib.inpile) { + if (name != "sha" && get.type(name) != "trick") + continue; + if ( + trigger.card.name == "sha" && + get.type(name) != "trick" + ) + continue; + if ( + name == "sha" && + get.type(trigger.card) != "trick" + ) + continue; + if ( + !player.canUse( + get.autoViewAs({ name: name }, []), + target + ) + ) + continue; + list.push([ + get.translation(get.type(name)), + "", + name, + ]); } - if(!list.length) event.goto(3); - else{ - player.chooseButton(['求心:视为对'+get.translation(target)+'使用一张牌',[list,'vcard']],true).set('ai',function(button){ - var player=_status.event.player; - var target=_status.event.target; - return get.effect(target,{name:button.link[2],nature:button.link[3]},player,player); - }).set('target',target); + if (!list.length) event.goto(3); + else { + player + .chooseButton( + [ + "求心:视为对" + + get.translation(target) + + "使用一张牌", + [list, "vcard"], + ], + true + ) + .set("ai", function (button) { + var player = _status.event.player; + var target = _status.event.target; + return get.effect( + target, + { + name: button.link[2], + nature: button.link[3], + }, + player, + player + ); + }) + .set("target", target); } - 'step 2' - if(result.bool){ - var card={ - name:result.links[0][2], - nature:result.links[0][3], + ("step 2"); + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], }; - player.useCard(card,target,false); + player.useCard(card, target, false); } - 'step 3' - if(event.targets.length) event.goto(1); - else if(!player.getStorage('clanqiuxin_effect').length) player.removeSkill('clanqiuxin_effect'); + ("step 3"); + if (event.targets.length) event.goto(1); + else if ( + !player.getStorage("clanqiuxin_effect").length + ) + player.removeSkill("clanqiuxin_effect"); }, }, }, }, - clanjianyuan:{ - inherit:'clanchenya', - filter(event,player){ - for(var phase of lib.phaseName){ - var evt=event.getParent(phase); - if(evt&&evt.name==phase){ - if(event.player.getHistory('useCard',evtx=>evtx.getParent(phase)==evt).length) return lib.skill.clanchenya.filter(event,player); + clanjianyuan: { + inherit: "clanchenya", + filter(event, player) { + for (var phase of lib.phaseName) { + var evt = event.getParent(phase); + if (evt && evt.name == phase) { + if ( + event.player.getHistory( + "useCard", + (evtx) => evtx.getParent(phase) == evt + ).length + ) + return lib.skill.clanchenya.filter( + event, + player + ); } } return false; }, - content(){ - 'step 0' - var num=0; - for(var phase of lib.phaseName){ - var evt=trigger.getParent(phase); - if(evt&&evt.name==phase){ - num+=trigger.player.getHistory('useCard',evtx=>evtx.getParent(phase)==evt).length; + content() { + "step 0"; + var num = 0; + for (var phase of lib.phaseName) { + var evt = trigger.getParent(phase); + if (evt && evt.name == phase) { + num += trigger.player.getHistory( + "useCard", + (evtx) => evtx.getParent(phase) == evt + ).length; } } - trigger.player.chooseCard('是否重铸任意张牌名字数为'+num+'的牌?',[1,Infinity],'he',(card,player)=>_status.event.cards.includes(card)&&player.canRecast(card)).set('ai',card=>{ - var val=get.value(card); - return 6-val; - }).set('cards',trigger.player.getCards('he',card=>{ - return get.cardNameLength(card)==num; - })); - 'step 1' - if(result.bool) trigger.player.recast(result.cards); + trigger.player + .chooseCard( + "是否重铸任意张牌名字数为" + num + "的牌?", + [1, Infinity], + "he", + (card, player) => + _status.event.cards.includes(card) && + player.canRecast(card) + ) + .set("ai", (card) => { + var val = get.value(card); + return 6 - val; + }) + .set( + "cards", + trigger.player.getCards("he", (card) => { + return get.cardNameLength(card) == num; + }) + ); + ("step 1"); + if (result.bool) trigger.player.recast(result.cards); }, }, //族钟毓 - clanjiejian:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(!event.isFirstTarget||get.type(event.card)=='equip') return false; - return get.cardNameLength(event.card)==player.getHistory('useCard').indexOf(event.getParent())+1; + clanjiejian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget || get.type(event.card) == "equip") + return false; + return ( + get.cardNameLength(event.card) == + player + .getHistory("useCard") + .indexOf(event.getParent()) + + 1 + ); }, - direct:true, - locked:false, - content(){ - 'step 0' - var num=get.cardNameLength(trigger.card); - event.num=num; - player.chooseTarget(get.prompt('clanjiejian'),'令一名目标角色摸'+get.cnNumber(num)+'张牌',function(card,player,target){ - return _status.event.getTrigger().targets.includes(target); - }).set('ai',target=>get.attitude(_status.event.player,target)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('clanjiejian',target); + direct: true, + locked: false, + content() { + "step 0"; + var num = get.cardNameLength(trigger.card); + event.num = num; + player + .chooseTarget( + get.prompt("clanjiejian"), + "令一名目标角色摸" + get.cnNumber(num) + "张牌", + function (card, player, target) { + return _status.event + .getTrigger() + .targets.includes(target); + } + ) + .set("ai", (target) => + get.attitude(_status.event.player, target) + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("clanjiejian", target); target.draw(num); } }, - ai:{ - threaten:3, - effect:{ - player(card,player,target){ - if(!target||typeof card!=='object'||player._clanjiejian_mod_temp||get.type(card)==='equip'|| - get.attitude(player,target)<=0||get.cardNameLength(card)!==player.getHistory('useCard').length+1) return; - let targets=[target],evt=_status.event.getParent('useCard'); + ai: { + threaten: 3, + effect: { + player(card, player, target) { + if ( + !target || + typeof card !== "object" || + player._clanjiejian_mod_temp || + get.type(card) === "equip" || + get.attitude(player, target) <= 0 || + get.cardNameLength(card) !== + player.getHistory("useCard").length + 1 + ) + return; + let targets = [target], + evt = _status.event.getParent("useCard"); targets.addArray(ui.selected.targets); - if(evt&&evt.card==card) targets.addArray(evt.targets); - return [1,0.8*get.cardNameLength(card)/targets.length]; - } - } + if (evt && evt.card == card) + targets.addArray(evt.targets); + return [ + 1, + (0.8 * get.cardNameLength(card)) / + targets.length, + ]; + }, + }, }, - mod:{ - aiOrder(player,card,num){ - if(typeof card=='object'&&get.type(card)!=='equip'){ - let cs=get.cardNameLength(card)-player.getHistory('useCard').length-1; - if(cs<0) return num; - if(cs>0) return num/3; - player._clanjiejian_mod_temp=true; - let bool=game.hasPlayer(target=>{ - if(get.attitude(player,target)<=0||!player.canUse(card,target,null,true)) return false; - return get.effect(target,card,player,player)+get.effect(target,{name:'draw'},player,player)>0; + mod: { + aiOrder(player, card, num) { + if ( + typeof card == "object" && + get.type(card) !== "equip" + ) { + let cs = + get.cardNameLength(card) - + player.getHistory("useCard").length - + 1; + if (cs < 0) return num; + if (cs > 0) return num / 3; + player._clanjiejian_mod_temp = true; + let bool = game.hasPlayer((target) => { + if ( + get.attitude(player, target) <= 0 || + !player.canUse(card, target, null, true) + ) + return false; + return ( + get.effect(target, card, player, player) + + get.effect( + target, + { name: "draw" }, + player, + player + ) > + 0 + ); }); delete player._clanjiejian_mod_temp; - if(bool) return num+15; + if (bool) return num + 15; } }, }, }, - clanhuanghan:{ - audio:2, - trigger:{player:'damageEnd'}, - filter(event,player){ - if(!event.card) return false; - var num=get.cardNameLength(event.card); - return typeof num=='number'&&num>0; + clanhuanghan: { + audio: 2, + trigger: { player: "damageEnd" }, + filter(event, player) { + if (!event.card) return false; + var num = get.cardNameLength(event.card); + return typeof num == "number" && num > 0; }, - check(event,player){ - let num=get.cardNameLength(event.card)-player.getDamagedHp(); - if(num>=0) return true; - if(num<-1) return false; - if(player.hasSkill('clanbaozu',null,false,false)&&player.awakenedSkills.includes('clanbaozu')&&player.getHistory('useSkill',evt=>{ - return evt.skill=='clanhuanghan'; - }).length) return true; + check(event, player) { + let num = + get.cardNameLength(event.card) - player.getDamagedHp(); + if (num >= 0) return true; + if (num < -1) return false; + if ( + player.hasSkill("clanbaozu", null, false, false) && + player.awakenedSkills.includes("clanbaozu") && + player.getHistory("useSkill", (evt) => { + return evt.skill == "clanhuanghan"; + }).length + ) + return true; return false; }, - content(){ - 'step 0' + content() { + "step 0"; player.draw(get.cardNameLength(trigger.card)); - if(player.isDamaged()) player.chooseToDiscard(player.getDamagedHp(),'he',true); - 'step 1' - if(player.getHistory('useSkill',evt=>evt.skill=='clanhuanghan').length>1&&player.hasSkill('clanbaozu',null,false,false)&&player.awakenedSkills.includes('clanbaozu')){ - player.restoreSkill('clanbaozu'); - player.popup('保族'); - game.log(player,'恢复了技能','#【保族】'); + if (player.isDamaged()) + player.chooseToDiscard( + player.getDamagedHp(), + "he", + true + ); + ("step 1"); + if ( + player.getHistory( + "useSkill", + (evt) => evt.skill == "clanhuanghan" + ).length > 1 && + player.hasSkill("clanbaozu", null, false, false) && + player.awakenedSkills.includes("clanbaozu") + ) { + player.restoreSkill("clanbaozu"); + player.popup("保族"); + game.log(player, "恢复了技能", "#【保族】"); } }, - ai:{ - threaten:3, - effect:{ - target(card,player,target){ - if(!get.tag(card,'damage')||player.hasSkillTag('jueqing',false,target)) return; - let num=get.cardNameLength(card)-target.getDamagedHp(); - if(num>0) return [1,num+0.1]; - } - } + ai: { + threaten: 3, + effect: { + target(card, player, target) { + if ( + !get.tag(card, "damage") || + player.hasSkillTag("jueqing", false, target) + ) + return; + let num = + get.cardNameLength(card) - + target.getDamagedHp(); + if (num > 0) return [1, num + 0.1]; + }, + }, }, }, //族钟会 - clanyuzhi:{ - mod:{ - aiOrder(player,card,num){ - if(card.name=='tao') return num/114514; + clanyuzhi: { + mod: { + aiOrder(player, card, num) { + if (card.name == "tao") return num / 114514; }, }, - audio:2, - trigger:{global:'roundStart'}, - direct:true, - locked:true, - content(){ - 'step 0' - player.unmarkSkill('clanyuzhi'); - if(player.countCards('h',card=>{ - return card.hasGaintag('clanyuzhi')&&lib.filter.cardDiscardable(card,player); - })){ - event.logged=true; - player.chooseToDiscard(player.countCards('h'),'h',(card,player)=>{ - return card.hasGaintag('clanyuzhi'); - },true).logSkill='clanyuzhi'; + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + locked: true, + content() { + "step 0"; + player.unmarkSkill("clanyuzhi"); + if ( + player.countCards("h", (card) => { + return ( + card.hasGaintag("clanyuzhi") && + lib.filter.cardDiscardable(card, player) + ); + }) + ) { + event.logged = true; + player.chooseToDiscard( + player.countCards("h"), + "h", + (card, player) => { + return card.hasGaintag("clanyuzhi"); + }, + true + ).logSkill = "clanyuzhi"; } - 'step 1' - player.removeGaintag('clanyuzhi'); - var num1=player.getRoundHistory('gain',evt=>{ - return evt.getParent().name=='draw'&&evt.getParent(2).name=='clanyuzhi'; - },1).reduce((sum,evt)=>sum+evt.cards.length,0); - var num2=player.getRoundHistory('gain',evt=>{ - return evt.getParent().name=='draw'&&evt.getParent(2).name=='clanyuzhi'; - },2).reduce((sum,evt)=>sum+evt.cards.length,0); - var num3=player.getRoundHistory('useCard',evt=>{ - return evt.cards&&evt.cards.length; - },1).reduce((sum,evt)=>sum+evt.cards.length,0); - event.num1=num1; - if(num1>0&&(num2>0&&num1>num2)||num1>num3){ - if(!event.logged) player.logSkill('clanyuzhi'); - if(num2>0&&num1>num2) game.log(player,'的野心已开始膨胀','#y('+num1+'张>'+num2+'张)'); - if(num1>num3) game.log(player,'的行动未达到野心','#y('+num3+'张<'+num1+'张)'); - if(player.hasSkill('clanbaozu',null,false,false)) player.chooseBool('迂志:是否失去〖保族〗?','若选择“否”,则你受到1点雷属性伤害').set('choice',player.awakenedSkills.includes('clanbaozu')); - else event._result={bool:false}; - } - else event.goto(3); - 'step 2' - if(result.bool){ - player.removeSkills('clanbaozu'); - } - else player.damage(1,'thunder'); - 'step 3' - if(player.countCards('h')){ - player.chooseCard('迂志:请展示一张手牌','摸此牌牌名字数的牌。下一轮开始时弃置此牌,若本轮你使用的牌数或上一轮你以此法摸的牌数小于此牌牌名字数,则你受到1点雷属性伤害或失去〖保族〗。',function(card,player){ - var num=get.cardNameLength(card); - return typeof num=='number'&&num>0; - },true).set('ai',function(card){ - if(_status.event.dying&&_status.event.num>0&&get.cardNameLength(card)>_status.event.num) return 1/get.cardNameLength(card);//怂 - return get.cardNameLength(card);//勇 - }).set('dying',player.hp+player.countCards('hs',{name:['tao','jiu']})<1).set('num',event.num1); - } - else event.finish(); - 'step 4' - if(result.bool){ - player.logSkill('clanyuzhi'); - player.showCards(result.cards,get.translation(player)+'发动了【迂志】'); - player.addGaintag(result.cards,'clanyuzhi'); + ("step 1"); + player.removeGaintag("clanyuzhi"); + var num1 = player + .getRoundHistory( + "gain", + (evt) => { + return ( + evt.getParent().name == "draw" && + evt.getParent(2).name == "clanyuzhi" + ); + }, + 1 + ) + .reduce((sum, evt) => sum + evt.cards.length, 0); + var num2 = player + .getRoundHistory( + "gain", + (evt) => { + return ( + evt.getParent().name == "draw" && + evt.getParent(2).name == "clanyuzhi" + ); + }, + 2 + ) + .reduce((sum, evt) => sum + evt.cards.length, 0); + var num3 = player + .getRoundHistory( + "useCard", + (evt) => { + return evt.cards && evt.cards.length; + }, + 1 + ) + .reduce((sum, evt) => sum + evt.cards.length, 0); + event.num1 = num1; + if ((num1 > 0 && num2 > 0 && num1 > num2) || num1 > num3) { + if (!event.logged) player.logSkill("clanyuzhi"); + if (num2 > 0 && num1 > num2) + game.log( + player, + "的野心已开始膨胀", + "#y(" + num1 + "张>" + num2 + "张)" + ); + if (num1 > num3) + game.log( + player, + "的行动未达到野心", + "#y(" + num3 + "张<" + num1 + "张)" + ); + if (player.hasSkill("clanbaozu", null, false, false)) + player + .chooseBool( + "迂志:是否失去〖保族〗?", + "若选择“否”,则你受到1点雷属性伤害" + ) + .set( + "choice", + player.awakenedSkills.includes("clanbaozu") + ); + else event._result = { bool: false }; + } else event.goto(3); + ("step 2"); + if (result.bool) { + player.removeSkills("clanbaozu"); + } else player.damage(1, "thunder"); + ("step 3"); + if (player.countCards("h")) { + player + .chooseCard( + "迂志:请展示一张手牌", + "摸此牌牌名字数的牌。下一轮开始时弃置此牌,若本轮你使用的牌数或上一轮你以此法摸的牌数小于此牌牌名字数,则你受到1点雷属性伤害或失去〖保族〗。", + function (card, player) { + var num = get.cardNameLength(card); + return typeof num == "number" && num > 0; + }, + true + ) + .set("ai", function (card) { + if ( + _status.event.dying && + _status.event.num > 0 && + get.cardNameLength(card) > _status.event.num + ) + return 1 / get.cardNameLength(card); //怂 + return get.cardNameLength(card); //勇 + }) + .set( + "dying", + player.hp + + player.countCards("hs", { + name: ["tao", "jiu"], + }) < + 1 + ) + .set("num", event.num1); + } else event.finish(); + ("step 4"); + if (result.bool) { + player.logSkill("clanyuzhi"); + player.showCards( + result.cards, + get.translation(player) + "发动了【迂志】" + ); + player.addGaintag(result.cards, "clanyuzhi"); player.draw(get.cardNameLength(result.cards[0])); - player.storage.clanyuzhi=get.cardNameLength(result.cards[0]); - player.markSkill('clanyuzhi'); + player.storage.clanyuzhi = get.cardNameLength( + result.cards[0] + ); + player.markSkill("clanyuzhi"); } }, - ai:{ - threaten:3, - nokeep:true, + ai: { + threaten: 3, + nokeep: true, }, - onremove:true, - intro:{content:'本轮野心:#张'}, + onremove: true, + intro: { content: "本轮野心:#张" }, }, - clanxieshu:{ - audio:2, - trigger:{player:'damageEnd',source:'damageSource'}, - filter(event,player){ - if(!event.card||player.isLinked()) return false; - var num=get.cardNameLength(event.card); - return typeof num=='number'&&num>0&&player.countCards('he')>0; + clanxieshu: { + audio: 2, + trigger: { player: "damageEnd", source: "damageSource" }, + filter(event, player) { + if (!event.card || player.isLinked()) return false; + var num = get.cardNameLength(event.card); + return ( + typeof num == "number" && + num > 0 && + player.countCards("he") > 0 + ); }, - async content(event,trigger,player){ - var num=get.cardNameLength(trigger.card),str=''; - if(player.getDamagedHp()>0) str+=(',然后摸'+get.cnNumber(player.getDamagedHp())+'张牌'); - player.chooseToDiscard(get.prompt('clanxieshu'),'横置武将牌并弃置'+get.cnNumber(num)+'张牌'+str,'he',num).set('ai',function(card){ - var player=_status.event.player; - var num=_status.event.num; - var num2=player.getDamagedHp(); - if(!num2) return 0; - if(num=(2+num-num2)) return lib.skill.zhiheng.check(card); - return 0; - }).set('num',num).set('logSkill','clanxieshu').forResult(); + async content(event, trigger, player) { + var num = get.cardNameLength(trigger.card), + str = ""; + if (player.getDamagedHp() > 0) + str += + ",然后摸" + + get.cnNumber(player.getDamagedHp()) + + "张牌"; + player + .chooseToDiscard( + get.prompt("clanxieshu"), + "横置武将牌并弃置" + + get.cnNumber(num) + + "张牌" + + str, + "he", + num + ) + .set("ai", function (card) { + var player = _status.event.player; + var num = _status.event.num; + var num2 = player.getDamagedHp(); + if (!num2) return 0; + if (num < num2) return 8 - get.value(card); + if (num == num2 || num2 >= 2 + num - num2) + return lib.skill.zhiheng.check(card); + return 0; + }) + .set("num", num) + .set("logSkill", "clanxieshu") + .forResult(); }, - popup:false, - content(){ + popup: false, + content() { player.link(true); - if(player.getDamagedHp()>0) player.draw(player.getDamagedHp()); + if (player.getDamagedHp() > 0) + player.draw(player.getDamagedHp()); }, - ai:{threaten:3}, - group:'clanxieshu_ban', - subSkill:{ - ban:{ - audio:'clanxieshu', - trigger:{global:'dyingAfter'}, - filter(event,player){ - return !player.isTempBanned('clanxieshu'); + ai: { threaten: 3 }, + group: "clanxieshu_ban", + subSkill: { + ban: { + audio: "clanxieshu", + trigger: { global: "dyingAfter" }, + filter(event, player) { + return !player.isTempBanned("clanxieshu"); }, - forced:true, - locked:false, - content(){ - player.tempBanSkill('clanxieshu'); + forced: true, + locked: false, + content() { + player.tempBanSkill("clanxieshu"); }, }, }, }, //族王浑 - clanfuxun:{ - mod:{ - aiOrder(player,card,num){ - if(player.isPhaseUsing()&&get.type(card)=='equip'&&get.equipValue(card,player)>0) return num+3; + clanfuxun: { + mod: { + aiOrder(player, card, num) { + if ( + player.isPhaseUsing() && + get.type(card) == "equip" && + get.equipValue(card, player) > 0 + ) + return num + 3; }, }, - locked:false, - audio:2, - enable:'phaseUse', - usable:1, - filterCard:true, - position:'h', - discard:false, - lose:false, - delay:false, - selectCard(){ - var player=_status.event.player; - if(ui.selected.targets.length&&!ui.selected.targets[0].countGainableCards(player,'h')) return 1; - return [0,1]; + locked: false, + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + selectCard() { + var player = _status.event.player; + if ( + ui.selected.targets.length && + !ui.selected.targets[0].countGainableCards(player, "h") + ) + return 1; + return [0, 1]; }, - filterTarget(card,player,target){ - if(player==target) return false; - if(!ui.selected.cards.length) return target.countGainableCards(player,'h')>0; + filterTarget(card, player, target) { + if (player == target) return false; + if (!ui.selected.cards.length) + return target.countGainableCards(player, "h") > 0; return true; }, - check(card){ - var player=_status.event.player; - var evtx=_status.event.getParent('phaseUse'); - var targets=game.filterPlayer(target=>target!=player&&lib.skill.clanfuxun.ai.result.target(player,target)!=0); - targets.sort((a,b)=>Math.abs(lib.skill.clanfuxun.ai.result.target(player,b))-Math.abs(lib.skill.clanfuxun.ai.result.target(player,a))); - if(evtx&&targets.length){ - var target=targets[0]; - if(!target.hasHistory('lose',evt=>{ - return evt.getParent(3).name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards2.length; - })&&!target.hasHistory('gain',evt=>{ - return evt.getParent().name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards.length; - })&&Math.abs(player.countCards('h')-target.countCards('h'))==2){ - if(player.countCards('h')>target.countCards('h')) return 1/(get.value(card)||0.5); + check(card) { + var player = _status.event.player; + var evtx = _status.event.getParent("phaseUse"); + var targets = game.filterPlayer( + (target) => + target != player && + lib.skill.clanfuxun.ai.result.target( + player, + target + ) != 0 + ); + targets.sort( + (a, b) => + Math.abs( + lib.skill.clanfuxun.ai.result.target(player, b) + ) - + Math.abs( + lib.skill.clanfuxun.ai.result.target(player, a) + ) + ); + if (evtx && targets.length) { + var target = targets[0]; + if ( + !target.hasHistory("lose", (evt) => { + return ( + evt.getParent(3).name != "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards2.length + ); + }) && + !target.hasHistory("gain", (evt) => { + return ( + evt.getParent().name != "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards.length + ); + }) && + Math.abs( + player.countCards("h") - target.countCards("h") + ) == 2 + ) { + if (player.countCards("h") > target.countCards("h")) + return 1 / (get.value(card) || 0.5); return -1; } - if(card.name=='du') return 20; + if (card.name == "du") return 20; return -1; } - if(card.name=='du') return 20; + if (card.name == "du") return 20; return -1; }, - content(){ - 'step 0' - if(cards.length){ - player.give(cards,target); + content() { + "step 0"; + if (cards.length) { + player.give(cards, target); + } else { + player.gainPlayerCard(target, "h", true); } - else{ - player.gainPlayerCard(target,'h',true); - } - 'step 1' - var evtx=event.getParent('phaseUse'); - if(player.countCards('h')==target.countCards('h')&&evtx&&!target.hasHistory('lose',evt=>{ - return evt.getParent(3).name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards2.length; - })&&!target.hasHistory('gain',evt=>{ - return evt.getParent().name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards.length; - })&&player.countCards('he')){ - var list=[]; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - if(player.hasUseTarget({name:name})) list.push(['基本','',name]); - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - if(player.hasUseTarget({name:name,nature:nature})) list.push(['基本','',name,nature]); + ("step 1"); + var evtx = event.getParent("phaseUse"); + if ( + player.countCards("h") == target.countCards("h") && + evtx && + !target.hasHistory("lose", (evt) => { + return ( + evt.getParent(3).name != "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards2.length + ); + }) && + !target.hasHistory("gain", (evt) => { + return ( + evt.getParent().name != "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards.length + ); + }) && + player.countCards("he") + ) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (player.hasUseTarget({ name: name })) + list.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + player.hasUseTarget({ + name: name, + nature: nature, + }) + ) + list.push(["基本", "", name, nature]); } } } - if(list.length){ - player.chooseButton(['是否将一张牌当做一种基本牌使用?',[list,'vcard']]).set('ai',button=>{ - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); - }); - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card={ - name:result.links[0][2], - nature:result.links[0][3] + if (list.length) { + player + .chooseButton([ + "是否将一张牌当做一种基本牌使用?", + [list, "vcard"], + ]) + .set("ai", (button) => { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }); + } else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], }; - game.broadcastAll(function(card){ - lib.skill.clanfuxun_backup.viewAs=card; - },card); - var next=player.chooseToUse(); - next.set('openskilldialog','将一张牌当做'+get.translation(card)+'使用'); - next.set('norestore',true); - next.set('addCount',false); - next.set('_backupevent','clanfuxun_backup'); - next.set('custom',{ - add:{}, - replace:{window(){}} + game.broadcastAll(function (card) { + lib.skill.clanfuxun_backup.viewAs = card; + }, card); + var next = player.chooseToUse(); + next.set( + "openskilldialog", + "将一张牌当做" + get.translation(card) + "使用" + ); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "clanfuxun_backup"); + next.set("custom", { + add: {}, + replace: { window() {} }, }); - next.backup('clanfuxun_backup'); + next.backup("clanfuxun_backup"); } }, - ai:{ - order(item,player){ - var evtx=_status.event.getParent('phaseUse'); - if(game.hasPlayer(current=>{ - if(current==player||!evtx||get.attitude(player,current)==0) return false; - return !current.hasHistory('lose',evt=>{ - return evt.getParent(3).name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards2.length; - })&&!current.hasHistory('gain',evt=>{ - return evt.getParent().name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards.length; - })&&Math.abs(player.countCards('h')-current.countCards('h'))==2; - })) return 10; + ai: { + order(item, player) { + var evtx = _status.event.getParent("phaseUse"); + if ( + game.hasPlayer((current) => { + if ( + current == player || + !evtx || + get.attitude(player, current) == 0 + ) + return false; + return ( + !current.hasHistory("lose", (evt) => { + return ( + evt.getParent(3).name != + "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards2.length + ); + }) && + !current.hasHistory("gain", (evt) => { + return ( + evt.getParent().name != + "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards.length + ); + }) && + Math.abs( + player.countCards("h") - + current.countCards("h") + ) == 2 + ); + }) + ) + return 10; return 2; }, - result:{ - target(player,target){ - var evtx=_status.event.getParent('phaseUse'); - var num=get.sgn(get.attitude(player,target)); - var targets=game.filterPlayer(current=>{ - if(current==player||!evtx||get.attitude(player,current)==0) return false; - return !current.hasHistory('lose',evt=>{ - return evt.getParent(3).name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards2.length; - })&&!current.hasHistory('gain',evt=>{ - return evt.getParent().name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards.length; - })&&Math.abs(player.countCards('h')-current.countCards('h'))==2; + result: { + target(player, target) { + var evtx = _status.event.getParent("phaseUse"); + var num = get.sgn(get.attitude(player, target)); + var targets = game.filterPlayer((current) => { + if ( + current == player || + !evtx || + get.attitude(player, current) == 0 + ) + return false; + return ( + !current.hasHistory("lose", (evt) => { + return ( + evt.getParent(3).name != + "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards2.length + ); + }) && + !current.hasHistory("gain", (evt) => { + return ( + evt.getParent().name != + "clanfuxun" && + evt.getParent("phaseUse") == evtx && + evt.cards.length + ); + }) && + Math.abs( + player.countCards("h") - + current.countCards("h") + ) == 2 + ); }); - if(targets.includes(target)){ - if(player.countCards('h')value!='出牌阶段限一次')) return false; - return event.player.countCards('h')>0; + filter(event, player) { + if (event.type != "player") return false; + var skill = event.sourceSkill || event.skill; + var info = get.info(skill); + if (info.charlotte) return false; + var translation = get.skillInfoTranslation( + skill, + event.player + ); + if (!translation) return false; + var match = translation.match(/“?出牌阶段限一次/g); + if ( + !match || + match.every((value) => value != "出牌阶段限一次") + ) + return false; + return event.player.countCards("h") > 0; }, - check(event,player){ - return get.attitude(player,event.player)>0; + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + logTarget: "player", + content() { + "step 0"; + var num = trigger.player.countCards("h"); + trigger.player + .chooseCard( + "是否重铸任意张牌名字数为" + num + "的牌?", + [1, Infinity], + "he", + (card, player) => + _status.event.cards.includes(card) && + player.canRecast(card) + ) + .set("ai", (card) => { + var val = get.value(card); + return 6 - val; + }) + .set( + "cards", + trigger.player.getCards("he", (card) => { + return get.cardNameLength(card) == num; + }) + ); + ("step 1"); + if (result.bool) trigger.player.recast(result.cards); }, - logTarget:'player', - content(){ - 'step 0' - var num=trigger.player.countCards('h'); - trigger.player.chooseCard('是否重铸任意张牌名字数为'+num+'的牌?',[1,Infinity],'he',(card,player)=>_status.event.cards.includes(card)&&player.canRecast(card)).set('ai',card=>{ - var val=get.value(card); - return 6-val; - }).set('cards',trigger.player.getCards('he',card=>{ - return get.cardNameLength(card)==num; - })); - 'step 1' - if(result.bool) trigger.player.recast(result.cards); - } }, //族王允 - clanjiexuan:{ - audio:2, - enable:'phaseUse', - limited:true, - zhuanhuanji:'number', - mark:true, - marktext:'☯', - intro:{ - markcount:()=>0, - content(storage){ - return '限定技,转换技。你可以将一张'+((storage||0)%2?'黑色牌当【过河拆桥】':'红色牌当【顺手牵羊】')+'使用。'; + clanjiexuan: { + audio: 2, + enable: "phaseUse", + limited: true, + zhuanhuanji: "number", + mark: true, + marktext: "☯", + intro: { + markcount: () => 0, + content(storage) { + return ( + "限定技,转换技。你可以将一张" + + ((storage || 0) % 2 + ? "黑色牌当【过河拆桥】" + : "红色牌当【顺手牵羊】") + + "使用。" + ); }, }, - viewAs(cards,player){ - var storage=player.storage.clanjiexuan; - var name=(storage||0)%2?'guohe':'shunshou'; - return {name:name}; + viewAs(cards, player) { + var storage = player.storage.clanjiexuan; + var name = (storage || 0) % 2 ? "guohe" : "shunshou"; + return { name: name }; }, - check(card){ - var player=_status.event.player; - var storage=player.storage.clanjiexuan; - var name=(storage||0)%2?'guohe':'shunshou'; - var fix=player.hasSkill('clanzhongliu')&&get.position(card)!='h'?2:1; - return (get.value({name:name},player)-get.value(card))*fix; + check(card) { + var player = _status.event.player; + var storage = player.storage.clanjiexuan; + var name = (storage || 0) % 2 ? "guohe" : "shunshou"; + var fix = + player.hasSkill("clanzhongliu") && + get.position(card) != "h" + ? 2 + : 1; + return ( + (get.value({ name: name }, player) - get.value(card)) * + fix + ); }, - position:'hes', - filterCard(card,player){ - var storage=player.storage.clanjiexuan; - return get.color(card)==((storage||0)%2?'black':'red'); + position: "hes", + filterCard(card, player) { + var storage = player.storage.clanjiexuan; + return ( + get.color(card) == + ((storage || 0) % 2 ? "black" : "red") + ); }, - prompt(){ - var storage=_status.event.player.storage.clanjiexuan; - if((storage||0)%2) return '将一张黑色牌当【过河拆桥】使用'; - return '将一张红色牌当【顺手牵羊】使用'; + prompt() { + var storage = _status.event.player.storage.clanjiexuan; + if ((storage || 0) % 2) + return "将一张黑色牌当【过河拆桥】使用"; + return "将一张红色牌当【顺手牵羊】使用"; }, - skillAnimation:true, - animationColor:'thunder', - precontent(){ - 'step 0' - var skill='clanjiexuan'; + skillAnimation: true, + animationColor: "thunder", + precontent() { + "step 0"; + var skill = "clanjiexuan"; player.logSkill(skill); player.changeZhuanhuanji(skill); - player.awakenSkill(skill,true); + player.awakenSkill(skill, true); delete event.result.skill; }, - ai:{ - order(item,player){ - player=player||_status.event.player; - var storage=_status.event.player.storage.clanjiexuan; - var name=(storage||0)%2?'guohe':'shunshou'; - return get.order({name:name})+0.1; + ai: { + order(item, player) { + player = player || _status.event.player; + var storage = _status.event.player.storage.clanjiexuan; + var name = (storage || 0) % 2 ? "guohe" : "shunshou"; + return get.order({ name: name }) + 0.1; }, }, }, - clanmingjie:{ - init(player){ - player.addSkill('clanmingjie_record'); + clanmingjie: { + init(player) { + player.addSkill("clanmingjie_record"); }, - initSkill(skill){ - if(!lib.skill[skill]){ - lib.skill[skill]={ - charlotte:true, - mark:true, - marktext:'戒', - intro:{content:'已被$指定为【铭戒】目标'}, + initSkill(skill) { + if (!lib.skill[skill]) { + lib.skill[skill] = { + charlotte: true, + mark: true, + marktext: "戒", + intro: { content: "已被$指定为【铭戒】目标" }, }; - lib.translate[skill]='铭戒'; - lib.translate[skill+'_bg']='戒'; + lib.translate[skill] = "铭戒"; + lib.translate[skill + "_bg"] = "戒"; } }, - onremove(player){ - player.removeSkill('clanmingjie_record'); + onremove(player) { + player.removeSkill("clanmingjie_record"); }, - audio:2, - enable:'phaseUse', - limited:true, - filterTarget(card,player,target){ - return !target.hasSkill('clanmingjie_'+player.playerid); + audio: 2, + enable: "phaseUse", + limited: true, + filterTarget(card, player, target) { + return !target.hasSkill("clanmingjie_" + player.playerid); }, - skillAnimation:true, - animationColor:'thunder', - content(){ - player.awakenSkill('clanmingjie'); - player.addSkill('clanmingjie_effect'); - var skill='clanmingjie_'+player.playerid; - game.broadcastAll(lib.skill.clanmingjie.initSkill,skill); - target.addTempSkill(skill,{player:'phaseAfter'}); - target.storage[skill]=player; + skillAnimation: true, + animationColor: "thunder", + content() { + player.awakenSkill("clanmingjie"); + player.addSkill("clanmingjie_effect"); + var skill = "clanmingjie_" + player.playerid; + game.broadcastAll(lib.skill.clanmingjie.initSkill, skill); + target.addTempSkill(skill, { player: "phaseAfter" }); + target.storage[skill] = player; }, - ai:{ - order:10, - result:{ - target(player,target){ - if(player.hasSkill('clanzhongliu')||player.hp==1){ - if(!player.hasCard(card=>{ - var info=get.info(card); - if(info.allowMultiple==false) return false; - if(!lib.filter.targetEnabled2(card,player,target)) return false; - return game.hasPlayer(current=>{ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0&¤t!=target&&get.effect(target,card,player,player)>0; - }); - },'hs')) return 0; + ai: { + order: 10, + result: { + target(player, target) { + if ( + player.hasSkill("clanzhongliu") || + player.hp == 1 + ) { + if ( + !player.hasCard((card) => { + var info = get.info(card); + if (info.allowMultiple == false) + return false; + if ( + !lib.filter.targetEnabled2( + card, + player, + target + ) + ) + return false; + return game.hasPlayer((current) => { + return ( + player.canUse(card, current) && + get.effect( + current, + card, + player, + player + ) > 0 && + current != target && + get.effect( + target, + card, + player, + player + ) > 0 + ); + }); + }, "hs") + ) + return 0; + } else { + if ( + player.countCards("hs", (card) => { + var info = get.info(card); + if (info.allowMultiple == false) + return false; + if ( + !lib.filter.targetEnabled2( + card, + player, + target + ) + ) + return false; + return game.hasPlayer((current) => { + return ( + player.canUse(card, current) && + get.effect( + current, + card, + player, + player + ) > 0 && + current != target && + get.effect( + target, + card, + player, + player + ) > 0 + ); + }); + }) < 3 + ) + return 0; } - else{ - if(player.countCards('hs',card=>{ - var info=get.info(card); - if(info.allowMultiple==false) return false; - if(!lib.filter.targetEnabled2(card,player,target)) return false; - return game.hasPlayer(current=>{ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0&¤t!=target&&get.effect(target,card,player,player)>0; - }); - })<3) return 0; - } - return get.sgnAttitude(player,target); + return get.sgnAttitude(player, target); }, }, }, - subSkill:{ - effect:{ - charlotte:true, - audio:'clanmingjie', - trigger:{player:'useCard2'}, - filter(event,player){ - var card=event.card; - var info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - return game.filterPlayer().some(current=>{ - if(!current.hasSkill('clanmingjie_'+player.playerid)) return false; - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current)&&lib.filter.targetInRange(card,player,current); + subSkill: { + effect: { + charlotte: true, + audio: "clanmingjie", + trigger: { player: "useCard2" }, + filter(event, player) { + var card = event.card; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + return game.filterPlayer().some((current) => { + if ( + !current.hasSkill( + "clanmingjie_" + player.playerid + ) + ) + return false; + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2( + card, + player, + current + ) && + lib.filter.targetInRange( + card, + player, + current + ) + ); }); } return false; }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('clanmingjie_effect'),'令任意【铭戒】目标角色成为'+get.translation(trigger.card)+'的目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - if(trigger.targets.includes(target)||!target.isIn()||!target.hasSkill('clanmingjie_'+player.playerid)) return false; - return lib.filter.targetEnabled2(trigger.card,player,target)&&lib.filter.targetInRange(trigger.card,player,target); - },[1,Infinity]).set('ai',function(target){ - var player=_status.event.player; - var trigger=_status.event.getTrigger(); - return get.effect(target,trigger.card,player,player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('clanmingjie_effect',targets); + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt("clanmingjie_effect"), + "令任意【铭戒】目标角色成为" + + get.translation(trigger.card) + + "的目标", + function (card, player, target) { + var trigger = + _status.event.getTrigger(); + if ( + trigger.targets.includes(target) || + !target.isIn() || + !target.hasSkill( + "clanmingjie_" + player.playerid + ) + ) + return false; + return ( + lib.filter.targetEnabled2( + trigger.card, + player, + target + ) && + lib.filter.targetInRange( + trigger.card, + player, + target + ) + ); + }, + [1, Infinity] + ) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + return get.effect( + target, + trigger.card, + player, + player + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("clanmingjie_effect", targets); trigger.targets.addArray(targets); - game.log(targets,'成为了',trigger.card,'的额外目标'); + game.log( + targets, + "成为了", + trigger.card, + "的额外目标" + ); } }, - group:'clanmingjie_targeted', + group: "clanmingjie_targeted", }, - targeted:{ - charlotte:true, - trigger:{global:'phaseEnd'}, - filter(event,player){ - var cards=player.getStorage('clanmingjie_record').slice(); - cards=cards.filterInD('d'); - if(!cards.length) return false; - var history=player.getHistory('useSkill',evt=>evt.skill=='clanmingjie'); - if(history.length){ - var targets=history.reduce((list,evt)=>list.addArray(evt.targets),[]); - if(event.player!=player&&targets.includes(event.player)) return true; + targeted: { + charlotte: true, + trigger: { global: "phaseEnd" }, + filter(event, player) { + var cards = player + .getStorage("clanmingjie_record") + .slice(); + cards = cards.filterInD("d"); + if (!cards.length) return false; + var history = player.getHistory( + "useSkill", + (evt) => evt.skill == "clanmingjie" + ); + if (history.length) { + var targets = history.reduce( + (list, evt) => list.addArray(evt.targets), + [] + ); + if ( + event.player != player && + targets.includes(event.player) + ) + return true; } - if(player.actionHistory.length>=2){ - for(var i=player.actionHistory.length-2;i>=0;i--){ - if(!player.actionHistory[i].isMe) continue; - var history2=player.actionHistory[i].useSkill.filter(evt=>evt.skill=='clanmingjie'); - if(history2.length){ - var targets2=history2.reduce((list,evt)=>list.addArray(evt.targets),[]); - if(targets2.includes(event.player)) return true; + if (player.actionHistory.length >= 2) { + for ( + var i = player.actionHistory.length - 2; + i >= 0; + i-- + ) { + if (!player.actionHistory[i].isMe) continue; + var history2 = player.actionHistory[ + i + ].useSkill.filter( + (evt) => evt.skill == "clanmingjie" + ); + if (history2.length) { + var targets2 = history2.reduce( + (list, evt) => + list.addArray(evt.targets), + [] + ); + if (targets2.includes(event.player)) + return true; } break; } } return false; }, - forced:true, - popup:false, - content(){ - 'step 0' - var cards=player.getStorage('clanmingjie_record').slice(); - cards=cards.filterInD('d'); - event.cards=cards; - 'step 1' - player.chooseButton(['铭戒:是否使用这些牌?',cards]).set('filterButton',button=>{ - return _status.event.player.hasUseTarget(button.link); - }).set('ai',button=>{ - return _status.event.player.getUseValue(button.link); - }); - 'step 2' - if(result.bool){ - var card=result.links[0]; + forced: true, + popup: false, + content() { + "step 0"; + var cards = player + .getStorage("clanmingjie_record") + .slice(); + cards = cards.filterInD("d"); + event.cards = cards; + ("step 1"); + player + .chooseButton(["铭戒:是否使用这些牌?", cards]) + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget( + button.link + ); + }) + .set("ai", (button) => { + return _status.event.player.getUseValue( + button.link + ); + }); + ("step 2"); + if (result.bool) { + var card = result.links[0]; event.cards.remove(card); - player.$gain2(card,false); + player.$gain2(card, false); game.delayx(); - player.chooseUseTarget(card,true); - } - else event.finish(); - 'step 3' - if(event.cards.filter(card=>{ - return get.position(card,true)=='d'&&player.hasUseTarget(card); - }).length) event.goto(1); + player.chooseUseTarget(card, true); + } else event.finish(); + ("step 3"); + if ( + event.cards.filter((card) => { + return ( + get.position(card, true) == "d" && + player.hasUseTarget(card) + ); + }).length + ) + event.goto(1); }, }, - record:{ - charlotte:true, - trigger:{ - global:['shaMiss','eventNeutralized','useCard1','phaseAfter'], + record: { + charlotte: true, + trigger: { + global: [ + "shaMiss", + "eventNeutralized", + "useCard1", + "phaseAfter", + ], }, - filter(event,player){ - if(event.name=='useCard'){ - return get.suit(event.card)=='spade'; + filter(event, player) { + if (event.name == "useCard") { + return get.suit(event.card) == "spade"; } - if(event.name=='phase') return true; - if(event.type!='card') return false; + if (event.name == "phase") return true; + if (event.type != "card") return false; return true; }, - silent:true, - forced:true, - content(){ - 'step 0' - if(trigger.name=='phase'){ + silent: true, + forced: true, + content() { + "step 0"; + if (trigger.name == "phase") { delete player.storage.clanmingjie_record; return; } - player.markAuto('clanmingjie_record',trigger.cards); - } + player.markAuto( + "clanmingjie_record", + trigger.cards + ); + }, }, - } + }, }, //族钟琰 - clanguangu:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuanhuanji:true, - mark:true, - marktext:'☯', - intro:{ - content(storage){ - return '转换技。出牌阶段限一次,你可以观看'+(storage?'一名角色的至多四张手':'牌堆顶的至多四张')+'牌,然后可以使用其中的一张牌。'; + clanguangu: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content(storage) { + return ( + "转换技。出牌阶段限一次,你可以观看" + + (storage + ? "一名角色的至多四张手" + : "牌堆顶的至多四张") + + "牌,然后可以使用其中的一张牌。" + ); }, }, - filter(event,player){ - if(player.storage.clanguangu) return game.hasPlayer(current=>{ - return current.countCards('h'); - }); + filter(event, player) { + if (player.storage.clanguangu) + return game.hasPlayer((current) => { + return current.countCards("h"); + }); return true; }, - chooseButton:{ - dialog(event,player){ - var dialog=ui.create.dialog('观骨:选择观看牌堆的牌数','hidden'); - if(player.storage.clanguangu) dialog.forceDirect=true; + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog( + "观骨:选择观看牌堆的牌数", + "hidden" + ); + if (player.storage.clanguangu) + dialog.forceDirect = true; return dialog; }, - chooseControl(event,player){ - var list=[1,2,3,4].map(i=>{ - return get.cnNumber(i,true); + chooseControl(event, player) { + var list = [1, 2, 3, 4].map((i) => { + return get.cnNumber(i, true); }); - list.push('cancel2'); + list.push("cancel2"); return list; }, - check(button,player){ + check(button, player) { var ret; - if(!player.hasSkill('clanxiaoyong')) ret=4; - else{ - var list=[4,3,2,1]; - player.getHistory('useCard',evt=>{ - var len=get.cardNameLength(evt.card); + if (!player.hasSkill("clanxiaoyong")) ret = 4; + else { + var list = [4, 3, 2, 1]; + player.getHistory("useCard", (evt) => { + var len = get.cardNameLength(evt.card); list.remove(len); }); - if(list.length) ret=list[0]; - else ret=4; + if (list.length) ret = list[0]; + else ret = 4; } - return get.cnNumber(ret,true); + return get.cnNumber(ret, true); }, - backup(result,player){ + backup(result, player) { return { - audio:'clanguangu', - filterCard:()=>false, - selectCard:-1, - filterTarget(card,player,target){ - if(player.storage.clanguangu) return true; + audio: "clanguangu", + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + if (player.storage.clanguangu) return true; return false; }, - selectTarget(){ - var player=_status.event.player; - if(player.storage.clanguangu) return 1; + selectTarget() { + var player = _status.event.player; + if (player.storage.clanguangu) return 1; return -1; }, - num:result.index+1, - content(){ - 'step 0' - player.changeZhuanhuanji('clanguangu'); - if(!targets.length){ - var num=lib.skill.clanguangu_backup.num; - var cards=get.cards(num); - event.cards=cards.slice(0); - while(cards.length) ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); + num: result.index + 1, + content() { + "step 0"; + player.changeZhuanhuanji("clanguangu"); + if (!targets.length) { + var num = lib.skill.clanguangu_backup.num; + var cards = get.cards(num); + event.cards = cards.slice(0); + while (cards.length) + ui.cardPile.insertBefore( + cards.pop().fix(), + ui.cardPile.firstChild + ); game.updateRoundNumber(); event.goto(2); - } - else{ + } else { var ret; - if(!player.hasSkill('clanxiaoyong')) ret=4; - else{ - var list=[4,3,2,1]; - player.getHistory('useCard',evt=>{ - var len=get.cardNameLength(evt.card); + if (!player.hasSkill("clanxiaoyong")) + ret = 4; + else { + var list = [4, 3, 2, 1]; + player.getHistory("useCard", (evt) => { + var len = get.cardNameLength( + evt.card + ); list.remove(len); }); - if(list.length) ret=list[0]; - else ret=4; + if (list.length) ret = list[0]; + else ret = 4; } - player.choosePlayerCard(target,'h',true,[1,4]).set('prompt','观骨:观看'+get.translation(target)+'的至多四张牌').set('ai',button=>{ - if(ui.selected.buttons.length>=_status.event.num) return 0; - return Math.random(); - }).set('num',ret); + player + .choosePlayerCard( + target, + "h", + true, + [1, 4] + ) + .set( + "prompt", + "观骨:观看" + + get.translation(target) + + "的至多四张牌" + ) + .set("ai", (button) => { + if ( + ui.selected.buttons.length >= + _status.event.num + ) + return 0; + return Math.random(); + }) + .set("num", ret); } - 'step 1' - if(result.bool){ - event.cards=result.links; - } - else{ + ("step 1"); + if (result.bool) { + event.cards = result.links; + } else { event.finish(); } - 'step 2' - var count=cards.length; - event.getParent().viewedCount=count; - player.chooseButton(['观骨:是否使用其中一张牌?',cards]).set('filterButton',button=>{ - var player=_status.event.player; - var card=button.link; - var cardx={ - name:get.name(card,get.owner(card)), - nature:get.nature(card,get.owner(card)), - cards:[card], - } - return player.hasUseTarget(cardx,null,false); - }).set('ai',button=>{ - var len=_status.event.len; - var card=button.link; - var fix=1; - if(get.cardNameLength(card)==len) fix=2; - return fix*_status.event.player.getUseValue(card); - }).set('len',function(){ - if(!player.hasSkill('clanxiaoyong')) return 0; - var list=[]; - player.getHistory('useCard',evt=>{ - var len=get.cardNameLength(evt.card); - list.add(len); - }); - if(!list.includes(count)) return count; - if(list.length) return list.randomGet(); - return 4; - }()); - 'step 3' - if(result.bool){ - var card=result.links[0]; + ("step 2"); + var count = cards.length; + event.getParent().viewedCount = count; + player + .chooseButton([ + "观骨:是否使用其中一张牌?", + cards, + ]) + .set("filterButton", (button) => { + var player = _status.event.player; + var card = button.link; + var cardx = { + name: get.name( + card, + get.owner(card) + ), + nature: get.nature( + card, + get.owner(card) + ), + cards: [card], + }; + return player.hasUseTarget( + cardx, + null, + false + ); + }) + .set("ai", (button) => { + var len = _status.event.len; + var card = button.link; + var fix = 1; + if (get.cardNameLength(card) == len) + fix = 2; + return ( + fix * + _status.event.player.getUseValue( + card + ) + ); + }) + .set( + "len", + (function () { + if ( + !player.hasSkill("clanxiaoyong") + ) + return 0; + var list = []; + player.getHistory( + "useCard", + (evt) => { + var len = + get.cardNameLength( + evt.card + ); + list.add(len); + } + ); + if (!list.includes(count)) + return count; + if (list.length) + return list.randomGet(); + return 4; + })() + ); + ("step 3"); + if (result.bool) { + var card = result.links[0]; cards.remove(card); - var cardx={ - name:get.name(card,get.owner(card)), - nature:get.nature(card,get.owner(card)), - cards:[card], - } - var next=player.chooseUseTarget(cardx,[card],true,false).set('oncard',(card)=>{ - var owner=_status.event.getParent().owner; - if(owner) owner.$throw(card.cards); - }); - if(card.name===cardx.name&&get.is.sameNature(card,cardx,true)) next.viewAs=false; - var owner=get.owner(card); - if(owner!=player&&get.position(card)=='h'){ - next.throw=false; - next.set('owner',owner); + var cardx = { + name: get.name(card, get.owner(card)), + nature: get.nature( + card, + get.owner(card) + ), + cards: [card], + }; + var next = player + .chooseUseTarget( + cardx, + [card], + true, + false + ) + .set("oncard", (card) => { + var owner = + _status.event.getParent().owner; + if (owner) owner.$throw(card.cards); + }); + if ( + card.name === cardx.name && + get.is.sameNature(card, cardx, true) + ) + next.viewAs = false; + var owner = get.owner(card); + if ( + owner != player && + get.position(card) == "h" + ) { + next.throw = false; + next.set("owner", owner); } } }, - ai:{ - order:10, - result:{ - target(player,target){ - return -Math.min(target.countCards('h'),4)/2; + ai: { + order: 10, + result: { + target(player, target) { + return ( + -Math.min( + target.countCards("h"), + 4 + ) / 2 + ); }, }, - } - } + }, + }; }, - prompt(result,player){ - if(!player.storage.clanguangu) return '点击“确定”以观看牌堆顶牌'; - return '观骨:选择观看牌的目标'; + prompt(result, player) { + if (!player.storage.clanguangu) + return "点击“确定”以观看牌堆顶牌"; + return "观骨:选择观看牌的目标"; }, }, - subSkill:{ - backup:{}, + subSkill: { + backup: {}, }, - ai:{ - order:10, - result:{ - player:1, - } + ai: { + order: 10, + result: { + player: 1, + }, }, }, - clanxiaoyong:{ - audio:2, - trigger:{ - player:'useCard', + clanxiaoyong: { + audio: 2, + trigger: { + player: "useCard", }, - filter(event,player){ - var len=get.cardNameLength(event.card); - if(player.hasHistory('useCard',function(evt){ - return evt!=event&&get.cardNameLength(evt.card)==len; - },event)) return false; - if(!player.getStat().skill.clanguangu) return false; - var history=player.getAllHistory('useSkill',evt=>{ - return evt.skill=='clanguangu_backup'; - }).map(evt=>evt.event); - if(!history.length) return false; - var num=0; - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - if(evt.viewedCount){ - num=evt.viewedCount; + filter(event, player) { + var len = get.cardNameLength(event.card); + if ( + player.hasHistory( + "useCard", + function (evt) { + return ( + evt != event && + get.cardNameLength(evt.card) == len + ); + }, + event + ) + ) + return false; + if (!player.getStat().skill.clanguangu) return false; + var history = player + .getAllHistory("useSkill", (evt) => { + return evt.skill == "clanguangu_backup"; + }) + .map((evt) => evt.event); + if (!history.length) return false; + var num = 0; + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (evt.viewedCount) { + num = evt.viewedCount; break; } } - if(num&&len==num) return true; + if (num && len == num) return true; return false; }, - forced:true, - content(){ - 'step 0' + forced: true, + content() { + "step 0"; delete player.getStat().skill.clanguangu; - game.log(player,'重置了','#g【观骨】'); + game.log(player, "重置了", "#g【观骨】"); }, - ai:{ - combo:'clanguangu' + ai: { + combo: "clanguangu", }, - mod:{ - aiOrder(player,card,num){ - if(!player.hasSkill('clanguangu')||!player.getStat().skill.clanguangu) return; - var history=player.getAllHistory('useSkill',evt=>{ - return evt.skill=='clanguangu_backup'; - }).map(evt=>evt.event); - if(!history.length) return; - var numx=0; - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - if(evt.viewedCount){ - numx=evt.viewedCount; + mod: { + aiOrder(player, card, num) { + if ( + !player.hasSkill("clanguangu") || + !player.getStat().skill.clanguangu + ) + return; + var history = player + .getAllHistory("useSkill", (evt) => { + return evt.skill == "clanguangu_backup"; + }) + .map((evt) => evt.event); + if (!history.length) return; + var numx = 0; + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (evt.viewedCount) { + numx = evt.viewedCount; break; } } - if(numx==get.cardNameLength(card)){ - if(!player.hasHistory('useCard',evt=>{ - return numx==get.cardNameLength(evt.card); - })){ - return num+9; + if (numx == get.cardNameLength(card)) { + if ( + !player.hasHistory("useCard", (evt) => { + return numx == get.cardNameLength(evt.card); + }) + ) { + return num + 9; } } }, - } + }, }, - clanbaozu:{ - audio:2, - audioname:['clan_zhongyan','clan_zhonghui','clan_zhongyu'], - trigger:{global:'dying'}, - clanSkill:true, - limited:true, - skillAnimation:true, - animationColor:'water', - filter(event,player){ - return (event.player==player||event.player.hasClan('颍川钟氏'))&&event.player.hp<=0&&!event.player.isLinked(); + clanbaozu: { + audio: 2, + audioname: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu"], + trigger: { global: "dying" }, + clanSkill: true, + limited: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return ( + (event.player == player || + event.player.hasClan("颍川钟氏")) && + event.player.hp <= 0 && + !event.player.isLinked() + ); }, - logTarget:'player', - check(event,player){ - return lib.skill.wanlan.check(event,player); + logTarget: "player", + check(event, player) { + return lib.skill.wanlan.check(event, player); }, - content(){ - 'step 0' - player.awakenSkill('clanbaozu'); - 'step 1' + content() { + "step 0"; + player.awakenSkill("clanbaozu"); + ("step 1"); trigger.player.link(true); trigger.player.recover(); }, }, //族王淩 - clanbolong:{ - audio:2, - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('he')>0; + clanbolong: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("he") > 0; }, - filterTarget:lib.filter.notMe, - content(){ - 'step 0' - var num=player.countCards('h'); - var str='是否交给其'+get.cnNumber(num)+'张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。'; - if(!num||target.countCards('he'){ - if(_status.event.canGive) return 5+Math.max(0,3-_status.event.player.hp)/1.5-get.value(card); - return 0; - }).set('canGive',function(){ - if(get.attitude(target,player)>1) return true; - if(!player.hasSha()&&player.countCards('h')<=4) return true; - var sha={name:'sha',nature:'thunder',isCard:true}; - if(game.hasPlayer(current=>{ - return player.canUse(sha,current,true,true)&&get.effect(current,sha,player,target)<0&&!current.countCards('hs',['shan','caochuan']); - })) return false; - return true; - }()); - 'step 1' - if(result.bool){ - var cards=result.cards; - target.give(cards,player); - if(lib.filter.targetEnabled2({name:'jiu',isCard:true},target,player)) target.useCard({name:'jiu',isCard:true},player,false); + filterTarget: lib.filter.notMe, + content() { + "step 0"; + var num = player.countCards("h"); + var str = + "是否交给其" + + get.cnNumber(num) + + "张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。"; + if (!num || target.countCards("he") < num) + event._result = { bool: false }; + else + target + .chooseCard( + get.translation(player) + "对你发动了【驳龙】", + str, + num, + "he" + ) + .set("ai", (card) => { + if (_status.event.canGive) + return ( + 5 + + Math.max( + 0, + 3 - _status.event.player.hp + ) / + 1.5 - + get.value(card) + ); + return 0; + }) + .set( + "canGive", + (function () { + if (get.attitude(target, player) > 1) + return true; + if ( + !player.hasSha() && + player.countCards("h") <= 4 + ) + return true; + var sha = { + name: "sha", + nature: "thunder", + isCard: true, + }; + if ( + game.hasPlayer((current) => { + return ( + player.canUse( + sha, + current, + true, + true + ) && + get.effect( + current, + sha, + player, + target + ) < 0 && + !current.countCards("hs", [ + "shan", + "caochuan", + ]) + ); + }) + ) + return false; + return true; + })() + ); + ("step 1"); + if (result.bool) { + var cards = result.cards; + target.give(cards, player); + if ( + lib.filter.targetEnabled2( + { name: "jiu", isCard: true }, + target, + player + ) + ) + target.useCard( + { name: "jiu", isCard: true }, + player, + false + ); event.finish(); + } else { + player.chooseCard( + "驳龙:交给" + get.translation(target) + "一张牌", + get.translation(target) + + "拒绝给牌,请交给其一张牌然后视为对其使用一张雷【杀】", + true, + "he" + ); } - else{ - player.chooseCard('驳龙:交给'+get.translation(target)+'一张牌',get.translation(target)+'拒绝给牌,请交给其一张牌然后视为对其使用一张雷【杀】',true,'he'); - } - 'step 2' - if(result.bool){ - var cards=result.cards; - player.give(cards,target); - var sha={name:'sha',nature:'thunder',isCard:true}; - if(player.canUse(sha,target,false,false)) player.useCard(sha,target,false); + ("step 2"); + if (result.bool) { + var cards = result.cards; + player.give(cards, target); + var sha = { + name: "sha", + nature: "thunder", + isCard: true, + }; + if (player.canUse(sha, target, false, false)) + player.useCard(sha, target, false); } }, - ai:{ - order(item,player){ - return get.order({name:'jiu'})+0.01; + ai: { + order(item, player) { + return get.order({ name: "jiu" }) + 0.01; }, - threaten:2, - result:{ - target(player,target){ - if(player.hasCard(card=>{ - return get.value(card)<5&&!['shan','tao','jiu','wuxie','caochuan'].includes(get.name(card)); - },'he')) return -1; + threaten: 2, + result: { + target(player, target) { + if ( + player.hasCard((card) => { + return ( + get.value(card) < 5 && + ![ + "shan", + "tao", + "jiu", + "wuxie", + "caochuan", + ].includes(get.name(card)) + ); + }, "he") + ) + return -1; return 0; }, - } - } + }, + }, }, - clanzhongliu:{ - audio:2, - audioname:['clan_wangling','clan_wangyun','clan_wanghun','clan_wanglun','clan_wangguang','clan_wangmingshan'], - trigger:{player:'useCard'}, - forced:true, - clanSkill:true, - filter(event,player){ - if(!event.cards.length) return true; - return !game.hasPlayer2(current=>{ - if(!current.hasClan('太原王氏')&¤t!=player) return false; - return current.hasHistory('lose',evt=>{ - return evt.getParent()==event&&evt.hs.length>0; + clanzhongliu: { + audio: 2, + audioname: [ + "clan_wangling", + "clan_wangyun", + "clan_wanghun", + "clan_wanglun", + "clan_wangguang", + "clan_wangmingshan", + ], + trigger: { player: "useCard" }, + forced: true, + clanSkill: true, + filter(event, player) { + if (!event.cards.length) return true; + return !game.hasPlayer2((current) => { + if (!current.hasClan("太原王氏") && current != player) + return false; + return current.hasHistory("lose", (evt) => { + return ( + evt.getParent() == event && evt.hs.length > 0 + ); }); }); }, - content(){ - 'step 0' - var skills=player.getStockSkills(true,true); + content() { + "step 0"; + var skills = player.getStockSkills(true, true); game.expandSkills(skills); - var resetSkills=[]; - var suffixs=['used','round','block','blocker']; - for(var skill of skills){ - var info=get.info(skill); - if(typeof info.usable=='number'){ - if(player.hasSkill('counttrigger')&&player.storage.counttrigger[skill]&&player.storage.counttrigger[skill]>=1){ + var resetSkills = []; + var suffixs = ["used", "round", "block", "blocker"]; + for (var skill of skills) { + var info = get.info(skill); + if (typeof info.usable == "number") { + if ( + player.hasSkill("counttrigger") && + player.storage.counttrigger[skill] && + player.storage.counttrigger[skill] >= 1 + ) { delete player.storage.counttrigger[skill]; resetSkills.add(skill); } - if(typeof get.skillCount(skill)=='number'&&get.skillCount(skill)>=1){ - delete player.getStat('skill')[skill]; + if ( + typeof get.skillCount(skill) == "number" && + get.skillCount(skill) >= 1 + ) { + delete player.getStat("skill")[skill]; resetSkills.add(skill); } } - if(info.round&&player.storage[skill+'_roundcount']){ - delete player.storage[skill+'_roundcount']; + if ( + info.round && + player.storage[skill + "_roundcount"] + ) { + delete player.storage[skill + "_roundcount"]; resetSkills.add(skill); } - if(player.storage[`temp_ban_${skill}`]){ + if (player.storage[`temp_ban_${skill}`]) { delete player.storage[`temp_ban_${skill}`]; } - if(player.awakenedSkills.includes(skill)){ + if (player.awakenedSkills.includes(skill)) { player.restoreSkill(skill); resetSkills.add(skill); } - for(var suffix of suffixs){ - if(player.hasSkill(skill+'_'+suffix)){ - player.removeSkill(skill+'_'+suffix); + for (var suffix of suffixs) { + if (player.hasSkill(skill + "_" + suffix)) { + player.removeSkill(skill + "_" + suffix); resetSkills.add(skill); } } } - if(resetSkills.length){ - var str=''; - for(var i of resetSkills){ - str+='【'+get.translation(i)+'】、'; + if (resetSkills.length) { + var str = ""; + for (var i of resetSkills) { + str += "【" + get.translation(i) + "】、"; } - game.log(player,'重置了技能','#g'+str.slice(0,-1)); + game.log(player, "重置了技能", "#g" + str.slice(0, -1)); } - } + }, }, //族吴匡 - clanlianzhu:{ - audio:2, - zhuanhuanji:true, - mark:true, - marktext:'☯', - intro:{ - content(storage){ - var str='转换技。每名角色A的出牌阶段限一次。'; - if(!storage) str+='A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1。'; - else str+='A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1'; + clanlianzhu: { + audio: 2, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content(storage) { + var str = "转换技。每名角色A的出牌阶段限一次。"; + if (!storage) + str += + "A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1。"; + else + str += + "A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1"; return str; }, }, - global:'clanlianzhu_global', - subSkill:{ - global:{ - forceaudio:true, - audio:'clanlianzhu', - enable:'phaseUse', - filter:(event,player)=>game.hasPlayer(current=>lib.skill.clanlianzhu_global.filterTarget(null,player,current)), - filterCard:(card,player)=>game.hasPlayer(current=>current.hasSkill('clanlianzhu')&&!current.hasSkill('clanlianzhu_targeted')&&!current.storage.clanlianzhu)&&player.canRecast(card), - selectCard:[0,1], - check(card){ - return 5-get.value(card); + global: "clanlianzhu_global", + subSkill: { + global: { + forceaudio: true, + audio: "clanlianzhu", + enable: "phaseUse", + filter: (event, player) => + game.hasPlayer((current) => + lib.skill.clanlianzhu_global.filterTarget( + null, + player, + current + ) + ), + filterCard: (card, player) => + game.hasPlayer( + (current) => + current.hasSkill("clanlianzhu") && + !current.hasSkill("clanlianzhu_targeted") && + !current.storage.clanlianzhu + ) && player.canRecast(card), + selectCard: [0, 1], + check(card) { + return 5 - get.value(card); }, - filterTarget(card,player,target){ - return target.hasSkill('clanlianzhu')&&!target.hasSkill('clanlianzhu_targeted')&&(!target.storage.clanlianzhu||target.storage.clanlianzhu&&game.hasPlayer(current=>{ - if(current==player||current==target) return false; - return current.inRangeOf(player)||current.inRangeOf(target); - })); + filterTarget(card, player, target) { + return ( + target.hasSkill("clanlianzhu") && + !target.hasSkill("clanlianzhu_targeted") && + (!target.storage.clanlianzhu || + (target.storage.clanlianzhu && + game.hasPlayer((current) => { + if ( + current == player || + current == target + ) + return false; + return ( + current.inRangeOf(player) || + current.inRangeOf(target) + ); + }))) + ); }, - selectTarget(){ - var player=_status.event.player; - var count=game.countPlayer(current=>lib.skill.clanlianzhu_global.filterTarget(null,player,current)); - return count==1?-1:1; + selectTarget() { + var player = _status.event.player; + var count = game.countPlayer((current) => + lib.skill.clanlianzhu_global.filterTarget( + null, + player, + current + ) + ); + return count == 1 ? -1 : 1; }, - filterOk(){ - var target=ui.selected.targets[0]; - if(!target) return false; - if(!target.storage.clanlianzhu){ - return ui.selected.cards.length==1; + filterOk() { + var target = ui.selected.targets[0]; + if (!target) return false; + if (!target.storage.clanlianzhu) { + return ui.selected.cards.length == 1; } - return ui.selected.cards.length==0; + return ui.selected.cards.length == 0; }, - position:'he', - discard:false, - lose:false, - delay:false, - prompt(){ - var player=_status.event.player; - var bocchi=[],kita=[]; - game.countPlayer(function(target){ - if(target.hasSkill('clanlianzhu')&&!target.hasSkill('clanlianzhu_targeted')){ - if(target.storage.clanlianzhu){ - if(game.hasPlayer(current=>{ - if(current==player||current==target) return false; - return current.inRangeOf(player)||current.inRangeOf(target); - })) kita.add(target); - } - else{ - if(player.countCards('he')>0) bocchi.add(target); + position: "he", + discard: false, + lose: false, + delay: false, + prompt() { + var player = _status.event.player; + var bocchi = [], + kita = []; + game.countPlayer(function (target) { + if ( + target.hasSkill("clanlianzhu") && + !target.hasSkill("clanlianzhu_targeted") + ) { + if (target.storage.clanlianzhu) { + if ( + game.hasPlayer((current) => { + if ( + current == player || + current == target + ) + return false; + return ( + current.inRangeOf(player) || + current.inRangeOf(target) + ); + }) + ) + kita.add(target); + } else { + if (player.countCards("he") > 0) + bocchi.add(target); } } }); bocchi.sortBySeat(); kita.sortBySeat(); - var str=''; - if(bocchi.length){ - str+='重铸一张牌,然后令'; - bocchi.forEach((current,i)=>{ - str+=get.translation(current); - if(i { + str += get.translation(current); + if (i < bocchi.length - 1) str += "或"; }); - str+='选择是否重铸一张牌'; - if(kita.length) str+='。
    或者'; + str += "选择是否重铸一张牌"; + if (kita.length) str += "。
    或者"; } - if(kita.length){ - str+='令'; - kita.forEach((current,i)=>{ - str+=get.translation(current); - if(i { + str += get.translation(current); + if (i < kita.length - 1) str += "或"; }); - str+='选择一名目标,然后对其进行集火'; + str += "选择一名目标,然后对其进行集火"; } - str+='。'; + str += "。"; return str; }, - content(){ - 'step 0' - target.addTempSkill('clanlianzhu_targeted','phaseUseAfter'); - if(target.storage.clanlianzhu) event.goto(4); - target.changeZhuanhuanji('clanlianzhu'); - 'step 1' + content() { + "step 0"; + target.addTempSkill( + "clanlianzhu_targeted", + "phaseUseAfter" + ); + if (target.storage.clanlianzhu) event.goto(4); + target.changeZhuanhuanji("clanlianzhu"); + ("step 1"); player.recast(cards); - 'step 2' - if(!target.countCards('he')&&!_status.connectMode) event._result={bool:false}; - else target.chooseCard('he','联诛:是否重铸一张牌?',lib.filter.cardRecastable); - 'step 3' - if(result.bool){ + ("step 2"); + if ( + !target.countCards("he") && + !_status.connectMode + ) + event._result = { bool: false }; + else + target.chooseCard( + "he", + "联诛:是否重铸一张牌?", + lib.filter.cardRecastable + ); + ("step 3"); + if (result.bool) { target.recast(result.cards); - if(get.color(cards[0])===get.color(result.cards[0])) lib.skill.chenliuwushi.change(target,1); + if ( + get.color(cards[0]) === + get.color(result.cards[0]) + ) + lib.skill.chenliuwushi.change(target, 1); } event.finish(); - 'step 4' - target.chooseTarget('联诛:选择其与你使用【杀】的目标',true,(card,player,target)=>{ - if(target==player||target==_status.event.sourcex) return false; - return target.inRangeOf(player)||target.inRangeOf(_status.event.sourcex); - }).set('ai',target=>{ - return get.effect(target,{name:'sha'},_status.event.player,_status.event.player); - }).set('sourcex',player); - 'step 5' - if(result.bool){ - var targetx=result.targets[0]; - event.targetx=targetx; + ("step 4"); + target + .chooseTarget( + "联诛:选择其与你使用【杀】的目标", + true, + (card, player, target) => { + if ( + target == player || + target == _status.event.sourcex + ) + return false; + return ( + target.inRangeOf(player) || + target.inRangeOf( + _status.event.sourcex + ) + ); + } + ) + .set("ai", (target) => { + return get.effect( + target, + { name: "sha" }, + _status.event.player, + _status.event.player + ); + }) + .set("sourcex", player); + ("step 5"); + if (result.bool) { + var targetx = result.targets[0]; + event.targetx = targetx; target.line(targetx); - event.targets=[player,target]; - event.cards=[]; - if(!event.isMine()&&!event.isOnline()) game.delayx(); - } - else event.finish(); - 'step 6' - var current=targets.shift(); - current.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'联诛:是否对'+get.translation(event.targetx)+'使用一张杀?').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',event.targetx).set('addCount',false); - 'step 7' - if(result.bool) cards.push(result.card); - if(targets.length>0) event.goto(6); - 'step 8' + event.targets = [player, target]; + event.cards = []; + if (!event.isMine() && !event.isOnline()) + game.delayx(); + } else event.finish(); + ("step 6"); + var current = targets.shift(); + current + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply( + this, + arguments + ); + }, "联诛:是否对" + + get.translation(event.targetx) + + "使用一张杀?") + .set("targetRequired", true) + .set("complexSelect", true) + .set( + "filterTarget", + function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes( + _status.event.sourcex + ) + ) + return false; + return lib.filter.targetEnabled.apply( + this, + arguments + ); + } + ) + .set("sourcex", event.targetx) + .set("addCount", false); + ("step 7"); + if (result.bool) cards.push(result.card); + if (targets.length > 0) event.goto(6); + ("step 8"); if (cards.length > 1) { const color = get.color(cards[0], false); - if (color != 'none') { + if (color != "none") { for (let i = 1; i < cards.length; i++) { - const color2 = get.color(cards[i], false); - if (color !== color2 && color2 !== 'none') { - lib.skill.chenliuwushi.change(target, -1); + const color2 = get.color( + cards[i], + false + ); + if ( + color !== color2 && + color2 !== "none" + ) { + lib.skill.chenliuwushi.change( + target, + -1 + ); break; } } } } }, - ai:{ - order:4.1, - result:{ - player(player,target){ - if(!target.storage.clanlianzhu&&player.hasCard(card=>get.value(card)<5,'he')) return 1; + ai: { + order: 4.1, + result: { + player(player, target) { + if ( + !target.storage.clanlianzhu && + player.hasCard( + (card) => get.value(card) < 5, + "he" + ) + ) + return 1; return 0; }, - target(player,target){ - if(target.storage.clanlianzhu&&player.hasSha()) return 1; + target(player, target) { + if ( + target.storage.clanlianzhu && + player.hasSha() + ) + return 1; return 0; - } - } - } + }, + }, + }, }, - targeted:{charlotte:true} - } + targeted: { charlotte: true }, + }, }, //族韩韶 - clanfangzhen:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return game.hasPlayer(current=>!current.isLinked()); + clanfangzhen: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer((current) => !current.isLinked()); }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('clanfangzhen'),(card,player,target)=>{ - return !target.isLinked(); - }).set('ai',target=>{ - var player=_status.event.player; - if(_status.event.goon&&target!=player){ - target.classList.add('linked'); - target.classList.add('linked2'); - try{ - var cards=player.getCards('hs',cardx=>{ - if(get.name(cardx)!='sha') return false; - return game.hasNature(cardx,'linked'); - }); - cards.map(i=>[i,get.effect(target,i,player,player)]); - cards.sort((a,b)=>b[1]-a[1]); + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt2("clanfangzhen"), + (card, player, target) => { + return !target.isLinked(); } - catch(e){ - target.classList.remove('linked'); - target.classList.remove('linked2'); + ) + .set("ai", (target) => { + var player = _status.event.player; + if (_status.event.goon && target != player) { + target.classList.add("linked"); + target.classList.add("linked2"); + try { + var cards = player.getCards( + "hs", + (cardx) => { + if (get.name(cardx) != "sha") + return false; + return game.hasNature( + cardx, + "linked" + ); + } + ); + cards.map((i) => [ + i, + get.effect(target, i, player, player), + ]); + cards.sort((a, b) => b[1] - a[1]); + } catch (e) { + target.classList.remove("linked"); + target.classList.remove("linked2"); + } + target.classList.remove("linked"); + target.classList.remove("linked2"); + var eff = cards[0][1]; + if (eff > 0) return eff; + return Math.max( + 2 * + get.effect( + target, + { name: "draw" }, + player, + player + ) + + 0.6 * + get.effect( + player, + { name: "draw" }, + player, + player + ), + get.recoverEffect(target, player, player) + ); } - target.classList.remove('linked'); - target.classList.remove('linked2'); - var eff=cards[0][1]; - if(eff>0) return eff; - return Math.max((2*get.effect(target,{name:'draw'},player,player)+0.6*get.effect(player,{name:'draw'},player,player)),get.recoverEffect(target,player,player)); - } - return Math.max((2*get.effect(target,{name:'draw'},player,player)+0.6*get.effect(player,{name:'draw'},player,player)),get.recoverEffect(target,player,player)); - }).set('goon',player.countCards('hs',card=>{ - return get.name(card)=='jiu'&&player.hasUseTarget(card); - })&&player.countCards('hs',card=>{ - if(get.name(card)!='sha') return false; - return game.hasNature(card,'linked'); - })); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('clanfangzhen',target); - player.addSkill('clanfangzhen_remove'); - player.markAuto('clanfangzhen_remove',[target.getSeatNum()]); + return Math.max( + 2 * + get.effect( + target, + { name: "draw" }, + player, + player + ) + + 0.6 * + get.effect( + player, + { name: "draw" }, + player, + player + ), + get.recoverEffect(target, player, player) + ); + }) + .set( + "goon", + player.countCards("hs", (card) => { + return ( + get.name(card) == "jiu" && + player.hasUseTarget(card) + ); + }) && + player.countCards("hs", (card) => { + if (get.name(card) != "sha") return false; + return game.hasNature(card, "linked"); + }) + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("clanfangzhen", target); + player.addSkill("clanfangzhen_remove"); + player.markAuto("clanfangzhen_remove", [ + target.getSeatNum(), + ]); target.link(true); - var choices=['选项一'],choiceList=[ - '摸两张牌,然后交给'+get.translation(target)+'两张牌', - '令'+get.translation(target)+'回复1点体力' - ]; - if(target.isDamaged()) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - player.chooseControl(choices).set('prompt','放赈:请选择一项').set('choiceList',choiceList).set('ai',()=>{ - var player=_status.event.player,target=_status.event.getParent().target; - if(!target.isDamaged()) return 0; - if(get.attitude(player,target)<=0&&player.countCards('he',card=>get.value(card)<0)>=2) return 0; - return (2*get.effect(target,{name:'draw'},player,player)+0.6*get.effect(player,{name:'draw'},player,player))>get.recoverEffect(target,player,player)?0:1; - }); - } - else event.finish(); - 'step 2' - if(result.control=='选项一'){ + var choices = ["选项一"], + choiceList = [ + "摸两张牌,然后交给" + + get.translation(target) + + "两张牌", + "令" + get.translation(target) + "回复1点体力", + ]; + if (target.isDamaged()) choices.push("选项二"); + else + choiceList[1] = + '' + + choiceList[1] + + ""; + player + .chooseControl(choices) + .set("prompt", "放赈:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + var player = _status.event.player, + target = _status.event.getParent().target; + if (!target.isDamaged()) return 0; + if ( + get.attitude(player, target) <= 0 && + player.countCards( + "he", + (card) => get.value(card) < 0 + ) >= 2 + ) + return 0; + return 2 * + get.effect( + target, + { name: "draw" }, + player, + player + ) + + 0.6 * + get.effect( + player, + { name: "draw" }, + player, + player + ) > + get.recoverEffect(target, player, player) + ? 0 + : 1; + }); + } else event.finish(); + ("step 2"); + if (result.control == "选项一") { player.draw(2); - if(player==target) event.finish(); - } - else{ + if (player == target) event.finish(); + } else { target.recover(); event.finish(); } - 'step 3' - if(!player.countCards('he')) event.finish(); - else if(player.countCards('he')<=2) event._result={bool:true,cards:player.getCards('he')}; - else{ - player.chooseCard('放赈:交给'+get.translation(target)+'两张牌','he',2,true); + ("step 3"); + if (!player.countCards("he")) event.finish(); + else if (player.countCards("he") <= 2) + event._result = { + bool: true, + cards: player.getCards("he"), + }; + else { + player.chooseCard( + "放赈:交给" + get.translation(target) + "两张牌", + "he", + 2, + true + ); } - 'step 4' - if(result.bool){ - player.give(result.cards,target); + ("step 4"); + if (result.bool) { + player.give(result.cards, target); } }, - ai:{ - expose:0.2, + ai: { + expose: 0.2, }, - subSkill:{ - remove:{ - trigger:{global:'roundStart'}, - onremove:true, - forced:true, - locked:false, - charlotte:true, - filter(event,player){ - return player.getStorage('clanfangzhen_remove').includes(game.roundNumber); + subSkill: { + remove: { + trigger: { global: "roundStart" }, + onremove: true, + forced: true, + locked: false, + charlotte: true, + filter(event, player) { + return player + .getStorage("clanfangzhen_remove") + .includes(game.roundNumber); }, - content(){ - player.removeSkills('clanfangzhen'); - } - } - } - }, - clanliuju:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - filter(event,player){ - return game.hasPlayer(current=>player.canCompare(current)); + content() { + player.removeSkills("clanfangzhen"); + }, + }, }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('clanliuju'),'与一名其他角色拼点,输的角色可以使用任意张拼点牌中的非基本牌',(card,player,target)=>{ - return player.canCompare(target); - }).set('ai',target=>{ - var player=_status.event.player; - var ts=target.getCards('h').sort((a,b)=>get.number(a)-get.number(b)); - if(get.attitude(player,target)<0){ - var hs=player.getCards('h').sort((a,b)=>get.number(a)-get.number(b)); - if(!hs.length||!ts.length) return 0; - if(get.type(hs[0],null,false)=='basic'&&get.value(hs[0])>6) return 0; - if(get.number(hs[0]){ - if(evt.getParent(2)==event) cards.addArray(evt.cards.filter(i=>{ - return get.position(i,true)=='d'&&get.type(i,null,false)!='basic'; - })); + }, + clanliuju: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return game.hasPlayer((current) => + player.canCompare(current) + ); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt("clanliuju"), + "与一名其他角色拼点,输的角色可以使用任意张拼点牌中的非基本牌", + (card, player, target) => { + return player.canCompare(target); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + var ts = target + .getCards("h") + .sort((a, b) => get.number(a) - get.number(b)); + if (get.attitude(player, target) < 0) { + var hs = player + .getCards("h") + .sort( + (a, b) => get.number(a) - get.number(b) + ); + if (!hs.length || !ts.length) return 0; + if ( + get.type(hs[0], null, false) == "basic" && + get.value(hs[0]) > 6 + ) + return 0; + if ( + get.number(hs[0]) < get.number(ts[0]) || + get.type(hs[0], null, false) == "basic" + ) + return 1; + return Math.random() - 0.7; + } + return get.type(ts[0]) != "basic"; }); - event.loser=loser; - event.distance=[get.distance(player,target),get.distance(target,player)]; - if(cards.length) event.cards=cards; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("clanliuju", target); + player.chooseToCompare(target).set("small", true); + } else event.finish(); + ("step 2"); + if (!result.tie) { + var loser = result.bool ? target : player; + var cards = []; + game.getGlobalHistory("cardMove", (evt) => { + if (evt.getParent(2) == event) + cards.addArray( + evt.cards.filter((i) => { + return ( + get.position(i, true) == "d" && + get.type(i, null, false) != "basic" + ); + }) + ); + }); + event.loser = loser; + event.distance = [ + get.distance(player, target), + get.distance(target, player), + ]; + if (cards.length) event.cards = cards; else event.finish(); - } - else event.finish(); - 'step 3' - var cardsx=cards.filter(i=>get.position(i,true)=='d'&&event.loser.hasUseTarget(i)); - if(!cardsx.length) event.goto(6); - else event.loser.chooseButton(['留驹:是否使用其中的一张牌?',cardsx]).set('filterButton',button=>{ - return _status.event.player.hasUseTarget(button.link); - }).set('ai',button=>{ - return _status.event.player.getUseValue(button.link)+0.1; - }); - 'step 4' - if(result.bool){ - var card=result.links[0]; + } else event.finish(); + ("step 3"); + var cardsx = cards.filter( + (i) => + get.position(i, true) == "d" && + event.loser.hasUseTarget(i) + ); + if (!cardsx.length) event.goto(6); + else + event.loser + .chooseButton([ + "留驹:是否使用其中的一张牌?", + cardsx, + ]) + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget( + button.link + ); + }) + .set("ai", (button) => { + return ( + _status.event.player.getUseValue( + button.link + ) + 0.1 + ); + }); + ("step 4"); + if (result.bool) { + var card = result.links[0]; event.cards.remove(card); - event.loser.$gain2(card,false); + event.loser.$gain2(card, false); game.delayx(); - event.loser.chooseUseTarget(true,card,false); + event.loser.chooseUseTarget(true, card, false); + } else event.goto(6); + ("step 5"); + if ( + cards.filter( + (i) => + get.position(i, true) == "d" && + event.loser.hasUseTarget(i) + ).length + ) + event.goto(3); + ("step 6"); + if ( + get.distance(player, target) != event.distance[0] || + get.distance(target, player) != event.distance[1] + ) { + player.restoreSkill("clanxumin"); + game.log(player, "重置了", "#g【恤民】"); } - else event.goto(6); - 'step 5' - if(cards.filter(i=>get.position(i,true)=='d'&&event.loser.hasUseTarget(i)).length) event.goto(3); - 'step 6' - if(get.distance(player,target)!=event.distance[0]||get.distance(target,player)!=event.distance[1]){ - player.restoreSkill('clanxumin'); - game.log(player,'重置了','#g【恤民】'); - } - } + }, }, - clanxumin:{ - audio:2, - audioname:['clan_hanshao','clan_hanrong'], - enable:'phaseUse', - viewAs:{name:'wugu'}, - filterCard:true, - filterTarget(card,player,target){ - if(player==target) return false; - return player.canUse(card,target); + clanxumin: { + audio: 2, + audioname: ["clan_hanshao", "clan_hanrong"], + enable: "phaseUse", + viewAs: { name: "wugu" }, + filterCard: true, + filterTarget(card, player, target) { + if (player == target) return false; + return player.canUse(card, target); }, - selectTarget:[1,Infinity], - check(card){ - return 6-get.value(card); + selectTarget: [1, Infinity], + check(card) { + return 6 - get.value(card); }, - position:'he', - limited:true, - clanSkill:true, - skillAnimation:true, - animationColor:'soil', - precontent(){ - player.logSkill('clanxumin'); - player.awakenSkill('clanxumin'); + position: "he", + limited: true, + clanSkill: true, + skillAnimation: true, + animationColor: "soil", + precontent() { + player.logSkill("clanxumin"); + player.awakenSkill("clanxumin"); delete event.result.skill; }, - ai:{ - order:7, - result:{target:1} + ai: { + order: 7, + result: { target: 1 }, }, }, //族韩融 //我们连和!(?) - clanlianhe:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return game.hasPlayer(current=>!current.isLinked()); + clanlianhe: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer((current) => !current.isLinked()); }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('clanlianhe'),2,(card,player,target)=>{ - return !target.isLinked(); - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - if(att>0) att/=1.2; - return Math.abs(att); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - targets.forEach(i=>i.link(true)); - player.logSkill('clanlianhe',targets); - player.addSkill('clanlianhe_effect'); - player.markAuto('clanlianhe_effect',targets); + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt2("clanlianhe"), + 2, + (card, player, target) => { + return !target.isLinked(); + } + ) + .set("ai", (target) => { + var att = get.attitude( + _status.event.player, + target + ); + if (att > 0) att /= 1.2; + return Math.abs(att); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + targets.forEach((i) => i.link(true)); + player.logSkill("clanlianhe", targets); + player.addSkill("clanlianhe_effect"); + player.markAuto("clanlianhe_effect", targets); } }, - subSkill:{ - effect:{ - trigger:{global:['phaseUseEnd','die']}, - charlotte:true, - forced:true, - locked:false, - popup:false, - onremove:true, - filter(event,player){ - return player.getStorage('clanlianhe_effect').includes(event.player); + subSkill: { + effect: { + trigger: { global: ["phaseUseEnd", "die"] }, + charlotte: true, + forced: true, + locked: false, + popup: false, + onremove: true, + filter(event, player) { + return player + .getStorage("clanlianhe_effect") + .includes(event.player); }, - marktext:'连', - intro:{content:'已选择目标:$'}, - content(){ - 'step 0' - player.unmarkAuto('clanlianhe_effect',[trigger.player]); - if(trigger.name=='die') event.finish(); - 'step 1' - if(trigger.player.hasHistory('gain',evt=>{ - return evt.getParent().name=='draw'&&evt.getParent('phaseUse')==trigger; - })) event.finish(); - else{ - player.logSkill('clanlianhe_effect',trigger.player); - var num=0; - trigger.player.getHistory('gain',evt=>{ - if(evt.getParent('phaseUse')!=trigger) return false; - num+=evt.cards.length; + marktext: "连", + intro: { content: "已选择目标:$" }, + content() { + "step 0"; + player.unmarkAuto("clanlianhe_effect", [ + trigger.player, + ]); + if (trigger.name == "die") event.finish(); + ("step 1"); + if ( + trigger.player.hasHistory("gain", (evt) => { + return ( + evt.getParent().name == "draw" && + evt.getParent("phaseUse") == trigger + ); + }) + ) + event.finish(); + else { + player.logSkill( + "clanlianhe_effect", + trigger.player + ); + var num = 0; + trigger.player.getHistory("gain", (evt) => { + if (evt.getParent("phaseUse") != trigger) + return false; + num += evt.cards.length; }); - num=Math.min(num,3); - event.num=num; - if(num<=1) event._result={bool:false}; - else{ - var pos=player==trigger.player?'e':'he'; - trigger.player.chooseCard('连和:交给'+get.translation(player)+get.cnNumber(num-1)+'张牌,或点“取消”令其摸'+get.cnNumber(num+1)+'张牌',num-1,pos).set('ai',card=>{ - if(_status.event.draw) return 0; - return 5-get.value(card); - }).set('draw',get.attitude(trigger.player,player)>=0); + num = Math.min(num, 3); + event.num = num; + if (num <= 1) event._result = { bool: false }; + else { + var pos = + player == trigger.player ? "e" : "he"; + trigger.player + .chooseCard( + "连和:交给" + + get.translation(player) + + get.cnNumber(num - 1) + + "张牌,或点“取消”令其摸" + + get.cnNumber(num + 1) + + "张牌", + num - 1, + pos + ) + .set("ai", (card) => { + if (_status.event.draw) return 0; + return 5 - get.value(card); + }) + .set( + "draw", + get.attitude( + trigger.player, + player + ) >= 0 + ); } } - 'step 2' - if(result.bool){ - trigger.player.give(result.cards,player); - } - else player.draw(num+1); - } - } - } - }, - clanhuanjia:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - filter(event,player){ - return game.hasPlayer(current=>player.canCompare(current)); - }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('clanhuanjia'),'与一名其他角色拼点,赢的角色可以使用一张拼点牌。若此牌未造成过伤害,你获得另一张拼点牌,否则你失去一个技能',(card,player,target)=>{ - return player.canCompare(target); - }).set('ai',target=>{ - var player=_status.event.player; - if(get.attitude(player,target)<=0){ - var hs=player.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - var ts=target.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - if(!hs.length||!ts.length) return 0; - if(get.number(hs[0])>get.number(ts[0])&&(!get.tag(hs[0],'damage')&&player.hasValueTarget(hs[0]))) return 1; - return Math.random()-0.4; - } - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('clanhuanjia',target); - player.chooseToCompare(target); - } - else event.finish(); - 'step 2' - if(!result.tie){ - var winner=result.bool?player:target; - var cards=[]; - game.getGlobalHistory('cardMove',evt=>{ - if(evt.getParent(3)==event) cards.addArray(evt.cards.filterInD('d')); - }); - event.winner=winner; - if(cards.length) event.cards=cards; - else event.finish(); - } - else event.finish(); - 'step 3' - var cardsx=cards.filter(i=>get.position(i,true)=='d'&&event.winner.hasUseTarget(i)); - if(!cardsx.length) event.goto(6); - else event.winner.chooseButton(['缓颊:是否使用其中的一张牌?',cardsx]).set('filterButton',button=>{ - return _status.event.player.hasUseTarget(button.link); - }).set('ai',button=>{ - var damage=1; - if(_status.event.att>2&&get.tag(button.link,'damage')) damage*=2; - return _status.event.player.getUseValue(button.link)*damage+0.1; - }).set('att',get.attitude(event.winner,player)); - 'step 4' - if(result.bool){ - var card=result.links[0]; - event.card=card; - event.cards.remove(card); - event.winner.$gain2(card,false); - game.delayx(); - event.winner.chooseUseTarget(true,card,false); - } - 'step 5' - if(game.hasPlayer2(current=>{ - return current.hasHistory('sourceDamage',evt=>evt.cards&&evt.cards[0]==card); - })){ - var skills=player.getSkills(null,false,false).filter(skill=>{ - var info=get.info(skill); - if(!info||get.is.empty(info)||info.charlotte) return false; - return true; - }); - player.chooseControl(skills).set('choiceList',skills.map(i=>{ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; - })).set('displayIndex',false).set('prompt','恤民:失去一个技能').set('ai',()=>{ - var choices=_status.event.controls.slice(); - var value=(skill)=>get.skillRank(skill,'in')+get.skillRank(skill,'out'); - choices=choices.map(skill=>[skill,value(skill)]); - var list=choices.sort((a,b)=>a[1]-b[1])[0]; - if(list[1]<2) return list[0]; - else{ - if(_status.event.controls.includes('clanxumin')) return 'clanxumin'; - return list[0]; - } - }); - } - else{ - player.gain(cards,'gain2'); - event.finish(); - } - 'step 6' - player.removeSkills(result.control); - }, - ai:{ - expose:0.1, - } - }, - //族荀谌 - clansankuang:{ - audio:2, - trigger:{player:'useCardAfter'}, - direct:true, - forced:true, - filter(event,player){ - if(!game.hasPlayer(current=>current!=player)) return false; - const type=get.type2(event.card); - return player.getRoundHistory('useCard',evt=>get.type2(evt.card)==type).indexOf(event)==0; - }, - getNum(player){ - return (player.countCards('ej')>0)+(player.isDamaged())+(Math.max(0,player.hp){ - var att=get.attitude(player,target),num=lib.skill.clansankuang.getNum(target); - if(num==0) return att; - if(_status.event.goon) return -att; - return -Math.sqrt(Math.abs(att))-lib.skill.clansankuang.getNum(target); - }).set('goon',Math.max.apply(Math,trigger.cards.map(i=>get.value(i)))<=5||trigger.cards.filterInD('oe').length==0) - 'step 1' - if(result.bool){ - var target=result.targets[0],num=lib.skill.clansankuang.getNum(target),num2=target.countCards('he'); - event.target=target; - player.logSkill('clansankuang',target); - if(num2==0) event._result={bool:false}; - else if(num2<=num) event._result={bool:true,cards:target.getCards('he')}; - else{ - var cards=trigger.cards.filterInD('oe'); - target.chooseCard('he',num>0,[num,Infinity]).set('ai',get.unuseful).set('prompt',num>0? - '是否交给'+get.translation(player)+'任意张牌'+(cards.length?'并获得'+get.translation(cards):'')+'?': - '交给'+get.translation(player)+'至少'+get.cnNumber(num)+'张牌'); - } - }else event.finish(); - 'step 2' - if(result.bool){ - var cards=result.cards; - target.give(cards,player); - game.delayx(); - } - else event.finish(); - 'step 3' - if(trigger.cards.filterInD().length) target.gain(trigger.cards.filterInD(),'gain2','bySelf'); - else if(trigger.cards.filterInD('e').length) target.gain(trigger.cards.filterInD('e'),get.owner(trigger.cards.filterInD('e')[0]),'give'); - }, - ai:{ - reverseOrder:true, - skillTagFilter(player){ - if(player.getHistory('useCard',evt=>get.type(evt.card)=='equip').length>0) return false; - }, - effect:{ - target(card,player,target){ - if(player==target&&get.type(card)=='equip'&&!player.getHistory('useCard',evt=>get.type(evt.card)=='equip').length==0) return [1,3]; + ("step 2"); + if (result.bool) { + trigger.player.give(result.cards, player); + } else player.draw(num + 1); }, }, - threaten:1.6, }, }, - clanbeishi:{ - audio:2, - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + clanhuanjia: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return game.hasPlayer((current) => + player.canCompare(current) + ); }, - forced:true, - filter(event,player){ - var history=player.getAllHistory('useSkill',evt=>evt.skill=='clansankuang'); - if(!history.length) return false; - var target=history[0].targets[0]; - if(target.countCards('h')) return false; - var evt=event.getl(target); - return evt&&evt.hs&&evt.hs.length; + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt("clanhuanjia"), + "与一名其他角色拼点,赢的角色可以使用一张拼点牌。若此牌未造成过伤害,你获得另一张拼点牌,否则你失去一个技能", + (card, player, target) => { + return player.canCompare(target); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) { + var hs = player + .getCards("h") + .sort( + (a, b) => get.number(b) - get.number(a) + ); + var ts = target + .getCards("h") + .sort( + (a, b) => get.number(b) - get.number(a) + ); + if (!hs.length || !ts.length) return 0; + if ( + get.number(hs[0]) > get.number(ts[0]) && + !get.tag(hs[0], "damage") && + player.hasValueTarget(hs[0]) + ) + return 1; + return Math.random() - 0.4; + } + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("clanhuanjia", target); + player.chooseToCompare(target); + } else event.finish(); + ("step 2"); + if (!result.tie) { + var winner = result.bool ? player : target; + var cards = []; + game.getGlobalHistory("cardMove", (evt) => { + if (evt.getParent(3) == event) + cards.addArray(evt.cards.filterInD("d")); + }); + event.winner = winner; + if (cards.length) event.cards = cards; + else event.finish(); + } else event.finish(); + ("step 3"); + var cardsx = cards.filter( + (i) => + get.position(i, true) == "d" && + event.winner.hasUseTarget(i) + ); + if (!cardsx.length) event.goto(6); + else + event.winner + .chooseButton([ + "缓颊:是否使用其中的一张牌?", + cardsx, + ]) + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget( + button.link + ); + }) + .set("ai", (button) => { + var damage = 1; + if ( + _status.event.att > 2 && + get.tag(button.link, "damage") + ) + damage *= 2; + return ( + _status.event.player.getUseValue( + button.link + ) * + damage + + 0.1 + ); + }) + .set("att", get.attitude(event.winner, player)); + ("step 4"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + event.cards.remove(card); + event.winner.$gain2(card, false); + game.delayx(); + event.winner.chooseUseTarget(true, card, false); + } + ("step 5"); + if ( + game.hasPlayer2((current) => { + return current.hasHistory( + "sourceDamage", + (evt) => evt.cards && evt.cards[0] == card + ); + }) + ) { + var skills = player + .getSkills(null, false, false) + .filter((skill) => { + var info = get.info(skill); + if ( + !info || + get.is.empty(info) || + info.charlotte + ) + return false; + return true; + }); + player + .chooseControl(skills) + .set( + "choiceList", + skills.map((i) => { + return ( + '
    【' + + get.translation( + lib.translate[i + "_ab"] || + get.translation(i).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set("prompt", "恤民:失去一个技能") + .set("ai", () => { + var choices = _status.event.controls.slice(); + var value = (skill) => + get.skillRank(skill, "in") + + get.skillRank(skill, "out"); + choices = choices.map((skill) => [ + skill, + value(skill), + ]); + var list = choices.sort( + (a, b) => a[1] - b[1] + )[0]; + if (list[1] < 2) return list[0]; + else { + if ( + _status.event.controls.includes( + "clanxumin" + ) + ) + return "clanxumin"; + return list[0]; + } + }); + } else { + player.gain(cards, "gain2"); + event.finish(); + } + ("step 6"); + player.removeSkills(result.control); }, - content(){ + ai: { + expose: 0.1, + }, + }, + //族荀谌 + clansankuang: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + forced: true, + filter(event, player) { + if (!game.hasPlayer((current) => current != player)) + return false; + const type = get.type2(event.card); + return ( + player + .getRoundHistory( + "useCard", + (evt) => get.type2(evt.card) == type + ) + .indexOf(event) == 0 + ); + }, + getNum(player) { + return ( + (player.countCards("ej") > 0) + + player.isDamaged() + + (Math.max(0, player.hp) < player.countCards("h")) + ); + }, + content() { + "step 0"; + var cards = trigger.cards.filterInD("oe"); + player + .chooseTarget( + "三恇:选择一名其他角色", + "令其交给你至少X张牌" + + (cards.length + ? ",然后其获得" + get.translation(cards) + : "") + + "(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)", + true, + lib.filter.notMe + ) + .set("ai", (target) => { + var att = get.attitude(player, target), + num = lib.skill.clansankuang.getNum(target); + if (num == 0) return att; + if (_status.event.goon) return -att; + return ( + -Math.sqrt(Math.abs(att)) - + lib.skill.clansankuang.getNum(target) + ); + }) + .set( + "goon", + Math.max.apply( + Math, + trigger.cards.map((i) => get.value(i)) + ) <= 5 || trigger.cards.filterInD("oe").length == 0 + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0], + num = lib.skill.clansankuang.getNum(target), + num2 = target.countCards("he"); + event.target = target; + player.logSkill("clansankuang", target); + if (num2 == 0) event._result = { bool: false }; + else if (num2 <= num) + event._result = { + bool: true, + cards: target.getCards("he"), + }; + else { + var cards = trigger.cards.filterInD("oe"); + target + .chooseCard("he", num > 0, [num, Infinity]) + .set("ai", get.unuseful) + .set( + "prompt", + num > 0 + ? "是否交给" + + get.translation(player) + + "任意张牌" + + (cards.length + ? "并获得" + + get.translation(cards) + : "") + + "?" + : "交给" + + get.translation(player) + + "至少" + + get.cnNumber(num) + + "张牌" + ); + } + } else event.finish(); + ("step 2"); + if (result.bool) { + var cards = result.cards; + target.give(cards, player); + game.delayx(); + } else event.finish(); + ("step 3"); + if (trigger.cards.filterInD().length) + target.gain( + trigger.cards.filterInD(), + "gain2", + "bySelf" + ); + else if (trigger.cards.filterInD("e").length) + target.gain( + trigger.cards.filterInD("e"), + get.owner(trigger.cards.filterInD("e")[0]), + "give" + ); + }, + ai: { + reverseOrder: true, + skillTagFilter(player) { + if ( + player.getHistory( + "useCard", + (evt) => get.type(evt.card) == "equip" + ).length > 0 + ) + return false; + }, + effect: { + target(card, player, target) { + if ( + player == target && + get.type(card) == "equip" && + !player.getHistory( + "useCard", + (evt) => get.type(evt.card) == "equip" + ).length == 0 + ) + return [1, 3]; + }, + }, + threaten: 1.6, + }, + }, + clanbeishi: { + audio: 2, + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + forced: true, + filter(event, player) { + var history = player.getAllHistory( + "useSkill", + (evt) => evt.skill == "clansankuang" + ); + if (!history.length) return false; + var target = history[0].targets[0]; + if (target.countCards("h")) return false; + var evt = event.getl(target); + return evt && evt.hs && evt.hs.length; + }, + content() { player.recover(); }, - ai:{ - combo:'clansankuang' - } + ai: { + combo: "clansankuang", + }, }, //族荀淑 - clanshenjun:{ - audio:2, - trigger:{ - global:'useCard', + clanshenjun: { + audio: 2, + trigger: { + global: "useCard", }, - forced:true, - locked:false, - filter(event,player){ - return (event.card.name=='sha'||get.type(event.card)=='trick')&&player.countCards('h',event.card.name)>0; + forced: true, + locked: false, + filter(event, player) { + return ( + (event.card.name == "sha" || + get.type(event.card) == "trick") && + player.countCards("h", event.card.name) > 0 + ); }, - content(){ - var cards=player.getCards('h',trigger.card.name); - player.showCards(cards,get.translation(player)+'发动了【神君】'); - player.markSkill('clanshenjun'); - player.addGaintag(cards,'clanshenjun'); - for(var name of lib.phaseName){ - var evt=_status.event.getParent(name); - if(!evt||evt.name!=name) continue; - player.addTempSkill('clanshenjun_viewAs',name+'After'); + content() { + var cards = player.getCards("h", trigger.card.name); + player.showCards( + cards, + get.translation(player) + "发动了【神君】" + ); + player.markSkill("clanshenjun"); + player.addGaintag(cards, "clanshenjun"); + for (var name of lib.phaseName) { + var evt = _status.event.getParent(name); + if (!evt || evt.name != name) continue; + player.addTempSkill( + "clanshenjun_viewAs", + name + "After" + ); break; } }, - marktext:'君', - intro:{ - markcount(storage,player){ - return player.countCards('h',card=>card.hasGaintag('clanshenjun')); + marktext: "君", + intro: { + markcount(storage, player) { + return player.countCards("h", (card) => + card.hasGaintag("clanshenjun") + ); }, - mark(dialog,content,player){ - var cards=player.getCards('h',card=>card.hasGaintag('clanshenjun')); - if(cards.length){ + mark(dialog, content, player) { + var cards = player.getCards("h", (card) => + card.hasGaintag("clanshenjun") + ); + if (cards.length) { dialog.addAuto(cards); - } - else return '无展示牌'; + } else return "无展示牌"; }, }, - subSkill:{ - viewAs:{ - trigger:{global:['phaseZhunbeiEnd','phaseJudgeEnd','phaseDrawEnd','phaseUseEnd','phaseDiscardEnd','phaseJieshuEnd']}, - filter(event,player){ - return player.countCards('h',card=>card.hasGaintag('clanshenjun'))>0; + subSkill: { + viewAs: { + trigger: { + global: [ + "phaseZhunbeiEnd", + "phaseJudgeEnd", + "phaseDrawEnd", + "phaseUseEnd", + "phaseDiscardEnd", + "phaseJieshuEnd", + ], }, - forced:true, - charlotte:true, - content(){ - 'step 0' - var cards=player.getCards('h',card=>card.hasGaintag('clanshenjun')); - var list=[],names=[]; - for(var card of cards){ - var name=get.name(card),nature=get.nature(card); - var namex=name; - if(nature&&nature.length){ - namex+=nature; - if(names.includes(namex)) continue; - list.push([get.type(card),'',name,nature]); - } - else{ - if(names.includes(namex)) continue; - list.push([get.type(card),'',name]); + filter(event, player) { + return ( + player.countCards("h", (card) => + card.hasGaintag("clanshenjun") + ) > 0 + ); + }, + forced: true, + charlotte: true, + content() { + "step 0"; + var cards = player.getCards("h", (card) => + card.hasGaintag("clanshenjun") + ); + var list = [], + names = []; + for (var card of cards) { + var name = get.name(card), + nature = get.nature(card); + var namex = name; + if (nature && nature.length) { + namex += nature; + if (names.includes(namex)) continue; + list.push([ + get.type(card), + "", + name, + nature, + ]); + } else { + if (names.includes(namex)) continue; + list.push([get.type(card), "", name]); } names.push(namex); } - list.sort((a,b)=>{ - var del1=lib.inpile.indexOf(a[2])-lib.inpile.indexOf(b[2]); - if(del1!=0) return del1; - var a1=0,b1=0; - if(a.length>3) a1=(lib.nature.get(a)||0); - if(b.length>3) b1=(lib.nature.get(b)||0); - return a1-b1; - }) - player.chooseButton(['是否将'+get.cnNumber(cards.length)+'张牌当下列一张牌使用?',[list,'vcard']]).set('ai',function(button){ - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); + list.sort((a, b) => { + var del1 = + lib.inpile.indexOf(a[2]) - + lib.inpile.indexOf(b[2]); + if (del1 != 0) return del1; + var a1 = 0, + b1 = 0; + if (a.length > 3) a1 = lib.nature.get(a) || 0; + if (b.length > 3) b1 = lib.nature.get(b) || 0; + return a1 - b1; }); - 'step 1' - if(result.bool){ - var name=result.links[0][2],nature=result.links[0][3]; - var cards=player.getCards('h',card=>card.hasGaintag('clanshenjun')); - game.broadcastAll(function(num,card){ - lib.skill.clanshenjun_backup.selectCard=num; - lib.skill.clanshenjun_backup.viewAs=card; - },cards.length,{name:name,nature:nature}); - var next=player.chooseToUse(); - next.set('openskilldialog','将'+get.cnNumber(cards.length)+'张牌当做'+(get.translation(nature)||'')+'【'+get.translation(name)+'】使用'); - next.set('norestore',true); - next.set('addCount',false); - next.set('_backupevent','clanshenjun_backup'); - next.set('custom',{ - add:{}, - replace:{window(){}} + player + .chooseButton([ + "是否将" + + get.cnNumber(cards.length) + + "张牌当下列一张牌使用?", + [list, "vcard"], + ]) + .set("ai", function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); }); - next.backup('clanshenjun_backup'); + ("step 1"); + if (result.bool) { + var name = result.links[0][2], + nature = result.links[0][3]; + var cards = player.getCards("h", (card) => + card.hasGaintag("clanshenjun") + ); + game.broadcastAll( + function (num, card) { + lib.skill.clanshenjun_backup.selectCard = + num; + lib.skill.clanshenjun_backup.viewAs = + card; + }, + cards.length, + { name: name, nature: nature } + ); + var next = player.chooseToUse(); + next.set( + "openskilldialog", + "将" + + get.cnNumber(cards.length) + + "张牌当做" + + (get.translation(nature) || "") + + "【" + + get.translation(name) + + "】使用" + ); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "clanshenjun_backup"); + next.set("custom", { + add: {}, + replace: { window() {} }, + }); + next.backup("clanshenjun_backup"); } - } - }, - backup:{ - filterCard(card){ - return get.itemtype(card)=='card'; }, - position:'hes', - filterTarget:lib.filter.filterTarget, - check:(card)=>6-get.value(card), - log:false, - precontent(){ + }, + backup: { + filterCard(card) { + return get.itemtype(card) == "card"; + }, + position: "hes", + filterTarget: lib.filter.filterTarget, + check: (card) => 6 - get.value(card), + log: false, + precontent() { delete event.result.skill; }, - } - } - }, - clanbalong:{ - audio:2, - trigger:{ - player:['damageEnd','recoverEnd','loseHpEnd'], + }, }, - forced:true, - filter(event,player){ - if(game.getGlobalHistory('changeHp',evt=>evt.player==player).length!=1) return false; - var cards=player.getCards('h'),map={}; - if(!cards.length) return false; - for(var card of cards){ - var type=get.type2(card); - if(typeof map[type]!='number') map[type]=0; + }, + clanbalong: { + audio: 2, + trigger: { + player: ["damageEnd", "recoverEnd", "loseHpEnd"], + }, + forced: true, + filter(event, player) { + if ( + game.getGlobalHistory( + "changeHp", + (evt) => evt.player == player + ).length != 1 + ) + return false; + var cards = player.getCards("h"), + map = {}; + if (!cards.length) return false; + for (var card of cards) { + var type = get.type2(card); + if (typeof map[type] != "number") map[type] = 0; map[type]++; } - var list=[]; - for(var i in map){ - if(map[i]>0) list.push([i,map[i]]); + var list = []; + for (var i in map) { + if (map[i] > 0) list.push([i, map[i]]); } - list.sort((a,b)=>b[1]-a[1]); - return list[0][0]=='trick'&&(list.length==1||list[0][1]>list[1][1]); + list.sort((a, b) => b[1] - a[1]); + return ( + list[0][0] == "trick" && + (list.length == 1 || list[0][1] > list[1][1]) + ); }, - content(){ - player.showHandcards(get.translation(player)+'发动了【八龙】'); + content() { + player.showHandcards( + get.translation(player) + "发动了【八龙】" + ); player.drawTo(game.countPlayer()); - } + }, }, //族荀粲 - clanyunshen:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return player!=target&&target.isDamaged(); + clanyunshen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return player != target && target.isDamaged(); }, - content(){ - 'step 0' + content() { + "step 0"; target.recover(); - 'step 1' - var name=get.translation(target); - player.chooseControl().set('choiceList',[name+'视为对你使用一张冰【杀】','你视为对'+name+'使用一张冰【杀】']).set('prompt','熨身:请选择一项').set('ai',()=>_status.event.choice).set('choice',function(){ - var card={name:'sha',nature:'ice',isCard:true}; - var eff=get.effect(player,card,target,player),eff2=get.effect(target,card,player,player); - if(eff>eff2) return '选项一'; - else return '选项二'; - }()); - 'step 2' - var players=[target,player]; - if(result.control=='选项二') players.reverse(); - var card={name:'sha',nature:'ice',isCard:true}; - if(players[0].canUse(card,players[1],false)) players[0].useCard(card,players[1],false,'noai'); + ("step 1"); + var name = get.translation(target); + player + .chooseControl() + .set("choiceList", [ + name + "视为对你使用一张冰【杀】", + "你视为对" + name + "使用一张冰【杀】", + ]) + .set("prompt", "熨身:请选择一项") + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var card = { + name: "sha", + nature: "ice", + isCard: true, + }; + var eff = get.effect( + player, + card, + target, + player + ), + eff2 = get.effect( + target, + card, + player, + player + ); + if (eff > eff2) return "选项一"; + else return "选项二"; + })() + ); + ("step 2"); + var players = [target, player]; + if (result.control == "选项二") players.reverse(); + var card = { name: "sha", nature: "ice", isCard: true }; + if (players[0].canUse(card, players[1], false)) + players[0].useCard(card, players[1], false, "noai"); }, - ai:{ - order:2, - expose:0.2, - result:{ - target(player,target){ - var eff=get.recoverEffect(target,player,player); - if(eff>0) return 1; - else if(get.effect(target,{name:'sha',nature:'ice',isCard:true},player,player)>eff) return -1; + ai: { + order: 2, + expose: 0.2, + result: { + target(player, target) { + var eff = get.recoverEffect(target, player, player); + if (eff > 0) return 1; + else if ( + get.effect( + target, + { + name: "sha", + nature: "ice", + isCard: true, + }, + player, + player + ) > eff + ) + return -1; return 0; - } - } - } - }, - clanshangshen:{ - audio:2, - trigger:{global:'damageEnd'}, - filter(event,player){ - if(!event.hasNature()||!event.player.isIn()) return false; - return game.countPlayer2(current=>{ - return current.hasHistory('damage',evt=>{ - return evt.hasNature()&&evt!=event; - }); - })==0; + }, + }, }, - logTarget:'player', - check(event,player){ - if(get.attitude(player,event.player)<=2) return false; - if(event.player.countCards('h')>=4) return false; + }, + clanshangshen: { + audio: 2, + trigger: { global: "damageEnd" }, + filter(event, player) { + if (!event.hasNature() || !event.player.isIn()) + return false; + return ( + game.countPlayer2((current) => { + return current.hasHistory("damage", (evt) => { + return evt.hasNature() && evt != event; + }); + }) == 0 + ); + }, + logTarget: "player", + check(event, player) { + if (get.attitude(player, event.player) <= 2) return false; + if (event.player.countCards("h") >= 4) return false; return true; }, - content(){ - player.executeDelayCardEffect('shandian'); + content() { + player.executeDelayCardEffect("shandian"); trigger.player.drawTo(4); }, - ai:{expose:0.25} + ai: { expose: 0.25 }, }, - clanfenchai:{ - audio:2, - init(player){ - if(player.getStorage('clanfenchai').length>0) return; - var history=player.getHistory('useSkill',evt=>{ - if(evt.type!='player') return false; - var skill=evt.sourceSkill||evt.skill,targets=evt.targets; - var info=get.info(skill); - if(!info||info.charlotte) return false; - if(targets&&targets.length){ - if(targets.filter(i=>player.differentSexFrom(i)).length>0) return true; + clanfenchai: { + audio: 2, + init(player) { + if (player.getStorage("clanfenchai").length > 0) return; + var history = player.getHistory("useSkill", (evt) => { + if (evt.type != "player") return false; + var skill = evt.sourceSkill || evt.skill, + targets = evt.targets; + var info = get.info(skill); + if (!info || info.charlotte) return false; + if (targets && targets.length) { + if ( + targets.filter((i) => + player.differentSexFrom(i) + ).length > 0 + ) + return true; } return false; }); - if(history.length){ - var evt=history[0],targets=evt.targets; - player.markAuto('clanfenchai',targets.filter(i=>player.differentSexFrom(i))); + if (history.length) { + var evt = history[0], + targets = evt.targets; + player.markAuto( + "clanfenchai", + targets.filter((i) => player.differentSexFrom(i)) + ); } }, - trigger:{ - player:['logSkill','useSkillAfter'], + trigger: { + player: ["logSkill", "useSkillAfter"], }, - forced:true, - silent:true, - onremove:true, - marktext:'钗', - intro:{ - content:(storage,player)=>'对象:'+get.translation(storage), + forced: true, + silent: true, + onremove: true, + marktext: "钗", + intro: { + content: (storage, player) => + "对象:" + get.translation(storage), }, - group:'clanfenchai_audio', - filter(event,player){ - if(event.type!='player') return false; - var targets=event.targets; - if(!targets||!targets.length) return false; - var info=get.info(event.sourceSkill||event.skill); - if(!info||info.charlotte) return false; - if(player.getStorage('clanfenchai').length!=0) return false; - return targets.filter(i=>player.differentSexFrom(i)).length>0; + group: "clanfenchai_audio", + filter(event, player) { + if (event.type != "player") return false; + var targets = event.targets; + if (!targets || !targets.length) return false; + var info = get.info(event.sourceSkill || event.skill); + if (!info || info.charlotte) return false; + if (player.getStorage("clanfenchai").length != 0) + return false; + return ( + targets.filter((i) => player.differentSexFrom(i)) + .length > 0 + ); }, - content(){ - player.markAuto('clanfenchai',trigger.targets.filter(i=>player.differentSexFrom(i))); + content() { + player.markAuto( + "clanfenchai", + trigger.targets.filter((i) => + player.differentSexFrom(i) + ) + ); }, - subSkill:{ - audio:{ - audio:'clanfenchai', - forced:true, - trigger:{player:'judge'}, - filter(event,player){ - return player.getStorage('clanfenchai').length; + subSkill: { + audio: { + audio: "clanfenchai", + forced: true, + trigger: { player: "judge" }, + filter(event, player) { + return player.getStorage("clanfenchai").length; }, - content(){} - } + content() {}, + }, + }, + mod: { + suit(card, suit) { + var player = get.owner(card) || _status.event.player; + if ( + !player || + !player.judging || + player.judging[0] != card + ) + return; + var storage = player.getStorage("clanfenchai"); + if (!storage.length) return; + return storage.filter((i) => i.isIn()).length > 0 + ? "heart" + : "spade"; + }, }, - mod:{ - suit(card,suit){ - var player=get.owner(card)||_status.event.player; - if(!player||!player.judging||player.judging[0]!=card) return; - var storage=player.getStorage('clanfenchai'); - if(!storage.length) return; - return storage.filter(i=>i.isIn()).length>0?'heart':'spade'; - } - } }, //族荀采 - clanlieshi:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return !player.isDisabledJudge()||player.countCards('h',card=>['sha','shan'].includes(get.name(card)))>0; + clanlieshi: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return ( + !player.isDisabledJudge() || + player.countCards("h", (card) => + ["sha", "shan"].includes(get.name(card)) + ) > 0 + ); }, - chooseButton:{ - dialog(event,player){ - var dialog=ui.create.dialog('烈誓:选择一项','hidden'); - dialog.add([lib.skill.clanlieshi.choices.slice(),'textbutton']); + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog( + "烈誓:选择一项", + "hidden" + ); + dialog.add([ + lib.skill.clanlieshi.choices.slice(), + "textbutton", + ]); return dialog; }, - filter(button,player){ - var link=button.link; - if(link=='damage') return !player.isDisabledJudge(); - var num=player.countCards('h',link); - return num>0&&num==player.getDiscardableCards(player,'h').filter(i=>get.name(i)==link).length; + filter(button, player) { + var link = button.link; + if (link == "damage") return !player.isDisabledJudge(); + var num = player.countCards("h", link); + return ( + num > 0 && + num == + player + .getDiscardableCards(player, "h") + .filter((i) => get.name(i) == link).length + ); }, - check(button){ - var player=_status.event.player; - switch (button.link){ - case 'damage': - if(get.damageEffect(player,player,player,'fire')>=0) return 10; - if(player.hp>=Math.max(2,3-player.getFriends().length)&&game.countPlayer(current=>get.attitude(player,current)<0&¤t.countCards('h',card=>['sha','shan'].includes(get.name(card))))) return 0.8+Math.random(); + check(button) { + var player = _status.event.player; + switch (button.link) { + case "damage": + if ( + get.damageEffect( + player, + player, + player, + "fire" + ) >= 0 + ) + return 10; + if ( + player.hp >= + Math.max( + 2, + 3 - player.getFriends().length + ) && + game.countPlayer( + (current) => + get.attitude(player, current) < 0 && + current.countCards("h", (card) => + ["sha", "shan"].includes( + get.name(card) + ) + ) + ) + ) + return 0.8 + Math.random(); return 0; - case 'shan': - if(player.countCards('h','shan')==1) return 8+Math.random(); - return 1+Math.random(); - case 'sha': - if(player.countCards('h','sha')==1) return 8+Math.random(); - return 0.9+Math.random(); + case "shan": + if (player.countCards("h", "shan") == 1) + return 8 + Math.random(); + return 1 + Math.random(); + case "sha": + if (player.countCards("h", "sha") == 1) + return 8 + Math.random(); + return 0.9 + Math.random(); } }, - backup(links){ - var next=get.copy(lib.skill['clanlieshi_backupx']); - next.choice=links[0]; + backup(links) { + var next = get.copy(lib.skill["clanlieshi_backupx"]); + next.choice = links[0]; return next; }, - prompt(links){ - if(links[0]=='damage') return '废除判定区并受到1点火焰伤害'; - return '弃置所有【'+get.translation(links[0])+'】'; + prompt(links) { + if (links[0] == "damage") + return "废除判定区并受到1点火焰伤害"; + return "弃置所有【" + get.translation(links[0]) + "】"; }, }, - choices:[ - ['damage','废除判定区并受到1点火焰伤害'], - ['shan','弃置所有【闪】'], - ['sha','弃置所有【杀】'], + choices: [ + ["damage", "废除判定区并受到1点火焰伤害"], + ["shan", "弃置所有【闪】"], + ["sha", "弃置所有【杀】"], ], - ai:{ - order(item,player){ - if(!player) return; - var eff=get.damageEffect(player,player,player,'fire'),disabled=!player.isDisabledJudge(); - if((player.countCards('h','sha')==1||player.countCards('h','shan')==1)&&eff<0&&!disabled) return 8; - else if(eff>=0&&!disabled) return 5.8; - if(!disabled&&!player.countCards('h',card=>['sha','shan'].includes(get.name(card)))){ - if((!player.hasSkill('clanhuanyin')||!player.canSave(player))&&player.hp<=1) return 0; - if(player.canSave(player)&&player.hp==1&&player.countCards('h')<=1) return 2.6; - if(player.hpget.attitude(player,current)<0&¤t.countCards('h',card=>['sha','shan'].includes(get.name(card))))) return 0; + ai: { + order(item, player) { + if (!player) return; + var eff = get.damageEffect( + player, + player, + player, + "fire" + ), + disabled = !player.isDisabledJudge(); + if ( + (player.countCards("h", "sha") == 1 || + player.countCards("h", "shan") == 1) && + eff < 0 && + !disabled + ) + return 8; + else if (eff >= 0 && !disabled) return 5.8; + if ( + !disabled && + !player.countCards("h", (card) => + ["sha", "shan"].includes(get.name(card)) + ) + ) { + if ( + (!player.hasSkill("clanhuanyin") || + !player.canSave(player)) && + player.hp <= 1 + ) + return 0; + if ( + player.canSave(player) && + player.hp == 1 && + player.countCards("h") <= 1 + ) + return 2.6; + if ( + player.hp < + Math.max( + 2, + 3 - player.getFriends().length + ) || + !game.countPlayer( + (current) => + get.attitude(player, current) < 0 && + current.countCards("h", (card) => + ["sha", "shan"].includes( + get.name(card) + ) + ) + ) + ) + return 0; } return 2.5; }, - expose:0.2, - result:{player:1}, + expose: 0.2, + result: { player: 1 }, }, - subSkill:{ - backup:{}, - backupx:{ - audio:'clanlieshi', - selectCard:-1, - selectTarget:-1, - filterCard:()=>false, - filterTarget:()=>false, - multitarget:true, - content(){ - 'step 0' - var choice=lib.skill.clanlieshi_backup.choice; - event.choice=choice; - if(choice=='damage'){ - player.damage('fire'); - if(!player.isDisabledJudge()) player.disableJudge(); - }else{ - var cards=player.getCards('h',choice); - if(cards.length) player.discard(cards); + subSkill: { + backup: {}, + backupx: { + audio: "clanlieshi", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + multitarget: true, + content() { + "step 0"; + var choice = lib.skill.clanlieshi_backup.choice; + event.choice = choice; + if (choice == "damage") { + player.damage("fire"); + if (!player.isDisabledJudge()) + player.disableJudge(); + } else { + var cards = player.getCards("h", choice); + if (cards.length) player.discard(cards); } - 'step 1' - if(!player.isIn()||!game.hasPlayer(current=>current!=player)) event.finish(); - else player.chooseTarget('烈誓:令一名其他角色选择另一项',lib.filter.notMe,true).set('ai',target=>{ - var player=_status.event.player,chosen=_status.event.getParent().choice,att=get.attitude(player,target); - if(chosen=='damage'){ - if(att>0) return 0; - return -att/2+target.countCards('h',card=>['sha','shan'].includes(get.name(card))); - } - return get.damageEffect(target,player,player,'fire'); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'fire'); - var list=[],choice=event.choice; - var choiceList=lib.skill.clanlieshi.choices.slice(); - choiceList=choiceList.map((link,ind,arr)=>{ - link=link[1]; - var ok=true; - if(arr[ind][0]==choice){ - link+='('+get.translation(player)+'已选)'; - ok=false; + ("step 1"); + if ( + !player.isIn() || + !game.hasPlayer((current) => current != player) + ) + event.finish(); + else + player + .chooseTarget( + "烈誓:令一名其他角色选择另一项", + lib.filter.notMe, + true + ) + .set("ai", (target) => { + var player = _status.event.player, + chosen = + _status.event.getParent() + .choice, + att = get.attitude(player, target); + if (chosen == "damage") { + if (att > 0) return 0; + return ( + -att / 2 + + target.countCards("h", (card) => + ["sha", "shan"].includes( + get.name(card) + ) + ) + ); + } + return get.damageEffect( + target, + player, + player, + "fire" + ); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); + var list = [], + choice = event.choice; + var choiceList = + lib.skill.clanlieshi.choices.slice(); + choiceList = choiceList.map( + (link, ind, arr) => { + link = link[1]; + var ok = true; + if (arr[ind][0] == choice) { + link += + "(" + + get.translation(player) + + "已选)"; + ok = false; + } + if (ind == 0) { + if (target.isDisabledJudge()) + ok = false; + } else if (ind > 0) { + var name = + ind == 1 ? "shan" : "sha"; + if (!target.countCards("h", name)) + ok = false; + } + if (!ok) + link = + '' + + link + + ""; + else + list.push( + "选项" + + get.cnNumber(ind + 1, true) + ); + return link; } - if(ind==0){ - if(target.isDisabledJudge()) ok=false; - } - else if(ind>0){ - var name=ind==1?'shan':'sha'; - if(!target.countCards('h',name)) ok=false; - } - if(!ok) link=''+link+''; - else list.push('选项'+get.cnNumber(ind+1,true)); - return link; - }); - if(!list.length){ + ); + if (!list.length) { game.log(target, "没有能执行的选项"); event.finish(); return; } - target.chooseControl(list).set('choiceList',choiceList).set('ai',()=>{ - var controls=_status.event.controls.slice(),player=_status.event.player,user=_status.event.getParent().player; - if(controls.length==1) return controls[0]; - if(controls.includes('选项一')&&get.damageEffect(player,user,player,'fire')>=0) return '选项一'; - if(controls.includes('选项一')&&player.hp<=2&&player.countCards('h',card=>['sha','shan'].includes(get.name(card)))<=3) controls.remove('选项一'); - if(controls.length==1) return controls[0]; - if(player.getCards('h','sha').reduce((p,c)=>p+get.value(c,player),0)>player.getCards('h','sha').reduce((p,c)=>p+get.value(c,player),0)){ - if(controls.includes('选项三')) return '选项三'; - } - else if(controls.includes('选项二')) return '选项二'; - return controls.randomGet(); - }); + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", () => { + var controls = + _status.event.controls.slice(), + player = _status.event.player, + user = + _status.event.getParent() + .player; + if (controls.length == 1) + return controls[0]; + if ( + controls.includes("选项一") && + get.damageEffect( + player, + user, + player, + "fire" + ) >= 0 + ) + return "选项一"; + if ( + controls.includes("选项一") && + player.hp <= 2 && + player.countCards("h", (card) => + ["sha", "shan"].includes( + get.name(card) + ) + ) <= 3 + ) + controls.remove("选项一"); + if (controls.length == 1) + return controls[0]; + if ( + player + .getCards("h", "sha") + .reduce( + (p, c) => + p + + get.value(c, player), + 0 + ) > + player + .getCards("h", "sha") + .reduce( + (p, c) => + p + + get.value(c, player), + 0 + ) + ) { + if (controls.includes("选项三")) + return "选项三"; + } else if (controls.includes("选项二")) + return "选项二"; + return controls.randomGet(); + }); } else event.finish(); - 'step 3' - if(result.control=='选项一'){ - if(!target.isDisabledJudge()) target.disableJudge(); - target.damage('fire'); + ("step 3"); + if (result.control == "选项一") { + if (!target.isDisabledJudge()) + target.disableJudge(); + target.damage("fire"); + } else { + var cards = target.getCards( + "h", + result.control == "选项二" ? "shan" : "sha" + ); + if (cards.length) target.discard(cards); } - else{ - var cards=target.getCards('h',result.control=='选项二'?'shan':'sha'); - if(cards.length) target.discard(cards); - } - } - } - } - }, - clandianzhan:{ - audio:2, - intro:{ - content:'已使用过的花色:$', - onunmark:true, - }, - trigger:{player:'useCardAfter'}, - forced:true, - filter(event,player){ - if(!lib.suit.includes(get.suit(event.card))) return false; - const suit=get.suit(event.card); - if(player.getRoundHistory('useCard',evt=>get.suit(evt.card)==suit).indexOf(event)!=0) return false; - return event.targets&&event.targets.length==1&&!event.targets[0].isLinked()||player.hasCard(card=>get.suit(card)==get.suit(event.card)&&player.canRecast(card),'h'); - }, - content(){ - 'step 0' - if(trigger.targets&&trigger.targets.length==1&&!trigger.targets[0].isLinked()){ - trigger.targets[0].link(true); - event.link=true; - } - var cards=player.getCards('h',card=>get.suit(card)==get.suit(trigger.card)&&player.canRecast(card)); - if(cards.length>0){ - player.recast(cards); - event.recast=true; - } - 'step 1' - if(event.link&&event.recast) player.draw(); - }, - group:'clandianzhan_count', - subSkill:{ - count:{ - charlotte:true, - trigger:{player:'useCardAfter'}, - filter(event,player){ - let suit=get.suit(event.card); - return lib.suits.includes(suit)&&!player.getStorage('clandianzhan').includes(suit); - }, - forced:true, - silent:true, - content(){ - let suits=player.getRoundHistory('useCard',evt=>{ - return lib.suits.includes(get.suit(evt.card)); - }).reduce((list,evt)=>{ - return list.add(get.suit(evt.card)); - },[]).sort((a,b)=>lib.suits.indexOf(a)-lib.suits.indexOf(b)); - if(!player.storage.clandianzhan){ - player.when({global:'roundStart'}).then(()=>{ - delete player.storage.clandianzhan; - player.unmarkSkill('clandianzhan'); - }); - } - player.storage.clandianzhan=suits; - player.markSkill('clandianzhan'); }, }, }, - init(player){ - let suits=player.getRoundHistory('useCard',evt=>{ - return lib.suits.includes(get.suit(evt.card)); - }).reduce((list,evt)=>{ - return list.add(get.suit(evt.card)); - },[]).sort((a,b)=>lib.suits.indexOf(a)-lib.suits.indexOf(b)); - if(suits.length){ - if(!player.storage.clandianzhan){ - player.when({global:'roundStart'}).then(()=>{ + }, + clandianzhan: { + audio: 2, + intro: { + content: "已使用过的花色:$", + onunmark: true, + }, + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + if (!lib.suit.includes(get.suit(event.card))) return false; + const suit = get.suit(event.card); + if ( + player + .getRoundHistory( + "useCard", + (evt) => get.suit(evt.card) == suit + ) + .indexOf(event) != 0 + ) + return false; + return ( + (event.targets && + event.targets.length == 1 && + !event.targets[0].isLinked()) || + player.hasCard( + (card) => + get.suit(card) == get.suit(event.card) && + player.canRecast(card), + "h" + ) + ); + }, + content() { + "step 0"; + if ( + trigger.targets && + trigger.targets.length == 1 && + !trigger.targets[0].isLinked() + ) { + trigger.targets[0].link(true); + event.link = true; + } + var cards = player.getCards( + "h", + (card) => + get.suit(card) == get.suit(trigger.card) && + player.canRecast(card) + ); + if (cards.length > 0) { + player.recast(cards); + event.recast = true; + } + ("step 1"); + if (event.link && event.recast) player.draw(); + }, + group: "clandianzhan_count", + subSkill: { + count: { + charlotte: true, + trigger: { player: "useCardAfter" }, + filter(event, player) { + let suit = get.suit(event.card); + return ( + lib.suits.includes(suit) && + !player + .getStorage("clandianzhan") + .includes(suit) + ); + }, + forced: true, + silent: true, + content() { + let suits = player + .getRoundHistory("useCard", (evt) => { + return lib.suits.includes( + get.suit(evt.card) + ); + }) + .reduce((list, evt) => { + return list.add(get.suit(evt.card)); + }, []) + .sort( + (a, b) => + lib.suits.indexOf(a) - + lib.suits.indexOf(b) + ); + if (!player.storage.clandianzhan) { + player + .when({ global: "roundStart" }) + .then(() => { + delete player.storage.clandianzhan; + player.unmarkSkill("clandianzhan"); + }); + } + player.storage.clandianzhan = suits; + player.markSkill("clandianzhan"); + }, + }, + }, + init(player) { + let suits = player + .getRoundHistory("useCard", (evt) => { + return lib.suits.includes(get.suit(evt.card)); + }) + .reduce((list, evt) => { + return list.add(get.suit(evt.card)); + }, []) + .sort( + (a, b) => + lib.suits.indexOf(a) - lib.suits.indexOf(b) + ); + if (suits.length) { + if (!player.storage.clandianzhan) { + player.when({ global: "roundStart" }).then(() => { delete player.storage.clandianzhan; - player.unmarkSkill('clandianzhan'); + player.unmarkSkill("clandianzhan"); }); } - player.storage.clandianzhan=suits; - player.markSkill('clandianzhan'); + player.storage.clandianzhan = suits; + player.markSkill("clandianzhan"); } - } - }, - clanhuanyin:{ - audio:2, - trigger:{player:'dying'}, - forced:true, - check:()=>true, - filter(event){ - return event.player.countCards('h')<4; }, - content(){ + }, + clanhuanyin: { + audio: 2, + trigger: { player: "dying" }, + forced: true, + check: () => true, + filter(event) { + return event.player.countCards("h") < 4; + }, + content() { player.drawTo(4); - } - }, - clandaojie:{ - audio:2, - audioname:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan','clan_xunyou'], - trigger:{player:'useCardAfter'}, - filter(event,player){ - return get.type(event.card,null,false)=='trick'&&!get.tag(event.card,'damage')&&event.cards.filterInD().length>0&&player.getHistory('useCard',evt=>{ - return get.type(evt.card,null,false)=='trick'&&!get.tag(evt.card,'damage'); - }).indexOf(event)==0; }, - forced:true, - clanSkill:true, - content(){ - 'step 0' - var skills=player.getSkills(null,false,false).filter(skill=>{ - var info=get.info(skill); - if(!info||info.charlotte||!get.is.locked(skill)||get.skillInfoTranslation(skill,player).length==0) return false; - return true; - }); - player.chooseControl(skills,'cancel2').set('choiceList',skills.map(i=>{ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; - })).set('displayIndex',false).set('prompt','蹈节:失去一个锁定技,或点“取消”失去1点体力').set('ai',()=>{ - var player=_status.event.player,choices=_status.event.controls.slice(); - var negs=choices.filter(i=>{ - var info=get.info(i); - if(!info||!info.ai) return false; - return info.ai.neg||info.ai.halfneg; + }, + clandaojie: { + audio: 2, + audioname: [ + "clan_xunshu", + "clan_xunchen", + "clan_xuncai", + "clan_xuncan", + "clan_xunyou", + ], + trigger: { player: "useCardAfter" }, + filter(event, player) { + return ( + get.type(event.card, null, false) == "trick" && + !get.tag(event.card, "damage") && + event.cards.filterInD().length > 0 && + player + .getHistory("useCard", (evt) => { + return ( + get.type(evt.card, null, false) == + "trick" && !get.tag(evt.card, "damage") + ); + }) + .indexOf(event) == 0 + ); + }, + forced: true, + clanSkill: true, + content() { + "step 0"; + var skills = player + .getSkills(null, false, false) + .filter((skill) => { + var info = get.info(skill); + if ( + !info || + info.charlotte || + !get.is.locked(skill) || + get.skillInfoTranslation(skill, player) + .length == 0 + ) + return false; + return true; }); - if(negs.length) return negs.randomGet(); - if(get.effect(player,{name:'losehp'},player,player)>=0) return 'cancel2'; - if(player.hp>3) return 'cancel2'; - return Math.random()<0.75?'clandaojie':choices.randomGet(); - }); - 'step 1' - if(result.control!='cancel2'){ + player + .chooseControl(skills, "cancel2") + .set( + "choiceList", + skills.map((i) => { + return ( + '
    【' + + get.translation( + lib.translate[i + "_ab"] || + get.translation(i).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set( + "prompt", + "蹈节:失去一个锁定技,或点“取消”失去1点体力" + ) + .set("ai", () => { + var player = _status.event.player, + choices = _status.event.controls.slice(); + var negs = choices.filter((i) => { + var info = get.info(i); + if (!info || !info.ai) return false; + return info.ai.neg || info.ai.halfneg; + }); + if (negs.length) return negs.randomGet(); + if ( + get.effect( + player, + { name: "losehp" }, + player, + player + ) >= 0 + ) + return "cancel2"; + if (player.hp > 3) return "cancel2"; + return Math.random() < 0.75 + ? "clandaojie" + : choices.randomGet(); + }); + ("step 1"); + if (result.control != "cancel2") { player.removeSkills(result.control); - } - else{ + } else { player.loseHp(); } - 'step 2' - var targets=game.filterPlayer(current=>current==player||current.hasClan('颍川荀氏')); - if(targets.length==1) event._result={bool:true,targets:targets}; - else player.chooseTarget('蹈节:将'+get.translation(trigger.cards.filterInD())+'交给一名颍川荀氏角色',true,(card,player,target)=>{ - return target==player||target.hasClan('颍川荀氏') - }).set('ai',target=>get.attitude(_status.event.player,target)); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(trigger.cards.filterInD(),player,'gain2'); + ("step 2"); + var targets = game.filterPlayer( + (current) => + current == player || current.hasClan("颍川荀氏") + ); + if (targets.length == 1) + event._result = { bool: true, targets: targets }; + else + player + .chooseTarget( + "蹈节:将" + + get.translation(trigger.cards.filterInD()) + + "交给一名颍川荀氏角色", + true, + (card, player, target) => { + return ( + target == player || + target.hasClan("颍川荀氏") + ); + } + ) + .set("ai", (target) => + get.attitude(_status.event.player, target) + ); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(trigger.cards.filterInD(), player, "gain2"); } }, }, //族吴班 - clanzhanding:{ - audio:2, - enable:'chooseToUse', - viewAsFilter(player){ - return player.countCards('hes')>0; + clanzhanding: { + audio: 2, + enable: "chooseToUse", + viewAsFilter(player) { + return player.countCards("hes") > 0; }, - viewAs:{name:'sha'}, - filterCard:true, - position:'hes', - selectCard:[1,Infinity], - check(card){ - return 6-ui.selected.cards.length-get.value(card); + viewAs: { name: "sha" }, + filterCard: true, + position: "hes", + selectCard: [1, Infinity], + check(card) { + return 6 - ui.selected.cards.length - get.value(card); }, - onuse(links,player){ - lib.skill.chenliuwushi.change(player,-1); - player.addTempSkill('clanzhanding_effect'); + onuse(links, player) { + lib.skill.chenliuwushi.change(player, -1); + player.addTempSkill("clanzhanding_effect"); }, - ai:{ - order:1, - respondSha:true, - skillTagFilter(player){ - return player.countCards('hes')>0; + ai: { + order: 1, + respondSha: true, + skillTagFilter(player) { + return player.countCards("hes") > 0; }, }, - subSkill:{ - effect:{ - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - filter(event,player){ - return event.skill=='clanzhanding'; + subSkill: { + effect: { + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "clanzhanding"; }, - content(){ - if(player.hasHistory('sourceDamage',function(evt){ - return evt.card==trigger.card; - })){ - var num1=player.countCards('h'),num2=player.getHandcardLimit(); - if(num1num2) return num1-num2; - return [0,1]; + selectCard() { + var player = _status.event.player; + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + if (num1 > num2) return num1 - num2; + return [0, 1]; }, - filterCard(card,player){ - var num1=player.countCards('h'),num2=player.getHandcardLimit(); - return num1>num2; + filterCard(card, player) { + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + return num1 > num2; }, - check(card){ - var player=_status.event.player; - if(player.countCards('h',function(card){ - return lib.skill.clanyirong.checkx(card)>0; - })+1<(player.countCards('h')-player.getHandcardLimit())) return 0; + check(card) { + var player = _status.event.player; + if ( + player.countCards("h", function (card) { + return lib.skill.clanyirong.checkx(card) > 0; + }) + + 1 < + player.countCards("h") - player.getHandcardLimit() + ) + return 0; return lib.skill.clanyirong.checkx(card); }, - checkx(card){ - var num=1; - if(_status.event.player.getUseValue(card,null,true)<=0) num=1.5; - return (15-get.value(card))*num; + checkx(card) { + var num = 1; + if (_status.event.player.getUseValue(card, null, true) <= 0) + num = 1.5; + return (15 - get.value(card)) * num; }, - prompt(){ - var player=_status.event.player; - var num1=player.countCards('h'),num2=player.getHandcardLimit(); - var str=''; - if(num1>num2){ - str+=('弃置'+get.cnNumber(num1-num2)+'张牌,然后手牌上限+1。') + prompt() { + var player = _status.event.player; + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + var str = ''; + if (num1 > num2) { + str += + "弃置" + + get.cnNumber(num1 - num2) + + "张牌,然后手牌上限+1。"; + } else { + str += + "摸" + + get.cnNumber(Math.min(8, num2 - num1)) + + "张牌,然后手牌上限-1。"; } - else{ - str+=('摸'+get.cnNumber(Math.min(8,num2-num1))+'张牌,然后手牌上限-1。'); + str += "
    ※当前手牌上限:" + num2; + var num3 = (_status.event.getParent().phaseIndex || 0) + 1; + if (num3 > 0) { + str += ";阶段数:" + num3; } - str+=('
    ※当前手牌上限:'+num2); - var num3=((_status.event.getParent().phaseIndex||0)+1); - if(num3>0){ - str+=(';阶段数:'+num3) - } - str+='
    '; + str += "
    "; return str; }, - content(){ - 'step 0' - if(cards.length){ - lib.skill.chenliuwushi.change(player,1); + content() { + "step 0"; + if (cards.length) { + lib.skill.chenliuwushi.change(player, 1); event.finish(); + } else { + var num1 = player.countCards("h"), + num2 = player.getHandcardLimit(); + if (num1 < num2) player.draw(Math.min(8, num2 - num1)); } - else{ - var num1=player.countCards('h'),num2=player.getHandcardLimit(); - if(num14&&numx>4)) return 10; + ai: { + order(item, player) { + var num = player.getHandcardLimit(), + numx = + (_status.event.getParent().phaseIndex || 0) + 1; + if ( + num == 5 && + numx == 4 && + player.getStat("skill").clanyirong + ) + return 0; + if ( + player.countCards("h") == num + 1 && + num != 2 && + (num <= 4 || (num > 4 && numx > 4)) + ) + return 10; return 0.5; }, - result:{player:1}, - threaten:5, + result: { player: 1 }, + threaten: 5, }, }, - clanguixiang:{ - audio:2, - trigger:{ - player:'phaseChange', + clanguixiang: { + audio: 2, + trigger: { + player: "phaseChange", }, - forced:true, - filter(event,player){ - if(event.phaseList[event.num].startsWith('phaseUse')) return false; - var num1=player.getHandcardLimit()-1,num2=event.num; - return num1==num2; + forced: true, + filter(event, player) { + if (event.phaseList[event.num].startsWith("phaseUse")) + return false; + var num1 = player.getHandcardLimit() - 1, + num2 = event.num; + return num1 == num2; }, - content(){ - trigger.phaseList[trigger.num]='phaseUse|clanguixiang'; + content() { + trigger.phaseList[trigger.num] = "phaseUse|clanguixiang"; game.delayx(); }, }, - clanmuyin:{ - audio:2, - clanSkill:true, - audioname:['clan_wuxian','clan_wuban','clan_wukuang','clan_wuqiao'], - trigger:{player:'phaseBegin'}, - isMax(player){ - var num=player.getHandcardLimit(); - return !game.hasPlayer(function(current){ - return current!=player&¤t.getHandcardLimit()>num; + clanmuyin: { + audio: 2, + clanSkill: true, + audioname: [ + "clan_wuxian", + "clan_wuban", + "clan_wukuang", + "clan_wuqiao", + ], + trigger: { player: "phaseBegin" }, + isMax(player) { + var num = player.getHandcardLimit(); + return !game.hasPlayer(function (current) { + return ( + current != player && + current.getHandcardLimit() > num + ); }); }, - filter(event,player){ - return game.hasPlayer(function(current){ - return (current==player||current.hasClan('陈留吴氏'))&&!lib.skill.clanmuyin.isMax(current); + filter(event, player) { + return game.hasPlayer(function (current) { + return ( + (current == player || + current.hasClan("陈留吴氏")) && + !lib.skill.clanmuyin.isMax(current) + ); }); }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('clanmuyin'),'令一名陈留吴氏角色的手牌上限+1',function(card,player,current){ - return (current==player||current.hasClan('陈留吴氏'))&&!lib.skill.clanmuyin.isMax(current); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('clanmuyin',target); - lib.skill.chenliuwushi.change(target,1); + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt("clanmuyin"), + "令一名陈留吴氏角色的手牌上限+1", + function (card, player, current) { + return ( + (current == player || + current.hasClan("陈留吴氏")) && + !lib.skill.clanmuyin.isMax(current) + ); + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("clanmuyin", target); + lib.skill.chenliuwushi.change(target, 1); game.delayx(); } }, }, - chenliuwushi:{ - charlotte:true, - change(player,num){ - player.addSkill('chenliuwushi'); - var info=player.storage; - if(typeof info.chenliuwushi!='number') info.chenliuwushi=0; - info.chenliuwushi+=num; - if(info.chenliuwushi==0) player.unmarkSkill('chenliuwushi'); - else player.markSkill('chenliuwushi'); - if(num>=0) game.log(player,'的手牌上限','#y+'+num); - else game.log(player,'的手牌上限','#g'+num); + chenliuwushi: { + charlotte: true, + change(player, num) { + player.addSkill("chenliuwushi"); + var info = player.storage; + if (typeof info.chenliuwushi != "number") + info.chenliuwushi = 0; + info.chenliuwushi += num; + if (info.chenliuwushi == 0) + player.unmarkSkill("chenliuwushi"); + else player.markSkill("chenliuwushi"); + if (num >= 0) game.log(player, "的手牌上限", "#y+" + num); + else game.log(player, "的手牌上限", "#g" + num); }, - mod:{ - maxHandcard(player,num){ - var add=player.storage.chenliuwushi; - if(typeof add=='number') return num+add; + mod: { + maxHandcard(player, num) { + var add = player.storage.chenliuwushi; + if (typeof add == "number") return num + add; }, }, - markimage:'image/card/handcard.png', - intro:{ - content(num,player){ - var str='
  • 手牌上限'; - if(num>=0) str+='+'; - str+=num; - str+='
  • 当前手牌上限:'; - str+=player.getHandcardLimit(); + markimage: "image/card/handcard.png", + intro: { + content(num, player) { + var str = "
  • 手牌上限"; + if (num >= 0) str += "+"; + str += num; + str += "
  • 当前手牌上限:"; + str += player.getHandcardLimit(); return str; }, }, }, }, - characterReplace:{ - wuban:['clan_wuban','dc_wuban','wuban','xin_wuban'], + characterReplace: { + wuban: ["clan_wuban", "dc_wuban", "wuban", "xin_wuban"], }, - characterIntro:{ - xunshu:'荀淑(83年~149年),字季和,为郎陵侯相,颍川颍阴人(今河南省许昌市)人。汉和帝至汉桓帝时人物,以品行高洁著称。有子八人,号八龙。年轻时有高尚的德行,学问渊博,不喜欢雕章琢句,徒在文字上用功,不注重实际的学识。因此,常常被俗儒看不起。但州里却称他有知人之明。安帝时,征召任为郎中,后来再升当涂长。离职还乡里。他的孙子荀彧是曹操部下著名的谋士。', - xuncai:'荀采(生卒年不详),字女荀,颍川人,东汉名士荀爽之女。荀采聪慧敏捷而有才艺。十七岁时,荀采嫁给阴瑜。两年后阴瑜去世。荀采不愿意改嫁,但荀爽答应把荀采嫁给同郡人郭奕。荀采趁着旁人没有防备,用粉在门上写下:“尸还阴”,而后自缢而死。', - xuncan:'荀粲(210年—238年),字奉倩,颍川郡颍阴县(今河南省许昌市)人。三国时期曹魏大臣、玄学家,太尉荀彧幼子。个性简贵,不轻易交接常人,所交之辈皆一时俊杰。聪颖过人,善谈玄理,名噪一时。娶大将军曹洪之女为妻,生活美满。景初二年,面对妻子去世,悲痛过度而死,时年二十九,成语“荀令伤神”与之有关。', - hanshao:'韩韶(生卒年不详),字仲黄,颍川舞阳(今河南省漯河市)人,东汉桓帝时出仕。任郡吏,有政绩,继而被征入司徒府。他公正廉明,尽心民事,视民苦如在己身,政绩卓著。汉永寿二年(公元156年),泰山贼公孙举率流寇数千骚扰嬴县,守令因不能拒敌安民,多受制裁,朝廷命尚书府从三府(司徒、司马、司空)属员中,选择能治理民事,又能拒寇入侵的官员,前往镇守。韩韶被封为“嬴长”到嬴县上任,他是莱芜历史上唯一的一位“嬴长”。', - hanrong:'韩融(127年~196年),字元长,颍川舞阳(今属河南省漯河市)人。赢长韩韶子,献帝时大臣。中平五年(188年),融与荀爽、陈纪等十四人并博士征,不至。董卓废立,融等复俱公车征。初平元年(190年)六月,融为大鸿胪,奉命与执金吾胡母班等出使关东。献帝东迁,为李傕、郭汜等所败,融为太仆,奉命至弘农与傕、汜连和,使其放遣公卿百官及宫女妇人。', - wukuang:'吴匡(生卒年不详),兖州陈留(今河南开封市)人。东汉末年大臣,大将军何进部将。光熹元年(公元189年),汉灵帝死后,十常侍干预朝政,大将军何进谋诛宦官,但失败被杀,吴匡联合曹操、袁绍等杀尽宦官,攻杀车骑将军何苗。兴平二年(公元195年)十月,李傕、郭汜后悔放汉献帝东归洛阳,于是联合起来追击,曹操遂起兵平乱,但在回朝后,曹操挟天子以令诸侯,实行专权,但遭到吴匡反对。', - wanghun:'王浑(223年~297年),字玄冲,太原郡晋阳县(今山西省太原市)人。魏晋时期名臣,曹魏司空王昶的儿子。王浑早年为大将军曹爽的掾吏,高平陵政变后,循例免官,出任怀县县令、散骑侍郎等职,袭封京陵县侯。西晋王朝建立后,加号扬烈将军,历任征虏将军、东中郎将、豫州刺史等职,积极筹划伐吴方略。咸宁五年(279年),配合镇南将军杜预灭亡吴国,迁征东大将军、左仆射、司徒公,晋爵京陵县公。晋惠帝司马衷即位,加任侍中衔。楚王司马玮发动政变,有意寻求支持,遭到严词拒绝。楚王司马玮死后,复任司徒、录尚书事。元康七年(297年),王浑去世,享年七十五岁,谥号为元。《唐会要》尊为“魏晋八君子”之一。', - zhongyu:'钟毓(?-263年),字稚叔,颍川长社(今河南长葛市)人。三国时期魏国大臣,太傅钟繇之子、司徒钟会之兄。出身颍川钟氏,机灵敏捷,有其父之遗风。十四岁时,起家散骑侍郎。太和初年,迁黄门侍郎,袭封定陵县侯。正始年间,拜散骑常侍,迁魏郡太守,入为侍中、御史中丞、廷尉 [5] 。随平诸葛诞的淮南叛乱,拜青州刺史、后将军,都督徐州、荆州诸军事。景元四年(263年),去世,追赠车骑将军,谥号为惠,著有文集五卷(见《隋书·经籍志》及《两唐书·经籍志》),传于世。', - wanglun:'王沦(233年-257年)字太冲,出身太原晋阳王姓世族(今山西省太原市),王昶三子,王浑、王深之弟,王湛之兄。醇粹简远,崇尚老庄之学,心思平淡。二十多时被举荐为孝廉,没有前往,后任大将军参军。257年,诸葛诞不满司马氏篡权而在寿春起义,王沦跟随司马昭征讨,遭遇疾疫去世,时年二十五,时人惜之,司马昭为他流泪。其兄著诔文《表德论》,表述其德行,说“因为畏惧帝王的典章制度,不能写墓志铭,于是撰写过往的事迹,刻在墓的背面。”', - wuqiao:'吴乔,西晋人物,蜀车骑将军吴懿之孙。李雄建立成汉政权,他沦落益州,长达三十年,始终不向李雄屈服。', - clan_wangguang:'王广,三国时期曹魏太原祁县人,哲学家。东汉司徒王允从孙,魏太尉王凌之子。有志尚学,官至尚书。魏时随父亲在朝作官,屯骑校尉,机智有谋。当得知司马懿篡夺曹魏政权时,王凌与外甥令狐愚合谋立楚王为魏主,王广劝其父不可,王凌没有接受儿子的谏言,结果计谋泄而被害。', - wangmingshan:'王明山,王凌的小儿子,太原祁(今山西省祁县)人,三国魏书法家,最知名善画,多技艺,人得其书,皆以为法。太尉王凌参与谋划废立,事情泄露,被太傅司马懿领兵平定。', + characterIntro: { + xunshu: "荀淑(83年~149年),字季和,为郎陵侯相,颍川颍阴人(今河南省许昌市)人。汉和帝至汉桓帝时人物,以品行高洁著称。有子八人,号八龙。年轻时有高尚的德行,学问渊博,不喜欢雕章琢句,徒在文字上用功,不注重实际的学识。因此,常常被俗儒看不起。但州里却称他有知人之明。安帝时,征召任为郎中,后来再升当涂长。离职还乡里。他的孙子荀彧是曹操部下著名的谋士。", + xuncai: "荀采(生卒年不详),字女荀,颍川人,东汉名士荀爽之女。荀采聪慧敏捷而有才艺。十七岁时,荀采嫁给阴瑜。两年后阴瑜去世。荀采不愿意改嫁,但荀爽答应把荀采嫁给同郡人郭奕。荀采趁着旁人没有防备,用粉在门上写下:“尸还阴”,而后自缢而死。", + xuncan: "荀粲(210年—238年),字奉倩,颍川郡颍阴县(今河南省许昌市)人。三国时期曹魏大臣、玄学家,太尉荀彧幼子。个性简贵,不轻易交接常人,所交之辈皆一时俊杰。聪颖过人,善谈玄理,名噪一时。娶大将军曹洪之女为妻,生活美满。景初二年,面对妻子去世,悲痛过度而死,时年二十九,成语“荀令伤神”与之有关。", + hanshao: + "韩韶(生卒年不详),字仲黄,颍川舞阳(今河南省漯河市)人,东汉桓帝时出仕。任郡吏,有政绩,继而被征入司徒府。他公正廉明,尽心民事,视民苦如在己身,政绩卓著。汉永寿二年(公元156年),泰山贼公孙举率流寇数千骚扰嬴县,守令因不能拒敌安民,多受制裁,朝廷命尚书府从三府(司徒、司马、司空)属员中,选择能治理民事,又能拒寇入侵的官员,前往镇守。韩韶被封为“嬴长”到嬴县上任,他是莱芜历史上唯一的一位“嬴长”。", + hanrong: + "韩融(127年~196年),字元长,颍川舞阳(今属河南省漯河市)人。赢长韩韶子,献帝时大臣。中平五年(188年),融与荀爽、陈纪等十四人并博士征,不至。董卓废立,融等复俱公车征。初平元年(190年)六月,融为大鸿胪,奉命与执金吾胡母班等出使关东。献帝东迁,为李傕、郭汜等所败,融为太仆,奉命至弘农与傕、汜连和,使其放遣公卿百官及宫女妇人。", + wukuang: + "吴匡(生卒年不详),兖州陈留(今河南开封市)人。东汉末年大臣,大将军何进部将。光熹元年(公元189年),汉灵帝死后,十常侍干预朝政,大将军何进谋诛宦官,但失败被杀,吴匡联合曹操、袁绍等杀尽宦官,攻杀车骑将军何苗。兴平二年(公元195年)十月,李傕、郭汜后悔放汉献帝东归洛阳,于是联合起来追击,曹操遂起兵平乱,但在回朝后,曹操挟天子以令诸侯,实行专权,但遭到吴匡反对。", + wanghun: + "王浑(223年~297年),字玄冲,太原郡晋阳县(今山西省太原市)人。魏晋时期名臣,曹魏司空王昶的儿子。王浑早年为大将军曹爽的掾吏,高平陵政变后,循例免官,出任怀县县令、散骑侍郎等职,袭封京陵县侯。西晋王朝建立后,加号扬烈将军,历任征虏将军、东中郎将、豫州刺史等职,积极筹划伐吴方略。咸宁五年(279年),配合镇南将军杜预灭亡吴国,迁征东大将军、左仆射、司徒公,晋爵京陵县公。晋惠帝司马衷即位,加任侍中衔。楚王司马玮发动政变,有意寻求支持,遭到严词拒绝。楚王司马玮死后,复任司徒、录尚书事。元康七年(297年),王浑去世,享年七十五岁,谥号为元。《唐会要》尊为“魏晋八君子”之一。", + zhongyu: + "钟毓(?-263年),字稚叔,颍川长社(今河南长葛市)人。三国时期魏国大臣,太傅钟繇之子、司徒钟会之兄。出身颍川钟氏,机灵敏捷,有其父之遗风。十四岁时,起家散骑侍郎。太和初年,迁黄门侍郎,袭封定陵县侯。正始年间,拜散骑常侍,迁魏郡太守,入为侍中、御史中丞、廷尉 [5] 。随平诸葛诞的淮南叛乱,拜青州刺史、后将军,都督徐州、荆州诸军事。景元四年(263年),去世,追赠车骑将军,谥号为惠,著有文集五卷(见《隋书·经籍志》及《两唐书·经籍志》),传于世。", + wanglun: + "王沦(233年-257年)字太冲,出身太原晋阳王姓世族(今山西省太原市),王昶三子,王浑、王深之弟,王湛之兄。醇粹简远,崇尚老庄之学,心思平淡。二十多时被举荐为孝廉,没有前往,后任大将军参军。257年,诸葛诞不满司马氏篡权而在寿春起义,王沦跟随司马昭征讨,遭遇疾疫去世,时年二十五,时人惜之,司马昭为他流泪。其兄著诔文《表德论》,表述其德行,说“因为畏惧帝王的典章制度,不能写墓志铭,于是撰写过往的事迹,刻在墓的背面。”", + wuqiao: "吴乔,西晋人物,蜀车骑将军吴懿之孙。李雄建立成汉政权,他沦落益州,长达三十年,始终不向李雄屈服。", + clan_wangguang: + "王广,三国时期曹魏太原祁县人,哲学家。东汉司徒王允从孙,魏太尉王凌之子。有志尚学,官至尚书。魏时随父亲在朝作官,屯骑校尉,机智有谋。当得知司马懿篡夺曹魏政权时,王凌与外甥令狐愚合谋立楚王为魏主,王广劝其父不可,王凌没有接受儿子的谏言,结果计谋泄而被害。", + wangmingshan: + "王明山,王凌的小儿子,太原祁(今山西省祁县)人,三国魏书法家,最知名善画,多技艺,人得其书,皆以为法。太尉王凌参与谋划废立,事情泄露,被太傅司马懿领兵平定。", }, - dynamicTranslate:{ - clanlianzhu(player){ - if(player.storage.clanlianzhu) return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; + dynamicTranslate: { + clanlianzhu(player) { + if (player.storage.clanlianzhu) + return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。'; }, - clanguangu(player){ - if(player.storage.clanguangu) return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。'; + clanguangu(player) { + if (player.storage.clanguangu) + return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。'; return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。'; }, - clanjiexuan(player){ - if(player.storage.clanjiexuan) return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。'; + clanjiexuan(player) { + if (player.storage.clanjiexuan) + return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。'; return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。'; }, }, - translate:{ - clan_wuxian_prefix:'族', - clan_wuban_prefix:'族', - clan_xunshu_prefix:'族', - clan_xunchen_prefix:'族', - clan_xuncai_prefix:'族', - clan_xuncan_prefix:'族', - clan_hanshao_prefix:'族', - clan_hanrong_prefix:'族', - clan_wukuang_prefix:'族', - clan_wangling_prefix:'族', - clan_zhongyan_prefix:'族', - clan_wangyun_prefix:'族', - clan_wanghun_prefix:'族', - clan_zhonghui_prefix:'族', - clan_zhongyu_prefix:'族', - clan_wanglun_prefix:'族', - clan_xunyou_prefix:'族', - clan_wuqiao_prefix:'族', + translate: { + clan_wuxian_prefix: "族", + clan_wuban_prefix: "族", + clan_xunshu_prefix: "族", + clan_xunchen_prefix: "族", + clan_xuncai_prefix: "族", + clan_xuncan_prefix: "族", + clan_hanshao_prefix: "族", + clan_hanrong_prefix: "族", + clan_wukuang_prefix: "族", + clan_wangling_prefix: "族", + clan_zhongyan_prefix: "族", + clan_wangyun_prefix: "族", + clan_wanghun_prefix: "族", + clan_zhonghui_prefix: "族", + clan_zhongyu_prefix: "族", + clan_wanglun_prefix: "族", + clan_xunyou_prefix: "族", + clan_wuqiao_prefix: "族", - clan_wuxian:'族吴苋', - clanyirong:'移荣', - clanyirong_info:'出牌阶段限两次。若你的手牌数:小于X,则你可以将手牌摸至X张(至多摸八张),然后X-1;大于X,则你可以将手牌弃置至X张,然后X+1。(X为你的手牌上限)', - clanguixiang:'贵相', - clanguixiang_info:'锁定技。你的非出牌阶段开始前,若此阶段即将成为你本回合内的第X个阶段(X为你的手牌上限),则你终止此阶段,改为进行一个出牌阶段。', - clanmuyin:'穆荫', - clanmuyin_info:'宗族技。回合开始时,你可以选择一名手牌上限不为全场最多的陈留吴氏角色。该角色的手牌上限+1。', - chenliuwushi:'陈留·吴氏', - clan_wuban:'族吴班', - clanzhanding:'斩钉', - clanzhanding_info:'你可以将任意张牌当做【杀】使用并你令你的手牌上限-1。你以此法使用的【杀】结算结束后,若你因此【杀】造成过伤害,则你将手牌摸至手牌上限(至多摸五张),否则你令此【杀】不计入次数限制。', - clan_xunshu:'族荀淑', - clanshenjun:'神君', - clanshenjun_info:'当一名角色使用【杀】或普通锦囊牌时,若你手牌中有该牌名的牌,你展示之,且这些牌称为“神君”。然后本阶段结束时,你可以将等同于你“神君”数张牌当做一张“神君”牌使用。', - clanbalong:'八龙', - clanbalong_info:'锁定技。当你于一回合内首次{回复体力后或受到伤害后或失去体力后},若你手牌中唯一最多的类别为锦囊牌,你展示所有手牌并摸至角色数张。', - clandaojie:'蹈节', - clandaojie_info:'宗族技,锁定技。当你每回合第一次使用非伤害类普通锦囊牌后,你须失去一个锁定技或失去1点体力,令一名颍川荀氏角色获得此牌对应的所有实体牌。', - clan_xuncai:'族荀采', - clanlieshi:'烈誓', - clanlieshi_info:'出牌阶段,你可以选择一项:1.废除判定区并受到你造成的1点火焰伤害;2.弃置所有【闪】;3.弃置所有【杀】。然后令一名其他角色从你未选择的选项中选择一项。', - clandianzhan:'点盏', - clandianzhan_info:'锁定技。当你每轮第一次使用一种花色的牌后:若此牌的目标数为1且目标未横置,你横置此牌目标;若你有此花色的手牌,你重铸这些牌。均执行后你摸一张牌。', - clanhuanyin:'还阴', - clanhuanyin_info:'锁定技。当你进入濒死状态时,将手牌补至四张。', - clan_xunchen:'族荀谌', - clansankuang:'三恇', - clansankuang_info:'锁定技。当你每轮第一次使用一种类别的牌后,你令一名其他角色交给你至少X张牌,然后于装备区或处理区内获得你使用的牌对应的所有实体牌(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)。', - clanbeishi:'卑势', - clanbeishi_info:'锁定技。当一名角色失去最后的手牌后,若其是你首次发动〖三恇〗的目标角色,你回复1点体力。', - clan_xuncan:'族荀粲', - clanyunshen:'熨身', - clanyunshen_info:'出牌阶段限一次。你可以令一名其他角色回复1点体力,然后选择一项:1.你视为对其使用一张冰【杀】;2.其视为对你使用一张冰【杀】。', - clanshangshen:'伤神', - clanshangshen_info:'当一名角色受到属性伤害后,若本回合此前没有角色或已死亡的角色受到过属性伤害,你可以执行目标角色为你的【闪电】效果,然后其将手牌摸至四张。', - clanfenchai:'分钗', - clanfenchai_info:'锁定技。若你首次发动技能指定的异性目标角色中:存在存活角色,你的判定牌视为♥;不存在存活角色,你的判定牌视为♠。', - clan_hanshao:'族韩韶', - clanfangzhen:'放赈', - clanfangzhen_info:'出牌阶段开始时,你可以横置一名角色并选择一项:1.摸两张牌,然后交给其两张牌;2.令其回复1点体力。然后第X轮游戏开始时,你失去〖放赈〗(X为其座位号)。', - clanliuju:'留驹', - clanliuju_info:'出牌阶段结束时,你可以与一名角色A拼点,输的角色可以使用任意张拼点牌中的非基本牌。然后若你至A的距离或A至你的距离发生了变化,你重置〖恤民〗。', - clanxumin:'恤民', - clanxumin_info:'宗族技,限定技。你可以将一张牌当做【五谷丰登】对任意名其他角色使用。', - clan_hanrong:'族韩融', - clanlianhe:'连和', - clanlianhe_info:'出牌阶段开始时,你可以横置两名角色。这些角色于自己的下个出牌阶段结束时,若其此阶段未摸牌,其令你摸X+1张牌或交给你X-1张牌(X为其此阶段获得的牌数且至多为3)。', - clanhuanjia:'缓颊', - clanhuanjia_info:'出牌阶段结束时,你可以与一名角色拼点。赢的角色可以使用一张拼点牌。然后若此牌:未造成过伤害,你获得另一张拼点牌;造成过伤害,你失去一个技能。', - clan_wukuang:'族吴匡', - clanlianzhu:'联诛', - clanlianzhu_info:'转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色相同,则你的手牌上限+1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色不同,则你的手牌上限-1。', - clan_wangling:'族王淩', - clanbolong:'驳龙', - clanbolong_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.你交给其一张牌,然后视为对其使用一张雷【杀】;2.交给你等同于你手牌数的牌,然后视为对你使用一张【酒】。', - clanzhongliu:'中流', - clanzhongliu_info:'宗族技,锁定技。当你使用牌时,若此牌对应的实体牌均不为太原王氏角色的手牌,你重置武将牌上的技能。', - clan_zhongyan:'族钟琰', - clanguangu:'观骨', - clanguangu_info:'转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。', - clanxiaoyong:'啸咏', - clanxiaoyong_info:'锁定技。当你于回合内首次使用字数为X的牌时,你重置〖观骨〗(X为你上次发动〖观骨〗观看的牌数)。', - clanbaozu:'保族', - clanbaozu_info:'宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。', - clan_wangyun:'族王允', - clanjiexuan:'解悬', - clanjiexuan_info:'限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。', - clanmingjie:'铭戒', - clanmingjie_info:'限定技。出牌阶段,你可以选择一名角色,然后你获得此下效果:①你使用牌时你可以指定其为额外目标直到其下个回合结束。②其下个回合结束时(若该角色为你则改为你的下下个回合结束时),你可以使用本回合使用过的黑桃牌和被抵消过的牌。', - clan_wanghun:'族王浑', - clanfuxun:'抚循', - clanfuxun_info:'出牌阶段限一次。你可以获得或交给一名其他角色一张手牌,然后若其手牌数与你相等且于此阶段仅以此法获得或失去过牌,你可以将一张牌当任意基本牌使用。', - clanchenya:'沉雅', - clanchenya_info:'当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其手牌数)。', - clan_zhonghui:'族钟会', - clanyuzhi:'迂志', - clanyuzhi_info:'锁定技。新的一轮开始时,你依次执行以下项:①你弃置上一轮因〖迂志〗展示的手牌,然后若你上一轮使用的牌数或你上上轮因〖迂志〗摸的牌数小于你上轮因〖迂志〗摸的牌数,你受到1点雷属性伤害或失去〖保族〗。②你展示一张手牌,然后摸X张牌(X为此牌牌名字数)。', - clanxieshu:'挟术', - clanxieshu_info:'①当你因牌造成或受到伤害后,你可以横置武将牌并弃置Y张牌,然后摸你已损失体力值张牌(Y为此牌牌名字数)。②一名角色的濒死状态结算完毕后,你令〖挟术〗于本回合失效。', - clan_zhongyu:'族钟毓', - clanjiejian:'捷谏', - clanjiejian_info:'当你于一回合使用第X张牌指定第一个目标后,若此牌不为装备牌,则你可以令一名目标角色摸X张牌。(X为此牌牌名字数)', - clanhuanghan:'惶汗', - clanhuanghan_info:'当你受到牌造成的伤害后,你可以摸X张牌并弃置Y张牌(X为此牌牌名字数,Y为你已损失的体力值),然后若此次技能发动不为你本回合首次发动此技能,你重置技能〖保族〗。', - clan_wanglun:'族王沦', - clanqiuxin:'求心', - clanqiuxin_info:'出牌阶段限一次,你可以令一名其他角色选择一项:①你对其使用【杀】;②你对其使用任意普通锦囊牌。当你执行其选择的选项后,你视为执行另一项。', - clanjianyuan:'简远', - clanjianyuan_info:'当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其本阶段的使用牌数)。', - clan_xunyou:'族荀攸', - clanbaichu:'百出', - clanbaichu_info:'锁定技,当你使用一张牌结算完毕后,若你:未记录过此牌的花色和类型组合,则你记录此组合并记录一个普通锦囊牌名,否则你于本轮获得技能〖奇策〗;已记录此牌牌名,你回复1点体力或摸一张牌。', - clan_wuqiao:'族吴乔', - clanqiajue:'跒倔', - clanqiajue_info:'摸牌阶段开始时,你可以弃置一张黑色牌。若如此做,此阶段结束时,你展示手牌,若这些牌的点数和大于30,你的手牌上限-2,否则你执行一个额外的摸牌阶段。', - clan_wangguang:'族王广', - clan_wangguang_prefix:'族', - clanlilun:'离论', - clanlilun_info:'出牌阶段限一次,你可以重铸两张手牌(不能是你本回合以此法重铸过的牌名的牌),然后使用其中的一张牌。', - clanjianji:'见机', - clanjianji_info:'限定技,一名角色的结束阶段,若其上下家均未于本回合:使用过牌,则你可以与其各摸一张牌;成为过牌的目标,则你可以视为使用一张【杀】。', - clan_wangmingshan:'族王明山', - clan_wangmingshan_prefix:'族', - clantanque:'弹雀', - clantanque_info:'每回合限一次。当你使用牌结算结束后,你可以对一名体力值为X且不为0的角色造成1点伤害(X为此牌点数与你上一张使用的牌的点数之差)。', - clanshengmo:'剩墨', - clanshengmo_info:'当你需要使用一张未以此法使用过的基本牌时,你可以获得一张于本回合进入弃牌堆且点数不为这些牌中最大且不为这些牌中最小的牌,视为你使用需要使用的牌。', + clan_wuxian: "族吴苋", + clanyirong: "移荣", + clanyirong_info: + "出牌阶段限两次。若你的手牌数:小于X,则你可以将手牌摸至X张(至多摸八张),然后X-1;大于X,则你可以将手牌弃置至X张,然后X+1。(X为你的手牌上限)", + clanguixiang: "贵相", + clanguixiang_info: + "锁定技。你的非出牌阶段开始前,若此阶段即将成为你本回合内的第X个阶段(X为你的手牌上限),则你终止此阶段,改为进行一个出牌阶段。", + clanmuyin: "穆荫", + clanmuyin_info: + "宗族技。回合开始时,你可以选择一名手牌上限不为全场最多的陈留吴氏角色。该角色的手牌上限+1。", + chenliuwushi: "陈留·吴氏", + clan_wuban: "族吴班", + clanzhanding: "斩钉", + clanzhanding_info: + "你可以将任意张牌当做【杀】使用并你令你的手牌上限-1。你以此法使用的【杀】结算结束后,若你因此【杀】造成过伤害,则你将手牌摸至手牌上限(至多摸五张),否则你令此【杀】不计入次数限制。", + clan_xunshu: "族荀淑", + clanshenjun: "神君", + clanshenjun_info: + "当一名角色使用【杀】或普通锦囊牌时,若你手牌中有该牌名的牌,你展示之,且这些牌称为“神君”。然后本阶段结束时,你可以将等同于你“神君”数张牌当做一张“神君”牌使用。", + clanbalong: "八龙", + clanbalong_info: + "锁定技。当你于一回合内首次{回复体力后或受到伤害后或失去体力后},若你手牌中唯一最多的类别为锦囊牌,你展示所有手牌并摸至角色数张。", + clandaojie: "蹈节", + clandaojie_info: + "宗族技,锁定技。当你每回合第一次使用非伤害类普通锦囊牌后,你须失去一个锁定技或失去1点体力,令一名颍川荀氏角色获得此牌对应的所有实体牌。", + clan_xuncai: "族荀采", + clanlieshi: "烈誓", + clanlieshi_info: + "出牌阶段,你可以选择一项:1.废除判定区并受到你造成的1点火焰伤害;2.弃置所有【闪】;3.弃置所有【杀】。然后令一名其他角色从你未选择的选项中选择一项。", + clandianzhan: "点盏", + clandianzhan_info: + "锁定技。当你每轮第一次使用一种花色的牌后:若此牌的目标数为1且目标未横置,你横置此牌目标;若你有此花色的手牌,你重铸这些牌。均执行后你摸一张牌。", + clanhuanyin: "还阴", + clanhuanyin_info: "锁定技。当你进入濒死状态时,将手牌补至四张。", + clan_xunchen: "族荀谌", + clansankuang: "三恇", + clansankuang_info: + "锁定技。当你每轮第一次使用一种类别的牌后,你令一名其他角色交给你至少X张牌,然后于装备区或处理区内获得你使用的牌对应的所有实体牌(X为以下条件中其满足的项数:场上有牌、已受伤、体力值小于手牌数)。", + clanbeishi: "卑势", + clanbeishi_info: + "锁定技。当一名角色失去最后的手牌后,若其是你首次发动〖三恇〗的目标角色,你回复1点体力。", + clan_xuncan: "族荀粲", + clanyunshen: "熨身", + clanyunshen_info: + "出牌阶段限一次。你可以令一名其他角色回复1点体力,然后选择一项:1.你视为对其使用一张冰【杀】;2.其视为对你使用一张冰【杀】。", + clanshangshen: "伤神", + clanshangshen_info: + "当一名角色受到属性伤害后,若本回合此前没有角色或已死亡的角色受到过属性伤害,你可以执行目标角色为你的【闪电】效果,然后其将手牌摸至四张。", + clanfenchai: "分钗", + clanfenchai_info: + "锁定技。若你首次发动技能指定的异性目标角色中:存在存活角色,你的判定牌视为♥;不存在存活角色,你的判定牌视为♠。", + clan_hanshao: "族韩韶", + clanfangzhen: "放赈", + clanfangzhen_info: + "出牌阶段开始时,你可以横置一名角色并选择一项:1.摸两张牌,然后交给其两张牌;2.令其回复1点体力。然后第X轮游戏开始时,你失去〖放赈〗(X为其座位号)。", + clanliuju: "留驹", + clanliuju_info: + "出牌阶段结束时,你可以与一名角色A拼点,输的角色可以使用任意张拼点牌中的非基本牌。然后若你至A的距离或A至你的距离发生了变化,你重置〖恤民〗。", + clanxumin: "恤民", + clanxumin_info: + "宗族技,限定技。你可以将一张牌当做【五谷丰登】对任意名其他角色使用。", + clan_hanrong: "族韩融", + clanlianhe: "连和", + clanlianhe_info: + "出牌阶段开始时,你可以横置两名角色。这些角色于自己的下个出牌阶段结束时,若其此阶段未摸牌,其令你摸X+1张牌或交给你X-1张牌(X为其此阶段获得的牌数且至多为3)。", + clanhuanjia: "缓颊", + clanhuanjia_info: + "出牌阶段结束时,你可以与一名角色拼点。赢的角色可以使用一张拼点牌。然后若此牌:未造成过伤害,你获得另一张拼点牌;造成过伤害,你失去一个技能。", + clan_wukuang: "族吴匡", + clanlianzhu: "联诛", + clanlianzhu_info: + "转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色相同,则你的手牌上限+1;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色不同,则你的手牌上限-1。", + clan_wangling: "族王淩", + clanbolong: "驳龙", + clanbolong_info: + "出牌阶段限一次。你可以令一名其他角色选择一项:1.你交给其一张牌,然后视为对其使用一张雷【杀】;2.交给你等同于你手牌数的牌,然后视为对你使用一张【酒】。", + clanzhongliu: "中流", + clanzhongliu_info: + "宗族技,锁定技。当你使用牌时,若此牌对应的实体牌均不为太原王氏角色的手牌,你重置武将牌上的技能。", + clan_zhongyan: "族钟琰", + clanguangu: "观骨", + clanguangu_info: + "转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。", + clanxiaoyong: "啸咏", + clanxiaoyong_info: + "锁定技。当你于回合内首次使用字数为X的牌时,你重置〖观骨〗(X为你上次发动〖观骨〗观看的牌数)。", + clanbaozu: "保族", + clanbaozu_info: + "宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。", + clan_wangyun: "族王允", + clanjiexuan: "解悬", + clanjiexuan_info: + "限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。", + clanmingjie: "铭戒", + clanmingjie_info: + "限定技。出牌阶段,你可以选择一名角色,然后你获得此下效果:①你使用牌时你可以指定其为额外目标直到其下个回合结束。②其下个回合结束时(若该角色为你则改为你的下下个回合结束时),你可以使用本回合使用过的黑桃牌和被抵消过的牌。", + clan_wanghun: "族王浑", + clanfuxun: "抚循", + clanfuxun_info: + "出牌阶段限一次。你可以获得或交给一名其他角色一张手牌,然后若其手牌数与你相等且于此阶段仅以此法获得或失去过牌,你可以将一张牌当任意基本牌使用。", + clanchenya: "沉雅", + clanchenya_info: + "当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其手牌数)。", + clan_zhonghui: "族钟会", + clanyuzhi: "迂志", + clanyuzhi_info: + "锁定技。新的一轮开始时,你依次执行以下项:①你弃置上一轮因〖迂志〗展示的手牌,然后若你上一轮使用的牌数或你上上轮因〖迂志〗摸的牌数小于你上轮因〖迂志〗摸的牌数,你受到1点雷属性伤害或失去〖保族〗。②你展示一张手牌,然后摸X张牌(X为此牌牌名字数)。", + clanxieshu: "挟术", + clanxieshu_info: + "①当你因牌造成或受到伤害后,你可以横置武将牌并弃置Y张牌,然后摸你已损失体力值张牌(Y为此牌牌名字数)。②一名角色的濒死状态结算完毕后,你令〖挟术〗于本回合失效。", + clan_zhongyu: "族钟毓", + clanjiejian: "捷谏", + clanjiejian_info: + "当你于一回合使用第X张牌指定第一个目标后,若此牌不为装备牌,则你可以令一名目标角色摸X张牌。(X为此牌牌名字数)", + clanhuanghan: "惶汗", + clanhuanghan_info: + "当你受到牌造成的伤害后,你可以摸X张牌并弃置Y张牌(X为此牌牌名字数,Y为你已损失的体力值),然后若此次技能发动不为你本回合首次发动此技能,你重置技能〖保族〗。", + clan_wanglun: "族王沦", + clanqiuxin: "求心", + clanqiuxin_info: + "出牌阶段限一次,你可以令一名其他角色选择一项:①你对其使用【杀】;②你对其使用任意普通锦囊牌。当你执行其选择的选项后,你视为执行另一项。", + clanjianyuan: "简远", + clanjianyuan_info: + "当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其本阶段的使用牌数)。", + clan_xunyou: "族荀攸", + clanbaichu: "百出", + clanbaichu_info: + "锁定技,当你使用一张牌结算完毕后,若你:未记录过此牌的花色和类型组合,则你记录此组合并记录一个普通锦囊牌名,否则你于本轮获得技能〖奇策〗;已记录此牌牌名,你回复1点体力或摸一张牌。", + clan_wuqiao: "族吴乔", + clanqiajue: "跒倔", + clanqiajue_info: + "摸牌阶段开始时,你可以弃置一张黑色牌。若如此做,此阶段结束时,你展示手牌,若这些牌的点数和大于30,你的手牌上限-2,否则你执行一个额外的摸牌阶段。", + clan_wangguang: "族王广", + clan_wangguang_prefix: "族", + clanlilun: "离论", + clanlilun_info: + "出牌阶段限一次,你可以重铸两张手牌(不能是你本回合以此法重铸过的牌名的牌),然后使用其中的一张牌。", + clanjianji: "见机", + clanjianji_info: + "限定技,一名角色的结束阶段,若其上下家均未于本回合:使用过牌,则你可以与其各摸一张牌;成为过牌的目标,则你可以视为使用一张【杀】。", + clan_wangmingshan: "族王明山", + clan_wangmingshan_prefix: "族", + clantanque: "弹雀", + clantanque_info: + "每回合限一次。当你使用牌结算结束后,你可以对一名体力值为X且不为0的角色造成1点伤害(X为此牌点数与你上一张使用的牌的点数之差)。", + clanshengmo: "剩墨", + clanshengmo_info: + "当你需要使用一张未以此法使用过的基本牌时,你可以获得一张于本回合进入弃牌堆且点数不为这些牌中最大且不为这些牌中最小的牌,视为你使用需要使用的牌。", - clan_wu:'陈留·吴氏', - clan_xun:'颍川·荀氏', - clan_han:'颍川·韩氏', - clan_wang:'太原·王氏', - clan_zhong:'颍川·钟氏', + clan_wu: "陈留·吴氏", + clan_xun: "颍川·荀氏", + clan_han: "颍川·韩氏", + clan_wang: "太原·王氏", + clan_zhong: "颍川·钟氏", }, }; }); diff --git a/character/collab.js b/character/collab.js index 4284aa35b..a59fe0e17 100644 --- a/character/collab.js +++ b/character/collab.js @@ -1,788 +1,1333 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'collab', - connect:true, - character:{ - dc_zhaoyun:['male','shen',1,['boss_juejing','dclonghun','dczhanjiang'],['shu','InitFilter:noZhuHp:noZhuSkill']], - dc_sunce:['male','wu',4,['dcshuangbi']], - nezha:['male','qun',3,['dcsantou','dcfaqi'],['InitFilter:noZhuHp']], - dc_caocao:['male','wei',4,['dcjianxiong']], - dc_liubei:['male','shu',4,['dcrende']], - dc_sunquan:['male','wu',4,['dczhiheng']], - zhutiexiong:['male','qun',3,['dcbianzhuang']], - wu_zhutiexiong:['male','qun',3,['dcbianzhuang'],['unseen']], - xiaoyuehankehan:['male','qun',3,['dctongliao','dcwudao']], - libai:['male','qun',3,['dclbjiuxian','dcshixian']], - sunwukong:['male','qun',3,['dcjinjing','dccibei','dcruyi']], - longwang:['male','qun',3,['dclonggong','dcsitian']], - taoshen:['male','qun',3,['dcnutao']], - sunyang:['male','wu',4,['clbshuijian']], - yeshiwen:['female','wu',3,['clbjisu','clbshuiyong']], - sp_jiben:['male','qun',3,['spduanzhi','spduyi']], - sp_fuhuanghou:['female','qun',3,['spcangni','spmixin']], - sp_fuwan:['male','qun',3,['spfengyin','spchizhong']], - old_lingju:['female','qun',3,['jieyuan','fenxin_old']], - sp_mushun:['male','qun',4,['moukui']], + name: "collab", + connect: true, + character: { + dc_zhaoyun: [ + "male", + "shen", + 1, + ["boss_juejing", "dclonghun", "dczhanjiang"], + ["shu", "InitFilter:noZhuHp:noZhuSkill"], + ], + dc_sunce: ["male", "wu", 4, ["dcshuangbi"]], + nezha: [ + "male", + "qun", + 3, + ["dcsantou", "dcfaqi"], + ["InitFilter:noZhuHp"], + ], + dc_caocao: ["male", "wei", 4, ["dcjianxiong"]], + dc_liubei: ["male", "shu", 4, ["dcrende"]], + dc_sunquan: ["male", "wu", 4, ["dczhiheng"]], + zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"]], + wu_zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"], ["unseen"]], + xiaoyuehankehan: ["male", "qun", 3, ["dctongliao", "dcwudao"]], + libai: ["male", "qun", 3, ["dclbjiuxian", "dcshixian"]], + sunwukong: ["male", "qun", 3, ["dcjinjing", "dccibei", "dcruyi"]], + longwang: ["male", "qun", 3, ["dclonggong", "dcsitian"]], + taoshen: ["male", "qun", 3, ["dcnutao"]], + sunyang: ["male", "wu", 4, ["clbshuijian"]], + yeshiwen: ["female", "wu", 3, ["clbjisu", "clbshuiyong"]], + sp_jiben: ["male", "qun", 3, ["spduanzhi", "spduyi"]], + sp_fuhuanghou: ["female", "qun", 3, ["spcangni", "spmixin"]], + sp_fuwan: ["male", "qun", 3, ["spfengyin", "spchizhong"]], + old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"]], + sp_mushun: ["male", "qun", 4, ["moukui"]], }, - characterFilter:{ - old_lingju(mode){ - return mode=='identity'; - } - }, - characterInitFilter:{ - dc_zhaoyun(tag){ - if(tag=='noZhuSkill'&&(get.mode()!='doudizhu'||_status.mode!='normal')) return false; + characterFilter: { + old_lingju(mode) { + return mode == "identity"; }, }, - characterSort:{ - collab:{ - collab_olympic:['sunyang','yeshiwen'], - collab_tongque:["sp_fuwan","sp_fuhuanghou","sp_jiben","old_lingju",'sp_mushun'], - collab_duanwu:['sunwukong','longwang','taoshen'], - collab_decade:['libai','xiaoyuehankehan','zhutiexiong','wu_zhutiexiong'], - collab_remake:['dc_caocao','dc_liubei','dc_sunquan','nezha','dc_sunce','dc_zhaoyun'], + characterInitFilter: { + dc_zhaoyun(tag) { + if ( + tag == "noZhuSkill" && + (get.mode() != "doudizhu" || _status.mode != "normal") + ) + return false; + }, + }, + characterSort: { + collab: { + collab_olympic: ["sunyang", "yeshiwen"], + collab_tongque: [ + "sp_fuwan", + "sp_fuhuanghou", + "sp_jiben", + "old_lingju", + "sp_mushun", + ], + collab_duanwu: ["sunwukong", "longwang", "taoshen"], + collab_decade: [ + "libai", + "xiaoyuehankehan", + "zhutiexiong", + "wu_zhutiexiong", + ], + collab_remake: [ + "dc_caocao", + "dc_liubei", + "dc_sunquan", + "nezha", + "dc_sunce", + "dc_zhaoyun", + ], }, }, /** @type { importCharacterConfig['skill'] } */ - skill:{ + skill: { //新InitFilter测试高达一号 //打赢复活赛的牢达[哭] - dclonghun:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - prompt:'将♦牌当做火【杀】,♥牌当做【桃】,♣牌当做【闪】,♠牌当做【无懈可击】使用或打出', - viewAs(cards,player){ + dclonghun: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + prompt: "将♦牌当做火【杀】,♥牌当做【桃】,♣牌当做【闪】,♠牌当做【无懈可击】使用或打出", + viewAs(cards, player) { var name; - var nature=null; - switch(get.suit(cards[0],player)){ - case 'club':name='shan';break; - case 'diamond':name='sha';nature='fire';break; - case 'spade':name='wuxie';break; - case 'heart':name='tao';break; + var nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; } - if(name) return {name:name,nature:nature}; + if (name) return { name: name, nature: nature }; return null; }, - check(card){ - var player=_status.event.player; - if(_status.event.type=='phase'){ - var max=0; + check(card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; var name2; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max){ - max=temp; - name2=map[name]; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || + get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) { + max = temp; + name2 = map[name]; } } } - if(name2==get.suit(card,player)) return (name2=='diamond'?(5-get.value(card)):20-get.value(card)); + if (name2 == get.suit(card, player)) + return name2 == "diamond" + ? 5 - get.value(card) + : 20 - get.value(card); return 0; } return 1; }, - position:'hes', - filterCard(card,player,event){ - event=event||_status.event; - var filter=event._backup.filterCard; - var name=get.suit(card,player); - if(name=='club'&&filter({name:'shan',cards:[card]},player,event)) return true; - if(name=='diamond'&&filter({name:'sha',cards:[card],nature:'fire'},player,event)) return true; - if(name=='spade'&&filter({name:'wuxie',cards:[card]},player,event)) return true; - if(name=='heart'&&filter({name:'tao',cards:[card]},player,event)) return true; + position: "hes", + filterCard(card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if ( + name == "club" && + filter({ name: "shan", cards: [card] }, player, event) + ) + return true; + if ( + name == "diamond" && + filter( + { name: "sha", cards: [card], nature: "fire" }, + player, + event + ) + ) + return true; + if ( + name == "spade" && + filter({ name: "wuxie", cards: [card] }, player, event) + ) + return true; + if ( + name == "heart" && + filter({ name: "tao", cards: [card] }, player, event) + ) + return true; return false; }, - filter(event,player){ - var filter=event.filterCard; - if(filter(get.autoViewAs({name:'sha',nature:'fire'},'unsure'),player,event)&&player.countCards('hes',{suit:'diamond'})) return true; - if(filter(get.autoViewAs({name:'shan'},'unsure'),player,event)&&player.countCards('hes',{suit:'club'})) return true; - if(filter(get.autoViewAs({name:'tao'},'unsure'),player,event)&&player.countCards('hes',{suit:'heart'})) return true; - if(filter(get.autoViewAs({name:'wuxie'},'unsure'),player,event)&&player.countCards('hes',{suit:'spade'})) return true; + filter(event, player) { + var filter = event.filterCard; + if ( + filter( + get.autoViewAs( + { name: "sha", nature: "fire" }, + "unsure" + ), + player, + event + ) && + player.countCards("hes", { suit: "diamond" }) + ) + return true; + if ( + filter( + get.autoViewAs({ name: "shan" }, "unsure"), + player, + event + ) && + player.countCards("hes", { suit: "club" }) + ) + return true; + if ( + filter( + get.autoViewAs({ name: "tao" }, "unsure"), + player, + event + ) && + player.countCards("hes", { suit: "heart" }) + ) + return true; + if ( + filter( + get.autoViewAs({ name: "wuxie" }, "unsure"), + player, + event + ) && + player.countCards("hes", { suit: "spade" }) + ) + return true; return false; }, - usable:20, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player,tag){ - if((player.getStat('skill').dclonghun||0)>=20) return false; + usable: 20, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + if ((player.getStat("skill").dclonghun || 0) >= 20) + return false; var name; - switch(tag){ - case 'respondSha':name='diamond';break; - case 'respondShan':name='club';break; - case 'save':name='heart';break; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; } - if(!player.countCards('hes',{suit:name})) return false; + if (!player.countCards("hes", { suit: name })) + return false; }, - order(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max) max=temp; + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || + get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; } } - max/=1.1; + max /= 1.1; return max; } return 2; }, }, - hiddenCard(player,name){ - if((player.getStat('skill').dclonghun||0)>=20) return false; - if(name=='wuxie'&&_status.connectMode&&player.countCards('hes')>0) return true; - if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>0; - if(name=='tao') return player.countCards('hes',{suit:'heart'})>0; + hiddenCard(player, name) { + if ((player.getStat("skill").dclonghun || 0) >= 20) + return false; + if ( + name == "wuxie" && + _status.connectMode && + player.countCards("hes") > 0 + ) + return true; + if (name == "wuxie") + return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") + return player.countCards("hes", { suit: "heart" }) > 0; }, }, - dczhanjiang:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - return game.hasPlayer(target=>{ - return target.countCards('ej',card=>get.name(card,false)=='qinggang'||get.name(card,get.owner(card))=='qinggang'); + dczhanjiang: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return game.hasPlayer((target) => { + return target.countCards( + "ej", + (card) => + get.name(card, false) == "qinggang" || + get.name(card, get.owner(card)) == "qinggang" + ); }); }, - content(){ - let cards=[],targets=game.filterPlayer(target=>{ - return target.countCards('ej',card=>get.name(card,false)=='qinggang'||get.name(card,get.owner(card))=='qinggang'); - }); - targets.forEach(target=>cards.addArray(target.getCards('ej',card=>get.name(card,false)=='qinggang'||get.name(card,get.owner(card))=='qinggang'))); - player.gain(cards,'give'); + content() { + let cards = [], + targets = game.filterPlayer((target) => { + return target.countCards( + "ej", + (card) => + get.name(card, false) == "qinggang" || + get.name(card, get.owner(card)) == + "qinggang" + ); + }); + targets.forEach((target) => + cards.addArray( + target.getCards( + "ej", + (card) => + get.name(card, false) == "qinggang" || + get.name(card, get.owner(card)) == + "qinggang" + ) + ) + ); + player.gain(cards, "give"); }, }, //孙策 //双壁=100%技能周瑜+100%原画孙策 - dcshuangbi:{ - audio:2, - enable:'phaseUse', - usable:1, - *content(event,map){ - var player=map.player,num=game.countPlayer(); - var result=yield player.chooseControl().set('choiceList',[ - '摸'+get.cnNumber(num)+'张牌,本回合手牌上限+'+parseFloat(num), - '弃置至多'+get.cnNumber(num)+'张牌,随机对其他角色造成等量火焰伤害', - '视为使用'+get.cnNumber(num)+'张火【杀】或【火攻】', - ]).set('ai',()=>{ - var player=_status.event.player,card={name:'sha',nature:'fire'}; - if(!game.hasPlayer(target=>player.canUse(card,target)&&get.effect(target,card,player,player)>0)) return 0; - return 2; - }); - player.flashAvatar('dcshuangbi',['re_zhouyu','shen_zhouyu','dc_sb_zhouyu'][result.index]); - switch(result.index){ + dcshuangbi: { + audio: 2, + enable: "phaseUse", + usable: 1, + *content(event, map) { + var player = map.player, + num = game.countPlayer(); + var result = yield player + .chooseControl() + .set("choiceList", [ + "摸" + + get.cnNumber(num) + + "张牌,本回合手牌上限+" + + parseFloat(num), + "弃置至多" + + get.cnNumber(num) + + "张牌,随机对其他角色造成等量火焰伤害", + "视为使用" + + get.cnNumber(num) + + "张火【杀】或【火攻】", + ]) + .set("ai", () => { + var player = _status.event.player, + card = { name: "sha", nature: "fire" }; + if ( + !game.hasPlayer( + (target) => + player.canUse(card, target) && + get.effect( + target, + card, + player, + player + ) > 0 + ) + ) + return 0; + return 2; + }); + player.flashAvatar( + "dcshuangbi", + ["re_zhouyu", "shen_zhouyu", "dc_sb_zhouyu"][ + result.index + ] + ); + switch (result.index) { case 0: player.draw(num); - player.addTempSkill('dcshuangbi_effect'); - player.addMark('dcshuangbi_effect',num,false); + player.addTempSkill("dcshuangbi_effect"); + player.addMark("dcshuangbi_effect", num, false); break; case 1: - var result2=yield player.chooseToDiscard('双壁:弃置至多'+get.cnNumber(num)+'张牌,随机对其他角色造成等量火焰伤害',[1,num],'he').set('ai',card=>1/(get.value(card)||0.5)); - if(result2.bool){ - var map={},sum=result2.cards.length; - var targets=game.filterPlayer(target=>target!=player); - if(targets.length){ - while(sum){ + var result2 = yield player + .chooseToDiscard( + "双壁:弃置至多" + + get.cnNumber(num) + + "张牌,随机对其他角色造成等量火焰伤害", + [1, num], + "he" + ) + .set( + "ai", + (card) => 1 / (get.value(card) || 0.5) + ); + if (result2.bool) { + var map = {}, + sum = result2.cards.length; + var targets = game.filterPlayer( + (target) => target != player + ); + if (targets.length) { + while (sum) { sum--; - var target=targets.randomGet(); + var target = targets.randomGet(); player.line(target); - target.damage(1,'fire'); + target.damage(1, "fire"); game.delayx(); } } } break; case 2: - while(num&&game.hasPlayer(target=>player.canUse({name:'sha',nature:'fire'},target)||player.canUse({name:'huogong'},target))){ + while ( + num && + game.hasPlayer( + (target) => + player.canUse( + { name: "sha", nature: "fire" }, + target + ) || + player.canUse( + { name: "huogong" }, + target + ) + ) + ) { num--; - var list=[]; - if(game.hasPlayer(target=>player.canUse({name:'sha',nature:'fire'},target))) list.push(['基本','','sha','fire']); - if(game.hasPlayer(target=>player.canUse({name:'huogong'},target))) list.push(['锦囊','','huogong']); - var result2=yield player.chooseButton([ - '双壁:请选择你要使用的牌', - [list,'vcard']], - true).set('ai',button=>button.link[2]=='sha'?1:0); - if(result2.bool){ - var card={ - name:result2.links[0][2], - nature:result2.links[0][3], + var list = []; + if ( + game.hasPlayer((target) => + player.canUse( + { name: "sha", nature: "fire" }, + target + ) + ) + ) + list.push(["基本", "", "sha", "fire"]); + if ( + game.hasPlayer((target) => + player.canUse( + { name: "huogong" }, + target + ) + ) + ) + list.push(["锦囊", "", "huogong"]); + var result2 = yield player + .chooseButton( + [ + "双壁:请选择你要使用的牌", + [list, "vcard"], + ], + true + ) + .set("ai", (button) => + button.link[2] == "sha" ? 1 : 0 + ); + if (result2.bool) { + var card = { + name: result2.links[0][2], + nature: result2.links[0][3], }; - yield player.chooseUseTarget(true,card,false); - } - else break; + yield player.chooseUseTarget( + true, + card, + false + ); + } else break; } break; } }, - ai:{ - order:9, - result:{player:1}, + ai: { + order: 9, + result: { player: 1 }, }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - intro:{content:'手牌上限+#'}, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('dcshuangbi_effect'); + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { content: "手牌上限+#" }, + mod: { + maxHandcard(player, num) { + return ( + num + player.countMark("dcshuangbi_effect") + ); }, }, }, }, }, //哪吒 - dcsantou:{ - audio:2, - trigger:{player:'damageBegin4'}, - forced:true, - *content(event,map){ - var player=map.player,trigger=map.trigger; - var source=trigger.source; + dcsantou: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + *content(event, map) { + var player = map.player, + trigger = map.trigger; + var source = trigger.source; trigger.cancel(); - var hp=player.getHp(); - var lose=false; - if(hp>=3){ - if(player.hasHistory('useSkill',evt=>{ - var evtx=evt.event; - return evt.skill=='dcsantou'&&evtx.getTrigger().source==source&&evtx.getParent(2)!=trigger; - })) lose=true; + var hp = player.getHp(); + var lose = false; + if (hp >= 3) { + if ( + player.hasHistory("useSkill", (evt) => { + var evtx = evt.event; + return ( + evt.skill == "dcsantou" && + evtx.getTrigger().source == source && + evtx.getParent(2) != trigger + ); + }) + ) + lose = true; + } else if (hp == 2) { + if (trigger.hasNature()) lose = true; + } else if (hp == 1) { + if (trigger.card && get.color(trigger.card) == "red") + lose = true; } - else if(hp==2){ - if(trigger.hasNature()) lose=true; - } - else if(hp==1){ - if(trigger.card&&get.color(trigger.card)=='red') lose=true; - } - if(lose) player.loseHp(); + if (lose) player.loseHp(); }, - ai:{ - filterDamage:true, - skillTagFilter(player,tag,arg){ - if(arg&&arg.player&&arg.player.hasSkillTag('jueqing',false,player)) return false; + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + if ( + arg && + arg.player && + arg.player.hasSkillTag("jueqing", false, player) + ) + return false; }, - effect:{ - target(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(player._dcsantou_temp) return; - if(get.tag(card,'damage')){ - const hp=target.getHp(); - player._dcsantou_temp=true; - const losehp=get.effect(target,{name:'losehp'},target,target)/get.attitude(target,target); + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) + return; + if (player._dcsantou_temp) return; + if (get.tag(card, "damage")) { + const hp = target.getHp(); + player._dcsantou_temp = true; + const losehp = + get.effect( + target, + { name: "losehp" }, + target, + target + ) / get.attitude(target, target); delete player._dcsantou_temp; - if(hp>=3){ - if(target.hasHistory('useSkill',evt=>evt.skill=='dcsantou'&&evt.event.getTrigger().source==player)) return [0,losehp,0,0]; - else if(get.attitude(player,target)<0){ - let hs=player.getCards('hs',i=>{ - return i!==card&&(!card.cards||!card.cards.includes(i)); - }),num=player.getCardUsable('sha'); - if(card.name==='sha') num--; - hs=hs.filter(i=>{ - if(!player.canUse(i,target)) return false; - if(get.tag(card,'damage')&&get.name(i,player)!=='sha') return true; - if(num){ + if (hp >= 3) { + if ( + target.hasHistory( + "useSkill", + (evt) => + evt.skill == "dcsantou" && + evt.event.getTrigger().source == + player + ) + ) + return [0, losehp, 0, 0]; + else if (get.attitude(player, target) < 0) { + let hs = player.getCards("hs", (i) => { + return ( + i !== card && + (!card.cards || + !card.cards.includes(i)) + ); + }), + num = player.getCardUsable("sha"); + if (card.name === "sha") num--; + hs = hs.filter((i) => { + if (!player.canUse(i, target)) + return false; + if ( + get.tag(card, "damage") && + get.name(i, player) !== "sha" + ) + return true; + if (num) { num--; return true; } return false; }).length; - if(player.hasSkillTag('damage',null,{target:target})) hs++; - if(!hs) return 'zeroplayertarget'; - num=1-2/3/hs; - return [num,0,num,0]; + if ( + player.hasSkillTag("damage", null, { + target: target, + }) + ) + hs++; + if (!hs) return "zeroplayertarget"; + num = 1 - 2 / 3 / hs; + return [num, 0, num, 0]; } } - if(hp==2&&get.tag(card,'natureDamage')||hp==1&&typeof card=='object'&&get.color(card)=='red') return [0,losehp,0,0]; - return 'zeroplayertarget'; + if ( + (hp == 2 && + get.tag(card, "natureDamage")) || + (hp == 1 && + typeof card == "object" && + get.color(card) == "red") + ) + return [0, losehp, 0, 0]; + return "zeroplayertarget"; } - } - } + }, + }, }, }, - dcfaqi:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter(event,player){ - if(get.type(event.card)!='equip') return false; - if(!player.isPhaseUsing()) return false; - for(const name of lib.inpile){ - if(get.type(name)!='trick') continue; - if(!player.hasStorage('dcfaqi',name)&&player.hasUseTarget({name:name,isCard:true})) return true; + dcfaqi: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (get.type(event.card) != "equip") return false; + if (!player.isPhaseUsing()) return false; + for (const name of lib.inpile) { + if (get.type(name) != "trick") continue; + if ( + !player.hasStorage("dcfaqi", name) && + player.hasUseTarget({ name: name, isCard: true }) + ) + return true; } return false; }, - direct:true, - *content(event,map){ - var player=map.player; - var list=get.inpileVCardList(info=>{ - if(info[0]!='trick') return false; - var name=info[2]; - return !player.hasStorage('dcfaqi',name)&&player.hasUseTarget({name:name,isCard:true}); + direct: true, + *content(event, map) { + var player = map.player; + var list = get.inpileVCardList((info) => { + if (info[0] != "trick") return false; + var name = info[2]; + return ( + !player.hasStorage("dcfaqi", name) && + player.hasUseTarget({ name: name, isCard: true }) + ); }); - if(list.length){ - var result=yield player.chooseButton(['法器:视为使用一张普通锦囊牌',[list,'vcard']],true).set('ai',button=>{ - return get.player().getUseValue({name:button.link[2]}); - }); - if(result.bool){ - var name=result.links[0][2]; - if(!player.storage.dcfaqi) player.when({global:'phaseAfter'}).then(()=>delete player.storage.dcfaqi); - player.markAuto('dcfaqi',name); - player.chooseUseTarget({name:name,isCard:true},true,false).logSkill='dcfaqi'; + if (list.length) { + var result = yield player + .chooseButton( + [ + "法器:视为使用一张普通锦囊牌", + [list, "vcard"], + ], + true + ) + .set("ai", (button) => { + return get + .player() + .getUseValue({ name: button.link[2] }); + }); + if (result.bool) { + var name = result.links[0][2]; + if (!player.storage.dcfaqi) + player + .when({ global: "phaseAfter" }) + .then(() => delete player.storage.dcfaqi); + player.markAuto("dcfaqi", name); + player.chooseUseTarget( + { name: name, isCard: true }, + true, + false + ).logSkill = "dcfaqi"; } - } - else event.finish(); + } else event.finish(); + }, + ai: { + reverseEquip: true, }, - ai:{ - reverseEquip:true - } }, //隅泣曹操 - dcjianxiong:{ - audio:'rejianxiong', - trigger:{ - player:'damageEnd', + dcjianxiong: { + audio: "rejianxiong", + trigger: { + player: "damageEnd", }, - content(){ - 'step 0' - if(get.itemtype(trigger.cards)=='cards'&&get.position(trigger.cards[0],true)=='o'){ - player.gain(trigger.cards,'gain2'); + content() { + "step 0"; + if ( + get.itemtype(trigger.cards) == "cards" && + get.position(trigger.cards[0], true) == "o" + ) { + player.gain(trigger.cards, "gain2"); } - player.draw(player.countMark('dcjianxiong')+1,'nodelay'); - 'step 1' - if(player.countMark('dcjianxiong')<4) player.addMark('dcjianxiong',1,false); + player.draw(player.countMark("dcjianxiong") + 1, "nodelay"); + ("step 1"); + if (player.countMark("dcjianxiong") < 4) + player.addMark("dcjianxiong", 1, false); }, - marktext:'雄', - intro:{ - markcount(storage,player){ - return player.countMark('dcjianxiong')+1; + marktext: "雄", + intro: { + markcount(storage, player) { + return player.countMark("dcjianxiong") + 1; }, - content(storage,player){ - return '摸牌数为'+(player.countMark('dcjianxiong')+1); + content(storage, player) { + return ( + "摸牌数为" + (player.countMark("dcjianxiong") + 1) + ); }, }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target (card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')&&player!=target){ - var cards=card.cards,evt=_status.event; - if(evt.player==target&&card.name=='damage'&&evt.getParent().type=='card') cards=evt.getParent().cards.filterInD(); - if(target.hp<=1) return; - if(get.itemtype(cards)!='cards') return; - for(var i of cards){ - if(get.name(i,target)=='tao') return [1,5+player.countMark('dcjianxiong')/2]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) + return [1, -1]; + if (get.tag(card, "damage") && player != target) { + var cards = card.cards, + evt = _status.event; + if ( + evt.player == target && + card.name == "damage" && + evt.getParent().type == "card" + ) + cards = evt.getParent().cards.filterInD(); + if (target.hp <= 1) return; + if (get.itemtype(cards) != "cards") return; + for (var i of cards) { + if (get.name(i, target) == "tao") + return [ + 1, + 5 + + player.countMark( + "dcjianxiong" + ) / + 2, + ]; } - if(get.value(cards,target)>=(7-player.countMark('dcjianxiong')/2+target.getDamagedHp())) return [1,3+player.countMark('dcjianxiong')/2]; - return [1,0.6+player.countMark('dcjianxiong')/2]; + if ( + get.value(cards, target) >= + 7 - + player.countMark("dcjianxiong") / 2 + + target.getDamagedHp() + ) + return [ + 1, + 3 + player.countMark("dcjianxiong") / 2, + ]; + return [ + 1, + 0.6 + player.countMark("dcjianxiong") / 2, + ]; } }, }, }, }, //缺德刘备 - dcrende:{ - audio:'rerende', - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(current=>{ - return lib.skill.dcrende.filterTarget(null,player,current); + dcrende: { + audio: "rerende", + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer((current) => { + return lib.skill.dcrende.filterTarget( + null, + player, + current + ); }); }, - discard:false, - lose:false, - delay:false, - filterTarget(card,player,target){ - if(player.getStorage('dcrende_targeted').includes(target)) return false; - return player!=target&&target.countGainableCards(player,'h')>1; + discard: false, + lose: false, + delay: false, + filterTarget(card, player, target) { + if (player.getStorage("dcrende_targeted").includes(target)) + return false; + return ( + player != target && + target.countGainableCards(player, "h") > 1 + ); }, - content(){ - 'step 0' - player.addTempSkill('dcrende_targeted','phaseUseAfter'); - player.markAuto('dcrende_targeted',[target]); - player.gainPlayerCard(target,'h',true,2); - 'step 1' - var list=[]; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - var card={name:name,isCard:true}; - if(lib.filter.cardUsable(card,player,event.getParent('chooseToUse'))&&game.hasPlayer(current=>{ - return player.canUse(card,current); - })){ - list.push(['基本','',name]); + content() { + "step 0"; + player.addTempSkill("dcrende_targeted", "phaseUseAfter"); + player.markAuto("dcrende_targeted", [target]); + player.gainPlayerCard(target, "h", true, 2); + ("step 1"); + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if ( + lib.filter.cardUsable( + card, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer((current) => { + return player.canUse(card, current); + }) + ) { + list.push(["基本", "", name]); } - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(lib.filter.cardUsable(card,player,event.getParent('chooseToUse'))&&game.hasPlayer(current=>{ - return player.canUse(card,current); - })){ - list.push(['基本','',name,nature]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if ( + lib.filter.cardUsable( + card, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer((current) => { + return player.canUse(card, current); + }) + ) { + list.push(["基本", "", name, nature]); } } } } - if(list.length){ - player.chooseButton(['是否视为使用一张基本牌?',[list,'vcard']]).set('ai',function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3],isCard:true}; - if(card.name=='tao'){ - if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()) return 5; - return 1; - } - if(card.name=='sha'){ - if(game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0 - })){ - if(card.nature=='fire') return 2.95; - if(card.nature=='thunder'||card.nature=='ice') return 2.92; - return 2.9; + if (list.length) { + player + .chooseButton([ + "是否视为使用一张基本牌?", + [list, "vcard"], + ]) + .set("ai", function (button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }; + if (card.name == "tao") { + if ( + player.hp == 1 || + (player.hp == 2 && !player.hasShan()) || + player.needsToDiscard() + ) + return 5; + return 1; + } + if (card.name == "sha") { + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect( + current, + card, + player, + player + ) > 0 + ); + }) + ) { + if (card.nature == "fire") return 2.95; + if ( + card.nature == "thunder" || + card.nature == "ice" + ) + return 2.92; + return 2.9; + } + return 0; + } + if (card.name == "jiu") { + return 0.5; } return 0; - } - if(card.name=='jiu'){ - return 0.5; - } - return 0; - }); - } - else{ + }); + } else { event.finish(); } - 'step 2' - if(result&&result.bool&&result.links[0]){ - var card={name:result.links[0][2],nature:result.links[0][3],isCard:true}; - player.chooseUseTarget(card,true); + ("step 2"); + if (result && result.bool && result.links[0]) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }; + player.chooseUseTarget(card, true); } }, - subSkill:{ - targeted:{ - onremove:true, - charlotte:true, + subSkill: { + targeted: { + onremove: true, + charlotte: true, }, }, - ai:{ - fireAttack:true, - order(skill,player){ + ai: { + fireAttack: true, + order(skill, player) { return 10; }, - result:{ - target(player,target){ - if(target.hasSkillTag('noh')) return -0.1; + result: { + target(player, target) { + if (target.hasSkillTag("noh")) return -0.1; return -2; - } + }, }, - threaten:3, + threaten: 3, }, }, //会玩孙权 - dczhiheng:{ - audio:'rezhiheng', - init:(player)=>{ - player.storage.dczhiheng_hit=[]; + dczhiheng: { + audio: "rezhiheng", + init: (player) => { + player.storage.dczhiheng_hit = []; }, - enable:'phaseUse', - position:'he', - filterCard:lib.filter.cardDiscardable, - discard:false, - lose:false, - delay:false, - selectCard:[1,Infinity], - filter(event,player){ - var skill=player.getStat().skill; - return !skill.dczhiheng||skill.dczhiheng<1+player.getStorage('dczhiheng_hit').length; + enable: "phaseUse", + position: "he", + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + filter(event, player) { + var skill = player.getStat().skill; + return ( + !skill.dczhiheng || + skill.dczhiheng < + 1 + player.getStorage("dczhiheng_hit").length + ); }, - check(card){ - var player=_status.event.player; - if(get.position(card)=='h'&&!player.countCards('h','du')&&(player.hp>2||!player.countCards('h',function(card){ - return get.value(card)>=8; - }))){ + check(card) { + var player = _status.event.player; + if ( + get.position(card) == "h" && + !player.countCards("h", "du") && + (player.hp > 2 || + !player.countCards("h", function (card) { + return get.value(card) >= 8; + })) + ) { return 1; } - return 6-get.value(card) + return 6 - get.value(card); }, - group:'dczhiheng_add', - content(){ - 'step 0' + group: "dczhiheng_add", + content() { + "step 0"; player.discard(cards); - event.num=1; - var hs=player.getCards('h'); - if(!hs.length) event.num=0; - for(var i=0;i{ - player.storage.dczhiheng_hit=[]; - }, - mark:true, - marktext:'衡', - intro:{ - markcount(storage){ - if(storage) return storage.length; - return 0; - }, - content:'本回合已对$造成过伤害', - }, - } - }, - ai:{ - order(item,player){ - if(player.hasCard((i)=>{ - return get.value(i)>Math.max(6,9-player.hp); - },'he')) return 1; - return 10; - }, - result:{ - player:1 - }, - nokeep:true, - skillTagFilter(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('dczhiheng')<1+player.getStorage('dczhiheng_hit').length&&player.hasCard((card)=>{ - return get.name(card)!=='tao'; - },'h'); - }, - threaten:1.55 - }, - }, - //朱铁雄 - dcbianzhuang:{ - audio:2, - enable:'phaseUse', - usable:1, - content(){ - 'step 0' - var list=[]; - for(var i in lib.skill.dcbianzhuang.characterMap){ - if(Array.isArray(lib.character[i])&&get.is.object(lib.skill[lib.skill.dcbianzhuang.characterMap[i]])) list.push(i); - } - var characters=list.randomGets(player.storage.dcbianzhuang_inited?3:2); - if(!characters.length){ - event.finish(); - return; - } - var skills=characters.map(i=>lib.skill.dcbianzhuang.characterMap[i]); - player.chooseControl(skills).set('dialog',[ - '选择获得一个技能并“变装”', - [characters,'character'] - ]); - 'step 1' - var skill=result.control; - player.addTempSkills(skill,'dcbianzhuangAfter'); - for(var i in lib.skill.dcbianzhuang.characterMap){ - if(lib.skill.dcbianzhuang.characterMap[i]==skill){ - player.flashAvatar('dcbianzhuang',i); - player.popup(skill); - game.log(player,'“变装”为了','#b'+get.translation(i)); + event.num = 1; + var hs = player.getCards("h"); + if (!hs.length) event.num = 0; + for (var i = 0; i < hs.length; i++) { + if (!cards.includes(hs[i])) { + event.num = 0; break; } } - player.chooseUseTarget('sha',true,false,'nodistance'); - 'step 2' - if(result.bool&&!player.storage.dcbianzhuang_inited){ - player.addMark('dcbianzhuang',1,false); - if(player.countMark('dcbianzhuang')>2){ - player.storage.dcbianzhuang_inited=true; - player.reinitCharacter('zhutiexiong','wu_zhutiexiong'); + ("step 1"); + player.draw(event.num + cards.length); + }, + subSkill: { + add: { + audio: 2, + trigger: { + source: "damageSource", + }, + forced: true, + locked: false, + filter(event, player) { + return !player + .getStorage("dczhiheng_hit") + .includes(event.player); + }, + content() { + player.addTempSkill("dczhiheng_hit"); + player.markAuto("dczhiheng_hit", [trigger.player]); + }, + }, + hit: { + charlotte: true, + onremove: (player) => { + player.storage.dczhiheng_hit = []; + }, + mark: true, + marktext: "衡", + intro: { + markcount(storage) { + if (storage) return storage.length; + return 0; + }, + content: "本回合已对$造成过伤害", + }, + }, + }, + ai: { + order(item, player) { + if ( + player.hasCard((i) => { + return ( + get.value(i) > Math.max(6, 9 - player.hp) + ); + }, "he") + ) + return 1; + return 10; + }, + result: { + player: 1, + }, + nokeep: true, + skillTagFilter(player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || + (arg && + arg.card && + get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + player.countSkill("dczhiheng") < + 1 + + player.getStorage("dczhiheng_hit") + .length && + player.hasCard((card) => { + return get.name(card) !== "tao"; + }, "h") + ); + }, + threaten: 1.55, + }, + }, + //朱铁雄 + dcbianzhuang: { + audio: 2, + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + var list = []; + for (var i in lib.skill.dcbianzhuang.characterMap) { + if ( + Array.isArray(lib.character[i]) && + get.is.object( + lib.skill[ + lib.skill.dcbianzhuang.characterMap[i] + ] + ) + ) + list.push(i); + } + var characters = list.randomGets( + player.storage.dcbianzhuang_inited ? 3 : 2 + ); + if (!characters.length) { + event.finish(); + return; + } + var skills = characters.map( + (i) => lib.skill.dcbianzhuang.characterMap[i] + ); + player + .chooseControl(skills) + .set("dialog", [ + "选择获得一个技能并“变装”", + [characters, "character"], + ]); + ("step 1"); + var skill = result.control; + player.addTempSkills(skill, "dcbianzhuangAfter"); + for (var i in lib.skill.dcbianzhuang.characterMap) { + if (lib.skill.dcbianzhuang.characterMap[i] == skill) { + player.flashAvatar("dcbianzhuang", i); + player.popup(skill); + game.log( + player, + "“变装”为了", + "#b" + get.translation(i) + ); + break; + } + } + player.chooseUseTarget("sha", true, false, "nodistance"); + ("step 2"); + if (result.bool && !player.storage.dcbianzhuang_inited) { + player.addMark("dcbianzhuang", 1, false); + if (player.countMark("dcbianzhuang") > 2) { + player.storage.dcbianzhuang_inited = true; + player.reinitCharacter( + "zhutiexiong", + "wu_zhutiexiong" + ); } } }, - group:'dcbianzhuang_refresh', - ai:{ - order:16, - result:{ - player(player){ - if(player.hasValueTarget('sha',false)) return 1; + group: "dcbianzhuang_refresh", + ai: { + order: 16, + result: { + player(player) { + if (player.hasValueTarget("sha", false)) return 1; return 0; }, }, - effect:{ - target(card,player,target,current){ - if(player==target&&player.isPhaseUsing()&&get.type(card)=='equip'){ - if(player.hasValueTarget('sha',false)&&typeof player.getStat('skill').dcbianzhuang=='number') return [1,3]; + effect: { + target(card, player, target, current) { + if ( + player == target && + player.isPhaseUsing() && + get.type(card) == "equip" + ) { + if ( + player.hasValueTarget("sha", false) && + typeof player.getStat("skill") + .dcbianzhuang == "number" + ) + return [1, 3]; } }, }, }, - subSkill:{ - refresh:{ - trigger:{player:'useCardAfter'}, - forced:true, - filter(event,player){ - return get.type2(event.card,false)=='equip'&&typeof player.getStat('skill').dcbianzhuang=='number'; + subSkill: { + refresh: { + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return ( + get.type2(event.card, false) == "equip" && + typeof player.getStat("skill").dcbianzhuang == + "number" + ); }, - content(){ - var stat=player.getStat('skill'); + content() { + var stat = player.getStat("skill"); delete stat.dcbianzhuang; }, }, }, - characterMap:{ - re_zhangchunhua:'rejueqing', - wangshuang:'spzhuilie', - re_machao:'retieji', - ol_weiyan:'xinkuanggu', - re_lvbu:'wushuang', - re_huangzhong:'xinliegong', - ol_pangde:'rejianchu', - ol_zhurong:'lieren', - re_masu:'rezhiman', - re_panzhangmazhong:'reanjian', - mayunlu:'fengpo', - re_quyi:'refuqi', + characterMap: { + re_zhangchunhua: "rejueqing", + wangshuang: "spzhuilie", + re_machao: "retieji", + ol_weiyan: "xinkuanggu", + re_lvbu: "wushuang", + re_huangzhong: "xinliegong", + ol_pangde: "rejianchu", + ol_zhurong: "lieren", + re_masu: "rezhiman", + re_panzhangmazhong: "reanjian", + mayunlu: "fengpo", + re_quyi: "refuqi", }, }, //小约翰可汗 - dctongliao:{ - audio:3, - trigger:{player:'phaseDrawAfter'}, - direct:true, - locked:false, - filter(event,player){ - return player.countCards('h')>0; + dctongliao: { + audio: 3, + trigger: { player: "phaseDrawAfter" }, + direct: true, + locked: false, + filter(event, player) { + return player.countCards("h") > 0; }, - content(){ - 'step 0' - player.chooseCard('h',get.prompt('dctongliao'),'选择一张牌标记为“通辽”',function(card,player){ - if(card.hasGaintag('dctongliao')) return false; - var num=get.number(card,player); - return !player.hasCard(card2=>{ - return card!=card2&&get.number(card2,player) { + return ( + card != card2 && + get.number(card2, player) < num + ); + }); + } + ) + .set("ai", function (card) { + var player = _status.event.player; + return ( + 1 + + Math.max( + 0, + player.getUseValue(card, null, true) + ) + ); + }); + ("step 1"); + if (result.bool) { + player.logSkill("dctongliao"); + player.addGaintag(result.cards, "dctongliao"); game.delayx(); } }, - mod:{ - aiOrder(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dctongliao')) return num+0.6; + mod: { + aiOrder(player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("dctongliao") + ) + return num + 0.6; }, }, - group:'dctongliao_draw', - subSkill:{ - draw:{ - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + group: "dctongliao_draw", + subSkill: { + draw: { + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter(event,player){ - var evt=event.getl(player); - if(!evt||!evt.hs||!evt.hs.length) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('dctongliao')) return true; + filter(event, player) { + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if ( + event.gaintag_map[i].includes( + "dctongliao" + ) + ) + return true; } return false; } - return player.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dctongliao')) return true; + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if ( + evt.gaintag_map[i].includes( + "dctongliao" + ) + ) + return true; } return false; }); }, - forced:true, - content(){ - var num=0; - var cards=trigger.getl(player).hs,ids=[]; - if(trigger.name=='lose'){ - for(var i in trigger.gaintag_map){ - if(trigger.gaintag_map[i].includes('dctongliao')) ids.push(i); + forced: true, + content() { + var num = 0; + var cards = trigger.getl(player).hs, + ids = []; + if (trigger.name == "lose") { + for (var i in trigger.gaintag_map) { + if ( + trigger.gaintag_map[i].includes( + "dctongliao" + ) + ) + ids.push(i); } + } else + player.getHistory("lose", function (evt) { + if (trigger != evt.getParent()) + return false; + for (var i in evt.gaintag_map) { + if ( + evt.gaintag_map[i].includes( + "dctongliao" + ) + ) + ids.push(i); + } + }); + for (var card of cards) { + if (ids.includes(card.cardid)) + num += get.number(card, player); } - else player.getHistory('lose',function(evt){ - if(trigger!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dctongliao')) ids.push(i); - } - }); - for(var card of cards){ - if(ids.includes(card.cardid)) num+=get.number(card,player); - } - if(num>0) player.draw(num); - } + if (num > 0) player.draw(num); + }, }, }, }, - dcwudao:{ - audio:3, - trigger:{player:'useCardAfter'}, - frequent:true, - filter(event,player){ - if(player.getStorage('dcwudao_effect').includes(get.type2(event.card,false))) return false; - var history=player.getHistory('useCard'),index=history.indexOf(event); - if(index<1) return false; - var evt=history[index-1]; - return get.type2(event.card,false)==get.type2(evt.card,false); + dcwudao: { + audio: 3, + trigger: { player: "useCardAfter" }, + frequent: true, + filter(event, player) { + if ( + player + .getStorage("dcwudao_effect") + .includes(get.type2(event.card, false)) + ) + return false; + var history = player.getHistory("useCard"), + index = history.indexOf(event); + if (index < 1) return false; + var evt = history[index - 1]; + return ( + get.type2(event.card, false) == + get.type2(evt.card, false) + ); }, - prompt2(event){ - return '令你本回合使用'+get.translation(get.type2(event.card,false))+'牌时不可被响应且伤害+1'; + prompt2(event) { + return ( + "令你本回合使用" + + get.translation(get.type2(event.card, false)) + + "牌时不可被响应且伤害+1" + ); }, - content(){ - player.addTempSkill('dcwudao_effect'); - player.markAuto('dcwudao_effect',[get.type2(trigger.card,false)]) + content() { + player.addTempSkill("dcwudao_effect"); + player.markAuto("dcwudao_effect", [ + get.type2(trigger.card, false), + ]); }, - subSkill:{ - effect:{ - trigger:{player:'useCard'}, - forced:true, - popup:false, - onremove:true, - filter(event,player){ - return player.getStorage('dcwudao_effect').includes(get.type2(event.card,false)); + subSkill: { + effect: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + onremove: true, + filter(event, player) { + return player + .getStorage("dcwudao_effect") + .includes(get.type2(event.card, false)); }, - content(){ - if(get.tag(trigger.card,'damage')>0) trigger.baseDamage++; + content() { + if (get.tag(trigger.card, "damage") > 0) + trigger.baseDamage++; trigger.directHit.addArray(game.filterPlayer()); }, - intro:{content:'已经悟到了$牌'}, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(arg&&arg.card&&player.getStorage('dcwudao_effect').includes(get.type2(arg.card))) return true; + intro: { content: "已经悟到了$牌" }, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if ( + arg && + arg.card && + player + .getStorage("dcwudao_effect") + .includes(get.type2(arg.card)) + ) + return true; return false; }, }, @@ -790,441 +1335,602 @@ game.import('character', function () { }, }, //叶诗文 - clbjisu:{ - audio:2, - trigger:{player:'phaseJudgeBefore'}, - direct:true, - content(){ - "step 0" - var check=player.countCards('h')>2; - player.chooseTarget(get.prompt("clbjisu"),"跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】",function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }).set('check',check).set('ai',function(target){ - if(!_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); - }).setHiddenSkill('clbjisu'); - "step 1" - if(result.bool){ - player.useCard({name:'sha',isCard:true},result.targets[0],false,'clbjisu'); + clbjisu: { + audio: 2, + trigger: { player: "phaseJudgeBefore" }, + direct: true, + content() { + "step 0"; + var check = player.countCards("h") > 2; + player + .chooseTarget( + get.prompt("clbjisu"), + "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse( + { name: "sha" }, + target, + false + ); + } + ) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect( + target, + { name: "sha" }, + _status.event.player + ); + }) + .setHiddenSkill("clbjisu"); + ("step 1"); + if (result.bool) { + player.useCard( + { name: "sha", isCard: true }, + result.targets[0], + false, + "clbjisu" + ); trigger.cancel(); - player.skip('phaseDraw'); + player.skip("phaseDraw"); } - } - }, - clbshuiyong:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter(event){ - return event.hasNature('fire'); }, - forced:true, - content(){ + }, + clbshuiyong: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter(event) { + return event.hasNature("fire"); + }, + forced: true, + content() { trigger.cancel(); }, - ai:{ - nofire:true, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'fireDamage')) return 'zerotarget'; - } - } - } + ai: { + nofire: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "fireDamage")) + return "zerotarget"; + }, + }, + }, }, //孙杨 - clbshuijian:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - frequent:true, - filter(event,player){ + clbshuijian: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + filter(event, player) { return !event.numFixed; }, - content(){ - var num=1+Math.floor(player.countCards('e')/2); - trigger.num+=num; + content() { + var num = 1 + Math.floor(player.countCards("e") / 2); + trigger.num += num; }, }, //李白 - dclbjiuxian:{ - audio:2, - enable:'chooseToUse', - locked:false, - viewAs:{name:'jiu'}, - check:card=>6.5-get.value(card), - filterCard(card){ - var info=get.info(card); - if(!info||(info.type!='trick'&&info.type!='delay')) return false; - if(info.notarget) return false; - if(info.selectTarget!=undefined){ - if(Array.isArray(info.selectTarget)){ - if(info.selectTarget[0]<0) return !info.toself; - return info.selectTarget[0]!=1||info.selectTarget[1]!=1; - } - else{ - if(info.selectTarget<0) return !info.toself; - return info.selectTarget!=1; + dclbjiuxian: { + audio: 2, + enable: "chooseToUse", + locked: false, + viewAs: { name: "jiu" }, + check: (card) => 6.5 - get.value(card), + filterCard(card) { + var info = get.info(card); + if (!info || (info.type != "trick" && info.type != "delay")) + return false; + if (info.notarget) return false; + if (info.selectTarget != undefined) { + if (Array.isArray(info.selectTarget)) { + if (info.selectTarget[0] < 0) return !info.toself; + return ( + info.selectTarget[0] != 1 || + info.selectTarget[1] != 1 + ); + } else { + if (info.selectTarget < 0) return !info.toself; + return info.selectTarget != 1; } } return false; }, - viewAsFilter(player){ - if(_status.connectMode&&player.countCards('hs')>0) return true; - return player.hasCard(lib.skill.dclbjiuxian.filterCard,'hs') + viewAsFilter(player) { + if (_status.connectMode && player.countCards("hs") > 0) + return true; + return player.hasCard( + lib.skill.dclbjiuxian.filterCard, + "hs" + ); }, - ai:{ - order:(item,player)=>get.order({name:'jiu'},player), + ai: { + order: (item, player) => get.order({ name: "jiu" }, player), }, - mod:{ - cardUsable(card){ - if(card.name=='jiu') return Infinity; + mod: { + cardUsable(card) { + if (card.name == "jiu") return Infinity; }, }, }, - dcshixian:{ - audio:2, - trigger:{player:'useCard'}, + dcshixian: { + audio: 2, + trigger: { player: "useCard" }, //frequent:true, //direct:true, - locked:false, - filter(event,player){ - var history=player.getAllHistory('useCard'),index=history.indexOf(event); - if(index<1) return false; - var evt=history[index-1]; - return get.is.yayun(get.translation(event.card.name),get.translation(evt.card.name)); + locked: false, + filter(event, player) { + var history = player.getAllHistory("useCard"), + index = history.indexOf(event); + if (index < 1) return false; + var evt = history[index - 1]; + return get.is.yayun( + get.translation(event.card.name), + get.translation(evt.card.name) + ); }, - filterx(event){ - if(event.targets.length==0) return false; - var type=get.type(event.card); - if(type!='basic'&&type!='trick') return false; + filterx(event) { + if (event.targets.length == 0) return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; return true; }, - prompt2(event,player){ - if(lib.skill.dcshixian.filterx(event)) return '摸一张牌并令'+get.translation(event.card)+'额外结算一次?'; - return '摸一张牌。'; + prompt2(event, player) { + if (lib.skill.dcshixian.filterx(event)) + return ( + "摸一张牌并令" + + get.translation(event.card) + + "额外结算一次?" + ); + return "摸一张牌。"; }, - check(event,player){ - if(lib.skill.dcshixian.filterx(event)) return !get.tag(event.card,'norepeat'); + check(event, player) { + if (lib.skill.dcshixian.filterx(event)) + return !get.tag(event.card, "norepeat"); return true; }, - content(){ + content() { player.draw(); - if(lib.skill.dcshixian.filterx(trigger)){ + if (lib.skill.dcshixian.filterx(trigger)) { trigger.effectCount++; - game.log(trigger.card,'额外结算一次'); + game.log(trigger.card, "额外结算一次"); } }, - mod:{ - aiOrder(player,card,num){ - if(typeof card=='object'&&!get.tag(card,'norepeat')){ - var history=player.getAllHistory('useCard'); - if(history.length>0){ - var cardx=history[history.length-1].card; - if(get.is.yayun(get.translation(cardx.name),get.translation(card.name))) return num+20; + mod: { + aiOrder(player, card, num) { + if ( + typeof card == "object" && + !get.tag(card, "norepeat") + ) { + var history = player.getAllHistory("useCard"); + if (history.length > 0) { + var cardx = history[history.length - 1].card; + if ( + get.is.yayun( + get.translation(cardx.name), + get.translation(card.name) + ) + ) + return num + 20; } } }, }, - init(player){ - player.addSkill('dcshixian_yayun'); - var history=player.getAllHistory('useCard'); - if(history.length){ - player.addGaintag(player.getCards('h',card=>{ - return get.is.yayun(get.translation(card.name),get.translation(history[history.length-1].card.name)); - }),'dcshixian_yayun'); + init(player) { + player.addSkill("dcshixian_yayun"); + var history = player.getAllHistory("useCard"); + if (history.length) { + player.addGaintag( + player.getCards("h", (card) => { + return get.is.yayun( + get.translation(card.name), + get.translation( + history[history.length - 1].card.name + ) + ); + }), + "dcshixian_yayun" + ); } }, - onremove(player){ - player.removeSkill('dcshixian_yayun'); - player.removeGaintag('dcshixian_yayun'); + onremove(player) { + player.removeSkill("dcshixian_yayun"); + player.removeGaintag("dcshixian_yayun"); }, - subSkill:{ - yayun:{ - charlotte:true, - trigger:{player:'useCard1'}, - filter(event,player){ - return player.countCards('h')>0; + subSkill: { + yayun: { + charlotte: true, + trigger: { player: "useCard1" }, + filter(event, player) { + return player.countCards("h") > 0; }, - direct:true, - priority:11+45+14+19+19+810, - content(){ - 'step 0' - player.removeGaintag('dcshixian_yayun'); - 'step 1' - player.addGaintag(player.getCards('h',card=>{ - return get.is.yayun(get.translation(card.name),get.translation(trigger.card.name)); - }),'dcshixian_yayun'); + direct: true, + priority: 11 + 45 + 14 + 19 + 19 + 810, + content() { + "step 0"; + player.removeGaintag("dcshixian_yayun"); + ("step 1"); + player.addGaintag( + player.getCards("h", (card) => { + return get.is.yayun( + get.translation(card.name), + get.translation(trigger.card.name) + ); + }), + "dcshixian_yayun" + ); }, }, }, }, //龙王 - dclonggong:{ - audio:2, - trigger:{player:'damageBegin4'}, - usable:1, - filter(event,player){ - return event.source&&event.source.isIn(); + dclonggong: { + audio: 2, + trigger: { player: "damageBegin4" }, + usable: 1, + filter(event, player) { + return event.source && event.source.isIn(); }, - logTarget:'source', - check(event,player){ - return get.attitude(player,event.source)>=0||player.hp<=Math.max(2,event.num); + logTarget: "source", + check(event, player) { + return ( + get.attitude(player, event.source) >= 0 || + player.hp <= Math.max(2, event.num) + ); }, - content(){ - 'step 0' + content() { + "step 0"; trigger.cancel(); - 'step 1' - var card=get.cardPile2(function(card){ - return get.type(card,null,false)=='equip'; - }),source=trigger.source; - if(card&&source&&source.isIn()) source.gain(card,'gain2'); + ("step 1"); + var card = get.cardPile2(function (card) { + return get.type(card, null, false) == "equip"; + }), + source = trigger.source; + if (card && source && source.isIn()) + source.gain(card, "gain2"); }, - ai:{ - filterDamage:true, - skillTagFilter(player){ - return !player.storage.counttrigger||!player.storage.counttrigger.dclonggong; + ai: { + filterDamage: true, + skillTagFilter(player) { + return ( + !player.storage.counttrigger || + !player.storage.counttrigger.dclonggong + ); }, }, }, - dcsitian:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - var colorx=false,hs=player.getCards('he'); - if(hs.length<2) return false; - for(var card of hs){ - if(!lib.filter.cardDiscardable(card,player)) continue; - var color=get.color(card,player); - if(color=='none') continue; - if(!colorx) colorx=color; - else if(colorx!=color) return true; + dcsitian: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + var colorx = false, + hs = player.getCards("he"); + if (hs.length < 2) return false; + for (var card of hs) { + if (!lib.filter.cardDiscardable(card, player)) continue; + var color = get.color(card, player); + if (color == "none") continue; + if (!colorx) colorx = color; + else if (colorx != color) return true; } return false; }, - filterCard(card,player){ - var color=get.color(card,player); - if(color=='none') return false; - return !ui.selected.cards.length||get.color(ui.selected.cards[0])!=color; + filterCard(card, player) { + var color = get.color(card, player); + if (color == "none") return false; + return ( + !ui.selected.cards.length || + get.color(ui.selected.cards[0]) != color + ); }, - selectCard:2, - complexCard:true, - prompt:'弃置两张颜色不同的牌并改变天气', - check:(card)=>4.5-get.value(card), - content(){ - 'step 0' - var list=['烈日','雷电','大浪','暴雨','大雾'].randomGets(2); - player.chooseButton(true,[ - '请选择执行一个天气', - [list.map(i=>[ - i, - '', - ]),'textbutton'], - ]).set('ai',function(button){ - return lib.skill.dcsitian.weathers[button.link].ai(_status.event.player); - }) - 'step 1' - if(result.bool){ - var choice=result.links[0]; - game.log(player,'将当前天气变更为','#g'+choice); - var next=game.createEvent('dcsitian_weather',false); - next.player=player; - next.setContent(lib.skill.dcsitian.weathers[choice].content); + selectCard: 2, + complexCard: true, + prompt: "弃置两张颜色不同的牌并改变天气", + check: (card) => 4.5 - get.value(card), + content() { + "step 0"; + var list = [ + "烈日", + "雷电", + "大浪", + "暴雨", + "大雾", + ].randomGets(2); + player + .chooseButton(true, [ + "请选择执行一个天气", + [ + list.map((i) => [ + i, + '", + ]), + "textbutton", + ], + ]) + .set("ai", function (button) { + return lib.skill.dcsitian.weathers[button.link].ai( + _status.event.player + ); + }); + ("step 1"); + if (result.bool) { + var choice = result.links[0]; + game.log(player, "将当前天气变更为", "#g" + choice); + var next = game.createEvent("dcsitian_weather", false); + next.player = player; + next.setContent( + lib.skill.dcsitian.weathers[choice].content + ); } }, - ai:{ - order:8, - result:{ - player(player){ - var num1=0,num2=0; - game.countPlayer(function(current){ - if(player==current) return; - var att=get.attitude(player,current); - if(att>0) num1++; + ai: { + order: 8, + result: { + player(player) { + var num1 = 0, + num2 = 0; + game.countPlayer(function (current) { + if (player == current) return; + var att = get.attitude(player, current); + if (att > 0) num1++; else num2++; }); - return num2-num1; + return num2 - num1; }, }, }, - subSkill:{ - dawu:{ - trigger:{player:'useCard'}, - forced:true, - charlotte:true, - filter(event,player){ - return get.type2(event.card,false)=='basic'; + subSkill: { + dawu: { + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + filter(event, player) { + return get.type2(event.card, false) == "basic"; }, - content(){ - trigger.targets.length=0; - trigger.all_excluded=true; - player.removeSkill('dcsitian_dawu'); + content() { + trigger.targets.length = 0; + trigger.all_excluded = true; + player.removeSkill("dcsitian_dawu"); }, - mark:true, - marktext:'雾', - intro:{ - name:'司天 - 大雾', - content:'使用的下一张基本牌无效', + mark: true, + marktext: "雾", + intro: { + name: "司天 - 大雾", + content: "使用的下一张基本牌无效", }, }, }, - weathers:{ - 烈日:{ - description:'你对其他角色造成1点火属性伤害。', - content(){ - var targets=game.filterPlayer(current=>current!=player).sortBySeat(); - player.line(targets,'fire'); - for(var target of targets){ - target.damage('fire'); + weathers: { + 烈日: { + description: "你对其他角色造成1点火属性伤害。", + content() { + var targets = game + .filterPlayer((current) => current != player) + .sortBySeat(); + player.line(targets, "fire"); + for (var target of targets) { + target.damage("fire"); } }, - ai(player){ - var effect=0; - game.countPlayer(function(current){ - if(current==player) return; - effect+=get.damageEffect(current,player,player,'fire'); + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if (current == player) return; + effect += get.damageEffect( + current, + player, + player, + "fire" + ); }); return effect; }, }, - 雷电:{ - description:'你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。', - content(){ - 'step 0' - var targets=game.filterPlayer(current=>current!=player).sortBySeat(); - player.line(targets,'thunder'); - event.targets=targets; - 'step 1' - var target=targets.shift(); - if(!target.isIn()){ - if(targets.length>0) event.redo(); - else{ + 雷电: { + description: + "你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。", + content() { + "step 0"; + var targets = game + .filterPlayer((current) => current != player) + .sortBySeat(); + player.line(targets, "thunder"); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + if (!target.isIn()) { + if (targets.length > 0) event.redo(); + else { event.finish(); return; } } - event.target=target; - event.judgestr=get.translation('shandian'); - target.judge(lib.card.shandian.judge,event.judgestr).judge2=lib.card.shandian.judge2; + event.target = target; + event.judgestr = get.translation("shandian"); + target.judge( + lib.card.shandian.judge, + event.judgestr + ).judge2 = lib.card.shandian.judge2; //game.delayx(1.5); - 'step 2' - var name='shandian'; - if(event.cancelled&&!event.direct){ - if(lib.card[name].cancel){ - var next=game.createEvent(name+'Cancel'); + ("step 2"); + var name = "shandian"; + if (event.cancelled && !event.direct) { + if (lib.card[name].cancel) { + var next = game.createEvent( + name + "Cancel" + ); next.setContent(lib.card[name].cancel); - next.cards=[]; - next.card=get.autoViewAs({name:name}); - next.player=target; + next.cards = []; + next.card = get.autoViewAs({ name: name }); + next.player = target; } - } - else{ - var next=game.createEvent(name); - next.setContent(function(){ - if(result.bool==false){ - player.damage(3,'thunder','nosource'); + } else { + var next = game.createEvent(name); + next.setContent(function () { + if (result.bool == false) { + player.damage(3, "thunder", "nosource"); } }); - next._result=result; - next.cards=[]; - next.card=get.autoViewAs({name:name}); - next.player=target; + next._result = result; + next.cards = []; + next.card = get.autoViewAs({ name: name }); + next.player = target; } - if(targets.length>0) event.goto(1); + if (targets.length > 0) event.goto(1); }, - ai(player){ - var effect=0; - game.countPlayer(function(current){ - if(current==player) return; - effect+=get.damageEffect(current,current,player,'thunder')/5; + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if (current == player) return; + effect += + get.damageEffect( + current, + current, + player, + "thunder" + ) / 5; }); return effect; }, }, - 大浪:{ - description:'你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。', - content(){ - 'step 0' - var targets=game.filterPlayer(current=>current!=player).sortBySeat(); - player.line(targets,'green'); - event.targets=targets; - 'step 1' - var target=targets.shift(); - if(target.isIn()){ - var num=target.countCards('e'); - if(num>0){ - player.discardPlayerCard(target,true,'e',num) - } - else{ + 大浪: { + description: + "你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。", + content() { + "step 0"; + var targets = game + .filterPlayer((current) => current != player) + .sortBySeat(); + player.line(targets, "green"); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + if (target.isIn()) { + var num = target.countCards("e"); + if (num > 0) { + player.discardPlayerCard( + target, + true, + "e", + num + ); + } else { target.loseHp(); game.delayex(); } } - if(targets.length>0) event.redo(); + if (targets.length > 0) event.redo(); }, - ai(player){ - var effect=0; - game.countPlayer(function(current){ - if(current==player) return; - var es=current.getCards('e'); - if(es.length>0){ - var att=get.attitude(player,current),val=get.value(es,current); - effect-=Math.sqrt(att)*val; - } - else effect+=get.effect(current,{name:'losehp'},player,player); + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if (current == player) return; + var es = current.getCards("e"); + if (es.length > 0) { + var att = get.attitude(player, current), + val = get.value(es, current); + effect -= Math.sqrt(att) * val; + } else effect += get.effect(current, { name: "losehp" }, player, player); }); return effect; }, }, - 暴雨:{ - description:'你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。', - content(){ - 'step 0' - player.chooseTarget('请选择【暴雨】的目标','令目标角色弃置所有手牌。若其没有手牌,则其改为失去1点体力。').set('ai',function(current){ - var es=current.getCards('h'),player=_status.event.player; - if(es.length>0){ - var att=get.attitude(player,current),val=get.value(es,current); - return -Math.sqrt(att)*val; - } - return get.effect(current,{name:'losehp'},player,player); - }) - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - var num=target.countCards('h'); - if(num>0){ - player.discardPlayerCard(target,true,'h',num) - } - else{ + 暴雨: { + description: + "你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。", + content() { + "step 0"; + player + .chooseTarget( + "请选择【暴雨】的目标", + "令目标角色弃置所有手牌。若其没有手牌,则其改为失去1点体力。" + ) + .set("ai", function (current) { + var es = current.getCards("h"), + player = _status.event.player; + if (es.length > 0) { + var att = get.attitude(player, current), + val = get.value(es, current); + return -Math.sqrt(att) * val; + } + return get.effect( + current, + { name: "losehp" }, + player, + player + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + var num = target.countCards("h"); + if (num > 0) { + player.discardPlayerCard( + target, + true, + "h", + num + ); + } else { target.loseHp(); game.delayex(); } } }, - ai(player){ - return Math.max.apply(Math,game.filterPlayer(function(current){ - return current!=player - }).map(function(current){ - var es=current.getCards('h'); - if(es.length>0){ - var att=get.attitude(player,current),val=get.value(es,current); - return -Math.sqrt(att)*val; - } - return get.effect(current,{name:'losehp'},player,player); - })); + ai(player) { + return Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return current != player; + }) + .map(function (current) { + var es = current.getCards("h"); + if (es.length > 0) { + var att = get.attitude( + player, + current + ), + val = get.value(es, current); + return -Math.sqrt(att) * val; + } + return get.effect( + current, + { name: "losehp" }, + player, + player + ); + }) + ); }, }, - 大雾:{ - description:'你令所有其他角色获得如下效果:当其使用下一张基本牌时,取消之。', - content(){ - var targets=game.filterPlayer(current=>current!=player).sortBySeat(); + 大雾: { + description: + "你令所有其他角色获得如下效果:当其使用下一张基本牌时,取消之。", + content() { + var targets = game + .filterPlayer((current) => current != player) + .sortBySeat(); player.line(targets); - for(var target of targets) target.addSkill('dcsitian_dawu'); + for (var target of targets) + target.addSkill("dcsitian_dawu"); }, - ai(player){ - var effect=0; - game.countPlayer(function(current){ - if(current==player||current.hasSkill('dcsitian_dawu')) return; - effect-=0.5*get.attitude(player,current); + ai(player) { + var effect = 0; + game.countPlayer(function (current) { + if ( + current == player || + current.hasSkill("dcsitian_dawu") + ) + return; + effect -= 0.5 * get.attitude(player, current); }); return effect; }, @@ -1232,743 +1938,1031 @@ game.import('character', function () { }, }, //美猴王 - dcjinjing:{ - locked:true, - ai:{ - viewHandcard:true, - skillTagFilter(player,tag,arg){ - if(player==arg) return false; + dcjinjing: { + locked: true, + ai: { + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; }, }, }, - dccibei:{ - audio:2, - trigger:{source:'damageBegin2'}, - logTarget:'player', - filter(event,player){ - return player!=event.player&&!player.hasHistory('useSkill',function(evt){ - return evt.skill=='dccibei'&&evt.targets.includes(event.player); - }); + dccibei: { + audio: 2, + trigger: { source: "damageBegin2" }, + logTarget: "player", + filter(event, player) { + return ( + player != event.player && + !player.hasHistory("useSkill", function (evt) { + return ( + evt.skill == "dccibei" && + evt.targets.includes(event.player) + ); + }) + ); }, - check(event,player){ - var target=event.player; - if(get.attitude(player,target)>=0) return true; - return (!player.getStat('skill').ruyijingubang_skill||player.storage.ruyijingubang_skill==1); + check(event, player) { + var target = event.player; + if (get.attitude(player, target) >= 0) return true; + return ( + !player.getStat("skill").ruyijingubang_skill || + player.storage.ruyijingubang_skill == 1 + ); }, - content(){ + content() { trigger.cancel(); player.draw(5); }, - ai:{ - threaten:4.5, + ai: { + threaten: 4.5, }, }, - dcruyi:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + dcruyi: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.hasEquipableSlot(1)&&!player.getEquips('ruyijingubang').length; + forced: true, + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + player.hasEquipableSlot(1) && + !player.getEquips("ruyijingubang").length + ); }, - content(){ - var card=game.createCard2('ruyijingubang','heart',9); - player.$gain2(card,false); + content() { + var card = game.createCard2("ruyijingubang", "heart", 9); + player.$gain2(card, false); game.delayx(); player.equip(card); }, - mod:{ - canBeGained(card,source,player){ - if(player.getEquips('ruyijingubang').includes(card)) return false; + mod: { + canBeGained(card, source, player) { + if (player.getEquips("ruyijingubang").includes(card)) + return false; }, - canBeDiscarded(card,source,player){ - if(player.getEquips('ruyijingubang').includes(card)) return false; + canBeDiscarded(card, source, player) { + if (player.getEquips("ruyijingubang").includes(card)) + return false; }, - canBeReplaced(card,player){ - if(player.getEquips('ruyijingubang').includes(card)) return false; + canBeReplaced(card, player) { + if (player.getEquips("ruyijingubang").includes(card)) + return false; }, - cardname(card){ - if(get.subtype(card,false)=='equip1') return 'sha'; + cardname(card) { + if (get.subtype(card, false) == "equip1") return "sha"; }, - cardnature(card){ - if(get.subtypes(card,false).includes('equip1')) return false; + cardnature(card) { + if (get.subtypes(card, false).includes("equip1")) + return false; }, - cardDiscardable(card,player){ - if(player.getEquips('ruyijingubang').includes(card)) return false; + cardDiscardable(card, player) { + if (player.getEquips("ruyijingubang").includes(card)) + return false; }, - cardEnabled2(card,player){ - if(player.getEquips('ruyijingubang').includes(card)) return false; + cardEnabled2(card, player) { + if (player.getEquips("ruyijingubang").includes(card)) + return false; }, }, - group:'dcruyi_blocker', - subSkill:{ - blocker:{ - trigger:{player:['loseBefore','disableEquipBefore']}, - forced:true, - filter(event,player){ - if(event.name=='disableEquip') return (event.slots.includes('equip1')); - var cards=player.getEquips('ruyijingubang'); - return event.cards.some(card=>cards.includes(card)); + group: "dcruyi_blocker", + subSkill: { + blocker: { + trigger: { + player: ["loseBefore", "disableEquipBefore"], }, - content(){ - if(trigger.name=='lose'){ - trigger.cards.removeArray(player.getEquips('ruyijingubang')); - } - else{ - while(trigger.slots.includes('equip1')) trigger.slots.remove('equip1'); + forced: true, + filter(event, player) { + if (event.name == "disableEquip") + return event.slots.includes("equip1"); + var cards = player.getEquips("ruyijingubang"); + return event.cards.some((card) => + cards.includes(card) + ); + }, + content() { + if (trigger.name == "lose") { + trigger.cards.removeArray( + player.getEquips("ruyijingubang") + ); + } else { + while (trigger.slots.includes("equip1")) + trigger.slots.remove("equip1"); } }, }, }, }, - ruyijingubang_skill:{ - equipSkill:true, - enable:'phaseUse', - usable:1, - chooseButton:{ - dialog(){ - var dialog=ui.create.dialog( - '如意金箍棒:选择变化攻击范围', - [[ - [1,'   ⒈【杀】无次数限制   '], - [2,'   ⒉【杀】的伤害值+1   '], - ],'tdnodes'], - [[ - [3,'   ⒊【杀】不可被响应   '], - [4,'   ⒋【杀】的目标数+1   '], - ],'tdnodes'] + ruyijingubang_skill: { + equipSkill: true, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog() { + var dialog = ui.create.dialog( + "如意金箍棒:选择变化攻击范围", + [ + [ + [1, "   ⒈【杀】无次数限制   "], + [2, "   ⒉【杀】的伤害值+1   "], + ], + "tdnodes", + ], + [ + [ + [3, "   ⒊【杀】不可被响应   "], + [4, "   ⒋【杀】的目标数+1   "], + ], + "tdnodes", + ] ); return dialog; }, - filter(button,player){ - return button.link!=player.storage.ruyijingubang_skill; + filter(button, player) { + return ( + button.link != player.storage.ruyijingubang_skill + ); }, - check(button){ - if(button.link==1||button.link==3) return 1; + check(button) { + if (button.link == 1 || button.link == 3) return 1; return 0; }, - backup(links,player){ + backup(links, player) { return { - audio:'dcruyi', - num:links[0], - popup:'如意金箍棒', - content(){ - var num=lib.skill.ruyijingubang_skill_backup.num; - player.storage.ruyijingubang_skill=num; - var cards=player.getEquips(1); - for(var card of cards){ - if(card&&card.name=='ruyijingubang'){ - card.storage.ruyijingubang_skill=num; - game.log(player,'将',card,'的攻击范围改为'+num) + audio: "dcruyi", + num: links[0], + popup: "如意金箍棒", + content() { + var num = + lib.skill.ruyijingubang_skill_backup.num; + player.storage.ruyijingubang_skill = num; + var cards = player.getEquips(1); + for (var card of cards) { + if (card && card.name == "ruyijingubang") { + card.storage.ruyijingubang_skill = num; + game.log( + player, + "将", + card, + "的攻击范围改为" + num + ); } } - player.markSkill('ruyijingubang_skill'); + player.markSkill("ruyijingubang_skill"); }, - } + }; }, }, - mod:{ - cardUsable(card,player,num){ - if(player.storage.ruyijingubang_skill==1&&card.name=='sha') return Infinity; + mod: { + cardUsable(card, player, num) { + if ( + player.storage.ruyijingubang_skill == 1 && + card.name == "sha" + ) + return Infinity; }, }, - ai:{ - order:1, - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return player.storage.ruyijingubang_skill==3; + ai: { + order: 1, + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return player.storage.ruyijingubang_skill == 3; }, - effect:{ - player(card,player,target,current){ - if(get.tag(card,'damage')>0&&player!=target){ - if(player.getStat('skill').ruyijingubang_skill&&player.storage.ruyijingubang_skill!=1) return; - if(player.hasSkill('dccibei')&&!player.hasHistory('useSkill',function(evt){ - return evt.skill=='dccibei'&&evt.targets.includes(target); - })){ - return [1,3]; + effect: { + player(card, player, target, current) { + if ( + get.tag(card, "damage") > 0 && + player != target + ) { + if ( + player.getStat("skill") + .ruyijingubang_skill && + player.storage.ruyijingubang_skill != 1 + ) + return; + if ( + player.hasSkill("dccibei") && + !player.hasHistory( + "useSkill", + function (evt) { + return ( + evt.skill == "dccibei" && + evt.targets.includes(target) + ); + } + ) + ) { + return [1, 3]; } } }, }, - result:{ - player(player){ - if(player.storage.ruyijingubang_skill==1){ - if(!player.hasSha()) return 1; + result: { + player(player) { + if (player.storage.ruyijingubang_skill == 1) { + if (!player.hasSha()) return 1; return 0; - } - else{ - if(player.hasSha()&&player.getCardUsable('sha')<=0) return 1; + } else { + if ( + player.hasSha() && + player.getCardUsable("sha") <= 0 + ) + return 1; return 0; } }, - } - }, - intro:{ - name:'如意金箍棒', - content(storage){ - if(!storage) storage=3; - return '
  • 攻击范围:'+storage+'
  • '+['你使用【杀】无次数限制。','你使用的【杀】伤害+1。','你使用的【杀】不可被响应。','你使用【杀】选择目标后,可以增加一个额外目标。'][storage-1] }, }, - subSkill:{ - backup:{}, + intro: { + name: "如意金箍棒", + content(storage) { + if (!storage) storage = 3; + return ( + "
  • 攻击范围:" + + storage + + "
  • " + + [ + "你使用【杀】无次数限制。", + "你使用的【杀】伤害+1。", + "你使用的【杀】不可被响应。", + "你使用【杀】选择目标后,可以增加一个额外目标。", + ][storage - 1] + ); + }, + }, + subSkill: { + backup: {}, }, }, - ruyijingubang_effect:{ - equipSkill:true, - trigger:{player:'useCard2'}, - direct:true, - locked:true, - filter(event,player){ - if(event.card.name!='sha') return false; - var num=player.storage.ruyijingubang_skill; - if(!num||num==1) return false; - if(num!=4) return true; - var card=event.card; - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current)&&lib.filter.targetInRange(card,player,current); - })){ + ruyijingubang_effect: { + equipSkill: true, + trigger: { player: "useCard2" }, + direct: true, + locked: true, + filter(event, player) { + if (event.card.name != "sha") return false; + var num = player.storage.ruyijingubang_skill; + if (!num || num == 1) return false; + if (num != 4) return true; + var card = event.card; + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2( + card, + player, + current + ) && + lib.filter.targetInRange(card, player, current) + ); + }) + ) { return true; } return false; }, - content(){ - 'step 0' - var num=player.storage.ruyijingubang_skill; - if(num==4){ - player.chooseTarget(get.prompt('ruyijingubang_effect'),'为'+get.translation(trigger.card)+'额外指定一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target,false); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - } - else{ - player.logSkill('ruyijingubang_effect'); - if(num==2){ + content() { + "step 0"; + var num = player.storage.ruyijingubang_skill; + if (num == 4) { + player + .chooseTarget( + get.prompt("ruyijingubang_effect"), + "为" + + get.translation(trigger.card) + + "额外指定一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes( + target + ) && + player.canUse( + _status.event.card, + target, + false + ) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect( + target, + _status.event.card, + player, + player + ); + }) + .set("card", trigger.card); + } else { + player.logSkill("ruyijingubang_effect"); + if (num == 2) { trigger.baseDamage++; - game.log(trigger.card,'的伤害+1'); - } - else if(num==3){ + game.log(trigger.card, "的伤害+1"); + } else if (num == 3) { trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); } event.finish(); } - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - player.logSkill('ruyijingubang_effect',event.targets); + ("step 2"); + player.logSkill("ruyijingubang_effect", event.targets); trigger.targets.addArray(event.targets); }, }, //涛神 - dcnutao:{ - audio:4, - trigger:{player:'useCardToPlayer'}, - forced:true, - group:'dcnutao_add', - filter(event,player){ - if(get.type2(event.card)!='trick') return false; - return event.isFirstTarget&&event.targets.some(i=>i!=player); + dcnutao: { + audio: 4, + trigger: { player: "useCardToPlayer" }, + forced: true, + group: "dcnutao_add", + filter(event, player) { + if (get.type2(event.card) != "trick") return false; + return ( + event.isFirstTarget && + event.targets.some((i) => i != player) + ); }, - content(){ - var target=trigger.targets.filter(i=>i!=player).randomGet(); - player.line(target,'thunder'); - target.damage('thunder'); + content() { + var target = trigger.targets + .filter((i) => i != player) + .randomGet(); + player.line(target, "thunder"); + target.damage("thunder"); }, - ai:{ - effect:{ - player(card,player,target){ - if(player!==target&&get.type2(card)==='trick'){ - let tars=[target]; - if(ui.selected.targets.length) tars.addArray(ui.selected.targets.filter(i=>i!==player&&i!==target)); - if(tars.length<2) return [1,0,1,-2]; - return [1,0,1,-2/tars.length]; + ai: { + effect: { + player(card, player, target) { + if ( + player !== target && + get.type2(card) === "trick" + ) { + let tars = [target]; + if (ui.selected.targets.length) + tars.addArray( + ui.selected.targets.filter( + (i) => i !== player && i !== target + ) + ); + if (tars.length < 2) return [1, 0, 1, -2]; + return [1, 0, 1, -2 / tars.length]; } }, }, }, - subSkill:{ - add:{ - audio:'dcnutao', - trigger:{source:'damageSource'}, - filter(event,player){ - return event.nature=='thunder'&&player.isPhaseUsing(); + subSkill: { + add: { + audio: "dcnutao", + trigger: { source: "damageSource" }, + filter(event, player) { + return ( + event.nature == "thunder" && + player.isPhaseUsing() + ); + }, + forced: true, + content() { + player.addTempSkill("dcnutao_sha", "phaseUseAfter"); + player.addMark("dcnutao_sha", 1, false); }, - forced:true, - content(){ - player.addTempSkill('dcnutao_sha','phaseUseAfter'); - player.addMark('dcnutao_sha',1,false); - } }, - sha:{ - charlotte:true, - onremove:true, - marktext:'涛', - intro:{ - content:'此阶段使用【杀】的次数上限+#', + sha: { + charlotte: true, + onremove: true, + marktext: "涛", + intro: { + content: "此阶段使用【杀】的次数上限+#", }, - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha') return num+player.countMark('dcnutao_sha'); + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") + return ( + num + player.countMark("dcnutao_sha") + ); }, - } - } - } + }, + }, + }, }, //铜雀台 - spduanzhi:{ - trigger:{target:'useCardToTargeted'}, - logTarget:'player', - check(event,player){ - var target=event.player; - if(get.attitude(player,target)>=-2||target.countCards('he',function(card){ - return get.value(card,target)>5; - })<2) return false; - if(player.hp>2) return true; - if(player.hp==1){ - if(get.tag(event.card,'respondSha')){ - if(player.countCards('h',{name:'sha'})==0){ + spduanzhi: { + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + check(event, player) { + var target = event.player; + if ( + get.attitude(player, target) >= -2 || + target.countCards("he", function (card) { + return get.value(card, target) > 5; + }) < 2 + ) + return false; + if (player.hp > 2) return true; + if (player.hp == 1) { + if (get.tag(event.card, "respondSha")) { + if (player.countCards("h", { name: "sha" }) == 0) { return true; } - } - else if(get.tag(event.card,'respondShan')){ - if(player.countCards('h',{name:'shan'})==0){ + } else if (get.tag(event.card, "respondShan")) { + if (player.countCards("h", { name: "shan" }) == 0) { return true; } - } - else if(get.tag(event.card,'damage')){ - if(event.card.name=='shuiyanqijunx') return player.countCards('e')==0; + } else if (get.tag(event.card, "damage")) { + if (event.card.name == "shuiyanqijunx") + return player.countCards("e") == 0; return true; } } return false; }, - filter(event,player){ - return player!=event.player&&event.player.countDiscardableCards(player,'he')>0; + filter(event, player) { + return ( + player != event.player && + event.player.countDiscardableCards(player, "he") > 0 + ); }, - content(){ - player.discardPlayerCard(trigger.player,true,'he',[1,2]); + content() { + player.discardPlayerCard( + trigger.player, + true, + "he", + [1, 2] + ); player.loseHp(); }, }, - spduyi:{ - enable:'phaseUse', - usable:1, - content(){ - 'step 0' - event.card=get.cards()[0]; + spduyi: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + event.card = get.cards()[0]; game.cardsGotoOrdering(event.card); player.showCards(event.card); - 'step 1' - player.chooseTarget('令一名角色获得'+get.translation(card),true).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.du){ - if(target.hasSkillTag('nodu')) return 0; - return -att; - } - if(att>0){ - if(target==player) att*=0.6; - return att+Math.sqrt(Math.max(0,5-target.countCards('h'))); - } - return att; - }).set('du',card.name=='du'); - 'step 2' - if(result&&result.bool){ - var target=result.targets[0]; - target.gain(card,'gain2'); - if(get.color(card,false)=='black') target.addTempSkill('spduyi2'); + ("step 1"); + player + .chooseTarget( + "令一名角色获得" + get.translation(card), + true + ) + .set("ai", function (target) { + var att = get.attitude( + _status.event.player, + target + ); + if (_status.event.du) { + if (target.hasSkillTag("nodu")) return 0; + return -att; + } + if (att > 0) { + if (target == player) att *= 0.6; + return ( + att + + Math.sqrt( + Math.max(0, 5 - target.countCards("h")) + ) + ); + } + return att; + }) + .set("du", card.name == "du"); + ("step 2"); + if (result && result.bool) { + var target = result.targets[0]; + target.gain(card, "gain2"); + if (get.color(card, false) == "black") + target.addTempSkill("spduyi2"); } }, - ai:{ - order:0.1, - result:{ - player:1, + ai: { + order: 0.1, + result: { + player: 1, }, }, }, - spduyi2:{ - mod:{ - cardEnabled2(card){ - if(get.position(card)=='h') return false; + spduyi2: { + mod: { + cardEnabled2(card) { + if (get.position(card) == "h") return false; }, }, - mark:true, - intro:{ - content:'不能使用或打出手牌', + mark: true, + intro: { + content: "不能使用或打出手牌", }, }, - spcangni:{ - audio:'zhuikong', - trigger:{player:'phaseDiscardBegin'}, - direct:true, - content(){ - 'step 0' - player.chooseDrawRecover('###'+get.prompt('spcangni')+'###摸两张牌或回复1点体力,然后将武将牌翻面',2).logSkill='spcangni'; - 'step 1' - if(result.control!='cancel2') player.turnOver(); + spcangni: { + audio: "zhuikong", + trigger: { player: "phaseDiscardBegin" }, + direct: true, + content() { + "step 0"; + player.chooseDrawRecover( + "###" + + get.prompt("spcangni") + + "###摸两张牌或回复1点体力,然后将武将牌翻面", + 2 + ).logSkill = "spcangni"; + ("step 1"); + if (result.control != "cancel2") player.turnOver(); }, - group:['spcangni_gain','spcangni_lose'], - subSkill:{ - gain:{ - audio:'zhuikong', - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + group: ["spcangni_gain", "spcangni_lose"], + subSkill: { + gain: { + audio: "zhuikong", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - usable:1, - filter(event,player){ - return player.isTurnedOver()&&player!=_status.currentPhase&&event.getg(player).length>0; + usable: 1, + filter(event, player) { + return ( + player.isTurnedOver() && + player != _status.currentPhase && + event.getg(player).length > 0 + ); }, - check(event,player){ - return get.attitude(player,_status.currentPhase)>0; + check(event, player) { + return ( + get.attitude(player, _status.currentPhase) > 0 + ); }, - logTarget(){ + logTarget() { return _status.currentPhase; }, - prompt2:'令该角色摸一张牌', - content(){ + prompt2: "令该角色摸一张牌", + content() { _status.currentPhase.draw(); }, }, - lose:{ - audio:'zhuikong', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + lose: { + audio: "zhuikong", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter(event,player){ - if(event.name=='gain'&&player==event.player) return false; - var evt=event.getl(player); - if(!evt||!evt.cards2||!evt.cards2.length) return false; - return player.isTurnedOver()&&player!=_status.currentPhase&&_status.currentPhase.countCards('he')>0; + filter(event, player) { + if (event.name == "gain" && player == event.player) + return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) + return false; + return ( + player.isTurnedOver() && + player != _status.currentPhase && + _status.currentPhase.countCards("he") > 0 + ); }, - check(event,player){ - var target=_status.currentPhase; - var att=get.attitude(player,target); - if(target.countCards('e',function(card){ - return get.value(card,target)<=0; - })) return att>0; - return att<0; + check(event, player) { + var target = _status.currentPhase; + var att = get.attitude(player, target); + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) + ) + return att > 0; + return att < 0; }, - logTarget(){ + logTarget() { return _status.currentPhase; }, - prompt2:'令该角色弃置一张牌', - content(){ - _status.currentPhase.chooseToDiscard('he',true); + prompt2: "令该角色弃置一张牌", + content() { + _status.currentPhase.chooseToDiscard("he", true); }, }, }, }, - spmixin:{ - audio:'qiuyuan', - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h')>0&&game.countPlayer()>2; + spmixin: { + audio: "qiuyuan", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0 && game.countPlayer() > 2; }, - filterCard:true, - filterTarget:lib.filter.notMe, - position:'h', - selectTarget:2, - targetprompt:['拿牌打人','被打'], - multitarget:true, - delay:false, - discard:false, - lose:false, - check(card){ - if(card.name=='sha') return 4; - return 4-get.value(card); + filterCard: true, + filterTarget: lib.filter.notMe, + position: "h", + selectTarget: 2, + targetprompt: ["拿牌打人", "被打"], + multitarget: true, + delay: false, + discard: false, + lose: false, + check(card) { + if (card.name == "sha") return 4; + return 4 - get.value(card); }, - content(){ - 'step 0' - player.give(cards,targets[0]); - 'step 1' - if(!targets[0].isIn()||!targets[1].isIn()){ + content() { + "step 0"; + player.give(cards, targets[0]); + ("step 1"); + if (!targets[0].isIn() || !targets[1].isIn()) { event.finish(); return; } - targets[0].chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'密信:对'+get.translation(targets[1])+'使用一张【杀】,或令其观看并获得你的一张手牌').set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',targets[1]); - 'step 2' - if(!result.bool&&targets[0].countCards('h')) targets[1].gainPlayerCard(targets[0],'visible','h',true); + targets[0] + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "密信:对" + + get.translation(targets[1]) + + "使用一张【杀】,或令其观看并获得你的一张手牌") + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes( + _status.event.sourcex + ) + ) + return false; + return lib.filter.targetEnabled.apply( + this, + arguments + ); + }) + .set("sourcex", targets[1]); + ("step 2"); + if (!result.bool && targets[0].countCards("h")) + targets[1].gainPlayerCard( + targets[0], + "visible", + "h", + true + ); }, - ai:{ - order:1, - expose:0.1, - result:{ - target(player,target){ - var card=ui.selected.cards[0]; - if(!card) return 0; - if(ui.selected.targets.length==0){ - if(card.name=='sha'||target.hasSha()) return 2; - if(get.value(card,target)<0) return -2; + ai: { + order: 1, + expose: 0.1, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (!card) return 0; + if (ui.selected.targets.length == 0) { + if (card.name == "sha" || target.hasSha()) + return 2; + if (get.value(card, target) < 0) return -2; return 0; } - var target1=ui.selected.targets[0]; - if((card.name=='sha'||target1.hasSha())&&get.effect(target,{name:'sha'},target1,target1)>0) return get.effect(target,{name:'sha'},target1,target); + var target1 = ui.selected.targets[0]; + if ( + (card.name == "sha" || target1.hasSha()) && + get.effect( + target, + { name: "sha" }, + target1, + target1 + ) > 0 + ) + return get.effect( + target, + { name: "sha" }, + target1, + target + ); return 1.5; }, }, }, }, - spfengyin:{ - audio:'moukui', - trigger:{global:'phaseZhunbeiBegin'}, - direct:true, - filter(event,player){ - return player!=event.player&&event.player.hp>=player.hp&&player.countCards('h',function(card){ - if(_status.connectMode) return true; - return get.name(card,player)=='sha'; - })>0; + spfengyin: { + audio: "moukui", + trigger: { global: "phaseZhunbeiBegin" }, + direct: true, + filter(event, player) { + return ( + player != event.player && + event.player.hp >= player.hp && + player.countCards("h", function (card) { + if (_status.connectMode) return true; + return get.name(card, player) == "sha"; + }) > 0 + ); }, - content(){ - 'step 0' - player.chooseCard('h',get.prompt('spfengyin',trigger.player),'交给该角色一张【杀】并令其跳过出牌阶段和弃牌阶段',function(card,player){ - return get.name(card,player)=='sha'; - }).set('ai',function(card){ - if(_status.event.goon) return 5-get.value(card); - return 0; - }).set('goon',function(){ - if(get.attitude(player,trigger.player)>=0) return false; - if(trigger.player.countCards('hs')= 0) + return false; + if ( + trigger.player.countCards("hs") < + trigger.player.hp + ) + return false; + return true; + })() + ); + ("step 1"); + if (result.bool) { + var target = trigger.player; + player.logSkill("spfengyin", target); + player.give(result.cards, target, "give"); + target.skip("phaseUse"); + target.skip("phaseDiscard"); } }, }, - spchizhong:{ - mod:{ - maxHandcardBase(player,num){ + spchizhong: { + mod: { + maxHandcardBase(player, num) { return player.maxHp; }, }, - trigger:{global:'dieAfter'}, - forced:true, - content(){ + trigger: { global: "dieAfter" }, + forced: true, + content() { player.gainMaxHp(); }, }, - fenxin_old:{ - mode:['identity'], - trigger:{source:'dieBegin'}, - init(player){ - player.storage.fenxin=false; + fenxin_old: { + mode: ["identity"], + trigger: { source: "dieBegin" }, + init(player) { + player.storage.fenxin = false; }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - skillAnimation:'epic', - animationColor:'fire', - unique:true, - limited:true, - audio:2, - mark:true, - filter(event,player){ - if(player.storage.fenxin) return false; - return event.player.identity!='zhu'&&player.identity!='zhu'&& - player.identity!='mingzhong'&&event.player.identity!='mingzhong'; + skillAnimation: "epic", + animationColor: "fire", + unique: true, + limited: true, + audio: 2, + mark: true, + filter(event, player) { + if (player.storage.fenxin) return false; + return ( + event.player.identity != "zhu" && + player.identity != "zhu" && + player.identity != "mingzhong" && + event.player.identity != "mingzhong" + ); }, - check(event,player){ - if(player.identity==event.player.identity) return Math.random()<0.5; - var stat=get.situation(); - switch(player.identity){ - case 'fan': - if(stat<0) return false; - if(stat==0) return Math.random()<0.6; + check(event, player) { + if (player.identity == event.player.identity) + return Math.random() < 0.5; + var stat = get.situation(); + switch (player.identity) { + case "fan": + if (stat < 0) return false; + if (stat == 0) return Math.random() < 0.6; return true; - case 'zhong': - if(stat>0) return false; - if(stat==0) return Math.random()<0.6; + case "zhong": + if (stat > 0) return false; + if (stat == 0) return Math.random() < 0.6; return true; - case 'nei': - if(event.player.identity=='fan'&&stat<0) return true; - if(event.player.identity=='zhong'&&stat>0) return true; - if(stat==0) return Math.random()<0.7; + case "nei": + if (event.player.identity == "fan" && stat < 0) + return true; + if (event.player.identity == "zhong" && stat > 0) + return true; + if (stat == 0) return Math.random() < 0.7; return false; } return false; }, - prompt(event,player){ - return '焚心:是否与'+get.translation(event.player)+'交换身份?'; + prompt(event, player) { + return ( + "焚心:是否与" + + get.translation(event.player) + + "交换身份?" + ); }, - content(){ - game.broadcastAll(function(player,target,shown){ - var identity=player.identity; - player.identity=target.identity; - if(shown||player==game.me){ - player.setIdentity(); - } - target.identity=identity; - },player,trigger.player,trigger.player.identityShown); - player.line(trigger.player,'green'); - player.storage.fenxin=true; - player.awakenSkill('fenxin_old'); - } - }, - }, - characterIntro:{ - sunwukong:'孙悟空是中国古典小说《西游记》的主人公,也是中国神话中的民俗神祇之一,明代百回本《西游记》书中最为深入人心的形象之一。《西游记》中的孙悟空本是天地生成的一个石猴,率领群猴在花果山水帘洞过着逍遥自在的日子,后来为学习长生的法术而拜菩提祖师为师,学会了七十二变和筋斗云等绝技。后来他前往东海龙宫夺取如意金箍棒,又大闹地府勾了生死簿,惊动天庭,天庭两次派兵征讨花果山,仍然降他不得,只好请西天如来佛祖前来助阵。如来佛祖以五行山将悟空压在山下五百年。五百年后,悟空在观音菩萨的指点下拜唐僧为师,并跟随唐僧前往西天求取真经。路上唐僧又收了猪八戒、沙和尚两个徒弟,众人在途中斩妖除魔、历经磨难,终于取得真经,修成正果。', - longwang:'东海龙王,名敖广,是中国古代神话传说中的龙族之王,为“四海龙王”之首,亦为所有水族之王。统治东海之洋,主宰着雨水、雷鸣、洪灾、海潮、海啸等。曾下陷东京、水淹陈塘关(影视设定)。在中国以东方为尊位,按周易来说东为阳,故此东海龙王排第一便是理所应当。常记载于《西游记》《封神演义》《三教搜神大全》等文学典籍。东海龙王居于东海的海底水晶宫(花果山瀑布顺流可直抵龙宫)。虽为司雨之神,但其保持着较大的特殊自由性,人间降雨由其它江河湖井龙王完成,很少需要东海龙王亲自降雨。海洋管辖之权为龙王所有,天庭一般任其自治。', - taoshen:'涛神,是司掌钱塘江的神,传说其原型为春秋战国时期的吴国大臣伍子胥。伍子胥从楚国投奔吴国,为吴国立下了汗马功劳;但吴王夫差听信太宰伯嚭的谗言,逐渐疏远了伍子胥,最后还赐死了他。伍子胥含冤身亡,十分悲愤,做出了吴国灭亡的预言后自杀。暴怒的夫差下令用皮革包裹住伍子胥的尸身,在五月五日这天丢进钱塘江。百姓可怜伍子胥忠于吴王却遭受惨死,因此将五月五日这一天定为节日,以此纪念伍子胥,这也是端午节的来历之一。', - libai:'李白(701年2月28日—762年12月),字太白,号青莲居士,祖籍陇西成纪(今甘肃省秦安县),出生于蜀郡绵州昌隆县(一说出生于西域碎叶)。唐朝伟大的浪漫主义诗人,凉武昭王李暠九世孙。
    为人爽朗大方,乐于交友,爱好饮酒作诗,名列“酒中八仙”。曾经得到唐玄宗李隆基赏识,担任翰林学士,赐金放还,游历全国,先后迎娶宰相许圉师、宗楚客的孙女。唐肃宗即位后,卷入永王之乱,流放夜郎,辗转到达当涂县令李阳冰家。上元二年,去世,时年六十二。
    著有《李太白集》,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《早发白帝城》等。李白所作词赋,就其开创意义及艺术成就而言,享有极为崇高的地位,后世誉为“诗仙”,与诗圣杜甫并称“李杜”。', - sunyang:'孙杨,1991年12月1日生于浙江杭州,男子1500米自由泳世界纪录保持者,男子400米自由泳奥运会纪录保持者。年伦敦奥运会男子400米自由泳、男子1500米自由泳冠军;2016年里约奥运会男子200米自由泳冠军。孙杨是世界泳坛历史上唯一一位男子200米自由泳、男子400米自由泳、男子1500米自由泳的奥运会世锦赛大满贯冠军得主,史上唯一一位男子400米自由泳世锦赛四连冠,唯一一位男子800米自由泳世锦赛三连冠,男子自由泳个人单项金牌数居世界第一。', - yeshiwen:'叶诗文,1996年3月1日生于浙江省杭州市,中国女子游泳队运动员,女子200米混合泳奥运会纪录保持者。叶诗文是中国泳坛首位集奥运会、长池世锦赛、短池世锦赛、游泳世界杯、亚运会、全运会冠军于一身的运动员,成为中国泳坛首个金满贯。2010年广州亚运会女子200米和400米个人混合泳冠军。2011年上海世界游泳锦标赛女子200米混合泳冠军。2012年伦敦奥运会女子200米混合泳、400米混合泳冠军。2012年伊斯坦布尔短池世锦赛女子200米混合泳冠军。2013年辽宁全运会女子200米、400米混合泳冠军。2016年里约奥运会女子200米混合泳第八名。2017年天津全运会女子200米混合泳冠军。2019年光州世界游泳锦标赛女子200米混合泳亚军、女子400米混合泳亚军。2018年1月30日,当选为浙江省出席第十三届全国人民代表大会代表。2019年7月28日,2019年韩国光州游泳世锦赛,叶诗文以4分32秒07获得亚军。2021年9月19日,叶诗文获得第十四届全国运动会游泳女子4×200米混合泳接力金牌。9月22日,叶诗文获得全运会女子200米个人混合泳银牌。', - jiben:'吉本(?—218年),东汉末年太医令。建安二十三年春正月,时金祎自以世为汉臣,睹汉祚将移,谓可季兴,乃喟然发愤,遂与太医令本、少府耿纪、司直韦晃、本子邈、邈弟穆等结谋攻许,杀曹公长史王必,南援刘备。后必营,必与典农中郎将严匡讨斩之。在《三国演义》中,吉本在此为吉平或吉太,因字称平,故又唤作吉平。曾参与董承等人刺杀曹操的计划,并企图在为曹操治病时毒死曹操,但被曹操识破而遭处刑。之后其子吉邈和吉穆都参与了由耿纪和韦晃等人所发动的反叛曹操的行动,但都失败被杀。', - xiaoyuehankehan:'小约翰可汗,知乎答主,bilibili知识区up主,其视频以介绍冷门国家和名人为主,因其视频极具特色的幽默风格而知名。代表作包括《奇葩小国》系列和《硬核狠人》系列。昵称里的“小约翰”来源于《纸牌屋》里的主角弗朗西斯·厄克特的外号Little John。家乡在内蒙古通辽市,在《奇葩小国》系列视频中,介绍小国面积和人口时,常用通辽市的面积和人口作为计量单位,后简化为T。1T=6万平方公里或287万人(如:阿富汗面积约为64万平方公里,超过10T)。此梗成为该系列视频的特色之一,可汗也因此被称为“通辽可汗”。', - zhutiexiong:'朱铁雄,福建莆田人,1994年出生,短视频创作者。中国魔法少年的英雄梦,国风变装的热血与浪漫。抖音年度高光时刻作者,国风变装现象级人物。创玩节期间化身三国杀武将,来一场热血变身!', - nezha:'哪吒是中国神话中的民俗神之一,在古典名著《西游记》《封神演义》等及其衍生作品中也多有登场。传说中,哪吒是托塔天王李靖的第三子。哪吒之母怀胎三年,而哪吒出生之时是一个肉球,李靖惊怒之下,用剑劈开了肉球,而哪吒就在肉球中。哪吒广泛流传于道教以及民间传说中,被称为三坛海会大神、威灵显圣大将军、中坛元帅等,民间俗称“三太子”,又常冠其父姓,称为“李哪吒”。哪吒的原型为佛教护法神“那咤”。在不同作品的设定中,哪吒的师承关系有所不同,比如《封神演义》中,哪吒是太乙真人的弟子、元始天尊的徒孙,而《西游记》之中,哪吒则是释迦牟尼(如来佛祖)的弟子。在传说中,哪吒的形象常被形容为可化作三头六臂(封神之中是三头八臂),使用多种武器战斗。比如,《封神演义》中哪吒使用的武器(法宝)为乾坤圈、混天绫、火尖枪和风火轮等,西游记中是斩妖剑、砍妖刀、缚妖索、降妖杵、绣球儿、火轮儿。而哪吒第一次死后被其师父(太乙真人或如来佛祖)以莲花和莲藕复活。', - }, - card:{ - ruyijingubang:{ - fullskin:true, - derivation:'sunwukong', - type:'equip', - subtype:'equip1', - skills:['ruyijingubang_skill','ruyijingubang_effect'], - equipDelay:false, - distance:{ - attackFrom:-2, - attackRange:(card,player)=>{ - return (player.storage.ruyijingubang_skill||3); - } - }, - onEquip(){ - if(!card.storage.ruyijingubang_skill) card.storage.ruyijingubang_skill=3; - player.storage.ruyijingubang_skill=card.storage.ruyijingubang_skill; - player.markSkill('ruyijingubang_skill'); + content() { + game.broadcastAll( + function (player, target, shown) { + var identity = player.identity; + player.identity = target.identity; + if (shown || player == game.me) { + player.setIdentity(); + } + target.identity = identity; + }, + player, + trigger.player, + trigger.player.identityShown + ); + player.line(trigger.player, "green"); + player.storage.fenxin = true; + player.awakenSkill("fenxin_old"); }, }, }, - dynamicTranslate:{ - dcjianxiong(player){ - return '当你受到伤害后,你可以摸'+get.cnNumber(player.countMark('dcjianxiong')+1)+'张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。'; + characterIntro: { + sunwukong: + "孙悟空是中国古典小说《西游记》的主人公,也是中国神话中的民俗神祇之一,明代百回本《西游记》书中最为深入人心的形象之一。《西游记》中的孙悟空本是天地生成的一个石猴,率领群猴在花果山水帘洞过着逍遥自在的日子,后来为学习长生的法术而拜菩提祖师为师,学会了七十二变和筋斗云等绝技。后来他前往东海龙宫夺取如意金箍棒,又大闹地府勾了生死簿,惊动天庭,天庭两次派兵征讨花果山,仍然降他不得,只好请西天如来佛祖前来助阵。如来佛祖以五行山将悟空压在山下五百年。五百年后,悟空在观音菩萨的指点下拜唐僧为师,并跟随唐僧前往西天求取真经。路上唐僧又收了猪八戒、沙和尚两个徒弟,众人在途中斩妖除魔、历经磨难,终于取得真经,修成正果。", + longwang: + "东海龙王,名敖广,是中国古代神话传说中的龙族之王,为“四海龙王”之首,亦为所有水族之王。统治东海之洋,主宰着雨水、雷鸣、洪灾、海潮、海啸等。曾下陷东京、水淹陈塘关(影视设定)。在中国以东方为尊位,按周易来说东为阳,故此东海龙王排第一便是理所应当。常记载于《西游记》《封神演义》《三教搜神大全》等文学典籍。东海龙王居于东海的海底水晶宫(花果山瀑布顺流可直抵龙宫)。虽为司雨之神,但其保持着较大的特殊自由性,人间降雨由其它江河湖井龙王完成,很少需要东海龙王亲自降雨。海洋管辖之权为龙王所有,天庭一般任其自治。", + taoshen: + "涛神,是司掌钱塘江的神,传说其原型为春秋战国时期的吴国大臣伍子胥。伍子胥从楚国投奔吴国,为吴国立下了汗马功劳;但吴王夫差听信太宰伯嚭的谗言,逐渐疏远了伍子胥,最后还赐死了他。伍子胥含冤身亡,十分悲愤,做出了吴国灭亡的预言后自杀。暴怒的夫差下令用皮革包裹住伍子胥的尸身,在五月五日这天丢进钱塘江。百姓可怜伍子胥忠于吴王却遭受惨死,因此将五月五日这一天定为节日,以此纪念伍子胥,这也是端午节的来历之一。", + libai: "李白(701年2月28日—762年12月),字太白,号青莲居士,祖籍陇西成纪(今甘肃省秦安县),出生于蜀郡绵州昌隆县(一说出生于西域碎叶)。唐朝伟大的浪漫主义诗人,凉武昭王李暠九世孙。
    为人爽朗大方,乐于交友,爱好饮酒作诗,名列“酒中八仙”。曾经得到唐玄宗李隆基赏识,担任翰林学士,赐金放还,游历全国,先后迎娶宰相许圉师、宗楚客的孙女。唐肃宗即位后,卷入永王之乱,流放夜郎,辗转到达当涂县令李阳冰家。上元二年,去世,时年六十二。
    著有《李太白集》,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《早发白帝城》等。李白所作词赋,就其开创意义及艺术成就而言,享有极为崇高的地位,后世誉为“诗仙”,与诗圣杜甫并称“李杜”。", + sunyang: + "孙杨,1991年12月1日生于浙江杭州,男子1500米自由泳世界纪录保持者,男子400米自由泳奥运会纪录保持者。年伦敦奥运会男子400米自由泳、男子1500米自由泳冠军;2016年里约奥运会男子200米自由泳冠军。孙杨是世界泳坛历史上唯一一位男子200米自由泳、男子400米自由泳、男子1500米自由泳的奥运会世锦赛大满贯冠军得主,史上唯一一位男子400米自由泳世锦赛四连冠,唯一一位男子800米自由泳世锦赛三连冠,男子自由泳个人单项金牌数居世界第一。", + yeshiwen: + "叶诗文,1996年3月1日生于浙江省杭州市,中国女子游泳队运动员,女子200米混合泳奥运会纪录保持者。叶诗文是中国泳坛首位集奥运会、长池世锦赛、短池世锦赛、游泳世界杯、亚运会、全运会冠军于一身的运动员,成为中国泳坛首个金满贯。2010年广州亚运会女子200米和400米个人混合泳冠军。2011年上海世界游泳锦标赛女子200米混合泳冠军。2012年伦敦奥运会女子200米混合泳、400米混合泳冠军。2012年伊斯坦布尔短池世锦赛女子200米混合泳冠军。2013年辽宁全运会女子200米、400米混合泳冠军。2016年里约奥运会女子200米混合泳第八名。2017年天津全运会女子200米混合泳冠军。2019年光州世界游泳锦标赛女子200米混合泳亚军、女子400米混合泳亚军。2018年1月30日,当选为浙江省出席第十三届全国人民代表大会代表。2019年7月28日,2019年韩国光州游泳世锦赛,叶诗文以4分32秒07获得亚军。2021年9月19日,叶诗文获得第十四届全国运动会游泳女子4×200米混合泳接力金牌。9月22日,叶诗文获得全运会女子200米个人混合泳银牌。", + jiben: "吉本(?—218年),东汉末年太医令。建安二十三年春正月,时金祎自以世为汉臣,睹汉祚将移,谓可季兴,乃喟然发愤,遂与太医令本、少府耿纪、司直韦晃、本子邈、邈弟穆等结谋攻许,杀曹公长史王必,南援刘备。后必营,必与典农中郎将严匡讨斩之。在《三国演义》中,吉本在此为吉平或吉太,因字称平,故又唤作吉平。曾参与董承等人刺杀曹操的计划,并企图在为曹操治病时毒死曹操,但被曹操识破而遭处刑。之后其子吉邈和吉穆都参与了由耿纪和韦晃等人所发动的反叛曹操的行动,但都失败被杀。", + xiaoyuehankehan: + '小约翰可汗,知乎答主,bilibili知识区up主,其视频以介绍冷门国家和名人为主,因其视频极具特色的幽默风格而知名。代表作包括《奇葩小国》系列和《硬核狠人》系列。昵称里的“小约翰”来源于《纸牌屋》里的主角弗朗西斯·厄克特的外号Little John。家乡在内蒙古通辽市,在《奇葩小国》系列视频中,介绍小国面积和人口时,常用通辽市的面积和人口作为计量单位,后简化为T。1T=6万平方公里或287万人(如:阿富汗面积约为64万平方公里,超过10T)。此梗成为该系列视频的特色之一,可汗也因此被称为“通辽可汗”。', + zhutiexiong: + "朱铁雄,福建莆田人,1994年出生,短视频创作者。中国魔法少年的英雄梦,国风变装的热血与浪漫。抖音年度高光时刻作者,国风变装现象级人物。创玩节期间化身三国杀武将,来一场热血变身!", + nezha: "哪吒是中国神话中的民俗神之一,在古典名著《西游记》《封神演义》等及其衍生作品中也多有登场。传说中,哪吒是托塔天王李靖的第三子。哪吒之母怀胎三年,而哪吒出生之时是一个肉球,李靖惊怒之下,用剑劈开了肉球,而哪吒就在肉球中。哪吒广泛流传于道教以及民间传说中,被称为三坛海会大神、威灵显圣大将军、中坛元帅等,民间俗称“三太子”,又常冠其父姓,称为“李哪吒”。哪吒的原型为佛教护法神“那咤”。在不同作品的设定中,哪吒的师承关系有所不同,比如《封神演义》中,哪吒是太乙真人的弟子、元始天尊的徒孙,而《西游记》之中,哪吒则是释迦牟尼(如来佛祖)的弟子。在传说中,哪吒的形象常被形容为可化作三头六臂(封神之中是三头八臂),使用多种武器战斗。比如,《封神演义》中哪吒使用的武器(法宝)为乾坤圈、混天绫、火尖枪和风火轮等,西游记中是斩妖剑、砍妖刀、缚妖索、降妖杵、绣球儿、火轮儿。而哪吒第一次死后被其师父(太乙真人或如来佛祖)以莲花和莲藕复活。", + }, + card: { + ruyijingubang: { + fullskin: true, + derivation: "sunwukong", + type: "equip", + subtype: "equip1", + skills: ["ruyijingubang_skill", "ruyijingubang_effect"], + equipDelay: false, + distance: { + attackFrom: -2, + attackRange: (card, player) => { + return player.storage.ruyijingubang_skill || 3; + }, + }, + onEquip() { + if (!card.storage.ruyijingubang_skill) + card.storage.ruyijingubang_skill = 3; + player.storage.ruyijingubang_skill = + card.storage.ruyijingubang_skill; + player.markSkill("ruyijingubang_skill"); + }, }, }, - translate:{ - old_lingju:'SP灵雎', - old_lingju_prefix:'SP', - fenxin_old:'焚心', - fenxin_old_info:'限定技,当你杀死一名非主公角色时,你可以与其交换未翻开的身份牌。(你的身份为主公时不能发动此技能)', - sp_fuwan:'SP伏完', - sp_fuwan_prefix:'SP', - spfengyin:'奉印', - spfengyin_info:'其他角色的回合开始时,若其体力值不少于你,你可以交给其一张【杀】,令其跳过出牌阶段和弃牌阶段。', - spchizhong:'持重', - spchizhong_info:'锁定技,你的手牌上限等于体力上限;其他角色死亡时,你加1点体力上限。', - sp_fuhuanghou:'SP伏寿', - sp_fuhuanghou_prefix:'SP', - spcangni:'藏匿', - spcangni_info:'弃牌阶段开始时,你可以回复1点体力或摸两张牌,然后将你的武将牌翻面;其他角色的回合内,当你获得(每回合限一次)/失去一次牌时,若你的武将牌背面朝上,你可以令该角色摸/弃置一张牌。', - spmixin:'密信', - spmixin_info:'出牌阶段限一次,你可以将一张手牌交给一名其他角色,该角色须对你选择的另一名角色使用一张无距离限制的【杀】,否则你选择的角色观看其手牌并获得其中一张。', - sp_jiben:'SP吉本', - sp_jiben_prefix:'SP', - spduanzhi:'断指', - spduanzhi_info:'当你成为其他角色使用的牌的目标后,你可以弃置其至多两张牌,然后失去1点体力。', - spduyi:'毒医', - spduyi2:'毒医', - spduyi_info:'出牌阶段限一次,你可以亮出牌堆顶的一张牌并交给一名角色,若此牌为黑色,该角色不能使用或打出手牌,直到回到结束。', - sp_mushun:'SP穆顺', - sp_mushun_prefix:'SP', - libai:'李白', - dclbjiuxian:'酒仙', - dclbjiuxian_info:'①你可以将额定目标数大于1的锦囊牌当做【酒】使用。②你使用【酒】无次数限制。', - dcshixian:'诗仙', - dcshixian_yayun:'押韵', - dcshixian_info:'当你使用一张牌时,若此牌的牌名与你于本局游戏使用的上一张牌的牌名押韵,则你可以摸一张牌,并令此牌额外结算一次。', - taoshen:'涛神', - dcnutao:'怒涛', - dcnutao_info:'锁定技。①当你使用锦囊牌指定第一个目标时,若目标角色包含其他角色,你随机对其中一名其他目标角色造成1点雷电伤害。②当你于出牌阶段造成雷电伤害后,你于此阶段使用【杀】的次数上限+1。', - sunwukong:'孙悟空', - dcjinjing:'金睛', - dcjinjing_info:'锁定技。其他角色的手牌对你可见。', - dccibei:'慈悲', - dccibei_info:'每回合每名角色限一次。当你对其他角色造成伤害时,你可以防止此伤害,然后摸五张牌。', - dcruyi:'如意', - dcruyi_info:'锁定技。①游戏开始时,你将【如意金箍棒】置入装备区。②你手牌区内的武器牌均视为【杀】,且你不是武器牌的合法目标。③当你即将失去【如意金箍棒】或即将废除武器栏时,取消之。④你不能将装备区内的【如意金箍棒】当做其他牌使用或打出。', - ruyijingubang:'如意金箍棒', + dynamicTranslate: { + dcjianxiong(player) { + return ( + "当你受到伤害后,你可以摸" + + get.cnNumber(player.countMark("dcjianxiong") + 1) + + "张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。" + ); + }, + }, + translate: { + old_lingju: "SP灵雎", + old_lingju_prefix: "SP", + fenxin_old: "焚心", + fenxin_old_info: + "限定技,当你杀死一名非主公角色时,你可以与其交换未翻开的身份牌。(你的身份为主公时不能发动此技能)", + sp_fuwan: "SP伏完", + sp_fuwan_prefix: "SP", + spfengyin: "奉印", + spfengyin_info: + "其他角色的回合开始时,若其体力值不少于你,你可以交给其一张【杀】,令其跳过出牌阶段和弃牌阶段。", + spchizhong: "持重", + spchizhong_info: + "锁定技,你的手牌上限等于体力上限;其他角色死亡时,你加1点体力上限。", + sp_fuhuanghou: "SP伏寿", + sp_fuhuanghou_prefix: "SP", + spcangni: "藏匿", + spcangni_info: + "弃牌阶段开始时,你可以回复1点体力或摸两张牌,然后将你的武将牌翻面;其他角色的回合内,当你获得(每回合限一次)/失去一次牌时,若你的武将牌背面朝上,你可以令该角色摸/弃置一张牌。", + spmixin: "密信", + spmixin_info: + "出牌阶段限一次,你可以将一张手牌交给一名其他角色,该角色须对你选择的另一名角色使用一张无距离限制的【杀】,否则你选择的角色观看其手牌并获得其中一张。", + sp_jiben: "SP吉本", + sp_jiben_prefix: "SP", + spduanzhi: "断指", + spduanzhi_info: + "当你成为其他角色使用的牌的目标后,你可以弃置其至多两张牌,然后失去1点体力。", + spduyi: "毒医", + spduyi2: "毒医", + spduyi_info: + "出牌阶段限一次,你可以亮出牌堆顶的一张牌并交给一名角色,若此牌为黑色,该角色不能使用或打出手牌,直到回到结束。", + sp_mushun: "SP穆顺", + sp_mushun_prefix: "SP", + libai: "李白", + dclbjiuxian: "酒仙", + dclbjiuxian_info: + "①你可以将额定目标数大于1的锦囊牌当做【酒】使用。②你使用【酒】无次数限制。", + dcshixian: "诗仙", + dcshixian_yayun: "押韵", + dcshixian_info: + "当你使用一张牌时,若此牌的牌名与你于本局游戏使用的上一张牌的牌名押韵,则你可以摸一张牌,并令此牌额外结算一次。", + taoshen: "涛神", + dcnutao: "怒涛", + dcnutao_info: + "锁定技。①当你使用锦囊牌指定第一个目标时,若目标角色包含其他角色,你随机对其中一名其他目标角色造成1点雷电伤害。②当你于出牌阶段造成雷电伤害后,你于此阶段使用【杀】的次数上限+1。", + sunwukong: "孙悟空", + dcjinjing: "金睛", + dcjinjing_info: "锁定技。其他角色的手牌对你可见。", + dccibei: "慈悲", + dccibei_info: + "每回合每名角色限一次。当你对其他角色造成伤害时,你可以防止此伤害,然后摸五张牌。", + dcruyi: "如意", + dcruyi_info: + "锁定技。①游戏开始时,你将【如意金箍棒】置入装备区。②你手牌区内的武器牌均视为【杀】,且你不是武器牌的合法目标。③当你即将失去【如意金箍棒】或即将废除武器栏时,取消之。④你不能将装备区内的【如意金箍棒】当做其他牌使用或打出。", + ruyijingubang: "如意金箍棒", // ruyijingubang_skill:'如意', - ruyijingubang_skill:'如意金箍棒', - ruyijingubang_effect:'如意金箍棒', - ruyijingubang_info:'出牌阶段限一次。你可以将此牌的实际攻击范围调整为1~4内的任意整数。你根据此牌的实际攻击范围拥有对应的效果:
  • ⑴你使用【杀】无次数限制。
  • ⑵你使用的【杀】伤害+1。
  • ⑶你使用的【杀】不可被响应。
  • ⑷你使用【杀】选择目标后,可以增加一个额外目标。', - longwang:'龙王', - dclonggong:'龙宫', - dclonggong_info:'每回合限一次。当你受到伤害时,你可以防止此伤害,然后令伤害来源从牌堆中获得一张装备牌。', - dcsitian:'司天', - dcsitian_info:'出牌阶段,你可以弃置两张颜色不同的手牌。系统从所有天气中随机选择两个,你观看这些天气并选择一个执行。
  • 烈日:你对其他角色依次造成1点火属性伤害。
  • 雷电:你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。
  • 大浪:你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。
  • 暴雨:你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。
  • 大雾:你令所有其他角色获得如下效果:当其使用下一张锦囊牌时,取消之。', - sunyang:'孙杨', - clbshuijian:'水箭', - clbshuijian_info:'摸牌阶段开始时,你可以令额定摸牌数+X(X为你装备区内牌数的一半+1,且向下取整)。', - yeshiwen:'叶诗文', - clbjisu:'急速', - clbjisu_info:'判定阶段开始前,你可以跳过本回合的判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】。', - clbshuiyong:'水泳', - clbshuiyong_info:'锁定技。当你受到火属性伤害时,取消之。', - xiaoyuehankehan:'小约翰可汗', - dctongliao:'通辽', - dctongliao_info:'①摸牌阶段结束时,你可以选择一张点数最小的手牌,将此牌标记为“通辽”。②当你失去一张具有“通辽”标签的牌时,你摸X张牌(X为此牌点数)。', - dcwudao:'悟道', - dcwudao_info:'当你使用牌结算结束后,若你使用的上一张牌与此牌类型相同,则你可以于本回合内获得如下效果:当你于回合内使用该类型的牌时,你令此牌不可被响应且伤害值基数+1。', - zhutiexiong:'朱铁雄', - wu_zhutiexiong:'朱铁雄', - dcbianzhuang:'变装', - dcbianzhuang_info:'①出牌阶段限一次,你可以从系统随机选择的两个技能中获得一个,并视为使用一张【杀】(无距离次数限制),然后失去以此法获得的技能。②当你使用装备牌后,你清空此技能的发动次数记录。③当你发动〖变装①〗后,若你发动〖变装①〗的次数大于2,则你将武将牌变更为诸葛亮,并将系统选择的技能数改为三个。', - dc_caocao:'经典曹操', - dc_caocao_prefix:'经典', - dcjianxiong:'奸雄', - dcjianxiong_info:'当你受到伤害后,你可以摸一张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。', - dc_liubei:'经典刘备', - dc_liubei_prefix:'经典', - dcrende:'仁德', - dcrende_info:'出牌阶段每名角色限一次。你可以获得一名其他角色两张手牌,然后视为使用一张基本牌。', - dc_sunquan:'经典孙权', - dc_sunquan_prefix:'经典', - dczhiheng:'制衡', - dczhiheng_info:'①出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。②每回合每名角色限一次。当你对其他角色造成伤害后,你令〖制衡①〗于此回合发动次数上限+1。', - nezha:'哪吒', - dcsantou:'三头', - dcsantou_info:'锁定技,当你受到伤害时,防止之,然后若以下有条件成立,你失去1点体力:1.你于本回合此前以此法防止过该伤害来源的伤害,且你的体力值不小于3;2.本次伤害为属性伤害,且你的体力值为2;3.本次伤害的渠道为红色的牌,且你的体力值为1。', - dcfaqi:'法器', - dcfaqi_info:'当你于出牌阶段使用装备牌结算结束后,你视为使用一张本回合未以此法使用过的普通锦囊牌。', - dc_sunce:'经典孙策', - dc_sunce_prefix:'经典', - dcshuangbi:'双壁', - dcshuangbi_info:'出牌阶段限一次,你可以选择一项:①摸X张牌,本回合手牌上限+X;②弃置至多X张牌,随机对其他角色造成等量火焰伤害;③视为使用X张火【杀】或【火攻】。(X为场上存活角色数)', - dc_zhaoyun:'经典神赵云', - dc_zhaoyun_prefix:'经典神', - dclonghun:'龙魂', - dclonghun_info:'每回合限20次,你可以将你的牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。', - dczhanjiang:'斩将', - dczhanjiang_info:'准备阶段,若场上有【青釭剑】,则你可以获得之。', + ruyijingubang_skill: "如意金箍棒", + ruyijingubang_effect: "如意金箍棒", + ruyijingubang_info: + "出牌阶段限一次。你可以将此牌的实际攻击范围调整为1~4内的任意整数。你根据此牌的实际攻击范围拥有对应的效果:
  • ⑴你使用【杀】无次数限制。
  • ⑵你使用的【杀】伤害+1。
  • ⑶你使用的【杀】不可被响应。
  • ⑷你使用【杀】选择目标后,可以增加一个额外目标。", + longwang: "龙王", + dclonggong: "龙宫", + dclonggong_info: + "每回合限一次。当你受到伤害时,你可以防止此伤害,然后令伤害来源从牌堆中获得一张装备牌。", + dcsitian: "司天", + dcsitian_info: + "出牌阶段,你可以弃置两张颜色不同的手牌。系统从所有天气中随机选择两个,你观看这些天气并选择一个执行。
  • 烈日:你对其他角色依次造成1点火属性伤害。
  • 雷电:你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。
  • 大浪:你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。
  • 暴雨:你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。
  • 大雾:你令所有其他角色获得如下效果:当其使用下一张锦囊牌时,取消之。", + sunyang: "孙杨", + clbshuijian: "水箭", + clbshuijian_info: + "摸牌阶段开始时,你可以令额定摸牌数+X(X为你装备区内牌数的一半+1,且向下取整)。", + yeshiwen: "叶诗文", + clbjisu: "急速", + clbjisu_info: + "判定阶段开始前,你可以跳过本回合的判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】。", + clbshuiyong: "水泳", + clbshuiyong_info: "锁定技。当你受到火属性伤害时,取消之。", + xiaoyuehankehan: "小约翰可汗", + dctongliao: "通辽", + dctongliao_info: + "①摸牌阶段结束时,你可以选择一张点数最小的手牌,将此牌标记为“通辽”。②当你失去一张具有“通辽”标签的牌时,你摸X张牌(X为此牌点数)。", + dcwudao: "悟道", + dcwudao_info: + "当你使用牌结算结束后,若你使用的上一张牌与此牌类型相同,则你可以于本回合内获得如下效果:当你于回合内使用该类型的牌时,你令此牌不可被响应且伤害值基数+1。", + zhutiexiong: "朱铁雄", + wu_zhutiexiong: "朱铁雄", + dcbianzhuang: "变装", + dcbianzhuang_info: + "①出牌阶段限一次,你可以从系统随机选择的两个技能中获得一个,并视为使用一张【杀】(无距离次数限制),然后失去以此法获得的技能。②当你使用装备牌后,你清空此技能的发动次数记录。③当你发动〖变装①〗后,若你发动〖变装①〗的次数大于2,则你将武将牌变更为诸葛亮,并将系统选择的技能数改为三个。", + dc_caocao: "经典曹操", + dc_caocao_prefix: "经典", + dcjianxiong: "奸雄", + dcjianxiong_info: + "当你受到伤害后,你可以摸一张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。", + dc_liubei: "经典刘备", + dc_liubei_prefix: "经典", + dcrende: "仁德", + dcrende_info: + "出牌阶段每名角色限一次。你可以获得一名其他角色两张手牌,然后视为使用一张基本牌。", + dc_sunquan: "经典孙权", + dc_sunquan_prefix: "经典", + dczhiheng: "制衡", + dczhiheng_info: + "①出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。②每回合每名角色限一次。当你对其他角色造成伤害后,你令〖制衡①〗于此回合发动次数上限+1。", + nezha: "哪吒", + dcsantou: "三头", + dcsantou_info: + "锁定技,当你受到伤害时,防止之,然后若以下有条件成立,你失去1点体力:1.你于本回合此前以此法防止过该伤害来源的伤害,且你的体力值不小于3;2.本次伤害为属性伤害,且你的体力值为2;3.本次伤害的渠道为红色的牌,且你的体力值为1。", + dcfaqi: "法器", + dcfaqi_info: + "当你于出牌阶段使用装备牌结算结束后,你视为使用一张本回合未以此法使用过的普通锦囊牌。", + dc_sunce: "经典孙策", + dc_sunce_prefix: "经典", + dcshuangbi: "双壁", + dcshuangbi_info: + "出牌阶段限一次,你可以选择一项:①摸X张牌,本回合手牌上限+X;②弃置至多X张牌,随机对其他角色造成等量火焰伤害;③视为使用X张火【杀】或【火攻】。(X为场上存活角色数)", + dc_zhaoyun: "经典神赵云", + dc_zhaoyun_prefix: "经典神", + dclonghun: "龙魂", + dclonghun_info: + "每回合限20次,你可以将你的牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。", + dczhanjiang: "斩将", + dczhanjiang_info: "准备阶段,若场上有【青釭剑】,则你可以获得之。", - collab_olympic:'OL·伦敦奥运会', - collab_tongque:'OL·铜雀台', - collab_duanwu:'新服·端午畅玩', - collab_decade:'新服·创玩节', - collab_remake:'新服·共创武将', + collab_olympic: "OL·伦敦奥运会", + collab_tongque: "OL·铜雀台", + collab_duanwu: "新服·端午畅玩", + collab_decade: "新服·创玩节", + collab_remake: "新服·共创武将", }, }; }); diff --git a/character/ddd.js b/character/ddd.js index 530a2ec85..d7fe9f88e 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -1,764 +1,1151 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'ddd', - connect:true, - character:{ - ddd_handang:["male","wu",4,["dddxianxi"]], + name: "ddd", + connect: true, + character: { + ddd_handang: ["male", "wu", 4, ["dddxianxi"]], // ddd_wuzhi:["male","wei",3,["dddlingyong","dddxuxiao"]], - ddd_xujing:["male","shu",3,["dddxuyu","dddshijian"]], + ddd_xujing: ["male", "shu", 3, ["dddxuyu", "dddshijian"]], // ddd_caomao:["male","wei",3,["dddtaisi","dddquche","dddqianlong"],["zhu"]], // ddd_xinxianying:["female","wei",3,["ddddongcha","dddzhijie"]], - ddd_xianglang:["male","shu",3,["dddqiahua","dddfusi","dddtuoji"]], - ddd_yujin:['male','wei',4,['dddzhengjun']], - ddd_liuye:['male','wei',3,['dddchashi','dddqice']], - ddd_baosanniang:['female','shu',3,['dddzhilian','dddjijian']], + ddd_xianglang: [ + "male", + "shu", + 3, + ["dddqiahua", "dddfusi", "dddtuoji"], + ], + ddd_yujin: ["male", "wei", 4, ["dddzhengjun"]], + ddd_liuye: ["male", "wei", 3, ["dddchashi", "dddqice"]], + ddd_baosanniang: ["female", "shu", 3, ["dddzhilian", "dddjijian"]], // ddd_zhenji:['female','wei',3,['dddmiaoxing','dddfushi']], - ddd_zhaoang:['male','wei',4,['dddfenji']], - ddd_zhouchu:['male','wu',5,['dddxiaheng']], - ddd_liuba:['male','shu',3,['dddfengzheng','dddyulv']], - ddd_jianshuo:['male','qun',4,['dddfenye','dddshichao']], - ddd_guanning:['male','qun',3,['dddyouxue','dddchengjing']], - ddd_dingfeng:['male','wu',4,['dddduanbing']], - ddd_caoshuang:['male','wei',5,['dddzhuanshe','dddweiqiu']], - ddd_xuelingyun:['female','wei',3,['dddlianer','dddanzhi']], - ddd_liuhong:['male','qun',4,['dddshixing','ddddanggu','dddfuzong'],['zhu']], - ddd_xiahouxuan:['male','wei',3,['dddlanghuai','dddxuanlun']], - ddd_zhangkai:['male','qun','3/4',['dddjiexing','dddbailei']], - ddd_liangxi:['male','wei',4,['dddtongyu']], - ddd_wangkanglvkai:['male','shu',4,['dddbingjian']], + ddd_zhaoang: ["male", "wei", 4, ["dddfenji"]], + ddd_zhouchu: ["male", "wu", 5, ["dddxiaheng"]], + ddd_liuba: ["male", "shu", 3, ["dddfengzheng", "dddyulv"]], + ddd_jianshuo: ["male", "qun", 4, ["dddfenye", "dddshichao"]], + ddd_guanning: ["male", "qun", 3, ["dddyouxue", "dddchengjing"]], + ddd_dingfeng: ["male", "wu", 4, ["dddduanbing"]], + ddd_caoshuang: ["male", "wei", 5, ["dddzhuanshe", "dddweiqiu"]], + ddd_xuelingyun: ["female", "wei", 3, ["dddlianer", "dddanzhi"]], + ddd_liuhong: [ + "male", + "qun", + 4, + ["dddshixing", "ddddanggu", "dddfuzong"], + ["zhu"], + ], + ddd_xiahouxuan: ["male", "wei", 3, ["dddlanghuai", "dddxuanlun"]], + ddd_zhangkai: ["male", "qun", "3/4", ["dddjiexing", "dddbailei"]], + ddd_liangxi: ["male", "wei", 4, ["dddtongyu"]], + ddd_wangkanglvkai: ["male", "shu", 4, ["dddbingjian"]], // ddd_sunliang:['male','wu',3,['ddddiedang','dddanliu','dddguiying'],['zhu']], - ddd_lie:['female','wu',3,['dddyeshen','dddqiaoduan']], - ddd_kebineng:['male','qun',4,['dddxiaoxing','dddlangzhi','dddfuyi'],['zhu']], - ddd_qianzhao:['male','wei',4,['dddyuanzhen','dddzhishu']], - ddd_zhangmiao:['male','qun',4,['dddxiaxing']], - ddd_zhangcheng:['male','wu',3,['dddjuxian','dddjungui']], - ddd_liuchong:['male','qun',4,['dddjinggou','dddmoyan']], - ddd_luoxian:['male','shu',4,['dddshilie']], + ddd_lie: ["female", "wu", 3, ["dddyeshen", "dddqiaoduan"]], + ddd_kebineng: [ + "male", + "qun", + 4, + ["dddxiaoxing", "dddlangzhi", "dddfuyi"], + ["zhu"], + ], + ddd_qianzhao: ["male", "wei", 4, ["dddyuanzhen", "dddzhishu"]], + ddd_zhangmiao: ["male", "qun", 4, ["dddxiaxing"]], + ddd_zhangcheng: ["male", "wu", 3, ["dddjuxian", "dddjungui"]], + ddd_liuchong: ["male", "qun", 4, ["dddjinggou", "dddmoyan"]], + ddd_luoxian: ["male", "shu", 4, ["dddshilie"]], }, - characterFilter:{}, - characterSort:{}, - characterTitle:{ - ddd_handang:'#g晓ャ绝对', - ddd_wuzhi:'#g沸治·克里夫', - ddd_xujing:'#g沸治·克里夫', - ddd_caomao:'#gRocxu', - ddd_xinxianying:'#g好孩子系我', - ddd_xianglang:'#g会乱武的袁绍', - ddd_liuye:'#g好孩子系我', - ddd_baosanniang:'#g会乱武的袁绍', - ddd_wangkanglvkai:'#g扬林', - ddd_yujin:'#g虎鲸', - ddd_caoshuang:'#g辰木', - ddd_zhenji:'#g巴德', - ddd_zhaoang:'#g君腾天下', - ddd_xuelingyun:'#gGENTOVA07', - ddd_liuhong:'#g拉普拉斯', - ddd_xiahouxuan:'#g好孩子系我', - ddd_zhouchu:'#g志文', - ddd_kebineng:'#g晨星', - ddd_zhangkai:'#g拼音', - ddd_liuba:'#g浅水', - ddd_jianshuo:'#g浅水', - ddd_guanning:'#g虎鲸', - ddd_lie:'#gyyuaN', - ddd_liangxi:'#g先負', + characterFilter: {}, + characterSort: {}, + characterTitle: { + ddd_handang: "#g晓ャ绝对", + ddd_wuzhi: "#g沸治·克里夫", + ddd_xujing: "#g沸治·克里夫", + ddd_caomao: "#gRocxu", + ddd_xinxianying: "#g好孩子系我", + ddd_xianglang: "#g会乱武的袁绍", + ddd_liuye: "#g好孩子系我", + ddd_baosanniang: "#g会乱武的袁绍", + ddd_wangkanglvkai: "#g扬林", + ddd_yujin: "#g虎鲸", + ddd_caoshuang: "#g辰木", + ddd_zhenji: "#g巴德", + ddd_zhaoang: "#g君腾天下", + ddd_xuelingyun: "#gGENTOVA07", + ddd_liuhong: "#g拉普拉斯", + ddd_xiahouxuan: "#g好孩子系我", + ddd_zhouchu: "#g志文", + ddd_kebineng: "#g晨星", + ddd_zhangkai: "#g拼音", + ddd_liuba: "#g浅水", + ddd_jianshuo: "#g浅水", + ddd_guanning: "#g虎鲸", + ddd_lie: "#gyyuaN", + ddd_liangxi: "#g先負", // ddd_liuchong:'#g', - ddd_luoxian:'#g绝代倾国倾城貌', + ddd_luoxian: "#g绝代倾国倾城貌", }, /** @type { importCharacterConfig['skill'] } */ - skill:{ + skill: { //牵招 - dddyuanzhen:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - forced:true, - filter(event,player){ - return event.target!=player&&get.distance(player,event.target)!=1&&event.isFirstTarget&&event.targets.length==1; + dddyuanzhen: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return ( + event.target != player && + get.distance(player, event.target) != 1 && + event.isFirstTarget && + event.targets.length == 1 + ); }, - logTarget:'target', - *content(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.target; + logTarget: "target", + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.target; let result; game.delayex(); - if(!target.countCards('he')) result={bool:false}; - else result=yield target.chooseToDiscard('he',`${get.translation(player)}对你使用了【远振】`,'请弃置一张牌,或点击“取消”令其摸一张牌').set('ai',card=>{ - if(get.event('goon')) return 4.5-get.value(card); - }).set('goon',get.attitude(target,player)>0); - if(!result.bool){ + if (!target.countCards("he")) result = { bool: false }; + else + result = yield target + .chooseToDiscard( + "he", + `${get.translation(player)}对你使用了【远振】`, + "请弃置一张牌,或点击“取消”令其摸一张牌" + ) + .set("ai", (card) => { + if (get.event("goon")) + return 4.5 - get.value(card); + }) + .set("goon", get.attitude(target, player) > 0); + if (!result.bool) { target.line(player); player.draw(); } }, }, - dddzhishu:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return player.canMoveCard(null,true); + dddzhishu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return player.canMoveCard(null, true); }, - check(event,player){ - return player.canMoveCard(true,true); + check(event, player) { + return player.canMoveCard(true, true); + }, + *content(event, map) { + const player = map.player; + let result = yield player.moveCard(); + const targets = result.targets; + const guohe = new lib.element.VCard({ + name: "guohe", + isCard: true, + }); + if (targets[0].canUse(guohe, targets[1])) + targets[0].useCard(guohe, targets[1], "noai"); }, - *content(event,map){ - const player=map.player; - let result=yield player.moveCard(); - const targets=result.targets; - const guohe=new lib.element.VCard({name:'guohe',isCard:true}); - if(targets[0].canUse(guohe,targets[1])) targets[0].useCard(guohe,targets[1],'noai'); - } }, //张邈 - dddxiaxing:{ - audio:2, - enable:'chooseToUse', - hiddenCard(player,name){ - if(player.hasSkill('dddxiaxing_used')) return false; - return name=='tao'; + dddxiaxing: { + audio: 2, + enable: "chooseToUse", + hiddenCard(player, name) { + if (player.hasSkill("dddxiaxing_used")) return false; + return name == "tao"; }, - filter(event,player){ - if(event.type!='dying') return false; - if(!player.countCards('he')) return false; - const evt=get.event().getParent('_save'); - if(!evt||!evt.dying||!evt.dying.isIn()) return false; - return !player.hasSkill('dddxiaxing_used'); + filter(event, player) { + if (event.type != "dying") return false; + if (!player.countCards("he")) return false; + const evt = get.event().getParent("_save"); + if (!evt || !evt.dying || !evt.dying.isIn()) return false; + return !player.hasSkill("dddxiaxing_used"); }, - check:card=>{ - return 7-get.value(card); + check: (card) => { + return 7 - get.value(card); }, - filterCard:true, - position:'he', - discard:false, - delay:false, - lose:false, - group:['dddxiaxing_begin','dddxiaxing_viewas'], - prompt(){ - const evt=get.event().getParent('_save'); - return `将一张牌置于牌堆顶,视为${get.translation(evt.dying)}使用一张【桃】`; + filterCard: true, + position: "he", + discard: false, + delay: false, + lose: false, + group: ["dddxiaxing_begin", "dddxiaxing_viewas"], + prompt() { + const evt = get.event().getParent("_save"); + return `将一张牌置于牌堆顶,视为${get.translation( + evt.dying + )}使用一张【桃】`; }, - *content(event,map){ - const player=map.player,cards=event.cards; - player.addTempSkill('dddxiaxing_used','roundStart'); - game.log(player,'将一张牌置于了牌堆顶'); - player.$throw(cards.length,1000); - yield player.lose(cards,ui.cardPile,'insert'); - const evt=event.getParent('_save'); - yield evt.dying.chooseUseTarget('tao',true); - if(!player.hasMark('dddxiaxing')) player.addMark('dddxiaxing'); + *content(event, map) { + const player = map.player, + cards = event.cards; + player.addTempSkill("dddxiaxing_used", "roundStart"); + game.log(player, "将一张牌置于了牌堆顶"); + player.$throw(cards.length, 1000); + yield player.lose(cards, ui.cardPile, "insert"); + const evt = event.getParent("_save"); + yield evt.dying.chooseUseTarget("tao", true); + if (!player.hasMark("dddxiaxing")) + player.addMark("dddxiaxing"); }, - marktext:'侠', - intro:{ - markcount:()=>0, - name:'侠行', - name2:'侠', - content:'已拥有“侠”标记', + marktext: "侠", + intro: { + markcount: () => 0, + name: "侠行", + name2: "侠", + content: "已拥有“侠”标记", }, - ai:{ - order:4, - result:{ - player(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + ai: { + order: 4, + result: { + player(player) { + if (_status.event.dying) + return get.attitude( + player, + _status.event.dying + ); return 1; }, - } - }, - subSkill:{ - begin:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - filter(event,player){ - if(!player.countCards('he')) return false; - return !player.hasSkill('dddxiaxing_used'); - }, - direct:true, - *content(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.player; - let result=yield player.chooseCard(get.prompt('dddxiaxing'),`将一张牌置于牌堆顶,视为${get.translation(target)}使用一张【酒】`,'he').set('ai',card=>{ - if(get.event('goon')) return 5-get.value(card); - return 0; - }).set('goon',get.effect(target,{name:'jiu'},player,player)>0); - if(!result.bool) return event.finish(); - const cards=result.cards; - player.logSkill('dddxiaxing_begin',target); - player.addTempSkill('dddxiaxing_used','roundStart'); - game.log(player,'将一张牌置于了牌堆顶'); - player.$throw(cards.length,1000); - yield player.lose(cards,ui.cardPile,'insert'); - yield target.chooseUseTarget('jiu',true); - if(!player.hasMark('dddxiaxing')) player.addMark('dddxiaxing'); - } }, - used:{charlotte:true}, - viewas:{ - audio:'dddxiaxing', - enable:'chooseToUse', - filter(event,player){ - if(event.type=='wuxie'||!player.hasMark('dddxiaxing')) return false; - for(const name of ['sha','shan']){ - if(event.filterCard({name:name,isCard:true},player,event)) return true; + }, + subSkill: { + begin: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + filter(event, player) { + if (!player.countCards("he")) return false; + return !player.hasSkill("dddxiaxing_used"); + }, + direct: true, + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let result = yield player + .chooseCard( + get.prompt("dddxiaxing"), + `将一张牌置于牌堆顶,视为${get.translation( + target + )}使用一张【酒】`, + "he" + ) + .set("ai", (card) => { + if (get.event("goon")) + return 5 - get.value(card); + return 0; + }) + .set( + "goon", + get.effect( + target, + { name: "jiu" }, + player, + player + ) > 0 + ); + if (!result.bool) return event.finish(); + const cards = result.cards; + player.logSkill("dddxiaxing_begin", target); + player.addTempSkill( + "dddxiaxing_used", + "roundStart" + ); + game.log(player, "将一张牌置于了牌堆顶"); + player.$throw(cards.length, 1000); + yield player.lose(cards, ui.cardPile, "insert"); + yield target.chooseUseTarget("jiu", true); + if (!player.hasMark("dddxiaxing")) + player.addMark("dddxiaxing"); + }, + }, + used: { charlotte: true }, + viewas: { + audio: "dddxiaxing", + enable: "chooseToUse", + filter(event, player) { + if ( + event.type == "wuxie" || + !player.hasMark("dddxiaxing") + ) + return false; + for (const name of ["sha", "shan"]) { + if ( + event.filterCard( + { name: name, isCard: true }, + player, + event + ) + ) + return true; } return false; }, - chooseButton:{ - dialog(event,player){ - const vcards=[]; - for(const name of ['sha','shan']){ - const card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); + chooseButton: { + dialog(event, player) { + const vcards = []; + for (const name of ["sha", "shan"]) { + const card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) + vcards.push(["基本", "", name]); } - const dialog=ui.create.dialog('侠行',[vcards,'vcard'],'hidden'); - dialog.direct=true; + const dialog = ui.create.dialog( + "侠行", + [vcards, "vcard"], + "hidden" + ); + dialog.direct = true; return dialog; }, - backup(links,player){ + backup(links, player) { return { - filterCard:()=>false, - selectCard:-1, - viewAs:{ - name:links[0][2], - isCard:true, + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, }, - popname:true, - precontent(){ - player.logSkill('dddxiaxing_viewas'); - player.clearMark('dddxiaxing'); + popname: true, + precontent() { + player.logSkill("dddxiaxing_viewas"); + player.clearMark("dddxiaxing"); }, - } + }; + }, + prompt(links, player) { + return ( + "侠行:移去“侠”标记,视为使用一张【" + + get.translation(links[0][2]) + + "】" + ); }, - prompt(links,player){ - return '侠行:移去“侠”标记,视为使用一张【'+get.translation(links[0][2])+'】'; - } }, - ai:{ - order(item,player){ - const event=get.event(); - if(event.filterCard({name:'sha'},player,event)){ - if(!player.hasShan()&&!game.hasPlayer(function(current){ - return player.canUse('sha',current)&¤t.hp==1&&get.effect(current,{name:'sha'},player,player)>0; - })){ + ai: { + order(item, player) { + const event = get.event(); + if ( + event.filterCard( + { name: "sha" }, + player, + event + ) + ) { + if ( + !player.hasShan() && + !game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + current.hp == 1 && + get.effect( + current, + { name: "sha" }, + player, + player + ) > 0 + ); + }) + ) { return 0; } return 2.95; - } - else return 3.15; + } else return 3.15; }, - respondSha:true, - respondShan:true, - skillTagFilter(player,tag,arg){ - if(!player.hasMark('dddxiaxing')) return false; - if(arg!='use') return false; + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (!player.hasMark("dddxiaxing")) return false; + if (arg != "use") return false; + }, + result: { + player: 1, }, - result:{ - player:1 - } }, }, - } + }, }, //张承 - dddjuxian:{ - enable:'phaseUse', - usable:2, - filter(event,player){ - return !player.hasSkill('dddjuxian_ban'); + dddjuxian: { + enable: "phaseUse", + usable: 2, + filter(event, player) { + return !player.hasSkill("dddjuxian_ban"); }, - chooseButton:{ - dialog(event,player){ - var dialog=ui.create.dialog('聚贤:请选择一项','hidden'); - dialog.add([[ - ['top','展示一张牌,然后将此牌置于牌堆顶'], - ['hand','展示一张牌,然后将此牌交给一名其他角色'] - ],'textbutton']); + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog( + "聚贤:请选择一项", + "hidden" + ); + dialog.add([ + [ + ["top", "展示一张牌,然后将此牌置于牌堆顶"], + [ + "hand", + "展示一张牌,然后将此牌交给一名其他角色", + ], + ], + "textbutton", + ]); return dialog; }, - filter(button,player){ - return !player.hasSkill('dddjuxian_'+button.link,null,null,false); + filter(button, player) { + return !player.hasSkill( + "dddjuxian_" + button.link, + null, + null, + false + ); }, - check(button){ + check(button) { return 1; }, - backup(links){ - return get.copy(lib.skill['dddjuxian_'+links[0]]); + backup(links) { + return get.copy(lib.skill["dddjuxian_" + links[0]]); }, - prompt(links){ - if(links[0]=='top') return '展示一张牌,然后将此牌置于牌堆顶'; - return '展示一张牌,然后将此牌交给一名其他角色'; + prompt(links) { + if (links[0] == "top") + return "展示一张牌,然后将此牌置于牌堆顶"; + return "展示一张牌,然后将此牌交给一名其他角色"; }, }, - ai:{ - order:10, - threaten:1.7, - result:{player:1}, + ai: { + order: 10, + threaten: 1.7, + result: { player: 1 }, }, - subSkill:{ - backup:{audio:'dddjuxian'}, - ban:{charlotte:true}, - top:{ - audio:'dddjuxian', - filterCard:true, - selectCard:1, - position:'he', - discard:false, - delay:false, - lose:false, - *content(event,map){ - const player=map.player,cards=event.cards; - player.addTempSkill('dddjuxian_top','phaseUseAfter'); + subSkill: { + backup: { audio: "dddjuxian" }, + ban: { charlotte: true }, + top: { + audio: "dddjuxian", + filterCard: true, + selectCard: 1, + position: "he", + discard: false, + delay: false, + lose: false, + *content(event, map) { + const player = map.player, + cards = event.cards; + player.addTempSkill( + "dddjuxian_top", + "phaseUseAfter" + ); player.showCards(cards); - const color1=get.color(cards); - player.$throw(cards,1000); - game.log(player,'将',cards,'置于了牌堆顶'); - yield player.lose(cards,ui.cardPile,'insert'); - const targets=game.filterPlayer(target=>target.countGainableCards(player,'he')); + const color1 = get.color(cards); + player.$throw(cards, 1000); + game.log(player, "将", cards, "置于了牌堆顶"); + yield player.lose(cards, ui.cardPile, "insert"); + const targets = game.filterPlayer((target) => + target.countGainableCards(player, "he") + ); let result; - if(!targets.length) return event.finish(); - else if(targets.length==1) result={bool:true,targets:targets}; - else result=yield player.chooseTarget('聚贤:获得一名其他角色的一张牌',(card,player,target)=>{ - if(target==player) return false; - return target.countGainableCards(player,'he'); - },true).set('ai',target=>{ - const player=get.player(); - return get.effect(target,{name:'shunshou'},player,player); - }); - if(!result.bool) return event.finish(); - const target=result.targets[0]; + if (!targets.length) return event.finish(); + else if (targets.length == 1) + result = { bool: true, targets: targets }; + else + result = yield player + .chooseTarget( + "聚贤:获得一名其他角色的一张牌", + (card, player, target) => { + if (target == player) return false; + return target.countGainableCards( + player, + "he" + ); + }, + true + ) + .set("ai", (target) => { + const player = get.player(); + return get.effect( + target, + { name: "shunshou" }, + player, + player + ); + }); + if (!result.bool) return event.finish(); + const target = result.targets[0]; player.line(target); - result=yield player.gainPlayerCard(target,'he',true); - if(!result.bool) return event.finish(); - const cards2=result.links; - const color2=get.color(cards2); - if(color1&&color2&&color1!=color2) player.addTempSkill('dddjuxian_ban'); + result = yield player.gainPlayerCard( + target, + "he", + true + ); + if (!result.bool) return event.finish(); + const cards2 = result.links; + const color2 = get.color(cards2); + if (color1 && color2 && color1 != color2) + player.addTempSkill("dddjuxian_ban"); }, - ai:{ - result:{ - player:1, + ai: { + result: { + player: 1, }, }, }, - hand:{ - audio:'dddjuxian', - filterTarget:lib.filter.notMe, - filterCard:true, - selectCard:1, - position:'he', - discard:false, - delay:false, - lose:false, - *content(event,map){ - const player=map.player,cards=event.cards,target=event.targets[0]; - player.addTempSkill('dddjuxian_hand','phaseUseAfter'); + hand: { + audio: "dddjuxian", + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: 1, + position: "he", + discard: false, + delay: false, + lose: false, + *content(event, map) { + const player = map.player, + cards = event.cards, + target = event.targets[0]; + player.addTempSkill( + "dddjuxian_hand", + "phaseUseAfter" + ); player.showCards(cards); - const color1=get.color(cards); + const color1 = get.color(cards); let result; - yield player.give(cards,target); - result=yield player.draw(); - const cards2=result.filter(i=>get.owner(i)==player&&get.position(i)=='h'); - if(!cards.length) return event.finish(); - const color2=get.color(cards2); + yield player.give(cards, target); + result = yield player.draw(); + const cards2 = result.filter( + (i) => + get.owner(i) == player && + get.position(i) == "h" + ); + if (!cards.length) return event.finish(); + const color2 = get.color(cards2); player.showCards(cards2); - if(color1&&color2&&color1!=color2) player.addTempSkill('dddjuxian_ban'); + if (color1 && color2 && color1 != color2) + player.addTempSkill("dddjuxian_ban"); }, - ai:{ - result:{ - player:1, - target:1, + ai: { + result: { + player: 1, + target: 1, }, }, }, }, }, - dddjungui:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - *content(event,map){ - const player=map.player; - let result=yield player.chooseTarget(get.prompt2('dddjungui')); - if(!result.bool) return event.finish(); - const target=result.targets[0]; - player.logSkill('dddjungui',target); + dddjungui: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + *content(event, map) { + const player = map.player; + let result = yield player.chooseTarget( + get.prompt2("dddjungui") + ); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dddjungui", target); target.draw(2); yield target.showHandcards(); - const targetSuitsCount=target.getCards('h').map(card=>{ - return get.suit(card); - }).toUniqued().length; - const usedCount=player.getHistory('useCard').map(evt=>{ - return get.suit(evt.card); - }).toUniqued().length; - let decreasedCount=0; - if(usedCount>0){ - const numbers=Array.from({length:usedCount},(_,i)=>get.cnNumber(i+1,true)); - result=yield player.chooseControl(numbers,'cancel2').set('prompt',`是否令${get.translation(target)}少弃置任意张牌?`).set('ai',()=>{ - return get.event('choice'); - }).set('choice',get.attitude(player,target)>0?numbers.lastItem:'cancel2'); - if(result.control!='cancel'){ - decreasedCount=result.index+1; - game.log(player,'选择令',target,'少弃置',get.cnNumber(decreasedCount),'张牌'); + const targetSuitsCount = target + .getCards("h") + .map((card) => { + return get.suit(card); + }) + .toUniqued().length; + const usedCount = player + .getHistory("useCard") + .map((evt) => { + return get.suit(evt.card); + }) + .toUniqued().length; + let decreasedCount = 0; + if (usedCount > 0) { + const numbers = Array.from( + { length: usedCount }, + (_, i) => get.cnNumber(i + 1, true) + ); + result = yield player + .chooseControl(numbers, "cancel2") + .set( + "prompt", + `是否令${get.translation( + target + )}少弃置任意张牌?` + ) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + get.attitude(player, target) > 0 + ? numbers.lastItem + : "cancel2" + ); + if (result.control != "cancel") { + decreasedCount = result.index + 1; + game.log( + player, + "选择令", + target, + "少弃置", + get.cnNumber(decreasedCount), + "张牌" + ); } } - const toDiscardNum=targetSuitsCount-decreasedCount; - if(toDiscardNum<=0) return event.finish(); - target.chooseToDiscard(`隽轨:请弃置${get.cnNumber(toDiscardNum)}张花色不同的手牌`,toDiscardNum,true,(card,player)=>{ - const suit=get.suit(card); - for(const cardx of ui.selected.cards){ - if(get.suit(cardx)==suit) return false; - } - return true; - }).set('complexCard',true); - } + const toDiscardNum = targetSuitsCount - decreasedCount; + if (toDiscardNum <= 0) return event.finish(); + target + .chooseToDiscard( + `隽轨:请弃置${get.cnNumber( + toDiscardNum + )}张花色不同的手牌`, + toDiscardNum, + true, + (card, player) => { + const suit = get.suit(card); + for (const cardx of ui.selected.cards) { + if (get.suit(cardx) == suit) return false; + } + return true; + } + ) + .set("complexCard", true); + }, }, //刘宠 - dddjinggou:{ - audio:2, - trigger:{player:'useCardAfter'}, - forced:true, - filter(event,player){ - if(get.type(event.card)!='equip') return false; - if(get.subtype(event.card)!='equip1') return false; - const range=player.getAttackRange(); - return !game.hasPlayer(current=>{ - return current.getAttackRange()>range; + dddjinggou: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + if (get.type(event.card) != "equip") return false; + if (get.subtype(event.card) != "equip1") return false; + const range = player.getAttackRange(); + return !game.hasPlayer((current) => { + return current.getAttackRange() > range; }); }, - direct:true, - *content(event,map){ - const player=map.player; - let result=yield player.chooseTarget('精彀:对一名其他角色造成1点伤害',true,lib.filter.notMe).set('ai',target=>{ - var player=get.player(); - return get.damageEffect(target,player,player); - }); - if(result.bool){ - const target=result.targets[0]; - player.logSkill('dddjinggou',target); + direct: true, + *content(event, map) { + const player = map.player; + let result = yield player + .chooseTarget( + "精彀:对一名其他角色造成1点伤害", + true, + lib.filter.notMe + ) + .set("ai", (target) => { + var player = get.player(); + return get.damageEffect(target, player, player); + }); + if (result.bool) { + const target = result.targets[0]; + player.logSkill("dddjinggou", target); target.damage(); } }, }, - dddmoyan:{ - audio:2, - trigger:{global:'roundStart'}, - *content(event,map){ - const player=map.player; - const cards=game.cardsGotoOrdering(get.cards(3)).cards; - yield player.showCards(cards,`${get.translation(player)}发动了【末焱】`); - let result=yield player.chooseTarget('末焱:选择一名角色获得其中至少一张牌').set('ai',target=>get.attitude(get.player(),target)); - if(!result.bool) return event.finish(); - const target=result.targets[0]; - result=yield target.chooseButton(['末焱:获得至少一张牌',cards],true,[1,cards.length]).set('ai',button=>{ - return get.value(button.link); - }); - if(!result.bool) return event.finish(); - const gains=result.links; - target.gain(gains,'gain2'); - player.setStorage('dddmoyan_target',[target,gains.length]); - player.addTempSkill('dddmoyan_target','roundStart'); + dddmoyan: { + audio: 2, + trigger: { global: "roundStart" }, + *content(event, map) { + const player = map.player; + const cards = game.cardsGotoOrdering(get.cards(3)).cards; + yield player.showCards( + cards, + `${get.translation(player)}发动了【末焱】` + ); + let result = yield player + .chooseTarget("末焱:选择一名角色获得其中至少一张牌") + .set("ai", (target) => + get.attitude(get.player(), target) + ); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + result = yield target + .chooseButton(["末焱:获得至少一张牌", cards], true, [ + 1, + cards.length, + ]) + .set("ai", (button) => { + return get.value(button.link); + }); + if (!result.bool) return event.finish(); + const gains = result.links; + target.gain(gains, "gain2"); + player.setStorage("dddmoyan_target", [ + target, + gains.length, + ]); + player.addTempSkill("dddmoyan_target", "roundStart"); }, - subSkill:{ - target:{ - onremove:true, - trigger:{player:'damageBegin3'}, - filter(event,player){ - const info=player.getStorage('dddmoyan_target'); - return info[0]&&info[0].isIn()&&info[0].countCards('h')<=info[1]; + subSkill: { + target: { + onremove: true, + trigger: { player: "damageBegin3" }, + filter(event, player) { + const info = player.getStorage("dddmoyan_target"); + return ( + info[0] && + info[0].isIn() && + info[0].countCards("h") <= info[1] + ); }, - forced:true, - charlotte:true, - content(){ - trigger.increase('num'); + forced: true, + charlotte: true, + content() { + trigger.increase("num"); }, }, }, }, //罗宪 - dddshilie:{ - audio:2, - enable:'chooseToUse', - hiddenCard(player,name){ - if(!player.countCards('h')) return false; - return name=='sha'||name=='shan'; + dddshilie: { + audio: 2, + enable: "chooseToUse", + hiddenCard(player, name) { + if (!player.countCards("h")) return false; + return name == "sha" || name == "shan"; }, - filter(event,player){ - if(event.type=='wuxie'||!_status.currentPhase) return false; - if(!player.countCards('h')||player.hasSkill('dddshilie_used',null,null,false)) return false; - for(var name of ['sha','shan']){ - if(event.filterCard({name:name,isCard:true},player,event)) return true; + filter(event, player) { + if (event.type == "wuxie" || !_status.currentPhase) + return false; + if ( + !player.countCards("h") || + player.hasSkill("dddshilie_used", null, null, false) + ) + return false; + for (var name of ["sha", "shan"]) { + if ( + event.filterCard( + { name: name, isCard: true }, + player, + event + ) + ) + return true; } return false; }, - chooseButton:{ - dialog(event,player){ - var vcards=[]; - for(var name of ['sha','shan']){ - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); + chooseButton: { + dialog(event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) + vcards.push(["基本", "", name]); } - const dialog=ui.create.dialog('示烈',[vcards,'vcard'],'hidden'); - dialog.direct=true; + const dialog = ui.create.dialog( + "示烈", + [vcards, "vcard"], + "hidden" + ); + dialog.direct = true; return dialog; }, - check(button){ + check(button) { return 1; }, - backup(links,player){ + backup(links, player) { return { - filterCard(card){ + filterCard(card) { return !get.is.shownCard(card); }, - filterOk:()=>{ - return ui.selected.cards.map(card=>{ - return get.number(card); - }).reduce((p,c)=>{ - return p+c; - },0)>=get.player().getHp()+(_status.currentPhase?_status.currentPhase.getHp():0); + filterOk: () => { + return ( + ui.selected.cards + .map((card) => { + return get.number(card); + }) + .reduce((p, c) => { + return p + c; + }, 0) >= + get.player().getHp() + + (_status.currentPhase + ? _status.currentPhase.getHp() + : 0) + ); }, - selectCard:[1,Infinity], - viewAs:{ - name:links[0][2], - isCard:true, + selectCard: [1, Infinity], + viewAs: { + name: links[0][2], + isCard: true, }, - popname:true, - ignoreMod:true, - ai1(card){ - const need=get.player().getHp()+(_status.currentPhase?_status.currentPhase.getHp():0); - let num=0; - for(var i=0;i=need){ - if(cards[i]==card||cards[j]==card) return 15-get.value(card); + if (num + get.number(card) == need) + return 20 - get.value(card); + if (ui.selected.cards.length == 0) { + var cards = + _status.event.player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + for ( + var j = i + 1; + j < cards.length; + j++ + ) { + if ( + cards[i].number + + cards[j].number >= + need + ) { + if ( + cards[i] == card || + cards[j] == card + ) + return 15 - get.value(card); } } } } return 0.1; }, - precontent(){ - 'step 0' - player.logSkill('dddshilie'); - player.addTempSkill('dddshilie_used'); - var cards=event.result.cards.slice(); - player.addShownCards(cards,'visible_dddshilie'); + precontent() { + "step 0"; + player.logSkill("dddshilie"); + player.addTempSkill("dddshilie_used"); + var cards = event.result.cards.slice(); + player.addShownCards( + cards, + "visible_dddshilie" + ); delete event.result.skill; - player.showCards(cards,get.translation(player)+'发动了【示烈】'); - if(cards.map(card=>{ - return get.number(card); - }).reduce((p,c)=>{ - return p+c; - },0)==player.getHp()+(_status.currentPhase?_status.currentPhase.getHp():0)){ + player.showCards( + cards, + get.translation(player) + "发动了【示烈】" + ); + if ( + cards + .map((card) => { + return get.number(card); + }) + .reduce((p, c) => { + return p + c; + }, 0) == + player.getHp() + + (_status.currentPhase + ? _status.currentPhase.getHp() + : 0) + ) { player.draw(cards.length); } - event.result.card=new lib.element.VCard({name:event.result.card.name,isCard:true}); - event.result.cards=[]; + event.result.card = new lib.element.VCard({ + name: event.result.card.name, + isCard: true, + }); + event.result.cards = []; game.delayx(); }, - } + }; + }, + prompt(links, player) { + return `###示烈###明置任意张点数之和不小于${ + player.getHp() + + (_status.currentPhase + ? _status.currentPhase.getHp() + : 0) + }的牌,视为使用【${get.translation(links[0][2])}】`; }, - prompt(links,player){ - return `###示烈###明置任意张点数之和不小于${player.getHp()+(_status.currentPhase?_status.currentPhase.getHp():0)}的牌,视为使用【${get.translation(links[0][2])}】`; - } }, - subSkill:{used:{charlotte:true}}, - ai:{ - order(item,player){ - const evt=get.event(); - for(var name of ['sha','shan']){ - if(evt.filterCard({name:name},player,evt)) return get.order({name:name})+0.1; + subSkill: { used: { charlotte: true } }, + ai: { + order(item, player) { + const evt = get.event(); + for (var name of ["sha", "shan"]) { + if (evt.filterCard({ name: name }, player, evt)) + return get.order({ name: name }) + 0.1; } return 1; }, - respondSha:true, - respondShan:true, - skillTagFilter(player,tag,arg){ - if(!player.countCards('h')) return false; + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (!player.countCards("h")) return false; }, - result:{ - player(player){ + result: { + player(player) { return 1; - } - } - } + }, + }, + }, }, //李娥 - dddyeshen:{ - trigger:{global:'phaseJieshuBegin'}, - logTarget:'player', - prompt2(event,player){ - var num=player.countMark('dddyeshen'); - var str='亮出牌堆底的'+get.cnNumber(3-num)+'张牌,然后其将其中的一张牌当作【铁索连环】使用或打出。'; - if(num>=2) str+='然后你受到1点火属性伤害并重置此技能。'; + dddyeshen: { + trigger: { global: "phaseJieshuBegin" }, + logTarget: "player", + prompt2(event, player) { + var num = player.countMark("dddyeshen"); + var str = + "亮出牌堆底的" + + get.cnNumber(3 - num) + + "张牌,然后其将其中的一张牌当作【铁索连环】使用或打出。"; + if (num >= 2) + str += "然后你受到1点火属性伤害并重置此技能。"; return str; }, - check(event,player){ - if(player.countMark('dddyeshen')>=2&&get.damageEffect(player,player,player,'fire')<0) return false; - return get.attitude(player,event.player)>0; + check(event, player) { + if ( + player.countMark("dddyeshen") >= 2 && + get.damageEffect(player, player, player, "fire") < 0 + ) + return false; + return get.attitude(player, event.player) > 0; }, - content(){ - 'step 0' - event.target=trigger.player; - var cards=get.bottomCards(3-player.countMark('dddyeshen')); - event.cards=cards; + content() { + "step 0"; + event.target = trigger.player; + var cards = get.bottomCards( + 3 - player.countMark("dddyeshen") + ); + event.cards = cards; game.cardsGotoOrdering(cards); - player.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【冶身】'); - if(!cards.some(card=>get.color(card)=='black')) event.goto(4); - 'step 1' - if(target.isIn()){ - var blacks=cards.filter(card=>get.color(card)=='black'); - if(blacks.length>1) target.chooseButton([ - '选择一张牌当作【铁索连环】使用或重铸', - blacks, - ],true).set('ai',button=>get.translation(button.link.name).length); - else event._result={ - bool:true, - links:blacks, - }; + player.showCards( + cards, + get.translation(player) + + "对" + + get.translation(target) + + "发动了【冶身】" + ); + if (!cards.some((card) => get.color(card) == "black")) + event.goto(4); + ("step 1"); + if (target.isIn()) { + var blacks = cards.filter( + (card) => get.color(card) == "black" + ); + if (blacks.length > 1) + target + .chooseButton( + [ + "选择一张牌当作【铁索连环】使用或重铸", + blacks, + ], + true + ) + .set( + "ai", + (button) => + get.translation(button.link.name).length + ); + else + event._result = { + bool: true, + links: blacks, + }; + } else event.goto(4); + ("step 2"); + if (result.bool) { + event.links = result.links.slice(0); + var card = get.autoViewAs( + { name: "tiesuo" }, + result.links + ); + var maxNum = get.translation( + result.links[0].name + ).length; + if ( + !game.hasPlayer((current) => + target.canUse(card, current) + ) + ) { + event._result = { bool: false }; + } else + target + .chooseTarget( + "请选择【铁索连环】的目标,或点“取消”重铸", + function (card, player, target) { + var card = _status.event.card; + return player.canUse(card, target); + }, + [1, Math.min(maxNum, game.countPlayer())] + ) + .set("card", card) + .set("ai", function (target) { + var player = _status.event.player, + card = _status.event.card; + return get.effect_use( + target, + card, + player, + player + ); + }); } - else event.goto(4); - 'step 2' - if(result.bool){ - event.links=result.links.slice(0); - var card=get.autoViewAs({name:'tiesuo'},result.links); - var maxNum=get.translation(result.links[0].name).length; - if(!game.hasPlayer(current=>target.canUse(card,current))){ - event._result={bool:false}; - } - else target.chooseTarget('请选择【铁索连环】的目标,或点“取消”重铸',function(card,player,target){ - var card=_status.event.card; - return player.canUse(card,target); - },[1,Math.min(maxNum,game.countPlayer())]).set('card',card).set('ai',function(target){ - var player=_status.event.player,card=_status.event.card; - return get.effect_use(target,card,player,player) - }); + ("step 3"); + if (result.bool && result.targets.length > 0) { + var card = get.autoViewAs( + { name: "tiesuo" }, + event.links + ); + target.useCard(result.targets, card, event.links); + } else { + target.recast(event.links, (player, cards) => + game.cardsDiscard(cards) + ); } - 'step 3' - if(result.bool&&result.targets.length>0){ - var card=get.autoViewAs({name:'tiesuo'},event.links); - target.useCard(result.targets,card,event.links); + ("step 4"); + for (var card of cards) { + if (get.position(card, true) == "o") + ui.cardPile.insertBefore( + card, + ui.cardPile.firstChild + ); } - else{ - target.recast(event.links,(player,cards)=>game.cardsDiscard(cards)); - } - 'step 4' - for(var card of cards){ - if(get.position(card,true)=='o') ui.cardPile.insertBefore(card,ui.cardPile.firstChild); - } - 'step 5' - var num=player.countMark('dddyeshen'); - if(num<2){ - player.addMark('dddyeshen',1,false); - game.log(player,'的','#g【冶身】','的亮出牌数-1'); - } - else{ - player.removeMark('dddyeshen',num,false); - game.log(player,'还原了','#g【冶身】','的亮出牌数'); - player.damage('fire','nocard'); + ("step 5"); + var num = player.countMark("dddyeshen"); + if (num < 2) { + player.addMark("dddyeshen", 1, false); + game.log(player, "的", "#g【冶身】", "的亮出牌数-1"); + } else { + player.removeMark("dddyeshen", num, false); + game.log(player, "还原了", "#g【冶身】", "的亮出牌数"); + player.damage("fire", "nocard"); } }, }, - dddqiaoduan:{ - trigger:{global:'linkAfter'}, - direct:true, - usable:1, - filter(event,player){ - var num=game.countPlayer(current=>current.isLinked()); - if(event.player.isLinked()){ - return player.countCards('he')>=num&&game.hasPlayer(current=>current.isDamaged()); - } - else{ - return num>0; + dddqiaoduan: { + trigger: { global: "linkAfter" }, + direct: true, + usable: 1, + filter(event, player) { + var num = game.countPlayer((current) => current.isLinked()); + if (event.player.isLinked()) { + return ( + player.countCards("he") >= num && + game.hasPlayer((current) => current.isDamaged()) + ); + } else { + return num > 0; } }, - content(){ - 'step 0' - if(trigger.player.isLinked()){ - var num=game.countPlayer(current=>current.isLinked()); + content() { + "step 0"; + if (trigger.player.isLinked()) { + var num = game.countPlayer((current) => + current.isLinked() + ); player.chooseCardTarget({ - prompt:get.prompt('dddqiaoduan'), - prompt2:'操作提示:选择'+get.cnNumber(num)+'张牌和一名已受伤的角色。将这些牌置于牌堆底(先选择的在上),然后该角色回复1点体力。', - filterCard:true, - selectCard:num, - filterTarget:(card,player,target)=>target.isDamaged(), - ai1:card=>5-get.value(card), - ai2:target=>{ - var player=_status.event.player; - return get.recoverEffect(target,player,player); - } - }) - } - else event.goto(2); - 'step 1' - if(result.bool){ - player.logSkill('dddqiaoduan',result.targets[0]); - player.loseToDiscardpile(result.cards,ui.cardPile); + prompt: get.prompt("dddqiaoduan"), + prompt2: + "操作提示:选择" + + get.cnNumber(num) + + "张牌和一名已受伤的角色。将这些牌置于牌堆底(先选择的在上),然后该角色回复1点体力。", + filterCard: true, + selectCard: num, + filterTarget: (card, player, target) => + target.isDamaged(), + ai1: (card) => 5 - get.value(card), + ai2: (target) => { + var player = _status.event.player; + return get.recoverEffect( + target, + player, + player + ); + }, + }); + } else event.goto(2); + ("step 1"); + if (result.bool) { + player.logSkill("dddqiaoduan", result.targets[0]); + player.loseToDiscardpile(result.cards, ui.cardPile); result.targets[0].recover(); - } - else player.storage.counttrigger.dddqiaoduan--; + } else player.storage.counttrigger.dddqiaoduan--; event.finish(); - 'step 2' - var num=game.countPlayer(current=>current.isLinked()); - player.chooseTarget(get.prompt('dddqiaoduan'),[1,num],'令至多'+get.cnNumber(num)+'名角色各摸一张牌').set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target)/Math.sqrt(1+target.countCards('h')); - if(target.hasSkillTag('nogain')) att/=10; - return att; - }); - 'step 3' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('dddqiaoduan',targets); + ("step 2"); + var num = game.countPlayer((current) => current.isLinked()); + player + .chooseTarget( + get.prompt("dddqiaoduan"), + [1, num], + "令至多" + get.cnNumber(num) + "名角色各摸一张牌" + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = + get.attitude(player, target) / + Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + ("step 3"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("dddqiaoduan", targets); game.asyncDraw(targets); game.delayex(); - } - else player.storage.counttrigger.dddqiaoduan--; + } else player.storage.counttrigger.dddqiaoduan--; }, }, //孙亮 - ddddiedang:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - if(player.storage.ddddiedang) return player.countCards('he')>=3; + ddddiedang: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (player.storage.ddddiedang) + return player.countCards("he") >= 3; return true; }, - filterCard:true, - position:'he', - selectCard(){ - var player=_status.event.player; - return player.storage.ddddiedang?3:0; + filterCard: true, + position: "he", + selectCard() { + var player = _status.event.player; + return player.storage.ddddiedang ? 3 : 0; }, - prompt(){ - var player=_status.event.player; - if(player.storage.ddddiedang) return '弃置三张牌,然后摸一张牌'; - return '摸三张牌,然后弃置一张牌'; + prompt() { + var player = _status.event.player; + if (player.storage.ddddiedang) + return "弃置三张牌,然后摸一张牌"; + return "摸三张牌,然后弃置一张牌"; }, - check:card=>5-get.value(card), - content(){ - 'step 0' - if(player.storage.ddddiedang){ + check: (card) => 5 - get.value(card), + content() { + "step 0"; + if (player.storage.ddddiedang) { player.draw(); - } - else{ + } else { player.draw(3); - player.chooseToDiscard(true,'he'); + player.chooseToDiscard(true, "he"); } - 'step 1' - if(player.isMaxHandcard()||player.isMinHandcard()) player.storage.ddddiedang=!player.storage.ddddiedang; + ("step 1"); + if (player.isMaxHandcard() || player.isMinHandcard()) + player.storage.ddddiedang = !player.storage.ddddiedang; }, - ai:{ - order:1, - result:{ - player(player){ - if(ui.selected.cards.length){ - var num=1+player.countCards('h',card=>!ui.selected.cards.includes(card)); - if(!game.hasPlayer(current=>{ - return current!=player&¤t.countCards('h')>num; - })||!game.hasPlayer(current=>{ - return current!=player&¤t.countCards('h') + !ui.selected.cards.includes(card) + ); + if ( + !game.hasPlayer((current) => { + return ( + current != player && + current.countCards("h") > num + ); + }) || + !game.hasPlayer((current) => { + return ( + current != player && + current.countCards("h") < num + ); + }) + ) + return 1; return -1; } return 1; @@ -766,1951 +1153,3399 @@ game.import('character', function () { }, }, }, - dddanliu:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter(event,player){ - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - }); + dddanliu: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return ( + current != player && current.countCards("h") > 0 + ); + }) + ); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('dddanliu'),function(card,player,target){ - return target!=player&&target.countCards('h')>0; - }).set('ai',function(target){ - return get.attitude(get.player(),target)*Math.sqrt(1+target.countCards('h')); - }) - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dddanliu',target); - event.target=target; + content() { + "step 0"; + player + .chooseTarget( + get.prompt2("dddanliu"), + function (card, player, target) { + return ( + target != player && + target.countCards("h") > 0 + ); + } + ) + .set("ai", function (target) { + return ( + get.attitude(get.player(), target) * + Math.sqrt(1 + target.countCards("h")) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddanliu", target); + event.target = target; + } else event.finish(); + ("step 2"); + player + .choosePlayerCard(target, true, "h", "visible", [0, 1]) + .set("filterOk", () => ui.selected.buttons.length > 0) + .set("ai", (button) => { + var player = get.player(), + target = _status.event.target; + var color = get.color(button.link); + if ( + player.hasCard(function (card) { + return get.color(card) == color; + }, "h") + ) { + if (color == "red") + return ( + get.recoverEffect( + player, + player, + player + ) + + 2 / Math.max(2, get.value(button.link)) + ); + if (color == "black") + return ( + 2 * + get.effect( + target, + { name: "draw" }, + target, + player + ) + + 2 / Math.max(2, get.value(button.link)) + ); + } + return get.value(button.link) / 3; + }); + ("step 3"); + if (result.bool) { + event.card1 = result.cards[0]; + target + .choosePlayerCard( + player, + true, + "h", + "visible", + [0, 1], + get.translation(player) + + "选择了你的" + + get.translation(event.card1) + + "。请选择其的一张牌" + ) + .set("ai", function (button) { + var evt = _status.event.getParent(); + var player = evt.target, + card = evt.card1, + source = evt.player; + var color = get.color(card); + if (get.attitude(player, target) > 0) { + if (get.color(button.link) == color) + return 20 - get.value(card); + return -get.value(card); + } else { + if (get.color(button.link) == "black") + return 20 + get.value(card); + return get.value(card); + } + }) + .set( + "filterOk", + () => ui.selected.buttons.length > 0 + ); } - else event.finish(); - 'step 2' - player.choosePlayerCard(target,true,'h','visible',[0,1]).set('filterOk',()=>ui.selected.buttons.length>0).set('ai',button=>{ - var player=get.player(),target=_status.event.target; - var color=get.color(button.link); - if(player.hasCard(function(card){ - return get.color(card)==color; - },'h')){ - if(color=='red') return get.recoverEffect(player,player,player)+2/Math.max(2,get.value(button.link)); - if(color=='black') return 2*get.effect(target,{name:'draw'},target,player)+2/Math.max(2,get.value(button.link)); - } - return get.value(button.link)/3; - }) - 'step 3' - if(result.bool){ - event.card1=result.cards[0]; - target.choosePlayerCard( - player,true,'h','visible',[0,1], - get.translation(player)+'选择了你的'+get.translation(event.card1)+'。请选择其的一张牌' - ).set('ai',function(button){ - var evt=_status.event.getParent(); - var player=evt.target,card=evt.card1,source=evt.player; - var color=get.color(card); - if(get.attitude(player,target)>0){ - if(get.color(button.link)==color) return 20-get.value(card); - return -get.value(card); + ("step 4"); + if (result.bool) { + event.card2 = result.cards[0]; + var color = get.color(event.card1); + if ( + color != "none" && + get.color(event.card2) == color + ) { + event.color = color; + var next = player.chooseBool( + "是否与" + + get.translation(target) + + "交换展示牌" + ); + var prompt2 = + "用" + + get.translation(event.card1) + + "交换对方的" + + get.translation(event.card2); + if (color == "black") { + prompt2 += ",然后对方摸两张牌"; + next.set( + "goon", + 2 * + get.effect( + target, + { name: "draw" }, + target, + player + ) > + 0 + ); + } else if (color == "red" && player.isDamaged()) { + prompt2 += ",然后你回复1点体力"; + next.set( + "goon", + get.recoverEffect(player, player, player) > + 0 + ); } - else{ - if(get.color(button.link)=='black') return 20+get.value(card); - return get.value(card); - } - }).set('filterOk',()=>ui.selected.buttons.length>0); + next.set("prompt2", prompt2); + next.set("ai", () => Boolean(_status.event.goon)); + } else event.finish(); } - 'step 4' - if(result.bool){ - event.card2=result.cards[0]; - var color=get.color(event.card1); - if(color!='none'&&get.color(event.card2)==color){ - event.color=color; - var next=player.chooseBool('是否与'+get.translation(target)+'交换展示牌'); - var prompt2='用'+get.translation(event.card1)+'交换对方的'+get.translation(event.card2); - if(color=='black'){ - prompt2+=',然后对方摸两张牌'; - next.set('goon',2*get.effect(target,{name:'draw'},target,player)>0); - } - else if(color=='red'&&player.isDamaged()){ - prompt2+=',然后你回复1点体力'; - next.set('goon',get.recoverEffect(player,player,player)>0); - } - next.set('prompt2',prompt2); - next.set('ai',()=>Boolean(_status.event.goon)); - } - else event.finish(); - } - 'step 5' - if(result.bool){ - player.swapHandcards(target,[event.card2],[event.card1]); - if(event.color=='black'){ + ("step 5"); + if (result.bool) { + player.swapHandcards( + target, + [event.card2], + [event.card1] + ); + if (event.color == "black") { target.draw(2); - } - else if(event.color=='red'){ + } else if (event.color == "red") { player.recover(); } } }, }, - dddguiying:{ - zhuSkill:true, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter(event,player){ - return player.hasZhuSkill('dddguiying')&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='wu'&&player.hasZhuSkill('dddguiying',current)&¤t.countCards('h')>0; - }); - }, - gainEffect(player){ - var gainers=game.filterPlayer(current=>current.countCards('ej')); - if(!gainers.length) return 0; - var min=Math.min.apply(Math,gainers.map((current)=>{ - return Math.min.apply(Math,current.getCards('ej').map(function(card){ - return get.number(card,current); - })); - })); - return Math.max.apply(Math,game.filterPlayer(function(target){ - return target.hasCard(function(card){ - return get.number(card,target)==min&&lib.filter.canBeGained(card,player,target); - },'ej'); - }).map(function(target){ - var cards=target.getCards('ej',function(card){ - return get.number(card,target)==min&&lib.filter.canBeGained(card,player,target); - }),att=get.attitude(player,target) - return Math.max.apply(Math,cards.map(card=>{ - if(target.getCards('j').includes(card)){ - var efff=get.effect(target,{ - name:card.viewAs||card.name, - cards:[card], - },player,player); - if(efff>0) return -0.5*att; - if(efff==0) return 0; - return 1.5*att; - } - if(target.getCards('e').includes(card)){ - var evalue=get.value(card,target); - if(target.hasSkillTag('noe')){ - if(evalue>=7){ - return -evalue/6*att; - } - return -evalue/10*att; - } - return -evalue/3*att; - } - })); - })) - }, - content(){ - 'step 0' - event.targets=game.filterPlayer(function(current){ - return current!=player&¤t.group=='wu'&&player.hasZhuSkill('dddguiying',current); - }).sortBySeat(); - if(!event.targets.length) event.finish(); - 'step 1' - var target=event.targets.shift(); - event.target=target; - if(target.isIn()&&target.group=='wu'&&target.countCards('h')>0){ - target.chooseBool( - '归萤:是否响应'+get.translation(player)+'的主公技?', - '你可以展示所有手牌,将点数最大的牌交给该角色;然后你可以获得场上点数最小的一张牌' - ).set('ai',function(){ - var player=get.player(),source=_status.event.getParent().player; - if(_status.event.gainEffect<=0) return 0; - return get.attitude(player,source)>0; - }).set('gainEffect',lib.skill.dddguiying.gainEffect(target)); - } - else event.goto(7); - 'step 2' - if(result.bool){ - target.logSkill('dddguiying',player); - target.showHandcards(get.translation(target)+'响应了〖归萤〗'); - } - else event.goto(7); - 'step 3' - if(target.isIn()){ - var cards=target.getCards('he') - if(!cards.length) event.goto(7); - var max=Math.max.apply(Math,cards.map(card=>get.number(card,target))); - var gives=cards.filter(card=>get.number(card,target)==max); - if(gives.length<=1) event._result={bool:true,cards:gives}; - else target.chooseCard('he',true,'选择给出一张点数最大的牌',function(card){ - return _status.event.cards.includes(card); - }).set('cards',gives); - } - else event.goto(7); - 'step 4' - if(result.bool){ - target.give(result.cards,player,'visible'); - } - else event.goto(7); - 'step 5' - var gainers=game.filterPlayer(current=>current.countCards('ej')); - if(target.isIn()&&gainers.length>0){ - var min=Math.min.apply(Math,gainers.map((current)=>{ - return Math.min.apply(Math,current.getCards('ej').map(function(card){ - return get.number(card,current); - })); - })); - target.chooseTarget('是否获得场上点数最小的一张牌?',function(card,player,target){ - var num=_status.event.minNum; - return target.hasCard(function(card){ - return get.number(card,target)==num&&lib.filter.canBeGained(card,player,target); - },'ej'); - }).set('minNum',min).set('ai',function(target){ - var player=get.player(),min=_status.event.minNum; - var cards=target.getCards('ej',function(card){ - return get.number(card,target)==min&&lib.filter.canBeGained(card,player,target); - }),att=get.attitude(player,target) - return Math.max.apply(Math,cards.map(card=>{ - if(target.getCards('j').includes(card)){ - var efff=get.effect(target,{ - name:card.viewAs||card.name, - cards:[card], - },player,player); - if(efff>0) return -0.5*att; - if(efff==0) return 0; - return 1.5*att; - } - if(target.getCards('e').includes(card)){ - var evalue=get.value(card,target); - if(target.hasSkillTag('noe')){ - if(evalue>=7){ - return -evalue/6*att; - } - return -evalue/10*att; - } - return -evalue/3*att; - } - })); + dddguiying: { + zhuSkill: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter(event, player) { + return ( + player.hasZhuSkill("dddguiying") && + game.hasPlayer(function (current) { + return ( + current != player && + current.group == "wu" && + player.hasZhuSkill("dddguiying", current) && + current.countCards("h") > 0 + ); }) + ); + }, + gainEffect(player) { + var gainers = game.filterPlayer((current) => + current.countCards("ej") + ); + if (!gainers.length) return 0; + var min = Math.min.apply( + Math, + gainers.map((current) => { + return Math.min.apply( + Math, + current.getCards("ej").map(function (card) { + return get.number(card, current); + }) + ); + }) + ); + return Math.max.apply( + Math, + game + .filterPlayer(function (target) { + return target.hasCard(function (card) { + return ( + get.number(card, target) == min && + lib.filter.canBeGained( + card, + player, + target + ) + ); + }, "ej"); + }) + .map(function (target) { + var cards = target.getCards( + "ej", + function (card) { + return ( + get.number(card, target) == + min && + lib.filter.canBeGained( + card, + player, + target + ) + ); + } + ), + att = get.attitude(player, target); + return Math.max.apply( + Math, + cards.map((card) => { + if ( + target.getCards("j").includes(card) + ) { + var efff = get.effect( + target, + { + name: + card.viewAs || + card.name, + cards: [card], + }, + player, + player + ); + if (efff > 0) return -0.5 * att; + if (efff == 0) return 0; + return 1.5 * att; + } + if ( + target.getCards("e").includes(card) + ) { + var evalue = get.value( + card, + target + ); + if (target.hasSkillTag("noe")) { + if (evalue >= 7) { + return (-evalue / 6) * att; + } + return (-evalue / 10) * att; + } + return (-evalue / 3) * att; + } + }) + ); + }) + ); + }, + content() { + "step 0"; + event.targets = game + .filterPlayer(function (current) { + return ( + current != player && + current.group == "wu" && + player.hasZhuSkill("dddguiying", current) + ); + }) + .sortBySeat(); + if (!event.targets.length) event.finish(); + ("step 1"); + var target = event.targets.shift(); + event.target = target; + if ( + target.isIn() && + target.group == "wu" && + target.countCards("h") > 0 + ) { + target + .chooseBool( + "归萤:是否响应" + + get.translation(player) + + "的主公技?", + "你可以展示所有手牌,将点数最大的牌交给该角色;然后你可以获得场上点数最小的一张牌" + ) + .set("ai", function () { + var player = get.player(), + source = _status.event.getParent().player; + if (_status.event.gainEffect <= 0) return 0; + return get.attitude(player, source) > 0; + }) + .set( + "gainEffect", + lib.skill.dddguiying.gainEffect(target) + ); + } else event.goto(7); + ("step 2"); + if (result.bool) { + target.logSkill("dddguiying", player); + target.showHandcards( + get.translation(target) + "响应了〖归萤〗" + ); + } else event.goto(7); + ("step 3"); + if (target.isIn()) { + var cards = target.getCards("he"); + if (!cards.length) event.goto(7); + var max = Math.max.apply( + Math, + cards.map((card) => get.number(card, target)) + ); + var gives = cards.filter( + (card) => get.number(card, target) == max + ); + if (gives.length <= 1) + event._result = { bool: true, cards: gives }; + else + target + .chooseCard( + "he", + true, + "选择给出一张点数最大的牌", + function (card) { + return _status.event.cards.includes( + card + ); + } + ) + .set("cards", gives); + } else event.goto(7); + ("step 4"); + if (result.bool) { + target.give(result.cards, player, "visible"); + } else event.goto(7); + ("step 5"); + var gainers = game.filterPlayer((current) => + current.countCards("ej") + ); + if (target.isIn() && gainers.length > 0) { + var min = Math.min.apply( + Math, + gainers.map((current) => { + return Math.min.apply( + Math, + current.getCards("ej").map(function (card) { + return get.number(card, current); + }) + ); + }) + ); + target + .chooseTarget( + "是否获得场上点数最小的一张牌?", + function (card, player, target) { + var num = _status.event.minNum; + return target.hasCard(function (card) { + return ( + get.number(card, target) == num && + lib.filter.canBeGained( + card, + player, + target + ) + ); + }, "ej"); + } + ) + .set("minNum", min) + .set("ai", function (target) { + var player = get.player(), + min = _status.event.minNum; + var cards = target.getCards( + "ej", + function (card) { + return ( + get.number(card, target) == + min && + lib.filter.canBeGained( + card, + player, + target + ) + ); + } + ), + att = get.attitude(player, target); + return Math.max.apply( + Math, + cards.map((card) => { + if ( + target.getCards("j").includes(card) + ) { + var efff = get.effect( + target, + { + name: + card.viewAs || + card.name, + cards: [card], + }, + player, + player + ); + if (efff > 0) return -0.5 * att; + if (efff == 0) return 0; + return 1.5 * att; + } + if ( + target.getCards("e").includes(card) + ) { + var evalue = get.value( + card, + target + ); + if (target.hasSkillTag("noe")) { + if (evalue >= 7) { + return (-evalue / 6) * att; + } + return (-evalue / 10) * att; + } + return (-evalue / 3) * att; + } + }) + ); + }); + } else event.goto(7); + ("step 6"); + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2, "green"); + var min = Math.min.apply( + Math, + target2.getCards("ej").map(function (card) { + return get.number(card, target2); + }) + ), + cards = target2.getCards( + "ej", + (card) => get.number(card, target2) == min + ); + if (cards.length <= 1) + target.gain(cards, target2, "give", "bySelf"); + else + target + .gainPlayerCard(target2, "ej", true) + .set("filterButton", function (button) { + return _status.event.cards.includes( + button.link + ); + }) + .set("cards", cards); } - else event.goto(7); - 'step 6' - if(result.bool){ - var target2=result.targets[0]; - target.line(target2,'green'); - var min=Math.min.apply(Math,target2.getCards('ej').map(function(card){ - return get.number(card,target2); - })),cards=target2.getCards('ej',card=>get.number(card,target2)==min); - if(cards.length<=1) target.gain(cards,target2,'give','bySelf'); - else target.gainPlayerCard(target2,'ej',true).set('filterButton',function(button){ - return _status.event.cards.includes(button.link); - }).set('cards',cards); - } - 'step 7' - if(targets.length>0) event.goto(1); + ("step 7"); + if (targets.length > 0) event.goto(1); }, }, //王伉吕凯 - dddbingjian:{ - enable:['chooseToUse','chooseToRespond'], - filter(event,player){ - if(event.type=='wuxie') return false; - if(player.countMark('dddbingjian_used')>=2) return false; - if(player.countCards('h')==2) return false; - return event.filterCard({ - name:'sha', - isCard:true, - },player,event)||event.filterCard({ - name:'shan', - isCard:true, - },player,event) + dddbingjian: { + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + if (event.type == "wuxie") return false; + if (player.countMark("dddbingjian_used") >= 2) return false; + if (player.countCards("h") == 2) return false; + return ( + event.filterCard( + { + name: "sha", + isCard: true, + }, + player, + event + ) || + event.filterCard( + { + name: "shan", + isCard: true, + }, + player, + event + ) + ); }, - chooseButton:{ - dialog(event,player){ + chooseButton: { + dialog(event, player) { return ui.create.dialog( - '并肩', + "并肩", // [[ // [2,'调整至2张'], // [4,'调整至4张'] // ],'tdnodes'], - [['sha','shan'],'vcard'], - 'hidden' - ) + [["sha", "shan"], "vcard"], + "hidden" + ); }, // select:2, - filter(button,player){ - if(ui.selected.buttons.length){ - if(typeof button.link==typeof ui.selected.buttons[0].link) return false; + filter(button, player) { + if (ui.selected.buttons.length) { + if ( + typeof button.link == + typeof ui.selected.buttons[0].link + ) + return false; } // if(typeof button.link=='number'){ // return button.link!=player.countCards('h'); // } return _status.event.getParent().filterCard({ - name:button.link[2], - isCard:true, + name: button.link[2], + isCard: true, }); }, - check(button){ + check(button) { // if(typeof button.link=='number') return button.link; return 1; }, - backup(links,player){ + backup(links, player) { // if(typeof links[0]=='number') links.reverse(); - var skill={ - viewAs:{ - name:links[0][2], - suit:'none', - number:null, - isCard:true, - } - } - var num=2-player.countCards('h'); - if(num>0){ - skill.draw=num; - skill.filterCard=function(){ + var skill = { + viewAs: { + name: links[0][2], + suit: "none", + number: null, + isCard: true, + }, + }; + var num = 2 - player.countCards("h"); + if (num > 0) { + skill.draw = num; + skill.filterCard = function () { return false; - } - skill.selectCard=-1; - skill.precontent=lib.skill.dddbingjian.content_draw; - } - else{ - skill.selectCard=-num; - skill.ignoreMod=true; - skill.filterCard=lib.filter.cardDiscardable; - skill.precontent=lib.skill.dddbingjian.content_discard; - skill.check=function(card){ - return 5-get.value(card) + }; + skill.selectCard = -1; + skill.precontent = + lib.skill.dddbingjian.content_draw; + } else { + skill.selectCard = -num; + skill.ignoreMod = true; + skill.filterCard = lib.filter.cardDiscardable; + skill.precontent = + lib.skill.dddbingjian.content_discard; + skill.check = function (card) { + return 5 - get.value(card); }; } return skill; }, - prompt(links,player){ + prompt(links, player) { // if(typeof links[0]=='number') links.reverse(); - var num=2-player.countCards('h'); - if(num>0){ - return '摸'+get.cnNumber(num)+'张牌并视为使用'+get.translation(links[0][2]); + var num = 2 - player.countCards("h"); + if (num > 0) { + return ( + "摸" + + get.cnNumber(num) + + "张牌并视为使用" + + get.translation(links[0][2]) + ); + } else { + return ( + "弃置" + + get.cnNumber(-num) + + "张牌并视为使用" + + get.translation(links[0][2]) + ); } - else{ - return '弃置'+get.cnNumber(-num)+'张牌并视为使用'+get.translation(links[0][2]); - } - } + }, }, - ai:{ - pretao:true, - order(item,player){ - if(player.countCards('h')<4) return get.order({name:'sha'},player)+0.2; + ai: { + pretao: true, + order(item, player) { + if (player.countCards("h") < 4) + return get.order({ name: "sha" }, player) + 0.2; return 1; }, - result:{ - player:1, + result: { + player: 1, }, }, - content_draw(){ - 'step 0' + content_draw() { + "step 0"; delete event.result.skill; - player.logSkill('dddbingjian'); + player.logSkill("dddbingjian"); player.draw(lib.skill.dddbingjian_backup.draw); - player.addTempSkill('dddbingjian_used'); - player.addMark('dddbingjian_used',1,false); - 'step 1' - player.chooseTarget('是否令一名其他角色摸等量的牌?',lib.filter.notMe).set('ai',target=>{ - var player=get.player(); - return get.effect(target,{name:'draw'},player,player); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + player.addTempSkill("dddbingjian_used"); + player.addMark("dddbingjian_used", 1, false); + ("step 1"); + player + .chooseTarget( + "是否令一名其他角色摸等量的牌?", + lib.filter.notMe + ) + .set("ai", (target) => { + var player = get.player(); + return get.effect( + target, + { name: "draw" }, + player, + player + ); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.draw(lib.skill.dddbingjian_backup.draw); } }, - content_discard(){ - 'step 0' + content_discard() { + "step 0"; delete event.result.skill; - player.logSkill('dddbingjian'); + player.logSkill("dddbingjian"); player.discard(event.result.cards); - event.num=event.result.cards.length; - player.addTempSkill('dddbingjian_used'); - player.addMark('dddbingjian_used',1,false); - event.result.card={ - name:event.result.card.name, - isCard:true, - } - event.result.cards=[]; - 'step 1' - player.chooseTarget('是否弃置一名其他角色等量的牌?',lib.filter.notMe).set('ai',target=>{ - var player=get.player(),num=target.countCards('he')-get.event('num'); - if(num>=0) num=1; - else num=1-num/5; - var eff=get.effect(target,{name:'guohe_copy2'},player,player); - return eff/num; - }).set('num',event.num); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - player.discardPlayerCard(target,'he',true,event.num); + event.num = event.result.cards.length; + player.addTempSkill("dddbingjian_used"); + player.addMark("dddbingjian_used", 1, false); + event.result.card = { + name: event.result.card.name, + isCard: true, + }; + event.result.cards = []; + ("step 1"); + player + .chooseTarget( + "是否弃置一名其他角色等量的牌?", + lib.filter.notMe + ) + .set("ai", (target) => { + var player = get.player(), + num = + target.countCards("he") - get.event("num"); + if (num >= 0) num = 1; + else num = 1 - num / 5; + var eff = get.effect( + target, + { name: "guohe_copy2" }, + player, + player + ); + return eff / num; + }) + .set("num", event.num); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.discardPlayerCard(target, "he", true, event.num); } }, - content_draw_old(){ - 'step 0' + content_draw_old() { + "step 0"; delete event.result.skill; - player.logSkill('dddbingjian'); - player.addTempSkill('dddbingjian_round','roundStart'); + player.logSkill("dddbingjian"); + player.addTempSkill("dddbingjian_round", "roundStart"); player.draw(lib.skill.dddbingjian_backup.draw); - 'step 1' - player.chooseTarget('是否令一名角色本轮内不能使用或打出'+get.translation(event.result.card)+'?').set('ai',function(target){ - var player=_status.event.player; - return -get.attitude(player,target)*get.threaten(target,player)*Math.sqrt(1+target.countCards('h')); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - player.chat('你不许使用'+get.translation(event.result.card)); - target.addTempSkill('dddbingjian_blocker','roundStart'); - target.markAuto('dddbingjian_blocker',[event.result.card.name]); + ("step 1"); + player + .chooseTarget( + "是否令一名角色本轮内不能使用或打出" + + get.translation(event.result.card) + + "?" + ) + .set("ai", function (target) { + var player = _status.event.player; + return ( + -get.attitude(player, target) * + get.threaten(target, player) * + Math.sqrt(1 + target.countCards("h")) + ); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.chat( + "你不许使用" + get.translation(event.result.card) + ); + target.addTempSkill( + "dddbingjian_blocker", + "roundStart" + ); + target.markAuto("dddbingjian_blocker", [ + event.result.card.name, + ]); game.delayx(); } }, - content_discard_old(){ - 'step 0' + content_discard_old() { + "step 0"; delete event.result.skill; - player.logSkill('dddbingjian'); + player.logSkill("dddbingjian"); player.discard(event.result.cards); - event.result.card={ - name:event.result.card.name, - isCard:true, - } - event.result.cards=[]; - 'step 1' - var hs=player.countCards('h'); - if(!game.hasPlayer(current=>current.countCards('h')!=hs)){ + event.result.card = { + name: event.result.card.name, + isCard: true, + }; + event.result.cards = []; + ("step 1"); + var hs = player.countCards("h"); + if ( + !game.hasPlayer( + (current) => current.countCards("h") != hs + ) + ) { event.finish(); + } else { + player + .chooseTarget( + "是否令一名角色将手牌调整至" + + get.cnNumber(player.countCards("h")) + + "张?", + function (card, player, target) { + return ( + target.countCards("h") != + player.countCards("h") + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + num = + target.countCards("h") - + player.countCards("h"); + if (num > 0) + return ( + get.attitude(player, target) * + Math.sqrt(1 + Math.abs(num)) + ); + return ( + -get.attitude(player, target) * + Math.sqrt(-num) + ); + }); } - else{ - player.chooseTarget('是否令一名角色将手牌调整至'+get.cnNumber(player.countCards('h'))+'张?',function(card,player,target){ - return target.countCards('h')!=player.countCards('h'); - }).set('ai',function(target){ - var player=_status.event.player,num=target.countCards('h')-player.countCards('h'); - if(num>0) return get.attitude(player,target)*Math.sqrt(1+Math.abs(num)); - return -get.attitude(player,target)*Math.sqrt(-num); - }) - } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - var num=target.countCards('h')-player.countCards('h'); - if(num>0) target.chooseToDiscard('h',true,num); - else target.draw(Math.min(5,-num)); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + var num = + target.countCards("h") - player.countCards("h"); + if (num > 0) target.chooseToDiscard("h", true, num); + else target.draw(Math.min(5, -num)); } }, - subSkill:{ - round:{charlotte:true}, - blocker:{ - charlotte:true, - mod:{ - cardEnabled(card,player){ - if(player.getStorage('dddbingjian_blocker').includes(card.name)) return false; + subSkill: { + round: { charlotte: true }, + blocker: { + charlotte: true, + mod: { + cardEnabled(card, player) { + if ( + player + .getStorage("dddbingjian_blocker") + .includes(card.name) + ) + return false; }, - cardRespondable(card,player){ - if(player.getStorage('dddbingjian_blocker').includes(card.name)) return false; + cardRespondable(card, player) { + if ( + player + .getStorage("dddbingjian_blocker") + .includes(card.name) + ) + return false; }, - cardSavable(card,player){ - if(player.getStorage('dddbingjian_blocker').includes(card.name)) return false; + cardSavable(card, player) { + if ( + player + .getStorage("dddbingjian_blocker") + .includes(card.name) + ) + return false; }, }, - mark:true, - intro:{ - content:'本轮内不能使用或打出$', + mark: true, + intro: { + content: "本轮内不能使用或打出$", }, }, - used:{ - charlotte:true, - onremove:true, + used: { + charlotte: true, + onremove: true, }, - } + }, }, //梁习 - dddtongyu:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('hs')>0; + dddtongyu: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("hs") > 0; }, - viewAs:{ - name:'wugu', + viewAs: { + name: "wugu", }, - selectCard:[1,4], - filterCard(card){ - var suit=get.suit(card); - if(suit=='none') return false; - if(!ui.selected.cards.length) return true; - for(var card of ui.selected.cards){ - if(get.suit(card)==suit) return false; + selectCard: [1, 4], + filterCard(card) { + var suit = get.suit(card); + if (suit == "none") return false; + if (!ui.selected.cards.length) return true; + for (var card of ui.selected.cards) { + if (get.suit(card) == suit) return false; } return true; }, - complexCard:true, - position:'hs', - prompt:'将任意张花色不同的牌当做【五谷丰登】使用', - check(card){ - return 5-get.value(card); + complexCard: true, + position: "hs", + prompt: "将任意张花色不同的牌当做【五谷丰登】使用", + check(card) { + return 5 - get.value(card); }, - precontent(){ - if(!event.result.card.storage) event.result.card.storage={}; - event.result.card.storage.chooseDirection=true; - event.result.card.storage.extraCardsNum=event.result.cards.length; - player.addTempSkill('dddtongyu_effect'); + precontent() { + if (!event.result.card.storage) + event.result.card.storage = {}; + event.result.card.storage.chooseDirection = true; + event.result.card.storage.extraCardsNum = + event.result.cards.length; + player.addTempSkill("dddtongyu_effect"); }, - ai:{ - order:1, + ai: { + order: 1, }, - subSkill:{ - effect:{ - trigger:{global:'useCardToTargeted'}, - forced:true, - charlotte:true, - popup:false, - filter(event,player){ - return event.skill=='dddtongyu'&&event.isFirstTarget; + subSkill: { + effect: { + trigger: { global: "useCardToTargeted" }, + forced: true, + charlotte: true, + popup: false, + filter(event, player) { + return ( + event.skill == "dddtongyu" && + event.isFirstTarget + ); }, - content(){ - 'step 0' - event.targets=trigger.targets.slice().sortBySeat(_status.currentPhase||player); - 'step 1' - var target=targets.shift(); - event.target=target; - if(!target.isUnderControl(true)&&!target.isOnline()) game.delayx(); - target.chooseControl().set('choiceList',[ - '本回合不能使用或打出手牌', - '令'+get.translation(trigger.card)+'对自己无效', - ]).set('ai',function(){ - var player=_status.event.player; - var source=_status.event.getTrigger().player; - return player==source?1:0; - }); - 'step 2' - if(result.index==0){ - target.chat('接受五谷'); - target.addTempSkill('dddtongyu_blocker'); - game.log(target,'本回合不能使用或打出手牌') - } - else{ - target.chat('拒绝五谷'); + content() { + "step 0"; + event.targets = trigger.targets + .slice() + .sortBySeat(_status.currentPhase || player); + ("step 1"); + var target = targets.shift(); + event.target = target; + if ( + !target.isUnderControl(true) && + !target.isOnline() + ) + game.delayx(); + target + .chooseControl() + .set("choiceList", [ + "本回合不能使用或打出手牌", + "令" + + get.translation(trigger.card) + + "对自己无效", + ]) + .set("ai", function () { + var player = _status.event.player; + var source = + _status.event.getTrigger().player; + return player == source ? 1 : 0; + }); + ("step 2"); + if (result.index == 0) { + target.chat("接受五谷"); + target.addTempSkill("dddtongyu_blocker"); + game.log(target, "本回合不能使用或打出手牌"); + } else { + target.chat("拒绝五谷"); trigger.excluded.add(target); - var evt=trigger.getParent(); - if(!evt.dddtongyu_targets) evt.dddtongyu_targets=[]; + var evt = trigger.getParent(); + if (!evt.dddtongyu_targets) + evt.dddtongyu_targets = []; evt.dddtongyu_targets.add(target); - game.log(target,'令',trigger.card,'对其无效'); + game.log( + target, + "令", + trigger.card, + "对其无效" + ); } - if(targets.length) event.goto(1); + if (targets.length) event.goto(1); }, - group:'dddtongyu_give', + group: "dddtongyu_give", }, - give:{ - trigger:{player:'wuguRemained'}, - direct:true, - filter(event,player){ - if(event.skill!='dddtongyu'||event.remained.filterInD().length==0) return false; - var list=event.getParent().dddtongyu_targets; - return list.some(target=>target.isIn()); + give: { + trigger: { player: "wuguRemained" }, + direct: true, + filter(event, player) { + if ( + event.skill != "dddtongyu" || + event.remained.filterInD().length == 0 + ) + return false; + var list = event.getParent().dddtongyu_targets; + return list.some((target) => target.isIn()); }, - content(){ - 'step 0' - event.cards=trigger.remained.filterInD(); - player.chooseTarget('仝御:令一名角色获得'+get.translation(event.cards),function(card,player,target){ - return _status.event.targets.includes(target); - }).set('targets',trigger.getParent().dddtongyu_targets).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att<3) return 0; - if(target.hasJudge('lebu')) att/=2; - if(target.hasSkillTag('nogain')) att/=10; - return att/(1+get.distance(player,target,'absolute')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dddtongyu_give',target); - target.gain(cards,'gain2'); + content() { + "step 0"; + event.cards = trigger.remained.filterInD(); + player + .chooseTarget( + "仝御:令一名角色获得" + + get.translation(event.cards), + function (card, player, target) { + return _status.event.targets.includes( + target + ); + } + ) + .set( + "targets", + trigger.getParent().dddtongyu_targets + ) + .set("ai", function (target) { + var att = get.attitude( + _status.event.player, + target + ); + if (att < 3) return 0; + if (target.hasJudge("lebu")) att /= 2; + if (target.hasSkillTag("nogain")) att /= 10; + return ( + att / + (1 + + get.distance( + player, + target, + "absolute" + )) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddtongyu_give", target); + target.gain(cards, "gain2"); } }, }, - blocker:{ - mark:true, - intro:{content:'本回合不能使用或打出手牌'}, - mod:{ - cardEnabled2(card){ + blocker: { + mark: true, + intro: { content: "本回合不能使用或打出手牌" }, + mod: { + cardEnabled2(card) { return false; }, }, }, }, }, - dddzhilian:{ - trigger:{global:'phaseEnd'}, - direct:true, - filter(event,player){ - var targets=game.filterPlayer2(function(current){ - return current.getHistory('useCard').length+current.getHistory('respond').length>0; + dddzhilian: { + trigger: { global: "phaseEnd" }, + direct: true, + filter(event, player) { + var targets = game.filterPlayer2(function (current) { + return ( + current.getHistory("useCard").length + + current.getHistory("respond").length > + 0 + ); }); - if(!targets.includes(player)||!targets.some(target=>target!=player&&target.hasSex('male'))) return false; - return targets.length==2&&!targets.some(target=>!target.isIn()); + if ( + !targets.includes(player) || + !targets.some( + (target) => + target != player && target.hasSex("male") + ) + ) + return false; + return ( + targets.length == 2 && + !targets.some((target) => !target.isIn()) + ); }, - content(){ - 'step 0' - var targets=game.filterPlayer(function(current){ - return current.getHistory('useCard').length+current.getHistory('respond').length>0; - }).sortBySeat(trigger.player); - event.targets=targets; - var choices=['摸牌']; - var prompt2='令'; - for(var i=0;i<2;i++){ - if(targets[i]==player) prompt2+='你'; - else prompt2+=get.translation(targets[i]); - if(i==0) prompt2+='和' + content() { + "step 0"; + var targets = game + .filterPlayer(function (current) { + return ( + current.getHistory("useCard").length + + current.getHistory("respond").length > + 0 + ); + }) + .sortBySeat(trigger.player); + event.targets = targets; + var choices = ["摸牌"]; + var prompt2 = "令"; + for (var i = 0; i < 2; i++) { + if (targets[i] == player) prompt2 += "你"; + else prompt2 += get.translation(targets[i]); + if (i == 0) prompt2 += "和"; } - prompt2+='各摸一张牌'; - if(targets.some(target=>target.countCards('he')>0)){ - prompt2+='或各弃置一张牌'; - choices.push('弃牌'); + prompt2 += "各摸一张牌"; + if (targets.some((target) => target.countCards("he") > 0)) { + prompt2 += "或各弃置一张牌"; + choices.push("弃牌"); } - player.chooseControl(choices,'cancel2').set('prompt',get.prompt('dddzhilian')).set('prompt2',prompt2).set('ai',function(){ - var player=_status.event.player; - var targets=_status.event.getParent().targets.slice(0); - if(targets.includes(player)){ - targets.remove(player); - if(get.attitude(player,targets[0])>0) return 0; - if(targets[0].countCards('he')>0&&!targets[0].hasCard(card=>get.value(card,targets[0])<=0,'e')&&player.countCards('h','sha')>0) return 1; - return 'cancel2'; - } - else{ - var att1=get.attitude(player,targets[0]),att2=get.attitude(player,targets[1]); - if(get.sgn(att1)!=get.sgn(att2)) return 'cancel2'; - return att1>0?0:1; - } - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('dddzhilian',targets); - if(result.control=='摸牌'){ + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("dddzhilian")) + .set("prompt2", prompt2) + .set("ai", function () { + var player = _status.event.player; + var targets = _status.event + .getParent() + .targets.slice(0); + if (targets.includes(player)) { + targets.remove(player); + if (get.attitude(player, targets[0]) > 0) + return 0; + if ( + targets[0].countCards("he") > 0 && + !targets[0].hasCard( + (card) => + get.value(card, targets[0]) <= 0, + "e" + ) && + player.countCards("h", "sha") > 0 + ) + return 1; + return "cancel2"; + } else { + var att1 = get.attitude(player, targets[0]), + att2 = get.attitude(player, targets[1]); + if (get.sgn(att1) != get.sgn(att2)) + return "cancel2"; + return att1 > 0 ? 0 : 1; + } + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("dddzhilian", targets); + if (result.control == "摸牌") { game.asyncDraw(targets); game.delayex(); + } else { + for (var target of targets) + target.chooseToDiscard("he", true); } - else{ - for(var target of targets) target.chooseToDiscard('he',true); - } - if(!targets.includes(player)) event.finish(); - } - else event.finish(); - 'step 2' - var cards=[]; - game.getGlobalHistory('cardMove',function(evt){ - if((evt.name=='lose'&&evt.position==ui.discardPile)||evt.name=='cardsDiscard') cards.addArray(evt.cards); + if (!targets.includes(player)) event.finish(); + } else event.finish(); + ("step 2"); + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if ( + (evt.name == "lose" && + evt.position == ui.discardPile) || + evt.name == "cardsDiscard" + ) + cards.addArray(evt.cards); }); - cards=cards.filter(card=>card.name=='sha'&&get.position(card,true)=='d'); - if(cards.length>0) player.gain(cards,'gain2'); - } + cards = cards.filter( + (card) => + card.name == "sha" && + get.position(card, true) == "d" + ); + if (cards.length > 0) player.gain(cards, "gain2"); + }, }, - dddjijian:{ - enable:'phaseUse', - usable:1, - filterCard:{name:'sha'}, - position:'h', - discard:false, - delay:false, - lose:false, - filter:(event,player)=>game.hasPlayer(current=>lib.skill.dddjijian.filterTarget(null,player,current)), - filterTarget:(card,player,target)=>(target!=player&&target.hasSex('male')), - content(){ - 'step 0' + dddjijian: { + enable: "phaseUse", + usable: 1, + filterCard: { name: "sha" }, + position: "h", + discard: false, + delay: false, + lose: false, + filter: (event, player) => + game.hasPlayer((current) => + lib.skill.dddjijian.filterTarget(null, player, current) + ), + filterTarget: (card, player, target) => + target != player && target.hasSex("male"), + content() { + "step 0"; player.showCards(cards); - player.give(cards,target); - 'step 1' - var cards=target.getCards('h'); - if(!cards.length) event.finish(); - else if(cards.length==1) event._result={bool:true,cards:cards}; - else target.chooseCard('h',true,[1,2],'请展示一至两张颜色相同的【杀】或普通锦囊牌',(card,player)=>{ - var color=get.color(card); - for(var cardx of ui.selected.cards){ - if(get.color(cardx)!=color) return false; - } - return get.name(card)=='sha'||get.type(card)=='trick'; - }).set('complexCard',true).set('ai',function(card){ - var player=_status.event.player,source=_status.event.getParent().player; - if(get.attitude(source,player)<=0) return -get.value(card); - var name=get.name(card),color=get.color(card); - if(name=='sha'||player.getUseValue(card)<=0||player.hasCard(card2=>{ - return card2!=card&&!ui.selected.cards.includes(card2)&&get.name(card2)==name; - })){ - if(!ui.selected.cards.length&&color=='black') return 1+Math.random(); - return Math.random(); - } - if(!ui.selected.cards.length||get.color(ui.selected.cards[0]=='red')){ - if(color=='black') return 0.2-player.getUseValue(card)/100+Math.random(); - } - return 0.1-player.getUseValue(card)/100; - }); - 'step 2' - if(result.bool){ - var cards=result.cards; - event.cards=cards; - target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【赍剑】'); - event.usedName=[]; - event.targets=[player,target].sortBySeat(_status.currentPhase||player); - } - else event.finish(); - 'step 3' - var current=event.targets.shift(); - if(!current.isIn()){ + player.give(cards, target); + ("step 1"); + var cards = target.getCards("h"); + if (!cards.length) event.finish(); + else if (cards.length == 1) + event._result = { bool: true, cards: cards }; + else + target + .chooseCard( + "h", + true, + [1, 2], + "请展示一至两张颜色相同的【杀】或普通锦囊牌", + (card, player) => { + var color = get.color(card); + for (var cardx of ui.selected.cards) { + if (get.color(cardx) != color) + return false; + } + return ( + get.name(card) == "sha" || + get.type(card) == "trick" + ); + } + ) + .set("complexCard", true) + .set("ai", function (card) { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.attitude(source, player) <= 0) + return -get.value(card); + var name = get.name(card), + color = get.color(card); + if ( + name == "sha" || + player.getUseValue(card) <= 0 || + player.hasCard((card2) => { + return ( + card2 != card && + !ui.selected.cards.includes( + card2 + ) && + get.name(card2) == name + ); + }) + ) { + if ( + !ui.selected.cards.length && + color == "black" + ) + return 1 + Math.random(); + return Math.random(); + } + if ( + !ui.selected.cards.length || + get.color(ui.selected.cards[0] == "red") + ) { + if (color == "black") + return ( + 0.2 - + player.getUseValue(card) / 100 + + Math.random() + ); + } + return 0.1 - player.getUseValue(card) / 100; + }); + ("step 2"); + if (result.bool) { + var cards = result.cards; + event.cards = cards; + target.showCards( + cards, + get.translation(player) + + "对" + + get.translation(target) + + "发动了【赍剑】" + ); + event.usedName = []; + event.targets = [player, target].sortBySeat( + _status.currentPhase || player + ); + } else event.finish(); + ("step 3"); + var current = event.targets.shift(); + if (!current.isIn()) { event.goto(5); return; } - event.current=current; - var list=event.cards.filter(card=>{ - return !event.usedName.includes(get.name(card))&¤t.hasUseTarget({ - name:get.name(card), - nature:get.nature(card) + event.current = current; + var list = event.cards + .filter((card) => { + return ( + !event.usedName.includes(get.name(card)) && + current.hasUseTarget({ + name: get.name(card), + nature: get.nature(card), + }) + ); + }) + .map((card) => { + return [ + get.type(card), + "", + get.name(card), + get.nature(card), + ]; }); - }).map(card=>{ - return [get.type(card),'',get.name(card),get.nature(card)]; - }); - if(!list.length) event.finish(); - else current.chooseButton(['赍剑:视为使用一张牌',[list,'vcard']],true).set('ai',function(button){ - return get.player().getUseValue({name:button.link[2],nature:button.link[3]}); - }); - 'step 4' - if(result.bool){ - var name=result.links[0][2]; + if (!list.length) event.finish(); + else + current + .chooseButton( + ["赍剑:视为使用一张牌", [list, "vcard"]], + true + ) + .set("ai", function (button) { + return get + .player() + .getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }); + ("step 4"); + if (result.bool) { + var name = result.links[0][2]; event.usedName.add(name); - event.current.chooseUseTarget({name:name,nature:result.links[0][3],isCard:true},true,false); + event.current.chooseUseTarget( + { + name: name, + nature: result.links[0][3], + isCard: true, + }, + true, + false + ); } - 'step 5' - if(event.targets.length) event.goto(3); + ("step 5"); + if (event.targets.length) event.goto(3); }, - ai:{ - order:4, - result:{ - player(player,target){ - if(get.attitude(player,target)>0&&player.hasCard(card=>get.name(card)=='sha','h')) return target.countCards('h'); - return 0.1/target.countCards('h'); + ai: { + order: 4, + result: { + player(player, target) { + if ( + get.attitude(player, target) > 0 && + player.hasCard( + (card) => get.name(card) == "sha", + "h" + ) + ) + return target.countCards("h"); + return 0.1 / target.countCards("h"); }, }, }, }, - dddjijian_old:{ - enable:'phaseUse', - usable:1, - filter:(event,player)=>game.hasPlayer(current=>lib.skill.dddjijian_old.filterTarget(null,player,current)), - filterTarget:(card,player,target)=>(target!=player&&target.hasSex('male')&&target.countCards('h')>0), - content(){ - 'step 0' - target.chooseCard('h',true,[1,2],'请展示一至两张手牌').set('ai',function(card){ - var player=_status.event.player,source=_status.event.getParent().player; - if(get.attitude(source,player)<=0) return -get.value(card); - var name=get.name(card),color=get.color(card); - if(name=='sha'||player.getUseValue(card)<=0||player.hasCard(card2=>{ - return card2!=card&&!ui.selected.cards.includes(card2)&&get.name(card2)==name; - })){ - if(!ui.selected.cards.length&&color=='black') return 1+Math.random(); - return Math.random(); - } - if(!ui.selected.cards.length||get.color(ui.selected.cards[0]=='red')){ - if(color=='black') return 0.2-player.getUseValue(card)/100+Math.random(); - } - return 0.1-player.getUseValue(card)/100; - }); - 'step 1' - if(result.bool){ - var cards=result.cards; - event.cards=cards; - target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【赍剑】'); - if(!player.hasCard(card=>{ - if(_status.connectMode) return true; - return get.name(card,player)=='sha'; - },'h')) event.finish(); - } - else event.finish(); - 'step 2' - var colors=[]; - for(var card of cards) colors.add(get.color(card,target)); + dddjijian_old: { + enable: "phaseUse", + usable: 1, + filter: (event, player) => + game.hasPlayer((current) => + lib.skill.dddjijian_old.filterTarget( + null, + player, + current + ) + ), + filterTarget: (card, player, target) => + target != player && + target.hasSex("male") && + target.countCards("h") > 0, + content() { + "step 0"; + target + .chooseCard("h", true, [1, 2], "请展示一至两张手牌") + .set("ai", function (card) { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.attitude(source, player) <= 0) + return -get.value(card); + var name = get.name(card), + color = get.color(card); + if ( + name == "sha" || + player.getUseValue(card) <= 0 || + player.hasCard((card2) => { + return ( + card2 != card && + !ui.selected.cards.includes(card2) && + get.name(card2) == name + ); + }) + ) { + if ( + !ui.selected.cards.length && + color == "black" + ) + return 1 + Math.random(); + return Math.random(); + } + if ( + !ui.selected.cards.length || + get.color(ui.selected.cards[0] == "red") + ) { + if (color == "black") + return ( + 0.2 - + player.getUseValue(card) / 100 + + Math.random() + ); + } + return 0.1 - player.getUseValue(card) / 100; + }); + ("step 1"); + if (result.bool) { + var cards = result.cards; + event.cards = cards; + target.showCards( + cards, + get.translation(player) + + "对" + + get.translation(target) + + "发动了【赍剑】" + ); + if ( + !player.hasCard((card) => { + if (_status.connectMode) return true; + return get.name(card, player) == "sha"; + }, "h") + ) + event.finish(); + } else event.finish(); + ("step 2"); + var colors = []; + for (var card of cards) colors.add(get.color(card, target)); colors.sort(); - var str='若你给出的【杀】为' - for(var i=0;iget.name(card,player)=='sha', - '是否交给'+get.translation(target)+'一张【杀】?',str - ).set('colors',colors).set('ai',function(card){ - var player=_status.event.player,target=_status.event.getParent().target; - if(get.attitude(player,target)<0) return false; - if(!_status.event.colors.includes(get.color(card,player))) return 0; - if(game.hasNature(card)) return 1.2; - return 1; - }) - 'step 3' - if(result.bool){ - player.give(result.cards,target,'giveAuto'); - var num=0,color=get.color(result.cards[0],player); - for(var card of cards){ - if(get.color(card,target)==color) num++; + str += ",则其获得后续增益效果"; + player + .chooseCard( + "h", + (card, player) => get.name(card, player) == "sha", + "是否交给" + + get.translation(target) + + "一张【杀】?", + str + ) + .set("colors", colors) + .set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getParent().target; + if (get.attitude(player, target) < 0) return false; + if ( + !_status.event.colors.includes( + get.color(card, player) + ) + ) + return 0; + if (game.hasNature(card)) return 1.2; + return 1; + }); + ("step 3"); + if (result.bool) { + player.give(result.cards, target, "giveAuto"); + var num = 0, + color = get.color(result.cards[0], player); + for (var card of cards) { + if (get.color(card, target) == color) num++; } - if(!num) event.finish(); - else event.num=num; - } - else event.finish(); - 'step 4' - var cards=target.getCards('h'); + if (!num) event.finish(); + else event.num = num; + } else event.finish(); + ("step 4"); + var cards = target.getCards("h"); cards.removeArray(event.cards); - var names=[]; - for(var card of cards){ - var name=get.name(card,target),type=get.type(card); - if(type!='basic'&&type!='trick') continue; - if(name=='sha'){ - var natures=get.natureList(card,target); - for(var nature of natures){ - if(nature&&lib.nature.has(nature)) name+=('|'+nature); + var names = []; + for (var card of cards) { + var name = get.name(card, target), + type = get.type(card); + if (type != "basic" && type != "trick") continue; + if (name == "sha") { + var natures = get.natureList(card, target); + for (var nature of natures) { + if (nature && lib.nature.has(nature)) + name += "|" + nature; } } names.push(name); } - if(!names.length) event.finish(); - else event.names=names; - 'step 5' + if (!names.length) event.finish(); + else event.names = names; + ("step 5"); event.num--; - target.chooseButton([ - '是否视为使用一张牌?', - [event.names.map(name=>{ - if(name.indexOf('sha|')==0){ - return ['基本','','sha',name.slice(4).split('|')]; - } - return [get.type(name),'',name]; - }),'vcard'] - ]).set('filterButton',function(button){ - var card={ - name:button.link[2], - nature:button.link[3], - isCard:true, - },player=_status.event.player; - return player.hasUseTarget(card); - }).set('ai',function(button){ - var card={ - name:button.link[2], - nature:button.link[3], - isCard:true, - },player=_status.event.player; - return player.getUseValue(card); - }); - 'step 6' - if(result.bool){ - var card={ - name:result.links[0][2], - nature:result.links[0][3], - isCard:true, - } - target.chooseUseTarget(card,true,false); - if(event.num>0){ - var name=card.name; - if(name=='sha'){ - var natures=get.natureList(card,target); - for(var nature of natures){ - if(nature&&lib.nature.has(nature)) name+=('|'+nature); + target + .chooseButton([ + "是否视为使用一张牌?", + [ + event.names.map((name) => { + if (name.indexOf("sha|") == 0) { + return [ + "基本", + "", + "sha", + name.slice(4).split("|"), + ]; + } + return [get.type(name), "", name]; + }), + "vcard", + ], + ]) + .set("filterButton", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + player = _status.event.player; + return player.hasUseTarget(card); + }) + .set("ai", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + player = _status.event.player; + return player.getUseValue(card); + }); + ("step 6"); + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }; + target.chooseUseTarget(card, true, false); + if (event.num > 0) { + var name = card.name; + if (name == "sha") { + var natures = get.natureList(card, target); + for (var nature of natures) { + if (nature && lib.nature.has(nature)) + name += "|" + nature; } } event.names.remove(name); - if(event.names.length>0) event.goto(5); + if (event.names.length > 0) event.goto(5); } - } - else event.finish(); + } else event.finish(); }, - ai:{ - order:4, - result:{ - player(player,target){ - if(get.attitude(player,target)>0&&player.hasCard(card=>get.name(card)=='sha','h')) return target.countCards('h'); - return 0.1/target.countCards('h'); + ai: { + order: 4, + result: { + player(player, target) { + if ( + get.attitude(player, target) > 0 && + player.hasCard( + (card) => get.name(card) == "sha", + "h" + ) + ) + return target.countCards("h"); + return 0.1 / target.countCards("h"); }, }, }, }, - dddzhengjun:{ - trigger:{global:['damageEnd','loseHpEnd','recoverEnd','loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter']}, - filter(event,player){ - if(!player.isPhaseUsing()) return false; - if(event.name=='damage'||event.name=='loseHp'||event.name=='recover'){ - if(player.hasSkill('dddzhengjun_hp')) return false; - return event.player.getHp()==player.getHp(); + dddzhengjun: { + trigger: { + global: [ + "damageEnd", + "loseHpEnd", + "recoverEnd", + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + filter(event, player) { + if (!player.isPhaseUsing()) return false; + if ( + event.name == "damage" || + event.name == "loseHp" || + event.name == "recover" + ) { + if (player.hasSkill("dddzhengjun_hp")) return false; + return event.player.getHp() == player.getHp(); } - const info=get.info('dddzhengjun'); - const hs_check=info.hs_check,es_check=info.es_check; - return game.hasPlayer(target=>{ - if(event.getg&&event.getg(target)&&event.getg(target).length&&hs_check(player,target)) return true; - const evt=event.getl(target); - if(evt&&evt.hs&&evt.hs.length&&hs_check(player,target)) return true; - if(event.name=='equip'&&event.player==target&&(!evt||evt.cards.length!=1)&&es_check(player,target)) return true; - return evt&&evt.es&&evt.es.length&&es_check(player,target); + const info = get.info("dddzhengjun"); + const hs_check = info.hs_check, + es_check = info.es_check; + return game.hasPlayer((target) => { + if ( + event.getg && + event.getg(target) && + event.getg(target).length && + hs_check(player, target) + ) + return true; + const evt = event.getl(target); + if ( + evt && + evt.hs && + evt.hs.length && + hs_check(player, target) + ) + return true; + if ( + event.name == "equip" && + event.player == target && + (!evt || evt.cards.length != 1) && + es_check(player, target) + ) + return true; + return ( + evt && + evt.es && + evt.es.length && + es_check(player, target) + ); }); }, - hs_check(player,target){ - return !player.hasSkill('dddzhengjun_hs')&&target.countCards('h')==player.countCards('h'); + hs_check(player, target) { + return ( + !player.hasSkill("dddzhengjun_hs") && + target.countCards("h") == player.countCards("h") + ); }, - es_check(player,target){ - return !player.hasSkill('dddzhengjun_es')&&target.countCards('e')==player.countCards('e'); + es_check(player, target) { + return ( + !player.hasSkill("dddzhengjun_es") && + target.countCards("e") == player.countCards("e") + ); }, - async cost(event,trigger,player){ - if(trigger.name=='damage'||trigger.name=='loseHp'||trigger.name=='recover'){ - let list=['失去体力','cancel2']; - if(trigger.player.isDamaged()) list.unshift('回复体力'); - const {result:{control}}=await player.chooseControl(list) - .set('prompt',get.prompt('dddzhengjun',trigger.player)) - .set('prompt2','令'+get.translation(event.player)+'执行其中一项') - .set('ai',()=>{ - const player=get.event('player'),target=get.event().getTrigger().player; - if(get.event('controls').includes('回复体力')&&get.recoverEffect(target,player,player)>0) return '回复体力'; - return get.effect(target,{name:'losehp'},player,player)>0?'失去体力':'cancel2'; - }); - event.result={ - bool:control!='cancel2', - targets:[trigger.player], - cost_data:control, + async cost(event, trigger, player) { + if ( + trigger.name == "damage" || + trigger.name == "loseHp" || + trigger.name == "recover" + ) { + let list = ["失去体力", "cancel2"]; + if (trigger.player.isDamaged()) + list.unshift("回复体力"); + const { + result: { control }, + } = await player + .chooseControl(list) + .set( + "prompt", + get.prompt("dddzhengjun", trigger.player) + ) + .set( + "prompt2", + "令" + + get.translation(event.player) + + "执行其中一项" + ) + .set("ai", () => { + const player = get.event("player"), + target = get.event().getTrigger().player; + if ( + get + .event("controls") + .includes("回复体力") && + get.recoverEffect(target, player, player) > + 0 + ) + return "回复体力"; + return get.effect( + target, + { name: "losehp" }, + player, + player + ) > 0 + ? "失去体力" + : "cancel2"; + }); + event.result = { + bool: control != "cancel2", + targets: [trigger.player], + cost_data: control, }; - } - else{ - let map={}; - const hs_targets=game.filterPlayer(target=>{ - if(!get.info('dddzhengjun').hs_check(player,target)) return false; - if(trigger.getg&&trigger.getg(target)&&trigger.getg(target).length) return true; - const evt=trigger.getl(target); - return evt&&evt.hs&&evt.hs.length; + } else { + let map = {}; + const hs_targets = game.filterPlayer((target) => { + if ( + !get + .info("dddzhengjun") + .hs_check(player, target) + ) + return false; + if ( + trigger.getg && + trigger.getg(target) && + trigger.getg(target).length + ) + return true; + const evt = trigger.getl(target); + return evt && evt.hs && evt.hs.length; }); - const es_targets=game.filterPlayer(target=>{ - if(!get.info('dddzhengjun').es_check(player,target)) return false; - const evt=trigger.getl(target); - if(trigger.name=='equip'&&trigger.player==target&&(!evt||evt.cards.length!=1)) return true; - return evt&&evt.es&&evt.es.length; + const es_targets = game.filterPlayer((target) => { + if ( + !get + .info("dddzhengjun") + .es_check(player, target) + ) + return false; + const evt = trigger.getl(target); + if ( + trigger.name == "equip" && + trigger.player == target && + (!evt || evt.cards.length != 1) + ) + return true; + return evt && evt.es && evt.es.length; }); - if(hs_targets.length){ + if (hs_targets.length) { let target; - if(hs_targets.length==1) target=hs_targets[0]; - else{ - let targets=await player.chooseTarget(get.prompt('dddzhengjun'),'令其中一名角色摸一张牌或弃置一张牌',(card,player,target)=>{ - return get.event('targets').includes(target); - }).set('ai',target=>{ - const player=get.event('player'); - return Math.max(get.effect(target,{name:'guohe_copy2'},target,player),get.effect(target,{name:'draw'},player,player)); - }).set('targets',hs_targets).forResultTargets(); - if(targets&&targets.length) target=targets[0]; + if (hs_targets.length == 1) target = hs_targets[0]; + else { + let targets = await player + .chooseTarget( + get.prompt("dddzhengjun"), + "令其中一名角色摸一张牌或弃置一张牌", + (card, player, target) => { + return get + .event("targets") + .includes(target); + } + ) + .set("ai", (target) => { + const player = get.event("player"); + return Math.max( + get.effect( + target, + { name: "guohe_copy2" }, + target, + player + ), + get.effect( + target, + { name: "draw" }, + player, + player + ) + ); + }) + .set("targets", hs_targets) + .forResultTargets(); + if (targets && targets.length) + target = targets[0]; } - if(target){ - let list=['摸牌']; - if(target.countCards('h')) list.push('弃牌'); - const {result:{control}}=await player.chooseControl(list,'cancel2') - .set('prompt',get.prompt('dddzhengjun',target)) - .set('prompt2','令'+get.translation(target)+'执行其中一项') - .set('ai',()=>{ - const player=get.event('player'),target=get.event().getTrigger().player; - if(get.event('controls').includes('弃牌')&&get.effect(target,{name:'guohe_copy2'},player,player)>0) return '弃牌'; - return get.effect(target,{name:'draw'},player,player)>0?'摸牌':'cancel2'; - }); - if(control!='cancel2'){ - map.hs_target=[target,control]; + if (target) { + let list = ["摸牌"]; + if (target.countCards("h")) list.push("弃牌"); + const { + result: { control }, + } = await player + .chooseControl(list, "cancel2") + .set( + "prompt", + get.prompt("dddzhengjun", target) + ) + .set( + "prompt2", + "令" + + get.translation(target) + + "执行其中一项" + ) + .set("ai", () => { + const player = get.event("player"), + target = get + .event() + .getTrigger().player; + if ( + get + .event("controls") + .includes("弃牌") && + get.effect( + target, + { name: "guohe_copy2" }, + player, + player + ) > 0 + ) + return "弃牌"; + return get.effect( + target, + { name: "draw" }, + player, + player + ) > 0 + ? "摸牌" + : "cancel2"; + }); + if (control != "cancel2") { + map.hs_target = [target, control]; } } } - if(es_targets.length){ + if (es_targets.length) { let target; - if(hs_targets.length==1){ - const {result:{bool}}=await player.chooseBool() - .set('prompt',get.prompt('dddzhengjun',hs_targets[0])) - .set('prompt2','移动'+get.translation(hs_targets[0])+'的一张装备牌') - .set('choice',()=>player.canMoveCard(true,true,hs_targets[0])); - if(bool) target=hs_targets[0]; + if (hs_targets.length == 1) { + const { + result: { bool }, + } = await player + .chooseBool() + .set( + "prompt", + get.prompt("dddzhengjun", hs_targets[0]) + ) + .set( + "prompt2", + "移动" + + get.translation(hs_targets[0]) + + "的一张装备牌" + ) + .set("choice", () => + player.canMoveCard( + true, + true, + hs_targets[0] + ) + ); + if (bool) target = hs_targets[0]; + } else { + let targets = await player + .chooseTarget( + get.prompt("dddzhengjun"), + "移动其中一名角色的一张装备牌", + (card, player, target) => { + return get + .event("targets") + .includes(target); + } + ) + .set("ai", (target) => { + const player = get.event("player"); + return player.canMoveCard( + true, + true, + target + ) + ? 1 + Math.random() + : 0; + }) + .set("targets", es_targets) + .forResultTargets(); + if (targets && targets.length) + target = targets[0]; } - else{ - let targets=await player.chooseTarget(get.prompt('dddzhengjun'),'移动其中一名角色的一张装备牌',(card,player,target)=>{ - return get.event('targets').includes(target); - }).set('ai',target=>{ - const player=get.event('player'); - return player.canMoveCard(true,true,target)?(1+Math.random()):0; - }).set('targets',es_targets).forResultTargets(); - if(targets&&targets.length) target=targets[0]; - } - if(target){ - map.es_target=target; + if (target) { + map.es_target = target; } } - event.result={ - bool:(map.hs_target||map.es_target), - targets:[(map.hs_target||[])[0]].concat(map.es_target?[map.es_target]:[]), - cost_data:map, + event.result = { + bool: map.hs_target || map.es_target, + targets: [(map.hs_target || [])[0]].concat( + map.es_target ? [map.es_target] : [] + ), + cost_data: map, }; } }, - async content(event,trigger,player){ - const data=event.cost_data; - if(trigger.name=='damage'||trigger.name=='loseHp'||trigger.name=='recover'){ - player.addTempSkill('dddzhengjun_hp','phaseUseAfter'); - await trigger.player[data=='回复体力'?'recover':'loseHp'](); - } - else{ - if(data.hs_target){ - player.addTempSkill('dddzhengjun_hs','phaseUseAfter'); - if(data.hs_target[1]=='摸牌') await data.hs_target[0].draw(); - else await data.hs_target[0].chooseToDiscard('he',true); + async content(event, trigger, player) { + const data = event.cost_data; + if ( + trigger.name == "damage" || + trigger.name == "loseHp" || + trigger.name == "recover" + ) { + player.addTempSkill("dddzhengjun_hp", "phaseUseAfter"); + await trigger.player[ + data == "回复体力" ? "recover" : "loseHp" + ](); + } else { + if (data.hs_target) { + player.addTempSkill( + "dddzhengjun_hs", + "phaseUseAfter" + ); + if (data.hs_target[1] == "摸牌") + await data.hs_target[0].draw(); + else + await data.hs_target[0].chooseToDiscard( + "he", + true + ); } - if(data.es_target){ - player.addTempSkill('dddzhengjun_es','phaseUseAfter'); - await player.moveCard(true,data.es_target); + if (data.es_target) { + player.addTempSkill( + "dddzhengjun_es", + "phaseUseAfter" + ); + await player.moveCard(true, data.es_target); } } }, - subSkill:{ - hs:{charlotte:true}, - es:{charlotte:true}, - hp:{charlotte:true}, + subSkill: { + hs: { charlotte: true }, + es: { charlotte: true }, + hp: { charlotte: true }, }, }, - dddxianxi:{ - trigger:{ - player:"useCard2", + dddxianxi: { + trigger: { + player: "useCard2", }, - direct:true, - filter(event,player){ - if(event.card.name!='sha'||!player.isPhaseUsing()) return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current); + direct: true, + filter(event, player) { + if (event.card.name != "sha" || !player.isPhaseUsing()) + return false; + return game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2( + event.card, + player, + current + ) + ); }); }, - content(){ - 'step 0' - player.chooseTarget( - get.prompt('dddxianxi'), - '为'+get.translation(trigger.card)+'增加任意个目标', - function(card,player,target){ - var event=_status.event.getTrigger(); - return !event.targets.includes(target)&&lib.filter.targetEnabled2(event.card,player,target); - }, - [1,Infinity] - ).set('ai',function(target){ - var evt=_status.event.getTrigger(); - if(get.damageEffect(target,evt.player,evt.player)<0) return 0; - return get.effect(target,evt.card,evt.player,evt.player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - event.targets=targets; - if(!event.isMine()&&!event.isOnline()) game.delayx(); - } - else event.finish(); - 'step 2' - player.logSkill('dddxianxi',targets); + content() { + "step 0"; + player + .chooseTarget( + get.prompt("dddxianxi"), + "为" + + get.translation(trigger.card) + + "增加任意个目标", + function (card, player, target) { + var event = _status.event.getTrigger(); + return ( + !event.targets.includes(target) && + lib.filter.targetEnabled2( + event.card, + player, + target + ) + ); + }, + [1, Infinity] + ) + .set("ai", function (target) { + var evt = _status.event.getTrigger(); + if ( + get.damageEffect( + target, + evt.player, + evt.player + ) < 0 + ) + return 0; + return get.effect( + target, + evt.card, + evt.player, + evt.player + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + ("step 2"); + player.logSkill("dddxianxi", targets); trigger.targets.addArray(targets); - if(!trigger._dddxianxi_map) trigger._dddxianxi_map={}; - trigger._dddxianxi_map[player.playerid]=targets.slice(0); - player.addTempSkill('dddxianxi_delay'); + if (!trigger._dddxianxi_map) trigger._dddxianxi_map = {}; + trigger._dddxianxi_map[player.playerid] = targets.slice(0); + player.addTempSkill("dddxianxi_delay"); }, - subSkill:{ - delay:{ - charlotte:true, - trigger:{ - player:"useCardAfter", + subSkill: { + delay: { + charlotte: true, + trigger: { + player: "useCardAfter", }, - forced:true, - filter(event,player){ - if(!event._dddxianxi_map||!event._dddxianxi_map[player.playerid]) return false; - for(var target of event._dddxianxi_map[player.playerid]){ - if(!target.hasHistory('damage',function(evt){ - return evt.card==event.card; - })) return true; + forced: true, + filter(event, player) { + if ( + !event._dddxianxi_map || + !event._dddxianxi_map[player.playerid] + ) + return false; + for (var target of event._dddxianxi_map[ + player.playerid + ]) { + if ( + !target.hasHistory( + "damage", + function (evt) { + return evt.card == event.card; + } + ) + ) + return true; } return false; }, - content(){ - 'step 0' - var targets=trigger._dddxianxi_map[player.playerid].filter(function(target){ - return !target.hasHistory('damage',function(evt){ - return evt.card==trigger.card; + content() { + "step 0"; + var targets = trigger._dddxianxi_map[ + player.playerid + ] + .filter(function (target) { + return !target.hasHistory( + "damage", + function (evt) { + return evt.card == trigger.card; + } + ); + }) + .sortBySeat(); + event.targets = targets; + var num = targets.length; + player + .chooseToDiscard( + "he", + num, + "险袭:选择弃置" + + get.cnNumber(num) + + "张牌", + "然后对" + + get.translation(targets) + + "各造成1点伤害。或点击「取消」,改为摸" + + get.cnNumber(num) + + "张牌并失去1点体力" + ) + .set("ai", function (card) { + return 7 - get.value(card); }); - }).sortBySeat(); - event.targets=targets; - var num=targets.length; - player.chooseToDiscard('he',num,'险袭:选择弃置'+get.cnNumber(num)+'张牌','然后对'+get.translation(targets)+'各造成1点伤害。或点击「取消」,改为摸'+get.cnNumber(num)+'张牌并失去1点体力').set('ai',function(card){ - return 7-get.value(card); - }) - 'step 1' - if(result.bool){ - for(var i of targets){ + ("step 1"); + if (result.bool) { + for (var i of targets) { player.line(i); i.damage(); } - } - else{ + } else { player.draw(targets.length); player.loseHp(); } }, - sub:true, + sub: true, }, }, }, - dddlingyong:{ - trigger:{ - global:["phaseZhunbeiSkipped","phaseZhunbeiCancelled","phaseDrawSkipped","phaseDrawCancelled","phaseJudgeSkipped","phaseJudgeCancelled","phaseUseSkipped","phaseUseCancelled","phaseDiscardSkipped","phaseDiscardCancelled","phaseJieshuSkipped","phaseJieshuCancelled"], + dddlingyong: { + trigger: { + global: [ + "phaseZhunbeiSkipped", + "phaseZhunbeiCancelled", + "phaseDrawSkipped", + "phaseDrawCancelled", + "phaseJudgeSkipped", + "phaseJudgeCancelled", + "phaseUseSkipped", + "phaseUseCancelled", + "phaseDiscardSkipped", + "phaseDiscardCancelled", + "phaseJieshuSkipped", + "phaseJieshuCancelled", + ], }, - frequent:true, - content (){ - 'step 0' - player.judge(function(card){ - var name=get.name(card,false); - if(name=='sha') return -2; - return 2; - }).set('callback',function(){ - if(event.judgeResult.name!='sha'){ - var card=event.judgeResult.card; - if(get.position(card,true)=='o') player.chooseUseTarget(card); - } - }).judge2=function(result){ + frequent: true, + content() { + "step 0"; + player + .judge(function (card) { + var name = get.name(card, false); + if (name == "sha") return -2; + return 2; + }) + .set("callback", function () { + if (event.judgeResult.name != "sha") { + var card = event.judgeResult.card; + if (get.position(card, true) == "o") + player.chooseUseTarget(card); + } + }).judge2 = function (result) { return result.bool; }; - 'step 1' - if(result.bool){ - player.chooseBool('是否继续进行【灵涌】判定?').set('frequentSkill','dddlingyong'); - } - else event.finish(); - 'step 2' - if(result.bool) event.goto(0); + ("step 1"); + if (result.bool) { + player + .chooseBool("是否继续进行【灵涌】判定?") + .set("frequentSkill", "dddlingyong"); + } else event.finish(); + ("step 2"); + if (result.bool) event.goto(0); }, }, - "dddxuxiao":{ - trigger:{ - global:["loseAfter","loseAsyncAfter"], + dddxuxiao: { + trigger: { + global: ["loseAfter", "loseAsyncAfter"], }, - direct:true, - filter (event,player){ - if(event.type!='discard') return false; - var cards=event.getd(); - for(var i of cards){ - if(get.position(i,true)=='d'&&get.color(i,false)=='black'&&get.type(i,null,true)=='basic'){ - var card=get.autoViewAs({name:'bingliang'},[i]); - if(game.hasPlayer(function(current){ - return current.canAddJudge(card); - })) return true; + direct: true, + filter(event, player) { + if (event.type != "discard") return false; + var cards = event.getd(); + for (var i of cards) { + if ( + get.position(i, true) == "d" && + get.color(i, false) == "black" && + get.type(i, null, true) == "basic" + ) { + var card = get.autoViewAs({ name: "bingliang" }, [ + i, + ]); + if ( + game.hasPlayer(function (current) { + return current.canAddJudge(card); + }) + ) + return true; } } return false; }, - content (){ - 'step 0' - if(!event.cards) event.cards=[]; - var cards=trigger.getd().filter(function(i){ - if(!event.cards.includes(i)&&get.position(i,true)=='d'&&get.color(i,false)=='black'&&get.type(i,null,true)=='basic'){ - var card=get.autoViewAs({name:'bingliang'},[i]); - if(game.hasPlayer(function(current){ - return current.canAddJudge(card); - })) return true; + content() { + "step 0"; + if (!event.cards) event.cards = []; + var cards = trigger.getd().filter(function (i) { + if ( + !event.cards.includes(i) && + get.position(i, true) == "d" && + get.color(i, false) == "black" && + get.type(i, null, true) == "basic" + ) { + var card = get.autoViewAs({ name: "bingliang" }, [ + i, + ]); + if ( + game.hasPlayer(function (current) { + return current.canAddJudge(card); + }) + ) + return true; } return false; }); - if(cards.length){ - player.chooseButton([get.prompt('dddxuxiao'),cards]); - } - else event.finish(); - 'step 1' - if(result.bool){ - var card=result.links[0]; + if (cards.length) { + player.chooseButton([get.prompt("dddxuxiao"), cards]); + } else event.finish(); + ("step 1"); + if (result.bool) { + var card = result.links[0]; event.cards.push(card); - event.card=card; - player.chooseTarget(true,'请选择【兵粮寸断】的目标','将'+get.translation(card)+'置于一名角色的判定区内,然后其摸两张牌',function(card,player,target){ - var card=get.autoViewAs({name:'bingliang'},[_status.event.card]); - return target.canAddJudge(card); - }).set('card',card).set('ai',function(target){ - var card=get.autoViewAs({name:'bingliang'},[_status.event.card]),player=_status.event.player; - return get.attitude(player,target)+Math.max(0,get.effect(target,card,player,player)) - }) + event.card = card; + player + .chooseTarget( + true, + "请选择【兵粮寸断】的目标", + "将" + + get.translation(card) + + "置于一名角色的判定区内,然后其摸两张牌", + function (card, player, target) { + var card = get.autoViewAs( + { name: "bingliang" }, + [_status.event.card] + ); + return target.canAddJudge(card); + } + ) + .set("card", card) + .set("ai", function (target) { + var card = get.autoViewAs( + { name: "bingliang" }, + [_status.event.card] + ), + player = _status.event.player; + return ( + get.attitude(player, target) + + Math.max( + 0, + get.effect(target, card, player, player) + ) + ); + }); } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dddxuxiao',target); - target.addJudge({name:'bingliang'},[card]); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddxuxiao", target); + target.addJudge({ name: "bingliang" }, [card]); target.draw(2); event.goto(0); } }, }, - dddxuyu:{ - trigger:{ - player:"useCardAfter", + dddxuyu: { + trigger: { + player: "useCardAfter", }, - content(){ + content() { player.draw(); - player.when({player:'useCardAfter',global:'phaseAfter'}).filter(evt=>evt!=trigger).then(()=>{ - if(trigger.name=='useCard') player.chooseToDiscard('he',true); - }); + player + .when({ player: "useCardAfter", global: "phaseAfter" }) + .filter((evt) => evt != trigger) + .then(() => { + if (trigger.name == "useCard") + player.chooseToDiscard("he", true); + }); }, }, - dddshijian:{ - trigger:{ - global:'useCardAfter', + dddshijian: { + trigger: { + global: "useCardAfter", }, - filter(event,player){ - if(player==event.player) return false; - const evt=event.getParent('phaseUse'); - if(!evt||evt.player!=event.player) return false; - return event.player.getHistory('useCard',evtx=>{ - return evtx.getParent('phaseUse')==evt; - },event).length==2; + filter(event, player) { + if (player == event.player) return false; + const evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player.getHistory( + "useCard", + (evtx) => { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 2 + ); }, - direct:true, - *content(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.player; - let result=yield player.chooseCard('he',get.prompt('dddshijian',target),`交给${get.translation(target)}一张牌,然后其本回合使用下一张牌指定目标时,你令此牌额外结算一次或摸一张牌。`).set('ai',card=>{ - if(get.event('goon')) return 6-get.value(card); - return 0; - }).set('goon',get.attitude(player,target)>0&&target.hasCard(card=>target.hasValueTarget(card))); - if(!result.bool) return event.finish(); - player.logSkill('dddshijian',target); - player.give(result.cards,target); - player.addTempSkill('dddshijian_extra'); - player.markAuto('dddshijian_extra',target); + direct: true, + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let result = yield player + .chooseCard( + "he", + get.prompt("dddshijian", target), + `交给${get.translation( + target + )}一张牌,然后其本回合使用下一张牌指定目标时,你令此牌额外结算一次或摸一张牌。` + ) + .set("ai", (card) => { + if (get.event("goon")) return 6 - get.value(card); + return 0; + }) + .set( + "goon", + get.attitude(player, target) > 0 && + target.hasCard((card) => + target.hasValueTarget(card) + ) + ); + if (!result.bool) return event.finish(); + player.logSkill("dddshijian", target); + player.give(result.cards, target); + player.addTempSkill("dddshijian_extra"); + player.markAuto("dddshijian_extra", target); }, - subSkill:{ - extra:{ - trigger:{global:'useCardToPlayer'}, - filter(event,player){ - if(!event.isFirstTarget) return false; - return player.getStorage('dddshijian_extra').includes(event.player); + subSkill: { + extra: { + trigger: { global: "useCardToPlayer" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + return player + .getStorage("dddshijian_extra") + .includes(event.player); }, - charlotte:true, - forced:true, - onremove:true, - *content(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.player; - if(trigger.targets&&trigger.targets.length){ - let result=yield player.chooseControl(['额外结算','摸一张牌']).set('prompt','实荐:请选择一项').set('prompt2',`令${get.translation(trigger.card)}额外结算一次,或摸一张牌`).set('ai',()=>{ - return get.event('choice'); - }).set('choice',function(){ - if(trigger.card.name==='tiesuo'||!['basic','trick'].includes(get.type(trigger.card))) return 1; - if(trigger.targets.reduce((p,c)=>{ - return p+get.effect(c,trigger.card,target,_status.event.player); - },0)>=get.effect(player,{name:'draw'},player,_status.event.player)) return 0; - return 1; - }()); - if(result.index==0){ + charlotte: true, + forced: true, + onremove: true, + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + if (trigger.targets && trigger.targets.length) { + let result = yield player + .chooseControl(["额外结算", "摸一张牌"]) + .set("prompt", "实荐:请选择一项") + .set( + "prompt2", + `令${get.translation( + trigger.card + )}额外结算一次,或摸一张牌` + ) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (function () { + if ( + trigger.card.name === + "tiesuo" || + !["basic", "trick"].includes( + get.type(trigger.card) + ) + ) + return 1; + if ( + trigger.targets.reduce( + (p, c) => { + return ( + p + + get.effect( + c, + trigger.card, + target, + _status.event + .player + ) + ); + }, + 0 + ) >= + get.effect( + player, + { name: "draw" }, + player, + _status.event.player + ) + ) + return 0; + return 1; + })() + ); + if (result.index == 0) { trigger.getParent().effectCount++; - game.log(player,'令',trigger.card,'额外结算一次'); - } - else player.draw(); - } - else player.draw(); - player.removeSkill('dddshijian_extra'); - } - } - }, - }, - dddxuyu_old:{ - trigger:{ - player:"useCardAfter", - }, - filter (event,player){ - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - return player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt; - },event).length==1; - }, - content (){ - player.draw(2); - player.addTempSkill('dddxuyu_old_discard','phaseUseAfter'); - }, - subSkill:{ - discard:{ - trigger:{ - player:"useCardAfter", + game.log( + player, + "令", + trigger.card, + "额外结算一次" + ); + } else player.draw(); + } else player.draw(); + player.removeSkill("dddshijian_extra"); }, - filter (event,player){ - if(!player.countCards('he')) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - return player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt; - },event).length==3; - }, - forced:true, - charlotte:true, - content (){ - player.chooseToDiscard('he',true); - }, - sub:true, }, }, }, - dddshijian_old:{ - trigger:{ - global:"useCardAfter", + dddxuyu_old: { + trigger: { + player: "useCardAfter", }, - filter (event,player){ - if(player==event.player) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=event.player) return false; - return event.player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt; - },event).length==3; + filter(event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + return ( + player.getHistory( + "useCard", + function (evtx) { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 1 + ); }, - logTarget:"player", - check(event,player){ - return get.attitude(player,event.player)>0; + content() { + player.draw(2); + player.addTempSkill("dddxuyu_old_discard", "phaseUseAfter"); }, - content (){ + subSkill: { + discard: { + trigger: { + player: "useCardAfter", + }, + filter(event, player) { + if (!player.countCards("he")) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + return ( + player.getHistory( + "useCard", + function (evtx) { + return ( + evtx.getParent("phaseUse") == evt + ); + }, + event + ).length == 3 + ); + }, + forced: true, + charlotte: true, + content() { + player.chooseToDiscard("he", true); + }, + sub: true, + }, + }, + }, + dddshijian_old: { + trigger: { + global: "useCardAfter", + }, + filter(event, player) { + if (player == event.player) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player.getHistory( + "useCard", + function (evtx) { + return evtx.getParent("phaseUse") == evt; + }, + event + ).length == 3 + ); + }, + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + content() { trigger.player.draw(); - player.addTempSkill('dddshijian_old_draw','phaseUseAfter'); + player.addTempSkill("dddshijian_old_draw", "phaseUseAfter"); }, - subSkill:{ - draw:{ - trigger:{ - global:"useCardAfter", + subSkill: { + draw: { + trigger: { + global: "useCardAfter", }, - filter (event,player){ - if(!event.player.countCards('he')) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=event.player) return false; - return event.player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt; - },event).length==4; + filter(event, player) { + if (!event.player.countCards("he")) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) + return false; + return ( + event.player.getHistory( + "useCard", + function (evtx) { + return ( + evtx.getParent("phaseUse") == evt + ); + }, + event + ).length == 4 + ); }, - forced:true, - charlotte:true, - content (){ + forced: true, + charlotte: true, + content() { player.draw(2); }, - sub:true, + sub: true, }, }, }, - dddtaisi:{ - trigger:{ - global:"phaseEnd", + dddtaisi: { + trigger: { + global: "phaseEnd", }, - direct:true, - filter (event,player){ - if(!game.getGlobalHistory('changeHp').some(evt=>evt.player==player)) return false; - return game.getGlobalHistory('cardMove').some(function(evt){ - if(evt.name!='cardsDiscard'){ - if(evt.name!='lose'||evt.position!=ui.discardPile) return false; - } - return evt.cards.some(card=>get.position(card,true)=='d'); - }); + direct: true, + filter(event, player) { + if ( + !game + .getGlobalHistory("changeHp") + .some((evt) => evt.player == player) + ) + return false; + return game + .getGlobalHistory("cardMove") + .some(function (evt) { + if (evt.name != "cardsDiscard") { + if ( + evt.name != "lose" || + evt.position != ui.discardPile + ) + return false; + } + return evt.cards.some( + (card) => get.position(card, true) == "d" + ); + }); }, - content (){ - 'step 0' - player.chooseTarget(get.prompt('dddtaisi'),'你可以令一名角色获得一张于本回合内进入弃牌堆的牌。若该角色于本回合内对你造成过伤害,则你摸两张牌。').set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(player.hasHistory('damage',evt=>evt.source==target)) return 10+att; - return att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dddtaisi',target); - event.target=target; - } - else event.finish(); - 'step 2' - var cards=[]; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name!='cardsDiscard'){ - if(evt.name!='lose'||evt.position!=ui.discardPile) return false; + content() { + "step 0"; + player + .chooseTarget( + get.prompt("dddtaisi"), + "你可以令一名角色获得一张于本回合内进入弃牌堆的牌。若该角色于本回合内对你造成过伤害,则你摸两张牌。" + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if ( + player.hasHistory( + "damage", + (evt) => evt.source == target + ) + ) + return 10 + att; + return att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddtaisi", target); + event.target = target; + } else event.finish(); + ("step 2"); + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "cardsDiscard") { + if ( + evt.name != "lose" || + evt.position != ui.discardPile + ) + return false; } - cards.addArray(evt.cards.filter(card=>get.position(card,true)=='d')); + cards.addArray( + evt.cards.filter( + (card) => get.position(card, true) == "d" + ) + ); }); - if(!cards.length) event.finish(); - else if(cards.length==1) event._result={bool:true,links:cards}; - else player.chooseButton(['令'+get.translation(target)+'获得一张牌',cards],true).set('ai',function(button){ - var player=_status.event.player,target=_status.event.getParent().target; - var att=get.attitude(player,target)-0.1; - return get.sgn(att)*get.value(button.link,target); - }); - 'step 3' - if(result.bool){ - target.gain(result.links,'gain2'); - } - else event.finish(); - 'step 4' - if(player.hasHistory('damage',evt=>evt.source==target)) player.draw(2); + if (!cards.length) event.finish(); + else if (cards.length == 1) + event._result = { bool: true, links: cards }; + else + player + .chooseButton( + [ + "令" + + get.translation(target) + + "获得一张牌", + cards, + ], + true + ) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + var att = get.attitude(player, target) - 0.1; + return ( + get.sgn(att) * + get.value(button.link, target) + ); + }); + ("step 3"); + if (result.bool) { + target.gain(result.links, "gain2"); + } else event.finish(); + ("step 4"); + if ( + player.hasHistory( + "damage", + (evt) => evt.source == target + ) + ) + player.draw(2); }, }, - dddquche:{ - enable:"phaseUse", - limited:true, - skillAnimation:true, - animationColor:"thunder", - filter (event,player){ - return player.hasCard({color:'red'},'he'); + dddquche: { + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.hasCard({ color: "red" }, "he"); }, - filterCard:{ - color:"red", + filterCard: { + color: "red", }, - filterTarget (card,player,target){ - return player!=target; + filterTarget(card, player, target) { + return player != target; }, - discard:false, - delay:false, - lose:false, - content (){ - 'step 0' - event.count=1; - player.awakenSkill('dddquche'); - player.addTempSkill('dddquche_effect'); - player.addMark('dddquche_effect',1,false); - player.give(cards,target); + discard: false, + delay: false, + lose: false, + content() { + "step 0"; + event.count = 1; + player.awakenSkill("dddquche"); + player.addTempSkill("dddquche_effect"); + player.addMark("dddquche_effect", 1, false); + player.give(cards, target); event.goto(3); - 'step 1' - if(player.hasCard(function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.color(card)=='red'; - },'he')){ + ("step 1"); + if ( + player.hasCard(function (card) { + if ( + _status.connectMode && + get.position(card) == "h" + ) + return true; + return get.color(card) == "red"; + }, "he") + ) { player.chooseCardTarget({ - prompt:'是否将一张红色牌交给一名其他角色?', - filterCard:{color:'red'}, - filterTarget:lib.filter.notMe, - position:'he', + prompt: "是否将一张红色牌交给一名其他角色?", + filterCard: { color: "red" }, + filterTarget: lib.filter.notMe, + position: "he", }); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.addMark('dddquche_effect',1,false); - player.give(result.cards,result.targets[0]); - } - else event.finish(); - 'step 3' - if(player.hasCard(function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.color(card)=='black'; - },'hes')){ + } else event.finish(); + ("step 2"); + if (result.bool) { + player.addMark("dddquche_effect", 1, false); + player.give(result.cards, result.targets[0]); + } else event.finish(); + ("step 3"); + if ( + player.hasCard(function (card) { + if ( + _status.connectMode && + get.position(card) == "h" + ) + return true; + return get.color(card) == "black"; + }, "hes") + ) { player.chooseCardTarget({ - prompt:'是否将一张黑色牌当做【杀】使用?', - position:'he', - filterCard(card,player){ - if(get.color(card)!='black') return false; - var card=get.autoViewAs({name:'sha'},[card]); - return lib.filter.cardEnabled(card,player); + prompt: "是否将一张黑色牌当做【杀】使用?", + position: "he", + filterCard(card, player) { + if (get.color(card) != "black") return false; + var card = get.autoViewAs({ name: "sha" }, [ + card, + ]); + return lib.filter.cardEnabled(card, player); }, - selectTarget(){ - var card=get.autoViewAs({name:'sha'},ui.selected.cards); - return lib.filter.selectTarget(card,_status.event.player); + selectTarget() { + var card = get.autoViewAs( + { name: "sha" }, + ui.selected.cards + ); + return lib.filter.selectTarget( + card, + _status.event.player + ); }, - filterTarget(card,player,target){ - var card=get.autoViewAs({name:'sha'},ui.selected.cards); - return lib.filter.targetEnabled(card,player,target)&&lib.filter.targetInRange(card,player,target); + filterTarget(card, player, target) { + var card = get.autoViewAs( + { name: "sha" }, + ui.selected.cards + ); + return ( + lib.filter.targetEnabled( + card, + player, + target + ) && + lib.filter.targetInRange( + card, + player, + target + ) + ); }, }); - } - else event.finish(); - 'step 4' - if(result.bool){ - player.addMark('dddquche_effect',1,false); - player.useCard({name:'sha'},result.cards,result.targets,false); + } else event.finish(); + ("step 4"); + if (result.bool) { + player.addMark("dddquche_effect", 1, false); + player.useCard( + { name: "sha" }, + result.cards, + result.targets, + false + ); event.goto(1); - } - else event.finish(); + } else event.finish(); }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - mod:{ - globalFrom (from,to,distance){ - return distance-from.countMark('dddquche_effect'); + subSkill: { + effect: { + charlotte: true, + onremove: true, + mod: { + globalFrom(from, to, distance) { + return ( + distance - from.countMark("dddquche_effect") + ); }, }, - intro:{ - content:"至其他角色的距离-#", + intro: { + content: "至其他角色的距离-#", }, - sub:true, + sub: true, }, }, - mark:true, - intro:{ - content:"limited", + mark: true, + intro: { + content: "limited", }, - init (player,skill){ - player.storage[skill]=false; + init(player, skill) { + player.storage[skill] = false; }, }, - dddqianlong:{ - zhuSkill:true, - trigger:{ - source:"dieAfter", + dddqianlong: { + zhuSkill: true, + trigger: { + source: "dieAfter", }, - forced:true, - filter:(event,player)=>player.hasZhuSkill('dddqianlong'), - content (){ + forced: true, + filter: (event, player) => player.hasZhuSkill("dddqianlong"), + content() { player.draw(3); }, - group:"dddqianlong_cancel", - subSkill:{ - cancel:{ - trigger:{ - player:["drawBefore","discardBefore"], + group: "dddqianlong_cancel", + subSkill: { + cancel: { + trigger: { + player: ["drawBefore", "discardBefore"], }, - forced:true, - popup:false, - filter (event,player){ - if(!player.hasZhuSkill('dddqianlong')) return false; - var evt=event.getParent(); - return evt&&evt.name=='die'&&evt.source==player; + forced: true, + popup: false, + filter(event, player) { + if (!player.hasZhuSkill("dddqianlong")) + return false; + var evt = event.getParent(); + return ( + evt && evt.name == "die" && evt.source == player + ); }, - content (){ + content() { trigger.cancel(); }, - sub:true, + sub: true, }, }, }, - ddddongcha:{ - trigger:{ - global:"phaseBegin", + ddddongcha: { + trigger: { + global: "phaseBegin", }, - logTarget:"player", - filter (event,player){ - return player!=event.player&&player.countCards('h')>0&&event.player.countCards('h')>0; + logTarget: "player", + filter(event, player) { + return ( + player != event.player && + player.countCards("h") > 0 && + event.player.countCards("h") > 0 + ); }, - check(event,player){ - return get.attitude(player,event.player)<=0; + check(event, player) { + return get.attitude(player, event.player) <= 0; }, - content (){ - 'step 0' - event.target=trigger.player; - player.addTempSkill('ddddongcha_effect'); - if(player.countCards('h')>0) player.chooseCard('h',true,'选择一张牌作为“鉴”'); - 'step 1' - if(result.bool){ - player.addToExpansion(result.cards,player,'give').gaintag.add('ddddongcha_effect'); + content() { + "step 0"; + event.target = trigger.player; + player.addTempSkill("ddddongcha_effect"); + if (player.countCards("h") > 0) + player.chooseCard("h", true, "选择一张牌作为“鉴”"); + ("step 1"); + if (result.bool) { + player + .addToExpansion(result.cards, player, "give") + .gaintag.add("ddddongcha_effect"); } - 'step 2' - if(target.countCards('h')>0) target.chooseCard('h',true,'选择一张牌作为“鉴”'); - 'step 3' - if(result.bool){ - player.addToExpansion(result.cards,target,'give').gaintag.add('ddddongcha_effect'); + ("step 2"); + if (target.countCards("h") > 0) + target.chooseCard("h", true, "选择一张牌作为“鉴”"); + ("step 3"); + if (result.bool) { + player + .addToExpansion(result.cards, target, "give") + .gaintag.add("ddddongcha_effect"); } }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{ - global:"phaseEnd", + subSkill: { + effect: { + charlotte: true, + trigger: { + global: "phaseEnd", }, - forced:true, - filter (event,player){ - return player.getExpansions('ddddongcha_effect').length>0; + forced: true, + filter(event, player) { + return ( + player.getExpansions("ddddongcha_effect") + .length > 0 + ); }, - content (){ - 'step 0' - var cards=player.getExpansions('ddddongcha_effect'); - if(cards.length>0){ - if(cards.length==1) event._result={bool:true,links:cards}; - else player.chooseButton(['选择获得一张“鉴”',cards],true); - } - else event.finish(); - 'step 1' - if(result.bool) player.gain(result.links,'gain2'); - 'step 2' - var cards=player.getExpansions('ddddongcha_effect'); - if(cards.length>0&&trigger.player.isIn()){ - if(cards.length==1) event._result={bool:true,links:cards}; - else trigger.player.chooseButton(['选择获得一张“鉴”',cards],true).set('ai',function(button){ - return get.value(button.link,_status.event.player); - }) - } - else event.finish(); - 'step 3' - if(result.bool) trigger.player.gain(result.links,player,'give'); + content() { + "step 0"; + var cards = + player.getExpansions("ddddongcha_effect"); + if (cards.length > 0) { + if (cards.length == 1) + event._result = { + bool: true, + links: cards, + }; + else + player.chooseButton( + ["选择获得一张“鉴”", cards], + true + ); + } else event.finish(); + ("step 1"); + if (result.bool) player.gain(result.links, "gain2"); + ("step 2"); + var cards = + player.getExpansions("ddddongcha_effect"); + if (cards.length > 0 && trigger.player.isIn()) { + if (cards.length == 1) + event._result = { + bool: true, + links: cards, + }; + else + trigger.player + .chooseButton( + ["选择获得一张“鉴”", cards], + true + ) + .set("ai", function (button) { + return get.value( + button.link, + _status.event.player + ); + }); + } else event.finish(); + ("step 3"); + if (result.bool) + trigger.player.gain( + result.links, + player, + "give" + ); }, - marktext:"鉴", - intro:{ - content:"expansion", - markcount:"expansion", + marktext: "鉴", + intro: { + content: "expansion", + markcount: "expansion", }, - sub:true, + sub: true, }, }, }, - dddzhijie:{ - enable:"chooseToUse", - filter (event,player){ - if(event.type=='phase') return false; - var cards=player.getExpansions('ddddongcha_effect'); - if(cards.length<2) return false; - var shan=false,wuxie=false; - for(var i=0;i1, - backup (links,player){ + check: () => 1, + backup(links, player) { return { - viewAs:{name:(get.color(links[0])==get.color(links[1]))?'shan':'wuxie'}, - cards:links, - selectCard:-1, - position:'x', - filterCard:(card)=>lib.skill['dddzhijie_backup'].cards.includes(card), - popname:true, - precontent(){ - player.addTempSkill('dddzhijie_draw'); + viewAs: { + name: + get.color(links[0]) == get.color(links[1]) + ? "shan" + : "wuxie", }, - } + cards: links, + selectCard: -1, + position: "x", + filterCard: (card) => + lib.skill["dddzhijie_backup"].cards.includes( + card + ), + popname: true, + precontent() { + player.addTempSkill("dddzhijie_draw"); + }, + }; }, }, - ai:{ - combo:"ddddongcha", - respondShan:true, - skillTagFilter (player){ - return lib.skill['dddzhijie'].hiddenCard(player,'shan'); + ai: { + combo: "ddddongcha", + respondShan: true, + skillTagFilter(player) { + return lib.skill["dddzhijie"].hiddenCard( + player, + "shan" + ); + }, + order: 10, + result: { player: 1 }, + effect: { + target: (card, player, target) => { + if ( + card.name === "sha" && + target.getExpansions("ddddongcha_effect") + .length < 2 && + lib.skill["dddzhijie"].hiddenCard( + target, + "shan" + ) + ) + return [ + 1, + 1, + 1, + -get.sgn( + get.attitude( + player, + _status.currentPhase + ) + ), + ]; + }, }, - order:10, - result:{player:1}, - effect:{ - target:(card,player,target)=>{ - if(card.name==='sha'&&target.getExpansions('ddddongcha_effect').length<2&&lib.skill['dddzhijie'].hiddenCard(target,'shan')) return [1,1,1,-get.sgn(get.attitude(player,_status.currentPhase))]; - } - } }, - subSkill:{ - draw:{ - trigger:{ - player:"useCardAfter", + subSkill: { + draw: { + trigger: { + player: "useCardAfter", }, - forced:true, - charlotte:true, - popup:false, - filter (event,player){ - return event.skill=='dddzhijie_backup'; + forced: true, + charlotte: true, + popup: false, + filter(event, player) { + return event.skill == "dddzhijie_backup"; }, - content (){ + content() { player.draw(2); }, - sub:true, + sub: true, }, }, }, - dddqiahua:{ - trigger:{ - global:"phaseBegin", + dddqiahua: { + trigger: { + global: "phaseBegin", }, - direct:true, - filter (event,player){ - return player!=event.player&&event.player.hp>0&&player.countCards('h',function(card){ - return !get.is.shownCard(card); - })>=event.player.hp; - }, - content (){ - 'step 0' - var target=trigger.player; - player.chooseCard('h',target.hp,get.prompt('dddqiahua',target),'选择明置'+get.cnNumber(target.hp)+'张手牌,然后'+get.translation(target)+'获得技能〖恂恂〗直到本回合结束。',function(card){ - return !get.is.shownCard(card); - }).set('goon',get.attitude(player,target)>0).set('ai',function(card){ - if(_status.event.goon) return 1+Math.random(); - return 0; - }); - 'step 1' - if(result.bool){ - var target=trigger.player,cards=result.cards; - player.logSkill('dddqiahua',target); - target.addTempSkills('dddxunxun'); - player.addShownCards(cards,'visible_dddxianglang'); - game.log(player,'选择了',cards,'作为“明”'); - player.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【恰化】'); - } - }, - ai:{ - expose:0.15, - }, - derivation:"dddxunxun", - }, - dddxunxun:{ - inherit:"xunxun", - audio:2, - }, - dddfusi:{ - mod:{ - ignoredHandcard (card,player){ - if(get.is.shownCard(card)) return true; - }, - cardDiscardable (card,player,name){ - if(name=='phaseDiscard'&&get.is.shownCard(card)) return false; - }, - }, - global:"dddfusi_global", - subSkill:{ - refused:{ - charlotte:true, - sub:true, - }, - allowed:{ - charlotte:true, - sub:true, - }, - }, - }, - dddfusi_global:{ - mod:{ - cardEnabled2(card,player){ - var source=_status.currentPhase; - if(!source||source==player||!source.hasSkill('dddfusi')||source.countCards('h')==0||source.hasCard(function(card){ + direct: true, + filter(event, player) { + return ( + player != event.player && + event.player.hp > 0 && + player.countCards("h", function (card) { return !get.is.shownCard(card); - },'h')) return; - if(player.getCards('h').includes(card)) return false; + }) >= event.player.hp + ); + }, + content() { + "step 0"; + var target = trigger.player; + player + .chooseCard( + "h", + target.hp, + get.prompt("dddqiahua", target), + "选择明置" + + get.cnNumber(target.hp) + + "张手牌,然后" + + get.translation(target) + + "获得技能〖恂恂〗直到本回合结束。", + function (card) { + return !get.is.shownCard(card); + } + ) + .set("goon", get.attitude(player, target) > 0) + .set("ai", function (card) { + if (_status.event.goon) return 1 + Math.random(); + return 0; + }); + ("step 1"); + if (result.bool) { + var target = trigger.player, + cards = result.cards; + player.logSkill("dddqiahua", target); + target.addTempSkills("dddxunxun"); + player.addShownCards(cards, "visible_dddxianglang"); + game.log(player, "选择了", cards, "作为“明”"); + player.showCards( + cards, + get.translation(player) + + "对" + + get.translation(target) + + "发动了【恰化】" + ); + } + }, + ai: { + expose: 0.15, + }, + derivation: "dddxunxun", + }, + dddxunxun: { + inherit: "xunxun", + audio: 2, + }, + dddfusi: { + mod: { + ignoredHandcard(card, player) { + if (get.is.shownCard(card)) return true; + }, + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && get.is.shownCard(card)) + return false; }, }, - enable:"chooseToUse", - filter (event,player){ - if(event._dddfusi_refused||player.hasSkill('dddfusi_refused')) return false; - var players=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('dddfusi'); + global: "dddfusi_global", + subSkill: { + refused: { + charlotte: true, + sub: true, + }, + allowed: { + charlotte: true, + sub: true, + }, + }, + }, + dddfusi_global: { + mod: { + cardEnabled2(card, player) { + var source = _status.currentPhase; + if ( + !source || + source == player || + !source.hasSkill("dddfusi") || + source.countCards("h") == 0 || + source.hasCard(function (card) { + return !get.is.shownCard(card); + }, "h") + ) + return; + if (player.getCards("h").includes(card)) return false; + }, + }, + enable: "chooseToUse", + filter(event, player) { + if ( + event._dddfusi_refused || + player.hasSkill("dddfusi_refused") + ) + return false; + var players = game.filterPlayer(function (current) { + return current != player && current.hasSkill("dddfusi"); }); - for(var source of players){ - var cards=source.getShownCards(); - for(var i of cards){ - var card=get.autoViewAs(i); - if(event.filterCard(card,player,event)) return true; + for (var source of players) { + var cards = source.getShownCards(); + for (var i of cards) { + var card = get.autoViewAs(i); + if (event.filterCard(card, player, event)) + return true; } } return false; }, - hiddenCard (player,name){ - if(player.hasSkill('dddfusi_refused')) return false; - var players=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('dddfusi'); + hiddenCard(player, name) { + if (player.hasSkill("dddfusi_refused")) return false; + var players = game.filterPlayer(function (current) { + return current != player && current.hasSkill("dddfusi"); }); - for(var source of players){ - var cards=source.getShownCards(); - for(var i of cards){ - var card=get.autoViewAs(i); - if(name==card.name) return true; + for (var source of players) { + var cards = source.getShownCards(); + for (var i of cards) { + var card = get.autoViewAs(i); + if (name == card.name) return true; } } return false; }, - chooseButton:{ - dialog (event,player){ - var dialog=ui.create.dialog('腹笥','hidden'); - var players=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('dddfusi'); - }).sortBySeat(); - for(var source of players){ - var cards=source.getShownCards(); - if(cards.length){ - var str='
    '; - str+=get.translation(source); - var num=source.getSeatNum(); - if(num>0) str+=('('+get.cnNumber(num,true)+'号位)'); - str+='
    '; + chooseButton: { + dialog(event, player) { + var dialog = ui.create.dialog("腹笥", "hidden"); + var players = game + .filterPlayer(function (current) { + return ( + current != player && + current.hasSkill("dddfusi") + ); + }) + .sortBySeat(); + for (var source of players) { + var cards = source.getShownCards(); + if (cards.length) { + var str = '
    '; + str += get.translation(source); + var num = source.getSeatNum(); + if (num > 0) + str += + "(" + + get.cnNumber(num, true) + + "号位)"; + str += "
    "; dialog.add(str); dialog.add(cards); } } return dialog; }, - filter (button,player){ - var card=get.autoViewAs(button.link),evt=_status.event.getParent(); - return evt.filterCard(card,player,evt); + filter(button, player) { + var card = get.autoViewAs(button.link), + evt = _status.event.getParent(); + return evt.filterCard(card, player, evt); }, - check (button){ - if(_status.event.getParent().type!='phase') return 1; - return _status.event.player.getUseValue(get.autoViewAs(button.link),null,true); + check(button) { + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue( + get.autoViewAs(button.link), + null, + true + ); }, - backup (links,player){ + backup(links, player) { return { - card:links[0], - viewAs:get.autoViewAs(links[0]), - filterCard:()=>false, - selectCard:-1, - precontent(){ - 'step 0' - var card=lib.skill['dddfusi_global_backup'].card; - event.card=card; - event.result.cards=[card]; - event.source=get.owner(card); - if(!event.result.card.storage) event.result.card.storage={}; - event.result.card.storage._dddfusi_owner=event.source; + card: links[0], + viewAs: get.autoViewAs(links[0]), + filterCard: () => false, + selectCard: -1, + precontent() { + "step 0"; + var card = + lib.skill["dddfusi_global_backup"].card; + event.card = card; + event.result.cards = [card]; + event.source = get.owner(card); + if (!event.result.card.storage) + event.result.card.storage = {}; + event.result.card.storage._dddfusi_owner = + event.source; delete event.result.skill; - player.logSkill('dddfusi_global',event.source); - if(player.hasSkill('dddfusi_allowed')) event.finish(); - 'step 1' - if(event.result.targets&&event.result.targets.length) player.line(event.result.targets,event.result.card.nature); - player.showCards([card],get.translation(player)+'向'+get.translation(source)+'发动【腹笥】'); - source.chooseButton([ - '是否同意'+get.translation(player)+'使用'+get.translation(card)+'?', - '
    '+function(){ - if(event.result.targets&&event.result.targets.length) return '(目标角色:'+get.translation(event.result.targets)+')'; - return '(无目标角色)'; - }()+'
    ', - [['   同意   ','  不同意  '],'tdnodes'], - [['   同意且本回合内不再提示   '],'tdnodes'], - [['  不同意且本回合内不再提示  '],'tdnodes'], - 'forcebutton', - ],true).set('forceAuto',true); - 'step 2' - if(result.links[0].indexOf('不同意')==-1){ - source.chat('同意'); - if(result.links[0].indexOf('本回合内不再提示')>0) player.addTempSkill('dddfusi_allowed'); - } - else if(result.links[0].indexOf('不同意')!=-1){ - source.chat('不同意'); - if(result.links[0].indexOf('本回合内不再提示')>0) player.addTempSkill('dddfusi_refused'); - else if(event.result.card.name=='wuxie') player.addTempSkill('dddfusi_refused','_wuxieAfter'); - var evt=event.getParent(); - evt.set('_dddfusi_refused',true); + player.logSkill("dddfusi_global", event.source); + if (player.hasSkill("dddfusi_allowed")) + event.finish(); + ("step 1"); + if ( + event.result.targets && + event.result.targets.length + ) + player.line( + event.result.targets, + event.result.card.nature + ); + player.showCards( + [card], + get.translation(player) + + "向" + + get.translation(source) + + "发动【腹笥】" + ); + source + .chooseButton( + [ + "是否同意" + + get.translation(player) + + "使用" + + get.translation(card) + + "?", + '
    ' + + (function () { + if ( + event.result.targets && + event.result.targets + .length + ) + return ( + "(目标角色:" + + get.translation( + event.result + .targets + ) + + ")" + ); + return "(无目标角色)"; + })() + + "
    ", + [ + [ + "   同意   ", + "  不同意  ", + ], + "tdnodes", + ], + [ + [ + "   同意且本回合内不再提示   ", + ], + "tdnodes", + ], + [ + [ + "  不同意且本回合内不再提示  ", + ], + "tdnodes", + ], + "forcebutton", + ], + true + ) + .set("forceAuto", true); + ("step 2"); + if (result.links[0].indexOf("不同意") == -1) { + source.chat("同意"); + if ( + result.links[0].indexOf( + "本回合内不再提示" + ) > 0 + ) + player.addTempSkill("dddfusi_allowed"); + } else if ( + result.links[0].indexOf("不同意") != -1 + ) { + source.chat("不同意"); + if ( + result.links[0].indexOf( + "本回合内不再提示" + ) > 0 + ) + player.addTempSkill("dddfusi_refused"); + else if (event.result.card.name == "wuxie") + player.addTempSkill( + "dddfusi_refused", + "_wuxieAfter" + ); + var evt = event.getParent(); + evt.set("_dddfusi_refused", true); evt.goto(0); } }, - } + }; }, - prompt (links,player){ - return '请选择'+get.translation(links[0])+'的目标'; + prompt(links, player) { + return "请选择" + get.translation(links[0]) + "的目标"; }, }, - ai:{ - order:10, - result:{ - player (player,target){ - if(!game.hasPlayer(function(current){ - return current!=player&¤t.hasSkill('dddfusi')&&get.attitude(player,current)>=0; - })) return 0; - if(_status.event.dying) return get.attitude(player,_status.event.dying); + ai: { + order: 10, + result: { + player(player, target) { + if ( + !game.hasPlayer(function (current) { + return ( + current != player && + current.hasSkill("dddfusi") && + get.attitude(player, current) >= 0 + ); + }) + ) + return 0; + if (_status.event.dying) + return get.attitude( + player, + _status.event.dying + ); return 1; }, }, - respondSha:true, - respondShan:true, - skillTagFilter (player,tag,arg){ + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { var name; - switch(tag){ - case 'respondSha':name='sha';break; - case 'respondShan':name='shan';break; + switch (tag) { + case "respondSha": + name = "sha"; + break; + case "respondShan": + name = "shan"; + break; } - return lib.skill['dddfusi_global'].hiddenCard(player,name); + return lib.skill["dddfusi_global"].hiddenCard( + player, + name + ); }, }, }, - dddtuoji:{ - trigger:{global:'useCardAfter'}, - frequent:true, - filter(event,player){ - return event.card.storage&&event.card.storage._dddfusi_owner==player&&!player.hasCard(function(card){ - return !get.is.shownCard(card); - },'h'); + dddtuoji: { + trigger: { global: "useCardAfter" }, + frequent: true, + filter(event, player) { + return ( + event.card.storage && + event.card.storage._dddfusi_owner == player && + !player.hasCard(function (card) { + return !get.is.shownCard(card); + }, "h") + ); }, - content(){ + content() { player.draw(3); }, }, - dddchashi:{ - trigger:{global:'phaseUseBegin'}, - direct:true, - filter(event,player){ - return player!=event.player&&player.countCards('he')>0; + dddchashi: { + trigger: { global: "phaseUseBegin" }, + direct: true, + filter(event, player) { + return ( + player != event.player && player.countCards("he") > 0 + ); }, - *content(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.player; - const valuableCards=target.getCards('hs',card=>target.hasValueTarget(card)); - let result=yield player.chooseToDiscard(get.prompt('dddchashi',target),'弃置一张牌,若其使用的下一张牌的花色或类型与此牌相同,你与其各摸一张牌','he').set('logSkill',['dddchashi',target]).set('ai',card=>{ - if(!get.event('goon')) return 0; - var list=get.event('list'); - return list[0].includes(get.suit(card))||list[1].includes(get.type2(card)); - }).set('list',[ - valuableCards.map(card=>get.suit(card)).toUniqued(), - valuableCards.map(card=>get.type2(card)).toUniqued() - ]).set('goon',get.attitude(player,target)>0); - if(!result.bool) return event.finish(); - player.storage['dddchashi']=[result.cards[0],target]; - player.addTempSkill('dddchashi_effect','phaseUseAfter'); - target.addTempSkill('dddchashi_ai',{player:['phaseUseAfter','useCard1']}); - }, - content_old(){ - 'step 0' - var target=trigger.player,history=target.getHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==trigger; + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + const valuableCards = target.getCards("hs", (card) => + target.hasValueTarget(card) + ); + let result = yield player + .chooseToDiscard( + get.prompt("dddchashi", target), + "弃置一张牌,若其使用的下一张牌的花色或类型与此牌相同,你与其各摸一张牌", + "he" + ) + .set("logSkill", ["dddchashi", target]) + .set("ai", (card) => { + if (!get.event("goon")) return 0; + var list = get.event("list"); + return ( + list[0].includes(get.suit(card)) || + list[1].includes(get.type2(card)) + ); + }) + .set("list", [ + valuableCards + .map((card) => get.suit(card)) + .toUniqued(), + valuableCards + .map((card) => get.type2(card)) + .toUniqued(), + ]) + .set("goon", get.attitude(player, target) > 0); + if (!result.bool) return event.finish(); + player.storage["dddchashi"] = [result.cards[0], target]; + player.addTempSkill("dddchashi_effect", "phaseUseAfter"); + target.addTempSkill("dddchashi_ai", { + player: ["phaseUseAfter", "useCard1"], }); - event.target=target; - if(history.length>0){ - var suit=get.suit(history[0].card); - event.suit=suit; - player.chooseCard('he',get.prompt('dddchashi',target),'你可以展示一张牌。若此牌花色为'+get.translation(suit)+',则'+get.translation(target)+'获得你展示的牌,然后你摸一张牌。').set('goon',get.sgn(get.attitude(player,target))).set('ai',function(card){ - if(_status.event.goon<=0) return _status.event.goon*(get.value(card)+0.01); - return 2/Math.max(0.1,get.value(card)) + }, + content_old() { + "step 0"; + var target = trigger.player, + history = target.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == trigger; }); - } - else event.goto(2); - 'step 1' - if(result.bool){ - player.logSkill('dddchashi',target); - var card=result.cards[0]; - player.showCards(card,get.translation(player)+'对'+get.translation(target)+'发动了【察势】'); - if(get.color(card)==event.suit){ - target.gain(card,player,'give'); + event.target = target; + if (history.length > 0) { + var suit = get.suit(history[0].card); + event.suit = suit; + player + .chooseCard( + "he", + get.prompt("dddchashi", target), + "你可以展示一张牌。若此牌花色为" + + get.translation(suit) + + ",则" + + get.translation(target) + + "获得你展示的牌,然后你摸一张牌。" + ) + .set("goon", get.sgn(get.attitude(player, target))) + .set("ai", function (card) { + if (_status.event.goon <= 0) + return ( + _status.event.goon * + (get.value(card) + 0.01) + ); + return 2 / Math.max(0.1, get.value(card)); + }); + } else event.goto(2); + ("step 1"); + if (result.bool) { + player.logSkill("dddchashi", target); + var card = result.cards[0]; + player.showCards( + card, + get.translation(player) + + "对" + + get.translation(target) + + "发动了【察势】" + ); + if (get.color(card) == event.suit) { + target.gain(card, player, "give"); player.draw(); } } event.finish(); - 'step 2' - player.chooseCard('he',get.prompt('dddchashi',target),'你可以展示一张牌。若其本阶段内使用的第一张牌与此牌花色相同,则'+get.translation(target)+'获得你展示的牌,然后你摸一张牌。').set('goon',get.sgn(get.attitude(player,target))).set('ai',function(card){ - if(_status.event.goon<=0) return _status.event.goon*(get.value(card)+0.01); - return 2/Math.max(0.1,get.value(card)) - }); - 'step 3' - if(result.bool){ - player.logSkill('dddchashi',target); - var card=result.cards[0]; - player.showCards(card,get.translation(player)+'对'+get.translation(target)+'发动了【察势】'); - player.addTempSkill('dddchashi_effect','phaseUseAfter'); - player.addGaintag([card],'dddchashi'); - player.storage['dddchashi']=[card,target]; - target.addTempSkill('dddchashi_ai',{player:['phaseUseAfter','useCard1']}); + ("step 2"); + player + .chooseCard( + "he", + get.prompt("dddchashi", target), + "你可以展示一张牌。若其本阶段内使用的第一张牌与此牌花色相同,则" + + get.translation(target) + + "获得你展示的牌,然后你摸一张牌。" + ) + .set("goon", get.sgn(get.attitude(player, target))) + .set("ai", function (card) { + if (_status.event.goon <= 0) + return ( + _status.event.goon * + (get.value(card) + 0.01) + ); + return 2 / Math.max(0.1, get.value(card)); + }); + ("step 3"); + if (result.bool) { + player.logSkill("dddchashi", target); + var card = result.cards[0]; + player.showCards( + card, + get.translation(player) + + "对" + + get.translation(target) + + "发动了【察势】" + ); + player.addTempSkill( + "dddchashi_effect", + "phaseUseAfter" + ); + player.addGaintag([card], "dddchashi"); + player.storage["dddchashi"] = [card, target]; + target.addTempSkill("dddchashi_ai", { + player: ["phaseUseAfter", "useCard1"], + }); } }, - subSkill:{ - effect:{ - trigger:{global:'useCard'}, - forced:true, - charlotte:true, - filter(event,player){ - var storage=player.getStorage('dddchashi'); - if(!storage||!storage.length) return false; - if(event.player!=storage[1]||!event.player.isIn()) return false; + subSkill: { + effect: { + trigger: { global: "useCard" }, + forced: true, + charlotte: true, + filter(event, player) { + var storage = player.getStorage("dddchashi"); + if (!storage || !storage.length) return false; + if ( + event.player != storage[1] || + !event.player.isIn() + ) + return false; // if(!player.getCards('he').includes(storage[0])||!storage[0].hasGaintag('dddchashi')) return false; - if(get.suit(event.card)!=get.suit(storage[0])&&get.type2(event.card)!=get.type2(storage[0])) return false; + if ( + get.suit(event.card) != get.suit(storage[0]) && + get.type2(event.card) != get.type2(storage[0]) + ) + return false; // var evt=event.getParent('phaseUse'); // if(evt.player) // if(event.player.getHistory('useCard',function(evtx){ @@ -2718,69 +4553,90 @@ game.import('character', function () { // }).indexOf(event)!=0) return false; return true; }, - content(){ - var storage=player.getStorage('dddchashi'); + content() { + var storage = player.getStorage("dddchashi"); // storage[1].gain(storage[0],player,'give'); // player.draw(); - game.asyncDraw([player,storage[1]].sortBySeat(_status.currentPhase)); - player.removeSkill('dddchashi_effect'); + game.asyncDraw( + [player, storage[1]].sortBySeat( + _status.currentPhase + ) + ); + player.removeSkill("dddchashi_effect"); }, - onremove(player,storage){ - delete player.storage['dddchashi']; + onremove(player, storage) { + delete player.storage["dddchashi"]; // player.removeGaintag('dddchashi'); }, }, - ai:{ - charlotte:true, + ai: { + charlotte: true, }, }, }, - dddqice:{ - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - return !player.storage['dddqice']; + dddqice: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return !player.storage["dddqice"]; }, - content(){ + content() { player.draw(2); // player.addTempSkill('dddqice_effect'); - player.setStorage('dddqice',true); - player.when('useCard1').filter(evt=>get.type2(evt.card)=='trick').then(()=>{ - delete player.storage['dddqice']; - }) + player.setStorage("dddqice", true); + player + .when("useCard1") + .filter((evt) => get.type2(evt.card) == "trick") + .then(() => { + delete player.storage["dddqice"]; + }); }, - subSkill:{ - effect:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - charlotte:true, - content(){ - 'step 0' - var list=[]; - player.getHistory('useCard',function(evt){ - if(get.type(evt.card)=='trick') list.add(evt.card.name); + subSkill: { + effect: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + content() { + "step 0"; + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card) == "trick") + list.add(evt.card.name); }); list.sort(); - if(list.length>0){ - player.chooseButton(['齐策:是否视为使用一张牌?',[list,'vcard']],function(button){ - return _status.event.player.hasUseTarget({name:button.link[2],isCard:true}); - }).set('ai',function(button){ - var card={ - name:button.link[2], - nature:button.link[3], - isCard:true, - },player=_status.event.player; - return player.getUseValue(card); - }); - } - else{ - player.removeSkills('dddqice'); + if (list.length > 0) { + player + .chooseButton( + [ + "齐策:是否视为使用一张牌?", + [list, "vcard"], + ], + function (button) { + return _status.event.player.hasUseTarget( + { + name: button.link[2], + isCard: true, + } + ); + } + ) + .set("ai", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + player = _status.event.player; + return player.getUseValue(card); + }); + } else { + player.removeSkills("dddqice"); event.finish(); } - 'step 1' - if(result.bool){ - player.chooseUseTarget(true,{ - name:result.links[0][2], - isCard:true, + ("step 1"); + if (result.bool) { + player.chooseUseTarget(true, { + name: result.links[0][2], + isCard: true, }); } }, @@ -2788,110 +4644,156 @@ game.import('character', function () { }, }, //甄姬 - dddmiaoxing:{ - audio:2, - trigger:{global:'gameDrawBegin'}, - forced:true, - content(){ - var me=player; - var numx=trigger.num; - trigger.num=typeof numx=='function'?function(player){ - if(player==me){ - return 3*numx(player); - } - return numx(player); - }:function(player){ - if(player==me){ - return 3*numx; - } - return numx; - } - player._dddmiaoxing=true; + dddmiaoxing: { + audio: 2, + trigger: { global: "gameDrawBegin" }, + forced: true, + content() { + var me = player; + var numx = trigger.num; + trigger.num = + typeof numx == "function" + ? function (player) { + if (player == me) { + return 3 * numx(player); + } + return numx(player); + } + : function (player) { + if (player == me) { + return 3 * numx; + } + return numx; + }; + player._dddmiaoxing = true; }, - group:['dddmiaoxing_out','dddmiaoxing_balance'], - marktext:'水', - intro:{ - name:'水相', - markcount(storage,player){ - return ''+player.getExpansions('dddmiaoxing_1').length+'/'+player.getExpansions('dddmiaoxing_2').length; + group: ["dddmiaoxing_out", "dddmiaoxing_balance"], + marktext: "水", + intro: { + name: "水相", + markcount(storage, player) { + return ( + "" + + player.getExpansions("dddmiaoxing_1").length + + "/" + + player.getExpansions("dddmiaoxing_2").length + ); }, - mark(dialog,content,player){ - var content1=player.getExpansions('dddmiaoxing_1'); - var content2=player.getExpansions('dddmiaoxing_2'); - if(content1&&content1.length||content2&&content2.length){ - if(player==game.me||player.isUnderControl()){ - dialog.addText('第一组'); + mark(dialog, content, player) { + var content1 = player.getExpansions("dddmiaoxing_1"); + var content2 = player.getExpansions("dddmiaoxing_2"); + if ( + (content1 && content1.length) || + (content2 && content2.length) + ) { + if (player == game.me || player.isUnderControl()) { + dialog.addText("第一组"); dialog.addAuto(content1); - dialog.addText('第二组'); + dialog.addText("第二组"); dialog.addAuto(content2); + } else { + return ( + "第一组“水相”有" + + get.cnNumber(content1.length) + + "张;" + + "第二组“水相”有" + + get.cnNumber(content2.length) + + "张" + ); } - else{ - return '第一组“水相”有'+get.cnNumber(content1.length)+'张;'+'第二组“水相”有'+get.cnNumber(content2.length)+'张'; - } - } - } - }, - subSkill:{ - out:{ - trigger:{ - global:'phaseBefore', - }, - forced:true, - filter(event,player){ - return game.phaseNumber==0&&player._dddmiaoxing; - }, - content(){ - 'step 0' - delete player._dddmiaoxing; - var cardsx=player.getCards('h'),num=Math.ceil(cardsx.length/3); - var cards=[cardsx.slice(0,num),cardsx.slice(num,2*num),cardsx.slice(2*num)]; - event.cards=cards; - player.chooseControl('第一组','第二组','第三组').set('dialog',[ - '淼形:选择一组作为你的手牌', - '第一组', - cards[0], - '第二组', - cards[1], - '第三组', - cards[2] - ]); - 'step 1' - event.cards.splice(result.index,1); - var cards=event.cards; - player.addToExpansion(cards[0],player,'giveAuto',false).gaintag.add('dddmiaoxing_1'); - player.addToExpansion(cards[1],player,'giveAuto').gaintag.add('dddmiaoxing_2'); - player.markSkill('dddmiaoxing'); } }, - balance:{ - trigger:{player:'phaseDrawAfter'}, - forced:true, - content(){ - 'step 0' - var forced=player.getExpansions('dddmiaoxing_1').length!=player.countCards('h')&& - player.getExpansions('dddmiaoxing_2').length!=player.countCards('h'); - var next=player.chooseButton([1,2],[ - '淼形:将至少一组“水相”调整至与手牌数相等', - [['第一组','第二组'],'tdnodes'], - '第一组', - player.getExpansions('dddmiaoxing_1'), - '第二组', - player.getExpansions('dddmiaoxing_2'), - ],forced); - next.set('filterButton',button=>{ - var type=typeof button.link; - return type!='object'; - }) - next.set('ai',button=>{ - var player=_status.event.player; - var ind=['第一组','第二组'].indexOf(button.link)+1; - if(ind==-1) return -100; - return player.countCards('h')-player.getExpansions('dddmiaoxing_'+ind).length; - }) - 'step 1' - if(result.bool){ - var choices=result.links; - event.choices=choices; + }, + subSkill: { + out: { + trigger: { + global: "phaseBefore", + }, + forced: true, + filter(event, player) { + return game.phaseNumber == 0 && player._dddmiaoxing; + }, + content() { + "step 0"; + delete player._dddmiaoxing; + var cardsx = player.getCards("h"), + num = Math.ceil(cardsx.length / 3); + var cards = [ + cardsx.slice(0, num), + cardsx.slice(num, 2 * num), + cardsx.slice(2 * num), + ]; + event.cards = cards; + player + .chooseControl("第一组", "第二组", "第三组") + .set("dialog", [ + "淼形:选择一组作为你的手牌", + '第一组', + cards[0], + '第二组', + cards[1], + '第三组', + cards[2], + ]); + ("step 1"); + event.cards.splice(result.index, 1); + var cards = event.cards; + player + .addToExpansion( + cards[0], + player, + "giveAuto", + false + ) + .gaintag.add("dddmiaoxing_1"); + player + .addToExpansion(cards[1], player, "giveAuto") + .gaintag.add("dddmiaoxing_2"); + player.markSkill("dddmiaoxing"); + }, + }, + balance: { + trigger: { player: "phaseDrawAfter" }, + forced: true, + content() { + "step 0"; + var forced = + player.getExpansions("dddmiaoxing_1").length != + player.countCards("h") && + player.getExpansions("dddmiaoxing_2").length != + player.countCards("h"); + var next = player.chooseButton( + [1, 2], + [ + "淼形:将至少一组“水相”调整至与手牌数相等", + [["第一组", "第二组"], "tdnodes"], + '第一组', + player.getExpansions("dddmiaoxing_1"), + '第二组', + player.getExpansions("dddmiaoxing_2"), + ], + forced + ); + next.set("filterButton", (button) => { + var type = typeof button.link; + return type != "object"; + }); + next.set("ai", (button) => { + var player = _status.event.player; + var ind = + ["第一组", "第二组"].indexOf(button.link) + + 1; + if (ind == -1) return -100; + return ( + player.countCards("h") - + player.getExpansions("dddmiaoxing_" + ind) + .length + ); + }); + ("step 1"); + if (result.bool) { + var choices = result.links; + event.choices = choices; // var hs=result.moved[0],sx1=result.moved[1],sx2=result.moved[2]; // hs.removeArray(player.getCards('h')); // sx1.removeArray(player.getExpansions('dddmiaoxing_1')); @@ -2900,1724 +4802,2738 @@ game.import('character', function () { // player.gain(hs,'gain2'); // player.addToExpansion(sx1,player,'giveAuto').gaintag.add('dddmiaoxing_1'); // player.addToExpansion(sx2,player,'giveAuto').gaintag.add('dddmiaoxing_2'); - } - else event.finish(); - 'step 2' - if(event.choices.includes('第一组')){ - var del=player.countCards('h')-player.getExpansions('dddmiaoxing_1').length; - if(del>=0){ - if(del!=0) player.addToExpansion(get.cards(del),player,'draw').gaintag.add('dddmiaoxing_1'); + } else event.finish(); + ("step 2"); + if (event.choices.includes("第一组")) { + var del = + player.countCards("h") - + player.getExpansions("dddmiaoxing_1") + .length; + if (del >= 0) { + if (del != 0) + player + .addToExpansion( + get.cards(del), + player, + "draw" + ) + .gaintag.add("dddmiaoxing_1"); event.goto(4); - } - else{ - player.chooseButton(['淼形:移除'+get.cnNumber(-del)+'张第一组的“水相”',player.getExpansions('dddmiaoxing_1')],-del,true).set('ai',button=>{ - return -get.buttonValue(button); - }); + } else { + player + .chooseButton( + [ + "淼形:移除" + + get.cnNumber(-del) + + "张第一组的“水相”", + player.getExpansions( + "dddmiaoxing_1" + ), + ], + -del, + true + ) + .set("ai", (button) => { + return -get.buttonValue(button); + }); } } - 'step 3' - if(result.bool){ + ("step 3"); + if (result.bool) { player.loseToDiscardpile(result.links); } - 'step 4' - player.markSkill('dddmiaoxing'); - if(event.choices.includes('第二组')){ - var del=player.countCards('h')-player.getExpansions('dddmiaoxing_2').length; - if(del>=0){ - if(del!=0) player.addToExpansion(get.cards(del),player,'draw').gaintag.add('dddmiaoxing_2'); + ("step 4"); + player.markSkill("dddmiaoxing"); + if (event.choices.includes("第二组")) { + var del = + player.countCards("h") - + player.getExpansions("dddmiaoxing_2") + .length; + if (del >= 0) { + if (del != 0) + player + .addToExpansion( + get.cards(del), + player, + "draw" + ) + .gaintag.add("dddmiaoxing_2"); event.goto(6); - } - else{ - player.chooseButton(['淼形:移除'+get.cnNumber(-del)+'张第二组的“水相”',player.getExpansions('dddmiaoxing_2')],-del,true).set('ai',button=>{ - return -get.buttonValue(button); - }); + } else { + player + .chooseButton( + [ + "淼形:移除" + + get.cnNumber(-del) + + "张第二组的“水相”", + player.getExpansions( + "dddmiaoxing_2" + ), + ], + -del, + true + ) + .set("ai", (button) => { + return -get.buttonValue(button); + }); } } - 'step 5' - if(result.bool){ + ("step 5"); + if (result.bool) { player.loseToDiscardpile(result.links); } - 'step 6' - player.markSkill('dddmiaoxing'); - } - } - } + ("step 6"); + player.markSkill("dddmiaoxing"); + }, + }, + }, }, - dddfushi:{ - audio:2, - trigger:{player:['useCardAfter','respondAfter']}, - filter(event,player){ - return get.type(event.card)=='basic'&&!player.hasSkill('dddfushi_used'); + dddfushi: { + audio: 2, + trigger: { player: ["useCardAfter", "respondAfter"] }, + filter(event, player) { + return ( + get.type(event.card) == "basic" && + !player.hasSkill("dddfushi_used") + ); }, - direct:true, - content(){ - 'step 0' - player.chooseControl('第一组','第二组','cancel2').set('dialog',[ - get.prompt('dddfushi'), - '用所有手牌交换一组“水相”', - '第一组', - player.getExpansions('dddmiaoxing_1'), - '第二组', - player.getExpansions('dddmiaoxing_2'), - ]).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - var fn=player==_status.currentPhase?'useful':'value'; - var list=[ - [1,player.getExpansions('dddmiaoxing_1').reduce((p,c)=>p+get[fn](c),0)], - [2,player.getExpansions('dddmiaoxing_2').reduce((p,c)=>p+get[fn](c),0)], - [3,player.getCards('h').reduce((p,c)=>p+get[fn](c),0)], - ].sort((a,b)=>b[1]-a[1]); - return list[0][0]-1; - }()); - 'step 1' - if(result.control=='cancel2') event.finish(); - else{ - player.logSkill('dddfushi'); - player.addTempSkill('dddfushi_used'); - var index=result.index+1; - player.addToExpansion(player.getCards('h'),player,'giveAuto').gaintag.add('dddmiaoxing_'+index); - player.gain(player.getExpansions('dddmiaoxing_'+index),'draw'); - game.log(player,'获得了'+get.cnNumber(player.getExpansions('dddmiaoxing_'+index).length)+'张“水相”'); - } - 'step 2' - player.markSkill('dddmiaoxing'); - player.chooseTarget('是否令一名男性角色选择是否交换“水相”?',(card,player,target)=>{ - return target.hasSex('male'); - }).set('ai',target=>get.attitude(_status.event.player,target)); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target); - target.chooseControl('第一组','第二组','cancel2').set('dialog',[ - '浮世:是否用所有手牌交换一组“水相”?', + direct: true, + content() { + "step 0"; + player + .chooseControl("第一组", "第二组", "cancel2") + .set("dialog", [ + get.prompt("dddfushi"), + '用所有手牌交换一组“水相”', '第一组', - player.getExpansions('dddmiaoxing_1'), + player.getExpansions("dddmiaoxing_1"), '第二组', - player.getExpansions('dddmiaoxing_2'), - ]).set('ai',()=>{ + player.getExpansions("dddmiaoxing_2"), + ]) + .set("ai", () => { return _status.event.choice; - }).set('choice',function(){ - var fn=target==_status.currentPhase?'useful':'value'; - var list=[ - [1,player.getExpansions('dddmiaoxing_1').reduce((p,c)=>p+get[fn](c),0)], - [2,player.getExpansions('dddmiaoxing_2').reduce((p,c)=>p+get[fn](c),0)], - [3,target.getCards('h').reduce((p,c)=>p+get[fn](c),0)], - ].sort((a,b)=>b[1]-a[1]); - return list[0]-1; - }()); + }) + .set( + "choice", + (function () { + var fn = + player == _status.currentPhase + ? "useful" + : "value"; + var list = [ + [ + 1, + player + .getExpansions("dddmiaoxing_1") + .reduce( + (p, c) => p + get[fn](c), + 0 + ), + ], + [ + 2, + player + .getExpansions("dddmiaoxing_2") + .reduce( + (p, c) => p + get[fn](c), + 0 + ), + ], + [ + 3, + player + .getCards("h") + .reduce( + (p, c) => p + get[fn](c), + 0 + ), + ], + ].sort((a, b) => b[1] - a[1]); + return list[0][0] - 1; + })() + ); + ("step 1"); + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("dddfushi"); + player.addTempSkill("dddfushi_used"); + var index = result.index + 1; + player + .addToExpansion( + player.getCards("h"), + player, + "giveAuto" + ) + .gaintag.add("dddmiaoxing_" + index); + player.gain( + player.getExpansions("dddmiaoxing_" + index), + "draw" + ); + game.log( + player, + "获得了" + + get.cnNumber( + player.getExpansions("dddmiaoxing_" + index) + .length + ) + + "张“水相”" + ); } - else event.finish(); - 'step 4' - if(result.control=='cancel2') event.finish(); - else{ - var index=result.index+1; - player.addToExpansion(target.getCards('h'),target,'giveAuto').gaintag.add('dddmiaoxing_'+index); - target.gain(player.getExpansions('dddmiaoxing_'+index),player,'giveAuto'); + ("step 2"); + player.markSkill("dddmiaoxing"); + player + .chooseTarget( + "是否令一名男性角色选择是否交换“水相”?", + (card, player, target) => { + return target.hasSex("male"); + } + ) + .set("ai", (target) => + get.attitude(_status.event.player, target) + ); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target); + target + .chooseControl("第一组", "第二组", "cancel2") + .set("dialog", [ + "浮世:是否用所有手牌交换一组“水相”?", + '第一组', + player.getExpansions("dddmiaoxing_1"), + '第二组', + player.getExpansions("dddmiaoxing_2"), + ]) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var fn = + target == _status.currentPhase + ? "useful" + : "value"; + var list = [ + [ + 1, + player + .getExpansions("dddmiaoxing_1") + .reduce( + (p, c) => p + get[fn](c), + 0 + ), + ], + [ + 2, + player + .getExpansions("dddmiaoxing_2") + .reduce( + (p, c) => p + get[fn](c), + 0 + ), + ], + [ + 3, + target + .getCards("h") + .reduce( + (p, c) => p + get[fn](c), + 0 + ), + ], + ].sort((a, b) => b[1] - a[1]); + return list[0] - 1; + })() + ); + } else event.finish(); + ("step 4"); + if (result.control == "cancel2") event.finish(); + else { + var index = result.index + 1; + player + .addToExpansion( + target.getCards("h"), + target, + "giveAuto" + ) + .gaintag.add("dddmiaoxing_" + index); + target.gain( + player.getExpansions("dddmiaoxing_" + index), + player, + "giveAuto" + ); } - 'step 5' - player.markSkill('dddmiaoxing'); + ("step 5"); + player.markSkill("dddmiaoxing"); + }, + subSkill: { + used: { charlotte: true }, }, - subSkill:{ - used:{charlotte:true} - } }, //赵昂 - dddfenji:{ - audio:2, - trigger:{player:['phaseDrawBegin1','phaseDiscardBegin']}, - direct:true, - filter(event,player){ - if(event.name=='phaseDraw'&&event.numFixed) return false; - return lib.inpile.filter(i=>get.type(i)=='trick').removeArray(player.getStorage('dddfenji')).length > 0; + dddfenji: { + audio: 2, + trigger: { player: ["phaseDrawBegin1", "phaseDiscardBegin"] }, + direct: true, + filter(event, player) { + if (event.name == "phaseDraw" && event.numFixed) + return false; + return ( + lib.inpile + .filter((i) => get.type(i) == "trick") + .removeArray(player.getStorage("dddfenji")).length > + 0 + ); }, - content(){ - 'step 0' - var cards=lib.inpile.filter(i=>{ - return get.type(i)=='trick'&&!player.getStorage('dddfenji').includes(i); - }).map(i=>['锦囊','',i]); - player.chooseButton([get.prompt('dddfenji'),[cards,'vcard']]).set('ai',button=>{ - var evt=_status.event.getTrigger(); - if(evt.name=='phaseDraw'){ - if(!get.tag({name:button.link[2]},'damage')) return 0; - } - else{ - if(lib.skill.xunshi.isXunshi({name:button.link[2]})) return 0; - } - return _status.event.player.getUseValue({name:button.link[2]}); - }).set('filterButton',button=>{ - return player.hasUseTarget(button.link[2]); - }); - 'step 1' - if(result.bool){ - player.logSkill('dddfenji'); - player.markAuto('dddfenji',[result.links[0][2]]); - player.chooseUseTarget(result.links[0][2],true); - } - else event.finish(); - 'step 2' - if(trigger.name=='phaseDraw'){ - trigger.changeToZero(); - var num=0; - game.filterPlayer(current=>{ - current.getHistory('sourceDamage',evt=>{ - if(evt.getParent(4)==event) num+=evt.num; + content() { + "step 0"; + var cards = lib.inpile + .filter((i) => { + return ( + get.type(i) == "trick" && + !player.getStorage("dddfenji").includes(i) + ); + }) + .map((i) => ["锦囊", "", i]); + player + .chooseButton([ + get.prompt("dddfenji"), + [cards, "vcard"], + ]) + .set("ai", (button) => { + var evt = _status.event.getTrigger(); + if (evt.name == "phaseDraw") { + if ( + !get.tag({ name: button.link[2] }, "damage") + ) + return 0; + } else { + if ( + lib.skill.xunshi.isXunshi({ + name: button.link[2], + }) + ) + return 0; + } + return _status.event.player.getUseValue({ + name: button.link[2], }); }) - if(num>0) player.draw(num); - } - else{ - trigger.cancel(); - var num=0; - player.getHistory('useCard',evt=>{ - if(evt.getParent(2)==event) num=evt.targets.length; + .set("filterButton", (button) => { + return player.hasUseTarget(button.link[2]); }); - if(num>0&&player.countCards('he')) player.chooseToDiscard(num,true); + ("step 1"); + if (result.bool) { + player.logSkill("dddfenji"); + player.markAuto("dddfenji", [result.links[0][2]]); + player.chooseUseTarget(result.links[0][2], true); + } else event.finish(); + ("step 2"); + if (trigger.name == "phaseDraw") { + trigger.changeToZero(); + var num = 0; + game.filterPlayer((current) => { + current.getHistory("sourceDamage", (evt) => { + if (evt.getParent(4) == event) num += evt.num; + }); + }); + if (num > 0) player.draw(num); + } else { + trigger.cancel(); + var num = 0; + player.getHistory("useCard", (evt) => { + if (evt.getParent(2) == event) + num = evt.targets.length; + }); + if (num > 0 && player.countCards("he")) + player.chooseToDiscard(num, true); } - } + }, }, //周处 - dddxiaheng:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - forced:true, - onremove:['dddxiaheng','dddxiaheng_del'], - intro:{content:'已因此技能对$造成过伤害'}, - content(){ - 'step 0' - event.targets=[]; - player.chooseTarget('侠横:令一名角色弃置两张牌',true).set('ai',target=>{ - var player=_status.event.player,eff=get.effect(target,{name:'guohe_copy2'},player,player),eff2=get.damageEffect(target,player,player); - if(player.storage['dddxiaheng_del']) return eff; - var toself=false; - if(eff2>eff*2){ - toself=!player.isDamaged()&&player.countCards('he',card=>get.value(card,player)<5)>=2; - } - if(toself) return target==player?100:0; - return eff*(eff2>eff*2?0.5:1.5); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; + dddxiaheng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + onremove: ["dddxiaheng", "dddxiaheng_del"], + intro: { content: "已因此技能对$造成过伤害" }, + content() { + "step 0"; + event.targets = []; + player + .chooseTarget("侠横:令一名角色弃置两张牌", true) + .set("ai", (target) => { + var player = _status.event.player, + eff = get.effect( + target, + { name: "guohe_copy2" }, + player, + player + ), + eff2 = get.damageEffect(target, player, player); + if (player.storage["dddxiaheng_del"]) return eff; + var toself = false; + if (eff2 > eff * 2) { + toself = + !player.isDamaged() && + player.countCards( + "he", + (card) => get.value(card, player) < 5 + ) >= 2; + } + if (toself) return target == player ? 100 : 0; + return eff * (eff2 > eff * 2 ? 0.5 : 1.5); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; event.targets.add(target); player.line(target); - target.chooseToDiscard(2,true,'he'); + target.chooseToDiscard(2, true, "he"); } - 'step 2' - player.chooseTarget('侠横:对一名角色造成1点伤害',true).set('ai',target=>{ - var player=_status.event.player,eff=get.damageEffect(target,player,player),targetx=_status.event.targetx; - if(player.storage['dddxiaheng_del']) return eff; - var fix=player.getStorage('dddxiaheng').includes(target)?0.75:1; - if(target==player&&targetx!=player&&player.isHealthy()&&!player.getStorage('dddxiaheng').includes(player)&&player.hp>2) return 100; - return eff*(player.hp==1||target==targetx?0.1:1)*fix; - }).set('targetx',targets[0]); - 'step 3' - if(result.bool){ - var target=result.targets[0]; + ("step 2"); + player + .chooseTarget("侠横:对一名角色造成1点伤害", true) + .set("ai", (target) => { + var player = _status.event.player, + eff = get.damageEffect(target, player, player), + targetx = _status.event.targetx; + if (player.storage["dddxiaheng_del"]) return eff; + var fix = player + .getStorage("dddxiaheng") + .includes(target) + ? 0.75 + : 1; + if ( + target == player && + targetx != player && + player.isHealthy() && + !player + .getStorage("dddxiaheng") + .includes(player) && + player.hp > 2 + ) + return 100; + return ( + eff * + (player.hp == 1 || target == targetx + ? 0.1 + : 1) * + fix + ); + }) + .set("targetx", targets[0]); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; event.targets.add(target); player.line(target); target.damage(); - player.markAuto('dddxiaheng',[target]); + player.markAuto("dddxiaheng", [target]); } - 'step 4' - if(player.storage['dddxiaheng_del']) event.finish(); - else{ - if(!targets.includes(player)) player.loseMaxHp(); - if(targets.length==1){ - player.removeSkills('dddxiaheng'); + ("step 4"); + if (player.storage["dddxiaheng_del"]) event.finish(); + else { + if (!targets.includes(player)) player.loseMaxHp(); + if (targets.length == 1) { + player.removeSkills("dddxiaheng"); } } - 'step 5' - if(player.getStorage('dddxiaheng').length>=3){ - player.storage['dddxiaheng_del']=true; + ("step 5"); + if (player.getStorage("dddxiaheng").length >= 3) { + player.storage["dddxiaheng_del"] = true; } - } + }, }, //刘巴 - dddfengzheng:{ - audio:2, - global:'dddfengzheng_global', - trigger:{ - global:'roundStart', + dddfengzheng: { + audio: 2, + global: "dddfengzheng_global", + trigger: { + global: "roundStart", }, - filter(event,player){ - return game.hasPlayer(current=>{ - var history=current.actionHistory; - for(var i=history.length-2;i>=0;i--){ - var evts=history[i].useSkill; - for(var evt of evts){ - if(evt.skill=='dddfengzheng_global') return true; + filter(event, player) { + return game.hasPlayer((current) => { + var history = current.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + var evts = history[i].useSkill; + for (var evt of evts) { + if (evt.skill == "dddfengzheng_global") + return true; } - if(history[i].isRound) break; + if (history[i].isRound) break; } return false; }); }, - prompt2(event,player){ - var num=game.countPlayer(current=>{ - var history=current.actionHistory; - for(var i=history.length-2;i>=0;i--){ - var evts=history[i].useSkill; - for(var evt of evts){ - if(evt.skill=='dddfengzheng_global') return true; + prompt2(event, player) { + var num = game.countPlayer((current) => { + var history = current.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + var evts = history[i].useSkill; + for (var evt of evts) { + if (evt.skill == "dddfengzheng_global") + return true; } - if(history[i].isRound) break; + if (history[i].isRound) break; } return false; }); - return '观看并分配牌堆顶的'+get.cnNumber(num)+'张牌'; + return "观看并分配牌堆顶的" + get.cnNumber(num) + "张牌"; }, - content(){ - 'step 0' - var num=game.countPlayer(current=>{ - var history=current.actionHistory; - for(var i=history.length-2;i>=0;i--){ - var evts=history[i].useSkill; - for(var evt of evts){ - if(evt.skill=='dddfengzheng_global') return true; + content() { + "step 0"; + var num = game.countPlayer((current) => { + var history = current.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + var evts = history[i].useSkill; + for (var evt of evts) { + if (evt.skill == "dddfengzheng_global") + return true; } - if(history[i].isRound) break; + if (history[i].isRound) break; } return false; }); - var cards=game.cardsGotoOrdering(get.cards(num)).cards; - event.cards=cards; - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - 'step 1' - if(event.cards.length>1){ - player.chooseCardButton('丰政:请选择要分配的牌',true,event.cards,[1,event.cards.length]).set('ai',function(button){ - if(ui.selected.buttons.length==0) return 1; - return 0; + var cards = game.cardsGotoOrdering(get.cards(num)).cards; + event.cards = cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - } - else if(event.cards.length==1) event._result={links:event.cards.slice(0),bool:true}; + event.given_map = {}; + ("step 1"); + if (event.cards.length > 1) { + player + .chooseCardButton( + "丰政:请选择要分配的牌", + true, + event.cards, + [1, event.cards.length] + ) + .set("ai", function (button) { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + } else if (event.cards.length == 1) + event._result = { + links: event.cards.slice(0), + bool: true, + }; else event.finish(); - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { event.cards.removeArray(result.links); - event.togive=result.links.slice(0); - player.chooseTarget('选择一名角色获得'+get.translation(result.links),true).set('ai',function(target){ - var fix=(_status.event.getParent().given_map[target.playerid]||0)+1; - var att=get.attitude(_status.event.player,target)/Math.sqrt(fix); - if(_status.event.enemy) return -att; - else if(att>0) return att/(1+target.countCards('h')); - else return att/100; - }).set('enemy',get.value(event.togive[0],player,'raw')<0); + event.togive = result.links.slice(0); + player + .chooseTarget( + "选择一名角色获得" + + get.translation(result.links), + true + ) + .set("ai", function (target) { + var fix = + (_status.event.getParent().given_map[ + target.playerid + ] || 0) + 1; + var att = + get.attitude(_status.event.player, target) / + Math.sqrt(fix); + if (_status.event.enemy) return -att; + else if (att > 0) + return att / (1 + target.countCards("h")); + else return att / 100; + }) + .set( + "enemy", + get.value(event.togive[0], player, "raw") < 0 + ); } - 'step 3' - if(result.targets.length){ - var id=result.targets[0].playerid,map=event.given_map; - if(!map[id]) map[id]=[]; + ("step 3"); + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; map[id].addArray(event.togive); } - if(cards.length>0) event.goto(1); - 'step 4' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + if (cards.length > 0) event.goto(1); + ("step 4"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - var list=[],lose=false; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - list.push([source,event.given_map[i]]); - if(event.given_map[i].length>2) lose=true; + var list = [], + lose = false; + for (var i in event.given_map) { + var source = ( + _status.connectMode ? lib.playerOL : game.playerMap + )[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); + if (event.given_map[i].length > 2) lose = true; } game.loseAsync({ - gain_list:list, - giver:player, - animate:'draw', - }).setContent('gaincardMultiple'); - if(!lose) event.finish(); - 'step 5' - player.removeSkills('dddfengzheng'); + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); + if (!lose) event.finish(); + ("step 5"); + player.removeSkills("dddfengzheng"); }, - subSkill:{ - global:{ - audio:'dddfengzheng', - enable:'phaseUse', - usable:1, - filter(event,player){ - return game.hasPlayer(current=>current.hasSkill('dddfengzheng')); + subSkill: { + global: { + audio: "dddfengzheng", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer((current) => + current.hasSkill("dddfengzheng") + ); }, - filterCard(card,player){ - var num=0; - for(var i=0;iget.number(i,false)==number); - }, - content(){ - 'step 0' - player.chooseControl('摸牌','弃牌').set('prompt','玉律:令'+get.translation(_status.currentPhase)+'摸一张牌或弃置一张牌').set('ai',()=>{ - return get.attitude(_status.event.player,_status.currentPhase)>0?'摸牌':'弃牌'; - }); - 'step 1' - player.logSkill('dddyulv_enter',_status.currentPhase); - var reset=false; - if(result.index==0) _status.currentPhase.draw(); - else _status.currentPhase.chooseToDiscard(true,'he'); - var reset=player.getHistory('useSkill',evt=>{ - return evt.skill=='dddyulv_enter'; - }).length==2; - if(!reset) event.finish(); - 'step 2' - if(!player.countCards('h')) player.draw(); - 'step 3' - if(!player.countCards('h')) event.finish(); - else player.chooseCard('玉律:选择一张手牌交换“玉律”('+get.translation(player.getExpansions('dddyulv'))+')',true); - 'step 4' - if(result.bool){ - player.gain(player.getExpansions('dddyulv'),player,'give'); - player.addToExpansion(result.cards,player,'log','give').gaintag.add('dddyulv'); - } - } + position: "hs", + viewAs: { name: "wuzhong" }, }, - } + }, }, - dddyulv_old:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + dddyulv: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - group:'dddyulv_old_enter', - content(){ - 'step 0' - player.chooseControl(Array.from({length:13},(_,i)=>get.strNumber(i+1))).set('prompt','玉律:声明一个点数').set('ai',()=>_status.event.controls.randomGet()); - 'step 1' - player.popup(result.control); - var number=result.index+1; - player.storage['dddyulv_old']=number; - player.markSkill('dddyulv_old'); + group: "dddyulv_enter", + content() { + "step 0"; + player.draw(); + ("step 1"); + if (!player.countCards("he")) event.finish(); + else player.chooseCard("玉律:将一张牌置于武将牌上", true); + ("step 2"); + if (result.bool) { + player + .addToExpansion(result.cards, player, "give") + .gaintag.add("dddyulv"); + } }, - intro:{ - content:'声明的点数为#', + marktext: "律", + intro: { + markcount: "expansion", + content: "expansion", }, - subSkill:{ - enter:{ - trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, - forced:true, - direct:true, - filter(event,player){ - var cards=event.getd(); - if(!cards.length||!player.storage['dddyulv_old']) return false; - if(!_status.currentPhase||!_status.currentPhase.isIn()) return false; - return cards.some(i=>get.number(i,false)==player.storage['dddyulv_old']); + subSkill: { + enter: { + trigger: { + global: [ + "loseAfter", + "cardsDiscardAfter", + "loseAsyncAfter", + "equipAfter", + ], }, - content(){ - 'step 0' - player.chooseControl('摸牌','弃牌').set('prompt','玉律:令'+get.translation(_status.currentPhase)+'摸一张牌或弃置一张牌').set('ai',()=>{ - return get.attitude(_status.event.player,_status.currentPhase)>0?'摸牌':'弃牌'; - }); - 'step 1' - player.logSkill('dddyulv_old_enter',_status.currentPhase); - var reset=false; - if(result.index==0) _status.currentPhase.draw(); - else _status.currentPhase.chooseToDiscard(true,'he'); - if(_status.currentPhase.hasSkill('dddyulv_old_'+result.index)) reset=true; - _status.currentPhase.removeSkill('dddyulv_old_0'); - _status.currentPhase.removeSkill('dddyulv_old_1'); - _status.currentPhase.addSkill('dddyulv_old_'+result.index); - if(!reset) event.finish(); - 'step 2' - player.chooseControl(Array.from({length:13},(_,i)=>get.strNumber(i+1))).set('prompt','玉律:重新声明一个点数').set('ai',()=>_status.event.controls.randomGet()); - 'step 3' - player.popup(result.control); - var number=result.index+1; - player.storage['dddyulv_old']=number; - player.markSkill('dddyulv_old'); - 'step 4' - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + forced: true, + direct: true, + filter(event, player) { + var cards = event.getd(); + if (!cards.length) return false; + const card = player.getExpansions("dddyulv")[0]; + if (!card) return false; + const number = get.number(card, false); + if ( + !_status.currentPhase || + !_status.currentPhase.isIn() + ) + return false; + return cards.some( + (i) => get.number(i, false) == number + ); + }, + content() { + "step 0"; + player + .chooseControl("摸牌", "弃牌") + .set( + "prompt", + "玉律:令" + + get.translation(_status.currentPhase) + + "摸一张牌或弃置一张牌" + ) + .set("ai", () => { + return get.attitude( + _status.event.player, + _status.currentPhase + ) > 0 + ? "摸牌" + : "弃牌"; + }); + ("step 1"); + player.logSkill( + "dddyulv_enter", + _status.currentPhase + ); + var reset = false; + if (result.index == 0) _status.currentPhase.draw(); + else + _status.currentPhase.chooseToDiscard( + true, + "he" + ); + var reset = + player.getHistory("useSkill", (evt) => { + return evt.skill == "dddyulv_enter"; + }).length == 2; + if (!reset) event.finish(); + ("step 2"); + if (!player.countCards("h")) player.draw(); + ("step 3"); + if (!player.countCards("h")) event.finish(); + else + player.chooseCard( + "玉律:选择一张手牌交换“玉律”(" + + get.translation( + player.getExpansions("dddyulv") + ) + + ")", + true + ); + ("step 4"); + if (result.bool) { + player.gain( + player.getExpansions("dddyulv"), + player, + "give" + ); + player + .addToExpansion( + result.cards, + player, + "log", + "give" + ) + .gaintag.add("dddyulv"); } - var evt=trigger.getParent('phase'); - if(evt&&evt.name=='phase'){ - game.log(evt.player,'结束了回合'); + }, + }, + }, + }, + dddyulv_old: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + group: "dddyulv_old_enter", + content() { + "step 0"; + player + .chooseControl( + Array.from({ length: 13 }, (_, i) => + get.strNumber(i + 1) + ) + ) + .set("prompt", "玉律:声明一个点数") + .set("ai", () => _status.event.controls.randomGet()); + ("step 1"); + player.popup(result.control); + var number = result.index + 1; + player.storage["dddyulv_old"] = number; + player.markSkill("dddyulv_old"); + }, + intro: { + content: "声明的点数为#", + }, + subSkill: { + enter: { + trigger: { + global: [ + "loseAfter", + "cardsDiscardAfter", + "loseAsyncAfter", + "equipAfter", + ], + }, + forced: true, + direct: true, + filter(event, player) { + var cards = event.getd(); + if (!cards.length || !player.storage["dddyulv_old"]) + return false; + if ( + !_status.currentPhase || + !_status.currentPhase.isIn() + ) + return false; + return cards.some( + (i) => + get.number(i, false) == + player.storage["dddyulv_old"] + ); + }, + content() { + "step 0"; + player + .chooseControl("摸牌", "弃牌") + .set( + "prompt", + "玉律:令" + + get.translation(_status.currentPhase) + + "摸一张牌或弃置一张牌" + ) + .set("ai", () => { + return get.attitude( + _status.event.player, + _status.currentPhase + ) > 0 + ? "摸牌" + : "弃牌"; + }); + ("step 1"); + player.logSkill( + "dddyulv_old_enter", + _status.currentPhase + ); + var reset = false; + if (result.index == 0) _status.currentPhase.draw(); + else + _status.currentPhase.chooseToDiscard( + true, + "he" + ); + if ( + _status.currentPhase.hasSkill( + "dddyulv_old_" + result.index + ) + ) + reset = true; + _status.currentPhase.removeSkill("dddyulv_old_0"); + _status.currentPhase.removeSkill("dddyulv_old_1"); + _status.currentPhase.addSkill( + "dddyulv_old_" + result.index + ); + if (!reset) event.finish(); + ("step 2"); + player + .chooseControl( + Array.from({ length: 13 }, (_, i) => + get.strNumber(i + 1) + ) + ) + .set("prompt", "玉律:重新声明一个点数") + .set("ai", () => + _status.event.controls.randomGet() + ); + ("step 3"); + player.popup(result.control); + var number = result.index + 1; + player.storage["dddyulv_old"] = number; + player.markSkill("dddyulv_old"); + ("step 4"); + var evt = trigger.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; + } + var evt = trigger.getParent("phase"); + if (evt && evt.name == "phase") { + game.log(evt.player, "结束了回合"); evt.finish(); evt.untrigger(true); } - } + }, }, - 0:{charlotte:true}, - 1:{charlotte:true}, - } + 0: { charlotte: true }, + 1: { charlotte: true }, + }, }, //蹇硕 - dddfenye:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ + dddfenye: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { return player.canCompare(target); }, - filter(event,player){ - return player.countCards('h')>0; + filter(event, player) { + return player.countCards("h") > 0; }, - content(){ - 'step 0' - player.chooseToCompare([target]).setContent(lib.skill['dddfenye'].chooseToCompareFenye); - 'step 1' - result.winner.forEach(i=>i.addExpose(0.05)); - result.loser.forEach(i=>i.addExpose(0.05)); - if(result.winner.length&&result.loser.length){ - var players=result.winner; - event.players=players.sortBySeat(); - event.targets=result.loser; - } - else event.finish(); - 'step 2' - var current=event.players.shift(); - event.current=current; - current.chooseTarget('是否视为对一名没赢的角色使用一张【杀】?',(card,player,target)=>{ - return player.canUse('sha',target,false)&&_status.event.targets.includes(target); - }).set('ai',target=>{ - return get.effect(target,{name:'sha'},get.player(),get.player()); - }).set('targets',event.targets); - 'step 3' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - var target=result.targets[0]; - event.current.useCard({name:'sha',isCard:true},target,false); + content() { + "step 0"; + player + .chooseToCompare([target]) + .setContent(lib.skill["dddfenye"].chooseToCompareFenye); + ("step 1"); + result.winner.forEach((i) => i.addExpose(0.05)); + result.loser.forEach((i) => i.addExpose(0.05)); + if (result.winner.length && result.loser.length) { + var players = result.winner; + event.players = players.sortBySeat(); + event.targets = result.loser; + } else event.finish(); + ("step 2"); + var current = event.players.shift(); + event.current = current; + current + .chooseTarget( + "是否视为对一名没赢的角色使用一张【杀】?", + (card, player, target) => { + return ( + player.canUse("sha", target, false) && + _status.event.targets.includes(target) + ); + } + ) + .set("ai", (target) => { + return get.effect( + target, + { name: "sha" }, + get.player(), + get.player() + ); + }) + .set("targets", event.targets); + ("step 3"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + var target = result.targets[0]; + event.current.useCard( + { name: "sha", isCard: true }, + target, + false + ); event.targets.remove(target); } - if(event.targets.length&&event.players.length) event.goto(2); + if (event.targets.length && event.players.length) + event.goto(2); }, - chooseToCompareFenye(){ - "step 0" - var target=event.targets[0]; + chooseToCompareFenye() { + "step 0"; + var target = event.targets[0]; event.targets.unshift(player); - event.targetx=target; - if(player.countCards('h')==0||target.countCards('h')==0){ - event.result={cancelled:true,bool:false} + event.targetx = target; + if ( + player.countCards("h") == 0 || + target.countCards("h") == 0 + ) { + event.result = { cancelled: true, bool: false }; event.finish(); return; } - game.log(player,'对',target,'发起拼点'); - "step 1" - var send=function(targets){ - var next=game.createEvent('dddfenye_choose',false); + game.log(player, "对", target, "发起拼点"); + ("step 1"); + var send = function (targets) { + var next = game.createEvent("dddfenye_choose", false); // next.player=game.me; - next.targets=targets; - next.ai=event.ai; - next.fixedResult=event.fixedResult; - next.setContent(lib.skill['dddfenye'].contentx); + next.targets = targets; + next.ai = event.ai; + next.fixedResult = event.fixedResult; + next.setContent(lib.skill["dddfenye"].contentx); game.resume(); }; - var sendback=function(result,player){ - if(!Array.isArray(result)){ - result=[null,null]; + var sendback = function (result, player) { + if (!Array.isArray(result)) { + result = [null, null]; } - event.results.push([player,result]); + event.results.push([player, result]); }; - event.ai_targets=[]; - event.results=[]; - var players=game.filterPlayer().sortBySeat(); - var time=10000; - if(lib.configOL&&lib.configOL.choose_timeout) time=parseInt(lib.configOL.choose_timeout)*1000; - for(var i=0;i{ - return event.ai(b)-event.ai(a); - }); - sendback([target,cards[0]],target); - event.ai_targets.splice(i--,1); - } - } - if(event.ai_targets.length){ - event.ai_targets.randomSort(); - setTimeout(function(){ - event.interval=setInterval(function(){ - var target=event.ai_targets.shift(); - var cards=target.getCards('h',card=>get.value(card)<4).sort((a,b)=>{ - return event.ai(b)-event.ai(a); + if (event.ai_targets.length) { + for (var i = 0; i < event.ai_targets.length; i++) { + if (targets.includes(event.ai_targets[i])) { + var target = event.ai_targets[i]; + var cards = target + .getCards("h") + .sort((a, b) => { + return event.ai(b) - event.ai(a); }); - if(!cards.length){ - sendback([null,null],target); - } - else{ - if(Math.abs(get.number(cards[0])-7)<=2){ - sendback([null,null],target); - } - else{ - var sgn=get.number(cards[0])>=7?1:-1; - var targetsx=targets.slice().sort((a,b)=>{ - var attA=get.attitude(target,a),attB=get.attitude(target,b); - return sgn*(attB-attA); - }); - sendback([targetsx[0],cards[0]],target); - } - } - if(!event.ai_targets.length){ - clearInterval(event.interval); - if(event.withai) game.resume(); - } - },_status.connectMode?750:75); - },500); - } - } - "step 2" - if(event.withme){ - if(_status.connectMode) game.me.unwait(result,game.me); - else{ - if(!Array.isArray(result)){ - result=[null,null]; + sendback([target, cards[0]], target); + event.ai_targets.splice(i--, 1); } - event.results.push([game.me,result]); + } + if (event.ai_targets.length) { + event.ai_targets.randomSort(); + setTimeout(function () { + event.interval = setInterval( + function () { + var target = event.ai_targets.shift(); + var cards = target + .getCards( + "h", + (card) => get.value(card) < 4 + ) + .sort((a, b) => { + return ( + event.ai(b) - event.ai(a) + ); + }); + if (!cards.length) { + sendback([null, null], target); + } else { + if ( + Math.abs( + get.number(cards[0]) - 7 + ) <= 2 + ) { + sendback([null, null], target); + } else { + var sgn = + get.number(cards[0]) >= 7 + ? 1 + : -1; + var targetsx = targets + .slice() + .sort((a, b) => { + var attA = get.attitude( + target, + a + ), + attB = get.attitude( + target, + b + ); + return ( + sgn * (attB - attA) + ); + }); + sendback( + [targetsx[0], cards[0]], + target + ); + } + } + if (!event.ai_targets.length) { + clearInterval(event.interval); + if (event.withai) game.resume(); + } + }, + _status.connectMode ? 750 : 75 + ); + }, 500); } } - "step 3" - if(event.withol&&!event.resultOL){ + ("step 2"); + if (event.withme) { + if (_status.connectMode) + game.me.unwait(result, game.me); + else { + if (!Array.isArray(result)) { + result = [null, null]; + } + event.results.push([game.me, result]); + } + } + ("step 3"); + if (event.withol && !event.resultOL) { game.pause(); } - "step 4" - if(event.ai_targets.length>0){ - event.withai=true; + ("step 4"); + if (event.ai_targets.length > 0) { + event.withai = true; game.pause(); } - "step 5" + ("step 5"); delete event._global_waiting; - for(var i of game.players) i.hideTimer(); - var cards=[]; - var targets=[]; - var lose_list=[]; - event.results.sort((a,b)=>lib.sort.seat(a[0],b[0])); - for(var res of event.results){ - var target=res[0],card=res[1][1],skill=res[1][2]; - if(!target||!card) continue; - if(skill&&lib.skill[skill]&&lib.skill[skill].onCompare){ + for (var i of game.players) i.hideTimer(); + var cards = []; + var targets = []; + var lose_list = []; + event.results.sort((a, b) => lib.sort.seat(a[0], b[0])); + for (var res of event.results) { + var target = res[0], + card = res[1][1], + skill = res[1][2]; + if (!target || !card) continue; + if ( + skill && + lib.skill[skill] && + lib.skill[skill].onCompare + ) { target.logSkill(skill); - res[1][1]=lib.skill[skill].onCompare(target); - if(target!=player) cards.push(res[1][1]); + res[1][1] = lib.skill[skill].onCompare(target); + if (target != player) cards.push(res[1][1]); + } else { + if (target != player) cards.push(card); + lose_list.push([target, [card]]); } - else{ - if(target!=player) cards.push(card); - lose_list.push([target,[card]]); - } - if(target!=player) targets.push(target); + if (target != player) targets.push(target); } - if(lose_list.length){ + if (lose_list.length) { game.loseAsync({ - lose_list:lose_list, - }).setContent('chooseToCompareLose'); + lose_list: lose_list, + }).setContent("chooseToCompareLose"); } - event.lose_list=lose_list; - event.getNum=function(card){ - for(var i of event.lose_list){ - if(i[1].includes&&i[1].includes(card)) return get.number(card,i[0]); + event.lose_list = lose_list; + event.getNum = function (card) { + for (var i of event.lose_list) { + if (i[1].includes && i[1].includes(card)) + return get.number(card, i[0]); } - return get.number(card,false); - } - event.cardlist=cards; - event.cards=cards; - event.card1=event.results[0][1][1]; - event.num1=event.getNum(event.card1); - event.iwhile=0; - event.targets=targets; - event.tempplayer=event.player; - event.players=event.results.filter(i=>i[1][0]==player&&i[1][1]).map(i=>i[0]); - event.targetsx=event.results.filter(i=>i[1][0]==event.targetx&&i[1][1]).map(i=>i[0]); - event.result={ - player:event.card1, - targets:event.cardlist.slice(0), - num1:[event.num1], - num2:[], - winner:[], - loser:[], + return get.number(card, false); }; - game.log(player,'的拼点牌为',event.card1); - "step 6" - event.target=null; - event.trigger('compare'); - lib.skill['dddfenye'].$compareFenye(event.players,event.results.filter(i=>i[1][0]==player).map(i=>i[1][1]),event.targetsx,event.results.filter(i=>i[1][0]==event.targetx).map(i=>i[1][1])); - "step 7" - if(event.iwhile i[1][0] == player && i[1][1]) + .map((i) => i[0]); + event.targetsx = event.results + .filter((i) => i[1][0] == event.targetx && i[1][1]) + .map((i) => i[0]); + event.result = { + player: event.card1, + targets: event.cardlist.slice(0), + num1: [event.num1], + num2: [], + winner: [], + loser: [], + }; + game.log(player, "的拼点牌为", event.card1); + ("step 6"); + event.target = null; + event.trigger("compare"); + lib.skill["dddfenye"].$compareFenye( + event.players, + event.results + .filter((i) => i[1][0] == player) + .map((i) => i[1][1]), + event.targetsx, + event.results + .filter((i) => i[1][0] == event.targetx) + .map((i) => i[1][1]) + ); + ("step 7"); + if (event.iwhile < targets.length) { + event.target = targets[event.iwhile]; + event.target.addTempClass("target"); + event.card2 = event.cardlist[event.iwhile]; + event.num2 = event.getNum(event.card2); + game.log(event.target, "的拼点牌为", event.card2); delete event.player; - event.trigger('compare'); - } - else{ - game.delay(0,1000); + event.trigger("compare"); + } else { + game.delay(0, 1000); event.goto(9); } - "step 8" - var key=event.players.includes(target)?'num1':'num2'; + ("step 8"); + var key = event.players.includes(target) ? "num1" : "num2"; event.result[key].push(event.num2); event.iwhile++; event.goto(7); - "step 9" - event.player=event.tempplayer; + ("step 9"); + event.player = event.tempplayer; delete event.tempplayer; var str; - var num1=event.result.num1.reduce((p,c)=>p+c,0)/event.result.num1.length,num2=event.result.num2.reduce((p,c)=>p+c,0)/event.result.num2.length; - game.log(event.player,'方的点数均值为','#y'+Math.floor(num1*100)/100); - game.log(event.targetx,'方的点数均值为','#y'+Math.floor(num2*100)/100); - if(num1>num2){ - str=get.translation(event.players)+'拼点成功'; - event.players.forEach(i=>i.popup('胜')); - event.targetsx.forEach(i=>i.popup('负')); - event.result.winner=event.players; - event.result.loser=event.targetsx; - } - else{ - str=get.translation(event.players)+'拼点失败'; - if(num1==num2){ - event.players.forEach(i=>i.popup('平')); - event.targetsx.forEach(i=>i.popup('平')); - event.result.loser=event.players.addArray(event.targetsx); - } - else{ - event.players.forEach(i=>i.popup('负')); - event.targetsx.forEach(i=>i.popup('胜')); - event.result.winner=event.targetsx; - event.result.loser=event.players; + var num1 = + event.result.num1.reduce((p, c) => p + c, 0) / + event.result.num1.length, + num2 = + event.result.num2.reduce((p, c) => p + c, 0) / + event.result.num2.length; + game.log( + event.player, + "方的点数均值为", + "#y" + Math.floor(num1 * 100) / 100 + ); + game.log( + event.targetx, + "方的点数均值为", + "#y" + Math.floor(num2 * 100) / 100 + ); + if (num1 > num2) { + str = get.translation(event.players) + "拼点成功"; + event.players.forEach((i) => i.popup("胜")); + event.targetsx.forEach((i) => i.popup("负")); + event.result.winner = event.players; + event.result.loser = event.targetsx; + } else { + str = get.translation(event.players) + "拼点失败"; + if (num1 == num2) { + event.players.forEach((i) => i.popup("平")); + event.targetsx.forEach((i) => i.popup("平")); + event.result.loser = event.players.addArray( + event.targetsx + ); + } else { + event.players.forEach((i) => i.popup("负")); + event.targetsx.forEach((i) => i.popup("胜")); + event.result.winner = event.targetsx; + event.result.loser = event.players; } } - game.broadcastAll(function(str){ - var dialog=ui.create.dialog(str); - dialog.classList.add('center'); - setTimeout(function(){ + game.broadcastAll(function (str) { + var dialog = ui.create.dialog(str); + dialog.classList.add("center"); + setTimeout(function () { dialog.close(); - },1000); - },str); + }, 1000); + }, str); game.delay(3); - "step 10" + ("step 10"); game.broadcastAll(ui.clear); - "step 11" + ("step 11"); event.cards.add(event.card1); }, - contentx(){ - 'step 0' - var player=game.me; - event.player=player; - event._global_waiting=true; - event.result=[]; - if(targets.includes(player)){ - if(event.fixedResult&&event.fixedResult[player.playerid]){ - event.result[0]=player; - event.result[1]=event.fixedResult[player.playerid]; + contentx() { + "step 0"; + var player = game.me; + event.player = player; + event._global_waiting = true; + event.result = []; + if (targets.includes(player)) { + if ( + event.fixedResult && + event.fixedResult[player.playerid] + ) { + event.result[0] = player; + event.result[1] = + event.fixedResult[player.playerid]; event.finish(); - } - else player.chooseCard('请选择拼点牌',true).set('type','compare').set('glow_result',true).set('_global_waiting',true).ai=event.ai; - } - else{ + } else + player + .chooseCard("请选择拼点牌", true) + .set("type", "compare") + .set("glow_result", true) + .set("_global_waiting", true).ai = event.ai; + } else { player.chooseCardTarget({ - targets:targets, - filterTarget(card,player,target){ + targets: targets, + filterTarget(card, player, target) { return _status.event.targets.includes(target); }, - selectCard:1, - prompt:'是否于此次拼点加入其中一方?', - position:'h', - _global_waiting:true, - ai1:event.ai, - ai2(target){ - var player=_status.event.player,sgn=-1; - if(player.hasCard(card=>get.number(card)>10&&get.value(card)<5)) sgn=1; - return sgn*get.attitude(player,target); + selectCard: 1, + prompt: "是否于此次拼点加入其中一方?", + position: "h", + _global_waiting: true, + ai1: event.ai, + ai2(target) { + var player = _status.event.player, + sgn = -1; + if ( + player.hasCard( + (card) => + get.number(card) > 10 && + get.value(card) < 5 + ) + ) + sgn = 1; + return sgn * get.attitude(player, target); }, }); } - 'step 1' - if(targets.includes(player)){ - event.result[0]=player; - event.result[1]=result.cards[0]; - event.result[2]=result.skill; - } - else{ - if(result.bool){ - event.result[0]=result.targets[0]; - event.result[1]=result.cards[0]; - } - else{ - event.result=[null,null]; + ("step 1"); + if (targets.includes(player)) { + event.result[0] = player; + event.result[1] = result.cards[0]; + event.result[2] = result.skill; + } else { + if (result.bool) { + event.result[0] = result.targets[0]; + event.result[1] = result.cards[0]; + } else { + event.result = [null, null]; } } }, - $compareFenye(players,cards1,targets,cards2){ - game.broadcast(function(players,cards1,targets,cards2){ - lib.skill['dddfenye'].$compareFenye(players,cards1,targets,cards2); - },players,cards1,targets,cards2); - var left0=-players.length*52-(players.length-1)*8; - for(var i=0;i{ - return _status.event.targets.includes(target); - }).set('ai',target=>{ - var zhu=get.zhu(player)||game.filterPlayer(i=>i.getSeatNum()==1)[0]; - return Math.min(target.countCards('h')-player.countCards('h'),zhu.maxHp-player.countCards('h')); - }).set('targets',function(){ - var list=game.filterPlayer().map(i=>[i,i.countCards('h')]).sort((a,b)=>b[1]-a[1]); - var targets=[]; - var ind=0,tmp=Infinity; - for(var i of list){ - if(i[1] { + return _status.event.targets.includes(target); } - if(ind==N){ - targets.push(i[0]); - } - if(ind>N) break; - } - if(!targets.length) targets=game.filterPlayer(i=>i.countCards('h')==list[list.length-1][1]); - return targets; - }()); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dddshichao',target); - var zhu=get.zhu(player)||game.filterPlayer(i=>i.getSeatNum()==1)[0]; - var del=Math.min(target.countCards('h')-player.countCards('h'),zhu.maxHp-player.countCards('h')); - if(del>0) player.draw(del); - if(del<0) player.chooseToDiscard(-del,true); - target.addSkill('dddshichao_up'); - target.markAuto('dddshichao_up',[player]); - player.addTempSkill('dddshichao_clear',{player:'phaseBegin'}); - player.markAuto('dddshichao_clear',[target]); + ) + .set("ai", (target) => { + var zhu = + get.zhu(player) || + game.filterPlayer( + (i) => i.getSeatNum() == 1 + )[0]; + return Math.min( + target.countCards("h") - player.countCards("h"), + zhu.maxHp - player.countCards("h") + ); + }) + .set( + "targets", + (function () { + var list = game + .filterPlayer() + .map((i) => [i, i.countCards("h")]) + .sort((a, b) => b[1] - a[1]); + var targets = []; + var ind = 0, + tmp = Infinity; + for (var i of list) { + if (i[1] < tmp) { + ind++; + tmp = i[1]; + } + if (ind == N) { + targets.push(i[0]); + } + if (ind > N) break; + } + if (!targets.length) + targets = game.filterPlayer( + (i) => + i.countCards("h") == + list[list.length - 1][1] + ); + return targets; + })() + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddshichao", target); + var zhu = + get.zhu(player) || + game.filterPlayer((i) => i.getSeatNum() == 1)[0]; + var del = Math.min( + target.countCards("h") - player.countCards("h"), + zhu.maxHp - player.countCards("h") + ); + if (del > 0) player.draw(del); + if (del < 0) player.chooseToDiscard(-del, true); + target.addSkill("dddshichao_up"); + target.markAuto("dddshichao_up", [player]); + player.addTempSkill("dddshichao_clear", { + player: "phaseBegin", + }); + player.markAuto("dddshichao_clear", [target]); } }, - subSkill:{ - up:{ - trigger:{source:'damageBegin2'}, - filter(event,player){ - return player.getStorage('dddshichao_up').includes(event.player); + subSkill: { + up: { + trigger: { source: "damageBegin2" }, + filter(event, player) { + return player + .getStorage("dddshichao_up") + .includes(event.player); }, - charlotte:true, - check(event,player){ - var eff=get.damageEffect(event.player,player,player); - return event.player.hasSkill('dddshichao')&&eff<0||event.num==1&&eff<13; + charlotte: true, + check(event, player) { + var eff = get.damageEffect( + event.player, + player, + player + ); + return ( + (event.player.hasSkill("dddshichao") && + eff < 0) || + (event.num == 1 && eff < 13) + ); }, - logTarget:'player', - content(){ - 'step 0' + logTarget: "player", + content() { + "step 0"; trigger.cancel(); - if(trigger.player.hasSkill('dddshichao')){ - trigger.player.addMark('dddshichao',1,false); + if (trigger.player.hasSkill("dddshichao")) { + trigger.player.addMark("dddshichao", 1, false); } - } + }, }, - clear:{ - charlotte:true, - onremove(player){ - game.filterPlayer(current=>{ - current.unmarkAuto('dddshichao_up',[player]); + clear: { + charlotte: true, + onremove(player) { + game.filterPlayer((current) => { + current.unmarkAuto("dddshichao_up", [player]); }); - } - } - } + }, + }, + }, }, //管宁 - dddyouxue:{ - audio:2, - trigger:{global:'roundStart'}, - forced:true, - content(){ - 'step 0' - if(!game.hasPlayer(current=>current.hasMark('dddyouxue'))) player.addMark('dddyouxue'); - if(!game.hasPlayer(current=>!current.hasMark('dddyouxue'))) event.finish(); - 'step 1' - player.chooseTarget('游学:将“游学”标记交给另一名角色',true,(card,player,target)=>{ - return !target.hasMark('dddyouxue'); - }).set('ai',target=>{ - return get.distance(game.findPlayer(current=>current.hasMark('dddyouxue')),target); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - var source=game.findPlayer(current=>current.hasMark('dddyouxue')); - if(source==player) player.line(target,'green'); - else player.line2([source,target],'green'); - source.clearMark('dddyouxue'); - target.addMark('dddyouxue'); - player.draw(get.distance(source,target)); + dddyouxue: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + content() { + "step 0"; + if ( + !game.hasPlayer((current) => + current.hasMark("dddyouxue") + ) + ) + player.addMark("dddyouxue"); + if ( + !game.hasPlayer( + (current) => !current.hasMark("dddyouxue") + ) + ) + event.finish(); + ("step 1"); + player + .chooseTarget( + "游学:将“游学”标记交给另一名角色", + true, + (card, player, target) => { + return !target.hasMark("dddyouxue"); + } + ) + .set("ai", (target) => { + return get.distance( + game.findPlayer((current) => + current.hasMark("dddyouxue") + ), + target + ); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + var source = game.findPlayer((current) => + current.hasMark("dddyouxue") + ); + if (source == player) player.line(target, "green"); + else player.line2([source, target], "green"); + source.clearMark("dddyouxue"); + target.addMark("dddyouxue"); + player.draw(get.distance(source, target)); } }, - marktext:'游', - intro:{ - name:'游学', - content:()=>get.translation(game.filterPlayer(current=>current.hasSkill('dddyouxue')))+'到此一游', + marktext: "游", + intro: { + name: "游学", + content: () => + get.translation( + game.filterPlayer((current) => + current.hasSkill("dddyouxue") + ) + ) + "到此一游", }, }, - dddchengjing:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter(event,player){ - if(!event.player.hasMark('dddyouxue')) return false; - return event.player.hasHistory('useCard',evt=>{ - if(!['basic','trick'].includes(get.type(evt.card))) return false; - if(!evt.card.isCard||evt.cards.length!=1) return false; - return get.position(evt.cards[0],true)=='d'; + dddchengjing: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter(event, player) { + if (!event.player.hasMark("dddyouxue")) return false; + return event.player.hasHistory("useCard", (evt) => { + if (!["basic", "trick"].includes(get.type(evt.card))) + return false; + if (!evt.card.isCard || evt.cards.length != 1) + return false; + return get.position(evt.cards[0], true) == "d"; }); }, - forced:true, - locked:false, - group:'dddchengjing_use', - logTarget:'player', - *content(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.player; - let history=target.getHistory('useCard').reverse(); - let cards=[]; - for(var evt of history){ - if(!['basic','trick'].includes(get.type(evt.card))) continue; - if(!evt.card.isCard||evt.cards.length!=1) continue; - if(get.position(evt.cards[0],true)=='d'){ + forced: true, + locked: false, + group: "dddchengjing_use", + logTarget: "player", + *content(event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let history = target.getHistory("useCard").reverse(); + let cards = []; + for (var evt of history) { + if (!["basic", "trick"].includes(get.type(evt.card))) + continue; + if (!evt.card.isCard || evt.cards.length != 1) continue; + if (get.position(evt.cards[0], true) == "d") { cards.addArray(evt.cards); break; } } - const jing=player.getExpansions('dddchengjing'); - if(jing.length) player.loseToDiscardpile(jing); - player.addToExpansion(cards,'log','gain2').gaintag.add('dddchengjing'); + const jing = player.getExpansions("dddchengjing"); + if (jing.length) player.loseToDiscardpile(jing); + player + .addToExpansion(cards, "log", "gain2") + .gaintag.add("dddchengjing"); }, - marktext:'经', - intro:{ - name:'经(承经)', - name2:'经', - markcount:'expansion', - content:'expansion', + marktext: "经", + intro: { + name: "经(承经)", + name2: "经", + markcount: "expansion", + content: "expansion", }, - subSkill:{ - use:{ - audio:'dddchengjing', - enable:'phaseUse', - usable:1, - filterCard:true, - position:'hes', - filter(event,player){ - return player.getExpansions('dddchengjing').length>0; + subSkill: { + use: { + audio: "dddchengjing", + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "hes", + filter(event, player) { + return ( + player.getExpansions("dddchengjing").length > 0 + ); }, - viewAs(cards,player){ - const card=player.getExpansions('dddchengjing')[0]; + viewAs(cards, player) { + const card = + player.getExpansions("dddchengjing")[0]; return new lib.element.VCard({ - name:get.name(card,false), - nature:get.nature(card,false), - storage:{dddchengjing:true}, + name: get.name(card, false), + nature: get.nature(card, false), + storage: { dddchengjing: true }, }); }, - popname:true, - prompt(){ - const card=get.player().getExpansions('dddchengjing')[0]; - return '将一张牌当'+get.translation({ - name:get.name(card,false), - nature:get.nature(card,false) - })+'使用'; + popname: true, + prompt() { + const card = get + .player() + .getExpansions("dddchengjing")[0]; + return ( + "将一张牌当" + + get.translation({ + name: get.name(card, false), + nature: get.nature(card, false), + }) + + "使用" + ); }, - precontent(){ - player.when('useCardAfter').filter(evt=>evt.card.storage.dddchengjing).then(()=>{ - var cards=trigger.cards.filterInD('od'); - if(!cards.length){event.finish();return}; - var target=game.findPlayer(current=>current.hasMark('dddyouxue')); - if(!target){event.finish();return}; - target=target.getNext(); - event.target=target; - player.chooseBool(`承经:是否将${get.translation(cards)}交给${get.translation(target)}?`).set('choice',get.attitude(player,target)>0); - }).then(()=>{ - if(result.bool){ - player.line(event.target); - player.addExpose(0.1); - event.target.gain(trigger.cards.filterInD('od'),'gain2'); - } - }); + precontent() { + player + .when("useCardAfter") + .filter((evt) => evt.card.storage.dddchengjing) + .then(() => { + var cards = trigger.cards.filterInD("od"); + if (!cards.length) { + event.finish(); + return; + } + var target = game.findPlayer((current) => + current.hasMark("dddyouxue") + ); + if (!target) { + event.finish(); + return; + } + target = target.getNext(); + event.target = target; + player + .chooseBool( + `承经:是否将${get.translation( + cards + )}交给${get.translation(target)}?` + ) + .set( + "choice", + get.attitude(player, target) > 0 + ); + }) + .then(() => { + if (result.bool) { + player.line(event.target); + player.addExpose(0.1); + event.target.gain( + trigger.cards.filterInD("od"), + "gain2" + ); + } + }); }, - } + }, }, }, - dddyouxue_old:{ - audio:2, - trigger:{global:'roundStart'}, - forced:true, - content(){ - 'step 0' - var vpos=player.hasMark('dddyouxue_old')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue_old'))[0]:player; - event.vpos=vpos; - player.chooseTarget('游学:选择你的行动次序',true).set('ai',target=>{ - return get.distance(_status.event.vpos,target); - }).set('vpos',vpos); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - if(event.vpos==player) player.line(target,'green'); - else player.line2([event.vpos,target],'green'); - event.num=get.distance(event.vpos,target); - player.storage['dddyouxue_old']=target.getSeatNum(); - player.addSkill('dddyouxue_old_act'); - player.markSkill('dddyouxue_old'); - } - else event.finish(); - 'step 2' - var next=player.phaseDraw(); - next.set('num',num); + dddyouxue_old: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + content() { + "step 0"; + var vpos = player.hasMark("dddyouxue_old") + ? game.filterPlayer2( + (i) => + i.getSeatNum() == + player.countMark("dddyouxue_old") + )[0] + : player; + event.vpos = vpos; + player + .chooseTarget("游学:选择你的行动次序", true) + .set("ai", (target) => { + return get.distance(_status.event.vpos, target); + }) + .set("vpos", vpos); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + if (event.vpos == player) player.line(target, "green"); + else player.line2([event.vpos, target], "green"); + event.num = get.distance(event.vpos, target); + player.storage["dddyouxue_old"] = target.getSeatNum(); + player.addSkill("dddyouxue_old_act"); + player.markSkill("dddyouxue_old"); + } else event.finish(); + ("step 2"); + var next = player.phaseDraw(); + next.set("num", num); delete next.skill; - 'step 3' - player.skip('phaseDraw'); + ("step 3"); + player.skip("phaseDraw"); }, - marktext:'虚', - intro:{ - name:'虚位', - content:'当前虚位为#号', + marktext: "虚", + intro: { + name: "虚位", + content: "当前虚位为#号", }, - subSkill:{ - act:{ - trigger:{ - global:['phaseBefore','phaseAfter','phaseYouxueed'], + subSkill: { + act: { + trigger: { + global: [ + "phaseBefore", + "phaseAfter", + "phaseYouxueed", + ], }, - forced:true, - firstDo:true, - charlotte:true, - filter(event,player,name){ - if(event.skill) return false; - var vseat=player.countMark('dddyouxue_old'); - if(name!='phaseBefore'){ - if(player.hasSkill('dddyouxue_old_acted',null,false,false)) return false; - var seat=event.player.getSeatNum(); - var next=event.player.next; - if(!game.players.includes(next)) next=game.findNext(next); - var seat2=next.getSeatNum(); - if(seat==seat2) return false; - if(seatseat&&vseat<=seat2; - return seat2>=vseat; - } - else{ - return event.player==player; + forced: true, + firstDo: true, + charlotte: true, + filter(event, player, name) { + if (event.skill) return false; + var vseat = player.countMark("dddyouxue_old"); + if (name != "phaseBefore") { + if ( + player.hasSkill( + "dddyouxue_old_acted", + null, + false, + false + ) + ) + return false; + var seat = event.player.getSeatNum(); + var next = event.player.next; + if (!game.players.includes(next)) + next = game.findNext(next); + var seat2 = next.getSeatNum(); + if (seat == seat2) return false; + if (seat < seat2) + return vseat > seat && vseat <= seat2; + return seat2 >= vseat; + } else { + return event.player == player; } }, - content(){ - if(event.triggername=='phaseBefore'){ + content() { + if (event.triggername == "phaseBefore") { trigger.finish(); trigger.untrigger(true); - trigger._triggered=5; - trigger.trigger('phaseYouxueed'); + trigger._triggered = 5; + trigger.trigger("phaseYouxueed"); + } else { + player.insertPhase("dddyouxue_old_act"); + player.addTempSkill( + "dddyouxue_old_acted", + "roundStart" + ); } - else{ - player.insertPhase('dddyouxue_old_act'); - player.addTempSkill('dddyouxue_old_acted','roundStart'); - } - } + }, }, - acted:{charlotte:true} - } - }, - dddchengjing_old:{ - audio:2, - usable:1, - enable:'phaseUse', - filter(event,player){ - return player.countCards('hes')>0&&player.countMark('dddyouxue_old')>0&&lib.skill['dddchengjing_old'].getList(player).length>0; + acted: { charlotte: true }, }, - getList(player){ - var vpos=player.hasMark('dddyouxue_old')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue_old'))[0]:player; - if(!vpos||!vpos.isIn()) return []; - var vcard=[]; - var history=vpos.getPrevious().actionHistory.filter(evt=>!evt.custom.some(i=>i['dddyouxue_old'])); - history=history[history.length-2]; - var evts=history.useCard; - for(var evt of evts){ - var card=evt.card; - var type=get.type(card); - if(type!='basic'&&type!='trick') continue; - if(card.name=='sha'){ - vcard.push(['基本','',card.name,card.nature]); - } - else vcard.push([type,'',card.name]); + }, + dddchengjing_old: { + audio: 2, + usable: 1, + enable: "phaseUse", + filter(event, player) { + return ( + player.countCards("hes") > 0 && + player.countMark("dddyouxue_old") > 0 && + lib.skill["dddchengjing_old"].getList(player).length > 0 + ); + }, + getList(player) { + var vpos = player.hasMark("dddyouxue_old") + ? game.filterPlayer2( + (i) => + i.getSeatNum() == + player.countMark("dddyouxue_old") + )[0] + : player; + if (!vpos || !vpos.isIn()) return []; + var vcard = []; + var history = vpos + .getPrevious() + .actionHistory.filter( + (evt) => !evt.custom.some((i) => i["dddyouxue_old"]) + ); + history = history[history.length - 2]; + var evts = history.useCard; + for (var evt of evts) { + var card = evt.card; + var type = get.type(card); + if (type != "basic" && type != "trick") continue; + if (card.name == "sha") { + vcard.push(["基本", "", card.name, card.nature]); + } else vcard.push([type, "", card.name]); } return vcard; }, - chooseButton:{ - dialog(event,player){ - var list=lib.skill['dddchengjing_old'].getList(player); - list.sort((a,b)=>{ - return 100*(lib.inpile.indexOf(a[2])-lib.inpile.indexOf(b[2]))+lib.inpile_nature.indexOf(a[3])-lib.inpile_nature.indexOf(b[3]); + chooseButton: { + dialog(event, player) { + var list = + lib.skill["dddchengjing_old"].getList(player); + list.sort((a, b) => { + return ( + 100 * + (lib.inpile.indexOf(a[2]) - + lib.inpile.indexOf(b[2])) + + lib.inpile_nature.indexOf(a[3]) - + lib.inpile_nature.indexOf(b[3]) + ); }); - list.filter(vcard=>{ - return event.filterCard({name:vcard[2],nature:vcard[3]},player,event); - }) - return ui.create.dialog('承经',[list,'vcard']); + list.filter((vcard) => { + return event.filterCard( + { name: vcard[2], nature: vcard[3] }, + player, + event + ); + }); + return ui.create.dialog("承经", [list, "vcard"]); }, - filter(button,player){ - return _status.event.getParent().filterCard({name:button.link[2]},player,_status.event.getParent()); + filter(button, player) { + return _status.event + .getParent() + .filterCard( + { name: button.link[2] }, + player, + _status.event.getParent() + ); }, - check(button){ - if(_status.event.getParent().type!='phase') return 1; - var player=_status.event.player; + check(button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; return player.getUseValue({ - name:button.link[2], - nature:button.link[3], + name: button.link[2], + nature: button.link[3], }); }, - backup(links,player){ + backup(links, player) { return { - filterCard:true, - audio:'dddchengjing_old', - popname:true, - check(card){ - return 8-get.value(card); + filterCard: true, + audio: "dddchengjing_old", + popname: true, + check(card) { + return 8 - get.value(card); }, - position:'hes', - viewAs:{ - name:links[0][2], - nature:links[0][3], - storage:{'dddchengjing_old':true} + position: "hes", + viewAs: { + name: links[0][2], + nature: links[0][3], + storage: { dddchengjing_old: true }, }, - precontent(){ - player.addTempSkill('dddchengjing_old_effect'); + precontent() { + player.addTempSkill("dddchengjing_old_effect"); }, - } + }; }, - prompt(links,player){ - return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; - } - }, - ai:{ - combo:'dddyouxue_old', - order:1, - result:{ - player:1, + prompt(links, player) { + return ( + "将一张牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, }, - subSkill:{ - effect:{ - audio:'dddchengjing_old', - trigger:{global:'useCardAfter'}, - charlotte:true, - direct:true, - filter(event,player){ - return event.card&&event.card.storage&&event.card.storage['dddchengjing_old']; - }, - content(){ - 'step 0' - var damaged=game.hasPlayer2(current=>current.hasHistory('damage',evt=>evt.card==trigger.card)); - event.damaged=damaged; - var vpos=player.hasMark('dddyouxue_old')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue_old'))[0]:player; - var target=vpos.getNext(); - event.target=target; - player.chooseControl(' +1 ',' -1 ','cancel2').set('prompt','是否令“虚位”下家('+get.translation(target)+')下回合的'+(damaged?'摸牌数':'手牌上限')+'+1或-1?').set('ai',function(){ - var sgn=get.sgn(get.attitude(_status.event.player,_status.event.target)); - if(sgn==0) return 2; - if(sgn==1) return 0; - return 1; - }).set('target',target); - 'step 1' - if(result.index!=2){ - player.logSkill('dddchengjing_old_effect',target); - var name=(event.damaged?'draw':'limit')+result.index; - target.addTempSkill('dddchengjing_old_check',{player:'phaseAfter'}); - target.addMark('dddchengjing_old_'+name,1,false); - game.log(target,'下回合的'+(event.damaged?'摸牌数':'手牌上限'),'#y'+(['+1','-1'][result.index])); - } - } + ai: { + combo: "dddyouxue_old", + order: 1, + result: { + player: 1, }, - check:{ - trigger:{player:'phaseDrawBegin2'}, - charlotte:true, - forced:true, - filter(event,player){ - return player.countMark('dddchengjing_old_draw0')>0||player.countMark('dddchengjing_old_draw1')>0; + }, + subSkill: { + effect: { + audio: "dddchengjing_old", + trigger: { global: "useCardAfter" }, + charlotte: true, + direct: true, + filter(event, player) { + return ( + event.card && + event.card.storage && + event.card.storage["dddchengjing_old"] + ); }, - content(){ - trigger.num+=player.countMark('dddchengjing_old_draw0')-player.countMark('dddchengjing_old_draw1'); - }, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('dddchengjing_old_limit0')-player.countMark('dddchengjing_old_limit1'); + content() { + "step 0"; + var damaged = game.hasPlayer2((current) => + current.hasHistory( + "damage", + (evt) => evt.card == trigger.card + ) + ); + event.damaged = damaged; + var vpos = player.hasMark("dddyouxue_old") + ? game.filterPlayer2( + (i) => + i.getSeatNum() == + player.countMark("dddyouxue_old") + )[0] + : player; + var target = vpos.getNext(); + event.target = target; + player + .chooseControl(" +1 ", " -1 ", "cancel2") + .set( + "prompt", + "是否令“虚位”下家(" + + get.translation(target) + + ")下回合的" + + (damaged ? "摸牌数" : "手牌上限") + + "+1或-1?" + ) + .set("ai", function () { + var sgn = get.sgn( + get.attitude( + _status.event.player, + _status.event.target + ) + ); + if (sgn == 0) return 2; + if (sgn == 1) return 0; + return 1; + }) + .set("target", target); + ("step 1"); + if (result.index != 2) { + player.logSkill( + "dddchengjing_old_effect", + target + ); + var name = + (event.damaged ? "draw" : "limit") + + result.index; + target.addTempSkill("dddchengjing_old_check", { + player: "phaseAfter", + }); + target.addMark( + "dddchengjing_old_" + name, + 1, + false + ); + game.log( + target, + "下回合的" + + (event.damaged ? "摸牌数" : "手牌上限"), + "#y" + ["+1", "-1"][result.index] + ); } }, - onremove(player){ - delete player.storage['dddchengjing_old_draw0']; - delete player.storage['dddchengjing_old_draw1']; - delete player.storage['dddchengjing_old_limit0']; - delete player.storage['dddchengjing_old_limit1']; + }, + check: { + trigger: { player: "phaseDrawBegin2" }, + charlotte: true, + forced: true, + filter(event, player) { + return ( + player.countMark("dddchengjing_old_draw0") > + 0 || + player.countMark("dddchengjing_old_draw1") > 0 + ); }, - mark:true, - marktext:'承', - intro:{ - name:'承经', - content(storage,player){ - var str=''; - if(player.countMark('dddchengjing_old_draw0')||player.countMark('dddchengjing_old_draw1')){ - var num=player.countMark('dddchengjing_old_draw0')-player.countMark('dddchengjing_old_draw1'); - str+='
  • 摸牌阶段摸牌数'+(num>=0?'+':'')+num; + content() { + trigger.num += + player.countMark("dddchengjing_old_draw0") - + player.countMark("dddchengjing_old_draw1"); + }, + mod: { + maxHandcard(player, num) { + return ( + num + + player.countMark( + "dddchengjing_old_limit0" + ) - + player.countMark("dddchengjing_old_limit1") + ); + }, + }, + onremove(player) { + delete player.storage["dddchengjing_old_draw0"]; + delete player.storage["dddchengjing_old_draw1"]; + delete player.storage["dddchengjing_old_limit0"]; + delete player.storage["dddchengjing_old_limit1"]; + }, + mark: true, + marktext: "承", + intro: { + name: "承经", + content(storage, player) { + var str = ""; + if ( + player.countMark( + "dddchengjing_old_draw0" + ) || + player.countMark("dddchengjing_old_draw1") + ) { + var num = + player.countMark( + "dddchengjing_old_draw0" + ) - + player.countMark( + "dddchengjing_old_draw1" + ); + str += + "
  • 摸牌阶段摸牌数" + + (num >= 0 ? "+" : "") + + num; } - if(player.countMark('dddchengjing_old_limit0')||player.countMark('dddchengjing_old_limit1')){ - var num=player.countMark('dddchengjing_old_limit0')-player.countMark('dddchengjing_old_limit1'); - str+='
  • 手牌上限'+(num>=0?'+':'')+num; + if ( + player.countMark( + "dddchengjing_old_limit0" + ) || + player.countMark("dddchengjing_old_limit1") + ) { + var num = + player.countMark( + "dddchengjing_old_limit0" + ) - + player.countMark( + "dddchengjing_old_limit1" + ); + str += + "
  • 手牌上限" + + (num >= 0 ? "+" : "") + + num; } return str; - } - } + }, + }, }, - draw0:{charlotte:true}, - draw1:{charlotte:true}, - limit0:{charlotte:true}, - limit1:{charlotte:true}, - } + draw0: { charlotte: true }, + draw1: { charlotte: true }, + limit0: { charlotte: true }, + limit1: { charlotte: true }, + }, }, - dddduanbing:{ - enable:'phaseUse', - filter(event,player){ - return player.canAddJudge('bingliang')&&player.hasCard((card)=>lib.skill['dddduanbing'].filterCard(card,player),'he'); + dddduanbing: { + enable: "phaseUse", + filter(event, player) { + return ( + player.canAddJudge("bingliang") && + player.hasCard( + (card) => + lib.skill["dddduanbing"].filterCard( + card, + player + ), + "he" + ) + ); }, - filterCard(card,player){ - if(get.color(card)!='black'||get.type2(card)=='trick') return false; - return player.canAddJudge(get.autoViewAs({name:'bingliang'},[card])); + filterCard(card, player) { + if ( + get.color(card) != "black" || + get.type2(card) == "trick" + ) + return false; + return player.canAddJudge( + get.autoViewAs({ name: "bingliang" }, [card]) + ); }, - check(card){ - return 8.2-get.value(card); + check(card) { + return 8.2 - get.value(card); }, - discard:false, - lose:false, - delay:false, - prepare:'throw', - group:'dddduanbing_effect', - position:'he', - content(){ - 'step 0' - player.addJudge({name:'bingliang'},cards); - 'step 1' + discard: false, + lose: false, + delay: false, + prepare: "throw", + group: "dddduanbing_effect", + position: "he", + content() { + "step 0"; + player.addJudge({ name: "bingliang" }, cards); + ("step 1"); game.delayx(); player.draw(2); - 'step 2' - player.chooseUseTarget({ - name:'sha', - isCard:true, - storage:{_dddduanbing:true}, - },false,'nodistance'); + ("step 2"); + player.chooseUseTarget( + { + name: "sha", + isCard: true, + storage: { _dddduanbing: true }, + }, + false, + "nodistance" + ); }, - ai:{ - order(item,player){ - return get.order({name:'sha'})-0.1; + ai: { + order(item, player) { + return get.order({ name: "sha" }) - 0.1; }, - result:{ - player(player){ - return player.getUseValue({name:'sha'},false) + result: { + player(player) { + return player.getUseValue({ name: "sha" }, false); }, }, }, - subSkill:{ - effect:{ - trigger:{source:'damageSource'}, - charlotte:true, - filter(event,player){ - if(event.getParent().type!='card'||!event.player.isIn()) return false; - return player.hasCard(card=>{ - return (card.viewAs||card.name)=='bingliang'&&event.player.canAddJudge(card); - },'j'); + subSkill: { + effect: { + trigger: { source: "damageSource" }, + charlotte: true, + filter(event, player) { + if ( + event.getParent().type != "card" || + !event.player.isIn() + ) + return false; + return player.hasCard((card) => { + return ( + (card.viewAs || card.name) == "bingliang" && + event.player.canAddJudge(card) + ); + }, "j"); }, - prompt:(event)=>('是否将【兵粮寸断】转移给'+get.translation(event.player)+'?'), - check(event,player){ - return player.hasCard(card=>{ - return (card.viewAs||card.name)=='bingliang'&&event.player.canAddJudge(card)&&get.effect(event.player,new lib.element.VCard({ - name:'bingliang', - cards:[card] - }),player,_status.event.player)>=0; - },'j'); + prompt: (event) => + "是否将【兵粮寸断】转移给" + + get.translation(event.player) + + "?", + check(event, player) { + return player.hasCard((card) => { + return ( + (card.viewAs || card.name) == "bingliang" && + event.player.canAddJudge(card) && + get.effect( + event.player, + new lib.element.VCard({ + name: "bingliang", + cards: [card], + }), + player, + _status.event.player + ) >= 0 + ); + }, "j"); }, - content(){ - var cards=player.getCards('j',card=>{ - return (card.viewAs||card.name)=='bingliang'&&trigger.player.canAddJudge(card); + content() { + var cards = player.getCards("j", (card) => { + return ( + (card.viewAs || card.name) == "bingliang" && + trigger.player.canAddJudge(card) + ); }); - var target=trigger.player; + var target = trigger.player; player.line(target); - player.$give(cards,target,false); - cards.forEach(card=>{ - target.addJudge({name:'bingliang'},card); + player.$give(cards, target, false); + cards.forEach((card) => { + target.addJudge({ name: "bingliang" }, card); }); }, }, }, }, //轲比能 - dddxiaoxing:{ - audio:2, - trigger:{global:'gameDrawBegin'}, - forced:true, - group:'dddxiaoxing_remove', - init(player,skill){ - if(game.online) return; - var bool=get.event().getParent('phaseLoop',true); - if(!bool) return; - if(player.hasSkill(skill)){ - player.logSkill('dddxiaoxing'); + dddxiaoxing: { + audio: 2, + trigger: { global: "gameDrawBegin" }, + forced: true, + group: "dddxiaoxing_remove", + init(player, skill) { + if (game.online) return; + var bool = get.event().getParent("phaseLoop", true); + if (!bool) return; + if (player.hasSkill(skill)) { + player.logSkill("dddxiaoxing"); player.draw(3); } }, - content(){ - var me=player; - var numx=trigger.num; - trigger.num=typeof numx=='function'?function(player){ - if(player==me){ - return 3+numx(player); - } - return numx(player); - }:function(player){ - if(player==me){ - return 3+numx; - } - return numx; - } + content() { + var me = player; + var numx = trigger.num; + trigger.num = + typeof numx == "function" + ? function (player) { + if (player == me) { + return 3 + numx(player); + } + return numx(player); + } + : function (player) { + if (player == me) { + return 3 + numx; + } + return numx; + }; }, - mod:{ - attackRange:(player,num)=>num+3, - maxHandcard:(player,num)=>num+3, + mod: { + attackRange: (player, num) => num + 3, + maxHandcard: (player, num) => num + 3, }, - subSkill:{ - remove:{ - trigger:{player:'dying'}, - forced:true, + subSkill: { + remove: { + trigger: { player: "dying" }, + forced: true, // direct:true, // filter(event,player){ // return event.source&&event.source.isIn()&&event.source.getEquips(1).length>0; // }, - content(){ - player.removeSkills('dddxiaoxing'); + content() { + player.removeSkills("dddxiaoxing"); }, - content_old(){ - 'step 0' - trigger.source.chooseBool(get.prompt('dddxiaoxing',player),'废除武器栏,令其失去〖枭行〗').set('ai',()=>{ - if(_status.event.maybe) return Math.random()<0.5; - return false; - }).set('maybe',player.countCards('hs',{name:['tao','jiu']})&&player.countCards('h')>=3); - 'step 1' - if(result.bool){ - trigger.source.logSkill('dddxiaoxing',player); + content_old() { + "step 0"; + trigger.source + .chooseBool( + get.prompt("dddxiaoxing", player), + "废除武器栏,令其失去〖枭行〗" + ) + .set("ai", () => { + if (_status.event.maybe) + return Math.random() < 0.5; + return false; + }) + .set( + "maybe", + player.countCards("hs", { + name: ["tao", "jiu"], + }) && player.countCards("h") >= 3 + ); + ("step 1"); + if (result.bool) { + trigger.source.logSkill("dddxiaoxing", player); trigger.source.disableEquip(1); - player.removeSkills('dddxiaoxing'); + player.removeSkills("dddxiaoxing"); } - } - } - } + }, + }, + }, }, - dddlangzhi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - logTarget(event,player){ - return game.filterPlayer(current=>player.inRange(current)&¤t.countCards('he')); + dddlangzhi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + logTarget(event, player) { + return game.filterPlayer( + (current) => + player.inRange(current) && current.countCards("he") + ); }, - prompt:'是否发动【狼志】?', - prompt2(event,player){ - return `展示${get.translation(game.filterPlayer(current=>player.inRange(current)&¤t.countCards('he')))}的各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。` + prompt: "是否发动【狼志】?", + prompt2(event, player) { + return `展示${get.translation( + game.filterPlayer( + (current) => + player.inRange(current) && + current.countCards("he") + ) + )}的各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。`; }, - content(){ - 'step 0' - event.targets=game.filterPlayer(current=>player.inRange(current)&¤t.countCards('he')); - event.cards=[]; - event.num=0; - 'step 1' - var target=targets[num]; + content() { + "step 0"; + event.targets = game.filterPlayer( + (current) => + player.inRange(current) && current.countCards("he") + ); + event.cards = []; + event.num = 0; + ("step 1"); + var target = targets[num]; event.num++; - event.target=target; - player.choosePlayerCard('狼志:展示'+get.translation(target)+'一张牌','he',target,true); - 'step 2' - if(result.bool){ - var card=result.links[0]; - player.showCards(card,get.translation(target)+'被展示'); + event.target = target; + player.choosePlayerCard( + "狼志:展示" + get.translation(target) + "一张牌", + "he", + target, + true + ); + ("step 2"); + if (result.bool) { + var card = result.links[0]; + player.showCards( + card, + get.translation(target) + "被展示" + ); event.cards.push(card); } - 'step 3' - if(num或点击“取消”,获得所有展示牌,然后失去〖狼志〗',cards); - event.dialog.videoId=event.videoId; + ("step 3"); + if (num < targets.length) event.goto(1); + else { + event.videoId = lib.status.videoId++; + if (event.isMine()) { + event.dialog = ui.create.dialog( + '###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ', + cards + ); + event.dialog.videoId = event.videoId; + } else if (player.isOnline2()) { + player.send( + function (cards, id) { + var dialog = ui.create.dialog( + '###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ', + cards + ); + dialog.videoId = id; + }, + cards, + event.videoId + ); } - else if(player.isOnline2()){ - player.send(function(cards,id){ - var dialog=ui.create.dialog('###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ',cards); - dialog.videoId=id; - },cards,event.videoId); - } - player.chooseCard([1,cards.length],'he').set('ai',card=>{ - if(ui.selected.cards.length>=_status.event.num) return 0; - return 100-get.value(card); - }).set('num',function(){ - if(cards.lengthp+get.value(c),0); - if(valget.value(card,player)),list2=cards.map((card,i)=>get.value(card,targets[i])*get.sgnAttitude(player,targets[i])); - list1.sort((a,b)=>a[1]-b[1]); - list2.sort((a,b)=>b[1]-a[1]); - list2=list2.filter(i=>i>0); - var count=0; - for(var i of list2){ - for(var j=0;jlist1[j]){ - count++; - list1.splice(j,1); - break; + player + .chooseCard([1, cards.length], "he") + .set("ai", (card) => { + if ( + ui.selected.cards.length >= + _status.event.num + ) + return 0; + return 100 - get.value(card); + }) + .set( + "num", + (function () { + if ( + cards.length < + Math.floor(game.countPlayer() / 2 - 0.5) + ) + return 0; + var val = cards.reduce( + (p, c) => p + get.value(c), + 0 + ); + if (val < cards.length * 6) return 0; + var list1 = player + .getCards("he") + .map((card) => + get.value(card, player) + ), + list2 = cards.map( + (card, i) => + get.value(card, targets[i]) * + get.sgnAttitude( + player, + targets[i] + ) + ); + list1.sort((a, b) => a[1] - b[1]); + list2.sort((a, b) => b[1] - a[1]); + list2 = list2.filter((i) => i > 0); + var count = 0; + for (var i of list2) { + for (var j = 0; j < list1.length; j++) { + if (i > list1[j]) { + count++; + list1.splice(j, 1); + break; + } + } } - } - } - return count; - }()).set('prompt',false); + return count; + })() + ) + .set("prompt", false); } - 'step 4' - if(result.bool){ - var cards2=result.cards; - event.cards2=cards2; - var func=function(id){ - var dialog=get.idDialog(id); - if(dialog) dialog.content.childNodes[1].innerHTML='
    选择要交换的牌(按选择的顺序一一交换)
    '; + ("step 4"); + if (result.bool) { + var cards2 = result.cards; + event.cards2 = cards2; + var func = function (id) { + var dialog = get.idDialog(id); + if (dialog) + dialog.content.childNodes[1].innerHTML = + '
    选择要交换的牌(按选择的顺序一一交换)
    '; }; - if(event.isMine()) func(event.videoId); - else if(player.isOnline2()) player.send(func,event.videoId); - player.chooseButton(cards2.length,true).set('dialog',event.videoId).set('ai',button=>{ - return get.value(button.link); - }); + if (event.isMine()) func(event.videoId); + else if (player.isOnline2()) + player.send(func, event.videoId); + player + .chooseButton(cards2.length, true) + .set("dialog", event.videoId) + .set("ai", (button) => { + return get.value(button.link); + }); event.goto(6); - } - else{ - for(var i=0;i{ - return !player.hasSkill(skill,null,false,false); - }); - return skills.length>0; - }, - filter_old(event,player){ - var evt=event.getParent(); - if(evt.name!='die'||evt.source!=event.player||event.player==player) return false; - if(!player.hasZhuSkill('dddfuyi',event.player)) return false; - var skills=player.getSkills('dddxiaoxing',null,false,false); - return !skills.includes('dddxiaoxing')||!skills.includes('dddlangzhi'); - }, - direct:true, - global:'dddfuyi_sha', - content(){ - 'step 0' - trigger.source.chooseCard('是否响应'+get.translation(player)+'的【附义】?','弃置两张牌,令其获得其武将牌上的一个技能','he',2,lib.filter.cardDiscardable).set('ai',()=>{ - if(get.attitude(_status.event.player,_status.event.getParent().player)<=2) return 0; - return 6-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('dddfuyi',trigger.source); - trigger.source.discard(result.cards).discarder=trigger.source; - var skills=player.getStockSkills(true,true).filter(skill=>{ - return !player.hasSkill(skill,null,false,false); + filter(event, player) { + if ( + !event.source || + !event.source.isIn() || + event.source.group != "qun" + ) + return false; + if (!event.source.countCards("he") < 2) return false; + if (!player.hasZhuSkill("dddfuyi", event.source)) + return false; + const skills = player + .getStockSkills(true, true) + .filter((skill) => { + return !player.hasSkill(skill, null, false, false); }); - if(skills.length==1) event._result={control:skills[0]}; - else trigger.source.chooseControl(skills).set('choiceList',skills.map(skill=>{ - return '
    【'+get.translation(lib.translate[skill+'_ab']||get.translation(skill).slice(0,2))+'】
    '+get.skillInfoTranslation(skill,player)+'
    '; - })).set('displayIndex',false).set('prompt',`附义:选择令${get.translation(player)}获得一个技能`).set('ai',()=>{ - var controls=get.event('controls'); - if(controls.includes('dddxiaoxing')) return 'dddxiaoxing'; - return controls.sort((a,b)=>{ - return get.skillrank(b,'inout')-get.skillrank(a,'inout'); - })[0]; + return skills.length > 0; + }, + filter_old(event, player) { + var evt = event.getParent(); + if ( + evt.name != "die" || + evt.source != event.player || + event.player == player + ) + return false; + if (!player.hasZhuSkill("dddfuyi", event.player)) + return false; + var skills = player.getSkills( + "dddxiaoxing", + null, + false, + false + ); + return ( + !skills.includes("dddxiaoxing") || + !skills.includes("dddlangzhi") + ); + }, + direct: true, + global: "dddfuyi_sha", + content() { + "step 0"; + trigger.source + .chooseCard( + "是否响应" + + get.translation(player) + + "的【附义】?", + "弃置两张牌,令其获得其武将牌上的一个技能", + "he", + 2, + lib.filter.cardDiscardable + ) + .set("ai", () => { + if ( + get.attitude( + _status.event.player, + _status.event.getParent().player + ) <= 2 + ) + return 0; + return 6 - get.value(card); }); - } - else event.finish(); - 'step 2' - var skill=result.control; + ("step 1"); + if (result.bool) { + player.logSkill("dddfuyi", trigger.source); + trigger.source.discard(result.cards).discarder = + trigger.source; + var skills = player + .getStockSkills(true, true) + .filter((skill) => { + return !player.hasSkill( + skill, + null, + false, + false + ); + }); + if (skills.length == 1) + event._result = { control: skills[0] }; + else + trigger.source + .chooseControl(skills) + .set( + "choiceList", + skills.map((skill) => { + return ( + '
    【' + + get.translation( + lib.translate[skill + "_ab"] || + get + .translation(skill) + .slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation( + skill, + player + ) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set( + "prompt", + `附义:选择令${get.translation( + player + )}获得一个技能` + ) + .set("ai", () => { + var controls = get.event("controls"); + if (controls.includes("dddxiaoxing")) + return "dddxiaoxing"; + return controls.sort((a, b) => { + return ( + get.skillrank(b, "inout") - + get.skillrank(a, "inout") + ); + })[0]; + }); + } else event.finish(); + ("step 2"); + var skill = result.control; player.addSkills(skill); }, - content_old(){ - 'step 0' - var str='取消此次奖惩,令其获得'; - var skills=player.getSkills('dddxiaoxing',null,false,false); - var bool1=!skills.includes('dddxiaoxing'),bool2=!skills.includes('dddlangzhi'); - var choices=[]; - if(bool1) { - str+='〖枭行〗'; - choices.push('dddxiaoxing'); + content_old() { + "step 0"; + var str = "取消此次奖惩,令其获得"; + var skills = player.getSkills( + "dddxiaoxing", + null, + false, + false + ); + var bool1 = !skills.includes("dddxiaoxing"), + bool2 = !skills.includes("dddlangzhi"); + var choices = []; + if (bool1) { + str += "〖枭行〗"; + choices.push("dddxiaoxing"); } - if(bool1&&bool2) str+='/'; - if(bool2){ - str+='〖狼志〗'; - choices.push('dddlangzhi'); + if (bool1 && bool2) str += "/"; + if (bool2) { + str += "〖狼志〗"; + choices.push("dddlangzhi"); } - if(bool1&&bool2){ - str+='中的一或两个'; - choices.push('dddfuyi_both') + if (bool1 && bool2) { + str += "中的一或两个"; + choices.push("dddfuyi_both"); } - choices.push('cancel2'); - trigger.player.chooseControl(choices).set('prompt','是否对'+get.translation(player)+'发动【附义】?').set('prompt2',str).set('ai',()=>{ - if(get.attitude(_status.event.player,_status.event.getParent().player)<=2) return 'cancel2'; - if(_status.event.choices.includes('dddfuyi_both')) return 'dddfuyi_both'; - if(_status.event.choices.includes('dddlangzhi')) return 'dddlangzhi'; - return Math.random()<0.5?'dddxiaoxing':'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - trigger.player.logSkill('dddfuyi',player); + choices.push("cancel2"); + trigger.player + .chooseControl(choices) + .set( + "prompt", + "是否对" + + get.translation(player) + + "发动【附义】?" + ) + .set("prompt2", str) + .set("ai", () => { + if ( + get.attitude( + _status.event.player, + _status.event.getParent().player + ) <= 2 + ) + return "cancel2"; + if (_status.event.choices.includes("dddfuyi_both")) + return "dddfuyi_both"; + if (_status.event.choices.includes("dddlangzhi")) + return "dddlangzhi"; + return Math.random() < 0.5 + ? "dddxiaoxing" + : "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + trigger.player.logSkill("dddfuyi", player); trigger.cancel(); - var skills=[result.control]; - if(result.control=='dddfuyi_both'){ - skills=['dddxiaoxing','dddlangzhi']; + var skills = [result.control]; + if (result.control == "dddfuyi_both") { + skills = ["dddxiaoxing", "dddlangzhi"]; player.draw(3); - } - else event.finish(); + } else event.finish(); player.addSkills(skills); - } - else event.finish(); - 'step 2' - player.removeSkills('dddfuyi'); + } else event.finish(); + ("step 2"); + player.removeSkills("dddfuyi"); }, - subSkill:{ - sha:{ - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha'){ - if(player.group!='qun') return; - return num+game.countPlayer(current=>{ - return current.hasZhuSkill('dddfuyi',player); - }); + subSkill: { + sha: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") { + if (player.group != "qun") return; + return ( + num + + game.countPlayer((current) => { + return current.hasZhuSkill( + "dddfuyi", + player + ); + }) + ); } }, }, @@ -4625,807 +7541,1213 @@ game.import('character', function () { }, }, //曹爽 - dddzhuanshe:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - filter(event,player){ - return player.countCards('h')>0&&event.player!=player; + dddzhuanshe: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter(event, player) { + return player.countCards("h") > 0 && event.player != player; }, - direct:true, - content(){ - 'step 0' - player.chooseCard(get.prompt2('dddzhuanshe',trigger.player)).set('ai',card=>{ - var target=_status.event.getTrigger().player; - if(!_status.event.goon){ - if(get.value(card)<4) return -target.getUseValue(card)+0.001; - return 0; - } - return target.getUseValue(card); - }).set('goon',get.attitude(player,trigger.player)); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - player.logSkill('dddzhuanshe',trigger.player); - player.give(card,trigger.player,true); - player.addTempSkill('dddzhuanshe_effect'); - player.markAuto('dddzhuanshe_effect',[card.name]); + direct: true, + content() { + "step 0"; + player + .chooseCard(get.prompt2("dddzhuanshe", trigger.player)) + .set("ai", (card) => { + var target = _status.event.getTrigger().player; + if (!_status.event.goon) { + if (get.value(card) < 4) + return -target.getUseValue(card) + 0.001; + return 0; + } + return target.getUseValue(card); + }) + .set("goon", get.attitude(player, trigger.player)); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + player.logSkill("dddzhuanshe", trigger.player); + player.give(card, trigger.player, true); + player.addTempSkill("dddzhuanshe_effect"); + player.markAuto("dddzhuanshe_effect", [card.name]); } }, - subSkill:{ - effect:{ - audio:'dddzhuanshe', - trigger:{global:'useCard2'}, - filter(event,player){ - if(!player.getStorage('dddzhuanshe_effect').includes(event.card.name)) return false; - if(event.player!=_status.currentPhase) return false; - var type=get.type(event.card,null,false); - if(type!='basic'&&type!='trick') return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,event.player,current); - })){ + subSkill: { + effect: { + audio: "dddzhuanshe", + trigger: { global: "useCard2" }, + filter(event, player) { + if ( + !player + .getStorage("dddzhuanshe_effect") + .includes(event.card.name) + ) + return false; + if (event.player != _status.currentPhase) + return false; + var type = get.type(event.card, null, false); + if (type != "basic" && type != "trick") + return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2( + event.card, + event.player, + current + ) + ); + }) + ) { return true; } } return false; }, - direct:true, - group:'dddzhuanshe_damage', - charlotte:true, - onremove:true, - content(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加一个目标' - player.chooseTarget(get.prompt('dddzhuanshe_effect'),function(card,player,target){ - var player=_status.event.source; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.source; - return get.effect(target,trigger.card,player,_status.event.player); - }).set('targets',trigger.targets).set('card',trigger.card).set('source',trigger.player); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + direct: true, + group: "dddzhuanshe_damage", + charlotte: true, + onremove: true, + content() { + "step 0"; + var prompt2 = + "为" + + get.translation(trigger.card) + + "增加一个目标"; + player + .chooseTarget( + get.prompt("dddzhuanshe_effect"), + function (card, player, target) { + var player = _status.event.source; + return ( + !_status.event.targets.includes( + target + ) && + lib.filter.targetEnabled2( + _status.event.card, + player, + target + ) + ); + } + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.source; + return get.effect( + target, + trigger.card, + player, + _status.event.player + ); + }) + .set("targets", trigger.targets) + .set("card", trigger.card) + .set("source", trigger.player); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) + game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill(event.name,event.targets); + ("step 2"); + if (event.targets) { + player.logSkill(event.name, event.targets); trigger.targets.addArray(event.targets); - game.log(event.targets,'也成为了',trigger.card,'的目标'); + game.log( + event.targets, + "也成为了", + trigger.card, + "的目标" + ); + } + }, + }, + damage: { + audio: "dddzhuanshe", + trigger: { global: "phaseEnd" }, + filter(event, player) { + var list = player + .getStorage("dddzhuanshe_effect") + .slice(); + event.player.getHistory("useCard", (evt) => { + list.remove(evt.card.name); + }); + return list.length; + }, + charlotte: true, + logTarget: "player", + prompt2: "对其造成1点伤害", + check(event, player) { + return ( + get.damageEffect( + event.player, + player, + player + ) >= 0 + ); + }, + content() { + trigger.player.damage(player); + }, + }, + }, + }, + dddweiqiu: { + audio: 2, + trigger: { global: "recoverBefore" }, + filter(event, player) { + return !player.countCards("h"); + }, + forced: true, + direct: true, + content() { + trigger.player.logSkill("dddweiqiu", player); + trigger.cancel(); + player.draw(); + }, + }, + //薛灵芸 + dddlianer: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + return ( + event.cards.filterInD("od").length > 0 && + get.color(event.card) == "red" + ); + }, + content() { + "step 0"; + var cards = trigger.cards.filterInD("od"); + event.cards = cards; + player.gain(cards, "gain2"); + ("step 1"); + var number = get.number(cards[0]); + if (cards.length == 1 && typeof number == "number") { + player.addTempSkill("dddlianer_ceiling"); + player.storage["dddlianer_ceiling"] = number; + } + }, + mod: { + aiOrder(player, card, num) { + if ( + get.itemtype(card) == "card" && + get.color(card) == "red" + ) { + if (!player.storage["dddlianer_ceiling"]) return; + var numx = get.number(card); + if (typeof numx == "number") { + return ( + num + + 10 / + Math.max( + 1, + player.storage[ + "dddlianer_ceiling" + ] - numx + ) + ); } } }, - damage:{ - audio:'dddzhuanshe', - trigger:{global:'phaseEnd'}, - filter(event,player){ - var list=player.getStorage('dddzhuanshe_effect').slice(); - event.player.getHistory('useCard',evt=>{ - list.remove(evt.card.name); - }) - return list.length; - }, - charlotte:true, - logTarget:'player', - prompt2:'对其造成1点伤害', - check(event,player){ - return get.damageEffect(event.player,player,player)>=0; - }, - content(){ - trigger.player.damage(player); - } - } - } - }, - dddweiqiu:{ - audio:2, - trigger:{global:'recoverBefore'}, - filter(event,player){ - return !player.countCards('h'); }, - forced:true, - direct:true, - content(){ - trigger.player.logSkill('dddweiqiu',player); - trigger.cancel(); - player.draw(); - } - }, - //薛灵芸 - dddlianer:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter(event,player){ - return event.cards.filterInD('od').length>0&&get.color(event.card)=='red'; - }, - content(){ - 'step 0' - var cards=trigger.cards.filterInD('od'); - event.cards=cards; - player.gain(cards,'gain2'); - 'step 1' - var number=get.number(cards[0]); - if(cards.length==1&&typeof number=='number'){ - player.addTempSkill('dddlianer_ceiling'); - player.storage['dddlianer_ceiling']=number; - } - }, - mod:{ - aiOrder(player,card,num){ - if(get.itemtype(card)=='card'&&get.color(card)=='red'){ - if(!player.storage['dddlianer_ceiling']) return; - var numx=get.number(card); - if(typeof numx=='number'){ - return num+10/Math.max(1,player.storage['dddlianer_ceiling']-numx); - } - } - } - }, - subSkill:{ - ceiling:{ - onremove:true, - charlotte:true, - mod:{ - cardEnabled(card,player){ - if(!player.storage['dddlianer_ceiling']) return; - var num=get.number(card); - if(num!='unsure'&&(typeof num!='number'||player.storage['dddlianer_ceiling']<=num)) return false; + subSkill: { + ceiling: { + onremove: true, + charlotte: true, + mod: { + cardEnabled(card, player) { + if (!player.storage["dddlianer_ceiling"]) + return; + var num = get.number(card); + if ( + num != "unsure" && + (typeof num != "number" || + player.storage["dddlianer_ceiling"] <= + num) + ) + return false; }, - cardRespondable(card,player){ - if(!player.storage['dddlianer_ceiling']) return; - var num=get.number(card); - if(num!='unsure'&&(typeof num!='number'||player.storage['dddlianer_ceiling']<=num)) return false; + cardRespondable(card, player) { + if (!player.storage["dddlianer_ceiling"]) + return; + var num = get.number(card); + if ( + num != "unsure" && + (typeof num != "number" || + player.storage["dddlianer_ceiling"] <= + num) + ) + return false; }, - cardSavable(card,player){ - if(!player.storage['dddlianer_ceiling']) return; - var num=get.number(card); - if(num!='unsure'&&(typeof num!='number'||player.storage['dddlianer_ceiling']<=num)) return false; + cardSavable(card, player) { + if (!player.storage["dddlianer_ceiling"]) + return; + var num = get.number(card); + if ( + num != "unsure" && + (typeof num != "number" || + player.storage["dddlianer_ceiling"] <= + num) + ) + return false; }, - } - } - } - }, - dddanzhi:{ - audio:2, - trigger:{global:'phaseBegin'}, - filter(event,player){ - var evts=game.getAllGlobalHistory('everything',evt=>['useCard','respond'].includes(evt.name)); - if(!evts.length) return false; - const color=get.color(evts.lastItem.card,false); - return color=='black' - }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('dddanzhi'),'选择一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效').set('ai',target=>{ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dddanzhi',target); - target.addTempSkill('dddanzhi_effect'); - } - }, - subSkill:{ - effect:{ - trigger:{target:'useCardToTarget'}, - filter(event,player){ - return get.color(event.card)=='black'; }, - forced:true, - charlotte:true, - content(){ + }, + }, + }, + dddanzhi: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter(event, player) { + var evts = game.getAllGlobalHistory("everything", (evt) => + ["useCard", "respond"].includes(evt.name) + ); + if (!evts.length) return false; + const color = get.color(evts.lastItem.card, false); + return color == "black"; + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt("dddanzhi"), + "选择一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效" + ) + .set("ai", (target) => { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dddanzhi", target); + target.addTempSkill("dddanzhi_effect"); + } + }, + subSkill: { + effect: { + trigger: { target: "useCardToTarget" }, + filter(event, player) { + return get.color(event.card) == "black"; + }, + forced: true, + charlotte: true, + content() { trigger.targets.remove(player); - trigger.getParent().triggeredTargets2.remove(player); + trigger + .getParent() + .triggeredTargets2.remove(player); trigger.untrigger(); - game.log(trigger.card,'对',player,'无效了'); + game.log(trigger.card, "对", player, "无效了"); game.delayx(); - player.removeSkill('dddanzhi_effect'); - } - } - } + player.removeSkill("dddanzhi_effect"); + }, + }, + }, }, //刘宏 - dddshixing:{ - audio:2, - trigger:{ - global:['changeHp','useCard1','phaseBefore'], + dddshixing: { + audio: 2, + trigger: { + global: ["changeHp", "useCard1", "phaseBefore"], }, - forced:true, - onremove:true, - filter(event,player){ - var num=player.countMark('dddshixing'); - if(event.name=='changeHp'){ - if(event.player.hasSex('female')){ - var bool=!event.player.isDamaged(); - if(bool&&((num&1)==0)||!bool&&((num&1)==1)){ + forced: true, + onremove: true, + filter(event, player) { + var num = player.countMark("dddshixing"); + if (event.name == "changeHp") { + if (event.player.hasSex("female")) { + var bool = !event.player.isDamaged(); + if ( + (bool && (num & 1) == 0) || + (!bool && (num & 1) == 1) + ) { return true; } } return false; } - if(event.name=='useCard'){ - var bool=game.getGlobalHistory('useCard',evt=>get.type2(evt.card)=='trick').length==0; - if((bool&&(num&2)==0)||!bool&&((num&2)==2)){ + if (event.name == "useCard") { + var bool = + game.getGlobalHistory( + "useCard", + (evt) => get.type2(evt.card) == "trick" + ).length == 0; + if ( + (bool && (num & 2) == 0) || + (!bool && (num & 2) == 2) + ) { return true; } return false; } return true; }, - content(){ - lib.skill['dddshixing'].applyChange(player); + content() { + lib.skill["dddshixing"].applyChange(player); }, - applyChange(player){ - player.removeAdditionalSkill('dddshixing'); - var bool1=game.hasPlayer(current=>!current.isDamaged()&¤t.hasSex('female')), - bool2=game.getGlobalHistory('useCard',evt=>get.type2(evt.card)=='trick').length==0; - player.storage['dddshixing']=bool1+2*bool2; - var list=[]; - if(bool1) list.push('xiangle'); - if(bool2) list.push('jiushi'); - if(!bool1&&!bool2) list.push('rezhiheng'); - player.addAdditionalSkill('dddshixing',list); + applyChange(player) { + player.removeAdditionalSkill("dddshixing"); + var bool1 = game.hasPlayer( + (current) => + !current.isDamaged() && current.hasSex("female") + ), + bool2 = + game.getGlobalHistory( + "useCard", + (evt) => get.type2(evt.card) == "trick" + ).length == 0; + player.storage["dddshixing"] = bool1 + 2 * bool2; + var list = []; + if (bool1) list.push("xiangle"); + if (bool2) list.push("jiushi"); + if (!bool1 && !bool2) list.push("rezhiheng"); + player.addAdditionalSkill("dddshixing", list); }, - derivation:['xiangle','jiushi','rezhiheng'], + derivation: ["xiangle", "jiushi", "rezhiheng"], }, - ddddanggu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return game.countPlayer(current=>current.isLinked())current.group=='qun'); + ddddanggu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + game.countPlayer((current) => current.isLinked()) < + game.countPlayer((current) => current.group == "qun") + ); }, - forced:true, - group:'ddddanggu_negative', - content(){ - 'step 0' - if(!event.loop) event.loop=0; - var num=game.countPlayer(current=>current.group=='qun')-game.countPlayer(current=>current.isLinked()); - player.chooseTarget('党锢:横置至少'+get.cnNumber(num)+'名角色',[num,Infinity],true,(card,player,target)=>{ - return !target.isLinked(); - }).set('ai',target=>{ - return get.effect(target,{name:'tiesuo'},_status.event.player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('ddddanggu',targets); - targets.forEach(i=>i.link()); + forced: true, + group: "ddddanggu_negative", + content() { + "step 0"; + if (!event.loop) event.loop = 0; + var num = + game.countPlayer((current) => current.group == "qun") - + game.countPlayer((current) => current.isLinked()); + player + .chooseTarget( + "党锢:横置至少" + get.cnNumber(num) + "名角色", + [num, Infinity], + true, + (card, player, target) => { + return !target.isLinked(); + } + ) + .set("ai", (target) => { + return get.effect( + target, + { name: "tiesuo" }, + _status.event.player + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("ddddanggu", targets); + targets.forEach((i) => i.link()); } }, - discard(){ - "step 0" - game.log(player,'进入了弃牌阶段'); - event.num=Math.max(0,player.countCards('he',card=>!player.canIgnoreHandcard(card))-player.getHandcardLimit()); - if(event.num<=0) event.finish(); - else{ - if(lib.config.show_phase_prompt){ - player.popup('弃牌阶段'); + discard() { + "step 0"; + game.log(player, "进入了弃牌阶段"); + event.num = Math.max( + 0, + player.countCards( + "he", + (card) => !player.canIgnoreHandcard(card) + ) - player.getHandcardLimit() + ); + if (event.num <= 0) event.finish(); + else { + if (lib.config.show_phase_prompt) { + player.popup("弃牌阶段"); } } - event.trigger('phaseDiscard'); - "step 1" - player.chooseToDiscard(num,true,'he'); - "step 2" - event.cards=result.cards; + event.trigger("phaseDiscard"); + ("step 1"); + player.chooseToDiscard(num, true, "he"); + ("step 2"); + event.cards = result.cards; }, - subSkill:{ - negative:{ - trigger:{global:'phaseDiscardBegin'}, - filter(event,player){ - return event.player!=player&&event.player.isLinked(); + subSkill: { + negative: { + trigger: { global: "phaseDiscardBegin" }, + filter(event, player) { + return ( + event.player != player && + event.player.isLinked() + ); }, - forced:true, - logTarget:'player', - content(){ - trigger.setContent(lib.skill['ddddanggu'].discard); + forced: true, + logTarget: "player", + content() { + trigger.setContent(lib.skill["ddddanggu"].discard); }, - } - } + }, + }, }, - dddfuzong:{ - audio:2, - zhuSkill:true, - forced:true, - trigger:{ - global:'phaseBefore', - player:'enterGame', + dddfuzong: { + audio: 2, + zhuSkill: true, + forced: true, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - if(!player.hasZhuSkill('dddfuzong')) return false; - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter(event, player) { + if (!player.hasZhuSkill("dddfuzong")) return false; + return event.name != "phase" || game.phaseNumber == 0; }, - group:'dddfuzong_discard', - content(){ - player.draw(game.countPlayer(current=>{ - return current.group=='qun'; - })); + group: "dddfuzong_discard", + content() { + player.draw( + game.countPlayer((current) => { + return current.group == "qun"; + }) + ); }, - subSkill:{ - discard:{ - trigger:{global:'die'}, - filter(event,player){ - if(!player.hasZhuSkill('dddfuzong')) return false; - return event.player.group=='qun'; + subSkill: { + discard: { + trigger: { global: "die" }, + filter(event, player) { + if (!player.hasZhuSkill("dddfuzong")) return false; + return event.player.group == "qun"; }, - zhuSkill:true, - forced:true, - logTarget:'player', - content(){ - trigger.player.discardPlayerCard(player,'he',true).set('forceDie',true); + zhuSkill: true, + forced: true, + logTarget: "player", + content() { + trigger.player + .discardPlayerCard(player, "he", true) + .set("forceDie", true); }, - } - } + }, + }, }, //夏侯玄 - dddlanghuai:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - zhuanhuanji:true, - direct:true, - content(){ - 'step 0' - if(player.hasMark('dddxuanlun_del')) event._result={bool:true}; - else player.chooseBool(get.prompt('dddlanghuai'),'展示手牌(无牌则不展示),并改为摸其中'+(!player.storage['dddlanghuai']?'包含':'缺少')+'花色数的牌').set('ai',()=>_status.event.bool).set('bool',function(){ - var list=[],cards=player.getCards('h'); - for(var i of cards){ - var suit=get.suit(i,player); - if(!lib.suit.includes(suit)) continue; - list.add(suit); - } - if(player.storage['dddlanghuai']){ - list=list.removeArray(lib.suit); - } - return list.length==2&&!player.storage['dddlanghuai']||list.length>2; - }()); - 'step 1' - if(result.bool){ - player.logSkill('dddlanghuai'); - delete player.storage['dddxuanlun_del']; - if(player.countCards('h')) player.showHandcards(); - } - else event.finish(); - 'step 2' - var list=[],cards=player.getCards('h'); - for(var i of cards){ - var suit=get.suit(i,player); - if(!lib.suit.includes(suit)) continue; + dddlanghuai: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + zhuanhuanji: true, + direct: true, + content() { + "step 0"; + if (player.hasMark("dddxuanlun_del")) + event._result = { bool: true }; + else + player + .chooseBool( + get.prompt("dddlanghuai"), + "展示手牌(无牌则不展示),并改为摸其中" + + (!player.storage["dddlanghuai"] + ? "包含" + : "缺少") + + "花色数的牌" + ) + .set("ai", () => _status.event.bool) + .set( + "bool", + (function () { + var list = [], + cards = player.getCards("h"); + for (var i of cards) { + var suit = get.suit(i, player); + if (!lib.suit.includes(suit)) continue; + list.add(suit); + } + if (player.storage["dddlanghuai"]) { + list = list.removeArray(lib.suit); + } + return ( + (list.length == 2 && + !player.storage["dddlanghuai"]) || + list.length > 2 + ); + })() + ); + ("step 1"); + if (result.bool) { + player.logSkill("dddlanghuai"); + delete player.storage["dddxuanlun_del"]; + if (player.countCards("h")) player.showHandcards(); + } else event.finish(); + ("step 2"); + var list = [], + cards = player.getCards("h"); + for (var i of cards) { + var suit = get.suit(i, player); + if (!lib.suit.includes(suit)) continue; list.add(suit); } - if(player.storage['dddlanghuai']){ - list=lib.suit.slice().removeArray(list); + if (player.storage["dddlanghuai"]) { + list = lib.suit.slice().removeArray(list); } - player.changeZhuanhuanji('dddlanghuai'); + player.changeZhuanhuanji("dddlanghuai"); trigger.changeToZero(); - if(list.length) player.draw(list.length); + if (list.length) player.draw(list.length); }, - mark:true, - intro:{ - content(storage,player){ - return '摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中'+(!storage?'包含':'缺少')+'花色数的牌。'; + mark: true, + intro: { + content(storage, player) { + return ( + "摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中" + + (!storage ? "包含" : "缺少") + + "花色数的牌。" + ); }, }, - marktext:'☯', + marktext: "☯", }, - dddxuanlun:{ - audio:2, - trigger:{player:'damageEnd'}, - content(){ + dddxuanlun: { + audio: 2, + trigger: { player: "damageEnd" }, + content() { player.draw(4); - player.addTempSkill('dddxuanlun_choose'); + player.addTempSkill("dddxuanlun_choose"); }, - ai:{ - maixie:true, - maixie_hp:true, - result:{ - effect (card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()) num=0.7; - else num=0.5; + ai: { + maixie: true, + maixie_hp: true, + result: { + effect(card, player, target) { + if (get.tag(card, "damage")) { + if ( + player.hasSkillTag("jueqing", false, target) + ) + return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; } - if(target.hp>=4) return [1,num*2.5]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (target.hp >= 4) return [1, num * 2.5]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } }, }, - threaten:0.6, + threaten: 0.6, }, - subSkill:{ - choose:{ - trigger:{global:'phaseEnd'}, - forced:true, - charlotte:true, - filter(event,player){ - if(player.hasMark('dddxuanlun_del')&&!player.countCards('h')) return false; + subSkill: { + choose: { + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + filter(event, player) { + if ( + player.hasMark("dddxuanlun_del") && + !player.countCards("h") + ) + return false; return true; }, - content(){ - 'step 0' - var choices=[]; - var choiceList=['将四张牌以任意顺序置于牌堆顶或底','删去此项和〖朗怀〗中的“可”,直到你发动〖朗怀〗']; - if(player.countCards('he')>=4||player.hasMark('dddxuanlun_del')) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(!player.hasMark('dddxuanlun_del')) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(choices.length==1&&choices[0]=='选项一') event._result={control:'选项一'}; - else player.chooseControl(choices).set('choiceList',choiceList).set('ai',()=>{ - if(!_status.event.controls.includes('选项一')) return 1; - if(!_status.event.controls.includes('选项二')) return 0; - var player=_status.event.player; - var num=0; - for(var card of player.getCards('he')){ - if(get.value(card,player)<=5) num++; - if(num>=4) break; - } - return num>=4?0:1; - }); - 'step 1' - game.log(player,'选择了','#y'+result.control); - if(result.control=='选项一'){ - var cards=player.getCards('he'); - if(cards.length<=4) event._result={bool:true,cards:cards}; - else player.chooseCard('玄论:将四张牌置于牌堆顶或牌堆底','he',true,4); - } - else{ - player.addMark('dddxuanlun_del',1,false); + content() { + "step 0"; + var choices = []; + var choiceList = [ + "将四张牌以任意顺序置于牌堆顶或底", + "删去此项和〖朗怀〗中的“可”,直到你发动〖朗怀〗", + ]; + if ( + player.countCards("he") >= 4 || + player.hasMark("dddxuanlun_del") + ) + choices.push("选项一"); + else + choiceList[0] = + '' + + choiceList[0] + + ""; + if (!player.hasMark("dddxuanlun_del")) + choices.push("选项二"); + else + choiceList[1] = + '' + + choiceList[1] + + ""; + if (choices.length == 1 && choices[0] == "选项一") + event._result = { control: "选项一" }; + else + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + if ( + !_status.event.controls.includes( + "选项一" + ) + ) + return 1; + if ( + !_status.event.controls.includes( + "选项二" + ) + ) + return 0; + var player = _status.event.player; + var num = 0; + for (var card of player.getCards( + "he" + )) { + if (get.value(card, player) <= 5) + num++; + if (num >= 4) break; + } + return num >= 4 ? 0 : 1; + }); + ("step 1"); + game.log(player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + var cards = player.getCards("he"); + if (cards.length <= 4) + event._result = { + bool: true, + cards: cards, + }; + else + player.chooseCard( + "玄论:将四张牌置于牌堆顶或牌堆底", + "he", + true, + 4 + ); + } else { + player.addMark("dddxuanlun_del", 1, false); event.finish(); } - 'step 2' - if(result.bool){ - var cards=result.cards; - event.cards=cards; - player.chooseToMove().set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]).set('prompt','玄论:将这些牌置于牌堆顶或牌堆底').set('processAI',function(list){ - var cards=list[0][1],player=_status.event.player; - var target=_status.currentPhase.next; - var att=get.sgn(get.attitude(player,target)); - var top=[]; - var judges=target.getCards('j'); - var stopped=false; - if(player!=target||!target.hasWuxie()){ - for(var i=0;i 0 + ) + break; top.unshift(cards.shift()); } } - } - var bottom; - if(!stopped){ - cards.sort(function(a,b){ - return (get.value(b,player)-get.value(a,player))*att; - }); - while(cards.length){ - if((get.value(cards[0],player)<=5)==(att>0)) break; - top.unshift(cards.shift()); - } - } - bottom=cards; - return [top,bottom]; - }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var top=result.moved[0]; - var bottom=result.moved[1]; + bottom = cards; + return [top, bottom]; + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - player.popup(get.cnNumber(top.length)+'上'+get.cnNumber(bottom.length)+'下'); - var cards=top.addArray(bottom); - player.$throw(cards.length,1000); - player.lose(cards,ui.cardPile).set('top',top).insert_index=function(event,card){ - if(event.top.includes(card)) return ui.cardPile.firstChild; + player.popup( + get.cnNumber(top.length) + + "上" + + get.cnNumber(bottom.length) + + "下" + ); + var cards = top.addArray(bottom); + player.$throw(cards.length, 1000); + player + .lose(cards, ui.cardPile) + .set("top", top).insert_index = function ( + event, + card + ) { + if (event.top.includes(card)) + return ui.cardPile.firstChild; return null; }; } - } - } - } + }, + }, + }, }, //张闿 - dddjiexing:{ - audio:2, - trigger:{ - global:['recoverBegin','useCard'], + dddjiexing: { + audio: 2, + trigger: { + global: ["recoverBegin", "useCard"], }, - filter(event,player){ - if(event.player==player) return false; - if(event.name=='recover') return player.isDamaged(); - return get.type(event.card,false)=='equip'&&event.cards.some(i=>get.position(i,true)=='o'&&player.canEquip(i,true)); + filter(event, player) { + if (event.player == player) return false; + if (event.name == "recover") return player.isDamaged(); + return ( + get.type(event.card, false) == "equip" && + event.cards.some( + (i) => + get.position(i, true) == "o" && + player.canEquip(i, true) + ) + ); }, - limited:true, - skillAnimation:true, - animationColor:'legend', - logTarget:'player', - check(event,player){ - if(get.attitude(player,event.player)>=0) return false; - if(event.name=='recover') return get.recoverEffect(event.player,player,player)= 0) return false; + if (event.name == "recover") + return ( + get.recoverEffect(event.player, player, player) < + get.recoverEffect(player, player, player) + ); + return ( + get.effect( + event.targets[0], + event.card, + player, + player + ) < get.effect(player, event.card, player, player) + ); }, - content(){ - player.awakenSkill('dddjiexing'); - player.addSkill('dddjiexing_reset'); - if(trigger.name=='recover'){ + content() { + player.awakenSkill("dddjiexing"); + player.addSkill("dddjiexing_reset"); + if (trigger.name == "recover") { trigger.cancel(); player.recover(trigger.num); - } - else{ - trigger.all_excluded=true; - trigger.targets.length=0; - var cards=trigger.cards.filterInD(); - for(var i of cards){ - if(player.canEquip(i,true)) player.equip(i); + } else { + trigger.all_excluded = true; + trigger.targets.length = 0; + var cards = trigger.cards.filterInD(); + for (var i of cards) { + if (player.canEquip(i, true)) player.equip(i); } } }, - subSkill:{ - reset:{ - audio:'dddjiexing', - trigger:{player:['recoverAfter','useCardAfter']}, - filter(event,player){ - if(event.getParent().name=='dddjiexing') return false; - if(event.name=='useCard') return get.type(event.card,false)=='equip'; + subSkill: { + reset: { + audio: "dddjiexing", + trigger: { player: ["recoverAfter", "useCardAfter"] }, + filter(event, player) { + if (event.getParent().name == "dddjiexing") + return false; + if (event.name == "useCard") + return get.type(event.card, false) == "equip"; return true; }, - forced:true, - charlotte:true, - content(){ - player.restoreSkill('dddjiexing'); - player.removeSkill('dddjiexing_reset'); - } - } - } - }, - dddbailei:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - return game.hasPlayer(current=>current.isMaxEquip(true)&¤t.countGainableCards(player,'he'))||game.hasPlayer(current=>current.getHp()==1); + forced: true, + charlotte: true, + content() { + player.restoreSkill("dddjiexing"); + player.removeSkill("dddjiexing_reset"); + }, + }, }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('dddbailei'),(card,player,target)=>{ - return target.isMaxEquip(true)&&target.countGainableCards(player,'he')||target.getHp()==1; - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - if(att>=3) return false; - if(target.hp==1) return 100; - return 1; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('dddbailei',target); - if(target.isMaxEquip(true)&&target.hp==1){ - if(target.countGainableCards(player,'he')){ - player.gainPlayerCard('拜泪:获得'+get.translation(target)+'一张牌,或点击“取消”对其造成1点伤害','he',target); + }, + dddbailei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return ( + game.hasPlayer( + (current) => + current.isMaxEquip(true) && + current.countGainableCards(player, "he") + ) || game.hasPlayer((current) => current.getHp() == 1) + ); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget( + get.prompt2("dddbailei"), + (card, player, target) => { + return ( + (target.isMaxEquip(true) && + target.countGainableCards( + player, + "he" + )) || + target.getHp() == 1 + ); } - else event._result={bool:false}; + ) + .set("ai", (target) => { + var att = get.attitude( + _status.event.player, + target + ); + if (att >= 3) return false; + if (target.hp == 1) return 100; + return 1; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dddbailei", target); + if (target.isMaxEquip(true) && target.hp == 1) { + if (target.countGainableCards(player, "he")) { + player.gainPlayerCard( + "拜泪:获得" + + get.translation(target) + + "一张牌,或点击“取消”对其造成1点伤害", + "he", + target + ); + } else event._result = { bool: false }; + } else if (target.isMaxEquip(true)) + player.gainPlayerCard( + "拜泪:获得" + + get.translation(target) + + "一张牌", + "he", + target, + true + ); + else { + event._result = { bool: false }; } - else if(target.isMaxEquip(true)) player.gainPlayerCard('拜泪:获得'+get.translation(target)+'一张牌','he',target,true); - else{ - event._result={bool:false}; - } - } - else event.finish(); - 'step 2' - if(!result.bool){ + } else event.finish(); + ("step 2"); + if (!result.bool) { player.line(target); // player.trySkillAnimate('dddbailei_animate','dddbailei_animate',player.checkShow('dddbailei')); target.damage(); game.delayx(); + } else event.finish(); + ("step 3"); + if (target.isIn()) { + event.finish(); + return; } - else event.finish(); - 'step 3' - if(target.isIn()){event.finish(); return}; - player.removeSkills('dddbailei'); + player.removeSkills("dddbailei"); + }, + subSkill: { + animate: { + skillAnimation: true, + animationColor: "fire", + }, }, - subSkill:{ - animate:{ - skillAnimation:true, - animationColor:'fire', - } - } }, }, - dynamicTranslate:{ - dddxiaheng(player){ - return '锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。'+(player.storage['dddxiaheng_del']?'':'。“若两名角色:均不为你,你失去一点体力上限;为同一名角色,你失去一点体力;然后若以此法对包括你在内三名不同的角色造成伤害,删除双引号里的描述内容”'); + dynamicTranslate: { + dddxiaheng(player) { + return ( + "锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。" + + (player.storage["dddxiaheng_del"] + ? "" + : "。“若两名角色:均不为你,你失去一点体力上限;为同一名角色,你失去一点体力;然后若以此法对包括你在内三名不同的角色造成伤害,删除双引号里的描述内容”") + ); }, - dddshichao(player){ - return '锁定技,准备阶段,你选择一名手牌数为全场第('+(1+player.countMark('dddshichao'))+')大的角色,将手牌数调整至与其相等且至多等于主公的体力上限;其于你的下回合开始前对你造成伤害时,其可防止之,然后令()内的数字+1。'; + dddshichao(player) { + return ( + "锁定技,准备阶段,你选择一名手牌数为全场第(" + + (1 + player.countMark("dddshichao")) + + ")大的角色,将手牌数调整至与其相等且至多等于主公的体力上限;其于你的下回合开始前对你造成伤害时,其可防止之,然后令()内的数字+1。" + ); }, - dddlanghuai(player){ - return '转换技,摸牌阶段,你'+(player.hasMark('dddxuanlun_del')?'':'可')+'展示手牌(无牌则不展示),并改为摸其中'+(!player.storage['dddlanghuai']?'包含':'缺少')+'花色数的牌。'; + dddlanghuai(player) { + return ( + "转换技,摸牌阶段,你" + + (player.hasMark("dddxuanlun_del") ? "" : "可") + + "展示手牌(无牌则不展示),并改为摸其中" + + (!player.storage["dddlanghuai"] ? "包含" : "缺少") + + "花色数的牌。" + ); }, - dddxuanlun(player){ - var deleted=player.hasMark('dddxuanlun_del'); - return '你受到伤害后,你可摸四张牌;你发动此技能的回合结束时,'+(deleted?'你':'须选择一项:')+'将四张牌以任意顺序置于牌堆顶或底'+(deleted?'。':';或删去此项和“朗怀”中的“可”,直到你发动“朗怀”。'); + dddxuanlun(player) { + var deleted = player.hasMark("dddxuanlun_del"); + return ( + "你受到伤害后,你可摸四张牌;你发动此技能的回合结束时," + + (deleted ? "你" : "须选择一项:") + + "将四张牌以任意顺序置于牌堆顶或底" + + (deleted + ? "。" + : ";或删去此项和“朗怀”中的“可”,直到你发动“朗怀”。") + ); }, - ddddiedang(player){ - if(player.storage.ddddiedang) return '出牌阶段限一次,你可以弃置三张牌,然后摸一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“弃置”和“摸”。' - return '出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃置”。'; + ddddiedang(player) { + if (player.storage.ddddiedang) + return "出牌阶段限一次,你可以弃置三张牌,然后摸一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“弃置”和“摸”。"; + return "出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃置”。"; }, - dddyeshen(player){ - return '一名角色的结束阶段,你可以亮出牌堆底'+get.cnNumber(3-player.countMark('dddyeshen'))+'张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。'; + dddyeshen(player) { + return ( + "一名角色的结束阶段,你可以亮出牌堆底" + + get.cnNumber(3 - player.countMark("dddyeshen")) + + "张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。" + ); }, }, - translate:{ - ddd_handang:"韩当", - dddxianxi:"险袭", - dddxianxi_info:"出牌阶段,你使用【杀】时可无视距离额外指定任意名角色为目标;此【杀】结算后,若额外指定的目标中有未受到此【杀】伤害的,你须选择一项:弃置X张牌对其各造成1点伤害;或摸X张牌并失去1点体力(X为未受到此【杀】伤害的目标数)。", - ddd_wuzhi:"吴质", - dddlingyong:"灵涌", - dddlingyong_info:"一名角色跳过其的阶段时,你可进行判定。若结果不为【杀】,则你可以使用判定牌,然后重复此流程。", - dddxuxiao:"虚孝", - dddxuxiao_info:"当有黑色基本牌因弃置而进入弃牌堆后,你可将其当做【兵粮寸断】置于一名角色的判定区,然后其摸两张牌。", - ddd_xujing:"许靖", - dddxuyu:"虚誉", - dddxuyu_info:"当你使用牌结算结束后,你可以摸一张牌。若如此做,当你于本回合使用下一张牌结算结束后,你弃置一张牌。", - dddshijian:"实荐", - dddshijian_info:"其他角色于其出牌阶段使用的第二张牌结算结束后,你可以交给其一张牌。若如此做,其本回合使用的下一张牌指定第一个目标时,你选择一项:1.令此牌额外结算一次;2.你摸一张牌。", - ddd_caomao:"曹髦", - dddtaisi:"太思", - dddtaisi_info:"一名角色的回合结束时,若你的体力值于本回合内发生过变化,则你可以令一名角色获得一张于本回合内进入弃牌堆的牌。然后若该角色于本回合内对你造成过伤害,则你摸两张牌。", - dddquche:"驱车", - dddquche_info:"限定技。出牌阶段,你可依次执行大括号内的流程至多X次(X为你的体力上限):{[⒈将一张牌交给一名其他角色]+[将一张黑色牌当做【杀】使用(不计入次数限制)]}。你每执行一个中括号内的选项,本回合内至其他角色的距离便-1。", - dddqianlong:"潜龙", - dddqianlong_info:"主公技,锁定技。当你因执行奖惩而摸牌或弃置牌时,取消之;当你杀死一名角色后,你摸三张牌。", - ddd_xinxianying:"辛宪英", - ddddongcha:"洞察", - ddddongcha_info:"其他角色的回合开始时,你可以令你和其依次将一张手牌置于你的武将牌上,称为“鉴”。若如此做,本回合结束时,你与其依次选择获得一张“鉴”。", - dddzhijie:"智解", - dddzhijie_info:"你可以将两张颜色相同的“鉴”当做【闪】使用,或将两张颜色不同的“鉴”当做【无懈可击】使用;然后你摸两张牌。", - ddd_xianglang:'向朗', - dddqiahua:"恰化", - dddqiahua_info:"其他角色的回合开始时,你可明置X张手牌(X为其体力值),然后其于本回合内获得〖恂恂〗。", - dddfusi:"腹笥", - dddfusi_info:"锁定技。①你的明置手牌不计入手牌上限。②其他角色需要使用牌时,可以改为使用你的明置手牌(需经过你的确认)。③你的回合内,若你的手牌均为明置手牌,则其他角色不能使用各自的手牌。", - dddfusi_global:"腹笥", - dddtuoji:"拓籍", - dddtuoji_info:"其他角色因〖腹笥〗而使用你的牌后,若你的手牌均为明置手牌,则你可以摸三张牌。", - visible_dddxianglang:"明", - ddd_yujin:'于禁', - dddzhengjun:'整军', - dddzhengjun_info:'出牌阶段内每项各限一次。当有角色的手牌数/体力值/装备区内牌数变化后,若其的对应数值与你相同,则你可以执行对应的选项。体力值:你令其回复或失去1点体力;手牌数:你令其摸或弃置一张牌;装备区内牌数:你移动其的一张装备牌。', - ddd_liuye:'刘晔', - dddchashi:'察势', - dddchashi_info:'其他角色的出牌阶段开始时,你可弃置一张牌A。当其于本阶段内使用下一张牌结算结束后,若此牌与A花色或类型相同,你与其各摸一张牌。', - dddqice:'齐策', - dddqice_info:'准备阶段开始时,你可以摸两张牌,然后你的〖齐策〗失效直到你使用锦囊牌。', - ddd_baosanniang:'鲍三娘', - dddzhilian:'枝连', - dddzhilian_info:'一名角色的回合结束时,若本回合仅有你与另一名男性角色使用或打出过牌,则你可以令你与其各摸一张牌或各弃置一张牌,然后你获得本回合内进入弃牌堆的所有【杀】。', - dddjijian:'赍剑', - dddjijian_info:'出牌阶段限一次。你可以展示一张【杀】并交给一名其他男性角色,然后其展示至多两张颜色相同的【杀】或普通锦囊牌,你与其依次视为使用一张其展示的牌(不能重复使用同一张展示牌)。', - ddd_zhenji:'甄姬', - dddmiaoxing:'淼形', - dddmiaoxing_info:'锁定技。①分发起始手牌时,你额外获得两份起始手牌,然后将其中的两份移出游戏,称为“水相”。②摸牌阶段结束后,你须将至少一份“水相”调整至与你的手牌数相等。', - dddfushi:'浮世', - dddfushi_info:'每回合限一次。当你使用或打出基本牌结算结束后,你可以用所有手牌交换一份“水相”,然后你可令一名男性角色选择是否用其所有手牌交换一份“水相”。', - ddd_zhaoang:'赵昂', - dddfenji:'奋计', - dddfenji_info:'摸牌/弃牌阶段开始时,你可视为使用一张未以此法使用过的普通锦囊牌,然后将此阶段摸牌/弃牌数改为此牌造成的伤害值/此牌的目标数。', - ddd_zhouchu:'周处', - dddxiaheng:'侠横', - dddxiaheng_info:'锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。“若这两名角色:均不为你,你减1点体力上限;为同一名角色,你失去〖侠横〗;然后若你以此法对三名不同的角色造成过伤害,删除该技能双引号里的描述。”', - ddd_liuba:'刘巴', - dddfengzheng:'丰政', - dddfengzheng_info:'①每名角色的出牌阶段限一次。其可将点数之和为13的任意张手牌当一张【无中生有】使用。②一轮游戏开始时,你可观看并分配牌堆顶的X张牌(X为上一轮发动过〖丰政〗的角色数),若有角色以此法得到的牌数多于两张,你失去〖丰政〗。', - dddyulv:'玉律', - dddyulv_info:'锁定技。①游戏开始时,你摸一张牌。将一张手牌置于武将牌上,称为“玉律”。②当有与“玉律”牌点数相同的牌进入弃牌堆后,你令当前回合角色摸一张牌或弃置一张牌。然后若本次为此回合使用的第二次〖玉律②〗,你用一张手牌交换“玉律”牌(若你没有手牌则先摸一张牌)。', - ddd_jianshuo:'蹇硕', - dddfenye:'分野', - dddfenye_info:'出牌阶段限一次。你可与一名其他角色拼点,其余角色于此次拼点中可加入其中一方并扣置一张手牌作为其拼点牌,本次拼点判断胜负的条件改为比较双方点数均值。然后拼点胜方角色依次可视为对一名不同的拼点败方角色使用【杀】。', - dddshichao:'逝潮', - dddshichao_info:'锁定技。准备阶段,你选择一名手牌数为全场第(1)大的角色,将手牌数调整至与其相等且至多等于主公的体力上限。然后当其于你的下回合开始前对你造成伤害时,其可防止之,令你〖逝潮〗的()内的数字+1。', - ddd_guanning:'管宁', - dddyouxue:'游学', - dddyouxue_info:'锁定技。一轮游戏开始时,你将场上的“游学”标记交给一名其他角色(若场上没有“游学”,你获得“游学”),然后摸X张牌(X为本次失去“游学”的角色至获得“游学”的角色的距离)。', - dddchengjing:'承经', - dddchengjing_info:'①一名角色的回合结束时,若其有“游学”,你将其于此回合内使用的最后一张{非转化且对应的实体牌数为1且均位于弃牌堆中}的基本牌或普通锦囊牌对应的所有实体牌置于武将牌上,称为“经”(若你此前有“经”,你先将这些“经”置入弃牌堆)。②出牌阶段限一次,你可以将一张牌当“经”使用,然后可以将该牌交给有“游学”的角色的下家。', - ddd_dingfeng:'丁奉', - dddduanbing:'短兵', - dddduanbing_info:'①出牌阶段,你可将一张黑色非锦囊牌当一张【兵粮寸断】置入自己的判定区,摸两张牌,然后视为使用一张无视距离限制的【杀】。②当你使用【杀】对目标角色造成伤害后,若你判定区里有【兵粮寸断】,你可将【兵粮寸断】移至目标角色的判定区。', - ddd_kebineng:'轲比能', - dddxiaoxing:'枭行', - dddxiaoxing_info:'锁定技。①你的初始手牌,攻击范围和手牌上限+3。②当你进入濒死状态时,你失去〖枭行〗。③当你获得〖枭行〗后,你摸三张牌。', - dddlangzhi:'狼志', - dddlangzhi_info:'结束阶段,你可展示你攻击范围内的所有角色各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。', - dddfuyi:'附义', - dddfuyi_both:'〖枭行〗和〖狼志〗', - dddfuyi_info:'主公技,锁定技。①群势力角色使用【杀】的次数上限+1。②当一名群势力角色杀死角色后,其可以弃置两张牌,令你获得你武将牌上的一个技能。', - ddd_caoshuang:'曹爽', - ddd_xuelingyun:'薛灵芸', - ddd_liuhong:'刘宏', - ddd_xiahouxuan:'夏侯玄', - ddd_zhangkai:'张闿', - dddzhuanshe:'专摄', - dddzhuanshe_info:'其他角色的出牌阶段开始时,你可将一张手牌正面朝上交给该角色,则当其在此回合内使用与之名称相同的基本牌或普通锦囊牌时,你可无视距离限制为之额外选择一个目标;此回合结束时,若其未使用与之名称相同的牌,你可以对其造成1点伤害。', - dddweiqiu:'危秋', - dddweiqiu_info:'锁定技。一名角色回复体力前,若你没有手牌,改为令你摸一张牌。', - dddlianer:'涟洏', - dddlianer_info:'当你使用红色牌结算后,你可以获得之,然后你只能使用点数小于此牌的牌直到回合结束。', - dddanzhi:'暗织', - dddanzhi_info:'一名角色的回合开始时,若上一张被使用或打出的牌为黑色,你可以指定一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效。', - dddshixing:'失兴', - dddshixing_info:'锁定技。若有未受伤的女性角色,你视为拥有〖享乐〗;若当前回合没有锦囊牌被使用,你视为拥有〖酒诗〗;若你没有上述技能,你视为拥有〖制衡〗。', - ddddanggu:'党锢', - ddddanggu_info:'锁定技。①结束阶段,你横置任意名角色的武将牌,直到场上已横置的角色数不少于X(X为群势力角色数)。②其他角色的弃牌阶段,若其处于连环状态,其装备区里的牌视为手牌。', - dddfuzong:'覆宗', - dddfuzong_info:'主公技,锁定技。①游戏开始时,你摸等同于场上群势力角色数的牌。②一名群势力角色死亡时,其弃置你的一张牌。', - dddlanghuai:'朗怀', - dddlanghuai_info:'转换技。摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中:阴,包含花色数的牌;阳,缺少花色数的牌。', - dddxuanlun:'玄论', - dddxuanlun_info:'当你受到伤害后,你可摸四张牌,然后该回合结束时,你选择一项:1.将四张牌以任意顺序置于牌堆顶或底;2.删去此项和〖郎怀〗中的“可”直到你发动〖郎怀〗。', - dddjiexing:'劫行', - dddjiexing_info:'限定技。其他角色回复体力时,你可改为你回复等量体力;其他角色使用装备牌时,你可改为将此牌置入你的装备区。当你不以此法回复体力后或使用装备牌后,重置此技能。', - dddbailei:'拜泪', - dddbailei_info:'准备阶段,你可以选择一项:1.获得装备区牌数唯一最多的角色的一张牌;2.对一名体力值为1的角色造成1点伤害,若其因此死亡,你失去此技能。', - ddd_liangxi:'梁习', - dddtongyu:'仝御', - dddtongyu_info:'出牌阶段限一次,你可以将任意张花色不同的牌当做【五谷丰登】使用,且你为此牌选择结算方向,此牌的亮出牌数+X(X为此牌对应的实体牌数量)。此牌的所有目标角色在被指定目标后选择一项:⒈本回合不能再使用或打出手牌。⒉令此【五谷丰登】对其无效。此【五谷丰登】的多余展示牌置入弃牌堆前,你可以令一名选择了选项二的角色获得这些牌。', - ddd_wangkanglvkai:'王伉吕凯', - dddbingjian:'并肩', - dddbingjian_info:'每回合限两次。你可以将手牌数调整至2(至少调整一张),视为使用或打出一张【杀】或【闪】。若你:因此摸牌,则你可以令一名其他角色摸等量的牌;因此弃牌,则你可以弃置一名其他角色等量的牌。', - ddd_sunliang:'孙亮', - ddddiedang:'迭宕', - ddddiedang_info:'出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃”。', - dddanliu:'暗流', - dddanliu_info:'结束阶段,你可以与一名其他角色依次观看并选择对方的一张手牌,然后交换这两张牌。若这两张牌颜色相同,则你可以逾期交换这两张牌,且:若此牌为红色,则你回复1点体力;若此牌为黑色,则其摸两张牌。', - dddguiying:'归萤', - dddguiying_info:'主公技。准备阶段,其他吴势力角色可依次展示其一张手牌,然后将其点数最大的一张牌交给你,然后其可以获得场上点数最小的一张牌。', - ddd_qianzhao:'牵招', - dddyuanzhen:'远振', - dddyuanzhen_info:'锁定技。当你使用牌指定其他角色为唯一目标后,若你至其距离不为1,你令其选择一项:1.弃置一张牌;2.令你摸一张牌。', - dddzhishu:'制戍', - dddzhishu_info:'出牌阶段开始时,你可以移动场上的一张装备牌,然后以此法失去牌的角色视为对以此法装备区被置入牌的角色使用一张【过河拆桥】。', - ddd_zhangmiao:'张邈', - dddxiaxing:'侠行', - dddxiaxing_info:'①每轮限一次。一名角色处于濒死状态时/回合开始时,你可以将一张牌置于牌堆顶,视为其使用一张【桃】/【酒】。若你没有“侠”标记,你获得“侠”。②你可以移去“侠”,视为使用一张【杀】或【闪】。', - ddd_zhangcheng:'张承', - dddjuxian:'聚贤', - dddjuxian_info:'出牌阶段每项各限一次。你可以展示一张牌,然后:1.将其置于牌堆顶,然后获得其他角色的一张牌并展示之;2.将此牌交给一名其他角色,然后摸一张牌并展示之。若你以此法展示的两张牌颜色不同,此技能本回合失效。', - dddjungui:'隽轨', - dddjungui_info:'结束阶段,你可以令一名角色摸两张牌,然后其展示所有手牌,你选择一个不大于X的值。若Y大于0,你令其弃置Y张花色各不同的手牌(X为你于本回合使用过的牌的花色数,Y为其手牌中包含的花色数-X)。', - ddd_liuchong:'刘宠', - dddjinggou:'精彀', - dddjinggou_info:'锁定技。当你使用武器牌结算结束后,若你的攻击范围为全场最大,你对一名其他角色造成1点伤害。', - dddmoyan:'末焱', - dddmoyan_info:'一轮游戏开始时,你可以亮出牌堆顶三张牌,令一名角色选择获得其中至少一张牌,然后当你于本轮受到伤害时,若其手牌数不大于X,此伤害+1(X为其本次获得的牌数)。', - ddd_luoxian:'罗宪', - dddshilie:'示烈', - visible_dddshilie:'明', - dddshilie_info:'每回合限一次。当你需要使用一张【杀】或【闪】时,你可以明置任意点数之和不小于X的手牌,视为你使用之。若本次明置的牌点数等于X,你摸等同于本次明置的牌数的牌(X为你与当前回合角色的体力值之和)。', - ddd_lie:'李娥', - dddyeshen:'冶身', - dddyeshen_info:'一名角色的结束阶段,你可以亮出牌堆底三张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。', - dddqiaoduan:'巧锻', - dddqiaoduan_info:'每回合限一次。当有角色:重置后,你可以令至多X名角色各摸一张牌;横置后,你可以将X张牌置于牌堆底,并令一名角色回复1点体力(X为横置角色数)。', + translate: { + ddd_handang: "韩当", + dddxianxi: "险袭", + dddxianxi_info: + "出牌阶段,你使用【杀】时可无视距离额外指定任意名角色为目标;此【杀】结算后,若额外指定的目标中有未受到此【杀】伤害的,你须选择一项:弃置X张牌对其各造成1点伤害;或摸X张牌并失去1点体力(X为未受到此【杀】伤害的目标数)。", + ddd_wuzhi: "吴质", + dddlingyong: "灵涌", + dddlingyong_info: + "一名角色跳过其的阶段时,你可进行判定。若结果不为【杀】,则你可以使用判定牌,然后重复此流程。", + dddxuxiao: "虚孝", + dddxuxiao_info: + "当有黑色基本牌因弃置而进入弃牌堆后,你可将其当做【兵粮寸断】置于一名角色的判定区,然后其摸两张牌。", + ddd_xujing: "许靖", + dddxuyu: "虚誉", + dddxuyu_info: + "当你使用牌结算结束后,你可以摸一张牌。若如此做,当你于本回合使用下一张牌结算结束后,你弃置一张牌。", + dddshijian: "实荐", + dddshijian_info: + "其他角色于其出牌阶段使用的第二张牌结算结束后,你可以交给其一张牌。若如此做,其本回合使用的下一张牌指定第一个目标时,你选择一项:1.令此牌额外结算一次;2.你摸一张牌。", + ddd_caomao: "曹髦", + dddtaisi: "太思", + dddtaisi_info: + "一名角色的回合结束时,若你的体力值于本回合内发生过变化,则你可以令一名角色获得一张于本回合内进入弃牌堆的牌。然后若该角色于本回合内对你造成过伤害,则你摸两张牌。", + dddquche: "驱车", + dddquche_info: + "限定技。出牌阶段,你可依次执行大括号内的流程至多X次(X为你的体力上限):{[⒈将一张牌交给一名其他角色]+[将一张黑色牌当做【杀】使用(不计入次数限制)]}。你每执行一个中括号内的选项,本回合内至其他角色的距离便-1。", + dddqianlong: "潜龙", + dddqianlong_info: + "主公技,锁定技。当你因执行奖惩而摸牌或弃置牌时,取消之;当你杀死一名角色后,你摸三张牌。", + ddd_xinxianying: "辛宪英", + ddddongcha: "洞察", + ddddongcha_info: + "其他角色的回合开始时,你可以令你和其依次将一张手牌置于你的武将牌上,称为“鉴”。若如此做,本回合结束时,你与其依次选择获得一张“鉴”。", + dddzhijie: "智解", + dddzhijie_info: + "你可以将两张颜色相同的“鉴”当做【闪】使用,或将两张颜色不同的“鉴”当做【无懈可击】使用;然后你摸两张牌。", + ddd_xianglang: "向朗", + dddqiahua: "恰化", + dddqiahua_info: + "其他角色的回合开始时,你可明置X张手牌(X为其体力值),然后其于本回合内获得〖恂恂〗。", + dddfusi: "腹笥", + dddfusi_info: + "锁定技。①你的明置手牌不计入手牌上限。②其他角色需要使用牌时,可以改为使用你的明置手牌(需经过你的确认)。③你的回合内,若你的手牌均为明置手牌,则其他角色不能使用各自的手牌。", + dddfusi_global: "腹笥", + dddtuoji: "拓籍", + dddtuoji_info: + "其他角色因〖腹笥〗而使用你的牌后,若你的手牌均为明置手牌,则你可以摸三张牌。", + visible_dddxianglang: "明", + ddd_yujin: "于禁", + dddzhengjun: "整军", + dddzhengjun_info: + "出牌阶段内每项各限一次。当有角色的手牌数/体力值/装备区内牌数变化后,若其的对应数值与你相同,则你可以执行对应的选项。体力值:你令其回复或失去1点体力;手牌数:你令其摸或弃置一张牌;装备区内牌数:你移动其的一张装备牌。", + ddd_liuye: "刘晔", + dddchashi: "察势", + dddchashi_info: + "其他角色的出牌阶段开始时,你可弃置一张牌A。当其于本阶段内使用下一张牌结算结束后,若此牌与A花色或类型相同,你与其各摸一张牌。", + dddqice: "齐策", + dddqice_info: + "准备阶段开始时,你可以摸两张牌,然后你的〖齐策〗失效直到你使用锦囊牌。", + ddd_baosanniang: "鲍三娘", + dddzhilian: "枝连", + dddzhilian_info: + "一名角色的回合结束时,若本回合仅有你与另一名男性角色使用或打出过牌,则你可以令你与其各摸一张牌或各弃置一张牌,然后你获得本回合内进入弃牌堆的所有【杀】。", + dddjijian: "赍剑", + dddjijian_info: + "出牌阶段限一次。你可以展示一张【杀】并交给一名其他男性角色,然后其展示至多两张颜色相同的【杀】或普通锦囊牌,你与其依次视为使用一张其展示的牌(不能重复使用同一张展示牌)。", + ddd_zhenji: "甄姬", + dddmiaoxing: "淼形", + dddmiaoxing_info: + "锁定技。①分发起始手牌时,你额外获得两份起始手牌,然后将其中的两份移出游戏,称为“水相”。②摸牌阶段结束后,你须将至少一份“水相”调整至与你的手牌数相等。", + dddfushi: "浮世", + dddfushi_info: + "每回合限一次。当你使用或打出基本牌结算结束后,你可以用所有手牌交换一份“水相”,然后你可令一名男性角色选择是否用其所有手牌交换一份“水相”。", + ddd_zhaoang: "赵昂", + dddfenji: "奋计", + dddfenji_info: + "摸牌/弃牌阶段开始时,你可视为使用一张未以此法使用过的普通锦囊牌,然后将此阶段摸牌/弃牌数改为此牌造成的伤害值/此牌的目标数。", + ddd_zhouchu: "周处", + dddxiaheng: "侠横", + dddxiaheng_info: + "锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。“若这两名角色:均不为你,你减1点体力上限;为同一名角色,你失去〖侠横〗;然后若你以此法对三名不同的角色造成过伤害,删除该技能双引号里的描述。”", + ddd_liuba: "刘巴", + dddfengzheng: "丰政", + dddfengzheng_info: + "①每名角色的出牌阶段限一次。其可将点数之和为13的任意张手牌当一张【无中生有】使用。②一轮游戏开始时,你可观看并分配牌堆顶的X张牌(X为上一轮发动过〖丰政〗的角色数),若有角色以此法得到的牌数多于两张,你失去〖丰政〗。", + dddyulv: "玉律", + dddyulv_info: + "锁定技。①游戏开始时,你摸一张牌。将一张手牌置于武将牌上,称为“玉律”。②当有与“玉律”牌点数相同的牌进入弃牌堆后,你令当前回合角色摸一张牌或弃置一张牌。然后若本次为此回合使用的第二次〖玉律②〗,你用一张手牌交换“玉律”牌(若你没有手牌则先摸一张牌)。", + ddd_jianshuo: "蹇硕", + dddfenye: "分野", + dddfenye_info: + "出牌阶段限一次。你可与一名其他角色拼点,其余角色于此次拼点中可加入其中一方并扣置一张手牌作为其拼点牌,本次拼点判断胜负的条件改为比较双方点数均值。然后拼点胜方角色依次可视为对一名不同的拼点败方角色使用【杀】。", + dddshichao: "逝潮", + dddshichao_info: + "锁定技。准备阶段,你选择一名手牌数为全场第(1)大的角色,将手牌数调整至与其相等且至多等于主公的体力上限。然后当其于你的下回合开始前对你造成伤害时,其可防止之,令你〖逝潮〗的()内的数字+1。", + ddd_guanning: "管宁", + dddyouxue: "游学", + dddyouxue_info: + "锁定技。一轮游戏开始时,你将场上的“游学”标记交给一名其他角色(若场上没有“游学”,你获得“游学”),然后摸X张牌(X为本次失去“游学”的角色至获得“游学”的角色的距离)。", + dddchengjing: "承经", + dddchengjing_info: + "①一名角色的回合结束时,若其有“游学”,你将其于此回合内使用的最后一张{非转化且对应的实体牌数为1且均位于弃牌堆中}的基本牌或普通锦囊牌对应的所有实体牌置于武将牌上,称为“经”(若你此前有“经”,你先将这些“经”置入弃牌堆)。②出牌阶段限一次,你可以将一张牌当“经”使用,然后可以将该牌交给有“游学”的角色的下家。", + ddd_dingfeng: "丁奉", + dddduanbing: "短兵", + dddduanbing_info: + "①出牌阶段,你可将一张黑色非锦囊牌当一张【兵粮寸断】置入自己的判定区,摸两张牌,然后视为使用一张无视距离限制的【杀】。②当你使用【杀】对目标角色造成伤害后,若你判定区里有【兵粮寸断】,你可将【兵粮寸断】移至目标角色的判定区。", + ddd_kebineng: "轲比能", + dddxiaoxing: "枭行", + dddxiaoxing_info: + "锁定技。①你的初始手牌,攻击范围和手牌上限+3。②当你进入濒死状态时,你失去〖枭行〗。③当你获得〖枭行〗后,你摸三张牌。", + dddlangzhi: "狼志", + dddlangzhi_info: + "结束阶段,你可展示你攻击范围内的所有角色各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。", + dddfuyi: "附义", + dddfuyi_both: "〖枭行〗和〖狼志〗", + dddfuyi_info: + "主公技,锁定技。①群势力角色使用【杀】的次数上限+1。②当一名群势力角色杀死角色后,其可以弃置两张牌,令你获得你武将牌上的一个技能。", + ddd_caoshuang: "曹爽", + ddd_xuelingyun: "薛灵芸", + ddd_liuhong: "刘宏", + ddd_xiahouxuan: "夏侯玄", + ddd_zhangkai: "张闿", + dddzhuanshe: "专摄", + dddzhuanshe_info: + "其他角色的出牌阶段开始时,你可将一张手牌正面朝上交给该角色,则当其在此回合内使用与之名称相同的基本牌或普通锦囊牌时,你可无视距离限制为之额外选择一个目标;此回合结束时,若其未使用与之名称相同的牌,你可以对其造成1点伤害。", + dddweiqiu: "危秋", + dddweiqiu_info: + "锁定技。一名角色回复体力前,若你没有手牌,改为令你摸一张牌。", + dddlianer: "涟洏", + dddlianer_info: + "当你使用红色牌结算后,你可以获得之,然后你只能使用点数小于此牌的牌直到回合结束。", + dddanzhi: "暗织", + dddanzhi_info: + "一名角色的回合开始时,若上一张被使用或打出的牌为黑色,你可以指定一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效。", + dddshixing: "失兴", + dddshixing_info: + "锁定技。若有未受伤的女性角色,你视为拥有〖享乐〗;若当前回合没有锦囊牌被使用,你视为拥有〖酒诗〗;若你没有上述技能,你视为拥有〖制衡〗。", + ddddanggu: "党锢", + ddddanggu_info: + "锁定技。①结束阶段,你横置任意名角色的武将牌,直到场上已横置的角色数不少于X(X为群势力角色数)。②其他角色的弃牌阶段,若其处于连环状态,其装备区里的牌视为手牌。", + dddfuzong: "覆宗", + dddfuzong_info: + "主公技,锁定技。①游戏开始时,你摸等同于场上群势力角色数的牌。②一名群势力角色死亡时,其弃置你的一张牌。", + dddlanghuai: "朗怀", + dddlanghuai_info: + "转换技。摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中:阴,包含花色数的牌;阳,缺少花色数的牌。", + dddxuanlun: "玄论", + dddxuanlun_info: + "当你受到伤害后,你可摸四张牌,然后该回合结束时,你选择一项:1.将四张牌以任意顺序置于牌堆顶或底;2.删去此项和〖郎怀〗中的“可”直到你发动〖郎怀〗。", + dddjiexing: "劫行", + dddjiexing_info: + "限定技。其他角色回复体力时,你可改为你回复等量体力;其他角色使用装备牌时,你可改为将此牌置入你的装备区。当你不以此法回复体力后或使用装备牌后,重置此技能。", + dddbailei: "拜泪", + dddbailei_info: + "准备阶段,你可以选择一项:1.获得装备区牌数唯一最多的角色的一张牌;2.对一名体力值为1的角色造成1点伤害,若其因此死亡,你失去此技能。", + ddd_liangxi: "梁习", + dddtongyu: "仝御", + dddtongyu_info: + "出牌阶段限一次,你可以将任意张花色不同的牌当做【五谷丰登】使用,且你为此牌选择结算方向,此牌的亮出牌数+X(X为此牌对应的实体牌数量)。此牌的所有目标角色在被指定目标后选择一项:⒈本回合不能再使用或打出手牌。⒉令此【五谷丰登】对其无效。此【五谷丰登】的多余展示牌置入弃牌堆前,你可以令一名选择了选项二的角色获得这些牌。", + ddd_wangkanglvkai: "王伉吕凯", + dddbingjian: "并肩", + dddbingjian_info: + "每回合限两次。你可以将手牌数调整至2(至少调整一张),视为使用或打出一张【杀】或【闪】。若你:因此摸牌,则你可以令一名其他角色摸等量的牌;因此弃牌,则你可以弃置一名其他角色等量的牌。", + ddd_sunliang: "孙亮", + ddddiedang: "迭宕", + ddddiedang_info: + "出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃”。", + dddanliu: "暗流", + dddanliu_info: + "结束阶段,你可以与一名其他角色依次观看并选择对方的一张手牌,然后交换这两张牌。若这两张牌颜色相同,则你可以逾期交换这两张牌,且:若此牌为红色,则你回复1点体力;若此牌为黑色,则其摸两张牌。", + dddguiying: "归萤", + dddguiying_info: + "主公技。准备阶段,其他吴势力角色可依次展示其一张手牌,然后将其点数最大的一张牌交给你,然后其可以获得场上点数最小的一张牌。", + ddd_qianzhao: "牵招", + dddyuanzhen: "远振", + dddyuanzhen_info: + "锁定技。当你使用牌指定其他角色为唯一目标后,若你至其距离不为1,你令其选择一项:1.弃置一张牌;2.令你摸一张牌。", + dddzhishu: "制戍", + dddzhishu_info: + "出牌阶段开始时,你可以移动场上的一张装备牌,然后以此法失去牌的角色视为对以此法装备区被置入牌的角色使用一张【过河拆桥】。", + ddd_zhangmiao: "张邈", + dddxiaxing: "侠行", + dddxiaxing_info: + "①每轮限一次。一名角色处于濒死状态时/回合开始时,你可以将一张牌置于牌堆顶,视为其使用一张【桃】/【酒】。若你没有“侠”标记,你获得“侠”。②你可以移去“侠”,视为使用一张【杀】或【闪】。", + ddd_zhangcheng: "张承", + dddjuxian: "聚贤", + dddjuxian_info: + "出牌阶段每项各限一次。你可以展示一张牌,然后:1.将其置于牌堆顶,然后获得其他角色的一张牌并展示之;2.将此牌交给一名其他角色,然后摸一张牌并展示之。若你以此法展示的两张牌颜色不同,此技能本回合失效。", + dddjungui: "隽轨", + dddjungui_info: + "结束阶段,你可以令一名角色摸两张牌,然后其展示所有手牌,你选择一个不大于X的值。若Y大于0,你令其弃置Y张花色各不同的手牌(X为你于本回合使用过的牌的花色数,Y为其手牌中包含的花色数-X)。", + ddd_liuchong: "刘宠", + dddjinggou: "精彀", + dddjinggou_info: + "锁定技。当你使用武器牌结算结束后,若你的攻击范围为全场最大,你对一名其他角色造成1点伤害。", + dddmoyan: "末焱", + dddmoyan_info: + "一轮游戏开始时,你可以亮出牌堆顶三张牌,令一名角色选择获得其中至少一张牌,然后当你于本轮受到伤害时,若其手牌数不大于X,此伤害+1(X为其本次获得的牌数)。", + ddd_luoxian: "罗宪", + dddshilie: "示烈", + visible_dddshilie: "明", + dddshilie_info: + "每回合限一次。当你需要使用一张【杀】或【闪】时,你可以明置任意点数之和不小于X的手牌,视为你使用之。若本次明置的牌点数等于X,你摸等同于本次明置的牌数的牌(X为你与当前回合角色的体力值之和)。", + ddd_lie: "李娥", + dddyeshen: "冶身", + dddyeshen_info: + "一名角色的结束阶段,你可以亮出牌堆底三张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。", + dddqiaoduan: "巧锻", + dddqiaoduan_info: + "每回合限一次。当有角色:重置后,你可以令至多X名角色各摸一张牌;横置后,你可以将X张牌置于牌堆底,并令一名角色回复1点体力(X为横置角色数)。", }, }; }); diff --git a/character/diy.js b/character/diy.js index 13b6ca6a4..ba8ff8fc0 100755 --- a/character/diy.js +++ b/character/diy.js @@ -1,2241 +1,2769 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'diy', - connect:true, - connectBanned:['diy_tianyu','diy_yangyi','diy_lukang','ns_huamulan','ns_yuji','ns_duangui','ns_liuzhang','key_yuu'], - character:{ - noname:["female","key",3,["noname_zhuyuan","noname_duocai"]], - sp_key_yuri:['female','qun',4,['mubing','ziqu','diaoling'],['border:key']], - key_lucia:['female','key','2/3',['lucia_duqu','lucia_zhenren']], - key_kyousuke:['male','key',4,['nk_shekong','key_huanjie']], - key_yuri:['female','key',3,['yuri_xingdong','key_huanjie','yuri_wangxi'],['zhu']], - key_haruko:['female','key',4,['haruko_haofang','haruko_zhuishi']], - key_umi:['female','key',3,['umi_chaofan','umi_lunhui','umi_qihuan']], - key_umi2:['female','key',3,[],['unseen']], - key_rei:['male','key',4,['xiandeng','shulv','xisheng']], - key_komari:['female','key',3,['komari_tiankou','komari_xueshang']], - key_yukine:['female','key',3,['yukine_wenzhou']], - key_yusa:['female','key',3,['yusa_yanyi','yusa_misa','dualside'],['dualside:key_misa']], - key_misa:['female','key',3,['misa_yehuo','misa_yusa','dualside'],['unseen']], - key_masato:['male','key','4/8',['masato_baoquan']], - key_iwasawa:['female','key',3,['iwasawa_yinhang','iwasawa_mysong']], - key_kengo:['male','key',4,['kengo_weishang','kengo_guidui']], - key_yoshino:['male','key',4,['yoshino_jueyi']], - key_yui:['female','key',3,['yui_jiang','yui_lieyin','yui_takaramono']], - key_tsumugi:['female','key',3,['tsumugi_mugyu','tsumugi_huilang']], - key_saya:['female','key',3,['saya_shouji','saya_powei']], - key_harukakanata:['female','key',3,['haruka_shuangche']], - key_inari:['female','key',2,['inari_baiwei','inari_huhun']], - key_shiina:['female','key',3,['shiina_qingshen','shiina_feiyan']], - key_sunohara:['double','key','3/3/2',['sunohara_chengshuang','sunohara_tiaoyin','sunohara_jianren']], - key_rin:['female','key',3,['rin_baoqiu']], - key_sasami:['female','key',3,['sasami_miaobian']], - key_akane:['female','key',3,['akane_jugu','akane_quanqing','akane_yifu'],['zhu']], - key_doruji:['female','key',16,['doruji_feiqu']], - key_yuiko:['female','key',3,['yuiko_fenglun','yuiko_dilve']], - key_riki:['double','key',3,['riki_spwenji','riki_nvzhuang','riki_mengzhong']], - key_hisako:['female','key',3,['hisako_yinbao','hisako_zhuanyun']], - key_hinata:['male','key',4,['hinata_qiulve','hinata_ehou']], - key_noda:['male','key',4,['noda_fengcheng','noda_xunxin']], - key_tomoya:['male','key',4,['tomoya_shangxian','tomoya_wangjin']], - key_nagisa:['female','key',3,['nagisa_tiandu','nagisa_fuxin']], - key_ayato:['male','key',3,['ayato_jianshen','ayato_zonghuan']], - key_ao:['female','key',3,['ao_xishi','ao_kuihun','ao_shixin']], - key_yuzuru:['male','key',5,['yuzuru_wuxin','yuzuru_deyi']], - sp_key_kanade:['female','key',3,['kanade_mapo','kanade_benzhan']], - key_mio:['female','key',3,['mio_tuifu','mio_tishen']], - key_midori:['female','key',3,['midori_nonghuan','midori_tishen']], - key_kyoko:['female','key',3,['kyoko_juwu','kyoko_zhengyi']], - key_shizuru:['female','key',3,['shizuru_nianli','shizuru_benzhan']], - key_shiorimiyuki:['female','key',3,['shiorimiyuki_banyin','shiorimiyuki_tingxian']], - key_miki:['female','key',3,['miki_shenqiang','miki_huanmeng','miki_zhiluo']], - key_shiori:['female','key','2/3',['shiori_huijuan']], - key_kaori:['female','key','3/4',['kaori_siyuan']], - key_akiko:['female','key',3,['akiko_dongcha']], - key_abyusa:['female','key',3,['abyusa_jueqing','abyusa_dunying']], - key_godan:['male','key',6,['godan_yuanyi','godan_feiqu','godan_xiaoyuan']], - key_yuu:['male','key',3,['yuu_lveduo']], - key_ryoichi:['male','key',4,['ryoichi_baoyi','ryoichi_tuipi']], - key_kotori:['female','key',3,['kotori_yumo','kotori_huazhan']], - key_jojiro:['male','key',4,['jojiro_shensu','jojiro_shunying']], - key_shiroha:['female','key',3,['shiroha_yuzhao','shiroha_guying','shiroha_jiezhao']], - key_shizuku:['female','key',3,['shizuku_sizhi','shizuku_biyi','shizuku_sanhua']], - key_hiroto:['male','key',3,['hiroto_huyu','hiroto_tuolao']], - key_sakuya:['male','key',3,['youlong','luanfeng','sakuya_junbu']], - key_youta:['male','key',4,[]], - key_rumi:['female','key','3/4',['rumi_shuwu']], - key_chihaya:['female','key',3,['chihaya_liewu','chihaya_youfeng']], - key_yukito:['male','key',4,['yukito_kongwu','yukito_yaxiang']], - key_crow:['male','key',4,[],['unseen']], - key_asara:['female','key',3,['asara_shelu','asara_yingwei']], - key_kotomi:['female','key',3,['kotomi_qinji','kotomi_chuanxiang']], - key_mia:['female','key',3,['mia_shihui','mia_qianmeng']], - key_kano:['female','key',3,['kano_liezhen','kano_poyu']], - db_key_liyingxia:['female','shu',3,['liyingxia_sanli','liyingxia_zhenjun','liyingxia_wumai'],['doublegroup:shu:key']], - key_erika:['female','key','3/3/2',['erika_shisong','erika_yousheng']], - key_satomi:['female','key',3,['satomi_luodao','satomi_daohai']], - key_iriya:['female','key',3,['iriya_yinji','iriya_haozhi']], - key_fuuko:['female','key',3,['fuuko_xingdiao','fuuko_chuanyuan']], + name: "diy", + connect: true, + connectBanned: [ + "diy_tianyu", + "diy_yangyi", + "diy_lukang", + "ns_huamulan", + "ns_yuji", + "ns_duangui", + "ns_liuzhang", + "key_yuu", + ], + character: { + noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"]], + sp_key_yuri: ["female", "qun", 4, ["mubing", "ziqu", "diaoling"], ["border:key"]], + key_lucia: ["female", "key", "2/3", ["lucia_duqu", "lucia_zhenren"]], + key_kyousuke: ["male", "key", 4, ["nk_shekong", "key_huanjie"]], + key_yuri: ["female", "key", 3, ["yuri_xingdong", "key_huanjie", "yuri_wangxi"], ["zhu"]], + key_haruko: ["female", "key", 4, ["haruko_haofang", "haruko_zhuishi"]], + key_umi: ["female", "key", 3, ["umi_chaofan", "umi_lunhui", "umi_qihuan"]], + key_umi2: ["female", "key", 3, [], ["unseen"]], + key_rei: ["male", "key", 4, ["xiandeng", "shulv", "xisheng"]], + key_komari: ["female", "key", 3, ["komari_tiankou", "komari_xueshang"]], + key_yukine: ["female", "key", 3, ["yukine_wenzhou"]], + key_yusa: ["female", "key", 3, ["yusa_yanyi", "yusa_misa", "dualside"], ["dualside:key_misa"]], + key_misa: ["female", "key", 3, ["misa_yehuo", "misa_yusa", "dualside"], ["unseen"]], + key_masato: ["male", "key", "4/8", ["masato_baoquan"]], + key_iwasawa: ["female", "key", 3, ["iwasawa_yinhang", "iwasawa_mysong"]], + key_kengo: ["male", "key", 4, ["kengo_weishang", "kengo_guidui"]], + key_yoshino: ["male", "key", 4, ["yoshino_jueyi"]], + key_yui: ["female", "key", 3, ["yui_jiang", "yui_lieyin", "yui_takaramono"]], + key_tsumugi: ["female", "key", 3, ["tsumugi_mugyu", "tsumugi_huilang"]], + key_saya: ["female", "key", 3, ["saya_shouji", "saya_powei"]], + key_harukakanata: ["female", "key", 3, ["haruka_shuangche"]], + key_inari: ["female", "key", 2, ["inari_baiwei", "inari_huhun"]], + key_shiina: ["female", "key", 3, ["shiina_qingshen", "shiina_feiyan"]], + key_sunohara: [ + "double", + "key", + "3/3/2", + ["sunohara_chengshuang", "sunohara_tiaoyin", "sunohara_jianren"], + ], + key_rin: ["female", "key", 3, ["rin_baoqiu"]], + key_sasami: ["female", "key", 3, ["sasami_miaobian"]], + key_akane: ["female", "key", 3, ["akane_jugu", "akane_quanqing", "akane_yifu"], ["zhu"]], + key_doruji: ["female", "key", 16, ["doruji_feiqu"]], + key_yuiko: ["female", "key", 3, ["yuiko_fenglun", "yuiko_dilve"]], + key_riki: ["double", "key", 3, ["riki_spwenji", "riki_nvzhuang", "riki_mengzhong"]], + key_hisako: ["female", "key", 3, ["hisako_yinbao", "hisako_zhuanyun"]], + key_hinata: ["male", "key", 4, ["hinata_qiulve", "hinata_ehou"]], + key_noda: ["male", "key", 4, ["noda_fengcheng", "noda_xunxin"]], + key_tomoya: ["male", "key", 4, ["tomoya_shangxian", "tomoya_wangjin"]], + key_nagisa: ["female", "key", 3, ["nagisa_tiandu", "nagisa_fuxin"]], + key_ayato: ["male", "key", 3, ["ayato_jianshen", "ayato_zonghuan"]], + key_ao: ["female", "key", 3, ["ao_xishi", "ao_kuihun", "ao_shixin"]], + key_yuzuru: ["male", "key", 5, ["yuzuru_wuxin", "yuzuru_deyi"]], + sp_key_kanade: ["female", "key", 3, ["kanade_mapo", "kanade_benzhan"]], + key_mio: ["female", "key", 3, ["mio_tuifu", "mio_tishen"]], + key_midori: ["female", "key", 3, ["midori_nonghuan", "midori_tishen"]], + key_kyoko: ["female", "key", 3, ["kyoko_juwu", "kyoko_zhengyi"]], + key_shizuru: ["female", "key", 3, ["shizuru_nianli", "shizuru_benzhan"]], + key_shiorimiyuki: ["female", "key", 3, ["shiorimiyuki_banyin", "shiorimiyuki_tingxian"]], + key_miki: ["female", "key", 3, ["miki_shenqiang", "miki_huanmeng", "miki_zhiluo"]], + key_shiori: ["female", "key", "2/3", ["shiori_huijuan"]], + key_kaori: ["female", "key", "3/4", ["kaori_siyuan"]], + key_akiko: ["female", "key", 3, ["akiko_dongcha"]], + key_abyusa: ["female", "key", 3, ["abyusa_jueqing", "abyusa_dunying"]], + key_godan: ["male", "key", 6, ["godan_yuanyi", "godan_feiqu", "godan_xiaoyuan"]], + key_yuu: ["male", "key", 3, ["yuu_lveduo"]], + key_ryoichi: ["male", "key", 4, ["ryoichi_baoyi", "ryoichi_tuipi"]], + key_kotori: ["female", "key", 3, ["kotori_yumo", "kotori_huazhan"]], + key_jojiro: ["male", "key", 4, ["jojiro_shensu", "jojiro_shunying"]], + key_shiroha: ["female", "key", 3, ["shiroha_yuzhao", "shiroha_guying", "shiroha_jiezhao"]], + key_shizuku: ["female", "key", 3, ["shizuku_sizhi", "shizuku_biyi", "shizuku_sanhua"]], + key_hiroto: ["male", "key", 3, ["hiroto_huyu", "hiroto_tuolao"]], + key_sakuya: ["male", "key", 3, ["youlong", "luanfeng", "sakuya_junbu"]], + key_youta: ["male", "key", 4, []], + key_rumi: ["female", "key", "3/4", ["rumi_shuwu"]], + key_chihaya: ["female", "key", 3, ["chihaya_liewu", "chihaya_youfeng"]], + key_yukito: ["male", "key", 4, ["yukito_kongwu", "yukito_yaxiang"]], + key_crow: ["male", "key", 4, [], ["unseen"]], + key_asara: ["female", "key", 3, ["asara_shelu", "asara_yingwei"]], + key_kotomi: ["female", "key", 3, ["kotomi_qinji", "kotomi_chuanxiang"]], + key_mia: ["female", "key", 3, ["mia_shihui", "mia_qianmeng"]], + key_kano: ["female", "key", 3, ["kano_liezhen", "kano_poyu"]], + db_key_liyingxia: [ + "female", + "shu", + 3, + ["liyingxia_sanli", "liyingxia_zhenjun", "liyingxia_wumai"], + ["doublegroup:shu:key"], + ], + key_erika: ["female", "key", "3/3/2", ["erika_shisong", "erika_yousheng"]], + key_satomi: ["female", "key", 3, ["satomi_luodao", "satomi_daohai"]], + key_iriya: ["female", "key", 3, ["iriya_yinji", "iriya_haozhi"]], + key_fuuko: ["female", "key", 3, ["fuuko_xingdiao", "fuuko_chuanyuan"]], - key_kud:['female','key',3,['kud_qiaoshou','kud_buhui']], - key_misuzu:['female','key',3,['misuzu_hengzhou','misuzu_nongyin','misuzu_zhongxing']], - key_kamome:['female','key',3,['kamome_yangfan','kamome_huanmeng','kamome_jieban']], - key_nao:['female','key',3,['nao_duyin','nao_wanxin','nao_shouqing']], - key_yuuki:['female','key',3,['yuuki_yicha']], - key_kotarou:['male','key',3,['kotarou_rewrite','kotarou_aurora']], - key_tenzen:['male','key',4,['tenzen_fenghuan','tenzen_retianquan']], - key_kyouko:['female','key',3,['kyouko_rongzhu','kyouko_gongmian']], - key_kyou:['female','key',3,['kyou_zhidian','kyou_duanfa']], - key_seira:['female','key',3,['seira_xinghui','seira_yuanying']], - key_kiyu:['female','key',3,['kiyu_yuling','kiyu_rexianyu']], - key_tomoyo:['female','key',4,['tomoyo_wuwei','tomoyo_zhengfeng']], - key_minagi:['female','key',3,['minagi_peiquan','minagi_huanliu']], - key_michiru:['female','key',3,['michiru_sheyuan']], + key_kud: ["female", "key", 3, ["kud_qiaoshou", "kud_buhui"]], + key_misuzu: ["female", "key", 3, ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"]], + key_kamome: ["female", "key", 3, ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"]], + key_nao: ["female", "key", 3, ["nao_duyin", "nao_wanxin", "nao_shouqing"]], + key_yuuki: ["female", "key", 3, ["yuuki_yicha"]], + key_kotarou: ["male", "key", 3, ["kotarou_rewrite", "kotarou_aurora"]], + key_tenzen: ["male", "key", 4, ["tenzen_fenghuan", "tenzen_retianquan"]], + key_kyouko: ["female", "key", 3, ["kyouko_rongzhu", "kyouko_gongmian"]], + key_kyou: ["female", "key", 3, ["kyou_zhidian", "kyou_duanfa"]], + key_seira: ["female", "key", 3, ["seira_xinghui", "seira_yuanying"]], + key_kiyu: ["female", "key", 3, ["kiyu_yuling", "kiyu_rexianyu"]], + key_tomoyo: ["female", "key", 4, ["tomoyo_wuwei", "tomoyo_zhengfeng"]], + key_minagi: ["female", "key", 3, ["minagi_peiquan", "minagi_huanliu"]], + key_michiru: ["female", "key", 3, ["michiru_sheyuan"]], - ns_huangchengyan:['male','shu',3,['nslongyue','nszhenyin']], - ns_sunchensunjun:['male','wu',5,['nsxianhai','nsxingchu']], - ns_yuanxi:['male','qun',4,['nsshengyan','nsdaizhan']], - ns_caoshuang:['male','wei',4,['nsjiquan','nsfuwei']], - ns_sunyi:['male','wu',4,['nsguolie']], - ns_huangwudie:['female','shu',4,['nsdiewu','nslingying','nspojian']], - ns_chentai:['male','wei',4,['nsweiyuan','nsjuxian']], - ns_zhangning:['female','qun',3,['nsfuzhou','nsguidao','nstaiping']], - ns_yanghu:['male','jin',3,['nsbizhao','nsqingde','nsyidi'],['hiddenSkill']], - ns_zanghong:['male','qun',4,['nsshimeng']], - ns_ruanji:['male','wei',3,['nsshizui','nsxiaoye']], - ns_limi:['male','jin',3,['nstuilun']], - ns_zhonglimu:['male','wu',4,['nskuanhuai','nsdingbian']], - prp_zhugeliang:['male','shu',3,['nsxingyun','nshanlang']], + ns_huangchengyan: ["male", "shu", 3, ["nslongyue", "nszhenyin"]], + ns_sunchensunjun: ["male", "wu", 5, ["nsxianhai", "nsxingchu"]], + ns_yuanxi: ["male", "qun", 4, ["nsshengyan", "nsdaizhan"]], + ns_caoshuang: ["male", "wei", 4, ["nsjiquan", "nsfuwei"]], + ns_sunyi: ["male", "wu", 4, ["nsguolie"]], + ns_huangwudie: ["female", "shu", 4, ["nsdiewu", "nslingying", "nspojian"]], + ns_chentai: ["male", "wei", 4, ["nsweiyuan", "nsjuxian"]], + ns_zhangning: ["female", "qun", 3, ["nsfuzhou", "nsguidao", "nstaiping"]], + ns_yanghu: ["male", "jin", 3, ["nsbizhao", "nsqingde", "nsyidi"], ["hiddenSkill"]], + ns_zanghong: ["male", "qun", 4, ["nsshimeng"]], + ns_ruanji: ["male", "wei", 3, ["nsshizui", "nsxiaoye"]], + ns_limi: ["male", "jin", 3, ["nstuilun"]], + ns_zhonglimu: ["male", "wu", 4, ["nskuanhuai", "nsdingbian"]], + prp_zhugeliang: ["male", "shu", 3, ["nsxingyun", "nshanlang"]], - ns_zhangwei:['female','shu',3,['nsqiyue','nsxuezhu']], - diy_wenyang:['male','wei','4/6',['lvli','choujue']], + ns_zhangwei: ["female", "shu", 3, ["nsqiyue", "nsxuezhu"]], + diy_wenyang: ["male", "wei", "4/6", ["lvli", "choujue"]], // diy_caocao:['male','wei',4,['xicai','diyjianxiong','hujia']], - diy_hanlong:['male','wei',4,['siji','ciqiu']], - diy_feishi:['male','shu',3,['nsshuaiyan','moshou']], - diy_liuyan:['male','qun',3,['juedao','geju']], + diy_hanlong: ["male", "wei", 4, ["siji", "ciqiu"]], + diy_feishi: ["male", "shu", 3, ["nsshuaiyan", "moshou"]], + diy_liuyan: ["male", "qun", 3, ["juedao", "geju"]], // diy_luxun:['male','wu',3,['shaoying','zonghuo']], - diy_yuji:['male','qun',3,['diyguhuo','diychanyuan']], + diy_yuji: ["male", "qun", 3, ["diyguhuo", "diychanyuan"]], // diy_zhouyu:['male','wu',3,['jieyan','honglian']], // diy_zhouyu:['male','wu',3,['xiongzi','yaliang']], - diy_caiwenji:['female','qun',3,['beige','guihan']], - diy_lukang:['male','wu',4,['luweiyan','qianxun']], + diy_caiwenji: ["female", "qun", 3, ["beige", "guihan"]], + diy_lukang: ["male", "wu", 4, ["luweiyan", "qianxun"]], // diy_xuhuang:['male','wei',4,['diyduanliang']], // diy_dianwei:['male','wei',4,['diyqiangxi']], // diy_huangzhong:['male','shu',4,['liegong','fuli']], // diy_weiyan:['male','shu',4,['diykuanggu']], - diy_zhenji:['female','wei',3,['diy_jiaoxia','yiesheng']], + diy_zhenji: ["female", "wei", 3, ["diy_jiaoxia", "yiesheng"]], // diy_menghuo:['male','shu',4,['huoshou','zaiqix']], //re_huangyueying:['female','shu',3,['rejizhi','qicai']], - diy_liufu:['male','wei',3,['zhucheng','duoqi']], - diy_xizhenxihong:['male','shu',4,['fuchou','jinyan']], - diy_liuzan:['male','wu',4,['kangyin']], - diy_zaozhirenjun:['male','wei',3,['liangce','jianbi','diyjuntun']], - diy_yangyi:['male','shu',3,['choudu','liduan']], - diy_tianyu:['male','wei',4,['chezhen','youzhan']], + diy_liufu: ["male", "wei", 3, ["zhucheng", "duoqi"]], + diy_xizhenxihong: ["male", "shu", 4, ["fuchou", "jinyan"]], + diy_liuzan: ["male", "wu", 4, ["kangyin"]], + diy_zaozhirenjun: ["male", "wei", 3, ["liangce", "jianbi", "diyjuntun"]], + diy_yangyi: ["male", "shu", 3, ["choudu", "liduan"]], + diy_tianyu: ["male", "wei", 4, ["chezhen", "youzhan"]], - ns_zuoci:['male','qun',3,['nsxinsheng','nsdunxing']], - ns_lvzhi:['female','qun',3,['nsnongquan','nsdufu']], - ns_wangyun:["male","qun",4,["liangji","jugong","chengmou"]], - ns_nanhua:["male","qun",3,["nshuanxian","nstaiping_nh","nsshoudao"]], - ns_nanhua_left:["male","qun",2,[],['unseen']], - ns_nanhua_right:["female","qun",2,[],['unseen']], - ns_huamulan:['female','qun',3,['nscongjun','xiaoji','gongji']], - ns_huangzu:['male','qun',4,['nsjihui','nsmouyun']], - ns_jinke:['male','qun',4,['nspinmin','nsshishou']], - ns_yanliang:['male','qun',4,['nsduijue','nsshuangxiong','dualside'],['dualside:ns_wenchou']], - ns_wenchou:['male','qun',2,['nsguanyong','dualside'],['unseen']], + ns_zuoci: ["male", "qun", 3, ["nsxinsheng", "nsdunxing"]], + ns_lvzhi: ["female", "qun", 3, ["nsnongquan", "nsdufu"]], + ns_wangyun: ["male", "qun", 4, ["liangji", "jugong", "chengmou"]], + ns_nanhua: ["male", "qun", 3, ["nshuanxian", "nstaiping_nh", "nsshoudao"]], + ns_nanhua_left: ["male", "qun", 2, [], ["unseen"]], + ns_nanhua_right: ["female", "qun", 2, [], ["unseen"]], + ns_huamulan: ["female", "qun", 3, ["nscongjun", "xiaoji", "gongji"]], + ns_huangzu: ["male", "qun", 4, ["nsjihui", "nsmouyun"]], + ns_jinke: ["male", "qun", 4, ["nspinmin", "nsshishou"]], + ns_yanliang: [ + "male", + "qun", + 4, + ["nsduijue", "nsshuangxiong", "dualside"], + ["dualside:ns_wenchou"], + ], + ns_wenchou: ["male", "qun", 2, ["nsguanyong", "dualside"], ["unseen"]], - ns_caocao:['male','wei',4,['nscaiyi','nsgefa','nshaoling']], - ns_caocaosp:['male','qun',3,['nsjianxiong','nsxionglue']], - ns_zhugeliang:['male','shu',3,['nsguanxing','kongcheng','nsyunxing']], - ns_wangyue:['male','qun',4,['nsjianshu','nscangjian']], - ns_yuji:['male','qun',3,['nsyaowang','nshuanhuo']], - ns_xinxianying:['female','wei',3,['nsdongcha','nscaijian','nsgongjian']], - ns_guanlu:['male','wei',3,['nsbugua','nstuiyan','nstianji']], - ns_simazhao:['male','wei',3,['nszhaoxin','nsxiuxin','nsshijun']], - ns_sunjian:['male','wu',4,['nswulie','nshunyou','nscangxi']], + ns_caocao: ["male", "wei", 4, ["nscaiyi", "nsgefa", "nshaoling"]], + ns_caocaosp: ["male", "qun", 3, ["nsjianxiong", "nsxionglue"]], + ns_zhugeliang: ["male", "shu", 3, ["nsguanxing", "kongcheng", "nsyunxing"]], + ns_wangyue: ["male", "qun", 4, ["nsjianshu", "nscangjian"]], + ns_yuji: ["male", "qun", 3, ["nsyaowang", "nshuanhuo"]], + ns_xinxianying: ["female", "wei", 3, ["nsdongcha", "nscaijian", "nsgongjian"]], + ns_guanlu: ["male", "wei", 3, ["nsbugua", "nstuiyan", "nstianji"]], + ns_simazhao: ["male", "wei", 3, ["nszhaoxin", "nsxiuxin", "nsshijun"]], + ns_sunjian: ["male", "wu", 4, ["nswulie", "nshunyou", "nscangxi"]], - ns_duangui:['male','qun',3,['nscuanquan','nsjianning','nschangshi','nsbaquan']], - ns_zhangbao:['male','qun',3,['nsfuhuo','nswangfeng']], - ns_masu:['male','shu',3,['nstanbing','nsxinzhan']], - ns_zhangxiu:['male','qun',4,['nsbaiming','nsfuge']], - ns_lvmeng:['male','wu',3,['nsqinxue','nsbaiyi']], - ns_shenpei:['male','qun',3,['nshunji','shibei']], + ns_duangui: ["male", "qun", 3, ["nscuanquan", "nsjianning", "nschangshi", "nsbaquan"]], + ns_zhangbao: ["male", "qun", 3, ["nsfuhuo", "nswangfeng"]], + ns_masu: ["male", "shu", 3, ["nstanbing", "nsxinzhan"]], + ns_zhangxiu: ["male", "qun", 4, ["nsbaiming", "nsfuge"]], + ns_lvmeng: ["male", "wu", 3, ["nsqinxue", "nsbaiyi"]], + ns_shenpei: ["male", "qun", 3, ["nshunji", "shibei"]], - ns_yujisp:['male','qun',3,['nsguhuo']], - ns_yangyi:['male','shu',3,['nsjuanli','nsyuanchou']], - ns_liuzhang:['male','qun',3,['nsanruo','nsxunshan','nskaicheng']], + ns_yujisp: ["male", "qun", 3, ["nsguhuo"]], + ns_yangyi: ["male", "shu", 3, ["nsjuanli", "nsyuanchou"]], + ns_liuzhang: ["male", "qun", 3, ["nsanruo", "nsxunshan", "nskaicheng"]], // ns_zhaoyun:['male','qun',3,[]], // ns_lvmeng:['male','qun',3,[]], // ns_zhaoyunshen:['male','qun',3,[]], // ns_lisu:['male','qun',3,[]], // ns_sunhao:['male','qun',3,[]], - ns_xinnanhua:['male','qun',3,['ns_xiandao','ns_xiuzheng','ns_chuanshu']], - ns_caimao:['male','qun',4,['nsdingzhou']], - ns_luyusheng:['female','wu',3,['nshuaishuang','nsfengli']], - ns_chengpu:['male','wu',4,['decadelihuo','decadechunlao']], - ns_sundeng:['male','wu',4,['xinkuangbi']], - ns_duji:['male','wei',3,['xinfu_andong','xinyingshi']], - old_majun:["male","wei",3,["xinfu_jingxie1","xinfu_qiaosi"]], - ns_mengyou:['male','qun',4,['nsmanzhi']], + ns_xinnanhua: ["male", "qun", 3, ["ns_xiandao", "ns_xiuzheng", "ns_chuanshu"]], + ns_caimao: ["male", "qun", 4, ["nsdingzhou"]], + ns_luyusheng: ["female", "wu", 3, ["nshuaishuang", "nsfengli"]], + ns_chengpu: ["male", "wu", 4, ["decadelihuo", "decadechunlao"]], + ns_sundeng: ["male", "wu", 4, ["xinkuangbi"]], + ns_duji: ["male", "wei", 3, ["xinfu_andong", "xinyingshi"]], + old_majun: ["male", "wei", 3, ["xinfu_jingxie1", "xinfu_qiaosi"]], + ns_mengyou: ["male", "qun", 4, ["nsmanzhi"]], - old_jiakui:['male','wei',4,['tongqu','xinwanlan']], - ol_guohuai:['male','wei',3,['rejingce']], - junk_zhangrang:['male','qun',3,['junktaoluan'],['sex:male_castrated']], - old_bulianshi:['female','wu',3,['anxu','zhuiyi']], - ol_maliang:['male','shu',3,['zishu','xinyingyuan']], - junk_liubei:['male','shu',4,['junkrende','jijiang'],['zhu']], - junk_huangyueying:['female','shu',3,['junkjizhi','junkqicai']], - junk_lidian:['male','wei',3,['xunxun','junkwangxi']], - junk_duanwei:['male','qun',4,['junklangmie']], - junk_xuyou:["male","qun",3,["nzry_chenglve","junkshicai","nzry_cunmu"]], - junk_zhangjiao:['male','shen',3,['yizhao','junksijun','tianjie'],['qun','die_audio:shen_zhangjiao']], - junk_guanyu:['male','shu',4,['olsbfumeng','olsbguidao']], + old_jiakui: ["male", "wei", 4, ["tongqu", "xinwanlan"]], + ol_guohuai: ["male", "wei", 3, ["rejingce"]], + junk_zhangrang: ["male", "qun", 3, ["junktaoluan"], ["sex:male_castrated"]], + old_bulianshi: ["female", "wu", 3, ["anxu", "zhuiyi"]], + ol_maliang: ["male", "shu", 3, ["zishu", "xinyingyuan"]], + junk_liubei: ["male", "shu", 4, ["junkrende", "jijiang"], ["zhu"]], + junk_huangyueying: ["female", "shu", 3, ["junkjizhi", "junkqicai"]], + junk_lidian: ["male", "wei", 3, ["xunxun", "junkwangxi"]], + junk_duanwei: ["male", "qun", 4, ["junklangmie"]], + junk_xuyou: ["male", "qun", 3, ["nzry_chenglve", "junkshicai", "nzry_cunmu"]], + junk_zhangjiao: [ + "male", + "shen", + 3, + ["yizhao", "junksijun", "tianjie"], + ["qun", "die_audio:shen_zhangjiao"], + ], + junk_guanyu: ["male", "shu", 4, ["olsbfumeng", "olsbguidao"]], }, - characterFilter:{ - key_jojiro(mode){ - return mode=='chess'||mode=='tafang'; + characterFilter: { + key_jojiro(mode) { + return mode == "chess" || mode == "tafang"; }, - key_yuu(mode){ - return mode=='identity'||mode=='doudizhu'||mode=='single'||(mode=='versus'&&_status.mode!='standard'&&_status.mode!='three'); + key_yuu(mode) { + return ( + mode == "identity" || + mode == "doudizhu" || + mode == "single" || + (mode == "versus" && _status.mode != "standard" && _status.mode != "three") + ); }, - key_tomoya(mode){ - return mode!='chess'&&mode!='tafang'&&mode!='stone'; + key_tomoya(mode) { + return mode != "chess" && mode != "tafang" && mode != "stone"; }, - key_sunohara(mode){ - return mode!='guozhan'; + key_sunohara(mode) { + return mode != "guozhan"; }, - ns_duangui(mode){ - return mode=='identity'&&_status.mode=='normal'; + ns_duangui(mode) { + return mode == "identity" && _status.mode == "normal"; }, - diy_liuyan(mode){ - return mode!='chess'&&mode!='tafang'; - } - }, - characterSort:{ - diy:{ - diy_yijiang:["key_kud","key_misuzu","key_kamome","key_nao", - "ns_huangchengyan","ns_sunchensunjun","ns_yuanxi","ns_caoshuang"], - diy_yijiang2:["key_yuuki","key_tenzen","key_kyouko","key_kotarou","key_kyou", - "ns_chentai","ns_huangwudie","ns_sunyi","ns_zhangning","ns_yanghu"], - diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu','prp_zhugeliang','key_seira','key_kiyu','key_tomoyo','key_minagi','key_michiru'], - diy_tieba:["ns_zuoci","ns_lvzhi","ns_wangyun","ns_nanhua","ns_nanhua_left","ns_nanhua_right","ns_huamulan","ns_huangzu","ns_jinke","ns_yanliang","ns_wenchou","ns_caocao","ns_caocaosp","ns_zhugeliang","ns_wangyue","ns_yuji","ns_xinxianying","ns_guanlu","ns_simazhao","ns_sunjian","ns_duangui","ns_zhangbao","ns_masu","ns_zhangxiu","ns_lvmeng","ns_shenpei","ns_yujisp","ns_yangyi","ns_liuzhang","ns_xinnanhua","ns_luyusheng"], - diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu",'ns_sundeng','ns_duji','ns_mengyou'], - diy_xushi:["diy_feishi","diy_hanlong","diy_liufu","diy_liuyan","diy_liuzan","diy_tianyu","diy_xizhenxihong","diy_yangyi","diy_zaozhirenjun"], - diy_default:["diy_yuji","diy_caiwenji","diy_lukang","diy_zhenji","old_majun"], - diy_noname:['noname'], - diy_key:["key_lucia","key_kyousuke","key_yuri","key_haruko","key_umi","key_rei","key_komari","key_yukine","key_yusa","key_misa","key_masato","key_iwasawa","key_kengo","key_yoshino","key_yui","key_tsumugi","key_saya","key_harukakanata","key_inari","key_shiina","key_sunohara","key_rin","key_sasami","key_akane","key_doruji","key_yuiko","key_riki","key_hisako","key_hinata","key_noda","key_tomoya","key_nagisa","key_ayato","key_ao","key_yuzuru","sp_key_kanade","key_mio","key_midori","key_kyoko","key_shizuru","key_shiorimiyuki","key_miki","key_shiori","key_kaori","sp_key_yuri","key_akiko","key_abyusa","key_godan","key_yuu","key_ryoichi","key_kotori","key_jojiro","key_shiroha","key_shizuku","key_hiroto","key_sakuya","key_youta","key_rumi","key_chihaya","key_yukito","key_asara","key_kotomi","key_mia","key_kano","db_key_liyingxia","key_erika","key_satomi","key_iriya","key_fuuko"], - diy_trashbin:['junk_guanyu','junk_zhangjiao','old_jiakui','ol_guohuai','junk_zhangrang','old_bulianshi','ol_maliang','junk_liubei','junk_huangyueying','junk_lidian','junk_duanwei','junk_xuyou'], + diy_liuyan(mode) { + return mode != "chess" && mode != "tafang"; }, }, - characterIntro:{ - noname:'无名杀的吉祥物。
    画师:空城
    技能设计:李木子', - diy_hanlong:'韩龙,魏国刺客。他孤身一人深入到了长城外的敌人领地,成功刺杀了敌方首领轲比能,瓦解了鲜卑民族,曹魏边境因此获得了几十年的安稳。', - ns_zhangwei:'血骑教习·张葳,三国杀集换式卡牌游戏《阵面对决》中的帝畿系列卡牌。游卡桌游官方原创的三国时期女性角色。', - diy_feishi:'字公举,生卒年不详,益州犍为郡南安县(今四川省乐山市)人。刘璋占据益州时,以费诗为绵竹县县令。刘备进攻刘璋夺取益州,费诗举城而降,后受拜督军从事,转任牂牁郡太守,再为州前部司马。', - diy_lukang:'字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。', - diy_liufu:'字元颖,沛国相县(今安徽濉溪县西北)人。东汉末年名守。在汉末避难于淮南,说服袁术将戚寄和秦翊率部投奔曹操,曹操大悦,使司徒辟其为掾属。', - diy_xizhenxihong:'习珍,襄阳人。三国时蜀汉将领。先主刘备时曾任零陵北部都尉,加裨将军。建安二十四年,关羽率荆州大军攻打樊城,唯有习珍据城不降。被困月余,直到箭尽粮绝,拔剑自刎而死。习宏,生卒年不详,习珍之弟。曾在东吴入侵蜀汉时建议哥哥习珍伪降,约樊胄举兵。习珍死后,弟弟习宏落在东吴,有问必不答,终身不为孙权发一言。', - diy_zaozhirenjun:'枣祗,生卒年月不详,东汉末年颍川阳翟(今河南省禹州市)人。曾任东阿令、羽林监、屯田都尉、陈留太守等职。任峻(?—204年),字伯达,河南郡中牟县人。曹操每次出征,任峻通常在后方补给军队。后来发生饥荒,枣祗建议实施屯田,任峻被任命为典农中郎将,招募百姓在许下屯田,结果连年丰收,积谷足以装满全部粮仓。', - diy_yangyi:'字威公,襄阳(今湖北襄阳)人,三国时期蜀汉政治家。最初,为荆州刺史傅群的主簿,后投奔关羽,任为功曹。羽遣其至成都,大受刘备赞赏,擢为尚书。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。亮生前定蒋琬继己任,仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。', - diy_tianyu:'字国让,渔阳雍奴(今天津市武清区东北)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。', - chentai:'陈泰(200年~260年),字玄伯,颍川许昌(今河南省许昌市)人。三国时期魏国名将,司空陈群之子。陈泰早年起家员外散骑侍郎,其父陈群死后袭封颍阴侯,历任游击将军、并州、雍州刺史、尚书等职,高平陵政变发生时,陈泰力劝大将军曹爽投降,因此得到掌权的司马氏信任,此后为了回避朝廷的争斗,陈泰主动请求外调雍州任职,任内成功防御蜀将姜维的多次进攻。甘露元年(256年),陈泰被调回朝中任尚书右仆射,曾随司马昭两度抵抗东吴的进攻,后改任左仆射。甘露五年(260年),魏帝曹髦被弑杀,陈泰闻讯后悲痛过度,呕血而死,享年六十一岁。追赠司空,赐谥为穆。', - huangwudie:'黄舞蝶是在现代三国作品中出场的虚拟人物,设定为蜀汉大将黄忠之女,跟随父亲一同投效刘备,在游戏中是一名不错的女将。', - sunyi:'孙翊(184年~204年),又名孙俨,字叔弼,是孙坚的第三子,孙策、孙权的弟弟。曾被大臣推荐为继承者。孙权继位后,孙翊任丹杨太守,后被身边的人边鸿刺杀。', - zhangning:'《三国杀·阵面对决》中登场的角色。张角之女,能呼雷掣电。', - yanghu:'羊祜(221年-278年12月27日),字叔子,泰山郡南城县人。西晋时期杰出的战略家、政治家、文学家,曹魏上党太守羊衜的儿子,名儒蔡邕的女儿蔡文姬的外甥。出身“泰山羊氏”,博学能文,清廉正直。曹魏时期,接受公车征辟,出任中书郎,迁给事黄门侍郎。姐姐嫁给大将军司马师,投靠司马氏家族,仕途平步青云。魏元帝曹奂即位,出任秘书监、相国从事中郎、中领军,统领御林军,兼管内外政事,册封钜平县子,迁。西晋建立后,迁中军将军、散骑常侍、郎中令,册封钜平侯。泰始五年(269年),出任车骑将军、荆州都督,加任开府仪同三司坐镇襄阳,屯田兴学,以德怀柔,深得军民之心;扩充军备,训练士兵,全力准备灭亡孙吴,累迁征南大将军,册封南城侯。咸宁四年,去世,临终前举荐杜预接任职务,获赠侍中、太傅,谥号为“成”。唐宋时期,配享武庙。', - ns_wangyue:'王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。', + characterSort: { + diy: { + diy_yijiang: [ + "key_kud", + "key_misuzu", + "key_kamome", + "key_nao", + "ns_huangchengyan", + "ns_sunchensunjun", + "ns_yuanxi", + "ns_caoshuang", + ], + diy_yijiang2: [ + "key_yuuki", + "key_tenzen", + "key_kyouko", + "key_kotarou", + "key_kyou", + "ns_chentai", + "ns_huangwudie", + "ns_sunyi", + "ns_zhangning", + "ns_yanghu", + ], + diy_yijiang3: [ + "ns_ruanji", + "ns_zanghong", + "ns_limi", + "ns_zhonglimu", + "prp_zhugeliang", + "key_seira", + "key_kiyu", + "key_tomoyo", + "key_minagi", + "key_michiru", + ], + diy_tieba: [ + "ns_zuoci", + "ns_lvzhi", + "ns_wangyun", + "ns_nanhua", + "ns_nanhua_left", + "ns_nanhua_right", + "ns_huamulan", + "ns_huangzu", + "ns_jinke", + "ns_yanliang", + "ns_wenchou", + "ns_caocao", + "ns_caocaosp", + "ns_zhugeliang", + "ns_wangyue", + "ns_yuji", + "ns_xinxianying", + "ns_guanlu", + "ns_simazhao", + "ns_sunjian", + "ns_duangui", + "ns_zhangbao", + "ns_masu", + "ns_zhangxiu", + "ns_lvmeng", + "ns_shenpei", + "ns_yujisp", + "ns_yangyi", + "ns_liuzhang", + "ns_xinnanhua", + "ns_luyusheng", + ], + diy_fakenews: [ + "diy_wenyang", + "ns_zhangwei", + "ns_caimao", + "ns_chengpu", + "ns_sundeng", + "ns_duji", + "ns_mengyou", + ], + diy_xushi: [ + "diy_feishi", + "diy_hanlong", + "diy_liufu", + "diy_liuyan", + "diy_liuzan", + "diy_tianyu", + "diy_xizhenxihong", + "diy_yangyi", + "diy_zaozhirenjun", + ], + diy_default: ["diy_yuji", "diy_caiwenji", "diy_lukang", "diy_zhenji", "old_majun"], + diy_noname: ["noname"], + diy_key: [ + "key_lucia", + "key_kyousuke", + "key_yuri", + "key_haruko", + "key_umi", + "key_rei", + "key_komari", + "key_yukine", + "key_yusa", + "key_misa", + "key_masato", + "key_iwasawa", + "key_kengo", + "key_yoshino", + "key_yui", + "key_tsumugi", + "key_saya", + "key_harukakanata", + "key_inari", + "key_shiina", + "key_sunohara", + "key_rin", + "key_sasami", + "key_akane", + "key_doruji", + "key_yuiko", + "key_riki", + "key_hisako", + "key_hinata", + "key_noda", + "key_tomoya", + "key_nagisa", + "key_ayato", + "key_ao", + "key_yuzuru", + "sp_key_kanade", + "key_mio", + "key_midori", + "key_kyoko", + "key_shizuru", + "key_shiorimiyuki", + "key_miki", + "key_shiori", + "key_kaori", + "sp_key_yuri", + "key_akiko", + "key_abyusa", + "key_godan", + "key_yuu", + "key_ryoichi", + "key_kotori", + "key_jojiro", + "key_shiroha", + "key_shizuku", + "key_hiroto", + "key_sakuya", + "key_youta", + "key_rumi", + "key_chihaya", + "key_yukito", + "key_asara", + "key_kotomi", + "key_mia", + "key_kano", + "db_key_liyingxia", + "key_erika", + "key_satomi", + "key_iriya", + "key_fuuko", + ], + diy_trashbin: [ + "junk_guanyu", + "junk_zhangjiao", + "old_jiakui", + "ol_guohuai", + "junk_zhangrang", + "old_bulianshi", + "ol_maliang", + "junk_liubei", + "junk_huangyueying", + "junk_lidian", + "junk_duanwei", + "junk_xuyou", + ], + }, }, - characterTitle:{ - key_satomi:'#rHeaven Burns Red', - key_erika:'#rHeaven Burns Red', - db_key_liyingxia:'#rHeaven Burns Red', - key_kano:'#bAIR', - key_mia:'#bLoopers', - key_kotomi:'#gClannad', - key_asara:'#bRewrite', - key_yukito:'#bAIR', - key_chihaya:'#bRewrite', - key_rumi:'#rONE ~輝く季節へ~', - key_youta:'#b神様になった日', - key_sakuya:'#bRewrite', - key_hiroto:'#b神様になった日', - key_shizuku:'#bSummer Pockets', - key_shiroha:'#bSummer Pockets', - key_jojiro:'#bCharlotte
    战棋专属角色', - key_kotori:'#bRewrite', - key_ryoichi:'#bSummer Pockets', - key_yuu:'#bCharlotte', - key_godan:'#rAngel Beats!', - key_abyusa:'#rAngel Beats!', - key_akiko:'#bKanon', - key_kaori:'#bKanon', - key_shiori:'#bKanon', - key_miki:'#bSummer Pockets', - key_shiorimiyuki:'#rAngel Beats!', - key_shizuru:'#bRewrite', - key_kyoko:'#bSummer Pockets', - sp_key_kanade:'#rAngel Beats!', - key_yuzuru:'#rAngel Beats!', - key_tsumugi:'#bSummer Pockets', - key_ayato:'#rAngel Beats!', - key_nagisa:'#gClannad', - key_tomoya:'#gClannad', - key_noda:'#rAngel Beats!', - key_hinata:'#rAngel Beats!', - key_hisako:'#rAngel Beats!', - key_doruji:'#bLittle Busters!', - key_riki:'#bLittle Busters!', - key_yuiko:'#bLittle Busters!', - key_akane:'#bRewrite', - key_sasami:'#bLittle Busters!', - key_rin:'#bLittle Busters!', - key_shiina:'#rAngel Beats!', - key_inari:'#bSummer Pockets', - key_saya:'#bLittle Busters!', - key_harukakanata:'#bLittle Busters!', - key_yui:'#rAngel Beats!', - key_yoshino:'#bRewrite', - key_kengo:'#bLittle Busters!', - key_iwasawa:'#rAngel Beats!', - key_masato:'#bLittle Busters!', - key_yusa:'#bCharlotte', - key_misa:'#rCharlotte', - key_yukine:'#gClannad', - key_komari:'#bLittle Busters!', - key_umi:'#bSummer Pockets', - key_rei:'#gHarmonia', - key_lucia:'#bRewrite', - key_kyousuke:'#bLittle Busters!', - key_yuri:'#rAngel Beats!', - key_haruko:'#bAIR', - sp_key_yuri:'#bAngel Beats!', - key_fuuko:'#gClannad', + characterIntro: { + noname: "无名杀的吉祥物。
    画师:空城
    技能设计:李木子", + diy_hanlong: + "韩龙,魏国刺客。他孤身一人深入到了长城外的敌人领地,成功刺杀了敌方首领轲比能,瓦解了鲜卑民族,曹魏边境因此获得了几十年的安稳。", + ns_zhangwei: + "血骑教习·张葳,三国杀集换式卡牌游戏《阵面对决》中的帝畿系列卡牌。游卡桌游官方原创的三国时期女性角色。", + diy_feishi: + "字公举,生卒年不详,益州犍为郡南安县(今四川省乐山市)人。刘璋占据益州时,以费诗为绵竹县县令。刘备进攻刘璋夺取益州,费诗举城而降,后受拜督军从事,转任牂牁郡太守,再为州前部司马。", + diy_lukang: "字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。", + diy_liufu: + "字元颖,沛国相县(今安徽濉溪县西北)人。东汉末年名守。在汉末避难于淮南,说服袁术将戚寄和秦翊率部投奔曹操,曹操大悦,使司徒辟其为掾属。", + diy_xizhenxihong: + "习珍,襄阳人。三国时蜀汉将领。先主刘备时曾任零陵北部都尉,加裨将军。建安二十四年,关羽率荆州大军攻打樊城,唯有习珍据城不降。被困月余,直到箭尽粮绝,拔剑自刎而死。习宏,生卒年不详,习珍之弟。曾在东吴入侵蜀汉时建议哥哥习珍伪降,约樊胄举兵。习珍死后,弟弟习宏落在东吴,有问必不答,终身不为孙权发一言。", + diy_zaozhirenjun: + "枣祗,生卒年月不详,东汉末年颍川阳翟(今河南省禹州市)人。曾任东阿令、羽林监、屯田都尉、陈留太守等职。任峻(?—204年),字伯达,河南郡中牟县人。曹操每次出征,任峻通常在后方补给军队。后来发生饥荒,枣祗建议实施屯田,任峻被任命为典农中郎将,招募百姓在许下屯田,结果连年丰收,积谷足以装满全部粮仓。", + diy_yangyi: + "字威公,襄阳(今湖北襄阳)人,三国时期蜀汉政治家。最初,为荆州刺史傅群的主簿,后投奔关羽,任为功曹。羽遣其至成都,大受刘备赞赏,擢为尚书。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。亮生前定蒋琬继己任,仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。", + diy_tianyu: + "字国让,渔阳雍奴(今天津市武清区东北)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。", + chentai: + "陈泰(200年~260年),字玄伯,颍川许昌(今河南省许昌市)人。三国时期魏国名将,司空陈群之子。陈泰早年起家员外散骑侍郎,其父陈群死后袭封颍阴侯,历任游击将军、并州、雍州刺史、尚书等职,高平陵政变发生时,陈泰力劝大将军曹爽投降,因此得到掌权的司马氏信任,此后为了回避朝廷的争斗,陈泰主动请求外调雍州任职,任内成功防御蜀将姜维的多次进攻。甘露元年(256年),陈泰被调回朝中任尚书右仆射,曾随司马昭两度抵抗东吴的进攻,后改任左仆射。甘露五年(260年),魏帝曹髦被弑杀,陈泰闻讯后悲痛过度,呕血而死,享年六十一岁。追赠司空,赐谥为穆。", + huangwudie: + "黄舞蝶是在现代三国作品中出场的虚拟人物,设定为蜀汉大将黄忠之女,跟随父亲一同投效刘备,在游戏中是一名不错的女将。", + sunyi: "孙翊(184年~204年),又名孙俨,字叔弼,是孙坚的第三子,孙策、孙权的弟弟。曾被大臣推荐为继承者。孙权继位后,孙翊任丹杨太守,后被身边的人边鸿刺杀。", + zhangning: "《三国杀·阵面对决》中登场的角色。张角之女,能呼雷掣电。", + yanghu: "羊祜(221年-278年12月27日),字叔子,泰山郡南城县人。西晋时期杰出的战略家、政治家、文学家,曹魏上党太守羊衜的儿子,名儒蔡邕的女儿蔡文姬的外甥。出身“泰山羊氏”,博学能文,清廉正直。曹魏时期,接受公车征辟,出任中书郎,迁给事黄门侍郎。姐姐嫁给大将军司马师,投靠司马氏家族,仕途平步青云。魏元帝曹奂即位,出任秘书监、相国从事中郎、中领军,统领御林军,兼管内外政事,册封钜平县子,迁。西晋建立后,迁中军将军、散骑常侍、郎中令,册封钜平侯。泰始五年(269年),出任车骑将军、荆州都督,加任开府仪同三司坐镇襄阳,屯田兴学,以德怀柔,深得军民之心;扩充军备,训练士兵,全力准备灭亡孙吴,累迁征南大将军,册封南城侯。咸宁四年,去世,临终前举荐杜预接任职务,获赠侍中、太傅,谥号为“成”。唐宋时期,配享武庙。", + ns_wangyue: + "王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。", + }, + characterTitle: { + key_satomi: "#rHeaven Burns Red", + key_erika: "#rHeaven Burns Red", + db_key_liyingxia: "#rHeaven Burns Red", + key_kano: "#bAIR", + key_mia: "#bLoopers", + key_kotomi: "#gClannad", + key_asara: "#bRewrite", + key_yukito: "#bAIR", + key_chihaya: "#bRewrite", + key_rumi: "#rONE ~輝く季節へ~", + key_youta: "#b神様になった日", + key_sakuya: "#bRewrite", + key_hiroto: "#b神様になった日", + key_shizuku: "#bSummer Pockets", + key_shiroha: "#bSummer Pockets", + key_jojiro: "#bCharlotte
    战棋专属角色", + key_kotori: "#bRewrite", + key_ryoichi: "#bSummer Pockets", + key_yuu: "#bCharlotte", + key_godan: "#rAngel Beats!", + key_abyusa: "#rAngel Beats!", + key_akiko: "#bKanon", + key_kaori: "#bKanon", + key_shiori: "#bKanon", + key_miki: "#bSummer Pockets", + key_shiorimiyuki: "#rAngel Beats!", + key_shizuru: "#bRewrite", + key_kyoko: "#bSummer Pockets", + sp_key_kanade: "#rAngel Beats!", + key_yuzuru: "#rAngel Beats!", + key_tsumugi: "#bSummer Pockets", + key_ayato: "#rAngel Beats!", + key_nagisa: "#gClannad", + key_tomoya: "#gClannad", + key_noda: "#rAngel Beats!", + key_hinata: "#rAngel Beats!", + key_hisako: "#rAngel Beats!", + key_doruji: "#bLittle Busters!", + key_riki: "#bLittle Busters!", + key_yuiko: "#bLittle Busters!", + key_akane: "#bRewrite", + key_sasami: "#bLittle Busters!", + key_rin: "#bLittle Busters!", + key_shiina: "#rAngel Beats!", + key_inari: "#bSummer Pockets", + key_saya: "#bLittle Busters!", + key_harukakanata: "#bLittle Busters!", + key_yui: "#rAngel Beats!", + key_yoshino: "#bRewrite", + key_kengo: "#bLittle Busters!", + key_iwasawa: "#rAngel Beats!", + key_masato: "#bLittle Busters!", + key_yusa: "#bCharlotte", + key_misa: "#rCharlotte", + key_yukine: "#gClannad", + key_komari: "#bLittle Busters!", + key_umi: "#bSummer Pockets", + key_rei: "#gHarmonia", + key_lucia: "#bRewrite", + key_kyousuke: "#bLittle Busters!", + key_yuri: "#rAngel Beats!", + key_haruko: "#bAIR", + sp_key_yuri: "#bAngel Beats!", + key_fuuko: "#gClannad", - key_kud:'#b千夜', - key_misuzu:'#b长发及腰黑长直', - key_kamome:'#b仿生纱', - key_nao:'#b潮鸣', - key_kyou:'#b长发及腰黑长直', - key_yuuki:'#b4399司命', - key_kyouko:'#b阿阿阿687', - key_tenzen:'#b皋耳击', - key_kotarou:'#bb1154486224', - key_seira:'#b阿开木木W🍀', - key_kiyu:'#b无面◎隐者', - key_tomoyo:'#b长发及腰黑长直', - key_minagi:'#b无面◎隐者', + key_kud: "#b千夜", + key_misuzu: "#b长发及腰黑长直", + key_kamome: "#b仿生纱", + key_nao: "#b潮鸣", + key_kyou: "#b长发及腰黑长直", + key_yuuki: "#b4399司命", + key_kyouko: "#b阿阿阿687", + key_tenzen: "#b皋耳击", + key_kotarou: "#bb1154486224", + key_seira: "#b阿开木木W🍀", + key_kiyu: "#b无面◎隐者", + key_tomoyo: "#b长发及腰黑长直", + key_minagi: "#b无面◎隐者", - ns_huangchengyan:'#g竹邀月', - ns_sunchensunjun:'#gVenusjeu', - ns_yuanxi:'#g食茸二十四', - ns_caoshuang:'#g荬庀芬兰', - ns_chentai:'#g荀彧III荀文若', - ns_huangwudie:'#g你爸爸来了164', - ns_sunyi:'#g无民氏4251', - ns_zhangning:'#g如颍隋行1314', - ns_yanghu:'#ginCenv', - ns_ruanji:'#g伯约的崛起', - ns_zanghong:'#g阿七', - ns_limi:'#g-心若困兽-', - ns_zhonglimu:'#gJG赛文♠7', - prp_zhugeliang:'#g阿开木木W🍀', + ns_huangchengyan: "#g竹邀月", + ns_sunchensunjun: "#gVenusjeu", + ns_yuanxi: "#g食茸二十四", + ns_caoshuang: "#g荬庀芬兰", + ns_chentai: "#g荀彧III荀文若", + ns_huangwudie: "#g你爸爸来了164", + ns_sunyi: "#g无民氏4251", + ns_zhangning: "#g如颍隋行1314", + ns_yanghu: "#ginCenv", + ns_ruanji: "#g伯约的崛起", + ns_zanghong: "#g阿七", + ns_limi: "#g-心若困兽-", + ns_zhonglimu: "#gJG赛文♠7", + prp_zhugeliang: "#g阿开木木W🍀", - ns_luyusheng:'#g猫咪大院 - 魚と水', - ns_caimao:'#gP尔号玩家◆', - diy_wenyang:'#g最粗的梦想XD', - ns_zuoci:'#bskystarwuwei', - ns_lvzhi:'#bskystarwuwei', - ns_wangyun:'#rSukincen', - ns_guanlu:'#rSukincen', - ns_xinnanhua:'#rSukincen', - ns_nanhua:'#g戒除联盟', - ns_shenpei:'#g戒除联盟', - ns_huamulan:'#p哎别管我是谁', - ns_jinke:'#p哎别管我是谁', - ns_huangzu:'#r小芯儿童鞋', - ns_lisu:'#r小芯儿童鞋', - ns_yanliang:'#r丶橙续缘', - ns_wenchou:'#r丶橙续缘', - ns_caocao:'#r一瞬间丶遗忘', - ns_caocaosp:'#g希望教主', - ns_zhugeliang:'#p死不死什么的', - ns_xinxianying:'#b扶苏公子', - ns_zhangbao:'#b扶苏公子', - ns_wangyue:'#p废城君', - ns_sunjian:'#b兔子两只2', - ns_lvmeng:'#b兔子两只2', - ns_yujisp:'#b兔子两只2', - ns_yuji:'#g蔚屿凉音', - ns_simazhao:'#r一纸载春秋', - ns_duangui:'#b宝宝酱紫萌萌哒', - ns_masu:'#g修女', - ns_zhangxiu:'#p本因坊神策', - ns_yangyi:'#p本因坊神策', - ns_liuzhang:'#r矮子剑薄荷糖', - ns_mengyou:'#g残昼厄夜', + ns_luyusheng: "#g猫咪大院 - 魚と水", + ns_caimao: "#gP尔号玩家◆", + diy_wenyang: "#g最粗的梦想XD", + ns_zuoci: "#bskystarwuwei", + ns_lvzhi: "#bskystarwuwei", + ns_wangyun: "#rSukincen", + ns_guanlu: "#rSukincen", + ns_xinnanhua: "#rSukincen", + ns_nanhua: "#g戒除联盟", + ns_shenpei: "#g戒除联盟", + ns_huamulan: "#p哎别管我是谁", + ns_jinke: "#p哎别管我是谁", + ns_huangzu: "#r小芯儿童鞋", + ns_lisu: "#r小芯儿童鞋", + ns_yanliang: "#r丶橙续缘", + ns_wenchou: "#r丶橙续缘", + ns_caocao: "#r一瞬间丶遗忘", + ns_caocaosp: "#g希望教主", + ns_zhugeliang: "#p死不死什么的", + ns_xinxianying: "#b扶苏公子", + ns_zhangbao: "#b扶苏公子", + ns_wangyue: "#p废城君", + ns_sunjian: "#b兔子两只2", + ns_lvmeng: "#b兔子两只2", + ns_yujisp: "#b兔子两只2", + ns_yuji: "#g蔚屿凉音", + ns_simazhao: "#r一纸载春秋", + ns_duangui: "#b宝宝酱紫萌萌哒", + ns_masu: "#g修女", + ns_zhangxiu: "#p本因坊神策", + ns_yangyi: "#p本因坊神策", + ns_liuzhang: "#r矮子剑薄荷糖", + ns_mengyou: "#g残昼厄夜", }, - card:{ - kano_paibingbuzhen:{ - fullskin:true, - type:'trick', - enable:true, - filterTarget:true, - selectTarget:[1,3], - derivation:'key_kano', - content(){ - 'step 0' + card: { + kano_paibingbuzhen: { + fullskin: true, + type: "trick", + enable: true, + filterTarget: true, + selectTarget: [1, 3], + derivation: "key_kano", + content() { + "step 0"; target.draw(); - 'step 1' - var hs=target.getCards('he'); - if(!hs.length) event.finish(); - else if(hs.length==1) event._result={bool:true,cards:hs}; - else target.chooseCard('he',true,'选择一张牌置入仁库'); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - target.$throw(card,1000); - target.lose(card,'toRenku'); + ("step 1"); + var hs = target.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length == 1) event._result = { bool: true, cards: hs }; + else target.chooseCard("he", true, "选择一张牌置入仁库"); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + target.$throw(card, 1000); + target.lose(card, "toRenku"); } }, - contentAfter(){ - if(player.isIn()&&_status.renku.length&&function(){ - var cards=_status.renku; - if(cards.length==1) return true; - var color=get.color(cards[0],false),type=get.type(cards[0],false); - for(var i=1;i{ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + filter: (event) => { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ - 'step 0' + content() { + "step 0"; player.drawTo(8); - 'step 1' - var hs=player.getCards('h'); - if(hs.length>0) player.addShownCards(hs,'visible_fuuko_xingdiao'); + ("step 1"); + var hs = player.getCards("h"); + if (hs.length > 0) player.addShownCards(hs, "visible_fuuko_xingdiao"); }, - mod:{ - ignoredHandcard(card){ - if(card.hasGaintag('visible_fuuko_xingdiao')){ + mod: { + ignoredHandcard(card) { + if (card.hasGaintag("visible_fuuko_xingdiao")) { return true; } }, - cardDiscardable(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('visible_fuuko_xingdiao')){ + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("visible_fuuko_xingdiao")) { return false; } }, }, - onremove:true, - global:'fuuko_xingdiao_gain', - subSkill:{ - gain:{ - enable:'phaseUse', - filter:(event,player)=>{ - return game.hasPlayer(current=>lib.skill.fuuko_xingdiao_gain.filterTarget(null,player,current)); + onremove: true, + global: "fuuko_xingdiao_gain", + subSkill: { + gain: { + enable: "phaseUse", + filter: (event, player) => { + return game.hasPlayer((current) => + lib.skill.fuuko_xingdiao_gain.filterTarget(null, player, current) + ); }, - filterTarget:(card,player,target)=>{ - return target!=player&&target.hasCard(card=>card.hasGaintag('visible_fuuko_xingdiao'),'h') - &&!target.getStorage('fuuko_xingdiao').includes(player)&&target.hasSkill('fuuko_xingdiao'); + filterTarget: (card, player, target) => { + return ( + target != player && + target.hasCard((card) => card.hasGaintag("visible_fuuko_xingdiao"), "h") && + !target.getStorage("fuuko_xingdiao").includes(player) && + target.hasSkill("fuuko_xingdiao") + ); }, - selectTarget:()=>{ - const num=game.countPlayer(current=>lib.skill.fuuko_xingdiao_gain.filterTarget(null,_status.event.player,current)); - return num>1?1:-1; + selectTarget: () => { + const num = game.countPlayer((current) => + lib.skill.fuuko_xingdiao_gain.filterTarget( + null, + _status.event.player, + current + ) + ); + return num > 1 ? 1 : -1; }, - content(){ - 'step 0' - target.markAuto('fuuko_xingdiao',[player]); - var cards=target.getCards('h',card=>card.hasGaintag('visible_fuuko_xingdiao')); - if(!cards.length) event.finish(); - else if(cards.length==1) event._result={bool:true,links:cards}; - else player.chooseButton(true,['选择获得'+get.translation(target)+'的一张“星”',cards]); - 'step 1' - if(result.bool){ - player.gain(result.links,target,'give'); + content() { + "step 0"; + target.markAuto("fuuko_xingdiao", [player]); + var cards = target.getCards("h", (card) => + card.hasGaintag("visible_fuuko_xingdiao") + ); + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, links: cards }; + else + player.chooseButton(true, [ + "选择获得" + get.translation(target) + "的一张“星”", + cards, + ]); + ("step 1"); + if (result.bool) { + player.gain(result.links, target, "give"); target.draw(); } }, - ai:{ - order:6, - result:{ - target:1, + ai: { + order: 6, + result: { + target: 1, }, }, }, }, }, - fuuko_chuanyuan:{ - trigger:{ - player:'loseAfter', - global:['gainAfter','equipAfter','addJudgeAfter','loseAsyncAfter','addToExpansionAfter'], + fuuko_chuanyuan: { + trigger: { + player: "loseAfter", + global: [ + "gainAfter", + "equipAfter", + "addJudgeAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter(event,player){ - const evt=event.getl(player); - if(!evt.hs.length) return false; - for(let i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('visible_fuuko_xingdiao')) return true; + forced: true, + filter(event, player) { + const evt = event.getl(player); + if (!evt.hs.length) return false; + for (let i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("visible_fuuko_xingdiao")) return true; } return false; }, - content(){ - var evt=trigger.getl(player),gains=[],draws=0; - var map=evt.gaintag_map; - var cards=evt.hs.filter(card=>{ - return map[card.cardid]&&map[card.cardid].includes('visible_fuuko_xingdiao'); + content() { + var evt = trigger.getl(player), + gains = [], + draws = 0; + var map = evt.gaintag_map; + var cards = evt.hs.filter((card) => { + return map[card.cardid] && map[card.cardid].includes("visible_fuuko_xingdiao"); }); - cards.forEach(card=>{ - var suit=get.suit(card,player),num=get.number(card,player); - var card2=get.cardPile2(function(card){ - if(gains.includes(card)) return false; - return get.suit(card,player)==suit&&get.number(card,player)==num; + cards.forEach((card) => { + var suit = get.suit(card, player), + num = get.number(card, player); + var card2 = get.cardPile2(function (card) { + if (gains.includes(card)) return false; + return get.suit(card, player) == suit && get.number(card, player) == num; }); - if(card2) gains.push(card2); + if (card2) gains.push(card2); else draws++; }); - if(gains.length) player.gain(gains,'gain2').gaintag.add('fuuko_chuanyuan'); - if(draws) player.draw(draws).gaintag=['fuuko_chuanyuan']; - player.addSkill('fuuko_chuanyuan_effect'); + if (gains.length) player.gain(gains, "gain2").gaintag.add("fuuko_chuanyuan"); + if (draws) player.draw(draws).gaintag = ["fuuko_chuanyuan"]; + player.addSkill("fuuko_chuanyuan_effect"); }, - subSkill:{ - effect:{ - mod:{ - targetInRange(card){ - if(!card.cards||!card.cards.length) return; - for(var i of card.cards){ - if(!i.hasGaintag('fuuko_chuanyuan')) return; + subSkill: { + effect: { + mod: { + targetInRange(card) { + if (!card.cards || !card.cards.length) return; + for (var i of card.cards) { + if (!i.hasGaintag("fuuko_chuanyuan")) return; } return true; }, - cardUsable(card){ - if(!card.cards||!card.cards.length) return; - for(var i of card.cards){ - if(!i.hasGaintag('fuuko_chuanyuan')) return; + cardUsable(card) { + if (!card.cards || !card.cards.length) return; + for (var i of card.cards) { + if (!i.hasGaintag("fuuko_chuanyuan")) return; } return Infinity; }, }, - charlotte:true, - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - filter(event,player){ - if(event.addCount===false) return false; - return player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - for(let i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('fuuko_chuanyuan')) return true; + charlotte: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter(event, player) { + if (event.addCount === false) return false; + return player.hasHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + for (let i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("fuuko_chuanyuan")) return true; } }); //return false; }, - content(){ - trigger.addCount=false; - player.getStat('card')[trigger.card.name]--; + content() { + trigger.addCount = false; + player.getStat("card")[trigger.card.name]--; }, }, }, }, //伊莉雅 - iriya_yinji:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - filter(event,player){ - return player.countCards('h')<17; + iriya_yinji: { + trigger: { player: "phaseUseBegin" }, + forced: true, + filter(event, player) { + return player.countCards("h") < 17; }, - content(){ - player.drawTo(17).gaintag=['iriya_yinji_tag']; - player.addSkill('iriya_yinji_tag'); + content() { + player.drawTo(17).gaintag = ["iriya_yinji_tag"]; + player.addSkill("iriya_yinji_tag"); }, - subSkill:{ - tag:{ - charlotte:true, - mod:{ - cardEnabled(card){ - if(get.itemtype(card)=='card'){ - if(card.hasGaintag('iriya_yinji_tag')) return false; - } - else if(card.isCard&&card.cards){ - if(card.cards.some(card=>card.hasGaintag('iriya_yinji_tag'))) return false; + subSkill: { + tag: { + charlotte: true, + mod: { + cardEnabled(card) { + if (get.itemtype(card) == "card") { + if (card.hasGaintag("iriya_yinji_tag")) return false; + } else if (card.isCard && card.cards) { + if (card.cards.some((card) => card.hasGaintag("iriya_yinji_tag"))) + return false; } }, - aiValue(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('iriya_yinji_tag')) return num/10000; + aiValue(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) + return num / 10000; }, - aiUseful(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('iriya_yinji_tag')) return num/10000; + aiUseful(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("iriya_yinji_tag")) + return num / 10000; }, }, }, }, }, - iriya_haozhi:{ - enable:'phaseUse', - filterCard:true, - selectCard:[2,Infinity], - promptfunc:()=>'出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。', - position:'he', - getType(cards,player){ - var nums=cards.map(card=>{ - var num=get.number(card,player); - if(num<=2) return num+13; - return num; - }).sort((a,b)=>(a-b)),len=nums.length; - if(len==1) return ['单张',nums[0],1]; - if(len==2) return nums[1]==nums[0]?['对子',nums[0],1]:null; - var map={}; - for(var i=0;i + "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。", + position: "he", + getType(cards, player) { + var nums = cards + .map((card) => { + var num = get.number(card, player); + if (num <= 2) return num + 13; + return num; + }) + .sort((a, b) => a - b), + len = nums.length; + if (len == 1) return ["单张", nums[0], 1]; + if (len == 2) return nums[1] == nums[0] ? ["对子", nums[0], 1] : null; + var map = {}; + for (var i = 0; i < len; i++) { + var count = get.numOf(nums, nums[i]); + if (!map[count]) map[count] = []; map[count].push(nums[i]); - i+=(count-1); + i += count - 1; } - if(len==3){ - if(map[3]) return ['三张',nums[0],1]; + if (len == 3) { + if (map[3]) return ["三张", nums[0], 1]; return null; } - if(map[len]){ - return ['炸弹',nums[0],length]; + if (map[len]) { + return ["炸弹", nums[0], length]; } - if(map[1]){ - if(map[1].length==len&&len>4){ - for(var i=0;i 4) { + for (var i = 0; i < map[1].length - 1; i++) { + if (map[1][i + 1] - map[1][i] != 1) return null; + if (map[1][i + 1] == 15) return null; } - return ['单顺',nums[0],len]; - } - else if(map[1].length==2&&map[4]&&len==6){ - return ['四带二',map[4][0],1] - } - else if(map[3]&&map[1].length==map[3].length&&len==map[1].length*4){ - if(map[3].length==1) return ['三带一',map[3][0],1]; - for(var i=0;i5){ - for(var i=0;i 5) { + for (var i = 0; i < map[2].length - 1; i++) { + if (map[2][i + 1] - map[2][i] != 1) return null; + if (map[2][i + 1] == 15) return null; } - return ['双顺',nums[0],len]; - } - else if(map[4]&&len==6){ - return ['四带二',map[4][0],1] - } - else if(map[3]&&map[2].length==map[3].length&&len==map[2].length*5){ - if(map[3].length==1) return ['三带二',map[3][0],1]; - for(var i=0;i5){ - for(var i=0;i 5) { + for (var i = 0; i < map[3].length - 1; i++) { + if (map[3][i + 1] - map[3][i] != 1) return null; + if (map[3][i + 1] == 15) return null; } - return ['三顺',nums[0],len]; + return ["三顺", nums[0], len]; } return null; } return null; }, - filterOk(){ - return Array.isArray(lib.skill.iriya_haozhi.getType(ui.selected.cards,_status.event.player)); + filterOk() { + return Array.isArray( + lib.skill.iriya_haozhi.getType(ui.selected.cards, _status.event.player) + ); }, - check(card){ - var player=_status.event.player; + check(card) { + var player = _status.event.player; //收益都一样 多一牌不如少一牌 - var types=['炸弹','三顺','单顺','双顺','三张','对子']; - var getNum=function(card,player){ - var num=get.number(card,player); - if(num<=2) return num+13; - return num; - },hasEnemy=game.hasPlayer(current=>get.attitude(player,current)<0); + var types = ["炸弹", "三顺", "单顺", "双顺", "三张", "对子"]; + var getNum = function (card, player) { + var num = get.number(card, player); + if (num <= 2) return num + 13; + return num; + }, + hasEnemy = game.hasPlayer((current) => get.attitude(player, current) < 0); //所有手牌 - var nums=player.getCards('he',function(card){ - return lib.filter.cardDiscardable(card,player); - }).map(card=>getNum(card,player)); - var numu=ui.selected.cards.map(card=>getNum(card,player)); - var num=getNum(card,player); - if(!_status.event._iriya_haozhi_type){ - for(var type of types){ - switch(type){ - case '炸弹': - if(!hasEnemy) break; - for(var i of nums){ - if(get.numOf(nums,i)>=4){ - _status.event._iriya_haozhi_type='炸弹'; + var nums = player + .getCards("he", function (card) { + return lib.filter.cardDiscardable(card, player); + }) + .map((card) => getNum(card, player)); + var numu = ui.selected.cards.map((card) => getNum(card, player)); + var num = getNum(card, player); + if (!_status.event._iriya_haozhi_type) { + for (var type of types) { + switch (type) { + case "炸弹": + if (!hasEnemy) break; + for (var i of nums) { + if (get.numOf(nums, i) >= 4) { + _status.event._iriya_haozhi_type = "炸弹"; break; } } break; - case '三顺': - if(!hasEnemy) break; - for(var i of nums){ - if(i<14&&get.numOf(nums,i)>=3&&get.numOf(nums,i+1)>=3){ - _status.event._iriya_haozhi_type='三顺'; + case "三顺": + if (!hasEnemy) break; + for (var i of nums) { + if ( + i < 14 && + get.numOf(nums, i) >= 3 && + get.numOf(nums, i + 1) >= 3 + ) { + _status.event._iriya_haozhi_type = "三顺"; break; } } break; - case '双顺': - if(!hasEnemy) break; - for(var i of nums){ - if(i<13&&get.numOf(nums,i)>=2){ - for(var j=1;j<3;j++){ - if(get.numOf(nums,i+j)<2) break; - if(j==2) _status.event._iriya_haozhi_type='双顺'; + case "双顺": + if (!hasEnemy) break; + for (var i of nums) { + if (i < 13 && get.numOf(nums, i) >= 2) { + for (var j = 1; j < 3; j++) { + if (get.numOf(nums, i + j) < 2) break; + if (j == 2) _status.event._iriya_haozhi_type = "双顺"; } } } break; - case '单顺': - if(!hasEnemy) break; - for(var i of nums){ - if(i<11){ - for(var j=1;j<5;j++){ - if(!nums.includes(i+j)) break; - if(j==4) _status.event._iriya_haozhi_type='单顺'; + case "单顺": + if (!hasEnemy) break; + for (var i of nums) { + if (i < 11) { + for (var j = 1; j < 5; j++) { + if (!nums.includes(i + j)) break; + if (j == 4) _status.event._iriya_haozhi_type = "单顺"; } } } break; - case '三张': - if(!hasEnemy) break; - for(var i of nums){ - if(get.numOf(nums,i)>=3){ - _status.event._iriya_haozhi_type='三张'; + case "三张": + if (!hasEnemy) break; + for (var i of nums) { + if (get.numOf(nums, i) >= 3) { + _status.event._iriya_haozhi_type = "三张"; break; } } break; - case '对子': - for(var i of nums){ - if(get.numOf(nums,i)>=2){ - _status.event._iriya_haozhi_type='对子'; + case "对子": + for (var i of nums) { + if (get.numOf(nums, i) >= 2) { + _status.event._iriya_haozhi_type = "对子"; break; } } break; } - if(_status.event._iriya_haozhi_type) break; + if (_status.event._iriya_haozhi_type) break; } - if(!_status.event._iriya_haozhi_type) _status.event._iriya_haozhi_type='要不起'; + if (!_status.event._iriya_haozhi_type) _status.event._iriya_haozhi_type = "要不起"; } - if(_status.event._iriya_haozhi_type=='要不起') return 0; + if (_status.event._iriya_haozhi_type == "要不起") return 0; //复用响应AI - if(!ui.selected.cards.length){ - var count=get.numOf(nums,num); - switch(_status.event._iriya_haozhi_type){ - case '炸弹': - if(count>=4) return 15; + if (!ui.selected.cards.length) { + var count = get.numOf(nums, num); + switch (_status.event._iriya_haozhi_type) { + case "炸弹": + if (count >= 4) return 15; break; - case '对子': - if(count>1&&player.hasCard(function(cardx){ - return cardx!=card&&getNum(cardx,player)==num&&cardx.hasGaintag('iriya_yinji_tag'); - },'he')) return 4-get.value(card); + case "对子": + if ( + count > 1 && + player.hasCard(function (cardx) { + return ( + cardx != card && + getNum(cardx, player) == num && + cardx.hasGaintag("iriya_yinji_tag") + ); + }, "he") + ) + return 4 - get.value(card); break; - case '三张': - if(count>2) return 8-get.value(card); + case "三张": + if (count > 2) return 8 - get.value(card); break; - case '单顺': - if(num>10) return 0; - for(var i=1;i<5;i++){ - if(get.numOf(nums,num+i)<1) return 0; + case "单顺": + if (num > 10) return 0; + for (var i = 1; i < 5; i++) { + if (get.numOf(nums, num + i) < 1) return 0; } - return 9-get.value(card); - case '双顺': - if(count<2||num>12) return 0; - for(var i=1;i<3;i++){ - if(get.numOf(nums,num+i)<2) return 0; + return 9 - get.value(card); + case "双顺": + if (count < 2 || num > 12) return 0; + for (var i = 1; i < 3; i++) { + if (get.numOf(nums, num + i) < 2) return 0; } - return 9-get.value(card); - case '三顺': - if(count<3||num>13) return 0; - for(var i=1;i<2;i++){ - if(get.numOf(nums,num+i)<2) return 0; + return 9 - get.value(card); + case "三顺": + if (count < 3 || num > 13) return 0; + for (var i = 1; i < 2; i++) { + if (get.numOf(nums, num + i) < 2) return 0; } - return 12-get.value(card); + return 12 - get.value(card); } return 0; - } - else{ - switch(_status.event._iriya_haozhi_type){ - case '炸弹': - if(numu.length>=4) return 0; - if(num==numu[0]) return 15; + } else { + switch (_status.event._iriya_haozhi_type) { + case "炸弹": + if (numu.length >= 4) return 0; + if (num == numu[0]) return 15; return 0; - case '对子': - if(numu.length>=2) return 0; - if(num==numu[0]) return 3-get.value(card); + case "对子": + if (numu.length >= 2) return 0; + if (num == numu[0]) return 3 - get.value(card); return 0; - case '三张': - if(numu.length>=3) return 0; - if(num==numu[0]) return 9-get.value(card); + case "三张": + if (numu.length >= 3) return 0; + if (num == numu[0]) return 9 - get.value(card); return 0; - case '单顺': case '双顺': case '三顺': - var map={ - 单顺:[5,0], - 双顺:[3,1], - 三顺:[2,2], - },len=map[_status.event._iriya_haozhi_type][0],addNum=map[_status.event._iriya_haozhi_type][1]; - if(numu.length>=len) return 0; - var numt=numu[numu.length-1]+(numu.length%(1+addNum)==0?1:0); - if(num==numt) return 10+addNum-get.value(card); + case "单顺": + case "双顺": + case "三顺": + var map = { + 单顺: [5, 0], + 双顺: [3, 1], + 三顺: [2, 2], + }, + len = map[_status.event._iriya_haozhi_type][0], + addNum = map[_status.event._iriya_haozhi_type][1]; + if (numu.length >= len) return 0; + var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); + if (num == numt) return 10 + addNum - get.value(card); return 0; } } }, //响应AI - respondAI(card){ - if(!_status.event.goon) return 0; - var type=_status.event.type,player=_status.event.player; - var getNum=function(card,player){ - var num=get.number(card,player); - if(num<=2) return num+13; - return num; - },nums=player.getCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'iriya_haozhi'); - }).map(card=>getNum(card,player)); - var num=getNum(card,player); - if(!ui.selected.cards.length){ - var count=get.numOf(nums,num); - if(count>=4&&(type[0]!='炸弹'||num>type[1]||count>type[2])) return 15; - switch(type[0]){ - case '对子': - if(count>1&&num>type[1]) return 8-get.value(card); + respondAI(card) { + if (!_status.event.goon) return 0; + var type = _status.event.type, + player = _status.event.player; + var getNum = function (card, player) { + var num = get.number(card, player); + if (num <= 2) return num + 13; + return num; + }, + nums = player + .getCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "iriya_haozhi"); + }) + .map((card) => getNum(card, player)); + var num = getNum(card, player); + if (!ui.selected.cards.length) { + var count = get.numOf(nums, num); + if (count >= 4 && (type[0] != "炸弹" || num > type[1] || count > type[2])) return 15; + switch (type[0]) { + case "对子": + if (count > 1 && num > type[1]) return 8 - get.value(card); break; - case '三张': case '三带一': case '三带二': - if(count>2&&num>type[1]) return 9-get.value(card); + case "三张": + case "三带一": + case "三带二": + if (count > 2 && num > type[1]) return 9 - get.value(card); break; - case '单顺': - if(num<=type[1]||num>(15-type[2])) return 0; - for(var i=1;i 15 - type[2]) return 0; + for (var i = 1; i < type[2]; i++) { + if (get.numOf(nums, num + i) < 1) return 0; } - return 10-get.value(card); - case '双顺': - if(num<=type[1]||count<2||num>(15-type[2]/2)) return 0; - for(var i=1;i 15 - type[2] / 2) return 0; + for (var i = 1; i < type[2] / 2; i++) { + if (get.numOf(nums, num + i) < 2) return 0; } - return 11-get.value(card); - case '三顺': case '单带飞机': case '双带飞机': - var size=3+['三顺','单带飞机','双带飞机'].indexOf(type[0]); - if(num<=type[1]||count<3||num>(15-type[2]/size)) return 0; - for(var i=1;i 15 - type[2] / size) return 0; + for (var i = 1; i < type[2] / size; i++) { + if (get.numOf(nums, num + i) < 2) return 0; } - return 12-get.value(card); + return 12 - get.value(card); } return 0; - } - else{ - var numu=ui.selected.cards.map(card=>getNum(card,player)) - var numx=numu[0]; - if(num==numx){ - var count=get.numOf(nums,numx); - if(count>=4&&(type[0]!='炸弹'||num>type[1]||count>type[2])&&(numu.length<(type[0]=='炸弹'?type2:4))) return 15; + } else { + var numu = ui.selected.cards.map((card) => getNum(card, player)); + var numx = numu[0]; + if (num == numx) { + var count = get.numOf(nums, numx); + if ( + count >= 4 && + (type[0] != "炸弹" || num > type[1] || count > type[2]) && + numu.length < (type[0] == "炸弹" ? type2 : 4) + ) + return 15; } - switch(type[0]){ - case '对子': - if(numu.length>=2) return 0; - if(num==numu[0]) return 8-get.value(card); + switch (type[0]) { + case "对子": + if (numu.length >= 2) return 0; + if (num == numu[0]) return 8 - get.value(card); return 0; - case '三张': - if(numu.length>=3) return 0; - if(num==numu[0]) return 9-get.value(card); + case "三张": + if (numu.length >= 3) return 0; + if (num == numu[0]) return 9 - get.value(card); return 0; - case '三带一': - if(numu.length==3||num==numu[0]) return 9-get.value(card); + case "三带一": + if (numu.length == 3 || num == numu[0]) return 9 - get.value(card); return 0; - case '三带二': - if(numu.length>=5) return false; - if(numu.length==3){ - if(num==numu[0]||get.numOf(nums,num)<2) return 0; + case "三带二": + if (numu.length >= 5) return false; + if (numu.length == 3) { + if (num == numu[0] || get.numOf(nums, num) < 2) return 0; + } else if (numu.length == 4) { + return num == numu[3] ? 9 - get.value(card) : 0; } - else if(numu.length==4){ - return num==numu[3]?9-get.value(card):0; - } - if(num==numu[0]) return 9-get.value(card); + if (num == numu[0]) return 9 - get.value(card); return 0; - case '单顺': case '双顺': case '三顺': - if(numu.length>=type[2]) return 0; - var addNum=['单顺','双顺','三顺'].indexOf(type[0]); - var numt=numu[numu.length-1]+(numu.length%(1+addNum)==0?1:0); - if(num==numt) return 10+addNum-get.value(card); + case "单顺": + case "双顺": + case "三顺": + if (numu.length >= type[2]) return 0; + var addNum = ["单顺", "双顺", "三顺"].indexOf(type[0]); + var numt = numu[numu.length - 1] + (numu.length % (1 + addNum) == 0 ? 1 : 0); + if (num == numt) return 10 + addNum - get.value(card); return 0; - case '单带飞机': - if(numu.length>=type[2]) return 0; - var len=type[2]/4*3; - if(numu.length=numu[0]||num<=numu[len-1]) return 0; - return 12-get.value(card); + case "单带飞机": + if (numu.length >= type[2]) return 0; + var len = (type[2] / 4) * 3; + if (numu.length < len) { + var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); + if (num == numt) return 12 - get.value(card); + } else { + if (num >= numu[0] || num <= numu[len - 1]) return 0; + return 12 - get.value(card); } return 0; - case '双带飞机': - if(numu.length>=type[2]) return 0; - var len=type[2]/5*3; - if(numu.length= type[2]) return 0; + var len = (type[2] / 5) * 3; + if (numu.length < len) { + var numt = numu[numu.length - 1] + (numu.length % 3 == 0 ? 1 : 0); + if (num == numt) return 12 - get.value(card); + } else { + if ((numu.length - len) % 2 == 0) { + if (numu.includes(num) || get.numOf(nums, num) < 2) return 0; + return 12 - get.value(card); + } else { + return num == numu[numu.length - 1] ? 12 - get.value(card) : 0; } } return 0; } } }, - content(){ - 'step 0' - var players=game.filterPlayer().sortBySeat(player.getNext()); - event.players=players; - event.current=player; - event.current_type=lib.skill.iriya_haozhi.getType(cards,player); - event.current_cards=cards.slice(0); - if(!event.current_type) event.finish(); - 'step 1' - var target=event.players.shift(); - if((target!=player||event.current!=player)&&target.isIn()&&target.countCards('h')>=Math.min(cards.length,4)){ - event.target=target; - target.addTempSkill('iriya_haozhi_temp',{global:['discardBefore','chooseToDiscardEnd','phaseAfter']}); - var trans=get.translation(event.current); - var cardsn=function(cards,player){ - var getn=(card,player)=>{ - var num=get.number(card,player); - if(num<=2) return num+13; + content() { + "step 0"; + var players = game.filterPlayer().sortBySeat(player.getNext()); + event.players = players; + event.current = player; + event.current_type = lib.skill.iriya_haozhi.getType(cards, player); + event.current_cards = cards.slice(0); + if (!event.current_type) event.finish(); + ("step 1"); + var target = event.players.shift(); + if ( + (target != player || event.current != player) && + target.isIn() && + target.countCards("h") >= Math.min(cards.length, 4) + ) { + event.target = target; + target.addTempSkill("iriya_haozhi_temp", { + global: ["discardBefore", "chooseToDiscardEnd", "phaseAfter"], + }); + var trans = get.translation(event.current); + var cardsn = (function (cards, player) { + var getn = (card, player) => { + var num = get.number(card, player); + if (num <= 2) return num + 13; return num; }; - cards.sort(function(a,b){ - var numa=getn(a,player),numb=getn(b,player); - if(numa!=numb) return numa-numb; - return lib.suit.indexOf(get.suit(a,player)-get.suit(b,player)); + cards.sort(function (a, b) { + var numa = getn(a, player), + numb = getn(b, player); + if (numa != numb) return numa - numb; + return lib.suit.indexOf(get.suit(a, player) - get.suit(b, player)); }); - var str=''; - for(var i of cards){ - str+=','; - str+=get.strNumber(get.number(i,player)); - str+=get.translation(get.suit(i,player)); + var str = ""; + for (var i of cards) { + str += ","; + str += get.strNumber(get.number(i, player)); + str += get.translation(get.suit(i, player)); } return str.slice(1); - }(event.current_cards,event.current); - var next=target.chooseToDiscard( - '是否响应'+trans+'的'+get.translation(event.current_type[0])+'?', - trans+'的牌组为'+cardsn+'。您此时可以点击“整理手牌”,将手牌按点数排序。',[2,Infinity],'he'); - next.set('type',event.current_type); - next.set('filterOk',function(){ - var type=lib.skill.iriya_haozhi.getType(ui.selected.cards,_status.event.player); - if(!type) return false; - var ptype=_status.event.type; - if(type[0]=='炸弹'){ - if(ptype[0]=='炸弹'){ - if(type[2]>ptype[2]) return true; - return type[1]>ptype[1]&&type[2]==ptype[2]; + })(event.current_cards, event.current); + var next = target.chooseToDiscard( + "是否响应" + trans + "的" + get.translation(event.current_type[0]) + "?", + trans + "的牌组为" + cardsn + "。您此时可以点击“整理手牌”,将手牌按点数排序。", + [2, Infinity], + "he" + ); + next.set("type", event.current_type); + next.set("filterOk", function () { + var type = lib.skill.iriya_haozhi.getType( + ui.selected.cards, + _status.event.player + ); + if (!type) return false; + var ptype = _status.event.type; + if (type[0] == "炸弹") { + if (ptype[0] == "炸弹") { + if (type[2] > ptype[2]) return true; + return type[1] > ptype[1] && type[2] == ptype[2]; } return true; } - return type[0]==ptype[0]&&type[2]==ptype[2]&&type[1]>ptype[1]; + return type[0] == ptype[0] && type[2] == ptype[2] && type[1] > ptype[1]; }); - next.set('goon',get.attitude(target,event.current)<0); - next.set('ai',lib.skill.iriya_haozhi.respondAI); - } - else if(event.players.length>0) event.redo(); + next.set("goon", get.attitude(target, event.current) < 0); + next.set("ai", lib.skill.iriya_haozhi.respondAI); + } else if (event.players.length > 0) event.redo(); else event.goto(3); - 'step 2' - if(result.bool){ - event.current=target; - event.current_type=lib.skill.iriya_haozhi.getType(result.cards.slice(0),target); - event.current_cards=result.cards.slice(0); - if(!event.current_type) event.finish(); + ("step 2"); + if (result.bool) { + event.current = target; + event.current_type = lib.skill.iriya_haozhi.getType(result.cards.slice(0), target); + event.current_cards = result.cards.slice(0); + if (!event.current_type) event.finish(); event.current.addExpose(0.5); } - if(event.players.length>0) event.goto(1); - 'step 3' - var current=event.current,type=0; - if(!current.isIn()) return; - switch(event.current_type[0]){ - case '对子': - type=1;break; - case '三张': case '三带一': case '三带二': - type=2;break; - case '单顺': - type=3;break; - case '双顺': - type=4;break; - case '三顺': case '单带飞机': case '双带飞机': - type=5;break; - case '炸弹': case'四带二': - type=6;break; + if (event.players.length > 0) event.goto(1); + ("step 3"); + var current = event.current, + type = 0; + if (!current.isIn()) return; + switch (event.current_type[0]) { + case "对子": + type = 1; + break; + case "三张": + case "三带一": + case "三带二": + type = 2; + break; + case "单顺": + type = 3; + break; + case "双顺": + type = 4; + break; + case "三顺": + case "单带飞机": + case "双带飞机": + type = 5; + break; + case "炸弹": + case "四带二": + type = 6; + break; } /*if(type==2){ current.addSkill('iriya_haozhi_extra'); current.addMark('iriya_haozhi_extra',1,false); } else */ - if(type>0){ - var next=game.createEvent('iriya_haozhi_effect',false); - next.player=current; - next.setContent(lib.skill.iriya_haozhi['content'+type]); + if (type > 0) { + var next = game.createEvent("iriya_haozhi_effect", false); + next.player = current; + next.setContent(lib.skill.iriya_haozhi["content" + type]); } }, - content1(){ - 'step 0' - player.chooseTarget([1,2],'是否令至多两名角色各摸一张牌?').set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) att/=10; - return att; - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); + content1() { + "step 0"; + player + .chooseTarget([1, 2], "是否令至多两名角色各摸一张牌?") + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); player.line(targets); game.asyncDraw(targets); game.delayex(); } }, - content2(){ - 'step 0' - player.chooseTarget([1,3],'是否弃置至多三名角色的各一张牌?',function(card,player,target){ - return target!=player&&target.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,target); - },'he') - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.line(targets,'green'); - for(var target of targets){ - player.discardPlayerCard(target,true,'he'); + content2() { + "step 0"; + player + .chooseTarget( + [1, 3], + "是否弃置至多三名角色的各一张牌?", + function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var target of targets) { + player.discardPlayerCard(target, true, "he"); } } - 'step 2' + ("step 2"); //player.recover(); player.draw(); }, - content3(){ - 'step 0' - event.count=0; - 'step 1' - var next=player.chooseTarget('是否弃置一名其他角色的一张牌?',function(card,player,target){ - return target!=player&&target.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,target); - },'he'); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player); - }); - if(event.color) next.set('prompt2','若你弃置的牌为'+get.translation(event.color)+',则你可以重复此流程'); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - player.discardPlayerCard(target,true,'he'); - } - else event.goto(4); - 'step 3' - if(result.bool){ + content3() { + "step 0"; + event.count = 0; + ("step 1"); + var next = player + .chooseTarget("是否弃置一名其他角色的一张牌?", function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + if (event.color) + next.set( + "prompt2", + "若你弃置的牌为" + get.translation(event.color) + ",则你可以重复此流程" + ); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.discardPlayerCard(target, true, "he"); + } else event.goto(4); + ("step 3"); + if (result.bool) { event.count++; - var card=result.cards[0],color=get.color(card,false); - if(!event.color){ - event.color=color; + var card = result.cards[0], + color = get.color(card, false); + if (!event.color) { + event.color = color; event.goto(1); - } - else if(color==event.color) event.goto(1); + } else if (color == event.color) event.goto(1); } - 'step 4' - if(event.count>0) player.draw(event.count); + ("step 4"); + if (event.count > 0) player.draw(event.count); }, - content4(){ - 'step 0' - event.count=0; - 'step 1' - var next=player.chooseTarget('是否获得一名其他角色的一张牌?',function(card,player,target){ - return target!=player&&target.hasCard(function(card){ - return lib.filter.canBeGained(card,player,target); - },'he'); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'shunshou_copy2'},player,player); - }); - if(event.color) next.set('prompt2','若你得到的牌为'+get.translation(event.color)+',则你可以重复此流程'); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - player.gainPlayerCard(target,true,'he'); - } - else event.goto(4); - 'step 3' - if(result.bool){ + content4() { + "step 0"; + event.count = 0; + ("step 1"); + var next = player + .chooseTarget("是否获得一名其他角色的一张牌?", function (card, player, target) { + return ( + target != player && + target.hasCard(function (card) { + return lib.filter.canBeGained(card, player, target); + }, "he") + ); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }); + if (event.color) + next.set( + "prompt2", + "若你得到的牌为" + get.translation(event.color) + ",则你可以重复此流程" + ); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.gainPlayerCard(target, true, "he"); + } else event.goto(4); + ("step 3"); + if (result.bool) { event.count++; - var card=result.cards[0],color=get.color(card,false); - if(!event.color){ - event.color=color; + var card = result.cards[0], + color = get.color(card, false); + if (!event.color) { + event.color = color; event.goto(1); - } - else if(color==event.color) event.goto(1); + } else if (color == event.color) event.goto(1); //player.draw(); } - 'step 4' - if(event.count>0) player.recover(event.count); + ("step 4"); + if (event.count > 0) player.recover(event.count); }, - content5(){ - 'step 0' - player.chooseTarget([1,3],'是否令至多三名其他角色翻面?',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.isTurnedOver()) return 10*att; - return -6*att; - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.line(targets,'thunder'); - event.targets=targets; - for(var target of targets) target.turnOver(); + content5() { + "step 0"; + player + .chooseTarget([1, 3], "是否令至多三名其他角色翻面?", lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) return 10 * att; + return -6 * att; + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "thunder"); + event.targets = targets; + for (var target of targets) target.turnOver(); } - 'step 2' - player.chooseTarget('是否对一名目标角色造成1点火属性伤害?',function(card,player,target){ - return _status.event.getParent().targets.includes(target); - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player,'fire'); - }); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - target.damage('fire'); + ("step 2"); + player + .chooseTarget( + "是否对一名目标角色造成1点火属性伤害?", + function (card, player, target) { + return _status.event.getParent().targets.includes(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "fire"); + }); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + target.damage("fire"); } }, - content6(){ - 'step 0' - player.chooseTarget('是否对一名其他角色进行核打击?','你对该角色造成2点雷属性伤害,然后该角色翻面,弃置装备区内的所有牌和四张手牌。',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.isTurnedOver()) return -6*att*Math.sqrt(2+target.countCards('he')); - return -att*Math.sqrt(2+target.countCards('he')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'thunder'); - target.damage('thunder',2); + content6() { + "step 0"; + player + .chooseTarget( + "是否对一名其他角色进行核打击?", + "你对该角色造成2点雷属性伤害,然后该角色翻面,弃置装备区内的所有牌和四张手牌。", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) + return -6 * att * Math.sqrt(2 + target.countCards("he")); + return -att * Math.sqrt(2 + target.countCards("he")); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "thunder"); + target.damage("thunder", 2); target.turnOver(); - } - else event.finish(); - 'step 2' - var num=target.countCards('e'); - if(num>0) target.chooseToDiscard('e',true,num); - 'step 3' - var num=target.countCards('h'); - if(num>0) target.chooseToDiscard('h',true,Math.min(4,num)); + } else event.finish(); + ("step 2"); + var num = target.countCards("e"); + if (num > 0) target.chooseToDiscard("e", true, num); + ("step 3"); + var num = target.countCards("h"); + if (num > 0) target.chooseToDiscard("h", true, Math.min(4, num)); }, - ai:{ - sortCardByNum:true, - order:13, - result:{ - player:1, + ai: { + sortCardByNum: true, + order: 13, + result: { + player: 1, }, }, - subSkill:{ - extra:{ - charlotte:true, - mod:{ - targetInRange:()=>true, - cardUsable:()=>Infinity, + subSkill: { + extra: { + charlotte: true, + mod: { + targetInRange: () => true, + cardUsable: () => Infinity, }, - trigger:{player:'useCard2'}, - forced:true, - onremove:true, - content(){ - 'step 0' - var num=player.countMark('iriya_haozhi_extra'); - player.removeSkill('iriya_haozhi_extra'); - var card=trigger.card; - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat().card; - if(stat[card.name]&&stat[card.name]>0) stat[card.name]--; + trigger: { player: "useCard2" }, + forced: true, + onremove: true, + content() { + "step 0"; + var num = player.countMark("iriya_haozhi_extra"); + player.removeSkill("iriya_haozhi_extra"); + var card = trigger.card; + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card; + if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; } - var info=get.info(card); - if(info.allowMultiple==false) event.finish(); - if(trigger.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current); - })){ - var prompt2='为'+get.translation(card)+'增加'+(num>1?'至多':'')+get.cnNumber(num)+'个目标' - player.chooseTarget(get.prompt('iriya_haozhi_extra'),[1,num],function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); + var info = get.info(card); + if (info.allowMultiple == false) event.finish(); + if (trigger.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { + var prompt2 = + "为" + + get.translation(card) + + "增加" + + (num > 1 ? "至多" : "") + + get.cnNumber(num) + + "个目标"; + player + .chooseTarget( + get.prompt("iriya_haozhi_extra"), + [1, num], + function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2( + _status.event.card, + player, + target + ) + ); + } + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); } } - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('iriya_haozhi_extra',event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("iriya_haozhi_extra", event.targets); trigger.targets.addArray(event.targets); } }, - intro:{content:'使用下一张牌无距离和次数限制,且可以增加#个目标'}, + intro: { + content: "使用下一张牌无距离和次数限制,且可以增加#个目标", + }, + }, + temp: { + ai: { sortCardByNum: true }, + charlotte: true, }, - temp:{ - ai:{sortCardByNum:true}, - charlotte:true, - } }, }, //远野美凪&远野小满 - minagi_peiquan:{ - enable:'phaseUse', - filter(event,player){ - return player.hasCard((card)=>card.hasGaintag('minagi_tag'),'h'); + minagi_peiquan: { + enable: "phaseUse", + filter(event, player) { + return player.hasCard((card) => card.hasGaintag("minagi_tag"), "h"); }, - filterCard(card){ - return card.hasGaintag('minagi_tag'); + filterCard(card) { + return card.hasGaintag("minagi_tag"); }, - position:'h', - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - promptfunc:()=>'出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。', - check:card=>{ - const player=_status.event.player; - return get.type(card,false)=='equip'&&game.hasPlayer(current=>player.canGift(card,current,true)&&!current.refuseGifts(card,player)&&get.effect(current,card,player,player)>0)?2:1+Math.random(); + position: "h", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + promptfunc: () => + "出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。", + check: (card) => { + const player = _status.event.player; + return get.type(card, false) == "equip" && + game.hasPlayer( + (current) => + player.canGift(card, current, true) && + !current.refuseGifts(card, player) && + get.effect(current, card, player, player) > 0 + ) + ? 2 + : 1 + Math.random(); }, - content(){ - 'step 0' - player.gift(cards,target); - 'step 1' - var list=player.getStorage('minagi_peiquan_yukito'); - if(list.length>=4) event.finish(); - else{ - var yukito=get.translation(target); - player.chooseButton([ - '配券:请选择一项执行', - [[ - ['damage','选项一:对'+yukito+'造成1点伤害'], - ['draw','选项二:摸两张牌'], - ['discard','选项三:弃置'+yukito+'的两张牌'], - ['use','选项四:亮出牌堆顶的一张牌,然后可以使用之'], - ],'textbutton'] - ],true).set('list',list).set('filterButton',function(button){ - return !_status.event.list.includes(button.link); - }).set('ai',function(button){ - var player=_status.event.player,target=_status.event.getParent().target; - switch(button.link){ - case 'damage':return get.damageEffect(target,player,player); - case 'draw':return 2*get.effect(player,{name:'draw'},player,player) - case 'discard':return get.effect(target,{name:'guohe_copy2'},player,player)*Math.min(1.6,target.countCards('he')); - case 'use':return _status.event.getRand('minagi_peiquan')*4; - } - }); + content() { + "step 0"; + player.gift(cards, target); + ("step 1"); + var list = player.getStorage("minagi_peiquan_yukito"); + if (list.length >= 4) event.finish(); + else { + var yukito = get.translation(target); + player + .chooseButton( + [ + "配券:请选择一项执行", + [ + [ + ["damage", "选项一:对" + yukito + "造成1点伤害"], + ["draw", "选项二:摸两张牌"], + ["discard", "选项三:弃置" + yukito + "的两张牌"], + ["use", "选项四:亮出牌堆顶的一张牌,然后可以使用之"], + ], + "textbutton", + ], + ], + true + ) + .set("list", list) + .set("filterButton", function (button) { + return !_status.event.list.includes(button.link); + }) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + switch (button.link) { + case "damage": + return get.damageEffect(target, player, player); + case "draw": + return 2 * get.effect(player, { name: "draw" }, player, player); + case "discard": + return ( + get.effect(target, { name: "guohe_copy2" }, player, player) * + Math.min(1.6, target.countCards("he")) + ); + case "use": + return _status.event.getRand("minagi_peiquan") * 4; + } + }); } - 'step 2' - player.markAuto('minagi_peiquan_yukito',result.links); - player.addTempSkill('minagi_peiquan_yukito'); - switch(result.links[0]){ - case 'damage':target.damage('nocard');break; - case 'draw':player.draw(2);break; - case 'discard':player.discardPlayerCard(target,2,'he',true);break; + ("step 2"); + player.markAuto("minagi_peiquan_yukito", result.links); + player.addTempSkill("minagi_peiquan_yukito"); + switch (result.links[0]) { + case "damage": + target.damage("nocard"); + break; + case "draw": + player.draw(2); + break; + case "discard": + player.discardPlayerCard(target, 2, "he", true); + break; } - if(result.links[0]!='use') event.finish(); - 'step 3' - var card=get.cards()[0]; + if (result.links[0] != "use") event.finish(); + ("step 3"); + var card = get.cards()[0]; game.cardsGotoOrdering(card); player.showCards(card); - player.chooseUseTarget(card,'是否使用'+get.translation(card)+'?'); + player.chooseUseTarget(card, "是否使用" + get.translation(card) + "?"); }, - ai:{ - order:4, - result:{ - player:(player,target)=>{ - const giftEffects=ui.selected.cards.map(value=>player.getGiftEffect(value,target)); - const baseEffect=Math.min(3,giftEffects.reduce((previousValue,currentValue)=>previousValue+currentValue,0)/giftEffects.length); - const choices=['damage','draw','discard','use']; - choices.removeArray(player.getStorage('minagi_peiquan_yukito')); - if(choices.length<=0) return baseEffect; - return baseEffect+Math.max(...choices.map(choice=>{ - switch(choice){ - case 'damage':return get.damageEffect(target,player,player); - case 'draw':return 2*get.effect(player,{name:'draw'},player,player); - case 'discard':return get.effect(target,{name:'guohe_copy2'},player,player)*Math.min(1.6,target.countCards('he')); - case 'use':return _status.event.getRand('minagi_peiquan')*4; - } - })); - } - } + ai: { + order: 4, + result: { + player: (player, target) => { + const giftEffects = ui.selected.cards.map((value) => + player.getGiftEffect(value, target) + ); + const baseEffect = Math.min( + 3, + giftEffects.reduce( + (previousValue, currentValue) => previousValue + currentValue, + 0 + ) / giftEffects.length + ); + const choices = ["damage", "draw", "discard", "use"]; + choices.removeArray(player.getStorage("minagi_peiquan_yukito")); + if (choices.length <= 0) return baseEffect; + return ( + baseEffect + + Math.max( + ...choices.map((choice) => { + switch (choice) { + case "damage": + return get.damageEffect(target, player, player); + case "draw": + return ( + 2 * get.effect(player, { name: "draw" }, player, player) + ); + case "discard": + return ( + get.effect( + target, + { name: "guohe_copy2" }, + player, + player + ) * Math.min(1.6, target.countCards("he")) + ); + case "use": + return _status.event.getRand("minagi_peiquan") * 4; + } + }) + ) + ); + }, + }, }, - group:'minagi_peiquan_umareta', - subSkill:{ - yukito:{charlotte:true,onremove:true}, - umareta:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + group: "minagi_peiquan_umareta", + subSkill: { + yukito: { charlotte: true, onremove: true }, + umareta: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.countCards('h')>0; + forced: true, + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0 + ); }, - content(){ - var hs=player.getCards('h'); - player.addGaintag(hs,'minagi_tag'); + content() { + var hs = player.getCards("h"); + player.addGaintag(hs, "minagi_tag"); }, }, }, }, - minagi_huanliu:{ - trigger:{player:'phaseZhunbeiBegin'}, - async cost(event,trigger,player){ - event.result = await player.chooseTarget(lib.filter.notMe,get.prompt('minagi_huanliu'),'和一名其他角色进行“协力”,并获得“远野小满”的所有对应技能').set('ai',function(target){ - return get.threaten(target)*Math.sqrt(1+target.countCards('h'))*((target.isTurnedOver()||target.hasJudge('lebu'))?0.1:1); - }).forResult(); + minagi_huanliu: { + trigger: { player: "phaseZhunbeiBegin" }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + lib.filter.notMe, + get.prompt("minagi_huanliu"), + "和一名其他角色进行“协力”,并获得“远野小满”的所有对应技能" + ) + .set("ai", function (target) { + return ( + get.threaten(target) * + Math.sqrt(1 + target.countCards("h")) * + (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1) + ); + }) + .forResult(); }, - content(){ - 'step 0' - var target=targets[0]; - player.chooseCooperationFor(target,'minagi_huanliu').set('ai',function(button){ - var base=0; - switch(button.link){ - case 'cooperation_damage':base=0.1;break; - case 'cooperation_draw':base=0.6;break; - case 'cooperation_discard':base=0.1;break; - case 'cooperation_use':base=0.3;break; + content() { + "step 0"; + var target = targets[0]; + player.chooseCooperationFor(target, "minagi_huanliu").set("ai", function (button) { + var base = 0; + switch (button.link) { + case "cooperation_damage": + base = 0.1; + break; + case "cooperation_draw": + base = 0.6; + break; + case "cooperation_discard": + base = 0.1; + break; + case "cooperation_use": + base = 0.3; + break; } - return base+Math.random(); + return base + Math.random(); }); - player.addAdditionalSkill('cooperation',['minagi_huanliu_effect','michiru_sheyuan']); - 'step 1' + player.addAdditionalSkill("cooperation", ["minagi_huanliu_effect", "michiru_sheyuan"]); + ("step 1"); game.delayx(); }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{global:'phaseJieshuBegin'}, - forced:true, - logTarget:'player', - filter(event,player){ - return player.checkCooperationStatus(event.player,'minagi_huanliu')&&player.countCards('h')>0; + subSkill: { + effect: { + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + logTarget: "player", + filter(event, player) { + return ( + player.checkCooperationStatus(event.player, "minagi_huanliu") && + player.countCards("h") > 0 + ); }, - content(){ - game.log(player,'和',trigger.player,'的协力成功'); - var hs=player.getCards('h'); - player.addGaintag(hs,'minagi_tag'); + content() { + game.log(player, "和", trigger.player, "的协力成功"); + var hs = player.getCards("h"); + player.addGaintag(hs, "minagi_tag"); game.delayx(); }, }, }, - derivation:'michiru_sheyuan', + derivation: "michiru_sheyuan", }, - michiru_sheyuan:{ - charlotte:true, - enable:'chooseToUse', - filter(event,player){ - if(player.hasSkill('michiru_sheyuan_round')) return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of hs){ - if(i.hasGaintag('minagi_tag')) return false; - if(!game.checkMod(i,player,'unchanged','cardEnabled2',player)) return false; + michiru_sheyuan: { + charlotte: true, + enable: "chooseToUse", + filter(event, player) { + if (player.hasSkill("michiru_sheyuan_round")) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (i.hasGaintag("minagi_tag")) return false; + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; } - for(var name of lib.inpile){ - var type=get.type(name); - if(type!='basic'&&type!='trick') return false; - var card=get.autoViewAs({name:name},hs) - if(event.filterCard(card,player,event)) return true; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) return true; + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "basic" && type != "trick") return false; + var card = get.autoViewAs({ name: name }, hs); + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; } } } return false; }, - hiddenCard(player,name){ - var type=get.type(name); - if(type!='basic'&&type!='trick') return false; - if(player.hasSkill('michiru_sheyuan_round')) return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - if(_status.connectMode) return true; - for(var i of hs){ - if(i.hasGaintag('minagi_tag')) return false; - if(!game.checkMod(i,player,'unchanged','cardEnabled2',player)) return false; + hiddenCard(player, name) { + var type = get.type(name); + if (type != "basic" && type != "trick") return false; + if (player.hasSkill("michiru_sheyuan_round")) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + if (_status.connectMode) return true; + for (var i of hs) { + if (i.hasGaintag("minagi_tag")) return false; + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; } return true; }, - chooseButton:{ - dialog(event,player){ - var list=[],hs=player.getCards('h'); - for(var name of lib.inpile){ - var type=get.type(name); - if(type!='basic'&&type!='trick') continue; - var card=get.autoViewAs({name:name},hs); - if(event.filterCard(card,player,event)) list.push([type,'',name]); - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) list.push([type,'',name,nature]); + chooseButton: { + dialog(event, player) { + var list = [], + hs = player.getCards("h"); + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "basic" && type != "trick") continue; + var card = get.autoViewAs({ name: name }, hs); + if (event.filterCard(card, player, event)) list.push([type, "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) + list.push([type, "", name, nature]); } } } - return ui.create.dialog('舍愿',[list,'vcard'],'hidden'); + return ui.create.dialog("舍愿", [list, "vcard"], "hidden"); }, - check(button){ - var player=_status.event.player; - var card={ - name:button.link[2], - nature:button.link[3], + check(button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], }; - if(_status.event.getParent().type=='phase') return player.getUseValue(card,null,true); + if (_status.event.getParent().type == "phase") + return player.getUseValue(card, null, true); return 1; }, - backup(links,player){ + backup(links, player) { return { - viewAs:{ - name:links[0][2], - nature:links[0][3], + viewAs: { + name: links[0][2], + nature: links[0][3], }, - filterCard:true, - position:'h', - selectCard:-1, - onuse(result,player){ - player.addTempSkill('michiru_sheyuan_round','roundStart'); + filterCard: true, + position: "h", + selectCard: -1, + onuse(result, player) { + player.addTempSkill("michiru_sheyuan_round", "roundStart"); }, - } + }; }, - prompt(links,player){ - return '将所有手牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用,然后摸等量的牌'; + prompt(links, player) { + return ( + "将所有手牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用,然后摸等量的牌" + ); }, }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player,tag,arg){ - return lib.skill.michiru_sheyuan.hiddenCard(player,'s'+tag.slice(8)); + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + return lib.skill.michiru_sheyuan.hiddenCard(player, "s" + tag.slice(8)); }, - order:1, - result:{ - player(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + order: 1, + result: { + player(player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, - subSkill:{ - round:{ - charlotte:true, - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - filter(event,player){ - return event.skill=='michiru_sheyuan_backup'; + subSkill: { + round: { + charlotte: true, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "michiru_sheyuan_backup"; }, - content(){ + content() { player.draw(trigger.cards.length); }, }, - backup:{}, + backup: {}, }, }, //坂上智代 - tomoyo_wuwei:{ - enable:['chooseToUse','chooseToRespond'], - viewAs:{name:'sha'}, - viewAsFilter(player){ - var storage=player.getStorage('tomoyo_wuwei_mark'); - return player.hasCard(function(card){ + tomoyo_wuwei: { + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "sha" }, + viewAsFilter(player) { + var storage = player.getStorage("tomoyo_wuwei_mark"); + return player.hasCard(function (card) { return !storage.includes(get.suit(card)); - },'hs'); + }, "hs"); }, - position:'hs', - filterCard(card,player){ - var storage=player.getStorage('tomoyo_wuwei_mark'); + position: "hs", + filterCard(card, player) { + var storage = player.getStorage("tomoyo_wuwei_mark"); return !storage.includes(get.suit(card)); }, - check(card){ - return 5-get.value(card); + check(card) { + return 5 - get.value(card); }, - onuse(result,player){ - player.markAuto('tomoyo_wuwei_mark',[get.suit(result.card,false)]); - player.addTempSkill('tomoyo_wuwei_mark'); + onuse(result, player) { + player.markAuto("tomoyo_wuwei_mark", [get.suit(result.card, false)]); + player.addTempSkill("tomoyo_wuwei_mark"); }, - onrespond(event,player){ - player.markAuto('tomoyo_wuwei_mark',[get.suit(event.card,false)]); - player.addTempSkill('tomoyo_wuwei_mark'); + onrespond(event, player) { + player.markAuto("tomoyo_wuwei_mark", [get.suit(event.card, false)]); + player.addTempSkill("tomoyo_wuwei_mark"); }, - group:'tomoyo_wuwei_combo', - subSkill:{ - mark:{ - charlotte:true, - onremove:true, + group: "tomoyo_wuwei_combo", + subSkill: { + mark: { + charlotte: true, + onremove: true, }, - combo:{ - trigger:{global:'useCardAfter'}, - direct:true, + combo: { + trigger: { global: "useCardAfter" }, + direct: true, //chooseToUse类技能暂时没办法改 - filter(event,player){ - return event.card.name=='shan'&&player.inRangeOf(event.player)&&player.canUse('sha',event.player,false); + filter(event, player) { + return ( + event.card.name == "shan" && + player.inRangeOf(event.player) && + player.canUse("sha", event.player, false) + ); }, - content(){ - player.chooseToUse('武威:是否对'+get.translation(trigger.player)+'使用一张【杀】?',function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },trigger.player,-1).set('addCount',false).logSkill='tomoyo_wuwei_combo'; + content() { + player + .chooseToUse( + "武威:是否对" + get.translation(trigger.player) + "使用一张【杀】?", + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + trigger.player, + -1 + ) + .set("addCount", false).logSkill = "tomoyo_wuwei_combo"; }, }, }, }, - tomoyo_zhengfeng:{ - dutySkill:true, - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - return game.hasPlayer((current)=>player.inRange(current)); + tomoyo_zhengfeng: { + dutySkill: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return game.hasPlayer((current) => player.inRange(current)); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt('tomoyo_zhengfeng'),'令一名攻击范围内的角色进行判定。其于你的下回合开始前使用与判定结果颜色相同的牌时,你摸一张牌。',function(card,player,target){ - return player.inRange(target); - }).set('ai',function(target){ - var player=_status.event.player; - if(player.hp<=1&&!player.countCards('h')) return 0; - var hs=target.countCards('h'),thr=get.threaten(target); - if(target.hasJudge('lebu')) return 0; - return Math.sqrt(1+hs)*Math.sqrt(Math.max(1,1+thr)); - }).forResult() + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("tomoyo_zhengfeng"), + "令一名攻击范围内的角色进行判定。其于你的下回合开始前使用与判定结果颜色相同的牌时,你摸一张牌。", + function (card, player, target) { + return player.inRange(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hp <= 1 && !player.countCards("h")) return 0; + var hs = target.countCards("h"), + thr = get.threaten(target); + if (target.hasJudge("lebu")) return 0; + return Math.sqrt(1 + hs) * Math.sqrt(Math.max(1, 1 + thr)); + }) + .forResult(); }, - content(){ - 'step 0' + content() { + "step 0"; var target = targets[0]; event.target = target; target.judge(); - 'step 1' - player.addTempSkill('tomoyo_zhengfeng_tomoyo',{player:'phaseBeginStart'}); - player.markAuto('tomoyo_zhengfeng_tomoyo',[{ - target:target, - color:result.color, - }]); + ("step 1"); + player.addTempSkill("tomoyo_zhengfeng_tomoyo", { + player: "phaseBeginStart", + }); + player.markAuto("tomoyo_zhengfeng_tomoyo", [ + { + target: target, + color: result.color, + }, + ]); }, - group:'tomoyo_zhengfeng_after', - subSkill:{ - tomoyo:{ - charlotte:true, - onremove:true, - mod:{ - inRangeOf(source,player){ - var list=player.getStorage('tomoyo_zhengfeng_tomoyo'); - for(var obj of list){ - if(obj.target==source) return true; + group: "tomoyo_zhengfeng_after", + subSkill: { + tomoyo: { + charlotte: true, + onremove: true, + mod: { + inRangeOf(source, player) { + var list = player.getStorage("tomoyo_zhengfeng_tomoyo"); + for (var obj of list) { + if (obj.target == source) return true; } }, }, - trigger:{global:'useCard'}, - forced:true, - filter(event,player){ - var color=get.color(event.card); - if(color=='none') return false; - var list=player.getStorage('tomoyo_zhengfeng_tomoyo'); - for(var obj of list){ - if(obj.target==event.player&&color==obj.color) return true; + trigger: { global: "useCard" }, + forced: true, + filter(event, player) { + var color = get.color(event.card); + if (color == "none") return false; + var list = player.getStorage("tomoyo_zhengfeng_tomoyo"); + for (var obj of list) { + if (obj.target == event.player && color == obj.color) return true; } return false; }, - content(){ + content() { player.draw(); }, - intro:{ - mark(dialog,students,player){ - if(!students||!students.length) return '全校风纪良好!'; - var str=''; - for(var i of students){ - if(str.length>0) str+='
    '; - str+=get.translation(i.target); - str+=':'; - str+=get.translation(i.color); + intro: { + mark(dialog, students, player) { + if (!students || !students.length) return "全校风纪良好!"; + var str = ""; + for (var i of students) { + if (str.length > 0) str += "
    "; + str += get.translation(i.target); + str += ":"; + str += get.translation(i.color); } dialog.addText(str); }, }, }, - after:{ - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return !player.hasHistory('useSkill',function(evt){ - return evt.skill=='tomoyo_zhengfeng'; + after: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return !player.hasHistory("useSkill", function (evt) { + return evt.skill == "tomoyo_zhengfeng"; }); }, - prompt:'整风:是否放弃使命?', - prompt2:'你可以减1点体力上限并失去〖武威〗,摸两张牌并回复1点体力,然后获得技能〖长誓〗。', - skillAnimation:true, - animationColor:'gray', - check(event,player){ - return (player.hp*1.1+player.countCards('h'))<3; + prompt: "整风:是否放弃使命?", + prompt2: + "你可以减1点体力上限并失去〖武威〗,摸两张牌并回复1点体力,然后获得技能〖长誓〗。", + skillAnimation: true, + animationColor: "gray", + check(event, player) { + return player.hp * 1.1 + player.countCards("h") < 3; }, - content(){ - 'step 0' - game.log(player,'放弃了身为学生会长的使命'); - player.awakenSkill('tomoyo_zhengfeng'); + content() { + "step 0"; + game.log(player, "放弃了身为学生会长的使命"); + player.awakenSkill("tomoyo_zhengfeng"); player.loseMaxHp(); - 'step 1' - player.removeSkills('tomoyo_wuwei'); - 'step 2' + ("step 1"); + player.removeSkills("tomoyo_wuwei"); + ("step 2"); player.draw(2); player.recover(); - 'step 3' - player.addSkills('tomoyo_changshi'); + ("step 3"); + player.addSkills("tomoyo_changshi"); }, }, }, }, - tomoyo_changshi:{ - trigger:{ - global:['gainAfter','loseAsyncAfter'], + tomoyo_changshi: { + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - forced:true, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&event.getg(current).length>1&&player.inRangeOf(current); + forced: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && event.getg(current).length > 1 && player.inRangeOf(current) + ); }); }, - content(){ + content() { player.draw(); }, - group:'tomoyo_changshi_recover', - subSkill:{ - recover:{ - trigger:{global:'recoverAfter'}, - forced:true, - filter(event,player){ - return event.player.isAlive()&&player.inRangeOf(event.player); + group: "tomoyo_changshi_recover", + subSkill: { + recover: { + trigger: { global: "recoverAfter" }, + forced: true, + filter(event, player) { + return event.player.isAlive() && player.inRangeOf(event.player); }, - content(){ + content() { player.changeHujia(1); }, }, }, }, //天宫希优 - kiyu_yuling:{ - mod:{ - targetEnabled(card){ - var info=get.info(card); - if(!info||(info.type!='trick'&&info.type!='delay')) return; - if(info.range) return false; + kiyu_yuling: { + mod: { + targetEnabled(card) { + var info = get.info(card); + if (!info || (info.type != "trick" && info.type != "delay")) return; + if (info.range) return false; }, }, - trigger:{target:'useCardToTargeted'}, - forced:true, - charlotte:true, - filter(event,player){ - return event.card.name=='sha'&&event.player.countCards('he')>0; + trigger: { target: "useCardToTargeted" }, + forced: true, + charlotte: true, + filter(event, player) { + return event.card.name == "sha" && event.player.countCards("he") > 0; }, - logTarget:'player', - content(){ - trigger.player.chooseToDiscard('he',true,get.distance(trigger.player,player)); + logTarget: "player", + content() { + trigger.player.chooseToDiscard("he", true, get.distance(trigger.player, player)); }, - ai:{ - threaten:0.7, - effect:{ - target(card,player,target,current){ - if(card.name=='sha') return 0.7; + ai: { + threaten: 0.7, + effect: { + target(card, player, target, current) { + if (card.name == "sha") return 0.7; }, }, }, }, - kiyu_rexianyu:{ - trigger:{player:'phaseUseEnd'}, - charlotte:true, - unique:true, - filter(event,player){ - return !player.hasSkill('kiyu_rexianyu_round',null,null,false)&&player.hasHistory('useCard',function(evt){ - var type=get.type(evt.card); - if(type!='basic'&&type!='trick') return false; - return evt.getParent('phaseUse')==event; - }); + kiyu_rexianyu: { + trigger: { player: "phaseUseEnd" }, + charlotte: true, + unique: true, + filter(event, player) { + return ( + !player.hasSkill("kiyu_rexianyu_round", null, null, false) && + player.hasHistory("useCard", function (evt) { + var type = get.type(evt.card); + if (type != "basic" && type != "trick") return false; + return evt.getParent("phaseUse") == event; + }) + ); }, - async cost(event, trigger, player){ - const history=player.getHistory('useCard',function(evt){ - var type=get.type(evt.card); - if(type!='basic'&&type!='trick') return false; - return evt.getParent('phaseUse')==trigger; + async cost(event, trigger, player) { + const history = player.getHistory("useCard", function (evt) { + var type = get.type(evt.card); + if (type != "basic" && type != "trick") return false; + return evt.getParent("phaseUse") == trigger; }); - const list=[]; - for(var i=0;i0; + kiyu_xianyu: { + trigger: { global: "phaseUseBegin" }, + charlotte: true, + round: 1, + filter(event, player) { + return event.player.countCards("h") > 0; }, - logTarget:'player', - check(event,player){ - var target=event.player; - var next=target.next; - if(target.getSeatNum()>next.getSeatNum()) return true; - if(target.countCards('h')<4&&target.countCards('h',function(card){ - return target.hasUseTarget(card,null,true); - })<2) return false; + logTarget: "player", + check(event, player) { + var target = event.player; + var next = target.next; + if (target.getSeatNum() > next.getSeatNum()) return true; + if ( + target.countCards("h") < 4 && + target.countCards("h", function (card) { + return target.hasUseTarget(card, null, true); + }) < 2 + ) + return false; return true; }, - content(){ - 'step 0' - var target=trigger.player,cards=target.getCards('h'); - var next=player.chooseToMove('先预:预测'+get.translation(target)+'使用牌的顺序',true); - next.set('list',[ - [get.translation(target)+'的手牌',cards] - ]); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0); - var target=_status.event.getTrigger().player; - cards.sort(function(a,b){ - return get.order(b,target)-get.order(a,target); + content() { + "step 0"; + var target = trigger.player, + cards = target.getCards("h"); + var next = player.chooseToMove( + "先预:预测" + get.translation(target) + "使用牌的顺序", + true + ); + next.set("list", [[get.translation(target) + "的手牌", cards]]); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0); + var target = _status.event.getTrigger().player; + cards.sort(function (a, b) { + return get.order(b, target) - get.order(a, target); }); return [cards]; }); - 'step 1' - if(result.bool){ - var list=result.moved[0]; - player.storage.kiyu_xianyu_lastrun=list; - player.addTempSkill('kiyu_xianyu_lastrun',list); + ("step 1"); + if (result.bool) { + var list = result.moved[0]; + player.storage.kiyu_xianyu_lastrun = list; + player.addTempSkill("kiyu_xianyu_lastrun", list); } }, - subSkill:{ - lastrun:{ - trigger:{global:'phaseUseAfter'}, - forced:true, - charlotte:true, - onremove:true, - content(){ - var num=0,index=-1,target=trigger.player; - var cards=player.getStorage('kiyu_xianyu_lastrun'); - var history=target.getHistory('useCard',function(event){ - return event.getParent('phaseUse')==trigger; + subSkill: { + lastrun: { + trigger: { global: "phaseUseAfter" }, + forced: true, + charlotte: true, + onremove: true, + content() { + var num = 0, + index = -1, + target = trigger.player; + var cards = player.getStorage("kiyu_xianyu_lastrun"); + var history = target.getHistory("useCard", function (event) { + return event.getParent("phaseUse") == trigger; }); - for(var evt of history){ - var goon=false; - for(var card of evt.cards){ - var index2=cards.indexOf(card); - if(index2>index){ - goon=true; - index=index2; + for (var evt of history) { + var goon = false; + for (var card of evt.cards) { + var index2 = cards.indexOf(card); + if (index2 > index) { + goon = true; + index = index2; } } - if(goon) num++; + if (goon) num++; } - if(num>0){ - num=Math.min(3,num); + if (num > 0) { + num = Math.min(3, num); player.draw(num); - if(target.isIn()){ - target.addTempSkill('kiyu_xianyu_effect'); - target.addMark('kiyu_xianyu_effect',num,false); + if (target.isIn()) { + target.addTempSkill("kiyu_xianyu_effect"); + target.addMark("kiyu_xianyu_effect", num, false); } } }, }, - effect:{ - charlotte:true, - onremove:true, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('kiyu_xianyu_effect'); + effect: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("kiyu_xianyu_effect"); }, }, }, }, }, //樱庭星罗 - seira_xinghui:{ - trigger:{player:'phaseZhunbeiBegin'}, - check(event,player){ - return !player.getExpansions('seira_xinghui').length; + seira_xinghui: { + trigger: { player: "phaseZhunbeiBegin" }, + check(event, player) { + return !player.getExpansions("seira_xinghui").length; }, - content(){ - 'step 0' + content() { + "step 0"; game.delayx(); - 'step 1' - if(get.isLuckyStar(player)){ - event.num=6; + ("step 1"); + if (get.isLuckyStar(player)) { + event.num = 6; player.throwDice(6); - } - else player.throwDice(); - 'step 2' - var cards=get.cards(num); - event.cards=cards; + } else player.throwDice(); + ("step 2"); + var cards = get.cards(num); + event.cards = cards; game.cardsGotoOrdering(cards); - var next=player.chooseToMove(); - next.set('prompt','星辉:选择要作为“星屑”的牌(先选择的在上)'); - next.set('list',[ - ['置于武将牌上',cards], - ['置入弃牌堆'], - ]); - next.processAI=function(list){ - var cards=list[0][1],player=_status.event.player; - var top=[]; - var judges=player.getCards('j'); - var stopped=false; - if(!player.hasWuxie()){ - for(var i=0;i0; + subSkill: { + hoshikuzu: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.getExpansions("seira_xinghui").length > 0; }, - content(){ + content() { trigger.num++; - game.log(player,'造成了','#y暴击伤害'); + game.log(player, "造成了", "#y暴击伤害"); }, - group:['seira_xinghui_draw','seira_xinghui_judge'], + group: ["seira_xinghui_draw", "seira_xinghui_judge"], }, - draw:{ - trigger:{player:'drawBefore'}, - forced:true, - filter(event,player){ - return player.getExpansions('seira_xinghui').length>0; + draw: { + trigger: { player: "drawBefore" }, + forced: true, + filter(event, player) { + return player.getExpansions("seira_xinghui").length > 0; }, - content(){ - var cards=player.getExpansions('seira_xinghui'); - var num=Math.min(cards.length,trigger.num); - trigger.num-=num; - player.gain(cards.slice(0,num),'draw'); - if(trigger.num==0) trigger.cancel(); + content() { + var cards = player.getExpansions("seira_xinghui"); + var num = Math.min(cards.length, trigger.num); + trigger.num -= num; + player.gain(cards.slice(0, num), "draw"); + if (trigger.num == 0) trigger.cancel(); }, }, - judge:{ - trigger:{player:'judgeBegin'}, - forced:true, - filter(event,player){ - return player.getExpansions('seira_xinghui').length>0; + judge: { + trigger: { player: "judgeBegin" }, + forced: true, + filter(event, player) { + return player.getExpansions("seira_xinghui").length > 0; }, - content(){ - trigger.directresult=player.getExpansions('seira_xinghui')[0]; + content() { + trigger.directresult = player.getExpansions("seira_xinghui")[0]; }, }, }, }, - seira_yuanying:{ - enable:'phaseUse', - usable:1, - filterTarget:true, - selectTarget:2, - multitarget:true, - multiline:true, - line:{color:[253, 153, 182]}, - content(){ - game.filterPlayer().sortBySeat().forEach(function(current){ - if(!targets.includes(current)){ - current.removeSkills('seira_yinyuan'); - } - else{ - current.addSkills('seira_yinyuan'); - } - }); + seira_yuanying: { + enable: "phaseUse", + usable: 1, + filterTarget: true, + selectTarget: 2, + multitarget: true, + multiline: true, + line: { color: [253, 153, 182] }, + content() { + game.filterPlayer() + .sortBySeat() + .forEach(function (current) { + if (!targets.includes(current)) { + current.removeSkills("seira_yinyuan"); + } else { + current.addSkills("seira_yinyuan"); + } + }); game.delayx(); }, - ai:{ - order:1, - result:{target:1}, - expose:0.1, + ai: { + order: 1, + result: { target: 1 }, + expose: 0.1, }, - derivation:'seira_yinyuan', + derivation: "seira_yinyuan", }, - seira_yinyuan:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.hasSkill('seira_yinyuan',null,null,false)&&target.countCards('hej')>0; + seira_yinyuan: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return ( + target != player && + target.hasSkill("seira_yinyuan", null, null, false) && + target.countCards("hej") > 0 + ); }, - content(){ - player.gainPlayerCard(target,true,'hej'); + content() { + player.gainPlayerCard(target, true, "hej"); target.recover(); }, - mark:true, - intro:{content:'你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。'}, - ai:{ - order:9, - viewHandcard:true, - skillTagFilter(player,tag,arg){ - if(player==arg) return false; - return player.hasSkill('seira_yinyuan')&&arg.hasSkill('seira_yinyuan'); + mark: true, + intro: { + content: + "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。", + }, + ai: { + order: 9, + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; + return player.hasSkill("seira_yinyuan") && arg.hasSkill("seira_yinyuan"); }, - result:{ - player(player,target){ - var effect=get.effect(target,{name:'shunshou_copy'},player,player); - if(target.isDamaged()){ - if(effect<0) effect/=2; - effect+=get.recoverEffect(target,player,player); + result: { + player(player, target) { + var effect = get.effect(target, { name: "shunshou_copy" }, player, player); + if (target.isDamaged()) { + if (effect < 0) effect /= 2; + effect += get.recoverEffect(target, player, player); } return effect; }, @@ -2243,7922 +2771,9585 @@ game.import('character', function () { }, }, //派对浪客 - nsxingyun:{ - audio:2, - enable:'chooseToUse', - getSixiang(card){ - if(typeof card=='string') card={name:card}; - if(card.name=='shan') return '玄武'; - var type=get.type(card,null,false); - if(type=='delay') return '朱雀'; - if(get.tag(card,'damage')) return '白虎'; - if(get.tag(card,'recover')) return '玄武'; - if(type=='trick') return '青龙'; + nsxingyun: { + audio: 2, + enable: "chooseToUse", + getSixiang(card) { + if (typeof card == "string") card = { name: card }; + if (card.name == "shan") return "玄武"; + var type = get.type(card, null, false); + if (type == "delay") return "朱雀"; + if (get.tag(card, "damage")) return "白虎"; + if (get.tag(card, "recover")) return "玄武"; + if (type == "trick") return "青龙"; return false; }, - filter(event,player){ - if(player.hasSkill('nsxingyun_round')) return false; - var list=player.getStorage('nsxingyun'); - if(list.length>=4) return false; - for(var i of lib.inpile){ - var type=lib.skill.nsxingyun.getSixiang(i); - if(!type||list.includes(type)) continue; - if(event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name:i,nature:j},'unsure'),player,event)) return true; + filter(event, player) { + if (player.hasSkill("nsxingyun_round")) return false; + var list = player.getStorage("nsxingyun"); + if (list.length >= 4) return false; + for (var i of lib.inpile) { + var type = lib.skill.nsxingyun.getSixiang(i); + if (!type || list.includes(type)) continue; + if (event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) + return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name: i, nature: j }, "unsure"), + player, + event + ) + ) + return true; } } } return false; }, - chooseButton:{ - dialog(event,player){ - var map={青龙:[],朱雀:[],白虎:[],玄武:[]}; - var list=player.getStorage('nsxingyun'); - for(var i of lib.inpile){ - var type=lib.skill.nsxingyun.getSixiang(i); - if(!type||list.includes(type)) continue; - if(event.filterCard({name:i},player,event)) map[type].push([get.type2(i,false),'',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard({name:i,nature:j},player,event)) map[type].push([get.type2(i,false),'',i,j]); + chooseButton: { + dialog(event, player) { + var map = { 青龙: [], 朱雀: [], 白虎: [], 玄武: [] }; + var list = player.getStorage("nsxingyun"); + for (var i of lib.inpile) { + var type = lib.skill.nsxingyun.getSixiang(i); + if (!type || list.includes(type)) continue; + if (event.filterCard({ name: i }, player, event)) + map[type].push([get.type2(i, false), "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j }, player, event)) + map[type].push([get.type2(i, false), "", i, j]); } } } - var dialog=['星陨','hidden']; - for(var i in map){ - if(map[i].length>0){ - dialog.push('
    '+i+'
    '); - dialog.push([map[i],'vcard']); + var dialog = ["星陨", "hidden"]; + for (var i in map) { + if (map[i].length > 0) { + dialog.push('
    ' + i + "
    "); + dialog.push([map[i], "vcard"]); } } - return ui.create.dialog.apply(ui.create,dialog); + return ui.create.dialog.apply(ui.create, dialog); }, - filter(button,player){ - return _status.event.getParent().filterCard({ - name:button.link[2], - nature:button.link[3], - },player,_status.event.getParent()); + filter(button, player) { + return _status.event.getParent().filterCard( + { + name: button.link[2], + nature: button.link[3], + }, + player, + _status.event.getParent() + ); }, - check(button){ - if(_status.event.getParent().type!='phase') return 1; - return _status.event.player.getUseValue({ - name:button.link[2], - nature:button.link[3], - },false); + check(button) { + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue( + { + name: button.link[2], + nature: button.link[3], + }, + false + ); }, - backup(links,player){ + backup(links, player) { return { - selectCard:1, - filterCard:true, - popname:true, - position:'hs', - check(card){ - return 7-get.value(card); + selectCard: 1, + filterCard: true, + popname: true, + position: "hs", + check(card) { + return 7 - get.value(card); }, - viewAs:{name:links[0][2],nature:links[0][3]}, - precontent(){ - player.addTempSkill('nsxingyun_round'); + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent() { + player.addTempSkill("nsxingyun_round"); }, - } + }; + }, + prompt(links, player) { + return ( + "将一张手牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - prompt(links,player){ - return '将一张手牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; - } }, - ai:{ - threaten:2.6, - order:1, - result:{player:1}, + ai: { + threaten: 2.6, + order: 1, + result: { player: 1 }, }, - group:'nsxingyun_clear', - derivation:['nsxingyun_faq','bazhen'], - subSkill:{ - backup:{}, - clear:{ - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - filter(event,player){ - return event.skill=='nsxingyun_backup'&&event.cards.length==1 - &&lib.skill.nsxingyun.getSixiang(event.card)!=lib.skill.nsxingyun.getSixiang(event.cards[0])&&!player.getStorage('nsxingyun').includes(lib.skill.nsxingyun.getSixiang(event.card)); + group: "nsxingyun_clear", + derivation: ["nsxingyun_faq", "bazhen"], + subSkill: { + backup: {}, + clear: { + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return ( + event.skill == "nsxingyun_backup" && + event.cards.length == 1 && + lib.skill.nsxingyun.getSixiang(event.card) != + lib.skill.nsxingyun.getSixiang(event.cards[0]) && + !player + .getStorage("nsxingyun") + .includes(lib.skill.nsxingyun.getSixiang(event.card)) + ); }, - content(){ - 'step 0' + content() { + "step 0"; player.draw(2); - player.markAuto('nsxingyun',[lib.skill.nsxingyun.getSixiang(trigger.card)]); - 'step 1' - if(player.getStorage('nsxingyun').length>=4) player.addSkills('bazhen'); + player.markAuto("nsxingyun", [lib.skill.nsxingyun.getSixiang(trigger.card)]); + ("step 1"); + if (player.getStorage("nsxingyun").length >= 4) player.addSkills("bazhen"); }, }, - round:{ - charlotte:true, - onremove:true, + round: { + charlotte: true, + onremove: true, }, }, }, - nshanlang:{ - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - return player.countCards('h')>0&&game.hasPlayer( - (current)=>player!=current&&player.canCompare(current) + nshanlang: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer((current) => player != current && player.canCompare(current)) ); }, - async cost(event, trigger, player){ - const goon=player.hasCard(function(card){ - return get.value(card)<=7; - },'h'); - event.result = await player.chooseTarget([1,3],get.prompt('nshanlang'),'和至多三名角色进行拼点',function(card,player,target){ - return target!=player&&player.canCompare(target); - }).set('ai',function(target){ - if(!_status.event.goon) return false; - var att=get.attitude(_status.event.player,target); - if(att>=0) return 0; - if(target.hasSkillTag('noh')) att/=3; - return -att/Math.sqrt(target.countCards('h')); - }).set('goon',goon).forResult(); + async cost(event, trigger, player) { + const goon = player.hasCard(function (card) { + return get.value(card) <= 7; + }, "h"); + event.result = await player + .chooseTarget( + [1, 3], + get.prompt("nshanlang"), + "和至多三名角色进行拼点", + function (card, player, target) { + return target != player && player.canCompare(target); + } + ) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(_status.event.player, target); + if (att >= 0) return 0; + if (target.hasSkillTag("noh")) att /= 3; + return -att / Math.sqrt(target.countCards("h")); + }) + .set("goon", goon) + .forResult(); }, - content(){ - 'step 0' - event.max_num=0; + content() { + "step 0"; + event.max_num = 0; targets.sortBySeat(); - player.chooseToCompare(targets).callback=lib.skill.nshanlang.callback; - 'step 1' - if(event.target){ - player.chooseBool('是否令'+get.translation(target)+'获得一张牌?').set('goon',get.attitude(player,target)>0).set('ai',()=>_status.event.goon); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=get.cardPile2(function(card){ + player.chooseToCompare(targets).callback = lib.skill.nshanlang.callback; + ("step 1"); + if (event.target) { + player + .chooseBool("是否令" + get.translation(target) + "获得一张牌?") + .set("goon", get.attitude(player, target) > 0) + .set("ai", () => _status.event.goon); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = get.cardPile2(function (card) { return !lib.skill.nsxingyun.getSixiang(card); }); - if(card) target.gain(card,'gain2'); + if (card) target.gain(card, "gain2"); } }, - callback(){ - var list=[[player,event.num1],[target,event.num2]],evt=event.getParent(2); - for(var i of list){ - if(i[1]>evt.max_num){ - evt.max_num=i[1]; - evt.target=i[0]; - } - else if(evt.target&&i[1]==evt.max_num&&i[0]!=evt.target){ + callback() { + var list = [ + [player, event.num1], + [target, event.num2], + ], + evt = event.getParent(2); + for (var i of list) { + if (i[1] > evt.max_num) { + evt.max_num = i[1]; + evt.target = i[0]; + } else if (evt.target && i[1] == evt.max_num && i[0] != evt.target) { delete evt.target; } } }, }, //钟离牧 - nskuanhuai:{ - trigger:{player:'phaseUseBegin'}, - content(){ - 'step 0' - var card=get.discardPile(function(card){ - return get.type(card)!='basic'; + nskuanhuai: { + trigger: { player: "phaseUseBegin" }, + content() { + "step 0"; + var card = get.discardPile(function (card) { + return get.type(card) != "basic"; }); - if(card) player.gain(card,'gain2'); - 'step 1' - player.addTempSkill('nskuanhuai_blocker','phaseUseAfter'); - player.addTempSkill('nskuanhuai_effect'); + if (card) player.gain(card, "gain2"); + ("step 1"); + player.addTempSkill("nskuanhuai_blocker", "phaseUseAfter"); + player.addTempSkill("nskuanhuai_effect"); }, - subSkill:{ - blocker:{ - charlotte:true, - mod:{ - cardEnabled(card){ - if(get.type(card)=='basic') return false; + subSkill: { + blocker: { + charlotte: true, + mod: { + cardEnabled(card) { + if (get.type(card) == "basic") return false; }, - cardSavable(card){ - if(get.type(card)=='basic') return false; + cardSavable(card) { + if (get.type(card) == "basic") return false; }, }, }, - effect:{ - trigger:{player:'phaseDiscardEnd'}, - charlotte:true, - popup:false, - filter(event,player){ - return player.hasHistory('lose',function(evt){ - if(evt.type!='discard'||evt.getParent('phaseDiscard')!=event) return false; - for(var i of evt.cards2){ - if(get.type(i,false)=='basic'&&get.position(i,true)=='d'&&player.hasUseTarget(i)) return true; + effect: { + trigger: { player: "phaseDiscardEnd" }, + charlotte: true, + popup: false, + filter(event, player) { + return player.hasHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent("phaseDiscard") != event) + return false; + for (var i of evt.cards2) { + if ( + get.type(i, false) == "basic" && + get.position(i, true) == "d" && + player.hasUseTarget(i) + ) + return true; } return false; }); }, - content(){ - 'step 0' - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type!='discard'||evt.getParent('phaseDiscard')!=trigger) return false; - for(var i of evt.cards2){ - if(get.type(i,false)=='basic'&&get.position(i,true)=='d') cards.push(i); + content() { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent("phaseDiscard") != trigger) + return false; + for (var i of evt.cards2) { + if (get.type(i, false) == "basic" && get.position(i, true) == "d") + cards.push(i); } return false; }); - event.cards=cards; - 'step 1' - var cards2=event.cards.filter(function(i){ - return get.position(i,true)=='d'&&player.hasUseTarget(i); + event.cards = cards; + ("step 1"); + var cards2 = event.cards.filter(function (i) { + return get.position(i, true) == "d" && player.hasUseTarget(i); }); - if(cards2.length){ - player.chooseButton(['宽怀:是否使用其中一张牌?',cards2]); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.links[0]; + if (cards2.length) { + player.chooseButton(["宽怀:是否使用其中一张牌?", cards2]); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.links[0]; cards.remove(card); - player.chooseUseTarget(card,true); - if(cards.length>0) event.goto(1); + player.chooseUseTarget(card, true); + if (cards.length > 0) event.goto(1); } }, }, }, }, - nsdingbian:{ - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - if(player!=_status.currentPhase) return false; - return get.type(event.card)!='basic'; + nsdingbian: { + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + if (player != _status.currentPhase) return false; + return get.type(event.card) != "basic"; }, - content(){ - 'step 0' - player.addTempSkill('nsdingbian_mark'); - player.addMark('nsdingbian_mark',1,false); - var storage=player.getStorage('nsdingbian_ignore'); - var goon=false; - for(var i of lib.inpile){ - if(get.type(i)=='basic'&&!storage.includes(i)){ - goon=true; + content() { + "step 0"; + player.addTempSkill("nsdingbian_mark"); + player.addMark("nsdingbian_mark", 1, false); + var storage = player.getStorage("nsdingbian_ignore"); + var goon = false; + for (var i of lib.inpile) { + if (get.type(i) == "basic" && !storage.includes(i)) { + goon = true; break; } } - if(goon) player.chooseControl().set('choiceList',[ - '从牌堆中获得一张基本牌', - '令一种基本牌于本回合内不计入手牌上限', - ]).set('prompt','定边:请选择一项').set('ai',function(){ - var player=_status.event.player; - var list=['tao','shan'],list2=player.getStorage('nsdingbian_ignore'); - list.removeArray(list2); - if(!list.length) return 0; - var num1=player.countCards('hs',function(card){ - return get.type(card)!='basic'&&player.hasValueTarget(card,null,true); - }),num2=player.getHandcardLimit(); - if(player.countCards('h',list)<=num2-num1) return 0; - return 1; - }); - else event._result={index:0}; - 'step 1' - if(result.index==0){ - var card=get.cardPile2(function(card){ - return get.type(card,false)=='basic'; + if (goon) + player + .chooseControl() + .set("choiceList", [ + "从牌堆中获得一张基本牌", + "令一种基本牌于本回合内不计入手牌上限", + ]) + .set("prompt", "定边:请选择一项") + .set("ai", function () { + var player = _status.event.player; + var list = ["tao", "shan"], + list2 = player.getStorage("nsdingbian_ignore"); + list.removeArray(list2); + if (!list.length) return 0; + var num1 = player.countCards("hs", function (card) { + return ( + get.type(card) != "basic" && + player.hasValueTarget(card, null, true) + ); + }), + num2 = player.getHandcardLimit(); + if (player.countCards("h", list) <= num2 - num1) return 0; + return 1; + }); + else event._result = { index: 0 }; + ("step 1"); + if (result.index == 0) { + var card = get.cardPile2(function (card) { + return get.type(card, false) == "basic"; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); event.finish(); - } - else{ - var list=[],storage=player.getStorage('nsdingbian_ignore'); - for(var i of lib.inpile){ - if(get.type(i)=='basic'&&!storage.includes(i)){ + } else { + var list = [], + storage = player.getStorage("nsdingbian_ignore"); + for (var i of lib.inpile) { + if (get.type(i) == "basic" && !storage.includes(i)) { list.push(i); } } - player.chooseButton(['令一种基本牌于本回合内不计入手牌上限',[list,'vcard']],true).set('ai',function(button){ - var name=button.link[2],player=_status.event.player; - if(name=='sha') return 0; - var cards=player.getCards('h',name); - if(!cards.length) return 0; - return get.value(cards,player); - }); + player + .chooseButton(["令一种基本牌于本回合内不计入手牌上限", [list, "vcard"]], true) + .set("ai", function (button) { + var name = button.link[2], + player = _status.event.player; + if (name == "sha") return 0; + var cards = player.getCards("h", name); + if (!cards.length) return 0; + return get.value(cards, player); + }); } - 'step 2' - player.markAuto('nsdingbian_ignore',[result.links[0][2]]); + ("step 2"); + player.markAuto("nsdingbian_ignore", [result.links[0][2]]); }, - subSkill:{ - mark:{ - onremove(player){ + subSkill: { + mark: { + onremove(player) { delete player.storage.nsdingbian_mark; delete player.storage.nsdingbian_ignore; }, - mod:{ - maxHandcard:(player,num)=>num-player.countMark('nsdingbian_mark'), - ignoredHandcard(card,player){ - if(player.getStorage('nsdingbian_ignore').includes(get.name(card,player))){ + mod: { + maxHandcard: (player, num) => num - player.countMark("nsdingbian_mark"), + ignoredHandcard(card, player) { + if (player.getStorage("nsdingbian_ignore").includes(get.name(card, player))) { return true; } }, - cardDiscardable(card,player,name){ - if(name=='phaseDiscard'&&player.getStorage('nsdingbian_ignore').includes(get.name(card,player))){ + cardDiscardable(card, player, name) { + if ( + name == "phaseDiscard" && + player.getStorage("nsdingbian_ignore").includes(get.name(card, player)) + ) { return false; } }, }, - intro:{content:'手牌上限-#'}, + intro: { content: "手牌上限-#" }, }, }, }, //李密 - nstuilun:{ - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return player.hp>1&&player.countCards('h')>1&&player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'nstuilun'); - },'h'); + nstuilun: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.hp > 1 && + player.countCards("h") > 1 && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "nstuilun"); + }, "h") + ); }, - prompt2:'失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。', - check(event,player){ - if(game.hasPlayer(function(current){ - return current!=player&¤t.hp>=player.hp; - })) return true; + prompt2: "失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。", + check(event, player) { + if ( + game.hasPlayer(function (current) { + return current != player && current.hp >= player.hp; + }) + ) + return true; return false; }, - content(){ - 'step 0' - if(player.hp==2) event._result={index:0}; - else{ - var list=[]; - for(var i=1;i1&&player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'nstuilun'); - },'h')){ - player.chooseToDiscard('h',true,[1,player.countCards('h')-1]); - } - else game.delayx(); - 'step 3' - player.addTempSkill('nstuilun_effect',{player:'phaseBeginStart'}); + ("step 1"); + player.loseHp(1 + result.index); + ("step 2"); + if ( + player.countCards("h") > 1 && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "nstuilun"); + }, "h") + ) { + player.chooseToDiscard("h", true, [1, player.countCards("h") - 1]); + } else game.delayx(); + ("step 3"); + player.addTempSkill("nstuilun_effect", { + player: "phaseBeginStart", + }); }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{global:'phaseBegin'}, - forced:true, - popup:false, - filter(event,player){ - return player.hp0&&player.countCards('h') 0 && player.countCards("h") < event.player.countCards("h")) + ); }, - content(){ - 'step 0' - if(player.hp=get.effect(target,{name:'losehp'},player,player)) return 0; - return 1; - }); - } - else event.goto(3); - 'step 2' - if(result.index==0) target.recover(); + content() { + "step 0"; + if (player.hp < trigger.player.hp) { + player + .chooseTarget("退论:是否令一名角色回复或失去1点体力?") + .set("ai", function (target) { + var eff = get.effect(target, { name: "losehp" }, player, player); + if (target.isDamaged()) + eff = Math.max(eff, get.recoverEffect(target, player, player)); + return eff; + }); + } else event.goto(3); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("nstuilun_effect", target); + if (target.isHealthy()) event._result = { index: 1 }; + else + player + .chooseControl("回复1点体力", "失去1点体力") + .set("prompt", "令" + get.translation(target) + "…") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + if ( + get.recoverEffect(target, player, player) >= + get.effect(target, { name: "losehp" }, player, player) + ) + return 0; + return 1; + }); + } else event.goto(3); + ("step 2"); + if (result.index == 0) target.recover(); else target.loseHp(); - 'step 3' - if(trigger.player.countCards('h')>player.countCards('h')){ - var str=get.cnNumber(player.hp); - player.chooseTarget('退论:是否令一名角色摸一张牌或弃置一张牌?').set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0||target.countCards('he')==0) return get.effect(target,{name:'draw'},player,player); - return get.effect(target,{name:'guohe_copy2'},target,player); - }); - } - else event.finish(); - 'step 4' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('nstuilun_effect',target); - if(!target.countCards('he')) event._result={index:0}; - else player.chooseControl('摸一张牌','弃置一张牌').set('prompt','令'+get.translation(target)+'…').set('ai',function(player){ - var evt=_status.event; - return get.attitude(evt.player,evt.getParent().target)>0?0:1; - }); - } - else event.finish(); - 'step 5' - if(result.index==0) target.draw(); - else target.chooseToDiscard('he',true); + ("step 3"); + if (trigger.player.countCards("h") > player.countCards("h")) { + var str = get.cnNumber(player.hp); + player + .chooseTarget("退论:是否令一名角色摸一张牌或弃置一张牌?") + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0 || target.countCards("he") == 0) + return get.effect(target, { name: "draw" }, player, player); + return get.effect(target, { name: "guohe_copy2" }, target, player); + }); + } else event.finish(); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("nstuilun_effect", target); + if (!target.countCards("he")) event._result = { index: 0 }; + else + player + .chooseControl("摸一张牌", "弃置一张牌") + .set("prompt", "令" + get.translation(target) + "…") + .set("ai", function (player) { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().target) > 0 + ? 0 + : 1; + }); + } else event.finish(); + ("step 5"); + if (result.index == 0) target.draw(); + else target.chooseToDiscard("he", true); }, }, }, }, //阮籍 - nsshizui:{ - trigger:{target:'useCardToTargeted'}, - usable:1, - filter(event,player){ - var type=get.type(event.card,null,false); - return (type=='basic'||type=='trick')&&player.countCards('he')>0&&player.hasUseTarget({name:'jiu'},null,true); + nsshizui: { + trigger: { target: "useCardToTargeted" }, + usable: 1, + filter(event, player) { + var type = get.type(event.card, null, false); + return ( + (type == "basic" || type == "trick") && + player.countCards("he") > 0 && + player.hasUseTarget({ name: "jiu" }, null, true) + ); }, - async cost(event,trigger,player){ - var suit=get.suit(trigger.card),cards=trigger.cards.filterInD(); - var str='弃置一张牌并视为使用一张【酒】'; - if(lib.suit.includes(suit)) str+=(';若弃置'+get.translation(suit)+'牌,则'+get.translation(trigger.card)+'对你无效'); - if(cards.length) str+=(';若弃置♣牌则获得'+get.translation(cards)); - str+='。'; - var next=player.chooseToDiscard('he', get.prompt('nsshizui'), str, 'chooseonly'); - next.set('val1',cards.length?get.value(cards,player):0); - next.set('val2',-get.effect(player,trigger.card,trigger.player,player)); - next.set('suit',suit); - next.set('ai',function(card){ - var base=2,suit=get.suit(card); - if(suit=='club') base+=_status.event.val1; - if(suit==_status.event.suit) base+=_status.event.val2; - return base-get.value(card); + async cost(event, trigger, player) { + var suit = get.suit(trigger.card), + cards = trigger.cards.filterInD(); + var str = "弃置一张牌并视为使用一张【酒】"; + if (lib.suit.includes(suit)) + str += + ";若弃置" + + get.translation(suit) + + "牌,则" + + get.translation(trigger.card) + + "对你无效"; + if (cards.length) str += ";若弃置♣牌则获得" + get.translation(cards); + str += "。"; + var next = player.chooseToDiscard("he", get.prompt("nsshizui"), str, "chooseonly"); + next.set("val1", cards.length ? get.value(cards, player) : 0); + next.set("val2", -get.effect(player, trigger.card, trigger.player, player)); + next.set("suit", suit); + next.set("ai", function (card) { + var base = 2, + suit = get.suit(card); + if (suit == "club") base += _status.event.val1; + if (suit == _status.event.suit) base += _status.event.val2; + return base - get.value(card); }); event.result = await next.forResult(); }, - content(){ - 'step 0' - event.suit1=get.suit(cards[0],player); + content() { + "step 0"; + event.suit1 = get.suit(cards[0], player); player.discard(cards); - player.chooseUseTarget('jiu',true); - 'step 1' - var suit1=event.suit1,suit2=get.suit(trigger.card,false); - if(suit1==suit2&&lib.suit.includes(suit1)) trigger.excluded.add(player); - if(suit1=='club'){ - var cards=trigger.cards.filterInD(); - if(cards.length>0) player.gain(cards,'gain2'); + player.chooseUseTarget("jiu", true); + ("step 1"); + var suit1 = event.suit1, + suit2 = get.suit(trigger.card, false); + if (suit1 == suit2 && lib.suit.includes(suit1)) trigger.excluded.add(player); + if (suit1 == "club") { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) player.gain(cards, "gain2"); } }, }, - nsxiaoye:{ - trigger:{global:'phaseJieshuBegin'}, - filter(event,player){ - return player.hasHistory('useCard',function(evt){ - return evt.card.name=='jiu'; - })&&event.player.hasHistory('useCard',function(evt){ - return (evt.card.name=='sha'||get.type(evt.card)=='trick')&&player.hasUseTarget({ - name:evt.card.name, - nature:evt.card.nature, - isCard:true, - }); - }) + nsxiaoye: { + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.hasHistory("useCard", function (evt) { + return evt.card.name == "jiu"; + }) && + event.player.hasHistory("useCard", function (evt) { + return ( + (evt.card.name == "sha" || get.type(evt.card) == "trick") && + player.hasUseTarget({ + name: evt.card.name, + nature: evt.card.nature, + isCard: true, + }) + ); + }) + ); }, - async cost(event,trigger,player){ - const list=[]; - trigger.player.getHistory('useCard',function(evt){ - if(evt.card.name!='sha'&&get.type(evt.card)!='trick') return; - if(evt.card.name=='sha'&&evt.card.nature) list.add('sha:'+evt.card.nature); + async cost(event, trigger, player) { + const list = []; + trigger.player.getHistory("useCard", function (evt) { + if (evt.card.name != "sha" && get.type(evt.card) != "trick") return; + if (evt.card.name == "sha" && evt.card.nature) list.add("sha:" + evt.card.nature); else list.add(evt.card.name); }); - for(let i=0;i1||player.countCards('hs',['tao','jiu'])) return 1; - if(!ui.selected.targets.length){ - if(target!=player) return 0; - if(player.hasSha()) return 1; + ai: { + order: 3.05, + result: { + player(player, target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (player.hp > 1 || player.countCards("hs", ["tao", "jiu"])) return 1; + if (!ui.selected.targets.length) { + if (target != player) return 0; + if (player.hasSha()) return 1; return 0; } - if(ui.selected.targets.length>1&&!target.hasSha()) return 0; + if (ui.selected.targets.length > 1 && !target.hasSha()) return 0; return 1; }, }, }, }, - tenzen_fenghuan:{ - trigger:{global:'useCardAfter'}, - filter(event,player){ - if(player==event.player||event.targets.length!=1||event.targets[0]!=player||!event.player.isIn()|| - (event.card.name!='sha'&&(get.type(event.card,null,false)!='trick'||!get.tag(event.card,'damage')))) return false; - if(!player.canUse({ - name:event.card.name, - nature:event.card.nature, - isCard:true, - },event.player,false)) return false; - var num=get.number(event.card); - if(typeof num!='number') return false; - num*=2; - var hs=player.getCards('he'); - for(var i of hs){ - num-=get.number(i); - if(num<=0) return true; + tenzen_fenghuan: { + trigger: { global: "useCardAfter" }, + filter(event, player) { + if ( + player == event.player || + event.targets.length != 1 || + event.targets[0] != player || + !event.player.isIn() || + (event.card.name != "sha" && + (get.type(event.card, null, false) != "trick" || !get.tag(event.card, "damage"))) + ) + return false; + if ( + !player.canUse( + { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }, + event.player, + false + ) + ) + return false; + var num = get.number(event.card); + if (typeof num != "number") return false; + num *= 2; + var hs = player.getCards("he"); + for (var i of hs) { + num -= get.number(i); + if (num <= 0) return true; } return false; }, - async cost(event, trigger, player){ - const num=get.number(trigger.card)*2, card = { - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, - }; - event.result = await player.chooseToDiscard('he',get.prompt('tenzen_fenghuan',trigger.player),'弃置任意张点数之和不小于'+num+'的牌,然后视为对其使用一张'+get.translation(card),'chooseonly').set('selectCard',function(){ - var cards=ui.selected.cards,num=_status.event.cardNumber; - for(var i of cards){ - num-=get.number(i); - if(num<=0) return [cards.length,cards.length+1]; - } - return [cards.length+1,cards.length+1]; - }).set('cardNumber',num).set('effect',get.effect(trigger.player,card,player,player)).set('ai',function(card){ - var eff=_status.event.effect; - if(eff<=0) return 0; - for(var i of ui.selected.cards) eff-=get.value(i)/Math.sqrt(get.number(i)/3); - return eff-get.value(card)/Math.sqrt(get.number(card)/3); - }).forResult(); + async cost(event, trigger, player) { + const num = get.number(trigger.card) * 2, + card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + event.result = await player + .chooseToDiscard( + "he", + get.prompt("tenzen_fenghuan", trigger.player), + "弃置任意张点数之和不小于" + + num + + "的牌,然后视为对其使用一张" + + get.translation(card), + "chooseonly" + ) + .set("selectCard", function () { + var cards = ui.selected.cards, + num = _status.event.cardNumber; + for (var i of cards) { + num -= get.number(i); + if (num <= 0) return [cards.length, cards.length + 1]; + } + return [cards.length + 1, cards.length + 1]; + }) + .set("cardNumber", num) + .set("effect", get.effect(trigger.player, card, player, player)) + .set("ai", function (card) { + var eff = _status.event.effect; + if (eff <= 0) return 0; + for (var i of ui.selected.cards) + eff -= get.value(i) / Math.sqrt(get.number(i) / 3); + return eff - get.value(card) / Math.sqrt(get.number(card) / 3); + }) + .forResult(); }, - async content(event,trigger,player){ + async content(event, trigger, player) { await player.discard(event.cards); - var card={ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, - },target=trigger.player; - if(target.isIn()&&player.canUse(card,target,false)) await player.useCard(card,target,false); + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }, + target = trigger.player; + if (target.isIn() && player.canUse(card, target, false)) + await player.useCard(card, target, false); }, }, - tenzen_retianquan:{ - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - return event.card.name=='sha'&&(player.hp>0||player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'tenzen_retianquan'); - },'he')); + tenzen_retianquan: { + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return ( + event.card.name == "sha" && + (player.hp > 0 || + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "tenzen_retianquan"); + }, "he")) + ); }, - logTarget:'target', - usable:1, - check(event,player){ - if(get.attitude(player,event.target)>=0) return false; - if(player.hp>player.maxHp/2) return true; - if(player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'tenzen_retianquan')&&get.value(card)<6; - },'he')) return true; + logTarget: "target", + usable: 1, + check(event, player) { + if (get.attitude(player, event.target) >= 0) return false; + if (player.hp > player.maxHp / 2) return true; + if ( + player.hasCard(function (card) { + return ( + lib.filter.cardDiscardable(card, player, "tenzen_retianquan") && + get.value(card) < 6 + ); + }, "he") + ) + return true; return true; }, - prompt2:'你可失去1点体力或弃置一张牌,亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。每有一张基本牌,其所需使用的【闪】的数量便+1。然后若此牌造成过伤害,则你获得展示牌中的所有非基本牌。', - content(){ - 'step 0' - player.chooseToDiscard('弃置一张牌,或点「取消」失去1点体力','he').set('goon',(player.hp>player.maxHp/2)).set('ai',function(card){ - var val=get.value(card); - if(_status.event.goon) return 0.1-val; - return 6-val; - }); - 'step 1' - if(!result.bool) player.loseHp(); - 'step 2' - var cards=get.cards(player.hp<=player.maxHp/2?5:3); - player.showCards(cards,get.translation(player)+'发动了【天全】'); - game.cardsGotoOrdering(cards).relatedEvent=trigger.getParent(); - var num=cards.filter(function(card){ - return get.type(card,false)=='basic'; + prompt2: + "你可失去1点体力或弃置一张牌,亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。每有一张基本牌,其所需使用的【闪】的数量便+1。然后若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", + content() { + "step 0"; + player + .chooseToDiscard("弃置一张牌,或点「取消」失去1点体力", "he") + .set("goon", player.hp > player.maxHp / 2) + .set("ai", function (card) { + var val = get.value(card); + if (_status.event.goon) return 0.1 - val; + return 6 - val; + }); + ("step 1"); + if (!result.bool) player.loseHp(); + ("step 2"); + var cards = get.cards(player.hp <= player.maxHp / 2 ? 5 : 3); + player.showCards(cards, get.translation(player) + "发动了【天全】"); + game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent(); + var num = cards.filter(function (card) { + return get.type(card, false) == "basic"; }).length; - if(num){ - if(trigger.card.name=='sha'){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number'){ - map[id].shanRequired+=num; - } - else{ - map[id].shanRequired=1+num; + if (num) { + if (trigger.card.name == "sha") { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired += num; + } else { + map[id].shanRequired = 1 + num; } } } - if(num<5){ - var next=game.createEvent('tenzen_retianqua_gain'); - next.cards=cards; - next.player=player; + if (num < 5) { + var next = game.createEvent("tenzen_retianqua_gain"); + next.cards = cards; + next.player = player; event.next.remove(next); trigger.getParent().after.push(next); - next.setContent(function(){ - if(player.getHistory('sourceDamage',function(evt){ - return evt.card==event.parent.card; - }).length>0) player.gain(cards.filter(function(card){ - return get.type(card,false)!='basic'; - }),'gain2'); + next.setContent(function () { + if ( + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.parent.card; + }).length > 0 + ) + player.gain( + cards.filter(function (card) { + return get.type(card, false) != "basic"; + }), + "gain2" + ); }); } }, }, - satomi_luodao:{ - trigger:{player:'useCardToPlayered'}, - logTarget:'target', - filter(event,player){ - return event.card.name=='sha'&&event.target.countCards('h')>0; + satomi_luodao: { + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter(event, player) { + return event.card.name == "sha" && event.target.countCards("h") > 0; }, - content(){ - 'step 0' - var target=trigger.target; - event.target=target; - target.showHandcards(get.translation(player)+'对'+get.translation(target)+'发动了【落刀】'); - 'step 1' - if(target.hasCard(function(card){ - return get.name(card,target)=='shan'; - },'h')){ - player.discardPlayerCard(target,true,'h','visible').set('filterButton',function(button){ - return get.name(button.link)=='shan'; - }); - } - else if(player.countCards('he')>0) player.chooseToDiscard('he',true); + content() { + "step 0"; + var target = trigger.target; + event.target = target; + target.showHandcards( + get.translation(player) + "对" + get.translation(target) + "发动了【落刀】" + ); + ("step 1"); + if ( + target.hasCard(function (card) { + return get.name(card, target) == "shan"; + }, "h") + ) { + player + .discardPlayerCard(target, true, "h", "visible") + .set("filterButton", function (button) { + return get.name(button.link) == "shan"; + }); + } else if (player.countCards("he") > 0) player.chooseToDiscard("he", true); }, }, - satomi_daohai:{ - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return player.hasHistory('lose',function(evt){ - return evt.type=='discard'&&evt.cards2.length>0; - })&&player.hasUseTarget({name:'wugu'}); + satomi_daohai: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard" && evt.cards2.length > 0; + }) && player.hasUseTarget({ name: "wugu" }) + ); }, - check(event,player){ - return player.getUseValue({name:'wugu'})+player.getUseValue({name:'lebu'})>0; + check(event, player) { + return player.getUseValue({ name: "wugu" }) + player.getUseValue({ name: "lebu" }) > 0; }, - content(){ - 'step 0' - player.chooseUseTarget('wugu',true); - 'step 1' - if(result.bool){ - var cards=[]; - player.getHistory('gain',function(evt){ - if(evt.getParent().name=='wugu'&&evt.getParent(4)==event){ + content() { + "step 0"; + player.chooseUseTarget("wugu", true); + ("step 1"); + if (result.bool) { + var cards = []; + player.getHistory("gain", function (evt) { + if (evt.getParent().name == "wugu" && evt.getParent(4) == event) { cards.addArray(evt.cards); } }); - cards=cards.filter(function(card){ - return player.getCards('h').includes(card)&&game.checkMod(card,player,'unchanged','cardEnabled2',player); + cards = cards.filter(function (card) { + return ( + player.getCards("h").includes(card) && + game.checkMod(card, player, "unchanged", "cardEnabled2", player) + ); }); - if(cards.length){ + if (cards.length) { player.chooseCardTarget({ - prompt:'是否将得到的牌当做【乐不思蜀】使用?', - filterCard(card){ + prompt: "是否将得到的牌当做【乐不思蜀】使用?", + filterCard(card) { return _status.event.cards.includes(card); }, - cards:cards, - filterTarget(card,player,target){ - var card=get.autoViewAs({name:'lebu'},ui.selected.cards); - return player.canUse(card,target); + cards: cards, + filterTarget(card, player, target) { + var card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); + return player.canUse(card, target); }, - ai1:()=>1, - ai2(target){ - var player=_status.event.player,card=get.autoViewAs({name:'lebu'},ui.selected.cards); - return get.effect(target,{name:'lebu'},player,player); + ai1: () => 1, + ai2(target) { + var player = _status.event.player, + card = get.autoViewAs({ name: "lebu" }, ui.selected.cards); + return get.effect(target, { name: "lebu" }, player, player); }, - }) - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.useCard({name:'lebu'},result.cards,result.targets[0]); + }); + } else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.useCard({ name: "lebu" }, result.cards, result.targets[0]); } }, }, - erika_shisong:{ - trigger:{player:'useCard'}, - forced:true, - charlotte:true, - filter(event,player){ - if(player!=_status.currentPhase) return false; - var index=player.getHistory('useCard').indexOf(event),history=player.actionHistory; - for(var i=history.length-2;i>=0;i--){ - if(history[i].isMe){ - var evt=history[i].useCard[index]; - return evt&&get.type2(evt.card)==get.type(event.card); + erika_shisong: { + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + filter(event, player) { + if (player != _status.currentPhase) return false; + var index = player.getHistory("useCard").indexOf(event), + history = player.actionHistory; + for (var i = history.length - 2; i >= 0; i--) { + if (history[i].isMe) { + var evt = history[i].useCard[index]; + return evt && get.type2(evt.card) == get.type(event.card); } } return false; }, - content(){ + content() { player.draw(); }, - mod:{ - maxHandcard(player,num){ - return num+player.hujia; + mod: { + maxHandcard(player, num) { + return num + player.hujia; }, }, }, - erika_yousheng:{ - init:(player)=>{ - player.addSkill('erika_yousheng_mamori'); + erika_yousheng: { + init: (player) => { + player.addSkill("erika_yousheng_mamori"); }, - dutySkill:true, - group:['erika_yousheng_achieve','erika_yousheng_fail'], - trigger:{global:'useCardToTarget'}, - filter(event,player){ - return player.getStorage('erika_yousheng').includes(event.target)&& - (event.card.name=='sha'||(get.type2(event.card,false)=='trick'&&get.tag(event.card,'damage')>0))&& - (player.countMark('erika_yousheng_ruka')+1)<=player.countCards('he'); + dutySkill: true, + group: ["erika_yousheng_achieve", "erika_yousheng_fail"], + trigger: { global: "useCardToTarget" }, + filter(event, player) { + return ( + player.getStorage("erika_yousheng").includes(event.target) && + (event.card.name == "sha" || + (get.type2(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)) && + player.countMark("erika_yousheng_ruka") + 1 <= player.countCards("he") + ); }, - intro:{ - content:'已保护$', + intro: { + content: "已保护$", }, - async cost(event, trigger, player){ - const num=(player.countMark('erika_yousheng_ruka')+1); - event.result = await player.chooseToDiscard('he',num,get.prompt('erika_yousheng',trigger.target),'弃置'+(num)+'张牌,并转移'+get.translation(trigger.card)).forResult(); + async cost(event, trigger, player) { + const num = player.countMark("erika_yousheng_ruka") + 1; + event.result = await player + .chooseToDiscard( + "he", + num, + get.prompt("erika_yousheng", trigger.target), + "弃置" + num + "张牌,并转移" + get.translation(trigger.card) + ) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { player.discard(event.cards); - var ruka=trigger.target,evt=trigger.getParent(); + var ruka = trigger.target, + evt = trigger.getParent(); evt.targets.remove(ruka); evt.triggeredTargets2.remove(ruka); evt.targets.push(player); evt.triggeredTargets2.push(player); - player.addTempSkill('erika_yousheng_ruka'); - var str='erika_yousheng_'+player.playerid; - if(!evt[str]) evt[str]=[]; + player.addTempSkill("erika_yousheng_ruka"); + var str = "erika_yousheng_" + player.playerid; + if (!evt[str]) evt[str] = []; evt[str].add(ruka); }, - subSkill:{ - achieve:{ - trigger:{player:'changeHujiaAfter'}, - forced:true, - skillAnimation:'legend', - animationColor:'water', - filter(event,player){ - return player.storage.erika_yousheng&&event.num<0&&!player.hujia; + subSkill: { + achieve: { + trigger: { player: "changeHujiaAfter" }, + forced: true, + skillAnimation: "legend", + animationColor: "water", + filter(event, player) { + return player.storage.erika_yousheng && event.num < 0 && !player.hujia; }, - content(){ - 'step 0' - player.awakenSkill('erika_yousheng'); - game.log(player,'成功完成使命'); - var list=[player]; + content() { + "step 0"; + player.awakenSkill("erika_yousheng"); + game.log(player, "成功完成使命"); + var list = [player]; list.addArray(player.storage.erika_yousheng); list.sortBySeat(); - list=list.filter(function(current){ + list = list.filter(function (current) { return current.isAlive(); }); - player.line(list,'green'); - game.asyncDraw(list,3); - 'step 1' + player.line(list, "green"); + game.asyncDraw(list, 3); + ("step 1"); game.delayx(); }, }, - fail:{ - trigger:{global:'damageEnd'}, - forced:true, - filter(event,player){ - return player.getStorage('erika_yousheng').includes(event.player)&&event.card&&(event.card.name=='sha'||(get.type2(event.card,false)=='trick'&&get.tag(event.card,'damage')>0)); + fail: { + trigger: { global: "damageEnd" }, + forced: true, + filter(event, player) { + return ( + player.getStorage("erika_yousheng").includes(event.player) && + event.card && + (event.card.name == "sha" || + (get.type2(event.card, false) == "trick" && + get.tag(event.card, "damage") > 0)) + ); }, - content(){ - player.awakenSkill('erika_yousheng'); - game.log(player,'使命失败'); - var num=player.hujia; - if(num>0){ + content() { + player.awakenSkill("erika_yousheng"); + game.log(player, "使命失败"); + var num = player.hujia; + if (num > 0) { player.changeHujia(-num); - player.chooseToDiscard(num,true,'he'); + player.chooseToDiscard(num, true, "he"); } }, }, - mamori:{ - trigger:{global:'roundStart'}, - skillAnimation:true, - animationColor:'wood', - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt('erika_yousheng'),[1,2],lib.filter.notMe,'选择至多两名其他角色。你减2点体力上限并获得3点护甲。').set('ai',function(ruka){ - return -1; - }).forResult(); + mamori: { + trigger: { global: "roundStart" }, + skillAnimation: true, + animationColor: "wood", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("erika_yousheng"), + [1, 2], + lib.filter.notMe, + "选择至多两名其他角色。你减2点体力上限并获得3点护甲。" + ) + .set("ai", function (ruka) { + return -1; + }) + .forResult(); }, - async content(event, trigger, player){ - player.awakenSkill('erika_yousheng_mamori'); - player.markAuto('erika_yousheng', event.targets); + async content(event, trigger, player) { + player.awakenSkill("erika_yousheng_mamori"); + player.markAuto("erika_yousheng", event.targets); await player.loseMaxHp(2); await player.changeHujia(3); }, }, - ruka:{ - trigger:{global:'useCardAfter'}, - charlotte:true, - filter(event,player){ - return event['erika_yousheng_'+player.playerid]&&event.cards.filterInD().length>0; + ruka: { + trigger: { global: "useCardAfter" }, + charlotte: true, + filter(event, player) { + return ( + event["erika_yousheng_" + player.playerid] && + event.cards.filterInD().length > 0 + ); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget('是否令一名原目标角色获得'+get.translation(trigger.cards.filterInD())+'?',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('targets',trigger['erika_yousheng_'+player.playerid]).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + "是否令一名原目标角色获得" + + get.translation(trigger.cards.filterInD()) + + "?", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("targets", trigger["erika_yousheng_" + player.playerid]) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const ruka = event.targets[0]; - player.line(ruka,'green'); - ruka.gain(trigger.cards.filterInD(),'gain2'); + player.line(ruka, "green"); + ruka.gain(trigger.cards.filterInD(), "gain2"); }, }, }, }, - liyingxia_sanli:{ - trigger:{target:'useCardToTargeted'}, - forced:true, - filter(event,player){ - if(event.player==player||event.player!=_status.currentPhase) return false; - var index=event.player.getHistory('useCard',function(evt){ - return evt.targets.includes(player); - }).indexOf(event.getParent()); - if(index==2) return event.player.isIn()&&player.countCards('he')>0; - return index<2&&index>-1; + liyingxia_sanli: { + trigger: { target: "useCardToTargeted" }, + forced: true, + filter(event, player) { + if (event.player == player || event.player != _status.currentPhase) return false; + var index = event.player + .getHistory("useCard", function (evt) { + return evt.targets.includes(player); + }) + .indexOf(event.getParent()); + if (index == 2) return event.player.isIn() && player.countCards("he") > 0; + return index < 2 && index > -1; }, - logTarget:'player', - content(){ - 'step 0' - var index=trigger.player.getHistory('useCard',function(evt){ - return evt.targets.includes(player); - }).indexOf(trigger.getParent()); - if(index==2){ - player.chooseCard('he',true,'三礼:交给'+get.translation(trigger.player)+'一张牌'); - } - else{ + logTarget: "player", + content() { + "step 0"; + var index = trigger.player + .getHistory("useCard", function (evt) { + return evt.targets.includes(player); + }) + .indexOf(trigger.getParent()); + if (index == 2) { + player.chooseCard( + "he", + true, + "三礼:交给" + get.translation(trigger.player) + "一张牌" + ); + } else { player.draw(); event.finish(); } - 'step 1' - if(result.bool){ - player.give(result.cards,trigger.player); + ("step 1"); + if (result.bool) { + player.give(result.cards, trigger.player); } }, }, - liyingxia_zhenjun:{ - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return player.group=='key'; + liyingxia_zhenjun: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.group == "key"; }, - async cost(event, trigger, player){ - const num=player.getHistory('useCard',function(evt){ - return evt.card.name=='sha'||(get.type(evt.card)=='trick'&&get.tag(evt.card,'damage')>0); - }).length+1; - event.result = await player.chooseTarget(get.prompt('liyingxia_zhenjun'),[1,num],'令至多'+get.cnNumber(num)+'名角色各摸一张牌').set('ai',(serafu)=>get.attitude(_status.event.player,serafu)).forResult(); + async cost(event, trigger, player) { + const num = + player.getHistory("useCard", function (evt) { + return ( + evt.card.name == "sha" || + (get.type(evt.card) == "trick" && get.tag(evt.card, "damage") > 0) + ); + }).length + 1; + event.result = await player + .chooseTarget( + get.prompt("liyingxia_zhenjun"), + [1, num], + "令至多" + get.cnNumber(num) + "名角色各摸一张牌" + ) + .set("ai", (serafu) => get.attitude(_status.event.player, serafu)) + .forResult(); }, - content(){ + content() { targets.sortBySeat(); game.asyncDraw(targets); - for(var i of targets) i.addTempSkill('liyingxia_zhenjun_enhance',{player:player==i?'phaseJieshuBegin':'phaseAfter'}); + for (var i of targets) + i.addTempSkill("liyingxia_zhenjun_enhance", { + player: player == i ? "phaseJieshuBegin" : "phaseAfter", + }); game.delayx(); }, - subSkill:{ - enhance:{ - trigger:{source:'damageBegin1'}, - forced:true, - charlotte:true, - mark:true, - filter:(event,player)=>(player==_status.currentPhase), - intro:{content:'下回合首次造成的伤害+1'}, - content(){ + subSkill: { + enhance: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + mark: true, + filter: (event, player) => player == _status.currentPhase, + intro: { content: "下回合首次造成的伤害+1" }, + content() { trigger.num++; player.removeSkill(event.name); }, }, }, }, - liyingxia_wumai:{ - trigger:{global:'roundStart'}, - filter(event,player){ - return player.group=='shu'&&(player.getStorage('liyingxia_wumai').length<4||game.hasPlayer((current)=>current.isDamaged())); + liyingxia_wumai: { + trigger: { global: "roundStart" }, + filter(event, player) { + return ( + player.group == "shu" && + (player.getStorage("liyingxia_wumai").length < 4 || + game.hasPlayer((current) => current.isDamaged())) + ); }, - async cost(event, trigger, player){ - var list=lib.skill.liyingxia_wumai.derivation.slice(0); - list.removeArray(player.getStorage('liyingxia_wumai')); - if(list.length){ - const {result} = await player.chooseControl(list,'cancel2').set('prompt',get.prompt('liyingxia_wumai')).set('prompt2','获得一个技能直到本轮结束'); - if (result.control !== 'cancel2') { + async cost(event, trigger, player) { + var list = lib.skill.liyingxia_wumai.derivation.slice(0); + list.removeArray(player.getStorage("liyingxia_wumai")); + if (list.length) { + const { result } = await player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("liyingxia_wumai")) + .set("prompt2", "获得一个技能直到本轮结束"); + if (result.control !== "cancel2") { event.result = { bool: true, cost_data: { - type: 'addSkill', + type: "addSkill", skill: result.control, }, - } + }; } - } - else{ - const num=Math.min(3,game.countPlayer((current)=>current.isDamaged())); - const {result} = await player.chooseBool(get.prompt('liyingxia_wumai')+'(可摸'+get.cnNumber(num)+'张牌)'); + } else { + const num = Math.min( + 3, + game.countPlayer((current) => current.isDamaged()) + ); + const { result } = await player.chooseBool( + get.prompt("liyingxia_wumai") + "(可摸" + get.cnNumber(num) + "张牌)" + ); if (result.bool) { event.result = { bool: true, cost_data: { - type: 'drawCards', + type: "drawCards", num, }, - } + }; } } }, - async content(event, trigger, player){ + async content(event, trigger, player) { const result = event.cost_data; - if(result.type === 'addSkill'){ - player.markAuto('liyingxia_wumai',[result.skill]); - player.addTempSkills(result.skill, 'roundStart'); - } - else if(result.type === 'drawCards'){ + if (result.type === "addSkill") { + player.markAuto("liyingxia_wumai", [result.skill]); + player.addTempSkills(result.skill, "roundStart"); + } else if (result.type === "drawCards") { player.draw(result.num); } }, - derivation:['bazhen','rejizhi','reguanxing','youlong'], + derivation: ["bazhen", "rejizhi", "reguanxing", "youlong"], }, - kano_liezhen:{ - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return player.getHistory('useCard').length>0; + kano_liezhen: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.getHistory("useCard").length > 0; }, - frequent:true, - async cost(event,trigger,player){ - var history=player.getHistory('useCard'); - if(history.length>1){ - var type=get.type2(history[0].card,false); - for(var i=1;i 1) { + var type = get.type2(history[0].card, false); + for (var i = 1; i < history.length; i++) { + if (get.type2(history[i].card, false) != type) { + const result = await player + .chooseButton([ + "列阵:是否视为使用其中一种牌?", + [["kano_paibingbuzhen"].concat(get.zhinangs()), "vcard"], + ]) + .set("filterButton", function (button) { + return _status.event.player.hasUseTarget({ + name: button.link[2], + isCard: true, + }); + }) + .set("ai", function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + isCard: true, + }); + }) + .forResult(); + if (result.bool) + event.result = { + bool: true, + cost_data: { + links: result.links, + }, + }; return; } } } - var str=_status.renku.length?'获得仁库中的所有牌':'摸两张牌'; - event.result = await player.chooseBool(get.prompt('kano_liezhen'),str).set('frequentSkill','kano_liezhen').forResult(); + var str = _status.renku.length ? "获得仁库中的所有牌" : "摸两张牌"; + event.result = await player + .chooseBool(get.prompt("kano_liezhen"), str) + .set("frequentSkill", "kano_liezhen") + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const result = event.cost_data; if (!result || !result.links.length) { if (_status.renku.length) { const cards = _status.renku.slice(0); - _status.renku.length=0; + _status.renku.length = 0; game.updateRenku(); - await player.gain(cards, 'gain2', 'fromRenku'); - } - else player.draw(2); - } - else { + await player.gain(cards, "gain2", "fromRenku"); + } else player.draw(2); + } else { player.chooseUseTarget(result.links[0][2], true); } }, - init(player){ - player.storage.renku=true; + init(player) { + player.storage.renku = true; }, }, - kano_poyu:{ - trigger:{target:'useCardToTargeted'}, - charlotte:true, - filter(event,player){ - return _status.renku.length>0&&(event.card.name=='sha'||get.type(event.card)=='trick'&&get.tag(event.card,'damage')>0); + kano_poyu: { + trigger: { target: "useCardToTargeted" }, + charlotte: true, + filter(event, player) { + return ( + _status.renku.length > 0 && + (event.card.name == "sha" || + (get.type(event.card) == "trick" && get.tag(event.card, "damage") > 0)) + ); }, - check(trigger,player){ - return get.effect(player,trigger.card,trigger.player,player)<0; + check(trigger, player) { + return get.effect(player, trigger.card, trigger.player, player) < 0; }, - content(){ - 'step 0' + content() { + "step 0"; player.judge(); - 'step 1' - var bool=false,type=get.type2(result.card.name); - for(var i of _status.renku){ - if(get.suit(i)==result.suit||get.type2(i)==type){ - bool=true;break; + ("step 1"); + var bool = false, + type = get.type2(result.card.name); + for (var i of _status.renku) { + if (get.suit(i) == result.suit || get.type2(i) == type) { + bool = true; + break; } } - if(bool){ - player.chooseButton(['是否移去一张牌,令'+get.translation(trigger.card)+'对你无效?',_status.renku]).set('types',[result.suit,type]).set('filterButton',function(button){ - var types=_status.event.types; - return get.suit(button.link,false)==types[0]||get.type2(button.link,false)==types[1]; - }).set('ai',()=>1); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.links[0]; - player.$throw(card,1000); + if (bool) { + player + .chooseButton([ + "是否移去一张牌,令" + get.translation(trigger.card) + "对你无效?", + _status.renku, + ]) + .set("types", [result.suit, type]) + .set("filterButton", function (button) { + var types = _status.event.types; + return ( + get.suit(button.link, false) == types[0] || + get.type2(button.link, false) == types[1] + ); + }) + .set("ai", () => 1); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.links[0]; + player.$throw(card, 1000); _status.renku.remove(card); - game.cardsDiscard(card).fromRenku=true; - game.log(player,'将',card,'置入了弃牌堆'); + game.cardsDiscard(card).fromRenku = true; + game.log(player, "将", card, "置入了弃牌堆"); trigger.excluded.add(player); game.updateRenku(); } }, - init(player){ - player.storage.renku=true; + init(player) { + player.storage.renku = true; }, }, - mia_shihui:{ - trigger:{player:'phaseDrawBegin1'}, - forced:true, - filter(event,player){ + mia_shihui: { + trigger: { player: "phaseDrawBegin1" }, + forced: true, + filter(event, player) { return !event.numFixed; }, - content(){ + content() { trigger.changeToZero(); - var num=0;all=player.getAllHistory(); - if(all.length>1){ - for(var i=all.length-2;i>=0;i--){ - if(all[i].isMe){ - for(var evt of all[i].lose){ - if(evt.type=='discard') num+=evt.cards2.length; + var num = 0; + all = player.getAllHistory(); + if (all.length > 1) { + for (var i = all.length - 2; i >= 0; i--) { + if (all[i].isMe) { + for (var evt of all[i].lose) { + if (evt.type == "discard") num += evt.cards2.length; } break; } } } - player.draw(1+num); + player.draw(1 + num); }, - group:'mia_shihui_recover', - subSkill:{ - recover:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter(event,player){ - return player.isDamaged()||player.countCards('he')>0; + group: "mia_shihui_recover", + subSkill: { + recover: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter(event, player) { + return player.isDamaged() || player.countCards("he") > 0; }, - content(){ - player.chooseToDiscard('he',true); + content() { + player.chooseToDiscard("he", true); player.recover(); }, }, }, }, - mia_qianmeng:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + mia_qianmeng: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - dutySkill:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + dutySkill: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ - 'step 0' + content() { + "step 0"; player.draw(); - 'step 1' - if(player.countCards('he')>0){ - player.chooseCard('he',true,'潜梦:选择一张牌置于牌堆中'); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - player.storage.mia_qianmeng=card; - player.$throw(card,1000); - player.lose(card,ui.cardPile).insert_index=function(){ - return ui.cardPile.childNodes[Math.ceil(ui.cardPile.childNodes.length/2)]; + ("step 1"); + if (player.countCards("he") > 0) { + player.chooseCard("he", true, "潜梦:选择一张牌置于牌堆中"); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + player.storage.mia_qianmeng = card; + player.$throw(card, 1000); + player.lose(card, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[Math.ceil(ui.cardPile.childNodes.length / 2)]; }; - } - else event.finish(); - 'step 3' + } else event.finish(); + ("step 3"); game.delayx(); }, - onremove:true, - group:['mia_qianmeng_achieve','mia_qianmeng_fail'], - subSkill:{ - achieve:{ - trigger:{ - global:['gainAfter','loseAsyncAfter'], + onremove: true, + group: ["mia_qianmeng_achieve", "mia_qianmeng_fail"], + subSkill: { + achieve: { + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - forced:true, - filter(event,player){ - var card=player.storage.mia_qianmeng; - if(event.name=='gain'){ - var source=event.player,cards=event.getg(source); - return cards.includes(card)&&source.getCards('hejsx').includes(card); - } - else{ - if(event.type!='gain') return false; - var owner=get.owner(card); - return owner&&event.getg(owner).includes(card); + forced: true, + filter(event, player) { + var card = player.storage.mia_qianmeng; + if (event.name == "gain") { + var source = event.player, + cards = event.getg(source); + return cards.includes(card) && source.getCards("hejsx").includes(card); + } else { + if (event.type != "gain") return false; + var owner = get.owner(card); + return owner && event.getg(owner).includes(card); } }, - skillAnimation:true, - animationColor:'key', - content(){ - 'step 0' - game.log(player,'成功完成使命'); - player.awakenSkill('mia_qianmeng'); - var card=player.storage.mia_qianmeng,owner=get.owner(card); - if(owner&&owner!=player) owner.give(card,player); - 'step 1' - if(player.hp1){ - for(var i=all.length-2;i>=0;i--){ - if(all[i].isMe){ - num+=all[i].useCard.length; + content() { + var num = 0; + all = player.getAllHistory(); + if (all.length > 1) { + for (var i = all.length - 2; i >= 0; i--) { + if (all[i].isMe) { + num += all[i].useCard.length; break; } } } - trigger.num+=num; + trigger.num += num; }, }, - kyou_zhidian:{ - locked:false, - mod:{ - targetInRange(card){ - if(card.kyou_zhidian) return true; + kyou_zhidian: { + locked: false, + mod: { + targetInRange(card) { + if (card.kyou_zhidian) return true; }, - aiOrder(player,card,numx){ - var num=_status.event._kyou_zhidian_baseValue; - if(num>0&&get.type2(card)=='trick'&&player.getUseValue(card) 0 && get.type2(card) == "trick" && player.getUseValue(card) < num) + return numx / 10; }, }, - enable:'chooseToUse', - filter(event,player){ - return player.countCards('hs',(card)=>get.type2(card)=='trick')>0; + enable: "chooseToUse", + filter(event, player) { + return player.countCards("hs", (card) => get.type2(card) == "trick") > 0; }, - filterCard(card){ - return get.type2(card)=='trick'; + filterCard(card) { + return get.type2(card) == "trick"; }, - onChooseToUse(event){ - event._kyou_zhidian_baseValue=event.player.getUseValue({name:'sha'}); + onChooseToUse(event) { + event._kyou_zhidian_baseValue = event.player.getUseValue({ + name: "sha", + }); }, - check(card){ - var num=_status.event._kyou_zhidian_baseValue,player=_status.event.player; - return num-player.getUseValue(card); + check(card) { + var num = _status.event._kyou_zhidian_baseValue, + player = _status.event.player; + return num - player.getUseValue(card); }, - prompt:'将一张锦囊牌当做【杀】使用', - viewAs:{ - name:'sha', - kyou_zhidian:true, + prompt: "将一张锦囊牌当做【杀】使用", + viewAs: { + name: "sha", + kyou_zhidian: true, }, - group:'kyou_zhidian_aim', - ai:{ - respondSha:true, - skillTagFilter:(player)=>player.countCards('hs',(card)=>get.type2(card)=='trick')>0, + group: "kyou_zhidian_aim", + ai: { + respondSha: true, + skillTagFilter: (player) => + player.countCards("hs", (card) => get.type2(card) == "trick") > 0, }, - subSkill:{ - aim:{ - trigger:{ - player:'useCardToPlayered', + subSkill: { + aim: { + trigger: { + player: "useCardToPlayered", }, - forced:true, - locked:false, - filter(event,player){ - return event.isFirstTarget&&event.card.name=='sha'; + forced: true, + locked: false, + filter(event, player) { + return event.isFirstTarget && event.card.name == "sha"; }, - logTarget:'target', - content(){ - 'step 0' - var list=['不可被响应','无视防具','伤害+1','不计入次数']; + logTarget: "target", + content() { + "step 0"; + var list = ["不可被响应", "无视防具", "伤害+1", "不计入次数"]; list.remove(player.storage.kyou_zhidian); - player.chooseControl(list).set('prompt','掷典:请为'+get.translation(trigger.card)+'选择一种效果').set('choice',function(){ - if(list.includes('不计入次数')&&player.hasSha()) return '不计入次数'; - if(list.includes('不可被响应')&&trigger.target.mayHaveShan(player,'use',trigger.target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) return '不可被响应'; - if(list.includes('伤害+1')) return '伤害+1'; - return list.randomGet(); - }()).set('ai',()=>_status.event.choice); - 'step 1' - var target=trigger.target; - player.storage.kyou_zhidian=result.control; - game.log(player,'对',target,'的',trigger.card,'#g'+result.control); - switch(result.control){ - case '不可被响应': + player + .chooseControl(list) + .set("prompt", "掷典:请为" + get.translation(trigger.card) + "选择一种效果") + .set( + "choice", + (function () { + if (list.includes("不计入次数") && player.hasSha()) + return "不计入次数"; + if ( + list.includes("不可被响应") && + trigger.target.mayHaveShan( + player, + "use", + trigger.target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return "不可被响应"; + if (list.includes("伤害+1")) return "伤害+1"; + return list.randomGet(); + })() + ) + .set("ai", () => _status.event.choice); + ("step 1"); + var target = trigger.target; + player.storage.kyou_zhidian = result.control; + game.log(player, "对", target, "的", trigger.card, "#g" + result.control); + switch (result.control) { + case "不可被响应": trigger.directHit.add(target); break; - case '无视防具': - target.addTempSkill('qinggang2'); + case "无视防具": + target.addTempSkill("qinggang2"); target.storage.qinggang2.add(trigger.card); break; - case '伤害+1': - var map=trigger.customArgs; - var id=target.playerid; - if(!map[id]) map[id]={}; - if(!map[id].extraDamage) map[id].extraDamage=0; + case "伤害+1": + var map = trigger.customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; map[id].extraDamage++; break; - case '不计入次数': - var evt=trigger.getParent(); - if(evt.addCount!==false){ - evt.addCount=false; + case "不计入次数": + var evt = trigger.getParent(); + if (evt.addCount !== false) { + evt.addCount = false; player.getStat().card.sha--; } break; } }, - } + }, }, }, - kyou_duanfa:{ - trigger:{player:'damageBegin2'}, - limited:true, - skillAnimation:true, - animationColor:'thunder', - filter(event,player){ - return player.hp<=event.num; + kyou_duanfa: { + trigger: { player: "damageBegin2" }, + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.hp <= event.num; }, - content(){ - player.awakenSkill('kyou_duanfa'); - if(player.countCards('h')>0) player.chooseToDiscard('h',true,player.countCards('h')); + content() { + player.awakenSkill("kyou_duanfa"); + if (player.countCards("h") > 0) player.chooseToDiscard("h", true, player.countCards("h")); player.recover(); trigger.cancel(); - player.addTempSkill('kyou_duanfa_draw',{player:'phaseBeginStart'}); + player.addTempSkill("kyou_duanfa_draw", { + player: "phaseBeginStart", + }); }, - subSkill:{ - draw:{ - trigger:{target:'useCardToTargeted'}, - forced:true, - charlotte:true, - filter(event,player){ - if(event.card.name=='sha') return true; - return get.type(event.card,false)=='trick'&&get.tag(event.card,'damage')>0; + subSkill: { + draw: { + trigger: { target: "useCardToTargeted" }, + forced: true, + charlotte: true, + filter(event, player) { + if (event.card.name == "sha") return true; + return ( + get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0 + ); }, - content(){ + content() { player.draw(); }, }, }, }, - kotarou_aurora:{ - trigger:{ - player:['damageEnd','loseHpEnd','gainMaxHpEnd'] + kotarou_aurora: { + trigger: { + player: ["damageEnd", "loseHpEnd", "gainMaxHpEnd"], }, - forced:true, - charlotte:true, - filter(event,player){ + forced: true, + charlotte: true, + filter(event, player) { return player.hasEnabledSlot(1); }, - content(){ - if(player.hasEmptySlot(1)){ - var card=get.cardPile2(function(card){ - return get.subtype(card)=='equip1'&&!get.cardtag(card,'gifts')&&player.canUse(card,player); + content() { + if (player.hasEmptySlot(1)) { + var card = get.cardPile2(function (card) { + return ( + get.subtype(card) == "equip1" && + !get.cardtag(card, "gifts") && + player.canUse(card, player) + ); }); - if(card) player.chooseUseTarget(card,true); - } - else player.chooseUseTarget('sha',true,false); + if (card) player.chooseUseTarget(card, true); + } else player.chooseUseTarget("sha", true, false); }, }, - kotarou_rewrite:{ - enable:'phaseUse', - charlotte:true, - filter(event,player){ - return !player.hasSkill('kotarou_rewrite_block'); + kotarou_rewrite: { + enable: "phaseUse", + charlotte: true, + filter(event, player) { + return !player.hasSkill("kotarou_rewrite_block"); }, - content(){ - 'step 0' - player.getHistory('custom').push({kotarou_rewrite:true}); - player.chooseControl().set('choiceList',[ - '视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌', - '移动场上的一张牌', - '增加1点体力上限并失去1点体力', - '本回合内下一次造成的伤害+1', - '本回合内下一次回复体力时,额外回复1点体力', - '本回合内手牌上限和【杀】的使用次数+1                         ', - ]).set('ai',function(){ - var player=_status.event.player; - if(player.hp>2&&player.getUseValue({name:'sha'})>0) return 2; - return 0; - }); - 'step 1' - lib.skill.kotarou_rewrite.rewrites[result.index](player,event); - if(result.index!=0) event.goto(3); - 'step 2' - if(result.bool){ + content() { + "step 0"; + player.getHistory("custom").push({ kotarou_rewrite: true }); + player + .chooseControl() + .set("choiceList", [ + "视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌", + "移动场上的一张牌", + "增加1点体力上限并失去1点体力", + "本回合内下一次造成的伤害+1", + "本回合内下一次回复体力时,额外回复1点体力", + "本回合内手牌上限和【杀】的使用次数+1                         ", + ]) + .set("ai", function () { + var player = _status.event.player; + if (player.hp > 2 && player.getUseValue({ name: "sha" }) > 0) return 2; + return 0; + }); + ("step 1"); + lib.skill.kotarou_rewrite.rewrites[result.index](player, event); + if (result.index != 0) event.goto(3); + ("step 2"); + if (result.bool) { player.storage.kotarou_rewrite.push(result.links[0][2]); - player.chooseUseTarget(true,{name:result.links[0][2],nature:result.links[0][3],isCard:true}); + player.chooseUseTarget(true, { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }); } - 'step 3' - if(player.getHistory('custom',function(evt){ - return evt&&evt.kotarou_rewrite==true; - }).length>=3) player.addTempSkill('kotarou_rewrite_block'); + ("step 3"); + if ( + player.getHistory("custom", function (evt) { + return evt && evt.kotarou_rewrite == true; + }).length >= 3 + ) + player.addTempSkill("kotarou_rewrite_block"); }, - onremove:true, - rewrites:[ - function(player,event){ - var list=[]; - if(!player.storage.kotarou_rewrite) player.storage.kotarou_rewrite=[]; - for(var i of lib.inpile){ - if(player.storage.kotarou_rewrite.includes(i)) continue; - var type=get.type(i); - if((type=='basic'||type=='trick')) list.push([type,'',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature) list.push([type,'',i,j]); + onremove: true, + rewrites: [ + function (player, event) { + var list = []; + if (!player.storage.kotarou_rewrite) player.storage.kotarou_rewrite = []; + for (var i of lib.inpile) { + if (player.storage.kotarou_rewrite.includes(i)) continue; + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push([type, "", i, j]); } } - if(list.length){ - player.chooseButton(['改写:视为使用一张基本牌或普通锦囊牌',[list,'vcard']],true).set('filterButton',function(button){ - return player.hasUseTarget({name:button.link[2],nature:button.link[3],isCard:true},null,true); - }).set('ai',function(button){ - return player.getUseValue({name:button.link[2],nature:button.link[3],isCard:true}); - }); - } - else event._result={bool:false}; + if (list.length) { + player + .chooseButton(["改写:视为使用一张基本牌或普通锦囊牌", [list, "vcard"]], true) + .set("filterButton", function (button) { + return player.hasUseTarget( + { + name: button.link[2], + nature: button.link[3], + isCard: true, + }, + null, + true + ); + }) + .set("ai", function (button) { + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + } else event._result = { bool: false }; }, - function(player,event){ + function (player, event) { player.moveCard(true); }, - function(player,event){ - if(player.maxHp<5) player.gainMaxHp(); + function (player, event) { + if (player.maxHp < 5) player.gainMaxHp(); player.loseHp(); }, - function(player,event){ - player.addSkill('kotarou_rewrite_damage'); - player.addMark('kotarou_rewrite_damage',1,false); - game.log(player,'本回合下次造成的伤害','#y+1'); + function (player, event) { + player.addSkill("kotarou_rewrite_damage"); + player.addMark("kotarou_rewrite_damage", 1, false); + game.log(player, "本回合下次造成的伤害", "#y+1"); }, - function(player,event){ - player.addSkill('kotarou_rewrite_recover'); - player.addMark('kotarou_rewrite_recover',1,false); - game.log(player,'本回合下次回复的体力','#y+1'); + function (player, event) { + player.addSkill("kotarou_rewrite_recover"); + player.addMark("kotarou_rewrite_recover", 1, false); + game.log(player, "本回合下次回复的体力", "#y+1"); }, - function(player,event){ - player.addSkill('kotarou_rewrite_sha'); - player.addMark('kotarou_rewrite_sha',1,false); - game.log(player,'本回合的手牌上限和使用【杀】的次数上限','#y+1'); + function (player, event) { + player.addSkill("kotarou_rewrite_sha"); + player.addMark("kotarou_rewrite_sha", 1, false); + game.log(player, "本回合的手牌上限和使用【杀】的次数上限", "#y+1"); }, ], - ai:{ - order:4, - result:{ - player(player){ - if(player.getHistory('custom',function(evt){ - return evt&&evt.kotarou_rewrite==true; - }).length>=2) return 0; + ai: { + order: 4, + result: { + player(player) { + if ( + player.getHistory("custom", function (evt) { + return evt && evt.kotarou_rewrite == true; + }).length >= 2 + ) + return 0; return 1; }, - } - }, - }, - kotarou_rewrite_damage:{ - onremove:true, - trigger:{source:'damageBegin1'}, - forced:true, - content(){ - trigger.num+=player.countMark('kotarou_rewrite_damage'); - player.removeSkill('kotarou_rewrite_damage'); - }, - charlotte:true, - intro:{content:'下一次造成的伤害+#'}, - }, - kotarou_rewrite_recover:{ - onremove:true, - trigger:{player:'recoverBegin'}, - forced:true, - content(){ - trigger.num+=player.countMark('kotarou_rewrite_recover'); - player.removeSkill('kotarou_rewrite_recover'); - }, - charlotte:true, - intro:{content:'下一次回复的体力+#'}, - }, - kotarou_rewrite_sha:{ - onremove:true, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('kotarou_rewrite_sha'); }, - cardUsable(card,player,num){ - if(card.name=='sha') return num+player.countMark('kotarou_rewrite_sha'); - } - }, - charlotte:true, - intro:{content:'手牌上限和出杀次数+#'}, - }, - kotarou_rewrite_block:{ - trigger:{player:'phaseEnd'}, - forced:true, - charlotte:true, - content(){ - player.removeSkill('kotarou_rewrite'); - player.removeSkill('kotarou_aurora'); - if(player.maxHp>3) player.loseMaxHp(player.maxHp-3) }, }, - tenzen_yixing:{ - trigger:{ - global:'damageEnd', + kotarou_rewrite_damage: { + onremove: true, + trigger: { source: "damageBegin1" }, + forced: true, + content() { + trigger.num += player.countMark("kotarou_rewrite_damage"); + player.removeSkill("kotarou_rewrite_damage"); }, - filter(event,player){ - if(!event.card||(event.card.name!='sha'&&event.card.name!='juedou')) return false; - var hairi=event.source; - if(hairi&&(hairi==player||player.inRangeOf(hairi))&&hairi.isIn()&&(hairi.name1!='key_shizuku'&&hairi.name2!='key_shizuku')) return true; - hairi=event.player; - return (hairi&&(hairi==player||player.inRange(hairi))&&hairi.isIn()&&(hairi.name1!='key_shizuku'&&hairi.name2!='key_shizuku')); + charlotte: true, + intro: { content: "下一次造成的伤害+#" }, + }, + kotarou_rewrite_recover: { + onremove: true, + trigger: { player: "recoverBegin" }, + forced: true, + content() { + trigger.num += player.countMark("kotarou_rewrite_recover"); + player.removeSkill("kotarou_rewrite_recover"); }, - frequent:true, - content(){ - 'step 0' + charlotte: true, + intro: { content: "下一次回复的体力+#" }, + }, + kotarou_rewrite_sha: { + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("kotarou_rewrite_sha"); + }, + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("kotarou_rewrite_sha"); + }, + }, + charlotte: true, + intro: { content: "手牌上限和出杀次数+#" }, + }, + kotarou_rewrite_block: { + trigger: { player: "phaseEnd" }, + forced: true, + charlotte: true, + content() { + player.removeSkill("kotarou_rewrite"); + player.removeSkill("kotarou_aurora"); + if (player.maxHp > 3) player.loseMaxHp(player.maxHp - 3); + }, + }, + tenzen_yixing: { + trigger: { + global: "damageEnd", + }, + filter(event, player) { + if (!event.card || (event.card.name != "sha" && event.card.name != "juedou")) + return false; + var hairi = event.source; + if ( + hairi && + (hairi == player || player.inRangeOf(hairi)) && + hairi.isIn() && + hairi.name1 != "key_shizuku" && + hairi.name2 != "key_shizuku" + ) + return true; + hairi = event.player; + return ( + hairi && + (hairi == player || player.inRange(hairi)) && + hairi.isIn() && + hairi.name1 != "key_shizuku" && + hairi.name2 != "key_shizuku" + ); + }, + frequent: true, + content() { + "step 0"; player.draw(); - 'step 1' - if(player.countCards('he')>0){ - player.chooseCard('he',true,'将一张牌作为“兴”置于武将牌上'); - } - else event.finish(); - 'step 2' - if(result.bool){ - var cards=result.cards; - player.addToExpansion(cards,player,'give').gaintag.add('tenzen_yixing'); + ("step 1"); + if (player.countCards("he") > 0) { + player.chooseCard("he", true, "将一张牌作为“兴”置于武将牌上"); + } else event.finish(); + ("step 2"); + if (result.bool) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("tenzen_yixing"); } }, - intro:{ - content:'expansion', - onunmark:'expansion', + intro: { + content: "expansion", + onunmark: "expansion", }, - onremove(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'tenzen_yixing_counter', - subSkill:{ - counter:{ - trigger:{target:'useCardToTargeted'}, - filter(event,player){ - if(player==event.player||!player.getExpansions('tenzen_yixing').length) return false; - return event.targets.length==1&&(event.card.name=='sha'||get.type(event.card)=='trick'); + group: "tenzen_yixing_counter", + subSkill: { + counter: { + trigger: { target: "useCardToTargeted" }, + filter(event, player) { + if (player == event.player || !player.getExpansions("tenzen_yixing").length) + return false; + return ( + event.targets.length == 1 && + (event.card.name == "sha" || get.type(event.card) == "trick") + ); }, - prompt2(event){ - return '获得一张“兴”,且'+get.translation(event.card)+'结算完成后可以弃置两张牌,视为对'+get.translation(event.player)+'使用一张同名牌'; + prompt2(event) { + return ( + "获得一张“兴”,且" + + get.translation(event.card) + + "结算完成后可以弃置两张牌,视为对" + + get.translation(event.player) + + "使用一张同名牌" + ); }, - check(event,player){ - if(!player.storage.tenzen_lingyu&&player.getExpansions('tenzen_yixing').length<3) return false; - var card={ - name:event.card.name, - nature:event.card.nature, - isCard:true, + check(event, player) { + if ( + !player.storage.tenzen_lingyu && + player.getExpansions("tenzen_yixing").length < 3 + ) + return false; + var card = { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }; + return ( + player.canUse(card, event.player, false) && + get.effect(event.player, card, player, player) > 0 + ); + }, + content() { + "step 0"; + player.chooseButton( + ["选择获得一张“兴”", player.getExpansions("tenzen_yixing")], + true + ); + ("step 1"); + if (result.bool) { + player.gain(result.links, "gain2"); } - return player.canUse(card,event.player,false)&&get.effect(event.player,card,player,player)>0; - }, - content(){ - 'step 0' - player.chooseButton(['选择获得一张“兴”',player.getExpansions('tenzen_yixing')],true); - 'step 1' - if(result.bool){ - player.gain(result.links,'gain2'); - } - var next=game.createEvent('tenzen_yixing_insert'); + var next = game.createEvent("tenzen_yixing_insert"); event.next.remove(next); trigger.getParent().after.push(next); - next.player=player; - next.target=trigger.player; + next.player = player; + next.target = trigger.player; next.setContent(lib.skill.tenzen_yixing.content_extra); }, }, }, - content_extra(){ - 'step 0' - var card=event.getParent().card; - event.card={ - name:card.name, - nature:card.nature, - isCard:true, + content_extra() { + "step 0"; + var card = event.getParent().card; + event.card = { + name: card.name, + nature: card.nature, + isCard: true, }; - if(player.countCards('he')>1&&target&&target.isIn()&&player.canUse(event.card,target,false)){ - player.chooseToDiscard('he',2,'是否弃置两张牌,视为对'+get.translation(target)+'使用'+get.translation(event.card)+'?').set('ai',function(card){ - return 5-get.value(card); - }); - } - else event.finish(); - 'step 1' - if(result.bool) player.useCard(card,target,false,'tenzen_yixing'); + if ( + player.countCards("he") > 1 && + target && + target.isIn() && + player.canUse(event.card, target, false) + ) { + player + .chooseToDiscard( + "he", + 2, + "是否弃置两张牌,视为对" + + get.translation(target) + + "使用" + + get.translation(event.card) + + "?" + ) + .set("ai", function (card) { + return 5 - get.value(card); + }); + } else event.finish(); + ("step 1"); + if (result.bool) player.useCard(card, target, false, "tenzen_yixing"); }, }, - tenzen_lingyu:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'water', - filter(event,player){ - return player.getExpansions('tenzen_yixing').length>=player.hp; + tenzen_lingyu: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player.getExpansions("tenzen_yixing").length >= player.hp; }, - content(){ - player.awakenSkill('tenzen_lingyu'); - player.storage.tenzen_lingyu=true; + content() { + player.awakenSkill("tenzen_lingyu"); + player.storage.tenzen_lingyu = true; player.loseMaxHp(); - if(player.isHealthy()) player.draw(2); - player.addSkills('tenzen_tianquan'); + if (player.isHealthy()) player.draw(2); + player.addSkills("tenzen_tianquan"); }, }, - tenzen_tianquan:{ - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - return (event.card.name=='sha'||event.card.name=='juedou')&&event.targets.length==1&&player.getExpansions('tenzen_yixing').length>1; + tenzen_tianquan: { + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return ( + (event.card.name == "sha" || event.card.name == "juedou") && + event.targets.length == 1 && + player.getExpansions("tenzen_yixing").length > 1 + ); }, - logTarget:'target', - usable:1, - check(event,player){ - return get.attitude(player,event.target)<0; + logTarget: "target", + usable: 1, + check(event, player) { + return get.attitude(player, event.target) < 0; }, - content(){ - 'step 0' + content() { + "step 0"; //player.viewHandcards(trigger.target); - player.chooseButton(['选择移去两张“兴”',player.getExpansions('tenzen_yixing')],true,2); - 'step 1' - if(result.bool){ + player.chooseButton(["选择移去两张“兴”", player.getExpansions("tenzen_yixing")], true, 2); + ("step 1"); + if (result.bool) { player.loseToDiscardpile(result.links); - var cards=get.cards(5); - player.showCards(cards,get.translation(player)+'发动了【天全】'); - game.cardsGotoOrdering(cards).relatedEvent=trigger.getParent(); - var num=cards.filter(function(card){ - return get.type(card,false)=='basic'; + var cards = get.cards(5); + player.showCards(cards, get.translation(player) + "发动了【天全】"); + game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent(); + var num = cards.filter(function (card) { + return get.type(card, false) == "basic"; }).length; - if(num){ - if(trigger.card.name=='sha'){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number'){ - map[id].shanRequired+=num; + if (num) { + if (trigger.card.name == "sha") { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { + map[id].shanRequired += num; + } else { + map[id].shanRequired = 1 + num; } - else{ - map[id].shanRequired=1+num; - } - } - else{ - var idt=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[idt]) map[idt]={}; - if(!map[idt].shaReq) map[idt].shaReq={}; - if(!map[idt].shaReq[idt]) map[idt].shaReq[idt]=1; + } else { + var idt = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[idt]) map[idt] = {}; + if (!map[idt].shaReq) map[idt].shaReq = {}; + if (!map[idt].shaReq[idt]) map[idt].shaReq[idt] = 1; map[idt].shaReq[idt]++; } } - if(num<5){ - var next=game.createEvent('tenzen_lingyu_gain'); - next.cards=cards; - next.player=player; + if (num < 5) { + var next = game.createEvent("tenzen_lingyu_gain"); + next.cards = cards; + next.player = player; event.next.remove(next); trigger.getParent().after.push(next); - next.setContent(function(){ - if(player.getHistory('sourceDamage',function(evt){ - return evt.card==event.parent.card; - }).length>0) player.gain(cards.filter(function(card){ - return get.type(card,false)!='basic'; - }),'gain2'); + next.setContent(function () { + if ( + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.parent.card; + }).length > 0 + ) + player.gain( + cards.filter(function (card) { + return get.type(card, false) != "basic"; + }), + "gain2" + ); }); } } }, }, - kyouko_rongzhu:{ - trigger:{global:'gainEnd'}, - filter(event,player){ - if(player==event.player||event.getParent().name=='kyouko_rongzhu') return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + kyouko_rongzhu: { + trigger: { global: "gainEnd" }, + filter(event, player) { + if (player == event.player || event.getParent().name == "kyouko_rongzhu") return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; }, - logTarget:'player', - check(event,player){ - return get.attitude(player,event.player)>0; + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 0; }, - content(){ - 'step 0' + content() { + "step 0"; player.draw(); - 'step 1' - var target=trigger.player; - if(player.countCards('he')>0&&target.isIn()){ - player.chooseCard('he',true,'将一张牌交给'+get.translation(target)); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.give(result.cards,trigger.player); - var target=_status.currentPhase; + ("step 1"); + var target = trigger.player; + if (player.countCards("he") > 0 && target.isIn()) { + player.chooseCard("he", true, "将一张牌交给" + get.translation(target)); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.give(result.cards, trigger.player); + var target = _status.currentPhase; var name; - if(target==player){ - name='kyouko_rongzhu_me'; + if (target == player) { + name = "kyouko_rongzhu_me"; player.addTempSkill(name); - player.addMark(name,1,false); - } - else if(target==trigger.player){ - name='kyouko_rongzhu_notme'; - player.addTempSkill(name); - player.addMark(name,1,false); + player.addMark(name, 1, false); + } else if (target == trigger.player) { + name = "kyouko_rongzhu_notme"; + target.addTempSkill(name); + target.addMark(name, 1, false); } } }, - subSkill:{ - me:{ - mod:{ - maxHandcard(player,num){ - return num+player.countMark('kyouko_rongzhu_me'); + subSkill: { + me: { + mod: { + maxHandcard(player, num) { + return num + player.countMark("kyouko_rongzhu_me"); }, }, - intro:{content:'手牌上限+#'}, - onremove:true, + intro: { content: "手牌上限+#" }, + onremove: true, }, - notme:{ - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha') return num+player.countMark('kyouko_rongzhu_notme'); + notme: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("kyouko_rongzhu_notme"); }, }, - intro:{content:'使用杀的次数上限+#'}, - onremove:true, + intro: { content: "使用杀的次数上限+#" }, + onremove: true, }, }, }, - kyouko_gongmian:{ - enable:'phaseUse', - prompt:'出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。', - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&lib.skill.kyouko_gongmian.filterTarget(null,player,current); + kyouko_gongmian: { + enable: "phaseUse", + prompt: "出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。", + filter(event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && lib.skill.kyouko_gongmian.filterTarget(null, player, current) + ); }); }, - filterTarget(card,kyouko,hina){ - if(kyouko==hina||kyouko.getStorage('kyouko_gongmian').includes(hina)) return false; - var hs=hina.countCards('he'); - if(hs==0) return kyouko.countCards('h')==0; + filterTarget(card, kyouko, hina) { + if (kyouko == hina || kyouko.getStorage("kyouko_gongmian").includes(hina)) return false; + var hs = hina.countCards("he"); + if (hs == 0) return kyouko.countCards("h") == 0; return true; }, - content(){ - 'step 0' - player.markAuto('kyouko_gongmian',targets); - var hs=player.countCards('h'),ts=target.countCards('h'); - player.getHistory('custom').push({kyouko_gongmian:true}); - if(hs>ts){ - event.utype=1; - target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); + content() { + "step 0"; + player.markAuto("kyouko_gongmian", targets); + var hs = player.countCards("h"), + ts = target.countCards("h"); + player.getHistory("custom").push({ kyouko_gongmian: true }); + if (hs > ts) { + event.utype = 1; + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } else if (hs == ts) { + game.asyncDraw([player, target]); + event.utype = 2; + } else { + event.utype = 3; + player.gainPlayerCard(target, true, "he"); } - else if(hs==ts){ - game.asyncDraw([player,target]); - event.utype=2; - } - else{ - event.utype=3; - player.gainPlayerCard(target,true,'he'); - } - 'step 1' - if(event.utype==2){ + ("step 1"); + if (event.utype == 2) { game.delayx(); event.finish(); - } - else if(!result.bool) event.finish(); - else if(event.utype==1) target.give(result.cards,player); - 'step 2' - if(player.countCards('he')>0){ - player.chooseCard('he',true,'交给'+get.translation(target)+'一张牌'); - } - else event.finish(); - 'step 3' - if(result.bool) player.give(result.cards,target); + } else if (!result.bool) event.finish(); + else if (event.utype == 1) target.give(result.cards, player); + ("step 2"); + if (player.countCards("he") > 0) { + player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); + } else event.finish(); + ("step 3"); + if (result.bool) player.give(result.cards, target); }, - intro:{ - content:'已与$共勉', + intro: { + content: "已与$共勉", }, - group:['kyouko_gongmian_use','kyouko_gongmian_discard'], - ai:{ - order:6, - result:{ - target(player,target){ - if(player.getHistory('custom',function(evt){ - return evt.kyouko_gongmian==true; - }).length) return 0; + group: ["kyouko_gongmian_use", "kyouko_gongmian_discard"], + ai: { + order: 6, + result: { + target(player, target) { + if ( + player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length + ) + return 0; return 1; }, }, }, }, - kyouko_gongmian_use:{ - trigger:{player:'phaseUseEnd'}, - filter(event,player){ - return player.getHistory('custom',function(evt){ - return evt.kyouko_gongmian==true; - }).length>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countGainableCards(player,'hej')>0; - }); + kyouko_gongmian_use: { + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return ( + player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length > 0 && + game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "hej") > 0; + }) + ); }, - async cost(event, trigger, player){ - const num = player.getHistory('custom',function(evt){ - return evt.kyouko_gongmian==true; + async cost(event, trigger, player) { + const num = player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; }).length; - event.result = await player.chooseTarget(get.prompt('kyouko_gongmian'),'获得一名其他角色的至多'+get.cnNumber(num)+'张牌,然后交给其等量的牌',function(card,player,target){ - return target!=player&&target.countGainableCards(player,'hej')>0; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att>0) return att; - var he=player.getCards('he'); - if(target.countCards('he',function(card){ - return get.value(card,target)>7; - })&&he.length>0) return -att+5-Math.min.apply(Math,he.map(function(card){ - return get.value(card,player); - })); - return 0; - }).forResult(); + event.result = await player + .chooseTarget( + get.prompt("kyouko_gongmian"), + "获得一名其他角色的至多" + get.cnNumber(num) + "张牌,然后交给其等量的牌", + function (card, player, target) { + return target != player && target.countGainableCards(player, "hej") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) return att; + var he = player.getCards("he"); + if ( + target.countCards("he", function (card) { + return get.value(card, target) > 7; + }) && + he.length > 0 + ) + return ( + -att + + 5 - + Math.min.apply( + Math, + he.map(function (card) { + return get.value(card, player); + }) + ) + ); + return 0; + }) + .forResult(); }, - async content(event, trigger, player){ - const num = player.getHistory('custom',function(evt){ - return evt.kyouko_gongmian==true; - }).length, target = event.targets[0]; - let result = await player.gainPlayerCard(target,'hej',true,[1,num]).forResult(); - if(target.isIn()&&result.bool&&result.cards&&result.cards.length&&player.countCards('he')>0){ - const num = result.cards.length, hs = player.getCards('he'); - if(hs.length<=num) result = {bool:true,cards:hs}; - else{ - result = await player.chooseCard('he',true,num,'交给'+get.translation(target)+get.cnNumber(num)+'张牌').forResult(); + async content(event, trigger, player) { + const num = player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length, + target = event.targets[0]; + let result = await player.gainPlayerCard(target, "hej", true, [1, num]).forResult(); + if ( + target.isIn() && + result.bool && + result.cards && + result.cards.length && + player.countCards("he") > 0 + ) { + const num = result.cards.length, + hs = player.getCards("he"); + if (hs.length <= num) result = { bool: true, cards: hs }; + else { + result = await player + .chooseCard( + "he", + true, + num, + "交给" + get.translation(target) + get.cnNumber(num) + "张牌" + ) + .forResult(); } - if(result.bool&&result.cards&&result.cards.length){ - player.give(result.cards,target); + if (result.bool && result.cards && result.cards.length) { + player.give(result.cards, target); } } }, }, - kyouko_gongmian_discard:{ - trigger:{player:'phaseDiscardBegin'}, - filter(event,player){ - var hs=player.countCards('h'); - return hs>0&&player.getHistory('custom',function(evt){ - return evt.kyouko_gongmian==true; - }).length>=player.hp&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h') 0 && + player.getHistory("custom", function (evt) { + return evt.kyouko_gongmian == true; + }).length >= player.hp && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") < hs; + }) + ); }, - async cost(event,trigger,player){ - event.result = await player.chooseTarget(get.prompt('kyouko_gongmian'),'获得一名其他角色的所有手牌,然后将一半的牌交给该角色(向上取整)',function(card,player,target){ - return target!=player&&target.countCards('h')0) player.gain(hs,target,'giveAuto','bySelf'); - 'step 1' - if(target.isIn()&&player.countCards('h')>0){ - var hs=player.getCards('h'),num=Math.ceil(hs.length/2); - if(hs.length<=num) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,num,'交给'+get.translation(target)+get.cnNumber(num)+'张牌'); - } - else event.finish(); - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ - player.give(result.cards,target); + content() { + "step 0"; + var target = event.targets[0]; + event.target = target; + var hs = target.getCards("h"); + if (hs.length > 0) player.gain(hs, target, "giveAuto", "bySelf"); + ("step 1"); + if (target.isIn() && player.countCards("h") > 0) { + var hs = player.getCards("h"), + num = Math.ceil(hs.length / 2); + if (hs.length <= num) event._result = { bool: true, cards: hs }; + else + player.chooseCard( + "he", + true, + num, + "交给" + get.translation(target) + get.cnNumber(num) + "张牌" + ); + } else event.finish(); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + player.give(result.cards, target); } }, }, - yuuki_yicha:{ - trigger:{player:'phaseUseBegin'}, - frequent:true, - createDialog(id){ - var dialog=ui.create.dialog('hidden'); - (dialog.textPrompt=dialog.add('异插')).style.textAlign='center'; - dialog.cards=[]; - dialog.rawButtons=[]; - dialog.videoId=id; - var cards=[]; - for(var i=0;i<3;i++){ - var card=ui.create.card(null,null,true); - card.pos=i; - card.pos_x=i; - card.pos_y=0; + yuuki_yicha: { + trigger: { player: "phaseUseBegin" }, + frequent: true, + createDialog(id) { + var dialog = ui.create.dialog("hidden"); + (dialog.textPrompt = dialog.add("异插")).style.textAlign = "center"; + dialog.cards = []; + dialog.rawButtons = []; + dialog.videoId = id; + var cards = []; + for (var i = 0; i < 3; i++) { + var card = ui.create.card(null, null, true); + card.pos = i; + card.pos_x = i; + card.pos_y = 0; cards.push(card); dialog.rawButtons.push(card); } dialog.add(cards); - cards=[]; - for(var i=0;i<3;i++){ - var card=ui.create.card(null,null,true); - card.pos=i+3; - card.pos_x=i; - card.pos_y=1; + cards = []; + for (var i = 0; i < 3; i++) { + var card = ui.create.card(null, null, true); + card.pos = i + 3; + card.pos_x = i; + card.pos_y = 1; cards.push(card); dialog.rawButtons.push(card); } dialog.add(cards); - for(var i of dialog.buttons){ - i.pos_x=i.link.pos_x; - i.pos_y=i.link.pos_y; - i.link=i.link.pos; + for (var i of dialog.buttons) { + i.pos_x = i.link.pos_x; + i.pos_y = i.link.pos_y; + i.link = i.link.pos; } dialog.open(); }, - addCard(card,id,pos){ - var dialog=get.idDialog(id); - if(!dialog) return; - for(var i=0;i0){ - var color=get.color(list[0],false); - if(list.length>1){ - for(var i=1;i 0) { + var color = get.color(list[0], false); + if (list.length > 1) { + for (var i = 1; i < list.length; i++) { + if (get.color(list[i]) != color) return false; + } + } + return get.color(_status.event.card, false) != color; + } + return false; + }) + .set("card", card); + ("step 5"); + if (result.bool) { cards.push(card); event.positions.remove(result.links[0]); - game.broadcastAll(function(card,id,pos,player){ - lib.skill.yuuki_yicha.addCard(card,id,pos); - lib.skill.yuuki_yicha.changePrompt(get.translation(player)+'放置了'+get.translation(card),id); - },card,event.videoId,result.links[0],player); + game.broadcastAll( + function (card, id, pos, player) { + lib.skill.yuuki_yicha.addCard(card, id, pos); + lib.skill.yuuki_yicha.changePrompt( + get.translation(player) + "放置了" + get.translation(card), + id + ); + }, + card, + event.videoId, + result.links[0], + player + ); game.delay(2); } - if(event.count>0) event.goto(3); - 'step 6' - game.broadcastAll('closeDialog',event.videoId); - player.chooseTarget('令一名角色获得'+get.translation(cards),true).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 7' - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(cards,'gain2'); + if (event.count > 0) event.goto(3); + ("step 6"); + game.broadcastAll("closeDialog", event.videoId); + player + .chooseTarget("令一名角色获得" + get.translation(cards), true) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 7"); + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(cards, "gain2"); } }, }, - kotomi_qinji:{ - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return player.hasUseTarget('wanjian'); + kotomi_qinji: { + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return player.hasUseTarget("wanjian"); }, //chooseUseTarget也不好改 先放着 - direct:true, - content(){ - player.addTempSkill('kotomi_qinji2'); - player.chooseUseTarget({name:'wanjian',isCard:true},get.prompt('kotomi_qinji'),'视为使用一张【万箭齐发】').logSkill='kotomi_qinji'; + direct: true, + content() { + player.addTempSkill("kotomi_qinji2"); + player.chooseUseTarget( + { name: "wanjian", isCard: true }, + get.prompt("kotomi_qinji"), + "视为使用一张【万箭齐发】" + ).logSkill = "kotomi_qinji"; }, }, - kotomi_qinji2:{ - trigger:{source:'damageBefore'}, - forced:true, - popup:false, - filter(event,player){ - return event.getParent().skill=='kotomi_qinji'; + kotomi_qinji2: { + trigger: { source: "damageBefore" }, + forced: true, + popup: false, + filter(event, player) { + return event.getParent().skill == "kotomi_qinji"; }, - content(){ + content() { trigger.cancel(); trigger.player.loseHp(trigger.num); }, }, - kotomi_chuanxiang:{ - global:'kotomi_chuanxiang2', + kotomi_chuanxiang: { + global: "kotomi_chuanxiang2", }, - kotomi_chuanxiang2:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return !player.hasSkill('kotomi_chuanxiang')&&player.countCards('e',lib.skill.kotomi_chuanxiang2.filterCard)>0; + kotomi_chuanxiang2: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + !player.hasSkill("kotomi_chuanxiang") && + player.countCards("e", lib.skill.kotomi_chuanxiang2.filterCard) > 0 + ); }, - filterCard(card,player){ - if(!player) player=_status.event.player; - return game.hasPlayer(function(current){ - return current!=player&¤t.canEquip(card); + filterCard(card, player) { + if (!player) player = _status.event.player; + return game.hasPlayer(function (current) { + return current != player && current.canEquip(card); }); }, - position:'e', - filterTarget(card,player,target){ - return target!=player&&target.canEquip(ui.selected.cards[0]); + position: "e", + filterTarget(card, player, target) { + return target != player && target.canEquip(ui.selected.cards[0]); }, - check(card){ - if(get.value(card)<=0) return 10; - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current.hasSkill('kotomi_chuanxiang')&&get.attitude(player,current)>0; - })){ - var subtype=get.subtype(card,false); - if(player.countCards('hs',function(cardx){ - return get.type(cardx)=='equip'&&get.subtype(cardx,false)==subtype&&player.canUse(cardx,player)&&get.effect(player,cardx,player,player)>0; - })) return 8; - return 7/Math.max(1,get.value(card)); + check(card) { + if (get.value(card) <= 0) return 10; + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current.hasSkill("kotomi_chuanxiang") && get.attitude(player, current) > 0; + }) + ) { + var subtype = get.subtype(card, false); + if ( + player.countCards("hs", function (cardx) { + return ( + get.type(cardx) == "equip" && + get.subtype(cardx, false) == subtype && + player.canUse(cardx, player) && + get.effect(player, cardx, player, player) > 0 + ); + }) + ) + return 8; + return 7 / Math.max(1, get.value(card)); } return 0; }, - promptfunc(){ - var players=game.filterPlayer(function(current){ - return current.hasSkill('kotomi_chuanxiang'); + promptfunc() { + var players = game.filterPlayer(function (current) { + return current.hasSkill("kotomi_chuanxiang"); }); - return '将一张装备牌传给其他角色,然后令'+get.translation(players)+'摸一张牌。若传给该角色,则其改为摸两张牌。' + return ( + "将一张装备牌传给其他角色,然后令" + + get.translation(players) + + "摸一张牌。若传给该角色,则其改为摸两张牌。" + ); }, - prepare:'give', - discard:false, - lose:false, - content(){ - 'step 0' + prepare: "give", + discard: false, + lose: false, + content() { + "step 0"; target.equip(cards[0]); - var list=game.filterPlayer(function(current){ - return current.hasSkill('kotomi_chuanxiang'); + var list = game.filterPlayer(function (current) { + return current.hasSkill("kotomi_chuanxiang"); }); - game.asyncDraw(list,function(targetx){ - return targetx==target?2:1; + game.asyncDraw(list, function (targetx) { + return targetx == target ? 2 : 1; }); - 'step 1' + ("step 1"); game.delayx(); }, - ai:{ - order:8, - result:{ - target(player,target){ - var card=ui.selected.cards[0]; - if(!card) return 0; - var eff=get.effect(target,card,player,target); - if(target.hasSkill('kotomi_chuanxiang')) eff++; + ai: { + order: 8, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (!card) return 0; + var eff = get.effect(target, card, player, target); + if (target.hasSkill("kotomi_chuanxiang")) eff++; return eff; }, }, }, }, - asara_shelu:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('he')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - }); + asara_shelu: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); }, - filterCard:true, - position:'he', - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterCard: true, + position: "he", + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; }, - check(card){ - return 6-get.value(card); + check(card) { + return 6 - get.value(card); }, - content(){ - 'step 0' - if(!target.countCards('h')) event.finish(); - else player.choosePlayerCard(target,'h',true); - 'step 1' + content() { + "step 0"; + if (!target.countCards("h")) event.finish(); + else player.choosePlayerCard(target, "h", true); + ("step 1"); player.showCards(result.cards); - event.cards2=result.cards; - 'step 2' - target.$give(event.cards2,player,false); - target.loseToSpecial(event.cards2,'asara_yingwei',player).visible=true; - var card1=cards[0],card2=event.cards2[0]; - if(card1.suit==card2.suit) player.draw(2); - if(card1.number==card2.number) player.recover(); + event.cards2 = result.cards; + ("step 2"); + target.$give(event.cards2, player, false); + target.loseToSpecial(event.cards2, "asara_yingwei", player).visible = true; + var card1 = cards[0], + card2 = event.cards2[0]; + if (card1.suit == card2.suit) player.draw(2); + if (card1.number == card2.number) player.recover(); }, - ai:{ - order:6, - result:{ - target:-1, + ai: { + order: 6, + result: { + target: -1, }, }, }, - asara_yingwei:{ - trigger:{player:'yingbian'}, - forced:true, - filter:(event,player)=>event.card.isCard&&player.hasHistory('lose',evt=>evt.getParent()==event&&Object.values(evt.gaintag_map).some(value=>value.includes('asara_yingwei'))), - content:()=>{ - trigger.forceYingbian=true; - } + asara_yingwei: { + trigger: { player: "yingbian" }, + forced: true, + filter: (event, player) => + event.card.isCard && + player.hasHistory( + "lose", + (evt) => + evt.getParent() == event && + Object.values(evt.gaintag_map).some((value) => value.includes("asara_yingwei")) + ), + content: () => { + trigger.forceYingbian = true; + }, }, - yukito_kongwu:{ - enable:'phaseUse', - usable:1, - content(){ - "step 0" - if(_status.connectMode) event.time=lib.configOL.choose_timeout; - event.videoId=lib.status.videoId++; - if(player.isUnderControl()){ + yukito_kongwu: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ + var switchToAuto = function () { game.pause(); game.countChoose(); - setTimeout(function(){ - _status.imchoosing=false; - event._result={ - bool:true, - score:get.rand(1,5), + setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, + score: get.rand(1, 5), }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); game.resume(); - },5000); + }, 5000); }; - var createDialog=function(player,id){ - if(_status.connectMode) lib.configOL.choose_timeout='30'; - if(player==game.me) return; - var str=get.translation(player)+'正在表演《小空飞天》...
    '; - ui.create.dialog(str).videoId=id; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在表演《小空飞天》...
    "; + ui.create.dialog(str).videoId = id; + }; + var chooseButton = function () { + lib.skill.yufeng.$playFlappyBird(5, "小空飞天"); }; - var chooseButton=function(){lib.skill.yufeng.$playFlappyBird(5,'小空飞天')}; //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog,player,event.videoId); - if(event.isMine()){ + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { chooseButton(); - } - else if(event.isOnline()){ + } else if (event.isOnline()) { event.player.send(chooseButton); event.player.wait(); game.pause(); - } - else{ + } else { switchToAuto(); } - "step 1" - game.broadcastAll(function(id,time){ - if(_status.connectMode) lib.configOL.choose_timeout=time; - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - },event.videoId,event.time); - var result=event.result||result; - game.log(player,'获得了','#g'+result.score+'分'); - if(!result.score){ - player.chooseToDiscard(2,true,'he'); + ("step 1"); + game.broadcastAll( + function (id, time) { + if (_status.connectMode) lib.configOL.choose_timeout = time; + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + }, + event.videoId, + event.time + ); + var result = event.result || result; + game.log(player, "获得了", "#g" + result.score + "分"); + if (!result.score) { + player.chooseToDiscard(2, true, "he"); event.finish(); return; } - var list=[]; - var list2=[]; - for(var i=0;i<5;i++){ - if(lib.skill.yukito_kongwu.moves[i].filter(player,true)) list.push(i); + var list = []; + var list2 = []; + for (var i = 0; i < 5; i++) { + if (lib.skill.yukito_kongwu.moves[i].filter(player, true)) list.push(i); else list2.push(i); } - if(list.length>=result.score) list=list.randomGets(result.score); - else list.addArray(list2.randomGets(result.score-list.length)); + if (list.length >= result.score) list = list.randomGets(result.score); + else list.addArray(list2.randomGets(result.score - list.length)); list.sort(); - var next=player.chooseButton([ - '控物:请选择一项', - [list.map(i=>{ - return [i,lib.skill.yukito_kongwu.moves[i].prompt]; - }),'textbutton'], + var next = player.chooseButton([ + "控物:请选择一项", + [ + list.map((i) => { + return [i, lib.skill.yukito_kongwu.moves[i].prompt]; + }), + "textbutton", + ], ]); - next.set('forced',true); - next.set('filterButton',function(button){ + next.set("forced", true); + next.set("filterButton", function (button) { return lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player); }); - next.set('ai',function(button){ - if(lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player,true)) return 1+Math.random(); + next.set("ai", function (button) { + if (lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player, true)) + return 1 + Math.random(); return Math.random(); }); - "step 2" - var num=result.links[0]; - switch(num){ - case 0:event.goto(3);break; - case 1:event.goto(5);break; - case 2:event.goto(7);break; - case 3:event.goto(9);break; - case 4:player.moveCard(true);event.finish();break; + ("step 2"); + var num = result.links[0]; + switch (num) { + case 0: + event.goto(3); + break; + case 1: + event.goto(5); + break; + case 2: + event.goto(7); + break; + case 3: + event.goto(9); + break; + case 4: + player.moveCard(true); + event.finish(); + break; } - "step 3" - player.chooseTarget(true,'令一名角色摸两张牌').set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target)/Math.sqrt(1+target.countCards('h')); - if(target.hasSkillTag('nogain')) att/=10; + ("step 3"); + player.chooseTarget(true, "令一名角色摸两张牌").set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; return att; }); - "step 4" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.draw(2); } event.finish(); - "step 5" - player.chooseTarget(true,'对一名角色造成1点伤害').set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); + ("step 5"); + player.chooseTarget(true, "对一名角色造成1点伤害").set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); }); - "step 6" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + ("step 6"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.damage(); } event.finish(); - "step 7" - player.chooseTarget(true,'令一名已受伤的角色回复1点体力',function(card,player,target){ - return target.isDamaged(); - }).set('ai',function(target){ - var player=_status.event.player; - return get.recoverEffect(target,player,player); - }); - "step 8" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + ("step 7"); + player + .chooseTarget(true, "令一名已受伤的角色回复1点体力", function (card, player, target) { + return target.isDamaged(); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }); + ("step 8"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.recover(); } event.finish(); - "step 9" - player.chooseTarget(true,'弃置一名角色区域内的两张牌',function(card,player,target){ - return target.countDiscardableCards(player,'hej')>0; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - "step 10" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.discardPlayerCard(target,'hej',true,2); + ("step 9"); + player + .chooseTarget(true, "弃置一名角色区域内的两张牌", function (card, player, target) { + return target.countDiscardableCards(player, "hej") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + ("step 10"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "hej", true, 2); } event.finish(); }, - moves:[ + moves: [ { - prompt:'令一名角色摸两张牌', - filter:()=>true, + prompt: "令一名角色摸两张牌", + filter: () => true, }, { - prompt:'对一名角色造成1点伤害', - filter(player,ai){ - if(!ai) return true; - return game.hasPlayer(function(current){ - return get.damageEffect(current,player,player)>0; + prompt: "对一名角色造成1点伤害", + filter(player, ai) { + if (!ai) return true; + return game.hasPlayer(function (current) { + return get.damageEffect(current, player, player) > 0; }); }, }, { - prompt:'令一名已受伤的角色回复1点体力', - filter(player,ai){ - return game.hasPlayer(function(current){ - if(current.isDamaged()) return !ai||get.recoverEffect(current,player,player)>0; - }); - } - }, - { - prompt:'弃置一名角色区域内的两张牌', - filter(player,ai){ - return game.hasPlayer(function(current){ - return current.countDiscardableCards(player,'hej',function(card){ - if(!ai) return true; - return get.buttonValue({link:card})*get.attitude(player,current)>0; - })>=(ai?1:Math.min(2,current.countDiscardableCards(player,'hej'))); + prompt: "令一名已受伤的角色回复1点体力", + filter(player, ai) { + return game.hasPlayer(function (current) { + if (current.isDamaged()) + return !ai || get.recoverEffect(current, player, player) > 0; }); }, }, { - prompt:'移动场上的一张牌', - filter(player,ai){ + prompt: "弃置一名角色区域内的两张牌", + filter(player, ai) { + return game.hasPlayer(function (current) { + return ( + current.countDiscardableCards(player, "hej", function (card) { + if (!ai) return true; + return ( + get.buttonValue({ + link: card, + }) * + get.attitude(player, current) > + 0 + ); + }) >= (ai ? 1 : Math.min(2, current.countDiscardableCards(player, "hej"))) + ); + }); + }, + }, + { + prompt: "移动场上的一张牌", + filter(player, ai) { return player.canMoveCard(ai); }, }, ], - ai:{ - order:10, - result:{player:1}, - threaten:3.2, - } + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, + }, }, - yukito_yaxiang:{ - enable:'chooseToUse', - limited:true, - filter(event,player){ - return event.type=='dying'&&(player.name1=='key_yukito'||player.name2=='key_yukito'); + yukito_yaxiang: { + enable: "chooseToUse", + limited: true, + filter(event, player) { + return ( + event.type == "dying" && + (player.name1 == "key_yukito" || player.name2 == "key_yukito") + ); }, - filterTarget(card,player,target){ - return target==_status.event.dying; + filterTarget(card, player, target) { + return target == _status.event.dying; }, - selectTarget:-1, - skillAnimation:true, - animationColor:'key', - content(){ - 'step 0' - player.awakenSkill('yukito_yaxiang'); - player.reinitCharacter('key_yukito', 'key_crow', false); - 'step 1' - if(target.hp<3) target.recover(3-target.hp); - 'step 2' - var cards=target.getCards('j'); - if(cards.length) target.discard(cards); - 'step 3' - target.addSkills('misuzu_zhongyuan'); + selectTarget: -1, + skillAnimation: true, + animationColor: "key", + content() { + "step 0"; + player.awakenSkill("yukito_yaxiang"); + player.reinitCharacter("key_yukito", "key_crow", false); + ("step 1"); + if (target.hp < 3) target.recover(3 - target.hp); + ("step 2"); + var cards = target.getCards("j"); + if (cards.length) target.discard(cards); + ("step 3"); + target.addSkills("misuzu_zhongyuan"); }, - derivation:'misuzu_zhongyuan', - ai:{ - save:true, - order:4, - result:{ - target(player,target){ - if(get.attitude(player,target)<4) return false; - if(player.countCards('h',function(card){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,target,'unchanged','cardSavable',player); - if(mod!='unchanged') return mod; - var savable=get.info(card).savable; - if(typeof savable=='function') savable=savable(card,player,target); - return savable; - })>=1-target.hp) return false; - if(target==player||target==get.zhu(player)) return true; + derivation: "misuzu_zhongyuan", + ai: { + save: true, + order: 4, + result: { + target(player, target) { + if (get.attitude(player, target) < 4) return false; + if ( + player.countCards("h", function (card) { + var mod2 = game.checkMod( + card, + player, + "unchanged", + "cardEnabled2", + player + ); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod( + card, + player, + target, + "unchanged", + "cardSavable", + player + ); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, target); + return savable; + }) >= + 1 - target.hp + ) + return false; + if (target == player || target == get.zhu(player)) return true; return !player.hasUnknown(); }, }, }, }, - misuzu_zhongyuan:{ - trigger:{player:'judge'}, - skillAnimation:true, - animationColor:'key', - logTarget:'player', - cost(){ - 'step 0' - var str='你的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+',是否发动【终愿】修改判定结果?'; - if(player.isUnderControl()){ + misuzu_zhongyuan: { + trigger: { player: "judge" }, + skillAnimation: true, + animationColor: "key", + logTarget: "player", + cost() { + "step 0"; + var str = + "你的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + ",是否发动【终愿】修改判定结果?"; + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ - _status.imchoosing=false; - event._result={ - bool:false, + var switchToAuto = function () { + _status.imchoosing = false; + event._result = { + bool: false, }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); }; - var chooseButton=function(player,str){ - var event=_status.event; - player=player||event.player; - if(!event._result) event._result={}; - var dialog=ui.create.dialog(str,'forcebutton','hidden'); - event.dialog=dialog; - dialog.addText('花色'); - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; - var listi=['spade','heart','club','diamond']; - for(var i=0;i'; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - var current=this.parentNode.querySelector('.bluebg'); - if(current){ - current.classList.remove('bluebg'); + td.innerHTML = "" + get.translation(listi[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); } - this.classList.add('bluebg'); - event._result.suit=link; + this.classList.add("bluebg"); + event._result.suit = link; }); } dialog.content.appendChild(table); - dialog.addText('点数'); - var table2=document.createElement('div'); - table2.classList.add('add-setting'); - table2.style.margin='0'; - table2.style.width='100%'; - table2.style.position='relative'; - for(var i=1;i<14;i++){ - var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); - td.link=i; + dialog.addText("点数"); + var table2 = document.createElement("div"); + table2.classList.add("add-setting"); + table2.style.margin = "0"; + table2.style.width = "100%"; + table2.style.position = "relative"; + for (var i = 1; i < 14; i++) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.link = i; table2.appendChild(td); - var num=i; - td.innerHTML=''+get.strNumber(num)+''; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - var current=this.parentNode.querySelector('.bluebg'); - if(current){ - current.classList.remove('bluebg'); + var num = i; + td.innerHTML = "" + get.strNumber(num) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); } - this.classList.add('bluebg'); - event._result.number=link; + this.classList.add("bluebg"); + event._result.number = link; }); } dialog.content.appendChild(table2); - dialog.add('  '); + dialog.add("  "); event.dialog.open(); - event.switchToAuto=function(){ - event._result={ - bool:false, + event.switchToAuto = function () { + event._result = { + bool: false, }; event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }; - event.control=ui.create.control('ok','cancel2',function(link){ - var result=event._result; - if(link=='cancel2') result.bool=false; - else{ - if(!result.number||!result.suit) return; - result.bool=true; + event.control = ui.create.control("ok", "cancel2", function (link) { + var result = event._result; + if (link == "cancel2") result.bool = false; + else { + if (!result.number || !result.suit) return; + result.bool = true; } event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }); - for(var i=0;iplayer.hasCard(card=>lib.skill.chihaya_huairou.filterCard(card,player),lib.skill.chihaya_huairou.position), - filterCard:(card,player)=>get.type(card)=='equip'&&player.canRecast(card), - check(card){ - if(!_status.event.player.hasEquipableSlot(get.subtype(card))) return 5; - return 3-get.value(card); + chihaya_huairou: { + audio: 2, + enable: "phaseUse", + position: "he", + filter: (event, player) => + player.hasCard( + (card) => lib.skill.chihaya_huairou.filterCard(card, player), + lib.skill.chihaya_huairou.position + ), + filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), + check(card) { + if (!_status.event.player.hasEquipableSlot(get.subtype(card))) return 5; + return 3 - get.value(card); }, - content(){ + content() { player.recast(cards); }, - discard:false, - lose:false, - delay:false, - prompt:"将一张装备牌置入弃牌堆并摸一张牌", - ai:{ - order:10, - result:{ - player:1 - } - } - }, - chihaya_youfeng:{ - enable:'chooseToUse', - zhuanhuanji:true, - mark:true, - intro:{ - content(storage,player){ - return storage?'每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。':'每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌。'; + discard: false, + lose: false, + delay: false, + prompt: "将一张装备牌置入弃牌堆并摸一张牌", + ai: { + order: 10, + result: { + player: 1, }, }, - marktext:'☯', - init(player){ - player.storage.chihaya_youfeng=false; + }, + chihaya_youfeng: { + enable: "chooseToUse", + zhuanhuanji: true, + mark: true, + intro: { + content(storage, player) { + return storage + ? "每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。" + : "每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌。"; + }, }, - hiddenCard(player,name){ - if(player.storage.chihaya_youfeng&&!player.hasEnabledSlot()) return false; - if(player.hasSkill('chihaya_youfeng_'+(player.storage.chihaya_youfeng||false))) return false; - var type=get.type(name); - if(player.storage.chihaya_youfeng) return type=='basic'; - return type=='trick'; + marktext: "☯", + init(player) { + player.storage.chihaya_youfeng = false; }, - filter(event,player){ - if(player.storage.chihaya_youfeng&&!player.hasEnabledSlot()) return false; - if(player.hasSkill('chihaya_youfeng_'+(player.storage.chihaya_youfeng||false))) return false; - var type=player.storage.chihaya_youfeng?'basic':'trick'; - for(var name of lib.inpile){ - if(get.type(name)!=type) continue; - if(event.filterCard({name:name,isCard:true},player,event)) return true; + hiddenCard(player, name) { + if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; + if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) + return false; + var type = get.type(name); + if (player.storage.chihaya_youfeng) return type == "basic"; + return type == "trick"; + }, + filter(event, player) { + if (player.storage.chihaya_youfeng && !player.hasEnabledSlot()) return false; + if (player.hasSkill("chihaya_youfeng_" + (player.storage.chihaya_youfeng || false))) + return false; + var type = player.storage.chihaya_youfeng ? "basic" : "trick"; + for (var name of lib.inpile) { + if (get.type(name) != type) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; } return false; }, - chooseButton:{ - dialog(event,player){ - const dialog=ui.create.dialog('游凤','hidden'); - const equips=[]; - if(player.storage.chihaya_youfeng){ - for(let i=1;i<6;i++){ - if(!player.hasEnabledSlot(i)) continue; - equips.push([i,get.translation('equip'+i)]); + chooseButton: { + dialog(event, player) { + const dialog = ui.create.dialog("游凤", "hidden"); + const equips = []; + if (player.storage.chihaya_youfeng) { + for (let i = 1; i < 6; i++) { + if (!player.hasEnabledSlot(i)) continue; + equips.push([i, get.translation("equip" + i)]); } - if(equips.length>0) dialog.add([equips,'tdnodes']) + if (equips.length > 0) dialog.add([equips, "tdnodes"]); } - const type=player.storage.chihaya_youfeng?'basic':'trick'; - const list=[]; - for(const name of lib.inpile){ - if(get.type(name)!=type) continue; - if(event.filterCard({name:name,isCard:true},player,event)){ - list.push([type,'',name]); - if(name=='sha'){ - for(let j of lib.inpile_nature) list.push([type,'',name,j]); + const type = player.storage.chihaya_youfeng ? "basic" : "trick"; + const list = []; + for (const name of lib.inpile) { + if (get.type(name) != type) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) { + list.push([type, "", name]); + if (name == "sha") { + for (let j of lib.inpile_nature) list.push([type, "", name, j]); } } } - dialog.add([list,'vcard']); + dialog.add([list, "vcard"]); return dialog; }, - filter(button){ - if(ui.selected.buttons.length&&typeof button.link==typeof ui.selected.buttons[0].link) return false; + filter(button) { + if ( + ui.selected.buttons.length && + typeof button.link == typeof ui.selected.buttons[0].link + ) + return false; return true; }, - select(){ - if(_status.event.player.storage.chihaya_youfeng) return 2; + select() { + if (_status.event.player.storage.chihaya_youfeng) return 2; return 1; }, - check(button){ - var player=_status.event.player; - if(typeof button.link=='number'){ - if(!player.hasEmptySlot(button.link)){ - var card=player.getEquip(button.link); - if(card){ - var val=get.value(card); - if(val>0) return 0; - return 5-val; + check(button) { + var player = _status.event.player; + if (typeof button.link == "number") { + if (!player.hasEmptySlot(button.link)) { + var card = player.getEquip(button.link); + if (card) { + var val = get.value(card); + if (val > 0) return 0; + return 5 - val; } } - switch(button.link){ - case 3:return 4.5; - case 4:return 4.4; - case 5:return 4.3; - case 2:return (3-player.hp)*1.5; - case 1:{ - if(game.hasPlayer(function(current){ - return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1; - })) return 0; + switch (button.link) { + case 3: + return 4.5; + case 4: + return 4.4; + case 5: + return 4.3; + case 2: + return (3 - player.hp) * 1.5; + case 1: { + if ( + game.hasPlayer(function (current) { + return ( + (get.realAttitude || get.attitude)(player, current) < 0 && + get.distance(player, current) > 1 + ); + }) + ) + return 0; return 3.2; } } } - var name=button.link[2]; - var evt=_status.event.getParent(); - if(get.type(name)=='basic'){ - if(name=='shan') return 2; - if(evt.type=='dying'){ - if(get.attitude(player,evt.dying)<2) return false; - if(name=='jiu') return 2.1; + var name = button.link[2]; + var evt = _status.event.getParent(); + if (get.type(name) == "basic") { + if (name == "shan") return 2; + if (evt.type == "dying") { + if (get.attitude(player, evt.dying) < 2) return false; + if (name == "jiu") return 2.1; return 1.9; } - if(evt.type=='phase') return player.getUseValue({name:name,nature:button.link[3],isCard:true}); + if (evt.type == "phase") + return player.getUseValue({ + name: name, + nature: button.link[3], + isCard: true, + }); return 1; } - if(!['chuqibuyi','shuiyanqijunx','juedou','nanman','wanjian','shunshou','zhujinqiyuan'].includes(name)) return 0; - var card={name:name,isCard:true}; - if(['shunshou','zhujinqiyuan'].includes(card.name)){ - if(!game.hasPlayer(function(current){ - return get.attitude(player,current)!=0&&get.distance(player,current)<=1&&player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })) return 0; - return player.getUseValue(card)-7; + if ( + ![ + "chuqibuyi", + "shuiyanqijunx", + "juedou", + "nanman", + "wanjian", + "shunshou", + "zhujinqiyuan", + ].includes(name) + ) + return 0; + var card = { name: name, isCard: true }; + if (["shunshou", "zhujinqiyuan"].includes(card.name)) { + if ( + !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) != 0 && + get.distance(player, current) <= 1 && + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return 0; + return player.getUseValue(card) - 7; } - return player.getUseValue(card)-4; + return player.getUseValue(card) - 4; }, - backup(links,player){ - if(links.length==1) return { - filterCard(){return false}, - selectCard:-1, - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, - }, - popname:true, - precontent(){ - player.logSkill('chihaya_youfeng'); - player.gainMaxHp(); - delete event.result.skill; - player.addTempSkill('chihaya_youfeng_'+(player.storage.chihaya_youfeng||false),'roundStart'); - player.changeZhuanhuanji('chihaya_youfeng'); - }, - } - if(typeof links[1]=='number') links.reverse(); - var equip=links[0]; - var name=links[1][2]; - var nature=links[1][3]; + backup(links, player) { + if (links.length == 1) + return { + filterCard() { + return false; + }, + selectCard: -1, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + popname: true, + precontent() { + player.logSkill("chihaya_youfeng"); + player.gainMaxHp(); + delete event.result.skill; + player.addTempSkill( + "chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), + "roundStart" + ); + player.changeZhuanhuanji("chihaya_youfeng"); + }, + }; + if (typeof links[1] == "number") links.reverse(); + var equip = links[0]; + var name = links[1][2]; + var nature = links[1][3]; return { - filterCard(){return false}, - selectCard:-1, - equip:equip, - viewAs:{ - name:name, - nature:nature, - isCard:true, + filterCard() { + return false; }, - popname:true, - precontent(){ - player.logSkill('chihaya_youfeng'); + selectCard: -1, + equip: equip, + viewAs: { + name: name, + nature: nature, + isCard: true, + }, + popname: true, + precontent() { + player.logSkill("chihaya_youfeng"); player.disableEquip(lib.skill.chihaya_youfeng_backup.equip); delete event.result.skill; - player.addTempSkill('chihaya_youfeng_'+(player.storage.chihaya_youfeng||false),'roundStart'); - player.changeZhuanhuanji('chihaya_youfeng'); + player.addTempSkill( + "chihaya_youfeng_" + (player.storage.chihaya_youfeng || false), + "roundStart" + ); + player.changeZhuanhuanji("chihaya_youfeng"); }, - } + }; }, - prompt(links,player){ - if(links.length==1) return '增加1点体力上限,视为使用'+(get.translation(links[0][3])||'')+get.translation(links[0][2]); - if(typeof links[1]=='number') links.reverse(); - var equip='equip'+links[0]; - var name=links[1][2]; - var nature=links[1][3]; - return '废除自己的'+get.translation(equip)+'栏,视为使用'+(get.translation(nature)||'')+get.translation(name); + prompt(links, player) { + if (links.length == 1) + return ( + "增加1点体力上限,视为使用" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + ); + if (typeof links[1] == "number") links.reverse(); + var equip = "equip" + links[0]; + var name = links[1][2]; + var nature = links[1][3]; + return ( + "废除自己的" + + get.translation(equip) + + "栏,视为使用" + + (get.translation(nature) || "") + + get.translation(name) + ); }, }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player,tag,arg){ - if(arg=='respond') return false; - if(!player.storage.chihaya_youfeng||player.hasSkill('chihaya_youfeng_true')) return false; + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + if (!player.storage.chihaya_youfeng || player.hasSkill("chihaya_youfeng_true")) + return false; }, - order:1, - result:{ - player:1, + order: 1, + result: { + player: 1, }, }, }, - chihaya_youfeng_true:{charlotte:true}, - chihaya_youfeng_false:{charlotte:true}, - rumi_shuwu:{ - mod:{ - cardUsable(card){ - if(card.name=='sha') return Infinity; + chihaya_youfeng_true: { charlotte: true }, + chihaya_youfeng_false: { charlotte: true }, + rumi_shuwu: { + mod: { + cardUsable(card) { + if (card.name == "sha") return Infinity; }, - targetInRange(card){ - if(card.name=='sha') return true; + targetInRange(card) { + if (card.name == "sha") return true; }, }, - trigger:{player:'useCard2'}, - filter(event,player){ - var card=event.card; - var info=get.info(card); - if(info.type!='trick'||info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current); - })){ + trigger: { player: "useCard2" }, + filter(event, player) { + var card = event.card; + var info = get.info(card); + if (info.type != "trick" || info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { return true; } } return false; }, - autodelay:true, - async cost(event, trigger, player){ - var prompt2='为'+get.translation(trigger.card)+'增加一个目标'; - const {result} = await player.chooseTarget(get.prompt('rumi_shuwu'),function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); + autodelay: true, + async cost(event, trigger, player) { + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + const { result } = await player + .chooseTarget(get.prompt("rumi_shuwu"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); event.result = result; }, - content(){ + content() { trigger.targets.addArray(event.targets); - game.log(event.targets, '也成为了', trigger.card, '的目标'); + game.log(event.targets, "也成为了", trigger.card, "的目标"); }, - group:'rumi_shuwu2', + group: "rumi_shuwu2", }, - rumi_shuwu2:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - filter(event,player){ - if(player.hp<=3) return true; - if(player.getHistory('useCard',function(evt){ - return evt.card.name=='sha'&&evt.addCount!==false&&evt.getParent('phaseUse')==event; - }).length<=1) return true; - if(player.getHistory('sourceDamage',function(evt){ - return get.type(evt.card,false)=='trick'&&evt.getParent('phaseUse')==event; - }).length==0) return true; + rumi_shuwu2: { + trigger: { player: "phaseUseEnd" }, + forced: true, + filter(event, player) { + if (player.hp <= 3) return true; + if ( + player.getHistory("useCard", function (evt) { + return ( + evt.card.name == "sha" && + evt.addCount !== false && + evt.getParent("phaseUse") == event + ); + }).length <= 1 + ) + return true; + if ( + player.getHistory("sourceDamage", function (evt) { + return get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == event; + }).length == 0 + ) + return true; return false; }, - content(){ - var num=0; - if(player.hp<=3) num++; - if(player.getHistory('useCard',function(evt){ - return evt.card.name=='sha'&&evt.addCount!==false&&evt.getParent('phaseUse')==trigger; - }).length<=1) num++; - if(player.getHistory('sourceDamage',function(evt){ - return get.type(evt.card,false)=='trick'&&evt.getParent('phaseUse')==trigger; - }).length==0) num++; + content() { + var num = 0; + if (player.hp <= 3) num++; + if ( + player.getHistory("useCard", function (evt) { + return ( + evt.card.name == "sha" && + evt.addCount !== false && + evt.getParent("phaseUse") == trigger + ); + }).length <= 1 + ) + num++; + if ( + player.getHistory("sourceDamage", function (evt) { + return ( + get.type(evt.card, false) == "trick" && evt.getParent("phaseUse") == trigger + ); + }).length == 0 + ) + num++; player.draw(num); - player.addTempSkill('rumi_shuwu3'); - player.addMark('rumi_shuwu3',num,false); + player.addTempSkill("rumi_shuwu3"); + player.addMark("rumi_shuwu3", num, false); }, }, - rumi_shuwu3:{ - mod:{ - maxHandcard(player,num){ - return num+player.countMark('rumi_shuwu3'); + rumi_shuwu3: { + mod: { + maxHandcard(player, num) { + return num + player.countMark("rumi_shuwu3"); }, }, - onremove:true, + onremove: true, }, - sakuya_junbu:{ - mod:{ - targetInRange(card,player){ - if(player.countDisabledSlot()>=1) return true; + sakuya_junbu: { + mod: { + targetInRange(card, player) { + if (player.countDisabledSlot() >= 1) return true; }, - cardUsable(card,player){ - if(player.countDisabledSlot()>=2) return Infinity; + cardUsable(card, player) { + if (player.countDisabledSlot() >= 2) return Infinity; }, }, - trigger:{player:'useCard2'}, - filter(event,player){ - if(player.countDisabledSlot()>=4) return true; - return lib.skill.sakuya_junbu.filter2.apply(this,arguments); + trigger: { player: "useCard2" }, + filter(event, player) { + if (player.countDisabledSlot() >= 4) return true; + return lib.skill.sakuya_junbu.filter2.apply(this, arguments); }, - filter2(event,player){ - if(player.countDisabledSlot()<3) return false; - var card=event.card; - var info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current); - })){ + filter2(event, player) { + if (player.countDisabledSlot() < 3) return false; + var card = event.card; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { return true; } } return false; }, - async cost(event, trigger, player){ - const result = {bool:false}; + async cost(event, trigger, player) { + const result = { bool: false }; event.result = result; - if(player.countDisabledSlot()>=4){ + if (player.countDisabledSlot() >= 4) { result.bool = true; - if(!lib.skill.sakuya_junbu.filter2(trigger,player)){ + if (!lib.skill.sakuya_junbu.filter2(trigger, player)) { return; } } - var prompt2='为'+get.translation(trigger.card)+'增加一个目标'; - const {result:result2} = await player.chooseTarget(get.prompt('sakuya_junbu'),function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - if(result2.bool){ + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + const { result: result2 } = await player + .chooseTarget(get.prompt("sakuya_junbu"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + if (result2.bool) { result.bool = true; result.targets = result2.targets; } }, - async content(event, trigger, player){ - if(player.countDisabledSlot()>=4){ + async content(event, trigger, player) { + if (player.countDisabledSlot() >= 4) { trigger.directHit.addArray(game.players); - game.log(trigger.card, '不可被响应'); + game.log(trigger.card, "不可被响应"); } - if(event.targets && event.targets.length>0){ + if (event.targets && event.targets.length > 0) { trigger.targets.addArray(event.targets); - game.log(event.targets, '也成为了', trigger.card, '的目标'); + game.log(event.targets, "也成为了", trigger.card, "的目标"); } }, - group:'sakuya_junbu_damage', - subSkill:{ - damage:{ - trigger:{source:'damageBegin1'}, - forced:true, - sub:true, - filter(event,player){ - return !player.hasEnabledSlot()&&event.getParent().type=='card'; + group: "sakuya_junbu_damage", + subSkill: { + damage: { + trigger: { source: "damageBegin1" }, + forced: true, + sub: true, + filter(event, player) { + return !player.hasEnabledSlot() && event.getParent().type == "card"; }, - logTarget:'player', - content(){ + logTarget: "player", + content() { player.loseHp(); trigger.num++; }, }, }, }, - hiroto_huyu:{ - trigger:{global:'phaseUseEnd'}, - noHidden:true, - filter(event,player){ - return player!=event.player&&player.hasSkill('hiroto_huyu')&&!player.hasSkill('hiroto_zonglve')&&event.player.countCards('h')>0; + hiroto_huyu: { + trigger: { global: "phaseUseEnd" }, + noHidden: true, + filter(event, player) { + return ( + player != event.player && + player.hasSkill("hiroto_huyu") && + !player.hasSkill("hiroto_zonglve") && + event.player.countCards("h") > 0 + ); }, - async cost(event, trigger, player){ - event.result = await trigger.player.chooseCard(2,'h','是否对'+get.translation(player)+'发动【虎驭】?','将两张手牌交给该角色,然后令其获得〖纵略〗并于下回合获得该角色得到的所有牌').set('goon',function(){ - var source=trigger.player; - if(get.attitude(source,player)>0) return 7; - if(source.hp>2) return 4; - return 0; - }()).set('ai',function(card){ - return _status.event.goon-get.value(card); - }).forResult(); + async cost(event, trigger, player) { + event.result = await trigger.player + .chooseCard( + 2, + "h", + "是否对" + get.translation(player) + "发动【虎驭】?", + "将两张手牌交给该角色,然后令其获得〖纵略〗并于下回合获得该角色得到的所有牌" + ) + .set( + "goon", + (function () { + var source = trigger.player; + if (get.attitude(source, player) > 0) return 7; + if (source.hp > 2) return 4; + return 0; + })() + ) + .set("ai", function (card) { + return _status.event.goon - get.value(card); + }) + .forResult(); }, - content(){ - var target=trigger.player; - target.give(cards,player); - player.storage.hiroto_huyu2=target; - player.addSkills('hiroto_zonglve'); - player.addSkill('hiroto_huyu2'); + content() { + var target = trigger.player; + target.give(cards, player); + player.storage.hiroto_huyu2 = target; + player.addSkills("hiroto_zonglve"); + player.addSkill("hiroto_huyu2"); }, - derivation:'hiroto_zonglve', + derivation: "hiroto_zonglve", }, - hiroto_huyu2:{ - trigger:{player:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - async content(event,trigger,player){ - player.removeSkill('hiroto_huyu2'); - await player.removeSkills('hiroto_zonglve'); - player.removeGaintag('hiroto_huyu2'); - var target=player.storage.hiroto_huyu2; - if(target&&target.isIn()){ - var cards=[]; - player.getHistory('gain',function(evt){ + hiroto_huyu2: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + async content(event, trigger, player) { + player.removeSkill("hiroto_huyu2"); + await player.removeSkills("hiroto_zonglve"); + player.removeGaintag("hiroto_huyu2"); + var target = player.storage.hiroto_huyu2; + if (target && target.isIn()) { + var cards = []; + player.getHistory("gain", function (evt) { cards.addArray(evt.cards); }); - var he=player.getCards('he'); - cards=cards.filter(function(card){ + var he = player.getCards("he"); + cards = cards.filter(function (card) { return he.includes(card); }); - if(cards.length) target.gain(cards,player,'giveAuto','bySelf'); + if (cards.length) target.gain(cards, player, "giveAuto", "bySelf"); } }, - mark:'character', - intro:{content:'已成为$的工具人'}, - group:'hiroto_huyu_gain', + mark: "character", + intro: { content: "已成为$的工具人" }, + group: "hiroto_huyu_gain", }, - hiroto_huyu_gain:{ - trigger:{player:'gainBegin'}, - silent:true, - filter(event,player){ - if(player==_status.currentPhase) event.gaintag.add('hiroto_huyu2'); + hiroto_huyu_gain: { + trigger: { player: "gainBegin" }, + silent: true, + filter(event, player) { + if (player == _status.currentPhase) event.gaintag.add("hiroto_huyu2"); return false; }, }, - hiroto_zonglve:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - }); + hiroto_zonglve: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); }, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; }, - filterCard:true, - delay:false, - charlotte:true, - position:'h', - discard:false, - lose:false, - content(){ - 'step 0' - player.choosePlayerCard(true,target,'h'); - 'step 1' - event.card=result.cards[0]; - player.$compare(cards[0],target,event.card); - game.log(player,'展示了',cards[0]); - game.log(target,'展示了',event.card) + filterCard: true, + delay: false, + charlotte: true, + position: "h", + discard: false, + lose: false, + content() { + "step 0"; + player.choosePlayerCard(true, target, "h"); + ("step 1"); + event.card = result.cards[0]; + player.$compare(cards[0], target, event.card); + game.log(player, "展示了", cards[0]); + game.log(target, "展示了", event.card); game.delay(3.5); - 'step 2' + ("step 2"); game.broadcastAll(ui.clear); - if(get.color(cards[0],player)==get.color(card,target)){ - target.damage('nocard'); - target.discard(card).animate=false; - } - else player.gainPlayerCard(target,true,2,'hej'); + if (get.color(cards[0], player) == get.color(card, target)) { + target.damage("nocard"); + target.discard(card).animate = false; + } else player.gainPlayerCard(target, true, 2, "hej"); }, - mod:{ - maxHandcard(player,num){ - return num+3; + mod: { + maxHandcard(player, num) { + return num + 3; }, }, - ai:{ - order:7, - result:{ - target:-1, + ai: { + order: 7, + result: { + target: -1, }, }, }, - hiroto_tuolao:{ - trigger:{player:'phaseAfter'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'water', - filter(event,player){ - return player.phaseNumber>1&&!player.getHistory('lose',function(evt){ - return evt.getParent(2).name=='hiroto_huyu2'; - }).length; + hiroto_tuolao: { + trigger: { player: "phaseAfter" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return ( + player.phaseNumber > 1 && + !player.getHistory("lose", function (evt) { + return evt.getParent(2).name == "hiroto_huyu2"; + }).length + ); }, - content(){ - player.awakenSkill('hiroto_tuolao'); + content() { + player.awakenSkill("hiroto_tuolao"); player.draw(3); - player.changeSkills(['hiroto_zonglve'],['hiroto_huyu']); + player.changeSkills(["hiroto_zonglve"], ["hiroto_huyu"]); }, }, - shizuku_sizhi:{ - audio:2, - enable:'phaseUse', - getResult(cards){ - var l=cards.length; - var all=Math.pow(l,2); - var list=[]; - for(var i=1;i0) array.push(cards[j]) + shizuku_sizhi: { + audio: 2, + enable: "phaseUse", + getResult(cards) { + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) + array.push(cards[j]); } - var num=0; - for(var k of array){ - num+=get.number(k); + var num = 0; + for (var k of array) { + num += get.number(k); } - if(num==13) list.push(array); + if (num == 13) list.push(array); } - if(list.length){ - list.sort(function(a,b){ - if(a.length!=b.length) return b.length-a.length; - return get.value(a)-get.value(b); + if (list.length) { + list.sort(function (a, b) { + if (a.length != b.length) return b.length - a.length; + return get.value(a) - get.value(b); }); return list[0]; } return list; }, - usable:1, - filterCard(card){ - var num=0; - for(var i=0;i0) array.push(cards[j]) + ("step 1"); + var num = result.number; + var next = player.chooseToDiscard( + "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", + function (card) { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); } - var numx=0; - for(var k of array){ - numx+=get.number(k); - } - if(numx==num) list.push(array); + return get.number(card) + num <= _status.event.num; + }, + "he" + ); + next.set("num", num); + next.set("complexCard", true); + next.set("selectCard", function () { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); } - if(list.length){ - list.sort(function(a,b){ - return get.value(a)-get.value(b); - }); - return list[0]; - } - return list; - }()); - next.set('ai',function(card){ - if(!_status.event.cardResult.includes(card)) return 0; - return 6-get.value(card); + if (num == _status.event.num) return ui.selected.cards.length; + return ui.selected.cards.length + 2; }); - 'step 2' - if(result.bool) player.recover(); + next.set( + "cardResult", + (function () { + var cards = player.getCards("he"); + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) + array.push(cards[j]); + } + var numx = 0; + for (var k of array) { + numx += get.number(k); + } + if (numx == num) list.push(array); + } + if (list.length) { + list.sort(function (a, b) { + return get.value(a) - get.value(b); + }); + return list[0]; + } + return list; + })() + ); + next.set("ai", function (card) { + if (!_status.event.cardResult.includes(card)) return 0; + return 6 - get.value(card); + }); + ("step 2"); + if (result.bool) player.recover(); }, }, - shizuku_sanhua:{ - trigger:{player:'die'}, - forceDie:true, - skillAnimation:true, - animationColor:'thunder', - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt2('shizuku_sanhua'),lib.filter.notMe).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).forResult(); + shizuku_sanhua: { + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "thunder", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("shizuku_sanhua"), lib.filter.notMe) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { var target = event.targets[0]; var names = []; var cards = []; while (cards.length < 4) { - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&!names.includes(card.name)&&get.type(card)=='basic'; + var card = get.cardPile2(function (card) { + return ( + !cards.includes(card) && + !names.includes(card.name) && + get.type(card) == "basic" + ); }); - if(card){ + if (card) { cards.push(card); names.push(card.name); - } - else break; + } else break; } - if(cards.length) await target.gain(cards,'gain2'); + if (cards.length) await target.gain(cards, "gain2"); }, }, - shiroha_yuzhao:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + shiroha_yuzhao: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - charlotte:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + charlotte: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ - player.addToExpansion(get.cards(game.countGroup()),'draw').gaintag.add('shiroha_yuzhao'); + content() { + player.addToExpansion(get.cards(game.countGroup()), "draw").gaintag.add("shiroha_yuzhao"); }, - marktext:'兆', - intro:{ - markcount:'expansion', - mark(dialog,content,player){ - var content=player.getExpansions('shiroha_yuzhao'); - if(content&&content.length){ - if(player==game.me||player.isUnderControl()){ + marktext: "兆", + intro: { + markcount: "expansion", + mark(dialog, content, player) { + var content = player.getExpansions("shiroha_yuzhao"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { dialog.addAuto(content); - } - else{ - return '共有'+get.cnNumber(content.length)+'张牌'; + } else { + return "共有" + get.cnNumber(content.length) + "张牌"; } } }, - content(content,player){ - var content=player.getExpansions('shiroha_yuzhao'); - if(content&&content.length){ - if(player==game.me||player.isUnderControl()){ + content(content, player) { + var content = player.getExpansions("shiroha_yuzhao"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { return get.translation(content); } - return '共有'+get.cnNumber(content.length)+'张牌'; + return "共有" + get.cnNumber(content.length) + "张牌"; } - } + }, }, - group:'shiroha_yuzhao_umi', + group: "shiroha_yuzhao_umi", }, - shiroha_yuzhao_umi:{ - trigger:{global:'phaseBegin'}, - forced:true, - filter(event,player){ - return player.getExpansions('shiroha_yuzhao').length>0&&get.distance(event.player,player)<=1; + shiroha_yuzhao_umi: { + trigger: { global: "phaseBegin" }, + forced: true, + filter(event, player) { + return ( + player.getExpansions("shiroha_yuzhao").length > 0 && + get.distance(event.player, player) <= 1 + ); }, - content(){ - 'step 0' - event.num=game.countGroup(); - player.addToExpansion(get.cards(event.num)).gaintag.add('shiroha_yuzhao'); - 'step 1' - var next=player.chooseToMove(),num=game.countGroup(); - next.set('prompt','预兆:将'+get.cnNumber(num)+'张牌置于牌堆顶'); - next.set('num',num); - next.set('forced',true); - next.set('filterOk',function(moved){ - return moved[1].length==_status.event.num; + content() { + "step 0"; + event.num = game.countGroup(); + player.addToExpansion(get.cards(event.num)).gaintag.add("shiroha_yuzhao"); + ("step 1"); + var next = player.chooseToMove(), + num = game.countGroup(); + next.set("prompt", "预兆:将" + get.cnNumber(num) + "张牌置于牌堆顶"); + next.set("num", num); + next.set("forced", true); + next.set("filterOk", function (moved) { + return moved[1].length == _status.event.num; }); - next.set('filterMove',function(from,to,moved){ - if(to!=1) return true; - return moved[1].length<_status.event.num; + next.set("filterMove", function (from, to, moved) { + if (to != 1) return true; + return moved[1].length < _status.event.num; }); - next.set('list',[ - [get.translation(player)+'(你)的“兆”',player.getExpansions('shiroha_yuzhao')], - ['牌堆顶'], + next.set("list", [ + [get.translation(player) + "(你)的“兆”", player.getExpansions("shiroha_yuzhao")], + ["牌堆顶"], ]); - next.set('processAI',function(list){ - var cards=list[0][1],cards2=cards.randomRemove(_status.event.num); - return [cards,cards2]; + next.set("processAI", function (list) { + var cards = list[0][1], + cards2 = cards.randomRemove(_status.event.num); + return [cards, cards2]; }); - 'step 2' - if(result&&result.bool){ - var cards=result.moved[1]; - player.lose(cards,ui.cardPile,'insert'); + ("step 2"); + if (result && result.bool) { + var cards = result.moved[1]; + player.lose(cards, ui.cardPile, "insert"); } game.updateRoundNumber(); }, }, - shiroha_guying:{ - derivation:'shiroha_guying_rewrite', - trigger:{ - player:'damageBegin3', - source:'damageBegin1', + shiroha_guying: { + derivation: "shiroha_guying_rewrite", + trigger: { + player: "damageBegin3", + source: "damageBegin1", }, - filter(event,player,name){ - if(!player.storage.shiroha_jiezhao&&player.hasSkill('shiroha_guying_temp')) return false; - if(name=='damageBegin3') return true; - return player!=event.player; + filter(event, player, name) { + if (!player.storage.shiroha_jiezhao && player.hasSkill("shiroha_guying_temp")) + return false; + if (name == "damageBegin3") return true; + return player != event.player; }, - locked(skill,player){ - if(!player||!player.storage.shiroha_jiezhao) return true; + locked(skill, player) { + if (!player || !player.storage.shiroha_jiezhao) return true; return false; }, - cost(){ - 'step 0' - var num=event.triggername=='damageBegin3'?-1:1; - if(player.storage.shiroha_jiezhao||!player.hasSkill('shiroha_guying')){ - if(num>0) player.chooseBool(get.prompt('shiroha_guying',trigger.player),'进行判定。若判定结果为黑色,则即将对其造成的伤害+1'); - else player.chooseBool(get.prompt('shiroha_guying'),'进行判定。若判定结果为红色,则即将受到的伤害-1'); - } - else event._result={bool:true}; - 'step 1' + cost() { + "step 0"; + var num = event.triggername == "damageBegin3" ? -1 : 1; + if (player.storage.shiroha_jiezhao || !player.hasSkill("shiroha_guying")) { + if (num > 0) + player.chooseBool( + get.prompt("shiroha_guying", trigger.player), + "进行判定。若判定结果为黑色,则即将对其造成的伤害+1" + ); + else + player.chooseBool( + get.prompt("shiroha_guying"), + "进行判定。若判定结果为红色,则即将受到的伤害-1" + ); + } else event._result = { bool: true }; + ("step 1"); event.result = result; }, - content(){ - 'step 0' - var num=event.triggername=='damageBegin3'?-1:1; - event.num=num; - player.addTempSkill('shiroha_guying_temp'); - player.judge(function(card){ - return (get.color(card)==(_status.event.getParent('shiroha_guying').num>0?'black':'red'))?2:0; - }).judge2=function(result){ - return result.bool?true:false; + content() { + "step 0"; + var num = event.triggername == "damageBegin3" ? -1 : 1; + event.num = num; + player.addTempSkill("shiroha_guying_temp"); + player.judge(function (card) { + return get.color(card) == + (_status.event.getParent("shiroha_guying").num > 0 ? "black" : "red") + ? 2 + : 0; + }).judge2 = function (result) { + return result.bool ? true : false; }; - 'step 1' - if(result.bool) trigger.num+=num; + ("step 1"); + if (result.bool) trigger.num += num; }, }, - shiroha_guying_temp:{charlotte:true}, - shiroha_jiezhao:{ - trigger:{global:'judge'}, - filter(event,player){ - return player.getExpansions('shiroha_yuzhao').length&&event.player.isIn(); + shiroha_guying_temp: { charlotte: true }, + shiroha_jiezhao: { + trigger: { global: "judge" }, + filter(event, player) { + return player.getExpansions("shiroha_yuzhao").length && event.player.isIn(); }, - async cost(event, trigger, player){ - const list = player.getExpansions('shiroha_yuzhao'); - const {result} = await player.chooseButton([get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+get.translation(trigger.player.judging[0])+ - ','+get.prompt('shiroha_jiezhao'),list,'hidden'],function(button){ - var card=button.link; - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - return result*attitude; - }).set('judging',trigger.player.judging[0]).set('filterButton',function(button){ - var player=_status.event.player; - var card=button.link; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }); - if(result.bool){ - event.result = {bool:true, cards:result.links}; + async cost(event, trigger, player) { + const list = player.getExpansions("shiroha_yuzhao"); + const { result } = await player + .chooseButton( + [ + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("shiroha_jiezhao"), + list, + "hidden", + ], + function (button) { + var card = button.link; + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + return result * attitude; + } + ) + .set("judging", trigger.player.judging[0]) + .set("filterButton", function (button) { + var player = _status.event.player; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }); + if (result.bool) { + event.result = { bool: true, cards: result.links }; } }, //logSkill留给respond - popup:false, - async content(event, trigger, player){ + popup: false, + async content(event, trigger, player) { const cards = event.cards; - await player.respond(cards, 'shiroha_jiezhao','highlight','noOrdering'); - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + await player.respond(cards, "shiroha_jiezhao", "highlight", "noOrdering"); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); } const oldJudgeCard = trigger.player.judging[0]; trigger.player.judging[0] = cards[0]; trigger.orderingCards.addArray(cards); - game.log(trigger.player,'的判定牌改为',cards[0]); + game.log(trigger.player, "的判定牌改为", cards[0]); await game.cardsDiscard(oldJudgeCard); await game.asyncDelay(2); - if(!player.getExpansions('shiroha_yuzhao').length){ - player.storage.shiroha_jiezhao=true; + if (!player.getExpansions("shiroha_yuzhao").length) { + player.storage.shiroha_jiezhao = true; player.gainMaxHp(); player.recover(); - var list=['umi_chaofan','ao_xishi','tsumugi_mugyu','kamome_jieban']; - var skill=list.randomGet(); - player.flashAvatar('shiroha_jiezhao','key_'+skill.split('_')[0]); + var list = ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"]; + var skill = list.randomGet(); + player.flashAvatar("shiroha_jiezhao", "key_" + skill.split("_")[0]); await player.addSkills(skill); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:0.6 - } + ai: { + rejudge: true, + tag: { + rejudge: 0.6, + }, }, - derivation:['umi_chaofan','ao_xishi','tsumugi_mugyu','kamome_jieban'], + derivation: ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"], }, - jojiro_shensu:{ - group:['jojiro_shensu1','jojiro_shensu2','jojiro_shensu4'], - charlotte:true, + jojiro_shensu: { + group: ["jojiro_shensu1", "jojiro_shensu2", "jojiro_shensu4"], + charlotte: true, }, - jojiro_shensu1:{ - trigger:{player:'phaseJudgeBefore'}, - async cost(event,trigger,player){ - const check = player.countCards('h')>2; - event.result = await player.chooseTarget(get.prompt("jojiro_shensu"),"跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】",function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }).set('check',check).set('ai',function(target){ - if(!_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); - }).forResult(); + jojiro_shensu1: { + trigger: { player: "phaseJudgeBefore" }, + async cost(event, trigger, player) { + const check = player.countCards("h") > 2; + event.result = await player + .chooseTarget( + get.prompt("jojiro_shensu"), + "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + } + ) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }) + .forResult(); }, - async content(event,trigger,player){ + async content(event, trigger, player) { await trigger.cancel(); - player.skip('phaseDraw'); - await player.useCard({name:'sha',isCard:true},event.targets[0],false); - } + player.skip("phaseDraw"); + await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); + }, }, - jojiro_shensu2:{ - trigger:{player:'phaseUseBefore'}, - filter(event,player){ - return player.countCards('he',{type:'equip'})>0; + jojiro_shensu2: { + trigger: { player: "phaseUseBefore" }, + filter(event, player) { + return player.countCards("he", { type: "equip" }) > 0; }, - async cost(event,trigger,player){ + async cost(event, trigger, player) { const check = player.needsToDiscard(); - event.result = await player.chooseCardTarget({ - prompt:get.prompt('jojiro_shensu'), - prompt2:"弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", - filterCard(card,player){ - return get.type(card)=='equip'&&lib.filter.cardDiscardable(card,player) - }, - position:'he', - filterTarget(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }, - ai1(card){ - if(_status.event.check) return 0; - return 6-get.value(card); - }, - ai2(target){ - if(_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); - }, - check:check - }).forResult(); + event.result = await player + .chooseCardTarget({ + prompt: get.prompt("jojiro_shensu"), + prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", + filterCard(card, player) { + return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); + }, + position: "he", + filterTarget(card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }, + ai1(card) { + if (_status.event.check) return 0; + return 6 - get.value(card); + }, + ai2(target) { + if (_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }, + check: check, + }) + .forResult(); }, - async content(event,trigger,player){ + async content(event, trigger, player) { await trigger.cancel(); await player.discard(event.cards[0]); - await player.useCard({name:'sha',isCard:true}, event.targets[0]); - } - }, - jojiro_shensu4:{ - trigger:{player:'phaseDiscardBefore'}, - async cost(event, trigger, player){ - var check=player.needsToDiscard()||player.isTurnedOver()||(player.hasSkill('shebian')&&player.canMoveCard(true,true)); - event.result = await player.chooseTarget(get.prompt('jojiro_shensu'),"跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】",function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }).set('check',check).set('ai',function(target){ - if(!_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player,_status.event.player); - }).forResult(); + await player.useCard({ name: "sha", isCard: true }, event.targets[0]); }, - async content(event, trigger, player){ + }, + jojiro_shensu4: { + trigger: { player: "phaseDiscardBefore" }, + async cost(event, trigger, player) { + var check = + player.needsToDiscard() || + player.isTurnedOver() || + (player.hasSkill("shebian") && player.canMoveCard(true, true)); + event.result = await player + .chooseTarget( + get.prompt("jojiro_shensu"), + "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + } + ) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect( + target, + { name: "sha" }, + _status.event.player, + _status.event.player + ); + }) + .forResult(); + }, + async content(event, trigger, player) { await trigger.cancel(); await player.turnOver(); - await player.useCard({name:'sha',isCard:true}, event.targets[0], false); - } - }, - jojiro_shunying:{ - trigger:{player:'phaseEnd'}, - forced:true, - charlotte:true, - filter(event,player){ - return player.getHistory('skipped').length>0; + await player.useCard({ name: "sha", isCard: true }, event.targets[0], false); }, - content(){ - 'step 0' - var num=player.getHistory('skipped').length; - event.num=num; - player.chooseToMoveChess(num,'瞬影:移动至多'+get.cnNumber(num)+'格或失去1点体力'); - 'step 1' - if(!result.bool) player.loseHp(); + }, + jojiro_shunying: { + trigger: { player: "phaseEnd" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.getHistory("skipped").length > 0; + }, + content() { + "step 0"; + var num = player.getHistory("skipped").length; + event.num = num; + player.chooseToMoveChess(num, "瞬影:移动至多" + get.cnNumber(num) + "格或失去1点体力"); + ("step 1"); + if (!result.bool) player.loseHp(); else player.draw(num); }, }, - kotori_yumo:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + kotori_yumo: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - charlotte:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + charlotte: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ - var list=['wei','shu','wu','qun','jin']; - for(var i of list){ - if(!player.hasMark('kotori_yumo_'+i)){ - player.addMark('kotori_yumo_'+i,1,false); - game.log(player,'获得了一个',lib.translate['kotori_yumo_'+i].replace(/魔物/g,'【魔物】')); + content() { + var list = ["wei", "shu", "wu", "qun", "jin"]; + for (var i of list) { + if (!player.hasMark("kotori_yumo_" + i)) { + player.addMark("kotori_yumo_" + i, 1, false); + game.log( + player, + "获得了一个", + lib.translate["kotori_yumo_" + i].replace(/魔物/g, "【魔物】") + ); } } }, - group:['kotori_yumo_damage','kotori_yumo_gain'], + group: ["kotori_yumo_damage", "kotori_yumo_gain"], }, - kotori_yumo_damage:{ - trigger:{global:'damageEnd'}, - forced:true, - filter(event,player){ - var name='kotori_yumo_'+event.player.group; - return lib.skill[name]&&!player.hasMark(name); + kotori_yumo_damage: { + trigger: { global: "damageEnd" }, + forced: true, + filter(event, player) { + var name = "kotori_yumo_" + event.player.group; + return lib.skill[name] && !player.hasMark(name); }, - popup:false, - content(){ - game.log(player,'对',trigger.player,'发动了','#g【驭魔】'); - var group=trigger.player.group; - player.popup('驭魔',get.groupnature(group)); - player.addMark('kotori_yumo_'+group,1,false); - game.log(player,'获得了一个',lib.translate['kotori_yumo_'+group].replace(/魔物/g,'【魔物】')); + popup: false, + content() { + game.log(player, "对", trigger.player, "发动了", "#g【驭魔】"); + var group = trigger.player.group; + player.popup("驭魔", get.groupnature(group)); + player.addMark("kotori_yumo_" + group, 1, false); + game.log( + player, + "获得了一个", + lib.translate["kotori_yumo_" + group].replace(/魔物/g, "【魔物】") + ); }, }, - kotori_yumo_gain:{ - trigger:{player:'phaseBegin'}, - filter(event,player){ - var list=['wei','shu','wu','qun','key','jin']; - for(var i in list){ - if(player.hasMark('kotori_yumo_'+list[i])) return true; + kotori_yumo_gain: { + trigger: { player: "phaseBegin" }, + filter(event, player) { + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + for (var i in list) { + if (player.hasMark("kotori_yumo_" + list[i])) return true; } return false; }, - async cost(event, trigger, player){ - const list=['wei','shu','wu','qun','key','jin']; - const list2=[]; - for(const i of list){ - if(player.hasMark('kotori_yumo_'+i)) list2.push('kotori_skill_'+i); + async cost(event, trigger, player) { + const list = ["wei", "shu", "wu", "qun", "key", "jin"]; + const list2 = []; + for (const i of list) { + if (player.hasMark("kotori_yumo_" + i)) list2.push("kotori_skill_" + i); } - list2.push('cancel2'); - const {control} = await player.chooseControl(list2).set('prompt','###是否发动【驭魔】?###弃置对应的标记并获得下列技能中的一个,或点取消,不获得技能').set('choice',function(){ - if(list2.includes('kotori_skill_shu')&&player.countCards('h',function(card){ - return get.name(card,player)=='sha'&&player.getUseValue(card)>0; - })>1) return 'kotori_skill_shu'; - if(list2.includes('kotori_skill_key')&&player.hp>1) return 'kotori_skill_key'; - if(list2.includes('kotori_skill_qun')&&player.isDamaged()&&player.needsToDiscard()>1) return 'kotori_skill_qun'; - return 'cancel2'; - }()).set('ai',function(){ - return _status.event.choice; - }).forResult(); + list2.push("cancel2"); + const { control } = await player + .chooseControl(list2) + .set( + "prompt", + "###是否发动【驭魔】?###弃置对应的标记并获得下列技能中的一个,或点取消,不获得技能" + ) + .set( + "choice", + (function () { + if ( + list2.includes("kotori_skill_shu") && + player.countCards("h", function (card) { + return ( + get.name(card, player) == "sha" && player.getUseValue(card) > 0 + ); + }) > 1 + ) + return "kotori_skill_shu"; + if (list2.includes("kotori_skill_key") && player.hp > 1) + return "kotori_skill_key"; + if ( + list2.includes("kotori_skill_qun") && + player.isDamaged() && + player.needsToDiscard() > 1 + ) + return "kotori_skill_qun"; + return "cancel2"; + })() + ) + .set("ai", function () { + return _status.event.choice; + }) + .forResult(); event.result = { - bool: control !== 'cancel2', - cost_data: {control}, - } + bool: control !== "cancel2", + cost_data: { control }, + }; }, - content(){ + content() { const result = event.cost_data; - if(result.control!='cancel2'){ - var name='kotori_yumo_'+result.control.slice(13); - player.removeMark(name,1,false);game.log(player,'移去了一个',lib.translate[name].replace(/魔物/g,'【魔物】')); + if (result.control != "cancel2") { + var name = "kotori_yumo_" + result.control.slice(13); + player.removeMark(name, 1, false); + game.log(player, "移去了一个", lib.translate[name].replace(/魔物/g, "【魔物】")); player.addTempSkills(result.control); - game.log(player,'获得了技能',lib.translate[name].replace(/魔物/g,'【'+get.translation(result.control)+'】')); + game.log( + player, + "获得了技能", + lib.translate[name].replace( + /魔物/g, + "【" + get.translation(result.control) + "】" + ) + ); } }, }, - kotori_skill_wei:{ - trigger:{player:'phaseBegin'}, - filter(event,player){ - return player.countCards('he')>0; + kotori_skill_wei: { + trigger: { player: "phaseBegin" }, + filter(event, player) { + return player.countCards("he") > 0; }, - async cost(event, trigger, player){ - event.result = await player.chooseCardTarget({ - prompt:get.prompt2(event.skill), - filterCard:lib.filter.cardDiscardable, - filterTarget(card,player,target){ - return player!=target; - }, - position:'he', - ai1(card){ - return 6-get.value(card); - }, - ai2(target){ - return 1/(1+target.countCards('he'))*-get.attitude(_status.event.player,target); - }, - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + prompt: get.prompt2(event.skill), + filterCard: lib.filter.cardDiscardable, + filterTarget(card, player, target) { + return player != target; + }, + position: "he", + ai1(card) { + return 6 - get.value(card); + }, + ai2(target) { + return ( + (1 / (1 + target.countCards("he"))) * + -get.attitude(_status.event.player, target) + ); + }, + }) + .forResult(); }, - content(){ - 'step 0' + content() { + "step 0"; player.discard(cards); - targets[0].chooseToDiscard('弃置一张牌,或令'+get.translation(player)+'摸一张牌','he').ai=lib.skill.zhiheng.check; - 'step 1' - if(!result.bool) player.draw(); + targets[0].chooseToDiscard( + "弃置一张牌,或令" + get.translation(player) + "摸一张牌", + "he" + ).ai = lib.skill.zhiheng.check; + ("step 1"); + if (!result.bool) player.draw(); }, }, - kotori_skill_shu:{ - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha') return num+1; + kotori_skill_shu: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + 1; }, }, - trigger:{player:'phaseUseEnd'}, - forced:true, - filter(event,player){ - return player.getHistory('useCard',function(evt){ - return evt.card&&evt.card.name=='sha'&&evt.getParent('phaseUse')==event; - }).length>1; + trigger: { player: "phaseUseEnd" }, + forced: true, + filter(event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.card && evt.card.name == "sha" && evt.getParent("phaseUse") == event; + }).length > 1 + ); }, - content(){player.draw()}, - }, - kotori_skill_wu:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.countCards('h')!=player.hp; - }, - content(){player.draw()}, - }, - kotori_skill_qun:{ - trigger:{player:'phaseDiscardBegin'}, - forced:true, - filter(event,player){ - return (player.getDamagedHp()>1||player.countCards('h')-player.getHp()>1); - }, - content(){ - var num=0; - if(player.getDamagedHp()>1) num++; - if(player.countCards('h')-player.getHp()>1) num++; - player.addMark('kotori_qunxin_temp',num,false); - player.addTempSkill('kotori_qunxin_temp','phaseDiscardEnd'); - }, - }, - kotori_skill_key:{ - enable:'phaseUse', - usable:1, - content(){ - "step 0" + content() { player.draw(); - "step 1" + }, + }, + kotori_skill_wu: { + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.countCards("h") != player.hp; + }, + content() { + player.draw(); + }, + }, + kotori_skill_qun: { + trigger: { player: "phaseDiscardBegin" }, + forced: true, + filter(event, player) { + return player.getDamagedHp() > 1 || player.countCards("h") - player.getHp() > 1; + }, + content() { + var num = 0; + if (player.getDamagedHp() > 1) num++; + if (player.countCards("h") - player.getHp() > 1) num++; + player.addMark("kotori_qunxin_temp", num, false); + player.addTempSkill("kotori_qunxin_temp", "phaseDiscardEnd"); + }, + }, + kotori_skill_key: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; + player.draw(); + ("step 1"); player.changeHujia(1); - "step 2" - var evt=event.getParent('phase'); - if(evt&&evt.after){ - var next=player.loseHp(); + ("step 2"); + var evt = event.getParent("phase"); + if (evt && evt.after) { + var next = player.loseHp(); event.next.remove(next); evt.after.push(next); } }, - ai:{ - order:10, - result:{ - player(player){ - return player.hp-1; + ai: { + order: 10, + result: { + player(player) { + return player.hp - 1; }, }, }, }, - kotori_skill_jin:{ - trigger:{player:'phaseDrawEnd'}, - filter(event,player){ - var hs=player.getCards('h'); - return hs.length>0&&player.getHistory('gain',function(evt){ - if(evt.getParent().name!='draw'||evt.getParent('phaseDraw')!=event) return false; - for(var i of evt.cards){ - if(hs.includes(i)) return true; - } - return false; - }).length>0; + kotori_skill_jin: { + trigger: { player: "phaseDrawEnd" }, + filter(event, player) { + var hs = player.getCards("h"); + return ( + hs.length > 0 && + player.getHistory("gain", function (evt) { + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) + return false; + for (var i of evt.cards) { + if (hs.includes(i)) return true; + } + return false; + }).length > 0 + ); }, - check(event,player){ - var hs=player.getCards('h'),cards=[],suits=[]; - player.getHistory('gain',function(evt){ - if(evt.getParent().name!='draw'||evt.getParent('phaseDraw')!=event) return false; - for(var i of evt.cards){ - if(hs.includes(i)){ + check(event, player) { + var hs = player.getCards("h"), + cards = [], + suits = []; + player.getHistory("gain", function (evt) { + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != event) + return false; + for (var i of evt.cards) { + if (hs.includes(i)) { cards.add(i); - suits.add(get.suit(i,player)); + suits.add(get.suit(i, player)); } } }); - return cards.length==suits.length; + return cards.length == suits.length; }, - content(){ - var hs=player.getCards('h'),cards=[],suits=[]; - player.getHistory('gain',function(evt){ - if(evt.getParent().name!='draw'||evt.getParent('phaseDraw')!=trigger) return false; - for(var i of evt.cards){ - if(hs.includes(i)){ + content() { + var hs = player.getCards("h"), + cards = [], + suits = []; + player.getHistory("gain", function (evt) { + if (evt.getParent().name != "draw" || evt.getParent("phaseDraw") != trigger) + return false; + for (var i of evt.cards) { + if (hs.includes(i)) { cards.add(i); - suits.add(get.suit(i,player)); + suits.add(get.suit(i, player)); } } }); - player.showCards(cards,get.translation(player)+'发动了【晋势】'); - if(cards.length==suits.length) player.draw(); + player.showCards(cards, get.translation(player) + "发动了【晋势】"); + if (cards.length == suits.length) player.draw(); }, }, - kotori_qunxin_temp:{ - onremove:true, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('kotori_qunxin_temp'); + kotori_qunxin_temp: { + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("kotori_qunxin_temp"); }, }, }, - kotori_yumo_wei:{ - marktext:'', - intro:{name:'魔物',content:'mark'}, + kotori_yumo_wei: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, }, - kotori_yumo_shu:{ - marktext:'', - intro:{name:'魔物',content:'mark'}, + kotori_yumo_shu: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, }, - kotori_yumo_wu:{ - marktext:'', - intro:{name:'魔物',content:'mark'}, + kotori_yumo_wu: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, }, - kotori_yumo_qun:{ - marktext:'', - intro:{name:'魔物',content:'mark'}, + kotori_yumo_qun: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, }, - kotori_yumo_key:{ - marktext:'', - intro:{name:'魔物',content:'mark'}, + kotori_yumo_key: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, }, - kotori_yumo_jin:{ - marktext:'', - intro:{name:'魔物',content:'mark'}, + kotori_yumo_jin: { + marktext: '', + intro: { + name: '魔物', + content: "mark", + }, }, - kotori_huazhan:{ - charlotte:true, - enable:'chooseToUse', - filter(event,player){ - var bool=false; - var list=['wei','shu','wu','qun','key','jin']; - for(var i of list){ - if(player.hasMark('kotori_yumo_'+i)&&!player.getStorage('kotori_huazhan2').includes('kotori_yumo_'+i)){ - bool=true;break; + kotori_huazhan: { + charlotte: true, + enable: "chooseToUse", + filter(event, player) { + var bool = false; + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + for (var i of list) { + if ( + player.hasMark("kotori_yumo_" + i) && + !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) + ) { + bool = true; + break; } } - return bool&&event.filterCard({name:'kaihua',isCard:true},player,event); + return bool && event.filterCard({ name: "kaihua", isCard: true }, player, event); }, - chooseButton:{ - dialog(event,player){ - return ui.create.dialog('###花绽###'+lib.translate.kotori_huazhan_info); + chooseButton: { + dialog(event, player) { + return ui.create.dialog("###花绽###" + lib.translate.kotori_huazhan_info); }, - chooseControl(event,player){ - var list=['wei','shu','wu','qun','key','jin']; - var list2=[]; - for(var i of list){ - if(player.hasMark('kotori_yumo_'+i)&&!player.getStorage('kotori_huazhan2').includes('kotori_yumo_'+i)) list2.push('kotori_yumo_'+i); + chooseControl(event, player) { + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + var list2 = []; + for (var i of list) { + if ( + player.hasMark("kotori_yumo_" + i) && + !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) + ) + list2.push("kotori_yumo_" + i); } - list2.push('cancel2'); + list2.push("cancel2"); return list2; }, - check(){ - var player=_status.event.player; - var list=['wei','shu','wu','qun','key','jin']; - var list2=[]; - for(var i of list){ - if(player.hasMark('kotori_yumo_'+i)&&!player.getStorage('kotori_huazhan2').includes('kotori_yumo_'+i)) list2.push('kotori_yumo_'+i); + check() { + var player = _status.event.player; + var list = ["wei", "shu", "wu", "qun", "key", "jin"]; + var list2 = []; + for (var i of list) { + if ( + player.hasMark("kotori_yumo_" + i) && + !player.getStorage("kotori_huazhan2").includes("kotori_yumo_" + i) + ) + list2.push("kotori_yumo_" + i); } - if(list2.includes('kotori_yumo_wei')) return 'kotori_yumo_wei'; - if(list2.includes('kotori_yumo_wu')) return 'kotori_yumo_wu'; - if(list2.includes('kotori_yumo_qun')) return 'kotori_yumo_qun'; - if(list2.includes('kotori_yumo_key')) return 'kotori_yumo_key'; - if(list2.includes('kotori_yumo_shu')&&game.hasPlayer(function(current){ - return current.group=='shu'; - })) return 'kotori_yumo_shu'; - return 'cancel2'; + if (list2.includes("kotori_yumo_wei")) return "kotori_yumo_wei"; + if (list2.includes("kotori_yumo_wu")) return "kotori_yumo_wu"; + if (list2.includes("kotori_yumo_qun")) return "kotori_yumo_qun"; + if (list2.includes("kotori_yumo_key")) return "kotori_yumo_key"; + if ( + list2.includes("kotori_yumo_shu") && + game.hasPlayer(function (current) { + return current.group == "shu"; + }) + ) + return "kotori_yumo_shu"; + return "cancel2"; }, - backup(result,player){ + backup(result, player) { return { - markname:result.control, - viewAs:{name:'kaihua',isCard:true}, - filterCard(){return false}, - selectCard:-1, - precontent(){ - delete event.result.skill; - var name=lib.skill.kotori_huazhan_backup.markname; - if(!player.storage.kotori_huazhan2) player.storage.kotori_huazhan2=[]; - player.storage.kotori_huazhan2.push(name); - player.addTempSkill('kotori_huazhan2'); - player.popup('花绽',get.groupnature(name.slice(12))); - game.log(player,'发动了技能',lib.translate[name].replace(/魔物/g,'【花绽】')); - player.removeMark(name,1,false); - game.log(player,'移去了一个',lib.translate[name].replace(/魔物/g,'【魔物】')); + markname: result.control, + viewAs: { name: "kaihua", isCard: true }, + filterCard() { + return false; }, - } - } + selectCard: -1, + precontent() { + delete event.result.skill; + var name = lib.skill.kotori_huazhan_backup.markname; + if (!player.storage.kotori_huazhan2) player.storage.kotori_huazhan2 = []; + player.storage.kotori_huazhan2.push(name); + player.addTempSkill("kotori_huazhan2"); + player.popup("花绽", get.groupnature(name.slice(12))); + game.log( + player, + "发动了技能", + lib.translate[name].replace(/魔物/g, "【花绽】") + ); + player.removeMark(name, 1, false); + game.log( + player, + "移去了一个", + lib.translate[name].replace(/魔物/g, "【魔物】") + ); + }, + }; + }, }, - ai:{ - order:1, - result:{ - player(player){ - if(player.countCards('he',function(card){ - if(get.type(card,player)=='equip') return get.value(card)<6; - return get.value(card)<5; - })<2) return 0; - return player.getUseValue({name:'kaihua'}); + ai: { + order: 1, + result: { + player(player) { + if ( + player.countCards("he", function (card) { + if (get.type(card, player) == "equip") return get.value(card) < 6; + return get.value(card) < 5; + }) < 2 + ) + return 0; + return player.getUseValue({ name: "kaihua" }); }, }, }, }, - kotori_huazhan2:{onremove:true}, - ryoichi_baoyi:{ - trigger:{ - player:'loseAfter', - global:['gainAfter','equipAfter','addJudgeAfter','loseAsyncAfter','addToExpansionAfter'], + kotori_huazhan2: { onremove: true }, + ryoichi_baoyi: { + trigger: { + player: "loseAfter", + global: [ + "gainAfter", + "equipAfter", + "addJudgeAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filterTarget(card,player,target){ - return target!=player&&(target.hasSex('female')||target.countCards('hej')>0); + filterTarget(card, player, target) { + return target != player && (target.hasSex("female") || target.countCards("hej") > 0); }, - filter(event,player){ - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0&&game.hasPlayer(function(target){ - return lib.skill.ryoichi_baoyi.filterTarget; - }); + filter(event, player) { + var evt = event.getl(player); + return ( + evt && + evt.es && + evt.es.length > 0 && + game.hasPlayer(function (target) { + return lib.skill.ryoichi_baoyi.filterTarget; + }) + ); }, - forced:true, - content(){ - 'step 0' - event.count=trigger.getl(player).es.length; + forced: true, + content() { + "step 0"; + event.count = trigger.getl(player).es.length; player.draw(event.count); - 'step 1' + ("step 1"); event.count--; - if(game.hasPlayer(function(target){ - return lib.skill.ryoichi_baoyi.filterTarget(null,player,target); - })){ - player.chooseTarget(true,lib.skill.ryoichi_baoyi.filterTarget,'请选择【爆衣】的目标').set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - } - else event.finish(); - 'step 2' - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'green'); - if(target.hasSex('female')) target.loseHp(); - else player.discardPlayerCard(target,2,'hej',true); - } - else event.finish(); - 'step 3' - if(event.count&&game.hasPlayer(function(target){ - return lib.skill.ryoichi_baoyi.filterTarget(null,player,target); - })) event.goto(1); + if ( + game.hasPlayer(function (target) { + return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); + }) + ) { + player + .chooseTarget(true, lib.skill.ryoichi_baoyi.filterTarget, "请选择【爆衣】的目标") + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + ("step 2"); + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + if (target.hasSex("female")) target.loseHp(); + else player.discardPlayerCard(target, 2, "hej", true); + } else event.finish(); + ("step 3"); + if ( + event.count && + game.hasPlayer(function (target) { + return lib.skill.ryoichi_baoyi.filterTarget(null, player, target); + }) + ) + event.goto(1); }, }, - ryoichi_tuipi:{ - mod:{ - targetEnabled(card){ - if(card.name=='shunshou'||card.name=='guohe') return false; + ryoichi_tuipi: { + mod: { + targetEnabled(card) { + if (card.name == "shunshou" || card.name == "guohe") return false; }, }, - trigger:{player:'phaseDiscardBegin'}, - forced:true, - content(){ + trigger: { player: "phaseDiscardBegin" }, + forced: true, + content() { trigger.setContent(lib.skill.ryoichi_tuipi.phaseDiscardContent); }, - phaseDiscardContent(){ - "step 0" - event.num=Math.max(0,player.countCards('he',card=>!player.canIgnoreHandcard(card))-player.getHandcardLimit()); - if(event.num<=0) event.finish(); - else{ - if(lib.config.show_phase_prompt){ - player.popup('弃牌阶段'); + phaseDiscardContent() { + "step 0"; + event.num = Math.max( + 0, + player.countCards("he", (card) => !player.canIgnoreHandcard(card)) - + player.getHandcardLimit() + ); + if (event.num <= 0) event.finish(); + else { + if (lib.config.show_phase_prompt) { + player.popup("弃牌阶段"); } } - event.trigger('phaseDiscard'); - "step 1" - player.chooseToDiscard(num,true,'he'); - "step 2" - event.cards=result.cards; + event.trigger("phaseDiscard"); + ("step 1"); + player.chooseToDiscard(num, true, "he"); + ("step 2"); + event.cards = result.cards; }, }, - yuu_lveduo:{ - mod:{ - cardEnabled(card,player){ - if(player.isTurnedOver()) return false; + yuu_lveduo: { + mod: { + cardEnabled(card, player) { + if (player.isTurnedOver()) return false; }, - cardRespondable(card,player){ - if(player.isTurnedOver()) return false; + cardRespondable(card, player) { + if (player.isTurnedOver()) return false; }, - cardSavable(card,player){ - if(player.isTurnedOver()) return false; + cardSavable(card, player) { + if (player.isTurnedOver()) return false; }, }, - trigger:{global:'phaseBeginStart'}, - filter(event,player){ - return player!=event.player&&!event.player._trueMe&&!player.getStorage('yuu_lveduo').includes(event.player)&&!player.isTurnedOver()&&!player.hasSkill('yuu_lveduo4'); + trigger: { global: "phaseBeginStart" }, + filter(event, player) { + return ( + player != event.player && + !event.player._trueMe && + !player.getStorage("yuu_lveduo").includes(event.player) && + !player.isTurnedOver() && + !player.hasSkill("yuu_lveduo4") + ); }, - charlotte:true, - check(event,player){ - if(get.attitude(player,event.player)>0) return false; - if(event.player.hasJudge('lebu')||!event.player.needsToDiscard()) return false; + charlotte: true, + check(event, player) { + if (get.attitude(player, event.player) > 0) return false; + if (event.player.hasJudge("lebu") || !event.player.needsToDiscard()) return false; return true; }, - logTarget:'player', - content(){ - 'step 0' + logTarget: "player", + content() { + "step 0"; player.turnOver(); - 'step 1' - if(player.isTurnedOver()){ - player.addTempSkill('yuu_lveduo4','roundStart') - if(!player.storage.yuu_lveduo) player.storage.yuu_lveduo=[]; + ("step 1"); + if (player.isTurnedOver()) { + player.addTempSkill("yuu_lveduo4", "roundStart"); + if (!player.storage.yuu_lveduo) player.storage.yuu_lveduo = []; player.storage.yuu_lveduo.push(trigger.player); - trigger.player._trueMe=player; - game.addGlobalSkill('autoswap'); - if(trigger.player==game.me){ - game.notMe=true; - if(!_status.auto) ui.click.auto(); + trigger.player._trueMe = player; + game.addGlobalSkill("autoswap"); + if (trigger.player == game.me) { + game.notMe = true; + if (!_status.auto) ui.click.auto(); } - player.addSkill('yuu_lveduo2'); - trigger.player.addSkill('yuu_lveduo3'); + player.addSkill("yuu_lveduo2"); + trigger.player.addSkill("yuu_lveduo3"); } }, }, - yuu_lveduo2:{ - trigger:{ - player:'turnOverEnd', + yuu_lveduo2: { + trigger: { + player: "turnOverEnd", }, - lastDo:true, - charlotte:true, - forceDie:true, - forced:true, - silent:true, - filter(event,player){ + lastDo: true, + charlotte: true, + forceDie: true, + forced: true, + silent: true, + filter(event, player) { return !player.isTurnedOver(); }, - content(){ - var target=game.findPlayer(function(current){ - return current._trueMe==player; + content() { + var target = game.findPlayer(function (current) { + return current._trueMe == player; }); - if(target){ - if(target==game.me){ - if(!game.notMe) game.swapPlayerAuto(target._trueMe) + if (target) { + if (target == game.me) { + if (!game.notMe) game.swapPlayerAuto(target._trueMe); else delete game.notMe; - if(_status.auto) ui.click.auto(); + if (_status.auto) ui.click.auto(); } delete target._trueMe; - target.removeSkill('yuu_lveduo3'); - var skills=target.getStockSkills(true,true).filter(function(skill){ - var info=get.info(skill); - return info&&info.charlotte==true; + target.removeSkill("yuu_lveduo3"); + var skills = target.getStockSkills(true, true).filter(function (skill) { + var info = get.info(skill); + return info && info.charlotte == true; }); - if(skills.length){ + if (skills.length) { target.removeSkills(skills); player.addSkills(skills); - lib.translate.yuu_lveduo_info=lib.translate.yuu_lveduo_full_info; + lib.translate.yuu_lveduo_info = lib.translate.yuu_lveduo_full_info; } - if(target.name=='key_yusa'){ + if (target.name == "key_yusa") { delete target.storage.dualside; - target.storage.dualside_over=true; - target.unmarkSkill('dualside'); - target.removeSkill('dualside'); - } - else if(target.name=='key_misa'){ + target.storage.dualside_over = true; + target.unmarkSkill("dualside"); + target.removeSkill("dualside"); + } else if (target.name == "key_misa") { delete target.storage.dualside; - target.storage.dualside_over=true; - target.unmarkSkill('dualside'); - target.reinit('key_misa','key_yusa'); - target.removeSkill('yusa_misa'); - target.removeSkill('dualside'); + target.storage.dualside_over = true; + target.unmarkSkill("dualside"); + target.reinit("key_misa", "key_yusa"); + target.removeSkill("yusa_misa"); + target.removeSkill("dualside"); target.turnOver(false); } } - player.removeSkill('yuu_lveduo2'); + player.removeSkill("yuu_lveduo2"); }, }, - yuu_lveduo3:{ - trigger:{ - player:['phaseAfter','dieAfter'], - global:'phaseBefore', + yuu_lveduo3: { + trigger: { + player: ["phaseAfter", "dieAfter"], + global: "phaseBefore", }, - lastDo:true, - charlotte:true, - forceDie:true, - forced:true, - silent:true, - content(){ - player.removeSkill('yuu_lveduo3'); + lastDo: true, + charlotte: true, + forceDie: true, + forced: true, + silent: true, + content() { + player.removeSkill("yuu_lveduo3"); }, - onremove(player){ - if(player._trueMe&&player._trueMe.isTurnedOver()) player._trueMe.turnOver(); + onremove(player) { + if (player._trueMe && player._trueMe.isTurnedOver()) player._trueMe.turnOver(); }, }, - yuu_lveduo4:{charlotte:true}, - godan_yuanyi:{ - trigger:{player:'phaseBegin'}, - forced:true, - content(){ - 'step 0' - var num=game.roundNumber; - if(num&&typeof num=='number') player.draw(Math.min(3,num)); - 'step 1' - trigger.phaseList.splice(trigger.num,0,'phaseUse|godan_yuanyi'); + yuu_lveduo4: { charlotte: true }, + godan_yuanyi: { + trigger: { player: "phaseBegin" }, + forced: true, + content() { + "step 0"; + var num = game.roundNumber; + if (num && typeof num == "number") player.draw(Math.min(3, num)); + ("step 1"); + trigger.phaseList.splice(trigger.num, 0, "phaseUse|godan_yuanyi"); }, }, - godan_feiqu:{ - inherit:'doruji_feiqu', + godan_feiqu: { + inherit: "doruji_feiqu", }, - godan_xiaoyuan:{ - trigger:{player:'changeHp'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'soil', - filter(event,player){ - return event.num<0&&player.hp<4; + godan_xiaoyuan: { + trigger: { player: "changeHp" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "soil", + filter(event, player) { + return event.num < 0 && player.hp < 4; }, - content(){ - player.awakenSkill('godan_xiaoyuan'); + content() { + player.awakenSkill("godan_xiaoyuan"); player.loseMaxHp(3); player.draw(3); - player.removeSkills('godan_feiqu'); + player.removeSkills("godan_feiqu"); }, }, - abyusa_jueqing:{ - audio:2, - trigger:{source:'damageBegin2'}, - skillAnimation:true, - animationColor:'water', - filter(event,player){ - return player!=event.player&&!player.storage.abyusa_jueqing_rewrite; + abyusa_jueqing: { + audio: 2, + trigger: { source: "damageBegin2" }, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player != event.player && !player.storage.abyusa_jueqing_rewrite; }, - prompt2(event,player){ - var num=get.cnNumber(2*event.num,true); - return '令即将对其造成的伤害翻倍至'+num+'点,并令自己失去'+get.cnNumber(event.num)+'点体力'; + prompt2(event, player) { + var num = get.cnNumber(2 * event.num, true); + return ( + "令即将对其造成的伤害翻倍至" + + num + + "点,并令自己失去" + + get.cnNumber(event.num) + + "点体力" + ); }, - check(event,player){ - return player.hp>event.num&&event.player.hp>event.num&&!event.player.hasSkillTag('filterDamage',null,{ - player:player, - card:event.card, - })&&get.attitude(player,event.player)<0; + check(event, player) { + return ( + player.hp > event.num && + event.player.hp > event.num && + !event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) && + get.attitude(player, event.player) < 0 + ); }, - locked(skill,player){ - return player&&player.storage.abyusa_jueqing_rewrite; + locked(skill, player) { + return player && player.storage.abyusa_jueqing_rewrite; }, - logTarget:'player', - content(){ + logTarget: "player", + content() { player.loseHp(trigger.num); - trigger.num*=2; - player.storage.abyusa_jueqing_rewrite=true; + trigger.num *= 2; + player.storage.abyusa_jueqing_rewrite = true; }, - derivation:'abyusa_jueqing_rewrite', - group:'abyusa_jueqing_rewrite', - subSkill:{ - rewrite:{ - audio:'abyusa_jueqing', - trigger:{source:'damageBefore'}, - forced:true, - charlotte:true, - filter(event,player){ - return player.storage.abyusa_jueqing_rewrite==true; + derivation: "abyusa_jueqing_rewrite", + group: "abyusa_jueqing_rewrite", + subSkill: { + rewrite: { + audio: "abyusa_jueqing", + trigger: { source: "damageBefore" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.storage.abyusa_jueqing_rewrite == true; }, - check(){return false;}, - content(){ + check() { + return false; + }, + content() { trigger.cancel(); trigger.player.loseHp(trigger.num); }, - ai:{ - jueqing:true, - skillTagFilter(player){ - return player.storage.abyusa_jueqing_rewrite==true; + ai: { + jueqing: true, + skillTagFilter(player) { + return player.storage.abyusa_jueqing_rewrite == true; }, - } - } + }, + }, }, }, - akiko_dongcha:{ - trigger:{global:'phaseBefore'}, - forced:true, - filter(event,player){ - return get.mode()=='identity'&&game.phaseNumber==0; + akiko_dongcha: { + trigger: { global: "phaseBefore" }, + forced: true, + filter(event, player) { + return get.mode() == "identity" && game.phaseNumber == 0; }, - content(){ - var func=function(){ - game.countPlayer(function(current){ + content() { + var func = function () { + game.countPlayer(function (current) { current.setIdentity(); }); }; - if(player==game.me) func(); - else if(player.isOnline()) player.send(func); - if(!player.storage.zhibi) player.storage.zhibi=[]; + if (player == game.me) func(); + else if (player.isOnline()) player.send(func); + if (!player.storage.zhibi) player.storage.zhibi = []; player.storage.zhibi.addArray(game.players); }, - ai:{ - viewHandcard:true, - skillTagFilter(player,tag,arg){ - if(player==arg) return false; + ai: { + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; }, }, }, - abyusa_dunying:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - forced:true, - filter(event,player){ + abyusa_dunying: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + filter(event, player) { return player.isDamaged(); }, - content(){ + content() { player.draw(player.getDamagedHp()); }, - mod:{ - globalTo(from,to,num){ - return num+to.getDamagedHp(); + mod: { + globalTo(from, to, num) { + return num + to.getDamagedHp(); }, }, }, - kaori_siyuan:{ - enable:'phaseUse', - filter(event,player){ - return player.countCards('he',lib.skill.kaori_siyuan.filterCard); + kaori_siyuan: { + enable: "phaseUse", + filter(event, player) { + return player.countCards("he", lib.skill.kaori_siyuan.filterCard); }, - filterCard(card){ - return ['equip','delay'].includes(get.type(card,false)); + filterCard(card) { + return ["equip", "delay"].includes(get.type(card, false)); }, - filterTarget(card,player,target){ - if(player==target) return false; - var card=ui.selected.cards[0]; - if(get.type(card,false)=='delay') return target.canAddJudge({name:card.name}); + filterTarget(card, player, target) { + if (player == target) return false; + var card = ui.selected.cards[0]; + if (get.type(card, false) == "delay") return target.canAddJudge({ name: card.name }); return target.canEquip(card); }, - discard:false, - lose:false, - prepare:'give', - content(){ - 'step 0' - var card=cards[0]; - if(get.type(card,false)=='equip') target.equip(card); + discard: false, + lose: false, + prepare: "give", + content() { + "step 0"; + var card = cards[0]; + if (get.type(card, false) == "equip") target.equip(card); else target.addJudge(card); - 'step 1' - var list=[]; - for(var i of lib.inpile){ - var type=get.type(i); - if(type=='basic'||type=='trick') list.push([type,'',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature) list.push([type,'',i,j]); + ("step 1"); + var list = []; + for (var i of lib.inpile) { + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push([type, "", i, j]); } } - player.chooseButton(['是否视为使用一张基本牌或普通锦囊牌?',[list,'vcard']]).set('filterButton',function(button){ - return player.hasUseTarget({name:button.link[2],nature:button.link[3],isCard:true}); - }).set('ai',function(button){ - return player.getUseValue({name:button.link[2],nature:button.link[3],isCard:true}); - }); - 'step 2' - if(result.bool){ - player.chooseUseTarget(true,{name:result.links[0][2],nature:result.links[0][3],isCard:true}); + player + .chooseButton(["是否视为使用一张基本牌或普通锦囊牌?", [list, "vcard"]]) + .set("filterButton", function (button) { + return player.hasUseTarget({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }) + .set("ai", function (button) { + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + ("step 2"); + if (result.bool) { + player.chooseUseTarget(true, { + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }); } }, - ai:{ - basic:{ - order:10 + ai: { + basic: { + order: 10, }, - result:{ - target(player,target){ - var card=ui.selected.cards[0]; - if(card) return get.effect(target,card,target,target); + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); return 0; }, }, - } - }, - shiori_huijuan:{ - trigger:{global:'phaseJieshuBegin'}, - locked:true, - filter(event,player){ - return event.player!=player&&event.player.getHistory('useCard',function(evt){ - return evt.isPhaseUsing()&&['basic','trick'].includes(get.type(evt.card))&&player.hasUseTarget({ - name:evt.card.name, - nature:evt.card.nature, - isCard:true, - }); - }).length>0; }, - async cost(event, trigger, player){ - const list=[]; - trigger.player.getHistory('useCard',function(evt){ - if(!evt.isPhaseUsing()||!['basic','trick'].includes(get.type(evt.card))) return; - if(evt.card.name=='sha'&&evt.card.nature) list.add('sha:'+evt.card.nature); + }, + shiori_huijuan: { + trigger: { global: "phaseJieshuBegin" }, + locked: true, + filter(event, player) { + return ( + event.player != player && + event.player.getHistory("useCard", function (evt) { + return ( + evt.isPhaseUsing() && + ["basic", "trick"].includes(get.type(evt.card)) && + player.hasUseTarget({ + name: evt.card.name, + nature: evt.card.nature, + isCard: true, + }) + ); + }).length > 0 + ); + }, + async cost(event, trigger, player) { + const list = []; + trigger.player.getHistory("useCard", function (evt) { + if (!evt.isPhaseUsing() || !["basic", "trick"].includes(get.type(evt.card))) return; + if (evt.card.name == "sha" && evt.card.nature) list.add("sha:" + evt.card.nature); else list.add(evt.card.name); }); - for(var i=0;i=0){ - if(stat[i].isMe) break; - if(stat[i].skill&&stat[i].skill.shiori_huijuan) num++; + shiori_huijuan_discard: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + var num = 0; + var stat = player.stat; + for (var i = stat.length - 2; i--; i >= 0) { + if (stat[i].isMe) break; + if (stat[i].skill && stat[i].skill.shiori_huijuan) num++; } - return num>=Math.max(2,game.countPlayer()/2); + return num >= Math.max(2, game.countPlayer() / 2); }, - forced:true, - content(){ - 'step 0' - if(!player.countDiscardableCards(player,'ej')) event._result={bool:false}; - else player.discardPlayerCard(player,'ej').set('ai',function(button){ - var card=button.link; - var player=_status.event.player; - if(get.position(card)=='j') return 7+Math.random(); - return 4+player.needsToDiscard()-get.value(card); - }); - 'step 1' - if(!result.bool) player.skip('phaseUse'); + forced: true, + content() { + "step 0"; + if (!player.countDiscardableCards(player, "ej")) event._result = { bool: false }; + else + player.discardPlayerCard(player, "ej").set("ai", function (button) { + var card = button.link; + var player = _status.event.player; + if (get.position(card) == "j") return 7 + Math.random(); + return 4 + player.needsToDiscard() - get.value(card); + }); + ("step 1"); + if (!result.bool) player.skip("phaseUse"); }, }, - miki_shenqiang:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + miki_shenqiang: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ - player.equip(game.createCard2('miki_hydrogladiator','club',6)); - player.equip(game.createCard2('miki_binoculars','diamond',6)); + content() { + player.equip(game.createCard2("miki_hydrogladiator", "club", 6)); + player.equip(game.createCard2("miki_binoculars", "diamond", 6)); }, - mod:{ - canBeDiscarded(card){ - if(get.position(card)=='e'&&['equip1','equip5'].includes(get.subtype(card))) return false; + mod: { + canBeDiscarded(card) { + if (get.position(card) == "e" && ["equip1", "equip5"].includes(get.subtype(card))) + return false; }, }, }, - miki_huanmeng:{ - inherit:'kamome_huanmeng', + miki_huanmeng: { + inherit: "kamome_huanmeng", }, - miki_zhiluo:{ - trigger:{global:'phaseEnd'}, - filter(event,player){ - return !event.player.countCards('e')&&player.inRange(event.player); + miki_zhiluo: { + trigger: { global: "phaseEnd" }, + filter(event, player) { + return !event.player.countCards("e") && player.inRange(event.player); }, - locked:true, - async cost(event, trigger, player){ - event.result = {bool: true, cost_data: {index:0}}; - if (player.canUse('sha', trigger.player, false)){ - const {index} = await player.chooseControl().set('prompt','制裸:请选择一项').set('choiceList',[ - '摸一张牌', - '视为对'+get.translation(trigger.player)+'使用一张【杀】', - ]).set('ai',function(){ - if(get.effect(_status.event.getTrigger().player,{name:'sha'},_status.event.player)>0) return 1; - return 0; - }).forResult(); + locked: true, + async cost(event, trigger, player) { + event.result = { bool: true, cost_data: { index: 0 } }; + if (player.canUse("sha", trigger.player, false)) { + const { index } = await player + .chooseControl() + .set("prompt", "制裸:请选择一项") + .set("choiceList", [ + "摸一张牌", + "视为对" + get.translation(trigger.player) + "使用一张【杀】", + ]) + .set("ai", function () { + if ( + get.effect( + _status.event.getTrigger().player, + { name: "sha" }, + _status.event.player + ) > 0 + ) + return 1; + return 0; + }) + .forResult(); event.result.cost_data.index = index; } }, - async content(event, trigger, player){ + async content(event, trigger, player) { const result = event.cost_data; - if(result.index==0){ - player.logSkill('miki_zhiluo'); + if (result.index == 0) { + player.logSkill("miki_zhiluo"); player.draw(); - } - else player.useCard({name:'sha',isCard:true},trigger.player,'miki_zhiluo'); + } else player.useCard({ name: "sha", isCard: true }, trigger.player, "miki_zhiluo"); }, }, - miki_hydrogladiator_skill:{ - trigger:{ - source:'damageSource', + miki_hydrogladiator_skill: { + trigger: { + source: "damageSource", }, - locked:true, - popup:'海德洛', - filter(event,player){ - return event.getParent().name=='sha'&&game.hasPlayer(function(current){ - return (current==event.player||current!=player&&get.distance(current,event.player)<=1)&¤t.countDiscardableCards(player,'he')>0; - }); + locked: true, + popup: "海德洛", + filter(event, player) { + return ( + event.getParent().name == "sha" && + game.hasPlayer(function (current) { + return ( + (current == event.player || + (current != player && get.distance(current, event.player) <= 1)) && + current.countDiscardableCards(player, "he") > 0 + ); + }) + ); }, - cost(){ - 'step 0' - var list=[]; - var choiceList=[]; - if(trigger.player.countDiscardableCards(player,'he')>0){ + cost() { + "step 0"; + var list = []; + var choiceList = []; + if (trigger.player.countDiscardableCards(player, "he") > 0) { list.push(true); - choiceList.push('弃置'+get.translation(trigger.player)+'的两张牌'); + choiceList.push("弃置" + get.translation(trigger.player) + "的两张牌"); } - if(game.hasPlayer(function(current){ - return current!=player&&get.distance(current,trigger.player)<=1; - })){ + if ( + game.hasPlayer(function (current) { + return current != player && get.distance(current, trigger.player) <= 1; + }) + ) { list.push(false); - choiceList.push('弃置所有至'+get.translation(trigger.player)+'距离为1的角色的各一张牌'); + choiceList.push( + "弃置所有至" + get.translation(trigger.player) + "距离为1的角色的各一张牌" + ); } - event.list=list; - if(list.length==1) event._result={index:0}; - else{ - player.chooseControl().set('choiceList',choiceList).set('prompt','海德洛格拉迪尔特·改').set('ai',function(){ - var player=_status.event.player; - var source=_status.event.getTrigger().player; - var num=game.countPlayer(function(current){ - if(current!=player&&get.distance(current,source)<=1&¤t.countDiscardableCards(player,'he')>0) return -get.sgn(get.attitude(player,current)); + event.list = list; + if (list.length == 1) event._result = { index: 0 }; + else { + player + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", "海德洛格拉迪尔特·改") + .set("ai", function () { + var player = _status.event.player; + var source = _status.event.getTrigger().player; + var num = game.countPlayer(function (current) { + if ( + current != player && + get.distance(current, source) <= 1 && + current.countDiscardableCards(player, "he") > 0 + ) + return -get.sgn(get.attitude(player, current)); + }); + if (num > Math.min(2, source.countDiscardableCards(player, "he"))) return 1; + return 0; }); - if(num>Math.min(2,source.countDiscardableCards(player,'he'))) return 1; - return 0; - }); } - 'step 1' - if(event.list[result.index]){ + ("step 1"); + if (event.list[result.index]) { event.result = { bool: true, - cost_data:{type: 'single'}, + cost_data: { type: "single" }, targets: [trigger.player], - } - } - else{ + }; + } else { event.result = { bool: true, - cost_data:{type: 'multiple'}, - targets: game.filterPlayer(function(current){ - return current!=player&&get.distance(current,trigger.player)<=1; - }).sortBySeat(), - } + cost_data: { type: "multiple" }, + targets: game + .filterPlayer(function (current) { + return current != player && get.distance(current, trigger.player) <= 1; + }) + .sortBySeat(), + }; } }, - content(){ - 'step 0' - if(event.cost_data.type == 'single'){ - player.discardPlayerCard(targets[0],'he',2,true); + content() { + "step 0"; + if (event.cost_data.type == "single") { + player.discardPlayerCard(targets[0], "he", 2, true); event.finish(); } - 'step 1' - var target=targets.shift(); - if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,'he',true); - if(targets.length) event.redo(); + ("step 1"); + var target = targets.shift(); + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true); + if (targets.length) event.redo(); }, }, - miki_binoculars:{ - locked:true, - ai:{ - viewHandcard:true, - skillTagFilter(player,tag,arg){ - if(player==arg) return false; + miki_binoculars: { + locked: true, + ai: { + viewHandcard: true, + skillTagFilter(player, tag, arg) { + if (player == arg) return false; }, }, }, - kud_qiaoshou:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return !player.getExpansions('kud_qiaoshou_equip').length&&player.countCards('h')>0; + kud_qiaoshou: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return !player.getExpansions("kud_qiaoshou_equip").length && player.countCards("h") > 0; }, - chooseButton:{ - dialog(){ - var list=[]; - var list2=['pyzhuren_heart','pyzhuren_diamond','pyzhuren_club','pyzhuren_spade','pyzhuren_shandian','rewrite_zhuge']; + chooseButton: { + dialog() { + var list = []; + var list2 = [ + "pyzhuren_heart", + "pyzhuren_diamond", + "pyzhuren_club", + "pyzhuren_spade", + "pyzhuren_shandian", + "rewrite_zhuge", + ]; list2.addArray(lib.inpile); - for(var i of list2){ - var sub=get.subtype(i); - if(['equip1','equip4'].includes(sub)) list.push([sub,'',i]); + for (var i of list2) { + var sub = get.subtype(i); + if (["equip1", "equip4"].includes(sub)) list.push([sub, "", i]); } - return ui.create.dialog('巧手:选择一种装备牌',[list,'vcard'],'hidden'); + return ui.create.dialog("巧手:选择一种装备牌", [list, "vcard"], "hidden"); }, - check(button){ - var player=_status.event.player; - var name=button.link[2]; - if(get.subtype(name)=='equip4'||player.getEquip(name)) return 0; - var sha=player.countCards('h','sha'); - switch(name){ - case 'rewrite_zhuge': - return sha-player.getCardUsable('sha'); - case 'guding': - if(sha>0&&game.hasPlayer(function(current){ - return get.attitude(player,current)<0&&!current.countCards('h')&&player.canUse('sha',current)&&get.effect(current,{name:'sha'},player)>0; - })) return 1.4+Math.random(); + check(button) { + var player = _status.event.player; + var name = button.link[2]; + if (get.subtype(name) == "equip4" || player.getEquip(name)) return 0; + var sha = player.countCards("h", "sha"); + switch (name) { + case "rewrite_zhuge": + return sha - player.getCardUsable("sha"); + case "guding": + if ( + sha > 0 && + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + !current.countCards("h") && + player.canUse("sha", current) && + get.effect(current, { name: "sha" }, player) > 0 + ); + }) + ) + return 1.4 + Math.random(); return 0; - case 'guanshi': - if(sha>0) return 0.7+Math.random(); + case "guanshi": + if (sha > 0) return 0.7 + Math.random(); return 0; - case 'qinggang': - if(sha>0) return 0.4+Math.random(); + case "qinggang": + if (sha > 0) return 0.4 + Math.random(); return 0; - case 'zhuque': - if(game.hasPlayer(function(current){ - return get.attitude(player,current)<0&¤t.getEquip('tengjia')&&get.effect(current,{name:'sha',nature:'fire'},player)>0; - })) return 1.2+Math.random(); + case "zhuque": + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + current.getEquip("tengjia") && + get.effect(current, { name: "sha", nature: "fire" }, player) > 0 + ); + }) + ) + return 1.2 + Math.random(); + return 0; + default: return 0; - default: return 0; } }, - backup(links){ - var next=get.copy(lib.skill.kud_qiaoshou_backupx); - next.cardname=links[0][2]; + backup(links) { + var next = get.copy(lib.skill.kud_qiaoshou_backupx); + next.cardname = links[0][2]; return next; }, - prompt(links){ - return '将一张手牌置于武将牌上,然后视为装备'+get.translation(links[0][2]); + prompt(links) { + return "将一张手牌置于武将牌上,然后视为装备" + get.translation(links[0][2]); }, }, - group:'kud_qiaoshou_end', - ai:{ - notemp:true, - order:5, - result:{ - player:1, + group: "kud_qiaoshou_end", + ai: { + notemp: true, + order: 5, + result: { + player: 1, }, }, }, - kud_qiaoshou_backupx:{ - filterCard:true, - discard:false, - lose:false, - delay:false, - check(event,player){ - return 6-get.value(card); + kud_qiaoshou_backupx: { + filterCard: true, + discard: false, + lose: false, + delay: false, + check(event, player) { + return 6 - get.value(card); }, - content(){ - 'step 0' - player.addToExpansion(cards,player,'give').gaintag.add('kud_qiaoshou_equip'); - 'step 1' - if(!player.getExpansions('kud_qiaoshou_equip').length) return; - player.addTempSkill('kud_qiaoshou_equip',{player:['phaseUseEnd','phaseZhunbeiBegin']}); - var name=lib.skill.kud_qiaoshou_backup.cardname; - player.storage.kud_qiaoshou_equip2=name; - var info=lib.card[name].skills; - if(info&&info.length) player.addAdditionalSkill('kud_qiaoshou_equip',info); + content() { + "step 0"; + player.addToExpansion(cards, player, "give").gaintag.add("kud_qiaoshou_equip"); + ("step 1"); + if (!player.getExpansions("kud_qiaoshou_equip").length) return; + player.addTempSkill("kud_qiaoshou_equip", { + player: ["phaseUseEnd", "phaseZhunbeiBegin"], + }); + var name = lib.skill.kud_qiaoshou_backup.cardname; + player.storage.kud_qiaoshou_equip2 = name; + var info = lib.card[name].skills; + if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info); player.draw(); - game.log(player,'声明了','#y'+get.translation(name)); + game.log(player, "声明了", "#y" + get.translation(name)); }, - ai:{ - result:{ - player:1, + ai: { + result: { + player: 1, }, }, }, - kud_qiaoshou_equip:{ - charlotte:true, - mod:{ - globalFrom(from,to,distance){ - var info=lib.card[from.storage.kud_qiaoshou_equip2]; - if(info&&info.distance&&info.distance.globalFrom) return distance+info.distance.globalFrom; + kud_qiaoshou_equip: { + charlotte: true, + mod: { + globalFrom(from, to, distance) { + var info = lib.card[from.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.globalFrom) + return distance + info.distance.globalFrom; }, - globalTo(from,to,distance){ - var info=lib.card[to.storage.kud_qiaoshou_equip2]; - if(info&&info.distance&&info.distance.globalTo) return distance+info.distance.globalTo; + globalTo(from, to, distance) { + var info = lib.card[to.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.globalTo) + return distance + info.distance.globalTo; }, - attackRange(from,distance){ - var info=lib.card[from.storage.kud_qiaoshou_equip2]; - if(info&&info.distance&&info.distance.attackFrom) return distance-info.distance.attackFrom; + attackRange(from, distance) { + var info = lib.card[from.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.attackFrom) + return distance - info.distance.attackFrom; }, - attackTo(from,to,distance){ - var info=lib.card[to.storage.kud_qiaoshou_equip2]; - if(info&&info.distance&&info.distance.attackTo) return distance+info.distance.attackTo; + attackTo(from, to, distance) { + var info = lib.card[to.storage.kud_qiaoshou_equip2]; + if (info && info.distance && info.distance.attackTo) + return distance + info.distance.attackTo; }, }, - onremove(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - markcount:'expansion', - mark(dialog,storage,player){ - dialog.add(player.getExpansions('kud_qiaoshou_equip')); - dialog.addText('当前装备:'+get.translation(player.storage.kud_qiaoshou_equip2)); - var str2=lib.translate[player.storage.kud_qiaoshou_equip2+'_info']; - if(str2){ - if(str2.length>=12) dialog.addText(str2,false); + intro: { + markcount: "expansion", + mark(dialog, storage, player) { + dialog.add(player.getExpansions("kud_qiaoshou_equip")); + dialog.addText("当前装备:" + get.translation(player.storage.kud_qiaoshou_equip2)); + var str2 = lib.translate[player.storage.kud_qiaoshou_equip2 + "_info"]; + if (str2) { + if (str2.length >= 12) dialog.addText(str2, false); else dialog.addText(str2); } }, - onunmark(storage,player){ - player.removeAdditionalSkill('kud_qiaoshou_equip'); + onunmark(storage, player) { + player.removeAdditionalSkill("kud_qiaoshou_equip"); delete player.storage.kud_qiaoshou_equip2; player.addEquipTrigger(); }, }, }, - kud_qiaoshou_end:{ - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return player.countCards('h')>0&&!player.getExpansions('kud_qiaoshou_equip').length; + kud_qiaoshou_end: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.countCards("h") > 0 && !player.getExpansions("kud_qiaoshou_equip").length; }, - cost(){ - 'step 0' - var list=[]; - var list2=['rewrite_bagua','rewrite_renwang','rewrite_tengjia','rewrite_baiyin']; + cost() { + "step 0"; + var list = []; + var list2 = ["rewrite_bagua", "rewrite_renwang", "rewrite_tengjia", "rewrite_baiyin"]; list2.addArray(lib.inpile); - for(var i of list2){ - var sub=get.subtype(i); - if(['equip2','equip3'].includes(sub)) list.push([sub,'',i]); + for (var i of list2) { + var sub = get.subtype(i); + if (["equip2", "equip3"].includes(sub)) list.push([sub, "", i]); } - player.chooseButton([get.prompt('kud_qiaoshou'),[list,'vcard']]).set('ai',function(button){ - var player=_status.event.player; - var name=button.link[2]; - if(get.subtype(name)=='equip3'||player.getEquip(name)) return false; - switch(name){ - case 'yexingyi': - if(player.hp>2||player.getEquip('bagua')||player.getEquip('tengjia')) return 1.5+Math.random(); - return 0.5+Math.random(); - case 'rewrite_bagua':case 'rewrite_renwang': - if(player.getEquip('bagua')||player.getEquip('tengjia')||player.getEquip('renwang')) return Math.random(); - return 1.2+Math.random(); - case 'rewrite_tengjia': - if(player.getEquip('baiyin')) return 1.3+Math.random(); - return Math.random(); - case 'rewrite_baiyin': - return 0.4+Math.random(); - default: return 0; - } - }); - 'step 1' - if(result.bool){ - event.cardname=result.links[0][2]; - player.chooseCard('h',true,'将一张手牌置于武将牌上,然后视为装备'+get.translation(event.cardname)); - } - else event.finish(); - 'step 2' - if(result.bool){ + player + .chooseButton([get.prompt("kud_qiaoshou"), [list, "vcard"]]) + .set("ai", function (button) { + var player = _status.event.player; + var name = button.link[2]; + if (get.subtype(name) == "equip3" || player.getEquip(name)) return false; + switch (name) { + case "yexingyi": + if ( + player.hp > 2 || + player.getEquip("bagua") || + player.getEquip("tengjia") + ) + return 1.5 + Math.random(); + return 0.5 + Math.random(); + case "rewrite_bagua": + case "rewrite_renwang": + if ( + player.getEquip("bagua") || + player.getEquip("tengjia") || + player.getEquip("renwang") + ) + return Math.random(); + return 1.2 + Math.random(); + case "rewrite_tengjia": + if (player.getEquip("baiyin")) return 1.3 + Math.random(); + return Math.random(); + case "rewrite_baiyin": + return 0.4 + Math.random(); + default: + return 0; + } + }); + ("step 1"); + if (result.bool) { + event.cardname = result.links[0][2]; + player.chooseCard( + "h", + true, + "将一张手牌置于武将牌上,然后视为装备" + get.translation(event.cardname) + ); + } else event.finish(); + ("step 2"); + if (result.bool) { event.result = { - bool:true, + bool: true, cards: result.cards, - cost_data:{ + cost_data: { cardname: event.cardname, }, - } + }; } }, - async content(event, trigger, player){ - await player.addToExpansion(event.cards,player,'give').gaintag.add('kud_qiaoshou_equip'); - if(!player.getExpansions('kud_qiaoshou_equip').length) return; - player.addTempSkill('kud_qiaoshou_equip',{player:['phaseUseEnd','phaseZhunbeiBegin']}); - var name=event.cost_data.cardname; - player.storage.kud_qiaoshou_equip2=name; - player.markAuto('kud_qiaoshou_equip',cards); - var info=lib.card[name].skills; - if(info&&info.length) player.addAdditionalSkill('kud_qiaoshou_equip',info); - game.log(player,'声明了','#y'+get.translation(name)); + async content(event, trigger, player) { + await player + .addToExpansion(event.cards, player, "give") + .gaintag.add("kud_qiaoshou_equip"); + if (!player.getExpansions("kud_qiaoshou_equip").length) return; + player.addTempSkill("kud_qiaoshou_equip", { + player: ["phaseUseEnd", "phaseZhunbeiBegin"], + }); + var name = event.cost_data.cardname; + player.storage.kud_qiaoshou_equip2 = name; + player.markAuto("kud_qiaoshou_equip", cards); + var info = lib.card[name].skills; + if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info); + game.log(player, "声明了", "#y" + get.translation(name)); await player.draw(); }, }, - kud_buhui:{ - enable:'chooseToUse', - filter(event,player){ - return event.type=='dying'&&player==event.dying&&(player.getExpansions('kud_qiaoshou_equip').length+player.countCards('e'))>0; + kud_buhui: { + enable: "chooseToUse", + filter(event, player) { + return ( + event.type == "dying" && + player == event.dying && + player.getExpansions("kud_qiaoshou_equip").length + player.countCards("e") > 0 + ); }, - skillAnimation:true, - limited:true, - animationColor:'gray', - content(){ - 'step 0' - player.awakenSkill('kud_buhui'); - var cards=player.getCards('e').concat(player.getExpansions('kud_qiaoshou_equip')); - if(cards.length) player.discard(cards); - player.removeSkill('kud_qiaoshou_equip'); + skillAnimation: true, + limited: true, + animationColor: "gray", + content() { + "step 0"; + player.awakenSkill("kud_buhui"); + var cards = player.getCards("e").concat(player.getExpansions("kud_qiaoshou_equip")); + if (cards.length) player.discard(cards); + player.removeSkill("kud_qiaoshou_equip"); player.draw(cards.length); - player.addSkills('kud_chongzhen'); - 'step 1' - var num=2-player.hp; - if(num) player.recover(num); + player.addSkills("kud_chongzhen"); + ("step 1"); + var num = 2 - player.hp; + if (num) player.recover(num); }, - derivation:'riki_chongzhen', - ai:{ - order:0.5, - result:{ - player:1, + derivation: "riki_chongzhen", + ai: { + order: 0.5, + result: { + player: 1, }, - save:true, - skillTagFilter(player,tag,target){ - return player==target; + save: true, + skillTagFilter(player, tag, target) { + return player == target; }, }, }, - kud_chongzhen:{ - inherit:'riki_chongzhen', + kud_chongzhen: { + inherit: "riki_chongzhen", }, - misuzu_hengzhou:{ - trigger:{player:['phaseJieshuBegin','recoverEnd','damageEnd','phaseDrawBegin2','phaseZhunbeiBegin']}, - forced:true, - character:true, - filter(event,player){ - if(event.name=='phaseZhunbei') return true; - if(['damage','recover'].includes(event.name)) return event.num>0; - var num=player.countMark('misuzu_hengzhou'); - if(event.name=='phaseDraw') return num>0&&!event.numFixed; - return num>3; + misuzu_hengzhou: { + trigger: { + player: [ + "phaseJieshuBegin", + "recoverEnd", + "damageEnd", + "phaseDrawBegin2", + "phaseZhunbeiBegin", + ], }, - content(){ - var num=player.countMark('misuzu_hengzhou'); - if(trigger.name=='phaseDraw') trigger.num+=num; - else if(trigger.name=='phaseJieshu'){ - player.removeMark('misuzu_hengzhou',num); + forced: true, + character: true, + filter(event, player) { + if (event.name == "phaseZhunbei") return true; + if (["damage", "recover"].includes(event.name)) return event.num > 0; + var num = player.countMark("misuzu_hengzhou"); + if (event.name == "phaseDraw") return num > 0 && !event.numFixed; + return num > 3; + }, + content() { + var num = player.countMark("misuzu_hengzhou"); + if (trigger.name == "phaseDraw") trigger.num += num; + else if (trigger.name == "phaseJieshu") { + player.removeMark("misuzu_hengzhou", num); player.loseHp(); - } - else player.addMark('misuzu_hengzhou',trigger.num||1); + } else player.addMark("misuzu_hengzhou", trigger.num || 1); }, - intro:{ - name:'诅咒', - name2:'诅咒', - content:'mark', + intro: { + name: "诅咒", + name2: "诅咒", + content: "mark", }, - marktext:'诅', - mod:{ - maxHandcard(player,num){ - return num+player.countMark('misuzu_hengzhou'); + marktext: "诅", + mod: { + maxHandcard(player, num) { + return num + player.countMark("misuzu_hengzhou"); }, }, - ai:{ - notemp:true, + ai: { + notemp: true, }, }, - misuzu_nongyin:{ - enable:'chooseToUse', - viewAs:{ - name:'tao', - isCard:true, + misuzu_nongyin: { + enable: "chooseToUse", + viewAs: { + name: "tao", + isCard: true, }, - viewAsFilter(player){ - return !player.hasJudge('lebu')&&player.countCards('hes',function(card){ - return get.color(card)=='red'&&get.type(card,'trick')!='trick'; - }); + viewAsFilter(player) { + return ( + !player.hasJudge("lebu") && + player.countCards("hes", function (card) { + return get.color(card) == "red" && get.type(card, "trick") != "trick"; + }) + ); }, - filterCard(card){ - return get.color(card)=='red'&&get.type(card,'trick')!='trick'; + filterCard(card) { + return get.color(card) == "red" && get.type(card, "trick") != "trick"; }, - check(card){ - return 7+(_status.event.dying||_status.event.player).getDamagedHp()-get.value(card); + check(card) { + return 7 + (_status.event.dying || _status.event.player).getDamagedHp() - get.value(card); }, - ignoreMod:true, - position:'hes', - precontent(){ - player.logSkill('misuzu_nongyin'); + ignoreMod: true, + position: "hes", + precontent() { + player.logSkill("misuzu_nongyin"); player.$throw(event.result.cards); - player.addJudge({name:'lebu'},event.result.cards); - event.result.card.cards=[]; - event.result.cards=[]; + player.addJudge({ name: "lebu" }, event.result.cards); + event.result.card.cards = []; + event.result.cards = []; delete event.result.skill; delete event.result.card.suit; delete event.result.card.number; }, - ai:{ - result:0.5, + ai: { + result: 0.5, }, }, - misuzu_zhongxing:{ - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + misuzu_zhongxing: { + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter(event,player){ - var evt=event.getl(player); - return evt&&evt.js&&evt.js.length>0&&!player.hasSkill('misuzu_zhongxing_haruko'); + filter(event, player) { + var evt = event.getl(player); + return evt && evt.js && evt.js.length > 0 && !player.hasSkill("misuzu_zhongxing_haruko"); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt('misuzu_zhongxing'),'令一名角色选择摸两张牌或回复1点体力').set('ai',function(card){ - return get.attitude(_status.event.player,card); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("misuzu_zhongxing"), "令一名角色选择摸两张牌或回复1点体力") + .set("ai", function (card) { + return get.attitude(_status.event.player, card); + }) + .forResult(); }, - async content(event, trigger, player){ - var target=event.targets[0]; - player.logSkill('misuzu_zhongxing',target); - player.addTempSkill('misuzu_zhongxing_haruko'); - target.chooseDrawRecover(2,true); + async content(event, trigger, player) { + var target = event.targets[0]; + player.logSkill("misuzu_zhongxing", target); + player.addTempSkill("misuzu_zhongxing_haruko"); + target.chooseDrawRecover(2, true); }, }, - misuzu_zhongxing_haruko:{charlotte:true}, - kamome_suitcase:{ - trigger:{player:['phaseJudgeBefore','phaseDiscardBefore','turnOverBefore']}, - forced:true, - popup:false, - equipSkill:true, - content(){ + misuzu_zhongxing_haruko: { charlotte: true }, + kamome_suitcase: { + trigger: { + player: ["phaseJudgeBefore", "phaseDiscardBefore", "turnOverBefore"], + }, + forced: true, + popup: false, + equipSkill: true, + content() { trigger.cancel(); }, }, - kamome_yangfan:{ - trigger:{ - player:['loseAfter','enterGame'], - global:['equipAfter','addJudgeAfter','phaseBefore','gainAfter','loseAsyncAfter','addToExpansionAfter'], + kamome_yangfan: { + trigger: { + player: ["loseAfter", "enterGame"], + global: [ + "equipAfter", + "addJudgeAfter", + "phaseBefore", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter(event,player){ - if(typeof event.getl!='function') return (event.name!='phase'||game.phaseNumber==0); - var evt=event.getl(player); - return evt&&evt.player==player&&evt.es&&evt.es.length; + forced: true, + filter(event, player) { + if (typeof event.getl != "function") + return event.name != "phase" || game.phaseNumber == 0; + var evt = event.getl(player); + return evt && evt.player == player && evt.es && evt.es.length; }, - content(){ - if(trigger.getl) player.draw(2*trigger.getl(player).es.length); - else player.equip(game.createCard2('kamome_suitcase','spade',1)); + content() { + if (trigger.getl) player.draw(2 * trigger.getl(player).es.length); + else player.equip(game.createCard2("kamome_suitcase", "spade", 1)); + }, + ai: { + noe: true, + reverseEquip: true, + effect: { + target(card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, }, - ai:{ - noe:true, - reverseEquip:true, - effect:{ - target(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; - } - } - } }, - kamome_huanmeng:{ - trigger:{player:'phaseZhunbeiBegin'}, - frequent:true, - content(){ - "step 0" - var num=1+player.countCards('e'); - var cards=get.cards(num); + kamome_huanmeng: { + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + content() { + "step 0"; + var num = 1 + player.countCards("e"); + var cards = get.cards(num); game.cardsGotoOrdering(cards); - var next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('prompt','幻梦:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=function(list){ - var cards=list[0][1],player=_status.event.player; - var top=[]; - var judges=player.getCards('j'); - var stopped=false; - if(!player.hasWuxie()){ - for(var i=0;i=num&&!player.hasSkill('kamome_jieban_phase'); + filter(event, player) { + var num = player.storage.kamome_jieban ? 1 : 2; + return player.countCards("he") >= num && !player.hasSkill("kamome_jieban_phase"); }, - async cost(event, trigger, player){ - event.num=player.storage.kamome_jieban?1:2; - event.result = await player.chooseCardTarget({ - position:'he', - filterCard:true, - filterTarget:lib.filter.notMe, - selectCard:event.num, - prompt:get.prompt('kamome_jieban'), - prompt2:event.num==2?'将两张牌交给一名其他角色,然后其交给你一张牌。':'将一张牌交给一名其他角色,然后其交给你两张牌。', - ai1(card){ - if(card.name=='du') return 20; - var val=get.value(card); - var player=_status.event.player; - if(get.position(card)=='e'){ - if(val<=0) return 10; - return 10/val; - } - return 6-val; - }, - ai2(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(ui.selected.cards[0].name=='du') return -2*att; - if(att>0) return 1.5*att; - var num=get.select(_status.event.selectCard)[1]; - if(att<0&&num==1) return -0.7*att; - return att; - }, - }).forResult(); - }, - content(){ - 'step 0' - event.num=player.storage.kamome_jieban?1:2; - var target=targets[0]; - event.target=target; - player.addTempSkill('kamome_jieban_phase'); - player.give(cards,target); - player.changeZhuanhuanji('kamome_jieban'); - 'step 1' - var num=3-event.num; - var hs=target.getCards('he'); - if(hs.length){ - if(hs.length<=num) event._result={bool:true,cards:hs}; - else{ - target.chooseCard('he',true,'交给'+get.translation(player)+get.cnNumber(num)+'张牌',num).set('ai',function(card){ - var player=_status.event.player; - var target=_status.event.getParent().player; - if(get.attitude(player,target)>0){ - if(!target.hasShan()&&card.name=='shan') return 10; - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')&&target.hasUseTarget(card)) return 10-get.value(card); - return 6-get.value(card); + async cost(event, trigger, player) { + event.num = player.storage.kamome_jieban ? 1 : 2; + event.result = await player + .chooseCardTarget({ + position: "he", + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: event.num, + prompt: get.prompt("kamome_jieban"), + prompt2: + event.num == 2 + ? "将两张牌交给一名其他角色,然后其交给你一张牌。" + : "将一张牌交给一名其他角色,然后其交给你两张牌。", + ai1(card) { + if (card.name == "du") return 20; + var val = get.value(card); + var player = _status.event.player; + if (get.position(card) == "e") { + if (val <= 0) return 10; + return 10 / val; } - return -get.value(card); - }); + return 6 - val; + }, + ai2(target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -2 * att; + if (att > 0) return 1.5 * att; + var num = get.select(_status.event.selectCard)[1]; + if (att < 0 && num == 1) return -0.7 * att; + return att; + }, + }) + .forResult(); + }, + content() { + "step 0"; + event.num = player.storage.kamome_jieban ? 1 : 2; + var target = targets[0]; + event.target = target; + player.addTempSkill("kamome_jieban_phase"); + player.give(cards, target); + player.changeZhuanhuanji("kamome_jieban"); + ("step 1"); + var num = 3 - event.num; + var hs = target.getCards("he"); + if (hs.length) { + if (hs.length <= num) event._result = { bool: true, cards: hs }; + else { + target + .chooseCard( + "he", + true, + "交给" + get.translation(player) + get.cnNumber(num) + "张牌", + num + ) + .set("ai", function (card) { + var player = _status.event.player; + var target = _status.event.getParent().player; + if (get.attitude(player, target) > 0) { + if (!target.hasShan() && card.name == "shan") return 10; + if ( + get.type(card) == "equip" && + !get.cardtag(card, "gifts") && + target.hasUseTarget(card) + ) + return 10 - get.value(card); + return 6 - get.value(card); + } + return -get.value(card); + }); } - } - else event.finish(); - 'step 2' - target.give(result.cards,player); + } else event.finish(); + ("step 2"); + target.give(result.cards, player); }, }, - kamome_jieban_phase:{charlotte:true}, - nao_duyin:{ - trigger:{global:'phaseBegin'}, - filter(event,player){ - return event.player!=player&&(!player.storage.nao_duyin||!player.storage.nao_duyin.includes(event.player)); + kamome_jieban_phase: { charlotte: true }, + nao_duyin: { + trigger: { global: "phaseBegin" }, + filter(event, player) { + return ( + event.player != player && + (!player.storage.nao_duyin || !player.storage.nao_duyin.includes(event.player)) + ); }, - logTarget:'player', - charlotte:true, - check(){ + logTarget: "player", + charlotte: true, + check() { return false; }, - content(){ - 'step 0' - player.chooseToDiscard('he','弃置一张牌,或将武将牌翻面').set('ai',function(card){ - if(_status.event.player.isTurnedOver()) return 0; - return 6-get.value(card); + content() { + "step 0"; + player.chooseToDiscard("he", "弃置一张牌,或将武将牌翻面").set("ai", function (card) { + if (_status.event.player.isTurnedOver()) return 0; + return 6 - get.value(card); }); - 'step 1' - if(!result.bool) player.turnOver(); - player.addTempSkill('nao_duyin2',{player:'phaseAfter'}); - if(!player.storage.nao_duyin) player.storage.nao_duyin=[]; + ("step 1"); + if (!result.bool) player.turnOver(); + player.addTempSkill("nao_duyin2", { player: "phaseAfter" }); + if (!player.storage.nao_duyin) player.storage.nao_duyin = []; player.storage.nao_duyin.push(trigger.player); - if(!player.storage.nao_duyin2) player.storage.nao_duyin2=[]; + if (!player.storage.nao_duyin2) player.storage.nao_duyin2 = []; player.storage.nao_duyin2.push(trigger.player); - player.markSkill('nao_duyin2'); + player.markSkill("nao_duyin2"); }, }, - nao_duyin2:{ - intro:{ - content:'$不能使用牌指定你为目标,对$使用牌没有距离和次数限制', + nao_duyin2: { + intro: { + content: "$不能使用牌指定你为目标,对$使用牌没有距离和次数限制", }, - mod:{ - targetEnabled(card,player,target){ - if(target.storage.nao_duyin2&&target.storage.nao_duyin2.includes(player)) return false; + mod: { + targetEnabled(card, player, target) { + if (target.storage.nao_duyin2 && target.storage.nao_duyin2.includes(player)) + return false; }, - targetInRange(card,player,target){ - if(player.storage.nao_duyin2&&player.storage.nao_duyin2.includes(target)) return true; + targetInRange(card, player, target) { + if (player.storage.nao_duyin2 && player.storage.nao_duyin2.includes(target)) + return true; }, }, - trigger:{player:'useCardEnd'}, - firstDo:true, - silent:true, - onremove:true, - filter(event,player){ - if(player.storage.nao_duyin2){ - for(var i of player.storage.nao_duyin2){ - if(event.targets.includes(i)) return true; + trigger: { player: "useCardEnd" }, + firstDo: true, + silent: true, + onremove: true, + filter(event, player) { + if (player.storage.nao_duyin2) { + for (var i of player.storage.nao_duyin2) { + if (event.targets.includes(i)) return true; } } return false; }, - content(){ - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat(); - if(stat&&stat.card&&stat.card[trigger.card.name]) stat.card[trigger.card.name]--; + content() { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat(); + if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--; } }, }, - nao_wanxin:{ - trigger:{global:'phaseEnd'}, - hasHistory(player){ - return player.getHistory('damage').length>0; + nao_wanxin: { + trigger: { global: "phaseEnd" }, + hasHistory(player) { + return player.getHistory("damage").length > 0; }, - filter(event,player){ - return game.hasPlayer(function(current){ + filter(event, player) { + return game.hasPlayer(function (current) { return lib.skill.nao_wanxin.hasHistory(current); }); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt2('nao_wanxin'),function(card,player,target){ - return _status.event.yuus.includes(target); - }).set('yuus',game.filterPlayer(function(current){ - return lib.skill.nao_wanxin.hasHistory(current); - })).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("nao_wanxin"), function (card, player, target) { + return _status.event.yuus.includes(target); + }) + .set( + "yuus", + game.filterPlayer(function (current) { + return lib.skill.nao_wanxin.hasHistory(current); + }) + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); }, - async content(event, trigger, player){ - const target=event.targets[0]; + async content(event, trigger, player) { + const target = event.targets[0]; await target.draw(2); await player.turnOver(false); await player.link(false); - if(target==player) return; + if (target == player) return; await target.turnOver(false); await target.link(false); }, }, - nao_shouqing:{ - global:'nao_shouqing2', + nao_shouqing: { + global: "nao_shouqing2", }, - nao_shouqing2:{ - enable:'phaseUse', - viewAs(){ - return {name:'tao'} + nao_shouqing2: { + enable: "phaseUse", + viewAs() { + return { name: "tao" }; }, - filterCard:{name:'tao'}, - ignoreMod:true, - filterTarget(card,player,target){ - return target!=player&&target.isDamaged()&&target.hasSkill('nao_shouqing'); + filterCard: { name: "tao" }, + ignoreMod: true, + filterTarget(card, player, target) { + return target != player && target.isDamaged() && target.hasSkill("nao_shouqing"); }, - selectTarget(){ - return game.countPlayer(function(current){ - return lib.skill.nao_shouqing2.filterTarget(null,_status.event.player,current); - })>1?1:-1; + selectTarget() { + return game.countPlayer(function (current) { + return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current); + }) > 1 + ? 1 + : -1; }, - filter(event,player){ - return player.countCards('hs','tao')&&game.hasPlayer(function(current){ - return lib.skill.nao_shouqing2.filterTarget(null,player,current) + filter(event, player) { + return ( + player.countCards("hs", "tao") && + game.hasPlayer(function (current) { + return lib.skill.nao_shouqing2.filterTarget(null, player, current); + }) + ); + }, + position: "hs", + onuse(links, player) { + player.addSkill("nao_shouqing3"); + player.addMark("nao_shouqing3", 1, false); + }, + prompt() { + var list = game.filterPlayer(function (current) { + return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current); }); - }, - position:'hs', - onuse(links,player){ - player.addSkill('nao_shouqing3'); - player.addMark('nao_shouqing3',1,false); - }, - prompt(){ - var list=game.filterPlayer(function(current){ - return lib.skill.nao_shouqing2.filterTarget(null,_status.event.player,current); - }); - var str='对'+get.translation(list); - if(list.length>1) str+='中的一名角色'; - str+='使用一张【桃】'; + var str = "对" + get.translation(list); + if (list.length > 1) str += "中的一名角色"; + str += "使用一张【桃】"; return str; }, }, - nao_shouqing3:{ - intro:{ - content:'手牌上限+#', + nao_shouqing3: { + intro: { + content: "手牌上限+#", }, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('nao_shouqing3'); + mod: { + maxHandcard(player, num) { + return num + player.countMark("nao_shouqing3"); }, }, - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - filter(event,player){ - return event.skill=='nao_shouqing2'; + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "nao_shouqing2"; }, - content(){ + content() { player.draw(); }, }, - shiorimiyuki_banyin:{ - audio:2, - trigger:{player:['damageEnd','recoverEnd']}, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.isDamaged(); - }) + shiorimiyuki_banyin: { + audio: 2, + trigger: { player: ["damageEnd", "recoverEnd"] }, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.isDamaged(); + }); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt('shiorimiyuki_banyin'),'令一名其他角色回复1点体力',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return get.recoverEffect(target,player,player); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("shiorimiyuki_banyin"), + "令一名其他角色回复1点体力", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }) + .forResult(); }, - async content(event, trigger, player){ - const target=event.targets[0]; + async content(event, trigger, player) { + const target = event.targets[0]; target.recover(); }, }, - shiorimiyuki_tingxian:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - async cost(event, trigger, player){ - const {control, index} = await player.chooseControl('一张','两张','三张','cancel2').set('prompt',get.prompt2('shiorimiyuki_tingxian')).set('ai',function(){ - var player=_status.event.player; - var max=Math.min(player.hp+1,player.maxHp) - var min=Math.min(Math.max(max-2,max-player.hp),3); - if(min) return min-1; - return 3; - }).forResult(); - if (control != 'cancel2') event.result = {bool:true, cost_data:index}; + shiorimiyuki_tingxian: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + async cost(event, trigger, player) { + const { control, index } = await player + .chooseControl("一张", "两张", "三张", "cancel2") + .set("prompt", get.prompt2("shiorimiyuki_tingxian")) + .set("ai", function () { + var player = _status.event.player; + var max = Math.min(player.hp + 1, player.maxHp); + var min = Math.min(Math.max(max - 2, max - player.hp), 3); + if (min) return min - 1; + return 3; + }) + .forResult(); + if (control != "cancel2") event.result = { bool: true, cost_data: index }; }, - async content(event, trigger, player){ + async content(event, trigger, player) { let num = 1 + event.cost_data; - await player.draw(num).set('gaintag', ['shiorimiyuki_tingxian']); + await player.draw(num).set("gaintag", ["shiorimiyuki_tingxian"]); await player.recover(); - player.addTempSkill('shiorimiyuki_tingxian2'); + player.addTempSkill("shiorimiyuki_tingxian2"); }, - group:'shiorimiyuki_tingxian1', + group: "shiorimiyuki_tingxian1", }, - shiorimiyuki_tingxian1:{audio:true}, - shiorimiyuki_tingxian2:{ - audio:true, - trigger:{player:'phaseUseEnd'}, - forced:true, - charlotte:true, - mod:{ - aiOrder(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('shiorimiyuki_tingxian')) return num+2; + shiorimiyuki_tingxian1: { audio: true }, + shiorimiyuki_tingxian2: { + audio: true, + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + mod: { + aiOrder(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) + return num + 2; }, - aiValue(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('shiorimiyuki_tingxian')) return 0; + aiValue(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("shiorimiyuki_tingxian")) + return 0; }, }, - filter(event,player){ - return player.countCards('h',function(card){ - return card.hasGaintag('shiorimiyuki_tingxian'); - })>0; + filter(event, player) { + return ( + player.countCards("h", function (card) { + return card.hasGaintag("shiorimiyuki_tingxian"); + }) > 0 + ); }, - content(){ - player.loseHp(player.countCards('h',function(card){ - return card.hasGaintag('shiorimiyuki_tingxian'); - })); - player.removeGaintag('shiorimiyuki_tingxian'); + content() { + player.loseHp( + player.countCards("h", function (card) { + return card.hasGaintag("shiorimiyuki_tingxian"); + }) + ); + player.removeGaintag("shiorimiyuki_tingxian"); }, }, - shizuru_nianli:{ - enable:'chooseToUse', - charlotte:true, - prompt:'展示一张♦/♣/♥/♠手牌,然后视为使用一张雷杀/闪/桃/无懈可击', - viewAs(cards,player){ - var name=false; - var nature=null; - switch(get.suit(cards[0],player)){ - case 'club':name='shan';break; - case 'diamond':name='sha';nature='thunder';break; - case 'spade':name='wuxie';break; - case 'heart':name='tao';break; + shizuru_nianli: { + enable: "chooseToUse", + charlotte: true, + prompt: "展示一张♦/♣/♥/♠手牌,然后视为使用一张雷杀/闪/桃/无懈可击", + viewAs(cards, player) { + var name = false; + var nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "thunder"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; } - if(name) return {name:name,nature:nature,isCard:true}; + if (name) return { name: name, nature: nature, isCard: true }; return null; }, - check(card){ - var player=_status.event.player; - if(_status.event.type=='phase'){ - var max=0; + check(card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; var name2; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max){ - max=temp; - name2=map[name]; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("h", function (card) { + return get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) { + max = temp; + name2 = map[name]; } } } - if(name2==get.suit(card,player)) return 1; + if (name2 == get.suit(card, player)) return 1; return 0; } return 1; }, - ignoreMod:true, - filterCard(card,player,event){ - event=event||_status.event; - var filter=event._backup.filterCard; - var name=get.suit(card,player); - if(name=='club'&&filter({name:'shan'},player,event)) return true; - if(name=='diamond'&&filter({name:'sha',nature:'thunder'},player,event)) return true; - if(name=='spade'&&filter({name:'wuxie'},player,event)) return true; - if(name=='heart'&&filter({name:'tao'},player,event)) return true; + ignoreMod: true, + filterCard(card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan" }, player, event)) return true; + if (name == "diamond" && filter({ name: "sha", nature: "thunder" }, player, event)) + return true; + if (name == "spade" && filter({ name: "wuxie" }, player, event)) return true; + if (name == "heart" && filter({ name: "tao" }, player, event)) return true; return false; }, - filter(event,player){ - if(player.hasSkill('shizuru_nianli_round')) return false; - var filter=event.filterCard; - if(filter({name:'sha',nature:'thunder'},player,event)&&player.countCards('h',{suit:'diamond'})) return true; - if(filter({name:'shan'},player,event)&&player.countCards('h',{suit:'club'})) return true; - if(filter({name:'tao'},player,event)&&player.countCards('h',{suit:'heart'})) return true; - if(filter({name:'wuxie'},player,event)&&player.countCards('h',{suit:'spade'})) return true; + filter(event, player) { + if (player.hasSkill("shizuru_nianli_round")) return false; + var filter = event.filterCard; + if ( + filter({ name: "sha", nature: "thunder" }, player, event) && + player.countCards("h", { suit: "diamond" }) + ) + return true; + if (filter({ name: "shan" }, player, event) && player.countCards("h", { suit: "club" })) + return true; + if (filter({ name: "tao" }, player, event) && player.countCards("h", { suit: "heart" })) + return true; + if (filter({ name: "wuxie" }, player, event) && player.countCards("h", { suit: "spade" })) + return true; return false; }, - precontent(){ - player.logSkill('shizuru_nianli'); - player.addTempSkill('shizuru_nianli_round','roundStart'); - player.showCards(get.translation(player)+'发动了【念力】',event.result.cards.slice(0)); - event.result.card.cards=[]; - event.result.cards=[]; + precontent() { + player.logSkill("shizuru_nianli"); + player.addTempSkill("shizuru_nianli_round", "roundStart"); + player.showCards(get.translation(player) + "发动了【念力】", event.result.cards.slice(0)); + event.result.card.cards = []; + event.result.cards = []; delete event.result.skill; delete event.result.card.suit; delete event.result.card.number; - event.getParent().addCount=false; - event.getParent().shizuru_nianli=true; + event.getParent().addCount = false; + event.getParent().shizuru_nianli = true; }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player,tag){ - if(player.hasSkill('shizuru_nianli_round')) return false; + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + if (player.hasSkill("shizuru_nianli_round")) return false; var name; - switch(tag){ - case 'respondSha':name='diamond';break; - case 'respondShan':name='club';break; - case 'save':name='heart';break; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; } - if(!player.countCards('h',{suit:name})) return false; + if (!player.countCards("h", { suit: name })) return false; }, - order(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'thunder':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'thunder':null}); - if(temp>max) max=temp; + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("h", function (card) { + return get.suit(card, player) == map[name]; + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "thunder" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "thunder" : null, + }); + if (temp > max) max = temp; } } - max/=1.1; + max /= 1.1; return max; } return 2; }, }, - hiddenCard(player,name){ - if(name=='wuxie') return player.countCards('h',function(card){ - return _status.connectMode||get.suit(card)=='spade'; - })>0&&!player.hasSkill('shizuru_nianli_round'); - if(name=='tao') return player.countCards('h',{suit:'heart'})>0&&!player.hasSkill('shizuru_nianli_round'); + hiddenCard(player, name) { + if (name == "wuxie") + return ( + player.countCards("h", function (card) { + return _status.connectMode || get.suit(card) == "spade"; + }) > 0 && !player.hasSkill("shizuru_nianli_round") + ); + if (name == "tao") + return ( + player.countCards("h", { suit: "heart" }) > 0 && + !player.hasSkill("shizuru_nianli_round") + ); return false; }, - group:'shizuru_nianli_clear', - subSkill:{ - round:{ - mark:true, - intro:{content:'本轮已发动'}, + group: "shizuru_nianli_clear", + subSkill: { + round: { + mark: true, + intro: { content: "本轮已发动" }, }, - clear:{ - trigger:{player:'useCardAfter'}, - lastDo:true, - silent:true, - filter(event,player){ - return event.getParent().shizuru_nianli==true; + clear: { + trigger: { player: "useCardAfter" }, + lastDo: true, + silent: true, + filter(event, player) { + return event.getParent().shizuru_nianli == true; }, - content(){ - player.getHistory('useCard').remove(trigger); + content() { + player.getHistory("useCard").remove(trigger); }, }, }, }, - shizuru_benzhan:{ - trigger:{global:['useCard','respond']}, - usable:1, - filter(event,player){ - return Array.isArray(event.respondTo)&&event.respondTo[0]!=event.player&&[event.respondTo[0],event.player].includes(player); + shizuru_benzhan: { + trigger: { global: ["useCard", "respond"] }, + usable: 1, + filter(event, player) { + return ( + Array.isArray(event.respondTo) && + event.respondTo[0] != event.player && + [event.respondTo[0], event.player].includes(player) + ); }, - async cost(event, trigger, player){ - event.type=get.type(trigger.card)=='basic'; - var prompt=event.type?'令一名角色摸两张牌或弃置两张牌':'令一名角色回复1点体力或对其造成1点伤害'; - event.result = await player.chooseTarget(get.prompt('shizuru_benzhan'),prompt).set('ai',function(target){ - var player=_status.event.player; - if(_status.event.getParent().type){ - var att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) return -att; - if(target.countCards('he')==1&&att<0) att/=2; - return Math.abs(att)*(1+0.1*(Math.min(0,5-target.countCards('h')))) - } - return Math.max(get.recoverEffect(target,player,player),get.damageEffect(target,player,player)) - }).forResult(); + async cost(event, trigger, player) { + event.type = get.type(trigger.card) == "basic"; + var prompt = event.type + ? "令一名角色摸两张牌或弃置两张牌" + : "令一名角色回复1点体力或对其造成1点伤害"; + event.result = await player + .chooseTarget(get.prompt("shizuru_benzhan"), prompt) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.getParent().type) { + var att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) return -att; + if (target.countCards("he") == 1 && att < 0) att /= 2; + return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); + } + return Math.max( + get.recoverEffect(target, player, player), + get.damageEffect(target, player, player) + ); + }) + .forResult(); }, - content(){ - 'step 0' - event.type=get.type(trigger.card)=='basic'; - var target=event.targets[0]; - event.target=target; - var trans=get.translation(target); + content() { + "step 0"; + event.type = get.type(trigger.card) == "basic"; + var target = event.targets[0]; + event.target = target; + var trans = get.translation(target); var list; - if(event.type){ - if(!target.countCards('he')) event._result={index:0}; - else list=['令'+trans+'摸两张牌','令'+trans+'弃置两张牌']; + if (event.type) { + if (!target.countCards("he")) event._result = { index: 0 }; + else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; + } else { + if (target.isHealthy()) event._result = { index: 1 }; + else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; } - else{ - if(target.isHealthy()) event._result={index:1}; - else list=['令'+trans+'回复1点体力','对'+trans+'造成1点伤害']; - } - player.chooseControl().set('choiceList',list).set('choice',function(){ - if(event.type) return (get.attitude(player,target)>0)?0:1; - return (get.recoverEffect(target,player,player)>get.damageEffect(target,player,player))?0:1; - }()).set('ai',function(){ - return _status.event.choice; - }); - 'step 1' + player + .chooseControl() + .set("choiceList", list) + .set( + "choice", + (function () { + if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; + return get.recoverEffect(target, player, player) > + get.damageEffect(target, player, player) + ? 0 + : 1; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); + ("step 1"); player.addExpose(0.2); - if(event.type){ - if(result.index==0) target.draw(2); - else target.chooseToDiscard(2,'he',true); - } - else{ - if(result.index==0) target.recover(); + if (event.type) { + if (result.index == 0) target.draw(2); + else target.chooseToDiscard(2, "he", true); + } else { + if (result.index == 0) target.recover(); else target.damage(); } }, }, - kyoko_juwu:{ - trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, - filter(event,player){ - if(player==_status.currentPhase) return false; - var cards=event.getd(); - if(!cards.length) return false; + kyoko_juwu: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + filter(event, player) { + if (player == _status.currentPhase) return false; + var cards = event.getd(); + if (!cards.length) return false; cards.removeArray(event.getd(player)); - for(var card of cards){ - if(get.position(card,true)=='d'&&get.type(card,null,false)=='equip') return true; + for (var card of cards) { + if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") + return true; } return false; }, - autodelay(event,player){ + autodelay(event, player) { return event.delay === false; }, - async cost(event, trigger, player){ - var cards=trigger.getd(); + async cost(event, trigger, player) { + var cards = trigger.getd(); cards.removeArray(trigger.getd(player)); - cards=cards.filter(function(card){ - if(get.position(card,true)=='d'&&get.type(card,null,false)=='equip') return true; + cards = cards.filter(function (card) { + if (get.position(card, true) == "d" && get.type(card, null, false) == "equip") + return true; }); - const {result} = await player.chooseButton([get.prompt('kyoko_juwu'),cards],[1,cards.length]).set('ai',function(){return 1}); - if(result.bool) event.result = { - bool: true, - cards: result.links - } + const { result } = await player + .chooseButton([get.prompt("kyoko_juwu"), cards], [1, cards.length]) + .set("ai", function () { + return 1; + }); + if (result.bool) + event.result = { + bool: true, + cards: result.links, + }; }, - async content(event, trigger, player){ - await player.gain(event.cards, 'gain2', 'log'); + async content(event, trigger, player) { + await player.gain(event.cards, "gain2", "log"); }, }, - kyoko_zhengyi:{ - group:['kyoko_jingce','kyoko_shelie','kyoko_zhiheng'], - count(player){ - var list=[]; - player.countCards('e',function(card){ - list.add(get.suit(card,player)); + kyoko_zhengyi: { + group: ["kyoko_jingce", "kyoko_shelie", "kyoko_zhiheng"], + count(player) { + var list = []; + player.countCards("e", function (card) { + list.add(get.suit(card, player)); }); return list.length; }, }, - kyoko_jingce:{ - trigger:{player:['phaseUseEnd','phaseJieshuBegin']}, - filter(event,player){ - var num=lib.skill.kyoko_zhengyi.count(player); - if(!num||(event.name=='phaseUse')==(num>3)) return false; - return player.getHistory('useCard',function(evt){ - return event.name!='phaseUse'||evt.getParent('phaseUse')==event; - }).length>=player.hp; + kyoko_jingce: { + trigger: { player: ["phaseUseEnd", "phaseJieshuBegin"] }, + filter(event, player) { + var num = lib.skill.kyoko_zhengyi.count(player); + if (!num || (event.name == "phaseUse") == num > 3) return false; + return ( + player.getHistory("useCard", function (evt) { + return event.name != "phaseUse" || evt.getParent("phaseUse") == event; + }).length >= player.hp + ); }, - frequent:true, - content(){ - 'step 0' - if(trigger.name=='phaseUse'){ + frequent: true, + content() { + "step 0"; + if (trigger.name == "phaseUse") { player.draw(2); event.finish(); return; } - var list=[],history=player.getHistory('useCard'); - for(var i of history){ + var list = [], + history = player.getHistory("useCard"); + for (var i of history) { list.add(get.suit(i.card)); - if(list.length>=player.hp) break; + if (list.length >= player.hp) break; } - if(list.length>=player.hp) event.goon=true; - else player.chooseControl('摸牌阶段','出牌阶段').set('prompt','精策:选择要执行的额外阶段'); - 'step 1' - if(event.goon||result.index==0){ - var next=player.phaseDraw(); + if (list.length >= player.hp) event.goon = true; + else + player + .chooseControl("摸牌阶段", "出牌阶段") + .set("prompt", "精策:选择要执行的额外阶段"); + ("step 1"); + if (event.goon || result.index == 0) { + var next = player.phaseDraw(); event.next.remove(next); trigger.getParent().next.push(next); } - if(event.goon||result.index==1){ - var next=player.phaseUse(); + if (event.goon || result.index == 1) { + var next = player.phaseUse(); event.next.remove(next); trigger.getParent().next.push(next); } }, }, - kyoko_shelie:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter(event,player){ - return !event.numFixed&&lib.skill.kyoko_zhengyi.count(player)>1; + kyoko_shelie: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter(event, player) { + return !event.numFixed && lib.skill.kyoko_zhengyi.count(player) > 1; }, - content(){ - "step 0" + content() { + "step 0"; trigger.changeToZero(); - event.cards=get.cards(5); + event.cards = get.cards(5); game.cardsGotoOrdering(event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - var str; - if(player==game.me&&!_status.auto){ - str='涉猎:获取花色各不相同的牌'; - } - else{ - str='涉猎'; - } - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - event.time=get.utc(); - game.addVideo('showCards',player,['涉猎',get.cardsInfo(event.cards)]); - game.addVideo('delay',null,2); - "step 1" - var next=player.chooseButton([0,5],true); - next.set('dialog',event.videoId); - next.set('filterButton',function(button){ - for(var i=0;i0){ - game.delay(0,time); + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); } - "step 3" - game.broadcastAll('closeDialog',event.videoId); - var cards2=event.cards2; - player.gain(cards2,'log','gain2'); + ("step 3"); + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + player.gain(cards2, "log", "gain2"); }, }, - kyoko_zhiheng:{ - enable:'phaseUse', - usable:1, - position:'he', - filter(event,player){ - return lib.skill.kyoko_zhengyi.count(player)>2; + kyoko_zhiheng: { + enable: "phaseUse", + usable: 1, + position: "he", + filter(event, player) { + return lib.skill.kyoko_zhengyi.count(player) > 2; }, - prompt(){ - var str='弃置任意张牌并摸等量的牌'; - if(lib.skill.kyoko_zhengyi.count(_status.event.player)>3) str+=',若弃置了所有手牌则多摸一张牌。'; + prompt() { + var str = "弃置任意张牌并摸等量的牌"; + if (lib.skill.kyoko_zhengyi.count(_status.event.player) > 3) + str += ",若弃置了所有手牌则多摸一张牌。"; return str; }, - filterCard:lib.filter.cardDiscardable, - discard:false, - lose:false, - delay:false, - selectCard:[1,Infinity], - check(card){ - var player=_status.event.player; - if(get.position(card)=='h'){ - return 8-get.value(card); + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + check(card) { + var player = _status.event.player; + if (get.position(card) == "h") { + return 8 - get.value(card); } - return 6-get.value(card) + return 6 - get.value(card); }, - content(){ - 'step 0' + content() { + "step 0"; player.discard(cards); - event.num=1; - var hs=player.getCards('h'); - if(!hs.length||lib.skill.kyoko_zhengyi.count(player)<4) event.num=0; - else for(var i=0;i1; + check(event, player) { + return player.hp <= 1 || player.getDamagedHp() > 1; }, - content(){ + content() { player.awakenSkill(event.name); - var num=player.maxHp-player.hp; + var num = player.maxHp - player.hp; player.recover(num); player.draw(num); - if(_status.characterlist&&_status.characterlist.includes('key_midori')){ - player.reinitCharacter('key_mio','key_midori', false); + if (_status.characterlist && _status.characterlist.includes("key_midori")) { + player.reinitCharacter("key_mio", "key_midori", false); } }, }, - midori_nonghuan:{ - enable:'phaseUse', - charlotte:true, - filter(event,player){ - return (player.getStat('skill').midori_nonghuan||0)0; + filterTarget(card, player, target) { + var stat = player.getStat("midori_nonghuan"); + return ( + target != player && + (!stat || !stat.includes(target)) && + target.countGainableCards(player, "hej") > 0 + ); }, - content(){ - 'step 0' - var stat=player.getStat(); - if(!stat.midori_nonghuan) stat.midori_nonghuan=[]; + content() { + "step 0"; + var stat = player.getStat(); + if (!stat.midori_nonghuan) stat.midori_nonghuan = []; stat.midori_nonghuan.push(target); - player.gainPlayerCard(target,'hej',true); + player.gainPlayerCard(target, "hej", true); player.draw(); - 'step 1' - if(player.countCards('he')>0) player.chooseCard('he',true,'交给'+get.translation(target)+'一张牌'); + ("step 1"); + if (player.countCards("he") > 0) + player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); else event.goto(3); - 'step 2' - player.give(result.cards,target); - 'step 3' - var history=game.getGlobalHistory('cardMove'); - for(var i=0;i1; + check(event, player) { + return player.hp <= 1 || player.getDamagedHp() > 1; }, - content(){ + content() { player.awakenSkill(event.name); - var num=player.maxHp-player.hp; + var num = player.maxHp - player.hp; player.recover(num); player.draw(num); - if(_status.characterlist&&_status.characterlist.includes('key_mio')){ - player.reinitCharacter('key_midori', 'key_mio', false); + if (_status.characterlist && _status.characterlist.includes("key_mio")) { + player.reinitCharacter("key_midori", "key_mio", false); } }, }, - kanade_mapo:{ - audio:2, - derivation:'mapodoufu', - enable:'chooseToUse', - viewAs:{name:'mapodoufu'}, - filterCard:{suit:'heart'}, - viewAsFilter(player){ - return player.countCards('hes',{suit:'heart'})>0; + kanade_mapo: { + audio: 2, + derivation: "mapodoufu", + enable: "chooseToUse", + viewAs: { name: "mapodoufu" }, + filterCard: { suit: "heart" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "heart" }) > 0; }, - position:'hes', - mod:{ - selectTarget(card,player,range){ - if(card.name=='mapodoufu'&&range[1]!=-1) range[1]++; + position: "hes", + mod: { + selectTarget(card, player, range) { + if (card.name == "mapodoufu" && range[1] != -1) range[1]++; }, }, - check(card){ - var player=_status.event.player; - if(game.countPlayer(function(current){ - return player.canUse('mapodoufu',current)&&get.effect(current,{name:'mapodoufu'},player,player)>0; - })>1) return 6-get.value(card); - return 4-get.value(card); + check(card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return ( + player.canUse("mapodoufu", current) && + get.effect(current, { name: "mapodoufu" }, player, player) > 0 + ); + }) > 1 + ) + return 6 - get.value(card); + return 4 - get.value(card); }, }, - kanade_benzhan:{ - audio:3, - trigger:{global:['useCard','respond']}, - usable:1, - filter(event,player){ - return Array.isArray(event.respondTo)&&event.respondTo[0]!=event.player&&[event.respondTo[0],event.player].includes(player); + kanade_benzhan: { + audio: 3, + trigger: { global: ["useCard", "respond"] }, + usable: 1, + filter(event, player) { + return ( + Array.isArray(event.respondTo) && + event.respondTo[0] != event.player && + [event.respondTo[0], event.player].includes(player) + ); }, - async cost(event, trigger, player){ - event.type=get.type(trigger.card)=='basic'; - var prompt=event.type?'令一名角色摸两张牌或弃置两张牌':'令一名角色回复1点体力或对其造成1点伤害'; - event.result = await player.chooseTarget(get.prompt('kanade_benzhan'),prompt).set('ai',function(target){ - var player=_status.event.player; - if(_status.event.getParent().type){ - var att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) return -att; - if(target.countCards('he')==1&&att<0) att/=2; - return Math.abs(att)*(1+0.1*(Math.min(0,5-target.countCards('h')))) - } - return Math.max(get.recoverEffect(target,player,player),get.damageEffect(target,player,player)) - }).forResult(); + async cost(event, trigger, player) { + event.type = get.type(trigger.card) == "basic"; + var prompt = event.type + ? "令一名角色摸两张牌或弃置两张牌" + : "令一名角色回复1点体力或对其造成1点伤害"; + event.result = await player + .chooseTarget(get.prompt("kanade_benzhan"), prompt) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.getParent().type) { + var att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) return -att; + if (target.countCards("he") == 1 && att < 0) att /= 2; + return Math.abs(att) * (1 + 0.1 * Math.min(0, 5 - target.countCards("h"))); + } + return Math.max( + get.recoverEffect(target, player, player), + get.damageEffect(target, player, player) + ); + }) + .forResult(); }, - content(){ - 'step 0' - event.type=get.type(trigger.card)=='basic'; - var target=event.targets[0]; - event.target=target; - var trans=get.translation(target); + content() { + "step 0"; + event.type = get.type(trigger.card) == "basic"; + var target = event.targets[0]; + event.target = target; + var trans = get.translation(target); var list; - if(event.type){ - if(!target.countCards('he')) event._result={index:0}; - else list=['令'+trans+'摸两张牌','令'+trans+'弃置两张牌']; + if (event.type) { + if (!target.countCards("he")) event._result = { index: 0 }; + else list = ["令" + trans + "摸两张牌", "令" + trans + "弃置两张牌"]; + } else { + if (target.isHealthy()) event._result = { index: 1 }; + else list = ["令" + trans + "回复1点体力", "对" + trans + "造成1点伤害"]; } - else{ - if(target.isHealthy()) event._result={index:1}; - else list=['令'+trans+'回复1点体力','对'+trans+'造成1点伤害']; - } - player.chooseControl().set('choiceList',list).set('choice',function(){ - if(event.type) return (get.attitude(player,target)>0)?0:1; - return (get.recoverEffect(target,player,player)>get.damageEffect(target,player,player))?0:1; - }()).set('ai',function(){ - return _status.event.choice; - }); - 'step 1' + player + .chooseControl() + .set("choiceList", list) + .set( + "choice", + (function () { + if (event.type) return get.attitude(player, target) > 0 ? 0 : 1; + return get.recoverEffect(target, player, player) > + get.damageEffect(target, player, player) + ? 0 + : 1; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); + ("step 1"); player.addExpose(0.2); - if(event.type){ - if(result.index==0) target.draw(2); - else target.chooseToDiscard(2,'he',true); - } - else{ - if(result.index==0) target.recover(); + if (event.type) { + if (result.index == 0) target.draw(2); + else target.chooseToDiscard(2, "he", true); + } else { + if (result.index == 0) target.recover(); else target.damage(); } }, }, - yuzuru_wuxin:{ - trigger:{player:'phaseJieshuBegin'}, - async cost(event, trigger, player){ - event.result = await player.chooseCardTarget({ - filterTarget(){ - if(ui.selected.cards.length) return false; - return true; - }, - filterCard(){ - if(ui.selected.targets.length) return false; - return lib.filter.cardDiscardable.apply(this,arguments); - }, - selectTarget(){ - if(!ui.selected.cards.length) return [1,1]; - return [0,0]; - }, - selectCard(){ - if(ui.selected.targets.length) return [0,0]; - if(!ui.selected.cards.length) return [0,2]; - return [2,2]; - }, - prompt:get.prompt2('yuzuru_wuxin'), - complexCard:true, - complexTarget:true, - ai1(card){ - var player=_status.event.player; - if(player.hp>3) return 0; - return (player.getDamagedHp()*2)-get.value(card); - }, - ai2(target){ - if(player.hp<4||target.hasSkillTag('nogain')) return 0; - return get.attitude(_status.event.player,target); - }, - }).forResult(); + yuzuru_wuxin: { + trigger: { player: "phaseJieshuBegin" }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + filterTarget() { + if (ui.selected.cards.length) return false; + return true; + }, + filterCard() { + if (ui.selected.targets.length) return false; + return lib.filter.cardDiscardable.apply(this, arguments); + }, + selectTarget() { + if (!ui.selected.cards.length) return [1, 1]; + return [0, 0]; + }, + selectCard() { + if (ui.selected.targets.length) return [0, 0]; + if (!ui.selected.cards.length) return [0, 2]; + return [2, 2]; + }, + prompt: get.prompt2("yuzuru_wuxin"), + complexCard: true, + complexTarget: true, + ai1(card) { + var player = _status.event.player; + if (player.hp > 3) return 0; + return player.getDamagedHp() * 2 - get.value(card); + }, + ai2(target) { + if (player.hp < 4 || target.hasSkillTag("nogain")) return 0; + return get.attitude(_status.event.player, target); + }, + }) + .forResult(); }, - async content(event, trigger, player){ - if (event.cards&&event.cards.length) { + async content(event, trigger, player) { + if (event.cards && event.cards.length) { player.discard(event.cards); player.recover(); - } - else { + } else { const target = event.targets[0]; player.loseHp(); target.draw(2); } }, }, - yuzuru_deyi:{ - derivation:['yuzuru_kunfen','yuzuru_quji','yuzuru_wangsheng','yuzuru_kunfen_rewrite','yuzuru_quji_rewrite'], - trigger:{global:'dieAfter'}, - forced:true, - unique:true, - juexingji:true, - skillAnimation:true, - animationColor:'orange', - content(){ - player.awakenSkill('yuzuru_deyi'); - player.changeSkills(['yuzuru_kunfen','yuzuru_quji','yuzuru_wangsheng'],['yuzuru_wuxin']); + yuzuru_deyi: { + derivation: [ + "yuzuru_kunfen", + "yuzuru_quji", + "yuzuru_wangsheng", + "yuzuru_kunfen_rewrite", + "yuzuru_quji_rewrite", + ], + trigger: { global: "dieAfter" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "orange", + content() { + player.awakenSkill("yuzuru_deyi"); + player.changeSkills( + ["yuzuru_kunfen", "yuzuru_quji", "yuzuru_wangsheng"], + ["yuzuru_wuxin"] + ); player.loseMaxHp(); player.recover(); }, }, - yuzuru_kunfen:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - content(){ - 'step 0' - if(!player.storage._yuzuru_sss) player.loseHp(); + yuzuru_kunfen: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { + "step 0"; + if (!player.storage._yuzuru_sss) player.loseHp(); player.draw(2); - 'step 1' - if(player.countCards('he')<2) event.finish(); - else{ + ("step 1"); + if (player.countCards("he") < 2) event.finish(); + else { player.chooseCardTarget({ - selectCard:2, - filterTarget:lib.filter.notMe, - prompt:'是否交给一名其他角色两张牌?', - position:'he', - ai1(card){ - var player=_status.event.player; - if(player.maxHp-player.hp==1&&card.name=='du') return 30; - var check=player.countCards('h')-2; - if(check<1) return 0; - if(player.hp>1&&check<2) return 0; - return get.unuseful(card)+9; + selectCard: 2, + filterTarget: lib.filter.notMe, + prompt: "是否交给一名其他角色两张牌?", + position: "he", + ai1(card) { + var player = _status.event.player; + if (player.maxHp - player.hp == 1 && card.name == "du") return 30; + var check = player.countCards("h") - 2; + if (check < 1) return 0; + if (player.hp > 1 && check < 2) return 0; + return get.unuseful(card) + 9; }, - ai2(target){ - var att=get.attitude(_status.event.player,target); - if(ui.selected.cards.length==1&&ui.selected.cards[0].name=='du') return 1-att; - return att-2; + ai2(target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length == 1 && ui.selected.cards[0].name == "du") + return 1 - att; + return att - 2; }, }); } - 'step 2' - if(result.bool) player.give(result.cards,result.targets[0]); + ("step 2"); + if (result.bool) player.give(result.cards, result.targets[0]); }, }, - yuzuru_quji:{ - audio:2, - enable:'phaseUse', - usable:1, - position:'he', - filterCard:true, - selectCard(){ - var player=_status.event.player; + yuzuru_quji: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + selectCard() { + var player = _status.event.player; return player.getDamagedHp(); }, - filterTarget(card,player,target){ - return target!=player&&target.hp0){ + player.awakenSkill("yuzuru_wangsheng"); + player.storage._yuzuru_sss = true; + if (player.countCards("he") > 0) { player.chooseCardTarget({ - selectCard:[1,Infinity], - filterTarget:lib.filter.notMe, - prompt:'将任意张牌交给一名其他角色,或点【取消】。', - position:'he', - ai1(card){ - var player=_status.event.player; - if(get.suit(card,false)=='heart'&&game.hasPlayer(function(current){ - return current.hasSkill('kanade_mapo')&&get.attitude(player,current)>0; - })) return 1; + selectCard: [1, Infinity], + filterTarget: lib.filter.notMe, + prompt: "将任意张牌交给一名其他角色,或点【取消】。", + position: "he", + ai1(card) { + var player = _status.event.player; + if ( + get.suit(card, false) == "heart" && + game.hasPlayer(function (current) { + return ( + current.hasSkill("kanade_mapo") && + get.attitude(player, current) > 0 + ); + }) + ) + return 1; return 0; }, - ai2(kanade){ - if(kanade.hasSkill('kanade_mapo')&&get.attitude(_status.event.player,kanade)>0) return 2; + ai2(kanade) { + if ( + kanade.hasSkill("kanade_mapo") && + get.attitude(_status.event.player, kanade) > 0 + ) + return 2; return 0; }, }); - } - else event.goto(2); - 'step 1' - if(result.bool) player.give(result.cards,result.targets[0]); - 'step 2' + } else event.goto(2); + ("step 1"); + if (result.bool) player.give(result.cards, result.targets[0]); + ("step 2"); player.loseMaxHp(); - 'step 3' - if(player.hp<2) player.recover(2-player.hp); + ("step 3"); + if (player.hp < 2) player.recover(2 - player.hp); }, }, - ao_xishi:{ - trigger:{ - player:['useCard','respond'], - target:'useCardToTargeted', + ao_xishi: { + trigger: { + player: ["useCard", "respond"], + target: "useCardToTargeted", }, - forced:true, - filter(event,player,name){ - return (name=='useCard'||name=='respond'||event.player!=player)&&get.suit(event.card)=='diamond'; + forced: true, + filter(event, player, name) { + return ( + (name == "useCard" || name == "respond" || event.player != player) && + get.suit(event.card) == "diamond" + ); }, - content(){player.draw()}, - }, - ao_kuihun:{ - trigger:{global:'dying'}, - logTarget:'player', - line:'thunder', - filter(event,player){ - return player!=event.player; - }, - content(){ - 'step 0' + content() { player.draw(); - 'step 1' - if(!trigger.player.countCards('h')) event.finish(); - else player.chooseButton(['选择一张牌作为「蝶」',trigger.player.getCards('h')]).set('ai',function(button){ - var val=get.buttonValue(button); - if(get.attitude(_status.event.player,get.owner(button.link))<=0) return 10+val; - if(val<=0) return 20; - if(button.link.name=='tao'||button.link.name=='jiu') return 0; - return 1/val; - }); - 'step 2' - if(result.bool){ - player.addToExpansion(result.links,trigger.player,'give').set('log',false).gaintag.add('ao_diegui'); - game.log(result.links,'飞向了',player); + }, + }, + ao_kuihun: { + trigger: { global: "dying" }, + logTarget: "player", + line: "thunder", + filter(event, player) { + return player != event.player; + }, + content() { + "step 0"; + player.draw(); + ("step 1"); + if (!trigger.player.countCards("h")) event.finish(); + else + player + .chooseButton(["选择一张牌作为「蝶」", trigger.player.getCards("h")]) + .set("ai", function (button) { + var val = get.buttonValue(button); + if (get.attitude(_status.event.player, get.owner(button.link)) <= 0) + return 10 + val; + if (val <= 0) return 20; + if (button.link.name == "tao" || button.link.name == "jiu") return 0; + return 1 / val; + }); + ("step 2"); + if (result.bool) { + player + .addToExpansion(result.links, trigger.player, "give") + .set("log", false) + .gaintag.add("ao_diegui"); + game.log(result.links, "飞向了", player); } }, - locked:false, - mod:{ - targetInRange(card,player){ - const cardSuit = get.suit(card,false); - const list = player.getExpansions('ao_diegui'); - for(let i = 0; i < list.length; i++){ - if(cardSuit==='unsure'||get.suit(list[i],false)===cardSuit) return true; + locked: false, + mod: { + targetInRange(card, player) { + const cardSuit = get.suit(card, false); + const list = player.getExpansions("ao_diegui"); + for (let i = 0; i < list.length; i++) { + if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) return true; } }, - cardUsable(card,player){ - const cardSuit = get.suit(card,false); - const list = player.getExpansions('ao_diegui'); - for(let i = 0; i < list.length; i++){ - if(cardSuit==='unsure'||get.suit(list[i],false)===cardSuit) return Infinity; + cardUsable(card, player) { + const cardSuit = get.suit(card, false); + const list = player.getExpansions("ao_diegui"); + for (let i = 0; i < list.length; i++) { + if (cardSuit === "unsure" || get.suit(list[i], false) === cardSuit) + return Infinity; } }, - maxHandcard(player,num){ - return num+player.getExpansions('ao_diegui').length; + maxHandcard(player, num) { + return num + player.getExpansions("ao_diegui").length; }, }, }, - ao_shixin:{ - derivation:'ao_diegui', - trigger:{player:'phaseZhunbeiBegin'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'key', - unique:true, - filter(event,player){ - var list=player.getExpansions('ao_diegui'); - var list2=[]; - for(var i=0;i2; + return list2.length > 2; }, - content(){ - player.awakenSkill('ao_shixin'); - player.changeSkills(['ao_diegui'],['ao_kuihun']); + content() { + player.awakenSkill("ao_shixin"); + player.changeSkills(["ao_diegui"], ["ao_kuihun"]); player.gainMaxHp(); player.recover(); }, }, - ao_diegui:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.getExpansions('ao_diegui').length>0; + ao_diegui: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.getExpansions("ao_diegui").length > 0; }, - chooseButton:{ - dialog(event,player){ - return ui.create.dialog('蝶归',player.getExpansions('ao_diegui'),'hidden'); + chooseButton: { + dialog(event, player) { + return ui.create.dialog("蝶归", player.getExpansions("ao_diegui"), "hidden"); }, - backup(links,player){ + backup(links, player) { return { - card:links, - filterCard(){return false}, - selectCard:-1, - filterTarget:true, - delay:false, - content:lib.skill.ao_diegui.contentx, - line:'thunder', - ai:{ - result:{ - target(player,target){ - if(target!=player&&target.hasSkillTag('nogain')) return 0; - var num=1; - if(target.isTurnedOver()) num+=2; - if(target.isLinked()) num+=0.5; + card: links, + filterCard() { + return false; + }, + selectCard: -1, + filterTarget: true, + delay: false, + content: lib.skill.ao_diegui.contentx, + line: "thunder", + ai: { + result: { + target(player, target) { + if (target != player && target.hasSkillTag("nogain")) return 0; + var num = 1; + if (target.isTurnedOver()) num += 2; + if (target.isLinked()) num += 0.5; return num; }, - } + }, }, - } + }; }, - prompt(links,player){ - return '选择一名角色,令其获得'+get.translation(links[0])+',摸两张牌并将武将牌复原。' + prompt(links, player) { + return ( + "选择一名角色,令其获得" + + get.translation(links[0]) + + ",摸两张牌并将武将牌复原。" + ); }, }, - contentx(){ - 'step 0' - player.give(lib.skill.ao_diegui_backup.card,target,'visible'); + contentx() { + "step 0"; + player.give(lib.skill.ao_diegui_backup.card, target, "visible"); target.draw(2); - 'step 1' + ("step 1"); target.link(false); - 'step 2' + ("step 2"); target.turnOver(false); }, - intro:{ - name:'七影蝶', - content:'expansion', - markcount:'expansion', + intro: { + name: "七影蝶", + content: "expansion", + markcount: "expansion", }, - onremove(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{order:1,result:{player:1}}, + ai: { order: 1, result: { player: 1 } }, }, - ayato_jianshen:{ - mod:{ - cardnature(card,player){ - if(get.name(card)=='sha') return 'kami'; + ayato_jianshen: { + mod: { + cardnature(card, player) { + if (get.name(card) == "sha") return "kami"; }, }, - ai:{threaten:3}, + ai: { threaten: 3 }, }, - ayato_zonghuan:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0; + ayato_zonghuan: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; }, - content(){ - 'step 0' - player.chooseButton(['请选择'+get.translation(target)+'的一张手牌',target.getCards('h')],true).set('ai',get.buttonValue); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - if(!lib.filter.cardEnabled(card,target)) event._result={bool:false}; - else{ - var targets=game.players.slice(0); - var info=get.info(card); + content() { + "step 0"; + player + .chooseButton( + ["请选择" + get.translation(target) + "的一张手牌", target.getCards("h")], + true + ) + .set("ai", get.buttonValue); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + if (!lib.filter.cardEnabled(card, target)) event._result = { bool: false }; + else { + var targets = game.players.slice(0); + var info = get.info(card); var range; - if(!info.notarget){ - var select=get.copy(info.selectTarget); - if(select==undefined){ - range=[1,1]; - } - else if(typeof select=='number') range=[select,select]; - else if(get.itemtype(select)=='select') range=select; - else if(typeof select=='function') range=select(card,player); - game.checkMod(card,target,range,'selectTarget',target); + if (!info.notarget) { + var select = get.copy(info.selectTarget); + if (select == undefined) { + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, target, range, "selectTarget", target); } - if(info.notarget||range[1]==-1){ - if(range[1]==-1){ - for(var i=0;i0; + return eff > 0; }; - } - else{ - var next=player.chooseTarget(); - next.set('_get_card',card); - next.set('source',target); - next.set('filterTarget',function(card,player,target){ - return lib.filter.filterTarget(_status.event._get_card,_status.event.source,target); + } else { + var next = player.chooseTarget(); + next.set("_get_card", card); + next.set("source", target); + next.set("filterTarget", function (card, player, target) { + return lib.filter.filterTarget( + _status.event._get_card, + _status.event.source, + target + ); }); - next.set('ai',function(target){ - var evt=_status.event; - return get.effect(target,evt._get_card,evt.source,evt.player) + next.set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt._get_card, evt.source, evt.player); }); - next.set('selectTarget',function(){ - var card=get.card(),player=_status.event.source; - if(card==undefined) return; + next.set("selectTarget", function () { + var card = get.card(), + player = _status.event.source; + if (card == undefined) return; var range; - var select=get.copy(get.info(card).selectTarget); - if(select==undefined){ - if(get.info(card).filterTarget==undefined) return[0,0]; - range=[1,1]; - } - else if(typeof select=='number') range=[select,select]; - else if(get.itemtype(select)=='select') range=select; - else if(typeof select=='function') range=select(card,player); - game.checkMod(card,player,range,'selectTarget',player); + var select = get.copy(get.info(card).selectTarget); + if (select == undefined) { + if (get.info(card).filterTarget == undefined) return [0, 0]; + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); return range; }); - next.set('prompt',event.prompt||('选择'+get.translation(target)+'使用'+get.translation(card)+'的目标')); - next.set('prompt2','或点「取消」令其将此牌置入弃牌堆'); + next.set( + "prompt", + event.prompt || + "选择" + + get.translation(target) + + "使用" + + get.translation(card) + + "的目标" + ); + next.set("prompt2", "或点「取消」令其将此牌置入弃牌堆"); } } - } - else event.finish(); - 'step 2' - if(result.bool){ - target.useCard(card,event.targets2||result.targets,false,'noai'); + } else event.finish(); + ("step 2"); + if (result.bool) { + target.useCard(card, event.targets2 || result.targets, false, "noai"); player.draw(); - } - else{ - target.lose(card,ui.discardPile); + } else { + target.lose(card, ui.discardPile); target.$throw(card); - game.log(target,'将',card,'置入了弃牌堆'); + game.log(target, "将", card, "置入了弃牌堆"); } }, - ai:{order:10,result:{target:-1}}, + ai: { order: 10, result: { target: -1 } }, }, - nagisa_tiandu:{ - trigger:{player:'judgeEnd'}, - charlotte:true, - frequent(event){ - if(event.result.card.name=='du') return false; + nagisa_tiandu: { + trigger: { player: "judgeEnd" }, + charlotte: true, + frequent(event) { + if (event.result.card.name == "du") return false; return true; }, - check(event){ - if(event.result.card.name=='du') return false; + check(event) { + if (event.result.card.name == "du") return false; return true; }, - filter(event,player){ - return get.position(event.result.card,true)=='o'; + filter(event, player) { + return get.position(event.result.card, true) == "o"; + }, + content() { + player.gain(trigger.result.card, "gain2"); }, - content(){ - player.gain(trigger.result.card,'gain2'); - } }, - nagisa_fuxin:{ - trigger:{ - global:['gainAfter','loseAfter','loseAsyncAfter','damageEnd'], + nagisa_fuxin: { + trigger: { + global: ["gainAfter", "loseAfter", "loseAsyncAfter", "damageEnd"], }, - filterx(event,player){ - var source=_status.currentPhase; - if(event.name=='damage'){ - return event.player.isAlive()&&event.player!=source; - } - else if(event.name=='lose'){ - if(event.type!='discard'||event.player==source||event.player.isDead()) return false; - if((event.discarder||event.getParent(2).player)==event.player) return false; - if(!event.getl(event.player).hs.length) return false; + filterx(event, player) { + var source = _status.currentPhase; + if (event.name == "damage") { + return event.player.isAlive() && event.player != source; + } else if (event.name == "lose") { + if (event.type != "discard" || event.player == source || event.player.isDead()) + return false; + if ((event.discarder || event.getParent(2).player) == event.player) return false; + if (!event.getl(event.player).hs.length) return false; return true; - } - else if(event.name=='gain'){ - if(event.giver||event.getParent().name=='gift') return false; - var cards=event.getg(event.player); - if(!cards.length) return false; - return game.hasPlayer(function(current){ - if(current==event.player||current==source) return false; - var hs=event.getl(current).hs; - for(var i of hs){ - if(cards.includes(i)) return true; + } else if (event.name == "gain") { + if (event.giver || event.getParent().name == "gift") return false; + var cards = event.getg(event.player); + if (!cards.length) return false; + return game.hasPlayer(function (current) { + if (current == event.player || current == source) return false; + var hs = event.getl(current).hs; + for (var i of hs) { + if (cards.includes(i)) return true; } return false; }); - } - else if(event.type=='gain'){ - if(event.giver||!event.player||event.player==source||event.player.isDead()) return false; - var hs=event.getl(event.player); - return game.hasPlayer(function(current){ - if(current==event.player) return false; - var cards=event.getg(current); - for(var i of cards){ - if(hs.includes(i)) return true; + } else if (event.type == "gain") { + if (event.giver || !event.player || event.player == source || event.player.isDead()) + return false; + var hs = event.getl(event.player); + return game.hasPlayer(function (current) { + if (current == event.player) return false; + var cards = event.getg(current); + for (var i of cards) { + if (hs.includes(i)) return true; } }); - } - else if(event.type=='discard'){ - if(!event.discarder) return false; - return game.hasPlayer(function(current){ - return current!=source&¤t!=event.discarder&&event.getl(current).hs.length>0; + } else if (event.type == "discard") { + if (!event.discarder) return false; + return game.hasPlayer(function (current) { + return ( + current != source && + current != event.discarder && + event.getl(current).hs.length > 0 + ); }); } return false; }, - filter(event, player, triggername, target){ + filter(event, player, triggername, target) { return target.isIn(); }, - getIndex(trigger, player, triggername){ + getIndex(trigger, player, triggername) { if (!lib.skill.nagisa_fuxin.filterx(trigger, player)) return false; - const targets = [], source = _status.currentPhase; - if (trigger.name=='gain') { + const targets = [], + source = _status.currentPhase; + if (trigger.name == "gain") { const cards = trigger.getg(trigger.player); - targets.addArray(game.filterPlayer(function(current){ - if (current === trigger.player || current === source) return false; - const hs = trigger.getl(current).hs; - for (const i of hs) { - if (cards.includes(i)) return true; - } - return false; - })); - } - else if (trigger.name == 'loseAsync' && trigger.type == 'discard') { - targets.addArray(game.filterPlayer(function(current){ - return current != trigger.discarder && current != source && trigger.getl(current).hs.length>0; - })); - } - else targets.push(trigger.player); + targets.addArray( + game.filterPlayer(function (current) { + if (current === trigger.player || current === source) return false; + const hs = trigger.getl(current).hs; + for (const i of hs) { + if (cards.includes(i)) return true; + } + return false; + }) + ); + } else if (trigger.name == "loseAsync" && trigger.type == "discard") { + targets.addArray( + game.filterPlayer(function (current) { + return ( + current != trigger.discarder && + current != source && + trigger.getl(current).hs.length > 0 + ); + }) + ); + } else targets.push(trigger.player); targets.sortBySeat(); return targets; }, - logTarget:(event, player, triggername, target)=>target, - check(event, player, triggername, target){ + logTarget: (event, player, triggername, target) => target, + check(event, player, triggername, target) { const source = _status.currentPhase; - if (source && source.isIn() && get.attitude(player,source) > 0) return false; - return get.attitude(player,target) > 0; + if (source && source.isIn() && get.attitude(player, source) > 0) return false; + return get.attitude(player, target) > 0; }, - async content(event, trigger, player){ + async content(event, trigger, player) { const target = event.indexedData; - const {result} = await target.judge(); - if (result.color === 'red' && target.isIn()) { + const { result } = await target.judge(); + if (result.color === "red" && target.isIn()) { await target.draw(); - } - else { + } else { const source = _status.currentPhase; - if (source && source.isIn() && source.countCards('h') > 0) { - source.chooseToDiscard('he',true); + if (source && source.isIn() && source.countCards("h") > 0) { + source.chooseToDiscard("he", true); } } }, - ai:{expose:0.2}, + ai: { expose: 0.2 }, }, - tomoya_shangxian:{ - trigger:{player:'phaseUseBegin'}, - mark:true, - locked:true, - intro:{ - content(s){ - return '计算与其他角色的距离时始终从'+(s?'逆':'顺')+'时针计算' + tomoya_shangxian: { + trigger: { player: "phaseUseBegin" }, + mark: true, + locked: true, + intro: { + content(s) { + return "计算与其他角色的距离时始终从" + (s ? "逆" : "顺") + "时针计算"; }, }, - content(){ + content() { player.draw(); - player.storage.tomoya_shangxian=!player.storage.tomoya_shangxian; + player.storage.tomoya_shangxian = !player.storage.tomoya_shangxian; }, - ai:{ - left_hand:true, - right_hand:true, - skillTagFilter(player,tag){ - return (player.storage.tomoya_shangxian==true)==(tag=='left_hand'); + ai: { + left_hand: true, + right_hand: true, + skillTagFilter(player, tag) { + return (player.storage.tomoya_shangxian == true) == (tag == "left_hand"); }, }, }, - tomoya_wangjin:{ - trigger:{global:'phaseJieshuBegin'}, - filter(event,player){ - return player!=event.player&&!player.hasSkill('tomoya_wangjin_'+player.inRange(event.player)); + tomoya_wangjin: { + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player != event.player && + !player.hasSkill("tomoya_wangjin_" + player.inRange(event.player)) + ); }, - logTarget:'player', - check(event,player){ - var target=event.player; - var bool=player.inRange(target); - if(!bool){ - if(target.hp>player.hp) return get.effect(target,{name:'sha',isCard:true},player,player)>0; - var temp=target; - while(true){ - temp=temp.getNext(); - if(temp==target||temp==_status.roundStart) return true; - if(temp==player) continue; - if(temp.hp>player.hp&&!player.inRange(temp)&&get.effect(temp,{name:'sha',isCard:true},player,player)>0) return false; + logTarget: "player", + check(event, player) { + var target = event.player; + var bool = player.inRange(target); + if (!bool) { + if (target.hp > player.hp) + return get.effect(target, { name: "sha", isCard: true }, player, player) > 0; + var temp = target; + while (true) { + temp = temp.getNext(); + if (temp == target || temp == _status.roundStart) return true; + if (temp == player) continue; + if ( + temp.hp > player.hp && + !player.inRange(temp) && + get.effect(temp, { name: "sha", isCard: true }, player, player) > 0 + ) + return false; } } - if(get.attitude(player,target)<2) return false; - if(target.hp=2&&!temp.hasSkillTag('nogain')) return false; + if (get.attitude(player, target) < 2) return false; + if (target.hp < player.hp && !target.hasSkillTag("nogain")) return true; + var temp = target; + while (true) { + temp = temp.getNext(); + if (temp == target || temp == _status.roundStart) return true; + if (temp == player) continue; + if ( + temp.hp < player.hp && + player.inRange(temp) && + get.attitude(player, target) >= 2 && + !temp.hasSkillTag("nogain") + ) + return false; } }, - content(){ - 'step 0' - event.bool=player.inRange(trigger.player); - player.addTempSkill('tomoya_wangjin_'+event.bool,'roundStart'); - if(event.bool){ + content() { + "step 0"; + event.bool = player.inRange(trigger.player); + player.addTempSkill("tomoya_wangjin_" + event.bool, "roundStart"); + if (event.bool) { trigger.player.draw(); - } - else player.draw(2); - 'step 1' - if(event.bool){ - if(trigger.player.hp 0) + trigger.player.discardPlayerCard(player, "h", true); else event.finish(); } - else{ - if(player.countDiscardableCards(trigger.player,'h')>0) trigger.player.discardPlayerCard(player,'h',true); - else event.finish(); - } - 'step 2' - if(event.bool){ - player.chooseCard('h','是否交给'+get.translation(trigger.player)+'一张牌?'); - } - else{ + ("step 2"); + if (event.bool) { + player.chooseCard("h", "是否交给" + get.translation(trigger.player) + "一张牌?"); + } else { event.finish(); - if(player.hp>=trigger.player.hp) return; - var card={name:'sha',isCard:true}; - if(player.canUse(card,trigger.player,false)) player.useCard(card,trigger.player,false); + if (player.hp >= trigger.player.hp) return; + var card = { name: "sha", isCard: true }; + if (player.canUse(card, trigger.player, false)) + player.useCard(card, trigger.player, false); } - 'step 3' - if(result.bool) player.give(result.cards,target); + ("step 3"); + if (result.bool) player.give(result.cards, target); }, - subSkill:{true:{charlotte:true},false:{charlotte:true}}, - ai:{expose:0.2}, + subSkill: { + true: { charlotte: true }, + false: { charlotte: true }, + }, + ai: { expose: 0.2 }, }, - noda_fengcheng:{ - audio:2, - trigger:{ - player:"gainAfter", + noda_fengcheng: { + audio: 2, + trigger: { + player: "gainAfter", }, - forced:true, - filter(event,player){ - return get.itemtype(event.source)=='player'&&event.bySelf!=true; + forced: true, + filter(event, player) { + return get.itemtype(event.source) == "player" && event.bySelf != true; }, - check(event,player){ - return get.attitude(player,event.source)>0; + check(event, player) { + return get.attitude(player, event.source) > 0; }, - logTarget:"source", - content(){ + logTarget: "source", + content() { trigger.source.draw(); }, }, - noda_xunxin:{ - audio:2, - enable:'phaseUse', - viewAs:{name:'juedou'}, - filter(event,player){ - return (player.getStat('skill').noda_xunxin||0)0; + noda_xunxin2: { + trigger: { player: "juedouAfter" }, + popup: false, + forced: true, + filter(event, player) { + if (event.target.isDead()) return false; + return event.turn && event.turn.countCards("he") > 0; }, - content(){ - 'step 0' - event.giver=trigger.turn; - event.gainner=event.giver==player?trigger.target:player; - event.giver.chooseCard('he',true,'交给'+get.translation(event.gainner)+'一张牌'); - 'step 1' - event.giver.give(result.cards,event.gainner); + content() { + "step 0"; + event.giver = trigger.turn; + event.gainner = event.giver == player ? trigger.target : player; + event.giver.chooseCard("he", true, "交给" + get.translation(event.gainner) + "一张牌"); + ("step 1"); + event.giver.give(result.cards, event.gainner); }, }, - hinata_qiulve:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - viewAsFilter(player){ - return player.countCards('hes',function(card){ - return get.type(card)!='basic'; - })>0; + hinata_qiulve: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter(player) { + return ( + player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) > 0 + ); }, - viewAs:{name:'sha'}, - filterCard(card,player){ - return get.type(card)!='basic'; + viewAs: { name: "sha" }, + filterCard(card, player) { + return get.type(card) != "basic"; }, - locked:false, - position:'hes', - check(card){ - var val=get.value(card); - if(val>=6) return 0; - if(get.color(card)=='black') return 12-val; - return 6-val; + locked: false, + position: "hes", + check(card) { + var val = get.value(card); + if (val >= 6) return 0; + if (get.color(card) == "black") return 12 - val; + return 6 - val; }, - mod:{ - targetInRange(card,player,target){ - if(_status.event.skill=='hinata_qiulve') return true; + mod: { + targetInRange(card, player, target) { + if (_status.event.skill == "hinata_qiulve") return true; }, }, - group:'hinata_qiulve_clear', - ai:{ - respondSha:true, - skillTagFilter(player){ - return player.countCards('hes',function(card){ - return get.type(card)!='basic'; - })>0; + group: "hinata_qiulve_clear", + ai: { + respondSha: true, + skillTagFilter(player) { + return ( + player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) > 0 + ); }, }, }, - hinata_qiulve_clear:{ - trigger:{player:'useCard1'}, - firstDo:true, - silent:true, - filter(event,player){ - return event.skill=='hinata_qiulve'; + hinata_qiulve_clear: { + trigger: { player: "useCard1" }, + firstDo: true, + silent: true, + filter(event, player) { + return event.skill == "hinata_qiulve"; }, - content(){ - if(get.color(trigger.card)=='red') trigger.directHit.addArray(game.players); - else if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat().card; - if(stat.sha) stat.sha--; + content() { + if (get.color(trigger.card) == "red") trigger.directHit.addArray(game.players); + else if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card; + if (stat.sha) stat.sha--; } }, }, - hinata_ehou:{ - audio:2, - trigger:{global:'useCardAfter'}, + hinata_ehou: { + audio: 2, + trigger: { global: "useCardAfter" }, //这个也是chooseToUse 改不了 - direct:true, - filter(event,player){ - return player!=event.player&&event.targets&&event.targets.includes(player)&&(_status.connectMode||player.hasSha()); + direct: true, + filter(event, player) { + return ( + player != event.player && + event.targets && + event.targets.includes(player) && + (_status.connectMode || player.hasSha()) + ); }, - content(){ - 'step 0' + content() { + "step 0"; player.chooseToUse({ - logSkill:'hinata_ehou', - preTarget:trigger.player, - prompt:'是否发动【扼喉】,对'+get.translation(trigger.player)+'使用一张【杀】?', - filterCard(card,player){ - return get.name(card)=='sha'&&lib.filter.filterCard.apply(this,arguments); + logSkill: "hinata_ehou", + preTarget: trigger.player, + prompt: "是否发动【扼喉】,对" + get.translation(trigger.player) + "使用一张【杀】?", + filterCard(card, player) { + return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); }, - filterTarget(card,player,target){ - return target==_status.event.preTarget&&lib.filter.filterTarget.apply(this,arguments); + filterTarget(card, player, target) { + return ( + target == _status.event.preTarget && + lib.filter.filterTarget.apply(this, arguments) + ); }, - addCount:false, + addCount: false, }); - 'step 1' - if(result.bool&&player.getHistory('sourceDamage',function(evt){ - return evt.getParent(4)==event; - }).length) player.draw(); + ("step 1"); + if ( + result.bool && + player.getHistory("sourceDamage", function (evt) { + return evt.getParent(4) == event; + }).length + ) + player.draw(); }, }, - hisako_yinbao:{ - audio:2, - trigger:{player:['damageEnd','recoverAfter']}, - content(){ - 'step 0' - player.judge(function(card){ - return get.suit(card)=='spade'?2:-2; - }).judge2=function(result){ + hisako_yinbao: { + audio: 2, + trigger: { player: ["damageEnd", "recoverAfter"] }, + content() { + "step 0"; + player.judge(function (card) { + return get.suit(card) == "spade" ? 2 : -2; + }).judge2 = function (result) { return result.bool; }; - 'step 1' - if(result.bool&&game.hasPlayer(current=>current!=player)){ - player.chooseTarget(lib.filter.notMe,true,'选择一名其他角色,对其造成1点雷属性伤害').set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player,'thunder'); - }); - } - else event.finish(); - 'step 2' - var target=result.targets[0]; + ("step 1"); + if (result.bool && game.hasPlayer((current) => current != player)) { + player + .chooseTarget(lib.filter.notMe, true, "选择一名其他角色,对其造成1点雷属性伤害") + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder"); + }); + } else event.finish(); + ("step 2"); + var target = result.targets[0]; player.addExpose(0.2); - player.line(target,'thunder'); - target.damage('thunder'); + player.line(target, "thunder"); + target.damage("thunder"); }, }, - hisako_zhuanyun:{ - trigger:{player:'judgeBegin'}, - forced:true, - charlotte:true, - silent:true, - filter(event,player){ + hisako_zhuanyun: { + trigger: { player: "judgeBegin" }, + forced: true, + charlotte: true, + silent: true, + filter(event, player) { return !event.directresult; }, - content(){ - var tempcard=false,temp=-Infinity; - for(var i=0;itemp){ - tempcard=card; - temp=temp2; + content() { + var tempcard = false, + temp = -Infinity; + for (var i = 0; i < ui.cardPile.childElementCount; i++) { + var card = ui.cardPile.childNodes[i]; + var temp2 = trigger.judge(card); + if (temp2 > temp) { + tempcard = card; + temp = temp2; } } - if(tempcard) trigger.directresult=tempcard; + if (tempcard) trigger.directresult = tempcard; }, - ai:{luckyStar:true}, + ai: { luckyStar: true }, }, - riki_spwenji:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he'); + riki_spwenji: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); }); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt2('riki_spwenji'),function(card,player,target){ - return target!=player&&target.countCards('he'); - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0) return Math.sqrt(att)/10; - return 5-att; - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("riki_spwenji"), function (card, player, target) { + return target != player && target.countCards("he"); + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }) + .forResult(); }, - content(){ - 'step 0' + content() { + "step 0"; target = targets[0]; event.target = target; - target.chooseCard('he', true, '问计:将一张牌交给'+get.translation(player)); - 'step 1' - if(result.bool){ - player.addTempSkill('riki_spwenji_respond'); - player.storage.riki_spwenji_respond=get.type2(result.cards[0],target); - event.target.give(result.cards,player,true); + target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); + ("step 1"); + if (result.bool) { + player.addTempSkill("riki_spwenji_respond"); + player.storage.riki_spwenji_respond = get.type2(result.cards[0], target); + event.target.give(result.cards, player, true); } }, - ai:{expose:0.2}, - subSkill:{ - respond:{ - onremove:true, - trigger:{player:'useCard'}, - forced:true, - charlotte:true, - audio:'riki_spwenji', - filter(event,player){ - return get.type2(event.card)==player.storage.riki_spwenji_respond; + ai: { expose: 0.2 }, + subSkill: { + respond: { + onremove: true, + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + audio: "riki_spwenji", + filter(event, player) { + return get.type2(event.card) == player.storage.riki_spwenji_respond; }, - content(){ + content() { trigger.directHit.addArray(game.players); }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return get.type2(arg.card)==player.storage.riki_spwenji_respond; + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return get.type2(arg.card) == player.storage.riki_spwenji_respond; }, }, - } - } - }, - riki_nvzhuang:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - content(){ - player.draw(player.countCards('h')==0?2:1); + }, }, }, - riki_mengzhong:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - derivation:'riki_chongzhen', - juexingji:true, - unique:true, - skillAnimation:true, - animationColor:'key', - filter(event,player){ - var num=0; - player.getAllHistory('gain',function(evt){ - if(evt.getParent().name=='riki_spwenji') num+=evt.cards.length; + riki_nvzhuang: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { + player.draw(player.countCards("h") == 0 ? 2 : 1); + }, + }, + riki_mengzhong: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + derivation: "riki_chongzhen", + juexingji: true, + unique: true, + skillAnimation: true, + animationColor: "key", + filter(event, player) { + var num = 0; + player.getAllHistory("gain", function (evt) { + if (evt.getParent().name == "riki_spwenji") num += evt.cards.length; }); - return num>=3; + return num >= 3; }, - content(){ - player.awakenSkill('riki_mengzhong'); - player.removeSkills('riki_spwenji'); + content() { + player.awakenSkill("riki_mengzhong"); + player.removeSkills("riki_spwenji"); player.gainMaxHp(); player.recover(); - player.addSkills('riki_chongzhen'); + player.addSkills("riki_chongzhen"); }, }, - riki_chongzhen:{ - trigger:{ - player:"phaseUseBegin", + riki_chongzhen: { + trigger: { + player: "phaseUseBegin", }, - filter(event, player){ - return game.hasPlayer(current => player.canCompare(current)); + filter(event, player) { + return game.hasPlayer((current) => player.canCompare(current)); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt2('riki_chongzhen'),function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - return -get.attitude(player,target)*(1+target.countCards('e'))/(1+target.countCards('j')); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("riki_chongzhen"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + return ( + (-get.attitude(player, target) * (1 + target.countCards("e"))) / + (1 + target.countCards("j")) + ); + }) + .forResult(); }, - content(){ - 'step 0' + content() { + "step 0"; var target = targets[0]; event.target = target; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - var num=0; - if(target.countCards('h')) num++; - if(target.countCards('e')) num++; - if(target.countCards('j')) num++; - if(num){ - player.gainPlayerCard(target,num,'hej',true).set('filterButton',function(button){ - for(var i=0;i0&&game.hasPlayer(function(current){ - return player.canCompare(current); - }); + yuiko_fenglun: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return player.canCompare(current); + }) + ); }, - filterTarget(card,player,target){ + filterTarget(card, player, target) { return player.canCompare(target); }, - content(){ - 'step 0' + content() { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool) player.addTempSkill('yuiko_fenglun2','phaseUseEnd'); + ("step 1"); + if (result.bool) player.addTempSkill("yuiko_fenglun2", "phaseUseEnd"); }, - ai:{ - order:10, - result:{target:-1}, + ai: { + order: 10, + result: { target: -1 }, }, }, - yuiko_fenglun2:{ - mod:{ - cardUsable(){return Infinity}, - targetInRange(){return true}, + yuiko_fenglun2: { + mod: { + cardUsable() { + return Infinity; + }, + targetInRange() { + return true; + }, }, }, - yuiko_dilve:{ - enable:"chooseCard", - check(){ + yuiko_dilve: { + enable: "chooseCard", + check() { return 20; }, - filter(event){ - return event.type=='compare'&&!event.directresult; + filter(event) { + return event.type == "compare" && !event.directresult; }, - onCompare(player){ + onCompare(player) { return game.cardsGotoOrdering(get.bottomCards()).cards; }, - group:'yuiko_dilve_gain', - subSkill:{ - gain:{ - trigger:{ - player:['chooseToCompareAfter','compareMultipleAfter'], - target:['chooseToCompareAfter','compareMultipleAfter'] + group: "yuiko_dilve_gain", + subSkill: { + gain: { + trigger: { + player: ["chooseToCompareAfter", "compareMultipleAfter"], + target: ["chooseToCompareAfter", "compareMultipleAfter"], }, - filter(event,player){ - if(event.preserve) return false; - return [event.card1,event.card2].filterInD('od').length>0; + filter(event, player) { + if (event.preserve) return false; + return [event.card1, event.card2].filterInD("od").length > 0; }, - prompt2(event,player){ - return '获得'+get.translation([event.card1,event.card2].filterInD('od')); + prompt2(event, player) { + return "获得" + get.translation([event.card1, event.card2].filterInD("od")); + }, + content() { + player.gain([trigger.card1, trigger.card2].filterInD("od"), "gain2", "log"); }, - content(){ - player.gain([trigger.card1,trigger.card2].filterInD('od'),'gain2','log'); - } }, }, }, - doruji_feiqu:{ - trigger:{ - player:'useCard', - target:'useCardToTargeted', + doruji_feiqu: { + trigger: { + player: "useCard", + target: "useCardToTargeted", }, - forced:true, - filter(event,player){ - return event.card.name=='sha'; + forced: true, + filter(event, player) { + return event.card.name == "sha"; }, - content(){ - if(trigger.name=='useCard') trigger.directHit.addArray(game.players); + content() { + if (trigger.name == "useCard") trigger.directHit.addArray(game.players); else trigger.directHit.add(player); }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return arg.card.name=='sha'; + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return arg.card.name == "sha"; }, }, - global:'doruji_feiqu_ai', + global: "doruji_feiqu_ai", }, - doruji_feiqu_ai:{ - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return arg.card.name=='sha'&&(arg.target.hasSkill('doruji_feiqu')||arg.target.hasSkill('godan_feiqu')); + doruji_feiqu_ai: { + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return ( + arg.card.name == "sha" && + (arg.target.hasSkill("doruji_feiqu") || arg.target.hasSkill("godan_feiqu")) + ); }, }, }, - akane_jugu:{ - audio:2, - mod:{ - maxHandcard(player,num){ - return num+player.maxHp; - } + akane_jugu: { + audio: 2, + mod: { + maxHandcard(player, num) { + return num + player.maxHp; + }, }, - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ + content() { player.draw(player.maxHp); - } + }, }, - akane_quanqing:{ - enable:'phaseUse', - filterCard:true, - filterTarget(card,player,target){ - return target!=player&&player.inRange(target); + akane_quanqing: { + enable: "phaseUse", + filterCard: true, + filterTarget(card, player, target) { + return target != player && player.inRange(target); }, - position:'he', - check(card){ - var val=get.value(card); - var num=card.number; - if(num>10) return 8-val; - var player=_status.event.player; - if(player.getUseValue(card,null,true)>player.getUseValue({name:'guohe'})) return 0; - if(num>6) return 6-val; - return 3-val; + position: "he", + check(card) { + var val = get.value(card); + var num = card.number; + if (num > 10) return 8 - val; + var player = _status.event.player; + if (player.getUseValue(card, null, true) > player.getUseValue({ name: "guohe" })) + return 0; + if (num > 6) return 6 - val; + return 3 - val; }, - content(){ - 'step 0' - var num=cards[0].number; - var trans=get.translation(target); - var list=['令'+trans+'摸一张牌']; - event.addIndex=0; - if(num>6){ - if(target.countDiscardableCards(player,'hej')>0) list.push('弃置'+trans+'区域内的一张牌'); + content() { + "step 0"; + var num = cards[0].number; + var trans = get.translation(target); + var list = ["令" + trans + "摸一张牌"]; + event.addIndex = 0; + if (num > 6) { + if (target.countDiscardableCards(player, "hej") > 0) + list.push("弃置" + trans + "区域内的一张牌"); else event.addIndex++; } - if(num>10) list.push('对'+trans+'造成1点伤害'); - if(list.length==1) event._result={index:0}; - else player.chooseControl().set('choiceList',list).set('index',list.length-1).set('ai',function(){return _status.event.index}); - 'step 1' - if(result.index>0) result.index+=event.addIndex; - switch(result.index){ - case 0:target.draw();break; - case 1:player.discardPlayerCard(target,'hej',true);break; - case 2:target.damage('nocard');break; + if (num > 10) list.push("对" + trans + "造成1点伤害"); + if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl() + .set("choiceList", list) + .set("index", list.length - 1) + .set("ai", function () { + return _status.event.index; + }); + ("step 1"); + if (result.index > 0) result.index += event.addIndex; + switch (result.index) { + case 0: + target.draw(); + break; + case 1: + player.discardPlayerCard(target, "hej", true); + break; + case 2: + target.damage("nocard"); + break; } }, - ai:{ - order:4, - result:{ - target(player,target){ - var card=ui.selected.cards[0]; - if(card){ - if(card.number>10) return get.damageEffect(target,player,target); - if(card.number>6) return lib.card.guohe.ai.result.target.apply(this,arguments); + ai: { + order: 4, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (card) { + if (card.number > 10) return get.damageEffect(target, player, target); + if (card.number > 6) + return lib.card.guohe.ai.result.target.apply(this, arguments); return 1; } }, }, }, }, - akane_yifu:{ - unique:true, - global:'akane_yifu2', - zhuSkill:true, + akane_yifu: { + unique: true, + global: "akane_yifu2", + zhuSkill: true, }, - akane_yifu2:{ - audio:2, - enable:'phaseUse', - discard:false, - line:true, - log:false, - delay:false, - lose:false, - prepare(cards,player,targets){ - targets[0].logSkill('akane_yifu'); + akane_yifu2: { + audio: 2, + enable: "phaseUse", + discard: false, + line: true, + log: false, + delay: false, + lose: false, + prepare(cards, player, targets) { + targets[0].logSkill("akane_yifu"); }, - prompt(){ - var player=_status.event.player; - var list=game.filterPlayer(function(target){ - return target!=player&&target.hasZhuSkill('akane_yifu',player); + prompt() { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target != player && target.hasZhuSkill("akane_yifu", player); }); - var str='将一张手牌交给'+get.translation(list); - if(list.length>1) str+='中的一人'; + var str = "将一张手牌交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; return str; }, - filter(event,player){ - if(player.group!='key') return false; - if(player.countCards('h')==0) return 0; - return game.hasPlayer(function(target){ - return target!=player&&target.hasZhuSkill('akane_yifu',player)&&!target.hasSkill('akane_yifu3'); + filter(event, player) { + if (player.group != "key") return false; + if (player.countCards("h") == 0) return 0; + return game.hasPlayer(function (target) { + return ( + target != player && + target.hasZhuSkill("akane_yifu", player) && + !target.hasSkill("akane_yifu3") + ); }); }, - filterCard:true, - filterTarget(card,player,target){ - return target!=player&&target.hasZhuSkill('akane_yifu',player)&&!target.hasSkill('akane_yifu3'); + filterCard: true, + filterTarget(card, player, target) { + return ( + target != player && + target.hasZhuSkill("akane_yifu", player) && + !target.hasSkill("akane_yifu3") + ); }, - content(){ - 'step 0' - player.give(cards,target); - target.addTempSkill('akane_yifu3','phaseUseEnd'); + content() { + "step 0"; + player.give(cards, target); + target.addTempSkill("akane_yifu3", "phaseUseEnd"); target.draw(); - 'step 1' - if(target.countCards('h')>0) target.chooseCard('h',true,'交给'+get.translation(player)+'一张牌').set('ai',function(card){ - return 14-get.value(card); - }); + ("step 1"); + if (target.countCards("h") > 0) + target + .chooseCard("h", true, "交给" + get.translation(player) + "一张牌") + .set("ai", function (card) { + return 14 - get.value(card); + }); else event.finish(); - 'step 2' - target.give(result.cards,player); + ("step 2"); + target.give(result.cards, player); + }, + ai: { + expose: 0.3, + order: 10, + result: { + target: 5, + }, }, - ai:{ - expose:0.3, - order:10, - result:{ - target:5 - } - } }, - akane_yifu3:{charlotte:true}, - sasami_miaobian:{ - derivation:['sasami_gongqing','sasami_funan','sasami_baoqiu'], - init2(player){ - if(player.hp<=3) player.addSkill('sasami_gongqing'); - if(player.hp<=2) player.addSkill('sasami_funan'); - if(player.hp<=1) player.addSkill('sasami_baoqiu'); + akane_yifu3: { charlotte: true }, + sasami_miaobian: { + derivation: ["sasami_gongqing", "sasami_funan", "sasami_baoqiu"], + init2(player) { + if (player.hp <= 3) player.addSkill("sasami_gongqing"); + if (player.hp <= 2) player.addSkill("sasami_funan"); + if (player.hp <= 1) player.addSkill("sasami_baoqiu"); }, - trigger:{player:'changeHp'}, - firstDo:true, - silent:true, - content(){ + trigger: { player: "changeHp" }, + firstDo: true, + silent: true, + content() { lib.skill.sasami_miaobian.init2(player); }, }, - sasami_baoqiu:{ - line:{color:[173,149,206]}, - inherit:'rin_baoqiu' + sasami_baoqiu: { + line: { color: [173, 149, 206] }, + inherit: "rin_baoqiu", }, - "sasami_gongqing":{ - audio:true, - trigger:{ - player:["damageBegin3","damageBegin4"], + sasami_gongqing: { + audio: true, + trigger: { + player: ["damageBegin3", "damageBegin4"], }, - forced:true, - filter (event,player,name){ - if(!event.source) return false; - var range=event.source.getAttackRange(); - if(name=='damageBegin3') return range>3; - return event.num>1&&range<3; + forced: true, + filter(event, player, name) { + if (!event.source) return false; + var range = event.source.getAttackRange(); + if (name == "damageBegin3") return range > 3; + return event.num > 1 && range < 3; }, - content (){ - trigger.num=event.triggername=='damageBegin4'?1:trigger.num+1; + content() { + trigger.num = event.triggername == "damageBegin4" ? 1 : trigger.num + 1; }, - ai:{ - filterDamage:true, - skillTagFilter(player,tag,arg){ - if(arg&&arg.player){ - if(arg.player.hasSkillTag('jueqing',false,player)) return false; - if(arg.player.getAttackRange()<3) return true; + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + if (arg.player.getAttackRange() < 3) return true; } return false; - } - }, - }, - sasami_funan:{ - audio:2, - trigger:{global:['respond','useCard']}, - line:{color:[173,149,206]}, - filter(event,player){ - if(!event.respondTo) return false; - if(event.player==player) return false; - if(player!=event.respondTo[0]) return false; - if(!player.hasSkill('sasami_funan_jiexun')){ - var cards=[] - if(get.itemtype(event.respondTo[1])=='card') cards.push(event.respondTo[1]); - else if(event.respondTo[1].cards) cards.addArray(event.respondTo[1].cards); - return cards.filterInD('od').length>0; - } - else return event.cards.filterInD('od').length>0; - }, - logTarget:'player', - content(){ - 'step 0' - if(!player.hasSkill('sasami_funan_jiexun')){ - var cards=[] - if(get.itemtype(trigger.respondTo[1])=='card') cards.push(trigger.respondTo[1]); - else if(trigger.respondTo[1].cards) cards.addArray(trigger.respondTo[1].cards); - cards=cards.filterInD('od'); - trigger.player.gain(cards,'gain2','log').gaintag.add('sasami_funan'); - trigger.player.addTempSkill('sasami_funan_use'); - } - 'step 1' - var cards=trigger.cards.filterInD('od'); - player.gain(cards,'log','gain2'); - }, - subSkill:{ - use:{ - onremove(player){ - player.removeGaintag('sasami_funan'); - }, - charlotte:true, - mod:{ - cardEnabled2(card,player){ - if(get.itemtype(card)=='card'&&card.hasGaintag('sasami_funan')){ - return false; - } - } - } - } - } - }, - rin_baoqiu:{ - mod:{ - attackRange(rin,ball){ - return ball+2; }, }, - trigger:{player:'useCardToPlayered'}, - forced:true, - logTarget:'target', - filter(event,player){ - return event.card.name=='sha'; + }, + sasami_funan: { + audio: 2, + trigger: { global: ["respond", "useCard"] }, + line: { color: [173, 149, 206] }, + filter(event, player) { + if (!event.respondTo) return false; + if (event.player == player) return false; + if (player != event.respondTo[0]) return false; + if (!player.hasSkill("sasami_funan_jiexun")) { + var cards = []; + if (get.itemtype(event.respondTo[1]) == "card") cards.push(event.respondTo[1]); + else if (event.respondTo[1].cards) cards.addArray(event.respondTo[1].cards); + return cards.filterInD("od").length > 0; + } else return event.cards.filterInD("od").length > 0; }, - line:{color:[194,117,92]}, - content(){ - 'step 0' - player.judge(function(){return 0}); - 'step 1' - var target=trigger.target; - var map=trigger.customArgs; - var id=target.playerid; - if(!map[id]) map[id]={}; - if(result.color=='red'){ - if(!map[id].extraDamage) map[id].extraDamage=0; + logTarget: "player", + content() { + "step 0"; + if (!player.hasSkill("sasami_funan_jiexun")) { + var cards = []; + if (get.itemtype(trigger.respondTo[1]) == "card") cards.push(trigger.respondTo[1]); + else if (trigger.respondTo[1].cards) cards.addArray(trigger.respondTo[1].cards); + cards = cards.filterInD("od"); + trigger.player.gain(cards, "gain2", "log").gaintag.add("sasami_funan"); + trigger.player.addTempSkill("sasami_funan_use"); + } + ("step 1"); + var cards = trigger.cards.filterInD("od"); + player.gain(cards, "log", "gain2"); + }, + subSkill: { + use: { + onremove(player) { + player.removeGaintag("sasami_funan"); + }, + charlotte: true, + mod: { + cardEnabled2(card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("sasami_funan")) { + return false; + } + }, + }, + }, + }, + }, + rin_baoqiu: { + mod: { + attackRange(rin, ball) { + return ball + 2; + }, + }, + trigger: { player: "useCardToPlayered" }, + forced: true, + logTarget: "target", + filter(event, player) { + return event.card.name == "sha"; + }, + line: { color: [194, 117, 92] }, + content() { + "step 0"; + player.judge(function () { + return 0; + }); + ("step 1"); + var target = trigger.target; + var map = trigger.customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (result.color == "red") { + if (!map[id].extraDamage) map[id].extraDamage = 0; map[id].extraDamage++; } - if(result.color=='black'){ + if (result.color == "black") { trigger.directHit.add(target); } - if(result.suit=='spade'||result.suit=='heart'){ - var evt=trigger.getParent(); - if(evt.addCount!==false){ - evt.addCount=false; + if (result.suit == "spade" || result.suit == "heart") { + var evt = trigger.getParent(); + if (evt.addCount !== false) { + evt.addCount = false; player.getStat().card.sha--; } player.draw(); } - if(result.suit=='diamond'||result.suit=='club'){ - target.addTempSkill('fengyin'); - if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,'he',true); + if (result.suit == "diamond" || result.suit == "club") { + target.addTempSkill("fengyin"); + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true); } }, }, - sunohara_chengshuang:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + sunohara_chengshuang: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - group:'sunohara_chengshuang_phase', - forced:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + group: "sunohara_chengshuang_phase", + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ - 'step 0' - var evt=event.getParent('phase'); - if(evt&&evt.player==player) evt.sunohara_chengshuang=true; - player.chooseControl('male','female').set('prompt','成双:请选择自己的性别'); - 'step 1' - var sex=result.control; - game.broadcastAll(function(player,sex){ - player.sex=sex; - if(player.marks&&player.marks.sunohara_chengshuang) player.marks.sunohara_chengshuang.firstChild.innerHTML=sex=='male'?'♂':'♀'; - },player,sex); - game.log(player,'将性别变更为','#g'+get.translation(sex)+'性'); + content() { + "step 0"; + var evt = event.getParent("phase"); + if (evt && evt.player == player) evt.sunohara_chengshuang = true; + player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); + ("step 1"); + var sex = result.control; + game.broadcastAll( + function (player, sex) { + player.sex = sex; + if (player.marks && player.marks.sunohara_chengshuang) + player.marks.sunohara_chengshuang.firstChild.innerHTML = + sex == "male" ? "♂" : "♀"; + }, + player, + sex + ); + game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); }, - mark:true, - intro:{ - content(storage,player){ - if(player.sex=='unknown'||player.sex=='double') return '当前性别未确定'; - return '当前性别:'+get.translation(player.sex); + mark: true, + intro: { + content(storage, player) { + if (player.sex == "unknown" || player.sex == "double") return "当前性别未确定"; + return "当前性别:" + get.translation(player.sex); }, }, }, - sunohara_chengshuang_phase:{ - trigger:{ - player:'phaseBegin', + sunohara_chengshuang_phase: { + trigger: { + player: "phaseBegin", }, - filter(event,player){ - if(event.sunohara_chengshuang) return false; - return game.phaseNumber>1; + filter(event, player) { + if (event.sunohara_chengshuang) return false; + return game.phaseNumber > 1; }, - prompt2(event,player){ - if(player.sex=='unknown'||player.sex=='double') return '选择自己的性别'; - return '将自己的性别变更为'+(player.sex=='male'?'女性':'男性'); + prompt2(event, player) { + if (player.sex == "unknown" || player.sex == "double") return "选择自己的性别"; + return "将自己的性别变更为" + (player.sex == "male" ? "女性" : "男性"); }, - content(){ - 'step 0' - if(player.sex=='unknown'||player.sex=='double') player.chooseControl('male','female').set('prompt','成双:请选择自己的性别'); - else event._result={control:player.sex=='male'?'female':'male'}; - 'step 1' - var sex=result.control; - game.broadcastAll(function(player,sex){ - player.sex=sex; - if(player.marks&&player.marks.sunohara_chengshuang) player.marks.sunohara_chengshuang.firstChild.innerHTML=sex=='male'?'♂':'♀'; - },player,sex); - game.log(player,'将性别变更为','#g'+get.translation(sex)+'性'); + content() { + "step 0"; + if (player.sex == "unknown" || player.sex == "double") + player.chooseControl("male", "female").set("prompt", "成双:请选择自己的性别"); + else + event._result = { + control: player.sex == "male" ? "female" : "male", + }; + ("step 1"); + var sex = result.control; + game.broadcastAll( + function (player, sex) { + player.sex = sex; + if (player.marks && player.marks.sunohara_chengshuang) + player.marks.sunohara_chengshuang.firstChild.innerHTML = + sex == "male" ? "♂" : "♀"; + }, + player, + sex + ); + game.log(player, "将性别变更为", "#g" + get.translation(sex) + "性"); }, }, - sunohara_tiaoyin:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countGainableCards(player,'hej')>0; + sunohara_tiaoyin: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countGainableCards(player, "hej") > 0; }, - selectCard:[1,4], - filterCard(card){ - for(var i=0;i0) player.gainPlayerCard(target,'hej','visible'); + line: { color: [239, 204, 96] }, + content() { + if (target.countGainableCards(player, "hej") > 0) + player.gainPlayerCard(target, "hej", "visible"); }, - contentAfter(){ - var bool=false; - for(var i=0;i0)?1:-2; + return get.attitude(player, target) < 0 && target.countCards("h", "tao") > 0 + ? 1 + : -2; }, - } + }, }, }, - sunohara_jianren:{ - trigger:{player:'damageEnd'}, - line: {color:[145,149,179]}, - async cost(event, trigger, player){ - const num=(!trigger.source||trigger.source.isDead()||trigger.source.differentSexFrom(player))?3:1; - event.result = await player.chooseTarget(get.prompt('sunohara_jianren'),'令一名角色摸'+get.cnNumber(num)+'张牌。').set('ai',function(target){ - var att=get.attitude(player,target); - if(att<=0) return 0; - if(target.hasSkillTag('nogain')&&target!=_status.currentPhase) return 0.1; - return att/(1+0.1*target.countCards('h')); - }).forResult(); + sunohara_jianren: { + trigger: { player: "damageEnd" }, + line: { color: [145, 149, 179] }, + async cost(event, trigger, player) { + const num = + !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) + ? 3 + : 1; + event.result = await player + .chooseTarget( + get.prompt("sunohara_jianren"), + "令一名角色摸" + get.cnNumber(num) + "张牌。" + ) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.hasSkillTag("nogain") && target != _status.currentPhase) return 0.1; + return att / (1 + 0.1 * target.countCards("h")); + }) + .forResult(); }, - async content(event, trigger, player){ - const target =event.targets[0]; - const num = (!trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player)) ? 3 : 1; + async content(event, trigger, player) { + const target = event.targets[0]; + const num = + !trigger.source || trigger.source.isDead() || trigger.source.differentSexFrom(player) + ? 3 + : 1; target.draw(num); }, }, - shiina_qingshen:{ - audio:1, - trigger:{ - player:'damageEnd', - source:'damageSource', + shiina_qingshen: { + audio: 1, + trigger: { + player: "damageEnd", + source: "damageSource", }, - filter(event,player){ - return event.cards&&event.cards.filterInD().length>0; + filter(event, player) { + return event.cards && event.cards.filterInD().length > 0; }, - frequent:true, - content(){ - 'step 0' - var cards=trigger.cards.filterInD('od'); - player.gain(cards,'gain2','log'); - event.count=cards.length; - 'step 1' - var cards=player.getCards('he'); - if(cards.length==0){ + frequent: true, + content() { + "step 0"; + var cards = trigger.cards.filterInD("od"); + player.gain(cards, "gain2", "log"); + event.count = cards.length; + ("step 1"); + var cards = player.getCards("he"); + if (cards.length == 0) { event.finish(); return; - } - else if(cards.length<=event.count){ - event._result={bool:true,cards:cards}; - } - else player.chooseCard(true,'he',event.count,'请选择要置于武将牌上的牌'); - 'step 2' - if(result.bool&&result.cards.length){ - var cards=result.cards; - player.addToExpansion(cards,player,'give').gaintag.add('shiina_qingshen'); + } else if (cards.length <= event.count) { + event._result = { bool: true, cards: cards }; + } else player.chooseCard(true, "he", event.count, "请选择要置于武将牌上的牌"); + ("step 2"); + if (result.bool && result.cards.length) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("shiina_qingshen"); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - mod:{ - attackRange(from,num){ - return num+from.getExpansions('shiina_qingshen').length; + mod: { + attackRange(from, num) { + return num + from.getExpansions("shiina_qingshen").length; }, - maxHandcard(from,num){ - return num+from.getExpansions('shiina_qingshen').length; + maxHandcard(from, num) { + return num + from.getExpansions("shiina_qingshen").length; }, }, - ai:{ - notemp:true, + ai: { + notemp: true, }, }, - shiina_feiyan:{ - audio:1, - animalList:['key_inari','key_doruji'], - trigger:{global:'phaseBegin'}, - filter(event,player){ - if(lib.skill.shiina_feiyan.animalList.includes(event.player.name)) return false; - return player.getExpansions('shiina_qingshen').length>0&&player.inRange(event.player); + shiina_feiyan: { + audio: 1, + animalList: ["key_inari", "key_doruji"], + trigger: { global: "phaseBegin" }, + filter(event, player) { + if (lib.skill.shiina_feiyan.animalList.includes(event.player.name)) return false; + return player.getExpansions("shiina_qingshen").length > 0 && player.inRange(event.player); }, - async cost(event, trigger, player){ - const {result} = await player.chooseButton([get.prompt('shiina_feiyan',trigger.player),player.getExpansions('shiina_qingshen')]).set('goon',get.attitude(player,trigger.player)<0?1:-1).set('ai',function(){return _status.event.goon}); - if (result.bool) event.result = { - bool: true, - cards: result.links, - } + async cost(event, trigger, player) { + const { result } = await player + .chooseButton([ + get.prompt("shiina_feiyan", trigger.player), + player.getExpansions("shiina_qingshen"), + ]) + .set("goon", get.attitude(player, trigger.player) < 0 ? 1 : -1) + .set("ai", function () { + return _status.event.goon; + }); + if (result.bool) + event.result = { + bool: true, + cards: result.links, + }; }, - logTarget: 'player', - async content(event, trigger, player){ + logTarget: "player", + async content(event, trigger, player) { await player.loseToDiscardpile(event.cards); - const cardToUse = {name:'sha', isCard:true}; - if(lib.filter.targetEnabled(cardToUse, player, trigger.player)){ - const {card} = await player.useCard(cardToUse, trigger.player); + const cardToUse = { name: "sha", isCard: true }; + if (lib.filter.targetEnabled(cardToUse, player, trigger.player)) { + const { card } = await player.useCard(cardToUse, trigger.player); console.log(card); - if(!player.hasHistory('sourceDamage', function(evt){ - return evt.card === card; - })) await player.draw(); + if ( + !player.hasHistory("sourceDamage", function (evt) { + return evt.card === card; + }) + ) + await player.draw(); } }, - group:'shiina_retieji', - ai:{ - notemp:true, - combo:'shiina_feiyan' + group: "shiina_retieji", + ai: { + notemp: true, + combo: "shiina_feiyan", }, }, - shiina_retieji:{ - audio:1, - shaRelated:true, - trigger:{player:'useCardToPlayered'}, - check(event,player){ - return get.attitude(player,event.target)<0; + shiina_retieji: { + audio: 1, + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + check(event, player) { + return get.attitude(player, event.target) < 0; }, - filter(event,player){ - return event.card.name=='sha' && event.getParent(2).name == 'shiina_feiyan'; + filter(event, player) { + return event.card.name == "sha" && event.getParent(2).name == "shiina_feiyan"; }, - logTarget:'target', - content(){ - "step 0" - player.judge(function(){return 0}); - if(!trigger.target.hasSkill('fengyin')){ - trigger.target.addTempSkill('fengyin'); + logTarget: "target", + content() { + "step 0"; + player.judge(function () { + return 0; + }); + if (!trigger.target.hasSkill("fengyin")) { + trigger.target.addTempSkill("fengyin"); } - "step 1" - var suit=get.suit(result.card); - var target=trigger.target; - var num=target.countCards('h','shan'); - target.chooseToDiscard('请弃置一张'+get.translation(suit)+'牌,否则不能使用闪抵消此杀','he',function(card){ - return get.suit(card)==_status.event.suit; - }).set('ai',function(card){ - var num=_status.event.num; - if(num==0) return 0; - if(card.name=='shan') return num>1?2:0; - return 8-get.value(card); - }).set('num',num).set('suit',suit); - "step 2" - if(!result.bool){ + ("step 1"); + var suit = get.suit(result.card); + var target = trigger.target; + var num = target.countCards("h", "shan"); + target + .chooseToDiscard( + "请弃置一张" + get.translation(suit) + "牌,否则不能使用闪抵消此杀", + "he", + function (card) { + return get.suit(card) == _status.event.suit; + } + ) + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return 8 - get.value(card); + }) + .set("num", num) + .set("suit", suit); + ("step 2"); + if (!result.bool) { trigger.getParent().directHit.add(trigger.target); } - } - }, - inari_baiwei:{ - enable:['chooseToUse','chooseToRespond'], - hiddenCard(player,name){ - return name!='du'&&get.type(name)=='basic'&&player.countCards('hes',{suit:'diamond'})>0; }, - filter(event,player){ - if(event.type=='wuxie'||!player.countCards('hse',{suit:'diamond'})) return false; - for(var i=0;i 0 + ); + }, + filter(event, player) { + if (event.type == "wuxie" || !player.countCards("hse", { suit: "diamond" })) return false; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if ( + name != "du" && + get.type(name) == "basic" && + event.filterCard(get.autoViewAs({ name: name }, "unsure"), player, event) + ) + return true; } return false; }, - chooseButton:{ - dialog(event,player){ - var list=[]; - for(var i=0;i0) return get.order(fakecard); + check(button) { + if (_status.event.getParent().type == "phase") { + var player = _status.event.player; + var fakecard = { + name: button.link[2], + nature: button.link[3], + }; + if (player.getUseValue(fakecard) > 0) return get.order(fakecard); return 0; } return 1; }, - backup(links,player){ + backup(links, player) { return { - selectCard:1, - filterCard:{suit:'diamond'}, - popname:true, - check(card){ - if(get.type(card)=='basic') return 6; - return 1/Math.max(0.1,get.value(card)); + selectCard: 1, + filterCard: { suit: "diamond" }, + popname: true, + check(card) { + if (get.type(card) == "basic") return 6; + return 1 / Math.max(0.1, get.value(card)); }, - position:'hse', - viewAs:{name:links[0][2],nature:links[0][3]}, - } + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + }; + }, + prompt(links, player) { + return ( + "将一张♦牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用或打出" + ); }, - prompt(links,player){ - return '将一张♦牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用或打出'; - } }, - ai:{ - order(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0 - for(var i=0;i0){ - var temp=get.order({name:name}); - if(temp>max) max=temp; + ai: { + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + for (var i = 0; i < lib.inpile.length; i++) { + var name = lib.inpile[i]; + if (get.type(name) == "basic" && player.getUseValue({ name: name }) > 0) { + var temp = get.order({ name: name }); + if (temp > max) max = temp; } } - if(max>0) max+=0.5; + if (max > 0) max += 0.5; return max; } return 4; }, - result:{ - player:1, + result: { + player: 1, }, - respondSha:true, - fireAttack:true, - skillTagFilter(player,tag){ - return tag=='fireAttack'||player.countCards('he',{suit:'diamond'})>0; + respondSha: true, + fireAttack: true, + skillTagFilter(player, tag) { + return tag == "fireAttack" || player.countCards("he", { suit: "diamond" }) > 0; }, }, - group:['inari_baiwei_draw'], + group: ["inari_baiwei_draw"], }, - inari_baiwei_draw:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - popup:false, - filter(event,player){ - return event.skill&&event.skill.indexOf('inari_baiwei')==0; + inari_baiwei_draw: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + filter(event, player) { + return event.skill && event.skill.indexOf("inari_baiwei") == 0; + }, + content() { + player.draw(); }, - content(){player.draw()}, }, - inari_huhun:{ - mod:{ - suit(card,suit){ - if(suit=='club') return 'diamond'; + inari_huhun: { + mod: { + suit(card, suit) { + if (suit == "club") return "diamond"; }, - maxHandcard(player,num){ - return num+1; + maxHandcard(player, num) { + return num + 1; }, - } + }, }, - saya_powei:{ - audio:2, - trigger:{player:'phaseAfter'}, - locked:true, - limited:true, - unique:true, - skillAnimation:true, - animationColor:'metal', - filter(event,player){ - return event.type!='saya_powei'&&game.hasPlayer(function(current){ - return current.hp>player.hp; - }); + saya_powei: { + audio: 2, + trigger: { player: "phaseAfter" }, + locked: true, + limited: true, + unique: true, + skillAnimation: true, + animationColor: "metal", + filter(event, player) { + return ( + event.type != "saya_powei" && + game.hasPlayer(function (current) { + return current.hp > player.hp; + }) + ); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt2('saya_powei'),function(card,saya,kyousuke){ - return kyousuke.hp>saya.hp; - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>=-2) return 0; - if(target!=get.zhu(target)&&player.hasUnknown()) return 0; - if(target.getEquip(3)&&!player.getEquip(4)) att/=2; - if(player.hp<=1) att*=1.5; - return -att; - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("saya_powei"), function (card, saya, kyousuke) { + return kyousuke.hp > saya.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att >= -2) return 0; + if (target != get.zhu(target) && player.hasUnknown()) return 0; + if (target.getEquip(3) && !player.getEquip(4)) att /= 2; + if (player.hp <= 1) att *= 1.5; + return -att; + }) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const target = event.targets[0]; - player.awakenSkill('saya_powei'); + player.awakenSkill("saya_powei"); game.asyncDelay(3); - var next = game.createEvent('saya_powei_loop',false,trigger); + var next = game.createEvent("saya_powei_loop", false, trigger); next.playertrue = player; next.playerfalse = target; next.setContent(lib.skill.saya_powei.content2); }, - content2(){ - 'step 0' - event.count=0; - event.stat=true; - event.current=event['player'+event.stat]; - game.countPlayer2(function(current){ - if(current!=event.playertrue&¤t!=event.playerfalse) current.addSkill('saya_nodis'); + content2() { + "step 0"; + event.count = 0; + event.stat = true; + event.current = event["player" + event.stat]; + game.countPlayer2(function (current) { + if (current != event.playertrue && current != event.playerfalse) + current.addSkill("saya_nodis"); }); - event.playertrue.addSkill('saya_judge'); - 'step 1' + event.playertrue.addSkill("saya_judge"); + ("step 1"); event.count++; - event.current.phase().set('type','saya_powei'); - 'step 2' - if(event.count==9||event.playertrue.isDead()||event.playerfalse.isDead()){ - game.countPlayer2(function(current){ - current.removeSkill('saya_nodis'); - current.removeSkill('saya_judge'); + event.current.phase().set("type", "saya_powei"); + ("step 2"); + if (event.count == 9 || event.playertrue.isDead() || event.playerfalse.isDead()) { + game.countPlayer2(function (current) { + current.removeSkill("saya_nodis"); + current.removeSkill("saya_judge"); }); - } - else{ - event.stat=!event.stat; - event.current=event['player'+event.stat]; + } else { + event.stat = !event.stat; + event.current = event["player" + event.stat]; event.goto(1); } - } - }, - saya_nodis:{ - group:'undist', - mark:true, - intro:{content:'不计入距离和座次的计算'}, - }, - saya_judge:{ - trigger:{player:'phaseBegin'}, - forced:true, - popup:false, - filter(event,player){ - return event.type=='saya_powei'&&player==event.getParent().playertrue; }, - content(){ - 'step 0' - player.judge(function(card){ - return get.color(card)=='red'?5:0; - }).judge2=function(result){ - return result.bool?true:false; + }, + saya_nodis: { + group: "undist", + mark: true, + intro: { content: "不计入距离和座次的计算" }, + }, + saya_judge: { + trigger: { player: "phaseBegin" }, + forced: true, + popup: false, + filter(event, player) { + return event.type == "saya_powei" && player == event.getParent().playertrue; + }, + content() { + "step 0"; + player.judge(function (card) { + return get.color(card) == "red" ? 5 : 0; + }).judge2 = function (result) { + return result.bool ? true : false; }; - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { player.line(trigger.getParent().playerfalse); trigger.getParent().playerfalse.damage(); } }, }, - saya_shouji:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter(event,player){ - return event.cards.filterInD().length>0; + saya_shouji: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + return event.cards.filterInD().length > 0; }, - usable:1, - async cost(event, trigger, player){ - const goon = function(){ - var num=0; - var cards=trigger.cards.filterInD(); - for(var i=0;inum; - })==0; - }(); - event.result = await player.chooseTarget(get.prompt2('saya_shouji'),lib.filter.notMe).set('ai',function(target){ - if(!_status.event.goon) return 0; - var player=_status.event.player; - var cards=_status.event.getTrigger().cards.filterInD(); - var att=get.attitude(player,target); - var num=0; - for(var i=0;i num; + }) == 0 + ); + })(); + event.result = await player + .chooseTarget(get.prompt2("saya_shouji"), lib.filter.notMe) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var player = _status.event.player; + var cards = _status.event.getTrigger().cards.filterInD(); + var att = get.attitude(player, target); + var num = 0; + for (var i = 0; i < cards.length; i++) { + num += target.getUseValue(cards[i]); + } + return Math.max(num, 0.1) * att; + }) + .set("goon", goon) + .forResult(); }, - content(){ - 'step 0' - event.cards=trigger.cards.filterInD(); - var target=targets[0]; - event.target=target; - target.gain(event.cards,'gain2','log'); - 'step 2' + content() { + "step 0"; + event.cards = trigger.cards.filterInD(); + var target = targets[0]; + event.target = target; + target.gain(event.cards, "gain2", "log"); + ("step 2"); target.chooseToUse({ - cards:cards, - filterCard(card){ - if(get.itemtype(card)!='card'||!_status.event.cards||!_status.event.cards.includes(card)) return false; - return lib.filter.filterCard.apply(this,arguments); + cards: cards, + filterCard(card) { + if ( + get.itemtype(card) != "card" || + !_status.event.cards || + !_status.event.cards.includes(card) + ) + return false; + return lib.filter.filterCard.apply(this, arguments); }, - prompt:'是否使用得到的牌中的一张?', + prompt: "是否使用得到的牌中的一张?", }); - 'step 3' - if(result.bool) player.draw(); + ("step 3"); + if (result.bool) player.draw(); }, }, - haruka_shuangche:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return !player.hasSkill('haruka_kanata'); + haruka_shuangche: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return !player.hasSkill("haruka_kanata"); }, - chooseButton:{ - dialog(event,player){ - var list=[]; - for(var i=0;i0) return 0; - if(['wugu','zhulu_card'].includes(button.link[2])) return 0; - var effect=player.getUseValue(button.link[2]); - if(effect>0) return effect; + check(button) { + var player = _status.event.player; + if (player.countCards("h", button.link[2]) > 0) return 0; + if (["wugu", "zhulu_card"].includes(button.link[2])) return 0; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; return 0; }, - backup(links,player){ + backup(links, player) { return { - audio:'haruka_shuangche', - filterCard(){return false}, - selectCard:-1, - popname:true, - check(card){ - return 6-get.value(card); + audio: "haruka_shuangche", + filterCard() { + return false; }, - position:'he', - viewAs:{name:links[0][2],nature:links[0][3],isCard:true}, - } + selectCard: -1, + popname: true, + check(card) { + return 6 - get.value(card); + }, + position: "he", + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + }, + }; + }, + prompt(links, player) { + return ( + "请选择" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "的目标" + ); }, - prompt(links,player){ - return '请选择'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'的目标'; - } }, - ai:{ - order:1, - result:{ - player(player){ - var cards=player.getCards('he').sort(function(a,b){ - return get.value(a)-get.value(b); + ai: { + order: 1, + result: { + player(player) { + var cards = player.getCards("he").sort(function (a, b) { + return get.value(a) - get.value(b); }); - var num=(player.getStat('skill').haruka_shuangche||0)+1; - if(player.needsToDiscard()>=num) return 1; - if(player.hp>2) return 1; - if(cards.length>=num){ - var val=0; - for(var i=0;i= num) return 1; + if (player.hp > 2) return 1; + if (cards.length >= num) { + var val = 0; + for (var i = 0; i < cards.length; i++) { + val += get.value(cards[i]); } - return 12-val; + return 12 - val; } return 0; - } + }, }, - fireAttack:true, + fireAttack: true, }, - group:'kanata_shuangche', + group: "kanata_shuangche", }, - kanata_shuangche:{ - trigger:{player:'useCardAfter'}, - forced:true, - filter(event,player){ - return event.skill=='haruka_shuangche_backup'; + kanata_shuangche: { + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return event.skill == "haruka_shuangche_backup"; }, - content(){ - 'step 0' - var num=player.getStat('skill').haruka_shuangche||1; - player.chooseToDiscard('###双掣:请选择一项###选择弃置'+get.cnNumber(num)+'张牌,或失去1点体力且令〖双掣〗失效至回合结束',num,'he').set('ai',function(card){ - var total=12; - for(var i=0;i0; + tsumugi_huilang: { + trigger: { player: "phaseEnd" }, + charlotte: true, + line: { color: [253, 198, 116] }, + filter(event, player) { + return player.countCards("he") > 0; }, - async cost(event, trigger, player){ - event.result = await player.chooseCard('he',[1,player.countCards('he')],get.prompt2('tsumugi_huilang')).set('ai',function(card){ - if(get.position(card)!='h') return -1; - if(!['shan','wuxie','caochuan'].includes(get.name(card))) return 9; - return 5-get.value(card); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseCard("he", [1, player.countCards("he")], get.prompt2("tsumugi_huilang")) + .set("ai", function (card) { + if (get.position(card) != "h") return -1; + if (!["shan", "wuxie", "caochuan"].includes(get.name(card))) return 9; + return 5 - get.value(card); + }) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const cards = event.cards; - player.addSkill('tsumugi_huilang2'); - player.addToExpansion('giveAuto', cards, player).gaintag.add('tsumugi_huilang2'); + player.addSkill("tsumugi_huilang2"); + player.addToExpansion("giveAuto", cards, player).gaintag.add("tsumugi_huilang2"); }, }, - tsumugi_huilang2:{ - charlotte:true, - marktext:'隐', - intro:{content:'隐藏于回廊之牌',markcount:'expansion'}, - onremove(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + tsumugi_huilang2: { + charlotte: true, + marktext: "隐", + intro: { content: "隐藏于回廊之牌", markcount: "expansion" }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - trigger:{player:'phaseBegin'}, - forced:true, - filter(event,player){ - return player.getExpansions('tsumugi_huilang2').length>0; + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.getExpansions("tsumugi_huilang2").length > 0; }, - content(){ - 'step 0' - var cards=player.getExpansions('tsumugi_huilang2'); - event.num=cards.length; - player.gain(cards,'draw'); - 'step 1' - player.chooseTarget([1,num],'是否令至多'+get.cnNumber(num)+'名角色各摸一张牌?').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 2' - if(result.bool){ - var targets=result.targets; - player.line(targets,lib.skill.tsumugi_huilang.line); + content() { + "step 0"; + var cards = player.getExpansions("tsumugi_huilang2"); + event.num = cards.length; + player.gain(cards, "draw"); + ("step 1"); + player + .chooseTarget([1, num], "是否令至多" + get.cnNumber(num) + "名角色各摸一张牌?") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 2"); + if (result.bool) { + var targets = result.targets; + player.line(targets, lib.skill.tsumugi_huilang.line); targets.sortBySeat(); game.asyncDraw(targets); - } - else event.finish(); - 'step 3' + } else event.finish(); + ("step 3"); game.delay(); }, }, - yui_jiang:{ - shaRelated:true, - audio:2, - audioname:['sp_lvmeng','re_sunben','re_sunce'], - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + yui_jiang: { + shaRelated: true, + audio: 2, + audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - filter(event,player){ - if(!(event.card.name=='juedou'||(event.card.name=='sha'&&get.color(event.card)=='red'))) return false; - return player==event.target||event.getParent().triggeredTargets3.length==1; + filter(event, player) { + if ( + !( + event.card.name == "juedou" || + (event.card.name == "sha" && get.color(event.card) == "red") + ) + ) + return false; + return player == event.target || event.getParent().triggeredTargets3.length == 1; }, - frequent:true, - content(){ + frequent: true, + content() { player.draw(); }, - ai:{ - effect:{ - target(card,player,target){ - if(card.name=='sha'&&get.color(card)=='red') return [1,0.6]; + ai: { + effect: { + target(card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; }, - player(card,player,target){ - if(card.name=='sha'&&get.color(card)=='red') return [1,1]; - } - } - } + player(card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 1]; + }, + }, + }, }, - yui_lieyin:{ - trigger:{player:'phaseUseBegin'}, - locked:true, - async cost(event, trigger, player){ - const list=[]; - if(player.storage._ichiban_no_takaramono) list.push('cancel2'); - const {control, index} = await player.chooseControl(...list).set('choiceList',[ - '令此阶段内的所有红色牌视为【杀】', - '令此阶段内的所有【杀】视为【决斗】' - ]).set('prompt',player.storage._ichiban_no_takaramono?get.prompt('yui_lieyin'):'烈音:请选择一项').set('ai',function(){ - var player=_status.event.player; - var shas=player.countCards('h','sha') - if(shas>0){ - if(game.hasPlayer(function(current){ - return get.attitude(player,current)<0&&player.canUse('juedou',current)&&!current.hasSha()&&get.effect(current,{name:'juedou'},player,player)>0; - })) return 1; - if(player.storage._ichiban_no_takaramono) return 'cancel2'; - } - if(player.countCards('h',function(card){ - return get.color(card)=='red'&&card.name!='sha'&&player.hasValueTarget(card); - })==0) return 0; - if(player.storage._ichiban_no_takaramono) return 'cancel2'; - return 1; - }).forResult(); - if (control !== 'cancel2'){ + yui_lieyin: { + trigger: { player: "phaseUseBegin" }, + locked: true, + async cost(event, trigger, player) { + const list = []; + if (player.storage._ichiban_no_takaramono) list.push("cancel2"); + const { control, index } = await player + .chooseControl(...list) + .set("choiceList", [ + "令此阶段内的所有红色牌视为【杀】", + "令此阶段内的所有【杀】视为【决斗】", + ]) + .set( + "prompt", + player.storage._ichiban_no_takaramono + ? get.prompt("yui_lieyin") + : "烈音:请选择一项" + ) + .set("ai", function () { + var player = _status.event.player; + var shas = player.countCards("h", "sha"); + if (shas > 0) { + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + player.canUse("juedou", current) && + !current.hasSha() && + get.effect(current, { name: "juedou" }, player, player) > 0 + ); + }) + ) + return 1; + if (player.storage._ichiban_no_takaramono) return "cancel2"; + } + if ( + player.countCards("h", function (card) { + return ( + get.color(card) == "red" && + card.name != "sha" && + player.hasValueTarget(card) + ); + }) == 0 + ) + return 0; + if (player.storage._ichiban_no_takaramono) return "cancel2"; + return 1; + }) + .forResult(); + if (control !== "cancel2") { event.result = { bool: true, - cost_data: {index} - } + cost_data: { index }, + }; } }, - async content(event, trigger, player){ - player.addTempSkill(`yui_lieyin${event.cost_data.index}`,'phaseUseEnd') + async content(event, trigger, player) { + player.addTempSkill(`yui_lieyin${event.cost_data.index}`, "phaseUseEnd"); }, }, - yui_lieyin0:{ - mod:{ - cardname(card){ - if(get.color(card)=='red') return 'sha'; + yui_lieyin0: { + mod: { + cardname(card) { + if (get.color(card) == "red") return "sha"; }, }, }, - yui_lieyin1:{ - mod:{ - cardname(card){ - if(card.name=='sha') return 'juedou'; + yui_lieyin1: { + mod: { + cardname(card) { + if (card.name == "sha") return "juedou"; }, }, }, - yui_takaramono:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - unique:true, - juexingji:true, - skillAnimation:true, - animationColor:'key', - filter(event,player){ - var num=0; - if(player.hp<=1) num++; - if(game.dead.length>0) num++; - if(num!=1) return num>1; - var draw=0; - player.getAllHistory('gain',function(evt){ - if(evt.getParent(2).name=='yui_jiang') draw+=evt.cards.length; + yui_takaramono: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "key", + filter(event, player) { + var num = 0; + if (player.hp <= 1) num++; + if (game.dead.length > 0) num++; + if (num != 1) return num > 1; + var draw = 0; + player.getAllHistory("gain", function (evt) { + if (evt.getParent(2).name == "yui_jiang") draw += evt.cards.length; }); - return draw>=3; + return draw >= 3; }, - content(){ - player.awakenSkill('yui_takaramono'); - player.addSkills('yui_yinhang'); - player.storage._ichiban_no_takaramono=true; + content() { + player.awakenSkill("yui_takaramono"); + player.addSkills("yui_yinhang"); + player.storage._ichiban_no_takaramono = true; player.gainMaxHp(); player.recover(); }, - derivation:'yui_yinhang', + derivation: "yui_yinhang", }, - yui_yinhang:{ - trigger:{player:'changeHp'}, - locked:true, - getIndex:(event)=>Math.abs(event.num), - line:{color:[253, 153, 182]}, - async cost(event, trigger, player){ - event.result = await player.chooseTarget([1,2],get.prompt('yui_yinhang'),'令至多两名角色各摸一张牌').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).forResult(); + yui_yinhang: { + trigger: { player: "changeHp" }, + locked: true, + getIndex: (event) => Math.abs(event.num), + line: { color: [253, 153, 182] }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget([1, 2], get.prompt("yui_yinhang"), "令至多两名角色各摸一张牌") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const targets = event.targets; targets.sortBySeat(); game.asyncDraw(targets); }, }, - yoshino_jueyi:{ - trigger:{player:'phaseUseBegin'}, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(lib.filter.notMe,get.prompt2('yoshino_jueyi')).set('ai',function(target){ - var player=_status.event.player; - if(get.damageEffect(target,player,player)<0) return 0; - var att=get.attitude(player,target); - if(att>0) return 0; - if(att==0) return 0.1; - var eff=0; - var hs=player.getCards('h'); - for(var i=0;i0) eff+=eff2; + yoshino_jueyi: { + trigger: { player: "phaseUseBegin" }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(lib.filter.notMe, get.prompt2("yoshino_jueyi")) + .set("ai", function (target) { + var player = _status.event.player; + if (get.damageEffect(target, player, player) < 0) return 0; + var att = get.attitude(player, target); + if (att > 0) return 0; + if (att == 0) return 0.1; + var eff = 0; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + if (player.canUse(hs[i], target)) { + var eff2 = get.effect(target, hs[i], player, player); + if (eff2 > 0) eff += eff2; + } } - } - return -att/(1+eff); - }).forResult(); + return -att / (1 + eff); + }) + .forResult(); }, - content(){ - 'step 0' - var target=targets[0]; - event.target=target; + content() { + "step 0"; + var target = targets[0]; + event.target = target; player.draw(); - 'step 1' + ("step 1"); player.chooseToPSS(target); - 'step 2' - if(result.tie) event.goto(1); - else if(result.bool) target.damage(); - else target.addTempSkill('yoshino_fail','phaseUseEnd'); + ("step 2"); + if (result.tie) event.goto(1); + else if (result.bool) target.damage(); + else target.addTempSkill("yoshino_fail", "phaseUseEnd"); }, }, - yoshino_fail:{ - mod:{ - targetEnabled(card,player,target){ - if(player==_status.currentPhase) return false; + yoshino_fail: { + mod: { + targetEnabled(card, player, target) { + if (player == _status.currentPhase) return false; }, }, }, - kengo_weishang:{ - locked:false, - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha'&&player.hasDisabledSlot(1)) return num+1; + kengo_weishang: { + locked: false, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha" && player.hasDisabledSlot(1)) return num + 1; }, - globalFrom(from,to,distance){ - if(from.hasDisabledSlot(4)) return distance-1; + globalFrom(from, to, distance) { + if (from.hasDisabledSlot(4)) return distance - 1; }, - globalTo(from,to,distance){ - if(to.hasDisabledSlot(3)) return distance+1; + globalTo(from, to, distance) { + if (to.hasDisabledSlot(3)) return distance + 1; }, }, - enable:'phaseUse', - usable:1, - filter(event,player){ - var list=['equip1','equip2','equip3','equip4','equip5']; - for(var i=0;i0 - })) return 'equip1'; - if(list.includes('equip3')&&player.hasEmptySlot('equip3')) return 'equip3'; - if(list.includes('equip4')&&player.hasEmptySlot('equip4')) return 'equip4'; - if(list.includes('equip5')&&player.hasEmptySlot('equip5')) return 'equip5'; - if(list.includes('equip2')&&player.hasEmptySlot('equip2')) return 'equip2'; + player.chooseControl(list).set("prompt", "请选择废除一个装备栏").ai = function () { + if ( + list.includes("equip1") && + player.hasEmptySlot("equip1") && + player.countCards("h", function (card) { + return card.name == "sha" && player.getUseValue(card) > 0; + }) + ) + return "equip1"; + if (list.includes("equip3") && player.hasEmptySlot("equip3")) return "equip3"; + if (list.includes("equip4") && player.hasEmptySlot("equip4")) return "equip4"; + if (list.includes("equip5") && player.hasEmptySlot("equip5")) return "equip5"; + if (list.includes("equip2") && player.hasEmptySlot("equip2")) return "equip2"; return list.randomGet(); }; - 'step 1' + ("step 1"); player.disableEquip(result.control); player.draw(2); }, - group:['kengo_weishang_sha','kengo_weishang_shan'], - ai:{ - order:10, - result:{player:1}, + group: ["kengo_weishang_sha", "kengo_weishang_shan"], + ai: { + order: 10, + result: { player: 1 }, }, }, - kengo_weishang_sha:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'&&player.hasDisabledSlot(1)&&event.target.countCards('he')>0; + kengo_weishang_sha: { + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return ( + event.card.name == "sha" && + player.hasDisabledSlot(1) && + event.target.countCards("he") > 0 + ); }, - logTarget:'target', - content(){ - trigger.target.chooseToDiscard('he',true); + logTarget: "target", + content() { + trigger.target.chooseToDiscard("he", true); }, }, - kengo_weishang_shan:{ - enable:['chooseToUse','chooseToRespond'], - viewAs:{name:'shan'}, - filterCard:true, - position:'hes', - prompt:'将一张牌当做闪使用或打出', - viewAsFilter(player){ - return player.hasDisabledSlot(2)&&player.countCards('hes')>0; + kengo_weishang_shan: { + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "shan" }, + filterCard: true, + position: "hes", + prompt: "将一张牌当做闪使用或打出", + viewAsFilter(player) { + return player.hasDisabledSlot(2) && player.countCards("hes") > 0; }, - check(card){ - return 1/Math.max(0.1,get.value(card)); + check(card) { + return 1 / Math.max(0.1, get.value(card)); }, - ai:{ - respondShan:true, - skillTagFilter(player){ - return player.hasDisabledSlot(2)&&player.countCards('he')>0; + ai: { + respondShan: true, + skillTagFilter(player) { + return player.hasDisabledSlot(2) && player.countCards("he") > 0; }, }, }, - kengo_guidui:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter(event,player){ - return player.countDisabledSlot()>0; + kengo_guidui: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter(event, player) { + return player.countDisabledSlot() > 0; }, - content(){ - var list=[]; - for(var i=1;i<=5;i++){ - for(var j=0;jMath.abs(event.num), - async cost(event, trigger, player){ - event.result = await player.chooseTarget([1,2],get.prompt('iwasawa_yinhang'),'令至多两名角色各摸一张牌').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).forResult(); + kengo_guidui2: { onremove: true }, + iwasawa_yinhang: { + trigger: { player: "changeHp" }, + locked: true, + line: { color: [235, 96, 138] }, + getIndex: (event) => Math.abs(event.num), + async cost(event, trigger, player) { + event.result = await player + .chooseTarget([1, 2], get.prompt("iwasawa_yinhang"), "令至多两名角色各摸一张牌") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const targets = event.targets; targets.sortBySeat(); game.asyncDraw(targets); }, }, - iwasawa_mysong:{ - trigger:{player:['phaseBeginStart','phaseAfter','dyingBefore']}, - forced:true, - filter(event,player){ - return event.name=='dying'||player.hp<1; + iwasawa_mysong: { + trigger: { + player: ["phaseBeginStart", "phaseAfter", "dyingBefore"], }, - content(){ - if(trigger.name=='dying') trigger.cancel(); - else if(event.triggername=='phaseBeginStart') player.addTempSkill('iwasawa_fenyin'); + forced: true, + filter(event, player) { + return event.name == "dying" || player.hp < 1; + }, + content() { + if (trigger.name == "dying") trigger.cancel(); + else if (event.triggername == "phaseBeginStart") player.addTempSkill("iwasawa_fenyin"); else player.die(); }, - nobracket:true, - derivation:'iwasawa_fenyin', + nobracket: true, + derivation: "iwasawa_fenyin", }, - iwasawa_refenyin:{ - audio:2, - audioname2:{ - wufan:'refenyin_wufan', + iwasawa_refenyin: { + audio: 2, + audioname2: { + wufan: "refenyin_wufan", }, - trigger:{global:['loseAfter','cardsDiscardAfter','equipAfter']}, - forced:true, - filter(event,player){ - if(player!=_status.currentPhase) return false; - var cards=event.getd(); - var list=[]; - for(var i=0;i0; + return list.length > 0; }, - content(){ - var list=[]; - var list2=[]; - var cards=trigger.getd(); - for(var i=0;i=0?0:1).set('ai',function(){return _status.event.choice}); - 'step 1' - if(result.control=='增加伤害'){ + masato_baoquan: { + trigger: { source: "damageBefore" }, + forced: true, + content() { + "step 0"; + player + .chooseControl("防止伤害", "增加伤害") + .set( + "prompt", + "暴拳:防止即将对" + + get.translation(trigger.player) + + "造成的伤害,或失去1点体力上限并令此伤害+2" + ) + .set("choice", get.attitude(player, trigger.player) >= 0 ? 0 : 1) + .set("ai", function () { + return _status.event.choice; + }); + ("step 1"); + if (result.control == "增加伤害") { player.loseMaxHp(); - trigger.num+=2; - } - else trigger.cancel(); + trigger.num += 2; + } else trigger.cancel(); }, - ai:{ - effect:{ - player(card,player,target){ - if(target&&get.attitude(player,target)>0&&get.tag(card,'damage')) return 'zeroplayertarget'; + ai: { + effect: { + player(card, player, target) { + if (target && get.attitude(player, target) > 0 && get.tag(card, "damage")) + return "zeroplayertarget"; }, }, }, }, - yusa_yanyi:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return get.distance(player,target)<=player.hp; + yusa_yanyi: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return get.distance(player, target) <= player.hp; }, - selectTarget(){ - return [1,Math.max(_status.event.player.getAttackRange())]; + selectTarget() { + return [1, Math.max(_status.event.player.getAttackRange())]; }, - line:'thunder', - content(){ - 'step 0' - if(target.isHealthy()){ + line: "thunder", + content() { + "step 0"; + if (target.isHealthy()) { player.draw(); event.finish(); + } else { + var name = get.translation(player); + target + .chooseControl() + .set("choiceList", [ + "令" + name + "摸一张牌", + "回复1点体力,然后交给" + name + "一张牌", + ]) + .set("ai", function () { + return 1; + }); } - else{ - var name=get.translation(player); - target.chooseControl().set('choiceList',[ - '令'+name+'摸一张牌', - '回复1点体力,然后交给'+name+'一张牌', - ]).set('ai',function(){ - return 1; - }); - } - 'step 1' - if(result.index==0){ + ("step 1"); + if (result.index == 0) { player.draw(); event.finish(); - } - else{ + } else { target.recover(); } - 'step 2' - if(target!=player&&target.countCards('he')>0){ - target.chooseCard('交给'+get.translation(player)+'一张牌','he',true); - } - else event.finish(); - 'step 3' - target.give(result.cards,player,'giveAuto'); + ("step 2"); + if (target != player && target.countCards("he") > 0) { + target.chooseCard("交给" + get.translation(player) + "一张牌", "he", true); + } else event.finish(); + ("step 3"); + target.give(result.cards, player, "giveAuto"); }, - ai:{ - order:10, - result:{ - player(player,target){ - return target.isHealthy()?1:0; + ai: { + order: 10, + result: { + player(player, target) { + return target.isHealthy() ? 1 : 0; }, - target(player,target){ - if(target.isHealthy()) return 0; - return get.recoverEffect(target,player,target); + target(player, target) { + if (target.isHealthy()) return 0; + return get.recoverEffect(target, player, target); }, }, }, }, - yusa_misa:{ - charlotte:true, - trigger:{player:'useSkillAfter'}, - filter(event,player){ - return event.skill=='yusa_yanyi'&&!player.storage.dualside_over&&Array.isArray(player.storage.dualside); + yusa_misa: { + charlotte: true, + trigger: { player: "useSkillAfter" }, + filter(event, player) { + return ( + event.skill == "yusa_yanyi" && + !player.storage.dualside_over && + Array.isArray(player.storage.dualside) + ); }, - content(){ + content() { player.turnOver(); }, }, - misa_yusa:{ - charlotte:true, - trigger:{player:'misa_yehuoAfter'}, - filter(event,player){ - return event.bool===true&&!player.storage.dualside_over&&Array.isArray(player.storage.dualside); + misa_yusa: { + charlotte: true, + trigger: { player: "misa_yehuoAfter" }, + filter(event, player) { + return ( + event.bool === true && + !player.storage.dualside_over && + Array.isArray(player.storage.dualside) + ); }, - content(){ + content() { player.turnOver(); }, }, - misa_yehuo:{ - charlotte:true, - trigger:{global:'phaseDrawBegin1'}, - locked:true, - line:{color:[236,137,52]}, - filter(event,player){ - var target=event.player; - return player.inRange(target)&&player.countCards('he')>=get.distance(player,target); + misa_yehuo: { + charlotte: true, + trigger: { global: "phaseDrawBegin1" }, + locked: true, + line: { color: [236, 137, 52] }, + filter(event, player) { + var target = event.player; + return player.inRange(target) && player.countCards("he") >= get.distance(player, target); }, - async cost(event, trigger, player){ - var next=player.chooseToDiscard('he',get.distance(player,trigger.player)||1,get.prompt2('misa_yehuo',trigger.player),'chooseonly'); - next.set('ai',function(card){ - var val=_status.event.val; - for(var i=0;i0; + check(event, player) { + return !event.player.isTurnedOver() || get.attitude(player, event.player) > 0; }, }, - yukine_wenzhou:{ - trigger:{global:'phaseUseBegin'}, - filter(event,player){ - return event.player.countCards('he')>0; + yukine_wenzhou: { + trigger: { global: "phaseUseBegin" }, + filter(event, player) { + return event.player.countCards("he") > 0; }, - async cost(event, trigger, player){ + async cost(event, trigger, player) { event.forceDie = true; - var ask = trigger.player.chooseCard('he', get.prompt('yukine_wenzhou')); - if(player === trigger.player){ - ask.set('prompt2','选择一张牌,然后从牌堆中获得一张与此牌类型相同的牌。本回合内使用与此牌类型相同的牌时不可被其他角色响应。'); - } - else ask.set('prompt2','将一张牌交给'+get.translation(player)+'然后其可以选择:交给你一张牌;或令你从牌堆中获得一张与此牌类型相同的牌,且你本回合内使用与此牌类型相同的牌时不可被响应。'); - ask.set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.getParent().player)>0) return 10-get.value(card); + var ask = trigger.player.chooseCard("he", get.prompt("yukine_wenzhou")); + if (player === trigger.player) { + ask.set( + "prompt2", + "选择一张牌,然后从牌堆中获得一张与此牌类型相同的牌。本回合内使用与此牌类型相同的牌时不可被其他角色响应。" + ); + } else + ask.set( + "prompt2", + "将一张牌交给" + + get.translation(player) + + "然后其可以选择:交给你一张牌;或令你从牌堆中获得一张与此牌类型相同的牌,且你本回合内使用与此牌类型相同的牌时不可被响应。" + ); + ask.set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) + return 10 - get.value(card); return -1; }); event.result = await ask.forResult(); }, - content(){ - "step 0" - event.forceDie=true; - event.type=get.type(cards[0],'trick'); - if(trigger.player!=player) trigger.player.give(cards,player,'giveAuto'); - "step 1" - if(player==trigger.player||player.countCards('he')==0){ - event._result={index:1}; + content() { + "step 0"; + event.forceDie = true; + event.type = get.type(cards[0], "trick"); + if (trigger.player != player) trigger.player.give(cards, player, "giveAuto"); + ("step 1"); + if (player == trigger.player || player.countCards("he") == 0) { + event._result = { index: 1 }; + } else { + player + .chooseControl() + .set("choiceList", [ + "将一张牌交给" + get.translation(trigger.player), + "令" + + get.translation(trigger.player) + + "从牌堆中获得一张" + + get.translation(event.type) + + "牌,且其本回合内使用与此牌名称相同的牌时不可被响应", + ]) + .set("forceDie", true) + .set("ai", function () { + if (get.attitude(_status.event.player, _status.event.getTrigger().player) > 0) + return 1; + return 0; + }); } - else{ - player.chooseControl().set('choiceList',[ - '将一张牌交给'+get.translation(trigger.player), - '令'+get.translation(trigger.player)+'从牌堆中获得一张'+get.translation(event.type)+'牌,且其本回合内使用与此牌名称相同的牌时不可被响应', - ]).set('forceDie',true).set('ai',function(){ - if(get.attitude(_status.event.player,_status.event.getTrigger().player)>0) return 1; - return 0; + ("step 2"); + event.index = result.index; + if (result.index == 1) { + var magic = get.cardPile2(function (card) { + return get.type(card, "trick") == event.type; }); - } - "step 2" - event.index=result.index; - if(result.index==1){ - var magic=get.cardPile2(function(card){ - return get.type(card,'trick')==event.type; - }); - if(magic){ - trigger.player.addTempSkill('yukine_magic','phaseUseEnd'); + if (magic) { + trigger.player.addTempSkill("yukine_magic", "phaseUseEnd"); trigger.player.storage.yukine_magic.add(magic.name); - trigger.player.gain(magic,'draw'); - } - else event.finish(); - } - else player.chooseCard('he',true,'选择要交给'+get.translation(trigger.player)+'的牌').set('ai',function(card){ - return -get.value(card,_status.event.getTrigger().player); - }); - "step 3" - if(event.index==1) game.updateRoundNumber(); - else if(result.bool) player.give(result.cards,trigger.player,'giveAuto'); + trigger.player.gain(magic, "draw"); + } else event.finish(); + } else + player + .chooseCard("he", true, "选择要交给" + get.translation(trigger.player) + "的牌") + .set("ai", function (card) { + return -get.value(card, _status.event.getTrigger().player); + }); + ("step 3"); + if (event.index == 1) game.updateRoundNumber(); + else if (result.bool) player.give(result.cards, trigger.player, "giveAuto"); }, }, - yukine_magic:{ - trigger:{player:'useCard'}, - forced:true, - popup:false, - charlotte:true, - filter(event,player){ - return player.storage.yukine_magic&&player.storage.yukine_magic.includes(event.card.name); + yukine_magic: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + return ( + player.storage.yukine_magic && player.storage.yukine_magic.includes(event.card.name) + ); }, - content(){ - trigger.directHit.addArray(game.filterPlayer(function(current){ - if(player!=current) return true; - return !player.hasSkill('yukine_wenzhou'); - })); + content() { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + if (player != current) return true; + return !player.hasSkill("yukine_wenzhou"); + }) + ); }, - onremove:true, - init(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + onremove: true, + init(player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return player.storage.yukine_magic&&player.storage.yukine_magic.includes(arg.card.name); + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return ( + player.storage.yukine_magic && player.storage.yukine_magic.includes(arg.card.name) + ); }, }, }, - komari_tiankou:{ - trigger:{ - player:'useCard2', - target:'useCardToTarget', + komari_tiankou: { + trigger: { + player: "useCard2", + target: "useCardToTarget", }, - forced:true, - filter(event,player,name){ - if(name=='useCardToTarget'&&player==event.player) return false; - if(get.color(event.card)!='red') return false; - if(get.tag(event.card,'damage')) return false; - return ['basic','trick'].includes(get.type(event.card)); + forced: true, + filter(event, player, name) { + if (name == "useCardToTarget" && player == event.player) return false; + if (get.color(event.card) != "red") return false; + if (get.tag(event.card, "damage")) return false; + return ["basic", "trick"].includes(get.type(event.card)); }, - content(){ - 'step 0' - var info=get.info(trigger.card); - var bool=true; - if(info.multitarget||info.allowMultiple===false) bool=false; - else{ - var list=game.filterPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,trigger.player,current); - }) - if(!list.length) bool=false; + content() { + "step 0"; + var info = get.info(trigger.card); + var bool = true; + if (info.multitarget || info.allowMultiple === false) bool = false; + else { + var list = game.filterPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, trigger.player, current) + ); + }); + if (!list.length) bool = false; } - if(bool) player.chooseTarget('甜口:为'+get.translation(trigger.card)+'增加一个额外目标,或点【取消】摸一张牌。',function(candy,komari,rin){ - return _status.event.rin_chan.includes(rin); - }).set('rin_chan',list).set('ai',function(target){ - var evt=_status.event; - return get.effect(target,evt.candy,evt.source,evt.player); - }).set('candy',trigger.card).set('',trigger.player); - else event._result={bool:false}; - 'step 1' - if(result.bool){ - var rin=result.targets[0]; + if (bool) + player + .chooseTarget( + "甜口:为" + + get.translation(trigger.card) + + "增加一个额外目标,或点【取消】摸一张牌。", + function (candy, komari, rin) { + return _status.event.rin_chan.includes(rin); + } + ) + .set("rin_chan", list) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt.candy, evt.source, evt.player); + }) + .set("candy", trigger.card) + .set("", trigger.player); + else event._result = { bool: false }; + ("step 1"); + if (result.bool) { + var rin = result.targets[0]; trigger.targets.push(rin); - player.line(rin,{color:[255, 224,172]}); - } - else player.draw(); + player.line(rin, { color: [255, 224, 172] }); + } else player.draw(); }, }, - komari_xueshang:{ - trigger:{global:'die'}, - forced:true, - skillAnimation:true, - chargingSkill:true, - filter(event,player){ - return player.hp>0; + komari_xueshang: { + trigger: { global: "die" }, + forced: true, + skillAnimation: true, + chargingSkill: true, + filter(event, player) { + return player.hp > 0; }, - animationColor:'metal', - content(){ - 'step 0' - player.addSkill('riki_xueshang'); - var map={}; - var list=[]; - for(var i=1;i<=player.hp;i++){ - var cn=get.cnNumber(i,true); - map[cn]=i; + animationColor: "metal", + content() { + "step 0"; + player.addSkill("riki_xueshang"); + var map = {}; + var list = []; + for (var i = 1; i <= player.hp; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; list.push(cn); } - event.map=map; - player.chooseControl(list,function(){ - return '一'; - }).set('prompt','血殇:请选择自己受到的伤害的点数'); - 'step 1' - var num=event.map[result.control]||1; - event.num=num>1?2:1; - event.list=game.filterPlayer(function(current){ - return current!=player; - }).sortBySeat(); + event.map = map; + player + .chooseControl(list, function () { + return "一"; + }) + .set("prompt", "血殇:请选择自己受到的伤害的点数"); + ("step 1"); + var num = event.map[result.control] || 1; + event.num = num > 1 ? 2 : 1; + event.list = game + .filterPlayer(function (current) { + return current != player; + }) + .sortBySeat(); player.damage(num); - player.line(event.list,{color:[255, 224,172]}); - 'step 2' - if(!player.hasSkill(event.name)) return; - else{ + player.line(event.list, { color: [255, 224, 172] }); + ("step 2"); + if (!player.hasSkill(event.name)) return; + else { event.list.shift().damage(num); - if(event.list.length) event.redo(); + if (event.list.length) event.redo(); } }, }, - riki_xueshang:{ - trigger:{global:'dying'}, - forced:true, - popup:false, - charlotte:true, - filter(event,player){ - return event.getParent(2).name=='komari_xueshang'&&event.getParent(2).player==player; + riki_xueshang: { + trigger: { global: "dying" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + return ( + event.getParent(2).name == "komari_xueshang" && event.getParent(2).player == player + ); }, - content(){ - player.removeSkills('komari_xueshang'); + content() { + player.removeSkills("komari_xueshang"); player.gainMaxHp(true); player.recover(); }, }, - umi_chaofan:{ - enable:'phaseUse', - usable:1, - selectCard:2, - complexCard:true, - filter(summer,umi){ - return umi.countCards('h')>1; + umi_chaofan: { + enable: "phaseUse", + usable: 1, + selectCard: 2, + complexCard: true, + filter(summer, umi) { + return umi.countCards("h") > 1; }, - check(ingredient){ - return 7-get.value(ingredient); + check(ingredient) { + return 7 - get.value(ingredient); }, - filterCard(ingredient){ - if(ui.selected.cards.length) return get.suit(ingredient)!=get.suit(ui.selected.cards[0]); + filterCard(ingredient) { + if (ui.selected.cards.length) + return get.suit(ingredient) != get.suit(ui.selected.cards[0]); return true; }, - line:{color:[251, 193, 217]}, - filterTarget:lib.filter.notMe, - content(){ - 'step 0' + line: { color: [251, 193, 217] }, + filterTarget: lib.filter.notMe, + content() { + "step 0"; player.draw(); - 'step 1' - if(player.hp>2) target.recover(); - else if(player.hp==2) target.draw(2); - else target.damage('fire','nosource'); + ("step 1"); + if (player.hp > 2) target.recover(); + else if (player.hp == 2) target.draw(2); + else target.damage("fire", "nosource"); }, - ai:{ - order:2, - result:{ - target(umi,takahara){ - if(umi.hp>2&&takahara.isDamaged()) return 2.2; - if(umi.hp==2&&!takahara.hasSkillTag('nogain')) return 2; - if(umi.hp<2) return get.damageEffect(takahara,umi,umi,'fire'); + ai: { + order: 2, + result: { + target(umi, takahara) { + if (umi.hp > 2 && takahara.isDamaged()) return 2.2; + if (umi.hp == 2 && !takahara.hasSkillTag("nogain")) return 2; + if (umi.hp < 2) return get.damageEffect(takahara, umi, umi, "fire"); }, }, }, }, - umi_lunhui:{ - trigger:{global:'phaseAfter'}, - filter(summer,umi){ - return summer.player!=umi&&umi.countCards('h')0; - }, - check(event,player){ - return get.attitude(player,event.player)>1; - }, - logTarget:'player', - content(){ - 'step 0' - player.gain(trigger.player.getCards('j'),trigger.player,'give','bySelf'); - 'step 1' - if(player.hp>1) player.loseHp(); + content() { + trigger.num += 2; }, }, - yuri_xingdong:{ - audio:3, - group:'yuri_xingdong_gain', - subSkill:{ - mark:{ - mark:true, - marktext:'令', - intro:{ - content:'跳过下个回合的判定阶段和摸牌阶段', + haruko_zhuishi: { + trigger: { global: "phaseJudgeBegin" }, + filter(misuzu) { + return misuzu.player.countCards("j") > 0; + }, + check(event, player) { + return get.attitude(player, event.player) > 1; + }, + logTarget: "player", + content() { + "step 0"; + player.gain(trigger.player.getCards("j"), trigger.player, "give", "bySelf"); + ("step 1"); + if (player.hp > 1) player.loseHp(); + }, + }, + yuri_xingdong: { + audio: 3, + group: "yuri_xingdong_gain", + subSkill: { + mark: { + mark: true, + marktext: "令", + intro: { + content: "跳过下个回合的判定阶段和摸牌阶段", }, }, - gain:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - forced:true, - content(){ - 'step 0' - var card=get.cardPile(function(card){ - return card.name=='sha'||get.type(card)=='trick'; + gain: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + content() { + "step 0"; + var card = get.cardPile(function (card) { + return card.name == "sha" || get.type(card) == "trick"; }); - if(card) player.gain(card,'gain2','log'); - 'step 1' + if (card) player.gain(card, "gain2", "log"); + ("step 1"); game.updateRoundNumber(); }, }, }, - enable:'phaseUse', - usable:1, - locked:true, - filter(event,player){ - return player.countCards('h',lib.skill.yuri_xingdong.filterCard); + enable: "phaseUse", + usable: 1, + locked: true, + filter(event, player) { + return player.countCards("h", lib.skill.yuri_xingdong.filterCard); }, - filterCard(card){ - return card.name=='sha'||get.type(card)=='trick'; + filterCard(card) { + return card.name == "sha" || get.type(card) == "trick"; }, - check(card){return 1}, - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:0, - content(){ - 'step 0' - player.give(cards,target); - 'step 1' - if(!target.getCards('h').includes(cards[0])) event._result={bool:false}; - else target.chooseUseTarget(cards[0],game.filterPlayer(function(current){ - return current!=player; - }),'请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段'); - 'step 2' - if(result.bool) game.asyncDraw([player,target]); - else{ - target.addTempSkill('yuri_xingdong_mark','phaseJudgeSkipped'); - target.skip('phaseJudge'); - target.skip('phaseDraw'); - target.addTempSkill('zhengjing3',{player:'phaseAfter'}); + check(card) { + return 1; + }, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: 0, + content() { + "step 0"; + player.give(cards, target); + ("step 1"); + if (!target.getCards("h").includes(cards[0])) event._result = { bool: false }; + else + target.chooseUseTarget( + cards[0], + game.filterPlayer(function (current) { + return current != player; + }), + "请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段" + ); + ("step 2"); + if (result.bool) game.asyncDraw([player, target]); + else { + target.addTempSkill("yuri_xingdong_mark", "phaseJudgeSkipped"); + target.skip("phaseJudge"); + target.skip("phaseDraw"); + target.addTempSkill("zhengjing3", { + player: "phaseAfter", + }); event.finish(); } - 'step 3' + ("step 3"); game.delay(); }, - ai:{ - order:12, - result:{ - target(player,target){ - var card=ui.selected.cards[0]; - if(target.hasSkill('pingkou')) return 1; - if(!card) return 0; - var info=get.info(card); - if(info.selectTarget==-1){ - var eff=0; - game.countPlayer(function(current){ - if(current!=player&&target.canUse(card,current)) eff+=get.effect(current,card,target,target); + ai: { + order: 12, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (target.hasSkill("pingkou")) return 1; + if (!card) return 0; + var info = get.info(card); + if (info.selectTarget == -1) { + var eff = 0; + game.countPlayer(function (current) { + if (current != player && target.canUse(card, current)) + eff += get.effect(current, card, target, target); }); - if(eff>0||get.value(card)<3) return eff; + if (eff > 0 || get.value(card) < 3) return eff; return 0; - } - else if(game.hasPlayer(function(current){ - return current!=player&&target.canUse(card,current)&&get.effect(current,card,target,target)>0 - })) return 1.5; - else if(get.value(card)<3) return -1; + } else if ( + game.hasPlayer(function (current) { + return ( + current != player && + target.canUse(card, current) && + get.effect(current, card, target, target) > 0 + ); + }) + ) + return 1.5; + else if (get.value(card) < 3) return -1; return 0; }, }, }, }, - yuri_wangxi:{ - audio:2, - trigger:{global:'dieAfter'}, - limited:true, - mark:false, - init(player){ - if(player.hasZhuSkill('yuri_wangxi')){ - player.markSkill('yuri_wangxi'); - player.storage.yuri_wangxi=false; + yuri_wangxi: { + audio: 2, + trigger: { global: "dieAfter" }, + limited: true, + mark: false, + init(player) { + if (player.hasZhuSkill("yuri_wangxi")) { + player.markSkill("yuri_wangxi"); + player.storage.yuri_wangxi = false; } }, - zhuSkill:true, - unique:true, - skillAnimation:true, - animationColor:'thunder', - filter(event,player){ - if(get.mode()!='identity') return false; - if(!player.hasZhuSkill('yuri_wangxi')) return false; - if(event.player.isIn()) return false; - if(event.player.identity=='mingzhong') return false; - var evt=event.getParent('yuri_xingdong'); - return evt&&evt.name=='yuri_xingdong'&&evt.player==player; + zhuSkill: true, + unique: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + if (get.mode() != "identity") return false; + if (!player.hasZhuSkill("yuri_wangxi")) return false; + if (event.player.isIn()) return false; + if (event.player.identity == "mingzhong") return false; + var evt = event.getParent("yuri_xingdong"); + return evt && evt.name == "yuri_xingdong" && evt.player == player; }, - async cost(event, trigger, player){ - event.result = await trigger.player.chooseBool('是否发动'+get.translation(player)+'的【忘隙】?').set('forceDie', true).forResult(); + async cost(event, trigger, player) { + event.result = await trigger.player + .chooseBool("是否发动" + get.translation(player) + "的【忘隙】?") + .set("forceDie", true) + .forResult(); }, - logTarget:'player', - async content(event, trigger, player){ - player.awakenSkill('yuri_wangxi'); - var identity='zhong'; - if(_status.mode=='purple'){ - if(['rNei','bNei'].includes(player.identity)) identity = player.identity; - else if(['rZhu','rZhong','bNei'].includes(player.identity)) identity='rZhong'; - else identity='bZhong'; + logTarget: "player", + async content(event, trigger, player) { + player.awakenSkill("yuri_wangxi"); + var identity = "zhong"; + if (_status.mode == "purple") { + if (["rNei", "bNei"].includes(player.identity)) identity = player.identity; + else if (["rZhu", "rZhong", "bNei"].includes(player.identity)) identity = "rZhong"; + else identity = "bZhong"; } - game.broadcastAll(function(source,identity){ - if(source.node.dieidentity){ - source.node.dieidentity.innerHTML=get.translation(identity+2); - } - source.revive(2,false); - source.identity=identity; - source.setIdentity(); - },trigger.player,identity); - var evt=trigger.getParent('damage'); - if(evt.untrigger) evt.untrigger(false,trigger.player); - game.addVideo('setIdentity',trigger.player,'zhong'); + game.broadcastAll( + function (source, identity) { + if (source.node.dieidentity) { + source.node.dieidentity.innerHTML = get.translation(identity + 2); + } + source.revive(2, false); + source.identity = identity; + source.setIdentity(); + }, + trigger.player, + identity + ); + var evt = trigger.getParent("damage"); + if (evt.untrigger) evt.untrigger(false, trigger.player); + game.addVideo("setIdentity", trigger.player, "zhong"); await trigger.player.changeGroup(player.group); await trigger.player.draw(); }, }, - nk_shekong:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h')>0; + nk_shekong: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - selectCard(){ - if(ui.selected.targets.length) return [1,ui.selected.targets[0].countCards('he')]; - return [1,Infinity]; + filterCard: true, + selectCard() { + if (ui.selected.targets.length) return [1, ui.selected.targets[0].countCards("he")]; + return [1, Infinity]; }, - filterTarget(event,player,target){ - return target!=player&&target.countCards('he')>=Math.max(1,ui.selected.cards.length); + filterTarget(event, player, target) { + return ( + target != player && target.countCards("he") >= Math.max(1, ui.selected.cards.length) + ); }, - check(card){ - if(!game.hasPlayer(function(current){ - return current!=_status.event.player&&get.attitude(_status.event.player,current)<0&¤t.countCards('he')>ui.selected.cards.length; - })) return 0; - return 6-get.value(card); + check(card) { + if ( + !game.hasPlayer(function (current) { + return ( + current != _status.event.player && + get.attitude(_status.event.player, current) < 0 && + current.countCards("he") > ui.selected.cards.length + ); + }) + ) + return 0; + return 6 - get.value(card); }, - content(){ - 'step 0' - event.cardsx=cards.slice(0); - var num=get.cnNumber(cards.length); - var trans=get.translation(player); - var prompt=('弃置'+num+'张牌,然后'+trans+'摸一张牌'); - if(cards.length>1) prompt+=(';或弃置一张牌,然后'+trans+'摸'+num+'张牌'); - var next=target.chooseToDiscard(prompt,'he',true); - next.numx=cards.length; - next.selectCard=function(){ - if(ui.selected.cards.length>1) return _status.event.numx; - return [1,_status.event.numx]; + content() { + "step 0"; + event.cardsx = cards.slice(0); + var num = get.cnNumber(cards.length); + var trans = get.translation(player); + var prompt = "弃置" + num + "张牌,然后" + trans + "摸一张牌"; + if (cards.length > 1) prompt += ";或弃置一张牌,然后" + trans + "摸" + num + "张牌"; + var next = target.chooseToDiscard(prompt, "he", true); + next.numx = cards.length; + next.selectCard = function () { + if (ui.selected.cards.length > 1) return _status.event.numx; + return [1, _status.event.numx]; }; - next.complexCard=true; - next.ai=function(card){ - if(ui.selected.cards.length==0||(_status.event.player.countCards('he',function(cardxq){ - return get.value(cardxq)<7; - })>=_status.event.numx)) return 7-get.value(card); + next.complexCard = true; + next.ai = function (card) { + if ( + ui.selected.cards.length == 0 || + _status.event.player.countCards("he", function (cardxq) { + return get.value(cardxq) < 7; + }) >= _status.event.numx + ) + return 7 - get.value(card); return -1; }; - 'step 1' - if(result.bool){ - if(result.cards.length==cards.length) player.draw(); + ("step 1"); + if (result.bool) { + if (result.cards.length == cards.length) player.draw(); else player.draw(cards.length); event.cardsx.addArray(result.cards); - for(var i=0;i0; + lucia_zhenren: { + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + filter(event, player) { + return player.countCards("e") > 0; }, - content(){ - 'step 0' - var es=player.getCards('e'); - event.count=es.length; + content() { + "step 0"; + var es = player.getCards("e"); + event.count = es.length; player.discard(es); - 'step 1' + ("step 1"); event.count--; - if(game.hasPlayer(function(current){ - return current.countDiscardableCards(player,'ej')>0; - })){ - player.chooseTarget('请选择一名角色,弃置其装备区或判定区内的一张牌。',true,function(card,player,target){ - return target.countDiscardableCards(player,'ej')>0; - }).ai=function(target){ - var att=get.attitude(_status.event.player,target); - if(target.countCards('j')&&att>0) return att*1.5; + if ( + game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "ej") > 0; + }) + ) { + player.chooseTarget( + "请选择一名角色,弃置其装备区或判定区内的一张牌。", + true, + function (card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; + } + ).ai = function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("j") && att > 0) return att * 1.5; return -att; }; - } - else event.finish(); - 'step 2' - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,{color:[220, 90, 139]}); - player.discardPlayerCard(target,'ej',true); - if(event.count) event.goto(1); + } else event.finish(); + ("step 2"); + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, { color: [220, 90, 139] }); + player.discardPlayerCard(target, "ej", true); + if (event.count) event.goto(1); } }, }, - noname_zhuyuan:{ - enable:"phaseUse", - position:"he", - selectCard:4, - complexCard:true, - charlotte:true, - prompt:"将4张花色各不同的牌交一名角色并令你与其获得【铁骑】和【激昂】直到各自回合结束", - check(card){ - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - var player=get.owner(card); - if(ui.selected.cards.length>=Math.max(2,player.countCards('h')-player.hp)) return 0; - if(player.hp==player.maxHp||player.countCards('h')<=1){ - var players=game.filterPlayer(); - for(var i=0;i=3&& - get.attitude(players[i],player)>=3){ - return 11-get.value(card); + noname_zhuyuan: { + enable: "phaseUse", + position: "he", + selectCard: 4, + complexCard: true, + charlotte: true, + prompt: "将4张花色各不同的牌交一名角色并令你与其获得【铁骑】和【激昂】直到各自回合结束", + check(card) { + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + var player = get.owner(card); + if (ui.selected.cards.length >= Math.max(2, player.countCards("h") - player.hp)) return 0; + if (player.hp == player.maxHp || player.countCards("h") <= 1) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].hasSkill("haoshi") && + !players[i].isTurnedOver() && + !players[i].hasJudge("lebu") && + get.attitude(player, players[i]) >= 3 && + get.attitude(players[i], player) >= 3 + ) { + return 11 - get.value(card); } } - if(player.countCards('h')>player.hp) return 10-get.value(card); - if(player.countCards('h')>2) return 6-get.value(card); + if (player.countCards("h") > player.hp) return 10 - get.value(card); + if (player.countCards("h") > 2) return 6 - get.value(card); return -1; } - return 10-get.value(card); + return 10 - get.value(card); }, - filterCard(card,player){ - var suit=get.suit(card,player); - for(var i=0;i", - intro:{ - name:"小无·铁骑", - content:"你使用【杀】指定一名角色为目标后,可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。", + noname_retieji: { + inherit: "retieji", + mark: true, + marktext: "", + intro: { + name: "小无·铁骑", + content: + "你使用【杀】指定一名角色为目标后,可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。", }, }, - noname_jiang:{ - inherit:"jiang", - mark:true, - marktext:"", - intro:{ - name:"小无·激昂", - content:"每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", + noname_jiang: { + inherit: "jiang", + mark: true, + marktext: "", + intro: { + name: "小无·激昂", + content: + "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", }, }, - noname_duocai:{ - trigger:{ - global:["loseAfter","loseAsyncAfter"], + noname_duocai: { + trigger: { + global: ["loseAfter", "loseAsyncAfter"], }, - filter(event,player){ - if(event.type!='discard'||event.getlx===false) return false; - var evt=event.getl(player); - var cards=event.cards.slice(0); - if(evt&&evt.cards) cards.removeArray(evt.cards); - return cards.filterInD('d').length>0&&!player.hasSkill('noname_duocai2'); + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getl(player); + var cards = event.cards.slice(0); + if (evt && evt.cards) cards.removeArray(evt.cards); + return cards.filterInD("d").length > 0 && !player.hasSkill("noname_duocai2"); }, - direct:true, - charlotte:true, - content(){ - "step 0" - if(trigger.delay==false&&player!=game.me&&!player.isOnline()) game.delay(); - var evt=trigger.getl(player); - var cards=trigger.cards.slice(0); + direct: true, + charlotte: true, + content() { + "step 0"; + if (trigger.delay == false && player != game.me && !player.isOnline()) game.delay(); + var evt = trigger.getl(player); + var cards = trigger.cards.slice(0); cards.removeArray(evt.cards); - player.chooseButton([get.prompt('noname_duocai'),cards],[1,cards.length]); - "step 1" - if(result.bool){ - player.logSkill('noname_duocai'); - player.addTempSkill('noname_duocai2'); - player.gain(result.links,'gain2'); - if(result.links.length>2){ - var filterTarget=function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'hej')>0; + player.chooseButton([get.prompt("noname_duocai"), cards], [1, cards.length]); + ("step 1"); + if (result.bool) { + player.logSkill("noname_duocai"); + player.addTempSkill("noname_duocai2"); + player.gain(result.links, "gain2"); + if (result.links.length > 2) { + var filterTarget = function (card, player, target) { + return target != player && target.countDiscardableCards(player, "hej") > 0; }; - if(game.hasPlayer(function(current){ - return filterTarget(null,player,current); - })){ - player.chooseTarget('弃置一名其他角色区域内的一张牌',true,filterTarget).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe'},player,player); - }); - } - else event.finish(); - } - else{ - if(result.links.length==2) player.draw(); + if ( + game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) { + player + .chooseTarget("弃置一名其他角色区域内的一张牌", true, filterTarget) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe" }, player, player); + }); + } else event.finish(); + } else { + if (result.links.length == 2) player.draw(); else player.recover(); event.finish(); } - } - else event.finish(); - "step 2" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.discardPlayerCard(target,'hej',true); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "hej", true); } }, }, - noname_duocai2:{charlotte:true}, - nsbizhao:{ - trigger:{player:'showCharacterAfter'}, - forced:true, - hiddenSkill:true, - filter(event,player){ - return event.toShow&&event.toShow.includes('ns_yanghu')&&player!=_status.currentPhase; + noname_duocai2: { charlotte: true }, + nsbizhao: { + trigger: { player: "showCharacterAfter" }, + forced: true, + hiddenSkill: true, + filter(event, player) { + return ( + event.toShow && event.toShow.includes("ns_yanghu") && player != _status.currentPhase + ); }, - content(){ - player.addTempSkill('nsbizhao2',{player:'phaseBeginStart'}); + content() { + player.addTempSkill("nsbizhao2", { + player: "phaseBeginStart", + }); }, }, - nsbizhao2:{ - charlotte:true, - mark:true, - intro:{content:'其他角色至自己的距离+1'}, - mod:{ - globalTo(source,player,distance){ - return distance+1; + nsbizhao2: { + charlotte: true, + mark: true, + intro: { content: "其他角色至自己的距离+1" }, + mod: { + globalTo(source, player, distance) { + return distance + 1; }, }, }, - nsqingde:{ - trigger:{ - player:'damageEnd', - source:'damageSource', + nsqingde: { + trigger: { + player: "damageEnd", + source: "damageSource", }, - usable:1, - filter(event,player){ - if(!event.card||!event.cards||event.player==event.source||(event.card.name!='sha'&& - get.type(event.card)!='trick')||event.cards.filterInD().length!=1) return false; - var target=lib.skill.nsqingde.logTarget(event,player); - if(player.hasSkillTag('noCompareSource')||target.hasSkillTag('noCompareTarget')) return false; - return target.countCards('h')>0; + usable: 1, + filter(event, player) { + if ( + !event.card || + !event.cards || + event.player == event.source || + (event.card.name != "sha" && get.type(event.card) != "trick") || + event.cards.filterInD().length != 1 + ) + return false; + var target = lib.skill.nsqingde.logTarget(event, player); + if (player.hasSkillTag("noCompareSource") || target.hasSkillTag("noCompareTarget")) + return false; + return target.countCards("h") > 0; }, - logTarget(event,player){ - if(player==event.source) return event.player; + logTarget(event, player) { + if (player == event.source) return event.player; return event.source; }, - check(event,player){ - var target=lib.skill.nsqingde.logTarget(event,player); - return get.attitude(player,target)<=0; + check(event, player) { + var target = lib.skill.nsqingde.logTarget(event, player); + return get.attitude(player, target) <= 0; }, - content(){ - 'step 0' - var target=lib.skill.nsqingde.logTarget(trigger,player); - event.target=target - var next=player.chooseToCompare(target); - if(event.triggername=='damageSource') next.set('small',true); - if(!next.fixedResult) next.fixedResult={}; - next.fixedResult[player.playerid]=trigger.cards.filterInD()[0]; - 'step 1' - if(result.tie){ + content() { + "step 0"; + var target = lib.skill.nsqingde.logTarget(trigger, player); + event.target = target; + var next = player.chooseToCompare(target); + if (event.triggername == "damageSource") next.set("small", true); + if (!next.fixedResult) next.fixedResult = {}; + next.fixedResult[player.playerid] = trigger.cards.filterInD()[0]; + ("step 1"); + if (result.tie) { event.finish(); return; } - var i=result.bool; - if(event.triggername=='damageSource') i=!i; - event.target2=i?player:target; - if(event.triggername=='damageSource') event.goto(3); - else if(event.target2.isDamaged()) player.chooseBool('是否令'+get.translation(event.target2)+'回复1点体力?').set('ai',function(){ - var evt=_status.event.getParent(); - return get.attitude(evt.player,evt.target2)>0; - }); + var i = result.bool; + if (event.triggername == "damageSource") i = !i; + event.target2 = i ? player : target; + if (event.triggername == "damageSource") event.goto(3); + else if (event.target2.isDamaged()) + player + .chooseBool("是否令" + get.translation(event.target2) + "回复1点体力?") + .set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target2) > 0; + }); else event.finish(); - 'step 2' - if(result.bool) event.target2.recover(); + ("step 2"); + if (result.bool) event.target2.recover(); event.finish(); - 'step 3' - player.chooseBool('是否令'+get.translation(event.target2)+'摸两张牌?').set('ai',function(){ - var evt=_status.event.getParent(); - return get.attitude(evt.player,evt.target2)>0; - }); - 'step 4' - if(result.bool) event.target2.draw(2); + ("step 3"); + player + .chooseBool("是否令" + get.translation(event.target2) + "摸两张牌?") + .set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target2) > 0; + }); + ("step 4"); + if (result.bool) event.target2.draw(2); }, - ai:{ - effect:{ - target(card,player,target,current){ - if(target.storage.counttrigger&&target.storage.counttrigger.nsqingde) return; - var num=get.number(card); - if(typeof num=='number'){ - if(target.hasSkillTag('noCompareSource')||player.hasSkillTag('noCompareTarget')) return; - var hs=player.getCards('h'); - if(card.cards) hs.removeArray(card.cards); - if(ui.selected.cards) hs.removeArray(ui.selected.cards); - if(!hs.length) return; - for(var i of hs){ - if(get.number(i)>=num) return; - if(player.hasSkill('tianbian')&&get.suit(card)=='heart') return; + ai: { + effect: { + target(card, player, target, current) { + if (target.storage.counttrigger && target.storage.counttrigger.nsqingde) return; + var num = get.number(card); + if (typeof num == "number") { + if ( + target.hasSkillTag("noCompareSource") || + player.hasSkillTag("noCompareTarget") + ) + return; + var hs = player.getCards("h"); + if (card.cards) hs.removeArray(card.cards); + if (ui.selected.cards) hs.removeArray(ui.selected.cards); + if (!hs.length) return; + for (var i of hs) { + if (get.number(i) >= num) return; + if (player.hasSkill("tianbian") && get.suit(card) == "heart") return; } - return 'zerotarget'; + return "zerotarget"; } }, }, }, }, - nsyidi:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h')>0; + nsyidi: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - check(card){ - var player=_status.event.player; - if(get.type(card,player)=='basic'){ - if(game.hasPlayer(function(current){ - return get.attitude(current,player)>0&¤t.getUseValue(card)>player.getUseValue(card,null,true); - })) return 5+Math.random(); + filterCard: true, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + check(card) { + var player = _status.event.player; + if (get.type(card, player) == "basic") { + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(current, player) > 0 && + current.getUseValue(card) > player.getUseValue(card, null, true) + ); + }) + ) + return 5 + Math.random(); return 0; } - if(game.hasPlayer(function(current){ - return get.attitude(current,player)>0&&!current.hasJudge('lebu')&¤t.getUseValue(card)>player.getUseValue(card); - })) return 4.7+Math.random(); - if(card.name=='wuxie'&&game.hasPlayer(function(current){ - return get.attitude(current,player)>0; - })) return 5+Math.random(); - return 4-get.value(card); + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(current, player) > 0 && + !current.hasJudge("lebu") && + current.getUseValue(card) > player.getUseValue(card) + ); + }) + ) + return 4.7 + Math.random(); + if ( + card.name == "wuxie" && + game.hasPlayer(function (current) { + return get.attitude(current, player) > 0; + }) + ) + return 5 + Math.random(); + return 4 - get.value(card); }, - content(){ - 'step 0' - player.give(cards,target,'visible'); - if(get.type(cards[0],player)!='basic'){ + content() { + "step 0"; + player.give(cards, target, "visible"); + if (get.type(cards[0], player) != "basic") { player.draw(); event.finish(); } - 'step 1' - if(target.getCards('h').includes(cards[0])&&target.hasUseTarget(cards[0])) target.chooseUseTarget(cards[0]); + ("step 1"); + if (target.getCards("h").includes(cards[0]) && target.hasUseTarget(cards[0])) + target.chooseUseTarget(cards[0]); }, - ai:{ - order:7, - result:{ - player(player,target){ - if(!ui.selected.cards.length||get.type(ui.selected.cards[0],player)=='basic') return 0; - if(get.value(ui.selected.cards[0])<4) return 2; + ai: { + order: 7, + result: { + player(player, target) { + if ( + !ui.selected.cards.length || + get.type(ui.selected.cards[0], player) == "basic" + ) + return 0; + if (get.value(ui.selected.cards[0]) < 4) return 2; return 0.5; }, - target:1, + target: 1, }, }, }, - nsfuzhou:{ - enable:'phaseUse', - usable:2, - filter(event,player){ - if(!player.storage.nstaiping&&player.getStat('skill').nsfuzhou) return false; - return player.countCards('he',{color:'black'})>0; + nsfuzhou: { + enable: "phaseUse", + usable: 2, + filter(event, player) { + if (!player.storage.nstaiping && player.getStat("skill").nsfuzhou) return false; + return player.countCards("he", { color: "black" }) > 0; }, - filterCard:{color:'black'}, - filterTarget(card,player,target){ - return !target.hasJudge('nsfuzhou_card'); + filterCard: { color: "black" }, + filterTarget(card, player, target) { + return !target.hasJudge("nsfuzhou_card"); }, - check(card){ - return 8-get.value(card); + check(card) { + return 8 - get.value(card); }, - prepare:'give', - position:'he', - discard:false, - lose:false, - delay:false, - content(){ - 'step 0' - target.addJudge({name:'nsfuzhou_card'},cards[0]); - cards[0].storage.nsfuzhou_source=player; - 'step 1' + prepare: "give", + position: "he", + discard: false, + lose: false, + delay: false, + content() { + "step 0"; + target.addJudge({ name: "nsfuzhou_card" }, cards[0]); + cards[0].storage.nsfuzhou_source = player; + ("step 1"); game.delayx(); }, - ai:{ - order:5, - result:{ - target(player,target){ - if(player.storage.nsfuzhou_draw){ - if(get.attitude(player,target)>0&&player.countCards('he',function(card){ - return get.color(card)=='red'; - })){ + ai: { + order: 5, + result: { + target(player, target) { + if (player.storage.nsfuzhou_draw) { + if ( + get.attitude(player, target) > 0 && + player.countCards("he", function (card) { + return get.color(card) == "red"; + }) + ) { return 1; } return 0; } - if(player.storage.nsfuzhou_damage) return -2; + if (player.storage.nsfuzhou_damage) return -2; return -1.5; }, }, }, }, - nsfuzhou_num:{ - charlotte:true, - onremove:true, - mod:{ - maxHandcard(player,num){ - return num+player.storage.nsfuzhou_num; + nsfuzhou_num: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.storage.nsfuzhou_num; }, }, - intro:{ - content(num){ - return '手牌上限'+(num<0?'':'+')+num; + intro: { + content(num) { + return "手牌上限" + (num < 0 ? "" : "+") + num; }, - } + }, }, - nsguidao:{ - trigger:{global:'judge'}, - filter(event,player){ - return player.countCards('hes',function(card){ - if(player.storage.nstaiping||(_status.connectMode&&get.position(card)!='e')) return true; - return get.color(card)=='black'; - })>0; + nsguidao: { + trigger: { global: "judge" }, + filter(event, player) { + return ( + player.countCards("hes", function (card) { + if ( + player.storage.nstaiping || + (_status.connectMode && get.position(card) != "e") + ) + return true; + return get.color(card) == "black"; + }) > 0 + ); }, - direct:true, - content(){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('nsguidao'),'hes',function(card,player){ - if(!player.storage.nstaiping&&get.color(card)!='black') return false; - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result; - } - else{ - return -result; - } - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight','nsguidao','noOrdering'); - } - else{ + direct: true, + content() { + "step 0"; + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("nsguidao"), + "hes", + function (card, player) { + if (!player.storage.nstaiping && get.color(card) != "black") return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "nsguidao", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { player.$gain2(trigger.player.judging[0]); player.gain(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); } - "step 3" + ("step 3"); game.delay(2); }, - ai:{ - rejudge:true, - tag:{ - rejudge:1 - } - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, }, - nstaiping:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - filter(event,player){ - return player.getAllHistory('sourceDamage',function(evt){ - return evt.getParent().name=='nsfuzhou_card'; - }).length>1||player.getAllHistory('gain',function(evt){ - return evt.getParent(2).name=='nsfuzhou_card'; - }).length>1; + nstaiping: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return ( + player.getAllHistory("sourceDamage", function (evt) { + return evt.getParent().name == "nsfuzhou_card"; + }).length > 1 || + player.getAllHistory("gain", function (evt) { + return evt.getParent(2).name == "nsfuzhou_card"; + }).length > 1 + ); }, - content(){ - player.awakenSkill('nstaiping'); - player.storage.nstaiping=true; - if(player.getAllHistory('sourceDamage',function(evt){ - return evt.getParent().name=='nsfuzhou_card'; - }).length>1) player.storage.nsfuzhou_damage=true; - if(player.getAllHistory('gain',function(evt){ - return evt.getParent(2).name=='nsfuzhou_card'; - }).length>1) player.storage.nsfuzhou_draw=true; + content() { + player.awakenSkill("nstaiping"); + player.storage.nstaiping = true; + if ( + player.getAllHistory("sourceDamage", function (evt) { + return evt.getParent().name == "nsfuzhou_card"; + }).length > 1 + ) + player.storage.nsfuzhou_damage = true; + if ( + player.getAllHistory("gain", function (evt) { + return evt.getParent(2).name == "nsfuzhou_card"; + }).length > 1 + ) + player.storage.nsfuzhou_draw = true; }, - derivation:['nsfuzhou_damage','nsfuzhou_draw'], + derivation: ["nsfuzhou_damage", "nsfuzhou_draw"], }, - nsweiyuan:{ - trigger:{player:'useCardToTargeted'}, - direct:true, - filter(event,player){ - return player!=event.target&&event.targets&&event.targets.length==1&&event.target.isIn() - &&player.isPhaseUsing()&&!player.hasSkill('nsweiyuan2')&&game.hasPlayer(function(current){ - return current!=player&¤t!=event.target; - }); + nsweiyuan: { + trigger: { player: "useCardToTargeted" }, + direct: true, + filter(event, player) { + return ( + player != event.target && + event.targets && + event.targets.length == 1 && + event.target.isIn() && + player.isPhaseUsing() && + !player.hasSkill("nsweiyuan2") && + game.hasPlayer(function (current) { + return current != player && current != event.target; + }) + ); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('nsweiyuan'),function(card,player,target){ - return target!=player&&target!=_status.event.getTrigger().target; - }).set('ai',function(target){ - return Math.max(Math.random(),get.attitude(player,target)); - }); - 'step 1' - if(result.bool){ - player.addTempSkill('nsweiyuan2','phaseUseAfter'); - var target=result.targets[0]; - event.target=target; - player.logSkill('nsweiyuan',target); - target.chooseCard('he','交给'+get.translation(trigger.target)+'一张牌并受到1点伤害,或令'+get.translation(player)+'摸一张牌且可以重复使用牌').set('ai',function(card){ - if(_status.event.goon) return Math.random(); - return 0; - }).set('goon',function(){ - if(get.attitude(target,player)>0) return false; - return Math.random()>0.5; - }()); - } - else event.finish(); - 'step 2' - if(result.bool){ - target.gain(result.cards,trigger.target); + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsweiyuan"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().target; + }) + .set("ai", function (target) { + return Math.max(Math.random(), get.attitude(player, target)); + }); + ("step 1"); + if (result.bool) { + player.addTempSkill("nsweiyuan2", "phaseUseAfter"); + var target = result.targets[0]; + event.target = target; + player.logSkill("nsweiyuan", target); + target + .chooseCard( + "he", + "交给" + + get.translation(trigger.target) + + "一张牌并受到1点伤害,或令" + + get.translation(player) + + "摸一张牌且可以重复使用牌" + ) + .set("ai", function (card) { + if (_status.event.goon) return Math.random(); + return 0; + }) + .set( + "goon", + (function () { + if (get.attitude(target, player) > 0) return false; + return Math.random() > 0.5; + })() + ); + } else event.finish(); + ("step 2"); + if (result.bool) { + target.gain(result.cards, trigger.target); target.damage(); - } - else{ - player.addTempSkill('nsweiyuan_use'); + } else { + player.addTempSkill("nsweiyuan_use"); player.draw(); } }, }, - nsweiyuan2:{charlotte:true}, - nsweiyuan_use_backup:{}, - nsweiyuan_use:{ - enable:'phaseUse', - charlotte:true, - mod:{ - cardUsable(){ - if(_status.event.skill=='nsweiyuan_use_backup') return Infinity; + nsweiyuan2: { charlotte: true }, + nsweiyuan_use_backup: {}, + nsweiyuan_use: { + enable: "phaseUse", + charlotte: true, + mod: { + cardUsable() { + if (_status.event.skill == "nsweiyuan_use_backup") return Infinity; }, - targetInRange(){ - if(_status.event.skill=='nsweiyuan_use_backup') return true; + targetInRange() { + if (_status.event.skill == "nsweiyuan_use_backup") return true; }, }, - onChooseToUse(event){ - if(game.online||event.type!='phase') return; - var list=[]; - event.player.getHistory('useCard',function(evt){ - var name=evt.card.name; - var type=get.type(name); - if(type!='basic'&&type!='trick') return; - if(name=='sha'){ - var nature=evt.card.nature; - switch(nature){ - case 'fire':name='huosha';break; - case 'thunder':name='leisha';break; - case 'kami':name='kamisha';break; - case 'ice':name='icesha';break; + onChooseToUse(event) { + if (game.online || event.type != "phase") return; + var list = []; + event.player.getHistory("useCard", function (evt) { + var name = evt.card.name; + var type = get.type(name); + if (type != "basic" && type != "trick") return; + if (name == "sha") { + var nature = evt.card.nature; + switch (nature) { + case "fire": + name = "huosha"; + break; + case "thunder": + name = "leisha"; + break; + case "kami": + name = "kamisha"; + break; + case "ice": + name = "icesha"; + break; } } - list.add(type+'咕咕'+name); + list.add(type + "咕咕" + name); }); - event.set('nsweiyuan_list',list); + event.set("nsweiyuan_list", list); }, - filter(event,player){ - return player.countCards('h')>0&&event.nsweiyuan_list&&event.nsweiyuan_list.length>0; + filter(event, player) { + return ( + player.countCards("h") > 0 && event.nsweiyuan_list && event.nsweiyuan_list.length > 0 + ); }, - chooseButton:{ - dialog(event,player){ - return ui.create.dialog('围援',[event.nsweiyuan_list.map(function(i){ - return i.split('咕'); - }),'vcard']); + chooseButton: { + dialog(event, player) { + return ui.create.dialog("围援", [ + event.nsweiyuan_list.map(function (i) { + return i.split("咕"); + }), + "vcard", + ]); }, - filter(button,player){ - return lib.filter.cardEnabled({ - name:button.link[2], - nature:button.link[3], - },player); + filter(button, player) { + return lib.filter.cardEnabled( + { + name: button.link[2], + nature: button.link[3], + }, + player + ); }, - check(button){ - return _status.event.player.getUseValue({ - name:button.link[2], - nature:button.link[3], - },false); + check(button) { + return _status.event.player.getUseValue( + { + name: button.link[2], + nature: button.link[3], + }, + false + ); }, - backup(links,player){ + backup(links, player) { return { - popname:true, - position:'h', - filterCard:true, - ai1(card){ - return 7-get.value(card); + popname: true, + position: "h", + filterCard: true, + ai1(card) { + return 7 - get.value(card); }, - viewAs:{ - name:links[0][2], - nature:links[0][3], + viewAs: { + name: links[0][2], + nature: links[0][3], }, - onuse(links,player){ - player.removeSkill('nsweiyuan_use'); + onuse(links, player) { + player.removeSkill("nsweiyuan_use"); }, - } + }; }, - prompt(links,player){ - return '将一张手牌当做'+get.translation(links[0][3]||'')+get.translation(links[0][2])+'使用'; + prompt(links, player) { + return ( + "将一张手牌当做" + + get.translation(links[0][3] || "") + + get.translation(links[0][2]) + + "使用" + ); }, }, - ai:{ - order:1, - result:{ - player:1, + ai: { + order: 1, + result: { + player: 1, }, }, }, - nsjuxian:{ - trigger:{player:'damageBegin2'}, - filter(event,player){ - return !player.hasSkill('nsjuxian2'); + nsjuxian: { + trigger: { player: "damageBegin2" }, + filter(event, player) { + return !player.hasSkill("nsjuxian2"); }, - check(event,player){ - if(player.countCards('h')+2>=player.maxHp) return !event.source||!event.source.countCards('he')||get.attitude(player,event.source)>0; + check(event, player) { + if (player.countCards("h") + 2 >= player.maxHp) + return ( + !event.source || + !event.source.countCards("he") || + get.attitude(player, event.source) > 0 + ); return true; }, - content(){ - 'step 0' - player.addSkill('nsjuxian2'); + content() { + "step 0"; + player.addSkill("nsjuxian2"); player.draw(2); - 'step 1' - var target=trigger.source; - if(player.countCards('h')>=player.maxHp&&target&&target.countCards('he')){ - player.line(target,'green'); - target.chooseToDiscard('he',true); + ("step 1"); + var target = trigger.source; + if (player.countCards("h") >= player.maxHp && target && target.countCards("he")) { + player.line(target, "green"); + target.chooseToDiscard("he", true); } }, }, - nsjuxian2:{ - trigger:{player:'phaseDrawBefore'}, - forced:true, - charlotte:true, - content(){ - player.removeSkill('nsjuxian2'); + nsjuxian2: { + trigger: { player: "phaseDrawBefore" }, + forced: true, + charlotte: true, + content() { + player.removeSkill("nsjuxian2"); trigger.cancel(); - game.log(player,'跳过了','#y摸牌阶段'); + game.log(player, "跳过了", "#y摸牌阶段"); }, }, - nsdiewu:{ - trigger:{ - player:['damageEnd','gainAfter'], - global:'loseAsyncAfter', + nsdiewu: { + trigger: { + player: ["damageEnd", "gainAfter"], + global: "loseAsyncAfter", }, - forced:true, - locked:false, - filter(event,player){ - if(event.name!='damage') return event.getg(player).length>1; + forced: true, + locked: false, + filter(event, player) { + if (event.name != "damage") return event.getg(player).length > 1; return true; }, - content(){ - player.addMark('nsdiewu',1); + content() { + player.addMark("nsdiewu", 1); }, - intro:{ - content:'mark', + intro: { + content: "mark", }, - group:['nsdiewu_sha','nsdiewu_shan','nsdiewu_draw'], - subSkill:{ - sha:{ - enable:'chooseToUse', - viewAs:{name:'sha',isCard:true}, - prompt:'视为使用一张【杀】', - viewAsFilter(player){ - return player.countMark('nsdiewu')>0; + group: ["nsdiewu_sha", "nsdiewu_shan", "nsdiewu_draw"], + subSkill: { + sha: { + enable: "chooseToUse", + viewAs: { name: "sha", isCard: true }, + prompt: "视为使用一张【杀】", + viewAsFilter(player) { + return player.countMark("nsdiewu") > 0; }, - filterCard:()=>false, - selectCard:-1, - onuse(links,player){ - player.removeMark('nsdiewu',1); + filterCard: () => false, + selectCard: -1, + onuse(links, player) { + player.removeMark("nsdiewu", 1); }, - ai:{ - order(){ - var player=_status.event.player; - if(!player.storage.nspojian&&player.countMark('nsdiewu')<=player.hp) return 0; - return get.order({name:'sha'})+0.1; + ai: { + order() { + var player = _status.event.player; + if (!player.storage.nspojian && player.countMark("nsdiewu") <= player.hp) + return 0; + return get.order({ name: "sha" }) + 0.1; }, }, }, - shan:{ - enable:'chooseToUse', - viewAs:{name:'shan',isCard:true}, - viewAsFilter(player){ - return player.countMark('nsdiewu')>0&&!player.storage.nspojian; + shan: { + enable: "chooseToUse", + viewAs: { name: "shan", isCard: true }, + viewAsFilter(player) { + return player.countMark("nsdiewu") > 0 && !player.storage.nspojian; }, - filterCard:()=>false, - selectCard:-1, - onuse(links,player){ - player.removeMark('nsdiewu',1); + filterCard: () => false, + selectCard: -1, + onuse(links, player) { + player.removeMark("nsdiewu", 1); }, - ai:{ - order(){ - var player=_status.event.player; - if(player.hp>1&&player.countMark('nsdiewu')<=player.hp) return 0; - return get.order({name:'shan'})-0.2; + ai: { + order() { + var player = _status.event.player; + if (player.hp > 1 && player.countMark("nsdiewu") <= player.hp) return 0; + return get.order({ name: "shan" }) - 0.2; }, }, }, - draw:{ - trigger:{source:'damageEnd'}, - forced:true, - popup:false, - filter(event,player){ - var evt=event.getParent(); - return evt&&evt.type=='card'&&evt.skill=='nsdiewu_sha'; + draw: { + trigger: { source: "damageEnd" }, + forced: true, + popup: false, + filter(event, player) { + var evt = event.getParent(); + return evt && evt.type == "card" && evt.skill == "nsdiewu_sha"; }, - content(){ + content() { player.draw(); }, }, }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player,tag){ - if(tag=='respondShan'&&player.storage.nspojian) return false; - return player.countMark('nsdiewu')>0; + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + if (tag == "respondShan" && player.storage.nspojian) return false; + return player.countMark("nsdiewu") > 0; }, }, }, - nslingying:{ - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha') return num+1; + nslingying: { + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + 1; }, - targetInRange(card){ - if(card.name=='sha') return true; + targetInRange(card) { + if (card.name == "sha") return true; }, }, }, - nspojian:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'fire', - filter(event,player){ - return player.countMark('nsdiewu')>=player.hp; + nspojian: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "fire", + filter(event, player) { + return player.countMark("nsdiewu") >= player.hp; }, - content(){ - player.awakenSkill('nspojian'); - player.storage.nspojian=true; + content() { + player.awakenSkill("nspojian"); + player.storage.nspojian = true; player.loseMaxHp(); player.draw(2); - player.addSkill('nsliegong'); + player.addSkill("nsliegong"); }, - derivation:'nsliegong', + derivation: "nsliegong", }, - nsliegong:{ - inherit:'xinliegong', + nsliegong: { + inherit: "xinliegong", }, - nsguolie:{ - trigger:{player:'phaseDrawBefore'}, - check(event,player){ - var h1=player.getUseValue({name:'sha'},false); - var h2=player.getUseValue({name:'guohe'}); - return player.countCards('h',function(card){ - if(get.color(card)=='red') return h1>0; - return h2>0; - })>2; + nsguolie: { + trigger: { player: "phaseDrawBefore" }, + check(event, player) { + var h1 = player.getUseValue({ name: "sha" }, false); + var h2 = player.getUseValue({ name: "guohe" }); + return ( + player.countCards("h", function (card) { + if (get.color(card) == "red") return h1 > 0; + return h2 > 0; + }) > 2 + ); }, - content(){ + content() { trigger.cancel(); - player.addTempSkill('nsguolie2'); + player.addTempSkill("nsguolie2"); }, }, - nsguolie2:{ - mod:{ - cardname(card,player){ - var color=get.color(card,player); - if(color=='red') return 'sha'; - if(color=='black') return 'guohe'; + nsguolie2: { + mod: { + cardname(card, player) { + var color = get.color(card, player); + if (color == "red") return "sha"; + if (color == "black") return "guohe"; }, - cardnature(){ + cardnature() { return false; }, - cardUsable(){ + cardUsable() { return Infinity; }, - targetInRange(){ + targetInRange() { return true; }, }, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter(event,player){ - var cards=[]; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.player==player) return; - for(var i of evt.cards){ - if(get.position(i,true)=='d') cards.push(i); + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter(event, player) { + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.player == player) return; + for (var i of evt.cards) { + if (get.position(i, true) == "d") cards.push(i); } }); - return cards.length>0; + return cards.length > 0; }, - content(){ - var cards=[]; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.player==player) return; - if(evt.name=='cardsDiscard'&&evt.parent.name=='orderingDiscard') return; - for(var i of evt.cards){ - if(get.position(i,true)=='d') cards.push(i); + content() { + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.player == player) return; + if (evt.name == "cardsDiscard" && evt.parent.name == "orderingDiscard") return; + for (var i of evt.cards) { + if (get.position(i, true) == "d") cards.push(i); } }); - player.gain(cards,'gain2'); + player.gain(cards, "gain2"); }, }, - nslongyue:{ - init:()=>{ - game.addGlobalSkill('nslongyue_ai'); + nslongyue: { + init: () => { + game.addGlobalSkill("nslongyue_ai"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('nslongyue'),true)) game.removeGlobalSkill('nslongyue_ai'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("nslongyue"), true)) + game.removeGlobalSkill("nslongyue_ai"); }, - trigger:{global:'useCard'}, - filter(event,player){ - return get.type(event.card,'trick')=='trick'&&event.player.getHistory('useCard').indexOf(event)==0; + trigger: { global: "useCard" }, + filter(event, player) { + return ( + get.type(event.card, "trick") == "trick" && + event.player.getHistory("useCard").indexOf(event) == 0 + ); }, - logTarget:'player', - check(event,player){ - return get.attitude(player,event.player)>0; + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 0; }, - content(){ + content() { trigger.player.draw(); }, - ai:{ - expose:0.2, - } + ai: { + expose: 0.2, + }, }, - nslongyue_ai:{ - mod:{ - aiOrder(player,card,num){ - if(!player.getHistory('useCard').length&&get.type(card)=='trick'&&game.hasPlayer(function(current){ - return current.hasSkill('nslongyue')&&get.attitude(player,current)>=0; - })) return num+6; + nslongyue_ai: { + mod: { + aiOrder(player, card, num) { + if ( + !player.getHistory("useCard").length && + get.type(card) == "trick" && + game.hasPlayer(function (current) { + return current.hasSkill("nslongyue") && get.attitude(player, current) >= 0; + }) + ) + return num + 6; }, }, - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('nslongyue'),true); + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("nslongyue"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("nslongyue_ai"); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('nslongyue_ai'); - } }, - nszhenyin:{ - trigger:{global:'judge'}, - usable:1, - filter(event,player){ - return _status.currentPhase&&_status.currentPhase.countCards('h')>0; + nszhenyin: { + trigger: { global: "judge" }, + usable: 1, + filter(event, player) { + return _status.currentPhase && _status.currentPhase.countCards("h") > 0; }, - logTarget(){ + logTarget() { return _status.currentPhase; }, - check(event,player){ - var target=_status.currentPhase; - var judge=event.judge(event.player.judging[0]); - var max=0; - var hs=target.getCards('h',function(card){ - var mod2=game.checkMod(card,target,'unchanged','cardEnabled2',target); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,target,'unchanged','cardRespondable',target); - if(mod!='unchanged') return mod; + check(event, player) { + var target = _status.currentPhase; + var judge = event.judge(event.player.judging[0]); + var max = 0; + var hs = target.getCards("h", function (card) { + var mod2 = game.checkMod(card, target, "unchanged", "cardEnabled2", target); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, target, "unchanged", "cardRespondable", target); + if (mod != "unchanged") return mod; return true; }); - for(var i of hs){ - var num=event.judge(i)-judge; - if(num>max) max=num; + for (var i of hs) { + var num = event.judge(i) - judge; + if (num > max) max = num; } - var att=get.attitude(player,target); - if(att>0) return max>0; - if(att<0) return max<=0; + var att = get.attitude(player, target); + if (att > 0) return max > 0; + if (att < 0) return max <= 0; return false; }, - content(){ - "step 0" - if(!_status.currentPhase.countCards('h',function(card){ - var player=_status.currentPhase; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - })){ + content() { + "step 0"; + if ( + !_status.currentPhase.countCards("h", function (card) { + var player = _status.currentPhase; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + ) { event.finish(); return; } - _status.currentPhase.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+',请打出一张手牌进行改判','h',true,function(card){ - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result/Math.max(0.1,get.value(card)); - } - else{ - return -result/Math.max(0.1,get.value(card)); - } - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.bool){ - _status.currentPhase.respond(result.cards,'highlight').nopopup=true; - } - else{ + _status.currentPhase + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + ",请打出一张手牌进行改判", + "h", + true, + function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result / Math.max(0.1, get.value(card)); + } else { + return -result / Math.max(0.1, get.value(card)); + } + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + _status.currentPhase.respond(result.cards, "highlight").nopopup = true; + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); game.delay(2); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, }, - nsxianhai:{ - trigger:{global:'damageSource'}, - filter(event,player){ - return event.source&&event.source!=player&&event.source.isIn()&&event.source==_status.currentPhase&& - (event.source.getStat('damage')||0)>(player.getLastStat('damage')||0)&& - !player.hasSkill('nsxianhai_round'); + nsxianhai: { + trigger: { global: "damageSource" }, + filter(event, player) { + return ( + event.source && + event.source != player && + event.source.isIn() && + event.source == _status.currentPhase && + (event.source.getStat("damage") || 0) > (player.getLastStat("damage") || 0) && + !player.hasSkill("nsxianhai_round") + ); }, - check(event,player){ - return player.maxHp>1&&get.attitude(player,event.source)<-4; + check(event, player) { + return player.maxHp > 1 && get.attitude(player, event.source) < -4; }, - logTarget:'source', - content(){ - 'step 0' - player.addTempSkill('nsxianhai_round','roundStart'); + logTarget: "source", + content() { + "step 0"; + player.addTempSkill("nsxianhai_round", "roundStart"); player.loseMaxHp(); - var list=[]; - for(var i=1;i<6;i++){ - if(trigger.source.hasEnabledSlot(i)) list.add('equip'+((i==3||i==4)?'3_4':i)); + var list = []; + for (var i = 1; i < 6; i++) { + if (trigger.source.hasEnabledSlot(i)) + list.add("equip" + (i == 3 || i == 4 ? "3_4" : i)); } - if(list.length){ - player.chooseControl(list).set('prompt','选择废除'+get.translation(trigger.source)+'的一种装备栏').set('ai',function(){ - var target=_status.event.getTrigger().source; - if(list.includes('equip6')&&target.getEquip('equip3')&&target.getEquip('equip4')) return 'equip6'; - if(list.includes('equip2')&&target.getEquip(2)&&get.value(target.getEquip(2),target)>0) return 'equip2'; - if(list.includes('equip5')&&target.getEquip(5)&&get.value(target.getEquip(5),target)>0) return 'equip5'; - return 0; - }); + if (list.length) { + player + .chooseControl(list) + .set("prompt", "选择废除" + get.translation(trigger.source) + "的一种装备栏") + .set("ai", function () { + var target = _status.event.getTrigger().source; + if ( + list.includes("equip6") && + target.getEquip("equip3") && + target.getEquip("equip4") + ) + return "equip6"; + if ( + list.includes("equip2") && + target.getEquip(2) && + get.value(target.getEquip(2), target) > 0 + ) + return "equip2"; + if ( + list.includes("equip5") && + target.getEquip(5) && + get.value(target.getEquip(5), target) > 0 + ) + return "equip5"; + return 0; + }); + } else event.goto(2); + ("step 1"); + if (result.control != "equip3_4") trigger.source.disableEquip(result.control); + else { + trigger.source.disableEquip(3, 4); } - else event.goto(2); - 'step 1' - if(result.control!='equip3_4') trigger.source.disableEquip(result.control); - else{ - trigger.source.disableEquip(3,4); - } - 'step 2' - if(player.awakenedSkills.includes('nsxingchu')){ - var next=game.createEvent('nsxianhai_clear'); + ("step 2"); + if (player.awakenedSkills.includes("nsxingchu")) { + var next = game.createEvent("nsxianhai_clear"); event.next.remove(next); - event.getParent('phase').after.push(next); - next.player=player; - next.setContent(function(){ - player.restoreSkill('nsxingchu'); + event.getParent("phase").after.push(next); + next.player = player; + next.setContent(function () { + player.restoreSkill("nsxingchu"); }); } - 'step 3' - if(trigger.source){ - var hs=trigger.source.getCards('h','shan'); - if(hs.length) trigger.source.discard(hs); + ("step 3"); + if (trigger.source) { + var hs = trigger.source.getCards("h", "shan"); + if (hs.length) trigger.source.discard(hs); } }, }, - nsxianhai_round:{charlotte:true}, - nsxingchu:{ - trigger:{global:'die'}, - forceDie:true, - filter(event,player){ - return player==event.player||player==event.source; + nsxianhai_round: { charlotte: true }, + nsxingchu: { + trigger: { global: "die" }, + forceDie: true, + filter(event, player) { + return player == event.player || player == event.source; }, - limited:true, - skillAnimation:true, - animationColor:'wood', - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('nsxingchu')).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).set('forceDie',true); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('nsxingchu',target); - player.awakenSkill('nsxingchu'); - var he=trigger.player.getCards('he'); - if(he.length) target.gain(he,trigger.player,'giveAuto','bySelf'); + limited: true, + skillAnimation: true, + animationColor: "wood", + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsxingchu")) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("forceDie", true); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("nsxingchu", target); + player.awakenSkill("nsxingchu"); + var he = trigger.player.getCards("he"); + if (he.length) target.gain(he, trigger.player, "giveAuto", "bySelf"); target.gainMaxHp(); } }, }, - nsshengyan:{ - trigger:{player:'judgeEnd'}, - forced:true, - filter(event,player){ - return _status.currentPhase&&_status.currentPhase.isIn()&&(!player.storage.nsshengyan2||!player.storage.nsshengyan2.includes(event.result.suit)); + nsshengyan: { + trigger: { player: "judgeEnd" }, + forced: true, + filter(event, player) { + return ( + _status.currentPhase && + _status.currentPhase.isIn() && + (!player.storage.nsshengyan2 || + !player.storage.nsshengyan2.includes(event.result.suit)) + ); }, - logTarget(){ + logTarget() { return _status.currentPhase; }, - content(){ - player.addTempSkill('nsshengyan2'); - if(!player.storage.nsshengyan2) player.storage.nsshengyan2=[]; - _status.currentPhase.addTempSkill('nsshengyan3'); + content() { + player.addTempSkill("nsshengyan2"); + if (!player.storage.nsshengyan2) player.storage.nsshengyan2 = []; + _status.currentPhase.addTempSkill("nsshengyan3"); player.storage.nsshengyan2.add(trigger.result.suit); - _status.currentPhase.addMark('nsshengyan3',2,false); + _status.currentPhase.addMark("nsshengyan3", 2, false); }, }, - nsshengyan2:{onremove:true}, - nsshengyan3:{ - mod:{ - maxHandcard(player,num){ - return num+player.countMark('nsshengyan3'); + nsshengyan2: { onremove: true }, + nsshengyan3: { + mod: { + maxHandcard(player, num) { + return num + player.countMark("nsshengyan3"); }, }, - onremove:true, - intro:{ - content:'本回合手牌上限+#', + onremove: true, + intro: { + content: "本回合手牌上限+#", }, - marktext:'筵', + marktext: "筵", }, - nsdaizhan:{ - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter(event,player){ - return (!player.hasJudge('lebu')||!player.hasJudge('bingliang'))&&player.countCards('he',function(card){ - if(_status.connectMode) return true; - return get.type(card,'trick')!='trick'; - }); + nsdaizhan: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter(event, player) { + return ( + (!player.hasJudge("lebu") || !player.hasJudge("bingliang")) && + player.countCards("he", function (card) { + if (_status.connectMode) return true; + return get.type(card, "trick") != "trick"; + }) + ); }, - content(){ - var next=player.chooseToUse(); - next.set('norestore',true); - next.set('_backupevent','nsdaizhanx'); - next.set('custom',{ - add:{}, - replace:{window(){}} + content() { + var next = player.chooseToUse(); + next.set("norestore", true); + next.set("_backupevent", "nsdaizhanx"); + next.set("custom", { + add: {}, + replace: { window() {} }, }); - next.backup('nsdaizhanx'); + next.backup("nsdaizhanx"); }, }, - nsdaizhanx:{ - chooseButton:{ - dialog(){ - var list=['lebu','bingliang']; - var list2=[]; - for(var i of list){ - list2.push(['延时锦囊','',i]); + nsdaizhanx: { + chooseButton: { + dialog() { + var list = ["lebu", "bingliang"]; + var list2 = []; + for (var i of list) { + list2.push(["延时锦囊", "", i]); } - return ui.create.dialog(get.prompt('nsdaizhan'),[list2,'vcard'],'hidden'); + return ui.create.dialog(get.prompt("nsdaizhan"), [list2, "vcard"], "hidden"); }, - filter(button,player){ - return !player.hasJudge(button.link[2]) + filter(button, player) { + return !player.hasJudge(button.link[2]); }, - check(button){ - if(button.link[2]=='lebu') return 0; - var player=_status.event.player; - var delta=player.getHandcardLimit()+player.countCards('j')*2+2-player.hp; - if(delta>=2) return 1+Math.random(); - if(delta>=0&&!player.countCards('h',function(card){ - return player.hasValueTarget(card); - })) return Math.random(); + check(button) { + if (button.link[2] == "lebu") return 0; + var player = _status.event.player; + var delta = player.getHandcardLimit() + player.countCards("j") * 2 + 2 - player.hp; + if (delta >= 2) return 1 + Math.random(); + if ( + delta >= 0 && + !player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) + return Math.random(); return 0; }, - backup(links,player){ + backup(links, player) { return { - filterCard(card,player){ - return get.itemtype(card)=='card'&&get.type(card,'trick')!='trick'&&player.canAddJudge({name:links[0][2],cards:[card]}); + filterCard(card, player) { + return ( + get.itemtype(card) == "card" && + get.type(card, "trick") != "trick" && + player.canAddJudge({ + name: links[0][2], + cards: [card], + }) + ); }, - filterTarget(card,player,target){ - return player==target; + filterTarget(card, player, target) { + return player == target; }, - check(card){ - return 8-get.value(card); + check(card) { + return 8 - get.value(card); }, - viewAs:{name:links[0][2]}, - position:'he', - precontent(){ - player.addTempSkill('nsdaizhany'); - event.result.skill='nsdaizhan'; + viewAs: { name: links[0][2] }, + position: "he", + precontent() { + player.addTempSkill("nsdaizhany"); + event.result.skill = "nsdaizhan"; }, - ai:{ - result:{ - target:1, + ai: { + result: { + target: 1, }, }, }; }, - prompt(links){ - return '将一张牌当做'+get.translation(links[0][2])+'对自己使用'; + prompt(links) { + return "将一张牌当做" + get.translation(links[0][2]) + "对自己使用"; }, }, }, - nsdaizhany:{ - trigger:{player:'phaseEnd'}, - forced:true, - popup:false, - filter(event,player){ - return player.countCards('h')0; + direct: true, + filter(event, player, name) { + var target = name == "damageSource" ? event.source : event.player; + return ( + target && + target != player && + get.distance(player, target) <= 1 && + target.countCards("hej") > 0 + ); }, - locked(skill,player){ - return player&&player.storage.nsfuwei; + locked(skill, player) { + return player && player.storage.nsfuwei; }, - content(){ - 'step 0' - var target=(event.triggername=='damageSource'?trigger.source:trigger.player); - event.target=target; - player.choosePlayerCard(target,'hej',player.storage.nsfuwei?true:1).set('ai',function(button){ - var val=get.buttonValue(button); - if(get.attitude(_status.event.player,get.owner(button.link))>0) return -val; - return val; - }); - 'step 1' - if(result.bool){ - player.logSkill('nsjiquan',target); - player.addToExpansion(result.cards,target,'give').gaintag.add('nsjiquan_mark'); - } - else event.finish(); - 'step 2' + content() { + "step 0"; + var target = event.triggername == "damageSource" ? trigger.source : trigger.player; + event.target = target; + player + .choosePlayerCard(target, "hej", player.storage.nsfuwei ? true : 1) + .set("ai", function (button) { + var val = get.buttonValue(button); + if (get.attitude(_status.event.player, get.owner(button.link)) > 0) return -val; + return val; + }); + ("step 1"); + if (result.bool) { + player.logSkill("nsjiquan", target); + player.addToExpansion(result.cards, target, "give").gaintag.add("nsjiquan_mark"); + } else event.finish(); + ("step 2"); game.delayx(); }, - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha') return num+player.getExpansions('nsjiquan_mark').length; + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.getExpansions("nsjiquan_mark").length; }, }, }, - nsjiquan_mark:{ - intro:{ - content:'expansion', - markcount:'expansion', + nsjiquan_mark: { + intro: { + content: "expansion", + markcount: "expansion", }, - marktext:'威', + marktext: "威", }, - nsfuwei:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - unique:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - filter(event,player){ - return player.getExpansions('nsjiquan_mark').length>4; + nsfuwei: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.getExpansions("nsjiquan_mark").length > 4; }, - content(){ - player.awakenSkill('nsfuwei'); - player.storage.nsfuwei=true; - player.addSkill('nsdiemou'); - player.addSkill('nszhihuang'); + content() { + player.awakenSkill("nsfuwei"); + player.storage.nsfuwei = true; + player.addSkill("nsdiemou"); + player.addSkill("nszhihuang"); player.gainMaxHp(2); }, - derivation:['nsdiemou','nszhihuang'], + derivation: ["nsdiemou", "nszhihuang"], }, - nsdiemou:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - filter(event,player){ - return player.getExpansions('nsjiquan_mark').length>game.players.length; + nsdiemou: { + trigger: { player: "phaseUseBegin" }, + forced: true, + filter(event, player) { + return player.getExpansions("nsjiquan_mark").length > game.players.length; }, - content(){ - var cards=player.getExpansions('nsjiquan_mark'); + content() { + var cards = player.getExpansions("nsjiquan_mark"); player.draw(cards.length); player.loseMaxHp(); player.loseToDiscardpile(cards); - if(cards.length>4) player.turnOver(); + if (cards.length > 4) player.turnOver(); }, }, - nszhihuang:{ - group:'nszhihuang_damage', - trigger:{global:'useCard'}, - usable:1, - filter(event,player){ - return event.player==get.zhu(player)&&player.getExpansions('nsjiquan_mark').length>0&&event.cards&&event.cards.filterInD().length>0; + nszhihuang: { + group: "nszhihuang_damage", + trigger: { global: "useCard" }, + usable: 1, + filter(event, player) { + return ( + event.player == get.zhu(player) && + player.getExpansions("nsjiquan_mark").length > 0 && + event.cards && + event.cards.filterInD().length > 0 + ); }, - prompt2(event){ - return '移去一张“威”并获得'+get.translation(event.cards.filterInD()); + prompt2(event) { + return "移去一张“威”并获得" + get.translation(event.cards.filterInD()); }, - check(event,player){ - if(['equip','delay'].includes(get.type(event.card))) return get.attitude(player,event.player)<0; - return get.value(event.cards.filterInD())>0; + check(event, player) { + if (["equip", "delay"].includes(get.type(event.card))) + return get.attitude(player, event.player) < 0; + return get.value(event.cards.filterInD()) > 0; }, - logTarget:'player', - content(){ - 'step 0' - var cards=player.getExpansions('nsjiquan_mark'); - if(cards.length==1) event._result={ - bool:true, - links:cards.slice(0), - } - else player.chooseButton(['选择移去一张“威”',cards],true); - 'step 1' + logTarget: "player", + content() { + "step 0"; + var cards = player.getExpansions("nsjiquan_mark"); + if (cards.length == 1) + event._result = { + bool: true, + links: cards.slice(0), + }; + else player.chooseButton(["选择移去一张“威”", cards], true); + ("step 1"); player.loseToDiscardpile(result.links); - player.gain(trigger.cards.filterInD(),'gain2','log'); + player.gain(trigger.cards.filterInD(), "gain2", "log"); }, }, - nszhihuang_damage:{ - trigger:{source:'damageBegin1'}, - forced:true, - filter(event,player){ - var zhu=get.zhu(player); - return zhu&&player.countCards('h')>zhu.countCards('h')&&event.getParent().type=='card'; + nszhihuang_damage: { + trigger: { source: "damageBegin1" }, + forced: true, + filter(event, player) { + var zhu = get.zhu(player); + return ( + zhu && + player.countCards("h") > zhu.countCards("h") && + event.getParent().type == "card" + ); }, - content(){ + content() { trigger.num++; }, }, //OL神张角 - junksijun:{ - audio:'sijun', - inherit:'sijun', - check(event,player){ + junksijun: { + audio: "sijun", + inherit: "sijun", + check(event, player) { return ui.cardPile.childNodes.length; }, - async content(event,trigger,player){ - player.removeMark('yizhao',player.countMark('yizhao')); - const pile=Array.from(ui.cardPile.childNodes); - if(pile.length){ - const max=Math.pow(2,Math.min(100,pile.length)); - let bool=false,index,cards=[]; - for(let i=0;i36) break; + for (var k = 0; k < index.length; k++) { + if (index[k] == "1") num += get.number(pile[k]); + if (num > 36) break; } - if(num==36){ - bool=true; + if (num == 36) { + bool = true; break; } } - if(bool){ - for(let k=0;k=36) break; + if (total >= 36) break; } } - if(cards.length) await player.gain(cards,'gain2'); + if (cards.length) await player.gain(cards, "gain2"); } }, }, //手杀削弱版许攸 - junkshicai:{ - audio:'nzry_shicai_2', - trigger:{player:'useCardAfter'}, - filter(event,player){ - if(!event.cards.filterInD('oe').length) return false; - return player.getHistory('useCard',evt=>get.type2(evt.card)==get.type2(event.card)).indexOf(event)==0; + junkshicai: { + audio: "nzry_shicai_2", + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (!event.cards.filterInD("oe").length) return false; + return ( + player + .getHistory("useCard", (evt) => get.type2(evt.card) == get.type2(event.card)) + .indexOf(event) == 0 + ); }, - prompt2(event,player){ - const cards=event.cards.filterInD('oe'); - return '你可以将'+get.translation(cards)+(cards.length>1?'以任意顺序':'')+'置于牌堆顶,然后摸一张牌'; + prompt2(event, player) { + const cards = event.cards.filterInD("oe"); + return ( + "你可以将" + + get.translation(cards) + + (cards.length > 1 ? "以任意顺序" : "") + + "置于牌堆顶,然后摸一张牌" + ); }, - content(){ - 'step 0' - event.cards=trigger.cards.filterInD('oe'); - var lose_list=[]; - event.cards.forEach(card=>{ - var owner=get.owner(card); - if(owner){ - var arr=lose_list.find(i=>i[0]==owner); - if(arr) arr[1].push(card); - else lose_list.push([owner,[card]]); + content() { + "step 0"; + event.cards = trigger.cards.filterInD("oe"); + var lose_list = []; + event.cards.forEach((card) => { + var owner = get.owner(card); + if (owner) { + var arr = lose_list.find((i) => i[0] == owner); + if (arr) arr[1].push(card); + else lose_list.push([owner, [card]]); } }); - if(lose_list.length){ + if (lose_list.length) { game.loseAsync({ - lose_list:lose_list, - }).setContent('chooseToCompareLose'); + lose_list: lose_list, + }).setContent("chooseToCompareLose"); } - 'step 1' - if(cards.length>1){ - var next=player.chooseToMove('恃才:将牌按顺序置于牌堆顶'); - next.set('list',[['牌堆顶',cards]]); - next.set('reverse',((_status.currentPhase&&_status.currentPhase.next)?get.attitude(player,_status.currentPhase.next)>0:false)); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0); - cards.sort(function(a,b){ - return (_status.event.reverse?1:-1)*(get.value(b)-get.value(a)); + ("step 1"); + if (cards.length > 1) { + var next = player.chooseToMove("恃才:将牌按顺序置于牌堆顶"); + next.set("list", [["牌堆顶", cards]]); + next.set( + "reverse", + _status.currentPhase && _status.currentPhase.next + ? get.attitude(player, _status.currentPhase.next) > 0 + : false + ); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0); + cards.sort(function (a, b) { + return (_status.event.reverse ? 1 : -1) * (get.value(b) - get.value(a)); }); return [cards]; }); } - 'step 2' - if(result.bool&&result.moved&&result.moved[0].length) cards=result.moved[0].slice(0); + ("step 2"); + if (result.bool && result.moved && result.moved[0].length) + cards = result.moved[0].slice(0); cards.reverse(); - game.cardsGotoPile(cards,'insert'); - game.log(player,'将',cards,'置于了牌堆顶'); + game.cardsGotoPile(cards, "insert"); + game.log(player, "将", cards, "置于了牌堆顶"); player.draw(); }, - ai:{ - reverseOrder:true, - skillTagFilter(player){ - if(player.getHistory('useCard',function(evt){ - return get.type(evt.card)=='equip'; - }).length>0) return false; + ai: { + reverseOrder: true, + skillTagFilter(player) { + if ( + player.getHistory("useCard", function (evt) { + return get.type(evt.card) == "equip"; + }).length > 0 + ) + return false; }, }, }, //削弱版段煨 - junklangmie:{ - audio:'langmie', - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter(event,player){ - if(player==event.player||player.countCards('he')==0) return false; - var num=0; - if(event.player.hasHistory('sourceDamage',function(evt){ - num+=evt.num; - return num>=2; - })) return true; - var map={}; - return event.player.hasHistory('useCard',function(i){ - var name=get.type2(i.card,false); - if(!map[name]){ - map[name]=true; + junklangmie: { + audio: "langmie", + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + if (player == event.player || player.countCards("he") == 0) return false; + var num = 0; + if ( + event.player.hasHistory("sourceDamage", function (evt) { + num += evt.num; + return num >= 2; + }) + ) + return true; + var map = {}; + return event.player.hasHistory("useCard", function (i) { + var name = get.type2(i.card, false); + if (!map[name]) { + map[name] = true; return false; } return true; }); }, - content(){ - 'step 0' - var list=[],num=0,target=trigger.player; - event.target=target; - event.choices=[]; - var map={}; - if(target.hasHistory('useCard',function(i){ - var name=get.type2(i.card,false); - if(!map[name]){ - map[name]=true; - return false; - } - return true; - })){ - list.push('弃置一张牌,然后摸两张牌'); - event.choices.push('draw'); - } - if(target.hasHistory('sourceDamage',function(evt){ - num+=evt.num; - return num>=2; - })){ - list.push('弃置一张牌,对'+get.translation(target)+'造成1点伤害'); - event.choices.push('damage'); - } - player.chooseControl('cancel2').set('choiceList',list).set('ai',function(){ - var player=_status.event.player; - var choices=_status.event.getParent().choices.slice(0); - choices.push('cancel'); - choicex=choices.slice(0); - var getx=function(a){ - switch(a){ - case 'draw':return 2*get.effect(player,{name:'draw'},player,player); - case 'damage':return get.damageEffect(_status.event.getParent().target,player,player); - default:return 0; + content() { + "step 0"; + var list = [], + num = 0, + target = trigger.player; + event.target = target; + event.choices = []; + var map = {}; + if ( + target.hasHistory("useCard", function (i) { + var name = get.type2(i.card, false); + if (!map[name]) { + map[name] = true; + return false; } - } - choices.sort(function(a,b){ - return getx(b)-getx(a); - }); - return choicex.indexOf(choices[0]); - }).set('prompt',get.prompt('junklangmie',target)); - 'step 1' - if(result.control=='cancel2') event.finish(); - else{ - event.choice=event.choices[result.index]; - player.chooseToDiscard('he').set('ai',card=>(7-get.value(card))).logSkill=(event.choice=='draw'?'junklangmie':['junklangmie',target]); + return true; + }) + ) { + list.push("弃置一张牌,然后摸两张牌"); + event.choices.push("draw"); } - 'step 2' - if(result.bool){ - if(event.choice=='draw') player.draw(2); + if ( + target.hasHistory("sourceDamage", function (evt) { + num += evt.num; + return num >= 2; + }) + ) { + list.push("弃置一张牌,对" + get.translation(target) + "造成1点伤害"); + event.choices.push("damage"); + } + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("ai", function () { + var player = _status.event.player; + var choices = _status.event.getParent().choices.slice(0); + choices.push("cancel"); + choicex = choices.slice(0); + var getx = function (a) { + switch (a) { + case "draw": + return 2 * get.effect(player, { name: "draw" }, player, player); + case "damage": + return get.damageEffect( + _status.event.getParent().target, + player, + player + ); + default: + return 0; + } + }; + choices.sort(function (a, b) { + return getx(b) - getx(a); + }); + return choicex.indexOf(choices[0]); + }) + .set("prompt", get.prompt("junklangmie", target)); + ("step 1"); + if (result.control == "cancel2") event.finish(); + else { + event.choice = event.choices[result.index]; + player.chooseToDiscard("he").set("ai", (card) => 7 - get.value(card)).logSkill = + event.choice == "draw" ? "junklangmie" : ["junklangmie", target]; + } + ("step 2"); + if (result.bool) { + if (event.choice == "draw") player.draw(2); else target.damage(); } }, }, //李典光速通渠传说 - junkwangxi:{ - audio:'wangxi', - trigger:{player:'damageEnd',source:'damageSource'}, - filter(event){ - if(event._notrigger.includes(event.player)) return false; - return event.num&&event.source&&event.player&& - event.player.isIn()&&event.source.isIn()&&event.source!=event.player; + junkwangxi: { + audio: "wangxi", + trigger: { player: "damageEnd", source: "damageSource" }, + filter(event) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.num && + event.source && + event.player && + event.player.isIn() && + event.source.isIn() && + event.source != event.player + ); }, - check(event,player){ - if(player.isPhaseUsing()) return true; - if(event.player==player) return get.attitude(player,event.source)>-5; - return get.attitude(player,event.player)>-5; + check(event, player) { + if (player.isPhaseUsing()) return true; + if (event.player == player) return get.attitude(player, event.source) > -5; + return get.attitude(player, event.player) > -5; }, - logTarget(event,player){ - if(event.player==player) return event.source; + logTarget(event, player) { + if (event.player == player) return event.source; return event.player; }, - preHidden:true, - content(){ - 'step 0' - event.count=trigger.num; - event.target=lib.skill.junkwangxi.logTarget(trigger,player); - 'step 1' - player.draw(2).gaintag=['junkwangxi_tag']; + preHidden: true, + content() { + "step 0"; + event.count = trigger.num; + event.target = lib.skill.junkwangxi.logTarget(trigger, player); + ("step 1"); + player.draw(2).gaintag = ["junkwangxi_tag"]; event.count--; - 'step 2' - var cards=player.getCards('he',(card)=>card.hasGaintag('junkwangxi_tag')); - if(cards.length>0&&target.isIn()){ - if(cards.length==1) event._result={bool:true,cards:cards}; - else player.chooseCard('he','忘隙:交给'+get.translation(target)+'一张牌',true,function(card){ - return card.hasGaintag('junkwangxi_tag'); - }); + ("step 2"); + var cards = player.getCards("he", (card) => card.hasGaintag("junkwangxi_tag")); + if (cards.length > 0 && target.isIn()) { + if (cards.length == 1) event._result = { bool: true, cards: cards }; + else + player.chooseCard( + "he", + "忘隙:交给" + get.translation(target) + "一张牌", + true, + function (card) { + return card.hasGaintag("junkwangxi_tag"); + } + ); + } else event.goto(4); + ("step 3"); + if (result.bool) { + player.give(result.cards, target); } - else event.goto(4); - 'step 3' - if(result.bool){ - player.give(result.cards,target); - } - 'step 4' - player.removeGaintag('junkwangxi_tag'); - if(event.count&&target.isIn()&&player.hasSkill('junkwangxi')){ - player.chooseBool(get.prompt2('junkwangxi',target)); - } - else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('junkwangxi',target); + ("step 4"); + player.removeGaintag("junkwangxi_tag"); + if (event.count && target.isIn() && player.hasSkill("junkwangxi")) { + player.chooseBool(get.prompt2("junkwangxi", target)); + } else event.finish(); + ("step 5"); + if (result.bool) { + player.logSkill("junkwangxi", target); event.goto(1); } }, - ai:{ - maixie:true, - maixie_hp:true - } + ai: { + maixie: true, + maixie_hp: true, + }, }, //2013标准包双蜀黑 - junkjizhi:{ - audio:'jizhi', - trigger:{player:'useCard'}, - frequent:true, - filter(event,player){ - return get.type(event.card)=='trick'&&event.card.isCard; + junkjizhi: { + audio: "jizhi", + trigger: { player: "useCard" }, + frequent: true, + filter(event, player) { + return get.type(event.card) == "trick" && event.card.isCard; }, - content(){ - 'step 0' - var card=get.cards()[0]; - event.card=card; + content() { + "step 0"; + var card = get.cards()[0]; + event.card = card; game.cardsGotoOrdering(card); - player.showCards(card,get.translation(player)+'发动了【集智】'); - if(get.type(card)!='basic'){ - player.gain(card,'gain2'); + player.showCards(card, get.translation(player) + "发动了【集智】"); + if (get.type(card) != "basic") { + player.gain(card, "gain2"); event.finish(); - } - else if(!player.countCards('h')) event.finish(); - 'step 1' - player.chooseCard('h','是否用一张手牌交换'+get.translation(card)+'?','若选择「取消」,则'+get.translation(card)+'将被置入弃牌堆。'); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - player.$throw(card,1000); - game.log(player,'将',card,'置于牌堆顶'); - player.lose(card,ui.cardPile,'visible','insert'); - player.gain(event.card,'gain2'); + } else if (!player.countCards("h")) event.finish(); + ("step 1"); + player.chooseCard( + "h", + "是否用一张手牌交换" + get.translation(card) + "?", + "若选择「取消」,则" + get.translation(card) + "将被置入弃牌堆。" + ); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + player.$throw(card, 1000); + game.log(player, "将", card, "置于牌堆顶"); + player.lose(card, ui.cardPile, "visible", "insert"); + player.gain(event.card, "gain2"); } }, }, - junkqicai:{ - mod:{ - targetInRange(card,player,target,now){ - var type=get.type(card); - if(type=='trick'||type=='delay') return true; + junkqicai: { + mod: { + targetInRange(card, player, target, now) { + var type = get.type(card); + if (type == "trick" || type == "delay") return true; }, - canBeDiscarded(card){ - if(get.position(card)=='e'&&!['equip3','equip4','equip6'].includes(get.subtype(card))) return false; + canBeDiscarded(card) { + if ( + get.position(card) == "e" && + !["equip3", "equip4", "equip6"].includes(get.subtype(card)) + ) + return false; }, }, }, - junkrende:{ - audio:'rende', - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h')>0; + junkrende: { + audio: "rende", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; }, - filterTarget:lib.filter.notMe, - filterCard:true, - selectCard:[1,Infinity], - position:'h', - discard:false, - lose:false, - delay:false, - content(){ - 'step 0' - event.num=cards.length; - event.targets=targets.slice(0); - player.give(cards,target); - if(event.num>1) player.recover(); - 'step 1' - if(player.countCards('h')>0&&game.hasPlayer(current=>(current!=player&&!targets.includes(current)))){ + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: [1, Infinity], + position: "h", + discard: false, + lose: false, + delay: false, + content() { + "step 0"; + event.num = cards.length; + event.targets = targets.slice(0); + player.give(cards, target); + if (event.num > 1) player.recover(); + ("step 1"); + if ( + player.countCards("h") > 0 && + game.hasPlayer((current) => current != player && !targets.includes(current)) + ) { player.chooseCardTarget({ - prompt:'是否继续分配剩余的手牌', - prompt2:'操作提示:请先选择要分配的手牌,然后再选择一名角色,该角色将获得你选择的所有手牌。', - filterCard:true, - selectCard:[1,Infinity], - filterTarget(card,player,target){ - return target!=player&&!_status.event.getParent().targets.includes(target); + prompt: "是否继续分配剩余的手牌", + prompt2: + "操作提示:请先选择要分配的手牌,然后再选择一名角色,该角色将获得你选择的所有手牌。", + filterCard: true, + selectCard: [1, Infinity], + filterTarget(card, player, target) { + return ( + target != player && !_status.event.getParent().targets.includes(target) + ); }, }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0],cards=result.cards; - player.line(target,'green'); - player.give(cards,target); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.line(target, "green"); + player.give(cards, target); targets.add(target); - event.num+=cards.length; - if(num<2&&event.num>1) player.recover(); + event.num += cards.length; + if (num < 2 && event.num > 1) player.recover(); event.goto(1); } }, }, //十周年削弱版张让 - junktaoluan:{ - hiddenCard(player,name){ - return !player.getStorage('junktaoluan').includes(name)&&player.countCards('hes',card=>!player.getStorage('junktaoluan2').includes(get.suit(card)))>0&&!player.hasSkill('junktaoluan3')&&lib.inpile.includes(name); + junktaoluan: { + hiddenCard(player, name) { + return ( + !player.getStorage("junktaoluan").includes(name) && + player.countCards( + "hes", + (card) => !player.getStorage("junktaoluan2").includes(get.suit(card)) + ) > 0 && + !player.hasSkill("junktaoluan3") && + lib.inpile.includes(name) + ); }, - audio:'taoluan', - enable:'chooseToUse', - filter(event,player){ - return !player.hasSkill('junktaoluan3')&&player.countCards('hes',card=>{ - return lib.inpile.some(name=>{ - if(player.getStorage('junktaoluan2').includes(get.suit(card))) return false; - if(player.getStorage('junktaoluan').includes(name)) return false; - if(get.type(name)!='basic'&&get.type(name)!='trick') return false; - if(event.filterCard({name:name,isCard:true,cards:[card]},player,event)) return true; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]},player,event)) return true; + audio: "taoluan", + enable: "chooseToUse", + filter(event, player) { + return ( + !player.hasSkill("junktaoluan3") && + player.countCards("hes", (card) => { + return lib.inpile.some((name) => { + if (player.getStorage("junktaoluan2").includes(get.suit(card))) return false; + if (player.getStorage("junktaoluan").includes(name)) return false; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + if ( + event.filterCard( + { + name: name, + isCard: true, + cards: [card], + }, + player, + event + ) + ) + return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + { + name: name, + nature: nature, + isCard: true, + cards: [card], + }, + player, + event + ) + ) + return true; + } } - } - return false; - }); - })>0; + return false; + }); + }) > 0 + ); }, - chooseButton:{ - dialog(event,player){ - var list=[]; - for(var name of lib.inpile){ - if(get.type(name)=='basic'||get.type(name)=='trick'){ - if(player.getStorage('junktaoluan').includes(name)) continue; - list.push([get.translation(get.type(name)),'',name]); - if(name=='sha'){ - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + chooseButton: { + dialog(event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) == "basic" || get.type(name) == "trick") { + if (player.getStorage("junktaoluan").includes(name)) continue; + list.push([get.translation(get.type(name)), "", name]); + if (name == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } } } - return ui.create.dialog('滔乱',[list,'vcard']); + return ui.create.dialog("滔乱", [list, "vcard"]); }, - filter(button,player){ - return _status.event.getParent().filterCard({name:button.link[2]},player,_status.event.getParent()); + filter(button, player) { + return _status.event + .getParent() + .filterCard({ name: button.link[2] }, player, _status.event.getParent()); }, - check(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - if(player.countCards('hes',cardx=>cardx.name==card.name)) return 0; - return _status.event.getParent().type=='phase'?player.getUseValue(card):1; + check(button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + }; + if (player.countCards("hes", (cardx) => cardx.name == card.name)) return 0; + return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; }, - backup(links,player){ + backup(links, player) { return { - filterCard(card,player){ - return !player.getStorage('junktaoluan2').includes(get.suit(card)); + filterCard(card, player) { + return !player.getStorage("junktaoluan2").includes(get.suit(card)); }, - audio:'taoluan', - popname:true, - check(card){ - return 7-get.value(card); + audio: "taoluan", + popname: true, + check(card) { + return 7 - get.value(card); }, - position:'hse', - viewAs:{name:links[0][2],nature:links[0][3]}, - onuse(result,player){ - player.markAuto('junktaoluan2',[get.suit(result.cards[0],player)]); - var evt=_status.event.getParent('phase'); - if(evt&&evt.name=='phase'&&!evt.junktaoluan){ - evt.junktaoluan=true; - var next=game.createEvent('taoluan_clear'); + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + onuse(result, player) { + player.markAuto("junktaoluan2", [get.suit(result.cards[0], player)]); + var evt = _status.event.getParent("phase"); + if (evt && evt.name == "phase" && !evt.junktaoluan) { + evt.junktaoluan = true; + var next = game.createEvent("taoluan_clear"); _status.event.next.remove(next); evt.after.push(next); - next.player=player; - next.setContent(function(){ + next.player = player; + next.setContent(function () { delete player.storage.junktaoluan2; }); } - player.markAuto('junktaoluan',[result.card.name]); + player.markAuto("junktaoluan", [result.card.name]); }, - } + }; + }, + prompt(links, player) { + return ( + "将一张牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - prompt(links,player){ - return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; - } }, - ai:{ - order:4, - save:true, - respondSha:true, - respondShan:true, - skillTagFilter(player,tag,arg){ - if(!player.countCards('hes',card=>!player.getStorage('junktaoluan2').includes(get.suit(card)))||player.hasSkill('taoluan3')) return false; - if(tag=='respondSha'||tag=='respondShan'){ - if(arg=='respond') return false; - return !player.getStorage('taoluan').includes(tag=='respondSha'?'sha':'shan'); + ai: { + order: 4, + save: true, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if ( + !player.countCards( + "hes", + (card) => !player.getStorage("junktaoluan2").includes(get.suit(card)) + ) || + player.hasSkill("taoluan3") + ) + return false; + if (tag == "respondSha" || tag == "respondShan") { + if (arg == "respond") return false; + return !player + .getStorage("taoluan") + .includes(tag == "respondSha" ? "sha" : "shan"); } - return !player.getStorage('taoluan').includes('tao')||(!player.getStorage('taoluan').includes('jiu')&&arg==player); + return ( + !player.getStorage("taoluan").includes("tao") || + (!player.getStorage("taoluan").includes("jiu") && arg == player) + ); }, - result:{ - player(player){ - var players=game.filterPlayer(); - for(var i=0;i0){ + result: { + player(player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + players[i].countCards("he") && + get.attitude(player, players[i]) > 0 + ) { return 1; } } return 0; - } + }, }, - threaten:1.9, + threaten: 1.9, }, - group:'junktaoluan2', + group: "junktaoluan2", }, - junktaoluan2:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - popup:false, - charlotte:true, - filter(event,player){ - if(!game.hasPlayer(current=>current!=player)) return false; - return event.skill=='junktaoluan_backup'; + junktaoluan2: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + if (!game.hasPlayer((current) => current != player)) return false; + return event.skill == "junktaoluan_backup"; }, - content(){ - 'step 0' - player.chooseTarget(true,function(card,player,target){ - return target!=player; - },'###滔乱###令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力').set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>0){ - if(get.attitude(target,player)>0){ - return target.countCards('h'); + content() { + "step 0"; + player + .chooseTarget( + true, + function (card, player, target) { + return target != player; + }, + "###滔乱###令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力" + ) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) { + if (get.attitude(target, player) > 0) { + return target.countCards("h"); + } + return target.countCards("h") / 2; } - return target.countCards('h')/2; - } - return 0; - }); - 'step 1' - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - var type=get.type(trigger.card,'trick'); - target.chooseCard('###滔乱###交给'+get.translation(player)+'一张不为'+get.translation(type)+'牌的牌,或令其失去1点体力且滔乱无效直到回合结束','he',num,function(card,player,target){ - return get.type(card,'trick')!=_status.event.cardType; - }).set('cardType',type).set('ai',function(card){ - if(_status.event.att){ - return 11-get.value(card); - } - return 0; - }).set('att',get.attitude(target,player)>0); - 'step 2' - if(result.bool){ - target.give(result.cards,player,'visible'); + return 0; + }); + ("step 1"); + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var type = get.type(trigger.card, "trick"); + target + .chooseCard( + "###滔乱###交给" + + get.translation(player) + + "一张不为" + + get.translation(type) + + "牌的牌,或令其失去1点体力且滔乱无效直到回合结束", + "he", + num, + function (card, player, target) { + return get.type(card, "trick") != _status.event.cardType; + } + ) + .set("cardType", type) + .set("ai", function (card) { + if (_status.event.att) { + return 11 - get.value(card); + } + return 0; + }) + .set("att", get.attitude(target, player) > 0); + ("step 2"); + if (result.bool) { + target.give(result.cards, player, "visible"); + } else { + player.addTempSkill("junktaoluan3"); } - else{ - player.addTempSkill('junktaoluan3'); - } - } + }, }, - junktaoluan3:{ - charlotte:true, - trigger:{player:'phaseEnd'}, - forced:true, - popup:false, - content(){ + junktaoluan3: { + charlotte: true, + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + content() { player.loseHp(); }, }, - junktaoluan_backup:{charlotte:true}, + junktaoluan_backup: { charlotte: true }, - nshuaishuang:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - content(){ - 'step 0' - var card=get.cardPile(function(card){ - return card.name=='tao'; + nshuaishuang: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { + "step 0"; + var card = get.cardPile(function (card) { + return card.name == "tao"; }); - if(card){ - player.gain(card,'gain2'); - } - else event.finish(); - 'step 1' + if (card) { + player.gain(card, "gain2"); + } else event.finish(); + ("step 1"); game.updateRoundNumber(); player.loseHp(); }, }, - nsfengli:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&&!current.hasSkill('nsfengli_use'); - }); + nsfengli: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && !current.hasSkill("nsfengli_use"); + }) + ); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('nsfengli'),function(card,player,target){ - return target!=player&&!target.hasSkill('nsfengli_use'); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target)/(5+target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('nsfengli',target); - var cards=player.getCards('h'); - player.addShownCards(cards,'visible_nsfengli'); - player.addSkill('nsfengli2'); - target.addSkill('nsfengli_use'); - target.storage.nsfengli_use=player; + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsfengli"), function (card, player, target) { + return target != player && !target.hasSkill("nsfengli_use"); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) / (5 + target.countCards("h")); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("nsfengli", target); + var cards = player.getCards("h"); + player.addShownCards(cards, "visible_nsfengli"); + player.addSkill("nsfengli2"); + target.addSkill("nsfengli_use"); + target.storage.nsfengli_use = player; } }, - group:['nsfengli_draw','nsfengli_clear'], - onremove(player){ - player.removeSkill('nsfengli2'); + group: ["nsfengli_draw", "nsfengli_clear"], + onremove(player) { + player.removeSkill("nsfengli2"); }, }, - nsfengli_draw:{ - trigger:{ - player:['loseAfter','hideShownCardsAfter'], - global:['gainAfter','equipAfter','addJudgeAfter','loseAsyncAfter','addToExpansionAfter'], + nsfengli_draw: { + trigger: { + player: ["loseAfter", "hideShownCardsAfter"], + global: [ + "gainAfter", + "equipAfter", + "addJudgeAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - charlotte:true, - filter(event,player,name){ - if(event.name=='hideShownCards'){ - const hs=player.countCards('h'); - return game.hasPlayer(current=>current.countCards('h') current.countCards("h") < hs); } - var num=0; - var evt=event.getl(player); - if(!evt||!evt.gaintag_map) return false; - var bool=false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].some(tag=>tag.indexOf('visible_')==0)) num++; + var num = 0; + var evt = event.getl(player); + if (!evt || !evt.gaintag_map) return false; + var bool = false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].some((tag) => tag.indexOf("visible_") == 0)) num++; } - if(event.getg){ - if(event.name=='gain'){ - if(event.getlx===false&&event.gaintag.some(tag=>tag.indexOf('visible_')==0)) num-=event.cards.length; - } - else{ - player.checkHistory('gain',function(evt){ - if(evt.parent==event&&evt.gaintag.some(tag=>tag.indexOf('visible_')==0)){ - num-=evt.cards.length; + if (event.getg) { + if (event.name == "gain") { + if ( + event.getlx === false && + event.gaintag.some((tag) => tag.indexOf("visible_") == 0) + ) + num -= event.cards.length; + } else { + player.checkHistory("gain", function (evt) { + if ( + evt.parent == event && + evt.gaintag.some((tag) => tag.indexOf("visible_") == 0) + ) { + num -= evt.cards.length; } }); } } - if(num>0){ - const hs=player.countCards('h'); - return game.hasPlayer(current=>current.countCards('h') 0) { + const hs = player.countCards("h"); + return game.hasPlayer((current) => current.countCards("h") < hs); } }, - content(){ - 'step 0' - player.chooseTarget('奉礼:是否令一名手牌数小于你的其他角色摸一张牌?',function(card,player,target){ - return target!=player&&target.countCards('h')0) player.hideShownCards(cards); - player.removeSkill('nsfengli2'); + content() { + var cards = player.getShownCards(); + if (cards.length > 0) player.hideShownCards(cards); + player.removeSkill("nsfengli2"); }, }, - nsfengli2:{ - onremove(player){ - player.removeGaintag('nsfengli2'); - game.countPlayer(function(current){ - if(current.storage.nsfengli_use==player) current.removeSkill('nsfengli_use'); - }) + nsfengli2: { + onremove(player) { + player.removeGaintag("nsfengli2"); + game.countPlayer(function (current) { + if (current.storage.nsfengli_use == player) current.removeSkill("nsfengli_use"); + }); }, }, - nsfengli_use:{ - hiddenCard(player,name){ - if(player==_status.currentPhase) return false; - var target=player.storage.nsfengli_use; - var cards=target.getShownCards(); - for(var i of cards){ - if(get.name(i,target)==name) return true; + nsfengli_use: { + hiddenCard(player, name) { + if (player == _status.currentPhase) return false; + var target = player.storage.nsfengli_use; + var cards = target.getShownCards(); + for (var i of cards) { + if (get.name(i, target) == name) return true; } return false; }, - enable:['chooseToUse','chooseToRespond'], - charlotte:true, - onremove:true, - filter(event,player){ - if(player==_status.currentPhase) return false; - var target=player.storage.nsfengli_use; - var cards=target.getShownCards(); - for(var i of cards){ - if(event.filterCard({ - name:get.name(i,target), - nature:get.nature(i,target), - isCard:true, - },player,event)) return true; + enable: ["chooseToUse", "chooseToRespond"], + charlotte: true, + onremove: true, + filter(event, player) { + if (player == _status.currentPhase) return false; + var target = player.storage.nsfengli_use; + var cards = target.getShownCards(); + for (var i of cards) { + if ( + event.filterCard( + { + name: get.name(i, target), + nature: get.nature(i, target), + isCard: true, + }, + player, + event + ) + ) + return true; } return false; }, - chooseButton:{ - dialog(event,player){ - var target=player.storage.nsfengli_use; - var cards=target.getShownCards(); - return ui.create.dialog('奉礼',cards); + chooseButton: { + dialog(event, player) { + var target = player.storage.nsfengli_use; + var cards = target.getShownCards(); + return ui.create.dialog("奉礼", cards); }, - filter(button,player){ - var evt=_status.event.getParent(); - var target=player.storage.nsfengli_use; - return evt.filterCard({ - name:get.name(button.link,target), - nature:get.nature(button.link,target), - isCard:true, - },player,evt); + filter(button, player) { + var evt = _status.event.getParent(); + var target = player.storage.nsfengli_use; + return evt.filterCard( + { + name: get.name(button.link, target), + nature: get.nature(button.link, target), + isCard: true, + }, + player, + evt + ); }, - check(button){ - var player=_status.event.player; - var evt=_status.event.getParent(); - if(evt.dying) return get.attitude(player,evt.dying); + check(button) { + var player = _status.event.player; + var evt = _status.event.getParent(); + if (evt.dying) return get.attitude(player, evt.dying); return 1; }, - backup(links,player){ - var target=player.storage.nsfengli_use; + backup(links, player) { + var target = player.storage.nsfengli_use; return { - viewAs:{ - name:get.name(links[0],target), - nature:get.nature(links[0],target), - isCard:true, + viewAs: { + name: get.name(links[0], target), + nature: get.nature(links[0], target), + isCard: true, }, - card:links[0], - filterCard:()=>false, - selectCard:-1, - precontent(){ - var card=lib.skill.nsfengli_use_backup.card; - var target=player.storage.nsfengli_use; - event.target=target; - player.logSkill('nsfengli',target); + card: links[0], + filterCard: () => false, + selectCard: -1, + precontent() { + var card = lib.skill.nsfengli_use_backup.card; + var target = player.storage.nsfengli_use; + event.target = target; + player.logSkill("nsfengli", target); delete event.result.skill; - player.showCards(card,get.translation(player)+'发动了【奉礼】'); + player.showCards(card, get.translation(player) + "发动了【奉礼】"); target.hideShownCards(card); }, }; }, - ai:{ - hasSha:true, - hasShan:true, - skillTagFilter(player,tag){ - var name='s'+tag.slice(4); - return lib.skill.nsfengli_use.hiddenCard(player,name); + ai: { + hasSha: true, + hasShan: true, + skillTagFilter(player, tag) { + var name = "s" + tag.slice(4); + return lib.skill.nsfengli_use.hiddenCard(player, name); }, }, }, - ai:{ - order:8, - result:{ - player:1, + ai: { + order: 8, + result: { + player: 1, }, }, }, - ns_chuanshu:{ - audio:["xingshuai",2], - trigger:{ - global:"dying", + ns_chuanshu: { + audio: ["xingshuai", 2], + trigger: { + global: "dying", }, - priority:8, - unique:true, - skillAnimation:true, - animationColor:"water", - filter (event,player){ - return event.player.hp<=0&&event.player!=player; + priority: 8, + unique: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return event.player.hp <= 0 && event.player != player; }, - check (event,player){ - return get.attitude(player,event.player)>0; + check(event, player) { + return get.attitude(player, event.player) > 0; }, - logTarget:"player", - content (){ - 'step 0' - trigger.player.chooseControl('releiji','guidao').set('prompt',''+get.translation(trigger.player)+'获得一项技能'); - goon=true; - if(!goon){ + logTarget: "player", + content() { + "step 0"; + trigger.player + .chooseControl("releiji", "guidao") + .set("prompt", "" + get.translation(trigger.player) + "获得一项技能"); + goon = true; + if (!goon) { event.finish(); } - 'step 1' + ("step 1"); trigger.player.addSkillLog(result.control); - trigger.player.recover(1-trigger.player.hp); + trigger.player.recover(1 - trigger.player.hp); trigger.player.draw(2); - trigger.player.storage.ns_chuanshu2=player; - trigger.player.addSkill('ns_chuanshu2'); - player.awakenSkill('ns_chuanshu'); + trigger.player.storage.ns_chuanshu2 = player; + trigger.player.addSkill("ns_chuanshu2"); + player.awakenSkill("ns_chuanshu"); }, }, - ns_xiandao1:{ - audio:["huashen",2], - forced:true, + ns_xiandao1: { + audio: ["huashen", 2], + forced: true, //noLose:true, //locked:true, //noRemove:true, //noDisable:true, - priority:10, - trigger:{ - global:"gameStart", - player:["phaseEnd","enterGame"], + priority: 10, + trigger: { + global: "gameStart", + player: ["phaseEnd", "enterGame"], }, //filter (event,player){ // return player.isAlive(); //}, - content (){ - var n=[1,2].randomGet(); - if(n==1){ - player.addTempSkill("releiji",{player:"phaseUseBegin"}); - player.markSkill("releiji",{player:"phaseUseBegin"}); + content() { + var n = [1, 2].randomGet(); + if (n == 1) { + player.addTempSkill("releiji", { + player: "phaseUseBegin", + }); + player.markSkill("releiji", { + player: "phaseUseBegin", + }); } - if(n==2){ - player.addTempSkill("guidao",{player:"phaseUseBegin"}); - player.markSkill("guidao",{player:"phaseUseBegin"}); + if (n == 2) { + player.addTempSkill("guidao", { + player: "phaseUseBegin", + }); + player.markSkill("guidao", { player: "phaseUseBegin" }); } }, }, - ns_xiandao2:{ - audio:["huashen",2], - forced:true, + ns_xiandao2: { + audio: ["huashen", 2], + forced: true, //noLose:true, //locked:true, //noRemove:true, //noDisable:true, - trigger:{ - player:"damageBefore", + trigger: { + player: "damageBefore", }, - filter (event,player){ - if(!event.nature) return false; + filter(event, player) { + if (!event.nature) return false; return true; }, - content (){ + content() { trigger.cancel(); //event.finish(); }, }, - ns_xiandao:{ - forced:true, + ns_xiandao: { + forced: true, //noLose:true, //locked:true, - noRemove:true, + noRemove: true, //noDisable:true, - group:["ns_xiandao1","ns_xiandao2"], + group: ["ns_xiandao1", "ns_xiandao2"], }, - ns_chuanshu2:{ - audio:["songwei",2], - mark:"character", - intro:{ - content:"当你造成或受到一次伤害后,$摸一张牌", + ns_chuanshu2: { + audio: ["songwei", 2], + mark: "character", + intro: { + content: "当你造成或受到一次伤害后,$摸一张牌", }, - nopop:true, - trigger:{ - source:"damageEnd", - player:"damageEnd", + nopop: true, + trigger: { + source: "damageEnd", + player: "damageEnd", }, - forced:true, - popup:false, - filter (event,player){ - return player.storage.ns_chuanshu2&&player.storage.ns_chuanshu2.isIn()&&event.num>0; + forced: true, + popup: false, + filter(event, player) { + return player.storage.ns_chuanshu2 && player.storage.ns_chuanshu2.isIn() && event.num > 0; }, - content (){ - 'step 0' + content() { + "step 0"; game.delayx(); - 'step 1' - var target=player.storage.ns_chuanshu2; - player.line(target,'green'); + ("step 1"); + var target = player.storage.ns_chuanshu2; + player.line(target, "green"); target.draw(); game.delay(); }, - onremove:true, - group:"ns_chuanshu3", + onremove: true, + group: "ns_chuanshu3", }, - ns_chuanshu3:{ - audio:1, - trigger:{ - player:"dieBegin", + ns_chuanshu3: { + audio: 1, + trigger: { + player: "dieBegin", }, - silent:true, - onremove:true, - filter (event,player){ - return player.storage.ns_chuanshu2&&player.storage.ns_chuanshu2.isIn(); + silent: true, + onremove: true, + filter(event, player) { + return player.storage.ns_chuanshu2 && player.storage.ns_chuanshu2.isIn(); }, - content (){ - 'step 0' + content() { + "step 0"; game.delayx(); - 'step 1' - var target=player.storage.ns_chuanshu2; - player.line(target,'green'); + ("step 1"); + var target = player.storage.ns_chuanshu2; + player.line(target, "green"); //target.addSkill('ns_chuanshu'); - target.restoreSkill('ns_chuanshu'); + target.restoreSkill("ns_chuanshu"); target.update(); }, - forced:true, - popup:false, + forced: true, + popup: false, }, - ns_xiuzheng:{ - audio:["xinsheng",2], - enable:"phaseUse", - usable:1, - priority:10, - filter (event,player){ - return (ui.cardPile.childElementCount+ui.discardPile.childElementCount)>=2; + ns_xiuzheng: { + audio: ["xinsheng", 2], + enable: "phaseUse", + usable: 1, + priority: 10, + filter(event, player) { + return ui.cardPile.childElementCount + ui.discardPile.childElementCount >= 2; }, - filterTarget (card,player,target){ - return player!=target; + filterTarget(card, player, target) { + return player != target; }, - content (){ - "step 0" - event.cards=get.cards(2); + content() { + "step 0"; + event.cards = get.cards(2); player.showCards(event.cards); - "step 1" - if(get.color(event.cards[0])=='red'&&get.color(event.cards[1])=='red'){ - target.damage('fire'); + ("step 1"); + if (get.color(event.cards[0]) == "red" && get.color(event.cards[1]) == "red") { + target.damage("fire"); } - if(get.color(event.cards[0])!=get.color(event.cards[1])){ - player.discardPlayerCard(target,"he",true); + if (get.color(event.cards[0]) != get.color(event.cards[1])) { + player.discardPlayerCard(target, "he", true); } - if(get.color(event.cards[0])=='black'&&get.color(event.cards[1])=='black'){ - target.damage('thunder'); + if (get.color(event.cards[0]) == "black" && get.color(event.cards[1]) == "black") { + target.damage("thunder"); } - "step 2" - if(event.cards.length){ - player.gain(event.cards,'gain2'); + ("step 2"); + if (event.cards.length) { + player.gain(event.cards, "gain2"); game.delay(); } - "step 3" - player.chooseToDiscard(2,'he','请弃置两张牌',true); + ("step 3"); + player.chooseToDiscard(2, "he", "请弃置两张牌", true); }, - ai:{ - threaten:0.5, - order:13, - result:{ - target (player,target){ - return get.damageEffect(target,player); + ai: { + threaten: 0.5, + order: 13, + result: { + target(player, target) { + return get.damageEffect(target, player); }, }, }, }, - nsanruo:{ - unique:true, - init(player){ - if(!player.node.handcards1.cardMod){ - player.node.handcards1.cardMod={}; + nsanruo: { + unique: true, + init(player) { + if (!player.node.handcards1.cardMod) { + player.node.handcards1.cardMod = {}; } - if(!player.node.handcards2.cardMod){ - player.node.handcards2.cardMod={}; + if (!player.node.handcards2.cardMod) { + player.node.handcards2.cardMod = {}; } - var cardMod=function(card){ - if(get.info(card).multitarget) return; - if(card.name=='sha'||get.type(card)=='trick') return ['暗弱','杀或普通锦囊牌对你不可见']; + var cardMod = function (card) { + if (get.info(card).multitarget) return; + if (card.name == "sha" || get.type(card) == "trick") + return ["暗弱", "杀或普通锦囊牌对你不可见"]; }; - player.node.handcards1.cardMod.nsanruo=cardMod; - player.node.handcards2.cardMod.nsanruo=cardMod; - player.node.handcards1.classList.add('nsanruo'); - player.node.handcards2.classList.add('nsanruo'); - if(!ui.css.nsanruo){ - ui.css.nsanruo=lib.init.sheet( - '.handcards.nsanruo>.card[data-card-type="trick"]:not(*[data-card-multitarget="1"])>*,'+ - '.handcards.nsanruo>.card[data-card-name="sha"]>*{visibility:hidden !important}' + player.node.handcards1.cardMod.nsanruo = cardMod; + player.node.handcards2.cardMod.nsanruo = cardMod; + player.node.handcards1.classList.add("nsanruo"); + player.node.handcards2.classList.add("nsanruo"); + if (!ui.css.nsanruo) { + ui.css.nsanruo = lib.init.sheet( + '.handcards.nsanruo>.card[data-card-type="trick"]:not(*[data-card-multitarget="1"])>*,' + + '.handcards.nsanruo>.card[data-card-name="sha"]>*{visibility:hidden !important}' ); } }, - onremove(player){ - player.node.handcards1.classList.remove('nsanruo'); - player.node.handcards2.classList.remove('nsanruo'); + onremove(player) { + player.node.handcards1.classList.remove("nsanruo"); + player.node.handcards2.classList.remove("nsanruo"); delete player.node.handcards1.cardMod.nsanruo; delete player.node.handcards2.cardMod.nsanruo; }, - ai:{ - neg:true - } + ai: { + neg: true, + }, }, - nsxunshan:{ - mod:{ - selectTarget(card,player,range){ - if(!player.hasSkill('nsanruo')) return; - if(_status.auto) return; - if(get.position(card)!='h'||get.owner(card)!=player) return; - if(get.info(card).multitarget) return; - if(card.name=='sha'||get.type(card)=='trick') range[1]=game.countPlayer(); + nsxunshan: { + mod: { + selectTarget(card, player, range) { + if (!player.hasSkill("nsanruo")) return; + if (_status.auto) return; + if (get.position(card) != "h" || get.owner(card) != player) return; + if (get.info(card).multitarget) return; + if (card.name == "sha" || get.type(card) == "trick") range[1] = game.countPlayer(); }, // playerEnabled(card,player,target,current){ // if(current==false) return; @@ -13141,2630 +15868,2840 @@ game.import('character', function () { // if(card.name=='sha'||get.type(card)=='trick') return true; // } }, - ai:{ - combo:'nsanruo' - } + ai: { + combo: "nsanruo", + }, }, - nskaicheng:{ - enable:'phaseUse', - usable:1, - zhuSkill:true, - unique:true, - filter(event,player){ - if(!player.hasZhuSkill('nskaicheng')) return false; - if(!player.hasCard(function(card){ - if(get.info(card).multitarget) return false; - return card.name=='sha'||get.type(card)=='trick'; - })){ + nskaicheng: { + enable: "phaseUse", + usable: 1, + zhuSkill: true, + unique: true, + filter(event, player) { + if (!player.hasZhuSkill("nskaicheng")) return false; + if ( + !player.hasCard(function (card) { + if (get.info(card).multitarget) return false; + return card.name == "sha" || get.type(card) == "trick"; + }) + ) { return false; } - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='qun'; + return game.hasPlayer(function (current) { + return current != player && current.group == "qun"; }); }, - filterCard(card){ - if(get.info(card).multitarget) return false; - return card.name=='sha'||get.type(card)=='trick'; + filterCard(card) { + if (get.info(card).multitarget) return false; + return card.name == "sha" || get.type(card) == "trick"; }, - filterTarget(card,player,target){ - return player!=target&&target.group=='qun'; + filterTarget(card, player, target) { + return player != target && target.group == "qun"; }, - lose:false, - content(){ - 'step 0' - target.chooseBool(function(){ - return get.attitude(target,player)>0; - },'是否将'+get.translation(cards)+'告知'+get.translation(player)); - 'step 1' - if(!player.hasUseTarget(cards[0])){ - if(result.bool){ - player.chooseControl('确定').set('prompt','你展示的手牌为'+get.translation(cards)); + lose: false, + content() { + "step 0"; + target.chooseBool(function () { + return get.attitude(target, player) > 0; + }, "是否将" + get.translation(cards) + "告知" + get.translation(player)); + ("step 1"); + if (!player.hasUseTarget(cards[0])) { + if (result.bool) { + player + .chooseControl("确定") + .set("prompt", "你展示的手牌为" + get.translation(cards)); + } else { + event.hidden = true; + player + .chooseControl("确定") + .set("prompt", get.translation(target) + "拒绝告知你卡牌信息"); } - else{ - event.hidden=true; - player.chooseControl('确定').set('prompt',get.translation(target)+'拒绝告知你卡牌信息'); + } else { + if (result.bool) { + player.chooseBool( + "是否使用展示的牌?", + "你展示的手牌为" + + get.translation(cards) + + "。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段" + ); + } else { + event.hidden = true; + player.chooseBool( + "是否使用展示的牌?", + get.translation(target) + + "拒绝告知你卡牌信息。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段" + ); } } - else{ - if(result.bool){ - player.chooseBool('是否使用展示的牌?','你展示的手牌为'+get.translation(cards)+'。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段'); - } - else{ - event.hidden=true; - player.chooseBool('是否使用展示的牌?',get.translation(target)+'拒绝告知你卡牌信息。如果你使用此牌,则在结算后摸一张牌;如果你不使用此牌,则结束出牌阶段'); - } - } - 'step 2' - if(result.bool){ - player.chooseUseTarget(true,cards[0],event.hidden?'选择此牌的目标':null); - } - else{ - var evt=_status.event.getParent('phaseUse'); - if(evt){ - evt.skipped=true; + ("step 2"); + if (result.bool) { + player.chooseUseTarget(true, cards[0], event.hidden ? "选择此牌的目标" : null); + } else { + var evt = _status.event.getParent("phaseUse"); + if (evt) { + evt.skipped = true; } event.finish(); } - 'step 3' + ("step 3"); player.draw(); }, - ai:{ - combo:'nsanruo' - } + ai: { + combo: "nsanruo", + }, }, - nsjuanli:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h'); + nsjuanli: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h"); }, - filter(event,player){ - return player.countCards('h'); + filter(event, player) { + return player.countCards("h"); }, - init(player){ - player.storage.nsjuanli_win=[]; - player.storage.nsjuanli_lose=[]; + init(player) { + player.storage.nsjuanli_win = []; + player.storage.nsjuanli_lose = []; }, - intro:{ - content(storage,player){ - var str=''; - if(player.storage.nsjuanli_win.length){ - str+=get.translation(player.storage.nsjuanli_win)+'与你距离-1直到与你下次赌牌'; + intro: { + content(storage, player) { + var str = ""; + if (player.storage.nsjuanli_win.length) { + str += + get.translation(player.storage.nsjuanli_win) + "与你距离-1直到与你下次赌牌"; } - if(player.storage.nsjuanli_lose.length){ - if(str.length){ - str+=';'; + if (player.storage.nsjuanli_lose.length) { + if (str.length) { + str += ";"; } - str+=get.translation(player.storage.nsjuanli_lose)+'与你距离+1直到与你下次赌牌'; + str += + get.translation(player.storage.nsjuanli_lose) + "与你距离+1直到与你下次赌牌"; } return str; - } + }, }, - onremove:['nsjuanli_win','nsjuanli_lose'], - content(){ - 'step 0' + onremove: ["nsjuanli_win", "nsjuanli_lose"], + content() { + "step 0"; player.storage.nsjuanli_win.remove(target); player.storage.nsjuanli_lose.remove(target); - event.prompt2='赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利'; - player.chooseCard('h',true).set('prompt2',event.prompt2); - 'step 1' - if(result.bool){ - event.card1=result.cards[0]; - target.chooseCard('h',true).set('prompt2',event.prompt2); - } - else{ + event.prompt2 = + "赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利"; + player.chooseCard("h", true).set("prompt2", event.prompt2); + ("step 1"); + if (result.bool) { + event.card1 = result.cards[0]; + target.chooseCard("h", true).set("prompt2", event.prompt2); + } else { event.finish(); } - 'step 2' - if(result.bool){ - event.card2=result.cards[0]; - } - else{ + ("step 2"); + if (result.bool) { + event.card2 = result.cards[0]; + } else { event.finish(); } - 'step 3' - player.$compare(event.card1,event.target,event.card2); - game.delay(0,1500); - game.log(player,'亮出的牌为',event.card1); - game.log(target,'亮出的牌为',event.card2); - 'step 4' - var suit1=get.suit(event.card1); - var suit2=get.suit(event.card2); - if(suit1==suit2){ - game.broadcastAll(function(str){ - var dialog=ui.create.dialog(str); - dialog.classList.add('center'); - setTimeout(function(){ + ("step 3"); + player.$compare(event.card1, event.target, event.card2); + game.delay(0, 1500); + game.log(player, "亮出的牌为", event.card1); + game.log(target, "亮出的牌为", event.card2); + ("step 4"); + var suit1 = get.suit(event.card1); + var suit2 = get.suit(event.card2); + if (suit1 == suit2) { + game.broadcastAll(function (str) { + var dialog = ui.create.dialog(str); + dialog.classList.add("center"); + setTimeout(function () { dialog.close(); - },1000); - },'平局'); + }, 1000); + }, "平局"); game.delay(2); - if(!player.storage.nsjuanli_win.length&&!player.storage.nsjuanli_lose.length){ - player.unmarkSkill('nsjuanli'); + if (!player.storage.nsjuanli_win.length && !player.storage.nsjuanli_lose.length) { + player.unmarkSkill("nsjuanli"); } - } - else{ - var cards=[]; - for(var i=0;i<1000;i++){ - var current=get.cards(); - if(current&¤t.length){ - current=current[0]; + } else { + var cards = []; + for (var i = 0; i < 1000; i++) { + var current = get.cards(); + if (current && current.length) { + current = current[0]; current.discard(); cards.push(current); - var suit=get.suit(current); - if(suit==suit1){ - player.showCards(cards,get.translation(player)+'赌牌获胜'); + var suit = get.suit(current); + if (suit == suit1) { + player.showCards(cards, get.translation(player) + "赌牌获胜"); player.storage.nsjuanli_win.add(target); target.loseHp(); - player.markSkill('nsjuanli'); + player.markSkill("nsjuanli"); break; - } - else if(suit==suit2){ - player.showCards(cards,get.translation(target)+'赌牌获胜'); + } else if (suit == suit2) { + player.showCards(cards, get.translation(target) + "赌牌获胜"); player.storage.nsjuanli_lose.add(target); target.recover(); - player.markSkill('nsjuanli'); + player.markSkill("nsjuanli"); break; } - } - else{ + } else { break; } } } }, - mod:{ - globalTo(from,to,distance){ - if(to.storage.nsjuanli_win&&to.storage.nsjuanli_win.includes(from)){ - return distance-1; + mod: { + globalTo(from, to, distance) { + if (to.storage.nsjuanli_win && to.storage.nsjuanli_win.includes(from)) { + return distance - 1; } - if(to.storage.nsjuanli_lose&&to.storage.nsjuanli_lose.includes(from)){ - return distance+1; + if (to.storage.nsjuanli_lose && to.storage.nsjuanli_lose.includes(from)) { + return distance + 1; } - } + }, }, - ai:{ - order:4, - result:{ - target(player,target){ - if(target.isHealthy()){ - return -1/(1+target.hp); + ai: { + order: 4, + result: { + target(player, target) { + if (target.isHealthy()) { + return -1 / (1 + target.hp); + } else { + return -0.3 / (1 + target.hp); } - else{ - return -0.3/(1+target.hp); - } - } - } - } + }, + }, + }, }, - nsyuanchou:{ - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - check(event,player){ - return get.effect(event.target,event.card,event.player,player)<0; + nsyuanchou: { + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + check(event, player) { + return get.effect(event.target, event.card, event.player, player) < 0; }, - filter(event,player){ - return get.type(event.card,'trick')=='trick'&&get.distance(event.player,player)>1; + filter(event, player) { + return get.type(event.card, "trick") == "trick" && get.distance(event.player, player) > 1; }, - content(){ + content() { trigger.cancel(); }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.type(card,'trick')=='trick'&&get.distance(player,target)>1) return 'zeroplayertarget'; + ai: { + effect: { + target(card, player, target, current) { + if (get.type(card, "trick") == "trick" && get.distance(player, target) > 1) + return "zeroplayertarget"; }, - } - } + }, + }, }, - nsguhuo:{ - trigger:{player:'useCardAfter'}, - forced:true, - usable:2, - filter(event,player){ - if(event.parent.name=='nsguhuo') return false; - if(event.card==event.cards[0]){ - var type=get.type(event.card,'trick'); - var names=[]; - if(get.cardPile(function(card){ - if(get.type(card,'trick')!=type) return false; - if(get.info(card).multitarget) return false; - if(names.includes(card.name)) return false; - if(player.hasUseTarget(card)){ - return true; - } - else{ - names.add(card.name); - return false; - } - })){ + nsguhuo: { + trigger: { player: "useCardAfter" }, + forced: true, + usable: 2, + filter(event, player) { + if (event.parent.name == "nsguhuo") return false; + if (event.card == event.cards[0]) { + var type = get.type(event.card, "trick"); + var names = []; + if ( + get.cardPile(function (card) { + if (get.type(card, "trick") != type) return false; + if (get.info(card).multitarget) return false; + if (names.includes(card.name)) return false; + if (player.hasUseTarget(card)) { + return true; + } else { + names.add(card.name); + return false; + } + }) + ) { return true; } } return true; }, - content(){ - var type=get.type(trigger.card,'trick'); - var names=[]; - var card=get.cardPile(function(card){ - if(get.type(card,'trick')!=type) return false; - if(get.info(card).multitarget) return false; - if(names.includes(card.name)) return false; - if(player.hasUseTarget(card)){ + content() { + var type = get.type(trigger.card, "trick"); + var names = []; + var card = get.cardPile(function (card) { + if (get.type(card, "trick") != type) return false; + if (get.info(card).multitarget) return false; + if (names.includes(card.name)) return false; + if (player.hasUseTarget(card)) { return true; - } - else{ + } else { names.add(card.name); return false; } }); - if(card){ - var info=get.info(card); - var targets=game.filterPlayer(function(current){ - return lib.filter.filterTarget(card,player,current); + if (card) { + var info = get.info(card); + var targets = game.filterPlayer(function (current) { + return lib.filter.filterTarget(card, player, current); }); - if(targets.length){ + if (targets.length) { targets.sort(lib.sort.seat); - var select=get.select(info.selectTarget); - if(select[0]==-1||select[1]==-1){ - player.useCard(card,targets,'noai'); - } - else if(targets.length>=select[0]){ - var num=select[0]+Math.floor(Math.random()*(select[1]-select[0]+1)); - player.useCard(card,targets.randomGets(num),'noai'); + var select = get.select(info.selectTarget); + if (select[0] == -1 || select[1] == -1) { + player.useCard(card, targets, "noai"); + } else if (targets.length >= select[0]) { + var num = select[0] + Math.floor(Math.random() * (select[1] - select[0] + 1)); + player.useCard(card, targets.randomGets(num), "noai"); } } } - } - }, - nsbaiyi:{ - trigger:{player:'phaseDiscardBefore'}, - forced:true, - filter(event,player){ - return player.storage.nsqinxue&&player.storage.nsqinxue.length; }, - content(){ - 'step 0' + }, + nsbaiyi: { + trigger: { player: "phaseDiscardBefore" }, + forced: true, + filter(event, player) { + return player.storage.nsqinxue && player.storage.nsqinxue.length; + }, + content() { + "step 0"; trigger.cancel(); - var num=player.storage.nsqinxue.length; - player.chooseToDiscard('白衣:请弃置'+get.cnNumber(num)+'张牌','he',true,num); - 'step 1' - if(result.bool&&result.cards.length){ - event.goon=true; - if(result.cards.length==3){ - var type=[]; - for(var i=0;i=2; + skillAnimation: true, + check(event, player) { + return player.hp == 1 || player.maxHp - player.hp >= 2; }, - content(){ - player.storage.nsfuge=true; + content() { + player.storage.nsfuge = true; player.insertPhase(); }, - group:'nsfuge_draw', - subSkill:{ - draw:{ - trigger:{player:'phaseDrawBegin'}, - silent:true, - filter(event,player){ - var evt=event.getParent('phase'); - return evt&&evt.skill=='nsfuge'; + group: "nsfuge_draw", + subSkill: { + draw: { + trigger: { player: "phaseDrawBegin" }, + silent: true, + filter(event, player) { + var evt = event.getParent("phase"); + return evt && evt.skill == "nsfuge"; }, - content(){ - trigger.num+=player.maxHp-player.hp; - } - } - } - }, - nsbaiming:{ - trigger:{player:'useCard'}, - direct:true, - filter(event,player){ - if(player.additionalSkills.nsbaiming) return false; - return event.card&&event.card.name=='sha'&&player.storage.nsbaiming&&player.storage.nsbaiming.length>0; + content() { + trigger.num += player.maxHp - player.hp; + }, + }, }, - group:'nsbaiming_clear', - init(player){ - var check=function(list){ - for(var i=0;i 0 + ); + }, + group: "nsbaiming_clear", + init(player) { + var check = function (list) { + for (var i = 0; i < list.length; i++) { + var info = lib.skill[list[i]]; + if (info && info.shaRelated) return true; + if (info && info.trigger) { + for (var j in info.trigger) { + var cond = info.trigger[j]; + if (typeof cond == "string") { + cond = [cond]; } - if(j=='player'||j=='global'){ - if(cond.indexOf('shaBefore')!=-1) return true; - if(cond.indexOf('shaBegin')!=-1) return true; - if(cond.indexOf('shaEnd')!=-1) return true; - if(cond.indexOf('shaAfter')!=-1) return true; + if (j == "player" || j == "global") { + if (cond.indexOf("shaBefore") != -1) return true; + if (cond.indexOf("shaBegin") != -1) return true; + if (cond.indexOf("shaEnd") != -1) return true; + if (cond.indexOf("shaAfter") != -1) return true; } - if(j=='source'||j=='global'){ - if(cond.indexOf('damageBefore')!=-1) return true; - if(cond.indexOf('damageBegin')!=-1) return true; - if(cond.indexOf('damageBegin1')!=-1) return true; - if(cond.indexOf('damageBegin2')!=-1) return true; - if(cond.indexOf('damageEnd')!=-1) return true; - if(cond.indexOf('damageSource')!=-1) return true; - if(cond.indexOf('damageAfter')!=-1) return true; + if (j == "source" || j == "global") { + if (cond.indexOf("damageBefore") != -1) return true; + if (cond.indexOf("damageBegin") != -1) return true; + if (cond.indexOf("damageBegin1") != -1) return true; + if (cond.indexOf("damageBegin2") != -1) return true; + if (cond.indexOf("damageEnd") != -1) return true; + if (cond.indexOf("damageSource") != -1) return true; + if (cond.indexOf("damageAfter") != -1) return true; } } } } return false; }; - player.storage.nsbaiming=get.gainableSkills(function(info,skill){ - var list=[skill]; + player.storage.nsbaiming = get.gainableSkills(function (info, skill) { + var list = [skill]; game.expandSkills(list); return check(list); - },player); + }, player); }, - content(){ - 'step 0' - var list=player.storage.nsbaiming.slice(0); - event.skillai=function(){ - return get.max(list,get.skillRank,'item'); + content() { + "step 0"; + var list = player.storage.nsbaiming.slice(0); + event.skillai = function () { + return get.max(list, get.skillRank, "item"); }; - if(event.isMine()){ - var dialog=ui.create.dialog('forcebutton'); - dialog.add(get.prompt('nsbaiming')); - var clickItem=function(){ - _status.event._result=this.link; + if (event.isMine()) { + var dialog = ui.create.dialog("forcebutton"); + dialog.add(get.prompt("nsbaiming")); + var clickItem = function () { + _status.event._result = this.link; dialog.close(); game.resume(); }; - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); - event.switchToAuto=function(){ - event._result=event.skillai(); + dialog.add(ui.create.div(".placeholder")); + event.switchToAuto = function () { + event._result = event.skillai(); dialog.close(); game.resume(); }; - event.confirm=ui.create.confirm('c'); - event.custom.replace.confirm=function(){ - event._result=null; + event.confirm = ui.create.confirm("c"); + event.custom.replace.confirm = function () { + event._result = null; dialog.close(); game.resume(); }; - _status.imchoosing=true; + _status.imchoosing = true; game.pause(); + } else { + event._result = event.skillai(); } - else{ - event._result=event.skillai(); - } - 'step 1' - _status.imchoosing=false; - if(event.confirm){ + ("step 1"); + _status.imchoosing = false; + if (event.confirm) { event.confirm.close(); } - if(typeof result=='string'){ - player.logSkill('nsbaiming'); - var link=result; - player.addAdditionalSkill('nsbaiming',link); - player.logSkill('nsbaiming'); + if (typeof result == "string") { + player.logSkill("nsbaiming"); + var link = result; + player.addAdditionalSkill("nsbaiming", link); + player.logSkill("nsbaiming"); player.popup(link); - game.log(player,'获得了技能','【'+get.translation(link)+'】'); + game.log(player, "获得了技能", "【" + get.translation(link) + "】"); game.delay(); player.storage.nsbaiming.remove(link); - trigger.nsbaiming=true; + trigger.nsbaiming = true; } }, - subSkill:{ - clear:{ - trigger:{player:'useCardAfter'}, - silent:true, - filter(event){ - return event.nsbaiming==true; + subSkill: { + clear: { + trigger: { player: "useCardAfter" }, + silent: true, + filter(event) { + return event.nsbaiming == true; }, - content(){ - player.removeAdditionalSkill('nsbaiming'); - } - } - } - }, - nsxinzhan:{ - enable:'phaseUse', - filterCard:[1,Infinity], - filter(event,player){ - return player.countCards('h')>0; + content() { + player.removeAdditionalSkill("nsbaiming"); + }, + }, }, - usable:1, - selectCard:[1,Infinity], - check(card){ - var player=_status.event.player; - if(player.countCards('h')>=8&&game.hasPlayer(function(current){ - return current.isDamaged()&&get.attitude(player,current)>3; - })){ - if(ui.selected.cards.length>=6){ + }, + nsxinzhan: { + enable: "phaseUse", + filterCard: [1, Infinity], + filter(event, player) { + return player.countCards("h") > 0; + }, + usable: 1, + selectCard: [1, Infinity], + check(card) { + var player = _status.event.player; + if ( + player.countCards("h") >= 8 && + game.hasPlayer(function (current) { + return current.isDamaged() && get.attitude(player, current) > 3; + }) + ) { + if (ui.selected.cards.length >= 6) { return 0; } return 1; - } - else{ - if(ui.selected.cards.length>=2){ + } else { + if (ui.selected.cards.length >= 2) { return 0; } - if(player.countCards('h',function(card){ - return get.value(card)<0; - })){ - return 8-get.value(card,player,'raw'); - } - else{ - return 4-get.value(card,player,'raw'); + if ( + player.countCards("h", function (card) { + return get.value(card) < 0; + }) + ) { + return 8 - get.value(card, player, "raw"); + } else { + return 4 - get.value(card, player, "raw"); } } }, - discard:false, - prepare:'give2', - content(){ - target.gain(cards,player); - var num=Math.floor(cards.length/2); - if(num>=3){ + discard: false, + prepare: "give2", + content() { + target.gain(cards, player); + var num = Math.floor(cards.length / 2); + if (num >= 3) { target.loseMaxHp(true); - } - else if(num){ + } else if (num) { target.loseHp(num); } }, - filterTarget(card,player,target){ - return target!=player; + filterTarget(card, player, target) { + return target != player; }, - ai:{ - order:10, - result:{ - target(player,target){ - if(ui.selected.cards.length>=6){ - if(target.isDamaged()) return 2; + ai: { + order: 10, + result: { + target(player, target) { + if (ui.selected.cards.length >= 6) { + if (target.isDamaged()) return 2; return 1; } - if(ui.selected.cards.length==1){ + if (ui.selected.cards.length == 1) { return 1; } return -1; - } - } - } - }, - nstanbing:{ - trigger:{player:'phaseDrawBegin'}, - filter(event,player){ - return player.countCards('h')>0; + }, + }, }, - direct:true, - content(){ - 'step 0' - player.chooseToDiscard('h',get.prompt2('nstanbing')).set('ai',function(card){ - if(!player.needsToDiscard(1)){ - return get.translation(card.name).length-1; + }, + nstanbing: { + trigger: { player: "phaseDrawBegin" }, + filter(event, player) { + return player.countCards("h") > 0; + }, + direct: true, + content() { + "step 0"; + player.chooseToDiscard("h", get.prompt2("nstanbing")).set("ai", function (card) { + if (!player.needsToDiscard(1)) { + return get.translation(card.name).length - 1; } return 0; - }).logSkill='nstanbing'; - 'step 1' - if(result.bool){ + }).logSkill = "nstanbing"; + ("step 1"); + if (result.bool) { player.draw(get.translation(result.cards[0].name).length); - player.addTempSkill('nstanbing_sha'); + player.addTempSkill("nstanbing_sha"); } }, - subSkill:{ - sha:{ - mod:{ - cardEnabled(card,player){ - if(card.name=='sha'){ + subSkill: { + sha: { + mod: { + cardEnabled(card, player) { + if (card.name == "sha") { return false; } }, - cardUsable(card,player){ - if(card.name=='sha'){ + cardUsable(card, player) { + if (card.name == "sha") { return false; } }, - } - } - } + }, + }, + }, }, - nswangfeng:{ - trigger:{global:'judge'}, - filter(event,player){ - return player.countCards('he',{color:'red'})>0; + nswangfeng: { + trigger: { global: "judge" }, + filter(event, player) { + return player.countCards("he", { color: "red" }) > 0; }, - direct:true, - content(){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('nswangfeng'),'he',function(card){ - return get.color(card)=='red'; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result; - } - else{ - return -result; - } - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight'); - } - else{ + direct: true, + content() { + "step 0"; + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("nswangfeng"), + "he", + function (card) { + return get.color(card) == "red"; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight"); + } else { event.finish(); } - "step 2" - if(result.bool){ - player.logSkill('nswangfeng'); + ("step 2"); + if (result.bool) { + player.logSkill("nswangfeng"); player.$gain2(trigger.player.judging[0]); player.gain(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; - if(!get.owner(result.cards[0],'judge')){ + trigger.player.judging[0] = result.cards[0]; + if (!get.owner(result.cards[0], "judge")) { trigger.position.appendChild(result.cards[0]); } - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); } - "step 3" + ("step 3"); game.delay(2); }, - ai:{ - tag:{ - rejudge:1 - } - } + ai: { + tag: { + rejudge: 1, + }, + }, }, - nsfuhuo:{ - enable:'phaseUse', - usable:1, - filterCard:true, - filterTarget(card,player,target){ - return player!=target&&!target.hasSkill('nsfuhuo2'); + nsfuhuo: { + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget(card, player, target) { + return player != target && !target.hasSkill("nsfuhuo2"); }, - prepare:'throw', - discard:false, - content(){ + prepare: "throw", + discard: false, + content() { target.$gain2(cards); - target.storage.nsfuhuo2=cards[0]; - target.addSkill('nsfuhuo2'); - target.storage.nsfuhuo3=player; + target.storage.nsfuhuo2 = cards[0]; + target.addSkill("nsfuhuo2"); + target.storage.nsfuhuo3 = player; ui.special.appendChild(cards[0]); - target.syncStorage('nsfuhuo2'); + target.syncStorage("nsfuhuo2"); }, - check(card){ - return 6-get.value(card) + check(card) { + return 6 - get.value(card); }, - ai:{ - expose:0.1, - order:4, - result:{ - target(player,target){ - if(target.hasSkillTag('maixie')) return 0; + ai: { + expose: 0.1, + order: 4, + result: { + target(player, target) { + if (target.hasSkillTag("maixie")) return 0; return -1; - } - } + }, + }, }, - group:['nsfuhuo_die','nsfuhuo_gain'], - subSkill:{ - die:{ - trigger:{player:'dieBegin'}, - silent:true, - content(){ - for(var i=0;i0; - }, - check(event,player){ - if(player.hasShan()||player.hujia>0) return false; - var nh=player.countCards('h'); - if(player.hp==1){ - return nh<=3; - } - if(player.hp==2){ - return nh<=1; - } - return false; - }, - content(){ - var cards=player.getCards('h'); - player.discard(cards); - player.changeHujia(cards.length); - player.storage.nsbaquan=true; - }, - group:'nsbaquan_clear', - subSkill:{ - clear:{ - trigger:{player:'phaseBegin'}, - forced:true, - filter(event,player){ - return player.storage.nsbaquan&&player.hujia>0; - }, - content(){ - player.changeHujia(-player.hujia); - game.log(player,'失去了所有护甲'); - delete player.storage.nsbaquan; - } - } - } - }, - nschangshi:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.identity=='fan'; - }, - filterTarget(card,player,target){ - if(target==player) return false; - if(ui.selected.targets.length){ - return target.hp!=ui.selected.targets[0].hp; - } - return true; - }, - multitarget:true, - selectTarget:2, - content(){ - var tmp=targets[0].hp; - targets[0].hp=targets[1].hp; - targets[1].hp=tmp; - targets[0].update(); - targets[1].update(); - if(Math.abs(targets[0].hp-targets[1].hp)==1){ - player.loseHp(); - } - //else{ - //player.die(); - //} - }, - ai:{ - order:10, - result:{ - target(player,target){ - if(target==game.zhu) return -1; - if(get.attitude(player,target)>3){ - var num=game.zhu.hp-target.hp; - if(num==1){ - return 1; - } - if(num>1){ - if(player.hp==1) return num; - if(target.hp==1) return num; - if(num>=3) return num; - } - } - return 0; - } - } - } - }, - nsjianning:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.identity=='nei'; - }, - filterTarget(card,player,target){ - return target.countCards('h')=8; - })&&player.countCards('h')-target.countCards('h')<=1){ - if(target.hp==1||player.countCards('h',function(card){ - return get.value(card)<0; - })){ - return get.damageEffect(target,player,target); - } - } - return 0; - } - } - } - }, - nscuanquan:{ - init(player){ - player.storage.nscuanquan=0; - }, - forced:true, - unique:true, - forceunique:true, - skillAnimation:true, - animationColor:'thunder', - trigger:{player:'damageAfter'}, - filter(event,player){ - return player.identity=='zhong'&&player.storage.nscuanquan==3&&game.zhu&&game.zhu.isZhu; - }, - group:'nscuanquan_count', - subSkill:{ - count:{ - trigger:{player:'damageEnd'}, - silent:true, - content(){ - player.storage.nscuanquan++; - } - } - }, - logTarget(){ - return [game.zhu]; - }, - content(){ - player.awakenSkill('nscuanquan'); - var tmp=player.maxHp; - player.identity='zhu'; - player.maxHp=game.zhu.hp; - player.showIdentity(); - player.update(); - game.zhu.identity='zhong'; - game.zhu.maxHp=tmp; - game.zhu.showIdentity(); - game.zhu.update(); - game.zhu=player; - } - }, - nstianji:{ - trigger:{global:'dying'}, - priority:6, - unique:true, - skillAnimation:true, - animationColor:'water', - filter(event,player){ - return event.player.hp<=0&&event.player!=player; - }, - logTarget:'player', - check(event,player){ - return get.attitude(player,event.player)>1; - }, - content(){ - 'step 0' - player.awakenSkill('nstianji'); - player.loseMaxHp(); - 'step 1' - trigger.player.recover(1-trigger.player.hp); - 'step 2' - trigger.player.gainMaxHp(); - } - }, - nsbugua:{ - group:'nsbugua_use', - ai:{ - threaten:1.4, - }, - subSkill:{ - use:{ - enable:'phaseUse', - usable:1, - filterCard:true, - check(card){ - return 9-get.value(card); - }, - filter(event,player){ - // if(!player.storage.nstuiyan2_done&&player.getStat().skill.nsbugua_use){ - // return false; - // } - return player.countCards('he'); - }, - position:'he', - ai:{ - order:9.5, - result:{ - player:1 - } - }, - content(){ - 'step 0' - player.throwDice(); - 'step 1' - var cards=get.cards(6); - var cards2=cards.slice(0); - var card=(cards2.splice(event.num-1,1))[0]; - player.showCards(get.translation(player)+'亮出了'+get.translation(card),cards).set('hiddencards',cards2); - card.discard(); - var name=null; - switch(get.suit(card)){ - case 'club':{ - if(card.number%2==0){ - name='guohe'; - } - else{ - name='jiedao'; - } - break; - } - case 'spade':{ - if(card.number%2==0){ - name='nanman'; - } - else{ - name='juedou'; - } - break; - } - case 'diamond':{ - if(card.number%2==0){ - name='shunshou'; - } - else{ - name='huogong'; - } - break; - } - case 'heart':{ - if(card.number%2==0){ - name='wuzhong'; - } - else{ - name='wanjian'; - } - break; - } - } - var togain=get.cardPile(name,'cardPile'); - if(togain){ - player.gain(togain,'gain2'); - } - else{ - player.draw(); - } - event.list=cards2; - 'step 2' - player.chooseCardButton(event.list,true,'按顺序将牌置于牌堆顶(先选择的在上)',event.list.length); - 'step 3' - var list=result.links.slice(0); - while(list.length){ - ui.cardPile.insertBefore(list.pop(),ui.cardPile.firstChild); - } }, }, - twice:{} - } - }, - nstuiyan:{ - trigger:{player:'useCard'}, - filter(event,player){ - return _status.currentPhase==player&&event.getParent('phaseUse',true)&&!player.hasSkill('nstuiyan_fail')&& - typeof player.storage.nstuiyan=='number'&&event.card.number>player.storage.nstuiyan; }, - frequent:true, - priority:2, - content(){ + }, + nsbaquan: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return player.countCards("h") > 0; + }, + check(event, player) { + if (player.hasShan() || player.hujia > 0) return false; + var nh = player.countCards("h"); + if (player.hp == 1) { + return nh <= 3; + } + if (player.hp == 2) { + return nh <= 1; + } + return false; + }, + content() { + var cards = player.getCards("h"); + player.discard(cards); + player.changeHujia(cards.length); + player.storage.nsbaquan = true; + }, + group: "nsbaquan_clear", + subSkill: { + clear: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.storage.nsbaquan && player.hujia > 0; + }, + content() { + player.changeHujia(-player.hujia); + game.log(player, "失去了所有护甲"); + delete player.storage.nsbaquan; + }, + }, + }, + }, + nschangshi: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.identity == "fan"; + }, + filterTarget(card, player, target) { + if (target == player) return false; + if (ui.selected.targets.length) { + return target.hp != ui.selected.targets[0].hp; + } + return true; + }, + multitarget: true, + selectTarget: 2, + content() { + var tmp = targets[0].hp; + targets[0].hp = targets[1].hp; + targets[1].hp = tmp; + targets[0].update(); + targets[1].update(); + if (Math.abs(targets[0].hp - targets[1].hp) == 1) { + player.loseHp(); + } + //else{ + //player.die(); + //} + }, + ai: { + order: 10, + result: { + target(player, target) { + if (target == game.zhu) return -1; + if (get.attitude(player, target) > 3) { + var num = game.zhu.hp - target.hp; + if (num == 1) { + return 1; + } + if (num > 1) { + if (player.hp == 1) return num; + if (target.hp == 1) return num; + if (num >= 3) return num; + } + } + return 0; + }, + }, + }, + }, + nsjianning: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.identity == "nei"; + }, + filterTarget(card, player, target) { + return target.countCards("h") < player.countCards("h"); + }, + content() { + "step 0"; + player.swapHandcards(target); + ("step 1"); + target.damage(); + }, + ai: { + order: 10, + result: { + target(player, target) { + if ( + !player.countCards("h", function (card) { + return get.value(card) >= 8; + }) && + player.countCards("h") - target.countCards("h") <= 1 + ) { + if ( + target.hp == 1 || + player.countCards("h", function (card) { + return get.value(card) < 0; + }) + ) { + return get.damageEffect(target, player, target); + } + } + return 0; + }, + }, + }, + }, + nscuanquan: { + init(player) { + player.storage.nscuanquan = 0; + }, + forced: true, + unique: true, + forceunique: true, + skillAnimation: true, + animationColor: "thunder", + trigger: { player: "damageAfter" }, + filter(event, player) { + return ( + player.identity == "zhong" && + player.storage.nscuanquan == 3 && + game.zhu && + game.zhu.isZhu + ); + }, + group: "nscuanquan_count", + subSkill: { + count: { + trigger: { player: "damageEnd" }, + silent: true, + content() { + player.storage.nscuanquan++; + }, + }, + }, + logTarget() { + return [game.zhu]; + }, + content() { + player.awakenSkill("nscuanquan"); + var tmp = player.maxHp; + player.identity = "zhu"; + player.maxHp = game.zhu.hp; + player.showIdentity(); + player.update(); + game.zhu.identity = "zhong"; + game.zhu.maxHp = tmp; + game.zhu.showIdentity(); + game.zhu.update(); + game.zhu = player; + }, + }, + nstianji: { + trigger: { global: "dying" }, + priority: 6, + unique: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return event.player.hp <= 0 && event.player != player; + }, + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 1; + }, + content() { + "step 0"; + player.awakenSkill("nstianji"); + player.loseMaxHp(); + ("step 1"); + trigger.player.recover(1 - trigger.player.hp); + ("step 2"); + trigger.player.gainMaxHp(); + }, + }, + nsbugua: { + group: "nsbugua_use", + ai: { + threaten: 1.4, + }, + subSkill: { + use: { + enable: "phaseUse", + usable: 1, + filterCard: true, + check(card) { + return 9 - get.value(card); + }, + filter(event, player) { + // if(!player.storage.nstuiyan2_done&&player.getStat().skill.nsbugua_use){ + // return false; + // } + return player.countCards("he"); + }, + position: "he", + ai: { + order: 9.5, + result: { + player: 1, + }, + }, + content() { + "step 0"; + player.throwDice(); + ("step 1"); + var cards = get.cards(6); + var cards2 = cards.slice(0); + var card = cards2.splice(event.num - 1, 1)[0]; + player + .showCards(get.translation(player) + "亮出了" + get.translation(card), cards) + .set("hiddencards", cards2); + card.discard(); + var name = null; + switch (get.suit(card)) { + case "club": { + if (card.number % 2 == 0) { + name = "guohe"; + } else { + name = "jiedao"; + } + break; + } + case "spade": { + if (card.number % 2 == 0) { + name = "nanman"; + } else { + name = "juedou"; + } + break; + } + case "diamond": { + if (card.number % 2 == 0) { + name = "shunshou"; + } else { + name = "huogong"; + } + break; + } + case "heart": { + if (card.number % 2 == 0) { + name = "wuzhong"; + } else { + name = "wanjian"; + } + break; + } + } + var togain = get.cardPile(name, "cardPile"); + if (togain) { + player.gain(togain, "gain2"); + } else { + player.draw(); + } + event.list = cards2; + ("step 2"); + player.chooseCardButton( + event.list, + true, + "按顺序将牌置于牌堆顶(先选择的在上)", + event.list.length + ); + ("step 3"); + var list = result.links.slice(0); + while (list.length) { + ui.cardPile.insertBefore(list.pop(), ui.cardPile.firstChild); + } + }, + }, + twice: {}, + }, + }, + nstuiyan: { + trigger: { player: "useCard" }, + filter(event, player) { + return ( + _status.currentPhase == player && + event.getParent("phaseUse", true) && + !player.hasSkill("nstuiyan_fail") && + typeof player.storage.nstuiyan == "number" && + event.card.number > player.storage.nstuiyan + ); + }, + frequent: true, + priority: 2, + content() { player.draw(); }, - onremove(player){ + onremove(player) { delete player.storage.nstuiyan; delete player.storage.nstuiyan_done; delete player.storage.nstuiyan2; delete player.storage.nstuiyan2_done; }, - intro:{ - mark(dialog,content,player){ - if(player.storage.nstuiyan_done){ - dialog.addText('推演摸牌已结束'); + intro: { + mark(dialog, content, player) { + if (player.storage.nstuiyan_done) { + dialog.addText("推演摸牌已结束"); + } else { + dialog.addText("上一张点数:" + player.storage.nstuiyan); } - else{ - dialog.addText('上一张点数:'+player.storage.nstuiyan); - } - if(player.storage.nstuiyan2_done){ - dialog.addText('总点数8的倍数已达成'); - } - else{ - dialog.addText('总点数:'+player.storage.nstuiyan2); + if (player.storage.nstuiyan2_done) { + dialog.addText("总点数8的倍数已达成"); + } else { + dialog.addText("总点数:" + player.storage.nstuiyan2); } }, - content(storage,player){ - var str=''; - if(player.storage.nstuiyan_done){ - str+='推演摸牌已结束;' + content(storage, player) { + var str = ""; + if (player.storage.nstuiyan_done) { + str += "推演摸牌已结束;"; + } else { + str += "上一张牌点数:" + storage + ";"; } - else{ - str+='上一张牌点数:'+storage+';'; - } - if(player.storage.nstuiyan2_done){ - str+='总点数8的倍数已达成'; - } - else{ - str+='总点数:'+player.storage.nstuiyan2; + if (player.storage.nstuiyan2_done) { + str += "总点数8的倍数已达成"; + } else { + str += "总点数:" + player.storage.nstuiyan2; } return str; }, - markcount(storage,player){ - if(player.storage.nstuiyan2_done){ - if(player.storage.nstuiyan_done){ + markcount(storage, player) { + if (player.storage.nstuiyan2_done) { + if (player.storage.nstuiyan_done) { return 0; - } - else{ + } else { return player.storage.nstuiyan; } - } - else{ + } else { return player.storage.nstuiyan2; } - } + }, }, - group:['nstuiyan_use','nstuiyan_clear'], - subSkill:{ - bugua:{ - trigger:{player:'useCardAfter'}, - direct:true, - filter(event,player){ - return player.countCards('h'); + group: ["nstuiyan_use", "nstuiyan_clear"], + subSkill: { + bugua: { + trigger: { player: "useCardAfter" }, + direct: true, + filter(event, player) { + return player.countCards("h"); }, - content(){ - 'step 0' - player.removeSkill('nstuiyan_bugua'); - player.chooseToDiscard('he','推演:是否发动一次【卜卦】?').set('ai',function(card){ - return 8-get.value(card); - }).set('logSkill','nstuiyan'); - 'step 1' - if(result.bool){ - event.insert(lib.skill.nsbugua.subSkill.use.content,{player:player}); + content() { + "step 0"; + player.removeSkill("nstuiyan_bugua"); + player + .chooseToDiscard("he", "推演:是否发动一次【卜卦】?") + .set("ai", function (card) { + return 8 - get.value(card); + }) + .set("logSkill", "nstuiyan"); + ("step 1"); + if (result.bool) { + event.insert(lib.skill.nsbugua.subSkill.use.content, { player: player }); } - } - }, - use:{ - trigger:{player:'useCard'}, - silent:true, - priority:-1, - filter(event,player){ - return _status.currentPhase==player&&event.getParent('phaseUse',true)&&typeof event.card.number=='number'; }, - content(){ - if(typeof player.storage.nstuiyan2!='number'){ - player.storage.nstuiyan2=0; - } - if(!player.hasSkill('nstuiyan_fail')&& - (trigger.card.number<=player.storage.nstuiyan||typeof trigger.card.number!='number')){ - player.storage.nstuiyan_done=true; - player.addTempSkill('nstuiyan_fail'); - } - player.storage.nstuiyan=trigger.card.number; - player.storage.nstuiyan2+=trigger.card.number; - if(player.storage.nstuiyan2%8==0&&!player.storage.nstuiyan2_done){ - player.storage.nstuiyan2_done=true; - player.addTempSkill('nstuiyan_bugua'); - } - player.markSkill('nstuiyan'); - } }, - clear:{ - trigger:{player:['phaseUseAfter','phaseAfter']}, - silent:true, - content(){ + use: { + trigger: { player: "useCard" }, + silent: true, + priority: -1, + filter(event, player) { + return ( + _status.currentPhase == player && + event.getParent("phaseUse", true) && + typeof event.card.number == "number" + ); + }, + content() { + if (typeof player.storage.nstuiyan2 != "number") { + player.storage.nstuiyan2 = 0; + } + if ( + !player.hasSkill("nstuiyan_fail") && + (trigger.card.number <= player.storage.nstuiyan || + typeof trigger.card.number != "number") + ) { + player.storage.nstuiyan_done = true; + player.addTempSkill("nstuiyan_fail"); + } + player.storage.nstuiyan = trigger.card.number; + player.storage.nstuiyan2 += trigger.card.number; + if (player.storage.nstuiyan2 % 8 == 0 && !player.storage.nstuiyan2_done) { + player.storage.nstuiyan2_done = true; + player.addTempSkill("nstuiyan_bugua"); + } + player.markSkill("nstuiyan"); + }, + }, + clear: { + trigger: { player: ["phaseUseAfter", "phaseAfter"] }, + silent: true, + content() { delete player.storage.nstuiyan; delete player.storage.nstuiyan_done; delete player.storage.nstuiyan2; delete player.storage.nstuiyan2_done; - player.unmarkSkill('nstuiyan'); - } + player.unmarkSkill("nstuiyan"); + }, }, - fail:{} + fail: {}, + }, + ai: { + threaten: 1.4, }, - ai:{ - threaten:1.4 - } }, - nsshijun:{ - trigger:{source:'damageBegin'}, - forced:true, - content(){ + nsshijun: { + trigger: { source: "damageBegin" }, + forced: true, + content() { trigger.num++; - trigger.nsshijun=true; + trigger.nsshijun = true; }, - subSkill:{ - hp:{ - trigger:{source:'damageAfter'}, - silent:true, - filter(event){ + subSkill: { + hp: { + trigger: { source: "damageAfter" }, + silent: true, + filter(event) { return event.nsshijun; }, - content(){ + content() { player.loseHp(); - } - } + }, + }, }, - group:'nsshijun_hp' + group: "nsshijun_hp", }, - nszhaoxin:{ - mark:true, - intro:{ - mark(dialog,content,player){ - var hs=player.getCards('h'); - if(hs.length){ + nszhaoxin: { + mark: true, + intro: { + mark(dialog, content, player) { + var hs = player.getCards("h"); + if (hs.length) { dialog.addSmall(hs); - } - else{ - dialog.addText('无手牌'); + } else { + dialog.addText("无手牌"); } }, - content(content,player){ - var hs=player.getCards('h'); - if(hs.length){ + content(content, player) { + var hs = player.getCards("h"); + if (hs.length) { return get.translation(hs); + } else { + return "无手牌"; } - else{ - return '无手牌'; - } - } + }, }, }, - nsxiuxin:{ - mod:{ - targetEnabled(card,player,target){ - var suit=get.suit(card); - if(suit&&!target.countCards('h',{suit:suit})){ + nsxiuxin: { + mod: { + targetEnabled(card, player, target) { + var suit = get.suit(card); + if (suit && !target.countCards("h", { suit: suit })) { return false; } - } - } - }, - nscangxi:{ - unique:true, - global:'nscangxi2', - zhuSkill:true, - init(player){ - player.storage.nscangxi=0; + }, }, - intro:{ - content:'手牌上限+#' - }, - mod:{ - maxHandcard(player,num){ - return num+player.storage.nscangxi; - } - } }, - nscangxi2:{ - trigger:{player:'phaseDiscardEnd'}, - filter(event,player){ - if(!event.cards||event.cards.length<=1) return false; - if(player.group!='wu') return false; - return game.hasPlayer(function(target){ - return player!=target&&target.hasZhuSkill('nscangxi',player); + nscangxi: { + unique: true, + global: "nscangxi2", + zhuSkill: true, + init(player) { + player.storage.nscangxi = 0; + }, + intro: { + content: "手牌上限+#", + }, + mod: { + maxHandcard(player, num) { + return num + player.storage.nscangxi; + }, + }, + }, + nscangxi2: { + trigger: { player: "phaseDiscardEnd" }, + filter(event, player) { + if (!event.cards || event.cards.length <= 1) return false; + if (player.group != "wu") return false; + return game.hasPlayer(function (target) { + return player != target && target.hasZhuSkill("nscangxi", player); }); }, - direct:true, - content(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current!=player&¤t.hasZhuSkill('nscangxi',player); + direct: true, + content() { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player && current.hasZhuSkill("nscangxi", player); }); list.sortBySeat(); - event.list=list; - 'step 1' - if(event.list.length){ - var current=event.list.shift(); - event.current=current; - player.chooseBool(get.prompt('nscangxi',current)).set('choice',get.attitude(player,current)>0); - } - else{ + event.list = list; + ("step 1"); + if (event.list.length) { + var current = event.list.shift(); + event.current = current; + player + .chooseBool(get.prompt("nscangxi", current)) + .set("choice", get.attitude(player, current) > 0); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.logSkill('nscangxi',event.current); - player.judge(function(card){ - return _status.event.att*(get.color(card)=='black'?1:0); - }).set('att',get.sgnAttitude(player,event.current)); - } - else{ + ("step 2"); + if (result.bool) { + player.logSkill("nscangxi", event.current); + player + .judge(function (card) { + return _status.event.att * (get.color(card) == "black" ? 1 : 0); + }) + .set("att", get.sgnAttitude(player, event.current)); + } else { event.goto(1); } - 'step 3' - if(result.color=='black'){ - var name=get.translation(event.current.name); - var att=0; - if(event.current.needsToDiscard()){ - att=1; + ("step 3"); + if (result.color == "black") { + var name = get.translation(event.current.name); + var att = 0; + if (event.current.needsToDiscard()) { + att = 1; } - player.chooseControlList(['令'+name+'摸一张牌展示','令'+name+'手牌上永久+1','弃置一张牌并令'+name+'获得一张本回合进入弃牌堆的牌'],function(){ - return _status.event.att; - }).set('att',att); - } - else{ + player + .chooseControlList( + [ + "令" + name + "摸一张牌展示", + "令" + name + "手牌上永久+1", + "弃置一张牌并令" + name + "获得一张本回合进入弃牌堆的牌", + ], + function () { + return _status.event.att; + } + ) + .set("att", att); + } else { event.goto(1); } - 'step 4' - switch(result.index){ - case 0: event.current.draw('visible');break; + ("step 4"); + switch (result.index) { + case 0: + event.current.draw("visible"); + break; case 1: { - if(typeof event.current.storage.nscangxi!='number'){ - event.current.storage.nscangxi=0; + if (typeof event.current.storage.nscangxi != "number") { + event.current.storage.nscangxi = 0; } event.current.storage.nscangxi++; - event.current.syncStorage('nscangxi'); - event.current.markSkill('nscangxi'); + event.current.syncStorage("nscangxi"); + event.current.markSkill("nscangxi"); break; } case 2: { - player.chooseToDiscard(true,'he'); + player.chooseToDiscard(true, "he"); break; } } - if(result.index!=2){ + if (result.index != 2) { event.goto(1); } - 'step 5' - if(result.bool){ - var discarded=get.discarded(); - if(discarded.length){ - event.current.chooseCardButton('选择一张获得之',discarded,true).set('ai',function(button){ - return get.value(button.link); - }); - } - else{ + ("step 5"); + if (result.bool) { + var discarded = get.discarded(); + if (discarded.length) { + event.current + .chooseCardButton("选择一张获得之", discarded, true) + .set("ai", function (button) { + return get.value(button.link); + }); + } else { event.goto(1); } - } - else{ + } else { event.goto(1); } - 'step 6' - if(result.bool&&result.links&&result.links.length){ - event.current.gain(result.links,'gain2'); + ("step 6"); + if (result.bool && result.links && result.links.length) { + event.current.gain(result.links, "gain2"); } event.goto(1); - } + }, }, - nswulie:{ - trigger:{player:'phaseBegin'}, - skillAnimation:true, - animationColor:'metal', - unique:true, - check(){ + nswulie: { + trigger: { player: "phaseBegin" }, + skillAnimation: true, + animationColor: "metal", + unique: true, + check() { return false; }, - filter(event,player){ - return ui.discardPile.childElementCount>0; + filter(event, player) { + return ui.discardPile.childElementCount > 0; }, - content(){ - 'step 0' - player.awakenSkill('nswulie'); + content() { + "step 0"; + player.awakenSkill("nswulie"); player.loseMaxHp(); - 'step 1' - player.chooseCardButton(Array.from(ui.discardPile.childNodes),'将至多3张任意顺置于牌堆顶(先选择的在上)',true,[1,3]); - 'step 2' - if(result.bool){ - var cards=result.links.slice(0); - while(cards.length){ - ui.cardPile.insertBefore(cards.pop(),ui.cardPile.firstChild); + ("step 1"); + player.chooseCardButton( + Array.from(ui.discardPile.childNodes), + "将至多3张任意顺置于牌堆顶(先选择的在上)", + true, + [1, 3] + ); + ("step 2"); + if (result.bool) { + var cards = result.links.slice(0); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); } - player.addTempSkill('nswulie_end'); + player.addTempSkill("nswulie_end"); } }, - subSkill:{ - end:{ - trigger:{player:'phaseEnd'}, - check(){ + subSkill: { + end: { + trigger: { player: "phaseEnd" }, + check() { return false; }, - filter(event,player){ - return ui.discardPile.childElementCount>0; + filter(event, player) { + return ui.discardPile.childElementCount > 0; }, - content(){ - 'step 0' + content() { + "step 0"; player.loseMaxHp(); - 'step 1' - player.chooseCardButton(Array.from(ui.discardPile.childNodes),'将至多3张任意顺置于牌堆顶(先选择的在上)',true,[1,3]); - 'step 2' - if(result.bool){ - var cards=result.links.slice(0); - while(cards.length){ - ui.cardPile.insertBefore(cards.pop(),ui.cardPile.firstChild); + ("step 1"); + player.chooseCardButton( + Array.from(ui.discardPile.childNodes), + "将至多3张任意顺置于牌堆顶(先选择的在上)", + true, + [1, 3] + ); + ("step 2"); + if (result.bool) { + var cards = result.links.slice(0); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); } } - } - } - } - }, - nshunyou:{ - enable:'phaseUse', - usable:1, - filterCard:{type:'basic'}, - filter(event,player){ - return player.countCards('h',{type:'basic'}); + }, + }, }, - content(){ - 'step 0' - var equip=null, trick=null; - for(var i=0;i1){ - if(!target.getEquip(_status.event.subtype)) return att; - } - return 0; - }).set('subtype',get.subtype(event.equip)); - } - else{ + ("step 1"); + if (event.equip && get.owner(event.equip) == player) { + player + .chooseTarget( + "是否将" + get.translation(event.equip) + "装备给一其角色?", + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 1) { + if (!target.getEquip(_status.event.subtype)) return att; + } + return 0; + }) + .set("subtype", get.subtype(event.equip)); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.line(result.targets,'green'); - player.$give(event.equip,result.targets[0]); - player.lose(event.equip,ui.special); - } - else{ + ("step 2"); + if (result.bool) { + player.line(result.targets, "green"); + player.$give(event.equip, result.targets[0]); + player.lose(event.equip, ui.special); + } else { event.finish(); } - 'step 3' + ("step 3"); game.delay(0.5); - 'step 4' + ("step 4"); result.targets[0].equip(event.equip); - 'step 5' + ("step 5"); game.delay(); }, - check(card){ - return 7-get.value(card); + check(card) { + return 7 - get.value(card); + }, + ai: { + order: 7, + result: { + player: 1, + }, }, - ai:{ - order:7, - result:{ - player:1 - } - } }, - nsgongjian:{ - trigger:{player:'phaseDiscardEnd'}, - forced:true, - filter(event,player){ - if(event.cards&&event.cards.length>0){ - return game.hasPlayer(function(current){ - return current.hp>player.hp; + nsgongjian: { + trigger: { player: "phaseDiscardEnd" }, + forced: true, + filter(event, player) { + if (event.cards && event.cards.length > 0) { + return game.hasPlayer(function (current) { + return current.hp > player.hp; }); } return false; }, - content(){ - 'step 0' - player.chooseTarget('恭俭:将置的牌交给一名体力值大于你的角色',function(card,player,target){ - return target.hp>player.hp; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target)/Math.sqrt(target.countCards('h')+1); - }); - 'step 1' - if(result.bool){ - player.line(result.targets,'green'); - result.targets[0].gain(trigger.cards,'gain2'); + content() { + "step 0"; + player + .chooseTarget( + "恭俭:将置的牌交给一名体力值大于你的角色", + function (card, player, target) { + return target.hp > player.hp; + } + ) + .set("ai", function (target) { + return ( + get.attitude(_status.event.player, target) / + Math.sqrt(target.countCards("h") + 1) + ); + }); + ("step 1"); + if (result.bool) { + player.line(result.targets, "green"); + result.targets[0].gain(trigger.cards, "gain2"); } }, }, - nscaijian:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - var nh=player.countCards('h'); - return nh&&nh<=player.maxHp; + nscaijian: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + var nh = player.countCards("h"); + return nh && nh <= player.maxHp; }, - content(){ - 'step 0' + content() { + "step 0"; player.showHandcards(); - event.num=player.countCards('h'); - 'step 1' + event.num = player.countCards("h"); + ("step 1"); player.directgain(get.cards(event.num)); - player.chooseCard('将'+get.cnNumber(event.num)+'张手牌以按顺序置于牌堆顶(先选择的在上)',event.num,true).set('ai',function(card){ - return -get.value(card); - }); - 'step 2' - if(result.bool){ - player.lose(result.cards,ui.special)._triggered=null; - event.cards=result.cards.slice(0); - } - else{ + player + .chooseCard( + "将" + get.cnNumber(event.num) + "张手牌以按顺序置于牌堆顶(先选择的在上)", + event.num, + true + ) + .set("ai", function (card) { + return -get.value(card); + }); + ("step 2"); + if (result.bool) { + player.lose(result.cards, ui.special)._triggered = null; + event.cards = result.cards.slice(0); + } else { event.finish(); } - 'step 3' - if(player==game.me&&_status.auto){ + ("step 3"); + if (player == game.me && _status.auto) { game.delay(); } - 'step 4' - while(event.cards.length){ - var current=event.cards.pop(); + ("step 4"); + while (event.cards.length) { + var current = event.cards.pop(); current.fix(); - ui.cardPile.insertBefore(current,ui.cardPile.firstChild); + ui.cardPile.insertBefore(current, ui.cardPile.firstChild); } }, - ai:{ - order:10, - result:{ - player:1 - } - } + ai: { + order: 10, + result: { + player: 1, + }, + }, }, - nsdongcha:{ - trigger:{player:'damageBefore'}, - forced:true, - priority:15, - filter(event,player){ - if(get.type(event.card,'trick')=='trick'){ - if(event.getParent(2).name=='useCard'){ - return event.getParent(2).targets.length==1; + nsdongcha: { + trigger: { player: "damageBefore" }, + forced: true, + priority: 15, + filter(event, player) { + if (get.type(event.card, "trick") == "trick") { + if (event.getParent(2).name == "useCard") { + return event.getParent(2).targets.length == 1; } return true; } return false; }, - content(){ + content() { trigger.cancel(); }, - ai:{ - notrick:true, - effect:{ - target(card,player,target,current){ - if(get.type(card)=='trick'&&get.tag(card,'damage')&&!get.tag(card,'multitarget')){ - return 'zeroplayertarget'; + ai: { + notrick: true, + effect: { + target(card, player, target, current) { + if ( + get.type(card) == "trick" && + get.tag(card, "damage") && + !get.tag(card, "multitarget") + ) { + return "zeroplayertarget"; } - } - } - }, - group:'nsdongcha_cancel', - subSkill:{ - cancel:{ - trigger:{target:'useCardToAfter'}, - silent:true, - filter(event,player){ - return get.type(event.card,'trick')=='trick'&&_status.currentPhase==event.player&&event.player!=player; }, - content(){ - player.addTempSkill('nsdongcha_disable'); - } }, - disable:{ - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - onremove:true, - filter(event,player){ - return (event.player==_status.currentPhase&&get.type(event.card,'trick')=='trick'); + }, + group: "nsdongcha_cancel", + subSkill: { + cancel: { + trigger: { target: "useCardToAfter" }, + silent: true, + filter(event, player) { + return ( + get.type(event.card, "trick") == "trick" && + _status.currentPhase == event.player && + event.player != player + ); }, - content(){ + content() { + player.addTempSkill("nsdongcha_disable"); + }, + }, + disable: { + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + onremove: true, + filter(event, player) { + return ( + event.player == _status.currentPhase && + get.type(event.card, "trick") == "trick" + ); + }, + content() { trigger.cancel(); }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.type(card,'trick')=='trick'&&_status.currentPhase==player) return 'zeroplayertarget'; - } - } - } - } - } + ai: { + effect: { + target(card, player, target, current) { + if (get.type(card, "trick") == "trick" && _status.currentPhase == player) + return "zeroplayertarget"; + }, + }, + }, + }, + }, }, - nsjianxiong:{ - trigger:{target:'useCardToBefore'}, - direct:true, - content(){ - 'step 0' - player.chooseToUse(function(card){ - return !get.info(card).multitarget; - },get.prompt('nsjianxiong',trigger.player),trigger.player,-1); - 'step 1' - if(event.damaged){ + nsjianxiong: { + trigger: { target: "useCardToBefore" }, + direct: true, + content() { + "step 0"; + player.chooseToUse( + function (card) { + return !get.info(card).multitarget; + }, + get.prompt("nsjianxiong", trigger.player), + trigger.player, + -1 + ); + ("step 1"); + if (event.damaged) { trigger.cancel(); - if(get.color(trigger.card)=='black'){ + if (get.color(trigger.card) == "black") { player.draw(); } } }, - subSkill:{ - damage:{ - trigger:{source:'damageAfter'}, - silent:true, - filter(event,player){ - return event.getParent(4).name=='nsjianxiong'; + subSkill: { + damage: { + trigger: { source: "damageAfter" }, + silent: true, + filter(event, player) { + return event.getParent(4).name == "nsjianxiong"; }, - content(){ - trigger.getParent(4).damaged=true; - } - } + content() { + trigger.getParent(4).damaged = true; + }, + }, }, - group:'nsjianxiong_damage', - ai:{ - effect:{ - player(card,player,target){ - if(_status.currentPhase!=player) return; - if(get.tag(card,'damage')&&!player.needsToDiscard(1)&&target.hp>1){ - return 'zeroplayertarget'; + group: "nsjianxiong_damage", + ai: { + effect: { + player(card, player, target) { + if (_status.currentPhase != player) return; + if (get.tag(card, "damage") && !player.needsToDiscard(1) && target.hp > 1) { + return "zeroplayertarget"; } - } - } - } + }, + }, + }, }, - nsxionglue:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h',{color:'black'}); + nsxionglue: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h", { color: "black" }); }, - check(card){ - return 7-get.value(card); + check(card) { + return 7 - get.value(card); }, - filterCard:{color:'black'}, - content(){ - 'step 0' - var list=get.inpile('trick'); - list=list.randomGets(3); - for(var i=0;i1; + nshuanhuo: { + trigger: { player: ["loseHpAfter", "damageAfter"] }, + filter(event, player) { + if ( + game.countPlayer(function (current) { + return current != player && !current.isUnseen(2); + }) < 2 + ) + return false; + if (event.name == "damage") return event.num > 1; return true; }, - direct:true, - skillAnimation:true, - animationColor:'thunder', - content(){ - 'step 0' - player.chooseTarget(2,get.prompt2('nshuanhuo'),function(card,player,target){ - return target!=player&&!target.isUnseen(2); - }).set('ai',function(target){ - var att=get.attitude(player,target); - if(ui.selected.targets.length){ - if(att<0){ - return get.rank(target,true)-get.rank(ui.selected.targets[0],true); + direct: true, + skillAnimation: true, + animationColor: "thunder", + content() { + "step 0"; + player + .chooseTarget(2, get.prompt2("nshuanhuo"), function (card, player, target) { + return target != player && !target.isUnseen(2); + }) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (ui.selected.targets.length) { + if (att < 0) { + return get.rank(target, true) - get.rank(ui.selected.targets[0], true); + } + } else { + if (att >= 0) { + return 1 / (1 + get.rank(target, true)); + } } - } - else{ - if(att>=0){ - return 1/(1+get.rank(target,true)); - } - } - return 0; - }); - 'step 1' - if(result.bool){ - player.logSkill('nshuanhuo',result.targets); - } - else{ + return 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("nshuanhuo", result.targets); + } else { event.finish(); } - 'step 2' - var name1=result.targets[0].name; - var name2=result.targets[1].name; - result.targets[0].reinit(name1,name2,false); - result.targets[1].reinit(name2,name1,false); - } + ("step 2"); + var name1 = result.targets[0].name; + var name2 = result.targets[1].name; + result.targets[0].reinit(name1, name2, false); + result.targets[1].reinit(name2, name1, false); + }, }, - nsyaowang:{ - trigger:{player:'phaseBegin'}, - direct:true, - createDialog(player,target,onlylist){ - var names=[]; - var list=[]; - if(target.name1&&!target.isUnseen(0)) names.add(target.name1); - if(target.name2&&!target.isUnseen(1)) names.add(target.name2); - var pss=player.getSkills(); - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); + dialog.add(ui.create.div(".placeholder")); return dialog; }, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('nsyaowang'),function(card,player,target){ - var names=[]; - if(target.name1&&!target.isUnseen(0)) names.add(target.name1); - if(target.name2&&!target.isUnseen(1)) names.add(target.name2); - var pss=player.getSkills(); - for(var i=0;i0) return Math.random(); - return 0; - }); - 'step 1' - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('nsyaowang',event.target); - } - else{ + }) + .set("ai", function (target) { + if (get.attitude(_status.event.player, target) > 0) return Math.random(); + return 0; + }); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("nsyaowang", event.target); + } else { event.finish(); } - 'step 2' - event.skillai=function(list){ - return get.max(list,get.skillRank,'item'); + ("step 2"); + event.skillai = function (list) { + return get.max(list, get.skillRank, "item"); }; - if(event.isMine()){ - event.dialog=lib.skill.nsyaowang.createDialog(player,target); - event.switchToAuto=function(){ - event._result=event.skillai(event.list); + if (event.isMine()) { + event.dialog = lib.skill.nsyaowang.createDialog(player, target); + event.switchToAuto = function () { + event._result = event.skillai(event.list); game.resume(); }; - _status.imchoosing=true; + _status.imchoosing = true; game.pause(); + } else { + event._result = event.skillai(lib.skill.nsyaowang.createDialog(player, target, true)); } - else{ - event._result=event.skillai(lib.skill.nsyaowang.createDialog(player,target,true)); - } - 'step 3' - _status.imchoosing=false; - if(event.dialog){ + ("step 3"); + _status.imchoosing = false; + if (event.dialog) { event.dialog.close(); } player.addTempSkill(result); player.popup(result); - game.log(player,'获得了','【'+get.translation(result)+'】'); - var names=[]; - for(var i=0;i2){ - return att*2; + group: "nsyunxing_self", + subSkill: { + self: { + trigger: { player: "dieBegin" }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("nsyunxing"), function (card, player, target) { + return target != player; + }) + .set("prompt2", "令一名其他角色翻面") + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.isTurnedOver()) { + if (att > 2) { + return att * 2; + } else { + return att; + } + } else { + return -att; } - else{ - return att; - } - } - else{ - return -att; - } - }); - 'step 1' - if(result.bool){ - player.logSkill('nsyunxing',result.targets); + }); + ("step 1"); + if (result.bool) { + player.logSkill("nsyunxing", result.targets); result.targets[0].turnOver(); } - } - } - } - }, - nsguanxing:{ - trigger:{player:'phaseBegin'}, - forced:true, - filter(event,player){ - return player.hp>0; + }, + }, }, - content(){ - 'step 0' - event.cards=get.cards(game.countPlayer()); - event.chosen=[]; - event.num=player.hp; - 'step 1' - var js=player.getCards('j'); + }, + nsguanxing: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.hp > 0; + }, + content() { + "step 0"; + event.cards = get.cards(game.countPlayer()); + event.chosen = []; + event.num = player.hp; + ("step 1"); + var js = player.getCards("j"); var pos; - var choice=-1; - var getval=function(card,pos){ - if(js[pos]){ - return (get.judge(js[pos]))(card); - } - else{ + var choice = -1; + var getval = function (card, pos) { + if (js[pos]) { + return get.judge(js[pos])(card); + } else { return get.value(card); } }; - for(pos=0;posmax){ - choice=j; - max=current; + for (pos = 0; pos < Math.min(event.cards.length, js.length + 2); pos++) { + var max = getval(event.cards[pos], pos); + for (var j = pos + 1; j < event.cards.length; j++) { + var current = getval(event.cards[j], pos); + if (current > max) { + choice = j; + max = current; } } - if(choice!=-1){ + if (choice != -1) { break; } } - player.chooseCardButton('观星:选择要移动的牌(还能移动'+event.num+'张)',event.cards).set('filterButton',function(button){ - return !_status.event.chosen.includes(button.link); - }).set('chosen',event.chosen).set('ai',function(button){ - return button.link==_status.event.choice?1:0; - }).set('choice',event.cards[choice]); - event.pos=pos; - 'step 2' - if(result.bool){ - var card=result.links[0]; - var index=event.cards.indexOf(card); - event.card=card; + player + .chooseCardButton("观星:选择要移动的牌(还能移动" + event.num + "张)", event.cards) + .set("filterButton", function (button) { + return !_status.event.chosen.includes(button.link); + }) + .set("chosen", event.chosen) + .set("ai", function (button) { + return button.link == _status.event.choice ? 1 : 0; + }) + .set("choice", event.cards[choice]); + event.pos = pos; + ("step 2"); + if (result.bool) { + var card = result.links[0]; + var index = event.cards.indexOf(card); + event.card = card; event.chosen.push(card); event.cards.remove(event.card); - var buttons=event.cards.slice(0); - player.chooseControl(function(){ - return _status.event.controlai; - }).set('controlai',event.pos||0).set('sortcard',buttons).set('tosort',card); - } - else{ + var buttons = event.cards.slice(0); + player + .chooseControl(function () { + return _status.event.controlai; + }) + .set("controlai", event.pos || 0) + .set("sortcard", buttons) + .set("tosort", card); + } else { event.goto(4); } - 'step 3' - if(typeof result.index=='number'){ - if(result.index>event.cards.length){ + ("step 3"); + if (typeof result.index == "number") { + if (result.index > event.cards.length) { ui.cardPile.appendChild(event.card); - } - else{ - event.cards.splice(result.index,0,event.card); + } else { + event.cards.splice(result.index, 0, event.card); } event.num--; - if(event.num>0){ + if (event.num > 0) { event.goto(1); } } - 'step 4' - while(event.cards.length){ - ui.cardPile.insertBefore(event.cards.pop(),ui.cardPile.firstChild); + ("step 4"); + while (event.cards.length) { + ui.cardPile.insertBefore(event.cards.pop(), ui.cardPile.firstChild); } - var js=player.getCards('j'); - if(js.length==1){ - if((get.judge(js[0]))(ui.cardPile.firstChild)<0){ - player.addTempSkill('guanxing_fail'); + var js = player.getCards("j"); + if (js.length == 1) { + if (get.judge(js[0])(ui.cardPile.firstChild) < 0) { + player.addTempSkill("guanxing_fail"); } } }, - ai:{ - guanxing:true - } - }, - nshaoling:{ - skillAnimation:true, - animationColor:'water', - unique:true, - limited:true, - enable:'phaseUse', - filterTarget(card,player,target){ - return target!=player; + ai: { + guanxing: true, }, - content(){ - "step 0" - player.awakenSkill('nshaoling'); - event.targets=game.filterPlayer(); + }, + nshaoling: { + skillAnimation: true, + animationColor: "water", + unique: true, + limited: true, + enable: "phaseUse", + filterTarget(card, player, target) { + return target != player; + }, + content() { + "step 0"; + player.awakenSkill("nshaoling"); + event.targets = game.filterPlayer(); event.targets.remove(player); event.targets.remove(target); event.targets.sortBySeat(); - "step 1" - if(event.targets.length){ - event.current=event.targets.shift(); - if(event.current.countCards('he')&&target.isAlive()){ - event.current.chooseToUse({name:'sha'},target,-1,'号令').set('prompt2','选择一项:1. 对'+get.translation(event.current)+'使用一张杀;2. 取消并交给'+get.translation(player)+'一张牌,然后视'+get.translation(player)+'为对你使用一张杀'); + ("step 1"); + if (event.targets.length) { + event.current = event.targets.shift(); + if (event.current.countCards("he") && target.isAlive()) { + event.current + .chooseToUse({ name: "sha" }, target, -1, "号令") + .set( + "prompt2", + "选择一项:1. 对" + + get.translation(event.current) + + "使用一张杀;2. 取消并交给" + + get.translation(player) + + "一张牌,然后视" + + get.translation(player) + + "为对你使用一张杀" + ); } - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool==false){ - if(event.current.countCards('he')){ - event.current.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); - } - else{ + ("step 2"); + if (result.bool == false) { + if (event.current.countCards("he")) { + event.current.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } else { event.goto(4); } - } - else{ + } else { event.goto(1); } - "step 3" - if(result.bool){ - event.current.give(result.cards,player); + ("step 3"); + if (result.bool) { + event.current.give(result.cards, player); } - "step 4" - player.useCard({name:'sha'},event.current,false); + ("step 4"); + player.useCard({ name: "sha" }, event.current, false); event.goto(1); }, - ai:{ - order:5, - result:{ - target(player,target){ - var players=game.filterPlayer(); - if(player.hp>1){ - if(game.phaseNumber 1) { + if (game.phaseNumber < game.players.length) return 0; + if (player.hasUnknown()) return 0; } - var effect=0; - for(var i=0;i0; + }, }, - threaten:1.5, - save:true, - respondTao:true, - } + }, }, - nscaiyi:{ - trigger:{global:'drawAfter'}, - check(event,player){ - if(get.attitude(player,event.player)>=0) return false; - if(get.effect(event.player,{name:'sha'},player,player)<=0) return false; - if(get.effect(player,{name:'sha'},event.player,player)>=0) return true; - return player.hasShan()&&player.hp>=event.player.hp; + nsgefa: { + enable: "chooseToUse", + filter(event, player) { + return player.hp <= 0; }, - filter(event,player){ - return player!=event.player&&Array.isArray(event.result)&&event.result.length>0; + filterCard: { suit: "club" }, + position: "hse", + viewAs: { name: "tao" }, + prompt: "将一张梅花牌当桃使用", + check(card) { + return 15 - get.value(card); }, - logTarget:'player', - content(){ - 'step 0' - player.viewCards(get.translation(trigger.player)+'摸到的牌',trigger.result); - if(!event.isMine()){ + ai: { + skillTagFilter(player) { + return player.countCards("hes", { suit: "club" }) > 0; + }, + threaten: 1.5, + save: true, + respondTao: true, + }, + }, + nscaiyi: { + trigger: { global: "drawAfter" }, + check(event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if (get.effect(event.player, { name: "sha" }, player, player) <= 0) return false; + if (get.effect(player, { name: "sha" }, event.player, player) >= 0) return true; + return player.hasShan() && player.hp >= event.player.hp; + }, + filter(event, player) { + return player != event.player && Array.isArray(event.result) && event.result.length > 0; + }, + logTarget: "player", + content() { + "step 0"; + player.viewCards(get.translation(trigger.player) + "摸到的牌", trigger.result); + if (!event.isMine()) { game.delayx(); } - 'step 1' - var list=[]; - for(var i=0;i0; }, - content(){ + }, + nspinmin: { + trigger: { player: "dieBefore" }, + forced: true, + filter(event, player) { + return player.maxHp > 0; + }, + content() { trigger.cancel(); - player.hp=1; + player.hp = 1; player.update(); - if(_status.currentPhase==player){ - var num=4; + if (_status.currentPhase == player) { + var num = 4; // if(game.countPlayer()>=7){ // num=5; // } - if(!player.hasSkill('nspinmin_used')&&player.maxHp=4){ + group: "nsshishou_use", + subSkill: { + use: { + mod: { + cardEnabled(card, player) { + if (_status.currentPhase != player) return; + if (get.cardCount(true, player) >= 4) { return false; } - } - } - } + }, + }, + }, }, - ai:{ - effect:{ - target(card,player,target){ - if(get.tag(card,'save')){ - if(_status.currentPhase==player) return 0; - if(target.maxHp>1&&player!=target) return 0; + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "save")) { + if (_status.currentPhase == player) return 0; + if (target.maxHp > 1 && player != target) return 0; } - if(get.tag(card,'recover')){ - if(_status.currentPhase==player) return 0; + if (get.tag(card, "recover")) { + if (_status.currentPhase == player) return 0; } - } - } - } + }, + }, + }, }, - nsduijue:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter(event,player){ - return player.countCards('h'); + nsduijue: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter(event, player) { + return player.countCards("h"); }, - content(){ - "step 0" - var color={ - black:player.countCards('h',function(card){ - return get.color(card)=='red'&&get.value(card)<8; + content() { + "step 0"; + var color = { + black: player.countCards("h", function (card) { + return get.color(card) == "red" && get.value(card) < 8; + }), + red: player.countCards("h", function (card) { + return get.color(card) == "black" && get.value(card) < 8; }), - red:player.countCards('h',function(card){ - return get.color(card)=='black'&&get.value(card)<8; - }) }; - player.chooseToDiscard(get.prompt2('nsduijue')).set('ai',function(card){ - var num=_status.event.color[get.color(card)]; - if(_status.event.goon&&num>=1){ - return 7+num-get.value(card); - } - }).set('goon',game.hasPlayer(function(current){ - return get.effect(current,{name:'juedou'},player,player)>0; - })).set('color',color).set('logSkill','nsduijue'); - "step 1" - if(result.bool){ - player.addTempSkill('nsduijue_use'); - player.storage.nsduijue_use=get.color(result.cards[0]); + player + .chooseToDiscard(get.prompt2("nsduijue")) + .set("ai", function (card) { + var num = _status.event.color[get.color(card)]; + if (_status.event.goon && num >= 1) { + return 7 + num - get.value(card); + } + }) + .set( + "goon", + game.hasPlayer(function (current) { + return get.effect(current, { name: "juedou" }, player, player) > 0; + }) + ) + .set("color", color) + .set("logSkill", "nsduijue"); + ("step 1"); + if (result.bool) { + player.addTempSkill("nsduijue_use"); + player.storage.nsduijue_use = get.color(result.cards[0]); } }, - subSkill:{ - use:{ - enable:'phaseUse', - viewAs:{name:'juedou'}, - usable:2, - filter(event,player){ - return player.hasCard(function(card){ - return get.color(card)!=player.storage.nsduijue_use; - },'hs'); + subSkill: { + use: { + enable: "phaseUse", + viewAs: { name: "juedou" }, + usable: 2, + filter(event, player) { + return player.hasCard(function (card) { + return get.color(card) != player.storage.nsduijue_use; + }, "hs"); }, - position:'hs', - filterCard(card,player){ - return get.color(card)!=player.storage.nsduijue_use; + position: "hs", + filterCard(card, player) { + return get.color(card) != player.storage.nsduijue_use; }, - check(card){ - return 8-get.value(card); + check(card) { + return 8 - get.value(card); }, - ai:{ - basic:{ - order:10 - } - } - } - } + ai: { + basic: { + order: 10, + }, + }, + }, + }, }, - nsshuangxiong:{ - trigger:{player:'juedouBegin',target:'juedouBegin'}, - check(event,player){ + nsshuangxiong: { + trigger: { player: "juedouBegin", target: "juedouBegin" }, + check(event, player) { return player.isTurnedOver(); }, - content(){ + content() { player.turnOver(); - } - }, - nsguanyong:{ - enable:'chooseToRespond', - filterCard:true, - viewAs:{name:'sha'}, - viewAsFilter(player){ - if(!player.countCards('hs')) return false; }, - position:'hs', - prompt:'将一张手牌当杀打出', - check(card){return 7-get.value(card)}, - ai:{ - respondSha:true, - skillTagFilter(player,tag,arg){ - if(arg!='respond') return false; - if(!player.countCards('hs')) return false; + }, + nsguanyong: { + enable: "chooseToRespond", + filterCard: true, + viewAs: { name: "sha" }, + viewAsFilter(player) { + if (!player.countCards("hs")) return false; + }, + position: "hs", + prompt: "将一张手牌当杀打出", + check(card) { + return 7 - get.value(card); + }, + ai: { + respondSha: true, + skillTagFilter(player, tag, arg) { + if (arg != "respond") return false; + if (!player.countCards("hs")) return false; }, - } - }, - nsjihui:{ - trigger:{global:'discardAfter'}, - filter(event,player){ - return event.cards.length>=3; }, - content(){ + }, + nsjihui: { + trigger: { global: "discardAfter" }, + filter(event, player) { + return event.cards.length >= 3; + }, + content() { player.insertPhase(); - player.storage.nsjihui_use=_status.currentPhase; - player.addSkill('nsjihui_use'); + player.storage.nsjihui_use = _status.currentPhase; + player.addSkill("nsjihui_use"); }, - subSkill:{ - use:{ - mark:'character', - intro:{ - content:'使用牌只能指定自己与$为目标' + subSkill: { + use: { + mark: "character", + intro: { + content: "使用牌只能指定自己与$为目标", }, - trigger:{player:'phaseAfter'}, - forced:true, - popup:false, - filter(event,player){ - return event.skill=='nsjihui'; + trigger: { player: "phaseAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "nsjihui"; }, - onremove:true, - content(){ - player.removeSkill('nsjihui_use'); + onremove: true, + content() { + player.removeSkill("nsjihui_use"); }, - mod:{ - playerEnabled(card,player,target){ - if(player!=target&&player.storage.nsjihui_use!=target) return false; - } - } - } - } + mod: { + playerEnabled(card, player, target) { + if (player != target && player.storage.nsjihui_use != target) return false; + }, + }, + }, + }, }, - nsmouyun:{ - enable:'phaseUse', - round:2, - filterTarget(card,player,target){ - return target.isMinHp()&&target!=player&&target.isDamaged(); + nsmouyun: { + enable: "phaseUse", + round: 2, + filterTarget(card, player, target) { + return target.isMinHp() && target != player && target.isDamaged(); }, - content(){ - if(target.isDamaged()){ - player.discardPlayerCard(target,'hej',target.maxHp-target.hp,true); + content() { + if (target.isDamaged()) { + player.discardPlayerCard(target, "hej", target.maxHp - target.hp, true); } }, - ai:{ - order:10, - result:{ - target(player,target){ - return target.hp-target.maxHp; - } - } - } + ai: { + order: 10, + result: { + target(player, target) { + return target.hp - target.maxHp; + }, + }, + }, }, - nscongjun:{ - forbid:['guozhan'], - unique:true, - forceunique:true, - init(player){ - if(player.storage.nscongjun_show) return false; - var change=function(target){ - if(target==player){ + nscongjun: { + forbid: ["guozhan"], + unique: true, + forceunique: true, + init(player) { + if (player.storage.nscongjun_show) return false; + var change = function (target) { + if (target == player) { var list; - if(_status.connectMode){ - list=get.charactersOL(function(i){ - return lib.character[i][0]!='male'; + if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][0] != "male"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[0] == "male"; }); } - else{ - list=get.gainableCharacters(function(info){ - return info[0]=='male'; - }); - } - var name=list.randomGet(); - target.reinit('ns_huamulan',name,'nosmooth'); - target.storage.nscongjun_show=name; - target.addSkill('nscongjun_show'); + var name = list.randomGet(); + target.reinit("ns_huamulan", name, "nosmooth"); + target.storage.nscongjun_show = name; + target.addSkill("nscongjun_show"); player._inits.remove(change); - player.hp=player.maxHp; + player.hp = player.maxHp; player.update(); } - } - if(!player._inits){ - player._inits=[]; + }; + if (!player._inits) { + player._inits = []; } player._inits.push(change); }, - subSkill:{ - show:{ - trigger:{global:'useCard'}, - filter(event,player){ - return player.getEnemies().includes(event.player)&&event.card.name=='wuxie'&&event.getRand()<0.1; + subSkill: { + show: { + trigger: { global: "useCard" }, + filter(event, player) { + return ( + player.getEnemies().includes(event.player) && + event.card.name == "wuxie" && + event.getRand() < 0.1 + ); }, - direct:true, - skillAnimation:true, - animationColor:'thunder', - content(){ - 'step 0' + direct: true, + skillAnimation: true, + animationColor: "thunder", + content() { + "step 0"; game.delay(0.5); - 'step 1' - player.reinit(player.storage.nscongjun_show,'ns_huamulan','nosmooth'); - player.logSkill('nscongjun_show'); - 'step 2' - player.removeSkill('nscongjun_show'); - player.line(trigger.player,'green'); + ("step 1"); + player.reinit(player.storage.nscongjun_show, "ns_huamulan", "nosmooth"); + player.logSkill("nscongjun_show"); + ("step 2"); + player.removeSkill("nscongjun_show"); + player.line(trigger.player, "green"); trigger.player.damage(2); - } - } - } + }, + }, + }, }, - nstaiping_nh:{ - trigger:{player:'damageEnd'}, - filter(event,player){ - return !event.nshuanxian&&player.getSubPlayers('nshuanxian').length; + nstaiping_nh: { + trigger: { player: "damageEnd" }, + filter(event, player) { + return !event.nshuanxian && player.getSubPlayers("nshuanxian").length; }, - direct:true, - priority:-0.1, - ai:{ - maixie:true, - maixie_hp:true + direct: true, + priority: -0.1, + ai: { + maixie: true, + maixie_hp: true, }, - content(){ - 'step 0' - event.num=trigger.num; - 'step 1' - var left=player.storage.nshuanxian_left; - var right=player.storage.nshuanxian_right; - var list=[]; - var choice=0; - var hpleft=0; - var maxleft=0; - if(left&&player.hasSkill(left)){ - if(player.storage[left].hp1){ + ("step 3"); + if (event.num > 1) { event.num--; event.goto(1); } - } + }, }, - nsshoudao:{ - group:['nsshoudao_gain','nsshoudao_die'], - subSkill:{ - gain:{ - trigger:{player:'subPlayerDie'}, - forced:true, - filter(event,player){ - var left=player.storage.nshuanxian_left; - if(left&&player.hasSkill(left)) return false; - var right=player.storage.nshuanxian_right; - if(right&&player.hasSkill(right)) return false; - if(!player.storage.nshuanxian_damage) return false; + nsshoudao: { + group: ["nsshoudao_gain", "nsshoudao_die"], + subSkill: { + gain: { + trigger: { player: "subPlayerDie" }, + forced: true, + filter(event, player) { + var left = player.storage.nshuanxian_left; + if (left && player.hasSkill(left)) return false; + var right = player.storage.nshuanxian_right; + if (right && player.hasSkill(right)) return false; + if (!player.storage.nshuanxian_damage) return false; return true; }, - content(){ - player.addSkill('releiji'); - player.addSkill('guidao'); - } + content() { + player.addSkill("releiji"); + player.addSkill("guidao"); + }, }, - die:{ - trigger:{player:'dieBegin'}, - direct:true, - filter(event,player){ - if(game.countPlayer()<=2) return false; - var left=player.storage.nshuanxian_left; - if(left&&player.hasSkill(left)) return true; - var right=player.storage.nshuanxian_right; - if(right&&player.hasSkill(right)) return true; + die: { + trigger: { player: "dieBegin" }, + direct: true, + filter(event, player) { + if (game.countPlayer() <= 2) return false; + var left = player.storage.nshuanxian_left; + if (left && player.hasSkill(left)) return true; + var right = player.storage.nshuanxian_right; + if (right && player.hasSkill(right)) return true; return false; }, - content(){ - 'step 0' + content() { + "step 0"; var str; - var left=player.storage.nshuanxian_left; - var right=player.storage.nshuanxian_right; - if(left&&player.hasSkill(left)&&right&&player.hasSkill(right)){ - str='令一名其他角色获得技能【雷击】和【鬼道】'; + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (left && player.hasSkill(left) && right && player.hasSkill(right)) { + str = "令一名其他角色获得技能【雷击】和【鬼道】"; + } else { + str = "令一名其他角色获得技能【雷击】或【鬼道】"; } - else{ - str='令一名其他角色获得技能【雷击】或【鬼道】'; + if (trigger.source) { + str += "(" + get.translation(trigger.source) + "除外)"; } - if(trigger.source){ - str+='('+get.translation(trigger.source)+'除外)'; - } - player.chooseTarget(function(card,player,target){ - return target!=player&&target!=_status.event.source; - },get.prompt('nsshoudao')).set('ai',function(target){ - if(target.hasSkill('releiji')) return 0; - return get.attitude(_status.event.player,target); - }).set('source',trigger.source).set('prompt2',str); - 'step 1' - var goon=false; - if(result.bool){ - var target=result.targets[0]; - player.logSkill('nsshoudao',target); - var left=player.storage.nshuanxian_left; - var right=player.storage.nshuanxian_right; - if(left&&player.hasSkill(left)&&right&&player.hasSkill(right)){ - target.addSkillLog('releiji'); - target.addSkillLog('guidao'); - } - else{ - event.target=target; - player.chooseControl('releiji','guidao').set('prompt','令'+get.translation(target)+'获得一项技能'); - goon=true; + player + .chooseTarget(function (card, player, target) { + return target != player && target != _status.event.source; + }, get.prompt("nsshoudao")) + .set("ai", function (target) { + if (target.hasSkill("releiji")) return 0; + return get.attitude(_status.event.player, target); + }) + .set("source", trigger.source) + .set("prompt2", str); + ("step 1"); + var goon = false; + if (result.bool) { + var target = result.targets[0]; + player.logSkill("nsshoudao", target); + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (left && player.hasSkill(left) && right && player.hasSkill(right)) { + target.addSkillLog("releiji"); + target.addSkillLog("guidao"); + } else { + event.target = target; + player + .chooseControl("releiji", "guidao") + .set("prompt", "令" + get.translation(target) + "获得一项技能"); + goon = true; } } - if(!goon){ + if (!goon) { event.finish(); } - 'step 2' + ("step 2"); event.target.addSkillLog(result.control); - } - } - } + }, + }, + }, }, - nshuanxian:{ - trigger:{global:'gameStart',player:'enterGame'}, - forced:true, - nosub:true, - unique:true, - group:['nshuanxian_left','nshuanxian_right','nshuanxian_damage','nshuanxian_swap','nshuanxian_draw'], - content(){ - player.storage.nshuanxian_right=player.addSubPlayer({ - name:'ns_nanhua_right', - skills:['nshuanxian_left','nshuanxian_draw','nshuanxian_swap'], - hp:2, - maxHp:2, - hs:get.cards(2), - skill:'nshuanxian', - intro:'你的本体回合结束后,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的下家的准备阶段,切换至此随从', - intro2:'当前回合结束后切换回本体', - onremove(player){ + nshuanxian: { + trigger: { global: "gameStart", player: "enterGame" }, + forced: true, + nosub: true, + unique: true, + group: [ + "nshuanxian_left", + "nshuanxian_right", + "nshuanxian_damage", + "nshuanxian_swap", + "nshuanxian_draw", + ], + content() { + player.storage.nshuanxian_right = player.addSubPlayer({ + name: "ns_nanhua_right", + skills: ["nshuanxian_left", "nshuanxian_draw", "nshuanxian_swap"], + hp: 2, + maxHp: 2, + hs: get.cards(2), + skill: "nshuanxian", + intro: "你的本体回合结束后,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的下家的准备阶段,切换至此随从", + intro2: "当前回合结束后切换回本体", + onremove(player) { delete player.storage.nshuanxian_right; - } + }, }); }, - ai:{ - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(!target.hasFriend()) return; - if(target.hp<=2) return; - if(!target.storage.nshuanxian_damage){ - if(get.attitude(player,target)<0||get.tag(card,'multineg')) return [0,1]; - return [1,1]; + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (!target.hasFriend()) return; + if (target.hp <= 2) return; + if (!target.storage.nshuanxian_damage) { + if (get.attitude(player, target) < 0 || get.tag(card, "multineg")) + return [0, 1]; + return [1, 1]; } } - } - } + }, + }, }, // mod:{ // globalFrom(from,to,distance){ @@ -15775,3238 +18712,3656 @@ game.import('character', function () { // } // }, // global:'nshuanxian_choose', - subSkill:{ - chosen:{}, - leftdist:{ - mod:{ - globalFrom(from,to,distance){ - }, - globalTo(from,to,distance){ - } - } - }, - rightdist:{ - mod:{ - globalFrom(from,to,distance){ - }, - globalTo(from,to,distance){ - } - } - }, - swap:{ - trigger:{global:'phaseBegin'}, - forced:true, - popup:false, - filter(event,player){ - return event.player!=player; + subSkill: { + chosen: {}, + leftdist: { + mod: { + globalFrom(from, to, distance) {}, + globalTo(from, to, distance) {}, }, - priority:20, - content(){ - var next=player.getNext(); - var prev=player.getPrevious(); - var left=player.storage.nshuanxian_left; - var right=player.storage.nshuanxian_right; - if(prev==next||(trigger.player!=next&&trigger.player!=prev)){ - if(player.hasSkill('subplayer')){ + }, + rightdist: { + mod: { + globalFrom(from, to, distance) {}, + globalTo(from, to, distance) {}, + }, + }, + swap: { + trigger: { global: "phaseBegin" }, + forced: true, + popup: false, + filter(event, player) { + return event.player != player; + }, + priority: 20, + content() { + var next = player.getNext(); + var prev = player.getPrevious(); + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (prev == next || (trigger.player != next && trigger.player != prev)) { + if (player.hasSkill("subplayer")) { player.exitSubPlayer(); } - } - else if(prev==trigger.player&&player.name!=left&&left){ - if(!player.hasSkill('subplayer')){ + } else if (prev == trigger.player && player.name != left && left) { + if (!player.hasSkill("subplayer")) { player.callSubPlayer(left); - } - else{ + } else { player.toggleSubPlayer(left); } - } - else if(next==trigger.player&&player.name!=right&&right){ - if(!player.hasSkill('subplayer')){ + } else if (next == trigger.player && player.name != right && right) { + if (!player.hasSkill("subplayer")) { player.callSubPlayer(right); - } - else{ + } else { player.toggleSubPlayer(right); } } - } + }, }, - damage:{ - trigger:{player:'damageEnd'}, - forced:true, - filter(event,player){ + damage: { + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { return !player.storage.nshuanxian_damage; }, - content(){ - player.storage.nshuanxian_damage=true; - player.storage.nshuanxian_left=player.addSubPlayer({ - name:'ns_nanhua_left', - skills:['nshuanxian_middle','nshuanxian_draw','nshuanxian_swap'], - hp:2, - maxHp:2, - hs:get.cards(2), - skill:'nshuanxian', - intro:'你的本体回合开始前,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的上家的准备阶段,切换至此随从', - intro2:'当前回合结束后切换回本体', - onremove(player){ + content() { + player.storage.nshuanxian_damage = true; + player.storage.nshuanxian_left = player.addSubPlayer({ + name: "ns_nanhua_left", + skills: ["nshuanxian_middle", "nshuanxian_draw", "nshuanxian_swap"], + hp: 2, + maxHp: 2, + hs: get.cards(2), + skill: "nshuanxian", + intro: "你的本体回合开始前,切换至此随从并进行一个额外的回合;若你的上家与下家不同,在你的上家的准备阶段,切换至此随从", + intro2: "当前回合结束后切换回本体", + onremove(player) { delete player.storage.nshuanxian_left; - } + }, }); - trigger.nshuanxian=true; - } - }, - draw:{ - trigger:{player:'phaseDrawBegin'}, - silent:true, - filter(event){ - return event.num>0; + trigger.nshuanxian = true; }, - content(){ - trigger.num--; - } }, - left:{ - trigger:{player:'phaseBefore'}, - forced:true, - popup:false, - priority:40, - filter(event,player){ - if(event.skill=='nshuanxian_middle') return false; - if(event.skill=='nshuanxian_right') return false; - var left=player.storage.nshuanxian_left; - if(player.hasSkill('subplayer')){ - if(!left) return player.name==player.storage.nshuanxian_right; + draw: { + trigger: { player: "phaseDrawBegin" }, + silent: true, + filter(event) { + return event.num > 0; + }, + content() { + trigger.num--; + }, + }, + left: { + trigger: { player: "phaseBefore" }, + forced: true, + popup: false, + priority: 40, + filter(event, player) { + if (event.skill == "nshuanxian_middle") return false; + if (event.skill == "nshuanxian_right") return false; + var left = player.storage.nshuanxian_left; + if (player.hasSkill("subplayer")) { + if (!left) return player.name == player.storage.nshuanxian_right; return player.storage.subplayer.skills.includes(left); - } - else{ - if(!left) return false; + } else { + if (!left) return false; return player.hasSkill(left); } }, - content(){ - if(player.hasSkill('subplayer')){ - var left=player.storage.nshuanxian_left; - if(left&&player.storage.subplayer.skills.includes(left)){ + content() { + if (player.hasSkill("subplayer")) { + var left = player.storage.nshuanxian_left; + if (left && player.storage.subplayer.skills.includes(left)) { player.toggleSubPlayer(player.storage.nshuanxian_left); - } - else{ + } else { player.exitSubPlayer(); } - } - else{ + } else { player.callSubPlayer(player.storage.nshuanxian_left); } - } + }, }, - middle:{ - trigger:{player:['phaseAfter','phaseCancelled']}, - forced:true, - popup:false, - priority:-40, - filter(event,player){ - if(player.hasSkill('nshuanxian_chosen')) return false; + middle: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + priority: -40, + filter(event, player) { + if (player.hasSkill("nshuanxian_chosen")) return false; return true; }, - content(){ + content() { player.exitSubPlayer(); - player.insertPhase(null,true); - } + player.insertPhase(null, true); + }, }, - right:{ - trigger:{player:['phaseAfter','phaseCancelled']}, - forced:true, - popup:false, - priority:-40, - filter(event,player){ - if(player.hasSkill('nshuanxian_chosen')) return false; - if(player.hasSkill('subplayer')) return false; - var right=player.storage.nshuanxian_right; - if(!right) return false; + right: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + priority: -40, + filter(event, player) { + if (player.hasSkill("nshuanxian_chosen")) return false; + if (player.hasSkill("subplayer")) return false; + var right = player.storage.nshuanxian_right; + if (!right) return false; return player.hasSkill(right); }, - content(){ + content() { player.callSubPlayer(player.storage.nshuanxian_right); - player.insertPhase(null,true); - player.addTempSkill('nshuanxian_chosen',['phaseBegin','phaseCancelled']); - } + player.insertPhase(null, true); + player.addTempSkill("nshuanxian_chosen", ["phaseBegin", "phaseCancelled"]); + }, }, - end:{ - trigger:{player:['phaseAfter','phaseCancelled']}, - forced:true, - popup:false, - priority:-40, - filter(event,player){ - if(player.hasSkill('nshuanxian_chosen')) return false; + end: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + priority: -40, + filter(event, player) { + if (player.hasSkill("nshuanxian_chosen")) return false; return true; }, - content(){ - if(player.hasSkill('subplayer')){ + content() { + if (player.hasSkill("subplayer")) { player.exitSubPlayer(); } }, - content_old(){ - 'step 0' - var controls=['本体']; - var left=player.storage.nshuanxian_left; - var right=player.storage.nshuanxian_right; - if(player.hasSkill('subplayer')){ - if(player.storage.subplayer.skills.includes(left)){ - controls.unshift('幻身·左'); + content_old() { + "step 0"; + var controls = ["本体"]; + var left = player.storage.nshuanxian_left; + var right = player.storage.nshuanxian_right; + if (player.hasSkill("subplayer")) { + if (player.storage.subplayer.skills.includes(left)) { + controls.unshift("幻身·左"); } - if(player.storage.subplayer.skills.includes(right)){ - controls.push('幻身·右'); + if (player.storage.subplayer.skills.includes(right)) { + controls.push("幻身·右"); + } + } else { + if (player.hasSkill(left)) { + controls.unshift("幻身·左"); + } + if (player.hasSkill(right)) { + controls.push("幻身·右"); } } - else{ - if(player.hasSkill(left)){ - controls.unshift('幻身·左'); - } - if(player.hasSkill(right)){ - controls.push('幻身·右'); - } - } - if(controls.length>1){ - player.chooseControl(controls,function(event,player){ - return Math.floor(Math.random()*_status.event.num); - }).set('prompt','选择一个形态直到下一回合开始').set('num',controls.length); - } - else{ + if (controls.length > 1) { + player + .chooseControl(controls, function (event, player) { + return Math.floor(Math.random() * _status.event.num); + }) + .set("prompt", "选择一个形态直到下一回合开始") + .set("num", controls.length); + } else { event.finish(); } - 'step 1' - switch(result.control){ - case '幻身·左':{ - if(!player.hasSkill('subplayer')){ + ("step 1"); + switch (result.control) { + case "幻身·左": { + if (!player.hasSkill("subplayer")) { player.callSubPlayer(player.storage.nshuanxian_left); - } - else{ + } else { player.toggleSubPlayer(player.storage.nshuanxian_left); } break; } - case '幻身·右':{ - if(!player.hasSkill('subplayer')){ + case "幻身·右": { + if (!player.hasSkill("subplayer")) { player.callSubPlayer(player.storage.nshuanxian_right); } break; } - default:{ - if(player.hasSkill('subplayer')){ + default: { + if (player.hasSkill("subplayer")) { player.exitSubPlayer(); } break; } } - player.addTempSkill('nshuanxian_chosen','phaseBegin'); - } - } - } - }, - nsnongquan:{ - enable:'phaseUse', - // usable:4, - filter(event,player){ - return player.countCards('h')==1&&player.canUse('wuzhong',player); - }, - direct:true, - delay:0, - content(){ - player.useCard({name:'wuzhong'},player.getCards('h'),player,'nsnongquan'); - }, - ai:{ - order:10, - result:{ - player(player,target){ - return 10-get.value(player.getCards('h')[0]); - } - } - } - }, - nsdufu:{ - trigger:{source:'damageBefore'}, - check(event,player){ - return event.player.hasSkillTag('maixie'); - }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('nsdufu'),function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - if(_status.event.bool){ - return -get.attitude(_status.event.player,target); - } - return 0; - }).set('bool',trigger.player.hasSkillTag('maixie_defend')); - 'step 1' - if(result.bool){ - player.logSkill('nsdufu',result.targets); - trigger.source=result.targets[0]; - } - } - }, - yiesheng:{ - enable:'phaseUse', - filterCard:{color:'black'}, - filter(event,player){ - return player.countCards('h',{color:'black'})>0; - }, - selectCard:[1,Infinity], - prompt:'弃置任意张黑色手牌并摸等量的牌', - check(card){return 5-get.value(card)}, - content(){ - player.draw(cards.length); - }, - ai:{ - order:1, - result:{ - player:1 + player.addTempSkill("nshuanxian_chosen", "phaseBegin"); + }, }, }, }, - liangji:{ - audio:["liangji",2], - enable:"phaseUse", - usable:1, - filterTarget (card,player,target){ - return target!=player&&!target.hasSkill('liangji_1'); + nsnongquan: { + enable: "phaseUse", + // usable:4, + filter(event, player) { + return player.countCards("h") == 1 && player.canUse("wuzhong", player); }, - content (){ - 'step 0' - player.chooseCard('h','环计:将一张牌置于'+get.translation(target)+'的武将牌上',true).set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.getParent().player)>0){ - return 7-get.value(card); - } - return -get.value(card); - }); - 'step 1' - if(result.bool){ - player.$give(result.cards,target); - player.lose(result.cards,ui.special); - target.storage.liangji_1=result.cards; - target.storage.liangji_1_source=target; - target.syncStorage('liangji_1'); - target.addSkill('liangji_1'); + direct: true, + delay: 0, + content() { + player.useCard({ name: "wuzhong" }, player.getCards("h"), player, "nsnongquan"); + }, + ai: { + order: 10, + result: { + player(player, target) { + return 10 - get.value(player.getCards("h")[0]); + }, + }, + }, + }, + nsdufu: { + trigger: { source: "damageBefore" }, + check(event, player) { + return event.player.hasSkillTag("maixie"); + }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("nsdufu"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + if (_status.event.bool) { + return -get.attitude(_status.event.player, target); + } + return 0; + }) + .set("bool", trigger.player.hasSkillTag("maixie_defend")); + ("step 1"); + if (result.bool) { + player.logSkill("nsdufu", result.targets); + trigger.source = result.targets[0]; } }, - ai:{ - order:1, - result:{ - target (player,target){ - if(get.attitude(player,target)>0){ - return Math.sqrt(target.countCards('he')); + }, + yiesheng: { + enable: "phaseUse", + filterCard: { color: "black" }, + filter(event, player) { + return player.countCards("h", { color: "black" }) > 0; + }, + selectCard: [1, Infinity], + prompt: "弃置任意张黑色手牌并摸等量的牌", + check(card) { + return 5 - get.value(card); + }, + content() { + player.draw(cards.length); + }, + ai: { + order: 1, + result: { + player: 1, + }, + }, + }, + liangji: { + audio: ["liangji", 2], + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && !target.hasSkill("liangji_1"); + }, + content() { + "step 0"; + player + .chooseCard("h", "环计:将一张牌置于" + get.translation(target) + "的武将牌上", true) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + return 7 - get.value(card); + } + return -get.value(card); + }); + ("step 1"); + if (result.bool) { + player.$give(result.cards, target); + player.lose(result.cards, ui.special); + target.storage.liangji_1 = result.cards; + target.storage.liangji_1_source = target; + target.syncStorage("liangji_1"); + target.addSkill("liangji_1"); + } + }, + ai: { + order: 1, + result: { + target(player, target) { + if (get.attitude(player, target) > 0) { + return Math.sqrt(target.countCards("he")); } return 0; }, - player:1, + player: 1, }, }, - subSkill:{ - "1":{ - trigger:{ - player:"phaseDrawBegin", + subSkill: { + 1: { + trigger: { + player: "phaseDrawBegin", }, - forced:true, - mark:true, - intro:{ - content:"cards", + forced: true, + mark: true, + intro: { + content: "cards", }, - content (){ - 'step 0' - var cards=player.storage.liangji_1; - if(cards){ - player.gain(cards,'gain2'); + content() { + "step 0"; + var cards = player.storage.liangji_1; + if (cards) { + player.gain(cards, "gain2"); } - player.storage.liangji_1=0; - 'step 1' - if(player.sex=='male')player.addTempSkill('wushuang'); - if(player.sex=='female')player.addTempSkill('lijian'); - player.removeSkill('liangji_1'); + player.storage.liangji_1 = 0; + ("step 1"); + if (player.sex == "male") player.addTempSkill("wushuang"); + if (player.sex == "female") player.addTempSkill("lijian"); + player.removeSkill("liangji_1"); }, - sub:true, + sub: true, }, }, }, - jugong:{ - audio:["jingong",2], - trigger:{ - global:"damageEnd", + jugong: { + audio: ["jingong", 2], + trigger: { + global: "damageEnd", }, - usable:1, - frequent:true, - locked:false, - notemp:true, - marktext:"功", - init (player){ - player.storage.jugong=[]; + usable: 1, + frequent: true, + locked: false, + notemp: true, + marktext: "功", + init(player) { + player.storage.jugong = []; }, - filter (event,player){ - return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.notLink() - &&_status.currentPhase!=player; + filter(event, player) { + return ( + event.card && + (event.card.name == "sha" || event.card.name == "juedou") && + event.notLink() && + _status.currentPhase != player + ); }, - content (){ - "step 0" + content() { + "step 0"; player.draw(); - "step 1" - if(player.countCards('h')){ - player.chooseCard('将'+get.cnNumber(1)+'张手牌置于武将牌上作为“功”',1,true); - } - else{ + ("step 1"); + if (player.countCards("h")) { + player.chooseCard("将" + get.cnNumber(1) + "张手牌置于武将牌上作为“功”", 1, true); + } else { event.finish(); } - "step 2" - if(result.cards&&result.cards.length){ - player.lose(result.cards,ui.special); - player.storage.jugong=player.storage.jugong.concat(result.cards); - player.syncStorage('jugong'); - player.markSkill('jugong'); - game.log(player,'将',result.cards,'置于武将牌上作为“功”'); + ("step 2"); + if (result.cards && result.cards.length) { + player.lose(result.cards, ui.special); + player.storage.jugong = player.storage.jugong.concat(result.cards); + player.syncStorage("jugong"); + player.markSkill("jugong"); + game.log(player, "将", result.cards, "置于武将牌上作为“功”"); } }, - intro:{ - content:"cards", + intro: { + content: "cards", }, - group:"jugong_1", - subSkill:{ - "1":{ - trigger:{ - player:"damageBegin", + group: "jugong_1", + subSkill: { + 1: { + trigger: { + player: "damageBegin", }, - filter (event,player){ - return player.storage.jugong.length>1; + filter(event, player) { + return player.storage.jugong.length > 1; }, - content (){ - "step 0" - player.chooseCardButton('移去两张“功”',2,player.storage.jugong,true); - "step 1" - if(event.directresult||result.bool){ - player.logSkill('jugong'); - var links=event.directresult||result.links; - for(var i=0;i=4) return [0.5,get.tag(card,'damage')*2]; - if(!target.hasSkill('paiyi')&&target.hp>1) return [0.5,get.tag(card,'damage')*1.5]; - if(target.hp==3) return [0.5,get.tag(card,'damage')*0.2]; - if(target.hp==2) return [0.1,get.tag(card,'damage')*0.1]; + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("paiyi") && target.hp > 1) + return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 0.2]; + if (target.hp == 2) return [0.1, get.tag(card, "damage") * 0.1]; } }, }, }, }, - chengmou:{ - audio:["moucheng",2], - trigger:{ - player:"phaseDrawBegin", + chengmou: { + audio: ["moucheng", 2], + trigger: { + player: "phaseDrawBegin", }, - frequent:true, - filter (event,player){ - return player.storage.jugong.length>0; + frequent: true, + filter(event, player) { + return player.storage.jugong.length > 0; }, - content (){ - 'step 0' - if(player.storage.jugong.length>2) player.loseHp(); - 'step 1' - var cards=player.storage.jugong; - if(cards){ - player.gain(cards,'gain2'); + content() { + "step 0"; + if (player.storage.jugong.length > 2) player.loseHp(); + ("step 1"); + var cards = player.storage.jugong; + if (cards) { + player.gain(cards, "gain2"); } - player.storage.jugong=[]; - 'step 2' + player.storage.jugong = []; + ("step 2"); trigger.cancel(); }, }, - nsxinsheng:{ - trigger:{source:'damageEnd'}, - frequent:true, - filter(event,player){ + nsxinsheng: { + trigger: { source: "damageEnd" }, + frequent: true, + filter(event, player) { return player.isHealthy(); }, - content(){ - player.gainMaxHp(trigger.num,true); + content() { + player.gainMaxHp(trigger.num, true); player.draw(trigger.num); - } + }, }, - nsdunxing:{ - trigger:{player:'damageBefore'}, - filter(event,player){ + nsdunxing: { + trigger: { player: "damageBefore" }, + filter(event, player) { return player.isDamaged(); }, - content(){ + content() { trigger.cancel(); - player.loseMaxHp(trigger.num,true); + player.loseMaxHp(trigger.num, true); player.draw(trigger.num); - } + }, }, - liangce:{ - enable:'phaseUse', - viewAs:{name:'wugu'}, - usable:1, - filterCard:{type:'basic'}, - position:'hs', - filter(event,player){ - return player.countCards('hs',{type:'basic'})>0; + liangce: { + enable: "phaseUse", + viewAs: { name: "wugu" }, + usable: 1, + filterCard: { type: "basic" }, + position: "hs", + filter(event, player) { + return player.countCards("hs", { type: "basic" }) > 0; }, - check(card){ - return 6-get.value(card); + check(card) { + return 6 - get.value(card); }, - group:'liangce2' + group: "liangce2", }, - liangce2:{ - trigger:{global:'wuguRemained'}, - direct:true, - filter(event){ - return event.remained.filterInD().length>0; + liangce2: { + trigger: { global: "wuguRemained" }, + direct: true, + filter(event) { + return event.remained.filterInD().length > 0; }, - content(){ - 'step 0' - var du=0; - for(var i=0;i=trigger.remained.length/2) return -att; + var dialog = ui.create.dialog(get.prompt("liangce"), trigger.remained, "hidden"); + dialog.classList.add("noselect"); + player.chooseTarget(dialog).set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var att = get.attitude(player, target); + if (du >= trigger.remained.length / 2) return -att; return att; }); - 'step 1' - if(result.bool){ - player.logSkill('liangce',result.targets); - result.targets[0].gain(trigger.remained.slice(0),'gain2','log'); - trigger.remained.length=0; + ("step 1"); + if (result.bool) { + player.logSkill("liangce", result.targets); + result.targets[0].gain(trigger.remained.slice(0), "gain2", "log"); + trigger.remained.length = 0; } - } + }, }, - jianbi:{ - trigger:{target:'useCardToTargeted'}, - priority:5, - filter(event,player){ - if(get.type(event.card)!='trick') return false; - if(get.info(event.card).multitarget) return false; - if(event.targets.length<2) return false; + jianbi: { + trigger: { target: "useCardToTargeted" }, + priority: 5, + filter(event, player) { + if (get.type(event.card) != "trick") return false; + if (get.info(event.card).multitarget) return false; + if (event.targets.length < 2) return false; return true; }, - direct:true, - content(){ - "step 0" - player.chooseTarget(get.prompt('jianbi'), - [1,1],function(card,player,target){ - return _status.event.getTrigger().targets.includes(target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var eff=-get.effect(target,trigger.card,trigger.player,_status.event.player); - if(trigger.card.name=='wugu'&&eff==0&&get.attitude(player,target)<0){ - return 0.01; - } - return eff; - }); - "step 1" - if(result.bool){ - event.targets=result.targets; - if(event.isMine()){ - player.logSkill('jianbi',event.targets); + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt("jianbi"), [1, 1], function (card, player, target) { + return _status.event.getTrigger().targets.includes(target); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var eff = -get.effect(target, trigger.card, trigger.player, _status.event.player); + if (trigger.card.name == "wugu" && eff == 0 && get.attitude(player, target) < 0) { + return 0.01; + } + return eff; + }); + ("step 1"); + if (result.bool) { + event.targets = result.targets; + if (event.isMine()) { + player.logSkill("jianbi", event.targets); event.finish(); } - for(var i=0;iplayer.hasCard(card=>lib.skill.diyjuntun.filterCard(card,player),'he'), - position:'he', - filterCard:(card,player)=>get.type(card)=='equip'&&player.canRecast(card), - check(card){ - var player=_status.event.player; - var he=player.getCards('he'); - var subtype=get.subtype(card); - var value=get.equipValue(card); - for(var i=0;i=value){ + diyjuntun: { + enable: "phaseUse", + filter: (event, player) => + player.hasCard((card) => lib.skill.diyjuntun.filterCard(card, player), "he"), + position: "he", + filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), + check(card) { + var player = _status.event.player; + var he = player.getCards("he"); + var subtype = get.subtype(card); + var value = get.equipValue(card); + for (var i = 0; i < he.length; i++) { + if ( + he[i] != card && + get.subtype(he[i]) == subtype && + get.equipValue(he[i]) >= value + ) { return 10; } } - if(!player.needsToDiscard()){ - return 4-get.equipValue(card); + if (!player.needsToDiscard()) { + return 4 - get.equipValue(card); } return 0; }, - content(){ + content() { player.recast(cards); }, - discard:false, - lose:false, - delay:false, - prompt:'将一张装备牌置入弃牌堆并摸一张牌', - ai:{ - basic:{ - order:8.5 + discard: false, + lose: false, + delay: false, + prompt: "将一张装备牌置入弃牌堆并摸一张牌", + ai: { + basic: { + order: 8.5, }, - result:{ - player:1 - } - } + result: { + player: 1, + }, + }, }, - choudu:{ - enable:'phaseUse', - usable:1, - filterCard:true, - position:'he', - filterTarget(card,player,target){ - return lib.filter.cardEnabled({name:'diaobingqianjiang'},target); + choudu: { + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + filterTarget(card, player, target) { + return lib.filter.cardEnabled({ name: "diaobingqianjiang" }, target); }, - check(card){ - return 6-get.value(card); + check(card) { + return 6 - get.value(card); }, - content(){ - var list=game.filterPlayer(); + content() { + var list = game.filterPlayer(); list.sortBySeat(target); - target.useCard({name:'diaobingqianjiang'},list); + target.useCard({ name: "diaobingqianjiang" }, list); }, - ai:{ - order:1, - result:{ - player(player,target){ - if(get.attitude(player,target)<=1) return 0; - return game.countPlayer(function(current){ - return get.effect(current,{name:'diaobingqianjiang'},target,player); + ai: { + order: 1, + result: { + player(player, target) { + if (get.attitude(player, target) <= 1) return 0; + return game.countPlayer(function (current) { + return get.effect(current, { name: "diaobingqianjiang" }, target, player); }); - } - } - } + }, + }, + }, }, - liduan:{ - trigger:{global:'gainAfter'}, - filter(event,player){ - if(event.player==player) return false; - if(_status.currentPhase==event.player) return false; - if(event.cards.length!=1) return false; - return get.type(event.cards[0])=='equip'&&get.position(event.cards[0])=='h'&&event.player.hasUseTarget(event.cards[0]); + liduan: { + trigger: { global: "gainAfter" }, + filter(event, player) { + if (event.player == player) return false; + if (_status.currentPhase == event.player) return false; + if (event.cards.length != 1) return false; + return ( + get.type(event.cards[0]) == "equip" && + get.position(event.cards[0]) == "h" && + event.player.hasUseTarget(event.cards[0]) + ); }, - logTarget:'player', - check(event,player){ - var att=get.attitude(player,event.player); - var subtype=get.subtype(event.cards[0]); - if(att>0){ - if(event.player.countCards('h')>=player.countCards('h')+2) return true; - return event.player.countCards('e',{subtype:subtype})==0; - } - else{ - return event.player.countCards('e',{subtype:subtype})>0; + logTarget: "player", + check(event, player) { + var att = get.attitude(player, event.player); + var subtype = get.subtype(event.cards[0]); + if (att > 0) { + if (event.player.countCards("h") >= player.countCards("h") + 2) return true; + return ( + event.player.countCards("e", { + subtype: subtype, + }) == 0 + ); + } else { + return event.player.countCards("e", { subtype: subtype }) > 0; } }, - content(){ - 'step 0' - var bool=false; - var subtype=get.subtype(trigger.cards[0]); - var current=trigger.player.getEquip('e',parseInt(subtype[5])); - var att=get.attitude(trigger.player,player); - if(current){ - if(att>0){ - bool=true; - } - else{ - if(get.equipValue(current)>get.equipValue(trigger.cards[0])){ - bool=true; + content() { + "step 0"; + var bool = false; + var subtype = get.subtype(trigger.cards[0]); + var current = trigger.player.getEquip("e", parseInt(subtype[5])); + var att = get.attitude(trigger.player, player); + if (current) { + if (att > 0) { + bool = true; + } else { + if (get.equipValue(current) > get.equipValue(trigger.cards[0])) { + bool = true; } } } - trigger.player.chooseCard('立断').set('prompt2','将一张手牌交给'+get.translation(player)+',或取消并使用'+get.translation(trigger.cards)).ai=function(card){ - if(bool){ - if(att>0){ - return 8-get.value(card); + trigger.player + .chooseCard("立断") + .set( + "prompt2", + "将一张手牌交给" + + get.translation(player) + + ",或取消并使用" + + get.translation(trigger.cards) + ).ai = function (card) { + if (bool) { + if (att > 0) { + return 8 - get.value(card); + } else { + return 4 - get.value(card); } - else{ - return 4-get.value(card); - } - } - else{ - if(att<=0) return -get.value(card); + } else { + if (att <= 0) return -get.value(card); return 0; } + }; + ("step 1"); + if (result.bool) { + player.gain(result.cards, trigger.player); + trigger.player.$give(1, player); + } else { + trigger.player.chooseUseTarget(trigger.cards[0], true); } - 'step 1' - if(result.bool){ - player.gain(result.cards,trigger.player); - trigger.player.$give(1,player); - } - else{ - trigger.player.chooseUseTarget(trigger.cards[0],true); - } - } + }, }, - jinyan:{ - mod:{ - cardEnabled(card,player){ - if(_status.event.skill!='jinyan'&&player.hp<=2&&get.type(card,'trick')=='trick'&&get.color(card)=='black') return false; + jinyan: { + mod: { + cardEnabled(card, player) { + if ( + _status.event.skill != "jinyan" && + player.hp <= 2 && + get.type(card, "trick") == "trick" && + get.color(card) == "black" + ) + return false; }, - cardUsable(card,player){ - if(_status.event.skill!='jinyan'&&player.hp<=2&&get.type(card,'trick')=='trick'&&get.color(card)=='black') return false; + cardUsable(card, player) { + if ( + _status.event.skill != "jinyan" && + player.hp <= 2 && + get.type(card, "trick") == "trick" && + get.color(card) == "black" + ) + return false; }, - cardRespondable(card,player){ - if(_status.event.skill!='jinyan'&&player.hp<=2&&get.type(card,'trick')=='trick'&&get.color(card)=='black') return false; + cardRespondable(card, player) { + if ( + _status.event.skill != "jinyan" && + player.hp <= 2 && + get.type(card, "trick") == "trick" && + get.color(card) == "black" + ) + return false; }, - cardSavable(card,player){ - if(_status.event.skill!='jinyan'&&player.hp<=2&&get.type(card,'trick')=='trick'&&get.color(card)=='black') return false; + cardSavable(card, player) { + if ( + _status.event.skill != "jinyan" && + player.hp <= 2 && + get.type(card, "trick") == "trick" && + get.color(card) == "black" + ) + return false; }, }, - enable:['chooseToUse','chooseToRespond'], - filterCard(card){ - return get.type(card,'trick')=='trick'&&get.color(card)=='black'; + enable: ["chooseToUse", "chooseToRespond"], + filterCard(card) { + return get.type(card, "trick") == "trick" && get.color(card) == "black"; }, - viewAsFilter(player){ - if(player.hp>2) return false; - if(!player.hasCard(function(card){ - return get.type(card,'trick')=='trick'&&get.color(card)=='black'; - })) return false; + viewAsFilter(player) { + if (player.hp > 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card, "trick") == "trick" && get.color(card) == "black"; + }) + ) + return false; + }, + viewAs: { name: "sha" }, + prompt: "将一张黑色锦囊牌当作杀使用或打出", + check() { + return 1; + }, + ai: { + respondSha: true, + skillTagFilter(player) { + if (player.hp > 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card, "trick") == "trick" && get.color(card) == "black"; + }) + ) + return false; + }, }, - viewAs:{name:'sha'}, - prompt:'将一张黑色锦囊牌当作杀使用或打出', - check(){return 1}, - ai:{ - respondSha:true, - skillTagFilter(player){ - if(player.hp>2) return false; - if(!player.hasCard(function(card){ - return get.type(card,'trick')=='trick'&&get.color(card)=='black'; - })) return false; - } - } }, - fuchou:{ - trigger:{target:'shaBefore'}, - filter(event,player){ - return player.countCards('he')>0; + fuchou: { + trigger: { target: "shaBefore" }, + filter(event, player) { + return player.countCards("he") > 0; }, - direct:true, - content(){ - 'step 0' - var bool=false; - if(!player.hasShan()&&get.effect(player,trigger.card,trigger.player,player)<0){ - bool=true; + direct: true, + content() { + "step 0"; + var bool = false; + if (!player.hasShan() && get.effect(player, trigger.card, trigger.player, player) < 0) { + bool = true; } - player.chooseCard('he',get.prompt('fuchou',trigger.player)).set('ai',function(card){ - var player=_status.event.player; - if(bool){ - if(player.hp<=1){ - if(get.tag(card,'save')) return 0; - return 8-get.value(card); + player.chooseCard("he", get.prompt("fuchou", trigger.player)).set("ai", function (card) { + var player = _status.event.player; + if (bool) { + if (player.hp <= 1) { + if (get.tag(card, "save")) return 0; + return 8 - get.value(card); } - return 6-get.value(card); + return 6 - get.value(card); } return -get.value(card); }); - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { trigger.cancel(); - player.logSkill('fuchou',trigger.player); - trigger.player.gain(result.cards,player); - if(get.position(result.cards[0])=='h'){ - player.$give(1,trigger.player); - } - else{ - player.$give(result.cards,trigger.player); + player.logSkill("fuchou", trigger.player); + trigger.player.gain(result.cards, player); + if (get.position(result.cards[0]) == "h") { + player.$give(1, trigger.player); + } else { + player.$give(result.cards, trigger.player); } player.storage.fuchou2.add(trigger.player); } }, - group:'fuchou2' + group: "fuchou2", }, - fuchou2:{ - init(player){ - player.storage.fuchou2=[]; + fuchou2: { + init(player) { + player.storage.fuchou2 = []; }, - forced:true, - trigger:{global:'phaseAfter'}, - filter(event,player){ - for(var i=0;i0); - var next=player.chooseToDiscard('he',{type:'equip'},get.prompt('youzhan',trigger.target)); - next.ai=function(card){ - if(bool){ - return 7-get.value(card); + }, + chezhen: { + mod: { + globalFrom(from, to, distance) { + if (from.countCards("e")) return distance - 1; + }, + globalTo(from, to, distance) { + if (!to.countCards("e")) return distance + 1; + }, + }, + }, + youzhan: { + trigger: { global: "shaBefore" }, + direct: true, + filter(event, player) { + return ( + get.distance(player, event.target) <= 1 && player.countCards("he", { type: "equip" }) + ); + }, + content() { + "step 0"; + var bool = + get.attitude(player, trigger.player) < 0 && get.attitude(player, trigger.target) > 0; + var next = player.chooseToDiscard( + "he", + { type: "equip" }, + get.prompt("youzhan", trigger.target) + ); + next.ai = function (card) { + if (bool) { + return 7 - get.value(card); } return 0; }; - next.logSkill=['youzhan',trigger.target]; - 'step 1' - if(result.bool){ - event.youdiinfo={ - source:trigger.player, - evt:trigger - } - trigger.target.useCard({name:'youdishenru'}); + next.logSkill = ["youzhan", trigger.target]; + ("step 1"); + if (result.bool) { + event.youdiinfo = { + source: trigger.player, + evt: trigger, + }; + trigger.target.useCard({ name: "youdishenru" }); } - } - }, - kangyin:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('he')>0; }, - content(){ - 'step 0' + }, + kangyin: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("he") > 0; + }, + content() { + "step 0"; player.loseHp(); - 'step 1' - player.discardPlayerCard(target,true); - 'step 2' - if(player.isDamaged()&&result.links&&result.links.length){ - if(get.type(result.links[0])=='basic'){ - player.chooseTarget([1,player.maxHp-player.hp], - '选择至多'+get.cnNumber(player.maxHp-player.hp)+'名角色各摸一张牌').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - } - else{ - player.storage.kangyin2=player.maxHp-player.hp; - player.addTempSkill('kangyin2'); + ("step 1"); + player.discardPlayerCard(target, true); + ("step 2"); + if (player.isDamaged() && result.links && result.links.length) { + if (get.type(result.links[0]) == "basic") { + player + .chooseTarget( + [1, player.maxHp - player.hp], + "选择至多" + get.cnNumber(player.maxHp - player.hp) + "名角色各摸一张牌" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + } else { + player.storage.kangyin2 = player.maxHp - player.hp; + player.addTempSkill("kangyin2"); event.finish(); } - } - else{ + } else { event.finish(); } - 'step 3' - if(result.targets&&result.targets.length){ + ("step 3"); + if (result.targets && result.targets.length) { result.targets.sort(lib.sort.seat); - player.line(result.targets,'green'); + player.line(result.targets, "green"); game.asyncDraw(result.targets); } }, - ai:{ - order:7, - result:{ - target(player,target){ - if(player.hp>=4) return -1; - if(player.hp==3&&!player.needsToDiscard()) return -1; + ai: { + order: 7, + result: { + target(player, target) { + if (player.hp >= 4) return -1; + if (player.hp == 3 && !player.needsToDiscard()) return -1; return 0; - } - } - } - }, - kangyin2:{ - mark:true, - intro:{ - content:'到其他角色的距离-#;使用【杀】的额外目标数上限+#' + }, + }, }, - onremove:true, - mod:{ - globalFrom(from,to,distance){ - return distance-from.storage.kangyin2; - }, - selectTarget(card,player,range){ - if(card.name=='sha'&&range[1]!=-1) range[1]+=player.storage.kangyin2; - }, - } }, - duoqi:{ - trigger:{global:'discardAfter'}, - filter(event,player){ - if(_status.currentPhase==player) return false; - if(!player.storage.zhucheng||!player.storage.zhucheng.length) return false; - var evt=event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse') return true; + kangyin2: { + mark: true, + intro: { + content: "到其他角色的距离-#;使用【杀】的额外目标数上限+#", + }, + onremove: true, + mod: { + globalFrom(from, to, distance) { + return distance - from.storage.kangyin2; + }, + selectTarget(card, player, range) { + if (card.name == "sha" && range[1] != -1) range[1] += player.storage.kangyin2; + }, + }, + }, + duoqi: { + trigger: { global: "discardAfter" }, + filter(event, player) { + if (_status.currentPhase == player) return false; + if (!player.storage.zhucheng || !player.storage.zhucheng.length) return false; + var evt = event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") return true; return false; }, - direct:true, - content(){ - 'step 0' - var bool=false; - if(get.attitude(player,trigger.player)<0&&trigger.player.needsToDiscard()){ - bool=true; + direct: true, + content() { + "step 0"; + var bool = false; + if (get.attitude(player, trigger.player) < 0 && trigger.player.needsToDiscard()) { + bool = true; } - player.chooseCardButton(get.prompt('zhucheng',_status.currentPhase),player.storage.zhucheng).set('ai',function(button){ - return _status.event.bool?1:0; - }).set('bool',bool); - 'step 1' - if(result.bool){ - player.logSkill('zhucheng',_status.currentPhase); + player + .chooseCardButton( + get.prompt("zhucheng", _status.currentPhase), + player.storage.zhucheng + ) + .set("ai", function (button) { + return _status.event.bool ? 1 : 0; + }) + .set("bool", bool); + ("step 1"); + if (result.bool) { + player.logSkill("zhucheng", _status.currentPhase); player.$throw(result.links[0]); player.storage.zhucheng.remove(result.links[0]); result.links[0].discard(); - player.syncStorage('zhucheng'); - if(player.storage.zhucheng.length==0){ - player.unmarkSkill('zhucheng'); - } - else{ + player.syncStorage("zhucheng"); + if (player.storage.zhucheng.length == 0) { + player.unmarkSkill("zhucheng"); + } else { player.updateMarks(); } - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + var evt = trigger.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } } }, - ai:{ - expose:0.2 - } - }, - zhucheng:{ - trigger:{player:'phaseEnd'}, - filter(event,player){ - return !player.storage.zhucheng||!player.storage.zhucheng.length; + ai: { + expose: 0.2, }, - check(event,player){ - if(player.storage.zhucheng&&player.storage.zhucheng.length){ - if(!player.hasShan()) return false; - if(player.storage.zhucheng.length>=2) return false; + }, + zhucheng: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return !player.storage.zhucheng || !player.storage.zhucheng.length; + }, + check(event, player) { + if (player.storage.zhucheng && player.storage.zhucheng.length) { + if (!player.hasShan()) return false; + if (player.storage.zhucheng.length >= 2) return false; } return true; }, - intro:{ - content:'cards' + intro: { + content: "cards", }, - content(){ - if(player.storage.zhucheng&&player.storage.zhucheng.length){ - player.gain(player.storage.zhucheng,'gain2'); + content() { + if (player.storage.zhucheng && player.storage.zhucheng.length) { + player.gain(player.storage.zhucheng, "gain2"); delete player.storage.zhucheng; - player.unmarkSkill('zhucheng'); - } - else{ - var cards=get.cards(Math.max(1,player.maxHp-player.hp)); + player.unmarkSkill("zhucheng"); + } else { + var cards = get.cards(Math.max(1, player.maxHp - player.hp)); player.$gain2(cards); - player.storage.zhucheng=cards; - player.markSkill('zhucheng'); + player.storage.zhucheng = cards; + player.markSkill("zhucheng"); } }, - ai:{ - target(card,player,target,current){ - if(card.name=='sha'&&player.storage.zhucheng&&player.storage.zhucheng.length){ - if(player.storage.zhucheng.length>=2){ - if(!player.hasFriend()&&player.countCards('he')-2= 2) { + if ( + !player.hasFriend() && + player.countCards("he") - 2 < player.storage.zhucheng.length + ) + return "zeroplayertarget"; return 0.1; - } - else{ - var he=player.getCards('he'); - var sha=false; - for(var i=0;i0; + filter(event, player) { + return player.storage.zhucheng && player.storage.zhucheng.length > 0; }, - content(){ - 'step 0' - var bool=false; - if(get.effect(player,trigger.card,trigger.player,trigger.player)>=0){ - bool=true; + content() { + "step 0"; + var bool = false; + if (get.effect(player, trigger.card, trigger.player, trigger.player) >= 0) { + bool = true; } - var num=player.storage.zhucheng.length; - trigger.player.chooseToDiscard('弃置'+get.cnNumber(num)+'张牌,或令杀无效','he',num).set('ai',function(card){ - if(_status.event.bool){ - return 10-get.value(card); - } - return 0; - }).set('bool',bool); - 'step 1' - if(!result.bool){ + var num = player.storage.zhucheng.length; + trigger.player + .chooseToDiscard("弃置" + get.cnNumber(num) + "张牌,或令杀无效", "he", num) + .set("ai", function (card) { + if (_status.event.bool) { + return 10 - get.value(card); + } + return 0; + }) + .set("bool", bool); + ("step 1"); + if (!result.bool) { trigger.cancel(); } - } - }, - diy_jiaoxia:{ - //audio:['jiaoxia',2], - trigger:{target:'useCardToBegin'}, - filter(event,player){ - return event.card&&get.color(event.card)=='red'; }, - frequent:true, - content(){ + }, + diy_jiaoxia: { + //audio:['jiaoxia',2], + trigger: { target: "useCardToBegin" }, + filter(event, player) { + return event.card && get.color(event.card) == "red"; + }, + frequent: true, + content() { player.draw(); }, - ai:{ - effect(card,player,target){ - if(get.color(card)=='red') return [1,1]; + ai: { + effect(card, player, target) { + if (get.color(card) == "red") return [1, 1]; }, - } - }, - zaiqix:{ - trigger:{player:'phaseDrawBefore'}, - filter(event,player){ - return player.hp=2; + } else if (1 + player.maxHp - player.hp == 2) { + return player.countCards("h") >= 2; } return true; }, - content(){ - "step 0" + content() { + "step 0"; trigger.cancel(); - event.cards=get.cards(player.maxHp-player.hp+1); + event.cards = get.cards(player.maxHp - player.hp + 1); player.showCards(event.cards); - "step 1" - var num=0; - for(var i=0;i=player.maxHp-1) return [0,0]; - } - } - } + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, + }, }, - diykuanggu:{ - trigger:{source:'damageEnd'}, - forced:true, - content(){ - if(get.distance(trigger.player,player,'attack')>1){ + diykuanggu: { + trigger: { source: "damageEnd" }, + forced: true, + content() { + if (get.distance(trigger.player, player, "attack") > 1) { player.draw(trigger.num); - } - else{ + } else { player.recover(trigger.num); } - } + }, }, - diyduanliang:{ - group:['diyduanliang1','diyduanliang2'], - ai:{ - threaten:1.2 - } + diyduanliang: { + group: ["diyduanliang1", "diyduanliang2"], + ai: { + threaten: 1.2, + }, }, - diyduanliang1:{ - enable:'phaseUse', - usable:1, - discard:false, - filter(event,player){ - var cards=player.getCards('he',{color:'black'}); - for(var i=0;i0) return false; + ai: { + skillTagFilter(player) { + if (player.storage.guihan) return false; + if (player.hp > 0) return false; }, - save:true, - result:{ - player:4, - target(player,target){ - if(target.hp==target.maxHp) return 2; + save: true, + result: { + player: 4, + target(player, target) { + if (target.hp == target.maxHp) return 2; return 4; - } + }, + }, + threaten(player, target) { + if (!target.storage.guihan) return 0.8; }, - threaten(player,target){ - if(!target.storage.guihan) return 0.8; - } - } - }, - luweiyan:{ - enable:'phaseUse', - usable:1, - filterCard(card){ - return get.type(card)!='basic'; }, - position:'hse', - filter(event,player){ - return player.hasCard(function(card){ - return get.type(card)!='basic'; - },'hes'); - }, - viewAs:{name:'shuiyanqijun'}, - prompt:'将一张非基本牌当水淹七军使用', - check(card){return 8-get.value(card)}, - group:'luweiyan2' }, - luweiyan2:{ - trigger:{player:'useCardAfter'}, - direct:true, - filter(event,player){ - if(event.skill!='luweiyan') return false; - for(var i=0;i0; + }, + yaliang: { + inherit: "wangxi", + }, + xiongzi: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + content() { + trigger.num += 1 + Math.floor(player.countCards("e") / 2); }, - content(){ - trigger.source.discard(trigger.source.getCards('he',{color:'red'})); + }, + honglian: { + trigger: { player: "damageEnd" }, + check(event, player) { + return get.attitude(player, event.player) < 0; }, - ai:{ - expose:0.1, - result:{ - threaten:0.8, - target(card,player,target){ - if(get.tag(card,'damage')&&get.attitude(target,player)<0){ - return [1,0,0,-player.countCards('he',{color:'red'})]; + filter(event, player) { + return ( + event.source && + event.source != player && + event.source.countCards("he", { color: "red" }) > 0 + ); + }, + content() { + trigger.source.discard(trigger.source.getCards("he", { color: "red" })); + }, + ai: { + expose: 0.1, + result: { + threaten: 0.8, + target(card, player, target) { + if (get.tag(card, "damage") && get.attitude(target, player) < 0) { + return [1, 0, 0, -player.countCards("he", { color: "red" })]; } - } - } - } - }, - diyguhuo:{ - trigger:{player:'phaseBegin'}, - forced:true, - filter(event,player){ - return player.countCards('hej')>0; + }, + }, }, - content(){ - "step 0" + }, + diyguhuo: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return player.countCards("hej") > 0; + }, + content() { + "step 0"; player.draw(2); - "step 1" - var next=player.discardPlayerCard(player,'hej',2,true); - next.ai=function(button){ - if(get.position(button.link)=='j') return 10; + ("step 1"); + var next = player.discardPlayerCard(player, "hej", 2, true); + next.ai = function (button) { + if (get.position(button.link) == "j") return 10; return -get.value(button.link); }; - next.filterButton=function(button){ - return lib.filter.cardDiscardable(button.link,player); - } + next.filterButton = function (button) { + return lib.filter.cardDiscardable(button.link, player); + }; + }, + ai: { + effect: { + target(card) { + if (get.type(card) == "delay") return [0, 0.5]; + }, + }, }, - ai:{ - effect:{ - target(card){ - if(get.type(card)=='delay') return [0,0.5]; - } - } - } }, - diychanyuan:{ - trigger:{player:'dieBegin'}, - forced:true, - filter(event){ - return event.source!=undefined; + diychanyuan: { + trigger: { player: "dieBegin" }, + forced: true, + filter(event) { + return event.source != undefined; }, - content(){ + content() { trigger.source.loseMaxHp(true); }, - ai:{ - threaten(player,target){ - if(target.hp==1) return 0.2; + ai: { + threaten(player, target) { + if (target.hp == 1) return 0.2; }, - result:{ - target(card,player,target,current){ - if(target.hp<=1&&get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-5]; - return [1,0,0,-2]; + result: { + target(card, player, target, current) { + if (target.hp <= 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -5]; + return [1, 0, 0, -2]; } - } - } - } - }, - zonghuo:{ - trigger:{source:'damageBefore'}, - direct:true, - priority:10, - filter(event){ - return event.nature!='fire'; + }, + }, }, - content(){ - "step 0" - player.chooseToDiscard(get.prompt('zonghuo')).ai=function(card){ - var att=get.attitude(player,trigger.player); - if(trigger.player.hasSkillTag('nofire')){ - if(att>0) return 8-get.value(card); + }, + zonghuo: { + trigger: { source: "damageBefore" }, + direct: true, + priority: 10, + filter(event) { + return event.nature != "fire"; + }, + content() { + "step 0"; + player.chooseToDiscard(get.prompt("zonghuo")).ai = function (card) { + var att = get.attitude(player, trigger.player); + if (trigger.player.hasSkillTag("nofire")) { + if (att > 0) return 8 - get.value(card); return -1; } - if(att<0){ - return 7-get.value(card); + if (att < 0) { + return 7 - get.value(card); } return -1; + }; + ("step 1"); + if (result.bool) { + player.logSkill("zonghuo", trigger.player, "fire"); + trigger.nature = "fire"; } - "step 1" - if(result.bool){ - player.logSkill('zonghuo',trigger.player,'fire'); - trigger.nature='fire'; - } - } - }, - shaoying:{ - trigger:{source:'damageAfter'}, - direct:true, - filter(event){ - return event.nature=='fire'; }, - content(){ - "step 0" - player.chooseTarget(get.prompt('shaoying'),function(card,player,target){ - return get.distance(trigger.player,target)<=1&&trigger.player!=target; - }).ai=function(target){ - return get.damageEffect(target,player,player,'fire'); - } - "step 1" - if(result.bool){ - var card=get.cards()[0]; + }, + shaoying: { + trigger: { source: "damageAfter" }, + direct: true, + filter(event) { + return event.nature == "fire"; + }, + content() { + "step 0"; + player.chooseTarget(get.prompt("shaoying"), function (card, player, target) { + return get.distance(trigger.player, target) <= 1 && trigger.player != target; + }).ai = function (target) { + return get.damageEffect(target, player, player, "fire"); + }; + ("step 1"); + if (result.bool) { + var card = get.cards()[0]; card.discard(); player.showCards(card); - event.bool=get.color(card)=='red'; - event.target=result.targets[0]; - player.logSkill('shaoying',event.target,false); - trigger.player.line(event.target,'fire'); - } - else{ + event.bool = get.color(card) == "red"; + event.target = result.targets[0]; + player.logSkill("shaoying", event.target, false); + trigger.player.line(event.target, "fire"); + } else { event.finish(); } - "step 2" - if(event.bool){ - event.target.damage('fire'); + ("step 2"); + if (event.bool) { + event.target.damage("fire"); } - } - }, - tiangong:{ - group:['tiangong2'], - trigger:{player:'damageBefore'}, - filter(event){ - if(event.nature=='thunder') return true; }, - forced:true, - content(){ + }, + tiangong: { + group: ["tiangong2"], + trigger: { player: "damageBefore" }, + filter(event) { + if (event.nature == "thunder") return true; + }, + forced: true, + content() { trigger.cancel(); }, - ai:{ - effect:{ - target(card,player,target,current){ - if(card.name=='tiesuo') return 0; - if(get.tag(card,'thunderDamage')) return 0; - } + ai: { + effect: { + target(card, player, target, current) { + if (card.name == "tiesuo") return 0; + if (get.tag(card, "thunderDamage")) return 0; + }, }, - threaten:0.5 - } - }, - tiangong2:{ - trigger:{source:'damageAfter'}, - filter(event){ - if(event.nature=='thunder') return true; + threaten: 0.5, }, - forced:true, - popup:false, - priority:1, - content(){ + }, + tiangong2: { + trigger: { source: "damageAfter" }, + filter(event) { + if (event.nature == "thunder") return true; + }, + forced: true, + popup: false, + priority: 1, + content() { player.draw(); }, }, - xicai:{ - inherit:'jianxiong' + xicai: { + inherit: "jianxiong", }, - diyjianxiong:{ - mode:['identity'], - trigger:{global:'dieBefore'}, - forced:true, - filter(event,player){ - return event.player!=game.zhu&&_status.currentPhase==player; + diyjianxiong: { + mode: ["identity"], + trigger: { global: "dieBefore" }, + forced: true, + filter(event, player) { + return event.player != game.zhu && _status.currentPhase == player; + }, + content() { + trigger.player.identity = "fan"; + trigger.player.setIdentity("fan"); + trigger.player.identityShown = true; }, - content(){ - trigger.player.identity='fan'; - trigger.player.setIdentity('fan'); - trigger.player.identityShown=true; - } }, - nsshuaiyan:{ - trigger:{global:'recoverAfter'}, - filter(event,player){ - return event.player!=player&&_status.currentPhase!=player; + nsshuaiyan: { + trigger: { global: "recoverAfter" }, + filter(event, player) { + return event.player != player && _status.currentPhase != player; }, - logTarget:'player', - content(){ - "step 0" - var att=get.attitude(trigger.player,player); - var bool=0; - if(att<0){ - if(trigger.player.countCards('e')==0&&trigger.player.countCards('h')>2) bool=1; - else if(trigger.player.countCards('he')==0) bool=1; + logTarget: "player", + content() { + "step 0"; + var att = get.attitude(trigger.player, player); + var bool = 0; + if (att < 0) { + if (trigger.player.countCards("e") == 0 && trigger.player.countCards("h") > 2) + bool = 1; + else if (trigger.player.countCards("he") == 0) bool = 1; + } else if (att == 0 && trigger.player.countCards("he") == 0) { + bool = 1; } - else if(att==0&&trigger.player.countCards('he')==0){ - bool=1; - } - trigger.player.chooseControl(function(){ - return _status.event.bool; - }).set('prompt','率言').set('bool',bool).set('choiceList',['令'+get.translation(player)+'摸一张牌','令'+get.translation(player)+'弃置你一张牌']); - "step 1" - if(result.control=='选项一'){ + trigger.player + .chooseControl(function () { + return _status.event.bool; + }) + .set("prompt", "率言") + .set("bool", bool) + .set("choiceList", [ + "令" + get.translation(player) + "摸一张牌", + "令" + get.translation(player) + "弃置你一张牌", + ]); + ("step 1"); + if (result.control == "选项一") { player.draw(); event.finish(); - } - else if(trigger.player.countCards('he')){ - player.discardPlayerCard(trigger.player,true,'he'); - } - else{ + } else if (trigger.player.countCards("he")) { + player.discardPlayerCard(trigger.player, true, "he"); + } else { event.finish(); } }, - ai:{ - threaten:1.2 - } - }, - moshou:{ - mod:{ - targetEnabled(card,player,target,now){ - if(card.name=='bingliang'||card.name=='lebu') return false; - } + ai: { + threaten: 1.2, }, }, - siji:{ - trigger:{player:'phaseDiscardEnd'}, - frequent:true, - filter(event,player){ - if(event.cards){ - for(var i=0;i=trigger.player.hp){ - trigger.player.addTempSkill('ciqiu_dying'); - player.removeSkill('ciqiu') + if (trigger.num >= trigger.player.hp) { + trigger.player.addTempSkill("ciqiu_dying"); + player.removeSkill("ciqiu"); } }, - ai:{ - effect:{ - player(card,player,target){ - if(card.name=='sha'&&target.isHealthy()&&get.attitude(player,target)>0){ - return [1,-2]; + ai: { + effect: { + player(card, player, target) { + if ( + card.name == "sha" && + target.isHealthy() && + get.attitude(player, target) > 0 + ) { + return [1, -2]; } }, }, }, }, - ciqiu_dying:{ - trigger:{player:"dyingBegin"}, - forced:true, - silent:true, - firstDo:true, - content(){ + ciqiu_dying: { + trigger: { player: "dyingBegin" }, + forced: true, + silent: true, + firstDo: true, + content() { player.die(); }, - popup:false, + popup: false, }, - juedao:{ - enable:'phaseUse', - filter(event,player){ - return player.isLinked()==false; + juedao: { + enable: "phaseUse", + filter(event, player) { + return player.isLinked() == false; }, - filterCard:true, - check(card){ - return 6-get.value(card); + filterCard: true, + check(card) { + return 6 - get.value(card); }, - content(){ - if(player.isLinked()==false) player.link(); + content() { + if (player.isLinked() == false) player.link(); }, - ai:{ - link:true, - order:2, - result:{ - player(player){ - if(player.isLinked()) return 0; + ai: { + link: true, + order: 2, + result: { + player(player) { + if (player.isLinked()) return 0; return 1; }, }, - effect:{ - target(card,player,target){ - if(card.name=='tiesuo'){ - if(target.isLinked()){ - return [0,-0.5]; - } - else{ - return [0,0.5]; + effect: { + target(card, player, target) { + if (card.name == "tiesuo") { + if (target.isLinked()) { + return [0, -0.5]; + } else { + return [0, 0.5]; } } - } - } + }, + }, }, - mod:{ - globalFrom(from,to,distance){ - if(from.isLinked()) return distance+1; + mod: { + globalFrom(from, to, distance) { + if (from.isLinked()) return distance + 1; }, - globalTo(from,to,distance){ - if(to.isLinked()) return distance+1; + globalTo(from, to, distance) { + if (to.isLinked()) return distance + 1; }, - } + }, }, - geju:{ - trigger:{player:'phaseBegin'}, - frequent:true, - filter(event,player){ - var list=[]; - var players=game.filterPlayer(); - for(var i=0;i0; + return list.length > 0; }, - content(){ - var list=[]; - var players=game.filterPlayer(); - for(var i=0;i0) player.draw(list.length); - } + if (list.length > 0) player.draw(list.length); + }, }, - diyqiangxi:{ - enable:'phaseUse', - usable:1, - filterCard(card){ - return get.subtype(card)=='equip1'; + diyqiangxi: { + enable: "phaseUse", + usable: 1, + filterCard(card) { + return get.subtype(card) == "equip1"; }, - selectCard:[0,1], - filterTarget(card,player,target){ - if(player==target) return false; - return get.distance(player,target,'attack')<=1; + selectCard: [0, 1], + filterTarget(card, player, target) { + if (player == target) return false; + return get.distance(player, target, "attack") <= 1; }, - content(){ - "step 0" - if(cards.length==0){ + content() { + "step 0"; + if (cards.length == 0) { player.loseHp(); } - "step 1" + ("step 1"); target.damage(); - "step 2" - if(target.isAlive()&&target.countCards('he')){ + ("step 2"); + if (target.isAlive() && target.countCards("he")) { player.discardPlayerCard(target); } }, - check(card){ - return 10-get.value(card); + check(card) { + return 10 - get.value(card); }, - position:'he', - ai:{ - order:8, - result:{ - player(player,target){ - if(ui.selected.cards.length) return 0; - if(player.hp>=target.hp) return -0.9; - if(player.hp<=2) return -10; + position: "he", + ai: { + order: 8, + result: { + player(player, target) { + if (ui.selected.cards.length) return 0; + if (player.hp >= target.hp) return -0.9; + if (player.hp <= 2) return -10; return -2; }, - target(player,target){ - if(player.hp<=1) return 0; - return get.damageEffect(target,player); - } - } + target(player, target) { + if (player.hp <= 1) return 0; + return get.damageEffect(target, player); + }, + }, }, - threaten:1.3 + threaten: 1.3, }, - nsdingzhou:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('hej')>0; + nsdingzhou: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("hej") > 0; }, - content(){ - 'step 0' - var cards=target.getCards('hej'); - if(get.isLuckyStar(player)){ - var cardx=ui.cardPile.firstChild; - if(cardx){ - var color=get.color(card),cardsx=cards.filter(function(i){ - return get.color(i)==color; - }); - if(cardsx.length>0) cards=cardsx; + content() { + "step 0"; + var cards = target.getCards("hej"); + if (get.isLuckyStar(player)) { + var cardx = ui.cardPile.firstChild; + if (cardx) { + var color = get.color(card), + cardsx = cards.filter(function (i) { + return get.color(i) == color; + }); + if (cardsx.length > 0) cards = cardsx; } } - var card=cards.randomGet(); - event.card=card; - player.gain(card,target,'giveAuto','bySelf'); + var card = cards.randomGet(); + event.card = card; + player.gain(card, target, "giveAuto", "bySelf"); player.draw(); - 'step 1' - if(Array.isArray(result)&&get.color(card)!=get.color(result[0])) player.loseHp(); + ("step 1"); + if (Array.isArray(result) && get.color(card) != get.color(result[0])) player.loseHp(); }, - ai:{ - order:7, - result:{target:-1}, + ai: { + order: 7, + result: { target: -1 }, }, }, //比原版更令人难以吐槽的神孙权 - junkyuheng:{ - audio:'yuheng', - trigger:{player:'phaseBegin'}, - forced:true, - keepSkill:true, - filter(event,player){ - return player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'junkyuheng'); - },'he'); + junkyuheng: { + audio: "yuheng", + trigger: { player: "phaseBegin" }, + forced: true, + keepSkill: true, + filter(event, player) { + return player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "junkyuheng"); + }, "he"); }, - content(){ - 'step 0' - player.chooseToDiscard('he',true,[1,4],function(card,player){ - if(!ui.selected.cards.length) return true; - var suit=get.suit(card,player); - for(var i of ui.selected.cards){ - if(get.suit(i,player)==suit) return false; - } - return true; - }).set('complexCard',true).set('ai',function(card){ - if(!player.hasValueTarget(card)) return 5; - return 5-get.value(card); - }); - 'step 1' - if(result.bool){ - var skills=lib.skill.junkyuheng.derivation.randomGets(result.cards.length); - player.addAdditionalSkills('junkyuheng',skills); + content() { + "step 0"; + player + .chooseToDiscard("he", true, [1, 4], function (card, player) { + if (!ui.selected.cards.length) return true; + var suit = get.suit(card, player); + for (var i of ui.selected.cards) { + if (get.suit(i, player) == suit) return false; + } + return true; + }) + .set("complexCard", true) + .set("ai", function (card) { + if (!player.hasValueTarget(card)) return 5; + return 5 - get.value(card); + }); + ("step 1"); + if (result.bool) { + var skills = lib.skill.junkyuheng.derivation.randomGets(result.cards.length); + player.addAdditionalSkills("junkyuheng", skills); } }, - group:'junkyuheng_remove', - derivation:['olbingyi','shenxing','xiashu','old_anxu','rezhiheng','xinanguo','lanjiang','xinfu_guanwei','dimeng','xindiaodu','xingxue','jiexun','olhongyuan','xinfu_youdi','bizheng'], - subSkill:{ - remove:{ - audio:'yuheng', - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.additionalSkills.junkyuheng&&player.additionalSkills.junkyuheng.length>0; + group: "junkyuheng_remove", + derivation: [ + "olbingyi", + "shenxing", + "xiashu", + "old_anxu", + "rezhiheng", + "xinanguo", + "lanjiang", + "xinfu_guanwei", + "dimeng", + "xindiaodu", + "xingxue", + "jiexun", + "olhongyuan", + "xinfu_youdi", + "bizheng", + ], + subSkill: { + remove: { + audio: "yuheng", + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return ( + player.additionalSkills.junkyuheng && + player.additionalSkills.junkyuheng.length > 0 + ); }, - async content(event,trigger,player){ + async content(event, trigger, player) { const skillslength = player.additionalSkills.junkyuheng.length; - await player.removeAdditionalSkills('junkyuheng'); + await player.removeAdditionalSkills("junkyuheng"); await player.draw(skillslength); }, }, }, }, - junkdili:{ - audio:'dili', - trigger:{player:'changeSkillsAfter'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'wood', - filter(event,player){ - if(!event.addSkill.length) return false; - var skills=player.getSkills(null,false,false).filter(function(i){ - var info=get.info(i); - return info&&!info.charlotte; + junkdili: { + audio: "dili", + trigger: { player: "changeSkillsAfter" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "wood", + filter(event, player) { + if (!event.addSkill.length) return false; + var skills = player.getSkills(null, false, false).filter(function (i) { + var info = get.info(i); + return info && !info.charlotte; }); - return skills.length>player.maxHp; + return skills.length > player.maxHp; }, - content(){ - 'step 0' - player.awakenSkill('junkdili'); + content() { + "step 0"; + player.awakenSkill("junkdili"); player.loseMaxHp(); - 'step 1' - var skills=player.getSkills(null,false,false).filter(function(i){ - if(i=='junkdili') return false; - var info=get.info(i); - return info&&!info.charlotte; + ("step 1"); + var skills = player.getSkills(null, false, false).filter(function (i) { + if (i == "junkdili") return false; + var info = get.info(i); + return info && !info.charlotte; }); - var list=[]; - for(var skill of skills){ + var list = []; + for (var skill of skills) { list.push([ skill, - '', - ]) + '", + ]); } - var next=player.chooseButton([ - '请选择失去任意个技能', - [list,'textbutton'], - ]); - next.set('forced',true); - next.set('selectButton',[1,skills.length]); - next.set('ai',function(button){ - var skill=button.link,skills=_status.event.skills.slice(0); - skills.removeArray(['xinanguo','lanjiang','rezhiheng','junkyuheng']); - switch(ui.selected.buttons.length){ + var next = player.chooseButton(["请选择失去任意个技能", [list, "textbutton"]]); + next.set("forced", true); + next.set("selectButton", [1, skills.length]); + next.set("ai", function (button) { + var skill = button.link, + skills = _status.event.skills.slice(0); + skills.removeArray(["xinanguo", "lanjiang", "rezhiheng", "junkyuheng"]); + switch (ui.selected.buttons.length) { case 0: - if(skills.includes(skill)) return 2; - if(skill=='junkyuheng') return 1; + if (skills.includes(skill)) return 2; + if (skill == "junkyuheng") return 1; return Math.random(); case 1: - if(skills.length<2) return 0; - if(skills.includes(skill)) return 2; - if(skill=='junkyuheng') return 1; - return 0 - case 2: - if(skills.includes(skill)) return 2; - if(skill=='junkyuheng') return 1; + if (skills.length < 2) return 0; + if (skills.includes(skill)) return 2; + if (skill == "junkyuheng") return 1; + return 0; + case 2: + if (skills.includes(skill)) return 2; + if (skill == "junkyuheng") return 1; + return 0; + default: return 0; - default: return 0; } }); - next.set('skills',skills) - 'step 2' - if(result.bool){ - var skills=result.links; + next.set("skills", skills); + ("step 2"); + if (result.bool) { + var skills = result.links; player.removeSkills(skills.slice(0)); } - var list=lib.skill.junkdili.derivation; - list=list.slice(0,Math.min(skills.length,list.length)); + var list = lib.skill.junkdili.derivation; + list = list.slice(0, Math.min(skills.length, list.length)); player.addSkills(list); }, - derivation:['junkshengzhi','junkquandao','junkchigang'], + derivation: ["junkshengzhi", "junkquandao", "junkchigang"], }, - junkshengzhi:{ - audio:'dili_shengzhi', - trigger:{player:['logSkill','useSkillAfter']}, - forced:true, - filter(event,player){ - if(event.type!='player') return false; - var skill=event.sourceSkill||event.skill; - if(get.is.locked(skill)) return false; - var info=get.info(skill); + junkshengzhi: { + audio: "dili_shengzhi", + trigger: { player: ["logSkill", "useSkillAfter"] }, + forced: true, + filter(event, player) { + if (event.type != "player") return false; + var skill = event.sourceSkill || event.skill; + if (get.is.locked(skill)) return false; + var info = get.info(skill); return !info.charlotte; }, - content(){ - player.addTempSkill('junkshengzhi_effect'); + content() { + player.addTempSkill("junkshengzhi_effect"); }, - subSkill:{ - effect:{ - mod:{ - cardUsable:()=>Infinity, - targetInRange:()=>true, + subSkill: { + effect: { + mod: { + cardUsable: () => Infinity, + targetInRange: () => true, }, - trigger:{player:'useCard1'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - content(){ - if(trigger.addCount!==false){ - trigger.addCount=false; + trigger: { player: "useCard1" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + content() { + if (trigger.addCount !== false) { + trigger.addCount = false; player.getStat().card[trigger.card.name]--; } - player.removeSkill('junkshengzhi_effect'); + player.removeSkill("junkshengzhi_effect"); }, - mark:true, - intro:{content:'使用下一张牌无距离和次数限制'}, + mark: true, + intro: { content: "使用下一张牌无距离和次数限制" }, }, }, }, - junkquandao:{ - audio:'dili_quandao', - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - return event.card.name=='sha' || get.type(event.card,null,false)=='trick'; + junkquandao: { + audio: "dili_quandao", + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" || get.type(event.card, null, false) == "trick"; }, - async content(event, trigger, player){ - const cards1 = player.getCards('h', card => get.name(card) === 'sha'), cards2 = player.getCards('h', card => get.type(card) === 'trick'); - if (cards1.length !== cards2.length){ - const num = cards1.length - cards2.length, cards = num > 0 ? cards1 : cards2; + async content(event, trigger, player) { + const cards1 = player.getCards("h", (card) => get.name(card) === "sha"), + cards2 = player.getCards("h", (card) => get.type(card) === "trick"); + if (cards1.length !== cards2.length) { + const num = cards1.length - cards2.length, + cards = num > 0 ? cards1 : cards2; let i = 0; - cards.forEach(card => { - if (i < Math.abs(num) && lib.filter.cardDiscardable(card, player, 'junkquandao')) i++; + cards.forEach((card) => { + if (i < Math.abs(num) && lib.filter.cardDiscardable(card, player, "junkquandao")) + i++; }); if (i > 0) { - await player.chooseToDiscard(i, true, - `权道:请弃置${ get.cnNumber(i) }张${ num > 0 ? '杀' : '普通锦囊牌' }`, - num > 0 ? (card => get.name(card) === 'sha') : (card => get.type(card) === 'trick')) + await player.chooseToDiscard( + i, + true, + `权道:请弃置${get.cnNumber(i)}张${num > 0 ? "杀" : "普通锦囊牌"}`, + num > 0 + ? (card) => get.name(card) === "sha" + : (card) => get.type(card) === "trick" + ); } } await player.draw(); }, }, - junkchigang:{ - audio:'dili_chigang', - trigger:{player:'phaseJudgeBefore'}, - forced:true, - zhuanhuanji:true, - mark:true, - marktext:'☯', - content(){ - player.changeZhuanhuanji('junkchigang'); + junkchigang: { + audio: "dili_chigang", + trigger: { player: "phaseJudgeBefore" }, + forced: true, + zhuanhuanji: true, + mark: true, + marktext: "☯", + content() { + player.changeZhuanhuanji("junkchigang"); trigger.cancel(); - var next=player[player.storage.junkchigang?'phaseDraw':'phaseUse'](); + var next = player[player.storage.junkchigang ? "phaseDraw" : "phaseUse"](); event.next.remove(next); trigger.getParent().next.push(next); }, - ai:{ - effect:{ - target(card,player,target){ - if(get.type(card)=='delay') return 'zerotarget'; + ai: { + effect: { + target(card, player, target) { + if (get.type(card) == "delay") return "zerotarget"; }, }, }, - intro:{ - content(storage){ - return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的'+(storage?'出牌阶段':'摸牌阶段')+'。' + intro: { + content(storage) { + return ( + "转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的" + + (storage ? "出牌阶段" : "摸牌阶段") + + "。" + ); }, }, }, - nsmanzhi:{ - audio:'dcmanzhi', - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - direct:true, - filter(event,player){ - var nums=[]; - game.countPlayer(current=>{ + nsmanzhi: { + audio: "dcmanzhi", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + direct: true, + filter(event, player) { + var nums = []; + game.countPlayer((current) => { nums.add(current.hp); nums.add(current.maxHp); - nums.add(current.countCards('h')); - nums.add(current.countCards('e')); - nums.add(current.countCards('j')); + nums.add(current.countCards("h")); + nums.add(current.countCards("e")); + nums.add(current.countCards("j")); }); - for(var a of nums){ - for(var b of nums){ - if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()) return true; + for (var a of nums) { + for (var b of nums) { + if (0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer()) return true; } } return false; }, - content(){ - 'step 0' - var nums=[]; - game.countPlayer(current=>{ + content() { + "step 0"; + var nums = []; + game.countPlayer((current) => { nums.add(current.hp); nums.add(current.maxHp); - nums.add(current.countCards('h')); - nums.add(current.countCards('e')); - nums.add(current.countCards('j')); + nums.add(current.countCards("h")); + nums.add(current.countCards("e")); + nums.add(current.countCards("j")); }); - nums.sort((a,b)=>a-b); - var a=null,b=null,goon=false; - for(a of nums){ - for(b of nums){ - if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()){ - goon=true; + nums.sort((a, b) => a - b); + var a = null, + b = null, + goon = false; + for (a of nums) { + for (b of nums) { + if (0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer()) { + goon = true; break; } } - if(goon) break; + if (goon) break; } - player.chooseButton(2,[ - '蛮智:请选择让下列等式成立的A与B的值', - '
    目标等式
    ', - `0.5 × A2 + 2.5 × B - ${game.roundNumber} = ${game.countPlayer()}`, - '
    A的可选值
    ', - [nums.map(i=>{ - return [ - `A|${i}`, - i==a?(`${i}`):i, - ] - }),'tdnodes'], - '
    B的可选值
    ', - [nums.map(i=>{ - return [ - `B|${i}`, - i==b?(`${i}`):i, - ] - }),'tdnodes'], - ]).set('filterButton',function(button){ - if(!ui.selected.buttons.length) return true; - return button.link[0]!=ui.selected.buttons[0].link[0]; - }).set('filterOk',function(){ - if(ui.selected.buttons.length!=2) return false; - var a,b; - for(var i of ui.selected.buttons){ - if(i.link[0]=='A') a=parseInt(i.link.slice(2)); - else b=parseInt(i.link.slice(2)); + player + .chooseButton(2, [ + "蛮智:请选择让下列等式成立的A与B的值", + '
    目标等式
    ', + `0.5 × A2 + 2.5 × B - ${game.roundNumber} = ${game.countPlayer()}`, + '
    A的可选值
    ', + [ + nums.map((i) => { + return [`A|${i}`, i == a ? `${i}` : i]; + }), + "tdnodes", + ], + '
    B的可选值
    ', + [ + nums.map((i) => { + return [`B|${i}`, i == b ? `${i}` : i]; + }), + "tdnodes", + ], + ]) + .set("filterButton", function (button) { + if (!ui.selected.buttons.length) return true; + return button.link[0] != ui.selected.buttons[0].link[0]; + }) + .set("filterOk", function () { + if (ui.selected.buttons.length != 2) return false; + var a, b; + for (var i of ui.selected.buttons) { + if (i.link[0] == "A") a = parseInt(i.link.slice(2)); + else b = parseInt(i.link.slice(2)); + } + return 0.5 * a * a + 2.5 * b - game.roundNumber == game.countPlayer(); + }) + .set("choice", [a, b]) + .set("ai", (button) => { + var choice = _status.event.choice; + if (button.link == `A|${choice[0]}` || button.link == `B|${choice[1]}`) return 1; + return 0; + }); + ("step 1"); + if (result.bool) { + var a, b; + for (var i of result.links) { + if (i[0] == "A") a = parseInt(i.slice(2)); + else b = parseInt(i.slice(2)); } - return (0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer(); - }).set('choice',[a,b]).set('ai',(button)=>{ - var choice=_status.event.choice; - if(button.link==`A|${choice[0]}`||button.link==`B|${choice[1]}`) return 1; - return 0; - }); - 'step 1' - if(result.bool){ - var a,b; - for(var i of result.links){ - if(i[0]=='A') a=parseInt(i.slice(2)); - else b=parseInt(i.slice(2)); - } - equals=`0.5×${a}2+2.5×${b}-${game.roundNumber}=${game.countPlayer()}`; - player.logSkill('nsmanzhi'); + equals = `0.5×${a}2+2.5×${b}-${game.roundNumber}=${game.countPlayer()}`; + player.logSkill("nsmanzhi"); player.chat(equals); - game.log(player,'的计算结果为',equals); + game.log(player, "的计算结果为", equals); player.draw(game.countPlayer()); } }, }, }, - dynamicTranslate:{ - nsjiquan(player){ - if(player.storage.nsfuwei) return '锁定技,与你距离1以内的其他角色造成或受到伤害后,你将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。'; - return '与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。'; + dynamicTranslate: { + nsjiquan(player) { + if (player.storage.nsfuwei) + return "锁定技,与你距离1以内的其他角色造成或受到伤害后,你将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。"; + return "与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。"; }, - abyusa_jueqing(player){ - if(player.storage.abyusa_jueqing_rewrite) return '锁定技,你即将造成的伤害均视为失去体力。'; - return '当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。'; + abyusa_jueqing(player) { + if (player.storage.abyusa_jueqing_rewrite) return "锁定技,你即将造成的伤害均视为失去体力。"; + return "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。"; }, - tomoya_shangxian(player){ - if(player.storage.tomoya_shangxian) return '锁定技,你计算与其他角色的距离时始终从顺时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。'; - return '锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。'; + tomoya_shangxian(player) { + if (player.storage.tomoya_shangxian) + return "锁定技,你计算与其他角色的距离时始终从顺时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。"; + return "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。"; }, - yui_lieyin(player){ - if(player.storage._ichiban_no_takaramono) return '锁定技,出牌阶段开始时,你可选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。'; - return '锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。'; + yui_lieyin(player) { + if (player.storage._ichiban_no_takaramono) + return "锁定技,出牌阶段开始时,你可选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。"; + return "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。"; }, - yuzuru_kunfen(player){ - if(player.storage._yuzuru_sss) return '锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。'; - return '锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。'; + yuzuru_kunfen(player) { + if (player.storage._yuzuru_sss) + return "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。"; + return "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。"; }, - yuzuru_quji(player){ - if(player.storage._yuzuru_sss) return '出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)'; - return '出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)'; + yuzuru_quji(player) { + if (player.storage._yuzuru_sss) + return "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)"; + return "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)"; }, - kamome_jieban(player){ - if(player.storage.kamome_jieban) return '转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。'; + kamome_jieban(player) { + if (player.storage.kamome_jieban) + return '转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。'; return '转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。'; }, - shiroha_guying(player){ - var str='当你受到伤害/对其他角色造成伤害时,你'; - if(!player.storage.shiroha_jiezhao) str='锁定技,每回合限一次,'+str; - if(player.storage.shiroha_jiezhao) str+='可'; - str+='进行判定。若结果为红色/黑色,此伤害-1/+1。'; + shiroha_guying(player) { + var str = "当你受到伤害/对其他角色造成伤害时,你"; + if (!player.storage.shiroha_jiezhao) str = "锁定技,每回合限一次," + str; + if (player.storage.shiroha_jiezhao) str += "可"; + str += "进行判定。若结果为红色/黑色,此伤害-1/+1。"; return str; }, - nsdiewu(player){ - if(player.storage.nspojian) return '当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】。当你以此法使用【杀】造成伤害后,则你摸一张牌。'; - return '当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。'; + nsdiewu(player) { + if (player.storage.nspojian) + return "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】。当你以此法使用【杀】造成伤害后,则你摸一张牌。"; + return "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。"; }, - nsfuzhou(player){ - var str='出牌阶段限'; - str+=(player.storage.nstaiping?'两':'一'); - str+='次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到'; - str+=(player.storage.nsfuzhou_damage?'两':'一'); - str+='点雷属性伤害并弃置一张牌;红色,你摸两张牌,'; - str+=(player.storage.nsfuzhou_draw?'该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。':'且该角色本回合手牌上限减1。'); + nsfuzhou(player) { + var str = "出牌阶段限"; + str += player.storage.nstaiping ? "两" : "一"; + str += + "次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到"; + str += player.storage.nsfuzhou_damage ? "两" : "一"; + str += "点雷属性伤害并弃置一张牌;红色,你摸两张牌,"; + str += player.storage.nsfuzhou_draw + ? "该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。" + : "且该角色本回合手牌上限减1。"; return str; }, - nsguidao(player){ - if(player.storage.nstaiping) return '一名角色的判定牌生效前,你可以打出一张牌替换之。'; - return '一名角色的判定牌生效前,你可以打出一张黑色牌替换之。'; + nsguidao(player) { + if (player.storage.nstaiping) return "一名角色的判定牌生效前,你可以打出一张牌替换之。"; + return "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。"; }, - junkchigang(player){ - if(player.storage.junkchigang) return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; + junkchigang(player) { + if (player.storage.junkchigang) + return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; return '转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。'; }, }, - characterReplace:{ - key_yuri:['key_yuri','sp_key_yuri'], - kanade:['sp_key_kanade','kanade'], + characterReplace: { + key_yuri: ["key_yuri", "sp_key_yuri"], + kanade: ["sp_key_kanade", "kanade"], }, - translate:{ - diy_liufu:'刘馥', - diy_xizhenxihong:'习珍习宏', - diy_liuzan:'留赞', - diy_zaozhirenjun:'枣祗任峻', - diy_yangyi:'杨仪', - diy_tianyu:'田豫', + translate: { + diy_liufu: "刘馥", + diy_xizhenxihong: "习珍习宏", + diy_liuzan: "留赞", + diy_zaozhirenjun: "枣祗任峻", + diy_yangyi: "杨仪", + diy_tianyu: "田豫", // diy_caocao:'曹操', - diy_menghuo:'孟获', - diy_huangzhong:'黄汉升', - diy_xuhuang:'徐公明', - diy_dianwei:'新典韦', - diy_weiyan:'魏文长', - xicai:'惜才', - diyjianxiong:'奸雄', - diy_feishi:'费诗', - nsshuaiyan:'率言', - moshou:'墨守', - diy_hanlong:'韩龙', - diy_luxun:'陆伯言', - diy_yuji:'于吉', - diy_zhouyu:'周公瑾', - diy_lukang:'陆抗', - diy_caiwenji:'蔡昭姬', - diy_zhenji:'甄宓', + diy_menghuo: "孟获", + diy_huangzhong: "黄汉升", + diy_xuhuang: "徐公明", + diy_dianwei: "新典韦", + diy_weiyan: "魏文长", + xicai: "惜才", + diyjianxiong: "奸雄", + diy_feishi: "费诗", + nsshuaiyan: "率言", + moshou: "墨守", + diy_hanlong: "韩龙", + diy_luxun: "陆伯言", + diy_yuji: "于吉", + diy_zhouyu: "周公瑾", + diy_lukang: "陆抗", + diy_caiwenji: "蔡昭姬", + diy_zhenji: "甄宓", - ns_zuoci:'左慈', - ns_wangyun:'王允', - ns_lvzhi:'吕后', - ns_nanhua:'南华', - ns_nanhua_left:'幻身·左', - ns_nanhua_right:'幻身·右', - ns_huamulan:'SP花木兰', - ns_huamulan_prefix:'SP', - ns_huangzu:'黄祖', - ns_yanliang:'颜良', - ns_wenchou:'文丑', - ns_jinke:'荆轲', + ns_zuoci: "左慈", + ns_wangyun: "王允", + ns_lvzhi: "吕后", + ns_nanhua: "南华", + ns_nanhua_left: "幻身·左", + ns_nanhua_right: "幻身·右", + ns_huamulan: "SP花木兰", + ns_huamulan_prefix: "SP", + ns_huangzu: "黄祖", + ns_yanliang: "颜良", + ns_wenchou: "文丑", + ns_jinke: "荆轲", - ns_caocao:'曹操', - ns_zhugeliang:'诸葛亮', - ns_wangyue:'王越', - ns_yuji:'于吉', - ns_caocaosp:'SP曹操', - ns_caocaosp_prefix:'SP', - ns_xinxianying:'辛宪英', - ns_sunjian:'孙坚', - ns_simazhao:'司马昭', - ns_guanlu:'管辂', + ns_caocao: "曹操", + ns_zhugeliang: "诸葛亮", + ns_wangyue: "王越", + ns_yuji: "于吉", + ns_caocaosp: "SP曹操", + ns_caocaosp_prefix: "SP", + ns_xinxianying: "辛宪英", + ns_sunjian: "孙坚", + ns_simazhao: "司马昭", + ns_guanlu: "管辂", - ns_duangui:'段珪', - ns_shenpei:'审配', - ns_zhangbao:'张宝', - ns_masu:'马谡', - ns_zhangxiu:'张绣', - ns_lvmeng:'吕蒙', + ns_duangui: "段珪", + ns_shenpei: "审配", + ns_zhangbao: "张宝", + ns_masu: "马谡", + ns_zhangxiu: "张绣", + ns_lvmeng: "吕蒙", - ns_yujisp:'于吉', - ns_lisu:'李肃', - ns_yangyi:'杨仪', - ns_liuzhang:'刘璋', - ns_xinnanhua:'南华老仙', - ns_luyusheng:'陆郁生', + ns_yujisp: "于吉", + ns_lisu: "李肃", + ns_yangyi: "杨仪", + ns_liuzhang: "刘璋", + ns_xinnanhua: "南华老仙", + ns_luyusheng: "陆郁生", - sp_key_yuri:'SP仲村由理', - sp_key_yuri_prefix:'SP', - key_lucia:'此花露西娅', - key_kyousuke:'枣恭介', - key_yuri:'仲村由理', - key_haruko:'神尾晴子', - key_umi:'加藤うみ', - key_umi2:'鹰原羽未', - key_rei:'零', - key_komari:'神北小毬', - key_yukine:'宫泽有纪宁', - key_yusa:'西森柚咲', - key_misa:'黑羽美砂', - key_masato:'井之原真人', - key_iwasawa:'岩泽雅美', - key_kengo:'宫泽谦吾', - key_yoshino:'吉野晴彦', - key_yui:'由依', - key_tsumugi:'紬文德斯', - key_saya:'朱鹭户沙耶', - key_harukakanata:'三枝叶留佳&二木佳奈多', - key_harukakanata_ab:'三枝二木', - key_inari:'稻荷', - key_shiina:'椎名', - key_sunohara:'春原阳平&春原芽衣', - key_sunohara_ab:'阳平芽衣', + sp_key_yuri: "SP仲村由理", + sp_key_yuri_prefix: "SP", + key_lucia: "此花露西娅", + key_kyousuke: "枣恭介", + key_yuri: "仲村由理", + key_haruko: "神尾晴子", + key_umi: "加藤うみ", + key_umi2: "鹰原羽未", + key_rei: "零", + key_komari: "神北小毬", + key_yukine: "宫泽有纪宁", + key_yusa: "西森柚咲", + key_misa: "黑羽美砂", + key_masato: "井之原真人", + key_iwasawa: "岩泽雅美", + key_kengo: "宫泽谦吾", + key_yoshino: "吉野晴彦", + key_yui: "由依", + key_tsumugi: "紬文德斯", + key_saya: "朱鹭户沙耶", + key_harukakanata: "三枝叶留佳&二木佳奈多", + key_harukakanata_ab: "三枝二木", + key_inari: "稻荷", + key_shiina: "椎名", + key_sunohara: "春原阳平&春原芽衣", + key_sunohara_ab: "阳平芽衣", //该武将国战模式下不可用 - key_rin:'枣铃', - key_sasami:'笹濑川佐佐美', - key_akane:'千里朱音', - key_doruji:'多鲁基', - key_yuiko:'来谷唯湖', - key_riki:'直枝理树'/*+'子'*/, - key_hisako:'渕田久子', - key_hinata:'日向秀树', - key_noda:'野田', - key_tomoya:'冈崎朋也', - key_nagisa:'古河渚', - key_ayato:'直井文人', - key_ao:'空门苍', - key_yuzuru:'音无结弦', - sp_key_kanade:'SP立华奏', - sp_key_kanade_prefix:'SP', - key_mio:'西园美鱼', - key_midori:'西园美鸟', - key_kyoko:'岬镜子', - key_shizuru:'中津静流', - key_shiorimiyuki:'关根诗织&入江美雪', - key_shiorimiyuki_ab:'关根入江', - key_miki:'野村美希', - key_shiori:'美坂栞', - key_kaori:'美坂香里', - key_akiko:'水濑秋子', - key_abyusa:'游佐', - key_godan:'松下护騨', - key_yuu:'乙坂有宇', - key_ryoichi:'三谷良一', - key_kotori:'神户小鸟', - key_jojiro:'高城丈士朗', - key_shiroha:'鸣濑白羽', - key_shizuku:'水织静久', - key_hiroto:'铃木央人', - key_sakuya:'凤咲夜', - key_youta:'成神阳太', - key_rumi:'七濑留美', - key_chihaya:'凤千早', - key_yukito:'国崎往人', - key_crow:'小空', - key_asara:'井上晶', - key_kotomi:'一之濑琴美', - key_mia:'藤川米娅', - key_kano:'雾岛佳乃', - db_key_liyingxia:'李映夏', - key_erika:'苍井绘梨花', - key_satomi:'藏里见', - key_iriya:'喵呜·喵呼', - key_iriya_ab:'喵呜喵呼', - key_fuuko:'伊吹风子', - lucia_duqu:'毒躯', - lucia_duqu_info:'锁定技,①当你对其他角色造成伤害或受到其他角色的伤害时,你令对方获得一张花色点数随机的【毒】。
    ②当你因【毒】失去体力时,你改为回复等量的体力。', - lucia_zhenren:'振刃', - lucia_zhenren_info:'锁定技,每个结束阶段,若你的装备区内有牌,则你弃置之。然后,你依次弃置场上的X张牌。(X为你以此法弃置的牌数)', - nk_shekong:'设控', - nk_shekong_info:'出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色(不能超过该角色的牌数),然后令其选择一项:弃置一张牌并令你摸X张牌,或弃置X张牌并令你摸一张牌。然后,你将你与其弃置的且位于弃牌堆中的牌以任意顺序置于牌堆顶。', - key_huanjie:'幻界', - key_huanjie_info:'锁定技,当你进行判定或摸牌时,你改为从牌堆的另一端获取相应的牌。', - yuri_xingdong:'行动', - yuri_xingdong_info:'锁定技,出牌阶段开始时,你获得一张【杀】或普通锦囊牌。出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。', + key_rin: "枣铃", + key_sasami: "笹濑川佐佐美", + key_akane: "千里朱音", + key_doruji: "多鲁基", + key_yuiko: "来谷唯湖", + key_riki: "直枝理树" /*+'子'*/, + key_hisako: "渕田久子", + key_hinata: "日向秀树", + key_noda: "野田", + key_tomoya: "冈崎朋也", + key_nagisa: "古河渚", + key_ayato: "直井文人", + key_ao: "空门苍", + key_yuzuru: "音无结弦", + sp_key_kanade: "SP立华奏", + sp_key_kanade_prefix: "SP", + key_mio: "西园美鱼", + key_midori: "西园美鸟", + key_kyoko: "岬镜子", + key_shizuru: "中津静流", + key_shiorimiyuki: "关根诗织&入江美雪", + key_shiorimiyuki_ab: "关根入江", + key_miki: "野村美希", + key_shiori: "美坂栞", + key_kaori: "美坂香里", + key_akiko: "水濑秋子", + key_abyusa: "游佐", + key_godan: "松下护騨", + key_yuu: "乙坂有宇", + key_ryoichi: "三谷良一", + key_kotori: "神户小鸟", + key_jojiro: "高城丈士朗", + key_shiroha: "鸣濑白羽", + key_shizuku: "水织静久", + key_hiroto: "铃木央人", + key_sakuya: "凤咲夜", + key_youta: "成神阳太", + key_rumi: "七濑留美", + key_chihaya: "凤千早", + key_yukito: "国崎往人", + key_crow: "小空", + key_asara: "井上晶", + key_kotomi: "一之濑琴美", + key_mia: "藤川米娅", + key_kano: "雾岛佳乃", + db_key_liyingxia: "李映夏", + key_erika: "苍井绘梨花", + key_satomi: "藏里见", + key_iriya: "喵呜·喵呼", + key_iriya_ab: "喵呜喵呼", + key_fuuko: "伊吹风子", + lucia_duqu: "毒躯", + lucia_duqu_info: + "锁定技,①当你对其他角色造成伤害或受到其他角色的伤害时,你令对方获得一张花色点数随机的【毒】。
    ②当你因【毒】失去体力时,你改为回复等量的体力。", + lucia_zhenren: "振刃", + lucia_zhenren_info: + "锁定技,每个结束阶段,若你的装备区内有牌,则你弃置之。然后,你依次弃置场上的X张牌。(X为你以此法弃置的牌数)", + nk_shekong: "设控", + nk_shekong_info: + "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色(不能超过该角色的牌数),然后令其选择一项:弃置一张牌并令你摸X张牌,或弃置X张牌并令你摸一张牌。然后,你将你与其弃置的且位于弃牌堆中的牌以任意顺序置于牌堆顶。", + key_huanjie: "幻界", + key_huanjie_info: "锁定技,当你进行判定或摸牌时,你改为从牌堆的另一端获取相应的牌。", + yuri_xingdong: "行动", + yuri_xingdong_info: + "锁定技,出牌阶段开始时,你获得一张【杀】或普通锦囊牌。出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", //目标角色跳过阶段的同时 该回合不能发动〖整经(郑玄)〗 - yuri_wangxi:'忘隙', - yuri_wangxi_info:'主公技,限定技,当有角色因你发动的【行动】而死亡后,若其身份不为【明忠】,则其可以将身份改为忠臣并重新加入游戏,然后将势力改为与你相同,将体力值回复至2点并摸一张牌。', - haruko_haofang:'豪放', - haruko_haofang_info:'锁定技,你的延时锦囊牌视为【无中生有】。当你因执行【无中生有】的效果而摸牌时,你令摸牌数+2。', - haruko_zhuishi:'追逝', - haruko_zhuishi_info:'一名角色的判定阶段开始时,若其判定区内有牌,则你可以获得其判定区内的所有牌。若你的体力值大于1,你失去1点体力。', - umi_chaofan:'炒饭', - umi_chaofan_info:'出牌阶段限一次,你可以弃置两张花色不同的手牌并选择一名其他角色。你摸一张牌,若你的体力值:大于2,目标角色回复1点体力;等于2,目标角色摸两张牌;小于2,目标角色受到1点无来源且对应渠道为这两张牌的火焰伤害。', - umi_lunhui:'轮回', - umi_lunhui_info:'一名其他角色的回合结束时,若你的手牌数小于体力值,则你可以失去1点体力。若如此做,你摸两张牌并进行一个额外回合,且你于此回合内计算与此角色的距离视为1。', - umi_shiroha:'轮回 - 延时效果', - umi_qihuan:'七幻', - umi_qihuan_info:'限定技,当你处于濒死状态时,你可以移去此武将牌。若如此做,你回复X点体力(X为场上势力数)。然后,你可获得场上已死亡角色武将牌上的至多两个技能。', - komari_tiankou:'甜口', - komari_tiankou_info:'锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标。', - komari_xueshang:'血殇', - komari_xueshang_info:'锁定技,蓄能技,当有角色死亡时,你对自己造成1点伤害,然后对所有其他角色依次造成1点伤害。当有角色因此法进入濒死状态时,你加1点体力上限并回复1点体力,然后失去此技能并终止此技能的所有后续结算。', - yukine_wenzhou:'问咒', - yukine_wenzhou_info:'一名角色的出牌阶段开始时,其可以交给你一张牌。若如此做,你选择一项:交给其一张牌,或令其从牌堆中获得一张与此牌类型相同的牌,且其于此阶段内使用与此牌牌名相同的牌时无法被响应。', + yuri_wangxi: "忘隙", + yuri_wangxi_info: + "主公技,限定技,当有角色因你发动的【行动】而死亡后,若其身份不为【明忠】,则其可以将身份改为忠臣并重新加入游戏,然后将势力改为与你相同,将体力值回复至2点并摸一张牌。", + haruko_haofang: "豪放", + haruko_haofang_info: + "锁定技,你的延时锦囊牌视为【无中生有】。当你因执行【无中生有】的效果而摸牌时,你令摸牌数+2。", + haruko_zhuishi: "追逝", + haruko_zhuishi_info: + "一名角色的判定阶段开始时,若其判定区内有牌,则你可以获得其判定区内的所有牌。若你的体力值大于1,你失去1点体力。", + umi_chaofan: "炒饭", + umi_chaofan_info: + "出牌阶段限一次,你可以弃置两张花色不同的手牌并选择一名其他角色。你摸一张牌,若你的体力值:大于2,目标角色回复1点体力;等于2,目标角色摸两张牌;小于2,目标角色受到1点无来源且对应渠道为这两张牌的火焰伤害。", + umi_lunhui: "轮回", + umi_lunhui_info: + "一名其他角色的回合结束时,若你的手牌数小于体力值,则你可以失去1点体力。若如此做,你摸两张牌并进行一个额外回合,且你于此回合内计算与此角色的距离视为1。", + umi_shiroha: "轮回 - 延时效果", + umi_qihuan: "七幻", + umi_qihuan_info: + "限定技,当你处于濒死状态时,你可以移去此武将牌。若如此做,你回复X点体力(X为场上势力数)。然后,你可获得场上已死亡角色武将牌上的至多两个技能。", + komari_tiankou: "甜口", + komari_tiankou_info: + "锁定技,当你使用红色的非伤害性基本牌/锦囊牌选择目标时,或成为其他角色使用的这些牌的目标时,你选择一项:1.摸一张牌;2.为此牌增加一个目标。", + komari_xueshang: "血殇", + komari_xueshang_info: + "锁定技,蓄能技,当有角色死亡时,你对自己造成1点伤害,然后对所有其他角色依次造成1点伤害。当有角色因此法进入濒死状态时,你加1点体力上限并回复1点体力,然后失去此技能并终止此技能的所有后续结算。", + yukine_wenzhou: "问咒", + yukine_wenzhou_info: + "一名角色的出牌阶段开始时,其可以交给你一张牌。若如此做,你选择一项:交给其一张牌,或令其从牌堆中获得一张与此牌类型相同的牌,且其于此阶段内使用与此牌牌名相同的牌时无法被响应。", //如果对自己发动【问咒】,则自己可以响应这些牌。但其他角色发动【问咒】时,该角色自己并不能响应 - yusa_yanyi:'演艺', - yusa_yanyi_info:'出牌阶段限一次,你可以指定至多X名与你距离不大于你的体力值的角色。这些角色选择一项:①令你摸一张牌。②回复1点体力,然后交给你一张牌。(X为你的攻击范围且至少为1)', - misa_yehuo:'业火', - misa_yehuo_info:'一名角色的摸牌阶段开始时,若其在你的攻击范围内,你可以弃置X张牌并选择一项:①对其造成1点火属性伤害。②令其于此摸牌阶段放弃摸牌。(X为你与其的的距离)', - yusa_misa:'通灵', - yusa_misa_info:'当你发动的〖演艺〗结算完成之后,你可以将武将牌翻面。', - misa_yusa:'归魂', - misa_yusa_info:'当你发动的〖业火〗结算完成后,你可以将武将牌翻面。', - masato_baoquan:'暴拳', - masato_baoquan_info:'锁定技,当你即将造成伤害时,你选择一项:1.令此伤害+2并减1点体力上限。2.防止此伤害。', - iwasawa_yinhang:'引吭', - iwasawa_yinhang_info:'锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。', - iwasawa_mysong:'My Song', - iwasawa_mysong_info:'锁定技,当你即将进行濒死结算时,取消之。回合开始时,若你的体力值小于1,则你获得技能〖奋音〗直到回合结束。回合结束时,若你的体力值小于1,你死亡。', - iwasawa_fenyin:'奋音', - iwasawa_fenyin_info:'你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。', - iwasawa_refenyin:'奋音', - iwasawa_refenyin_info:'锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。', + yusa_yanyi: "演艺", + yusa_yanyi_info: + "出牌阶段限一次,你可以指定至多X名与你距离不大于你的体力值的角色。这些角色选择一项:①令你摸一张牌。②回复1点体力,然后交给你一张牌。(X为你的攻击范围且至少为1)", + misa_yehuo: "业火", + misa_yehuo_info: + "一名角色的摸牌阶段开始时,若其在你的攻击范围内,你可以弃置X张牌并选择一项:①对其造成1点火属性伤害。②令其于此摸牌阶段放弃摸牌。(X为你与其的的距离)", + yusa_misa: "通灵", + yusa_misa_info: "当你发动的〖演艺〗结算完成之后,你可以将武将牌翻面。", + misa_yusa: "归魂", + misa_yusa_info: "当你发动的〖业火〗结算完成后,你可以将武将牌翻面。", + masato_baoquan: "暴拳", + masato_baoquan_info: + "锁定技,当你即将造成伤害时,你选择一项:1.令此伤害+2并减1点体力上限。2.防止此伤害。", + iwasawa_yinhang: "引吭", + iwasawa_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", + iwasawa_mysong: "My Song", + iwasawa_mysong_info: + "锁定技,当你即将进行濒死结算时,取消之。回合开始时,若你的体力值小于1,则你获得技能〖奋音〗直到回合结束。回合结束时,若你的体力值小于1,你死亡。", + iwasawa_fenyin: "奋音", + iwasawa_fenyin_info: + "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", + iwasawa_refenyin: "奋音", + iwasawa_refenyin_info: + "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。", //卡牌花色的计算不受〖红颜〗等技能的影响 - kengo_weishang:'伪伤', - kengo_weishang_sha:'伪伤', - kengo_weishang_shan:'伪伤', - kengo_weishang_info:'出牌阶段限一次,你可以废除一个装备栏并摸两张牌。若你的武器栏已废除,则你使用【杀】的次数上限+1,且当你使用【杀】指定目标后,目标角色弃置一张牌;若你的防具栏已废除,则你可以将一张牌当做【闪】使用或打出;若你的攻击/防御坐骑栏已废除,则你至其他角色的距离-1/其他角色至你的距离-1。', - kengo_guidui:'归队', - kengo_guidui_info:'锁定技,准备阶段,若你有已废除的装备栏,则你恢复这些装备栏,且本局游戏内发动【伪伤】时不能废除这些装备栏。', - yoshino_jueyi:'决义', - yoshino_jueyi_info:'出牌阶段开始时,你可以选择一名其他角色。你摸一张牌并与其猜拳(平局则重来)。若你赢,你对其造成1点伤害。若你没赢,你本阶段内使用牌时不能指定其为目标。', - yui_jiang:'激昂', - yui_jiang_info:'每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。', - yui_lieyin:'烈音', - yui_lieyin_info:'锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。', - yui_takaramono:'珍宝', - yui_takaramono_info:'觉醒技,准备阶段,若你满足以下条件中的至少两个:①体力值不大于1;②场上有已死亡的角色;③已因〖激昂〗累计获得过至少三张牌;则你获得技能〖引吭〗,将〖烈音〗描述中的「你选择」改为「你可选择」,然后加1点体力上限并回复1点体力。', + kengo_weishang: "伪伤", + kengo_weishang_sha: "伪伤", + kengo_weishang_shan: "伪伤", + kengo_weishang_info: + "出牌阶段限一次,你可以废除一个装备栏并摸两张牌。若你的武器栏已废除,则你使用【杀】的次数上限+1,且当你使用【杀】指定目标后,目标角色弃置一张牌;若你的防具栏已废除,则你可以将一张牌当做【闪】使用或打出;若你的攻击/防御坐骑栏已废除,则你至其他角色的距离-1/其他角色至你的距离-1。", + kengo_guidui: "归队", + kengo_guidui_info: + "锁定技,准备阶段,若你有已废除的装备栏,则你恢复这些装备栏,且本局游戏内发动【伪伤】时不能废除这些装备栏。", + yoshino_jueyi: "决义", + yoshino_jueyi_info: + "出牌阶段开始时,你可以选择一名其他角色。你摸一张牌并与其猜拳(平局则重来)。若你赢,你对其造成1点伤害。若你没赢,你本阶段内使用牌时不能指定其为目标。", + yui_jiang: "激昂", + yui_jiang_info: + "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", + yui_lieyin: "烈音", + yui_lieyin_info: + "锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。", + yui_takaramono: "珍宝", + yui_takaramono_info: + "觉醒技,准备阶段,若你满足以下条件中的至少两个:①体力值不大于1;②场上有已死亡的角色;③已因〖激昂〗累计获得过至少三张牌;则你获得技能〖引吭〗,将〖烈音〗描述中的「你选择」改为「你可选择」,然后加1点体力上限并回复1点体力。", //ユイ/孙笨双将组合时,孙笨的〖激昂〗不计入〖珍宝〗的次数统计 - yui_yinhang:'引吭', - yui_yinhang_info:'锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。', - tsumugi_mugyu:'姆啾', - tsumugi_mugyu_info:'当你成为牌的目标后,若你的手牌数小于体力上限,则你可以摸一张牌。', - tsumugi_huilang:'回廊', - tsumugi_huilang2:'回廊', - tsumugi_huilang_info:'回合结束时,你可以将任意张牌扣置于武将牌下(均称为「隐」)。回合开始时,你获得所有「隐」,然后可令等量的角色各摸一张牌。', + yui_yinhang: "引吭", + yui_yinhang_info: "锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。", + tsumugi_mugyu: "姆啾", + tsumugi_mugyu_info: "当你成为牌的目标后,若你的手牌数小于体力上限,则你可以摸一张牌。", + tsumugi_huilang: "回廊", + tsumugi_huilang2: "回廊", + tsumugi_huilang_info: + "回合结束时,你可以将任意张牌扣置于武将牌下(均称为「隐」)。回合开始时,你获得所有「隐」,然后可令等量的角色各摸一张牌。", //〖回廊〗涉及的所有卡牌移动的结算不会触发〖良姻〗 - haruka_shuangche:'双掣', - kanata_shuangche:'双掣', - haruka_shuangche_backup:'双掣', - haruka_shuangche_info:'出牌阶段,你可以视为使用任意基本牌或普通锦囊牌。此牌结算完成后,你选择一项:1.弃置X张牌。2.失去1点体力且本回合内不能再发动〖双掣〗。(X为你于此回合内发动过〖双掣〗的次数)', + haruka_shuangche: "双掣", + kanata_shuangche: "双掣", + haruka_shuangche_backup: "双掣", + haruka_shuangche_info: + "出牌阶段,你可以视为使用任意基本牌或普通锦囊牌。此牌结算完成后,你选择一项:1.弃置X张牌。2.失去1点体力且本回合内不能再发动〖双掣〗。(X为你于此回合内发动过〖双掣〗的次数)", //你不能以此法使用〖回魂〗 - saya_shouji:'授计', - saya_shouji_info:'每回合限一次,当你使用的牌结算完成后,你可以将此牌对应的所有实体牌交给一名其他角色。其可以使用这些牌中的一张,若如此做,你摸一张牌。', - saya_powei:'破围', - saya_powei_info:'限定技,回合结束后,你可以选择一名体力值大于你的其他角色。你与其交替进行额外回合,直到你与其中的一名角色死亡或进行到九个回合。你于回合开始时进行判定,若结果为红色,则你对其造成1点伤害。此过程中其他角色不计入距离和座次计算。', - saya_judge:'破围', - saya_nodis:'破围', + saya_shouji: "授计", + saya_shouji_info: + "每回合限一次,当你使用的牌结算完成后,你可以将此牌对应的所有实体牌交给一名其他角色。其可以使用这些牌中的一张,若如此做,你摸一张牌。", + saya_powei: "破围", + saya_powei_info: + "限定技,回合结束后,你可以选择一名体力值大于你的其他角色。你与其交替进行额外回合,直到你与其中的一名角色死亡或进行到九个回合。你于回合开始时进行判定,若结果为红色,则你对其造成1点伤害。此过程中其他角色不计入距离和座次计算。", + saya_judge: "破围", + saya_nodis: "破围", //〖破围〗不会因为〖铁骑〗无效 - inari_baiwei:'摆尾', - inari_baiwei_draw:'摆尾', - inari_baiwei_info:'你可以将一张♦牌当做任意基本牌使用或打出。此牌结算完成后,你摸一张牌。', + inari_baiwei: "摆尾", + inari_baiwei_draw: "摆尾", + inari_baiwei_info: "你可以将一张♦牌当做任意基本牌使用或打出。此牌结算完成后,你摸一张牌。", //你不能以此法使用【毒】 - inari_baiwei_backup:'摆尾', - inari_baiwei_sha:'摆尾', - inari_baiwei_shan:'摆尾', - inari_huhun:'狐魂', - inari_huhun_info:'锁定技,你的♣牌的花色均视为♦。你的手牌上限+1。', - shiina_qingshen:'轻身', - shiina_qingshen_info:'当你受到或造成伤害后,你可以获得此次伤害的渠道对应的实体牌,然后将等量的牌置于你的武将牌上,称为「轻」。锁定技,你的手牌上限和攻击范围+X(X为「轻」数)。', - shiina_feiyan:'飞燕', - shiina_feiyan_info:'一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能〖铁骑〗。', - shiina_retieji:'铁骑', + inari_baiwei_backup: "摆尾", + inari_baiwei_sha: "摆尾", + inari_baiwei_shan: "摆尾", + inari_huhun: "狐魂", + inari_huhun_info: "锁定技,你的♣牌的花色均视为♦。你的手牌上限+1。", + shiina_qingshen: "轻身", + shiina_qingshen_info: + "当你受到或造成伤害后,你可以获得此次伤害的渠道对应的实体牌,然后将等量的牌置于你的武将牌上,称为「轻」。锁定技,你的手牌上限和攻击范围+X(X为「轻」数)。", + shiina_feiyan: "飞燕", + shiina_feiyan_info: + "一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能〖铁骑〗。", + shiina_retieji: "铁骑", //你不能对稻荷和多鲁基发动〖飞燕〗 - sunohara_chengshuang:'成双', - sunohara_chengshuang_phase:'成双', - sunohara_chengshuang_info:'锁定技,游戏开始时,你选择你的性别。回合开始时,你可以切换你的性别。', - sunohara_tiaoyin:'挑引', - sunohara_tiaoyin_info:'出牌阶段限一次,你可以弃置任意张花色各不相同的手牌,然后获得等量角色区域内的各一张牌。若你以此法获得了异性角色区域内的牌,则你失去1点体力。', - sunohara_jianren:'坚忍', - sunohara_jianren_info:'当你受到伤害后,你可以令一名角色摸一张牌。若伤害无来源或来源与你性别不同,则改为摸三张牌。', - rin_baoqiu:'暴球', - rin_baoqiu_info:'锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。', - sasami_miaobian:'喵变', - sasami_miaobian_info:'当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗。', - sasami_gongqing:"公清", - sasami_gongqing_info:"锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", - sasami_funan:'复难', - sasami_funan_info:'其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。', - sasami_baoqiu:'暴球', - sasami_baoqiu_info:'锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。', - akane_jugu:'巨贾', - akane_jugu_info:'锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。', - akane_quanqing:'权倾', - akane_quanqing_info:'出牌阶段,你可选择:1.弃置一张点数大于10的牌并对攻击范围内的一名其他角色造成1点伤害;2.弃置一张点数大于6的牌并弃置攻击范围内的一名其他角色区域内的一张牌。3.弃置一张牌并令攻击范围内的一名其他角色摸一张牌。', - akane_yifu:'蚁附', - akane_yifu2:'蚁附', - akane_yifu_info:'主公技,其他键势力角色的出牌阶段限一次,其可交给你一张手牌。然后你摸一张牌,并将一张手牌交给该角色。', - doruji_feiqu:'肥躯', - doruji_feiqu_info:'锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。', - yuiko_fenglun:'锋论', - yuiko_fenglun_info:'出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本阶段内使用牌没有次数和距离限制。', - yuiko_dilve:'底略', - yuiko_dilve_info:'你可以使用牌堆底的一张牌进行拼点。当你拼点后,你可以获得两张拼点牌。', - riki_spwenji:'问计', - riki_spwenji_info:'出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。', - riki_nvzhuang:'女装', - riki_nvzhuang_info:'锁定技,此武将牌视为包含女性性别。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。', - riki_mengzhong:'梦终', - riki_mengzhong_info:'觉醒技,准备阶段,若你已因〖问计〗获得了三张或更多的牌,则你加1点体力上限并回复1点体力,失去〖问计〗并获得〖重振〗。', - riki_chongzhen:'重振', - riki_chongzhen_info:'出牌阶段开始时,你可以与一名角色拼点。若你赢,你获得该角色手牌区,装备区,判定区的各一张牌;若你没赢,你于此阶段内使用牌时不能指定其他角色为目标。', - hisako_yinbao:'音爆', - hisako_yinbao_info:'当你受到伤害/回复体力后,你可以判定。若结果为♠,则你对一名其他角色造成1点雷属性伤害。', - hisako_zhuanyun:'转运', - hisako_zhuanyun_info:'锁定技,你的判定会朝向对你有利的方向倾斜。', - hinata_qiulve:'球略', - hinata_qiulve_info:'你可以将一张非基本牌当做【杀】使用或打出(无距离限制)。你以此法使用的红色【杀】不可被响应,黑色【杀】不计入使用次数限制。', - hinata_ehou:'扼喉', - hinata_ehou_info:'其他角色对你使用的牌结算完成后,你可对其使用一张【杀】。若此【杀】造成伤害,则你摸一张牌。', - noda_fengcheng:'奉承', - noda_fengcheng_info:'锁定技,其他角色交给你牌后,其摸一张牌。', - noda_xunxin:'寻衅', - noda_xunxin2:'寻衅', - noda_xunxin_info:'出牌阶段限X次,你可以视为对一名体力值不小于你的角色使用【决斗】。若如此做,此【决斗】结算完成后,没赢的角色交给赢的角色一张牌。(X为你的体力值)', - tomoya_shangxian:'伤弦', - tomoya_shangxian_info:'锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。', - tomoya_wangjin:'往今', - tomoya_wangjin_info:'每项每轮各限一次。一名其他角色的回合结束时,若其:在你的攻击范围内,你可令其摸一张牌。若其的体力值小于你,则你摸一张牌,并可交给其一张牌。不在你的攻击范围内,则你摸两张牌,并令其弃置你的一张手牌。若其的体力值大于你,则你视为对其使用一张【杀】(无距离限制)。', - nagisa_tiandu:'天妒', - nagisa_tiandu_info:'当你的判定牌生效后,你可以获得此牌。', - nagisa_fuxin:'抚心', - nagisa_fuxin_info:'当一名角色于回合外受到伤害,或其手牌被其他角色弃置或获得后,你可以令其判定。若结果为:红色,其摸一张牌。黑色,当前回合角色弃置一张牌。', - ayato_jianshen:'僭神', - ayato_jianshen_info:'锁定技,你手牌中的【杀】均视为神属性。', - ayato_zonghuan:'纵幻', - ayato_zonghuan_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后选择一项:将其中的一张牌置入弃牌堆,或以该角色的视角使用其中的一张,然后摸一张牌。', - ao_xishi:'习事', - ao_xishi_info:'锁定技,当你使用或打出♦牌时,或其他角色使用♦牌指定你为目标后,你摸一张牌。', - ao_kuihun:'窥魂', - ao_kuihun_info:'其他角色进入濒死状态时,你可以摸一张牌,然后观看其手牌并将其中一张牌置于你的武将牌上,称为「蝶」。你使用与一张「蝶」花色相同的牌时无距离和次数限制。你的手牌上限+X(X为蝶数)。', - ao_shixin:'释心', - ao_shixin_info:'觉醒技,准备阶段,若你的「蝶」中包含至少三种花色,则你加1点体力上限并回复1点体力,失去〖窥魂〗并获得〖蝶归〗。', - ao_diegui:'蝶归', - ao_diegui_backup:'蝶归', - ao_diegui_info:'出牌阶段限一次,你可以将一张「蝶」交给一名角色,该角色摸两张牌并复原武将牌。', - yuzuru_wuxin:'无心', - yuzuru_wuxin_info:'结束阶段,你可以选择一项:失去1点体力并令一名角色摸两张牌,或弃置两张牌并回复1点体力。', - yuzuru_deyi:'得义', - yuzuru_deyi_info:'觉醒技,当有其他角色死亡后,你减1点体力上限并回复1点体力,失去技能〖无心〗,获得技能〖往生〗〖困奋〗和〖去疾〗。', - yuzuru_wangsheng:'往生', - yuzuru_wangsheng_info:'觉醒技,当你即将死亡时,你防止此次死亡。你可以将任意张牌交给一名其他角色,然后减1点体力上限并将体力回复至2点,修改技能〖困奋〗和〖去疾〗。', - yuzuru_kunfen:'困奋', - yuzuru_kunfen_info:'锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。', - yuzuru_quji:'去疾', - yuzuru_quji_info:'出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)', - yuzuru_kunfen_rewrite:'困奋·改', - yuzuru_kunfen_rewrite_info:'锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。', - yuzuru_quji_rewrite:'去疾·改', - yuzuru_quji_rewrite_info:'出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)', - yuzuru_bujin:'步进', - yuzuru_bujin_info:'锁定技,己方其他角色计算与其他角色的距离-1且摸牌阶段的额定摸牌数+1。', - kanade_mapo:'麻婆', - kanade_mapo_info:'你可以将一张♥牌当做【麻婆豆腐】使用。你使用的【麻婆豆腐】可以多指定一个目标。', - kanade_benzhan:'奔战', - kanade_benzhan_info:'每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。', - mio_tuifu:'推腐', - mio_tuifu_info:'锁定技,当一名角色对一名同性角色造成伤害时,你摸一张牌。', - mio_tishen:'替身', - mio_tishen_info:'限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鸟】。', - midori_nonghuan:'弄幻', - midori_nonghuan_info:'出牌阶段限X次(X为你的体力值),你可以获得一名本阶段内未选择过的其他角色的区域内的一张牌。你摸一张牌,然后将一张牌交给该角色。然后你清除此技能结算过程中所有卡牌移动事件的移动记录。', + sunohara_chengshuang: "成双", + sunohara_chengshuang_phase: "成双", + sunohara_chengshuang_info: "锁定技,游戏开始时,你选择你的性别。回合开始时,你可以切换你的性别。", + sunohara_tiaoyin: "挑引", + sunohara_tiaoyin_info: + "出牌阶段限一次,你可以弃置任意张花色各不相同的手牌,然后获得等量角色区域内的各一张牌。若你以此法获得了异性角色区域内的牌,则你失去1点体力。", + sunohara_jianren: "坚忍", + sunohara_jianren_info: + "当你受到伤害后,你可以令一名角色摸一张牌。若伤害无来源或来源与你性别不同,则改为摸三张牌。", + rin_baoqiu: "暴球", + rin_baoqiu_info: + "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", + sasami_miaobian: "喵变", + sasami_miaobian_info: + "当你的体力值变为:3以下时,你获得技能〖公清〗,2以下时,你获得技能〖复难〗,1以下时,你获得技能〖暴球〗。", + sasami_gongqing: "公清", + sasami_gongqing_info: + "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", + sasami_funan: "复难", + sasami_funan_info: + "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", + sasami_baoqiu: "暴球", + sasami_baoqiu_info: + "锁定技,你的攻击范围+2。当你使用【杀】指定目标后,你进行判定。若结果:为红色,此【杀】对其的伤害值基数+1;为黑色,其无法闪避此【杀】;为♠/♥,此【杀】不计入使用次数限制且你摸一张牌;为♦/♣,目标角色的所有非锁定技失效直到回合结束,且你弃置其一张牌。", + akane_jugu: "巨贾", + akane_jugu_info: "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", + akane_quanqing: "权倾", + akane_quanqing_info: + "出牌阶段,你可选择:1.弃置一张点数大于10的牌并对攻击范围内的一名其他角色造成1点伤害;2.弃置一张点数大于6的牌并弃置攻击范围内的一名其他角色区域内的一张牌。3.弃置一张牌并令攻击范围内的一名其他角色摸一张牌。", + akane_yifu: "蚁附", + akane_yifu2: "蚁附", + akane_yifu_info: + "主公技,其他键势力角色的出牌阶段限一次,其可交给你一张手牌。然后你摸一张牌,并将一张手牌交给该角色。", + doruji_feiqu: "肥躯", + doruji_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", + yuiko_fenglun: "锋论", + yuiko_fenglun_info: + "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本阶段内使用牌没有次数和距离限制。", + yuiko_dilve: "底略", + yuiko_dilve_info: "你可以使用牌堆底的一张牌进行拼点。当你拼点后,你可以获得两张拼点牌。", + riki_spwenji: "问计", + riki_spwenji_info: + "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", + riki_nvzhuang: "女装", + riki_nvzhuang_info: + "锁定技,此武将牌视为包含女性性别。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。", + riki_mengzhong: "梦终", + riki_mengzhong_info: + "觉醒技,准备阶段,若你已因〖问计〗获得了三张或更多的牌,则你加1点体力上限并回复1点体力,失去〖问计〗并获得〖重振〗。", + riki_chongzhen: "重振", + riki_chongzhen_info: + "出牌阶段开始时,你可以与一名角色拼点。若你赢,你获得该角色手牌区,装备区,判定区的各一张牌;若你没赢,你于此阶段内使用牌时不能指定其他角色为目标。", + hisako_yinbao: "音爆", + hisako_yinbao_info: + "当你受到伤害/回复体力后,你可以判定。若结果为♠,则你对一名其他角色造成1点雷属性伤害。", + hisako_zhuanyun: "转运", + hisako_zhuanyun_info: "锁定技,你的判定会朝向对你有利的方向倾斜。", + hinata_qiulve: "球略", + hinata_qiulve_info: + "你可以将一张非基本牌当做【杀】使用或打出(无距离限制)。你以此法使用的红色【杀】不可被响应,黑色【杀】不计入使用次数限制。", + hinata_ehou: "扼喉", + hinata_ehou_info: + "其他角色对你使用的牌结算完成后,你可对其使用一张【杀】。若此【杀】造成伤害,则你摸一张牌。", + noda_fengcheng: "奉承", + noda_fengcheng_info: "锁定技,其他角色交给你牌后,其摸一张牌。", + noda_xunxin: "寻衅", + noda_xunxin2: "寻衅", + noda_xunxin_info: + "出牌阶段限X次,你可以视为对一名体力值不小于你的角色使用【决斗】。若如此做,此【决斗】结算完成后,没赢的角色交给赢的角色一张牌。(X为你的体力值)", + tomoya_shangxian: "伤弦", + tomoya_shangxian_info: + "锁定技,你计算与其他角色的距离时始终从逆时针方向计算。出牌阶段开始时,你可摸一张牌,并改变此方向。", + tomoya_wangjin: "往今", + tomoya_wangjin_info: + "每项每轮各限一次。一名其他角色的回合结束时,若其:在你的攻击范围内,你可令其摸一张牌。若其的体力值小于你,则你摸一张牌,并可交给其一张牌。不在你的攻击范围内,则你摸两张牌,并令其弃置你的一张手牌。若其的体力值大于你,则你视为对其使用一张【杀】(无距离限制)。", + nagisa_tiandu: "天妒", + nagisa_tiandu_info: "当你的判定牌生效后,你可以获得此牌。", + nagisa_fuxin: "抚心", + nagisa_fuxin_info: + "当一名角色于回合外受到伤害,或其手牌被其他角色弃置或获得后,你可以令其判定。若结果为:红色,其摸一张牌。黑色,当前回合角色弃置一张牌。", + ayato_jianshen: "僭神", + ayato_jianshen_info: "锁定技,你手牌中的【杀】均视为神属性。", + ayato_zonghuan: "纵幻", + ayato_zonghuan_info: + "出牌阶段限一次,你可以观看一名其他角色的手牌,然后选择一项:将其中的一张牌置入弃牌堆,或以该角色的视角使用其中的一张,然后摸一张牌。", + ao_xishi: "习事", + ao_xishi_info: "锁定技,当你使用或打出♦牌时,或其他角色使用♦牌指定你为目标后,你摸一张牌。", + ao_kuihun: "窥魂", + ao_kuihun_info: + "其他角色进入濒死状态时,你可以摸一张牌,然后观看其手牌并将其中一张牌置于你的武将牌上,称为「蝶」。你使用与一张「蝶」花色相同的牌时无距离和次数限制。你的手牌上限+X(X为蝶数)。", + ao_shixin: "释心", + ao_shixin_info: + "觉醒技,准备阶段,若你的「蝶」中包含至少三种花色,则你加1点体力上限并回复1点体力,失去〖窥魂〗并获得〖蝶归〗。", + ao_diegui: "蝶归", + ao_diegui_backup: "蝶归", + ao_diegui_info: "出牌阶段限一次,你可以将一张「蝶」交给一名角色,该角色摸两张牌并复原武将牌。", + yuzuru_wuxin: "无心", + yuzuru_wuxin_info: + "结束阶段,你可以选择一项:失去1点体力并令一名角色摸两张牌,或弃置两张牌并回复1点体力。", + yuzuru_deyi: "得义", + yuzuru_deyi_info: + "觉醒技,当有其他角色死亡后,你减1点体力上限并回复1点体力,失去技能〖无心〗,获得技能〖往生〗〖困奋〗和〖去疾〗。", + yuzuru_wangsheng: "往生", + yuzuru_wangsheng_info: + "觉醒技,当你即将死亡时,你防止此次死亡。你可以将任意张牌交给一名其他角色,然后减1点体力上限并将体力回复至2点,修改技能〖困奋〗和〖去疾〗。", + yuzuru_kunfen: "困奋", + yuzuru_kunfen_info: + "锁定技,结束阶段,你失去1点体力并摸两张牌。然后你可以将两张牌交给一名其他角色。", + yuzuru_quji: "去疾", + yuzuru_quji_info: + "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。若你以此法弃置了黑色牌,则你失去1点体力。(X为你已损失的体力值)", + yuzuru_kunfen_rewrite: "困奋·改", + yuzuru_kunfen_rewrite_info: "锁定技,结束阶段,你摸两张牌。然后你可以将两张牌交给一名其他角色。", + yuzuru_quji_rewrite: "去疾·改", + yuzuru_quji_rewrite_info: + "出牌阶段限一次,你可以弃置X张牌并选择至多等量已受伤的其他角色,这些角色各回复1点体力。(X为你已损失的体力值)", + yuzuru_bujin: "步进", + yuzuru_bujin_info: "锁定技,己方其他角色计算与其他角色的距离-1且摸牌阶段的额定摸牌数+1。", + kanade_mapo: "麻婆", + kanade_mapo_info: "你可以将一张♥牌当做【麻婆豆腐】使用。你使用的【麻婆豆腐】可以多指定一个目标。", + kanade_benzhan: "奔战", + kanade_benzhan_info: + "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", + mio_tuifu: "推腐", + mio_tuifu_info: "锁定技,当一名角色对一名同性角色造成伤害时,你摸一张牌。", + mio_tishen: "替身", + mio_tishen_info: + "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鸟】。", + midori_nonghuan: "弄幻", + midori_nonghuan_info: + "出牌阶段限X次(X为你的体力值),你可以获得一名本阶段内未选择过的其他角色的区域内的一张牌。你摸一张牌,然后将一张牌交给该角色。然后你清除此技能结算过程中所有卡牌移动事件的移动记录。", //即技能结算完成后,所有涉及到的牌移动事件不会再被getHistory获取 - midori_tishen:'替身', - midori_tishen_info:'限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鱼】。', - kyoko_juwu:'聚物', - kyoko_juwu_info:'你的回合外,当有装备牌进入弃牌堆后,若这些牌不是从你的区域移动的,则你可以获得这些牌。', - kyoko_zhengyi:'整遗', - kyoko_zhengyi_info:'锁定技,若你装备区的花色数:大于等于1,你视为拥有〖精策〗;大于等于2,你视为拥有〖涉猎〗:大于等于3,你视为拥有〖制衡〗;大于等于4,你将〖精策〗和〖制衡〗改为界限突破版本。', - kyoko_jingce:'精策', - kyoko_shelie:'涉猎', - kyoko_zhiheng:'制衡', - shizuru_nianli:'念力', - shizuru_nianli_info:'每轮限一次,你可以展示一张♦/♣/♥/♠手牌,然后视为使用一张不计入次数限制和记录的雷【杀】/【闪】/【桃】/【无懈可击】。', - shizuru_benzhan:'奔战', - shizuru_benzhan_info:'每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。', - shiorimiyuki_banyin:'伴音', - shiorimiyuki_banyin_info:'当你受到伤害或回复体力后,你可令一名其他角色回复1点体力。', - shiorimiyuki_tingxian:'铤险', - shiorimiyuki_tingxian_info:'出牌阶段开始时,你可以摸至多三张牌。若如此做,你回复1点体力,且此阶段结束时你失去X点体力。(X为你得到的牌中仍在手牌区的牌的数量)', - shiorimiyuki_tingxian2:'铤险', - miki_shenqiang:'神枪', - miki_shenqiang_info:'锁定技,游戏开始时,你将一张【海德洛格拉迪尔特·改】和一张【望远镜】置入你的装备区。你装备区内的武器牌和宝物牌不能被其他角色弃置。', - miki_huanmeng:'幻梦', - miki_huanmeng_info:'准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)', - miki_zhiluo:'治裸', - miki_zhiluo_info:'锁定技,一名其他角色的回合结束时,若其在你的攻击范围内且其装备区内没有牌,则你选择:①摸一张牌。②视为对其使用一张【杀】。', - miki_hydrogladiator:'海德洛', - miki_hydrogladiator_info:'全名为【海德洛格拉迪尔特·改】。锁定技,当你因执行【杀】的效果而对目标角色造成伤害后,你弃置所有至目标角色距离为1的其他角色的一张牌或弃置其两张牌。', - miki_hydrogladiator_skill:'海德洛格拉迪尔特·改', - miki_binoculars:'望远镜', - miki_binoculars_info:'锁定技,其他角色的手牌对你可见。', - shiori_huijuan:'绘卷', - shiori_huijuan_discard:'绘卷', - shiori_huijuan_info:'锁定技,其他角色的结束阶段开始时,你可以视为使用一张该角色本回合出牌阶段内使用过的基本牌或普通锦囊牌。准备阶段开始时,若你自上个回合起以此法使用的牌数不小于X,则你选择一项:①弃置装备区或判定区内的一张牌。②跳过本回合的出牌阶段。(X为场上玩家数的一半且至少为2)', - kaori_siyuan:'思愿', - kaori_siyuan_info:'出牌阶段,你可以将一张装备牌或延时锦囊牌置于一名其他角色的装备区内,然后可以视为使用一张基本牌或普通锦囊牌。', - akiko_dongcha:'洞察', - akiko_dongcha_info_identity:'锁定技,其他角色的手牌对你可见。游戏开始时,你令其他角色的身份牌对你可见。', - akiko_dongcha_info:'锁定技,其他角色的手牌对你可见。', - abyusa_jueqing:'绝情', - abyusa_jueqing_info:'当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。', - abyusa_jueqing_1st:'绝情', - abyusa_jueqing_rewrite:'绝情·改', - abyusa_jueqing_rewrite_info:'锁定技,你即将造成的伤害均视为失去体力。', - abyusa_dunying:'遁影', - abyusa_dunying_info:'锁定技,其他角色计算与你的距离时+X。准备阶段和结束阶段,你摸X张牌(X为你已损失的体力值)。', - godan_yuanyi:'远忆', - godan_yuanyi_info:'锁定技,回合开始时,你摸X张牌并进行一个额外的出牌阶段。(X为游戏轮数且至多为3)', - godan_feiqu:'肥躯', - godan_feiqu_info:'锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。', - godan_xiaoyuan:'消元', - godan_xiaoyuan_info:'觉醒技,当你扣减体力时,若你的体力值小于4,则你减3点体力上限并摸三张牌,失去【肥躯】。', - yuu_lveduo:'掠夺', - yuu_lveduo_info:'每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。', - yuu_lveduo_full_info:'每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面,获得该角色武将牌上所有的带有「Charlotte」标签的技能,且该角色失去这些技能。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。', - ryoichi_baoyi:'爆衣', - ryoichi_baoyi_info:'锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①令一名其他女性角色失去1点体力。②弃置一名其他非女性角色区域内的两张牌。', - ryoichi_tuipi:'褪皮', - ryoichi_tuipi_info:'锁定技,你不是【顺手牵羊】和【过河拆桥】的合法目标。你装备区的牌于弃牌阶段内计入手牌上限。', - kotori_yumo:'驭魔', - kotori_yumo_damage:'驭魔', - kotori_yumo_gain:'驭魔', - kotori_yumo_info:'锁定技,游戏开始时,你获得蓝色、红色、绿色、黄色、灰色魔物各一个。当有角色受到伤害后,若你没有对应的标记,你根据其势力获得一个对应魔物:魏:蓝、蜀:红、吴:绿、群:黄、灰:晋、键:紫。回合开始时,你可以弃置一个对应的魔物并获得以下技能之一直到回合结束:蓝:魏业、红:蜀义、绿:吴耀、黄:群心、灰:晋势、紫:键魂。', - kotori_skill_wei:'魏业', - kotori_skill_wei_info:'回合开始时,你可以弃置一张牌并指定一名其他角色,该角色须弃置一张牌,否则你摸一张牌。', - kotori_skill_shu:'蜀义', - kotori_skill_shu_info:'你使用【杀】上限+1;出牌阶段结束时,若你于此阶段使用【杀】次数不少于2,摸一张牌。', - kotori_skill_wu:'吴耀', - kotori_skill_wu_info:'回合结束时,若你的手牌数不等于你的体力值,则你摸一张牌。', - kotori_skill_qun:'群心', - kotori_skill_qun_info:'锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1。', - kotori_skill_key:'键魂', - kotori_skill_key_info:'出牌阶段限一次,你可以摸一张牌并获得1点护甲。若如此做,你于当前回合结束时失去1点体力。', - kotori_skill_jin:'晋势', - kotori_skill_jin_info:'摸牌阶段结束时,你可以展示你于此阶段内因摸牌而得到的牌。若这些牌的花色均不同,则你摸一张牌。', - kotori_yumo_wei:'魔物', - kotori_yumo_shu:'魔物', - kotori_yumo_wu:'魔物', - kotori_yumo_qun:'魔物', - kotori_yumo_key:'魔物', - kotori_yumo_jin:'魔物', - kotori_huazhan:'花绽', - kotori_huazhan_info:'每回合每种魔物限一次,你可将一个蓝色/红色/绿色/黄色/紫色/灰色魔物当做【树上开花】使用。', - jojiro_shensu:'神速', - jojiro_shensu_info:'你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。', - jojiro_shensu1:'神速', - jojiro_shensu2:'神速', - jojiro_shensu4:'神速', - jojiro_shunying:'瞬影', - jojiro_shunying_info:'锁定技,回合结束时,若你本回合内跳过了阶段,则你选择一项:1.失去1点体力。2.移动至多X格并摸X张牌(X为你本回合内跳过的阶段数)。', - shiroha_yuzhao:'预兆', - shiroha_yuzhao_umi:'预兆', - shiroha_yuzhao_info:'锁定技,游戏开始时,你将牌堆顶的X张牌扣置于你的武将牌上,称为「兆」。一名角色的回合开始时,若你有「兆」且其至你的距离不大于1,则你将牌堆顶的X张牌扣置为「兆」,然后将等量的「兆」置于牌堆顶。(X为势力数)', - shiroha_guying:'孤影', - shiroha_guying_info:'锁定技,每回合限一次,当你受到伤害/对其他角色造成伤害时,你进行判定。若结果为红色/黑色,此伤害-1/+1。', - shiroha_guying_rewrite:'孤影·改', - shiroha_guying_rewrite_info:'当你受到伤害/对其他角色造成伤害时,你可进行判定。若结果为红色/黑色,此伤害-1/+1。', - shiroha_jiezhao:'解兆', - shiroha_jiezhao_info:'一名角色的判定牌生效前,你可打出一张「兆」代替之。当你以此法移去最后一张「兆」后,你加1点体力上限并回复1点体力,然后修改〖孤影〗并随机获得以下技能中的一个:〖炒饭〗/〖习事〗/〖呣啾〗/〖结伴〗。', + midori_tishen: "替身", + midori_tishen_info: + "限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鱼】。", + kyoko_juwu: "聚物", + kyoko_juwu_info: + "你的回合外,当有装备牌进入弃牌堆后,若这些牌不是从你的区域移动的,则你可以获得这些牌。", + kyoko_zhengyi: "整遗", + kyoko_zhengyi_info: + "锁定技,若你装备区的花色数:大于等于1,你视为拥有〖精策〗;大于等于2,你视为拥有〖涉猎〗:大于等于3,你视为拥有〖制衡〗;大于等于4,你将〖精策〗和〖制衡〗改为界限突破版本。", + kyoko_jingce: "精策", + kyoko_shelie: "涉猎", + kyoko_zhiheng: "制衡", + shizuru_nianli: "念力", + shizuru_nianli_info: + "每轮限一次,你可以展示一张♦/♣/♥/♠手牌,然后视为使用一张不计入次数限制和记录的雷【杀】/【闪】/【桃】/【无懈可击】。", + shizuru_benzhan: "奔战", + shizuru_benzhan_info: + "每回合限一次。当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。", + shiorimiyuki_banyin: "伴音", + shiorimiyuki_banyin_info: "当你受到伤害或回复体力后,你可令一名其他角色回复1点体力。", + shiorimiyuki_tingxian: "铤险", + shiorimiyuki_tingxian_info: + "出牌阶段开始时,你可以摸至多三张牌。若如此做,你回复1点体力,且此阶段结束时你失去X点体力。(X为你得到的牌中仍在手牌区的牌的数量)", + shiorimiyuki_tingxian2: "铤险", + miki_shenqiang: "神枪", + miki_shenqiang_info: + "锁定技,游戏开始时,你将一张【海德洛格拉迪尔特·改】和一张【望远镜】置入你的装备区。你装备区内的武器牌和宝物牌不能被其他角色弃置。", + miki_huanmeng: "幻梦", + miki_huanmeng_info: + "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", + miki_zhiluo: "治裸", + miki_zhiluo_info: + "锁定技,一名其他角色的回合结束时,若其在你的攻击范围内且其装备区内没有牌,则你选择:①摸一张牌。②视为对其使用一张【杀】。", + miki_hydrogladiator: "海德洛", + miki_hydrogladiator_info: + "全名为【海德洛格拉迪尔特·改】。锁定技,当你因执行【杀】的效果而对目标角色造成伤害后,你弃置所有至目标角色距离为1的其他角色的一张牌或弃置其两张牌。", + miki_hydrogladiator_skill: "海德洛格拉迪尔特·改", + miki_binoculars: "望远镜", + miki_binoculars_info: "锁定技,其他角色的手牌对你可见。", + shiori_huijuan: "绘卷", + shiori_huijuan_discard: "绘卷", + shiori_huijuan_info: + "锁定技,其他角色的结束阶段开始时,你可以视为使用一张该角色本回合出牌阶段内使用过的基本牌或普通锦囊牌。准备阶段开始时,若你自上个回合起以此法使用的牌数不小于X,则你选择一项:①弃置装备区或判定区内的一张牌。②跳过本回合的出牌阶段。(X为场上玩家数的一半且至少为2)", + kaori_siyuan: "思愿", + kaori_siyuan_info: + "出牌阶段,你可以将一张装备牌或延时锦囊牌置于一名其他角色的装备区内,然后可以视为使用一张基本牌或普通锦囊牌。", + akiko_dongcha: "洞察", + akiko_dongcha_info_identity: + "锁定技,其他角色的手牌对你可见。游戏开始时,你令其他角色的身份牌对你可见。", + akiko_dongcha_info: "锁定技,其他角色的手牌对你可见。", + abyusa_jueqing: "绝情", + abyusa_jueqing_info: + "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。", + abyusa_jueqing_1st: "绝情", + abyusa_jueqing_rewrite: "绝情·改", + abyusa_jueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。", + abyusa_dunying: "遁影", + abyusa_dunying_info: + "锁定技,其他角色计算与你的距离时+X。准备阶段和结束阶段,你摸X张牌(X为你已损失的体力值)。", + godan_yuanyi: "远忆", + godan_yuanyi_info: + "锁定技,回合开始时,你摸X张牌并进行一个额外的出牌阶段。(X为游戏轮数且至多为3)", + godan_feiqu: "肥躯", + godan_feiqu_info: "锁定技,当你使用【杀】时,或你成为【杀】的目标后,你令此【杀】不可被响应。", + godan_xiaoyuan: "消元", + godan_xiaoyuan_info: + "觉醒技,当你扣减体力时,若你的体力值小于4,则你减3点体力上限并摸三张牌,失去【肥躯】。", + yuu_lveduo: "掠夺", + yuu_lveduo_info: + "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", + yuu_lveduo_full_info: + "每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面,获得该角色武将牌上所有的带有「Charlotte」标签的技能,且该角色失去这些技能。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。", + ryoichi_baoyi: "爆衣", + ryoichi_baoyi_info: + "锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①令一名其他女性角色失去1点体力。②弃置一名其他非女性角色区域内的两张牌。", + ryoichi_tuipi: "褪皮", + ryoichi_tuipi_info: + "锁定技,你不是【顺手牵羊】和【过河拆桥】的合法目标。你装备区的牌于弃牌阶段内计入手牌上限。", + kotori_yumo: "驭魔", + kotori_yumo_damage: "驭魔", + kotori_yumo_gain: "驭魔", + kotori_yumo_info: + "锁定技,游戏开始时,你获得蓝色、红色、绿色、黄色、灰色魔物各一个。当有角色受到伤害后,若你没有对应的标记,你根据其势力获得一个对应魔物:魏:蓝、蜀:红、吴:绿、群:黄、灰:晋、键:紫。回合开始时,你可以弃置一个对应的魔物并获得以下技能之一直到回合结束:蓝:魏业、红:蜀义、绿:吴耀、黄:群心、灰:晋势、紫:键魂。", + kotori_skill_wei: "魏业", + kotori_skill_wei_info: + "回合开始时,你可以弃置一张牌并指定一名其他角色,该角色须弃置一张牌,否则你摸一张牌。", + kotori_skill_shu: "蜀义", + kotori_skill_shu_info: + "你使用【杀】上限+1;出牌阶段结束时,若你于此阶段使用【杀】次数不少于2,摸一张牌。", + kotori_skill_wu: "吴耀", + kotori_skill_wu_info: "回合结束时,若你的手牌数不等于你的体力值,则你摸一张牌。", + kotori_skill_qun: "群心", + kotori_skill_qun_info: + "锁定技,弃牌阶段开始时,若你的手牌数比体力值多2或更多,你本回合手牌上限+1;若你已损失体力值大于1,你手牌上限+1。", + kotori_skill_key: "键魂", + kotori_skill_key_info: + "出牌阶段限一次,你可以摸一张牌并获得1点护甲。若如此做,你于当前回合结束时失去1点体力。", + kotori_skill_jin: "晋势", + kotori_skill_jin_info: + "摸牌阶段结束时,你可以展示你于此阶段内因摸牌而得到的牌。若这些牌的花色均不同,则你摸一张牌。", + kotori_yumo_wei: '魔物', + kotori_yumo_shu: '魔物', + kotori_yumo_wu: '魔物', + kotori_yumo_qun: '魔物', + kotori_yumo_key: '魔物', + kotori_yumo_jin: '魔物', + kotori_huazhan: "花绽", + kotori_huazhan_info: + "每回合每种魔物限一次,你可将一个蓝色/红色/绿色/黄色/紫色/灰色魔物当做【树上开花】使用。", + jojiro_shensu: "神速", + jojiro_shensu_info: + "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", + jojiro_shensu1: "神速", + jojiro_shensu2: "神速", + jojiro_shensu4: "神速", + jojiro_shunying: "瞬影", + jojiro_shunying_info: + "锁定技,回合结束时,若你本回合内跳过了阶段,则你选择一项:1.失去1点体力。2.移动至多X格并摸X张牌(X为你本回合内跳过的阶段数)。", + shiroha_yuzhao: "预兆", + shiroha_yuzhao_umi: "预兆", + shiroha_yuzhao_info: + "锁定技,游戏开始时,你将牌堆顶的X张牌扣置于你的武将牌上,称为「兆」。一名角色的回合开始时,若你有「兆」且其至你的距离不大于1,则你将牌堆顶的X张牌扣置为「兆」,然后将等量的「兆」置于牌堆顶。(X为势力数)", + shiroha_guying: "孤影", + shiroha_guying_info: + "锁定技,每回合限一次,当你受到伤害/对其他角色造成伤害时,你进行判定。若结果为红色/黑色,此伤害-1/+1。", + shiroha_guying_rewrite: "孤影·改", + shiroha_guying_rewrite_info: + "当你受到伤害/对其他角色造成伤害时,你可进行判定。若结果为红色/黑色,此伤害-1/+1。", + shiroha_jiezhao: "解兆", + shiroha_jiezhao_info: + "一名角色的判定牌生效前,你可打出一张「兆」代替之。当你以此法移去最后一张「兆」后,你加1点体力上限并回复1点体力,然后修改〖孤影〗并随机获得以下技能中的一个:〖炒饭〗/〖习事〗/〖呣啾〗/〖结伴〗。", //猴年马月爆料再利用 - shizuku_sizhi:'思智', - shizuku_sizhi2:'思智', - shizuku_sizhi_info:'出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离和次数限制,红色牌本回合不计入手牌上限。', - shizuku_biyi:'避忆', - shizuku_biyi_info:'当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。', - shizuku_sanhua:'散花', - shizuku_sanhua_info:'当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。', - hiroto_huyu:'虎驭', - hiroto_huyu2:'虎驭', - hiroto_huyu_info:'其他角色的出牌阶段结束时,若你没有技能〖纵略〗,则其可将两张手牌交给你。若如此做,你获得〖纵略〗。你的下回合结束时,你失去〖纵略〗并将本回合内得到的所有牌交给该角色。', - hiroto_zonglve:'纵略', - hiroto_zonglve_info:'锁定技,你的手牌上限+3。出牌阶段限一次,你可以将一张手牌背面朝下放置,并展示一名其他角色的一张手牌。若这两张牌:颜色相同,你对其造成1点伤害并弃置其展示的牌。颜色不同,你获得该角色区域内的两张牌。', - hiroto_tuolao:'脱牢', - hiroto_tuolao_info:'觉醒技,回合结束后,若此回合不是你的第一个回合且你本轮内未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。', - sakuya_junbu:'均步', - sakuya_junbu_info:'锁定技,若你已废除的装备栏数量:≥1,你使用牌无距离限制。≥2,你使用牌无次数限制。≥3,你使用牌时可以多指定一个目标。≥4,你使用的牌不可被响应。≥5,你使用牌造成伤害时失去1点体力,令此伤害+1。', - rumi_shuwu:'淑武', - rumi_shuwu2:'淑武', - rumi_shuwu_info:'锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。出牌阶段结束时,你令X=0,且每满足一项便令X+1:①你于本阶段内使用【杀】的次数不大于1。②你于本阶段内未使用锦囊牌造成过伤害。③你的体力值不大于3。你摸X张牌,且本回合手牌上限+X。', - chihaya_liewu:'烈武', - chihaya_liewu2:'烈武', - chihaya_liewu_info:'锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。当你首次废除最后一个装备栏后,你减4点体力上限并获得技能〖怀柔〗。', - chihaya_youfeng:'游凤', - chihaya_youfeng_info:'转换技,阴,每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。', - chihaya_huairou:'怀柔', - chihaya_huairou_info:'出牌阶段,你可以重铸装备牌。', - yukito_kongwu:'控物', - yukito_kongwu_info:'出牌阶段限一次,你可以表演《小空飞天》。若如此做,你从以下项目中随机选择X项,并执行其中的一项:①令一名角色摸两张牌。②对一名角色造成1点伤害。③令一名已受伤的角色回复1点体力。④弃置一名角色区域内的两张牌。⑤移动场上的一张牌。若X=0,则你弃置两张牌。(X为你的得分)', - yukito_yaxiang:'鸦翔', - yukito_yaxiang_info:'限定技,当有角色进入濒死状态时,你可移去此武将牌,然后令该角色将体力值回复至3点,弃置判定区的所有牌并获得技能〖终愿〗。', - misuzu_zhongyuan:'终愿', - misuzu_zhongyuan_info:'限定技。当你的判定结果生效时,你可将判定结果改为任意花色和点数并结束此时机。', - asara_shelu:'摄录', - asara_shelu_info:'出牌阶段限一次,你可以弃置一张牌,然后展示一名其他角色的一张手牌并将其置于你的武将牌上,称为“影”。若你以此法弃置的牌和展示的牌:花色相同,则你摸两张牌。点数相同,则你回复1点体力。', - asara_yingwei:'影威', - asara_yingwei_info:'你可以如手牌般使用或打出“影”。锁定技,当你使用“影”时,强制触发对应的应变效果。', - kotomi_qinji:'琴击', - kotomi_qinji_info:'出牌阶段开始时,你可视为使用使用【万箭齐发】。你以此法使用【万箭齐发】造成的伤害视为失去体力。', - kotomi_chuanxiang:'传箱', - kotomi_chuanxiang2:'传箱', - kotomi_chuanxiang_info:'其他角色的出牌阶段限一次,其可以将装备区内的一张牌移动到另一名角色的装备区内,然后你摸一张牌。若你是目标角色,则你改为摸两张牌。', - mia_shihui:'时迴', - mia_shihui_info:'锁定技,摸牌阶段,你改为摸X+1张牌(X为你上回合弃置的牌数);结束阶段,你弃置一张牌并回复1点体力。', - mia_qianmeng:'潜梦', - mia_qianmeng_info:'使命技。①游戏开始时,你摸一张牌,然后将一张牌置于牌堆的正中央。②使命:当有角色获得“潜梦”牌时,其将此牌交给你。你将体力值回复至上限,失去〖时迴〗并获得〖风发〗。③失败:当你死亡时,你可令一名角色获得牌堆中所有与“潜梦”牌花色点数相同的牌。', - mia_fengfa:'风发', - mia_fengfa_info:'锁定技。摸牌阶段,你多摸X张牌(X为你上回合使用过的牌数)。', - kano_liezhen:'列阵', - kano_liezhen_info:'结束阶段,若你本回合内使用过牌且这些牌的类型:不均相同,你可视为使用【排兵布阵】或智囊;均相同,你获得仁库中的所有牌(没有则改为摸两张牌)。', - kano_paibingbuzhen:'排兵布阵', - kano_paibingbuzhen_info:'出牌阶段,对至多三名角色使用。目标角色摸一张牌,然后将一张牌置入仁库。若仁库中的牌类型或颜色均相同,则你摸一张牌。', - kano_poyu:'破羽', - kano_poyu_info:'当你成为【杀】或伤害性锦囊牌的目标后,若仁库中有牌,你可判定。然后你可从仁库中移去一张与此牌类型或花色相同的牌,令此牌对你无效。', - liyingxia_sanli:'三礼', - liyingxia_sanli_info:'锁定技。其他角色于其回合内前两次使用牌指定你为目标后,你摸一张牌;第三次使用牌指定你为目标后,你交给其一张牌。', - liyingxia_zhenjun:'振军', - liyingxia_zhenjun_info:'键势力技。结束阶段,你可以令至多X+1名角色各摸一张牌,且这些角色于自己的下个回合内第一次造成的伤害+1(X为你本回合内使用【杀】和伤害性锦囊牌的次数)。', - liyingxia_wumai:'武脉', - liyingxia_wumai_info:'蜀势力技。一轮游戏开始时,你可以选择获得其中一个未选择过的技能直到本轮结束:〖八阵〗/〖集智〗/〖观星〗/〖游龙〗。若均已选择过,则你可以摸X张牌(X为场上已受伤的角色数且至多为3)。', - erika_shisong:'识诵', - erika_shisong_info:'锁定技。①你的手牌上限+X(X为你的护甲数)。②当你于回合内使用第Y张牌时,若此牌与你上回合使用的第Y张牌类型相同,则你摸一张牌。', - erika_yousheng:'佑生', - erika_yousheng_info:'使命技。①限定技。一轮游戏开始时,你可以选择至多两名其他角色。你减2点体力上限并增加3点护甲。②当你〖佑生①〗选择的角色成为【杀】或伤害类锦囊牌的目标时,你可以弃置X张牌并将此目标转移给自己(X为你本轮内发动过〖佑生②〗的次数)。此牌结算结束后,你可令一名原目标角色获得此牌。③成功:当你失去最后的护甲后,若你已发动过〖佑生①〗,则你和所有〖佑生①〗选择的角色各摸三张牌。④失败:当一名〖佑生①〗选择的角色因【杀】或伤害类锦囊牌而受到伤害时,你失去所有护甲并弃置等量的牌。', - erika_yousheng_append:'Death is not the end of life, but the completion of life.', - satomi_luodao:'落刀', - satomi_luodao_info:'当你使用【杀】指定目标后,你可以展示目标角色的所有手牌。若其中:有【闪】,则你弃置其中的一张【闪】;没有【闪】,则你弃置一张牌。', - satomi_daohai:'稻海', - satomi_daohai_info:'结束阶段,若你本回合内弃置过牌,则你可以视为使用一张【五谷丰登】。然后你可以将你于此【五谷丰登】中得到的牌当做【乐不思蜀】使用。', - satomi_daohai_append:'五穀豊穣、刈り入れ時だね!', - tenzen_fenghuan:'封还', - tenzen_fenghuan_info:'其他角色使用的【杀】或伤害性锦囊牌结算结束后,若你是此牌的唯一目标,则你可以弃置任意张点数之和大于等于此牌点数两倍的牌,然后视为对其使用一张名称相同的牌。', - tenzen_retianquan:'天全', - tenzen_retianquan_info:'每回合限一次。当你使用【杀】指定目标后,你可失去1点体力或弃置一张牌,然后亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。这些牌中每有一张基本牌,响应此牌所需的【闪】的数量便+1。此牌结算结束后,若此牌造成过伤害,则你获得展示牌中的所有非基本牌。', - iriya_yinji:'殷极', - iriya_yinji_info:'锁定技。出牌阶段开始时,你将手牌摸至17张。你不能直接使用以此法得到的牌。', - iriya_haozhi:'豪掷', - iriya_haozhi_info:'出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。' - +'对子:其可以令至多两名角色各摸一张牌。' - +'三带:其可以弃置至多三名其他角色的各一张牌,然后摸一张牌。' - +'单顺:其可以弃置一名其他角色的一张牌。若其未以此法弃置过颜色相同的牌,则其可以重复此流程。然后其摸等量的牌。' - +'双顺:其可以获得一名其他角色的一张牌。若其未以此法获得过颜色相同的牌,则其可以重复此流程。然后其回复等量的体力。' - +'三顺/飞机:其可以令至多3名其他角色翻面,然后对其中一名角色造成1点火属性伤害。' - +'炸弹/四带二:其可以对一名角色造成2点雷属性伤害,然后目标角色翻面,弃置装备区的所有牌和四张手牌。', - visible_fuuko_xingdiao:'', - fuuko_xingdiao:'星雕', - fuuko_xingdiao_info:'锁定技。游戏开始时,你将手牌摸至8张,然后将所有手牌明置(称为“星”,不计入手牌上限)。每名其他角色限一次,其可以于出牌阶段选择获得你的一张“星”,然后你摸一张牌。', - fuuko_chuanyuan:'传愿', - fuuko_chuanyuan_info:'锁定技。当你失去一张“星”后,你回复1点体力,然后从牌堆中获得一张和“星”花色点数相同的牌(没有则改为摸一张牌,且使用此牌无距离和次数限制)。', + shizuku_sizhi: "思智", + shizuku_sizhi2: "思智", + shizuku_sizhi_info: + "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离和次数限制,红色牌本回合不计入手牌上限。", + shizuku_biyi: "避忆", + shizuku_biyi_info: + "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", + shizuku_sanhua: "散花", + shizuku_sanhua_info: "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", + hiroto_huyu: "虎驭", + hiroto_huyu2: "虎驭", + hiroto_huyu_info: + "其他角色的出牌阶段结束时,若你没有技能〖纵略〗,则其可将两张手牌交给你。若如此做,你获得〖纵略〗。你的下回合结束时,你失去〖纵略〗并将本回合内得到的所有牌交给该角色。", + hiroto_zonglve: "纵略", + hiroto_zonglve_info: + "锁定技,你的手牌上限+3。出牌阶段限一次,你可以将一张手牌背面朝下放置,并展示一名其他角色的一张手牌。若这两张牌:颜色相同,你对其造成1点伤害并弃置其展示的牌。颜色不同,你获得该角色区域内的两张牌。", + hiroto_tuolao: "脱牢", + hiroto_tuolao_info: + "觉醒技,回合结束后,若此回合不是你的第一个回合且你本轮内未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。", + sakuya_junbu: "均步", + sakuya_junbu_info: + "锁定技,若你已废除的装备栏数量:≥1,你使用牌无距离限制。≥2,你使用牌无次数限制。≥3,你使用牌时可以多指定一个目标。≥4,你使用的牌不可被响应。≥5,你使用牌造成伤害时失去1点体力,令此伤害+1。", + rumi_shuwu: "淑武", + rumi_shuwu2: "淑武", + rumi_shuwu_info: + "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。出牌阶段结束时,你令X=0,且每满足一项便令X+1:①你于本阶段内使用【杀】的次数不大于1。②你于本阶段内未使用锦囊牌造成过伤害。③你的体力值不大于3。你摸X张牌,且本回合手牌上限+X。", + chihaya_liewu: "烈武", + chihaya_liewu2: "烈武", + chihaya_liewu_info: + "锁定技,你使用【杀】无距离和次数限制,你使用普通锦囊牌选择目标后,可增加一个目标。当你首次废除最后一个装备栏后,你减4点体力上限并获得技能〖怀柔〗。", + chihaya_youfeng: "游凤", + chihaya_youfeng_info: + "转换技,阴,每轮限一次,你可以加1点体力上限,视为使用一张普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张基本牌。", + chihaya_huairou: "怀柔", + chihaya_huairou_info: "出牌阶段,你可以重铸装备牌。", + yukito_kongwu: "控物", + yukito_kongwu_info: + "出牌阶段限一次,你可以表演《小空飞天》。若如此做,你从以下项目中随机选择X项,并执行其中的一项:①令一名角色摸两张牌。②对一名角色造成1点伤害。③令一名已受伤的角色回复1点体力。④弃置一名角色区域内的两张牌。⑤移动场上的一张牌。若X=0,则你弃置两张牌。(X为你的得分)", + yukito_yaxiang: "鸦翔", + yukito_yaxiang_info: + "限定技,当有角色进入濒死状态时,你可移去此武将牌,然后令该角色将体力值回复至3点,弃置判定区的所有牌并获得技能〖终愿〗。", + misuzu_zhongyuan: "终愿", + misuzu_zhongyuan_info: + "限定技。当你的判定结果生效时,你可将判定结果改为任意花色和点数并结束此时机。", + asara_shelu: "摄录", + asara_shelu_info: + "出牌阶段限一次,你可以弃置一张牌,然后展示一名其他角色的一张手牌并将其置于你的武将牌上,称为“影”。若你以此法弃置的牌和展示的牌:花色相同,则你摸两张牌。点数相同,则你回复1点体力。", + asara_yingwei: "影威", + asara_yingwei_info: + "你可以如手牌般使用或打出“影”。锁定技,当你使用“影”时,强制触发对应的应变效果。", + kotomi_qinji: "琴击", + kotomi_qinji_info: + "出牌阶段开始时,你可视为使用使用【万箭齐发】。你以此法使用【万箭齐发】造成的伤害视为失去体力。", + kotomi_chuanxiang: "传箱", + kotomi_chuanxiang2: "传箱", + kotomi_chuanxiang_info: + "其他角色的出牌阶段限一次,其可以将装备区内的一张牌移动到另一名角色的装备区内,然后你摸一张牌。若你是目标角色,则你改为摸两张牌。", + mia_shihui: "时迴", + mia_shihui_info: + "锁定技,摸牌阶段,你改为摸X+1张牌(X为你上回合弃置的牌数);结束阶段,你弃置一张牌并回复1点体力。", + mia_qianmeng: "潜梦", + mia_qianmeng_info: + "使命技。①游戏开始时,你摸一张牌,然后将一张牌置于牌堆的正中央。②使命:当有角色获得“潜梦”牌时,其将此牌交给你。你将体力值回复至上限,失去〖时迴〗并获得〖风发〗。③失败:当你死亡时,你可令一名角色获得牌堆中所有与“潜梦”牌花色点数相同的牌。", + mia_fengfa: "风发", + mia_fengfa_info: "锁定技。摸牌阶段,你多摸X张牌(X为你上回合使用过的牌数)。", + kano_liezhen: "列阵", + kano_liezhen_info: + "结束阶段,若你本回合内使用过牌且这些牌的类型:不均相同,你可视为使用【排兵布阵】或智囊;均相同,你获得仁库中的所有牌(没有则改为摸两张牌)。", + kano_paibingbuzhen: "排兵布阵", + kano_paibingbuzhen_info: + "出牌阶段,对至多三名角色使用。目标角色摸一张牌,然后将一张牌置入仁库。若仁库中的牌类型或颜色均相同,则你摸一张牌。", + kano_poyu: "破羽", + kano_poyu_info: + "当你成为【杀】或伤害性锦囊牌的目标后,若仁库中有牌,你可判定。然后你可从仁库中移去一张与此牌类型或花色相同的牌,令此牌对你无效。", + liyingxia_sanli: "三礼", + liyingxia_sanli_info: + "锁定技。其他角色于其回合内前两次使用牌指定你为目标后,你摸一张牌;第三次使用牌指定你为目标后,你交给其一张牌。", + liyingxia_zhenjun: "振军", + liyingxia_zhenjun_info: + "键势力技。结束阶段,你可以令至多X+1名角色各摸一张牌,且这些角色于自己的下个回合内第一次造成的伤害+1(X为你本回合内使用【杀】和伤害性锦囊牌的次数)。", + liyingxia_wumai: "武脉", + liyingxia_wumai_info: + "蜀势力技。一轮游戏开始时,你可以选择获得其中一个未选择过的技能直到本轮结束:〖八阵〗/〖集智〗/〖观星〗/〖游龙〗。若均已选择过,则你可以摸X张牌(X为场上已受伤的角色数且至多为3)。", + erika_shisong: "识诵", + erika_shisong_info: + "锁定技。①你的手牌上限+X(X为你的护甲数)。②当你于回合内使用第Y张牌时,若此牌与你上回合使用的第Y张牌类型相同,则你摸一张牌。", + erika_yousheng: "佑生", + erika_yousheng_info: + "使命技。①限定技。一轮游戏开始时,你可以选择至多两名其他角色。你减2点体力上限并增加3点护甲。②当你〖佑生①〗选择的角色成为【杀】或伤害类锦囊牌的目标时,你可以弃置X张牌并将此目标转移给自己(X为你本轮内发动过〖佑生②〗的次数)。此牌结算结束后,你可令一名原目标角色获得此牌。③成功:当你失去最后的护甲后,若你已发动过〖佑生①〗,则你和所有〖佑生①〗选择的角色各摸三张牌。④失败:当一名〖佑生①〗选择的角色因【杀】或伤害类锦囊牌而受到伤害时,你失去所有护甲并弃置等量的牌。", + erika_yousheng_append: + 'Death is not the end of life, but the completion of life.', + satomi_luodao: "落刀", + satomi_luodao_info: + "当你使用【杀】指定目标后,你可以展示目标角色的所有手牌。若其中:有【闪】,则你弃置其中的一张【闪】;没有【闪】,则你弃置一张牌。", + satomi_daohai: "稻海", + satomi_daohai_info: + "结束阶段,若你本回合内弃置过牌,则你可以视为使用一张【五谷丰登】。然后你可以将你于此【五谷丰登】中得到的牌当做【乐不思蜀】使用。", + satomi_daohai_append: '五穀豊穣、刈り入れ時だね!', + tenzen_fenghuan: "封还", + tenzen_fenghuan_info: + "其他角色使用的【杀】或伤害性锦囊牌结算结束后,若你是此牌的唯一目标,则你可以弃置任意张点数之和大于等于此牌点数两倍的牌,然后视为对其使用一张名称相同的牌。", + tenzen_retianquan: "天全", + tenzen_retianquan_info: + "每回合限一次。当你使用【杀】指定目标后,你可失去1点体力或弃置一张牌,然后亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。这些牌中每有一张基本牌,响应此牌所需的【闪】的数量便+1。此牌结算结束后,若此牌造成过伤害,则你获得展示牌中的所有非基本牌。", + iriya_yinji: "殷极", + iriya_yinji_info: "锁定技。出牌阶段开始时,你将手牌摸至17张。你不能直接使用以此法得到的牌。", + iriya_haozhi: "豪掷", + iriya_haozhi_info: + "出牌阶段,你可以按照斗地主牌型弃置至少两张牌,且其他角色可以依次对其进行一轮响应。最后一名进行响应的角色可以根据对应牌型执行对应效果。" + + "对子:其可以令至多两名角色各摸一张牌。" + + "三带:其可以弃置至多三名其他角色的各一张牌,然后摸一张牌。" + + "单顺:其可以弃置一名其他角色的一张牌。若其未以此法弃置过颜色相同的牌,则其可以重复此流程。然后其摸等量的牌。" + + "双顺:其可以获得一名其他角色的一张牌。若其未以此法获得过颜色相同的牌,则其可以重复此流程。然后其回复等量的体力。" + + "三顺/飞机:其可以令至多3名其他角色翻面,然后对其中一名角色造成1点火属性伤害。" + + "炸弹/四带二:其可以对一名角色造成2点雷属性伤害,然后目标角色翻面,弃置装备区的所有牌和四张手牌。", + visible_fuuko_xingdiao: '', + fuuko_xingdiao: "星雕", + fuuko_xingdiao_info: + "锁定技。游戏开始时,你将手牌摸至8张,然后将所有手牌明置(称为“星”,不计入手牌上限)。每名其他角色限一次,其可以于出牌阶段选择获得你的一张“星”,然后你摸一张牌。", + fuuko_chuanyuan: "传愿", + fuuko_chuanyuan_info: + "锁定技。当你失去一张“星”后,你回复1点体力,然后从牌堆中获得一张和“星”花色点数相同的牌(没有则改为摸一张牌,且使用此牌无距离和次数限制)。", - key_kud:'库特莉亚芙卡', - kud_qiaoshou:'巧手', - kud_qiaoshou_equip:'巧手', - kud_qiaoshou_end:'巧手', - kud_qiaoshou_backup:'巧手', - kud_qiaoshou_info:'出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。', - kud_buhui:'不悔', - kud_buhui_info:'限定技,当你进入濒死状态时,你可以弃置“巧”和装备区内的所有牌(至少一张)并摸等量的牌,将体力回复至2点,获得技能〖重振〗。', - key_misuzu:'神尾观铃', - misuzu_hengzhou:'恒咒', - misuzu_hengzhou_info:'锁定技,准备阶段开始时,或当你受到1点伤害或回复1点体力后,你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时,若X大于3,则你移去所有“诅咒”标记并失去1点体力。(X为“诅咒”标记数)', - misuzu_nongyin:'浓饮', - misuzu_nongyin_info:'当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。', - misuzu_zhongxing:'终幸', - misuzu_zhongxing_info:'每回合限一次,当你判定区的牌移动到其他区域后,你可令一名角色回复1点体力或摸两张牌。', - key_kamome:'久岛鸥', - kamome_yangfan:'扬帆', - kamome_yangfan_info:'锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。', - kamome_huanmeng:'幻梦', - kamome_huanmeng_info:'准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)', - kamome_jieban:'结伴', - kamome_jieban_info:'转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。', - kamome_suitcase:'旅行箱', - kamome_suitcase_info:'锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。', - key_nao:'友利奈绪', - nao_duyin:'独隐', - nao_duyin2:'独隐', - nao_duyin_info:'一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。', - nao_wanxin:'挽心', - nao_wanxin_info:'一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。', - nao_shouqing:'守情', - nao_shouqing2:'守情', - nao_shouqing3:'守情', - nao_shouqing_info:'其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。', - key_yuuki:'冰室忧希', - yuuki_yicha:'异插', - yuuki_yicha_info:'出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。', - key_kyouko:'伊座并杏子', - kyouko_rongzhu:'容助', - kyouko_rongzhu_info:'其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1;若你是当前回合角色,则你本回合的手牌上限+1。', - kyouko_gongmian:'共勉', - kyouko_gongmian_use:'共勉', - kyouko_gongmian_exchange:'共勉', - kyouko_gongmian_info:'①出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。②出牌阶段结束时,你可以获得一名其他角色区域内的至多X张牌,然后交给其等量的牌。③弃牌阶段开始时,若X不小于你的体力值,你可以获得一名手牌数少于你的角色的所有手牌,然后将手牌数的一半(向上取整)交给该角色。(X为你本回合内发动过〖共勉①〗的次数)', - key_tenzen:'加纳天善', - tenzen_yixing:'弈兴', - tenzen_yixing_info:'当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。', + key_kud: "库特莉亚芙卡", + kud_qiaoshou: "巧手", + kud_qiaoshou_equip: "巧手", + kud_qiaoshou_end: "巧手", + kud_qiaoshou_backup: "巧手", + kud_qiaoshou_info: + "出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。", + kud_buhui: "不悔", + kud_buhui_info: + "限定技,当你进入濒死状态时,你可以弃置“巧”和装备区内的所有牌(至少一张)并摸等量的牌,将体力回复至2点,获得技能〖重振〗。", + key_misuzu: "神尾观铃", + misuzu_hengzhou: "恒咒", + misuzu_hengzhou_info: + "锁定技,准备阶段开始时,或当你受到1点伤害或回复1点体力后,你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时,若X大于3,则你移去所有“诅咒”标记并失去1点体力。(X为“诅咒”标记数)", + misuzu_nongyin: "浓饮", + misuzu_nongyin_info: + "当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。", + misuzu_zhongxing: "终幸", + misuzu_zhongxing_info: + "每回合限一次,当你判定区的牌移动到其他区域后,你可令一名角色回复1点体力或摸两张牌。", + key_kamome: "久岛鸥", + kamome_yangfan: "扬帆", + kamome_yangfan_info: + "锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。", + kamome_huanmeng: "幻梦", + kamome_huanmeng_info: + "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)", + kamome_jieban: "结伴", + kamome_jieban_info: + "转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。", + kamome_suitcase: "旅行箱", + kamome_suitcase_info: "锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。", + key_nao: "友利奈绪", + nao_duyin: "独隐", + nao_duyin2: "独隐", + nao_duyin_info: + "一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。", + nao_wanxin: "挽心", + nao_wanxin_info: + "一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。", + nao_shouqing: "守情", + nao_shouqing2: "守情", + nao_shouqing3: "守情", + nao_shouqing_info: + "其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。", + key_yuuki: "冰室忧希", + yuuki_yicha: "异插", + yuuki_yicha_info: + "出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。", + key_kyouko: "伊座并杏子", + kyouko_rongzhu: "容助", + kyouko_rongzhu_info: + "其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1;若你是当前回合角色,则你本回合的手牌上限+1。", + kyouko_gongmian: "共勉", + kyouko_gongmian_use: "共勉", + kyouko_gongmian_exchange: "共勉", + kyouko_gongmian_info: + "①出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。②出牌阶段结束时,你可以获得一名其他角色区域内的至多X张牌,然后交给其等量的牌。③弃牌阶段开始时,若X不小于你的体力值,你可以获得一名手牌数少于你的角色的所有手牌,然后将手牌数的一半(向上取整)交给该角色。(X为你本回合内发动过〖共勉①〗的次数)", + key_tenzen: "加纳天善", + tenzen_yixing: "弈兴", + tenzen_yixing_info: + "当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。", //若对方为水织静久则无法触发〖弈兴〗 - tenzen_lingyu:'领域', - tenzen_lingyu_info:'觉醒技,准备阶段,若你的“兴”不小于你的体力值,则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力,则你摸两张牌。', - tenzen_tianquan:'天全', - tenzen_tianquan_info:'每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后,若此牌造成过伤害,则你获得这些牌中的非基本牌。', - key_kotarou:'天王寺瑚太朗', - kotarou_aurora:'丝刃', - kotarou_aurora_info:'锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。', - kotarou_rewrite:'改写', - kotarou_rewrite_damage:'改写', - kotarou_rewrite_recover:'改写', - kotarou_rewrite_sha:'改写', - kotarou_rewrite_block:'改写', - kotarou_rewrite_info:'出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加1点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。', - key_kyou:'藤林杏', - kyou_zhidian:'掷典', - kyou_zhidian_info:'你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。', - kyou_duanfa:'断发', - kyou_duanfa_info:'限定技,当你受到伤害时,若伤害值不小于你的体力值,则你可弃置所有手牌,防止此伤害并回复1点体力;且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后,你摸一张牌。', - key_seira:'樱庭星罗', - seira_xinghui:'星辉', - seira_xinghui_info:'准备阶段,你可以投掷一枚骰子,观看牌堆顶的X张牌(X为投掷点数)并以任意顺序扣置于一名没有“星屑”的角色的武将牌上,称为“星屑”。有“星屑”的角色造成的伤害+1,且当其从牌堆顶摸牌或取得判定牌时,改为从“星屑”中获取。', - seira_yuanying:'缘映', - seira_yuanying_info:'出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。', - seira_yinyuan:'姻缘', - seira_yinyuan_info:'你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。', - key_kiyu:'露娜Q', - kiyu_yuling:'玉灵', - kiyu_yuling_info:'锁定技。你不是有距离限制的锦囊牌的合法目标;你成为【杀】的目标后,使用者需弃置X张牌(X为其至你的距离)。', - kiyu_xianyu:'先预', - kiyu_xianyu_info:'每轮限一次。一名角色的出牌阶段开始时,你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时,你摸X张牌,且其本回合的手牌上限+X(X为你的预测与其实际使用顺序的吻合数且至多为3)。', - kiyu_rexianyu:'先预', - kiyu_rexianyu_info:'每轮限一次。出牌阶段结束时,你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时,其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用(X至多为3);若如此做,你摸一张牌,且其本回合的手牌上限+1。', - key_tomoyo:'坂上智代', - tomoyo_wuwei:'武威', - tomoyo_wuwei_info:'①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。', - tomoyo_zhengfeng:'整风', - tomoyo_zhengfeng_info:'使命技。①准备阶段,你可以令攻击范围内的一名角色进行判定。若如此做,你获得如下效果直到下回合开始:你视为在该角色的攻击范围内,且当该角色使用与判定牌颜色相同的牌时,你摸一张牌。②失败:结束阶段,若你于本回合内未发动过〖整风①〗,则你可以减1点体力上限。你失去〖武威〗,摸两张牌并回复1点体力,然后获得〖长誓〗。', - tomoyo_changshi:'长誓', - tomoyo_changshi_info:'锁定技。一名攻击范围内包含你的角色回复体力后,你获得1点护甲;一名攻击范围内包含你的角色一次性获得至少两张牌后,你摸一张牌。', - key_minagi:'远野美凪', - minagi_peiquan:'配券', - minagi_peiquan_info:'锁定技。①游戏开始时,你将你所有的手牌记录为“米券”。②出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。', - minagi_huanliu:'幻流', - minagi_huanliu_info:'准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。', - key_michiru:'远野小满', - michiru_sheyuan:'舍愿', - michiru_sheyuan_info:'每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。', - minagi_tag:'米券', + tenzen_lingyu: "领域", + tenzen_lingyu_info: + "觉醒技,准备阶段,若你的“兴”不小于你的体力值,则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力,则你摸两张牌。", + tenzen_tianquan: "天全", + tenzen_tianquan_info: + "每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后,若此牌造成过伤害,则你获得这些牌中的非基本牌。", + key_kotarou: "天王寺瑚太朗", + kotarou_aurora: "丝刃", + kotarou_aurora_info: + "锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。", + kotarou_rewrite: "改写", + kotarou_rewrite_damage: "改写", + kotarou_rewrite_recover: "改写", + kotarou_rewrite_sha: "改写", + kotarou_rewrite_block: "改写", + kotarou_rewrite_info: + "出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加1点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。", + key_kyou: "藤林杏", + kyou_zhidian: "掷典", + kyou_zhidian_info: + "你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。", + kyou_duanfa: "断发", + kyou_duanfa_info: + "限定技,当你受到伤害时,若伤害值不小于你的体力值,则你可弃置所有手牌,防止此伤害并回复1点体力;且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后,你摸一张牌。", + key_seira: "樱庭星罗", + seira_xinghui: "星辉", + seira_xinghui_info: + "准备阶段,你可以投掷一枚骰子,观看牌堆顶的X张牌(X为投掷点数)并以任意顺序扣置于一名没有“星屑”的角色的武将牌上,称为“星屑”。有“星屑”的角色造成的伤害+1,且当其从牌堆顶摸牌或取得判定牌时,改为从“星屑”中获取。", + seira_yuanying: "缘映", + seira_yuanying_info: + "出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。", + seira_yinyuan: "姻缘", + seira_yinyuan_info: + "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。", + key_kiyu: "露娜Q", + kiyu_yuling: "玉灵", + kiyu_yuling_info: + "锁定技。你不是有距离限制的锦囊牌的合法目标;你成为【杀】的目标后,使用者需弃置X张牌(X为其至你的距离)。", + kiyu_xianyu: "先预", + kiyu_xianyu_info: + "每轮限一次。一名角色的出牌阶段开始时,你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时,你摸X张牌,且其本回合的手牌上限+X(X为你的预测与其实际使用顺序的吻合数且至多为3)。", + kiyu_rexianyu: "先预", + kiyu_rexianyu_info: + "每轮限一次。出牌阶段结束时,你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时,其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用(X至多为3);若如此做,你摸一张牌,且其本回合的手牌上限+1。", + key_tomoyo: "坂上智代", + tomoyo_wuwei: "武威", + tomoyo_wuwei_info: + "①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。", + tomoyo_zhengfeng: "整风", + tomoyo_zhengfeng_info: + "使命技。①准备阶段,你可以令攻击范围内的一名角色进行判定。若如此做,你获得如下效果直到下回合开始:你视为在该角色的攻击范围内,且当该角色使用与判定牌颜色相同的牌时,你摸一张牌。②失败:结束阶段,若你于本回合内未发动过〖整风①〗,则你可以减1点体力上限。你失去〖武威〗,摸两张牌并回复1点体力,然后获得〖长誓〗。", + tomoyo_changshi: "长誓", + tomoyo_changshi_info: + "锁定技。一名攻击范围内包含你的角色回复体力后,你获得1点护甲;一名攻击范围内包含你的角色一次性获得至少两张牌后,你摸一张牌。", + key_minagi: "远野美凪", + minagi_peiquan: "配券", + minagi_peiquan_info: + "锁定技。①游戏开始时,你将你所有的手牌记录为“米券”。②出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。", + minagi_huanliu: "幻流", + minagi_huanliu_info: + "准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。", + key_michiru: "远野小满", + michiru_sheyuan: "舍愿", + michiru_sheyuan_info: + "每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。", + minagi_tag: "米券", - noname:"小无", - noname_zhuyuan:"祝愿", - noname_zhuyuan_info:"①每回合每名角色限一次。出牌阶段,你可以将四张花色各不相同的牌交给一名其他角色。你与其获得技能〖铁骑〗和〖激昂〗至各自的回合结束。②锁定技,若你于当前回合内:未发动过〖祝愿〗,则你使用牌无次数限制;发动过〖祝愿〗,则你使用牌无距离限制。", - noname_duocai:"多彩", - noname_duocai_info:"每回合限一次。其他角色区域内的牌因弃置而进入弃牌堆后,你可以获得之。若你以此法得到的牌数:大于2,你弃置一名角色区域内的一张牌;等于2,你摸一张牌;小于2,你回复1点体力。", - ns_huangchengyan:'黄承彦', - nslongyue:'龙岳', - nslongyue_info:'当一名角色使用锦囊牌时,若此牌是其本回合内使用的第一张牌,则你可令其摸一张牌。', - nszhenyin:'阵引', - nszhenyin_info:'每回合限一次。一名角色的判定牌生效前,你可令当前回合角色打出一张手牌代替之。', - ns_sunchensunjun:'孙綝孙峻', - nsxianhai:'险害', - nsxianhai_info:'每轮限一次,当一名其他角色于回合内造成伤害后,若其此回合内造成过的伤害总和大于你上一回合内造成的伤害总和,则你可以减1点体力上限,令其废除一种装备栏并弃置手牌中所有的【闪】。若〖兴黜〗已发动,此回合结束后视为该限定技未发动过。', - nsxingchu:'兴黜', - nsxingchu_info:'限定技,当你杀死一名角色/你死亡时,你可以令一名角色获得其/你的所有牌并增加1点体力上限。', - ns_yuanxi:'袁熙', - nsshengyan:'盛筵', - nsshengyan3:'盛筵', - nsshengyan_info:'锁定技,你的判定牌生效后,若结果花色与你本回合内其他判定结果的花色均不同,则你令当前回合角色本回合的手牌上限+2。', - nsdaizhan:'怠战', - nsdaizhany:'怠战', - nsdaizhan_info:'准备阶段,你可以将一张非锦囊牌当做【兵粮寸断】或【乐不思蜀】对自己使用。若如此做,回合结束时,你将手牌摸至手牌上限。', - ns_caoshuang:'曹爽', - nsjiquan:'集权', - nsjiquan_mark:'集权', - nsjiquan_info:'与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。', - nsfuwei:'附位', - nsfuwei_info:'觉醒技,结束阶段开始时,若“威”数大于4,则你加2点体力上限,获得〖喋谋〗和〖制皇〗,并将〖集权〗改为锁定技。', - nsdiemou:'喋谋', - nsdiemou_info:'锁定技,出牌阶段开始时,若“威”大于全场角色数,你移去所有“威”,减1点体力上限并摸X张牌。若X大于4,你翻面。(X为移去的“威”数)', - nszhihuang:'制皇', - nszhihuang_damage:'制皇', - nszhihuang_info:'每回合限一次,当主公使用牌时,你可以移去一张“威”,然后获得此牌。锁定技,若你的手牌数大于主公,则你使用牌造成的伤害+1。', - ns_chentai:'陈泰', - nsweiyuan:'围援', - nsweiyuan_use:'围援', - nsweiyuan_use_backup:'围援', - nsweiyuan_info:'出牌阶段限一次,当你使用牌指定其他角色A为唯一目标后,你可以令一名除该角色外的其他角色B选择一项:①交给A一张牌:然后你对B造成1点伤害;②你摸一张牌,且可以将一张手牌当做本回合使用过的一张基本牌/普通锦囊牌使用(无次数距离限制)。', - nsjuxian:'据险', - nsjuxian2:'据险', - nsjuxian_info:'当你受到伤害时,你可以摸两张并跳过下一个摸牌阶段,且在此之前不能再次发动〖据险〗。然后若你的手牌数不小于体力上限,则伤害来源弃置一张牌。', - ns_huangwudie:'黄舞蝶', - nsdiewu:'蝶舞', - nsdiewu_info:'当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。', - nslingying:'灵影', - nslingying_info:'锁定技,你使用【杀】无距离限制,且你使用【杀】的次数上限+1。', - nspojian:'破茧', - nspojian_info:'觉醒技,准备阶段,若你的"蝶舞"标记的数量不小于你的体力值,则你减1点体力上限并摸两张牌,删除〖蝶舞〗中使用【闪】的部分并获得技能〖烈弓〗。', - ns_sunyi:'孙翊', - nsguolie:'果烈', - nsguolie2:'果烈', - nsguolie_info:'摸牌阶段开始前,你可跳过此阶段。若如此做,你的红色牌均视为【杀】,黑色牌均视为【过河拆桥】且均无视距离与次数直到回合结束,且结束阶段,你获得本回合从你以外的区域内进入弃牌堆的所有牌。', - ns_zhangning:'张宁', - nsfuzhou:'符咒', - nsfuzhou_card:'符咒', - nsfuzhou_card_info:'此牌不可被【无懈可击】响应。若判定结果为:黑色,你受到使用者造成的1点雷属性伤害且弃置一张牌;红色,使用者摸两张牌,且你本回合的手牌上限-1。', - nsfuzhou_num:'符咒', - nsfuzhou_info:'出牌阶段限一次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限减1。', - nsguidao:'鬼道', - nsguidao_info:'一名角色的判定牌生效前,你可以打出一张黑色牌替换之。', - nstaiping:'太平', - nstaiping_info:'觉醒技。准备阶段,若你:已因〖符咒〗造成了两次或更多的伤害,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·邪〗;若你已因〖符咒〗摸了两次或更多的牌,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·正〗。', - nsfuzhou_damage:'符咒·邪', - nsfuzhou_damage_info:'出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限-1。', - nsfuzhou_draw:'符咒·正', - nsfuzhou_draw_info:'出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。', - ns_yanghu:'羊祜', - nsbizhao:'避召', - nsbizhao2:'避召', - nsbizhao_info:'隐匿技,锁定技,当你于回合外明置此武将牌后,其他角色计算与你的距离+1直至你的回合开始。', - nsqingde:'清德', - nsqingde_info:'每回合限一次,当你使用【杀】或普通锦囊牌对其他角色造成伤害后,你可使用该牌与受到伤害的角色拼点。你可令输的角色摸两张牌;当你受到其他角色使用【杀】或普通锦囊牌造成的伤害后,可使用该牌与伤害来源拼点。你可令赢的角色回复1点体力。', - nsyidi:'遗敌', - nsyidi_info:'出牌阶段限一次,你可展示一张手牌,然后将其交给一名其他角色。若为基本牌,该角色可使用此牌;若不为基本牌,你摸一张牌。', + noname: "小无", + noname_zhuyuan: "祝愿", + noname_zhuyuan_info: + "①每回合每名角色限一次。出牌阶段,你可以将四张花色各不相同的牌交给一名其他角色。你与其获得技能〖铁骑〗和〖激昂〗至各自的回合结束。②锁定技,若你于当前回合内:未发动过〖祝愿〗,则你使用牌无次数限制;发动过〖祝愿〗,则你使用牌无距离限制。", + noname_duocai: "多彩", + noname_duocai_info: + "每回合限一次。其他角色区域内的牌因弃置而进入弃牌堆后,你可以获得之。若你以此法得到的牌数:大于2,你弃置一名角色区域内的一张牌;等于2,你摸一张牌;小于2,你回复1点体力。", + ns_huangchengyan: "黄承彦", + nslongyue: "龙岳", + nslongyue_info: "当一名角色使用锦囊牌时,若此牌是其本回合内使用的第一张牌,则你可令其摸一张牌。", + nszhenyin: "阵引", + nszhenyin_info: "每回合限一次。一名角色的判定牌生效前,你可令当前回合角色打出一张手牌代替之。", + ns_sunchensunjun: "孙綝孙峻", + nsxianhai: "险害", + nsxianhai_info: + "每轮限一次,当一名其他角色于回合内造成伤害后,若其此回合内造成过的伤害总和大于你上一回合内造成的伤害总和,则你可以减1点体力上限,令其废除一种装备栏并弃置手牌中所有的【闪】。若〖兴黜〗已发动,此回合结束后视为该限定技未发动过。", + nsxingchu: "兴黜", + nsxingchu_info: + "限定技,当你杀死一名角色/你死亡时,你可以令一名角色获得其/你的所有牌并增加1点体力上限。", + ns_yuanxi: "袁熙", + nsshengyan: "盛筵", + nsshengyan3: "盛筵", + nsshengyan_info: + "锁定技,你的判定牌生效后,若结果花色与你本回合内其他判定结果的花色均不同,则你令当前回合角色本回合的手牌上限+2。", + nsdaizhan: "怠战", + nsdaizhany: "怠战", + nsdaizhan_info: + "准备阶段,你可以将一张非锦囊牌当做【兵粮寸断】或【乐不思蜀】对自己使用。若如此做,回合结束时,你将手牌摸至手牌上限。", + ns_caoshuang: "曹爽", + nsjiquan: "集权", + nsjiquan_mark: "集权", + nsjiquan_info: + "与你距离1以内的其他角色造成或受到伤害后,你可以将其区域内的一张牌置于你的武将牌上(称为“威”)。你使用【杀】的次数上限+X(X为“威”数)。", + nsfuwei: "附位", + nsfuwei_info: + "觉醒技,结束阶段开始时,若“威”数大于4,则你加2点体力上限,获得〖喋谋〗和〖制皇〗,并将〖集权〗改为锁定技。", + nsdiemou: "喋谋", + nsdiemou_info: + "锁定技,出牌阶段开始时,若“威”大于全场角色数,你移去所有“威”,减1点体力上限并摸X张牌。若X大于4,你翻面。(X为移去的“威”数)", + nszhihuang: "制皇", + nszhihuang_damage: "制皇", + nszhihuang_info: + "每回合限一次,当主公使用牌时,你可以移去一张“威”,然后获得此牌。锁定技,若你的手牌数大于主公,则你使用牌造成的伤害+1。", + ns_chentai: "陈泰", + nsweiyuan: "围援", + nsweiyuan_use: "围援", + nsweiyuan_use_backup: "围援", + nsweiyuan_info: + "出牌阶段限一次,当你使用牌指定其他角色A为唯一目标后,你可以令一名除该角色外的其他角色B选择一项:①交给A一张牌:然后你对B造成1点伤害;②你摸一张牌,且可以将一张手牌当做本回合使用过的一张基本牌/普通锦囊牌使用(无次数距离限制)。", + nsjuxian: "据险", + nsjuxian2: "据险", + nsjuxian_info: + "当你受到伤害时,你可以摸两张并跳过下一个摸牌阶段,且在此之前不能再次发动〖据险〗。然后若你的手牌数不小于体力上限,则伤害来源弃置一张牌。", + ns_huangwudie: "黄舞蝶", + nsdiewu: "蝶舞", + nsdiewu_info: + "当你获得两张或更多的牌后/受到伤害后,你获得一个“蝶舞”标记;你可移去一枚“蝶舞”标记,然后视为使用一张【杀】或【闪】。当你以此法使用【杀】造成伤害后,则你摸一张牌。", + nslingying: "灵影", + nslingying_info: "锁定技,你使用【杀】无距离限制,且你使用【杀】的次数上限+1。", + nspojian: "破茧", + nspojian_info: + '觉醒技,准备阶段,若你的"蝶舞"标记的数量不小于你的体力值,则你减1点体力上限并摸两张牌,删除〖蝶舞〗中使用【闪】的部分并获得技能〖烈弓〗。', + ns_sunyi: "孙翊", + nsguolie: "果烈", + nsguolie2: "果烈", + nsguolie_info: + "摸牌阶段开始前,你可跳过此阶段。若如此做,你的红色牌均视为【杀】,黑色牌均视为【过河拆桥】且均无视距离与次数直到回合结束,且结束阶段,你获得本回合从你以外的区域内进入弃牌堆的所有牌。", + ns_zhangning: "张宁", + nsfuzhou: "符咒", + nsfuzhou_card: "符咒", + nsfuzhou_card_info: + "此牌不可被【无懈可击】响应。若判定结果为:黑色,你受到使用者造成的1点雷属性伤害且弃置一张牌;红色,使用者摸两张牌,且你本回合的手牌上限-1。", + nsfuzhou_num: "符咒", + nsfuzhou_info: + "出牌阶段限一次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限减1。", + nsguidao: "鬼道", + nsguidao_info: "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。", + nstaiping: "太平", + nstaiping_info: + "觉醒技。准备阶段,若你:已因〖符咒〗造成了两次或更多的伤害,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·邪〗;若你已因〖符咒〗摸了两次或更多的牌,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·正〗。", + nsfuzhou_damage: "符咒·邪", + nsfuzhou_damage_info: + "出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限-1。", + nsfuzhou_draw: "符咒·正", + nsfuzhou_draw_info: + "出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。", + ns_yanghu: "羊祜", + nsbizhao: "避召", + nsbizhao2: "避召", + nsbizhao_info: + "隐匿技,锁定技,当你于回合外明置此武将牌后,其他角色计算与你的距离+1直至你的回合开始。", + nsqingde: "清德", + nsqingde_info: + "每回合限一次,当你使用【杀】或普通锦囊牌对其他角色造成伤害后,你可使用该牌与受到伤害的角色拼点。你可令输的角色摸两张牌;当你受到其他角色使用【杀】或普通锦囊牌造成的伤害后,可使用该牌与伤害来源拼点。你可令赢的角色回复1点体力。", + nsyidi: "遗敌", + nsyidi_info: + "出牌阶段限一次,你可展示一张手牌,然后将其交给一名其他角色。若为基本牌,该角色可使用此牌;若不为基本牌,你摸一张牌。", - diy_wenyang:'文鸯', - ns_zhangwei:'张葳', - nshuaishuang:'怀霜', - nshuaishuang_info:'锁定技,结束阶段,你从牌堆/弃牌堆获得一张【桃】,然后失去1点体力。', - nsfengli:'奉礼', - nsfengli2:'奉礼', - nsfengli_draw:'奉礼', - nsfengli_clear:'奉礼', - nsfengli_use:'奉礼', - visible_nsfengli:'奉礼', - nsfengli_info:'回合结束时,你可以选择一名其他角色并展示所有手牌直到你的下回合开始。当该角色于回合外需要使用或打出牌时,其可暗置你的一张明置手牌,然后视为使用或打出之。当你的明置手牌减少时,你可令一名手牌数小于你的角色摸一张牌。', - nsqiyue:'骑钺', - nsqiyue_info:'锁定技,当有角色的武将牌状态改变后,你摸一张牌。', - nsxuezhu:'血逐', - nsxuezhu_info:'当你受到伤害或造成伤害后,你可以令受到伤害的角色摸两张牌并翻面。', - ns_chuanshu:'传术', - ns_chuanshu_info:'限定技 当一名其他角色进入濒死状态时,你可以令其选择获得技能〖雷击〗或〖鬼道〗,其回复体力至1并摸两张牌。当该被【传术】的角色造成或受到一次伤害后,你摸一张牌。其阵亡后,你重置技能〖传术〗。', - ns_xiandao1:'仙道', - ns_xiandao1_info:'锁定技 游戏开始和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段开始。', - ns_xiandao2:'仙道', - ns_xiandao2_info:'锁定技 你防止受到任何属性伤害。', - ns_xiandao:'仙道', - ns_xiandao_info:'锁定技 游戏开始、你进入游戏时和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段阶段开始。你防止受到任何属性伤害。', - ns_chuanshu2:'术', - ns_chuanshu2_info:'锁定技 当你造成或受到一次伤害后,南华老仙摸一张牌。', - ns_chuanshu3:'术', - ns_chuanshu3_info:'锁定技 当你【传术】的角色阵亡后,你重置技能〖传术〗。', - ns_xiuzheng:'修真', - ns_xiuzheng_info:'出牌阶段限一次,你可选择一名其他角色,然后亮出牌堆顶的两张牌,若同为红色,则其受到1点火焰伤害;若同为黑色,其受到1点雷电伤害;若颜色不相同,你弃置其一张牌。然后你获得这两张展示的牌后再弃置两张牌。', - nsanruo:'暗弱', - nsanruo_info:'锁定技,你手牌中的【杀】和普通锦囊牌(借刀杀人等带有指向目标的锦囊除外)均对你不可见。但你可以正常使用之。', - nsxunshan:'循善', - nsxunshan_info:'锁定技,你使用【暗弱】牌可以为其指定任意名合法目标(托管无效)。', - nskaicheng:'开城', - nskaicheng_info:'主公技,你的回合内,你可以将一张【暗弱】牌交给一名群势力其他角色观看,其可以选择是否告诉你此牌的名字。然后你选择一项:使用这张牌并摸一张牌;或结束此回合。', - nsjuanli:'狷戾', - nsjuanli_info:'出牌阶段限一次,你可以和一名有手牌的其他角色进行赌牌,若你赢,目标角色失去1点体力且该角色与你距离-1直到与你下次赌牌,若你没赢,目标角色回复1点体力,且该角色与你距离+1直到与你的下次赌牌。(赌牌:赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利)', - nsyuanchou:'远筹', - nsyuanchou_info:'锁定技,当你成为锦囊牌的目标时,若来源角色与你的距离大于1,则取消之。', - nsguhuo:'蛊惑', - nsguhuo_info:'锁定技,你在一个回合中使用前两张牌时,你对一名随机角色从牌堆(牌堆无则从弃牌堆)随机使用一张同类别卡牌。', - nsqinxue:'勤学', - nsqinxue_info:'每个效果每回合只能使用一次。①当你使用一张基本牌时,你从牌堆随机获得一张锦囊牌;②当你使用一张锦囊牌时,你从牌堆随机获得一张装备牌;③当你使用一张装备牌时,你从牌堆随机获得一张基本牌。', - nsbaiyi:'白衣', - nsbaiyi_info:'锁定技,若你本回合发动过勤学,你跳过弃牌阶段,改为弃置X张牌(X为本回合发动勤学次数);若你弃置了3张类别不同的牌,你获得一个额外回合(不可连续获得回合),否则你观看牌堆顶的X张牌并获得其中一张。', - nsbaiming:'百鸣', - nsbaiming_info:'当你使用【杀】时,你可以获得一项未获得过且与杀或伤害相关的技能,此【杀】结算完毕后,你失去以此法获得的技能。', - nsfuge:'覆戈', - nsfuge_info:'你的回合结束后,你可以执行一个额外的回合,此回合的摸牌阶段,你于摸牌阶段额外摸X张牌(X为你已损失的体力值);若如此做,直到洗牌前,你不能再发动此技能。', - nstanbing:'谈兵', - nstanbing_info:'摸牌阶段开始时,你可弃置一张手牌,然后摸X张牌(X为你弃置牌的名称字数),若如此做,本回合你不可使用或打出【杀】。', - nsxinzhan:'心战', - nsxinzhan_info:'出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去1点体力上限。', - nsfuhuo:'符火', - nsfuhuo2:'符火', - nsfuhuo_info:'出牌阶段限一次,你可将一张手牌置于一名武将牌上没有“符”的角色的武将牌上,称为“符”,若如此做,其回合外使用或打出【闪】时,你可令其判定,若结果为:红桃,你对其造成2点火焰伤害;方块,你弃置其一张手牌,然后对其造成1点火焰伤害。你的下个回合开始时,你获得其武将牌上的“符”。', - nswangfeng:'望风', - nswangfeng_info:'在判定牌生效前,你可以打出一张红色牌替换之。', - nshunji:'混击', - nshunji_info:'出牌阶段限一次,你可以摸一张牌,视为使用一张【万箭齐发】。此【万箭齐发】造成伤害时,受伤害角色选择一项:①弃置你一张牌;②摸一张牌。', - nscuanquan:'篡权', - nscuanquan_info:'锁定技,如果你的身份为忠臣,则在受伤三次后与主公,互换身份和体力上限。', - nsjianning:'奸佞', - nsjianning_info:'出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成1点伤害。', - nschangshi:'常仕', - nschangshi_info:'出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去1点体力。', - nsbaquan:'霸权', - nsbaquan_info:'回合结束时,你可以弃置所有手牌,并获得相应点数的护甲,你的新一回合开始时清除所有护甲。', - nsbugua:'卜卦', - nsbugua_use_info:'弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数随机获得牌堆中相应的一张牌。', - nsbugua_info:'出牌阶段限一次,你可以弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数按以下规则随机获得牌堆中相应的一张牌:乾(红桃偶数):无中生有;坤(黑桃奇数):决斗;震(黑桃偶数):南蛮入侵;巽(红桃奇数):万箭齐发;坎(梅花偶数):过河拆桥、兑(梅花奇数):借刀杀人、艮(方片偶数):顺手牵羊、离(方片奇数):火攻。若牌堆中无此牌则摸一张牌,然后你观看未展示的另外五张牌并按任意顺序将其置于牌堆顶。', - nstuiyan:'推演', - nstuiyan_info:'出牌阶段,若你使用的牌点数比上一张使用的牌点数大,你可以摸一张牌,反之你本回合不能再以此法摸牌;当你使用的牌点数首次达到8的倍数时,你可以在结算后立即发动一次【卜卦】。', - nstianji:'天机', - nstianji_info:'限定技,当一名其他角色进入濒死状态,你可自减1点体力上限,令其回复体力至1并增加1点体力上限。', - nszhaoxin:'昭心', - nszhaoxin_info:'锁定技,你始终展示手牌。', - nsxiuxin:'修穆', - nsxiuxin_info:'锁定技,若你没有某种花色的手牌,你不能成为这种花色的牌的目标。', - nsshijun:'弑君', - nsshijun_info:'锁定技,你造成伤害时,你令此伤害+1,并在结算后失去1点体力。', - nshunyou:'魂佑', - nshunyou_info:'出阶段限一次,你可以弃置一张基本牌,获得弃牌堆底的一张装备牌和一张锦囊牌,然后你可以将那张装备牌装备给一名角色(允许替换)。如果弃牌堆没有装备以及锦囊牌,则改为摸X张牌,X为损失的体力加一(最多3张)。', - nswulie:'武烈', - nswulie_info:'限定技,准备阶段,你可以失去1点体力上限,从弃牌堆选择最多三张牌以任意顺序放置于牌堆顶。若如此做,此回合的结束阶段,你可以重复此操作。', - nscangxi:'藏玺', - nscangxi2:'藏玺', - nscangxi_info:'主公技,其他吴势力角色的弃牌阶段结束时,若其弃置了至少两张牌,则可以选择判定,若是黑色,则其选择一项,1,令主公摸一张并且展示;2,主公手牌上限永久加一;3,额外弃置一张牌,令主公获得本回合进入弃牌堆的一张牌。', - nsdongcha:'洞察', - nsdongcha_info:'锁定技,单体锦囊牌无法对你造成伤害。其它角色于其回合内第二次使用锦囊牌指定你为目标时,取消之。', - nscaijian:'才鉴', - nscaijian_info:'出牌阶段限一次,若你的手牌数不大于你的体力上限,则你可以展示你的手牌,观看牌堆顶相同数量的牌并以任意方式交换之。', - nsgongjian:'恭俭', - nsgongjian_info:'锁定技,弃牌阶段,你须将弃牌交给一名体力值大于你的其它角色。', - nsjianxiong:'奸雄', - nsjianxiong_info:'当你成为一名角色牌的目标后你可以对该角色使用一张牌,若此牌对其造成伤害,则该角色的牌失效。若失效的为黑色牌,则你摸一张牌。', - nsxionglue:'雄略', - nsxionglue_info:'出牌阶段限一次,你可以弃置一张黑色手牌,然后发现一张锦囊牌。', - nsyaowang:'妖妄', - nsyaowang_info:'回合开始阶段你可以选择一名角色然后获得其其中一项技能直到回合结束,然后该角色随机获得一项未上场武将的其中一项技能直到其回合结束。', - nshuanhuo:'幻惑', - nshuanhuo_info:'每当你失去1点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)。', - nsjianshu:'剑术', - nsjianshu_info:'锁定技:每当你的装备区有武器时,你使用【杀】指定一个目标后,该角色需要依次使用两张【闪】才能抵消此【杀】。', - nscangjian:'藏剑', - nscangjian_info:'每当你对一名角色造成伤害,你可以获得其装备区一张牌。', - nsyunxing:'陨星', - nsyunxing_info:'锁定技,当场上一名角色死亡,若为蜀,你失去1点体力;若为吴,你回复1点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面。', - nsguanxing:'观星', - nsguanxing_info:'锁定技,准备阶段,你观看牌堆的X张牌(X为场上存活人数)并且任意移动Y张牌(Y为你当前体力值)。', - nscaiyi:'猜疑', - nscaiyi_info:'其他角色摸牌后,你可以观看其摸到的牌,若其中有【杀】,则视为你对其使用一张【杀】,若其中没有【杀】,则视为其对你使用一张【杀】(计入出杀次数)。', - nsgefa:'割发', - nsgefa_info:'当你的体力值等于0或更低时,你可以将任意一张♣牌当【桃】使用。', - nshaoling:'号令', - nshaoling_info:'限定技,出牌阶段,你可以指定一名其他角色,令另外所有其他角色角色选择一项:1、对该角色使用一张【杀】;2、交给你一张牌,然后视为你对其使用一张【杀】。', - nspinmin:'拼命', - nspinmin_info:'锁定技,当你于回合内死亡时,你不死亡并增加1点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少1点体力上限(体力上限为0会导致你死亡)。', - nsshishou:'失手', - nsshishou_info:'锁定技,当你于回合内失去手牌时,你失去1点体力并摸一张牌;你回合内使用的牌数不能超过4。', - nsduijue:'对决', - nsduijue_info:'出牌阶段开始时,你可以弃置一张手牌,若如此做,此阶段你可以将一张与此牌颜色不同的手牌当作【决斗】使用(限2次)。', - nsshuangxiong:'双雄', - nsshuangxiong_info:'当你使用【决斗】或被使用【决斗】时,你可以将武将牌翻面。', - nsshuangxiong_append:'背面武将:文丑,2体力,你可以将一张牌当【杀】打出。', - nsguanyong:'冠勇', - nsguanyong_info:'你可以将一张手牌当【杀】打出。', - nsjihui:'急恚', - nsjihui_info:'锁定技,每当一名角色一次弃置了三张或更多的牌,你获得一个额外回合;你的额外回合内,你使用牌只能指定你与上一回合角色为目标。', - nsmouyun:'谋运', - nsmouyun_info:'每两轮限一次,你可以弃置场上体力值最少的一名其他角色区域内的X张牌。(X为其损失的体力值)', - nscongjun:'从军', - nscongjun_info:'锁定技,游戏开始时,你变身为一名随机男性角色;当一名敌方角色使用无懈可击时,你有小概率亮出此武将并变回花木兰,然后对该角色造成2点伤害。', - nshuanxian:'幻仙', - nshuanxian_info:'锁定技,游戏开始时,你获得随从“幻身·右”,当你首次受到伤害时,你获得随从“幻身·左”(体力上限2,初始手牌2);你与幻身在摸牌阶段均少摸一张牌;在你的回合中(如果有对应幻身),你以【幻身·左-本体-幻身·右】的顺序进行3个连续回合。', - nstaiping_nh:'太平', - nstaiping_nh_info:'当你受到1点伤害后(首次伤害除外),你可以选择一项: ①令一个“幻身”增加1点体力上限。②令一个“幻身”回复1点体力。', - nsshoudao:'授道', - nsshoudao_info:'当左右“幻身”全部死亡时,你获得技能“雷击”和“鬼道”。当你死亡时,若此时有两个“幻身”,你可以令一名其他角色获得技能“雷击”和“鬼道”。若有一个“幻身”,你可以令一名其他角色获得技能“雷击”或“鬼道”。(杀死你的角色除外)', - nsnongquan:'弄权', - nsnongquan_info:'出牌阶段,你可以将最后一张手牌当作【无中生有】使用。', - nsdufu:'毒妇', - nsdufu_info:'每当你即将造成一次伤害时,你可以为此伤害重新指定伤害来源。', - yiesheng:'回雪', - yiesheng_info:'出牌阶段,你可以弃置任意数量的黑色手牌,然后摸等量的牌。', - liangji:'环计', - liangji_info:'出牌阶段限一次,你可以选择一名未以此法放置牌的其他角色并将一张手牌置于其武将牌上。目标角色于摸牌阶段开始时,获得此牌。若其为男性角色,则获得技能〖无双〗,若其为女性角色,则获得技能〖离间〗,直到回合结束。', - chengmou:'逞谋', - chengmou_info:'摸牌阶段开始时,若你有“功”牌,你获得之并跳过摸牌阶段,若你所获得的“功”牌多于两张,你须失去1点体力。', - jugong:'居功', - jugong_info:'回合外每名角色的回合限一次,每当场上有角色因受到【杀】或【决斗】造成的伤害,你可以摸一张牌并且将一张手牌置于你的武将牌上,称之为“功”。在你即将受到伤害时,你可以弃置两张“功”,防止此伤害。', - nsxinsheng:'新生', - nsxinsheng_info:'每当你对其他角色造成伤害后,若你未受伤,则你可以增加X点体力上限并摸X张牌,X为伤害点数。', - nsdunxing:'遁形', - nsdunxing_info:'每当你即将受到其他角色造成的伤害时,若你已受伤,则你可以防止此伤害,改为失去X点体力上限并摸X张牌,X为伤害点数。', - liangce:'粮策', - liangce_info:'①出牌阶段限一次,你可以将一张基本牌当【五谷丰登】使用。②当因执行【五谷丰登】的效果而亮出的牌因效果执行完毕而置入弃牌堆后,你可以选择一名角色,令该角色获取之。', - jianbi:'坚壁', - jianbi_info:'当你成为锦囊牌的目标时,若此牌的目标包括其他角色,你可以令此牌对1个目标无效。', - diyjuntun:'军屯', - diyjuntun_info:'出牌阶段,你可以重铸装备牌。', - choudu:'筹度', - choudu_info:'出牌阶段限一次,你可以弃置一张牌,并指定一名角色视为其使用一张调兵遣将。', - liduan:'立断', - liduan_info:'当一名其他角色于其回合外得到牌后,若其此次得到的牌数为1且为装备牌(无论是否可见),你可以令该角色选择一项:1.使用此牌;2.将一张手牌交给你。', - fuchou:'负仇', - fuchou2:'负仇', - fuchou_info:'当你成为【杀】的目标时,你可以将一张牌交给此【杀】的使用者,令此【杀】对你无效且你到其的距离于当前回合内视为1,若如此做,此回合的结束阶段开始时,其令你摸一张牌,然后你需对其使用【杀】,否则失去1点体力。', - jinyan:'噤言', - jinyan_info:'锁定技。若你的体力值不大于2,你的黑色锦囊牌视为【杀】。', - chezhen:'车阵', - chezhen_info:'锁定技。若你的装备区里:没有牌,你的防御距离+1;有牌,你的进攻距离+1。', - youzhan:'诱战', - youzhan_info:'当以你距离不大于1的角色为目标的【杀】的使用结算开始时,你可以弃置一张装备牌,令该角色视为使用【诱敌深入】。', - kangyin:'亢音', - kangyin2:'亢音', - kangyin_info:'出牌阶段限一次,你可以失去1点体力并选择一名其他角色,弃置该角色的一张牌。若此牌:为基本牌,你可以令一至X名角色各摸一张牌;不为基本牌,于此回合内:你的进攻距离+X,且你使用【杀】的额外目标数上限+X。(X为你已损失的体力值)', - zhucheng:'筑城', - zhucheng2:'筑城', - zhucheng_info:'①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效。', - duoqi:'夺气', - duoqi_info:'当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段。', + diy_wenyang: "文鸯", + ns_zhangwei: "张葳", + nshuaishuang: "怀霜", + nshuaishuang_info: "锁定技,结束阶段,你从牌堆/弃牌堆获得一张【桃】,然后失去1点体力。", + nsfengli: "奉礼", + nsfengli2: "奉礼", + nsfengli_draw: "奉礼", + nsfengli_clear: "奉礼", + nsfengli_use: "奉礼", + visible_nsfengli: "奉礼", + nsfengli_info: + "回合结束时,你可以选择一名其他角色并展示所有手牌直到你的下回合开始。当该角色于回合外需要使用或打出牌时,其可暗置你的一张明置手牌,然后视为使用或打出之。当你的明置手牌减少时,你可令一名手牌数小于你的角色摸一张牌。", + nsqiyue: "骑钺", + nsqiyue_info: "锁定技,当有角色的武将牌状态改变后,你摸一张牌。", + nsxuezhu: "血逐", + nsxuezhu_info: "当你受到伤害或造成伤害后,你可以令受到伤害的角色摸两张牌并翻面。", + ns_chuanshu: "传术", + ns_chuanshu_info: + "限定技 当一名其他角色进入濒死状态时,你可以令其选择获得技能〖雷击〗或〖鬼道〗,其回复体力至1并摸两张牌。当该被【传术】的角色造成或受到一次伤害后,你摸一张牌。其阵亡后,你重置技能〖传术〗。", + ns_xiandao1: "仙道", + ns_xiandao1_info: + "锁定技 游戏开始和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段开始。", + ns_xiandao2: "仙道", + ns_xiandao2_info: "锁定技 你防止受到任何属性伤害。", + ns_xiandao: "仙道", + ns_xiandao_info: + "锁定技 游戏开始、你进入游戏时和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段阶段开始。你防止受到任何属性伤害。", + ns_chuanshu2: "术", + ns_chuanshu2_info: "锁定技 当你造成或受到一次伤害后,南华老仙摸一张牌。", + ns_chuanshu3: "术", + ns_chuanshu3_info: + "锁定技 当你【传术】的角色阵亡后,你重置技能〖传术〗。", + ns_xiuzheng: "修真", + ns_xiuzheng_info: + "出牌阶段限一次,你可选择一名其他角色,然后亮出牌堆顶的两张牌,若同为红色,则其受到1点火焰伤害;若同为黑色,其受到1点雷电伤害;若颜色不相同,你弃置其一张牌。然后你获得这两张展示的牌后再弃置两张牌。", + nsanruo: "暗弱", + nsanruo_info: + "锁定技,你手牌中的【杀】和普通锦囊牌(借刀杀人等带有指向目标的锦囊除外)均对你不可见。但你可以正常使用之。", + nsxunshan: "循善", + nsxunshan_info: "锁定技,你使用【暗弱】牌可以为其指定任意名合法目标(托管无效)。", + nskaicheng: "开城", + nskaicheng_info: + "主公技,你的回合内,你可以将一张【暗弱】牌交给一名群势力其他角色观看,其可以选择是否告诉你此牌的名字。然后你选择一项:使用这张牌并摸一张牌;或结束此回合。", + nsjuanli: "狷戾", + nsjuanli_info: + "出牌阶段限一次,你可以和一名有手牌的其他角色进行赌牌,若你赢,目标角色失去1点体力且该角色与你距离-1直到与你下次赌牌,若你没赢,目标角色回复1点体力,且该角色与你距离+1直到与你的下次赌牌。(赌牌:赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次亮出牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利)", + nsyuanchou: "远筹", + nsyuanchou_info: "锁定技,当你成为锦囊牌的目标时,若来源角色与你的距离大于1,则取消之。", + nsguhuo: "蛊惑", + nsguhuo_info: + "锁定技,你在一个回合中使用前两张牌时,你对一名随机角色从牌堆(牌堆无则从弃牌堆)随机使用一张同类别卡牌。", + nsqinxue: "勤学", + nsqinxue_info: + "每个效果每回合只能使用一次。①当你使用一张基本牌时,你从牌堆随机获得一张锦囊牌;②当你使用一张锦囊牌时,你从牌堆随机获得一张装备牌;③当你使用一张装备牌时,你从牌堆随机获得一张基本牌。", + nsbaiyi: "白衣", + nsbaiyi_info: + "锁定技,若你本回合发动过勤学,你跳过弃牌阶段,改为弃置X张牌(X为本回合发动勤学次数);若你弃置了3张类别不同的牌,你获得一个额外回合(不可连续获得回合),否则你观看牌堆顶的X张牌并获得其中一张。", + nsbaiming: "百鸣", + nsbaiming_info: + "当你使用【杀】时,你可以获得一项未获得过且与杀或伤害相关的技能,此【杀】结算完毕后,你失去以此法获得的技能。", + nsfuge: "覆戈", + nsfuge_info: + "你的回合结束后,你可以执行一个额外的回合,此回合的摸牌阶段,你于摸牌阶段额外摸X张牌(X为你已损失的体力值);若如此做,直到洗牌前,你不能再发动此技能。", + nstanbing: "谈兵", + nstanbing_info: + "摸牌阶段开始时,你可弃置一张手牌,然后摸X张牌(X为你弃置牌的名称字数),若如此做,本回合你不可使用或打出【杀】。", + nsxinzhan: "心战", + nsxinzhan_info: + "出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去1点体力上限。", + nsfuhuo: "符火", + nsfuhuo2: "符火", + nsfuhuo_info: + "出牌阶段限一次,你可将一张手牌置于一名武将牌上没有“符”的角色的武将牌上,称为“符”,若如此做,其回合外使用或打出【闪】时,你可令其判定,若结果为:红桃,你对其造成2点火焰伤害;方块,你弃置其一张手牌,然后对其造成1点火焰伤害。你的下个回合开始时,你获得其武将牌上的“符”。", + nswangfeng: "望风", + nswangfeng_info: "在判定牌生效前,你可以打出一张红色牌替换之。", + nshunji: "混击", + nshunji_info: + "出牌阶段限一次,你可以摸一张牌,视为使用一张【万箭齐发】。此【万箭齐发】造成伤害时,受伤害角色选择一项:①弃置你一张牌;②摸一张牌。", + nscuanquan: "篡权", + nscuanquan_info: "锁定技,如果你的身份为忠臣,则在受伤三次后与主公,互换身份和体力上限。", + nsjianning: "奸佞", + nsjianning_info: + "出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成1点伤害。", + nschangshi: "常仕", + nschangshi_info: + "出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去1点体力。", + nsbaquan: "霸权", + nsbaquan_info: + "回合结束时,你可以弃置所有手牌,并获得相应点数的护甲,你的新一回合开始时清除所有护甲。", + nsbugua: "卜卦", + nsbugua_use_info: + "弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数随机获得牌堆中相应的一张牌。", + nsbugua_info: + "出牌阶段限一次,你可以弃置一张牌,并将牌堆顶的六张牌反面朝上逐张按先后顺序排放,然后抛骰子,展示牌序号与骰子显示的点数一致的牌,然后你根据这张牌的花色、点数按以下规则随机获得牌堆中相应的一张牌:乾(红桃偶数):无中生有;坤(黑桃奇数):决斗;震(黑桃偶数):南蛮入侵;巽(红桃奇数):万箭齐发;坎(梅花偶数):过河拆桥、兑(梅花奇数):借刀杀人、艮(方片偶数):顺手牵羊、离(方片奇数):火攻。若牌堆中无此牌则摸一张牌,然后你观看未展示的另外五张牌并按任意顺序将其置于牌堆顶。", + nstuiyan: "推演", + nstuiyan_info: + "出牌阶段,若你使用的牌点数比上一张使用的牌点数大,你可以摸一张牌,反之你本回合不能再以此法摸牌;当你使用的牌点数首次达到8的倍数时,你可以在结算后立即发动一次【卜卦】。", + nstianji: "天机", + nstianji_info: + "限定技,当一名其他角色进入濒死状态,你可自减1点体力上限,令其回复体力至1并增加1点体力上限。", + nszhaoxin: "昭心", + nszhaoxin_info: "锁定技,你始终展示手牌。", + nsxiuxin: "修穆", + nsxiuxin_info: "锁定技,若你没有某种花色的手牌,你不能成为这种花色的牌的目标。", + nsshijun: "弑君", + nsshijun_info: "锁定技,你造成伤害时,你令此伤害+1,并在结算后失去1点体力。", + nshunyou: "魂佑", + nshunyou_info: + "出阶段限一次,你可以弃置一张基本牌,获得弃牌堆底的一张装备牌和一张锦囊牌,然后你可以将那张装备牌装备给一名角色(允许替换)。如果弃牌堆没有装备以及锦囊牌,则改为摸X张牌,X为损失的体力加一(最多3张)。", + nswulie: "武烈", + nswulie_info: + "限定技,准备阶段,你可以失去1点体力上限,从弃牌堆选择最多三张牌以任意顺序放置于牌堆顶。若如此做,此回合的结束阶段,你可以重复此操作。", + nscangxi: "藏玺", + nscangxi2: "藏玺", + nscangxi_info: + "主公技,其他吴势力角色的弃牌阶段结束时,若其弃置了至少两张牌,则可以选择判定,若是黑色,则其选择一项,1,令主公摸一张并且展示;2,主公手牌上限永久加一;3,额外弃置一张牌,令主公获得本回合进入弃牌堆的一张牌。", + nsdongcha: "洞察", + nsdongcha_info: + "锁定技,单体锦囊牌无法对你造成伤害。其它角色于其回合内第二次使用锦囊牌指定你为目标时,取消之。", + nscaijian: "才鉴", + nscaijian_info: + "出牌阶段限一次,若你的手牌数不大于你的体力上限,则你可以展示你的手牌,观看牌堆顶相同数量的牌并以任意方式交换之。", + nsgongjian: "恭俭", + nsgongjian_info: "锁定技,弃牌阶段,你须将弃牌交给一名体力值大于你的其它角色。", + nsjianxiong: "奸雄", + nsjianxiong_info: + "当你成为一名角色牌的目标后你可以对该角色使用一张牌,若此牌对其造成伤害,则该角色的牌失效。若失效的为黑色牌,则你摸一张牌。", + nsxionglue: "雄略", + nsxionglue_info: "出牌阶段限一次,你可以弃置一张黑色手牌,然后发现一张锦囊牌。", + nsyaowang: "妖妄", + nsyaowang_info: + "回合开始阶段你可以选择一名角色然后获得其其中一项技能直到回合结束,然后该角色随机获得一项未上场武将的其中一项技能直到其回合结束。", + nshuanhuo: "幻惑", + nshuanhuo_info: + "每当你失去1点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)。", + nsjianshu: "剑术", + nsjianshu_info: + "锁定技:每当你的装备区有武器时,你使用【杀】指定一个目标后,该角色需要依次使用两张【闪】才能抵消此【杀】。", + nscangjian: "藏剑", + nscangjian_info: "每当你对一名角色造成伤害,你可以获得其装备区一张牌。", + nsyunxing: "陨星", + nsyunxing_info: + "锁定技,当场上一名角色死亡,若为蜀,你失去1点体力;若为吴,你回复1点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面。", + nsguanxing: "观星", + nsguanxing_info: + "锁定技,准备阶段,你观看牌堆的X张牌(X为场上存活人数)并且任意移动Y张牌(Y为你当前体力值)。", + nscaiyi: "猜疑", + nscaiyi_info: + "其他角色摸牌后,你可以观看其摸到的牌,若其中有【杀】,则视为你对其使用一张【杀】,若其中没有【杀】,则视为其对你使用一张【杀】(计入出杀次数)。", + nsgefa: "割发", + nsgefa_info: "当你的体力值等于0或更低时,你可以将任意一张♣牌当【桃】使用。", + nshaoling: "号令", + nshaoling_info: + "限定技,出牌阶段,你可以指定一名其他角色,令另外所有其他角色角色选择一项:1、对该角色使用一张【杀】;2、交给你一张牌,然后视为你对其使用一张【杀】。", + nspinmin: "拼命", + nspinmin_info: + "锁定技,当你于回合内死亡时,你不死亡并增加1点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少1点体力上限(体力上限为0会导致你死亡)。", + nsshishou: "失手", + nsshishou_info: + "锁定技,当你于回合内失去手牌时,你失去1点体力并摸一张牌;你回合内使用的牌数不能超过4。", + nsduijue: "对决", + nsduijue_info: + "出牌阶段开始时,你可以弃置一张手牌,若如此做,此阶段你可以将一张与此牌颜色不同的手牌当作【决斗】使用(限2次)。", + nsshuangxiong: "双雄", + nsshuangxiong_info: "当你使用【决斗】或被使用【决斗】时,你可以将武将牌翻面。", + nsshuangxiong_append: "背面武将:文丑,2体力,你可以将一张牌当【杀】打出。", + nsguanyong: "冠勇", + nsguanyong_info: "你可以将一张手牌当【杀】打出。", + nsjihui: "急恚", + nsjihui_info: + "锁定技,每当一名角色一次弃置了三张或更多的牌,你获得一个额外回合;你的额外回合内,你使用牌只能指定你与上一回合角色为目标。", + nsmouyun: "谋运", + nsmouyun_info: + "每两轮限一次,你可以弃置场上体力值最少的一名其他角色区域内的X张牌。(X为其损失的体力值)", + nscongjun: "从军", + nscongjun_info: + "锁定技,游戏开始时,你变身为一名随机男性角色;当一名敌方角色使用无懈可击时,你有小概率亮出此武将并变回花木兰,然后对该角色造成2点伤害。", + nshuanxian: "幻仙", + nshuanxian_info: + "锁定技,游戏开始时,你获得随从“幻身·右”,当你首次受到伤害时,你获得随从“幻身·左”(体力上限2,初始手牌2);你与幻身在摸牌阶段均少摸一张牌;在你的回合中(如果有对应幻身),你以【幻身·左-本体-幻身·右】的顺序进行3个连续回合。", + nstaiping_nh: "太平", + nstaiping_nh_info: + "当你受到1点伤害后(首次伤害除外),你可以选择一项: ①令一个“幻身”增加1点体力上限。②令一个“幻身”回复1点体力。", + nsshoudao: "授道", + nsshoudao_info: + "当左右“幻身”全部死亡时,你获得技能“雷击”和“鬼道”。当你死亡时,若此时有两个“幻身”,你可以令一名其他角色获得技能“雷击”和“鬼道”。若有一个“幻身”,你可以令一名其他角色获得技能“雷击”或“鬼道”。(杀死你的角色除外)", + nsnongquan: "弄权", + nsnongquan_info: "出牌阶段,你可以将最后一张手牌当作【无中生有】使用。", + nsdufu: "毒妇", + nsdufu_info: "每当你即将造成一次伤害时,你可以为此伤害重新指定伤害来源。", + yiesheng: "回雪", + yiesheng_info: "出牌阶段,你可以弃置任意数量的黑色手牌,然后摸等量的牌。", + liangji: "环计", + liangji_info: + "出牌阶段限一次,你可以选择一名未以此法放置牌的其他角色并将一张手牌置于其武将牌上。目标角色于摸牌阶段开始时,获得此牌。若其为男性角色,则获得技能〖无双〗,若其为女性角色,则获得技能〖离间〗,直到回合结束。", + chengmou: "逞谋", + chengmou_info: + "摸牌阶段开始时,若你有“功”牌,你获得之并跳过摸牌阶段,若你所获得的“功”牌多于两张,你须失去1点体力。", + jugong: "居功", + jugong_info: + "回合外每名角色的回合限一次,每当场上有角色因受到【杀】或【决斗】造成的伤害,你可以摸一张牌并且将一张手牌置于你的武将牌上,称之为“功”。在你即将受到伤害时,你可以弃置两张“功”,防止此伤害。", + nsxinsheng: "新生", + nsxinsheng_info: + "每当你对其他角色造成伤害后,若你未受伤,则你可以增加X点体力上限并摸X张牌,X为伤害点数。", + nsdunxing: "遁形", + nsdunxing_info: + "每当你即将受到其他角色造成的伤害时,若你已受伤,则你可以防止此伤害,改为失去X点体力上限并摸X张牌,X为伤害点数。", + liangce: "粮策", + liangce_info: + "①出牌阶段限一次,你可以将一张基本牌当【五谷丰登】使用。②当因执行【五谷丰登】的效果而亮出的牌因效果执行完毕而置入弃牌堆后,你可以选择一名角色,令该角色获取之。", + jianbi: "坚壁", + jianbi_info: "当你成为锦囊牌的目标时,若此牌的目标包括其他角色,你可以令此牌对1个目标无效。", + diyjuntun: "军屯", + diyjuntun_info: "出牌阶段,你可以重铸装备牌。", + choudu: "筹度", + choudu_info: "出牌阶段限一次,你可以弃置一张牌,并指定一名角色视为其使用一张调兵遣将。", + liduan: "立断", + liduan_info: + "当一名其他角色于其回合外得到牌后,若其此次得到的牌数为1且为装备牌(无论是否可见),你可以令该角色选择一项:1.使用此牌;2.将一张手牌交给你。", + fuchou: "负仇", + fuchou2: "负仇", + fuchou_info: + "当你成为【杀】的目标时,你可以将一张牌交给此【杀】的使用者,令此【杀】对你无效且你到其的距离于当前回合内视为1,若如此做,此回合的结束阶段开始时,其令你摸一张牌,然后你需对其使用【杀】,否则失去1点体力。", + jinyan: "噤言", + jinyan_info: "锁定技。若你的体力值不大于2,你的黑色锦囊牌视为【杀】。", + chezhen: "车阵", + chezhen_info: "锁定技。若你的装备区里:没有牌,你的防御距离+1;有牌,你的进攻距离+1。", + youzhan: "诱战", + youzhan_info: + "当以你距离不大于1的角色为目标的【杀】的使用结算开始时,你可以弃置一张装备牌,令该角色视为使用【诱敌深入】。", + kangyin: "亢音", + kangyin2: "亢音", + kangyin_info: + "出牌阶段限一次,你可以失去1点体力并选择一名其他角色,弃置该角色的一张牌。若此牌:为基本牌,你可以令一至X名角色各摸一张牌;不为基本牌,于此回合内:你的进攻距离+X,且你使用【杀】的额外目标数上限+X。(X为你已损失的体力值)", + zhucheng: "筑城", + zhucheng2: "筑城", + zhucheng_info: + "①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效。", + duoqi: "夺气", + duoqi_info: + "当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段。", - siji:'伺机', - ciqiu:'刺酋', - ciqiu_dying:'刺酋', - diy_liuyan:'刘焉', - juedao:'绝道', - geju:'割据', - shaoying:'烧营', - zonghuo:'纵火', - diychanyuan:'缠怨', - diyguhuo:'蛊惑', - jieyan:'劫焰', - honglian:'红莲', - xiongzi:'雄姿', - luweiyan:'围堰', - guihan:'归汉', - diyduanliang:'断粮', - diyduanliang1:'断粮', - diyduanliang2:'断粮', - diyqiangxi:'强袭', - diykuanggu:'狂骨', - diyzaiqi:'再起', - batu:'霸图', - zaiqix:'再起', - diy_jiaoxia:'皎霞', - yaliang:'雅量', - yaliang_info:'每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。', - diy_jiaoxia_info:'每当你成为红色牌的目标,你可以摸一张牌。', - zaiqix_info:'摸牌阶段,若你已受伤,你可以改为亮出牌堆顶的X+1张牌,X为你已损失的体力值,其中每有一张♥牌,你回复1点体力,然后弃掉这些♥牌,将其余的牌收入手牌。', - batu_info:'结束阶段,你可以将手牌数补至X,X为现存的势力数。', - diyzaiqi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。', - diykuanggu_info:'锁定技,每当你造成1点伤害,你在其攻击范围内,你回复1点体力,否则你摸一张牌。', - diyqiangxi_info:'出牌阶段,你可以自减1点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成1点伤害并弃置其一张牌,每回合限一次。', - diyduanliang_info:'出牌阶段限一次,你可以将一张黑色的基本牌当兵粮寸断对一名角色使用,然后摸一张牌。你的兵粮寸断可以指定距离2以内的角色作为目标。', - guihan_info:'限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复1点体力并摸两张牌。', - luweiyan_info:'出牌阶段限一次,你可以将一张非基本牌当作水攻使用;结算后你可以视为对其中一个目标使用一张不计入出杀次数的【杀】。', - xiongzi_info:'锁定技,你于摸牌阶段额外摸X+1张牌,X为你装备区牌数的一半,向下取整。', - honglian_info:'每当你受到来自其他角色的伤害,可以弃置伤害来源的所有红色牌。', - jieyan_info:'出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害。', - diyguhuo_info:'锁定技,准备阶段,你摸两张牌,然后弃置区域内的两张牌。', - diychanyuan_info:'锁定技,杀死你的角色失去1点体力上限。', - zonghuo_info:'你可弃置一张牌将你即将造成的伤害变为火焰伤害。', - shaoying_info:'每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并亮出牌堆顶的一张牌,若此牌为红色,该角色受到1点火焰伤害。', - juedao_info:'出牌阶段,你可以弃置一张手牌,横置你的武将牌;锁定技,若你的武将牌横置,则你计算至其他角色的距离和其他角色计算至你的距离均+1。', - geju_info:'准备阶段开始时,你可以摸X张牌(X为攻击范围内不含有你的势力数)。', - siji_info:'弃牌阶段结束后,你可以摸2X张牌(X为你于此阶段内弃置的【杀】的数量)。', - ciqiu_info:'锁定技,每当你使用【杀】对目标角色造成伤害时,若该角色未受伤,你令此伤害+1;若其因此进入濒死状态,你令其死亡,然后你失去“刺酋”。', - nsshuaiyan_info:'每当其他角色于你的回合外回复体力后,你可以令该角色选择一项:1.令你摸一张牌;2.令你弃置其一张牌。', - moshou_info:'锁定技,你不能成为乐不思蜀和兵粮寸断的目标。', - xicai_info:'你可以立即获得对你造成伤害的牌。', - diyjianxiong_info:'锁定技,在身份局中,在你回合内死亡的角色均视为反贼,国战中,在你回合内死亡的角色若与你势力相同则随机改为另一个势力。', + siji: "伺机", + ciqiu: "刺酋", + ciqiu_dying: "刺酋", + diy_liuyan: "刘焉", + juedao: "绝道", + geju: "割据", + shaoying: "烧营", + zonghuo: "纵火", + diychanyuan: "缠怨", + diyguhuo: "蛊惑", + jieyan: "劫焰", + honglian: "红莲", + xiongzi: "雄姿", + luweiyan: "围堰", + guihan: "归汉", + diyduanliang: "断粮", + diyduanliang1: "断粮", + diyduanliang2: "断粮", + diyqiangxi: "强袭", + diykuanggu: "狂骨", + diyzaiqi: "再起", + batu: "霸图", + zaiqix: "再起", + diy_jiaoxia: "皎霞", + yaliang: "雅量", + yaliang_info: + "每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。", + diy_jiaoxia_info: "每当你成为红色牌的目标,你可以摸一张牌。", + zaiqix_info: + "摸牌阶段,若你已受伤,你可以改为亮出牌堆顶的X+1张牌,X为你已损失的体力值,其中每有一张♥牌,你回复1点体力,然后弃掉这些♥牌,将其余的牌收入手牌。", + batu_info: "结束阶段,你可以将手牌数补至X,X为现存的势力数。", + diyzaiqi_info: "锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。", + diykuanggu_info: "锁定技,每当你造成1点伤害,你在其攻击范围内,你回复1点体力,否则你摸一张牌。", + diyqiangxi_info: + "出牌阶段,你可以自减1点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成1点伤害并弃置其一张牌,每回合限一次。", + diyduanliang_info: + "出牌阶段限一次,你可以将一张黑色的基本牌当兵粮寸断对一名角色使用,然后摸一张牌。你的兵粮寸断可以指定距离2以内的角色作为目标。", + guihan_info: "限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复1点体力并摸两张牌。", + luweiyan_info: + "出牌阶段限一次,你可以将一张非基本牌当作水攻使用;结算后你可以视为对其中一个目标使用一张不计入出杀次数的【杀】。", + xiongzi_info: "锁定技,你于摸牌阶段额外摸X+1张牌,X为你装备区牌数的一半,向下取整。", + honglian_info: "每当你受到来自其他角色的伤害,可以弃置伤害来源的所有红色牌。", + jieyan_info: "出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害。", + diyguhuo_info: "锁定技,准备阶段,你摸两张牌,然后弃置区域内的两张牌。", + diychanyuan_info: "锁定技,杀死你的角色失去1点体力上限。", + zonghuo_info: "你可弃置一张牌将你即将造成的伤害变为火焰伤害。", + shaoying_info: + "每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并亮出牌堆顶的一张牌,若此牌为红色,该角色受到1点火焰伤害。", + juedao_info: + "出牌阶段,你可以弃置一张手牌,横置你的武将牌;锁定技,若你的武将牌横置,则你计算至其他角色的距离和其他角色计算至你的距离均+1。", + geju_info: "准备阶段开始时,你可以摸X张牌(X为攻击范围内不含有你的势力数)。", + siji_info: "弃牌阶段结束后,你可以摸2X张牌(X为你于此阶段内弃置的【杀】的数量)。", + ciqiu_info: + "锁定技,每当你使用【杀】对目标角色造成伤害时,若该角色未受伤,你令此伤害+1;若其因此进入濒死状态,你令其死亡,然后你失去“刺酋”。", + nsshuaiyan_info: + "每当其他角色于你的回合外回复体力后,你可以令该角色选择一项:1.令你摸一张牌;2.令你弃置其一张牌。", + moshou_info: "锁定技,你不能成为乐不思蜀和兵粮寸断的目标。", + xicai_info: "你可以立即获得对你造成伤害的牌。", + diyjianxiong_info: + "锁定技,在身份局中,在你回合内死亡的角色均视为反贼,国战中,在你回合内死亡的角色若与你势力相同则随机改为另一个势力。", - ns_zanghong:'臧洪', - nsshimeng:'誓盟', - nsshimeng_info:'出牌阶段限一次,你可以选择任意名角色。这些角色依次选择一项:⒈摸一张牌。⒉使用一张【杀】。然后若选择前者角色数大于选择后者的角色数,则你获得1点护甲并失去1点体力。', - ns_ruanji:'阮籍', - nsshizui:'酾醉', - nsshizui_info:'每回合限一次。当你成为基本牌或普通锦囊牌的目标后,你可以弃置一张牌,然后视为使用一张【酒】。若你弃置的牌与其使用的牌花色相同,则此牌对你无效;若你弃置的牌为♣,则你获得其使用的牌。', - nsxiaoye:'啸野', - nsxiaoye_info:'一名角色的结束阶段开始时,若你于当前回合内使用过【酒】,则你可以视为使用一张其于本回合内使用过的【杀】或普通锦囊牌。', - ns_limi:'李密', - nstuilun:'退论', - nstuilun_info:'结束阶段,你可以失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。若如此做,你获得如下效果直到你下回合开始:其他角色的回合开始时,若你的体力值小于该角色,则你可以令一名角色回复或失去1点体力;若你的手牌数小于该角色,则你可以令一名角色摸一张牌或弃置一张牌。', - ns_zhonglimu:'钟离牧', - nskuanhuai:'宽怀', - nskuanhuai_info:'出牌阶段开始时,你可以从弃牌堆中获得一张非基本牌。若如此做:你本阶段内不能使用基本牌,且本回合的弃牌阶段结束时,你可以依次使用本阶段内弃置的基本牌。', - nsdingbian:'定边', - nsdingbian_info:'锁定技。当你于回合内使用锦囊牌或装备牌后,你令自己本回合的手牌上限-1且选择一项:⒈从牌堆获得一张基本牌。⒉令一种基本牌于本回合内不计入手牌上限。', - prp_zhugeliang_ab:'诸葛亮', - prp_zhugeliang:'派对浪客', - nsxingyun:'星陨', - nsxingyun_info:'每回合限一次。你可以将一张手牌当做任意一张符合“四象天阵”的牌使用。然后若这两张牌的类型不同,则你删除此“四象天阵”并摸两张牌。当你删除“四象天阵”中的最后一个项目后,你获得技能〖八阵〗。', - nsxingyun_faq:'四象天阵', - nsxingyun_faq_info:'青龙:无标签普通锦囊牌
    朱雀:延时锦囊牌
    白虎:伤害类卡牌
    玄武:【闪】/回复类卡牌', - nshanlang:'酣浪', - nshanlang_info:'准备阶段,你可以和至多三名角色拼点。然后若这些角色中有拼点牌唯一最大的角色,则你可以令该角色从牌堆中获得一张不符合“四象天阵”的牌。', + ns_zanghong: "臧洪", + nsshimeng: "誓盟", + nsshimeng_info: + "出牌阶段限一次,你可以选择任意名角色。这些角色依次选择一项:⒈摸一张牌。⒉使用一张【杀】。然后若选择前者角色数大于选择后者的角色数,则你获得1点护甲并失去1点体力。", + ns_ruanji: "阮籍", + nsshizui: "酾醉", + nsshizui_info: + "每回合限一次。当你成为基本牌或普通锦囊牌的目标后,你可以弃置一张牌,然后视为使用一张【酒】。若你弃置的牌与其使用的牌花色相同,则此牌对你无效;若你弃置的牌为♣,则你获得其使用的牌。", + nsxiaoye: "啸野", + nsxiaoye_info: + "一名角色的结束阶段开始时,若你于当前回合内使用过【酒】,则你可以视为使用一张其于本回合内使用过的【杀】或普通锦囊牌。", + ns_limi: "李密", + nstuilun: "退论", + nstuilun_info: + "结束阶段,你可以失去任意点体力(至多失去至1点)并弃置任意张手牌(至多弃置至一张)。若如此做,你获得如下效果直到你下回合开始:其他角色的回合开始时,若你的体力值小于该角色,则你可以令一名角色回复或失去1点体力;若你的手牌数小于该角色,则你可以令一名角色摸一张牌或弃置一张牌。", + ns_zhonglimu: "钟离牧", + nskuanhuai: "宽怀", + nskuanhuai_info: + "出牌阶段开始时,你可以从弃牌堆中获得一张非基本牌。若如此做:你本阶段内不能使用基本牌,且本回合的弃牌阶段结束时,你可以依次使用本阶段内弃置的基本牌。", + nsdingbian: "定边", + nsdingbian_info: + "锁定技。当你于回合内使用锦囊牌或装备牌后,你令自己本回合的手牌上限-1且选择一项:⒈从牌堆获得一张基本牌。⒉令一种基本牌于本回合内不计入手牌上限。", + prp_zhugeliang_ab: "诸葛亮", + prp_zhugeliang: "派对浪客", + nsxingyun: "星陨", + nsxingyun_info: + "每回合限一次。你可以将一张手牌当做任意一张符合“四象天阵”的牌使用。然后若这两张牌的类型不同,则你删除此“四象天阵”并摸两张牌。当你删除“四象天阵”中的最后一个项目后,你获得技能〖八阵〗。", + nsxingyun_faq: "四象天阵", + nsxingyun_faq_info: + "青龙:无标签普通锦囊牌
    朱雀:延时锦囊牌
    白虎:伤害类卡牌
    玄武:【闪】/回复类卡牌", + nshanlang: "酣浪", + nshanlang_info: + "准备阶段,你可以和至多三名角色拼点。然后若这些角色中有拼点牌唯一最大的角色,则你可以令该角色从牌堆中获得一张不符合“四象天阵”的牌。", - junktaoluan:'滔乱', - junktaoluan_backup:'滔乱', - junktaoluan_info:'你可将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌,且每回合每种花色限一次),然后你令一名其他角色选择一项:1.交给你一张与“滔乱”声明的牌类别不同的牌;2.本回合“滔乱”失效且回合结束时你失去1点体力。', - ns_caimao:'蔡瑁', - nsdingzhou:'定州', - nsdingzhou_info:'出牌阶段限一次,你可以选择一名区域内有牌的其他角色。你随机获得其区域内的一张牌,然后摸一张牌。若你以此法获得了两张颜色不同的牌,则你失去1点体力。', - junkyuheng:'驭衡', - junkyuheng_info:'锁定技。①回合开始时,你须弃置任意张花色不同的牌,从东吴命运线·改中随机获得等量的技能。②回合结束时,你失去所有因〖驭衡①〗获得的技能,然后摸等量的牌。', - junkdili:'帝力', - junkdili_info:'觉醒技。当你获得技能后,若你拥有的技能数大于你的体力上限,则你减1点体力上限,选择失去任意个其他技能,然后获得以下技能中的前等量个:〖圣质〗/〖权道〗/〖持纲〗。', - junkshengzhi:'圣质', - junkshengzhi_info:'锁定技。当你发动非锁定技后,你令你本回合使用的下一张牌无距离和次数限制。', - junkquandao:'权道', - junkquandao_info:'锁定技。当你使用【杀】或普通锦囊牌时,{若你手牌中的【杀】或普通锦囊牌的数量之差X不为0,则你弃置X张数量较多的一种牌},然后你摸一张牌。', - junkchigang:'持纲', - junkchigang_info:'转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。', - junkrende:'仁德', - junkrende_info:'出牌阶段限一次,你可以将任意张手牌交给其他角色。若你给出的牌多于一张,则你回复1点体力。', - junkjizhi:'集智', - junkjizhi_info:'当你使用非转化的普通锦囊牌时,你可以亮出牌堆顶的一张牌A。若A不为基本牌,则你获得A。否则你选择一项:⒈将A置入弃牌堆。⒉将一张手牌置于牌堆顶,然后获得A。', - junkqicai:'奇才', - junkqicai_info:'锁定技。①你使用锦囊牌无距离限制。②你装备区内的非坐骑牌不能被其他角色弃置。', - junkwangxi:'忘隙', - junkwangxi_info:'当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其其中一张牌。', - junkwangxi_tag:'invisible', - junklangmie:'狼灭', - junklangmie_info:'其他角色的结束阶段开始时,你可以选择一项:⒈若其本回合内使用过某种类型的牌超过一张,则你弃置一张牌并摸两张牌。⒉若其本回合累计造成过的伤害大于1,则你弃置一张牌,然后对其造成1点伤害。', - junkshicai:"恃才", - junkshicai_info:"当你使用牌结束完毕后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", - junk_zhangrang:'新杀张让', - junk_zhangrang_prefix:'新杀', - old_jiakui:'手杀贾逵', - old_jiakui_prefix:'手杀', - ol_guohuai:'OL郭淮', - ol_guohuai_prefix:'OL', - old_bulianshi:'RE步练师', - old_bulianshi_prefix:'RE', - ol_maliang:'OL马良', - ol_maliang_prefix:'OL', - junk_lidian:'OL李典', - junk_lidian_prefix:'OL', - junk_duanwei:'新杀段煨', - junk_duanwei_prefix:'新杀', - junk_xuyou:'手杀许攸', - junk_xuyou_prefix:'手杀', - junk_liubei:'旧界刘备', - junk_liubei_prefix:'旧界', - junk_huangyueying:'旧界黄月英', - junk_huangyueying_prefix:'旧界', - old_majun:'骰子马钧', - old_majun_prefix:'骰子', - ns_mengyou:'数学孟优', - ns_mengyou_prefix:'数学', - ns_mengyou_ab:'孟优', - nsmanzhi:'蛮智', - nsmanzhi_info:'准备阶段或结束阶段开始时,你可以将场上出现的数字代入等式中的A和B。若此等式成立,你摸Y张牌。(等式为Y=0.5A2+2.5B-X,其中X为游戏轮数,Y为存活人数)', - ns_chengpu:'铁索程普', - ns_chengpu_prefix:'铁索', - ns_chengpu_ab:'程普', - ns_sundeng:'画饼孙登', - ns_sundeng_prefix:'画饼', - ns_sundeng_ab:'孙登', - ns_duji:'画饼杜畿', - ns_duji_prefix:'画饼', - ns_duji_ab:'杜畿', - junk_zhangjiao:'OL神张角', - junk_zhangjiao_prefix:'OL神', - junksijun:'肆军', - junksijun_info:'准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”,然后从牌堆中随机获得任意张点数之和为36的牌(若牌堆没有点数和为36的组合则获得牌堆顶点数和刚好超过36的牌组)。', - junk_guanyu:'旧谋关羽', - junk_guanyu_prefix:'旧谋', + junktaoluan: "滔乱", + junktaoluan_backup: "滔乱", + junktaoluan_info: + "你可将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌,且每回合每种花色限一次),然后你令一名其他角色选择一项:1.交给你一张与“滔乱”声明的牌类别不同的牌;2.本回合“滔乱”失效且回合结束时你失去1点体力。", + ns_caimao: "蔡瑁", + nsdingzhou: "定州", + nsdingzhou_info: + "出牌阶段限一次,你可以选择一名区域内有牌的其他角色。你随机获得其区域内的一张牌,然后摸一张牌。若你以此法获得了两张颜色不同的牌,则你失去1点体力。", + junkyuheng: "驭衡", + junkyuheng_info: + '锁定技。①回合开始时,你须弃置任意张花色不同的牌,从东吴命运线·改中随机获得等量的技能。②回合结束时,你失去所有因〖驭衡①〗获得的技能,然后摸等量的牌。', + junkdili: "帝力", + junkdili_info: + "觉醒技。当你获得技能后,若你拥有的技能数大于你的体力上限,则你减1点体力上限,选择失去任意个其他技能,然后获得以下技能中的前等量个:〖圣质〗/〖权道〗/〖持纲〗。", + junkshengzhi: "圣质", + junkshengzhi_info: "锁定技。当你发动非锁定技后,你令你本回合使用的下一张牌无距离和次数限制。", + junkquandao: "权道", + junkquandao_info: + "锁定技。当你使用【杀】或普通锦囊牌时,{若你手牌中的【杀】或普通锦囊牌的数量之差X不为0,则你弃置X张数量较多的一种牌},然后你摸一张牌。", + junkchigang: "持纲", + junkchigang_info: + "转换技,锁定技。判定阶段开始前,你取消此阶段。然后你获得一个额外的:阴,摸牌阶段;阳,出牌阶段。", + junkrende: "仁德", + junkrende_info: + "出牌阶段限一次,你可以将任意张手牌交给其他角色。若你给出的牌多于一张,则你回复1点体力。", + junkjizhi: "集智", + junkjizhi_info: + "当你使用非转化的普通锦囊牌时,你可以亮出牌堆顶的一张牌A。若A不为基本牌,则你获得A。否则你选择一项:⒈将A置入弃牌堆。⒉将一张手牌置于牌堆顶,然后获得A。", + junkqicai: "奇才", + junkqicai_info: "锁定技。①你使用锦囊牌无距离限制。②你装备区内的非坐骑牌不能被其他角色弃置。", + junkwangxi: "忘隙", + junkwangxi_info: + "当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其其中一张牌。", + junkwangxi_tag: "invisible", + junklangmie: "狼灭", + junklangmie_info: + "其他角色的结束阶段开始时,你可以选择一项:⒈若其本回合内使用过某种类型的牌超过一张,则你弃置一张牌并摸两张牌。⒉若其本回合累计造成过的伤害大于1,则你弃置一张牌,然后对其造成1点伤害。", + junkshicai: "恃才", + junkshicai_info: + "当你使用牌结束完毕后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", + junk_zhangrang: "新杀张让", + junk_zhangrang_prefix: "新杀", + old_jiakui: "手杀贾逵", + old_jiakui_prefix: "手杀", + ol_guohuai: "OL郭淮", + ol_guohuai_prefix: "OL", + old_bulianshi: "RE步练师", + old_bulianshi_prefix: "RE", + ol_maliang: "OL马良", + ol_maliang_prefix: "OL", + junk_lidian: "OL李典", + junk_lidian_prefix: "OL", + junk_duanwei: "新杀段煨", + junk_duanwei_prefix: "新杀", + junk_xuyou: "手杀许攸", + junk_xuyou_prefix: "手杀", + junk_liubei: "旧界刘备", + junk_liubei_prefix: "旧界", + junk_huangyueying: "旧界黄月英", + junk_huangyueying_prefix: "旧界", + old_majun: "骰子马钧", + old_majun_prefix: "骰子", + ns_mengyou: "数学孟优", + ns_mengyou_prefix: "数学", + ns_mengyou_ab: "孟优", + nsmanzhi: "蛮智", + nsmanzhi_info: + "准备阶段或结束阶段开始时,你可以将场上出现的数字代入等式中的A和B。若此等式成立,你摸Y张牌。(等式为Y=0.5A2+2.5B-X,其中X为游戏轮数,Y为存活人数)", + ns_chengpu: "铁索程普", + ns_chengpu_prefix: "铁索", + ns_chengpu_ab: "程普", + ns_sundeng: "画饼孙登", + ns_sundeng_prefix: "画饼", + ns_sundeng_ab: "孙登", + ns_duji: "画饼杜畿", + ns_duji_prefix: "画饼", + ns_duji_ab: "杜畿", + junk_zhangjiao: "OL神张角", + junk_zhangjiao_prefix: "OL神", + junksijun: "肆军", + junksijun_info: + "准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”,然后从牌堆中随机获得任意张点数之和为36的牌(若牌堆没有点数和为36的组合则获得牌堆顶点数和刚好超过36的牌组)。", + junk_guanyu: "旧谋关羽", + junk_guanyu_prefix: "旧谋", - diy_tieba:'吧友设计', - diy_xushi:'玩点论杀·虚实篇', - diy_default:'常规', - diy_noname:'无名专属', - diy_key:'论外', - diy_yijiang:'设计比赛2020', - diy_yijiang2:'设计比赛2021', - diy_yijiang3:'设计比赛2022', - diy_fakenews:'杀海流言', - diy_trashbin:'垃圾桶', + diy_tieba: "吧友设计", + diy_xushi: "玩点论杀·虚实篇", + diy_default: "常规", + diy_noname: "无名专属", + diy_key: "论外", + diy_yijiang: "设计比赛2020", + diy_yijiang2: "设计比赛2021", + diy_yijiang3: "设计比赛2022", + diy_fakenews: "杀海流言", + diy_trashbin: "垃圾桶", }, - pinyins:{ - 加藤うみ:['Kato','Umi'], - 仲村由理:['Nakamura','Yuri'], - 此花露西娅:['Konohana','Lucia'], - 枣恭介:['Natsume','Kyousuke'], - 神尾晴子:['Kamio','Haruko'], - 神北小毬:['Kamikita','Komari'], - 宫泽有纪宁:['Miyazawa','Yukine'], - 西森柚咲:['Nishimori','Yusa'], - 黑羽美砂:['Kurobane','Misa'], - 井之原真人:['Inohara','Masato'], - 岩泽雅美:['Iwasawa','Masami'], - 宫泽谦吾:['Miyazawa','Kengo'], - 吉野晴彦:['Yoshino','Haruhiko'], - 由依:['Yui'], - 紬文德斯:['Tsumugi','Wenders'], - 朱鹭户沙耶:['Tokido','Saya'], - '三枝叶留佳&二木佳奈多':['Saigusa','Haruka','Futaki','Kanata'], - 三枝二木:['Saigusa','Haruka','Futaki','Kanata'], - 稻荷:['Inari'], - 椎名:['Shiina'], - '春原阳平&春原芽衣':['Sunohara','Youhei','Sunohara','Mei'], - 阳平芽衣:['Sunohara','Youhei','Sunohara','Mei'], - 枣铃:['Natsume','Rin'], - 笹濑川佐佐美:['Sasasegawa','Sasami'], - 千里朱音:['Senri','Akane'], - 多鲁基:['Dorj'], - 来谷唯湖:['Kurugaya','Yuiko'], - 直枝理树:['Naoe','Riki'], - 渕田久子:['Fuchita','Hisako'], - 日向秀树:['Hinata','Hideki'], - 野田:['Noda'], - 冈崎朋也:['Okazaki','Tomoya'], - 古河渚:['Furukawa','Nagisa'], - 直井文人:['Naoi','Ayato'], - 空门苍:['Sorakado','Ao'], - 音无结弦:['Otonashi','Yuzuru'], - 立华奏:['Tachibana','Kanade'], - 西园美鱼:['Nishizono','Mio'], - 西园美鸟:['Nishizono','Midori'], - 岬镜子:['Misaki','Kyoko'], - 中津静流:['Nakatsu','Shizuru'], - '关根诗织&入江美雪':['Sekine','Shiori','Irie','Miyuki'], - 关根入江:['Sekine','Shiori','Irie','Miyuki'], - 野村美希:['Nomura','Miki'], - 美坂栞:['Misaka','Shiori'], - 美坂香里:['Misaka','Kaori'], - 水濑秋子:['Minase','Akiko'], - 游佐:['Yusa'], - 松下护騨:['Matsushita','Godan'], - 乙坂有宇:['Otosaka','Yuu'], - 三谷良一:['Mitani','Ryoichi'], - 神户小鸟:['Kanbe','Kotori'], - 高城丈士朗:['Takajyo','Jyojirou'], - 鸣濑白羽:['Naruse','Shiroha'], - 水织静久:['Mizuori','Shizuku'], - 铃木央人:['Suzuki','Hiroto'], - 凤咲夜:['Ootori','Sakuya'], - 成神阳太:['Narukami','Youta'], - 七濑留美:['Nanase','Rumi'], - 凤千早:['Ootori','Chihaya'], - 国崎往人:['Kunisaki','Yukito'], - 井上晶:['Inoue','Asara'], - 一之濑琴美:['Ichinose','Kotomi'], - 藤川米娅:['Fujikawa','Mia'], - 雾岛佳乃:['Kirishima','Kano'], - 苍井绘梨花:['Aoi','Erika'], - 藏里见:['Kura','Satomi'], - '喵呜·喵呼':['Myau','Mya-fu'], - 喵呜喵呼:['Myau','Mya-fu'], - 伊吹风子:['Ibuki','Fuuko'], - 久岛鸥:['Kushima','Kamome'], - 库特莉亚芙卡:['Noumi','Kudryavka'], - 神尾观铃:['Kamio','Misuzu'], - 友利奈绪:['Tomori','Nao'], - 天王寺瑚太朗:['Tennouji','Kotarou'], - 藤林杏:['Fujibayashi','Kyou'], - 伊座并杏子:['Izanami','Kyouko'], - 加纳天善:['Kano','Tenzen'], - 冰室忧希:['Himuro','Yuuki'], - 露娜Q:['Lunar','Q'], - 远野小满:['Toono','Michiru'], - 远野美凪:['Toono','Minagi'], - 樱庭星罗:['Sakuraba','Seira'], - 坂上智代:['Sakagami','Tomoyo'], - 冈崎汐:['Okazaki','Ushio'], - 神山识:['Kamiyama','Shiki'], - 佐藤雏:['Satou','Hina'], - 篝:['Kagari'], + pinyins: { + 加藤うみ: ["Kato", "Umi"], + 仲村由理: ["Nakamura", "Yuri"], + 此花露西娅: ["Konohana", "Lucia"], + 枣恭介: ["Natsume", "Kyousuke"], + 神尾晴子: ["Kamio", "Haruko"], + 神北小毬: ["Kamikita", "Komari"], + 宫泽有纪宁: ["Miyazawa", "Yukine"], + 西森柚咲: ["Nishimori", "Yusa"], + 黑羽美砂: ["Kurobane", "Misa"], + 井之原真人: ["Inohara", "Masato"], + 岩泽雅美: ["Iwasawa", "Masami"], + 宫泽谦吾: ["Miyazawa", "Kengo"], + 吉野晴彦: ["Yoshino", "Haruhiko"], + 由依: ["Yui"], + 紬文德斯: ["Tsumugi", "Wenders"], + 朱鹭户沙耶: ["Tokido", "Saya"], + "三枝叶留佳&二木佳奈多": ["Saigusa", "Haruka", "Futaki", "Kanata"], + 三枝二木: ["Saigusa", "Haruka", "Futaki", "Kanata"], + 稻荷: ["Inari"], + 椎名: ["Shiina"], + "春原阳平&春原芽衣": ["Sunohara", "Youhei", "Sunohara", "Mei"], + 阳平芽衣: ["Sunohara", "Youhei", "Sunohara", "Mei"], + 枣铃: ["Natsume", "Rin"], + 笹濑川佐佐美: ["Sasasegawa", "Sasami"], + 千里朱音: ["Senri", "Akane"], + 多鲁基: ["Dorj"], + 来谷唯湖: ["Kurugaya", "Yuiko"], + 直枝理树: ["Naoe", "Riki"], + 渕田久子: ["Fuchita", "Hisako"], + 日向秀树: ["Hinata", "Hideki"], + 野田: ["Noda"], + 冈崎朋也: ["Okazaki", "Tomoya"], + 古河渚: ["Furukawa", "Nagisa"], + 直井文人: ["Naoi", "Ayato"], + 空门苍: ["Sorakado", "Ao"], + 音无结弦: ["Otonashi", "Yuzuru"], + 立华奏: ["Tachibana", "Kanade"], + 西园美鱼: ["Nishizono", "Mio"], + 西园美鸟: ["Nishizono", "Midori"], + 岬镜子: ["Misaki", "Kyoko"], + 中津静流: ["Nakatsu", "Shizuru"], + "关根诗织&入江美雪": ["Sekine", "Shiori", "Irie", "Miyuki"], + 关根入江: ["Sekine", "Shiori", "Irie", "Miyuki"], + 野村美希: ["Nomura", "Miki"], + 美坂栞: ["Misaka", "Shiori"], + 美坂香里: ["Misaka", "Kaori"], + 水濑秋子: ["Minase", "Akiko"], + 游佐: ["Yusa"], + 松下护騨: ["Matsushita", "Godan"], + 乙坂有宇: ["Otosaka", "Yuu"], + 三谷良一: ["Mitani", "Ryoichi"], + 神户小鸟: ["Kanbe", "Kotori"], + 高城丈士朗: ["Takajyo", "Jyojirou"], + 鸣濑白羽: ["Naruse", "Shiroha"], + 水织静久: ["Mizuori", "Shizuku"], + 铃木央人: ["Suzuki", "Hiroto"], + 凤咲夜: ["Ootori", "Sakuya"], + 成神阳太: ["Narukami", "Youta"], + 七濑留美: ["Nanase", "Rumi"], + 凤千早: ["Ootori", "Chihaya"], + 国崎往人: ["Kunisaki", "Yukito"], + 井上晶: ["Inoue", "Asara"], + 一之濑琴美: ["Ichinose", "Kotomi"], + 藤川米娅: ["Fujikawa", "Mia"], + 雾岛佳乃: ["Kirishima", "Kano"], + 苍井绘梨花: ["Aoi", "Erika"], + 藏里见: ["Kura", "Satomi"], + "喵呜·喵呼": ["Myau", "Mya-fu"], + 喵呜喵呼: ["Myau", "Mya-fu"], + 伊吹风子: ["Ibuki", "Fuuko"], + 久岛鸥: ["Kushima", "Kamome"], + 库特莉亚芙卡: ["Noumi", "Kudryavka"], + 神尾观铃: ["Kamio", "Misuzu"], + 友利奈绪: ["Tomori", "Nao"], + 天王寺瑚太朗: ["Tennouji", "Kotarou"], + 藤林杏: ["Fujibayashi", "Kyou"], + 伊座并杏子: ["Izanami", "Kyouko"], + 加纳天善: ["Kano", "Tenzen"], + 冰室忧希: ["Himuro", "Yuuki"], + 露娜Q: ["Lunar", "Q"], + 远野小满: ["Toono", "Michiru"], + 远野美凪: ["Toono", "Minagi"], + 樱庭星罗: ["Sakuraba", "Seira"], + 坂上智代: ["Sakagami", "Tomoyo"], + 冈崎汐: ["Okazaki", "Ushio"], + 神山识: ["Kamiyama", "Shiki"], + 佐藤雏: ["Satou", "Hina"], + 篝: ["Kagari"], }, }; }); diff --git a/character/extra.js b/character/extra.js index be5c0dd17..2353a3218 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1,280 +1,324 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'extra', - connect:true, - connectBanned:['shen_diaochan'], - characterSort:{ - extra:{ - extra_feng:['shen_guanyu','shen_lvmeng'], - extra_huo:['shen_zhugeliang','shen_zhouyu'], - extra_lin:['shen_caocao','shen_lvbu'], - extra_shan:['shen_zhaoyun','shen_simayi'], - extra_yin:['shen_liubei','shen_luxun'], - extra_lei:['shen_ganning','shen_zhangliao'], - extra_key:['key_kagari','key_shiki','db_key_hina'], - extra_decade:['shen_jiangwei','shen_machao','shen_zhangfei','shen_zhangjiao','shen_dengai','shen_xuzhu','dc_shen_huatuo'], - extra_ol:['ol_zhangliao','shen_caopi','shen_zhenji','shen_sunquan'], - extra_mobilezhi:['shen_guojia','shen_xunyu'], - extra_mobilexin:['shen_taishici','shen_sunce'], - extra_mobileren:['shen_huatuo','shen_lusu'], - extra_tw:['tw_shen_guanyu','tw_shen_lvmeng'], - extra_offline:['shen_diaochan','boss_zhaoyun','shen_dianwei','le_shen_jiaxu'], + name: "extra", + connect: true, + connectBanned: ["shen_diaochan"], + characterSort: { + extra: { + extra_feng: ["shen_guanyu", "shen_lvmeng"], + extra_huo: ["shen_zhugeliang", "shen_zhouyu"], + extra_lin: ["shen_caocao", "shen_lvbu"], + extra_shan: ["shen_zhaoyun", "shen_simayi"], + extra_yin: ["shen_liubei", "shen_luxun"], + extra_lei: ["shen_ganning", "shen_zhangliao"], + extra_key: ["key_kagari", "key_shiki", "db_key_hina"], + extra_decade: [ + "shen_jiangwei", + "shen_machao", + "shen_zhangfei", + "shen_zhangjiao", + "shen_dengai", + "shen_xuzhu", + "dc_shen_huatuo", + ], + extra_ol: ["ol_zhangliao", "shen_caopi", "shen_zhenji", "shen_sunquan"], + extra_mobilezhi: ["shen_guojia", "shen_xunyu"], + extra_mobilexin: ["shen_taishici", "shen_sunce"], + extra_mobileren: ["shen_huatuo", "shen_lusu"], + extra_tw: ["tw_shen_guanyu", "tw_shen_lvmeng"], + extra_offline: ["shen_diaochan", "boss_zhaoyun", "shen_dianwei", "le_shen_jiaxu"], }, }, - character:{ - dc_shen_huatuo:['male','shen',3,['jingyu','lvxin','huandao'],['qun']], - shen_xuzhu:['male','shen',5,['zhengqing','zhuangpo'],['wei']], - shen_lusu:['male','shen',3,['dingzhou','tamo','zhimeng'],['wu']], - shen_huatuo:['male','shen',3,['wuling','youyi'],['qun']], - le_shen_jiaxu:['male','shen',4,['jxlianpo','jxzhaoluan'],['qun']], - shen_dianwei:['male','shen',4,['juanjia','qiexie','cuijue'],['wei']], - shen_dengai:['male','shen',4,['dctuoyu','dcxianjin','dcqijing'],['wei']], - tw_shen_lvmeng:['male','shen',3,['twshelie','twgongxin'],['wu']], - shen_zhangjiao:['male','shen',3,['yizhao','sijun','sanshou','tianjie'],['qun']], - shen_zhangfei:['male','shen',4,['shencai','xunshi'],['shu']], - tw_shen_guanyu:['male','shen',4,['twwushen','twwuhun'],['shu']], - shen_machao:['male','shen',4,['shouli','hengwu'],['shu']], - shen_sunquan:['male','shen',4,['junkyuheng','junkdili'],['wu']], - shen_jiangwei:['male','shen',4,['jiufa','tianren','pingxiang'],['shu']], - key_kagari:['female','shen',3,['kagari_zongsi'],['key']], - key_shiki:['female','shen','3/5',['shiki_omusubi'],['key']], - db_key_hina:['female','key',3,['hina_shenshi','hina_xingzhi'],['doublegroup:key:shen']], + character: { + dc_shen_huatuo: ["male", "shen", 3, ["jingyu", "lvxin", "huandao"], ["qun"]], + shen_xuzhu: ["male", "shen", 5, ["zhengqing", "zhuangpo"], ["wei"]], + shen_lusu: ["male", "shen", 3, ["dingzhou", "tamo", "zhimeng"], ["wu"]], + shen_huatuo: ["male", "shen", 3, ["wuling", "youyi"], ["qun"]], + le_shen_jiaxu: ["male", "shen", 4, ["jxlianpo", "jxzhaoluan"], ["qun"]], + shen_dianwei: ["male", "shen", 4, ["juanjia", "qiexie", "cuijue"], ["wei"]], + shen_dengai: ["male", "shen", 4, ["dctuoyu", "dcxianjin", "dcqijing"], ["wei"]], + tw_shen_lvmeng: ["male", "shen", 3, ["twshelie", "twgongxin"], ["wu"]], + shen_zhangjiao: ["male", "shen", 3, ["yizhao", "sijun", "sanshou", "tianjie"], ["qun"]], + shen_zhangfei: ["male", "shen", 4, ["shencai", "xunshi"], ["shu"]], + tw_shen_guanyu: ["male", "shen", 4, ["twwushen", "twwuhun"], ["shu"]], + shen_machao: ["male", "shen", 4, ["shouli", "hengwu"], ["shu"]], + shen_sunquan: ["male", "shen", 4, ["junkyuheng", "junkdili"], ["wu"]], + shen_jiangwei: ["male", "shen", 4, ["jiufa", "tianren", "pingxiang"], ["shu"]], + key_kagari: ["female", "shen", 3, ["kagari_zongsi"], ["key"]], + key_shiki: ["female", "shen", "3/5", ["shiki_omusubi"], ["key"]], + db_key_hina: ["female", "key", 3, ["hina_shenshi", "hina_xingzhi"], ["doublegroup:key:shen"]], - shen_sunce:['male','shen','1/6',['yingba','scfuhai','pinghe'],['wu']], - shen_xunyu:['male','shen',3,['tianzuo','lingce','dinghan'],['wei','clan:颍川荀氏']], - shen_taishici:['male','shen',4,['dulie','tspowei'],['wu']], - shen_guojia:['male','shen',3,['reshuishi','stianyi','resghuishi'],['wei']], - shen_diaochan:['female','shen',3,['meihun','huoxin'],['qun']], - shen_guanyu:['male','shen',5,['wushen','new_wuhun'],['shu']], - shen_zhaoyun:['male','shen',2,['xinjuejing','relonghun'],['shu']], - shen_zhugeliang:['male','shen',3,['qixing','kuangfeng','dawu'],['shu']], - shen_lvmeng:['male','shen',3,['shelie','gongxin'],['wu']], - shen_zhouyu:['male','shen',4,['yeyan','qinyin'],['wu']], - shen_simayi:['male','shen',4,['renjie','sbaiyin','lianpo'],['wei']], - shen_caocao:['male','shen',3,['new_guixin','feiying'],['wei']], - shen_lvbu:['male','shen',5,['baonu','wumou','ol_wuqian','ol_shenfen'],['qun']], + shen_sunce: ["male", "shen", "1/6", ["yingba", "scfuhai", "pinghe"], ["wu"]], + shen_xunyu: ["male", "shen", 3, ["tianzuo", "lingce", "dinghan"], ["wei", "clan:颍川荀氏"]], + shen_taishici: ["male", "shen", 4, ["dulie", "tspowei"], ["wu"]], + shen_guojia: ["male", "shen", 3, ["reshuishi", "stianyi", "resghuishi"], ["wei"]], + shen_diaochan: ["female", "shen", 3, ["meihun", "huoxin"], ["qun"]], + shen_guanyu: ["male", "shen", 5, ["wushen", "new_wuhun"], ["shu"]], + shen_zhaoyun: ["male", "shen", 2, ["xinjuejing", "relonghun"], ["shu"]], + shen_zhugeliang: ["male", "shen", 3, ["qixing", "kuangfeng", "dawu"], ["shu"]], + shen_lvmeng: ["male", "shen", 3, ["shelie", "gongxin"], ["wu"]], + shen_zhouyu: ["male", "shen", 4, ["yeyan", "qinyin"], ["wu"]], + shen_simayi: ["male", "shen", 4, ["renjie", "sbaiyin", "lianpo"], ["wei"]], + shen_caocao: ["male", "shen", 3, ["new_guixin", "feiying"], ["wei"]], + shen_lvbu: ["male", "shen", 5, ["baonu", "wumou", "ol_wuqian", "ol_shenfen"], ["qun"]], - shen_liubei:["male","shen",6,["nzry_longnu","nzry_jieying"],["shu"]], - shen_luxun:["male","shen",4,["nzry_junlve","nzry_cuike","nzry_dinghuo"],["wu"]], - shen_zhangliao:["male","shen",4,["drlt_duorui","drlt_zhiti"],["wei"]], - shen_ganning:["male","shen","3/6",["drlt_poxi","drlt_jieying"],["wu"]], - ol_zhangliao:['male','shen',4,['olduorui','olzhiti'],['wei']], - shen_caopi:['male','shen',5,['chuyuan','dengji'],['wei']], - shen_zhenji:['female','shen',3,['shenfu','qixian'],['wei']], - boss_zhaoyun:['male','shen',1,['boss_juejing','xinlonghun','zhanjiang'],['shu']], + shen_liubei: ["male", "shen", 6, ["nzry_longnu", "nzry_jieying"], ["shu"]], + shen_luxun: ["male", "shen", 4, ["nzry_junlve", "nzry_cuike", "nzry_dinghuo"], ["wu"]], + shen_zhangliao: ["male", "shen", 4, ["drlt_duorui", "drlt_zhiti"], ["wei"]], + shen_ganning: ["male", "shen", "3/6", ["drlt_poxi", "drlt_jieying"], ["wu"]], + ol_zhangliao: ["male", "shen", 4, ["olduorui", "olzhiti"], ["wei"]], + shen_caopi: ["male", "shen", 5, ["chuyuan", "dengji"], ["wei"]], + shen_zhenji: ["female", "shen", 3, ["shenfu", "qixian"], ["wei"]], + boss_zhaoyun: ["male", "shen", 1, ["boss_juejing", "xinlonghun", "zhanjiang"], ["shu"]], }, - characterIntro:{ - shen_guanyu:'关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。', - shen_lvmeng:'吕蒙,字子明,汝南富陂人,东吴名将,原有“吴下阿蒙”之贬称,后受孙权劝说,奋发读书,最终成就一代名将。', - shen_zhouyu:'字公瑾,庐江舒县人。东汉末年名将。有姿貌、精音律,江东有“曲有误,周郎顾”之语。周瑜少与孙策交好,后孙策遇刺身亡,孙权继任。周瑜将兵赴丧,以中护军的身份与长史张昭共掌众事,建安十三年(208年),周瑜率东吴军与刘备军联合,在赤壁击败曹操。此战也奠定了三分天下的基础。', - shen_zhugeliang:'字孔明、号卧龙,汉族,琅琊阳都人,三国时期蜀汉丞相、杰出的政治家、军事家、发明家、文学家。在世时被封为武乡侯,死后追谥忠武侯,后来东晋政权推崇诸葛亮军事才能,特追封他为武兴王。诸葛亮为匡扶蜀汉政权,呕心沥血、鞠躬尽瘁、死而后已。其代表作有《前出师表》、《后出师表》、《诫子书》等。曾发明木牛流马等,并改造连弩,可一弩十矢俱发。于234年在宝鸡五丈原逝世。', + characterIntro: { + shen_guanyu: + "关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。", + shen_lvmeng: + "吕蒙,字子明,汝南富陂人,东吴名将,原有“吴下阿蒙”之贬称,后受孙权劝说,奋发读书,最终成就一代名将。", + shen_zhouyu: + "字公瑾,庐江舒县人。东汉末年名将。有姿貌、精音律,江东有“曲有误,周郎顾”之语。周瑜少与孙策交好,后孙策遇刺身亡,孙权继任。周瑜将兵赴丧,以中护军的身份与长史张昭共掌众事,建安十三年(208年),周瑜率东吴军与刘备军联合,在赤壁击败曹操。此战也奠定了三分天下的基础。", + shen_zhugeliang: + "字孔明、号卧龙,汉族,琅琊阳都人,三国时期蜀汉丞相、杰出的政治家、军事家、发明家、文学家。在世时被封为武乡侯,死后追谥忠武侯,后来东晋政权推崇诸葛亮军事才能,特追封他为武兴王。诸葛亮为匡扶蜀汉政权,呕心沥血、鞠躬尽瘁、死而后已。其代表作有《前出师表》、《后出师表》、《诫子书》等。曾发明木牛流马等,并改造连弩,可一弩十矢俱发。于234年在宝鸡五丈原逝世。", }, - characterReplace:{ - shen_zhangliao:['ol_zhangliao','shen_zhangliao'], - shen_zhaoyun:['shen_zhaoyun','dc_zhaoyun','old_shen_zhaoyun','boss_zhaoyun'], - shen_guanyu:['shen_guanyu','tw_shen_guanyu'], - shen_sunquan:['shen_sunquan','junk_sunquan'], - shen_lvmeng:['shen_lvmeng','tw_shen_lvmeng'], - shen_machao:['shen_machao','ps_shen_machao'], - shen_jiaxu:['le_shen_jiaxu','shen_jiaxu'], - shen_caocao:['shen_caocao','old_caocao'], - shen_zhangjiao:['shen_zhangjiao','junk_zhangjiao'], - shen_huatuo:['dc_shen_huatuo','shen_huatuo'], + characterReplace: { + shen_zhangliao: ["ol_zhangliao", "shen_zhangliao"], + shen_zhaoyun: ["shen_zhaoyun", "dc_zhaoyun", "old_shen_zhaoyun", "boss_zhaoyun"], + shen_guanyu: ["shen_guanyu", "tw_shen_guanyu"], + shen_sunquan: ["shen_sunquan", "junk_sunquan"], + shen_lvmeng: ["shen_lvmeng", "tw_shen_lvmeng"], + shen_machao: ["shen_machao", "ps_shen_machao"], + shen_jiaxu: ["le_shen_jiaxu", "shen_jiaxu"], + shen_caocao: ["shen_caocao", "old_caocao"], + shen_zhangjiao: ["shen_zhangjiao", "junk_zhangjiao"], + shen_huatuo: ["dc_shen_huatuo", "shen_huatuo"], }, - characterFilter:{ - shen_diaochan(mode){ - return mode=='identity'||mode=='doudizhu'||mode=='single'||(mode=='versus'&&_status.mode!='standard'&&_status.mode!='three'); + characterFilter: { + shen_diaochan(mode) { + return ( + mode == "identity" || + mode == "doudizhu" || + mode == "single" || + (mode == "versus" && _status.mode != "standard" && _status.mode != "three") + ); }, - shen_dengai(mode){ - if(['boss','chess','tafang','stone'].includes(mode)) return false; - if(mode=='versus') return _status.mode!='three'; + shen_dengai(mode) { + if (["boss", "chess", "tafang", "stone"].includes(mode)) return false; + if (mode == "versus") return _status.mode != "three"; return true; }, - le_shen_jiaxu(mode){ - return mode=='identity'&&_status.mode!='purple'; + le_shen_jiaxu(mode) { + return mode == "identity" && _status.mode != "purple"; }, }, /** @type { importCharacterConfig['skill'] } */ - skill:{ + skill: { //十周年神华佗 - jingyu:{ - audio:2, - trigger:{ - global:['useSkill','logSkillBegin','useCard','respond'], + jingyu: { + audio: 2, + trigger: { + global: ["useSkill", "logSkillBegin", "useCard", "respond"], }, - filter(event,player){ - if(['global','equip'].includes(event.type)) return false; - let skill=event.sourceSkill||event.skill; - if(!skill||skill==='jingyu') return false; - let info=get.info(skill); - while(true){ - if(!info||info.charlotte) return false; - if(info&&!info.sourceSkill) break; - skill=info.sourceSkill; - info=get.info(skill); + filter(event, player) { + if (["global", "equip"].includes(event.type)) return false; + let skill = event.sourceSkill || event.skill; + if (!skill || skill === "jingyu") return false; + let info = get.info(skill); + while (true) { + if (!info || info.charlotte) return false; + if (info && !info.sourceSkill) break; + skill = info.sourceSkill; + info = get.info(skill); } - return !player.getStorage('jingyu_used').includes(skill); + return !player.getStorage("jingyu_used").includes(skill); }, - forced:true, - async content(event,trigger,player){ - if (!player.storage.jingyu_used){ - player.when({global:'roundStart'}).assign({ - firstDo: true, - }).then(() => delete player.storage.jingyu_used); + forced: true, + async content(event, trigger, player) { + if (!player.storage.jingyu_used) { + player + .when({ global: "roundStart" }) + .assign({ + firstDo: true, + }) + .then(() => delete player.storage.jingyu_used); } - let skill = trigger.sourceSkill || trigger.skill, info = get.info(skill); + let skill = trigger.sourceSkill || trigger.skill, + info = get.info(skill); while (true) { if (info && !info.sourceSkill) break; skill = info.sourceSkill; info = get.info(skill); } - player.markAuto('jingyu_used', skill); + player.markAuto("jingyu_used", skill); await player.draw(); }, - ai:{ - threaten:6, + ai: { + threaten: 6, }, }, - lvxin:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:true, - filterTarget:lib.filter.notMe, - check(card){ - const round=game.roundNumber,player=get.player(); + lvxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget: lib.filter.notMe, + check(card) { + const round = game.roundNumber, + player = get.player(); let valueFix = 0; - if(['sha','shan'].includes(get.name(card,false))) valueFix += 3; - if(round<=2&&player.hasCard(card=>{ - return ['sha','shan'].includes(get.name(card))&&get.value(card)<=3; - })||game.hasPlayer(current=>{ - return current!==player&&get.attitude(player,current)>0; - })) return 6-get.value(card)+valueFix; - return 4.5-get.value(card)+valueFix; + if (["sha", "shan"].includes(get.name(card, false))) valueFix += 3; + if ( + (round <= 2 && + player.hasCard((card) => { + return ["sha", "shan"].includes(get.name(card)) && get.value(card) <= 3; + })) || + game.hasPlayer((current) => { + return current !== player && get.attitude(player, current) > 0; + }) + ) + return 6 - get.value(card) + valueFix; + return 4.5 - get.value(card) + valueFix; }, - delay:false, - discard:false, - lose:false, - async content(event,trigger,player){ - const { target, cards } = event, round = Math.min(5, game.roundNumber); + delay: false, + discard: false, + lose: false, + async content(event, trigger, player) { + const { target, cards } = event, + round = Math.min(5, game.roundNumber); const name = get.translation(target); await player.give(cards, target); - const result = await player.chooseControl(['摸牌', '弃牌']).set('choiceList', [ - `令${name}摸${get.cnNumber(round)}张牌`, - `令${name}随机弃置${get.cnNumber(round)}张手牌` - ]).set('prompt', '滤心:请选择一项').set('ai', () => { - return get.event('choice'); - }).set('choice', get.attitude(player, target) > 0 ? '摸牌' : '弃牌').forResult(); + const result = await player + .chooseControl(["摸牌", "弃牌"]) + .set("choiceList", [ + `令${name}摸${get.cnNumber(round)}张牌`, + `令${name}随机弃置${get.cnNumber(round)}张手牌`, + ]) + .set("prompt", "滤心:请选择一项") + .set("ai", () => { + return get.event("choice"); + }) + .set("choice", get.attitude(player, target) > 0 ? "摸牌" : "弃牌") + .forResult(); let cards2 = []; const makeDraw = result.index === 0; if (makeDraw) { cards2 = await target.draw(round).forResult(); - } - else { - const cards = target.getCards('h', card => { - return lib.filter.cardDiscardable(card, target, 'lvxin'); + } else { + const cards = target.getCards("h", (card) => { + return lib.filter.cardDiscardable(card, target, "lvxin"); }); - if (cards.length > 0){ - const evt = await target.discard(cards.randomGets(round)).set('discarder', target); + if (cards.length > 0) { + const evt = await target + .discard(cards.randomGets(round)) + .set("discarder", target); cards2 = evt.done.cards2; } } const cardName = get.name(cards[0], player); - if (cards2.some(card => { - return get.name(card, target) === cardName; - })) { - const skillName = `lvxin_${makeDraw ? 'recover' : 'lose'}`; + if ( + cards2.some((card) => { + return get.name(card, target) === cardName; + }) + ) { + const skillName = `lvxin_${makeDraw ? "recover" : "lose"}`; target.addSkill(skillName); target.addMark(skillName, 1, false); } }, - subSkill:{ - recover:{ - trigger:{ - player:['useSkill','logSkillBegin','useCard','respond'], + subSkill: { + recover: { + trigger: { + player: ["useSkill", "logSkillBegin", "useCard", "respond"], }, - filter(event,player){ - if(['global','equip'].includes(event.type)) return false; - const skill=event.sourceSkill||event.skill; - const info=get.info(skill); - return info&&!info.charlotte; + filter(event, player) { + if (["global", "equip"].includes(event.type)) return false; + const skill = event.sourceSkill || event.skill; + const info = get.info(skill); + return info && !info.charlotte; }, - forced:true, - onremove:true, - charlotte:true, - async content(event,trigger,player){ - player.loseHp(player.countMark('lvxin_recover')); - player.removeSkill('lvxin_recover'); + forced: true, + onremove: true, + charlotte: true, + async content(event, trigger, player) { + player.loseHp(player.countMark("lvxin_recover")); + player.removeSkill("lvxin_recover"); }, - intro:{ - content:'下次发动技能时回复#点体力', + intro: { + content: "下次发动技能时回复#点体力", }, }, - lose:{ - trigger:{ - player:['useSkill','logSkillBegin','useCard','respond'], + lose: { + trigger: { + player: ["useSkill", "logSkillBegin", "useCard", "respond"], }, - filter(event,player){ - if(['global','equip'].includes(event.type)) return false; - const skill=event.sourceSkill||event.skill; - const info=get.info(skill); - return info&&!info.charlotte; + filter(event, player) { + if (["global", "equip"].includes(event.type)) return false; + const skill = event.sourceSkill || event.skill; + const info = get.info(skill); + return info && !info.charlotte; }, - forced:true, - onremove:true, - charlotte:true, - async content(event,trigger,player){ - player.loseHp(player.countMark('lvxin_lose')); - player.removeSkill('lvxin_lose'); + forced: true, + onremove: true, + charlotte: true, + async content(event, trigger, player) { + player.loseHp(player.countMark("lvxin_lose")); + player.removeSkill("lvxin_lose"); }, - intro:{ - content:'下次发动技能时失去#点体力', + intro: { + content: "下次发动技能时失去#点体力", }, - } + }, }, - ai:{ - order:5, - result:{ - target(player,target){ - const round=game.roundNumber; - if(round<=2&&target.countCards('h')>round*2&&player.getCards('h').some(card=>{ - return ['sha','shan'].includes(get.name(card))&&get.value(card)<=3; - })) return 1; - if(get.attitude(player,target)>0){ - return round+Math.sqrt(1+target.getDamagedHp()); + ai: { + order: 5, + result: { + target(player, target) { + const round = game.roundNumber; + if ( + round <= 2 && + target.countCards("h") > round * 2 && + player.getCards("h").some((card) => { + return ["sha", "shan"].includes(get.name(card)) && get.value(card) <= 3; + }) + ) + return 1; + if (get.attitude(player, target) > 0) { + return round + Math.sqrt(1 + target.getDamagedHp()); } - return -(round+Math.sqrt(Math.max(0,2-target.getHp()))); + return -(round + Math.sqrt(Math.max(0, 2 - target.getHp()))); }, - } - } + }, + }, }, - huandao:{ - audio:2, - enable:'phaseUse', - usable:1, - limited:true, - filterTarget:lib.filter.notMe, - skillAnimation:true, - animationColor:'metal', - async content(event,trigger,player){ - player.awakenSkill('huandao'); + huandao: { + audio: 2, + enable: "phaseUse", + usable: 1, + limited: true, + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "metal", + async content(event, trigger, player) { + player.awakenSkill("huandao"); const { target } = event; await target.turnOver(false); await target.link(false); - let names = [target.name1||target.name]; + let names = [target.name1 || target.name]; if (target.name2) names.add(target.name2); - names = names.map(name => get.rawName(name)); + names = names.map((name) => get.rawName(name)); if (!_status.characterlist) lib.skill.pingjian.initList(); _status.characterlist.randomSort(); - let ownedSkills = target.getSkills(null, false, false), ownedSkillsName = ownedSkills.map(skill => get.translation(skill)); + let ownedSkills = target.getSkills(null, false, false), + ownedSkillsName = ownedSkills.map((skill) => get.translation(skill)); let skillToGain = null; - outer: for (const name of _status.characterlist){ + outer: for (const name of _status.characterlist) { const info = lib.character[name]; if (!names.includes(get.rawName(name))) continue; const skills = info[3].slice().randomSort(); while (skills.length) { - const skill = skills.shift(), skillName = get.translation(skill); + const skill = skills.shift(), + skillName = get.translation(skill); if (!ownedSkillsName.includes(skillName)) { skillToGain = skill; break outer; @@ -283,1793 +327,2234 @@ game.import('character', function () { } if (!skillToGain) return; player.popup(skillToGain); - player.line(target, 'green'); - let prompt2 = '若你选择是,则你于获得此技能后须失去一个其他技能。

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


    `; + player.line(target, "green"); + let prompt2 = "若你选择是,则你于获得此技能后须失去一个其他技能。

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


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


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


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


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


    '; + str += "此牌离开你的装备区后,改为置入剩余武将牌牌堆。"; + lib.translate["qiexie_" + name + "_info"] = str; + var append = ""; + if (skills.length) { + for (var skill of skills) { + if (lib.skill[skill].nobracket) { + append += + '
    ' + + get.translation(skill) + + '
    ' + + get.skillInfoTranslation(skill) + + "


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


    "; } } - str=str.slice(0,str.length-8); + str = str.slice(0, str.length - 8); } - lib.translate['qiexie_'+name+'_append']=append; - lib.card['qiexie_'+name]=card; + lib.translate["qiexie_" + name + "_append"] = append; + lib.card["qiexie_" + name] = card; } }, - subSkill:{ - destroy:{ - trigger:{player:'loseBegin'}, - equipSkill:true, - forceDie:true, - charlotte:true, - forced:true, - popup:false, - filter(event,player){ - return event.cards.some(card=>card.name.indexOf('qiexie_')==0) + subSkill: { + destroy: { + trigger: { player: "loseBegin" }, + equipSkill: true, + forceDie: true, + charlotte: true, + forced: true, + popup: false, + filter(event, player) { + return event.cards.some((card) => card.name.indexOf("qiexie_") == 0); }, - content(){ - for(var card of trigger.cards){ - if(card.name.indexOf('qiexie_')==0){ - card._destroy=true; - game.log(card,'被放回武将牌堆'); - var name=card.name.slice(7); - if(player.tempname&&player.tempname.includes(name)){ - game.broadcastAll((player,name)=>{ - player.tempname.remove(name); - },player,name); + content() { + for (var card of trigger.cards) { + if (card.name.indexOf("qiexie_") == 0) { + card._destroy = true; + game.log(card, "被放回武将牌堆"); + var name = card.name.slice(7); + if (player.tempname && player.tempname.includes(name)) { + game.broadcastAll( + (player, name) => { + player.tempname.remove(name); + }, + player, + name + ); } - if(lib.character[name]) _status.characterlist.add(name); + if (lib.character[name]) _status.characterlist.add(name); } } }, }, }, }, - cuijue:{ - enable:'phaseUse', - filter(event,player){ - return player.countCards('he')>0;//&&game.hasPlayer(target=>lib.skill.cuijue.filterTarget('SB',player,target)); + cuijue: { + enable: "phaseUse", + filter(event, player) { + return player.countCards("he") > 0; //&&game.hasPlayer(target=>lib.skill.cuijue.filterTarget('SB',player,target)); }, - filterCard:true, - filterTarget(card,player,target){ - if(player.getStorage('cuijue_used').includes(target)||!player.inRange(target)) return false; - var distance=get.distance(player,target); - return !game.hasPlayer(current=>(current!=target&&player.inRange(current)&&get.distance(player,current)>distance)); + filterCard: true, + filterTarget(card, player, target) { + if (player.getStorage("cuijue_used").includes(target) || !player.inRange(target)) + return false; + var distance = get.distance(player, target); + return !game.hasPlayer( + (current) => + current != target && + player.inRange(current) && + get.distance(player, current) > distance + ); }, - selectTarget:[0,1], - filterOk(){ - var player=_status.event.player; - if(game.hasPlayer(target=>lib.skill.cuijue.filterTarget('SB',player,target))) return ui.selected.targets.length>0; + selectTarget: [0, 1], + filterOk() { + var player = _status.event.player; + if (game.hasPlayer((target) => lib.skill.cuijue.filterTarget("SB", player, target))) + return ui.selected.targets.length > 0; return true; }, - position:'he', - complexTarget:true, - check:card=>{ - var player=_status.event.player,goon=0; - try{ + position: "he", + complexTarget: true, + check: (card) => { + var player = _status.event.player, + goon = 0; + try { ui.selected.cards.add(card); - if(game.hasPlayer(target=>{ - return lib.skill.cuijue.filterTarget('SB',player,target); - })){ - goon=6; + if ( + game.hasPlayer((target) => { + return lib.skill.cuijue.filterTarget("SB", player, target); + }) + ) { + goon = 6; } - }catch(e){ + } catch (e) { console.trace(e); } ui.selected.cards.remove(card); - return goon-get.value(card); + return goon - get.value(card); }, - content(){ - if(target){ - player.addTempSkill('cuijue_used','phaseUseAfter'); - player.markAuto('cuijue_used',[target]); - target.damage('nocard'); + content() { + if (target) { + player.addTempSkill("cuijue_used", "phaseUseAfter"); + player.markAuto("cuijue_used", [target]); + target.damage("nocard"); } }, - ai:{ - order:2, - result:{ - target:-1.5 + ai: { + order: 2, + result: { + target: -1.5, + }, + tag: { + damage: 1, }, - tag:{ - damage:1 - } }, - subSkill:{ - used:{ - onremove:true, - charlotte:true, + subSkill: { + used: { + onremove: true, + charlotte: true, }, }, }, //神邓艾 - dctuoyu:{ - audio:2, - trigger:{player:['phaseUseBegin','phaseUseEnd']}, - forced:true, - filter(event,player){ - return player.countCards('h')>0&&player.getStorage('dctuoyu').length>0; + dctuoyu: { + audio: 2, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + forced: true, + filter(event, player) { + return player.countCards("h") > 0 && player.getStorage("dctuoyu").length > 0; }, - content(){ - 'step 0' - var hs=player.getCards('h'),tags=['dctuoyu_fengtian','dctuoyu_qingqu','dctuoyu_junshan']; - var storage=player.getStorage('dctuoyu'); - var list=[ - ['未分配手牌(对话框较长,请下滑操作)',[]], - ['丰田(伤害/回复值+1)',[]], - ['清渠(无次数和距离限制)',[]], - ['峻山(不可被响应)',[]], + content() { + "step 0"; + var hs = player.getCards("h"), + tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; + var storage = player.getStorage("dctuoyu"); + var list = [ + ["未分配手牌(对话框较长,请下滑操作)", []], + ["丰田(伤害/回复值+1)", []], + ["清渠(无次数和距离限制)", []], + ["峻山(不可被响应)", []], ]; - for(var card of hs){ - var added=false; - for(var i=0;i{ - return i.hasGaintag('sha_notshan'); - }))&&get.attitude(player,target)<0&&get.effect(target,{name:'sha'},player,player)>0; - }) - for(var card of hs){ - var name=get.name(card); - if(name=='tao'||name=='jiu'){ - addTo(card,1); - } - else if(name=='sha'){ - if(hasRuanshizi&&isEmpty(1)&&usable>0) addTo(card,1); - else if(isEmpty(3)&&usable>0) addTo(card,3); - else addTo(card,2); - } - else if(get.type(name)=='trick'){ - if(isEmpty(1)&&get.tag(card,'damage')>0&&player.hasUseTarget(card)) addTo(card,1); - else addTo(card,3); + }; + var hasRuanshizi = game.hasPlayer(function (target) { + return ( + target != player && + player.canUse("sha", target, null, true) && + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) && + get.attitude(player, target) < 0 && + get.effect(target, { name: "sha" }, player, player) > 0 + ); + }); + for (var card of hs) { + var name = get.name(card); + if (name == "tao" || name == "jiu") { + addTo(card, 1); + } else if (name == "sha") { + if (hasRuanshizi && isEmpty(1) && usable > 0) addTo(card, 1); + else if (isEmpty(3) && usable > 0) addTo(card, 3); + else addTo(card, 2); + } else if (get.type(name) == "trick") { + if (isEmpty(1) && get.tag(card, "damage") > 0 && player.hasUseTarget(card)) + addTo(card, 1); + else addTo(card, 3); } } moved[0].addArray(hs2); return moved; - }) - 'step 1' - if(result.bool){ - game.broadcastAll(function(moved,player){ - var tags=['dctuoyu_fengtian','dctuoyu_qingqu','dctuoyu_junshan']; - var cards=[]; - for(var i=0;i0||get.tag(card,'recover')>0){ + if (!tags.includes("dctuoyu_fengtian_tag")) { + if (get.tag(card, "damage") > 0 || get.tag(card, "recover") > 0) { trigger.baseDamage++; - game.log(card,'的伤害值/回复值+1'); + game.log(card, "的伤害值/回复值+1"); } } - if(!tags.includes('dctuoyu_qingqu_tag')){ - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat('card'); - if(stat[card.name]&&stat[card.name]>0) stat[card.name]--; - game.log(card,'不计入次数限制'); + if (!tags.includes("dctuoyu_qingqu_tag")) { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat("card"); + if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; + game.log(card, "不计入次数限制"); } } - if(!tags.includes('dctuoyu_junshan_tag')){ - game.log(card,'不可被响应'); + if (!tags.includes("dctuoyu_junshan_tag")) { + game.log(card, "不可被响应"); trigger.directHit.addArray(game.filterPlayer()); } }, }, }, - ai:{ - combo:'dcxianjin' - } + ai: { + combo: "dcxianjin", + }, }, - dcxianjin:{ - init(player){ - var num=game.getAllGlobalHistory('changeHp',evt=>{ - return evt.getParent().name=='damage'&&(evt.getParent().player==player||(evt.getParent().source&&evt.getParent().source==player)); - }).concat(game.getAllGlobalHistory('changeHp',evt=>{ - return evt.getParent().name=='damage'&&evt.getParent().player==player&&evt.getParent().source&&evt.getParent().source==player; - })).length; - if(num) player.addMark('dcxianjin',num,false); + dcxianjin: { + init(player) { + var num = game + .getAllGlobalHistory("changeHp", (evt) => { + return ( + evt.getParent().name == "damage" && + (evt.getParent().player == player || + (evt.getParent().source && evt.getParent().source == player)) + ); + }) + .concat( + game.getAllGlobalHistory("changeHp", (evt) => { + return ( + evt.getParent().name == "damage" && + evt.getParent().player == player && + evt.getParent().source && + evt.getParent().source == player + ); + }) + ).length; + if (num) player.addMark("dcxianjin", num, false); }, - onremove:true, - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + onremove: true, + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - filter(event,player){ - return player.countMark('dcxianjin')%2==0; + filter(event, player) { + return player.countMark("dcxianjin") % 2 == 0; }, - forced:true, - content(){ - 'step 0' - var tags=['dctuoyu_fengtian','dctuoyu_qingqu','dctuoyu_junshan']; - tags.removeArray(player.getStorage('dctuoyu')); - if(!tags.length){ - player.draw(player.isMaxHandcard()?1:3); + forced: true, + content() { + "step 0"; + var tags = ["dctuoyu_fengtian", "dctuoyu_qingqu", "dctuoyu_junshan"]; + tags.removeArray(player.getStorage("dctuoyu")); + if (!tags.length) { + player.draw(player.isMaxHandcard() ? 1 : 3); event.finish(); - } - else if(tags.length==1){ - event._result={control:tags[0]}; - } - else player.chooseControl(tags).set('prompt','险峻:选择激活一个副区域标签'); - 'step 1' - var control=result.control; - game.log(player,'激活了副区域','#y'+get.translation(control)); - player.markAuto('dctuoyu',[control]); - player.popup(get.translation(control+'_tag')); - if(player.isMaxHandcard()) player.draw(); - else player.draw(player.getStorage('dctuoyu').length) + } else if (tags.length == 1) { + event._result = { control: tags[0] }; + } else player.chooseControl(tags).set("prompt", "险峻:选择激活一个副区域标签"); + ("step 1"); + var control = result.control; + game.log(player, "激活了副区域", "#y" + get.translation(control)); + player.markAuto("dctuoyu", [control]); + player.popup(get.translation(control + "_tag")); + if (player.isMaxHandcard()) player.draw(); + else player.draw(player.getStorage("dctuoyu").length); }, - group:'dcxianjin_mark', - intro:{content:'已造成或受到#次伤害'}, - subSkill:{ - mark:{ - charlotte:true, - trigger:{ - player:'damageEnd', - source:'damageSource', + group: "dcxianjin_mark", + intro: { content: "已造成或受到#次伤害" }, + subSkill: { + mark: { + charlotte: true, + trigger: { + player: "damageEnd", + source: "damageSource", }, - forced:true, - popup:false, - firstDo:true, - content(){ - player.addMark('dcxianjin',1,false); + forced: true, + popup: false, + firstDo: true, + content() { + player.addMark("dcxianjin", 1, false); }, }, }, - ai:{ - combo:'dctuoyu' - } - }, - dcqijing:{ - derivation:'dccuixin', - audio:2, - trigger:{global:'phaseEnd'}, - filter(event,player){ - return player.getStorage('dctuoyu').length==3; + ai: { + combo: "dctuoyu", }, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'orange', - changeSeat:true, - content(){ - 'step 0' - player.awakenSkill('dcqijing'); + }, + dcqijing: { + derivation: "dccuixin", + audio: 2, + trigger: { global: "phaseEnd" }, + filter(event, player) { + return player.getStorage("dctuoyu").length == 3; + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "orange", + changeSeat: true, + content() { + "step 0"; + player.awakenSkill("dcqijing"); player.loseMaxHp(); - player.addSkills('dccuixin'); - 'step 1' - if(game.countPlayer()>2){ - if(player==trigger.player&&!trigger.skill){ - var evt=trigger.getParent(); - if(evt.name=='phaseLoop'&&evt._isStandardLoop) evt.player=player.next; + player.addSkills("dccuixin"); + ("step 1"); + if (game.countPlayer() > 2) { + if (player == trigger.player && !trigger.skill) { + var evt = trigger.getParent(); + if (evt.name == "phaseLoop" && evt._isStandardLoop) evt.player = player.next; } - player.chooseTarget('请选择一名要更换座次的角色,将自己移动到该角色的上家位置',function(card,player,target){ - return target!=player&&target!=player.next; - },true).set('ai',function(target){ - var player=_status.event.player; - var current=_status.currentPhase.next; - var max=20,att=0; - while(max>0){ - max--; - if(current==target) return att; - att-=get.attitude(player,current); - current=current.next; - } - return att; - }) - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - game.broadcastAll(function(target1,target2){ - game.swapSeat(target1,target2,null,true); - },player,target); - } - else event.finish(); - 'step 3' + player + .chooseTarget( + "请选择一名要更换座次的角色,将自己移动到该角色的上家位置", + function (card, player, target) { + return target != player && target != player.next; + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + var current = _status.currentPhase.next; + var max = 20, + att = 0; + while (max > 0) { + max--; + if (current == target) return att; + att -= get.attitude(player, current); + current = current.next; + } + return att; + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + game.broadcastAll( + function (target1, target2) { + game.swapSeat(target1, target2, null, true); + }, + player, + target + ); + } else event.finish(); + ("step 3"); player.insertPhase(); }, - ai:{ - combo:'dctuoyu' - } + ai: { + combo: "dctuoyu", + }, }, - dccuixin:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter(event,player){ - if(!event._dccuixin||get.type(event.card,false)=='delay'||get.type(event.card,false)=='equip') return false; - var card={ - name:event.card.name, - nature:event.card.nature, - isCard:true, - },list=event._dccuixin; - for(var target of list){ - var targetx=player[target](); - if(lib.filter.targetEnabled2(card,targetx,player)) return true; + dccuixin: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + if ( + !event._dccuixin || + get.type(event.card, false) == "delay" || + get.type(event.card, false) == "equip" + ) + return false; + var card = { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }, + list = event._dccuixin; + for (var target of list) { + var targetx = player[target](); + if (lib.filter.targetEnabled2(card, targetx, player)) return true; } return false; }, - direct:true, - content(){ - 'step 0' - var card={ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, + direct: true, + content() { + "step 0"; + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, }; - event.card=card; - var list=[]; - trigger._dccuixin.forEach(target=>{ - var targetx=player[target](); - if(lib.filter.targetEnabled2(card,targetx,player)) list.add(targetx); + event.card = card; + var list = []; + trigger._dccuixin.forEach((target) => { + var targetx = player[target](); + if (lib.filter.targetEnabled2(card, targetx, player)) list.add(targetx); }); - if(list.length==1){ - event.target=list[0]; - player.chooseBool('摧心:是否视为对'+get.translation(list[0])+'使用'+get.translation(card)+'?').set('goon',get.effect(list[0],card,player,player)>0).set('ai',()=>_status.event.goon); + if (list.length == 1) { + event.target = list[0]; + player + .chooseBool( + "摧心:是否视为对" + + get.translation(list[0]) + + "使用" + + get.translation(card) + + "?" + ) + .set("goon", get.effect(list[0], card, player, player) > 0) + .set("ai", () => _status.event.goon); + } else { + player + .chooseTarget( + "摧心:是否视为对上家或下家使用" + get.translation(card) + "?", + "操作提示:从上家或下家中选择一名角色作为使用目标", + function (card, player, target) { + return ( + (target == player.getNext() || target == player.getPrevious()) && + lib.filter.targetEnabled2( + _status.event.getParent().card, + target, + player + ) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.getParent().card, player, player); + }); } - else{ - player.chooseTarget('摧心:是否视为对上家或下家使用'+get.translation(card)+'?','操作提示:从上家或下家中选择一名角色作为使用目标',function(card,player,target){ - return (target==player.getNext()||target==player.getPrevious())&&lib.filter.targetEnabled2(_status.event.getParent().card,target,player); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.getParent().card,player,player) - }) - } - 'step 1' - if(result.bool){ - var target=event.target||result.targets[0]; - player.useCard(card,target,false,'dccuixin'); + ("step 1"); + if (result.bool) { + var target = event.target || result.targets[0]; + player.useCard(card, target, false, "dccuixin"); } }, - group:'dccuixin_silent', - subSkill:{ - silent:{ - trigger:{player:'useCardToPlayered'}, - silent:true, - forced:true, - popup:false, - firstDo:true, - charlotte:true, - filter(event,player){ - if(!event.isFirstTarget||event.getParent().skill=='dccuixin') return false; - if(event.targets.length==0) return false; - return event.targets.includes(player.getNext())||event.targets.includes(player.getPrevious()); + group: "dccuixin_silent", + subSkill: { + silent: { + trigger: { player: "useCardToPlayered" }, + silent: true, + forced: true, + popup: false, + firstDo: true, + charlotte: true, + filter(event, player) { + if (!event.isFirstTarget || event.getParent().skill == "dccuixin") return false; + if (event.targets.length == 0) return false; + return ( + event.targets.includes(player.getNext()) || + event.targets.includes(player.getPrevious()) + ); + }, + content() { + var list = []; + if (trigger.targets.includes(player.getNext())) list.push("getPrevious"); + if (trigger.targets.includes(player.getPrevious())) list.push("getNext"); + trigger.getParent()._dccuixin = list; }, - content(){ - var list=[]; - if(trigger.targets.includes(player.getNext())) list.push('getPrevious'); - if(trigger.targets.includes(player.getPrevious())) list.push('getNext'); - trigger.getParent()._dccuixin=list; - } }, }, }, //海外神吕蒙 - twshelie:{ - audio:'shelie', - inherit:'shelie', - prompt2:()=>lib.translate.shelie_info, - group:'twshelie_jingce', + twshelie: { + audio: "shelie", + inherit: "shelie", + prompt2: () => lib.translate.shelie_info, + group: "twshelie_jingce", //什么精策技能啊喂! - subSkill:{ - round:{charlotte:true}, - count:{ - charlotte:true, - onremove:true, - intro:{ - markcount(storage){ + subSkill: { + round: { charlotte: true }, + count: { + charlotte: true, + onremove: true, + intro: { + markcount(storage) { return storage.length; }, - content:'本回合已使用$花色的牌', + content: "本回合已使用$花色的牌", }, }, - jingce:{ - audio:'shelie', - trigger:{player:['phaseJieshuBegin','useCard1']}, - filter(event,player){ - if(player.hasSkill('twshelie_round')||player!=_status.currentPhase) return false; - var list=[]; - player.getHistory('useCard',function(evt){ - if(lib.suit.includes(get.suit(evt.card))&&!list.includes(get.suit(evt.card))) list.push(get.suit(evt.card)); + jingce: { + audio: "shelie", + trigger: { player: ["phaseJieshuBegin", "useCard1"] }, + filter(event, player) { + if (player.hasSkill("twshelie_round") || player != _status.currentPhase) + return false; + var list = []; + player.getHistory("useCard", function (evt) { + if ( + lib.suit.includes(get.suit(evt.card)) && + !list.includes(get.suit(evt.card)) + ) + list.push(get.suit(evt.card)); }); - if(list.length){ - player.addTempSkill('twshelie_count'); - player.storage.twshelie_count=list.sort(function(a,b){ - return lib.suit.indexOf(b)-lib.suit.indexOf(a); + if (list.length) { + player.addTempSkill("twshelie_count"); + player.storage.twshelie_count = list.sort(function (a, b) { + return lib.suit.indexOf(b) - lib.suit.indexOf(a); }); - player.markSkill('twshelie_count'); - player.syncStorage('twshelie_count'); + player.markSkill("twshelie_count"); + player.syncStorage("twshelie_count"); } - return event.name!='useCard'&&list.length>=player.hp; + return event.name != "useCard" && list.length >= player.hp; }, - forced:true, - locked:false, - content(){ - 'step 0' - player.addTempSkill('twshelie_round','roundStart'); - player.chooseControl('摸牌阶段','出牌阶段').set('prompt','涉猎:请选择要执行的额外阶段'); - 'step 1' - if(result.index==0){ - var next=player.phaseDraw(); + forced: true, + locked: false, + content() { + "step 0"; + player.addTempSkill("twshelie_round", "roundStart"); + player + .chooseControl("摸牌阶段", "出牌阶段") + .set("prompt", "涉猎:请选择要执行的额外阶段"); + ("step 1"); + if (result.index == 0) { + var next = player.phaseDraw(); event.next.remove(next); trigger.getParent().next.push(next); } - if(result.index==1){ - var next=player.phaseUse(); + if (result.index == 1) { + var next = player.phaseUse(); event.next.remove(next); trigger.getParent().next.push(next); } @@ -2077,2164 +2562,2648 @@ game.import('character', function () { }, }, }, - twgongxin:{ - audio:'gongxin', - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); + twgongxin: { + audio: "gongxin", + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); }); }, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; }, - usable:1, - content(){ - 'step 0' - event.num=target.getCards('h').reduce(function(arr,card){ - return arr.add(get.suit(card,player)),arr; - },[]).length; - 'step 1' - var cards=target.getCards('h'); - player.chooseButton(2,[ - '攻心', - cards, - [['弃置此牌','置于牌堆顶'],'tdnodes'], - ]).set('filterButton',function(button){ - var type=typeof button.link; - if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; - return true; - }).set('ai',function(button){ - var target=_status.event.target; - var type=typeof button.link; - if(type=='object') return get.value(button.link,target); - }); - 'step 2' - if(result.bool){ - if(typeof result.links[0]!='string') result.links.reverse(); - var card=result.links[1],choice=result.links[0]; - if(choice=='弃置此牌') target.discard(card); + usable: 1, + content() { + "step 0"; + event.num = target.getCards("h").reduce(function (arr, card) { + return arr.add(get.suit(card, player)), arr; + }, []).length; + ("step 1"); + var cards = target.getCards("h"); + player + .chooseButton(2, ["攻心", cards, [["弃置此牌", "置于牌堆顶"], "tdnodes"]]) + .set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) + return false; + return true; + }) + .set("ai", function (button) { + var target = _status.event.target; + var type = typeof button.link; + if (type == "object") return get.value(button.link, target); + }); + ("step 2"); + if (result.bool) { + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1], + choice = result.links[0]; + if (choice == "弃置此牌") target.discard(card); else { - player.showCards(card,get.translation(player)+'对'+get.translation(target)+'发动了【攻心】'); - target.lose(card,ui.cardPile,'visible','insert'); - game.log(card,'被置于了牌堆顶'); + player.showCards( + card, + get.translation(player) + "对" + get.translation(target) + "发动了【攻心】" + ); + target.lose(card, ui.cardPile, "visible", "insert"); + game.log(card, "被置于了牌堆顶"); } } - 'step 3' - if(event.num==target.getCards('h').reduce(function(arr,card){ - return arr.add(get.suit(card,player)),arr; - },[]).length) event.finish(); - 'step 4' - var num1=0; - for(var card of target.getCards('h')){ - if(get.color(card)=='red') num1++; + ("step 3"); + if ( + event.num == + target.getCards("h").reduce(function (arr, card) { + return arr.add(get.suit(card, player)), arr; + }, []).length + ) + event.finish(); + ("step 4"); + var num1 = 0; + for (var card of target.getCards("h")) { + if (get.color(card) == "red") num1++; } - var num2=target.countCards('h')-num1; - player.chooseControl(['红色','黑色','cancel2']).set('prompt','是否令'+get.translation(target)+'本回合无法使用一种颜色的牌?').set('ai',function(){ - return num1>=num2?'红色':'黑色'; - }); - 'step 5' - if(result.control!='cancel2'){ + var num2 = target.countCards("h") - num1; + player + .chooseControl(["红色", "黑色", "cancel2"]) + .set("prompt", "是否令" + get.translation(target) + "本回合无法使用一种颜色的牌?") + .set("ai", function () { + return num1 >= num2 ? "红色" : "黑色"; + }); + ("step 5"); + if (result.control != "cancel2") { player.line(target); - target.addTempSkill('twgongxin2'); - target.markAuto('twgongxin2',[result.control=='红色'?'red':'black']); - game.log(target,'本回合无法使用'+result.control+'牌'); - if(!event.isMine()&&!event.isOnline()) game.delayx(); + target.addTempSkill("twgongxin2"); + target.markAuto("twgongxin2", [result.control == "红色" ? "red" : "black"]); + game.log(target, "本回合无法使用" + result.control + "牌"); + if (!event.isMine() && !event.isOnline()) game.delayx(); } }, - ai:{ - order:10, - expose:0.25, - result:{ - target(player,target){ - return -target.countCards('h'); + ai: { + order: 10, + expose: 0.25, + result: { + target(player, target) { + return -target.countCards("h"); }, }, }, }, - twgongxin2:{ - mod:{ - cardEnabled2(card,player){ + twgongxin2: { + mod: { + cardEnabled2(card, player) { const color = get.color(card); - if(color!='unsure' && player.getStorage('twgongxin2').includes(color)) return false; + if (color != "unsure" && player.getStorage("twgongxin2").includes(color)) + return false; }, }, - charlotte:true, - onremove:true, - intro:{content:'本回合内不能使用或打出$牌'}, + charlotte: true, + onremove: true, + intro: { content: "本回合内不能使用或打出$牌" }, }, //神张角 - yizhao:{ - audio:2, - trigger:{ - player:['useCard','respond'] + yizhao: { + audio: 2, + trigger: { + player: ["useCard", "respond"], }, - forced:true, - filter(event,player){ - return typeof get.number(event.card)=='number'; + forced: true, + filter(event, player) { + return typeof get.number(event.card) == "number"; }, - marktext:'黄', - intro:{ - name:'黄(异兆/肆军)', - name2:'黄', - content:'mark', - markcount(storage,player){ - return (storage||0).toString().slice(-2); + marktext: "黄", + intro: { + name: "黄(异兆/肆军)", + name2: "黄", + content: "mark", + markcount(storage, player) { + return (storage || 0).toString().slice(-2); }, }, - content(){ - 'step 0' - event.num=player.countMark('yizhao'); - player.addMark('yizhao',get.number(trigger.card)); - 'step 1' - var num=Math.floor(num/10)%10,num2=Math.floor(player.countMark('yizhao')/10)%10; - if(num!=num2){ - var card=get.cardPile2(card=>{ - return get.number(card,false)==num2; + content() { + "step 0"; + event.num = player.countMark("yizhao"); + player.addMark("yizhao", get.number(trigger.card)); + ("step 1"); + var num = Math.floor(num / 10) % 10, + num2 = Math.floor(player.countMark("yizhao") / 10) % 10; + if (num != num2) { + var card = get.cardPile2((card) => { + return get.number(card, false) == num2; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); } }, - mod:{ - aiOrder(player,card,num){ - if(Math.floor((get.number(card)+player.countMark('yizhao')%10)/10)==1) return num+10; + mod: { + aiOrder(player, card, num) { + if (Math.floor((get.number(card) + (player.countMark("yizhao") % 10)) / 10) == 1) + return num + 10; }, }, - ai:{ - threaten:1.5, - effect:{ - target(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,0.1]; - } - } - } - }, - sijun:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - return player.countMark('yizhao')>ui.cardPile.childNodes.length; + ai: { + threaten: 1.5, + effect: { + target(card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 0.1]; + }, + }, }, - check(event,player){ + }, + sijun: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return player.countMark("yizhao") > ui.cardPile.childNodes.length; + }, + check(event, player) { return ui.cardPile.childNodes.length; }, - content(){ - 'step 0' - player.removeMark('yizhao',player.countMark('yizhao')); + content() { + "step 0"; + player.removeMark("yizhao", player.countMark("yizhao")); game.washCard(); - 'step 1' - var pile=Array.from(ui.cardPile.childNodes); - if(pile.length<3) return; - var bool=false,max=Math.pow(2,Math.min(100,pile.length)),index; - for(var i=0;i36) break; + for (var k = 0; k < index.length; k++) { + if (index[k] == "1") num += get.number(pile[k]); + if (num > 36) break; } - if(num==36){ - bool=true; + if (num == 36) { + bool = true; break; } } - if(bool){ - var cards=[]; - for(var k=0;kget.type2(evt.card))); - if(cards.filter(card=>!types.includes(get.type2(card))).length){ + }, + sanshou: { + audio: 2, + trigger: { player: "damageBegin4" }, + check(event, player) { + return get.damageEffect(player, event.source, player, event.nature) <= 0; + }, + content() { + "step 0"; + var cards = game.cardsGotoOrdering(get.cards(3)).cards; + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【三首】"); + ("step 1"); + var types = []; + types.addArray(game.getGlobalHistory("useCard").map((evt) => get.type2(evt.card))); + if (cards.filter((card) => !types.includes(get.type2(card))).length) { trigger.cancel(); } game.delayx(); }, - ai:{ - effect:{ - target(card,player,target){ - if(card.name=='shandian'||card.name=='fulei') return [0,0.1]; - if(!get.tag(card,'damage')) return; - var types=[],bool=0; - types.addArray(game.getGlobalHistory('useCard').map(evt=>get.type2(evt.card))); - if(!types.includes(get.type2(card))) bool=1; - if(types.length<2) return Math.min(1,0.4+(types.length+bool)*0.2); - } - } + ai: { + effect: { + target(card, player, target) { + if (card.name == "shandian" || card.name == "fulei") return [0, 0.1]; + if (!get.tag(card, "damage")) return; + var types = [], + bool = 0; + types.addArray( + game.getGlobalHistory("useCard").map((evt) => get.type2(evt.card)) + ); + if (!types.includes(get.type2(card))) bool = 1; + if (types.length < 2) return Math.min(1, 0.4 + (types.length + bool) * 0.2); + }, + }, }, }, - tianjie:{ - audio:2, - trigger:{global:'phaseEnd'}, - direct:true, - filter(event,player){ - return game.hasGlobalHistory('cardMove',evt=>evt.washCard)&&game.hasPlayer(current=>current!=player); + tianjie: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter(event, player) { + return ( + game.hasGlobalHistory("cardMove", (evt) => evt.washCard) && + game.hasPlayer((current) => current != player) + ); }, - skillAnimation:true, - animationColor:'metal', - content(){ - 'step 0' - player.chooseTarget(get.prompt('tianjie'),'选择至多三名其他角色,依次对这些角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)',[1,3]).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player,'thunder')*Math.sqrt(Math.max(1,target.countCards('h','shan'))); - }); - 'step 1' - if(result.bool){ - var targets=result.targets; + skillAnimation: true, + animationColor: "metal", + content() { + "step 0"; + player + .chooseTarget( + get.prompt("tianjie"), + "选择至多三名其他角色,依次对这些角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)", + [1, 3] + ) + .set("ai", (target) => { + var player = _status.event.player; + return ( + get.damageEffect(target, player, player, "thunder") * + Math.sqrt(Math.max(1, target.countCards("h", "shan"))) + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; targets.sortBySeat(); - player.logSkill('tianjie',targets); - for(var target of targets){ - var num=Math.max(1,target.countCards('h','shan')); - target.damage(num,'thunder'); + player.logSkill("tianjie", targets); + for (var target of targets) { + var num = Math.max(1, target.countCards("h", "shan")); + target.damage(num, "thunder"); } } }, }, - shencai:{ - audio:2, - enable:'phaseUse', - usable:5, - filter(event,player){ - var count=player.getStat('skill').shencai; - if(count&&count>player.countMark('shencai')) return false; + shencai: { + audio: 2, + enable: "phaseUse", + usable: 5, + filter(event, player) { + var count = player.getStat("skill").shencai; + if (count && count > player.countMark("shencai")) return false; return true; }, - filterTarget:lib.filter.notMe, - onremove:true, - prompt:'选择一名其他角色进行地狱审判', - content(){ - var next=target.judge(); - next.callback=lib.skill.shencai.contentx; + filterTarget: lib.filter.notMe, + onremove: true, + prompt: "选择一名其他角色进行地狱审判", + content() { + var next = target.judge(); + next.callback = lib.skill.shencai.contentx; }, - ai:{ - order:8, - result:{target:-1}, + ai: { + order: 8, + result: { target: -1 }, }, - contentx(){ - var card=event.judgeResult.card; - var player=event.getParent(2).player; - var target=event.getParent(2).target; - if(get.position(card,true)=='o') player.gain(card,'gain2'); - var list=[],str=lib.skill.shencai.getStr(card); - for(var i in lib.skill.shencai.filterx){ - if(str.indexOf(lib.skill.shencai.filterx[i])!=-1) list.push('shencai_'+i); + contentx() { + var card = event.judgeResult.card; + var player = event.getParent(2).player; + var target = event.getParent(2).target; + if (get.position(card, true) == "o") player.gain(card, "gain2"); + var list = [], + str = lib.skill.shencai.getStr(card); + for (var i in lib.skill.shencai.filterx) { + if (str.indexOf(lib.skill.shencai.filterx[i]) != -1) list.push("shencai_" + i); } - if(list.length){ - for(var i in lib.skill.shencai.filterx){ - var num=target.countMark('shencai_'+i); - if(num>0){ - target.removeMark('shencai_'+i,num); - target.removeSkill('shencai_'+i); + if (list.length) { + for (var i in lib.skill.shencai.filterx) { + var num = target.countMark("shencai_" + i); + if (num > 0) { + target.removeMark("shencai_" + i, num); + target.removeSkill("shencai_" + i); } } - if(target.isIn()){ - for(var i of list){ + if (target.isIn()) { + for (var i of list) { target.addSkill(i); - target.addMark(i,1); + target.addMark(i, 1); } } - } - else if(target.isIn()){ - player.gainPlayerCard(target,true,'hej'); - target.addMark('shencai_death',1); - target.addSkill('shencai_death'); + } else if (target.isIn()) { + player.gainPlayerCard(target, true, "hej"); + target.addMark("shencai_death", 1); + target.addSkill("shencai_death"); } }, - filterx:{ - losehp:'体力', - weapon:'武器', - respond:'打出', - distance:'距离', + filterx: { + losehp: "体力", + weapon: "武器", + respond: "打出", + distance: "距离", }, - getStr(node){ - var str='',name=node.name; - if(lib.translate[name+'_info']){ - if(lib.card[name].type&&lib.translate[lib.card[name].type]) str+=(''+get.translation(lib.card[name].type)+'牌|'); - if(get.subtype(name)){ - str+=(''+get.translation(get.subtype(name))+'|'); + getStr(node) { + var str = "", + name = node.name; + if (lib.translate[name + "_info"]) { + if (lib.card[name].type && lib.translate[lib.card[name].type]) + str += "" + get.translation(lib.card[name].type) + "牌|"; + if (get.subtype(name)) { + str += "" + get.translation(get.subtype(name)) + "|"; } - if(lib.card[name]&&lib.card[name].addinfomenu){ - str+=(''+lib.card[name].addinfomenu+'|'); + if (lib.card[name] && lib.card[name].addinfomenu) { + str += "" + lib.card[name].addinfomenu + "|"; } - if(get.subtype(name)=='equip1'){ - var added=false; - if(lib.card[node.name]&&lib.card[node.name].distance){ - var dist=lib.card[node.name].distance; - if(dist.attackFrom){ - added=true; - str+=('攻击范围:'+(-dist.attackFrom+1)+'|'); + if (get.subtype(name) == "equip1") { + var added = false; + if (lib.card[node.name] && lib.card[node.name].distance) { + var dist = lib.card[node.name].distance; + if (dist.attackFrom) { + added = true; + str += "攻击范围:" + (-dist.attackFrom + 1) + "|"; } } - if(!added){ - str+=('攻击范围:1|'); + if (!added) { + str += "攻击范围:1|"; } } } - if(lib.card[name].cardPrompt){ - str+=(''+lib.card[name].cardPrompt(node)+'|'); + if (lib.card[name].cardPrompt) { + str += "" + lib.card[name].cardPrompt(node) + "|"; + } else if (lib.translate[name + "_info"]) { + str += "" + lib.translate[name + "_info"] + "|"; } - else if(lib.translate[name+'_info']){ - str+=(''+lib.translate[name+'_info']+'|'); + if (lib.translate[name + "_append"]) { + str += "" + lib.translate[name + "_append"] + "|"; } - if(lib.translate[name+'_append']){ - str+=(''+lib.translate[name+'_append']+'|'); - } - if(get.is.yingbianConditional(node)){ - const yingbianEffects=get.yingbianEffects(node); - if(!yingbianEffects.length){ - const defaultYingbianEffect=get.defaultYingbianEffect(node); - if(lib.yingbian.prompt.has(defaultYingbianEffect)) yingbianEffects.push(defaultYingbianEffect); + if (get.is.yingbianConditional(node)) { + const yingbianEffects = get.yingbianEffects(node); + if (!yingbianEffects.length) { + const defaultYingbianEffect = get.defaultYingbianEffect(node); + if (lib.yingbian.prompt.has(defaultYingbianEffect)) + yingbianEffects.push(defaultYingbianEffect); } - if(yingbianEffects.length) str+=`应变:${yingbianEffects.map(value=>lib.yingbian.prompt.get(value)).join(';')}|`; + if (yingbianEffects.length) + str += `应变:${yingbianEffects + .map((value) => lib.yingbian.prompt.get(value)) + .join(";")}|`; } return str; }, - subSkill:{ - losehp:{ - charlotte:true, - marktext:'笞', - trigger:{player:'damageEnd'}, - forced:true, - content(){ + subSkill: { + losehp: { + charlotte: true, + marktext: "笞", + trigger: { player: "damageEnd" }, + forced: true, + content() { player.loseHp(trigger.num); }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.tag(card,'damage')&¤t<0) return 1.6; + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && current < 0) return 1.6; }, }, }, - intro:{ - name:'神裁 - 体力', - name2:'笞', - content:'锁定技。当你受到伤害后,你失去等量的体力。', - onunmark:true, + intro: { + name: "神裁 - 体力", + name2: "笞", + content: "锁定技。当你受到伤害后,你失去等量的体力。", + onunmark: true, }, }, - weapon:{ - charlotte:true, - marktext:'杖', - trigger:{target:'useCardToTargeted'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'; + weapon: { + charlotte: true, + marktext: "杖", + trigger: { target: "useCardToTargeted" }, + forced: true, + filter(event, player) { + return event.card.name == "sha"; }, - content(){ + content() { trigger.directHit.add(player); - game.log(player,'不可响应',trigger.card); + game.log(player, "不可响应", trigger.card); }, - intro:{ - name:'神裁 - 武器', - name2:'杖', - content:'锁定技。当你成为【杀】的目标后,你不能使用牌响应此【杀】。', - onunmark:true, + intro: { + name: "神裁 - 武器", + name2: "杖", + content: "锁定技。当你成为【杀】的目标后,你不能使用牌响应此【杀】。", + onunmark: true, }, - global:'shencai_weapon_ai', + global: "shencai_weapon_ai", }, - ai:{ - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(!arg||!arg.card||arg.card.name!='sha') return false; - if(!arg.target||!arg.target.hasSkill('shencai_weapon')) return false; + ai: { + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (!arg || !arg.card || arg.card.name != "sha") return false; + if (!arg.target || !arg.target.hasSkill("shencai_weapon")) return false; return true; }, }, }, - respond:{ - charlotte:true, - marktext:'徒', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + respond: { + charlotte: true, + marktext: "徒", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter(event,player){ - if(!player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'shencai_respond'); - },'h')) return false; - var evt=event.getParent('shencai_respond'); - if(evt&&evt.player==player) return false; - evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length>0; + forced: true, + filter(event, player) { + if ( + !player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "shencai_respond"); + }, "h") + ) + return false; + var evt = event.getParent("shencai_respond"); + if (evt && evt.player == player) return false; + evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; }, - content(){ - var cards=player.getCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'shencai_respond'); + content() { + var cards = player.getCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "shencai_respond"); }); - if(cards.length>0) player.discard(cards.randomGet()); + if (cards.length > 0) player.discard(cards.randomGet()); }, - intro:{ - name:'神裁 - 打出', - name2:'徒', - content:'锁定技。当你失去手牌后,你随机弃置一张手牌(不嵌套触发)。', - onunmark:true, + intro: { + name: "神裁 - 打出", + name2: "徒", + content: "锁定技。当你失去手牌后,你随机弃置一张手牌(不嵌套触发)。", + onunmark: true, }, }, - distance:{ - charlotte:true, - marktext:'流', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - content(){ + distance: { + charlotte: true, + marktext: "流", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content() { player.turnOver(); }, - intro:{ - name:'神裁 - 距离', - name2:'流', - content:'锁定技。结束阶段开始时,你翻面。', - onunmark:true, + intro: { + name: "神裁 - 距离", + name2: "流", + content: "锁定技。结束阶段开始时,你翻面。", + onunmark: true, }, }, - death:{ - charlotte:true, - marktext:'死', - mod:{ - maxHandcard(player,num){ - return num-player.countMark('shencai_death'); + death: { + charlotte: true, + marktext: "死", + mod: { + maxHandcard(player, num) { + return num - player.countMark("shencai_death"); }, }, - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.countMark('shencai_death')>game.countPlayer(); + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.countMark("shencai_death") > game.countPlayer(); }, - content(){ + content() { player.die(); }, - intro:{ - name:'神裁 - 死', - name2:'死', - content:'锁定技。你的角色手牌上限-#;回合结束时,若场上存活人数小于#,则你死亡。', - onunmark:true, + intro: { + name: "神裁 - 死", + name2: "死", + content: + "锁定技。你的角色手牌上限-#;回合结束时,若场上存活人数小于#,则你死亡。", + onunmark: true, }, }, }, - intro:{ - content:'发动次数上限+#', + intro: { + content: "发动次数上限+#", }, }, - xunshi:{ - audio:2, - mod:{ - cardname(card){ - if(lib.skill.xunshi.isXunshi(card)) return 'sha'; + xunshi: { + audio: 2, + mod: { + cardname(card) { + if (lib.skill.xunshi.isXunshi(card)) return "sha"; }, - cardnature(card){ - if(lib.skill.xunshi.isXunshi(card)) return false; + cardnature(card) { + if (lib.skill.xunshi.isXunshi(card)) return false; }, - suit(card){ - if(lib.skill.xunshi.isXunshi(card)) return 'none'; + suit(card) { + if (lib.skill.xunshi.isXunshi(card)) return "none"; }, - targetInRange(card){ + targetInRange(card) { const suit = get.color(card); - if (suit=='none' || suit=='unsure') return true; + if (suit == "none" || suit == "unsure") return true; }, - cardUsable(card){ + cardUsable(card) { const suit = get.color(card); - if (suit=='none' || suit=='unsure') return Infinity; + if (suit == "none" || suit == "unsure") return Infinity; }, }, - isXunshi(card){ - var info=lib.card[card.name]; - if(!info||(info.type!='trick'&&info.type!='delay')) return false; - if(info.notarget) return false; - if(info.selectTarget!=undefined){ - if(Array.isArray(info.selectTarget)){ - if(info.selectTarget[0]<0) return !info.toself; - return info.selectTarget[0]!=1||info.selectTarget[1]!=1; - } - else{ - if(info.selectTarget<0) return !info.toself; - return info.selectTarget!=1; + isXunshi(card) { + var info = lib.card[card.name]; + if (!info || (info.type != "trick" && info.type != "delay")) return false; + if (info.notarget) return false; + if (info.selectTarget != undefined) { + if (Array.isArray(info.selectTarget)) { + if (info.selectTarget[0] < 0) return !info.toself; + return info.selectTarget[0] != 1 || info.selectTarget[1] != 1; + } else { + if (info.selectTarget < 0) return !info.toself; + return info.selectTarget != 1; } } return false; }, - trigger:{player:'useCard2'}, - forced:true, - filter(event,player){ - return get.color(event.card)=='none'; + trigger: { player: "useCard2" }, + forced: true, + filter(event, player) { + return get.color(event.card) == "none"; }, - content(){ - 'step 0' - if(player.countMark('shencai')<4&&player.hasSkill('shencai',null,null,false)) player.addMark('shencai',1,false); - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(typeof stat[name]=='number') stat[name]--; + content() { + "step 0"; + if (player.countMark("shencai") < 4 && player.hasSkill("shencai", null, null, false)) + player.addMark("shencai", 1, false); + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; } - var info=get.info(trigger.card); - if(info.allowMultiple==false) event.finish(); - else if(trigger.targets&&!info.multitarget){ - if(!game.hasPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,player,current); - })) event.finish(); - } - else event.finish(); - 'step 1' - var prompt2='为'+get.translation(trigger.card)+'增加任意个目标' - player.chooseTarget(get.prompt('xunshi'),function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - },[1,Infinity]).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - 'step 2' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + var info = get.info(trigger.card); + if (info.allowMultiple == false) event.finish(); + else if (trigger.targets && !info.multitarget) { + if ( + !game.hasPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, player, current) + ); + }) + ) + event.finish(); + } else event.finish(); + ("step 1"); + var prompt2 = "为" + get.translation(trigger.card) + "增加任意个目标"; + player + .chooseTarget( + get.prompt("xunshi"), + function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }, + [1, Infinity] + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + ("step 2"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 3' - if(event.targets){ - player.line(event.targets,'fire'); + ("step 3"); + if (event.targets) { + player.line(event.targets, "fire"); trigger.targets.addArray(event.targets); } }, }, - twwushen:{ - mod:{ - cardname(card,player,name){ - if(get.suit(card)=='heart') return 'sha'; + twwushen: { + mod: { + cardname(card, player, name) { + if (get.suit(card) == "heart") return "sha"; }, - cardnature(card,player){ - if(get.suit(card)=='heart') return false; + cardnature(card, player) { + if (get.suit(card) == "heart") return false; }, - targetInRange(card){ - if(card.name === 'sha'){ + targetInRange(card) { + if (card.name === "sha") { const suit = get.suit(card); - if (suit === 'heart' || suit === 'unsure') return true; + if (suit === "heart" || suit === "unsure") return true; } }, - cardUsable(card){ - if(card.name === 'sha'){ + cardUsable(card) { + if (card.name === "sha") { const suit = get.suit(card); - if (suit === 'heart' || suit === 'unsure') return Infinity; + if (suit === "heart" || suit === "unsure") return Infinity; } - } + }, }, - audio:'wushen', - trigger:{player:'useCard2'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'&&(get.suit(event.card)=='heart'||!player.hasSkill('twwushen_phase',null,null,false)); + audio: "wushen", + trigger: { player: "useCard2" }, + forced: true, + filter(event, player) { + return ( + event.card.name == "sha" && + (get.suit(event.card) == "heart" || + !player.hasSkill("twwushen_phase", null, null, false)) + ); }, - logTarget(event,player){ - if(get.suit(event.card)=='heart'){ - var targets=game.filterPlayer(function(current){ - return !event.targets.includes(current)&¤t.hasMark('twwuhun')&&lib.filter.targetEnabled(event.card,player,current); + logTarget(event, player) { + if (get.suit(event.card) == "heart") { + var targets = game.filterPlayer(function (current) { + return ( + !event.targets.includes(current) && + current.hasMark("twwuhun") && + lib.filter.targetEnabled(event.card, player, current) + ); }); - if(targets.length){ + if (targets.length) { return targets.sortBySeat(); } } return null; }, - content(){ - if(!player.hasSkill('twwushen_phase',null,null,false)){ + content() { + if (!player.hasSkill("twwushen_phase", null, null, false)) { trigger.directHit.addArray(game.players); - player.addTempSkill('twwushen_phase',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']) + player.addTempSkill("twwushen_phase", [ + "phaseZhunbeiAfter", + "phaseJudgeAfter", + "phaseDrawAfter", + "phaseUseAfter", + "phaseDiscardAfter", + "phaseJieshuAfter", + ]); } - if(get.suit(trigger.card)=='heart'){ - if(trigger.addCount!==false){ - trigger.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + if (get.suit(trigger.card) == "heart") { + if (trigger.addCount !== false) { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } } - var targets=game.filterPlayer(function(current){ - return !trigger.targets.includes(current)&¤t.hasMark('twwuhun')&&lib.filter.targetEnabled(trigger.card,player,current); + var targets = game.filterPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + current.hasMark("twwuhun") && + lib.filter.targetEnabled(trigger.card, player, current) + ); }); - if(targets.length){ + if (targets.length) { trigger.targets.addArray(targets.sortBySeat()); - game.log(targets,'也成为了',trigger.card,'的目标'); + game.log(targets, "也成为了", trigger.card, "的目标"); } } }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return arg.card.name=='sha'&&!player.hasSkill('twwushen_phase',null,null,false); + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return ( + arg.card.name == "sha" && !player.hasSkill("twwushen_phase", null, null, false) + ); }, }, - subSkill:{phase:{charlotte:true}}, - shaRelated:true, + subSkill: { phase: { charlotte: true } }, + shaRelated: true, }, - twwuhun:{ - audio:2, - trigger:{player:'die'}, - forceDie:true, - skillAnimation:true, - animationColor:'soil', - locked:true, - check(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.hasMark('twwuhun')&&get.attitude(player,current)<0; + twwuhun: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + locked: true, + check(event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && + current.hasMark("twwuhun") && + get.attitude(player, current) < 0 + ); }); }, - content(){ - 'step 0' - player.judge(function(card){ - var name=get.name(card,false); - if(name=='tao'||name=='taoyuan') return -25; - return 15; - }).set('forceDie',true).judge2=function(result){ + content() { + "step 0"; + player + .judge(function (card) { + var name = get.name(card, false); + if (name == "tao" || name == "taoyuan") return -25; + return 15; + }) + .set("forceDie", true).judge2 = function (result) { return result.bool; }; - 'step 1' - var num=game.countPlayer(function(current){ - return current!=player&¤t.hasMark('twwuhun'); + ("step 1"); + var num = game.countPlayer(function (current) { + return current != player && current.hasMark("twwuhun"); }); - if(result.bool&&num>0){ - player.chooseTarget('请选择【武魂】的目标','选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)',true,[1,num],function(card,player,target){ - return target!=player&&target.hasMark('twwuhun'); - }).set('forceDie',true).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - } - else event.finish(); - 'step 2' - var targets=result.targets.sortBySeat(); - player.line(targets,'fire'); - event.targets=targets; - 'step 3' - var target=targets.shift(); - var num=target.countMark('twwuhun'); - if(num>0) target.loseHp(num); - if(targets.length>0) event.redo(); + if (result.bool && num > 0) { + player + .chooseTarget( + "请选择【武魂】的目标", + "选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)", + true, + [1, num], + function (card, player, target) { + return target != player && target.hasMark("twwuhun"); + } + ) + .set("forceDie", true) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + ("step 2"); + var targets = result.targets.sortBySeat(); + player.line(targets, "fire"); + event.targets = targets; + ("step 3"); + var target = targets.shift(); + var num = target.countMark("twwuhun"); + if (num > 0) target.loseHp(num); + if (targets.length > 0) event.redo(); }, - marktext:'魇', - intro:{ - name:'梦魇', - content:'mark', - onunmark:true, + marktext: "魇", + intro: { + name: "梦魇", + content: "mark", + onunmark: true, }, - group:'twwuhun_gain', - subSkill:{ - gain:{ - audio:'twwuhun', - trigger:{ - player:'damageEnd', - source:'damageSource', + group: "twwuhun_gain", + subSkill: { + gain: { + audio: "twwuhun", + trigger: { + player: "damageEnd", + source: "damageSource", }, - forced:true, - filter(event,player,name){ - if(event.player==event.source) return false; - var target=lib.skill.twwuhun_gain.logTarget(event,player); - if(!target||!target.isIn()) return false; - return name=='damageEnd'||target.hasMark('twwuhun'); + forced: true, + filter(event, player, name) { + if (event.player == event.source) return false; + var target = lib.skill.twwuhun_gain.logTarget(event, player); + if (!target || !target.isIn()) return false; + return name == "damageEnd" || target.hasMark("twwuhun"); }, - logTarget(event,player){ - if(player==event.player) return event.source; + logTarget(event, player) { + if (player == event.player) return event.source; return event.player; }, - content(){ - var target=lib.skill.twwuhun_gain.logTarget(trigger,player); - target.addMark('twwuhun',player==trigger.source?1:trigger.num); + content() { + var target = lib.skill.twwuhun_gain.logTarget(trigger, player); + target.addMark("twwuhun", player == trigger.source ? 1 : trigger.num); game.delayx(); }, }, }, - ai:{ - notemp:true, - maixie_defend:true, - effect:{ - target:(card,player,target)=>{ - if(!get.tag(card,'damage')||!target.hasFriend()) return; - let die=[],extra=[null,0],temp; - game.filterPlayer(i=>{ - if(!i.hasMark('twwuhun')) return false; - temp=get.attitude(target,i); - if(temp<0) die.push(i); - else{ - temp=Math.sqrt(temp)*i.countMark('twwuhun'); - if(!extra[0]||temp { + if (!get.tag(card, "damage") || !target.hasFriend()) return; + let die = [], + extra = [null, 0], + temp; + game.filterPlayer((i) => { + if (!i.hasMark("twwuhun")) return false; + temp = get.attitude(target, i); + if (temp < 0) die.push(i); + else { + temp = Math.sqrt(temp) * i.countMark("twwuhun"); + if (!extra[0] || temp < extra[1]) extra = [i, temp]; } }); - if(extra[0]&&!die.length) die.push(extra[0]); - if(target.hp+target.hujia>1&&(!die.length||get.attitude(player,target)<=0)) die.add(player); - if(die.length) return [1,0,1,die.reduce((num,i)=>{ - return num-=2*get.sgnAttitude(player,i); - },0)]; - } - } - } - }, - shouli:{ - audio:2, - mod:{ - cardUsable(card){ - if(card.storage&&card.storage.shouli) return Infinity; + if (extra[0] && !die.length) die.push(extra[0]); + if ( + target.hp + target.hujia > 1 && + (!die.length || get.attitude(player, target) <= 0) + ) + die.add(player); + if (die.length) + return [ + 1, + 0, + 1, + die.reduce((num, i) => { + return (num -= 2 * get.sgnAttitude(player, i)); + }, 0), + ]; + }, }, }, - enable:['chooseToUse','chooseToRespond'], - hiddenCard(player,name){ - if(player!=_status.currentPhase&&(name=='sha'||name=='shan')) return true; + }, + shouli: { + audio: 2, + mod: { + cardUsable(card) { + if (card.storage && card.storage.shouli) return Infinity; + }, }, - filter(event,player){ - if(event.responded||event.shouli||event.type=='wuxie') return false; - if(game.hasPlayer(function(current){ - return current.getCards('e',card=>get.is.attackingMount(card)).length>0; - })&&event.filterCard(get.autoViewAs({ - name:'sha', - storage:{shouli:true}, - },'unsure'),player,event)) return true; - if(game.hasPlayer(function(current){ - return current.getCards('e',card=>get.is.defendingMount(card)).length>0; - })&&event.filterCard(get.autoViewAs({ - name:'shan', - storage:{shouli:true}, - },'unsure'),player,event)) return true; + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard(player, name) { + if (player != _status.currentPhase && (name == "sha" || name == "shan")) return true; + }, + filter(event, player) { + if (event.responded || event.shouli || event.type == "wuxie") return false; + if ( + game.hasPlayer(function (current) { + return current.getCards("e", (card) => get.is.attackingMount(card)).length > 0; + }) && + event.filterCard( + get.autoViewAs( + { + name: "sha", + storage: { shouli: true }, + }, + "unsure" + ), + player, + event + ) + ) + return true; + if ( + game.hasPlayer(function (current) { + return current.getCards("e", (card) => get.is.defendingMount(card)).length > 0; + }) && + event.filterCard( + get.autoViewAs( + { + name: "shan", + storage: { shouli: true }, + }, + "unsure" + ), + player, + event + ) + ) + return true; return false; }, - delay:false, - locked:false, - filterTarget(card,player,target){ - var event=_status.event,evt=event; - if(event._backup) evt=event._backup; - var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); - var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); - if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({ - name:'shan', - storage:{shouli:true}, - },[card]),player,event))) return true; - return equip4.some(card=>{ - var sha=get.autoViewAs({ - name:'sha', - storage:{shouli:true}, - },[card]); - if(evt.filterCard(sha,player,event)){ - if(!evt.filterTarget) return true; - return game.hasPlayer(function(current){ - return evt.filterTarget(sha,player,current); - }) - } - }) - }, - prompt:'将场上的一张坐骑牌当做【杀】或【闪】使用或打出', - content(){ - 'step 0' - var evt=event.getParent(2); - evt.set('shouli',true); - var list=[]; - var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); - var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); - var backupx=_status.event; - _status.event=evt; - try{ - if(equip3.length&&equip3.some(card=>{ - var shan=get.autoViewAs({ - name:'shan', - storage:{shouli:true}, - },[card]); - if(evt.filterCard(shan,player,event)) return true; - return false; - })){ - list.push('shan'); - } - if(equip4.length&&equip4.some(card=>{ - var sha=get.autoViewAs({ - name:'sha', - storage:{shouli:true}, - },[card]); - if(evt.filterCard(sha,player,evt)&&(!evt.filterTarget||game.hasPlayer(function(current){ - return evt.filterTarget(sha,player,current); - }))) return true; - return false; - })){ - list.push('sha'); - } - }catch(e){game.print(e)} - _status.event=backupx; - if(list.length==1){ - event.cardName=list[0]; - var cards=list[0]=='shan'?equip3:equip4; - if(cards.length==1) event._result={ - bool:true, - links:[cards[0]], - } - else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - return _status.event.cards.includes(button.link); - }).set('cards',cards) - } - else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - var card=button.link; - return get.is.attackingMount(card)||get.is.defendingMount(card); - }); - 'step 1' - var evt=event.getParent(2); - if(result.bool&&result.links&&result.links.length){ - var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan')); - if(evt.name=='chooseToUse'){ - game.broadcastAll(function(result,name){ - lib.skill.shouli_backup.viewAs={ - name:name, - cards:[result], - storage:{shouli:true}, - }; - lib.skill.shouli_backup.prompt=('选择'+get.translation(name)+'('+get.translation(result)+')的目标'); - },result.links[0],name); - evt.set('_backupevent','shouli_backup'); - evt.backup('shouli_backup'); - evt.set('openskilldialog','选择'+get.translation(name)+'('+get.translation(result.links[0])+')的目标'); - evt.set('norestore',true); - evt.set('custom',{ - add:{}, - replace:{window(){}} + delay: false, + locked: false, + filterTarget(card, player, target) { + var event = _status.event, + evt = event; + if (event._backup) evt = event._backup; + var equip3 = target.getCards("e", (card) => get.is.defendingMount(card, false)); + var equip4 = target.getCards("e", (card) => get.is.attackingMount(card, false)); + if ( + equip3.length && + equip3.some((card) => + evt.filterCard( + get.autoViewAs( + { + name: "shan", + storage: { shouli: true }, + }, + [card] + ), + player, + event + ) + ) + ) + return true; + return equip4.some((card) => { + var sha = get.autoViewAs( + { + name: "sha", + storage: { shouli: true }, + }, + [card] + ); + if (evt.filterCard(sha, player, event)) { + if (!evt.filterTarget) return true; + return game.hasPlayer(function (current) { + return evt.filterTarget(sha, player, current); }); } - else{ + }); + }, + prompt: "将场上的一张坐骑牌当做【杀】或【闪】使用或打出", + content() { + "step 0"; + var evt = event.getParent(2); + evt.set("shouli", true); + var list = []; + var equip3 = target.getCards("e", (card) => get.is.defendingMount(card, false)); + var equip4 = target.getCards("e", (card) => get.is.attackingMount(card, false)); + var backupx = _status.event; + _status.event = evt; + try { + if ( + equip3.length && + equip3.some((card) => { + var shan = get.autoViewAs( + { + name: "shan", + storage: { shouli: true }, + }, + [card] + ); + if (evt.filterCard(shan, player, event)) return true; + return false; + }) + ) { + list.push("shan"); + } + if ( + equip4.length && + equip4.some((card) => { + var sha = get.autoViewAs( + { + name: "sha", + storage: { shouli: true }, + }, + [card] + ); + if ( + evt.filterCard(sha, player, evt) && + (!evt.filterTarget || + game.hasPlayer(function (current) { + return evt.filterTarget(sha, player, current); + })) + ) + return true; + return false; + }) + ) { + list.push("sha"); + } + } catch (e) { + game.print(e); + } + _status.event = backupx; + if (list.length == 1) { + event.cardName = list[0]; + var cards = list[0] == "shan" ? equip3 : equip4; + if (cards.length == 1) + event._result = { + bool: true, + links: [cards[0]], + }; + else + player + .choosePlayerCard(true, target, "e") + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set("cards", cards); + } else + player.choosePlayerCard(true, target, "e").set("filterButton", function (button) { + var card = button.link; + return get.is.attackingMount(card) || get.is.defendingMount(card); + }); + ("step 1"); + var evt = event.getParent(2); + if (result.bool && result.links && result.links.length) { + var name = + event.cardName || (get.is.attackingMount(result.links[0]) ? "sha" : "shan"); + if (evt.name == "chooseToUse") { + game.broadcastAll( + function (result, name) { + lib.skill.shouli_backup.viewAs = { + name: name, + cards: [result], + storage: { shouli: true }, + }; + lib.skill.shouli_backup.prompt = + "选择" + + get.translation(name) + + "(" + + get.translation(result) + + ")的目标"; + }, + result.links[0], + name + ); + evt.set("_backupevent", "shouli_backup"); + evt.backup("shouli_backup"); + evt.set( + "openskilldialog", + "选择" + + get.translation(name) + + "(" + + get.translation(result.links[0]) + + ")的目标" + ); + evt.set("norestore", true); + evt.set("custom", { + add: {}, + replace: { window() {} }, + }); + } else { delete evt.result.skill; delete evt.result.used; - evt.result.card=get.autoViewAs({ - name:name, - cards:[result.links[0]], - storage:{shouli:true}, - },result.links); - evt.result.cards=[result.links[0]]; - target.$give(result.links[0],player,false); - if(player!=target) target.addTempSkill('fengyin'); - target.addTempSkill('shouli_thunder'); - player.addTempSkill('shouli_thunder'); + evt.result.card = get.autoViewAs( + { + name: name, + cards: [result.links[0]], + storage: { shouli: true }, + }, + result.links + ); + evt.result.cards = [result.links[0]]; + target.$give(result.links[0], player, false); + if (player != target) target.addTempSkill("fengyin"); + target.addTempSkill("shouli_thunder"); + player.addTempSkill("shouli_thunder"); evt.redo(); return; } } evt.goto(0); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player,tag){ - var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount']; - return game.hasPlayer(function(current){ - return current.hasCard(card=>func(card,false),'e'); + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + var func = get.is[tag == "respondSha" ? "attackingMount" : "defendingMount"]; + return game.hasPlayer(function (current) { + return current.hasCard((card) => func(card, false), "e"); }); }, - order:2, - result:{ - player(player,target){ - var att=Math.max(8,get.attitude(player,target)); - if(_status.event.type!='phase') return 9-att; - if(!player.hasValueTarget({name:'sha'})) return 0; - return 9-att; + order: 2, + result: { + player(player, target) { + var att = Math.max(8, get.attitude(player, target)); + if (_status.event.type != "phase") return 9 - att; + if (!player.hasValueTarget({ name: "sha" })) return 0; + return 9 - att; }, }, }, - group:'shouli_init', - subSkill:{ - thunder:{ - charlotte:true, - trigger:{player:'damageBegin1'}, - forced:true, - mark:true, - content(){ + group: "shouli_init", + subSkill: { + thunder: { + charlotte: true, + trigger: { player: "damageBegin1" }, + forced: true, + mark: true, + content() { trigger.num++; - game.setNature(trigger,'thunder'); + game.setNature(trigger, "thunder"); }, - marktext:'⚡', - intro:{ - content:'受到的伤害+1且改为雷属性', + marktext: "⚡", + intro: { + content: "受到的伤害+1且改为雷属性", }, - ai:{ - effect:{ - target:(card,player,target)=>{ - if(!get.tag(card,'damage')) return; - if(target.hasSkillTag('nodamage')||target.hasSkillTag('nothunder')) return 'zeroplayertarget'; - if(target.hasSkillTag('filterDamage',null,{ - player:player, - card:new lib.element.VCard({ - name:card.name, - nature:'thunder' - },[card]) - })) return; + ai: { + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage")) return; + if (target.hasSkillTag("nodamage") || target.hasSkillTag("nothunder")) + return "zeroplayertarget"; + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: new lib.element.VCard( + { + name: card.name, + nature: "thunder", + }, + [card] + ), + }) + ) + return; return 2; - } - } - } + }, + }, + }, }, - init:{ - audio:'shouli', - trigger:{ - global:'phaseBefore', - player:'enterGame', + init: { + audio: "shouli", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + locked: false, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - logTarget:()=>game.filterPlayer(), - content(){ - 'step 0' - var targets=game.filterPlayer().sortBySeat(player.getNext()); - event.targets=targets; - event.num=0; - 'step 1' - var target=event.targets[num]; - if(target.isIn()){ - var card=get.cardPile2(function(card){ - if(get.cardtag(card,'gifts')) return false; - var type=get.subtype(card); - if(type!='equip3'&&type!='equip4'&&type!='equip6') return false; - return target.canUse(card,target); + logTarget: () => game.filterPlayer(), + content() { + "step 0"; + var targets = game.filterPlayer().sortBySeat(player.getNext()); + event.targets = targets; + event.num = 0; + ("step 1"); + var target = event.targets[num]; + if (target.isIn()) { + var card = get.cardPile2(function (card) { + if (get.cardtag(card, "gifts")) return false; + var type = get.subtype(card); + if (type != "equip3" && type != "equip4" && type != "equip6") + return false; + return target.canUse(card, target); }); - if(card) target.chooseUseTarget(card,'nopopup','noanimate',true); + if (card) target.chooseUseTarget(card, "nopopup", "noanimate", true); } event.num++; - if(event.num{ - if(typeof card!=='object') return; - let suit=get.suit(card); - if(!lib.suit.includes(suit)||player.hasCard(function(i){ - return get.suit(i,player)==suit; - },'h')) return; - return [1,0.8*game.countPlayer(current=>{ - return current.countCards('e',card=>{ - return get.suit(card,current)==suit; - }); - })]; + ai: { + effect: { + player: (card, player, target) => { + if (typeof card !== "object") return; + let suit = get.suit(card); + if ( + !lib.suit.includes(suit) || + player.hasCard(function (i) { + return get.suit(i, player) == suit; + }, "h") + ) + return; + return [ + 1, + 0.8 * + game.countPlayer((current) => { + return current.countCards("e", (card) => { + return get.suit(card, current) == suit; + }); + }), + ]; }, - target:(card,player,target)=>{ - if(card.name==='sha'&&!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card - },true)&&game.hasPlayer(current=>{ - return current.hasCard(cardx=>{ - return get.subtype(cardx)==='equip3'; - },'e'); - })) return [0, -0.5]; - } - } - } - }, - changandajian_equip5:{ - equipSkill:true, - mod:{maxHandcard:(player,num)=>num+2}, - }, - changandajian_destroy:{ - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + target: (card, player, target) => { + if ( + card.name === "sha" && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) && + game.hasPlayer((current) => { + return current.hasCard((cardx) => { + return get.subtype(cardx) === "equip3"; + }, "e"); + }) + ) + return [0, -0.5]; + }, + }, }, - forced:true, - charlotte:true, - equipSkill:true, - filter(event,player){ - var evt=event.getl(player); - if(!evt||!evt.es||!evt.es.length) return false; - for(var i of evt.es){ - if(i.name.indexOf('changandajian_equip')==0) return true; + }, + changandajian_equip5: { + equipSkill: true, + mod: { maxHandcard: (player, num) => num + 2 }, + }, + changandajian_destroy: { + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + forced: true, + charlotte: true, + equipSkill: true, + filter(event, player) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.length) return false; + for (var i of evt.es) { + if (i.name.indexOf("changandajian_equip") == 0) return true; } return false; }, - getEffect(player,target){ - if(player==target) return 0; - var getRaw=function(){ - var att=get.attitude(player,target); - if(att>0){ - if(target.countCards('j',function(card){ - var cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(target,cardj,target,player)<0; - })>0) return 3; - if(target.getEquip('baiyin')&&target.isDamaged()&& - get.recoverEffect(target,player,player)>0){ - if(target.hp==1&&!target.hujia) return 1.6; + getEffect(player, target) { + if (player == target) return 0; + var getRaw = function () { + var att = get.attitude(player, target); + if (att > 0) { + if ( + target.countCards("j", function (card) { + var cardj = card.viewAs ? { name: card.viewAs } : card; + return get.effect(target, cardj, target, player) < 0; + }) > 0 + ) + return 3; + if ( + target.getEquip("baiyin") && + target.isDamaged() && + get.recoverEffect(target, player, player) > 0 + ) { + if (target.hp == 1 && !target.hujia) return 1.6; } - if(target.countCards('e',function(card){ - if(get.position(card)=='e') return get.value(card,target)<0; - })>0) return 1; + if ( + target.countCards("e", function (card) { + if (get.position(card) == "e") return get.value(card, target) < 0; + }) > 0 + ) + return 1; } - var es=target.getCards('e'); - var noe=(es.length==0||target.hasSkillTag('noe')); - var noe2=(es.filter(function(esx){ - return get.value(esx,target)>0; - }).length==0); - if(noe||noe2) return 0; - if(att<=0&&!target.countCards('e')) return 1.5; + var es = target.getCards("e"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = + es.filter(function (esx) { + return get.value(esx, target) > 0; + }).length == 0; + if (noe || noe2) return 0; + if (att <= 0 && !target.countCards("e")) return 1.5; return -1.5; - } - return getRaw()*get.attitude(player,target); + }; + return getRaw() * get.attitude(player, target); }, - content(){ - 'step 0' - var num=0,recover=0; - var evt=trigger.getl(player); - for(var i of evt.es){ - if(i.name.indexOf('changandajian_equip')==0) num++; - if(i.name=='changandajian_equip2') recover++; + content() { + "step 0"; + var num = 0, + recover = 0; + var evt = trigger.getl(player); + for (var i of evt.es) { + if (i.name.indexOf("changandajian_equip") == 0) num++; + if (i.name == "changandajian_equip2") recover++; } - if(recover>0) player.recover(recover); - event.count=num; - if(!game.hasPlayer(function(current){ - return current.countCards('ej')>0; - })) event.finish(); - 'step 1' + if (recover > 0) player.recover(recover); + event.count = num; + if ( + !game.hasPlayer(function (current) { + return current.countCards("ej") > 0; + }) + ) + event.finish(); + ("step 1"); event.count--; - player.chooseTarget(true,'选择一名装备区或判定区有牌的角色',function(card,player,target){ - return target.countCards('ej')>0; - }).set('ai',function(target){ - return lib.skill.changandajian_destroy.getEffect(_status.event.player,target); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - player.choosePlayerCard(target,true,'ej'); - } - else event.finish(); - 'step 3' - if(result.bool){ - var card=result.cards[0]; - var num=get.number(card); - if([1,11,12,13].includes(num)){ - if(lib.filter.canBeGained(card,player,target)) player.gain(card,target,'give','bySelf'); - } - else if(lib.filter.canBeDiscarded(card,player,target)) target.discard(card); - } - else event.finish(); - 'step 4' - if(event.count>0&&game.hasPlayer(function(current){ - return current.countCards('ej')>0; - })) event.goto(1); + player + .chooseTarget( + true, + "选择一名装备区或判定区有牌的角色", + function (card, player, target) { + return target.countCards("ej") > 0; + } + ) + .set("ai", function (target) { + return lib.skill.changandajian_destroy.getEffect(_status.event.player, target); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + player.choosePlayerCard(target, true, "ej"); + } else event.finish(); + ("step 3"); + if (result.bool) { + var card = result.cards[0]; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) { + if (lib.filter.canBeGained(card, player, target)) + player.gain(card, target, "give", "bySelf"); + } else if (lib.filter.canBeDiscarded(card, player, target)) target.discard(card); + } else event.finish(); + ("step 4"); + if ( + event.count > 0 && + game.hasPlayer(function (current) { + return current.countCards("ej") > 0; + }) + ) + event.goto(1); }, }, - dili:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + dili: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - if(player.storage.dili) return false; - if(event.name!='phase') return true; - if(game.phaseNumber==0) return true; + forced: true, + filter(event, player) { + if (player.storage.dili) return false; + if (event.name != "phase") return true; + if (game.phaseNumber == 0) return true; //让神山识能够获得东吴命运线 - return player.name=='key_shiki'; + return player.name == "key_shiki"; }, - content(){ - player.storage.dili=true; - var skill=['dili_shengzhi','dili_chigang','dili_qionglan','dili_quandao','dili_jiaohui','dili_yuanlv'].randomGet(); + content() { + player.storage.dili = true; + var skill = [ + "dili_shengzhi", + "dili_chigang", + "dili_qionglan", + "dili_quandao", + "dili_jiaohui", + "dili_yuanlv", + ].randomGet(); player.addSkill(skill); - game.log(player,'解锁了东吴命运线:','#g【'+get.translation(skill)+'】'); + game.log( + player, + '解锁了东吴命运线:', + "#g【" + get.translation(skill) + "】" + ); }, - derivation:['dili_shengzhi','dili_chigang','dili_qionglan','dili_quandao','dili_jiaohui','dili_yuanlv','gzyinghun','hongde','rebingyi','xinfu_guanwei','bizheng','xinanguo','shelie','wengua','rebotu','rezhiheng','jiexun','reanxu','xiashu','rejieyin','oldimeng','xinfu_guanchao','drlt_jueyan','lanjiang'], - subSkill:{ - shengzhi:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - var num=get.number(event.card); - if(typeof num!='number') return false; - if(num<=1) return false; - for(var i=2;i<=Math.sqrt(num);i++){ - if(num%i==0) return false; + derivation: [ + "dili_shengzhi", + "dili_chigang", + "dili_qionglan", + "dili_quandao", + "dili_jiaohui", + "dili_yuanlv", + "gzyinghun", + "hongde", + "rebingyi", + "xinfu_guanwei", + "bizheng", + "xinanguo", + "shelie", + "wengua", + "rebotu", + "rezhiheng", + "jiexun", + "reanxu", + "xiashu", + "rejieyin", + "oldimeng", + "xinfu_guanchao", + "drlt_jueyan", + "lanjiang", + ], + subSkill: { + shengzhi: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + var num = get.number(event.card); + if (typeof num != "number") return false; + if (num <= 1) return false; + for (var i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) return false; } - if(!player.storage.yuheng) return false; - var list=['gzyinghun','hongde','rebingyi']; - for(var i of list){ - if(!player.storage.yuheng.includes(i)) return false; + if (!player.storage.yuheng) return false; + var list = ["gzyinghun", "hongde", "rebingyi"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; } return true; }, - content(){ - trigger.directHit.addArray(game.filterPlayer(function(current){ - return current!=player; - })); + content() { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); }, - init(player,skill){ - player.markAuto('yuheng_current',['gzyinghun','hongde','rebingyi']); + init(player, skill) { + player.markAuto("yuheng_current", ["gzyinghun", "hongde", "rebingyi"]); }, - mark:true, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(arg&&arg.card){ - var num=get.number(arg.card); - if(typeof num!='number') return false; - if(num<=1) return false; - for(var i=2;i<=Math.sqrt(num);i++){ - if(num%i==0) return false; + mark: true, + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (arg && arg.card) { + var num = get.number(arg.card); + if (typeof num != "number") return false; + if (num <= 1) return false; + for (var i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) return false; } return true; } return false; }, }, - intro:{ - name:'命运线:圣质', - content(storage,player){ - var finished=[],unfinished=['gzyinghun','hongde','rebingyi']; - if(player.storage.yuheng){ - for(var i=0;i未获得:'+get.translation(unfinished)+'
    '); - if(finished.length) str+=('
  • 已获得过:'+get.translation(finished)+'
    '); - str+='
  • 锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。'; + var str = ""; + if (unfinished.length) + str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) + str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += + "
  • 锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。"; return str; }, }, }, - chigang:{ - audio:2, - trigger:{player:'phaseJudgeBefore'}, - forced:true, - filter(event,player){ - if(!player.storage.yuheng) return false; - var list=['xinfu_guanwei','bizheng','xinanguo']; - for(var i of list){ - if(!player.storage.yuheng.includes(i)) return false; + chigang: { + audio: 2, + trigger: { player: "phaseJudgeBefore" }, + forced: true, + filter(event, player) { + if (!player.storage.yuheng) return false; + var list = ["xinfu_guanwei", "bizheng", "xinanguo"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; } return true; }, - content(){ + content() { trigger.cancel(); - var next=player.phaseDraw(); + var next = player.phaseDraw(); event.next.remove(next); trigger.getParent().next.push(next); }, - init(player,skill){ - player.markAuto('yuheng_current',['xinfu_guanwei','bizheng','xinanguo']); + init(player, skill) { + player.markAuto("yuheng_current", ["xinfu_guanwei", "bizheng", "xinanguo"]); }, - ai:{ - effect:{ - target(card){ - if(get.type(card)=='delay') return 'zerotarget'; + ai: { + effect: { + target(card) { + if (get.type(card) == "delay") return "zerotarget"; }, }, }, - mark:true, - intro:{ - name:'命运线:持纲', - content(storage,player){ - var finished=[],unfinished=['xinfu_guanwei','bizheng','xinanguo']; - if(player.storage.yuheng){ - for(var i=0;i未获得:'+get.translation(unfinished)+'
    '); - if(finished.length) str+=('
  • 已获得过:'+get.translation(finished)+'
    '); - str+='
  • 锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。'; + var str = ""; + if (unfinished.length) + str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) + str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += + "
  • 锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。"; return str; }, }, }, - qionglan:{ - audio:2, - init(player,skill){ - player.markAuto('yuheng_current',['shelie','wengua','rebotu']); + qionglan: { + audio: 2, + init(player, skill) { + player.markAuto("yuheng_current", ["shelie", "wengua", "rebotu"]); }, - trigger:{player:'useSkillAfter'}, - forced:true, - limited:true, - filter(event,player){ - if(!player.storage.yuheng||event.skill!='yuheng') return false; - var list=['shelie','wengua','rebotu']; - for(var i of list){ - if(!player.storage.yuheng.includes(i)) return false; + trigger: { player: "useSkillAfter" }, + forced: true, + limited: true, + filter(event, player) { + if (!player.storage.yuheng || event.skill != "yuheng") return false; + var list = ["shelie", "wengua", "rebotu"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; } return true; }, - content(){ - player.awakenSkill('dili_qionglan'); - var list=['dili_shengzhi','dili_chigang','dili_quandao','dili_jiaohui','dili_yuanlv']; - var list2=list.randomRemove(2); - if(list2.includes('dili_quandao')&&list2.includes('dili_jiaohui')){ + content() { + player.awakenSkill("dili_qionglan"); + var list = [ + "dili_shengzhi", + "dili_chigang", + "dili_quandao", + "dili_jiaohui", + "dili_yuanlv", + ]; + var list2 = list.randomRemove(2); + if (list2.includes("dili_quandao") && list2.includes("dili_jiaohui")) { list2.randomRemove(1); list2.push(list.randomGet()); } - for(var skill of list2){ + for (var skill of list2) { player.addSkill(skill); - game.log(player,'解锁了东吴命运线:','#g【'+get.translation(skill)+'】'); + game.log( + player, + '解锁了东吴命运线:', + "#g【" + get.translation(skill) + "】" + ); } }, - mark:true, - intro:{ - name:'命运线:穹览', - content(storage,player){ - var finished=[],unfinished=['shelie','wengua','rebotu']; - if(player.storage.yuheng){ - for(var i=0;i未获得:'+get.translation(unfinished)+'
    '); - if(finished.length) str+=('
  • 已获得过:'+get.translation(finished)+'
    '); - str+='
  • 锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。'; + var str = ""; + if (unfinished.length) + str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) + str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += + '
  • 锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。'; return str; }, }, }, - quandao:{ - audio:2, - mod:{ - cardname(card,player){ - if(player.storage.yuheng&&[1,11,12,13].includes(card.number)){ - var list=['rezhiheng','jiexun','reanxu']; - for(var i of list){ - if(!player.storage.yuheng.includes(i)) return; + quandao: { + audio: 2, + mod: { + cardname(card, player) { + if (player.storage.yuheng && [1, 11, 12, 13].includes(card.number)) { + var list = ["rezhiheng", "jiexun", "reanxu"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return; } - return 'tiaojiyanmei'; + return "tiaojiyanmei"; } }, }, - init(player,skill){ - player.markAuto('yuheng_current',['rezhiheng','jiexun','reanxu']); + init(player, skill) { + player.markAuto("yuheng_current", ["rezhiheng", "jiexun", "reanxu"]); }, - mark:true, - intro:{ - name:'命运线:权道', - content(storage,player){ - var finished=[],unfinished=['rezhiheng','jiexun','reanxu']; - if(player.storage.yuheng){ - for(var i=0;i未获得:'+get.translation(unfinished)+'
    '); - if(finished.length) str+=('
  • 已获得过:'+get.translation(finished)+'
    '); - str+='
  • 锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。'; + var str = ""; + if (unfinished.length) + str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) + str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += + "
  • 锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。"; return str; }, }, }, - jiaohui:{ - audio:2, - mod:{ - cardname(card,player){ - if(player.countCards('h')==1&&player.storage.yuheng){ - var list=['xiashu','rejieyin','oldimeng']; - for(var i of list){ - if(!player.storage.yuheng.includes(i)) return; + jiaohui: { + audio: 2, + mod: { + cardname(card, player) { + if (player.countCards("h") == 1 && player.storage.yuheng) { + var list = ["xiashu", "rejieyin", "oldimeng"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return; } - return 'yuanjiao'; + return "yuanjiao"; } }, }, - init(player,skill){ - player.markAuto('yuheng_current',['xiashu','rejieyin','oldimeng']); + init(player, skill) { + player.markAuto("yuheng_current", ["xiashu", "rejieyin", "oldimeng"]); }, - mark:true, - intro:{ - name:'命运线:交辉', - content(storage,player){ - var finished=[],unfinished=['xiashu','rejieyin','oldimeng']; - if(player.storage.yuheng){ - for(var i=0;i未获得:'+get.translation(unfinished)+'
    '); - if(finished.length) str+=('
  • 已获得过:'+get.translation(finished)+'
    '); - str+='
  • 锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。'; + var str = ""; + if (unfinished.length) + str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) + str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += + "
  • 锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。"; return str; }, }, }, - yuanlv:{ - audio:2, - init(player,skill){ - player.markAuto('yuheng_current',['xinfu_guanchao','drlt_jueyan','lanjiang']); + yuanlv: { + audio: 2, + init(player, skill) { + player.markAuto("yuheng_current", ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]); }, - trigger:{player:'useCardToTargeted'}, - forced:true, - filter(event,player){ - if(get.type(event.card,false)!='equip'||player!=event.target||event.card.name.indexOf('changandajian_equip')==0) return false; - if(!player.storage.yuheng) return false; - var list=['xinfu_guanchao','drlt_jueyan','lanjiang']; - for(var i of list){ - if(!player.storage.yuheng.includes(i)) return false; + trigger: { player: "useCardToTargeted" }, + forced: true, + filter(event, player) { + if ( + get.type(event.card, false) != "equip" || + player != event.target || + event.card.name.indexOf("changandajian_equip") == 0 + ) + return false; + if (!player.storage.yuheng) return false; + var list = ["xinfu_guanchao", "drlt_jueyan", "lanjiang"]; + for (var i of list) { + if (!player.storage.yuheng.includes(i)) return false; } - var type=get.subtype(event.card); - if(lib.card['changandajian_'+type]&&player.hasEquipableSlot(type)) return true; + var type = get.subtype(event.card); + if (lib.card["changandajian_" + type] && player.hasEquipableSlot(type)) + return true; return false; }, - content(){ - var cards=trigger.cards.filterInD(); - if(cards.length>0) game.cardsDiscard(cards); - var type=get.subtype(trigger.card); - var card=game.createCard('changandajian_'+type,Math.random()<0.5?'spade':'heart',10); - player.useCard(card,player); + content() { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) game.cardsDiscard(cards); + var type = get.subtype(trigger.card); + var card = game.createCard( + "changandajian_" + type, + Math.random() < 0.5 ? "spade" : "heart", + 10 + ); + player.useCard(card, player); }, - mark:true, - intro:{ - name:'命运线:渊虑', - content(storage,player){ - var finished=[],unfinished=['xinfu_guanchao','drlt_jueyan','lanjiang']; - if(player.storage.yuheng){ - for(var i=0;i未获得:'+get.translation(unfinished)+'
    '); - if(finished.length) str+=('
  • 已获得过:'+get.translation(finished)+'
    '); - str+='
  • 锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。'; + var str = ""; + if (unfinished.length) + str += "
  • 未获得:" + get.translation(unfinished) + "
    "; + if (finished.length) + str += "
  • 已获得过:" + get.translation(finished) + "
    "; + str += + "
  • 锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。"; return str; }, }, }, }, }, - yuheng:{ - audio:2, - enable:'phaseUse', - usable:1, - content(){ - var skills=player.getSkills(null,false,false).filter(function(i){ - if(i=='yuheng') return false; - var info=get.info(i); - return info&&!info.charlotte&&!get.is.locked(i); + yuheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + content() { + var skills = player.getSkills(null, false, false).filter(function (i) { + if (i == "yuheng") return false; + var info = get.info(i); + return info && !info.charlotte && !get.is.locked(i); }); - if(skills.length){ + if (skills.length) { player.removeSkills(skills); } //初始化技能库 - var list1=['dili_shengzhi','dili_chigang','dili_qionglan','dili_quandao','dili_jiaohui','dili_yuanlv']; - var list2=['gzyinghun','hongde','rebingyi','xinfu_guanwei','bizheng','xinanguo','shelie','wengua','rebotu','rezhiheng','jiexun','reanxu','xiashu','rejieyin','oldimeng','xinfu_guanchao','drlt_jueyan','lanjiang']; - var list3=[]; - if(!player.storage.yuheng_full) player.storage.yuheng_full=list2.slice(0); - if(player.getStorage('yuheng_current').length==0){ - for(var i=0;i0&&!player.hasHistory('useSkill',function(evt){ - if(evt.skill=='yuheng'||evt.type!='player'||!evt.sourceSkill) return false; - var info1=get.info(evt.skill); - if(info1.charlotte) return false; - var info=get.info(evt.sourceSkill); - if(info.charlotte||get.is.locked(evt.skill)) return false; - return evt.event.getParent('phaseUse')==evtx; - })){ + var evtx = event.getParent("phaseUse"); + if ( + currentskills.length > 0 && + !player.hasHistory("useSkill", function (evt) { + if (evt.skill == "yuheng" || evt.type != "player" || !evt.sourceSkill) + return false; + var info1 = get.info(evt.skill); + if (info1.charlotte) return false; + var info = get.info(evt.sourceSkill); + if (info.charlotte || get.is.locked(evt.skill)) return false; + return evt.event.getParent("phaseUse") == evtx; + }) + ) { fullskills.randomSort(); currentskills.randomSort(); - for(var i=0;i0) break; + if (skills.length > 0) break; } } //在已经发动过其他非锁定技时抽选技能 - else{ + else { skills.add(fullskills.randomRemove(1)[0]); } - for(var i of skills){ + for (var i of skills) { player.addSkills(i); } - player.markAuto('yuheng',skills); + player.markAuto("yuheng", skills); }, - ai:{ - order(item,player){ - var evtx=_status.event.getParent('phaseUse'); - if(!player.hasHistory('useSkill',function(evt){ - if(evt.skill=='yuheng'||evt.type!='player'||!evt.sourceSkill) return false; - var info1=get.info(evt.skill); - if(info1.charlotte) return false; - var info=get.info(evt.sourceSkill); - if(info.charlotte||get.is.locked(evt.skill)) return false; - return evt.event.getParent('phaseUse')==evtx; - })) return 11; + ai: { + order(item, player) { + var evtx = _status.event.getParent("phaseUse"); + if ( + !player.hasHistory("useSkill", function (evt) { + if (evt.skill == "yuheng" || evt.type != "player" || !evt.sourceSkill) + return false; + var info1 = get.info(evt.skill); + if (info1.charlotte) return false; + var info = get.info(evt.sourceSkill); + if (info.charlotte || get.is.locked(evt.skill)) return false; + return evt.event.getParent("phaseUse") == evtx; + }) + ) + return 11; return 0.8; }, - result:{player:1}, + result: { player: 1 }, }, - group:'yuheng_losehp', - subSkill:{ - losehp:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - locked:false, - filter(event,player){ - return !player.hasHistory('useSkill',function(evt){ - if(evt.skill!='yuheng') return false; - return evt.event.getParent('phaseUse')==event; + group: "yuheng_losehp", + subSkill: { + losehp: { + trigger: { player: "phaseUseEnd" }, + forced: true, + locked: false, + filter(event, player) { + return !player.hasHistory("useSkill", function (evt) { + if (evt.skill != "yuheng") return false; + return evt.event.getParent("phaseUse") == event; }); }, - content(){ + content() { player.loseHp(); }, }, }, }, - jiufa:{ - audio:2, - trigger:{player:['useCardAfter','respondAfter']}, - frequent:true, - filter(event,player){ - return event.jiufa_counted&&player.getStorage('jiufa').length>=9; + jiufa: { + audio: 2, + trigger: { player: ["useCardAfter", "respondAfter"] }, + frequent: true, + filter(event, player) { + return event.jiufa_counted && player.getStorage("jiufa").length >= 9; }, - content(){ - 'step 0' - player.unmarkSkill('jiufa'); - event.cards=get.cards(9); - event.cards.sort(function(a,b){ - return get.number(b)-get.number(a); - }) + content() { + "step 0"; + player.unmarkSkill("jiufa"); + event.cards = get.cards(9); + event.cards.sort(function (a, b) { + return get.number(b) - get.number(a); + }); game.cardsGotoOrdering(event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - var str; - if(player==game.me&&!_status.auto){ - str='九伐:选择任意张点数满足条件的牌'; + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) { + str = "九伐:选择任意张点数满足条件的牌"; + } else { + str = "九伐"; + } + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + event.time = get.utc(); + game.addVideo("showCards", player, ["九伐", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + ("step 1"); + var next = player.chooseButton([0, 9], true); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + var num = get.number(button.link), + cards = _status.event.getParent().cards; + for (var i of ui.selected.buttons) { + if (get.number(i.link) == num) return false; } - else{ - str='九伐'; - } - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - event.time=get.utc(); - game.addVideo('showCards',player,['九伐',get.cardsInfo(event.cards)]); - game.addVideo('delay',null,2); - "step 1" - var next=player.chooseButton([0,9],true); - next.set('dialog',event.videoId); - next.set('filterButton',function(button){ - var num=get.number(button.link),cards=_status.event.getParent().cards; - for(var i of ui.selected.buttons){ - if(get.number(i.link)==num) return false; - } - for(var i of cards){ - if(i!=button.link&&get.number(i)==num) return true; + for (var i of cards) { + if (i != button.link && get.number(i) == num) return true; } return false; }); - next.set('ai',function(button){ - return get.value(button.link,_status.event.player) + next.set("ai", function (button) { + return get.value(button.link, _status.event.player); }); - "step 2" - if(result.bool&&result.links&&result.links.length){ - event.cards2=result.links; + ("step 2"); + if (result.bool && result.links && result.links.length) { + event.cards2 = result.links; } - var time=1000-(get.utc()-event.time); - if(time>0){ - game.delay(0,time); + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); } - "step 3" - game.broadcastAll('closeDialog',event.videoId); - var cards2=event.cards2; - if(cards2&&cards2.length) player.gain(cards2,'log','gain2'); + ("step 3"); + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + if (cards2 && cards2.length) player.gain(cards2, "log", "gain2"); }, - marktext:'⑨', - intro:{ - content:'已记录牌名:$', - onunmark:true, + marktext: "⑨", + intro: { + content: "已记录牌名:$", + onunmark: true, }, - group:'jiufa_count', - subSkill:{ - count:{ - trigger:{player:['useCard1','respond']}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - filter(event,player){ - return !player.getStorage('jiufa').includes(event.card.name); + group: "jiufa_count", + subSkill: { + count: { + trigger: { player: ["useCard1", "respond"] }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter(event, player) { + return !player.getStorage("jiufa").includes(event.card.name); }, - content(){ - trigger.jiufa_counted=true; - player.markAuto('jiufa',[trigger.card.name]); + content() { + trigger.jiufa_counted = true; + player.markAuto("jiufa", [trigger.card.name]); }, }, }, }, - tianren:{ - audio:2, - trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter']}, - forced:true, - filter(event,player){ - if(event.name.indexOf('lose')==0){ - if(event.getlx===false||event.position!=ui.discardPile) return false; + tianren: { + audio: 2, + trigger: { global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter"] }, + forced: true, + filter(event, player) { + if (event.name.indexOf("lose") == 0) { + if (event.getlx === false || event.position != ui.discardPile) return false; + } else { + var evt = event.getParent(); + if (evt.relatedEvent && evt.relatedEvent.name == "useCard") return false; } - else{ - var evt=event.getParent(); - if(evt.relatedEvent&&evt.relatedEvent.name=='useCard') return false; - } - for(var i of event.cards){ - var owner=false; - if(event.hs&&event.hs.includes(i)) owner=event.player; - var type=get.type(i,null,owner); - if(type=='basic'||type=='trick') return true; + for (var i of event.cards) { + var owner = false; + if (event.hs && event.hs.includes(i)) owner = event.player; + var type = get.type(i, null, owner); + if (type == "basic" || type == "trick") return true; } return false; }, - content(){ - var num=0; - for(var i of trigger.cards){ - var owner=false; - if(trigger.hs&&trigger.hs.includes(i)) owner=trigger.player; - var type=get.type(i,null,owner); - if(type=='basic'||type=='trick') num++; + content() { + var num = 0; + for (var i of trigger.cards) { + var owner = false; + if (trigger.hs && trigger.hs.includes(i)) owner = trigger.player; + var type = get.type(i, null, owner); + if (type == "basic" || type == "trick") num++; } - player.addMark('tianren',num); + player.addMark("tianren", num); }, - group:'tianren_maxHp', - intro:{content:'mark'}, - subSkill:{ - maxHp:{ - trigger:{player:['tianrenAfter','gainMaxHpAfter','loseMaxHpAfter']}, - forced:true, - filter(event,player){ - return player.countMark('tianren')>=player.maxHp; + group: "tianren_maxHp", + intro: { content: "mark" }, + subSkill: { + maxHp: { + trigger: { player: ["tianrenAfter", "gainMaxHpAfter", "loseMaxHpAfter"] }, + forced: true, + filter(event, player) { + return player.countMark("tianren") >= player.maxHp; }, - content(){ - player.removeMark('tianren',player.maxHp); + content() { + player.removeMark("tianren", player.maxHp); player.gainMaxHp(); player.draw(2); }, }, }, }, - pingxiang:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'ice', - filter(event,player){ - return player.maxHp>9; + pingxiang: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "ice", + filter(event, player) { + return player.maxHp > 9; }, - content(){ - 'step 0' - player.awakenSkill('pingxiang'); + content() { + "step 0"; + player.awakenSkill("pingxiang"); player.loseMaxHp(9); - event.num=0; - 'step 1' + event.num = 0; + ("step 1"); event.num++; - player.chooseUseTarget({ - name:'sha', - nature:'fire', - isCard:true, - },'请选择火【杀】的目标('+(event.num==9?'⑨':event.num)+'/9)',false); - 'step 2' - if(result.bool&&event.num<9) event.goto(1); - else player.removeSkills('jiufa'); - 'step 3' - player.addSkill('pingxiang_effect'); + player.chooseUseTarget( + { + name: "sha", + nature: "fire", + isCard: true, + }, + "请选择火【杀】的目标(" + (event.num == 9 ? "⑨" : event.num) + "/9)", + false + ); + ("step 2"); + if (result.bool && event.num < 9) event.goto(1); + else player.removeSkills("jiufa"); + ("step 3"); + player.addSkill("pingxiang_effect"); }, - ai:{ - order(){ + ai: { + order() { return get.order({ - name:'sha', - nature:'fire', - isCard:true, + name: "sha", + nature: "fire", + isCard: true, }); }, - result:{ - player(player){ - if(player.hasValueTarget({ - name:'sha', - nature:'fire', - isCard:true, - })) return 1; + result: { + player(player) { + if ( + player.hasValueTarget({ + name: "sha", + nature: "fire", + isCard: true, + }) + ) + return 1; return 0; }, }, }, - subSkill:{ - effect:{ - marktext:'襄', - intro:{content:'手牌上限基数改为体力上限'}, - mod:{ - maxHandcardBase(player){ + subSkill: { + effect: { + marktext: "襄", + intro: { content: "手牌上限基数改为体力上限" }, + mod: { + maxHandcardBase(player) { return player.maxHp; }, }, }, }, }, - hina_shenshi:{ - groupSkill:true, - trigger:{player:['phaseUseBegin','phaseUseEnd']}, - frequent:true, - filter(event,player){ - return player.group=='shen'; + hina_shenshi: { + groupSkill: true, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + frequent: true, + filter(event, player) { + return player.group == "shen"; }, - content(){ - 'step 0' - player.draw(2).gaintag=['hina_shenshi']; - player.addSkill('hina_shenshi_yingbian'); - 'step 1' - var cards=player.getCards('h',function(card){ - return card.hasGaintag('hina_shenshi'); + content() { + "step 0"; + player.draw(2).gaintag = ["hina_shenshi"]; + player.addSkill("hina_shenshi_yingbian"); + ("step 1"); + var cards = player.getCards("h", function (card) { + return card.hasGaintag("hina_shenshi"); }); - if(!cards.length) event.finish(); - else if(cards.length==1) event._result={bool:true,cards:cards}; - else player.chooseCard('h',true,'将一张“神视”牌置于牌堆顶',function(card){ - return card.hasGaintag('hina_shenshi'); - }); - 'step 2' - if(result.bool){ - game.log(player,'将一张牌置于了牌堆顶'); - player.lose(result.cards,ui.cardPile,'insert'); - player.$throw(1,1000); - } - else event.finish(); - 'step 3' + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, cards: cards }; + else + player.chooseCard("h", true, "将一张“神视”牌置于牌堆顶", function (card) { + return card.hasGaintag("hina_shenshi"); + }); + ("step 2"); + if (result.bool) { + game.log(player, "将一张牌置于了牌堆顶"); + player.lose(result.cards, ui.cardPile, "insert"); + player.$throw(1, 1000); + } else event.finish(); + ("step 3"); game.delayx(); }, - onremove(player){ - player.removeGaintag('hina_shenshi'); + onremove(player) { + player.removeGaintag("hina_shenshi"); }, - group:'hina_shenshi_yingbian', + group: "hina_shenshi_yingbian", }, - hina_shenshi_yingbian:{ - trigger:{player:'yingbian'}, - forced:true, - filter:(event,player)=>event.card.isCard&&player.hasHistory('lose',evt=>evt.getParent()==event&&Object.values(evt.gaintag_map).some(value=>value.includes('hina_shenshi'))), - content:()=>{ - if(!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian=[]; - trigger.temporaryYingbian.add('force'); + hina_shenshi_yingbian: { + trigger: { player: "yingbian" }, + forced: true, + filter: (event, player) => + event.card.isCard && + player.hasHistory( + "lose", + (evt) => + evt.getParent() == event && + Object.values(evt.gaintag_map).some((value) => value.includes("hina_shenshi")) + ), + content: () => { + if (!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian = []; + trigger.temporaryYingbian.add("force"); trigger.temporaryYingbian.addArray(get.yingbianEffects()); - } + }, }, - hina_xingzhi:{ - groupSkill:true, - trigger:{player:'yingbian'}, - usable:1, - filter:(event,player)=>player.group=='key'&&!event.card.yingbian&&lib.yingbian.condition.complex.has('zhuzhan'), - content:()=>{ - 'step 0' - trigger.yingbianZhuzhanAI=(player,card,source,targets)=>cardx=>{ - if(get.attitude(player,source)<=0) return 0; - var info=get.info(card),num=0; - if(info&&info.ai&&info.ai.yingbian){ - var ai=info.ai.yingbian(card,source,targets,player); - if(ai) num=ai; + hina_xingzhi: { + groupSkill: true, + trigger: { player: "yingbian" }, + usable: 1, + filter: (event, player) => + player.group == "key" && + !event.card.yingbian && + lib.yingbian.condition.complex.has("zhuzhan"), + content: () => { + "step 0"; + trigger.yingbianZhuzhanAI = (player, card, source, targets) => (cardx) => { + if (get.attitude(player, source) <= 0) return 0; + var info = get.info(card), + num = 0; + if (info && info.ai && info.ai.yingbian) { + var ai = info.ai.yingbian(card, source, targets, player); + if (ai) num = ai; } - return Math.max(num,6)-get.value(cardx); + return Math.max(num, 6) - get.value(cardx); }; - trigger.afterYingbianZhuzhan=event=>event.zhuzhanresult.draw(2); - lib.yingbian.condition.complex.get('zhuzhan')(trigger); - 'step 1' - if(!result.bool) return; - trigger.card.yingbian=true; - lib.yingbian.effect.forEach(value=>game.yingbianEffect(trigger,value)); - player.addTempSkill('yingbian_changeTarget'); - } + trigger.afterYingbianZhuzhan = (event) => event.zhuzhanresult.draw(2); + lib.yingbian.condition.complex.get("zhuzhan")(trigger); + ("step 1"); + if (!result.bool) return; + trigger.card.yingbian = true; + lib.yingbian.effect.forEach((value) => game.yingbianEffect(trigger, value)); + player.addTempSkill("yingbian_changeTarget"); + }, }, - yingba:{ - audio:2, - mod:{ - aiOrder(player,card,num){ - if(num>0&&_status.event&&_status.event.type=='phase'&&get.tag(card,'recover')){ - if(player.needsToDiscard()) return num/3; + yingba: { + audio: 2, + mod: { + aiOrder(player, card, num) { + if ( + num > 0 && + _status.event && + _status.event.type == "phase" && + get.tag(card, "recover") + ) { + if (player.needsToDiscard()) return num / 3; return 0; } }, - targetInRange(card,player,target){ - if(target.hasMark('yingba_mark')) return true; - } + targetInRange(card, player, target) { + if (target.hasMark("yingba_mark")) return true; + }, }, - enable:'phaseUse', - usable:1, - filter:(event,player)=>(game.hasPlayer((current)=>(current!=player&¤t.maxHp>1))), - filterTarget:(card,player,target)=>(target!=player&&target.maxHp>1), - content(){ - 'step 0' + enable: "phaseUse", + usable: 1, + filter: (event, player) => + game.hasPlayer((current) => current != player && current.maxHp > 1), + filterTarget: (card, player, target) => target != player && target.maxHp > 1, + content() { + "step 0"; target.loseMaxHp(); - 'step 1' - if(target.isIn()) target.addMark('yingba_mark',1); + ("step 1"); + if (target.isIn()) target.addMark("yingba_mark", 1); player.loseMaxHp(); }, - locked:false, + locked: false, //global:'yingba_mark', - ai:{ - combo:'scfuhai', - threaten:3, - order:11, - result:{ - player(player,target){ - if(player.maxHp==1) return -2.5; + ai: { + combo: "scfuhai", + threaten: 3, + order: 11, + result: { + player(player, target) { + if (player.maxHp == 1) return -2.5; return -0.25; }, - target(player,target){ - if(target.isHealthy()) return -2; - if(!target.hasMark('yingba_mark')) return -1; + target(player, target) { + if (target.isHealthy()) return -2; + if (!target.hasMark("yingba_mark")) return -1; return -0.2; }, }, }, - subSkill:{ - mark:{ - marktext:'定', - intro:{ - name:'平定', - content:'mark', - onunmark:true, + subSkill: { + mark: { + marktext: "定", + intro: { + name: "平定", + content: "mark", + onunmark: true, }, - mod:{ - maxHandcard(player,numx){ - var num=player.countMark('yingba_mark'); - if(num) return numx+num*game.countPlayer(function(current){ - return current.hasSkill('yingba'); - }); + mod: { + maxHandcard(player, numx) { + var num = player.countMark("yingba_mark"); + if (num) + return ( + numx + + num * + game.countPlayer(function (current) { + return current.hasSkill("yingba"); + }) + ); }, }, }, }, }, - scfuhai:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - forced:true, - filter(event,player){ - return event.target&&event.target.hasMark('yingba_mark'); + scfuhai: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return event.target && event.target.hasMark("yingba_mark"); }, - logTarget:'target', - content(){ + logTarget: "target", + content() { trigger.directHit.add(trigger.target); - if(player.getHistory('gain',function(evt){ - return evt.getParent(2).name=='scfuhai'; - }).length<2) player.draw(); + if ( + player.getHistory("gain", function (evt) { + return evt.getParent(2).name == "scfuhai"; + }).length < 2 + ) + player.draw(); }, - group:['scfuhai_die'], - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return arg&&arg.target&&arg.target.hasMark('yingba_mark') + group: ["scfuhai_die"], + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return arg && arg.target && arg.target.hasMark("yingba_mark"); }, - combo:'yingba' + combo: "yingba", }, - subSkill:{ - usea:{ - trigger:{player:'useCardAfter'}, - forced:true, - filter(event,player){ - return lib.skill.scfuhai_usea.logTarget(event,player).length>0; + subSkill: { + usea: { + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return lib.skill.scfuhai_usea.logTarget(event, player).length > 0; }, - logTarget(event,player){ - return event.targets.filter(function(i){ - return i.hasMark('yingba_mark'); + logTarget(event, player) { + return event.targets.filter(function (i) { + return i.hasMark("yingba_mark"); }); }, - content(){ - var num=0; - for(var i of trigger.targets){ - var numx=i.countMark('yingba_mark'); - if(numx){ - num+=numx; - i.removeMark('yingba_mark',numx); + content() { + var num = 0; + for (var i of trigger.targets) { + var numx = i.countMark("yingba_mark"); + if (numx) { + num += numx; + i.removeMark("yingba_mark", numx); } } - if(num) player.gainMaxHp(num); + if (num) player.gainMaxHp(num); }, }, - die:{ - trigger:{global:'die'}, - forced:true, - filter(event,player){ - return event.player.countMark('yingba_mark')>0; + die: { + trigger: { global: "die" }, + forced: true, + filter(event, player) { + return event.player.countMark("yingba_mark") > 0; }, - content(){ - player.gainMaxHp(trigger.player.countMark('yingba_mark')); - player.draw(trigger.player.countMark('yingba_mark')); + content() { + player.gainMaxHp(trigger.player.countMark("yingba_mark")); + player.draw(trigger.player.countMark("yingba_mark")); }, }, }, }, - pinghe:{ - audio:2, - mod:{ - maxHandcardBase(player){ + pinghe: { + audio: 2, + mod: { + maxHandcardBase(player) { return player.getDamagedHp(); }, }, - ai:{ - combo:'yingba', - effect:{ - target(card,player,target){ - if(get.tag(card,'recover')&&_status.event.type=='phase'&&!player.needsToDiscard()) return 0.2; - } - } - }, - trigger:{player:'damageBegin2'}, - forced:true, - filter(event,player){ - return event.source&&event.source!=player&&player.maxHp>1&&player.countCards('h')>0; - }, - content(){ - 'step 0' - player.chooseCardTarget({ - prompt:'请选择【冯河】的牌和目标', - prompt2:'将一张手牌交给一名其他角色并防止伤害'+(player.hasSkill('yingba')?',然后令伤害来源获得一个“平定”标记':''), - filterCard:true, - forced:true, - filterTarget:lib.filter.notMe, - ai1(card){ - if(get.tag(card,'recover')&&!game.hasPlayer(function(current){ - return get.attitude(current,player)>0&&!current.hasSkillTag('nogain'); - })) return 0; - return 1/Math.max(0.1,get.value(card)); + ai: { + combo: "yingba", + effect: { + target(card, player, target) { + if ( + get.tag(card, "recover") && + _status.event.type == "phase" && + !player.needsToDiscard() + ) + return 0.2; }, - ai2(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) att/=9; - return 4+att; + }, + }, + trigger: { player: "damageBegin2" }, + forced: true, + filter(event, player) { + return ( + event.source && + event.source != player && + player.maxHp > 1 && + player.countCards("h") > 0 + ); + }, + content() { + "step 0"; + player.chooseCardTarget({ + prompt: "请选择【冯河】的牌和目标", + prompt2: + "将一张手牌交给一名其他角色并防止伤害" + + (player.hasSkill("yingba") ? ",然后令伤害来源获得一个“平定”标记" : ""), + filterCard: true, + forced: true, + filterTarget: lib.filter.notMe, + ai1(card) { + if ( + get.tag(card, "recover") && + !game.hasPlayer(function (current) { + return ( + get.attitude(current, player) > 0 && !current.hasSkillTag("nogain") + ); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); + }, + ai2(target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 9; + return 4 + att; }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; //player.logSkill('pinghe',target); - player.line(target,'green'); - player.give(result.cards,target); + player.line(target, "green"); + player.give(result.cards, target); trigger.cancel(); player.loseMaxHp(); - if(player.hasSkill('yingba')){ - trigger.source.addMark('yingba_mark',1); + if (player.hasSkill("yingba")) { + trigger.source.addMark("yingba_mark", 1); } } }, }, - tianzuo:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + tianzuo: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&!lib.inpile.includes('qizhengxiangsheng'); + forced: true, + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + !lib.inpile.includes("qizhengxiangsheng") + ); }, - content(){ - game.addGlobalSkill('tianzuo_global'); - var cards=[]; - for(var i=2;i<10;i++){ - cards.push(game.createCard2('qizhengxiangsheng',i%2?'club':'spade',i)); + content() { + game.addGlobalSkill("tianzuo_global"); + var cards = []; + for (var i = 2; i < 10; i++) { + cards.push(game.createCard2("qizhengxiangsheng", i % 2 ? "club" : "spade", i)); } - game.broadcastAll(function(){lib.inpile.add('qizhengxiangsheng')}); - game.cardsGotoPile(cards,()=>{ - return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; - }) + game.broadcastAll(function () { + lib.inpile.add("qizhengxiangsheng"); + }); + game.cardsGotoPile(cards, () => { + return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)]; + }); }, - group:'tianzuo_remove', - subSkill:{ - remove:{ - audio:2, - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - filter(event,player){ - return event.card&&event.card.name=='qizhengxiangsheng'; + group: "tianzuo_remove", + subSkill: { + remove: { + audio: 2, + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter(event, player) { + return event.card && event.card.name == "qizhengxiangsheng"; }, - content(){ + content() { trigger.cancel(); }, - ai:{ - effect:{ - target(card,player,target){ - if(card&&card.name=='qizhengxiangsheng') return 'zeroplayertarget'; + ai: { + effect: { + target(card, player, target) { + if (card && card.name == "qizhengxiangsheng") return "zeroplayertarget"; }, - } + }, }, }, - global:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - popup:false, - filter(event,player){ - return event.card.name=='qizhengxiangsheng'; + global: { + trigger: { player: "useCardToPlayered" }, + forced: true, + popup: false, + filter(event, player) { + return event.card.name == "qizhengxiangsheng"; }, - content(){ - 'step 0' - var target=trigger.target; - event.target=target; - player.chooseControl('奇兵','正兵').set('prompt','请选择'+get.translation(target)+'的标记').set('choice',function(){ - var e1=1.5*get.sgn(get.damageEffect(target,player,target)); - var e2=0; - if(target.countGainableCards(player,'h')>0&&!target.hasSkillTag('noh')) e2=-1; - var es=target.getGainableCards(player,'e'); - if(es.length) e2=Math.min(e2,function(){ - var max=0; - for(var i of es) max=Math.max(max,get.value(i,target)) - return -max/4; - }()); - if(Math.abs(e1-e2)<=0.3) return Math.random()<0.5?'奇兵':'正兵'; - if(e1 0 && + !target.hasSkillTag("noh") + ) + e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) + max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (Math.abs(e1 - e2) <= 0.3) + return Math.random() < 0.5 ? "奇兵" : "正兵"; + if (e1 < e2) return "奇兵"; + return "正兵"; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); + ("step 1"); + var map = trigger.getParent().customArgs, + id = target.playerid; + if (!map[id]) map[id] = {}; + map[id].qizheng_name = result.control; }, }, - rewrite:{ - audio:'tianzuo', - trigger:{global:'useCardToTargeted'}, - filter(event,player){ - return event.card.name=='qizhengxiangsheng'; + rewrite: { + audio: "tianzuo", + trigger: { global: "useCardToTargeted" }, + filter(event, player) { + return event.card.name == "qizhengxiangsheng"; + }, + logTarget: "target", + prompt2: "观看其手牌并修改“奇正相生”标记", + content() { + "step 0"; + var target = trigger.target; + event.target = target; + if (player != target && target.countCards("h") > 0) player.viewHandcards(target); + player + .chooseControl("奇兵", "正兵") + .set("prompt", "请选择" + get.translation(target) + "的标记") + .set( + "choice", + (function () { + var shas = target.getCards("h", "sha"), + shans = target.getCards("h", "shan"); + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if ( + target.countGainableCards(player, "h") > 0 && + !target.hasSkillTag("noh") + ) + e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) + max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (get.attitude(player, target) > 0) { + if (shas.length >= Math.max(1, shans.length)) return "奇兵"; + if (shans.length > shas.length) return "正兵"; + return e1 > e2 ? "奇兵" : "正兵"; + } + if (shas.length) e1 = -0.5; + if (shans.length) e2 = -0.7; + if (Math.abs(e1 - e2) <= 0.3) + return Math.random() < 0.5 ? "奇兵" : "正兵"; + var rand = Math.random(); + if (e1 < e2) return rand < 0.1 ? "奇兵" : "正兵"; + return rand < 0.1 ? "正兵" : "奇兵"; + })() + ) + .set("ai", () => _status.event.choice); + ("step 1"); + var map = trigger.getParent().customArgs, + id = target.playerid; + if (!map[id]) map[id] = {}; + map[id].qizheng_name = result.control; + map[id].qizheng_aibuff = get.attitude(player, target) > 0; }, - logTarget:'target', - prompt2:'观看其手牌并修改“奇正相生”标记', - content(){ - 'step 0' - var target=trigger.target; - event.target=target; - if(player!=target&&target.countCards('h')>0) player.viewHandcards(target); - player.chooseControl('奇兵','正兵').set('prompt','请选择'+get.translation(target)+'的标记').set('choice',function(){ - var shas=target.getCards('h','sha'),shans=target.getCards('h','shan'); - var e1=1.5*get.sgn(get.damageEffect(target,player,target)); - var e2=0; - if(target.countGainableCards(player,'h')>0&&!target.hasSkillTag('noh')) e2=-1; - var es=target.getGainableCards(player,'e'); - if(es.length) e2=Math.min(e2,function(){ - var max=0; - for(var i of es) max=Math.max(max,get.value(i,target)) - return -max/4; - }()); - if(get.attitude(player,target)>0){ - if(shas.length>=Math.max(1,shans.length)) return '奇兵'; - if(shans.length>shas.length) return '正兵'; - return e1>e2?'奇兵':'正兵'; - } - if(shas.length) e1=-0.5; - if(shans.length) e2=-0.7; - if(Math.abs(e1-e2)<=0.3) return Math.random()<0.5?'奇兵':'正兵'; - var rand=Math.random(); - if(e1(_status.event.choice)); - 'step 1' - var map=trigger.getParent().customArgs,id=target.playerid; - if(!map[id]) map[id]={}; - map[id].qizheng_name=result.control; - map[id].qizheng_aibuff=get.attitude(player,target)>0; - } }, }, }, - lingce:{ - audio:2, - init:(player)=>{ - game.addGlobalSkill('lingce_global'); + lingce: { + audio: 2, + init: (player) => { + game.addGlobalSkill("lingce_global"); }, - trigger:{global:'useCard'}, - forced:true, - filter(event,player){ - if(!event.card.isCard||!event.cards||event.cards.length!==1) return false; - return event.card.name=='qizhengxiangsheng'||get.zhinangs().includes(event.card.name)||player.getStorage('dinghan').includes(event.card.name); + trigger: { global: "useCard" }, + forced: true, + filter(event, player) { + if (!event.card.isCard || !event.cards || event.cards.length !== 1) return false; + return ( + event.card.name == "qizhengxiangsheng" || + get.zhinangs().includes(event.card.name) || + player.getStorage("dinghan").includes(event.card.name) + ); }, - content(){ + content() { player.draw(); }, - subSkill:{ - global:{ - ai:{ - effect:{ - player:(card,player,target)=>{ - let num=0,nohave=true; - game.countPlayer(i=>{ - if(i.hasSkill('lingce')){ - nohave=false; - if(i.isIn()&&lib.skill.lingce.filter({card:card},i)) num+=get.sgnAttitude(player,i); + subSkill: { + global: { + ai: { + effect: { + player: (card, player, target) => { + let num = 0, + nohave = true; + game.countPlayer((i) => { + if (i.hasSkill("lingce")) { + nohave = false; + if (i.isIn() && lib.skill.lingce.filter({ card: card }, i)) + num += get.sgnAttitude(player, i); } - },true); - if(nohave) game.removeGlobalSkill('lingce_global'); - else return [1,0.8*num]; - } - } - } - } - } + }, true); + if (nohave) game.removeGlobalSkill("lingce_global"); + else return [1, 0.8 * num]; + }, + }, + }, + }, + }, }, - dinghan:{ - audio:2, - trigger:{ - target:'useCardToTarget', - player:'addJudgeBefore', + dinghan: { + audio: 2, + trigger: { + target: "useCardToTarget", + player: "addJudgeBefore", }, - forced:true, - locked:false, - filter(event,player){ - if(event.name=='useCardToTarget'&&get.type(event.card,null,false)!='trick') return false; - return !player.getStorage('dinghan').includes(event.card.name); + forced: true, + locked: false, + filter(event, player) { + if (event.name == "useCardToTarget" && get.type(event.card, null, false) != "trick") + return false; + return !player.getStorage("dinghan").includes(event.card.name); }, - content(){ - player.markAuto('dinghan',[trigger.card.name]);if(trigger.name=='addJudge'){ + content() { + player.markAuto("dinghan", [trigger.card.name]); + if (trigger.name == "addJudge") { trigger.cancel(); - var owner=get.owner(trigger.card); - if(owner&&owner.getCards('hej').includes(trigger.card)) owner.lose(trigger.card,ui.discardPile); + var owner = get.owner(trigger.card); + if (owner && owner.getCards("hej").includes(trigger.card)) + owner.lose(trigger.card, ui.discardPile); else game.cardsDiscard(trigger.card); - game.log(trigger.card,'进入了弃牌堆'); - } - else{ + game.log(trigger.card, "进入了弃牌堆"); + } else { trigger.targets.remove(player); trigger.getParent().triggeredTargets2.remove(player); trigger.untrigger(); } }, - onremove:true, - intro:{content:'已记录牌名:$'}, - group:'dinghan_add', - subSkill:{ - add:{ - trigger:{player:'phaseBegin'}, - direct:true, - content(){ - 'step 0' - var dialog=[get.prompt('dinghan')];list1=player.getStorage('dinghan'),list2=lib.inpile.filter(function(i){ - return get.type2(i,false)=='trick'&&!list1.includes(i); - }); - if(list1.length){ + onremove: true, + intro: { content: "已记录牌名:$" }, + group: "dinghan_add", + subSkill: { + add: { + trigger: { player: "phaseBegin" }, + direct: true, + content() { + "step 0"; + var dialog = [get.prompt("dinghan")]; + (list1 = player.getStorage("dinghan")), + (list2 = lib.inpile.filter(function (i) { + return get.type2(i, false) == "trick" && !list1.includes(i); + })); + if (list1.length) { dialog.push('
    已记录
    '); - dialog.push([list1,'vcard']); + dialog.push([list1, "vcard"]); } - if(list2.length){ + if (list2.length) { dialog.push('
    未记录
    '); - dialog.push([list2,'vcard']); + dialog.push([list2, "vcard"]); } - player.chooseButton(dialog).set('ai',function(button){ - var player=_status.event.player,name=button.link[2]; - if(player.getStorage('dinghan').includes(name)){ - return -get.effect(player,{name:name},player,player); - } - else{ - return get.effect(player,{name:name},player,player)*(1+player.countCards('hs',name)); + player.chooseButton(dialog).set("ai", function (button) { + var player = _status.event.player, + name = button.link[2]; + if (player.getStorage("dinghan").includes(name)) { + return -get.effect(player, { name: name }, player, player); + } else { + return ( + get.effect(player, { name: name }, player, player) * + (1 + player.countCards("hs", name)) + ); } }); - 'step 1' - if(result.bool){ - player.logSkill('dinghan'); - var name=result.links[0][2]; - if(player.getStorage('dinghan').includes(name)){ - player.unmarkAuto('dinghan',[name]); - game.log(player,'从定汉记录中移除了','#y'+get.translation(name)); - } - else{ - player.markAuto('dinghan',[name]); - game.log(player,'向定汉记录中添加了','#y'+get.translation(name)); + ("step 1"); + if (result.bool) { + player.logSkill("dinghan"); + var name = result.links[0][2]; + if (player.getStorage("dinghan").includes(name)) { + player.unmarkAuto("dinghan", [name]); + game.log(player, "从定汉记录中移除了", "#y" + get.translation(name)); + } else { + player.markAuto("dinghan", [name]); + game.log(player, "向定汉记录中添加了", "#y" + get.translation(name)); } game.delayx(); } @@ -4242,356 +5211,436 @@ game.import('character', function () { }, }, }, - dulie:{ - audio:2, - trigger:{target:'useCardToTarget'}, - forced:true, - logTarget:'player', - filter(event,player){ - return event.card.name=='sha'&&event.player.hp>player.hp; + dulie: { + audio: 2, + trigger: { target: "useCardToTarget" }, + forced: true, + logTarget: "player", + filter(event, player) { + return event.card.name == "sha" && event.player.hp > player.hp; }, - content(){ - 'step 0' - player.judge(function(result){ - if(get.suit(result)=='heart') return 2; + content() { + "step 0"; + player.judge(function (result) { + if (get.suit(result) == "heart") return 2; return -1; - }).judge2=function(result){ + }).judge2 = function (result) { return result.bool; }; - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { trigger.targets.remove(player); trigger.getParent().triggeredTargets2.remove(player); trigger.untrigger(); } }, - ai:{ - effect:{ - target(card,player,target,current,isLink){ - if(card.name=='sha'&&!isLink&&player.hp>target.hp) return 0.5; + ai: { + effect: { + target(card, player, target, current, isLink) { + if (card.name == "sha" && !isLink && player.hp > target.hp) return 0.5; }, }, }, - marktext:'围', - intro:{ - name:'破围(围)', - name2:'围', - content:'mark', + marktext: "围", + intro: { + name: "破围(围)", + name2: "围", + content: "mark", }, }, - tspowei:{ - audio:3, - dutySkill:true, - derivation:'shenzhu', - group:['tspowei_init','tspowei_move','tspowei_achieve','tspowei_fail','tspowei_use','tspowei_remove'], - subSkill:{ - remove:{ - audio:'tspowei3', - trigger:{global:'damageEnd'}, - filter(event,player){ - return event.player&&event.player.isIn()&&event.player.hasMark('dulie'); + tspowei: { + audio: 3, + dutySkill: true, + derivation: "shenzhu", + group: [ + "tspowei_init", + "tspowei_move", + "tspowei_achieve", + "tspowei_fail", + "tspowei_use", + "tspowei_remove", + ], + subSkill: { + remove: { + audio: "tspowei3", + trigger: { global: "damageEnd" }, + filter(event, player) { + return event.player && event.player.isIn() && event.player.hasMark("dulie"); }, - forced:true, - logTarget:'player', - content(){ - trigger.player.removeMark('dulie',trigger.player.countMark('dulie')); + forced: true, + logTarget: "player", + content() { + trigger.player.removeMark("dulie", trigger.player.countMark("dulie")); }, }, - use:{ - audio:'tspowei3', - trigger:{global:'phaseBegin'}, - direct:true, - filter(event,player){ - return event.player!=player&&event.player.hasMark('dulie')&& - (player.countCards('h')>0||player.hp>=event.player.hp&&event.player.countCards('h')>0); + use: { + audio: "tspowei3", + trigger: { global: "phaseBegin" }, + direct: true, + filter(event, player) { + return ( + event.player != player && + event.player.hasMark("dulie") && + (player.countCards("h") > 0 || + (player.hp >= event.player.hp && event.player.countCards("h") > 0)) + ); }, - content(){ - 'step 0' - var list=[],target=trigger.player,choiceList=[ - '弃置一张牌并对其造成1点伤害', - '获得其一张手牌', - ]; - event.target=target; - if(player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'tspowei_use'); - },'h')) list.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(player.hp>=target.hp&&target.countCards('h')>0) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - player.chooseControl(list,'cancel2').set('prompt',get.prompt('tspowei',target)).set('choiceList',choiceList).set('ai',function(){ - var evt=_status.event.getParent(); - if(evt.player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,evt.player,'tspowei_use')&&get.value(card,evt.player)<7; - },'h')&&get.damageEffect(evt.target,evt.player,evt.player)>0) return '选项一'; - if(evt.player.hp>=evt.target.hp&&evt.target.countCards('h')>0&&get.attitude(evt.player,evt.target)<=0&&!evt.target.hasSkillTag('noh')) return '选项二'; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='选项二'){ - player.logSkill('tspowei_use',target); - player.gainPlayerCard(target,'h',true); + content() { + "step 0"; + var list = [], + target = trigger.player, + choiceList = ["弃置一张牌并对其造成1点伤害", "获得其一张手牌"]; + event.target = target; + if ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "tspowei_use"); + }, "h") + ) + list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (player.hp >= target.hp && target.countCards("h") > 0) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("tspowei", target)) + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event.getParent(); + if ( + evt.player.hasCard(function (card) { + return ( + lib.filter.cardDiscardable(card, evt.player, "tspowei_use") && + get.value(card, evt.player) < 7 + ); + }, "h") && + get.damageEffect(evt.target, evt.player, evt.player) > 0 + ) + return "选项一"; + if ( + evt.player.hp >= evt.target.hp && + evt.target.countCards("h") > 0 && + get.attitude(evt.player, evt.target) <= 0 && + !evt.target.hasSkillTag("noh") + ) + return "选项二"; + return "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "选项二") { + player.logSkill("tspowei_use", target); + player.gainPlayerCard(target, "h", true); event.goto(3); } - } - else event.finish(); - 'step 2' - player.chooseToDiscard('h',true).logSkill=['tspowei_use',target]; - if(get.mode()!='identity'||player.identity!='nei') player.addExpose(0.2); + } else event.finish(); + ("step 2"); + player.chooseToDiscard("h", true).logSkill = ["tspowei_use", target]; + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); target.damage(); - 'step 3' - player.addTempSkill('tspowei_inRange'); + ("step 3"); + player.addTempSkill("tspowei_inRange"); }, - ai:{expose:0.2}, + ai: { expose: 0.2 }, }, - inRange:{ - charlotte:true, - mod:{ - inRangeOf(from,to){ - if(from==_status.currentPhase) return true; + inRange: { + charlotte: true, + mod: { + inRangeOf(from, to) { + if (from == _status.currentPhase) return true; }, }, }, - init:{ - audio:'tspowei3', - trigger:{ - global:'phaseBefore', - player:'enterGame', + init: { + audio: "tspowei3", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - logTarget(event,player){ - return game.filterPlayer((current)=>current!=player&&!current.hasMark('dulie')); + logTarget(event, player) { + return game.filterPlayer( + (current) => current != player && !current.hasMark("dulie") + ); }, - content(){ - var list=game.filterPlayer((current)=>current!=player&&!current.hasMark('dulie')).sortBySeat(); - for(var i of list) i.addMark('dulie',1,false); + content() { + var list = game + .filterPlayer((current) => current != player && !current.hasMark("dulie")) + .sortBySeat(); + for (var i of list) i.addMark("dulie", 1, false); }, }, - move:{ - audio:'tspowei3', - trigger:{player:'phaseBegin'}, - forced:true, - filter(event,player){ - return game.hasPlayer((current)=>current!=player&¤t.hasMark('dulie')); + move: { + audio: "tspowei3", + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return game.hasPlayer((current) => current != player && current.hasMark("dulie")); }, - content(){ - var list=game.filterPlayer((current)=>current!=player&¤t.hasMark('dulie')).sortBySeat(); - var map={}; - for(var i of list){ - var num=i.countMark('dulie'); - i.removeMark('dulie',num); - map[i.playerid]=num; + content() { + var list = game + .filterPlayer((current) => current != player && current.hasMark("dulie")) + .sortBySeat(); + var map = {}; + for (var i of list) { + var num = i.countMark("dulie"); + i.removeMark("dulie", num); + map[i.playerid] = num; } - for(var i of list){ - var next=i.next; - if(next==player) next=next.next; - next.addMark('dulie',map[i.playerid]); + for (var i of list) { + var next = i.next; + if (next == player) next = next.next; + next.addMark("dulie", map[i.playerid]); } }, }, - achieve:{ - audio:'tspowei1', - trigger:{player:'phaseBegin'}, - forced:true, - skillAnimation:true, - animationColor:'metal', - filter(event,player){ - return !game.hasPlayer(function(current){ - return current.hasMark('dulie'); + achieve: { + audio: "tspowei1", + trigger: { player: "phaseBegin" }, + forced: true, + skillAnimation: true, + animationColor: "metal", + filter(event, player) { + return !game.hasPlayer(function (current) { + return current.hasMark("dulie"); }); }, - content(){ - game.log(player,'成功完成使命'); - player.awakenSkill('tspowei'); - player.addSkills('shenzhu'); + content() { + game.log(player, "成功完成使命"); + player.awakenSkill("tspowei"); + player.addSkills("shenzhu"); }, }, - fail:{ - audio:'tspowei2', - trigger:{player:'dying'}, - forced:true, - content(){ - 'step 0' - game.log(player,'使命失败'); - player.awakenSkill('tspowei'); - if(player.hp<1) player.recover(1-player.hp); - 'step 1' - var num=player.countCards('e'); - if(num>0) player.chooseToDiscard('e',true,num); + fail: { + audio: "tspowei2", + trigger: { player: "dying" }, + forced: true, + content() { + "step 0"; + game.log(player, "使命失败"); + player.awakenSkill("tspowei"); + if (player.hp < 1) player.recover(1 - player.hp); + ("step 1"); + var num = player.countCards("e"); + if (num > 0) player.chooseToDiscard("e", true, num); }, }, }, }, - tspowei1:{audio:true}, - tspowei2:{audio:true}, - tspowei3:{audio:true}, - shenzhu:{ - audio:2, - trigger:{player:'useCardAfter'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'&&event.card.isCard&&event.cards.length==1; + tspowei1: { audio: true }, + tspowei2: { audio: true }, + tspowei3: { audio: true }, + shenzhu: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" && event.card.isCard && event.cards.length == 1; }, - content(){ - 'step 0' - player.chooseControl().set('choiceList',[ - '摸一张牌,且本回合使用【杀】的次数上限+1', - '摸三张牌,且本回合不能再使用【杀】', - ]).set('ai',()=>_status.event.player.hasSha()?0:1); - 'step 1' - if(result.index==0){ + content() { + "step 0"; + player + .chooseControl() + .set("choiceList", [ + "摸一张牌,且本回合使用【杀】的次数上限+1", + "摸三张牌,且本回合不能再使用【杀】", + ]) + .set("ai", () => (_status.event.player.hasSha() ? 0 : 1)); + ("step 1"); + if (result.index == 0) { player.draw(); - player.addTempSkill('shenzhu_more'); - player.addMark('shenzhu_more',1,false); - } - else{ + player.addTempSkill("shenzhu_more"); + player.addMark("shenzhu_more", 1, false); + } else { player.draw(3); - player.addTempSkill('shenzhu_less'); + player.addTempSkill("shenzhu_less"); } }, - subSkill:{ - more:{ - charlotte:true, - onremove:true, - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha') return num+player.countMark('shenzhu_more'); + subSkill: { + more: { + charlotte: true, + onremove: true, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("shenzhu_more"); }, }, }, - less:{ - charlotte:true, - mod:{ - cardEnabled(card){ - if(card.name=='sha') return false; - } + less: { + charlotte: true, + mod: { + cardEnabled(card) { + if (card.name == "sha") return false; + }, }, }, }, }, - dangmo:{ - audio:2, - trigger:{player:'useCard2'}, - direct:true, - filter(event,player){ - if(event.card.name!='sha'||player.hp<=1) return false; - var evt=event.getParent('phaseUse'); - return evt&&evt.player==player&&player.getHistory('useCard',function(evtx){ - return evtx.card.name=='sha'&&evtx.getParent('phaseUse')==evt; - })[0]==event&&game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.filterTarget(event.card,player,current); - }); + dangmo: { + audio: 2, + trigger: { player: "useCard2" }, + direct: true, + filter(event, player) { + if (event.card.name != "sha" || player.hp <= 1) return false; + var evt = event.getParent("phaseUse"); + return ( + evt && + evt.player == player && + player.getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + })[0] == event && + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.filterTarget(event.card, player, current) + ); + }) + ); }, - content(){ - 'step 0' - var num=Math.min(player.hp-1,game.countPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.filterTarget(trigger.card,player,current); - })); - player.chooseTarget(get.prompt('dangmo'),'为'+get.translation(trigger.card)+'增加至多'+get.translation(num)+'个目标',[1,num],function(card,player,target){ - var evt=_status.event.getTrigger(); - return !evt.targets.includes(target)&&lib.filter.filterTarget(evt.card,player,target); - }).set('ai',function(target){ - var evt=_status.event.getTrigger(),eff=get.effect(target,evt.card,evt.player,evt.player); - if(player.hasSkill('tspowei')&&target.hasMark('dulie')) return 4*eff; - return eff; - }); - 'step 1' - if(result.bool){ - if(player!=game.me&&!player.isOnline()) game.delayx(); - event.targets=result.targets; - } - else event.finish(); - 'step 2' - player.logSkill('dangmo',targets); + content() { + "step 0"; + var num = Math.min( + player.hp - 1, + game.countPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.filterTarget(trigger.card, player, current) + ); + }) + ); + player + .chooseTarget( + get.prompt("dangmo"), + "为" + + get.translation(trigger.card) + + "增加至多" + + get.translation(num) + + "个目标", + [1, num], + function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + !evt.targets.includes(target) && + lib.filter.filterTarget(evt.card, player, target) + ); + } + ) + .set("ai", function (target) { + var evt = _status.event.getTrigger(), + eff = get.effect(target, evt.card, evt.player, evt.player); + if (player.hasSkill("tspowei") && target.hasMark("dulie")) return 4 * eff; + return eff; + }); + ("step 1"); + if (result.bool) { + if (player != game.me && !player.isOnline()) game.delayx(); + event.targets = result.targets; + } else event.finish(); + ("step 2"); + player.logSkill("dangmo", targets); trigger.targets.addArray(targets); }, }, - reshuishi:{ - audio:'shuishi', - enable:'phaseUse', - usable:1, - frequent:true, - filter(event,player){ - return player.maxHp<10; + reshuishi: { + audio: "shuishi", + enable: "phaseUse", + usable: 1, + frequent: true, + filter(event, player) { + return player.maxHp < 10; }, - content(){ - 'step 0' - event.cards=[]; - event.suits=[]; - 'step 1' - player.judge(function(result){ - var evt=_status.event.getParent('reshuishi'); - if(evt&&evt.suits&&evt.suits.includes(get.suit(result))) return 0; - return 1; - }).set('callback',lib.skill.reshuishi.callback).judge2=function(result){ - return result.bool?true:false; + content() { + "step 0"; + event.cards = []; + event.suits = []; + ("step 1"); + player + .judge(function (result) { + var evt = _status.event.getParent("reshuishi"); + if (evt && evt.suits && evt.suits.includes(get.suit(result))) return 0; + return 1; + }) + .set("callback", lib.skill.reshuishi.callback).judge2 = function (result) { + return result.bool ? true : false; }; - 'step 2' - var cards=cards.filterInD(); - if(cards.length) player.chooseTarget('将'+get.translation(cards)+'交给一名角色',true).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<=0) return att; - if(target.countCards('h')+_status.event.num>=_status.event.max) att/=3; - if(target.hasSkillTag('nogain')) att/=10; - return att; - }).set('num',cards.length).set('max',game.filterPlayer().reduce((num,i)=>{ - return Math.max(num,i.countCards('h')); - },0)); + ("step 2"); + var cards = cards.filterInD(); + if (cards.length) + player + .chooseTarget("将" + get.translation(cards) + "交给一名角色", true) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return att; + if (target.countCards("h") + _status.event.num >= _status.event.max) att /= 3; + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }) + .set("num", cards.length) + .set( + "max", + game.filterPlayer().reduce((num, i) => { + return Math.max(num, i.countCards("h")); + }, 0) + ); else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - target.gain(cards,'gain2').giver=player; - } - else event.finish(); - 'step 4' - if(target.isMaxHandcard()) player.loseMaxHp(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.gain(cards, "gain2").giver = player; + } else event.finish(); + ("step 4"); + if (target.isMaxHandcard()) player.loseMaxHp(); }, - callback(){ - 'step 0' - var evt=event.getParent(2); + callback() { + "step 0"; + var evt = event.getParent(2); event.getParent().orderingCards.remove(event.judgeResult.card); evt.cards.push(event.judgeResult.card); - if(event.getParent().result.bool&&player.maxHp<10){ + if (event.getParent().result.bool && player.maxHp < 10) { evt.suits.push(event.getParent().result.suit); player.gainMaxHp(); - player.chooseBool('是否继续发动【慧识】?').set('frequentSkill','reshuishi'); - } - else event._result={bool:false}; - 'step 1' - if(result.bool) event.getParent(2).redo(); + player.chooseBool("是否继续发动【慧识】?").set("frequentSkill", "reshuishi"); + } else event._result = { bool: false }; + ("step 1"); + if (result.bool) event.getParent(2).redo(); }, - ai:{ - order:9, - result:{ - player:1, + ai: { + order: 9, + result: { + player: 1, }, }, }, - shuishi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.maxHp<10; + shuishi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.maxHp < 10; }, - filterTarget:true, - content(){ - 'step 0' + filterTarget: true, + content() { + "step 0"; target.draw(); - 'step 1' - if(!result||!Array.isArray(result)||result.length!=1||get.itemtype(result[0])!='card'){ + ("step 1"); + if ( + !result || + !Array.isArray(result) || + result.length != 1 || + get.itemtype(result[0]) != "card" + ) { event.finish(); return; } - var suit=get.suit(result[0]),hs=target.getCards('h'); - for(var i of hs){ - if(i!=result[0]&&get.suit(i,target)==suit){ + var suit = get.suit(result[0]), + hs = target.getCards("h"); + for (var i of hs) { + if (i != result[0] && get.suit(i, target) == suit) { player.loseMaxHp(); target.showHandcards(); event.finish(); @@ -4599,4294 +5648,5210 @@ game.import('character', function () { } } player.gainMaxHp(); - 'step 2' - if(player.maxHp<10){ - player.chooseBool('是否继续发动【慧识】?'); - } - else event.finish(); - 'step 3' - if(result.bool) event.goto(0); + ("step 2"); + if (player.maxHp < 10) { + player.chooseBool("是否继续发动【慧识】?"); + } else event.finish(); + ("step 3"); + if (result.bool) event.goto(0); }, - ai:{ - order:0.5, - result:{ - target:0.2, - player(player,target){ - var list=[],hs=target.getCards('h'); - for(var i of hs) list.add(get.suit(i,target)); - if(list.length==0) return 0; - if(list.length==1) return player.maxHp>2?0:-2; - if(list.length==2) return player.maxHp>3?0:-2; + ai: { + order: 0.5, + result: { + target: 0.2, + player(player, target) { + var list = [], + hs = target.getCards("h"); + for (var i of hs) list.add(get.suit(i, target)); + if (list.length == 0) return 0; + if (list.length == 1) return player.maxHp > 2 ? 0 : -2; + if (list.length == 2) return player.maxHp > 3 ? 0 : -2; return -2; }, }, }, }, - stianyi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'gray', - filter(event,player){ - return !game.hasPlayer(function(current){ - return current.getAllHistory('damage').length==0; + stianyi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter(event, player) { + return !game.hasPlayer(function (current) { + return current.getAllHistory("damage").length == 0; }); }, - content(){ - 'step 0' - player.awakenSkill('stianyi'); + content() { + "step 0"; + player.awakenSkill("stianyi"); player.gainMaxHp(2); player.recover(); - 'step 1' - player.chooseTarget(true,'令一名角色获得技能〖佐幸〗').set('ai',function(target){ - return get.attitude(_status.event.player,target); + ("step 1"); + player.chooseTarget(true, "令一名角色获得技能〖佐幸〗").set("ai", function (target) { + return get.attitude(_status.event.player, target); }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.storage.zuoxing=player; - target.addSkills('zuoxing'); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.storage.zuoxing = player; + target.addSkills("zuoxing"); } }, - derivation:'zuoxing', + derivation: "zuoxing", }, - zuoxing:{ - audio:2, - enable:'phaseUse', - usable:1, - filter(event,player){ - var target=player.storage.zuoxing; - if(!target||!target.isIn()||target.maxHp<2) return false; - for(var i of lib.inpile){ - if(get.type(i)=='trick'&&event.filterCard({name:i,isCard:true},player,event)) return true; + zuoxing: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + var target = player.storage.zuoxing; + if (!target || !target.isIn() || target.maxHp < 2) return false; + for (var i of lib.inpile) { + if ( + get.type(i) == "trick" && + event.filterCard({ name: i, isCard: true }, player, event) + ) + return true; } return false; }, - chooseButton:{ - dialog(event,player){ - var list=[]; - for(var i of lib.inpile){ - if(get.type(i)=='trick'&&event.filterCard({name:i,isCard:true},player,event)) list.push(['锦囊','',i]); + chooseButton: { + dialog(event, player) { + var list = []; + for (var i of lib.inpile) { + if ( + get.type(i) == "trick" && + event.filterCard({ name: i, isCard: true }, player, event) + ) + list.push(["锦囊", "", i]); } - return ui.create.dialog('佐幸',[list,'vcard']); + return ui.create.dialog("佐幸", [list, "vcard"]); }, - check(button){ - return _status.event.player.getUseValue({name:button.link[2],isCard:true}); + check(button) { + return _status.event.player.getUseValue({ name: button.link[2], isCard: true }); }, - backup(links,player){ + backup(links, player) { return { - viewAs:{ - name:links[0][2], - isCard:true, + viewAs: { + name: links[0][2], + isCard: true, }, - filterCard:()=>false, - selectCard:-1, - popname:true, - precontent(){ - player.logSkill('zuoxing'); - var target=player.storage.zuoxing; + filterCard: () => false, + selectCard: -1, + popname: true, + precontent() { + player.logSkill("zuoxing"); + var target = player.storage.zuoxing; target.loseMaxHp(); //delete event.result.skill; }, - } + }; }, - prompt(links,player){ - return '请选择'+get.translation(links[0][2])+'的目标'; + prompt(links, player) { + return "请选择" + get.translation(links[0][2]) + "的目标"; }, }, - ai:{order:1,result:{player:1}}, + ai: { order: 1, result: { player: 1 } }, }, - resghuishi:{ - audio:'sghuishi', - inherit:'sghuishi', - filterTarget:true, - prompt(){ - var player=_status.event.player; - if(player.maxHp>=game.players.length) return '选择一名角色。若其拥有未发动过的觉醒技,则你解除其中一个觉醒技的发动限制;否则其摸四张牌。然后你减2点体力上限。'; - return '令一名角色摸四张牌,然后你减2点体力上限。'; + resghuishi: { + audio: "sghuishi", + inherit: "sghuishi", + filterTarget: true, + prompt() { + var player = _status.event.player; + if (player.maxHp >= game.players.length) + return "选择一名角色。若其拥有未发动过的觉醒技,则你解除其中一个觉醒技的发动限制;否则其摸四张牌。然后你减2点体力上限。"; + return "令一名角色摸四张牌,然后你减2点体力上限。"; }, - content(){ - 'step 0' - player.awakenSkill('resghuishi'); - var list=target.getSkills(null,false,false).filter(function(skill){ - var info=lib.skill[skill]; - return info&&info.juexingji&&!target.awakenedSkills.includes(skill); + content() { + "step 0"; + player.awakenSkill("resghuishi"); + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji && !target.awakenedSkills.includes(skill); }); - if(player.maxHp>=game.players.length&&list.length>0){ - if(list.length==1) event._result={control:list[0]}; - else player.chooseControl(list).set('prompt','选择一个觉醒技,令'+get.translation(target)+'可无视条件发动该技能'); - } - else{ + if (player.maxHp >= game.players.length && list.length > 0) { + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set( + "prompt", + "选择一个觉醒技,令" + get.translation(target) + "可无视条件发动该技能" + ); + } else { target.draw(4); event.goto(2); } - 'step 1' - target.storage.resghuishi_mark=result.control; - target.markSkill('resghuishi_mark'); - var info=lib.skill[result.control]; - if(info.filter&&!info.charlotte&&!info.resghuishi_filter){ - info.resghuishi_filter=info.filter; - info.filter=function(event,player){ - if(player.storage.resghuishi_mark) return true; - return this.resghuishi_filter.apply(this,arguments); - } + ("step 1"); + target.storage.resghuishi_mark = result.control; + target.markSkill("resghuishi_mark"); + var info = lib.skill[result.control]; + if (info.filter && !info.charlotte && !info.resghuishi_filter) { + info.resghuishi_filter = info.filter; + info.filter = function (event, player) { + if (player.storage.resghuishi_mark) return true; + return this.resghuishi_filter.apply(this, arguments); + }; } - 'step 2' + ("step 2"); player.loseMaxHp(2); }, - intro:{content:'未发动'}, - ai:{ - order:0.1, - expose:0.2, - result:{ - target(player,target){ - if(target!=player&&player.hasUnknown()||player.maxHp<(player.getDamagedHp()>1?5:6)) return 0; - if(target==player&&player.hasSkill('resghuishi')&&game.hasPlayer(function(current){ - return current.getAllHistory('damage').length==0; - })) return 4; - var list=target.getSkills(null,false,false).filter(function(skill){ - var info=lib.skill[skill]; - return info&&info.juexingji&&!target.awakenedSkills.includes(skill); + intro: { content: "未发动" }, + ai: { + order: 0.1, + expose: 0.2, + result: { + target(player, target) { + if ( + (target != player && player.hasUnknown()) || + player.maxHp < (player.getDamagedHp() > 1 ? 5 : 6) + ) + return 0; + if ( + target == player && + player.hasSkill("resghuishi") && + game.hasPlayer(function (current) { + return current.getAllHistory("damage").length == 0; + }) + ) + return 4; + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji && !target.awakenedSkills.includes(skill); }); - if(list.length||target.hasJudge('lebu')||target.hasSkillTag('nogain')) return 0; + if (list.length || target.hasJudge("lebu") || target.hasSkillTag("nogain")) + return 0; return 4; }, }, }, - subSkill:{mark:{intro:{content:'发动【$】时无视条件'}}}, + subSkill: { mark: { intro: { content: "发动【$】时无视条件" } } }, }, - sghuishi:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'water', - filterTarget:lib.filter.notMe, - content(){ - 'step 0' - player.awakenSkill('sghuishi'); - var list=target.getSkills(null,false,false).filter(function(skill){ - var info=lib.skill[skill]; - return info&&info.juexingji; + sghuishi: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "water", + filterTarget: lib.filter.notMe, + content() { + "step 0"; + player.awakenSkill("sghuishi"); + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji; }); - if(list.length){ - target.addMark('sghuishi',1,false); - for(var i of list){ - var info=lib.skill[i]; - if(info.filter&&!info.charlotte&&!info.sghuishi_filter){ - info.sghuishi_filter=info.filter; - info.filter=function(event,player){ - if(player.hasMark('sghuishi')) return true; - return this.sghuishi_filter.apply(this,arguments); - } + if (list.length) { + target.addMark("sghuishi", 1, false); + for (var i of list) { + var info = lib.skill[i]; + if (info.filter && !info.charlotte && !info.sghuishi_filter) { + info.sghuishi_filter = info.filter; + info.filter = function (event, player) { + if (player.hasMark("sghuishi")) return true; + return this.sghuishi_filter.apply(this, arguments); + }; } } - } - else target.draw(4); + } else target.draw(4); player.loseMaxHp(2); }, - intro:{content:'发动非Charlotte觉醒技时无视条件'}, - ai:{ - order:0.1, - expose:0.2, - result:{ - target(player,target){ - if(player.hasUnknown()||player.maxHp<5) return 0; - var list=target.getSkills(null,false,false).filter(function(skill){ - var info=lib.skill[skill]; - return info&&info.juexingji; + intro: { content: "发动非Charlotte觉醒技时无视条件" }, + ai: { + order: 0.1, + expose: 0.2, + result: { + target(player, target) { + if (player.hasUnknown() || player.maxHp < 5) return 0; + var list = target.getSkills(null, false, false).filter(function (skill) { + var info = lib.skill[skill]; + return info && info.juexingji; }); - if(list.length||target.hasJudge('lebu')||target.hasSkillTag('nogain')) return 0; + if (list.length || target.hasJudge("lebu") || target.hasSkillTag("nogain")) + return 0; return 4; }, }, }, }, - zhanjiang:{ - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - var players=game.filterPlayer(); - for(var i=0;i0){ + zhanjiang: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && players[i].getEquips("qinggang").length > 0) { return true; } } }, - content(){ - var players=game.filterPlayer(); - for(var i=0;i0){ - player.line(players[i],'green'); - player.gain(e,players[i],'give','bySelf'); + content() { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player) { + var e = players[i].getEquips("qinggang"); + if (e.length > 0) { + player.line(players[i], "green"); + player.gain(e, players[i], "give", "bySelf"); } } } - } - }, - boss_juejing:{ - audio:'juejing', - audioname2:{ - dc_zhaoyun:'dcjuejing', }, - trigger:{player:'phaseDrawBefore'}, - forced:true, - content(){ + }, + boss_juejing: { + audio: "juejing", + audioname2: { + dc_zhaoyun: "dcjuejing", + }, + trigger: { player: "phaseDrawBefore" }, + forced: true, + content() { trigger.cancel(); }, - ai:{ - noh:true, - nogain:true, + ai: { + noh: true, + nogain: true, }, - group:'boss_juejing2' + group: "boss_juejing2", }, - boss_juejing2:{ - audio:'juejing', - audioname2:{ - dc_zhaoyun:'dcjuejing', + boss_juejing2: { + audio: "juejing", + audioname2: { + dc_zhaoyun: "dcjuejing", }, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter(event,player){ - if(event.name=='gain'&&event.player==player) return player.countCards('h')>4; - var evt=event.getl(player); - if(!evt||!evt.hs||evt.hs.length==0||player.countCards('h')>=4) return false; - var evt=event; - for(var i=0;i<4;i++){ - evt=evt.getParent('boss_juejing2'); - if(evt.name!='boss_juejing2') return true; + forced: true, + filter(event, player) { + if (event.name == "gain" && event.player == player) return player.countCards("h") > 4; + var evt = event.getl(player); + if (!evt || !evt.hs || evt.hs.length == 0 || player.countCards("h") >= 4) return false; + var evt = event; + for (var i = 0; i < 4; i++) { + evt = evt.getParent("boss_juejing2"); + if (evt.name != "boss_juejing2") return true; } return false; }, - content(){ - var num=4-player.countCards('h'); - if(num>0) player.draw(num); - else player.chooseToDiscard('h',true,-num); + content() { + var num = 4 - player.countCards("h"); + if (num > 0) player.draw(num); + else player.chooseToDiscard("h", true, -num); }, }, - dcjuejing:{audio:2}, - meihun:{ - audio:2, - trigger:{ - player:'phaseJieshuBegin', - target:'useCardToTargeted', + dcjuejing: { audio: 2 }, + meihun: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + target: "useCardToTargeted", }, - direct:true, - filter(event,player){ - if(event.name!='phaseJieshu'&&event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); + direct: true, + filter(event, player) { + if (event.name != "phaseJieshu" && event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); }); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('meihun'),function(card,player,target){ - return target!=player&&target.countCards('h')>0; - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0) return 0; - return 0.1-att/target.countCards('h'); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('meihun',target); - event.target=target; - player.chooseControl(lib.suit).set('prompt','请选择一种花色').set('ai',function(){ - return lib.suit.randomGet(); + content() { + "step 0"; + player + .chooseTarget(get.prompt2("meihun"), function (card, player, target) { + return target != player && target.countCards("h") > 0; }) - } - else event.finish(); - 'step 2' - var suit=result.control; - player.chat(get.translation(suit+2)); - game.log(player,'选择了','#y'+get.translation(suit+2)) - if(target.countCards('h',{suit:suit})){ - target.chooseCard('h','交给'+get.translation(player)+'一张'+get.translation(suit)+'花色的手牌',true,function(card,player){ - return get.suit(card,player)==_status.event.suit; - }).set('suit',suit); - } - else{ - player.discardPlayerCard(target,true,'h','visible'); + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return 0; + return 0.1 - att / target.countCards("h"); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("meihun", target); + event.target = target; + player + .chooseControl(lib.suit) + .set("prompt", "请选择一种花色") + .set("ai", function () { + return lib.suit.randomGet(); + }); + } else event.finish(); + ("step 2"); + var suit = result.control; + player.chat(get.translation(suit + 2)); + game.log(player, "选择了", "#y" + get.translation(suit + 2)); + if (target.countCards("h", { suit: suit })) { + target + .chooseCard( + "h", + "交给" + + get.translation(player) + + "一张" + + get.translation(suit) + + "花色的手牌", + true, + function (card, player) { + return get.suit(card, player) == _status.event.suit; + } + ) + .set("suit", suit); + } else { + player.discardPlayerCard(target, true, "h", "visible"); event.finish(); } - 'step 3' - if(result.bool&&result.cards&&result.cards.length) target.give(result.cards,player,'give'); + ("step 3"); + if (result.bool && result.cards && result.cards.length) + target.give(result.cards, player, "give"); }, }, //Connect Mode support after Angel Beats! -2nd beat- - huoxin:{ - audio:2, - enable:'phaseUse', - usable:1, - filter(event,player){ - if(game.countPlayer()<3) return false; - for(var i of lib.suit){ - if(player.countCards('h',{suit:i})>1) return true; + huoxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (game.countPlayer() < 3) return false; + for (var i of lib.suit) { + if (player.countCards("h", { suit: i }) > 1) return true; } return false; }, - complexCard:true, - position:'h', - filterCard(card,player){ - if(!ui.selected.cards.length){ - var suit=get.suit(card); - return player.countCards('h',function(card2){ - return card!=card2&&get.suit(card2,player)==suit; - })>0; + complexCard: true, + position: "h", + filterCard(card, player) { + if (!ui.selected.cards.length) { + var suit = get.suit(card); + return ( + player.countCards("h", function (card2) { + return card != card2 && get.suit(card2, player) == suit; + }) > 0 + ); } - return get.suit(card,player)==get.suit(ui.selected.cards[0],player); + return get.suit(card, player) == get.suit(ui.selected.cards[0], player); }, - selectCard:2, - selectTarget:2, - filterTarget:lib.filter.notMe, - multitarget:true, - multiline:true, - delay:false, - discard:false, - lose:false, - check(card){ - return 6-get.value(card); + selectCard: 2, + selectTarget: 2, + filterTarget: lib.filter.notMe, + multitarget: true, + multiline: true, + delay: false, + discard: false, + lose: false, + check(card) { + return 6 - get.value(card); }, - targetprompt:['拼点发起人','拼点目标'], - content(){ - 'step 0' - var list=[]; - for(var i=0;i1; + huoxin_control: { + audio: "huoxin", + forced: true, + trigger: { global: "phaseBeginStart" }, + filter(event, player) { + return ( + player != event.player && + !event.player._trueMe && + event.player.countMark("huoxin") > 1 + ); }, - logTarget:'player', - skillAnimation:true, - animationColor:'key', - content(){ - trigger.player.removeMark('huoxin',trigger.player.countMark('huoxin')); - trigger.player._trueMe=player; - game.addGlobalSkill('autoswap'); - if(trigger.player==game.me){ - game.notMe=true; - if(!_status.auto) ui.click.auto(); + logTarget: "player", + skillAnimation: true, + animationColor: "key", + content() { + trigger.player.removeMark("huoxin", trigger.player.countMark("huoxin")); + trigger.player._trueMe = player; + game.addGlobalSkill("autoswap"); + if (trigger.player == game.me) { + game.notMe = true; + if (!_status.auto) ui.click.auto(); } - trigger.player.addSkill('huoxin2'); + trigger.player.addSkill("huoxin2"); }, }, - huoxin2:{ - trigger:{ - player:['phaseAfter','dieAfter'], - global:'phaseBeforeStart', + huoxin2: { + trigger: { + player: ["phaseAfter", "dieAfter"], + global: "phaseBeforeStart", }, - lastDo:true, - charlotte:true, - forceDie:true, - forced:true, - silent:true, - content(){ - player.removeSkill('huoxin2'); + lastDo: true, + charlotte: true, + forceDie: true, + forced: true, + silent: true, + content() { + player.removeSkill("huoxin2"); }, - onremove(player){ - if(player==game.me){ - if(!game.notMe) game.swapPlayerAuto(player._trueMe) + onremove(player) { + if (player == game.me) { + if (!game.notMe) game.swapPlayerAuto(player._trueMe); else delete game.notMe; - if(_status.auto) ui.click.auto(); + if (_status.auto) ui.click.auto(); } delete player._trueMe; }, }, - shiki_omusubi:{ - audio:2, - trigger:{global:'roundStart'}, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('shiki_omusubi'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(player.isHealthy()) return 0; - if(player.hp<3&&player.getDamagedHp()<2) return 0; - var list=[]; - if(lib.character[target.name]) list.addArray(lib.character[target.name][3]); - if(lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); - if(lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); - list=list.filter(function(i){ + shiki_omusubi: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content() { + "step 0"; + player + .chooseTarget(get.prompt2("shiki_omusubi"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + if (player.isHealthy()) return 0; + if (player.hp < 3 && player.getDamagedHp() < 2) return 0; + var list = []; + if (lib.character[target.name]) list.addArray(lib.character[target.name][3]); + if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); + if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); + list = list.filter(function (i) { return !player.hasSkill(i); }); - if(!list.length) return 0; - return 1+Math.random(); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('shiki_omusubi',target); + if (!list.length) return 0; + return 1 + Math.random(); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("shiki_omusubi", target); player.loseMaxHp(); - var list=[]; - if(lib.character[target.name]) list.addArray(lib.character[target.name][3]); - if(lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); - if(lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); + var list = []; + if (lib.character[target.name]) list.addArray(lib.character[target.name][3]); + if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]); + if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]); player.addSkills(list); - game.broadcastAll(function(list){ + game.broadcastAll(function (list) { lib.character.key_shiki[3].addArray(list); game.expandSkills(list); - for(var i of list){ - var info=lib.skill[i]; - if(!info) continue; - if(!info.audioname2) info.audioname2={}; - info.audioname2.key_shiki='shiki_omusubi'; + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.key_shiki = "shiki_omusubi"; } - },list); + }, list); } }, }, - kagari_zongsi:{ - enable:'phaseUse', - usable:1, - content(){ - 'step 0' - var controls=[]; - if(ui.cardPile.hasChildNodes()) controls.push('选择牌堆中的一张牌'); - if(ui.discardPile.hasChildNodes()) controls.push('选择弃牌堆中的一张牌'); - if(game.hasPlayer(function(current){ - return current.countCards('hej')>0; - })) controls.push('选择一名角色区域内的一张牌'); - if(!controls.length){event.finish();return;} - event.controls=controls; - var next=player.chooseControl(); - next.set('choiceList',controls) - next.set('prompt','请选择要移动的卡牌的来源'); - next.ai=function(){return 0}; - 'step 1' - result.control=event.controls[result.index]; - var list=['弃牌堆','牌堆','角色']; - for(var i=0;i 0; + }) + ) + controls.push("选择一名角色区域内的一张牌"); + if (!controls.length) { + event.finish(); + return; } - if(event.index==2){ - player.chooseTarget('请选择要移动的卡牌的来源',true,function(card,kagari,target){ - return target.countCards('hej')>0; - }); + event.controls = controls; + var next = player.chooseControl(); + next.set("choiceList", controls); + next.set("prompt", "请选择要移动的卡牌的来源"); + next.ai = function () { + return 0; + }; + ("step 1"); + result.control = event.controls[result.index]; + var list = ["弃牌堆", "牌堆", "角色"]; + for (var i = 0; i < list.length; i++) { + if (result.control.indexOf(list[i]) != -1) { + event.index = i; + break; + } } - else{ - var source=ui[event.index==0?'discardPile':'cardPile'].childNodes; - var list=[]; - for(var i=0;i 0; + } + ); + } else { + var source = ui[event.index == 0 ? "discardPile" : "cardPile"].childNodes; + var list = []; + for (var i = 0; i < source.length; i++) list.push(source[i]); + player.chooseButton(["请选择要移动的卡牌", list], true).ai = get.buttonValue; } - 'step 2' - if(event.index==2){ + ("step 2"); + if (event.index == 2) { player.line(result.targets[0]); - event.target1=result.targets[0]; - player.choosePlayerCard(result.targets[0],true,'hej').set('visible',true); + event.target1 = result.targets[0]; + player.choosePlayerCard(result.targets[0], true, "hej").set("visible", true); + } else { + event.card = result.links[0]; } - else{ - event.card=result.links[0]; - } - 'step 3' - if(event.index==2) event.card=result.cards[0]; - var controls=[ - '将这张牌移动到牌堆的顶部或者底部', - '将这张牌移动到弃牌堆的顶部或者底部', - '将这张牌移动到一名角色对应的区域里', + ("step 3"); + if (event.index == 2) event.card = result.cards[0]; + var controls = [ + "将这张牌移动到牌堆的顶部或者底部", + "将这张牌移动到弃牌堆的顶部或者底部", + "将这张牌移动到一名角色对应的区域里", ]; - event.controls=controls; - var next=player.chooseControl(); - next.set('prompt','要对'+get.translation(event.card)+'做什么呢?'); - next.set('choiceList',controls); - next.ai=function(){return 2}; - 'step 4' - result.control=event.controls[result.index]; - var list=['弃牌堆','牌堆','角色']; - for(var i=0;i0; + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h", lib.skill.caopi_xingdong.filterCard) > 0; }, - filterCard(card){ - return card.name=='sha'||get.type(card)=='trick'; + filterCard(card) { + return card.name == "sha" || get.type(card) == "trick"; }, - check(card){return 1}, - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:0, - content(){ - 'step 0' - player.give(cards,target); - 'step 1' - if(!target.getCards('h').includes(cards[0])) event._result={bool:false}; - else target.chooseUseTarget(cards[0],game.filterPlayer(function(current){ - return current!=player; - }),'请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段'); - 'step 2' - if(result.bool) game.asyncDraw([player,target]); - else{ - target.addTempSkill('caopi_xingdong_mark','phaseJudgeSkipped'); - target.skip('phaseJudge'); - target.skip('phaseDraw'); + check(card) { + return 1; + }, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: 0, + content() { + "step 0"; + player.give(cards, target); + ("step 1"); + if (!target.getCards("h").includes(cards[0])) event._result = { bool: false }; + else + target.chooseUseTarget( + cards[0], + game.filterPlayer(function (current) { + return current != player; + }), + "请使用得到的牌,或者跳过下回合的判定阶段和摸牌阶段" + ); + ("step 2"); + if (result.bool) game.asyncDraw([player, target]); + else { + target.addTempSkill("caopi_xingdong_mark", "phaseJudgeSkipped"); + target.skip("phaseJudge"); + target.skip("phaseDraw"); event.finish(); } - 'step 3' + ("step 3"); game.delay(); }, - ai:{ - order:12, - result:{ - target(player,target){ - var card=ui.selected.cards[0]; - if(target.hasSkill('pingkou')) return 1; - if(!card) return 0; - var info=get.info(card); - if(info.selectTarget==-1){ - var eff=0; - game.countPlayer(function(current){ - if(current!=player&&target.canUse(card,current)) eff+=get.effect(current,card,target,target)>0 + ai: { + order: 12, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (target.hasSkill("pingkou")) return 1; + if (!card) return 0; + var info = get.info(card); + if (info.selectTarget == -1) { + var eff = 0; + game.countPlayer(function (current) { + if (current != player && target.canUse(card, current)) + eff += get.effect(current, card, target, target) > 0; }); - if(eff>0||get.value(card)<3) return eff; + if (eff > 0 || get.value(card) < 3) return eff; return 0; - } - else if(game.hasPlayer(function(current){ - return current!=player&&target.canUse(card,current)&&get.effect(current,card,target,target)>0 - })) return 1.5; - else if(get.value(card)<3) return -1; + } else if ( + game.hasPlayer(function (current) { + return ( + current != player && + target.canUse(card, current) && + get.effect(current, card, target, target) > 0 + ); + }) + ) + return 1.5; + else if (get.value(card) < 3) return -1; return 0; }, }, }, }, - shenfu:{ - audio:2, - trigger:{player:'phaseEnd'}, - direct:true, - content(){ - 'step 0' - event.logged=false; - event.targets=[]; - event.goto(player.countCards('h')%2==1?1:4); - 'step 1' - player.chooseTarget(get.prompt('shenfu'),'对一名其他角色造成1点雷属性伤害',function(card,player,target){ - return target!=player&&!_status.event.getParent().targets.includes(target); - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player,'thunder')*(target.hp==1?2:1); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - if(!event.logged){ - event.logged=true; - player.logSkill('shenfu',target,'thunder'); - } - else player.line(target,'thunder'); + shenfu: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + content() { + "step 0"; + event.logged = false; + event.targets = []; + event.goto(player.countCards("h") % 2 == 1 ? 1 : 4); + ("step 1"); + player + .chooseTarget( + get.prompt("shenfu"), + "对一名其他角色造成1点雷属性伤害", + function (card, player, target) { + return ( + target != player && !_status.event.getParent().targets.includes(target) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return ( + get.damageEffect(target, player, player, "thunder") * (target.hp == 1 ? 2 : 1) + ); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + if (!event.logged) { + event.logged = true; + player.logSkill("shenfu", target, "thunder"); + } else player.line(target, "thunder"); event.targets.push(target); - target.damage('thunder'); - } + target.damage("thunder"); + } else event.finish(); + ("step 3"); + if ( + target.getHistory("damage", function (evt) { + return evt.getParent("shenfu") == event && evt._dyinged; + }).length + ) + event.goto(1); else event.finish(); - 'step 3' - if(target.getHistory('damage',function(evt){ - return evt.getParent('shenfu')==event&&evt._dyinged; - }).length) event.goto(1); - else event.finish(); - 'step 4' - player.chooseTarget(get.prompt('shenfu'),'令一名角色摸一张牌或弃置其一张手牌',function(card,player,target){ - return !_status.event.getParent().targets.includes(target); - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - var delta=target.hp-target.countCards('h'); - if(Math.abs(delta)==1&&get.sgn(delta)==get.sgn(att)) return 3*Math.abs(att); - if(att>0||target.countCards('h')>0) return Math.abs(att); - return 0; - }); - 'step 5' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - if(!event.logged){ - event.logged=true; - player.logSkill('shenfu',target); - } - else player.line(target,'green'); + ("step 4"); + player + .chooseTarget( + get.prompt("shenfu"), + "令一名角色摸一张牌或弃置其一张手牌", + function (card, player, target) { + return !_status.event.getParent().targets.includes(target); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var delta = target.hp - target.countCards("h"); + if (Math.abs(delta) == 1 && get.sgn(delta) == get.sgn(att)) + return 3 * Math.abs(att); + if (att > 0 || target.countCards("h") > 0) return Math.abs(att); + return 0; + }); + ("step 5"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + if (!event.logged) { + event.logged = true; + player.logSkill("shenfu", target); + } else player.line(target, "green"); event.targets.push(target); - if(target.countCards('h')==0) event._result={index:0}; - else player.chooseControl('摸一张牌','弃置一张手牌').set('prompt','选择一项令'+get.translation(target)+'执行…').set('goon',get.attitude(player,target)>0?0:1).set('ai',()=>_status.event.goon); + if (target.countCards("h") == 0) event._result = { index: 0 }; + else + player + .chooseControl("摸一张牌", "弃置一张手牌") + .set("prompt", "选择一项令" + get.translation(target) + "执行…") + .set("goon", get.attitude(player, target) > 0 ? 0 : 1) + .set("ai", () => _status.event.goon); //else player.discardPlayerCard(target,'h','弃置'+get.translation(target)+'一张手牌,或点【取消】令其摸一张牌。'); - } - else event.finish(); - 'step 6' - if(result.index==0) target.draw(); - else target.chooseToDiscard('h',true); - 'step 7' - if(target.hp==target.countCards('h')) event.goto(4); + } else event.finish(); + ("step 6"); + if (result.index == 0) target.draw(); + else target.chooseToDiscard("h", true); + ("step 7"); + if (target.hp == target.countCards("h")) event.goto(4); }, - ai:{expose:0.25}, + ai: { expose: 0.25 }, }, - qixian:{ - mod:{ - maxHandcardBase(player,num){ + qixian: { + mod: { + maxHandcardBase(player, num) { return 7; }, }, }, - chuyuan:{ - audio:2, - trigger:{global:'damageEnd'}, - filter(event,player){ - return event.player.isIn()&&player.getExpansions('chuyuan').length=3; + dengji: { + audio: 2, + derivation: [ + "tianxing", + "new_rejianxiong", + "rerende", + "rezhiheng", + "olluanji", + "caopi_xingdong", + ], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter(event, player) { + return player.getExpansions("chuyuan").length >= 3; }, - content(){ + content() { player.awakenSkill(event.name); - player.addSkills(['tianxing','new_rejianxiong']); + player.addSkills(["tianxing", "new_rejianxiong"]); player.loseMaxHp(); - player.gain(player.getExpansions('chuyuan'),'gain2','fromStorage'); + player.gain(player.getExpansions("chuyuan"), "gain2", "fromStorage"); + }, + ai: { + combo: "chuyuan", }, - ai:{ - combo:'chuyuan' - } }, - tianxing:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - unique:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - filter(event,player){ - return player.getExpansions('chuyuan').length>=3; + tianxing: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter(event, player) { + return player.getExpansions("chuyuan").length >= 3; }, - content(){ - 'step 0' + content() { + "step 0"; player.awakenSkill(event.name); player.loseMaxHp(); - player.gain(player.getExpansions('chuyuan'),'gain2','fromStorage'); - "step 1" - player.removeSkills('chuyuan'); - player.chooseControl('rerende','rezhiheng','olluanji','caopi_xingdong').set('prompt','选择获得一个技能').set('ai',function(){ - var player=_status.event.player; - if(!player.hasSkill('luanji')&&!player.hasSkill('olluanji')&&player.getUseValue({name:'wanjian'})>4) return 'olluanji'; - if(!player.hasSkill('rezhiheng')) return 'rezhiheng'; - if(!player.hasSkill('caopi_xingdong')) return 'caopi_xingdong'; - return 'rerende'; - }); - 'step 2' + player.gain(player.getExpansions("chuyuan"), "gain2", "fromStorage"); + ("step 1"); + player.removeSkills("chuyuan"); + player + .chooseControl("rerende", "rezhiheng", "olluanji", "caopi_xingdong") + .set("prompt", "选择获得一个技能") + .set("ai", function () { + var player = _status.event.player; + if ( + !player.hasSkill("luanji") && + !player.hasSkill("olluanji") && + player.getUseValue({ name: "wanjian" }) > 4 + ) + return "olluanji"; + if (!player.hasSkill("rezhiheng")) return "rezhiheng"; + if (!player.hasSkill("caopi_xingdong")) return "caopi_xingdong"; + return "rerende"; + }); + ("step 2"); player.addSkills(result.control); }, - ai:{ - combo:'chuyuan' - } + ai: { + combo: "chuyuan", + }, }, - olzhiti:{ - audio:'drlt_zhiti', - global:'olzhiti2', - mod:{ - maxHandcard(player,num){ - if(game.hasPlayer(function(current){ - return current.isDamaged(); - })) return num+1; + olzhiti: { + audio: "drlt_zhiti", + global: "olzhiti2", + mod: { + maxHandcard(player, num) { + if ( + game.hasPlayer(function (current) { + return current.isDamaged(); + }) + ) + return num + 1; }, }, - trigger:{player:['phaseDrawBegin2','phaseEnd']}, - forced:true, - filter(event,player){ - var num=event.name=='phase'?5:3; - if(num==3?event.numFixed:!game.hasPlayer(function(current){ - return current.hasEnabledSlot(); - })) return false; - return game.countPlayer(function(current){ - return current.isDamaged(); - })>=num; + trigger: { player: ["phaseDrawBegin2", "phaseEnd"] }, + forced: true, + filter(event, player) { + var num = event.name == "phase" ? 5 : 3; + if ( + num == 3 + ? event.numFixed + : !game.hasPlayer(function (current) { + return current.hasEnabledSlot(); + }) + ) + return false; + return ( + game.countPlayer(function (current) { + return current.isDamaged(); + }) >= num + ); }, - direct:true, - content(){ - 'step 0' - if(trigger.name=='phaseDraw'){ - player.logSkill('olzhiti'); + direct: true, + content() { + "step 0"; + if (trigger.name == "phaseDraw") { + player.logSkill("olzhiti"); trigger.num++; event.finish(); + } else { + player + .chooseTarget( + get.prompt("olzhiti"), + "废除一名角色的一个随机装备栏", + function (card, player, target) { + return target.hasEnabledSlot(); + } + ) + .set("ai", function (target) { + return ( + -get.attitude(_status.event.player, target) * (target.countCards("e") + 1) + ); + }); } - else{ - player.chooseTarget(get.prompt('olzhiti'),'废除一名角色的一个随机装备栏',function(card,player,target){ - return target.hasEnabledSlot(); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)*(target.countCards('e')+1) - }); - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('olzhiti',target); - var list=[]; - for(var i=1;i<6;i++){ - if(target.hasEnabledSlot(i)) list.add((i==3||i==4)?6:i); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olzhiti", target); + var list = []; + for (var i = 1; i < 6; i++) { + if (target.hasEnabledSlot(i)) list.add(i == 3 || i == 4 ? 6 : i); } - var num=list.randomGet(); - if(num!=6) target.disableEquip(num); - else{ - target.disableEquip(3,4); + var num = list.randomGet(); + if (num != 6) target.disableEquip(num); + else { + target.disableEquip(3, 4); } } }, }, - olzhiti2:{ - mod:{ - maxHandcard(player,num){ - if(player.isDamaged()) return num-game.countPlayer(function(current){ - return current.hasSkill('olzhiti')&¤t.inRange(player); - }) + olzhiti2: { + mod: { + maxHandcard(player, num) { + if (player.isDamaged()) + return ( + num - + game.countPlayer(function (current) { + return current.hasSkill("olzhiti") && current.inRange(player); + }) + ); }, }, }, - olduorui:{ - audio:'drlt_duorui', - trigger:{ - source:'damageSource' + olduorui: { + audio: "drlt_duorui", + trigger: { + source: "damageSource", }, - filter(event,player){ - if(!player.isPhaseUsing()||event.player.isDead()) return false; - for(var i in event.player.disabledSkills){ - if(event.player.disabledSkills[i].includes('olduorui2')) return false; + filter(event, player) { + if (!player.isPhaseUsing() || event.player.isDead()) return false; + for (var i in event.player.disabledSkills) { + if (event.player.disabledSkills[i].includes("olduorui2")) return false; } - var list=[]; - var listm=[]; - var listv=[]; - if(event.player.name1!=undefined) listm=lib.character[event.player.name1][3]; - else listm=lib.character[event.player.name][3]; - if(event.player.name2!=undefined) listv=lib.character[event.player.name2][3]; - listm=listm.concat(listv); - var func=function(skill){ - var info=get.info(skill); - if(!info||info.charlotte) return false; + var list = []; + var listm = []; + var listv = []; + if (event.player.name1 != undefined) listm = lib.character[event.player.name1][3]; + else listm = lib.character[event.player.name][3]; + if (event.player.name2 != undefined) listv = lib.character[event.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; return true; }; - for(var i=0;i0; + return list.length > 0; }, - check(event,player){ - if(get.attitude(_status.event.player,event.player)>=0) return false; - if(event.getParent('phaseUse').skipped) return true; - var nd=player.needsToDiscard(); - return player.countCards('h',function(card){ - return player.getUseValue(card,null,true)>0&&(nd?true:get.tag(card,'damage')>0); - })==0; + check(event, player) { + if (get.attitude(_status.event.player, event.player) >= 0) return false; + if (event.getParent("phaseUse").skipped) return true; + var nd = player.needsToDiscard(); + return ( + player.countCards("h", function (card) { + return ( + player.getUseValue(card, null, true) > 0 && + (nd ? true : get.tag(card, "damage") > 0) + ); + }) == 0 + ); }, - logTarget:'player', - content(){ - 'step 0' - var list=[]; - var listm=[]; - var listv=[]; - if(trigger.player.name1!=undefined) listm=lib.character[trigger.player.name1][3]; - else listm=lib.character[trigger.player.name][3]; - if(trigger.player.name2!=undefined) listv=lib.character[trigger.player.name2][3]; - listm=listm.concat(listv); - var func=function(skill){ - var info=get.info(skill); - if(!info||info.charlotte) return false; + logTarget: "player", + content() { + "step 0"; + var list = []; + var listm = []; + var listv = []; + if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; + else listm = lib.character[trigger.player.name][3]; + if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; return true; }; - for(var i=0;i{ - if(!get.tag(card,'damage')||!target.hasFriend()) return; - if(player.hasSkillTag('jueqing',null,target)) return 1.7; - let die=[null,1],temp; - game.filterPlayer(i=>{ - temp=i.countMark('new_wuhun'); - if(i===player&&target.hp+target.hujia>1) temp++; - if(temp>=die[1]){ - if(!die[0]) die=[i,temp]; - else{ - let att=get.attitude(player,i); - if(att { + if (!get.tag(card, "damage") || !target.hasFriend()) return; + if (player.hasSkillTag("jueqing", null, target)) return 1.7; + let die = [null, 1], + temp; + game.filterPlayer((i) => { + temp = i.countMark("new_wuhun"); + if (i === player && target.hp + target.hujia > 1) temp++; + if (temp >= die[1]) { + if (!die[0]) die = [i, temp]; + else { + let att = get.attitude(player, i); + if (att < die[1]) die = [i, temp]; } } }); - if(die[0]) return [1,0,1,-6*get.sgnAttitude(player,die[0])/Math.max(1,target.hp)]; - } - } + if (die[0]) + return [ + 1, + 0, + 1, + (-6 * get.sgnAttitude(player, die[0])) / Math.max(1, target.hp), + ]; + }, + }, }, - marktext:'魇', - intro:{ - name:'梦魇', - content:'mark', - onunmark:true, + marktext: "魇", + intro: { + name: "梦魇", + content: "mark", + onunmark: true, }, - subSkill:{ - die:{ - audio:'wuhun2', - trigger:{player:'die'}, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.hasMark('new_wuhun'); + subSkill: { + die: { + audio: "wuhun2", + trigger: { player: "die" }, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.hasMark("new_wuhun"); }); }, - forced:true, - direct:true, - forceDie:true, - skillAnimation:true, - animationColor:'soil', - content(){ - 'step 0' - var num=0; - for(var i=0;inum){ - num=current.countMark('new_wuhun'); + forced: true, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + content() { + "step 0"; + var num = 0; + for (var i = 0; i < game.players.length; i++) { + var current = game.players[i]; + if (current != player && current.countMark("new_wuhun") > num) { + num = current.countMark("new_wuhun"); } } - player.chooseTarget(true,'请选择【武魂】的目标','令其进行判定,若判定结果不为【桃】或【桃园结义】,则其死亡',function(card,player,target){ - return target!=player&&target.countMark('new_wuhun')==_status.event.num; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }).set('forceDie',true).set('num',num); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('new_wuhun_die',target); - player.line(target,{color:[255, 255, 0]}); + player + .chooseTarget( + true, + "请选择【武魂】的目标", + "令其进行判定,若判定结果不为【桃】或【桃园结义】,则其死亡", + function (card, player, target) { + return ( + target != player && + target.countMark("new_wuhun") == _status.event.num + ); + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }) + .set("forceDie", true) + .set("num", num); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("new_wuhun_die", target); + player.line(target, { color: [255, 255, 0] }); game.delay(2); } - 'step 2' - target.judge(function(card){ - if(['tao','taoyuan'].includes(card.name)) return 10; + ("step 2"); + target.judge(function (card) { + if (["tao", "taoyuan"].includes(card.name)) return 10; return -10; - }).judge2=function(result){ - return result.bool==false?true:false; + }).judge2 = function (result) { + return result.bool == false ? true : false; }; - 'step 3' - if(!result.bool) target.die(); + ("step 3"); + if (!result.bool) target.die(); }, }, }, }, - "new_guixin":{ - audio:"guixin", - trigger:{ - player:"damageEnd", + new_guixin: { + audio: "guixin", + trigger: { + player: "damageEnd", }, - check (event,player){ - if(player.isTurnedOver()||event.num>1) return true; - var num=game.countPlayer(function(current){ - if(current.countCards('he')&¤t!=player&&get.attitude(player,current)<=0){ + check(event, player) { + if (player.isTurnedOver() || event.num > 1) return true; + var num = game.countPlayer(function (current) { + if ( + current.countCards("he") && + current != player && + get.attitude(player, current) <= 0 + ) { return true; } - if(current.countCards('j')&¤t!=player&&get.attitude(player,current)>0){ + if ( + current.countCards("j") && + current != player && + get.attitude(player, current) > 0 + ) { return true; } }); - return num>=2; + return num >= 2; }, - content (){ - "step 0" - var targets=game.filterPlayer(); + content() { + "step 0"; + var targets = game.filterPlayer(); targets.remove(player); targets.sort(lib.sort.seat); - event.targets=targets; - event.count=trigger.num; - "step 1" - event.num=0; - player.line(targets,'green'); - player.chooseControl('手牌区','装备区','判定区').set('ai',function(){ - if(game.hasPlayer(function(current){ - return current.countCards('j')&¤t!=player&&get.attitude(player,current)>0; - })) return 2; - return Math.floor(Math.random()*3); - }).set('prompt','请选择优先获得的区域'); - "step 2" - event.range={ - 手牌区:['h','e','j'], - 装备区:['e','h','j'], - 判定区:['j','h','e'], - }[result.control||'手牌区']; - "step 3" - if(num 0 + ); + }) + ) + return 2; + return Math.floor(Math.random() * 3); + }) + .set("prompt", "请选择优先获得的区域"); + ("step 2"); + event.range = { + 手牌区: ["h", "e", "j"], + 装备区: ["e", "h", "j"], + 判定区: ["j", "h", "e"], + }[result.control || "手牌区"]; + ("step 3"); + if (num < event.targets.length) { + var target = event.targets[num]; + var range = event.range; + for (var i = 0; i < range.length; i++) { + var cards = target.getCards(range[i]); + if (cards.length) { + var card = cards.randomGet(); + player.gain(card, target, "giveAuto", "bySelf"); break; } } event.num++; } - "step 4" - if(num(player.hasSkillTag('damageBonus',true,{ - card:card, - target:target - })?2:1)){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - target._new_guixin_eff=true; - let gain=game.countPlayer(function(current){ - if(target==current) return 0; - if(get.attitude(target,current)>0){ - if(current.hasCard((cardx)=>lib.filter.canBeGained(cardx,target,current,'new_guixin')&&get.effect(current,cardx,current,current)<0,'j')) return 1.3; + effect: { + target(card, player, target) { + if ( + !target._new_guixin_eff && + get.tag(card, "damage") && + target.hp > + (player.hasSkillTag("damageBonus", true, { + card: card, + target: target, + }) + ? 2 + : 1) + ) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + target._new_guixin_eff = true; + let gain = game.countPlayer(function (current) { + if (target == current) return 0; + if (get.attitude(target, current) > 0) { + if ( + current.hasCard( + (cardx) => + lib.filter.canBeGained( + cardx, + target, + current, + "new_guixin" + ) && get.effect(current, cardx, current, current) < 0, + "j" + ) + ) + return 1.3; return 0; } - if(current.hasCard((cardx)=>lib.filter.canBeGained(cardx,target,current,'new_guixin')&&get.effect(current,cardx,current,current)>0,'e')) return 1.1; - if(current.hasCard((cardx)=>lib.filter.canBeGained(cardx,target,current,'new_guixin'),'h')) return 0.9; + if ( + current.hasCard( + (cardx) => + lib.filter.canBeGained( + cardx, + target, + current, + "new_guixin" + ) && get.effect(current, cardx, current, current) > 0, + "e" + ) + ) + return 1.1; + if ( + current.hasCard( + (cardx) => + lib.filter.canBeGained(cardx, target, current, "new_guixin"), + "h" + ) + ) + return 0.9; return 0; }); - if(target.isTurnedOver()) gain+=2.3; - else gain-=2.3; + if (target.isTurnedOver()) gain += 2.3; + else gain -= 2.3; delete target._new_guixin_eff; - return [1,Math.max(0,gain)]; + return [1, Math.max(0, gain)]; } - } - } + }, + }, }, }, - ol_shenfen:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return player.countMark('baonu')>=6; + ol_shenfen: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countMark("baonu") >= 6; }, - usable:1, - skillAnimation:true, - animationColor:'metal', - content(){ - "step 0" - event.delay=false; - player.removeMark('baonu',6); - event.targets=game.filterPlayer(); + usable: 1, + skillAnimation: true, + animationColor: "metal", + content() { + "step 0"; + event.delay = false; + player.removeMark("baonu", 6); + event.targets = game.filterPlayer(); event.targets.remove(player); event.targets.sort(lib.sort.seat); - player.line(event.targets,'green'); - event.targets2=event.targets.slice(0); - event.targets3=event.targets.slice(0); - "step 1" - if(event.targets2.length){ - event.targets2.shift().damage('nocard'); + player.line(event.targets, "green"); + event.targets2 = event.targets.slice(0); + event.targets3 = event.targets.slice(0); + ("step 1"); + if (event.targets2.length) { + event.targets2.shift().damage("nocard"); event.redo(); } - "step 2" - if(event.targets.length){ - event.current=event.targets.shift() - if(event.current.countCards('e')) event.delay=true; - event.current.discard(event.current.getCards('e')).delay=false; + ("step 2"); + if (event.targets.length) { + event.current = event.targets.shift(); + if (event.current.countCards("e")) event.delay = true; + event.current.discard(event.current.getCards("e")).delay = false; } - "step 3" - if(event.delay) game.delay(0.5); - event.delay=false; - if(event.targets.length) event.goto(2); - "step 4" - if(event.targets3.length){ - var target=event.targets3.shift(); - target.chooseToDiscard(4,'h',true).delay=false; - if(target.countCards('h')) event.delay=true; + ("step 3"); + if (event.delay) game.delay(0.5); + event.delay = false; + if (event.targets.length) event.goto(2); + ("step 4"); + if (event.targets3.length) { + var target = event.targets3.shift(); + target.chooseToDiscard(4, "h", true).delay = false; + if (target.countCards("h")) event.delay = true; } - "step 5" - if(event.delay) game.delay(0.5); - event.delay=false; - if(event.targets3.length) event.goto(4); - "step 6" + ("step 5"); + if (event.delay) game.delay(0.5); + event.delay = false; + if (event.targets3.length) event.goto(4); + ("step 6"); player.turnOver(); }, - ai:{ - combo:'baonu', - order:10, - result:{ - player(player){ - return game.countPlayer(function(current){ - if(current!=player){ - return get.sgn(get.damageEffect(current,player,player)); + ai: { + combo: "baonu", + order: 10, + result: { + player(player) { + return game.countPlayer(function (current) { + if (current != player) { + return get.sgn(get.damageEffect(current, player, player)); } }); - } - } - } + }, + }, + }, }, - ol_wuqian:{ - audio:2, - enable:'phaseUse', - derivation:'wushuang', - filter(event,player){ - return player.countMark('baonu')>=2&&game.hasPlayer(target=>lib.skill.ol_wuqian.filterTarget(null,player,target)); + ol_wuqian: { + audio: 2, + enable: "phaseUse", + derivation: "wushuang", + filter(event, player) { + return ( + player.countMark("baonu") >= 2 && + game.hasPlayer((target) => lib.skill.ol_wuqian.filterTarget(null, player, target)) + ); }, - filterTarget(card,player,target){ - return target!=player&&!target.hasSkill('ol_wuqian_targeted'); + filterTarget(card, player, target) { + return target != player && !target.hasSkill("ol_wuqian_targeted"); }, - content(){ - player.removeMark('baonu',2); - player.addTempSkills('wushuang'); - player.popup('无双'); + content() { + player.removeMark("baonu", 2); + player.addTempSkills("wushuang"); + player.popup("无双"); // game.log(player,'获得了技能','#g【无双】'); - target.addTempSkill('ol_wuqian_targeted'); + target.addTempSkill("ol_wuqian_targeted"); }, - ai:{ - order:9, - result:{ - target(player,target){ - if(player.countCards('hs',card=>{ - if(!player.getCardUsable({name:card.name})) return false; - if(!player.canUse(card,target)) return false; - var eff1=get.effect(target,card,player,player); - _status.baonuCheck=true; - var eff2=get.effect(target,card,player,player); - delete _status.baonuCheck; - return eff2>Math.max(0,eff1); - })) return -1; + ai: { + order: 9, + result: { + target(player, target) { + if ( + player.countCards("hs", (card) => { + if (!player.getCardUsable({ name: card.name })) return false; + if (!player.canUse(card, target)) return false; + var eff1 = get.effect(target, card, player, player); + _status.baonuCheck = true; + var eff2 = get.effect(target, card, player, player); + delete _status.baonuCheck; + return eff2 > Math.max(0, eff1); + }) + ) + return -1; return 0; }, }, - combo:'baonu' + combo: "baonu", }, - global:'ol_wuqian_ai', - subSkill:{ - targeted:{ - charlotte:true, - ai:{unequip2:true}, + global: "ol_wuqian_ai", + subSkill: { + targeted: { + charlotte: true, + ai: { unequip2: true }, }, - ai:{ - ai:{ - unequip2:true, - skillTagFilter(player){ - if(!_status.baonuCheck) return false; + ai: { + ai: { + unequip2: true, + skillTagFilter(player) { + if (!_status.baonuCheck) return false; }, }, }, }, }, - wumou:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter(event){ - return get.type(event.card)=='trick'; + wumou: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter(event) { + return get.type(event.card) == "trick"; }, - content(){ - 'step 0' - if(player.hasMark('baonu')){ - player.chooseControlList([ - '移去一枚【暴怒】标记', - '失去1点体力' - ],true).set('ai',function(event,player){ - if(get.effect(player,{name:'losehp'},player,player)>=0) return 1; - if(player.storage.baonu>6) return 0; - if(player.hp+player.num('h','tao')>3) return 1; - return 0; - }); - } - else{ + content() { + "step 0"; + if (player.hasMark("baonu")) { + player + .chooseControlList(["移去一枚【暴怒】标记", "失去1点体力"], true) + .set("ai", function (event, player) { + if (get.effect(player, { name: "losehp" }, player, player) >= 0) return 1; + if (player.storage.baonu > 6) return 0; + if (player.hp + player.num("h", "tao") > 3) return 1; + return 0; + }); + } else { player.loseHp(); event.finish(); } - 'step 1' - if(result.index==0){ - player.removeMark('baonu',1); - } - else{ + ("step 1"); + if (result.index == 0) { + player.removeMark("baonu", 1); + } else { player.loseHp(); } }, - ai:{ - effect:{ - player_use(card,player){ - if (get.type(card)=='trick'&&get.value(card)<6){ - return [0,-2]; + ai: { + effect: { + player_use(card, player) { + if (get.type(card) == "trick" && get.value(card) < 6) { + return [0, -2]; } - } + }, }, - neg:true - } - }, - qinyin:{ - audio:2, - trigger:{player:'phaseDiscardEnd'}, - direct:true, - filter(event,player){ - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2); - }); - return cards.length>1; + neg: true, }, - content(){ - "step 0" - event.forceDie=true; - if(typeof event.count!='number'){ + }, + qinyin: { + audio: 2, + trigger: { player: "phaseDiscardEnd" }, + direct: true, + filter(event, player) { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) + cards.addArray(evt.cards2); + }); + return cards.length > 1; + }, + content() { + "step 0"; + event.forceDie = true; + if (typeof event.count != "number") { // event.count=trigger.cards.length-1; - event.count=1; + event.count = 1; } - var recover=0,lose=0,players=game.filterPlayer(); - for(var i=0;i0){ - if(players[i].hp<2){ + var recover = 0, + lose = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].hp < players[i].maxHp) { + if (get.attitude(player, players[i]) > 0) { + if (players[i].hp < 2) { lose--; - recover+=0.5; + recover += 0.5; } lose--; recover++; - } - else if(get.attitude(player,players[i])<0){ - if(players[i].hp<2){ + } else if (get.attitude(player, players[i]) < 0) { + if (players[i].hp < 2) { lose++; - recover-=0.5; + recover -= 0.5; } lose++; recover--; } - } - else{ - if(get.attitude(player,players[i])>0){ + } else { + if (get.attitude(player, players[i]) > 0) { lose--; - } - else if(get.attitude(player,players[i])<0){ + } else if (get.attitude(player, players[i]) < 0) { lose++; } } } - var prompt=get.prompt('qinyin')+'(剩余'+get.cnNumber(event.count)+'次)'; - player.chooseControl('失去体力','回复体力','cancel2', - ui.create.dialog(get.prompt('qinyin'),'hidden')).ai=function(){ - if(lose>recover&&lose>0) return 0; - if(lose0) return 1; + var prompt = get.prompt("qinyin") + "(剩余" + get.cnNumber(event.count) + "次)"; + player.chooseControl( + "失去体力", + "回复体力", + "cancel2", + ui.create.dialog(get.prompt("qinyin"), "hidden") + ).ai = function () { + if (lose > recover && lose > 0) return 0; + if (lose < recover && recover > 0) return 1; return 2; - } - "step 1" - if(result.control=='cancel2'){ + }; + ("step 1"); + if (result.control == "cancel2") { event.finish(); + } else { + player.logSkill("qinyin"); + event.bool = result.control == "回复体力"; + event.num = 0; + event.players = game.filterPlayer(); } - else{ - player.logSkill('qinyin'); - event.bool=(result.control=='回复体力'); - event.num=0; - event.players=game.filterPlayer(); - } - "step 2" - if(event.num1){ + ("step 3"); + if (event.count > 1) { event.count--; event.goto(0); } }, - ai:{ - expose:0.1, - threaten:2 - } - }, - lianpo:{ - audio:2, - trigger:{global:'phaseAfter'}, - frequent:true, - filter(event,player){ - return player.getStat('kill')>0; + ai: { + expose: 0.1, + threaten: 2, }, - content(){ + }, + lianpo: { + audio: 2, + trigger: { global: "phaseAfter" }, + frequent: true, + filter(event, player) { + return player.getStat("kill") > 0; + }, + content() { player.insertPhase(); - } + }, }, - baonu:{ - audio:2, - marktext:'暴', - unique:true, - trigger:{ - source:'damageSource', - player:['damageEnd','enterGame'], - global:'phaseBefore', + baonu: { + audio: 2, + marktext: "暴", + unique: true, + trigger: { + source: "damageSource", + player: ["damageEnd", "enterGame"], + global: "phaseBefore", }, - forced:true, - filter(event){ - return (event.name!='damage'&&(event.name!='phase'||game.phaseNumber==0))||event.num>0; + forced: true, + filter(event) { + return ( + (event.name != "damage" && (event.name != "phase" || game.phaseNumber == 0)) || + event.num > 0 + ); }, - content(){ - player.addMark('baonu',trigger.name=='damage'?trigger.num:2); + content() { + player.addMark("baonu", trigger.name == "damage" ? trigger.num : 2); }, - intro:{ - name:'暴怒', - content:'mark' + intro: { + name: "暴怒", + content: "mark", + }, + ai: { + combo: "ol_shenfen", + maixie: true, + maixie_hp: true, }, - ai:{ - combo:'ol_shenfen', - maixie:true, - maixie_hp:true - } }, - shenfen:{ - audio:2, - unique:true, - enable:'phaseUse', - filter(event,player){ - return player.storage.baonu>=6; + shenfen: { + audio: 2, + unique: true, + enable: "phaseUse", + filter(event, player) { + return player.storage.baonu >= 6; }, - skillAnimation:true, - animationColor:'metal', - limited:true, - content(){ - "step 0" - player.awakenSkill('shenfen'); - player.storage.baonu-=6; - player.markSkill('baonu'); - player.syncStorage('baonu'); - event.targets=game.filterPlayer(); + skillAnimation: true, + animationColor: "metal", + limited: true, + content() { + "step 0"; + player.awakenSkill("shenfen"); + player.storage.baonu -= 6; + player.markSkill("baonu"); + player.syncStorage("baonu"); + event.targets = game.filterPlayer(); event.targets.remove(player); event.targets.sort(lib.sort.seat); - event.targets2=event.targets.slice(0); - player.line(event.targets,'green'); - "step 1" - if(event.targets.length){ + event.targets2 = event.targets.slice(0); + player.line(event.targets, "green"); + ("step 1"); + if (event.targets.length) { event.targets.shift().damage(); event.redo(); } - "step 2" - if(event.targets2.length){ - var cur=event.targets2.shift(); - if(cur&&cur.countCards('he')){ - cur.chooseToDiscard('he',true,4); + ("step 2"); + if (event.targets2.length) { + var cur = event.targets2.shift(); + if (cur && cur.countCards("he")) { + cur.chooseToDiscard("he", true, 4); } event.redo(); } }, - ai:{ - order:10, - result:{ - player(player){ - return game.countPlayer(function(current){ - if(current!=player){ - return get.sgn(get.damageEffect(current,player,player)); + ai: { + order: 10, + result: { + player(player) { + return game.countPlayer(function (current) { + if (current != player) { + return get.sgn(get.damageEffect(current, player, player)); } }); - } + }, }, - combo:'baonu' - } + combo: "baonu", + }, }, - wuqian:{ - audio:2, - enable:'phaseUse', - derivation:'wushuang', - filter(event,player){ - return player.storage.baonu>=2&&!player.hasSkill('wushuang'); + wuqian: { + audio: 2, + enable: "phaseUse", + derivation: "wushuang", + filter(event, player) { + return player.storage.baonu >= 2 && !player.hasSkill("wushuang"); }, - content(){ - player.storage.baonu-=2; - player.addTempSkill('wushuang'); + content() { + player.storage.baonu -= 2; + player.addTempSkill("wushuang"); }, - ai:{ - order:5, - result:{ - player(player){ - if(!player.storage.shenfen) return 0; - var cards=player.getCards('h','sha'); - if(cards.length){ - if(game.hasPlayer(function(current){ - return (player.canUse('sha',current)&& - get.effect(current,cards[0],player,player)>0&¤t.hasShan()); - })){ + ai: { + order: 5, + result: { + player(player) { + if (!player.storage.shenfen) return 0; + var cards = player.getCards("h", "sha"); + if (cards.length) { + if ( + game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + get.effect(current, cards[0], player, player) > 0 && + current.hasShan() + ); + }) + ) { return 1; } } return 0; - } + }, }, - combo:'baonu' - } + combo: "baonu", + }, }, - renjie:{ - audio:'renjie2', - trigger:{player:'damageEnd'}, - forced:true, - group:'renjie2', - notemp:true, + renjie: { + audio: "renjie2", + trigger: { player: "damageEnd" }, + forced: true, + group: "renjie2", + notemp: true, //mark:true, - filter(event){ - return event.num>0; + filter(event) { + return event.num > 0; }, - content(){ - player.addMark('renjie',trigger.num); + content() { + player.addMark("renjie", trigger.num); }, - intro:{ - name2:'忍', - content:'mark' + intro: { + name2: "忍", + content: "mark", }, - ai:{ - maixie:true, - maixie_hp:true, - combo:'sbaiyin', - effect:{ - target(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(get.tag(card,'damage')){ - if(target.hp==target.maxHp){ - if(!target.hasSkill('jilue')){ - return [0,1]; + ai: { + maixie: true, + maixie_hp: true, + combo: "sbaiyin", + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp) { + if (!target.hasSkill("jilue")) { + return [0, 1]; } - return [0.7,1]; + return [0.7, 1]; } return 0.7; } - } - } - } - }, - renjie2:{ - audio:2, - mod:{ - aiOrder:(player,card,num)=>{ - if(num<=0||typeof card!=='object'||!player.isPhaseUsing()) return num; - if(player.hasSkill('sbaiyin')){ - if(player.countMark('renjie')<4&&player.getUseValue(card)0; - }, - content(){ - player.addMark('renjie',trigger.getl(player).cards2.length); + }, + }, }, }, - sbaiyin:{ - skillAnimation:'epic', - animationColor:'thunder', - juexingji:true, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - unique:true, - audio:2, - filter(event,player){ - return player.countMark('renjie')>=4; + renjie2: { + audio: 2, + mod: { + aiOrder: (player, card, num) => { + if (num <= 0 || typeof card !== "object" || !player.isPhaseUsing()) return num; + if (player.hasSkill("sbaiyin")) { + if ( + player.countMark("renjie") < 4 && + player.getUseValue(card) < Math.min(4, (player.hp * player.hp) / 4) + ) + return 0; + } else if (player.hasSkill("jilue")) { + if ( + player.countMark("renjie") < 3 && + player.getUseValue(card) < Math.min(1.8, 0.18 * player.hp * player.hp) + ) + return 0; + } + }, }, - content(){ - player.awakenSkill('sbaiyin'); + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + forced: true, + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getParent("phaseDiscard"), + evt2 = event.getl(player); + return ( + evt && + evt2 && + evt.name == "phaseDiscard" && + evt.player == player && + evt2.cards2 && + evt2.cards2.length > 0 + ); + }, + content() { + player.addMark("renjie", trigger.getl(player).cards2.length); + }, + }, + sbaiyin: { + skillAnimation: "epic", + animationColor: "thunder", + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + audio: 2, + filter(event, player) { + return player.countMark("renjie") >= 4; + }, + content() { + player.awakenSkill("sbaiyin"); player.loseMaxHp(); - player.addSkills('jilue'); + player.addSkills("jilue"); }, - derivation:['jilue','reguicai','fangzhu','rejizhi','rezhiheng','rewansha'], - ai:{ - combo:'renjie' - } - }, - jilue:{ - unique:true, - group:['jilue_guicai','jilue_fangzhu','jilue_wansha','jilue_zhiheng','jilue_jizhi'], - ai:{ - combo:'renjie' - } - }, - jilue_guicai:{ - audio:1, - trigger:{global:'judge'}, - direct:true, - filter(event,player){ - return player.countCards('hes')>0&&player.hasMark('renjie'); + derivation: ["jilue", "reguicai", "fangzhu", "rejizhi", "rezhiheng", "rewansha"], + ai: { + combo: "renjie", }, - content(){ - "step 0" - player.chooseCard('是否弃置一枚“忍”,并发动〖鬼才〗?','hes',function(card){ - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; + }, + jilue: { + unique: true, + group: ["jilue_guicai", "jilue_fangzhu", "jilue_wansha", "jilue_zhiheng", "jilue_jizhi"], + ai: { + combo: "renjie", + }, + }, + jilue_guicai: { + audio: 1, + trigger: { global: "judge" }, + direct: true, + filter(event, player) { + return player.countCards("hes") > 0 && player.hasMark("renjie"); + }, + content() { + "step 0"; + player.chooseCard("是否弃置一枚“忍”,并发动〖鬼才〗?", "hes", function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; return true; - }).ai=function(card){ - var trigger=_status.event.parent._trigger; - var player=_status.event.player; - var result=trigger.judge(card)-trigger.judge(trigger.player.judging[0]); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result-get.value(card)/2; - } - else{ - return -result-get.value(card)/2; + }).ai = function (card) { + var trigger = _status.event.parent._trigger; + var player = _status.event.player; + var result = trigger.judge(card) - trigger.judge(trigger.player.judging[0]); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; } }; - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight','jilue_guicai','noOrdering'); - } - else{ + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "jilue_guicai", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ - player.removeMark('renjie',1); - if(trigger.player.judging[0].clone){ + ("step 2"); + if (result.bool) { + player.removeMark("renjie", 1); + if (trigger.player.judging[0].clone) { trigger.player.judging[0].clone.delete(); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); game.delay(2); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } - }, - jilue_fangzhu:{ - audio:1, - trigger:{player:'damageEnd'}, - direct:true, - //priority:-1, - filter(event,player){ - return player.hasMark('renjie'); + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, }, - content(){ - "step 0" - player.chooseTarget('是否弃置一枚“忍”,并发动【放逐】?',function(card,player,target){ - return player!=target - }).set('ai',target=>{ - if(target.hasSkillTag('noturn')) return 0; - var player=_status.event.player; - var current=_status.currentPhase; - var dis=current?get.distance(current,target,'absolute'):1; - var draw=player.getDamagedHp(); - var att=get.attitude(player,target); - if(att==0) return target.hasJudge('lebu')?Math.random()/3:Math.sqrt(get.threaten(target))/5+Math.random()/2; - if(att>0){ - if(target.isTurnedOver()) return att+draw; - if(draw<4) return -1; - if(current&&target.getSeatNum()>current.getSeatNum()) return att+draw/3; - return 10*Math.sqrt(Math.max(0.01,get.threaten(target)))/(3.5-draw)+dis/(2*game.countPlayer()); - } - else{ - if(target.isTurnedOver()) return att-draw; - if(draw>=5) return -1; - if(current&&target.getSeatNum()<=current.getSeatNum()) return -att+draw/3; - return (4.25-draw)*10*Math.sqrt(Math.max(0.01,get.threaten(target)))+2*game.countPlayer()/dis; - } - }); - "step 1" - if(result.bool){ - player.removeMark('renjie',1); - player.logSkill('jilue_fangzhu',result.targets); - result.targets[0].draw(player.maxHp-player.hp); + }, + jilue_fangzhu: { + audio: 1, + trigger: { player: "damageEnd" }, + direct: true, + //priority:-1, + filter(event, player) { + return player.hasMark("renjie"); + }, + content() { + "step 0"; + player + .chooseTarget("是否弃置一枚“忍”,并发动【放逐】?", function (card, player, target) { + return player != target; + }) + .set("ai", (target) => { + if (target.hasSkillTag("noturn")) return 0; + var player = _status.event.player; + var current = _status.currentPhase; + var dis = current ? get.distance(current, target, "absolute") : 1; + var draw = player.getDamagedHp(); + var att = get.attitude(player, target); + if (att == 0) + return target.hasJudge("lebu") + ? Math.random() / 3 + : Math.sqrt(get.threaten(target)) / 5 + Math.random() / 2; + if (att > 0) { + if (target.isTurnedOver()) return att + draw; + if (draw < 4) return -1; + if (current && target.getSeatNum() > current.getSeatNum()) + return att + draw / 3; + return ( + (10 * Math.sqrt(Math.max(0.01, get.threaten(target)))) / (3.5 - draw) + + dis / (2 * game.countPlayer()) + ); + } else { + if (target.isTurnedOver()) return att - draw; + if (draw >= 5) return -1; + if (current && target.getSeatNum() <= current.getSeatNum()) + return -att + draw / 3; + return ( + (4.25 - draw) * 10 * Math.sqrt(Math.max(0.01, get.threaten(target))) + + (2 * game.countPlayer()) / dis + ); + } + }); + ("step 1"); + if (result.bool) { + player.removeMark("renjie", 1); + player.logSkill("jilue_fangzhu", result.targets); + result.targets[0].draw(player.maxHp - player.hp); result.targets[0].turnOver(); } }, }, - jilue_wansha:{ - audio:'wansha', - audioname:['shen_simayi'], - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.hasMark('renjie'); + jilue_wansha: { + audio: "wansha", + audioname: ["shen_simayi"], + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.hasMark("renjie"); }, - content(){ - player.removeMark('renjie',1); - player.addTempSkill('rewansha'); + content() { + player.removeMark("renjie", 1); + player.addTempSkill("rewansha"); }, - ai:{ - order:()=>{ - let player=_status.event.player; - if(game.hasPlayer(current=>{ - if(player===current||current.hp>1||get.attitude(player,current)>=0) return false; - return player.inRange(current)&&player.countCards('hs','sha')&&player.getCardUsable('sha')|| - player.countCards('hs',card=>get.name(card)!=='sha'&&get.tag(card,'damage'))>1; - })) return 9.2; + ai: { + order: () => { + let player = _status.event.player; + if ( + game.hasPlayer((current) => { + if ( + player === current || + current.hp > 1 || + get.attitude(player, current) >= 0 + ) + return false; + return ( + (player.inRange(current) && + player.countCards("hs", "sha") && + player.getCardUsable("sha")) || + player.countCards( + "hs", + (card) => get.name(card) !== "sha" && get.tag(card, "damage") + ) > 1 + ); + }) + ) + return 9.2; return 0; }, - result:{ - player:1 + result: { + player: 1, }, - effect:{ - player(card,player,target){ - if(target&&player.hasSkill('rewansha')&&target.hp<=1&&get.tag(card,'damage')) return [1,0,1.5,-1.5]; - } - } - } + effect: { + player(card, player, target) { + if ( + target && + player.hasSkill("rewansha") && + target.hp <= 1 && + get.tag(card, "damage") + ) + return [1, 0, 1.5, -1.5]; + }, + }, + }, }, - jilue_zhiheng:{ - audio:1, - mod:{ - aiOrder(player,card,num){ - if(num<=0||get.itemtype(card)!='card'||get.type(card)!='equip') return num; - let eq=player.getEquip(get.subtype(card)); - if(eq&&get.equipValue(card)-get.equipValue(eq)= 8; + }) + ) { + return 8 - get.value(card); } + return 6 - get.value(card); }, - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.hasMark('renjie'); - }, - position:'he', - filterCard:lib.filter.cardDiscardable, - discard:false, - lose:false, - delay:false, - selectCard:[1,Infinity], - prompt:'弃置一枚“忍”,然后弃置任意张牌并摸等量的牌。若弃置了所有的手牌,则可以多摸一张牌。', - check(card){ - var player=_status.event.player; - if(get.position(card)=='h'&&!player.countCards('h',function(card){ - return get.value(card)>=8; - })){ - return 8-get.value(card); - } - return 6-get.value(card) - }, - content(){ - 'step 0' - player.removeMark('renjie',1); + content() { + "step 0"; + player.removeMark("renjie", 1); player.discard(cards); - event.num=1; - var hs=player.getCards('h'); - if(!hs.length) event.num=0; - for(var i=0;iget.value(i)>Math.max(6,9-player.hp),'he')) return 1; + ai: { + order(item, player) { + if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; return 10; }, - result:{ - player(player){ - var num=0; - var cards=player.getCards('he'); - for(var i=0;i2) return 1; - if(cards.length==2&&player.storage.jilue>1); + if (cards.length > 2) return 1; + if (cards.length == 2 && player.storage.jilue > 1); return 0; - } + }, }, - nokeep:true, - skillTagFilter(player,tag,arg){ - if(tag==='nokeep') return player.isPhaseUsing()&&!player.getStat().skill.jilue_zhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); + nokeep: true, + skillTagFilter(player, tag, arg) { + if (tag === "nokeep") + return ( + player.isPhaseUsing() && + !player.getStat().skill.jilue_zhiheng && + player.hasCard((card) => get.name(card) !== "tao", "h") + ); }, }, }, - jilue_jizhi:{ - audio:1, - trigger:{player:'useCard'}, - filter(event,player){ - return (get.type(event.card,'trick')=='trick'&&event.card.isCard&&player.hasMark('renjie')); + jilue_jizhi: { + audio: 1, + trigger: { player: "useCard" }, + filter(event, player) { + return ( + get.type(event.card, "trick") == "trick" && + event.card.isCard && + player.hasMark("renjie") + ); }, - content(){ - 'step 0' - player.removeMark('renjie',1); + content() { + "step 0"; + player.removeMark("renjie", 1); player.draw(); - 'step 1' - event.card=result[0]; - if(get.type(event.card)=='basic'){ - player.chooseBool('是否弃置'+get.translation(event.card)+'并令本回合手牌上限+1?').set('ai',function(evt,player){ - return _status.currentPhase==player&&player.needsToDiscard(-3)&&_status.event.value<6; - }).set('value',get.value(event.card,player)); + ("step 1"); + event.card = result[0]; + if (get.type(event.card) == "basic") { + player + .chooseBool("是否弃置" + get.translation(event.card) + "并令本回合手牌上限+1?") + .set("ai", function (evt, player) { + return ( + _status.currentPhase == player && + player.needsToDiscard(-3) && + _status.event.value < 6 + ); + }) + .set("value", get.value(event.card, player)); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.discard(event.card); - player.addTempSkill('jilue_jizhi_clear'); - player.addMark('jilue_jizhi_clear',1,false); + player.addTempSkill("jilue_jizhi_clear"); + player.addMark("jilue_jizhi_clear", 1, false); } }, - subSkill:{ - clear:{ - charlotte:true, - onremove:true, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('jilue_jizhi_clear'); + subSkill: { + clear: { + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("jilue_jizhi_clear"); }, }, - intro:{content:'手牌上限+#'}, + intro: { content: "手牌上限+#" }, }, }, }, - wushen:{ - mod:{ - cardname(card,player,name){ - if(get.suit(card)=='heart') return 'sha'; + wushen: { + mod: { + cardname(card, player, name) { + if (get.suit(card) == "heart") return "sha"; }, - cardnature(card,player){ - if(get.suit(card)=='heart') return false; + cardnature(card, player) { + if (get.suit(card) == "heart") return false; }, - targetInRange(card){ - if(card.name === 'sha'){ + targetInRange(card) { + if (card.name === "sha") { const suit = get.suit(card); - if (suit === 'heart' || suit === 'unsure') return true; + if (suit === "heart" || suit === "unsure") return true; } }, - cardUsable(card){ - if(card.name === 'sha'){ + cardUsable(card) { + if (card.name === "sha") { const suit = get.suit(card); - if (suit === 'heart' || suit === 'unsure') return Infinity; + if (suit === "heart" || suit === "unsure") return Infinity; } - } + }, }, - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'&&get.suit(event.card)=='heart'; + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" && get.suit(event.card) == "heart"; }, - content(){ + content() { trigger.directHit.addArray(game.players); - if(trigger.addCount!==false){ - trigger.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + if (trigger.addCount !== false) { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } } }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.tag(card,'respondSha')&¤t<0) return 0.6 - } + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.6; + }, }, - directHit_ai:true, - skillTagFilter(player,tag,arg){ - return arg.card.name=='sha'&&get.suit(arg.card)=='heart'; + directHit_ai: true, + skillTagFilter(player, tag, arg) { + return arg.card.name == "sha" && get.suit(arg.card) == "heart"; }, - } + }, }, - wuhun:{ - audio:'wuhun2', - trigger:{player:'die'}, - filter(event){ - return event.source&&event.source.isIn(); + wuhun: { + audio: "wuhun2", + trigger: { player: "die" }, + filter(event) { + return event.source && event.source.isIn(); }, - forced:true, - forceDie:true, - skillAnimation:true, - animationColor:'soil', - logTarget:'source', - content(){ - var num=trigger.source.getHp(); - if(num>0) trigger.source.loseHp(num); + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + logTarget: "source", + content() { + var num = trigger.source.getHp(); + if (num > 0) trigger.source.loseHp(num); }, - ai:{ - threaten(player,target){ - if(target.hp==1){ - if(player.getHp()<=0) return 100; + ai: { + threaten(player, target) { + if (target.hp == 1) { + if (player.getHp() <= 0) return 100; return 0.2; } return 0.8; }, - effect:{ - target(card,player,target,current){ - if(player.getHp()<=0) return; - if(!target.hasFriend()) return; - if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-2]; + effect: { + target(card, player, target, current) { + if (player.getHp() <= 0) return; + if (!target.hasFriend()) return; + if (target.hp <= 1 && get.tag(card, "damage")) return [1, 0, 0, -2]; }, }, }, }, - guixin:{ - audio:2, - trigger:{player:'damageEnd'}, - check(event,player){ - if(player.isTurnedOver()||event.num>1) return true; - var num=game.countPlayer(function(current){ - if(current.countCards('he')&¤t!=player&&get.attitude(player,current)<=0){ + guixin: { + audio: 2, + trigger: { player: "damageEnd" }, + check(event, player) { + if (player.isTurnedOver() || event.num > 1) return true; + var num = game.countPlayer(function (current) { + if ( + current.countCards("he") && + current != player && + get.attitude(player, current) <= 0 + ) { return true; } - if(current.countCards('j')&¤t!=player&&get.attitude(player,current)>0){ + if ( + current.countCards("j") && + current != player && + get.attitude(player, current) > 0 + ) { return true; } }); - return num>=2; + return num >= 2; }, - content(){ - 'step 0' - event.count=trigger.num; - 'step 1' - var targets=game.filterPlayer(current=>current!=player).sortBySeat(); + content() { + "step 0"; + event.count = trigger.num; + ("step 1"); + var targets = game.filterPlayer((current) => current != player).sortBySeat(); player.line(targets); - player.gainMultiple(targets,'hej'); - 'step 2' + player.gainMultiple(targets, "hej"); + ("step 2"); player.turnOver(); - 'step 3' + ("step 3"); event.count--; - if(event.count&&player.hasSkill('guixin')){ - player.chooseBool(get.prompt2('guixin')); - } - else event.finish(); - 'step 4' - if(event.count&&result.bool) event.goto(1); + if (event.count && player.hasSkill("guixin")) { + player.chooseBool(get.prompt2("guixin")); + } else event.finish(); + ("step 4"); + if (event.count && result.bool) event.goto(1); }, - ai:{ - maixie:true, - maixie_hp:true, - threaten(player,target){ - if(target.hp==1) return 2.5; + ai: { + maixie: true, + maixie_hp: true, + threaten(player, target) { + if (target.hp == 1) return 2.5; return 0.5; }, - effect:{ - target(card,player,target){ - if(!target._guixin_eff&&get.tag(card,'damage')&&target.hp>(player.hasSkillTag('damageBonus',true,{ - card:card, - target:target - })?2:1)){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - target._guixin_eff=true; - let gain=game.countPlayer(function(current){ - if(target==current) return 0; - if(get.attitude(target,current)>0){ - if(current.hasCard((cardx)=>lib.filter.canBeGained(cardx,target,current,'guixin')&&get.effect(current,cardx,current,current)<0,'ej')) return 1.3; + effect: { + target(card, player, target) { + if ( + !target._guixin_eff && + get.tag(card, "damage") && + target.hp > + (player.hasSkillTag("damageBonus", true, { + card: card, + target: target, + }) + ? 2 + : 1) + ) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + target._guixin_eff = true; + let gain = game.countPlayer(function (current) { + if (target == current) return 0; + if (get.attitude(target, current) > 0) { + if ( + current.hasCard( + (cardx) => + lib.filter.canBeGained( + cardx, + target, + current, + "guixin" + ) && get.effect(current, cardx, current, current) < 0, + "ej" + ) + ) + return 1.3; return 0; } - if(current.hasCard((cardx)=>lib.filter.canBeGained(cardx,target,current,'guixin')&&get.effect(current,cardx,current,current)>0,'ej')) return 1.1; - if(current.hasCard((cardx)=>lib.filter.canBeGained(cardx,target,current,'guixin'),'h')) return 0.9; + if ( + current.hasCard( + (cardx) => + lib.filter.canBeGained(cardx, target, current, "guixin") && + get.effect(current, cardx, current, current) > 0, + "ej" + ) + ) + return 1.1; + if ( + current.hasCard( + (cardx) => + lib.filter.canBeGained(cardx, target, current, "guixin"), + "h" + ) + ) + return 0.9; return 0; }); - if(target.isTurnedOver()) gain+=2.3; - else gain-=2.3; + if (target.isTurnedOver()) gain += 2.3; + else gain -= 2.3; delete target._guixin_eff; - return [1,Math.max(0,gain)]; + return [1, Math.max(0, gain)]; } - } - } - } + }, + }, + }, }, - qixing:{ - audio:2, - unique:true, - trigger:{ - global:'phaseBefore', - player:'enterGame', + qixing: { + audio: 2, + unique: true, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content(){ - "step 0" - player.addToExpansion(get.cards(7),'draw').gaintag.add('qixing'); - "step 1" - var cards=player.getExpansions('qixing'); - if(!cards.length||!player.countCards('h')){ + content() { + "step 0"; + player.addToExpansion(get.cards(7), "draw").gaintag.add("qixing"); + ("step 1"); + var cards = player.getExpansions("qixing"); + if (!cards.length || !player.countCards("h")) { event.finish(); return; } - var next=player.chooseToMove('七星:是否交换“星”和手牌?'); - next.set('list',[ - [get.translation(player)+'(你)的星',cards], - ['手牌区',player.getCards('h')], + var next = player.chooseToMove("七星:是否交换“星”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的星", cards], + ["手牌区", player.getCards("h")], ]); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('processAI',function(list){ - var player=_status.event.player,cards=list[0][1].concat(list[1][1]).sort(function(a,b){ - return get.useful(a)-get.useful(b); - }),cards2=cards.splice(0,player.getExpansions('qixing').length); - return [cards2,cards]; + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.useful(a) - get.useful(b); + }), + cards2 = cards.splice(0, player.getExpansions("qixing").length); + return [cards2, cards]; }); - "step 2" - if(result.bool){ - var pushs=result.moved[0],gains=result.moved[1]; - pushs.removeArray(player.getExpansions('qixing')); - gains.removeArray(player.getCards('h')); - if(!pushs.length||pushs.length!=gains.length) return; - player.addToExpansion(pushs,player,'giveAuto').gaintag.add('qixing'); + ("step 2"); + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("qixing")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("qixing"); //game.log(player,'将',pushs,'作为“星”置于武将牌上'); - player.gain(gains,'draw'); + player.gain(gains, "draw"); } }, - intro:{ - markcount:'expansion', - mark(dialog,content,player){ - var content=player.getExpansions('qixing'); - if(content&&content.length){ - if(player==game.me||player.isUnderControl()){ + intro: { + markcount: "expansion", + mark(dialog, content, player) { + var content = player.getExpansions("qixing"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { dialog.addAuto(content); - } - else{ - return '共有'+get.cnNumber(content.length)+'张星'; + } else { + return "共有" + get.cnNumber(content.length) + "张星"; } } }, - content(content,player){ - var content=player.getExpansions('qixing'); - if(content&&content.length){ - if(player==game.me||player.isUnderControl()){ + content(content, player) { + var content = player.getExpansions("qixing"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { return get.translation(content); } - return '共有'+get.cnNumber(content.length)+'张星'; + return "共有" + get.cnNumber(content.length) + "张星"; } - } + }, }, - group:['qixing2'], - ai:{combo:'dawu'}, + group: ["qixing2"], + ai: { combo: "dawu" }, }, - qixing2:{ - trigger:{player:'phaseDrawAfter'}, - direct:true, - filter(event,player){ - return player.getExpansions('qixing').length>0&&player.countCards('h')>0; + qixing2: { + trigger: { player: "phaseDrawAfter" }, + direct: true, + filter(event, player) { + return player.getExpansions("qixing").length > 0 && player.countCards("h") > 0; }, - content(){ - "step 0" - var cards=player.getExpansions('qixing'); - if(!cards.length||!player.countCards('h')){ + content() { + "step 0"; + var cards = player.getExpansions("qixing"); + if (!cards.length || !player.countCards("h")) { event.finish(); return; } - var next=player.chooseToMove('七星:是否交换“星”和手牌?'); - next.set('list',[ - [get.translation(player)+'(你)的星',cards], - ['手牌区',player.getCards('h')], + var next = player.chooseToMove("七星:是否交换“星”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的星", cards], + ["手牌区", player.getCards("h")], ]); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('processAI',function(list){ - var player=_status.event.player,cards=list[0][1].concat(list[1][1]).sort(function(a,b){ - return get.value(a)-get.value(b); - }),cards2=cards.splice(0,player.getExpansions('qixing').length); - return [cards2,cards]; + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.value(a) - get.value(b); + }), + cards2 = cards.splice(0, player.getExpansions("qixing").length); + return [cards2, cards]; }); - "step 1" - if(result.bool){ - var pushs=result.moved[0],gains=result.moved[1]; - pushs.removeArray(player.getExpansions('qixing')); - gains.removeArray(player.getCards('h')); - if(!pushs.length||pushs.length!=gains.length) return; - player.logSkill('qixing2'); - player.addToExpansion(pushs,player,'giveAuto').gaintag.add('qixing'); - game.log(player,'将',pushs,'作为“星”置于武将牌上'); - player.gain(gains,'draw'); + ("step 1"); + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("qixing")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.logSkill("qixing2"); + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("qixing"); + game.log(player, "将", pushs, "作为“星”置于武将牌上"); + player.gain(gains, "draw"); } }, }, - dawu:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter(event,player){ - return player.getExpansions('qixing').length; + dawu: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + return player.getExpansions("qixing").length; }, - audio:2, - content(){ - "step 0" - var num=Math.min(game.countPlayer(),player.getExpansions('qixing').length); - player.chooseTarget(get.prompt('dawu'),'令至多'+get.cnNumber(num)+'名角色获得“大雾”标记', - [1,num]).set('ai',function(target){ - if(target.isMin()) return 0; - if(target.hasSkill('biantian2')||target.hasSkill('dawu2')) return 0; - var att=get.attitude(player,target); - if(att>=4){ - if(target.hp>2&&(target.isHealthy()||target.hasSkillTag('maixie'))) return 0; - if(_status.event.allUse) return att; - if(target.hp==1) return att; - if(target.hp==2&&target.countCards('he')<=2) return att*0.7; - return 0; - } - return -1; - }).set('allUse',player.getExpansions('qixing').length>=game.countPlayer(function(current){ - return get.attitude(player,current)>4; - })*2); - "step 1" - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('dawu',targets,'thunder'); - var length=targets.length; - targets.forEach(target=>{ - target.addAdditionalSkill(`dawu_${player.playerid}`,'dawu2'); - target.markAuto('dawu2',[player]); + audio: 2, + content() { + "step 0"; + var num = Math.min(game.countPlayer(), player.getExpansions("qixing").length); + player + .chooseTarget( + get.prompt("dawu"), + "令至多" + get.cnNumber(num) + "名角色获得“大雾”标记", + [1, num] + ) + .set("ai", function (target) { + if (target.isMin()) return 0; + if (target.hasSkill("biantian2") || target.hasSkill("dawu2")) return 0; + var att = get.attitude(player, target); + if (att >= 4) { + if (target.hp > 2 && (target.isHealthy() || target.hasSkillTag("maixie"))) + return 0; + if (_status.event.allUse) return att; + if (target.hp == 1) return att; + if (target.hp == 2 && target.countCards("he") <= 2) return att * 0.7; + return 0; + } + return -1; + }) + .set( + "allUse", + player.getExpansions("qixing").length >= + game.countPlayer(function (current) { + return get.attitude(player, current) > 4; + }) * + 2 + ); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("dawu", targets, "thunder"); + var length = targets.length; + targets.forEach((target) => { + target.addAdditionalSkill(`dawu_${player.playerid}`, "dawu2"); + target.markAuto("dawu2", [player]); }); - player.addTempSkill('dawu3',{player:'phaseBeginStart'}) - player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true); - } - else{ + player.addTempSkill("dawu3", { player: "phaseBeginStart" }); + player.chooseCardButton( + "选择弃置" + get.cnNumber(length) + "张“星”", + length, + player.getExpansions("qixing"), + true + ); + } else { event.finish(); } - "step 2" + ("step 2"); player.loseToDiscardpile(result.links); }, - ai:{combo:'qixing'}, + ai: { combo: "qixing" }, }, - dawu2:{ - charlotte:true, - ai:{ - nofire:true, - nodamage:true, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return 'zeroplayertarget'; - } + dawu2: { + charlotte: true, + ai: { + nofire: true, + nodamage: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && !get.tag(card, "thunderDamage")) + return "zeroplayertarget"; + }, }, }, - intro:{ - content(storage){ + intro: { + content(storage) { return `共有${storage.length}枚标记`; }, - } - }, - dawu3:{ - trigger:{global:'damageBegin4'}, - filter(event,player){ - return !event.hasNature('thunder')&&event.player.getStorage('dawu2').includes(player); }, - forced:true, - charlotte:true, - logTarget:'player', - content(){ + }, + dawu3: { + trigger: { global: "damageBegin4" }, + filter(event, player) { + return !event.hasNature("thunder") && event.player.getStorage("dawu2").includes(player); + }, + forced: true, + charlotte: true, + logTarget: "player", + content() { trigger.cancel(); }, - onremove(player){ - game.countPlayer2(current=>{ - if(current.getStorage('dawu2').includes(player)){ - current.unmarkAuto('dawu2',[player]); + onremove(player) { + game.countPlayer2((current) => { + if (current.getStorage("dawu2").includes(player)) { + current.unmarkAuto("dawu2", [player]); current.removeAdditionalSkill(`dawu_${player.playerid}`); } - },true); + }, true); }, }, - kuangfeng:{ - unique:true, - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter(event,player){ - return player.getExpansions('qixing').length; + kuangfeng: { + unique: true, + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter(event, player) { + return player.getExpansions("qixing").length; }, - content(){ - "step 0" - player.chooseTarget(get.prompt('kuangfeng'),'令一名角色获得“狂风”标记').ai=function(target){ + content() { + "step 0"; + player.chooseTarget(get.prompt("kuangfeng"), "令一名角色获得“狂风”标记").ai = function ( + target + ) { return -1; - } - "step 1" - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('kuangfeng',targets,'fire'); - var length=targets.length; - targets.forEach(target=>{ - target.addAdditionalSkill(`kuangfeng_${player.playerid}`,'kuangfeng2'); - target.markAuto('kuangfeng2',[player]); + }; + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("kuangfeng", targets, "fire"); + var length = targets.length; + targets.forEach((target) => { + target.addAdditionalSkill(`kuangfeng_${player.playerid}`, "kuangfeng2"); + target.markAuto("kuangfeng2", [player]); }); - player.addTempSkill('kuangfeng3',{player:'phaseBeginStart'}) - player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true); - } - else{ + player.addTempSkill("kuangfeng3", { player: "phaseBeginStart" }); + player.chooseCardButton( + "选择弃置" + get.cnNumber(length) + "张“星”", + length, + player.getExpansions("qixing"), + true + ); + } else { event.finish(); } - "step 2" + ("step 2"); player.loseToDiscardpile(result.links); }, - ai:{combo:'qixing'}, + ai: { combo: "qixing" }, }, - kuangfeng2:{ - charlotte:true, - intro:{ - content(storage){ + kuangfeng2: { + charlotte: true, + intro: { + content(storage) { return `共有${storage.length}枚标记`; }, }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.tag(card,'fireDamage')&¤t<0) return 1.5; - } - } - } - }, - kuangfeng3:{ - trigger:{global:'damageBegin3'}, - filter(event,player){ - return event.hasNature('fire')&&event.player.getStorage('kuangfeng2').includes(player); + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "fireDamage") && current < 0) return 1.5; + }, + }, }, - charlotte:true, - forced:true, - logTarget:'player', - content(){ + }, + kuangfeng3: { + trigger: { global: "damageBegin3" }, + filter(event, player) { + return event.hasNature("fire") && event.player.getStorage("kuangfeng2").includes(player); + }, + charlotte: true, + forced: true, + logTarget: "player", + content() { trigger.num++; }, - onremove(player){ - game.countPlayer2(current=>{ - if(current.getStorage('kuangfeng2').includes(player)){ - current.unmarkAuto('kuangfeng2',player); + onremove(player) { + game.countPlayer2((current) => { + if (current.getStorage("kuangfeng2").includes(player)) { + current.unmarkAuto("kuangfeng2", player); current.removeAdditionalSkill(`kuangfeng_${player.playerid}`); } - },true); + }, true); }, }, - yeyan:{ - unique:true, - limited:true, - audio:3, - enable:'phaseUse', - filterCard(card,player){ - return !ui.selected.cards.some(cardx=>get.suit(cardx,player)==get.suit(card,player)); + yeyan: { + unique: true, + limited: true, + audio: 3, + enable: "phaseUse", + filterCard(card, player) { + return !ui.selected.cards.some( + (cardx) => get.suit(cardx, player) == get.suit(card, player) + ); }, - selectCard:[0,4], - filterTarget(card,player,target){ - var length=ui.selected.cards.length; - return length==0||length==4; + selectCard: [0, 4], + filterTarget(card, player, target) { + var length = ui.selected.cards.length; + return length == 0 || length == 4; }, - selectTarget(){ - if(ui.selected.cards.length==4) return [1,2]; - if(ui.selected.cards.length==0) return [1,3]; - game.uncheck('target'); - return [1,3]; + selectTarget() { + if (ui.selected.cards.length == 4) return [1, 2]; + if (ui.selected.cards.length == 0) return [1, 3]; + game.uncheck("target"); + return [1, 3]; }, - complexCard:true, - complexSelect:true, - line:'fire', - forceDie:true, - animationColor:'metal', - skillAnimation:'legend', - check(card){ - if(!lib.skill.yeyan.getBigFire(get.event('player'))) return -1; - return 1/(get.value(card)||0.5); + complexCard: true, + complexSelect: true, + line: "fire", + forceDie: true, + animationColor: "metal", + skillAnimation: "legend", + check(card) { + if (!lib.skill.yeyan.getBigFire(get.event("player"))) return -1; + return 1 / (get.value(card) || 0.5); }, - multitarget:true, - multiline:true, - contentBefore(){ - player.awakenSkill('yeyan'); + multitarget: true, + multiline: true, + contentBefore() { + player.awakenSkill("yeyan"); }, - content(){ - "step 0" - event.num=0; + content() { + "step 0"; + event.num = 0; targets.sortBySeat(); - "step 1" - if(cards.length==4) event.goto(2); + ("step 1"); + if (cards.length == 4) event.goto(2); else { - if(event.numget.damageEffect(target,player,player,'fire')&&(!lib.skill.yeyan.getBigFire(player)||(target.hp<=3&&!target.hasSkillTag('filterDamage',null,{player:player})))); - if(!targets.includes(target)) return 0; - if(lib.skill.yeyan.getBigFire(player)){ - if(ui.selected.targets.length) return 0; - if(!(targets.length==1||(att<0&&target.identity&&target.identity.indexOf('zhu')!=-1))) return 0; - } - return att*get.damageEffect(target,player,player,'fire'); + if (event.num < targets.length) { + targets[event.num].damage("fire", 1, "nocard"); + event.num++; } + if (event.num == targets.length) event.finish(); + else event.redo(); } + ("step 2"); + player.loseHp(3); + if (targets.length == 1) event.goto(4); + else { + player + .chooseTarget("请选择受到2点伤害的角色", true, function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return 1; + }) + .set("forceDie", true) + .set("targets", targets); + } + ("step 3"); + if (event.num < targets.length) { + var dnum = 1; + if (result.bool && result.targets && targets[event.num] == result.targets[0]) + dnum = 2; + targets[event.num].damage("fire", dnum, "nocard"); + event.num++; + } + if (event.num == targets.length) event.finish(); + else event.redo(); + ("step 4"); + player + .chooseControl("2点", "3点") + .set("prompt", "请选择伤害点数") + .set("ai", function () { + return "3点"; + }) + .set("forceDie", true); + ("step 5"); + targets[0].damage("fire", result.control == "2点" ? 2 : 3, "nocard"); }, - getBigFire(player){ - if(player.getDiscardableCards(player,'h').reduce((list,card)=>list.add(get.suit(card,player)),[]).length<4) return false; - const targets=game.filterPlayer(target=>get.damageEffect(target,player,player,'fire')&&target.hp<=3&&!target.hasSkillTag('filterDamage',null,{player:player})); - if(!targets.length) return false; - if(targets.length==1||targets.some(target=>get.attitude(player,target)<0&&target.identity&&target.identity.indexOf('zhu')!=-1)){ - let suits=player.getDiscardableCards(player,'h').reduce((map,card)=>{ - const suit=get.suit(card,player); - if(!map[suit]) map[suit]=[]; - return map; - },{}),cards=[]; - Object.keys(suits).forEach(i=>{ - suits[i].addArray(player.getDiscardableCards(player,'h').filter(card=>get.suit(card)==i)); - cards.add(suits[i].sort((a,b)=>get.value(a)-get.value(b))[0]); + ai: { + order(item, player) { + return lib.skill.yeyan.getBigFire(player) ? 10 : 1; + }, + fireAttack: true, + result: { + target(player, target) { + if (player.hasUnknown()) return 0; + const att = get.sgn(get.attitude(player, target)); + const targets = game.filterPlayer( + (target) => + get.damageEffect(target, player, player, "fire") && + (!lib.skill.yeyan.getBigFire(player) || + (target.hp <= 3 && + !target.hasSkillTag("filterDamage", null, { player: player }))) + ); + if (!targets.includes(target)) return 0; + if (lib.skill.yeyan.getBigFire(player)) { + if (ui.selected.targets.length) return 0; + if ( + !( + targets.length == 1 || + (att < 0 && target.identity && target.identity.indexOf("zhu") != -1) + ) + ) + return 0; + } + return att * get.damageEffect(target, player, player, "fire"); + }, + }, + }, + getBigFire(player) { + if ( + player + .getDiscardableCards(player, "h") + .reduce((list, card) => list.add(get.suit(card, player)), []).length < 4 + ) + return false; + const targets = game.filterPlayer( + (target) => + get.damageEffect(target, player, player, "fire") && + target.hp <= 3 && + !target.hasSkillTag("filterDamage", null, { player: player }) + ); + if (!targets.length) return false; + if ( + targets.length == 1 || + targets.some( + (target) => + get.attitude(player, target) < 0 && + target.identity && + target.identity.indexOf("zhu") != -1 + ) + ) { + let suits = player.getDiscardableCards(player, "h").reduce((map, card) => { + const suit = get.suit(card, player); + if (!map[suit]) map[suit] = []; + return map; + }, {}), + cards = []; + Object.keys(suits).forEach((i) => { + suits[i].addArray( + player.getDiscardableCards(player, "h").filter((card) => get.suit(card) == i) + ); + cards.add(suits[i].sort((a, b) => get.value(a) - get.value(b))[0]); }); - return player.hp+player.countCards('h',card=>!cards.includes(card)&&player.canSaveCard(card,player))-3>0; + return ( + player.hp + + player.countCards( + "h", + (card) => !cards.includes(card) && player.canSaveCard(card, player) + ) - + 3 > + 0 + ); } return false; }, }, - longhun:{ - audio:4, - group:['longhun1','longhun2','longhun3','longhun4'], - ai:{ - fireAttack:true, - skillTagFilter(player,tag){ - switch(tag){ - case 'respondSha':{ - if(player.countCards('he',{suit:'diamond'})=1) return [0,0]; - if(!target.hasFriend()) return; - if((get.tag(card,'damage')==1||get.tag(card,'loseHp'))&&target.hp>1) return [0,1]; - } + maixie: true, + respondSha: true, + respondShan: true, + effect: { + target(card, player, target) { + if (get.tag(card, "recover") && target.hp >= 1) return [0, 0]; + if (!target.hasFriend()) return; + if ((get.tag(card, "damage") == 1 || get.tag(card, "loseHp")) && target.hp > 1) + return [0, 1]; + }, }, - threaten(player,target){ - if(target.hp==1) return 2; + threaten(player, target) { + if (target.hp == 1) return 2; return 0.5; }, - } + }, }, - longhun1:{ - audio:true, - enable:['chooseToUse','chooseToRespond'], - prompt(){ - return '将'+get.cnNumber(Math.max(1,_status.event.player.hp))+'张红桃牌当作桃使用'; + longhun1: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张红桃牌当作桃使用"; }, - position:'hes', - check(card,event){ - if(_status.event.player.hp>1) return 0; - return 10-get.value(card); + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 10 - get.value(card); }, - selectCard(){ - return Math.max(1,_status.event.player.hp); + selectCard() { + return Math.max(1, _status.event.player.hp); }, - viewAs:{name:'tao'}, - viewAsFilter(player){ - return player.countCards('hes',{suit:'heart'})>=player.hp; + viewAs: { name: "tao" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "heart" }) >= player.hp; + }, + filterCard(card) { + return get.suit(card) == "heart"; }, - filterCard(card){ - return get.suit(card)=='heart'; - } }, - longhun2:{ - audio:true, - enable:['chooseToUse','chooseToRespond'], - prompt(){ - return '将'+get.cnNumber(Math.max(1,_status.event.player.hp))+'张方片当作火杀使用或打出'; + longhun2: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return ( + "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张方片当作火杀使用或打出" + ); }, - position:'hes', - check(card,event){ - if(_status.event.player.hp>1) return 0; - return 10-get.value(card); + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 10 - get.value(card); }, - selectCard(){ - return Math.max(1,_status.event.player.hp); + selectCard() { + return Math.max(1, _status.event.player.hp); }, - viewAs:{name:'sha',nature:'fire'}, - viewAsFilter(player){ - return player.countCards('hes',{suit:'diamond'})>=player.hp; + viewAs: { name: "sha", nature: "fire" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "diamond" }) >= player.hp; + }, + filterCard(card) { + return get.suit(card) == "diamond"; }, - filterCard(card){ - return get.suit(card)=='diamond'; - } }, - longhun3:{ - audio:true, - enable:['chooseToUse','chooseToRespond'], - prompt(){ - return '将'+get.cnNumber(Math.max(1,_status.event.player.hp))+'张黑桃牌当作无懈可击使用'; + longhun3: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return ( + "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张黑桃牌当作无懈可击使用" + ); }, - position:'hes', - check(card,event){ - if(_status.event.player.hp>1) return 0; - return 7-get.value(card); + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 7 - get.value(card); }, - selectCard(){ - return Math.max(1,_status.event.player.hp); + selectCard() { + return Math.max(1, _status.event.player.hp); }, - viewAs:{name:'wuxie'}, - viewAsFilter(player){ - return player.countCards('hes',{suit:'spade'})>=player.hp; + viewAs: { name: "wuxie" }, + viewAsFilter(player) { + return player.countCards("hes", { suit: "spade" }) >= player.hp; + }, + filterCard(card) { + return get.suit(card) == "spade"; }, - filterCard(card){ - return get.suit(card)=='spade'; - } }, - longhun4:{ - audio:true, - enable:['chooseToUse','chooseToRespond'], - prompt(){ - return '将'+get.cnNumber(Math.max(1,_status.event.player.hp))+'张梅花牌当作闪使用或打出'; + longhun4: { + audio: true, + enable: ["chooseToUse", "chooseToRespond"], + prompt() { + return ( + "将" + get.cnNumber(Math.max(1, _status.event.player.hp)) + "张梅花牌当作闪使用或打出" + ); }, - position:'hes', - check(card,event){ - if(_status.event.player.hp>1) return 0; - return 10-get.value(card); + position: "hes", + check(card, event) { + if (_status.event.player.hp > 1) return 0; + return 10 - get.value(card); }, - selectCard(){ - return Math.max(1,_status.event.player.hp); + selectCard() { + return Math.max(1, _status.event.player.hp); }, - viewAsFilter(player){ - return player.countCards('hes',{suit:'club'})>=player.hp; + viewAsFilter(player) { + return player.countCards("hes", { suit: "club" }) >= player.hp; + }, + viewAs: { name: "shan" }, + filterCard(card) { + return get.suit(card) == "club"; }, - viewAs:{name:'shan'}, - filterCard(card){ - return get.suit(card)=='club'; - } }, - juejing:{ - mod:{ - maxHandcard(player,num){ - return 2+num; - } + juejing: { + mod: { + maxHandcard(player, num) { + return 2 + num; + }, }, - audio:true, - trigger:{player:'phaseDrawBegin2'}, + audio: true, + trigger: { player: "phaseDrawBegin2" }, //priority:-5, - filter(event,player){ - return !event.numFixed&&player.hp0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max){ - max=temp; - name2=map[name]; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; } } } - if(name2==get.suit(card,player)) return (name2=='diamond'?(5-get.value(card)):20-get.value(card)); + if (name2 == get.suit(card, player)) + return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); return 0; } return 1; }, //选牌数量 - selectCard:[1,2], + selectCard: [1, 2], //确保选择第一张牌后 重新检测第二张牌的合法性 避免选择两张花色不同的牌 - complexCard:true, + complexCard: true, //选牌范围:手牌区和装备区和木马 - position:'hes', + position: "hes", //选牌合法性判断 - filterCard(card,player,event){ + filterCard(card, player, event) { //如果已经选了一张牌 那么第二张牌和第一张花色相同即可 - if(ui.selected.cards.length) return get.suit(card,player)==get.suit(ui.selected.cards[0],player); - event=event||_status.event; + if (ui.selected.cards.length) + return get.suit(card, player) == get.suit(ui.selected.cards[0], player); + event = event || _status.event; //获取当前时机的卡牌选择限制 - var filter=event._backup.filterCard; + var filter = event._backup.filterCard; //获取卡牌花色 - var name=get.suit(card,player); + var name = get.suit(card, player); //如果这张牌是梅花并且当前时机能够使用/打出闪 那么这张牌可以选择 - if(name=='club'&&filter(get.autoViewAs({name:'shan'},'unsure'),player,event)) return true; + if (name == "club" && filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) + return true; //如果这张牌是方片并且当前时机能够使用/打出火杀 那么这张牌可以选择 - if(name=='diamond'&&filter(get.autoViewAs({name:'sha',nature:'fire'},'unsure'),player,event)) return true; + if ( + name == "diamond" && + filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) + ) + return true; //如果这张牌是黑桃并且当前时机能够使用/打出无懈 那么这张牌可以选择 - if(name=='spade'&&filter(get.autoViewAs({name:'wuxie'},'unsure'),player,event)) return true; + if (name == "spade" && filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) + return true; //如果这张牌是红桃并且当前时机能够使用/打出桃 那么这张牌可以选择 - if(name=='heart'&&filter(get.autoViewAs({name:'tao'},'unsure'),player,event)) return true; + if (name == "heart" && filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event)) + return true; //上述条件都不满足 那么就不能选择这张牌 return false; }, //判断当前时机能否发动技能 - filter(event,player){ + filter(event, player) { //获取当前时机的卡牌选择限制 - var filter=event.filterCard; + var filter = event.filterCard; //如果当前时机能够使用/打出火杀并且角色有方片 那么可以发动技能 - if(filter(get.autoViewAs({name:'sha',nature:'fire'},'unsure'),player,event)&&player.countCards('hes',{suit:'diamond'})) return true; + if ( + filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && + player.countCards("hes", { suit: "diamond" }) + ) + return true; //如果当前时机能够使用/打出闪并且角色有梅花 那么可以发动技能 - if(filter(get.autoViewAs({name:'shan'},'unsure'),player,event)&&player.countCards('hes',{suit:'club'})) return true; + if ( + filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && + player.countCards("hes", { suit: "club" }) + ) + return true; //如果当前时机能够使用/打出桃并且角色有红桃 那么可以发动技能 - if(filter(get.autoViewAs({name:'tao'},'unsure'),player,event)&&player.countCards('hes',{suit:'heart'})) return true; + if ( + filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && + player.countCards("hes", { suit: "heart" }) + ) + return true; //如果当前时机能够使用/打出无懈可击并且角色有黑桃 那么可以发动技能 - if(filter(get.autoViewAs({name:'wuxie'},'unsure'),player,event)&&player.countCards('hes',{suit:'spade'})) return true; + if ( + filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && + player.countCards("hes", { suit: "spade" }) + ) + return true; return false; }, - ai:{ - respondSha:true, - respondShan:true, + ai: { + respondSha: true, + respondShan: true, //让系统知道角色“有杀”“有闪” - skillTagFilter(player,tag){ + skillTagFilter(player, tag) { var name; - switch(tag){ - case 'respondSha':name='diamond';break; - case 'respondShan':name='club';break; - case 'save':name='heart';break; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; } - if(!player.countCards('hes',{suit:name})) return false; + if (!player.countCards("hes", { suit: name })) return false; }, //AI牌序 - order(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max) max=temp; + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; } } - max/=1.1; + max /= 1.1; return max; } return 2; }, }, //让系统知道玩家“有无懈”“有桃” - hiddenCard(player,name){ - if(name=='wuxie'&&_status.connectMode&&player.countCards('hs')>0) return true; - if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>0; - if(name=='tao') return player.countCards('hes',{suit:'heart'})>0; + hiddenCard(player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; }, - group:['relonghun_num','relonghun_discard'], - subSkill:{ - num:{ - trigger:{player:'useCard'}, - forced:true, - popup:false, - filter(event){ - var evt=event; - return ['sha','tao'].includes(evt.card.name)&&evt.skill=='relonghun'&&evt.cards&&evt.cards.length==2; + group: ["relonghun_num", "relonghun_discard"], + subSkill: { + num: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + filter(event) { + var evt = event; + return ( + ["sha", "tao"].includes(evt.card.name) && + evt.skill == "relonghun" && + evt.cards && + evt.cards.length == 2 + ); }, - content(){ + content() { trigger.baseDamage++; - } + }, }, - discard:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - popup:false, - logTarget(){ + discard: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + logTarget() { return _status.currentPhase; }, - autodelay(event){ - return event.name=='respond'?0.5:false; + autodelay(event) { + return event.name == "respond" ? 0.5 : false; }, - filter(evt,player){ - return ['shan','wuxie'].includes(evt.card.name)&&evt.skill=='relonghun'&& - evt.cards&&evt.cards.length==2&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.countDiscardableCards(player,'he'); + filter(evt, player) { + return ( + ["shan", "wuxie"].includes(evt.card.name) && + evt.skill == "relonghun" && + evt.cards && + evt.cards.length == 2 && + _status.currentPhase && + _status.currentPhase != player && + _status.currentPhase.countDiscardableCards(player, "he") + ); }, - content(){ + content() { //game.log(trigger.card) //game.log(trigger.cards) - player.line(_status.currentPhase,'green'); - player.discardPlayerCard(_status.currentPhase,'he',true); - } - } - } + player.line(_status.currentPhase, "green"); + player.discardPlayerCard(_status.currentPhase, "he", true); + }, + }, + }, }, - xinlonghun:{ - audio:'longhun', - enable:['chooseToUse','chooseToRespond'], - prompt:'将♦手牌当做火【杀】,♥手牌当做【桃】,♣手牌当做【闪】,♠手牌当做【无懈可击】使用或打出', - viewAs(cards,player){ - if(cards.length){ - var name=false,nature=null; - switch(get.suit(cards[0],player)){ - case 'club':name='shan';break; - case 'diamond':name='sha';nature='fire';break; - case 'spade':name='wuxie';break; - case 'heart':name='tao';break; + xinlonghun: { + audio: "longhun", + enable: ["chooseToUse", "chooseToRespond"], + prompt: "将♦手牌当做火【杀】,♥手牌当做【桃】,♣手牌当做【闪】,♠手牌当做【无懈可击】使用或打出", + viewAs(cards, player) { + if (cards.length) { + var name = false, + nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; } - if(name) return {name:name,nature:nature}; + if (name) return { name: name, nature: nature }; } return null; }, - check(card){ - var player=_status.event.player; - if(_status.event.type=='phase'){ - var max=0; + check(card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; var name2; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max){ - max=temp; - name2=map[name]; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hs", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; } } } - if(name2==get.suit(card,player)) return (name2=='diamond'?(5-get.value(card)):20-get.value(card)); + if (name2 == get.suit(card, player)) + return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); return 0; } return 1; }, - position:'hs', - filterCard(card,player,event){ - event=event||_status.event; - var filter=event._backup.filterCard; - var name=get.suit(card,player); - if(name=='club'&&filter({name:'shan',cards:[card]},player,event)) return true; - if(name=='diamond'&&filter({name:'sha',cards:[card],nature:'fire'},player,event)) return true; - if(name=='spade'&&filter({name:'wuxie',cards:[card]},player,event)) return true; - if(name=='heart'&&filter({name:'tao',cards:[card]},player,event)) return true; + position: "hs", + filterCard(card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if ( + name == "diamond" && + filter({ name: "sha", cards: [card], nature: "fire" }, player, event) + ) + return true; + if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) + return true; + if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; return false; }, - filter(event,player){ - var filter=event.filterCard; - if(filter(get.autoViewAs({name:'sha',nature:'fire'},'unsure'),player,event)&&player.countCards('hs',{suit:'diamond'})) return true; - if(filter(get.autoViewAs({name:'shan'},'unsure'),player,event)&&player.countCards('hs',{suit:'club'})) return true; - if(filter(get.autoViewAs({name:'tao'},'unsure'),player,event)&&player.countCards('hs',{suit:'heart'})) return true; - if(filter(get.autoViewAs({name:'wuxie'},'unsure'),player,event)&&player.countCards('hs',{suit:'spade'})) return true; + filter(event, player) { + var filter = event.filterCard; + if ( + filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && + player.countCards("hs", { suit: "diamond" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && + player.countCards("hs", { suit: "club" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && + player.countCards("hs", { suit: "heart" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && + player.countCards("hs", { suit: "spade" }) + ) + return true; return false; }, - precontent(){ + precontent() { delete event.result.skill; - player.logSkill('longhun'+(4-lib.suit.indexOf(get.suit(event.result.cards[0],player)))); + player.logSkill( + "longhun" + (4 - lib.suit.indexOf(get.suit(event.result.cards[0], player))) + ); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player,tag){ + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { var name; - switch(tag){ - case 'respondSha':name='diamond';break; - case 'respondShan':name='club';break; - case 'save':name='heart';break; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; } - if(!player.countCards('hs',{suit:name})) return false; + if (!player.countCards("hs", { suit: name })) return false; }, - order(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max) max=temp; + order(item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hs", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; } } - max/=1.1; + max /= 1.1; return max; } return 2; }, }, - hiddenCard(player,name){ - if(name=='wuxie'&&_status.connectMode&&player.countCards('hs')>0) return true; - if(name=='wuxie') return player.countCards('hs',{suit:'spade'})>0; - if(name=='tao') return player.countCards('hs',{suit:'heart'})>0; + hiddenCard(player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; + if (name == "wuxie") return player.countCards("hs", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hs", { suit: "heart" }) > 0; }, }, - xinjuejing:{ - mod:{ - maxHandcard(player,num){ - return 2+num; - } + xinjuejing: { + mod: { + maxHandcard(player, num) { + return 2 + num; + }, }, - audio:2, - trigger:{player:['dying','dyingAfter']}, - forced:true, - content(){ + audio: 2, + trigger: { player: ["dying", "dyingAfter"] }, + forced: true, + content() { player.draw(); - } + }, }, - shelie:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter(event,player){ + shelie: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter(event, player) { return !event.numFixed; }, - content(){ - "step 0" + content() { + "step 0"; trigger.changeToZero(); - event.cards=get.cards(5); + event.cards = get.cards(5); game.cardsGotoOrdering(event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - var str; - if(player==game.me&&!_status.auto){ - str='涉猎:获取花色各不相同的牌'; - } - else{ - str='涉猎'; - } - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - event.time=get.utc(); - game.addVideo('showCards',player,['涉猎',get.cardsInfo(event.cards)]); - game.addVideo('delay',null,2); - "step 1" - var list=[]; - for(var i of cards) list.add(get.suit(i,false)); - var next=player.chooseButton(list.length,true); - next.set('dialog',event.videoId); - next.set('filterButton',function(button){ - for(var i=0;i0){ - game.delay(0,time); + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); } - "step 3" - game.broadcastAll('closeDialog',event.videoId); - var cards2=event.cards2; - player.gain(cards2,'log','gain2'); + ("step 3"); + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + player.gain(cards2, "log", "gain2"); + }, + ai: { + threaten: 1.2, }, - ai:{ - threaten:1.2 - } }, - gongxin:{ - audio:2, - audioname:['re_lvmeng','gexuan'], - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h'); + gongxin: { + audio: 2, + audioname: ["re_lvmeng", "gexuan"], + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h"); }, - content(){ - 'step 0' - var cards=target.getCards('h'); - player.chooseButton(2,[ - '攻心', - cards, - [['弃置此牌','置于牌堆顶'],'tdnodes'], - ]).set('filterButton',function(button){ - var type=typeof button.link; - if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; - return type=='string'||get.suit(button.link)=='heart'; - }); - 'step 1' - if(result.bool){ - if(typeof result.links[0]!='string') result.links.reverse(); - var card=result.links[1],choice=result.links[0]; - if(choice=='弃置此牌') target.discard(card); - else{ - player.showCards(card,get.translation(player)+'对'+get.translation(target)+'发动了【攻心】'); - target.lose(card,ui.cardPile,'visible','insert'); + content() { + "step 0"; + var cards = target.getCards("h"); + player + .chooseButton(2, ["攻心", cards, [["弃置此牌", "置于牌堆顶"], "tdnodes"]]) + .set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) + return false; + return type == "string" || get.suit(button.link) == "heart"; + }); + ("step 1"); + if (result.bool) { + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1], + choice = result.links[0]; + if (choice == "弃置此牌") target.discard(card); + else { + player.showCards( + card, + get.translation(player) + "对" + get.translation(target) + "发动了【攻心】" + ); + target.lose(card, ui.cardPile, "visible", "insert"); } } }, - ai:{ - threaten:1.5, - result:{ - target(player,target){ - return -target.countCards('h'); - } + ai: { + threaten: 1.5, + result: { + target(player, target) { + return -target.countCards("h"); + }, }, - order:10, - expose:0.4, - } + order: 10, + expose: 0.4, + }, }, - "nzry_longnu":{ - mark:true, - locked:true, - zhuanhuanji:true, - marktext:'☯', - intro:{ - content(storage,player,skill){ - if(player.storage.nzry_longnu==true) return '锁定技,出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷杀且无使用次数限制'; - return '锁定技,出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火杀且无距离限制'; + nzry_longnu: { + mark: true, + locked: true, + zhuanhuanji: true, + marktext: "☯", + intro: { + content(storage, player, skill) { + if (player.storage.nzry_longnu == true) + return "锁定技,出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷杀且无使用次数限制"; + return "锁定技,出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火杀且无距离限制"; }, }, - audio:2, - trigger:{ - player:'phaseUseBegin' + audio: 2, + trigger: { + player: "phaseUseBegin", }, - forced:true, - content(){ - 'step 0' - player.changeZhuanhuanji('nzry_longnu'); - if(player.storage.nzry_longnu!=true){ + forced: true, + content() { + "step 0"; + player.changeZhuanhuanji("nzry_longnu"); + if (player.storage.nzry_longnu != true) { player.loseMaxHp(); - } - else{ + } else { player.loseHp(); } player.draw(); - 'step 1' - if(player.storage.nzry_longnu!=true){ - player.addTempSkill('nzry_longnu_2','phaseUseAfter'); - } - else{ - player.addTempSkill('nzry_longnu_1','phaseUseAfter'); + ("step 1"); + if (player.storage.nzry_longnu != true) { + player.addTempSkill("nzry_longnu_2", "phaseUseAfter"); + } else { + player.addTempSkill("nzry_longnu_1", "phaseUseAfter"); } }, - subSkill:{ - '1':{ - mod:{ - cardname(card,player){ - if(get.color(card)=='red') return 'sha'; + subSkill: { + 1: { + mod: { + cardname(card, player) { + if (get.color(card) == "red") return "sha"; }, - cardnature(card,player){ - if(get.color(card)=='red') return 'fire'; + cardnature(card, player) { + if (get.color(card) == "red") return "fire"; }, - targetInRange(card){ - if(get.color(card)=='red') return true; + targetInRange(card) { + if (get.color(card) == "red") return true; }, }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.tag(card,'respondSha')&¤t<0) return 0.6 - } + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.6; + }, }, - respondSha:true, + respondSha: true, }, }, - '2':{ - mod:{ - cardname(card,player){ - if(['trick','delay'].includes(lib.card[card.name].type)) return 'sha'; + 2: { + mod: { + cardname(card, player) { + if (["trick", "delay"].includes(lib.card[card.name].type)) return "sha"; }, - cardnature(card,player){ - if(['trick','delay'].includes(lib.card[card.name].type)) return 'thunder'; + cardnature(card, player) { + if (["trick", "delay"].includes(lib.card[card.name].type)) return "thunder"; }, - cardUsable(card,player){ - if(card.name=='sha'&&game.hasNature(card,'thunder')) return Infinity; + cardUsable(card, player) { + if (card.name == "sha" && game.hasNature(card, "thunder")) return Infinity; }, }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.tag(card,'respondSha')&¤t<0) return 0.6 - } + ai: { + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.6; + }, }, - respondSha:true, + respondSha: true, }, }, }, - ai:{ - fireAttack:true, - halfneg:true, - threaten:1.05, + ai: { + fireAttack: true, + halfneg: true, + threaten: 1.05, }, }, - "nzry_jieying":{ - audio:2, - locked:true, - global:"g_nzry_jieying", - ai:{ - effect:{ - target(card){ - if(card.name=='tiesuo') return 'zeroplayertarget'; + nzry_jieying: { + audio: 2, + locked: true, + global: "g_nzry_jieying", + ai: { + effect: { + target(card) { + if (card.name == "tiesuo") return "zeroplayertarget"; }, }, }, - group:["nzry_jieying_1","nzry_jieying_2"], - subSkill:{ - '1':{ - audio:'nzry_jieying', - trigger:{ - player:['linkBefore','enterGame'], - global:'phaseBefore', + group: ["nzry_jieying_1", "nzry_jieying_2"], + subSkill: { + 1: { + audio: "nzry_jieying", + trigger: { + player: ["linkBefore", "enterGame"], + global: "phaseBefore", }, - forced:true, - filter(event,player){ - if(event.name=='link') return player.isLinked(); - return (event.name!='phase'||game.phaseNumber==0)&&!player.isLinked(); + forced: true, + filter(event, player) { + if (event.name == "link") return player.isLinked(); + return (event.name != "phase" || game.phaseNumber == 0) && !player.isLinked(); }, - content(){ - if(trigger.name!='link') player.link(true); + content() { + if (trigger.name != "link") player.link(true); else trigger.cancel(); }, }, - '2':{ - audio:'nzry_jieying', - trigger:{ - player:'phaseJieshuBegin', + 2: { + audio: "nzry_jieying", + trigger: { + player: "phaseJieshuBegin", }, - direct:true, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&!current.isLinked(); + direct: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && !current.isLinked(); }); }, - content(){ - "step 0" - player.chooseTarget(true,'请选择【结营】的目标',function(card,player,target){ - return target!=player&&!target.isLinked(); - }).ai=function(target){ - return 1+Math.random(); + content() { + "step 0"; + player.chooseTarget( + true, + "请选择【结营】的目标", + function (card, player, target) { + return target != player && !target.isLinked(); + } + ).ai = function (target) { + return 1 + Math.random(); }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.line(result.targets); - player.logSkill('nzry_jieying'); + player.logSkill("nzry_jieying"); result.targets[0].link(true); - }else{ + } else { event.finish(); } }, }, }, }, - "g_nzry_jieying":{ - mod:{ - maxHandcard (player,num){ - if(game.countPlayer(function(current){return current.hasSkill('nzry_jieying')})>0&&player.isLinked()) return num+2; + g_nzry_jieying: { + mod: { + maxHandcard(player, num) { + if ( + game.countPlayer(function (current) { + return current.hasSkill("nzry_jieying"); + }) > 0 && + player.isLinked() + ) + return num + 2; }, }, }, - "nzry_junlve":{ - audio:2, + nzry_junlve: { + audio: 2, //marktext:"军", - intro:{ - content:'当前有#个标记', + intro: { + content: "当前有#个标记", }, //mark:true, - trigger:{ - player:"damageAfter", - source:"damageSource", + trigger: { + player: "damageAfter", + source: "damageSource", }, - forced:true, - content(){ - player.addMark('nzry_junlve',trigger.num); + forced: true, + content() { + player.addMark("nzry_junlve", trigger.num); + }, + ai: { + combo: "nzry_cuike", }, - ai:{ - combo:'nzry_cuike' - } }, - "nzry_cuike":{ - audio:2, - trigger:{ - player:"phaseUseBegin", + nzry_cuike: { + audio: 2, + trigger: { + player: "phaseUseBegin", }, - direct:true, - content(){ - 'step 0' - if(player.countMark('nzry_junlve')%2==1){ - player.chooseTarget('是否发动【摧克】,对一名角色造成1点伤害?').ai=function(target){ - return -get.attitude(player,target); + direct: true, + content() { + "step 0"; + if (player.countMark("nzry_junlve") % 2 == 1) { + player.chooseTarget("是否发动【摧克】,对一名角色造成1点伤害?").ai = function ( + target + ) { + return -get.attitude(player, target); }; + } else { + player.chooseTarget("是否发动【摧克】,横置一名角色并弃置其区域内的一张牌?").ai = + function (target) { + return -get.attitude(player, target); + }; } - else{ - player.chooseTarget('是否发动【摧克】,横置一名角色并弃置其区域内的一张牌?').ai=function(target){ - return -get.attitude(player,target); - }; - } - 'step 1' - if(result.bool){ - player.logSkill('nzry_cuike',result.targets); - if(player.countMark('nzry_junlve')%2==1){ + ("step 1"); + if (result.bool) { + player.logSkill("nzry_cuike", result.targets); + if (player.countMark("nzry_junlve") % 2 == 1) { result.targets[0].damage(); - } - else{ + } else { result.targets[0].link(true); - player.discardPlayerCard(result.targets[0],1,'hej',true); + player.discardPlayerCard(result.targets[0], 1, "hej", true); } } - 'step 2' - if(player.countMark('nzry_junlve')>7){ - player.chooseBool().set('ai',function(){ - return true; - }).set('prompt','是否弃置所有“军略”标记并对所有其他角色造成1点伤害?'); - }else{ + ("step 2"); + if (player.countMark("nzry_junlve") > 7) { + player + .chooseBool() + .set("ai", function () { + return true; + }) + .set("prompt", "是否弃置所有“军略”标记并对所有其他角色造成1点伤害?"); + } else { event.finish(); } - 'step 3' - if(result.bool){ - var players=game.players.slice(0).sortBySeat(); + ("step 3"); + if (result.bool) { + var players = game.players.slice(0).sortBySeat(); player.line(players); - player.removeMark('nzry_junlve',player.countMark('nzry_junlve')); - for(var i=0;i0; + unique: true, + mark: true, + skillAnimation: true, + animationColor: "metal", + enable: "phaseUse", + filter(event, player) { + return !player.storage.nzry_dinghuo && player.countMark("nzry_junlve") > 0; }, - check (event,player){ - var num=game.countPlayer(function(current){return get.attitude(player,current)<0&¤t.isLinked()}); - return player.storage.nzry_junlve>=num&&num==game.countPlayer(function(current){return get.attitude(player,current)<0}); + check(event, player) { + var num = game.countPlayer(function (current) { + return get.attitude(player, current) < 0 && current.isLinked(); + }); + return ( + player.storage.nzry_junlve >= num && + num == + game.countPlayer(function (current) { + return get.attitude(player, current) < 0; + }) + ); }, - filterTarget(card,player,target){ + filterTarget(card, player, target) { return target.isLinked(); }, - selectTarget(){ - return [1,_status.event.player.countMark('nzry_junlve')]; + selectTarget() { + return [1, _status.event.player.countMark("nzry_junlve")]; }, - multiline:true, - multitarget:true, - content (){ - 'step 0' - player.awakenSkill('nzry_dinghuo'); - player.storage.nzry_dinghuo=true; - 'step 1' - player.removeMark('nzry_junlve',player.countMark('nzry_junlve')); - for(var i=0;i=0) return false; - if(player.hasEnabledSlot()&&!player.hasEnabledSlot(5)) return false; + check(event, player) { + if (get.attitude(_status.event.player, event.player) >= 0) return false; + if (player.hasEnabledSlot() && !player.hasEnabledSlot(5)) return false; return true; }, - bannedList:[ - 'bifa','buqu','gzbuqu','songci','funan','xinfu_guhuo','reguhuo','huashen','rehuashen','old_guhuo','shouxi','xinpojun','taoluan','xintaoluan','yinbing','xinfu_yingshi','zhenwei','zhengnan','xinzhengnan','zhoufu', + bannedList: [ + "bifa", + "buqu", + "gzbuqu", + "songci", + "funan", + "xinfu_guhuo", + "reguhuo", + "huashen", + "rehuashen", + "old_guhuo", + "shouxi", + "xinpojun", + "taoluan", + "xintaoluan", + "yinbing", + "xinfu_yingshi", + "zhenwei", + "zhengnan", + "xinzhengnan", + "zhoufu", ], - logTarget:'player', - content(){ - 'step 0' - var list=[]; - var listm=[]; - var listv=[]; - if(trigger.player.name1!=undefined) listm=lib.character[trigger.player.name1][3]; - else listm=lib.character[trigger.player.name][3]; - if(trigger.player.name2!=undefined) listv=lib.character[trigger.player.name2][3]; - listm=listm.concat(listv); - var func=function(skill){ - var info=get.info(skill); - if(!info||info.charlotte||info.hiddenSkill||info.zhuSkill||info.juexingji||info.limited||info.dutySkill||(info.unique&&!info.gainable)||lib.skill.drlt_duorui.bannedList.includes(skill)) return false; + logTarget: "player", + content() { + "step 0"; + var list = []; + var listm = []; + var listv = []; + if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; + else listm = lib.character[trigger.player.name][3]; + if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if ( + !info || + info.charlotte || + info.hiddenSkill || + info.zhuSkill || + info.juexingji || + info.limited || + info.dutySkill || + (info.unique && !info.gainable) || + lib.skill.drlt_duorui.bannedList.includes(skill) + ) + return false; return true; }; - for(var i=0;i0){ - player.chooseControl(event.skills).set('prompt','请选择要获得的技能').set('ai',function(){return event.skills.randomGet()}); - } - else event.finish(); - 'step 2' - player.addTempSkills(result.control,{player:'dieAfter'}); + ("step 1"); + if (event.skills.length > 0) { + player + .chooseControl(event.skills) + .set("prompt", "请选择要获得的技能") + .set("ai", function () { + return event.skills.randomGet(); + }); + } else event.finish(); + ("step 2"); + player.addTempSkills(result.control, { player: "dieAfter" }); // player.popup(result.control,'thunder'); - player.storage.drlt_duorui=[result.control]; - player.storage.drlt_duorui_player=trigger.player; - trigger.player.storage.drlt_duorui=[result.control]; - trigger.player.addTempSkill('drlt_duorui1',{player:'phaseAfter'}); + player.storage.drlt_duorui = [result.control]; + player.storage.drlt_duorui_player = trigger.player; + trigger.player.storage.drlt_duorui = [result.control]; + trigger.player.addTempSkill("drlt_duorui1", { player: "phaseAfter" }); // game.log(player,'获得了技能','#g【'+get.translation(result.control)+'】') }, - group:['duorui_clear'], + group: ["duorui_clear"], }, - "duorui_clear":{ - trigger:{global:['phaseAfter','dieAfter'],}, - filter(event,player){ - if(!player.storage.drlt_duorui_player||!player.storage.drlt_duorui) return false; - return player.storage.drlt_duorui_player==event.player&&player.storage.drlt_duorui.length; + duorui_clear: { + trigger: { global: ["phaseAfter", "dieAfter"] }, + filter(event, player) { + if (!player.storage.drlt_duorui_player || !player.storage.drlt_duorui) return false; + return ( + player.storage.drlt_duorui_player == event.player && player.storage.drlt_duorui.length + ); }, - silent:true, - forced:true, - popup:false, - content(){ + silent: true, + forced: true, + popup: false, + content() { player.removeSkills(player.storage.drlt_duorui[0]); delete player.storage.drlt_duorui_player; - player.storage.drlt_duorui=[]; + player.storage.drlt_duorui = []; }, }, - "drlt_duorui1":{ - init(player,skill){ - player.disableSkill(skill,player.storage.drlt_duorui); + drlt_duorui1: { + init(player, skill) { + player.disableSkill(skill, player.storage.drlt_duorui); }, - onremove(player,skill){ + onremove(player, skill) { player.enableSkill(skill); }, - locked:true, - mark:true, - charlotte:true, - intro:{ - content(storage,player,skill){ - var list=[]; - for(var i in player.disabledSkills){ - if(player.disabledSkills[i].includes(skill)) list.push(i); + locked: true, + mark: true, + charlotte: true, + intro: { + content(storage, player, skill) { + var list = []; + for (var i in player.disabledSkills) { + if (player.disabledSkills[i].includes(skill)) list.push(i); } - if(list.length){ - var str='失效技能:'; - for(var i=0;i event.num2){ + if (player === event.player) { + if (event.num1 > event.num2) { opposite = event.target; - } - else { + } else { return false; } - } - else{ - if (event.num1 < event.num2){ + } else { + if (event.num1 < event.num2) { opposite = event.player; - } - else{ + } else { return false; } } return opposite && opposite.isIn() && opposite.inRangeOf(player); }, - forced:true, - content(){ + forced: true, + content() { player.chooseToEnable(); }, }, - damage:{ - audio:'drlt_zhiti', - trigger:{player:'damageEnd'}, - forced:true, - filter(event,player) { + damage: { + audio: "drlt_zhiti", + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { if (!player.hasDisabledSlot()) return false; const opposite = event.source; return opposite && opposite.isIn() && opposite.inRangeOf(player); }, - content(){ + content() { player.chooseToEnable(); }, }, }, }, - g_drlt_zhiti:{ - mod:{ - maxHandcard (player,num){ - if(player.isDamaged()) return num-game.countPlayer(function(current){ - return current!=player&¤t.hasSkill('drlt_zhiti')&¤t.inRange(player); - }); + g_drlt_zhiti: { + mod: { + maxHandcard(player, num) { + if (player.isDamaged()) + return ( + num - + game.countPlayer(function (current) { + return ( + current != player && + current.hasSkill("drlt_zhiti") && + current.inRange(player) + ); + }) + ); }, }, }, - 'drlt_poxi':{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0; + drlt_poxi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; //return target!=player; }, - content(){ - 'step 0' - event.list1=[]; - event.list2=[]; - if(player.countCards('h')>0){ - var chooseButton=player.chooseButton(4,['你的手牌',player.getCards('h'),get.translation(target.name)+'的手牌',target.getCards('h')]); + content() { + "step 0"; + event.list1 = []; + event.list2 = []; + if (player.countCards("h") > 0) { + var chooseButton = player.chooseButton(4, [ + "你的手牌", + player.getCards("h"), + get.translation(target.name) + "的手牌", + target.getCards("h"), + ]); + } else { + var chooseButton = player.chooseButton(4, [ + get.translation(target.name) + "的手牌", + target.getCards("h"), + ]); } - else{ - var chooseButton=player.chooseButton(4,[get.translation(target.name)+'的手牌',target.getCards('h')]); - } - chooseButton.set('target',target); - chooseButton.set('ai',function(button){ - var player=_status.event.player; - var target=_status.event.target; - var ps=[]; - var ts=[]; - for(var i=0;i1) return 0; - if(ts.length==0||player.hp>3) return val; - return 2*val; + var card = button.link; + var owner = get.owner(card); + var val = get.value(card) || 1; + if (owner == target) { + if (ts.length > 1) return 0; + if (ts.length == 0 || player.hp > 3) return val; + return 2 * val; } - return 7-val; + return 7 - val; }); - chooseButton.set('filterButton',function(button){ - for(var i=0;i { + return current.hasSkill("drlt_jieying") && get.attitude(player, current) <= 0; + }) + ) + return Math.max(num, 0) + 1; }, - aiOrder(player,card,num){ - if(player.hasMark('drlt_jieying_mark')&&game.hasPlayer(current=>{ - return current.hasSkill('drlt_jieying')&&get.attitude(player,current)<=0; - })) return Math.max(num,0)+1; - } }, - audio:'drlt_jieying', - trigger:{ - player:'phaseDrawBegin2' + audio: "drlt_jieying", + trigger: { + player: "phaseDrawBegin2", }, - forced:true, - filter(event,player){ - return !event.numFixed&&player.hasMark('drlt_jieying_mark')&&game.hasPlayer(function(current){ - return current.hasSkill('drlt_jieying'); + forced: true, + filter(event, player) { + return ( + !event.numFixed && + player.hasMark("drlt_jieying_mark") && + game.hasPlayer(function (current) { + return current.hasSkill("drlt_jieying"); + }) + ); + }, + content() { + trigger.num += game.countPlayer(function (current) { + return current.hasSkill("drlt_jieying"); }); }, - content(){ - trigger.num+=game.countPlayer(function(current){ - return current.hasSkill('drlt_jieying'); - }); - }, - ai:{ - nokeep:true, - skillTagFilter(player){ - return player.hasMark('drlt_jieying_mark')&&game.hasPlayer(current=>{ - return current.hasSkill('drlt_jieying')&&get.attitude(player,current)<=0; - }); - } + ai: { + nokeep: true, + skillTagFilter(player) { + return ( + player.hasMark("drlt_jieying_mark") && + game.hasPlayer((current) => { + return current.hasSkill("drlt_jieying") && get.attitude(player, current) <= 0; + }) + ); + }, }, }, - 'drlt_jieying':{ - audio:2, - locked:false, - global:'drlt_jieying_mark', - group:["drlt_jieying_1","drlt_jieying_2","drlt_jieying_3"], - subSkill:{ - '1':{ - audio:'drlt_jieying', - trigger:{ - player:'phaseBegin' + drlt_jieying: { + audio: 2, + locked: false, + global: "drlt_jieying_mark", + group: ["drlt_jieying_1", "drlt_jieying_2", "drlt_jieying_3"], + subSkill: { + 1: { + audio: "drlt_jieying", + trigger: { + player: "phaseBegin", }, - forced:true, - filter(event,player){ - return !game.hasPlayer(function(current){ - return current.hasMark('drlt_jieying_mark'); + forced: true, + filter(event, player) { + return !game.hasPlayer(function (current) { + return current.hasMark("drlt_jieying_mark"); }); }, - content(){ - player.addMark('drlt_jieying_mark',1); + content() { + player.addMark("drlt_jieying_mark", 1); }, }, - '2':{ - audio:'drlt_jieying', - trigger:{ - player:"phaseJieshuBegin", + 2: { + audio: "drlt_jieying", + trigger: { + player: "phaseJieshuBegin", }, - direct:true, - filter(event,player){ - return player.hasMark('drlt_jieying_mark'); + direct: true, + filter(event, player) { + return player.hasMark("drlt_jieying_mark"); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt('drlt_jieying'),"将“营”交给一名角色;其摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1且手牌上限+1。该角色回合结束后,其移去“营”标记,然后你获得其所有手牌。",function(card,player,target){ - return target!=player; - }).ai=function(target){ - let th=target.countCards('h'),att=get.attitude(_status.event.player,target); - for(let i in target.skills){ - let info=get.info(i); - if(info&&info.shaRelated) return Math.abs(att); + content() { + "step 0"; + player.chooseTarget( + get.prompt("drlt_jieying"), + "将“营”交给一名角色;其摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1且手牌上限+1。该角色回合结束后,其移去“营”标记,然后你获得其所有手牌。", + function (card, player, target) { + return target != player; } - if(att>0){ - if(th>3&&target.hp>2) return 0.6*th; + ).ai = function (target) { + let th = target.countCards("h"), + att = get.attitude(_status.event.player, target); + for (let i in target.skills) { + let info = get.info(i); + if (info && info.shaRelated) return Math.abs(att); } - if(att<1){ - if(target.countCards('j',{name:'lebu'})) return 1+Math.min((1.5+th)*0.8,target.getHandcardLimit()*0.7); - if(!th||target.getEquip('zhangba')||target.getEquip('guanshi')) return 0; - if(!target.inRange(player)||player.countCards('hs',{name:'shan'})>1) return Math.min((1+th)*0.3,target.getHandcardLimit()*0.2); + if (att > 0) { + if (th > 3 && target.hp > 2) return 0.6 * th; + } + if (att < 1) { + if (target.countCards("j", { name: "lebu" })) + return ( + 1 + Math.min((1.5 + th) * 0.8, target.getHandcardLimit() * 0.7) + ); + if (!th || target.getEquip("zhangba") || target.getEquip("guanshi")) + return 0; + if ( + !target.inRange(player) || + player.countCards("hs", { name: "shan" }) > 1 + ) + return Math.min((1 + th) * 0.3, target.getHandcardLimit() * 0.2); } return 0; }; - 'step 1' - if(result.bool){ - var target=result.targets[0]; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - player.logSkill('drlt_jieying',target); - var mark=player.countMark('drlt_jieying_mark'); - player.removeMark('drlt_jieying_mark',mark); - target.addMark('drlt_jieying_mark',mark); + player.logSkill("drlt_jieying", target); + var mark = player.countMark("drlt_jieying_mark"); + player.removeMark("drlt_jieying_mark", mark); + target.addMark("drlt_jieying_mark", mark); } }, - ai:{ - effect:{ - player(card,player,target){ - if(get.name(card)==='lebu'&&get.attitude(player,target)<0) return 1+Math.min((target.countCards('h')+1.5)*0.8,target.getHandcardLimit()*0.7); - } - } - } + ai: { + effect: { + player(card, player, target) { + if (get.name(card) === "lebu" && get.attitude(player, target) < 0) + return ( + 1 + + Math.min( + (target.countCards("h") + 1.5) * 0.8, + target.getHandcardLimit() * 0.7 + ) + ); + }, + }, + }, }, - '3':{ - audio:'drlt_jieying', - trigger:{ - global:'phaseEnd', + 3: { + audio: "drlt_jieying", + trigger: { + global: "phaseEnd", }, - forced:true, - filter(event,player){ - return player!=event.player&&event.player.hasMark('drlt_jieying_mark')&&event.player.isIn(); + forced: true, + filter(event, player) { + return ( + player != event.player && + event.player.hasMark("drlt_jieying_mark") && + event.player.isIn() + ); }, - logTarget:'player', - content(){ - if(trigger.player.countCards('h')>0){ - trigger.player.give(trigger.player.getCards('h'),player); + logTarget: "player", + content() { + if (trigger.player.countCards("h") > 0) { + trigger.player.give(trigger.player.getCards("h"), player); } - trigger.player.removeMark('drlt_jieying_mark',trigger.player.countMark('drlt_jieying_mark')); + trigger.player.removeMark( + "drlt_jieying_mark", + trigger.player.countMark("drlt_jieying_mark") + ); }, }, }, }, }, - card:{ - changandajian_equip1:{ - fullskin:true, - derivation:'shen_sunquan', - type:'equip', - subtype:'equip1', - distance:{attackFrom:-5}, - onLose(){ + card: { + changandajian_equip1: { + fullskin: true, + derivation: "shen_sunquan", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -5 }, + onLose() { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); - player.addTempSkill('changandajian_destroy'); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); }, - ai:{ - value(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - equipValue(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - basic:{ - equipValue:2, - } + basic: { + equipValue: 2, + }, }, }, - changandajian_equip2:{ - fullskin:true, - cardimage:'changandajian_equip1', - derivation:'shen_sunquan', - type:'equip', - subtype:'equip2', - onLose(){ + changandajian_equip2: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip2", + onLose() { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); - player.addTempSkill('changandajian_destroy'); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); }, - ai:{ - value(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - equipValue(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - basic:{ - equipValue:2, - } + basic: { + equipValue: 2, + }, }, }, - changandajian_equip3:{ - fullskin:true, - cardimage:'changandajian_equip1', - derivation:'shen_sunquan', - type:'equip', - subtype:'equip3', - distance:{globalTo:2}, - onLose(){ + changandajian_equip3: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip3", + distance: { globalTo: 2 }, + onLose() { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); - player.addTempSkill('changandajian_destroy'); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); }, - ai:{ - value(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - equipValue(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - basic:{ - equipValue:2, - } + basic: { + equipValue: 2, + }, }, }, - changandajian_equip4:{ - fullskin:true, - cardimage:'changandajian_equip1', - derivation:'shen_sunquan', - type:'equip', - subtype:'equip4', - distance:{globalFrom:-2}, - onLose(){ + changandajian_equip4: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip4", + distance: { globalFrom: -2 }, + onLose() { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); - player.addTempSkill('changandajian_destroy'); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); }, - ai:{ - value(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - equipValue(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - basic:{ - equipValue:2, - } + basic: { + equipValue: 2, + }, }, }, - changandajian_equip5:{ - fullskin:true, - cardimage:'changandajian_equip1', - derivation:'shen_sunquan', - type:'equip', - subtype:'equip5', - skills:['changandajian_equip5'], - onLose(){ + changandajian_equip5: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip5", + skills: ["changandajian_equip5"], + onLose() { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); - player.addTempSkill('changandajian_destroy'); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); }, - ai:{ - value(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - equipValue(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - basic:{ - equipValue:2, - } + basic: { + equipValue: 2, + }, }, }, - changandajian_equip6:{ - fullskin:true, - cardimage:'changandajian_equip1', - derivation:'shen_sunquan', - type:'equip', - subtype:'equip6', - distance:{globalTo:2,globalFrom:-2}, - onLose(){ + changandajian_equip6: { + fullskin: true, + cardimage: "changandajian_equip1", + derivation: "shen_sunquan", + type: "equip", + subtype: "equip6", + distance: { globalTo: 2, globalFrom: -2 }, + onLose() { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); - player.addTempSkill('changandajian_destroy'); + card.destroyed = true; + game.log(card, "被销毁了"); + player.addTempSkill("changandajian_destroy"); }, - ai:{ - value(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + ai: { + value(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - equipValue(card,player){ - if(game.hasPlayer(function(current){ - return lib.skill.changandajian_destroy.getEffect(player,current)>0; - })) return 0; + equipValue(card, player) { + if ( + game.hasPlayer(function (current) { + return lib.skill.changandajian_destroy.getEffect(player, current) > 0; + }) + ) + return 0; return 8; }, - basic:{ - equipValue:2, - } + basic: { + equipValue: 2, + }, }, }, - qizhengxiangsheng:{ - enable:true, - type:'trick', - fullskin:true, - derivation:'shen_xunyu', - filterTarget:lib.filter.notMe, - content(){ - 'step 0' - if(!event.qizheng_name){ - if(player.isIn()) player.chooseControl('奇兵','正兵').set('prompt','请选择'+get.translation(target)+'的标记').set('choice',function(){ - var e1=1.5*get.sgn(get.damageEffect(target,player,target)); - var e2=0; - if(target.countGainableCards(player,'h')>0&&!target.hasSkillTag('noh')) e2=-1; - var es=target.getGainableCards(player,'e'); - if(es.length) e2=Math.min(e2,function(){ - var max=0; - for(var i of es) max=Math.max(max,get.value(i,target)) - return -max/4; - }()); - if(Math.abs(e1-e2)<=0.3) return Math.random()<0.5?'奇兵':'正兵'; - if(e1 0 && + !target.hasSkillTag("noh") + ) + e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) + max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (Math.abs(e1 - e2) <= 0.3) + return Math.random() < 0.5 ? "奇兵" : "正兵"; + if (e1 < e2) return "奇兵"; + return "正兵"; + })() + ) + .set("ai", function () { + return _status.event.choice; + }); else event.finish(); } - 'step 1' - if(!event.qizheng_name&&result&&result.control) event.qizheng_name=result.control; - if(event.directHit) event._result={bool:false}; - else target.chooseToRespond('请打出一张杀或闪响应奇正相生',function(card,player){ - var name=get.name(card); - return name=='sha'||name=='shan'; - }).set('ai',function(card){ - if(_status.event.choice=='all'){ - var rand=get.rand('qizhengxiangsheng'); - if(rand>0.5) return 0; - return 1+Math.random(); - } - if(get.name(card)==_status.event.choice) return get.order(card); - return 0; - }).set('choice',function(){ - if(target.hasSkillTag('useShan')) return 'shan'; - if(typeof event.qizheng_aibuff=='boolean'){ - var shas=target.getCards('h','sha'),shans=target.getCards('h','shan'); - if(event.qizheng_aibuff){ - if(shas.length>=Math.max(1,shans.length)) return 'shan'; - if(shans.length>shas.length) return 'sha'; - return false; - } - if(!shas.length||!shans.length) return false; - } - var e1=1.5*get.sgn(get.damageEffect(target,player,target)); - var e2=0; - if(target.countGainableCards(player,'h')>0&&!target.hasSkillTag('noh')) e2=-1; - var es=target.getGainableCards(player,'e'); - if(es.length) e2=Math.min(e2,function(){ - var max=0; - for(var i of es) max=Math.max(max,get.value(i,target)) - return -max/4; - }()); - if(e1-e2>=0.3) return 'shan'; - if(e2-e1>=0.3) return 'sha'; - return 'all'; - }()); - 'step 2' - var name=result.bool?result.card.name:null,require=event.qizheng_name; - if(require=='奇兵'&&name!='sha') target.damage(); - else if(require=='正兵'&&name!='shan'&&target.countGainableCards(player,'he')>0) player.gainPlayerCard(target,true,'he'); + ("step 1"); + if (!event.qizheng_name && result && result.control) event.qizheng_name = result.control; + if (event.directHit) event._result = { bool: false }; + else + target + .chooseToRespond("请打出一张杀或闪响应奇正相生", function (card, player) { + var name = get.name(card); + return name == "sha" || name == "shan"; + }) + .set("ai", function (card) { + if (_status.event.choice == "all") { + var rand = get.rand("qizhengxiangsheng"); + if (rand > 0.5) return 0; + return 1 + Math.random(); + } + if (get.name(card) == _status.event.choice) return get.order(card); + return 0; + }) + .set( + "choice", + (function () { + if (target.hasSkillTag("useShan")) return "shan"; + if (typeof event.qizheng_aibuff == "boolean") { + var shas = target.getCards("h", "sha"), + shans = target.getCards("h", "shan"); + if (event.qizheng_aibuff) { + if (shas.length >= Math.max(1, shans.length)) return "shan"; + if (shans.length > shas.length) return "sha"; + return false; + } + if (!shas.length || !shans.length) return false; + } + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if ( + target.countGainableCards(player, "h") > 0 && + !target.hasSkillTag("noh") + ) + e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if (e1 - e2 >= 0.3) return "shan"; + if (e2 - e1 >= 0.3) return "sha"; + return "all"; + })() + ); + ("step 2"); + var name = result.bool ? result.card.name : null, + require = event.qizheng_name; + if (require == "奇兵" && name != "sha") target.damage(); + else if ( + require == "正兵" && + name != "shan" && + target.countGainableCards(player, "he") > 0 + ) + player.gainPlayerCard(target, true, "he"); }, - ai:{ - order:5, - tag:{ - damage:0.5, - gain:0.5, - loseCard:1, - respondShan:1, - respondSha:1, + ai: { + order: 5, + tag: { + damage: 0.5, + gain: 0.5, + loseCard: 1, + respondShan: 1, + respondSha: 1, }, - result:{ - target(player,target){ - var e1=1.5*get.sgn(get.damageEffect(target,player,target)); - var e2=0; - if(target.countGainableCards(player,'h')>0&&!target.hasSkillTag('noh')) e2=-1; - var es=target.getGainableCards(player,'e'); - if(es.length) e2=Math.min(e2,function(){ - var max=0; - for(var i of es) max=Math.max(max,get.value(i,target)) - return -max/4; - }()); - if(game.hasPlayer(function(current){ - return current.hasSkill('tianzuo')&&get.attitude(current,player)<=0; - })) return Math.max(e1,e2); - return Math.min(e1,e2); + result: { + target(player, target) { + var e1 = 1.5 * get.sgn(get.damageEffect(target, player, target)); + var e2 = 0; + if (target.countGainableCards(player, "h") > 0 && !target.hasSkillTag("noh")) + e2 = -1; + var es = target.getGainableCards(player, "e"); + if (es.length) + e2 = Math.min( + e2, + (function () { + var max = 0; + for (var i of es) max = Math.max(max, get.value(i, target)); + return -max / 4; + })() + ); + if ( + game.hasPlayer(function (current) { + return current.hasSkill("tianzuo") && get.attitude(current, player) <= 0; + }) + ) + return Math.max(e1, e2); + return Math.min(e1, e2); }, }, }, }, }, - dynamicTranslate:{ - nzry_longnu(player){ - if(player.hasSkill('nzry_longnu_2')) return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; - if(player.hasSkill('nzry_longnu_1')) return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; - if(player.storage.nzry_longnu==true) return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; + dynamicTranslate: { + nzry_longnu(player) { + if (player.hasSkill("nzry_longnu_2")) + return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; + if (player.hasSkill("nzry_longnu_1")) + return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; + if (player.storage.nzry_longnu == true) + return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; return '转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。'; }, }, - translate:{ - "shen_luxun":"神陆逊", - shen_luxun_prefix:'神', - "nzry_junlve":"军略", - "nzry_junlve_info":"锁定技,当你受到或造成伤害后,你获得X个“军略”标记(X为伤害点数)。", - "nzry_cuike":"摧克", - "nzry_cuike_info":"出牌阶段开始时,若“军略”标记的数量为奇数,你可以对一名角色造成1点伤害;若“军略”标记的数量为偶数,你可以横置一名角色并弃置其区域内的一张牌。然后,若“军略”标记的数量超过7个,你可以移去全部“军略”标记并对所有其他角色造成1点伤害。", - "nzry_dinghuo":"绽火", - "nzry_dinghuo_info":"限定技,出牌阶段,你可以移去全部“军略”标记,令至多等量的已横置角色弃置所有装备区内的牌。然后,你对其中一名角色造成1点火焰伤害。", - "shen_liubei":"神刘备", - shen_liubei_prefix:'神', - "nzry_longnu":"龙怒", - "nzry_longnu_info":"转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。", - "nzry_jieying":"结营", - "nzry_jieying_info":"锁定技,游戏开始时或当你的武将牌重置时,你横置;所有已横置的角色手牌上限+2;结束阶段,你横置一名其他角色。", + translate: { + shen_luxun: "神陆逊", + shen_luxun_prefix: "神", + nzry_junlve: "军略", + nzry_junlve_info: "锁定技,当你受到或造成伤害后,你获得X个“军略”标记(X为伤害点数)。", + nzry_cuike: "摧克", + nzry_cuike_info: + "出牌阶段开始时,若“军略”标记的数量为奇数,你可以对一名角色造成1点伤害;若“军略”标记的数量为偶数,你可以横置一名角色并弃置其区域内的一张牌。然后,若“军略”标记的数量超过7个,你可以移去全部“军略”标记并对所有其他角色造成1点伤害。", + nzry_dinghuo: "绽火", + nzry_dinghuo_info: + "限定技,出牌阶段,你可以移去全部“军略”标记,令至多等量的已横置角色弃置所有装备区内的牌。然后,你对其中一名角色造成1点火焰伤害。", + shen_liubei: "神刘备", + shen_liubei_prefix: "神", + nzry_longnu: "龙怒", + nzry_longnu_info: + "转换技,锁定技,阴:出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火【杀】且无距离限制。阳:出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷【杀】且无使用次数限制。", + nzry_jieying: "结营", + nzry_jieying_info: + "锁定技,游戏开始时或当你的武将牌重置时,你横置;所有已横置的角色手牌上限+2;结束阶段,你横置一名其他角色。", - "shen_ganning":"神甘宁", - shen_ganning_prefix:'神', - "shen_zhangliao":"神张辽", - shen_zhangliao_prefix:'神', + shen_ganning: "神甘宁", + shen_ganning_prefix: "神", + shen_zhangliao: "神张辽", + shen_zhangliao_prefix: "神", - "drlt_poxi":"魄袭", - "drlt_poxi_info":"出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可以弃置你与其手牌中的四张花色不同的牌。若如此做,根据此次弃置你的牌的数量执行以下效果:零张,扣减1点体力上限;一张,你结束出牌阶段且本回合手牌上限-1;三张,你回复1点体力;四张,你摸四张牌。", - "drlt_jieying":"劫营", - "drlt_jieying_info":"回合开始时,若场上没有拥有“营”标记的角色,你获得1个“营”标记;结束阶段,你可以将你的一个“营”标记交给一名角色;有“营”标记的角色摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1,手牌上限+1。有“营”的其他角色回合结束时,其移去“营”标记,然后你获得其所有手牌。", - drlt_jieying_mark:"劫营", - "drlt_duorui1":"失效技能", - "drlt_duorui1_bg":"锐", - "drlt_duorui":"夺锐", - "drlt_duorui_info":"当你于出牌阶段内对一名其他角色造成伤害后,你可以废除你装备区内的一个装备栏(若已全部废除则可以跳过此步骤),然后获得该角色的一个技能直到其的下回合结束或其死亡(觉醒技,限定技,主公技,隐匿技,使命技等特殊技能除外)。若如此做,该角色该技能失效且你不能再发动〖夺锐〗直到你失去以此法获得的技能。", - "drlt_zhiti":"止啼", - "drlt_zhiti_info":"锁定技。①你攻击范围内已受伤的其他角色手牌上限-1;②当你拼点或【决斗】胜利/或受到伤害后,若对方/伤害来源在你的攻击范围内,则你恢复一个装备栏。", + drlt_poxi: "魄袭", + drlt_poxi_info: + "出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可以弃置你与其手牌中的四张花色不同的牌。若如此做,根据此次弃置你的牌的数量执行以下效果:零张,扣减1点体力上限;一张,你结束出牌阶段且本回合手牌上限-1;三张,你回复1点体力;四张,你摸四张牌。", + drlt_jieying: "劫营", + drlt_jieying_info: + "回合开始时,若场上没有拥有“营”标记的角色,你获得1个“营”标记;结束阶段,你可以将你的一个“营”标记交给一名角色;有“营”标记的角色摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1,手牌上限+1。有“营”的其他角色回合结束时,其移去“营”标记,然后你获得其所有手牌。", + drlt_jieying_mark: "劫营", + drlt_duorui1: "失效技能", + drlt_duorui1_bg: "锐", + drlt_duorui: "夺锐", + drlt_duorui_info: + "当你于出牌阶段内对一名其他角色造成伤害后,你可以废除你装备区内的一个装备栏(若已全部废除则可以跳过此步骤),然后获得该角色的一个技能直到其的下回合结束或其死亡(觉醒技,限定技,主公技,隐匿技,使命技等特殊技能除外)。若如此做,该角色该技能失效且你不能再发动〖夺锐〗直到你失去以此法获得的技能。", + drlt_zhiti: "止啼", + drlt_zhiti_info: + "锁定技。①你攻击范围内已受伤的其他角色手牌上限-1;②当你拼点或【决斗】胜利/或受到伤害后,若对方/伤害来源在你的攻击范围内,则你恢复一个装备栏。", - shen_zhaoyun:'神赵云', - shen_zhaoyun_prefix:'神', - shen_guanyu:'神关羽', - shen_guanyu_prefix:'神', - shen_lvmeng:'神吕蒙', - shen_lvmeng_prefix:'神', - shen_simayi:'神司马懿', - shen_simayi_prefix:'神', - shen_caocao:'神曹操', - shen_caocao_prefix:'神', - shen_zhugeliang:'神诸葛亮', - shen_zhugeliang_prefix:'神', - shen_zhouyu:'神周瑜', - shen_zhouyu_prefix:'神', - shen_lvbu:'神吕布', - shen_lvbu_prefix:'神', - xinjuejing:'绝境', - xinjuejing_info:'锁定技。①你的手牌上限+2。②当你进入或脱离濒死状态时,你摸一张牌。', - relonghun:'龙魂', - relonghun_info:'你可以将同花色的一至两张牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当普【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。', - xinlonghun:'龙魂', - xinlonghun_info:'你可以将你的手牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。', - longhun:'龙魂', - longhun1:'龙魂♥︎', - longhun2:'龙魂♦︎', - longhun3:'龙魂♠︎', - longhun4:'龙魂♣︎', - juejing:'绝境', - longhun_info:'你可以将同花色的X张牌按下列规则使用或打出:红桃当【桃】,方块当具火焰伤害的【杀】,梅花当【闪】,黑桃当【无懈可击】(X为你当前的体力值且至少为1)。', - juejing_info:'锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。', - wushen:'武神', - wushen_info:'锁定技。①你的红桃手牌均视为【杀】。②你使用红桃【杀】无距离和次数限制且不可被响应。', - wuhun:'武魂', - wuhun_info:'锁定技,杀死你的角色立即进入濒死状态。', - shelie:'涉猎', - gongxin:'攻心', - gongxin_discard:'弃置', - gongxin_top:'牌堆顶', - renjie:'忍戒', - renjie2:'忍戒', - renjie_info:'锁定技,当你受到1点伤害后,你获得一枚“忍”标记;锁定技,当你于弃牌阶段内弃置牌后,你获得等同于失去的牌数量的“忍”标记。', - sbaiyin:'拜印', - sbaiyin_info:'觉醒技,准备阶段开始时,若你的“忍”标记数不小于4,你减1点体力上限,然后获得〖极略〗。', - jilue:'极略', - jilue_info:'当一名角色的判定牌生效前,你可以弃1枚“忍”标记并发动〖鬼才〗;每当你受到伤害后,你可以弃1枚“忍”标记并发动〖放逐〗;当你使用锦囊牌时,你可以弃1枚“忍”标记并发动〖集智〗;出牌阶段限一次,你可以弃1枚“忍”标记并发动〖制衡〗;出牌阶段,你可以弃1枚“忍”标记并获得〖完杀〗直到回合结束。', - jilue_guicai:'鬼才', - jilue_fangzhu:'放逐', - jilue_wansha:'完杀', - jilue_zhiheng:'制衡', - jilue_jizhi:'集智', - lianpo:'连破', - lianpo_info:'一名角色的回合结束时,若你本回合内杀死过角色,则你可以进行一个额外的回合。', - guixin:'归心', - qinyin:'琴音', - yeyan:'业炎', - shelie_info:'摸牌阶段,你可以改为从牌堆顶亮出五张牌,然后选择获得不同花色的牌各一张。', - gongxin_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,并可以展示其中一张红桃牌,然后将其弃置或置于牌堆顶。', - guixin_info:'当你受到1点伤害后,你可以获得每名其他角色区域里的一张牌,然后你翻面。', - guixin_info_alter:'当你受到1点伤害后,你可以随机获得每名其他角色区域里的一张牌,然后你翻面。', - qinyin_info:'弃牌阶段结束时,若你于此阶段内弃置过两张或更多的牌,则你可以选择一项:1. 令所有角色各回复1点体力;2. 令所有角色各失去1点体力。', + shen_zhaoyun: "神赵云", + shen_zhaoyun_prefix: "神", + shen_guanyu: "神关羽", + shen_guanyu_prefix: "神", + shen_lvmeng: "神吕蒙", + shen_lvmeng_prefix: "神", + shen_simayi: "神司马懿", + shen_simayi_prefix: "神", + shen_caocao: "神曹操", + shen_caocao_prefix: "神", + shen_zhugeliang: "神诸葛亮", + shen_zhugeliang_prefix: "神", + shen_zhouyu: "神周瑜", + shen_zhouyu_prefix: "神", + shen_lvbu: "神吕布", + shen_lvbu_prefix: "神", + xinjuejing: "绝境", + xinjuejing_info: "锁定技。①你的手牌上限+2。②当你进入或脱离濒死状态时,你摸一张牌。", + relonghun: "龙魂", + relonghun_info: + "你可以将同花色的一至两张牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当普【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。", + xinlonghun: "龙魂", + xinlonghun_info: + "你可以将你的手牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当【无懈可击】。", + longhun: "龙魂", + longhun1: "龙魂♥︎", + longhun2: "龙魂♦︎", + longhun3: "龙魂♠︎", + longhun4: "龙魂♣︎", + juejing: "绝境", + longhun_info: + "你可以将同花色的X张牌按下列规则使用或打出:红桃当【桃】,方块当具火焰伤害的【杀】,梅花当【闪】,黑桃当【无懈可击】(X为你当前的体力值且至少为1)。", + juejing_info: "锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。", + wushen: "武神", + wushen_info: "锁定技。①你的红桃手牌均视为【杀】。②你使用红桃【杀】无距离和次数限制且不可被响应。", + wuhun: "武魂", + wuhun_info: "锁定技,杀死你的角色立即进入濒死状态。", + shelie: "涉猎", + gongxin: "攻心", + gongxin_discard: "弃置", + gongxin_top: "牌堆顶", + renjie: "忍戒", + renjie2: "忍戒", + renjie_info: + "锁定技,当你受到1点伤害后,你获得一枚“忍”标记;锁定技,当你于弃牌阶段内弃置牌后,你获得等同于失去的牌数量的“忍”标记。", + sbaiyin: "拜印", + sbaiyin_info: + "觉醒技,准备阶段开始时,若你的“忍”标记数不小于4,你减1点体力上限,然后获得〖极略〗。", + jilue: "极略", + jilue_info: + "当一名角色的判定牌生效前,你可以弃1枚“忍”标记并发动〖鬼才〗;每当你受到伤害后,你可以弃1枚“忍”标记并发动〖放逐〗;当你使用锦囊牌时,你可以弃1枚“忍”标记并发动〖集智〗;出牌阶段限一次,你可以弃1枚“忍”标记并发动〖制衡〗;出牌阶段,你可以弃1枚“忍”标记并获得〖完杀〗直到回合结束。", + jilue_guicai: "鬼才", + jilue_fangzhu: "放逐", + jilue_wansha: "完杀", + jilue_zhiheng: "制衡", + jilue_jizhi: "集智", + lianpo: "连破", + lianpo_info: "一名角色的回合结束时,若你本回合内杀死过角色,则你可以进行一个额外的回合。", + guixin: "归心", + qinyin: "琴音", + yeyan: "业炎", + shelie_info: "摸牌阶段,你可以改为从牌堆顶亮出五张牌,然后选择获得不同花色的牌各一张。", + gongxin_info: + "出牌阶段限一次,你可以观看一名其他角色的手牌,并可以展示其中一张红桃牌,然后将其弃置或置于牌堆顶。", + guixin_info: "当你受到1点伤害后,你可以获得每名其他角色区域里的一张牌,然后你翻面。", + guixin_info_alter: "当你受到1点伤害后,你可以随机获得每名其他角色区域里的一张牌,然后你翻面。", + qinyin_info: + "弃牌阶段结束时,若你于此阶段内弃置过两张或更多的牌,则你可以选择一项:1. 令所有角色各回复1点体力;2. 令所有角色各失去1点体力。", // qinyin_info:'每当你于弃牌阶段内因你的弃置而失去第X张手牌时(X至少为2),你可以选择一项:1.令所有角色各回复1点体力;2.令所有角色各失去1点体力。每阶段限一次。', - yeyan_info:'限定技,出牌阶段,你可以对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。', - qixing:'七星', - qixing_bg:'星', - qixing2:'七星', - qixing3:'七星', - qixing_info:'游戏开始时,你将牌堆顶的七张牌置于你的武将牌上,称之为“星”。然后/摸牌阶段结束后,你可用任意数量的手牌等量交换这些“星”。', - dawu:'大雾', - dawu2_bg:'雾', - dawu2:'大雾', - dawu3:'大雾', + yeyan_info: + "限定技,出牌阶段,你可以对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。", + qixing: "七星", + qixing_bg: "星", + qixing2: "七星", + qixing3: "七星", + qixing_info: + "游戏开始时,你将牌堆顶的七张牌置于你的武将牌上,称之为“星”。然后/摸牌阶段结束后,你可用任意数量的手牌等量交换这些“星”。", + dawu: "大雾", + dawu2_bg: "雾", + dawu2: "大雾", + dawu3: "大雾", // dawu2_info:'已获得大雾标记', - dawu_info:'结束阶段,你可以弃置X张“星”并指定等量的角色:直到你的下回合开始,当这些角色受到非雷电伤害时,防止此伤害。', - kuangfeng:'狂风', - kuangfeng2:'狂风', - kuangfeng2_bg:'风', + dawu_info: + "结束阶段,你可以弃置X张“星”并指定等量的角色:直到你的下回合开始,当这些角色受到非雷电伤害时,防止此伤害。", + kuangfeng: "狂风", + kuangfeng2: "狂风", + kuangfeng2_bg: "风", // kuangfeng2_info:'已获得狂风标记', - kuangfeng3:'狂风', - kuangfeng_info:'结束阶段,你可以弃置1张“星”并指定一名角色:直到你的下回合开始,该角色受到火焰伤害时,此伤害+1。', - baonu:'狂暴', - baonu_bg:'暴', - baonu_info:'锁定技,游戏开始时,你获得两枚“暴怒”标记;锁定技,当你造成/受到1点伤害后,你获得1枚“暴怒”标记。', - shenfen:'神愤', - shenfen_info:'限定技,出牌阶段,你可以弃置6枚暴怒标记,对场上所有其他角色造成1点伤害,然后令其弃置四张牌。', - wuqian:'无前', - wuqian_info:'出牌阶段,你可以弃置两枚暴怒标记并获得技能〖无双〗直到回合结束。', - wumou:'无谋', - wumou_info:'锁定技,当你使用普通锦囊牌时,你选择一项:1.弃置1枚“暴怒”标记;2.失去1点体力。', - ol_wuqian:'无前', - ol_wuqian_info:'出牌阶段,你可以弃置2枚“暴怒”标记并选择一名本回合内未选择过的其他角色,你获得技能〖无双〗并令其防具无效直到回合结束。', - ol_shenfen:'神愤', - ol_shenfen_info:'出牌阶段限一次,你可以弃置6枚“暴怒”标记并选择所有其他角色,对这些角色各造成1点伤害。然后这些角色先各弃置其装备区里的牌,再各弃置四张手牌。最后你将你的武将牌翻面。', - new_wuhun:'武魂', - new_wuhun_info:'锁定技,当你受到伤害后,伤害来源获得X个“梦魇”标记(X为伤害点数)。锁定技,当你死亡时,你选择一名“梦魇”标记数量最多的其他角色。该角色进行判定:若判定结果不为【桃】或【桃园结义】,则该角色死亡。', - "new_guixin":"归心", - "new_guixin_info":"当你受到1点伤害后,你可以按照你选择的区域优先度随机获得每名其他角色区域里的一张牌,然后你翻面。", - ol_zhangliao:'OL神张辽', - ol_zhangliao_prefix:'OL神', - olduorui:'夺锐', - olduorui2:'夺锐', - olduorui_info:'当你于出牌阶段内对一名角色造成伤害后,你可以选择该角色武将牌上的一个技能。若如此做,你结束出牌阶段,且你令此技能于其下个回合结束之前无效。', - olzhiti:'止啼', - olzhiti_info:'锁定技,你攻击范围内已受伤角色的手牌上限-1。若场上已受伤的角色数:不小于1,你的手牌上限+1;不小于3,你于摸牌阶段开始时令额定摸牌数+1;不小于5,回合结束时,你废除一名角色的一个随机装备栏。', - shen_caopi:'神曹丕', - shen_caopi_prefix:'神', - chuyuan:'储元', - chuyuan_info:'一名角色受到伤害后,若你武将牌上「储」的数量小于体力上限,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。', + kuangfeng3: "狂风", + kuangfeng_info: + "结束阶段,你可以弃置1张“星”并指定一名角色:直到你的下回合开始,该角色受到火焰伤害时,此伤害+1。", + baonu: "狂暴", + baonu_bg: "暴", + baonu_info: + "锁定技,游戏开始时,你获得两枚“暴怒”标记;锁定技,当你造成/受到1点伤害后,你获得1枚“暴怒”标记。", + shenfen: "神愤", + shenfen_info: + "限定技,出牌阶段,你可以弃置6枚暴怒标记,对场上所有其他角色造成1点伤害,然后令其弃置四张牌。", + wuqian: "无前", + wuqian_info: "出牌阶段,你可以弃置两枚暴怒标记并获得技能〖无双〗直到回合结束。", + wumou: "无谋", + wumou_info: "锁定技,当你使用普通锦囊牌时,你选择一项:1.弃置1枚“暴怒”标记;2.失去1点体力。", + ol_wuqian: "无前", + ol_wuqian_info: + "出牌阶段,你可以弃置2枚“暴怒”标记并选择一名本回合内未选择过的其他角色,你获得技能〖无双〗并令其防具无效直到回合结束。", + ol_shenfen: "神愤", + ol_shenfen_info: + "出牌阶段限一次,你可以弃置6枚“暴怒”标记并选择所有其他角色,对这些角色各造成1点伤害。然后这些角色先各弃置其装备区里的牌,再各弃置四张手牌。最后你将你的武将牌翻面。", + new_wuhun: "武魂", + new_wuhun_info: + "锁定技,当你受到伤害后,伤害来源获得X个“梦魇”标记(X为伤害点数)。锁定技,当你死亡时,你选择一名“梦魇”标记数量最多的其他角色。该角色进行判定:若判定结果不为【桃】或【桃园结义】,则该角色死亡。", + new_guixin: "归心", + new_guixin_info: + "当你受到1点伤害后,你可以按照你选择的区域优先度随机获得每名其他角色区域里的一张牌,然后你翻面。", + ol_zhangliao: "OL神张辽", + ol_zhangliao_prefix: "OL神", + olduorui: "夺锐", + olduorui2: "夺锐", + olduorui_info: + "当你于出牌阶段内对一名角色造成伤害后,你可以选择该角色武将牌上的一个技能。若如此做,你结束出牌阶段,且你令此技能于其下个回合结束之前无效。", + olzhiti: "止啼", + olzhiti_info: + "锁定技,你攻击范围内已受伤角色的手牌上限-1。若场上已受伤的角色数:不小于1,你的手牌上限+1;不小于3,你于摸牌阶段开始时令额定摸牌数+1;不小于5,回合结束时,你废除一名角色的一个随机装备栏。", + shen_caopi: "神曹丕", + shen_caopi_prefix: "神", + chuyuan: "储元", + chuyuan_info: + "一名角色受到伤害后,若你武将牌上「储」的数量小于体力上限,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。", //chuyuan_info:'一名角色受到伤害后,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。你的手牌上限+X(X为你武将牌上的「储」数)。', - dengji:'登极', - dengji_info:'觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后获得技能〖天行〗和〖奸雄〗。', - tianxing:'天行', - tianxing_info:'觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后失去技能〖储元〗,选择获得以下技能中的一个:〖仁德〗/〖制衡〗/〖乱击〗/〖行动〗。', - shen_zhenji:'神甄宓', - shen_zhenji_prefix:'神', - shenfu:'神赋', - shenfu_info:'回合结束时,若你的手牌数为:奇数,你可对一名其他角色造成1点雷属性伤害。若其因此进入过濒死状态,你可重复此流程(不能选择本次已选择过的角色)。偶数,你可选择一名角色,你令其摸一张牌或弃置一张手牌。若其手牌数等于体力值,你可重复此流程(不能选择本次已选择过的角色)。', - qixian:'七弦', - qixian_info:'锁定技,你的手牌上限视为7。', - caopi_xingdong:'行动', - caopi_xingdong_info:'出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。', - shen_diaochan:'神貂蝉', - shen_diaochan_prefix:'神', - meihun:'魅魂', - meihun_info:'结束阶段或当你成为【杀】的目标后,你可以令一名其他角色交给你一张你声明的花色的手牌,若其没有则你观看其手牌然后弃置其中一张。', - huoxin_control:'惑心', - huoxin:'惑心', - huoxin_info:'出牌阶段限一次,你可以展示两张花色相同的手牌并分别交给两名其他角色,然后令这两名角色拼点,没赢的角色获得1个“魅惑”标记。拥有2个或更多“魅惑”的角色回合即将开始时,该角色移去其所有“魅惑”,此回合改为由你操控。', - boss_zhaoyun:'高达一号', - boss_zhaoyun_ab:'神赵云', - boss_zhaoyun_prefix:'神', - boss_juejing:'绝境', - boss_juejing2:'绝境', - boss_juejing_info:'锁定技,摸牌阶段开始前,你跳过此阶段。当你得到牌/失去手牌后,若你的手牌数大于4/小于4,则你将手牌摸至4张/弃置至4张。', - zhanjiang:'斩将', - zhanjiang_info:'准备阶段开始时,如果其他角色的装备区内有【青釭剑】,你可以获得之。', - shen_guojia:'神郭嘉', - shen_guojia_prefix:'神', - shuishi:'慧识', - shuishi_info:'出牌阶段限一次,若你的体力上限小于10,则你可选择一名角色。你令其摸一张牌,若其以此法得到的牌:与该角色的其他手牌花色均不相同,则你加1点体力上限,若你的体力上限小于10,则你可以重复此流程;否则你减1点体力上限,且其展示所有手牌。', - stianyi:'天翊', - stianyi_info:'觉醒技,准备阶段,若场上的所有存活角色均于本局游戏内受到过伤害,则你加2点体力上限并回复1点体力,然后令一名角色获得技能〖佐幸〗。', - zuoxing:'佐幸', - zuoxing2:'佐幸', - zuoxing_info:'出牌阶段限一次,若令你获得〖佐幸〗的角色存活且体力上限大于1,则你可以令其减1点体力上限,并视为使用一张普通锦囊牌。', - sghuishi:'辉逝', - sghuishi_info:'限定技,出牌阶段,你可以选择一名其他角色:若其有未发动过的觉醒技,则你令其发动这些觉醒技时无视原有条件;否则其摸四张牌。然后你减2点体力上限。', - shen_taishici:'神太史慈', - shen_taishici_prefix:'神', - dulie:'笃烈', - dulie_info:'锁定技。当你成为【杀】的目标时,若使用者的体力值大于你,则你进行判定。若结果为红桃,则取消此目标。', - tspowei:'破围', - tspowei_info:'使命技。①游戏开始时,你令所有其他角色获得一个“围”。②一名角色受到伤害后,若其有“围”,则其移去“围”。③回合开始时,你选择所有有“围”的角色。这些角色失去“围”,然后这些角色的第一个不为你的下家获得等量的“围”。④一名其他角色的回合开始时,若其有“围”,则你可以选择一项:⒈弃置一张手牌并对其造成1点伤害。⒉若其体力值不大于你,则你获得其一张手牌。选择完成后,你视为在其攻击范围内直到回合结束。⑤使命:回合开始时,若场上没有“围”,则你获得技能〖神著〗。⑥失败:当你进入濒死状态时,你将体力值回复至1点,然后弃置装备区的所有牌。', - shenzhu:'神著', - shenzhu_info:'锁定技,当你使用有对应实体牌的非转化【杀】结算结束后,你选择一项:①摸一张牌,且本回合使用【杀】的次数上限+1。②摸三张牌,且本回合不能再使用【杀】。', - dangmo:'荡魔', - dangmo_info:'当你于出牌阶段内使用第一张【杀】选择目标后,你可以为此牌增加至多Y-1个目标(Y为你的体力值)。', - reshuishi:'慧识', - reshuishi_info:'出牌阶段限一次。若你的体力上限小于10,你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同且你的体力上限小于10,则你加1点体力上限,且可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。若其手牌数为全场最多,则你减1点体力上限。', - resghuishi:'辉逝', - resghuishi_info:'限定技,出牌阶段,你可选择一名角色。若你的体力上限不小于存活人数且其有未发动的觉醒技,则你令其中一个技能无视发动条件;否则其摸四张牌。然后你减2点体力上限。', - qizhengxiangsheng:'奇正相生', - qizhengxiangsheng_info:'出牌阶段,对一名其他角色使用。你将目标角色标记为“奇兵”或“正兵”(对其他角色不可见)。然后目标角色可以打出一张【杀】或【闪】。若其是“奇兵”且未打出【杀】,则你对其造成1点伤害;若其是“正兵”且未打出【闪】,则你获得其一张牌。', - shen_xunyu:'神荀彧', - shen_xunyu_prefix:'神', - tianzuo:'天佐', - tianzuo_info:'锁定技。①游戏开始时,你将8张【奇正相生】加入牌堆。②【奇正相生】对你无效。', - lingce:'灵策', - lingce_info:'锁定技。当有【奇正相生】或智囊或〖定汉①〗记录过的锦囊牌被使用时,若此牌不为转化牌且对应实体牌数量为1,则你摸一张牌。', - dinghan:'定汉', - dinghan_info:'①当你成为未记录过的普通锦囊牌的目标时,或有未记录过的延时锦囊牌进入你的判定区时,你记录此牌名并取消之。②准备阶段,你可在〖定汉①〗的记录中添加或减少一种锦囊牌的牌名。', - shen_sunce:'神孙策', - shen_sunce_prefix:'神', - yingba:'英霸', - yingba_info:'①出牌阶段限一次,你可令一名体力上限大于1的其他角色减少1点体力上限并获得“平定”标记,然后你减少1点体力上限。②你对拥有“平定”标记的角色使用牌没有距离限制。', - scfuhai:'覆海', - scfuhai_info:'锁定技。①当你使用牌指定目标后,若目标角色有“平定”标记,则其不可响应此牌。若你本回合内以此法得到的牌数小于2,则你摸一张牌。②拥有“平定”标记的角色死亡时,你增加X点体力上限并摸X张牌。(X为其拥有的“平定”标记数)。', - pinghe:'冯河', - pinghe_info:'锁定技。①你的手牌上限基数等于你已损失的体力值。②当你受到其他角色造成的伤害时,若你有牌且你的体力上限大于1,则你防止此伤害,减1点体力上限并将一张手牌交给一名其他角色。然后若你拥有〖英霸〗,则伤害来源获得一个“平定”标记。', - shen_jiangwei:'神姜维', - shen_jiangwei_prefix:'神', - jiufa:'九伐', - jiufa_info:'①当你声明使用牌后或打出牌时,你记录此牌的牌名。②当你使用或打出的牌结算结束后,若你的〖九伐〗记录中包含至少⑨种不同的牌名,则你可以亮出牌堆顶的⑨张牌,选择并获得其中任意张点数各不相同且{这九张牌中存在未被选择且和已选择的牌点数相同}的牌,清除所有的记录,将其余牌置入弃牌堆。', - tianren:'天任', - tianren_info:'锁定技。①当有一张基本牌或普通锦囊牌不因使用而进入弃牌堆后,你获得一枚“天任”标记。②当你获得“天任”标记或体力上限变化后,若你的“天任”数不小于X,则你移去X枚“天任”,加1点体力上限并摸两张牌(X为你的体力上限)。', - pingxiang:'平襄', - pingxiang_info:'限定技。出牌阶段,若你的体力上限大于⑨,则你可减⑨点体力上限,视为使用至多⑨张火【杀】,然后失去〖九伐〗,并将手牌上限基数改为体力上限直到游戏结束。', - shen_sunquan:'神孙权', - shen_sunquan_prefix:'神', - dili:'帝力', - dili_info:'锁定技。游戏开始时,你随机获得一条东吴命运线。', - yuheng:'驭衡', - yuheng_info:'①出牌阶段限一次。你可以失去所有不为〖驭衡〗的非锁定技,然后随机获得全部东吴命运线涉及的一个技能。若你本阶段内没有发动过其他非锁定技,则你随机获得当前东吴命运线涉及的一个内容。②出牌阶段结束时,若你未于本阶段内发动过〖驭衡①〗,则你失去1点体力。', - yuheng_append:'天下英雄谁敌手?曹刘。生子当如孙仲谋!', - dili_shengzhi:'圣质', - dili_shengzhi_info:'锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。', - dili_chigang:'持纲', - dili_chigang_info:'锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。', - dili_qionglan:'穹览', - dili_qionglan_info:'锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。', - dili_quandao:'权道', - dili_quandao_info:'锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。', - dili_jiaohui:'交辉', - dili_jiaohui_info:'锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。', - dili_yuanlv:'渊虑', - dili_yuanlv_info:'锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的不为【长安大舰】的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。', - changandajian_equip1:'长安大舰', - changandajian_equip2:'长安大舰', - changandajian_equip3:'长安大舰', - changandajian_equip4:'长安大舰', - changandajian_equip5:'长安大舰', - changandajian_equip6:'长安大舰', - changandajian_destroy:'长安大舰', - changandajian_equip1_info:'锁定技。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。', - changandajian_equip2_info:'锁定技。当你失去装备区内的【长安大舰】后,你销毁之并回复1点体力。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。', - changandajian_equip3_info:'锁定技。其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。', - changandajian_equip4_info:'锁定技。你至其他角色的距离-2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。', - changandajian_equip5_info:'锁定技。你的手牌上限+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。', - changandajian_equip6_info:'锁定技。你至其他角色的距离-2,其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。', - shen_machao:'神马超', - shen_machao_prefix:'神', - shouli:'狩骊', - shouli_backup:'狩骊', - shouli_info:'①锁定技,游戏开始时,你令场上所有角色从你的下家起,依次使用牌堆中的一张不为赠物的坐骑牌。②你可以将场上的一张进攻坐骑牌当做【杀】(无任何次数限制),防御坐骑牌当做【闪】使用或打出。若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。', - hengwu:'横骛', - hengwu_info:'当你使用或打出有花色的牌时,若你的手牌区内没有与此牌花色相同的牌,则你可以摸X张牌(X为场上装备区内花色与此牌相同的牌数)。', - hengwu_append:'棘手,怀念,摧毁!', + dengji: "登极", + dengji_info: + "觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后获得技能〖天行〗和〖奸雄〗。", + tianxing: "天行", + tianxing_info: + "觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后失去技能〖储元〗,选择获得以下技能中的一个:〖仁德〗/〖制衡〗/〖乱击〗/〖行动〗。", + shen_zhenji: "神甄宓", + shen_zhenji_prefix: "神", + shenfu: "神赋", + shenfu_info: + "回合结束时,若你的手牌数为:奇数,你可对一名其他角色造成1点雷属性伤害。若其因此进入过濒死状态,你可重复此流程(不能选择本次已选择过的角色)。偶数,你可选择一名角色,你令其摸一张牌或弃置一张手牌。若其手牌数等于体力值,你可重复此流程(不能选择本次已选择过的角色)。", + qixian: "七弦", + qixian_info: "锁定技,你的手牌上限视为7。", + caopi_xingdong: "行动", + caopi_xingdong_info: + "出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。", + shen_diaochan: "神貂蝉", + shen_diaochan_prefix: "神", + meihun: "魅魂", + meihun_info: + "结束阶段或当你成为【杀】的目标后,你可以令一名其他角色交给你一张你声明的花色的手牌,若其没有则你观看其手牌然后弃置其中一张。", + huoxin_control: "惑心", + huoxin: "惑心", + huoxin_info: + "出牌阶段限一次,你可以展示两张花色相同的手牌并分别交给两名其他角色,然后令这两名角色拼点,没赢的角色获得1个“魅惑”标记。拥有2个或更多“魅惑”的角色回合即将开始时,该角色移去其所有“魅惑”,此回合改为由你操控。", + boss_zhaoyun: "高达一号", + boss_zhaoyun_ab: "神赵云", + boss_zhaoyun_prefix: "神", + boss_juejing: "绝境", + boss_juejing2: "绝境", + boss_juejing_info: + "锁定技,摸牌阶段开始前,你跳过此阶段。当你得到牌/失去手牌后,若你的手牌数大于4/小于4,则你将手牌摸至4张/弃置至4张。", + zhanjiang: "斩将", + zhanjiang_info: "准备阶段开始时,如果其他角色的装备区内有【青釭剑】,你可以获得之。", + shen_guojia: "神郭嘉", + shen_guojia_prefix: "神", + shuishi: "慧识", + shuishi_info: + "出牌阶段限一次,若你的体力上限小于10,则你可选择一名角色。你令其摸一张牌,若其以此法得到的牌:与该角色的其他手牌花色均不相同,则你加1点体力上限,若你的体力上限小于10,则你可以重复此流程;否则你减1点体力上限,且其展示所有手牌。", + stianyi: "天翊", + stianyi_info: + "觉醒技,准备阶段,若场上的所有存活角色均于本局游戏内受到过伤害,则你加2点体力上限并回复1点体力,然后令一名角色获得技能〖佐幸〗。", + zuoxing: "佐幸", + zuoxing2: "佐幸", + zuoxing_info: + "出牌阶段限一次,若令你获得〖佐幸〗的角色存活且体力上限大于1,则你可以令其减1点体力上限,并视为使用一张普通锦囊牌。", + sghuishi: "辉逝", + sghuishi_info: + "限定技,出牌阶段,你可以选择一名其他角色:若其有未发动过的觉醒技,则你令其发动这些觉醒技时无视原有条件;否则其摸四张牌。然后你减2点体力上限。", + shen_taishici: "神太史慈", + shen_taishici_prefix: "神", + dulie: "笃烈", + dulie_info: + "锁定技。当你成为【杀】的目标时,若使用者的体力值大于你,则你进行判定。若结果为红桃,则取消此目标。", + tspowei: "破围", + tspowei_info: + "使命技。①游戏开始时,你令所有其他角色获得一个“围”。②一名角色受到伤害后,若其有“围”,则其移去“围”。③回合开始时,你选择所有有“围”的角色。这些角色失去“围”,然后这些角色的第一个不为你的下家获得等量的“围”。④一名其他角色的回合开始时,若其有“围”,则你可以选择一项:⒈弃置一张手牌并对其造成1点伤害。⒉若其体力值不大于你,则你获得其一张手牌。选择完成后,你视为在其攻击范围内直到回合结束。⑤使命:回合开始时,若场上没有“围”,则你获得技能〖神著〗。⑥失败:当你进入濒死状态时,你将体力值回复至1点,然后弃置装备区的所有牌。", + shenzhu: "神著", + shenzhu_info: + "锁定技,当你使用有对应实体牌的非转化【杀】结算结束后,你选择一项:①摸一张牌,且本回合使用【杀】的次数上限+1。②摸三张牌,且本回合不能再使用【杀】。", + dangmo: "荡魔", + dangmo_info: + "当你于出牌阶段内使用第一张【杀】选择目标后,你可以为此牌增加至多Y-1个目标(Y为你的体力值)。", + reshuishi: "慧识", + reshuishi_info: + "出牌阶段限一次。若你的体力上限小于10,你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同且你的体力上限小于10,则你加1点体力上限,且可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。若其手牌数为全场最多,则你减1点体力上限。", + resghuishi: "辉逝", + resghuishi_info: + "限定技,出牌阶段,你可选择一名角色。若你的体力上限不小于存活人数且其有未发动的觉醒技,则你令其中一个技能无视发动条件;否则其摸四张牌。然后你减2点体力上限。", + qizhengxiangsheng: "奇正相生", + qizhengxiangsheng_info: + "出牌阶段,对一名其他角色使用。你将目标角色标记为“奇兵”或“正兵”(对其他角色不可见)。然后目标角色可以打出一张【杀】或【闪】。若其是“奇兵”且未打出【杀】,则你对其造成1点伤害;若其是“正兵”且未打出【闪】,则你获得其一张牌。", + shen_xunyu: "神荀彧", + shen_xunyu_prefix: "神", + tianzuo: "天佐", + tianzuo_info: "锁定技。①游戏开始时,你将8张【奇正相生】加入牌堆。②【奇正相生】对你无效。", + lingce: "灵策", + lingce_info: + "锁定技。当有【奇正相生】或智囊或〖定汉①〗记录过的锦囊牌被使用时,若此牌不为转化牌且对应实体牌数量为1,则你摸一张牌。", + dinghan: "定汉", + dinghan_info: + "①当你成为未记录过的普通锦囊牌的目标时,或有未记录过的延时锦囊牌进入你的判定区时,你记录此牌名并取消之。②准备阶段,你可在〖定汉①〗的记录中添加或减少一种锦囊牌的牌名。", + shen_sunce: "神孙策", + shen_sunce_prefix: "神", + yingba: "英霸", + yingba_info: + "①出牌阶段限一次,你可令一名体力上限大于1的其他角色减少1点体力上限并获得“平定”标记,然后你减少1点体力上限。②你对拥有“平定”标记的角色使用牌没有距离限制。", + scfuhai: "覆海", + scfuhai_info: + "锁定技。①当你使用牌指定目标后,若目标角色有“平定”标记,则其不可响应此牌。若你本回合内以此法得到的牌数小于2,则你摸一张牌。②拥有“平定”标记的角色死亡时,你增加X点体力上限并摸X张牌。(X为其拥有的“平定”标记数)。", + pinghe: "冯河", + pinghe_info: + "锁定技。①你的手牌上限基数等于你已损失的体力值。②当你受到其他角色造成的伤害时,若你有牌且你的体力上限大于1,则你防止此伤害,减1点体力上限并将一张手牌交给一名其他角色。然后若你拥有〖英霸〗,则伤害来源获得一个“平定”标记。", + shen_jiangwei: "神姜维", + shen_jiangwei_prefix: "神", + jiufa: "九伐", + jiufa_info: + "①当你声明使用牌后或打出牌时,你记录此牌的牌名。②当你使用或打出的牌结算结束后,若你的〖九伐〗记录中包含至少⑨种不同的牌名,则你可以亮出牌堆顶的⑨张牌,选择并获得其中任意张点数各不相同且{这九张牌中存在未被选择且和已选择的牌点数相同}的牌,清除所有的记录,将其余牌置入弃牌堆。", + tianren: "天任", + tianren_info: + "锁定技。①当有一张基本牌或普通锦囊牌不因使用而进入弃牌堆后,你获得一枚“天任”标记。②当你获得“天任”标记或体力上限变化后,若你的“天任”数不小于X,则你移去X枚“天任”,加1点体力上限并摸两张牌(X为你的体力上限)。", + pingxiang: "平襄", + pingxiang_info: + "限定技。出牌阶段,若你的体力上限大于⑨,则你可减⑨点体力上限,视为使用至多⑨张火【杀】,然后失去〖九伐〗,并将手牌上限基数改为体力上限直到游戏结束。", + shen_sunquan: "神孙权", + shen_sunquan_prefix: "神", + dili: "帝力", + dili_info: + '锁定技。游戏开始时,你随机获得一条东吴命运线。', + yuheng: "驭衡", + yuheng_info: + '①出牌阶段限一次。你可以失去所有不为〖驭衡〗的非锁定技,然后随机获得全部东吴命运线涉及的一个技能。若你本阶段内没有发动过其他非锁定技,则你随机获得当前东吴命运线涉及的一个内容。②出牌阶段结束时,若你未于本阶段内发动过〖驭衡①〗,则你失去1点体力。', + yuheng_append: '天下英雄谁敌手?曹刘。生子当如孙仲谋!', + dili_shengzhi: "圣质", + dili_shengzhi_info: + "锁定技。若你因〖驭衡〗获得过〖英魂〗〖弘德〗〖秉壹〗,则当你使用点数为质数的牌时,此牌不可被响应。", + dili_chigang: "持纲", + dili_chigang_info: + "锁定技。若你因〖驭衡〗获得过〖观微〗〖弼政〗〖安国〗,则当你的判定阶段开始前,你跳过此阶段并获得一个额外的摸牌阶段。", + dili_qionglan: "穹览", + dili_qionglan_info: + '锁定技,限定技。若你因〖驭衡〗获得过〖涉猎〗〖问卦〗〖博图〗,则当你发动的〖驭衡〗结算结束后,你随机获得两条其他东吴命运线。', + dili_quandao: "权道", + dili_quandao_info: + "锁定技。若你因〖驭衡〗获得过〖制衡〗〖诫训〗〖安恤〗,则你手牌区内点数为字母的牌的牌名视为【调剂盐梅】。", + dili_jiaohui: "交辉", + dili_jiaohui_info: + "锁定技。若你因〖驭衡〗获得过〖下书〗〖结姻〗〖缔盟〗,且你的手牌数为1,则此牌的牌名视为【远交近攻】。", + dili_yuanlv: "渊虑", + dili_yuanlv_info: + "锁定技。若你因〖驭衡〗获得过〖观潮〗〖决堰〗〖澜江〗,则当你成为自己使用的不为【长安大舰】的装备牌的目标后,你将此牌置于弃牌堆,然后使用一张与此装备牌副类别相同的【长安大舰】。", + changandajian_equip1: "长安大舰", + changandajian_equip2: "长安大舰", + changandajian_equip3: "长安大舰", + changandajian_equip4: "长安大舰", + changandajian_equip5: "长安大舰", + changandajian_equip6: "长安大舰", + changandajian_destroy: "长安大舰", + changandajian_equip1_info: + "锁定技。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip2_info: + "锁定技。当你失去装备区内的【长安大舰】后,你销毁之并回复1点体力。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip3_info: + "锁定技。其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip4_info: + "锁定技。你至其他角色的距离-2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip5_info: + "锁定技。你的手牌上限+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + changandajian_equip6_info: + "锁定技。你至其他角色的距离-2,其他角色至你的距离+2。当你失去装备区内的【长安大舰】后,你销毁之。然后你选择场上的一张牌。若此牌点数为字母,则你获得之,否则弃置之。", + shen_machao: "神马超", + shen_machao_prefix: "神", + shouli: "狩骊", + shouli_backup: "狩骊", + shouli_info: + "①锁定技,游戏开始时,你令场上所有角色从你的下家起,依次使用牌堆中的一张不为赠物的坐骑牌。②你可以将场上的一张进攻坐骑牌当做【杀】(无任何次数限制),防御坐骑牌当做【闪】使用或打出。若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。", + hengwu: "横骛", + hengwu_info: + "当你使用或打出有花色的牌时,若你的手牌区内没有与此牌花色相同的牌,则你可以摸X张牌(X为场上装备区内花色与此牌相同的牌数)。", + hengwu_append: '棘手,怀念,摧毁!', - key_kagari:'篝', - kagari_zongsi:'纵丝', - kagari_zongsi_info:'出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。', - key_shiki:'神山识', - key_shiki_ab:'神山识', - shiki_omusubi:'御结', - shiki_omusubi_info:'一轮游戏开始时,你可以减1点体力上限,然后将一名其他角色武将牌上的技能加入到你的武将牌上。', - shiki_omusubi_append:'来吧,羽依里。用你的手,让我变成那只真正的鬼吧!', - db_key_hina:'佐藤雏', - hina_shenshi:'神视', - hina_shenshi_yingbian:'神视', - hina_shenshi_info:'神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。', - hina_xingzhi:'幸凪', - hina_xingzhi_info:'键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。', - tw_shen_guanyu:'TW神关羽', - tw_shen_guanyu_prefix:'TW神', - twwushen:'武神', - twwushen_info:'锁定技。①你的♥手牌均视为普【杀】。②你于每阶段使用的第一张【杀】不可被响应。③你使用♥【杀】无距离和次数限制。④当你使用♥【杀】选择目标后,你令所有拥有“梦魇”标记的角色均成为此【杀】的目标。', - twwuhun:'武魂', - twwuhun_info:'锁定技。①当你受到其他角色造成的1点伤害后,你令伤害来源获得1枚“梦魇”标记。②当你对有“梦魇”标记的其他角色造成伤害后,你令其获得一枚“梦魇”标记。③当你死亡时,你可进行判定。若结果不为【桃】或【桃园结义】,则你选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)。', - shen_zhangfei:'神张飞', - shen_zhangfei_prefix:'神', - shencai:'神裁', - shencai_info:'出牌阶段限一次,你可以令一名其他角色进行判定。你获得此判定牌,然后若此判定牌:包含以下要素中的任意一个,则其失去已有的下列效果,并获得对应的效果:{⒈体力:当其受到伤害后,其失去等量的体力、⒉武器:其不能使用牌响应【杀】、⒊打出:当其失去手牌后,其再随机弃置一张手牌(不嵌套触发)、⒋距离:其的结束阶段开始时,其翻面};若均不包含,你获得其区域里的一张牌,其获得一枚“死”并获得如下效果:其的角色手牌上限-X、其的回合结束时,若X大于场上存活人数,则其死亡(X为其“死”标记数)。', - xunshi:'巡使', - xunshi_info:'锁定技。①你手牌区内所有的多目标锦囊牌均视为花色为none的普【杀】。②你使用颜色为none的牌无距离和次数限制。③当你使用无颜色的牌选择目标后,你令你的〖神裁〗的发动次数上限+1(至多为5),然后可以为此牌增加任意个目标。', - shen_zhangjiao:'神张角', - shen_zhangjiao_prefix:'神', - yizhao:'异兆', - yizhao_info:'锁定技。当你使用或打出牌时,你获得等同于此牌点数枚“黄”标记。然后若“黄”的十位数发生变化,你获得牌堆中一张点数为你“黄”的十位数的牌。', - sijun:'肆军', - sijun_info:'准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”并洗牌,然后随机获得任意张点数之和为36的牌。', - sanshou:'三首', - sanshou_info:'当你受到伤害时,你可以亮出牌堆顶三张牌。若其中有本回合未被使用过的牌的类型,防止此伤害。', - tianjie:'天劫', - tianjie_info:'一名角色的回合结束时,若本回合牌堆洗过牌,你可以选择至多三名其他角色。你依次对每名目标角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)。', - tw_shen_lvmeng:'TW神吕蒙', - tw_shen_lvmeng_prefix:'TW神', - twshelie:'涉猎', - twshelie_info:'①摸牌阶段,你可放弃摸牌并亮出牌堆顶的五张牌,然后选择获得其中每种花色的牌各一张。②每轮限一次。结束阶段,若你本回合使用的花色数不小于你的体力值,你执行一个额外的摸牌阶段或出牌阶段。', - twgongxin:'攻心', - twgongxin2:'攻心', - twgongxin_info:'出牌阶段限一次。你可以观看一名其他角色的手牌,然后你可以展示其中一张牌并选择一项:1.弃置此牌;2.将此牌置于牌堆顶。若该角色手牌中的花色数因此减少,你选择一种颜色,其于本回合不能使用或打出该颜色的牌。', - shen_dengai:'神邓艾', - shen_dengai_prefix:'神', - dctuoyu:'拓域', - dctuoyu_fengtian:'丰田', - dctuoyu_qingqu:'清渠', - dctuoyu_junshan:'峻山', - dctuoyu_fengtian_tag:'丰田', - dctuoyu_qingqu_tag:'清渠', - dctuoyu_junshan_tag:'峻山', - dctuoyu_info:'①锁定技。当你使用拥有对应副区域标签的牌时,你令此牌获得对应效果。
    丰田:伤害值或回复值+1;清渠:无次数和距离限制;峻山:不可被响应。②出牌阶段开始时和结束时,你给你的手牌分配对应的已激活副区域标签(每个区域至多五张)。', - dcxianjin:'险进', - dcxianjin_info:'锁定技。当你每造成或受到两次伤害后,你激活一个副区域标签并摸X张牌(X为你已激活的副区域数,若你的手牌数为全场最多则改为摸一张牌)。', - dcqijing:'奇径', - dcqijing_info:'觉醒技。一名角色的回合结束后,若你的三个副区域标签均被激活,则你减1点体力上限,获得〖摧心〗,将座位移动至两名相邻的其他角色之间并执行一个额外回合。', - dccuixin:'摧心', - dccuixin_info:'当你不因此技能使用的基本牌或普通锦囊牌结算结束后,若此牌的目标于你使用此牌指定第一个目标时包含你的上家或下家,则你可以视为对下家或上家再使用一张牌名和元素相同的牌。', - shen_dianwei:'神典韦', - shen_dianwei_prefix:'神', - juanjia:'捐甲', - juanjia_info:'锁定技。游戏开始时,你废除一个防具栏,然后获得一个额外的武器栏。', - qiexie:'挈挟', - qiexie_info:'锁定技。准备阶段,你在剩余武将牌堆中随机观看五张牌,选择其中的任意张,将其按照如下规则转化为武器牌置入你的武器栏:{⒈此牌不具有花色,且其攻击范围和点数等于此武将牌的体力上限。⒉此武器牌的技能为该武将牌上所有描述中包含“【杀】”且不具有锁定技以外的标签的技能。⒊此武器牌离开你的装备区时,改为放回武将牌堆。}', - cuijue:'摧决', - cuijue_info:'每回合每名角色限一次。出牌阶段,你可以弃置一张牌,然后对攻击范围内距离最远的一名其他角色造成1点伤害(没有则不选)。', - le_shen_jiaxu:'神贾诩', - le_shen_jiaxu_prefix:'神', - jxlianpo:'炼魄', - jxlianpo_info:'锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1,所有角色使用【杀】的次数上限和攻击范围+1;主忠,其他角色不能对其以外的角色使用【桃】。其他角色死亡后,若有多个最大阵营,来源摸两张牌并回复1点体力。②一轮游戏开始时,你展示一张未加入游戏或已死亡角色的身份牌,本轮视为该身份对应阵营的角色数+1。', - jxzhaoluan:'兆乱', - jxzhaoluan_info:'限定技。一名角色死亡前,若其此次进入过濒死状态,你可以取消之,令其加3点体力上限并失去所有非锁定技,回复体力至3点,摸四张牌。然后你获得如下效果:出牌阶段,你可以令一名成为过你〖兆乱〗目标的角色减1点体力上限,然后对一名此阶段未以此法选择过的角色造成1点伤害。', - shen_huatuo:'手杀神华佗', - shen_huatuo_prefix:'手杀神', - wuling:'五灵', - wuling_info:'①出牌阶段限两次。你可以选择一名没有“五禽戏”的角色,按照你选择的顺序向其传授“五禽戏”,且其获得如下效果:其获得你选择的第一种“五禽戏”的效果,并在其每个准备阶段移除当前“五禽戏”的效果并切换为下一种。②当你死亡时,你令场上的角色失去你传授的“五禽戏”。', - wuling_wuqinxi:'五禽戏', - wuling_wuqinxi_info:'
  • “五禽戏”分为“虎、鹿、熊、猿、鹤”五个不同的效果:'+ - '
  • 虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。'+ - '
  • 鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。'+ - '
  • 熊:每回合限一次,当你受到伤害时,此伤害-1。'+ - '
  • 猿:当你获得此效果时,你选择一名其他角色,获得其装备区里的一张牌。'+ - '
  • 鹤:当你获得此效果时,你摸三张牌。', - youyi:'游医', - youyi_info:'①弃牌阶段结束时,你可以将所有于此阶段弃置的牌置入仁区。②出牌阶段限一次。你可以将仁区的所有牌置入弃牌堆,令所有角色各回复1点体力。', - shen_lusu:'神鲁肃', - shen_lusu_prefix:'神', - dingzhou:'定州', - dingzhou_info:'出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数+1)。', - tamo:'榻谟', - tamo_info:'游戏开始时,你可以重新分配除主公外所有角色的座次。', - zhimeng:'智盟', - zhimeng_info:'回合结束后,你可以与一名其他角色将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。', - shen_xuzhu:'神许褚', - shen_xuzhu_prefix:'神', - zhengqing:'争擎', - zhengqing_info:'锁定技。一轮游戏开始时,你移去所有角色的“擎”标记,令上一轮于一回合内造成伤害值最多的角色各获得X枚“擎”,且你与这些角色各摸一张牌(X为这些角色该回合内造成的伤害值)。若该角色为你且本次获得的“擎”数为本局游戏最多的一次,你改为摸X张牌(至多摸五张)。', - zhuangpo:'壮魄', - zhuangpo_info:'你可以将牌名为【杀】或牌面信息中包含“【杀】”的牌当【决斗】使用,然后你获得如下效果:1.当此【决斗】指定目标后,若你有“擎”,你可以移去任意枚“擎”,令目标角色弃置等量的牌;2.当你造成渠道为此牌的伤害时,若此牌的所有目标角色中存在有“擎”的角色,此伤害+1。', - dc_shen_huatuo:'神华佗', - dc_shen_huatuo_prefix:'神', - jingyu:'静域', - jingyu_info:'锁定技。每个技能每轮限一次,当一名角色发动不为〖静域〗的技能时,你摸一张牌。', - lvxin:'滤心', - lvxin_info:'出牌阶段限一次。你可以交给一名其他角色一张手牌并选择一项:⒈令其摸X张牌;⒉令其随机弃置X张手牌(X为游戏轮数,至多为5)。然后若其以此法得到/弃置了与你交给其的牌牌名相同的牌,其于其下次发动技能时回复/失去1点体力。', - huandao:'寰道', - huandao_info:'限定技。出牌阶段,你可以选择一名其他角色。你令其复原武将牌,系统随机生成一个与其同名的武将的武将牌上的一个与其拥有的技能均不同名的技能。其可以选择获得此技能,然后选择失去一个其他技能。', + key_kagari: "篝", + kagari_zongsi: "纵丝", + kagari_zongsi_info: + "出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。", + key_shiki: "神山识", + key_shiki_ab: "神山识", + shiki_omusubi: "御结", + shiki_omusubi_info: + "一轮游戏开始时,你可以减1点体力上限,然后将一名其他角色武将牌上的技能加入到你的武将牌上。", + shiki_omusubi_append: + '来吧,羽依里。用你的手,让我变成那只真正的鬼吧!', + db_key_hina: "佐藤雏", + hina_shenshi: "神视", + hina_shenshi_yingbian: "神视", + hina_shenshi_info: + "神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。", + hina_xingzhi: "幸凪", + hina_xingzhi_info: + "键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。", + tw_shen_guanyu: "TW神关羽", + tw_shen_guanyu_prefix: "TW神", + twwushen: "武神", + twwushen_info: + "锁定技。①你的♥手牌均视为普【杀】。②你于每阶段使用的第一张【杀】不可被响应。③你使用♥【杀】无距离和次数限制。④当你使用♥【杀】选择目标后,你令所有拥有“梦魇”标记的角色均成为此【杀】的目标。", + twwuhun: "武魂", + twwuhun_info: + "锁定技。①当你受到其他角色造成的1点伤害后,你令伤害来源获得1枚“梦魇”标记。②当你对有“梦魇”标记的其他角色造成伤害后,你令其获得一枚“梦魇”标记。③当你死亡时,你可进行判定。若结果不为【桃】或【桃园结义】,则你选择至少一名拥有“梦魇”标记的角色。令这些角色各自失去X点体力(X为其“梦魇”标记数)。", + shen_zhangfei: "神张飞", + shen_zhangfei_prefix: "神", + shencai: "神裁", + shencai_info: + "出牌阶段限一次,你可以令一名其他角色进行判定。你获得此判定牌,然后若此判定牌:包含以下要素中的任意一个,则其失去已有的下列效果,并获得对应的效果:{⒈体力:当其受到伤害后,其失去等量的体力、⒉武器:其不能使用牌响应【杀】、⒊打出:当其失去手牌后,其再随机弃置一张手牌(不嵌套触发)、⒋距离:其的结束阶段开始时,其翻面};若均不包含,你获得其区域里的一张牌,其获得一枚“死”并获得如下效果:其的角色手牌上限-X、其的回合结束时,若X大于场上存活人数,则其死亡(X为其“死”标记数)。", + xunshi: "巡使", + xunshi_info: + "锁定技。①你手牌区内所有的多目标锦囊牌均视为花色为none的普【杀】。②你使用颜色为none的牌无距离和次数限制。③当你使用无颜色的牌选择目标后,你令你的〖神裁〗的发动次数上限+1(至多为5),然后可以为此牌增加任意个目标。", + shen_zhangjiao: "神张角", + shen_zhangjiao_prefix: "神", + yizhao: "异兆", + yizhao_info: + "锁定技。当你使用或打出牌时,你获得等同于此牌点数枚“黄”标记。然后若“黄”的十位数发生变化,你获得牌堆中一张点数为你“黄”的十位数的牌。", + sijun: "肆军", + sijun_info: + "准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”并洗牌,然后随机获得任意张点数之和为36的牌。", + sanshou: "三首", + sanshou_info: + "当你受到伤害时,你可以亮出牌堆顶三张牌。若其中有本回合未被使用过的牌的类型,防止此伤害。", + tianjie: "天劫", + tianjie_info: + "一名角色的回合结束时,若本回合牌堆洗过牌,你可以选择至多三名其他角色。你依次对每名目标角色造成X点雷电伤害(X为其手牌中【闪】的数量,至少为1)。", + tw_shen_lvmeng: "TW神吕蒙", + tw_shen_lvmeng_prefix: "TW神", + twshelie: "涉猎", + twshelie_info: + "①摸牌阶段,你可放弃摸牌并亮出牌堆顶的五张牌,然后选择获得其中每种花色的牌各一张。②每轮限一次。结束阶段,若你本回合使用的花色数不小于你的体力值,你执行一个额外的摸牌阶段或出牌阶段。", + twgongxin: "攻心", + twgongxin2: "攻心", + twgongxin_info: + "出牌阶段限一次。你可以观看一名其他角色的手牌,然后你可以展示其中一张牌并选择一项:1.弃置此牌;2.将此牌置于牌堆顶。若该角色手牌中的花色数因此减少,你选择一种颜色,其于本回合不能使用或打出该颜色的牌。", + shen_dengai: "神邓艾", + shen_dengai_prefix: "神", + dctuoyu: "拓域", + dctuoyu_fengtian: "丰田", + dctuoyu_qingqu: "清渠", + dctuoyu_junshan: "峻山", + dctuoyu_fengtian_tag: '丰田', + dctuoyu_qingqu_tag: '清渠', + dctuoyu_junshan_tag: '峻山', + dctuoyu_info: + "①锁定技。当你使用拥有对应副区域标签的牌时,你令此牌获得对应效果。
    丰田:伤害值或回复值+1;清渠:无次数和距离限制;峻山:不可被响应。②出牌阶段开始时和结束时,你给你的手牌分配对应的已激活副区域标签(每个区域至多五张)。", + dcxianjin: "险进", + dcxianjin_info: + "锁定技。当你每造成或受到两次伤害后,你激活一个副区域标签并摸X张牌(X为你已激活的副区域数,若你的手牌数为全场最多则改为摸一张牌)。", + dcqijing: "奇径", + dcqijing_info: + "觉醒技。一名角色的回合结束后,若你的三个副区域标签均被激活,则你减1点体力上限,获得〖摧心〗,将座位移动至两名相邻的其他角色之间并执行一个额外回合。", + dccuixin: "摧心", + dccuixin_info: + "当你不因此技能使用的基本牌或普通锦囊牌结算结束后,若此牌的目标于你使用此牌指定第一个目标时包含你的上家或下家,则你可以视为对下家或上家再使用一张牌名和元素相同的牌。", + shen_dianwei: "神典韦", + shen_dianwei_prefix: "神", + juanjia: "捐甲", + juanjia_info: "锁定技。游戏开始时,你废除一个防具栏,然后获得一个额外的武器栏。", + qiexie: "挈挟", + qiexie_info: + "锁定技。准备阶段,你在剩余武将牌堆中随机观看五张牌,选择其中的任意张,将其按照如下规则转化为武器牌置入你的武器栏:{⒈此牌不具有花色,且其攻击范围和点数等于此武将牌的体力上限。⒉此武器牌的技能为该武将牌上所有描述中包含“【杀】”且不具有锁定技以外的标签的技能。⒊此武器牌离开你的装备区时,改为放回武将牌堆。}", + cuijue: "摧决", + cuijue_info: + "每回合每名角色限一次。出牌阶段,你可以弃置一张牌,然后对攻击范围内距离最远的一名其他角色造成1点伤害(没有则不选)。", + le_shen_jiaxu: "神贾诩", + le_shen_jiaxu_prefix: "神", + jxlianpo: "炼魄", + jxlianpo_info: + "锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1,所有角色使用【杀】的次数上限和攻击范围+1;主忠,其他角色不能对其以外的角色使用【桃】。其他角色死亡后,若有多个最大阵营,来源摸两张牌并回复1点体力。②一轮游戏开始时,你展示一张未加入游戏或已死亡角色的身份牌,本轮视为该身份对应阵营的角色数+1。", + jxzhaoluan: "兆乱", + jxzhaoluan_info: + "限定技。一名角色死亡前,若其此次进入过濒死状态,你可以取消之,令其加3点体力上限并失去所有非锁定技,回复体力至3点,摸四张牌。然后你获得如下效果:出牌阶段,你可以令一名成为过你〖兆乱〗目标的角色减1点体力上限,然后对一名此阶段未以此法选择过的角色造成1点伤害。", + shen_huatuo: "手杀神华佗", + shen_huatuo_prefix: "手杀神", + wuling: "五灵", + wuling_info: + "①出牌阶段限两次。你可以选择一名没有“五禽戏”的角色,按照你选择的顺序向其传授“五禽戏”,且其获得如下效果:其获得你选择的第一种“五禽戏”的效果,并在其每个准备阶段移除当前“五禽戏”的效果并切换为下一种。②当你死亡时,你令场上的角色失去你传授的“五禽戏”。", + wuling_wuqinxi: "五禽戏", + wuling_wuqinxi_info: + "
  • “五禽戏”分为“虎、鹿、熊、猿、鹤”五个不同的效果:" + + "
  • 虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。" + + "
  • 鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。" + + "
  • 熊:每回合限一次,当你受到伤害时,此伤害-1。" + + "
  • 猿:当你获得此效果时,你选择一名其他角色,获得其装备区里的一张牌。" + + "
  • 鹤:当你获得此效果时,你摸三张牌。", + youyi: "游医", + youyi_info: + "①弃牌阶段结束时,你可以将所有于此阶段弃置的牌置入仁区。②出牌阶段限一次。你可以将仁区的所有牌置入弃牌堆,令所有角色各回复1点体力。", + shen_lusu: "神鲁肃", + shen_lusu_prefix: "神", + dingzhou: "定州", + dingzhou_info: + "出牌阶段限一次。你可以将X张牌交给一名场上有牌的角色,然后你获得其场上的所有牌(X为其场上的牌数+1)。", + tamo: "榻谟", + tamo_info: "游戏开始时,你可以重新分配除主公外所有角色的座次。", + zhimeng: "智盟", + zhimeng_info: + "回合结束后,你可以与一名其他角色将各自所有手牌置于处理区,然后你随机获得这些牌中的一半(向上取整),其获得剩余的牌。", + shen_xuzhu: "神许褚", + shen_xuzhu_prefix: "神", + zhengqing: "争擎", + zhengqing_info: + "锁定技。一轮游戏开始时,你移去所有角色的“擎”标记,令上一轮于一回合内造成伤害值最多的角色各获得X枚“擎”,且你与这些角色各摸一张牌(X为这些角色该回合内造成的伤害值)。若该角色为你且本次获得的“擎”数为本局游戏最多的一次,你改为摸X张牌(至多摸五张)。", + zhuangpo: "壮魄", + zhuangpo_info: + "你可以将牌名为【杀】或牌面信息中包含“【杀】”的牌当【决斗】使用,然后你获得如下效果:1.当此【决斗】指定目标后,若你有“擎”,你可以移去任意枚“擎”,令目标角色弃置等量的牌;2.当你造成渠道为此牌的伤害时,若此牌的所有目标角色中存在有“擎”的角色,此伤害+1。", + dc_shen_huatuo: "神华佗", + dc_shen_huatuo_prefix: "神", + jingyu: "静域", + jingyu_info: "锁定技。每个技能每轮限一次,当一名角色发动不为〖静域〗的技能时,你摸一张牌。", + lvxin: "滤心", + lvxin_info: + "出牌阶段限一次。你可以交给一名其他角色一张手牌并选择一项:⒈令其摸X张牌;⒉令其随机弃置X张手牌(X为游戏轮数,至多为5)。然后若其以此法得到/弃置了与你交给其的牌牌名相同的牌,其于其下次发动技能时回复/失去1点体力。", + huandao: "寰道", + huandao_info: + "限定技。出牌阶段,你可以选择一名其他角色。你令其复原武将牌,系统随机生成一个与其同名的武将的武将牌上的一个与其拥有的技能均不同名的技能。其可以选择获得此技能,然后选择失去一个其他技能。", - extra_feng:'神话再临·风', - extra_huo:'神话再临·火', - extra_lin:'神话再临·林', - extra_shan:'神话再临·山', - extra_yin:'神话再临·阴', - extra_lei:'神话再临·雷', - extra_key:'论外', - extra_ol:'神话再临OL', - extra_mobilezhi:'始计篇·智', - extra_mobilexin:'始计篇·信', - extra_mobileren:'始计篇·仁', - extra_offline:'神话再临·线下', - extra_decade:'神·武', - extra_tw:'海外服神将', + extra_feng: "神话再临·风", + extra_huo: "神话再临·火", + extra_lin: "神话再临·林", + extra_shan: "神话再临·山", + extra_yin: "神话再临·阴", + extra_lei: "神话再临·雷", + extra_key: "论外", + extra_ol: "神话再临OL", + extra_mobilezhi: "始计篇·智", + extra_mobilexin: "始计篇·信", + extra_mobileren: "始计篇·仁", + extra_offline: "神话再临·线下", + extra_decade: "神·武", + extra_tw: "海外服神将", }, }; }); diff --git a/character/gujian.js b/character/gujian.js index 3f0733d05..04ff1f842 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -1,870 +1,956 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'gujian', - character:{ - gjqt_bailitusu:['male','shu',4,['xuelu','fanshi','shahun']], - gjqt_fengqingxue:['female','wu',3,['qinglan','yuehua','swd_wuxie']], - gjqt_xiangling:['female','wu',3,['xlqianhuan','meihu','xidie']], - gjqt_fanglansheng:['male','wu',3,['fanyin','mingkong','fumo']], - gjqt_yinqianshang:['male','qun',4,['zuiji','zuizhan']], - gjqt_hongyu:['female','shu',4,['jianwu','meiying']], + name: "gujian", + character: { + gjqt_bailitusu: ["male", "shu", 4, ["xuelu", "fanshi", "shahun"]], + gjqt_fengqingxue: ["female", "wu", 3, ["qinglan", "yuehua", "swd_wuxie"]], + gjqt_xiangling: ["female", "wu", 3, ["xlqianhuan", "meihu", "xidie"]], + gjqt_fanglansheng: ["male", "wu", 3, ["fanyin", "mingkong", "fumo"]], + gjqt_yinqianshang: ["male", "qun", 4, ["zuiji", "zuizhan"]], + gjqt_hongyu: ["female", "shu", 4, ["jianwu", "meiying"]], - gjqt_yuewuyi:['male','wei',4,['yanjia','xiuhua','liuying']], - gjqt_wenrenyu:['female','shu',4,['chizhen','dangping']], - gjqt_xiayize:['male','qun',3,['xuanning','liuguang','yangming']], - gjqt_aruan:['female','wu',3,['zhaolu','jiehuo','yuling']], + gjqt_yuewuyi: ["male", "wei", 4, ["yanjia", "xiuhua", "liuying"]], + gjqt_wenrenyu: ["female", "shu", 4, ["chizhen", "dangping"]], + gjqt_xiayize: ["male", "qun", 3, ["xuanning", "liuguang", "yangming"]], + gjqt_aruan: ["female", "wu", 3, ["zhaolu", "jiehuo", "yuling"]], - gjqt_xunfang:['female','shu',3,['manwu','xfanghua']], - gjqt_ouyangshaogong:['male','shu',3,['yunyin','shishui','duhun']], + gjqt_xunfang: ["female", "shu", 3, ["manwu", "xfanghua"]], + gjqt_ouyangshaogong: ["male", "shu", 3, ["yunyin", "shishui", "duhun"]], - gjqt_xieyi:['male','qun',3,['lingyan','xunjian','humeng']], - gjqt_yanjiaxieyi:['male','qun',2,['xianju'],['unseen']], - gjqt_chuqi:['male','qun',2,['xuanci'],['unseen']], + gjqt_xieyi: ["male", "qun", 3, ["lingyan", "xunjian", "humeng"]], + gjqt_yanjiaxieyi: ["male", "qun", 2, ["xianju"], ["unseen"]], + gjqt_chuqi: ["male", "qun", 2, ["xuanci"], ["unseen"]], // gjqt_xuange:['male','qun',4,['zhenlu','zhuixing']], - gjqt_beiluo:['male','qun',4,['lingnu','zhenying','cihong']], - gjqt_yunwuyue:['female','wei',3,['yange','woxue','lianjing']], - gjqt_cenying:['female','shu',3,['yunyou','xuanzhen','qingshu']], + gjqt_beiluo: ["male", "qun", 4, ["lingnu", "zhenying", "cihong"]], + gjqt_yunwuyue: ["female", "wei", 3, ["yange", "woxue", "lianjing"]], + gjqt_cenying: ["female", "shu", 3, ["yunyou", "xuanzhen", "qingshu"]], // gjqt_changliu:['male','qun',4,['xiange']], // gjqt_fenglishuang:['female','wei',3,[]], // gjqt_nishang:[], }, - characterIntro:{ - gjqt_bailitusu:'原名韩云溪,太子长琴半身。幼时经历灭族之灾,本来已死去,但因体内被封进了太子长琴一半魂魄而得以死而复生。身怀凶剑焚寂的煞气,在某次煞气发作中被紫胤真人所救,后拜入昆仑山天墉城,以“屠绝鬼气,苏醒人魂”之意更名为“百里屠苏”。', - gjqt_fengqingxue:'来自幽暗无边的地界,大哥为幽都娲皇神殿“十巫”之一的巫咸——风广陌。奉命寻兄而来到人间,邂逅百里屠苏,陷入了焚寂的宿命纠葛。后与百里屠苏相知相爱。终局,百里屠苏化为永世无法轮回的荒魂,她为寻找重生之法,放弃自己的轮回,换取下长久的寿命,在人间执着不悔地寻觅了九百年。最后,与重生后的屠苏回到桃花谷相守。', - gjqt_xiangling:'青丘之国国主九尾天狐与人界女子所生,半人半妖。由南疆紫榕林榕爷爷抚养,在山林间无拘无束长大,娇俏可爱。后来下江南寻找生母,却被抓进翻云寨,偶然被百里屠苏相救,为报答救命之恩,便一直跟随百里屠苏。在漫漫征途中成长起来,变得成熟懂事。得知方兰生对自己的感情,十分矛盾,后来终于错过。最后结局,启程前往青丘之国。', - gjqt_fanglansheng:'家住琴川的一介书生,家境殷实,母亲在家常住庵堂,吃斋念佛,父亲虽是琴川附近某间寺庙的住持,但却比商人还会敛财。跟随父亲学过降妖除鬼的佛家法术,并以此自傲。梦想能找一个娇小可爱,温柔美丽的女子共渡此生。对襄铃一见钟情。', - gjqt_yinqianshang:'原名风广陌,是幽都“十巫”之一的巫咸。奉女娲之命前往乌蒙灵谷增强焚寂封印。但因为欧阳少恭与雷严的争夺关系,他受到焚寂之力力量冲击,失去记忆,后为欧阳少恭所救。尹千觞为了报恩,跟随在百里屠苏等人身边监视。在这个过程中,他慢慢恢复过往的记忆。后为阻止欧阳少恭,随众人前往蓬莱决战。最后,对曾给予他一次重生的欧阳少恭以死相陪,一起归于火海。', - gjqt_hongyu:'上古庆枫族族人,紫胤真人的剑灵,宿体为古剑·红玉。在百里屠苏离开昆仑山天墉城后,奉命随行保护。终局之后,她依然回到了天墉城,陪伴在紫胤真人身边。', + characterIntro: { + gjqt_bailitusu: + "原名韩云溪,太子长琴半身。幼时经历灭族之灾,本来已死去,但因体内被封进了太子长琴一半魂魄而得以死而复生。身怀凶剑焚寂的煞气,在某次煞气发作中被紫胤真人所救,后拜入昆仑山天墉城,以“屠绝鬼气,苏醒人魂”之意更名为“百里屠苏”。", + gjqt_fengqingxue: + "来自幽暗无边的地界,大哥为幽都娲皇神殿“十巫”之一的巫咸——风广陌。奉命寻兄而来到人间,邂逅百里屠苏,陷入了焚寂的宿命纠葛。后与百里屠苏相知相爱。终局,百里屠苏化为永世无法轮回的荒魂,她为寻找重生之法,放弃自己的轮回,换取下长久的寿命,在人间执着不悔地寻觅了九百年。最后,与重生后的屠苏回到桃花谷相守。", + gjqt_xiangling: + "青丘之国国主九尾天狐与人界女子所生,半人半妖。由南疆紫榕林榕爷爷抚养,在山林间无拘无束长大,娇俏可爱。后来下江南寻找生母,却被抓进翻云寨,偶然被百里屠苏相救,为报答救命之恩,便一直跟随百里屠苏。在漫漫征途中成长起来,变得成熟懂事。得知方兰生对自己的感情,十分矛盾,后来终于错过。最后结局,启程前往青丘之国。", + gjqt_fanglansheng: + "家住琴川的一介书生,家境殷实,母亲在家常住庵堂,吃斋念佛,父亲虽是琴川附近某间寺庙的住持,但却比商人还会敛财。跟随父亲学过降妖除鬼的佛家法术,并以此自傲。梦想能找一个娇小可爱,温柔美丽的女子共渡此生。对襄铃一见钟情。", + gjqt_yinqianshang: + "原名风广陌,是幽都“十巫”之一的巫咸。奉女娲之命前往乌蒙灵谷增强焚寂封印。但因为欧阳少恭与雷严的争夺关系,他受到焚寂之力力量冲击,失去记忆,后为欧阳少恭所救。尹千觞为了报恩,跟随在百里屠苏等人身边监视。在这个过程中,他慢慢恢复过往的记忆。后为阻止欧阳少恭,随众人前往蓬莱决战。最后,对曾给予他一次重生的欧阳少恭以死相陪,一起归于火海。", + gjqt_hongyu: + "上古庆枫族族人,紫胤真人的剑灵,宿体为古剑·红玉。在百里屠苏离开昆仑山天墉城后,奉命随行保护。终局之后,她依然回到了天墉城,陪伴在紫胤真人身边。", - gjqt_yuewuyi:'成长于长安富商家庭。其养父曾是战功显赫的将军,退隐后从商,很快就富甲一方;其养母是精擅偃术的南疆天玄教偃女族传人,待无异一如己出般疼爱有加;无异的生父是捐毒大将兀火罗,亡母是一名中原女子,因此他具有一半胡人的血统。', - gjqt_wenrenyu:'出身于百草谷“天罡”部队。从小在军中生活的她见惯生死,拥有超越其年龄的沉着果敢,头脑冷静严谨,洞察力敏锐,性格大方爽快。', - gjqt_xiayize:'本为当朝圣元帝三子李焱,天资聪颖,勤奋好学,于道术一途颇具天赋。幼时体弱,因身世原因被太华山的诀微长老清和真人带走,从此过上了道家清修的生活。', - gjqt_aruan:'千年前,昭明崩裂损毁,剑心为神农所得,其将剑心植入用辟邪之骨所造之人,是为巫山神女。神女爱慕司幽,却始终得不到司幽回应,心绪起伏加速灵力散逸,不久后死去,司幽自责不已,失去踪迹。神女死后,剑心碎片落地生根,吸纳灵气变为露草,露草渐渐化为人形,形貌与巫山神女一样,而且保留了她零散的记忆,阿阮正是这些露草中的一个。当阿阮灵气耗尽就会重新变为露草,并失去人时的记忆,直到重新吸纳足够的灵力才能恢复人形。', + gjqt_yuewuyi: + "成长于长安富商家庭。其养父曾是战功显赫的将军,退隐后从商,很快就富甲一方;其养母是精擅偃术的南疆天玄教偃女族传人,待无异一如己出般疼爱有加;无异的生父是捐毒大将兀火罗,亡母是一名中原女子,因此他具有一半胡人的血统。", + gjqt_wenrenyu: + "出身于百草谷“天罡”部队。从小在军中生活的她见惯生死,拥有超越其年龄的沉着果敢,头脑冷静严谨,洞察力敏锐,性格大方爽快。", + gjqt_xiayize: + "本为当朝圣元帝三子李焱,天资聪颖,勤奋好学,于道术一途颇具天赋。幼时体弱,因身世原因被太华山的诀微长老清和真人带走,从此过上了道家清修的生活。", + gjqt_aruan: + "千年前,昭明崩裂损毁,剑心为神农所得,其将剑心植入用辟邪之骨所造之人,是为巫山神女。神女爱慕司幽,却始终得不到司幽回应,心绪起伏加速灵力散逸,不久后死去,司幽自责不已,失去踪迹。神女死后,剑心碎片落地生根,吸纳灵气变为露草,露草渐渐化为人形,形貌与巫山神女一样,而且保留了她零散的记忆,阿阮正是这些露草中的一个。当阿阮灵气耗尽就会重新变为露草,并失去人时的记忆,直到重新吸纳足够的灵力才能恢复人形。", - gjqt_xunfang:'蓬莱国公主,美丽善良,为欧阳少恭前世妻子,太子长琴转世后,巽芳为寻找丈夫来到中原。蓬莱人寿命虽长却终有极限,终究躲不过容颜老去。当巽芳找到分离多年后的少恭时,自惭形秽,不愿相认,她希望少恭心中的自己永远都是青春貌美,于是化名“寂桐”守护在其身旁。', - gjqt_ouyangshaogong:'前身为太子长琴,今生只有一半仙灵,另一半仙灵被铸进焚寂之中,成为焚寂剑灵。他在漫长时光中经历太多悲欢离合,渐渐迷失自我。后与蓬莱国公主巽芳相爱,度过一段美好时光。之后蓬莱毁于天灾,他误以为巽芳已死,便不再压抑内心的疯狂与憎恨,为逆天改命不惜一切。', + gjqt_xunfang: + "蓬莱国公主,美丽善良,为欧阳少恭前世妻子,太子长琴转世后,巽芳为寻找丈夫来到中原。蓬莱人寿命虽长却终有极限,终究躲不过容颜老去。当巽芳找到分离多年后的少恭时,自惭形秽,不愿相认,她希望少恭心中的自己永远都是青春貌美,于是化名“寂桐”守护在其身旁。", + gjqt_ouyangshaogong: + "前身为太子长琴,今生只有一半仙灵,另一半仙灵被铸进焚寂之中,成为焚寂剑灵。他在漫长时光中经历太多悲欢离合,渐渐迷失自我。后与蓬莱国公主巽芳相爱,度过一段美好时光。之后蓬莱毁于天灾,他误以为巽芳已死,便不再压抑内心的疯狂与憎恨,为逆天改命不惜一切。", - gjqt_xieyi:'偃术大师,流月城大祭司沈夜之徒。于偃术一途冠绝古今,其制造的偃甲精妙绝伦,为世人所称颂。男主角乐无异对其十分崇拜。曾任流月城破军祭司,精通偃术和法术,在一百年前寻找神剑昭明的西域之行中被沈夜捉拿回流月城,毁去记忆仅靠偃甲和蛊虫心脏跳动,并更名为初七,最终在巫山为抢救昭明剑心、保护乐无异被埋在坍塌的神女墓下。他以自己为原型制作,并放入自己部分记忆的偃甲人谢衣曾收乐无异为徒。', + gjqt_xieyi: + "偃术大师,流月城大祭司沈夜之徒。于偃术一途冠绝古今,其制造的偃甲精妙绝伦,为世人所称颂。男主角乐无异对其十分崇拜。曾任流月城破军祭司,精通偃术和法术,在一百年前寻找神剑昭明的西域之行中被沈夜捉拿回流月城,毁去记忆仅靠偃甲和蛊虫心脏跳动,并更名为初七,最终在巫山为抢救昭明剑心、保护乐无异被埋在坍塌的神女墓下。他以自己为原型制作,并放入自己部分记忆的偃甲人谢衣曾收乐无异为徒。", - gjqt_beiluo:'身负辟邪王族之血的大妖,辟邪先王玄戈的孪生兄弟。北洛幼时流落人界,从此便在那里长大。他对自己的血脉并无认同之感,常年抑制妖力,希望以“人”的身份留在人间。后因先王玄戈的逝世,即位为辟邪王', - gjqt_yunwuyue:'本体是一只魇兽,该族喜独居,以人的梦境为食,以精神力为长,被称为“最接近魔的妖族”。云无月幼时居住在有熊城旁的白梦泽,自幼便与轩辕黄帝的大将缙云结识,对缙云有着一种依赖和仰慕,深受缙云的影响,对人族以及其他生灵有感情,不忍看到眼前的生灵遭到痛苦,会加以援手。', - gjqt_cenying:'出身于一个颇有底蕴的大家族,性格开朗随和、温柔坚韧、心如琉璃。岑缨受到开明长辈的影响,自小多思善学,年纪不大却已经加入了博物学会,有时跟随师长在外游历,探寻更广阔的天地。', + gjqt_beiluo: + "身负辟邪王族之血的大妖,辟邪先王玄戈的孪生兄弟。北洛幼时流落人界,从此便在那里长大。他对自己的血脉并无认同之感,常年抑制妖力,希望以“人”的身份留在人间。后因先王玄戈的逝世,即位为辟邪王", + gjqt_yunwuyue: + "本体是一只魇兽,该族喜独居,以人的梦境为食,以精神力为长,被称为“最接近魔的妖族”。云无月幼时居住在有熊城旁的白梦泽,自幼便与轩辕黄帝的大将缙云结识,对缙云有着一种依赖和仰慕,深受缙云的影响,对人族以及其他生灵有感情,不忍看到眼前的生灵遭到痛苦,会加以援手。", + gjqt_cenying: + "出身于一个颇有底蕴的大家族,性格开朗随和、温柔坚韧、心如琉璃。岑缨受到开明长辈的影响,自小多思善学,年纪不大却已经加入了博物学会,有时跟随师长在外游历,探寻更广阔的天地。", }, - card:{ - yanjiadan_heart:{ - type:'jiguan', - cardcolor:'heart', - fullskin:true, - derivation:'gjqt_xieyi', - enable:true, - notarget:true, - content(){ - 'step 0' - var choice=null; - var targets=game.filterPlayer(function(current){ - return get.attitude(player,current)>0; + card: { + yanjiadan_heart: { + type: "jiguan", + cardcolor: "heart", + fullskin: true, + derivation: "gjqt_xieyi", + enable: true, + notarget: true, + content() { + "step 0"; + var choice = null; + var targets = game.filterPlayer(function (current) { + return get.attitude(player, current) > 0; }); - for(var i=0;i0; - })){ - choice='shatang'; + if ( + !choice && + game.hasPlayer(function (current) { + return ( + current.hp == 1 && + get.attitude(player, current) < 0 && + get.damageEffect(current, player, player, "fire") > 0 + ); + }) + ) { + choice = "shatang"; } - if(!choice){ - for(var i=0;i=0) return false; - if(current.hp==1&&eff<0) return true; - if(get.attitude(player,current)<0&&get.attitude(player,current.getNext()<0)&&get.attitude(player,current.getPrevious())<0){ - return true; - } - return false; - })){ - choice='shenhuofeiya'; + yanjiadan_diamond: { + type: "jiguan", + cardcolor: "diamond", + fullskin: true, + derivation: "gjqt_xieyi", + enable: true, + notarget: true, + content() { + "step 0"; + var choice = "liufengsan"; + if ( + game.hasPlayer(function (current) { + var eff = get.effect(current, { name: "shenhuofeiya" }, player, player); + if (eff >= 0) return false; + if (current.hp == 1 && eff < 0) return true; + if ( + get.attitude(player, current) < 0 && + get.attitude(player, current.getNext() < 0) && + get.attitude(player, current.getPrevious()) < 0 + ) { + return true; + } + return false; + }) + ) { + choice = "shenhuofeiya"; } - player.chooseVCardButton('选择一张牌视为使用之',['liufengsan','shujinsan','shenhuofeiya']).set('ai',function(button){ - if(button.link[2]==_status.event.choice) return 2; - return Math.random(); - }).set('choice',choice).set('filterButton',function(button){ - return _status.event.player.hasUseTarget(button.link[2]); - }); - 'step 1' - player.chooseUseTarget(true,result.links[0][2]); + player + .chooseVCardButton("选择一张牌视为使用之", [ + "liufengsan", + "shujinsan", + "shenhuofeiya", + ]) + .set("ai", function (button) { + if (button.link[2] == _status.event.choice) return 2; + return Math.random(); + }) + .set("choice", choice) + .set("filterButton", function (button) { + return _status.event.player.hasUseTarget(button.link[2]); + }); + ("step 1"); + player.chooseUseTarget(true, result.links[0][2]); + }, + ai: { + order: 5, + result: { + player: 1, + }, }, - ai:{ - order:5, - result:{ - player:1 - } - } }, - yanjiadan_club:{ - type:'jiguan', - cardcolor:'club', - fullskin:true, - derivation:'gjqt_xieyi', - enable:true, - notarget:true, - content(){ - 'step 0' - var choice='liutouge'; - player.chooseVCardButton('选择一张牌视为使用之',['bingpotong','liutouge','mianlijinzhen']).set('ai',function(button){ - if(button.link[2]==_status.event.choice) return 2; - return Math.random(); - }).set('choice',choice).set('filterButton',function(button){ - return _status.event.player.hasUseTarget(button.link[2]); - }); - 'step 1' - player.chooseUseTarget(true,result.links[0][2]); + yanjiadan_club: { + type: "jiguan", + cardcolor: "club", + fullskin: true, + derivation: "gjqt_xieyi", + enable: true, + notarget: true, + content() { + "step 0"; + var choice = "liutouge"; + player + .chooseVCardButton("选择一张牌视为使用之", [ + "bingpotong", + "liutouge", + "mianlijinzhen", + ]) + .set("ai", function (button) { + if (button.link[2] == _status.event.choice) return 2; + return Math.random(); + }) + .set("choice", choice) + .set("filterButton", function (button) { + return _status.event.player.hasUseTarget(button.link[2]); + }); + ("step 1"); + player.chooseUseTarget(true, result.links[0][2]); + }, + ai: { + order: 5, + result: { + player: 1, + }, }, - ai:{ - order:5, - result:{ - player:1 - } - } }, - yanjiadan_spade:{ - type:'jiguan', - cardcolor:'spade', - fullskin:true, - derivation:'gjqt_xieyi', - enable:true, - notarget:true, - content(){ - 'step 0' - var choice=null; - if(player.getUseValue('longxugou')>0){ - choice='longxugou'; + yanjiadan_spade: { + type: "jiguan", + cardcolor: "spade", + fullskin: true, + derivation: "gjqt_xieyi", + enable: true, + notarget: true, + content() { + "step 0"; + var choice = null; + if (player.getUseValue("longxugou") > 0) { + choice = "longxugou"; + } else if (player.getUseValue("qiankunbiao") > 0) { + choice = "qiankunbiao"; + } else if (player.getUseValue("feibiao") > 0) { + choice = "qiankunbiao"; } - else if(player.getUseValue('qiankunbiao')>0){ - choice='qiankunbiao'; - } - else if(player.getUseValue('feibiao')>0){ - choice='qiankunbiao'; - } - player.chooseVCardButton('选择一张牌视为使用之',['feibiao','qiankunbiao','longxugou']).set('ai',function(button){ - if(button.link[2]==_status.event.choice) return 2; - return Math.random(); - }).set('choice',choice).set('filterButton',function(button){ - return _status.event.player.hasUseTarget(button.link[2]); - }); - 'step 1' - player.chooseUseTarget(true,result.links[0][2]); + player + .chooseVCardButton("选择一张牌视为使用之", ["feibiao", "qiankunbiao", "longxugou"]) + .set("ai", function (button) { + if (button.link[2] == _status.event.choice) return 2; + return Math.random(); + }) + .set("choice", choice) + .set("filterButton", function (button) { + return _status.event.player.hasUseTarget(button.link[2]); + }); + ("step 1"); + player.chooseUseTarget(true, result.links[0][2]); }, - ai:{ - order:5, - result:{ - player(player){ - if(player.getUseValue('feibiao')>0) return 1; - if(player.getUseValue('qiankunbiao')>0) return 1; - if(player.getUseValue('longxugou')>0) return 1; + ai: { + order: 5, + result: { + player(player) { + if (player.getUseValue("feibiao") > 0) return 1; + if (player.getUseValue("qiankunbiao") > 0) return 1; + if (player.getUseValue("longxugou") > 0) return 1; return 0; - } - } - } - } + }, + }, + }, + }, }, /** @type { importCharacterConfig['skill'] } */ - skill:{ - qingshu:{ - ai:{ - threaten:1.4 + skill: { + qingshu: { + ai: { + threaten: 1.4, }, - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - for(var i=0;iplayer.storage.yunyou.length; + filter(event, player) { + return ( + !player.hasSkill("land_used") && + get.inpile("land").length > player.storage.yunyou.length + ); }, - delay:0, - content(){ - var list=get.inpile('land'); - for(var i=0;i0; + enable: "phaseUse", + usable: 1, + viewAs: { name: "feibiao" }, + filterCard: { suit: "club" }, + position: "he", + filter(event, player) { + return player.countCards("he", { suit: "club" }) > 0; }, - check(card){ - return 7-get.value(card); + check(card) { + return 7 - get.value(card); }, - group:'xuanci_sha', - subSkill:{ - sha:{ - trigger:{player:'useCardToAfter'}, - forced:true, - filter(event,player){ - if(event.card.name=='feibiao'){ - return event.target.isIn()&&player.canUse('sha',event.target,false); + group: "xuanci_sha", + subSkill: { + sha: { + trigger: { player: "useCardToAfter" }, + forced: true, + filter(event, player) { + if (event.card.name == "feibiao") { + return event.target.isIn() && player.canUse("sha", event.target, false); } return false; }, - logTarget:'target', - autodelay:0.5, - content(){ - player.useCard(trigger.target,{name:'sha'},false).line=false; - } - } - } + logTarget: "target", + autodelay: 0.5, + content() { + player.useCard(trigger.target, { name: "sha" }, false).line = false; + }, + }, + }, }, - xianju:{ - trigger:{global:'roundStart'}, - forced:true, - init(player){ - if(game.roundNumber%2==1){ - player.addTempSkill('qianxing','roundStart'); + xianju: { + trigger: { global: "roundStart" }, + forced: true, + init(player) { + if (game.roundNumber % 2 == 1) { + player.addTempSkill("qianxing", "roundStart"); } }, - filter(event,player){ - return game.roundNumber%2==1; + filter(event, player) { + return game.roundNumber % 2 == 1; }, - content(){ - if(game.roundNumber%2==1){ - player.addTempSkill('qianxing','roundStart'); - } - else { - var list=get.typeCard('jiguan'); - for(var i=0;iplayer.storage.lingyan.length/13) return false; - return get.cardPile2(event.card.name)?true:false; + xunjian_old: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return player.storage.lingyan && player.storage.lingyan.length == 13; + }, + forced: true, + unique: true, + skillAnimation: true, + content() { + player.awakenSkill("xunjian"); + player.removeSkill("lingyan"); + player.addSkill("tongtian"); }, - content(){ - var card=get.cardPile2(trigger.card.name); - if(card){ - player.gain(card,'gain2'); - } - } }, - tongtian:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - filter(event,player){ - var name=event.card.name; - var enemies=player.getEnemies(); - for(var i=0;i player.storage.lingyan.length / 13) return false; + return get.cardPile2(event.card.name) ? true : false; + }, + content() { + var card = get.cardPile2(trigger.card.name); + if (card) { + player.gain(card, "gain2"); + } + }, + }, + tongtian: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + filter(event, player) { + var name = event.card.name; + var enemies = player.getEnemies(); + for (var i = 0; i < enemies.length; i++) { + if (enemies[i].countCards("h", name)) { return true; } } }, - content(){ - var list=[]; - var name=trigger.card.name; - var enemies=player.getEnemies(); - for(var i=0;i0) { - player.markSkill('yange'); + yange: { + trigger: { player: "phaseBeginStart" }, + direct: true, + init(player) { + if (player.storage.yange > 0) { + player.markSkill("yange"); } }, - filter(event,player){ - return player.storage.yange>0; + filter(event, player) { + return player.storage.yange > 0; }, - content(){ - 'step 0' - player.chooseTarget(function(card,player,target){ - return player!=target; - },get.prompt2('yange')).set('pskill',trigger.skill).set('ai',function(target){ - if(_status.event.pskill) return 0; - var player=_status.event.player; - var nh=player.countCards('h'); - var nh2=target.countCards('h'); - var num=nh2-nh; - if(player.hp==1){ - return num; - } - if(get.threaten(target)>=1.5){ - if(num<2) return 0; - } - else{ - if(num<3) return 0; - } - return num+Math.sqrt(get.threaten(target)); - }); - 'step 1' - if(result.bool){ + content() { + "step 0"; + player + .chooseTarget(function (card, player, target) { + return player != target; + }, get.prompt2("yange")) + .set("pskill", trigger.skill) + .set("ai", function (target) { + if (_status.event.pskill) return 0; + var player = _status.event.player; + var nh = player.countCards("h"); + var nh2 = target.countCards("h"); + var num = nh2 - nh; + if (player.hp == 1) { + return num; + } + if (get.threaten(target) >= 1.5) { + if (num < 2) return 0; + } else { + if (num < 3) return 0; + } + return num + Math.sqrt(get.threaten(target)); + }); + ("step 1"); + if (result.bool) { player.storage.yange--; - if(player.storage.yange<=0){ - player.unmarkSkill('yange'); - } - else{ + if (player.storage.yange <= 0) { + player.unmarkSkill("yange"); + } else { player.updateMarks(); } - var target=result.targets[0]; - player.logSkill('yange',target); - var clone=function(pos){ - var cloned=[]; - var cards=target.getCards(pos); - for(var i=0;i 0) { + if (target.isTurnedOver()) return 2.5; + if (target.hp == 1) { + if (nh == 0) return 2; + if (nh == 1) return 0.9; + if (ui.selected.targets.length) return 0.3; + } else if (target.hp == 2) { + if (nh == 0) return 1.5; + if (nh == 1) return 0.5; + if (ui.selected.targets.length) return 0.2; + } else if (target.hp == 3) { + if (nh == 0) return 0.4; + if (nh == 1) return 0.35; + if (ui.selected.targets.length) return 0.1; + } + if (!target.needsToDiscard(2)) return 0.2; + if (ui.selected.targets.length || !player.needsToDiscard(2)) return 0.05; } - if(target.hp==1){ - if(nh==0) return 2; - if(nh==1) return 1; - } - } - else if(att>0){ - if(target.isTurnedOver()) return 2.5; - if(target.hp==1){ - if(nh==0) return 2; - if(nh==1) return 0.9; - if(ui.selected.targets.length) return 0.3; - } - else if(target.hp==2){ - if(nh==0) return 1.5; - if(nh==1) return 0.5; - if(ui.selected.targets.length) return 0.2; - } - else if(target.hp==3){ - if(nh==0) return 0.4; - if(nh==1) return 0.35; - if(ui.selected.targets.length) return 0.1; - } - if(!target.needsToDiscard(2)) return 0.2; - if(ui.selected.targets.length||!player.needsToDiscard(2)) return 0.05; - } - return 0; - }); - 'step 1' - if(result.bool){ - player.logSkill('lianjing',result.targets); - player.insertEvent('lianjing',lib.skill.lianjing.content_phase); - player.storage.lianjing_targets=result.targets.slice(0); + return 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("lianjing", result.targets); + player.insertEvent("lianjing", lib.skill.lianjing.content_phase); + player.storage.lianjing_targets = result.targets.slice(0); // player.storage.lianjing--; // if(player.storage.lianjing<=0){ // player.unmarkSkill('lianjing'); @@ -872,1893 +958,2000 @@ game.import('character', function () { game.delay(); } }, - content_phase(){ - 'step 0' - event.forceDie=true; - event.list=[player].concat(player.storage.lianjing_targets); - event.exlist=[]; + content_phase() { + "step 0"; + event.forceDie = true; + event.list = [player].concat(player.storage.lianjing_targets); + event.exlist = []; event.list.sortBySeat(); delete player.storage.lianjing_targets; - for(var i=0;i0; - })){ - if(player.hp>1||!player.isTurnedOver()){ - goon=true; + cihong: { + round: 3, + trigger: { player: "phaseEnd" }, + direct: true, + content() { + "step 0"; + var goon = false; + if ( + player.countCards("he", function (card) { + return get.value(card) < 8 && get.color(card) == "red"; + }) + ) { + goon = true; + } else if ( + game.hasPlayer(function (current) { + return ( + current.hp == 1 && + player.canUse("sha", current, false) && + get.attitude(player, current) < 0 && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) { + if (player.hp > 1 || !player.isTurnedOver()) { + goon = true; } } - player.chooseTarget(get.prompt('cihong'),function(card,playe,target){ - return player.canUse('sha',target,false); - }).set('ai',function(target){ - if(!_status.event.goon) return false; - var player=_status.event.player; - if(get.attitude(player,target)>=0) return false; - if(target.hp>3) return false; - return get.effect(target,{name:'sha'},player,player); - }).set('goon',goon); - 'step 1' - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('cihong',event.target); - } - else{ + player + .chooseTarget(get.prompt("cihong"), function (card, playe, target) { + return player.canUse("sha", target, false); + }) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var player = _status.event.player; + if (get.attitude(player, target) >= 0) return false; + if (target.hp > 3) return false; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("goon", goon); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("cihong", event.target); + } else { event.finish(); } - 'step 2' - if(event.target.isAlive()&&player.countCards('he',{color:'red'})){ - player.chooseToDiscard('he',{color:'red'},'是否弃置一张红色牌视为对'+get.translation(event.target)+'使用一张杀?').set('ai',function(card){ - return 8-get.value(card); - }) - } - else{ + ("step 2"); + if (event.target.isAlive() && player.countCards("he", { color: "red" })) { + player + .chooseToDiscard( + "he", + { color: "red" }, + "是否弃置一张红色牌视为对" + get.translation(event.target) + "使用一张杀?" + ) + .set("ai", function (card) { + return 8 - get.value(card); + }); + } else { event.goto(4); } - 'step 3' - if(result.bool){ - player.useCard({name:'sha'},event.target); + ("step 3"); + if (result.bool) { + player.useCard({ name: "sha" }, event.target); } - 'step 4' - if(event.target.isAlive()){ - player.chooseBool('是否失去1点体力并视为对'+get.translation(event.target)+'使用一张杀?').set('choice', - player.hp>event.target.hp&&player.hp>1&&event.target.hp>0 - ); - } - else{ + ("step 4"); + if (event.target.isAlive()) { + player + .chooseBool( + "是否失去1点体力并视为对" + get.translation(event.target) + "使用一张杀?" + ) + .set( + "choice", + player.hp > event.target.hp && player.hp > 1 && event.target.hp > 0 + ); + } else { event.finish(); } - 'step 5' - if(result.bool){ + ("step 5"); + if (result.bool) { player.loseHp(); - player.useCard({name:'sha'},event.target); + player.useCard({ name: "sha" }, event.target); } - 'step 6' - if(event.target.isAlive()&&!player.isTurnedOver()){ - player.chooseBool('是将武将牌翻至背面并视为对'+get.translation(event.target)+'使用一张杀?').set('choice', - event.target.hp==1 - ); - } - else{ + ("step 6"); + if (event.target.isAlive() && !player.isTurnedOver()) { + player + .chooseBool( + "是将武将牌翻至背面并视为对" + get.translation(event.target) + "使用一张杀?" + ) + .set("choice", event.target.hp == 1); + } else { event.finish(); } - 'step 7' - if(result.bool){ + ("step 7"); + if (result.bool) { player.turnOver(true); - player.useCard({name:'sha'},event.target); + player.useCard({ name: "sha" }, event.target); } }, - ai:{ - threaten:1.5 - } + ai: { + threaten: 1.5, + }, }, - zhenying:{ - trigger:{player:['useCard','respond']}, - forced:true, - filter(event,player){ - if(!event.card.isCard) return false; - if(event.cards[0]&&event.cards[0].zhenying_link) return false; - if(get.color(event.card)!='black') return false; - if(['delay','equip'].includes(get.type(event.card))) return false; + zhenying: { + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter(event, player) { + if (!event.card.isCard) return false; + if (event.cards[0] && event.cards[0].zhenying_link) return false; + if (get.color(event.card) != "black") return false; + if (["delay", "equip"].includes(get.type(event.card))) return false; return true; }, - content(){ - var fake=game.createCard(trigger.card); - fake.zhenying_link=true; - player.gain(fake,'draw')._triggered=null; - fake.classList.add('glow'); - fake._destroy='zhenying'; - fake._modUseful=function(){return 0.1}; - fake._modValue=function(){return 0.1}; + content() { + var fake = game.createCard(trigger.card); + fake.zhenying_link = true; + player.gain(fake, "draw")._triggered = null; + fake.classList.add("glow"); + fake._destroy = "zhenying"; + fake._modUseful = function () { + return 0.1; + }; + fake._modValue = function () { + return 0.1; + }; }, - group:['zhenying_discard','zhenying_lose'], - subSkill:{ - discard:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - filter(event,player){ - if(get.is.converted(event)) return false; - if(!player.countCards('he')) return false; - if(event.cards[0]&&event.cards[0].zhenying_link) return true; + group: ["zhenying_discard", "zhenying_lose"], + subSkill: { + discard: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + filter(event, player) { + if (get.is.converted(event)) return false; + if (!player.countCards("he")) return false; + if (event.cards[0] && event.cards[0].zhenying_link) return true; return false; }, - popup:false, - content(){ - player.chooseToDiscard('he',true); - } + popup: false, + content() { + player.chooseToDiscard("he", true); + }, }, - lose:{ - trigger:{global:'phaseAfter'}, - silent:true, - content(){ - var hs=player.getCards('h',function(card){ - return card.zhenying_link?true:false; + lose: { + trigger: { global: "phaseAfter" }, + silent: true, + content() { + var hs = player.getCards("h", function (card) { + return card.zhenying_link ? true : false; }); - if(hs.length){ - player.lose(hs)._triggered=null; + if (hs.length) { + player.lose(hs)._triggered = null; } - } - } - } + }, + }, + }, }, - lingnu:{ - trigger:{source:'damageEnd'}, - forced:true, - init(player){ - player.storage.lingnu={}; + lingnu: { + trigger: { source: "damageEnd" }, + forced: true, + init(player) { + player.storage.lingnu = {}; }, - ai:{ - threaten:1.3 + ai: { + threaten: 1.3, }, - filter(event,player){ - var num=0; - for(var i in player.storage.lingnu){ + filter(event, player) { + var num = 0; + for (var i in player.storage.lingnu) { num++; - if(num>=3) return false; + if (num >= 3) return false; } - return event.num>0; + return event.num > 0; }, - content(){ - var check=function(list){ - for(var i=0;i=3) break; - if(list.length){ - var skill=list.randomGet(); - player.addAdditionalSkill('lingnu',skill,true); - player.storage.lingnu[skill]=3; + for (var i = 0; i < trigger.num; i++) { + if (num >= 3) break; + if (list.length) { + var skill = list.randomGet(); + player.addAdditionalSkill("lingnu", skill, true); + player.storage.lingnu[skill] = 3; player.popup(skill); - game.log(player,'获得了技能','【'+get.translation(skill)+'】'); - player.markSkill('lingnu'); + game.log(player, "获得了技能", "【" + get.translation(skill) + "】"); + player.markSkill("lingnu"); num++; } } }, - intro:{ - content(storage){ - var str='
      '; - for(var i in storage){ - str+='
    • '+get.translation(i)+':剩余'+storage[i]+'回合'; + intro: { + content(storage) { + var str = '
        '; + for (var i in storage) { + str += "
      • " + get.translation(i) + ":剩余" + storage[i] + "回合"; } - str+='
      ' + str += "
    "; return str; }, - markcount(storage){ - var num=0; - for(var i in storage){ + markcount(storage) { + var num = 0; + for (var i in storage) { num++; } return num; - } + }, }, - group:'lingnu_remove', - subSkill:{ - remove:{ - trigger:{player:'phaseAfter'}, - silent:true, - content(){ - var clear=true; - for(var i in player.storage.lingnu){ + group: "lingnu_remove", + subSkill: { + remove: { + trigger: { player: "phaseAfter" }, + silent: true, + content() { + var clear = true; + for (var i in player.storage.lingnu) { player.storage.lingnu[i]--; - if(player.storage.lingnu[i]<=0){ + if (player.storage.lingnu[i] <= 0) { delete player.storage.lingnu[i]; - player.removeAdditionalSkill('lingnu',i); - } - else{ - clear=false; + player.removeAdditionalSkill("lingnu", i); + } else { + clear = false; } } - if(clear){ - player.unmarkSkill('lingnu'); - } - else{ + if (clear) { + player.unmarkSkill("lingnu"); + } else { player.updateMarks(); } - } - } - } + }, + }, + }, }, - zuiji:{ - enable:'phaseUse', - filterCard:true, - position:'he', - viewAs:{name:'jiu'}, - viewAsFilter(player){ - if(!player.countCards('he')) return false; + zuiji: { + enable: "phaseUse", + filterCard: true, + position: "he", + viewAs: { name: "jiu" }, + viewAsFilter(player) { + if (!player.countCards("he")) return false; }, - prompt:'将一张手牌或装备牌当酒使用', - check(card){ - return 5-get.value(card); + prompt: "将一张手牌或装备牌当酒使用", + check(card) { + return 5 - get.value(card); + }, + ai: { + threaten: 1.2, }, - ai:{ - threaten:1.2 - } }, - manwu:{ - trigger:{global:'phaseEnd'}, - check(event,player){ - return get.attitude(player,event.player)>0; + manwu: { + trigger: { global: "phaseEnd" }, + check(event, player) { + return get.attitude(player, event.player) > 0; }, - filter(event,player){ + filter(event, player) { return event.player.isMinHandcard(); }, - logTarget:'player', - content(){ + logTarget: "player", + content() { trigger.player.draw(); }, - ai:{ - expose:0.1 - } - }, - xfanghua:{ - trigger:{target:'useCardToBegin'}, - priority:-1, - filter(event,player){ - return get.color(event.card)=='red'&&player.isDamaged(); + ai: { + expose: 0.1, }, - frequent:true, - content(){ + }, + xfanghua: { + trigger: { target: "useCardToBegin" }, + priority: -1, + filter(event, player) { + return get.color(event.card) == "red" && player.isDamaged(); + }, + frequent: true, + content() { player.recover(); }, - ai:{ - effect:{ - target(card,player,target,current){ - if(get.color(card)=='red'&&target.isDamaged()) return [1,1]; - } - } - } + ai: { + effect: { + target(card, player, target, current) { + if (get.color(card) == "red" && target.isDamaged()) return [1, 1]; + }, + }, + }, }, - duhun:{ - enable:'chooseToUse', - filter(event,player){ - if(event.type!='dying') return false; - if(player!=event.dying) return false; - if(player.maxHp<=1) return false; - if(player.countCards('h')==0) return false; + duhun: { + enable: "chooseToUse", + filter(event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; + if (player.maxHp <= 1) return false; + if (player.countCards("h") == 0) return false; return true; }, // alter:true, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0&&target.hp>0&&target.hp<=player.maxHp; + filterTarget(card, player, target) { + return ( + target != player && + target.countCards("h") > 0 && + target.hp > 0 && + target.hp <= player.maxHp + ); }, - content(){ - 'step 0' + content() { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(!result.bool){ + ("step 1"); + if (!result.bool) { player.die(); event.finish(); - } - else{ - event.num=target.hp-player.hp; + } else { + event.num = target.hp - player.hp; player.loseMaxHp(); } - 'step 2' + ("step 2"); player.changeHp(event.num); - if(get.is.altered('duhun')){ + if (get.is.altered("duhun")) { event.finish(); } - 'step 3' + ("step 3"); event.target.changeHp(-event.num); - 'step 4' - if(event.target.hp<=0){ - event.target.dying({source:player}); + ("step 4"); + if (event.target.hp <= 0) { + event.target.dying({ source: player }); } }, - ai:{ - order:1, - skillTagFilter(player){ - if(player.maxHp<=1) return false; - if(player.hp>0) return false; - if(player.countCards('h')==0) return false; + ai: { + order: 1, + skillTagFilter(player) { + if (player.maxHp <= 1) return false; + if (player.hp > 0) return false; + if (player.countCards("h") == 0) return false; }, - save:true, - result:{ - target:-1, - player:1 + save: true, + result: { + target: -1, + player: 1, }, - threaten:2 + threaten: 2, }, }, - yunyin:{ - trigger:{player:'phaseEnd'}, - direct:true, - subSkill:{ - count:{ - trigger:{player:'useCard'}, - silent:true, - filter(event,player){ - return _status.currentPhase==player; + yunyin: { + trigger: { player: "phaseEnd" }, + direct: true, + subSkill: { + count: { + trigger: { player: "useCard" }, + silent: true, + filter(event, player) { + return _status.currentPhase == player; }, - content(){ - if(!player.storage.yunyin){ - player.storage.yunyin=[]; + content() { + if (!player.storage.yunyin) { + player.storage.yunyin = []; } - var suit=get.suit(trigger.card); - if(suit){ + var suit = get.suit(trigger.card); + if (suit) { player.storage.yunyin.add(suit); } - } + }, }, - set:{ - trigger:{player:'phaseAfter'}, - silent:true, - content(){ + set: { + trigger: { player: "phaseAfter" }, + silent: true, + content() { delete player.storage.yunyin; - } - } + }, + }, }, - filter(event,player){ - if(!player.storage.yunyin) return true; - var hs=player.getCards('h'); - for(var i=0;i0){ + var dialog = ui.create.dialog("云音", [list, "vcard"]); + var taoyuan = 0, + nanman = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var eff1 = get.effect(players[i], { name: "taoyuan" }, player, player); + var eff2 = get.effect(players[i], { name: "nanman" }, player, player); + if (eff1 > 0) { taoyuan++; - } - else if(eff1<0){ + } else if (eff1 < 0) { taoyuan--; } - if(eff2>0){ + if (eff2 > 0) { nanman++; - } - else if(eff2<0){ + } else if (eff2 < 0) { nanman--; } } - player.chooseButton(dialog).ai=function(button){ - var name=button.link[2]; - if(Math.max(taoyuan,nanman)>1){ - if(taoyuan>nanman) return name=='taoyuan'?1:0; - return name=='nanman'?1:0; + player.chooseButton(dialog).ai = function (button) { + var name = button.link[2]; + if (Math.max(taoyuan, nanman) > 1) { + if (taoyuan > nanman) return name == "taoyuan" ? 1 : 0; + return name == "nanman" ? 1 : 0; } - if(player.countCards('h')=2){ - return name=='wuzhong'?1:0; + if (player.countCards("h") < player.hp && player.hp >= 2) { + return name == "wuzhong" ? 1 : 0; } - if(player.hp=2) return true; + if (num >= 2) return true; } } }, - filterCard(card){ - if(ui.selected.cards.length&&card.name==ui.selected.cards[0].name) return false; - var info=get.info(card); - return info.type=='equip'&&!info.nomod&&!info.unique&&lib.inpile.includes(card.name); + filterCard(card) { + if (ui.selected.cards.length && card.name == ui.selected.cards[0].name) return false; + var info = get.info(card); + return ( + info.type == "equip" && !info.nomod && !info.unique && lib.inpile.includes(card.name) + ); }, - selectCard:2, - position:'he', - check(card){ + selectCard: 2, + position: "he", + check(card) { return get.value(card); }, - content(){ - var name=cards[0].name+'_'+cards[1].name; - var info1=get.info(cards[0]),info2=get.info(cards[1]); - if(!lib.card[name]){ - var info={ - enable:true, - type:'equip', - subtype:get.subtype(cards[0]), - vanish:true, - cardimage:info1.cardimage||cards[0].name, - filterTarget(card,player,target){ - return target==player; + content() { + var name = cards[0].name + "_" + cards[1].name; + var info1 = get.info(cards[0]), + info2 = get.info(cards[1]); + if (!lib.card[name]) { + var info = { + enable: true, + type: "equip", + subtype: get.subtype(cards[0]), + vanish: true, + cardimage: info1.cardimage || cards[0].name, + filterTarget(card, player, target) { + return target == player; }, - selectTarget:-1, - modTarget:true, - content:lib.element.content.equipCard, - legend:true, - source:[cards[0].name,cards[1].name], - onEquip:[], - onLose:[], - skills:[], - distance:{}, - ai:{ - order:8.9, - equipValue:10, - useful:2.5, - value(card,player){ - var value=0; - var info=get.info(card); - var current=player.getEquip(info.subtype); - if(current&&card!=current){ - value=get.value(current,player); + selectTarget: -1, + modTarget: true, + content: lib.element.content.equipCard, + legend: true, + source: [cards[0].name, cards[1].name], + onEquip: [], + onLose: [], + skills: [], + distance: {}, + ai: { + order: 8.9, + equipValue: 10, + useful: 2.5, + value(card, player) { + var value = 0; + var info = get.info(card); + var current = player.getEquip(info.subtype); + if (current && card != current) { + value = get.value(current, player); } - var equipValue=info.ai.equipValue||info.ai.basic.equipValue; - if(typeof equipValue=='function') return equipValue(card,player)-value; - return equipValue-value; + var equipValue = info.ai.equipValue || info.ai.basic.equipValue; + if (typeof equipValue == "function") + return equipValue(card, player) - value; + return equipValue - value; }, - result:{ - target(player,target){ - return get.equipResult(player,target,name); - } - } + result: { + target(player, target) { + return get.equipResult(player, target, name); + }, + }, + }, + }; + for (var i in info1.distance) { + info.distance[i] = info1.distance[i]; + } + for (var i in info2.distance) { + if (typeof info.distance[i] == "number") { + info.distance[i] += info2.distance[i]; + } else { + info.distance[i] = info2.distance[i]; } } - for(var i in info1.distance){ - info.distance[i]=info1.distance[i]; + if (info1.skills) { + info.skills = info.skills.concat(info1.skills); } - for(var i in info2.distance){ - if(typeof info.distance[i]=='number'){ - info.distance[i]+=info2.distance[i]; - } - else{ - info.distance[i]=info2.distance[i]; - } + if (info2.skills) { + info.skills = info.skills.concat(info2.skills); } - if(info1.skills){ - info.skills=info.skills.concat(info1.skills); - } - if(info2.skills){ - info.skills=info.skills.concat(info2.skills); - } - if(info1.onEquip){ - if(Array.isArray(info1.onEquip)){ - info.onEquip=info.onEquip.concat(info1.onEquip); - } - else{ + if (info1.onEquip) { + if (Array.isArray(info1.onEquip)) { + info.onEquip = info.onEquip.concat(info1.onEquip); + } else { info.onEquip.push(info1.onEquip); } } - if(info2.onEquip){ - if(Array.isArray(info2.onEquip)){ - info.onEquip=info.onEquip.concat(info2.onEquip); - } - else{ + if (info2.onEquip) { + if (Array.isArray(info2.onEquip)) { + info.onEquip = info.onEquip.concat(info2.onEquip); + } else { info.onEquip.push(info2.onEquip); } } - if(info1.onLose){ - if(Array.isArray(info1.onLose)){ - info.onLose=info.onLose.concat(info1.onLose); - } - else{ + if (info1.onLose) { + if (Array.isArray(info1.onLose)) { + info.onLose = info.onLose.concat(info1.onLose); + } else { info.onLose.push(info1.onLose); } } - if(info2.onLose){ - if(Array.isArray(info2.onLose)){ - info.onLose=info.onLose.concat(info2.onLose); - } - else{ + if (info2.onLose) { + if (Array.isArray(info2.onLose)) { + info.onLose = info.onLose.concat(info2.onLose); + } else { info.onLose.push(info2.onLose); } } - if(info.onEquip.length==0) delete info.onEquip; - if(info.onLose.length==0) delete info.onLose; - lib.card[name]=info; - lib.translate[name]=get.translation(cards[0].name,'skill')+get.translation(cards[1].name,'skill'); - var str=lib.translate[cards[0].name+'_info']; - if(str[str.length-1]=='.'||str[str.length-1]=='。'){ - str=str.slice(0,str.length-1); + if (info.onEquip.length == 0) delete info.onEquip; + if (info.onLose.length == 0) delete info.onLose; + lib.card[name] = info; + lib.translate[name] = + get.translation(cards[0].name, "skill") + get.translation(cards[1].name, "skill"); + var str = lib.translate[cards[0].name + "_info"]; + if (str[str.length - 1] == "." || str[str.length - 1] == "。") { + str = str.slice(0, str.length - 1); } - lib.translate[name+'_info']=str+';'+lib.translate[cards[1].name+'_info']; - try{ - game.addVideo('newcard',null,{ - name:name, - translate:lib.translate[name], - info:lib.translate[name+'_info'], - card:cards[0].name, - legend:true, + lib.translate[name + "_info"] = str + ";" + lib.translate[cards[1].name + "_info"]; + try { + game.addVideo("newcard", null, { + name: name, + translate: lib.translate[name], + info: lib.translate[name + "_info"], + card: cards[0].name, + legend: true, }); - } - catch(e){ + } catch (e) { console.log(e); } } - player.gain(game.createCard({name:name,suit:cards[0].suit,number:cards[0].number}),'gain2'); + player.gain( + game.createCard({ name: name, suit: cards[0].suit, number: cards[0].number }), + "gain2" + ); + }, + ai: { + order: 9.5, + result: { + player: 1, + }, }, - ai:{ - order:9.5, - result:{ - player:1 - } - } }, - meiying:{ - globalSilent:true, - trigger:{global:'phaseEnd'}, - filter(event,player){ - return event.player!=player&&event.player.isAlive()&&player.countCards('he',{color:'red'})>0&&event.player.getHistory('useCard',evt=>{ - return evt.targets&&evt.targets.some(i=>i!==event.player); - }).length===0; + meiying: { + globalSilent: true, + trigger: { global: "phaseEnd" }, + filter(event, player) { + return ( + event.player != player && + event.player.isAlive() && + player.countCards("he", { color: "red" }) > 0 && + event.player.getHistory("useCard", (evt) => { + return evt.targets && evt.targets.some((i) => i !== event.player); + }).length === 0 + ); }, - direct:true, - content(){ - "step 0" - var next=player.chooseToDiscard('he','魅影:是否弃置一张红色牌视为对'+get.translation(trigger.player)+'使用一张杀?'); - next.logSkill=['meiying',trigger.player]; - var eff=get.effect(trigger.player,{name:'sha'},player,player); - next.ai=function(card){ - if(eff>0){ - return 7-get.value(card); + direct: true, + content() { + "step 0"; + var next = player.chooseToDiscard( + "he", + "魅影:是否弃置一张红色牌视为对" + get.translation(trigger.player) + "使用一张杀?" + ); + next.logSkill = ["meiying", trigger.player]; + var eff = get.effect(trigger.player, { name: "sha" }, player, player); + next.ai = function (card) { + if (eff > 0) { + return 7 - get.value(card); } return 0; - } - "step 1" - if(result.bool){ - player.useCard({name:'sha'},trigger.player).animate=false; + }; + ("step 1"); + if (result.bool) { + player.useCard({ name: "sha" }, trigger.player).animate = false; } }, - ai:{ - expose:0.1 - } - }, - jianwu:{ - trigger:{player:'shaBegin'}, - forced:true, - filter(event,player){ - return get.distance(event.target,player,'attack')>1; + ai: { + expose: 0.1, }, - content(){ - trigger.directHit=true; - } }, - zuizhan:{ - trigger:{player:'useCard'}, - popup:false, - filter(event,player){ - if(event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return (event.targets.includes(current)==false&¤t!=player&& - lib.filter.targetEnabled(event.card,player,current)) + jianwu: { + trigger: { player: "shaBegin" }, + forced: true, + filter(event, player) { + return get.distance(event.target, player, "attack") > 1; + }, + content() { + trigger.directHit = true; + }, + }, + zuizhan: { + trigger: { player: "useCard" }, + popup: false, + filter(event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return ( + event.targets.includes(current) == false && + current != player && + lib.filter.targetEnabled(event.card, player, current) + ); }); }, - content(){ - var list=game.filterPlayer(function(current){ - return (trigger.targets.includes(current)==false&¤t!=player&& - lib.filter.targetEnabled(trigger.card,player,current)) + content() { + var list = game.filterPlayer(function (current) { + return ( + trigger.targets.includes(current) == false && + current != player && + lib.filter.targetEnabled(trigger.card, player, current) + ); }); - if(list.length){ - event.target=list.randomGet(); - player.line(event.target,'green'); - game.log(event.target,'被追加为额外目标'); + if (list.length) { + event.target = list.randomGet(); + player.line(event.target, "green"); + game.log(event.target, "被追加为额外目标"); trigger.targets.push(event.target); player.draw(); } - } + }, }, - xidie:{ - trigger:{player:'phaseBegin'}, - direct:true, - filter(event,player){ - return player.countCards('h')>player.hp; + xidie: { + trigger: { player: "phaseBegin" }, + direct: true, + filter(event, player) { + return player.countCards("h") > player.hp; }, - content(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('xidie'),[1,Math.min(3,player.countCards('h')-player.hp)]); - next.ai=function(card){ - return 6-get.value(card); - } - next.logSkill='xidie'; - "step 1" - if(result.bool){ - player.storage.xidie=result.cards.length; - } - }, - group:'xidie2' - }, - xidie2:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.storage.xidie>0; - }, - content(){ - player.draw(player.storage.xidie); - player.storage.xidie=0; - } - }, - meihu:{ - trigger:{player:'damageEnd'}, - check(event,player){ - return get.attitude(player,event.source)<4; - }, - filter(event,player){ - return event.source&&event.source!=player&&event.source.countCards('h')>0; - }, - logTarget:'source', - content(){ - "step 0" - trigger.source.chooseCard('交给'+get.translation(player)+'一张手牌',true).ai=function(card){ - return -get.value(card); + content() { + "step 0"; + var next = player.chooseToDiscard(get.prompt("xidie"), [ + 1, + Math.min(3, player.countCards("h") - player.hp), + ]); + next.ai = function (card) { + return 6 - get.value(card); }; - "step 1" - if(result.bool){ - player.gain(result.cards[0],trigger.source); - trigger.source.$give(1,player); + next.logSkill = "xidie"; + ("step 1"); + if (result.bool) { + player.storage.xidie = result.cards.length; } }, - ai:{ - maixie_defend:true, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; - return [1,0,0,-0.5]; - } - } - } - } + group: "xidie2", }, - xlqianhuan:{ - trigger:{player:'phaseAfter'}, - check(event,player){ - return player.hp==1||player.isTurnedOver(); + xidie2: { + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.storage.xidie > 0; }, - filter(event,player){ - return player.hp 0; + }, + logTarget: "source", + content() { + "step 0"; + trigger.source.chooseCard("交给" + get.translation(player) + "一张手牌", true).ai = + function (card) { + return -get.value(card); + }; + ("step 1"); + if (result.bool) { + player.gain(result.cards[0], trigger.source); + trigger.source.$give(1, player); + } + }, + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + return [1, 0, 0, -0.5]; + } + }, + }, + }, + }, + xlqianhuan: { + trigger: { player: "phaseAfter" }, + check(event, player) { + return player.hp == 1 || player.isTurnedOver(); + }, + filter(event, player) { + return player.hp < player.maxHp; + }, + content() { + "step 0"; player.recover(); - "step 1" + ("step 1"); player.turnOver(); }, - mod:{ - targetEnabled(card,player,target){ - if(target.isTurnedOver()) return false; + mod: { + targetEnabled(card, player, target) { + if (target.isTurnedOver()) return false; + }, + cardEnabled(card, player) { + if (player.isTurnedOver()) return false; }, - cardEnabled(card,player){ - if(player.isTurnedOver()) return false; - } - } - }, - fumo:{ - trigger:{player:'damageAfter'}, - filter(event,player){ - return event.source&&event.source.isAlive()&&player.countCards('h',{color:'red'})>1||player.countCards('h',{color:'black'})>1; }, - direct:true, - content(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('fumo',trigger.source),2,function(card){ - if(get.damageEffect(trigger.source,player,player,'thunder')<=0) return 0; - if(ui.selected.cards.length){ - return get.color(card)==get.color(ui.selected.cards[0]); - } - return player.countCards('h',{color:get.color(card)})>1; - }).set('complexCard',true); - next.ai=function(card){ - if(get.damageEffect(trigger.source,player,player,'thunder')>0){ - return 8-get.value(card); + }, + fumo: { + trigger: { player: "damageAfter" }, + filter(event, player) { + return ( + (event.source && + event.source.isAlive() && + player.countCards("h", { color: "red" }) > 1) || + player.countCards("h", { color: "black" }) > 1 + ); + }, + direct: true, + content() { + "step 0"; + var next = player + .chooseToDiscard(get.prompt("fumo", trigger.source), 2, function (card) { + if (get.damageEffect(trigger.source, player, player, "thunder") <= 0) return 0; + if (ui.selected.cards.length) { + return get.color(card) == get.color(ui.selected.cards[0]); + } + return player.countCards("h", { color: get.color(card) }) > 1; + }) + .set("complexCard", true); + next.ai = function (card) { + if (get.damageEffect(trigger.source, player, player, "thunder") > 0) { + return 8 - get.value(card); } return 0; }; - next.logSkill=['fumo',trigger.source,'thunder']; - "step 1" - if(result.bool){ - trigger.source.damage('thunder'); + next.logSkill = ["fumo", trigger.source, "thunder"]; + ("step 1"); + if (result.bool) { + trigger.source.damage("thunder"); } }, - ai:{ - maixie_defend:true, - threaten:0.8 - } + ai: { + maixie_defend: true, + threaten: 0.8, + }, }, - fanyin:{ - trigger:{player:'phaseEnd'}, - direct:true, - content(){ - "step 0" - player.chooseTarget(get.prompt('fanyin'),function(card,player,target){ + fanyin: { + trigger: { player: "phaseEnd" }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt("fanyin"), function (card, player, target) { // if(player==target) return false; - if(target.isLinked()) return true; - if(target.isTurnedOver()) return true; - if(target.countCards('j')) return true; - if(target.isMinHp()&&target.isDamaged()) return true; + if (target.isLinked()) return true; + if (target.isTurnedOver()) return true; + if (target.countCards("j")) return true; + if (target.isMinHp() && target.isDamaged()) return true; return false; - }).ai=function(target){ - var num=0; - var att=get.attitude(player,target); - if(att>0){ - if(target.isMinHp()){ - num+=5; + }).ai = function (target) { + var num = 0; + var att = get.attitude(player, target); + if (att > 0) { + if (target.isMinHp()) { + num += 5; } - if(target.isTurnedOver()){ - num+=5; + if (target.isTurnedOver()) { + num += 5; } - if(target.countCards('j')){ - num+=2; + if (target.countCards("j")) { + num += 2; } - if(target.isLinked()){ + if (target.isLinked()) { num++; } - if(num>0){ - return num+att; + if (num > 0) { + return num + att; } } return num; - } - "step 1" - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('fanyin',event.target); - } - else{ + }; + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("fanyin", event.target); + } else { event.finish(); } - "step 2" - if(event.target.isLinked()){ + ("step 2"); + if (event.target.isLinked()) { event.target.link(); } - "step 3" - if(event.target.isTurnedOver()){ + ("step 3"); + if (event.target.isTurnedOver()) { event.target.turnOver(); } - "step 4" - var cards=event.target.getCards('j'); - if(cards.length){ + ("step 4"); + var cards = event.target.getCards("j"); + if (cards.length) { event.target.discard(cards); } - "step 5" - if(event.target.isMinHp()){ + ("step 5"); + if (event.target.isMinHp()) { event.target.recover(); } }, - ai:{ - expose:0.2, - threaten:1.3 - } - }, - mingkong:{ - trigger:{player:'damageBegin'}, - forced:true, - filter(event,player){ - return player.countCards('h')==0&&event.num>=1; + ai: { + expose: 0.2, + threaten: 1.3, }, - content(){ - if(trigger.num>=1){ + }, + mingkong: { + trigger: { player: "damageBegin" }, + forced: true, + filter(event, player) { + return player.countCards("h") == 0 && event.num >= 1; + }, + content() { + if (trigger.num >= 1) { trigger.num--; } - if(trigger.source){ - trigger.source.storage.mingkong=true; - trigger.source.addTempSkill('mingkong2'); + if (trigger.source) { + trigger.source.storage.mingkong = true; + trigger.source.addTempSkill("mingkong2"); } }, - ai:{ - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')&&target.countCards('h')==0){ - if(player.hasSkillTag('jueqing',false,target)) return; + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "damage") && target.countCards("h") == 0) { + if (player.hasSkillTag("jueqing", false, target)) return; return 0.1; } - } - } + }, + }, }, }, - mingkong2:{ - trigger:{source:['damageEnd','damageZero']}, - forced:true, - popup:false, - audio:false, - vanish:true, - filter(event,player){ - return player.storage.mingkong?true:false; + mingkong2: { + trigger: { source: ["damageEnd", "damageZero"] }, + forced: true, + popup: false, + audio: false, + vanish: true, + filter(event, player) { + return player.storage.mingkong ? true : false; }, - content(){ + content() { player.draw(); - player.storage.mingkong=false; - player.removeSkill('mingkong2'); - } + player.storage.mingkong = false; + player.removeSkill("mingkong2"); + }, }, - yuehua:{ - trigger:{player:['useCardAfter','respondAfter','discardAfter']}, - frequent:true, - filter(event,player){ - if(player==_status.currentPhase) return false; - if(event.cards){ - for(var i=0;i0; + ai: { + threaten: 0.7, }, - direct:true, - priority:-5, - content(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('qinglan',trigger.player),'he'); - next.logSkill=['qinglan',trigger.player]; - next.ai=function(card){ - if(trigger.num>1||!trigger.source){ - if(get.attitude(player,trigger.player)>0){ - return 9-get.value(card); + }, + qinglan: { + trigger: { global: "damageBefore" }, + filter(event, player) { + return Boolean(event.nature) && player.countCards("he") > 0; + }, + direct: true, + priority: -5, + content() { + "step 0"; + var next = player.chooseToDiscard(get.prompt("qinglan", trigger.player), "he"); + next.logSkill = ["qinglan", trigger.player]; + next.ai = function (card) { + if (trigger.num > 1 || !trigger.source) { + if (get.attitude(player, trigger.player) > 0) { + return 9 - get.value(card); } return -1; - } - else if(get.attitude(player,trigger.player)>0){ - if(trigger.player.hp==1){ - return 8-get.value(card); + } else if (get.attitude(player, trigger.player) > 0) { + if (trigger.player.hp == 1) { + return 8 - get.value(card); } - if(trigger.source.hp==trigger.source.maxHp){ - return 6-get.value(card); + if (trigger.source.hp == trigger.source.maxHp) { + return 6 - get.value(card); } - } - else if(get.attitude(player,trigger.source)>0&& - trigger.source.hp1){ - if(get.color(card)=='red') return 5-get.value(card); + } else if ( + get.attitude(player, trigger.source) > 0 && + trigger.source.hp < trigger.source.maxHp && + trigger.num <= 1 && + trigger.player.hp > 1 + ) { + if (get.color(card) == "red") return 5 - get.value(card); } return -1; - } - "step 1" - if(result.bool){ + }; + ("step 1"); + if (result.bool) { trigger.cancel(); - if(trigger.source){ + if (trigger.source) { trigger.source.recover(); } - } - else{ + } else { event.finish(); } - "step 2" - if(trigger.source){ + ("step 2"); + if (trigger.source) { trigger.source.draw(); } }, - ai:{ - expose:0.1 - } + ai: { + expose: 0.1, + }, }, - fanshi:{ - trigger:{player:'phaseDiscardAfter'}, - forced:true, - filter(event,player){ - return player.getStat('damage')>0; + fanshi: { + trigger: { player: "phaseDiscardAfter" }, + forced: true, + filter(event, player) { + return player.getStat("damage") > 0; }, - check(event,player){ - return player.hp==player.maxHp; + check(event, player) { + return player.hp == player.maxHp; }, - content(){ - "step 0" + content() { + "step 0"; player.loseHp(); - "step 1" + ("step 1"); player.draw(); - } + }, }, - xuelu:{ - unique:true, - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return player.maxHp>player.hp&&player.countCards('he',{color:'red'})>0; + xuelu: { + unique: true, + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return player.maxHp > player.hp && player.countCards("he", { color: "red" }) > 0; }, // alter:true, - content(){ - "step 0" + content() { + "step 0"; player.chooseCardTarget({ - position:'he', - filterTarget(card,player,target){ - return player!=target; + position: "he", + filterTarget(card, player, target) { + return player != target; }, - filterCard(card,player){ - return get.color(card)=='red'&&lib.filter.cardDiscardable(card,player); + filterCard(card, player) { + return get.color(card) == "red" && lib.filter.cardDiscardable(card, player); }, - ai1(card){ - return 9-get.value(card); + ai1(card) { + return 9 - get.value(card); }, - ai2(target){ - return get.damageEffect(target,player,player,'fire'); + ai2(target) { + return get.damageEffect(target, player, player, "fire"); }, - prompt:get.prompt('xuelu') + prompt: get.prompt("xuelu"), }); - "step 1" - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('xuelu',event.target,'fire'); - if(get.is.altered('xuelu')){ - event.num=1; - } - else{ - event.num=Math.min(2,Math.ceil((player.maxHp-player.hp)/2)); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("xuelu", event.target, "fire"); + if (get.is.altered("xuelu")) { + event.num = 1; + } else { + event.num = Math.min(2, Math.ceil((player.maxHp - player.hp) / 2)); } player.discard(result.cards); - } - else{ + } else { event.finish(); } - "step 2" - if(event.target){ - event.target.damage(event.num,'fire'); + ("step 2"); + if (event.target) { + event.target.damage(event.num, "fire"); } }, - ai:{ - maixie:true, - expose:0.2, - threaten(player,target){ - if(target.hp==1) return 3; - if(target.hp==2) return 1.5; + ai: { + maixie: true, + expose: 0.2, + threaten(player, target) { + if (target.hp == 1) return 3; + if (target.hp == 2) return 1.5; return 0.5; }, - effect:{ - target(card,player,target){ - if(!target.hasFriend()) return; - if(get.tag(card,'damage')){ - if(target.hp==target.maxHp) return [0,1]; + effect: { + target(card, player, target) { + if (!target.hasFriend()) return; + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp) return [0, 1]; } - if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0]; - } - } - } - }, - xiuhua_old:{ - changeSeat:true, - trigger:{player:'shaHit'}, - filter(event,player){ - return event.target!=player.previous; - }, - content(){ - game.swapSeat(trigger.target,player,true,true); - } - }, - shahun:{ - enable:'chooseToUse', - skillAnimation:true, - animationColor:'fire', - derivation:'juejing', - // alter:true, - filter(event,player){ - return !player.storage.shahun&&player.hp<=0; - }, - content(){ - "step 0" - var cards=player.getCards('hej'); - player.discard(cards); - "step 1" - if(player.isLinked()) player.link(); - "step 2" - if(player.isTurnedOver()) player.turnOver(); - "step 3" - player.draw(3); - "step 4" - player.recover(1-player.hp); - player.removeSkill('fanshi'); - player.addSkill('juejing'); - player.storage.shahun=2; - player.markSkill('shahun'); - game.addVideo('storage',player,['shahun',player.storage.shahun]); - }, - group:'shahun2', - intro:{ - content:'turn' - }, - ai:{ - save:true, - skillTagFilter(player){ - if(player.storage.shahun) return false; - if(player.hp>0) return false; - }, - result:{ - player:3 - } - } - }, - shahun2:{ - trigger:{player:'phaseAfter'}, - forced:true, - filter(event,player){ - return player.storage.shahun?true:false; - }, - content(){ - if(player.storage.shahun>1){ - player.storage.shahun--; - game.addVideo('storage',player,['shahun',player.storage.shahun]); - } - else{ - player.die(); - } - } - }, - yanjia_old:{ - enable:'chooseToUse', - filter(event,player){ - return player.countCards('he',{type:'equip'})>0; - }, - filterCard(card){ - return get.type(card)=='equip'; - }, - position:'he', - viewAs:{name:'wuzhong'}, - prompt:'将一张装备牌当无中生有使用', - check(card){ - var player=_status.currentPhase; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); - } - if(player.countCards('h')= player.maxHp - 1) return [0, 0]; }, }, - order:4, - } + }, }, - qianjun:{ - trigger:{player:'useCard'}, - direct:true, - filter(event,player){ - if(event.card.name!='sha') return false; - if(event.targets.length!=1) return false; - if(!player.countCards('he')) return false; - var target=event.targets[0]; - return game.hasPlayer(function(current){ - return player!=current&&target!=current&&get.distance(target,current)<=1; + xiuhua_old: { + changeSeat: true, + trigger: { player: "shaHit" }, + filter(event, player) { + return event.target != player.previous; + }, + content() { + game.swapSeat(trigger.target, player, true, true); + }, + }, + shahun: { + enable: "chooseToUse", + skillAnimation: true, + animationColor: "fire", + derivation: "juejing", + // alter:true, + filter(event, player) { + return !player.storage.shahun && player.hp <= 0; + }, + content() { + "step 0"; + var cards = player.getCards("hej"); + player.discard(cards); + ("step 1"); + if (player.isLinked()) player.link(); + ("step 2"); + if (player.isTurnedOver()) player.turnOver(); + ("step 3"); + player.draw(3); + ("step 4"); + player.recover(1 - player.hp); + player.removeSkill("fanshi"); + player.addSkill("juejing"); + player.storage.shahun = 2; + player.markSkill("shahun"); + game.addVideo("storage", player, ["shahun", player.storage.shahun]); + }, + group: "shahun2", + intro: { + content: "turn", + }, + ai: { + save: true, + skillTagFilter(player) { + if (player.storage.shahun) return false; + if (player.hp > 0) return false; + }, + result: { + player: 3, + }, + }, + }, + shahun2: { + trigger: { player: "phaseAfter" }, + forced: true, + filter(event, player) { + return player.storage.shahun ? true : false; + }, + content() { + if (player.storage.shahun > 1) { + player.storage.shahun--; + game.addVideo("storage", player, ["shahun", player.storage.shahun]); + } else { + player.die(); + } + }, + }, + yanjia_old: { + enable: "chooseToUse", + filter(event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + filterCard(card) { + return get.type(card) == "equip"; + }, + position: "he", + viewAs: { name: "wuzhong" }, + prompt: "将一张装备牌当无中生有使用", + check(card) { + var player = _status.currentPhase; + if (player.countCards("he", { 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); + }, + ai: { + order: 9, + threaten: 1.1, + }, + }, + jizhan: { + enable: "phaseUse", + usable: 1, + changeSeat: true, + filterTarget(card, player, target) { + return player != target && player.next != target && player.canUse("sha", target, false); + }, + filter(event, player) { + var min = Math.max(1, player.maxHp - player.hp); + return lib.filter.filterCard({ name: "sha" }, player); + }, + content() { + game.swapSeat(player, target, true, true); + player.useCard({ name: "sha" }, target, false); + }, + ai: { + result: { + target(player, target) { + return get.effect(target, { name: "sha" }, player, target); + }, + }, + order: 4, + }, + }, + qianjun: { + trigger: { player: "useCard" }, + direct: true, + filter(event, player) { + if (event.card.name != "sha") return false; + if (event.targets.length != 1) return false; + if (!player.countCards("he")) return false; + var target = event.targets[0]; + return game.hasPlayer(function (current) { + return player != current && target != current && get.distance(target, current) <= 1; }); }, - content(){ - "step 0" - event.targets=game.filterPlayer(function(current){ - var target=trigger.targets[0]; - return player!=current&&target!=current&&get.distance(target,current)<=1; + content() { + "step 0"; + event.targets = game.filterPlayer(function (current) { + var target = trigger.targets[0]; + return player != current && target != current && get.distance(target, current) <= 1; }); - var num=0; - for(var i=0;i0&&player.storage.xuanning!=3; + xuanning1: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h", { type: "basic" }) > 0 && player.storage.xuanning != 3; }, - filterCard(card){ - return get.type(card)=='basic'; + filterCard(card) { + return get.type(card) == "basic"; }, - check(card){ - return 7-get.useful(card); + check(card) { + return 7 - get.useful(card); }, - content(){ - player.storage.xuanning=3; - player.markSkill('xuanning'); - game.addVideo('storage',player,['xuanning',player.storage.xuanning]); + content() { + player.storage.xuanning = 3; + player.markSkill("xuanning"); + game.addVideo("storage", player, ["xuanning", player.storage.xuanning]); }, - ai:{ - result:{ - player(player){ - var num=player.countCards('h'); - if(num>player.hp+1) return 1; - if(player.storage.xuanning>=2) return 0; - if(num>player.hp) return 1 - if(player.storage.xuanning>=1) return 0; + ai: { + result: { + player(player) { + var num = player.countCards("h"); + if (num > player.hp + 1) return 1; + if (player.storage.xuanning >= 2) return 0; + if (num > player.hp) return 1; + if (player.storage.xuanning >= 1) return 0; return 1; }, }, - order:5 - } + order: 5, + }, }, - xuanning2:{ - trigger:{player:'damageEnd'}, - forced:true, - filter(event,player){ - if(player.storage.xuanning){ - return (event.source&&event.source.countCards('he')>0); + xuanning2: { + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { + if (player.storage.xuanning) { + return event.source && event.source.countCards("he") > 0; } return false; }, - logTarget:'source', - content(){ - var he=trigger.source.getCards('he'); - if(he.length){ + logTarget: "source", + content() { + var he = trigger.source.getCards("he"); + if (he.length) { trigger.source.discard(he.randomGet()); } player.storage.xuanning--; - if(!player.storage.xuanning){ - player.unmarkSkill('xuanning'); + if (!player.storage.xuanning) { + player.unmarkSkill("xuanning"); } - game.addVideo('storage',player,['xuanning',player.storage.xuanning]); + game.addVideo("storage", player, ["xuanning", player.storage.xuanning]); + }, + ai: { + maixie_defend: true, }, - ai:{ - maixie_defend:true, - } }, - liuguang:{ - trigger:{player:'phaseBegin'}, - direct:true, - filter(event,player){ - if(player.storage.xuanning) return true; + liuguang: { + trigger: { player: "phaseBegin" }, + direct: true, + filter(event, player) { + if (player.storage.xuanning) return true; return false; }, - content(){ - "step 0" - player.chooseTarget(function(card,player,target){ - return player!=target; - },get.prompt('liuguang'),[1,3]).ai=function(target){ - return get.damageEffect(target,player,player); - } - "step 1" - if(result.bool){ + content() { + "step 0"; + player.chooseTarget( + function (card, player, target) { + return player != target; + }, + get.prompt("liuguang"), + [1, 3] + ).ai = function (target) { + return get.damageEffect(target, player, player); + }; + ("step 1"); + if (result.bool) { player.storage.xuanning--; - if(!player.storage.xuanning){ - player.unmarkSkill('xuanning'); + if (!player.storage.xuanning) { + player.unmarkSkill("xuanning"); } - event.targets=result.targets.slice(0); + event.targets = result.targets.slice(0); event.targets.sort(lib.sort.seat); - player.logSkill('liuguang',result.targets); - game.addVideo('storage',player,['xuanning',player.storage.xuanning]); - } - else{ + player.logSkill("liuguang", result.targets); + game.addVideo("storage", player, ["xuanning", player.storage.xuanning]); + } else { event.finish(); } - "step 2" - if(event.targets.length){ - var target=event.targets.shift(); - var next=target.chooseToDiscard('流光:弃置一张牌或受到1点伤害','he'); - next.ai=function(card){ - if(get.damageEffect(_status.event.player,player,_status.event.player)>=0) return -1; - if(_status.event.player.hp==1) return 9-get.value(card); - return 8-get.value(card); + ("step 2"); + if (event.targets.length) { + var target = event.targets.shift(); + var next = target.chooseToDiscard("流光:弃置一张牌或受到1点伤害", "he"); + next.ai = function (card) { + if (get.damageEffect(_status.event.player, player, _status.event.player) >= 0) + return -1; + if (_status.event.player.hp == 1) return 9 - get.value(card); + return 8 - get.value(card); }; - next.autochoose=function(){ - return this.player.countCards('he')==0; + next.autochoose = function () { + return this.player.countCards("he") == 0; }; - event.current=target; - } - else{ + event.current = target; + } else { event.finish(); } - "step 3" - if(result.bool&&result.cards&&result.cards.length){ + ("step 3"); + if (result.bool && result.cards && result.cards.length) { event.goto(2); - } - else{ + } else { event.current.damage(); } }, - ai:{ - expose:0.2, - threaten:1.3 - } + ai: { + expose: 0.2, + threaten: 1.3, + }, }, - yangming:{ - enable:'phaseUse', - filter(event,player){ - if(player.storage.yangming2>0) return false; - return player.countCards('h',{color:'red'})>0; + yangming: { + enable: "phaseUse", + filter(event, player) { + if (player.storage.yangming2 > 0) return false; + return player.countCards("h", { color: "red" }) > 0; }, - filterCard(card){ - return get.color(card)=='red'; + filterCard(card) { + return get.color(card) == "red"; }, - content(){ - player.storage.yangming2=2; - player.addSkill('yangming2'); - game.addVideo('storage',player,['yangming2',player.storage.yangming2]); + content() { + player.storage.yangming2 = 2; + player.addSkill("yangming2"); + game.addVideo("storage", player, ["yangming2", player.storage.yangming2]); }, - check(card){ - return 6-get.value(card); + check(card) { + return 6 - get.value(card); }, - ai:{ - result:{ - player(player){ - if(player.countCards('h')<=player.hp&&player.hp==player.maxHp){ + ai: { + result: { + player(player) { + if (player.countCards("h") <= player.hp && player.hp == player.maxHp) { return 0; } return 1; - } + }, }, - order:6, - threaten:1.3 - } + order: 6, + threaten: 1.3, + }, }, - yangming2:{ - trigger:{player:'phaseUseEnd'}, - direct:true, - mark:true, - content(){ - "step 0" + yangming2: { + trigger: { player: "phaseUseEnd" }, + direct: true, + mark: true, + content() { + "step 0"; player.storage.yangming2--; - game.addVideo('storage',player,['yangming2',player.storage.yangming2]); - if(player.storage.yangming2>0){ + game.addVideo("storage", player, ["yangming2", player.storage.yangming2]); + if (player.storage.yangming2 > 0) { event.finish(); - } - else{ - player.removeSkill('yangming2'); - var num=game.countPlayer(function(current){ - return get.distance(player,current)<=1&¤t.isDamaged(); + } else { + player.removeSkill("yangming2"); + var num = game.countPlayer(function (current) { + return get.distance(player, current) <= 1 && current.isDamaged(); }); - if(num==0){ + if (num == 0) { event.finish(); - } - else{ - player.chooseTarget(function(card,player,target){ - return get.distance(player,target)<=1&&target.hp1) return false; - if(target.hp>2) return false; - if(get.attitude(player,target)>=0) return false; - return get.damageEffect(target,player,player,'fire'); - } - } - } + ai: { + order: 1, + result: { + player(player, target) { + if (player.hp > 1) return false; + if (target.hp > 2) return false; + if (get.attitude(player, target) >= 0) return false; + return get.damageEffect(target, player, player, "fire"); + }, + }, + }, }, - jiehuo_old:{ - unique:true, - forbid:['infinity'], - skillAnimation:true, - animationColor:'fire', - init(player){ - player.storage.jiehuo=false; + jiehuo_old: { + unique: true, + forbid: ["infinity"], + skillAnimation: true, + animationColor: "fire", + init(player) { + player.storage.jiehuo = false; }, - enable:'phaseUse', - filter(event,player){ + enable: "phaseUse", + filter(event, player) { //if(player.maxHp<=1) return false; - return !player.storage.jiehuo + return !player.storage.jiehuo; }, - intro:{ - content:'limited' + intro: { + content: "limited", }, // mark:true, - line:'fire', - filterTarget(card,player,target){ - return player!=target; + line: "fire", + filterTarget(card, player, target) { + return player != target; }, - selectTarget:-1, - content(){ - if(!player.storage.jiehuo2){ - player.storage.jiehuo2=player.maxHp; - player.addSkill('jiehuo2'); + selectTarget: -1, + content() { + if (!player.storage.jiehuo2) { + player.storage.jiehuo2 = player.maxHp; + player.addSkill("jiehuo2"); } - player.storage.jiehuo=true; - target.damage(Math.min(target.hp,player.storage.jiehuo2),'fire'); - } + player.storage.jiehuo = true; + target.damage(Math.min(target.hp, player.storage.jiehuo2), "fire"); + }, }, - jiehuo2:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - popup:false, - content(){ + jiehuo2: { + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + content() { player.die(); - } + }, }, - yuling:{ - unique:true, - locked:true, - group:['yuling1','yuling2','yuling3','yuling4','yuling5','yuling6'], - intro:{ - content:'time' + yuling: { + unique: true, + locked: true, + group: ["yuling1", "yuling2", "yuling3", "yuling4", "yuling5", "yuling6"], + intro: { + content: "time", }, // alter:true, - ai:{ - noh:true, - threaten:0.8, - effect:{ - target(card,player,target){ - if(card.name=='bingliang') return 0; - if(card.name=='lebu') return 1.5; - if(card.name=='guohe'){ - if(!target.countCards('e')) return 0; + ai: { + noh: true, + threaten: 0.8, + effect: { + target(card, player, target) { + if (card.name == "bingliang") return 0; + if (card.name == "lebu") return 1.5; + if (card.name == "guohe") { + if (!target.countCards("e")) return 0; return 0.5; } - if(card.name=='liuxinghuoyu') return 0; - } - } - } + if (card.name == "liuxinghuoyu") return 0; + }, + }, + }, }, - yuling1:{ - trigger:{player:['phaseDrawBefore','phaseDiscardBefore']}, - priority:10, - forced:true, - popup:false, - check(){ + yuling1: { + trigger: { player: ["phaseDrawBefore", "phaseDiscardBefore"] }, + priority: 10, + forced: true, + popup: false, + check() { return false; }, - content(){ + content() { trigger.cancel(); - } - }, - yuling2:{ - trigger:{player:['loseEnd','drawEnd'],global:'gameDrawAfter'}, - check(event,player){ - return player.countCards('h')<2; }, - priority:10, - forced:true, - filter(event,player){ - return player.countCards('h')<5; + }, + yuling2: { + trigger: { player: ["loseEnd", "drawEnd"], global: "gameDrawAfter" }, + check(event, player) { + return player.countCards("h") < 2; }, - content(){ - player.draw(5-player.countCards('h')); - } - }, - yuling3:{ - trigger:{player:'gainEnd'}, - priority:10, - forced:true, - filter(event,player){ - return player.countCards('h')>5; + priority: 10, + forced: true, + filter(event, player) { + return player.countCards("h") < 5; }, - check(event,player){ - return player.countCards('h')<2; + content() { + player.draw(5 - player.countCards("h")); }, - content(){ - player.chooseToDiscard(true,player.countCards('h')-5); - } }, - yuling4:{ - mod:{ - cardEnabled(card,player){ - if(_status.currentPhase!=player) return; - var num=2; - if(get.is.altered('yuling')) num=1; - if(player.countUsed()>=player.maxHp+num) return false; - } - } + yuling3: { + trigger: { player: "gainEnd" }, + priority: 10, + forced: true, + filter(event, player) { + return player.countCards("h") > 5; + }, + check(event, player) { + return player.countCards("h") < 2; + }, + content() { + player.chooseToDiscard(true, player.countCards("h") - 5); + }, }, - yuling5:{ - trigger:{player:['useCardAfter','phaseBegin']}, - silent:true, - content(){ - player.storage.yuling=player.maxHp+2-player.countUsed(); - } + yuling4: { + mod: { + cardEnabled(card, player) { + if (_status.currentPhase != player) return; + var num = 2; + if (get.is.altered("yuling")) num = 1; + if (player.countUsed() >= player.maxHp + num) return false; + }, + }, }, - yuling6:{ - trigger:{player:'phaseAfter'}, - silent:true, - content(){ + yuling5: { + trigger: { player: ["useCardAfter", "phaseBegin"] }, + silent: true, + content() { + player.storage.yuling = player.maxHp + 2 - player.countUsed(); + }, + }, + yuling6: { + trigger: { player: "phaseAfter" }, + silent: true, + content() { delete player.storage.yuling; - } + }, }, }, - translate:{ - gjqt_bailitusu:'百里屠苏', - gjqt_fengqingxue:'风晴雪', - gjqt_fanglansheng:'方兰生', - gjqt_xiangling:'襄铃', - gjqt_yinqianshang:'尹千觞', - gjqt_hongyu:'红玉', - gjqt_ouyangshaogong:'欧阳少恭', - gjqt_xunfang:'巽芳', + translate: { + gjqt_bailitusu: "百里屠苏", + gjqt_fengqingxue: "风晴雪", + gjqt_fanglansheng: "方兰生", + gjqt_xiangling: "襄铃", + gjqt_yinqianshang: "尹千觞", + gjqt_hongyu: "红玉", + gjqt_ouyangshaogong: "欧阳少恭", + gjqt_xunfang: "巽芳", - gjqt_yuewuyi:'乐无异', - gjqt_wenrenyu:'闻人羽', - gjqt_xiayize:'夏夷则', - gjqt_aruan:'阿阮', - gjqt_xieyi:'谢衣', - gjqt_yanjiaxieyi:'偃甲谢衣', - gjqt_chuqi:'初七', + gjqt_yuewuyi: "乐无异", + gjqt_wenrenyu: "闻人羽", + gjqt_xiayize: "夏夷则", + gjqt_aruan: "阿阮", + gjqt_xieyi: "谢衣", + gjqt_yanjiaxieyi: "偃甲谢衣", + gjqt_chuqi: "初七", - gjqt_beiluo:'北洛', - gjqt_yunwuyue:'云无月', - gjqt_cenying:'岑缨', + gjqt_beiluo: "北洛", + gjqt_yunwuyue: "云无月", + gjqt_cenying: "岑缨", - yunyou:'云游', - yunyou_info:'每两轮限一次,出牌阶段,你可以发现一张地图牌本局未使用过的地图牌并使用之。', - xuanzhen:'玄阵', + yunyou: "云游", + yunyou_info: "每两轮限一次,出牌阶段,你可以发现一张地图牌本局未使用过的地图牌并使用之。", + xuanzhen: "玄阵", // xuanzhen_bg:'阵', - xuanzhen_info:'每轮限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。', - qingshu:'青书', - qingshu_info:'结束阶段,你可以令一名角色永久获得一个你使用过且不是当前地图的地图牌效果(每个地图最多发动一次)。', - yanjiadan_heart:'偃甲蛋', - yanjiadan_heart_info:'可以当作紫阳丹、玉女元参或沙棠使用。', - yanjiadan_diamond:'偃甲蛋', - yanjiadan_diamond_info:'可以当作流风散、舒筋散或神火飞鸦使用。', - yanjiadan_club:'偃甲蛋', - yanjiadan_club_info:'可以当作天女散花、六骰格或锦里针使用。', - yanjiadan_spade:'偃甲蛋', - yanjiadan_spade_info:'可以当作飞镖、乾坤镖或龙须钩使用。', - lingyan:'灵偃', - lingyan_bg:'偃', - lingyan_info:'出牌阶段限一次,你可以将一张点数与武将牌上的牌均不同的手牌置于武将牌上,然后获得与其花色对应的一枚偃甲蛋。', - xunjian:'寻剑', - xunjian_info:'锁定技,每当你使用或打出一张牌,若牌堆中有同名牌,你有X的机率获得之,X为你的“灵偃”牌数/13。', - xunjian_old_info:'觉醒技,结束阶段,若你武将牌上有十三张牌,你失去技能灵偃并获得技能通天。', - tongtian:'通天', - tongtian_info:'锁定技,在你使用或打出一张牌后,若敌方角色手中有同名牌,你随机获得其中一张。', - xianju:'仙居', - xianju_info:'锁定技,奇数游戏轮次开始时,你获得潜行直到下一轮开始;偶数游戏轮次开始时,你随机获得一张机关牌。', - xuanci:'旋刺', - xuanci_info:'出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张杀。', - humeng:'湖梦', - humeng_sub:'偃甲谢衣', - humeng_info:'觉醒技,当你使用过4种不同的偃甲蛋后,你获得替身偃甲谢衣;觉醒技,当你进入濒死状态时,你弃置所有牌,摸四张牌,变身为初七并激活偃甲谢衣。', - yange:'魇歌', - yange_info:'游戏开始时,你获得数量等于敌方角色数的“魇”标记;准备阶段开始时,你可以移去一枚“魇”标记并变为一名其他存活角色的复制,此回合结束后你变回原角色。', - woxue:'卧雪', - woxue_info:'每当你于回合外使用或打出一张牌,你可以视为对当前回合角色使用【白霜】。', - lingnu:'灵怒', - lingnu_info:'锁定技,每当你造成1点伤害,你随机获得一个与杀相关的技能,技能在你行动3回合后消失(同一时间最多拥有3个以此法获得的技能)。', - zhenying:'振影', - zhenying_info:'每当你使用或打出一张非转化的黑色牌(装备或延时锦囊牌除外),你可以获得一张此牌的“替身”;你使用或打出“替身”牌后需弃置一张牌(没有则不弃);当前回合结束后,“替身”牌消失。', - cihong:'刺鸿', - cihong_bg:'鸿', - cihong_info:'每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀。', - lianjing:'莲境', - lianjing_info:'每两轮限一次,回合结束后,你可以选择至多2名其他角色,将其他角色移出游戏,然后你与所选的角色依次进行一个回合。', - zuiji:'醉饮', - zuiji_info:'出牌阶段,你可以将一张手牌或装备牌当作酒使用。', - manwu:'曼舞', - manwu_info:'在一名角色的结束阶段,若其手牌数为全场最少或之一,你可以令其摸一张牌。', - xfanghua:'芳华', - xfanghua_info:'在你成为红色牌的目标后,你可以回复1点体力。', - yunyin:'云音', - yunyin_info:'结束阶段,你可以弃置一张与本回合使用过的卡牌花色均不相同的手牌,视为使用一张基本牌或普通锦囊牌。', - shishui:'逝水', - shishui_info:'锁定技,每当你使用一张红色牌,你令目标失去1点体力。', - duhun:'渡魂', - duhun_info:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并与该角色交换体力值;若你没赢,你立即死亡。', - duhun_info_alter:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡。', - chizhen:'驰阵', - chizhen_info:'出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了杀,可以视为使用一张决斗(X为你已损失的体力值且至少为1)。', - xidie:'戏蝶', - xidie2:'戏蝶', - xidie_info:'准备阶段,若你的手牌数大于体力值,可以弃置至多X张牌,并于结束阶段摸等量的牌,X为你的体力值与手牌数之差且不超过3。', - meihu:'魅狐', - meihu2:'魅狐', - meihu_info:'当你受到伤害后,可令伤害来源交给你一张手牌。', - jianwu:'剑舞', - jianwu_info:'锁定技,攻击范围不含你的角色无法闪避你的杀。', - meiying:'魅影', - meiying_info:'一名其他角色的回合结束时,若其未于此回合内使用过指定另一名角色为目标的牌,你可以弃置一张红色牌视为对其使用一张杀。', - zuizhan:'乱斩', - zuizhan_info:'每当你使用一张杀,可以摸一张牌,然后此杀随机增加一个额外目标。', - xlqianhuan:'千幻', - xlqianhuan_info:'回合结束后,若你已受伤,你可以回复1点体力并将武将牌翻面。若你的武将牌背面朝上,你不能使用卡牌,也不能成为卡牌的目标。', - fumo:'伏魔', - fumo_info:'每当你受到一次伤害,可以弃置两张颜色相同的手牌并对伤害来源造成1点雷电伤害。', - fanyin:'梵音', - fanyin_info:'结束阶段,你可以令一名角色复原武将牌并移除判定区内的牌;若其体力值是全场最少的之一,其回复1点体力。', - mingkong:'明空', - mingkong_info:'锁定技,若你没有手牌,你受到的伤害-1,然后伤害来源摸一张牌。', - qinglan:'晴岚', - qinglan_info:'每当有一名角色即将受到属性伤害,你可以弃置一张牌令其防止此伤害,然后伤害来源摸一张牌并回复1点体力。', - yuehua:'月华', - yuehua_info:'每当你于回合外使用、打出或弃置红色牌,你可以摸一张牌。', - xuelu:'血戮', - xuelu_info:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害;若你已损失体力值不少于3,改为造成2点火焰伤害。', - xuelu_info_alter:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害。', - fanshi:'反噬', - fanshi_info:'锁定技,弃牌阶段结束时,若你本回合内造成过伤害,你失去1点体力并摸一张牌。', - shahun:'煞魂', - shahun2:'煞魂', - shahun_info:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡。', - shahun_info_alter:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡。', + xuanzhen_info: "每轮限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。", + qingshu: "青书", + qingshu_info: + "结束阶段,你可以令一名角色永久获得一个你使用过且不是当前地图的地图牌效果(每个地图最多发动一次)。", + yanjiadan_heart: "偃甲蛋", + yanjiadan_heart_info: "可以当作紫阳丹、玉女元参或沙棠使用。", + yanjiadan_diamond: "偃甲蛋", + yanjiadan_diamond_info: "可以当作流风散、舒筋散或神火飞鸦使用。", + yanjiadan_club: "偃甲蛋", + yanjiadan_club_info: "可以当作天女散花、六骰格或锦里针使用。", + yanjiadan_spade: "偃甲蛋", + yanjiadan_spade_info: "可以当作飞镖、乾坤镖或龙须钩使用。", + lingyan: "灵偃", + lingyan_bg: "偃", + lingyan_info: + "出牌阶段限一次,你可以将一张点数与武将牌上的牌均不同的手牌置于武将牌上,然后获得与其花色对应的一枚偃甲蛋。", + xunjian: "寻剑", + xunjian_info: + "锁定技,每当你使用或打出一张牌,若牌堆中有同名牌,你有X的机率获得之,X为你的“灵偃”牌数/13。", + xunjian_old_info: "觉醒技,结束阶段,若你武将牌上有十三张牌,你失去技能灵偃并获得技能通天。", + tongtian: "通天", + tongtian_info: "锁定技,在你使用或打出一张牌后,若敌方角色手中有同名牌,你随机获得其中一张。", + xianju: "仙居", + xianju_info: + "锁定技,奇数游戏轮次开始时,你获得潜行直到下一轮开始;偶数游戏轮次开始时,你随机获得一张机关牌。", + xuanci: "旋刺", + xuanci_info: + "出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张杀。", + humeng: "湖梦", + humeng_sub: "偃甲谢衣", + humeng_info: + "觉醒技,当你使用过4种不同的偃甲蛋后,你获得替身偃甲谢衣;觉醒技,当你进入濒死状态时,你弃置所有牌,摸四张牌,变身为初七并激活偃甲谢衣。", + yange: "魇歌", + yange_info: + "游戏开始时,你获得数量等于敌方角色数的“魇”标记;准备阶段开始时,你可以移去一枚“魇”标记并变为一名其他存活角色的复制,此回合结束后你变回原角色。", + woxue: "卧雪", + woxue_info: "每当你于回合外使用或打出一张牌,你可以视为对当前回合角色使用【白霜】。", + lingnu: "灵怒", + lingnu_info: + "锁定技,每当你造成1点伤害,你随机获得一个与杀相关的技能,技能在你行动3回合后消失(同一时间最多拥有3个以此法获得的技能)。", + zhenying: "振影", + zhenying_info: + "每当你使用或打出一张非转化的黑色牌(装备或延时锦囊牌除外),你可以获得一张此牌的“替身”;你使用或打出“替身”牌后需弃置一张牌(没有则不弃);当前回合结束后,“替身”牌消失。", + cihong: "刺鸿", + cihong_bg: "鸿", + cihong_info: + "每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀。", + lianjing: "莲境", + lianjing_info: + "每两轮限一次,回合结束后,你可以选择至多2名其他角色,将其他角色移出游戏,然后你与所选的角色依次进行一个回合。", + zuiji: "醉饮", + zuiji_info: "出牌阶段,你可以将一张手牌或装备牌当作酒使用。", + manwu: "曼舞", + manwu_info: "在一名角色的结束阶段,若其手牌数为全场最少或之一,你可以令其摸一张牌。", + xfanghua: "芳华", + xfanghua_info: "在你成为红色牌的目标后,你可以回复1点体力。", + yunyin: "云音", + yunyin_info: + "结束阶段,你可以弃置一张与本回合使用过的卡牌花色均不相同的手牌,视为使用一张基本牌或普通锦囊牌。", + shishui: "逝水", + shishui_info: "锁定技,每当你使用一张红色牌,你令目标失去1点体力。", + duhun: "渡魂", + duhun_info: + "濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并与该角色交换体力值;若你没赢,你立即死亡。", + duhun_info_alter: + "濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡。", + chizhen: "驰阵", + chizhen_info: + "出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了杀,可以视为使用一张决斗(X为你已损失的体力值且至少为1)。", + xidie: "戏蝶", + xidie2: "戏蝶", + xidie_info: + "准备阶段,若你的手牌数大于体力值,可以弃置至多X张牌,并于结束阶段摸等量的牌,X为你的体力值与手牌数之差且不超过3。", + meihu: "魅狐", + meihu2: "魅狐", + meihu_info: "当你受到伤害后,可令伤害来源交给你一张手牌。", + jianwu: "剑舞", + jianwu_info: "锁定技,攻击范围不含你的角色无法闪避你的杀。", + meiying: "魅影", + meiying_info: + "一名其他角色的回合结束时,若其未于此回合内使用过指定另一名角色为目标的牌,你可以弃置一张红色牌视为对其使用一张杀。", + zuizhan: "乱斩", + zuizhan_info: "每当你使用一张杀,可以摸一张牌,然后此杀随机增加一个额外目标。", + xlqianhuan: "千幻", + xlqianhuan_info: + "回合结束后,若你已受伤,你可以回复1点体力并将武将牌翻面。若你的武将牌背面朝上,你不能使用卡牌,也不能成为卡牌的目标。", + fumo: "伏魔", + fumo_info: "每当你受到一次伤害,可以弃置两张颜色相同的手牌并对伤害来源造成1点雷电伤害。", + fanyin: "梵音", + fanyin_info: + "结束阶段,你可以令一名角色复原武将牌并移除判定区内的牌;若其体力值是全场最少的之一,其回复1点体力。", + mingkong: "明空", + mingkong_info: "锁定技,若你没有手牌,你受到的伤害-1,然后伤害来源摸一张牌。", + qinglan: "晴岚", + qinglan_info: + "每当有一名角色即将受到属性伤害,你可以弃置一张牌令其防止此伤害,然后伤害来源摸一张牌并回复1点体力。", + yuehua: "月华", + yuehua_info: "每当你于回合外使用、打出或弃置红色牌,你可以摸一张牌。", + xuelu: "血戮", + xuelu_info: + "结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害;若你已损失体力值不少于3,改为造成2点火焰伤害。", + xuelu_info_alter: "结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害。", + fanshi: "反噬", + fanshi_info: "锁定技,弃牌阶段结束时,若你本回合内造成过伤害,你失去1点体力并摸一张牌。", + shahun: "煞魂", + shahun2: "煞魂", + shahun_info: + "限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡。", + shahun_info_alter: + "限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡。", - yanjia:'偃甲', - yanjia_info:'出牌阶段,你可以将两张非特殊装备牌合成为一张强化装备。', - xiuhua:'袖花', - xiuhua_info:'每当一件其他角色的装备因被替换或弃置进入弃牌堆,你可以获得之。', - liuying:'流影', - liuying_info:'每当你使用一张杀结算完毕后,你可以指定一名本回合未成为过你的杀的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张杀。', - boyun:'拨云', - boyun1:'拨云', - boyun2:'拨云', - boyun_info:'在你的回合内,你可以弃置一张装备牌,并展示牌堆顶的一张牌,若其为装备牌,你须将其交给任意一张角色并对其造成1点伤害,否则你摸一张牌。', - jizhan:'疾战', - jizhan_info:'出牌阶段限一次,你可以将移动到任意一名角色的前一位,视为对其使用了一张不计入出杀次数的杀。', - qianjun:'千军', - qianjun_info:'每当你使用一张杀,你可以弃置一张牌,令距离目标1以内的所有角色成为额外目标。', - xuanning:'玄凝', - xuanning1:'玄凝', - xuanning2:'玄凝', - liuguang:'流光', - yangming:'养命', - yangming2:'养命', - xuanning_info:'出牌阶段,你可以弃置一基本牌,获得至多3个玄凝标记。当你受到伤害时,你失去一枚玄凝标记,伤害来源随机弃置一张牌。', - liuguang_info:'准备阶段,若你有玄凝标记,你可以弃置一枚玄凝标记,选择至多三名角色依次令其选择一项:弃置一张牌,或受到1点伤害,并终止流光结算。', - yangming_info:'出牌阶段,你可以弃置一张红色牌,并在下个出牌阶段结束时令距离1以内的任意名角色回复1点体力,在此之前不可再次发动。', - zhaolu:'朝露', - jiehuo:'劫火', - yuling:'御灵', - yuling1:'御灵', - yuling2:'御灵', - yuling3:'御灵', - yuling4:'御灵', - zhaolu_info:'锁定技,每隔X回合,你失去1点体力上限,每当你受到1点伤害或有人死亡,视为减少两个回合,X为现存角色数且至多为5。', - jiehuo_info:'限定技,出牌阶段,你可以对一名其他角色造成2点火焰伤害,然后死亡。', - yuling_info:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+2张牌,X为你的体力上限。', - yuling_info_alter:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+1张牌,X为你的体力上限。', + yanjia: "偃甲", + yanjia_info: "出牌阶段,你可以将两张非特殊装备牌合成为一张强化装备。", + xiuhua: "袖花", + xiuhua_info: "每当一件其他角色的装备因被替换或弃置进入弃牌堆,你可以获得之。", + liuying: "流影", + liuying_info: + "每当你使用一张杀结算完毕后,你可以指定一名本回合未成为过你的杀的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张杀。", + boyun: "拨云", + boyun1: "拨云", + boyun2: "拨云", + boyun_info: + "在你的回合内,你可以弃置一张装备牌,并展示牌堆顶的一张牌,若其为装备牌,你须将其交给任意一张角色并对其造成1点伤害,否则你摸一张牌。", + jizhan: "疾战", + jizhan_info: + "出牌阶段限一次,你可以将移动到任意一名角色的前一位,视为对其使用了一张不计入出杀次数的杀。", + qianjun: "千军", + qianjun_info: "每当你使用一张杀,你可以弃置一张牌,令距离目标1以内的所有角色成为额外目标。", + xuanning: "玄凝", + xuanning1: "玄凝", + xuanning2: "玄凝", + liuguang: "流光", + yangming: "养命", + yangming2: "养命", + xuanning_info: + "出牌阶段,你可以弃置一基本牌,获得至多3个玄凝标记。当你受到伤害时,你失去一枚玄凝标记,伤害来源随机弃置一张牌。", + liuguang_info: + "准备阶段,若你有玄凝标记,你可以弃置一枚玄凝标记,选择至多三名角色依次令其选择一项:弃置一张牌,或受到1点伤害,并终止流光结算。", + yangming_info: + "出牌阶段,你可以弃置一张红色牌,并在下个出牌阶段结束时令距离1以内的任意名角色回复1点体力,在此之前不可再次发动。", + zhaolu: "朝露", + jiehuo: "劫火", + yuling: "御灵", + yuling1: "御灵", + yuling2: "御灵", + yuling3: "御灵", + yuling4: "御灵", + zhaolu_info: + "锁定技,每隔X回合,你失去1点体力上限,每当你受到1点伤害或有人死亡,视为减少两个回合,X为现存角色数且至多为5。", + jiehuo_info: "限定技,出牌阶段,你可以对一名其他角色造成2点火焰伤害,然后死亡。", + yuling_info: + "锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+2张牌,X为你的体力上限。", + yuling_info_alter: + "锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+1张牌,X为你的体力上限。", }, }; }); diff --git a/character/gwent.js b/character/gwent.js index 7f14182ad..87dfdd8bf 100644 --- a/character/gwent.js +++ b/character/gwent.js @@ -1,749 +1,818 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'gwent', - character:{ - gw_huoge:['male','qun',3,['gwjinli']], - gw_aisinie:['female','wu',3,['huihun']], - gw_enxier:['male','wei',4,['gwbaquan']], + name: "gwent", + character: { + gw_huoge: ["male", "qun", 3, ["gwjinli"]], + gw_aisinie: ["female", "wu", 3, ["huihun"]], + gw_enxier: ["male", "wei", 4, ["gwbaquan"]], - gw_kaerweite:['male','shu',4,['gwjiquan']], - gw_falanxisika:['female','wu',3,['shewu']], - gw_haluo:['male','qun',4,['nuhou']], + gw_kaerweite: ["male", "shu", 4, ["gwjiquan"]], + gw_falanxisika: ["female", "wu", 3, ["shewu"]], + gw_haluo: ["male", "qun", 4, ["nuhou"]], - gw_airuiting:['male','wei',4,['kuanglie']], - gw_laduoweide:['male','wei',4,['gwxiaoshou']], - gw_dagong:['male','qun',4,['gwtianbian']], + gw_airuiting: ["male", "wei", 4, ["kuanglie"]], + gw_laduoweide: ["male", "wei", 4, ["gwxiaoshou"]], + gw_dagong: ["male", "qun", 4, ["gwtianbian"]], - gw_bulanwang:['male','qun',4,['bolang']], - gw_kuite:['male','qun',4,['gwxuezhan']], - gw_fuertaisite:['male','wei',3,['zhengjun']], - gw_hengsaite:['male','wei',3,['jielue']], - gw_fulisi:['male','qun',3,['lanquan']], - gw_gaier:['male','shu',3,['hunmo']], + gw_bulanwang: ["male", "qun", 4, ["bolang"]], + gw_kuite: ["male", "qun", 4, ["gwxuezhan"]], + gw_fuertaisite: ["male", "wei", 3, ["zhengjun"]], + gw_hengsaite: ["male", "wei", 3, ["jielue"]], + gw_fulisi: ["male", "qun", 3, ["lanquan"]], + gw_gaier: ["male", "shu", 3, ["hunmo"]], - gw_jieluote:['male','qun',6,['fayin']], - gw_yenaifa:['female','qun',3,['xuezhou']], - gw_telisi:['female','wei',3,['huandie']], - gw_xili:['female','wu',3,['fengjian']], - gw_luoqi:['male','wei',4,['gwzhanjiang']], + gw_jieluote: ["male", "qun", 6, ["fayin"]], + gw_yenaifa: ["female", "qun", 3, ["xuezhou"]], + gw_telisi: ["female", "wei", 3, ["huandie"]], + gw_xili: ["female", "wu", 3, ["fengjian"]], + gw_luoqi: ["male", "wei", 4, ["gwzhanjiang"]], // gw_yioufeisi:['male','wu',4,['gwchuanxin']], - gw_aigeleisi:['female','wu',3,['gwshenyu']], - gw_aokeweisite:['male','qun',4,['yunhuo']], - gw_kaxier:['male','shu',4,['gwfengchi']], - gw_luobo:['male','qun',3,['junchi']], - gw_mieren:['male','shu',3,['lingji']], - gw_sanhanya:['male','shu',3,['gwjinyan']], - gw_shanhu:['female','qun',3,['shuijian']], - gw_zhangyujushou:['male','wu',4,['gwjushi']], - gw_zhuoertan:['male','wu',3,['hupeng']], + gw_aigeleisi: ["female", "wu", 3, ["gwshenyu"]], + gw_aokeweisite: ["male", "qun", 4, ["yunhuo"]], + gw_kaxier: ["male", "shu", 4, ["gwfengchi"]], + gw_luobo: ["male", "qun", 3, ["junchi"]], + gw_mieren: ["male", "shu", 3, ["lingji"]], + gw_sanhanya: ["male", "shu", 3, ["gwjinyan"]], + gw_shanhu: ["female", "qun", 3, ["shuijian"]], + gw_zhangyujushou: ["male", "wu", 4, ["gwjushi"]], + gw_zhuoertan: ["male", "wu", 3, ["hupeng"]], - gw_meizi:['female','wei',3,['gwjieyin']], - gw_aimin:['female','wu',3,['huanshu']], - gw_puxila:['female','qun',3,['gwqinwu']], + gw_meizi: ["female", "wei", 3, ["gwjieyin"]], + gw_aimin: ["female", "wu", 3, ["huanshu"]], + gw_puxila: ["female", "qun", 3, ["gwqinwu"]], - gw_xigedelifa:['female','qun',3,['gwfusheng']], - gw_laomaotou:['male','qun',4,['gwchenshui']], - gw_qigaiwang:['male','qun',4,['julian']], + gw_xigedelifa: ["female", "qun", 3, ["gwfusheng"]], + gw_laomaotou: ["male", "qun", 4, ["gwchenshui"]], + gw_qigaiwang: ["male", "qun", 4, ["julian"]], - gw_bierna:['female','qun',3,['gwfengshi']], - gw_haizhiyezhu:['male','qun',4,['yangfan']], - gw_nitelila:['male','wei',4,['shuangxi']], + gw_bierna: ["female", "qun", 3, ["gwfengshi"]], + gw_haizhiyezhu: ["male", "qun", 4, ["yangfan"]], + gw_nitelila: ["male", "wei", 4, ["shuangxi"]], - gw_linjing:['male','wu',4,['gwyewu']], - gw_kanbi:['male','qun',1,['gwfutian']], - gw_nvyemo:['female','shu',3,['gwgouhun']], + gw_linjing: ["male", "wu", 4, ["gwyewu"]], + gw_kanbi: ["male", "qun", 1, ["gwfutian"]], + gw_nvyemo: ["female", "shu", 3, ["gwgouhun"]], - gw_kairuisi:['female','qun',3,['gwweitu']], - gw_oudimu:['male','shu',3,['gwjingshi']], - gw_shasixiwusi:['male','qun',4,['gwjingtian']], + gw_kairuisi: ["female", "qun", 3, ["gwweitu"]], + gw_oudimu: ["male", "shu", 3, ["gwjingshi"]], + gw_shasixiwusi: ["male", "qun", 4, ["gwjingtian"]], - gw_yioufeisisp:['male','wu',3,['gwminxiang']], - gw_lanbote:['male','qun',4,['gwlangshi']], - gw_fenghuang:['male','shu',4,['gwliaotian']], - gw_diandian:['male','wu',3,['gwhuanbi']], - gw_yisilinni:['female','wu',3,['gwhuanshuang']], - gw_feilafanruide:['male','wei',3,['yinzhang']], + gw_yioufeisisp: ["male", "wu", 3, ["gwminxiang"]], + gw_lanbote: ["male", "qun", 4, ["gwlangshi"]], + gw_fenghuang: ["male", "shu", 4, ["gwliaotian"]], + gw_diandian: ["male", "wu", 3, ["gwhuanbi"]], + gw_yisilinni: ["female", "wu", 3, ["gwhuanshuang"]], + gw_feilafanruide: ["male", "wei", 3, ["yinzhang"]], - gw_saqiya:['female','shu',4,['sqlongwu']] + gw_saqiya: ["female", "shu", 4, ["sqlongwu"]], }, - characterIntro:{ - gw_huoge:'那个老年痴呆?不知道他是活着还是已经被制成标本了!', - gw_aisinie:'树精皇后有着熔银做成的眼睛,冰冷铸钢的心脏。', - gw_gaier:'画作应该要传达情绪,而不是字句。', - gw_enxier:'我可没什么耐心,最好小心点,否则脑袋不保', + characterIntro: { + gw_huoge: "那个老年痴呆?不知道他是活着还是已经被制成标本了!", + gw_aisinie: "树精皇后有着熔银做成的眼睛,冰冷铸钢的心脏。", + gw_gaier: "画作应该要传达情绪,而不是字句。", + gw_enxier: "我可没什么耐心,最好小心点,否则脑袋不保", - gw_yenaifa:'魔法是艺术、混沌与科学的结合。因为魔法的确是一门技艺也是一种诅咒。', - gw_telisi:'我可以照顾我自己,相信我。', - gw_jieluote:'如果要付出这种代价才能拯救世界,那最好还是让世界消逝吧。', - gw_xili:'我想去哪,就去哪。', - gw_luoqi:'是个爱国者…还是个货真价实的王八蛋。', - gw_yioufeisi:'国王还是乞丐,两者有何区别,人类少一个算一个', + gw_yenaifa: "魔法是艺术、混沌与科学的结合。因为魔法的确是一门技艺也是一种诅咒。", + gw_telisi: "我可以照顾我自己,相信我。", + gw_jieluote: "如果要付出这种代价才能拯救世界,那最好还是让世界消逝吧。", + gw_xili: "我想去哪,就去哪。", + gw_luoqi: "是个爱国者…还是个货真价实的王八蛋。", + gw_yioufeisi: "国王还是乞丐,两者有何区别,人类少一个算一个", }, /** @type { importCharacterConfig['skill'] } */ - skill:{ - sqlongyin:{ - trigger:{player:'phaseBeginStart'}, - forced:true, - check(){ + skill: { + sqlongyin: { + trigger: { player: "phaseBeginStart" }, + forced: true, + check() { return false; }, - init(player){ - player.storage.sqlongyin='sqlongwu'; + init(player) { + player.storage.sqlongyin = "sqlongwu"; }, - content(){ - var list=['sqlongnu','sqlonghuo','sqlongwu']; - var map={ - sqlongwu:'gw_saqiya', - sqlongnu:'gw_saqiya1', - sqlonghuo:'gw_saqiya2' - } + content() { + var list = ["sqlongnu", "sqlonghuo", "sqlongwu"]; + var map = { + sqlongwu: "gw_saqiya", + sqlongnu: "gw_saqiya1", + sqlonghuo: "gw_saqiya2", + }; list.remove(player.storage.sqlongyin); - if(list.length==2){ - var name=list.randomGet(); + if (list.length == 2) { + var name = list.randomGet(); player.removeSkill(player.storage.sqlongyin); player.addSkill(name); - player.storage.sqlongyin=name; - player.setAvatar('gw_saqiya',map[name]); + player.storage.sqlongyin = name; + player.setAvatar("gw_saqiya", map[name]); } - } + }, }, - sqlongnu:{ - group:'sqlongyin', - trigger:{player:'phaseBegin'}, - frequent:true, - content(){ - 'step 0' - player.discoverCard(ui.cardPile.childNodes,function(button){ - var card=button.link; - var player=_status.event.player; - var value=get.value(card,player); - if(player.countCards('h',card.name)){ - value=Math.max(value,9); - } - return value; - },'nogain'); - 'step 1' - if(player.countCards('h',function(card){ - return card!=result.card&&card.name==result.card.name; - })){ - event.current=result.card; - player.chooseTarget('是否改为对一名角色造成1点火属性伤害?').set('ai',function(target){ - return get.damageEffect(target,null,player,player,'fire'); - }); - } - else{ - player.gain(result.card,'draw'); + sqlongnu: { + group: "sqlongyin", + trigger: { player: "phaseBegin" }, + frequent: true, + content() { + "step 0"; + player.discoverCard( + ui.cardPile.childNodes, + function (button) { + var card = button.link; + var player = _status.event.player; + var value = get.value(card, player); + if (player.countCards("h", card.name)) { + value = Math.max(value, 9); + } + return value; + }, + "nogain" + ); + ("step 1"); + if ( + player.countCards("h", function (card) { + return card != result.card && card.name == result.card.name; + }) + ) { + event.current = result.card; + player + .chooseTarget("是否改为对一名角色造成1点火属性伤害?") + .set("ai", function (target) { + return get.damageEffect(target, null, player, player, "fire"); + }); + } else { + player.gain(result.card, "draw"); event.finish(); } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - target.damage('fire','nocard'); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + target.damage("fire", "nocard"); // player.discoverCard(ui.cardPile.childNodes); - } - else{ - player.gain(event.current,'draw'); + } else { + player.gain(event.current, "draw"); } }, }, - sqlonghuo:{ - group:'sqlongyin', - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h')>0; + sqlonghuo: { + group: "sqlongyin", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; }, - delay:false, - content(){ - 'step 0' - var hs=player.getCards('h'); - player.discard(hs).set('delay',false); - event.hs=hs; - 'step 1' + delay: false, + content() { + "step 0"; + var hs = player.getCards("h"); + player.discard(hs).set("delay", false); + event.hs = hs; + ("step 1"); player.draw(event.hs.length); - 'step 2' - var enemies=player.getEnemies(); - for(var i=0;i0; + ai: { + order: 5, + result: { + player: 1, + }, }, - content(){ - 'step 0' - var max=1; - var map={}; - var hs=player.getCards('h'); - for(var i=0;i 0; + }, + content() { + "step 0"; + var max = 1; + var map = {}; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + var name = hs[i].name; + if (!map[name]) { + map[name] = 1; + } else { map[name]++; - if(map[name]>max){ - max=map[name]; + if (map[name] > max) { + max = map[name]; } } } player.draw(max); - 'step 1' + ("step 1"); player.chooseToUse(); - } + }, }, - jielue:{ - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - var list=player.getFriends(); - for(var i=0;i0; + var rand = get.rand(); + var aozu = game.hasPlayer(function (current) { + return ( + player.canUse("gw_aozuzhilei", current) && + current.hp <= 3 && + get.effect(current, { name: "gw_aozuzhilei" }, player, player) > 0 + ); }); - var aozu2=game.hasPlayer(function(current){ - return player.canUse('gw_aozuzhilei',current)&¤t.hp<=2&&get.effect(current,{name:'gw_aozuzhilei'},player,player)>0; + var aozu2 = game.hasPlayer(function (current) { + return ( + player.canUse("gw_aozuzhilei", current) && + current.hp <= 2 && + get.effect(current, { name: "gw_aozuzhilei" }, player, player) > 0 + ); }); - var aozu3=game.hasPlayer(function(current){ - return player.canUse('gw_aozuzhilei',current)&&get.effect(current,{name:'gw_aozuzhilei'},player,player)>0; + var aozu3 = game.hasPlayer(function (current) { + return ( + player.canUse("gw_aozuzhilei", current) && + get.effect(current, { name: "gw_aozuzhilei" }, player, player) > 0 + ); }); - var baoxue=game.hasPlayer(function(current){ - return player.canUse('gw_baoxueyaoshui',current)&&get.attitude(player,current)<0&&[2,3].includes(current.countCards('h'))&&!current.hasSkillTag('noh'); + var baoxue = game.hasPlayer(function (current) { + return ( + player.canUse("gw_baoxueyaoshui", current) && + get.attitude(player, current) < 0 && + [2, 3].includes(current.countCards("h")) && + !current.hasSkillTag("noh") + ); }); - var baoxue2=game.hasPlayer(function(current){ - return player.canUse('gw_baoxueyaoshui',current)&&get.attitude(player,current)<0&&[2].includes(current.countCards('h'))&&!current.hasSkillTag('noh'); + var baoxue2 = game.hasPlayer(function (current) { + return ( + player.canUse("gw_baoxueyaoshui", current) && + get.attitude(player, current) < 0 && + [2].includes(current.countCards("h")) && + !current.hasSkillTag("noh") + ); }); - var baoxue3=game.hasPlayer(function(current){ - return player.canUse('gw_baoxueyaoshui',current)&&get.attitude(player,current)<0&¤t.countCards('h')>=2&&!current.hasSkillTag('noh'); + var baoxue3 = game.hasPlayer(function (current) { + return ( + player.canUse("gw_baoxueyaoshui", current) && + get.attitude(player, current) < 0 && + current.countCards("h") >= 2 && + !current.hasSkillTag("noh") + ); }); - var nongwu=game.hasPlayer(function(current){ - return get.attitude(player,current)<0&&(get.attitude(player,current.getNext())<0||get.attitude(player,current.getPrevious())<0); + var nongwu = game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + (get.attitude(player, current.getNext()) < 0 || + get.attitude(player, current.getPrevious()) < 0) + ); }); - var nongwu2=game.hasPlayer(function(current){ - return get.attitude(player,current)<0&&get.attitude(player,current.getNext())<0&&get.attitude(player,current.getPrevious())<0; + var nongwu2 = game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + get.attitude(player, current.getNext()) < 0 && + get.attitude(player, current.getPrevious()) < 0 + ); }); - var yanzi=game.hasPlayer(function(current){ - return get.attitude(player,current)>0&¤t.isMinHandcard(); + var yanzi = game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && current.isMinHandcard(); }); - player.chooseVCardButton(get.prompt('gwhuanshuang'),list.randomGets(3),'notype').ai=function(button){ - var name=button.link[2]; - switch(name){ - case 'gw_ciguhanshuang': - if(nongwu2) return 3; - if(nongwu) return 1; - return 0; - case 'gw_baoxueyaoshui': - if(baoxue2) return 2; - if(baoxue) return 1.5; - if(baoxue3) return 0.5; - return 0; - case 'gw_aozuzhilei': - if(aozu2) return 2.5; - if(aozu) return 1.2; - if(aozu3) return 0.2; - return 0; - case 'gw_yanziyaoshui': - if(yanzi) return 2; - return 0.6; - } - if(game.hasPlayer(function(current){ - return player.canUse(name,current)&&get.effect(current,{name:name},player,player)>0; - })){ - return Math.random(); - } - return 0; - }; - 'step 1' - if(result.bool){ - player.logSkill('gwhuanshuang'); - event.cardname=result.links[0][2]; - player.chooseUseTarget(true,event.cardname); - player.addTempSkill('gwhuanshuang_disable'); + player.chooseVCardButton(get.prompt("gwhuanshuang"), list.randomGets(3), "notype").ai = + function (button) { + var name = button.link[2]; + switch (name) { + case "gw_ciguhanshuang": + if (nongwu2) return 3; + if (nongwu) return 1; + return 0; + case "gw_baoxueyaoshui": + if (baoxue2) return 2; + if (baoxue) return 1.5; + if (baoxue3) return 0.5; + return 0; + case "gw_aozuzhilei": + if (aozu2) return 2.5; + if (aozu) return 1.2; + if (aozu3) return 0.2; + return 0; + case "gw_yanziyaoshui": + if (yanzi) return 2; + return 0.6; + } + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(name, current) && + get.effect(current, { name: name }, player, player) > 0 + ); + }) + ) { + return Math.random(); + } + return 0; + }; + ("step 1"); + if (result.bool) { + player.logSkill("gwhuanshuang"); + event.cardname = result.links[0][2]; + player.chooseUseTarget(true, event.cardname); + player.addTempSkill("gwhuanshuang_disable"); } - 'step 2' - if(event.cardname&&player.hasUseTarget(event.cardname)){ - player.chooseUseTarget(true,event.cardname); + ("step 2"); + if (event.cardname && player.hasUseTarget(event.cardname)) { + player.chooseUseTarget(true, event.cardname); } }, - ai:{ - threaten:1.6 + ai: { + threaten: 1.6, + }, + subSkill: { + disable: {}, }, - subSkill:{ - disable:{} - } }, - gw_xianzumaijiu:{ - trigger:{source:'damageEnd'}, - filter(event){ - return (event.card&&(event.card.name=='sha')); + gw_xianzumaijiu: { + trigger: { source: "damageEnd" }, + filter(event) { + return event.card && event.card.name == "sha"; }, - forced:true, - temp:true, - vanish:true, - onremove(player){ - if(player.node.jiu){ + forced: true, + temp: true, + vanish: true, + onremove(player) { + if (player.node.jiu) { player.node.jiu.delete(); player.node.jiu2.delete(); delete player.node.jiu; delete player.node.jiu2; } }, - content(){ - var list=player.getFriends(); + content() { + var list = player.getFriends(); list.add(player); game.asyncDraw(list); - player.removeSkill('gw_xianzumaijiu'); + player.removeSkill("gw_xianzumaijiu"); + }, + ai: { + damageBonus: true, }, - ai:{ - damageBonus:true - } }, - gwjinli:{ - enable:'phaseUse', - usable:1, - filterCard:true, - filterTarget(card,player,target){ - return !target.hasSkill('gwjinli_jiu'); + gwjinli: { + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget(card, player, target) { + return !target.hasSkill("gwjinli_jiu"); }, - check(card){ - return 8-get.value(card); + check(card) { + return 8 - get.value(card); }, - content(){ - target.addSkill('gwjinli_jiu'); + content() { + target.addSkill("gwjinli_jiu"); }, - subSkill:{ - jiu:{ - init(player){ - player.storage.gwjinli_jiu=2; + subSkill: { + jiu: { + init(player) { + player.storage.gwjinli_jiu = 2; }, - onremove:true, - mark:'image', - intro:{ - content:'结束阶段,随机获得一个正面效果;&个回合后将先祖麦酒收入手牌' + onremove: true, + mark: "image", + intro: { + content: "结束阶段,随机获得一个正面效果;&个回合后将先祖麦酒收入手牌", }, - trigger:{player:'phaseEnd'}, - forced:true, - content(){ - 'step 0' + trigger: { player: "phaseEnd" }, + forced: true, + content() { + "step 0"; player.getBuff(); - 'step 1' + ("step 1"); player.storage.gwjinli_jiu--; - if(player.storage.gwjinli_jiu<=0){ - player.removeSkill('gwjinli_jiu'); - player.gain(game.createCard('gw_xianzumaijiu'),'gain2'); + if (player.storage.gwjinli_jiu <= 0) { + player.removeSkill("gwjinli_jiu"); + player.gain(game.createCard("gw_xianzumaijiu"), "gain2"); + } else { + player.updateMark("gwjinli_jiu", true); } - else{ - player.updateMark('gwjinli_jiu',true); - } - } - } + }, + }, + }, + ai: { + threaten: 1.5, + order: 2, + result: { + target(player, target) { + return 1 / (1 + target.hp) / Math.sqrt(1 + target.countCards("h")); + }, + }, }, - ai:{ - threaten:1.5, - order:2, - result:{ - target(player,target){ - return 1/(1+target.hp)/Math.sqrt(1+target.countCards('h')); - } - } - } }, - gwliaotian:{ - enable:'phaseUse', - delay:0, - usable:2, - filter(event,player){ - var hs=player.getCards('h'); - if(hs.length<2) return false; - var color=get.color(hs[0]); - for(var i=1;i0){ - return 11-get.value(card); - } - return 7-get.value(card); - }).set('promptx',[event.card]); - } - else{ + if (list.length) { + event.target = list.randomGet(); + event.target + .chooseCard( + "h", + "是否交给" + get.translation(event.player) + "一张手牌并获得冒险牌?" + ) + .set("ai", function (card) { + if (get.attitude(event.target, player) > 0) { + return 11 - get.value(card); + } + return 7 - get.value(card); + }) + .set("promptx", [event.card]); + } else { event.finish(); } - 'step 3' - if(result.bool){ - event.target.line(player,'green'); - event.target.give(result.cards,player); - event.target.gain(game.createCard(event.card),'gain2'); + ("step 3"); + if (result.bool) { + event.target.line(player, "green"); + event.target.give(result.cards, player); + event.target.gain(game.createCard(event.card), "gain2"); } }, - ai:{ - order:8, - result:{ - player:1 - } - } + ai: { + order: 8, + result: { + player: 1, + }, + }, }, - gwmaoxian_old:{ - trigger:{global:'gameStart',player:['enterGame','phaseBefore']}, - forced:true, - filter(event,player){ + gwmaoxian_old: { + trigger: { global: "gameStart", player: ["enterGame", "phaseBefore"] }, + forced: true, + filter(event, player) { return !player.storage.gwmaoxian; }, - content(){ - player.storage.gwmaoxian=10; - player.storage.gwmaoxian_skill=[]; - event.insert(lib.skill.gwmaoxian.learn,{player:player}); + content() { + player.storage.gwmaoxian = 10; + player.storage.gwmaoxian_skill = []; + event.insert(lib.skill.gwmaoxian.learn, { player: player }); }, - learn(){ - var list={ - draw:{ - bronze:[1,'准备阶段,你获得一张随机铜卡法术'], - basic:[1,'准备阶段,你从牌堆中获得一张杀'], - silver:[2,'结束阶段,你获得一张随机银卡法术'], - trick:[3,'结束阶段,你发现一张普通锦囊牌'], - gold:[3,'出牌阶段开始时,你获得一张随机金卡法术'], - equip:[3,'出牌阶段开始时,你在装备区内的空余位置装备一件随机装备'], + learn() { + var list = { + draw: { + bronze: [1, "准备阶段,你获得一张随机铜卡法术"], + basic: [1, "准备阶段,你从牌堆中获得一张杀"], + silver: [2, "结束阶段,你获得一张随机银卡法术"], + trick: [3, "结束阶段,你发现一张普通锦囊牌"], + gold: [3, "出牌阶段开始时,你获得一张随机金卡法术"], + equip: [3, "出牌阶段开始时,你在装备区内的空余位置装备一件随机装备"], }, - attack:{ - sha:[1,'你可以将一张手牌当作杀使用'], - huogong:[1,'你可以将一张手牌当作火攻使用'], - aoe:[2,'出牌阶段限一次,你可以弃置两张牌,视为使用一张南蛮入侵'], - shas:[2,'每当你使用一张杀,你可以追加一名无视距离的目标'], + attack: { + sha: [1, "你可以将一张手牌当作杀使用"], + huogong: [1, "你可以将一张手牌当作火攻使用"], + aoe: [2, "出牌阶段限一次,你可以弃置两张牌,视为使用一张南蛮入侵"], + shas: [2, "每当你使用一张杀,你可以追加一名无视距离的目标"], }, - defend:{ - }, - assist:{ - }, - control:{ - } - } - } + defend: {}, + assist: {}, + control: {}, + }; + }, }, - gwminxiang_old:{ - group:['gwminxiang_count','gwminxiang_clear','gwminxiang_use'], - subSkill:{ - count:{ - trigger:{player:'phaseBegin'}, - silent:true, - content(){ - player.storage.gwminxiang=[]; - } + gwminxiang_old: { + group: ["gwminxiang_count", "gwminxiang_clear", "gwminxiang_use"], + subSkill: { + count: { + trigger: { player: "phaseBegin" }, + silent: true, + content() { + player.storage.gwminxiang = []; + }, }, - clear:{ - trigger:{player:'phaseAfter'}, - silent:true, - content(){ + clear: { + trigger: { player: "phaseAfter" }, + silent: true, + content() { delete player.storage.gwminxiang; - } + }, }, - use:{ - trigger:{player:'useCardAfter'}, - silent:true, - filter(event,player){ - if(_status.currentPhase!=player) return false; - var type=get.type(event.card); - if(type!='trick'&&type!='basic') return false; - if(get.info(event.card).multitarget) return false; - if(!player.storage.gwminxiang) return false; + use: { + trigger: { player: "useCardAfter" }, + silent: true, + filter(event, player) { + if (_status.currentPhase != player) return false; + var type = get.type(event.card); + if (type != "trick" && type != "basic") return false; + if (get.info(event.card).multitarget) return false; + if (!player.storage.gwminxiang) return false; return true; }, - content(){ + content() { player.storage.gwminxiang.add(trigger.card); - } - } + }, + }, }, - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - if(player.storage.gwminxiang){ - for(var i=0;i1){ + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + if (player.storage.gwminxiang) { + for (var i = 0; i < player.storage.gwminxiang.length; i++) { + var card = player.storage.gwminxiang[i]; + if ( + game.countPlayer(function (current) { + return ( + current != player && lib.filter.targetEnabled3(card, player, current) + ); + }) > 1 + ) { return true; } } } return false; }, - content(){ - 'step 0' - var list=[]; - for(var i=0;i1){ + content() { + "step 0"; + var list = []; + for (var i = 0; i < player.storage.gwminxiang.length; i++) { + var card = player.storage.gwminxiang[i]; + if ( + game.countPlayer(function (current) { + return current != player && lib.filter.targetEnabled3(card, player, current); + }) > 1 + ) { list.push(card); } } - var skip=['shunshou','huogong','shandianjian','jiu']; - player.chooseCardButton(get.prompt('gwminxiang'),list).set('ai',function(button){ - if(skip.includes(button.link.name)) return 0; - var val=get.value(button.link); - if(get.tag(button.link,'damage')){ - val+=3; + var skip = ["shunshou", "huogong", "shandianjian", "jiu"]; + player.chooseCardButton(get.prompt("gwminxiang"), list).set("ai", function (button) { + if (skip.includes(button.link.name)) return 0; + var val = get.value(button.link); + if (get.tag(button.link, "damage")) { + val += 3; } return val; }); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget('选择两个目标互相使用'+get.translation(event.card),2,function(cardx,player,target){ - return target!=player&&lib.filter.targetEnabled3(card,player,target); - }).set('ai',function(target){ - if(ui.selected.targets.length){ - return get.effect(target,card,ui.selected.targets[0],player); - } - return get.effect(target,card,target,player); - }).set('targetprompt',['先出牌','后出牌']); - } - else{ + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget( + "选择两个目标互相使用" + get.translation(event.card), + 2, + function (cardx, player, target) { + return ( + target != player && lib.filter.targetEnabled3(card, player, target) + ); + } + ) + .set("ai", function (target) { + if (ui.selected.targets.length) { + return get.effect(target, card, ui.selected.targets[0], player); + } + return get.effect(target, card, target, player); + }) + .set("targetprompt", ["先出牌", "后出牌"]); + } else { event.finish(); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.$throw(event.card); - player.logSkill('gwminxiang',result.targets); - event.target1=result.targets[0]; - event.target2=result.targets[1]; + player.logSkill("gwminxiang", result.targets); + event.target1 = result.targets[0]; + event.target2 = result.targets[1]; game.delay(); - } - else{ + } else { event.finish(); } - 'step 3' - event.target1.useCard(event.card,event.target2,'noai'); - 'step 4' - if(event.target1.isIn()&&event.target2.isIn()){ - event.target2.useCard(event.card,event.target1,'noai'); + ("step 3"); + event.target1.useCard(event.card, event.target2, "noai"); + ("step 4"); + if (event.target1.isIn() && event.target2.isIn()) { + event.target2.useCard(event.card, event.target1, "noai"); } }, - ai:{ - expose:0.4, - threaten:1.6 - } + ai: { + expose: 0.4, + threaten: 1.6, + }, }, - gwminxiang:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - var hs=player.getCards('h'); - var names=[]; - for(var i=0;i1){ + for (var i = 0; i < names.length; i++) { + if ( + game.countPlayer(function (current) { + return ( + current != player && + lib.filter.targetEnabled3({ name: names[i] }, player, current) + ); + }) > 1 + ) { return true; } } return false; }, - check(card){ - if(['shunshou','huogong','shandianjian','jiu','tianxianjiu'].includes(card.name)) return 0; - if(get.tag(card,'damage')){ - return get.value(card)+2; + check(card) { + if (["shunshou", "huogong", "shandianjian", "jiu", "tianxianjiu"].includes(card.name)) + return 0; + if (get.tag(card, "damage")) { + return get.value(card) + 2; } return get.value(card); }, - filterCard(card,player){ - if(!['basic','trick'].includes(get.type(card))) return false; - return game.countPlayer(function(current){ - return current!=player&&lib.filter.targetEnabled3({name:card.name},player,current); - })>1; + filterCard(card, player) { + if (!["basic", "trick"].includes(get.type(card))) return false; + return ( + game.countPlayer(function (current) { + return ( + current != player && + lib.filter.targetEnabled3({ name: card.name }, player, current) + ); + }) > 1 + ); }, - filterTarget(card,player,target){ - if(player==target||!ui.selected.cards.length) return false; - return lib.filter.targetEnabled3({name:ui.selected.cards[0].name},player,target); + filterTarget(card, player, target) { + if (player == target || !ui.selected.cards.length) return false; + return lib.filter.targetEnabled3({ name: ui.selected.cards[0].name }, player, target); }, - targetprompt:['先出牌','后出牌'], - selectTarget:2, - multitarget:true, - delay:0, - content(){ - 'step 0' + targetprompt: ["先出牌", "后出牌"], + selectTarget: 2, + multitarget: true, + delay: 0, + content() { + "step 0"; player.draw(); - 'step 1' - targets[0].useCard({name:cards[0].name},targets[1],'noai'); - 'step 2' - if(targets[0].isIn()&&targets[1].isIn()){ - targets[1].useCard({name:cards[0].name},targets[0],'noai'); + ("step 1"); + targets[0].useCard({ name: cards[0].name }, targets[1], "noai"); + ("step 2"); + if (targets[0].isIn() && targets[1].isIn()) { + targets[1].useCard({ name: cards[0].name }, targets[0], "noai"); } }, // group:'gwminxiang_draw', - multiline:true, + multiline: true, // subSkill:{ // draw:{ // trigger:{global:'damageAfter'}, @@ -757,52 +826,56 @@ game.import('character', function () { // } // } // }, - ai:{ - order:8, - result:{ - target(player,target){ - if(!ui.selected.cards.length) return 0; - return get.effect(target,{name:ui.selected.cards[0].name},target,target); - } + ai: { + order: 8, + result: { + target(player, target) { + if (!ui.selected.cards.length) return 0; + return get.effect(target, { name: ui.selected.cards[0].name }, target, target); + }, }, - expose:0.4, - threaten:1.6, - } + expose: 0.4, + threaten: 1.6, + }, }, - gwlangshi:{ - trigger:{source:'damageEnd'}, - direct:true, - filter(event,player){ - if(event.parent.name=='gwlangshi') return false; - return game.hasPlayer(function(current){ - return current!=event.player&¤t!=player&¤t.hp>=event.player.hp; + gwlangshi: { + trigger: { source: "damageEnd" }, + direct: true, + filter(event, player) { + if (event.parent.name == "gwlangshi") return false; + return game.hasPlayer(function (current) { + return current != event.player && current != player && current.hp >= event.player.hp; }); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('gwlangshi'),function(card,player,target){ - return target!=trigger.player&&target!=player&&target.hp>=trigger.player.hp; - }).set('ai',function(target){ - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - player.logSkill('gwlangshi',result.targets); + content() { + "step 0"; + player + .chooseTarget(get.prompt2("gwlangshi"), function (card, player, target) { + return ( + target != trigger.player && target != player && target.hp >= trigger.player.hp + ); + }) + .set("ai", function (target) { + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("gwlangshi", result.targets); result.targets[0].damage(player); } }, - ai:{ - threaten:1.5 - } + ai: { + threaten: 1.5, + }, }, - gwjingtian:{ - clickable(player){ - player.addTempSkill('gwjingtian2'); + gwjingtian: { + clickable(player) { + player.addTempSkill("gwjingtian2"); player.directgain(get.cards()); player.$draw(); player.storage.gwjingtian--; - player.updateMark('gwjingtian',true); - player.logSkill('gwjingtian'); + player.updateMark("gwjingtian", true); + player.logSkill("gwjingtian"); if (_status.imchoosing) { delete _status.event._buttonChoice; delete _status.event._cardChoice; @@ -810,511 +883,518 @@ game.import('character', function () { game.check(); } }, - clickableFilter(player){ - return player.storage.gwjingtian>0&&!player.hasSkill('gwjingtian2'); + clickableFilter(player) { + return player.storage.gwjingtian > 0 && !player.hasSkill("gwjingtian2"); }, - init(player){ - player.storage.gwjingtian=0; + init(player) { + player.storage.gwjingtian = 0; }, - trigger:{player:'phaseDrawBefore'}, - forced:true, - content(){ + trigger: { player: "phaseDrawBefore" }, + forced: true, + content() { trigger.cancel(); - player.storage.gwjingtian+=3; - player.updateMark('gwjingtian',true); + player.storage.gwjingtian += 3; + player.updateMark("gwjingtian", true); }, - group:'gwjingtian_ai', - mark:true, - intro:{ - mark(dialog,content,player){ - if(player.isUnderControl(true)){ - if(_status.gameStarted&&player.storage.gwjingtian>0&&!player.hasSkill('gwjingtian2')){ - dialog.add(ui.create.div('.menubutton.pointerdiv','点击发动',function(){ - if(!this.disabled){ - this.disabled=true; - this.classList.add('disabled'); - this.style.opacity=0.5; - lib.skill.gwjingtian.clickable(player); - } - })); + group: "gwjingtian_ai", + mark: true, + intro: { + mark(dialog, content, player) { + if (player.isUnderControl(true)) { + if ( + _status.gameStarted && + player.storage.gwjingtian > 0 && + !player.hasSkill("gwjingtian2") + ) { + dialog.add( + ui.create.div(".menubutton.pointerdiv", "点击发动", function () { + if (!this.disabled) { + this.disabled = true; + this.classList.add("disabled"); + this.style.opacity = 0.5; + lib.skill.gwjingtian.clickable(player); + } + }) + ); } - var list=[]; - var num=Math.min(9,ui.cardPile.childElementCount); - for(var i=0;i0&&!player.hasSkill('gwjingtian2'); + subSkill: { + ai: { + trigger: { global: "drawAfter" }, + filter(event, player) { + return ( + (_status.auto || !player.isUnderControl(true)) && + player.storage.gwjingtian > 0 && + !player.hasSkill("gwjingtian2") + ); }, - popup:false, - check(event,player){ - var value=0,card=ui.cardPile.firstChild; - if(card){ - value=get.value(card); + popup: false, + check(event, player) { + var value = 0, + card = ui.cardPile.firstChild; + if (card) { + value = get.value(card); } - if(value>=6) return true; - if(value>=5&&get.type(card)!='equip'&&player.storage.gwjingtian>=3) return true; - if(player.storage.gwjingtian>3&&value>3) return true; + if (value >= 6) return true; + if (value >= 5 && get.type(card) != "equip" && player.storage.gwjingtian >= 3) + return true; + if (player.storage.gwjingtian > 3 && value > 3) return true; return false; }, - content(){ + content() { lib.skill.gwjingtian.clickable(player); - } - } - } + }, + }, + }, }, - gwjingtian2:{}, - gwjingshi:{ - enable:'phaseUse', - usable:1, + gwjingtian2: {}, + gwjingshi: { + enable: "phaseUse", + usable: 1, //direct:true, //delay:0, - filter(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('h'); - }) + filter(event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h"); + }); }, - content(){ - 'step 0' - var targets=game.filterPlayer(function(current){ - return current.countCards('h'); + content() { + "step 0"; + var targets = game.filterPlayer(function (current) { + return current.countCards("h"); }); - var num=targets.length; - for(var i=0;i0) return -1; + player.chooseButton(dialog, true).set("ai", function (button) { + if (get.attitude(player, get.owner(button.link)) > 0) return -1; return get.value(button.link); }); - } - else{ - player.popup('失败'); - game.log(player,'发动','【血契】','失败'); + } else { + player.popup("失败"); + game.log(player, "发动", "【血契】", "失败"); event.finish(); } - 'step 2' - if(result.bool&&result.links&&result.links.length){ - var owner=get.owner(result.links[0]); - if(owner){ - owner.give(result.links,player); + ("step 2"); + if (result.bool && result.links && result.links.length) { + var owner = get.owner(result.links[0]); + if (owner) { + owner.give(result.links, player); player.line(owner); - } - else{ - player.gain(result.links,'gain2'); + } else { + player.gain(result.links, "gain2"); } } }, - ai:{ - order:10, - result:{ - player:10 - } - } + ai: { + order: 10, + result: { + player: 10, + }, + }, }, - gwweitu:{ - trigger:{player:'discardAfter'}, - forced:true, - filter(event,player){ - return player.hujia<3; + gwweitu: { + trigger: { player: "discardAfter" }, + forced: true, + filter(event, player) { + return player.hujia < 3; }, - content(){ + content() { player.changeHujia(); // var num=Math.min(trigger.cards.length,3-player.hujia); // if(num>0){ // player.changeHujia(); // } }, - init(player){ - player.storage.gwweitu=0; + init(player) { + player.storage.gwweitu = 0; }, - intro:{ - content:'护甲自上次计算起已抵挡#点伤害' + intro: { + content: "护甲自上次计算起已抵挡#点伤害", }, - group:'gwweitu_gain', - subSkill:{ - gain:{ - trigger: {player: 'changeHujiaAfter'}, + group: "gwweitu_gain", + subSkill: { + gain: { + trigger: { player: "changeHujiaAfter" }, filter: (event) => event.num < 0, - forced:true, - content(){ + forced: true, + content() { player.storage.gwweitu++; - if(player.storage.gwweitu>=3){ - player.storage.gwweitu-=3; - player.unmarkSkill('gwweitu'); - var list=get.typeCard('spell_silver'); - if(list.length){ - player.gain(game.createCard(list.randomGet()),'draw'); + if (player.storage.gwweitu >= 3) { + player.storage.gwweitu -= 3; + player.unmarkSkill("gwweitu"); + var list = get.typeCard("spell_silver"); + if (list.length) { + player.gain(game.createCard(list.randomGet()), "draw"); } + } else { + player.markSkill("gwweitu", true); } - else{ - player.markSkill('gwweitu',true); - } - } - } + }, + }, }, - ai:{ - threaten:0.7, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'discard')&&target.hujia<3&& - target.countCards('he')&¤t<0){ + ai: { + threaten: 0.7, + effect: { + target(card, player, target, current) { + if ( + get.tag(card, "discard") && + target.hujia < 3 && + target.countCards("he") && + current < 0 + ) { return 0; } }, - player(card,player){ - if(player.hujia>=3) return; - if(_status.event.name!='chooseToUse'||_status.event.player!=player) return; - if(get.type(card)=='basic') return; - if(get.tag(card,'gain')) return; - if(get.value(card,player,'raw')>=7) return; - if(player.needsToDiscard()>1) return; - return 'zeroplayertarget'; - } - } - } + player(card, player) { + if (player.hujia >= 3) return; + if (_status.event.name != "chooseToUse" || _status.event.player != player) return; + if (get.type(card) == "basic") return; + if (get.tag(card, "gain")) return; + if (get.value(card, player, "raw") >= 7) return; + if (player.needsToDiscard() > 1) return; + return "zeroplayertarget"; + }, + }, + }, }, - gwgouhun:{ - enable:'phaseUse', - usable:1, - filterCard:true, - discard:false, - prepare:'give', - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0; + gwgouhun: { + enable: "phaseUse", + usable: 1, + filterCard: true, + discard: false, + prepare: "give", + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; }, - check(card){ - return 7-get.value(card); + check(card) { + return 7 - get.value(card); }, - content(){ - 'step 0' - target.gain(cards,player); - event.card=cards[0]; - event.suit=get.suit(cards[0]); - 'step 1' - var hs=target.getCards('h'); - var num1=0; - var num2=0; - for(var i=0;i2&&num2>3){ + if (num1 && num2) { + target.chooseControlList(list, true, function () { + if (num1 > 2 && num2 > 3) { return 2; } - if(num1>num2/2){ + if (num1 > num2 / 2) { return 1; - } - else if(num12) return 1; + } else if (num1) { + list.splice(1, 1); + target.chooseControlList(list, true, function () { + if (num1 > 2) return 1; return 0; }); - } - else if(num2){ - list.splice(0,1); - target.chooseControlList(list,true,function(){ - if(num2>3) return 1; + } else if (num2) { + list.splice(0, 1); + target.chooseControlList(list, true, function () { + if (num2 > 3) return 1; return 0; }); - } - else{ - target.goMad({player:'phaseAfter'}); + } else { + target.goMad({ player: "phaseAfter" }); event.finish(); } - 'step 2' - var index=result.index; - var cards1=target.getCards('h',function(card){ - return get.suit(card)==event.suit; + ("step 2"); + var index = result.index; + var cards1 = target.getCards("h", function (card) { + return get.suit(card) == event.suit; }); - var cards2=target.getCards('h',function(card){ - return get.suit(card)!=event.suit; + var cards2 = target.getCards("h", function (card) { + return get.suit(card) != event.suit; }); - if(typeof index=='number'){ - if(event.num1&&event.num2){ - if(index==0){ - target.give(cards1,player); - } - else if(index==1){ + if (typeof index == "number") { + if (event.num1 && event.num2) { + if (index == 0) { + target.give(cards1, player); + } else if (index == 1) { target.discard(cards2); + } else { + target.goMad({ player: "phaseAfter" }); } - else{ - target.goMad({player:'phaseAfter'}); - } - } - else{ - if(index==1){ - target.goMad({player:'phaseAfter'}); - } - else if(event.num1){ - target.give(cards1,player); - } - else{ + } else { + if (index == 1) { + target.goMad({ player: "phaseAfter" }); + } else if (event.num1) { + target.give(cards1, player); + } else { target.discard(cards2); } } } }, - ai:{ - threaten:1.5, - order:9, - result:{ - target(player,target){ - return -Math.sqrt(target.countCards('h')); - } - } - } - }, - gwfutian:{ - trigger:{player:'damageBefore'}, - forced:true, - content(){ - trigger.cancel(); - }, - ai:{ - nofire:true, - nothunder:true, - nodamage:true, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'damage')) return [0,0]; - } + ai: { + threaten: 1.5, + order: 9, + result: { + target(player, target) { + return -Math.sqrt(target.countCards("h")); + }, }, }, - init(player){ - player.storage.gwfutian=0; + }, + gwfutian: { + trigger: { player: "damageBefore" }, + forced: true, + content() { + trigger.cancel(); }, - intro:{ - content:'弃置的牌总点数:#' + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage")) return [0, 0]; + }, + }, }, - unique:true, - onremove:true, - group:'gwfutian_discard', - subSkill:{ - discard:{ - trigger:{player:'phaseBegin'}, - forced:true, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); + init(player) { + player.storage.gwfutian = 0; + }, + intro: { + content: "弃置的牌总点数:#", + }, + unique: true, + onremove: true, + group: "gwfutian_discard", + subSkill: { + discard: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); }); }, - content(){ - 'step 0' - player.chooseTarget('覆天:弃置一名角色的一张手牌',function(card,player,target){ - return target!=player&&target.countCards('h'); - },true).set('ai',function(target){ - if(target.hasSkillTag('noh')) return 0; - return -get.attitude(player,target)/Math.sqrt(target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.discardPlayerCard(target,'h',true); - player.line(target,'green'); - } - else{ + content() { + "step 0"; + player + .chooseTarget( + "覆天:弃置一名角色的一张手牌", + function (card, player, target) { + return target != player && target.countCards("h"); + }, + true + ) + .set("ai", function (target) { + if (target.hasSkillTag("noh")) return 0; + return -get.attitude(player, target) / Math.sqrt(target.countCards("h")); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.discardPlayerCard(target, "h", true); + player.line(target, "green"); + } else { event.finish(); } - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ - player.storage.gwfutian+=get.number(result.cards[0]); - player.markSkill('gwfutian',true); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + player.storage.gwfutian += get.number(result.cards[0]); + player.markSkill("gwfutian", true); } - 'step 3' - if(player.storage.gwfutian>=24){ - player.$skill('覆天','legend','metal'); - player.removeSkill('gwfutian'); - player.addSkill('gwzhongmo'); - player.setAvatar('gw_kanbi','gw_hanmuduoer'); - player.maxHp+=4; - player.hp=player.maxHp; + ("step 3"); + if (player.storage.gwfutian >= 24) { + player.$skill("覆天", "legend", "metal"); + player.removeSkill("gwfutian"); + player.addSkill("gwzhongmo"); + player.setAvatar("gw_kanbi", "gw_hanmuduoer"); + player.maxHp += 4; + player.hp = player.maxHp; player.update(); } - } - } - } + }, + }, + }, }, - gwzhongmo:{ - trigger:{player:'phaseDrawBefore'}, - forced:true, - content(){ + gwzhongmo: { + trigger: { player: "phaseDrawBefore" }, + forced: true, + content() { trigger.cancel(); - var list=['bronze','silver','gold']; + var list = ["bronze", "silver", "gold"]; list.randomRemove(); - var cards=[]; - for(var i=0;iget.type(event.card)!='equip'&&player.hasCard(card=>get.color(card)==get.color(event.card)&&player.canRecast(card),'h'), - content(){ - 'step 0' - var cards=player.getCards('h',card=>get.suit(card)==get.suit(trigger.card)&&player.canRecast(card)); - if(!cards.length) cards=player.getCards('h',card=>get.color(card)==get.color(trigger.card)&&player.canRecast(card)); - if(!cards.length){ + yangfan: { + trigger: { player: "useCard" }, + forced: true, + filter: (event, player) => + get.type(event.card) != "equip" && + player.hasCard( + (card) => get.color(card) == get.color(event.card) && player.canRecast(card), + "h" + ), + content() { + "step 0"; + var cards = player.getCards( + "h", + (card) => get.suit(card) == get.suit(trigger.card) && player.canRecast(card) + ); + if (!cards.length) + cards = player.getCards( + "h", + (card) => get.color(card) == get.color(trigger.card) && player.canRecast(card) + ); + if (!cards.length) { event.finish(); return; } player.recast(cards.randomGet()); }, - ai:{ - pretao:true - } + ai: { + pretao: true, + }, }, - gwfengshi:{ - trigger:{player:'phaseEnd'}, - direct:true, - content(){ - 'step 0' - player.chooseControlList(get.prompt('gwfengshi'),['为自己施加一个随机负面效果,并对两名随机敌人施加一个随机负面效果','为自己施加两个随机正面效果,并对一名随机敌人施加一个随机正面效果'],function(){ - if(player.getEnemies().length<2) return 1; - if(player.hp<=1) return 1; - if(player.hp==2&&Math.random()<0.5) return 1; - return 0; - }); - 'step 1' - if(result.index!=2){ - player.logSkill('gwfengshi'); - if(result.index==0){ - event.debuff=[player].addArray(player.getEnemies().randomGets(2)); + gwfengshi: { + trigger: { player: "phaseEnd" }, + direct: true, + content() { + "step 0"; + player.chooseControlList( + get.prompt("gwfengshi"), + [ + "为自己施加一个随机负面效果,并对两名随机敌人施加一个随机负面效果", + "为自己施加两个随机正面效果,并对一名随机敌人施加一个随机正面效果", + ], + function () { + if (player.getEnemies().length < 2) return 1; + if (player.hp <= 1) return 1; + if (player.hp == 2 && Math.random() < 0.5) return 1; + return 0; } - else{ - event.buff=[player,player,player.getEnemies().randomGet()]; + ); + ("step 1"); + if (result.index != 2) { + player.logSkill("gwfengshi"); + if (result.index == 0) { + event.debuff = [player].addArray(player.getEnemies().randomGets(2)); + } else { + event.buff = [player, player, player.getEnemies().randomGet()]; } - } - else{ + } else { event.finish(); } - 'step 2' - if(event.debuff&&event.debuff.length){ - player.line(event.debuff.shift().getDebuff(false).addExpose(0.1),'green'); + ("step 2"); + if (event.debuff && event.debuff.length) { + player.line(event.debuff.shift().getDebuff(false).addExpose(0.1), "green"); event.redo(); } - 'step 3' - if(event.buff&&event.buff.length){ - player.line(event.buff.shift().getBuff(false).addExpose(0.1),'green'); + ("step 3"); + if (event.buff && event.buff.length) { + player.line(event.buff.shift().getBuff(false).addExpose(0.1), "green"); event.redo(); } - 'step 4' + ("step 4"); game.delay(); - } + }, }, - gwchenshui:{ - trigger:{player:'damageBefore',source:'damageBefore'}, - forced:true, - init(player){ - player.storage.gwchenshui=0; + gwchenshui: { + trigger: { player: "damageBefore", source: "damageBefore" }, + forced: true, + init(player) { + player.storage.gwchenshui = 0; }, - mark:true, - intro:{ - content(storage){ - if(!storage){ - return '未发动过沉睡效果'; + mark: true, + intro: { + content(storage) { + if (!storage) { + return "未发动过沉睡效果"; + } else { + return "累计发动过" + storage + "次沉睡效果"; } - else{ - return '累计发动过'+storage+'次沉睡效果'; - } - } + }, }, - logTarget(event,player){ - if(player==event.source) return event.player; + logTarget(event, player) { + if (player == event.source) return event.player; return event.source; }, - content(){ + content() { trigger.cancel(); player.storage.gwchenshui++; player.updateMarks(); - if(trigger.source!=trigger.player&&trigger.source.isIn()&&trigger.player.isIn()){ - var cards=trigger.player.getCards('he'); - if(cards.length){ - trigger.player.give(cards.randomGet(),trigger.source); + if (trigger.source != trigger.player && trigger.source.isIn() && trigger.player.isIn()) { + var cards = trigger.player.getCards("he"); + if (cards.length) { + trigger.player.give(cards.randomGet(), trigger.source); } } }, - onremove:true, - group:'gwchenshui_juexing', - subSkill:{ - juexing:{ - trigger:{player:'phaseEnd'}, - filter(event,player){ - return player.storage.gwchenshui>=3; + onremove: true, + group: "gwchenshui_juexing", + subSkill: { + juexing: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return player.storage.gwchenshui >= 3; }, - skillAnimation:true, - animationStr:'觉醒', - forced:true, - content(){ - 'step 0' - player.removeSkill('gwchenshui'); - player.setAvatar('gw_laomaotou','gw_laomaotou2'); - event.list=player.getEnemies().sortBySeat(); - 'step 1' - if(event.list.length){ - var target=event.list.shift(); - player.line(target,'green'); + skillAnimation: true, + animationStr: "觉醒", + forced: true, + content() { + "step 0"; + player.removeSkill("gwchenshui"); + player.setAvatar("gw_laomaotou", "gw_laomaotou2"); + event.list = player.getEnemies().sortBySeat(); + ("step 1"); + if (event.list.length) { + var target = event.list.shift(); + player.line(target, "green"); target.damage(); event.redo(); } - 'step 2' - player.addSkill('gwliedi'); - } - } - }, - ai:{ - threaten:0.6, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(!target.countCards('he')) return 'zeroplayertarget'; - } - } - } - } - }, - gwliedi:{ - trigger:{source:'damageBegin'}, - forced:true, - filter(event,player){ - return event.player!=player&&player.distanceTo(event.player)>=2; - }, - content(){ - trigger.num+=Math.floor(Math.max(1,player.distanceTo(trigger.player))/2); - }, - group:['gwliedi_sleep','gwliedi_damage'], - onremove:true, - subSkill:{ - damage:{ - trigger:{source:'damageEnd'}, - silent:true, - filter(event,player){ - return event.player!=player; - }, - content(){ - player.storage.gwliedi=-1; + ("step 2"); + player.addSkill("gwliedi"); }, }, - sleep:{ - trigger:{player:'phaseEnd'}, - silent:true, - content(){ - if(player.storage.gwliedi!=1){ - if(player.storage.gwliedi==-1){ - player.storage.gwliedi=0; - } - else{ - player.storage.gwliedi=1; - } + }, + ai: { + threaten: 0.6, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (!target.countCards("he")) return "zeroplayertarget"; } - else{ - player.logSkill('gwliedi'); - player.addSkill('gwchenshui'); - player.removeSkill('gwliedi'); - player.setAvatar('gw_laomaotou','gw_laomaotou'); - } - } - } - } + }, + }, + }, }, - julian:{ - trigger:{player:'phaseUseBegin'}, - frequent:true, - filter(event,player){ + gwliedi: { + trigger: { source: "damageBegin" }, + forced: true, + filter(event, player) { + return event.player != player && player.distanceTo(event.player) >= 2; + }, + content() { + trigger.num += Math.floor(Math.max(1, player.distanceTo(trigger.player)) / 2); + }, + group: ["gwliedi_sleep", "gwliedi_damage"], + onremove: true, + subSkill: { + damage: { + trigger: { source: "damageEnd" }, + silent: true, + filter(event, player) { + return event.player != player; + }, + content() { + player.storage.gwliedi = -1; + }, + }, + sleep: { + trigger: { player: "phaseEnd" }, + silent: true, + content() { + if (player.storage.gwliedi != 1) { + if (player.storage.gwliedi == -1) { + player.storage.gwliedi = 0; + } else { + player.storage.gwliedi = 1; + } + } else { + player.logSkill("gwliedi"); + player.addSkill("gwchenshui"); + player.removeSkill("gwliedi"); + player.setAvatar("gw_laomaotou", "gw_laomaotou"); + } + }, + }, + }, + }, + julian: { + trigger: { player: "phaseUseBegin" }, + frequent: true, + filter(event, player) { return !player.isMaxHandcard(); }, - content(){ - var num=0; - for(var i=0;i0){ + var dh = num - player.countCards("h"); + if (dh > 0) { player.draw(dh); } - } + }, }, - gwfusheng:{ - enable:'chooseToUse', - filter(event,player){ - return event.type=='dying'&&event.dying&&!event.dying.isTurnedOver(); + gwfusheng: { + enable: "chooseToUse", + filter(event, player) { + return event.type == "dying" && event.dying && !event.dying.isTurnedOver(); }, - filterTarget(card,player,target){ - return target==_status.event.dying; + filterTarget(card, player, target) { + return target == _status.event.dying; }, - selectTarget:-1, - content(){ + selectTarget: -1, + content() { target.turnOver(); target.recover(); - if(player!=target){ - game.asyncDraw([player,target]); - } - else{ + if (player != target) { + game.asyncDraw([player, target]); + } else { player.draw(2); } }, - ai:{ - order:0.1, - skillTagFilter(player){ - if(!_status.event.dying||_status.event.dying.isTurnedOver()) return false; + ai: { + order: 0.1, + skillTagFilter(player) { + if (!_status.event.dying || _status.event.dying.isTurnedOver()) return false; }, - save:true, - result:{ - target:3 + save: true, + result: { + target: 3, }, - threaten:1.6 + threaten: 1.6, }, }, - gwqinwu:{ - trigger:{player:'useCard'}, - usable:1, - filter(event,player){ - return get.type(event.card)=='basic'; + gwqinwu: { + trigger: { player: "useCard" }, + usable: 1, + filter(event, player) { + return get.type(event.card) == "basic"; }, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt2('gwqinwu')).ai=function(target){ - var att=get.attitude(player,target); - if(att<=0) return 0; - if(att<3) return att; - att=10-get.distance(player,target,'absolute')/game.players.length; - if(target.hasSkill('gwqinwu')){ - att/=1.5; + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt2("gwqinwu")).ai = function (target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (att < 3) return att; + att = 10 - get.distance(player, target, "absolute") / game.players.length; + if (target.hasSkill("gwqinwu")) { + att /= 1.5; } - if(target.hasJudge('lebu')||target.skipList.includes('phaseUse')){ - att/=2; + if (target.hasJudge("lebu") || target.skipList.includes("phaseUse")) { + att /= 2; } return att; - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('gwqinwu',target); - target.draw(); - if(!target.hasSkill('gwqinwu')){ - target.addTempSkill('gwqinwu',{player:'phaseAfter'}); - target.addTempSkill('gwqinwu2',{player:'phaseAfter'}); - } - } - }, - ai:{ - threaten:1.5 - } - }, - gwqinwu2:{ - mark:true, - intro:{ - content:'获得【琴舞】直到下一回合结束' - } - }, - huanshu:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return player.countCards('h')>0&&!player.hasSkill('huangshu2'); - }, - content(){ - "step 0" - player.chooseCard(get.prompt2('huanshu')).ai=function(card){ - return 6-get.value(card); }; - "step 1" - if(result.bool){ - player.$give(result.cards,player); - player.logSkill('huanshu'); - player.storage.huanshu2=result.cards[0]; - player.lose(result.cards,ui.special); - player.addSkill('huanshu2'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("gwqinwu", target); + target.draw(); + if (!target.hasSkill("gwqinwu")) { + target.addTempSkill("gwqinwu", { player: "phaseAfter" }); + target.addTempSkill("gwqinwu2", { player: "phaseAfter" }); + } } }, - ai:{ - threaten:1.4 + ai: { + threaten: 1.5, }, }, - huanshu2:{ - intro:{ - content(storage,player){ - if(player.isUnderControl(true)){ - return '当一名敌方角色使用'+get.translation(get.color(storage))+'锦囊牌时,移去'+get.translation(storage)+',取消锦囊的效果,并摸两张牌'; - } - else{ - return '当一名敌方角色使用与“幻术”牌颜色相同的锦囊牌时,移去“幻术”牌,取消锦囊的效果,并摸两张牌'; + gwqinwu2: { + mark: true, + intro: { + content: "获得【琴舞】直到下一回合结束", + }, + }, + huanshu: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return player.countCards("h") > 0 && !player.hasSkill("huangshu2"); + }, + content() { + "step 0"; + player.chooseCard(get.prompt2("huanshu")).ai = function (card) { + return 6 - get.value(card); + }; + ("step 1"); + if (result.bool) { + player.$give(result.cards, player); + player.logSkill("huanshu"); + player.storage.huanshu2 = result.cards[0]; + player.lose(result.cards, ui.special); + player.addSkill("huanshu2"); + } + }, + ai: { + threaten: 1.4, + }, + }, + huanshu2: { + intro: { + content(storage, player) { + if (player.isUnderControl(true)) { + return ( + "当一名敌方角色使用" + + get.translation(get.color(storage)) + + "锦囊牌时,移去" + + get.translation(storage) + + ",取消锦囊的效果,并摸两张牌" + ); + } else { + return "当一名敌方角色使用与“幻术”牌颜色相同的锦囊牌时,移去“幻术”牌,取消锦囊的效果,并摸两张牌"; } }, - onunmark(storage,player){ - if(storage){ + onunmark(storage, player) { + if (storage) { storage.discard(); delete player.storage.huanshu2; } - } + }, }, - trigger:{global:'useCard'}, - forced:true, - filter(event,player){ - return player.getEnemies().includes(event.player)&& - get.type(event.card,'trick')=='trick'&&get.color(event.card)==get.color(player.storage.huanshu2); + trigger: { global: "useCard" }, + forced: true, + filter(event, player) { + return ( + player.getEnemies().includes(event.player) && + get.type(event.card, "trick") == "trick" && + get.color(event.card) == get.color(player.storage.huanshu2) + ); }, - mark:true, - content(){ - 'step 0' + mark: true, + content() { + "step 0"; game.delayx(); player.addExpose(0.1); trigger.player.addExpose(0.1); - 'step 1' - player.showCards(player.storage.huanshu2,get.translation(player)+'发动了【幻术】'); - 'step 2' - player.removeSkill('huanshu2'); + ("step 1"); + player.showCards(player.storage.huanshu2, get.translation(player) + "发动了【幻术】"); + ("step 2"); + player.removeSkill("huanshu2"); trigger.cancel(); player.draw(2); }, - group:'huanshu3' + group: "huanshu3", }, - huanshu3:{ - trigger:{player:'phaseBegin'}, - forced:true, - content(){ + huanshu3: { + trigger: { player: "phaseBegin" }, + forced: true, + content() { player.$throw(player.storage.huanshu2); - game.log(player,'弃置了',player.storage.huanshu2); - player.removeSkill('huanshu2'); - } + game.log(player, "弃置了", player.storage.huanshu2); + player.removeSkill("huanshu2"); + }, }, - gwjieyin:{ - group:'gwjieyin_reset', - init(player){ - player.storage.gwjieyin=[]; + gwjieyin: { + group: "gwjieyin_reset", + init(player) { + player.storage.gwjieyin = []; }, - enable:'phaseUse', - filter(event,player){ - return player.storage.gwjieyin.length<3; + enable: "phaseUse", + filter(event, player) { + return player.storage.gwjieyin.length < 3; }, - chooseButton:{ - dialog(event,player){ - return ui.create.dialog('结印',[[['','','gw_wenyi'],['','','gw_yanziyaoshui'],['','','gw_kunenfayin']],'vcard'],'hidden'); + chooseButton: { + dialog(event, player) { + return ui.create.dialog( + "结印", + [ + [ + ["", "", "gw_wenyi"], + ["", "", "gw_yanziyaoshui"], + ["", "", "gw_kunenfayin"], + ], + "vcard", + ], + "hidden" + ); }, - filter(button,player){ - if(player.storage.gwjieyin.includes(button.link[2])){ + filter(button, player) { + if (player.storage.gwjieyin.includes(button.link[2])) { return false; } return true; }, - check(button){ - var player=_status.event.player; - if(button.link[2]=='gw_yanziyaoshui'){ - if(game.hasPlayer(function(current){ - return get.attitude(player,current)>1&¤t.isMinHandcard(); - })){ + check(button) { + var player = _status.event.player; + if (button.link[2] == "gw_yanziyaoshui") { + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) > 1 && current.isMinHandcard(); + }) + ) { return 3; - } - else if((game.roundNumber-player.storage.gwjieyin_round)%2==0){ + } else if ((game.roundNumber - player.storage.gwjieyin_round) % 2 == 0) { return 0; - } - else{ + } else { return 0.5; } - } - else if(button.link[2]=='gw_wenyi'){ - if(game.countPlayer(function(current){ - if(current.isMinHp()){ - if(!current.countCards('h')){ - return -2*get.sgn(get.attitude(player,current)); + } else if (button.link[2] == "gw_wenyi") { + if ( + game.countPlayer(function (current) { + if (current.isMinHp()) { + if (!current.countCards("h")) { + return -2 * get.sgn(get.attitude(player, current)); + } else { + return -get.sgn(get.attitude(player, current)); + } } - else{ - return -get.sgn(get.attitude(player,current)); - } - } - })>0){ + }) > 0 + ) { return 2; - } - else{ + } else { return 0; } - } - else{ + } else { return 1; } }, - backup(links,player){ + backup(links, player) { return { - filterCard(){return false}, - selectCard:-1, - viewAs:{name:links[0][2]}, - popname:true, - onuse(result,player){ - player.logSkill('gwjieyin'); + filterCard() { + return false; + }, + selectCard: -1, + viewAs: { name: links[0][2] }, + popname: true, + onuse(result, player) { + player.logSkill("gwjieyin"); player.storage.gwjieyin.add(result.card.name); - } - } + }, + }; + }, + prompt(links, player) { + return "选择" + get.translation(links[0][2]) + "的目标"; }, - prompt(links,player){ - return '选择'+get.translation(links[0][2])+'的目标'; - } }, - subSkill:{ - reset:{ - trigger:{player:'phaseBegin'}, - silent:true, - content(){ - if(typeof player.storage.gwjieyin_round=='number'){ - var num=game.roundNumber-player.storage.gwjieyin_round; - if(num&&num%2==0){ - player.storage.gwjieyin.length=0; - player.storage.gwjieyin_round=game.roundNumber; + subSkill: { + reset: { + trigger: { player: "phaseBegin" }, + silent: true, + content() { + if (typeof player.storage.gwjieyin_round == "number") { + var num = game.roundNumber - player.storage.gwjieyin_round; + if (num && num % 2 == 0) { + player.storage.gwjieyin.length = 0; + player.storage.gwjieyin_round = game.roundNumber; } + } else { + player.storage.gwjieyin_round = game.roundNumber; } - else{ - player.storage.gwjieyin_round=game.roundNumber; - } - } - } + }, + }, + }, + ai: { + order: 6, + result: { + player: 1, + }, }, - ai:{ - order:6, - result:{ - player:1 - } - } }, - zhengjun:{ - init(player){ - player.storage.zhengjun=[]; - player.storage.zhengjun_one=[]; + zhengjun: { + init(player) { + player.storage.zhengjun = []; + player.storage.zhengjun_one = []; }, - trigger:{player:'zhengjun'}, - forced:true, - intro:{ - content:'已经使用或打出过至少两张同名牌的牌有:$' + trigger: { player: "zhengjun" }, + forced: true, + intro: { + content: "已经使用或打出过至少两张同名牌的牌有:$", }, - content(){ - 'step 0' - player.markSkill('zhengjun'); + content() { + "step 0"; + player.markSkill("zhengjun"); player.gainMaxHp(); - 'step 1' + ("step 1"); player.recover(); }, - group:['zhengjun_one','zhengjun_draw'], - subSkill:{ - one:{ - trigger:{player:['useCard','respondAfter']}, - silent:true, - content(){ - if(player.storage.zhengjun_one.includes(trigger.card.name)){ - if(!player.storage.zhengjun.includes(trigger.card.name)){ + group: ["zhengjun_one", "zhengjun_draw"], + subSkill: { + one: { + trigger: { player: ["useCard", "respondAfter"] }, + silent: true, + content() { + if (player.storage.zhengjun_one.includes(trigger.card.name)) { + if (!player.storage.zhengjun.includes(trigger.card.name)) { player.storage.zhengjun.add(trigger.card.name); - event.trigger('zhengjun'); + event.trigger("zhengjun"); } - } - else{ + } else { player.storage.zhengjun_one.add(trigger.card.name); } - } - }, - draw:{ - trigger:{player:'phaseEnd'}, - frequent:true, - filter(event,player){ - return player.storage.zhengjun.length>=1; }, - content(){ - 'step 0' - if(player.storage.zhengjun.length==1){ + }, + draw: { + trigger: { player: "phaseEnd" }, + frequent: true, + filter(event, player) { + return player.storage.zhengjun.length >= 1; + }, + content() { + "step 0"; + if (player.storage.zhengjun.length == 1) { player.draw(); event.finish(); return; } - event.cards=get.cards(player.storage.zhengjun.length); - player.chooseCardButton('整军:获得其中一张牌',true,event.cards).set('ai',function(button){ - return get.useful(button.link); - }); - 'step 1' - if(result.bool){ - var card=result.links[0]; + event.cards = get.cards(player.storage.zhengjun.length); + player + .chooseCardButton("整军:获得其中一张牌", true, event.cards) + .set("ai", function (button) { + return get.useful(button.link); + }); + ("step 1"); + if (result.bool) { + var card = result.links[0]; card.fix(); - player.gain(card,'draw'); + player.gain(card, "draw"); event.cards.remove(card); } - 'step 2' - while(event.cards.length){ - ui.cardPile.insertBefore(event.cards.pop(),ui.cardPile.firstChild); + ("step 2"); + while (event.cards.length) { + ui.cardPile.insertBefore(event.cards.pop(), ui.cardPile.firstChild); } - } - } - } + }, + }, + }, }, - gwxuezhan:{ - trigger:{player:'phaseBegin'}, - filter(event,player){ + gwxuezhan: { + trigger: { player: "phaseBegin" }, + filter(event, player) { return player.isMinHandcard(); }, - frequent:true, - content(){ - player.gain(game.createCard('gw_shizizhaohuan'),'gain2'); - } - }, - jielue_old:{ - trigger:{player:'useCard'}, - frequent:true, - oncancel(event,player){ - player.addTempSkill('jielue2'); + frequent: true, + content() { + player.gain(game.createCard("gw_shizizhaohuan"), "gain2"); }, - usable:1, - filter(event,player){ - if(event.card.isCard){ - return !player.hasSkill('jielue2')&&get.type(event.card)=='basic'&&!event.card.storage.jielue; + }, + jielue_old: { + trigger: { player: "useCard" }, + frequent: true, + oncancel(event, player) { + player.addTempSkill("jielue2"); + }, + usable: 1, + filter(event, player) { + if (event.card.isCard) { + return ( + !player.hasSkill("jielue2") && + get.type(event.card) == "basic" && + !event.card.storage.jielue + ); } return false; }, - check(event,player){ - return get.value(event.card)>3; + check(event, player) { + return get.value(event.card) > 3; }, - content(){ - var card1=game.createCard(trigger.card); - var card2=game.createCard(trigger.card); - card1.storage.jielue=true; - card2.storage.jielue=true; - player.gain([card1,card2],'gain2'); + content() { + var card1 = game.createCard(trigger.card); + var card2 = game.createCard(trigger.card); + card1.storage.jielue = true; + card2.storage.jielue = true; + player.gain([card1, card2], "gain2"); + }, + ai: { + pretao: true, }, - ai:{ - pretao:true - } }, - jielue2:{}, - bolang:{ - trigger:{player:'phaseBegin'}, - frequent:true, - init(player){ - player.storage.bolang=[]; + jielue2: {}, + bolang: { + trigger: { player: "phaseBegin" }, + frequent: true, + init(player) { + player.storage.bolang = []; }, - content(){ - 'step 0' - var cards=[]; - for(var i=0;i0; + filterTarget(card, player, target) { + return ( + target != player && get.distance(player, target) <= 1 && target.countCards("he") > 0 + ); }, - content(){ - var hs=target.getCards('he'); - if(hs.length){ - var card=hs.randomGet(); - target.$give(card,player); - player.storage.gwjushi2=card; - player.storage.gwjushi3=target; - player.storage.gwjushi4=get.position(card); - target.lose(card,ui.special); - player.addSkill('gwjushi2'); + content() { + var hs = target.getCards("he"); + if (hs.length) { + var card = hs.randomGet(); + target.$give(card, player); + player.storage.gwjushi2 = card; + player.storage.gwjushi3 = target; + player.storage.gwjushi4 = get.position(card); + target.lose(card, ui.special); + player.addSkill("gwjushi2"); } }, - ai:{ - order:8, - result:{ - target:-1 - } - } + ai: { + order: 8, + result: { + target: -1, + }, + }, }, - gwjushi2:{ - mark:'card', - intro:{ - content:'受到伤害时,令此牌回归原位;准备阶段,你获得此牌' + gwjushi2: { + mark: "card", + intro: { + content: "受到伤害时,令此牌回归原位;准备阶段,你获得此牌", }, - trigger:{player:['phaseBegin','damageEnd']}, - forced:true, - content(){ - var card=player.storage.gwjushi2; - var target=player.storage.gwjushi3; - if(trigger.name=='damage'){ - if(target.isIn()){ - if(player.storage.gwjushi4=='e'&&get.type(card)=='equip'){ + trigger: { player: ["phaseBegin", "damageEnd"] }, + forced: true, + content() { + var card = player.storage.gwjushi2; + var target = player.storage.gwjushi3; + if (trigger.name == "damage") { + if (target.isIn()) { + if (player.storage.gwjushi4 == "e" && get.type(card) == "equip") { target.equip(card); - player.$give(card,target); + player.$give(card, target); game.delay(); + } else { + player.give(card, target); } - else{ - player.give(card,target); - } - } - else{ + } else { card.discard(); } + } else { + player.gain(card, "gain2"); } - else{ - player.gain(card,'gain2'); - } - player.removeSkill('gwjushi2'); + player.removeSkill("gwjushi2"); + }, + onremove: ["gwjushi2", "gwjushi3", "gwjushi4"], + ai: { + threaten: 1.5, }, - onremove:['gwjushi2','gwjushi3','gwjushi4'], - ai:{ - threaten:1.5 - } }, - gwfengchi:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - content(){ - 'step 0' - var list=get.gainableSkills(function(info){ - if(typeof info.enable=='string') return info.enable=='phaseUse'; - if(Array.isArray(info.enable)) return info.enable.includes('phaseUse'); - },player); + gwfengchi: { + trigger: { player: "phaseUseBegin" }, + forced: true, + content() { + "step 0"; + var list = get.gainableSkills(function (info) { + if (typeof info.enable == "string") return info.enable == "phaseUse"; + if (Array.isArray(info.enable)) return info.enable.includes("phaseUse"); + }, player); list.remove(player.getSkills()); - list=list.randomGets(3); - event.skillai=function(){ - return get.max(list,get.skillRank,'item'); + list = list.randomGets(3); + event.skillai = function () { + return get.max(list, get.skillRank, "item"); }; - if(event.isMine()){ - var dialog=ui.create.dialog('forcebutton'); - dialog.add('风驰:选择获得一项技能'); - var clickItem=function(){ - _status.event._result=this.link; + if (event.isMine()) { + var dialog = ui.create.dialog("forcebutton"); + dialog.add("风驰:选择获得一项技能"); + var clickItem = function () { + _status.event._result = this.link; dialog.close(); game.resume(); }; - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); - event.switchToAuto=function(){ - event._result=event.skillai(); + dialog.add(ui.create.div(".placeholder")); + event.switchToAuto = function () { + event._result = event.skillai(); dialog.close(); game.resume(); }; - _status.imchoosing=true; + _status.imchoosing = true; game.pause(); + } else { + event._result = event.skillai(); } - else{ - event._result=event.skillai(); - } - 'step 1' - _status.imchoosing=false; - var link=result; - player.addTempSkill(link,'phaseUseAfter'); + ("step 1"); + _status.imchoosing = false; + var link = result; + player.addTempSkill(link, "phaseUseAfter"); player.popup(link); - player.flashAvatar('gwfengchi',link); - game.log(player,'获得了技能','【'+get.translation(link)+'】'); + player.flashAvatar("gwfengchi", link); + game.log(player, "获得了技能", "【" + get.translation(link) + "】"); game.delay(); - } + }, }, - lingji:{ - enable:'phaseUse', - usable:1, - content(){ - 'step 0' + lingji: { + enable: "phaseUse", + usable: 1, + content() { + "step 0"; player.draw(2); - 'step 1' - player.chooseToDiscard('he',2,true).ai=function(card){ - var val=-get.value(card); - if(ui.selected.cards.length){ - if(get.suit(card)==get.suit(ui.selected.cards[0])) val++; - if(get.number(card)==get.number(ui.selected.cards[0])) val+=3; + ("step 1"); + player.chooseToDiscard("he", 2, true).ai = function (card) { + var val = -get.value(card); + if (ui.selected.cards.length) { + if (get.suit(card) == get.suit(ui.selected.cards[0])) val++; + if (get.number(card) == get.number(ui.selected.cards[0])) val += 3; } return val; - } - 'step 2' - if(result.cards.length==2){ - var list=[]; - if(get.suit(result.cards[0])==get.suit(result.cards[1])){ - var list1=get.typeCard('spell_bronze'); - if(list1.length){ + }; + ("step 2"); + if (result.cards.length == 2) { + var list = []; + if (get.suit(result.cards[0]) == get.suit(result.cards[1])) { + var list1 = get.typeCard("spell_bronze"); + if (list1.length) { list.push(game.createCard(list1.randomGet())); } } - if(get.number(result.cards[0])==get.number(result.cards[1])){ - var list2=get.typeCard('spell_silver'); - if(list2.length){ + if (get.number(result.cards[0]) == get.number(result.cards[1])) { + var list2 = get.typeCard("spell_silver"); + if (list2.length) { list.push(game.createCard(list2.randomGet())); } } - if(list.length){ - player.gain(list,'gain2'); + if (list.length) { + player.gain(list, "gain2"); } } }, - ai:{ - order:8, - result:{ - player:1 - } - } - }, - gwjinyan:{ - trigger:{player:['damageBefore']}, - forced:true, - mark:true, - filter(event,player){ - return game.roundNumber%3!=0; + ai: { + order: 8, + result: { + player: 1, + }, }, - content(){ + }, + gwjinyan: { + trigger: { player: ["damageBefore"] }, + forced: true, + mark: true, + filter(event, player) { + return game.roundNumber % 3 != 0; + }, + content() { trigger.cancel(); }, - group:['gwjinyan_gain'], - subSkill:{ - gain:{ - trigger:{player:'phaseBegin'}, - frequent:true, - filter(){ - return game.roundNumber%3==0; + group: ["gwjinyan_gain"], + subSkill: { + gain: { + trigger: { player: "phaseBegin" }, + frequent: true, + filter() { + return game.roundNumber % 3 == 0; }, - content(){ - var list=get.typeCard('spell_gold'); - if(list.length){ - player.gain(game.createCard(list.randomGet()),'gain2'); + content() { + var list = get.typeCard("spell_gold"); + if (list.length) { + player.gain(game.createCard(list.randomGet()), "gain2"); } - } - } + }, + }, }, - ai:{ - threaten(){ - if(game.roundNumber%3==0) return 1.6; + ai: { + threaten() { + if (game.roundNumber % 3 == 0) return 1.6; return 0.8; }, - nofire:true, - nothunder:true, - nodamage:true, - skillTagFilter(){ - if(game.roundNumber%3==0) return false; + nofire: true, + nothunder: true, + nodamage: true, + skillTagFilter() { + if (game.roundNumber % 3 == 0) return false; }, - effect:{ - target(card,player,target){ - if(game.roundNumber%3!=0&&get.tag(card,'damage')){ - return [0,0]; + effect: { + target(card, player, target) { + if (game.roundNumber % 3 != 0 && get.tag(card, "damage")) { + return [0, 0]; } - } - } - } + }, + }, + }, }, - gwshenyu:{ - trigger:{player:'phaseBegin'}, - direct:true, - filter(event,player){ - if(game.hasPlayer(function(current){ - return current.isDamaged(); - })){ + gwshenyu: { + trigger: { player: "phaseBegin" }, + direct: true, + filter(event, player) { + if ( + game.hasPlayer(function (current) { + return current.isDamaged(); + }) + ) { return true; } - for(var i=0;i= 3 && !player.needsToDiscard()) return 1; + if (player.hp == 2 && player.hasShan() && player.countCards("h") <= 1) + return 1; + return 0; + }) + .set("choiceList", ["回复1点体力", "从弃牌堆中获得一张非金法术"]); } - else if(event.target.isHealthy()){ - event.directbool=true; - } - else{ - event.target.chooseControl(function(event,player){ - if(player.hp>=3&&!player.needsToDiscard()) return 1; - if(player.hp==2&&player.hasShan()&&player.countCards('h')<=1) return 1; - return 0; - }).set('choiceList',[ - '回复1点体力','从弃牌堆中获得一张非金法术' - ]); - } - } - else{ + } else { event.finish(); } - 'step 2' - if(!event.directbool&&result.index==0){ + ("step 2"); + if (!event.directbool && result.index == 0) { event.target.recover(); event.finish(); } - 'step 3' - var list=event.list; - if(list.length){ - event.target.chooseCardButton('选择一张法术牌',list,true).ai=function(button){ + ("step 3"); + var list = event.list; + if (list.length) { + event.target.chooseCardButton("选择一张法术牌", list, true).ai = function (button) { return get.value(button.link); }; - } - else{ + } else { event.finish(); } - 'step 4' - if(result.bool){ - result.links[0].vanishtag.add('_gwshenyu'); - event.target.gain(result.links,'gain2','log'); + ("step 4"); + if (result.bool) { + result.links[0].vanishtag.add("_gwshenyu"); + event.target.gain(result.links, "gain2", "log"); } }, - ai:{ - threaten:2, - expose:0.2 - } - }, - junchi:{ - trigger:{global:'shaAfter'}, - direct:true, - usable:1, - filter(event,player){ - return event.player!=player&&event.target!=player&&event.target.isIn()&&player.hasCard(function(card){ - return player.canUse(card,event.target,false)&&!get.info(card).multitarget; - }); + ai: { + threaten: 2, + expose: 0.2, }, - content(){ - var next=player.chooseToUse(get.prompt('junchi'),trigger.target,-1).set('targetRequired',true); - next.prompt2='对'+get.translation(trigger.target)+'使用一张牌,并摸一张牌'; - next.filterCard=function(card){ - return player.canUse(card,trigger.target,false)&&!get.info(card).multitarget; + }, + junchi: { + trigger: { global: "shaAfter" }, + direct: true, + usable: 1, + filter(event, player) { + return ( + event.player != player && + event.target != player && + event.target.isIn() && + player.hasCard(function (card) { + return player.canUse(card, event.target, false) && !get.info(card).multitarget; + }) + ); + }, + content() { + var next = player + .chooseToUse(get.prompt("junchi"), trigger.target, -1) + .set("targetRequired", true); + next.prompt2 = "对" + get.translation(trigger.target) + "使用一张牌,并摸一张牌"; + next.filterCard = function (card) { + return player.canUse(card, trigger.target, false) && !get.info(card).multitarget; }; - next.oncard=function(){ + next.oncard = function () { player.draw(); }; - next.logSkill='junchi'; + next.logSkill = "junchi"; }, - subSkill:{ - gold:{ - trigger:{global:'useCardAfter'}, - frequent:true, - filter(event,player){ - return event.player!=player&&get.subtype(event.card)=='spell_gold'; + subSkill: { + gold: { + trigger: { global: "useCardAfter" }, + frequent: true, + filter(event, player) { + return event.player != player && get.subtype(event.card) == "spell_gold"; }, - content(){ + content() { player.insertPhase(); - } - } + }, + }, }, // group:'junchi_gold' }, - junchi_old:{ - trigger:{global:'shaAfter'}, - forced:true, - popup:false, - filter(event,player){ - return event.player!=player&&event.target!=player&&event.player.isIn()&&event.player.countCards('he')>0; + junchi_old: { + trigger: { global: "shaAfter" }, + forced: true, + popup: false, + filter(event, player) { + return ( + event.player != player && + event.target != player && + event.player.isIn() && + event.player.countCards("he") > 0 + ); }, - content(){ - 'step 0' - var att=get.attitude(trigger.player,player); - trigger.player.chooseCard('he','是否交给'+get.translation(player)+'一张牌?').ai=function(card){ - if(att>1){ - if(trigger.target.isIn()){ - return 9-get.value(card); + content() { + "step 0"; + var att = get.attitude(trigger.player, player); + trigger.player.chooseCard("he", "是否交给" + get.translation(player) + "一张牌?").ai = + function (card) { + if (att > 1) { + if (trigger.target.isIn()) { + return 9 - get.value(card); + } + return 4 - get.value(card); } - return 4-get.value(card); - } - return 0; - } - 'step 1' - if(result.bool){ - player.logSkill('junchi'); - player.gain(result.cards,trigger.player); - if(get.position(result.cards[0])=='h'){ - trigger.player.$giveAuto(result.cards,player); - } - else{ - trigger.player.$give(result.cards,player); + return 0; + }; + ("step 1"); + if (result.bool) { + player.logSkill("junchi"); + player.gain(result.cards, trigger.player); + if (get.position(result.cards[0]) == "h") { + trigger.player.$giveAuto(result.cards, player); + } else { + trigger.player.$give(result.cards, player); } trigger.player.addExpose(0.2); - trigger.player.line(player,'green'); - } - else{ + trigger.player.line(player, "green"); + } else { event.finish(); } - 'step 2' - if(trigger.target.isIn()){ - var next=player.chooseToUse('是否对'+get.translation(trigger.target)+'使用一张牌?',trigger.target,-1).set('targetRequired',true); - next.filterCard=function(card){ - return player.canUse(card,trigger.target,false)&&!get.info(card).multitarget; + ("step 2"); + if (trigger.target.isIn()) { + var next = player + .chooseToUse( + "是否对" + get.translation(trigger.target) + "使用一张牌?", + trigger.target, + -1 + ) + .set("targetRequired", true); + next.filterCard = function (card) { + return player.canUse(card, trigger.target, false) && !get.info(card).multitarget; }; - next.oncard=function(){ + next.oncard = function () { player.recover(); trigger.player.draw(); - } + }; } - } + }, }, - hupeng:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('he')>0; + hupeng: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - check(card){ - return 7-get.value(card); + filterCard: true, + check(card) { + return 7 - get.value(card); }, - filterTarget:true, - content(){ - 'step 0' - var att=get.attitude(player,target); - player.chooseVCardButton('选择令'+get.translation(target)+'获得的牌',['gw_dudayuanshuai1','gw_dudayuanshuai2'],true).ai=function(button){ - if(att>0){ - return button.link[2]=='gw_dudayuanshuai1'?1:-1; + filterTarget: true, + content() { + "step 0"; + var att = get.attitude(player, target); + player.chooseVCardButton( + "选择令" + get.translation(target) + "获得的牌", + ["gw_dudayuanshuai1", "gw_dudayuanshuai2"], + true + ).ai = function (button) { + if (att > 0) { + return button.link[2] == "gw_dudayuanshuai1" ? 1 : -1; + } else { + return button.link[2] == "gw_dudayuanshuai2" ? 1 : -1; } - else{ - return button.link[2]=='gw_dudayuanshuai2'?1:-1; - } - } - 'step 1' - if(result.bool){ - target.gain(game.createCard(result.links[0][2]),'gain2'); + }; + ("step 1"); + if (result.bool) { + target.gain(game.createCard(result.links[0][2]), "gain2"); } }, - ai:{ - threaten:1.5, - order:6, - result:{ - target(player,target){ - var nh=target.countCards('h'); - if(get.attitude(player,target)>0){ - if(!nh) return 3; - if(!target.needsToDiscard(1)){ - if(nh==1) return 2.5; + ai: { + threaten: 1.5, + order: 6, + result: { + target(player, target) { + var nh = target.countCards("h"); + if (get.attitude(player, target) > 0) { + if (!nh) return 3; + if (!target.needsToDiscard(1)) { + if (nh == 1) return 2.5; return 2; } - if(!target.needsToDiscard()) return 1; + if (!target.needsToDiscard()) return 1; return 0.1; - } - else{ - if(!nh) return -0.05; - if(target.hp==1) return -1; - if(target.hp==2) return -2.5; - if(target.hp==3) return -2; + } else { + if (!nh) return -0.05; + if (target.hp == 1) return -1; + if (target.hp == 2) return -2.5; + if (target.hp == 3) return -2; return -0.5; } - } - } + }, + }, }, - global:['hupeng2','hupeng3','hupeng4'] + global: ["hupeng2", "hupeng3", "hupeng4"], }, - hupeng2:{ - mod:{ - cardDiscardable(card,player){ - if(card.name=='gw_dudayuanshuai2') return false; + hupeng2: { + mod: { + cardDiscardable(card, player) { + if (card.name == "gw_dudayuanshuai2") return false; }, - cardEnabled(card,player){ - if(card.name=='gw_dudayuanshuai2') return false; + cardEnabled(card, player) { + if (card.name == "gw_dudayuanshuai2") return false; }, - cardUsable(card,player){ - if(card.name=='gw_dudayuanshuai2') return false; + cardUsable(card, player) { + if (card.name == "gw_dudayuanshuai2") return false; }, - cardRespondable(card,player){ - if(card.name=='gw_dudayuanshuai2') return false; + cardRespondable(card, player) { + if (card.name == "gw_dudayuanshuai2") return false; }, - cardSavable(card,player){ - if(card.name=='gw_dudayuanshuai2') return false; + cardSavable(card, player) { + if (card.name == "gw_dudayuanshuai2") return false; }, }, - ai:{ - effect:{ - target(card,player,target){ - if(target.countCards('h','gw_dudayuanshuai1')&&get.attitude(player,target)<0){ + ai: { + effect: { + target(card, player, target) { + if ( + target.countCards("h", "gw_dudayuanshuai1") && + get.attitude(player, target) < 0 + ) { return 0.4; } - } - } - } - }, - hupeng3:{ - trigger:{player:'phaseEnd'}, - silent:true, - filter(event,player){ - return player.countCards('h','gw_dudayuanshuai2')>0; + }, + }, }, - content(){ - var hs=player.getCards('h'); - var hs2=player.getCards('h','gw_dudayuanshuai2'); + }, + hupeng3: { + trigger: { player: "phaseEnd" }, + silent: true, + filter(event, player) { + return player.countCards("h", "gw_dudayuanshuai2") > 0; + }, + content() { + var hs = player.getCards("h"); + var hs2 = player.getCards("h", "gw_dudayuanshuai2"); hs.remove(hs2); - if(hs.length){ + if (hs.length) { hs2.addArray(hs.randomGets(hs2.length)); } player.discard(hs2); - } - }, - hupeng4:{ - trigger:{target:'useCardToBefore'}, - forced:true, - popup:false, - filter(event,player){ - if(event.player==player) return false; - var num=player.countCards('h','gw_dudayuanshuai1'); - return num>0; }, - content(){ - 'step 0' - player.chooseToUse({name:'gw_dudayuanshuai1'},'是否对'+get.translation(trigger.card)+'使用【杜达元帅】?').set('ai1',function(card){ - return _status.event.bool; - }).set('bool',-get.effect(player,trigger.card,trigger.player,player)); - trigger.gw_dudayuanshuai1=true; - 'step 1' - delete trigger.gw_dudayuanshuai1; - } }, - hunmo:{ - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(function(current){ - return lib.skill.hunmo.filterTarget(null,player,current); + hupeng4: { + trigger: { target: "useCardToBefore" }, + forced: true, + popup: false, + filter(event, player) { + if (event.player == player) return false; + var num = player.countCards("h", "gw_dudayuanshuai1"); + return num > 0; + }, + content() { + "step 0"; + player + .chooseToUse( + { name: "gw_dudayuanshuai1" }, + "是否对" + get.translation(trigger.card) + "使用【杜达元帅】?" + ) + .set("ai1", function (card) { + return _status.event.bool; + }) + .set("bool", -get.effect(player, trigger.card, trigger.player, player)); + trigger.gw_dudayuanshuai1 = true; + ("step 1"); + delete trigger.gw_dudayuanshuai1; + }, + }, + hunmo: { + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(function (current) { + return lib.skill.hunmo.filterTarget(null, player, current); }); }, - filterTarget(card,player,target){ - if(target==player) return false; - if(target.hasSkill('hunmo2')) return false; - var nh=player.countCards('h'); - var nh2=target.countCards('h'); - if(nh<2) return nh2<2; - return nh2>=2&&target.countDiscardableCards(player,'h')>0; + filterTarget(card, player, target) { + if (target == player) return false; + if (target.hasSkill("hunmo2")) return false; + var nh = player.countCards("h"); + var nh2 = target.countCards("h"); + if (nh < 2) return nh2 < 2; + return nh2 >= 2 && target.countDiscardableCards(player, "h") > 0; }, - prompt(event){ - var nh=event.player.countCards('h'); - if(nh<2) return '选择一名手牌数小于2的其他角色,观看牌堆顶的两张牌,你获得一张并交给其另一张'; - return '选择一名手牌数大于2的其他角色,你弃置一张手牌,然后观看并弃置其一张手牌'; + prompt(event) { + var nh = event.player.countCards("h"); + if (nh < 2) + return "选择一名手牌数小于2的其他角色,观看牌堆顶的两张牌,你获得一张并交给其另一张"; + return "选择一名手牌数大于2的其他角色,你弃置一张手牌,然后观看并弃置其一张手牌"; }, - content(){ - 'step 0' - target.addTempSkill('hunmo2'); - var nh=player.countCards('h'); - if(nh<2){ - event.cards=get.cards(2); - player.chooseCardButton(event.cards,'获得一张牌并交给'+get.translation(target)+'另一张牌',true); + content() { + "step 0"; + target.addTempSkill("hunmo2"); + var nh = player.countCards("h"); + if (nh < 2) { + event.cards = get.cards(2); + player.chooseCardButton( + event.cards, + "获得一张牌并交给" + get.translation(target) + "另一张牌", + true + ); + } else { + player.chooseToDiscard("h", true).delay = false; + event.discard = true; } - else{ - player.chooseToDiscard('h',true).delay=false; - event.discard=true; - } - 'step 1' - if(event.discard){ - player.discardPlayerCard(target,'h',true,'visible'); - } - else{ - if(result.links&&result.links.length){ - player.gain(result.links,false); + ("step 1"); + if (event.discard) { + player.discardPlayerCard(target, "h", true, "visible"); + } else { + if (result.links && result.links.length) { + player.gain(result.links, false); event.cards.remove(result.links[0]); - target.gain(event.cards,false); + target.gain(event.cards, false); player.$drawAuto(result.links); target.$drawAuto(event.cards); } } - 'step 2' + ("step 2"); game.delay(); }, - ai:{ - order(){ - var player=_status.event.player; - if(player.countCards('h')<2) return 11; + ai: { + order() { + var player = _status.event.player; + if (player.countCards("h") < 2) return 11; return 6; }, - threaten:1.2, - result:{ - target(player,target){ - if(player.countCards('h')<2) return 1; - if(player.hasCard(function(card){ - return get.value(card)<=5 - })){ + threaten: 1.2, + result: { + target(player, target) { + if (player.countCards("h") < 2) return 1; + if ( + player.hasCard(function (card) { + return get.value(card) <= 5; + }) + ) { return -1; } - } - } + }, + }, }, // group:'hunmo_draw', - subSkill:{ - draw:{ - trigger:{player:'phaseEnd'}, - filter(event,player){ - return player.getStat('skill').hunmo>=3; + subSkill: { + draw: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return player.getStat("skill").hunmo >= 3; }, - frequent:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('魂墨:造成1点伤害')).ai=function(target){ - return get.damageEffect(target,player,player); - } - 'step 1' - if(result.bool){ - player.logSkill('hunmo_draw',result.targets); + frequent: true, + content() { + "step 0"; + player.chooseTarget(get.prompt("魂墨:造成1点伤害")).ai = function (target) { + return get.damageEffect(target, player, player); + }; + ("step 1"); + if (result.bool) { + player.logSkill("hunmo_draw", result.targets); result.targets[0].damage(); } - } + }, }, - } - }, - hunmo2:{}, - hunmo3:{}, - shuijian:{ - trigger:{player:'phaseBegin'}, - direct:true, - filter(event,player){ - return player.countCards('h')>0; }, - content(){ - 'step 0' - var targets=player.getEnemies(); - var num=0; - for(var i=0;i 0; + }, + content() { + "step 0"; + var targets = player.getEnemies(); + var num = 0; + for (var i = 0; i < targets.length; i++) { + num += get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); } - event.targets=targets; - player.chooseToDiscard(get.prompt('shuijian')).set('ai',function(card){ - if(num>=3) return 10-get.value(card); - if(num>=2) return 9-get.value(card); - if(num>=1) return 7-get.value(card); + event.targets = targets; + player.chooseToDiscard(get.prompt("shuijian")).set("ai", function (card) { + if (num >= 3) return 10 - get.value(card); + if (num >= 2) return 9 - get.value(card); + if (num >= 1) return 7 - get.value(card); return 0; - }).logSkill='shuijian'; - 'step 1' - if(result.bool){ - for(var i=0;i0){ + } else { + game.countPlayer(function (current) { + var att = get.attitude(player, current); + if (att > 0) { num1++; - } - else if(att<0){ + } else if (att < 0) { num2++; } }); - choice=(num1>num2)?'选项一':'选项二'; + choice = num1 > num2 ? "选项一" : "选项二"; } - player.chooseControl('选项一','选项二','cancel2',function(){ - return choice; - }).set('prompt',get.prompt('gwtianbian')).set('choiceList',['随机使用一张对全场有正面效果的牌','随机使用一张对全场有负面效果的牌']); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('gwtianbian'); - var list=[]; - for(var i in lib.card){ - if(lib.inpile.includes(i)&& - lib.card[i].selectTarget==-1&& - lib.card[i].type!='equip'&& - lib.card[i].ai&&lib.card[i].ai.tag&& - lib.card[i].ai.tag.multitarget){ - if(lib.card[i].ai.tag.multineg){ - if(result.control=='选项二'){ + player + .chooseControl("选项一", "选项二", "cancel2", function () { + return choice; + }) + .set("prompt", get.prompt("gwtianbian")) + .set("choiceList", [ + "随机使用一张对全场有正面效果的牌", + "随机使用一张对全场有负面效果的牌", + ]); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("gwtianbian"); + var list = []; + for (var i in lib.card) { + if ( + lib.inpile.includes(i) && + lib.card[i].selectTarget == -1 && + lib.card[i].type != "equip" && + lib.card[i].ai && + lib.card[i].ai.tag && + lib.card[i].ai.tag.multitarget + ) { + if (lib.card[i].ai.tag.multineg) { + if (result.control == "选项二") { list.push(i); } - } - else{ - if(result.control=='选项一'){ + } else { + if (result.control == "选项一") { list.push(i); } } } } - var name=null; - while(list.length){ - name=list.randomRemove(); - if(game.hasPlayer(function(current){ - return player.canUse(name,current) - })){ + var name = null; + while (list.length) { + name = list.randomRemove(); + if ( + game.hasPlayer(function (current) { + return player.canUse(name, current); + }) + ) { break; - } - else{ - name=null; + } else { + name = null; } } - if(name){ - var targets=game.filterPlayer(function(current){ - return player.canUse(name,current); + if (name) { + var targets = game.filterPlayer(function (current) { + return player.canUse(name, current); }); targets.sortBySeat(); - player.useCard({name:name},targets); + player.useCard({ name: name }, targets); } } - } + }, }, - gwxiaoshou:{ - enable:'phaseUse', - usable:2, - filterTarget(card,player,target){ + gwxiaoshou: { + enable: "phaseUse", + usable: 2, + filterTarget(card, player, target) { return target.isMaxHp(); }, - check(card){return 7-get.value(card);}, - position:'he', - filterCard:true, - content(){ + check(card) { + return 7 - get.value(card); + }, + position: "he", + filterCard: true, + content() { target.damage(); }, - ai:{ - result:{ - target(player,target){ - return get.damageEffect(target,player); + ai: { + result: { + target(player, target) { + return get.damageEffect(target, player); }, }, - order:7 - } + order: 7, + }, }, - kuanglie:{ - trigger:{player:'useCardToBegin'}, - filter(event,player){ - return event.target&&event.target!=player&&event.target.countCards('he')>0&&get.color(event.card)=='black'; + kuanglie: { + trigger: { player: "useCardToBegin" }, + filter(event, player) { + return ( + event.target && + event.target != player && + event.target.countCards("he") > 0 && + get.color(event.card) == "black" + ); }, - init(player){ - player.storage.kuanglie=0; + init(player) { + player.storage.kuanglie = 0; }, - forced:true, - content(){ + forced: true, + content() { trigger.target.randomDiscard(); player.storage.kuanglie++; - if(player.storage.kuanglie%2==0){ + if (player.storage.kuanglie % 2 == 0) { player.draw(); } - } + }, }, - kuanglie2:{}, - gwjiquan:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('he')>0; + kuanglie2: {}, + gwjiquan: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("he") > 0; }, - selectTarget:[1,Infinity], - content(){ - 'step 0' - player.gainPlayerCard(target,'he',true); - 'step 1' - target.useCard({name:'sha'},player); + selectTarget: [1, Infinity], + content() { + "step 0"; + player.gainPlayerCard(target, "he", true); + ("step 1"); + target.useCard({ name: "sha" }, player); }, - ai:{ - threaten:1.4, - order:7, - result:{ - target(player,target){ - if(player.getEquip('tengjia')||player.hasSkillTag('freeShan',false,{ - player:target, - card:new lib.element.VCard({name:'sha'}) - })) return -1; - if(get.effect(player,{name:'sha'},target,player)>=0) return -1; - if(!player.hasShan()){ - if(ui.selected.targets.length) return 0; - if(player.hp>=4) return -1; - if(player.hp>=3&&target.hp==1) return -1; + ai: { + threaten: 1.4, + order: 7, + result: { + target(player, target) { + if ( + player.getEquip("tengjia") || + player.hasSkillTag("freeShan", false, { + player: target, + card: new lib.element.VCard({ name: "sha" }), + }) + ) + return -1; + if (get.effect(player, { name: "sha" }, target, player) >= 0) return -1; + if (!player.hasShan()) { + if (ui.selected.targets.length) return 0; + if (player.hp >= 4) return -1; + if (player.hp >= 3 && target.hp == 1) return -1; return 0; } - var num=player.countCards('h','shan'); - if(num<1){ - num=1; + var num = player.countCards("h", "shan"); + if (num < 1) { + num = 1; } - if(ui.selected.targets.length>=num){ + if (ui.selected.targets.length >= num) { return 0; } return -1; - } - } - } - }, - nuhou_old:{ - enable:'phaseUse', - usable:1, - position:'he', - filterCard:true, - check(card){ - return 7-get.value(card) + }, + }, }, - content(){ - 'step 0' - var list=player.getEnemies(); + }, + nuhou_old: { + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + check(card) { + return 7 - get.value(card); + }, + content() { + "step 0"; + var list = player.getEnemies(); list.sortBySeat(); - event.list=list; - 'step 1' - if(event.list.length){ - var current=event.list.shift(); - var he=current.getCards('he'); - player.line(current,'green'); - if(he.length){ + event.list = list; + ("step 1"); + if (event.list.length) { + var current = event.list.shift(); + var he = current.getCards("he"); + player.line(current, "green"); + if (he.length) { current.discard(he.randomGet()); current.addExpose(0.2); } event.redo(); } }, - ai:{ - order:8.5, - result:{ - player:1 + ai: { + order: 8.5, + result: { + player: 1, }, }, }, - nuhou:{ - trigger:{player:'damageEnd'}, - direct:true, - filter(event,player){ - return player.countCards('he')>0; + nuhou: { + trigger: { player: "damageEnd" }, + direct: true, + filter(event, player) { + return player.countCards("he") > 0; }, - content(){ - 'step 0' - player.chooseToDiscard(get.prompt2('nuhou'),'he').set('ai',function(card){ - return 8-get.useful(card); - }).set('logSkill','nuhou'); - 'step 1' - if(result.bool){ - var targets=player.getEnemies(); - if(targets.length){ - var target=targets.randomGet(); - player.line(target,'green'); + content() { + "step 0"; + player + .chooseToDiscard(get.prompt2("nuhou"), "he") + .set("ai", function (card) { + return 8 - get.useful(card); + }) + .set("logSkill", "nuhou"); + ("step 1"); + if (result.bool) { + var targets = player.getEnemies(); + if (targets.length) { + var target = targets.randomGet(); + player.line(target, "green"); target.damage(); target.randomDiscard(); } } }, - ai:{ - threaten:0.8, - maixie:true, - maixie_hp:true, - maixie_defend:true, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - var nh=target.countCards('he'); - if(player.hasSkillTag('jueqing',false,target)||nh==0) return [1,-2]; - if(!target.hasFriend()||nh<=1) return; - if(target.hp>=2) return [1,get.tag(card,'damage')*0.5]; + ai: { + threaten: 0.8, + maixie: true, + maixie_hp: true, + maixie_defend: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + var nh = target.countCards("he"); + if (player.hasSkillTag("jueqing", false, target) || nh == 0) return [1, -2]; + if (!target.hasFriend() || nh <= 1) return; + if (target.hp >= 2) return [1, get.tag(card, "damage") * 0.5]; } - } - } - } + }, + }, + }, }, - shewu:{ - enable:'phaseUse', - usable:1, - position:'he', - filterCard:true, - selectCard:[1,3], - check(card){ - if(!ui.selected.cards.length){ - return 8-get.value(card) + shewu: { + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + selectCard: [1, 3], + check(card) { + if (!ui.selected.cards.length) { + return 8 - get.value(card); } - var player=_status.event.player; - if(player.isDamaged()){ - var hs=player.getCards('h'); - var num=0; - for(var i=0;i=3){ - return 6-get.value(card); + if (num >= 3) { + return 6 - get.value(card); } } return 0; }, - content(){ + content() { player.draw(3); - if(cards.length>=2){ - player.addTempSkill('shewu_dist'); + if (cards.length >= 2) { + player.addTempSkill("shewu_dist"); } - if(cards.length==3){ + if (cards.length == 3) { player.recover(); } }, - ai:{ - order:4, - result:{ - player:1 + ai: { + order: 4, + result: { + player: 1, }, - threaten:1.6 + threaten: 1.6, }, - subSkill:{ - dist:{ - mod:{ - targetInRange(){ + subSkill: { + dist: { + mod: { + targetInRange() { return true; - } - } - } - } - }, - gwzhanjiang:{ - trigger:{global:'phaseBegin'}, - direct:true, - filter(event,player){ - return !player.hasSkill('gwzhanjiang2')&&event.player!=player; + }, + }, + }, }, - content(){ - 'step 0' - var bool=(get.effect(trigger.player,{name:'sha'},player,player)>0&& - Math.abs(get.attitude(player,trigger.player))>1&& - game.hasPlayer(function(current){ - return get.attitude(current,player)>0&¤t.hasSha(); - })); - var next=player.chooseToDiscard(get.prompt('gwzhanjiang',trigger.player),'he'); - next.ai=function(card){ - if(bool) return 7-get.value(card); + }, + gwzhanjiang: { + trigger: { global: "phaseBegin" }, + direct: true, + filter(event, player) { + return !player.hasSkill("gwzhanjiang2") && event.player != player; + }, + content() { + "step 0"; + var bool = + get.effect(trigger.player, { name: "sha" }, player, player) > 0 && + Math.abs(get.attitude(player, trigger.player)) > 1 && + game.hasPlayer(function (current) { + return get.attitude(current, player) > 0 && current.hasSha(); + }); + var next = player.chooseToDiscard(get.prompt("gwzhanjiang", trigger.player), "he"); + next.ai = function (card) { + if (bool) return 7 - get.value(card); return 0; }; - next.logSkill=['gwzhanjiang',trigger.player]; - 'step 1' - if(result.bool){ - player.addTempSkill('gwzhanjiang2',{player:'phaseBegin'}); - event.targets=game.filterPlayer(function(current){ - return current!=trigger.player; + next.logSkill = ["gwzhanjiang", trigger.player]; + ("step 1"); + if (result.bool) { + player.addTempSkill("gwzhanjiang2", { player: "phaseBegin" }); + event.targets = game.filterPlayer(function (current) { + return current != trigger.player; }); event.targets.sortBySeat(trigger.player); - event.num=0; - } - else{ + event.num = 0; + } else { event.finish(); } - 'step 2' - if(event.targets.length){ - event.current=event.targets.shift(); - if(event.current.hasSha()){ - event.current.chooseToUse({name:'sha'},'是否对'+get.translation(trigger.player)+'使用一张杀?',trigger.player,-1).oncard=function(card,player){ + ("step 2"); + if (event.targets.length) { + event.current = event.targets.shift(); + if (event.current.hasSha()) { + event.current.chooseToUse( + { name: "sha" }, + "是否对" + get.translation(trigger.player) + "使用一张杀?", + trigger.player, + -1 + ).oncard = function (card, player) { player.draw(); }; - } - else{ + } else { event.redo(); } - } - else{ + } else { event.finish(); } - 'step 3' - if(result.bool){ + ("step 3"); + if (result.bool) { event.num++; - if(event.num>=2){ + if (event.num >= 2) { return; } } event.goto(2); }, - ai:{ - expose:0.2, - threaten:1.4 + ai: { + expose: 0.2, + threaten: 1.4, }, }, - gwzhanjiang2:{}, - gwzhanjiang3:{ - trigger:{player:'useCard'}, - filter(event){ - return event.card.name=='sha'&&event.getParent(2).name=='gwzhanjiang'; + gwzhanjiang2: {}, + gwzhanjiang3: { + trigger: { player: "useCard" }, + filter(event) { + return event.card.name == "sha" && event.getParent(2).name == "gwzhanjiang"; }, - forced:true, - popup:false, - content(){ + forced: true, + popup: false, + content() { player.draw(); - } + }, }, - gwchuanxin_old:{ - trigger:{player:'shaAfter'}, - filter(event,player){ - if(player.storage.gwchuanxin&&player.storage.gwchuanxin.length>=4) return false; + gwchuanxin_old: { + trigger: { player: "shaAfter" }, + filter(event, player) { + if (player.storage.gwchuanxin && player.storage.gwchuanxin.length >= 4) return false; return event.target.isAlive(); }, - check(event,player){ - return get.effect(event.target,{name:'sha'},player,player)>0 + check(event, player) { + return get.effect(event.target, { name: "sha" }, player, player) > 0; }, - logTarget:'target', - logLine:false, - content(){ - 'step 0' - event.card=get.cards()[0]; - player.showCards(event.card,get.translation(player)+'对'+get.translation(trigger.player)+'发动了【穿心】'); - 'step 1' - if(player.storage.gwchuanxin&&!player.storage.gwchuanxin.includes(get.suit(event.card))){ - player.useCard({name:'sha'},[event.card],trigger.target,false); + logTarget: "target", + logLine: false, + content() { + "step 0"; + event.card = get.cards()[0]; + player.showCards( + event.card, + get.translation(player) + "对" + get.translation(trigger.player) + "发动了【穿心】" + ); + ("step 1"); + if ( + player.storage.gwchuanxin && + !player.storage.gwchuanxin.includes(get.suit(event.card)) + ) { + player.useCard({ name: "sha" }, [event.card], trigger.target, false); } }, - group:['gwchuanxin_count1','gwchuanxin_count2'], - subSkill:{ - count1:{ - trigger:{global:'phaseBegin'}, - silent:true, - content(){ - player.storage.gwchuanxin=[]; - } + group: ["gwchuanxin_count1", "gwchuanxin_count2"], + subSkill: { + count1: { + trigger: { global: "phaseBegin" }, + silent: true, + content() { + player.storage.gwchuanxin = []; + }, }, - count2:{ - trigger:{player:'useCard'}, - silent:true, + count2: { + trigger: { player: "useCard" }, + silent: true, // filter(event){ // return event.card&&event.card.name=='sha'; // }, - content(){ - for(var i=0;i0 + check(event, player) { + return get.effect(event.target, { name: "sha" }, player, player) > 0; }, - logTarget:'target', + logTarget: "target", // logLine:false, - content(){ - 'step 0' - var cards=get.cards(); - player.showCards(cards,get.translation(player)+'发动了【穿心】'); - event.bool=(get.color(cards[0])=='black'); - 'step 1' - if(event.bool){ - player.useCard({name:'sha'},trigger.target,false).animate=false; + content() { + "step 0"; + var cards = get.cards(); + player.showCards(cards, get.translation(player) + "发动了【穿心】"); + event.bool = get.color(cards[0]) == "black"; + ("step 1"); + if (event.bool) { + player.useCard({ name: "sha" }, trigger.target, false).animate = false; } }, - mod:{ - attackFrom(from,to,distance){ - return distance-from.hp+1; - } - } + mod: { + attackFrom(from, to, distance) { + return distance - from.hp + 1; + }, + }, }, - fengjian:{ - trigger:{player:'useCard'}, - direct:true, - filter(event,player){ - var type=get.type(event.card,'trick'); - return type=='trick'&&game.hasPlayer(function(current){ - return player.canUse('sha',current,false)&&!event.targets.includes(current); - }); + fengjian: { + trigger: { player: "useCard" }, + direct: true, + filter(event, player) { + var type = get.type(event.card, "trick"); + return ( + type == "trick" && + game.hasPlayer(function (current) { + return player.canUse("sha", current, false) && !event.targets.includes(current); + }) + ); }, - content(){ - "step 0" - player.chooseTarget(get.prompt('fengjian'),function(card,player,target){ - return player.canUse('sha',target,false)&&!trigger.targets.includes(target); - }).ai=function(target){ - return get.effect(target,{name:'sha',nature:'thunder'},player,player); - } - "step 1" - if(result.bool){ - player.logSkill('fengjian'); - if(!event.isMine()){ + content() { + "step 0"; + player.chooseTarget(get.prompt("fengjian"), function (card, player, target) { + return player.canUse("sha", target, false) && !trigger.targets.includes(target); + }).ai = function (target) { + return get.effect(target, { name: "sha", nature: "thunder" }, player, player); + }; + ("step 1"); + if (result.bool) { + player.logSkill("fengjian"); + if (!event.isMine()) { game.delay(); } - player.useCard({name:'sha',nature:'thunder'},result.targets,false); + player.useCard({ name: "sha", nature: "thunder" }, result.targets, false); player.tempHide(); } }, - ai:{ - expose:0.2, - threaten:1.5, - noautowuxie:true, + ai: { + expose: 0.2, + threaten: 1.5, + noautowuxie: true, }, // group:'fengjian_hide', // subSkill:{ @@ -3110,1595 +3288,1719 @@ game.import('character', function () { // } // } }, - huandie:{ - trigger:{player:'phaseBegin'}, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('huandie'),[0,game.countPlayer()],function(card,player,target){ - return target!=player; - }).ai=function(target){ - return get.attitude(player,target); - } - 'step 1' - if(result.bool){ + huandie: { + trigger: { player: "phaseBegin" }, + direct: true, + content() { + "step 0"; + player.chooseTarget( + get.prompt("huandie"), + [0, game.countPlayer()], + function (card, player, target) { + return target != player; + } + ).ai = function (target) { + return get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { result.targets.sortBySeat(); result.targets.unshift(player); - player.logSkill('huandie',result.targets); - game.asyncDrawAuto(result.targets,function(current){ - return current==player?1:2; + player.logSkill("huandie", result.targets); + game.asyncDrawAuto(result.targets, function (current) { + return current == player ? 1 : 2; }); - player.addTempSkill('huandie_discard'); + player.addTempSkill("huandie_discard"); } }, - ai:{ - threaten:1.5 + ai: { + threaten: 1.5, }, - subSkill:{ - discard:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('h')>current.hp; + subSkill: { + discard: { + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") > current.hp; }); }, - logTarget(){ - return game.filterPlayer(function(current){ - return current.countCards('h')>current.hp; - }).sortBySeat(); + logTarget() { + return game + .filterPlayer(function (current) { + return current.countCards("h") > current.hp; + }) + .sortBySeat(); }, - content(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current.countCards('h')>current.hp; - }).sortBySeat(); - event.list=list; - 'step 1' - if(event.list.length){ - event.list.shift().chooseToDiscard('h',true,2); + content() { + "step 0"; + var list = game + .filterPlayer(function (current) { + return current.countCards("h") > current.hp; + }) + .sortBySeat(); + event.list = list; + ("step 1"); + if (event.list.length) { + event.list.shift().chooseToDiscard("h", true, 2); event.redo(); } - } - } - } - }, - xuezhou:{ - trigger:{player:'phaseBegin'}, - direct:true, - unique:true, - forceunique:true, - intro:{ - content(storage,player){ - var name=get.translation(player); - if(storage==1){ - return '每当一名角色('+name+'除外)受到一次伤害,该角色失去1点体力,'+name+'回复1点体力'; - } - else if(storage==2){ - return '每当一名角色('+name+'除外)造成一次伤害,该角色失去1点体力,'+name+'(若不是受伤害角色)回复1点体力'; - } - else{ - return '未发动'; - } - } + }, + }, }, - content(){ - 'step 0' - var next=player.chooseControl('选项一','选项二','cancel2',function(){ - if(Math.random()<0.65) return 0; + }, + xuezhou: { + trigger: { player: "phaseBegin" }, + direct: true, + unique: true, + forceunique: true, + intro: { + content(storage, player) { + var name = get.translation(player); + if (storage == 1) { + return ( + "每当一名角色(" + + name + + "除外)受到一次伤害,该角色失去1点体力," + + name + + "回复1点体力" + ); + } else if (storage == 2) { + return ( + "每当一名角色(" + + name + + "除外)造成一次伤害,该角色失去1点体力," + + name + + "(若不是受伤害角色)回复1点体力" + ); + } else { + return "未发动"; + } + }, + }, + content() { + "step 0"; + var next = player.chooseControl("选项一", "选项二", "cancel2", function () { + if (Math.random() < 0.65) return 0; return 1; }); - next.prompt=get.prompt('xuezhou'); - next.choiceList=[ - '每当一名其他角色在一个回合中首次受到伤害,该角色失去1点体力,你回复1点体力', - '每当一名其他角色在一个回合中首次造成伤害,该角色失去1点体力,你(若不是受伤害角色)回复1点体力' + next.prompt = get.prompt("xuezhou"); + next.choiceList = [ + "每当一名其他角色在一个回合中首次受到伤害,该角色失去1点体力,你回复1点体力", + "每当一名其他角色在一个回合中首次造成伤害,该角色失去1点体力,你(若不是受伤害角色)回复1点体力", ]; - 'step 1' - if(result.control=='cancel2'){ - player.unmarkSkill('xuezhou'); + ("step 1"); + if (result.control == "cancel2") { + player.unmarkSkill("xuezhou"); delete _status.xuezhou; - } - else{ - player.logSkill('xuezhou'); - player.storage.xuezhou=result.index+1; - player.syncStorage('xuezhou'); - player.markSkill('xuezhou'); - _status.xuezhou=player; + } else { + player.logSkill("xuezhou"); + player.storage.xuezhou = result.index + 1; + player.syncStorage("xuezhou"); + player.markSkill("xuezhou"); + _status.xuezhou = player; } }, - ai:{ - threaten:2.5 + ai: { + threaten: 2.5, }, - global:'xuezhou_hp' + global: "xuezhou_hp", }, - xuezhou_hp:{ - trigger:{source:'damageEnd',player:'damageEnd'}, - filter(event,player){ - if(!_status.xuezhou) return false; - if(player==_status.xuezhou) return false; - if(!player.isIn()||!_status.xuezhou.isIn()) return false; - if(_status.currentPhase.hasSkill('xuezhou_hp2')) return false; - switch(_status.xuezhou.storage.xuezhou){ - case 1:return player==event.player; - case 2:return player==event.source; - default:return false; + xuezhou_hp: { + trigger: { source: "damageEnd", player: "damageEnd" }, + filter(event, player) { + if (!_status.xuezhou) return false; + if (player == _status.xuezhou) return false; + if (!player.isIn() || !_status.xuezhou.isIn()) return false; + if (_status.currentPhase.hasSkill("xuezhou_hp2")) return false; + switch (_status.xuezhou.storage.xuezhou) { + case 1: + return player == event.player; + case 2: + return player == event.source; + default: + return false; } }, - silent:true, - content(){ - 'step 0' + silent: true, + content() { + "step 0"; game.delayx(); - _status.currentPhase.addTempSkill('xuezhou_hp2'); - 'step 1' - _status.xuezhou.logSkill('xuezhou',player); + _status.currentPhase.addTempSkill("xuezhou_hp2"); + ("step 1"); + _status.xuezhou.logSkill("xuezhou", player); player.loseHp(); - if(_status.xuezhou!=trigger.player){ + if (_status.xuezhou != trigger.player) { _status.xuezhou.recover(); } - } - }, - xuezhou_hp2:{}, - fayin:{ - trigger:{player:'shaBegin'}, - direct:true, - filter(event,player){ - return player.countCards('he')>0; }, - content(){ - 'step 0' - var target=trigger.target; - var bool=get.attitude(player,target)<0; - var next=player.chooseToDiscard('he',get.prompt('fayin',target)); - next.ai=function(card){ - if(bool) return 7-get.value(card); + }, + xuezhou_hp2: {}, + fayin: { + trigger: { player: "shaBegin" }, + direct: true, + filter(event, player) { + return player.countCards("he") > 0; + }, + content() { + "step 0"; + var target = trigger.target; + var bool = get.attitude(player, target) < 0; + var next = player.chooseToDiscard("he", get.prompt("fayin", target)); + next.ai = function (card) { + if (bool) return 7 - get.value(card); return 0; }; - next.logSkill=['fayin',target]; - 'step 1' - if(result.bool){ - var target=trigger.target; - var num=5; - if(target.isMad()){ - num=4; + next.logSkill = ["fayin", target]; + ("step 1"); + if (result.bool) { + var target = trigger.target; + var num = 5; + if (target.isMad()) { + num = 4; } - switch(Math.floor(Math.random()*num)){ - case 0:target.randomDiscard(2);break; - case 1:target.damage('fire');break; - case 2:player.changeHujia();break; - case 3:target.turnOver();target.draw();break; - case 4:target.goMad({player:'phaseBegin'});break; + switch (Math.floor(Math.random() * num)) { + case 0: + target.randomDiscard(2); + break; + case 1: + target.damage("fire"); + break; + case 2: + player.changeHujia(); + break; + case 3: + target.turnOver(); + target.draw(); + break; + case 4: + target.goMad({ player: "phaseBegin" }); + break; } } - } - }, - gwbaquan:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')>0; }, - content(){ - 'step 0' - var hs=target.getCards('h'); - player.gain(hs,target); - target.$giveAuto(hs,player); - event.hs=hs; - 'step 1' - var damage=(target.hp>=player.hp&&get.damageEffect(target,player,player)>0); - var hs=event.hs; - if(damage&&target.hp>1){ - for(var i=0;i=8){ - damage=false;break; + }, + gwbaquan: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content() { + "step 0"; + var hs = target.getCards("h"); + player.gain(hs, target); + target.$giveAuto(hs, player); + event.hs = hs; + ("step 1"); + var damage = target.hp >= player.hp && get.damageEffect(target, player, player) > 0; + var hs = event.hs; + if (damage && target.hp > 1) { + for (var i = 0; i < hs.length; i++) { + if (get.value(hs[i], player, "raw") >= 8) { + damage = false; + break; } } } - player.chooseCard(hs.length,true,'选择还给'+get.translation(target)+'的牌').ai=function(card){ - if(damage){ - return hs.includes(card)?1:0; - } - else{ - return -get.value(card,player,'raw'); - } - } - if(!event.isMine()) game.delay(); - 'step 2' - target.gain(result.cards,player); - player.$giveAuto(result.cards,target); - event.hs2=result.cards; - if(player.hp>target.hp){ + player.chooseCard(hs.length, true, "选择还给" + get.translation(target) + "的牌").ai = + function (card) { + if (damage) { + return hs.includes(card) ? 1 : 0; + } else { + return -get.value(card, player, "raw"); + } + }; + if (!event.isMine()) game.delay(); + ("step 2"); + target.gain(result.cards, player); + player.$giveAuto(result.cards, target); + event.hs2 = result.cards; + if (player.hp > target.hp) { event.finish(); } - 'step 3' - for(var i=0;i0){ - target.draw(dh,false); + }, + hunmo_old: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target.countCards("h") != Math.min(3, player.hp); + }, + selectTarget: [1, 3], + content() { + var dh = Math.min(3, player.hp) - target.countCards("h"); + if (dh > 0) { + target.draw(dh, false); target.$draw(dh); game.delay(0.5); - } - else if(dh<0){ - target.chooseToDiscard(-dh,true); - if(player!=target) player.useCard({name:'sha'},target,false); + } else if (dh < 0) { + target.chooseToDiscard(-dh, true); + if (player != target) player.useCard({ name: "sha" }, target, false); } }, - ai:{ - order:11, - result:{ - target(player,target){ - var dh=Math.min(3,player.hp)-target.countCards('h'); - if(dh<0){ - dh+=get.sgn(get.effect(target,{name:'sha'},player,target)); + ai: { + order: 11, + result: { + target(player, target) { + var dh = Math.min(3, player.hp) - target.countCards("h"); + if (dh < 0) { + dh += get.sgn(get.effect(target, { name: "sha" }, player, target)); } return dh; - } - } - } + }, + }, + }, }, - hunmo_old2:{ - trigger:{player:['phaseBegin','phaseEnd']}, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('hunmo'),[1,game.countPlayer()],function(card,player,target){ - return target.countCards('h')!=Math.min(3,target.hp); - }).ai=function(target){ - return get.attitude(player,target)*(Math.min(3,target.hp)-target.countCards('h')); - } - 'step 1' - if(result.bool){ - player.logSkill('hunmo',result.targets); - event.targets=result.targets.slice(0); + hunmo_old2: { + trigger: { player: ["phaseBegin", "phaseEnd"] }, + direct: true, + content() { + "step 0"; + player.chooseTarget( + get.prompt("hunmo"), + [1, game.countPlayer()], + function (card, player, target) { + return target.countCards("h") != Math.min(3, target.hp); + } + ).ai = function (target) { + return ( + get.attitude(player, target) * (Math.min(3, target.hp) - target.countCards("h")) + ); + }; + ("step 1"); + if (result.bool) { + player.logSkill("hunmo", result.targets); + event.targets = result.targets.slice(0); event.targets.sortBySeat(); - } - else{ + } else { event.finish(); } - 'step 2' - if(event.targets.length){ - var target=event.targets.shift(); - var dh=Math.min(3,target.hp)-target.countCards('h'); - if(dh>0){ - target.draw(dh,false); + ("step 2"); + if (event.targets.length) { + var target = event.targets.shift(); + var dh = Math.min(3, target.hp) - target.countCards("h"); + if (dh > 0) { + target.draw(dh, false); target.$draw(dh); - } - else if(dh<0){ - target.chooseToDiscard(-dh,true).delay=false; + } else if (dh < 0) { + target.chooseToDiscard(-dh, true).delay = false; } game.delay(0.5); event.redo(); } - } + }, }, - huihun:{ - trigger:{player:'phaseEnd'}, - filter(event,player){ - if(!player.storage.huihun) return false; - for(var i=0;i=2) break; + if (list.length >= 2) break; } } - player.gain(list,'gain2','log'); + player.gain(list, "gain2", "log"); }, - ai:{ - threaten:1.8, + ai: { + threaten: 1.8, }, - group:['huihun_count','huihun_count2'], - subSkill:{ - count:{ - trigger:{player:'useCard'}, - silent:true, - filter(event,player){ - return _status.currentPhase==player; + group: ["huihun_count", "huihun_count2"], + subSkill: { + count: { + trigger: { player: "useCard" }, + silent: true, + filter(event, player) { + return _status.currentPhase == player; }, - content(){ - if(!player.storage.huihun){ - player.storage.huihun=[]; + content() { + if (!player.storage.huihun) { + player.storage.huihun = []; } - for(var i=0;i1){ - if(i==0) return 5; + ai: { + basic: { + useful(card, i) { + if (_status.event.player.hp > 1) { + if (i == 0) return 5; return 1; } - if(i==0) return 7.3; + if (i == 0) return 7.3; return 4; }, - value(card,player,i){ - if(player.hp>1){ - if(i==0) return 5; + value(card, player, i) { + if (player.hp > 1) { + if (i == 0) return 5; return 1; } - if(i==0) return 7.3; + if (i == 0) return 7.3; return 4; }, }, - order(){ - return get.order({name:'sha'})+0.2; + order() { + return get.order({ name: "sha" }) + 0.2; }, - result:{ - target(player,target){ - if(target&&target.isDying()) return 2; - if(lib.config.mode=='stone'&&!player.isMin()){ - if(player.getActCount()+1>=player.actcount) return false; + result: { + target(player, target) { + if (target && target.isDying()) return 2; + if (lib.config.mode == "stone" && !player.isMin()) { + if (player.getActCount() + 1 >= player.actcount) return false; } - var shas=player.getCards('h','sha'); - if(shas.length>1&&player.getCardUsable('sha')>1){ + var shas = player.getCards("h", "sha"); + if (shas.length > 1 && player.getCardUsable("sha") > 1) { return 0; } var card; - if(shas.length){ - for(var i=0;i0); - })){ + if (card) { + if ( + game.hasPlayer(function (current) { + return ( + !current.hujia && + get.attitude(target, current) < 0 && + target.canUse(card, current, true, true) && + get.effect(current, card, target) > 0 + ); + }) + ) { return 1; } } return 0; }, }, - } + }, }, - gwmaoxian_yioufeisi:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_yioufeisisp', - enable(){ - return game.countPlayer()>2; + gwmaoxian_yioufeisi: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_yioufeisisp", + enable() { + return game.countPlayer() > 2; }, - filterTarget(card,player,target){ - return target!=player; + filterTarget(card, player, target) { + return target != player; }, - selectTarget:2, - multitarget:true, - multiline:true, - content(){ - 'step 0' - targets[0].useCard({name:'sha'},targets[1],'noai'); - 'step 1' - if(targets[0].isIn()&&targets[1].isIn()){ - targets[1].useCard({name:'sha'},targets[0],'noai'); + selectTarget: 2, + multitarget: true, + multiline: true, + content() { + "step 0"; + targets[0].useCard({ name: "sha" }, targets[1], "noai"); + ("step 1"); + if (targets[0].isIn() && targets[1].isIn()) { + targets[1].useCard({ name: "sha" }, targets[0], "noai"); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - target(player,target){ - return get.effect(target,{name:'sha'},target,target); - } - } - } + ai: { + value: 10, + order: 1, + result: { + target(player, target) { + return get.effect(target, { name: "sha" }, target, target); + }, + }, + }, }, - gwmaoxian_luoqi:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_luoqi', - enable:true, - filterTarget(card,player,target){ - return player.canUse('sha',target,false); + gwmaoxian_luoqi: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_luoqi", + enable: true, + filterTarget(card, player, target) { + return player.canUse("sha", target, false); }, - content(){ - 'step 0' - player.useCard({name:'sha'},target,false).animate=false; - 'step 1' - event.targets=game.filterPlayer(function(current){ - return current.canUse('sha',target,false)&¤t!=player; + content() { + "step 0"; + player.useCard({ name: "sha" }, target, false).animate = false; + ("step 1"); + event.targets = game.filterPlayer(function (current) { + return current.canUse("sha", target, false) && current != player; }); event.targets.sortBySeat(); - 'step 2' - if(event.targets.length&&target.isIn()){ - event.current=event.targets.shift(); - if(event.current.hasSha()){ - event.current.chooseToUse({name:'sha'},'是否对'+get.translation(target)+'使用一张杀?',target,-1); + ("step 2"); + if (event.targets.length && target.isIn()) { + event.current = event.targets.shift(); + if (event.current.hasSha()) { + event.current.chooseToUse( + { name: "sha" }, + "是否对" + get.translation(target) + "使用一张杀?", + target, + -1 + ); } event.redo(); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - target(player,target){ - return get.effect(target,{name:'sha'},player,target); - } - } - } + ai: { + value: 10, + order: 1, + result: { + target(player, target) { + return get.effect(target, { name: "sha" }, player, target); + }, + }, + }, }, - gwmaoxian_jieluote:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_jieluote', - enable:true, - filterTarget:true, - content(){ - if(target.isMaxHp()&&target.hp>2){ + gwmaoxian_jieluote: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_jieluote", + enable: true, + filterTarget: true, + content() { + if (target.isMaxHp() && target.hp > 2) { target.damage(2); - } - else{ + } else { target.damage(); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - tag:{ - damage:1 + ai: { + value: 10, + order: 1, + tag: { + damage: 1, }, - result:{ - player(player,target){ - var eff=get.damageEffect(target,player,player); - if(eff>0){ - eff=Math.sqrt(eff); - if(target.isMaxHp()&&target.hp>2){ - if(get.attitude(player,target)>0) return 0; - switch(target.hp){ - case 3:return eff*2; - case 4:return eff*1.5; - default:return eff*1.1; + result: { + player(player, target) { + var eff = get.damageEffect(target, player, player); + if (eff > 0) { + eff = Math.sqrt(eff); + if (target.isMaxHp() && target.hp > 2) { + if (get.attitude(player, target) > 0) return 0; + switch (target.hp) { + case 3: + return eff * 2; + case 4: + return eff * 1.5; + default: + return eff * 1.1; } - } - else{ - switch(target.hp){ - case 1:return eff*1.6; - case 2:return eff*1.1; - default:return eff; + } else { + switch (target.hp) { + case 1: + return eff * 1.6; + case 2: + return eff * 1.1; + default: + return eff; } } } return 0; - } - } - } + }, + }, + }, }, - gwmaoxian_yenaifa:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_yenaifa', - enable:true, - notarget:true, - content(){ - 'step 0' - event.targets=player.getEnemies().randomGets(3).sortBySeat(); - 'step 1' - if(event.targets.length){ + gwmaoxian_yenaifa: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_yenaifa", + enable: true, + notarget: true, + content() { + "step 0"; + event.targets = player.getEnemies().randomGets(3).sortBySeat(); + ("step 1"); + if (event.targets.length) { player.line(event.targets.shift().getDebuff(false).addExpose(0.1)); event.redo(); } - 'step 2' + ("step 2"); game.delay(); }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - player:1 - } - } + ai: { + value: 10, + order: 1, + result: { + player: 1, + }, + }, }, - gwmaoxian_telisi:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_telisi', - enable:true, - notarget:true, - content(){ - 'step 0' - event.targets=player.getFriends().randomGets(3); + gwmaoxian_telisi: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_telisi", + enable: true, + notarget: true, + content() { + "step 0"; + event.targets = player.getFriends().randomGets(3); event.targets.add(player); event.targets.sortBySeat(); - 'step 1' - if(event.targets.length){ + ("step 1"); + if (event.targets.length) { player.line(event.targets.shift().getBuff(false).addExpose(0.1)); event.redo(); } - 'step 2' + ("step 2"); game.delay(); }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - player:1 - } - } + ai: { + value: 10, + order: 1, + result: { + player: 1, + }, + }, }, - gwmaoxian_hengsaite:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_hengsaite', - enable:true, - notarget:true, - content(){ - var targets=game.filterPlayer(function(current){ - return player.canUse('wanjian',current); - }).sortBySeat(); - if(targets.length){ - player.addTempSkill('gwmaoxian_hengsaite_sha'); - player.useCard({name:'wanjian'},targets); + gwmaoxian_hengsaite: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_hengsaite", + enable: true, + notarget: true, + content() { + var targets = game + .filterPlayer(function (current) { + return player.canUse("wanjian", current); + }) + .sortBySeat(); + if (targets.length) { + player.addTempSkill("gwmaoxian_hengsaite_sha"); + player.useCard({ name: "wanjian" }, targets); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - player(player,target){ - var targets=game.filterPlayer(function(current){ - return player.canUse('wanjian',current); + ai: { + value: 10, + order: 1, + result: { + player(player, target) { + var targets = game.filterPlayer(function (current) { + return player.canUse("wanjian", current); }); - var eff=0; - for(var i=0;i0) return -1; - if(dh==0&&player.needsToDiscard()) return -0.5; + ai: { + value: 10, + order: 1, + result: { + target(player, target) { + var dh = target.countCards("h") - player.countCards("h"); + if (dh > 0) return -1; + if (dh == 0 && player.needsToDiscard()) return -0.5; return 0; - } - } - } - }, - gwmaoxian_fulisi:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_fulisi', - enable:true, - filterTarget(card,player,target){ - return target!=player&&target.countCards('h'); + }, + }, }, - selectTarget:[1,3], - multitarget:true, - multiline:true, - content(){ - 'step 0' - var dialog=ui.create.dialog('弃置至多2张手牌','hidden'); - for(var i=0;i=player.countCards('h')&&player.canUse('juedou',target); + gwmaoxian_kuite: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_kuite", + enable: true, + filterTarget(card, player, target) { + return ( + target.countCards("h") >= player.countCards("h") && player.canUse("juedou", target) + ); }, - content(){ - 'step 0' - player.useCard({name:'juedou'},target).animate=false; - 'step 1' - if(player.isIn()&&target.isIn()){ - player.useCard({name:'juedou'},target); + content() { + "step 0"; + player.useCard({ name: "juedou" }, target).animate = false; + ("step 1"); + if (player.isIn() && target.isIn()) { + player.useCard({ name: "juedou" }, target); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - target(player,target){ - return get.effect(target,{name:'juedou'},player,target); - } - } - } + ai: { + value: 10, + order: 1, + result: { + target(player, target) { + return get.effect(target, { name: "juedou" }, player, target); + }, + }, + }, }, - gwmaoxian_haluo:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_haluo', - enable:true, - filterTarget(card,player,target){ + gwmaoxian_haluo: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_haluo", + enable: true, + filterTarget(card, player, target) { return target.isMinHp(); }, - selectTarget:-1, - content(){ + selectTarget: -1, + content() { target.damage(); }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - target:-1.5 + ai: { + value: 10, + order: 1, + result: { + target: -1.5, }, - tag:{ - damage:1 - } - } + tag: { + damage: 1, + }, + }, }, - gwmaoxian_dagong:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_dagong', - enable:true, - content(){ - target.addSkill('gw_ciguhanshuang'); - target.addSkill('gw_birinongwu'); - target.addSkill('gw_qinpendayu'); + gwmaoxian_dagong: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_dagong", + enable: true, + content() { + target.addSkill("gw_ciguhanshuang"); + target.addSkill("gw_birinongwu"); + target.addSkill("gw_qinpendayu"); }, - filterTarget(card,player,target){ - return !target.hasSkill('gw_ciguhanshuang')|| - !target.hasSkill('gw_qinpendayu')|| - !target.hasSkill('gw_birinongwu'); + filterTarget(card, player, target) { + return ( + !target.hasSkill("gw_ciguhanshuang") || + !target.hasSkill("gw_qinpendayu") || + !target.hasSkill("gw_birinongwu") + ); }, - changeTarget(player,targets){ - game.filterPlayer(function(current){ - return get.distance(targets[0],current,'pure')==1; - },targets); + changeTarget(player, targets) { + game.filterPlayer(function (current) { + return get.distance(targets[0], current, "pure") == 1; + }, targets); }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - target(player,target){ - return get.effect(target,{name:'gw_ciguhanshuang'},player,target); - } - } - } + ai: { + value: 10, + order: 1, + result: { + target(player, target) { + return get.effect(target, { name: "gw_ciguhanshuang" }, player, target); + }, + }, + }, }, - gwmaoxian_gaier:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_gaier', - enable:true, - filterTarget:true, - content(){ - 'step 0' - var str1='令'+get.translation(target); - var str2='1点体力和体力上限' - player.chooseControlList([str1+'增加'+str2,str1+'减少'+str2],function(){ - if(get.attitude(player,target)>0) return 0; + gwmaoxian_gaier: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_gaier", + enable: true, + filterTarget: true, + content() { + "step 0"; + var str1 = "令" + get.translation(target); + var str2 = "1点体力和体力上限"; + player.chooseControlList([str1 + "增加" + str2, str1 + "减少" + str2], function () { + if (get.attitude(player, target) > 0) return 0; return 1; }); - 'step 1' - if(result.index==0){ + ("step 1"); + if (result.index == 0) { target.gainMaxHp(true); target.recover(); - } - else{ + } else { target.loseHp(); target.loseMaxHp(true); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - player(player,target){ - var num=1; - if(target.hasSkillTag('maixie_hp')){ - num=1.5; + ai: { + value: 10, + order: 1, + result: { + player(player, target) { + var num = 1; + if (target.hasSkillTag("maixie_hp")) { + num = 1.5; } - return num/Math.sqrt(target.hp+1); - } - } - } - }, - gwmaoxian_airuiting:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_airuiting', - enable:true, - filterTarget(card,player,target){ - return target!=player; + return num / Math.sqrt(target.hp + 1); + }, + }, }, - selectTarget:-1, - content(){ - 'step 0' - target.chooseToUse({name:'sha'},'使用一张杀,或失去1点体力'); - 'step 1' - if(!result.bool){ + }, + gwmaoxian_airuiting: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_airuiting", + enable: true, + filterTarget(card, player, target) { + return target != player; + }, + selectTarget: -1, + content() { + "step 0"; + target.chooseToUse({ name: "sha" }, "使用一张杀,或失去1点体力"); + ("step 1"); + if (!result.bool) { target.loseHp(); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - target(player,target){ - if(target.hasSha()){ - if(Math.random()<0.5) return 1; + ai: { + value: 10, + order: 1, + result: { + target(player, target) { + if (target.hasSha()) { + if (Math.random() < 0.5) return 1; return 0; } - if(target.countCards('h')>=2){ + if (target.countCards("h") >= 2) { return 0; - } - else{ + } else { return -1; } - } - } - } + }, + }, + }, }, - gwmaoxian_aisinie:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_aisinie', - enable:true, - notarget:true, - content(){ - 'step 0' + gwmaoxian_aisinie: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_aisinie", + enable: true, + notarget: true, + content() { + "step 0"; player.recover(); - 'step 1' - var list=get.typeCard('spell_silver'); - if(list.length){ - player.chooseVCardButton('获得一张银卡法术',list,true); - } - else{ + ("step 1"); + var list = get.typeCard("spell_silver"); + if (list.length) { + player.chooseVCardButton("获得一张银卡法术", list, true); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.gain(game.createCard(result.links[0][2]),'gain2'); + ("step 2"); + if (result.bool) { + player.gain(game.createCard(result.links[0][2]), "gain2"); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - player:1 - } - } + ai: { + value: 10, + order: 1, + result: { + player: 1, + }, + }, }, - gwmaoxian_falanxisika:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_falanxisika', - enable:true, - notarget:true, - content(){ - 'step 0' - var list=get.typeCard('spell_gold'); - list.remove('gw_huangjiashenpan'); - if(list.length){ - player.chooseVCardButton('使用一张金卡法术',list.randomGets(3),true).ai=function(button){ - var info=get.info(button.link[2]); - if(info&&info.ai&&info.ai.result&&info.ai.result.player){ - return info.ai.result.player(player,player); + gwmaoxian_falanxisika: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_falanxisika", + enable: true, + notarget: true, + content() { + "step 0"; + var list = get.typeCard("spell_gold"); + list.remove("gw_huangjiashenpan"); + if (list.length) { + player.chooseVCardButton("使用一张金卡法术", list.randomGets(3), true).ai = function ( + button + ) { + var info = get.info(button.link[2]); + if (info && info.ai && info.ai.result && info.ai.result.player) { + return info.ai.result.player(player, player); } return 0; }; - } - else{ + } else { event.finish(); } - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { player.useCard(game.createCard(result.links[0][2])); } }, - contentAfter(){ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + contentAfter() { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } }, - ai:{ - value:10, - order:1, - result:{ - player:1 - } - } + ai: { + value: 10, + order: 1, + result: { + player: 1, + }, + }, }, - gwmaoxian_huoge:{ - type:'gwmaoxian', - fullborder:'gold', - vanish:true, - derivation:'gw_diandian', - image:'character:gw_huoge', - enable:true, - notarget:true, - content(){ - 'step 0' - event.cards=get.cards(6); - player.chooseCardButton(event.cards,[1,2],'选择至多两牌依次使用之').set('filterButton',function(button){ - return game.hasPlayer(function(current){ - return player.canUse(button.link,current); + gwmaoxian_huoge: { + type: "gwmaoxian", + fullborder: "gold", + vanish: true, + derivation: "gw_diandian", + image: "character:gw_huoge", + enable: true, + notarget: true, + content() { + "step 0"; + event.cards = get.cards(6); + player + .chooseCardButton(event.cards, [1, 2], "选择至多两牌依次使用之") + .set("filterButton", function (button) { + return game.hasPlayer(function (current) { + return player.canUse(button.link, current); + }); + }) + .set("ai", function (button) { + return get.value(button.link); }); - }).set('ai',function(button){ - return get.value(button.link); - }); - 'step 1' - if(result.bool){ - event.list=result.links.slice(0); - for(var i=0;i=4) return [1,get.tag(card,'damage')*2]; - if(target.hp==3) return [1,get.tag(card,'damage')*1.5]; - if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; + ai: { + threaten: 0.8, + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [1, get.tag(card, "damage") * 2]; + if (target.hp == 3) return [1, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; } - } - } - } - }, - wxuying:{ - trigger:{player:'phaseBegin'}, - forced:true, - content(){ - 'step 0' - var cards=player.getCards('h',function(card){ - return card.name=='hsfashu_anyingjingxiang'||card._wxuying; - }); - if(cards.length){ - player.lose(cards)._triggered=null; - } - 'step 1' - var card=game.createCard('hsfashu_anyingjingxiang'); - card._modUseful=function(){ - return 7; - }; - card._modValue=function(){ - return 7; - }; - player.gain(card,'gain2'); + }, + }, }, - subSkill:{ - lose:{ - trigger:{player:'loseAfter'}, - silent:true, - content(){ - for(var i=0;i0){ + while (targets.length) { + target = targets.randomRemove(); + if ( + lib.filter.targetEnabled2(card, player, target) && + get.effect(target, card, player, player) > 0 + ) { break; } target = null; } - if(target){ + if (target) { player.storage.hshuanling.remove(choice); - if(!player.storage.hshuanling.length){ - player.unmarkSkill('hshuanling'); - } - else{ - player.syncStorage('hshuanling'); + if (!player.storage.hshuanling.length) { + player.unmarkSkill("hshuanling"); + } else { + player.syncStorage("hshuanling"); player.updateMarks(); } - player.useCard(card,target); + player.useCard(card, target); break; } } @@ -624,8 +687,8 @@ game.import('character', function () { event.redo(); } }, - group:['hshuanling_count'], - subSkill:{ + group: ["hshuanling_count"], + subSkill: { // clear:{ // trigger:{player:'phaseAfter'}, // silent:true, @@ -633,2840 +696,3007 @@ game.import('character', function () { // player.storage.hshuanling.length=0; // } // }, - count:{ - trigger:{global:'useCard'}, - silent:true, - filter(event,player){ - if(get.is.converted(event)) return false; - if(!event.player.isEnemiesOf(player)) return false; - if(get.type(event.card)!='trick') return false; - if(event.targets.length!=1) return false; + count: { + trigger: { global: "useCard" }, + silent: true, + filter(event, player) { + if (get.is.converted(event)) return false; + if (!event.player.isEnemiesOf(player)) return false; + if (get.type(event.card) != "trick") return false; + if (event.targets.length != 1) return false; // if(!event.targets[0].isFriendsOf(player)) return false; - if(get.info(event.card).multitarget) return false; - if(get.info(event.card).singleCard) return false; - if(!get.info(event.card).enable) return false; + if (get.info(event.card).multitarget) return false; + if (get.info(event.card).singleCard) return false; + if (!get.info(event.card).enable) return false; return true; }, - content(){ + content() { player.storage.hshuanling.add(trigger.card); - player.markSkill('hshuanling'); - } - } - } + player.markSkill("hshuanling"); + }, + }, + }, }, - hsxiujian:{ - trigger:{player:'useCardToAfter'}, - forced:true, - filter(event,player){ - return get.type2(event.card)=='trick'&&event.target.isEnemiesOf(player); + hsxiujian: { + trigger: { player: "useCardToAfter" }, + forced: true, + filter(event, player) { + return get.type2(event.card) == "trick" && event.target.isEnemiesOf(player); + }, + content() { + player.useCard({ name: "sha" }, trigger.target, false); }, - content(){ - player.useCard({name:'sha'},trigger.target,false); - } }, - hsxingyi:{ - trigger:{global:'useSkillAfter'}, - forced:true, - filter(event,player){ - if(lib.filter.skillDisabled(event.skill)) return false; - if(!game.expandSkills(event.player.getStockSkills()).includes(event.skill)) return false; - return _status.currentPhase==event.player&&event.player.isEnemiesOf(player); + hsxingyi: { + trigger: { global: "useSkillAfter" }, + forced: true, + filter(event, player) { + if (lib.filter.skillDisabled(event.skill)) return false; + if (!game.expandSkills(event.player.getStockSkills()).includes(event.skill)) return false; + return _status.currentPhase == event.player && event.player.isEnemiesOf(player); + }, + content() { + player.addTempSkill(trigger.skill, { player: "phaseAfter" }); }, - content(){ - player.addTempSkill(trigger.skill,{player:'phaseAfter'}); - } }, - hshuanling_old:{ - trigger:{player:'useCardAfter'}, - forced:true, - subSkill:{ - basic:{}, - trick:{} + hshuanling_old: { + trigger: { player: "useCardAfter" }, + forced: true, + subSkill: { + basic: {}, + trick: {}, }, - usable:1, - filter(event,player){ - if(!event.targets) return false; - if(event.targets.length>1) return false; - if(event.targets[0]==player) return false; - return get.type2(event.card)=='trick'; + usable: 1, + filter(event, player) { + if (!event.targets) return false; + if (event.targets.length > 1) return false; + if (event.targets[0] == player) return false; + return get.type2(event.card) == "trick"; }, - content(){ - var list=get.inpile2('trick'); - while(list.length){ - var name=list.randomRemove(); - if(!lib.card[name].multitarget&& - player.canUse(name,trigger.targets[0])&& - get.effect(trigger.targets[0],{name:name},player,player)>0){ - player.useCard(game.createCard(name),trigger.targets[0],false); + content() { + var list = get.inpile2("trick"); + while (list.length) { + var name = list.randomRemove(); + if ( + !lib.card[name].multitarget && + player.canUse(name, trigger.targets[0]) && + get.effect(trigger.targets[0], { name: name }, player, player) > 0 + ) { + player.useCard(game.createCard(name), trigger.targets[0], false); break; } } - } + }, }, - hshuanling_old2:{ - trigger:{player:'useCard'}, - filter(event,player){ + hshuanling_old2: { + trigger: { player: "useCard" }, + filter(event, player) { // if(get.is.converted(event)) return false; - if(!player.countCards('he')) return false; + if (!player.countCards("he")) return false; // if(!event.targets||!event.targets.includes(player)) return false; - var info=get.info(event.card); - if(info.type!='trick'&&info.type!='basic') return false; - if(info.multitarget) return false; - if(event.targets.length>1) return true; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,event.player,current); + var info = get.info(event.card); + if (info.type != "trick" && info.type != "basic") return false; + if (info.multitarget) return false; + if (event.targets.length > 1) return true; + return game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, event.player, current) + ); }); }, - direct:true, - content(){ - 'step 0' - var bool1=(trigger.targets.length>1); - var bool2=game.hasPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,trigger.player,current); + direct: true, + content() { + "step 0"; + var bool1 = trigger.targets.length > 1; + var bool2 = game.hasPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, trigger.player, current) + ); }); - if(bool1&&bool2){ - player.chooseControlList(true,get.prompt('hshuanling'),[ - '弃置任意张牌 ,并为'+get.translation(trigger.card)+'增加等量的目标', - '弃置任意张牌 ,并为'+get.translation(trigger.card)+'减少等量的目标'],function(event,player){ - if(_status.event.add) return 0; - return 1; - }).set('add',get.effect(player,trigger.card,trigger.player,player)>=0); - } - else if(bool2){ - event.type='add'; + if (bool1 && bool2) { + player + .chooseControlList( + true, + get.prompt("hshuanling"), + [ + "弃置任意张牌 ,并为" + get.translation(trigger.card) + "增加等量的目标", + "弃置任意张牌 ,并为" + get.translation(trigger.card) + "减少等量的目标", + ], + function (event, player) { + if (_status.event.add) return 0; + return 1; + } + ) + .set("add", get.effect(player, trigger.card, trigger.player, player) >= 0); + } else if (bool2) { + event.type = "add"; event.goto(2); - event.unchosen=true; - } - else{ - event.type='remove'; + event.unchosen = true; + } else { + event.type = "remove"; event.goto(2); - event.unchosen=true; + event.unchosen = true; } - 'step 1' - if(result.control=='cancel2'){ + ("step 1"); + if (result.control == "cancel2") { event.finish(); + } else if (result.index == 1) { + event.type = "remove"; + } else { + event.type = "add"; } - else if(result.index==1){ - event.type='remove'; - } - else{ - event.type='add'; - } - 'step 2' - if(event.type=='add'){ - var num=game.countPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,trigger.player,current); + ("step 2"); + if (event.type == "add") { + var num = game.countPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, trigger.player, current) + ); }); - var num2=game.countPlayer(function(current){ - if(!trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,trigger.player,current)){ - return get.effect(current,trigger.card,player,player)>0; + var num2 = game.countPlayer(function (current) { + if ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, trigger.player, current) + ) { + return get.effect(current, trigger.card, player, player) > 0; } return false; }); - if(num2>2) num2=2; + if (num2 > 2) num2 = 2; player.chooseCardTarget({ - selectCard:[1,num], - selectTarget(){ + selectCard: [1, num], + selectTarget() { return ui.selected.cards.length; }, - position:'he', - prompt:event.unchosen?get.prompt('hshuanling'):null, - prompt2:'弃置任意张牌,并为'+get.translation(trigger.card)+'增加等量的目标', - filterTarget(card,player,target){ - return !trigger.targets.includes(target)&&lib.filter.targetEnabled2(trigger.card,trigger.player,target); + position: "he", + prompt: event.unchosen ? get.prompt("hshuanling") : null, + prompt2: "弃置任意张牌,并为" + get.translation(trigger.card) + "增加等量的目标", + filterTarget(card, player, target) { + return ( + !trigger.targets.includes(target) && + lib.filter.targetEnabled2(trigger.card, trigger.player, target) + ); }, - ai1(card){ - if(ui.selected.cards.length>=num2) return 0; - return get.value(trigger.card)-get.value(card)-1; + ai1(card) { + if (ui.selected.cards.length >= num2) return 0; + return get.value(trigger.card) - get.value(card) - 1; + }, + ai2(target) { + var trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, trigger.player, _status.event.player); }, - ai2(target){ - var trigger=_status.event.getTrigger(); - return get.effect(target,trigger.card,trigger.player,_status.event.player); - } }); - } - else{ - var num=trigger.targets.length-1; - var num2=game.countPlayer(function(current){ - if(trigger.targets.includes(current)){ - return get.effect(current,trigger.card,player,player)<0; + } else { + var num = trigger.targets.length - 1; + var num2 = game.countPlayer(function (current) { + if (trigger.targets.includes(current)) { + return get.effect(current, trigger.card, player, player) < 0; } return false; }); - if(num2>2) num2=2; + if (num2 > 2) num2 = 2; player.chooseCardTarget({ - selectCard:[1,num], - selectTarget(){ + selectCard: [1, num], + selectTarget() { return ui.selected.cards.length; }, - prompt:event.unchosen?get.prompt('hshuanling'):null, - prompt2:'弃置任意张牌,并为'+get.translation(trigger.card)+'减少等量的目标', - filterTarget(card,player,target){ + prompt: event.unchosen ? get.prompt("hshuanling") : null, + prompt2: "弃置任意张牌,并为" + get.translation(trigger.card) + "减少等量的目标", + filterTarget(card, player, target) { return trigger.targets.includes(target); }, - ai1(card){ - if(!player.needsToDiscard(0,(i,player)=>{ - return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); - })) return 0; - if(ui.selected.cards.length>=num2) return 0; - return Math.max(5,get.value(trigger.card))-get.value(card)-1; + ai1(card) { + if ( + !player.needsToDiscard(0, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 0; + if (ui.selected.cards.length >= num2) return 0; + return Math.max(5, get.value(trigger.card)) - get.value(card) - 1; + }, + ai2(target) { + var trigger = _status.event.getTrigger(); + return -get.effect( + target, + trigger.card, + trigger.player, + _status.event.player + ); }, - ai2(target){ - var trigger=_status.event.getTrigger(); - return -get.effect(target,trigger.card,trigger.player,_status.event.player); - } }); } - 'step 3' - if(result.bool){ - if(!event.isMine()) game.delayx(); - event.targets=result.targets.slice(0); - event.cards=result.cards.slice(0); - } - else{ + ("step 3"); + if (result.bool) { + if (!event.isMine()) game.delayx(); + event.targets = result.targets.slice(0); + event.cards = result.cards.slice(0); + } else { event.finish(); } - 'step 4' - player.logSkill('hshuanling',event.targets); - player.discard(event.cards).delay=false; - if(event.type=='add'){ - for(var i=0;i0; }, - content(){ + }, + draw: { + trigger: { player: "phaseDrawBegin" }, + silent: true, + filter(event) { + return event.num > 0; + }, + content() { trigger.num--; - } - }, - enter:{ - trigger:{global:'phaseAfter'}, - forced:true, - popup:false, - priority:-60, - filter(event,player){ - return event.player!=player; }, - content(){ - player.insertPhase(null,true); - } - } + }, + enter: { + trigger: { global: "phaseAfter" }, + forced: true, + popup: false, + priority: -60, + filter(event, player) { + return event.player != player; + }, + content() { + player.insertPhase(null, true); + }, + }, }, - content(){ - 'step 0' - event.num=trigger.num; - 'step 1' - if(event.num&&player.storage.ylyuchu.length<3){ - var skill=player.addSubPlayer({ - name:'hs_yelinchulong', - skills:['ylyuchu_draw','ylyuchu_exit','ylyuchu_enter'], - hp:2, - maxHp:2, - hs:get.cards(2), - skill:skill, + content() { + "step 0"; + event.num = trigger.num; + ("step 1"); + if (event.num && player.storage.ylyuchu.length < 3) { + var skill = player.addSubPlayer({ + name: "hs_yelinchulong", + skills: ["ylyuchu_draw", "ylyuchu_exit", "ylyuchu_enter"], + hp: 2, + maxHp: 2, + hs: get.cards(2), + skill: skill, // intro:'下个敌方回合开始前,随机切换至此随从', - intro2:'当前回合结束后进行一个额外回合并切换回本体', - onremove(player){ + intro2: "当前回合结束后进行一个额外回合并切换回本体", + onremove(player) { player.storage.ylyuchu.remove(skill); delete lib.skill[skill]; - } + }, }); player.storage.ylyuchu.push(skill); event.num--; event.redo(); } - } + }, }, - nsaiqi:{ - trigger:{player:'useCard'}, - forced:true, - init(player){ - player.storage.nsaiqi=[]; + nsaiqi: { + trigger: { player: "useCard" }, + forced: true, + init(player) { + player.storage.nsaiqi = []; }, - intro:{ - content:'cards' + intro: { + content: "cards", }, - filter(event,player){ - if(ui.cardPile.firstChild&&ui.cardPile.firstChild.vanishtag.includes('nsaiqi')){ + filter(event, player) { + if (ui.cardPile.firstChild && ui.cardPile.firstChild.vanishtag.includes("nsaiqi")) { return false; } return true; }, - onremove:'lose', - content(){ - var cards=get.cards(3); - for(var i=0;i=9; + nsbeiming: { + trigger: { player: "nsaiqiAfter" }, + forced: true, + filter(event, player) { + return player.storage.nsaiqi.length >= 9; }, - content(){ - 'step 0' + content() { + "step 0"; player.draw(); - 'step 1' - player.chooseCardButton(player.storage.nsaiqi,true,'将顺序将牌置于牌堆顶(先选择的在上)',player.storage.nsaiqi.length); - 'step 2' - var list=result.links.slice(0); - while(list.length){ - ui.cardPile.insertBefore(list.pop(),ui.cardPile.firstChild); + ("step 1"); + player.chooseCardButton( + player.storage.nsaiqi, + true, + "将顺序将牌置于牌堆顶(先选择的在上)", + player.storage.nsaiqi.length + ); + ("step 2"); + var list = result.links.slice(0); + while (list.length) { + ui.cardPile.insertBefore(list.pop(), ui.cardPile.firstChild); } - player.storage.nsaiqi.length=0; - player.unmarkSkill('nsaiqi'); - } + player.storage.nsaiqi.length = 0; + player.unmarkSkill("nsaiqi"); + }, }, - hsnitai:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - video(player,data){ - var skills=data[0]; - var name=data[1]; - lib.skill.hsnitai.process(skills,name); + hsnitai: { + trigger: { player: "phaseUseBegin" }, + forced: true, + video(player, data) { + var skills = data[0]; + var name = data[1]; + lib.skill.hsnitai.process(skills, name); }, - onremove(player){ - player.removeSkill('hsnitai_card'); + onremove(player) { + player.removeSkill("hsnitai_card"); }, - process(skills,name){ - var cardname='hsnitai_'+name; - lib.translate[cardname]=lib.translate[name]; - lib.translate[cardname+'_info']='出牌阶段对自己使用,获得'+get.translation(name)+'的一个技能(替换前一个以此法获得的技能,效果持续2回合)'; - lib.translate[cardname+'_append']=''; - for(var i=0;i
    '+ - get.skillInfoTranslation(skills[i])+'
    '; - if(i【' + + lib.translate[skills[i]] + + "】
    " + + get.skillInfoTranslation(skills[i]) + + "
    "; + if (i < skills.length) { + lib.translate[cardname + "_append"] += "
    "; } } - lib.card[cardname]=lib.card[cardname]||{ - enable:true, - type:'character', - image:'character:'+name, - fullimage:true, - vanish:true, - skills:skills, - derivation:'hs_barnes', - filterTarget(card,player,target){ - return player==target; + lib.card[cardname] = lib.card[cardname] || { + enable: true, + type: "character", + image: "character:" + name, + fullimage: true, + vanish: true, + skills: skills, + derivation: "hs_barnes", + filterTarget(card, player, target) { + return player == target; }, - selectTarget:-1, - content(){ - 'step 0' - var list=lib.card[card.name].skills; - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); - event.switchToAuto=function(){ - event._result=event.skillai(); + dialog.add(ui.create.div(".placeholder")); + event.switchToAuto = function () { + event._result = event.skillai(); dialog.close(); game.resume(); }; - _status.imchoosing=true; + _status.imchoosing = true; game.pause(); + } else { + event._result = event.skillai(); } - else{ - event._result=event.skillai(); - } - 'step 1' - var skill=result; - if(!target.hasSkill(skill)){ + ("step 1"); + var skill = result; + if (!target.hasSkill(skill)) { player.popup(skill); target.$gain2(card); - target.removeSkill('hsnitai_card'); - target.storage.hsnitai_card=card; - target.storage.hsnitai_card_count=1; - target.storage.hsnitai_card_skill=skill; - player.syncStorage('hsnitai_card'); - player.syncStorage('hsnitai_card_skill'); - target.addAdditionalSkill('hsnitai_card',skill); - target.addSkill('hsnitai_card'); - game.log(target,'获得技能','【'+get.translation(skill)+'】'); + target.removeSkill("hsnitai_card"); + target.storage.hsnitai_card = card; + target.storage.hsnitai_card_count = 1; + target.storage.hsnitai_card_skill = skill; + player.syncStorage("hsnitai_card"); + player.syncStorage("hsnitai_card_skill"); + target.addAdditionalSkill("hsnitai_card", skill); + target.addSkill("hsnitai_card"); + game.log(target, "获得技能", "【" + get.translation(skill) + "】"); } }, - ai:{ - order(){ - if(_status.event.player.hasSkill('hsnitai_card')) return 1; + ai: { + order() { + if (_status.event.player.hasSkill("hsnitai_card")) return 1; return 9; }, - result:{ - target(player,target){ - if(!player.hasSkill('hsnitai_card')||player.needsToDiscard()) return 1; + result: { + target(player, target) { + if (!player.hasSkill("hsnitai_card") || player.needsToDiscard()) return 1; return 0; - } - } - } + }, + }, + }, }; }, - content(){ - var current=game.expandSkills(player.getSkills()); - var list=get.gainableSkills(function(info,skill,name){ - if(current.includes(skill)) return false; - return lib.characterPack.hearth&&lib.characterPack.hearth[name]; + content() { + var current = game.expandSkills(player.getSkills()); + var list = get.gainableSkills(function (info, skill, name) { + if (current.includes(skill)) return false; + return lib.characterPack.hearth && lib.characterPack.hearth[name]; }); - if(!list.length){ + if (!list.length) { return; } - var skill=list.randomGet(); - var source=[]; - for(var i in lib.characterPack.hearth){ - if(lib.characterPack.hearth[i][3].includes(skill)){ + var skill = list.randomGet(); + var source = []; + for (var i in lib.characterPack.hearth) { + if (lib.characterPack.hearth[i][3].includes(skill)) { source.push(i); } } - if(!source.length){ + if (!source.length) { return; } - var name=source.randomGet(); - var skills=[skill]; - var nameskills=lib.characterPack.hearth[name][3] - for(var i=0;i【'+lib.translate[skill]+'】
    '+ - get.skillInfoTranslation(skill)+'
    '; + return ( + '
    【' + + lib.translate[skill] + + "】
    " + + get.skillInfoTranslation(skill) + + "
    " + ); + }, + }, + trigger: { player: "phaseUseBegin" }, + priority: -10, + silent: true, + content() { + if (player.storage.hsnitai_card_count > 0) { + player.storage.hsnitai_card_count--; + } else { + player.removeSkill("hsnitai_card"); } }, - trigger:{player:'phaseUseBegin'}, - priority:-10, - silent:true, - content(){ - if(player.storage.hsnitai_card_count>0){ - player.storage.hsnitai_card_count--; - } - else{ - player.removeSkill('hsnitai_card'); - } - } - } - } + }, + }, }, - hspuzhao:{ - enable:'phaseUse', - usable:1, - filterCard:{suit:'heart'}, - position:'he', - filter(event,player){ - return player.countCards('he',{suit:'heart'})>0; + hspuzhao: { + enable: "phaseUse", + usable: 1, + filterCard: { suit: "heart" }, + position: "he", + filter(event, player) { + return player.countCards("he", { suit: "heart" }) > 0; }, - check(card){ - return 7-get.value(card); + check(card) { + return 7 - get.value(card); }, - content(){ - var targets=player.getFriends(); - if(targets.length){ + content() { + var targets = player.getFriends(); + if (targets.length) { targets.push(player); - if(targets.length>3){ - targets=targets.randomGets(3); + if (targets.length > 3) { + targets = targets.randomGets(3); } targets.sortBySeat(); - player.line(targets,'green'); - for(var i=0;i0; + hstianqi: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("he") > 0; }, - position:'he', - init(player){ - player.storage.hstianqi=[]; + position: "he", + init(player) { + player.storage.hstianqi = []; }, - onremove:true, - filterCard(card,player){ - if(get.position(card)=='h'){ - if(player.getEquip(1)&&player.getEquip(2)&& - player.getEquip(3)&&player.getEquip(4)){ + onremove: true, + filterCard(card, player) { + if (get.position(card) == "h") { + if ( + player.getEquip(1) && + player.getEquip(2) && + player.getEquip(3) && + player.getEquip(4) + ) { return false; } return true; - } - else{ + } else { return true; } }, - check(card){ - var player=_status.event.player; - if(get.position(card)=='e'){ - if(card.name.indexOf('hstianqi_')==0){ - for(var i=0;i0; }, - content(){ + }, + hstianqi_shali: { + trigger: { player: "recoverEnd" }, + forced: true, + filter(event, player) { + return event.num > 0; + }, + content() { player.changeHujia(trigger.num); - } + }, }, - ysjqisha:{ - trigger:{source:'damageEnd',player:'damageEnd'}, - forced:true, - filter(event,player){ - if(event._notrigger.includes(event.player)) return false; - return (event.source!=player&&event.source.isIn())||(event.player!=player&&event.player.isIn()); + ysjqisha: { + trigger: { source: "damageEnd", player: "damageEnd" }, + forced: true, + filter(event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + (event.source != player && event.source.isIn()) || + (event.player != player && event.player.isIn()) + ); }, - content(){ - var target=trigger.source; - if(target==player){ - target=trigger.player; + content() { + var target = trigger.source; + if (target == player) { + target = trigger.player; } - var list=['ju','kuang','nu','yi','wang','hen','ao']; - for(var i=0;i0; + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return player.countCards("he") > 0; }, - content(){ + content() { game.delay(0.5); - player.chooseToDiscard(true,'he'); - } + player.chooseToDiscard(true, "he"); + }, }, - kuang:{ - mark:true, - intro:{ - content:'锁定技,每当你使用一张牌指定惟一目标,有50%的机率指定错误的目标' + kuang: { + mark: true, + intro: { + content: "锁定技,每当你使用一张牌指定惟一目标,有50%的机率指定错误的目标", }, - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - return event.getRand()<0.5&&event.targets&&event.targets.length==1&&game.hasPlayer(function(current){ - return current!=event.targets[0]&&lib.filter.targetEnabled2(event.card,player,current); - }); + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return ( + event.getRand() < 0.5 && + event.targets && + event.targets.length == 1 && + game.hasPlayer(function (current) { + return ( + current != event.targets[0] && + lib.filter.targetEnabled2(event.card, player, current) + ); + }) + ); }, - content(){ - 'step 0' + content() { + "step 0"; game.delay(); - 'step 1' - var list=game.filterPlayer(function(current){ - return current!=trigger.targets[0]&&lib.filter.targetEnabled2(trigger.card,player,current); + ("step 1"); + var list = game.filterPlayer(function (current) { + return ( + current != trigger.targets[0] && + lib.filter.targetEnabled2(trigger.card, player, current) + ); }); - if(list.length){ - var target=list.randomGet(); - trigger.targets[0]=target; - player.line(target,'green'); + if (list.length) { + var target = list.randomGet(); + trigger.targets[0] = target; + player.line(target, "green"); } - } + }, }, - nu:{ - mark:true, - intro:{ - content:'锁定技,你使用的卡牌造成的伤害+1;每当你使用一张牌,有65%的机率失效' + nu: { + mark: true, + intro: { + content: "锁定技,你使用的卡牌造成的伤害+1;每当你使用一张牌,有65%的机率失效", }, - forced:true, - trigger:{source:'damageBegin',player:'useCardToBefore'}, - filter(event,player){ - if(event.name=='damage') return event.notLink()&&(event.card?true:false); - var info=get.info(event.card); - if(info.multitarget&&event.targets&&event.targets.includes(player)) return false; - return event.getRand()<0.65; + forced: true, + trigger: { source: "damageBegin", player: "useCardToBefore" }, + filter(event, player) { + if (event.name == "damage") return event.notLink() && (event.card ? true : false); + var info = get.info(event.card); + if (info.multitarget && event.targets && event.targets.includes(player)) + return false; + return event.getRand() < 0.65; }, - content(){ - if(trigger.name=='damage'){ + content() { + if (trigger.name == "damage") { trigger.num++; - } - else{ + } else { trigger.cancel(); } - } - }, - yi:{ - mark:true, - intro:{ - content:'锁定技,你不能成为非敌方角色的卡牌目标' }, - mod:{ - targetEnabled(card,player,target){ - if(!player.getEnemies().includes(target)) return false; - } - } }, - wang:{ - mark:true, - intro:{ - content:'锁定技,你的摸牌数始终-1' + yi: { + mark: true, + intro: { + content: "锁定技,你不能成为非敌方角色的卡牌目标", }, - priority:5, - trigger:{player:'drawBegin'}, - forced:true, - content(){ + mod: { + targetEnabled(card, player, target) { + if (!player.getEnemies().includes(target)) return false; + }, + }, + }, + wang: { + mark: true, + intro: { + content: "锁定技,你的摸牌数始终-1", + }, + priority: 5, + trigger: { player: "drawBegin" }, + forced: true, + content() { trigger.num--; - } - }, - hen:{ - mark:true, - intro:{ - content:'锁定技,每当一名敌方角色回复1点体力,你失去1点体力' }, - trigger:{global:'recoverAfter'}, - forced:true, - filter(event,player){ + }, + hen: { + mark: true, + intro: { + content: "锁定技,每当一名敌方角色回复1点体力,你失去1点体力", + }, + trigger: { global: "recoverAfter" }, + forced: true, + filter(event, player) { return player.getEnemies().includes(event.player); }, - content(){ + content() { player.loseHp(); - } - }, - ao:{ - mark:true, - intro:{ - content:'锁定技,你的手牌上限-2' }, - mod:{ - maxHandcard(player,num){ - return num-2; - } - } }, - } + ao: { + mark: true, + intro: { + content: "锁定技,你的手牌上限-2", + }, + mod: { + maxHandcard(player, num) { + return num - 2; + }, + }, + }, + }, }, - yindan:{ - enable:'phaseUse', - filterCard:{suit:'spade'}, - check(card){ - return 8-get.value(card); + yindan: { + enable: "phaseUse", + filterCard: { suit: "spade" }, + check(card) { + return 8 - get.value(card); }, - usable:1, - filter(event,player){ - return player.countCards('he',{suit:'spade'})>0; + usable: 1, + filter(event, player) { + return player.countCards("he", { suit: "spade" }) > 0; }, - position:'he', - content(){ - 'step 0' + position: "he", + content() { + "step 0"; player.loseHp(); - 'step 1' - var cards=[]; - for(var i=0;i<2;i++){ - cards.push(game.createCard('hsjixie_zhadan')); + ("step 1"); + var cards = []; + for (var i = 0; i < 2; i++) { + cards.push(game.createCard("hsjixie_zhadan")); } - player.gain(cards,'gain2'); + player.gain(cards, "gain2"); }, - ai:{ - order:7, - result:{ - player(player,target){ - if(player.hp>=3) return 1; - if(player.hp==2&&game.hasPlayer(function(current){ - return get.damageEffect(current,player,player,'fire')>0&¤t.hp==1; - })){ + ai: { + order: 7, + result: { + player(player, target) { + if (player.hp >= 3) return 1; + if ( + player.hp == 2 && + game.hasPlayer(function (current) { + return ( + get.damageEffect(current, player, player, "fire") > 0 && + current.hp == 1 + ); + }) + ) { return 1; } return 0; - } - } - } + }, + }, + }, }, - hllingxi:{ - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(function(target){ - return lib.skill.hllingxi.filterTarget(null,player,target); + hllingxi: { + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(function (target) { + return lib.skill.hllingxi.filterTarget(null, player, target); }); }, - filterTarget(card,player,target){ - if(target.hasSkill('hllingxi_used')) return false; - return target!=player&&target.isDamaged()&&target.countCards('he')>=2; + filterTarget(card, player, target) { + if (target.hasSkill("hllingxi_used")) return false; + return target != player && target.isDamaged() && target.countCards("he") >= 2; }, - content(){ - 'step 0' - target.chooseToDiscard('he',2,true); - 'step 1' + content() { + "step 0"; + target.chooseToDiscard("he", 2, true); + ("step 1"); target.recover(); - target.addTempSkill('hllingxi_used'); + target.addTempSkill("hllingxi_used"); }, - group:'hllingxi_end', - subSkill:{ - used:{}, - end:{ - trigger:{player:'phaseEnd'}, - frequent:true, - filter(event,player){ + group: "hllingxi_end", + subSkill: { + used: {}, + end: { + trigger: { player: "phaseEnd" }, + frequent: true, + filter(event, player) { return player.isDamaged(); }, - content(){ + content() { player.recover(); - } - } + }, + }, }, - ai:{ - order:6, - result:{ - target(player,target){ - var nc=target.countCards('he'); - if(target.hasSkillTag('maixie_hp')){ - if(nc>=3) return 1; - if(target.hp==1) return 1; + ai: { + order: 6, + result: { + target(player, target) { + var nc = target.countCards("he"); + if (target.hasSkillTag("maixie_hp")) { + if (nc >= 3) return 1; + if (target.hp == 1) return 1; return 0; } - if(nc>=4){ - if(target.hp<=2) return 1; + if (nc >= 4) { + if (target.hp <= 2) return 1; return 0; - } - else if(nc==3){ - if(target.hp==1) return 1; - if(target.hp>=4) return -1; + } else if (nc == 3) { + if (target.hp == 1) return 1; + if (target.hp >= 4) return -1; return 0; - } - else{ - if(target.hp==1) return 0; + } else { + if (target.hp == 1) return 0; return -1; } - } - } - } - }, - zhaochao:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.getEnemies().length>0; + }, + }, }, - content(){ - 'step 0' - event.targets=player.getEnemies(); - player.addSkill('zhaochao2'); - player.useCard({name:'sha'},event.targets.randomRemove()); - 'step 1' - player.removeSkill('zhaochao2'); - if(player.storage.zhaochao2&&event.targets.length){ - player.useCard({name:'sha'},event.targets.randomRemove()); + }, + zhaochao: { + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.getEnemies().length > 0; + }, + content() { + "step 0"; + event.targets = player.getEnemies(); + player.addSkill("zhaochao2"); + player.useCard({ name: "sha" }, event.targets.randomRemove()); + ("step 1"); + player.removeSkill("zhaochao2"); + if (player.storage.zhaochao2 && event.targets.length) { + player.useCard({ name: "sha" }, event.targets.randomRemove()); delete player.storage.zhaochao2; } }, - ai:{ - threaten:1.7 - } - }, - zhaochao2:{ - trigger:{player:'shaMiss'}, - silent:true, - filter(event){ - return event.getParent(2).name=='zhaochao'; + ai: { + threaten: 1.7, }, - content(){ - player.storage.zhaochao2=true; - } }, - xiyong:{ - trigger:{player:'phaseEnd'}, - frequent:true, - content(){ - 'step 0' + zhaochao2: { + trigger: { player: "shaMiss" }, + silent: true, + filter(event) { + return event.getParent(2).name == "zhaochao"; + }, + content() { + player.storage.zhaochao2 = true; + }, + }, + xiyong: { + trigger: { player: "phaseEnd" }, + frequent: true, + content() { + "step 0"; player.draw(); - 'step 1' - if(Array.isArray(result)&&result.length){ - var gained=result[0]; - if(lib.filter.cardEnabled(gained,target)){ - var next=player.chooseToUse(); - next.filterCard=function(card){ - return card==gained; + ("step 1"); + if (Array.isArray(result) && result.length) { + var gained = result[0]; + if (lib.filter.cardEnabled(gained, target)) { + var next = player.chooseToUse(); + next.filterCard = function (card) { + return card == gained; }; - next.prompt='是否使用'+get.translation(gained)+'?'; - } - else{ + next.prompt = "是否使用" + get.translation(gained) + "?"; + } else { event.finish(); } - } - else{ + } else { event.finish(); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.draw(); } }, - ai:{ - threaten:1.6 - } + ai: { + threaten: 1.6, + }, }, - srjici:{ - trigger:{source:'damageEnd'}, - forced:true, - content(){ + srjici: { + trigger: { source: "damageEnd" }, + forced: true, + content() { player.draw(); - if(trigger.player&&trigger.player.isIn()&&!trigger._notrigger.includes(trigger.player)){ + if ( + trigger.player && + trigger.player.isIn() && + !trigger._notrigger.includes(trigger.player) + ) { trigger.player.randomDiscard(); } }, - ai:{ - threaten:1.4 - } + ai: { + threaten: 1.4, + }, }, - yinzong:{ - trigger:{player:'loseEnd'}, - forced:true, - filter(event,player){ - for(var i=0;i0; - })){ - switch(button.link[2]){ - case 'tao':return 5; - case 'xuejibingbao': return 4; - case 'jiu':return 3.01; - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder') return 2.92; + check(button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "xuejibingbao": + return 4; + case "jiu": + return 3.01; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder") return 2.92; else return 2.9; - default:return 2+_status.event.getRand()*2; + default: + return 2 + _status.event.getRand() * 2; } } return 0; }, - backup(links,player){ + backup(links, player) { return { - filterCard(card){ - return get.type(card)=='basic'; + filterCard(card) { + return get.type(card) == "basic"; }, - viewAs:{name:links[0][2],nature:links[0][3]}, - popname:true, - ai1(card){ - return 6-get.value(card); - } - } + viewAs: { name: links[0][2], nature: links[0][3] }, + popname: true, + ai1(card) { + return 6 - get.value(card); + }, + }; + }, + prompt(links, player) { + return ( + "将一张基本牌当作" + + get.translation(links[0][3] || "") + + get.translation(links[0][2]) + + "使用" + ); }, - prompt(links,player){ - return '将一张基本牌当作'+get.translation(links[0][3]||'')+get.translation(links[0][2])+'使用'; - } }, - ai:{ - order(){ - var player=_status.event.player; - var event=_status.event; - if(event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0){ + ai: { + order() { + var player = _status.event.player; + var event = _status.event; + if ( + event.filterCard({ name: "jiu" }, player, event) && + get.effect(player, { name: "jiu" }) > 0 + ) { return 3.1; } return 2.9; }, - result:{ - player:1 - } - } + result: { + player: 1, + }, + }, }, - shouwang:{ - enable:'chooseToUse', - filter(event,player){ - return event.type=='dying'&&event.dying&&!event.dying.hasSkill('shouwang2'); + shouwang: { + enable: "chooseToUse", + filter(event, player) { + return event.type == "dying" && event.dying && !event.dying.hasSkill("shouwang2"); }, - filterTarget(card,player,target){ - return target==_status.event.dying; + filterTarget(card, player, target) { + return target == _status.event.dying; }, - selectTarget:-1, - content(){ + selectTarget: -1, + content() { target.recover(); target.changeHujia(); - target.addSkill('shouwang2') + target.addSkill("shouwang2"); }, - ai:{ - order:6, - skillTagFilter(player){ - if(!_status.event.dying||_status.event.dying.hasSkill('shouwang2')) return false; + ai: { + order: 6, + skillTagFilter(player) { + if (!_status.event.dying || _status.event.dying.hasSkill("shouwang2")) return false; }, - save:true, - result:{ - target:3 + save: true, + result: { + target: 3, }, - threaten:1.6 + threaten: 1.6, }, }, - shouwang2:{ + shouwang2: { charlotte: true, - mark:true, - intro:{ - content:'已发动' - } + mark: true, + intro: { + content: "已发动", + }, }, - qingtian:{ - trigger:{player:'damageBegin'}, - forced:true, - filter(event,player){ + qingtian: { + trigger: { player: "damageBegin" }, + forced: true, + filter(event, player) { return player.isMaxHp(true); }, - check(){ + check() { return false; }, - content(){ + content() { trigger.num++; - } - }, - qingtian_old:{ - trigger:{player:'recoverBefore'}, - forced:true, - filter(event,player){ - return player.hp>0&&event.num>0; }, - content(){ + }, + qingtian_old: { + trigger: { player: "recoverBefore" }, + forced: true, + filter(event, player) { + return player.hp > 0 && event.num > 0; + }, + content() { trigger.cancel(); player.changeHujia(trigger.num); }, - ai:{ - neg:true - } - }, - qianfu:{ - trigger:{player:'dieBefore'}, - forced:true, - filter(event,player){ - return !player.hasSkill('qianfu2')&&player.maxHp>0; + ai: { + neg: true, }, - unique:true, - content(){ + }, + qianfu: { + trigger: { player: "dieBefore" }, + forced: true, + filter(event, player) { + return !player.hasSkill("qianfu2") && player.maxHp > 0; + }, + unique: true, + content() { trigger.cancel(); - player.addSkill('qianfu2'); - player.hp=1; + player.addSkill("qianfu2"); + player.hp = 1; player.update(); - player.discard(player.getCards('he')); - player.setAvatar('hs_selajin','hs_selajin2'); + player.discard(player.getCards("he")); + player.setAvatar("hs_selajin", "hs_selajin2"); + }, + ai: { + threaten: 0.8, }, - ai:{ - threaten:0.8 - } }, - qianfu2:{ - mark:true, - intro:{ - content:'你防止非火焰伤害,不能使用或打出卡牌,并始终跳过你的回合' + qianfu2: { + mark: true, + intro: { + content: "你防止非火焰伤害,不能使用或打出卡牌,并始终跳过你的回合", }, - mod:{ - cardEnabled(card,player){ + mod: { + cardEnabled(card, player) { return false; }, - cardUsable(card,player){ + cardUsable(card, player) { return false; }, - cardRespondable(card,player){ + cardRespondable(card, player) { return false; }, - cardSavable(card,player){ + cardSavable(card, player) { return false; }, }, - group:['qianfu2_damage','qianfu2_phase','qianfu2_revive'], - subSkill:{ - damage:{ - trigger:{player:'damageBefore'}, - filter(event){ - if(event.nature!='fire') return true; + group: ["qianfu2_damage", "qianfu2_phase", "qianfu2_revive"], + subSkill: { + damage: { + trigger: { player: "damageBefore" }, + filter(event) { + if (event.nature != "fire") return true; return false; }, - mark:true, - forced:true, - content(){ + mark: true, + forced: true, + content() { trigger.cancel(); }, - ai:{ - nothunder:true, - nodamage:true, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'damage')&&!get.tag(card,'fireDamage')) return [0,0]; - } + ai: { + nothunder: true, + nodamage: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && !get.tag(card, "fireDamage")) + return [0, 0]; + }, }, }, }, - phase:{ - trigger:{player:'phaseBefore'}, - forced:true, - popup:false, - content(){ + phase: { + trigger: { player: "phaseBefore" }, + forced: true, + popup: false, + content() { trigger.cancel(); - } - }, - revive:{ - trigger:{player:['changeHp','loseMaxHpAfter']}, - forced:true, - filter(event,player){ - return player.hp>=3||player.isHealthy(); }, - content(){ - player.removeSkill('qianfu2'); + }, + revive: { + trigger: { player: ["changeHp", "loseMaxHpAfter"] }, + forced: true, + filter(event, player) { + return player.hp >= 3 || player.isHealthy(); + }, + content() { + player.removeSkill("qianfu2"); player.draw(3); - player.setAvatar('hs_selajin','hs_selajin'); - } - } - } - }, - shimo:{ - trigger:{global:'damageAfter'}, - forced:true, - filter(event,player){ - return event.player!=player&&get.distance(player,event.player)<=1; + player.setAvatar("hs_selajin", "hs_selajin"); + }, + }, }, - content(){ - if(player.isDamaged()){ + }, + shimo: { + trigger: { global: "damageAfter" }, + forced: true, + filter(event, player) { + return event.player != player && get.distance(player, event.player) <= 1; + }, + content() { + if (player.isDamaged()) { player.recover(); - } - else{ + } else { player.draw(); } - } - }, - lieyang:{ - trigger:{player:'useCard'}, - forced:true, - usable:3, - filter(event,player){ - return _status.currentPhase==player&&get.type(event.card,'trick')=='trick'; }, - content(){ - var list=get.inpile('trick','trick'); - player.gain(game.createCard(list.randomGet()),'draw'); - if(player.storage.counttrigger&&player.storage.counttrigger.lieyang>=3){ - player.addTempSkill('lieyang2'); + }, + lieyang: { + trigger: { player: "useCard" }, + forced: true, + usable: 3, + filter(event, player) { + return _status.currentPhase == player && get.type(event.card, "trick") == "trick"; + }, + content() { + var list = get.inpile("trick", "trick"); + player.gain(game.createCard(list.randomGet()), "draw"); + if (player.storage.counttrigger && player.storage.counttrigger.lieyang >= 3) { + player.addTempSkill("lieyang2"); } }, - ai:{ - threaten:1.8 - } - }, - lieyang2:{ - mod:{ - cardEnabled(card){if(get.type(card,'trick')=='trick') return false} - } - }, - zhuilie:{ - trigger:{player:'phaseBegin'}, - direct:true, - filter(event,player){ - return player.countCards('he')>0; + ai: { + threaten: 1.8, }, - content(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('zhuilie')).set('ai',function(card){ - if(player.hp>=4||(player.hasSha()&&player.hasShan())){ - return 6-get.value(card); + }, + lieyang2: { + mod: { + cardEnabled(card) { + if (get.type(card, "trick") == "trick") return false; + }, + }, + }, + zhuilie: { + trigger: { player: "phaseBegin" }, + direct: true, + filter(event, player) { + return player.countCards("he") > 0; + }, + content() { + "step 0"; + player.chooseToDiscard("he", get.prompt("zhuilie")).set("ai", function (card) { + if (player.hp >= 4 || (player.hasSha() && player.hasShan())) { + return 6 - get.value(card); } - if(player.hasSha()||player.hasShan()){ - return 3-get.value(card); + if (player.hasSha() || player.hasShan()) { + return 3 - get.value(card); } return 0; - }).logSkill='zhuilie'; - 'step 1' - if(result.bool){ - var list=[]; - var list2=[]; - for(var i=0;i<6&&i3){ + player.showCards( + get.translation(player) + "将" + get.cnNumber(list2.length) + "张牌移入弃牌堆", + list2 + ); + if (list2.length > 3) { player.draw(); } } - } + }, }, - szbianshen:{ - trigger:{player:'phaseBefore'}, - unique:true, - skillAnimation:true, - forceunique:true, - filter(){ - return game.roundNumber>=3; + szbianshen: { + trigger: { player: "phaseBefore" }, + unique: true, + skillAnimation: true, + forceunique: true, + filter() { + return game.roundNumber >= 3; }, - check(event,player){ - return player.hp<=2; + check(event, player) { + return player.hp <= 2; }, - content(){ - 'step 0' - var list=get.gainableCharacters(function(info){ - return info[2]>=5; + content() { + "step 0"; + var list = get.gainableCharacters(function (info) { + return info[2] >= 5; }); - var players=game.players.concat(game.dead); - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); - event.switchToAuto=function(){ - event._result=event.skillai(); + dialog.add(ui.create.div(".placeholder")); + event.switchToAuto = function () { + event._result = event.skillai(); dialog.close(); game.resume(); }; - _status.imchoosing=true; + _status.imchoosing = true; game.pause(); + } else { + event._result = event.skillai(); } - else{ - event._result=event.skillai(); - } - 'step 1' - _status.imchoosing=false; - var link=result; - player.addSkill(link,true); + ("step 1"); + _status.imchoosing = false; + var link = result; + player.addSkill(link, true); player.popup(link); - game.log(player,'获得了技能','【'+get.translation(link)+'】'); + game.log(player, "获得了技能", "【" + get.translation(link) + "】"); game.delay(); }, - ai:{ - effect:{ - target(card,player,target){ - if(get.type(card,'trick')=='trick'&&player==target) return [1,1]; - } - } - } + ai: { + effect: { + target(card, player, target) { + if (get.type(card, "trick") == "trick" && player == target) return [1, 1]; + }, + }, + }, }, - kqizhou:{ - trigger:{player:'phaseBegin'}, - direct:true, - filter(event,player){ + kqizhou: { + trigger: { player: "phaseBegin" }, + direct: true, + filter(event, player) { return player.storage.kqizhou; }, - content(){ - 'step 0' + content() { + "step 0"; delete player.storage.kqizhou; - var list=[['','','hsqizhou_feng'], - ['','','hsqizhou_shui'], - ['','','hsqizhou_huo'], - ['','','hsqizhou_tu']]; - var dialog=ui.create.dialog(get.prompt('kqizhou'),[list,'vcard'],'hidden'); - var shui=(player.hp<=1&&player.maxHp>=3); - var tu=game.hasPlayer(function(current){ - return current.hp==1&&get.attitude(player,current)>0; + var list = [ + ["", "", "hsqizhou_feng"], + ["", "", "hsqizhou_shui"], + ["", "", "hsqizhou_huo"], + ["", "", "hsqizhou_tu"], + ]; + var dialog = ui.create.dialog(get.prompt("kqizhou"), [list, "vcard"], "hidden"); + var shui = player.hp <= 1 && player.maxHp >= 3; + var tu = game.hasPlayer(function (current) { + return current.hp == 1 && get.attitude(player, current) > 0; }); - player.chooseButton(dialog).ai=function(button){ - if(!player.hasFriend()&&button.link[2]=='hsqizhou_tu') return 0; - if(player.isHealthy()&&button.link[2]=='hsqizhou_shui') return 0; - if(shui&&button.link[2]=='hsqizhou_shui') return 3; - if(tu&&button.link[2]=='hsqizhou_tu') return 2; + player.chooseButton(dialog).ai = function (button) { + if (!player.hasFriend() && button.link[2] == "hsqizhou_tu") return 0; + if (player.isHealthy() && button.link[2] == "hsqizhou_shui") return 0; + if (shui && button.link[2] == "hsqizhou_shui") return 3; + if (tu && button.link[2] == "hsqizhou_tu") return 2; return Math.random(); }; - 'step 1' - if(result.buttons){ - player.logSkill('kqizhou'); - player.gain(game.createCard(result.buttons[0].link[2]),'draw'); + ("step 1"); + if (result.buttons) { + player.logSkill("kqizhou"); + player.gain(game.createCard(result.buttons[0].link[2]), "draw"); } }, - group:'kqizhou_add', - subSkill:{ - add:{ - trigger:{player:'useCard'}, - silent:true, - filter(event,player){ - return _status.currentPhase==player&&get.type(event.card,'trick')=='trick'; + group: "kqizhou_add", + subSkill: { + add: { + trigger: { player: "useCard" }, + silent: true, + filter(event, player) { + return _status.currentPhase == player && get.type(event.card, "trick") == "trick"; }, - content(){ - player.storage.kqizhou=true; - } - } - } - }, - jingcu:{ - enable:'phaseUse', - filter(event,player){ - return player.maxHp>1; + content() { + player.storage.kqizhou = true; + }, + }, }, - content(){ - 'step 0' + }, + jingcu: { + enable: "phaseUse", + filter(event, player) { + return player.maxHp > 1; + }, + content() { + "step 0"; player.loseMaxHp(true); - 'step 1' + ("step 1"); player.draw(2); }, - ai:{ - order:1.5, - threaten:1.4, - result:{ - player(player){ - if(player.isDamaged()) return 1; - if(player.hp>=3&&!player.needsToDiscard(2)) return 1; + ai: { + order: 1.5, + threaten: 1.4, + result: { + player(player) { + if (player.isDamaged()) return 1; + if (player.hp >= 3 && !player.needsToDiscard(2)) return 1; return 0; - } - } + }, + }, }, }, - shengzhang:{ - trigger:{player:'phaseDiscardEnd'}, - forced:true, - filter(event,player){ - return event.cards&&event.cards.length>0; + shengzhang: { + trigger: { player: "phaseDiscardEnd" }, + forced: true, + filter(event, player) { + return event.cards && event.cards.length > 0; }, - content(){ + content() { player.gainMaxHp(true); - } - }, - pyuhuo:{ - unique:true, - skillAnimation:true, - animationColor:'fire', - trigger:{player:'dying'}, - priority:10, - filter(event,player){ - return player.storage.pyuhuo!='over'; }, - forced:true, - content(){ - 'step 0' - player.discard(player.getCards('hej')); - 'step 1' + }, + pyuhuo: { + unique: true, + skillAnimation: true, + animationColor: "fire", + trigger: { player: "dying" }, + priority: 10, + filter(event, player) { + return player.storage.pyuhuo != "over"; + }, + forced: true, + content() { + "step 0"; + player.discard(player.getCards("hej")); + ("step 1"); player.link(false); - 'step 2' + ("step 2"); player.turnOver(false); - 'step 3' - if(player.storage.pyuhuo=='mid'){ - player.storage.pyuhuo='over'; - player.awakenSkill('pyuhuo'); - player.hp=6; - player.maxHp=6; + ("step 3"); + if (player.storage.pyuhuo == "mid") { + player.storage.pyuhuo = "over"; + player.awakenSkill("pyuhuo"); + player.hp = 6; + player.maxHp = 6; player.draw(6); - player.setAvatar('hs_pyros','hs_pyros2'); - } - else{ - player.storage.pyuhuo='mid'; - player.hp=4; - player.maxHp=4; + player.setAvatar("hs_pyros", "hs_pyros2"); + } else { + player.storage.pyuhuo = "mid"; + player.hp = 4; + player.maxHp = 4; player.draw(4); - player.setAvatar('hs_pyros','hs_pyros1'); + player.setAvatar("hs_pyros", "hs_pyros1"); } }, - ai:{ - threaten(player,target){ - if(target.storage.pyuhuo=='mid') return 0.6; - if(target.storage.pyuhuo=='over') return 1; + ai: { + threaten(player, target) { + if (target.storage.pyuhuo == "mid") return 0.6; + if (target.storage.pyuhuo == "over") return 1; return 0.4; - } - } + }, + }, }, - mengye:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); + mengye: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); }); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt('mengye'),function(card,player,target){ - return target.countCards('h')>0; - }).ai=function(target){ - if(target.hasSkillTag('nodu')) return get.attitude(player,target)*1.5; - if(target.hasCard(function(card){ - return card.name!='du'; - })){ - return -get.attitude(player,target); + content() { + "step 0"; + player.chooseTarget(get.prompt("mengye"), function (card, player, target) { + return target.countCards("h") > 0; + }).ai = function (target) { + if (target.hasSkillTag("nodu")) return get.attitude(player, target) * 1.5; + if ( + target.hasCard(function (card) { + return card.name != "du"; + }) + ) { + return -get.attitude(player, target); } - return -get.attitude(player,target)/5; - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('mengye',target); - var card=target.getCards('h',function(card){ - return card.name!='du'; - }).randomGet(); - if(card){ - card.init([card.suit,card.number,'du']); + return -get.attitude(player, target) / 5; + }; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mengye", target); + var card = target + .getCards("h", function (card) { + return card.name != "du"; + }) + .randomGet(); + if (card) { + card.init([card.suit, card.number, "du"]); } target.changeHujia(); - game.log(target,'将一张手牌转化为',{name:'du'}); + game.log(target, "将一张手牌转化为", { name: "du" }); } }, - ai:{ - threaten:1.5 - } + ai: { + threaten: 1.5, + }, }, - mengye_old:{ - trigger:{player:'phaseAfter'}, - priority:-50, - direct:true, - filter(event,player){ - if(get.mode()=='identity'&&_status.mode=='zhong'&& - game.zhu&&!game.zhu.isZhu&&player==game.zhong){ + mengye_old: { + trigger: { player: "phaseAfter" }, + priority: -50, + direct: true, + filter(event, player) { + if ( + get.mode() == "identity" && + _status.mode == "zhong" && + game.zhu && + !game.zhu.isZhu && + player == game.zhong + ) { return false; } - if(_status.noswap){ + if (_status.noswap) { return false; } return !player.isTurnedOver(); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt('mengye'),function(card,player,target){ - if(target==player){ + content() { + "step 0"; + player.chooseTarget(get.prompt("mengye"), function (card, player, target) { + if (target == player) { return false; } - if(get.mode()=='identity'&&_status.mode=='zhong'&&game.zhu&&!game.zhu.isZhu){ - return target==game.zhong; + if ( + get.mode() == "identity" && + _status.mode == "zhong" && + game.zhu && + !game.zhu.isZhu + ) { + return target == game.zhong; } - if(target.identity=='zhu'||get.is.jun(target)) return false; + if (target.identity == "zhu" || get.is.jun(target)) return false; return true; - }).ai=function(target){ - var att=-get.attitude(player,target); - if(att<=0) return 0; - if(target.needsToDiscard()) att+=3; - else if(target.needsToDiscard(1)) att++; - else if(target.countCards()<=3){ + }).ai = function (target) { + var att = -get.attitude(player, target); + if (att <= 0) return 0; + if (target.needsToDiscard()) att += 3; + else if (target.needsToDiscard(1)) att++; + else if (target.countCards() <= 3) { return 0; } - return att+target.countCards('h')+get.threaten(target); + return att + target.countCards("h") + get.threaten(target); }; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('mengye',target); - target.storage.mengye2=player; - target.storage.mengye4=target.ai.shown; - target.addSkill('mengye2'); - event.target=target; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mengye", target); + target.storage.mengye2 = player; + target.storage.mengye4 = target.ai.shown; + target.addSkill("mengye2"); + event.target = target; player.turnOver(); - } - else{ + } else { event.finish(); } - 'step 2' + ("step 2"); game.delay(); - 'step 3' - var target=event.target; - if(player==game.me){ + ("step 3"); + var target = event.target; + if (player == game.me) { game.swapPlayerAuto(target); - target.storage.mengye3=true; + target.storage.mengye3 = true; + } else { + target.addSkill("mad"); + target.unmarkSkill("mad"); } - else{ - target.addSkill('mad'); - target.unmarkSkill('mad'); - } - player.out('mengye'); + player.out("mengye"); target.insertPhase(); }, - ai:{ - threaten:2 - } + ai: { + threaten: 2, + }, }, - mengye2:{ - temp:true, - mark:'character', - vanish:true, - intro:{ - content:'由$控制本回合行动' + mengye2: { + temp: true, + mark: "character", + vanish: true, + intro: { + content: "由$控制本回合行动", }, - init(player){ - player.ai.modAttitudeFrom=function(from,to){ - return get.attitude(player.storage.mengye2,to); - } - player.ai.modAttitudeTo=function(from,to,att){ - if(from!=to) return 0; + init(player) { + player.ai.modAttitudeFrom = function (from, to) { + return get.attitude(player.storage.mengye2, to); + }; + player.ai.modAttitudeTo = function (from, to, att) { + if (from != to) return 0; return att; - } + }; }, - onremove(player){ + onremove(player) { delete player.ai.modAttitudeFrom; delete player.ai.modAttitudeTo; delete player.storage.mengye2; delete player.storage.mengye3; delete player.storage.mengye4; }, - trigger:{player:['phaseAfter','dieBegin']}, - forced:true, - popup:false, - content(){ - player.storage.mengye2.in('mengye'); - if(player==game.me&&player.storage.mengye3){ + trigger: { player: ["phaseAfter", "dieBegin"] }, + forced: true, + popup: false, + content() { + player.storage.mengye2.in("mengye"); + if (player == game.me && player.storage.mengye3) { game.swapPlayerAuto(player.storage.mengye2); } - if(typeof player.ai.shown=='number'){ - player.ai.shown=player.storage.mengye4; + if (typeof player.ai.shown == "number") { + player.ai.shown = player.storage.mengye4; } - player.removeSkill('mad'); - player.removeSkill('mengye2'); - } + player.removeSkill("mad"); + player.removeSkill("mengye2"); + }, }, - mengye3:{}, - lianzhan:{ - trigger:{source:'damageEnd'}, - forced:true, - content(){ - if(player.getStat().damage>trigger.num){ + mengye3: {}, + lianzhan: { + trigger: { source: "damageEnd" }, + forced: true, + content() { + if (player.getStat().damage > trigger.num) { player.gainMaxHp(); player.recover(); - } - else{ + } else { player.draw(2); } }, - ai:{ - damageBonus:true - } + ai: { + damageBonus: true, + }, }, - lianzhan2:{}, - kuixin:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return game.hasPlayer(function(current){ - if(current==player) return false; - var nh=current.countCards('h'); - return nh&&nh>=player.countCards('h'); + lianzhan2: {}, + kuixin: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return game.hasPlayer(function (current) { + if (current == player) return false; + var nh = current.countCards("h"); + return nh && nh >= player.countCards("h"); }); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt('kuixin'),function(card,player,target){ - if(target==player) return false; - var nh=target.countCards('h'); - return nh&&nh>=player.countCards('h'); - }).ai=function(target){ - var att=get.attitude(player,target); - if(target.hasSkillTag('noe')){ - att/=3; + content() { + "step 0"; + player.chooseTarget(get.prompt("kuixin"), function (card, player, target) { + if (target == player) return false; + var nh = target.countCards("h"); + return nh && nh >= player.countCards("h"); + }).ai = function (target) { + var att = get.attitude(player, target); + if (target.hasSkillTag("noe")) { + att /= 3; } return -att; - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - var card=target.getCards('h').randomGet(); - if(card){ - player.logSkill('kuixin',target); - player.gain(card,target); - target.$giveAuto(card,player); + }; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + var card = target.getCards("h").randomGet(); + if (card) { + player.logSkill("kuixin", target); + player.gain(card, target); + target.$giveAuto(card, player); } } - } + }, }, - fuhua:{ - enable:'phaseUse', - filterCard:{name:'du'}, - check(){return 1}, - filterTarget(card,player,target){ - return !target.hasSkill('moxie')&&!target.hasSkill('fuhua2'); + fuhua: { + enable: "phaseUse", + filterCard: { name: "du" }, + check() { + return 1; }, - filter(event,player){ - return player.countCards('h','du')>0; + filterTarget(card, player, target) { + return !target.hasSkill("moxie") && !target.hasSkill("fuhua2"); }, - discard:false, - prepare:'give', - content(){ - 'step 0' - target.gain(cards,player); - var choice=1; - if(get.attitude(target,player)>0||(target.hp<=1&&!target.hasSha())){ - choice=0; + filter(event, player) { + return player.countCards("h", "du") > 0; + }, + discard: false, + prepare: "give", + content() { + "step 0"; + target.gain(cards, player); + var choice = 1; + if (get.attitude(target, player) > 0 || (target.hp <= 1 && !target.hasSha())) { + choice = 0; } - target.chooseControl(function(){ - return choice; - }).set('choiceList',['获得技能魔血,每个出牌阶段开始时需交给'+get.translation(player)+'一张牌', - '视为'+get.translation(player)+'对你使用一张决斗,若你赢,本局不能再成为腐化目标']); - 'step 1' - if(result.index==0){ - target.storage.fuhua2=player; - target.addSkill('fuhua2'); - target.addSkill('moxie'); - } - else{ - player.useCard({name:'juedou'},target); + target + .chooseControl(function () { + return choice; + }) + .set("choiceList", [ + "获得技能魔血,每个出牌阶段开始时需交给" + get.translation(player) + "一张牌", + "视为" + + get.translation(player) + + "对你使用一张决斗,若你赢,本局不能再成为腐化目标", + ]); + ("step 1"); + if (result.index == 0) { + target.storage.fuhua2 = player; + target.addSkill("fuhua2"); + target.addSkill("moxie"); + } else { + player.useCard({ name: "juedou" }, target); } }, - ai:{ - threaten:1.5, - order:8, - expos:0.2, - result:{ - player(player,target){ - if(player.countCards('h')<=2) return 0; - if(get.attitude(target,player)>0) return 1; - if(get.effect(target,{name:'juedou'},player,player)>0) return 1.5; + ai: { + threaten: 1.5, + order: 8, + expos: 0.2, + result: { + player(player, target) { + if (player.countCards("h") <= 2) return 0; + if (get.attitude(target, player) > 0) return 1; + if (get.effect(target, { name: "juedou" }, player, player) > 0) return 1.5; return 0; - } - } - } - }, - fuhua2:{ - trigger:{player:'phaseEnd'}, - forced:true, - priority:1, - filter(event,player){ - return player.storage.fuhua2.isIn()&&player.countCards('h')>0; - }, - mark:'character', - intro:{ - content(storage){ - return '每个结束阶段需交给'+get.translation(storage)+'一张手牌'; - } - }, - content(){ - 'step 0' - player.chooseCard('h',true,'交给'+get.translation(player.storage.fuhua2)+'一张手牌'); - 'step 1' - if(result.bool){ - player.storage.fuhua2.gain(result.cards,player); - player.$give(result.cards,player.storage.fuhua2); - player.line(player.storage.fuhua2,'green'); - } - }, - group:'fuhua2_remove', - onremove:true, - subSkill:{ - remove:{ - trigger:{global:'dieAfter'}, - forced:true, - popup:false, - filter(event,player){ - return event.player==player.storage.fuhua2; }, - content(){ - player.removeSkill('fuhua2'); - } - } - } - }, - fuhua3:{ - trigger:{player:'damageBefore'}, - forced:true, - popup:false, - filter(event,player){ - var evt=event.getParent(3); - return evt.name=='fuhua'&&evt.target==event.source; + }, }, - content(){ - trigger.getParent(3).target.storage.fuhua_failed=true; - } }, - moxie:{ - trigger:{player:'loseHpBegin'}, - forced:true, - filter:(event)=>event.type=='du', - content(){ + fuhua2: { + trigger: { player: "phaseEnd" }, + forced: true, + priority: 1, + filter(event, player) { + return player.storage.fuhua2.isIn() && player.countCards("h") > 0; + }, + mark: "character", + intro: { + content(storage) { + return "每个结束阶段需交给" + get.translation(storage) + "一张手牌"; + }, + }, + content() { + "step 0"; + player.chooseCard( + "h", + true, + "交给" + get.translation(player.storage.fuhua2) + "一张手牌" + ); + ("step 1"); + if (result.bool) { + player.storage.fuhua2.gain(result.cards, player); + player.$give(result.cards, player.storage.fuhua2); + player.line(player.storage.fuhua2, "green"); + } + }, + group: "fuhua2_remove", + onremove: true, + subSkill: { + remove: { + trigger: { global: "dieAfter" }, + forced: true, + popup: false, + filter(event, player) { + return event.player == player.storage.fuhua2; + }, + content() { + player.removeSkill("fuhua2"); + }, + }, + }, + }, + fuhua3: { + trigger: { player: "damageBefore" }, + forced: true, + popup: false, + filter(event, player) { + var evt = event.getParent(3); + return evt.name == "fuhua" && evt.target == event.source; + }, + content() { + trigger.getParent(3).target.storage.fuhua_failed = true; + }, + }, + moxie: { + trigger: { player: "loseHpBegin" }, + forced: true, + filter: (event) => event.type == "du", + content() { trigger.cancel(); player.draw(2); }, - ai:{ - threaten:1.2, - nodu:true, - usedu:true, + ai: { + threaten: 1.2, + nodu: true, + usedu: true, }, - group:'moxie_use', - subSkill:{ - use:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.countCards('h')>0; + group: "moxie_use", + subSkill: { + use: { + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.countCards("h") > 0; }, - content(){ - var hs=player.getCards('h'); - for(var i=0;iplayer.hp; + moxue_old: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + return game.hasPlayer(function (current) { + return current.hp > player.hp; }); }, - logTarget(event,player){ - return game.filterPlayer(function(current){ - return current.hp>player.hp; + logTarget(event, player) { + return game.filterPlayer(function (current) { + return current.hp > player.hp; }); }, - content(){ - 'step 0' - event.targets=game.filterPlayer(function(current){ - return current.hp>player.hp; + content() { + "step 0"; + event.targets = game.filterPlayer(function (current) { + return current.hp > player.hp; }); event.targets.sortBySeat(); - 'step 1' - if(event.targets.length){ - event.target=event.targets.shift(); - if(event.target.countCards('he',{color:'black'})){ - event.target.chooseCard('he','交给'+get.translation(player)+'一张黑色牌,或失去1点体力',{color:'black'}).ai=function(card){ - if(get.attitude(event.target,player)>0) return 10-get.value(card); - return 7-get.value(card); - } - } - else{ + ("step 1"); + if (event.targets.length) { + event.target = event.targets.shift(); + if (event.target.countCards("he", { color: "black" })) { + event.target.chooseCard( + "he", + "交给" + get.translation(player) + "一张黑色牌,或失去1点体力", + { color: "black" } + ).ai = function (card) { + if (get.attitude(event.target, player) > 0) return 10 - get.value(card); + return 7 - get.value(card); + }; + } else { event.target.loseHp(); event.redo(); } - } - else{ + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.gain(result.cards,event.target); - if(get.position(result.cards[0])=='e'){ - event.target.$give(result.cards,player); + ("step 2"); + if (result.bool) { + player.gain(result.cards, event.target); + if (get.position(result.cards[0]) == "e") { + event.target.$give(result.cards, player); + } else { + event.target.$give(result.cards.length, player); } - else{ - event.target.$give(result.cards.length,player); - } - } - else{ + } else { event.target.loseHp(); } event.goto(1); - } - }, - gfuhun:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return player.countCards('h')>0&&!player.isTurnedOver(); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt('gfuhun'),function(card,player,target){ - return target!=player&&target.countCards('h')>0; - }).ai=function(target){ - return -get.attitude(player,target); - } - 'step 1' - if(result.bool){ - player.logSkill('gfuhun',result.targets); - event.target=result.targets[0]; + }, + gfuhun: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return player.countCards("h") > 0 && !player.isTurnedOver(); + }, + content() { + "step 0"; + player.chooseTarget(get.prompt("gfuhun"), function (card, player, target) { + return target != player && target.countCards("h") > 0; + }).ai = function (target) { + return -get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("gfuhun", result.targets); + event.target = result.targets[0]; player.chooseToCompare(event.target); - } - else{ + } else { event.finish(); } - 'step 2' - if(result.bool){ - event.target.goMad({player:'phaseAfter'}); - if(!player.isTurnedOver()) player.turnOver(); + ("step 2"); + if (result.bool) { + event.target.goMad({ player: "phaseAfter" }); + if (!player.isTurnedOver()) player.turnOver(); } }, - ai:{ - expose:0.2, - threaten:1.5 - } + ai: { + expose: 0.2, + threaten: 1.5, + }, }, - qianhou:{ - trigger:{player:'phaseBegin'}, - forced:true, - content(){ - 'step 0' - var list=[]; - for(var i=0;i0&&info.selectTarget[1]>=info.selectTarget[0]){ + qianhou: { + trigger: { player: "phaseBegin" }, + forced: true, + content() { + "step 0"; + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + if (lib.filter.filterCard({ name: lib.inpile[i] }, player)) { + var info = lib.card[lib.inpile[i]]; + if (info.type == "trick" && !info.multitarget && !info.notarget) { + if (Array.isArray(info.selectTarget)) { + if ( + info.selectTarget[0] > 0 && + info.selectTarget[1] >= info.selectTarget[0] + ) { list.push(lib.inpile[i]); } - } - else if(typeof info.selectTarget=='number'){ + } else if (typeof info.selectTarget == "number") { list.push(lib.inpile[i]); } } } } - while(list.length){ - var card={name:list.randomRemove()}; - var info=get.info(card); - var targets=game.filterPlayer(function(current){ - return lib.filter.filterTarget(card,player,current); + while (list.length) { + var card = { name: list.randomRemove() }; + var info = get.info(card); + var targets = game.filterPlayer(function (current) { + return lib.filter.filterTarget(card, player, current); }); - if(targets.length){ + if (targets.length) { targets.sort(lib.sort.seat); - if(info.selectTarget!=-1){ - var num=info.selectTarget; - if(Array.isArray(num)){ - if(targets.length0; + zhongji: { + trigger: { source: "damageBegin" }, + direct: true, + filter(event, player) { + return player.countCards("h", { color: "black" }) > 0; }, - content(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('zhongji',trigger.player),{color:'black'}); - next.logSkill=['zhongji',trigger.player]; - next.ai=function(card){ - if(get.attitude(player,trigger.player)<0){ - return 7-get.value(card); + content() { + "step 0"; + var next = player.chooseToDiscard(get.prompt("zhongji", trigger.player), { + color: "black", + }); + next.logSkill = ["zhongji", trigger.player]; + next.ai = function (card) { + if (get.attitude(player, trigger.player) < 0) { + return 7 - get.value(card); } return -1; - } - "step 1" - if(result.bool){ + }; + ("step 1"); + if (result.bool) { trigger.num++; } }, - ai:{ - threaten:1.3 - } + ai: { + threaten: 1.3, + }, }, - fuwen:{ - trigger:{player:'phaseDiscardEnd'}, - frequent:true, - filter(event,player){ - if(event.cards){ - for(var i=0;i0; + jinzhou: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return player.countCards("h", { suit: "spade" }) > 0; }, - content(){ - 'step 0' - player.chooseTarget(get.prompt('jinzhou'),function(card,player,target){ - return target!=player&&!target.hasSkill('fengyin'); - }).ai=function(target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - var skills=target.getSkills(); - for(var i=0;i= 0) return 0; + var skills = target.getSkills(); + for (var i = 0; i < skills.length; i++) { + if (!get.is.locked(skills[i])) { + if (target.hasSkillTag("maixie")) return 2; return get.threaten(target); } } return 0; - } - 'step 1' - if(result.bool){ - player.logSkill('jinzhou',result.targets); - result.targets[0].addTempSkill('fengyin',{player:'phaseAfter'}); + }; + ("step 1"); + if (result.bool) { + player.logSkill("jinzhou", result.targets); + result.targets[0].addTempSkill("fengyin", { player: "phaseAfter" }); } }, - ai:{ - expose:0.2, - threaten:1.4 - } + ai: { + expose: 0.2, + threaten: 1.4, + }, }, - midian:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h',{type:['trick','delay']})>0; + midian: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h", { type: ["trick", "delay"] }) > 0; }, - filterCard:{type:['trick','delay']}, - check(card){ - return 10-get.value(card); + filterCard: { type: ["trick", "delay"] }, + check(card) { + return 10 - get.value(card); }, - content(){ - var list=get.inpile('trick','trick'); - var list2=[]; - for(var i=0;i<3;i++){ + content() { + var list = get.inpile("trick", "trick"); + var list2 = []; + for (var i = 0; i < 3; i++) { list2.push(game.createCard(list.randomGet())); } - player.gain(list2,'draw'); + player.gain(list2, "draw"); + }, + ai: { + order: 9.8, + threaten: 1.8, + result: { + player: 1, + }, }, - ai:{ - order:9.8, - threaten:1.8, - result:{ - player:1 - } - } }, - xingluo:{ - trigger:{player:'phaseBegin'}, - direct:true, - filter(event,player){ + xingluo: { + trigger: { player: "phaseBegin" }, + direct: true, + filter(event, player) { return !player.isMaxHandcard(); }, - content(){ - 'step 0' - var nh=player.countCards('h'); - var num=game.countPlayer(function(current){ - return current.countCards('h')>nh; + content() { + "step 0"; + var nh = player.countCards("h"); + var num = game.countPlayer(function (current) { + return current.countCards("h") > nh; }); - player.chooseTarget(get.prompt('xingluo'),[1,num],function(card,player,target){ - return target.countCards('h')>nh; - }).ai=function(target){ - return 0.5-get.attitude(player,target); - } - 'step 1' - if(result.bool){ - event.cards=[]; - event.list=result.targets.slice(0); + player.chooseTarget(get.prompt("xingluo"), [1, num], function (card, player, target) { + return target.countCards("h") > nh; + }).ai = function (target) { + return 0.5 - get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + event.cards = []; + event.list = result.targets.slice(0); event.list.sort(lib.sort.seat); - player.logSkill('xingluo',result.targets); - } - else{ + player.logSkill("xingluo", result.targets); + } else { event.finish(); } - 'step 2' - if(event.list.length){ - event.list.shift().chooseToDiscard('h',true); - } - else{ + ("step 2"); + if (event.list.length) { + event.list.shift().chooseToDiscard("h", true); + } else { event.goto(4); } - 'step 3' - if(result.bool&&result.cards.length){ + ("step 3"); + if (result.bool && result.cards.length) { event.cards.push(result.cards[0]); } event.goto(2); - 'step 4' - if(event.cards.length){ - player.chooseCardButton('选择一张加入手牌',event.cards).ai=function(button){ + ("step 4"); + if (event.cards.length) { + player.chooseCardButton("选择一张加入手牌", event.cards).ai = function (button) { return get.value(button.link); }; - } - else{ + } else { event.finish(); } - 'step 5' - if(result.bool){ - player.gain(result.links,'gain2'); + ("step 5"); + if (result.bool) { + player.gain(result.links, "gain2"); } }, - ai:{ - expose:0.2 - } + ai: { + expose: 0.2, + }, }, - yuelu:{ - enable:'chooseToUse', - filter(event,player){ - return event.type=='dying'&&player.countCards('he',{color:'black'})>0; + yuelu: { + enable: "chooseToUse", + filter(event, player) { + return event.type == "dying" && player.countCards("he", { color: "black" }) > 0; }, // alter:true, - filterCard:{color:'black'}, - position:'he', - check(card){ - return 11-get.value(card); + filterCard: { color: "black" }, + position: "he", + check(card) { + return 11 - get.value(card); }, - filterTarget(card,player,target){ - return target==_status.event.dying; + filterTarget(card, player, target) { + return target == _status.event.dying; }, - selectTarget:-1, - content(){ + selectTarget: -1, + content() { target.recover(); - if(!get.is.altered('yuelu')) target.changeHujia(); + if (!get.is.altered("yuelu")) target.changeHujia(); }, - ai:{ - order:10, - skillTagFilter(player){ - if(player.countCards('he',{color:'black'})==0) return false; + ai: { + order: 10, + skillTagFilter(player) { + if (player.countCards("he", { color: "black" }) == 0) return false; }, - save:true, - result:{ - target:3 + save: true, + result: { + target: 3, }, - threaten:2.5 + threaten: 2.5, }, }, - yushou:{ - enable:'phaseUse', - filterCard:true, - position:'he', - check(card){ - var player=_status.event.player; - var num=0; - if(player.hasSkill('yushou_misha')) num+=1.5; - if(player.hasSkill('yushou_huofu')) num+=1.5; - if(player.hasSkill('yushou_leiouke')) num+=1.5; - return 5-num-get.value(card); + yushou: { + enable: "phaseUse", + filterCard: true, + position: "he", + check(card) { + var player = _status.event.player; + var num = 0; + if (player.hasSkill("yushou_misha")) num += 1.5; + if (player.hasSkill("yushou_huofu")) num += 1.5; + if (player.hasSkill("yushou_leiouke")) num += 1.5; + return 5 - num - get.value(card); }, - filter(event,player){ - if(player.hasSkill('yushou_misha')&&player.hasSkill('yushou_huofu')&&player.hasSkill('yushou_leiouke')) return false; + filter(event, player) { + if ( + player.hasSkill("yushou_misha") && + player.hasSkill("yushou_huofu") && + player.hasSkill("yushou_leiouke") + ) + return false; return true; }, - content(){ - if(!lib.character.stone_misha){ - lib.character.stone_misha=['male','shu',3,['lschaofeng'],['minskin','stone','mode:stone'],[3,3,'hunter']]; + content() { + if (!lib.character.stone_misha) { + lib.character.stone_misha = [ + "male", + "shu", + 3, + ["lschaofeng"], + ["minskin", "stone", "mode:stone"], + [3, 3, "hunter"], + ]; } - if(!lib.character.stone_huofu){ - lib.character.stone_huofu=['male','qun',2,['stone_chongfeng'],['minskin','stone','mode:stone'],[3,4,'hunter']]; + if (!lib.character.stone_huofu) { + lib.character.stone_huofu = [ + "male", + "qun", + 2, + ["stone_chongfeng"], + ["minskin", "stone", "mode:stone"], + [3, 4, "hunter"], + ]; } - if(!lib.character.stone_leiouke){ - lib.character.stone_leiouke=['male','shu',2,['hunter_zhanhuo'],['minskin','stone','mode:stone'],[3,1,'hunter']]; + if (!lib.character.stone_leiouke) { + lib.character.stone_leiouke = [ + "male", + "shu", + 2, + ["hunter_zhanhuo"], + ["minskin", "stone", "mode:stone"], + [3, 1, "hunter"], + ]; } - var list=['misha','leiouke','huofu']; - for(var i=0;i=1; }, - content(){ + }, + yushou_misha: { + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { + return event.num >= 1; + }, + content() { player.changeHujia(); }, - ai:{ - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return; + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return; return 0.6; } - } - } - }, - }, - yushou_huofu:{ - enable:'phaseUse', - viewAs:{name:'juedou'}, - filterCard:{color:'black'}, - position:'he', - viewAsFilter(player){ - if(!player.countCards('he',{color:'black'})) return false; - }, - check(card){ - return 6-get.value(card); - }, - ai:{ - basic:{ - order:10 - } - } - }, - yushou_leiouke:{ - trigger:{source:'damageBegin'}, - forced:true, - usable:1, - content(){ - trigger.num++; - } - }, - qingzun:{ - // alter:true, - subSkill:{ - count:{ - trigger:{player:'useCard'}, - silent:true, - filter(event,player){ - return event.card.name.indexOf('hsqingyu_')==0; }, - content(){ + }, + }, + }, + yushou_huofu: { + enable: "phaseUse", + viewAs: { name: "juedou" }, + filterCard: { color: "black" }, + position: "he", + viewAsFilter(player) { + if (!player.countCards("he", { color: "black" })) return false; + }, + check(card) { + return 6 - get.value(card); + }, + ai: { + basic: { + order: 10, + }, + }, + }, + yushou_leiouke: { + trigger: { source: "damageBegin" }, + forced: true, + usable: 1, + content() { + trigger.num++; + }, + }, + qingzun: { + // alter:true, + subSkill: { + count: { + trigger: { player: "useCard" }, + silent: true, + filter(event, player) { + return event.card.name.indexOf("hsqingyu_") == 0; + }, + content() { player.storage.qingzun++; player.updateMarks(); - } - }, - draw1:{ - trigger:{player:'phaseBegin'}, - filter(event,player){ - if(get.is.altered('qingzun')) return player.storage.qingzun>=3; - return player.storage.qingzun>=2; }, - frequent:true, - content(){ - player.draw(); - } }, - draw2:{ - trigger:{player:'phaseEnd'}, - filter(event,player){ - if(get.is.altered('qingzun')) return player.storage.qingzun>=9; - return player.storage.qingzun>=6; + draw1: { + trigger: { player: "phaseBegin" }, + filter(event, player) { + if (get.is.altered("qingzun")) return player.storage.qingzun >= 3; + return player.storage.qingzun >= 2; }, - frequent:true, - content(){ + frequent: true, + content() { player.draw(); - } + }, + }, + draw2: { + trigger: { player: "phaseEnd" }, + filter(event, player) { + if (get.is.altered("qingzun")) return player.storage.qingzun >= 9; + return player.storage.qingzun >= 6; + }, + frequent: true, + content() { + player.draw(); + }, }, }, - mod:{ - maxHandcard(player,num){ - return num+player.storage.qingzun; - } + mod: { + maxHandcard(player, num) { + return num + player.storage.qingzun; + }, }, - init(player){ - player.storage.qingzun=0; + init(player) { + player.storage.qingzun = 0; }, - mark:true, - marktext:'玉', - intro:{ - content(storage,player){ - if(!storage) return '未使用过青玉牌'; - var str='手牌上限+'+storage; - var num1,num2; - if(get.is.altered('qingzun')){ - num1=3; - num2=9; + mark: true, + marktext: "玉", + intro: { + content(storage, player) { + if (!storage) return "未使用过青玉牌"; + var str = "手牌上限+" + storage; + var num1, num2; + if (get.is.altered("qingzun")) { + num1 = 3; + num2 = 9; + } else { + num1 = 2; + num2 = 6; } - else{ - num1=2; - num2=6; - } - if(storage>=num2){ - str+=';准备阶段和结束阶段,你可以摸一张牌' - } - else if(storage>=num1){ - str+=';准备阶段,你可以摸一张牌' + if (storage >= num2) { + str += ";准备阶段和结束阶段,你可以摸一张牌"; + } else if (storage >= num1) { + str += ";准备阶段,你可以摸一张牌"; } return str; - } + }, }, - group:['qingzun_count','qingzun_draw1','qingzun_draw2'], + group: ["qingzun_count", "qingzun_draw1", "qingzun_draw2"], }, - ayuling:{ - trigger:{player:'damageEnd'}, - frequent:true, - content(){ - var list=['feibiao','hufu','zhao','zhanfang','shandian']; - player.gain(game.createCard('hsqingyu_'+list.randomGet()),'draw'); + ayuling: { + trigger: { player: "damageEnd" }, + frequent: true, + content() { + var list = ["feibiao", "hufu", "zhao", "zhanfang", "shandian"]; + player.gain(game.createCard("hsqingyu_" + list.randomGet()), "draw"); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(target.hp>=4) return [1,get.tag(card,'damage')*2]; - if(target.hp==3) return [1,get.tag(card,'damage')*1.5]; - if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [1, get.tag(card, "damage") * 2]; + if (target.hp == 3) return [1, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; } - } - } - } + }, + }, + }, }, - aoshu:{ - enable:'phaseUse', - usable:1, - position:'he', - filterCard(card){ - return get.suit(card)=='spade'; + aoshu: { + enable: "phaseUse", + usable: 1, + position: "he", + filterCard(card) { + return get.suit(card) == "spade"; }, - viewAs:{name:'wuzhong'}, - viewAsFilter(player){ - if(!player.countCards('he',{suit:'spade'})) return false; + viewAs: { name: "wuzhong" }, + viewAsFilter(player) { + if (!player.countCards("he", { suit: "spade" })) return false; + }, + prompt: "将一张黑桃牌当作无中生有使用", + check(card) { + return 7 - get.value(card); + }, + ai: { + threaten: 1.4, + order: 9, }, - prompt:'将一张黑桃牌当作无中生有使用', - check(card){return 7-get.value(card)}, - ai:{ - threaten:1.4, - order:9, - } }, - bzhuiji:{ - trigger:{global:'dieAfter'}, - check(event,player){ - return get.attitude(player,event.source)<=0; + bzhuiji: { + trigger: { global: "dieAfter" }, + check(event, player) { + return get.attitude(player, event.source) <= 0; }, - filter(event,player){ - return event.source&&event.source.isAlive()&&event.source!=player; + filter(event, player) { + return event.source && event.source.isAlive() && event.source != player; }, - content(){ + content() { player.draw(2); - player.useCard({name:'juedou'},trigger.source); + player.useCard({ name: "juedou" }, trigger.source); + }, + ai: { + threaten: 1.5, + expose: 0.1, }, - ai:{ - threaten:1.5, - expose:0.1 - } }, - lianjin_old:{ - enable:'phaseUse', - usable:2, - filterCard:true, - check(card){ - return 7-get.value(card); + lianjin_old: { + enable: "phaseUse", + usable: 2, + filterCard: true, + check(card) { + return 7 - get.value(card); }, - content(){ - 'step 0' - var list=get.inpile('trick'); - list=list.randomGets(3); - for(var i=0;i=2) continue; - if(names.length>=3) continue; - var select=get.select(info.selectTarget); - if(select[0]==-1&&select[1]==-1){ + if (equip && names.length >= 2) continue; + if (names.length >= 3) continue; + var select = get.select(info.selectTarget); + if (select[0] == -1 && select[1] == -1) { names.push(inpile[i]); - if(info.modTarget) single=true; - } - else if(select[0]==1&&select[1]==1){ + if (info.modTarget) single = true; + } else if (select[0] == 1 && select[1] == 1) { names.push(inpile[i]); - single=true; + single = true; } } - if(equip){ + if (equip) { names.push(equips.randomGet()); } names.sort(lib.sort.name); - var name='hsyaoshui_'+names[0]+'_'+names[1]+'_'+names[2]; - if(!lib.card[name]){ - lib.card[name]=get.copy(lib.skill.lianjin.template); - lib.card[name].names=names; - lib.card[name].selectTarget=single?1:-1; - lib.translate[name]='药水'; - lib.translate[name+'_info']=get.translation(names[0])+'、'+ - get.translation(names[1])+'、'+get.translation(names[2]); + var name = "hsyaoshui_" + names[0] + "_" + names[1] + "_" + names[2]; + if (!lib.card[name]) { + lib.card[name] = get.copy(lib.skill.lianjin.template); + lib.card[name].names = names; + lib.card[name].selectTarget = single ? 1 : -1; + lib.translate[name] = "药水"; + lib.translate[name + "_info"] = + get.translation(names[0]) + + "、" + + get.translation(names[1]) + + "、" + + get.translation(names[2]); } - var fakecard=game.createCard(name,cards[0].suit,cards[0].number); - player.gain(fakecard,'gain2'); + var fakecard = game.createCard(name, cards[0].suit, cards[0].number); + player.gain(fakecard, "gain2"); // cards[0].style.transitionDuration='0.2s'; // ui.refresh(cards[0]); // cards[0].classList.add('opaque'); @@ -3489,3568 +3719,3747 @@ game.import('character', function () { // cards[0].classList.remove('opaque'); // game.delay(0,200); }, - template:{ - type:'hsyaoshui', - enable:true, - fullimage:true, - image:'card/hsyaoshui', - vanish:true, - derivation:'hs_kazhakusi', - multitarget:true, - multiline:true, - filterTarget(card,player,target){ - var info=get.info(card); - var names=info.names; - for(var i=0;i=3) return -1; - var num=0; - for(var i=0;i0){ + ai: { + order: 9.1, + threaten: 1.5, + result: { + target(player, target, card) { + var info = get.info(card); + if (!info) return 0; + if (!Array.isArray(info.names)) return 0; + var names = info.names; + if (names.includes("xingjiegoutong") && target.countCards("h") >= 3) + return -1; + var num = 0; + for (var i = 0; i < names.length; i++) { + var info2 = lib.card[names[i]]; + if (get.select(info2.selectTarget)[0] == -1 && !info2.modTarget) continue; + var eff = get.effect(target, { name: names[i] }, player, target); + if (eff > 0) { num++; - } - else if(eff<0){ - num-=0.9; + } else if (eff < 0) { + num -= 0.9; } } return num; - } - } - } - }, - ai:{ - order:9, - result:{ - player:1 + }, + }, }, - threaten:1.4 }, - group:'lianjin_discard', - subSkill:{ - discard:{ - trigger:{player:'discardAfter'}, - forced:true, - filter(event){ - for(var i=0;i0; + player.gain(cards, "draw2", "log"); }, - content(){ - player.gain(game.createCard(trigger.target.getCards('h').randomGet()),'draw'); - } }, - miss:{ - trigger:{player:'shaMiss'}, - frequent:true, - usable:1, - filter(event){ - return event.target.hasCard(function(card){ - return !get.info(card).unique; - },'e'); - }, - content(){ - player.gain(game.createCard(trigger.target.getCards('e',function(card){ - return !get.info(card).unique; - }).randomGet()),'draw'); - } - } - } - }, - yingxi:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return !player.getStat('damage')&&player.countCards('he',{color:'black'})>0; }, - content(){ - 'step 0' + }, + shouji: { + group: ["shouji_begin", "shouji_miss"], + subSkill: { + begin: { + trigger: { player: "shaBegin" }, + frequent: true, + usable: 1, + filter(event) { + return event.target.countCards("h") > 0; + }, + content() { + player.gain(game.createCard(trigger.target.getCards("h").randomGet()), "draw"); + }, + }, + miss: { + trigger: { player: "shaMiss" }, + frequent: true, + usable: 1, + filter(event) { + return event.target.hasCard(function (card) { + return !get.info(card).unique; + }, "e"); + }, + content() { + player.gain( + game.createCard( + trigger.target + .getCards("e", function (card) { + return !get.info(card).unique; + }) + .randomGet() + ), + "draw" + ); + }, + }, + }, + }, + yingxi: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return !player.getStat("damage") && player.countCards("he", { color: "black" }) > 0; + }, + content() { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('yingxi'), - filterCard:{color:'black'}, - filterTarget(card,player,target){ - return lib.filter.targetEnabled({name:'sha'},player,target); + prompt: get.prompt("yingxi"), + filterCard: { color: "black" }, + filterTarget(card, player, target) { + return lib.filter.targetEnabled({ name: "sha" }, player, target); }, - position:'he', - ai1(card){ - return 8-get.value(card); + position: "he", + ai1(card) { + return 8 - get.value(card); + }, + ai2(target) { + return get.effect(target, { name: "sha" }, player, player); }, - ai2(target){ - return get.effect(target,{name:'sha'},player,player); - } }); - 'step 1' - if(result.bool){ - player.useCard({name:'sha'},result.cards,result.targets,'yingxi'); + ("step 1"); + if (result.bool) { + player.useCard({ name: "sha" }, result.cards, result.targets, "yingxi"); } }, - group:'yingxi2', + group: "yingxi2", }, - yingxi2:{ - trigger:{player:'shaBegin'}, - forced:true, - popup:false, - filter(event,player){ - return event.skill=='yingxi'&&event.target.isHealthy(); + yingxi2: { + trigger: { player: "shaBegin" }, + forced: true, + popup: false, + filter(event, player) { + return event.skill == "yingxi" && event.target.isHealthy(); + }, + content() { + trigger.directHit = true; }, - content(){ - trigger.directHit=true; - } }, - hsguimou:{ - trigger:{player:'damageEnd'}, - check(event,player){ - return get.attitude(player,event.source)<=0; + hsguimou: { + trigger: { player: "damageEnd" }, + check(event, player) { + return get.attitude(player, event.source) <= 0; }, - filter(event,player){ - return event.source&&event.source.isAlive()&&event.source!=player&&event.source.countCards('h')>0; + filter(event, player) { + return ( + event.source && + event.source.isAlive() && + event.source != player && + event.source.countCards("h") > 0 + ); }, - logTarget:'source', - content(){ - var card=trigger.source.getCards('h').randomGet(); - if(card){ - player.gain(card,trigger.source); - if(get.color(card)=='black'){ - trigger.source.$give(card,player); + logTarget: "source", + content() { + var card = trigger.source.getCards("h").randomGet(); + if (card) { + player.gain(card, trigger.source); + if (get.color(card) == "black") { + trigger.source.$give(card, player); event.redo(); - } - else{ - trigger.source.$giveAuto(card,player); + } else { + trigger.source.$giveAuto(card, player); } game.delay(0.5); } }, - ai:{ - maixie:true, - maixie_hp:true, - maixie_defend:true, - effect:{ - target(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return false; - if(get.tag(card,'damage')&&player.countCards('h')>1) return [1,0,0,-1]; - } - } - } + ai: { + maixie: true, + maixie_hp: true, + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return false; + if (get.tag(card, "damage") && player.countCards("h") > 1) return [1, 0, 0, -1]; + }, + }, + }, }, - peiyu:{ - trigger:{player:['phaseBegin']}, - direct:true, - content(){ - 'step 0' - player.chooseTarget(get.prompt('peiyu'),function(card,player,target){ - for(var i=1;i<=8;i++){ - if(target.hasSkill('tuteng'+i)) return false; + peiyu: { + trigger: { player: ["phaseBegin"] }, + direct: true, + content() { + "step 0"; + player.chooseTarget(get.prompt("peiyu"), function (card, player, target) { + for (var i = 1; i <= 8; i++) { + if (target.hasSkill("tuteng" + i)) return false; } return true; - }).ai=function(target){ - if(player==target&&get.attitude(player,target)>0&&event.parent.triggername=='phaseBegin'){ - return get.attitude(player,target)+10; + }).ai = function (target) { + if ( + player == target && + get.attitude(player, target) > 0 && + event.parent.triggername == "phaseBegin" + ) { + return get.attitude(player, target) + 10; } - return get.attitude(player,target); + return get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("peiyu", result.targets); + var rand = [ + "tuteng1", + "tuteng2", + "tuteng3", + "tuteng4", + "tuteng5", + "tuteng6", + "tuteng7", + "tuteng8", + ]; + result.targets[0].addAdditionalSkill("peiyu", ["peiyu2", rand.randomGet()]); } - 'step 1' - if(result.bool){ - player.logSkill('peiyu',result.targets); - var rand=['tuteng1','tuteng2','tuteng3','tuteng4', - 'tuteng5','tuteng6','tuteng7','tuteng8']; - result.targets[0].addAdditionalSkill('peiyu',['peiyu2',rand.randomGet()]); - } - } - }, - peiyu2:{ - trigger:{player:'damageAfter'}, - silent:true, - content(){ - player.removeAdditionalSkill('peiyu'); - } - }, - peiyu_old:{ - enable:'phaseUse', - filterCard:true, - position:'he', - filterTarget:true, - check(card){ - return 6-get.value(card); }, - content(){ - 'step 0' - var rand=['tuteng1','tuteng2','tuteng3','tuteng4', - 'tuteng5','tuteng6','tuteng7','tuteng8']; - var rand2=[]; - for(var i=0;i1){ - rand.remove('tuteng1'); + target.removeSkill(rand2.randomGet()); + } else { + if (rand2.includes("tuteng1")) { + gain = rand.randomGet(); + target.removeSkill("tuteng1"); + } else { + if (rand.length > 1) { + rand.remove("tuteng1"); } - gain=rand.randomGet(); - target.removeSkill(rand2.randomGet()) + gain = rand.randomGet(); + target.removeSkill(rand2.randomGet()); } } target.addSkill(gain); - target.storage.peiyu[gain]=player; + target.storage.peiyu[gain] = player; game.delay(); event.finish(); } - } - else{ - var gain=rand.randomGet(); + } else { + var gain = rand.randomGet(); target.addSkill(gain); - target.storage.peiyu[gain]=player; + target.storage.peiyu[gain] = player; game.delay(); event.finish(); } - 'step 1' - var skill1=result.buttons[0].name; - var skill2=result.buttons[1].name; - if(target.hasSkill(skill1)){ + ("step 1"); + var skill1 = result.buttons[0].name; + var skill2 = result.buttons[1].name; + if (target.hasSkill(skill1)) { target.removeSkill(skill1); target.addSkill(skill2); - target.storage.peiyu[skill2]=player; - } - else{ + target.storage.peiyu[skill2] = player; + } else { target.removeSkill(skill2); target.addSkill(skill1); - target.storage.peiyu[skill1]=player; + target.storage.peiyu[skill1] = player; } }, - ai:{ - expose:0.2, - order:5, - result:{ - target(player,target){ - for(var i=1;i<=8;i++){ - if(target.hasSkill('tuteng'+i)) return 0; + ai: { + expose: 0.2, + order: 5, + result: { + target(player, target) { + for (var i = 1; i <= 8; i++) { + if (target.hasSkill("tuteng" + i)) return 0; } return 1; - } - } + }, + }, }, - group:'peiyu_old2' + group: "peiyu_old2", }, - peiyu_old2:{ - trigger:{player:'dieBegin'}, - forced:true, - popup:false, - content(){ - game.countPlayer(function(current){ - for(var j in current.storage.peiyu){ - if(current.storage.peiyu[j]==player){ + peiyu_old2: { + trigger: { player: "dieBegin" }, + forced: true, + popup: false, + content() { + game.countPlayer(function (current) { + for (var j in current.storage.peiyu) { + if (current.storage.peiyu[j] == player) { current.removeSkill(j); } } }); - } - }, - wzhanyi:{ - trigger:{player:'phaseUseBefore'}, - check(event,player){ - return player.countCards('h')+2<=player.hp; }, - content(){ - 'step 0' - event.cards=get.cards(3); + }, + wzhanyi: { + trigger: { player: "phaseUseBefore" }, + check(event, player) { + return player.countCards("h") + 2 <= player.hp; + }, + content() { + "step 0"; + event.cards = get.cards(3); trigger.cancel(); player.$draw(event.cards.slice(0)); - for(var i=0;i=3; + yuansu: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.maxHp - player.hp >= 3; }, - filterTarget(card,player,target){ - return player.canUse('yuansuhuimie',target); + filterTarget(card, player, target) { + return player.canUse("yuansuhuimie", target); }, - selectTarget:-1, - multitarget:true, - multiline:true, - line:'thunder', - content(){ - player.maxHp=player.hp; + selectTarget: -1, + multitarget: true, + multiline: true, + line: "thunder", + content() { + player.maxHp = player.hp; player.update(); targets.sort(lib.sort.seat); - player.useCard({name:'yuansuhuimie'},targets).animate=false; - } + player.useCard({ name: "yuansuhuimie" }, targets).animate = false; + }, }, - chouhuo:{ - unique:true, - trigger:{player:'phaseBegin'}, - forced:true, - skillAnimation:true, - animationColor:'fire', - filter(event,player){ - if(player.storage.nuyan&&player.storage.nuyan.length){ - var num=0; - for(var i=0;i0){ - if(players[i].hp<2){ + check(button) { + var player = _status.event.player; + var recover = 0, + lose = 1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].hp < players[i].maxHp) { + if (get.attitude(player, players[i]) > 0) { + if (players[i].hp < 2) { lose--; - recover+=0.5; + recover += 0.5; } lose--; recover++; - } - else if(get.attitude(player,players[i])<0){ - if(players[i].hp<2){ + } else if (get.attitude(player, players[i]) < 0) { + if (players[i].hp < 2) { lose++; - recover-=0.5; + recover -= 0.5; } lose++; recover--; } - } - else{ - if(get.attitude(player,players[i])>0){ + } else { + if (get.attitude(player, players[i]) > 0) { lose--; - } - else if(get.attitude(player,players[i])<0){ + } else if (get.attitude(player, players[i]) < 0) { lose++; } } } - if(button.link[2]=='nanman'||button.link[2]=='nanman'||button.link[2]=='yuansuhuimie'|| - button.link[2]=='chiyuxi'||button.link[2]=='jingleishan'){ - if(lose>recover&&lose>0){ + if ( + button.link[2] == "nanman" || + button.link[2] == "nanman" || + button.link[2] == "yuansuhuimie" || + button.link[2] == "chiyuxi" || + button.link[2] == "jingleishan" + ) { + if (lose > recover && lose > 0) { return 2; - } - else{ + } else { return 0; } } return 1; }, - backup(links,player){ + backup(links, player) { return { - filterCard(){return false}, - selectCard:-1, - popname:true, - viewAs:{name:links[0][2]}, - onuse(result,player){ - player.loseHp(); - } - } - }, - prompt(links,player){ - return '失去1点体力,视为使用一张'+get.translation(links[0][2]); - } - }, - ai:{ - order:6, - result:{ - player(player){ - if(player.hp>1) return 1; - return 0; - } - }, - } - }, - nuyan:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('he',{color:'red'})>0 - }, - init(player){ - player.storage.nuyan=[]; - }, - chooseButton:{ - dialog(event,player){ - var list=[]; - for(var i=0;i0){ - if(players[i].hp<2){ - lose--; - recover+=0.5; - } - lose--; - recover++; - } - else if(get.attitude(player,players[i])<0){ - if(players[i].hp<2){ - lose++; - recover-=0.5; - } - lose++; - recover--; - } - } - else{ - if(get.attitude(player,players[i])>0){ - lose--; - } - else if(get.attitude(player,players[i])<0){ - lose++; - } - } - } - if(button.link[2]=='nanman'||button.link[2]=='nanman'||button.link[2]=='yuansuhuimie'|| - button.link[2]=='chiyuxi'||button.link[2]=='jingleishan'){ - if(lose>recover&&lose>0){ - return 2; - } - else{ - return 0; - } - } - return 1; - }, - backup(links,player){ - return { - filterCard:{color:'red'}, - selectCard:1, - position:'he', - popname:true, - viewAs:{name:links[0][2]}, - ai1(card){ - return 6-get.value(card); + filterCard() { + return false; }, - onuse(result,player){ - player.storage.nuyan.add(result.card.name); + selectCard: -1, + popname: true, + viewAs: { name: links[0][2] }, + onuse(result, player) { + player.loseHp(); + }, + }; + }, + prompt(links, player) { + return "失去1点体力,视为使用一张" + get.translation(links[0][2]); + }, + }, + ai: { + order: 6, + result: { + player(player) { + if (player.hp > 1) return 1; + return 0; + }, + }, + }, + }, + nuyan: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("he", { color: "red" }) > 0; + }, + init(player) { + player.storage.nuyan = []; + }, + chooseButton: { + dialog(event, player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + if (get.tag({ name: lib.inpile[i] }, "damage")) { + list.push([get.type(lib.inpile[i]), "", lib.inpile[i]]); } } + return ui.create.dialog([list, "vcard"]); }, - prompt(links,player){ - return '将一张红色牌当作'+get.translation(links[0][2])+'使用'; - } - }, - ai:{ - order:6, - result:{ - player:1 + filter(button, player) { + if (player.storage.nuyan.includes(button.link[2])) return false; + return lib.filter.filterCard( + { name: button.link[2] }, + player, + _status.event.getParent() + ); }, - } + check(button) { + var player = _status.event.player; + var recover = 0, + lose = 1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].hp < players[i].maxHp) { + if (get.attitude(player, players[i]) > 0) { + if (players[i].hp < 2) { + lose--; + recover += 0.5; + } + lose--; + recover++; + } else if (get.attitude(player, players[i]) < 0) { + if (players[i].hp < 2) { + lose++; + recover -= 0.5; + } + lose++; + recover--; + } + } else { + if (get.attitude(player, players[i]) > 0) { + lose--; + } else if (get.attitude(player, players[i]) < 0) { + lose++; + } + } + } + if ( + button.link[2] == "nanman" || + button.link[2] == "nanman" || + button.link[2] == "yuansuhuimie" || + button.link[2] == "chiyuxi" || + button.link[2] == "jingleishan" + ) { + if (lose > recover && lose > 0) { + return 2; + } else { + return 0; + } + } + return 1; + }, + backup(links, player) { + return { + filterCard: { color: "red" }, + selectCard: 1, + position: "he", + popname: true, + viewAs: { name: links[0][2] }, + ai1(card) { + return 6 - get.value(card); + }, + onuse(result, player) { + player.storage.nuyan.add(result.card.name); + }, + }; + }, + prompt(links, player) { + return "将一张红色牌当作" + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 6, + result: { + player: 1, + }, + }, }, - duxin:{ - trigger:{player:['phaseBegin','phaseEnd']}, - frequent:true, - filter(event,player){ - return !player.countCards('h',{type:'hsdusu'}); + duxin: { + trigger: { player: ["phaseBegin", "phaseEnd"] }, + frequent: true, + filter(event, player) { + return !player.countCards("h", { type: "hsdusu" }); }, - content(){ - var list=['hsdusu_xueji','hsdusu_huangxuecao','hsdusu_kuyecao','hsdusu_shinancao','hsdusu_huoyanhua']; - if(typeof lib.cardType.hslingjian!='number'){ - list.remove('hsdusu_kuyecao'); + content() { + var list = [ + "hsdusu_xueji", + "hsdusu_huangxuecao", + "hsdusu_kuyecao", + "hsdusu_shinancao", + "hsdusu_huoyanhua", + ]; + if (typeof lib.cardType.hslingjian != "number") { + list.remove("hsdusu_kuyecao"); } - var name=list.randomGet(); - if(name=='hsdusu_huoyanhua'){ - player.gain(game.createCard({name:name,nature:'fire'}),'draw'); - } - else{ - player.gain(game.createCard(name),'draw'); + var name = list.randomGet(); + if (name == "hsdusu_huoyanhua") { + player.gain(game.createCard({ name: name, nature: "fire" }), "draw"); + } else { + player.gain(game.createCard(name), "draw"); } }, - ai:{ - threaten:1.6 - } + ai: { + threaten: 1.6, + }, }, - oldduxin:{ - trigger:{player:['phaseBegin','phaseEnd']}, - frequent:true, - content(){ - var list=['hsdusu_xueji','hsdusu_huangxuecao','hsdusu_kuyecao','hsdusu_shinancao','hsdusu_huoyanhua']; - if(typeof lib.cardType.hslingjian!='number'){ - list.remove('hsdusu_kuyecao'); + oldduxin: { + trigger: { player: ["phaseBegin", "phaseEnd"] }, + frequent: true, + content() { + var list = [ + "hsdusu_xueji", + "hsdusu_huangxuecao", + "hsdusu_kuyecao", + "hsdusu_shinancao", + "hsdusu_huoyanhua", + ]; + if (typeof lib.cardType.hslingjian != "number") { + list.remove("hsdusu_kuyecao"); } - var name=list.randomGet(); - if(name=='hsdusu_huoyanhua'){ - player.gain(game.createCard({name:name,nature:'fire'}),'draw'); - } - else{ - player.gain(game.createCard(name),'draw'); + var name = list.randomGet(); + if (name == "hsdusu_huoyanhua") { + player.gain(game.createCard({ name: name, nature: "fire" }), "draw"); + } else { + player.gain(game.createCard(name), "draw"); } }, - ai:{ - threaten:1.6 - } + ai: { + threaten: 1.6, + }, }, - hsdusu_shinancao:{ - mark:true, - marktext:'楠', - nopop:true, - intro:{ - content:'下一次造成的伤害+1' + hsdusu_shinancao: { + mark: true, + marktext: "楠", + nopop: true, + intro: { + content: "下一次造成的伤害+1", }, - logv:false, - trigger:{source:'damageBegin'}, - forced:true, - content(){ + logv: false, + trigger: { source: "damageBegin" }, + forced: true, + content() { trigger.num++; - player.removeSkill('hsdusu_shinancao'); - } + player.removeSkill("hsdusu_shinancao"); + }, }, - kuangluan_old:{ - group:['kuangluan_count1','kuangluan_count2','kuangluan_use'], - subSkill:{ - count1:{ - trigger:{player:'useCard'}, - silent:true, - filter(event,player){ - return _status.currentPhase==player&&get.type(event.card)=='trick'; + kuangluan_old: { + group: ["kuangluan_count1", "kuangluan_count2", "kuangluan_use"], + subSkill: { + count1: { + trigger: { player: "useCard" }, + silent: true, + filter(event, player) { + return _status.currentPhase == player && get.type(event.card) == "trick"; }, - content(){ + content() { player.storage.kuangluan++; - } - }, - count2:{ - trigger:{player:'phaseBegin'}, - silent:true, - content(){ - player.storage.kuangluan=0; - } - }, - use:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - filter(event,player){ - return player.storage.kuangluan>0; }, - content(){ - var list=[]; - for(var i=0;i0&&info.selectTarget[1]>=info.selectTarget[0]){ + }, + count2: { + trigger: { player: "phaseBegin" }, + silent: true, + content() { + player.storage.kuangluan = 0; + }, + }, + use: { + trigger: { player: "phaseUseEnd" }, + forced: true, + filter(event, player) { + return player.storage.kuangluan > 0; + }, + content() { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + if (lib.filter.filterCard({ name: lib.inpile[i] }, player)) { + var info = lib.card[lib.inpile[i]]; + if (info.type == "trick" && !info.multitarget && !info.notarget) { + if (Array.isArray(info.selectTarget)) { + if ( + info.selectTarget[0] > 0 && + info.selectTarget[1] >= info.selectTarget[0] + ) { list.push(lib.inpile[i]); } - } - else if(typeof info.selectTarget=='number'){ + } else if (typeof info.selectTarget == "number") { list.push(lib.inpile[i]); } } } } - var n=player.storage.kuangluan; + var n = player.storage.kuangluan; delete player.storage.kuangluan; - while(list.length){ - var card={name:list.randomRemove()}; - var info=get.info(card); - var targets=game.filterPlayer(function(current){ - return lib.filter.filterTarget(card,player,current); + while (list.length) { + var card = { name: list.randomRemove() }; + var info = get.info(card); + var targets = game.filterPlayer(function (current) { + return lib.filter.filterTarget(card, player, current); }); - if(targets.length){ + if (targets.length) { targets.sort(lib.sort.seat); - if(info.selectTarget==-1){ - player.useCard(card,targets); - } - else{ - var num=info.selectTarget; - if(Array.isArray(num)){ - if(targets.length=2; + kuangluan2: { + trigger: { player: "phaseBegin" }, + priority: 10, + forced: true, + filter(event, player) { + return player.storage.kuangluan && player.storage.kuangluan.length >= 2; }, - content(){ + content() { player.recover(player.maxHp); - player.goMad('phaseAfter'); - } - }, - kuangluan3:{ - trigger:{player:'phaseBegin'}, - silent:true, - content(){ - player.storage.kuangluan=[]; - player.unmarkSkill('kuangluan'); - } - }, - xiubu:{ - trigger:{player:'equipEnd'}, - frequent:true, - filter(event){ - return lib.inpile.includes(event.card.name)&&get.subtype(event.card)=='equip1'&&typeof lib.cardType.hslingjian=='number'; + player.goMad("phaseAfter"); }, - content(){ - var num=1; - var info=get.info(trigger.card); - if(info&&info.distance&&typeof info.distance.attackFrom=='number'){ - num=1-info.distance.attackFrom; + }, + kuangluan3: { + trigger: { player: "phaseBegin" }, + silent: true, + content() { + player.storage.kuangluan = []; + player.unmarkSkill("kuangluan"); + }, + }, + xiubu: { + trigger: { player: "equipEnd" }, + frequent: true, + filter(event) { + return ( + lib.inpile.includes(event.card.name) && + get.subtype(event.card) == "equip1" && + typeof lib.cardType.hslingjian == "number" + ); + }, + content() { + var num = 1; + var info = get.info(trigger.card); + if (info && info.distance && typeof info.distance.attackFrom == "number") { + num = 1 - info.distance.attackFrom; } - if(num<1){ - num=1; + if (num < 1) { + num = 1; } - var list=get.typeCard('hslingjian'); - if(!list.length){ + var list = get.typeCard("hslingjian"); + if (!list.length) { return; } - var cards=[]; - while(num--){ + var cards = []; + while (num--) { cards.push(game.createCard(list.randomGet())); } - player.gain(cards,'gain2'); + player.gain(cards, "gain2"); }, - threaten:1.3 + threaten: 1.3, }, - zengli:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!=player&&!target.isMin(); + zengli: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target != player && !target.isMin(); }, - delay:false, - content(){ - 'step 0' - var list=[]; - for(var i=0;i1){ - return 6-get.value(card); - } - return 0; - }).set('logSkill',['xianji',event.target]); - } - else{ + if (event.target) { + player + .chooseToDiscard( + [1, 2], + "献祭:是否弃置1~2张手牌并令" + get.translation(event.target) + "摸等量的牌?" + ) + .set("ai", function (card) { + if ( + get.attitude(_status.event.player, _status.event.getParent().target) > 1 + ) { + return 6 - get.value(card); + } + return 0; + }) + .set("logSkill", ["xianji", event.target]); + } else { event.finish(); } - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { event.target.draw(result.cards.length); - player.storage.xianji3=event.target; - player.addSkill('xianji3'); + player.storage.xianji3 = event.target; + player.addSkill("xianji3"); player.addExpose(0.2); } - } + }, }, - xianji3:{ - mark:'character', - intro:{ - content:'每当$对你使用一张牌,你摸一张牌' + xianji3: { + mark: "character", + intro: { + content: "每当$对你使用一张牌,你摸一张牌", }, - trigger:{target:'useCardToBegin'}, - filter(event,player){ - return event.player==player.storage.xianji3; + trigger: { target: "useCardToBegin" }, + filter(event, player) { + return event.player == player.storage.xianji3; }, - forced:true, - content(){ + forced: true, + content() { player.draw(); }, }, - tanmi:{ - trigger:{global:'phaseEnd'}, - filter(event,player){ - return player.countCards('h')==0&&event.player!=player; + tanmi: { + trigger: { global: "phaseEnd" }, + filter(event, player) { + return player.countCards("h") == 0 && event.player != player; }, - frequent:true, - content(){ - 'step 0' + frequent: true, + content() { + "step 0"; player.draw(2); - 'step 1' + ("step 1"); player.chooseToUse(); - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.chooseToUse(); } }, - ai:{ - noh:true, - skillTagFilter(player,tag){ - if(tag=='noh'){ - if(player.countCards('h')!=1) return false; + ai: { + noh: true, + skillTagFilter(player, tag) { + if (tag == "noh") { + if (player.countCards("h") != 1) return false; } - } - } + }, + }, }, - xueren:{ - trigger:{source:'damageEnd'}, - filter(event){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&event.card.name=='sha'&&event.player.isAlive(); + xueren: { + trigger: { source: "damageEnd" }, + filter(event) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player.isAlive(); }, - check(event,player){ - if(get.attitude(player,event.player)>=0) return false; - if(player.hp>2) return true; - if(player.hp<2) return false; - return player.hp>=event.player.hp; + check(event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if (player.hp > 2) return true; + if (player.hp < 2) return false; + return player.hp >= event.player.hp; }, - content(){ - 'step 0' + content() { + "step 0"; trigger.player.loseHp(); - 'step 1' + ("step 1"); player.loseHp(); - 'step 2' + ("step 2"); player.draw(2); - } + }, }, - maoxian:{ - enable:'phaseUse', - usable:2, - direct:true, - delay:false, - unique:true, - content(){ - 'step 0' - var list=get.gainableSkills(); - list.remove('maoxian'); - list=list.randomGets(3); - event.skillai=function(){ - return get.max(list,get.skillRank,'item'); + maoxian: { + enable: "phaseUse", + usable: 2, + direct: true, + delay: false, + unique: true, + content() { + "step 0"; + var list = get.gainableSkills(); + list.remove("maoxian"); + list = list.randomGets(3); + event.skillai = function () { + return get.max(list, get.skillRank, "item"); }; - if(event.isMine()){ - var dialog=ui.create.dialog('forcebutton'); - dialog.add('选择获得一项技能'); - var clickItem=function(){ - _status.event._result=this.link; + if (event.isMine()) { + var dialog = ui.create.dialog("forcebutton"); + dialog.add("选择获得一项技能"); + var clickItem = function () { + _status.event._result = this.link; dialog.close(); game.resume(); }; - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); - event.switchToAuto=function(){ - event._result=event.skillai(); + dialog.add(ui.create.div(".placeholder")); + event.switchToAuto = function () { + event._result = event.skillai(); dialog.close(); game.resume(); }; - _status.imchoosing=true; + _status.imchoosing = true; game.pause(); + } else { + event._result = event.skillai(); } - else{ - event._result=event.skillai(); - } - 'step 1' - _status.imchoosing=false; - var link=result; - player.addAdditionalSkill('maoxian',link); + ("step 1"); + _status.imchoosing = false; + var link = result; + player.addAdditionalSkill("maoxian", link); player.popup(link); - game.log(player,'获得了技能','【'+get.translation(link)+'】'); + game.log(player, "获得了技能", "【" + get.translation(link) + "】"); player.checkMarks(); - player.markSkill('maoxian'); + player.markSkill("maoxian"); game.delay(); }, - intro:{ - content(storage,player){ - return '当前技能:'+get.translation(player.additionalSkills.maoxian); - } + intro: { + content(storage, player) { + return "当前技能:" + get.translation(player.additionalSkills.maoxian); + }, }, - ai:{ - order:11, - result:{ - player(player){ - if(player.getStat().skill.maoxian) return 0; + ai: { + order: 11, + result: { + player(player) { + if (player.getStat().skill.maoxian) return 0; return 1; - } - } - } + }, + }, + }, }, - maoxian_old:{ - enable:'phaseUse', - usable:2, - direct:true, - delay:false, - unique:true, - getSkills(player,current){ - var names=[]; - var list=[]; - var map={}; - for(var i=0;i=3; + selectCard: 3, + filter(event, player) { + return player.countCards("he") >= 3; }, - content(){ - 'step 0' - event.cards=get.cards(3); - if(!event.isMine()) player.showCards(event.cards); - 'step 1' - player.chooseCardButton('获得任意张类别不同的牌',[1,3],event.cards).filterButton=function(button){ - var type=get.type(button.link,'trick'); - for(var i=0;iget.value(cards[i]); + selectCard: [1, Infinity], + content() { + var cards2 = []; + for (var i = 0; i < cards.length; i++) { + var type = get.type(cards[i], "trick"); + var list = game.findCards(function (name) { + if (cards[i].name == name) return; + if (get.type({ name: name }, "trick") == type) { + return get.value({ name: name }) > get.value(cards[i]); } }); - if(!list.length){ - list=game.findCards(function(name){ - if(cards[i].name==name) return; - if(get.type({name:name},'trick')==type){ - return get.value({name:name})==get.value(cards[i]); + if (!list.length) { + list = game.findCards(function (name) { + if (cards[i].name == name) return; + if (get.type({ name: name }, "trick") == type) { + return get.value({ name: name }) == get.value(cards[i]); } }); } - if(!list.length){ - list=[cards[i].name]; + if (!list.length) { + list = [cards[i].name]; } cards2.push(game.createCard(list.randomGet())); } - player.gain(cards2,'log'); + player.gain(cards2, "log"); player.$draw(cards2); }, - ai:{ - order:8, - result:{ - player:1 - } - } - }, - zhuizong:{ - enable:'phaseUse', - usable:1, - filterCard:true, - position:'he', - selectCard:[1,Infinity], - check(card){ - if(ui.selected.cards.length) return 0; - return 6-get.value(card) + ai: { + order: 8, + result: { + player: 1, + }, }, - content(){ - 'step 0' - event.cards=get.cards(4*cards.length); - player.chooseCardButton('获得其中的一张牌',true,event.cards,true); - 'step 1' - player.gain(result.links,'draw'); + }, + zhuizong: { + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + selectCard: [1, Infinity], + check(card) { + if (ui.selected.cards.length) return 0; + return 6 - get.value(card); + }, + content() { + "step 0"; + event.cards = get.cards(4 * cards.length); + player.chooseCardButton("获得其中的一张牌", true, event.cards, true); + ("step 1"); + player.gain(result.links, "draw"); event.cards.remove(result.links[0]); - for(var i=0;i0; + yufa3: { + trigger: { global: "phaseBegin" }, + silent: true, + content() { + player.storage.yufa = null; }, - filterTarget(card,player,target){ - if(get.color(card)=='red'){ - return player.canUse('chiyuxi',target); - } - else{ - return player.canUse('jingleishan',target); + }, + bingyan: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (!lib.card.chiyuxi || !lib.card.jingleishan) return false; + return player.countCards("he") > 0; + }, + filterTarget(card, player, target) { + if (get.color(card) == "red") { + return player.canUse("chiyuxi", target); + } else { + return player.canUse("jingleishan", target); } }, - selectTarget:-1, - discard:false, - delay:false, - line:false, - filterCard:true, - position:'he', - log:'notarget', - check(card){ - return 6-get.value(card); + selectTarget: -1, + discard: false, + delay: false, + line: false, + filterCard: true, + position: "he", + log: "notarget", + check(card) { + return 6 - get.value(card); }, - multitarget:true, - content(){ - if(get.color(cards[0])=='black'){ - player.useCard({name:'jingleishan'},cards,targets); - } - else{ - player.useCard({name:'chiyuxi'},cards,targets); + multitarget: true, + content() { + if (get.color(cards[0]) == "black") { + player.useCard({ name: "jingleishan" }, cards, targets); + } else { + player.useCard({ name: "chiyuxi" }, cards, targets); } }, - ai:{ - order:9.1, - result:{ - target(player,target){ - var card=ui.selected.cards[0]; - if(card&&get.color(card)=='black'){ - return get.effect(target,{name:'jingleishan'},player,target); + ai: { + order: 9.1, + result: { + target(player, target) { + var card = ui.selected.cards[0]; + if (card && get.color(card) == "black") { + return get.effect(target, { name: "jingleishan" }, player, target); } - return get.effect(target,{name:'chiyuxi'},player,target); - } - } - } + return get.effect(target, { name: "chiyuxi" }, player, target); + }, + }, + }, }, - shifa:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - content(){ - 'step 0' - var list=[]; - var target=player.getEnemies().randomGet(); - for(var i=0;i1&&event.target.countCards('he')>0; + yuanzheng: { + trigger: { player: "useCardToBegin" }, + direct: true, + filter(event, player) { + return ( + event.target && + event.target != player && + get.distance(player, event.target) > 1 && + event.target.countCards("he") > 0 + ); + }, + content() { + player.discardPlayerCard( + trigger.target, + get.prompt("yuanzheng", trigger.target), + "hej" + ).logSkill = ["yuanzheng", trigger.target]; }, - content(){ - player.discardPlayerCard(trigger.target,get.prompt('yuanzheng',trigger.target),'hej').logSkill=['yuanzheng',trigger.target]; - } }, - yuanzheng_old:{ - trigger:{player:'useCardToBegin'}, - direct:true, - filter(event,player){ - if(event.getParent(2).name=='yuanzheng') return false; - return event.target&&event.target!=player&&get.distance(player,event.target,'attack')>1; + yuanzheng_old: { + trigger: { player: "useCardToBegin" }, + direct: true, + filter(event, player) { + if (event.getParent(2).name == "yuanzheng") return false; + return ( + event.target && + event.target != player && + get.distance(player, event.target, "attack") > 1 + ); }, - content(){ - 'step 0' - player.chooseControl('draw_card','出杀','cancel2',function(){ - if(get.effect(trigger.target,{name:'sha'},player,player)>0){ - return '出杀'; + content() { + "step 0"; + player.chooseControl("draw_card", "出杀", "cancel2", function () { + if (get.effect(trigger.target, { name: "sha" }, player, player) > 0) { + return "出杀"; } - return 'draw_card'; - }).prompt='是对'+get.translation(trigger.target)+'发动否发动【远征】?'; - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='draw_card'){ + return "draw_card"; + }).prompt = "是对" + get.translation(trigger.target) + "发动否发动【远征】?"; + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "draw_card") { player.draw(); - player.logSkill('yuanzheng'); - } - else{ - player.logSkill('yuanzheng',trigger.target); - player.useCard({name:'sha'},trigger.target,false).animate=false; + player.logSkill("yuanzheng"); + } else { + player.logSkill("yuanzheng", trigger.target); + player.useCard({ name: "sha" }, trigger.target, false).animate = false; // player.discardPlayerCard(trigger.target,'he',true); } } - } - }, - byuhuo:{ - unique:true, - trigger:{player:'dying'}, - priority:6, - forced:true, - mark:true, - skillAnimation:true, - animationColor:'fire', - init(player){ - player.storage.byuhuo=false; }, - filter(event,player){ - if(player.hp>0) return false; - if(player.storage.byuhuo) return false; + }, + byuhuo: { + unique: true, + trigger: { player: "dying" }, + priority: 6, + forced: true, + mark: true, + skillAnimation: true, + animationColor: "fire", + init(player) { + player.storage.byuhuo = false; + }, + filter(event, player) { + if (player.hp > 0) return false; + if (player.storage.byuhuo) return false; return true; }, - content(){ - player.storage.byuhuo=true; - player.addSkill('byuhuo2'); - player.maxHp=2; - player.hp=2; + content() { + player.storage.byuhuo = true; + player.addSkill("byuhuo2"); + player.maxHp = 2; + player.hp = 2; player.update(); - if(!player.isTurnedOver()){ + if (!player.isTurnedOver()) { player.turnOver(); } }, - ai:{ - threaten(player,target){ - if(!target.storage.byuhuo) return 0.6; - } + ai: { + threaten(player, target) { + if (!target.storage.byuhuo) return 0.6; + }, }, - intro:{ - content(storage,player){ - if(storage){ - if(player.hasSkill('byuhuo2')){ - return '不能成为其他角色卡牌的目标;在下一准备阶段,对所有其他角色造成2点火焰伤害'; + intro: { + content(storage, player) { + if (storage) { + if (player.hasSkill("byuhuo2")) { + return "不能成为其他角色卡牌的目标;在下一准备阶段,对所有其他角色造成2点火焰伤害"; } - return '已发动'; + return "已发动"; + } else { + return "未发动"; } - else{ - return '未发动'; - } - } - } + }, + }, }, - byuhuo2:{ - trigger:{player:'phaseBegin'}, - forced:true, - content(){ - 'step 0' - var targets=game.filterPlayer(); + byuhuo2: { + trigger: { player: "phaseBegin" }, + forced: true, + content() { + "step 0"; + var targets = game.filterPlayer(); targets.remove(player); targets.sort(lib.sort.seat); - event.targets=targets; - event.num=0; - player.unmarkSkill('byuhuo'); - 'step 1' - if(num0; + duzhang2: { + mod: { + cardEnabled(card) { + if (get.type(card, "trick") == "trick") return false; + }, }, - content(){ - 'step 0' - var nh=player.countCards('h'); - if(nh){ + mark: true, + marktext: "瘴", + intro: { + content: "下个回合无法使用锦囊牌", + }, + }, + hannu: { + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { + return player.countCards("h") > 0; + }, + content() { + "step 0"; + var nh = player.countCards("h"); + if (nh) { player.draw(nh); - } - else{ + } else { event.finish(); } - 'step 1' - var hs=player.getCards('h'); - if(hs.length>10&&hs.length>player.hp){ - player.discard(hs.randomGets(hs.length-player.hp)); + ("step 1"); + var hs = player.getCards("h"); + if (hs.length > 10 && hs.length > player.hp) { + player.discard(hs.randomGets(hs.length - player.hp)); } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var nh=target.countCards('h'); - if(nh>5) return [1,-1]; - if(nh<=1) return [1,-0.1]; - if(nh==2){ - if(target.hp>=2) return [1,0.1]; - } - else{ - if(target.hp>=4) return [1,2]; - if(target.hp==3) return [1,1.5]; - if(target.hp==2) return [1,0.5]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var nh = target.countCards("h"); + if (nh > 5) return [1, -1]; + if (nh <= 1) return [1, -0.1]; + if (nh == 2) { + if (target.hp >= 2) return [1, 0.1]; + } else { + if (target.hp >= 4) return [1, 2]; + if (target.hp == 3) return [1, 1.5]; + if (target.hp == 2) return [1, 0.5]; } } - } - } - } - }, - chuidiao:{ - trigger:{player:'phaseEnd'}, - forced:true, - content(){ - var num=Math.floor(Math.random()*3); - if(num) player.draw(num); + }, + }, }, }, - hhudun:{ - trigger:{global:'phaseBegin'}, - forced:true, - filter(event,player){ + chuidiao: { + trigger: { player: "phaseEnd" }, + forced: true, + content() { + var num = Math.floor(Math.random() * 3); + if (num) player.draw(num); + }, + }, + hhudun: { + trigger: { global: "phaseBegin" }, + forced: true, + filter(event, player) { return !player.hujia; }, - content(){ + content() { player.changeHujia(); }, - group:'hhudun_hujia', - subSkill:{ - hujia:{ - trigger:{player:'damageEnd'}, - filter(event){ - return event.hujia==event.num; + group: "hhudun_hujia", + subSkill: { + hujia: { + trigger: { player: "damageEnd" }, + filter(event) { + return event.hujia == event.num; }, - forced:true, - content(){ + forced: true, + content() { player.draw(); - } - } + }, + }, }, - ai:{ - threaten(player,target){ - if(target.hujia){ + ai: { + threaten(player, target) { + if (target.hujia) { return 0.5; - } - else{ + } else { return 2; } - } - } + }, + }, }, - fenlie:{ - audio:2, - forced:true, - trigger:{player:'gainAfter'}, - filter(event,player){ - if(event.parent.parent.name=='phaseDraw') return false; - if(event.parent.name=='fenlie') return false; - if(!event.cards) return false; - for(var i=0;i0; - } - else{ - return event.source&&event.source!=player&&event.source.countCards('e')>0; + nianfu: { + trigger: { source: "damageEnd", player: "damageEnd" }, + forced: true, + filter(event, player) { + if (event._notrigger.includes(event.player)) return false; + if (player == event.source) { + return event.player != player && event.player.countCards("e") > 0; + } else { + return event.source && event.source != player && event.source.countCards("e") > 0; } }, - logTarget(event,player){ - if(player==event.player){ + logTarget(event, player) { + if (player == event.player) { return event.source; - } - else{ + } else { return event.player; } }, - content(){ - var target=(player==trigger.player)?trigger.source:trigger.player; - if(target){ - var cards=target.getCards('e'); - if(cards.length){ - var card=cards.randomGet(); - player.gain(card,target); - target.$give(card,player); + content() { + var target = player == trigger.player ? trigger.source : trigger.player; + if (target) { + var cards = target.getCards("e"); + if (cards.length) { + var card = cards.randomGet(); + player.gain(card, target); + target.$give(card, player); } } }, }, - xiaorong:{ - mod:{ - ignoredHandcard(card,player){ - if(get.type(card)=='equip'){ + xiaorong: { + mod: { + ignoredHandcard(card, player) { + if (get.type(card) == "equip") { return true; } }, }, - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.countCards('h',{type:'equip'})>0; + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.countCards("h", { type: "equip" }) > 0; }, - content(){ - var cards=player.getCards('h',{type:'equip'}); - if(cards.length){ - player.lose(cards)._triggered=null; - var list=[]; - var names=[]; - for(var i=0;i3000&&event.player.countCards('he')>0&&event.player.isAlive(); - }, - content(){ - player.line(trigger.player,'green'); - trigger.player.chooseToDiscard('he',true,Math.floor(trigger.player.storage.shixu/3000)); - delete trigger.player.storage.shixu; - } - } - } - }, - jixuan:{ - trigger:{player:'phaseAfter'}, - forced:true, - priority:-50, - filter(event,player){ - return event.skill!='jixuan'; }, - content(){ + }, + shixu: { + group: ["shixu_begin", "shixu_end", "shixu_discard"], + subSkill: { + begin: { + trigger: { global: "phaseUseBegin" }, + silent: true, + content() { + trigger.player.storage.shixu_begin = get.time(); + }, + }, + end: { + trigger: { global: "phaseUseEnd" }, + silent: true, + filter(event, player) { + return typeof event.player.storage.shixu_begin == "number"; + }, + content() { + trigger.player.storage.shixu = get.time() - trigger.player.storage.shixu_begin; + delete trigger.player.storage.shixu_begin; + }, + }, + discard: { + trigger: { global: "phaseEnd" }, + forced: true, + check(event, player) { + return get.attitude(player, event.player) < 0; + }, + filter(event, player) { + return ( + typeof event.player.storage.shixu == "number" && + event.player.storage.shixu > 3000 && + event.player.countCards("he") > 0 && + event.player.isAlive() + ); + }, + content() { + player.line(trigger.player, "green"); + trigger.player.chooseToDiscard( + "he", + true, + Math.floor(trigger.player.storage.shixu / 3000) + ); + delete trigger.player.storage.shixu; + }, + }, + }, + }, + jixuan: { + trigger: { player: "phaseAfter" }, + forced: true, + priority: -50, + filter(event, player) { + return event.skill != "jixuan"; + }, + content() { player.draw(); player.insertPhase(); }, - ai:{ - threaten:1.8 + ai: { + threaten: 1.8, }, }, - qianghua:{ - trigger:{player:'useCardAfter'}, - filter(event,player){ - if(event.parent.name=='qianghua') return false; - if(player.storage.qianghua>=1) return false; - if(_status.currentPhase!=player) return false; - if(event.parent.parent.name!='phaseUse') return false; - if(!event.targets||!event.card) return false; - if(get.info(event.card).complexTarget) return false; - if(!lib.filter.cardEnabled(event.card,player,event.parent)) return false; - var type=get.type(event.card); - if(type!='basic'&&type!='trick') return false; - var card=game.createCard(event.card.name,event.card.suit,event.card.number,event.card.nature); - var targets=event._targets||event.targets; - for(var i=0;i= 1) return false; + if (_status.currentPhase != player) return false; + if (event.parent.parent.name != "phaseUse") return false; + if (!event.targets || !event.card) return false; + if (get.info(event.card).complexTarget) return false; + if (!lib.filter.cardEnabled(event.card, player, event.parent)) return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + var card = game.createCard( + event.card.name, + event.card.suit, + event.card.number, + event.card.nature + ); + var targets = event._targets || event.targets; + for (var i = 0; i < targets.length; i++) { + if (!targets[i].isIn()) return false; + if (!player.canUse({ name: event.card.name }, targets[i], false, false)) { return false; } } return true; }, - check(event,player){ - if(get.tag({name:event.card.name},'norepeat')) return false; + check(event, player) { + if (get.tag({ name: event.card.name }, "norepeat")) return false; return true; }, - content(){ + content() { player.storage.qianghua++; - var card=game.createCard(trigger.card.name,trigger.card.suit,trigger.card.number,trigger.card.nature); - player.useCard(card,(trigger._targets||trigger.targets).slice(0)); + var card = game.createCard( + trigger.card.name, + trigger.card.suit, + trigger.card.number, + trigger.card.nature + ); + player.useCard(card, (trigger._targets || trigger.targets).slice(0)); }, - ai:{ - threaten:1.3 + ai: { + threaten: 1.3, + }, + group: "qianghua_clear", + subSkill: { + clear: { + trigger: { player: "phaseBefore" }, + silent: true, + content() { + player.storage.qianghua = 0; + }, + }, }, - group:'qianghua_clear', - subSkill:{ - clear:{ - trigger:{player:'phaseBefore'}, - silent:true, - content(){ - player.storage.qianghua=0; - } - } - } }, - qianghua2:{}, - biri:{ - trigger:{global:'useCard'}, - priority:15, - filter(event,player){ - return event.card.name=='sha'&&event.player!=player&& - get.distance(player,event.targets[0])<=1&& - player.countCards('h','shan')>0&& - event.targets.includes(player)==false&&event.targets.length==1; + qianghua2: {}, + biri: { + trigger: { global: "useCard" }, + priority: 15, + filter(event, player) { + return ( + event.card.name == "sha" && + event.player != player && + get.distance(player, event.targets[0]) <= 1 && + player.countCards("h", "shan") > 0 && + event.targets.includes(player) == false && + event.targets.length == 1 + ); }, - direct:true, - content(){ - "step 0" - var effect=0; - for(var i=0;i0; + filter(event) { + return event.num > 0; }, - content(){ + content() { trigger.num--; - player.removeSkill('stuxi2'); - } + player.removeSkill("stuxi2"); + }, }, - bingdong:{ - trigger:{source:'damageEnd'}, - forced:true, - usable:1, - filter(event,player){ - if(!lib.card.hslingjian_jinjilengdong){ + bingdong: { + trigger: { source: "damageEnd" }, + forced: true, + usable: 1, + filter(event, player) { + if (!lib.card.hslingjian_jinjilengdong) { return false; } return true; }, - content(){ - player.gain(game.createCard('hslingjian_jinjilengdong'),'gain2'); - } + content() { + player.gain(game.createCard("hslingjian_jinjilengdong"), "gain2"); + }, }, - bingdong_old:{ - enable:'phaseUse', - usable:1, - filter(event,player){ + bingdong_old: { + enable: "phaseUse", + usable: 1, + filter(event, player) { return !player.isTurnedOver(); }, - filterTarget(card,player,target){ - return !target.isTurnedOver()&&player!=target; + filterTarget(card, player, target) { + return !target.isTurnedOver() && player != target; }, - content(){ - 'step 0' - if(!player.isTurnedOver()){ + content() { + "step 0"; + if (!player.isTurnedOver()) { player.turnOver(); } - 'step 1' - if(!target.isTurnedOver()){ + ("step 1"); + if (!target.isTurnedOver()) { target.turnOver(); } }, - ai:{ - order:1, - expose:0.2, - result:{ - target(player,target){ - if(get.attitude(player,target)<-3&&player.identity!='zhu'){ + ai: { + order: 1, + expose: 0.2, + result: { + target(player, target) { + if (get.attitude(player, target) < -3 && player.identity != "zhu") { return -1; } return 0; - } - } - } - }, - luoshi:{ - trigger:{player:'damageEnd'}, - forced:true, - filter(event,player){ - return player.countCards('he')>0||(event.source&&event.source.countCards('he')>0); + }, + }, }, - content(){ - 'step 0' - var hs=player.getCards('he'); - if(hs.length){ - player.discard(hs.randomGet()) + }, + luoshi: { + trigger: { player: "damageEnd" }, + forced: true, + filter(event, player) { + return player.countCards("he") > 0 || (event.source && event.source.countCards("he") > 0); + }, + content() { + "step 0"; + var hs = player.getCards("he"); + if (hs.length) { + player.discard(hs.randomGet()); } - 'step 1' - if(trigger.source){ - var hs=trigger.source.getCards('he'); - if(hs.length){ - trigger.source.discard(hs.randomGet()) + ("step 1"); + if (trigger.source) { + var hs = trigger.source.getCards("he"); + if (hs.length) { + trigger.source.discard(hs.randomGet()); } } }, - ai:{ - maixie_defend:true, - } - }, - ronghuo:{ - trigger:{player:'useCardToBefore'}, - priority:7, - filter(event,player){ - if(event.card.name=='sha'&&!event.card.nature) return true; + ai: { + maixie_defend: true, }, - check(event,player){ - var att=get.attitude(player,event.target); - if(event.target.hasSkillTag('nofire')){ - return att>0; + }, + ronghuo: { + trigger: { player: "useCardToBefore" }, + priority: 7, + filter(event, player) { + if (event.card.name == "sha" && !event.card.nature) return true; + }, + check(event, player) { + var att = get.attitude(player, event.target); + if (event.target.hasSkillTag("nofire")) { + return att > 0; } - return att<=0; + return att <= 0; + }, + forced: true, + content() { + trigger.card.nature = "fire"; + player.addSkill("ronghuo2"); + player.storage.ronghuo = trigger.card; }, - forced:true, - content(){ - trigger.card.nature='fire'; - player.addSkill('ronghuo2'); - player.storage.ronghuo=trigger.card; - } }, - ronghuo2:{ - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - content(){ + ronghuo2: { + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + content() { delete player.storage.ronghuo.nature; - } - }, - fushi:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target.hp1){ - if(target.hp<=1) att+=2; - if(target.hp<=2) att++; + }, + moyao: { + mod: { + targetEnabled(card, player, target, now) { + if (player != target) { + if (get.type(card, "trick") == "trick") return false; + } + }, + }, + }, + jiaohui: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return !player.getStat("damage"); + }, + content() { + "step 0"; + player.chooseTarget(get.prompt("jiaohui")).ai = function (target) { + var att = get.attitude(player, target); + if (att > 1) { + if (target.hp <= 1) att += 2; + if (target.hp <= 2) att++; } return att; }; - 'step 1' - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('jiaohui',event.target); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("jiaohui", event.target); event.target.chooseDrawRecover(true); } }, }, - bimeng:{ - trigger:{player:'phaseEnd'}, - frequent:true, - content(){ - var list=['hsmengjing_feicuiyoulong','hsmengjing_huanxiaojiemei', - 'hsmengjing_suxing','hsmengjing_mengye','hsmengjing_mengjing']; + bimeng: { + trigger: { player: "phaseEnd" }, + frequent: true, + content() { + var list = [ + "hsmengjing_feicuiyoulong", + "hsmengjing_huanxiaojiemei", + "hsmengjing_suxing", + "hsmengjing_mengye", + "hsmengjing_mengjing", + ]; player.gain(game.createCard(list.randomGet())); player.$draw(); }, - ai:{ - threaten:2 - } - }, - zhoujiang:{ - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - return get.type(event.card)=='trick'; + ai: { + threaten: 2, }, - content(){ - var list=['hszuzhou_nvwudeganguo','hszuzhou_nvwudepingguo', - 'hszuzhou_nvwudexuetu','hszuzhou_wushushike','hszuzhou_guhuo']; - player.gain(game.createCard(list.randomGet()),'draw'); - }, - ai:{ - threaten:1.5 - } }, - liehun:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter(event,player){ - return player.hasCard(function(card){ - return get.type(card)!='basic'&&!get.info(card).unique; + zhoujiang: { + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return get.type(event.card) == "trick"; + }, + content() { + var list = [ + "hszuzhou_nvwudeganguo", + "hszuzhou_nvwudepingguo", + "hszuzhou_nvwudexuetu", + "hszuzhou_wushushike", + "hszuzhou_guhuo", + ]; + player.gain(game.createCard(list.randomGet()), "draw"); + }, + ai: { + threaten: 1.5, + }, + }, + liehun: { + trigger: { player: "phaseEnd" }, + forced: true, + filter(event, player) { + return player.hasCard(function (card) { + return get.type(card) != "basic" && !get.info(card).unique; }); }, - content(){ - var hs=player.getCards('h'); - for(var i=0;i0){ - if(target==player){ + content() { + "step 0"; + player.chooseTarget(get.prompt("lingzhou")).ai = function (target) { + var num = get.attitude(player, target); + if (num > 0) { + if (target == player) { num++; } - if(target.hp==1){ - num+=3; - } - else if(target.hp==2){ - num+=1; + if (target.hp == 1) { + num += 3; + } else if (target.hp == 2) { + num += 1; } } return num; - } - "step 1" - if(result.bool){ - player.logSkill('lingzhou',result.targets); + }; + ("step 1"); + if (result.bool) { + player.logSkill("lingzhou", result.targets); result.targets[0].chooseDrawRecover(true); } }, - ai:{ - expose:0.2, - threaten:1.5, - noautowuxie:true, - } + ai: { + expose: 0.2, + threaten: 1.5, + noautowuxie: true, + }, }, - mieshi:{ - trigger:{player:'phaseEnd'}, - forced:true, - content(){ - 'step 0' + mieshi: { + trigger: { player: "phaseEnd" }, + forced: true, + content() { + "step 0"; player.loseHp(); - 'step 1' - event.target=game.filterPlayer().randomGet(player); - if(!event.target){ + ("step 1"); + event.target = game.filterPlayer().randomGet(player); + if (!event.target) { event.finish(); return; } - player.line(event.target,'fire'); + player.line(event.target, "fire"); game.delayx(); - 'step 2' - event.target.damage('fire'); - } + ("step 2"); + event.target.damage("fire"); + }, }, - xmojian:{ - trigger:{player:'turnOverAfter'}, - direct:true, - filter(event,player){ + xmojian: { + trigger: { player: "turnOverAfter" }, + direct: true, + filter(event, player) { return !player.isTurnedOver(); }, - content(){ - "step 0" - player.chooseTarget(get.prompt('xmojian'),function(card,player,target){ - return lib.filter.targetEnabled({name:'sha'},player,target); - }).ai=function(target){ - return get.effect(target,{name:'sha'},player); - } - "step 1" - if(result.bool){ - player.logSkill('xmojian'); - player.useCard({name:'sha'},result.targets,false); + content() { + "step 0"; + player.chooseTarget(get.prompt("xmojian"), function (card, player, target) { + return lib.filter.targetEnabled({ name: "sha" }, player, target); + }).ai = function (target) { + return get.effect(target, { name: "sha" }, player); + }; + ("step 1"); + if (result.bool) { + player.logSkill("xmojian"); + player.useCard({ name: "sha" }, result.targets, false); } }, - ai:{ - expose:0.2, - } + ai: { + expose: 0.2, + }, }, - xshixin:{ - trigger:{source:'damageEnd'}, - forced:true, + xshixin: { + trigger: { source: "damageEnd" }, + forced: true, // alter:true, - filter(event,player){ - if(event._notrigger.includes(event.player)) return false; - if(get.is.altered('xshixin')&&event.player.hp0){ - if(num>3){ - num=3; + content() { + var num = player.countCards("h") - target.countCards("h"); + if (num > 0) { + if (num > 3) { + num = 3; } target.draw(num); - } - else if(num<0){ - if(num<-3){ - num=-3; + } else if (num < 0) { + if (num < -3) { + num = -3; } - target.chooseToDiscard(-num,true); + target.chooseToDiscard(-num, true); } }, - ai:{ - threaten:1.8, - order(name,player){ - var max=true,num=0; - var players=game.filterPlayer(); - for(var i=0;inum){ - if(att>0){ - max=true; + ai: { + threaten: 1.8, + order(name, player) { + var max = true, + num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] == player) continue; + var att = get.attitude(player, players[i]); + var dh = player.countCards("h") - players[i].countCards("h"); + if (att * dh > num) { + if (att > 0) { + max = true; + } else if (att < 0) { + max = false; } - else if(att<0){ - max=false; - } - num=att*dh; + num = att * dh; } } - if(max) return 10; + if (max) return 10; return 0.5; }, - result:{ - player(player,target){ - return (player.countCards('h')-target.countCards('h'))*get.attitude(player,target); - } + result: { + player(player, target) { + return ( + (player.countCards("h") - target.countCards("h")) * + get.attitude(player, target) + ); + }, }, - expose:0.2 - } + expose: 0.2, + }, }, - oldenze:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return player.countCards('h')!=target.countCards('h'); + oldenze: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return player.countCards("h") != target.countCards("h"); }, // alter:true, - content(){ - var num=player.countCards('h')-target.countCards('h'); - if(num>0){ + content() { + var num = player.countCards("h") - target.countCards("h"); + if (num > 0) { target.draw(num); - } - else if(num<0){ - target.chooseToDiscard(-num,true); + } else if (num < 0) { + target.chooseToDiscard(-num, true); } }, - ai:{ - threaten:1.8, - order(name,player){ - var max=true,num=0; - var players=game.filterPlayer(); - for(var i=0;inum){ - if(att>0){ - max=true; + ai: { + threaten: 1.8, + order(name, player) { + var max = true, + num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] == player) continue; + var att = get.attitude(player, players[i]); + var dh = player.countCards("h") - players[i].countCards("h"); + if (att * dh > num) { + if (att > 0) { + max = true; + } else if (att < 0) { + max = false; } - else if(att<0){ - max=false; - } - num=att*dh; + num = att * dh; } } - if(max) return 10; + if (max) return 10; return 0.5; }, - result:{ - player(player,target){ - return (player.countCards('h')-target.countCards('h'))*get.attitude(player,target); - } + result: { + player(player, target) { + return ( + (player.countCards("h") - target.countCards("h")) * + get.attitude(player, target) + ); + }, }, - expose:0.2 - } - }, - chongsheng:{ - unique:true, - enable:'chooseToUse', - mark:true, - init(player){ - player.storage.chongsheng=2; - player.syncStorage('chongsheng'); + expose: 0.2, }, - filter(event,player){ - if(event.type!='dying') return false; - if(player!=event.dying) return false; - if(player.storage.chongsheng<=0) return false; + }, + chongsheng: { + unique: true, + enable: "chooseToUse", + mark: true, + init(player) { + player.storage.chongsheng = 2; + player.syncStorage("chongsheng"); + }, + filter(event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; + if (player.storage.chongsheng <= 0) return false; return true; }, - content(){ - 'step 0' - player.hp=Math.min(player.storage.chongsheng,player.maxHp); - player.discard(player.getCards('hej')); + content() { + "step 0"; + player.hp = Math.min(player.storage.chongsheng, player.maxHp); + player.discard(player.getCards("hej")); player.draw(player.storage.chongsheng); player.storage.chongsheng--; - if(player.storage.chongsheng<=0){ - player.unmarkSkill('chongsheng'); + if (player.storage.chongsheng <= 0) { + player.unmarkSkill("chongsheng"); } - 'step 1' - if(player.isLinked()) player.link(); - 'step 2' - if(player.isTurnedOver()) player.turnOver(); - player.syncStorage('chongsheng'); + ("step 1"); + if (player.isLinked()) player.link(); + ("step 2"); + if (player.isTurnedOver()) player.turnOver(); + player.syncStorage("chongsheng"); }, - ai:{ - skillTagFilter(player){ - if(player.storage.chongsheng<=0) return false; - if(player.hp>0) return false; + ai: { + skillTagFilter(player) { + if (player.storage.chongsheng <= 0) return false; + if (player.hp > 0) return false; }, - save:true, - result:{ - player:10 + save: true, + result: { + player: 10, + }, + threaten(player, target) { + if (target.storage.chongsheng > 0) return 0.6; }, - threaten(player,target){ - if(target.storage.chongsheng>0) return 0.6; - } }, - intro:{ - content:'time' - } + intro: { + content: "time", + }, }, - guozai:{ - enable:'phaseUse', - usable:1, + guozai: { + enable: "phaseUse", + usable: 1, // alter:true, - filter(event,player){ - return player.countCards('h')<(get.is.altered('guozai')?3:4); + filter(event, player) { + return player.countCards("h") < (get.is.altered("guozai") ? 3 : 4); }, - init(player){ - player.storage.guozai2=0; + init(player) { + player.storage.guozai2 = 0; }, - content(){ - var num=(get.is.altered('guozai')?3:4)-player.countCards('h'); + content() { + var num = (get.is.altered("guozai") ? 3 : 4) - player.countCards("h"); player.draw(num); - player.addSkill('guozai2'); - player.storage.guozai2+=num; - game.addVideo('storage',player,['guozai2',player.storage.guozai2]); + player.addSkill("guozai2"); + player.storage.guozai2 += num; + game.addVideo("storage", player, ["guozai2", player.storage.guozai2]); + }, + ai: { + order: 1, + result: { + player: 1, + }, }, - ai:{ - order:1, - result:{ - player:1 - } - } }, - guozai2:{ - mark:true, - intro:{ - content:'结束阶段需弃置&张牌' + guozai2: { + mark: true, + intro: { + content: "结束阶段需弃置&张牌", + }, + trigger: { player: "phaseUseEnd" }, + forced: true, + content() { + player.chooseToDiscard("he", true, player.storage.guozai2); + player.storage.guozai2 = 0; + player.removeSkill("guozai2"); }, - trigger:{player:'phaseUseEnd'}, - forced:true, - content(){ - player.chooseToDiscard('he',true,player.storage.guozai2); - player.storage.guozai2=0; - player.removeSkill('guozai2'); - } }, - guozaix:{ - enable:'phaseUse', - usable:2, - filter(event,player){ - return player.countCards('h')<4; + guozaix: { + enable: "phaseUse", + usable: 2, + filter(event, player) { + return player.countCards("h") < 4; }, - init(player){ - player.storage.guozaix2=0; + init(player) { + player.storage.guozaix2 = 0; }, - content(){ - var num=4-player.countCards('h'); + content() { + var num = 4 - player.countCards("h"); player.draw(num); - player.addSkill('guozaix2'); - player.storage.guozaix2+=num; - game.addVideo('storage',player,['guozaix2',player.storage.guozaix2]); + player.addSkill("guozaix2"); + player.storage.guozaix2 += num; + game.addVideo("storage", player, ["guozaix2", player.storage.guozaix2]); }, - ai:{ - order:1, - result:{ - player:1 - } - } - }, - guozaix2:{ - mark:true, - intro:{ - content:'结束阶段需弃置&张牌' + ai: { + order: 1, + result: { + player: 1, + }, }, - trigger:{player:'phaseUseEnd'}, - forced:true, - content(){ - player.chooseToDiscard('he',true,player.storage.guozaix2); - player.storage.guozaix2=0; - player.removeSkill('guozaix2'); - } }, - hanshuang:{ - trigger:{source:'damageEnd'}, - forced:true, + guozaix2: { + mark: true, + intro: { + content: "结束阶段需弃置&张牌", + }, + trigger: { player: "phaseUseEnd" }, + forced: true, + content() { + player.chooseToDiscard("he", true, player.storage.guozaix2); + player.storage.guozaix2 = 0; + player.removeSkill("guozaix2"); + }, + }, + hanshuang: { + trigger: { source: "damageEnd" }, + forced: true, // alter:true, - filter(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&get.color(event.card)=='black'&& - !event.player.isTurnedOver()&&event.player.isAlive(); + filter(event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + get.color(event.card) == "black" && + !event.player.isTurnedOver() && + event.player.isAlive() + ); }, - content(){ + content() { trigger.player.turnOver(); - if(get.is.altered('hanshuang')) trigger.player.draw(); + if (get.is.altered("hanshuang")) trigger.player.draw(); player.loseHp(); }, - ai:{ - threaten:1.5, - effect:{ - player(card,player,target,current){ - if(get.color(card)=='black'&&get.tag(card,'damage')){ - return [1,0,1,-2]; + ai: { + threaten: 1.5, + effect: { + player(card, player, target, current) { + if (get.color(card) == "black" && get.tag(card, "damage")) { + return [1, 0, 1, -2]; } - } - } - } - }, - oldhanshuang:{ - trigger:{source:'damageEnd'}, - forced:true, - // alter:true, - filter(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&get.color(event.card)=='black'&& - !event.player.isTurnedOver()&&event.player.isAlive(); + }, + }, }, - content(){ + }, + oldhanshuang: { + trigger: { source: "damageEnd" }, + forced: true, + // alter:true, + filter(event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + get.color(event.card) == "black" && + !event.player.isTurnedOver() && + event.player.isAlive() + ); + }, + content() { trigger.player.turnOver(); }, - ai:{ - threaten:1.5, - effect:{ - player(card,player,target,current){ - if(get.color(card)=='black'&&get.tag(card,'damage')){ - return [1,0,1,-2]; + ai: { + threaten: 1.5, + effect: { + player(card, player, target, current) { + if (get.color(card) == "black" && get.tag(card, "damage")) { + return [1, 0, 1, -2]; } - } - } - } - }, - bingshi:{ - global:'bingshi2' - }, - bingshi2:{ - trigger:{global:'dieAfter'}, - forced:true, - globalFixed:true, - filter(event,player){ - return event.player.hasSkill('bingshi')&&event.player.isDead(); + }, + }, }, - content(){ - trigger.player.line(player,'thunder'); - player.damage('nosource','thunder').animate=false; + }, + bingshi: { + global: "bingshi2", + }, + bingshi2: { + trigger: { global: "dieAfter" }, + forced: true, + globalFixed: true, + filter(event, player) { + return event.player.hasSkill("bingshi") && event.player.isDead(); + }, + content() { + trigger.player.line(player, "thunder"); + player.damage("nosource", "thunder").animate = false; player.$damage(trigger.player); - player.$damagepop(-1,'thunder'); - if(lib.config.animation&&!lib.config.low_performance){ + player.$damagepop(-1, "thunder"); + if (lib.config.animation && !lib.config.low_performance) { player.$thunder(); } - if(!event.parent.parent.bingshi_logv){ - event.parent.parent.bingshi_logv=true; - game.logv(trigger.player,'bingshi',game.filterPlayer(),event.parent.parent); + if (!event.parent.parent.bingshi_logv) { + event.parent.parent.bingshi_logv = true; + game.logv(trigger.player, "bingshi", game.filterPlayer(), event.parent.parent); } - } + }, }, - huanwu:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ + huanwu: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { return !target.storage.huanwu; }, - content(){ + content() { target.gainMaxHp(); target.recover(); target.draw(2); - target.storage.huanwu=true; - target.mark('huanwu',{ - name:'唤雾', - content:'已发动' + target.storage.huanwu = true; + target.mark("huanwu", { + name: "唤雾", + content: "已发动", }); - game.addVideo('mark',target,{ - name:'唤雾', - content:'已发动', - id:'huanwu' + game.addVideo("mark", target, { + name: "唤雾", + content: "已发动", + id: "huanwu", }); }, - ai:{ - threaten:1.2, - result:{ - target(player,target){ - return 1/target.hp; - } + ai: { + threaten: 1.2, + result: { + target(player, target) { + return 1 / target.hp; + }, }, - order:10, - expose:0.3 - } + order: 10, + expose: 0.3, + }, }, - fengnu:{ - mod:{ - cardUsable(card){ - if(get.info(card)&&get.info(card).forceUsable) return; + fengnu: { + mod: { + cardUsable(card) { + if (get.info(card) && get.info(card).forceUsable) return; return Infinity; }, - targetInRange(){ - if(!get.is.altered('fengnu')) return true; - } + targetInRange() { + if (!get.is.altered("fengnu")) return true; + }, }, // alter:true, - trigger:{player:'useCard'}, - filter(event,player){ - if(_status.currentPhase!=player) return false; - return player.countUsed(event.card)>1; + trigger: { player: "useCard" }, + filter(event, player) { + if (_status.currentPhase != player) return false; + return player.countUsed(event.card) > 1; }, - forced:true, - usable:3, - content(){ + forced: true, + usable: 3, + content() { player.draw(); - } + }, }, - shengdun:{ - trigger:{player:'phaseBegin'}, - forced:true, - filter(event,player){ + shengdun: { + trigger: { player: "phaseBegin" }, + forced: true, + filter(event, player) { return !player.hujia; }, - content(){ + content() { player.changeHujia(); player.update(); }, }, - shengdun_old:{ - trigger:{player:'phaseBegin'}, - silent:true, - priority:10, - init2(player){ - player.markSkill('shengdun'); + shengdun_old: { + trigger: { player: "phaseBegin" }, + silent: true, + priority: 10, + init2(player) { + player.markSkill("shengdun"); }, - content(){ - if(player.storage.shengdun){ - player.markSkill('shengdun'); + content() { + if (player.storage.shengdun) { + player.markSkill("shengdun"); } - player.storage.shengdun=false; + player.storage.shengdun = false; }, - intro:{ - content:'未发动' + intro: { + content: "未发动", }, - group:'shengdun2' + group: "shengdun2", }, - shengdun_old2:{ - trigger:{player:'damageBegin'}, - forced:true, - filter(event,player){ - return event.num>0&&!player.storage.shengdun; + shengdun_old2: { + trigger: { player: "damageBegin" }, + forced: true, + filter(event, player) { + return event.num > 0 && !player.storage.shengdun; }, - content(){ + content() { trigger.num--; - player.storage.shengdun=true; - player.unmarkSkill('shengdun'); - } - }, - jingmeng:{ - trigger:{player:'useCard'}, - frequent:true, - filter(event,player){ - return _status.currentPhase==player&&player.countUsed()==1; + player.storage.shengdun = true; + player.unmarkSkill("shengdun"); }, - content(){ - var type=get.type(trigger.card); - var card=get.cardPile2(function(card){ - return get.type(card)==type; + }, + jingmeng: { + trigger: { player: "useCard" }, + frequent: true, + filter(event, player) { + return _status.currentPhase == player && player.countUsed() == 1; + }, + content() { + var type = get.type(trigger.card); + var card = get.cardPile2(function (card) { + return get.type(card) == type; }); - if(card){ - player.gain(card,'gain2','log'); + if (card) { + player.gain(card, "gain2", "log"); } }, - ai:{ - threaten:1.1 - } + ai: { + threaten: 1.1, + }, }, - kuixin_old:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - var nh=player.countCards('h'); - var nm=1; - return game.hasPlayer(function(current){ - if(current!=player&&Math.abs(current.countCards('h')-nh)<=nm){ + kuixin_old: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + var nh = player.countCards("h"); + var nm = 1; + return game.hasPlayer(function (current) { + if (current != player && Math.abs(current.countCards("h") - nh) <= nm) { return true; } }); }, - content(){ - 'step 0' - var nh=player.countCards('h'); - var nm=1; - var check=true; - if(player.countCards('h','tao')){ - check=false; + content() { + "step 0"; + var nh = player.countCards("h"); + var nm = 1; + var check = true; + if (player.countCards("h", "tao")) { + check = false; + } else if (player.countCards("h", "shan") && player.countCards("h", "wuxie")) { + check = false; } - else if(player.countCards('h','shan')&&player.countCards('h','wuxie')){ - check=false; - } - player.chooseTarget(get.prompt('kuixin'),function(card,player,target){ - return target!=player&&Math.abs(target.countCards('h')-nh)<=nm; - }).ai=function(target){ - if(!check) return 0; - if(get.attitude(player,target)<0){ - return target.countCards('h')-nh; + player.chooseTarget(get.prompt("kuixin"), function (card, player, target) { + return target != player && Math.abs(target.countCards("h") - nh) <= nm; + }).ai = function (target) { + if (!check) return 0; + if (get.attitude(player, target) < 0) { + return target.countCards("h") - nh; } return 0; }; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('kuixin',result.targets); - var cards0=target.getCards('h'); - var cards1=player.getCards('h'); - target.gain(cards1,player); - player.gain(cards0,target); - target.$give(cards0.length,player); - player.$give(cards1.length,target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("kuixin", result.targets); + var cards0 = target.getCards("h"); + var cards1 = player.getCards("h"); + target.gain(cards1, player); + player.gain(cards0, target); + target.$give(cards0.length, player); + player.$give(cards1.length, target); } }, - ai:{ - expose:0.2, - threaten:1.5 - } - }, - hswuji:{ - trigger:{player:'phaseUseEnd'}, - frequent:true, - filter(event,player){ - return player.countUsed()>0; + ai: { + expose: 0.2, + threaten: 1.5, }, - content(){ + }, + hswuji: { + trigger: { player: "phaseUseEnd" }, + frequent: true, + filter(event, player) { + return player.countUsed() > 0; + }, + content() { player.draw(player.countUsed()); }, - ai:{ - threaten:1.3 - } + ai: { + threaten: 1.3, + }, }, - bingshuang:{ - trigger:{source:'damageEnd'}, - filter(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&get.type(event.card)=='trick'&& - event.player.isAlive()&&!event.player.isTurnedOver(); + bingshuang: { + trigger: { source: "damageEnd" }, + filter(event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + get.type(event.card) == "trick" && + event.player.isAlive() && + !event.player.isTurnedOver() + ); }, - check(event,player){ - if(event.player.hasSkillTag('noturn')) return; - if(event.player.isTurnedOver()){ - return get.attitude(player,event.player)>0; + check(event, player) { + if (event.player.hasSkillTag("noturn")) return; + if (event.player.isTurnedOver()) { + return get.attitude(player, event.player) > 0; } - return get.attitude(player,event.player)<=0; + return get.attitude(player, event.player) <= 0; }, - logTarget:'player', - content(){ + logTarget: "player", + content() { trigger.player.draw(2); trigger.player.turnOver(); - } + }, }, - yanshu:{ - trigger:{player:'discardAfter'}, - frequent:true, - usable:1, - filter(event,player){ - if(!event.cards) return false; - for(var i=0;i0; + logTarget: "player", + check(event, player) { + return get.attitude(player, event.player) > 0; }, - content(){ + content() { trigger.player.recover(); - player.addTempSkill('shengyan2'); + player.addTempSkill("shengyan2"); + }, + ai: { + expose: 0.2, }, - ai:{ - expose:0.2 - } }, - shengyan2:{}, - liechao:{ - enable:'phaseUse', - usable:1, + shengyan2: {}, + liechao: { + enable: "phaseUse", + usable: 1, // alter:true, - filter(event,player){ - return !player.isTurnedOver()&&player.countCards('h')<=player.hp; + filter(event, player) { + return !player.isTurnedOver() && player.countCards("h") <= player.hp; }, - content(){ - player.draw(get.is.altered('liechao')?3:4); + content() { + player.draw(get.is.altered("liechao") ? 3 : 4); player.turnOver(); - player.skip('phaseDiscard'); + player.skip("phaseDiscard"); + }, + ai: { + order: 10, + result: { + player: 1, + }, }, - ai:{ - order:10, - result:{ - player:1 - } - } }, - qingliu:{ - trigger:{player:'damageBefore'}, - filter(event){ - return event.nature=='fire'; + qingliu: { + trigger: { player: "damageBefore" }, + filter(event) { + return event.nature == "fire"; }, - forced:true, - content(){ + forced: true, + content() { trigger.cancel(); }, - ai:{ - nofire:true, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'fireDamage')) return 0; - } - } - } - }, - zhongjia:{ - trigger:{player:'damageEnd'}, - forced:true, - filter(event){ - return event.num>0; + ai: { + nofire: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "fireDamage")) return 0; + }, + }, }, - content(){ + }, + zhongjia: { + trigger: { player: "damageEnd" }, + forced: true, + filter(event) { + return event.num > 0; + }, + content() { player.changeHujia(); }, - ai:{ - nohujia:true, - maixie:true, - maixie_hp:true, - skillTagFilter(player){ - return player.hp>player.countCards('h')&&player.hp>1; + ai: { + nohujia: true, + maixie: true, + maixie_hp: true, + skillTagFilter(player) { + return player.hp > player.countCards("h") && player.hp > 1; }, - threaten(player,target){ - if(!target.hujia) return 0.8; + threaten(player, target) { + if (!target.hujia) return 0.8; }, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; return 0.8; } - } - } - } + }, + }, + }, }, - dunji:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.hujia?true:false; + dunji: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.hujia ? true : false; }, - filterTarget(card,player,target){ - return player!=target&&get.distance(player,target,'attack')<=1; + filterTarget(card, player, target) { + return player != target && get.distance(player, target, "attack") <= 1; }, - selectTarget(){ - return [1,_status.event.player.hujia]; + selectTarget() { + return [1, _status.event.player.hujia]; }, - contentBefore(){ + contentBefore() { player.changeHujia(-targets.length); }, - content(){ + content() { target.damage(); }, - ai:{ - order:9, - result:{ - target(player,target){ - var eff=get.damageEffect(target,player,target)+0.5; - if(eff>0&&eff<=0.5) return 0; + ai: { + order: 9, + result: { + target(player, target) { + var eff = get.damageEffect(target, player, target) + 0.5; + if (eff > 0 && eff <= 0.5) return 0; return eff; - } - } - } - }, - fengxing:{ - trigger:{player:'loseEnd'}, - direct:true, - filter(event,player){ - return _status.currentPhase!=player&&!player.hasSkill('fengxing2')&&player.countCards('he')>0; + }, + }, }, - content(){ - 'step 0' - player.addTempSkill('fengxing2'); - player.chooseToDiscard('he',get.prompt('fengxing')).set('ai',function(card){ - return 7-get.value(card); - }).set('autodelay',0.5).logSkill='fengxing'; - 'step 1' - if(result.bool){ + }, + fengxing: { + trigger: { player: "loseEnd" }, + direct: true, + filter(event, player) { + return ( + _status.currentPhase != player && + !player.hasSkill("fengxing2") && + player.countCards("he") > 0 + ); + }, + content() { + "step 0"; + player.addTempSkill("fengxing2"); + player + .chooseToDiscard("he", get.prompt("fengxing")) + .set("ai", function (card) { + return 7 - get.value(card); + }) + .set("autodelay", 0.5).logSkill = "fengxing"; + ("step 1"); + if (result.bool) { player.draw(2); } }, - ai:{ - threaten:0.6 - } - }, - fengxing2:{}, - fengxian:{ - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target.countCards('h')>0; + ai: { + threaten: 0.6, }, - selectTarget:-1, - content(){ + }, + fengxing2: {}, + fengxian: { + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target.countCards("h") > 0; + }, + selectTarget: -1, + content() { target.chooseToDiscard(true); }, - ai:{ - order:8, - result:{ - target(player,target){ - var nh=target.countCards('h'); - switch(nh){ - case 0:return 0; - case 1:return -1.5; - case 2:return -1.3; - case 3:return -1; - default:return -0.8; + ai: { + order: 8, + result: { + target(player, target) { + var nh = target.countCards("h"); + switch (nh) { + case 0: + return 0; + case 1: + return -1.5; + case 2: + return -1.3; + case 3: + return -1; + default: + return -0.8; } - } - } - } + }, + }, + }, }, - qiaodong:{ - enable:['chooseToUse','chooseToRespond'], - filterCard:{type:'equip'}, - filter(event,player){ - return player.countCards('he',{type:'equip'})>0; + qiaodong: { + enable: ["chooseToUse", "chooseToRespond"], + filterCard: { type: "equip" }, + filter(event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + viewAs: { name: "shan" }, + position: "he", + prompt: "将一张装备牌当闪使用或打出", + check() { + return 1; + }, + ai: { + respondShan: true, + skillTagFilter(player) { + if (!player.countCards("he", { type: "equip" })) return false; + }, }, - viewAs:{name:'shan'}, - position:'he', - prompt:'将一张装备牌当闪使用或打出', - check(){return 1}, - ai:{ - respondShan:true, - skillTagFilter(player){ - if(!player.countCards('he',{type:'equip'})) return false; - } - } }, - hsmengjing_mengye:{ - trigger:{player:'phaseEnd'}, - forced:true, - priority:-1, - filter(event,player){ - return player.countCards('he')>0; + hsmengjing_mengye: { + trigger: { player: "phaseEnd" }, + forced: true, + priority: -1, + filter(event, player) { + return player.countCards("he") > 0; }, - content(){ - player.discard(player.getCards('he')); - player.removeSkill('hsmengjing_mengye'); + content() { + player.discard(player.getCards("he")); + player.removeSkill("hsmengjing_mengye"); + }, + mark: "image", + intro: { + content: "结束阶段,弃置所有牌", }, - mark:'image', - intro:{ - content:'结束阶段,弃置所有牌' - } }, - zhanhou:{ - enable:'phaseUse', - filterCard:{subtype:'equip2'}, - position:'he', - usable:1, - filter(event,player){ - return player.countCards('he',{subtype:'equip2'})>0; + zhanhou: { + enable: "phaseUse", + filterCard: { subtype: "equip2" }, + position: "he", + usable: 1, + filter(event, player) { + return player.countCards("he", { subtype: "equip2" }) > 0; }, - check(card){ - return 7-get.value(card); + check(card) { + return 7 - get.value(card); }, - content(){ + content() { player.changeHujia(); }, - ai:{ - order:9.5, - result:{ - player:1 - } + ai: { + order: 9.5, + result: { + player: 1, + }, }, // mod:{ // globalFrom(from,to,distance){ @@ -7058,166 +7467,169 @@ game.import('character', function () { // } // }, }, - oldzhanhou:{ - enable:'phaseUse', - filterCard:{subtype:'equip2'}, - position:'he', - filter(event,player){ - return player.countCards('he',{subtype:'equip2'})>0; + oldzhanhou: { + enable: "phaseUse", + filterCard: { subtype: "equip2" }, + position: "he", + filter(event, player) { + return player.countCards("he", { subtype: "equip2" }) > 0; }, - check(card){ - if(get.position(card)=='e') return 0; - return 7-get.value(card); + check(card) { + if (get.position(card) == "e") return 0; + return 7 - get.value(card); }, - content(){ + content() { player.changeHujia(); }, - ai:{ - order:6, - result:{ - player:1 - } - } + ai: { + order: 6, + result: { + player: 1, + }, + }, }, - shijie:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); + shijie: { + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); }); }, - content(){ - 'step 0' - player.chooseTarget(get.prompt('shijie'),function(card,player,target){ - return player!=target&&target.countCards('h')>0; - }).ai=function(target){ - return 11-get.attitude(player,target); + content() { + "step 0"; + player.chooseTarget(get.prompt("shijie"), function (card, player, target) { + return player != target && target.countCards("h") > 0; + }).ai = function (target) { + return 11 - get.attitude(player, target); }; - 'step 1' - if(result.bool){ - player.logSkill('shijie',result.targets); - var target=result.targets[0]; - var card=target.getCards('h').randomGet() - player.gain(card,target); - event.target=target; - target.$giveAuto(card,player); + ("step 1"); + if (result.bool) { + player.logSkill("shijie", result.targets); + var target = result.targets[0]; + var card = target.getCards("h").randomGet(); + player.gain(card, target); + event.target = target; + target.$giveAuto(card, player); event.target.draw(); } }, - ai:{ - expose:0.1 - } + ai: { + expose: 0.1, + }, }, - shengguang:{ - enable:'phaseUse', - filterCard:{color:'red'}, - filter(event,player){ - return player.countCards('he',{color:'red'})>0; + shengguang: { + enable: "phaseUse", + filterCard: { color: "red" }, + filter(event, player) { + return player.countCards("he", { color: "red" }) > 0; }, - position:'he', - usable:1, - check(card){ - return 9-get.value(card) + position: "he", + usable: 1, + check(card) { + return 9 - get.value(card); }, - filterTarget(card,player,target){ - if(player.storage.anying) return true; - if(target.hp>=target.maxHp) return false; + filterTarget(card, player, target) { + if (player.storage.anying) return true; + if (target.hp >= target.maxHp) return false; return true; }, - content(){ - if(player.storage.anying){ + content() { + if (player.storage.anying) { target.loseHp(); - } - else{ + } else { target.recover(); } }, - ai:{ - order:9, - result:{ - target(player,target){ - if(player.storage.anying) return -1; - if(target.hp==1) return 5; - if(player==target&&player.countCards('h')>player.hp) return 5; + ai: { + order: 9, + result: { + target(player, target) { + if (player.storage.anying) return -1; + if (target.hp == 1) return 5; + if (player == target && player.countCards("h") > player.hp) return 5; return 2; - } + }, }, - threaten:2, - expose:0.2 - } + threaten: 2, + expose: 0.2, + }, }, - xinci:{ - enable:'phaseUse', - filterCard:{color:'black'}, - filter(event,player){ - return player.countCards('he',{color:'black'})>0; + xinci: { + enable: "phaseUse", + filterCard: { color: "black" }, + filter(event, player) { + return player.countCards("he", { color: "black" }) > 0; }, - position:'he', - usable:1, - mark:true, - intro:{ - content:'已进入暗影形态' + position: "he", + usable: 1, + mark: true, + intro: { + content: "已进入暗影形态", }, - check(card){ - return 9-get.value(card) + check(card) { + return 9 - get.value(card); }, - filterTarget:true, - content(){ + filterTarget: true, + content() { target.loseHp(); }, - ai:{ - order:9, - result:{ - target:-1 + ai: { + order: 9, + result: { + target: -1, }, - threaten:2, - expose:0.2 - } + threaten: 2, + expose: 0.2, + }, }, - anying:{ - unique:true, - enable:'phaseUse', - skillAnimation:'epic', - animationColor:'thunder', - derivation:'xinci', - filter(event,player){ - return !player.storage.anying&&player.countCards('he',{color:'black'})>0; + anying: { + unique: true, + enable: "phaseUse", + skillAnimation: "epic", + animationColor: "thunder", + derivation: "xinci", + filter(event, player) { + return !player.storage.anying && player.countCards("he", { color: "black" }) > 0; }, - filterCard:{color:'black'}, - position:'he', - check(card){ - return 5-get.value(card); + filterCard: { color: "black" }, + position: "he", + check(card) { + return 5 - get.value(card); }, - content(){ - player.storage.anying=true; - player.awakenSkill('anying'); - player.removeSkill('shengguang'); - player.addAdditionalSkill('anying','xinci'); + content() { + player.storage.anying = true; + player.awakenSkill("anying"); + player.removeSkill("shengguang"); + player.addAdditionalSkill("anying", "xinci"); }, - ai:{ - order:1, - result:{ - player(player){ - if(player.hasUnknown()) return 0; - return !game.hasPlayer(function(current){ - return get.attitude(player,current)>0&¤t.isDamaged()&¤t.hp<=2; + ai: { + order: 1, + result: { + player(player) { + if (player.hasUnknown()) return 0; + return !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) > 0 && + current.isDamaged() && + current.hp <= 2 + ); }); - } - } - } + }, + }, + }, }, - huanjue:{ - trigger:{player:'useCard1'}, - frequent:true, - filter(event,player){ - if(event._huanjue) return false; - if(event.targets.length!=1) return false; - var target=event.targets[0]; - for(var i=0;i0){ - if(eff2<=0) return 0; - return val2-val1; - } - else if(eff1<0){ - if(eff2>=0) return val2; + var eff1 = get.effect(trigger.targets[0], trigger.card, trigger.player, player); + var val1 = get.value(trigger.card, player, "raw"); + player.chooseButton(["幻觉", [list, "vcard"]]).ai = function (button) { + var card = { + suit: trigger.card.suit, + number: trigger.card.number, + name: button.link[2], + }; + var eff2 = get.effect(trigger.targets[0], card, trigger.player, player); + var val2 = get.value(card, player, "raw"); + if (eff1 > 0) { + if (eff2 <= 0) return 0; + return val2 - val1; + } else if (eff1 < 0) { + if (eff2 >= 0) return val2; return 0; - } - else if(eff1==0){ - if(eff2>0) return val2; + } else if (eff1 == 0) { + if (eff2 > 0) return val2; return 0; } }; - 'step 1' - if(result.bool){ - var stat=player.stat[player.stat.length-1].card; - if(stat[trigger.card.name]){ + ("step 1"); + if (result.bool) { + var stat = player.stat[player.stat.length - 1].card; + if (stat[trigger.card.name]) { stat[trigger.card.name]--; } - var card=game.createCard({ - suit:trigger.card.suit||lib.suit.randomGet(), - number:trigger.card.number||Math.ceil(Math.random()*13), - name:result.links[0][2]} - ); - event.card=card; - game.log(player,'将',trigger.card,'变为',card); + var card = game.createCard({ + suit: trigger.card.suit || lib.suit.randomGet(), + number: trigger.card.number || Math.ceil(Math.random() * 13), + name: result.links[0][2], + }); + event.card = card; + game.log(player, "将", trigger.card, "变为", card); // if(!event.isMine()) game.delayx(); - trigger.card=get.autoViewAs(card); - trigger.cards=[card]; - game.cardsGotoOrdering(card).relatedEvent=trigger; - trigger._huanjue=true; - } - else{ + trigger.card = get.autoViewAs(card); + trigger.cards = [card]; + game.cardsGotoOrdering(card).relatedEvent = trigger; + trigger._huanjue = true; + } else { event.finish(); } - 'step 2' - player.$throw(event.card,null,null,true); - if(player==trigger.player){ - player.line(trigger.targets[0],'green'); - } - else{ - player.line(trigger.player,'green'); + ("step 2"); + player.$throw(event.card, null, null, true); + if (player == trigger.player) { + player.line(trigger.targets[0], "green"); + } else { + player.line(trigger.player, "green"); } game.delayx(0.5); - 'step 3' - var stat=player.stat[player.stat.length-1].card; - if(!stat[trigger.card.name]){ - stat[trigger.card.name]=1; - } - else{ + ("step 3"); + var stat = player.stat[player.stat.length - 1].card; + if (!stat[trigger.card.name]) { + stat[trigger.card.name] = 1; + } else { stat[trigger.card.name]++; } }, - draw(){ + draw() { player.draw(); }, - ai:{ - usedu:true - } + ai: { + usedu: true, + }, }, - huanjue_old:{ - trigger:{global:'useCard'}, - usable:1, - filter(event,player){ - if(event.targets.length!=1) return false; - var target=event.targets[0]; - if(event.player==target) return false; - if(player!=event.player&&player!=target) return false; - for(var i=0;i0; + mdzhoufu: { + enable: "phaseUse", + filterCard: { color: "black" }, + filter(event, player) { + return player.countCards("h", { color: "black" }) > 0; }, - filterTarget(card,player,target){ - return player!=target&&!target.hasSkill('mdzhoufu2'); + filterTarget(card, player, target) { + return player != target && !target.hasSkill("mdzhoufu2"); }, - prepare:'throw', - discard:false, - content(){ + prepare: "throw", + discard: false, + content() { target.$gain2(cards); - target.storage.mdzhoufu2=cards[0]; - target.addSkill('mdzhoufu2'); - target.storage.mdzhoufu3=player; - game.addVideo('storage',target,['mdzhoufu2',get.cardInfo(cards[0]),'card']); + target.storage.mdzhoufu2 = cards[0]; + target.addSkill("mdzhoufu2"); + target.storage.mdzhoufu3 = player; + game.addVideo("storage", target, ["mdzhoufu2", get.cardInfo(cards[0]), "card"]); ui.special.appendChild(cards[0]); }, - check(card){ - if(get.suit(card)=='spade'){ - return 6-get.value(card); + check(card) { + if (get.suit(card) == "spade") { + return 6 - get.value(card); } return -1; }, - ai:{ - tag:{ - rejudge:0.1, + ai: { + tag: { + rejudge: 0.1, }, - threaten:1.5, - expose:0.1, - order:10, - result:{ - target:-1 - } - } + threaten: 1.5, + expose: 0.1, + order: 10, + result: { + target: -1, + }, + }, }, - mdzhoufu2:{ - trigger:{player:'judge'}, - forced:true, - priority:10, - mark:'card', - content(){ - "step 0" + mdzhoufu2: { + trigger: { player: "judge" }, + forced: true, + priority: 10, + mark: "card", + content() { + "step 0"; player.storage.mdzhoufu2.discard(); player.$throw(player.storage.mdzhoufu2); - if(player.storage.mdzhoufu2.clone){ - player.storage.mdzhoufu2.clone.classList.add('thrownhighlight'); - game.addVideo('highlightnode',player,get.cardInfo(player.storage.mdzhoufu2)); + if (player.storage.mdzhoufu2.clone) { + player.storage.mdzhoufu2.clone.classList.add("thrownhighlight"); + game.addVideo("highlightnode", player, get.cardInfo(player.storage.mdzhoufu2)); } - if(player.storage.mdzhoufu3.isIn()){ - player.storage.mdzhoufu3.line(player,'green'); + if (player.storage.mdzhoufu3.isIn()) { + player.storage.mdzhoufu3.line(player, "green"); player.storage.mdzhoufu3.gain(player.judging[0]); player.storage.mdzhoufu3.$gain2(player.judging[0]); - } - else{ + } else { player.judging[0].discard(); game.delay(1.5); } - player.removeSkill('mdzhoufu2'); - "step 1" - player.judging[0]=player.storage.mdzhoufu2; + player.removeSkill("mdzhoufu2"); + ("step 1"); + player.judging[0] = player.storage.mdzhoufu2; trigger.position.appendChild(player.storage.mdzhoufu2); // trigger.untrigger(); - game.log(player,'的判定牌改为',player.storage.mdzhoufu2); + game.log(player, "的判定牌改为", player.storage.mdzhoufu2); delete player.storage.mdzhoufu2; delete player.storage.mdzhoufu3; }, - intro:{ - content:'card' + intro: { + content: "card", }, }, - zuzhou_old:{ - trigger:{player:'damageEnd',source:'damageEnd'}, - check(event,player){ - var target=(player==event.player)?event.source:event.player; - return get.attitude(player,target)<0; + zuzhou_old: { + trigger: { player: "damageEnd", source: "damageEnd" }, + check(event, player) { + var target = player == event.player ? event.source : event.player; + return get.attitude(player, target) < 0; }, - filter(event,player){ - var target=(player==event.player)?event.source:event.player; + filter(event, player) { + var target = player == event.player ? event.source : event.player; return target.isAlive(); }, - prompt(event,player){ - var target=(player==event.player)?event.source:event.player; - return get.prompt('zuzhou',target); + prompt(event, player) { + var target = player == event.player ? event.source : event.player; + return get.prompt("zuzhou", target); }, - content(){ - "step 0" - event.target=(player==trigger.player)?trigger.source:trigger.player; - event.target.judge(function(card){ - return get.color(card)=='black'?-1:0; + content() { + "step 0"; + event.target = player == trigger.player ? trigger.source : trigger.player; + event.target.judge(function (card) { + return get.color(card) == "black" ? -1 : 0; }); - "step 1" - if(result.color=='black'){ + ("step 1"); + if (result.color == "black") { event.target.loseHp(); } }, - ai:{ - expose:0.1, - threaten:1.3 - } - }, - xianzhi:{ - trigger:{global:'judgeBegin'}, - frequent:true, - filter(){ - return ui.cardPile.childNodes.length>1; + ai: { + expose: 0.1, + threaten: 1.3, }, - check(){ + }, + xianzhi: { + trigger: { global: "judgeBegin" }, + frequent: true, + filter() { + return ui.cardPile.childNodes.length > 1; + }, + check() { return false; }, - content(){ - 'step 0' - var str=''; - if(trigger.card) str=get.translation(trigger.card.viewAs||trigger.card.name); - else if(trigger.skill) str=get.translation(trigger.skill); - else str=get.translation(trigger.parent.name); + content() { + "step 0"; + var str = ""; + if (trigger.card) str = get.translation(trigger.card.viewAs || trigger.card.name); + else if (trigger.skill) str = get.translation(trigger.skill); + else str = get.translation(trigger.parent.name); - var cards=[ui.cardPile.childNodes[0],ui.cardPile.childNodes[1]]; - var att=get.attitude(player,trigger.player); - var delta=trigger.judge(ui.cardPile.childNodes[1])-trigger.judge(ui.cardPile.childNodes[0]); - player.chooseControl('调换顺序','cancel2', - ui.create.dialog('先知:'+get.translation(trigger.player)+'的'+str+'判定',cards,'hidden')).ai=function(){ - if(att*delta>0) return '调换顺序'; - else return 'cancel2'; + var cards = [ui.cardPile.childNodes[0], ui.cardPile.childNodes[1]]; + var att = get.attitude(player, trigger.player); + var delta = + trigger.judge(ui.cardPile.childNodes[1]) - trigger.judge(ui.cardPile.childNodes[0]); + player.chooseControl( + "调换顺序", + "cancel2", + ui.create.dialog( + "先知:" + get.translation(trigger.player) + "的" + str + "判定", + cards, + "hidden" + ) + ).ai = function () { + if (att * delta > 0) return "调换顺序"; + else return "cancel2"; }; - 'step 1' - if(result.control=='调换顺序'){ - var card=ui.cardPile.firstChild; + ("step 1"); + if (result.control == "调换顺序") { + var card = ui.cardPile.firstChild; ui.cardPile.removeChild(card); - ui.cardPile.insertBefore(card,ui.cardPile.firstChild.nextSibling); - game.log(player,'调换了牌堆顶两张牌的顺序'); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild.nextSibling); + game.log(player, "调换了牌堆顶两张牌的顺序"); } }, - ai:{ - expose:0.1, - tag:{ - rejudge:0.5 - } - } + ai: { + expose: 0.1, + tag: { + rejudge: 0.5, + }, + }, }, - jingxiang:{ - trigger:{player:'chooseToRespondBegin'}, - direct:true, - usable:1, + jingxiang: { + trigger: { player: "chooseToRespondBegin" }, + direct: true, + usable: 1, // alter:true, - filter(event,player){ - if(event.responded) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); + filter(event, player) { + if (event.responded) return false; + return game.hasPlayer(function (current) { + return current != player && current.countCards("h"); }); }, - content(){ - "step 0" - player.chooseTarget(get.prompt('jingxiang'),function(card,player,target){ - if(target==player) return false; - var nh=target.countCards('h'); - if(nh==0) return false; - if(get.is.altered('jingxiang')){ - return nh<=player.countCards('h'); + content() { + "step 0"; + player.chooseTarget(get.prompt("jingxiang"), function (card, player, target) { + if (target == player) return false; + var nh = target.countCards("h"); + if (nh == 0) return false; + if (get.is.altered("jingxiang")) { + return nh <= player.countCards("h"); } return true; - }).ai=function(target){ - return 1-get.attitude(player,target); + }).ai = function (target) { + return 1 - get.attitude(player, target); }; - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jingxiang',target); - event.target=target; - var cards=target.getCards('h'); - player.chooseCardButton('选择'+get.translation(target)+'的一张卡手牌打出',cards).filterButton=function(button){ + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jingxiang", target); + event.target = target; + var cards = target.getCards("h"); + player.chooseCardButton( + "选择" + get.translation(target) + "的一张卡手牌打出", + cards + ).filterButton = function (button) { return trigger.filterCard(button.link); - } - } - else{ + }; + } else { event.finish(); } - "step 2" - if(result.bool){ - game.log(player,'使用了',event.target,'的手牌'); + ("step 2"); + if (result.bool) { + game.log(player, "使用了", event.target, "的手牌"); event.target.$throw(result.links); event.target.lose(result.links); trigger.untrigger(); - trigger.animate=false; - trigger.responded=true; + trigger.animate = false; + trigger.responded = true; result.buttons[0].link.remove(); - trigger.result={bool:true,card:result.buttons[0].link} - } - else{ + trigger.result = { bool: true, card: result.buttons[0].link }; + } else { player.storage.counttrigger.jingxiang--; } }, - ai:{ - respondShan:true, - effect:{ - target(card){ - if(get.tag(card,'respondShan')) return 0.4; - if(get.tag(card,'respondSha')) return 0.4; - } - } - }, - }, - wlianji:{ - trigger:{player:'phaseEnd'}, - frequent:true, - filter(event,player){ - return player.countUsed()>player.hp; - }, - content(){ - player.draw(2); - }, - init(player){player.storage.jingce=true}, - intro:{ - content(storage,player){ - if(_status.currentPhase==player) return '已使用'+player.countUsed()+'张牌'; - } - } - }, - mengun:{ - trigger:{global:'useCardToBefore'}, - priority:12, - filter(event,player){ - if(event.player==player) return false; - if(_status.currentPhase!=event.player) return false; - if(event.player.hasSkill('mengun2')) return false; - if(get.itemtype(event.card)!='card') return false; - if(!player.countCards('h',{suit:get.suit(event.card)})) return false; - return get.type(event.card)=='basic'; - }, - direct:true, - content(){ - "step 0" - var val=get.value(trigger.card); - var suit=get.suit(trigger.card); - var eff=get.effect(trigger.target,trigger.card,trigger.player,player); - var next=player.chooseToDiscard('是否对'+get.translation(trigger.player)+'使用的'+get.translation(trigger.card)+'发动【闷棍】?',function(card){ - return get.suit(card)==suit; - }); - next.logSkill=['mengun',trigger.player]; - next.ai=function(card){ - if(eff>=0) return 0; - return Math.min(8,1+val)-get.value(card); - } - "step 1" - if(result.bool){ - game.log(trigger.player,'收回了',trigger.cards); - trigger.cancel(); - game.delay(); - } - else{ - event.finish(); - } - "step 2" - trigger.player.$gain2(trigger.cards); - trigger.player.gain(trigger.cards); - trigger.player.storage.mengun2=trigger.cards[0]; - game.addVideo('storage',player,['mengun2',get.cardInfo(trigger.cards[0]),'card']); - trigger.player.addTempSkill('mengun2','phaseEnd'); - }, - ai:{ - expose:0.2 - } - }, - mengun2:{ - mark:'card', - mod:{ - cardEnabled(card,player){ - if(card==player.storage.mengun2) return false; + ai: { + respondShan: true, + effect: { + target(card) { + if (get.tag(card, "respondShan")) return 0.4; + if (get.tag(card, "respondSha")) return 0.4; + }, }, }, - intro:{ - content:'card', - onunmark(storage,player){ - delete player.storage.mengun2; - } + }, + wlianji: { + trigger: { player: "phaseEnd" }, + frequent: true, + filter(event, player) { + return player.countUsed() > player.hp; + }, + content() { + player.draw(2); + }, + init(player) { + player.storage.jingce = true; + }, + intro: { + content(storage, player) { + if (_status.currentPhase == player) return "已使用" + player.countUsed() + "张牌"; + }, }, }, - jianren:{ - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.getEquip(1)?true:false; + mengun: { + trigger: { global: "useCardToBefore" }, + priority: 12, + filter(event, player) { + if (event.player == player) return false; + if (_status.currentPhase != event.player) return false; + if (event.player.hasSkill("mengun2")) return false; + if (get.itemtype(event.card) != "card") return false; + if (!player.countCards("h", { suit: get.suit(event.card) })) return false; + return get.type(event.card) == "basic"; }, - filterCard(card,player){ - return card==player.getEquip(1); + direct: true, + content() { + "step 0"; + var val = get.value(trigger.card); + var suit = get.suit(trigger.card); + var eff = get.effect(trigger.target, trigger.card, trigger.player, player); + var next = player.chooseToDiscard( + "是否对" + + get.translation(trigger.player) + + "使用的" + + get.translation(trigger.card) + + "发动【闷棍】?", + function (card) { + return get.suit(card) == suit; + } + ); + next.logSkill = ["mengun", trigger.player]; + next.ai = function (card) { + if (eff >= 0) return 0; + return Math.min(8, 1 + val) - get.value(card); + }; + ("step 1"); + if (result.bool) { + game.log(trigger.player, "收回了", trigger.cards); + trigger.cancel(); + game.delay(); + } else { + event.finish(); + } + ("step 2"); + trigger.player.$gain2(trigger.cards); + trigger.player.gain(trigger.cards); + trigger.player.storage.mengun2 = trigger.cards[0]; + game.addVideo("storage", player, ["mengun2", get.cardInfo(trigger.cards[0]), "card"]); + trigger.player.addTempSkill("mengun2", "phaseEnd"); }, - position:'e', - filterTarget(card,player,target){ - return target!=player; + ai: { + expose: 0.2, }, - selectCard:-1, - selectTarget:-1, - content(){ + }, + mengun2: { + mark: "card", + mod: { + cardEnabled(card, player) { + if (card == player.storage.mengun2) return false; + }, + }, + intro: { + content: "card", + onunmark(storage, player) { + delete player.storage.mengun2; + }, + }, + }, + jianren: { + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.getEquip(1) ? true : false; + }, + filterCard(card, player) { + return card == player.getEquip(1); + }, + position: "e", + filterTarget(card, player, target) { + return target != player; + }, + selectCard: -1, + selectTarget: -1, + content() { target.damage(); }, - ai:{ - order:9, - result:{ - target(player,target){ - return get.damageEffect(target,player,target); - } - } - } - }, - jihuo:{ - trigger:{player:'phaseAfter'}, - filter(event,player){ - return player.countCards('h')>0&&event.skill!='jihuo'; + ai: { + order: 9, + result: { + target(player, target) { + return get.damageEffect(target, player, target); + }, + }, }, - direct:true, - priority:-50, - content(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('jihuo')); - next.ai=get.unuseful2; - next.logSkill='jihuo'; - "step 1" - if(result.bool){ + }, + jihuo: { + trigger: { player: "phaseAfter" }, + filter(event, player) { + return player.countCards("h") > 0 && event.skill != "jihuo"; + }, + direct: true, + priority: -50, + content() { + "step 0"; + var next = player.chooseToDiscard(get.prompt("jihuo")); + next.ai = get.unuseful2; + next.logSkill = "jihuo"; + ("step 1"); + if (result.bool) { player.insertPhase(); } }, - ai:{ - threaten:1.2 - } + ai: { + threaten: 1.2, + }, }, - tzhenji:{ - trigger:{player:'discardAfter'}, - direct:true, - filter(event,player){ - if(player.hasSkill('tzhenji2')){ + tzhenji: { + trigger: { player: "discardAfter" }, + direct: true, + filter(event, player) { + if (player.hasSkill("tzhenji2")) { return false; } - if(event.cards){ - for(var i=0;i0; - return get.damageEffect(target,player,player,'thunder')-(bool?1:0); + player.chooseTarget(get.prompt("tzhenji")).ai = function (target) { + var bool = get.attitude(player, target) > 0; + return get.damageEffect(target, player, player, "thunder") - (bool ? 1 : 0); }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { game.delay(0.5); - var target=result.targets[0]; - player.logSkill('tzhenji',target,'thunder'); - var cs=target.getCards('he'); - if(cs.length){ + var target = result.targets[0]; + player.logSkill("tzhenji", target, "thunder"); + var cs = target.getCards("he"); + if (cs.length) { target.discard(cs.randomGet()); } - target.damage('thunder'); - player.addTempSkill('tzhenji2'); + target.damage("thunder"); + player.addTempSkill("tzhenji2"); } }, - ai:{ - threaten:1.2, - expose:0.3, - effect:{ - target(card,player,target){ - if(get.tag(card,'loseCard')&&target.countCards('he')){ + ai: { + threaten: 1.2, + expose: 0.3, + effect: { + target(card, player, target) { + if (get.tag(card, "loseCard") && target.countCards("he")) { return 0.7; } - } + }, }, - } - }, - tzhenji2:{}, - tzhenji_old:{ - trigger:{player:['useCard','respondEnd']}, - filter(event){ - return get.suit(event.card)=='spade'; }, - direct:true, - content(){ + }, + tzhenji2: {}, + tzhenji_old: { + trigger: { player: ["useCard", "respondEnd"] }, + filter(event) { + return get.suit(event.card) == "spade"; + }, + direct: true, + content() { "step 0"; - player.chooseTarget(get.prompt('tzhenji_old')).ai=function(target){ - return get.damageEffect(target,player,player,'thunder')-1; + player.chooseTarget(get.prompt("tzhenji_old")).ai = function (target) { + return get.damageEffect(target, player, player, "thunder") - 1; }; - "step 1" - if(result.bool){ - player.logSkill('tzhenji',result.targets,'thunder'); - event.target=result.targets[0]; + ("step 1"); + if (result.bool) { + player.logSkill("tzhenji", result.targets, "thunder"); + event.target = result.targets[0]; event.target.judge(); - } - else{ + } else { event.finish(); } - "step 2" - if(result.color=='red'){ - event.target.damage('fire'); - } - else{ - event.target.damage('thunder'); - var cs=event.target.getCards('he'); - if(cs.length){ + ("step 2"); + if (result.color == "red") { + event.target.damage("fire"); + } else { + event.target.damage("thunder"); + var cs = event.target.getCards("he"); + if (cs.length) { event.target.discard(cs.randomGet()); } - cs=player.getCards('he'); - if(cs.length){ + cs = player.getCards("he"); + if (cs.length) { player.discard(cs.randomGet()); } } }, - ai:{ - expose:0.2, - threaten:1.2, - effect_old:{ - target(card,player,target){ - if(get.tag(card,'respondShan')){ - var hastarget=game.hasPlayer(function(current){ - return get.attitude(player,current)<0; + ai: { + expose: 0.2, + threaten: 1.2, + effect_old: { + target(card, player, target) { + if (get.tag(card, "respondShan")) { + var hastarget = game.hasPlayer(function (current) { + return get.attitude(player, current) < 0; }); - var ns=target.countCards('h','shan'); - var nh=target.countCards('h'); - if(ns>1){ - return [0,hastarget?1:0]; + var ns = target.countCards("h", "shan"); + var nh = target.countCards("h"); + if (ns > 1) { + return [0, hastarget ? 1 : 0]; } - if(ns&&nh>=2){ - return [0,0]; + if (ns && nh >= 2) { + return [0, 0]; } - if(nh>3){ - return [0,0]; + if (nh > 3) { + return [0, 0]; } - if(nh==0){ + if (nh == 0) { return 1.5; } - return [1,0.05]; + return [1, 0.05]; } - } - } - } + }, + }, + }, }, - tuteng_s:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - filter(event,player){ - var rand=['tuteng1','tuteng2','tuteng3','tuteng4']; - for(var i=0;i=3){ + if (rand2.length >= 3) { player.removeSkill(rand2.randomGet()); } - player.addSkill(rand.randomGet('tuteng1','tuteng3')); + player.addSkill(rand.randomGet("tuteng1", "tuteng3")); + }, + ai: { + threaten: 2, }, - ai:{ - threaten:2 - } }, - tuteng:{ - enable:'phaseUse', - usable:1, - unique:true, - direct:true, - delay:0, - init(){ - for(var i=1;i<=8;i++){ - lib.translate['tuteng'+i+'_info']=lib.skill['tuteng'+i].intro.content; + tuteng: { + enable: "phaseUse", + usable: 1, + unique: true, + direct: true, + delay: 0, + init() { + for (var i = 1; i <= 8; i++) { + lib.translate["tuteng" + i + "_info"] = lib.skill["tuteng" + i].intro.content; } }, - position:'he', - filter(event,player){ - if(player.storage.tuteng_awake) return true; - var rand=['tuteng1','tuteng2','tuteng3','tuteng4']; - for(var i=0;i1||rand2.length>=4)){ - var dialog=ui.create.dialog(); - for(var i=0;i 1 || rand2.length >= 4)) { + var dialog = ui.create.dialog(); + for (var i = 0; i < rand.length; i++) { + randx[i] = ["", "", rand[i]]; } - for(var i=0;i=4){ - dialog.add('替换一个已有图腾'); - dialog.add([rand2x,'vcard']); - player.chooseButton(dialog,2,true).filterButton=function(button){ - if(ui.selected.buttons.length){ - var current=ui.selected.buttons[0].name; - if(rand.includes(current)){ + dialog.add("选择一个图腾"); + dialog.add([randx, "vcard"]); + if (rand2.length >= 4) { + dialog.add("替换一个已有图腾"); + dialog.add([rand2x, "vcard"]); + player.chooseButton(dialog, 2, true).filterButton = function (button) { + if (ui.selected.buttons.length) { + var current = ui.selected.buttons[0].name; + if (rand.includes(current)) { return rand2.includes(button.name); - } - else{ + } else { return rand.includes(button.name); } } return true; }; + } else { + player.chooseButton(dialog, true); } - else{ - player.chooseButton(dialog,true); - } - for(var i=0;i1){ - rand.remove('tuteng1'); + } else { + if (player.hp < player.maxHp && rand.includes("tuteng1")) { + player.addSkill("tuteng1"); + } else { + if (rand.length > 1) { + rand.remove("tuteng1"); } player.addSkill(rand.randomGet()); } @@ -8114,2049 +8573,2182 @@ game.import('character', function () { game.delay(); event.finish(); } - } - else{ + } else { event.finish(); } - 'step 1' - if(result.buttons.length==1){ + ("step 1"); + if (result.buttons.length == 1) { player.addSkill(result.buttons[0].name); - } - else if(result.buttons.length==2){ - var skill1=result.buttons[0].name; - var skill2=result.buttons[1].name; - if(player.hasSkill(skill1)){ + } else if (result.buttons.length == 2) { + var skill1 = result.buttons[0].name; + var skill2 = result.buttons[1].name; + if (player.hasSkill(skill1)) { player.removeSkill(skill1); player.addSkill(skill2); - } - else{ + } else { player.removeSkill(skill2); player.addSkill(skill1); } } }, - ai:{ - order:11, - result:{ - player:1 + ai: { + order: 11, + result: { + player: 1, }, effect: { - player(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return; + player(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return; return 1.2; } }, }, - threaten:2 + threaten: 2, }, - group:'tuteng_lose' + group: "tuteng_lose", }, - zuling:{ - skillAnimation:'epic', - animationColor:'thunder', - trigger:{player:'phaseBegin'}, - forced:true, - unique:true, - filter(event,player){ - if(!player.storage.tuteng_awake){ - var rand=['tuteng1','tuteng2','tuteng3','tuteng4', - 'tuteng5','tuteng6','tuteng7','tuteng8']; - var num=0; - for(var i=0;i=3){ + zuling: { + skillAnimation: "epic", + animationColor: "thunder", + trigger: { player: "phaseBegin" }, + forced: true, + unique: true, + filter(event, player) { + if (!player.storage.tuteng_awake) { + var rand = [ + "tuteng1", + "tuteng2", + "tuteng3", + "tuteng4", + "tuteng5", + "tuteng6", + "tuteng7", + "tuteng8", + ]; + var num = 0; + for (var i = 0; i < player.skills.length; i++) { + if (rand.includes(player.skills[i])) num++; + if (num >= 3) { return true; } } } return false; }, - content(){ - player.storage.tuteng_awake=true; + content() { + player.storage.tuteng_awake = true; player.loseMaxHp(); - player.awakenSkill('zuling'); - } + player.awakenSkill("zuling"); + }, }, - huanfeng:{ - skillAnimation:'epic', - animationColor:'thunder', - trigger:{player:'phaseBeginStart'}, - forced:true, - unique:true, - filter(event,player){ + huanfeng: { + skillAnimation: "epic", + animationColor: "thunder", + trigger: { player: "phaseBeginStart" }, + forced: true, + unique: true, + filter(event, player) { // if(player.storage.huanfeng_awake) return false; - var skills=['tuteng1','tuteng2','tuteng3','tuteng4']; - for(var i=0;i0; + trigger: { player: "damageBegin" }, + forced: true, + filter(event) { + return event.num > 0; }, - content(){ + content() { trigger.num--; - player.removeSkill('tuteng3'); + player.removeSkill("tuteng3"); }, }, - tuteng4:{ - mark:'image', - nopop:true, - intro:{ - content:'在你的回合内,你的锦囊牌造成的首次伤害+1' + tuteng4: { + mark: "image", + nopop: true, + intro: { + content: "在你的回合内,你的锦囊牌造成的首次伤害+1", }, - trigger:{source:'damageBegin'}, - forced:true, - usable:1, - filter(event,player){ - return _status.currentPhase==player&&event.card&&get.type(event.card)=='trick'&&event.notLink(); + trigger: { source: "damageBegin" }, + forced: true, + usable: 1, + filter(event, player) { + return ( + _status.currentPhase == player && + event.card && + get.type(event.card) == "trick" && + event.notLink() + ); }, - content(){ + content() { trigger.num++; - } - }, - tuteng5:{ - mark:'image', - nopop:true, - intro:{ - content:'结束阶段,你摸一张牌' }, - trigger:{player:'phaseEnd'}, - forced:true, - content(){ + }, + tuteng5: { + mark: "image", + nopop: true, + intro: { + content: "结束阶段,你摸一张牌", + }, + trigger: { player: "phaseEnd" }, + forced: true, + content() { player.draw(); - } + }, }, - tuteng6:{ - mark:'image', - nopop:true, - intro:{ - content:'在你的回合内,你的杀造成的首次伤害+1' + tuteng6: { + mark: "image", + nopop: true, + intro: { + content: "在你的回合内,你的杀造成的首次伤害+1", }, - trigger:{source:'damageBegin'}, - forced:true, - filter(event,player){ - return _status.currentPhase==player&&event.card&&event.card.name=='sha'&&event.notLink(); + trigger: { source: "damageBegin" }, + forced: true, + filter(event, player) { + return ( + _status.currentPhase == player && + event.card && + event.card.name == "sha" && + event.notLink() + ); }, - usable:1, - content(){ + usable: 1, + content() { trigger.num++; - } - }, - tuteng7:{ - mark:'image', - nopop:true, - intro:{ - content:'结束阶段,你令一名其他角色回复1点体力' }, - trigger:{player:'phaseEnd'}, - direct:true, - filter(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.isDamaged(); + }, + tuteng7: { + mark: "image", + nopop: true, + intro: { + content: "结束阶段,你令一名其他角色回复1点体力", + }, + trigger: { player: "phaseEnd" }, + direct: true, + filter(event, player) { + return game.hasPlayer(function (current) { + return current != player && current.isDamaged(); }); }, - content(){ - 'step 0' - player.chooseTarget('活力图腾:令一名其他角色回复1点体力',function(card,player,target){ - return target!=player&&target.hp=player.hp) return -1; - if(player.hp<=2){ - if(player.hp==2&&nh==0) return 1; + ai: { + order: 4, + result: { + player(player) { + var nh = player.countCards("h"); + if (nh >= player.hp) return -1; + if (player.hp <= 2) { + if (player.hp == 2 && nh == 0) return 1; return -1; } return 1; - } + }, }, - effect:{ - target(card){ - if(get.tag(card,'damage')||get.tag(card,'loseHp')){ + effect: { + target(card) { + if (get.tag(card, "damage") || get.tag(card, "loseHp")) { return 1.5; } - } + }, }, - threaten:1.2 - } - }, - fenliu2:{ - mod:{ - maxHandcard(player,num){ - return num+1; - } - } - }, - hongxi:{ - trigger:{global:'dieAfter'}, - filter(event,player){ - return player.hp{ - var type=get.type(cards[0],'trick'),name=cards[0].name,card2=get.cardPile(card=>get.type(card,'trick')==type&&card.name!=name); - if(!card2) card2=get.cardPile(card=>get.type(card,'trick')==type); - if(card2) player.gain(card2,'draw'); - else player.draw().log=false; + fullimage: true, + type: "hsfashu", + vanish: true, + derivation: "hs_siwangxianzhi", + filterTarget: true, + content() { + "step 0"; + target.chooseCard("h", true, "重铸一张手牌", lib.filter.cardRecastable); + ("step 1"); + if (result.bool && result.cards.length) { + target.recast(result.cards, null, (player, cards) => { + var type = get.type(cards[0], "trick"), + name = cards[0].name, + card2 = get.cardPile( + (card) => get.type(card, "trick") == type && card.name != name + ); + if (!card2) card2 = get.cardPile((card) => get.type(card, "trick") == type); + if (card2) player.gain(card2, "draw"); + else player.draw().log = false; }); - var clone=game.createCard(card); - player.gain(clone,'gain2'); - clone.classList.add('glow'); - clone._destroy='yibian'; - player.addTempSkill('buwendingyibian_lose','phaseBegin'); - if(target.hasSkill('buwendingyibian_ai1')){ - target.addTempSkill('buwendingyibian_ai2'); - } - else{ - target.addTempSkill('buwendingyibian_ai1'); + var clone = game.createCard(card); + player.gain(clone, "gain2"); + clone.classList.add("glow"); + clone._destroy = "yibian"; + player.addTempSkill("buwendingyibian_lose", "phaseBegin"); + if (target.hasSkill("buwendingyibian_ai1")) { + target.addTempSkill("buwendingyibian_ai2"); + } else { + target.addTempSkill("buwendingyibian_ai1"); } } }, - ai:{ - wuxie(){ + ai: { + wuxie() { return 0; }, - value(card){ - if(card._destroy) return 0; + value(card) { + if (card._destroy) return 0; return 5; }, - useful:0, - result:{ - target(player,target){ - if(target==player&&target.countCards('h',function(card){ - return card.name!='hsfashu_buwendingyibian'&&get.value(card)<=1; - })){ + useful: 0, + result: { + target(player, target) { + if ( + target == player && + target.countCards("h", function (card) { + return card.name != "hsfashu_buwendingyibian" && get.value(card) <= 1; + }) + ) { return 10; } - var num=target.countCards('h'); - var num0=num; - if(target==player) num--; - if(target.hasSkill('buwendingyibian_ai1')) num/=2; - if(target.hasSkill('buwendingyibian_ai2')) num/=2; - if(num<0){ - if(num0>0) return 0.1; + var num = target.countCards("h"); + var num0 = num; + if (target == player) num--; + if (target.hasSkill("buwendingyibian_ai1")) num /= 2; + if (target.hasSkill("buwendingyibian_ai2")) num /= 2; + if (num < 0) { + if (num0 > 0) return 0.1; return 0; } return Math.sqrt(num); - } + }, }, - order:4 - } + order: 4, + }, }, - hstianqi_dalian:{ - type:'equip', - subtype:'equip1', - distance:{attackFrom:-1}, - fullimage:true, - vanish:true, - destroy:'hstianqi', - derivation:'hs_heifengqishi', - skills:['hstianqi_dalian'], - ai:{ - equipValue:10 - } + hstianqi_dalian: { + type: "equip", + subtype: "equip1", + distance: { attackFrom: -1 }, + fullimage: true, + vanish: true, + destroy: "hstianqi", + derivation: "hs_heifengqishi", + skills: ["hstianqi_dalian"], + ai: { + equipValue: 10, + }, }, - hstianqi_shali:{ - type:'equip', - subtype:'equip2', - distance:{attackFrom:-1}, - fullimage:true, - vanish:true, - destroy:'hstianqi', - derivation:'hs_heifengqishi', - skills:['hstianqi_shali'], - ai:{ - equipValue:10 - } + hstianqi_shali: { + type: "equip", + subtype: "equip2", + distance: { attackFrom: -1 }, + fullimage: true, + vanish: true, + destroy: "hstianqi", + derivation: "hs_heifengqishi", + skills: ["hstianqi_shali"], + ai: { + equipValue: 10, + }, }, - hstianqi_nazigelin:{ - type:'equip', - subtype:'equip4', - distance:{globalFrom:-1}, - fullimage:true, - vanish:true, - destroy:'hstianqi', - derivation:'hs_heifengqishi', - onEquip(){ + hstianqi_nazigelin: { + type: "equip", + subtype: "equip4", + distance: { globalFrom: -1 }, + fullimage: true, + vanish: true, + destroy: "hstianqi", + derivation: "hs_heifengqishi", + onEquip() { player.changeHujia(); }, - equipDelay:false, - ai:{ - equipValue:10 - } + equipDelay: false, + ai: { + equipValue: 10, + }, }, - hstianqi_suolasi:{ - type:'equip', - subtype:'equip3', - distance:{globalTo:1}, - fullimage:true, - vanish:true, - destroy:'hstianqi', - derivation:'hs_heifengqishi', - onLose(){ - if(player.isDamaged()){ - player.logSkill('hstianqi_suolasi'); + hstianqi_suolasi: { + type: "equip", + subtype: "equip3", + distance: { globalTo: 1 }, + fullimage: true, + vanish: true, + destroy: "hstianqi", + derivation: "hs_heifengqishi", + onLose() { + if (player.isDamaged()) { + player.logSkill("hstianqi_suolasi"); player.recover(); } }, - loseDelay:false, - ai:{ - equipValue:10 - } - }, - hsjixie_zhadan:{ - enable:true, - fullimage:true, - type:'hsjixie', - vanish:true, - derivation:'hs_pengpeng', - filterTarget(card,player,target){ - return target==player; + loseDelay: false, + ai: { + equipValue: 10, }, - modTarget:true, - selectTarget:-1, - cardcolor:'black', - content(){ - var targets=target.getEnemies(); - if(targets.length){ - var target2=targets.randomGet(); - player.line(target2,'fire'); + }, + hsjixie_zhadan: { + enable: true, + fullimage: true, + type: "hsjixie", + vanish: true, + derivation: "hs_pengpeng", + filterTarget(card, player, target) { + return target == player; + }, + modTarget: true, + selectTarget: -1, + cardcolor: "black", + content() { + var targets = target.getEnemies(); + if (targets.length) { + var target2 = targets.randomGet(); + player.line(target2, "fire"); target2.addExpose(0.2); - target2.damage('fire'); + target2.damage("fire"); } }, - ai:{ - value:8, - result:{ - target:1 + ai: { + value: 8, + result: { + target: 1, }, - order:4, - } - }, - hsqizhou_feng:{ - type:'hsqizhou', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_kalimosi', - filterTarget(card,player,target){ - return target==player; + order: 4, }, - selectTarget:-1, - content(){ - 'step 0' - event.list=target.getEnemies().sortBySeat(); - player.line(event.list,'thunder'); - 'step 1' - if(event.list.length){ - event.current=event.list.shift(); - event.current.addTempClass('target'); - var next=event.current.chooseToRespond({name:'sha'}); - next.ai=function(card){ - if(get.damageEffect(event.current,player,event.current,'thunder')>=0) return 0; - if(player.hasSkillTag('notricksource')) return 0; - if(event.current.hasSkillTag('notrick')) return 0; - return 11-get.value(card); + }, + hsqizhou_feng: { + type: "hsqizhou", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_kalimosi", + filterTarget(card, player, target) { + return target == player; + }, + selectTarget: -1, + content() { + "step 0"; + event.list = target.getEnemies().sortBySeat(); + player.line(event.list, "thunder"); + ("step 1"); + if (event.list.length) { + event.current = event.list.shift(); + event.current.addTempClass("target"); + var next = event.current.chooseToRespond({ name: "sha" }); + next.ai = function (card) { + if (get.damageEffect(event.current, player, event.current, "thunder") >= 0) + return 0; + if (player.hasSkillTag("notricksource")) return 0; + if (event.current.hasSkillTag("notrick")) return 0; + return 11 - get.value(card); }; - next.autochoose=lib.filter.autoRespondSha; - } - else{ + next.autochoose = lib.filter.autoRespondSha; + } else { event.finish(); } - 'step 2' - if(!result.bool){ - event.current.damage('thunder'); + ("step 2"); + if (!result.bool) { + event.current.damage("thunder"); } game.delayx(0.5); - 'step 3' + ("step 3"); event.goto(1); }, - ai:{ - order:8, - useful:[5,1], - value:8, - result:{ - target:1, + ai: { + order: 8, + useful: [5, 1], + value: 8, + result: { + target: 1, }, - } + }, }, - hsqizhou_shui:{ - type:'hsqizhou', - fullimage:true, - vanish:true, - enable(event,player){ + hsqizhou_shui: { + type: "hsqizhou", + fullimage: true, + vanish: true, + enable(event, player) { return player.isDamaged(); }, - derivation:'hs_kalimosi', - filterTarget(card,player,target){ - return target==player; + derivation: "hs_kalimosi", + filterTarget(card, player, target) { + return target == player; }, - selectTarget:-1, - content(){ + selectTarget: -1, + content() { target.recover(2); }, - ai:{ - order:8, - useful:[5,1], - value:8, - tag:{ - recover:1 + ai: { + order: 8, + useful: [5, 1], + value: 8, + tag: { + recover: 1, }, - result:{ - target:2, + result: { + target: 2, }, - } - }, - hsqizhou_huo:{ - type:'hsqizhou', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_kalimosi', - filterTarget:true, - content(){ - target.damage('fire'); }, - ai:{ - order:5, - result:{ - target:-1, - }, - useful:[5,1], - value:8, - tag:{ - damage:1, - fireDamage:1, - natureDamage:1, - } - } }, - hsqizhou_tu:{ - type:'hsqizhou', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_kalimosi', - filterTarget(card,player,target){ - return target!=player + hsqizhou_huo: { + type: "hsqizhou", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_kalimosi", + filterTarget: true, + content() { + target.damage("fire"); }, - selectTarget:[1,Infinity], - content(){ + ai: { + order: 5, + result: { + target: -1, + }, + useful: [5, 1], + value: 8, + tag: { + damage: 1, + fireDamage: 1, + natureDamage: 1, + }, + }, + }, + hsqizhou_tu: { + type: "hsqizhou", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_kalimosi", + filterTarget(card, player, target) { + return target != player; + }, + selectTarget: [1, Infinity], + content() { target.changeHujia(); }, - ai:{ - order:8, - useful:[5,1], - value:8, - result:{ - target:1, + ai: { + order: 8, + useful: [5, 1], + value: 8, + result: { + target: 1, }, - } - }, - hsqingyu_feibiao:{ - type:'hsqingyu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_aya', - filterTarget(card,player,target){ - return target.countCards('he')>0; }, - content(){ - var cards=[]; - var hs=target.getCards('h'); - var es=target.getCards('e'); - if(hs.length) cards.push(hs.randomGet()); - if(es.length) cards.push(es.randomGet()); + }, + hsqingyu_feibiao: { + type: "hsqingyu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_aya", + filterTarget(card, player, target) { + return target.countCards("he") > 0; + }, + content() { + var cards = []; + var hs = target.getCards("h"); + var es = target.getCards("e"); + if (hs.length) cards.push(hs.randomGet()); + if (es.length) cards.push(es.randomGet()); target.discard(cards); }, - ai:{ - order:8, - useful:3, - value:6, - result:{ - target(player,target){ - var num=0; - if(target.countCards('h')) num--; - if(target.countCards('e')) num--; + ai: { + order: 8, + useful: 3, + value: 6, + result: { + target(player, target) { + var num = 0; + if (target.countCards("h")) num--; + if (target.countCards("e")) num--; return num; }, }, - } + }, }, - hsqingyu_zhanfang:{ - type:'hsqingyu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_aya', - filterTarget:true, - content(){ + hsqingyu_zhanfang: { + type: "hsqingyu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_aya", + filterTarget: true, + content() { target.gainMaxHp(); target.draw(); }, - ai:{ - order:5, - useful:3, - value:4, - result:{ - target(player,target){ - if(target.hp==target.maxHp){ - if(target.maxHp<3) return 2; - if(target.maxHp==3) return 1.5; + ai: { + order: 5, + useful: 3, + value: 4, + result: { + target(player, target) { + if (target.hp == target.maxHp) { + if (target.maxHp < 3) return 2; + if (target.maxHp == 3) return 1.5; return 1.2; } return 1; }, }, - } + }, }, - hsqingyu_hufu:{ - type:'hsqingyu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_aya', - filterTarget:true, - content(){ + hsqingyu_hufu: { + type: "hsqingyu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_aya", + filterTarget: true, + content() { target.changeHujia(); }, - ai:{ - order:5, - useful:3, - value:6, - result:{ - target(player,target){ - return 2/Math.max(1,Math.sqrt(target.hp)); + ai: { + order: 5, + useful: 3, + value: 6, + result: { + target(player, target) { + return 2 / Math.max(1, Math.sqrt(target.hp)); }, }, - } - }, - hsqingyu_shandian:{ - type:'hsqingyu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_aya', - filterTarget:true, - content(){ - target.damage('thunder'); }, - ai:{ - order:5, - result:{ - target:-1, - }, - useful:5, - value:8, - tag:{ - damage:1, - thunderDamage:1, - natureDamage:1, - } - } }, - hsqingyu_zhao:{ - type:'equip', - subtype:'equip1', - distance:{attackFrom:-1}, - fullimage:true, - vanish:true, - derivation:'hs_aya', - onEquip(){ + hsqingyu_shandian: { + type: "hsqingyu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_aya", + filterTarget: true, + content() { + target.damage("thunder"); + }, + ai: { + order: 5, + result: { + target: -1, + }, + useful: 5, + value: 8, + tag: { + damage: 1, + thunderDamage: 1, + natureDamage: 1, + }, + }, + }, + hsqingyu_zhao: { + type: "equip", + subtype: "equip1", + distance: { attackFrom: -1 }, + fullimage: true, + vanish: true, + derivation: "hs_aya", + onEquip() { player.draw(); }, - ai:{ - order:9, - useful:5, - value:4 - } + ai: { + order: 9, + useful: 5, + value: 4, + }, }, - hsdusu_xueji:{ - type:'hsdusu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_xialikeer', - filterTarget(card,player,target){ - return target.countCards('e')>0; + hsdusu_xueji: { + type: "hsdusu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_xialikeer", + filterTarget(card, player, target) { + return target.countCards("e") > 0; }, - content(){ - target.discard(target.getCards('e').randomGets(2)); + content() { + target.discard(target.getCards("e").randomGets(2)); }, - ai:{ - order:5, - result:{ - target(player,target){ - if(target.hasSkillTag('noe')) return 0; - if(target.countCards('e')>1) return -1.5; + ai: { + order: 5, + result: { + target(player, target) { + if (target.hasSkillTag("noe")) return 0; + if (target.countCards("e") > 1) return -1.5; return -1; }, }, - value:5, - } - }, - hsdusu_kuyecao:{ - type:'hsdusu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_xialikeer', - filterTarget(card,player,target){ - return !target.hasSkill('qianxing'); + value: 5, }, - content(){ + }, + hsdusu_kuyecao: { + type: "hsdusu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_xialikeer", + filterTarget(card, player, target) { + return !target.hasSkill("qianxing"); + }, + content() { target.tempHide(); }, - ai:{ - order:2, - result:{ - target(player,target){ - if(player!=target&&get.distance(player,target,'absolute')<=1) return 0; - var num=1; - if(target==player){ - num=1.5; + ai: { + order: 2, + result: { + target(player, target) { + if (player != target && get.distance(player, target, "absolute") <= 1) return 0; + var num = 1; + if (target == player) { + num = 1.5; } - if(target.hp==1) return 2*num; - if(target.hp==2&&target.countCards('h')<=2) return 1.2*num; + if (target.hp == 1) return 2 * num; + if (target.hp == 2 && target.countCards("h") <= 2) return 1.2 * num; return num; - } + }, }, - value:5, - } - }, - hsdusu_huangxuecao:{ - type:'hsdusu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_xialikeer', - filterTarget(card,player,target){ - return target==player; + value: 5, }, - selectTarget:-1, - modTarget:true, - content(){ + }, + hsdusu_huangxuecao: { + type: "hsdusu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_xialikeer", + filterTarget(card, player, target) { + return target == player; + }, + selectTarget: -1, + modTarget: true, + content() { target.draw(2); }, - ai:{ - order:9, - result:{ - target:1, + ai: { + order: 9, + result: { + target: 1, }, - value:10, - } - }, - hsdusu_huoyanhua:{ - type:'hsdusu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_xialikeer', - range:{attack:1}, - filterTarget:true, - content(){ - target.damage('fire'); + value: 10, }, - ai:{ - order:5, - result:{ - target:-1, + }, + hsdusu_huoyanhua: { + type: "hsdusu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_xialikeer", + range: { attack: 1 }, + filterTarget: true, + content() { + target.damage("fire"); + }, + ai: { + order: 5, + result: { + target: -1, }, - useful:5, - value:8, - tag:{ - damage:1, - fireDamage:1, - natureDamage:1, - } - } + useful: 5, + value: 8, + tag: { + damage: 1, + fireDamage: 1, + natureDamage: 1, + }, + }, }, - hsdusu_shinancao:{ - type:'hsdusu', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_xialikeer', - filterTarget(card,player,target){ - return !target.hasSkill('hsdusu_shinancao'); + hsdusu_shinancao: { + type: "hsdusu", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_xialikeer", + filterTarget(card, player, target) { + return !target.hasSkill("hsdusu_shinancao"); }, - content(){ - target.addSkill('hsdusu_shinancao'); + content() { + target.addSkill("hsdusu_shinancao"); }, - ai:{ - order:7, - result:{ - target(player,target){ - if(target.hp>1){ - if(target.countCards('h')>2) return 1; + ai: { + order: 7, + result: { + target(player, target) { + if (target.hp > 1) { + if (target.countCards("h") > 2) return 1; return 0.5; } return 0.2; }, }, - value:5, - } - }, - hsbaowu_cangbaotu:{ - type:'hsbaowu', - fullimage:true, - vanish:true, - enable:true, - gainable:false, - derivation:'hs_yelise', - filterTarget(card,player,target){ - return target==player; + value: 5, }, - selectTarget:-1, - content(){ - target.addSkill('hsbaowu_cangbaotu'); + }, + hsbaowu_cangbaotu: { + type: "hsbaowu", + fullimage: true, + vanish: true, + enable: true, + gainable: false, + derivation: "hs_yelise", + filterTarget(card, player, target) { + return target == player; + }, + selectTarget: -1, + content() { + target.addSkill("hsbaowu_cangbaotu"); target.draw(); }, - ai:{ - order:10, - result:{ - player:10 + ai: { + order: 10, + result: { + player: 10, }, - useful:10, - value:10, - } - }, - hsbaowu_huangjinyuanhou:{ - type:'hsbaowu', - fullimage:true, - vanish:true, - enable:true, - gainable:false, - derivation:'hs_yelise', - filterTarget(card,player,target){ - return target==player; + useful: 10, + value: 10, }, - selectTarget:-1, - content(){ - 'step 0' - var cards=target.getCards(); - if(cards.length){ - target.lose(cards)._triggered=null; + }, + hsbaowu_huangjinyuanhou: { + type: "hsbaowu", + fullimage: true, + vanish: true, + enable: true, + gainable: false, + derivation: "hs_yelise", + filterTarget(card, player, target) { + return target == player; + }, + selectTarget: -1, + content() { + "step 0"; + var cards = target.getCards(); + if (cards.length) { + target.lose(cards)._triggered = null; } - event.num=1+cards.length; - 'step 1' - var cards=[]; - var list=[]; - if(lib.characterPack.hearth){ - for(var i=0;i1) return 1; - if(player.hp==1) return 1; + ai: { + order: 10, + result: { + player(player) { + if (player.countCards("h") > 1) return 1; + if (player.hp == 1) return 1; return 0; - } + }, }, - useful:10, - value:10, - } + useful: 10, + value: 10, + }, }, - hsshenqi_nengliangzhiguang:{ - type:'hsshenqi', - fullimage:true, - vanish:true, - enable(card,player){ + hsshenqi_nengliangzhiguang: { + type: "hsshenqi", + fullimage: true, + vanish: true, + enable(card, player) { return !player.isTurnedOver(); }, - derivation:'hs_lafamu', - filterTarget:true, - content(){ + derivation: "hs_lafamu", + filterTarget: true, + content() { target.gainMaxHp(); target.recover(); target.draw(4); }, - contentAfter(){ - if(!player.isTurnedOver()){ + contentAfter() { + if (!player.isTurnedOver()) { player.turnOver(); } }, - ai:{ - order:5, - result:{ - target(player,target){ - if(target.hp<=1) return 2; - if(target.countCards('h')0; + derivation: "hs_lafamu", + filterTarget(card, player, target) { + return target != player && target.countCards("hej") > 0; }, - selectTarget:-1, - content(){ - if(target.countCards('hej')) player.gainPlayerCard(target,'hej',true); + selectTarget: -1, + content() { + if (target.countCards("hej")) player.gainPlayerCard(target, "hej", true); }, - contentAfter(){ - if(!player.isTurnedOver()){ + contentAfter() { + if (!player.isTurnedOver()) { player.turnOver(); } }, - ai:{ - order:9.5, - result:{ - player:1 + ai: { + order: 9.5, + result: { + player: 1, }, - tag:{ - multitarget:1, - multineg:1, - loseCard:1, - gain:1 + tag: { + multitarget: 1, + multineg: 1, + loseCard: 1, + gain: 1, }, - useful:5, - value:10, - } + useful: 5, + value: 10, + }, }, - hsmengjing_feicuiyoulong:{ - type:'hsmengjing', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_ysera', - filterTarget:true, - content(){ + hsmengjing_feicuiyoulong: { + type: "hsmengjing", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_ysera", + filterTarget: true, + content() { target.damage(); }, - ai:{ - order:5, - result:{ - target:-1 + ai: { + order: 5, + result: { + target: -1, }, - tag:{ - damage:1 + tag: { + damage: 1, }, - useful:5, - value:10, - } - }, - hsmengjing_suxing:{ - type:'hsmengjing', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_ysera', - filterTarget(card,player,target){ - return player!=target; + useful: 5, + value: 10, }, - selectTarget:-1, - content(){ + }, + hsmengjing_suxing: { + type: "hsmengjing", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_ysera", + filterTarget(card, player, target) { + return player != target; + }, + selectTarget: -1, + content() { target.loseHp(); - var he=target.getCards('he'); - if(he.length){ + var he = target.getCards("he"); + if (he.length) { target.discard(he.randomGets(2)); } }, - ai:{ - result:{ - target:-1, + ai: { + result: { + target: -1, }, - order:6, - useful:5, - value:10, - } + order: 6, + useful: 5, + value: 10, + }, }, - hsmengjing_mengye:{ - type:'hsmengjing', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_ysera', - filterTarget:true, - content(){ + hsmengjing_mengye: { + type: "hsmengjing", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_ysera", + filterTarget: true, + content() { target.draw(); - target.addSkill('hsmengjing_mengye'); + target.addSkill("hsmengjing_mengye"); + }, + ai: { + order: 1, + useful: 5, + value: 10, + result: { + target(player, target) { + if (target.hasSkill("hsmengjing_mengye")) return 0.5; + return -target.countCards("he"); + }, + }, }, - ai:{ - order:1, - useful:5, - value:10, - result:{ - target(player,target){ - if(target.hasSkill('hsmengjing_mengye')) return 0.5; - return -target.countCards('he'); - } - } - } }, - hsmengjing_mengjing:{ - type:'hsmengjing', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_ysera', - filterTarget(card,player,target){ - return !target.hasJudge('lebu')||target.countCards('e')>0; + hsmengjing_mengjing: { + type: "hsmengjing", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_ysera", + filterTarget(card, player, target) { + return !target.hasJudge("lebu") || target.countCards("e") > 0; }, - content(){ - 'step 0' - var es=target.getCards('e'); - if(es.length){ - target.gain(es,'gain2'); + content() { + "step 0"; + var es = target.getCards("e"); + if (es.length) { + target.gain(es, "gain2"); } - 'step 1' - if(!target.hasJudge('lebu')){ - target.addJudge(game.createCard('lebu')); + ("step 1"); + if (!target.hasJudge("lebu")) { + target.addJudge(game.createCard("lebu")); } }, - ai:{ - order:2, - useful:5, - value:10, - result:{ - target(player,target){ - var num=target.hp-target.countCards('he')-2; - if(num>-1) return -1; - if(target.hp<3) num--; - if(target.hp<2) num--; - if(target.hp<1) num--; + ai: { + order: 2, + useful: 5, + value: 10, + result: { + target(player, target) { + var num = target.hp - target.countCards("he") - 2; + if (num > -1) return -1; + if (target.hp < 3) num--; + if (target.hp < 2) num--; + if (target.hp < 1) num--; return num; - } - } - } - }, - hsmengjing_huanxiaojiemei:{ - type:'hsmengjing', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_ysera', - filterTarget(card,player,target){ - return target.hp1&&get.threaten(target)<=1.2){ + } else if (target.countCards("h") > 1 && get.threaten(target) <= 1.2) { return 1; } - } - } - } + }, + }, + }, }, - hszuzhou_wushushike:{ - type:'hszuzhou', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_hajiasha', - filterTarget:true, - selectTarget:-1, - multitarget:true, - multiline:true, - content(){ - 'step 0' - event.targets=game.filterPlayer().sortBySeat(); - 'step 1' - if(event.targets.length){ - event.current=event.targets.shift(); - var cards=event.current.getCards('h','shan'); - if(cards.length){ - event.current.lose(cards)._triggered=null; + hszuzhou_wushushike: { + type: "hszuzhou", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_hajiasha", + filterTarget: true, + selectTarget: -1, + multitarget: true, + multiline: true, + content() { + "step 0"; + event.targets = game.filterPlayer().sortBySeat(); + ("step 1"); + if (event.targets.length) { + event.current = event.targets.shift(); + var cards = event.current.getCards("h", "shan"); + if (cards.length) { + event.current.lose(cards)._triggered = null; } - event.num=cards.length; - } - else{ + event.num = cards.length; + } else { event.finish(); } - 'step 2' - var cards=[]; - for(var i=0;i0; - })){ + ai: { + order: 4, + value: 6, + result: { + player(player) { + if ( + !player.hasSha() && + player.countCards("h", "shan") && + game.hasPlayer(function (current) { + return ( + player.canUse("sha", current, true, true) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) { return 1; } return 0; - } - } - } - }, - hszuzhou_guhuo:{ - type:'hszuzhou', - fullimage:true, - vanish:true, - enable:true, - derivation:'hs_hajiasha', - filterTarget(card,player,target){ - return target!=player&&target.countCards('he'); + }, + }, }, - content(){ - 'step 0' - target.chooseCard('he',true); - 'step 1' - if(result.bool){ - target.give(result.cards,player); + }, + hszuzhou_guhuo: { + type: "hszuzhou", + fullimage: true, + vanish: true, + enable: true, + derivation: "hs_hajiasha", + filterTarget(card, player, target) { + return target != player && target.countCards("he"); + }, + content() { + "step 0"; + target.chooseCard("he", true); + ("step 1"); + if (result.bool) { + target.give(result.cards, player); } }, - ai:{ - order:8.6, - value:8, - result:{ - target(player,target){ - return -1/Math.sqrt(1+target.countCards('he')); - } - } - } + ai: { + order: 8.6, + value: 8, + result: { + target(player, target) { + return -1 / Math.sqrt(1 + target.countCards("he")); + }, + }, + }, }, - tuteng1:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng1: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, - tuteng2:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng2: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, - tuteng3:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng3: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, - tuteng4:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng4: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, - tuteng5:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng5: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, - tuteng6:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng6: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, - tuteng7:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng7: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, - tuteng8:{ - noname:true, - fullimage:true, - type:'hstuteng', - derivation:'hs_sthrall', - gainable:false + tuteng8: { + noname: true, + fullimage: true, + type: "hstuteng", + derivation: "hs_sthrall", + gainable: false, }, }, - translate:{ - hs_alleria:'奥蕾莉亚', - hs_magni:'麦格尼', - hs_medivh:'麦迪文', - hs_jaina:'吉安娜', - hs_lrexxar:'雷克萨', - hs_wuther:'乌瑟尔', - hs_jgarrosh:'加尔鲁什', - hs_malfurion:'玛法里奥', - hs_guldan:'古尔丹', - hs_anduin:'安度因', - hs_sthrall:'萨尔', - hs_waleera:'瓦莉拉', - hs_liadrin:'莉亚德琳', - hs_morgl:'摩戈尔', + translate: { + hs_alleria: "奥蕾莉亚", + hs_magni: "麦格尼", + hs_medivh: "麦迪文", + hs_jaina: "吉安娜", + hs_lrexxar: "雷克萨", + hs_wuther: "乌瑟尔", + hs_jgarrosh: "加尔鲁什", + hs_malfurion: "玛法里奥", + hs_guldan: "古尔丹", + hs_anduin: "安度因", + hs_sthrall: "萨尔", + hs_waleera: "瓦莉拉", + hs_liadrin: "莉亚德琳", + hs_morgl: "摩戈尔", - hs_neptulon:'耐普图隆', - hs_wvelen:'维纶', - hs_antonidas:'安东尼达斯', - hs_alakir:'奥拉基尔', - hs_zhouzhuo:'周卓', - hs_yngvar:'伊戈瓦尔', - hs_bchillmaw:'冰喉', - hs_malorne:'玛洛恩', - hs_xsylvanas:'希尔瓦娜斯', - hs_siwangzhiyi:'死亡之翼', - hs_malygos:'玛里苟斯', - hs_xuefashi:'血法师', - hs_ysera:'伊瑟拉', - hs_alextrasza:'阿莱克斯塔', - hs_trueheart:'图哈特', - hs_nozdormu:'诺兹多姆', - hs_loatheb:'洛欧塞布', - hs_jiaziruila:'加兹瑞拉', - hs_sainaliusi:'塞纳留斯', - hs_bolvar:'伯瓦尔', - hs_lrhonin:'罗宁', - hs_fuding:'弗丁', - hs_aedwin:'艾德温', - hs_lafamu:'拉法姆', - hs_yelise:'伊莉斯', - hs_lreno:'雷诺', - hs_finley:'芬利', - hs_brann:'布莱恩', - hs_kcthun:'克苏恩', - hs_anomalus:'阿诺玛鲁斯', - hs_blingtron:'布林顿', - hs_fandral:'范达尔', - hs_hallazeal:'海纳泽尔', - hs_enzoth:'恩佐斯', - hs_walian:'瓦里安', - hs_pengpeng:'砰砰博士', - hs_aya:'艾雅', - hs_pyros:'派洛斯', - hs_jiawodun:'嘉沃顿', - hs_laila:'莱拉', - hs_selajin:'瑟拉金', - hs_bannabusi:'班纳布斯', - hs_amala:'阿玛拉', - hs_nuogefu:'诺格弗', - hs_kazhakusi:'卡扎库斯', - hs_lazi:'拉兹', - hs_shaku:'沙库尔', - hs_laxiao:'拉希奥', - hs_yashaji:'亚煞极', - hs_khadgar:'卡德加', - hs_tyrande:'泰兰德', - hs_fenjie:'芬杰', - hs_kalimosi:'卡利莫斯', - hs_yogg:'尤格萨隆', - hs_xialikeer:'夏克里尔', - hs_wolazi:'沃拉兹', - hs_tanghangu:'唐·汉古', - hs_barnes:'巴内斯', - hs_kchromaggus:'克洛玛古斯', - hs_kaituozhe:'开拓者', + hs_neptulon: "耐普图隆", + hs_wvelen: "维纶", + hs_antonidas: "安东尼达斯", + hs_alakir: "奥拉基尔", + hs_zhouzhuo: "周卓", + hs_yngvar: "伊戈瓦尔", + hs_bchillmaw: "冰喉", + hs_malorne: "玛洛恩", + hs_xsylvanas: "希尔瓦娜斯", + hs_siwangzhiyi: "死亡之翼", + hs_malygos: "玛里苟斯", + hs_xuefashi: "血法师", + hs_ysera: "伊瑟拉", + hs_alextrasza: "阿莱克斯塔", + hs_trueheart: "图哈特", + hs_nozdormu: "诺兹多姆", + hs_loatheb: "洛欧塞布", + hs_jiaziruila: "加兹瑞拉", + hs_sainaliusi: "塞纳留斯", + hs_bolvar: "伯瓦尔", + hs_lrhonin: "罗宁", + hs_fuding: "弗丁", + hs_aedwin: "艾德温", + hs_lafamu: "拉法姆", + hs_yelise: "伊莉斯", + hs_lreno: "雷诺", + hs_finley: "芬利", + hs_brann: "布莱恩", + hs_kcthun: "克苏恩", + hs_anomalus: "阿诺玛鲁斯", + hs_blingtron: "布林顿", + hs_fandral: "范达尔", + hs_hallazeal: "海纳泽尔", + hs_enzoth: "恩佐斯", + hs_walian: "瓦里安", + hs_pengpeng: "砰砰博士", + hs_aya: "艾雅", + hs_pyros: "派洛斯", + hs_jiawodun: "嘉沃顿", + hs_laila: "莱拉", + hs_selajin: "瑟拉金", + hs_bannabusi: "班纳布斯", + hs_amala: "阿玛拉", + hs_nuogefu: "诺格弗", + hs_kazhakusi: "卡扎库斯", + hs_lazi: "拉兹", + hs_shaku: "沙库尔", + hs_laxiao: "拉希奥", + hs_yashaji: "亚煞极", + hs_khadgar: "卡德加", + hs_tyrande: "泰兰德", + hs_fenjie: "芬杰", + hs_kalimosi: "卡利莫斯", + hs_yogg: "尤格萨隆", + hs_xialikeer: "夏克里尔", + hs_wolazi: "沃拉兹", + hs_tanghangu: "唐·汉古", + hs_barnes: "巴内斯", + hs_kchromaggus: "克洛玛古斯", + hs_kaituozhe: "开拓者", - hs_yelinlonghou:'夜鳞龙后', - hs_yelinchulong:'雏龙', - hs_ronghejuren:'熔核巨人', - hs_shanlingjuren:'山岭巨人', - hs_mijiaojisi:'秘教祭司', - hs_huzhixiannv:'湖之仙女', - hs_totemic:'图腾师', - hs_bilanyoulong:'碧蓝幼龙', - hs_zhishigushu:'知识古树', - hs_zhanzhenggushu:'战争古树', - hs_jinglinglong:'精灵龙', - hs_sapphiron:'萨菲隆', - hs_xuanzhuanjijia:'旋转机甲', - hs_ruanniguai:'软泥怪', - hs_hudunren:'护盾机甲', - hs_nate:'纳特', - hs_shifazhe:'嗜法者', - hs_xiangyaqishi:'象牙骑士', - hs_wujiyuansu:'无羁元素', - hs_mojinbaozi:'魔晶孢子', - hs_shuiwenxuejia:'水文学家', - hs_shizugui:'始祖龟', - hs_hemite:'赫米特', - hs_yinggencao:'萤根草', - hs_zhihuanhua:'致幻花', - hs_shirencao:'食人草', - hs_fachaotuteng:'法潮图腾', - hs_huolituteng:'活力图腾', - hs_manyututeng:'蛮鱼图腾', - hs_tgolem:'图腾魔像', - hs_heifengqishi:'黑锋骑士', - hs_yuhuozhe:'浴火者', - hs_wuyaowang:'巫妖王', - hs_aerfusi:'阿尔福斯', - hs_baiguyoulong:'白骨幼龙', - hs_yangyanwageli:'阳焰瓦格里', - hs_aiqinvyao:'哀泣女妖', - hs_ashamoer:'阿莎摩尔', - hs_fengjianhuanfengzhe:'风剪唤风者', - hs_taisi:'苔丝', - hs_hajiasha:'哈加莎', - hs_tuoqi:'托奇', - hs_siwangxianzhi:'死亡先知', - hs_xukongzhiying:'虚空之影', - hs_duyaxinshi:'渡鸦信使', + hs_yelinlonghou: "夜鳞龙后", + hs_yelinchulong: "雏龙", + hs_ronghejuren: "熔核巨人", + hs_shanlingjuren: "山岭巨人", + hs_mijiaojisi: "秘教祭司", + hs_huzhixiannv: "湖之仙女", + hs_totemic: "图腾师", + hs_bilanyoulong: "碧蓝幼龙", + hs_zhishigushu: "知识古树", + hs_zhanzhenggushu: "战争古树", + hs_jinglinglong: "精灵龙", + hs_sapphiron: "萨菲隆", + hs_xuanzhuanjijia: "旋转机甲", + hs_ruanniguai: "软泥怪", + hs_hudunren: "护盾机甲", + hs_nate: "纳特", + hs_shifazhe: "嗜法者", + hs_xiangyaqishi: "象牙骑士", + hs_wujiyuansu: "无羁元素", + hs_mojinbaozi: "魔晶孢子", + hs_shuiwenxuejia: "水文学家", + hs_shizugui: "始祖龟", + hs_hemite: "赫米特", + hs_yinggencao: "萤根草", + hs_zhihuanhua: "致幻花", + hs_shirencao: "食人草", + hs_fachaotuteng: "法潮图腾", + hs_huolituteng: "活力图腾", + hs_manyututeng: "蛮鱼图腾", + hs_tgolem: "图腾魔像", + hs_heifengqishi: "黑锋骑士", + hs_yuhuozhe: "浴火者", + hs_wuyaowang: "巫妖王", + hs_aerfusi: "阿尔福斯", + hs_baiguyoulong: "白骨幼龙", + hs_yangyanwageli: "阳焰瓦格里", + hs_aiqinvyao: "哀泣女妖", + hs_ashamoer: "阿莎摩尔", + hs_fengjianhuanfengzhe: "风剪唤风者", + hs_taisi: "苔丝", + hs_hajiasha: "哈加莎", + hs_tuoqi: "托奇", + hs_siwangxianzhi: "死亡先知", + hs_xukongzhiying: "虚空之影", + hs_duyaxinshi: "渡鸦信使", - hshuanyu:'幻羽', - hshuanyu_info:'每当你受到一次伤害,你获得发现一张炉石衍生牌。', - hsfashu:'法术', - hsfashu_anyingjingxiang:'暗影镜像', - hsfashu_anyingjingxiang_info:'当你使用或打出一张牌后,暗影镜像变为该牌的复制。', - hsfashu_buwendingyibian:'不稳定异变', - hsfashu_buwendingyibian_info:'出牌阶段对一名角色使用,目标将一张手牌重铸为同类别的牌,本回合可重复使用此牌,最多使用X次,X为当前体力值。', - hualing:'化灵', - hualing_info:'每三轮限一次,你可以选择一名其他角色,获得其一项技能,然后将其随机变形为一名强度高一级的武将。', - yibian:'异变', - yibian_info:'锁定技,出牌阶段开始时,若你没有不稳定异变,则将一张不稳定异变置于你的手牌。', - wxuying:'虚影', - wxuying_info:'锁定技,准备阶段,你移去手牌中的暗影镜像,然后获得一张暗影镜像(当你使用或打出一张牌后,暗影镜像变为该牌的复制);当你回合内使用暗影镜像时,你摸一张牌;当你回合外使用暗影镜像时,你获得潜行直到下一回合开始。', - zhoujiang:'咒降', - zhoujiang_info:'锁定技,每当你使用一张普通锦囊牌,你将一张随机“诅咒”牌置于你的手牌。', - muyin:'暮隐', - muyin_info:'锁定技,每当你失去最后一张手牌,你获得潜行直到下一回合开始。', - tqchuanyue:'穿越', - tqchuanyue_info:'锁定技,准备阶段开始时,你随机选择一个被削弱过的炉石技能,获得其未削弱的版本,替换上一个以此法获得的技能。', + hshuanyu: "幻羽", + hshuanyu_info: "每当你受到一次伤害,你获得发现一张炉石衍生牌。", + hsfashu: "法术", + hsfashu_anyingjingxiang: "暗影镜像", + hsfashu_anyingjingxiang_info: "当你使用或打出一张牌后,暗影镜像变为该牌的复制。", + hsfashu_buwendingyibian: "不稳定异变", + hsfashu_buwendingyibian_info: + "出牌阶段对一名角色使用,目标将一张手牌重铸为同类别的牌,本回合可重复使用此牌,最多使用X次,X为当前体力值。", + hualing: "化灵", + hualing_info: + "每三轮限一次,你可以选择一名其他角色,获得其一项技能,然后将其随机变形为一名强度高一级的武将。", + yibian: "异变", + yibian_info: "锁定技,出牌阶段开始时,若你没有不稳定异变,则将一张不稳定异变置于你的手牌。", + wxuying: "虚影", + wxuying_info: + "锁定技,准备阶段,你移去手牌中的暗影镜像,然后获得一张暗影镜像(当你使用或打出一张牌后,暗影镜像变为该牌的复制);当你回合内使用暗影镜像时,你摸一张牌;当你回合外使用暗影镜像时,你获得潜行直到下一回合开始。", + zhoujiang: "咒降", + zhoujiang_info: "锁定技,每当你使用一张普通锦囊牌,你将一张随机“诅咒”牌置于你的手牌。", + muyin: "暮隐", + muyin_info: "锁定技,每当你失去最后一张手牌,你获得潜行直到下一回合开始。", + tqchuanyue: "穿越", + tqchuanyue_info: + "锁定技,准备阶段开始时,你随机选择一个被削弱过的炉石技能,获得其未削弱的版本,替换上一个以此法获得的技能。", // hsxiujian:'袖箭', // hsxiujian_info:'锁定技,在你对一名敌方角色使用一张锦囊牌后,你视为对其使用一张杀。', // hsyingzong:'影踪', // hsyingzong_info:'', - hsxingyi:'星移', - hsxingyi_info:'锁定技,每当一名敌方角色于回合内使用主动技能,你获得此技能直到下一回合结束。', + hsxingyi: "星移", + hsxingyi_info: "锁定技,每当一名敌方角色于回合内使用主动技能,你获得此技能直到下一回合结束。", - hshuanling:'幻灵', - hshuanling_bg:'灵', - hshuanling_info:'结束阶段,你可以弃置至多X张牌(X为你装备区内的牌数且至少为1)并摸等量的牌,每弃置一张牌,你随机使用一张本局敌方角色使用过的单目标非转化普通锦囊牌,随机指定一个具有正收益的角色为目标。', + hshuanling: "幻灵", + hshuanling_bg: "灵", + hshuanling_info: + "结束阶段,你可以弃置至多X张牌(X为你装备区内的牌数且至少为1)并摸等量的牌,每弃置一张牌,你随机使用一张本局敌方角色使用过的单目标非转化普通锦囊牌,随机指定一个具有正收益的角色为目标。", // hshuanling_info:'锁定技,当你于回合内使用首张指定其他角色为惟一目标的锦囊牌后,你视为对其随机使用一张锦囊牌(此牌对你有正面效果)。', // hshuanling_info:'每当你使用一张基本牌或普通锦囊牌,你可以弃置任意张牌令其增加或减少等量的目标。', - huanfeng:'唤风', - huanfeng_info:'锁定技,准备阶段,若你有4个图腾,你失去所有图腾,然后获得并召唤随从奥拉基尔。', - asyouzhang:'幽瘴', - asyouzhang_info:'结束阶段,若你的手牌中没有基本牌/锦囊牌/装备牌,你可以获得牌堆顶的一张基本牌/锦囊牌/装备牌,并可以立即使用。', - ylyuchu:'育雏', - ylyuchu_info:'锁定技,每当你回复1点体力,你获得一只雏龙随从(不超过3只);结束阶段,你每有一只雏龙,便随机选择一名其他角色,在该角色的下个回合开始前你切换至该雏龙,然后在此回合结束后进行一个额外回合并切换回本体。', - nsaiqi:'哀泣', - nsaiqi_info:'锁定技,每当你使用一张牌,你移除牌堆顶的三张牌;你的手牌上限始终+1。', - nsbeiming:'悲鸣', - nsbeiming_info:'锁定技,当你移除的牌不少于9张时,你摸一张牌,然后将移除的牌以任意顺序置于牌堆顶;当被移除过的牌在牌堆顶时(洗牌后重置),你的不能发动【哀泣】移除牌。', - hstianqi_dalian:'达里安', - hstianqi_dalian_info:'每当你造成一次伤害,你回复等量的体力。', - hstianqi_shali:'莎莉', - hstianqi_shali_info:'每当你回复体力,你获得等量的护甲。', - hstianqi_nazigelin:'纳兹戈林', - hstianqi_nazigelin_info:'当你装备此牌时,你获得1点护甲。', - hstianqi_suolasi:'索拉斯', - hstianqi_suolasi_info:'当你失去此牌时,你回复1点体力。', - hschaoxi:'潮袭', - hschaoxi_info:'锁定技,每当你造成一次伤害,你获得两张随机鱼人牌。', - hsnitai:'拟态', - hsnitai_info:'锁定技,出牌阶段开始时,你获得一张随机炉石角色的技能牌。', - hstianqi:'天启', - hstianqi_info:'出牌阶段限一次,你可以选择一项:弃置一张手牌并随机装备一件天启骑士(不能替换现有装备),或弃置一张装备区内的牌并摸两张牌;当你以此法弃置天启骑士时,若你武将牌上没有对应的天启骑士,你将其置于你的武将牌上;准备阶段,若你的武将牌上有4张天启骑士,你获得游戏胜利。', - hspuzhao:'普照', - hspuzhao_info:'出牌阶段限一次,你可以弃置一张红桃牌,然后令至多三名随机友方角色各摸一张牌(若你无其他队友,改为摸两张牌)。', - hsyanxin:'炎心', - hsyanxin_info:'锁定技,在你摸牌时,若牌堆中有红色牌,你摸到的首张牌必为红色。', - ysjqisha:'七煞', - ysjqisha_ju:'惧之煞', - ysjqisha_kuang:'狂之煞', - ysjqisha_nu:'怒之煞', - ysjqisha_yi:'疑之煞', - ysjqisha_wang:'惘之煞', - ysjqisha_hen:'恨之煞', - ysjqisha_ao:'傲之煞', - ysjqisha_info:'锁定技,每当你造成或受到伤害,你令对方随机获得一种消极状态直到下一回合结束。', - zhaochao:'招潮', - zhaochao_info:'锁定技,结束阶段,你视为对一名随机敌人使用一张杀;若此杀被闪避,你视为对另一名随机敌人使用一张杀。', - hllingxi:'灵息', - hllingxi_info:'出牌阶段,你可以令一名已受伤的其他角色弃置两张牌并回复1点体力(同阶段对一名角色限用一次);结束阶段,你可以回复1点体力。', - xiyong:'汐涌', - xiyong_info:'结束阶段,你可以摸一张牌并可以使用之,若你使用了此牌,你再摸一张牌。', - hsjixie:'机械', - hsjixie_zhadan:'炸弹机器人', - hsjixie_zhadan_pop:'炸弹', - hsjixie_zhadan_info:'出牌阶段对自己使用,对一名随机敌人造成1点火属性伤害。', - yindan:'引弹', - yindan_info:'出牌阶段限一次,你可以弃置一张黑桃牌并失去1点体力,然后获得两张炸弹机器人。', - huanjue:'幻觉', - huanjue_info:'每当你使用一张牌,若此牌指定了惟一目标,你可以发现一张牌,然后可以代替此牌结算。', - oldhuanjue:'幻觉', - oldhuanjue_info:'每回合限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。', - zhziwu:'紫雾', - zhziwu_info:'每当你于回合外失去牌,你可以令当前回合角色不能使用杀直到回合结束。', - huanjue_info_old:'每名角色的回合限一次,当你使用卡牌指定其他角色为惟一目标,或当其他角色使用卡牌指定你为惟一目标时,你可以发现一张牌代替此牌,然后该牌的使用者在结算后摸一张牌。', - yinzong:'影踪', - yinzong_info:'锁定技,每当你失去装备区内的牌,你获得一张闪。', - tansuo:'探索', - tansuo_info:'出牌阶段限一次,你可以弃置一张牌,然后发现一张炉石衍生牌。', - srjici:'棘刺', - srjici_info:'锁定技,每当你造成一次伤害,你摸一张牌,受伤害角色随机弃置一张牌。', - lieqi:'猎奇', - lieqi_info:'准备和结束阶段,你可以指定一名角色,从一张该角色手牌与另外两张随机牌中猜测哪张为该角色手牌,若猜中,你获得一张该牌的复制(同一回合不能指定相同角色)。', - azaowu:'造物', - azaowu_backup:'造物', - azaowu_info:'出牌阶段限一次,你可以将一张基本牌当作任意一张基本牌使用。', - shouwang:'守望', - shouwang2:'守望', - shouwang_info:'每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力并获得1点护甲。', - shouwang_info_alter:'每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力。', - qingtian:'擎天', - qingtian_info:'锁定技,若你的体力值为全场最多,你受到的伤害始终+1。', - qianfu:'潜伏', - qianfu2:'潜伏', - qianfu2_bg:'伏', - qianfu_info:'锁定技,在你死亡前,若你没有进入潜伏状态,你弃置所有牌并进入潜伏状态;当你体力值回复到3(或体力上限)时,你解除潜伏状态并摸三张牌。', - shimo:'尸魔', - shimo_info:'锁定技,距离你为1的角色受到伤害时,你回复1点体力,若你没受伤,改为摸一张牌。', - lieyang:'裂阳', - lieyang_info:'锁定技,每当你于回合内使用一张锦囊牌,你获得一张随机锦囊牌;当你发动三次此技能后,你本回合不能再使用锦囊牌。', - zhuilie:'追猎', - zhuilie_info:'准备阶段,你可以弃置一张牌,然后将牌堆顶六张牌中的基本牌移至弃牌堆;若移入弃牌堆的牌超过三张,你摸一张牌。', - szbianshen:'变身', - szbianshen_info:'限定技,回合开始时,若游戏轮数不少于3,你可以随机观看5张体力上限不小于5的武将牌,将武将牌替换为其中一张。', - kekao:'科考', - kekao_info:'结束阶段,你可以发现一张延时锦囊牌。', - jinhua:'进化', - jinhua_info:'锁定技,每当你以自己为目标使用一张非转化的锦囊牌,你发现一个技能并获得之。', - hsqizhou:'祈咒', - hsqizhou_feng:'风之祈咒', - hsqizhou_feng_info:'出牌阶段对自己使用,令所有目标的敌人打出一张杀或受到1点雷属性伤害。', - hsqizhou_shui:'水之祈咒', - hsqizhou_shui_info:'出牌阶段对自己使用,回复2点体力。', - hsqizhou_huo:'火之祈咒', - hsqizhou_huo_info:'出牌阶段对任意角色使用,令目标受到1点火属性伤害。', - hsqizhou_tu:'土之祈咒', - hsqizhou_tu_info:'出牌阶段对任意其他角色使用,令目标获得1点护甲。', - kqizhou:'祈咒', - kqizhou_info:'准备阶段,若你于上回合使用过锦囊牌,则可以获得一张元素祈咒。', - jingcu:'晶簇', - jingcu_info:'出牌阶段,你可以减少1点体力上限并摸两张牌。', - shengzhang:'生长', - shengzhang_info:'锁定技,若你于弃牌阶段弃置了牌,你增加1点体力上限。', - pyuhuo:'浴火', - pyuhuo_info:'锁定技,在你首次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为4并摸四张牌;在你第二次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为6并摸六张牌。', - mengye:'梦魇', - mengye_info:'结束阶段,你可以选择一名有手牌的角色将其一张随机的非毒手牌转化为毒,然后令其获得1点护甲。', - mengye_old:'梦魇', - mengye_old2:'梦魇', - mengye_old_info:'回合结束后,你可以翻面并指定一名的非主公角色,由你控制其进行一个额外的回合。在此回合中,你的本体不参与游戏。', - fuhua:'腐化', - fuhua2:'腐化', - fuhua_info:'出牌阶段,你可以将一张毒交给一名没有魔血技能的其他角色,该角色选择一项:1. 获得技能魔血,此后每个结束阶段需交给你一张手牌;2. 视为你对其使用一张决斗。', - moxie:'魔血', - moxie_info:'锁定技,当你因【毒】失去体力时,你改为摸两张牌;结束阶段,你将一张随机手牌转化为毒。', - gfuhun:'附魂', - gfuhun_info:'结束阶段,若你未翻面,你可以和一名其他角色拼点,若你赢,你将武将牌翻至背面,该角色进入混乱状态直到下一回合结束。', - hlongyi:'龙裔', - hlongyi_info:'锁定技,你的黑色牌不占用手牌上限。', - zhongji:'重击', - zhongji_info:'每当你即将造成伤害,可弃置一张黑色手牌令伤害+1。', - fuwen:'符文', - fuwen_info:'若你弃牌阶段弃置了锦囊牌,你可以获得1点护甲。', - jinzhou:'禁咒', - jinzhou_info:'结束阶段,若你手牌中有黑桃牌,你可以令一名其他角色的非锁定技失效直到其下一回合结束。', - midian:'秘典', - midian_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后随机获得三张锦囊牌。', - yuelu:'月露', - yuelu_info:'在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力并获得1点护甲。', - yuelu_info_alter:'在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力。', - xingluo:'星落', - xingluo_info:'准备阶段,你可以令任意名手牌数多于你的角色各弃置一张手牌,然后你可以从弃置的牌中选择一张加入手牌。', - yushou:'御兽', - yushou_info:'出牌阶段,你可以弃置一张牌并召唤一个随机的野兽宠物,回合开始阶段,你随机失去一个宠物。', - yushou_misha:'米莎', - yushou_misha_info:'每当你受到一次伤害,你获得1点护甲。', - yushou_huofu:'霍弗', - yushou_huofu_info:'你可以将一张黑色牌当作决斗使用。', - yushou_leiouke:'雷欧克', - yushou_leiouke_info:'你每回合造成的首次伤害+1。', - hsqingyu_hufu:'青玉护符', - hsqingyu_hufu_info:'令一名角色获得1点护甲。', - hsqingyu_zhao:'青玉之爪', - hsqingyu_zhao_info:'当你装备此装备时,摸一张牌。', - hsqingyu_feibiao:'青玉飞镖', - hsqingyu_feibiao_info:'弃置一名角色的一张随机手牌和一张随机装备牌。', - hsqingyu_shandian:'青玉闪电', - hsqingyu_shandian_info:'对一名角色造成1点雷电伤害。', - hsqingyu_zhanfang:'青玉绽放', - hsqingyu_zhanfang_info:'令一名角色增加1点体力上限并摸一张牌。', - ayuling:'玉灵', - ayuling_info:'每当你受到一次伤害,你可以获得一张随机青玉牌。', - qingzun:'青樽', - qingzun_info:'本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用两张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用六张青玉牌后,你可以于结束阶段摸一张牌。', - qingzun_info_alter:'本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用三张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用九张青玉牌后,你可以于结束阶段摸一张牌。', - lianjin:'炼金', - lianjin_info:'出牌阶段限一次,你可以弃置一张牌并获得一张由三张随机牌组成的药水;当你因弃置而失去药水牌时,你随机获得药水的组成卡牌之一。', - shouji:'收集', - shouji_info:'每当你使用一张杀,你可以获得一张目标随机手牌的复制;每当你的杀被闪避,你可以获得一张目标随机非特殊装备牌的复制;每回合限各限一次。', - hsguimou:'鬼谋', - hsguimou_info:'每当你受到一次伤害,你可以获得伤害来源的一张手牌,若此牌是黑色,你展示此牌并重复此过程。', - yingxi:'影袭', - yingxi_info:'结束阶段,若你本回合未造成伤害,你可以将一张黑色牌当作杀对任意一名角色使用,若目标未受到伤害,此杀不可闪避。', - peiyu:'培育', - peiyu_info:'准备阶段,你可以令一名没有图腾的角色获得一个随机图腾直到其首次受到伤害。', - peiyu_old_info:'出牌阶段,你可以弃置一张牌令一名没有图腾的角色获得一个随机图腾,或令一名有图腾的角色替换一个图腾;你死亡时,其他角色失去以此法获得的图腾。', - wzhanyi:'战意', - wzhanyi_info:'你可以跳过出牌阶段,改为摸三张牌并展示之,将摸到的装备牌置于装备区,然后可以使用手牌中的杀。', - shengteng:'升腾', - shengteng_info:'锁定技,每当你使用锦囊牌造成伤害,你增加1点体力上限并回复1点体力。', - yuansu:'寂灭', - yuansu_info:'出牌阶段限一次,若你已损失的体力值不少于3,你可以将体力上限降至与体力值相同,视为使用一张元素毁灭。', - nuyan:'怒焰', - nuyan2:'怒焰', - nuyan_backup:'怒焰', - nuyan_info:'出牌阶段限一次,你可以将一张红色牌当作任意一张能造成伤害的牌使用(不得是你本局以此法使用过的牌)。', - nuyan2_info:'出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。', - chouhuo:'仇火', - chouhuo_info:'觉醒技,出牌阶段开始时,若你的怒焰技能已将可用的牌用完,你失去1点体力上限,获得2点护甲,然后将怒焰的描述改为“出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。', - hsdusu:'毒素', - hsdusu_xueji:'血蓟', - hsdusu_xueji_info:'随机弃置一名角色的2张装备牌。', - hsdusu_shinancao:'石楠草', - hsdusu_shinancao_info:'令一名角色下一次造成的伤害+1。', - hsdusu_kuyecao:'枯叶草', - hsdusu_kuyecao_info:'令一名角色获得技能潜行,直到其下一回合开始。', - hsdusu_huoyanhua:'火焰花', - hsdusu_huoyanhua_info:'对攻击范围内的一名角色造成1点火焰伤害。', - hsdusu_huangxuecao:'皇血草', - hsdusu_huangxuecao_info:'摸两张牌。', - duxin:'毒心', - duxin_info:'准备阶段和结束阶段,若你的手中没有毒素牌,你可以获得一张随机毒素牌。', - oldduxin:'毒心', - oldduxin_info:'准备阶段和结束阶段,你可以获得一张随机毒素牌。', - hstuteng:'图腾', - kuangluan:'狂乱', - kuangluan2:'狂乱', + huanfeng: "唤风", + huanfeng_info: "锁定技,准备阶段,若你有4个图腾,你失去所有图腾,然后获得并召唤随从奥拉基尔。", + asyouzhang: "幽瘴", + asyouzhang_info: + "结束阶段,若你的手牌中没有基本牌/锦囊牌/装备牌,你可以获得牌堆顶的一张基本牌/锦囊牌/装备牌,并可以立即使用。", + ylyuchu: "育雏", + ylyuchu_info: + "锁定技,每当你回复1点体力,你获得一只雏龙随从(不超过3只);结束阶段,你每有一只雏龙,便随机选择一名其他角色,在该角色的下个回合开始前你切换至该雏龙,然后在此回合结束后进行一个额外回合并切换回本体。", + nsaiqi: "哀泣", + nsaiqi_info: "锁定技,每当你使用一张牌,你移除牌堆顶的三张牌;你的手牌上限始终+1。", + nsbeiming: "悲鸣", + nsbeiming_info: + "锁定技,当你移除的牌不少于9张时,你摸一张牌,然后将移除的牌以任意顺序置于牌堆顶;当被移除过的牌在牌堆顶时(洗牌后重置),你的不能发动【哀泣】移除牌。", + hstianqi_dalian: "达里安", + hstianqi_dalian_info: "每当你造成一次伤害,你回复等量的体力。", + hstianqi_shali: "莎莉", + hstianqi_shali_info: "每当你回复体力,你获得等量的护甲。", + hstianqi_nazigelin: "纳兹戈林", + hstianqi_nazigelin_info: "当你装备此牌时,你获得1点护甲。", + hstianqi_suolasi: "索拉斯", + hstianqi_suolasi_info: "当你失去此牌时,你回复1点体力。", + hschaoxi: "潮袭", + hschaoxi_info: "锁定技,每当你造成一次伤害,你获得两张随机鱼人牌。", + hsnitai: "拟态", + hsnitai_info: "锁定技,出牌阶段开始时,你获得一张随机炉石角色的技能牌。", + hstianqi: "天启", + hstianqi_info: + "出牌阶段限一次,你可以选择一项:弃置一张手牌并随机装备一件天启骑士(不能替换现有装备),或弃置一张装备区内的牌并摸两张牌;当你以此法弃置天启骑士时,若你武将牌上没有对应的天启骑士,你将其置于你的武将牌上;准备阶段,若你的武将牌上有4张天启骑士,你获得游戏胜利。", + hspuzhao: "普照", + hspuzhao_info: + "出牌阶段限一次,你可以弃置一张红桃牌,然后令至多三名随机友方角色各摸一张牌(若你无其他队友,改为摸两张牌)。", + hsyanxin: "炎心", + hsyanxin_info: "锁定技,在你摸牌时,若牌堆中有红色牌,你摸到的首张牌必为红色。", + ysjqisha: "七煞", + ysjqisha_ju: "惧之煞", + ysjqisha_kuang: "狂之煞", + ysjqisha_nu: "怒之煞", + ysjqisha_yi: "疑之煞", + ysjqisha_wang: "惘之煞", + ysjqisha_hen: "恨之煞", + ysjqisha_ao: "傲之煞", + ysjqisha_info: "锁定技,每当你造成或受到伤害,你令对方随机获得一种消极状态直到下一回合结束。", + zhaochao: "招潮", + zhaochao_info: + "锁定技,结束阶段,你视为对一名随机敌人使用一张杀;若此杀被闪避,你视为对另一名随机敌人使用一张杀。", + hllingxi: "灵息", + hllingxi_info: + "出牌阶段,你可以令一名已受伤的其他角色弃置两张牌并回复1点体力(同阶段对一名角色限用一次);结束阶段,你可以回复1点体力。", + xiyong: "汐涌", + xiyong_info: "结束阶段,你可以摸一张牌并可以使用之,若你使用了此牌,你再摸一张牌。", + hsjixie: "机械", + hsjixie_zhadan: "炸弹机器人", + hsjixie_zhadan_pop: "炸弹", + hsjixie_zhadan_info: "出牌阶段对自己使用,对一名随机敌人造成1点火属性伤害。", + yindan: "引弹", + yindan_info: "出牌阶段限一次,你可以弃置一张黑桃牌并失去1点体力,然后获得两张炸弹机器人。", + huanjue: "幻觉", + huanjue_info: "每当你使用一张牌,若此牌指定了惟一目标,你可以发现一张牌,然后可以代替此牌结算。", + oldhuanjue: "幻觉", + oldhuanjue_info: "每回合限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。", + zhziwu: "紫雾", + zhziwu_info: "每当你于回合外失去牌,你可以令当前回合角色不能使用杀直到回合结束。", + huanjue_info_old: + "每名角色的回合限一次,当你使用卡牌指定其他角色为惟一目标,或当其他角色使用卡牌指定你为惟一目标时,你可以发现一张牌代替此牌,然后该牌的使用者在结算后摸一张牌。", + yinzong: "影踪", + yinzong_info: "锁定技,每当你失去装备区内的牌,你获得一张闪。", + tansuo: "探索", + tansuo_info: "出牌阶段限一次,你可以弃置一张牌,然后发现一张炉石衍生牌。", + srjici: "棘刺", + srjici_info: "锁定技,每当你造成一次伤害,你摸一张牌,受伤害角色随机弃置一张牌。", + lieqi: "猎奇", + lieqi_info: + "准备和结束阶段,你可以指定一名角色,从一张该角色手牌与另外两张随机牌中猜测哪张为该角色手牌,若猜中,你获得一张该牌的复制(同一回合不能指定相同角色)。", + azaowu: "造物", + azaowu_backup: "造物", + azaowu_info: "出牌阶段限一次,你可以将一张基本牌当作任意一张基本牌使用。", + shouwang: "守望", + shouwang2: "守望", + shouwang_info: + "每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力并获得1点护甲。", + shouwang_info_alter: "每名角色每局限一次,当一名角色进入濒死状态时,你可以令其回复1点体力。", + qingtian: "擎天", + qingtian_info: "锁定技,若你的体力值为全场最多,你受到的伤害始终+1。", + qianfu: "潜伏", + qianfu2: "潜伏", + qianfu2_bg: "伏", + qianfu_info: + "锁定技,在你死亡前,若你没有进入潜伏状态,你弃置所有牌并进入潜伏状态;当你体力值回复到3(或体力上限)时,你解除潜伏状态并摸三张牌。", + shimo: "尸魔", + shimo_info: "锁定技,距离你为1的角色受到伤害时,你回复1点体力,若你没受伤,改为摸一张牌。", + lieyang: "裂阳", + lieyang_info: + "锁定技,每当你于回合内使用一张锦囊牌,你获得一张随机锦囊牌;当你发动三次此技能后,你本回合不能再使用锦囊牌。", + zhuilie: "追猎", + zhuilie_info: + "准备阶段,你可以弃置一张牌,然后将牌堆顶六张牌中的基本牌移至弃牌堆;若移入弃牌堆的牌超过三张,你摸一张牌。", + szbianshen: "变身", + szbianshen_info: + "限定技,回合开始时,若游戏轮数不少于3,你可以随机观看5张体力上限不小于5的武将牌,将武将牌替换为其中一张。", + kekao: "科考", + kekao_info: "结束阶段,你可以发现一张延时锦囊牌。", + jinhua: "进化", + jinhua_info: "锁定技,每当你以自己为目标使用一张非转化的锦囊牌,你发现一个技能并获得之。", + hsqizhou: "祈咒", + hsqizhou_feng: "风之祈咒", + hsqizhou_feng_info: "出牌阶段对自己使用,令所有目标的敌人打出一张杀或受到1点雷属性伤害。", + hsqizhou_shui: "水之祈咒", + hsqizhou_shui_info: "出牌阶段对自己使用,回复2点体力。", + hsqizhou_huo: "火之祈咒", + hsqizhou_huo_info: "出牌阶段对任意角色使用,令目标受到1点火属性伤害。", + hsqizhou_tu: "土之祈咒", + hsqizhou_tu_info: "出牌阶段对任意其他角色使用,令目标获得1点护甲。", + kqizhou: "祈咒", + kqizhou_info: "准备阶段,若你于上回合使用过锦囊牌,则可以获得一张元素祈咒。", + jingcu: "晶簇", + jingcu_info: "出牌阶段,你可以减少1点体力上限并摸两张牌。", + shengzhang: "生长", + shengzhang_info: "锁定技,若你于弃牌阶段弃置了牌,你增加1点体力上限。", + pyuhuo: "浴火", + pyuhuo_info: + "锁定技,在你首次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为4并摸四张牌;在你第二次进入濒死状态时,你弃置所有牌、重置武将牌、将体力和体力上限变为6并摸六张牌。", + mengye: "梦魇", + mengye_info: + "结束阶段,你可以选择一名有手牌的角色将其一张随机的非毒手牌转化为毒,然后令其获得1点护甲。", + mengye_old: "梦魇", + mengye_old2: "梦魇", + mengye_old_info: + "回合结束后,你可以翻面并指定一名的非主公角色,由你控制其进行一个额外的回合。在此回合中,你的本体不参与游戏。", + fuhua: "腐化", + fuhua2: "腐化", + fuhua_info: + "出牌阶段,你可以将一张毒交给一名没有魔血技能的其他角色,该角色选择一项:1. 获得技能魔血,此后每个结束阶段需交给你一张手牌;2. 视为你对其使用一张决斗。", + moxie: "魔血", + moxie_info: + "锁定技,当你因【毒】失去体力时,你改为摸两张牌;结束阶段,你将一张随机手牌转化为毒。", + gfuhun: "附魂", + gfuhun_info: + "结束阶段,若你未翻面,你可以和一名其他角色拼点,若你赢,你将武将牌翻至背面,该角色进入混乱状态直到下一回合结束。", + hlongyi: "龙裔", + hlongyi_info: "锁定技,你的黑色牌不占用手牌上限。", + zhongji: "重击", + zhongji_info: "每当你即将造成伤害,可弃置一张黑色手牌令伤害+1。", + fuwen: "符文", + fuwen_info: "若你弃牌阶段弃置了锦囊牌,你可以获得1点护甲。", + jinzhou: "禁咒", + jinzhou_info: + "结束阶段,若你手牌中有黑桃牌,你可以令一名其他角色的非锁定技失效直到其下一回合结束。", + midian: "秘典", + midian_info: "出牌阶段限一次,你可以弃置一张锦囊牌,然后随机获得三张锦囊牌。", + yuelu: "月露", + yuelu_info: "在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力并获得1点护甲。", + yuelu_info_alter: "在一名角色的濒死阶段,你可以弃置一张黑色牌令其回复1点体力。", + xingluo: "星落", + xingluo_info: + "准备阶段,你可以令任意名手牌数多于你的角色各弃置一张手牌,然后你可以从弃置的牌中选择一张加入手牌。", + yushou: "御兽", + yushou_info: + "出牌阶段,你可以弃置一张牌并召唤一个随机的野兽宠物,回合开始阶段,你随机失去一个宠物。", + yushou_misha: "米莎", + yushou_misha_info: "每当你受到一次伤害,你获得1点护甲。", + yushou_huofu: "霍弗", + yushou_huofu_info: "你可以将一张黑色牌当作决斗使用。", + yushou_leiouke: "雷欧克", + yushou_leiouke_info: "你每回合造成的首次伤害+1。", + hsqingyu_hufu: "青玉护符", + hsqingyu_hufu_info: "令一名角色获得1点护甲。", + hsqingyu_zhao: "青玉之爪", + hsqingyu_zhao_info: "当你装备此装备时,摸一张牌。", + hsqingyu_feibiao: "青玉飞镖", + hsqingyu_feibiao_info: "弃置一名角色的一张随机手牌和一张随机装备牌。", + hsqingyu_shandian: "青玉闪电", + hsqingyu_shandian_info: "对一名角色造成1点雷电伤害。", + hsqingyu_zhanfang: "青玉绽放", + hsqingyu_zhanfang_info: "令一名角色增加1点体力上限并摸一张牌。", + ayuling: "玉灵", + ayuling_info: "每当你受到一次伤害,你可以获得一张随机青玉牌。", + qingzun: "青樽", + qingzun_info: + "本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用两张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用六张青玉牌后,你可以于结束阶段摸一张牌。", + qingzun_info_alter: + "本局对战中,每当你使用一张青玉牌,你的手牌上限+1;当你累计使用三张青玉牌后,你可以于准备阶段摸一张牌;当你累计使用九张青玉牌后,你可以于结束阶段摸一张牌。", + lianjin: "炼金", + lianjin_info: + "出牌阶段限一次,你可以弃置一张牌并获得一张由三张随机牌组成的药水;当你因弃置而失去药水牌时,你随机获得药水的组成卡牌之一。", + shouji: "收集", + shouji_info: + "每当你使用一张杀,你可以获得一张目标随机手牌的复制;每当你的杀被闪避,你可以获得一张目标随机非特殊装备牌的复制;每回合限各限一次。", + hsguimou: "鬼谋", + hsguimou_info: + "每当你受到一次伤害,你可以获得伤害来源的一张手牌,若此牌是黑色,你展示此牌并重复此过程。", + yingxi: "影袭", + yingxi_info: + "结束阶段,若你本回合未造成伤害,你可以将一张黑色牌当作杀对任意一名角色使用,若目标未受到伤害,此杀不可闪避。", + peiyu: "培育", + peiyu_info: "准备阶段,你可以令一名没有图腾的角色获得一个随机图腾直到其首次受到伤害。", + peiyu_old_info: + "出牌阶段,你可以弃置一张牌令一名没有图腾的角色获得一个随机图腾,或令一名有图腾的角色替换一个图腾;你死亡时,其他角色失去以此法获得的图腾。", + wzhanyi: "战意", + wzhanyi_info: + "你可以跳过出牌阶段,改为摸三张牌并展示之,将摸到的装备牌置于装备区,然后可以使用手牌中的杀。", + shengteng: "升腾", + shengteng_info: "锁定技,每当你使用锦囊牌造成伤害,你增加1点体力上限并回复1点体力。", + yuansu: "寂灭", + yuansu_info: + "出牌阶段限一次,若你已损失的体力值不少于3,你可以将体力上限降至与体力值相同,视为使用一张元素毁灭。", + nuyan: "怒焰", + nuyan2: "怒焰", + nuyan_backup: "怒焰", + nuyan_info: + "出牌阶段限一次,你可以将一张红色牌当作任意一张能造成伤害的牌使用(不得是你本局以此法使用过的牌)。", + nuyan2_info: "出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。", + chouhuo: "仇火", + chouhuo_info: + "觉醒技,出牌阶段开始时,若你的怒焰技能已将可用的牌用完,你失去1点体力上限,获得2点护甲,然后将怒焰的描述改为“出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。", + hsdusu: "毒素", + hsdusu_xueji: "血蓟", + hsdusu_xueji_info: "随机弃置一名角色的2张装备牌。", + hsdusu_shinancao: "石楠草", + hsdusu_shinancao_info: "令一名角色下一次造成的伤害+1。", + hsdusu_kuyecao: "枯叶草", + hsdusu_kuyecao_info: "令一名角色获得技能潜行,直到其下一回合开始。", + hsdusu_huoyanhua: "火焰花", + hsdusu_huoyanhua_info: "对攻击范围内的一名角色造成1点火焰伤害。", + hsdusu_huangxuecao: "皇血草", + hsdusu_huangxuecao_info: "摸两张牌。", + duxin: "毒心", + duxin_info: "准备阶段和结束阶段,若你的手中没有毒素牌,你可以获得一张随机毒素牌。", + oldduxin: "毒心", + oldduxin_info: "准备阶段和结束阶段,你可以获得一张随机毒素牌。", + hstuteng: "图腾", + kuangluan: "狂乱", + kuangluan2: "狂乱", // kuangluan_info:'锁定技,每当你于回合内使用一张普通锦囊牌,便于出牌阶段结束时随机使用一张普通锦囊牌(随机指定目标)。', - kuangluan_info:'锁定技,每当一名其他角色对你造成伤害,该角色进入混乱状态直到当前回合结束。', - zengli:'赠礼', - zengli_info:'出牌阶段限一次,你指定一名其他角色与你各装备一把武器。', - xiubu:'修补', - xiubu_info:'每当你装备一把未强化的武器,你可以获得数量等同于武器攻击范围的随机零件。', - mobao:'魔爆', - mobao_info:'出牌阶段限一次,你可以弃置至多三张黑色牌,然后对所有于上轮对你造成过伤害的角色造成等同于你弃牌数的雷电伤害。', - xianji:'献祭', - xianji2:'献祭', - xianji3:'献祭', - xianji_info:'其他角色可以在其结束阶段弃置1~2张手牌并令你摸等量的牌,若如此做,直到其下一回合结束,每当你使用卡牌指定其为目标时,其摸一张牌。', - xueren:'血刃', - xueren_info:'每当你使用杀造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌。', - maoxian:'奇旅', - maoxian2:'奇旅', - maoxian_info:'出牌阶段限两次,你可以发现一个技能并获得之(替换此前发现的技能)。', - tanmi:'探秘', - tanmi_info:'在一名其他角色的结束阶段,若你没有手牌,你可以摸两张牌并可以使用两张牌。', - yiwen:'轶闻', - yiwen_info:'锁定技,每当其他角色于回合内首次使用非特殊卡牌指定你为惟一目标,你获得一张此牌的复制。', - tanbao_old:'探宝', - tanbao_old_info:'出牌阶段限一次,你可以弃置三张牌,然后展示牌堆顶的三张牌,然后获得其中任意张类别不同的牌;若三张牌类别均不相同,你回复全部体力值。', - qianghuax:'强化', - qianghuax_info:'出牌阶段限一次,你可以弃置任意张不同类别的牌,然后展示并获得与弃置的牌类别相同且价值更高的牌。', - zhuizong:'追踪', - zhuizong_info:'出牌阶段限一次,你可以弃置任意张牌,观看牌堆顶的等同于弃牌数四倍的牌,然后获得其中的一张牌。', - xunbao:'寻宝', - xunbao2:'寻宝', - xunbao_info:'准备阶段,若你的武将牌上没有藏宝图,你可以将一张藏宝图置于你的武将牌上;若你的武将牌上有藏宝图,你可以弃置一张与藏宝图点数相同的牌并获得此藏宝图。', - xieneng:'邪能', - xieneng_info:'结束阶段,你可以选择一张神器牌并获得之。', - fbeifa:'北伐', - fbeifa_info:'每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌,每回合最多发动3次。', - oldfbeifa:'北伐', - oldfbeifa_info:'每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌。', - yufa:'驭法', - yufa_info:'在任意一名其他角色的结束阶段,若你于此回合内受过其伤害,你可以将一张传送门交给除此角色外的任意一名角色。', - bingyan:'冰焰', - bingyan_info:'出牌阶段限一次,你可以将一张红色牌当作炽羽袭,或将一张黑色牌当作惊雷闪使用。', - hsshenqi:'神器', - hsshenqi_morijingxiang:'末日镜像', - hsshenqi_morijingxiang_info:'限武将牌正面朝上时使用,从所有其他角色的区域内各获得一张牌;使用后将武将牌翻至背面。', - hsshenqi_kongbusangzhong:'恐怖丧钟', - hsshenqi_kongbusangzhong_info:'限武将牌正面朝上时使用,对所有其他角色各造成1点伤害;使用后将武将牌翻至背面。', - hsshenqi_nengliangzhiguang:'能量之光', - hsshenqi_nengliangzhiguang_info:'限武将牌正面朝上时使用,令一名角色增加1点体力上限,回复1点体力,并摸四张牌;使用后将武将牌翻至背面。', - hsbaowu:'宝物', - hsbaowu_huangjinyuanhou:'黄金猿猴', - hsbaowu_huangjinyuanhou_info:'将你的手牌(含此张)替换为随机炉石衍生牌,并获得潜行直到下一回合开始。', - hsbaowu_cangbaotu:'藏宝图', - hsbaowu_cangbaotu_info:'结束阶段,将一张黄金猿猴置入你的手牌;摸一张牌。', - hsyaoshui:'药水', - hsqingyu:'青玉', + kuangluan_info: "锁定技,每当一名其他角色对你造成伤害,该角色进入混乱状态直到当前回合结束。", + zengli: "赠礼", + zengli_info: "出牌阶段限一次,你指定一名其他角色与你各装备一把武器。", + xiubu: "修补", + xiubu_info: "每当你装备一把未强化的武器,你可以获得数量等同于武器攻击范围的随机零件。", + mobao: "魔爆", + mobao_info: + "出牌阶段限一次,你可以弃置至多三张黑色牌,然后对所有于上轮对你造成过伤害的角色造成等同于你弃牌数的雷电伤害。", + xianji: "献祭", + xianji2: "献祭", + xianji3: "献祭", + xianji_info: + "其他角色可以在其结束阶段弃置1~2张手牌并令你摸等量的牌,若如此做,直到其下一回合结束,每当你使用卡牌指定其为目标时,其摸一张牌。", + xueren: "血刃", + xueren_info: "每当你使用杀造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌。", + maoxian: "奇旅", + maoxian2: "奇旅", + maoxian_info: "出牌阶段限两次,你可以发现一个技能并获得之(替换此前发现的技能)。", + tanmi: "探秘", + tanmi_info: "在一名其他角色的结束阶段,若你没有手牌,你可以摸两张牌并可以使用两张牌。", + yiwen: "轶闻", + yiwen_info: + "锁定技,每当其他角色于回合内首次使用非特殊卡牌指定你为惟一目标,你获得一张此牌的复制。", + tanbao_old: "探宝", + tanbao_old_info: + "出牌阶段限一次,你可以弃置三张牌,然后展示牌堆顶的三张牌,然后获得其中任意张类别不同的牌;若三张牌类别均不相同,你回复全部体力值。", + qianghuax: "强化", + qianghuax_info: + "出牌阶段限一次,你可以弃置任意张不同类别的牌,然后展示并获得与弃置的牌类别相同且价值更高的牌。", + zhuizong: "追踪", + zhuizong_info: + "出牌阶段限一次,你可以弃置任意张牌,观看牌堆顶的等同于弃牌数四倍的牌,然后获得其中的一张牌。", + xunbao: "寻宝", + xunbao2: "寻宝", + xunbao_info: + "准备阶段,若你的武将牌上没有藏宝图,你可以将一张藏宝图置于你的武将牌上;若你的武将牌上有藏宝图,你可以弃置一张与藏宝图点数相同的牌并获得此藏宝图。", + xieneng: "邪能", + xieneng_info: "结束阶段,你可以选择一张神器牌并获得之。", + fbeifa: "北伐", + fbeifa_info: + "每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌,每回合最多发动3次。", + oldfbeifa: "北伐", + oldfbeifa_info: + "每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌。", + yufa: "驭法", + yufa_info: + "在任意一名其他角色的结束阶段,若你于此回合内受过其伤害,你可以将一张传送门交给除此角色外的任意一名角色。", + bingyan: "冰焰", + bingyan_info: "出牌阶段限一次,你可以将一张红色牌当作炽羽袭,或将一张黑色牌当作惊雷闪使用。", + hsshenqi: "神器", + hsshenqi_morijingxiang: "末日镜像", + hsshenqi_morijingxiang_info: + "限武将牌正面朝上时使用,从所有其他角色的区域内各获得一张牌;使用后将武将牌翻至背面。", + hsshenqi_kongbusangzhong: "恐怖丧钟", + hsshenqi_kongbusangzhong_info: + "限武将牌正面朝上时使用,对所有其他角色各造成1点伤害;使用后将武将牌翻至背面。", + hsshenqi_nengliangzhiguang: "能量之光", + hsshenqi_nengliangzhiguang_info: + "限武将牌正面朝上时使用,令一名角色增加1点体力上限,回复1点体力,并摸四张牌;使用后将武将牌翻至背面。", + hsbaowu: "宝物", + hsbaowu_huangjinyuanhou: "黄金猿猴", + hsbaowu_huangjinyuanhou_info: + "将你的手牌(含此张)替换为随机炉石衍生牌,并获得潜行直到下一回合开始。", + hsbaowu_cangbaotu: "藏宝图", + hsbaowu_cangbaotu_info: "结束阶段,将一张黄金猿猴置入你的手牌;摸一张牌。", + hsyaoshui: "药水", + hsqingyu: "青玉", - lianzhan:'连斩', - lianzhan_info:'每当你造成一次伤害,若此伤害是你本回合第一次造成伤害,你摸两张牌;否则你增加1点体力上限并回复1点体力。', - shifa:'魔瘾', - shifa_info:'锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌(每回合最多发动3次);出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌。', - oldshifa:'魔瘾', - oldshifa_info:'锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌;出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌。', - yuanzheng:'远征', - yuanzheng_info:'每当你对距离1以外的角色使用一张牌,你可以弃置目标区域内的一张牌。', - bzhuiji:'追击', - bzhuiji_info:'每当一名角色死亡,你可以摸两张牌,并视为对杀死该角色的人使用一张决斗。', - byuhuo:'浴火', - byuhuo2:'浴火', - byuhuo_info:'觉醒技,当你进入濒死状态时,你须将体力和体力上限变为2,并将武将牌翻至背面;在你的下一准备阶段,你对所有其他角色造成2点火焰伤害,在此之前,你不能成为其他角色的卡牌的目标。', - yulu:'雨露', - yulu_info:'出牌阶段限一次,你可以指定任意名角色各摸一张牌,然后各弃置区域内的一张牌。', - oldyulu:'雨露', - oldyulu_info:'出牌阶段限一次,你可以指定任意名角色各摸两张牌,然后各弃置区域内的两张牌。', - duzhang:'毒瘴', - duzhang2:'毒瘴', - duzhang_info:'结束阶段,若你于本回合内未使用过锦囊牌,你可以指定一名其他角色令其下个回合无法使用锦囊牌。', - hannu:'寒怒', - hannu_info:'锁定技,每当你受到一次伤害,你将手牌数翻倍;若你的手牌数因此超过10张,你随机弃置若干张手牌直到手牌数等于你当前的体力值。', - chuidiao:'垂钓', - chuidiao_info:'锁定技,结束阶段,你随机摸0~2张牌。', - fushi:'缚誓', - fushi_info:'出牌阶段限一次,你可以令一名已受伤角色失去1点体力上限并回复1点体力。', - oldfushi:'缚誓', - oldfushi_info:'出牌阶段,你可以令一名已受伤角色失去1点体力上限并回复1点体力。', - hhudun:'护盾', - hhudun_info:'锁定技,在每名角色的准备阶段,若你没有护甲,你获得1点护甲;每当你的护甲抵消一次伤害,你摸一张牌。', - fenlie:'分裂', - fenlie_info:'锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制,每回合最多发动两次。', - oldfenlie:'分裂', - oldfenlie_info:'锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制。', - nianfu:'粘附', - nianfu_info:'锁定技,每当你造成或受到伤害,你随机获得对方装备区内的一张牌。', - xiaorong:'消融', - xiaorong_info:'锁定技,你的装备牌不占用手牌上限;结束阶段,你将手牌中的每张装备牌转化为两张随机基本牌,每转化一张装备牌便回复1点体力。', - shixu:'时序', - shixu_info:'锁定技,所有角色于出牌阶段每消耗3秒,便须于结束阶段弃置一张牌。', - qianghua:'绝手', - qianghua_info:'出牌阶段内,你可以令一张你使用的基本牌或普通锦囊牌额外结算一次,每回合限一次。', - jixuan:'疾旋', - jixuan_info:'锁定技,回合结束后,你摸一张牌进行一个额外的回合。', - biri:'蔽日', - biri_info:'每当距离你1以内的一名其他角色成为杀的惟一目标时,若杀的使用者不是你,你可以弃置一张闪取消之。', - stuxi:'吐息', - stuxi2:'吐息', - stuxi2_bg:'息', - stuxi_info:'锁定技,结束阶段,你令一名随机敌人下一个摸牌阶段摸牌数-1。', - bingdong:'冰冻', - bingdong_info:'锁定技,你在一个回合内首次造成伤害后,获得一个冰冻零件。', - ronghuo:'熔火', - ronghuo_info:'锁定技,你的普通杀均视为火杀。', - luoshi:'落石', - luoshi_info:'锁定技,每当你受到一次伤害,你与伤害来源各随机弃置一张牌。', - moyao:'魔曜', - moyao_info:'锁定技,你不能成为其他角色的锦囊牌的目标。', - jiaohui:'教诲', - jiaohui_info:'结束阶段,若你没有于本回合内造成伤害,你可以令一名角色摸一张牌或回复1点体力。', - bimeng:'碧梦', - bimeng_info:'结束阶段,你可以将一张随机梦境牌加入你的手牌。', - hsmengjing:'梦境', - hsmengjing_card_config:'梦境', - hsmengjing_feicuiyoulong:'翡翠幼龙', - hsmengjing_feicuiyoulong_info:'出牌阶段对任意一名角色使用,对目标造成1点伤害。', - hsmengjing_huanxiaojiemei:'欢笑姐妹', - hsmengjing_huanxiaojiemei_info:'出牌阶段对一名已受伤角色使用,令目标恢复1点体力。', - hsmengjing_suxing:'苏醒', - hsmengjing_suxing_info:'令所有其他角色失去1点体力并随机弃置两张牌。', - hsmengjing_mengye:'梦魇', - hsmengjing_mengye_info:'令一名角色摸一张牌,并在其下一个结束阶段弃置其所有牌。', - hsmengjing_mengjing:'梦境', - hsmengjing_mengjing_info:'令一名角色将装备区内的所有牌收入手牌,并将一张乐不思蜀置于其判定区。', - hszuzhou:'诅咒', - hszuzhou_nvwudeganguo:'女巫的钳锅', - hszuzhou_nvwudeganguo_info:'出牌阶段对一名角色使用,目标弃置一张牌,然后随机获得一张炉石衍生牌。', - hszuzhou_nvwudepingguo:'女巫的苹果', - hszuzhou_nvwudepingguo_info:'出牌阶段对一名角色使用,目标获得两张杀。', - hszuzhou_nvwudexuetu:'女巫的学徒', - hszuzhou_nvwudexuetu_info:'出牌阶段对没有咒降技能的角色使用,令目标非锁定技失效,并获得技能咒降直到下一回合结束。', - hszuzhou_wushushike:'巫术时刻', - hszuzhou_wushushike_info:'出牌阶段对所有角色使用,将手牌中的闪替换为杀。', - hszuzhou_guhuo:'蛊惑', - hszuzhou_guhuo_info:'出牌阶段对一名其他角色使用,令其交给你一张牌。', - xjumo:'聚魔', - xjumo_info:'锁定技,你的手牌上限+3;若你已受伤,改为+5。', - liehun:'裂魂', - liehun_info:'锁定技,结束阶段,你获得手牌中所有非基本、非特殊牌的复制。', - malymowang:'魔网', - malymowang_info:'锁定技,你的锦囊牌在每回合中造成的首次伤害+1;出牌阶段开始时,你发现一张普通锦囊牌。', - oldmalymowang:'魔网', - oldmalymowang_info:'锁定技,你的锦囊牌造成的伤害+1;出牌阶段开始时,你发现一张普通锦囊牌。', - lingzhou:'灵咒', - lingzhou_info:'每当你使用一张非转化的锦囊牌,可令一名角色摸一张牌或回复1点体力。', - mieshi:'灭世', - mieshi_info:'锁定技,结束阶段,你失去1点体力,并对一名随机的其他角色造成1点火焰伤害。', - xshixin:'蚀心', - xshixin_info:'锁定技,每当你对一名其他角色造成一次伤害,受伤害角色与你各失去1点体力。', - xshixin_info_alter:'锁定技,每当你对一名其他角色造成一次伤害,若受伤害角色体力值不小于你,其与你各失去1点体力。', - xmojian:'魔箭', - xmojian_info:'每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张杀。', - enze:'恩泽', - enze_info:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃三张牌)。', - oldenze:'恩泽', - oldenze_info:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等。', - enze_info_alter:'出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃两张牌)。', - chongsheng:'重生', - chongsheng_bg:'生', - chongsheng_info:'濒死阶段,你可弃置所有牌,将体力回复至2-X,并摸2-X张牌,X为你本局发动此技能的次数。每局最多发动2次。', - s_tuteng:'神谕', - s_tuteng_info:'锁定技,准备阶段,你随机获得一个图腾,若你已有至少3个图腾,则改为随机替换一个图腾。', - guozai:'过载', - guozai2:'过载', - guozai2_bg:'载', - guozai_info:'出牌阶段限一次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌。', - guozai_info_alter:'出牌阶段限一次,你可将手牌补至三张,并于此阶段结束时弃置等量的牌。', - guozaix:'过载', - guozaix2:'过载', - guozaix2_bg:'载', - guozaix_info:'出牌阶段限两次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌。', - oldhanshuang:'寒霜', - oldhanshuang_info:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面。', - hanshuang:'寒霜', - hanshuang_info:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面,然后你失去1点体力。', - hanshuang_info_alter:'锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面并摸一张牌,然后你失去1点体力。', - bingshi:'冰噬', - bingshi_info:'锁定技,你死亡时,对所有其他角色造成1点伤害。', - huanwu:'唤雾', - huanwu_info:'出牌阶段限一次,你可以令一名角色增加1点体力上限,回复1点体力,并摸两张牌(每名角色限发动一次)。', - fengnu:'风怒', - fengnu_info:'锁定技,你使用的任何卡牌无数量及距离限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)。', - fengnu_info_alter:'锁定技,你使用的任何卡牌无数量限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)。', - shengdun:'圣盾', - shengdun2:'圣盾', - shengdun_info:'锁定技,准备阶段,若你没有护甲,你获得1点护甲。', - jingmeng:'镜梦', - jingmeng_info:'每当你于回合内使用第一张牌时,你可以从牌堆中随机获得一张与之类型相同的牌。', - kuixin:'窥心', - kuixin_info:'结束阶段,你可以获得一名手牌数不少于你的角色的一张手牌。', - hswuji:'无羁', - hswuji_info:'出牌阶段结束时,你可以摸X张牌,X为你本回合使用的卡牌数。', - yanshu:'炎舞', - yanshu_info:'每回合限一次,当你弃置非基本牌后,你可以获得一张流星火雨。', - oldyanshu:'炎舞', - oldyanshu_info:'当你弃置非基本牌后,你可以获得一张流星火雨。', - bingshuang:'冰枪', - bingshuang_info:'你使用锦囊牌造成伤害后,可令目标摸两张牌并翻面。', - shengyan:'圣言', - shengyan_info:'任意一名角色回复体力后,你可以令其额外回复1点体力,每回合限发动一次。', - qingliu:'清流', - qingliu_info:'锁定技,你防止即将受到的火焰伤害。', - liechao:'猎潮', - liechao_info:'出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸四张牌,若如此做,你跳过本回合的弃牌阶段。', - liechao_info_alter:'出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸三张牌,若如此做,你跳过本回合的弃牌阶段。', - aoshu:'奥术', - aoshu_info:'出牌阶段限一次,你可以将一张黑桃牌当作无中生有使用。', + lianzhan: "连斩", + lianzhan_info: + "每当你造成一次伤害,若此伤害是你本回合第一次造成伤害,你摸两张牌;否则你增加1点体力上限并回复1点体力。", + shifa: "魔瘾", + shifa_info: + "锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌(每回合最多发动3次);出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌。", + oldshifa: "魔瘾", + oldshifa_info: + "锁定技,每当你于回合内使用一张非转化的普通锦囊牌,你摸一张牌;出牌阶段开始时,你令你与一名随机敌人各获得一张随机普通锦囊牌。", + yuanzheng: "远征", + yuanzheng_info: "每当你对距离1以外的角色使用一张牌,你可以弃置目标区域内的一张牌。", + bzhuiji: "追击", + bzhuiji_info: "每当一名角色死亡,你可以摸两张牌,并视为对杀死该角色的人使用一张决斗。", + byuhuo: "浴火", + byuhuo2: "浴火", + byuhuo_info: + "觉醒技,当你进入濒死状态时,你须将体力和体力上限变为2,并将武将牌翻至背面;在你的下一准备阶段,你对所有其他角色造成2点火焰伤害,在此之前,你不能成为其他角色的卡牌的目标。", + yulu: "雨露", + yulu_info: "出牌阶段限一次,你可以指定任意名角色各摸一张牌,然后各弃置区域内的一张牌。", + oldyulu: "雨露", + oldyulu_info: "出牌阶段限一次,你可以指定任意名角色各摸两张牌,然后各弃置区域内的两张牌。", + duzhang: "毒瘴", + duzhang2: "毒瘴", + duzhang_info: + "结束阶段,若你于本回合内未使用过锦囊牌,你可以指定一名其他角色令其下个回合无法使用锦囊牌。", + hannu: "寒怒", + hannu_info: + "锁定技,每当你受到一次伤害,你将手牌数翻倍;若你的手牌数因此超过10张,你随机弃置若干张手牌直到手牌数等于你当前的体力值。", + chuidiao: "垂钓", + chuidiao_info: "锁定技,结束阶段,你随机摸0~2张牌。", + fushi: "缚誓", + fushi_info: "出牌阶段限一次,你可以令一名已受伤角色失去1点体力上限并回复1点体力。", + oldfushi: "缚誓", + oldfushi_info: "出牌阶段,你可以令一名已受伤角色失去1点体力上限并回复1点体力。", + hhudun: "护盾", + hhudun_info: + "锁定技,在每名角色的准备阶段,若你没有护甲,你获得1点护甲;每当你的护甲抵消一次伤害,你摸一张牌。", + fenlie: "分裂", + fenlie_info: + "锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制,每回合最多发动两次。", + oldfenlie: "分裂", + oldfenlie_info: "锁定技,每当你于摸牌阶段外获得非特殊卡牌,你获得一张此牌的复制。", + nianfu: "粘附", + nianfu_info: "锁定技,每当你造成或受到伤害,你随机获得对方装备区内的一张牌。", + xiaorong: "消融", + xiaorong_info: + "锁定技,你的装备牌不占用手牌上限;结束阶段,你将手牌中的每张装备牌转化为两张随机基本牌,每转化一张装备牌便回复1点体力。", + shixu: "时序", + shixu_info: "锁定技,所有角色于出牌阶段每消耗3秒,便须于结束阶段弃置一张牌。", + qianghua: "绝手", + qianghua_info: "出牌阶段内,你可以令一张你使用的基本牌或普通锦囊牌额外结算一次,每回合限一次。", + jixuan: "疾旋", + jixuan_info: "锁定技,回合结束后,你摸一张牌进行一个额外的回合。", + biri: "蔽日", + biri_info: + "每当距离你1以内的一名其他角色成为杀的惟一目标时,若杀的使用者不是你,你可以弃置一张闪取消之。", + stuxi: "吐息", + stuxi2: "吐息", + stuxi2_bg: "息", + stuxi_info: "锁定技,结束阶段,你令一名随机敌人下一个摸牌阶段摸牌数-1。", + bingdong: "冰冻", + bingdong_info: "锁定技,你在一个回合内首次造成伤害后,获得一个冰冻零件。", + ronghuo: "熔火", + ronghuo_info: "锁定技,你的普通杀均视为火杀。", + luoshi: "落石", + luoshi_info: "锁定技,每当你受到一次伤害,你与伤害来源各随机弃置一张牌。", + moyao: "魔曜", + moyao_info: "锁定技,你不能成为其他角色的锦囊牌的目标。", + jiaohui: "教诲", + jiaohui_info: "结束阶段,若你没有于本回合内造成伤害,你可以令一名角色摸一张牌或回复1点体力。", + bimeng: "碧梦", + bimeng_info: "结束阶段,你可以将一张随机梦境牌加入你的手牌。", + hsmengjing: "梦境", + hsmengjing_card_config: "梦境", + hsmengjing_feicuiyoulong: "翡翠幼龙", + hsmengjing_feicuiyoulong_info: "出牌阶段对任意一名角色使用,对目标造成1点伤害。", + hsmengjing_huanxiaojiemei: "欢笑姐妹", + hsmengjing_huanxiaojiemei_info: "出牌阶段对一名已受伤角色使用,令目标恢复1点体力。", + hsmengjing_suxing: "苏醒", + hsmengjing_suxing_info: "令所有其他角色失去1点体力并随机弃置两张牌。", + hsmengjing_mengye: "梦魇", + hsmengjing_mengye_info: "令一名角色摸一张牌,并在其下一个结束阶段弃置其所有牌。", + hsmengjing_mengjing: "梦境", + hsmengjing_mengjing_info: "令一名角色将装备区内的所有牌收入手牌,并将一张乐不思蜀置于其判定区。", + hszuzhou: "诅咒", + hszuzhou_nvwudeganguo: "女巫的钳锅", + hszuzhou_nvwudeganguo_info: + "出牌阶段对一名角色使用,目标弃置一张牌,然后随机获得一张炉石衍生牌。", + hszuzhou_nvwudepingguo: "女巫的苹果", + hszuzhou_nvwudepingguo_info: "出牌阶段对一名角色使用,目标获得两张杀。", + hszuzhou_nvwudexuetu: "女巫的学徒", + hszuzhou_nvwudexuetu_info: + "出牌阶段对没有咒降技能的角色使用,令目标非锁定技失效,并获得技能咒降直到下一回合结束。", + hszuzhou_wushushike: "巫术时刻", + hszuzhou_wushushike_info: "出牌阶段对所有角色使用,将手牌中的闪替换为杀。", + hszuzhou_guhuo: "蛊惑", + hszuzhou_guhuo_info: "出牌阶段对一名其他角色使用,令其交给你一张牌。", + xjumo: "聚魔", + xjumo_info: "锁定技,你的手牌上限+3;若你已受伤,改为+5。", + liehun: "裂魂", + liehun_info: "锁定技,结束阶段,你获得手牌中所有非基本、非特殊牌的复制。", + malymowang: "魔网", + malymowang_info: + "锁定技,你的锦囊牌在每回合中造成的首次伤害+1;出牌阶段开始时,你发现一张普通锦囊牌。", + oldmalymowang: "魔网", + oldmalymowang_info: "锁定技,你的锦囊牌造成的伤害+1;出牌阶段开始时,你发现一张普通锦囊牌。", + lingzhou: "灵咒", + lingzhou_info: "每当你使用一张非转化的锦囊牌,可令一名角色摸一张牌或回复1点体力。", + mieshi: "灭世", + mieshi_info: "锁定技,结束阶段,你失去1点体力,并对一名随机的其他角色造成1点火焰伤害。", + xshixin: "蚀心", + xshixin_info: "锁定技,每当你对一名其他角色造成一次伤害,受伤害角色与你各失去1点体力。", + xshixin_info_alter: + "锁定技,每当你对一名其他角色造成一次伤害,若受伤害角色体力值不小于你,其与你各失去1点体力。", + xmojian: "魔箭", + xmojian_info: "每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张杀。", + enze: "恩泽", + enze_info: "出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃三张牌)。", + oldenze: "恩泽", + oldenze_info: "出牌阶段限一次,你可以指定一名角色令其手牌数与你相等。", + enze_info_alter: "出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃两张牌)。", + chongsheng: "重生", + chongsheng_bg: "生", + chongsheng_info: + "濒死阶段,你可弃置所有牌,将体力回复至2-X,并摸2-X张牌,X为你本局发动此技能的次数。每局最多发动2次。", + s_tuteng: "神谕", + s_tuteng_info: + "锁定技,准备阶段,你随机获得一个图腾,若你已有至少3个图腾,则改为随机替换一个图腾。", + guozai: "过载", + guozai2: "过载", + guozai2_bg: "载", + guozai_info: "出牌阶段限一次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌。", + guozai_info_alter: "出牌阶段限一次,你可将手牌补至三张,并于此阶段结束时弃置等量的牌。", + guozaix: "过载", + guozaix2: "过载", + guozaix2_bg: "载", + guozaix_info: "出牌阶段限两次,你可将手牌补至四张,并于此阶段结束时弃置等量的牌。", + oldhanshuang: "寒霜", + oldhanshuang_info: "锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面。", + hanshuang: "寒霜", + hanshuang_info: + "锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面,然后你失去1点体力。", + hanshuang_info_alter: + "锁定技,你使用黑色牌对一名未翻面角色造成伤害后,你令受伤害角色翻面并摸一张牌,然后你失去1点体力。", + bingshi: "冰噬", + bingshi_info: "锁定技,你死亡时,对所有其他角色造成1点伤害。", + huanwu: "唤雾", + huanwu_info: + "出牌阶段限一次,你可以令一名角色增加1点体力上限,回复1点体力,并摸两张牌(每名角色限发动一次)。", + fengnu: "风怒", + fengnu_info: + "锁定技,你使用的任何卡牌无数量及距离限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)。", + fengnu_info_alter: + "锁定技,你使用的任何卡牌无数量限制;当你于回合内重复使用同名卡牌时,你摸一张牌(每回合最多以此法摸三张牌)。", + shengdun: "圣盾", + shengdun2: "圣盾", + shengdun_info: "锁定技,准备阶段,若你没有护甲,你获得1点护甲。", + jingmeng: "镜梦", + jingmeng_info: "每当你于回合内使用第一张牌时,你可以从牌堆中随机获得一张与之类型相同的牌。", + kuixin: "窥心", + kuixin_info: "结束阶段,你可以获得一名手牌数不少于你的角色的一张手牌。", + hswuji: "无羁", + hswuji_info: "出牌阶段结束时,你可以摸X张牌,X为你本回合使用的卡牌数。", + yanshu: "炎舞", + yanshu_info: "每回合限一次,当你弃置非基本牌后,你可以获得一张流星火雨。", + oldyanshu: "炎舞", + oldyanshu_info: "当你弃置非基本牌后,你可以获得一张流星火雨。", + bingshuang: "冰枪", + bingshuang_info: "你使用锦囊牌造成伤害后,可令目标摸两张牌并翻面。", + shengyan: "圣言", + shengyan_info: "任意一名角色回复体力后,你可以令其额外回复1点体力,每回合限发动一次。", + qingliu: "清流", + qingliu_info: "锁定技,你防止即将受到的火焰伤害。", + liechao: "猎潮", + liechao_info: + "出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸四张牌,若如此做,你跳过本回合的弃牌阶段。", + liechao_info_alter: + "出牌阶阶段限一次,若你的武将牌正面朝上且手牌数不大于当前体力值,你可以翻面并摸三张牌,若如此做,你跳过本回合的弃牌阶段。", + aoshu: "奥术", + aoshu_info: "出牌阶段限一次,你可以将一张黑桃牌当作无中生有使用。", - qianhou:'千喉', - qianhou_info:'锁定技,准备阶段,你视为使用一张随机普通锦囊牌(随机指定目标);若目标只有1人且不是你,你可以弃置一张手牌并获得此锦囊。', - fengxing:'风行', - fengxing_info:'每当你于回合外首次失去牌,你可以弃置一张牌并摸两张牌。', - xinci:'心刺', - xinci_bg:'暗', - xinci_info:'出牌阶段限一次,你可以弃置一张黑色牌令一名角色失去1点体力。', - zhongjia:'战甲', - zhongjia_info:'锁定技,每当你受到一次伤害,你获得1点护甲;当你的体力值大于1且大于手牌数时,你的护甲不为你抵挡伤害。', - dunji:'盾击', - dunji_info:'出牌阶段限一次,你可以对攻击范围内的至多X名其他角色各造成1点伤害,并失去等量的护甲,X为你的护甲数。', - qiaodong:'巧动', - qiaodong_info:'你可以将一张装备牌当作闪使用或打出。', - fengxian:'奉献', - fengxian_info:'出牌阶段限一次,你可以令场上所有角色各弃置一张手牌。', - zhanhou:'战吼', - zhanhou_info:'出牌阶段限一次,你可以弃置一张防具牌并获得1点护甲。', - oldzhanhou:'战吼', - oldzhanhou_info:'出牌阶段,你可以弃置一张防具牌并获得1点护甲。', - anying:'暗影', - anying_info:'限定技,出牌阶段,你可以弃置一张黑色牌,失去技能圣光,并获得技能心刺。', - shijie:'视界', - shijie_info:'结束阶段,你可以获得一名其他角色的一张手牌,然后该角色摸一张牌。', - shengguang:'圣光', - shengguang_info:'出牌阶段限一次,你可以弃置一张红色牌令一名角色回复1点体力。', - bingjia:'冰甲', - bingjia2:'冰甲', - bingjia_info:'出牌阶段,若你武将牌上没有牌,你可以将一张手牌背面朝上置于你的武将牌上,当你成为其他角色的与此牌花色相同的牌的目标时,你移去此牌,获得1点护甲,并且本回合内防止一切伤害。', - bianxing:'变形', - bianxing_info:'当一其他角色于回合内使用卡牌指定了惟一的其他目标后,你可以用一张合理的基本牌替代此牌,每名角色的回合限一次。', - xianzhi:'先知', - xianzhi_info:'任意一名角色进行判定前,你可以观看牌堆顶的两张牌,并可以将其调换顺序。', - mdzhoufu:'缚魂', - mdzhoufu2:'缚魂', - mdzhoufu_info:'出牌阶段,你可以将一张黑色手牌置于一名其他角色的武将牌上,在其判定时以此牌作为判定结果,然后你获得亮出的判定牌。', - zuzhou:'诅咒', - zuzhou_info:'锁定技,准备阶段,若场上没有浮雷且你手牌中有黑桃牌,你将牌堆中的一张浮雷置于你的判定区;当一名角色受到浮雷伤害时,你移去此浮雷。', - zuzhou_old_info:'每当你造成或受到一次伤害,你可以令伤害目标或来源进行一次判定,若结果为黑色,其失去1点体力。', - jingxiang:'镜像', - jingxiang_info:'每回合限一次,当你需要打出卡牌时,你可以观看一名角色的手牌并将其视为你的手牌打出。', - jingxiang_info_alter:'每回合限一次,当你需要打出卡牌时,你可以观看一名手牌数不多于你的角色的手牌并将其视为你的手牌打出。', - tuteng:'图腾', - tuteng_info:'出牌阶段,你可以获得一个随机基础图腾;每当你受到一次伤害,你随机失去一个图腾。', - zuling:'祖灵', - zuling_info:'觉醒技,准备阶段,若你拥有至少3个图腾,你失去1点体力上限,并将图腾描述中的“获得一个随机基础图腾”改为“获得任意一个图腾(若有4个图腾则改为替换一个图腾)”。', - tuteng1:'治疗图腾', - tuteng1_info:'结束阶段,你回复1点体力。', - tuteng2:'灼热图腾', - tuteng2_info:'每当你造成一次伤害,你摸一张牌。', - tuteng3:'石爪图腾', - tuteng3_info:'你受到下一次伤害时,令伤害-1,然后失去此图腾。', - tuteng4:'空气图腾', - tuteng4_info:'在你的回合内,你的锦囊牌造成的首次伤害+1。', - tuteng5:'法潮图腾', - tuteng5_info:'结束阶段,你摸一张牌。', - tuteng6:'火舌图腾', - tuteng6_info:'在你的回合内,你的杀造成的首次伤害+1。', - tuteng7:'活力图腾', - tuteng7_info:'结束阶段,你令一名其他角色回复1点体力。', - tuteng8:'图腾魔像', - tuteng8_info:'你的进攻距离+1。', - tzhenji:'震击', - tzhenji_info:'每当你因弃置而失去黑色牌,可对一名角色造成1点雷电伤害,并随机弃置其一张牌,每回合限发动一次。', - fenliu:'分流', - fenliu_info:'出牌阶段限一次,你可以失去1点体力并获得三张牌。', - hongxi:'虹吸', - hongxi_info:'锁定技,每当有一名角色死亡,你将体力回复至体力上限。', - jihuo:'激活', - jihuo_info:'在你的回合结束后,你可以弃置一张手牌并进行一个额外的回合。', - jianren:'刃舞', - jianren_info:'出牌阶段限一次,你可以弃置装备区内的武器牌,对所有其他角色造成1点伤害。', - mengun:'闷棍', - mengun2:'闷棍', - mengun_info:'每当一名其他角色于回合内使用基本牌,你可以弃置一张与之花色相同的牌令其收回此牌,且在本回合内不能再次使用,每回合限一次。', - wlianji:'连击', - wlianji_info:'结束阶段,若你本回合使用的卡牌数大于你当前的体力值,你可以摸两张牌。', + qianhou: "千喉", + qianhou_info: + "锁定技,准备阶段,你视为使用一张随机普通锦囊牌(随机指定目标);若目标只有1人且不是你,你可以弃置一张手牌并获得此锦囊。", + fengxing: "风行", + fengxing_info: "每当你于回合外首次失去牌,你可以弃置一张牌并摸两张牌。", + xinci: "心刺", + xinci_bg: "暗", + xinci_info: "出牌阶段限一次,你可以弃置一张黑色牌令一名角色失去1点体力。", + zhongjia: "战甲", + zhongjia_info: + "锁定技,每当你受到一次伤害,你获得1点护甲;当你的体力值大于1且大于手牌数时,你的护甲不为你抵挡伤害。", + dunji: "盾击", + dunji_info: + "出牌阶段限一次,你可以对攻击范围内的至多X名其他角色各造成1点伤害,并失去等量的护甲,X为你的护甲数。", + qiaodong: "巧动", + qiaodong_info: "你可以将一张装备牌当作闪使用或打出。", + fengxian: "奉献", + fengxian_info: "出牌阶段限一次,你可以令场上所有角色各弃置一张手牌。", + zhanhou: "战吼", + zhanhou_info: "出牌阶段限一次,你可以弃置一张防具牌并获得1点护甲。", + oldzhanhou: "战吼", + oldzhanhou_info: "出牌阶段,你可以弃置一张防具牌并获得1点护甲。", + anying: "暗影", + anying_info: "限定技,出牌阶段,你可以弃置一张黑色牌,失去技能圣光,并获得技能心刺。", + shijie: "视界", + shijie_info: "结束阶段,你可以获得一名其他角色的一张手牌,然后该角色摸一张牌。", + shengguang: "圣光", + shengguang_info: "出牌阶段限一次,你可以弃置一张红色牌令一名角色回复1点体力。", + bingjia: "冰甲", + bingjia2: "冰甲", + bingjia_info: + "出牌阶段,若你武将牌上没有牌,你可以将一张手牌背面朝上置于你的武将牌上,当你成为其他角色的与此牌花色相同的牌的目标时,你移去此牌,获得1点护甲,并且本回合内防止一切伤害。", + bianxing: "变形", + bianxing_info: + "当一其他角色于回合内使用卡牌指定了惟一的其他目标后,你可以用一张合理的基本牌替代此牌,每名角色的回合限一次。", + xianzhi: "先知", + xianzhi_info: "任意一名角色进行判定前,你可以观看牌堆顶的两张牌,并可以将其调换顺序。", + mdzhoufu: "缚魂", + mdzhoufu2: "缚魂", + mdzhoufu_info: + "出牌阶段,你可以将一张黑色手牌置于一名其他角色的武将牌上,在其判定时以此牌作为判定结果,然后你获得亮出的判定牌。", + zuzhou: "诅咒", + zuzhou_info: + "锁定技,准备阶段,若场上没有浮雷且你手牌中有黑桃牌,你将牌堆中的一张浮雷置于你的判定区;当一名角色受到浮雷伤害时,你移去此浮雷。", + zuzhou_old_info: + "每当你造成或受到一次伤害,你可以令伤害目标或来源进行一次判定,若结果为黑色,其失去1点体力。", + jingxiang: "镜像", + jingxiang_info: + "每回合限一次,当你需要打出卡牌时,你可以观看一名角色的手牌并将其视为你的手牌打出。", + jingxiang_info_alter: + "每回合限一次,当你需要打出卡牌时,你可以观看一名手牌数不多于你的角色的手牌并将其视为你的手牌打出。", + tuteng: "图腾", + tuteng_info: "出牌阶段,你可以获得一个随机基础图腾;每当你受到一次伤害,你随机失去一个图腾。", + zuling: "祖灵", + zuling_info: + "觉醒技,准备阶段,若你拥有至少3个图腾,你失去1点体力上限,并将图腾描述中的“获得一个随机基础图腾”改为“获得任意一个图腾(若有4个图腾则改为替换一个图腾)”。", + tuteng1: "治疗图腾", + tuteng1_info: "结束阶段,你回复1点体力。", + tuteng2: "灼热图腾", + tuteng2_info: "每当你造成一次伤害,你摸一张牌。", + tuteng3: "石爪图腾", + tuteng3_info: "你受到下一次伤害时,令伤害-1,然后失去此图腾。", + tuteng4: "空气图腾", + tuteng4_info: "在你的回合内,你的锦囊牌造成的首次伤害+1。", + tuteng5: "法潮图腾", + tuteng5_info: "结束阶段,你摸一张牌。", + tuteng6: "火舌图腾", + tuteng6_info: "在你的回合内,你的杀造成的首次伤害+1。", + tuteng7: "活力图腾", + tuteng7_info: "结束阶段,你令一名其他角色回复1点体力。", + tuteng8: "图腾魔像", + tuteng8_info: "你的进攻距离+1。", + tzhenji: "震击", + tzhenji_info: + "每当你因弃置而失去黑色牌,可对一名角色造成1点雷电伤害,并随机弃置其一张牌,每回合限发动一次。", + fenliu: "分流", + fenliu_info: "出牌阶段限一次,你可以失去1点体力并获得三张牌。", + hongxi: "虹吸", + hongxi_info: "锁定技,每当有一名角色死亡,你将体力回复至体力上限。", + jihuo: "激活", + jihuo_info: "在你的回合结束后,你可以弃置一张手牌并进行一个额外的回合。", + jianren: "刃舞", + jianren_info: "出牌阶段限一次,你可以弃置装备区内的武器牌,对所有其他角色造成1点伤害。", + mengun: "闷棍", + mengun2: "闷棍", + mengun_info: + "每当一名其他角色于回合内使用基本牌,你可以弃置一张与之花色相同的牌令其收回此牌,且在本回合内不能再次使用,每回合限一次。", + wlianji: "连击", + wlianji_info: "结束阶段,若你本回合使用的卡牌数大于你当前的体力值,你可以摸两张牌。", }, }; }); diff --git a/character/huicui.js b/character/huicui.js index e65de526d..5f00edc96 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -1,1349 +1,1817 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'huicui', - connect:true, - character:{ - dc_caoshuang:['male','wei',4,['dcjianzhuan','dcfanshi']], - zangba:['male','wei',4,['rehengjiang']], - dc_simashi:['male','wei',3,['dcsanshi','dczhenrao','dcchenlve']], - dc_wangling:['male','wei',4,['dcjichou','dcmouli'],['clan:太原王氏']], - dc_jiangji:['male','wei',3,['dcshiju','dcyingshi']], - gongsunxiu:['male','qun',4,['dcgangu','dckuizhen']], - dc_liuli:['male','shu',3,['dcfuli','dcdehua']], - yue_daqiao:['female','wu',3,['dcqiqin','dczixi']], - dc_kongrong:['male','qun',3,['dckrmingshi','lirang']], - dc_sp_menghuo:['male','qun',4,['dcmanwang']], - dc_lingcao:['male','wu','4/5',['dcdufeng']], - yue_xiaoqiao:['female','wu',3,['dcqiqin','dcweiwan']], - dc_dongzhao:['male','wei',3,['dcyijia','dcdingji']], - kuaiqi:['male','wei',3,['dcliangxiu','dcxunjie']], - yue_caiyong:['male','qun',3,['dcjiaowei','dcfeibai']], - pangshanmin:['male','wei',3,['dccaisi','dczhuoli']], - dc_jiachong:['male','wei',3,['dcbeini','dcshizong']], - dc_sunchen:['male','wu',4,['dczigu','dczuowei']], - dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji']], - yue_zhoufei:['female','wu',3,['dclingkong','dcxianshu']], - dc_wuban:['male','shu',4,['dcyouzhan'],['clan:陈留吴氏']], - yue_caiwenji:['female','qun',3,['dcshuangjia','dcbeifen']], - liuchongluojun:['male','qun',3,['dcminze','dcjini']], - yuechen:['male','wei',4,['dcporui','dcgonghu']], - zhangkai:['male','qun',4,['dcxiangshu']], - gaoxiang:['male','shu',4,['dcchiying']], - yuanyin:['male','qun',3,['dcmoshou','dcyunjiu']], - dongwan:['female','qun',3,['dcshengdu','dcjieling']], - zhangchu:['female','qun',3,['dcjizhong','dcrihui','dcguangshi']], - peiyuanshao:['male','qun',4,['dcmoyu']], - mengjie:['male','qun',3,['dcyinlu','dcyouqi']], - dc_huojun:['male','shu',4,['dcgue','dcsigong']], - dc_sunhanhua:['female','wu',3,['dchuiling','dcchongxu']], - dc_sunziliufang:['male','wei',3,['dcqinshen','dcweidang']], - yuantanyuanxiyuanshang:['male','qun',4,['dcneifa']], - qiaorui:['male','qun',4,['dcaishou','dcsaowei']], - xianglang:['male','shu',3,['dckanji','dcqianzheng']], - qinlang:['male','wei',4,['dchaochong','dcjinjin']], - furongfuqian:['male','shu','4/6',['dcxuewei','dcyuguan']], - zhenghun:['male','wei',3,['dcqiangzhi','dcpitian']], - dc_zhaotongzhaoguang:['male','shu',4,['yizan_use','dcqingren','dclongyuan']], - dc_huanghao:['male','shu',3,['dcqinqing','huisheng','dccunwei']], - liupi:['male','qun',4,['dcjuying']], - dc_sp_jiaxu:['male','wei',3,['zhenlue','dcjianshu','dcyongdi']], - leibo:['male','qun',4,['dcsilve','dcshuaijie']], - gongsundu:['male','qun',4,['dczhenze','dcanliao']], - panghui:['male','wei',5,['dcyiyong']], - dc_yuejiu:['male','qun',4,['dccuijin']], - chenjiao:['male','wei',3,['dcxieshou','dcqingyan','dcqizi']], - wanglie:['male','qun',3,['dcchongwang','dchuagui']], - chengui:['male','qun',3,['dcyingtu','dccongshi']], - dc_huangquan:['male','shu',3,['dcquanjian','dctujue']], - yinfuren:['female','wei',3,['dcyingyu','dcyongbi']], - dc_lvkuanglvxiang:['male','wei',4,['dcshuhe','dcliehou']], - guanhai:['male','qun',4,['suoliang','qinbao']], - huzhao:['male','qun',3,['midu','xianwang']], - dc_liuba:['male','shu',3,['dczhubi','dcliuzhuan']], - zhangxun:['male','qun',4,['suizheng']], - zongyu:['male','shu',3,['zyqiao','chengshang']], - dc_jiling:['male','qun',4,['dcshuangren']], - dc_yanghu:['male','wei',3,['dcdeshao','dcmingfa']], - caimaozhangyun:['male','wei',4,['lianzhou','jinglan']], - tenggongzhu:['female','wu',3,['xingchong','liunian']], - dc_huangchengyan:['male','qun',3,['dcjiezhen','dczecai','dcyinshi']], - dc_gaolan:['male','qun',4,['xizhen']], - guanning:['male','qun','3/7',['dunshi']], - dc_jiben:['male','qun',3,['xunli','zhishi','lieyi']], - mamidi:['male','qun','4/6',['bingjie','zhengding']], - re_dengzhi:['male','shu',3,['jianliang','weimeng']], - fengxi:['male','wu',3,['yusui','boyan']], - re_miheng:['male','qun',3,['rekuangcai','reshejian']], - re_chendeng:['male','qun',3,['refuyuan','reyingshui','rewangzu']], - wanniangongzhu:['female','qun',3,['zhenge','xinghan']], - re_xunchen:['male','qun',3,['refenglve','anyong'],['clan:颍川荀氏']], - re_kanze:['male','wu',3,['xiashu','rekuanshi']], - lvlingqi:['female','qun',4,['guowu','zhuangrong']], - zhanghu:['male','wei',4,['cuijian','zhtongyuan']], - luyusheng:['female','wu',3,['zhente','zhiwei']], - huaxin:['male','wei',3,['spwanggui','xibing']], - mengyou:['male','qun',5,['manyi','dcmanzhi']], - liuyong:['male','shu',3,['zhuning','fengxiang']], - dc_sunru:['female','wu',3,['xiecui','youxu']], - xiahoulingnv:['female','wei',4,['fuping','weilie']], - zhangyao:['female','wu',3,['yuanyu','xiyan']], - tengyin:['male','wu',3,['chenjian','xixiu']], - zhangxuan:['female','wu',4,['tongli','shezang']], - wangtao:['female','shu',3,['huguan','yaopei']], - wangyue:['female','shu',3,['huguan','mingluan']], - zhaoyan:['female','wu',3,['jinhui','qingman']], - heyan:['male','wei',3,['yachai','qingtan']], - re_sunluyu:['female','wu',3,['remeibu','remumu']], - re_dongbai:['female','qun',3,['relianzhu','rexiahui']], - zhoushan:['male','wu',4,['dcmiyun','dcdanying']], - dc_caiyang:['male','wei',4,['dcxunji','dcjiaofeng']], - xiahoujie:['male','wei',5,['liedan','zhuangdan']], - caoxing:['male','qun',4,['cxliushi','zhanwan']], - re_chunyuqiong:['male','qun',4,['recangchu','reliangying','reshishou']], - xingdaorong:['male','qun','4/6',['xuxie']], - re_panfeng:['male','qun',4,['xinkuangfu']], - jiangfei:['male','shu',3,['dcshengxi','dcshoucheng']], + name: "huicui", + connect: true, + character: { + dc_caoshuang: ["male", "wei", 4, ["dcjianzhuan", "dcfanshi"]], + zangba: ["male", "wei", 4, ["rehengjiang"]], + dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"]], + dc_wangling: ["male", "wei", 4, ["dcjichou", "dcmouli"], ["clan:太原王氏"]], + dc_jiangji: ["male", "wei", 3, ["dcshiju", "dcyingshi"]], + gongsunxiu: ["male", "qun", 4, ["dcgangu", "dckuizhen"]], + dc_liuli: ["male", "shu", 3, ["dcfuli", "dcdehua"]], + yue_daqiao: ["female", "wu", 3, ["dcqiqin", "dczixi"]], + dc_kongrong: ["male", "qun", 3, ["dckrmingshi", "lirang"]], + dc_sp_menghuo: ["male", "qun", 4, ["dcmanwang"]], + dc_lingcao: ["male", "wu", "4/5", ["dcdufeng"]], + yue_xiaoqiao: ["female", "wu", 3, ["dcqiqin", "dcweiwan"]], + dc_dongzhao: ["male", "wei", 3, ["dcyijia", "dcdingji"]], + kuaiqi: ["male", "wei", 3, ["dcliangxiu", "dcxunjie"]], + yue_caiyong: ["male", "qun", 3, ["dcjiaowei", "dcfeibai"]], + pangshanmin: ["male", "wei", 3, ["dccaisi", "dczhuoli"]], + dc_jiachong: ["male", "wei", 3, ["dcbeini", "dcshizong"]], + dc_sunchen: ["male", "wu", 4, ["dczigu", "dczuowei"]], + dc_zhangmancheng: ["male", "qun", 4, ["dclvecheng", "dczhongji"]], + yue_zhoufei: ["female", "wu", 3, ["dclingkong", "dcxianshu"]], + dc_wuban: ["male", "shu", 4, ["dcyouzhan"], ["clan:陈留吴氏"]], + yue_caiwenji: ["female", "qun", 3, ["dcshuangjia", "dcbeifen"]], + liuchongluojun: ["male", "qun", 3, ["dcminze", "dcjini"]], + yuechen: ["male", "wei", 4, ["dcporui", "dcgonghu"]], + zhangkai: ["male", "qun", 4, ["dcxiangshu"]], + gaoxiang: ["male", "shu", 4, ["dcchiying"]], + yuanyin: ["male", "qun", 3, ["dcmoshou", "dcyunjiu"]], + dongwan: ["female", "qun", 3, ["dcshengdu", "dcjieling"]], + zhangchu: ["female", "qun", 3, ["dcjizhong", "dcrihui", "dcguangshi"]], + peiyuanshao: ["male", "qun", 4, ["dcmoyu"]], + mengjie: ["male", "qun", 3, ["dcyinlu", "dcyouqi"]], + dc_huojun: ["male", "shu", 4, ["dcgue", "dcsigong"]], + dc_sunhanhua: ["female", "wu", 3, ["dchuiling", "dcchongxu"]], + dc_sunziliufang: ["male", "wei", 3, ["dcqinshen", "dcweidang"]], + yuantanyuanxiyuanshang: ["male", "qun", 4, ["dcneifa"]], + qiaorui: ["male", "qun", 4, ["dcaishou", "dcsaowei"]], + xianglang: ["male", "shu", 3, ["dckanji", "dcqianzheng"]], + qinlang: ["male", "wei", 4, ["dchaochong", "dcjinjin"]], + furongfuqian: ["male", "shu", "4/6", ["dcxuewei", "dcyuguan"]], + zhenghun: ["male", "wei", 3, ["dcqiangzhi", "dcpitian"]], + dc_zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "dcqingren", "dclongyuan"]], + dc_huanghao: ["male", "shu", 3, ["dcqinqing", "huisheng", "dccunwei"]], + liupi: ["male", "qun", 4, ["dcjuying"]], + dc_sp_jiaxu: ["male", "wei", 3, ["zhenlue", "dcjianshu", "dcyongdi"]], + leibo: ["male", "qun", 4, ["dcsilve", "dcshuaijie"]], + gongsundu: ["male", "qun", 4, ["dczhenze", "dcanliao"]], + panghui: ["male", "wei", 5, ["dcyiyong"]], + dc_yuejiu: ["male", "qun", 4, ["dccuijin"]], + chenjiao: ["male", "wei", 3, ["dcxieshou", "dcqingyan", "dcqizi"]], + wanglie: ["male", "qun", 3, ["dcchongwang", "dchuagui"]], + chengui: ["male", "qun", 3, ["dcyingtu", "dccongshi"]], + dc_huangquan: ["male", "shu", 3, ["dcquanjian", "dctujue"]], + yinfuren: ["female", "wei", 3, ["dcyingyu", "dcyongbi"]], + dc_lvkuanglvxiang: ["male", "wei", 4, ["dcshuhe", "dcliehou"]], + guanhai: ["male", "qun", 4, ["suoliang", "qinbao"]], + huzhao: ["male", "qun", 3, ["midu", "xianwang"]], + dc_liuba: ["male", "shu", 3, ["dczhubi", "dcliuzhuan"]], + zhangxun: ["male", "qun", 4, ["suizheng"]], + zongyu: ["male", "shu", 3, ["zyqiao", "chengshang"]], + dc_jiling: ["male", "qun", 4, ["dcshuangren"]], + dc_yanghu: ["male", "wei", 3, ["dcdeshao", "dcmingfa"]], + caimaozhangyun: ["male", "wei", 4, ["lianzhou", "jinglan"]], + tenggongzhu: ["female", "wu", 3, ["xingchong", "liunian"]], + dc_huangchengyan: ["male", "qun", 3, ["dcjiezhen", "dczecai", "dcyinshi"]], + dc_gaolan: ["male", "qun", 4, ["xizhen"]], + guanning: ["male", "qun", "3/7", ["dunshi"]], + dc_jiben: ["male", "qun", 3, ["xunli", "zhishi", "lieyi"]], + mamidi: ["male", "qun", "4/6", ["bingjie", "zhengding"]], + re_dengzhi: ["male", "shu", 3, ["jianliang", "weimeng"]], + fengxi: ["male", "wu", 3, ["yusui", "boyan"]], + re_miheng: ["male", "qun", 3, ["rekuangcai", "reshejian"]], + re_chendeng: ["male", "qun", 3, ["refuyuan", "reyingshui", "rewangzu"]], + wanniangongzhu: ["female", "qun", 3, ["zhenge", "xinghan"]], + re_xunchen: ["male", "qun", 3, ["refenglve", "anyong"], ["clan:颍川荀氏"]], + re_kanze: ["male", "wu", 3, ["xiashu", "rekuanshi"]], + lvlingqi: ["female", "qun", 4, ["guowu", "zhuangrong"]], + zhanghu: ["male", "wei", 4, ["cuijian", "zhtongyuan"]], + luyusheng: ["female", "wu", 3, ["zhente", "zhiwei"]], + huaxin: ["male", "wei", 3, ["spwanggui", "xibing"]], + mengyou: ["male", "qun", 5, ["manyi", "dcmanzhi"]], + liuyong: ["male", "shu", 3, ["zhuning", "fengxiang"]], + dc_sunru: ["female", "wu", 3, ["xiecui", "youxu"]], + xiahoulingnv: ["female", "wei", 4, ["fuping", "weilie"]], + zhangyao: ["female", "wu", 3, ["yuanyu", "xiyan"]], + tengyin: ["male", "wu", 3, ["chenjian", "xixiu"]], + zhangxuan: ["female", "wu", 4, ["tongli", "shezang"]], + wangtao: ["female", "shu", 3, ["huguan", "yaopei"]], + wangyue: ["female", "shu", 3, ["huguan", "mingluan"]], + zhaoyan: ["female", "wu", 3, ["jinhui", "qingman"]], + heyan: ["male", "wei", 3, ["yachai", "qingtan"]], + re_sunluyu: ["female", "wu", 3, ["remeibu", "remumu"]], + re_dongbai: ["female", "qun", 3, ["relianzhu", "rexiahui"]], + zhoushan: ["male", "wu", 4, ["dcmiyun", "dcdanying"]], + dc_caiyang: ["male", "wei", 4, ["dcxunji", "dcjiaofeng"]], + xiahoujie: ["male", "wei", 5, ["liedan", "zhuangdan"]], + caoxing: ["male", "qun", 4, ["cxliushi", "zhanwan"]], + re_chunyuqiong: ["male", "qun", 4, ["recangchu", "reliangying", "reshishou"]], + xingdaorong: ["male", "qun", "4/6", ["xuxie"]], + re_panfeng: ["male", "qun", 4, ["xinkuangfu"]], + jiangfei: ["male", "shu", 3, ["dcshengxi", "dcshoucheng"]], }, - characterSort:{ - huicui:{ - sp_baigei:['re_panfeng','xingdaorong','caoxing','re_chunyuqiong','xiahoujie','dc_caiyang','zhoushan'], - sp_caizijiaren:['dc_kongrong','re_dongbai','re_sunluyu','heyan','zhaoyan','wangtao','wangyue','zhangxuan','tengyin','zhangyao','xiahoulingnv','dc_sunru','pangshanmin','kuaiqi'], - sp_zhilan:['dc_liuli','liuyong','wanniangongzhu','zhanghu','lvlingqi','tenggongzhu','panghui','dc_zhaotongzhaoguang','yuantanyuanxiyuanshang','yuechen','dc_lingcao'], - sp_guixin:['zangba','re_kanze','re_chendeng','caimaozhangyun','dc_lvkuanglvxiang','dc_gaolan','yinfuren','chengui','chenjiao','dc_sp_jiaxu','qinlang','dc_dongzhao'], - sp_daihan:['mamidi','dc_jiling','zhangxun','dc_yuejiu','leibo','qiaorui','dongwan','yuanyin'], - sp_jianghu:['guanning','huzhao','dc_huangchengyan','mengjie','wanglie'], - sp_zongheng:['huaxin','luyusheng','re_xunchen','re_miheng','fengxi','re_dengzhi','dc_yanghu','zongyu'], - sp_taiping:['guanhai','liupi','peiyuanshao','zhangchu','zhangkai','dc_zhangmancheng'], - sp_yanhan:['dc_liuba','dc_huangquan','furongfuqian','xianglang','dc_huojun','gaoxiang','dc_wuban','jiangfei'], - sp_jishi:['dc_jiben','zhenghun','dc_sunhanhua','liuchongluojun'], - sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen','dc_jiachong'], - sp_yijun:['gongsundu','mengyou','dc_sp_menghuo','gongsunxiu'], - sp_zhengyin:['yue_caiwenji','yue_zhoufei','yue_caiyong','yue_xiaoqiao','yue_daqiao'], - sp_zhonghu:['dc_jiangji','dc_wangling','dc_simashi','dc_caoshuang'], - } + characterSort: { + huicui: { + sp_baigei: [ + "re_panfeng", + "xingdaorong", + "caoxing", + "re_chunyuqiong", + "xiahoujie", + "dc_caiyang", + "zhoushan", + ], + sp_caizijiaren: [ + "dc_kongrong", + "re_dongbai", + "re_sunluyu", + "heyan", + "zhaoyan", + "wangtao", + "wangyue", + "zhangxuan", + "tengyin", + "zhangyao", + "xiahoulingnv", + "dc_sunru", + "pangshanmin", + "kuaiqi", + ], + sp_zhilan: [ + "dc_liuli", + "liuyong", + "wanniangongzhu", + "zhanghu", + "lvlingqi", + "tenggongzhu", + "panghui", + "dc_zhaotongzhaoguang", + "yuantanyuanxiyuanshang", + "yuechen", + "dc_lingcao", + ], + sp_guixin: [ + "zangba", + "re_kanze", + "re_chendeng", + "caimaozhangyun", + "dc_lvkuanglvxiang", + "dc_gaolan", + "yinfuren", + "chengui", + "chenjiao", + "dc_sp_jiaxu", + "qinlang", + "dc_dongzhao", + ], + sp_daihan: [ + "mamidi", + "dc_jiling", + "zhangxun", + "dc_yuejiu", + "leibo", + "qiaorui", + "dongwan", + "yuanyin", + ], + sp_jianghu: ["guanning", "huzhao", "dc_huangchengyan", "mengjie", "wanglie"], + sp_zongheng: [ + "huaxin", + "luyusheng", + "re_xunchen", + "re_miheng", + "fengxi", + "re_dengzhi", + "dc_yanghu", + "zongyu", + ], + sp_taiping: ["guanhai", "liupi", "peiyuanshao", "zhangchu", "zhangkai", "dc_zhangmancheng"], + sp_yanhan: [ + "dc_liuba", + "dc_huangquan", + "furongfuqian", + "xianglang", + "dc_huojun", + "gaoxiang", + "dc_wuban", + "jiangfei", + ], + sp_jishi: ["dc_jiben", "zhenghun", "dc_sunhanhua", "liuchongluojun"], + sp_raoting: ["dc_huanghao", "dc_sunziliufang", "dc_sunchen", "dc_jiachong"], + sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu"], + sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao"], + sp_zhonghu: ["dc_jiangji", "dc_wangling", "dc_simashi", "dc_caoshuang"], + }, }, /** @type { importCharacterConfig['skill'] } */ - skill:{ + skill: { //新杀曹爽 - dcjianzhuan:{ - audio:2, - trigger:{player:'useCard'}, - filter(event,player){ - const evtx=event.getParent('phaseUse'); - return player.isPhaseUsing()&&player.getHistory('useSkill',evt=>{ - return evt.skill=='dcjianzhuan'&&evt.event.getParent('phaseUse')==evtx; - }).length<4-player.getStorage('dcjianzhuan').length; + dcjianzhuan: { + audio: 2, + trigger: { player: "useCard" }, + filter(event, player) { + const evtx = event.getParent("phaseUse"); + return ( + player.isPhaseUsing() && + player.getHistory("useSkill", (evt) => { + return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx; + }).length < + 4 - player.getStorage("dcjianzhuan").length + ); }, - forced:true, - derivation:'dcjianzhuan_faq', - async content(event,trigger,player){ - const evtx=event.getParent('phaseUse'),num=player.getHistory('useSkill',evt=>{ - return evt.skill=='dcjianzhuan'&&evt.event.getParent('phaseUse')==evtx; - }).length,info=get.info('dcjianzhuan').choices; - let choices=[],choiceList=[],map={}; - for(const i in info){ - map[info[i].intro]=i; - if(player.getStorage('dcjianzhuan').includes(i)||player.getStorage('dcjianzhuan_used').includes(i)) continue; - choices.push(info[i].intro);choiceList.push(info[i].introx(num)); + forced: true, + derivation: "dcjianzhuan_faq", + async content(event, trigger, player) { + const evtx = event.getParent("phaseUse"), + num = player.getHistory("useSkill", (evt) => { + return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx; + }).length, + info = get.info("dcjianzhuan").choices; + let choices = [], + choiceList = [], + map = {}; + for (const i in info) { + map[info[i].intro] = i; + if ( + player.getStorage("dcjianzhuan").includes(i) || + player.getStorage("dcjianzhuan_used").includes(i) + ) + continue; + choices.push(info[i].intro); + choiceList.push(info[i].introx(num)); } - const {result:{control}}=await player.chooseControl(choices).set('choiceList',choiceList).set('ai',()=>{ - const player=get.event('player'),num=get.event('num'),info=get.info('dcjianzhuan').choices; - let choices=get.event('controls').slice(),map=get.event('map') - return choices.sort((a,b)=>info[map[b]].ai_effect(player,num)-info[map[a]].ai_effect(player,num))[0]; - }).set('num',num).set('map',map).set('prompt','渐专:请选择一项执行'); - if(control){ - if(!player.storage.dcjianzhuan_used){ - player.when('phaseUseAfter').then(()=>delete player.storage.dcjianzhuan_used); + const { + result: { control }, + } = await player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + const player = get.event("player"), + num = get.event("num"), + info = get.info("dcjianzhuan").choices; + let choices = get.event("controls").slice(), + map = get.event("map"); + return choices.sort( + (a, b) => + info[map[b]].ai_effect(player, num) - info[map[a]].ai_effect(player, num) + )[0]; + }) + .set("num", num) + .set("map", map) + .set("prompt", "渐专:请选择一项执行"); + if (control) { + if (!player.storage.dcjianzhuan_used) { + player.when("phaseUseAfter").then(() => delete player.storage.dcjianzhuan_used); } - player.markAuto('dcjianzhuan_used',[map[control]]); - await info[map[control]].content(player,num); + player.markAuto("dcjianzhuan_used", [map[control]]); + await info[map[control]].content(player, num); } }, - choices:{ - discard_target:{ - intro:'拆牌', - introx:(num)=>'令一名角色弃置'+num+'张牌', - weight:1, - ai_effect(player,num){ - return game.hasPlayer(target=>{ - return get.effect(target,{name:'guohe_copy2'},player,player)>0; - })?(2+num):0; + choices: { + discard_target: { + intro: "拆牌", + introx: (num) => "令一名角色弃置" + num + "张牌", + weight: 1, + ai_effect(player, num) { + return game.hasPlayer((target) => { + return get.effect(target, { name: "guohe_copy2" }, player, player) > 0; + }) + ? 2 + num + : 0; }, - async content(player,num=1){ - const {result:{bool,targets}}=await player.chooseTarget('令一名角色弃置'+num+'张牌',true).set('ai',target=>{ - return get.effect(target,{name:'guohe_copy2'},get.event('player'),get.event('player'))*Math.sqrt(Math.min(get.event('num'),target.countDiscardableCards(target,'he'))); - }).set('num',num); - if(bool){ - const target=targets[0]; + async content(player, num = 1) { + const { + result: { bool, targets }, + } = await player + .chooseTarget("令一名角色弃置" + num + "张牌", true) + .set("ai", (target) => { + return ( + get.effect( + target, + { name: "guohe_copy2" }, + get.event("player"), + get.event("player") + ) * + Math.sqrt( + Math.min( + get.event("num"), + target.countDiscardableCards(target, "he") + ) + ) + ); + }) + .set("num", num); + if (bool) { + const target = targets[0]; player.line(target); - await target.chooseToDiscard(num,'he',true); + await target.chooseToDiscard(num, "he", true); } }, }, - draw_self:{ - intro:'摸牌', - introx:(num)=>'摸'+num+'张牌', - weight:1, - ai_effect(player,num){ + draw_self: { + intro: "摸牌", + introx: (num) => "摸" + num + "张牌", + weight: 1, + ai_effect(player, num) { return 3; }, - async content(player,num=1){ + async content(player, num = 1) { await player.draw(num); }, }, - recast_self:{ - intro:'重铸', - introx:(num)=>'重铸'+num+'张牌', - weight:1, - ai_effect(player,num){ + recast_self: { + intro: "重铸", + introx: (num) => "重铸" + num + "张牌", + weight: 1, + ai_effect(player, num) { return 1; }, - async content(player,num=1){ - if(!player.hasCard(lib.filter.cardRecastable,'he')) return; - const {result:{bool,cards}}=await player.chooseCard('重铸'+num+'张牌','he',num,lib.filter.cardRecastable,true).set('ai',lib.skill.zhiheng.check); - if(bool) await player.recast(cards); + async content(player, num = 1) { + if (!player.hasCard(lib.filter.cardRecastable, "he")) return; + const { + result: { bool, cards }, + } = await player + .chooseCard("重铸" + num + "张牌", "he", num, lib.filter.cardRecastable, true) + .set("ai", lib.skill.zhiheng.check); + if (bool) await player.recast(cards); }, }, - discard_self:{ - intro:'弃牌', - introx:(num)=>'弃置'+num+'张牌', - weight:'90%', - ai_effect(player,num){ - let cards=player.getCards('hs'); - cards.sort((a,b)=>get.value(b)-get.value(a)); - cards=cards.slice(0,-Math.min(num,cards.length)); - return cards.some(card=>player.hasValueTarget(card,true,true))?4:-4; + discard_self: { + intro: "弃牌", + introx: (num) => "弃置" + num + "张牌", + weight: "90%", + ai_effect(player, num) { + let cards = player.getCards("hs"); + cards.sort((a, b) => get.value(b) - get.value(a)); + cards = cards.slice(0, -Math.min(num, cards.length)); + return cards.some((card) => player.hasValueTarget(card, true, true)) ? 4 : -4; }, - async content(player,num=1){ - await player.chooseToDiscard(num,'he',true); + async content(player, num = 1) { + await player.chooseToDiscard(num, "he", true); }, }, }, - group:'dcjianzhuan_remove', - subSkill:{ - remove:{ - audio:'dcjianzhuan', - trigger:{player:'phaseUseEnd'}, - filter(event,player){ - if(player.getStorage('dcjianzhuan').length>=4) return false; - return player.getStorage('dcjianzhuan_used').length>=4-player.getStorage('dcjianzhuan').length; + group: "dcjianzhuan_remove", + subSkill: { + remove: { + audio: "dcjianzhuan", + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + if (player.getStorage("dcjianzhuan").length >= 4) return false; + return ( + player.getStorage("dcjianzhuan_used").length >= + 4 - player.getStorage("dcjianzhuan").length + ); }, - forced:true, - async content(event,trigger,player){ - const info=get.info('dcjianzhuan').choices; - let map={}; - let unfixedWeightTotal=0,remainedWeight=100; - let entries=[]; - for(const i in info){ - const infox=info[i]; - map[infox.intro]=i; - if(player.getStorage('dcjianzhuan').includes(i)) continue; - let weight=(infox.weight||1).toString(); - if(weight.endsWith('%')){ - weight=Math.min(remainedWeight,parseInt(weight.slice(0,-1))); - entries.push([infox.intro,weight]); - remainedWeight-=weight; - } - else{ - weight=parseInt(weight); - unfixedWeightTotal+=weight; - entries.push([infox.intro,-weight]); + forced: true, + async content(event, trigger, player) { + const info = get.info("dcjianzhuan").choices; + let map = {}; + let unfixedWeightTotal = 0, + remainedWeight = 100; + let entries = []; + for (const i in info) { + const infox = info[i]; + map[infox.intro] = i; + if (player.getStorage("dcjianzhuan").includes(i)) continue; + let weight = (infox.weight || 1).toString(); + if (weight.endsWith("%")) { + weight = Math.min(remainedWeight, parseInt(weight.slice(0, -1))); + entries.push([infox.intro, weight]); + remainedWeight -= weight; + } else { + weight = parseInt(weight); + unfixedWeightTotal += weight; + entries.push([infox.intro, -weight]); } } - entries=entries.map(entry=>{ - let weight=entry[1]; - if(weight<0) weight=-remainedWeight/unfixedWeightTotal*weight; - return [entry[0],weight]; + entries = entries.map((entry) => { + let weight = entry[1]; + if (weight < 0) weight = (-remainedWeight / unfixedWeightTotal) * weight; + return [entry[0], weight]; }); - let rand=Math.random()*100; - let removeChoice=entries.find(entry=>{ - rand-=entry[1]; - return rand<0; + let rand = Math.random() * 100; + let removeChoice = entries.find((entry) => { + rand -= entry[1]; + return rand < 0; })[0]; - if(get.isLuckyStar(player)&&Object.keys(entries).includes('弃牌')) removeChoice='弃牌'; - player.markAuto('dcjianzhuan',[map[removeChoice]]); + if (get.isLuckyStar(player) && Object.keys(entries).includes("弃牌")) + removeChoice = "弃牌"; + player.markAuto("dcjianzhuan", [map[removeChoice]]); player.popup(removeChoice); - game.log(player,'移去了','#g'+removeChoice,'项'); + game.log(player, "移去了", "#g" + removeChoice, "项"); }, }, }, - mark:true, - intro:{ - markcount(storage){ - return 4-(storage||[]).length; + mark: true, + intro: { + markcount(storage) { + return 4 - (storage || []).length; }, - content(storage){ - if(!(storage||[]).length) return '暂未移去任何项'; - const info=get.info('dcjianzhuan').choices; - let str=''; - for(const i of storage){ - str+=info[i].intro; - str+='、'; + content(storage) { + if (!(storage || []).length) return "暂未移去任何项"; + const info = get.info("dcjianzhuan").choices; + let str = ""; + for (const i of storage) { + str += info[i].intro; + str += "、"; } - str=str.slice(0,-1); - return '已移去'+str+'项'; + str = str.slice(0, -1); + return "已移去" + str + "项"; }, }, }, - dcfanshi:{ - unique:true, - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return 4-player.getStorage('dcjianzhuan').length<2; + dcfanshi: { + unique: true, + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return 4 - player.getStorage("dcjianzhuan").length < 2; }, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - async content(event,trigger,player){ - player.awakenSkill('dcfanshi'); - const info=get.info('dcjianzhuan').choices; - let choices=[]; - for(const i in info){ - if(!player.getStorage('dcjianzhuan').includes(i)) choices.push(i); + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + async content(event, trigger, player) { + player.awakenSkill("dcfanshi"); + const info = get.info("dcjianzhuan").choices; + let choices = []; + for (const i in info) { + if (!player.getStorage("dcjianzhuan").includes(i)) choices.push(i); } - if(choices.length){ - for(const choice of choices){ - for(let i=1;i<=3;i++){ - await info[choice].content(player,1); + if (choices.length) { + for (const choice of choices) { + for (let i = 1; i <= 3; i++) { + await info[choice].content(player, 1); } } } await player.gainMaxHp(2); await player.recover(2); - await player.changeSkills(['dcfudou'],['dcjianzhuan']); + await player.changeSkills(["dcfudou"], ["dcjianzhuan"]); }, - derivation:'dcfudou', + derivation: "dcfudou", }, - dcfudou:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(event.targets.length!=1||event.target==player) return false; - const color=get.color(event.card); - if(!['black','red'].includes(color)) return false; - const damage=event.target.getAllHistory('sourceDamage',evt=>evt.player==player).length; - return Math.min(1,damage)==(color=='black'); + dcfudou: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (event.targets.length != 1 || event.target == player) return false; + const color = get.color(event.card); + if (!["black", "red"].includes(color)) return false; + const damage = event.target.getAllHistory( + "sourceDamage", + (evt) => evt.player == player + ).length; + return Math.min(1, damage) == (color == "black"); }, - check(event,player){ - const color=get.color(event.card); - if(color=='red') return get.attitude(player,event.target)>0; - if(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=1) return false; - return get.effect(player,{name:'losehp'},player,player)>=get.effect(event.target,{name:'losehp'},player,player); + check(event, player) { + const color = get.color(event.card); + if (color == "red") return get.attitude(player, event.target) > 0; + if ( + player.getHp() + + player.countCards("hs", (card) => player.canSaveCard(card, player)) <= + 1 + ) + return false; + return ( + get.effect(player, { name: "losehp" }, player, player) >= + get.effect(event.target, { name: "losehp" }, player, player) + ); }, - prompt2(event,player){ - return '与'+get.translation(event.target)+'各'+(get.color(event.card)=='black'?'失去1点体力':'摸一张牌'); + prompt2(event, player) { + return ( + "与" + + get.translation(event.target) + + "各" + + (get.color(event.card) == "black" ? "失去1点体力" : "摸一张牌") + ); }, - logTarget:'target', - async content(event,trigger,player){ - const color=get.color(trigger.card),target=trigger.target; - if(color=='red'){ - await player.draw('nodelay'); + logTarget: "target", + async content(event, trigger, player) { + const color = get.color(trigger.card), + target = trigger.target; + if (color == "red") { + await player.draw("nodelay"); await target.draw(); - } - else{ + } else { await player.loseHp(); await target.loseHp(); } }, }, //司马师 - dcsanshi:{ - audio:2, - trigger:{global:'roundStart'}, - forced:true, - filter(event,player){ - return game.roundNumber===1; + dcsanshi: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + filter(event, player) { + return game.roundNumber === 1; }, - group:['dcsanshi_gain','dcsanshi_directHit'], - async content(event,trigger,player){ - const recordedNumbers=[]; - let num=get.rand(0,ui.cardPile.childNodes.length-1); - for(let i=0;i=ui.cardPile.childNodes.length) j-=ui.cardPile.childNodes.length; - const card=ui.cardPile.childNodes[j],number=get.number(card,false); - if(!recordedNumbers.includes(number)){ + group: ["dcsanshi_gain", "dcsanshi_directHit"], + async content(event, trigger, player) { + const recordedNumbers = []; + let num = get.rand(0, ui.cardPile.childNodes.length - 1); + for (let i = 0; i < ui.cardPile.childNodes.length; i++) { + let j = i + num; + if (j >= ui.cardPile.childNodes.length) j -= ui.cardPile.childNodes.length; + const card = ui.cardPile.childNodes[j], + number = get.number(card, false); + if (!recordedNumbers.includes(number)) { recordedNumbers.add(number); - card.storage.dcsanshi=true; - num=get.rand(0,ui.cardPile.childNodes.length-1); + card.storage.dcsanshi = true; + num = get.rand(0, ui.cardPile.childNodes.length - 1); } } - player.addSkill('dcsanshi_mark'); + player.addSkill("dcsanshi_mark"); }, - subSkill:{ - gain:{ - audio:'dcsanshi', - trigger:{global:'phaseEnd'}, - filter(event,player){ - return game.hasGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose'){ - if(evt.position!==ui.discardPile) return false; - } - else if(evt.name!=='cardsDiscard') return false; - if(lib.skill.dcsanshi_gain.notUseOrRespond(evt,player)){ - return evt.cards.some(card=>{ - return card.storage.dcsanshi&&get.position(card)==='d'; + subSkill: { + gain: { + audio: "dcsanshi", + trigger: { global: "phaseEnd" }, + filter(event, player) { + return game.hasGlobalHistory("cardMove", (evt) => { + if (evt.name == "lose") { + if (evt.position !== ui.discardPile) return false; + } else if (evt.name !== "cardsDiscard") return false; + if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) { + return evt.cards.some((card) => { + return card.storage.dcsanshi && get.position(card) === "d"; }); } return false; }); }, - forced:true, - notUseOrRespond(event,player){ - if (event.name !== 'cardsDiscard') return true; + forced: true, + notUseOrRespond(event, player) { + if (event.name !== "cardsDiscard") return true; const evtx = event.getParent(); - if (evtx.name !== 'orderingDiscard') return true; - const evt2 = (evtx.relatedEvent || evtx.getParent()); - return !['useCard', 'respond'].includes(evt2.name) || evt2.player !== player; + if (evtx.name !== "orderingDiscard") return true; + const evt2 = evtx.relatedEvent || evtx.getParent(); + return !["useCard", "respond"].includes(evt2.name) || evt2.player !== player; }, - async content(event,trigger,player){ - const cards=[]; - game.checkGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose'){ - if(evt.position!==ui.discardPile) return false; - } - else if(evt.name!=='cardsDiscard') return false; - if(lib.skill.dcsanshi_gain.notUseOrRespond(evt,player)){ - cards.addArray(evt.cards.filter(card=>{ - return card.storage.dcsanshi&&get.position(card)==='d'; - })); + async content(event, trigger, player) { + const cards = []; + game.checkGlobalHistory("cardMove", (evt) => { + if (evt.name == "lose") { + if (evt.position !== ui.discardPile) return false; + } else if (evt.name !== "cardsDiscard") return false; + if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) { + cards.addArray( + evt.cards.filter((card) => { + return card.storage.dcsanshi && get.position(card) === "d"; + }) + ); } }); - if(cards.length) player.gain(cards,'gain2'); - } + if (cards.length) player.gain(cards, "gain2"); + }, }, - directHit:{ - audio:'dcsanshi', - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - return event.cards&&event.cards.some(card=>{ - return card.storage.dcsanshi; - }); + directHit: { + audio: "dcsanshi", + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return ( + event.cards && + event.cards.some((card) => { + return card.storage.dcsanshi; + }) + ); }, - async content(event,trigger,player){ + async content(event, trigger, player) { trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); }, }, - mark:{ - trigger:{ - player:'gainEnd', - global:'loseAsyncEnd', + mark: { + trigger: { + player: "gainEnd", + global: "loseAsyncEnd", }, - forced:true, - popup:false, - silent:true, - lastDo:true, - filter(event,player){ - if(!['dcsanshi','dcchenlve'].every(skill=>player.hasSkill(skill,null,false,false))) return false; - const cards=event.getg(player); - if(!cards.length) return false; - return cards.some(card=>card.storage.dcsanshi); + forced: true, + popup: false, + silent: true, + lastDo: true, + filter(event, player) { + if ( + !["dcsanshi", "dcchenlve"].every((skill) => + player.hasSkill(skill, null, false, false) + ) + ) + return false; + const cards = event.getg(player); + if (!cards.length) return false; + return cards.some((card) => card.storage.dcsanshi); }, - async content(event,trigger,player){ - var cards=trigger.getg(player); - if(cards.length){ - cards=cards.filter(card=>card.storage.dcsanshi); - player.addGaintag(cards,'dcsanshi_tag'); + async content(event, trigger, player) { + var cards = trigger.getg(player); + if (cards.length) { + cards = cards.filter((card) => card.storage.dcsanshi); + player.addGaintag(cards, "dcsanshi_tag"); } }, }, }, - ai:{ - threaten:3, + ai: { + threaten: 3, }, }, - dczhenrao:{ - audio:2, - trigger:{global:'useCardToPlayered'}, - filter(event,player){ - if((()=>{ - if(event.player===player){ - if(!event.isFirstTarget) return false; - return event.targets.some(target=>target!==player); - } - return event.target===player; - })()){ - return event.targets.concat(event.player).some(target=>{ - return target.countCards('h')>player.countCards('h')&&!player.getStorage('dczhenrao').includes(target); + dczhenrao: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + filter(event, player) { + if ( + (() => { + if (event.player === player) { + if (!event.isFirstTarget) return false; + return event.targets.some((target) => target !== player); + } + return event.target === player; + })() + ) { + return event.targets.concat(event.player).some((target) => { + return ( + target.countCards("h") > player.countCards("h") && + !player.getStorage("dczhenrao").includes(target) + ); }); } return false; }, - direct:true, - async content(event,trigger,player){ - const result=await player.chooseTarget(get.prompt('dczhenrao'),'对一名可选角色造成1点伤害',(card,player,target)=>{ - return get.event('targets').includes(target)&&!player.getStorage('dczhenrao').includes(target); - }) - .set('targets',trigger.targets.concat(trigger.player).filter(target=>target.countCards('h')>player.countCards('h'))) - .set('ai',target=>{ - const player=get.player(); - return get.damageEffect(target,player,player); + direct: true, + async content(event, trigger, player) { + const result = await player + .chooseTarget( + get.prompt("dczhenrao"), + "对一名可选角色造成1点伤害", + (card, player, target) => { + return ( + get.event("targets").includes(target) && + !player.getStorage("dczhenrao").includes(target) + ); + } + ) + .set( + "targets", + trigger.targets + .concat(trigger.player) + .filter((target) => target.countCards("h") > player.countCards("h")) + ) + .set("ai", (target) => { + const player = get.player(); + return get.damageEffect(target, player, player); }) .forResult(); - if(!result.bool) return; - const target=result.targets[0]; - player.logSkill('dczhenrao',target); + if (!result.bool) return; + const target = result.targets[0]; + player.logSkill("dczhenrao", target); await target.damage(); await game.asyncDelayx(); - if(!player.storage.dczhenrao){ - player.when({global:'phaseAfter'}).then(()=>player.unmarkSkill('dczhenrao')); + if (!player.storage.dczhenrao) { + player.when({ global: "phaseAfter" }).then(() => player.unmarkSkill("dczhenrao")); } - player.markAuto('dczhenrao',target); + player.markAuto("dczhenrao", target); }, - intro:{ - content:'已以此法对$造成过伤害', - onunmark:true, + intro: { + content: "已以此法对$造成过伤害", + onunmark: true, }, - ai:{ - expose:0.2, - threaten:3, + ai: { + expose: 0.2, + threaten: 3, }, }, - dcchenlve:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'thunder', - filterCard:()=>false, - selectCard:[-2,-1], - async content(event,trigger,player){ - player.awakenSkill('dcchenlve'); - const cards=['cardPile','discardPile'].map(pos=>Array.from(ui[pos].childNodes)).flat(); - const sishiList=[]; - const isSishi=card=>card.storage.dcsanshi; - const lose_list=[],players=game.filterPlayer(); - players.forEach(current=>{ - const pos='ej'+(current===player?'h':''); - const sishis=current.getCards(pos,isSishi); - if(sishis.length>0){ + dcchenlve: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filterCard: () => false, + selectCard: [-2, -1], + async content(event, trigger, player) { + player.awakenSkill("dcchenlve"); + const cards = ["cardPile", "discardPile"] + .map((pos) => Array.from(ui[pos].childNodes)) + .flat(); + const sishiList = []; + const isSishi = (card) => card.storage.dcsanshi; + const lose_list = [], + players = game.filterPlayer(); + players.forEach((current) => { + const pos = "ej" + (current === player ? "h" : ""); + const sishis = current.getCards(pos, isSishi); + if (sishis.length > 0) { current.$throw(sishis); - lose_list.push([current,sishis]); + lose_list.push([current, sishis]); sishiList.addArray(sishis); } }); - if(lose_list.length){ - await game.loseAsync({lose_list}).setContent('chooseToCompareLose'); + if (lose_list.length) { + await game.loseAsync({ lose_list }).setContent("chooseToCompareLose"); } sishiList.addArray(cards.filter(isSishi)); - if(lose_list.length) await game.asyncDelayx(); - player.gain(sishiList,'gain2'); - player.when('phaseEnd') - .filter(evt=>evt===event.getParent('phase')) + if (lose_list.length) await game.asyncDelayx(); + player.gain(sishiList, "gain2"); + player + .when("phaseEnd") + .filter((evt) => evt === event.getParent("phase")) .vars({ - sishiList + sishiList, }) - .then(()=>{ - const lose_list=[],players=game.filterPlayer(); - players.forEach(current=>{ - const cards=current.getCards('hej').filter(card=>sishiList.includes(card)); - if(cards.length>0){ + .then(() => { + const lose_list = [], + players = game.filterPlayer(); + players.forEach((current) => { + const cards = current + .getCards("hej") + .filter((card) => sishiList.includes(card)); + if (cards.length > 0) { current.$throw(cards); - lose_list.push([current,cards]); + lose_list.push([current, cards]); } }); - if(lose_list.length){ - game.loseAsync({lose_list}).setContent('chooseToCompareLose'); + if (lose_list.length) { + game.loseAsync({ lose_list }).setContent("chooseToCompareLose"); } }) - .then(()=>{ + .then(() => { game.cardsGotoSpecial(sishiList); - game.log(sishiList,'被移出了游戏'); + game.log(sishiList, "被移出了游戏"); }); - player.when('die') + player + .when("die") .vars({ - sishiList + sishiList, }) .assign({ - forceDie:true, + forceDie: true, }) - .then(()=>{ + .then(() => { game.cardsDiscard(sishiList); - game.log(sishiList,'被置入了弃牌堆'); + game.log(sishiList, "被置入了弃牌堆"); }); }, - ai:{ - order:0.5, - result:{ - player(player){ - if(player.getHp(true)>1&&player.countCards('he')>1) return 0; - if(!player.isDamaged()&&(player.countCards('h')>1||player.countCards('e')>0)) return 0; + ai: { + order: 0.5, + result: { + player(player) { + if (player.getHp(true) > 1 && player.countCards("he") > 1) return 0; + if ( + !player.isDamaged() && + (player.countCards("h") > 1 || player.countCards("e") > 0) + ) + return 0; return 13; - } + }, }, - combo:'dcsanshi' + combo: "dcsanshi", }, }, //王凌 - dcjichou:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - filter(event,player){ - const evts=player.getHistory('useCard',evt=>evt.getParent('phaseUse')===event); - const names=evts.map(evt=>evt.card.name).unique(); - return evts.length>0&&evts.length===names.length&&evts.some(evt=>evt.cards.some(card=>get.position(card)==='d')); + dcjichou: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + const evts = player.getHistory("useCard", (evt) => evt.getParent("phaseUse") === event); + const names = evts.map((evt) => evt.card.name).unique(); + return ( + evts.length > 0 && + evts.length === names.length && + evts.some((evt) => evt.cards.some((card) => get.position(card) === "d")) + ); }, - async content(event,trigger,player){ - const cards=[]; - player.checkHistory('useCard',evt=>{ - if(evt.getParent('phaseUse')!==trigger) return; - cards.addArray(evt.cards.filterInD('d')); + async content(event, trigger, player) { + const cards = []; + player.checkHistory("useCard", (evt) => { + if (evt.getParent("phaseUse") !== trigger) return; + cards.addArray(evt.cards.filterInD("d")); }); - const num=Math.min(cards.length,game.countPlayer()); - if(_status.connectMode) game.broadcastAll(()=>{_status.noclearcountdown=true}); - const [bool,links]=await player.chooseButton([ - `集筹:将${numget.attitude(player,current)>0), - game.countPlayer(current=>get.attitude(player,current)<0) + const num = Math.min(cards.length, game.countPlayer()); + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; + }); + const [bool, links] = await player + .chooseButton([ + `集筹:将${ + num < cards.length ? "至多" + get.cnNumber(num) + "张牌" : "任意张牌" + }交给等量角色`, + cards, ]) - .set('ai',button=>{ - const card=button.link,population=get.event('population'); - if(ui.selected.buttons.length>population[0]+population[1]) return 0; - if(ui.selected.buttons.length>get.event('population')[0]) return 2-get.value(card); - return 2+get.value(card); + .set("selectButton", [1, num]) + .set("population", [ + game.countPlayer((current) => get.attitude(player, current) > 0), + game.countPlayer((current) => get.attitude(player, current) < 0), + ]) + .set("ai", (button) => { + const card = button.link, + population = get.event("population"); + if (ui.selected.buttons.length > population[0] + population[1]) return 0; + if (ui.selected.buttons.length > get.event("population")[0]) + return 2 - get.value(card); + return 2 + get.value(card); }) - .forResult('bool','links'); - if(bool){ - const [bool,targets]=await player.chooseTarget( + .forResult("bool", "links"); + if (bool) { + const [bool, targets] = await player + .chooseTarget( `集筹:请选择${get.cnNumber(links.length)}名角色`, - `操作提示:请按照顺序选择要交给牌的目标,令这些角色按顺序获得这些牌:${get.translation(links)}`, + `操作提示:请按照顺序选择要交给牌的目标,令这些角色按顺序获得这些牌:${get.translation( + links + )}`, true, - links.length, + links.length ) - .set('values',links.map(i=>get.value(i))) - .set('ai',target=>{ - const att=get.attitude(get.player(),target); - const chosenNum=ui.selected.targets.length,values=get.event('values'); - if(values[chosenNum]>0) return att; - return 0.01-att; - }) - .forResult('bool','targets'); - if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} - if(bool){ - const gain_list=[],givenCards=[]; - targets.forEach((target,i)=>{ - player.line(target,'green'); - gain_list.push([target,links[i]]); - givenCards.push(links[i]); - game.log(player,'将',links[i],'交给了',target); - }); - event.getParent().set('givenCards',givenCards); - await game.loseAsync({ - gain_list, - player:player, - cards:givenCards, - giver:player, - animate:'gain2', - }).setContent('gaincardMultiple'); - const toDraw=player.getAllHistory('useSkill',evt=>{ - const evtx=evt.event; - return evt.skill==='dcjichou'&&evtx.givenCards&&evtx.givenCards.length; - })[0].event.givenCards.length; - await game.asyncDelayx(); - await player.draw(toDraw); - } + .set( + "values", + links.map((i) => get.value(i)) + ) + .set("ai", (target) => { + const att = get.attitude(get.player(), target); + const chosenNum = ui.selected.targets.length, + values = get.event("values"); + if (values[chosenNum] > 0) return att; + return 0.01 - att; + }) + .forResult("bool", "targets"); + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + if (bool) { + const gain_list = [], + givenCards = []; + targets.forEach((target, i) => { + player.line(target, "green"); + gain_list.push([target, links[i]]); + givenCards.push(links[i]); + game.log(player, "将", links[i], "交给了", target); + }); + event.getParent().set("givenCards", givenCards); + await game + .loseAsync({ + gain_list, + player: player, + cards: givenCards, + giver: player, + animate: "gain2", + }) + .setContent("gaincardMultiple"); + const toDraw = player.getAllHistory("useSkill", (evt) => { + const evtx = evt.event; + return evt.skill === "dcjichou" && evtx.givenCards && evtx.givenCards.length; + })[0].event.givenCards.length; + await game.asyncDelayx(); + await player.draw(toDraw); + } + } + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } }, }, - dcmouli:{ - audio:2, - trigger:{player:'phaseEnd'}, - filter(event,player){ - const names=[]; - player.checkAllHistory('useSkill',evt=>{ - if(evt.skill!=='dcjichou') return; - const evtx=evt.event; - if(evtx.givenCards) names.addArray(evtx.givenCards.map(card=>get.name(card,false))); + dcmouli: { + audio: 2, + trigger: { player: "phaseEnd" }, + filter(event, player) { + const names = []; + player.checkAllHistory("useSkill", (evt) => { + if (evt.skill !== "dcjichou") return; + const evtx = evt.event; + if (evtx.givenCards) + names.addArray(evtx.givenCards.map((card) => get.name(card, false))); }); - return names.length>=5; + return names.length >= 5; }, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'water', - derivation:['dczifu'], - async content(event,trigger,player){ - player.awakenSkill('dcmouli'); + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + derivation: ["dczifu"], + async content(event, trigger, player) { + player.awakenSkill("dcmouli"); await player.gainMaxHp(); await player.recover(); - await player.addSkills('dczifu'); + await player.addSkills("dczifu"); }, }, - dczifu:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - forced:true, - async content(event,trigger,player){ - const maxLimit=Math.min(5,player.maxHp); - let count=player.countCards('h'); - if(countevt.getParent(2)===event)) return; - count=player.countCards('h'); - const toKeepCount=player.getCards('h').map(card=>get.name(card)).unique(); - if(count>toKeepCount){ - const [bool,cards]=await player.chooseCard('自缚:选择要保留的手牌','选择不同牌名的手牌各一张,然后弃置其余手牌',toKeepCount) - .set('filterCard',card=>{ - if(!ui.selected.cards.length) return true; - const name=get.name(card,player); - if(ui.selected.cards.some(card=>get.name(card,player)===name)) return false; + if (!player.hasHistory("gain", (evt) => evt.getParent(2) === event)) return; + count = player.countCards("h"); + const toKeepCount = player + .getCards("h") + .map((card) => get.name(card)) + .unique(); + if (count > toKeepCount) { + const [bool, cards] = await player + .chooseCard( + "自缚:选择要保留的手牌", + "选择不同牌名的手牌各一张,然后弃置其余手牌", + toKeepCount + ) + .set("filterCard", (card) => { + if (!ui.selected.cards.length) return true; + const name = get.name(card, player); + if (ui.selected.cards.some((card) => get.name(card, player) === name)) + return false; return true; }) - .set('complexCard',true) - .set('ai',get.value) - .forResult('bool','cards'); - if(!bool) return; - const toDiscard=player.getCards('h').removeArray(cards); - if(toDiscard.length) player.discard(toDiscard); + .set("complexCard", true) + .set("ai", get.value) + .forResult("bool", "cards"); + if (!bool) return; + const toDiscard = player.getCards("h").removeArray(cards); + if (toDiscard.length) player.discard(toDiscard); } }, - ai:{ - halfneg:true, + ai: { + halfneg: true, }, }, //蒋济 - dcshiju:{ - audio:2, - global:'dcshiju_global', - subSkill:{ - global:{ - audio:'dcshiju', - forceaudio:true, - enable:'phaseUse', - usable:1, - filter(event,player){ - return game.hasPlayer(current=>{ - if(current==player||!current.hasSkill('dcshiju')) return false; - return player.countCards('he'); + dcshiju: { + audio: 2, + global: "dcshiju_global", + subSkill: { + global: { + audio: "dcshiju", + forceaudio: true, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer((current) => { + if (current == player || !current.hasSkill("dcshiju")) return false; + return player.countCards("he"); }); }, - filterTarget(card,player,target){ - return target!=player&&target.hasSkill('dcshiju'); + filterTarget(card, player, target) { + return target != player && target.hasSkill("dcshiju"); }, - selectTarget(){ - const num=game.countPlayer(current=>{ - return current.hasSkill('dcshiju'); + selectTarget() { + const num = game.countPlayer((current) => { + return current.hasSkill("dcshiju"); }); - return num>1?1:-1; + return num > 1 ? 1 : -1; }, - filterCard:true, - position:'he', - check(card){ - const player=get.player(); - if(get.type(card)==='equip'){ - const subtype=get.subtype(card); - let valueFix=0; - if(game.hasPlayer(current=>{ - if(current==player||!current.hasSkill('dcshiju')) return false; - if(current.hasUseTarget(card)&&!player.countEmptySlot(subtype)) return true; - })) valueFix+=5; - if(player.countCards('he',{subtype})>1){ - return valueFix+12-get.equipValue(card); + filterCard: true, + position: "he", + check(card) { + const player = get.player(); + if (get.type(card) === "equip") { + const subtype = get.subtype(card); + let valueFix = 0; + if ( + game.hasPlayer((current) => { + if (current == player || !current.hasSkill("dcshiju")) return false; + if (current.hasUseTarget(card) && !player.countEmptySlot(subtype)) + return true; + }) + ) + valueFix += 5; + if (player.countCards("he", { subtype }) > 1) { + return valueFix + 12 - get.equipValue(card); } - return valueFix+6-get.value(card); + return valueFix + 6 - get.value(card); } - return 4-get.value(card); + return 4 - get.value(card); }, - prompt(){ - const list=game.filterPlayer(current=>{ - return current.hasSkill('dcshiju'); + prompt() { + const list = game.filterPlayer((current) => { + return current.hasSkill("dcshiju"); }); - return `将一张牌交给${get.translation(list)}${list.length>1?'中的一人':''},若此牌为装备牌,其可以使用之,且你本回合的攻击范围+X(X为其装备区的牌数)。若其以此法替换了装备,你与其各摸两张牌。`; + return `将一张牌交给${get.translation(list)}${ + list.length > 1 ? "中的一人" : "" + },若此牌为装备牌,其可以使用之,且你本回合的攻击范围+X(X为其装备区的牌数)。若其以此法替换了装备,你与其各摸两张牌。`; }, - discard:false, - lose:false, - prepare(cards,player,targets){ - player.$give(cards,targets[0],false); + discard: false, + lose: false, + prepare(cards, player, targets) { + player.$give(cards, targets[0], false); }, - async content(event,trigger,player){ - const card=event.cards[0],target=event.target; - await player.give(card,target); - if(!target.getCards('h').includes(card)||get.type(card)!=='equip') return; - const bool=await target.chooseUseTarget(card).forResultBool(); - if(!bool) return; - const count=target.countCards('e'); - if(count>0){ - player.addTempSkill('dcshiju_range'); - player.addMark('dcshiju_range',count,false); - if(target.hasHistory('lose',evt=>{ - return evt.getParent().name==='equip'&&evt.getParent(5)===event&&evt.es&&evt.es.length>0; - })){ - for(const current of [player,target]) await current.draw(2); + async content(event, trigger, player) { + const card = event.cards[0], + target = event.target; + await player.give(card, target); + if (!target.getCards("h").includes(card) || get.type(card) !== "equip") return; + const bool = await target.chooseUseTarget(card).forResultBool(); + if (!bool) return; + const count = target.countCards("e"); + if (count > 0) { + player.addTempSkill("dcshiju_range"); + player.addMark("dcshiju_range", count, false); + if ( + target.hasHistory("lose", (evt) => { + return ( + evt.getParent().name === "equip" && + evt.getParent(5) === event && + evt.es && + evt.es.length > 0 + ); + }) + ) { + for (const current of [player, target]) await current.draw(2); } } }, - ai:{ - order:10, - result:{ - target(player,target){ - const card=ui.selected.cards[0]; - if(!card) return; - if(target.hasSkillTag('nogain')&&get.type(card)!='equip') return 0; - if(card.name=='du'&&target.hasSkillTag('nodu')) return 0; - if(get.value(card)<0) return -5; - const nh=target.countCards('h'); - return Math.max(1,5-nh); + ai: { + order: 10, + result: { + target(player, target) { + const card = ui.selected.cards[0]; + if (!card) return; + if (target.hasSkillTag("nogain") && get.type(card) != "equip") return 0; + if (card.name == "du" && target.hasSkillTag("nodu")) return 0; + if (get.value(card) < 0) return -5; + const nh = target.countCards("h"); + return Math.max(1, 5 - nh); }, }, }, }, - range:{ - charlotte:true, - onremove:true, - mod:{ - attackRange:function(player,num){ - return num+player.countMark('dcshiju_range'); + range: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("dcshiju_range"); }, }, - intro:{content:'本回合攻击范围+#'}, + intro: { content: "本回合攻击范围+#" }, }, }, }, - dcyingshi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(!event.isFirstTarget) return false; - if(get.type(event.card)!=='trick') return false; - const evt=event.getParent(); - const evts=game.getGlobalHistory('useCard',null,evt).slice().remove(evt); - return event.targets.some(target=>{ - return evts.some(evt=>evt.targets.includes(target)); + dcyingshi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + if (get.type(event.card) !== "trick") return false; + const evt = event.getParent(); + const evts = game.getGlobalHistory("useCard", null, evt).slice().remove(evt); + return event.targets.some((target) => { + return evts.some((evt) => evt.targets.includes(target)); }); }, - direct:true, - async content(event,trigger,player){ - const evt=trigger.getParent(); - const evts=game.getGlobalHistory('useCard',null,evt).slice().remove(evt); - const chooseableTargets=trigger.targets.filter(target=>{ - return evts.some(evt=>evt.targets.includes(target)); + direct: true, + async content(event, trigger, player) { + const evt = trigger.getParent(); + const evts = game.getGlobalHistory("useCard", null, evt).slice().remove(evt); + const chooseableTargets = trigger.targets.filter((target) => { + return evts.some((evt) => evt.targets.includes(target)); }); - const result=await player.chooseTarget() - .set('prompt',get.prompt('dcyingshi')) - .set('prompt2',`令一名可选角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation(trigger.card.name)};⒉弃置${get.cnNumber(player.countCards('e'))}张牌,此牌对其无效。`) - .set('filterTarget',(card,player,target)=>{ - return get.event('targets').includes(target); + const result = await player + .chooseTarget() + .set("prompt", get.prompt("dcyingshi")) + .set( + "prompt2", + `令一名可选角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation( + trigger.card.name + )};⒉弃置${get.cnNumber(player.countCards("e"))}张牌,此牌对其无效。` + ) + .set("filterTarget", (card, player, target) => { + return get.event("targets").includes(target); }) - .set('targets',chooseableTargets) - .set('toFriends',(()=>{ - const isPositive=chooseableTargets.some(current=>{ - return get.effect(current,trigger.card,trigger.player,player)>0; - }),isNegative=chooseableTargets.some(current=>{ - return get.effect(current,trigger.card,trigger.player,player)<-5; - }); - if((player.hasSkill('dcyingshi_choice1')||player.countCards('e')<2)&&isNegative) return true; - if(!player.hasSkill('dcyingshi_choice1')&&(get.tag(trigger.card,'norepeat')&&isNegative||isPositive)) return true; - return false; - })()) - .set('ai',target=>{ - const player=get.player(),count=player.countCards('e'),att=get.attitude(player,target); - if(att>0&&get.event('toFriends')){ - if(target.countCards('he',card=>get.value(card)<5) { + const isPositive = chooseableTargets.some((current) => { + return get.effect(current, trigger.card, trigger.player, player) > 0; + }), + isNegative = chooseableTargets.some((current) => { + return get.effect(current, trigger.card, trigger.player, player) < -5; + }); + if ( + (player.hasSkill("dcyingshi_choice1") || player.countCards("e") < 2) && + isNegative + ) + return true; + if ( + !player.hasSkill("dcyingshi_choice1") && + ((get.tag(trigger.card, "norepeat") && isNegative) || isPositive) + ) + return true; + return false; + })() + ) + .set("ai", (target) => { + const player = get.player(), + count = player.countCards("e"), + att = get.attitude(player, target); + if (att > 0 && get.event("toFriends")) { + if (target.countCards("he", (card) => get.value(card) < 5) < count) return 0; return att; } - if(player.hasSkill('dcyingshi_choice1')&&!count) return 0; - return -get.attitude(player,target); + if (player.hasSkill("dcyingshi_choice1") && !count) return 0; + return -get.attitude(player, target); }) .forResult(); - if(!result.bool) return; - const target=result.targets[0]; - player.logSkill('dcyingshi',target); + if (!result.bool) return; + const target = result.targets[0]; + player.logSkill("dcyingshi", target); let bool; - if(!player.hasSkill(`dcyingshi_choice2`)){ - const count=player.countCards('e'),forced=player.hasSkill('dcyingshi_choice1'); - if(count>0){ - const prompt=`###${get.translation(player)}对你发动了【应时】###${forced?'请':'是否'}弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${forced?'。':'?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。'}`; - bool=await target.chooseToDiscard(prompt,count,forced,'he').set('ai',card=>{ - if(get.event('goon')) return 5.5-get.value(card); - return 0; - }).set('goon',!get.tag(trigger.card,'norepeat')&&get.effect(target,trigger.card,trigger.player,target)<-5).forResultBool(); - } - else bool=false; - } - else bool=player.hasSkill('dcyingshi_choice1'); - if(bool){ + if (!player.hasSkill(`dcyingshi_choice2`)) { + const count = player.countCards("e"), + forced = player.hasSkill("dcyingshi_choice1"); + if (count > 0) { + const prompt = `###${get.translation(player)}对你发动了【应时】###${ + forced ? "请" : "是否" + }弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${ + forced ? "。" : "?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。" + }`; + bool = await target + .chooseToDiscard(prompt, count, forced, "he") + .set("ai", (card) => { + if (get.event("goon")) return 5.5 - get.value(card); + return 0; + }) + .set( + "goon", + !get.tag(trigger.card, "norepeat") && + get.effect(target, trigger.card, trigger.player, target) < -5 + ) + .forResultBool(); + } else bool = false; + } else bool = player.hasSkill("dcyingshi_choice1"); + if (bool) { trigger.excluded.add(target); - } - else{ - player.when({global:'useCardAfter'}) - .filter(evt=>evt===trigger.getParent()) + } else { + player + .when({ global: "useCardAfter" }) + .filter((evt) => evt === trigger.getParent()) .vars({ - targetx:target, - cardx:{ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, - storage:{dcyingshi:true}, + targetx: target, + cardx: { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + storage: { dcyingshi: true }, }, }) - .then(()=>{ - const next=player.useCard(get.copy(cardx),targetx,false); - if(trigger.addedTarget) next.addedTarget=trigger.addedTarget; - if(trigger.addedTargets&&trigger.addedTargets.length) next.addedTargets=trigger.addedTargets.slice(0); + .then(() => { + const next = player.useCard(get.copy(cardx), targetx, false); + if (trigger.addedTarget) next.addedTarget = trigger.addedTarget; + if (trigger.addedTargets && trigger.addedTargets.length) + next.addedTargets = trigger.addedTargets.slice(0); }); } - player.addTempSkill(`dcyingshi_choice${bool+1}`); + player.addTempSkill(`dcyingshi_choice${bool + 1}`); }, - subSkill:{ - choice1:{charlotte:true}, - choice2:{charlotte:true}, + subSkill: { + choice1: { charlotte: true }, + choice2: { charlotte: true }, }, }, //公孙修 - dcgangu:{ - audio:2, - trigger:{global:'loseHpAfter'}, - filter(event,player){ - return event.player!==player; + dcgangu: { + audio: 2, + trigger: { global: "loseHpAfter" }, + filter(event, player) { + return event.player !== player; }, - usable:1, - forced:true, - async content(event,trigger,player){ + usable: 1, + forced: true, + async content(event, trigger, player) { await player.draw(2); await player.loseHp(); }, }, - dckuizhen:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(current=>{ - return lib.skill.dckuizhen.filterTarget(null,player,current); + dckuizhen: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer((current) => { + return lib.skill.dckuizhen.filterTarget(null, player, current); }); }, - filterTarget(card,player,target){ - return target.countCards('h')>player.countCards('h')||target.getHp()>player.getHp(); + filterTarget(card, player, target) { + return target.countCards("h") > player.countCards("h") || target.getHp() > player.getHp(); }, - usable:1, - forced:true, - async content(event,trigger,player){ - const {target}=event,juedou=new lib.element.VCard({name:'juedou'}); - if(target.canUse(juedou,player,false)){ - await target.useCard(juedou,player,'noai'); + usable: 1, + forced: true, + async content(event, trigger, player) { + const { target } = event, + juedou = new lib.element.VCard({ name: "juedou" }); + if (target.canUse(juedou, player, false)) { + await target.useCard(juedou, player, "noai"); } - if(player.hasHistory('damage',evt=>{ - return evt.getParent(3)===event; - })){ + if ( + player.hasHistory("damage", (evt) => { + return evt.getParent(3) === event; + }) + ) { await player.viewHandcards(target); - const shas=target.getGainableCards(player,'h').filter(card=>get.name(card)==='sha'); - if(shas.length){ - player.addTempSkill('dckuizhen_effect'); - await player.gain(shas,'give',target).gaintag.add('dckuizhen'); + const shas = target + .getGainableCards(player, "h") + .filter((card) => get.name(card) === "sha"); + if (shas.length) { + player.addTempSkill("dckuizhen_effect"); + await player.gain(shas, "give", target).gaintag.add("dckuizhen"); } - } - else{ + } else { await target.loseHp(); } }, - ai:{ - result:{ - target(player,target){ - const [juedouEff,loseEff]=[ - get.effect(player,{name:'juedou'},target,player), - get.effect(target,{name:'losehp'},target,player) + ai: { + result: { + target(player, target) { + const [juedouEff, loseEff] = [ + get.effect(player, { name: "juedou" }, target, player), + get.effect(target, { name: "losehp" }, target, player), ]; - if(juedouEff>0) return loseEff*get.attitude(player,target)/10; + if (juedouEff > 0) return (loseEff * get.attitude(player, target)) / 10; return 0; }, - } + }, }, - subSkill:{ - effect:{ - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - charlotte:true, - filter:function(event,player){ - if(event.addCount===false) return false; - return player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - for(const i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dckuizhen')) return true; + subSkill: { + effect: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + charlotte: true, + filter: function (event, player) { + if (event.addCount === false) return false; + return player.hasHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + for (const i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dckuizhen")) return true; } return false; }); }, - async content(event,trigger,player){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(typeof stat[name]=='number') stat[name]--; + async content(event, trigger, player) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; }, - mod:{ - cardUsable(card){ - if(!card.cards) return; - if(card.cards.some(card=>card.hasGaintag('dckuizhen'))) return Infinity; + mod: { + cardUsable(card) { + if (!card.cards) return; + if (card.cards.some((card) => card.hasGaintag("dckuizhen"))) return Infinity; }, }, - } - } + }, + }, }, //刘理 - dcfuli:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return player.countDiscardableCards(player,'h'); + dcfuli: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countDiscardableCards(player, "h"); }, - usable:1, - async content(event,trigger,player){ - await player.showHandcards(get.translation(player)+'发动了【抚黎】'); - const getNum=(type)=>{ - let num=['basic','trick','equip'].indexOf(type); - if(num===-1) num=3; + usable: 1, + async content(event, trigger, player) { + await player.showHandcards(get.translation(player) + "发动了【抚黎】"); + const getNum = (type) => { + let num = ["basic", "trick", "equip"].indexOf(type); + if (num === -1) num = 3; return num; }; - const types=player.getDiscardableCards(player,'h').reduce((list,card)=>{ - return list.add(get.type2(card)); - },[]).sort((a,b)=>getNum(a)-getNum(b)); - if(types.length){ - const {result:{control}}=await player.chooseControl(types).set('ai',()=>{ - const player=get.event('player'),types=get.event('controls').slice(); - const getNum=(type)=>{ - const cards=player.getDiscardableCards(player,'h').filter(card=>get.type2(card)==type); - const countCards=(target,player,cards)=>{ - return target.countCards('h')-(target==player?cards.length:0); + const types = player + .getDiscardableCards(player, "h") + .reduce((list, card) => { + return list.add(get.type2(card)); + }, []) + .sort((a, b) => getNum(a) - getNum(b)); + if (types.length) { + const { + result: { control }, + } = await player + .chooseControl(types) + .set("ai", () => { + const player = get.event("player"), + types = get.event("controls").slice(); + const getNum = (type) => { + const cards = player + .getDiscardableCards(player, "h") + .filter((card) => get.type2(card) == type); + const countCards = (target, player, cards) => { + return target.countCards("h") - (target == player ? cards.length : 0); + }; + const max = game + .findPlayer((target) => { + return !game.hasPlayer((target2) => { + return ( + countCards(target2, player, cards) > + countCards(target, player, cards) + ); + }); + }) + .countCards("h"); + return ( + Math.min( + max, + cards.reduce((sum, card) => sum + get.cardNameLength(card), 0) + ) / cards.length + ); }; - const max=game.findPlayer(target=>{ - return !game.hasPlayer(target2=>{ - return countCards(target2,player,cards)>countCards(target,player,cards); - }); - }).countCards('h'); - return Math.min(max,cards.reduce((sum,card)=>sum+get.cardNameLength(card),0))/cards.length; - }; - return types.sort((a,b)=>{ - return getNum(b)-getNum(a); - })[0]; - }).set('prompt','弃置一种类别的所有手牌,然后摸这些牌的名字字数之和的牌'); - if(control){ - const cards=player.getDiscardableCards(player,'h').filter(card=>get.type2(card)==control); + return types.sort((a, b) => { + return getNum(b) - getNum(a); + })[0]; + }) + .set("prompt", "弃置一种类别的所有手牌,然后摸这些牌的名字字数之和的牌"); + if (control) { + const cards = player + .getDiscardableCards(player, "h") + .filter((card) => get.type2(card) == control); await player.discard(cards); - const max=game.findPlayer(target=>target.isMaxHandcard()).countCards('h'); - const num=Math.min(max,cards.reduce((sum,card)=>sum+get.cardNameLength(card),0)); - if(num) await player.draw(num); - if(cards.some(card=>card.name!='shandian'&&get.tag(card,'damage'))){ - const {result:{bool,targets}}=await player.chooseTarget('抚黎:是否令一名角色的攻击范围-1直到你的下个回合开始?') - .set('ai',target=>{ - const player=get.event('player'),num=target.getAttackRange(); - return -get.sgn(get.attitude(player,target))*(target.getAttackRange()+(num<=0?(-num+0.5):num)); - }); - if(bool){ - const target=targets[0]; + const max = game.findPlayer((target) => target.isMaxHandcard()).countCards("h"); + const num = Math.min( + max, + cards.reduce((sum, card) => sum + get.cardNameLength(card), 0) + ); + if (num) await player.draw(num); + if (cards.some((card) => card.name != "shandian" && get.tag(card, "damage"))) { + const { + result: { bool, targets }, + } = await player + .chooseTarget("抚黎:是否令一名角色的攻击范围-1直到你的下个回合开始?") + .set("ai", (target) => { + const player = get.event("player"), + num = target.getAttackRange(); + return ( + -get.sgn(get.attitude(player, target)) * + (target.getAttackRange() + (num <= 0 ? -num + 0.5 : num)) + ); + }); + if (bool) { + const target = targets[0]; player.line(target); - target.addSkill('dcfuli_range'); - target.addMark('dcfuli_range',1,false); - player.when(['phaseBegin','dieBegin']).then(()=>{ - target.removeMark('dcfuli_range',1,false); - if(!target.hasMark('dcfuli_range')) target.removeSkill('dcfuli_range'); - }).vars({target:target}); + target.addSkill("dcfuli_range"); + target.addMark("dcfuli_range", 1, false); + player + .when(["phaseBegin", "dieBegin"]) + .then(() => { + target.removeMark("dcfuli_range", 1, false); + if (!target.hasMark("dcfuli_range")) + target.removeSkill("dcfuli_range"); + }) + .vars({ target: target }); } } } } }, - ai:{ - order:1, - result:{ - player(player){ - const types=player.getDiscardableCards(player,'h').reduce((list,card)=>{ + ai: { + order: 1, + result: { + player(player) { + const types = player.getDiscardableCards(player, "h").reduce((list, card) => { return list.add(get.type2(card)); - },[]); - if(!types.some(type=>{ - const cards=player.getDiscardableCards(player,'h').filter(card=>get.type2(card)==type); - const countCards=(target,player,cards)=>{ - return target.countCards('h')-(target==player?cards.length:0); - }; - return !game.filterPlayer(target=>{ - return !game.hasPlayer(target2=>{ - return countCards(target2,player,cards)>countCards(target,player,cards); - }); - }).includes(player); - })) return 0; + }, []); + if ( + !types.some((type) => { + const cards = player + .getDiscardableCards(player, "h") + .filter((card) => get.type2(card) == type); + const countCards = (target, player, cards) => { + return target.countCards("h") - (target == player ? cards.length : 0); + }; + return !game + .filterPlayer((target) => { + return !game.hasPlayer((target2) => { + return ( + countCards(target2, player, cards) > + countCards(target, player, cards) + ); + }); + }) + .includes(player); + }) + ) + return 0; return 1; }, }, }, - subSkill:{ - range:{ - charlotte:true, - onremove:true, - mod:{ - attackRange(player,num){ - return num-player.countMark('dcfuli_range'); + subSkill: { + range: { + charlotte: true, + onremove: true, + mod: { + attackRange(player, num) { + return num - player.countMark("dcfuli_range"); }, }, - marktext:' - ', - intro:{content:'攻击范围-#'}, + marktext: " - ", + intro: { content: "攻击范围-#" }, }, }, }, - dcdehua:{ - audio:2, - trigger:{global:'roundStart'}, - forced:true, - async content(event,trigger,player){ - const list=lib.inpile.filter(name=>{ - if(get.type(name)==='delay') return false; - const card=new lib.element.VCard({name:name}); - return get.tag(card,'damage')&&player.hasUseTarget(card); + dcdehua: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + async content(event, trigger, player) { + const list = lib.inpile.filter((name) => { + if (get.type(name) === "delay") return false; + const card = new lib.element.VCard({ name: name }); + return get.tag(card, "damage") && player.hasUseTarget(card); }); - if(list.length){ - const {result:{bool,links}}=await player.chooseButton(['###德化###
    视为使用一张仍可以使用的伤害类卡牌
    ',[list,'vcard']],true).set('ai',button=>{ - const name=button.link[2],player=get.player(); - let value=player.getUseValue({name,isCard:true},null,true); - if(player.countCards('h',card=>get.name(card)===name&&player.hasUseTarget(card))) value/=3; - if(name==='sha') value/=2; - if(player.getStorage('dcdehua').includes('sha')) value=Math.max(0.1,value); - return value; - }); - if(bool){ - const name=links[0][2],card=new lib.element.VCard({name:name}); - await player.chooseUseTarget(card,true); - player.markAuto('dcdehua',[name]); + if (list.length) { + const { + result: { bool, links }, + } = await player + .chooseButton( + [ + '###德化###
    视为使用一张仍可以使用的伤害类卡牌
    ', + [list, "vcard"], + ], + true + ) + .set("ai", (button) => { + const name = button.link[2], + player = get.player(); + let value = player.getUseValue({ name, isCard: true }, null, true); + if ( + player.countCards( + "h", + (card) => get.name(card) === name && player.hasUseTarget(card) + ) + ) + value /= 3; + if (name === "sha") value /= 2; + if (player.getStorage("dcdehua").includes("sha")) + value = Math.max(0.1, value); + return value; + }); + if (bool) { + const name = links[0][2], + card = new lib.element.VCard({ name: name }); + await player.chooseUseTarget(card, true); + player.markAuto("dcdehua", [name]); } } - if(!lib.inpile.some(name=>{ - if(get.type(name)==='delay') return false; - const card=new lib.element.VCard({name:name}); - return get.tag(card,'damage')&&!player.getStorage('dcdehua').includes(name); - })) player.removeSkills('dcdehua'); + if ( + !lib.inpile.some((name) => { + if (get.type(name) === "delay") return false; + const card = new lib.element.VCard({ name: name }); + return get.tag(card, "damage") && !player.getStorage("dcdehua").includes(name); + }) + ) + player.removeSkills("dcdehua"); }, - mod:{ - maxHandcard(player,num){ - return num+player.getStorage('dcdehua').length; + mod: { + maxHandcard(player, num) { + return num + player.getStorage("dcdehua").length; }, - cardEnabled(card,player){ - if(player.getStorage('dcdehua').includes(card.name)&&(get.position(card)=='h'||card.cards&&card.cards.some(i=>get.position(i)=='h'))) return false; + cardEnabled(card, player) { + if ( + player.getStorage("dcdehua").includes(card.name) && + (get.position(card) == "h" || + (card.cards && card.cards.some((i) => get.position(i) == "h"))) + ) + return false; }, - cardSavable(card,player){ - if(player.getStorage('dcdehua').includes(card.name)&&(get.position(card)=='h'||card.cards&&card.cards.some(i=>get.position(i)=='h'))) return false; + cardSavable(card, player) { + if ( + player.getStorage("dcdehua").includes(card.name) && + (get.position(card) == "h" || + (card.cards && card.cards.some((i) => get.position(i) == "h"))) + ) + return false; }, - aiValue(player,card){ - if(player.getStorage('dcdehua').includes(get.name(card))) return 0; + aiValue(player, card) { + if (player.getStorage("dcdehua").includes(get.name(card))) return 0; }, - aiUseful(){ - return lib.skill.dcdehua.mod.aiValue.apply(this,arguments); + aiUseful() { + return lib.skill.dcdehua.mod.aiValue.apply(this, arguments); }, }, - intro:{ - content(storage){ - return '
  • 手牌上限+'+storage.length+'
  • 不能从手牌中使用'+get.translation(storage); + intro: { + content(storage) { + return ( + "
  • 手牌上限+" + + storage.length + + "
  • 不能从手牌中使用" + + get.translation(storage) + ); }, }, }, //蒋琬费祎 - dcshengxi:{ - inherit:'reshengxi', - trigger:{player:'phaseDiscardEnd'}, + dcshengxi: { + inherit: "reshengxi", + trigger: { player: "phaseDiscardEnd" }, }, - dcshoucheng:{ - audio:'shoucheng', - global:'dcshoucheng_ai', - trigger:{ - global:['equipAfter','addJudgeAfter','loseAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dcshoucheng: { + audio: "shoucheng", + global: "dcshoucheng_ai", + trigger: { + global: [ + "equipAfter", + "addJudgeAfter", + "loseAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter(event,player){ - const target=_status.currentPhase; - return game.hasPlayer(current=>{ - if(target&¤t==target) return false; - let evt=event.getl(current); - return evt&&evt.hs&&evt.hs.length&¤t.countCards('h')==0; + filter(event, player) { + const target = _status.currentPhase; + return game.hasPlayer((current) => { + if (target && current == target) return false; + let evt = event.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; }); }, - direct:true, - async content(event,trigger,player){ - const targetx=_status.currentPhase; - const targets=game.filterPlayer(current=>{ - if(targetx&¤t==targetx) return false; - let evt=trigger.getl(current); - return evt&&evt.hs&&evt.hs.length&¤t.countCards('h')==0; - }).sortBySeat(targetx||player); - for(const target of targets){ - if(!target.isIn()) continue; - const {result:{bool}}=await player.chooseBool(get.prompt2('dcshoucheng',target)).set('choice',get.attitude(player,target)>0); - if(bool){ - player.logSkill('dcshoucheng',target); - if(target!=player) player.addExpose(0.2); + direct: true, + async content(event, trigger, player) { + const targetx = _status.currentPhase; + const targets = game + .filterPlayer((current) => { + if (targetx && current == targetx) return false; + let evt = trigger.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; + }) + .sortBySeat(targetx || player); + for (const target of targets) { + if (!target.isIn()) continue; + const { + result: { bool }, + } = await player + .chooseBool(get.prompt2("dcshoucheng", target)) + .set("choice", get.attitude(player, target) > 0); + if (bool) { + player.logSkill("dcshoucheng", target); + if (target != player) player.addExpose(0.2); target.draw(2); } } }, - ai:{ - threaten(player,target){ - return Math.sqrt(game.countPlayer(i=>{ - return get.attitude(target,i)>0; - })); + ai: { + threaten(player, target) { + return Math.sqrt( + game.countPlayer((i) => { + return get.attitude(target, i) > 0; + }) + ); }, }, - subSkill:{ - ai:{ - ai:{ - noh:true, - skillTagFilter(player,tag,arg){ - if(player===_status.currentPhase||player.countCards('h')!=1) return false; - return game.hasPlayer(current=>{ - return current.hasSkill('dcshoucheng')&&get.attitude(current,player)>0; + subSkill: { + ai: { + ai: { + noh: true, + skillTagFilter(player, tag, arg) { + if (player === _status.currentPhase || player.countCards("h") != 1) + return false; + return game.hasPlayer((current) => { + return ( + current.hasSkill("dcshoucheng") && get.attitude(current, player) > 0 + ); }); - } - } - } - } + }, + }, + }, + }, }, //乐大乔 - dczixi:{ - init(){ - game.addGlobalSkill('dczixi_judge'); - game.broadcastAll(()=>lib.skill.dczixi.video()); + dczixi: { + init() { + game.addGlobalSkill("dczixi_judge"); + game.broadcastAll(() => lib.skill.dczixi.video()); }, - video(){ - const list=lib.skill.dczixi.zixiList; - for(const name of list){ - const namex='dczixi_'+name; - if(!lib.card[namex]){ - lib.card[namex]={ - type:'special_delay', - fullskin:true, - noEffect:true, - wuxieable:false, + video() { + const list = lib.skill.dczixi.zixiList; + for (const name of list) { + const namex = "dczixi_" + name; + if (!lib.card[namex]) { + lib.card[namex] = { + type: "special_delay", + fullskin: true, + noEffect: true, + wuxieable: false, }; - lib.card[namex].cardimage=name; - lib.translate[namex]=lib.translate[name]+'·姊希'; - lib.translate[namex+'_info']='由【姊希】技能创造的无效果【'+lib.translate[name]+'】'; + lib.card[namex].cardimage = name; + lib.translate[namex] = lib.translate[name] + "·姊希"; + lib.translate[namex + "_info"] = + "由【姊希】技能创造的无效果【" + lib.translate[name] + "】"; } } }, - audio:2, - trigger:{player:['phaseUseBegin','phaseUseEnd']}, - filter(event,player){ - return player.countCards('h',card=>{ - return card.hasGaintag('dcqiqin_tag')&&lib.skill.dczixi.zixiList.some(name=>{ - return game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card]))); - }); - })>0; + audio: 2, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + filter(event, player) { + return ( + player.countCards("h", (card) => { + return ( + card.hasGaintag("dcqiqin_tag") && + lib.skill.dczixi.zixiList.some((name) => { + return game.hasPlayer((target) => + target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card])) + ); + }) + ); + }) > 0 + ); }, - zixiList:['lebu','bingliang','shandian'], - direct:true, - async content(event,trigger,player){ - game.addVideo('skill',player,['dczixi',[]]); - const names=lib.skill.dczixi.zixiList.filter(name=>{ - return player.countCards('h',card=>{ - return card.hasGaintag('dcqiqin_tag')&&game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card]))); + zixiList: ["lebu", "bingliang", "shandian"], + direct: true, + async content(event, trigger, player) { + game.addVideo("skill", player, ["dczixi", []]); + const names = lib.skill.dczixi.zixiList.filter((name) => { + return player.countCards("h", (card) => { + return ( + card.hasGaintag("dcqiqin_tag") && + game.hasPlayer((target) => + target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card])) + ) + ); }); }); - let map={}; - for(const name of names){ - map[get.translation(name)]=name; + let map = {}; + for (const name of names) { + map[get.translation(name)] = name; } - const {result:{bool,links}}=await player.chooseButton(2,[ - '###'+get.prompt('dczixi')+'###
    将一张“琴”以你选择的牌名置于一名角色的判定区
    ', - player.getCards('h'), - [Object.keys(map),'tdnodes'], - ]).set('filterButton',button=>{ - const type=typeof button.link,card=button.link; - if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; - if(type=='string') return true; - return card.hasGaintag('dcqiqin_tag')&&lib.skill.dczixi.zixiList.some(name=>{ - return game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card]))); - }); - }).set('ai',button=>{ - const player=get.event('player'),list=Object.keys(get.event('map')); - if(typeof button.link=='string'){ - const card=player.getCards('h',card=>{ - if(get.value(card)>=7) return false; - return card.hasGaintag('dcqiqin_tag')&&game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card]))); - }).sort((a,b)=>get.value(a)-get.value(b))[0]; - if(game.hasPlayer(current=>{ - return get.attitude(player,current)<0&&lib.skill.dczixi.zixiList.some(name=>current.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card]))); - })) return list.indexOf(button.link)+1; - return 1/(list.indexOf(button.link)+1); - } - return 7-get.value(button.link); - }).set('map',map); - if(bool){ - const name=links.find(i=>typeof i=='string'),card=links.find(j=>j!=name),cardname=map[name]; - const {result:{bool,targets}}=await player.chooseTarget('请选择【'+name+'('+get.translation(card)+')】置入的目标',(cardx,player,target)=>{ - return target.canAddJudge(get.autoViewAs({name:'dczixi_'+get.event('cardname')},[get.event('card')])); - },true).set('ai',target=>{ - const player=get.event('player'),card=get.event('card'); - if(game.hasPlayer(current=>{ - return get.attitude(player,current)<0&¤t.canAddJudge(get.autoViewAs({name:'dczixi_'+get.event('cardname')},[card])); - })) return -target.countCards('j')-1; - return target.countCards('j')+1; - }).set('card',card).set('cardname',cardname); - if(bool){ - const target=targets[0]; - player.logSkill('dczixi',target); - player.$give(card,target,false); + const { + result: { bool, links }, + } = await player + .chooseButton(2, [ + "###" + + get.prompt("dczixi") + + '###
    将一张“琴”以你选择的牌名置于一名角色的判定区
    ', + player.getCards("h"), + [Object.keys(map), "tdnodes"], + ]) + .set("filterButton", (button) => { + const type = typeof button.link, + card = button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) + return false; + if (type == "string") return true; + return ( + card.hasGaintag("dcqiqin_tag") && + lib.skill.dczixi.zixiList.some((name) => { + return game.hasPlayer((target) => + target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card])) + ); + }) + ); + }) + .set("ai", (button) => { + const player = get.event("player"), + list = Object.keys(get.event("map")); + if (typeof button.link == "string") { + const card = player + .getCards("h", (card) => { + if (get.value(card) >= 7) return false; + return ( + card.hasGaintag("dcqiqin_tag") && + game.hasPlayer((target) => + target.canAddJudge( + get.autoViewAs({ name: "dczixi_" + name }, [card]) + ) + ) + ); + }) + .sort((a, b) => get.value(a) - get.value(b))[0]; + if ( + game.hasPlayer((current) => { + return ( + get.attitude(player, current) < 0 && + lib.skill.dczixi.zixiList.some((name) => + current.canAddJudge( + get.autoViewAs({ name: "dczixi_" + name }, [card]) + ) + ) + ); + }) + ) + return list.indexOf(button.link) + 1; + return 1 / (list.indexOf(button.link) + 1); + } + return 7 - get.value(button.link); + }) + .set("map", map); + if (bool) { + const name = links.find((i) => typeof i == "string"), + card = links.find((j) => j != name), + cardname = map[name]; + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "请选择【" + name + "(" + get.translation(card) + ")】置入的目标", + (cardx, player, target) => { + return target.canAddJudge( + get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [ + get.event("card"), + ]) + ); + }, + true + ) + .set("ai", (target) => { + const player = get.event("player"), + card = get.event("card"); + if ( + game.hasPlayer((current) => { + return ( + get.attitude(player, current) < 0 && + current.canAddJudge( + get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [ + card, + ]) + ) + ); + }) + ) + return -target.countCards("j") - 1; + return target.countCards("j") + 1; + }) + .set("card", card) + .set("cardname", cardname); + if (bool) { + const target = targets[0]; + player.logSkill("dczixi", target); + player.$give(card, target, false); await game.asyncDelay(0.5); - target.addJudge({name:'dczixi_'+cardname},[card]); + target.addJudge({ name: "dczixi_" + cardname }, [card]); } } }, - group:'dczixi_effect', - subSkill:{ - judge:{ - mod:{ - targetEnabled(card,player,target){ - const list=lib.skill.dczixi.zixiList; - const name=(typeof card=='string')?card:(card.viewAs?card.viewAs:card.name); - if(name.indexOf('dczixi_')==0){ - const namex=name.slice('dczixi_'.length); - if(list.includes(namex)&&target.hasJudge(namex)) return false; - } - else if(list.includes(name)&&target.hasJudge('dczixi_'+name)) return false; + group: "dczixi_effect", + subSkill: { + judge: { + mod: { + targetEnabled(card, player, target) { + const list = lib.skill.dczixi.zixiList; + const name = + typeof card == "string" ? card : card.viewAs ? card.viewAs : card.name; + if (name.indexOf("dczixi_") == 0) { + const namex = name.slice("dczixi_".length); + if (list.includes(namex) && target.hasJudge(namex)) return false; + } else if (list.includes(name) && target.hasJudge("dczixi_" + name)) + return false; }, }, - ai:{ - threaten(player,target){ - if(!player.hasSkill('dczixi')||![1,2,3].includes(target.countCards('j'))) return; - return 3+target.countCards('j'); + ai: { + threaten(player, target) { + if (!player.hasSkill("dczixi") || ![1, 2, 3].includes(target.countCards("j"))) + return; + return 3 + target.countCards("j"); }, }, }, - effect:{ - audio:'dczixi', - trigger:{player:'useCardToTargeted'}, - filter(event,player){ - return event.isFirstTarget&&event.targets.length==1&&[1,2,3].includes(event.target.countCards('j'))&&(get.type(event.card)=='basic'||get.type(event.card)=='trick'); + effect: { + audio: "dczixi", + trigger: { player: "useCardToTargeted" }, + filter(event, player) { + return ( + event.isFirstTarget && + event.targets.length == 1 && + [1, 2, 3].includes(event.target.countCards("j")) && + (get.type(event.card) == "basic" || get.type(event.card) == "trick") + ); }, - prompt2(event,player){ - const target=event.target,str=get.translation(target); + prompt2(event, player) { + const target = event.target, + str = get.translation(target); return [ - '令'+get.translation(event.card)+'对'+str+'额外结算一次', - '摸两张牌', - '弃置'+str+'判定区里的所有牌,对其造成3点伤害', - ][target.countCards('j')-1]; + "令" + get.translation(event.card) + "对" + str + "额外结算一次", + "摸两张牌", + "弃置" + str + "判定区里的所有牌,对其造成3点伤害", + ][target.countCards("j") - 1]; }, - check(event,player){ - const target=event.target,num=target.countCards('j'); - if(num==2) return true; - if(num==1) return get.effect(target,event.card,player,player)>0; - return get.attitude(player,target)<0&&get.damageEffect(target,player,player)>0; + check(event, player) { + const target = event.target, + num = target.countCards("j"); + if (num == 2) return true; + if (num == 1) return get.effect(target, event.card, player, player) > 0; + return ( + get.attitude(player, target) < 0 && + get.damageEffect(target, player, player) > 0 + ); }, - logTarget:'target', - async content(event,trigger,player){ - const target=trigger.target,num=target.countCards('j'); - switch(num){ + logTarget: "target", + async content(event, trigger, player) { + const target = trigger.target, + num = target.countCards("j"); + switch (num) { case 1: trigger.getParent().effectCount++; - game.log(trigger.card,'额外结算一次'); + game.log(trigger.card, "额外结算一次"); break; case 2: player.draw(2); break; case 3: - target.discard(target.getCards('j')).discarder=player; + target.discard(target.getCards("j")).discarder = player; target.damage(3); break; } @@ -1352,107 +1820,120 @@ game.import('character', function () { }, }, //孔融 - dckrmingshi:{ - audio:'mingshi', - trigger:{player:'damageBegin4'}, - filter(event,player){ - return event.source&&event.source.countCards('h')>player.countCards('h'); + dckrmingshi: { + audio: "mingshi", + trigger: { player: "damageBegin4" }, + filter(event, player) { + return event.source && event.source.countCards("h") > player.countCards("h"); }, - forced:true, - logTarget:'source', - async content(event,trigger,player){ - const target=trigger.source; - const {result:{bool}}=await target.chooseToDiscard('名士:弃置一张手牌,或防止对'+get.translation(player)+'造成的伤害').set('ai',card=>{ - if(get.event('goon')) return 0; - return 6-get.value(card); - }).set('goon',get.damageEffect(player,target,target)<=0); - if(!bool) trigger.cancel(); + forced: true, + logTarget: "source", + async content(event, trigger, player) { + const target = trigger.source; + const { + result: { bool }, + } = await target + .chooseToDiscard( + "名士:弃置一张手牌,或防止对" + get.translation(player) + "造成的伤害" + ) + .set("ai", (card) => { + if (get.event("goon")) return 0; + return 6 - get.value(card); + }) + .set("goon", get.damageEffect(player, target, target) <= 0); + if (!bool) trigger.cancel(); }, - ai:{ - effect:{ - target_use(card,player,target,current){ - if(get.tag(card,'damage')&&target!=player){ - if(_status.event.name=='dckrmingshi') return; - if(get.attitude(player,target)>0&¤t<0) return 'zerotarget'; - var bs=player.getCards('h'); + ai: { + effect: { + target_use(card, player, target, current) { + if (get.tag(card, "damage") && target != player) { + if (_status.event.name == "dckrmingshi") return; + if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; + var bs = player.getCards("h"); bs.remove(card); - if(card.cards) bs.removeArray(card.cards); + if (card.cards) bs.removeArray(card.cards); else bs.removeArray(ui.selected.cards); - if(bs.length>target.countCards('h')){ - if(bs.some(bsi=>get.value(bsi)<7)) return [1,0,1,-0.5]; - return [1,0,0.3,0]; + if (bs.length > target.countCards("h")) { + if (bs.some((bsi) => get.value(bsi) < 7)) return [1, 0, 1, -0.5]; + return [1, 0, 0.3, 0]; } - return [1,0,1,-0.5]; + return [1, 0, 1, -0.5]; } }, }, }, }, //新服SP孟获 - dcmanwang:{ - audio:'spmanwang', - inherit:'spmanwang', - check:function(card){ - var player=_status.event.player; - var max=Math.min(player.isDamaged()?3:2,4-player.countMark('dcmanwang')); - if(!max&&!player.hasSkill('dcpanqin')) return 0; - if(max==0&&ui.selected.length>0) return 0; - return 7-ui.selected.cards.length-get.value(card); + dcmanwang: { + audio: "spmanwang", + inherit: "spmanwang", + check: function (card) { + var player = _status.event.player; + var max = Math.min(player.isDamaged() ? 3 : 2, 4 - player.countMark("dcmanwang")); + if (!max && !player.hasSkill("dcpanqin")) return 0; + if (max == 0 && ui.selected.length > 0) return 0; + return 7 - ui.selected.cards.length - get.value(card); }, - content:function(){ - var num=Math.min(cards.length,4-player.countMark('dcmanwang')); - if(num>=1) player.addSkills('dcpanqin'); - if(num>=2) player.draw(); - if(num>=3) player.recover(); - if(num>=4){ + content: function () { + var num = Math.min(cards.length, 4 - player.countMark("dcmanwang")); + if (num >= 1) player.addSkills("dcpanqin"); + if (num >= 2) player.draw(); + if (num >= 3) player.recover(); + if (num >= 4) { player.draw(2); - player.removeSkills('dcpanqin'); + player.removeSkills("dcpanqin"); } }, - ai:{ - order:2, - result:{ - player:function(player,target){ - if(player.getUseValue({name:'nanman'})<=0) return 0; - if(player.getStat('skill').spmanwang&&player.hasSkill('dcpanqin')) return 0; + ai: { + order: 2, + result: { + player: function (player, target) { + if (player.getUseValue({ name: "nanman" }) <= 0) return 0; + if (player.getStat("skill").spmanwang && player.hasSkill("dcpanqin")) return 0; return 1; }, }, }, - derivation:'dcpanqin', + derivation: "dcpanqin", }, - dcpanqin:{ - audio:'sppanqin', - inherit:'sppanqin', - content:function(){ - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type!='discard'||evt.getParent(trigger.name)!=trigger) return false; - for(var i of evt.cards2){ - if(get.position(i,true)=='d'){ + dcpanqin: { + audio: "sppanqin", + inherit: "sppanqin", + content: function () { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(trigger.name) != trigger) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { cards.add(i); } } }); - player.chooseUseTarget(true,{name:'nanman'},cards); - player.addTempSkill('dcpanqin_eff'); + player.chooseUseTarget(true, { name: "nanman" }, cards); + player.addTempSkill("dcpanqin_eff"); }, - subSkill:{ - eff:{ - charlotte:true, - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card.name=='nanman'&&event.getParent(2).name=='dcpanqin'&&player.countMark('dcmanwang')<4&&player.hasSkill('dcmanwang',null,null,false)&&event.cards.length<=event.targets.length; + subSkill: { + eff: { + charlotte: true, + trigger: { player: "useCard" }, + filter: function (event, player) { + return ( + event.card.name == "nanman" && + event.getParent(2).name == "dcpanqin" && + player.countMark("dcmanwang") < 4 && + player.hasSkill("dcmanwang", null, null, false) && + event.cards.length <= event.targets.length + ); }, - forced:true, - popup:false, - content:function(){ - 'step 0' - player.addMark('dcmanwang',1,false); - switch(player.countMark('dcmanwang')){ + forced: true, + popup: false, + content: function () { + "step 0"; + player.addMark("dcmanwang", 1, false); + switch (player.countMark("dcmanwang")) { case 1: player.draw(2); - player.removeSkills('dcpanqin'); + player.removeSkills("dcpanqin"); break; case 2: player.recover(); @@ -1461,197 +1942,236 @@ game.import('character', function () { player.draw(); break; case 4: - player.addSkills('dcpanqin'); + player.addSkills("dcpanqin"); break; } - 'step 1' + ("step 1"); player.gainMaxHp(); player.recover(); }, - } - } + }, + }, }, //凌操 - dcdufeng:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - forced:true, - async content(event,trigger,player){ - const list=[]; - for(let i=1;i<6;i++){ - if(player.isDisabled(i)) continue; - list.push('equip'+i); + dcdufeng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + async content(event, trigger, player) { + const list = []; + for (let i = 1; i < 6; i++) { + if (player.isDisabled(i)) continue; + list.push("equip" + i); } - list.push('cancel2'); - const next=player.chooseControl(list); - next.set('prompt','独锋:请废除一个装备栏,或点击“取消”失去1点体力'); - next.set('ai',()=>{ - const list=get.event().list.slice(),player=get.player(); - if(player.hp<=2&&list.length>1) list.remove('cancel2'); - const listx=list.filter(subtype=>!player.getEquips(subtype).length); - if(listx.length) return listx.randomGet(); + list.push("cancel2"); + const next = player.chooseControl(list); + next.set("prompt", "独锋:请废除一个装备栏,或点击“取消”失去1点体力"); + next.set("ai", () => { + const list = get.event().list.slice(), + player = get.player(); + if (player.hp <= 2 && list.length > 1) list.remove("cancel2"); + const listx = list.filter((subtype) => !player.getEquips(subtype).length); + if (listx.length) return listx.randomGet(); return list.randomGet(); - }) - next.set('list',list); - const {result}=await next; - if(result.control=='cancel2') await player.loseHp(); + }); + next.set("list", list); + const { result } = await next; + if (result.control == "cancel2") await player.loseHp(); else await player.disableEquip(result.control); - if(!player.isIn()) return; - const num=Math.min(player.countDisabled()+player.getDamagedHp(),player.maxHp); + if (!player.isIn()) return; + const num = Math.min(player.countDisabled() + player.getDamagedHp(), player.maxHp); await player.draw(num); - player.addTempSkill('dcdufeng_effect'); - player.addMark('dcdufeng_effect',num,false); + player.addTempSkill("dcdufeng_effect"); + player.addMark("dcdufeng_effect", num, false); }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - intro:{ - content:'本回合攻击范围与使用【杀】的次数上限均为#', + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { + content: "本回合攻击范围与使用【杀】的次数上限均为#", }, - mod:{ - attackRangeBase(player,num){ - return player.countMark('dcdufeng_effect'); + mod: { + attackRangeBase(player, num) { + return player.countMark("dcdufeng_effect"); }, - cardUsable(card,player,num){ - if(card.name=='sha') return player.countMark('dcdufeng_effect'); + cardUsable(card, player, num) { + if (card.name == "sha") return player.countMark("dcdufeng_effect"); }, }, - } + }, }, }, //小乔 - dcqiqin:{ - audio:2, - audioname:['yue_daqiao'], - trigger:{ - global:'phaseBefore', - player:'enterGame' + dcqiqin: { + audio: 2, + audioname: ["yue_daqiao"], + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - content:function(){ - let cards=player.getCards('h'); - player.addGaintag(cards,'dcqiqin_tag'); - player.markAuto('dcqiqin',cards); + forced: true, + content: function () { + let cards = player.getCards("h"); + player.addGaintag(cards, "dcqiqin_tag"); + player.markAuto("dcqiqin", cards); }, - group:'dcqiqin_restore', - subSkill:{ - tag:{}, - restore:{ - audio:'dcqiqin', - audioname:['yue_daqiao'], - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - const targets=game.players.slice().concat(game.dead); - return targets.some(target=>target.getStorage('dcqiqin').filterInD('d').length); + group: "dcqiqin_restore", + subSkill: { + tag: {}, + restore: { + audio: "dcqiqin", + audioname: ["yue_daqiao"], + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + const targets = game.players.slice().concat(game.dead); + return targets.some( + (target) => target.getStorage("dcqiqin").filterInD("d").length + ); }, - forced:true, - content:function(){ - const targets=game.players.slice().concat(game.dead); - const cards=targets.reduce((list,target)=>list.addArray(target.getStorage('dcqiqin').filterInD('d')),[]); - player.gain(cards,'gain2').gaintag.add('dcqiqin_tag'); + forced: true, + content: function () { + const targets = game.players.slice().concat(game.dead); + const cards = targets.reduce( + (list, target) => list.addArray(target.getStorage("dcqiqin").filterInD("d")), + [] + ); + player.gain(cards, "gain2").gaintag.add("dcqiqin_tag"); }, }, }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('dcqiqin_tag')) return true; + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcqiqin_tag")) return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('dcqiqin_tag')) return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcqiqin_tag")) return false; }, }, }, - dcweiwan:{ - audio:2, - enable:'phaseUse', - filter:(event,player)=>{ - return player.countCards(lib.skill.dcweiwan.position,card=>{ - return lib.skill.dcweiwan.filterCard(card,player); - })&&game.hasPlayer(target=>{ - return lib.skill.dcweiwan.filterTarget(null,player,target); - }); + dcweiwan: { + audio: 2, + enable: "phaseUse", + filter: (event, player) => { + return ( + player.countCards(lib.skill.dcweiwan.position, (card) => { + return lib.skill.dcweiwan.filterCard(card, player); + }) && + game.hasPlayer((target) => { + return lib.skill.dcweiwan.filterTarget(null, player, target); + }) + ); }, - filterCard:(card,player)=>{ - return card.hasGaintag('dcqiqin_tag')&&lib.filter.cardDiscardable(card,player); + filterCard: (card, player) => { + return card.hasGaintag("dcqiqin_tag") && lib.filter.cardDiscardable(card, player); }, - filterTarget:(card,player,target)=>{ - return target!=player&&target.countCards('he'); + filterTarget: (card, player, target) => { + return target != player && target.countCards("he"); }, - position:'h', - check:(card)=>{ - const player=_status.event.player; - const target = game.players.reduce((result, current) => { - if (current === player) return result; - const effect = Math.abs(lib.skill.dcweiwan.ai.result.target(player, current)); - return effect > result[1] ? [current, effect] : result; - }, [null, 0])[0]; - return target?lib.skill.dcweiwan.getWeiWanEffect(player,card,target):0; + position: "h", + check: (card) => { + const player = _status.event.player; + const target = game.players.reduce( + (result, current) => { + if (current === player) return result; + const effect = Math.abs(lib.skill.dcweiwan.ai.result.target(player, current)); + return effect > result[1] ? [current, effect] : result; + }, + [null, 0] + )[0]; + return target ? lib.skill.dcweiwan.getWeiWanEffect(player, card, target) : 0; }, - usable:1, - content:function*(event,map){ - let player=map.player,target=event.target; - let suit=get.suit(event.cards[0],player); - let cards=target.getCards('hej',card=>get.suit(card,target)!=suit&&lib.filter.canBeGained(card,player,target)); - if(!cards.length){ - player.chat('无牌可得!!'); + usable: 1, + content: function* (event, map) { + let player = map.player, + target = event.target; + let suit = get.suit(event.cards[0], player); + let cards = target.getCards( + "hej", + (card) => + get.suit(card, target) != suit && lib.filter.canBeGained(card, player, target) + ); + if (!cards.length) { + player.chat("无牌可得!!"); return; } - let suits=lib.suit.slice(); + let suits = lib.suit.slice(); suits.reverse(); - suits.add('none'); - suits.forEach(suit2=>{ - let cards2=cards.filter(card=>get.suit(card,target)==suit2); - if(cards2.length){ + suits.add("none"); + suits.forEach((suit2) => { + let cards2 = cards.filter((card) => get.suit(card, target) == suit2); + if (cards2.length) { cards2.randomRemove(); cards.removeArray(cards2); } }); - if(!cards.length){ - player.chat('无牌可得!!'); + if (!cards.length) { + player.chat("无牌可得!!"); return; } - player.gain(cards,target,'give'); - switch(cards.length){ + player.gain(cards, target, "give"); + switch (cards.length) { case 1: target.loseHp(); break; case 2: - player.addTempSkill('tanbei_effect3'); - target.addTempSkill('tanbei_effect1'); + player.addTempSkill("tanbei_effect3"); + target.addTempSkill("tanbei_effect1"); break; case 3: - player.addTempSkill('tanbei_effect3'); - target.addTempSkill('tanbei_effect2'); + player.addTempSkill("tanbei_effect3"); + target.addTempSkill("tanbei_effect2"); break; } }, - ai:{ - order:9, - result:{ - target:(player,target)=>{ - const att=get.sgn(get.attitude(player,target))-1; - const cards=player.getCards(lib.skill.dcweiwan.position,card=>lib.skill.dcweiwan.filterCard(card,player)); - return att * cards.reduce((result, card) => { - const effect = lib.skill.dcweiwan.getWeiWanEffect(player, card, target); - return effect > result ? effect : result; - },0); + ai: { + order: 9, + result: { + target: (player, target) => { + const att = get.sgn(get.attitude(player, target)) - 1; + const cards = player.getCards(lib.skill.dcweiwan.position, (card) => + lib.skill.dcweiwan.filterCard(card, player) + ); + return ( + att * + cards.reduce((result, card) => { + const effect = lib.skill.dcweiwan.getWeiWanEffect(player, card, target); + return effect > result ? effect : result; + }, 0) + ); }, }, - combo:'dcqiqin' + combo: "dcqiqin", }, - getWeiWanEffect:(player,cardx,target)=>{ - const suit=get.suit(cardx,player); - const cards=target.getCards('hej',card=>get.suit(card,target)!==suit&&lib.filter.canBeGained(card,player,target)); - const num=lib.suits.filter(suit=>cards.some(card=>get.suit(card,target)===suit)).length; - switch(num){ + getWeiWanEffect: (player, cardx, target) => { + const suit = get.suit(cardx, player); + const cards = target.getCards( + "hej", + (card) => + get.suit(card, target) !== suit && lib.filter.canBeGained(card, player, target) + ); + const num = lib.suits.filter((suit) => + cards.some((card) => get.suit(card, target) === suit) + ).length; + switch (num) { case 1: - return num+Math.max(0,get.sgn(get.effect(target,{name:'losehp'},player,player))); + return ( + num + + Math.max(0, get.sgn(get.effect(target, { name: "losehp" }, player, player))) + ); case 2: - return num+player.countCards('he',card=>player.canUse(card,target,false)&&get.effect(target,card,player,player)>0); + return ( + num + + player.countCards( + "he", + (card) => + player.canUse(card, target, false) && + get.effect(target, card, player, player) > 0 + ) + ); case 3: return Math.ceil(num / 2); default: @@ -1660,313 +2180,394 @@ game.import('character', function () { }, }, //董昭 - dcyijia:{ - audio:2, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - if(!event.player.isIn()) return false; - if(get.distance(player,event.player)>1) return false; - return player.canMoveCard(null,true,game.filterPlayer(i=>i!=event.player),event.player,'canReplace'); + dcyijia: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!event.player.isIn()) return false; + if (get.distance(player, event.player) > 1) return false; + return player.canMoveCard( + null, + true, + game.filterPlayer((i) => i != event.player), + event.player, + "canReplace" + ); }, - check:function(event,player){ - return player.canMoveCard(true,true,game.filterPlayer(i=>i!=event.player),event.player,'canReplace'); + check: function (event, player) { + return player.canMoveCard( + true, + true, + game.filterPlayer((i) => i != event.player), + event.player, + "canReplace" + ); }, - prompt2:function(event,player){ - return `将场上一张装备牌移动至${get.translation(event.player)}的装备区内(替换原装备)。然后若其因此脱离了一名角色的攻击范围,你摸一张牌。`; + prompt2: function (event, player) { + return `将场上一张装备牌移动至${get.translation( + event.player + )}的装备区内(替换原装备)。然后若其因此脱离了一名角色的攻击范围,你摸一张牌。`; }, - logTarget:'player', - line:false, - content:function*(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.player; - const inRangeList=game.filterPlayer(current=>current.inRange(target)); - yield player.moveCard(true,game.filterPlayer(i=>i!=target),target,'canReplace'); - const leaveSomeone=inRangeList.some(current=>!current.inRange(target)); - if(leaveSomeone) player.draw(); + logTarget: "player", + line: false, + content: function* (event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + const inRangeList = game.filterPlayer((current) => current.inRange(target)); + yield player.moveCard( + true, + game.filterPlayer((i) => i != target), + target, + "canReplace" + ); + const leaveSomeone = inRangeList.some((current) => !current.inRange(target)); + if (leaveSomeone) player.draw(); }, - ai:{ - maixie:true, - expose:0.2, - threaten:3.3, + ai: { + maixie: true, + expose: 0.2, + threaten: 3.3, }, }, - dcdingji:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function*(event,map){ - const player=map.player; + dcdingji: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function* (event, map) { + const player = map.player; let result; - result=yield player.chooseTarget(get.prompt2('dcdingji')).set('ai',target=>{ - let att=get.attitude(get.player(),target)/2; - const delta=5-target.countCards('h'); - let fix=1; - const hs=target.getCards('h'); - outer:for(let i=0;i { + let att = get.attitude(get.player(), target) / 2; + const delta = 5 - target.countCards("h"); + let fix = 1; + const hs = target.getCards("h"); + outer: for (let i = 0; i < hs.length - 1; i++) { + const name1 = get.name(hs[i]); + for (let j = i + 1; j < hs.length; j++) { + const name2 = get.name(hs[j]); + if (name1 == name2) { + fix = 0.5; + break outer; } } } - if(delta>0){ - if(target.hasSkillTag('nogain')) att/=3; - return Math.sqrt(delta)*att*fix; + if (delta > 0) { + if (target.hasSkillTag("nogain")) att /= 3; + return Math.sqrt(delta) * att * fix; } - if(delta>-2&&att>0) return fix==0.5?0.1:-1; - return -Math.sqrt(-delta)*att/2; + if (delta > -2 && att > 0) return fix == 0.5 ? 0.1 : -1; + return (-Math.sqrt(-delta) * att) / 2; }); - if(!result.bool) return event.finish(); - const target=result.targets[0]; - player.logSkill('dcdingji',target); - if(target!=player) player.addExpose(0.3); - const delta=5-target.countCards('h'); - if(delta!=0){ - yield target[delta>0?'draw':'chooseToDiscard'](Math.abs(delta),true); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dcdingji", target); + if (target != player) player.addExpose(0.3); + const delta = 5 - target.countCards("h"); + if (delta != 0) { + yield target[delta > 0 ? "draw" : "chooseToDiscard"](Math.abs(delta), true); } target.showHandcards(); - const hs=target.getCards('h'); - let hasSame=false; - outer:for(let i=0;i{ - if(!['basic','trick'].includes(info[0])) return false; - if(!target.hasUseTarget(new lib.element.VCard({name:info[2],nature:info[3],isCard:true}))) return false; - return hs.some(card=>{ - return get.name(card)==info[2]&&get.is.sameNature([card,info[3]],true); + if (hasSame) return event.finish(); + const list = get.inpileVCardList((info) => { + if (!["basic", "trick"].includes(info[0])) return false; + if ( + !target.hasUseTarget( + new lib.element.VCard({ name: info[2], nature: info[3], isCard: true }) + ) + ) + return false; + return hs.some((card) => { + return get.name(card) == info[2] && get.is.sameNature([card, info[3]], true); }); }); - if(!list.length) return event.finish(); - result=yield target.chooseButton(['是否视为使用其中一张牌?',[list,'vcard']]).set('ai',button=>{ - return get.player().getUseValue({name:button.link[2]}); - }); - if(result.bool){ - target.chooseUseTarget(new lib.element.VCard({ - name:result.links[0][2], - nature:result.links[0][3], - isCard:true, - }),true,false); + if (!list.length) return event.finish(); + result = yield target + .chooseButton(["是否视为使用其中一张牌?", [list, "vcard"]]) + .set("ai", (button) => { + return get.player().getUseValue({ name: button.link[2] }); + }); + if (result.bool) { + target.chooseUseTarget( + new lib.element.VCard({ + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }), + true, + false + ); } }, }, //蒯祺 - dcliangxiu:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.hasCard(card=>{ - const type=get.type2(card,player); - return player.hasCard(cardx=>{ - if(card==cardx) return false; - return get.type2(cardx,player)!=type; - },'he'); - },'he'); + dcliangxiu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.hasCard((card) => { + const type = get.type2(card, player); + return player.hasCard((cardx) => { + if (card == cardx) return false; + return get.type2(cardx, player) != type; + }, "he"); + }, "he"); }, - filterCard:function(card,player){ - if(!ui.selected.cards.length) return true; - return get.type2(ui.selected.cards[0],player)!=get.type2(card,player); + filterCard: function (card, player) { + if (!ui.selected.cards.length) return true; + return get.type2(ui.selected.cards[0], player) != get.type2(card, player); }, - selectCard:2, - check:function(card){ - const player=get.player(); - const bannedTypes=[]; - bannedTypes.addArray(player.getStorage('dcliangxiu')); - if(!ui.selected.cards.length){ - let val=get.value(card); - if(val>5.5) return 0; - if(bannedTypes.includes(get.type2(card,player))) return 7.5-val; - return 5.5-val; + selectCard: 2, + check: function (card) { + const player = get.player(); + const bannedTypes = []; + bannedTypes.addArray(player.getStorage("dcliangxiu")); + if (!ui.selected.cards.length) { + let val = get.value(card); + if (val > 5.5) return 0; + if (bannedTypes.includes(get.type2(card, player))) return 7.5 - val; + return 5.5 - val; } - bannedTypes.addArray(ui.selected.cards.map(card=>get.type2(card,player))); - bannedTypes.add(get.type2(card,player)); - const filter=card=>!bannedTypes.includes(get.type2(card,player)); - if(!get.cardPile(filter)) return 0; - return 6-get.value(card); + bannedTypes.addArray(ui.selected.cards.map((card) => get.type2(card, player))); + bannedTypes.add(get.type2(card, player)); + const filter = (card) => !bannedTypes.includes(get.type2(card, player)); + if (!get.cardPile(filter)) return 0; + return 6 - get.value(card); }, - position:'he', - complexCard:true, - onremove:true, - content:function*(event,map){ - const player=map.player; - const cards=[]; - const bannedTypes=[]; - bannedTypes.addArray(event.cards.map(card=>get.type2(card,player))); - bannedTypes.addArray(player.getStorage('dcliangxiu')); + position: "he", + complexCard: true, + onremove: true, + content: function* (event, map) { + const player = map.player; + const cards = []; + const bannedTypes = []; + bannedTypes.addArray(event.cards.map((card) => get.type2(card, player))); + bannedTypes.addArray(player.getStorage("dcliangxiu")); - const filter=card=>!bannedTypes.includes(get.type2(card,player)); - const piles=['cardPile','discardPile']; - for(const pile of piles){ - for(let i=0;i !bannedTypes.includes(get.type2(card, player)); + const piles = ["cardPile", "discardPile"]; + for (const pile of piles) { + for (let i = 0; i < ui[pile].childNodes.length; i++) { + const card = ui[pile].childNodes[i]; + if (filter(card)) { cards.add(card); - if(cards.length>=2) break; + if (cards.length >= 2) break; } } - if(cards.length>=2) break; + if (cards.length >= 2) break; } let result; - if(!cards.length){ - player.chat('没牌了…'); - game.log('但是哪里都找不到没有符合条件的牌!'); + if (!cards.length) { + player.chat("没牌了…"); + game.log("但是哪里都找不到没有符合条件的牌!"); event.finish(); return; - } - else if(cards.length==1) result={bool:true,links:cards}; - else result=yield player.chooseButton(['良秀:获得一张牌',cards],true).set('ai',get.buttonValue); - if(result.bool){ - const toGain=result.links; - player.markAuto('dcliangxiu',get.type2(toGain[0],false)); - player.when({global:'phaseChange'}).then(()=>{ - player.unmarkSkill('dcliangxiu'); + } else if (cards.length == 1) result = { bool: true, links: cards }; + else + result = yield player + .chooseButton(["良秀:获得一张牌", cards], true) + .set("ai", get.buttonValue); + if (result.bool) { + const toGain = result.links; + player.markAuto("dcliangxiu", get.type2(toGain[0], false)); + player.when({ global: "phaseChange" }).then(() => { + player.unmarkSkill("dcliangxiu"); }); - player.gain(toGain,'gain2'); + player.gain(toGain, "gain2"); } }, - intro:{ - content:'已因此技能获得过$牌', - onunmark:true, + intro: { + content: "已因此技能获得过$牌", + onunmark: true, }, - ai:{ - order:2, - result:{player:1}, + ai: { + order: 2, + result: { player: 1 }, }, }, - dcxunjie:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - if(['handcard','hp'].every(i=>player.isTempBanned(`dcxunjie_${i}`))) return false; - return player.hasHistory('gain',evt=>{ - return !evt.getParent('phaseDraw',true); + dcxunjie: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + if (["handcard", "hp"].every((i) => player.isTempBanned(`dcxunjie_${i}`))) return false; + return player.hasHistory("gain", (evt) => { + return !evt.getParent("phaseDraw", true); }); }, - direct:true, - content:function*(event,map){ - const player=map.player; - const choices=[]; - const choiceList=[ - '令一名角色将手牌数摸或弃置至与其体力值相同', - '令一名角色将体力回复或失去至与其手牌数相同', + direct: true, + content: function* (event, map) { + const player = map.player; + const choices = []; + const choiceList = [ + "令一名角色将手牌数摸或弃置至与其体力值相同", + "令一名角色将体力回复或失去至与其手牌数相同", ]; - if(!player.isTempBanned('dcxunjie_handcard')) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+'(已被选择过)'; - if(!player.isTempBanned('dcxunjie_hp')) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+'(已被选择过)'; + if (!player.isTempBanned("dcxunjie_handcard")) choices.push("选项一"); + else + choiceList[0] = + '' + choiceList[0] + "(已被选择过)"; + if (!player.isTempBanned("dcxunjie_hp")) choices.push("选项二"); + else + choiceList[1] = + '' + choiceList[1] + "(已被选择过)"; let result; - if(_status.connectMode) game.broadcastAll(()=>{_status.noclearcountdown=true}); - if(choices.length==1) result={control:choices[0]}; - else result=yield player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('dcxunjie')).set('ai',()=>{ - return get.event('choice'); - }).set('choice',(()=>{ - const getValue=(index,target)=>{ - let att=get.attitude(player,target); - att=Math.sign(att)*Math.sqrt(Math.abs(att)); - let delt=target.getHp(true)-target.countCards('h'); - if(index==1&&delt<0) delt=0; - return (1-3*index)*att*delt; - } - const list=game.filterPlayer().map(current=>{ - const val0=getValue(0,current),val1=getValue(1,current); - return [val0,val1,Math.max(val0,val1)]; - }).sort((a,b)=>{ - return b[2]-a[2]; + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; }); - const toChoose=list[0]; - if(toChoose[2]<=0) return 'cancel2'; - return toChoose[0]>toChoose[1]?0:1; - })()); - if(result.control=='cancel2'){ - if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + if (choices.length == 1) result = { control: choices[0] }; + else + result = yield player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("dcxunjie")) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (() => { + const getValue = (index, target) => { + let att = get.attitude(player, target); + att = Math.sign(att) * Math.sqrt(Math.abs(att)); + let delt = target.getHp(true) - target.countCards("h"); + if (index == 1 && delt < 0) delt = 0; + return (1 - 3 * index) * att * delt; + }; + const list = game + .filterPlayer() + .map((current) => { + const val0 = getValue(0, current), + val1 = getValue(1, current); + return [val0, val1, Math.max(val0, val1)]; + }) + .sort((a, b) => { + return b[2] - a[2]; + }); + const toChoose = list[0]; + if (toChoose[2] <= 0) return "cancel2"; + return toChoose[0] > toChoose[1] ? 0 : 1; + })() + ); + if (result.control == "cancel2") { + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } return event.finish(); } - let prompt=''; - const choice=result.control,index=choice=='选项一'?0:1; - if(choices.length==1){ - prompt=`###${get.prompt('dcxunjie')}###
    ${choiceList[index]}
    `; + let prompt = ""; + const choice = result.control, + index = choice == "选项一" ? 0 : 1; + if (choices.length == 1) { + prompt = `###${get.prompt("dcxunjie")}###
    ${ + choiceList[index] + }
    `; + } else + prompt = `###殉节:请选择一名角色###
    ${choiceList[ + index + ].replace("一名", "该")}
    `; + result = yield player + .chooseTarget(prompt) + .set("ai", (target) => { + const player = get.player(), + index = get.event("index"); + let att = get.attitude(player, target); + att = Math.sign(att) * Math.sqrt(Math.abs(att)); + let delt = target.getHp(true) - target.countCards("h"); + if (index == 1 && delt < 0) delt = 0; + return (1 - 2 * index) * att * delt; + }) + .set("index", index); + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - else prompt=`###殉节:请选择一名角色###
    ${choiceList[index].replace('一名','该')}
    `; - result=yield player.chooseTarget(prompt).set('ai',target=>{ - const player=get.player(),index=get.event('index'); - let att=get.attitude(player,target); - att=Math.sign(att)*Math.sqrt(Math.abs(att)); - let delt=target.getHp(true)-target.countCards('h'); - if(index==1&&delt<0) delt=0; - return (1-2*index)*att*delt; - }).set('index',index); - if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} - if(!result.bool) return event.finish(); - const target=result.targets[0]; - player.logSkill('dcxunjie',target); - player.tempBanSkill(`dcxunjie_${index==0?'handcard':'hp'}`,'roundStart',false); - const delt=(target.getHp(true)-target.countCards('h'))*(1-2*index); - if(delt==0) event.finish(); - else if(index==0) target[delt>0?'draw':'chooseToDiscard'](Math.abs(delt),true); - else target[delt>0?'recover':'loseHp'](Math.abs(delt)); - } + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dcxunjie", target); + player.tempBanSkill(`dcxunjie_${index == 0 ? "handcard" : "hp"}`, "roundStart", false); + const delt = (target.getHp(true) - target.countCards("h")) * (1 - 2 * index); + if (delt == 0) event.finish(); + else if (index == 0) target[delt > 0 ? "draw" : "chooseToDiscard"](Math.abs(delt), true); + else target[delt > 0 ? "recover" : "loseHp"](Math.abs(delt)); + }, }, //乐蔡邕 - dcjiaowei:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame' + dcjiaowei: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - group:'dcjiaowei_prevent', - content:function*(event,map){ - const player=map.player; - var cards=player.getCards('h'); - player.addGaintag(cards,'dcjiaowei_tag'); + group: "dcjiaowei_prevent", + content: function* (event, map) { + const player = map.player; + var cards = player.getCards("h"); + player.addGaintag(cards, "dcjiaowei_tag"); }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('dcjiaowei_tag')) return true; + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcjiaowei_tag")) return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('dcjiaowei_tag')) return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcjiaowei_tag")) return false; }, }, - subSkill:{ - prevent:{ - audio:'dcjiaowei', - trigger:{ - player:'damageBegin4', + subSkill: { + prevent: { + audio: "dcjiaowei", + trigger: { + player: "damageBegin4", }, - forced:true, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - return event.source.countCards('h')<=player.countCards('h',card=>card.hasGaintag('dcjiaowei_tag')); + forced: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return ( + event.source.countCards("h") <= + player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) + ); }, - content:function*(event,map){ + content: function* (event, map) { map.trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - const num=target.countCards('h',card=>card.hasGaintag('dcjiaowei_tag')); - let cards=[]; - if(card.cards) cards.addArray(card.cards); - if(ui.selected.cards) cards.addArray(ui.selected.cards); - cards=cards.filter(card=>{ - if(get.itemtype(card)!='card') return false; - return get.owner(card)==player&&get.position(card)=='e'; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + const num = target.countCards("h", (card) => + card.hasGaintag("dcjiaowei_tag") + ); + let cards = []; + if (card.cards) cards.addArray(card.cards); + if (ui.selected.cards) cards.addArray(ui.selected.cards); + cards = cards.filter((card) => { + if (get.itemtype(card) != "card") return false; + return get.owner(card) == player && get.position(card) == "e"; }); - if(player.countCards('h')-cards.length<=num) return 'zeroplayertarget'; + if (player.countCards("h") - cards.length <= num) + return "zeroplayertarget"; } }, }, @@ -1974,1619 +2575,2053 @@ game.import('character', function () { }, }, }, - dcfeibai:{ - audio:2, - trigger:{player:'useCardAfter'}, - usable:1, - locked:false, - filter:function(event,player){ - return player.getHistory('useCard').indexOf(event)>0; + dcfeibai: { + audio: 2, + trigger: { player: "useCardAfter" }, + usable: 1, + locked: false, + filter: function (event, player) { + return player.getHistory("useCard").indexOf(event) > 0; }, - prompt2:function(event,player){ - const history=player.getHistory('useCard'); - const ind=history.indexOf(event)-1,evt=history[ind]; - const len=get.cardNameLength(event.card)+get.cardNameLength(evt.card); + prompt2: function (event, player) { + const history = player.getHistory("useCard"); + const ind = history.indexOf(event) - 1, + evt = history[ind]; + const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card); return `随机获得一张字数为${len}的牌`; }, - check:function(event,player){ - const history=player.getHistory('useCard'); - const ind=history.indexOf(event)-1,evt=history[ind]; - const len=get.cardNameLength(event.card)+get.cardNameLength(evt.card); - return player.countCards('h',card=>card.hasGaintag('dcjiaowei_tag'))<=len||get.cardPile(card=>{ - return get.cardNameLength(card,false)==len; - }); + check: function (event, player) { + const history = player.getHistory("useCard"); + const ind = history.indexOf(event) - 1, + evt = history[ind]; + const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card); + return ( + player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) <= len || + get.cardPile((card) => { + return get.cardNameLength(card, false) == len; + }) + ); }, - content:function*(event,map){ - const player=map.player,trigger=map.trigger; - const history=player.getHistory('useCard'); - const ind=history.indexOf(trigger)-1,evt=history[ind]; - const len=get.cardNameLength(trigger.card)+get.cardNameLength(evt.card); - const card=get.cardPile(card=>{ - return get.cardNameLength(card,false)==len; + content: function* (event, map) { + const player = map.player, + trigger = map.trigger; + const history = player.getHistory("useCard"); + const ind = history.indexOf(trigger) - 1, + evt = history[ind]; + const len = get.cardNameLength(trigger.card) + get.cardNameLength(evt.card); + const card = get.cardPile((card) => { + return get.cardNameLength(card, false) == len; }); - if(card){ - yield player.gain(card,'gain2'); - } - else{ - let str=`没有${len}字的牌…`; - if(len==5&&Math.random()<=0.2) str='五字不行哇'; + if (card) { + yield player.gain(card, "gain2"); + } else { + let str = `没有${len}字的牌…`; + if (len == 5 && Math.random() <= 0.2) str = "五字不行哇"; player.chat(str); game.log(`但是找不到字数为${len}的牌!`); } - if(player.countCards('h',card=>card.hasGaintag('dcjiaowei_tag'))<=len){ + if (player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) <= len) { player.storage.counttrigger.dcfeibai--; - game.log(player,'重置了','#【飞白】'); + game.log(player, "重置了", "#【飞白】"); } }, - mod:{ - aiOrder:function(player,card,num){ - const evt=player.getLastUsed(); - if(!evt) return; - const len=get.cardNameLength(card)+get.cardNameLength(evt.card); - const cardx=get.cardPile(card=>{ - return get.cardNameLength(card,false)==len; + mod: { + aiOrder: function (player, card, num) { + const evt = player.getLastUsed(); + if (!evt) return; + const len = get.cardNameLength(card) + get.cardNameLength(evt.card); + const cardx = get.cardPile((card) => { + return get.cardNameLength(card, false) == len; }); - if(cardx) return num+8+(len==2||len==4?2:0); + if (cardx) return num + 8 + (len == 2 || len == 4 ? 2 : 0); }, - } + }, }, //庞山民 - dccaisi:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return get.type(event.card)=='basic'&&_status.currentPhase; + dccaisi: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return get.type(event.card) == "basic" && _status.currentPhase; }, - prompt2:function(event,player){ - const num=player.countMark('dccaisi_more')+1; - return `从${player==_status.currentPhase?'牌堆':'弃牌'}堆中随机获得${get.cnNumber(num)}张非基本牌`; + prompt2: function (event, player) { + const num = player.countMark("dccaisi_more") + 1; + return `从${player == _status.currentPhase ? "牌堆" : "弃牌"}堆中随机获得${get.cnNumber( + num + )}张非基本牌`; }, - content:function*(event,map){ - const player=map.player,trigger=map.trigger; - const position=player==_status.currentPhase?'cardPile':'discardPile'; - let cards=[],num=player.countMark('dccaisi_more')+1; - while(num>0){ + content: function* (event, map) { + const player = map.player, + trigger = map.trigger; + const position = player == _status.currentPhase ? "cardPile" : "discardPile"; + let cards = [], + num = player.countMark("dccaisi_more") + 1; + while (num > 0) { num--; - let card=get[position](card=>get.type(card)!='basic'&&!cards.includes(card)); - if(card) cards.add(card); + let card = get[position]( + (card) => get.type(card) != "basic" && !cards.includes(card) + ); + if (card) cards.add(card); else break; } - if(cards.length) yield player.gain(cards,'gain2'); - else{ - player.chat('没有非基本牌…'); - game.log(`但是${position=='discardPile'?'弃':''}牌堆里没有非基本牌!`); + if (cards.length) yield player.gain(cards, "gain2"); + else { + player.chat("没有非基本牌…"); + game.log(`但是${position == "discardPile" ? "弃" : ""}牌堆里没有非基本牌!`); } - const sum=player.getHistory('useSkill',evt=>evt.skill=='dccaisi').length; - if(sum evt.skill == "dccaisi").length; + if (sum < player.maxHp) { + player.addTempSkill("dccaisi_more"); + player.addMark("dccaisi_more", 1, false); + } else player.tempBanSkill("dccaisi"); }, - subSkill:{more:{charlotte:true,onremove:true}}, + subSkill: { more: { charlotte: true, onremove: true } }, }, - dczhuoli:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return player.getHistory('useCard').length>player.getHp()||player.getHistory('gain').reduce((sum,evt)=>sum+evt.cards.length,0)>player.getHp(); + dczhuoli: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return ( + player.getHistory("useCard").length > player.getHp() || + player.getHistory("gain").reduce((sum, evt) => sum + evt.cards.length, 0) > + player.getHp() + ); }, - content:function*(event,map){ - const player=map.player; - if(player.maxHp0; + dcbeini: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: function (card, player) { + const delt = player.countCards("h") - player.maxHp; + return delt > 0; }, - selectCard:function(){ - const player=get.player(); - const delt=player.countCards('h')-player.maxHp; - return delt>0?delt:-1; + selectCard: function () { + const player = get.player(); + const delt = player.countCards("h") - player.maxHp; + return delt > 0 ? delt : -1; }, - promptfunc:()=>{ - const player=get.player(); - const delt=player.countCards('h')-player.maxHp; - let str=''; - if(delt>0) str+=`弃置${get.cnNumber(delt)}张牌`; - else if(delt==0) str+=`点击“确定”`; - else str+=`摸${get.cnNumber(-delt)}张牌`; + promptfunc: () => { + const player = get.player(); + const delt = player.countCards("h") - player.maxHp; + let str = ""; + if (delt > 0) str += `弃置${get.cnNumber(delt)}张牌`; + else if (delt == 0) str += `点击“确定”`; + else str += `摸${get.cnNumber(-delt)}张牌`; return `${str},然后选择两名角色,前者视为对后者使用一张【杀】,且这两者的非锁定技失效。`; }, - content:function*(event,map){ - var player=map.player; - if(player.countCards('h'){ - var sha=new lib.element.VCard({name:'sha',isCard:true}); - if(ui.selected.targets.length){ - var targetx=ui.selected.targets[0]; - return targetx.canUse(sha,target,false); - } - return lib.filter.cardEnabled(sha,target); - }).set('targetprompt',['打人','被打']).set('multitarget',true).set('ai',target=>{ - var aiTargets=get.event('aiTargets'); - if(aiTargets){ - return aiTargets[ui.selected.targets.length]==target?10:0; - } - return 0; - }).set('aiTargets',(()=>{ - var targets=[],eff=0; - var sha=new lib.element.VCard({name:'sha',isCard:true}); - for(var user of game.filterPlayer()){ - for(var target of game.filterPlayer()){ - if(user==target) continue; - var targetsx=[user,target]; - targetsx.forEach(i=>i.addSkill('dcbeini_fengyin2')); - var effx=get.effect(target,sha,user,player); - targetsx.forEach(i=>i.removeSkill('dcbeini_fengyin2')); - if(user==player) effx+=1; - if(get.attitude(player,user)>0) effx-=0.1; - if(effx>eff){ - eff=effx; - targets=targetsx; + var result = yield player + .chooseTarget( + "悖逆:请选择两名角色", + "前者视为对后者使用一张【杀】,且这两名角色的非锁定技失效直到回合结束。", + true, + 2, + (card, player, target) => { + var sha = new lib.element.VCard({ name: "sha", isCard: true }); + if (ui.selected.targets.length) { + var targetx = ui.selected.targets[0]; + return targetx.canUse(sha, target, false); } + return lib.filter.cardEnabled(sha, target); } - } - if(targets.length) return targets; - return null; - })()); - if(result.bool){ - var user=result.targets[0],target=result.targets[1]; - result.targets.forEach(i=>i.addTempSkill('dcbeini_fengyin')); - var sha=new lib.element.VCard({name:'sha',isCard:true}); - if(user.canUse(sha,target,false)) user.useCard(sha,target,false,'noai'); + ) + .set("targetprompt", ["打人", "被打"]) + .set("multitarget", true) + .set("ai", (target) => { + var aiTargets = get.event("aiTargets"); + if (aiTargets) { + return aiTargets[ui.selected.targets.length] == target ? 10 : 0; + } + return 0; + }) + .set( + "aiTargets", + (() => { + var targets = [], + eff = 0; + var sha = new lib.element.VCard({ name: "sha", isCard: true }); + for (var user of game.filterPlayer()) { + for (var target of game.filterPlayer()) { + if (user == target) continue; + var targetsx = [user, target]; + targetsx.forEach((i) => i.addSkill("dcbeini_fengyin2")); + var effx = get.effect(target, sha, user, player); + targetsx.forEach((i) => i.removeSkill("dcbeini_fengyin2")); + if (user == player) effx += 1; + if (get.attitude(player, user) > 0) effx -= 0.1; + if (effx > eff) { + eff = effx; + targets = targetsx; + } + } + } + if (targets.length) return targets; + return null; + })() + ); + if (result.bool) { + var user = result.targets[0], + target = result.targets[1]; + result.targets.forEach((i) => i.addTempSkill("dcbeini_fengyin")); + var sha = new lib.element.VCard({ name: "sha", isCard: true }); + if (user.canUse(sha, target, false)) user.useCard(sha, target, false, "noai"); } }, - ai:{ - order:0.1, - result:{ - player:function(player){ - if(player.countCards('h')-player.maxHp>=3) return 1; - return game.hasPlayer(current=>get.attitude(player,current)<=0)?1:0; - } + ai: { + order: 0.1, + result: { + player: function (player) { + if (player.countCards("h") - player.maxHp >= 3) return 1; + return game.hasPlayer((current) => get.attitude(player, current) <= 0) ? 1 : 0; + }, }, }, - subSkill:{ - fengyin:{ - inherit:'fengyin', + subSkill: { + fengyin: { + inherit: "fengyin", }, - fengyin2:{ - inherit:'fengyin', + fengyin2: { + inherit: "fengyin", }, - } + }, }, - dcshizong:{ - audio:2, - enable:'chooseToUse', - hiddenCard:function(player,name){ - if(get.type(name)!='basic') return false; - return player.countCards('he')>=player.countMark('dcshizong')+1; + dcshizong: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + return player.countCards("he") >= player.countMark("dcshizong") + 1; }, - filter:function(event,player){ - if(event.type=='wuxie'||event.dcshizong) return false; - if(player.countCards('he'){ - if(info[0]!='basic') return; - const card={name:info[2],nature:info[3],isCard:true}; - return event.filterCard(card,player,event); - }) - return ui.create.dialog('恃纵',[vcards,'vcard'],'hidden'); + chooseButton: { + dialog: function (event, player) { + const vcards = get.inpileVCardList((info) => { + if (info[0] != "basic") return; + const card = { name: info[2], nature: info[3], isCard: true }; + return event.filterCard(card, player, event); + }); + return ui.create.dialog("恃纵", [vcards, "vcard"], "hidden"); }, - check:function(button){ - if(get.event().getParent().type!='phase') return 1; - const player=get.player(); - const card={name:button.link[2],nature:button.link[3]}; - if(game.hasPlayer(current=>{ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ - switch(button.link[2]){ - case 'tao':return 5; - case 'jiu':return 3.01; - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder') return 2.92; + check: function (button) { + if (get.event().getParent().type != "phase") return 1; + const player = get.player(); + const card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer((current) => { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": + return 3.01; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder") return 2.92; else return 2.9; } } return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:true, - filterTarget:lib.filter.notMe, - selectTarget:1, - selectCard:()=>get.player().countMark('dcshizong')+1, - viewAs:{ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null, - isCard:true, + filterCard: true, + filterTarget: lib.filter.notMe, + selectTarget: 1, + selectCard: () => get.player().countMark("dcshizong") + 1, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, }, - position:'he', - popname:true, - ignoreMod:true, - ai1:function(card){ - return 1/(1.1+Math.max(-1,get.value(card))); + position: "he", + popname: true, + ignoreMod: true, + ai1: function (card) { + return 1 / (1.1 + Math.max(-1, get.value(card))); }, - ai2:function(target){ - return get.attitude(get.player(),target); + ai2: function (target) { + return get.attitude(get.player(), target); }, - precontent:function*(event,map){ - var player=map.player,target=event.result.targets[0]; - player.logSkill('dcshizong',target); - if(!player.countMark('dcshizong')) player.when({global:'phaseAfter'}).then(()=>delete player.storage.dcshizong); - player.addMark('dcshizong',1,false); - yield player.give(event.result.cards.slice(),target); - var viewAs=new lib.element.VCard({name:event.result.card.name,nature:event.result.card.nature,isCard:true}); - var result=yield target.chooseCard('恃纵:是否将一张牌置于牌堆底?',`若如此做,${get.translation(player)}视为使用一张${get.translation(viewAs.nature)}【${get.translation(viewAs.name)}】`,'he').set('ai',card=>{ - if(get.event('goon')) return 7-get.value(card); - return 0; - }).set('goon',get.attitude(target,player)*(player.getUseValue(viewAs)||1)>=1); - var card=event.result.cards[0]; - if(result.bool){ - var card=result.cards[0]; + precontent: function* (event, map) { + var player = map.player, + target = event.result.targets[0]; + player.logSkill("dcshizong", target); + if (!player.countMark("dcshizong")) + player + .when({ global: "phaseAfter" }) + .then(() => delete player.storage.dcshizong); + player.addMark("dcshizong", 1, false); + yield player.give(event.result.cards.slice(), target); + var viewAs = new lib.element.VCard({ + name: event.result.card.name, + nature: event.result.card.nature, + isCard: true, + }); + var result = yield target + .chooseCard( + "恃纵:是否将一张牌置于牌堆底?", + `若如此做,${get.translation(player)}视为使用一张${get.translation( + viewAs.nature + )}【${get.translation(viewAs.name)}】`, + "he" + ) + .set("ai", (card) => { + if (get.event("goon")) return 7 - get.value(card); + return 0; + }) + .set( + "goon", + get.attitude(target, player) * (player.getUseValue(viewAs) || 1) >= 1 + ); + var card = event.result.cards[0]; + if (result.bool) { + var card = result.cards[0]; game.delayex(); - var next=target.loseToDiscardpile(card,ui.cardPile); - next.log=false; - if(get.position(card)=='e'){ - game.log(target,'将',card,'置于了牌堆底'); + var next = target.loseToDiscardpile(card, ui.cardPile); + next.log = false; + if (get.position(card) == "e") { + game.log(target, "将", card, "置于了牌堆底"); + } else { + next.blank = true; + game.log(target, "将一张牌置于了牌堆底"); } - else{ - next.blank=true; - game.log(target,'将一张牌置于了牌堆底'); - } - result=yield next; - game.broadcastAll(viewAs=>{ - lib.skill.dcshizong_backup2.viewAs=viewAs; - },lib.skill.dcshizong_backup.viewAs); - var evt=event.getParent(); - evt.set('_backupevent','dcshizong_backup2'); - evt.set('openskilldialog',`请选择${get.translation(viewAs.nature)}${get.translation(viewAs.name)}的目标`); - evt.backup('dcshizong_backup2'); - evt.set('norestore',true); - evt.set('custom',{ - add:{}, - replace:{window:function(){}} + result = yield next; + game.broadcastAll((viewAs) => { + lib.skill.dcshizong_backup2.viewAs = viewAs; + }, lib.skill.dcshizong_backup.viewAs); + var evt = event.getParent(); + evt.set("_backupevent", "dcshizong_backup2"); + evt.set( + "openskilldialog", + `请选择${get.translation(viewAs.nature)}${get.translation( + viewAs.name + )}的目标` + ); + evt.backup("dcshizong_backup2"); + evt.set("norestore", true); + evt.set("custom", { + add: {}, + replace: { window: function () {} }, }); evt.goto(0); - if(target!=_status.currentPhase) player.tempBanSkill('dcshizong'); - } - else{ - target.chat('不放!'); - game.log(target,'选择不将牌置于牌堆底'); - var evt=event.getParent(); - evt.set('dcshizong',true); + if (target != _status.currentPhase) player.tempBanSkill("dcshizong"); + } else { + target.chat("不放!"); + game.log(target, "选择不将牌置于牌堆底"); + var evt = event.getParent(); + evt.set("dcshizong", true); evt.goto(0); } game.delayx(); }, - ai:{ - order:10, + ai: { + order: 10, }, - } + }; + }, + prompt: function (links, player) { + return `###恃纵:选择要交出的牌和目标角色###将${get.cnNumber( + player.countMark("dcshizong") + 1 + )}张牌交给一名其他角色,其可以选择将一张牌置于牌堆底,视为你使用一张${get.translation( + links[0][3] || "" + )}${get.translation(links[0][2])}。`; }, - prompt:function(links,player){ - return `###恃纵:选择要交出的牌和目标角色###将${get.cnNumber(player.countMark('dcshizong')+1)}张牌交给一名其他角色,其可以选择将一张牌置于牌堆底,视为你使用一张${get.translation(links[0][3]||'')}${get.translation(links[0][2])}。`; - } }, - ai:{ - order:function(){ - const player=get.player(),event=get.event(); - if(event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0){ - return get.order({name:'jiu'})+0.1; + ai: { + order: function () { + const player = get.player(), + event = get.event(); + if ( + event.filterCard({ name: "jiu" }, player, event) && + get.effect(player, { name: "jiu" }) > 0 + ) { + return get.order({ name: "jiu" }) + 0.1; } - return get.order({name:'sha'})+0.1; + return get.order({ name: "sha" }) + 0.1; }, - respondSha:true, - fireAttack:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='fireAttack') return true; - if(player.countCards('he')false, - selectCard:-1, - precontent:function(){ + subSkill: { + backup: {}, + backup2: { + filterCard: () => false, + selectCard: -1, + precontent: function () { delete event.result.skill; - } + }, }, }, }, //张曼成 - dclvecheng:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - player.addTempSkill('dclvecheng_xiongluan'); - player.markAuto('dclvecheng_xiongluan',[target]); - var cards=player.getCards('h','sha'); - if(cards.length) player.addGaintag(cards,'dclvecheng_xiongluan'); + dclvecheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + player.addTempSkill("dclvecheng_xiongluan"); + player.markAuto("dclvecheng_xiongluan", [target]); + var cards = player.getCards("h", "sha"); + if (cards.length) player.addGaintag(cards, "dclvecheng_xiongluan"); }, - ai:{ - threaten:3.1, - order:3.5, - expose:0.2, - result:{ - target:function(player,target){ - if(player.getStorage('dclvecheng_xiongluan').includes(target)) return 0; - if(target.hasSkillTag('freeShan',false,{ - player:player - },true)) return -0.6; - var hs=player.countCards('h',card=>{ - if(!player.canUse(card,target)) return false; - return get.name(card)=='sha'&&get.effect(target,card,player,player)>0; + ai: { + threaten: 3.1, + order: 3.5, + expose: 0.2, + result: { + target: function (player, target) { + if (player.getStorage("dclvecheng_xiongluan").includes(target)) return 0; + if ( + target.hasSkillTag( + "freeShan", + false, + { + player: player, + }, + true + ) + ) + return -0.6; + var hs = player.countCards("h", (card) => { + if (!player.canUse(card, target)) return false; + return ( + get.name(card) == "sha" && get.effect(target, card, player, player) > 0 + ); }); - var ts=target.hp; - if(hs>=ts&&ts>1) return -2; + var ts = target.hp; + if (hs >= ts && ts > 1) return -2; return -1; - } - } + }, + }, }, - subSkill:{ - xiongluan:{ - trigger:{player:'phaseEnd'}, - charlotte:true, - forced:true, - popup:false, - onremove:function(player,skill){ - player.removeGaintag('dclvecheng_xiongluan'); + subSkill: { + xiongluan: { + trigger: { player: "phaseEnd" }, + charlotte: true, + forced: true, + popup: false, + onremove: function (player, skill) { + player.removeGaintag("dclvecheng_xiongluan"); delete player.storage[skill]; }, - filter:function(event,player){ - return player.getStorage('dclvecheng_xiongluan').some(i=>i.isIn()); + filter: function (event, player) { + return player.getStorage("dclvecheng_xiongluan").some((i) => i.isIn()); }, - content:function(){ - 'step 0' - event.targets=player.getStorage('dclvecheng_xiongluan').slice(); + content: function () { + "step 0"; + event.targets = player.getStorage("dclvecheng_xiongluan").slice(); event.targets.sortBySeat(); - 'step 1' - if(!event.targets.length){ + ("step 1"); + if (!event.targets.length) { event.finish(); return; } - var target=event.targets.shift(); - event.target=target; + var target = event.targets.shift(); + event.target = target; target.showHandcards(); - var cards=target.getCards('h','sha'); - if(!cards.length) event.redo(); - else event.forced=false; - 'step 2' - var forced=event.forced; - var prompt2=forced?'掠城:选择对'+get.translation(player)+'使用的【杀】':'掠城:是否依次对'+get.translation(player)+'使用所有的【杀】?'; - target.chooseToUse(forced,function(card,player,event){ - if(get.itemtype(card)!='card'||get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },prompt2).set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',player); - 'step 3' - if(result.bool){ - if(target.countCards('h','sha')){ - event.forced=true; + var cards = target.getCards("h", "sha"); + if (!cards.length) event.redo(); + else event.forced = false; + ("step 2"); + var forced = event.forced; + var prompt2 = forced + ? "掠城:选择对" + get.translation(player) + "使用的【杀】" + : "掠城:是否依次对" + get.translation(player) + "使用所有的【杀】?"; + target + .chooseToUse( + forced, + function (card, player, event) { + if (get.itemtype(card) != "card" || get.name(card) != "sha") + return false; + return lib.filter.filterCard.apply(this, arguments); + }, + prompt2 + ) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player); + ("step 3"); + if (result.bool) { + if (target.countCards("h", "sha")) { + event.forced = true; event.goto(2); return; } } - event.forced=false; + event.forced = false; event.goto(1); }, - intro:{ - content:'对$使用“掠城”【杀】无任何次数限制', + intro: { + content: "对$使用“掠城”【杀】无任何次数限制", }, - mod:{ - cardUsableTarget:function(card,player,target){ - if(!card.cards||card.cards.length!=1) return; - if(card.name=='sha'&&card.cards[0].hasGaintag('dclvecheng_xiongluan')&&player.getStorage('dclvecheng_xiongluan').includes(target)) return true; + mod: { + cardUsableTarget: function (card, player, target) { + if (!card.cards || card.cards.length != 1) return; + if ( + card.name == "sha" && + card.cards[0].hasGaintag("dclvecheng_xiongluan") && + player.getStorage("dclvecheng_xiongluan").includes(target) + ) + return true; }, - } - } - } - }, - dczhongji:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - if(player.countCards('h')>=player.maxHp) return false; - var suit=get.suit(event.card); - return !lib.suit.includes(suit)||!player.countCards('h',{suit:suit}); + }, + }, }, - check:function(event,player){ - var num=Math.min(20,player.maxHp-player.countCards('h')); - if(num<=0) return false; - var numx=player.getHistory('useSkill',evt=>{ - return evt.skill=='dczhongji'; - }).length+1; - if(numx>num) return false; - if(_status.currentPhase!=player) return true; - if(player.hasCard(card=>{ - var suit=get.suit(card); - return player.hasValueTarget(card)&&!player.hasCard(cardx=>{ - return cardx!=card&&get.suit(cardx)==suit; - }); - })) return false; + }, + dczhongji: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + if (player.countCards("h") >= player.maxHp) return false; + var suit = get.suit(event.card); + return !lib.suit.includes(suit) || !player.countCards("h", { suit: suit }); + }, + check: function (event, player) { + var num = Math.min(20, player.maxHp - player.countCards("h")); + if (num <= 0) return false; + var numx = + player.getHistory("useSkill", (evt) => { + return evt.skill == "dczhongji"; + }).length + 1; + if (numx > num) return false; + if (_status.currentPhase != player) return true; + if ( + player.hasCard((card) => { + var suit = get.suit(card); + return ( + player.hasValueTarget(card) && + !player.hasCard((cardx) => { + return cardx != card && get.suit(cardx) == suit; + }) + ); + }) + ) + return false; return true; }, - prompt2:function(event,player){ - var num=Math.min(20,player.maxHp-player.countCards('h')); - var str=num>0?'摸'+get.cnNumber(num)+'张牌,然后':''; - return str+'弃置'+get.cnNumber(1+player.getHistory('useSkill',evt=>{ - return evt.skill=='dczhongji'; - }).length)+'张牌'; + prompt2: function (event, player) { + var num = Math.min(20, player.maxHp - player.countCards("h")); + var str = num > 0 ? "摸" + get.cnNumber(num) + "张牌,然后" : ""; + return ( + str + + "弃置" + + get.cnNumber( + 1 + + player.getHistory("useSkill", (evt) => { + return evt.skill == "dczhongji"; + }).length + ) + + "张牌" + ); }, - content:function(){ - 'step 0' - var num=Math.min(20,player.maxHp-player.countCards('h')); - if(num>0) player.draw(num); - 'step 1' - var num=player.getHistory('useSkill',evt=>{ - return evt.skill=='dczhongji'; + content: function () { + "step 0"; + var num = Math.min(20, player.maxHp - player.countCards("h")); + if (num > 0) player.draw(num); + ("step 1"); + var num = player.getHistory("useSkill", (evt) => { + return evt.skill == "dczhongji"; }).length; - player.chooseToDiscard('螽集:请弃置'+get.cnNumber(num)+'张牌','he',true,num).set('ai',get.unuseful); + player + .chooseToDiscard("螽集:请弃置" + get.cnNumber(num) + "张牌", "he", true, num) + .set("ai", get.unuseful); + }, + ai: { + threaten: 3.2, }, - ai:{ - threaten:3.2, - } }, //乐周妃 - dclingkong:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame' + dclingkong: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - var cards=player.getCards('h'); - player.addGaintag(cards,'dclingkong_tag'); + content: function () { + "step 0"; + var cards = player.getCards("h"); + player.addGaintag(cards, "dclingkong_tag"); }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('dclingkong_tag')){ + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dclingkong_tag")) { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('dclingkong_tag')){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dclingkong_tag")) { return false; } }, }, - group:'dclingkong_marker', - subSkill:{ - marker:{ - audio:'dclingkong', - trigger:{player:['gainAfter','loseAsyncAfter']}, - forced:true, - filter:(event,player)=>{ - if(event.getParent('phaseDraw',true)) return false; - const evt=player.getHistory('gain',i=>!i.getParent('phaseDraw',true))[0]; - if(!evt) return false; - if(event.name=='gain'){ - if(evt!=event||event.getlx===false) return false; - } - else if(evt.getParent()!=event) return false; - const hs=player.getCards('h'); - if(!hs.length) return false; - const cards=event.getg(player); - return cards.some(card=>hs.includes(card)); + group: "dclingkong_marker", + subSkill: { + marker: { + audio: "dclingkong", + trigger: { player: ["gainAfter", "loseAsyncAfter"] }, + forced: true, + filter: (event, player) => { + if (event.getParent("phaseDraw", true)) return false; + const evt = player.getHistory("gain", (i) => !i.getParent("phaseDraw", true))[0]; + if (!evt) return false; + if (event.name == "gain") { + if (evt != event || event.getlx === false) return false; + } else if (evt.getParent() != event) return false; + const hs = player.getCards("h"); + if (!hs.length) return false; + const cards = event.getg(player); + return cards.some((card) => hs.includes(card)); }, - content:function(){ - var hs=player.getCards('h'),cards=trigger.getg(player); - cards=cards.filter(card=>hs.includes(card)); - player.addGaintag(cards,'dclingkong_tag'); + content: function () { + var hs = player.getCards("h"), + cards = trigger.getg(player); + cards = cards.filter((card) => hs.includes(card)); + player.addGaintag(cards, "dclingkong_tag"); game.delayx(); }, }, }, }, - dcxianshu:{ - audio:2, - enable:'phaseUse', - filter:(event,player)=>{ - return game.hasPlayer(current=>current!=player)&&player.hasCard(card=>card.hasGaintag('dclingkong_tag'),'h'); + dcxianshu: { + audio: 2, + enable: "phaseUse", + filter: (event, player) => { + return ( + game.hasPlayer((current) => current != player) && + player.hasCard((card) => card.hasGaintag("dclingkong_tag"), "h") + ); }, - filterCard:(card)=>card.hasGaintag('dclingkong_tag'), - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - position:'h', - check:card=>{ - const player=_status.event.player,event=_status.event,color=get.color(card); - if(color=='red'){ - return (event.getTempCache('dcxianshu','red') - ||event.putTempCache('dcxianshu','red',game.hasPlayer(current=>{ - return current!=player&¤t.hp<=player.hp&¤t.isDamaged()&&get.recoverEffect(current,player,player)>0; - }).toString()))=='true'?(7-get.value(card)):0; + filterCard: (card) => card.hasGaintag("dclingkong_tag"), + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + position: "h", + check: (card) => { + const player = _status.event.player, + event = _status.event, + color = get.color(card); + if (color == "red") { + return (event.getTempCache("dcxianshu", "red") || + event.putTempCache( + "dcxianshu", + "red", + game + .hasPlayer((current) => { + return ( + current != player && + current.hp <= player.hp && + current.isDamaged() && + get.recoverEffect(current, player, player) > 0 + ); + }) + .toString() + )) == "true" + ? 7 - get.value(card) + : 0; + } else if (color == "black") { + return (event.getTempCache("dcxianshu", "black") || + event.putTempCache( + "dcxianshu", + "black", + game + .hasPlayer((current) => { + return ( + current != player && + current.hp >= player.hp && + get.effect(current, { name: "losehp" }, player, player) > 0 + ); + }) + .toString() + )) == "true" + ? 7 - get.value(card) + : 0; } - else if(color=='black'){ - return (event.getTempCache('dcxianshu','black') - ||event.putTempCache('dcxianshu','black',game.hasPlayer(current=>{ - return current!=player&¤t.hp>=player.hp&&get.effect(current,{name:'losehp'},player,player)>0; - }).toString()))=='true'?(7-get.value(card)):0; - } - return 6-get.value(card); + return 6 - get.value(card); }, - content:function(){ - 'step 0' - player.give(cards,target,true); - event.color=get.color(cards[0],player); - 'step 1' - if(target.isIn()){ - var num=Math.min(Math.abs(target.getHp()-player.getHp()),5); - if(num>0) player.draw(num); + content: function () { + "step 0"; + player.give(cards, target, true); + event.color = get.color(cards[0], player); + ("step 1"); + if (target.isIn()) { + var num = Math.min(Math.abs(target.getHp() - player.getHp()), 5); + if (num > 0) player.draw(num); } - 'step 2' - if(event.color=='red'){ - if(target.getHp()<=player.getHp()&&target.isDamaged()) target.recover(); - } - else if(event.color=='black'){ - if(target.getHp()>=player.getHp()) target.loseHp() + ("step 2"); + if (event.color == "red") { + if (target.getHp() <= player.getHp() && target.isDamaged()) target.recover(); + } else if (event.color == "black") { + if (target.getHp() >= player.getHp()) target.loseHp(); } }, - ai:{ - combo:'dclingkong', - order:10, - result:{ - player:function(player,target){ - if(!ui.selected.cards.length) return 0; - let num=target.getHp()-player.getHp(); - const card=ui.selected.cards[0],color=get.color(card); - if(color=='red'&&target.getHp()<=player.getHp()&&target.isDamaged()) num++; - else if(color=='black'&&target.getHp()>=player.getHp()) num--; - return Math.min(Math.abs(num),5)*1.1; + ai: { + combo: "dclingkong", + order: 10, + result: { + player: function (player, target) { + if (!ui.selected.cards.length) return 0; + let num = target.getHp() - player.getHp(); + const card = ui.selected.cards[0], + color = get.color(card); + if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged()) + num++; + else if (color == "black" && target.getHp() >= player.getHp()) num--; + return Math.min(Math.abs(num), 5) * 1.1; }, - target:function(player,target){ - if(!ui.selected.cards.length) return 0; - const card=ui.selected.cards[0],color=get.color(card),val=get.value(card,target); - if(color=='red'&&target.getHp()<=player.getHp()&&target.isDamaged()) return get.recoverEffect(target,player,target)+val/1.4; - else if(color=='black'&&target.getHp()>=player.getHp()) return get.effect(target,{name:'losehp'},player,target)+val/1.4; - return val/1.4; + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + const card = ui.selected.cards[0], + color = get.color(card), + val = get.value(card, target); + if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged()) + return get.recoverEffect(target, player, target) + val / 1.4; + else if (color == "black" && target.getHp() >= player.getHp()) + return get.effect(target, { name: "losehp" }, player, target) + val / 1.4; + return val / 1.4; }, }, }, }, //吴班 - dcyouzhan:{ - audio:2, - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dcyouzhan: { + audio: 2, + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - direct:true, - filter:function(event,player){ - if(player!=_status.currentPhase) return false; - return game.hasPlayer(current=>{ - if(current==player) return false; - var evt=event.getl(current); - return evt&&evt.cards2.length; + forced: true, + direct: true, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + return game.hasPlayer((current) => { + if (current == player) return false; + var evt = event.getl(current); + return evt && evt.cards2.length; }); }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>{ - if(current==player) return false; - var evt=trigger.getl(current); - return evt&&evt.cards2.length; + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => { + if (current == player) return false; + var evt = trigger.getl(current); + return evt && evt.cards2.length; }); - event.targets=targets; - player.logSkill('dcyouzhan',targets); - 'step 1' - event.target=targets.shift(); - event.num=trigger.getl(event.target).cards2.length; - 'step 2' - player.draw().gaintag=['dcyouzhan']; - player.addTempSkill('dcyouzhan_limit'); - target.addTempSkill('dcyouzhan_effect'); - target.addMark('dcyouzhan_effect',1,false); - target.addTempSkill('dcyouzhan_draw'); - if(--event.num) event.redo(); - 'step 3' - if(targets.length){ + event.targets = targets; + player.logSkill("dcyouzhan", targets); + ("step 1"); + event.target = targets.shift(); + event.num = trigger.getl(event.target).cards2.length; + ("step 2"); + player.draw().gaintag = ["dcyouzhan"]; + player.addTempSkill("dcyouzhan_limit"); + target.addTempSkill("dcyouzhan_effect"); + target.addMark("dcyouzhan_effect", 1, false); + target.addTempSkill("dcyouzhan_draw"); + if (--event.num) event.redo(); + ("step 3"); + if (targets.length) { event.goto(1); } }, - ai:{ - damageBonus:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.target||!arg.target.hasSkill('dcyouzhan_effect')) return false; - } + ai: { + damageBonus: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.target || !arg.target.hasSkill("dcyouzhan_effect")) return false; + }, }, - subSkill:{ - effect:{ - audio:'dcyouzhan', - trigger:{ - player:'damageBegin3', + subSkill: { + effect: { + audio: "dcyouzhan", + trigger: { + player: "damageBegin3", }, - filter:function(event,player){ - return player.hasMark('dcyouzhan_effect'); + filter: function (event, player) { + return player.hasMark("dcyouzhan_effect"); }, - forced:true, - charlotte:true, - onremove:true, - content:function(){ - 'step 0' - trigger.num+=player.countMark('dcyouzhan_effect'); - player.removeSkill('dcyouzhan_effect'); + forced: true, + charlotte: true, + onremove: true, + content: function () { + "step 0"; + trigger.num += player.countMark("dcyouzhan_effect"); + player.removeSkill("dcyouzhan_effect"); }, - mark:true, - intro:{ - content:'本回合下一次受到的伤害+#', + mark: true, + intro: { + content: "本回合下一次受到的伤害+#", }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')) return 1+0.5*target.countMark('dcyouzhan_effect'); - } - } - } - }, - draw:{ - trigger:{ - global:'phaseJieshuBegin', - }, - forced:true, - charlotte:true, - filter:function(event,player){ - return !player.getHistory('damage').length; - }, - content:function(){ - player.draw(Math.min(3,player.getHistory('lose').length)); - }, - }, - limit:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('dcyouzhan'); - }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('dcyouzhan')) return true; - }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('dcyouzhan')) return false; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) + return 1 + 0.5 * target.countMark("dcyouzhan_effect"); + }, }, }, - } - } + }, + draw: { + trigger: { + global: "phaseJieshuBegin", + }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !player.getHistory("damage").length; + }, + content: function () { + player.draw(Math.min(3, player.getHistory("lose").length)); + }, + }, + limit: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcyouzhan"); + }, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcyouzhan")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcyouzhan")) return false; + }, + }, + }, + }, }, //乐蔡文姬 - dcshuangjia:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame' + dcshuangjia: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - var cards=player.getCards('h'); - player.addGaintag(cards,'dcshuangjia_tag'); + content: function () { + "step 0"; + var cards = player.getCards("h"); + player.addGaintag(cards, "dcshuangjia_tag"); }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('dcshuangjia_tag')){ + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcshuangjia_tag")) { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('dcshuangjia_tag')){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcshuangjia_tag")) { return false; } }, - globalTo:function(from,to,distance){ - return distance+Math.min(5,to.countCards('h',card=>card.hasGaintag('dcshuangjia_tag'))); - } + globalTo: function (from, to, distance) { + return ( + distance + + Math.min( + 5, + to.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag")) + ) + ); + }, }, }, - dcbeifen:{ - audio:2, - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dcbeifen: { + audio: 2, + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var evt=event.getl(player); - if(!evt||!evt.hs||!evt.hs.length) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('dcshuangjia_tag')) return true; + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcshuangjia_tag")) return true; } return false; } - return player.hasHistory('lose',evt=>{ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dcshuangjia_tag')) return true; + return player.hasHistory("lose", (evt) => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcshuangjia_tag")) return true; } return false; }); }, - forced:true, - content:function(){ - var suits=lib.suit.slice(); - player.countCards('h',card=>{ - if(!card.hasGaintag('dcshuangjia_tag')) return false; + forced: true, + content: function () { + var suits = lib.suit.slice(); + player.countCards("h", (card) => { + if (!card.hasGaintag("dcshuangjia_tag")) return false; suits.remove(get.suit(card)); }); - var cards=[]; - while(suits.length){ - var suit=suits.shift(); - var card=get.cardPile(cardx=>{ - return get.suit(cardx,false)==suit; + var cards = []; + while (suits.length) { + var suit = suits.shift(); + var card = get.cardPile((cardx) => { + return get.suit(cardx, false) == suit; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length){ - player.gain(cards,'gain2'); + if (cards.length) { + player.gain(cards, "gain2"); } }, - mod:{ - cardUsable:function(card,player){ - var len=player.countCards('h'); - var cnt=player.countCards('h',card=>card.hasGaintag('dcshuangjia_tag')); - if(2*cnt card.hasGaintag("dcshuangjia_tag")); + if (2 * cnt < len) return Infinity; }, - targetInRange:function(card,player){ - var len=player.countCards('h'); - var cnt=player.countCards('h',card=>card.hasGaintag('dcshuangjia_tag')); - if(2*cnt card.hasGaintag("dcshuangjia_tag")); + if (2 * cnt < len) return true; }, - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dcshuangjia_tag')){ - var suits=lib.suit.slice(); - player.countCards('h',cardx=>{ - if(!cardx.hasGaintag('dcshuangjia_tag')) return false; - if(card==cardx) return false; + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcshuangjia_tag")) { + var suits = lib.suit.slice(); + player.countCards("h", (cardx) => { + if (!cardx.hasGaintag("dcshuangjia_tag")) return false; + if (card == cardx) return false; suits.remove(get.suit(cardx)); }); - if(suits.length) return num+suits.length*2.5; + if (suits.length) return num + suits.length * 2.5; } }, }, }, //孟优 - dcmanzhi:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - filter:function(event,player){ - if(event.name=='phaseJieshu'){ - var del=0; - game.getGlobalHistory('changeHp',evt=>{ - if(evt.player!=player) return; - for(var phase of lib.phaseName){ - var evtx=evt.getParent(phase); - if(evtx&&evtx.name==phase){ - del+=evt.num; + dcmanzhi: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter: function (event, player) { + if (event.name == "phaseJieshu") { + var del = 0; + game.getGlobalHistory("changeHp", (evt) => { + if (evt.player != player) return; + for (var phase of lib.phaseName) { + var evtx = evt.getParent(phase); + if (evtx && evtx.name == phase) { + del += evt.num; break; } } }); - if(del!=0) return false; + if (del != 0) return false; } - return game.hasPlayer(current=>{ - if(current==player) return false; - return !player.hasSkill('dcmanzhi_1')&¤t.countCards('he')||!player.hasSkill('dcmanzhi_2')&¤t.countCards('hej'); - }) - }, - direct:true, - content:function(){ - 'step 0' - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - player.chooseTarget(get.prompt2('dcmanzhi'),(card,player,target)=>{ - if(player==target) return false; - return !player.hasSkill('dcmanzhi_1')&&target.countCards('he')||!player.hasSkill('dcmanzhi_2')&&target.countCards('hej'); - }).set('ai',target=>{ - return 1-get.attitude(get.player(),target); + return game.hasPlayer((current) => { + if (current == player) return false; + return ( + (!player.hasSkill("dcmanzhi_1") && current.countCards("he")) || + (!player.hasSkill("dcmanzhi_2") && current.countCards("hej")) + ); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - var choices=[]; - var choiceList=[ - '令其交给你两张牌,然后其视为使用一张无距离限制的【杀】', - '你获得其区域内的至多两张牌,然后交给其等量的牌并摸一张牌' + }, + direct: true, + content: function () { + "step 0"; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseTarget(get.prompt2("dcmanzhi"), (card, player, target) => { + if (player == target) return false; + return ( + (!player.hasSkill("dcmanzhi_1") && target.countCards("he")) || + (!player.hasSkill("dcmanzhi_2") && target.countCards("hej")) + ); + }) + .set("ai", (target) => { + return 1 - get.attitude(get.player(), target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var choices = []; + var choiceList = [ + "令其交给你两张牌,然后其视为使用一张无距离限制的【杀】", + "你获得其区域内的至多两张牌,然后交给其等量的牌并摸一张牌", ]; - var chosen=[player.hasSkill('dcmanzhi_1'),player.hasSkill('dcmanzhi_2')]; - if(target.countCards('he')&&(!chosen[0]||trigger.name=='phaseZhunbei')) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+(chosen[0]?'(已被选择过)':'')+''; - if(target.countCards('hej')&&(!chosen[1]||trigger.name=='phaseZhunbei')) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+(chosen[1]?'(已被选择过)':'')+''; - if(trigger.name=='phaseJieshu') choices.push('cancel2'); - player.chooseControl(choices).set('choiceList',choiceList).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(target.getUseValue({name:'sha'},false)>5&&!player.hasShan()&&trigger.name=='phaseZhunbei') return 1; - return 0; - }()).set('prompt','蛮智:请选择一项'); - } - else{ - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} + var chosen = [player.hasSkill("dcmanzhi_1"), player.hasSkill("dcmanzhi_2")]; + if (target.countCards("he") && (!chosen[0] || trigger.name == "phaseZhunbei")) + choices.push("选项一"); + else + choiceList[0] = + '' + + choiceList[0] + + (chosen[0] ? "(已被选择过)" : "") + + ""; + if (target.countCards("hej") && (!chosen[1] || trigger.name == "phaseZhunbei")) + choices.push("选项二"); + else + choiceList[1] = + '' + + choiceList[1] + + (chosen[1] ? "(已被选择过)" : "") + + ""; + if (trigger.name == "phaseJieshu") choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if ( + target.getUseValue({ name: "sha" }, false) > 5 && + !player.hasShan() && + trigger.name == "phaseZhunbei" + ) + return 1; + return 0; + })() + ) + .set("prompt", "蛮智:请选择一项"); + } else { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } event.finish(); } - 'step 2' - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} - if(result.control=='cancel2'){event.finish();return;} - player.logSkill('dcmanzhi',target); - if(result.control=='选项一'){ - player.addTempSkill('dcmanzhi_1'); - target.chooseCard(Math.min(2,target.countCards('he')),'he','蛮智:请交给'+get.translation(player)+'两张牌',true); + ("step 2"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - else{ - player.addTempSkill('dcmanzhi_2'); - player.gainPlayerCard(target,'hej',[1,2],true); + if (result.control == "cancel2") { + event.finish(); + return; + } + player.logSkill("dcmanzhi", target); + if (result.control == "选项一") { + player.addTempSkill("dcmanzhi_1"); + target.chooseCard( + Math.min(2, target.countCards("he")), + "he", + "蛮智:请交给" + get.translation(player) + "两张牌", + true + ); + } else { + player.addTempSkill("dcmanzhi_2"); + player.gainPlayerCard(target, "hej", [1, 2], true); event.goto(5); } - 'step 3' - if(result.bool){ - target.give(result.cards,player); - } - else event.finish(); - 'step 4' - target.chooseUseTarget('sha',true,'nodistance'); + ("step 3"); + if (result.bool) { + target.give(result.cards, player); + } else event.finish(); + ("step 4"); + target.chooseUseTarget("sha", true, "nodistance"); event.finish(); - 'step 5' - if(result.bool&&target.isIn()){ - var num=result.cards.length,hs=player.getCards('he'); - if(!hs.length) event.finish(); - else if(hs.lengthplayer.hasValueTarget(card),'h')){ - if(get.position(card)=='e') return 0; - return 8-get.value(card); + dczigu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + selectCard: 1, + check: function (card) { + var player = _status.event.player; + if (!player.hasSkill("dczuowei")) return 6 - get.value(card); + if ( + player.countCards("h") == player.countCards("e") + 1 && + !player.hasCard((card) => player.hasValueTarget(card), "h") + ) { + if (get.position(card) == "e") return 0; + return 8 - get.value(card); } - return 6-get.value(card); + return 6 - get.value(card); }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>{ - return current.countGainableCards(player,'e'); + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => { + return current.countGainableCards(player, "e"); }); - if(targets.length==0) event._result={bool:false}; - else if(targets.length==1) event._result={bool:true,targets:targets}; - else player.chooseTarget('自固:获得一名角色装备区里的一张牌',true,(card,player,target)=>{ - return target.countGainableCards(player,'e'); - }).set('ai',target=>{ - if(target==_status.event.player) return 10; - if(get.attitude(_status.event.player,target)<0){ - if(target.hasCard(card=>{ - return get.value(card,player)>=6; - })) return 12; - return 8; - } - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.gainPlayerCard('e',target,true); + if (targets.length == 0) event._result = { bool: false }; + else if (targets.length == 1) event._result = { bool: true, targets: targets }; + else + player + .chooseTarget( + "自固:获得一名角色装备区里的一张牌", + true, + (card, player, target) => { + return target.countGainableCards(player, "e"); + } + ) + .set("ai", (target) => { + if (target == _status.event.player) return 10; + if (get.attitude(_status.event.player, target) < 0) { + if ( + target.hasCard((card) => { + return get.value(card, player) >= 6; + }) + ) + return 12; + return 8; + } + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.gainPlayerCard("e", target, true); } - 'step 2' - if(!result.bool||target==player||!result.cards||!result.cards.some(i=>get.owner(i)==player)) player.draw(); + ("step 2"); + if ( + !result.bool || + target == player || + !result.cards || + !result.cards.some((i) => get.owner(i) == player) + ) + player.draw(); }, - ai:{ - order:function(item,player){ - if(!player.hasSkill('dczuowei')) return 9; - if(player.countCards('h')==player.countCards('e')+1&&!player.hasCard(card=>player.hasValueTarget(card),'h')) return 9; + ai: { + order: function (item, player) { + if (!player.hasSkill("dczuowei")) return 9; + if ( + player.countCards("h") == player.countCards("e") + 1 && + !player.hasCard((card) => player.hasValueTarget(card), "h") + ) + return 9; return 1; }, - result:{ - player:1 - } - } - }, - dczuowei:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - if(_status.currentPhase!=player) return false; - if(!player.hasSkill('dczuowei_ban')) return true; - return Math.sign(player.countCards('h')-Math.max(1,player.countCards('e')))>=0; + result: { + player: 1, + }, }, - direct:true, - locked:false, - content:function(){ - 'step 0' - var hs=player.countCards('h'); - var es=Math.max(1,player.countCards('e')); - var sign=Math.sign(hs-es); - event.sign=sign; - if(sign>0) player.chooseBool(get.prompt('dczuowei'),'令'+get.translation(trigger.card)+'不可被响应').set('ai',()=>1); - else if(sign==0) player.chooseTarget(get.prompt('dczuowei'),'对一名其他角色造成1点伤害',lib.filter.notMe).set('ai',target=>{ - return get.damageEffect(target,_status.event.player,_status.event.player); - }); - else player.chooseBool(get.prompt('dczuowei'),'摸两张牌,然后本回合你不能再触发该分支').set('ai',()=>1); - 'step 1' - if(!result.bool) event.finish() - else if(event.sign<=0&&!event.isMine()&&!event.isOnline()) game.delayx(); - 'step 2' - var sign=event.sign; - if(sign>0){ - player.logSkill('dczuowei'); + }, + dczuowei: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + if (!player.hasSkill("dczuowei_ban")) return true; + return Math.sign(player.countCards("h") - Math.max(1, player.countCards("e"))) >= 0; + }, + direct: true, + locked: false, + content: function () { + "step 0"; + var hs = player.countCards("h"); + var es = Math.max(1, player.countCards("e")); + var sign = Math.sign(hs - es); + event.sign = sign; + if (sign > 0) + player + .chooseBool( + get.prompt("dczuowei"), + "令" + get.translation(trigger.card) + "不可被响应" + ) + .set("ai", () => 1); + else if (sign == 0) + player + .chooseTarget( + get.prompt("dczuowei"), + "对一名其他角色造成1点伤害", + lib.filter.notMe + ) + .set("ai", (target) => { + return get.damageEffect(target, _status.event.player, _status.event.player); + }); + else + player + .chooseBool(get.prompt("dczuowei"), "摸两张牌,然后本回合你不能再触发该分支") + .set("ai", () => 1); + ("step 1"); + if (!result.bool) event.finish(); + else if (event.sign <= 0 && !event.isMine() && !event.isOnline()) game.delayx(); + ("step 2"); + var sign = event.sign; + if (sign > 0) { + player.logSkill("dczuowei"); trigger.directHit.addArray(game.players); event.finish(); - } - else if(sign==0){ - var target=result.targets[0]; - player.logSkill('dczuowei',target); + } else if (sign == 0) { + var target = result.targets[0]; + player.logSkill("dczuowei", target); target.damage(); - } - else{ - player.logSkill('dczuowei'); + } else { + player.logSkill("dczuowei"); player.draw(2); - player.addTempSkill('dczuowei_ban'); + player.addTempSkill("dczuowei_ban"); } }, - subSkill:{ - ban:{charlotte:true} + subSkill: { + ban: { charlotte: true }, }, - mod:{ - aiValue:function(player,card,num){ - if(_status.currentPhase!=player) return; - const event=get.event(); - if(!player.isPhaseUsing()) return; - if(event.type!='phase') return; - const cardsh=[],cardse=[]; - for(const cardx of ui.selected.cards){ - const pos=get.position(cardx); - if(pos=='h') cardsh.add(cardx); - else if(pos=='e') cardse.add(cardx); + mod: { + aiValue: function (player, card, num) { + if (_status.currentPhase != player) return; + const event = get.event(); + if (!player.isPhaseUsing()) return; + if (event.type != "phase") return; + const cardsh = [], + cardse = []; + for (const cardx of ui.selected.cards) { + const pos = get.position(cardx); + if (pos == "h") cardsh.add(cardx); + else if (pos == "e") cardse.add(cardx); } - const hs=player.countCards('h')-cardsh.length,es=Math.max(1,player.countCards('e')-cardse.length); - const delt=hs-es; - if(delt<=0) return; - if(get.position(card)=='h'&&delt==1) return num/1.25; + const hs = player.countCards("h") - cardsh.length, + es = Math.max(1, player.countCards("e") - cardse.length); + const delt = hs - es; + if (delt <= 0) return; + if (get.position(card) == "h" && delt == 1) return num / 1.25; }, - aiUseful:function(){ - return lib.skill.dczuowei.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.dczuowei.mod.aiValue.apply(this, arguments); }, - aiOrder:function(player,card,num){ - if(player.hasSkill('dczuowei_ban')||_status.currentPhase!=player) return; - const cardsh=[],cardse=[]; - const pos=get.position(card); - if(pos=='h') cardsh.add(card); - else if(pos=='e') cardse.add(card); - if(get.tag(card,'draw')||get.tag(card,'gain')){ - const hs=player.countCards('h')-cardsh.length,es=Math.max(1,player.countCards('e')-cardse.length+(get.type(card)=='equip')); - if(player.hasSkill('dczuowei_ban')&&hsMath.max(1,player.countCards('e'))) return [1,3]; - } - } - } + ai: { + threaten: 3, + reverseEquip: true, + effect: { + player_use: function (card, player, target, current) { + if (_status.currentPhase != player) return; + if (get.type(card) == "equip" && get.cardtag(card, "gifts")) return; + if (player.countCards("h") > Math.max(1, player.countCards("e"))) return [1, 3]; + }, + }, + }, }, //刘宠骆俊 - dcminze:{ - audio:2, - enable:'phaseUse', - filterTarget:function(card,player,target){ - if(player.getStorage('dcminze_targeted').includes(target)) return false; - return target.countCards('h')get.name(i,player))); + selectCard: [1, 2], + complexCard: true, + position: "he", + discard: false, + lose: false, + delay: false, + group: "dcminze_draw", + content: function () { + player.give(cards, target); + player.addTempSkill("dcminze_targeted", "phaseUseAfter"); + player.markAuto("dcminze_targeted", [target]); + player.addTempSkill("dcminze_given"); + player.markAuto( + "dcminze_given", + cards.map((i) => get.name(i, player)) + ); }, - ai:{ - order:6.5, - expose:0.2, + ai: { + order: 6.5, + expose: 0.2, }, - subSkill:{ - targeted:{onremove:true,charlotte:true}, - given:{ - charlotte:true, - onremove:true, - intro:{ - content:'本回合以此法交出的牌名:$', + subSkill: { + targeted: { onremove: true, charlotte: true }, + given: { + charlotte: true, + onremove: true, + intro: { + content: "本回合以此法交出的牌名:$", }, }, - draw:{ - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.getStorage('dcminze_given').length; + draw: { + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getStorage("dcminze_given").length; }, - forced:true, - locked:false, - content:function(){ - var num=Math.min(5,player.getStorage('dcminze_given').length)-player.countCards('h'); - if(num>0) player.draw(num); - } - } - } + forced: true, + locked: false, + content: function () { + var num = + Math.min(5, player.getStorage("dcminze_given").length) - + player.countCards("h"); + if (num > 0) player.draw(num); + }, + }, + }, }, - dcjini:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return player.maxHp-player.countMark('dcjini_counted')>0; + dcjini: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.maxHp - player.countMark("dcjini_counted") > 0; }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt2('dcjini'),[1,player.maxHp-player.countMark('dcjini_counted')],lib.filter.cardRecastable).set('ai',card=>{ - return 6-get.value(card); - }); - 'step 1' - if(result.bool){ - var cards=result.cards; - player.logSkill('dcjini'); - player.addTempSkill('dcjini_counted'); - player.addMark('dcjini_counted',cards.length,false); - event.recast=player.recast(cards); - } - else event.finish(); - 'step 2' - if(trigger.source&&trigger.source.isIn()&&player.hasHistory('gain',evt=>evt.getParent(2)==event.recast&&evt.cards.some(value=>get.name(value)=='sha'))){ - player.chooseToUse(function(card){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'击逆:是否对'+get.translation(trigger.source)+'使用一张不可被响应的杀?').set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',trigger.source).set('oncard',()=>{ - _status.event.directHit.addArray(game.players); + content: function () { + "step 0"; + player + .chooseCard( + get.prompt2("dcjini"), + [1, player.maxHp - player.countMark("dcjini_counted")], + lib.filter.cardRecastable + ) + .set("ai", (card) => { + return 6 - get.value(card); }); + ("step 1"); + if (result.bool) { + var cards = result.cards; + player.logSkill("dcjini"); + player.addTempSkill("dcjini_counted"); + player.addMark("dcjini_counted", cards.length, false); + event.recast = player.recast(cards); + } else event.finish(); + ("step 2"); + if ( + trigger.source && + trigger.source.isIn() && + player.hasHistory( + "gain", + (evt) => + evt.getParent(2) == event.recast && + evt.cards.some((value) => get.name(value) == "sha") + ) + ) { + player + .chooseToUse(function (card) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "击逆:是否对" + get.translation(trigger.source) + "使用一张不可被响应的杀?") + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.source) + .set("oncard", () => { + _status.event.directHit.addArray(game.players); + }); } }, - subSkill:{ - counted:{ - onremove:true, - charlotte:true - } - } + subSkill: { + counted: { + onremove: true, + charlotte: true, + }, + }, }, //乐綝 - dcporui:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - if(player==event.player) return false; - if(player.countMark('dcporui_round')>=(player.hasMark('dcgonghu_basic')?2:1)||player.countCards('h')==0) return false; - return game.hasPlayer(current=>{ - if(current==player||current==event.player) return false; - return current.hasHistory('lose',function(evt){ - return evt.cards2.length>0; - }); - })&&player.countCards('he')>0; + dcporui: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + if ( + player.countMark("dcporui_round") >= (player.hasMark("dcgonghu_basic") ? 2 : 1) || + player.countCards("h") == 0 + ) + return false; + return ( + game.hasPlayer((current) => { + if (current == player || current == event.player) return false; + return current.hasHistory("lose", function (evt) { + return evt.cards2.length > 0; + }); + }) && player.countCards("he") > 0 + ); }, - direct:true, - content:function(){ - 'step 0' - var map={}; - game.countPlayer(function(current){ - if(current==player||current==trigger.player) return false; - if(current.hasHistory('lose',function(evt){ - return evt.cards2.length>0; - })) map[current.playerid]=Math.min(5,current.getHistory('lose').reduce(function(num,evt){ - return num+evt.cards2.length; - },0))+1; + direct: true, + content: function () { + "step 0"; + var map = {}; + game.countPlayer(function (current) { + if (current == player || current == trigger.player) return false; + if ( + current.hasHistory("lose", function (evt) { + return evt.cards2.length > 0; + }) + ) + map[current.playerid] = + Math.min( + 5, + current.getHistory("lose").reduce(function (num, evt) { + return num + evt.cards2.length; + }, 0) + ) + 1; }); - player.chooseCardTarget({ - prompt:get.prompt('dcporui'), - prompt2:get.skillInfoTranslation('dcporui',player), - filterCard:function(card,player){ - return lib.filter.cardDiscardable(card,player,'dcporui'); - }, - position:'he', - filterTarget:function(card,player,target){ - return Object.keys(_status.event.map).includes(target.playerid); - }, - ai1:function(card){ - return 7-get.value(card); - }, - ai2:function(target){ - return get.effect(target,{name:'sha'},_status.event.player,_status.event.player)*_status.event.map[target.playerid]; - } - }).set('map',map); - 'step 1' - if(result.bool){ - var target=result.targets[0],cards=result.cards; - event.target=target; - player.logSkill('dcporui',target); + player + .chooseCardTarget({ + prompt: get.prompt("dcporui"), + prompt2: get.skillInfoTranslation("dcporui", player), + filterCard: function (card, player) { + return lib.filter.cardDiscardable(card, player, "dcporui"); + }, + position: "he", + filterTarget: function (card, player, target) { + return Object.keys(_status.event.map).includes(target.playerid); + }, + ai1: function (card) { + return 7 - get.value(card); + }, + ai2: function (target) { + return ( + get.effect( + target, + { name: "sha" }, + _status.event.player, + _status.event.player + ) * _status.event.map[target.playerid] + ); + }, + }) + .set("map", map); + ("step 1"); + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + event.target = target; + player.logSkill("dcporui", target); player.discard(cards); - event.num2=Math.min(5,target.getHistory('lose').reduce(function(num,evt){ - return num+evt.cards2.length; - },0)); - event.num=event.num2+1; - player.addTempSkill('dcporui_round','roundStart'); - player.addMark('dcporui_round',1,false); - } - else event.finish(); - 'step 2' - var card={name:'sha',isCard:true,storage:{dcporui:true}}; - if(player.canUse(card,target,false)&&target.isIn()){ - player.useCard(card,target); + event.num2 = Math.min( + 5, + target.getHistory("lose").reduce(function (num, evt) { + return num + evt.cards2.length; + }, 0) + ); + event.num = event.num2 + 1; + player.addTempSkill("dcporui_round", "roundStart"); + player.addMark("dcporui_round", 1, false); + } else event.finish(); + ("step 2"); + var card = { name: "sha", isCard: true, storage: { dcporui: true } }; + if (player.canUse(card, target, false) && target.isIn()) { + player.useCard(card, target); event.num--; - } - else event.goto(4); - 'step 3' - if(event.num>0) event.goto(2); - 'step 4' - if(!player.hasMark('dcgonghu_damage')&&target.isIn()){ - var cards=player.getCards('h'); - if(cards.length==0) event._result={bool:false}; - else if(cards.length<=event.num2) event._result={bool:true,cards:cards}; - else player.chooseCard('破锐:交给'+get.translation(target)+get.cnNumber(event.num2)+'张手牌',true,event.num2); - } - else event.finish(); - 'step 5' - if(result.bool){ - player.give(result.cards,target); + } else event.goto(4); + ("step 3"); + if (event.num > 0) event.goto(2); + ("step 4"); + if (!player.hasMark("dcgonghu_damage") && target.isIn()) { + var cards = player.getCards("h"); + if (cards.length == 0) event._result = { bool: false }; + else if (cards.length <= event.num2) event._result = { bool: true, cards: cards }; + else + player.chooseCard( + "破锐:交给" + get.translation(target) + get.cnNumber(event.num2) + "张手牌", + true, + event.num2 + ); + } else event.finish(); + ("step 5"); + if (result.bool) { + player.give(result.cards, target); } event.finish(); - 'step 6' - if(player.hasMark('dcgonghu_basic')){ - if(!target.hasHistory('damage',evt=>{ - return evt.card&&evt.card.storage&&evt.card.storage.dcporui&&evt.getParent('dcporui')==event; - })){ + ("step 6"); + if (player.hasMark("dcgonghu_basic")) { + if ( + !target.hasHistory("damage", (evt) => { + return ( + evt.card && + evt.card.storage && + evt.card.storage.dcporui && + evt.getParent("dcporui") == event + ); + }) + ) { player.recover(); } } }, - subSkill:{ - round:{charlotte:true,onremove:true} + subSkill: { + round: { charlotte: true, onremove: true }, + }, + ai: { + expose: 0.4, + threaten: 3.8, }, - ai:{ - expose:0.4, - threaten:3.8, - } }, - dcgonghu:{ - audio:2, - trigger:{ - player:['loseAfter','damageEnd'], - source:'damageSource', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dcgonghu: { + audio: 2, + trigger: { + player: ["loseAfter", "damageEnd"], + source: "damageSource", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter:function(event,player){ - if(event.name=='damage'){ - if(player.hasMark('dcgonghu_damage')) return false; - var num=0; - player.getHistory('damage',evt=>num+=evt.num); - player.getHistory('sourceDamage',evt=>num+=evt.num); - return num>1; + forced: true, + filter: function (event, player) { + if (event.name == "damage") { + if (player.hasMark("dcgonghu_damage")) return false; + var num = 0; + player.getHistory("damage", (evt) => (num += evt.num)); + player.getHistory("sourceDamage", (evt) => (num += evt.num)); + return num > 1; } - if(!_status.currentPhase||_status.currentPhase==player) return false; - if(player.hasMark('dcgonghu_basic')) return false; - if(_status.currentPhase&&_status.currentPhase==player) return false; - var evt=event.getl(player); - if(!evt||!evt.cards2||!evt.cards2.some(i=>get.type2(i,player)=='basic')) return false; - var num=0; - player.getHistory('lose',function(evtx){ - if(num<2){ - if(evtx&&evtx.cards2) num+=evtx.cards2.filter(i=>get.type2(i,player)=='basic').length; + if (!_status.currentPhase || _status.currentPhase == player) return false; + if (player.hasMark("dcgonghu_basic")) return false; + if (_status.currentPhase && _status.currentPhase == player) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.some((i) => get.type2(i, player) == "basic")) + return false; + var num = 0; + player.getHistory("lose", function (evtx) { + if (num < 2) { + if (evtx && evtx.cards2) + num += evtx.cards2.filter((i) => get.type2(i, player) == "basic").length; } }); - return num>=2; + return num >= 2; }, - group:['dcgonghu_basic','dcgonghu_trick'], - content:function(){ - player.addMark('dcgonghu_'+(trigger.name=='damage'?'damage':'basic'),1,false); - game.log(player,'修改了技能','#g【破锐】'); + group: ["dcgonghu_basic", "dcgonghu_trick"], + content: function () { + player.addMark("dcgonghu_" + (trigger.name == "damage" ? "damage" : "basic"), 1, false); + game.log(player, "修改了技能", "#g【破锐】"); }, - ai:{ - combo:'dcporui' + ai: { + combo: "dcporui", }, - subSkill:{ - trick:{ - audio:'dcgonghu', - trigger:{player:'useCard2'}, - direct:true, - locked:true, - filter:function(event,player){ - if(!player.hasMark('dcgonghu_basic')||!player.hasMark('dcgonghu_damage')) return false; - var card=event.card; - if(get.color(card,false)!='red'||get.type(card,null,true)!='trick') return false; - var info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current); - })){ + subSkill: { + trick: { + audio: "dcgonghu", + trigger: { player: "useCard2" }, + direct: true, + locked: true, + filter: function (event, player) { + if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage")) + return false; + var card = event.card; + if (get.color(card, false) != "red" || get.type(card, null, true) != "trick") + return false; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加一个目标' - player.chooseTarget(get.prompt('dcgonghu_trick'),function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("dcgonghu_trick"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('dcgonghu_trick',event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("dcgonghu_trick", event.targets); trigger.targets.addArray(event.targets); } }, }, - basic:{ - audio:'dcgonghu', - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(!player.hasMark('dcgonghu_basic')||!player.hasMark('dcgonghu_damage')) return false; - var card=event.card; - return (get.color(card,false)=='red'&&get.type(card,null,false)=='basic'); + basic: { + audio: "dcgonghu", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage")) + return false; + var card = event.card; + return get.color(card, false) == "red" && get.type(card, null, false) == "basic"; }, - content:function(){ + content: function () { trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); }, }, - } + }, }, //张闿 - dcxiangshu:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&event.player.countCards('h')>=event.player.hp; + dcxiangshu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && event.player.countCards("h") >= event.player.hp; }, - content:function(){ - 'step 0' - var list=[0,1,2,3,4,5,'cancel2']; - player.chooseControl(list).set('prompt',get.prompt2('dcxiangshu')).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(get.attitude(player,trigger.player)>0) return 'cancel2'; - var cards=trigger.player.getCards('h'); - var num=0; - for(var card of cards){ - if(!trigger.player.hasValueTarget(card)){ - num++; - if(num>=5) break; - } - } - if(cards.length>=3&&Math.random()<0.5) num=Math.max(0,num-1); - return num; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('dcxiangshu',trigger.player); - var num=result.index; - player.storage.dcxiangshu_lottery=num; - player.addTempSkill('dcxiangshu_lottery','phaseUseAfter'); - } - else event.finish(); - 'step 2' - player.chooseToDiscard('相鼠:是否弃置一张牌不公布此数字?').set('ai',card=>2-get.value(card)); - 'step 3' - if(!result.bool){ - var num=player.storage.dcxiangshu_lottery; - player.markSkill('dcxiangshu_lottery'); + content: function () { + "step 0"; + var list = [0, 1, 2, 3, 4, 5, "cancel2"]; + player + .chooseControl(list) + .set("prompt", get.prompt2("dcxiangshu")) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (get.attitude(player, trigger.player) > 0) return "cancel2"; + var cards = trigger.player.getCards("h"); + var num = 0; + for (var card of cards) { + if (!trigger.player.hasValueTarget(card)) { + num++; + if (num >= 5) break; + } + } + if (cards.length >= 3 && Math.random() < 0.5) num = Math.max(0, num - 1); + return num; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("dcxiangshu", trigger.player); + var num = result.index; + player.storage.dcxiangshu_lottery = num; + player.addTempSkill("dcxiangshu_lottery", "phaseUseAfter"); + } else event.finish(); + ("step 2"); + player + .chooseToDiscard("相鼠:是否弃置一张牌不公布此数字?") + .set("ai", (card) => 2 - get.value(card)); + ("step 3"); + if (!result.bool) { + var num = player.storage.dcxiangshu_lottery; + player.markSkill("dcxiangshu_lottery"); player.popup(num); - game.log(player,'选择了数字','#g'+num); + game.log(player, "选择了数字", "#g" + num); } }, - subSkill:{ - lottery:{ - audio:'dcxiangshu', - trigger:{global:'phaseUseEnd'}, - charlotte:true, - forced:true, - onremove:true, - logTarget:'player', - filter:function(event,player){ - return typeof player.storage.dcxiangshu_lottery=='number'&&Math.abs(event.player.countCards('h')-player.storage.dcxiangshu_lottery)<=1; + subSkill: { + lottery: { + audio: "dcxiangshu", + trigger: { global: "phaseUseEnd" }, + charlotte: true, + forced: true, + onremove: true, + logTarget: "player", + filter: function (event, player) { + return ( + typeof player.storage.dcxiangshu_lottery == "number" && + Math.abs(event.player.countCards("h") - player.storage.dcxiangshu_lottery) <= + 1 + ); }, - content:function(){ - var delt=Math.abs(trigger.player.countCards('h')-player.storage.dcxiangshu_lottery); - if(delt<=1&&trigger.player.countGainableCards('he',player)>0){ - player.gainPlayerCard(trigger.player,'he',true); + content: function () { + var delt = Math.abs( + trigger.player.countCards("h") - player.storage.dcxiangshu_lottery + ); + if (delt <= 1 && trigger.player.countGainableCards("he", player) > 0) { + player.gainPlayerCard(trigger.player, "he", true); } - if(delt==0){ + if (delt == 0) { trigger.player.damage(player); } }, - intro:{content:'猜测的数字为#'} - } - } + intro: { content: "猜测的数字为#" }, + }, + }, }, //裴元绍 - dcmoyu:{ - audio:2, - init:()=>{ - game.addGlobalSkill('dcmoyu_ai'); + dcmoyu: { + audio: 2, + init: () => { + game.addGlobalSkill("dcmoyu_ai"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('dcmoyu'),true)) game.removeGlobalSkill('dcmoyu_ai'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("dcmoyu"), true)) + game.removeGlobalSkill("dcmoyu_ai"); }, - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('dcmoyu_ban')&&game.hasPlayer(current=>lib.skill.dcmoyu.filterTarget(null,player,current)); + enable: "phaseUse", + filter: function (event, player) { + return ( + !player.hasSkill("dcmoyu_ban") && + game.hasPlayer((current) => lib.skill.dcmoyu.filterTarget(null, player, current)) + ); }, - filterTarget:function(card,player,target){ - return player!=target&&!player.getStorage('dcmoyu_clear').includes(target)&&target.countGainableCards(player,'hej'); + filterTarget: function (card, player, target) { + return ( + player != target && + !player.getStorage("dcmoyu_clear").includes(target) && + target.countGainableCards(player, "hej") + ); }, - content:function(){ - 'step 0' - player.addTempSkill('dcmoyu_clear'); - player.markAuto('dcmoyu_clear',[target]); - player.gainPlayerCard(target,'hej',true); - 'step 1' - var num=player.getStorage('dcmoyu_clear').length; - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'是否对'+get.translation(player)+'使用一张无距离限制的【杀】(伤害基数为'+num+')?').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',player).set('num',num).set('oncard',card=>{ - _status.event.baseDamage=_status.event.getParent().num; - }); - 'step 2' - if(result.bool){ - if(player.hasHistory('damage',evt=>{ - return evt.card&&evt.card.name=='sha'&&evt.getParent(4)==event; - })) player.addTempSkill('dcmoyu_ban'); + content: function () { + "step 0"; + player.addTempSkill("dcmoyu_clear"); + player.markAuto("dcmoyu_clear", [target]); + player.gainPlayerCard(target, "hej", true); + ("step 1"); + var num = player.getStorage("dcmoyu_clear").length; + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "是否对" + + get.translation(player) + + "使用一张无距离限制的【杀】(伤害基数为" + + num + + ")?") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("num", num) + .set("oncard", (card) => { + _status.event.baseDamage = _status.event.getParent().num; + }); + ("step 2"); + if (result.bool) { + if ( + player.hasHistory("damage", (evt) => { + return evt.card && evt.card.name == "sha" && evt.getParent(4) == event; + }) + ) + player.addTempSkill("dcmoyu_ban"); } }, - subSkill:{ - clear:{ - charlotte:true, - onremove:true, + subSkill: { + clear: { + charlotte: true, + onremove: true, }, - ban:{ - charlotte:true, - mark:true, - marktext:'欲', - intro:{content:'偷马贼被反打了!'}, + ban: { + charlotte: true, + mark: true, + marktext: "欲", + intro: { content: "偷马贼被反打了!" }, }, - ai:{ - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('dcmoyu'),true); + ai: { + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("dcmoyu"), true); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('dcmoyu_ai'); + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("dcmoyu_ai"); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='delay'&¤t<0){ - var currentx=_status.currentPhase; - if(!currentx||!currentx.isIn()) return; - var list=game.filterPlayer(current=>{ - if(current==target) return true; - if(!current.hasSkill('dcmoyu')) return false; - if(current.hasJudge('lebu')) return false; - return get.attitude(current,target)>0; + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && current < 0) { + var currentx = _status.currentPhase; + if (!currentx || !currentx.isIn()) return; + var list = game.filterPlayer((current) => { + if (current == target) return true; + if (!current.hasSkill("dcmoyu")) return false; + if (current.hasJudge("lebu")) return false; + return get.attitude(current, target) > 0; }); list.sortBySeat(currentx); - if(list.indexOf(target)!=0) return 'zerotarget'; + if (list.indexOf(target) != 0) return "zerotarget"; } }, }, - } - } + }, + }, }, - ai:{ - order:9, - threaten:2.4, - result:{ - target:function(player,target){ - var num=get.sgn(get.attitude(player,target)); - var eff=get.effect(target,{name:'shunshou'},player,player)*num; - if(eff*num>0) return eff/10; - if(player.hasShan()&&!target.hasSkillTag('directHit_ai',true,{ - target:player, - card:{name:'sha'}, - },true)) return eff; - if(target.hasSha()&&player.hp+player.countCards('hs',function(card){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,player,'unchanged','cardSavable',player); - if(mod!='unchanged') return mod; - var savable=get.info(card).savable; - if(typeof savable=='function') savable=savable(card,player,player); - return savable; - })<=player.getStorage('dcmoyu_clear').length+1) return 0; + ai: { + order: 9, + threaten: 2.4, + result: { + target: function (player, target) { + var num = get.sgn(get.attitude(player, target)); + var eff = get.effect(target, { name: "shunshou" }, player, player) * num; + if (eff * num > 0) return eff / 10; + if ( + player.hasShan() && + !target.hasSkillTag( + "directHit_ai", + true, + { + target: player, + card: { name: "sha" }, + }, + true + ) + ) + return eff; + if ( + target.hasSha() && + player.hp + + player.countCards("hs", function (card) { + var mod2 = game.checkMod( + card, + player, + "unchanged", + "cardEnabled2", + player + ); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod( + card, + player, + player, + "unchanged", + "cardSavable", + player + ); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") + savable = savable(card, player, player); + return savable; + }) <= + player.getStorage("dcmoyu_clear").length + 1 + ) + return 0; return eff; - } - } - } + }, + }, + }, }, //张楚 - dcjizhong:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - selectTarget:1, - content:function(){ - 'step 0' - target.draw(2); - 'step 1' - var marked=target.hasMark('dcjizhong'); - var cards=target.getCards('h'); - if(marked){ - if(cards.length<=3) event._result={bool:true,cards:cards}; - else target.chooseCard(`集众:交给${get.translation(player)}三张手牌`,3,true); - } - else{ - target.chooseCard(`集众:交给${get.translation(player)}三张手牌,或点击“取消”获得“信众”标记`,3).set('ai',card=>{ - if(get.event('goon')) return 20-get.value(card); - return 1-get.value(card); - }).set('goon',get.attitude(target,player)>0); - } - 'step 2' - if(!result.bool){ - target.addMark('dcjizhong',1); - } - else{ - target.give(result.cards,player); - } - }, - marktext:'信', - intro:{ - name:'信众', - name2:'信众', - markcount:()=>0, - content:'已成为信徒', - }, - ai:{ - order:9.5, - result:{ - target:function(player,target){ - var num=target.countCards('h'); - if(num<=1) return -num; - if(get.attitude(player,target)>0) return 1; - return -1/(num/2+1); - } - } - } - }, - dcrihui:{ + dcjizhong: { audio: 2, - trigger: { player: 'useCardAfter' }, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + selectTarget: 1, + content: function () { + "step 0"; + target.draw(2); + ("step 1"); + var marked = target.hasMark("dcjizhong"); + var cards = target.getCards("h"); + if (marked) { + if (cards.length <= 3) event._result = { bool: true, cards: cards }; + else target.chooseCard(`集众:交给${get.translation(player)}三张手牌`, 3, true); + } else { + target + .chooseCard( + `集众:交给${get.translation(player)}三张手牌,或点击“取消”获得“信众”标记`, + 3 + ) + .set("ai", (card) => { + if (get.event("goon")) return 20 - get.value(card); + return 1 - get.value(card); + }) + .set("goon", get.attitude(target, player) > 0); + } + ("step 2"); + if (!result.bool) { + target.addMark("dcjizhong", 1); + } else { + target.give(result.cards, player); + } + }, + marktext: "信", + intro: { + name: "信众", + name2: "信众", + markcount: () => 0, + content: "已成为信徒", + }, + ai: { + order: 9.5, + result: { + target: function (player, target) { + var num = target.countCards("h"); + if (num <= 1) return -num; + if (get.attitude(player, target) > 0) return 1; + return -1 / (num / 2 + 1); + }, + }, + }, + }, + dcrihui: { + audio: 2, + trigger: { player: "useCardAfter" }, usable: 1, filter: function (event, player) { - if (!event.targets || event.targets.length != 1 || event.targets[0] == player) return false; + if (!event.targets || event.targets.length != 1 || event.targets[0] == player) + return false; var card = event.card; var target = event.targets[0]; - var marked = target.hasMark('dcjizhong'); - return (get.type(card) == 'trick' || get.color(card) == 'black' && get.type(card) == 'basic') && - (marked || !marked && game.hasPlayer(current => current.hasMark('dcjizhong'))); + var marked = target.hasMark("dcjizhong"); + return ( + (get.type(card) == "trick" || + (get.color(card) == "black" && get.type(card) == "basic")) && + (marked || (!marked && game.hasPlayer((current) => current.hasMark("dcjizhong")))) + ); }, - logTarget: event => event.targets[0], + logTarget: (event) => event.targets[0], prompt2(event, player) { const target = event.targets[0]; - if (target.hasMark('dcjizhong')) return '获得该角色区域内的一张牌'; + if (target.hasMark("dcjizhong")) return "获得该角色区域内的一张牌"; else { const card = { name: event.card.name, nature: event.card.nature, isCard: true }; - return '令所有有“信众”的角色依次视为对其使用一张' + get.translation(card); + return "令所有有“信众”的角色依次视为对其使用一张" + get.translation(card); } }, check(event, player) { const target = event.targets[0]; - if (target.hasMark('dcjizhong')) { - return get.effect(target, { name: 'shunshou_copy' }, event, player) > 0; - } - else { + if (target.hasMark("dcjizhong")) { + return get.effect(target, { name: "shunshou_copy" }, event, player) > 0; + } else { const card = { name: event.card.name, nature: event.card.nature, isCard: true }; let eff = 0; - game.countPlayer(current => { - if (!current.hasMark('dcjizhong') || !current.canUse(card, player, false)) return; + game.countPlayer((current) => { + if (!current.hasMark("dcjizhong") || !current.canUse(card, player, false)) return; eff += get.effect(target, card, current, player); }); return eff > 0; @@ -3594,12 +4629,13 @@ game.import('character', function () { }, async content(event, trigger, player) { const target = trigger.targets[0]; - if (target.hasMark('dcjizhong')) { - await player.gainPlayerCard(target, 'hej', true) - } - else { + if (target.hasMark("dcjizhong")) { + await player.gainPlayerCard(target, "hej", true); + } else { const card = { name: trigger.card.name, nature: trigger.card.nature, isCard: true }; - const targets = game.filterPlayer(current => current.hasMark('dcjizhong')).sortBySeat(_status.currentPhase); + const targets = game + .filterPlayer((current) => current.hasMark("dcjizhong")) + .sortBySeat(_status.currentPhase); for (const current of targets) { if (target.isIn() && current.isIn() && current.canUse(card, target, false)) { await current.useCard(card, target, false); @@ -3607,2678 +4643,3340 @@ game.import('character', function () { } } }, - ai:{ - combo:'dcjizhong' - } - }, - dcguangshi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return !game.hasPlayer(current=>current!=player&&!current.hasMark('dcjizhong')); + ai: { + combo: "dcjizhong", }, - forced:true, - content:function(){ + }, + dcguangshi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return !game.hasPlayer((current) => current != player && !current.hasMark("dcjizhong")); + }, + forced: true, + content: function () { player.draw(2); player.loseHp(); }, - ai:{ - combo:'dcjizhong' - } + ai: { + combo: "dcjizhong", + }, }, //董绾 - dcshengdu:{ - audio:2, - trigger:{player:'phaseBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('dcshengdu'),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - var att=get.attitude(player,target); - var eff=get.effect(target,{ - name:'sha', - storage:{dcjieling:true}, - },player,player); - var value=att/5; - if(value<0) value=-value/1.3; - value=Math.max(value-eff/20,0.01); + dcshengdu: { + audio: 2, + trigger: { player: "phaseBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("dcshengdu"), lib.filter.notMe).set("ai", (target) => { + var player = _status.event.player; + var att = get.attitude(player, target); + var eff = get.effect( + target, + { + name: "sha", + storage: { dcjieling: true }, + }, + player, + player + ); + var value = att / 5; + if (value < 0) value = -value / 1.3; + value = Math.max(value - eff / 20, 0.01); return value; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcshengdu',target); - target.addMark('dcshengdu',1); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcshengdu", target); + target.addMark("dcshengdu", 1); } }, - intro:{content:'mark'}, - group:'dcshengdu_effect', - subSkill:{ - effect:{ - audio:'dcshengdu', - trigger:{global:'gainAfter'}, - filter:function(event,player){ - return event.getParent(2).name=='phaseDraw'&&event.player.hasMark('dcshengdu'); + intro: { content: "mark" }, + group: "dcshengdu_effect", + subSkill: { + effect: { + audio: "dcshengdu", + trigger: { global: "gainAfter" }, + filter: function (event, player) { + return ( + event.getParent(2).name == "phaseDraw" && event.player.hasMark("dcshengdu") + ); }, - forced:true, - logTarget:'player', - content:function(){ - var num=trigger.player.countMark('dcshengdu'); - player.draw(num*trigger.cards.length); - trigger.player.removeMark('dcshengdu',num); + forced: true, + logTarget: "player", + content: function () { + var num = trigger.player.countMark("dcshengdu"); + player.draw(num * trigger.cards.length); + trigger.player.removeMark("dcshengdu", num); }, - } - } + }, + }, }, - dcjieling:{ - audio:2, - enable:'phaseUse', - position:'hs', - viewAs:{ - name:'sha', - storage:{dcjieling:true} + dcjieling: { + audio: 2, + enable: "phaseUse", + position: "hs", + viewAs: { + name: "sha", + storage: { dcjieling: true }, }, - filterCard:function(card,player){ - if(player.getStorage('dcjieling_count').includes(get.suit(card))) return false; - if(ui.selected.cards.length){ - return get.suit(card)!=get.suit(ui.selected.cards[0]); + filterCard: function (card, player) { + if (player.getStorage("dcjieling_count").includes(get.suit(card))) return false; + if (ui.selected.cards.length) { + return get.suit(card) != get.suit(ui.selected.cards[0]); } return true; }, - selectCard:2, - complexCard:true, - check:function(card){ - return 6-get.value(card); + selectCard: 2, + complexCard: true, + check: function (card) { + return 6 - get.value(card); }, - precontent:function(){ - player.addTempSkill('dcjieling_after'); - event.getParent().addCount=false; - player.addTempSkill('dcjieling_count','phaseUseAfter'); - player.markAuto('dcjieling_count',event.result.cards.reduce((list,card)=>list.add(get.suit(card,player)),[])); + precontent: function () { + player.addTempSkill("dcjieling_after"); + event.getParent().addCount = false; + player.addTempSkill("dcjieling_count", "phaseUseAfter"); + player.markAuto( + "dcjieling_count", + event.result.cards.reduce((list, card) => list.add(get.suit(card, player)), []) + ); }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'})+0.1; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; }, }, - locked:false, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.dcjieling) return true; + locked: false, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dcjieling) return true; }, - cardUsable:function(card,player,num){ - if(card.storage&&card.storage.dcjieling) return Infinity; + cardUsable: function (card, player, num) { + if (card.storage && card.storage.dcjieling) return Infinity; }, }, - subSkill:{ - after:{ - charlotte:true, - audio:'dcjieling', - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.card.storage&&event.card.storage.dcjieling; + subSkill: { + after: { + charlotte: true, + audio: "dcjieling", + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && event.card.storage && event.card.storage.dcjieling + ); }, - direct:true, - content:function(){ - 'step 0' - var damaged=game.hasPlayer2(current=>{ - return current.hasHistory('damage',evt=>evt.card==trigger.card); + direct: true, + content: function () { + "step 0"; + var damaged = game.hasPlayer2((current) => { + return current.hasHistory("damage", (evt) => evt.card == trigger.card); }); - var targets=trigger.targets.filter(i=>i.isIn()); - player.logSkill('dcjieling_after',targets); - if(damaged){ - for(var target of targets){ + var targets = trigger.targets.filter((i) => i.isIn()); + player.logSkill("dcjieling_after", targets); + if (damaged) { + for (var target of targets) { target.loseHp(); } - } - else{ - for(var target of targets){ - target.addMark('dcshengdu',1); + } else { + for (var target of targets) { + target.addMark("dcshengdu", 1); } } - } - }, - count:{ - intro:{ - content:function(s,p){ - let str='此阶段已转化过的卡牌花色:'; - for(let i=0;ievt.skill=='dcmoshou').length%3+1; - return '摸'+get.cnNumber(num)+'张牌'; + frequent: true, + prompt2: function (event, player) { + var num = + (player.getAllHistory("useSkill", (evt) => evt.skill == "dcmoshou").length % 3) + 1; + return "摸" + get.cnNumber(num) + "张牌"; }, - content:function(){ - var num=player.getAllHistory('useSkill',evt=>evt.skill=='dcmoshou').length; - player.storage.dcmoshou=num; - player.syncStorage('dcmoshou'); - player.markSkill('dcmoshou'); - num=(num-1)%3+1; + content: function () { + var num = player.getAllHistory("useSkill", (evt) => evt.skill == "dcmoshou").length; + player.storage.dcmoshou = num; + player.syncStorage("dcmoshou"); + player.markSkill("dcmoshou"); + num = ((num - 1) % 3) + 1; player.draw(num); }, - mark:true, - marktext:'守', - intro:{ - markcount:function(storage,player){ - if(typeof storage!='number') return 1; - return storage%3+1; + mark: true, + marktext: "守", + intro: { + markcount: function (storage, player) { + if (typeof storage != "number") return 1; + return (storage % 3) + 1; }, - content:'本局游戏已发动过$次技能', - } + content: "本局游戏已发动过$次技能", + }, }, - dcyunjiu:{ - audio:2, - trigger:{global:'dieAfter'}, - direct:true, - content:function(){ - 'step 0' - var evt=trigger.player.getHistory('lose',evtx=>{ - return evtx.getParent(2)==trigger; + dcyunjiu: { + audio: 2, + trigger: { global: "dieAfter" }, + direct: true, + content: function () { + "step 0"; + var evt = trigger.player.getHistory("lose", (evtx) => { + return evtx.getParent(2) == trigger; })[0]; - if(!evt) event.finish(); - else{ - var cards=[]; + if (!evt) event.finish(); + else { + var cards = []; //冷知识,角色死亡后只有手牌区和装备区的牌是被系统弃置的,其余牌的处理方式均为置入弃牌堆 cards.addArray(evt.hs).addArray(evt.es); - event.cards=cards.filterInD('d'); - var num=cards.length; - if(num){ - event.videoId=lib.status.videoId++; - var func=function(cards,id){ - var num=cards.length; - var dialog=ui.create.dialog(get.prompt('dcyunjiu'),'
    弃置'+get.cnNumber(num)+'张牌,令一名其他角色获得以下这些牌
    ',cards); - dialog.videoId=id; + event.cards = cards.filterInD("d"); + var num = cards.length; + if (num) { + event.videoId = lib.status.videoId++; + var func = function (cards, id) { + var num = cards.length; + var dialog = ui.create.dialog( + get.prompt("dcyunjiu"), + '
    弃置' + + get.cnNumber(num) + + "张牌,令一名其他角色获得以下这些牌
    ", + cards + ); + dialog.videoId = id; return dialog; }; - if(player.isOnline2()){ - player.send(func,cards,event.videoId); + if (player.isOnline2()) { + player.send(func, cards, event.videoId); } - event.dialog=func(cards,event.videoId); - if(player!=game.me||_status.auto){ - event.dialog.style.display='none'; + event.dialog = func(cards, event.videoId); + if (player != game.me || _status.auto) { + event.dialog.style.display = "none"; } player.chooseCardTarget({ - prompt:false, - filterTarget:lib.filter.notMe, - filterCard:lib.filter.cardDiscardable, - selectCard:num, - position:'he', - goon:function(){ - if(!game.hasPlayer(current=>get.attitude(player,current))>0) return false; - var value=0; - for(var card of cards){ - value+=get.value(card,player,'raw')-1.2; + prompt: false, + filterTarget: lib.filter.notMe, + filterCard: lib.filter.cardDiscardable, + selectCard: num, + position: "he", + goon: (function () { + if (!game.hasPlayer((current) => get.attitude(player, current)) > 0) + return false; + var value = 0; + for (var card of cards) { + value += get.value(card, player, "raw") - 1.2; } - return value>0; - }(), - ai1:function(card){ - if(_status.event.goon){ - if(ui.selected.cards.length==_status.event.selectCard[1]-1&&ui.selected.cards.length>0) return 7-get.value(card); - return 5.5-get.value(card); + return value > 0; + })(), + ai1: function (card) { + if (_status.event.goon) { + if ( + ui.selected.cards.length == _status.event.selectCard[1] - 1 && + ui.selected.cards.length > 0 + ) + return 7 - get.value(card); + return 5.5 - get.value(card); } return 0; }, - ai2:function(target){ - return get.attitude(_status.event.player,target)/Math.sqrt(target.countCards('h')+1); - } + ai2: function (target) { + return ( + get.attitude(_status.event.player, target) / + Math.sqrt(target.countCards("h") + 1) + ); + }, }); - } - else event.finish(); + } else event.finish(); + } + ("step 1"); + if (player.isOnline2()) { + player.send("closeDialog", event.videoId); } - 'step 1' - if(player.isOnline2()){player.send('closeDialog',event.videoId)} event.dialog.close(); - if(result.bool){ - var cardsx=result.cards,target=result.targets[0]; - player.logSkill('dcyunjiu',target); + if (result.bool) { + var cardsx = result.cards, + target = result.targets[0]; + player.logSkill("dcyunjiu", target); player.discard(cardsx); - target.gain(cards.filterInD('d'),'gain2').giver=player; - } - else event.finish(); - 'step 2' + target.gain(cards.filterInD("d"), "gain2").giver = player; + } else event.finish(); + ("step 2"); player.gainMaxHp(); player.recover(); - } + }, }, //高翔 - dcchiying:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.hp<=player.hp; + dcchiying: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.hp <= player.hp; }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>target.inRange(current)&¤t!=player).sortBySeat(player); - event.targets=targets; - if(!targets.length) event.finish(); - 'step 1' - var current=targets.shift(); - if(current.countCards('he')) current.chooseToDiscard('驰应:请弃置一张牌','he',true); - if(targets.length) event.redo(); - 'step 2' - if(target!=player){ - var cards=[]; - game.getGlobalHistory('cardMove',evt=>{ - if(evt.getParent(3)==event){ - cards.addArray(evt.cards.filter(card=>get.type(card)=='basic')); + content: function () { + "step 0"; + var targets = game + .filterPlayer((current) => target.inRange(current) && current != player) + .sortBySeat(player); + event.targets = targets; + if (!targets.length) event.finish(); + ("step 1"); + var current = targets.shift(); + if (current.countCards("he")) current.chooseToDiscard("驰应:请弃置一张牌", "he", true); + if (targets.length) event.redo(); + ("step 2"); + if (target != player) { + var cards = []; + game.getGlobalHistory("cardMove", (evt) => { + if (evt.getParent(3) == event) { + cards.addArray(evt.cards.filter((card) => get.type(card) == "basic")); } }); - cards=cards.filterInD('d'); - if(cards.length) target.gain(cards,'gain2'); + cards = cards.filterInD("d"); + if (cards.length) target.gain(cards, "gain2"); } }, - ai:{ - order:6, - result:{ - target:function(player,target){ - var targets=game.filterPlayer(current=>target.inRange(current)&¤t!=player); - var eff=0; - for(var targetx of targets){ - var effx=get.effect(targetx,{name:'guohe_copy2'},player,target); - if(get.attitude(player,targetx)<0) effx/=2; - eff+=effx; + ai: { + order: 6, + result: { + target: function (player, target) { + var targets = game.filterPlayer( + (current) => target.inRange(current) && current != player + ); + var eff = 0; + for (var targetx of targets) { + var effx = get.effect(targetx, { name: "guohe_copy2" }, player, target); + if (get.attitude(player, targetx) < 0) effx /= 2; + eff += effx; } - return (target==player?0.5:1)*eff*(get.attitude(player,target)<=0?0.75:1); - } - } - } + return ( + (target == player ? 0.5 : 1) * + eff * + (get.attitude(player, target) <= 0 ? 0.75 : 1) + ); + }, + }, + }, }, //霍峻 - dcgue:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - if(player.hasSkill('dcgue_blocker',null,null,false)) return false; - return name=='sha'||name=='shan'; + dcgue: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (player.hasSkill("dcgue_blocker", null, null, false)) return false; + return name == "sha" || name == "shan"; }, - filter:function(event,player){ - if(event.dcgue||event.type=='wuxie'||player==_status.currentPhase) return false; - if(player.hasSkill('dcgue_blocker',null,null,false)) return false; - for(var name of ['sha','shan']){ - if(event.filterCard({name:name,isCard:true},player,event)) return true; + filter: function (event, player) { + if (event.dcgue || event.type == "wuxie" || player == _status.currentPhase) return false; + if (player.hasSkill("dcgue_blocker", null, null, false)) return false; + for (var name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var vcards=[]; - for(var name of ['sha','shan']){ - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); + chooseButton: { + dialog: function (event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); } - return ui.create.dialog('孤扼',[vcards,'vcard'],'hidden'); + return ui.create.dialog("孤扼", [vcards, "vcard"], "hidden"); }, - check:function(button){ - if(_status.event.player.countCards('h',{name:['sha','shan']})>1) return 0; + check: function (button) { + if (_status.event.player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0; return 1; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:()=>false, - selectCard:-1, - viewAs:{ - name:links[0][2], - isCard:true, + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, }, - popname:true, - precontent:function(){ - 'step 0' - player.logSkill('dcgue'); - player.addTempSkill('dcgue_blocker'); - if(player.countCards('h')) player.showHandcards(); + popname: true, + precontent: function () { + "step 0"; + player.logSkill("dcgue"); + player.addTempSkill("dcgue_blocker"); + if (player.countCards("h")) player.showHandcards(); delete event.result.skill; - 'step 1' - if(player.countCards('h',{name:['sha','shan']})>1){ - var evt=event.getParent(); - evt.set('dcgue',true); + ("step 1"); + if (player.countCards("h", { name: ["sha", "shan"] }) > 1) { + var evt = event.getParent(); + evt.set("dcgue", true); evt.goto(0); delete evt.openskilldialog; return; } game.delayx(); }, - } + }; + }, + prompt: function (links, player) { + return ( + (player.countCards ? "展示所有手牌" : "") + + (player.countCards("h", { name: ["sha", "shan"] }) <= 1 + ? ",然后视为使用【" + get.translation(links[0][2]) + "】" + : "") + ); }, - prompt:function(links,player){ - return (player.countCards?'展示所有手牌':'')+(player.countCards('h',{name:['sha','shan']})<=1?',然后视为使用【'+get.translation(links[0][2])+'】':''); - } }, - subSkill:{blocker:{charlotte:true}}, - ai:{ - order:1, - respondSha:true, - respondShan:true, - skillTagFilter:function(player){ - if(player.hasSkill('dcgue_blocker',null,null,false)) return false; + subSkill: { blocker: { charlotte: true } }, + ai: { + order: 1, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if (player.hasSkill("dcgue_blocker", null, null, false)) return false; }, - result:{ - player:function(player){ - if(player.countCards('h',{name:['sha','shan']})>1) return 0; + result: { + player: function (player) { + if (player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0; return 1; - } - } - } + }, + }, + }, }, - dcsigong:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - if(player.hasSkill('dcsigong_round')) return false; - if(event.player==player||!event.player.isIn()) return false; - if(!player.canUse('sha',event.player,false)) return false; - var respondEvts=[]; - game.countPlayer2(current=>respondEvts.addArray(current.getHistory('useCard')).addArray(current.getHistory('respond'))); - respondEvts=respondEvts.filter(i=>i.respondTo).map(evt=>evt.respondTo); - return event.player.hasHistory('useCard',evt=>{ - return respondEvts.some(list=>list[1]==evt.card); + dcsigong: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + if (player.hasSkill("dcsigong_round")) return false; + if (event.player == player || !event.player.isIn()) return false; + if (!player.canUse("sha", event.player, false)) return false; + var respondEvts = []; + game.countPlayer2((current) => + respondEvts + .addArray(current.getHistory("useCard")) + .addArray(current.getHistory("respond")) + ); + respondEvts = respondEvts.filter((i) => i.respondTo).map((evt) => evt.respondTo); + return event.player.hasHistory("useCard", (evt) => { + return respondEvts.some((list) => list[1] == evt.card); }); }, - direct:true, - content:function(){ - 'step 0' - var num=1-player.countCards('h'); - event.num=num; - var prompt2=''; - if(num>=0){ - var next=player.chooseBool().set('ai',()=>_status.event.goon); - prompt2+=(num>0?'摸一张牌,':'')+'视为对'+get.translation(trigger.player)+'使用一张【杀】(伤害基数+1)'; + direct: true, + content: function () { + "step 0"; + var num = 1 - player.countCards("h"); + event.num = num; + var prompt2 = ""; + if (num >= 0) { + var next = player.chooseBool().set("ai", () => _status.event.goon); + prompt2 += + (num > 0 ? "摸一张牌," : "") + + "视为对" + + get.translation(trigger.player) + + "使用一张【杀】(伤害基数+1)"; + } else { + var next = player + .chooseToDiscard(-num) + .set("ai", (card) => { + if (_status.event.goon) return 5.2 - get.value(card); + return 0; + }) + .set("logSkill", ["dcsigong", trigger.player]); + prompt2 += + "将手牌数弃置至1,视为对" + + get.translation(trigger.player) + + "使用一张【杀】(伤害基数+1)"; } - else{ - var next=player.chooseToDiscard(-num).set('ai',card=>{ - if(_status.event.goon) return 5.2-get.value(card); - return 0; - }).set('logSkill',['dcsigong',trigger.player]); - prompt2+='将手牌数弃置至1,视为对'+get.translation(trigger.player)+'使用一张【杀】(伤害基数+1)'; - } - next.set('prompt',get.prompt('dcsigong',trigger.player)); - next.set('prompt2',prompt2); - next.set('goon',get.effect(trigger.player,{name:'sha'},player,player)>0); - 'step 1' - if(result.bool){ - if(num>=0) player.logSkill('dcsigong',trigger.player); - if(num>0) player.draw(num,'nodelay'); - event.num=Math.max(1,Math.abs(num)); - } - else event.finish(); - 'step 2' - if(player.canUse('sha',trigger.player,false)){ - player.addTempSkill('dcsigong_check'); - player.useCard({name:'sha',isCard:true},trigger.player,false).set('shanReq',num).set('oncard',card=>{ - var evt=_status.event; - evt.baseDamage++; - for(var target of game.filterPlayer(null,null,true)){ - var id=target.playerid; - var map=evt.customArgs; - if(!map[id]) map[id]={}; - map[id].shanRequired=evt.shanReq; - } - }); + next.set("prompt", get.prompt("dcsigong", trigger.player)); + next.set("prompt2", prompt2); + next.set("goon", get.effect(trigger.player, { name: "sha" }, player, player) > 0); + ("step 1"); + if (result.bool) { + if (num >= 0) player.logSkill("dcsigong", trigger.player); + if (num > 0) player.draw(num, "nodelay"); + event.num = Math.max(1, Math.abs(num)); + } else event.finish(); + ("step 2"); + if (player.canUse("sha", trigger.player, false)) { + player.addTempSkill("dcsigong_check"); + player + .useCard({ name: "sha", isCard: true }, trigger.player, false) + .set("shanReq", num) + .set("oncard", (card) => { + var evt = _status.event; + evt.baseDamage++; + for (var target of game.filterPlayer(null, null, true)) { + var id = target.playerid; + var map = evt.customArgs; + if (!map[id]) map[id] = {}; + map[id].shanRequired = evt.shanReq; + } + }); } }, - subSkill:{ - round:{charlotte:true}, - check:{ - charlotte:true, - forced:true, - popup:false, - trigger:{source:'damageSource'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.getParent(3).name=='dcsigong'; + subSkill: { + round: { charlotte: true }, + check: { + charlotte: true, + forced: true, + popup: false, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.getParent(3).name == "dcsigong" + ); }, - content:function(){ - player.addTempSkill('dcsigong_round','roundStart'); - } - } - } + content: function () { + player.addTempSkill("dcsigong_round", "roundStart"); + }, + }, + }, }, //孙寒华 - dchuiling:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - direct:true, - filter:function(){ - return ui.discardPile.childNodes.length>0; + dchuiling: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + direct: true, + filter: function () { + return ui.discardPile.childNodes.length > 0; }, - onremove:true, - mark:true, - marktext:'灵', - intro:{ - name2:'灵', - mark:function(dialog,storage,player){ - dialog.addText('共有'+(storage||0)+'个标记'); - dialog.addText('注:图标的颜色代表弃牌堆中较多的颜色'); + onremove: true, + mark: true, + marktext: "灵", + intro: { + name2: "灵", + mark: function (dialog, storage, player) { + dialog.addText("共有" + (storage || 0) + "个标记"); + dialog.addText("注:图标的颜色代表弃牌堆中较多的颜色"); }, }, - global:'dchuiling_hint', - content:function(){ - 'step 0' - var mark=false; - var red=0,black=0; - for(var i=0;iblack){ - player.logSkill('dchuiling'); + if (red == black) event.finish(); + else if (red > black) { + player.logSkill("dchuiling"); player.recover(); event.finish(); - if(get.color(trigger.card)=='black') mark=true; - event.logged=true; + if (get.color(trigger.card) == "black") mark = true; + event.logged = true; + } else { + if (!event.isMine() && !event.isOnline()) game.delayx(); + player + .chooseTarget( + get.prompt("dchuiling"), + "弃置一名角色的一张牌", + (card, player, target) => { + return target.countDiscardableCards(player, "he") > 0; + } + ) + .set("ai", (target) => { + return get.effect(target, { name: "guohe_copy2" }, _status.event.player); + }); + if (get.color(trigger.card) == "red") mark = true; } - else{ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - player.chooseTarget(get.prompt('dchuiling'),'弃置一名角色的一张牌',(card,player,target)=>{ - return target.countDiscardableCards(player,'he')>0; - }).set('ai',target=>{ - return get.effect(target,{name:'guohe_copy2'},_status.event.player); - }); - if(get.color(trigger.card)=='red') mark=true; + if (mark) { + if (!event.logged) player.logSkill("dchuiling"); + player.addMark("dchuiling", 1); + event.logged = true; } - if(mark){ - if(!event.logged) player.logSkill('dchuiling'); - player.addMark('dchuiling',1); - event.logged=true; - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - if(!event.logged) player.logSkill('dchuiling',target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + if (!event.logged) player.logSkill("dchuiling", target); else player.line(target); - player.discardPlayerCard(target,'he',true); + player.discardPlayerCard(target, "he", true); } }, - subSkill:{ - hint:{ - trigger:{ - global:['loseAfter','loseAsyncAfter','cardsDiscardAfter','equipAfter'], + subSkill: { + hint: { + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], }, - forced:true, - popup:false, - lastDo:true, - forceDie:true, - forceOut:true, - filter:function(event,player){ - if(event._dchuiling_checked) return false; - event._dchuiling_checked=true; - var cards=event.getd(); - if(!cards.filterInD('d').length) return false; + forced: true, + popup: false, + lastDo: true, + forceDie: true, + forceOut: true, + filter: function (event, player) { + if (event._dchuiling_checked) return false; + event._dchuiling_checked = true; + var cards = event.getd(); + if (!cards.filterInD("d").length) return false; return true; }, - markColor:[ - ['rgba(241, 42, 42, 0.75)', 'black'], - ['',''], - ['rgba(18, 4, 4, 0.75)', 'rgb(200, 200, 200)'] + markColor: [ + ["rgba(241, 42, 42, 0.75)", "black"], + ["", ""], + ["rgba(18, 4, 4, 0.75)", "rgb(200, 200, 200)"], ], - content:function(){ - 'step 0' - var red=0,black=0; - for(var i=0;i灵'; - for(var player of game.players){ - if(player.marks.dchuiling){ - player.marks.dchuiling.firstChild.style.backgroundColor=bgColor; - player.marks.dchuiling.firstChild.innerHTML=text; + game.broadcastAll(function (ind) { + var bgColor = lib.skill.dchuiling_hint.markColor[ind][0], + text = + ''; + for (var player of game.players) { + if (player.marks.dchuiling) { + player.marks.dchuiling.firstChild.style.backgroundColor = bgColor; + player.marks.dchuiling.firstChild.innerHTML = text; } } - },Math.sign(black-red)+1); + }, Math.sign(black - red) + 1); }, - } + }, }, - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)!='card') return; - var len=ui.discardPile.childNodes.length; - if(!len){ - var type=get.type(card); - if(type=='basic'||type=='trick'){ - if(player.getDamagedHp()>0){ - return num+(get.color(card)=='red'?15:10); + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) != "card") return; + var len = ui.discardPile.childNodes.length; + if (!len) { + var type = get.type(card); + if (type == "basic" || type == "trick") { + if (player.getDamagedHp() > 0) { + return num + (get.color(card) == "red" ? 15 : 10); } - return num+10; + return num + 10; } return; } - if(len>40) return; - var red=0,black=0; - for(var i=0;i 40) return; + var red = 0, + black = 0; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var color = get.color(ui.discardPile.childNodes[i]); + if (color == "red") red++; + if (color == "black") black++; } - if(red==black){ - var type=get.type(card); - if(type=='basic'||type=='trick'){ - if(player.getDamagedHp()>0){ - return num+(get.color(card)=='red'?15:10); + if (red == black) { + var type = get.type(card); + if (type == "basic" || type == "trick") { + if (player.getDamagedHp() > 0) { + return num + (get.color(card) == "red" ? 15 : 10); } - return num+10; + return num + 10; } return; - } - else{ - var color=get.color(card); - if(color=='red'&&redblack) return num+10; + } else { + var color = get.color(card); + if ((color == "red" && red < black) || (color == "black" && red > black)) + return num + 10; } }, - } + }, }, - dcchongxu:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'wood', - derivation:['dctaji','dcqinghuang'], - filterCard:()=>false, - selectCard:[0,1], - prompt:function(){ - return '限定技。你可以失去〖汇灵〗,增加'+Math.min(game.countPlayer(),_status.event.player.countMark('dchuiling'))+'点体力上限,然后获得〖踏寂〗和〖清荒〗。' + dcchongxu: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "wood", + derivation: ["dctaji", "dcqinghuang"], + filterCard: () => false, + selectCard: [0, 1], + prompt: function () { + return ( + "限定技。你可以失去〖汇灵〗,增加" + + Math.min(game.countPlayer(), _status.event.player.countMark("dchuiling")) + + "点体力上限,然后获得〖踏寂〗和〖清荒〗。" + ); }, - filter:function(event,player){ - return player.countMark('dchuiling')>=4; + filter: function (event, player) { + return player.countMark("dchuiling") >= 4; }, - content:function(){ - 'step 0' - player.awakenSkill('dcchongxu'); - player.removeSkills('dchuiling'); - player.gainMaxHp(Math.min(game.countPlayer(),player.countMark('dchuiling'))); - 'step 1' - player.addSkills(['dctaji','dcqinghuang']); + content: function () { + "step 0"; + player.awakenSkill("dcchongxu"); + player.removeSkills("dchuiling"); + player.gainMaxHp(Math.min(game.countPlayer(), player.countMark("dchuiling"))); + ("step 1"); + player.addSkills(["dctaji", "dcqinghuang"]); }, - ai:{ - combo:'dchuiling', - order:function(itemp,player){ - if(player.hasCard(card=>{ - return get.type(card)!='equip'&&player.getUseValue(card)>1; - },'h')) return 12; + ai: { + combo: "dchuiling", + order: function (itemp, player) { + if ( + player.hasCard((card) => { + return get.type(card) != "equip" && player.getUseValue(card) > 1; + }, "h") + ) + return 12; return 0.1; }, - result:{ - player:function(player){ - var count=player.countMark('dchuiling'); - if(count>=game.countPlayer()-1) return 1; - return (count>=6||player.hp<=2)?1:0; - } - } - } + result: { + player: function (player) { + var count = player.countMark("dchuiling"); + if (count >= game.countPlayer() - 1) return 1; + return count >= 6 || player.hp <= 2 ? 1 : 0; + }, + }, + }, }, - dctaji:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dctaji: { + audio: 2, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - locked:false, - filter:function(event,player){ - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length; + forced: true, + locked: false, + filter: function (event, player) { + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; }, - content:function(){ - 'step 0' - var evt=trigger.getParent(); - var effects=[ - ['useCard',function(){ - 'step 0' - var targets=game.filterPlayer(current=>{ - return current.countDiscardableCards(player,'he')&¤t!=player; - }); - if(!targets.length) event.finish(); - else player.chooseTarget('踏寂:弃置其他角色一张牌',true,(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('targets',targets).set('ai',target=>{ - return get.effect(target,{name:'guohe_copy2'},_status.event.player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target); - player.discardPlayerCard(target,'he',true); - } - }], - ['respond',function(){ - player.draw(); - }], - ['discard',function(){ - player.recover(); - }], - ['other',function(){ - player.addSkill('dctaji_damage'); - player.addMark('dctaji_damage',1,false); - game.log(player,'下一次对其他角色造成的伤害','#g+1'); - }] + content: function () { + "step 0"; + var evt = trigger.getParent(); + var effects = [ + [ + "useCard", + function () { + "step 0"; + var targets = game.filterPlayer((current) => { + return current.countDiscardableCards(player, "he") && current != player; + }); + if (!targets.length) event.finish(); + else + player + .chooseTarget( + "踏寂:弃置其他角色一张牌", + true, + (card, player, target) => { + return _status.event.targets.includes(target); + } + ) + .set("targets", targets) + .set("ai", (target) => { + return get.effect( + target, + { name: "guohe_copy2" }, + _status.event.player + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.discardPlayerCard(target, "he", true); + } + }, + ], + [ + "respond", + function () { + player.draw(); + }, + ], + [ + "discard", + function () { + player.recover(); + }, + ], + [ + "other", + function () { + player.addSkill("dctaji_damage"); + player.addMark("dctaji_damage", 1, false); + game.log(player, "下一次对其他角色造成的伤害", "#g+1"); + }, + ], ]; - var name=evt.name; - if(trigger.name=='loseAsync') name=evt.type; - var list=['useCard','respond','discard','other']; - if(!list.includes(name)) name='other'; - for(var i=0;i<1+player.countMark('dcqinghuang_add');i++){ - if(!list.length) break; - if(!list.includes(name)) name=list.randomRemove(1)[0]; - if(name=='useCard') list.remove('useCard'); - for(var effect of effects){ - if(effect[0]==name){ + var name = evt.name; + if (trigger.name == "loseAsync") name = evt.type; + var list = ["useCard", "respond", "discard", "other"]; + if (!list.includes(name)) name = "other"; + for (var i = 0; i < 1 + player.countMark("dcqinghuang_add"); i++) { + if (!list.length) break; + if (!list.includes(name)) name = list.randomRemove(1)[0]; + if (name == "useCard") list.remove("useCard"); + for (var effect of effects) { + if (effect[0] == name) { list.remove(name); - var next=game.createEvent('dctaji_'+name); - next.player=player; + var next = game.createEvent("dctaji_" + name); + next.player = player; next.setContent(effect[1]); break; } } } }, - subSkill:{ - damage:{ - trigger:{source:'damageBegin1'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return event.player!=player; + subSkill: { + damage: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return event.player != player; }, - content:function(){ - trigger.num+=player.countMark('dctaji_damage'); - player.removeSkill('dctaji_damage'); + content: function () { + trigger.num += player.countMark("dctaji_damage"); + player.removeSkill("dctaji_damage"); }, - intro:{ - content:'下次对其他角色造成伤害时,此伤害+#', - } - } - } + intro: { + content: "下次对其他角色造成伤害时,此伤害+#", + }, + }, + }, }, - dcqinghuang:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.maxHp>1; + dcqinghuang: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.maxHp > 1; }, - check:function(event,player){ - var num1=player.countCards('h'); - var num2=player.countCards('h',card=>player.hasValueTarget(card)); - var num3=player.getHandcardLimit(); - if(player.isDamaged()){ - return num2>1||num1-num2-num3>0; - } - else{ - return num2>2+Math.max(0,3-player.hp)||player.hp>2&&num1-num2-num3>2; + check: function (event, player) { + var num1 = player.countCards("h"); + var num2 = player.countCards("h", (card) => player.hasValueTarget(card)); + var num3 = player.getHandcardLimit(); + if (player.isDamaged()) { + return num2 > 1 || num1 - num2 - num3 > 0; + } else { + return ( + num2 > 2 + Math.max(0, 3 - player.hp) || (player.hp > 2 && num1 - num2 - num3 > 2) + ); } }, - content:function(){ + content: function () { player.loseMaxHp(); - player.addTempSkill('dcqinghuang_add'); - player.addMark('dcqinghuang_add',1,false); + player.addTempSkill("dcqinghuang_add"); + player.addMark("dcqinghuang_add", 1, false); }, - ai:{ - combo:'dctaji' + ai: { + combo: "dctaji", + }, + subSkill: { + add: { + charlotte: true, + onremove: true, + }, }, - subSkill:{ - add:{ - charlotte:true, - onremove:true, - } - } }, //孟节 - dcyinlu:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + dcyinlu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - derivation:['dcyinlu_lequan','dcyinlu_huoxi','dcyinlu_zhangqi','dcyinlu_yunxiang'], - global:['dcyinlu_lequan','dcyinlu_huoxi','dcyinlu_zhangqi','dcyinlu_yunxiang'], - group:'dcyinlu_move', - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + derivation: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"], + global: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"], + group: "dcyinlu_move", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - hasMark:function(target){ - return lib.skill.dcyinlu.derivation.some(i=>target.hasMark(i)); + hasMark: function (target) { + return lib.skill.dcyinlu.derivation.some((i) => target.hasMark(i)); }, - content:function(){ - 'step 0' - event.marks=lib.skill.dcyinlu.derivation.slice(0,3); - if(game.countPlayer()<=2) event.goto(3); - 'step 1' - player.chooseTarget('引路:令三名角色分别获得〖引路〗标记',true,3).set('targetprompt',()=>{ - return get.translation(lib.skill.dcyinlu.derivation[ui.selected.targets.length-1]); - }).set('complexSelect',true).set('ai',target=>{ - var player=_status.event.player; - if(ui.selected.targets.length==2) return get.effect(target,{name:'losehp'},player,player); - return get.attitude(player,target); - }); - 'step 2' - if(result.bool){ - var targets=result.targets; + content: function () { + "step 0"; + event.marks = lib.skill.dcyinlu.derivation.slice(0, 3); + if (game.countPlayer() <= 2) event.goto(3); + ("step 1"); + player + .chooseTarget("引路:令三名角色分别获得〖引路〗标记", true, 3) + .set("targetprompt", () => { + return get.translation( + lib.skill.dcyinlu.derivation[ui.selected.targets.length - 1] + ); + }) + .set("complexSelect", true) + .set("ai", (target) => { + var player = _status.event.player; + if (ui.selected.targets.length == 2) + return get.effect(target, { name: "losehp" }, player, player); + return get.attitude(player, target); + }); + ("step 2"); + if (result.bool) { + var targets = result.targets; player.line(targets); - for(var i=0;i
    【'+ - get.translation(mark)+'】
    '+lib.translate[mark+'_info']+'
    ']) + ("step 3"); + player.logSkill("dcyinlu", game.players); + var list = []; + for (var mark of event.marks) { + list.push([ + mark, + '", + ]); } - var target=game.filterPlayer(i=>i!=player)[0]; - if(!game.hasPlayer(current=>current!=player)) target=player; - event.target=target; - player.chooseButton(['引路:令'+get.translation(target)+'获得2枚〖引路〗标记',[list,'textbutton']]).set('ai',button=>{ - var mark=button.link; - if(mark=='dcyinlu_lequan') return 9; - if(mark=='dcyinlu_zhangqi') return 10; - return 8; - }).set('forced',true).set('selectButton',2).set('forcebutton',true); - 'step 4' - if(result.bool){ - var marks=result.links; - for(var mark of marks) target.addMark(mark,1); + var target = game.filterPlayer((i) => i != player)[0]; + if (!game.hasPlayer((current) => current != player)) target = player; + event.target = target; + player + .chooseButton([ + "引路:令" + get.translation(target) + "获得2枚〖引路〗标记", + [list, "textbutton"], + ]) + .set("ai", (button) => { + var mark = button.link; + if (mark == "dcyinlu_lequan") return 9; + if (mark == "dcyinlu_zhangqi") return 10; + return 8; + }) + .set("forced", true) + .set("selectButton", 2) + .set("forcebutton", true); + ("step 4"); + if (result.bool) { + var marks = result.links; + for (var mark of marks) target.addMark(mark, 1); event.marks.removeArray(marks); - for(var mark of event.marks) player.addMark(mark,1); + for (var mark of event.marks) player.addMark(mark, 1); } - 'step 5' - player.addMark('dcyinlu_yunxiang',1); - player.addMark('dcyinlu_xiang',1); - game.log(player,'获得了1点芸香值'); + ("step 5"); + player.addMark("dcyinlu_yunxiang", 1); + player.addMark("dcyinlu_xiang", 1); + game.log(player, "获得了1点芸香值"); }, - subSkill:{ - move:{ - audio:'dcyinlu', - trigger:{ - player:'phaseZhunbeiBegin', - global:'die', + subSkill: { + move: { + audio: "dcyinlu", + trigger: { + player: "phaseZhunbeiBegin", + global: "die", }, - direct:true, - filter:function(event,player){ - if(event.name=='die'){ + direct: true, + filter: function (event, player) { + if (event.name == "die") { return lib.skill.dcyinlu.hasMark(event.player); } - return game.hasPlayer(current=>{ + return game.hasPlayer((current) => { return lib.skill.dcyinlu.hasMark(current); - }) + }); }, - content:function(){ - 'step 0' - if(trigger.name=='die'){ - var marks=lib.skill.dcyinlu.derivation.filter(mark=>trigger.player.hasMark(mark)); - event.marks=marks; + content: function () { + "step 0"; + if (trigger.name == "die") { + var marks = lib.skill.dcyinlu.derivation.filter((mark) => + trigger.player.hasMark(mark) + ); + event.marks = marks; event.goto(3); + } else { + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseTarget( + get.prompt("dcyinlu_move"), + "移动一名角色的〖引路〗标记", + 2, + (card, player, target) => { + if (ui.selected.targets.length == 0) + return lib.skill.dcyinlu.hasMark(target); + return true; + } + ) + .set("ai", (target) => { + var player = _status.event.player; + if (ui.selected.targets.length == 0) { + var owned = lib.skill.dcyinlu.derivation.filter((i) => + target.hasMark(i) + ); + var att = get.attitude(player, target); + if (att > 0) { + if (owned.includes("dcyinlu_zhangqi")) + return target.hasCard({ suit: "spade" }, "he") ? 5 : 10; + if ( + owned.includes("dcyinlu_lequan") && + target.isHealthy() && + game.hasPlayer((current) => { + return ( + current != target && + get.recoverEffect(current, player, player) > 0 + ); + }) + ) + return 2; + return 0; + } + if (att < 0) { + if (owned.some((i) => i != "dcyinlu_zhangqi")) return 8; + return 0; + } + if ( + owned.includes("dcyinlu_zhangqi") && + game.hasPlayer((current) => { + return ( + current != target && + get.effect( + current, + { name: "losehp" }, + player, + player + ) > 0 + ); + }) + ) + return 3; + return 1; + } else { + var targetx = ui.selected.targets[0]; + var att = get.attitude(player, targetx), + att2 = get.attitude(player, target); + var owned = lib.skill.dcyinlu.derivation.filter((i) => + targetx.hasMark(i) + ); + if (att > 0) { + if (owned.includes("dcyinlu_zhangqi")) return -att2; + if (owned.includes("dcyinlu_lequan")) + return get.recoverEffect(target, player, player); + } else if (att < 0) { + if (owned.some((i) => i != "dcyinlu_zhangqi")) return att2; + } else { + if (owned.includes("dcyinlu_zhangqi")) + return get.effect( + target, + { name: "losehp" }, + player, + player + ); + return att2; + } + } + return Math.random(); + }) + .set("complexTarget", true); } - else{ - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - player.chooseTarget(get.prompt('dcyinlu_move'),'移动一名角色的〖引路〗标记',2,(card,player,target)=>{ - if(ui.selected.targets.length==0) return lib.skill.dcyinlu.hasMark(target); - return true; - }).set('ai',target=>{ - var player=_status.event.player; - if(ui.selected.targets.length==0){ - var owned=lib.skill.dcyinlu.derivation.filter(i=>target.hasMark(i)); - var att=get.attitude(player,target); - if(att>0){ - if(owned.includes('dcyinlu_zhangqi')) return target.hasCard({suit:'spade'},'he')?5:10; - if(owned.includes('dcyinlu_lequan')&&target.isHealthy()&&game.hasPlayer(current=>{ - return current!=target&&get.recoverEffect(current,player,player)>0; - })) return 2; - return 0; - } - if(att<0){ - if(owned.some(i=>i!='dcyinlu_zhangqi')) return 8; - return 0; - } - if(owned.includes('dcyinlu_zhangqi')&&game.hasPlayer(current=>{ - return current!=target&&get.effect(current,{name:'losehp'},player,player)>0; - })) return 3; - return 1; - } - else{ - var targetx=ui.selected.targets[0]; - var att=get.attitude(player,targetx),att2=get.attitude(player,target); - var owned=lib.skill.dcyinlu.derivation.filter(i=>targetx.hasMark(i)); - if(att>0){ - if(owned.includes('dcyinlu_zhangqi')) return -att2; - if(owned.includes('dcyinlu_lequan')) return get.recoverEffect(target,player,player); - } - else if(att<0){ - if(owned.some(i=>i!='dcyinlu_zhangqi')) return att2; - } - else{ - if(owned.includes('dcyinlu_zhangqi')) return get.effect(target,{name:'losehp'},player,player); - return att2; - } - } - return Math.random(); - }).set('complexTarget', true); - } - 'step 1' - if(result.bool){ - var marks=lib.skill.dcyinlu.derivation; - var targets=result.targets,owned=marks.filter(mark=>targets[0].hasMark(mark)); - event.targets=targets; - if(owned.length==1) event._result={bool:true,control:owned[0]}; - else{ - player.chooseControl(owned).set('prompt','引路:选择要移动'+get.translation(targets[0])+'的标记').set('choiceList',owned.map(mark=>{ - return '
    【'+get.translation(mark)+'】
    '+lib.translate[mark+'_info']+'
    '; - })).set('displayIndex',false).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - var att=get.attitude(player,targets[0]),att2=get.attitude(player,targets[1]); - if(att>0){ - if(owned.includes('dcyinlu_zhangqi')&&att2<0) return 'dcyinlu_zhangqi'; - if(owned.includes('dcyinlu_lequan')&&att2>0) return 'dcyinlu_lequan'; - } - else if(att<0){ - var marksx=owned.filter(i=>i!='dcyinlu_zhangqi'); - if(marksx.length&&att2>0) return marksx[0]; - return owned[0]; - } - else{ - if(owned.includes('dcyinlu_zhangqi')) return 'dcyinlu_zhangqi'; - } - if(owned.length>1) owned.remove('dcyinlu_zhangqi'); - return owned[0]; - }()); + ("step 1"); + if (result.bool) { + var marks = lib.skill.dcyinlu.derivation; + var targets = result.targets, + owned = marks.filter((mark) => targets[0].hasMark(mark)); + event.targets = targets; + if (owned.length == 1) event._result = { bool: true, control: owned[0] }; + else { + player + .chooseControl(owned) + .set( + "prompt", + "引路:选择要移动" + get.translation(targets[0]) + "的标记" + ) + .set( + "choiceList", + owned.map((mark) => { + return ( + '
    【' + + get.translation(mark) + + "】
    " + + lib.translate[mark + "_info"] + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var att = get.attitude(player, targets[0]), + att2 = get.attitude(player, targets[1]); + if (att > 0) { + if (owned.includes("dcyinlu_zhangqi") && att2 < 0) + return "dcyinlu_zhangqi"; + if (owned.includes("dcyinlu_lequan") && att2 > 0) + return "dcyinlu_lequan"; + } else if (att < 0) { + var marksx = owned.filter((i) => i != "dcyinlu_zhangqi"); + if (marksx.length && att2 > 0) return marksx[0]; + return owned[0]; + } else { + if (owned.includes("dcyinlu_zhangqi")) + return "dcyinlu_zhangqi"; + } + if (owned.length > 1) owned.remove("dcyinlu_zhangqi"); + return owned[0]; + })() + ); } - } - else{ - if(_status.connectMode) game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + } else { + if (_status.connectMode) + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); event.finish(); } - 'step 2' - if(_status.connectMode) game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); - var mark=result.control,count=targets[0].countMark(mark); - player.logSkill('dcyinlu_move',targets,false); - player.line2(targets,mark=='dcyinlu_zhangqi'?'fire':'green'); - targets[0].removeMark(mark,count); - targets[1].addMark(mark,count); + ("step 2"); + if (_status.connectMode) + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + var mark = result.control, + count = targets[0].countMark(mark); + player.logSkill("dcyinlu_move", targets, false); + player.line2(targets, mark == "dcyinlu_zhangqi" ? "fire" : "green"); + targets[0].removeMark(mark, count); + targets[1].addMark(mark, count); event.finish(); - 'step 3' - player.chooseTarget('引路:是否转移“'+get.translation(event.marks[0])+'”标记?').set('ai',target=>{ - var player=_status.event.player,mark=_status.event.mark; - if(mark=='dcyinlu_zhangqi') return get.effect(target,{name:'losehp'},player,player)+0.1; - if(mark=='dcyinlu_lequan') return get.recoverEffect(target,player,player)+get.attitude(player,target)/5; - return get.attitude(player,target); - }).set('mark',event.marks[0]); - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcyinlu_move',target); - var count=trigger.player.countMark(event.marks[0]); - trigger.player.removeMark(event.marks[0],count,false); - target.addMark(event.marks[0],count); + ("step 3"); + player + .chooseTarget("引路:是否转移“" + get.translation(event.marks[0]) + "”标记?") + .set("ai", (target) => { + var player = _status.event.player, + mark = _status.event.mark; + if (mark == "dcyinlu_zhangqi") + return get.effect(target, { name: "losehp" }, player, player) + 0.1; + if (mark == "dcyinlu_lequan") + return ( + get.recoverEffect(target, player, player) + + get.attitude(player, target) / 5 + ); + return get.attitude(player, target); + }) + .set("mark", event.marks[0]); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcyinlu_move", target); + var count = trigger.player.countMark(event.marks[0]); + trigger.player.removeMark(event.marks[0], count, false); + target.addMark(event.marks[0], count); } - 'step 5' + ("step 5"); event.marks.shift(); - if(event.marks.length) event.goto(3); - } + if (event.marks.length) event.goto(3); + }, }, - lequan:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - charlotte:true, - filter:function(event,player){ - return player.hasMark('dcyinlu_lequan')&&game.hasPlayer(current=>current.hasSkill('dcyinlu')); + lequan: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return ( + player.hasMark("dcyinlu_lequan") && + game.hasPlayer((current) => current.hasSkill("dcyinlu")) + ); }, - marktext:'乐', - intro:{ - name:'乐泉', - name2:'乐泉', - markcount:()=>0, - content:'结束阶段,你可以弃置一张♦牌并回复1点体力。' + marktext: "乐", + intro: { + name: "乐泉", + name2: "乐泉", + markcount: () => 0, + content: "结束阶段,你可以弃置一张♦牌并回复1点体力。", }, - content:function(){ - 'step 0' - player.chooseToDiscard('乐泉:是否弃置一张♦牌并回复1点体力?',{suit:'diamond'},'he').set('ai',card=>{ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).set('logSkill','dcyinlu_lequan').set('goon',get.recoverEffect(player,player)); - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + player + .chooseToDiscard( + "乐泉:是否弃置一张♦牌并回复1点体力?", + { suit: "diamond" }, + "he" + ) + .set("ai", (card) => { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("logSkill", "dcyinlu_lequan") + .set("goon", get.recoverEffect(player, player)); + ("step 1"); + if (result.bool) { player.recover(); } - } + }, }, - huoxi:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - charlotte:true, - filter:function(event,player){ - return player.hasMark('dcyinlu_huoxi')&&game.hasPlayer(current=>current.hasSkill('dcyinlu')); + huoxi: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return ( + player.hasMark("dcyinlu_huoxi") && + game.hasPlayer((current) => current.hasSkill("dcyinlu")) + ); }, - marktext:'藿', - intro:{ - name:'藿溪', - name2:'藿溪', - markcount:()=>0, - content:'结束阶段,你可以弃置一张♥牌并摸两张牌。' + marktext: "藿", + intro: { + name: "藿溪", + name2: "藿溪", + markcount: () => 0, + content: "结束阶段,你可以弃置一张♥牌并摸两张牌。", }, - content:function(){ - 'step 0' - player.chooseToDiscard('藿溪:是否弃置一张♥牌并摸两张牌?',{suit:'heart'},'he').set('ai',card=>{ - return 6-get.value(card); - }).set('logSkill','dcyinlu_huoxi'); - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + player + .chooseToDiscard("藿溪:是否弃置一张♥牌并摸两张牌?", { suit: "heart" }, "he") + .set("ai", (card) => { + return 6 - get.value(card); + }) + .set("logSkill", "dcyinlu_huoxi"); + ("step 1"); + if (result.bool) { player.draw(2); } }, }, - zhangqi:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - direct:true, - charlotte:true, - filter:function(event,player){ - return player.hasMark('dcyinlu_zhangqi')&&game.hasPlayer(current=>current.hasSkill('dcyinlu')); + zhangqi: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + direct: true, + charlotte: true, + filter: function (event, player) { + return ( + player.hasMark("dcyinlu_zhangqi") && + game.hasPlayer((current) => current.hasSkill("dcyinlu")) + ); }, - marktext:'瘴', - intro:{ - name:'瘴气', - name2:'瘴气', - markcount:()=>0, - content:'锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。' + marktext: "瘴", + intro: { + name: "瘴气", + name2: "瘴气", + markcount: () => 0, + content: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。", }, - content:function(){ - 'step 0' - player.chooseToDiscard('瘴气:弃置一张♠牌,或失去1点体力',{suit:'spade'},'he').set('ai',card=>{ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).set('logSkill','dcyinlu_zhangqi').set('goon',get.effect(player,{name:'losehp'},player)<0); - 'step 1' - if(!result.bool){ - player.logSkill('dcyinlu_zhangqi'); + content: function () { + "step 0"; + player + .chooseToDiscard("瘴气:弃置一张♠牌,或失去1点体力", { suit: "spade" }, "he") + .set("ai", (card) => { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("logSkill", "dcyinlu_zhangqi") + .set("goon", get.effect(player, { name: "losehp" }, player) < 0); + ("step 1"); + if (!result.bool) { + player.logSkill("dcyinlu_zhangqi"); player.loseHp(); } - } - }, - yunxiang:{ - trigger:{player:['phaseJieshuBegin','damageBegin4']}, - direct:true, - charlotte:true, - filter:function(event,player){ - if(!game.hasPlayer(current=>current.hasSkill('dcyinlu'))) return false; - if(event.name=='phaseJieshu') return player.hasMark('dcyinlu_yunxiang'); - return player.hasMark('dcyinlu_yunxiang')&&player.hasMark('dcyinlu_xiang'); }, - onremove:function(player){ + }, + yunxiang: { + trigger: { player: ["phaseJieshuBegin", "damageBegin4"] }, + direct: true, + charlotte: true, + filter: function (event, player) { + if (!game.hasPlayer((current) => current.hasSkill("dcyinlu"))) return false; + if (event.name == "phaseJieshu") return player.hasMark("dcyinlu_yunxiang"); + return player.hasMark("dcyinlu_yunxiang") && player.hasMark("dcyinlu_xiang"); + }, + onremove: function (player) { delete player.storage.dcyinlu_xiang; }, - marktext:'芸', - intro:{ - name:'芸香', - name2:'芸香', - markcount:function(storage,player){ - return player.countMark('dcyinlu_xiang'); + marktext: "芸", + intro: { + name: "芸香", + name2: "芸香", + markcount: function (storage, player) { + return player.countMark("dcyinlu_xiang"); }, - content:function(storage,player){ - return '①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。
  • 当前芸香值:'+player.countMark('dcyinlu_xiang'); + content: function (storage, player) { + return ( + "①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。
  • 当前芸香值:" + + player.countMark("dcyinlu_xiang") + ); + }, + }, + content: function () { + "step 0"; + if (trigger.name == "phaseJieshu") { + player + .chooseToDiscard( + "芸香:是否弃置一张♣牌,获得1枚“香”?", + { suit: "club" }, + "he" + ) + .set("ai", (card) => { + return ( + 6 - + get.value(card) + + 2.5 * _status.event.player.countMark("dcyinlu_xiang") + ); + }) + .set("logSkill", "dcyinlu_yunxiang"); + } else { + player + .chooseBool( + "芸香:是否移去所有“香”,令此伤害-" + + player.countMark("dcyinlu_xiang") + + "?" + ) + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.damageEffect(player, trigger.source, player) < 0); + } + ("step 1"); + if (result.bool) { + if (trigger.name == "phaseJieshu") { + player.addMark("dcyinlu_xiang", 1, false); + game.log(player, "获得了1点芸香值"); + } else { + player.logSkill("dcyinlu_yunxiang"); + var num = player.countMark("dcyinlu_xiang"); + player.removeMark("dcyinlu_xiang", num, false); + game.log(player, "扣减了", num, "点芸香值"); + trigger.num = Math.max(0, trigger.num - num); + } } }, - content:function(){ - 'step 0' - if(trigger.name=='phaseJieshu'){ - player.chooseToDiscard('芸香:是否弃置一张♣牌,获得1枚“香”?',{suit:'club'},'he').set('ai',card=>{ - return 6-get.value(card)+2.5*_status.event.player.countMark('dcyinlu_xiang'); - }).set('logSkill','dcyinlu_yunxiang'); - } - else{ - player.chooseBool('芸香:是否移去所有“香”,令此伤害-'+player.countMark('dcyinlu_xiang')+'?').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.damageEffect(player,trigger.source,player)<0); - } - 'step 1' - if(result.bool){ - if(trigger.name=='phaseJieshu'){ - player.addMark('dcyinlu_xiang',1,false); - game.log(player,'获得了1点芸香值'); - } - else{ - player.logSkill('dcyinlu_yunxiang'); - var num=player.countMark('dcyinlu_xiang'); - player.removeMark('dcyinlu_xiang',num,false); - game.log(player,'扣减了',num,'点芸香值'); - trigger.num=Math.max(0,trigger.num-num); - } - } - } - } - } + }, + }, }, - dcyouqi:{ - audio:2, - trigger:{global:'loseAfter'}, - filter:function(event,player){ - if(event.getParent(3).name.indexOf('dcyinlu_')!=0||player==event.player) return false; + dcyouqi: { + audio: 2, + trigger: { global: "loseAfter" }, + filter: function (event, player) { + if (event.getParent(3).name.indexOf("dcyinlu_") != 0 || player == event.player) + return false; return true; }, - derivation:'dcyouqi_faq', - direct:true, - forced:true, - content:function(){ - if(Math.random()<1.25-0.25*get.distance(player,trigger.player)||get.isLuckyStar(player)){ - player.logSkill('dcyouqi'); - player.gain(trigger.cards.filterInD('d'),'gain2'); + derivation: "dcyouqi_faq", + direct: true, + forced: true, + content: function () { + if ( + Math.random() < 1.25 - 0.25 * get.distance(player, trigger.player) || + get.isLuckyStar(player) + ) { + player.logSkill("dcyouqi"); + player.gain(trigger.cards.filterInD("d"), "gain2"); } }, - ai:{ - combo:'dcyinlu' - } + ai: { + combo: "dcyinlu", + }, }, //孙资刘放 - dcqinshen:{ - audio:2, - trigger:{player:'phaseDiscardEnd'}, - frequent:true, - prompt2:function(){ - return '摸'+get.cnNumber(lib.skill.dcqinshen.getNum())+'张牌'; + dcqinshen: { + audio: 2, + trigger: { player: "phaseDiscardEnd" }, + frequent: true, + prompt2: function () { + return "摸" + get.cnNumber(lib.skill.dcqinshen.getNum()) + "张牌"; }, - getNum:function(){ - var list=lib.suit.slice(); - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name!='lose'&&evt.name!='cardsDiscard') return false; - if(evt.name=='lose'&&evt.position!=ui.discardPile) return false; - for(var card of evt.cards) list.remove(get.suit(card,false)); + getNum: function () { + var list = lib.suit.slice(); + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" && evt.name != "cardsDiscard") return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + for (var card of evt.cards) list.remove(get.suit(card, false)); }); return list.length; }, - filter:function(event,player){ - return lib.skill.dcqinshen.getNum()>0; + filter: function (event, player) { + return lib.skill.dcqinshen.getNum() > 0; }, - content:function(){ + content: function () { player.draw(lib.skill.dcqinshen.getNum()); - } + }, }, - dcweidang:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, + dcweidang: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, /** * @deprecated */ - getLength:card=>get.cardNameLength(card), - direct:true, - filter:function(event,player){ - var num=lib.skill.dcqinshen.getNum(); - return event.player!=player&&(_status.connectMode?player.countCards('he'):player.hasCard(card=>get.cardNameLength(card)==num,'he')); + getLength: (card) => get.cardNameLength(card), + direct: true, + filter: function (event, player) { + var num = lib.skill.dcqinshen.getNum(); + return ( + event.player != player && + (_status.connectMode + ? player.countCards("he") + : player.hasCard((card) => get.cardNameLength(card) == num, "he")) + ); }, - content:function(){ - 'step 0' - var num=lib.skill.dcqinshen.getNum(); - event.num=num; - player.chooseCard(get.prompt('dcweidang'),'将一张字数为'+num+'的牌置于牌堆底,然后获得一张字数为'+num+'的牌。若你能使用此牌,你使用之。','he',(card,player,target)=>{ - return get.cardNameLength(card)==_status.event.num; - }).set('num',num).set('ai',card=>{ - return 5-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('dcweidang'), - player.lose(result.cards[0],ui.cardPile); - game.broadcastAll(function(player){ - var cardx=ui.create.card(); - cardx.classList.add('infohidden'); - cardx.classList.add('infoflip'); - player.$throw(cardx,1000,'nobroadcast'); - },player); + content: function () { + "step 0"; + var num = lib.skill.dcqinshen.getNum(); + event.num = num; + player + .chooseCard( + get.prompt("dcweidang"), + "将一张字数为" + + num + + "的牌置于牌堆底,然后获得一张字数为" + + num + + "的牌。若你能使用此牌,你使用之。", + "he", + (card, player, target) => { + return get.cardNameLength(card) == _status.event.num; + } + ) + .set("num", num) + .set("ai", (card) => { + return 5 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("dcweidang"), player.lose(result.cards[0], ui.cardPile); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, player); game.delayx(); - } - else event.finish(); - 'step 2' - var card=get.cardPile(cardx=>get.cardNameLength(cardx)==num); - if(card){ - player.gain(card,'gain2'); - if(player.hasUseTarget(card)){ - player.chooseUseTarget(card,true); + } else event.finish(); + ("step 2"); + var card = get.cardPile((cardx) => get.cardNameLength(cardx) == num); + if (card) { + player.gain(card, "gain2"); + if (player.hasUseTarget(card)) { + player.chooseUseTarget(card, true); } } - } + }, }, //三袁 - dcneifa:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - content:function(){ - 'step 0' + dcneifa: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + content: function () { + "step 0"; player.draw(3); - player.chooseToDiscard(true,'he').set('ai',function(cardx){ - var player=_status.event.player; - var num=0; - var hs=player.getCards('h'); - var muniu=player.getEquip('muniu'); - if(muniu&&muniu.cards) hs=hs.concat(muniu.cards); - if(get.type(cardx)=='basic'){ - var shas=hs.filter(function(card){ - return card!=cardx&&get.name(card,player)=='sha'&&player.hasValueTarget(card,false); + player.chooseToDiscard(true, "he").set("ai", function (cardx) { + var player = _status.event.player; + var num = 0; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + if (muniu && muniu.cards) hs = hs.concat(muniu.cards); + if (get.type(cardx) == "basic") { + var shas = hs.filter(function (card) { + return ( + card != cardx && + get.name(card, player) == "sha" && + player.hasValueTarget(card, false) + ); }); - var numx=player.countCards('h',function(card){ - return get.type2(card,player)=='trick'; + var numx = player.countCards("h", function (card) { + return get.type2(card, player) == "trick"; }); - num+=Math.min(numx,Math.max(0,shas.length-player.getCardUsable('sha')))*0.65; - num+=Math.min(player.getCardUsable('sha')+numx,shas.filter(function(card){ - return game.countPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })>1; - }).length)*1.1; - var taos=Math.min(player.maxHp-player.hp,hs.filter(function(card){ - return cardx!=card&&get.name(card,player)=='tao'; - }).length); - num+=taos*player.getDamagedHp()*1.2; - } - else if(get.type2(cardx)=='trick'){ - var numx=Math.sqrt(Math.min(5,player.countCards('h',function(card){ - return get.type(card,player)=='basic'; - }))); - num+=hs.filter(function(card){ - return card!=cardx&&get.type2(card)=='trick'&&player.hasValueTarget(card); - }).length*0.65; - } - else num=4; - return num*1.5-get.value(cardx); + num += + Math.min(numx, Math.max(0, shas.length - player.getCardUsable("sha"))) * 0.65; + num += + Math.min( + player.getCardUsable("sha") + numx, + shas.filter(function (card) { + return ( + game.countPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) > 1 + ); + }).length + ) * 1.1; + var taos = Math.min( + player.maxHp - player.hp, + hs.filter(function (card) { + return cardx != card && get.name(card, player) == "tao"; + }).length + ); + num += taos * player.getDamagedHp() * 1.2; + } else if (get.type2(cardx) == "trick") { + var numx = Math.sqrt( + Math.min( + 5, + player.countCards("h", function (card) { + return get.type(card, player) == "basic"; + }) + ) + ); + num += + hs.filter(function (card) { + return ( + card != cardx && + get.type2(card) == "trick" && + player.hasValueTarget(card) + ); + }).length * 0.65; + } else num = 4; + return num * 1.5 - get.value(cardx); }); - 'step 1' - if(result.bool&&result.cards&&result.cards.length&&get.type(result.cards[0])!='equip'){ - var name=get.type(result.cards[0])=='basic'?'dcneifa_basic':'dcneifa_trick'; - player.addTempSkill(name,'phaseUseAfter'); - var num=Math.min(5,player.countCards('h',function(cardx){ - var type=get.type(cardx,player); - return (name=='dcneifa_basic')!=(type=='basic')&&type!='equip'; - })); - if(num>0) player.addMark(name,num,false); - else player.storage[name]=0; + ("step 1"); + if ( + result.bool && + result.cards && + result.cards.length && + get.type(result.cards[0]) != "equip" + ) { + var name = get.type(result.cards[0]) == "basic" ? "dcneifa_basic" : "dcneifa_trick"; + player.addTempSkill(name, "phaseUseAfter"); + var num = Math.min( + 5, + player.countCards("h", function (cardx) { + var type = get.type(cardx, player); + return (name == "dcneifa_basic") != (type == "basic") && type != "equip"; + }) + ); + if (num > 0) player.addMark(name, num, false); + else player.storage[name] = 0; } }, - ai:{ - threaten:2.33, + ai: { + threaten: 2.33, }, }, - dcneifa_basic:{ - mark:true, - marktext:'伐', - onremove:true, - intro:{ - name:'内伐 - 基本牌', - content:'本回合内不能使用锦囊牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。', + dcneifa_basic: { + mark: true, + marktext: "伐", + onremove: true, + intro: { + name: "内伐 - 基本牌", + content: + "本回合内不能使用锦囊牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。", }, - mod:{ - cardEnabled:function(card,player){ - if(get.type(card,'trick')=='trick') return false; + mod: { + cardEnabled: function (card, player) { + if (get.type(card, "trick") == "trick") return false; }, - cardSavable:function(card,player){ - if(get.type(card,'trick')=='trick') return false; + cardSavable: function (card, player) { + if (get.type(card, "trick") == "trick") return false; }, - cardUsable:function(card,player,num){ - if(card.name=='sha'){ - return num+player.countMark('dcneifa_basic'); + cardUsable: function (card, player, num) { + if (card.name == "sha") { + return num + player.countMark("dcneifa_basic"); } }, }, - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current,false); + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current, false); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('dcneifa'),'为'+get.translation(trigger.card)+'额外指定一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target,false); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("dcneifa"), + "为" + get.translation(trigger.card) + "额外指定一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target, false) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - player.logSkill('dcneifa',event.targets); + ("step 2"); + player.logSkill("dcneifa", event.targets); trigger.targets.addArray(event.targets); }, }, - dcneifa_trick:{ - trigger:{player:'useCard2'}, - direct:true, - mark:true, - marktext:'伐', - onremove:true, - mod:{ - cardEnabled:function(card,player){ - if(get.type(card)=='basic') return false; + dcneifa_trick: { + trigger: { player: "useCard2" }, + direct: true, + mark: true, + marktext: "伐", + onremove: true, + mod: { + cardEnabled: function (card, player) { + if (get.type(card) == "basic") return false; }, - cardSavable:function(card,player){ - if(get.type(card)=='basic') return false; + cardSavable: function (card, player) { + if (get.type(card) == "basic") return false; }, }, - intro:{ - name:'内伐 - 锦囊牌', - content:'本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标。' + intro: { + name: "内伐 - 锦囊牌", + content: "本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标。", }, - filter:function(event,player){ - if(get.type(event.card)!='trick') return false; - if(event.targets&&event.targets.length>0) return true; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current); - })){ + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (event.targets && event.targets.length > 0) return true; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加或减少一个目标' - player.chooseTarget(get.prompt('dcneifa'),function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return true; - return lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player)*(_status.event.targets.includes(target)?-1:1); - }).set('targets',trigger.targets).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; + player + .chooseTarget(get.prompt("dcneifa"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return true; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return ( + get.effect(target, trigger.card, player, player) * + (_status.event.targets.includes(target) ? -1 : 1) + ); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('dcneifa',event.targets); - if(trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("dcneifa", event.targets); + if (trigger.targets.includes(event.targets[0])) + trigger.targets.removeArray(event.targets); else trigger.targets.addArray(event.targets); } - } + }, }, //桥蕤 - dcaishou:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.hasCard(card=>card.hasGaintag('dcaishou_tag'),'h'); + dcaishou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h"); }, - forced:true, - locked:false, - group:['dcaishou_draw','dcaishou_lose'], - subfrequent:['draw'], - content:function(){ - 'step 0' - player.discard(player.getCards('h',card=>card.hasGaintag('dcaishou_tag'))); - 'step 1' - var len=0; - player.getHistory('lose',evt=>{ - if(evt.getParent(2)==event) len+=evt.cards.length; + forced: true, + locked: false, + group: ["dcaishou_draw", "dcaishou_lose"], + subfrequent: ["draw"], + content: function () { + "step 0"; + player.discard(player.getCards("h", (card) => card.hasGaintag("dcaishou_tag"))); + ("step 1"); + var len = 0; + player.getHistory("lose", (evt) => { + if (evt.getParent(2) == event) len += evt.cards.length; }); - if(len>Math.max(0,player.hp)&&player.maxHp<9){ + if (len > Math.max(0, player.hp) && player.maxHp < 9) { player.gainMaxHp(); } }, - subSkill:{ - draw:{ - audio:'dcaishou', - trigger:{player:'phaseJieshuBegin'}, - frequent:function(event,player){ - return player.maxHp>1; + subSkill: { + draw: { + audio: "dcaishou", + trigger: { player: "phaseJieshuBegin" }, + frequent: function (event, player) { + return player.maxHp > 1; }, - prompt2:function(event,player){ - return '摸'+get.cnNumber(player.maxHp)+'张牌,称为“隘”'; + prompt2: function (event, player) { + return "摸" + get.cnNumber(player.maxHp) + "张牌,称为“隘”"; }, - check:function(event,player){ - return player.maxHp>1; + check: function (event, player) { + return player.maxHp > 1; + }, + content: function () { + player.draw(player.maxHp).gaintag = ["dcaishou_tag"]; }, - content:function(){ - player.draw(player.maxHp).gaintag=['dcaishou_tag']; - } }, - lose:{ - audio:'dcaishou', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + lose: { + audio: "dcaishou", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - locked:false, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - var evt=event.getl(player); - if(!evt||!evt.hs||!evt.hs.length||player.hasCard(card=>card.hasGaintag('dcaishou_tag'),'h')) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('dcaishou_tag')) return true; + forced: true, + locked: false, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + var evt = event.getl(player); + if ( + !evt || + !evt.hs || + !evt.hs.length || + player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h") + ) + return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcaishou_tag")) return true; } return false; } - return player.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dcaishou_tag')) return true; + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcaishou_tag")) return true; } return false; }); }, - content:function(){ + content: function () { player.loseMaxHp(); - } + }, }, - } - }, - dcsaowei:{ - audio:2, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.player!=player&&event.card.name=='sha'&&event.targets.length&&!event.targets.includes(player)&& - event.targets.every(current=>player.inRange(current)&¤t.isIn())&&player.hasCard(card=>card.hasGaintag('dcaishou_tag'),'h'); }, - direct:true, - content:function(){ - 'step 0' + }, + dcsaowei: { + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + event.player != player && + event.card.name == "sha" && + event.targets.length && + !event.targets.includes(player) && + event.targets.every((current) => player.inRange(current) && current.isIn()) && + player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h") + ); + }, + direct: true, + content: function () { + "step 0"; player.chooseCardTarget({ - position:'hs', - prompt:get.prompt('dcsaowei'), - prompt2:'将一张“隘”当做【杀】对'+get.translation(trigger.targets)+'使用', - targets:trigger.targets, - filterCard:function(card,player){ - if(get.itemtype(card)=='card'&&!card.hasGaintag('dcaishou_tag')) return false; - return _status.event.targets.every(current=>player.canUse(get.autoViewAs({name:'sha'},[card]),current,false)); + position: "hs", + prompt: get.prompt("dcsaowei"), + prompt2: "将一张“隘”当做【杀】对" + get.translation(trigger.targets) + "使用", + targets: trigger.targets, + filterCard: function (card, player) { + if (get.itemtype(card) == "card" && !card.hasGaintag("dcaishou_tag")) + return false; + return _status.event.targets.every((current) => + player.canUse(get.autoViewAs({ name: "sha" }, [card]), current, false) + ); }, - filterTarget:function(card,player,target){ - if(!_status.event.targets.includes(target)) return false; - card=get.autoViewAs({name:'sha'},[card]); - return lib.filter.filterTarget.apply(this,arguments); + filterTarget: function (card, player, target) { + if (!_status.event.targets.includes(target)) return false; + card = get.autoViewAs({ name: "sha" }, [card]); + return lib.filter.filterTarget.apply(this, arguments); }, - selectTarget:-1, - ai1:function(card){ - var player=_status.event.player; - if(player.isHealthy()&&player.hasSkill('dcaishou')&&player.countCards('h',card=>card.hasGaintag('dcaishou_tag')==1)) return 0; - var eff=0; - for(var target of _status.event.targets){ - eff+=get.effect(target,get.autoViewAs({name:'sha'},[card]),player,player); + selectTarget: -1, + ai1: function (card) { + var player = _status.event.player; + if ( + player.isHealthy() && + player.hasSkill("dcaishou") && + player.countCards("h", (card) => card.hasGaintag("dcaishou_tag") == 1) + ) + return 0; + var eff = 0; + for (var target of _status.event.targets) { + eff += get.effect( + target, + get.autoViewAs({ name: "sha" }, [card]), + player, + player + ); } - if(eff>0) return 6.5+eff/10-get.value(card); + if (eff > 0) return 6.5 + eff / 10 - get.value(card); return 0; }, - ai2:()=>1, + ai2: () => 1, }); - 'step 1' - if(result.bool){ - var cards=result.cards,targets=result.targets; - event.cards=cards; - var next=player.useCard({name:'sha'},cards,targets,false,'dcsaowei'); - player.when('useCardAfter') - .filter(event=>event==next) - .then(()=>{ - if(player.hasHistory('sourceDamage',evt=>evt.card==trigger.card)){ - var cards=trigger.cards.filterInD(); - if(cards.length>0) player.gain(cards,'gain2'); + ("step 1"); + if (result.bool) { + var cards = result.cards, + targets = result.targets; + event.cards = cards; + var next = player.useCard({ name: "sha" }, cards, targets, false, "dcsaowei"); + player + .when("useCardAfter") + .filter((event) => event == next) + .then(() => { + if (player.hasHistory("sourceDamage", (evt) => evt.card == trigger.card)) { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) player.gain(cards, "gain2"); } }); } }, }, //向朗 - dckanji:{ - audio:2, - enable:'phaseUse', - usable:2, - filter:function(event,player){ - return player.countCards('h'); + dckanji: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return player.countCards("h"); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - 'step 1' - var suits=[]; - player.getCards('h',card=>suits.add(get.suit(card))); - if(suits.length==player.countCards('h')){ + ("step 1"); + var suits = []; + player.getCards("h", (card) => suits.add(get.suit(card))); + if (suits.length == player.countCards("h")) { player.draw(2); - event.suitsLength=suits.length; - player.addTempSkill('dckanji_check'); + event.suitsLength = suits.length; + player.addTempSkill("dckanji_check"); } }, - subSkill:{ - check:{ - trigger:{player:'gainAfter'}, - filter:function(event,player){ - if(event.getParent(2).name!='dckanji') return false; - var len=event.getParent(2).suitsLength; - var suits=[]; - player.getCards('h',card=>suits.add(get.suit(card))); - return suits.length>=4&&len<4; + subSkill: { + check: { + trigger: { player: "gainAfter" }, + filter: function (event, player) { + if (event.getParent(2).name != "dckanji") return false; + var len = event.getParent(2).suitsLength; + var suits = []; + player.getCards("h", (card) => suits.add(get.suit(card))); + return suits.length >= 4 && len < 4; }, - charlotte:true, - forced:true, - popup:false, - content:function(){ - player.skip('phaseDiscard'); - game.log(player,'跳过了','#y弃牌阶段'); + charlotte: true, + forced: true, + popup: false, + content: function () { + player.skip("phaseDiscard"); + game.log(player, "跳过了", "#y弃牌阶段"); }, - } + }, + }, + ai: { + order: 9, + result: { + player: function (player, target) { + var count = player.countCards("h"); + if (count > 4) return false; + var suits = []; + player.getCards("h", (card) => suits.add(get.suit(card))); + return suits.length == count ? 1 : 0; + }, + }, }, - ai:{ - order:9, - result:{ - player:function(player,target){ - var count=player.countCards('h'); - if(count>4) return false; - var suits=[]; - player.getCards('h',card=>suits.add(get.suit(card))); - return suits.length==count?1:0; - } - } - } }, - dcqianzheng:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - usable:2, - filter:function(event,player){ - return event.player!=player&&(get.type(event.card)=='trick'||event.card.name=='sha')&&player.countCards('he')>1; + dcqianzheng: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + usable: 2, + filter: function (event, player) { + return ( + event.player != player && + (get.type(event.card) == "trick" || event.card.name == "sha") && + player.countCards("he") > 1 + ); }, async cost(event, trigger, player) { - const str = ',若重铸的牌中没有' + get.translation(get.type2(trigger.card)) + '牌,你于' + get.translation(trigger.cards) + '进入弃牌堆后获得之'; - event.result = await player.chooseCard(get.prompt('dcqianzheng'), '重铸两张牌' + (trigger.cards.length ? str : '') + '。', 2, 'he', lib.filter.cardRecastable).set('ai', card => { - var val = get.value(card); - if (get.type2(card) == _status.event.type) val += 0.5; - return 6 - val; - }).set('type', get.type2(trigger.card)).forResult(); + const str = + ",若重铸的牌中没有" + + get.translation(get.type2(trigger.card)) + + "牌,你于" + + get.translation(trigger.cards) + + "进入弃牌堆后获得之"; + event.result = await player + .chooseCard( + get.prompt("dcqianzheng"), + "重铸两张牌" + (trigger.cards.length ? str : "") + "。", + 2, + "he", + lib.filter.cardRecastable + ) + .set("ai", (card) => { + var val = get.value(card); + if (get.type2(card) == _status.event.type) val += 0.5; + return 6 - val; + }) + .set("type", get.type2(trigger.card)) + .forResult(); }, async content(event, trigger, player) { - if (event.cards.every(card => get.type2(card) != get.type2(trigger.card))) { + if (event.cards.every((card) => get.type2(card) != get.type2(trigger.card))) { trigger.getParent().dcqianzheng = true; - player.addTempSkill('dcqianzheng_gain'); + player.addTempSkill("dcqianzheng_gain"); } await player.recast(event.cards); }, - subSkill:{ - gain:{ - trigger:{global:'cardsDiscardAfter'}, - filter:function(event,player){ - var evt=event.getParent(); - if(evt.name!='orderingDiscard') return false; - return evt.relatedEvent.dcqianzheng&&event.cards.filterInD('d').length; + subSkill: { + gain: { + trigger: { global: "cardsDiscardAfter" }, + filter: function (event, player) { + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + return evt.relatedEvent.dcqianzheng && event.cards.filterInD("d").length; }, - charlotte:true, - forced:true, - popup:false, - content:function(){ - player.gain(trigger.cards.filterInD('d'),'gain2'); + charlotte: true, + forced: true, + popup: false, + content: function () { + player.gain(trigger.cards.filterInD("d"), "gain2"); }, - } + }, }, }, //秦朗 - dchaochong:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return player.getHandcardLimit()!=player.countCards('h'); + dchaochong: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return player.getHandcardLimit() != player.countCards("h"); }, - direct:true, - locked:false, - content:function(){ - 'step 0' - var del=player.getHandcardLimit()-player.countCards('h'); - event.delta=del; - if(del>0){ - player.chooseBool(get.prompt('dchaochong'),'摸'+get.cnNumber(Math.min(5,del))+'张牌,然后令你的手牌上限-1').set('ai',()=>{ - var player=_status.event.player; - if(player.isPhaseUsing()&&player.hasCard(cardx=>player.hasUseTarget(cardx)&&player.hasValueTarget(cardx),'hs')) return false; - return true; - }); + direct: true, + locked: false, + content: function () { + "step 0"; + var del = player.getHandcardLimit() - player.countCards("h"); + event.delta = del; + if (del > 0) { + player + .chooseBool( + get.prompt("dchaochong"), + "摸" + get.cnNumber(Math.min(5, del)) + "张牌,然后令你的手牌上限-1" + ) + .set("ai", () => { + var player = _status.event.player; + if ( + player.isPhaseUsing() && + player.hasCard( + (cardx) => player.hasUseTarget(cardx) && player.hasValueTarget(cardx), + "hs" + ) + ) + return false; + return true; + }); + } else if (del < 0) { + player + .chooseToDiscard( + get.prompt("dchaochong"), + "弃置" + get.cnNumber(-del) + "张手牌,然后令你的手牌上限+1", + -del + ) + .set("ai", (card) => { + var player = _status.event.player; + if ( + player.isPhaseUsing() && + player.hasCard((cardx) => player.hasValueTarget(cardx), "hs") + ) + return 6 - player.getUseValue(card); + return 5 - get.value(card); + }) + .set("logSkill", "dchaochong"); } - else if(del<0){ - player.chooseToDiscard(get.prompt('dchaochong'),'弃置'+get.cnNumber(-del)+'张手牌,然后令你的手牌上限+1',-del).set('ai',card=>{ - var player=_status.event.player; - if(player.isPhaseUsing()&&player.hasCard(cardx=>player.hasValueTarget(cardx),'hs')) return 6-player.getUseValue(card); - return 5-get.value(card); - }).set('logSkill','dchaochong'); - } - 'step 1' - if(result.bool){ - if(event.delta>0){ - player.logSkill('dchaochong'); - player.draw(Math.min(5,event.delta)); - lib.skill.dchaochong.change(player,-1); - } - else if(event.delta<0){ - lib.skill.dchaochong.change(player,1); + ("step 1"); + if (result.bool) { + if (event.delta > 0) { + player.logSkill("dchaochong"); + player.draw(Math.min(5, event.delta)); + lib.skill.dchaochong.change(player, -1); + } else if (event.delta < 0) { + lib.skill.dchaochong.change(player, 1); } } }, - change:function(player,num){ - if(typeof player.storage.dchaochong!=='number') player.storage.dchaochong=0; - if(!num) return; - player.storage.dchaochong+=num; - player.markSkill('dchaochong'); - game.log(player,'的手牌上限','#g'+(num>0?'+':'')+num); + change: function (player, num) { + if (typeof player.storage.dchaochong !== "number") player.storage.dchaochong = 0; + if (!num) return; + player.storage.dchaochong += num; + player.markSkill("dchaochong"); + game.log(player, "的手牌上限", "#g" + (num > 0 ? "+" : "") + num); }, - markimage:'image/card/handcard.png', - intro:{ - content:function(storage,player){ - var num=player.storage.dchaochong; - return '手牌上限'+(num>=0?'+':'')+num; - } + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + var num = player.storage.dchaochong; + return "手牌上限" + (num >= 0 ? "+" : "") + num; + }, }, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('dchaochong'); - } + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dchaochong"); + }, }, - ai:{threaten:2.2} + ai: { threaten: 2.2 }, }, - dcjinjin:{ - audio:2, - trigger:{ - source:'damageSource', - player:'damageEnd', + dcjinjin: { + audio: 2, + trigger: { + source: "damageSource", + player: "damageEnd", }, - usable:2, - logTarget:'source', - check:function(event,player){ - if(typeof player.storage.dchaochong!='number'||player.storage.dchaochong==0) return true; - var evt=event.getParent('useCard'); - if(evt&&evt.player==player&&event.source==player) return false; - if(player.isPhaseUsing()&&player.storage.dchaochong==-1) return true; - return Math.abs(player.storage.dchaochong)>=2; + usable: 2, + logTarget: "source", + check: function (event, player) { + if (typeof player.storage.dchaochong != "number" || player.storage.dchaochong == 0) + return true; + var evt = event.getParent("useCard"); + if (evt && evt.player == player && event.source == player) return false; + if (player.isPhaseUsing() && player.storage.dchaochong == -1) return true; + return Math.abs(player.storage.dchaochong) >= 2; }, - prompt2:function(event,player){ - var str=''; - if(typeof player.storage.dchaochong=='number'&&player.storage.dchaochong!=0){ - str +='重置因〖佞宠〗增加或减少的手牌上限,'; + prompt2: function (event, player) { + var str = ""; + if (typeof player.storage.dchaochong == "number" && player.storage.dchaochong != 0) { + str += "重置因〖佞宠〗增加或减少的手牌上限,"; } - var num=Math.abs(player.countMark('dchaochong'))||1; - if(event.source&&event.source.isIn()){ - str+='令伤害来源弃置至多'+get.cnNumber(num)+'张牌,然后你摸'+num+'-X张牌(X为其弃置的牌数)'; - } - else str+='你摸'+get.cnNumber(num)+'张牌'; + var num = Math.abs(player.countMark("dchaochong")) || 1; + if (event.source && event.source.isIn()) { + str += + "令伤害来源弃置至多" + + get.cnNumber(num) + + "张牌,然后你摸" + + num + + "-X张牌(X为其弃置的牌数)"; + } else str += "你摸" + get.cnNumber(num) + "张牌"; return str; }, - content:function(){ - 'step 0' - var del=Math.abs(player.countMark('dchaochong'))||1; - event.delta=del; - player.storage.dchaochong=0; - if(player.hasSkill('dchaochong',null,false,false)) player.markSkill('dchaochong'); - game.log(player,'重置了手牌上限'); - if(trigger.source&&trigger.source.isIn()){ - trigger.source.chooseToDiscard(get.translation(player)+'对你发动了【矜谨】','弃置至多'+get.cnNumber(del)+'张牌,然后'+get.translation(player)+'摸'+del+'-X张牌(X为你弃置的牌数)。',[1,del],'he').set('ai',card=>{ - if(_status.event.goon) return 5.5-get.value(card); - return 0; - }).set('goon',get.attitude(trigger.source,player)<0); + content: function () { + "step 0"; + var del = Math.abs(player.countMark("dchaochong")) || 1; + event.delta = del; + player.storage.dchaochong = 0; + if (player.hasSkill("dchaochong", null, false, false)) player.markSkill("dchaochong"); + game.log(player, "重置了手牌上限"); + if (trigger.source && trigger.source.isIn()) { + trigger.source + .chooseToDiscard( + get.translation(player) + "对你发动了【矜谨】", + "弃置至多" + + get.cnNumber(del) + + "张牌,然后" + + get.translation(player) + + "摸" + + del + + "-X张牌(X为你弃置的牌数)。", + [1, del], + "he" + ) + .set("ai", (card) => { + if (_status.event.goon) return 5.5 - get.value(card); + return 0; + }) + .set("goon", get.attitude(trigger.source, player) < 0); } - 'step 1' - var num=event.delta; - if(result.bool) num-=result.cards.length; - if(num>0) player.draw(num); + ("step 1"); + var num = event.delta; + if (result.bool) num -= result.cards.length; + if (num > 0) player.draw(num); }, - ai:{ - combo:'dchaochong', - maixie:true, - maixie_hp:true, - threaten:0.85, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var num=0; - if(typeof target.storage.dcninchong=='number') num=Math.abs(target.storage.dcninchong); - if(num<=0) return; - return [1,Math.min(1,num/3)]; + ai: { + combo: "dchaochong", + maixie: true, + maixie_hp: true, + threaten: 0.85, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 0; + if (typeof target.storage.dcninchong == "number") + num = Math.abs(target.storage.dcninchong); + if (num <= 0) return; + return [1, Math.min(1, num / 3)]; } }, }, }, }, //二傅 - dcxuewei:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('dcxuewei'),(card,player,target)=>{ - return target.hp<=player.hp; - }).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,{name:'tao'},player,player)+0.1; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcxuewei',target); - player.addTempSkill('dcxuewei_shelter',{player:'phaseBegin'}); - player.markAuto('dcxuewei_shelter',[target]); + dcxuewei: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dcxuewei"), (card, player, target) => { + return target.hp <= player.hp; + }) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, { name: "tao" }, player, player) + 0.1; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcxuewei", target); + player.addTempSkill("dcxuewei_shelter", { player: "phaseBegin" }); + player.markAuto("dcxuewei_shelter", [target]); } }, - ai:{threaten:1.1}, - subSkill:{ - shelter:{ - audio:'dcxuewei', - trigger:{global:'damageBegin4'}, - filter:function(event,player){ - return player.getStorage('dcxuewei_shelter').includes(event.player); + ai: { threaten: 1.1 }, + subSkill: { + shelter: { + audio: "dcxuewei", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + return player.getStorage("dcxuewei_shelter").includes(event.player); }, - charlotte:true, - forced:true, - onremove:true, - logTarget:'player', - marktext:'卫', - intro:{content:'保护对象:$'}, - content:function(){ - 'step 0' + charlotte: true, + forced: true, + onremove: true, + logTarget: "player", + marktext: "卫", + intro: { content: "保护对象:$" }, + content: function () { + "step 0"; trigger.cancel(); - 'step 1' + ("step 1"); player.loseHp(); - if(trigger.player!=player) game.asyncDraw([player,trigger.player]); - else player.draw('nodelay'); - 'step 2' + if (trigger.player != player) game.asyncDraw([player, trigger.player]); + else player.draw("nodelay"); + ("step 2"); game.delayx(); }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.player&&arg.player.hasSkillTag('jueqing',false,player)) return false; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player && arg.player.hasSkillTag("jueqing", false, player)) + return false; return true; - } + }, }, - } + }, }, }, - dcyuguan:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - var num=player.getDamagedHp(); - if(num==0) return false; - return !game.hasPlayer(current=>{ - return current.getDamagedHp()>num; + dcyuguan: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var num = player.getDamagedHp(); + if (num == 0) return false; + return !game.hasPlayer((current) => { + return current.getDamagedHp() > num; }); }, - check:function(event,player){ - var num=player.getDamagedHp()-1; - if(num<=0) return false; - return game.hasPlayer(target=>{ - return get.attitude(player,target)>0&&target.maxHp-target.countCards('h')>1; + check: function (event, player) { + var num = player.getDamagedHp() - 1; + if (num <= 0) return false; + return game.hasPlayer((target) => { + return get.attitude(player, target) > 0 && target.maxHp - target.countCards("h") > 1; }); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseMaxHp(); - 'step 1' - var num=player.getDamagedHp(); - if(!player.isIn()||!num) event.finish(); - else player.chooseTarget('御关:令至多'+get.cnNumber(num)+'名角色将手牌摸至体力上限',Math.min(game.countPlayer(),[1,num]),true).set('ai',target=>{ - return get.attitude(_status.event.player,target)*Math.max(0.1,target.maxHp-target.countCards('h')); - }); - 'step 2' - if(result.bool){ - var targets=result.targets.sortBySeat(_status.currentPhase); + ("step 1"); + var num = player.getDamagedHp(); + if (!player.isIn() || !num) event.finish(); + else + player + .chooseTarget( + "御关:令至多" + get.cnNumber(num) + "名角色将手牌摸至体力上限", + Math.min(game.countPlayer(), [1, num]), + true + ) + .set("ai", (target) => { + return ( + get.attitude(_status.event.player, target) * + Math.max(0.1, target.maxHp - target.countCards("h")) + ); + }); + ("step 2"); + if (result.bool) { + var targets = result.targets.sortBySeat(_status.currentPhase); player.line(targets); - for(var target of targets){ + for (var target of targets) { target.drawTo(target.maxHp); } } - } + }, }, //郑浑 - dcqiangzhi:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - if(target==player) return false; - return target.countDiscardableCards(player,'he')+player.countDiscardableCards(player,'he')>=3; + dcqiangzhi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + if (target == player) return false; + return ( + target.countDiscardableCards(player, "he") + + player.countDiscardableCards(player, "he") >= + 3 + ); }, - content:function(){ - 'step 0' - var dialog=[]; - dialog.push('强峙:弃置你与'+get.translation(target)+'的共计三张牌'); - if(player.countCards('h')) dialog.addArray(['
    你的手牌
    ',player.getCards('h')]); - if(player.countCards('e')) dialog.addArray(['
    你的装备
    ',player.getCards('e')]); - if(target.countCards('h')){ - dialog.add('
    '+get.translation(target)+'的手牌
    '); - if(player.hasSkillTag('viewHandcard',null,target,true)) dialog.push(target.getCards('h')); - else dialog.push([target.getCards('h'),'blank']); + content: function () { + "step 0"; + var dialog = []; + dialog.push("强峙:弃置你与" + get.translation(target) + "的共计三张牌"); + if (player.countCards("h")) + dialog.addArray(['
    你的手牌
    ', player.getCards("h")]); + if (player.countCards("e")) + dialog.addArray(['
    你的装备
    ', player.getCards("e")]); + if (target.countCards("h")) { + dialog.add('
    ' + get.translation(target) + "的手牌
    "); + if (player.hasSkillTag("viewHandcard", null, target, true)) + dialog.push(target.getCards("h")); + else dialog.push([target.getCards("h"), "blank"]); } - if(target.countCards('e')) dialog.addArray(['
    '+get.translation(target)+'的装备
    ',target.getCards('e')]); - player.chooseButton(3,true).set('createDialog',dialog).set('filterButton',button=>{ - if(!lib.filter.canBeDiscarded(button.link,_status.event.player,get.owner(button.link))) return false; - return true; - }).set('filterOk',()=>{ - return ui.selected.buttons.length==3; - }).set('ai',button=>{ - var player=_status.event.player; - var target=_status.event.getParent().target; - var card=button.link; - if(get.owner(card)==player){ - if(_status.event.damage) return 15-get.value(card); - if(player.hp>=3||get.damageEffect(player,target,player)>=0||player.hasSkill('dcpitian')&&player.getHandcardLimit()-player.countCards('h')>=1&&player.hp>1) return 0; - if(ui.selected.buttons.length==0) return 10-get.value(card); - return 0; - } - else{ - if(_status.event.damage) return 0; - return -(get.sgnAttitude(player,target)||1)*get.value(card); - } - }).set('damage',get.damageEffect(target,player,player)>10&&player.countCards('he',card=>{ - return lib.filter.canBeDiscarded(card,player,player)&&get.value(card)<5; - })>=3); - 'step 1' - if(result.bool){ - var links=result.links; - var list1=[],list2=[]; - event.players=[player,target]; - for(var card of links){ - if(get.owner(card)==player) list1.push(card); + if (target.countCards("e")) + dialog.addArray([ + '
    ' + get.translation(target) + "的装备
    ", + target.getCards("e"), + ]); + player + .chooseButton(3, true) + .set("createDialog", dialog) + .set("filterButton", (button) => { + if ( + !lib.filter.canBeDiscarded( + button.link, + _status.event.player, + get.owner(button.link) + ) + ) + return false; + return true; + }) + .set("filterOk", () => { + return ui.selected.buttons.length == 3; + }) + .set("ai", (button) => { + var player = _status.event.player; + var target = _status.event.getParent().target; + var card = button.link; + if (get.owner(card) == player) { + if (_status.event.damage) return 15 - get.value(card); + if ( + player.hp >= 3 || + get.damageEffect(player, target, player) >= 0 || + (player.hasSkill("dcpitian") && + player.getHandcardLimit() - player.countCards("h") >= 1 && + player.hp > 1) + ) + return 0; + if (ui.selected.buttons.length == 0) return 10 - get.value(card); + return 0; + } else { + if (_status.event.damage) return 0; + return -(get.sgnAttitude(player, target) || 1) * get.value(card); + } + }) + .set( + "damage", + get.damageEffect(target, player, player) > 10 && + player.countCards("he", (card) => { + return ( + lib.filter.canBeDiscarded(card, player, player) && get.value(card) < 5 + ); + }) >= 3 + ); + ("step 1"); + if (result.bool) { + var links = result.links; + var list1 = [], + list2 = []; + event.players = [player, target]; + for (var card of links) { + if (get.owner(card) == player) list1.push(card); else list2.push(card); } - if(list1.length&&list2.length){ + if (list1.length && list2.length) { game.loseAsync({ - lose_list:[ - [player,list1], - [target,list2] + lose_list: [ + [player, list1], + [target, list2], ], - discarder:player, - }).setContent('discardMultiple'); + discarder: player, + }).setContent("discardMultiple"); event.finish(); - } - else if(list2.length) target.discard(list2); + } else if (list2.length) target.discard(list2); else player.discard(list1); - if(list2.length>=3) event.players.reverse(); - } - else event.finish(); - 'step 2' + if (list2.length >= 3) event.players.reverse(); + } else event.finish(); + ("step 2"); event.players[0].line(event.players[1]); event.players[1].damage(event.players[0]); }, - ai:{ - expose:0.2, - order:4, - result:{ - target:function(player,target){ - return get.effect(target,{name:'guohe_copy2'},player,target)/2*(target.countDiscardableCards(player,'he')>=2?1.25:1)+get.damageEffect(target,player,target)/3; - } - } - } - }, - dcpitian:{ - audio:2, - trigger:{ - player:['loseAfter','damageEnd'], - global:'loseAsyncAfter', - }, - forced:true, - locked:false, - group:'dcpitian_draw', - filter:function(event,player){ - if(event.name=='damage') return true; - return event.type=='discard'&&event.getl(player).cards2.length>0; - }, - content:function(){ - player.addMark('dcpitian_handcard',1,false); - player.addSkill('dcpitian_handcard'); - game.log(player,'的手牌上限','#y+1'); - }, - subSkill:{ - draw:{ - audio:'dcpitian', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('h')= 2 ? 1.25 : 1) + + get.damageEffect(target, player, target) / 3 + ); }, - prompt2:function(event,player){ - return '摸'+get.cnNumber(Math.min(5,player.getHandcardLimit()-player.countCards('h')))+'张牌,重置因〖辟田〗增加的手牌上限'; - }, - check:function(event,player){ - return player.getHandcardLimit()-player.countCards('h')>Math.min(2,player.hp-1); - }, - content:function(){ - 'step 0' - var num=Math.min(5,player.getHandcardLimit()-player.countCards('h')); - if(num>0) player.draw(num); - 'step 1' - player.removeMark('dcpitian_handcard',player.countMark('dcpitian_handcard'),false); - game.log(player,'重置了','#g【辟田】','增加的手牌上限'); - } }, - handcard:{ - markimage:'image/card/handcard.png', - intro:{ - content:function(storage,player){ - return '手牌上限+'+storage; - } - }, - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('dcpitian_handcard'); - } - }, - } }, - ai:{ - effect:{ - target:function (card,player,target){ - if(get.tag(card,'discard')) return 0.9; - if(get.tag(card,'damage')) return 0.95; + }, + dcpitian: { + audio: 2, + trigger: { + player: ["loseAfter", "damageEnd"], + global: "loseAsyncAfter", + }, + forced: true, + locked: false, + group: "dcpitian_draw", + filter: function (event, player) { + if (event.name == "damage") return true; + return event.type == "discard" && event.getl(player).cards2.length > 0; + }, + content: function () { + player.addMark("dcpitian_handcard", 1, false); + player.addSkill("dcpitian_handcard"); + game.log(player, "的手牌上限", "#y+1"); + }, + subSkill: { + draw: { + audio: "dcpitian", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") < player.getHandcardLimit(); + }, + prompt2: function (event, player) { + return ( + "摸" + + get.cnNumber( + Math.min(5, player.getHandcardLimit() - player.countCards("h")) + ) + + "张牌,重置因〖辟田〗增加的手牌上限" + ); + }, + check: function (event, player) { + return ( + player.getHandcardLimit() - player.countCards("h") > + Math.min(2, player.hp - 1) + ); + }, + content: function () { + "step 0"; + var num = Math.min(5, player.getHandcardLimit() - player.countCards("h")); + if (num > 0) player.draw(num); + ("step 1"); + player.removeMark( + "dcpitian_handcard", + player.countMark("dcpitian_handcard"), + false + ); + game.log(player, "重置了", "#g【辟田】", "增加的手牌上限"); + }, + }, + handcard: { + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + return "手牌上限+" + storage; + }, + }, + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dcpitian_handcard"); + }, + }, + }, + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "discard")) return 0.9; + if (get.tag(card, "damage")) return 0.95; }, }, }, }, //新服二赵 - dcqingren:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - filter:function(event,player){ - return player.hasHistory('useSkill',evt=>['yizan_use','yizan_use_backup'].includes(evt.sourceSkill||evt.skill)); + dcqingren: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.hasHistory("useSkill", (evt) => + ["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill) + ); }, - content:function(){ - player.draw(player.getHistory('useSkill',evt=>['yizan_use','yizan_use_backup'].includes(evt.sourceSkill||evt.skill)).length) + content: function () { + player.draw( + player.getHistory("useSkill", (evt) => + ["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill) + ).length + ); + }, + ai: { + combo: "yizan_use", }, - ai:{ - combo:'yizan_use' - } }, - dclongyuan:{ - audio:'xinfu_longyuan', - forced:true, - unique:true, - juexingji:true, - trigger:{ - global:'phaseEnd', + dclongyuan: { + audio: "xinfu_longyuan", + forced: true, + unique: true, + juexingji: true, + trigger: { + global: "phaseEnd", }, - skillAnimation:true, - animationColor:'orange', - filter:function(event,player){ - return player.countMark('yizan_use')>=3; + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.countMark("yizan_use") >= 3; }, - content:function(){ - player.awakenSkill('dclongyuan'); + content: function () { + player.awakenSkill("dclongyuan"); player.draw(2); player.recover(); - player.storage.yizan=true; + player.storage.yizan = true; + }, + derivation: "yizan_rewrite", + ai: { + combo: "yizan_use", }, - derivation:'yizan_rewrite', - ai:{ - combo:'yizan_use' - } }, //黄皓 - dcqinqing:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - var zhu=game.filterPlayer(current=>current.getSeatNum()==1)[0]; - if(!zhu||!zhu.isIn()) return false; - return game.hasPlayer(current=>{ - return current!=player&¤t.inRange(zhu); + dcqinqing: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; + if (!zhu || !zhu.isIn()) return false; + return game.hasPlayer((current) => { + return current != player && current.inRange(zhu); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('dcqinqing'),function(card,player,target){ - var zhu=game.filterPlayer(current=>current.getSeatNum()==1)[0]; - return target!=player&&target.inRange(zhu)&&target.countDiscardableCards(player,'he')>0; - }).set('ai',function(target){ - var zhu=game.filterPlayer(current=>current.getSeatNum()==1)[0]; - var he=target.countCards('he'); - if(get.attitude(_status.event.player,target)>0){ - if(target.countCards('h')>zhu.countCards('h')+1) return 0.1; - } - else{ - if(he>zhu.countCards('h')+1) return 2; - if(he>0) return 1; - } - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('dcqinqing',target); - if(target.countCards('he')) player.discardPlayerCard(target,'he',true); - } - else{ + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dcqinqing"), function (card, player, target) { + var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; + return ( + target != player && + target.inRange(zhu) && + target.countDiscardableCards(player, "he") > 0 + ); + }) + .set("ai", function (target) { + var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; + var he = target.countCards("he"); + if (get.attitude(_status.event.player, target) > 0) { + if (target.countCards("h") > zhu.countCards("h") + 1) return 0.1; + } else { + if (he > zhu.countCards("h") + 1) return 2; + if (he > 0) return 1; + } + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcqinqing", target); + if (target.countCards("he")) player.discardPlayerCard(target, "he", true); + } else { event.finish(); } - 'step 2' - var zhu=game.filterPlayer(current=>current.getSeatNum()==1)[0]; - if(zhu&&zhu.isIn()){ - if(target.countCards('h')>zhu.countCards('h')) player.draw(); + ("step 2"); + var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0]; + if (zhu && zhu.isIn()) { + if (target.countCards("h") > zhu.countCards("h")) player.draw(); } - } - }, - dccunwei:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - return player!=event.player&&get.type2(event.card)=='trick'&&(event.targets.length==1||player.countCards('he')>0); }, - content:function(){ - if(trigger.targets.length==1) player.draw(); - else if(player.countCards('he')>0) player.chooseToDiscard('he',true,'存畏:请弃置一张牌'); - } + }, + dccunwei: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return ( + player != event.player && + get.type2(event.card) == "trick" && + (event.targets.length == 1 || player.countCards("he") > 0) + ); + }, + content: function () { + if (trigger.targets.length == 1) player.draw(); + else if (player.countCards("he") > 0) + player.chooseToDiscard("he", true, "存畏:请弃置一张牌"); + }, }, //刘辟 - dcjuying:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.getCardUsable('sha',true)>player.getHistory('useCard',evt=>{ - return evt.getParent('phaseUse')==event&&evt.card.name=='sha'&&evt.addCount!==false; - }).length; + dcjuying: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.getCardUsable("sha", true) > + player.getHistory("useCard", (evt) => { + return ( + evt.getParent("phaseUse") == event && + evt.card.name == "sha" && + evt.addCount !== false + ); + }).length + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseButton([ - get.prompt('dcjuying'), - [[ - ['sha','你于下回合使用【杀】的次数上限+1'], - ['hand','本回合手牌上限+2'], - ['draw','摸三张牌'], - ],'textbutton'] - ]).set('ai',function(button){ - var player=_status.event.player,choice=button.link; - if(choice=='draw') return 10; - if(choice=='sha') return 9; - var del=3-player.hp; - if(choice=='hand'&&player.needsToDiscard()>0&&del<=0) return 8; - return 0; - }).set('selectButton',[1,3]); - 'step 1' - if(result.bool){ - player.logSkill('dcjuying'); - var choices=result.links; - event.choices=choices; - if(choices.includes('sha')){ - player.addMark('dcjuying_sha',1,false); - player.addSkill('dcjuying_sha'); + direct: true, + content: function () { + "step 0"; + player + .chooseButton([ + get.prompt("dcjuying"), + [ + [ + ["sha", "你于下回合使用【杀】的次数上限+1"], + ["hand", "本回合手牌上限+2"], + ["draw", "摸三张牌"], + ], + "textbutton", + ], + ]) + .set("ai", function (button) { + var player = _status.event.player, + choice = button.link; + if (choice == "draw") return 10; + if (choice == "sha") return 9; + var del = 3 - player.hp; + if (choice == "hand" && player.needsToDiscard() > 0 && del <= 0) return 8; + return 0; + }) + .set("selectButton", [1, 3]); + ("step 1"); + if (result.bool) { + player.logSkill("dcjuying"); + var choices = result.links; + event.choices = choices; + if (choices.includes("sha")) { + player.addMark("dcjuying_sha", 1, false); + player.addSkill("dcjuying_sha"); } - if(choices.includes('hand')){ - player.addMark('dcjuying_hand',1,false); - player.addTempSkill('dcjuying_hand'); + if (choices.includes("hand")) { + player.addMark("dcjuying_hand", 1, false); + player.addTempSkill("dcjuying_hand"); } - if(choices.includes('draw')){ + if (choices.includes("draw")) { player.draw(3); } - } - else event.finish(); - 'step 2' - var num=event.choices.length-Math.max(0,player.hp); - if(num>0){ - player.chooseToDiscard(true,'he'); + } else event.finish(); + ("step 2"); + var num = event.choices.length - Math.max(0, player.hp); + if (num > 0) { + player.chooseToDiscard(true, "he"); } }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(typeof card=='object'&&player.isPhaseUsing()&&card.name=='sha'&&player.getCardUsable('sha')==1) return 'zeroplayertarget'; + ai: { + effect: { + player_use: function (card, player, target) { + if ( + typeof card == "object" && + player.isPhaseUsing() && + card.name == "sha" && + player.getCardUsable("sha") == 1 + ) + return "zeroplayertarget"; + }, + target_use: function (card, player, target) { + if (card.name == "jiu" && player.getCardUsable("sha") == 2) return [1, 1]; }, - target_use:function(card,player,target){ - if(card.name=='jiu'&&player.getCardUsable('sha')==2) return [1,1]; - } }, }, - subSkill:{ - sha:{ - trigger:{player:'phaseBegin'}, - filter:function(event,player){ - return player.countMark('dcjuying_sha')>0; + subSkill: { + sha: { + trigger: { player: "phaseBegin" }, + filter: function (event, player) { + return player.countMark("dcjuying_sha") > 0; }, - silent:true, - firstDo:true, - charlotte:true, - onremove:true, - content:function(){ - player.addMark('dcjuying_effect',player.countMark('dcjuying_sha'),false); - player.addTempSkill('dcjuying_effect'); - player.removeSkill('dcjuying_sha'); + silent: true, + firstDo: true, + charlotte: true, + onremove: true, + content: function () { + player.addMark("dcjuying_effect", player.countMark("dcjuying_sha"), false); + player.addTempSkill("dcjuying_effect"); + player.removeSkill("dcjuying_sha"); }, - intro:{content:'下回合使用【杀】的次数上限+#'} + intro: { content: "下回合使用【杀】的次数上限+#" }, }, - effect:{ - onremove:true, - charlotte:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('dcjuying_effect'); + effect: { + onremove: true, + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dcjuying_effect"); + }, + }, + intro: { content: "本回合使用【杀】的次数上限+#" }, + }, + hand: { + onremove: true, + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + 2 * player.countMark("dcjuying_hand"); }, }, - intro:{content:'本回合使用【杀】的次数上限+#'} }, - hand:{ - onremove:true, - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num+2*player.countMark('dcjuying_hand'); - } - } - } }, }, //新服加强魏贾诩 - dcjianshu:{ - audio:'jianshu', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h',{color:'black'})>0; + dcjianshu: { + audio: "jianshu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", { color: "black" }) > 0; }, - filterTarget:function(card,player,target){ - if(target==player) return false; - if(ui.selected.targets.length){ - return ui.selected.targets[0]!=target&&!ui.selected.targets[0].hasSkillTag('noCompareSource')&&target.countCards('h') - &&!target.hasSkillTag('noCompareTarget'); + filterTarget: function (card, player, target) { + if (target == player) return false; + if (ui.selected.targets.length) { + return ( + ui.selected.targets[0] != target && + !ui.selected.targets[0].hasSkillTag("noCompareSource") && + target.countCards("h") && + !target.hasSkillTag("noCompareTarget") + ); } return true; }, - targetprompt:['发起者','拼点目标'], - filterCard:{color:'black'}, - discard:false, - lose:false, - delay:false, - check:function(card){ - if(_status.event.player.hp==1) return 8-get.value(card); - return 6-get.value(card); + targetprompt: ["发起者", "拼点目标"], + filterCard: { color: "black" }, + discard: false, + lose: false, + delay: false, + check: function (card) { + if (_status.event.player.hp == 1) return 8 - get.value(card); + return 6 - get.value(card); }, - selectTarget:2, - multitarget:true, - content:function(){ - 'step 0' - player.give(cards,targets[0],'give'); - 'step 1' + selectTarget: 2, + multitarget: true, + content: function () { + "step 0"; + player.give(cards, targets[0], "give"); + ("step 1"); targets[0].chooseToCompare(targets[1]); - 'step 2' - player.addTempSkill('dcjianshu_check','phaseUseAfter'); - if(result.bool){ - var cards=targets[0].getCards('he',function(card){ - return lib.filter.cardDiscardable(card,targets[0],'dcjianshu'); + ("step 2"); + player.addTempSkill("dcjianshu_check", "phaseUseAfter"); + if (result.bool) { + var cards = targets[0].getCards("he", function (card) { + return lib.filter.cardDiscardable(card, targets[0], "dcjianshu"); }); - if(cards.length>0) targets[0].discard(cards.randomGet()); + if (cards.length > 0) targets[0].discard(cards.randomGet()); targets[1].loseHp(); - } - else if(result.tie){ + } else if (result.tie) { targets[0].loseHp(); targets[1].loseHp(); - } - else{ - var cards=targets[1].getCards('he',function(card){ - return lib.filter.cardDiscardable(card,targets[1],'dcjianshu'); + } else { + var cards = targets[1].getCards("he", function (card) { + return lib.filter.cardDiscardable(card, targets[1], "dcjianshu"); }); - if(cards.length>0) targets[1].discard(cards.randomGet()); + if (cards.length > 0) targets[1].discard(cards.randomGet()); targets[0].loseHp(); } }, - subSkill:{ - check:{ - trigger:{global:'dieAfter'}, - charlotte:true, - forced:true, - popup:false, - filter:function(event,player){ - return event.getParent(3).name=='dcjianshu'; + subSkill: { + check: { + trigger: { global: "dieAfter" }, + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { + return event.getParent(3).name == "dcjianshu"; }, - content:function(){ - delete player.getStat('skill').dcjianshu; - } - } + content: function () { + delete player.getStat("skill").dcjianshu; + }, + }, }, - ai:{ - expose:0.4, - order:4, - result:{ - target:function(player,target){ - if(ui.selected.targets.length) return -1; + ai: { + expose: 0.4, + order: 4, + result: { + target: function (player, target) { + if (ui.selected.targets.length) return -1; return -0.5; - } - } - } + }, + }, + }, }, - dcyongdi:{ - audio:'yongdi', - audioname:['xinping'], - unique:true, - limited:true, - enable:'phaseUse', - filterTarget:function(card,player,target){ - return target.hasSex('male'); + dcyongdi: { + audio: "yongdi", + audioname: ["xinping"], + unique: true, + limited: true, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return target.hasSex("male"); }, - animationColor:'thunder', - skillAnimation:'legend', - mark:true, - intro:{ - content:'limited' + animationColor: "thunder", + skillAnimation: "legend", + mark: true, + intro: { + content: "limited", }, - content:function(){ - 'step 0' - player.awakenSkill('dcyongdi'); + content: function () { + "step 0"; + player.awakenSkill("dcyongdi"); //player.logSkill('dcyongdi',target); - if(!game.hasPlayer(current=>current.maxHp current.maxHp < target.maxHp)) { target.gainMaxHp(); } - 'step 1' - if(target.isMinHp()){ + ("step 1"); + if (target.isMinHp()) { target.recover(); } - 'step 2' - if(target.isMinHandcard()){ - target.draw(Math.min(5,target.maxHp)); + ("step 2"); + if (target.isMinHandcard()) { + target.draw(Math.min(5, target.maxHp)); } - 'step 3' + ("step 3"); game.delayx(); }, - ai:{ - expose:0.3, - order:1, - result:{ - target:function(player,target){ - var val=0; - var bool1=!game.hasPlayer(current=>current.maxHp current.maxHp < target.maxHp), + bool2 = target.isMinHp(), + bool3 = target.isMinHandcard(); + if (bool1) val += 6.5; + if (bool2) { + if (bool1) target.maxHp++; + val += Math.max(0, get.recoverEffect(target, player, player)); + if (bool1) target.maxHp--; } - if(bool3){ - var num=Math.max(0,Math.min(5,target.maxHp+(bool1?1:0))); - val+=5*num; + if (bool3) { + var num = Math.max(0, Math.min(5, target.maxHp + (bool1 ? 1 : 0))); + val += 5 * num; } return val; - } - } - } + }, + }, + }, }, //雷普 - dcsilve:{ - audio:2, - trigger:{ - player:'enterGame', - global:'phaseBefore', + dcsilve: { + audio: 2, + trigger: { + player: "enterGame", + global: "phaseBefore", }, - forced:true, - locked:false, - direct:true, - onremove:['dcsilve','dcsilve_self'], - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + direct: true, + onremove: ["dcsilve", "dcsilve_self"], + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); }, - content:function(){ - 'step 0' - player.chooseTarget('私掠:请选择一名其他角色','选择一名其他角色(暂时仅你可见),称为“私掠”角色,且你获得后续效果',true,(card,player,target)=>{ - return target!=player&&!player.getStorage('dcsilve').includes(target); - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - if(att>0) return att+1; - if(att==0) return Math.random(); - return att; - }).set('animate',false); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcsilve'); - player.markAuto('dcsilve',[target]); - player.addSkill('dcsilve_rob'); - player.addSkill('dcsilve_revenge'); - target.addSkill('dcsilve_target'); - if(!target.storage.dcsilve_target) target.storage.dcsilve_target=[]; + content: function () { + "step 0"; + player + .chooseTarget( + "私掠:请选择一名其他角色", + "选择一名其他角色(暂时仅你可见),称为“私掠”角色,且你获得后续效果", + true, + (card, player, target) => { + return target != player && !player.getStorage("dcsilve").includes(target); + } + ) + .set("ai", (target) => { + var att = get.attitude(_status.event.player, target); + if (att > 0) return att + 1; + if (att == 0) return Math.random(); + return att; + }) + .set("animate", false); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcsilve"); + player.markAuto("dcsilve", [target]); + player.addSkill("dcsilve_rob"); + player.addSkill("dcsilve_revenge"); + target.addSkill("dcsilve_target"); + if (!target.storage.dcsilve_target) target.storage.dcsilve_target = []; target.storage.dcsilve_target.push(player); } }, - subSkill:{ - rob:{ - audio:'dcsilve', - trigger:{global:'damageSource'}, - filter:function(event,player){ - if(!player.getStorage('dcsilve').includes(event.source)) return false; - if(!event.player.isIn()||event.player==player) return false; - if(player.getStorage('dcsilve_robbed').includes(event.player)) return false; - return event.player.countCards('he')>0; + subSkill: { + rob: { + audio: "dcsilve", + trigger: { global: "damageSource" }, + filter: function (event, player) { + if (!player.getStorage("dcsilve").includes(event.source)) return false; + if (!event.player.isIn() || event.player == player) return false; + if (player.getStorage("dcsilve_robbed").includes(event.player)) return false; + return event.player.countCards("he") > 0; }, - charlotte:true, - prompt2:function(event,player){ - return '获得'+get.translation(event.player)+'一张牌'; + charlotte: true, + prompt2: function (event, player) { + return "获得" + get.translation(event.player) + "一张牌"; }, - logTarget:'player', - content:function(){ - player.addTempSkill('dcsilve_robbed'); - player.markAuto('dcsilve_self',[trigger.player]); - if(trigger.player.countGainableCards(player,'he')>0){ - player.markAuto('dcsilve_robbed',[trigger.player]); - player.gainPlayerCard(trigger.player,'he',true); + logTarget: "player", + content: function () { + player.addTempSkill("dcsilve_robbed"); + player.markAuto("dcsilve_self", [trigger.player]); + if (trigger.player.countGainableCards(player, "he") > 0) { + player.markAuto("dcsilve_robbed", [trigger.player]); + player.gainPlayerCard(trigger.player, "he", true); } - if(trigger.source&&trigger.source!=player) trigger.source.markSkill('dcsilve_target'); - } + if (trigger.source && trigger.source != player) + trigger.source.markSkill("dcsilve_target"); + }, }, - revenge:{ - audio:'dcsilve', - trigger:{global:'damageEnd'}, - filter:function(event,player){ - if(!player.getStorage('dcsilve').includes(event.player)) return false; - if(!event.player.isIn()||!event.source||!event.source.isIn()||event.source==player) return false; + revenge: { + audio: "dcsilve", + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!player.getStorage("dcsilve").includes(event.player)) return false; + if ( + !event.player.isIn() || + !event.source || + !event.source.isIn() || + event.source == player + ) + return false; return true; }, - forced:true, - locked:false, - charlotte:true, - direct:true, - content:function(){ - 'step 0' - if(trigger.player&&trigger.player!=player) trigger.player.markSkill('dcsilve_target'); - player.markAuto('dcsilve_self',[trigger.player]); - player.chooseToUse('私掠:对'+get.translation(trigger.source)+'使用一张【杀】,或弃置一张手牌',function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - }).set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.source&&!ui.selected.targets.includes(_status.event.source)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('source',trigger.source).set('logSkill','dcsilve_revenge'); - 'step 1' - if(!result.bool){ - if(player.countCards('h')>0) player.chooseToDiscard('h',true).set('logSkill','dcsilve_revenge'); - } - } - }, - self:{ - marktext:'私', - intro:{ - name:'私掠', - content:function(storage,player){ - if(!storage||!storage.length) return '没有打劫对象'; - if(storage[0]==player) return '已绑定'+get.translation(player)+'自己'; - return '打劫对象:'+get.translation(storage); + forced: true, + locked: false, + charlotte: true, + direct: true, + content: function () { + "step 0"; + if (trigger.player && trigger.player != player) + trigger.player.markSkill("dcsilve_target"); + player.markAuto("dcsilve_self", [trigger.player]); + player + .chooseToUse( + "私掠:对" + + get.translation(trigger.source) + + "使用一张【杀】,或弃置一张手牌", + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + } + ) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.source && + !ui.selected.targets.includes(_status.event.source) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("source", trigger.source) + .set("logSkill", "dcsilve_revenge"); + ("step 1"); + if (!result.bool) { + if (player.countCards("h") > 0) + player.chooseToDiscard("h", true).set("logSkill", "dcsilve_revenge"); } }, }, - target:{ - marktext:'掠', - intro:{ - name:'私掠', - content:function(storage,player){ - return '被'+get.translation(storage)+'盯上了!'; - } - } + self: { + marktext: "私", + intro: { + name: "私掠", + content: function (storage, player) { + if (!storage || !storage.length) return "没有打劫对象"; + if (storage[0] == player) return "已绑定" + get.translation(player) + "自己"; + return "打劫对象:" + get.translation(storage); + }, + }, }, - robbed:{onremove:true,charlotte:true}, - } - }, - dcshuaijie:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - var targets=player.getStorage('dcsilve').filter(i=>i.isIn()); - if(!targets.length) return true; - return targets.filter(target=>{ - return player.hp>target.hp&&player.countCards('e')>target.countCards('e'); - }).length==targets.length; + target: { + marktext: "掠", + intro: { + name: "私掠", + content: function (storage, player) { + return "被" + get.translation(storage) + "盯上了!"; + }, + }, + }, + robbed: { onremove: true, charlotte: true }, }, - content:function(){ - 'step 0' - player.awakenSkill('dcshuaijie'); + }, + dcshuaijie: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); + if (!targets.length) return true; + return ( + targets.filter((target) => { + return player.hp > target.hp && player.countCards("e") > target.countCards("e"); + }).length == targets.length + ); + }, + content: function () { + "step 0"; + player.awakenSkill("dcshuaijie"); player.loseMaxHp(); - var choices=[]; - var choiceList=[ - '获得“私掠”角色至多三张牌', - '从牌堆中获得三张类型各不相同的牌' - ]; - var targets=player.getStorage('dcsilve').filter(i=>i.isIn()); - event.targets=targets; - if(targets.length) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - choices.push('选项二'); - player.chooseControl(choices).set('prompt','衰劫:选择一项').set('choiceList',choiceList).set('ai',()=>_status.event.choice).set('choice',function(){ - var eff=0; - for(var target of targets){ - eff+=get.effect(target,{name:'shunshou_copy2'},player,player)*2; - } - eff-=get.effect(player,{name:'dongzhuxianji'},player,player); - return eff>0&&choices.includes('选项一')?'选项一':'选项二'; - }()); - 'step 1' - if(result.control=='选项一'){ - if(targets.length){ - for(var target of targets){ - if(target.countGainableCards(player,'he')>0) { + var choices = []; + var choiceList = ["获得“私掠”角色至多三张牌", "从牌堆中获得三张类型各不相同的牌"]; + var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); + event.targets = targets; + if (targets.length) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + choices.push("选项二"); + player + .chooseControl(choices) + .set("prompt", "衰劫:选择一项") + .set("choiceList", choiceList) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var eff = 0; + for (var target of targets) { + eff += get.effect(target, { name: "shunshou_copy2" }, player, player) * 2; + } + eff -= get.effect(player, { name: "dongzhuxianji" }, player, player); + return eff > 0 && choices.includes("选项一") ? "选项一" : "选项二"; + })() + ); + ("step 1"); + if (result.control == "选项一") { + if (targets.length) { + for (var target of targets) { + if (target.countGainableCards(player, "he") > 0) { player.line(target); - player.gainPlayerCard(target,'he',true,[1,3]); + player.gainPlayerCard(target, "he", true, [1, 3]); } } } - } - else{ - var cards=[]; - for(var i=0;i<3;i++){ - var card=get.cardPile(cardx=>{ - return cards.filter(cardxx=>get.type2(cardxx)==get.type2(cardx)).length==0; + } else { + var cards = []; + for (var i = 0; i < 3; i++) { + var card = get.cardPile((cardx) => { + return ( + cards.filter((cardxx) => get.type2(cardxx) == get.type2(cardx)).length == + 0 + ); }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); } - 'step 2' - var targets=player.getStorage('dcsilve').filter(i=>i.isIn()); - for(var target of targets){ - target.unmarkAuto('dcsilve_target',[player]); + ("step 2"); + var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); + for (var target of targets) { + target.unmarkAuto("dcsilve_target", [player]); } delete player.storage.dcsilve; delete player.storage.dcsilve_self; - player.markAuto('dcsilve',[player]); - player.markAuto('dcsilve_self',[player]); + player.markAuto("dcsilve", [player]); + player.markAuto("dcsilve_self", [player]); }, - ai:{ - combo:'dcsilve', - order:8, - result:{ - player:function(player){ - var targets=player.getStorage('dcsilve').filter(i=>i.isIn()); - if(!targets.length) return 1; - var att=0; - targets.forEach(i=>att+=get.attitude(player,i)); - if(att<0) return 1; + ai: { + combo: "dcsilve", + order: 8, + result: { + player: function (player) { + var targets = player.getStorage("dcsilve").filter((i) => i.isIn()); + if (!targets.length) return 1; + var att = 0; + targets.forEach((i) => (att += get.attitude(player, i))); + if (att < 0) return 1; return 0; - } - } - } + }, + }, + }, }, //庞会 - dcyiyong:{ - audio:2, - trigger:{ - source:'damageBegin1', + dcyiyong: { + audio: 2, + trigger: { + source: "damageBegin1", }, //usable:2, - filter:function(event,player){ - return player.countDiscardableCards(player,'he')>0&&player!=event.player; + filter: function (event, player) { + return player.countDiscardableCards(player, "he") > 0 && player != event.player; }, - check:function(event,player){ - return get.attitude(player,event.player)<0&&player.countCards('he',card=>lib.filter.cardDiscardable(card,player,'dcyiyong')&&get.value(card,player)<7)>0; + check: function (event, player) { + return ( + get.attitude(player, event.player) < 0 && + player.countCards( + "he", + (card) => + lib.filter.cardDiscardable(card, player, "dcyiyong") && + get.value(card, player) < 7 + ) > 0 + ); }, - logTarget:'player', - content:function(){ - 'step 0' - event.list=[player]; - event.cards0=[];event.cards1=[]; - if(trigger.player.countDiscardableCards(trigger.player,'he')>0){ + logTarget: "player", + content: function () { + "step 0"; + event.list = [player]; + event.cards0 = []; + event.cards1 = []; + if (trigger.player.countDiscardableCards(trigger.player, "he") > 0) { event.list.push(trigger.player); } - if(!event.isMine()&&!event.isOnline()) game.delayx(); - player.chooseCardOL(event.list,'he',true,[1,Infinity],'异勇:弃置任意张牌',(card,player,target)=>{ - return lib.filter.cardDiscardable(card,player,'dcyiyong'); - }).set('ai',card=>{ - var evt=_status.event.getParent(2); - var source=evt.player,player=_status.event.player,target=evt.list[1]; - if(!target) return get.unuseful(card); - if(player==source){ - var total=0,need=0; - target.countCards('he',card=>{ - if(lib.filter.cardDiscardable(card,target,'dcyiyong')&&get.value(card)<5) need+=get.number(card); - }); - for(var i of ui.selected.cards) total+=get.number(i); - if(total>=need+5) return 0; - var val=6; - if(target.hp<=2&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:evt.getTrigger().card, - })) val+=2+get.number(card)/5; - if(target.countCards('he',card=>get.value(card)<5)>=3) val-=3+get.number(card)/5; - return val-get.value(card); - } - if(ui.selected.cards.length>1&&ui.selected.cards.length+2>=source.countCards('he')) return 0; - if(player.hp<=2&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:evt.getTrigger().card, - })) return 10-get.value(card); - return 5-get.value(card); - }); - 'step 1' - var lose_list=[],cards=[]; - for(var i=0; i { + return lib.filter.cardDiscardable(card, player, "dcyiyong"); + } + ) + .set("ai", (card) => { + var evt = _status.event.getParent(2); + var source = evt.player, + player = _status.event.player, + target = evt.list[1]; + if (!target) return get.unuseful(card); + if (player == source) { + var total = 0, + need = 0; + target.countCards("he", (card) => { + if ( + lib.filter.cardDiscardable(card, target, "dcyiyong") && + get.value(card) < 5 + ) + need += get.number(card); + }); + for (var i of ui.selected.cards) total += get.number(i); + if (total >= need + 5) return 0; + var val = 6; + if ( + target.hp <= 2 && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: evt.getTrigger().card, + }) + ) + val += 2 + get.number(card) / 5; + if (target.countCards("he", (card) => get.value(card) < 5) >= 3) + val -= 3 + get.number(card) / 5; + return val - get.value(card); + } + if ( + ui.selected.cards.length > 1 && + ui.selected.cards.length + 2 >= source.countCards("he") + ) + return 0; + if ( + player.hp <= 2 && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: evt.getTrigger().card, + }) + ) + return 10 - get.value(card); + return 5 - get.value(card); + }); + ("step 1"); + var lose_list = [], + cards = []; + for (var i = 0; i < result.length; i++) { + var current = event.list[i], + cards2 = result[i].cards; cards.push(cards2); - event['cards'+i]=cards2; - event.cards=cards; - lose_list.push([current,cards2]); + event["cards" + i] = cards2; + event.cards = cards; + lose_list.push([current, cards2]); } - game.loseAsync({lose_list:lose_list}).setContent('discardMultiple'); - 'step 2' - var getn=function(cards){ - return cards.map(i=>get.number(i,false)).reduce((p,c)=>p+c,0) - } - var num0=getn(event.cards0),num1=getn(event.cards1); - if(num0<=num1){ + game.loseAsync({ lose_list: lose_list }).setContent("discardMultiple"); + ("step 2"); + var getn = function (cards) { + return cards.map((i) => get.number(i, false)).reduce((p, c) => p + c, 0); + }; + var num0 = getn(event.cards0), + num1 = getn(event.cards1); + if (num0 <= num1) { player.draw(event.cards1.length); } - if(num0>=num1){ + if (num0 >= num1) { trigger.num++; } - } + }, }, //乐就 - dccuijin:{ - audio:2, - trigger:{global:'useCard'}, - filter:function(event,player){ - return (event.card.name=='sha'||event.card.name=='juedou')&&(event.player==player||player.inRange(event.player))&&player.countCards('he')>0; + dccuijin: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + return ( + (event.card.name == "sha" || event.card.name == "juedou") && + (event.player == player || player.inRange(event.player)) && + player.countCards("he") > 0 + ); }, - direct:true, - content:function(){ - 'step 0' - if(player!=game.me&&!player.isOnline()) game.delayx(); - var target=trigger.player; - event.target=target; - player.chooseToDiscard('he',get.prompt('dccuijin',target),'弃置一张牌并令'+get.translation(trigger.player)+'使用的'+get.translation(trigger.card)+'伤害+1,但若其未造成伤害,则你摸两张牌并对其造成1点伤害。').set('ai',function(card){ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).set('goon',lib.skill.cuijin.checkx(trigger,player)).logSkill=['dccuijin',target]; - 'step 1' - if(result.bool){ - if(typeof trigger.baseDamage!='number') trigger.baseDamage=1; + direct: true, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + var target = trigger.player; + event.target = target; + player + .chooseToDiscard( + "he", + get.prompt("dccuijin", target), + "弃置一张牌并令" + + get.translation(trigger.player) + + "使用的" + + get.translation(trigger.card) + + "伤害+1,但若其未造成伤害,则你摸两张牌并对其造成1点伤害。" + ) + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", lib.skill.cuijin.checkx(trigger, player)).logSkill = [ + "dccuijin", + target, + ]; + ("step 1"); + if (result.bool) { + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; trigger.baseDamage++; - player.addSkill('dccuijin_damage'); - player.markAuto('dccuijin_damage',[trigger.card]); - if(!player.storage.dccuijin_map) player.storage.dccuijin_map={cards:[],targets:[]}; + player.addSkill("dccuijin_damage"); + player.markAuto("dccuijin_damage", [trigger.card]); + if (!player.storage.dccuijin_map) + player.storage.dccuijin_map = { cards: [], targets: [] }; player.storage.dccuijin_map.cards.push(trigger.card); player.storage.dccuijin_map.targets.push(trigger.targets.slice()); } }, - subSkill:{ - damage:{ - trigger:{ - global:['damage','damageCancelled','damageZero','shaMiss','useCardToExcluded','useCardToEnd','eventNeutralized','useCardAfter','shaCancelled'], + subSkill: { + damage: { + trigger: { + global: [ + "damage", + "damageCancelled", + "damageZero", + "shaMiss", + "useCardToExcluded", + "useCardToEnd", + "eventNeutralized", + "useCardAfter", + "shaCancelled", + ], }, - forced:true, - silent:true, - firstDo:true, - charlotte:true, - onremove:true, - filter:function(event,player,name){ - if(!event.card) return false; - var cards=player.getStorage('dccuijin_damage'); - if(!cards.includes(event.card)) return false; + forced: true, + silent: true, + firstDo: true, + charlotte: true, + onremove: true, + filter: function (event, player, name) { + if (!event.card) return false; + var cards = player.getStorage("dccuijin_damage"); + if (!cards.includes(event.card)) return false; return true; }, - content:function(){ - 'step 0' - var card=trigger.card,idx=player.storage.dccuijin_map.cards.indexOf(card); - if(event.triggername=='useCardAfter'){ - var cards=player.getStorage('dccuijin_damage'); - cards=cards.remove(card); - if(!cards.length){ - player.removeSkill('dccuijin_damage'); + content: function () { + "step 0"; + var card = trigger.card, + idx = player.storage.dccuijin_map.cards.indexOf(card); + if (event.triggername == "useCardAfter") { + var cards = player.getStorage("dccuijin_damage"); + cards = cards.remove(card); + if (!cards.length) { + player.removeSkill("dccuijin_damage"); delete player.storage.dccuijin_map; - } - else if(idx!==-1){ - player.storage.dccuijin_map.cards.splice(idx,1); - player.storage.dccuijin_map.targets.splice(idx,1); + } else if (idx !== -1) { + player.storage.dccuijin_map.cards.splice(idx, 1); + player.storage.dccuijin_map.targets.splice(idx, 1); } event.finish(); - } - else if(idx!==-1){ - var target,source; - if(trigger.name.indexOf('damage')==0){ - target=trigger.player; - source=trigger.source; + } else if (idx !== -1) { + var target, source; + if (trigger.name.indexOf("damage") == 0) { + target = trigger.player; + source = trigger.source; + } else { + target = trigger.target; + source = trigger.player; } - else{ - target=trigger.target; - source=trigger.player; - } - if(player.storage.dccuijin_map.targets[idx].includes(target)&&!target.hasHistory('damage',evt=>{ - return evt.card==card; - })){ - player.logSkill('dccuijin_damage',source); + if ( + player.storage.dccuijin_map.targets[idx].includes(target) && + !target.hasHistory("damage", (evt) => { + return evt.card == card; + }) + ) { + player.logSkill("dccuijin_damage", source); player.storage.dccuijin_map.targets[idx].remove(target); player.draw(2); - if(source&&source.isIn()){ - player.line(trigger.player,'green'); + if (source && source.isIn()) { + player.line(trigger.player, "green"); trigger.player.damage(); } } } - 'step 1' + ("step 1"); game.delayx(); }, }, }, }, //陈矫 - dcxieshou:{ - trigger:{ - global:'damageEnd', + dcxieshou: { + trigger: { + global: "damageEnd", }, - usable:1, - filter:function(event,player){ - return get.distance(player,event.player)<=2&&event.player.isIn(); + usable: 1, + filter: function (event, player) { + return get.distance(player, event.player) <= 2 && event.player.isIn(); }, - check:function(event,player){ - return get.attitude(player,event.player)>4; + check: function (event, player) { + return get.attitude(player, event.player) > 4; }, - locked:false, - logTarget:'player', - onremove:true, - change:function(player,num){ - player.addSkill('dcxieshoux'); - if(typeof player.storage.dcxieshoux!=='number') player.storage.dcxieshoux=0; - if(!num) return; - player.storage.dcxieshoux+=num; - if(player.storage.dcxieshoux!=0) player.markSkill('dcxieshoux'); - else player.unmarkSkill('dcxieshoux'); - game.log(player,'的手牌上限',(num>0?'+':'')+num); + locked: false, + logTarget: "player", + onremove: true, + change: function (player, num) { + player.addSkill("dcxieshoux"); + if (typeof player.storage.dcxieshoux !== "number") player.storage.dcxieshoux = 0; + if (!num) return; + player.storage.dcxieshoux += num; + if (player.storage.dcxieshoux != 0) player.markSkill("dcxieshoux"); + else player.unmarkSkill("dcxieshoux"); + game.log(player, "的手牌上限", (num > 0 ? "+" : "") + num); }, - content:function(){ - 'step 0' - lib.skill.dcxieshou.change(player,-1); - 'step 1' - var list=[],target=trigger.player; - event.target=target; - var choiceList=['回复1点体力','复原,摸两张牌']; - if(target.getDamagedHp()==0) choiceList[0]=''+choiceList[0]+''; - else list.push('选项一'); - list.push('选项二'); - target.chooseControl(list).set('choiceList',choiceList).set('prompt',get.translation(player)+'对你发动了【协守】,请选择一项'); - 'step 2' - if(result.control=='选项一'){ + content: function () { + "step 0"; + lib.skill.dcxieshou.change(player, -1); + ("step 1"); + var list = [], + target = trigger.player; + event.target = target; + var choiceList = ["回复1点体力", "复原,摸两张牌"]; + if (target.getDamagedHp() == 0) + choiceList[0] = '' + choiceList[0] + ""; + else list.push("选项一"); + list.push("选项二"); + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("prompt", get.translation(player) + "对你发动了【协守】,请选择一项"); + ("step 2"); + if (result.control == "选项一") { target.recover(); - } - else { + } else { target.link(false); target.draw(2); } }, - ai:{ - expose:0.3, + ai: { + expose: 0.3, }, }, - dcxieshoux:{ - markimage:'image/card/handcard.png', - intro:{ - content:function(storage,player){ - var num=player.storage.dcxieshoux; - return '手牌上限'+(num >= 0?'+':'')+num; - } + dcxieshoux: { + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + var num = player.storage.dcxieshoux; + return "手牌上限" + (num >= 0 ? "+" : "") + num; + }, }, - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num+(player.storage.dcxieshoux||0); - } + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + (player.storage.dcxieshoux || 0); + }, }, }, - dcqingyan:{ - trigger:{ - target:'useCardToTargeted', + dcqingyan: { + trigger: { + target: "useCardToTargeted", }, - filter:function(event,player){ - return event.player!=player&&get.color(event.card)=='black'; + filter: function (event, player) { + return event.player != player && get.color(event.card) == "black"; }, - usable:2, + usable: 2, async cost(event, trigger, player) { - if (player.countCards('h') < player.hp) { - event.result = await player.chooseBool(get.prompt('dcqingyan'), '将手牌摸至体力上限(摸' + get.cnNumber(player.maxHp - player.countCards('h')) + '张牌)').set('ai', () => 1).forResult(); - } - else { - event.result = await player.chooseToDiscard(get.prompt('dcqingyan'), '弃置一张手牌令你的手牌上限+1', 'chooseonly').set('ai', card => 6 - get.value(card)).forResult(); + if (player.countCards("h") < player.hp) { + event.result = await player + .chooseBool( + get.prompt("dcqingyan"), + "将手牌摸至体力上限(摸" + + get.cnNumber(player.maxHp - player.countCards("h")) + + "张牌)" + ) + .set("ai", () => 1) + .forResult(); + } else { + event.result = await player + .chooseToDiscard( + get.prompt("dcqingyan"), + "弃置一张手牌令你的手牌上限+1", + "chooseonly" + ) + .set("ai", (card) => 6 - get.value(card)) + .forResult(); } }, async content(event, trigger, player) { @@ -6290,2770 +7988,3349 @@ game.import('character', function () { } }, }, - dcqizi:{ - mod:{ - cardSavable:function(card,player,target){ - if(get.distance(player,target)>2&&card.name=='tao'&&target==_status.event.dying) return false; + dcqizi: { + mod: { + cardSavable: function (card, player, target) { + if ( + get.distance(player, target) > 2 && + card.name == "tao" && + target == _status.event.dying + ) + return false; }, - } + }, }, //公孙度 - dczhenze:{ - audio:2, - trigger:{player:'phaseDiscardBegin'}, - direct:true, - content:function(){ - 'step 0' - var getCond=(player)=>Math.sign(player.countCards('h')-Math.max(0,player.hp)); - var me=getCond(player); - var recovers=game.filterPlayer(current=>getCond(current)==me),loses=game.filterPlayer().removeArray(recovers); - event.recovers=recovers; event.loses=loses; - var list=[]; - if(loses.length) list.push('选项一'); - if(recovers.length) list.push('选项二'); - list.push('cancel2'); - var sign=[['≥','<'],['≠','='],['≤','>']]; - var choiceList=[ - '令所有手牌数'+sign[me+1][0]+'体力值的角色失去1点体力'+(loses.length?'('+get.translation(loses)+')':''), - '令所有手牌数'+sign[me+1][1]+'体力值的角色回复1点体力'+(recovers.length?'('+get.translation(recovers)+')':'') + dczhenze: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + direct: true, + content: function () { + "step 0"; + var getCond = (player) => Math.sign(player.countCards("h") - Math.max(0, player.hp)); + var me = getCond(player); + var recovers = game.filterPlayer((current) => getCond(current) == me), + loses = game.filterPlayer().removeArray(recovers); + event.recovers = recovers; + event.loses = loses; + var list = []; + if (loses.length) list.push("选项一"); + if (recovers.length) list.push("选项二"); + list.push("cancel2"); + var sign = [ + ["≥", "<"], + ["≠", "="], + ["≤", ">"], ]; - if(!loses.length) choiceList[0]=''+choiceList[0]+''; - if(!recovers.length) choiceList[1]=''+choiceList[1]+''; - player.chooseControl(list).set('choiceList',choiceList).set('prompt',get.prompt('dczhenze')).set('ai',()=>_status.event.choice).set('choice',(()=>{ - var effect=0; - if(list.length==2){ - if(list.includes('选项一')){ - loses.forEach(i=>effect+=get.effect(i,{name:'losehp'},player,player)); - if(effect>0) return '选项一'; - }else{ - recovers.forEach(i=>effect+=get.recoverEffect(i,player,player)); - if(effect>0) return '选项二'; - } - }else{ - loses.forEach(i=>effect+=get.effect(i,{name:'losehp'},player,player)); - recovers.forEach(i=>effect+=get.recoverEffect(i,player,player)); - if(effect>0) return '选项二'; - return '选项一'; - } - })()); - 'step 1' - if(result.control=='cancel2'){ + var choiceList = [ + "令所有手牌数" + + sign[me + 1][0] + + "体力值的角色失去1点体力" + + (loses.length ? "(" + get.translation(loses) + ")" : ""), + "令所有手牌数" + + sign[me + 1][1] + + "体力值的角色回复1点体力" + + (recovers.length ? "(" + get.translation(recovers) + ")" : ""), + ]; + if (!loses.length) + choiceList[0] = '' + choiceList[0] + ""; + if (!recovers.length) + choiceList[1] = '' + choiceList[1] + ""; + player + .chooseControl(list) + .set("choiceList", choiceList) + .set("prompt", get.prompt("dczhenze")) + .set("ai", () => _status.event.choice) + .set( + "choice", + (() => { + var effect = 0; + if (list.length == 2) { + if (list.includes("选项一")) { + loses.forEach( + (i) => + (effect += get.effect(i, { name: "losehp" }, player, player)) + ); + if (effect > 0) return "选项一"; + } else { + recovers.forEach( + (i) => (effect += get.recoverEffect(i, player, player)) + ); + if (effect > 0) return "选项二"; + } + } else { + loses.forEach( + (i) => (effect += get.effect(i, { name: "losehp" }, player, player)) + ); + recovers.forEach((i) => (effect += get.recoverEffect(i, player, player))); + if (effect > 0) return "选项二"; + return "选项一"; + } + })() + ); + ("step 1"); + if (result.control == "cancel2") { event.finish(); - } - else { - var lose=result.control=='选项一',targets=event[lose?'loses':'recovers']; - player.logSkill('dczhenze',targets); - for(var i of targets){ - i[lose?'loseHp':'recover'](); + } else { + var lose = result.control == "选项一", + targets = event[lose ? "loses" : "recovers"]; + player.logSkill("dczhenze", targets); + for (var i of targets) { + i[lose ? "loseHp" : "recover"](); } } - } + }, }, - dcanliao:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if((player.getStat().skill.dcanliao||0)>=game.countPlayer(current=>current.group=='qun')) return false; + dcanliao: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if ( + (player.getStat().skill.dcanliao || 0) >= + game.countPlayer((current) => current.group == "qun") + ) + return false; return true; }, - filterTarget:function(card,player,target){ - return target.countCards('he'); + filterTarget: function (card, player, target) { + return target.countCards("he"); }, - content:function(){ - 'step 0' - player.choosePlayerCard(target,'he',true).set('filterButton',function(button){ - var card=button.link,owner=get.owner(card); - return !owner||owner.canRecast(card,_status.event.player); - }).set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.getParent().target)>=0) return -get.buttonValue(card); - return get.buttonValue(card); - }); - 'step 1' - if(result.bool) target.recast(result.links); + content: function () { + "step 0"; + player + .choosePlayerCard(target, "he", true) + .set("filterButton", function (button) { + var card = button.link, + owner = get.owner(card); + return !owner || owner.canRecast(card, _status.event.player); + }) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().target) >= 0) + return -get.buttonValue(card); + return get.buttonValue(card); + }); + ("step 1"); + if (result.bool) target.recast(result.links); }, - ai:{ - expose:0.1, - result:{ - target:function(player,target){ - if(target.hasCard(card=>get.value(card)>=6,'e')&&get.attitude(player,target)<0) return -1; + ai: { + expose: 0.1, + result: { + target: function (player, target) { + if ( + target.hasCard((card) => get.value(card) >= 6, "e") && + get.attitude(player, target) < 0 + ) + return -1; return 1; - } - } - } + }, + }, + }, }, //王烈 - dcchongwang:{ - audio:2, - trigger:{global:'useCard'}, - direct:true, - filter:function(event,player){ - if(player==event.player) return false; - var type=get.type(event.card); - if(type!='basic'&&type!='trick') return false; - var history=game.getAllGlobalHistory('useCard'); - var index=history.indexOf(event); - if(index>0) return history[index-1].player==player; + dcchongwang: { + audio: 2, + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + if (player == event.player) return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + var history = game.getAllGlobalHistory("useCard"); + var index = history.indexOf(event); + if (index > 0) return history[index - 1].player == player; return false; }, - content:function(){ - 'step 0' - var source=trigger.player; - var list=[['exclude','令'+get.translation(trigger.card)+'无效']]; - var cards=trigger.cards.filterInD(); - if(source.isIn()&&cards.length>0) list.push(['gain','令'+get.translation(source)+'收回'+get.translation(cards)]); - player.chooseButton([ - get.prompt('dcchongwang',source), - [list,'textbutton'], - 'noforcebutton', - ]).set('ai',function(button){ - var player=_status.event.player,choice=button.link; - var evt=_status.event.getTrigger(); - if(choice=='exclude'){ - var effect=0; - if(!evt.targets.length&&get.info(evt.card,false).notarget) effect-=get.effect(evt.player,evt.card,evt.player,player); - for(var i of evt.targets){ - effect-=get.effect(i,evt.card,evt.player,player); + content: function () { + "step 0"; + var source = trigger.player; + var list = [["exclude", "令" + get.translation(trigger.card) + "无效"]]; + var cards = trigger.cards.filterInD(); + if (source.isIn() && cards.length > 0) + list.push(["gain", "令" + get.translation(source) + "收回" + get.translation(cards)]); + player + .chooseButton([ + get.prompt("dcchongwang", source), + [list, "textbutton"], + "noforcebutton", + ]) + .set("ai", function (button) { + var player = _status.event.player, + choice = button.link; + var evt = _status.event.getTrigger(); + if (choice == "exclude") { + var effect = 0; + if (!evt.targets.length && get.info(evt.card, false).notarget) + effect -= get.effect(evt.player, evt.card, evt.player, player); + for (var i of evt.targets) { + effect -= get.effect(i, evt.card, evt.player, player); + } + return effect; + } else { + var cards = evt.cards.filterInD(); + return get.value(cards, evt.player) * get.attitude(player, evt.player); } - return effect; - } - else{ - var cards=evt.cards.filterInD(); - return get.value(cards,evt.player)*get.attitude(player,evt.player); - } - }) - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.logSkill('dcchongwang',trigger.player); - if(result.links[0]=='gain'){ - player.addTempSkill('dcchongwang_gain'); - trigger._dcchongwang=true; - } - else{ - trigger.targets.length=0; - trigger.all_excluded=true; - game.log(trigger.card,'被无效了'); + }); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.logSkill("dcchongwang", trigger.player); + if (result.links[0] == "gain") { + player.addTempSkill("dcchongwang_gain"); + trigger._dcchongwang = true; + } else { + trigger.targets.length = 0; + trigger.all_excluded = true; + game.log(trigger.card, "被无效了"); } } }, - ai:{ - threaten:3.5, - directHit_ai:true, + ai: { + threaten: 3.5, + directHit_ai: true, }, - subSkill:{ - gain:{ - trigger:{global:'useCardAfter'}, - charlotte:true, - forced:true, - popup:false, - filter:function(event,player){ + subSkill: { + gain: { + trigger: { global: "useCardAfter" }, + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { return event._dcchongwang; }, - content:function(){ - trigger.player.gain(trigger.cards.filterInD(),'gain2'); - } - } - } + content: function () { + trigger.player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + }, }, - dchuagui:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he')>0; + dchuagui: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; }); }, - content:function(){ - 'step 0' - var min=Math.max.apply(Math,game.filterPlayer().map(function(current){ - return 1+current.getFriends().length; - })); - var max=Math.min(min,game.countPlayer(function(current){ - return current!=player&¤t.countCards('he')>0; - })); - player.chooseTarget(get.prompt('dchuagui'),'令至多'+get.cnNumber(max)+'名角色进行囚徒困境选择',[1,max],function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }).set('animate',false).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - player.logSkill('dchuagui'); - event.players=result.targets.slice(0); - event._global_waiting=true; - } - else event.finish(); - 'step 2' - var send=function(source){ - var next=game.createEvent('dchuagui_choose',false); - next.player=game.me; - next.source=source; + content: function () { + "step 0"; + var min = Math.max.apply( + Math, + game.filterPlayer().map(function (current) { + return 1 + current.getFriends().length; + }) + ); + var max = Math.min( + min, + game.countPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }) + ); + player + .chooseTarget( + get.prompt("dchuagui"), + "令至多" + get.cnNumber(max) + "名角色进行囚徒困境选择", + [1, max], + function (card, player, target) { + return target != player && target.countCards("he") > 0; + } + ) + .set("animate", false) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + player.logSkill("dchuagui"); + event.players = result.targets.slice(0); + event._global_waiting = true; + } else event.finish(); + ("step 2"); + var send = function (source) { + var next = game.createEvent("dchuagui_choose", false); + next.player = game.me; + next.source = source; next.setContent(lib.skill.dchuagui.contentx); game.resume(); }; - var sendback=function(result,player){ - if(!Array.isArray(result)){ - result=[ - Math.random()<0.5?'仅展示牌':'交出牌', - player.getCards('he').randomGet() + var sendback = function (result, player) { + if (!Array.isArray(result)) { + result = [ + Math.random() < 0.5 ? "仅展示牌" : "交出牌", + player.getCards("he").randomGet(), ]; } - event.results.push([player,result]); + event.results.push([player, result]); }; - event.ai_targets=[]; - event.results=[]; - var players=game.filterPlayer(function(current){ - return current!=player; - }).sortBySeat(); - var time=10000; - if(lib.configOL&&lib.configOL.choose_timeout) time=parseInt(lib.configOL.choose_timeout)*1000; - for(var i=0;iget.value(b,target)-get.value(a,target)); - var choice='仅展示牌',card=hs[0]; - if(att<-2&&Math.random()>((get.value(card,target)-3)/5)) choice='交出牌'; - sendback([choice,card],target); - if(!event.ai_targets.length){ - clearInterval(event.interval); - if(event.withai) game.resume(); - } - },_status.connectMove?750:75); - },500) + setTimeout(function () { + event.interval = setInterval( + function () { + var target = event.ai_targets.shift(); + var att = get.attitude(target, player), + hs = target.getCards("he"); + hs.sort((b, a) => get.value(b, target) - get.value(a, target)); + var choice = "仅展示牌", + card = hs[0]; + if (att < -2 && Math.random() > (get.value(card, target) - 3) / 5) + choice = "交出牌"; + sendback([choice, card], target); + if (!event.ai_targets.length) { + clearInterval(event.interval); + if (event.withai) game.resume(); + } + }, + _status.connectMove ? 750 : 75 + ); + }, 500); } - 'step 3' - if(event.withme){ - if(_status.connectMode) game.me.unwait(result,game.me); - else{ - if(!Array.isArray(result)){ - result=[ - Math.random()<0.5?'仅展示牌':'交出牌', - player.getCards('he').randomGet() + ("step 3"); + if (event.withme) { + if (_status.connectMode) game.me.unwait(result, game.me); + else { + if (!Array.isArray(result)) { + result = [ + Math.random() < 0.5 ? "仅展示牌" : "交出牌", + player.getCards("he").randomGet(), ]; } - event.results.push([player,result]); + event.results.push([player, result]); } } - 'step 4' - if(event.withol&&!event.resultOL){ + ("step 4"); + if (event.withol && !event.resultOL) { game.pause(); } - 'step 5' - if(event.ai_targets.length>0){ - event.withai=true; + ("step 5"); + if (event.ai_targets.length > 0) { + event.withai = true; game.pause(); } - 'step 6' + ("step 6"); delete event._global_waiting; - for(var i of game.players) i.hideTimer(); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(name,id,results){ - var dialog=ui.create.dialog(name+'发动了技能【化归】','hidden','forcebutton'); - dialog.videoId=id; - dialog.classList.add('scroll1'); - dialog.classList.add('scroll2'); - dialog.classList.add('fullwidth'); - dialog.classList.add('fullheight'); - dialog.buttonss=[]; + for (var i of game.players) i.hideTimer(); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (name, id, results) { + var dialog = ui.create.dialog( + name + "发动了技能【化归】", + "hidden", + "forcebutton" + ); + dialog.videoId = id; + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.buttonss = []; - var list=['仅展示牌的玩家','交出牌的玩家'] - for(var i=0;i'+list[i]+''); - var buttons=ui.create.div('.buttons',dialog.content); - dialog.buttonss.push(buttons); - buttons.classList.add('popup'); - buttons.classList.add('guanxing'); - } - dialog.open(); + var list = ["仅展示牌的玩家", "交出牌的玩家"]; + for (var i = 0; i < list.length; i++) { + dialog.add('
    ' + list[i] + "
    "); + var buttons = ui.create.div(".buttons", dialog.content); + dialog.buttonss.push(buttons); + buttons.classList.add("popup"); + buttons.classList.add("guanxing"); + } + dialog.open(); - var getx=function(){ - var item=results.shift(); - var card=item[1][1],index=item[1][0]=='仅展示牌'?0:1; - var button=ui.create.button(card,'card',dialog.buttonss[index]); - button.querySelector('.info').innerHTML=(function(target){ - if(target._tempTranslate) return target._tempTranslate; - var name=target.name; - if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; - return get.translation(name); - }(item[0])); - if(results.length>0) setTimeout(getx,500); - } - setTimeout(getx,500); - },get.translation(player),event.videoId,event.results.slice(0)); - game.delay(0,2000+event.results.length*500) - 'step 7' - game.broadcastAll('closeDialog',event.videoId); - var shown=[],given=[]; - for(var i of event.results){ - (i[1][0]=='仅展示牌'?shown:given).push(i); + var getx = function () { + var item = results.shift(); + var card = item[1][1], + index = item[1][0] == "仅展示牌" ? 0 : 1; + var button = ui.create.button(card, "card", dialog.buttonss[index]); + button.querySelector(".info").innerHTML = (function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + })(item[0]); + if (results.length > 0) setTimeout(getx, 500); + }; + setTimeout(getx, 500); + }, + get.translation(player), + event.videoId, + event.results.slice(0) + ); + game.delay(0, 2000 + event.results.length * 500); + ("step 7"); + game.broadcastAll("closeDialog", event.videoId); + var shown = [], + given = []; + for (var i of event.results) { + (i[1][0] == "仅展示牌" ? shown : given).push(i); } - var list=given.length>0?given:shown; - var cards=[],targets=[]; - for(var i of list){ + var list = given.length > 0 ? given : shown; + var cards = [], + targets = []; + for (var i of list) { cards.push(i[1][1]); targets.push(i[0]); //i[0].$give(i[1][1],player); } player.line(targets); - player.gain(cards,'give'); + player.gain(cards, "give"); //step 8 //game.delayx(); }, - contentx:function(){ - 'step 0' - event._global_waiting=true; - event.result=['仅展示牌',player.getCards('he').randomGet()]; - var str=get.translation(source); - player.chooseControl('仅展示牌','交出牌').set('choiceList',[ - '仅展示一张牌。但如果所有人都选择了仅展示,则'+str+'获得这张牌', - '将一张牌交给'+str, - ]).set('_global_waiting',true); - 'step 1' - event.result[0]=result.control; - player.chooseCard('he',true).set('_global_waiting',true); - 'step 2' - event.result[1]=result.cards[0]; + contentx: function () { + "step 0"; + event._global_waiting = true; + event.result = ["仅展示牌", player.getCards("he").randomGet()]; + var str = get.translation(source); + player + .chooseControl("仅展示牌", "交出牌") + .set("choiceList", [ + "仅展示一张牌。但如果所有人都选择了仅展示,则" + str + "获得这张牌", + "将一张牌交给" + str, + ]) + .set("_global_waiting", true); + ("step 1"); + event.result[0] = result.control; + player.chooseCard("he", true).set("_global_waiting", true); + ("step 2"); + event.result[1] = result.cards[0]; }, }, //陈珪 - dcyingtu:{ - audio:2, - trigger:{ - global:['gainAfter','loseAsyncAfter'], + dcyingtu: { + audio: 2, + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - usable:1, - getIndex(event, player){ - var targets=[]; - if(lib.skill.dcyingtu.filterx(event,player,player.getNext())) targets.add(player.getNext()); - if(lib.skill.dcyingtu.filterx(event,player,player.getPrevious())) targets.add(player.getPrevious()); + usable: 1, + getIndex(event, player) { + var targets = []; + if (lib.skill.dcyingtu.filterx(event, player, player.getNext())) + targets.add(player.getNext()); + if (lib.skill.dcyingtu.filterx(event, player, player.getPrevious())) + targets.add(player.getPrevious()); return targets.sortBySeat(_status.currentPhase); }, - filterx:function(event,player,target){ - var evt=event.getParent('phaseDraw'); - if(evt&&target==evt.player) return false; - return event.getg(target).length>0&&target.hasCard(function(card){ - return lib.filter.canBeGained(card,target,player) - },'he'); + filterx: function (event, player, target) { + var evt = event.getParent("phaseDraw"); + if (evt && target == evt.player) return false; + return ( + event.getg(target).length > 0 && + target.hasCard(function (card) { + return lib.filter.canBeGained(card, target, player); + }, "he") + ); }, - logTarget(event, player, triggername, target){ + logTarget(event, player, triggername, target) { return target; }, - check(event, player, triggername, source){ - var target=(source==player.getNext()?player.getPrevious():player.getNext()); - return Math.min(0,get.attitude(player,target))>=get.attitude(player,source); + check(event, player, triggername, source) { + var target = source == player.getNext() ? player.getPrevious() : player.getNext(); + return Math.min(0, get.attitude(player, target)) >= get.attitude(player, source); }, - prompt2:'获得该角色的一张牌,然后将一张牌交给该角色的对位角色。若你给出的是装备牌,则其使用其得到的牌。', - content:function(){ - 'step 0' - var target=event.targets[0]; - event.target=target; - event.side=(target==player.getPrevious()?'getNext':'getPrevious'); - player.gainPlayerCard(target,true,'he'); - 'step 1' - var he=player.getCards('he'); - if(he.length>0){ - var target=player[event.side](); - event.target=target; - if(he.length==1) event._result={bool:true,cards:he}; - else player.chooseCard('he',true,'交给'+get.translation(target)+'一张牌') - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - event.card=card; + prompt2: + "获得该角色的一张牌,然后将一张牌交给该角色的对位角色。若你给出的是装备牌,则其使用其得到的牌。", + content: function () { + "step 0"; + var target = event.targets[0]; + event.target = target; + event.side = target == player.getPrevious() ? "getNext" : "getPrevious"; + player.gainPlayerCard(target, true, "he"); + ("step 1"); + var he = player.getCards("he"); + if (he.length > 0) { + var target = player[event.side](); + event.target = target; + if (he.length == 1) event._result = { bool: true, cards: he }; + else player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + event.card = card; player.line(target); - player.give(card,target); - } - else event.finish(); - 'step 3' - if(target.getCards('h').includes(card)&&get.type(card,null,target)=='equip'&&target.canUse(card,target)) target.chooseUseTarget(card,true,'nopopup'); + player.give(card, target); + } else event.finish(); + ("step 3"); + if ( + target.getCards("h").includes(card) && + get.type(card, null, target) == "equip" && + target.canUse(card, target) + ) + target.chooseUseTarget(card, true, "nopopup"); }, }, - dccongshi:{ - audio:2, - trigger:{global:'useCardAfter'}, - forced:true, - filter:function(event,player){ - return get.type(event.card,null,false)=='equip'&&event.player.isMaxEquip(); + dccongshi: { + audio: 2, + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return get.type(event.card, null, false) == "equip" && event.player.isMaxEquip(); }, - content:function(){ + content: function () { player.draw(); }, }, //黄权 - dcquanjian:{ - audio:2, - enable:'phaseUse', - usable:2, - filter:function(event,player){ - return game.hasPlayer(current=>current!=player); + dcquanjian: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return game.hasPlayer((current) => current != player); }, - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('劝谏:令一名其他角色…','hidden'); - dialog.add([[ - ['damage','对其攻击范围内的一名角色造成1点伤害'], - ['draw','将其手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌'] - ],'textbutton']); + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("劝谏:令一名其他角色…", "hidden"); + dialog.add([ + [ + ["damage", "对其攻击范围内的一名角色造成1点伤害"], + [ + "draw", + "将其手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌", + ], + ], + "textbutton", + ]); return dialog; }, - filter:function(button,player){ - return !player.hasSkill('dcquanjian_'+button.link,null,null,false); + filter: function (button, player) { + return !player.hasSkill("dcquanjian_" + button.link, null, null, false); }, - check:()=>1+Math.random(), - backup:function(links){ - return get.copy(lib.skill['dcquanjian_'+links[0]]); + check: () => 1 + Math.random(), + backup: function (links) { + return get.copy(lib.skill["dcquanjian_" + links[0]]); }, - prompt:function(links){ - if(links[0]=='damage') return '令一名其他角色对攻击范围内的另一名角色造成1点伤害'; - return '令一名其他角色将手牌数调整至手牌上限(至多摸至五张)且本回合内不能使用手牌'; + prompt: function (links) { + if (links[0] == "damage") return "令一名其他角色对攻击范围内的另一名角色造成1点伤害"; + return "令一名其他角色将手牌数调整至手牌上限(至多摸至五张)且本回合内不能使用手牌"; }, }, - ai:{ - order:2, - result:{player:1}, + ai: { + order: 2, + result: { player: 1 }, }, - subSkill:{ - backup:{audio:'dcquanjian'}, - damage:{ - audio:'dcquanjian', - selectTarget:2, - filterTarget:function(card,player,target){ - if(!ui.selected.targets.length) return target!=player; + subSkill: { + backup: { audio: "dcquanjian" }, + damage: { + audio: "dcquanjian", + selectTarget: 2, + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return target != player; return ui.selected.targets[0].inRange(target); }, - complexTarget:true, - complexSelect:true, - filterCard:()=>false, - selectCard:-1, - targetprompt:['造成伤害','受到伤害'], - multitarget:true, - content:function(){ - 'step 0' - player.addTempSkill('dcquanjian_damage','phaseUseAfter'); - targets[0].chooseControl().set('choiceList',[ - '对'+get.translation(targets[1])+'造成1点伤害', - '本回合下次受到的伤害+1', - ]).set('ai',function(){ - return _status.event.eff>=0?0:1; - }).set('eff',get.damageEffect(targets[1],targets[0],targets[0])); - 'step 1' - if(result.index==0){ + complexTarget: true, + complexSelect: true, + filterCard: () => false, + selectCard: -1, + targetprompt: ["造成伤害", "受到伤害"], + multitarget: true, + content: function () { + "step 0"; + player.addTempSkill("dcquanjian_damage", "phaseUseAfter"); + targets[0] + .chooseControl() + .set("choiceList", [ + "对" + get.translation(targets[1]) + "造成1点伤害", + "本回合下次受到的伤害+1", + ]) + .set("ai", function () { + return _status.event.eff >= 0 ? 0 : 1; + }) + .set("eff", get.damageEffect(targets[1], targets[0], targets[0])); + ("step 1"); + if (result.index == 0) { targets[1].damage(targets[0]); - } - else{ - target.addMark('dcquanjian_effect',1,false); - target.addTempSkill('dcquanjian_effect'); + } else { + target.addMark("dcquanjian_effect", 1, false); + target.addTempSkill("dcquanjian_effect"); } }, - ai:{ - result:{ - player:function(player,target){ - if(ui.selected.targets.length==0){ - if(!game.hasPlayer((current)=>current.inRangeOf(target)&&get.damageEffect(current,target,player)>0)) return 0; - if(get.attitude(player,target)>0) return 2; + ai: { + result: { + player: function (player, target) { + if (ui.selected.targets.length == 0) { + if ( + !game.hasPlayer( + (current) => + current.inRangeOf(target) && + get.damageEffect(current, target, player) > 0 + ) + ) + return 0; + if (get.attitude(player, target) > 0) return 2; return 1; } - return get.damageEffect(target,ui.selected.targets[0],player,player); + return get.damageEffect(target, ui.selected.targets[0], player, player); }, }, }, }, - draw:{ - audio:'dcquanjian', - filterTarget:function(card,player,target){ - if(target==player) return false; - var num=target.countCards('h'); - if(num>target.getHandcardLimit()) return true; - return num target.getHandcardLimit()) return true; + return num < Math.min(5, target.getHandcardLimit()); }, - filterCard:()=>false, - selectCard:-1, - content:function(){ - 'step 0' - player.addTempSkill('dcquanjian_draw','phaseUseAfter'); - var num1=target.countCards('h'),num2=target.getHandcardLimit(); - var num=0; - if(num1>num2){ - event.index=0; - num=num1-num2; - target.chooseControl().set('choiceList',[ - '弃置'+get.cnNumber(num)+'张手牌', - '本回合下次受到的伤害+1', - ]).set('ai',function(){ - var player=_status.event.player; - if(_status.event.number==1&&player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'dcquanjian_draw')&&get.value(card)<5; - },'h')) return 0; - return 1; - }).set('number',num); + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcquanjian_draw", "phaseUseAfter"); + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + var num = 0; + if (num1 > num2) { + event.index = 0; + num = num1 - num2; + target + .chooseControl() + .set("choiceList", [ + "弃置" + get.cnNumber(num) + "张手牌", + "本回合下次受到的伤害+1", + ]) + .set("ai", function () { + var player = _status.event.player; + if ( + _status.event.number == 1 && + player.hasCard(function (card) { + return ( + lib.filter.cardDiscardable( + card, + player, + "dcquanjian_draw" + ) && get.value(card) < 5 + ); + }, "h") + ) + return 0; + return 1; + }) + .set("number", num); + } else { + event.index = 1; + num = Math.min(num2, 5) - num1; + if (num <= 0) event.finish(); + else + target + .chooseControl() + .set("choiceList", [ + "摸" + get.cnNumber(num) + "张牌,且本回合内不能使用或打出手牌", + "本回合下次受到的伤害+1", + ]) + .set("ai", function () { + return 0; + }); } - else{ - event.index=1; - num=Math.min(num2,5)-num1; - if(num<=0) event.finish(); - else target.chooseControl().set('choiceList',[ - '摸'+get.cnNumber(num)+'张牌,且本回合内不能使用或打出手牌', - '本回合下次受到的伤害+1', - ]).set('ai',function(){ - return 0; - }); - } - event.num=num; - 'step 1' - if(result.index==0){ - if(event.index==0) target.chooseToDiscard('h',true,num); + event.num = num; + ("step 1"); + if (result.index == 0) { + if (event.index == 0) target.chooseToDiscard("h", true, num); else target.draw(num); - } - else{ - target.addMark('dcquanjian_effect',1,false); - target.addTempSkill('dcquanjian_effect'); + } else { + target.addMark("dcquanjian_effect", 1, false); + target.addTempSkill("dcquanjian_effect"); event.finish(); } - 'step 2' - target.addTempSkill('dcquanjian_disable'); + ("step 2"); + target.addTempSkill("dcquanjian_disable"); }, - ai:{ - result:{ - target:function(player,target){ - var num1=target.countCards('h'),num2=target.getHandcardLimit(); - if(num1>num2) return -1; - return Math.min(5,num2)-num1; + ai: { + result: { + target: function (player, target) { + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + if (num1 > num2) return -1; + return Math.min(5, num2) - num1; }, }, }, }, - effect:{ - charlotte:true, - trigger:{player:'damageBegin3'}, - forced:true, - onremove:true, - marktext:'谏', - content:function(){ - trigger.num+=player.countMark(event.name); + effect: { + charlotte: true, + trigger: { player: "damageBegin3" }, + forced: true, + onremove: true, + marktext: "谏", + content: function () { + trigger.num += player.countMark(event.name); player.removeSkill(event.name); }, - intro:{content:'下次受到的伤害+#'}, - ai:{threaten:2.5}, + intro: { content: "下次受到的伤害+#" }, + ai: { threaten: 2.5 }, }, - disable:{ - charlotte:true, - mod:{ - cardEnabled(card, player){ + disable: { + charlotte: true, + mod: { + cardEnabled(card, player) { if (card.cards) { - const hs = player.getCards('h'); - if (card.cards.some(card => hs.includes(card))) return false; + const hs = player.getCards("h"); + if (card.cards.some((card) => hs.includes(card))) return false; } }, - cardSavable(card, player){ + cardSavable(card, player) { if (card.cards) { - const hs = player.getCards('h'); - if (card.cards.some(card => hs.includes(card))) return false; + const hs = player.getCards("h"); + if (card.cards.some((card) => hs.includes(card))) return false; } }, }, - mark:true, - marktext:'禁', - intro:{content:'不能使用或打出手牌'}, - ai:{threaten:2.5}, + mark: true, + marktext: "禁", + intro: { content: "不能使用或打出手牌" }, + ai: { threaten: 2.5 }, }, }, }, - dctujue:{ - audio:2, - trigger:{player:'dying'}, - direct:true, - limited:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return player.countCards('he')>0; + dctujue: { + audio: 2, + trigger: { player: "dying" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,get.prompt2('dctujue')).set('ai',function(target){ - if(_status.event.skip) return 0; - return 200+get.attitude(_status.event.player,target); - }).set('skip',player.countCards('hs',{name:['tao','jiu']})+player.hp>0); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dctujue',target); - player.awakenSkill('dctujue'); - var cards=player.getCards('he'); - player.give(cards,target); + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, get.prompt2("dctujue")) + .set("ai", function (target) { + if (_status.event.skip) return 0; + return 200 + get.attitude(_status.event.player, target); + }) + .set("skip", player.countCards("hs", { name: ["tao", "jiu"] }) + player.hp > 0); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dctujue", target); + player.awakenSkill("dctujue"); + var cards = player.getCards("he"); + player.give(cards, target); player.recover(cards.length); player.draw(cards.length); } }, }, //尹夫人 - dcyingyu:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - direct:true, - filter:function(event,player){ - if(event.name=='phaseJieshu'&&!player.storage.dcyingyu) return false; - return game.countPlayer(function(current){ - return current.countCards('h')>0; - })>1; + dcyingyu: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + direct: true, + filter: function (event, player) { + if (event.name == "phaseJieshu" && !player.storage.dcyingyu) return false; + return ( + game.countPlayer(function (current) { + return current.countCards("h") > 0; + }) > 1 + ); }, - content:function(){ - 'step 0' - player.chooseTarget(2,get.prompt('dcyingyu'),'展示两名角色的各一张手牌。若这两张牌花色不同,则你可以令其中一名角色获得另一名角色的展示牌。',function(card,player,target){ - return target.countCards('h')>0; - }).set('ai',function(target){ - var player=_status.event.player; - if(!ui.selected.targets.length) return get.attitude(player,target); - return 1-get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - event.targets=targets; - event.cards=[]; - player.logSkill('dcyingyu',targets); - player.choosePlayerCard(targets[0],true,'h'); - } - else event.finish(); - 'step 2' - var card=result.cards[0]; + content: function () { + "step 0"; + player + .chooseTarget( + 2, + get.prompt("dcyingyu"), + "展示两名角色的各一张手牌。若这两张牌花色不同,则你可以令其中一名角色获得另一名角色的展示牌。", + function (card, player, target) { + return target.countCards("h") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) return get.attitude(player, target); + return 1 - get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + event.cards = []; + player.logSkill("dcyingyu", targets); + player.choosePlayerCard(targets[0], true, "h"); + } else event.finish(); + ("step 2"); + var card = result.cards[0]; player.line(targets[0]); - player.showCards(card,get.translation(player)+'对'+get.translation(targets[0])+'发动了【媵予】') + player.showCards( + card, + get.translation(player) + "对" + get.translation(targets[0]) + "发动了【媵予】" + ); event.cards.push(card); - player.choosePlayerCard(targets[1],true,'h'); - 'step 3' - var card=result.cards[0]; + player.choosePlayerCard(targets[1], true, "h"); + ("step 3"); + var card = result.cards[0]; player.line(targets[1]); - player.showCards(card,get.translation(player)+'对'+get.translation(targets[1])+'发动了【媵予】') + player.showCards( + card, + get.translation(player) + "对" + get.translation(targets[1]) + "发动了【媵予】" + ); event.cards.push(card); - if(get.suit(cards[0],targets[0])==get.suit(cards[1],targets[1])) event.finish(); - 'step 4' - var str1=get.translation(targets[0]),str2=get.translation(targets[1]); - player.chooseControl('cancel2').set('choiceList',[ - '令'+str1+'获得'+str2+'的'+get.translation(cards[1]), - '令'+str2+'获得'+str1+'的'+get.translation(cards[0]), - ]).set('goon',get.attitude(player,targets[0])>0?0:1).set('ai',()=>_status.event.goon); - 'step 5' - if(result.control!='cancel2'){ - var i=result.index; - targets[1-i].give(cards[1-i],targets[i],'give'); + if (get.suit(cards[0], targets[0]) == get.suit(cards[1], targets[1])) event.finish(); + ("step 4"); + var str1 = get.translation(targets[0]), + str2 = get.translation(targets[1]); + player + .chooseControl("cancel2") + .set("choiceList", [ + "令" + str1 + "获得" + str2 + "的" + get.translation(cards[1]), + "令" + str2 + "获得" + str1 + "的" + get.translation(cards[0]), + ]) + .set("goon", get.attitude(player, targets[0]) > 0 ? 0 : 1) + .set("ai", () => _status.event.goon); + ("step 5"); + if (result.control != "cancel2") { + var i = result.index; + targets[1 - i].give(cards[1 - i], targets[i], "give"); } }, - onremove:true, + onremove: true, }, - dcyongbi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h')>0&&game.hasPlayer((current)=>lib.skill.dcyongbi.filterTarget(null,player,current)); + dcyongbi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer((current) => lib.skill.dcyongbi.filterTarget(null, player, current)) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.hasSex('male'); + filterTarget: function (card, player, target) { + return target != player && target.hasSex("male"); }, - selectCard:-1, - filterCard:true, - position:'h', - limited:true, - skillAnimation:true, - animationColor:'fire', - discard:false, - lose:false, - content:function(){ - 'step 0' - player.awakenSkill('dcyongbi'); - if(player.hasSkill('dcyingyu',null,null,false)) player.storage.dcyingyu=true; - player.give(cards,target); - 'step 1' - var list=[]; - for(var i of cards){ - list.add(get.suit(i,player)); - if(list.length>=3) break; + selectCard: -1, + filterCard: true, + position: "h", + limited: true, + skillAnimation: true, + animationColor: "fire", + discard: false, + lose: false, + content: function () { + "step 0"; + player.awakenSkill("dcyongbi"); + if (player.hasSkill("dcyingyu", null, null, false)) player.storage.dcyingyu = true; + player.give(cards, target); + ("step 1"); + var list = []; + for (var i of cards) { + list.add(get.suit(i, player)); + if (list.length >= 3) break; } - if(list.length>=2){ - player.addMark('dcyongbi_eff1',2,false); - player.addSkill('dcyongbi_eff1'); - target.addMark('dcyongbi_eff1',2,false); - target.addSkill('dcyongbi_eff1'); + if (list.length >= 2) { + player.addMark("dcyongbi_eff1", 2, false); + player.addSkill("dcyongbi_eff1"); + target.addMark("dcyongbi_eff1", 2, false); + target.addSkill("dcyongbi_eff1"); } - if(list.length>=3){ - player.addMark('dcyongbi_eff2',1,false); - player.addSkill('dcyongbi_eff2'); - target.addMark('dcyongbi_eff2',1,false); - target.addSkill('dcyongbi_eff2'); + if (list.length >= 3) { + player.addMark("dcyongbi_eff2", 1, false); + player.addSkill("dcyongbi_eff2"); + target.addMark("dcyongbi_eff2", 1, false); + target.addSkill("dcyongbi_eff2"); } }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(player.hasUnknown()) return 0; - var zhu=get.zhu(player); - if(zhu&&get.attitude(player,zhu)>0){ - if(target==zhu) return 4; + ai: { + order: 1, + result: { + target: function (player, target) { + if (player.hasUnknown()) return 0; + var zhu = get.zhu(player); + if (zhu && get.attitude(player, zhu) > 0) { + if (target == zhu) return 4; } return 1; }, }, }, - subSkill:{ - eff1:{ - mod:{ - maxHandcard:(player,num)=>num+player.countMark('dcyongbi_eff1'), + subSkill: { + eff1: { + mod: { + maxHandcard: (player, num) => num + player.countMark("dcyongbi_eff1"), }, - charlotte:true, - onremove:true, - marktext:'拥', - intro:{content:'手牌上限+#'}, + charlotte: true, + onremove: true, + marktext: "拥", + intro: { content: "手牌上限+#" }, }, - eff2:{ - trigger:{player:'damageBegin4'}, - forced:true, - filter:function(event,player){ - return event.num>1; + eff2: { + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return event.num > 1; }, - content:function(){ - trigger.num-=player.countMark('dcyongbi_eff2'); + content: function () { + trigger.num -= player.countMark("dcyongbi_eff2"); }, - charlotte:true, - onremove:true, - marktext:'嬖', - intro:{content:'受到大于1的伤害时,此伤害-#'}, + charlotte: true, + onremove: true, + marktext: "嬖", + intro: { content: "受到大于1的伤害时,此伤害-#" }, }, }, }, //吕旷吕翔 - dcshuhe:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + dcshuhe: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - position:'h', - discard:false, - lose:false, - delay:false, - check:function(cardx){ - var player=_status.event.player; - var num1=get.number(cardx),players=game.filterPlayer(); - var goon=false,effect=0; - for(var current of players){ - var cards=current.getCards('ej',function(card){ - var num=get.number(card); - return num==num1; + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + check: function (cardx) { + var player = _status.event.player; + var num1 = get.number(cardx), + players = game.filterPlayer(); + var goon = false, + effect = 0; + for (var current of players) { + var cards = current.getCards("ej", function (card) { + var num = get.number(card); + return num == num1; }); - if(cards.length){ - goon=true; - var att=get.attitude(player,current); - for(var card of cards){ - if(get.position(card)=='e'){ - var val=get.value(card,current); - if(att<=0) effect+=val; - else effect-=val/2; - } - else{ - var eff=get.effect(current,{name:card.viewAs||card.name},player,player); - effect-=get.sgn(att)*eff; + if (cards.length) { + goon = true; + var att = get.attitude(player, current); + for (var card of cards) { + if (get.position(card) == "e") { + var val = get.value(card, current); + if (att <= 0) effect += val; + else effect -= val / 2; + } else { + var eff = get.effect( + current, + { name: card.viewAs || card.name }, + player, + player + ); + effect -= get.sgn(att) * eff; } } } } - if(goon){ - if(effect>0) return 6+effect-get.value(cardx); + if (goon) { + if (effect > 0) return 6 + effect - get.value(cardx); return 0; } - return game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })?(6-get.value(cardx)):0; + return game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ? 6 - get.value(cardx) + : 0; }, - content:function(){ - 'step 0' - player.showCards(cards,get.translation(player)+'发动了【数合】'); - player.addMark('dcliehou',1); - 'step 1' - event.cards2=[]; - var num1=get.number(cards[0],player); - var lose_list=[],players=game.filterPlayer(); - for(var current of players){ - var cards=current.getCards('ej',function(card){ - var num=get.number(card); - return num==num1; + content: function () { + "step 0"; + player.showCards(cards, get.translation(player) + "发动了【数合】"); + player.addMark("dcliehou", 1); + ("step 1"); + event.cards2 = []; + var num1 = get.number(cards[0], player); + var lose_list = [], + players = game.filterPlayer(); + for (var current of players) { + var cards = current.getCards("ej", function (card) { + var num = get.number(card); + return num == num1; }); - if(cards.length>0){ - player.line(current,'thunder'); + if (cards.length > 0) { + player.line(current, "thunder"); current.$throw(cards); - lose_list.push([current,cards]); + lose_list.push([current, cards]); event.cards2.addArray(cards); } } - if(lose_list.length){ - event.lose_list=lose_list; + if (lose_list.length) { + event.lose_list = lose_list; game.loseAsync({ - lose_list:lose_list, - }).setContent('chooseToCompareLose'); - } - else{ + lose_list: lose_list, + }).setContent("chooseToCompareLose"); + } else { event.goto(3); - player.chooseTarget(true,lib.filter.notMe,'将'+get.translation(event.cards[0])+'交给一名其他角色').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); + player + .chooseTarget( + true, + lib.filter.notMe, + "将" + get.translation(event.cards[0]) + "交给一名其他角色" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); } - 'step 2' - var cards=event.cards2; - if(cards.length>0){ - if(event.lose_list) game.delayx(); - player.gain(cards,'gain2'); + ("step 2"); + var cards = event.cards2; + if (cards.length > 0) { + if (event.lose_list) game.delayx(); + player.gain(cards, "gain2"); } event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.give(cards,target); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.give(cards, target); } }, - ai:{ - order:2, - result:{ - player:1, + ai: { + order: 2, + result: { + player: 1, }, }, }, - dcliehou:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:function(event,player){ + dcliehou: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - var num=Math.min(5,1+player.countMark('dcliehou')); - trigger.num+=num; - trigger._dcliehou=num; + content: function () { + var num = Math.min(5, 1 + player.countMark("dcliehou")); + trigger.num += num; + trigger._dcliehou = num; }, - group:'dcliehou_discard', - subSkill:{ - discard:{ - trigger:{player:'phaseDrawEnd'}, - forced:true, - filter:function(event,player){ - return typeof event._dcliehou=='number'; + group: "dcliehou_discard", + subSkill: { + discard: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + filter: function (event, player) { + return typeof event._dcliehou == "number"; }, - content:function(){ - 'step 0' - var num=trigger._dcliehou; - player.chooseToDiscard(num,'he','弃置'+get.cnNumber(num)+'张牌,或失去1点体力').set('ai',function(card){ - if(_status.event.goon) return 6-get.value(card); - return 26-get.value(card); - }).set('goon',player.hp>Math.max(1,4-num)||get.effect(player,{name:'losehp'},player,player)>0); - 'step 1' - if(!result.bool) player.loseHp(); + content: function () { + "step 0"; + var num = trigger._dcliehou; + player + .chooseToDiscard( + num, + "he", + "弃置" + get.cnNumber(num) + "张牌,或失去1点体力" + ) + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 26 - get.value(card); + }) + .set( + "goon", + player.hp > Math.max(1, 4 - num) || + get.effect(player, { name: "losehp" }, player, player) > 0 + ); + ("step 1"); + if (!result.bool) player.loseHp(); }, }, }, - marktext:'爵', - intro:{ - name:'列侯(爵)', - name2:'爵', - content:'〖列侯〗的摸牌数+#', + marktext: "爵", + intro: { + name: "列侯(爵)", + name2: "爵", + content: "〖列侯〗的摸牌数+#", }, }, //管亥 - suoliang:{ - audio:2, - trigger:{source:'damageSource'}, - logTarget:'player', - usable:1, - filter:function(event,player){ - return event.player!=player&&event.player.maxHp>0&&event.player.countCards('he')>0; + suoliang: { + audio: 2, + trigger: { source: "damageSource" }, + logTarget: "player", + usable: 1, + filter: function (event, player) { + return ( + event.player != player && event.player.maxHp > 0 && event.player.countCards("he") > 0 + ); }, - check:function(event,player){ - return get.attitude(player,event.player)<=0; + check: function (event, player) { + return get.attitude(player, event.player) <= 0; }, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - player.choosePlayerCard(target,true,'he',[1,target.maxHp],'选择'+get.translation(target)+'的至多'+get.cnNumber(target.maxHp)+'张牌'); - 'step 1' - if(result.bool){ - player.showCards(result.cards,get.translation(player)+'对'+get.translation(target)+'发动了【索粮】') - var cards=result.cards.filter(function(card){ - var suit=get.suit(card,target); - if(suit!='heart'&&suit!='club') return false; - return lib.filter.canBeGained(card,target,player) + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + player.choosePlayerCard( + target, + true, + "he", + [1, target.maxHp], + "选择" + get.translation(target) + "的至多" + get.cnNumber(target.maxHp) + "张牌" + ); + ("step 1"); + if (result.bool) { + player.showCards( + result.cards, + get.translation(player) + "对" + get.translation(target) + "发动了【索粮】" + ); + var cards = result.cards.filter(function (card) { + var suit = get.suit(card, target); + if (suit != "heart" && suit != "club") return false; + return lib.filter.canBeGained(card, target, player); }); - if(cards.length) player.gain(cards,target,'giveAuto','bySelf'); - else{ - var cards=result.cards.filter(function(card){ - return lib.filter.canBeDiscarded(card,target,player) + if (cards.length) player.gain(cards, target, "giveAuto", "bySelf"); + else { + var cards = result.cards.filter(function (card) { + return lib.filter.canBeDiscarded(card, target, player); }); - if(cards.length) target.discard(cards,'notBySelf'); + if (cards.length) target.discard(cards, "notBySelf"); } } }, }, - qinbao:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return (event.card.name=='sha'||get.type(event.card,null,false)=='trick')&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>=player.countCards('h'); - }); + qinbao: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return ( + (event.card.name == "sha" || get.type(event.card, null, false) == "trick") && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") >= player.countCards("h"); + }) + ); }, - content:function(){ - var hs=player.countCards('h'); - trigger.directHit.addArray(game.filterPlayer(function(current){ - return current!=player&¤t.countCards('h')>=hs; - })); + content: function () { + var hs = player.countCards("h"); + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player && current.countCards("h") >= hs; + }) + ); }, - ai:{ - threaten:1.4, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return player.countCards('h',function(card){ - return !ui.selected.cards.includes(card); - })<=arg.target.countCards('h'); + ai: { + threaten: 1.4, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return ( + player.countCards("h", function (card) { + return !ui.selected.cards.includes(card); + }) <= arg.target.countCards("h") + ); }, }, }, //胡昭 - midu:{ - audio:2, - enable:'phaseUse', - usable:1, - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('弥笃:选择要废除或恢复的装备栏或判定区','hidden'); - dialog.classList.add('withbg'); - dialog.noforcebutton=true; - var list1=[],list2=[]; - for(var i=1;i<6;i++){ - for(var j=0;j0?get.translation('equip'+i)+'栏':'判定区')]); + (player.isDisabledJudge() ? list2 : list1).push(-1); + var addTable = function (list, bool) { + const adds = []; + for (var i of list) { + adds.push([ + [i, bool], + i > 0 ? get.translation("equip" + i) + "栏" : "判定区", + ]); } - dialog.add([adds,'tdnodes']) + dialog.add([adds, "tdnodes"]); + }; + if (list1.length) { + dialog.addText("未废除"); + addTable(list1, true); } - if(list1.length){ - dialog.addText('未废除'); - addTable(list1,true); - } - if(list2.length){ - dialog.addText('已废除'); - addTable(list2,false); + if (list2.length) { + dialog.addText("已废除"); + addTable(list2, false); } return dialog; }, - filter:function(button,player){ - if(!ui.selected.buttons.length) return true; - if(!ui.selected.buttons[0].link[1]) return false; - return button.link[1] + filter: function (button, player) { + if (!ui.selected.buttons.length) return true; + if (!ui.selected.buttons[0].link[1]) return false; + return button.link[1]; }, - check:function(button){ - var player=_status.event.player; - if(!button.link[1]){ - if(button.link[0]<=0) return -10; - if(player.hasCard(function(card){ - return get.subtype(card)==('equip'+button.link[0]); - },'hs')) return 15; + check: function (button) { + var player = _status.event.player; + if (!button.link[1]) { + if (button.link[0] <= 0) return -10; + if ( + player.hasCard(function (card) { + return get.subtype(card) == "equip" + button.link[0]; + }, "hs") + ) + return 15; return 10; } - if(button.link[0]<=0||player.hasEmptySlot(button.link[0])&&!player.hasCard(function(card){ - return get.subtype(card)==('equip'+button.link[0])&&player.canUse(card,player)&&get.effect(player,card,player,player)>0; - },'hs')) return 5; + if ( + button.link[0] <= 0 || + (player.hasEmptySlot(button.link[0]) && + !player.hasCard(function (card) { + return ( + get.subtype(card) == "equip" + button.link[0] && + player.canUse(card, player) && + get.effect(player, card, player, player) > 0 + ); + }, "hs")) + ) + return 5; return 0; }, - select:[1,Infinity], - backup:function(links,player){ - if(!links[0][1]){ + select: [1, Infinity], + backup: function (links, player) { + if (!links[0][1]) { return { - audio:'midu', - selectCard:-1, - selectTarget:-1, - filterCard:()=>false, - filterTarget:()=>false, - equip:links[0][0], - content:function(){ - var pos=lib.skill.midu_backup.equip; - if(pos<=0) player.enableJudge(); + audio: "midu", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + equip: links[0][0], + content: function () { + var pos = lib.skill.midu_backup.equip; + if (pos <= 0) player.enableJudge(); else player.enableEquip(pos); - player.addTempSkills('rehuomo',{player:'phaseBegin'}); + player.addTempSkills("rehuomo", { player: "phaseBegin" }); }, - } - } - else{ + }; + } else { return { - audio:'midu', - selectCard:-1, - filterCard:()=>false, - filterTarget:true, - equip:links.map(i=>i[0]).sort(), - content:function(){ - var list=lib.skill.midu_backup.equip,num=list.length,bool=false; - if(list.includes(-1)){ + audio: "midu", + selectCard: -1, + filterCard: () => false, + filterTarget: true, + equip: links.map((i) => i[0]).sort(), + content: function () { + var list = lib.skill.midu_backup.equip, + num = list.length, + bool = false; + if (list.includes(-1)) { list.remove(-1); - bool=true; + bool = true; } - if(list.length>0) player.disableEquip(list); - if(bool) player.disableJudge(); - target.draw(num) + if (list.length > 0) player.disableEquip(list); + if (bool) player.disableJudge(); + target.draw(num); }, - ai:{ - tag:{ - draw:1, + ai: { + tag: { + draw: 1, }, - result:{ - target:2, + result: { + target: 2, }, }, - } + }; } }, - prompt:function(links,player){ - if(!links[0][1]){ - return '恢复一个装备栏或判定区并获得〖活墨〗'; + prompt: function (links, player) { + if (!links[0][1]) { + return "恢复一个装备栏或判定区并获得〖活墨〗"; } - var numc=get.cnNumber(links.length); - return '废除'+numc+'个区域并令一名角色摸'+numc+'张牌'; + var numc = get.cnNumber(links.length); + return "废除" + numc + "个区域并令一名角色摸" + numc + "张牌"; }, }, - derivation:'rehuomo', - ai:{ - order:8, - result:{player:1}, + derivation: "rehuomo", + ai: { + order: 8, + result: { player: 1 }, }, - subSkill:{backup:{}}, + subSkill: { backup: {} }, }, - xianwang:{ - mod:{ - globalTo:function(source,player,distance){ - var num=player.countDisabledSlot(); - if(num>0) return distance+(num>2?2:1); + xianwang: { + mod: { + globalTo: function (source, player, distance) { + var num = player.countDisabledSlot(); + if (num > 0) return distance + (num > 2 ? 2 : 1); }, - globalFrom:function(source,player,distance){ - var num=source.countDisabledSlot(); - if(num>0) return distance-(num>2?2:1); + globalFrom: function (source, player, distance) { + var num = source.countDisabledSlot(); + if (num > 0) return distance - (num > 2 ? 2 : 1); }, }, }, //刘巴 - dczhubi:{ - audio:2, - trigger:{ - global:['loseAfter','loseAsyncAfter'], + dczhubi: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], }, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false) return false; - for(var i of event.cards){ - if(get.suit(i,event.player)=='diamond') return true; + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return false; + for (var i of event.cards) { + if (get.suit(i, event.player) == "diamond") return true; } return false; }, - prompt2:'检索一张【无中生有】并置于牌堆顶', - content:function(){ - var card=get.cardPile(function(card){ - return card.name=='wuzhong'&&get.suit(card)!='diamond'; + prompt2: "检索一张【无中生有】并置于牌堆顶", + content: function () { + var card = get.cardPile(function (card) { + return card.name == "wuzhong" && get.suit(card) != "diamond"; }); - if(card){ - game.log(player,'将',card,'置于牌堆顶'); + if (card) { + game.log(player, "将", card, "置于牌堆顶"); card.fix(); - ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); game.updateRoundNumber(); game.delayx(); } }, }, - dcliuzhuan:{ - audio:2, - group:['dcliuzhuan_mark','dcliuzhuan_gain'], - mod:{ - targetEnabled:function(card){ - if(card.cards){ - for(var i of card.cards){ - if(i.hasGaintag('dcliuzhuan_tag')) return false; + dcliuzhuan: { + audio: 2, + group: ["dcliuzhuan_mark", "dcliuzhuan_gain"], + mod: { + targetEnabled: function (card) { + if (card.cards) { + for (var i of card.cards) { + if (i.hasGaintag("dcliuzhuan_tag")) return false; } - } - else if(get.itemtype(card)=='card'){ - if(card.hasGaintag('dcliuzhuan_tag')) return false; + } else if (get.itemtype(card) == "card") { + if (card.hasGaintag("dcliuzhuan_tag")) return false; } }, }, - subSkill:{ - gain:{ - audio:'dcliuzhuan', - trigger:{global:['loseAfter','loseAsyncAfter','cardsDiscardAfter']}, - forced:true, - logTarget:()=>_status.currentPhase, - filter:function(event,player){ - var current=_status.currentPhase; - if(!current) return false; - if(event.name=='cardsDiscard'){ - var evtx=event.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evtx2=(evtx.relatedEvent||evtx.getParent()); - return current.hasHistory('lose',function(evtx3){ - var evtx4=evtx3.relatedEvent||evtx3.getParent(); - if(evtx2!=evtx4) return false; - for(var i in evtx3.gaintag_map){ - if(evtx3.gaintag_map[i].includes('dcliuzhuan_tag')) return true; + subSkill: { + gain: { + audio: "dcliuzhuan", + trigger: { global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter"] }, + forced: true, + logTarget: () => _status.currentPhase, + filter: function (event, player) { + var current = _status.currentPhase; + if (!current) return false; + if (event.name == "cardsDiscard") { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + return current.hasHistory("lose", function (evtx3) { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + for (var i in evtx3.gaintag_map) { + if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true; } }); //return false; - } - else if(event.name=='lose'){ - if(event.player!=current||event.position!=ui.discardPile) return false; - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('dcliuzhuan_tag')) return true; + } else if (event.name == "lose") { + if (event.player != current || event.position != ui.discardPile) return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcliuzhuan_tag")) return true; } return false; } - return current.hasHistory('lose',function(evt){ - if(evt.getParent()!=event||evt.position!=ui.discardPile) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dcliuzhuan_tag')) return true; + return current.hasHistory("lose", function (evt) { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcliuzhuan_tag")) return true; } }); }, - content:function(){ - var cards,current=_status.currentPhase; - if(trigger.name=='lose') cards=trigger.hs.filter(function(i){ - return trigger.gaintag_map[i.cardid]&&trigger.gaintag_map[i.cardid].includes('dcliuzhuan_tag')&&get.position(i,true)=='d'; - }); - else if(trigger.name=='cardsDiscard'){ - var evtx=trigger.getParent(); - var evtx2=(evtx.relatedEvent||evtx.getParent()); - var bool=false; - var history=current.getHistory('lose',function(evtx3){ - var evtx4=evtx3.relatedEvent||evtx3.getParent(); - if(evtx2!=evtx4) return false; - for(var i in evtx3.gaintag_map){ - if(evtx3.gaintag_map[i].includes('dcliuzhuan_tag')) return true; + content: function () { + var cards, + current = _status.currentPhase; + if (trigger.name == "lose") + cards = trigger.hs.filter(function (i) { + return ( + trigger.gaintag_map[i.cardid] && + trigger.gaintag_map[i.cardid].includes("dcliuzhuan_tag") && + get.position(i, true) == "d" + ); + }); + else if (trigger.name == "cardsDiscard") { + var evtx = trigger.getParent(); + var evtx2 = evtx.relatedEvent || evtx.getParent(); + var bool = false; + var history = current.getHistory("lose", function (evtx3) { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + for (var i in evtx3.gaintag_map) { + if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true; } }); - cards=trigger.cards.filter(function(i){ - for(var evt of history){ - if(evt.gaintag_map[i.cardid]&&evt.gaintag_map[i.cardid].includes('dcliuzhuan_tag')&&get.position(i,true)=='d') return true; + cards = trigger.cards.filter(function (i) { + for (var evt of history) { + if ( + evt.gaintag_map[i.cardid] && + evt.gaintag_map[i.cardid].includes("dcliuzhuan_tag") && + get.position(i, true) == "d" + ) + return true; } return false; }); - } - else{ - cards=[]; - current.getHistory('lose',function(evt){ - if(evt.getParent()!=trigger||evt.position!=ui.discardPile) return false; - for(var card of evt.hs){ - if(get.position(card,true)!='d') continue; - var i=card.cardid; - if(evt.gaintag_map[i]&&evt.gaintag_map[i].includes('dcliuzhuan_tag')) cards.push(card); + } else { + cards = []; + current.getHistory("lose", function (evt) { + if (evt.getParent() != trigger || evt.position != ui.discardPile) + return false; + for (var card of evt.hs) { + if (get.position(card, true) != "d") continue; + var i = card.cardid; + if ( + evt.gaintag_map[i] && + evt.gaintag_map[i].includes("dcliuzhuan_tag") + ) + cards.push(card); } }); } - if(cards&&cards.length>0) player.gain(cards,'gain2'); + if (cards && cards.length > 0) player.gain(cards, "gain2"); }, }, - mark:{ - trigger:{global:'gainBegin'}, - forced:true, - popup:false, - silent:true, - lastDo:true, - filter:function(event,player){ - if(player==event.player||event.player!=_status.currentPhase) return false; - var evt=event.getParent('phaseDraw'); - if(evt&&evt.name=='phaseDraw') return false; + mark: { + trigger: { global: "gainBegin" }, + forced: true, + popup: false, + silent: true, + lastDo: true, + filter: function (event, player) { + if (player == event.player || event.player != _status.currentPhase) return false; + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; return true; }, - content:function(){ - trigger.gaintag.add('dcliuzhuan_tag'); - trigger.player.addTempSkill('dcliuzhuan_tag'); + content: function () { + trigger.gaintag.add("dcliuzhuan_tag"); + trigger.player.addTempSkill("dcliuzhuan_tag"); }, }, - tag:{ - charlotte:true, - onremove:(player,skill)=>player.removeGaintag(skill), + tag: { + charlotte: true, + onremove: (player, skill) => player.removeGaintag(skill), }, }, }, //张勋 - suizheng:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('suizheng'),'令一名角色下回合内获得〖随征〗效果').set('',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasJudge('lebu')) return att/2; - return att*get.threaten(target)*Math.sqrt(2+player==target?(player.countCards('h','sha')*2):target.countCards('h')) - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('suizheng',target); - target.addMark('suizheng_effect',1,false); - target.markAuto('suizheng_source',[player]); - target.addTempSkill('suizheng_effect',{player:player==target?'phaseJieshuBefore':'phaseAfter'}); + suizheng: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("suizheng"), "令一名角色下回合内获得〖随征〗效果") + .set("", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasJudge("lebu")) return att / 2; + return ( + att * + get.threaten(target) * + Math.sqrt( + 2 + player == target + ? player.countCards("h", "sha") * 2 + : target.countCards("h") + ) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("suizheng", target); + target.addMark("suizheng_effect", 1, false); + target.markAuto("suizheng_source", [player]); + target.addTempSkill("suizheng_effect", { + player: player == target ? "phaseJieshuBefore" : "phaseAfter", + }); } }, - subSkill:{ - effect:{ - audio:'suizheng', - charlotte:true, - mod:{ - targetInRange:function(card){ - if(card.name=='sha') return true; + subSkill: { + effect: { + audio: "suizheng", + charlotte: true, + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('suizheng_effect'); + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("suizheng_effect"); }, }, - trigger:{player:'phaseUseEnd'}, - forced:true, - popup:false, - filter:function(event,player){ - var list=player.getStorage('suizheng_source'); - if(!list.filter((i)=>i.isIn().length)) return false; - return player.hasHistory('sourceDamage',function(evt){ - return evt.player.isIn()&&evt.getParent('phaseUse')==event; + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + var list = player.getStorage("suizheng_source"); + if (!list.filter((i) => i.isIn().length)) return false; + return player.hasHistory("sourceDamage", function (evt) { + return evt.player.isIn() && evt.getParent("phaseUse") == event; }); }, - content:function(){ - 'step 0' - var targets=player.getStorage('suizheng_source').slice(0).sortBySeat(); - event.targets=targets; - 'step 1' - var target=targets.shift(); - event.target=target; - var list=[]; - player.getHistory('sourceDamage',function(evt){ - if(evt.player.isIn()&&evt.getParent('phaseUse')==trigger) list.add(evt.player); + content: function () { + "step 0"; + var targets = player.getStorage("suizheng_source").slice(0).sortBySeat(); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + event.target = target; + var list = []; + player.getHistory("sourceDamage", function (evt) { + if (evt.player.isIn() && evt.getParent("phaseUse") == trigger) + list.add(evt.player); }); - if(!list.length) event.finish(); - else if(target.isIn()){ - list=list.filter(function(i){ - return target.canUse('sha',i,false); - }); - if(list.length>0) target.chooseTarget('随征:是否对一名角色使用【杀】?',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('targets',list).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); + if (!list.length) event.finish(); + else if (target.isIn()) { + list = list.filter(function (i) { + return target.canUse("sha", i, false); }); + if (list.length > 0) + target + .chooseTarget( + "随征:是否对一名角色使用【杀】?", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("targets", list) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + } else event._result = { bool: false }; + ("step 2"); + if (result.bool) { + target.useCard( + { + name: "sha", + isCard: true, + }, + result.targets, + false, + "suizheng_effect" + ); } - else event._result={bool:false}; - 'step 2' - if(result.bool){ - target.useCard({ - name:'sha', - isCard:true, - },result.targets,false,'suizheng_effect'); - } - if(targets.length>0) event.goto(1); + if (targets.length > 0) event.goto(1); }, - onremove:function(player){ + onremove: function (player) { delete player.storage.suizheng_effect; delete player.storage.suizheng_source; }, - intro:{content:'使用【杀】无距离限制且次数上限+#'}, + intro: { content: "使用【杀】无距离限制且次数上限+#" }, }, }, }, //纪灵 - dcshuangren:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - preHidden:true, - filter:function(event,player){ - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&&player.canCompare(current); - }) + dcshuangren: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + preHidden: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; var goon; - if(player.needsToDiscard()>1){ - goon=player.hasCard(function(card){ - return card.number>10&&get.value(card)<=5; + if (player.needsToDiscard() > 1) { + goon = player.hasCard(function (card) { + return card.number > 10 && get.value(card) <= 5; + }); + } else if (player.hasSha()) { + goon = player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }); + } else { + goon = player.hasCard(function (card) { + return get.value(card) <= 5; }); } - else if(player.hasSha()){ - goon=player.hasCard(function(card){ - return (card.number>=9&&get.value(card)<=5)||get.value(card)<=3; - }); - } - else{ - goon=player.hasCard(function(card){ - return get.value(card)<=5; - }); - } - player.chooseTarget(get.prompt2('dcshuangren'),function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - var player=_status.event.player; - if(_status.event.goon&&get.attitude(player,target)<0){ - return get.effect(target,{name:'sha'},player,player); - } - return 0; - }).set('goon',goon).setHiddenSkill(event.name); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('dcshuangren',target); + player + .chooseTarget(get.prompt2("dcshuangren"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.goon && get.attitude(player, target) < 0) { + return get.effect(target, { name: "sha" }, player, player); + } + return 0; + }) + .set("goon", goon) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcshuangren", target); player.chooseToCompare(target); - } - else{ + } else { event.finish(); } - 'step 2' - if(result.bool){ - var target=event.target; - if(game.hasPlayer(function(current){ - if(target==current||target.group!=current.group) return false; - return player.canUse('sha',current,false); - })){ - var str='请选择视为使用【杀】的目标'; - var str2='操作提示:选择一名角色B,或选择包含A('+get.translation(target)+')在内的两名角色A和B(B的势力需为'+get.translation(target.group)+'势力)'; - player.chooseTarget([1,2],str,str2,true,function(card,player,target){ - if(!player.canUse('sha',target,false)) return false; - var current=_status.event.target; - if(target==current) return true; - if(target.group!=current.group) return false; - if(!ui.selected.targets.length) return true; - return ui.selected.targets[0]==current; - //return current==target; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); - }).set('target',target).set('complexTarget',true); - } - else{ - player.useCard({name:'sha',isCard:true},target,false); + ("step 2"); + if (result.bool) { + var target = event.target; + if ( + game.hasPlayer(function (current) { + if (target == current || target.group != current.group) return false; + return player.canUse("sha", current, false); + }) + ) { + var str = "请选择视为使用【杀】的目标"; + var str2 = + "操作提示:选择一名角色B,或选择包含A(" + + get.translation(target) + + ")在内的两名角色A和B(B的势力需为" + + get.translation(target.group) + + "势力)"; + player + .chooseTarget([1, 2], str, str2, true, function (card, player, target) { + if (!player.canUse("sha", target, false)) return false; + var current = _status.event.target; + if (target == current) return true; + if (target.group != current.group) return false; + if (!ui.selected.targets.length) return true; + return ui.selected.targets[0] == current; + //return current==target; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("target", target) + .set("complexTarget", true); + } else { + player.useCard({ name: "sha", isCard: true }, target, false); event.finish(); } - } - else{ - player.addTempSkill('dcshuangren_debuff','phaseUseAfter'); + } else { + player.addTempSkill("dcshuangren_debuff", "phaseUseAfter"); event.finish(); } - 'step 3' - if(result.bool&&result.targets&&result.targets.length){ - player.useCard({name:'sha',isCard:true},result.targets,false); + ("step 3"); + if (result.bool && result.targets && result.targets.length) { + player.useCard({ name: "sha", isCard: true }, result.targets, false); } }, - subSkill:{ - debuff:{ - charlotte:true, - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + subSkill: { + debuff: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, }, }, }, }, //羊祜 - dcdeshao:{ - audio:2, - usable:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return player!=event.player&&get.color(event.card)=='black'; + dcdeshao: { + audio: 2, + usable: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return player != event.player && get.color(event.card) == "black"; }, - logTarget:'player', - check:function(event,player){ - var eff=get.effect(player,{name:'draw'},player,player); - if(player.countCards('h')+1<=event.player.countCards('h')&&event.player.countCards('he')>0) eff+=get.effect(event.player,{name:'guohe_copy2'},player,player); + logTarget: "player", + check: function (event, player) { + var eff = get.effect(player, { name: "draw" }, player, player); + if ( + player.countCards("h") + 1 <= event.player.countCards("h") && + event.player.countCards("he") > 0 + ) + eff += get.effect(event.player, { name: "guohe_copy2" }, player, player); return eff; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - var target=trigger.player; - if(player.countCards('h')<=target.countCards('h')&&target.countCards('he')>0){ - player.discardPlayerCard(target,true,'he'); + ("step 1"); + var target = trigger.player; + if (player.countCards("h") <= target.countCards("h") && target.countCards("he") > 0) { + player.discardPlayerCard(target, true, "he"); player.addExpose(0.2); } }, }, - dcmingfa:{ - audio:2, - trigger:{player:'useCardAfter'}, - direct:true, - filter:function(event,player){ - return player.isPhaseUsing()&&(event.card.name=='sha'||get.type(event.card)=='trick')&&event.cards.filterInD().length>0&&!player.getExpansions('dcmingfa').length; + dcmingfa: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + return ( + player.isPhaseUsing() && + (event.card.name == "sha" || get.type(event.card) == "trick") && + event.cards.filterInD().length > 0 && + !player.getExpansions("dcmingfa").length + ); }, - content:function(){ - 'step 0' - var str,cards=trigger.cards.filterInD(),card=trigger.card; - if(cards.length==1&&card.name==cards[0].name&&(card.nature||false)==(cards[0].nature||false)) str=get.translation(cards[0]); - else str=(get.translation(trigger.card)+'('+get.translation(cards)+')'); - var cardx={ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, + content: function () { + "step 0"; + var str, + cards = trigger.cards.filterInD(), + card = trigger.card; + if ( + cards.length == 1 && + card.name == cards[0].name && + (card.nature || false) == (cards[0].nature || false) + ) + str = get.translation(cards[0]); + else str = get.translation(trigger.card) + "(" + get.translation(cards) + ")"; + var cardx = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, }; - player.chooseTarget(lib.filter.notMe,get.prompt('dcmingfa'),'将'+str+'作为“明伐”牌置于武将牌上,并选择一名其他角色。该角色下回合结束时对其执行〖明伐〗的后续效果。').set('card',cardx).set('goon',function(){ - var getMax=function(card){ - return Math.max.apply(Math,game.filterPlayer(function(current){ - return current!=player&&lib.filter.targetEnabled2(card,player,current); - }).map(function(i){ - return get.effect(i,card,player,player)*Math.sqrt(Math.min(i.getHandcardLimit(),1+i.countCards('h'))); - }).concat([0])); - } - var eff1=getMax(cardx); - if(player.hasCard(function(card){ - if((card.name!='sha'&&get.type(card)!='trick')||!player.hasValueTarget(card,null,true)) return false; - return getMax({ - name:get.name(card), - nature:get.nature(card), - isCard:true, - })>=eff1; - },'hs')) return false; - return true; - }()).set('ai',function(target){ - if(!_status.event.goon) return 0; - var player=_status.event.player,card=_status.event.card; - if(!lib.filter.targetEnabled2(card,player,target)) return 0; - return get.effect(target,card,player,player)*Math.sqrt(Math.min(target.getHandcardLimit(),1+target.countCards('h'))); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcmingfa',target); - var card={ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, + player + .chooseTarget( + lib.filter.notMe, + get.prompt("dcmingfa"), + "将" + + str + + "作为“明伐”牌置于武将牌上,并选择一名其他角色。该角色下回合结束时对其执行〖明伐〗的后续效果。" + ) + .set("card", cardx) + .set( + "goon", + (function () { + var getMax = function (card) { + return Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return ( + current != player && + lib.filter.targetEnabled2(card, player, current) + ); + }) + .map(function (i) { + return ( + get.effect(i, card, player, player) * + Math.sqrt( + Math.min(i.getHandcardLimit(), 1 + i.countCards("h")) + ) + ); + }) + .concat([0]) + ); + }; + var eff1 = getMax(cardx); + if ( + player.hasCard(function (card) { + if ( + (card.name != "sha" && get.type(card) != "trick") || + !player.hasValueTarget(card, null, true) + ) + return false; + return ( + getMax({ + name: get.name(card), + nature: get.nature(card), + isCard: true, + }) >= eff1 + ); + }, "hs") + ) + return false; + return true; + })() + ) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var player = _status.event.player, + card = _status.event.card; + if (!lib.filter.targetEnabled2(card, player, target)) return 0; + return ( + get.effect(target, card, player, player) * + Math.sqrt(Math.min(target.getHandcardLimit(), 1 + target.countCards("h"))) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcmingfa", target); + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, }; - player.storage.dcmingfa_info=[card,target]; - player.addToExpansion(trigger.cards.filterInD(),'gain2').gaintag.add('dcmingfa'); + player.storage.dcmingfa_info = [card, target]; + player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("dcmingfa"); } }, - group:'dcmingfa_use', - ai:{expose:0.2}, - intro:{ - mark:function(dialog,storage,player){ - var cards=player.getExpansions('dcmingfa'); - if(!cards.length) return '没有“明伐”牌'; + group: "dcmingfa_use", + ai: { expose: 0.2 }, + intro: { + mark: function (dialog, storage, player) { + var cards = player.getExpansions("dcmingfa"); + if (!cards.length) return "没有“明伐”牌"; else dialog.add(cards); - var info=player.storage.dcmingfa_info; - if(info){ - dialog.addText('记录牌:'+get.translation(info[0])+'
    记录目标:'+get.translation(info[1])); + var info = player.storage.dcmingfa_info; + if (info) { + dialog.addText( + "记录牌:" + + get.translation(info[0]) + + "
    记录目标:" + + get.translation(info[1]) + ); } }, - content:'expansion', + content: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); delete player.storage.dcmingfa_info; }, - subSkill:{ - use:{ - audio:'dcmingfa', - trigger:{global:['phaseEnd','die']}, - forced:true, - filter:function(event,player){ - if(!player.storage.dcmingfa_info||!player.getExpansions('dcmingfa').length) return false; - return event.player==player.storage.dcmingfa_info[1]; + subSkill: { + use: { + audio: "dcmingfa", + trigger: { global: ["phaseEnd", "die"] }, + forced: true, + filter: function (event, player) { + if (!player.storage.dcmingfa_info || !player.getExpansions("dcmingfa").length) + return false; + return event.player == player.storage.dcmingfa_info[1]; }, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - var card=player.storage.dcmingfa_info[0]; + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var card = player.storage.dcmingfa_info[0]; delete player.storage.dcmingfa_info; - event.card=card; - event.count=Math.max(1,Math.min(5,target.countCards('h'))); - if(!event.player.isIn()) event.goto(2); - 'step 1' + event.card = card; + event.count = Math.max(1, Math.min(5, target.countCards("h"))); + if (!event.player.isIn()) event.goto(2); + ("step 1"); event.count--; - if(target.isIn()&&lib.filter.targetEnabled2(card,player,target)){ - player.useCard(get.copy(card),target); - if(event.count>0) event.redo(); + if (target.isIn() && lib.filter.targetEnabled2(card, player, target)) { + player.useCard(get.copy(card), target); + if (event.count > 0) event.redo(); } - 'step 2' - var cards=player.getExpansions('dcmingfa'); - if(cards.length>0) player.loseToDiscardpile(cards); + ("step 2"); + var cards = player.getExpansions("dcmingfa"); + if (cards.length > 0) player.loseToDiscardpile(cards); }, }, }, }, //蔡瑁张允 - lianzhou:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - if(!player.isLinked()) return true; - return game.hasPlayer(function(current){ - return current!=player&¤t.hp==player.hp&&!current.isLinked(); + lianzhou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!player.isLinked()) return true; + return game.hasPlayer(function (current) { + return current != player && current.hp == player.hp && !current.isLinked(); }); }, - content:function(){ - 'step 0' - if(!player.isLinked()) player.link(); - 'step 1' - var num=game.countPlayer(function(current){ - return current!=player&¤t.hp==player.hp&&!current.isLinked(); + content: function () { + "step 0"; + if (!player.isLinked()) player.link(); + ("step 1"); + var num = game.countPlayer(function (current) { + return current != player && current.hp == player.hp && !current.isLinked(); }); - if(num>0){ - player.chooseTarget([1,num],'选择横置任意名体力值等于你的角色',function(card,player,current){ - return current!=player&¤t.hp==player.hp&&!current.isLinked(); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'tiesuo'},player,player); - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.line(targets,'green'); - for(var i of targets) i.link(); + if (num > 0) { + player + .chooseTarget( + [1, num], + "选择横置任意名体力值等于你的角色", + function (card, player, current) { + return ( + current != player && current.hp == player.hp && !current.isLinked() + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "tiesuo" }, player, player); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var i of targets) i.link(); } }, - ai:{halfneg:true}, + ai: { halfneg: true }, }, - jinglan:{ - audio:2, - trigger:{source:'damageSource'}, - forced:true, - content:function(){ - var delta=player.countCards('h')-player.hp; - if(delta>0) player.chooseToDiscard('h',4,true); - else if(delta==0){ - player.chooseToDiscard('h',true); + jinglan: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + content: function () { + var delta = player.countCards("h") - player.hp; + if (delta > 0) player.chooseToDiscard("h", 4, true); + else if (delta == 0) { + player.chooseToDiscard("h", true); player.recover(); - } - else{ - player.damage('fire','nosource'); + } else { + player.damage("fire", "nosource"); player.draw(5); } }, - ai:{halfneg:true}, + ai: { halfneg: true }, }, //滕公主 - xingchong:{ - audio:2, - trigger:{global:'roundStart'}, - direct:true, - filter:function(event,player){ - return player.maxHp>0; + xingchong: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + filter: function (event, player) { + return player.maxHp > 0; }, - content:function(){ - 'step 0' - var list=[]; - for(var i=0;i<=Math.min(5,player.maxHp);i++){ - list.push(get.cnNumber(i)+'张'); + content: function () { + "step 0"; + var list = []; + for (var i = 0; i <= Math.min(5, player.maxHp); i++) { + list.push(get.cnNumber(i) + "张"); } - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt('xingchong')).set('prompt2','请首先选择摸牌的张数').set('ai',function(){ - var player=_status.event.player,num1=player.maxHp,num2=player.countCards('h'); - if(num1<=num2) return 0; - return Math.ceil((num1-num2)/2); - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('xingchong'); - var num2=result.index; - if(num2>0) player.draw(num2); - var num=Math.min(5,player.maxHp)-num2; - if(num==0) event.finish(); - else event.num=num; - } - else event.finish(); - 'step 2' - if(player.countCards('h')>0){ - player.chooseCard('h',[1,Math.min(player.countCards('h'),event.num)],'请选择要展示的牌').set('ai',()=>1+Math.random()); - } - else event.finish(); - 'step 3' - if(result.bool){ - var cards=result.cards; - player.showCards(cards,get.translation(player)+'发动了【幸宠】'); - player.addGaintag(cards,'xingchong'); - player.addTempSkill('xingchong_effect','roundStart'); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("xingchong")) + .set("prompt2", "请首先选择摸牌的张数") + .set("ai", function () { + var player = _status.event.player, + num1 = player.maxHp, + num2 = player.countCards("h"); + if (num1 <= num2) return 0; + return Math.ceil((num1 - num2) / 2); + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("xingchong"); + var num2 = result.index; + if (num2 > 0) player.draw(num2); + var num = Math.min(5, player.maxHp) - num2; + if (num == 0) event.finish(); + else event.num = num; + } else event.finish(); + ("step 2"); + if (player.countCards("h") > 0) { + player + .chooseCard( + "h", + [1, Math.min(player.countCards("h"), event.num)], + "请选择要展示的牌" + ) + .set("ai", () => 1 + Math.random()); + } else event.finish(); + ("step 3"); + if (result.bool) { + var cards = result.cards; + player.showCards(cards, get.translation(player) + "发动了【幸宠】"); + player.addGaintag(cards, "xingchong"); + player.addTempSkill("xingchong_effect", "roundStart"); } }, - subSkill:{ - effect:{ - audio:'xingchong', - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + effect: { + audio: "xingchong", + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var evt=event.getl(player); - if(!evt||!evt.cards2||!evt.cards2.length) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('xingchong')) return true; + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("xingchong")) return true; } return false; } - return player.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('xingchong')) return true; + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("xingchong")) return true; } return false; }); }, - forced:true, - popup:false, - charlotte:true, - onremove:function(player){ - player.removeGaintag('xingchong'); + forced: true, + popup: false, + charlotte: true, + onremove: function (player) { + player.removeGaintag("xingchong"); }, - content:function(){ - 'step 0' - if(trigger.delay===false) game.delayx(); - 'step 1' - player.logSkill('xingchong_effect'); - var num=0; - if(trigger.name=='lose'){ - for(var i in trigger.gaintag_map){ - if(trigger.gaintag_map[i].includes('xingchong')) num++; + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + ("step 1"); + player.logSkill("xingchong_effect"); + var num = 0; + if (trigger.name == "lose") { + for (var i in trigger.gaintag_map) { + if (trigger.gaintag_map[i].includes("xingchong")) num++; } - } - else player.getHistory('lose',function(evt){ - if(trigger!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('xingchong')) num++; - } - }); - player.draw(2*num); + } else + player.getHistory("lose", function (evt) { + if (trigger != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("xingchong")) num++; + } + }); + player.draw(2 * num); }, }, }, }, - liunian:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return game.hasGlobalHistory('cardMove',function(evt){ - return evt.washCard&&(evt.shuffleNumber==1||evt.shuffleNumber==2); + liunian: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return game.hasGlobalHistory("cardMove", function (evt) { + return evt.washCard && (evt.shuffleNumber == 1 || evt.shuffleNumber == 2); }); }, - content:function(){ - 'step 0' - if(game.hasGlobalHistory('cardMove',function(evt){ - return evt.washCard&&evt.shuffleNumber==1; - })){ + content: function () { + "step 0"; + if ( + game.hasGlobalHistory("cardMove", function (evt) { + return evt.washCard && evt.shuffleNumber == 1; + }) + ) { player.gainMaxHp(); game.delayx(); } - 'step 1' - if(game.hasGlobalHistory('cardMove',function(evt){ - return evt.washCard&&evt.shuffleNumber==2; - })){ + ("step 1"); + if ( + game.hasGlobalHistory("cardMove", function (evt) { + return evt.washCard && evt.shuffleNumber == 2; + }) + ) { player.recover(); game.delayx(); - } - else event.finish(); - 'step 2' - player.addSkill('liunian_effect'); - player.addMark('liunian_effect',10,false); + } else event.finish(); + ("step 2"); + player.addSkill("liunian_effect"); + player.addMark("liunian_effect", 10, false); }, - subSkill:{ - effect:{ - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('liunian_effect'); + subSkill: { + effect: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("liunian_effect"); }, }, - marktext:'年', - intro:{ - content:'手牌上限+#', + marktext: "年", + intro: { + content: "手牌上限+#", }, }, }, }, //黄承彦 - dcjiezhen:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player; + dcjiezhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; }, - content:function(){ - var skills=target.getSkills(null,false,false).filter(function(i){ - if(i=='bazhen') return; - var info=get.info(i); - return info&&!get.is.locked(i)&&!info.limited&&!info.juexingji&&!info.zhuSkill&&!info.charlotte; + content: function () { + var skills = target.getSkills(null, false, false).filter(function (i) { + if (i == "bazhen") return; + var info = get.info(i); + return ( + info && + !get.is.locked(i) && + !info.limited && + !info.juexingji && + !info.zhuSkill && + !info.charlotte + ); }); - target.addAdditionalSkills('dcjiezhen_blocker','bazhen'); - target.addSkill('dcjiezhen_blocker'); - target.markAuto('dcjiezhen_blocker',skills); - player.addSkill('dcjiezhen_clear'); - player.markAuto('dcjiezhen_clear',[target]); + target.addAdditionalSkills("dcjiezhen_blocker", "bazhen"); + target.addSkill("dcjiezhen_blocker"); + target.markAuto("dcjiezhen_blocker", skills); + player.addSkill("dcjiezhen_clear"); + player.markAuto("dcjiezhen_clear", [target]); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var skills=target.getSkills(null,false,false).filter(function(i){ - if(i=='bazhen') return; - var info=get.info(i); - return info&&!get.is.locked(i)&&!info.limited&&!info.juexingji&&!info.zhuSkill&&!info.charlotte; + ai: { + order: 1, + result: { + target: function (player, target) { + var skills = target.getSkills(null, false, false).filter(function (i) { + if (i == "bazhen") return; + var info = get.info(i); + return ( + info && + !get.is.locked(i) && + !info.limited && + !info.juexingji && + !info.zhuSkill && + !info.charlotte + ); }); - if(!skills.length&&target.hasEmptySlot(2)) return 1; - return -0.5*skills.length; + if (!skills.length && target.hasEmptySlot(2)) return 1; + return -0.5 * skills.length; }, }, }, - subSkill:{ - blocker:{ - init:function(player,skill){ + subSkill: { + blocker: { + init: function (player, skill) { player.addSkillBlocker(skill); }, - onremove:function(player,skill){ + onremove: function (player, skill) { player.removeSkillBlocker(skill); player.removeAdditionalSkill(skill); delete player.storage.dcjiezhen_blocker; }, - charlotte:true, - locked:true, - skillBlocker:function(skill,player){ - return skill!='bazhen'&&skill!='dcjiezhen_blocker'&&!lib.skill[skill].charlotte&&player.getStorage('dcjiezhen_blocker').includes(skill); + charlotte: true, + locked: true, + skillBlocker: function (skill, player) { + return ( + skill != "bazhen" && + skill != "dcjiezhen_blocker" && + !lib.skill[skill].charlotte && + player.getStorage("dcjiezhen_blocker").includes(skill) + ); + }, + mark: true, + marktext: "阵", + intro: { + markcount: () => 0, + content: function (storage, player, skill) { + if (storage.length) return "失效技能:" + get.translation(storage); + return "无失效技能"; + }, }, - mark:true, - marktext:'阵', - intro:{ - markcount:()=>0, - content:function(storage,player,skill){ - if(storage.length) return '失效技能:'+get.translation(storage); - return '无失效技能'; - } - } }, - clear:{ - audio:'dcjiezhen', - charlotte:true, - trigger:{ - global:['judgeAfter','die'], - player:'phaseBegin', + clear: { + audio: "dcjiezhen", + charlotte: true, + trigger: { + global: ["judgeAfter", "die"], + player: "phaseBegin", }, - forced:true, - forceDie:true, - onremove:true, - filter:function(event,player){ - if(event.name=='die'){ - return player==event.player||player.getStorage('dcjiezhen_clear').includes(event.player); + forced: true, + forceDie: true, + onremove: true, + filter: function (event, player) { + if (event.name == "die") { + return ( + player == event.player || + player.getStorage("dcjiezhen_clear").includes(event.player) + ); + } else if (event.name == "judge") { + return ( + event.skill == "bagua" && + player.getStorage("dcjiezhen_clear").includes(event.player) + ); } - else if(event.name=='judge'){ - return event.skill=='bagua'&&player.getStorage('dcjiezhen_clear').includes(event.player); - } - return player.getStorage('dcjiezhen_clear').length>0; + return player.getStorage("dcjiezhen_clear").length > 0; }, - logTarget:function(event,player){ - if(event.name!='phase') return event.player; - return player.getStorage('dcjiezhen_clear'); + logTarget: function (event, player) { + if (event.name != "phase") return event.player; + return player.getStorage("dcjiezhen_clear"); }, - content:function(){ - 'step 0' - var targets=player.getStorage('dcjiezhen_clear'); - if(trigger.name=='die'&&player==trigger.player){ - for(var target of targets){ - target.removeSkill('dcjiezhen_blocker'); + content: function () { + "step 0"; + var targets = player.getStorage("dcjiezhen_clear"); + if (trigger.name == "die" && player == trigger.player) { + for (var target of targets) { + target.removeSkill("dcjiezhen_blocker"); } - player.removeSkill('dcjiezhen_clear'); + player.removeSkill("dcjiezhen_clear"); event.finish(); return; } - if(trigger.name=='phase') event.targets=targets.slice(0).sortBySeat(); - else event.targets=[trigger.player]; - 'step 1' - var target=targets.shift(); - var storage=player.getStorage('dcjiezhen_clear'); - if(storage.includes(target)){ + if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat(); + else event.targets = [trigger.player]; + ("step 1"); + var target = targets.shift(); + var storage = player.getStorage("dcjiezhen_clear"); + if (storage.includes(target)) { storage.remove(target); - target.removeSkill('dcjiezhen_blocker'); - if(target.isIn()&&target.countGainableCards(player,'hej')>0) player.gainPlayerCard(target,'hej',true); + target.removeSkill("dcjiezhen_blocker"); + if (target.isIn() && target.countGainableCards(player, "hej") > 0) + player.gainPlayerCard(target, "hej", true); } - if(targets.length>0){ + if (targets.length > 0) { event.redo(); - } - else{ - player.removeSkill('dcjiezhen_clear'); + } else { + player.removeSkill("dcjiezhen_clear"); } }, }, }, - derivation:'bazhen', + derivation: "bazhen", }, - dczecai:{ - audio:2, - trigger:{global:'roundStart'}, - limited:true, - skillAnimation:true, - direct:true, - animationColor:'soil', - filter:function(event,player){ - return game.roundNumber>1; + dczecai: { + audio: 2, + trigger: { global: "roundStart" }, + limited: true, + skillAnimation: true, + direct: true, + animationColor: "soil", + filter: function (event, player) { + return game.roundNumber > 1; }, - getMax:function(){ - var getNum=function(current){ - var history=current.actionHistory; - var num=0; - for(var i=history.length-2;i>=0;i--){ - for(var j=0;j= 0; i--) { + for (var j = 0; j < history[i].useCard.length; j++) { + if (get.type2(history[i].useCard[j].card, false) == "trick") num++; } - if(history[i].isRound) break; + if (history[i].isRound) break; } return num; }; - var max=0,current=false,targets=game.filterPlayer(); - for(var target of targets){ - var num=getNum(target); - if(num>max){ - max=num; - current=target; - } - else if(num==max) current=false; + var max = 0, + current = false, + targets = game.filterPlayer(); + for (var target of targets) { + var num = getNum(target); + if (num > max) { + max = num; + current = target; + } else if (num == max) current = false; } return current; }, - content:function(){ - 'step 0' - event.target=lib.skill.dczecai.getMax(); - var str='令一名其他角色于本轮内获得〖集智〗'; - if(event.target&&event.target!=player) str+=(';若选择的目标为'+get.translation(event.target)+',则其获得一个额外的回合'); - player.chooseTarget(lib.filter.notMe,get.prompt('dczecai'),str).set('maximum',event.target).set('ai',function(target){ - if(target!=_status.event.maximum) return 0; - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - player.awakenSkill('dczecai'); - var target=result.targets[0]; - player.logSkill('dczecai',target); - target.addAdditionalSkills('dczecai_effect','rejizhi'); - target.addTempSkill('dczecai_effect','roundStart'); - if(target==event.target){ - var evt=trigger; + content: function () { + "step 0"; + event.target = lib.skill.dczecai.getMax(); + var str = "令一名其他角色于本轮内获得〖集智〗"; + if (event.target && event.target != player) + str += + ";若选择的目标为" + get.translation(event.target) + ",则其获得一个额外的回合"; + player + .chooseTarget(lib.filter.notMe, get.prompt("dczecai"), str) + .set("maximum", event.target) + .set("ai", function (target) { + if (target != _status.event.maximum) return 0; + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + player.awakenSkill("dczecai"); + var target = result.targets[0]; + player.logSkill("dczecai", target); + target.addAdditionalSkills("dczecai_effect", "rejizhi"); + target.addTempSkill("dczecai_effect", "roundStart"); + if (target == event.target) { + var evt = trigger; target.insertPhase(); - if(evt.player!=target&&!evt._finished){ + if (evt.player != target && !evt._finished) { evt.finish(); - evt._triggered=5; - var evtx=evt.player.insertPhase(); + evt._triggered = 5; + var evtx = evt.player.insertPhase(); delete evtx.skill; } } } }, - derivation:'rejizhi', - subSkill:{ - effect:{ - charlotte:true, - mark:true, - marktext:'才', - intro:{content:'已拥有技能〖集智〗'}, + derivation: "rejizhi", + subSkill: { + effect: { + charlotte: true, + mark: true, + marktext: "才", + intro: { content: "已拥有技能〖集智〗" }, }, }, }, - dcyinshi:{ - audio:2, - trigger:{player:'damageBegin'}, - usable:1, - filter:function(event,player){ - return !event.card||get.color(event.card)=='none'; + dcyinshi: { + audio: 2, + trigger: { player: "damageBegin" }, + usable: 1, + filter: function (event, player) { + return !event.card || get.color(event.card) == "none"; }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.cancel(); }, - group:'dcyinshi_gain', - subSkill:{ - gain:{ - audio:'dcyinshi', - trigger:{global:'judgeEnd'}, - forced:true, - filter:function(event,player){ - return event.skill=='bagua'&&event.result.card&&get.position(event.result.card,true)=='o'; + group: "dcyinshi_gain", + subSkill: { + gain: { + audio: "dcyinshi", + trigger: { global: "judgeEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.skill == "bagua" && + event.result.card && + get.position(event.result.card, true) == "o" + ); }, - content:function(){ - player.gain(trigger.result.card,'gain2'); + content: function () { + player.gain(trigger.result.card, "gain2"); }, }, }, }, //高览 - xizhen:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&(player.canUse('sha',current,false)||player.canUse('juedou',current,false)); - }) - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('xizhen'),'视为对一名角色使用【杀】或【决斗】',function(card,player,target){ - return target!=player&&(player.canUse('sha',target,false)||player.canUse('juedou',target,false)); - }).set('ai',function(target){ - var player=_status.event.player; - var eff1=0,eff2=0; - if(player.canUse('sha',target,false)) eff1=get.effect(target,{name:'sha'},player,player); - if(player.canUse('juedou',target,false)) eff2=get.effect(target,{name:'juedou'},player,player); - var effx=Math.max(eff1,eff2); - if(effx<=0) return 0; - if(target.isHealthy()) effx*=3; - if(get.attitude(player,target)>0) effx*=1.6; - return effx; + xizhen: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && + (player.canUse("sha", current, false) || player.canUse("juedou", current, false)) + ); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('xizhen',target); - var list=[]; - if(player.canUse('sha',target,false)) list.push('sha'); - if(player.canUse('juedou',target,false)) list.push('juedou'); - if(list.length==1) event._result={control:list[0]}; - else player.chooseControl(list).set('prompt','视为对'+get.translation(target)+'使用…').set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target; - var eff1=get.effect(target,{name:'sha'},player,player),eff2=get.effect(target,{name:'juedou'},player,player); - return eff1>eff2?0:1; + }, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("xizhen"), + "视为对一名角色使用【杀】或【决斗】", + function (card, player, target) { + return ( + target != player && + (player.canUse("sha", target, false) || + player.canUse("juedou", target, false)) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var eff1 = 0, + eff2 = 0; + if (player.canUse("sha", target, false)) + eff1 = get.effect(target, { name: "sha" }, player, player); + if (player.canUse("juedou", target, false)) + eff2 = get.effect(target, { name: "juedou" }, player, player); + var effx = Math.max(eff1, eff2); + if (effx <= 0) return 0; + if (target.isHealthy()) effx *= 3; + if (get.attitude(player, target) > 0) effx *= 1.6; + return effx; }); - } - else event.finish(); - 'step 2' - player.useCard({name:result.control,isCard:true},target,false); - 'step 3' - if(target.isIn()){ - player.storage.xizhen_effect=target; - player.addTempSkill('xizhen_effect','phaseUseAfter'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xizhen", target); + var list = []; + if (player.canUse("sha", target, false)) list.push("sha"); + if (player.canUse("juedou", target, false)) list.push("juedou"); + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set("prompt", "视为对" + get.translation(target) + "使用…") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var eff1 = get.effect(target, { name: "sha" }, player, player), + eff2 = get.effect(target, { name: "juedou" }, player, player); + return eff1 > eff2 ? 0 : 1; + }); + } else event.finish(); + ("step 2"); + player.useCard({ name: result.control, isCard: true }, target, false); + ("step 3"); + if (target.isIn()) { + player.storage.xizhen_effect = target; + player.addTempSkill("xizhen_effect", "phaseUseAfter"); } }, - subSkill:{ - effect:{ - audio:'xizhen', - charlotte:true, - onremove:true, - trigger:{global:['useCard','respond']}, - logTarget:function(event,player){ + subSkill: { + effect: { + audio: "xizhen", + charlotte: true, + onremove: true, + trigger: { global: ["useCard", "respond"] }, + logTarget: function (event, player) { return player.storage.xizhen_effect; }, - forced:true, - filter:function(event,player){ - return Array.isArray(event.respondTo)&&event.respondTo[0]==player&&player.storage.xizhen_effect&&player.storage.xizhen_effect.isIn(); + forced: true, + filter: function (event, player) { + return ( + Array.isArray(event.respondTo) && + event.respondTo[0] == player && + player.storage.xizhen_effect && + player.storage.xizhen_effect.isIn() + ); }, - content:function(){ - 'step 0' - var target=player.storage.xizhen_effect; - event.target=target; + content: function () { + "step 0"; + var target = player.storage.xizhen_effect; + event.target = target; target.recover(); - 'step 1' - player.draw(target.isHealthy()?2:1); + ("step 1"); + player.draw(target.isHealthy() ? 2 : 1); }, - mark:'character', - intro:{content:'已指定$为目标'}, + mark: "character", + intro: { content: "已指定$为目标" }, }, }, }, //管宁 - dunshi:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - usable:1, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[['sha','shan','tao','jiu'],0]; + dunshi: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + usable: 1, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = [["sha", "shan", "tao", "jiu"], 0]; }, - hiddenCard:function(player,name){ - if(player.storage.dunshi&&player.storage.dunshi[0].includes(name)&&!player.getStat('skill').dunshi) return true; + hiddenCard: function (player, name) { + if ( + player.storage.dunshi && + player.storage.dunshi[0].includes(name) && + !player.getStat("skill").dunshi + ) + return true; return false; }, - marktext:'席', - mark:true, - intro:{ - markcount:function(storage){ + marktext: "席", + mark: true, + intro: { + markcount: function (storage) { return storage[1]; }, - content:function(storage,player){ - if(!storage) return; - var str='
  • '; - if(!storage[0].length){ - str+='已无可用牌'; + content: function (storage, player) { + if (!storage) return; + var str = "
  • "; + if (!storage[0].length) { + str += "已无可用牌"; + } else { + str += "剩余可用牌:"; + str += get.translation(storage[0]); } - else{ - str+='剩余可用牌:'; - str+=get.translation(storage[0]); - } - str+='
  • “席”标记数量:'; - str+=(storage[1]); + str += "
  • “席”标记数量:"; + str += storage[1]; return str; }, }, - filter:function(event,player){ - if(event.type=='wuxie') return false; - var storage=player.storage.dunshi; - if(!storage||!storage[0].length) return false; - for(var i of storage[0]){ - var card={name:i,isCard:true}; - if(event.filterCard(card,player,event)) return true; + filter: function (event, player) { + if (event.type == "wuxie") return false; + var storage = player.storage.dunshi; + if (!storage || !storage[0].length) return false; + for (var i of storage[0]) { + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - var storage=player.storage.dunshi; - for(var i of storage[0]) list.push(['基本','',i]); - return ui.create.dialog('遁世',[list,'vcard'],'hidden'); + chooseButton: { + dialog: function (event, player) { + var list = []; + var storage = player.storage.dunshi; + for (var i of storage[0]) list.push(["基本", "", i]); + return ui.create.dialog("遁世", [list, "vcard"], "hidden"); }, - filter:function(button,player){ - var evt=_status.event.getParent(); - return evt.filterCard({name:button.link[2],isCard:true},player,evt); + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard({ name: button.link[2], isCard: true }, player, evt); }, - check:function(button){ - var card={name:button.link[2]},player=_status.event.player; - if(_status.event.getParent().type!='phase') return 1; - if(card.name=='jiu') return 0; - if(card.name=='sha'&&player.hasSkill('jiu')) return 0; - return player.getUseValue(card,null,true); + check: function (button) { + var card = { name: button.link[2] }, + player = _status.event.player; + if (_status.event.getParent().type != "phase") return 1; + if (card.name == "jiu") return 0; + if (card.name == "sha" && player.hasSkill("jiu")) return 0; + return player.getUseValue(card, null, true); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'dunshi', - filterCard:function(){return false}, - popname:true, - viewAs:{ - name:links[0][2], - isCard:true, + audio: "dunshi", + filterCard: function () { + return false; }, - selectCard:-1, - precontent:function(){ - player.addTempSkill('dunshi_damage'); - player.storage.dunshi_damage=event.result.card.name; + popname: true, + viewAs: { + name: links[0][2], + isCard: true, }, - } + selectCard: -1, + precontent: function () { + player.addTempSkill("dunshi_damage"); + player.storage.dunshi_damage = event.result.card.name; + }, + }; + }, + prompt: function (links, player) { + return "选择【" + get.translation(links[0][2]) + "】的目标"; }, - prompt:function(links,player){ - return '选择【'+get.translation(links[0][2])+'】的目标'; - } }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - var storage=player.storage.dunshi; - if(!storage||!storage[0].length) return false; - if(player.getStat('skill').dunshi) return false; - switch(tag){ - case 'respondSha':return (_status.event.type!='phase'||(player==game.me||player.isUnderControl()||player.isOnline()))&&storage[0].includes('sha'); - case 'respondShan':return storage[0].includes('shan'); - case 'save': - if(arg==player&&storage[0].includes('jiu')) return true; - return storage[0].includes('tao'); + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + var storage = player.storage.dunshi; + if (!storage || !storage[0].length) return false; + if (player.getStat("skill").dunshi) return false; + switch (tag) { + case "respondSha": + return ( + (_status.event.type != "phase" || + player == game.me || + player.isUnderControl() || + player.isOnline()) && + storage[0].includes("sha") + ); + case "respondShan": + return storage[0].includes("shan"); + case "save": + if (arg == player && storage[0].includes("jiu")) return true; + return storage[0].includes("tao"); } }, - order:2, - result:{ - player:function(player){ - if(_status.event.type=='dying'){ - return get.attitude(player,_status.event.dying); + order: 2, + result: { + player: function (player) { + if (_status.event.type == "dying") { + return get.attitude(player, _status.event.dying); } return 1; }, }, }, - initList:function(){ - var list,skills=[]; - var banned=['xunyi','mbyilie']; - if(get.mode()=='guozhan'){ - list=[]; - for(var i in lib.characterPack.mode_guozhan) list.push(i); - } - else if(_status.connectMode) list=get.charactersOL(); - else{ - list=[]; - for(var i in lib.character){ - if(lib.filter.characterDisabled2(i)||lib.filter.characterDisabled(i)) continue; + initList: function () { + var list, + skills = []; + var banned = ["xunyi", "mbyilie"]; + if (get.mode() == "guozhan") { + list = []; + for (var i in lib.characterPack.mode_guozhan) list.push(i); + } else if (_status.connectMode) list = get.charactersOL(); + else { + list = []; + for (var i in lib.character) { + if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; list.push(i); } } - for(var i of list){ - if(i.indexOf('gz_jun')==0) continue; - for(var j of lib.character[i][3]){ - var skill=lib.skill[j]; - if(!skill||skill.zhuSkill||banned.includes(j)) continue; - if(skill.ai&&(skill.ai.combo||skill.ai.notemp||skill.ai.neg)) continue; - var info=get.translation(j); - for(var ix=0;ix{ - return [i,item]; - }),'textbutton'] + var next = player.chooseButton([ + "遁世:请选择两项", + [ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ], ]); - next.set('forced',true); - next.set('selectButton',2); - next.set('ai',function(button){ - var player=_status.event.player; - switch(button.link){ + next.set("forced", true); + next.set("selectButton", 2); + next.set("ai", function (button) { + var player = _status.event.player; + switch (button.link) { case 0: - if(get.attitude(player,_status.currentPhase)>0) return 3; + if (get.attitude(player, _status.currentPhase) > 0) return 3; return 0; case 1: return 1; case 2: - var num=player.storage.dunshi[1]; - for(var i of ui.selected.buttons){ - if(i.link==1) num++; + var num = player.storage.dunshi[1]; + for (var i of ui.selected.buttons) { + if (i.link == 1) num++; } - if(num>0&&player.isDamaged()) return 2; + if (num > 0 && player.isDamaged()) return 2; return 0; } }); - 'step 1' - event.links=result.links.sort(); - for(var i of event.links){ - game.log(player,'选择了','#g【遁世】','的','#y选项'+get.cnNumber(i+1,true)); + ("step 1"); + event.links = result.links.sort(); + for (var i of event.links) { + game.log( + player, + "选择了", + "#g【遁世】", + "的", + "#y选项" + get.cnNumber(i + 1, true) + ); } - if(event.links.includes(0)){ + if (event.links.includes(0)) { trigger.cancel(); - if(!_status.dunshi_list) lib.skill.dunshi.initList(); - var list=_status.dunshi_list.filter(function(i){ - return !target.hasSkill(i,null,null,false); - }).randomGets(3); - if(list.length==0) event.goto(3); - else{ - event.videoId=lib.status.videoId++; - var func=function(skills,id,target){ - var dialog=ui.create.dialog('forcebutton'); - dialog.videoId=id; - dialog.add('令'+get.translation(target)+'获得一个技能'); - for(var i=0;i
    【'+get.translation(skills[i])+'】
    '+lib.translate[skills[i]+'_info']+'
    '); + if (!_status.dunshi_list) lib.skill.dunshi.initList(); + var list = _status.dunshi_list + .filter(function (i) { + return !target.hasSkill(i, null, null, false); + }) + .randomGets(3); + if (list.length == 0) event.goto(3); + else { + event.videoId = lib.status.videoId++; + var func = function (skills, id, target) { + var dialog = ui.create.dialog("forcebutton"); + dialog.videoId = id; + dialog.add("令" + get.translation(target) + "获得一个技能"); + for (var i = 0; i < skills.length; i++) { + dialog.add( + '" + ); } - dialog.addText('
    '); - } - if(player.isOnline()) player.send(func,list,event.videoId,target); - else if(player==game.me) func(list,event.videoId,target); - player.chooseControl(list).set('ai',function(){ - var controls=_status.event.controls; - if(controls.includes('cslilu')) return 'cslilu'; + dialog.addText("
    "); + }; + if (player.isOnline()) player.send(func, list, event.videoId, target); + else if (player == game.me) func(list, event.videoId, target); + player.chooseControl(list).set("ai", function () { + var controls = _status.event.controls; + if (controls.includes("cslilu")) return "cslilu"; return controls[0]; }); } - } - else event.goto(3); - 'step 2' - game.broadcastAll('closeDialog',event.videoId); + } else event.goto(3); + ("step 2"); + game.broadcastAll("closeDialog", event.videoId); target.addSkills(result.control); - 'step 3' - var storage=player.storage.dunshi; - if(event.links.includes(1)){ + ("step 3"); + var storage = player.storage.dunshi; + if (event.links.includes(1)) { storage[0].remove(event.cardname); storage[1]++; - player.markSkill('dunshi'); + player.markSkill("dunshi"); } - if(event.links.includes(2)){ + if (event.links.includes(2)) { player.loseMaxHp(); - if(storage[1]>0) player.draw(storage[1]); + if (storage[1] > 0) player.draw(storage[1]); } }, }, }, }, //吉本 - xunli:{ - audio:2, - trigger:{ - global:['loseAfter','loseAsyncAfter'], + xunli: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], }, - forced:true, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false||player.getExpansions('xunli').length>=9) return false; - for(var i of event.cards){ - if(get.position(i,true)=='d'&&get.color(i,event.cards2&&event.cards2.includes(i)?event.player:false)=='black') return true; + forced: true, + filter: function (event, player) { + if ( + event.type != "discard" || + event.getlx === false || + player.getExpansions("xunli").length >= 9 + ) + return false; + for (var i of event.cards) { + if ( + get.position(i, true) == "d" && + get.color(i, event.cards2 && event.cards2.includes(i) ? event.player : false) == + "black" + ) + return true; } return false; }, - content:function(){ - 'step 0' - var num=9-player.getExpansions('xunli').length; - var cards=[]; - for(var i of trigger.cards){ - if(get.position(i,true)=='d'&&get.color(i,trigger.cards2&&trigger.cards2.includes(i)?trigger.player:false)=='black') cards.push(i); + content: function () { + "step 0"; + var num = 9 - player.getExpansions("xunli").length; + var cards = []; + for (var i of trigger.cards) { + if ( + get.position(i, true) == "d" && + get.color( + i, + trigger.cards2 && trigger.cards2.includes(i) ? trigger.player : false + ) == "black" + ) + cards.push(i); } - if(cards.length<=num) event._result={ - bool:true, - links:cards, - } - else player.chooseButton(true,num,['寻疠:将'+get.cnNumber(num)+'张牌置于武将牌上',cards]).set('forceAuto',true).set('ai',function(button){ - return get.value(button.link,_status.event.player); - }); - 'step 1' - if(result.bool){ - player.addToExpansion('gain2',result.links).gaintag.add('xunli'); + if (cards.length <= num) + event._result = { + bool: true, + links: cards, + }; + else + player + .chooseButton(true, num, [ + "寻疠:将" + get.cnNumber(num) + "张牌置于武将牌上", + cards, + ]) + .set("forceAuto", true) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + ("step 1"); + if (result.bool) { + player.addToExpansion("gain2", result.links).gaintag.add("xunli"); } }, - marktext:'疠', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "疠", + intro: { + content: "expansion", + markcount: "expansion", }, - group:'xunli_exchange', - subSkill:{ - exchange:{ - audio:'xunli', - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.getExpansions('xunli').length>0&&player.hasCard((card)=>get.color(card,player)=='black','h'); + group: "xunli_exchange", + subSkill: { + exchange: { + audio: "xunli", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.getExpansions("xunli").length > 0 && + player.hasCard((card) => get.color(card, player) == "black", "h") + ); }, - content:function(){ - "step 0" - var cards=player.getExpansions('xunli'); - if(!cards.length||!player.countCards('h')){ + content: function () { + "step 0"; + var cards = player.getExpansions("xunli"); + if (!cards.length || !player.countCards("h")) { event.finish(); return; } - var next=player.chooseToMove('寻疠:是否交换“疠”和手牌?'); - next.set('list',[ - [get.translation(player)+'(你)的疠',cards], - ['手牌区',player.getCards('h',(card)=>get.color(card,player)=='black')], + var next = player.chooseToMove("寻疠:是否交换“疠”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的疠", cards], + [ + "手牌区", + player.getCards("h", (card) => get.color(card, player) == "black"), + ], ]); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('processAI',function(list){ - var player=_status.event.player; - var getv=function(card){ - if(get.info(card).toself) return 0; - return player.getUseValue(card,false); + next.set("processAI", function (list) { + var player = _status.event.player; + var getv = function (card) { + if (get.info(card).toself) return 0; + return player.getUseValue(card, false); }; - var cards=list[0][1].concat(list[1][1]).sort(function(a,b){ - return getv(b)-getv(a); - }),cards2=cards.splice(0,player.getExpansions('xunli').length); - return [cards2,cards]; + var cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return getv(b) - getv(a); + }), + cards2 = cards.splice(0, player.getExpansions("xunli").length); + return [cards2, cards]; }); - "step 1" - if(result.bool){ - var pushs=result.moved[0],gains=result.moved[1]; - pushs.removeArray(player.getExpansions('xunli')); - gains.removeArray(player.getCards('h')); - if(!pushs.length||pushs.length!=gains.length) return; - player.logSkill('xunli_exchange'); - player.addToExpansion(pushs,player,'giveAuto').gaintag.add('xunli'); - game.log(player,'将',pushs,'作为“疠”置于武将牌上'); - player.gain(gains,'gain2'); + ("step 1"); + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("xunli")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.logSkill("xunli_exchange"); + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("xunli"); + game.log(player, "将", pushs, "作为“疠”置于武将牌上"); + player.gain(gains, "gain2"); } }, }, }, }, - zhishi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('zhishi')).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att<=4) return 0; - if(target.hasSkillTag('nogain')) att/=10; + zhishi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("zhishi")).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att <= 4) return 0; + if (target.hasSkillTag("nogain")) att /= 10; return att; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('zhishi',target); - player.storage.zhishi_mark=target; - player.addTempSkill('zhishi_mark',{player:'phaseBegin'}); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhishi", target); + player.storage.zhishi_mark = target; + player.addTempSkill("zhishi_mark", { player: "phaseBegin" }); } }, - ai:{expose:0.3}, - subSkill:{ - mark:{ - trigger:{ - global:['dying','useCardToTargeted'], + ai: { expose: 0.3 }, + subSkill: { + mark: { + trigger: { + global: ["dying", "useCardToTargeted"], }, - direct:true, - charlotte:true, - filter:function(event,player){ - if(!player.getExpansions('xunli').length) return false; - var target=player.storage.zhishi_mark; - if(event.name=='dying') return event.player==target; - return event.card.name=='sha'&&event.target==target; + direct: true, + charlotte: true, + filter: function (event, player) { + if (!player.getExpansions("xunli").length) return false; + var target = player.storage.zhishi_mark; + if (event.name == "dying") return event.player == target; + return event.card.name == "sha" && event.target == target; }, - content:function(){ - 'step 0' - var target=player.storage.zhishi_mark; - event.target=target; - player.chooseButton([get.prompt('zhishi',target),'
    弃置任意张“疠”并令其摸等量的牌
    ',player.getExpansions('xunli')],[1,Infinity]).set('ai',function(button){ - var player=_status.event.player,target=player.storage.zhishi_mark; - if(target.hp<1&&target!=get.zhu(player)) return 0; - if(target.hasSkillTag('nogain')) return 0; - return 3-player.getUseValue(card,false); - }); - 'step 1' - if(result.bool){ - player.logSkill('zhishi',target); + content: function () { + "step 0"; + var target = player.storage.zhishi_mark; + event.target = target; + player + .chooseButton( + [ + get.prompt("zhishi", target), + '
    弃置任意张“疠”并令其摸等量的牌
    ', + player.getExpansions("xunli"), + ], + [1, Infinity] + ) + .set("ai", function (button) { + var player = _status.event.player, + target = player.storage.zhishi_mark; + if (target.hp < 1 && target != get.zhu(player)) return 0; + if (target.hasSkillTag("nogain")) return 0; + return 3 - player.getUseValue(card, false); + }); + ("step 1"); + if (result.bool) { + player.logSkill("zhishi", target); player.loseToDiscardpile(result.links); target.draw(result.links.length); } }, - mark:'character', - intro:{ - content:'决定帮助$,具体帮不帮另说', + mark: "character", + intro: { + content: "决定帮助$,具体帮不帮另说", }, }, }, }, - lieyi:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.getExpansions('xunli').length>0; + lieyi: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getExpansions("xunli").length > 0; }, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - var cards=player.getExpansions('xunli'); - var cards2=cards.filter(function(card){ - return target.isIn()&&player.canUse(card,target,false); + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + var cards = player.getExpansions("xunli"); + var cards2 = cards.filter(function (card) { + return target.isIn() && player.canUse(card, target, false); }); - if(cards2.length){ - player.chooseButton(['对'+get.translation(target)+'使用一张牌',cards2],true).set('ai',function(button){ - return get.order(button.link); - }); - } - else{ + if (cards2.length) { + player + .chooseButton(["对" + get.translation(target) + "使用一张牌", cards2], true) + .set("ai", function (button) { + return get.order(button.link); + }); + } else { event.finish(); - if(cards.length) player.loseToDiscardpile(cards); - if(target.isIn()&&!target.hasHistory('damage',function(evt){ - return evt.getParent('lieyi')==event&&evt._dyinged; - })) player.loseHp(); + if (cards.length) player.loseToDiscardpile(cards); + if ( + target.isIn() && + !target.hasHistory("damage", function (evt) { + return evt.getParent("lieyi") == event && evt._dyinged; + }) + ) + player.loseHp(); } - 'step 1' - player.useCard(result.links[0],target,false); + ("step 1"); + player.useCard(result.links[0], target, false); event.goto(0); }, - ai:{ - order:2, - result:{ - target:function(player,target){ - var cards=player.getExpansions('xunli'); - var effect=0,damage=0; - for(var i of cards){ - if(player.canUse(i,target,false)){ - effect+=get.effect(target,i,player,target); - damage+=get.tag(i,'damage'); + ai: { + order: 2, + result: { + target: function (player, target) { + var cards = player.getExpansions("xunli"); + var effect = 0, + damage = 0; + for (var i of cards) { + if (player.canUse(i, target, false)) { + effect += get.effect(target, i, player, target); + damage += get.tag(i, "damage"); } } - if(damage>=target.hp) return effect; - if(player.hp>2&&cards.length>3) return effect/3; + if (damage >= target.hp) return effect; + if (player.hp > 2 && cards.length > 3) return effect / 3; return 0; }, }, }, }, //马日磾 - bingjie:{ - trigger:{player:'phaseUseBegin'}, - check:function(event,player){ - return player.maxHp>3&&player.isDamaged()&&player.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)<0&&player.canUse(card,current,null,true)&&get.effect(current,card,player,player)>0; - })&&player.hasValueTarget(card); - },'hs'); + bingjie: { + trigger: { player: "phaseUseBegin" }, + check: function (event, player) { + return ( + player.maxHp > 3 && + player.isDamaged() && + player.hasCard(function (card) { + return ( + game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) < 0 && + player.canUse(card, current, null, true) && + get.effect(current, card, player, player) > 0 + ); + }) && player.hasValueTarget(card) + ); + }, "hs") + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseMaxHp(); - 'step 1' - player.addTempSkill('bingjie_effect'); + ("step 1"); + player.addTempSkill("bingjie_effect"); game.delayx(); }, - subSkill:{ - effect:{ - audio:'bingjie', - trigger:{player:'useCardToPlayered'}, - forced:true, - charlotte:true, - logTarget:'target', - filter:function(event,player){ - return event.target!=player&&(event.card.name=='sha'||get.type(event.card,false)=='trick')&&event.target.countCards('he')>0; + subSkill: { + effect: { + audio: "bingjie", + trigger: { player: "useCardToPlayered" }, + forced: true, + charlotte: true, + logTarget: "target", + filter: function (event, player) { + return ( + event.target != player && + (event.card.name == "sha" || get.type(event.card, false) == "trick") && + event.target.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - trigger.target.chooseToDiscard('he',true); - 'step 1' - if(result.bool&&result.cards.length&&get.color(result.cards[0],trigger.target)==get.color(trigger.card)){ - game.log(trigger.target,'不能响应',trigger.card); + content: function () { + "step 0"; + trigger.target.chooseToDiscard("he", true); + ("step 1"); + if ( + result.bool && + result.cards.length && + get.color(result.cards[0], trigger.target) == get.color(trigger.card) + ) { + game.log(trigger.target, "不能响应", trigger.card); trigger.directHit.push(trigger.target); } }, - ai:{ - effect:{ - player:function(card,player,target){ - if(player!==target&&get.itemtype(target)==='player'&&(card.name==='sha'||get.type(card,false)==='trick')&& - target.countCards('he')&&!target.hasSkillTag('noh')) return [1,0,1,-1]; - } - } - } + ai: { + effect: { + player: function (card, player, target) { + if ( + player !== target && + get.itemtype(target) === "player" && + (card.name === "sha" || get.type(card, false) === "trick") && + target.countCards("he") && + !target.hasSkillTag("noh") + ) + return [1, 0, 1, -1]; + }, + }, + }, }, }, }, - zhengding:{ - audio:2, - trigger:{player:['useCard','respond']}, - forced:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(!Array.isArray(event.respondTo)) return false; - if(player==event.respondTo[0]) return false; - var color=get.color(event.card); - if(color=='none') return false; - return color==get.color(event.respondTo[1]); + zhengding: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (!Array.isArray(event.respondTo)) return false; + if (player == event.respondTo[0]) return false; + var color = get.color(event.card); + if (color == "none") return false; + return color == get.color(event.respondTo[1]); }, - content:function(){ + content: function () { player.gainMaxHp(); player.recover(); }, }, //孙茹 - xiecui:{ - audio:2, - trigger:{global:'damageBegin1'}, - filter:function(event,player){ - var source=event.source; - if(!source||source!=_status.currentPhase||event.getParent().type!='card') return false; - return !source.hasHistory('sourceDamage',function(evt){ - return evt.getParent().type=='card'; + xiecui: { + audio: 2, + trigger: { global: "damageBegin1" }, + filter: function (event, player) { + var source = event.source; + if (!source || source != _status.currentPhase || event.getParent().type != "card") + return false; + return !source.hasHistory("sourceDamage", function (evt) { + return evt.getParent().type == "card"; }); }, - logTarget:'source', - prompt2:function(event,player){ - var str=('令'+get.translation(event.player)+'即将受到的'); - str+=(''+event.num+'点'); - if(event.hasNature('linked')){ - str+=(get.translation(event.nature)+'属性'); + logTarget: "source", + prompt2: function (event, player) { + var str = "令" + get.translation(event.player) + "即将受到的"; + str += "" + event.num + "点"; + if (event.hasNature("linked")) { + str += get.translation(event.nature) + "属性"; } - str+='伤害+1'; - if(event.source.group=='wu'){ - var cards=event.cards.filterInD(); - if(cards.length){ - str+=(';然后'+get.translation(event.source)+'获得'+get.translation(cards)+',且本回合的手牌上限+1') + str += "伤害+1"; + if (event.source.group == "wu") { + var cards = event.cards.filterInD(); + if (cards.length) { + str += + ";然后" + + get.translation(event.source) + + "获得" + + get.translation(cards) + + ",且本回合的手牌上限+1"; } } return str; }, - check:function(event,player){ - var att=get.attitude(player,event.player); - if(att<0){ - if(event.source.group!='wu'||!event.cards.filterInD().length) return true; - return get.attitude(player,event.source)>0; + check: function (event, player) { + var att = get.attitude(player, event.player); + if (att < 0) { + if (event.source.group != "wu" || !event.cards.filterInD().length) return true; + return get.attitude(player, event.source) > 0; } return false; }, - content:function(){ + content: function () { trigger.num++; - var source=trigger.source; - if(source.group=='wu'){ - var cards=trigger.cards.filterInD(); - if(cards.length>0){ - source.gain(cards,'gain2'); - source.addMark('xiecui_effect',1,false); - source.addTempSkill('xiecui_effect'); + var source = trigger.source; + if (source.group == "wu") { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) { + source.gain(cards, "gain2"); + source.addMark("xiecui_effect", 1, false); + source.addTempSkill("xiecui_effect"); } } }, - subSkill:{ - effect:{ - charlotte:true, - mod:{ - maxHandcard:(player,num)=>num+player.countMark('xiecui_effect'), + subSkill: { + effect: { + charlotte: true, + mod: { + maxHandcard: (player, num) => num + player.countMark("xiecui_effect"), }, - marktext:'翠', - onremove:true, - intro:{content:'手牌上限+#'}, + marktext: "翠", + onremove: true, + intro: { content: "手牌上限+#" }, }, }, - ai:{threaten:1.75}, + ai: { threaten: 1.75 }, }, - youxu:{ - audio:2, - trigger:{global:'phaseEnd'}, - logTarget:'player', - filter:function(event,player){ - return event.player.countCards('h')>event.player.hp; + youxu: { + audio: 2, + trigger: { global: "phaseEnd" }, + logTarget: "player", + filter: function (event, player) { + return event.player.countCards("h") > event.player.hp; }, - check:function(event,player){ - if(get.attitude(player,event.player)<=0) return true; - else return game.hasPlayer(function(current){ - return current!=event.player&¤t.isDamaged()&¤t.isMinHp()&& - get.attitude(player,current)>0&&get.recoverEffect(current,player,player)>0; - }); - }, - content:function(){ - 'step 0' - if(player==trigger.player){ - player.chooseCard('h',true,'请展示一张手牌'); - } - else{ - player.choosePlayerCard(trigger.player,true,'h'); - } - 'step 1' - if(result.bool){ - var card=result.cards[0]; - event.card=card; - var str=get.translation(player); - if(player!=trigger.player) str+=('对'+get.translation(trigger.player)); - str+='发动了【忧恤】'; - player.showCards(card,str); - player.chooseTarget('令一名角色获得'+get.translation(card),'若其体力值为全场最少,则其回复1点体力',function(card,player,target){ - return target!=_status.event.getTrigger().player; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<0) return 0; - if(target.isDamaged()&&target.isMinHp&&get.recoverEffect(target,player,player)>0) return 4*att; - return att; + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return true; + else + return game.hasPlayer(function (current) { + return ( + current != event.player && + current.isDamaged() && + current.isMinHp() && + get.attitude(player, current) > 0 && + get.recoverEffect(current, player, player) > 0 + ); }); + }, + content: function () { + "step 0"; + if (player == trigger.player) { + player.chooseCard("h", true, "请展示一张手牌"); + } else { + player.choosePlayerCard(trigger.player, true, "h"); } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - target.gain(card,trigger.player,'give').giver=player; - } - else event.finish(); - 'step 3' - if(target.isMinHp()) target.recover(); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + event.card = card; + var str = get.translation(player); + if (player != trigger.player) str += "对" + get.translation(trigger.player); + str += "发动了【忧恤】"; + player.showCards(card, str); + player + .chooseTarget( + "令一名角色获得" + get.translation(card), + "若其体力值为全场最少,则其回复1点体力", + function (card, player, target) { + return target != _status.event.getTrigger().player; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att < 0) return 0; + if ( + target.isDamaged() && + target.isMinHp && + get.recoverEffect(target, player, player) > 0 + ) + return 4 * att; + return att; + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.gain(card, trigger.player, "give").giver = player; + } else event.finish(); + ("step 3"); + if (target.isMinHp()) target.recover(); }, }, //夏侯令女 - fuping:{ - audio:2, - hiddenCard:function(player,name){ - var list=player.getStorage('fuping').slice(0); - list.removeArray(player.getStorage('fuping_round')); - return list.includes(name)&&player.hasCard((card)=>(get.type(card)!='basic'),'ehs'); + fuping: { + audio: 2, + hiddenCard: function (player, name) { + var list = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + return list.includes(name) && player.hasCard((card) => get.type(card) != "basic", "ehs"); }, - enable:'chooseToUse', - locked:false, - filter:function(event,player){ - var list=player.getStorage('fuping').slice(0); - list.removeArray(player.getStorage('fuping_round')); - if(!list.length) return false; - if(!player.hasCard((card)=>(get.type(card)!='basic'),'ehs')) return false; - for(var i of list){ - var type=get.type2(i,false); - if((type=='basic'||type=='trick')&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; + enable: "chooseToUse", + locked: false, + filter: function (event, player) { + var list = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + if (!list.length) return false; + if (!player.hasCard((card) => get.type(card) != "basic", "ehs")) return false; + for (var i of list) { + var type = get.type2(i, false); + if ( + (type == "basic" || type == "trick") && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=player.getStorage('fuping').slice(0); - list.removeArray(player.getStorage('fuping_round')); - var list2=[]; - for(var i of list){ - var type=get.type2(i,false); - if((type=='basic'||type=='trick')&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) list2.push([type,'',i]); + chooseButton: { + dialog: function (event, player) { + var list = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + var list2 = []; + for (var i of list) { + var type = get.type2(i, false); + if ( + (type == "basic" || type == "trick") && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + list2.push([type, "", i]); } - return ui.create.dialog('浮萍',[list2,'vcard']); + return ui.create.dialog("浮萍", [list2, "vcard"]); }, - check:function(button){ - if(_status.event.getParent().type!='phase') return 1; - return _status.event.player.getUseValue({name:button.link[2]},null,true); + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue({ name: button.link[2] }, null, true); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'fuping', - filterCard:(card)=>get.type(card)!='basic', - position:'he', - popname:true, - viewAs:{ - name:links[0][2], + audio: "fuping", + filterCard: (card) => get.type(card) != "basic", + position: "he", + popname: true, + viewAs: { + name: links[0][2], }, - check:function(card){ - return 8-get.value(card); + check: function (card) { + return 8 - get.value(card); }, - precontent:function(){ - player.addTempSkill('fuping_round'); - player.markAuto('fuping_round',[event.result.card.name]); + precontent: function () { + player.addTempSkill("fuping_round"); + player.markAuto("fuping_round", [event.result.card.name]); }, - } + }; }, - prompt:function(links,player){ - return '将一张非基本牌当做【'+get.translation(links[0][2])+'】使用'; + prompt: function (links, player) { + return "将一张非基本牌当做【" + get.translation(links[0][2]) + "】使用"; }, }, - ai:{ - order:8, - result:{player:1}, - respondSha:true, - skillTagFilter:function(player){ - var list=player.getStorage('fuping').slice(0); - list.removeArray(player.getStorage('fuping_round')); - return list.includes('sha'); + ai: { + order: 8, + result: { player: 1 }, + respondSha: true, + skillTagFilter: function (player) { + var list = player.getStorage("fuping").slice(0); + list.removeArray(player.getStorage("fuping_round")); + return list.includes("sha"); }, }, - mod:{ - targetInRange:function(card,player,target){ - if(!player.hasEnabledSlot()) return true; + mod: { + targetInRange: function (card, player, target) { + if (!player.hasEnabledSlot()) return true; }, }, - marktext:'萍', - intro:{content:'已记录$'}, - group:'fuping_mark', - subSkill:{ - mark:{ - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return player!=event.player&&event.targets.includes(player)&& - player.hasEnabledSlot()&&!player.getStorage('fuping').includes(event.card.name); + marktext: "萍", + intro: { content: "已记录$" }, + group: "fuping_mark", + subSkill: { + mark: { + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + player != event.player && + event.targets.includes(player) && + player.hasEnabledSlot() && + !player.getStorage("fuping").includes(event.card.name) + ); }, - logTarget:'player', - prompt2:(event)=>('废除一个装备栏并记录【'+get.translation(event.card.name)+'】'), - check:function(event,player){ - var list=['tao','juedou','guohe','shunshou','wuzhong','xietianzi','yuanjiao','wanjian','nanman','huoshaolianying','chuqibuyi','zhujinqiyuan','lebu','bingliang']; - if(!list.includes(event.card.name)) return false; - if(['nanman','wanjian'].includes(event.card.name)&&!player.hasValueTarget({name:event.card.name})) return false; - var list=[3,5,4,1,2]; - for(var i of list){ - if(player.hasEnabledSlot(i)){ - var card=player.getEquip(i); - if(!card||player.hasEmptySlot(i)) return true; - if(get.value(card,player)<=0) return true; + logTarget: "player", + prompt2: (event) => + "废除一个装备栏并记录【" + get.translation(event.card.name) + "】", + check: function (event, player) { + var list = [ + "tao", + "juedou", + "guohe", + "shunshou", + "wuzhong", + "xietianzi", + "yuanjiao", + "wanjian", + "nanman", + "huoshaolianying", + "chuqibuyi", + "zhujinqiyuan", + "lebu", + "bingliang", + ]; + if (!list.includes(event.card.name)) return false; + if ( + ["nanman", "wanjian"].includes(event.card.name) && + !player.hasValueTarget({ name: event.card.name }) + ) + return false; + var list = [3, 5, 4, 1, 2]; + for (var i of list) { + if (player.hasEnabledSlot(i)) { + var card = player.getEquip(i); + if (!card || player.hasEmptySlot(i)) return true; + if (get.value(card, player) <= 0) return true; } } return false; }, - content:function(){ - player.markAuto('fuping',[trigger.card.name]); - game.log(player,'记录了','#y'+get.translation(trigger.card.name)); - player.chooseToDisable().set('ai',function(event,player,list){ - var list=[3,5,4,1,2]; - for(var i of list){ - if(player.hasEnabledSlot(i)){ - var card=player.getEquip(i); - if(!card||player.hasEmptySlot(i)) return 'equip'+i; - if(get.value(card,player)<=0) return 'equip'+i; + content: function () { + player.markAuto("fuping", [trigger.card.name]); + game.log(player, "记录了", "#y" + get.translation(trigger.card.name)); + player.chooseToDisable().set("ai", function (event, player, list) { + var list = [3, 5, 4, 1, 2]; + for (var i of list) { + if (player.hasEnabledSlot(i)) { + var card = player.getEquip(i); + if (!card || player.hasEmptySlot(i)) return "equip" + i; + if (get.value(card, player) <= 0) return "equip" + i; } } return list.randomGet(); }); }, }, - backup:{audio:'fuping'}, - round:{charlotte:true,onremove:true}, + backup: { audio: "fuping" }, + round: { charlotte: true, onremove: true }, }, }, - weilie:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countMark('weilie')<=player.getStorage('fuping').length&&player.countCards('he')>0&&game.hasPlayer((current)=>current.isDamaged()) + weilie: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.countMark("weilie") <= player.getStorage("fuping").length && + player.countCards("he") > 0 && + game.hasPlayer((current) => current.isDamaged()) + ); }, - filterCard:true, - position:'he', - filterTarget:(card,player,target)=>target.isDamaged(), - check:function(card){ - return 8-get.value(card); + filterCard: true, + position: "he", + filterTarget: (card, player, target) => target.isDamaged(), + check: function (card) { + return 8 - get.value(card); }, - content:function(){ - 'step 0' - player.addMark('weilie',1,false); + content: function () { + "step 0"; + player.addMark("weilie", 1, false); target.recover(); - 'step 1' - if(target.isDamaged()) target.draw(); + ("step 1"); + if (target.isDamaged()) target.draw(); }, - onremove:true, - ai:{ - order:1, - result:{ - player:function(player,target){ - var eff=get.recoverEffect(target,player,player); - if(target.getDamagedHp()>1) eff+=get.effect(target,{name:'draw'},player,player); + onremove: true, + ai: { + order: 1, + result: { + player: function (player, target) { + var eff = get.recoverEffect(target, player, player); + if (target.getDamagedHp() > 1) + eff += get.effect(target, { name: "draw" }, player, player); return eff; }, }, @@ -9061,417 +11338,491 @@ game.import('character', function () { }, //张瑶 //Partly powered by 烟雨墨染 - yuanyu:{ - audio:2, - enable:'phaseUse', - usable:1, - content:function(){ - 'step 0' + yuanyu: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.countCards('h')>0&&game.hasPlayer(current=>current!=player)){ - var suits=lib.suit.slice(0),cards=player.getExpansions('yuanyu'); - for(var i of cards) suits.remove(get.suit(i,false)); - var str='选择一张手牌,作为“怨”置于武将牌上;同时选择一名其他角色,令该角色获得〖怨语〗的后续效果。' - if(suits.length){ - str+='目前“怨”中未包含的花色:'; - for(var i of suits) str+=get.translation(i); + ("step 1"); + if (player.countCards("h") > 0 && game.hasPlayer((current) => current != player)) { + var suits = lib.suit.slice(0), + cards = player.getExpansions("yuanyu"); + for (var i of cards) suits.remove(get.suit(i, false)); + var str = + "选择一张手牌,作为“怨”置于武将牌上;同时选择一名其他角色,令该角色获得〖怨语〗的后续效果。"; + if (suits.length) { + str += "目前“怨”中未包含的花色:"; + for (var i of suits) str += get.translation(i); } player.chooseCardTarget({ - filterCard:true, - filterTarget:lib.filter.notMe, - position:'h', - prompt:'怨语:选择置于武将牌上的牌和目标', - prompt2:str, - suits:suits, - forced:true, - ai1:function(card){ - var val=get.value(card),evt=_status.event; - if(evt.suits.includes(get.suit(card,false))) return 8-get.value(card); - return 5-get.value(card); + filterCard: true, + filterTarget: lib.filter.notMe, + position: "h", + prompt: "怨语:选择置于武将牌上的牌和目标", + prompt2: str, + suits: suits, + forced: true, + ai1: function (card) { + var val = get.value(card), + evt = _status.event; + if (evt.suits.includes(get.suit(card, false))) return 8 - get.value(card); + return 5 - get.value(card); }, - ai2:function(target){ - var player=_status.event.player; - if(player.storage.yuanyu_damage&&player.storage.yuanyu_damage.includes(target)) return 0; - return -get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player; + if ( + player.storage.yuanyu_damage && + player.storage.yuanyu_damage.includes(target) + ) + return 0; + return -get.attitude(player, target); }, }); + } else event.finish(); + ("step 2"); + var target = result.targets[0]; + player.addSkill("yuanyu_damage"); + player.markAuto("yuanyu_damage", result.targets); + player.line(target, "green"); + if (!target.storage.yuanyu_mark) { + target.storage.yuanyu_mark = player; + target.markSkillCharacter("yuanyu_mark", player, "怨语", "已获得〖怨语〗效果"); + target.addSkill("yuanyu_mark"); } - else event.finish(); - 'step 2' - var target=result.targets[0]; - player.addSkill('yuanyu_damage'); - player.markAuto('yuanyu_damage',result.targets); - player.line(target,'green'); - if(!target.storage.yuanyu_mark){ - target.storage.yuanyu_mark=player; - target.markSkillCharacter('yuanyu_mark',player,'怨语','已获得〖怨语〗效果'); - target.addSkill('yuanyu_mark'); - } - player.addToExpansion(result.cards,player,'give').gaintag.add('yuanyu'); + player.addToExpansion(result.cards, player, "give").gaintag.add("yuanyu"); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); - player.removeSkill('yuanyu_damage'); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + player.removeSkill("yuanyu_damage"); }, - ai:{ - order:7, - result:{ - player:1, + ai: { + order: 7, + result: { + player: 1, }, }, - subSkill:{ - mark:{ - mark:'character', - charlotte:true, - intro:{ - content:'已获得〖怨语〗效果', - onunmark:true, + subSkill: { + mark: { + mark: "character", + charlotte: true, + intro: { + content: "已获得〖怨语〗效果", + onunmark: true, }, }, - damage:{ - trigger:{global:['damageSource','phaseDiscardBegin']}, - forced:true, - charlotte:true, - onremove:function(player,skill){ - if(player.storage[skill]){ - for(var i of player.storage[skill]){ - if(i.storage.yuanyu_mark==player) i.unmarkSkill('yuanyu_mark'); + damage: { + trigger: { global: ["damageSource", "phaseDiscardBegin"] }, + forced: true, + charlotte: true, + onremove: function (player, skill) { + if (player.storage[skill]) { + for (var i of player.storage[skill]) { + if (i.storage.yuanyu_mark == player) i.unmarkSkill("yuanyu_mark"); } } delete player.storage[skill]; }, - filter:function(event,player){ - if(event.name=='damage'){ - var source=event.source; - return source&&player.getStorage('yuanyu_damage').includes(source)&&source.countCards('h')>0; - } - else{ - if(player==event.player){ - return player.getStorage('yuanyu_damage').some(function(target){ - return target.isIn()&&target.countCards('h')>0; + filter: function (event, player) { + if (event.name == "damage") { + var source = event.source; + return ( + source && + player.getStorage("yuanyu_damage").includes(source) && + source.countCards("h") > 0 + ); + } else { + if (player == event.player) { + return player.getStorage("yuanyu_damage").some(function (target) { + return target.isIn() && target.countCards("h") > 0; }); - } - else if(player.getStorage('yuanyu_damage').includes(event.player)){ - return event.player.countCards('h')>0; + } else if (player.getStorage("yuanyu_damage").includes(event.player)) { + return event.player.countCards("h") > 0; } return false; } }, - content:function(){ - 'step 0' - if(trigger.name=='phaseDiscard'){ - if(trigger.player==player){ - event.targets=player.getStorage('yuanyu_damage').filter(function(target){ - return target.isIn()&&target.countCards('h')>0; - }).sortBySeat(); - } - else event.targets=[trigger.player]; - } - else event.targets=[trigger.source]; - 'step 1' - event.target=event.targets.shift(); - event.count=trigger.name=='damage'?trigger.num:1; - 'step 2' + content: function () { + "step 0"; + if (trigger.name == "phaseDiscard") { + if (trigger.player == player) { + event.targets = player + .getStorage("yuanyu_damage") + .filter(function (target) { + return target.isIn() && target.countCards("h") > 0; + }) + .sortBySeat(); + } else event.targets = [trigger.player]; + } else event.targets = [trigger.source]; + ("step 1"); + event.target = event.targets.shift(); + event.count = trigger.name == "damage" ? trigger.num : 1; + ("step 2"); event.count--; - var suits=lib.suit.slice(0),cards=player.getExpansions('yuanyu'); - for(var i of cards) suits.remove(get.suit(i,false)); - var next=target.chooseCard('h',true,'将一张手牌置于'+get.translation(player)+'的武将牌上'); - next.set('suits',suits); - next.set('ai',function(card){ - var val=get.value(card),evt=_status.event; - if(evt.suits.includes(get.suit(card,false))) return 5-get.value(card); - return 8-get.value(card); + var suits = lib.suit.slice(0), + cards = player.getExpansions("yuanyu"); + for (var i of cards) suits.remove(get.suit(i, false)); + var next = target.chooseCard( + "h", + true, + "将一张手牌置于" + get.translation(player) + "的武将牌上" + ); + next.set("suits", suits); + next.set("ai", function (card) { + var val = get.value(card), + evt = _status.event; + if (evt.suits.includes(get.suit(card, false))) return 5 - get.value(card); + return 8 - get.value(card); }); - if(suits.length){ - var str='目前未包含的花色:'; - for(var i of suits) str+=get.translation(i); - next.set('prompt2',str); + if (suits.length) { + var str = "目前未包含的花色:"; + for (var i of suits) str += get.translation(i); + next.set("prompt2", str); } - 'step 3' - player.addToExpansion(result.cards,target,'give').gaintag.add('yuanyu'); - 'step 4' - if(!player.hasSkill('yuanyu_damage')) event.finish(); - else if(event.count>0&&target.countCards('h')>0) event.goto(2); - else if(event.targets.length>0) event.goto(1); + ("step 3"); + player.addToExpansion(result.cards, target, "give").gaintag.add("yuanyu"); + ("step 4"); + if (!player.hasSkill("yuanyu_damage")) event.finish(); + else if (event.count > 0 && target.countCards("h") > 0) event.goto(2); + else if (event.targets.length > 0) event.goto(1); }, }, }, }, - xiyan:{ - audio:2, - trigger:{player:'addToExpansionAfter'}, - filter:function(event,player){ - if(!event.gaintag.includes('yuanyu')) return false; - var cards=player.getExpansions('yuanyu'); - if(cards.length_status.currentPhase, - prompt2:'获得所有“怨”', - check:()=>true, - content:function(){ - 'step 0' - player.removeSkill('yuanyu_damage'); - var cards=player.getExpansions('yuanyu'); - player.gain(cards,'gain2'); - 'step 1' - var target=_status.currentPhase; - if(player==target){ - player.addMark('xiyan_buff',4,false); - player.addTempSkill('xiyan_buff'); - delete player.getStat('skill').yuanyu; + logTarget: () => _status.currentPhase, + prompt2: "获得所有“怨”", + check: () => true, + content: function () { + "step 0"; + player.removeSkill("yuanyu_damage"); + var cards = player.getExpansions("yuanyu"); + player.gain(cards, "gain2"); + ("step 1"); + var target = _status.currentPhase; + if (player == target) { + player.addMark("xiyan_buff", 4, false); + player.addTempSkill("xiyan_buff"); + delete player.getStat("skill").yuanyu; event.finish(); + } else { + player + .chooseBool( + "夕颜:是否令" + + get.translation(target) + + "本回合的手牌上限-4且不能使用基本牌?" + ) + .set("ai", function () { + return _status.event.bool; + }) + .set("bool", get.attitude(player, target) < 0); } - else{ - player.chooseBool('夕颜:是否令'+get.translation(target)+'本回合的手牌上限-4且不能使用基本牌?').set('ai',function(){ - return _status.event.bool; - }).set('bool',get.attitude(player,target)<0); - } - 'step 2' - if(result.bool){ - var target=_status.currentPhase; - target.addMark('xiyan_debuff',4,false); - target.addTempSkill('xiyan_debuff'); + ("step 2"); + if (result.bool) { + var target = _status.currentPhase; + target.addMark("xiyan_debuff", 4, false); + target.addTempSkill("xiyan_debuff"); } }, - subSkill:{ - buff:{ - charlotte:true, - mark:true, - marktext:" + ", - intro:{ - content:"本回合手牌上限+#且使用牌无次数限制", + subSkill: { + buff: { + charlotte: true, + mark: true, + marktext: " + ", + intro: { + content: "本回合手牌上限+#且使用牌无次数限制", }, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('xiyan_buff'); + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("xiyan_buff"); }, - cardUsable:function(card,player){ + cardUsable: function (card, player) { return Infinity; }, }, - sub:true, + sub: true, }, - debuff:{ - charlotte:true, - mark:true, - marktext:" - ", - intro:{ - content:"本回合手牌上限-#且不能使用基本牌", + debuff: { + charlotte: true, + mark: true, + marktext: " - ", + intro: { + content: "本回合手牌上限-#且不能使用基本牌", }, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('xiyan_debuff'); + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("xiyan_debuff"); }, - cardEnabled:function(card){ - if(get.type(card)=='basic') return false; + cardEnabled: function (card) { + if (get.type(card) == "basic") return false; }, - cardSavable:function(card){ - if(get.type(card)=='basic') return false; + cardSavable: function (card) { + if (get.type(card) == "basic") return false; }, }, - sub:true, + sub: true, }, }, - ai:{ - combo:'yuanyu' - } + ai: { + combo: "yuanyu", + }, }, //滕胤 - chenjian:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - prompt2:function(event,player){ - return '亮出牌堆顶的'+get.cnNumber(3+player.countMark('chenjian'))+'张牌,然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌'; + chenjian: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + prompt2: function (event, player) { + return ( + "亮出牌堆顶的" + + get.cnNumber(3 + player.countMark("chenjian")) + + "张牌,然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌" + ); }, - content:function(){ - 'step 0' - var cards=get.cards(3+player.countMark('chenjian')); - event.cards=cards; - player.showCards(cards,get.translation(player)+'发动了【陈见】'); - 'step 1' - var list=[]; - if(player.countCards('he',i=>{ - return lib.filter.cardDiscardable(i,player,'chenjian'); - })) list.push('选项一'); - if(event.cards.some(i=>{ - return player.hasUseTarget(i); - })) list.push('选项二'); - if(list.length===1) event._result={control:list[0]}; - else if(list.length>1) player.chooseControl(list).set('choiceList',[ - '弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌', - '使用'+get.translation(event.cards)+'中的一张牌' - ]).set('prompt','陈见:请选择一项').set('ai',()=>{ - let player=_status.event.player,cards=_status.event.getParent().cards; - if(cards.some(i=>{ - return player.getUseValue(i)>0; - })) return '选项二'; - return '选项一'; - }); - else event.finish(); - 'step 2' - event.goon=0; - event.choosed=result.control; - if(result.control==='cancel2') event.finish(); - else if(result.control==='选项二') event.goto(6); - 'step 3' - if(player.countCards('he',i=>{ - return lib.filter.cardDiscardable(i,player,'chenjian'); - })) player.chooseToDiscard('he',!event.goon).set('ai',function(card){ - let evt=_status.event.getParent(), - val=event.goon&&evt.player.countMark('chenjian')<2?0:-get.value(card), - suit=get.suit(card); - for(let i of evt.cards){ - if(get.suit(i,false)==suit) val+=get.value(i,'raw'); - } - return val; - }).set('prompt','陈见:'+(event.goon?'是否':'请')+'弃置一张牌,然后令一名角色获得'+get.translation(event.cards)+'中花色与之相同的牌'+(event.goon?'?':'')); - else if(event.choosed==='选项一') event.goto(6); - else event.finish(); - 'step 4' - if(result.bool){ - event.goon++; - var suit=get.suit(result.cards[0],player); - var cards2=event.cards.filter(function(i){ - return get.suit(i,false)==suit; - }); - if(cards2.length){ - event.cards2=cards2; - player.chooseTarget(true,'选择一名角色获得'+get.translation(cards2)).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0){ - return att+Math.max(0,5-target.countCards('h')); - } - return att; + content: function () { + "step 0"; + var cards = get.cards(3 + player.countMark("chenjian")); + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【陈见】"); + ("step 1"); + var list = []; + if ( + player.countCards("he", (i) => { + return lib.filter.cardDiscardable(i, player, "chenjian"); + }) + ) + list.push("选项一"); + if ( + event.cards.some((i) => { + return player.hasUseTarget(i); + }) + ) + list.push("选项二"); + if (list.length === 1) event._result = { control: list[0] }; + else if (list.length > 1) + player + .chooseControl(list) + .set("choiceList", [ + "弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌", + "使用" + get.translation(event.cards) + "中的一张牌", + ]) + .set("prompt", "陈见:请选择一项") + .set("ai", () => { + let player = _status.event.player, + cards = _status.event.getParent().cards; + if ( + cards.some((i) => { + return player.getUseValue(i) > 0; + }) + ) + return "选项二"; + return "选项一"; }); - } - else if(event.choosed==='选项一') event.goto(6); - else event.goto(8); - } else event.finish(); - 'step 5' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(event.cards2,'gain2'); + ("step 2"); + event.goon = 0; + event.choosed = result.control; + if (result.control === "cancel2") event.finish(); + else if (result.control === "选项二") event.goto(6); + ("step 3"); + if ( + player.countCards("he", (i) => { + return lib.filter.cardDiscardable(i, player, "chenjian"); + }) + ) + player + .chooseToDiscard("he", !event.goon) + .set("ai", function (card) { + let evt = _status.event.getParent(), + val = + event.goon && evt.player.countMark("chenjian") < 2 + ? 0 + : -get.value(card), + suit = get.suit(card); + for (let i of evt.cards) { + if (get.suit(i, false) == suit) val += get.value(i, "raw"); + } + return val; + }) + .set( + "prompt", + "陈见:" + + (event.goon ? "是否" : "请") + + "弃置一张牌,然后令一名角色获得" + + get.translation(event.cards) + + "中花色与之相同的牌" + + (event.goon ? "?" : "") + ); + else if (event.choosed === "选项一") event.goto(6); + else event.finish(); + ("step 4"); + if (result.bool) { + event.goon++; + var suit = get.suit(result.cards[0], player); + var cards2 = event.cards.filter(function (i) { + return get.suit(i, false) == suit; + }); + if (cards2.length) { + event.cards2 = cards2; + player + .chooseTarget(true, "选择一名角色获得" + get.translation(cards2)) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }); + } else if (event.choosed === "选项一") event.goto(6); + else event.goto(8); + } else event.finish(); + ("step 5"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(event.cards2, "gain2"); event.cards.removeArray(event.cards2); } - if(event.choosed==='选项二') event.goto(8); - 'step 6' - var cards2=cards.filter(function(i){ + if (event.choosed === "选项二") event.goto(8); + ("step 6"); + var cards2 = cards.filter(function (i) { return player.hasUseTarget(i); }); - if(cards2.length) player.chooseButton(['陈见:'+(event.goon?'是否':'请')+'使用其中一张牌'+(event.goon?'?':''),cards2],!event.goon).set('ai',function(button){ - return player.getUseValue(button.link); - }); - else if(event.choosed==='选项二') event.goto(3); + if (cards2.length) + player + .chooseButton( + [ + "陈见:" + + (event.goon ? "是否" : "请") + + "使用其中一张牌" + + (event.goon ? "?" : ""), + cards2, + ], + !event.goon + ) + .set("ai", function (button) { + return player.getUseValue(button.link); + }); + else if (event.choosed === "选项二") event.goto(3); else event.finish(); - 'step 7' - if(result.bool){ - player.chooseUseTarget(true,result.links[0],false); + ("step 7"); + if (result.bool) { + player.chooseUseTarget(true, result.links[0], false); event.cards.removeArray(result.links); - event.goon+=2; - if(event.choosed==='选项二') event.goto(3); - } - else event.finish(); - 'step 8' - if(event.goon>2){ - if(player.countMark('chenjian')<2) player.addMark('chenjian',1,false); - player.recast(player.getCards('h',lib.filter.cardRecastable)); + event.goon += 2; + if (event.choosed === "选项二") event.goto(3); + } else event.finish(); + ("step 8"); + if (event.goon > 2) { + if (player.countMark("chenjian") < 2) player.addMark("chenjian", 1, false); + player.recast(player.getCards("h", lib.filter.cardRecastable)); } }, - marktext:'见', - intro:{content:'展示牌数量+#'}, + marktext: "见", + intro: { content: "展示牌数量+#" }, }, - xixiu:{ - mod:{ - canBeDiscarded:function(card,player,target){ - if(player!=target&&get.position(card)=='e'&&target.countCards('e')==1) return false; + xixiu: { + mod: { + canBeDiscarded: function (card, player, target) { + if (player != target && get.position(card) == "e" && target.countCards("e") == 1) + return false; }, }, - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - if(player==event.player||!player.countCards('e')) return false; - var suit=get.suit(event.card,false); - if(suit=='none') return false; - return player.hasCard(function(card){ - return get.suit(card,player)==suit; - },'e'); + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (player == event.player || !player.countCards("e")) return false; + var suit = get.suit(event.card, false); + if (suit == "none") return false; + return player.hasCard(function (card) { + return get.suit(card, player) == suit; + }, "e"); }, - content:function(){ + content: function () { player.draw(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(typeof card=='object'&&player!=target){ - var suit=get.suit(card); - if(suit=='none') return; - if(player.hasCard(function(card){ - return get.suit(card,player)==suit; - },'e')) return [1,0.08]; + ai: { + effect: { + target: function (card, player, target) { + if (typeof card == "object" && player != target) { + var suit = get.suit(card); + if (suit == "none") return; + if ( + player.hasCard(function (card) { + return get.suit(card, player) == suit; + }, "e") + ) + return [1, 0.08]; } }, }, }, }, //张嫙 - tongli:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - if(!event.isFirstTarget||(event.card.storage&&event.card.storage.tongli)) return false; - var type=get.type(event.card); - if(type!='basic'&&type!='trick') return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - var num1=player.getHistory('useCard',function(evtx){ - if(evtx.getParent('phaseUse')!=evt) return false; - return !evtx.card.storage||!evtx.card.storage.tongli; + tongli: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget || (event.card.storage && event.card.storage.tongli)) + return false; + var type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var num1 = player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") != evt) return false; + return !evtx.card.storage || !evtx.card.storage.tongli; }).length; - if(hs.length (att>-2?1.6:1)) return 'cancel2'; - } - let list = lib.suit.slice(0); - if(att <= 0 && target.getStorage('huguan_add')) for(let i of target.getStorage('huguan_add')){ - if (list.includes(i)) return i; - } - list.removeArray(target.getStorage('huguan_add')); - if(list.length) return list.randomGet(); - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - var target=trigger.player; - player.logSkill('huguan',target); - game.log(player,'选择了','#g'+get.translation(result.control),'花色') - target.addTempSkill('huguan_add'); - target.markAuto('huguan_add',[result.control]); + content: function () { + "step 0"; + player + .chooseControl(lib.suit, "cancel2") + .set("prompt", get.prompt("huguan", trigger.player)) + .set("prompt2", "令某种花色的手牌不计入其本回合的手牌上限") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player, + att = get.attitude(player, target); + if (att <= 0) { + if ( + !player.hasSkill("yaopei") || + player.hasHistory("useSkill", function (evt) { + return evt.skill == "huguan" && evt.targets.includes(target); + }) || + target.needsToDiscard() - + target.needsToDiscard(-target.countCards("h") / 4) > + (att > -2 ? 1.6 : 1) + ) + return "cancel2"; + } + let list = lib.suit.slice(0); + if (att <= 0 && target.getStorage("huguan_add")) + for (let i of target.getStorage("huguan_add")) { + if (list.includes(i)) return i; + } + list.removeArray(target.getStorage("huguan_add")); + if (list.length) return list.randomGet(); + return "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("huguan", target); + game.log(player, "选择了", "#g" + get.translation(result.control), "花色"); + target.addTempSkill("huguan_add"); + target.markAuto("huguan_add", [result.control]); } }, - subSkill:{ - add:{ - charlotte:true, - onremove:true, - mod:{ - ignoredHandcard:function(card,player){ - if(player.getStorage('huguan_add').includes(get.suit(card,player))) return true; + subSkill: { + add: { + charlotte: true, + onremove: true, + mod: { + ignoredHandcard: function (card, player) { + if (player.getStorage("huguan_add").includes(get.suit(card, player))) + return true; + }, + cardDiscardable: function (card, player, name) { + if ( + name == "phaseDiscard" && + player.getStorage("huguan_add").includes(get.suit(card, player)) + ) + return false; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&player.getStorage('huguan_add').includes(get.suit(card,player))) return false; - } }, - intro:{content:'本回合$花色的牌不计入手牌上限'}, + intro: { content: "本回合$花色的牌不计入手牌上限" }, }, - all:{ - mod:{ - aiValue:function(player, card, num){ - if(player && player.storage.huguan_all > 0 && get.itemtype(card) == 'card' && get.color(card, player) == 'red') return num + player.storage.huguan_all; - } + all: { + mod: { + aiValue: function (player, card, num) { + if ( + player && + player.storage.huguan_all > 0 && + get.itemtype(card) == "card" && + get.color(card, player) == "red" + ) + return num + player.storage.huguan_all; + }, }, - trigger:{ - player:['phaseUseBegin', 'useCard'] + trigger: { + player: ["phaseUseBegin", "useCard"], }, - filter:function(event, player){ - if(event.name === 'useCard') return player.storage.huguan_all; + filter: function (event, player) { + if (event.name === "useCard") return player.storage.huguan_all; return true; }, - silent:true, - charlotte:true, - content:function(){ - 'step 0' - if(trigger.name === 'useCard'){ + silent: true, + charlotte: true, + content: function () { + "step 0"; + if (trigger.name === "useCard") { player.storage.huguan_all = 0; event.finish(); } - 'step 1' + ("step 1"); let num = -157; - game.countPlayer(function (current){ - if(current.hasSkill('huguan')) num = Math.max(num, get.attitude(_status.event.player, current)); + game.countPlayer(function (current) { + if (current.hasSkill("huguan")) + num = Math.max(num, get.attitude(_status.event.player, current)); }, true); - if(num === -157) game.removeGlobalSkill('huguan_all'); - else if(num === 0) player.storage.huguan_all = 6; - else if(num > 0) player.storage.huguan_all = 9; - } - } + if (num === -157) game.removeGlobalSkill("huguan_all"); + else if (num === 0) player.storage.huguan_all = 6; + else if (num > 0) player.storage.huguan_all = 9; + }, + }, }, }, - yaopei:{ - audio:2, - trigger:{global:'phaseDiscardEnd'}, - direct:true, - filter:function(event,player){ - if(player==event.player||!event.player.isIn()) return false; - if(!player.hasAllHistory('useSkill',function(evt){ - return evt.skill=='huguan'&&evt.targets.includes(event.player); - })) return false; - var suits=[]; - event.player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event){ - for(var i of evt.cards2) suits.add(get.suit(i,evt.hs.includes(i)?evt.player:false)); + yaopei: { + audio: 2, + trigger: { global: "phaseDiscardEnd" }, + direct: true, + filter: function (event, player) { + if (player == event.player || !event.player.isIn()) return false; + if ( + !player.hasAllHistory("useSkill", function (evt) { + return evt.skill == "huguan" && evt.targets.includes(event.player); + }) + ) + return false; + var suits = []; + event.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) { + for (var i of evt.cards2) + suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false)); } }); - if(suits.length>=lib.suit.length) return false; - if(_status.connectMode&&player.countCards('h')>0) return true; - return player.hasCard(function(card){ + if (suits.length >= lib.suit.length) return false; + if (_status.connectMode && player.countCards("h") > 0) return true; + return player.hasCard(function (card) { return !suits.includes(get.suit(card)); - },'he'); + }, "he"); }, - content:function(){ - 'step 0' - var suits=[]; - trigger.player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger){ - for(var i of evt.cards2) suits.add(get.suit(i,evt.hs.includes(i)?evt.player:false)); + content: function () { + "step 0"; + var suits = []; + trigger.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) { + for (var i of evt.cards2) + suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false)); } }); player.chooseCardTarget({ - prompt:get.prompt('yaopei',trigger.player), - prompt2:'操作提示:选择要弃置的牌,并选择执行摸牌选项的角色,另一名角色执行回复体力的选项。', - suits:suits, - position:'he', - filterCard:function(card,player){ - return !_status.event.suits.includes(get.suit(card))&&lib.filter.cardDiscardable(card,player,'yaopei'); + prompt: get.prompt("yaopei", trigger.player), + prompt2: + "操作提示:选择要弃置的牌,并选择执行摸牌选项的角色,另一名角色执行回复体力的选项。", + suits: suits, + position: "he", + filterCard: function (card, player) { + return ( + !_status.event.suits.includes(get.suit(card)) && + lib.filter.cardDiscardable(card, player, "yaopei") + ); }, - filterTarget:function(card,player,target){ - return target==player||target==_status.event.getTrigger().player; + filterTarget: function (card, player, target) { + return target == player || target == _status.event.getTrigger().player; }, - ai1:function(card){ - let player = _status.event.player, source = _status.event.getTrigger().player; - if(get.attitude(player, source) > 0 && (get.recoverEffect(player, player, player) > 0 || get.recoverEffect(source, player, player) > 0)) return 12 - get.value(card); + ai1: function (card) { + let player = _status.event.player, + source = _status.event.getTrigger().player; + if ( + get.attitude(player, source) > 0 && + (get.recoverEffect(player, player, player) > 0 || + get.recoverEffect(source, player, player) > 0) + ) + return 12 - get.value(card); return 8 - get.value(card); }, - ai2:function(target){ - let player = _status.event.player, source = _status.event.getTrigger().player; + ai2: function (target) { + let player = _status.event.player, + source = _status.event.getTrigger().player; let recoverer = player === target ? source : player; - if(recoverer.isHealthy()) return get.attitude(player, target); - let att = get.attitude(player, recoverer), rec = get.recoverEffect(recoverer, player, player); - if(rec > 0) return Math.abs(att) + get.attitude(player, target); + if (recoverer.isHealthy()) return get.attitude(player, target); + let att = get.attitude(player, recoverer), + rec = get.recoverEffect(recoverer, player, player); + if (rec > 0) return Math.abs(att) + get.attitude(player, target); return 0; - } + }, }); - 'step 1' - if(result.bool){ - var target=trigger.player; - player.logSkill('yaopei',target); + ("step 1"); + if (result.bool) { + var target = trigger.player; + player.logSkill("yaopei", target); player.discard(result.cards); - if(player==result.targets[0]){ - if(target.isDamaged()&&target.hptarget.hp)&&(get.mode()!='identity'||player.identity!='nei')) player.addExpose(0.15); + } else { + if ( + (player.isHealthy() || player.hp > target.hp) && + (get.mode() != "identity" || player.identity != "nei") + ) + player.addExpose(0.15); target.draw(2); player.recover(); } } }, }, - mingluan:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&event.player.isIn()&&player.hasSkill('mingluan_mark')&&player.countCards('he')>0; + mingluan: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.isIn() && + player.hasSkill("mingluan_mark") && + player.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - let he = player.getCards('he'), + content: function () { + "step 0"; + let he = player.getCards("he"), disval = 0, dis = 0, spare = 30, use = true; - for(let i of he){ + for (let i of he) { let val = get.value(i, player); - if(val < 6 && get.position(i) == 'h'){ + if (val < 6 && get.position(i) == "h") { dis++; disval += val; - } - else if(val < spare) spare = val; + } else if (val < spare) spare = val; } - if(!dis){ + if (!dis) { dis = 1; disval = spare; spare = -1; } - let draw = Math.min(trigger.player.countCards('h'), 5 + dis - player.countCards('h')); - if(6 * draw < disval) use = false; - player.chooseToDiscard('he',get.prompt('mingluan'),'弃置任意张牌,并摸等同于'+get.translation(trigger.player)+'手牌数的牌(至多摸至五张)',[1,Infinity]).set('ai',function(card){ - let val = get.value(card, player); - if(val < 0 && card.name !== 'du') return 30; - if(!_status.event.use) return 0; - if(ui.selected.cards.length){ - if (get.position(card) !== 'h') return 0; - return 6 - val; - } - if(_status.event.spare < 0 || get.position(card) === 'h') return 30 - val; - return 0; - }).set('spare',spare).set('use',use).logSkill=['mingluan',trigger.player]; - 'step 1' - if(result.bool){ - var num=trigger.player.countCards('h'),num2=5-player.countCards('h'); - if(num>0&&num2>0) player.draw(Math.min(num,num2)); + let draw = Math.min(trigger.player.countCards("h"), 5 + dis - player.countCards("h")); + if (6 * draw < disval) use = false; + player + .chooseToDiscard( + "he", + get.prompt("mingluan"), + "弃置任意张牌,并摸等同于" + + get.translation(trigger.player) + + "手牌数的牌(至多摸至五张)", + [1, Infinity] + ) + .set("ai", function (card) { + let val = get.value(card, player); + if (val < 0 && card.name !== "du") return 30; + if (!_status.event.use) return 0; + if (ui.selected.cards.length) { + if (get.position(card) !== "h") return 0; + return 6 - val; + } + if (_status.event.spare < 0 || get.position(card) === "h") return 30 - val; + return 0; + }) + .set("spare", spare) + .set("use", use).logSkill = ["mingluan", trigger.player]; + ("step 1"); + if (result.bool) { + var num = trigger.player.countCards("h"), + num2 = 5 - player.countCards("h"); + if (num > 0 && num2 > 0) player.draw(Math.min(num, num2)); } }, - group:'mingluan_count', - subSkill:{ - count:{ - charlotte:true, - trigger:{global:'recoverEnd'}, - silent:true, - popup:false, - firstDo:true, - filter:function(event,player){ - var current=_status.currentPhase; - return current&¤t!=player&&!player.hasSkill('mingluan_mark'); + group: "mingluan_count", + subSkill: { + count: { + charlotte: true, + trigger: { global: "recoverEnd" }, + silent: true, + popup: false, + firstDo: true, + filter: function (event, player) { + var current = _status.currentPhase; + return current && current != player && !player.hasSkill("mingluan_mark"); }, - content:function(){ - player.addTempSkill('mingluan_mark'); + content: function () { + player.addTempSkill("mingluan_mark"); }, }, - mark:{ - charlotte:true, + mark: { + charlotte: true, }, }, }, //赵嫣 - jinhui:{ - audio:2, - enable:'phaseUse', - usable:1, - content:function(){ - 'step 0' - var cards=[]; - while(cards.length<3){ - var card=get.cardPile2(function(card){ - for(var i of cards){ - if(i.name==card.name) return false; + jinhui: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + var cards = []; + while (cards.length < 3) { + var card = get.cardPile2(function (card) { + for (var i of cards) { + if (i.name == card.name) return false; } - var info=get.info(card,false); - if(info.ai&&info.ai.tag&&info.ai.tag.damage) return false; - return !info.notarget&&(info.toself||info.singleCard||!info.selectTarget||info.selectTarget==1); + var info = get.info(card, false); + if (info.ai && info.ai.tag && info.ai.tag.damage) return false; + return ( + !info.notarget && + (info.toself || + info.singleCard || + !info.selectTarget || + info.selectTarget == 1) + ); }); - if(card) cards.push(card); + if (card) cards.push(card); else break; } - if(!cards.length) event.finish(); - else{ - player.showCards(cards,get.translation(player)+'发动了【锦绘】'); - event.cards=cards; + if (!cards.length) event.finish(); + else { + player.showCards(cards, get.translation(player) + "发动了【锦绘】"); + event.cards = cards; game.cardsGotoOrdering(cards); - if(game.hasPlayer((current)=>(current!=player))) player.chooseTarget('选择【锦绘】的目标',true,lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,cards=_status.event.getParent().cards.slice(0); - var max_effect=0,max_effect_player=0; - for(var i of cards){ - var targetx=lib.skill.jinhui.getUsableTarget(i,target,player); - if(targetx){ - var effect2=get.effect(targetx,i,target,target); - var effect3=get.effect(targetx,i,target,player); - if(effect2>max_effect){ - max_effect=effect2; - max_effect_player=effect3; + if (game.hasPlayer((current) => current != player)) + player + .chooseTarget("选择【锦绘】的目标", true, lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.getParent().cards.slice(0); + var max_effect = 0, + max_effect_player = 0; + for (var i of cards) { + var targetx = lib.skill.jinhui.getUsableTarget(i, target, player); + if (targetx) { + var effect2 = get.effect(targetx, i, target, target); + var effect3 = get.effect(targetx, i, target, player); + if (effect2 > max_effect) { + max_effect = effect2; + max_effect_player = effect3; + } + } } - } - } - return max_effect_player; - }); + return max_effect_player; + }); else event.finish(); } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - var cards=cards.filter(function(card){ - return lib.skill.jinhui.getUsableTarget(card,target,player); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var cards = cards.filter(function (card) { + return lib.skill.jinhui.getUsableTarget(card, target, player); }); - if(cards.length){ - if(cards.length==1) event._result={bool:true,links:cards}; - else target.chooseButton(['选择按“锦绘”规则使用一张牌',cards],true).set('ai',function(button){ - var player=_status.event.player,target=_status.event.getParent().player,card=button.link; - var targetx=lib.skill.jinhui.getUsableTarget(card,player,target); - var effect=get.effect(targetx,card,player,player),cards=_status.event.getParent().cards.slice(0); - var effect2=0,effect3=0; - cards.remove(button.link); - for(var i of cards){ - var targetx=lib.skill.jinhui.getUsableTarget(i,target,player); - if(targetx){ - effect2+=get.effect(targetx,i,target,target); - effect3+=get.effect(targetx,i,target,player); - } - } - if(effect2>0) effect+=effect3; - return effect; - }); - } - else event.goto(3); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.links[0]; + if (cards.length) { + if (cards.length == 1) event._result = { bool: true, links: cards }; + else + target + .chooseButton(["选择按“锦绘”规则使用一张牌", cards], true) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().player, + card = button.link; + var targetx = lib.skill.jinhui.getUsableTarget(card, player, target); + var effect = get.effect(targetx, card, player, player), + cards = _status.event.getParent().cards.slice(0); + var effect2 = 0, + effect3 = 0; + cards.remove(button.link); + for (var i of cards) { + var targetx = lib.skill.jinhui.getUsableTarget(i, target, player); + if (targetx) { + effect2 += get.effect(targetx, i, target, target); + effect3 += get.effect(targetx, i, target, player); + } + } + if (effect2 > 0) effect += effect3; + return effect; + }); + } else event.goto(3); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.links[0]; event.cards.remove(card); - var targetx=lib.skill.jinhui.getUsableTarget(card,target,player); - target.useCard(card,targetx,false,'noai'); + var targetx = lib.skill.jinhui.getUsableTarget(card, target, player); + target.useCard(card, targetx, false, "noai"); } - 'step 3' - var cards=cards.filter(function(card){ - return lib.skill.jinhui.getUsableTarget(card,player,target); + ("step 3"); + var cards = cards.filter(function (card) { + return lib.skill.jinhui.getUsableTarget(card, player, target); }); - if(cards.length){ - player.chooseButton(['是否按“锦绘”规则使用其中一张牌?',cards]).set('ai',function(button){ - var player=_status.event.player,target=_status.event.getParent().target; - var card=button.link,targetx=lib.skill.jinhui.getUsableTarget(card,player,target); - return get.effect(targetx,card,player,player) - }); - } - else event.finish(); - 'step 4' - if(result.bool){ - var card=result.links[0]; + if (cards.length) { + player + .chooseButton(["是否按“锦绘”规则使用其中一张牌?", cards]) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + var card = button.link, + targetx = lib.skill.jinhui.getUsableTarget(card, player, target); + return get.effect(targetx, card, player, player); + }); + } else event.finish(); + ("step 4"); + if (result.bool) { + var card = result.links[0]; cards.remove(card); - var targetx=lib.skill.jinhui.getUsableTarget(card,player,target); - if(targetx){ - player.useCard(card,targetx,false,'noai'); + var targetx = lib.skill.jinhui.getUsableTarget(card, player, target); + if (targetx) { + player.useCard(card, targetx, false, "noai"); } - if(cards.length) event.goto(3); - } - else event.finish(); + if (cards.length) event.goto(3); + } else event.finish(); }, - getUsableTarget:function(card,player,target){ - var info=get.info(card,false); - if(info.toself) return player.canUse(card,player,false)?player:false; - return (target.isIn()&&player.canUse(card,target,false))?target:false; + getUsableTarget: function (card, player, target) { + var info = get.info(card, false); + if (info.toself) return player.canUse(card, player, false) ? player : false; + return target.isIn() && player.canUse(card, target, false) ? target : false; }, - ai:{ - order:5, - result:{player:1}, + ai: { + order: 5, + result: { player: 1 }, }, }, - qingman:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - if(!event.player.isIn()) return false; - var num=player.countCards('h'); - if(num>=5) return false; - var num2=0; - for(var i=1;i<=5;i++){ - num2+=event.player.countEmptySlot(i); + qingman: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + if (!event.player.isIn()) return false; + var num = player.countCards("h"); + if (num >= 5) return false; + var num2 = 0; + for (var i = 1; i <= 5; i++) { + num2 += event.player.countEmptySlot(i); } - return num0){ - event.num=Math.ceil(th/2); - var list=[ - '本回合不能使用手牌,然后'+str+'摸两张牌', - '展示所有手牌,并将其中一种花色的所有牌交给'+str, - '弃置'+get.cnNumber(event.num)+'张手牌', + content: function () { + "step 0"; + var target = trigger.source, + str = get.translation(player); + event.target = target; + var th = target.countCards("h"); + if (th > 0) { + event.num = Math.ceil(th / 2); + var list = [ + "本回合不能使用手牌,然后" + str + "摸两张牌", + "展示所有手牌,并将其中一种花色的所有牌交给" + str, + "弃置" + get.cnNumber(event.num) + "张手牌", ]; - target.chooseControl().set('choiceList',list).set('ai',function(){ - return get.rand(0,2); - }); - } - else event._result={index:0}; - 'step 1' - switch(result.index){ + target + .chooseControl() + .set("choiceList", list) + .set("ai", function () { + return get.rand(0, 2); + }); + } else event._result = { index: 0 }; + ("step 1"); + switch (result.index) { case 0: - target.addTempSkill('yachai_block'); + target.addTempSkill("yachai_block"); player.draw(2); event.finish(); break; - case 1:target.showHandcards();break; - case 2:event.goto(4);break; + case 1: + target.showHandcards(); + break; + case 2: + event.goto(4); + break; } - 'step 2' - var map={},hs=target.getCards('h'); - for(var i of hs){ - map[get.suit(i,target)]=true; + ("step 2"); + var map = {}, + hs = target.getCards("h"); + for (var i of hs) { + map[get.suit(i, target)] = true; } - var list=[]; - for(var i of lib.suit){ - if(map[i]) list.push(i); + var list = []; + for (var i of lib.suit) { + if (map[i]) list.push(i); } - if(!list.length) event.finish(); - else if(list.length==1) event._result={control:list[0]}; - else target.chooseControl(list).set('prompt','将一种花色的牌交给'+get.translation(player)); - 'step 3' - var cards=target.getCards('h',function(card){ - return get.suit(card,target)==result.control&&lib.filter.cardDiscardable(card,target,'yachai'); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else + target + .chooseControl(list) + .set("prompt", "将一种花色的牌交给" + get.translation(player)); + ("step 3"); + var cards = target.getCards("h", function (card) { + return ( + get.suit(card, target) == result.control && + lib.filter.cardDiscardable(card, target, "yachai") + ); }); - if(cards.length) target.give(cards,player,'give'); + if (cards.length) target.give(cards, player, "give"); event.finish(); - 'step 4' - target.chooseToDiscard('h',true,num); + ("step 4"); + target.chooseToDiscard("h", true, num); }, - subSkill:{ - block:{ - mark:true, - intro:{content:'不能使用手牌'}, - charlotte:true, - mod:{ - cardEnabled:function(card,player){ - let hs=player.getCards('h'),cards=[card]; - if(Array.isArray(card.cards)) cards.addArray(card.cards); - for(let i of cards){ - if(hs.includes(i)) return false; + subSkill: { + block: { + mark: true, + intro: { content: "不能使用手牌" }, + charlotte: true, + mod: { + cardEnabled: function (card, player) { + let hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (let i of cards) { + if (hs.includes(i)) return false; } }, - cardSavable:function(card,player){ - let hs=player.getCards('h'),cards=[card]; - if(Array.isArray(card.cards)) cards.addArray(card.cards); - for(let i of cards){ - if(hs.includes(i)) return false; + cardSavable: function (card, player) { + let hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (let i of cards) { + if (hs.includes(i)) return false; } }, }, }, }, }, - qingtan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer((current)=>current.countCards('h')>0); + qingtan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => current.countCards("h") > 0); }, - filterTarget:function(card,player,target){ - return target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target.countCards("h") > 0; }, - selectTarget:-1, - multitarget:true, - multiline:true, - content:function(){ - 'step 0' + selectTarget: -1, + multitarget: true, + multiline: true, + content: function () { + "step 0"; targets.sortBySeat(); - var next=player.chooseCardOL(targets,'请选择要展示的牌',true).set('ai',function(card){ - return -get.value(card); - }).set('source',player); - next.aiCard=function(target){ - var hs=target.getCards('h'); - return {bool:true,cards:[hs.randomGet()]}; + var next = player + .chooseCardOL(targets, "请选择要展示的牌", true) + .set("ai", function (card) { + return -get.value(card); + }) + .set("source", player); + next.aiCard = function (target) { + var hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; }; - next._args.remove('glow_result'); - 'step 1' - var cards=[]; - event.videoId=lib.status.videoId++; - for(var i=0;i'+get.translation(targetsx)+''); + dialog.push('
    ' + get.translation(targetsx) + "
    "); dialog.push(map[suit]); list.push(suit); } } - if(list.length) player.chooseControl(list,'cancel2').set('dialog',dialog).set('list',list).set('map',map).set('ai',function(){ - let max=0,res='cancel2'; - for(let s of _status.event.list){ - let temp=0; - for(let i of _status.event.map[s]){ - temp+=get.value(i,_status.event.player)+get.sgn(get.attitude(_status.event.player,get.owner(i)))*(6-get.value(i,get.owner(i))); - } - for(let i in _status.event.map){ - if(i===s) continue; - for(let j of _status.event.map[i]){ - temp-=get.sgn(get.attitude(_status.event.player,get.owner(j)))*get.value(j,get.owner(j)); + if (list.length) + player + .chooseControl(list, "cancel2") + .set("dialog", dialog) + .set("list", list) + .set("map", map) + .set("ai", function () { + let max = 0, + res = "cancel2"; + for (let s of _status.event.list) { + let temp = 0; + for (let i of _status.event.map[s]) { + temp += + get.value(i, _status.event.player) + + get.sgn(get.attitude(_status.event.player, get.owner(i))) * + (6 - get.value(i, get.owner(i))); + } + for (let i in _status.event.map) { + if (i === s) continue; + for (let j of _status.event.map[i]) { + temp -= + get.sgn(get.attitude(_status.event.player, get.owner(j))) * + get.value(j, get.owner(j)); + } + } + if (temp > max) { + res = s; + max = temp; + } } - } - if(temp>max){ - res=s; - max=temp; - } - } - return res; - }); + return res; + }); else event.finish(); - 'step 3' - if(result.control!='cancel2'){ - event.cards2=cards.filter(function(i){ - return get.suit(i)==result.control; - }) - for(var i=0;i0&&target!=player&&target.countGainableCards(player,'h')>0; + weimeng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.hp > 0 && target != player && target.countGainableCards(player, "h") > 0; }, - content:function(){ - 'step 0' - player.gainPlayerCard(target,'h',true,[1,player.hp]); - 'step 1' - if(result.bool&&target.isIn()){ - var num=result.cards.length,hs=player.getCards('he'); - var numx=0; - for(var i of result.cards) numx+=get.number(i,player); - event.num=numx; - event.cards=result.cards; - if(!hs.length) event.finish(); - else if(hs.length<=num) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,'选择交给'+get.translation(target)+get.cnNumber(num)+'张牌','(已得到牌的点数和:'+numx+')',num); - } - else event.finish(); - 'step 2' - player.give(result.cards,target); - var numx=0; - for(var i of result.cards) numx+=get.number(i,player); - if(numx>num) player.draw(); - else if(numx num) player.draw(); + else if (numx < num) player.discardPlayerCard(target, true, "hej"); }, - ai:{ - order:6, - tag:{ - lose:1, - loseCard:1, - gain:1, + ai: { + order: 6, + tag: { + lose: 1, + loseCard: 1, + gain: 1, }, - result:{ - target:function(player,target){ - return -Math.pow(Math.min(player.hp,target.countCards('h')),2)/4; + result: { + target: function (player, target) { + return -Math.pow(Math.min(player.hp, target.countCards("h")), 2) / 4; }, }, }, }, //冯熙 - yusui:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return event.player!=player&&event.player.isIn()&&get.color(event.card)=='black'; + yusui: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return event.player != player && event.player.isIn() && get.color(event.card) == "black"; }, - logTarget:'player', - check:function(event,player){ - var target=event.player; - if(player.hp<3||get.attitude(player,target)>-3) return false; - if(player.hp3) return true; + logTarget: "player", + check: function (event, player) { + var target = event.player; + if (player.hp < 3 || get.attitude(player, target) > -3) return false; + if (player.hp < target.hp) return true; + if (Math.min(target.countCards("h") - player.countCards("h"), target.countCards("h")) > 3) + return true; return false; }, - preHidden:true, - content:function(){ - 'step 0' + preHidden: true, + content: function () { + "step 0"; player.loseHp(); - event.target=trigger.player; - 'step 1' - event.addIndex=0; - var list=[],num=target.countCards('h')-player.countCards('h'); - event.num=num; - if(num>0&&target.countCards('h')>0) list.push('令其弃置'+get.cnNumber(num)+'张手牌'); + event.target = trigger.player; + ("step 1"); + event.addIndex = 0; + var list = [], + num = target.countCards("h") - player.countCards("h"); + event.num = num; + if (num > 0 && target.countCards("h") > 0) + list.push("令其弃置" + get.cnNumber(num) + "张手牌"); else event.addIndex++; - if(target.hp>player.hp) list.push('令其失去'+get.cnNumber(target.hp-player.hp)+'点体力'); - if(!list.length) event.finish(); - else if(list.length==1) event._result={index:0}; - else player.chooseControl().set('choiceList',list).set('prompt','令'+get.translation(target)+'执行一项').set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target; - return (target.hp-player.hp)>(Math.min(_status.event.getParent().num,target.countCards('h'))/2)?1:0; - }); - 'step 2' - if(result.index+event.addIndex==0) target.chooseToDiscard(num,true,'h'); - else target.loseHp(target.hp-player.hp); + if (target.hp > player.hp) + list.push("令其失去" + get.cnNumber(target.hp - player.hp) + "点体力"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl() + .set("choiceList", list) + .set("prompt", "令" + get.translation(target) + "执行一项") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + return target.hp - player.hp > + Math.min(_status.event.getParent().num, target.countCards("h")) / 2 + ? 1 + : 0; + }); + ("step 2"); + if (result.index + event.addIndex == 0) target.chooseToDiscard(num, true, "h"); + else target.loseHp(target.hp - player.hp); }, }, - boyan:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player; + boyan: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; }, - content:function(){ - 'step 0' - target.drawTo(Math.min(5,target.maxHp)); - 'step 1' - target.addTempSkill('boyan_block'); + content: function () { + "step 0"; + target.drawTo(Math.min(5, target.maxHp)); + ("step 1"); + target.addTempSkill("boyan_block"); }, - subSkill:{ - block:{ - mark:true, - intro:{content:'不能使用或打出手牌'}, - charlotte:true, - mod:{ - cardEnabled2:function(card){ - if(get.position(card)=='h') return false; + subSkill: { + block: { + mark: true, + intro: { content: "不能使用或打出手牌" }, + charlotte: true, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; }, }, }, }, - ai:{ - order:4, - result:{ - target:function(player,target){ - if(get.attitude(player,target)>0) return Math.max(0,Math.min(5,target.maxHp)-target.countCards('h')); - if(Math.max(0,Math.min(5,target.maxHp)-target.countCards('h'))<=1&&target.countCards('h','shan')&&!target.hasSkillTag('respondShan',true,null,true)&&player.countCards('h',function(card){ - return get.tag(card,'respondShan')&&player.getUseValue(card,null,true)>0&&get.effect(target,card,player,player)>0; - })) return -2; + ai: { + order: 4, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0) + return Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")); + if ( + Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")) <= 1 && + target.countCards("h", "shan") && + !target.hasSkillTag("respondShan", true, null, true) && + player.countCards("h", function (card) { + return ( + get.tag(card, "respondShan") && + player.getUseValue(card, null, true) > 0 && + get.effect(target, card, player, player) > 0 + ); + }) + ) + return -2; }, }, }, }, //祢衡 - rekuangcai:{ - audio:2, - forced:true, - trigger:{player:'phaseDiscardBegin'}, - filter:function(event,player){ - return !player.getHistory('useCard').length||!player.getHistory('sourceDamage').length; + rekuangcai: { + audio: 2, + forced: true, + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return !player.getHistory("useCard").length || !player.getHistory("sourceDamage").length; }, - content:function(){ - lib.skill.rekuangcai.change(player,player.getHistory('useCard').length?-1:1); + content: function () { + lib.skill.rekuangcai.change(player, player.getHistory("useCard").length ? -1 : 1); }, - mod:{ - targetInRange:function(card,player){ - if(player==_status.currentPhase) return true; + mod: { + targetInRange: function (card, player) { + if (player == _status.currentPhase) return true; }, - cardUsable:function(card,player){ - if(player==_status.currentPhase) return Infinity; + cardUsable: function (card, player) { + if (player == _status.currentPhase) return Infinity; }, }, - change:function(player,num){ - if(typeof player.storage.rekuangcai_change!='number') player.storage.rekuangcai_change=0; - player.storage.rekuangcai_change+=num; - player.addSkill('rekuangcai_change'); + change: function (player, num) { + if (typeof player.storage.rekuangcai_change != "number") + player.storage.rekuangcai_change = 0; + player.storage.rekuangcai_change += num; + player.addSkill("rekuangcai_change"); }, - group:'rekuangcai_draw', - subSkill:{ - draw:{ - audio:'rekuangcai', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player.getHistory('sourceDamage').length>0; + group: "rekuangcai_draw", + subSkill: { + draw: { + audio: "rekuangcai", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.getHistory("sourceDamage").length > 0; }, - content:function(){ - player.draw(Math.min(5,player.getStat('damage'))); + content: function () { + player.draw(Math.min(5, player.getStat("damage"))); }, }, - change:{ - mod:{ - maxHandcard:function(player,num){ - if(typeof player.storage.rekuangcai_change=='number') return num+player.storage.rekuangcai_change; + change: { + mod: { + maxHandcard: function (player, num) { + if (typeof player.storage.rekuangcai_change == "number") + return num + player.storage.rekuangcai_change; }, }, - charlotte:true, - mark:true, - intro:{ - content:(num)=>('手牌上限'+(num<0?'':'+')+num), + charlotte: true, + mark: true, + intro: { + content: (num) => "手牌上限" + (num < 0 ? "" : "+") + num, }, }, }, }, - reshejian:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - if(player==event.player||event.targets.length!=1) return false; - return player.countCards('h')>=2; + reshejian: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + if (player == event.player || event.targets.length != 1) return false; + return player.countCards("h") >= 2; }, - usable:2, + usable: 2, async cost(event, trigger, player) { - event.result = await player.chooseToDiscard('he', [2, Infinity], get.prompt('reshejian', trigger.player), '
    弃置至少两张手牌,然后选择一项:
    ⒈弃置其等量的牌。⒉对其造成1点伤害。
    ').set('ai', function (card) { - if (_status.event.goon && ui.selected.cards.length < 2) return 5.6 - get.value(card); - return 0; - }, 'chooseonly').set('goon', function () { - var target = trigger.player; - if (get.damageEffect(target, player, player) > 0) return true; - if (target.countCards('he', function (card) { - return get.value(card, target) > 6; - }) >= 2) return true; - return false; - }()).forResult(); + event.result = await player + .chooseToDiscard( + "he", + [2, Infinity], + get.prompt("reshejian", trigger.player), + '
    弃置至少两张手牌,然后选择一项:
    ⒈弃置其等量的牌。⒉对其造成1点伤害。
    ' + ) + .set( + "ai", + function (card) { + if (_status.event.goon && ui.selected.cards.length < 2) + return 5.6 - get.value(card); + return 0; + }, + "chooseonly" + ) + .set( + "goon", + (function () { + var target = trigger.player; + if (get.damageEffect(target, player, player) > 0) return true; + if ( + target.countCards("he", function (card) { + return get.value(card, target) > 6; + }) >= 2 + ) + return true; + return false; + })() + ) + .forResult(); }, - logTarget: 'player', + logTarget: "player", content: function () { - 'step 0' + "step 0"; player.discard(cards); - 'step 1' + ("step 1"); var num = cards.length; event.num = num; - var target = targets[0], str = get.translation(target); + var target = targets[0], + str = get.translation(target); event.target = target; if (!target.isIn()) event.finish(); - else if (!target.hasCard(function (card) { - return lib.filter.canBeDiscarded(card, player, target); - }, 'he')) event._result = { index: 1 }; - else player.chooseControl().set('choiceList', [ - '弃置' + str + '的' + get.cnNumber(num) + '张牌', - '对' + str + '造成1点伤害', - ]).set('ai', function () { - var player = _status.event.player; - var eff0 = get.effect(target, { name: 'guohe_copy2' }, player, player) * Math.min(1.7, target.countCards('he')); - var eff1 = get.damageEffect(target, player, player); - return eff0 > eff1 ? 0 : 1; - }); - 'step 2' - if (result.index == 0) player.discardPlayerCard(target, num, true, 'he'); + else if ( + !target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ) + event._result = { index: 1 }; + else + player + .chooseControl() + .set("choiceList", [ + "弃置" + str + "的" + get.cnNumber(num) + "张牌", + "对" + str + "造成1点伤害", + ]) + .set("ai", function () { + var player = _status.event.player; + var eff0 = + get.effect(target, { name: "guohe_copy2" }, player, player) * + Math.min(1.7, target.countCards("he")); + var eff1 = get.damageEffect(target, player, player); + return eff0 > eff1 ? 0 : 1; + }); + ("step 2"); + if (result.index == 0) player.discardPlayerCard(target, num, true, "he"); else target.damage(); }, }, //陈登 - refuyuan:{ - audio:2, - trigger:{global:'useCardToTargeted'}, - logTarget:'target', - filter:function(event,player){ - return event.card.name=='sha'&&event.target.isIn()&&!game.hasPlayer2(function(current){ - return current.hasHistory('useCard',function(evt){ - return evt.card!=event.card&&get.color(evt.card,false)=='red'&&evt.targets&&evt.targets.includes(event.target); - }); - }); + refuyuan: { + audio: 2, + trigger: { global: "useCardToTargeted" }, + logTarget: "target", + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.target.isIn() && + !game.hasPlayer2(function (current) { + return current.hasHistory("useCard", function (evt) { + return ( + evt.card != event.card && + get.color(evt.card, false) == "red" && + evt.targets && + evt.targets.includes(event.target) + ); + }); + }) + ); }, - check:function(event,player){ - return get.attitude(player,event.target)>0; + check: function (event, player) { + return get.attitude(player, event.target) > 0; }, - content:function(){ + content: function () { trigger.target.draw(); }, }, - reyingshui:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0&&game.hasPlayer((current)=>player.inRange(current)); + reyingshui: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && game.hasPlayer((current) => player.inRange(current)) + ); }, - position:'he', - filterCard:true, - filterTarget:function(card,player,target){ + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { return player.inRange(target); }, - discard:false, - lose:false, - delay:false, - check:function(card){ - if(get.type(card)=='equip') return 3-get.value(card); - return 6.5-get.value(card); + discard: false, + lose: false, + delay: false, + check: function (card) { + if (get.type(card) == "equip") return 3 - get.value(card); + return 6.5 - get.value(card); }, - content:function(){ - 'step 0' - player.give(cards,target); - 'step 1' - var next=target.chooseCard('he',[2,Infinity],'交给'+get.translation(player)+'至少两张装备牌,否则受到1点伤害',{type:'equip'}); - if(get.damageEffect(target,player,target)>=0) next.set('ai',()=>-1); - else next.set('ai',(card)=>ui.selected.cards.length<2?(6-get.value(card)):0); - 'step 2' - if(result.bool) target.give(result.cards,player); - else target.damage('nocard'); + content: function () { + "step 0"; + player.give(cards, target); + ("step 1"); + var next = target.chooseCard( + "he", + [2, Infinity], + "交给" + get.translation(player) + "至少两张装备牌,否则受到1点伤害", + { type: "equip" } + ); + if (get.damageEffect(target, player, target) >= 0) next.set("ai", () => -1); + else next.set("ai", (card) => (ui.selected.cards.length < 2 ? 6 - get.value(card) : 0)); + ("step 2"); + if (result.bool) target.give(result.cards, player); + else target.damage("nocard"); }, - ai:{ - order:5, - tag:{ - damage:0.5, + ai: { + order: 5, + tag: { + damage: 0.5, }, - result:{ - target:-1.5, + result: { + target: -1.5, }, }, }, - rewangzu:{ - audio:2, - trigger:{player:'damageBegin1'}, - filter:function(event,player){ - return event.source&&player!=event.source&&player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'rewangzu'),'h'); + rewangzu: { + audio: 2, + trigger: { player: "damageBegin1" }, + filter: function (event, player) { + return ( + event.source && + player != event.source && + player.hasCard((card) => lib.filter.cardDiscardable(card, player, "rewangzu"), "h") + ); }, - usable:1, + usable: 1, async cost(event, trigger, player) { - 'step 0' + "step 0"; var num = player.getFriends().length; - if (!game.hasPlayer(function (current) { - return current != player && current.getFriends().length > num; - })) { - player.chooseToDiscard('h', get.prompt('rewangzu'), '弃置一张牌并令伤害-1', 'chooseonly').set('ai', function (card) { - return 7 - get.value(card); - }); + if ( + !game.hasPlayer(function (current) { + return current != player && current.getFriends().length > num; + }) + ) { + player + .chooseToDiscard( + "h", + get.prompt("rewangzu"), + "弃置一张牌并令伤害-1", + "chooseonly" + ) + .set("ai", function (card) { + return 7 - get.value(card); + }); + } else { + player.chooseBool(get.prompt("rewangzu"), "随机弃置一张牌并令伤害-1"); } - else { - player.chooseBool(get.prompt('rewangzu'), '随机弃置一张牌并令伤害-1'); - } - 'step 1' + ("step 1"); event.result = result; }, async content(event, trigger, player) { trigger.num--; if (!event.cards || !event.cards.length) { - const cards = player.getCards('h', (card) => lib.filter.cardDiscardable(card, player, 'rewangzu')); + const cards = player.getCards("h", (card) => + lib.filter.cardDiscardable(card, player, "rewangzu") + ); if (cards.length) player.discard(cards.randomGet()); - } - else { + } else { player.discard(event.cards); } }, }, //万年公主 - zhenge:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhenge'),'令一名角色的攻击范围+1').set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target) - if(att>0){ - if(!target.hasMark('zhenge_effect')) att*=1.5; - if(!game.hasPlayer(function(current){ - return get.distance(target,current,'attack')>2; - })){ - var usf=Math.max.apply(Math,game.filterPlayer().map(function(current){ - if(target.canUse('sha',current,false)) return get.effect(current,{name:'sha'},target,player); - return 0; - })); - return att+usf; + zhenge: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("zhenge"), "令一名角色的攻击范围+1") + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) { + if (!target.hasMark("zhenge_effect")) att *= 1.5; + if ( + !game.hasPlayer(function (current) { + return get.distance(target, current, "attack") > 2; + }) + ) { + var usf = Math.max.apply( + Math, + game.filterPlayer().map(function (current) { + if (target.canUse("sha", current, false)) + return get.effect(current, { name: "sha" }, target, player); + return 0; + }) + ); + return att + usf; + } + return att; } - return att; - } - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('zhenge',target); - target.addSkill('zhenge_effect'); - if(target.countMark('zhenge_effect')<5) target.addMark('zhenge_effect',1,false); - if(!game.hasPlayer(function(current){ - return current!=target&&!target.inRange(current); - })){ - player.chooseTarget('是否令'+get.translation(target)+'视为对另一名角色使用【杀】?',function(card,player,target){ - return _status.event.source.canUse('sha',target); - }).set('source',target).set('ai',function(target){ - var evt=_status.event; - return get.effect(target,{name:'sha'},evt.source,evt.player); - }); - } - else{ + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhenge", target); + target.addSkill("zhenge_effect"); + if (target.countMark("zhenge_effect") < 5) target.addMark("zhenge_effect", 1, false); + if ( + !game.hasPlayer(function (current) { + return current != target && !target.inRange(current); + }) + ) { + player + .chooseTarget( + "是否令" + get.translation(target) + "视为对另一名角色使用【杀】?", + function (card, player, target) { + return _status.event.source.canUse("sha", target); + } + ) + .set("source", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + } else { game.delayx(); event.finish(); } + } else event.finish(); + ("step 2"); + if (result.bool) { + target.useCard({ name: "sha", isCard: true }, result.targets[0], false); } - else event.finish(); - 'step 2' - if(result.bool){ - target.useCard({name:'sha',isCard:true},result.targets[0],false); - } - 'step 3' + ("step 3"); game.delayx(); }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - mod:{ - attackRange:function(player,num){ - return num+player.countMark('zhenge_effect'); + subSkill: { + effect: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("zhenge_effect"); }, }, - intro:{content:'攻击范围+#'}, + intro: { content: "攻击范围+#" }, }, }, }, - xinghan:{ - audio:2, - init:function(player){ - player.addSkill('xinghan_count'); + xinghan: { + audio: 2, + init: function (player) { + player.addSkill("xinghan_count"); }, - onremove:function(player){ - player.removeSkill('xinghan_count'); + onremove: function (player) { + player.removeSkill("xinghan_count"); }, - trigger:{global:'damageSource'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card==player.storage.xinghan_temp&&event.source&&event.source.hasMark('zhenge_effect'); + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + return ( + event.card && + event.card == player.storage.xinghan_temp && + event.source && + event.source.hasMark("zhenge_effect") + ); }, - logTarget:'source', - content:function(){ - player.draw(player.isMaxHandcard(true)?1:Math.min(5,trigger.source.getAttackRange())); + logTarget: "source", + content: function () { + player.draw( + player.isMaxHandcard(true) ? 1 : Math.min(5, trigger.source.getAttackRange()) + ); }, - subSkill:{ - count:{ - trigger:{global:'useCard1'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - filter:function(event,player){ - return event.card.name=='sha'&&!game.hasPlayer2(function(current){ - return current.hasHistory('useCard',function(evt){ - return evt!=event&&evt.card.name=='sha'; + subSkill: { + count: { + trigger: { global: "useCard1" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + !game.hasPlayer2(function (current) { + return current.hasHistory("useCard", function (evt) { + return evt != event && evt.card.name == "sha"; + }); }) - }); + ); }, - content:function(){ - player.addTempSkill('xinghan_temp'); - player.storage.xinghan_temp=trigger.card; + content: function () { + player.addTempSkill("xinghan_temp"); + player.storage.xinghan_temp = trigger.card; }, }, - temp:{onremove:true}, + temp: { onremove: true }, }, - ai:{combo:'zhenge'}, + ai: { combo: "zhenge" }, }, //荀谌 - refenglve:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasSkillTag('noCompareSource')&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0&&!current.hasSkillTag('noCompareTarget'); - }); + refenglve: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + !player.hasSkillTag("noCompareSource") && + game.hasPlayer(function (current) { + return ( + current != player && + current.countCards("h") > 0 && + !current.hasSkillTag("noCompareTarget") + ); + }) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0&&!target.hasSkillTag('noCompareTarget'); + filterTarget: function (card, player, target) { + return ( + target != player && + target.countCards("h") > 0 && + !target.hasSkillTag("noCompareTarget") + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - if(!target.countCards('hej')) event.finish(); - else{ - event.giver=target; - event.gainner=player; - target.choosePlayerCard(target,true,'hej',2,'交给'+get.translation(player)+'两张牌'); + ("step 1"); + if (result.bool) { + if (!target.countCards("hej")) event.finish(); + else { + event.giver = target; + event.gainner = player; + target.choosePlayerCard( + target, + true, + "hej", + 2, + "交给" + get.translation(player) + "两张牌" + ); } - } - else if(result.tie){ - delete player.getStat('skill').refenglve; + } else if (result.tie) { + delete player.getStat("skill").refenglve; event.finish(); - } - else{ - if(get.position(result.player,true)=='d') target.gain(result.player,'gain2'); + } else { + if (get.position(result.player, true) == "d") target.gain(result.player, "gain2"); event.finish(); /*if(!player.countCards('he')) event.finish(); else{ @@ -10572,415 +13185,500 @@ game.import('character', function () { player.chooseCard(true,'he','交给'+get.translation(target)+'一张牌'); }*/ } - 'step 2' - if(result.bool) event.giver.give(result.cards,event.gainner); + ("step 2"); + if (result.bool) event.giver.give(result.cards, event.gainner); }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(!player.hasCard(function(card){ - if(get.position(card)!="h") return false; - var val=get.value(card); - if(val<0) return true; - if(val<=5){ - return card.number>=11; - } - if(val<=6){ - return card.number>=13; - } - return false; - })) return 0; - return -Math.sqrt(1+target.countCards('he'))/(1+target.countCards('j')); + ai: { + order: 8, + result: { + target: function (player, target) { + if ( + !player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 11; + } + if (val <= 6) { + return card.number >= 13; + } + return false; + }) + ) + return 0; + return -Math.sqrt(1 + target.countCards("he")) / (1 + target.countCards("j")); }, }, }, }, - anyong:{ - audio:2, - trigger:{global:'damageSource'}, - direct:true, - filter:function(event,player){ - return event.source&&event.source==_status.currentPhase&&event.num==1&& - event.player!=event.source&&event.player.isIn()&&player.countCards('he')>0&& - event.source.getHistory('sourceDamage',function(evt){ - return evt.player!=event.source; - }).indexOf(event)==0; + anyong: { + audio: 2, + trigger: { global: "damageSource" }, + direct: true, + filter: function (event, player) { + return ( + event.source && + event.source == _status.currentPhase && + event.num == 1 && + event.player != event.source && + event.player.isIn() && + player.countCards("he") > 0 && + event.source + .getHistory("sourceDamage", function (evt) { + return evt.player != event.source; + }) + .indexOf(event) == 0 + ); }, - content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('anyong',trigger.player),'弃置一张牌并对其造成1点伤害').set('goon',get.damageEffect(trigger.player,player,player)>0).set('ai',function(card){ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).logSkill=['anyong',trigger.player]; - 'step 1' - if(result.bool) trigger.player.damage(); + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + get.prompt("anyong", trigger.player), + "弃置一张牌并对其造成1点伤害" + ) + .set("goon", get.damageEffect(trigger.player, player, player) > 0) + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }).logSkill = ["anyong", trigger.player]; + ("step 1"); + if (result.bool) trigger.player.damage(); }, }, //刘永 - zhuning:{ - audio:2, - enable:'phaseUse', - usable:2, - filter:function(event,player){ - if(!player.countCards('he')) return false; - return (!player.getStat('skill').zhuning||player.hasSkill('zhuning_double')); + zhuning: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if (!player.countCards("he")) return false; + return !player.getStat("skill").zhuning || player.hasSkill("zhuning_double"); }, - filterCard:true, - position:'he', - filterTarget:lib.filter.notMe, - selectCard:[1,Infinity], - delay:false, - lose:false, - discard:false, - check:function(card){ - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - var player=get.owner(card); - if(ui.selected.cards.length>=Math.max(1,player.countCards('h')-player.hp)) return 0; - return 10-get.value(card); + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + delay: false, + lose: false, + discard: false, + check: function (card) { + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + var player = get.owner(card); + if (ui.selected.cards.length >= Math.max(1, player.countCards("h") - player.hp)) return 0; + return 10 - get.value(card); }, - content:function(){ - 'step 0' - player.give(cards,target).gaintag.add('fengxiang_tag'); - 'step 1' - var list=[]; - for(var name of lib.inpile){ - var type=get.type(name); - if(type!='basic'&&type!='trick') continue; - var card={name:name,isCard:true}; - if(get.tag(card,'damage')>0&&player.hasUseTarget(card)){ - list.push([type,'',name]); + content: function () { + "step 0"; + player.give(cards, target).gaintag.add("fengxiang_tag"); + ("step 1"); + var list = []; + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "basic" && type != "trick") continue; + var card = { name: name, isCard: true }; + if (get.tag(card, "damage") > 0 && player.hasUseTarget(card)) { + list.push([type, "", name]); } - if(name=='sha'){ - for(var i of lib.inpile_nature){ - card.nature=i; - if(player.hasUseTarget(card)) list.push([type,'',name,i]); + if (name == "sha") { + for (var i of lib.inpile_nature) { + card.nature = i; + if (player.hasUseTarget(card)) list.push([type, "", name, i]); } } } - if(list.length){ - player.chooseButton(['是否视为使用一张伤害牌?',[list,'vcard']]).set('ai',function(button){ - return _status.event.player.getUseValue({name:button.link[2]}); - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.chooseUseTarget({name:result.links[0][2],nature:result.links[0][3],isCard:true},true,false); - } - else event.finish(); - 'step 3' - if(!player.hasHistory('sourceDamage',function(evt){ - if(!evt.card) return false; - var evtx=evt.getParent('useCard'); - return evtx.card==evt.card&&evtx.getParent(2)==event; - })) player.addTempSkill('zhuning_double'); + if (list.length) { + player + .chooseButton(["是否视为使用一张伤害牌?", [list, "vcard"]]) + .set("ai", function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.chooseUseTarget( + { name: result.links[0][2], nature: result.links[0][3], isCard: true }, + true, + false + ); + } else event.finish(); + ("step 3"); + if ( + !player.hasHistory("sourceDamage", function (evt) { + if (!evt.card) return false; + var evtx = evt.getParent("useCard"); + return evtx.card == evt.card && evtx.getParent(2) == event; + }) + ) + player.addTempSkill("zhuning_double"); }, - subSkill:{ - double:{}, + subSkill: { + double: {}, }, - ai:{ - fireAttack:true, - order:4, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; + ai: { + fireAttack: true, + order: 4, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; return -10; } - if(target.hasJudge('lebu')) return 0; - var nh=target.countCards('h'); - var np=player.countCards('h'); - if(player.hp==player.maxHp||player.storage.rerende<0||player.countCards('h')<=1){ - if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; + if (target.hasJudge("lebu")) return 0; + var nh = target.countCards("h"); + var np = player.countCards("h"); + if ( + player.hp == player.maxHp || + player.storage.rerende < 0 || + player.countCards("h") <= 1 + ) { + if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; } - return Math.max(1,5-nh); - } + return Math.max(1, 5 - nh); + }, }, - } + }, }, - fengxiang:{ - getMax:function(event){ - var max=0,max2=null,players=game.filterPlayer(); - for(var current of players){ - var num=0,cards=current.getCards('h',function(card){ - return card.hasGaintag('fengxiang_tag'); - }); - if(event){ - if(event.name=='gain'&&event.gaintag.includes('fengxiang_tag')) cards.removeArray(event.cards); - var evt=event.getl(current); - if(evt&&evt.gaintag_map){ - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('fengxiang_tag')) num++; + fengxiang: { + getMax: function (event) { + var max = 0, + max2 = null, + players = game.filterPlayer(); + for (var current of players) { + var num = 0, + cards = current.getCards("h", function (card) { + return card.hasGaintag("fengxiang_tag"); + }); + if (event) { + if (event.name == "gain" && event.gaintag.includes("fengxiang_tag")) + cards.removeArray(event.cards); + var evt = event.getl(current); + if (evt && evt.gaintag_map) { + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("fengxiang_tag")) num++; } } } - num+=cards.length; - if(num>max){ - max=num; - max2=current; - } - else if(num==max) max2=null; + num += cards.length; + if (num > max) { + max = num; + max2 = current; + } else if (num == max) max2 = null; } return max2; }, - audio:2, - init:function(player){ - game.addGlobalSkill('fengxiang_use'); + audio: 2, + init: function (player) { + game.addGlobalSkill("fengxiang_use"); }, - onremove:function(player){ - if(!game.hasPlayer(current=>current.hasSkill('fengxiang'),true)) game.removeGlobalSkill('fengxiang_use'); + onremove: function (player) { + if (!game.hasPlayer((current) => current.hasSkill("fengxiang"), true)) + game.removeGlobalSkill("fengxiang_use"); }, - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - var target=lib.skill.fengxiang.getMax(); - return !target||target.isDamaged(); + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + var target = lib.skill.fengxiang.getMax(); + return !target || target.isDamaged(); }, - logTarget:function(event,player){ - return lib.skill.fengxiang.getMax()||player; + logTarget: function (event, player) { + return lib.skill.fengxiang.getMax() || player; }, - content:function(){ - var target=lib.skill.fengxiang.getMax(); - if(target) target.recover(); + content: function () { + var target = lib.skill.fengxiang.getMax(); + if (target) target.recover(); else player.draw(); }, - group:'fengxiang_draw', - subSkill:{ - draw:{ - trigger:{ - global:['equipAfter','addJudgeAfter','loseAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + group: "fengxiang_draw", + subSkill: { + draw: { + trigger: { + global: [ + "equipAfter", + "addJudgeAfter", + "loseAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter:function(event,player){ - if(event.name=='lose'&&event.getlx===false) return false; - return lib.skill.fengxiang.getMax()!=lib.skill.fengxiang.getMax(event); + forced: true, + filter: function (event, player) { + if (event.name == "lose" && event.getlx === false) return false; + return lib.skill.fengxiang.getMax() != lib.skill.fengxiang.getMax(event); }, - content:function(){ - if(trigger.delay===false) game.delayx(); + content: function () { + if (trigger.delay === false) game.delayx(); player.draw(); }, }, - use:{ - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&get.itemtype(card)==='card'&&card.hasGaintag('fengxiang_tag')&&game.hasPlayer(current=>{ - return current.hasSkill('fengxiang')&&get.attitude(player,current)>0; - })) return num+10; - } + use: { + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + get.itemtype(card) === "card" && + card.hasGaintag("fengxiang_tag") && + game.hasPlayer((current) => { + return ( + current.hasSkill("fengxiang") && get.attitude(player, current) > 0 + ); + }) + ) + return num + 10; + }, }, - trigger:{player:'dieAfter'}, - filter:function(event,player){ - return !game.hasPlayer(current=>current.hasSkill('fengxiang'),true); + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer((current) => current.hasSkill("fengxiang"), true); }, - silent:true, - forceDie:true, - charlotte:true, - content:function(){ - game.removeGlobalSkill('fengxiang_use'); - } - } + silent: true, + forceDie: true, + charlotte: true, + content: function () { + game.removeGlobalSkill("fengxiang_use"); + }, + }, }, }, //阚泽 - rekuanshi:{ - audio:'kuanshi', - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('rekuanshi')).set('animate',false).set('ai',function(target){ - var att=get.attitude(player,target); - if(target.hp<3) att/=1.5; - return att; - }); - 'step 1' - if(result.bool){ - player.logSkill('rekuanshi'); - player.addTempSkill('rekuanshi_effect',{player:'phaseBegin'}); - player.storage.rekuanshi_effect=result.targets[0]; + rekuanshi: { + audio: "kuanshi", + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rekuanshi")) + .set("animate", false) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (target.hp < 3) att /= 1.5; + return att; + }); + ("step 1"); + if (result.bool) { + player.logSkill("rekuanshi"); + player.addTempSkill("rekuanshi_effect", { player: "phaseBegin" }); + player.storage.rekuanshi_effect = result.targets[0]; game.delayx(); } }, - subSkill:{ - effect:{ - audio:'kuanshi', - mark:true, - intro:{ - content:'每回合限一次,当$于一回合内受到第2点伤害后,其回复1点体力。' + subSkill: { + effect: { + audio: "kuanshi", + mark: true, + intro: { + content: "每回合限一次,当$于一回合内受到第2点伤害后,其回复1点体力。", }, - trigger:{global:'damageEnd'}, - forced:true, - charlotte:true, - logTarget:'player', - usable:1, - filter:function(event,player){ - if(event.player!=player.storage.rekuanshi_effect||event.player.isHealthy()) return false; - var history=event.player.getHistory('damage',null,event),num=0; - for(var i of history) num+=i.num; - return num>1&&(num-event.num)<2; + trigger: { global: "damageEnd" }, + forced: true, + charlotte: true, + logTarget: "player", + usable: 1, + filter: function (event, player) { + if (event.player != player.storage.rekuanshi_effect || event.player.isHealthy()) + return false; + var history = event.player.getHistory("damage", null, event), + num = 0; + for (var i of history) num += i.num; + return num > 1 && num - event.num < 2; }, - content:function(){ + content: function () { trigger.player.recover(); - } + }, }, }, }, //吕玲绮 - guowu:{ - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.countCards('h')>0; + guowu: { + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; }, - preHidden:true, - content:function(){ - 'step 0' - var hs=player.getCards('h'); - player.showCards(hs,get.translation(player)+'发动了【帼舞】'); - var list=[]; - for(var i of hs){ - list.add(get.type2(i,player)); - if(list.length>=3) break; + preHidden: true, + content: function () { + "step 0"; + var hs = player.getCards("h"); + player.showCards(hs, get.translation(player) + "发动了【帼舞】"); + var list = []; + for (var i of hs) { + list.add(get.type2(i, player)); + if (list.length >= 3) break; } - if(list.length>=1){ - var card=get.discardPile(function(i){ - return i.name=='sha'; + if (list.length >= 1) { + var card = get.discardPile(function (i) { + return i.name == "sha"; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); } - if(list.length>=2) player.addTempSkill('guowu_dist','phaseUseAfter'); - if(list.length>=3) player.addTempSkill('guowu_add','phaseUseAfter'); + if (list.length >= 2) player.addTempSkill("guowu_dist", "phaseUseAfter"); + if (list.length >= 3) player.addTempSkill("guowu_add", "phaseUseAfter"); }, - subSkill:{ - dist:{ - charlotte:true, - mod:{targetInRange:()=>true}, + subSkill: { + dist: { + charlotte: true, + mod: { targetInRange: () => true }, }, - add:{ - charlotte:true, - trigger:{player:'useCard1'}, - direct:true, - filter:function(event,player){ - var info=get.info(event.card,false); - if(info.allowMultiple==false) return false; - if(event.card.name!='sha'&&(info.type!='trick'||get.mode()=='guozhan')) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })){ + add: { + charlotte: true, + trigger: { player: "useCard1" }, + direct: true, + filter: function (event, player) { + var info = get.info(event.card, false); + if (info.allowMultiple == false) return false; + if (event.card.name != "sha" && (info.type != "trick" || get.mode() == "guozhan")) + return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var num=game.countPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,player,current)&&lib.filter.targetInRange(trigger.card,player,current); + content: function () { + "step 0"; + var num = game.countPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, player, current) && + lib.filter.targetInRange(trigger.card, player, current) + ); }); - player.chooseTarget('帼舞:是否为'+get.translation(trigger.card)+'增加'+(num>1?'至多两个':'一个')+'目标?',[1,Math.min(2,num)],function(card,player,target){ - var trigger=_status.event.getTrigger(); - var card=trigger.card; - return !trigger.targets.includes(target)&&lib.filter.targetEnabled2(card,player,target)&&lib.filter.targetInRange(card,player,target); - }).set('ai',function(target){ - var player=_status.event.player; - var card=_status.event.getTrigger().card; - return get.effect(target,card,player,player); - }); - 'step 1' - if(result.bool){ - if(player!=game.me&&!player.isOnline()) game.delayx(); - } - else event.finish(); - 'step 2' - var targets=result.targets.sortBySeat(); - player.logSkill('guowu_add',targets); + player + .chooseTarget( + "帼舞:是否为" + + get.translation(trigger.card) + + "增加" + + (num > 1 ? "至多两个" : "一个") + + "目标?", + [1, Math.min(2, num)], + function (card, player, target) { + var trigger = _status.event.getTrigger(); + var card = trigger.card; + return ( + !trigger.targets.includes(target) && + lib.filter.targetEnabled2(card, player, target) && + lib.filter.targetInRange(card, player, target) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var card = _status.event.getTrigger().card; + return get.effect(target, card, player, player); + }); + ("step 1"); + if (result.bool) { + if (player != game.me && !player.isOnline()) game.delayx(); + } else event.finish(); + ("step 2"); + var targets = result.targets.sortBySeat(); + player.logSkill("guowu_add", targets); trigger.targets.addArray(targets); //if(get.mode()=='guozhan') player.removeSkill('guowu_add'); }, }, }, }, - zhuangrong:{ - derivation:['llqshenwei','wushuang'], - trigger:{global:'phaseEnd'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return player.hp==1||player.countCards('h')==1; + zhuangrong: { + derivation: ["llqshenwei", "wushuang"], + trigger: { global: "phaseEnd" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.hp == 1 || player.countCards("h") == 1; }, - content:function(){ - 'step 0' - player.awakenSkill('zhuangrong'); + content: function () { + "step 0"; + player.awakenSkill("zhuangrong"); player.loseMaxHp(); - 'step 1' - if(player.maxHp>player.hp) player.recover(player.maxHp-player.hp); - 'step 2' - player.drawTo(Math.min(5,player.maxHp)); - player.addSkills(['llqshenwei','wushuang']); + ("step 1"); + if (player.maxHp > player.hp) player.recover(player.maxHp - player.hp); + ("step 2"); + player.drawTo(Math.min(5, player.maxHp)); + player.addSkills(["llqshenwei", "wushuang"]); }, }, - llqshenwei:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:(event)=>!event.numFixed, - content:function(){ - trigger.num+=2; + llqshenwei: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: (event) => !event.numFixed, + content: function () { + trigger.num += 2; }, - mod:{ - maxHandcard:(player,num)=>num+2, + mod: { + maxHandcard: (player, num) => num + 2, }, }, - cuijian:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer((current)=>lib.skill.cuijian.filterTarget(null,player,current)); + cuijian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => lib.skill.cuijian.filterTarget(null, player, current)); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - var hs=target.getCards('h','shan'); - if(hs.length){ - hs.addArray(target.getCards('he',function(card){ - return get.subtype(card)=='equip2'; - })) - player.gain(hs,target,'give','bySelf'); - if(player.hasMark('zhtongyuan_basic')) event.finish(); - else event.num=hs.length; - } - else{ - if(player.hasMark('zhtongyuan_trick')) player.draw(2); + content: function () { + "step 0"; + var hs = target.getCards("h", "shan"); + if (hs.length) { + hs.addArray( + target.getCards("he", function (card) { + return get.subtype(card) == "equip2"; + }) + ); + player.gain(hs, target, "give", "bySelf"); + if (player.hasMark("zhtongyuan_basic")) event.finish(); + else event.num = hs.length; + } else { + if (player.hasMark("zhtongyuan_trick")) player.draw(2); event.finish(); } - 'step 1' - var hs=player.getCards('he'); - if(!hs.length||!target.isIn()) event.finish(); - else if(hs.length<=num) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,'选择交给'+get.translation(target)+get.cnNumber(num)+'张牌',num); - 'step 2' - if(result.bool&&result.cards&&result.cards.length) player.give(result.cards,target); + ("step 1"); + var hs = player.getCards("he"); + if (!hs.length || !target.isIn()) event.finish(); + else if (hs.length <= num) event._result = { bool: true, cards: hs }; + else + player.chooseCard( + "he", + true, + "选择交给" + get.translation(target) + get.cnNumber(num) + "张牌", + num + ); + ("step 2"); + if (result.bool && result.cards && result.cards.length) player.give(result.cards, target); }, - ai:{ - order:4, - result:{ - player:function(player,target){ - if(!target.countCards('h','shan')) return player.hasMark('zhtongyuan_trick')?2:0; + ai: { + order: 4, + result: { + player: function (player, target) { + if (!target.countCards("h", "shan")) + return player.hasMark("zhtongyuan_trick") ? 2 : 0; return 0; }, - target:function(player,target){ - if(target.countCards('h','shan')){ - var num=-target.countCards('h')/2; - var card=target.getEquip(2); - if(card) num-=(get.value(card,target)/2); + target: function (player, target) { + if (target.countCards("h", "shan")) { + var num = -target.countCards("h") / 2; + var card = target.getEquip(2); + if (card) num -= get.value(card, target) / 2; return num; } return -0.01; @@ -10988,1403 +13686,1683 @@ game.import('character', function () { }, }, }, - tongyuan:{audio:2}, - zhtongyuan:{ - audio:'tongyuan', - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - filter:function(event,player){ - var type=get.type2(event.card,false); - return (type=='basic'||type=='trick')&&get.color(event.card,false)=='red'&&!player.hasMark('zhtongyuan_'+type); + tongyuan: { audio: 2 }, + zhtongyuan: { + audio: "tongyuan", + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + filter: function (event, player) { + var type = get.type2(event.card, false); + return ( + (type == "basic" || type == "trick") && + get.color(event.card, false) == "red" && + !player.hasMark("zhtongyuan_" + type) + ); }, - content:function(){ - var type=get.type2(trigger.card,false); - if(!player.hasMark('zhtongyuan_'+type)){ - player.addMark('zhtongyuan_'+type,1,false); - game.log(player,'修改了技能','#g【摧坚】'); + content: function () { + var type = get.type2(trigger.card, false); + if (!player.hasMark("zhtongyuan_" + type)) { + player.addMark("zhtongyuan_" + type, 1, false); + game.log(player, "修改了技能", "#g【摧坚】"); } }, - group:['zhtongyuan_basic','zhtongyuan_trick'], - subSkill:{ - basic:{ - trigger:{player:'useCard2'}, - direct:true, - locked:true, - filter:function(event,player){ - if(!player.hasMark('zhtongyuan_basic')||!player.hasMark('zhtongyuan_trick')) return false; - var card=event.card; - if(get.color(card,false)!='red'||get.type(card,null,true)!='basic') return false; - var info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current); - })){ + group: ["zhtongyuan_basic", "zhtongyuan_trick"], + subSkill: { + basic: { + trigger: { player: "useCard2" }, + direct: true, + locked: true, + filter: function (event, player) { + if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick")) + return false; + var card = event.card; + if (get.color(card, false) != "red" || get.type(card, null, true) != "basic") + return false; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加一个目标' - player.chooseTarget(get.prompt('zhtongyuan'),function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("zhtongyuan"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('zhtongyuan',event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("zhtongyuan", event.targets); trigger.targets.addArray(event.targets); } }, }, - trick:{ - audio:'zhtongyuan', - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(!player.hasMark('zhtongyuan_basic')||!player.hasMark('zhtongyuan_trick')) return false; - var card=event.card; - return (get.color(card,false)=='red'&&get.type(card,null,false)=='trick'); + trick: { + audio: "zhtongyuan", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick")) + return false; + var card = event.card; + return get.color(card, false) == "red" && get.type(card, null, false) == "trick"; }, - content:function(){ + content: function () { trigger.directHit.addArray(game.filterPlayer()); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); }, }, }, }, //陆郁生 - zhente:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - logTarget:'player', - usable:1, - preHidden:true, - filter:function(event,player){ - var color=get.color(event.card); - if(player==event.player||event.player.isDead()||color=='none'||(get.mode()=='guozhan'&&color!='black')) return false; - var type=get.type(event.card); - return type=='basic'||type=='trick'; + zhente: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + usable: 1, + preHidden: true, + filter: function (event, player) { + var color = get.color(event.card); + if ( + player == event.player || + event.player.isDead() || + color == "none" || + (get.mode() == "guozhan" && color != "black") + ) + return false; + var type = get.type(event.card); + return type == "basic" || type == "trick"; }, - check:function(event,player){ - return !event.excluded.includes(player)&&get.effect(player,event.card,event.player,player)<0; + check: function (event, player) { + return ( + !event.excluded.includes(player) && + get.effect(player, event.card, event.player, player) < 0 + ); }, - content:function(){ - 'step 0' - trigger.player.chooseControl().set('choiceList',[ - '本回合内不能再使用'+get.translation(get.color(trigger.card))+'牌', - '令'+get.translation(trigger.card)+'对'+get.translation(player)+'无效', - ]).set('prompt',get.translation(player)+'发动了【贞特】,请选择一项').set('ai',function(){ - var player=_status.event.player; - var target=_status.event.getParent().player; - var card=_status.event.getTrigger().card,color=get.color(card); - if(get.effect(target,card,player,player)<=0) return 1; - var hs=player.countCards('h',function(card){ - return get.color(card,player)==color&&player.hasValueTarget(card,null,true); + content: function () { + "step 0"; + trigger.player + .chooseControl() + .set("choiceList", [ + "本回合内不能再使用" + get.translation(get.color(trigger.card)) + "牌", + "令" + get.translation(trigger.card) + "对" + get.translation(player) + "无效", + ]) + .set("prompt", get.translation(player) + "发动了【贞特】,请选择一项") + .set("ai", function () { + var player = _status.event.player; + var target = _status.event.getParent().player; + var card = _status.event.getTrigger().card, + color = get.color(card); + if (get.effect(target, card, player, player) <= 0) return 1; + var hs = player.countCards("h", function (card) { + return ( + get.color(card, player) == color && + player.hasValueTarget(card, null, true) + ); + }); + if (!hs.length) return 0; + if (hs > 1) return 1; + return Math.random() > 0.5 ? 0 : 1; }); - if(!hs.length) return 0; - if(hs>1) return 1; - return Math.random()>0.5?0:1; - }); - 'step 1' - if(result.index==0){ - trigger.player.addTempSkill('zhente2'); + ("step 1"); + if (result.index == 0) { + trigger.player.addTempSkill("zhente2"); trigger.player.storage.zhente2.add(get.color(trigger.card)); - trigger.player.markSkill('zhente2'); - } - else trigger.excluded.add(player); + trigger.player.markSkill("zhente2"); + } else trigger.excluded.add(player); }, }, - zhente2:{ - mod:{ + zhente2: { + mod: { cardEnabled(card, player) { const color = get.color(card); - if (color != 'unsure' && player.getStorage('zhente2').includes(color)) return false; + if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false; }, - cardSavable(card,player) { + cardSavable(card, player) { const color = get.color(card); - if (color != 'unsure' && player.getStorage('zhente2').includes(color)) return false; + if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false; }, }, - charlotte:true, - onremove:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - intro:{content:'本回合内不能使用$牌'}, + intro: { content: "本回合内不能使用$牌" }, }, - zhiwei:{ - audio:2, - trigger:{ - player:['enterGame','showCharacterAfter','phaseBegin'], - global:['phaseBefore'], + zhiwei: { + audio: 2, + trigger: { + player: ["enterGame", "showCharacterAfter", "phaseBegin"], + global: ["phaseBefore"], }, - direct:true, - filter:function(event,player,name){ - if(player.hasSkill('zhiwei2')) return false; - if(!game.hasPlayer(current=>current!=player)) return false; - if(get.mode()=='guozhan') return event.name=='showCharacter'&&(event.toShow.includes('gz_luyusheng')||event.toShow.includes('luyusheng')); - return event.name!='showCharacter'&&(name!='phaseBefore'||game.phaseNumber==0); + direct: true, + filter: function (event, player, name) { + if (player.hasSkill("zhiwei2")) return false; + if (!game.hasPlayer((current) => current != player)) return false; + if (get.mode() == "guozhan") + return ( + event.name == "showCharacter" && + (event.toShow.includes("gz_luyusheng") || event.toShow.includes("luyusheng")) + ); + return event.name != "showCharacter" && (name != "phaseBefore" || game.phaseNumber == 0); }, - content:function(){ - 'step 0' - player.chooseTarget('请选择【至微】的目标','选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。',true,lib.filter.notMe).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0) return 1+att; - return Math.random(); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('zhiwei',target); - player.storage.zhiwei2=target; - player.addSkill('zhiwei2'); + content: function () { + "step 0"; + player + .chooseTarget( + "请选择【至微】的目标", + "选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。", + true, + lib.filter.notMe + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return 1 + att; + return Math.random(); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhiwei", target); + player.storage.zhiwei2 = target; + player.addSkill("zhiwei2"); } }, }, - zhiwei2:{ - group:['zhiwei2_draw','zhiwei2_discard','zhiwei2_gain','zhiwei2_clear'], - charlotte:true, - onremove:true, - mark:'character', - intro:{content:'$造成伤害后你摸一张牌;$受到伤害后你弃置一张牌;你于弃牌阶段弃置牌后交给$'}, - subSkill:{ - draw:{ - audio:'zhiwei', - trigger:{global:'damageSource'}, - forced:true, - filter:function(event,player){ - return event.source==player.storage.zhiwei2; + zhiwei2: { + group: ["zhiwei2_draw", "zhiwei2_discard", "zhiwei2_gain", "zhiwei2_clear"], + charlotte: true, + onremove: true, + mark: "character", + intro: { + content: "$造成伤害后你摸一张牌;$受到伤害后你弃置一张牌;你于弃牌阶段弃置牌后交给$", + }, + subSkill: { + draw: { + audio: "zhiwei", + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.source == player.storage.zhiwei2; }, - logTarget:'source', - content:function(){ + logTarget: "source", + content: function () { player.draw(); }, }, - discard:{ - audio:'zhiwei', - trigger:{global:'damageEnd'}, - forced:true, - filter:function(event,player){ - return event.player==player.storage.zhiwei2&&player.countCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'zhiwei2_discard'); - }); + discard: { + audio: "zhiwei", + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.player == player.storage.zhiwei2 && + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "zhiwei2_discard"); + }) + ); }, - logTarget:'player', - content:function(){ - player.discard(player.getCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'zhiwei2_discard'); - }).randomGet()); + logTarget: "player", + content: function () { + player.discard( + player + .getCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "zhiwei2_discard"); + }) + .randomGet() + ); }, }, - gain:{ - audio:'zhiwei', - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + gain: { + audio: "zhiwei", + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - forced:true, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false||event.getParent('phaseDiscard').player!=player||!player.storage.zhiwei2||!player.storage.zhiwei2.isIn()) return false; - var evt=event.getl(player); - return evt&&evt.cards2.filterInD('d').length>0; + forced: true, + filter: function (event, player) { + if ( + event.type != "discard" || + event.getlx === false || + event.getParent("phaseDiscard").player != player || + !player.storage.zhiwei2 || + !player.storage.zhiwei2.isIn() + ) + return false; + var evt = event.getl(player); + return evt && evt.cards2.filterInD("d").length > 0; }, - logTarget:function(event,player){ + logTarget: function (event, player) { return player.storage.zhiwei2; }, - content:function(){ - if(trigger.delay===false) game.delay(); - player.storage.zhiwei2.gain(trigger.getl(player).cards2.filterInD('d'),'gain2'); + content: function () { + if (trigger.delay === false) game.delay(); + player.storage.zhiwei2.gain(trigger.getl(player).cards2.filterInD("d"), "gain2"); }, }, - clear:{ - audio:'zhiwei', - trigger:{ - global:'die', - player:['hideCharacterEnd','removeCharacterEnd'], + clear: { + audio: "zhiwei", + trigger: { + global: "die", + player: ["hideCharacterEnd", "removeCharacterEnd"], }, - forced:true, - filter:function(event,player){ - if(event.name=='die') return event.player==player.storage.zhiwei2; - if(event.name=='removeCharacter') return event.toRemove=='luyusheng'||event.toRemove=='gz_luyusheng'; - return event.toHide=='luyusheng'||event.toHide=='gz_luyusheng'; + forced: true, + filter: function (event, player) { + if (event.name == "die") return event.player == player.storage.zhiwei2; + if (event.name == "removeCharacter") + return event.toRemove == "luyusheng" || event.toRemove == "gz_luyusheng"; + return event.toHide == "luyusheng" || event.toHide == "gz_luyusheng"; }, - content:function(){ - 'step 0' - player.removeSkill('zhiwei2'); - if(trigger.name!='die'||get.mode()!='guozhan') event.finish(); - 'step 1' - if(player.name1=='gz_luyusheng'||player.name1=='luyusheng') player.hideCharacter(0); - if(player.name2=='gz_luyusheng'||player.name2=='luyusheng') player.hideCharacter(1); + content: function () { + "step 0"; + player.removeSkill("zhiwei2"); + if (trigger.name != "die" || get.mode() != "guozhan") event.finish(); + ("step 1"); + if (player.name1 == "gz_luyusheng" || player.name1 == "luyusheng") + player.hideCharacter(0); + if (player.name2 == "gz_luyusheng" || player.name2 == "luyusheng") + player.hideCharacter(1); }, }, }, }, //华歆 - spwanggui:{ - audio:'wanggui', - trigger:{source:'damageSource'}, - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.group!=player.group; + spwanggui: { + audio: "wanggui", + trigger: { source: "damageSource" }, + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.group != player.group; }); }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt('spwanggui'),'对一名势力不同的其他角色造成1点伤害',function(card,player,target){ - return target.group!=player.group; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("spwanggui"), + "对一名势力不同的其他角色造成1点伤害", + function (card, player, target) { + return target.group != player.group; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .forResult(); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const target = event.targets[0]; target.damage(); }, - group:'spwanggui_draw', - subSkill:{ - draw:{ - trigger:{player:'damageEnd'}, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt('spwanggui'),'令自己摸一张牌,或和一名势力相同的其他角色各摸一张牌',function(card,player,target){ - return target.group==player.group; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target!=player) att*=2; - if(target.hasSkillTag('nogain')) att/=1.7; - return att; - }).forResult(); + group: "spwanggui_draw", + subSkill: { + draw: { + trigger: { player: "damageEnd" }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("spwanggui"), + "令自己摸一张牌,或和一名势力相同的其他角色各摸一张牌", + function (card, player, target) { + return target.group == player.group; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target != player) att *= 2; + if (target.hasSkillTag("nogain")) att /= 1.7; + return att; + }) + .forResult(); }, - content:function(){ - 'step 0' - var target=targets[0]; - if(player==target){ + content: function () { + "step 0"; + var target = targets[0]; + if (player == target) { player.draw(); event.finish(); - } - else{ - var list=[player,target].sortBySeat(); + } else { + var list = [player, target].sortBySeat(); game.asyncDraw(list); } - 'step 1' + ("step 1"); game.delayx(); }, }, }, }, - wanggui:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + wanggui: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - direct:true, - filter:function(event,player){ - return player.hasSkill('wanggui')&&!player.hasSkill('wanggui2'); + direct: true, + filter: function (event, player) { + return player.hasSkill("wanggui") && !player.hasSkill("wanggui2"); }, - preHidden:true, - content:function(){ - 'step 0' - player.addTempSkill('wanggui2'); - var bool=player.isUnseen(2); - if(bool){ - player.chooseTarget('望归:是否对一名势力不同的角色造成1点伤害?',function(card,player,target){ - return target.isEnemyOf(player); - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }).setHiddenSkill('wanggui'); - } - else event.goto(2); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('wanggui',target); + preHidden: true, + content: function () { + "step 0"; + player.addTempSkill("wanggui2"); + var bool = player.isUnseen(2); + if (bool) { + player + .chooseTarget( + "望归:是否对一名势力不同的角色造成1点伤害?", + function (card, player, target) { + return target.isEnemyOf(player); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .setHiddenSkill("wanggui"); + } else event.goto(2); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("wanggui", target); target.damage(); } event.finish(); - 'step 2' - player.chooseBool('望归:是否令所有与自己势力相同的角色各摸一张牌?').setHiddenSkill('wanggui'); - 'step 3' - if(result.bool){ - var targets=game.filterPlayer(function(current){ + ("step 2"); + player + .chooseBool("望归:是否令所有与自己势力相同的角色各摸一张牌?") + .setHiddenSkill("wanggui"); + ("step 3"); + if (result.bool) { + var targets = game.filterPlayer(function (current) { return current.isFriendOf(player); }); targets.sortBySeat(); - player.logSkill('wanggui',targets); + player.logSkill("wanggui", targets); game.asyncDraw(targets); - } - else event.finish(); - 'step 4' + } else event.finish(); + ("step 4"); game.delayx(); }, }, - wanggui2:{}, - xibing:{ - audio:2, - trigger:{global:'useCardToPlayered'}, - filter:function(event,player){ - if(player==event.player||event.targets.length!=1||event.player.countCards('h')>=event.player.hp) return false; - var bool=function(card){ - return (card.name=='sha'||get.type(card,false)=='trick')&&get.color(card,false)=='black'; + wanggui2: {}, + xibing: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if ( + player == event.player || + event.targets.length != 1 || + event.player.countCards("h") >= event.player.hp + ) + return false; + var bool = function (card) { + return ( + (card.name == "sha" || get.type(card, false) == "trick") && + get.color(card, false) == "black" + ); }; - if(!bool(event.card)) return false; - var evt=event.getParent('phaseUse'); - if(evt.player!=event.player) return false; - return get.mode()!='guozhan'||event.player.getHistory('useCard',function(evtx){ - return bool(evtx.card)&&evtx.getParent('phaseUse')==evt; - })[0]==event.getParent(); + if (!bool(event.card)) return false; + var evt = event.getParent("phaseUse"); + if (evt.player != event.player) return false; + return ( + get.mode() != "guozhan" || + event.player.getHistory("useCard", function (evtx) { + return bool(evtx.card) && evtx.getParent("phaseUse") == evt; + })[0] == event.getParent() + ); }, - logTarget:'player', - check:function(event,player){ - var target=event.player; - var att=get.attitude(player,target); - var num2=Math.min(5,target.hp-target.countCards('h')); - if(num2<=0) return att<=0; - var num=target.countCards('h',function(card){ - return target.hasValueTarget(card,null,true); + logTarget: "player", + check: function (event, player) { + var target = event.player; + var att = get.attitude(player, target); + var num2 = Math.min(5, target.hp - target.countCards("h")); + if (num2 <= 0) return att <= 0; + var num = target.countCards("h", function (card) { + return target.hasValueTarget(card, null, true); }); - if(!num) return att>0; - return num>num2; + if (!num) return att > 0; + return num > num2; }, - preHidden:true, - content:function(){ - 'step 0' - var num=Math.min(5,trigger.player.hp-trigger.player.countCards('h')); - if(num>0) trigger.player.draw(num); - 'step 1' - trigger.player.addTempSkill('xibing2'); - player._xibing=true; - if(get.mode()!='guozhan'||player.isUnseen(2)||trigger.player.isUnseen(2)) event.finish(); - 'step 2' - var target=trigger.player; - var players1=[player.name1,player.name2]; - var players2=[target.name1,target.name2]; - player.chooseButton(2,[ - '是否暗置自己和'+get.translation(target)+'的各一张武将牌?', - '
    你的武将牌
    ', - [players1,'character'], - '
    '+get.translation(target)+'的武将牌
    ', - [players2,'character'], - ]).set('players',players1).set('complexSelect',true).set('filterButton',function(button){ - return !get.is.jun(button.link)&&(ui.selected.buttons.length==0)==(_status.event.players.includes(button.link)); - }); - 'step 3' - if(result.bool){ - var target=trigger.player; - player.hideCharacter(player.name1==result.links[0]?0:1); - target.hideCharacter(target.name1==result.links[1]?0:1); - player.addTempSkill('xibing3'); - target.addTempSkill('xibing3'); + preHidden: true, + content: function () { + "step 0"; + var num = Math.min(5, trigger.player.hp - trigger.player.countCards("h")); + if (num > 0) trigger.player.draw(num); + ("step 1"); + trigger.player.addTempSkill("xibing2"); + player._xibing = true; + if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2)) + event.finish(); + ("step 2"); + var target = trigger.player; + var players1 = [player.name1, player.name2]; + var players2 = [target.name1, target.name2]; + player + .chooseButton(2, [ + "是否暗置自己和" + get.translation(target) + "的各一张武将牌?", + '
    你的武将牌
    ', + [players1, "character"], + '
    ' + get.translation(target) + "的武将牌
    ", + [players2, "character"], + ]) + .set("players", players1) + .set("complexSelect", true) + .set("filterButton", function (button) { + return ( + !get.is.jun(button.link) && + (ui.selected.buttons.length == 0) == + _status.event.players.includes(button.link) + ); + }); + ("step 3"); + if (result.bool) { + var target = trigger.player; + player.hideCharacter(player.name1 == result.links[0] ? 0 : 1); + target.hideCharacter(target.name1 == result.links[1] ? 0 : 1); + player.addTempSkill("xibing3"); + target.addTempSkill("xibing3"); } }, }, - xibing2:{ - mod:{ - cardEnabled2:function(card){ - if(get.position(card)=='h') return false; + xibing2: { + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; }, }, }, - xibing3:{ - ai:{nomingzhi:true}, + xibing3: { + ai: { nomingzhi: true }, }, //小虎 - remeibu:{ - audio:"meibu", - trigger:{ - global:"phaseUseBegin", + remeibu: { + audio: "meibu", + trigger: { + global: "phaseUseBegin", }, - filter:function(event,player){ - return event.player!=player&&event.player.isIn()&&event.player.inRange(player)&&player.countCards('he')>0; + filter: function (event, player) { + return ( + event.player != player && + event.player.isIn() && + event.player.inRange(player) && + player.countCards("he") > 0 + ); }, - direct:true, - derivation:["rezhixi"], - checkx:function(event,player){ - if(get.attitude(player,event.player)>=0) return false; - return event.player.countCards('h')>event.player.hp; + direct: true, + derivation: ["rezhixi"], + checkx: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + return event.player.countCards("h") > event.player.hp; }, - content:function(){ - "step 0" - var check=lib.skill.new_meibu.checkx(trigger,player); - player.chooseToDiscard(get.prompt2('remeibu',trigger.player),'he').set('ai',function(card){ - if(_status.event.check) return 6-get.value(card); - return 0; - }).set('check',check).set('logSkill',['remeibu',trigger.player]); - "step 1" - if(result.bool){ - var target=trigger.player; - var card=result.cards[0]; - player.line(target,'green'); - player.markAuto('remeibu_gain',[get.suit(card,player)]); - player.addTempSkill('remeibu_gain'); - target.addTempSkills('rezhixi','phaseUseEnd'); + content: function () { + "step 0"; + var check = lib.skill.new_meibu.checkx(trigger, player); + player + .chooseToDiscard(get.prompt2("remeibu", trigger.player), "he") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", check) + .set("logSkill", ["remeibu", trigger.player]); + ("step 1"); + if (result.bool) { + var target = trigger.player; + var card = result.cards[0]; + player.line(target, "green"); + player.markAuto("remeibu_gain", [get.suit(card, player)]); + player.addTempSkill("remeibu_gain"); + target.addTempSkills("rezhixi", "phaseUseEnd"); } }, - ai:{ - expose:0.2, + ai: { + expose: 0.2, }, - subSkill:{ - gain:{ - trigger:{global:'loseAfter'}, - forced:true, - charlotte:true, - popup:false, - onremove:true, - filter:function(event,player){ - return event.getParent(3).name=='rezhixi'&&player.getStorage('remeibu_gain').includes(get.suit(event.cards[0],event.player))&&get.position(event.cards[0])=='d'; + subSkill: { + gain: { + trigger: { global: "loseAfter" }, + forced: true, + charlotte: true, + popup: false, + onremove: true, + filter: function (event, player) { + return ( + event.getParent(3).name == "rezhixi" && + player + .getStorage("remeibu_gain") + .includes(get.suit(event.cards[0], event.player)) && + get.position(event.cards[0]) == "d" + ); }, - content:function(){ - player.gain(trigger.cards[0],'gain2'); + content: function () { + player.gain(trigger.cards[0], "gain2"); }, }, }, }, - remumu:{ - audio:"mumu", - trigger:{ - player:"phaseUseBegin", + remumu: { + audio: "mumu", + trigger: { + player: "phaseUseBegin", }, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('e')>0; + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("e") > 0; }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('remumu'),function(card,player,target){ - return target.countCards('e')>0; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target),es=target.getCards('e'),val=0; - for(var i of es){ - var eff=-(get.value(i,target)-0.1)*att; - if(eff>val) val=eff; + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("remumu"), function (card, player, target) { + return target.countCards("e") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + es = target.getCards("e"), + val = 0; + for (var i of es) { + var eff = -(get.value(i, target) - 0.1) * att; + if (eff > val) val = eff; + } + return eff; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("remumu", target); + if (player == target) event._result = { index: 1 }; + else { + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", [ + "弃置" + str + "装备区的一张牌且本阶段使用【杀】的次数上限+1", + "获得" + str + "装备区的一张牌且本阶段使用【杀】的次数上限-1", + ]) + .set("ai", function () { + var player = _status.event.player; + if ( + player.countCards("hs", function (card) { + return ( + get.name(card, player) == "sha" && player.hasValueTarget(card) + ); + }) < Math.max(1, player.getCardUsable("sha")) + ) + return 1; + return 0; + }); } - return eff; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('remumu',target); - if(player==target) event._result={index:1}; - else{ - var str=get.translation(target); - player.chooseControl().set('choiceList',[ - '弃置'+str+'装备区的一张牌且本阶段使用【杀】的次数上限+1', - '获得'+str+'装备区的一张牌且本阶段使用【杀】的次数上限-1', - ]).set('ai',function(){ - var player=_status.event.player; - if(player.countCards('hs',function(card){ - return get.name(card,player)=='sha'&&player.hasValueTarget(card); - })0; + forced: true, + filter: function (event, player) { + return ( + (event.card.name == "sha" || get.type(event.card) == "trick") && + player.countCards("h") > 0 + ); }, - content:function(){ - player.chooseToDiscard('h',true); + content: function () { + player.chooseToDiscard("h", true); }, }, //董白 - relianzhu:{ - audio:'lianzhu', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0; + relianzhu: { + audio: "lianzhu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - discard:false, - lose:false, - delay:false, - position:'he', - filterTarget:lib.filter.notMe, - check:function(card){ - var num=get.value(card); - if(get.color(card)=='black'){ - if(num>=6) return 0; - return 9-num; - } - else{ - return 7-num; + filterCard: true, + discard: false, + lose: false, + delay: false, + position: "he", + filterTarget: lib.filter.notMe, + check: function (card) { + var num = get.value(card); + if (get.color(card) == "black") { + if (num >= 6) return 0; + return 9 - num; + } else { + return 7 - num; } }, - content:function(){ - 'step 0' - player.give(cards,target); - 'step 1' - if(get.color(cards[0],player)=='red'){ + content: function () { + "step 0"; + player.give(cards, target); + ("step 1"); + if (get.color(cards[0], player) == "red") { player.draw(); event.finish(); + } else { + target + .chooseToDiscard( + "he", + 2, + "弃置两张牌,或令" + get.translation(player) + "摸两张牌" + ) + .set("goon", get.attitude(target, player) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return -get.value(card); + return 6 - get.value(card); + }); } - else{ - target.chooseToDiscard('he',2,'弃置两张牌,或令'+get.translation(player)+'摸两张牌').set('goon',get.attitude(target,player)<0).set('ai',function(card){ - if(!_status.event.goon) return -get.value(card); - return 6-get.value(card); - }); - } - 'step 2' - if(!result.bool) player.draw(2); + ("step 2"); + if (!result.bool) player.draw(2); }, - ai:{ - order:3, - expose:0.2, - result:{ - target:function(player,target){ - if(ui.selected.cards.length&&get.color(ui.selected.cards[0])=='red'){ - if(target.countCards('h')0; + }, + rexiahui: { + audio: "xiahui", + mod: { + ignoredHandcard: function (card, player) { + if (get.color(card, player) == "black") return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.color(card, player) == "black") return false; + }, }, - content:function(){ + trigger: { global: "phaseEnd" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + var target = event.player; + return ( + target != player && + target.countCards("h", function (card) { + return card.hasGaintag("rexiahui"); + }) == 0 && + target.getHistory("lose", function (evt) { + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rexiahui")) return true; + } + }).length > 0 + ); + }, + content: function () { trigger.player.loseHp(); }, - group:'rexiahui_gain', - subSkill:{ - gain:{ - trigger:{global:'gainEnd'}, - forced:true, - popup:false, - filter:function(event,player){ - if(player==event.player) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.filter(function(card){ - return get.color(card,player)=='black'; - }).length>0; + group: "rexiahui_gain", + subSkill: { + gain: { + trigger: { global: "gainEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + if (player == event.player) return false; + var evt = event.getl(player); + return ( + evt && + evt.cards2 && + evt.cards2.filter(function (card) { + return get.color(card, player) == "black"; + }).length > 0 + ); }, - content:function(){ - trigger.player.addSkill('rexiahui_block'); - var cards=trigger.getl(player).cards2.filter(function(card){ - return get.color(card,player)=='black'; + content: function () { + trigger.player.addSkill("rexiahui_block"); + var cards = trigger.getl(player).cards2.filter(function (card) { + return get.color(card, player) == "black"; }); - trigger.player.addGaintag(cards,'rexiahui'); + trigger.player.addGaintag(cards, "rexiahui"); }, }, - block:{ - mod:{ - cardEnabled2:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('rexiahui')) return false; + block: { + mod: { + cardEnabled2: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("rexiahui")) return false; }, - cardDiscardable:function(card){ - if(card.hasGaintag('rexiahui')) return false; + cardDiscardable: function (card) { + if (card.hasGaintag("rexiahui")) return false; }, }, - charlotte:true, - forced:true, - popup:false, - trigger:{player:'changeHp'}, - filter:function(event,player){ - return event.num<0; + charlotte: true, + forced: true, + popup: false, + trigger: { player: "changeHp" }, + filter: function (event, player) { + return event.num < 0; }, - content:function(){ - player.removeSkill('rexiahui_block'); + content: function () { + player.removeSkill("rexiahui_block"); }, - onremove:function(player){ - player.removeGaintag('rexiahui'); + onremove: function (player) { + player.removeGaintag("rexiahui"); }, }, }, }, //周善 - dcmiyun:{ - audio:2, - trigger:{global:'roundStart'}, - forced:true, - direct:true, - group:'dcmiyun_lose', - content:function(){ - 'step 0' - if(player.hasCard(card=>card.hasGaintag('dcmiyun_tag'),'h')){ + dcmiyun: { + audio: 2, + trigger: { global: "roundStart" }, + forced: true, + direct: true, + group: "dcmiyun_lose", + content: function () { + "step 0"; + if (player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")) { player.chooseCardTarget({ - prompt:'密运:将包括“安”在内的任意张手牌交给一名其他角色', - forced:true, - filterTarget:lib.filter.notMe, - selectCard:[1,Infinity], - filterOk:function(){ - for(var card of ui.selected.cards){ - if(card.hasGaintag('dcmiyun_tag')) return true; + prompt: "密运:将包括“安”在内的任意张手牌交给一名其他角色", + forced: true, + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + filterOk: function () { + for (var card of ui.selected.cards) { + if (card.hasGaintag("dcmiyun_tag")) return true; } return false; }, - goon:game.hasPlayer(current=>player!=current&&get.attitude(player,current)>0), - ai1:function(card){ - if(get.itemtype(card)!='card') return 0; - if(card.hasGaintag('dcmiyun_tag')) return 100; - if(_status.event.goon) return 8-get.value(card); + goon: game.hasPlayer( + (current) => player != current && get.attitude(player, current) > 0 + ), + ai1: function (card) { + if (get.itemtype(card) != "card") return 0; + if (card.hasGaintag("dcmiyun_tag")) return 100; + if (_status.event.goon) return 8 - get.value(card); return -get.value(card); }, - ai2:function(target){ - return get.attitude(_status.event.player,target); - } + ai2: function (target) { + return get.attitude(_status.event.player, target); + }, }); - } - else event.goto(3); - 'step 1' - if(result.bool){ - var target=result.targets[0],cards=result.cards; - player.logSkill('dcmiyun',target); - player.give(cards,target); - } - else event.goto(3); - 'step 2' + } else event.goto(3); + ("step 1"); + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.logSkill("dcmiyun", target); + player.give(cards, target); + } else event.goto(3); + ("step 2"); player.drawTo(player.maxHp); - 'step 3' - if(game.hasPlayer(current=>current!=player&¤t.countGainableCards(player,'he'))){ - player.chooseTarget('密运:获得一名其他角色的一张牌,称为“安”',true,(card,player,target)=>{ - return target!=player&&target.countGainableCards(player,'he'); - }).set('ai',target=>{ - return get.effect(target,{name:'shunshou'},_status.event.player,_status.event.player); - }) - } - else event.finish(); - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcmiyun',target); - player.gainPlayerCard(target,true,'visibleMove').chooseonly=true; - } - else event.finish(); - 'step 5' - if(result.bool){ - player.gain(result.cards).gaintag.add('dcmiyun_tag'); + ("step 3"); + if ( + game.hasPlayer( + (current) => current != player && current.countGainableCards(player, "he") + ) + ) { + player + .chooseTarget( + "密运:获得一名其他角色的一张牌,称为“安”", + true, + (card, player, target) => { + return target != player && target.countGainableCards(player, "he"); + } + ) + .set("ai", (target) => { + return get.effect( + target, + { name: "shunshou" }, + _status.event.player, + _status.event.player + ); + }); + } else event.finish(); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcmiyun", target); + player.gainPlayerCard(target, true, "visibleMove").chooseonly = true; + } else event.finish(); + ("step 5"); + if (result.bool) { + player.gain(result.cards).gaintag.add("dcmiyun_tag"); } }, - mod:{ - aiValue:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dcmiyun_tag')) return Math.abs(num)*10; + mod: { + aiValue: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag")) + return Math.abs(num) * 10; }, - aiUseful:function(){ - return lib.skill.dcmiyun.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.dcmiyun.mod.aiValue.apply(this, arguments); + }, + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag")) return 0; }, - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dcmiyun_tag')) return 0; - } }, - subSkill:{ - lose:{ - audio:'dcmiyun', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + lose: { + audio: "dcmiyun", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter:function(event,player){ - if(event.getParent().name=='dcmiyun') return false; - var evt=event.getl(player); - if(!evt||!evt.cards2||!evt.cards2.length) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('dcmiyun_tag')) return true; + forced: true, + filter: function (event, player) { + if (event.getParent().name == "dcmiyun") return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dcmiyun_tag")) return true; } return false; } - return player.hasHistory('lose',evt=>{ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dcmiyun_tag')) return true; + return player.hasHistory("lose", (evt) => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcmiyun_tag")) return true; } return false; }); }, - content:function(){ + content: function () { player.loseHp(); - } - } - } + }, + }, + }, }, - dcdanying:{ - audio:2, - mod:{ - aiOrder:function(player,card,num){ - if(num<=0 || card.name!=='sha'&&card.name!=='shan' || !player.hasCard(i=>i.hasGaintag('dcmiyun_tag'),'h')) return; - return Math.max(0.12,num/25); - } + dcdanying: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if ( + num <= 0 || + (card.name !== "sha" && card.name !== "shan") || + !player.hasCard((i) => i.hasGaintag("dcmiyun_tag"), "h") + ) + return; + return Math.max(0.12, num / 25); + }, }, - locked:false, - enable:['chooseToUse','chooseToRespond'], - usable:1, - hiddenCard:function(player,name){ - if(!_status.connectMode&&!player.hasCard(card=>card.hasGaintag('dcmiyun_tag'),'h')) return false; - return name=='sha'||name=='shan'; + locked: false, + enable: ["chooseToUse", "chooseToRespond"], + usable: 1, + hiddenCard: function (player, name) { + if ( + !_status.connectMode && + !player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h") + ) + return false; + return name == "sha" || name == "shan"; }, - filter:function(event,player){ - if(event.type=='wuxie'||!player.hasCard(card=>card.hasGaintag('dcmiyun_tag'),'h')) return false; - for(var name of ['sha','shan']){ - if(event.filterCard({name:name,isCard:true},player,event)) return true; + filter: function (event, player) { + if ( + event.type == "wuxie" || + !player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h") + ) + return false; + for (var name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var vcards=[]; - for(var name of ['sha','shan']){ - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); + chooseButton: { + dialog: function (event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); } - var dialog=ui.create.dialog('胆迎',[vcards,'vcard'],'hidden'); - dialog.direct=true; + var dialog = ui.create.dialog("胆迎", [vcards, "vcard"], "hidden"); + dialog.direct = true; return dialog; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:()=>false, - selectCard:-1, - viewAs:{ - name:links[0][2], - isCard:true, + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, }, - popname:true, - precontent:function(){ - player.logSkill('dcdanying'); - player.showCards(player.getCards('h',card=>card.hasGaintag('dcmiyun_tag')),get.translation(player)+'的“安”'); - player.addTempSkill('dcdanying_discard'); + popname: true, + precontent: function () { + player.logSkill("dcdanying"); + player.showCards( + player.getCards("h", (card) => card.hasGaintag("dcmiyun_tag")), + get.translation(player) + "的“安”" + ); + player.addTempSkill("dcdanying_discard"); }, - } + }; + }, + prompt: function (links, player) { + return "展示“安”,然后视为使用【" + get.translation(links[0][2]) + "】"; }, - prompt:function(links,player){ - return '展示“安”,然后视为使用【'+get.translation(links[0][2])+'】'; - } }, - ai:{ - order:function(item,player){ - var o1=get.order({name:'sha'}),o2=get.order({name:'shan'}); - if(player.countCards('h')>3||player==_status.currentPhase) return Math.max(o1,o2)+0.1; - return Math.min(o1,o2)-0.1; + ai: { + order: function (item, player) { + var o1 = get.order({ name: "sha" }), + o2 = get.order({ name: "shan" }); + if (player.countCards("h") > 3 || player == _status.currentPhase) + return Math.max(o1, o2) + 0.1; + return Math.min(o1, o2) - 0.1; }, - combo:'dcmiyun', - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(!player.hasCard(card=>card.hasGaintag('dcmiyun_tag'),'h')) return false; + combo: "dcmiyun", + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (!player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")) return false; + }, + result: { + player: 1, }, - result:{ - player:1 - } }, - subSkill:{ - discard:{ - trigger:{target:'useCardToTargeted'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return player.countDiscardableCards(event.player,'he'); + subSkill: { + discard: { + trigger: { target: "useCardToTargeted" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.countDiscardableCards(event.player, "he"); }, - content:function(){ - trigger.player.discardPlayerCard(player,'he',true); - player.removeSkill('dcdanying_discard'); + content: function () { + trigger.player.discardPlayerCard(player, "he", true); + player.removeSkill("dcdanying_discard"); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(_status._dcdanying_aiChecking) return; - _status._dcdanying_aiChecking=true; - let eff=get.effect(target,{name:'guohe_copy2'},player,player); + ai: { + effect: { + target: function (card, player, target) { + if (_status._dcdanying_aiChecking) return; + _status._dcdanying_aiChecking = true; + let eff = get.effect(target, { name: "guohe_copy2" }, player, player); delete _status._dcdanying_aiChecking; - return [1,get.sgn(eff)]; - } - } - } - } + return [1, get.sgn(eff)]; + }, + }, + }, + }, }, }, //蔡阳 - dcxunji:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&!player.getStorage('dcxunji_effect').includes(target); + dcxunji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && !player.getStorage("dcxunji_effect").includes(target); }, - content:function(){ - player.markAuto('dcxunji_effect',[target]); - player.addTempSkill('dcxunji_effect',{player:'die'}); - target.addTempSkill('dcxunji_mark',{player:'phaseEnd'}); + content: function () { + player.markAuto("dcxunji_effect", [target]); + player.addTempSkill("dcxunji_effect", { player: "die" }); + target.addTempSkill("dcxunji_mark", { player: "phaseEnd" }); }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(player.hp<2) return 0; - return get.effect(target,{name:'juedou'},player,player); + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.hp < 2) return 0; + return get.effect(target, { name: "juedou" }, player, player); }, }, }, - subSkill:{ - mark:{ - mark:true, - marktext:'嫉', - intro:{content:'你已经被盯上了!'}, + subSkill: { + mark: { + mark: true, + marktext: "嫉", + intro: { content: "你已经被盯上了!" }, }, - effect:{ - audio:'dcxunji', - charlotte:true, - trigger:{global:'phaseJieshuBegin'}, - forced:true, - popup:false, - onremove:true, - filter:function(event,player){ - return player.getStorage('dcxunji_effect').includes(event.player); + effect: { + audio: "dcxunji", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + popup: false, + onremove: true, + filter: function (event, player) { + return player.getStorage("dcxunji_effect").includes(event.player); }, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - if(target.getHistory('useCard',evt=>get.color(evt.card)=='black').length>0&&player.canUse('juedou',target)){ - player.useCard({name:'juedou',isCard:true},target,'dcxunji_effect'); + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + if ( + target.getHistory("useCard", (evt) => get.color(evt.card) == "black").length > + 0 && + player.canUse("juedou", target) + ) { + player.useCard({ name: "juedou", isCard: true }, target, "dcxunji_effect"); } - 'step 1' - player.unmarkAuto('dcxunji_effect',[target]); - if(!player.storage.dcxunji_effect.length) player.removeSkill('dcxunji_effect'); + ("step 1"); + player.unmarkAuto("dcxunji_effect", [target]); + if (!player.storage.dcxunji_effect.length) player.removeSkill("dcxunji_effect"); }, - group:'dcxunji_loseHp', + group: "dcxunji_loseHp", }, - loseHp:{ - trigger:{source:'damageSource'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card&&event.card.name=='juedou'&&event.getParent().skill=='dcxunji_effect'&&event.player.isIn(); + loseHp: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.card && + event.card.name == "juedou" && + event.getParent().skill == "dcxunji_effect" && + event.player.isIn() + ); }, - content:function(){ + content: function () { trigger.player.line(player); - player.damage(trigger.num,trigger.player); + player.damage(trigger.num, trigger.player); }, }, }, }, - dcjiaofeng:{ - audio:2, - trigger:{source:'damageBegin1'}, - forced:true, - usable:1, - filter:function(event,player){ - return player.isDamaged()&&!player.getHistory('sourceDamage').length; + dcjiaofeng: { + audio: 2, + trigger: { source: "damageBegin1" }, + forced: true, + usable: 1, + filter: function (event, player) { + return player.isDamaged() && !player.getHistory("sourceDamage").length; }, - content:function(){ - var num=player.getDamagedHp(); - if(num>0) player.draw(); - if(num>1) trigger.num++; - if(num>2) player.recover(); + content: function () { + var num = player.getDamagedHp(); + if (num > 0) player.draw(); + if (num > 1) trigger.num++; + if (num > 2) player.recover(); }, }, //夏侯杰 - liedan:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return (player!=event.player||player.countMark('liedan')>4)&&!player.hasSkill('zhuangdan_mark'); + liedan: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + (player != event.player || player.countMark("liedan") > 4) && + !player.hasSkill("zhuangdan_mark") + ); }, - logTarget:'player', - content:function(){ - if(player==trigger.player){ + logTarget: "player", + content: function () { + if (player == trigger.player) { player.die(); return; } - var num=0; - if(player.hp>trigger.player.hp) num++; - if(player.countCards('h')>trigger.player.countCards('h')) num++; - if(player.countCards('e')>trigger.player.countCards('e')) num++; - if(num){ + var num = 0; + if (player.hp > trigger.player.hp) num++; + if (player.countCards("h") > trigger.player.countCards("h")) num++; + if (player.countCards("e") > trigger.player.countCards("e")) num++; + if (num) { player.draw(num); - if(num==3&&player.maxHp<8) player.gainMaxHp(); - } - else{ - player.addMark('liedan',1); + if (num == 3 && player.maxHp < 8) player.gainMaxHp(); + } else { + player.addMark("liedan", 1); player.loseHp(); } }, - intro:{content:'mark'}, + intro: { content: "mark" }, }, - zhuangdan:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return player!=event.player&&player.isMaxHandcard(true); + zhuangdan: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return player != event.player && player.isMaxHandcard(true); }, - content:function(){ - player.addTempSkill('zhuangdan_mark',{player:'phaseEnd'}) + content: function () { + player.addTempSkill("zhuangdan_mark", { player: "phaseEnd" }); + }, + ai: { + combo: "zhuangdan", }, - ai:{ - combo:'zhuangdan' - } }, - zhuangdan_mark:{ - mark:true, - marktext:'胆', - intro:{content:'我超勇的'}, + zhuangdan_mark: { + mark: true, + marktext: "胆", + intro: { content: "我超勇的" }, }, //乌巢酒仙 - recangchu:{ - audio:2, - trigger:{global:'phaseBefore',player:'enterGame'}, - marktext:'粮', - forced:true, - filter:function(event,player){ - if(event.name=='phase'&&game.phaseNumber!=0) return false; - return player.countMark('recangchu')0; + forced: true, + usable: 1, + filter: function (event, player) { + return ( + player != _status.currentPhase && + player.countMark("recangchu") < game.countPlayer() && + event.getg(player).length > 0 + ); }, - content:function(){ - player.addMark('recangchu',1); + content: function () { + player.addMark("recangchu", 1); }, }, - recangchu3:{ - audio:'recangchu', - trigger:{global:'die'}, - forced:true, - filter:function(event,player){ - return player.countMark('recangchu')>game.countPlayer(); + recangchu3: { + audio: "recangchu", + trigger: { global: "die" }, + forced: true, + filter: function (event, player) { + return player.countMark("recangchu") > game.countPlayer(); }, - content:function(){ - player.removeMark('recangchu',player.countMark('recangchu')-game.countPlayer()); + content: function () { + player.removeMark("recangchu", player.countMark("recangchu") - game.countPlayer()); }, }, - reliangying:{ - audio:2, - trigger:{player:'phaseDiscardBegin'}, - filter(event,player){ - return player.hasMark('recangchu'); + reliangying: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + filter(event, player) { + return player.hasMark("recangchu"); }, - direct:true, - async content(event,trigger,player){ - const draws=Array.from({length:player.countMark('recangchu')}).map((_,i)=>get.cnNumber(i+1)+'张'); - const {result:{control}}=await player.chooseControl(draws,'cancel2').set('prompt',get.prompt('reliangying')) - .set('prompt2','摸至多'+get.cnNumber(player.countMark('recangchu'))+'张牌,然后交给等量的角色各一张牌').set('ai',()=>{ - const player=get.event('player'); - const num=Math.min(player.countMark('recangchu'),game.countPlayer(current=>get.attitude(player,current)>0)); - if(num>0) return get.cnNumber(num)+'张'; - return 'cancel2'; - }); - if(control!='cancel2'){ - player.logSkill('reliangying'); - const num=draws.indexOf(control)+1,max=Math.min(num,player.countCards('he'),game.countPlayer(target=>target!=player)); + direct: true, + async content(event, trigger, player) { + const draws = Array.from({ length: player.countMark("recangchu") }).map( + (_, i) => get.cnNumber(i + 1) + "张" + ); + const { + result: { control }, + } = await player + .chooseControl(draws, "cancel2") + .set("prompt", get.prompt("reliangying")) + .set( + "prompt2", + "摸至多" + + get.cnNumber(player.countMark("recangchu")) + + "张牌,然后交给等量的角色各一张牌" + ) + .set("ai", () => { + const player = get.event("player"); + const num = Math.min( + player.countMark("recangchu"), + game.countPlayer((current) => get.attitude(player, current) > 0) + ); + if (num > 0) return get.cnNumber(num) + "张"; + return "cancel2"; + }); + if (control != "cancel2") { + player.logSkill("reliangying"); + const num = draws.indexOf(control) + 1, + max = Math.min( + num, + player.countCards("he"), + game.countPlayer((target) => target != player) + ); await player.draw(num); - let list=[]; - if(_status.connectMode) game.broadcastAll(()=>_status.noclearcountdown=true); - while(max-list.length>0){ - const {result:{bool,cards,targets}}=await player.chooseCardTarget({ - prompt:'粮营:将'+get.cnNumber(max-1)+'至'+get.cnNumber(max)+'张牌交给其他角色', - position:'he', - animate:false, - filterCard(card,player){ - return !get.event('list').some(list=>list[1]==card); - }, - filterTarget(card,player,target){ - return target!=player&&!get.event('list').some(list=>list[0]==target); - }, - ai1(card){ - if(card.name=='shan') return 1; - return Math.random(); - }, - ai2(target){ - return get.attitude(get.event('player'),target); - }, - }).set('list',list).set('forced',max-list.length>1); - if(bool){ - list.push([targets[0],cards[0]]); - player.addGaintag(cards,'olsujian_given'); - } - else break; + let list = []; + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + while (max - list.length > 0) { + const { + result: { bool, cards, targets }, + } = await player + .chooseCardTarget({ + prompt: + "粮营:将" + + get.cnNumber(max - 1) + + "至" + + get.cnNumber(max) + + "张牌交给其他角色", + position: "he", + animate: false, + filterCard(card, player) { + return !get.event("list").some((list) => list[1] == card); + }, + filterTarget(card, player, target) { + return ( + target != player && + !get.event("list").some((list) => list[0] == target) + ); + }, + ai1(card) { + if (card.name == "shan") return 1; + return Math.random(); + }, + ai2(target) { + return get.attitude(get.event("player"), target); + }, + }) + .set("list", list) + .set("forced", max - list.length > 1); + if (bool) { + list.push([targets[0], cards[0]]); + player.addGaintag(cards, "olsujian_given"); + } else break; } - if(_status.connectMode){ - game.broadcastAll(()=>{ + if (_status.connectMode) { + game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose(); }); } - if(list.length){ - await game.loseAsync({ - gain_list:list, - player:player, - cards:list.slice().map(list=>list[1]), - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); + if (list.length) { + await game + .loseAsync({ + gain_list: list, + player: player, + cards: list.slice().map((list) => list[1]), + giver: player, + animate: "giveAuto", + }) + .setContent("gaincardMultiple"); } } }, }, - reshishou:{ - audio:2, - trigger:{player:['useCard','damageEnd']}, - forced:true, - filter:function(event,player){ - if(!player.countMark('recangchu')) return false; - return (event.name=='damage')?event.hasNature('fire'):(event.card&&event.card.name=='jiu'); + reshishou: { + audio: 2, + trigger: { player: ["useCard", "damageEnd"] }, + forced: true, + filter: function (event, player) { + if (!player.countMark("recangchu")) return false; + return event.name == "damage" + ? event.hasNature("fire") + : event.card && event.card.name == "jiu"; }, - content:function(){ - player.removeMark('recangchu',Math.min(player.countMark('recangchu'),trigger.num||1)); + content: function () { + player.removeMark("recangchu", Math.min(player.countMark("recangchu"), trigger.num || 1)); }, - group:'reshishou2', + group: "reshishou2", }, - reshishou2:{ - audio:'reshishou', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return !player.countMark('recangchu'); + reshishou2: { + audio: "reshishou", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return !player.countMark("recangchu"); }, - content:function(){ + content: function () { player.loseHp(); }, }, //曹性 - cxliushi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he',{suit:'heart'})>0; + cxliushi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he", { suit: "heart" }) > 0; }, - filterCard:{suit:'heart'}, - position:'he', - filterTarget:function(card,player,target){ - return player.canUse('sha',target,false); + filterCard: { suit: "heart" }, + position: "he", + filterTarget: function (card, player, target) { + return player.canUse("sha", target, false); }, - check:function(card){ - var player=_status.event.player; - var next=player.getNext(); - var att=get.attitude(player,next); - if(att>0){ - var js=next.getCards('j'); - if(js.length) return get.judge(js[0])+10-get.value(card); - return 9-get.value(card) + check: function (card) { + var player = _status.event.player; + var next = player.getNext(); + var att = get.attitude(player, next); + if (att > 0) { + var js = next.getCards("j"); + if (js.length) return get.judge(js[0]) + 10 - get.value(card); + return 9 - get.value(card); } - return 6-get.value(card); + return 6 - get.value(card); }, - discard:false, - prepare:'throw', - loseTo:'cardPile', - visible:true, - insert:true, - content:function(){ - game.log(player,'将',cards,'置于牌堆顶'); - player.useCard({name:'sha',isCard:true},false,targets).card.cxliushi=true; + discard: false, + prepare: "throw", + loseTo: "cardPile", + visible: true, + insert: true, + content: function () { + game.log(player, "将", cards, "置于牌堆顶"); + player.useCard({ name: "sha", isCard: true }, false, targets).card.cxliushi = true; }, - group:'cxliushi_damage', - subSkill:{ - damage:{ - trigger:{source:'damageSource'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card&&event.card.cxliushi==true&&event.player.isIn()&&event.getParent(3).name=='cxliushi'; + group: "cxliushi_damage", + subSkill: { + damage: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.card && + event.card.cxliushi == true && + event.player.isIn() && + event.getParent(3).name == "cxliushi" + ); }, - content:function(){ - trigger.player.addMark('cxliushi2',1); - trigger.player.addSkill('cxliushi2'); + content: function () { + trigger.player.addMark("cxliushi2", 1); + trigger.player.addSkill("cxliushi2"); }, }, }, - ai:{ - order:function(){ - return get.order({name:'sha'})-0.4; + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.4; }, - result:{ - target:function(player,target){ - var eff=get.effect(target,{name:'sha'},player,target); - var damageEff=get.damageEffect(target,player,player); - if(eff>0) return damageEff>0?0:eff; - if(target.hasSkill('bagua_skill')||target.hasSkill('rw_bagua_skill')||target.hasSkill('bazhen')) return 0; + result: { + target: function (player, target) { + var eff = get.effect(target, { name: "sha" }, player, target); + var damageEff = get.damageEffect(target, player, player); + if (eff > 0) return damageEff > 0 ? 0 : eff; + if ( + target.hasSkill("bagua_skill") || + target.hasSkill("rw_bagua_skill") || + target.hasSkill("bazhen") + ) + return 0; return eff; }, }, }, }, - cxliushi2:{ - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('cxliushi2'); + cxliushi2: { + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("cxliushi2"); }, }, - onremove:true, - charlotte:true, - intro:{ - name2:'流', - content:'手牌上限-#', + onremove: true, + charlotte: true, + intro: { + name2: "流", + content: "手牌上限-#", }, }, - zhanwan:{ - audio:2, - trigger:{global:'phaseDiscardEnd'}, - forced:true, - filter:function(event,player){ - return event.player.hasSkill('cxliushi2')&&event.player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) return true; - }).length>0; + zhanwan: { + audio: 2, + trigger: { global: "phaseDiscardEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.player.hasSkill("cxliushi2") && + event.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) return true; + }).length > 0 + ); }, - logTarget:'player', - content:function(){ - trigger.player.removeSkill('cxliushi2'); - var num=0; - trigger.player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) num+=evt.cards2.length; + logTarget: "player", + content: function () { + trigger.player.removeSkill("cxliushi2"); + var num = 0; + trigger.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) + num += evt.cards2.length; }); player.draw(num); }, - ai:{ - combo:'cxliushi' - } + ai: { + combo: "cxliushi", + }, }, //说出吾名吓汝一跳 - xuxie:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - logTarget:function(event,player){ - return game.filterPlayer(function(current){ - return get.distance(player,current)<=1; - }).sortBySeat(); + xuxie: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + logTarget: function (event, player) { + return game + .filterPlayer(function (current) { + return get.distance(player, current) <= 1; + }) + .sortBySeat(); }, - check:function(event,player){ - if(player.isHealthy()) return false; - var list=game.filterPlayer(function(current){ - return get.distance(player,current)<=1; + check: function (event, player) { + if (player.isHealthy()) return false; + var list = game.filterPlayer(function (current) { + return get.distance(player, current) <= 1; }); - var draw=0; - var discard=0; - var num=2/player.getDamagedHp(); - while(list.length){ - var target=list.shift(); - var att=get.attitude(player,target); - if(att>0){ + var draw = 0; + var discard = 0; + var num = 2 / player.getDamagedHp(); + while (list.length) { + var target = list.shift(); + var att = get.attitude(player, target); + if (att > 0) { draw++; - if(target.countDiscardableCards(player,'he')>0) discard--; + if (target.countDiscardableCards(player, "he") > 0) discard--; } - if(att==0){ + if (att == 0) { draw--; - if(target.countDiscardableCards(player,'he')>0) discard--; + if (target.countDiscardableCards(player, "he") > 0) discard--; } - if(att<0){ + if (att < 0) { draw--; - if(target.countDiscardableCards(player,'he')>0) discard++; + if (target.countDiscardableCards(player, "he") > 0) discard++; } } - return draw>=num||discard>=num; + return draw >= num || discard >= num; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseMaxHp(); - 'step 1' - var targets=game.filterPlayer(function(current){ - return get.distance(player,current)<=1; - }).sortBySeat(); - if(!targets.length) event.finish(); - else{ - event.targets=targets; - player.chooseControl().set('choiceList',[ - '弃置'+get.translation(targets)+'的各一张牌', - '令'+get.translation(targets)+'各摸一张牌', - ]).set('ai',function(){ - var player=_status.event.player; - var list=_status.event.getParent().targets.slice(0); - var draw=0; - var discard=0; - while(list.length){ - var target=list.shift(); - var att=get.attitude(player,target); - if(att>0){ - draw++; - if(target.countDiscardableCards(player,'he')>0) discard--; + ("step 1"); + var targets = game + .filterPlayer(function (current) { + return get.distance(player, current) <= 1; + }) + .sortBySeat(); + if (!targets.length) event.finish(); + else { + event.targets = targets; + player + .chooseControl() + .set("choiceList", [ + "弃置" + get.translation(targets) + "的各一张牌", + "令" + get.translation(targets) + "各摸一张牌", + ]) + .set("ai", function () { + var player = _status.event.player; + var list = _status.event.getParent().targets.slice(0); + var draw = 0; + var discard = 0; + while (list.length) { + var target = list.shift(); + var att = get.attitude(player, target); + if (att > 0) { + draw++; + if (target.countDiscardableCards(player, "he") > 0) discard--; + } + if (att < 0) { + draw--; + if (target.countDiscardableCards(player, "he") > 0) discard++; + } } - if(att<0){ - draw--; - if(target.countDiscardableCards(player,'he')>0) discard++; - } - } - if(draw>discard) return 1; - return 0; - }); + if (draw > discard) return 1; + return 0; + }); } - 'step 2' - event.index=result.index; - if(result.index==1){ + ("step 2"); + event.index = result.index; + if (result.index == 1) { game.asyncDraw(targets); - } - else event.goto(4); - 'step 3' + } else event.goto(4); + ("step 3"); game.delay(); event.finish(); - 'step 4' - var target=targets.shift(); - if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,'he',true); - if(targets.length) event.redo(); + ("step 4"); + var target = targets.shift(); + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true); + if (targets.length) event.redo(); }, - group:'xuxie_add', + group: "xuxie_add", }, - xuxie_add:{ - audio:'xuxie', - trigger:{player:'phaseUseEnd'}, - forced:true, - locked:false, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.maxHp>player.maxHp; + xuxie_add: { + audio: "xuxie", + trigger: { player: "phaseUseEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.maxHp > player.maxHp; }); }, - content:function(){ + content: function () { player.gainMaxHp(); - player.chooseDrawRecover(2,true); + player.chooseDrawRecover(2, true); }, }, //新潘凤 - xinkuangfu:{ - enable:'phaseUse', - usable:1, - audio:2, - delay:false, - filterTarget:function(card,player,target){ - if(player==target) return player.countCards('e',function(card){ - return lib.filter.cardDiscardable(card,player); - })>0; - return target.countDiscardableCards(player,'e')>0; + xinkuangfu: { + enable: "phaseUse", + usable: 1, + audio: 2, + delay: false, + filterTarget: function (card, player, target) { + if (player == target) + return ( + player.countCards("e", function (card) { + return lib.filter.cardDiscardable(card, player); + }) > 0 + ); + return target.countDiscardableCards(player, "e") > 0; }, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('e')>0; + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("e") > 0; }); }, - content:function(){ - 'step 0' - if(player==target) player.chooseToDiscard('e',true); - else player.discardPlayerCard(target,'e',true); - 'step 1' - player.chooseUseTarget('sha',true,false,'nodistance'); - 'step 2' - var bool=game.hasPlayer2(function(current){ - return current.getHistory('damage',function(evt){ - return evt.getParent('xinkuangfu')==event; - }).length>0 + content: function () { + "step 0"; + if (player == target) player.chooseToDiscard("e", true); + else player.discardPlayerCard(target, "e", true); + ("step 1"); + player.chooseUseTarget("sha", true, false, "nodistance"); + ("step 2"); + var bool = game.hasPlayer2(function (current) { + return ( + current.getHistory("damage", function (evt) { + return evt.getParent("xinkuangfu") == event; + }).length > 0 + ); }); - if(player==target&&bool) player.draw(2); - else if(player!=target&&!bool) player.chooseToDiscard('h',2,true); + if (player == target && bool) player.draw(2); + else if (player != target && !bool) player.chooseToDiscard("h", 2, true); }, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.3; + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.3; }, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - var max=0; - var min=1; - target.countCards('e',function(card){ - var val=get.value(card,target); - if(val>max) max=val; - if(val max) max = val; + if (val < min) min = val; }); - if(att>0&&min<=0) return target.hasSkillTag('noe')?3:1; - if(att<=0&&max>0){ - if(target.hasSkillTag('noe')) return max>6?(-max/3):0; + if (att > 0 && min <= 0) return target.hasSkillTag("noe") ? 3 : 1; + if (att <= 0 && max > 0) { + if (target.hasSkillTag("noe")) return max > 6 ? -max / 3 : 0; return -max; } - if(player===target&&!player.hasSha()){ - let ph=player.countCards('h'); - if(game.hasPlayer(i=>{ - if(!player.canUse('sha',i,true,true)||get.effect(i,{name:'sha'},player,player)<=0) return false; - return !ph||!i.mayHaveShan(player,'use',i.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - })); - })) return 1; + if (player === target && !player.hasSha()) { + let ph = player.countCards("h"); + if ( + game.hasPlayer((i) => { + if ( + !player.canUse("sha", i, true, true) || + get.effect(i, { name: "sha" }, player, player) <= 0 + ) + return false; + return ( + !ph || + !i.mayHaveShan( + player, + "use", + i.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ); + }) + ) + return 1; } return 0; }, @@ -12392,693 +15370,932 @@ game.import('character', function () { }, }, }, - card:{ + card: {}, + characterIntro: { + dc_liuli: + "刘理(?—244年),字奉孝,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅、甘陵王刘永异母弟。章武元年(221年),刘备称帝,派司徒许靖封刘理为梁王。建兴八年(230年),改封为安平王。延熙七年(244年),刘理去世,谥号悼王。", + xingdaorong: + "邢道荣是《三国演义》中虚构的人物,为零陵太守刘度手下武将,被评价有万夫不当之勇,于《三国演义》第五十二回登场,被赵云刺死。", + caoxing: + "曹性,东汉末年吕布部将,史载他曾与身为自己上司的反叛者郝萌交战,并砍去郝萌一臂,受到吕布的嘉奖。在罗贯中所著古典小说《三国演义》中,也有关于曹性箭射夏侯惇左目的描述,而曹性也随即被暴怒的夏侯惇所杀。在穿越小说《三国之银河射手》中,主角穿越成为曹性,经过一番闯荡之后,被封为“银河射手”。", + xiahoujie: + "夏侯杰(?—208年),是罗贯中的小说《三国演义》中曹操的部将,征战时常常带在身边。在第42回长坂坡之战中,张飞大吼,从马儿受惊跌下马来而死。", + huaxin: "华歆(157年-232年1月30日),字子鱼,汉族。平原郡高唐县人(今山东省高唐县)。汉末至三国曹魏初年名士、重臣。华歆早年拜太尉陈球为师,与卢植、郑玄、管宁等为同门,又与管宁、邴原共称一龙,华歆为龙头。汉灵帝时华歆被举为孝廉,任郎中,因病去官。又被大将军何进征召为尚书郎。后任豫章太守,甚得民心。孙策率军南下,华歆举郡投降,被奉为上宾。官渡之战时,被征为议郎、参司空军事。入为尚书、侍中,又代荀彧为尚书令。丞相曹操讨孙权时,授华歆为军师。后为魏王国的御史大夫。曹丕即王位,拜华歆为相国,封安乐乡侯。曹魏建立后,其相国职名改称司徒。魏明帝即位,升任太尉,晋封博平侯。太和五年十二月(232年1月),华歆去世,年七十五,谥号“敬”。有文集三十卷,今佚失,其余见《全三国文》。", + luyusheng: + "陆郁生(?年-?),三国时期吴国官员陆绩之女。陆郁生的父亲陆绩是吴郡公认的才子,又是当时吴郡陆氏的领袖。陆绩赴任担任郁林太守,遂取此名。陆郁生年少的时候就定下坚贞的志向。建安二十四年(219年),陆绩早亡,她与两个兄弟陆宏、陆睿当时都只有几岁,一起返回吴县,被他们的从兄陆瑁接回抚养。13周岁的陆郁生嫁给同郡出身的张白为妻。出嫁3个月后,张白因为其兄张温一族的案件遭到连坐,被处以流刑,后死于流放地,陆郁生成为了寡妇,其后公开宣言不再改嫁,困难于生计但拒绝了所有提亲,在艰苦中从未停止服侍、照顾张白的姐妹。事情传到朝廷,皇帝褒奖陆郁生,号其为“义姑”。她的表侄姚信在文集中称赞她的义举。", + fengxi: "冯熙(?—223年),字子柔,颍川郡父城县(今河南省平顶山市宝丰县)人。汉末三国时期吴国官员,东汉初年名将冯异的后人。孙权担任车骑将军时,冯熙担任其幕府东曹掾,后迁立信都尉。刘备去世时,奉命进入蜀汉吊丧,返回后,任中大夫。后奉命出使魏国,受到魏文帝曹丕和尚书令陈群招揽,宁死不从,自尽未果。孙权闻之流泪,称其“东吴苏武”。最终在曹魏死去。", + heyan: "何晏(?-249年),字平叔。南阳郡宛县(今河南省南阳市)人。三国时期曹魏大臣、玄学家,东汉大将军何进之孙(一称何进弟何苗之孙)。何晏之父早逝,司空曹操纳其母尹氏为妾,他因而被收养,为曹操所宠爱。少年时以才秀知名,喜好老庄之学,娶曹操之女金乡公主。魏文帝在位时,未被授予官职。魏明帝认为何晏虚浮不实,也只授其冗官之职。大将军曹爽秉政时,何晏与之共事,得以累官至侍中、吏部尚书,典选举,封列侯。高平陵之变后,与大将军曹爽同为太傅司马懿所杀,被夷灭三族。何晏有文集十一卷,并曾与郑冲等共撰《论语集解》,今已佚。钟嵘《诗品》称“平叔鸿鹄之篇,风规见矣。”将何晏诗列入中品。袁宏在《名士传》中将何晏等称为正始名士。他与夏侯玄、王弼等倡导玄学,竞事清谈,遂开一时风气,为魏晋玄学的创始者之一。", + zhaoyan: + "赵嫣,生卒年不详。东吴方士(一说是丞相)赵达之妹,吴大帝孙权之妃,人称赵夫人。她心灵手巧,多才多艺,有“三绝”之称。孙权曾经想要找擅长绘画之人绘制山川地势军阵之图。赵达举荐了自己的妹妹。赵嫣认为水墨容易褪色,不方便在军旅之中保存。自己擅长刺绣,可以在锦帛上绣出孙权所需之图。待制作完成后献于孙权,只见方帛锦绣之上有五岳河海城邑行阵之形,孙权大为赞叹。时人谓之“针绝”。除刺绣之外,赵嫣还擅长绘画织锦,她能用彩丝织成云霞龙蛇之锦,大则盈尺,小则方寸,宫中谓之“机绝”。孙权在昭阳宫居住之时,饱受暑气之扰,以紫绡制成帷帐缓解暑气。赵嫣认为此物不足为贵,她削下自己的头发剖为细丝,以郁夷国出产的神胶连接,花了数月功夫将其制成一顶幔帐,打开之后薄如蝉翼,轻赛寒烟。放下帐帷能笼罩一丈之地,帐内清风自生暑意顿消。收起来则可纳入枕中,携带方便。时人谓之“丝绝”。", + wangtao: + "王桃是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王悦的姐姐,与妹妹都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。", + wangyue: + "王悦是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王桃的妹妹,与姐姐都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。", + zhangxuan: + "张嫙,三国时期孙吴将领张布之女,孙皓后妃张媱的姐姐。初为卫尉冯朝之子冯纯的妻子,后为孙皓后妃,册封左夫人。因孙皓诛灭张布,张媱口吐怨言,被暴怒的孙皓下令棒杀。后来孙皓怀念她的容颜,于是询问侍从:“张布还有女儿吗?”侍从回答:“张布的大女儿嫁给了已故卫尉冯朝的儿子冯纯。”于是孙皓夺走了冯纯的妻子张嫙,纳入宫中。孙皓颇为宠爱张嫙,册封其为左夫人。昼夜嬉戏,纸醉金迷,不理朝政。后来张嫙也去世了,孙皓非常悲伤,下令以最高的规格埋葬张嫙。因为悲伤过度,孙皓一度半年都不出宫门,甚至由于葬礼太过奢华被宫外之人认为孙皓已经死了。", + tengyin: + "滕胤(?-256年),字承嗣,三国时期吴国重臣,北海郡剧县(今山东省昌乐县)人。滕胤仪表堂堂,少时有节操,后娶公主为妻。孙权称王后,滕胤被封都亭侯。其后历任丹杨太守、吴郡太守、会稽太守。孙亮继位后,出任太常、卫将军。诸葛恪被杀后,群臣推举滕胤为司徒,但遭权臣孙峻党羽所阻挠,滕胤也有意避嫌,最终只晋爵高密侯。孙峻死后,由其堂弟孙綝执政。滕胤的连襟、骠骑将军吕据联系北伐前线诸将推举滕胤为相,希望分割孙綝权力,但并未成功,滕胤被改任大司马,镇守武昌。不久,滕胤与吕据密谋推翻孙綝,因计划泄露而被杀,惨遭灭族。孙綝被杀后,景帝孙休为滕胤平反。", + zhangyao: + "张美人,三国东吴末帝孙皓后妃,张布之女。另有张布女,张美人姊被孙皓立为左夫人。《吴书五妃嫔传第五》:江表传曰:皓以张布女为美人,有宠,皓问曰:“汝父所在?”答曰:“贼以杀之。”皓大怒,棒杀之。后思其颜色,使巧工刻木作美人形象,恒置座侧。问左右:“布复有女否?”答曰:“布大女适故卫尉冯朝子纯。”即夺纯妻入宫,大有宠,拜为左夫人,昼夜与夫人房宴,不听朝政,使尚方以金作华燧、步摇、假髻以千数。令宫人著以相扑,朝成夕败,辄出更作,工匠因缘偷盗,府藏为空。会夫人死,皓哀愍思念,葬于苑中,大作冢,使工匠刻柏作木人,内冢中以为兵卫,以金银珍玩之物送葬,不可称计。已葬之后,皓治丧於内,半年不出。国人见葬太奢丽,皆谓皓已死,所葬者是也。皓舅子何都颜状似皓,云都代立。临海太守奚熙信讹言,举兵欲还诛都,都叔父植时为备海督,击杀熙,夷三族,讹言乃息,而人心犹疑。", + xiahoulingnv: + "夏侯令女,字令女,名不详。生卒年不详,三国时期人物。夏侯文宁之女(《三国演义》中为夏侯令之女),曹文叔之妻。其事迹见于《三国志·魏书·诸夏侯曹传第九》裴松之注引皇甫谧《列女传》。而在《三国演义》中,由于作者断句错误,便认为“夏侯令女”是“夏侯令之女”之意(见《三国演义》第107回:“乃夏侯令女也”,由其语气可推断)。", + lvlingqi: + "吕玲绮,虚拟人物,源于日本光荣株式会社(现光荣特库摩公司)旗下游戏《真·三国无双》系列,初次登场于《真三国无双7:猛将传》。吕布的女儿,寂寥而威风凛凛的战姬,发挥着不亚于父亲的武艺,非常勇敢地身先士卒立于前线。虽然有着能够直面困难的坚强意志,却由于过去的经历而有着非常害怕孤独的一面。", + liuyong: + "刘永,字公寿,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅之弟。章武元年(221年)六月,封鲁王。建兴八年(230年),改封甘陵王。咸熙元年(264年),蜀汉灭亡,刘永被迁往洛阳,被任命为奉车都尉,封乡侯。", + wanniangongzhu: + "刘氏(生卒年不详),河南郡雒阳县(今河南省洛阳市)人,汉灵帝刘宏之女,汉少帝刘辩与汉献帝刘协的姐妹,封万年公主。", + mamidi: "马日磾(?~194年),字翁叔。扶风茂陵(今陕西省兴平市)人。东汉中后期大臣,经学大师马融之族孙(一作族子)。马日磾年轻时即继承马融学说,以才学入仕。曾任谏议大夫,与蔡邕、卢植等人东观典校官藏的《五经》记传,并参与续写《东观汉记》。后历任射声校尉、太尉、太常等职。初平三年(192年),掌权的李傕任命马日磾为太傅、录尚书事,与太仆赵岐共同出使关东。他到寿春袁术处后,对其多有所求,遭袁术轻鄙,袁术遂夺其符节,来随意征辟将士,并企图强迫马日磾任其军师,马日磾求去不能,忧愤发病,兴平元年(194年),卒于寿春。", + guanning: + "管宁(158年—241年),字幼安。北海郡朱虚县(今山东省安丘、临朐东南)人。汉末三国时期著名隐士。管宁与华歆、邴原并称为“一龙”。汉末天下大乱时,与邴原及王烈等人避于辽。在当地只谈经典而不问世事,做讲解《诗经》《书经》,谈祭礼、整治威仪、陈明礼让等教化工作,人们都很乐于接受他的教导。直到魏文帝黄初四年(公元223年)才返乡,辽东太守公孙恭亲自送别。此后曹魏几代帝王数次征召管宁,他都没有应命。正始二年(公元241年),管宁逝世,年八十四。著有《氏姓论》。", + tenggongzhu: + "滕公主,名讳不详,三国人物,吴大帝孙权之女。一说为养女,生父为孙权堂弟孙奂。黄武年间(222年—228年),以公主身份下嫁功臣滕胄之子滕胤,当时滕胤年仅20岁。滕胤皮肤白皙,容貌俊美,每逢入朝大臣们没有不惊叹称羡的。滕胤仕官后,上书言及时局,又对政策多有匡弼。孙权对公主也特别宠爱,因为滕胤的缘故,又格外增加对公主的赏赐,又几次探望慰劳。少帝孙亮时期,孙綝以宗室身份独揽大权作恶多端,引发群臣不满。五凤三年(256年)滕胤与连襟吕据密谋推翻孙綝,事败遭到夷三族 。公主则被亲兄孙壹救出,携其逃亡曹魏。", + caimaozhangyun: + "蔡瑁,字德珪,生卒年不详。襄阳蔡州人,东汉末年荆州名士。少年时与曹操交好。初平元年(公元190年),刘表为荆州刺史。时宗贼猖獗,蔡瑁协助刘表诛杀宗贼,平定荆州之地,蔡瑁因此得刘表重用,并在刘表任镇南将军时担任他的军师。刘表病亡后,蔡瑁拥护刘表幼子刘琮继位,并逼迫他投降南征的曹操。蔡瑁在曹操麾下历任从事中郎、司马、长水校尉,受封汉阳亭侯。张允,生卒年不详,荆州牧刘表的外甥,与蔡瑁一样是刘表幼子刘琮的党羽。刘表病重之时,张允害怕刘表会把州牧之位传给长子刘琦,于是将远赴而来的刘琦阻于门外,不准他与刘表相见。曹操大军到达新野时,张允也随蔡瑁一同投降曹操。之后便隐没于历史之中,并无记载。在《三国演义》中,蔡瑁张允擅长水战,是东吴心腹大患。周瑜用反间计诱骗曹操除掉二人,使得曹军再无能够统领水军的大将。", + zhangxun: + "张勋,东汉末年军阀袁术帐下大将,袁术称帝后受封大将军。初平四年(公元193年),袁术引兵入陈留,被曹操、袁绍合力击败,逃至雍丘。后入九江,杀死扬州刺史陈温而自领之,并任命张勋、桥蕤为大将。时孙策依附于袁术,被表为怀义校尉,张勋对其倾心敬服。袁术称帝后,任命张勋为大将军,攻打吕布,大败而还。其后曹操又以袁术称帝为名南下进攻,袁术闻之大惊,即走度淮,留张勋、桥蕤守蕲阳以拒曹。曹操破其军,斩桥蕤,张勋退走。建安四年(公元199年),袁术病死,张勋率残军欲南投孙策,途中被袁术旧部刘勋俘虏,其后下落不明。", + huzhao: "胡昭(162年-250年),字孔明,颍川(治今河南禹州)人。汉末三国时期隐士、书法家。胡昭善长隶书,与钟繇、邯郸淳、卫觊、韦诞齐名。有“钟氏小巧,胡氏豪放”之说,世人并称“钟胡”。", + guanhai: + "管亥(生卒年不详),青州黄巾军渠帅,率军侵略北海,围北海相孔融于都昌。孔融派遣太史慈突围而出,前往平原向刘备求援,刘备率军来到,击退管亥。《三国演义》中管亥在单挑中为关羽斩杀。", + yinfuren: + "尹夫人,原汉大将军何进的儿媳,丈夫早逝,生有一子何晏。曹操任司空时娶尹氏为妾,一并收养何晏,并生有一子曹矩。", + chengui: + "陈珪(生卒年不详),一作圭,字汉瑜。徐州下邳(治今江苏睢宁西北)人,广汉太守陈亹之孙,太尉陈球之侄,吴郡太守陈瑀(一作陈璃)、汝阴太守陈琮的从兄,陈登、陈应之父。官至沛相。", + wanglie: + "王烈,字彦方(141-219),平原县(今山东德州平原)人。生于永和六年(公元141年),卒于建安二十三年(公元218年)。王烈少时师从陈寔,闻名遐迩。董卓作乱时避乱辽东,并多次拒绝曹操的聘请。七十八岁时病死于辽东。", + panghui: + "庞会,(214—?),三国时期曹魏名将,庞德之子。曹丕即位后,思庞德忠烈,遂赐庞会等兄弟四人爵关内侯,邑各百户。庞会勇烈,有先父之风,官至中尉将军,封列侯。", + chenjiao: + "陈矫(?-237年7月11日),字季弼,广陵郡东阳县(治今安徽省天长市西北,今地属江苏省如皋市)人。三国时期曹魏名臣。陈矫本姓刘,因过继与母族而改姓陈。早年避乱江东,后广陵太守陈登请为功曹。曹操辟为丞相掾属,迁任相县令,转任征南长史。又为彭城、乐陵太守,迁任魏郡西部都尉。曹操东征,拜丞相长史,转西曹属、尚书。曹丕称帝,领吏部事,封高陵亭侯,迁尚书令。明帝继位后,进爵东乡侯,后转侍中,加光禄大夫,又拜司徒。景初元年(237年),陈矫去世,谥贞侯。", + gongsundu: + "公孙度 (?-204年),字升济,辽东襄平(今辽宁辽阳)人,东汉末年辽东太守。少随父迁居玄菟郡。初为玄菟小吏,建宁二年(169年),继升尚书郎、冀州刺史,后被免官。初平元年(190年),经同乡徐荣推荐,被董卓任命为辽东太守。公孙度到任后,厉行严刑峻法,打击豪强势力,使令行政通,羽翼渐丰。不久,中原地区董卓乱起,各地军阀无暇东顾。公孙度趁机自立为辽东侯、平州牧。继则东伐高句丽,西击乌桓,南取辽东半岛,越海取胶东半岛北部东莱诸县,开疆扩土;又招贤纳士,设馆开学,广招流民,威行海外,俨然以辽东王自居。建安九年(204年)病逝,子公孙康继承其位由于公孙度的锐意进取和苦心经营,使辽东地区在汉末三国的战乱年代,获得了暂时的安宁,推动了当地生产技术和封建文化的发展。", + leibo: "雷薄(生卒年不详),本为东汉末年袁术麾下部将。离开称帝后昏庸奢侈的袁术,与陈兰一起占据嵩山为山贼。后来袭击兵败的袁术,抢夺财宝。同时在《三国演义》中也有出场。", + liupi: "刘辟,东汉末年黄巾起义军将领。黄巾军将领。黄巾之乱后,与龚都一起率军盘踞在汝南。欲追随刘备,将汝南让给刘备。《三国演义》中,在与曹操的部将高览交战时,为保护刘备而战死。", + zhenghun: + "郑浑(生卒年不详),字文公。开封(今河南省开封市)人。汉末及三国时期曹魏大臣,东汉名儒郑众曾孙、名士郑泰之弟。郑浑早年避乱淮南,后转投豫章太守华歆。又被曹操辟为掾属,历任下蔡县长、邵陵县令,任内颇有政绩,深得民心。任左冯翊时,击杀扰乱郡县的梁兴,又击败作乱的山贼。历任上党太守、京兆尹、丞相掾属等职。曹丕称帝后,拜侍御史,加驸马都尉。先后任阳平、沛郡太守,任内兴修水利,使农田常年丰收,被百姓称为“郑陂”。后转任山阳和魏郡太守。魏明帝曹叡听闻郑浑的事迹之后,下诏将其政绩布告天下。官至将作大匠。卒年不详。", + furongfuqian: + "傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”
    傅佥[qiān] ( ? ~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。", + qinlang: + "秦朗(生卒年不详),字元明,小字阿蘇(一作阿鳔),新兴(治今山西忻州)云中人。三国时期曹魏将领,官至骁骑将军、给事中,曾率兵讨伐鲜卑轲比能和步度根的叛军。", + xianglang: + "向朗(约167年—247年),字巨达。襄阳郡宜城县(今湖北宜城)人,三国时期蜀汉官员、藏书家、学者。向朗早年师从于司马徽,并被荆州牧刘表任命为临沮县长。后随刘备入蜀,历任巴西、牂牁、房陵太守,并拜步兵校尉,领丞相长史,随丞相诸葛亮北伐。因包庇马谡被免职,后为光禄勋,转左将军、特进,封显明亭侯。曾代理丞相册封张皇后及太子刘璿。晚年专心研究典籍,诱导青年学习,家中藏书丰富,受到举国尊重。延熙十年(247年),向朗去世。《全三国文》收录有一篇《遗言戒子》", + yuantanyuanxiyuanshang: + "袁谭、袁尚的武将介绍请移步「袁谭袁尚」,此处为袁熙的介绍。
    袁熙(?-207年),字显奕(《后汉书》、《东光世系》作显雍),汝南郡汝阳县(今河南商水)人,是东汉末年占据河北的军阀袁绍次子,袁绍打败公孙瓒后,令袁熙为幽州刺史。袁绍官渡兵败后不久病死,其兄长袁谭、弟弟袁尚各自独立,互相攻伐,曹操趁机进攻袁谭、袁尚,并逐渐占河北。袁熙接纳兵败的袁尚后,因为属下叛变而逃往乌桓,被曹操击败后,逃往辽东太守公孙康帐下,却被公孙康杀死,二人首级被献给曹操。", + zhanghu: + "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。张辽之子,三国时期曹魏武将。官至偏将军,封晋阳侯,有一子张统。", + mengjie: + "孟节,南中蛮王孟获之兄。是小说《三国演义》中杜撰的人物,史上并无记载。诸葛亮南征孟获之时,帐下军士因误饮哑泉之水失语。当地山神告知诸葛亮,言万安溪畔有一高士隐居彼处,号“万安隐者”。其草庵后有一泉,名安乐泉,可解哑泉之毒。庵前生有一草,名薤叶芸香,可防瘴气之染。诸葛亮于是带人连夜前往其隐居之处,求得泉水草叶解毒防瘴,拜求隐士姓名,方知其名为孟节,由此而叹:“方信盗跖、下惠之事,今亦有之。”诸葛亮欲申奏刘禅,立其为王,孟节辞之。又以金帛赠之,孟节坚辞不受。诸葛亮嗟叹不已,拜别而回。", + peiyuanshao: + "裴元绍,《三国演义》人物,原黄巾军之武将。黄巾起义失败之后,与周仓一同率领残部在山中落草当山贼。公元200年,在关羽欲返刘备旗下,在突破曹操的五道关卡后路过其落草之地,与周仓一同向关羽要求能以期成为关羽家臣。但此时仅周仓同行,其他弟兄则于山中等待。不久后,因其欲夺偶然路过的赵云之马,反遭讨伐战败身死。", + zhangchu: + "张楚,《阵面对决》第九弹“燎原”中登场的一个原创人物。她是张角的女儿,张宁的姐姐,在逃亡途中被刘备捕获。之后在诸葛亮的建议下,张楚被囚禁。在《阵面对决》的“怒焰”故事线中,张楚随着刘备入了西川,并被软禁在成都。夷陵之战后,刘备大败,全国主力外出用以支援刘备,朝内空虚,张楚趁机逃跑。", + dongwan: "董绾,袁术老婆,嫉妒冯芳女的美貌,与冯方女有矛盾。", + yuanyin: + "袁胤(生卒年不详),东汉末期人物,据说是袁隗之子,是袁术从弟。兴平二年(公元195年)被袁术任命为丹杨太守,后因孙策平定江东被逐。建安四年(公元199年),袁术卒,袁胤因畏惧曹操,遂率领袁术部曲并带着其灵柩及妻子到皖城并投奔庐江太守刘勋。6个月后皖城被孙策所破,袁胤等人迁居吴郡,此后事迹不详。", + gaoxiang: + "高翔(又作高详、高祥)(生卒年不详),荆州南郡(治今湖北省公安县)人,三国时期蜀汉将领。曾随刘备攻打汉中,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争。建兴九年(公元231年)的北伐中大破司马懿。官至杂号大将军(即某杂号将军加大,但无考何杂号将军),封玄乡侯。此后,关于高翔的记载不详。", + zhoushan: + "周善,《三国演义》中人物,不见于正史记载。为吴侯孙权的家将,此人最有胆量,自幼穿房入户,多随孙策。权为骗其妹回吴,遣善将五百人,扮为商人,分作五船;更诈修国书,以备盘诘;船内暗藏兵器。周善领命,往荆州。正骗得孙夫人带刘禅上船,赵云前来抢走禅,周善在后梢挟住舵,只顾放船下水。正僵持时张飞赶到,周善见张飞上船,提刀来迎,被张飞手起一剑砍倒,提头掷于孙夫人前。", + zhangkai: + "张闿,陶谦的手下都尉。奉命截杀曹操之父曹嵩,杀死曹嵩,夺去财宝逃往淮南投奔袁术,并担任刺杀陈王刘宠和陈国相骆俊的任务。", + mengyou: + "孟优,《三国演义》里的人物,南蛮王孟获之弟。与诸葛亮的南征军交战,向败战的兄长推荐朵思大王,劝兄长借助朵思之力与蜀汉军对抗。后来与兄长一起发誓归顺蜀汉。", + liuchongluojun: + "刘宠(?~197年),汉明帝刘庄玄孙,陈敬王刘羡曾孙,陈顷王刘崇之孙,陈孝王刘承之子,陈国第六位国君,也是东汉陈国的最后一位国君。骆俊(?-197),字孝远,东汉末年扬州会稽郡乌伤县(今浙江义乌)人。宗室陈王刘宠的国相,在任期间励精图治,深得民众爱戴。刘宠勇猛过人,善使弓弩,箭法高超。在其父刘承死后,继承陈王爵位。中平年间,黄巾军起义,郡县官兵都弃城逃走,刘宠于是征兵自守卫。当时天下饥荒,诸王侯都已不再享有租赋,反屡遭抢掠,有的甚至流离在外,死于荒野。只有陈国仍很富强,邻郡百姓纷纷前去投靠,陈国拥有部众达十余万人。初平元年(190年),各州郡起兵讨伐董卓,刘宠率军屯驻阳夏,自称辅汉大将军。建安二年(197年),袁术向陈国求取粮草,遭陈国国相骆俊拒绝,袁术大为生气,便派刺客张闿假装路过陈国,乘机杀死骆俊和刘宠。", + yuechen: + "乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。", + kuaiqi: "蒯祺(?~219年),南郡中卢人,荆州望族子弟,与荆州牧刘表帐下谋士蒯良、蒯越为同族,东汉末年房陵太守。建安二十四年(219年),汉中王刘备遣宜都太守孟达从秭归北攻房陵,蒯祺于战斗中被孟达所部士兵所杀。清朝任兆麟《心斋十种》中的《襄阳记》辑本引用《万历襄阳府志》“(蒯)钦从祖祺妇,即诸葛孔明之姊也”,称蒯祺娶故兖州泰山郡丞诸葛珪长女,即他是知名政治家、蜀汉丞相诸葛亮的姐夫。但在任兆麟之前的《襄阳记》辑本中,并没有这一条。", + pangshanmin: + "庞山民,荆州襄阳人,三国时期曹魏大臣。庞山民出身荆州庞氏,为隐士庞德公之子、凤雏庞统的堂兄,娶诸葛亮二姐诸葛氏(“若雪”为网络小说虚构)为妻。后出仕曹魏,历任黄门、吏部郎等职。", + gongsunxiu: + "公孙修(?-238),三国时期人物,公孙渊之子。景初元年(237年),魏明帝曹叡派出幽州刺史毌丘俭攻打公孙渊,久战不利回师。公孙渊即自立为燕王,改元绍汉,引诱鲜卑侵扰北方,背叛曹魏。景初二年(238年)春,曹魏又派司马懿和高句丽国王高位宫率军攻打公孙渊,围城日久,公孙渊粮尽之后,与儿子公孙修一起出逃后被擒获,父子二人同时被斩首示众。", }, - characterIntro:{ - dc_liuli:'刘理(?—244年),字奉孝,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅、甘陵王刘永异母弟。章武元年(221年),刘备称帝,派司徒许靖封刘理为梁王。建兴八年(230年),改封为安平王。延熙七年(244年),刘理去世,谥号悼王。', - xingdaorong:'邢道荣是《三国演义》中虚构的人物,为零陵太守刘度手下武将,被评价有万夫不当之勇,于《三国演义》第五十二回登场,被赵云刺死。', - caoxing:'曹性,东汉末年吕布部将,史载他曾与身为自己上司的反叛者郝萌交战,并砍去郝萌一臂,受到吕布的嘉奖。在罗贯中所著古典小说《三国演义》中,也有关于曹性箭射夏侯惇左目的描述,而曹性也随即被暴怒的夏侯惇所杀。在穿越小说《三国之银河射手》中,主角穿越成为曹性,经过一番闯荡之后,被封为“银河射手”。', - xiahoujie:'夏侯杰(?—208年),是罗贯中的小说《三国演义》中曹操的部将,征战时常常带在身边。在第42回长坂坡之战中,张飞大吼,从马儿受惊跌下马来而死。', - huaxin:'华歆(157年-232年1月30日),字子鱼,汉族。平原郡高唐县人(今山东省高唐县)。汉末至三国曹魏初年名士、重臣。华歆早年拜太尉陈球为师,与卢植、郑玄、管宁等为同门,又与管宁、邴原共称一龙,华歆为龙头。汉灵帝时华歆被举为孝廉,任郎中,因病去官。又被大将军何进征召为尚书郎。后任豫章太守,甚得民心。孙策率军南下,华歆举郡投降,被奉为上宾。官渡之战时,被征为议郎、参司空军事。入为尚书、侍中,又代荀彧为尚书令。丞相曹操讨孙权时,授华歆为军师。后为魏王国的御史大夫。曹丕即王位,拜华歆为相国,封安乐乡侯。曹魏建立后,其相国职名改称司徒。魏明帝即位,升任太尉,晋封博平侯。太和五年十二月(232年1月),华歆去世,年七十五,谥号“敬”。有文集三十卷,今佚失,其余见《全三国文》。', - luyusheng:'陆郁生(?年-?),三国时期吴国官员陆绩之女。陆郁生的父亲陆绩是吴郡公认的才子,又是当时吴郡陆氏的领袖。陆绩赴任担任郁林太守,遂取此名。陆郁生年少的时候就定下坚贞的志向。建安二十四年(219年),陆绩早亡,她与两个兄弟陆宏、陆睿当时都只有几岁,一起返回吴县,被他们的从兄陆瑁接回抚养。13周岁的陆郁生嫁给同郡出身的张白为妻。出嫁3个月后,张白因为其兄张温一族的案件遭到连坐,被处以流刑,后死于流放地,陆郁生成为了寡妇,其后公开宣言不再改嫁,困难于生计但拒绝了所有提亲,在艰苦中从未停止服侍、照顾张白的姐妹。事情传到朝廷,皇帝褒奖陆郁生,号其为“义姑”。她的表侄姚信在文集中称赞她的义举。', - fengxi:'冯熙(?—223年),字子柔,颍川郡父城县(今河南省平顶山市宝丰县)人。汉末三国时期吴国官员,东汉初年名将冯异的后人。孙权担任车骑将军时,冯熙担任其幕府东曹掾,后迁立信都尉。刘备去世时,奉命进入蜀汉吊丧,返回后,任中大夫。后奉命出使魏国,受到魏文帝曹丕和尚书令陈群招揽,宁死不从,自尽未果。孙权闻之流泪,称其“东吴苏武”。最终在曹魏死去。', - heyan:'何晏(?-249年),字平叔。南阳郡宛县(今河南省南阳市)人。三国时期曹魏大臣、玄学家,东汉大将军何进之孙(一称何进弟何苗之孙)。何晏之父早逝,司空曹操纳其母尹氏为妾,他因而被收养,为曹操所宠爱。少年时以才秀知名,喜好老庄之学,娶曹操之女金乡公主。魏文帝在位时,未被授予官职。魏明帝认为何晏虚浮不实,也只授其冗官之职。大将军曹爽秉政时,何晏与之共事,得以累官至侍中、吏部尚书,典选举,封列侯。高平陵之变后,与大将军曹爽同为太傅司马懿所杀,被夷灭三族。何晏有文集十一卷,并曾与郑冲等共撰《论语集解》,今已佚。钟嵘《诗品》称“平叔鸿鹄之篇,风规见矣。”将何晏诗列入中品。袁宏在《名士传》中将何晏等称为正始名士。他与夏侯玄、王弼等倡导玄学,竞事清谈,遂开一时风气,为魏晋玄学的创始者之一。', - zhaoyan:'赵嫣,生卒年不详。东吴方士(一说是丞相)赵达之妹,吴大帝孙权之妃,人称赵夫人。她心灵手巧,多才多艺,有“三绝”之称。孙权曾经想要找擅长绘画之人绘制山川地势军阵之图。赵达举荐了自己的妹妹。赵嫣认为水墨容易褪色,不方便在军旅之中保存。自己擅长刺绣,可以在锦帛上绣出孙权所需之图。待制作完成后献于孙权,只见方帛锦绣之上有五岳河海城邑行阵之形,孙权大为赞叹。时人谓之“针绝”。除刺绣之外,赵嫣还擅长绘画织锦,她能用彩丝织成云霞龙蛇之锦,大则盈尺,小则方寸,宫中谓之“机绝”。孙权在昭阳宫居住之时,饱受暑气之扰,以紫绡制成帷帐缓解暑气。赵嫣认为此物不足为贵,她削下自己的头发剖为细丝,以郁夷国出产的神胶连接,花了数月功夫将其制成一顶幔帐,打开之后薄如蝉翼,轻赛寒烟。放下帐帷能笼罩一丈之地,帐内清风自生暑意顿消。收起来则可纳入枕中,携带方便。时人谓之“丝绝”。', - wangtao:'王桃是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王悦的姐姐,与妹妹都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。', - wangyue:'王悦是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王桃的妹妹,与姐姐都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。', - zhangxuan:'张嫙,三国时期孙吴将领张布之女,孙皓后妃张媱的姐姐。初为卫尉冯朝之子冯纯的妻子,后为孙皓后妃,册封左夫人。因孙皓诛灭张布,张媱口吐怨言,被暴怒的孙皓下令棒杀。后来孙皓怀念她的容颜,于是询问侍从:“张布还有女儿吗?”侍从回答:“张布的大女儿嫁给了已故卫尉冯朝的儿子冯纯。”于是孙皓夺走了冯纯的妻子张嫙,纳入宫中。孙皓颇为宠爱张嫙,册封其为左夫人。昼夜嬉戏,纸醉金迷,不理朝政。后来张嫙也去世了,孙皓非常悲伤,下令以最高的规格埋葬张嫙。因为悲伤过度,孙皓一度半年都不出宫门,甚至由于葬礼太过奢华被宫外之人认为孙皓已经死了。', - tengyin:'滕胤(?-256年),字承嗣,三国时期吴国重臣,北海郡剧县(今山东省昌乐县)人。滕胤仪表堂堂,少时有节操,后娶公主为妻。孙权称王后,滕胤被封都亭侯。其后历任丹杨太守、吴郡太守、会稽太守。孙亮继位后,出任太常、卫将军。诸葛恪被杀后,群臣推举滕胤为司徒,但遭权臣孙峻党羽所阻挠,滕胤也有意避嫌,最终只晋爵高密侯。孙峻死后,由其堂弟孙綝执政。滕胤的连襟、骠骑将军吕据联系北伐前线诸将推举滕胤为相,希望分割孙綝权力,但并未成功,滕胤被改任大司马,镇守武昌。不久,滕胤与吕据密谋推翻孙綝,因计划泄露而被杀,惨遭灭族。孙綝被杀后,景帝孙休为滕胤平反。', - zhangyao:'张美人,三国东吴末帝孙皓后妃,张布之女。另有张布女,张美人姊被孙皓立为左夫人。《吴书五妃嫔传第五》:江表传曰:皓以张布女为美人,有宠,皓问曰:“汝父所在?”答曰:“贼以杀之。”皓大怒,棒杀之。后思其颜色,使巧工刻木作美人形象,恒置座侧。问左右:“布复有女否?”答曰:“布大女适故卫尉冯朝子纯。”即夺纯妻入宫,大有宠,拜为左夫人,昼夜与夫人房宴,不听朝政,使尚方以金作华燧、步摇、假髻以千数。令宫人著以相扑,朝成夕败,辄出更作,工匠因缘偷盗,府藏为空。会夫人死,皓哀愍思念,葬于苑中,大作冢,使工匠刻柏作木人,内冢中以为兵卫,以金银珍玩之物送葬,不可称计。已葬之后,皓治丧於内,半年不出。国人见葬太奢丽,皆谓皓已死,所葬者是也。皓舅子何都颜状似皓,云都代立。临海太守奚熙信讹言,举兵欲还诛都,都叔父植时为备海督,击杀熙,夷三族,讹言乃息,而人心犹疑。', - xiahoulingnv:'夏侯令女,字令女,名不详。生卒年不详,三国时期人物。夏侯文宁之女(《三国演义》中为夏侯令之女),曹文叔之妻。其事迹见于《三国志·魏书·诸夏侯曹传第九》裴松之注引皇甫谧《列女传》。而在《三国演义》中,由于作者断句错误,便认为“夏侯令女”是“夏侯令之女”之意(见《三国演义》第107回:“乃夏侯令女也”,由其语气可推断)。', - lvlingqi:'吕玲绮,虚拟人物,源于日本光荣株式会社(现光荣特库摩公司)旗下游戏《真·三国无双》系列,初次登场于《真三国无双7:猛将传》。吕布的女儿,寂寥而威风凛凛的战姬,发挥着不亚于父亲的武艺,非常勇敢地身先士卒立于前线。虽然有着能够直面困难的坚强意志,却由于过去的经历而有着非常害怕孤独的一面。', - liuyong:'刘永,字公寿,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅之弟。章武元年(221年)六月,封鲁王。建兴八年(230年),改封甘陵王。咸熙元年(264年),蜀汉灭亡,刘永被迁往洛阳,被任命为奉车都尉,封乡侯。', - wanniangongzhu:'刘氏(生卒年不详),河南郡雒阳县(今河南省洛阳市)人,汉灵帝刘宏之女,汉少帝刘辩与汉献帝刘协的姐妹,封万年公主。', - mamidi:'马日磾(?~194年),字翁叔。扶风茂陵(今陕西省兴平市)人。东汉中后期大臣,经学大师马融之族孙(一作族子)。马日磾年轻时即继承马融学说,以才学入仕。曾任谏议大夫,与蔡邕、卢植等人东观典校官藏的《五经》记传,并参与续写《东观汉记》。后历任射声校尉、太尉、太常等职。初平三年(192年),掌权的李傕任命马日磾为太傅、录尚书事,与太仆赵岐共同出使关东。他到寿春袁术处后,对其多有所求,遭袁术轻鄙,袁术遂夺其符节,来随意征辟将士,并企图强迫马日磾任其军师,马日磾求去不能,忧愤发病,兴平元年(194年),卒于寿春。', - guanning:'管宁(158年—241年),字幼安。北海郡朱虚县(今山东省安丘、临朐东南)人。汉末三国时期著名隐士。管宁与华歆、邴原并称为“一龙”。汉末天下大乱时,与邴原及王烈等人避于辽。在当地只谈经典而不问世事,做讲解《诗经》《书经》,谈祭礼、整治威仪、陈明礼让等教化工作,人们都很乐于接受他的教导。直到魏文帝黄初四年(公元223年)才返乡,辽东太守公孙恭亲自送别。此后曹魏几代帝王数次征召管宁,他都没有应命。正始二年(公元241年),管宁逝世,年八十四。著有《氏姓论》。', - tenggongzhu:'滕公主,名讳不详,三国人物,吴大帝孙权之女。一说为养女,生父为孙权堂弟孙奂。黄武年间(222年—228年),以公主身份下嫁功臣滕胄之子滕胤,当时滕胤年仅20岁。滕胤皮肤白皙,容貌俊美,每逢入朝大臣们没有不惊叹称羡的。滕胤仕官后,上书言及时局,又对政策多有匡弼。孙权对公主也特别宠爱,因为滕胤的缘故,又格外增加对公主的赏赐,又几次探望慰劳。少帝孙亮时期,孙綝以宗室身份独揽大权作恶多端,引发群臣不满。五凤三年(256年)滕胤与连襟吕据密谋推翻孙綝,事败遭到夷三族 。公主则被亲兄孙壹救出,携其逃亡曹魏。', - caimaozhangyun:'蔡瑁,字德珪,生卒年不详。襄阳蔡州人,东汉末年荆州名士。少年时与曹操交好。初平元年(公元190年),刘表为荆州刺史。时宗贼猖獗,蔡瑁协助刘表诛杀宗贼,平定荆州之地,蔡瑁因此得刘表重用,并在刘表任镇南将军时担任他的军师。刘表病亡后,蔡瑁拥护刘表幼子刘琮继位,并逼迫他投降南征的曹操。蔡瑁在曹操麾下历任从事中郎、司马、长水校尉,受封汉阳亭侯。张允,生卒年不详,荆州牧刘表的外甥,与蔡瑁一样是刘表幼子刘琮的党羽。刘表病重之时,张允害怕刘表会把州牧之位传给长子刘琦,于是将远赴而来的刘琦阻于门外,不准他与刘表相见。曹操大军到达新野时,张允也随蔡瑁一同投降曹操。之后便隐没于历史之中,并无记载。在《三国演义》中,蔡瑁张允擅长水战,是东吴心腹大患。周瑜用反间计诱骗曹操除掉二人,使得曹军再无能够统领水军的大将。', - zhangxun:'张勋,东汉末年军阀袁术帐下大将,袁术称帝后受封大将军。初平四年(公元193年),袁术引兵入陈留,被曹操、袁绍合力击败,逃至雍丘。后入九江,杀死扬州刺史陈温而自领之,并任命张勋、桥蕤为大将。时孙策依附于袁术,被表为怀义校尉,张勋对其倾心敬服。袁术称帝后,任命张勋为大将军,攻打吕布,大败而还。其后曹操又以袁术称帝为名南下进攻,袁术闻之大惊,即走度淮,留张勋、桥蕤守蕲阳以拒曹。曹操破其军,斩桥蕤,张勋退走。建安四年(公元199年),袁术病死,张勋率残军欲南投孙策,途中被袁术旧部刘勋俘虏,其后下落不明。', - huzhao:'胡昭(162年-250年),字孔明,颍川(治今河南禹州)人。汉末三国时期隐士、书法家。胡昭善长隶书,与钟繇、邯郸淳、卫觊、韦诞齐名。有“钟氏小巧,胡氏豪放”之说,世人并称“钟胡”。', - guanhai:'管亥(生卒年不详),青州黄巾军渠帅,率军侵略北海,围北海相孔融于都昌。孔融派遣太史慈突围而出,前往平原向刘备求援,刘备率军来到,击退管亥。《三国演义》中管亥在单挑中为关羽斩杀。', - yinfuren:'尹夫人,原汉大将军何进的儿媳,丈夫早逝,生有一子何晏。曹操任司空时娶尹氏为妾,一并收养何晏,并生有一子曹矩。', - chengui:'陈珪(生卒年不详),一作圭,字汉瑜。徐州下邳(治今江苏睢宁西北)人,广汉太守陈亹之孙,太尉陈球之侄,吴郡太守陈瑀(一作陈璃)、汝阴太守陈琮的从兄,陈登、陈应之父。官至沛相。', - wanglie:'王烈,字彦方(141-219),平原县(今山东德州平原)人。生于永和六年(公元141年),卒于建安二十三年(公元218年)。王烈少时师从陈寔,闻名遐迩。董卓作乱时避乱辽东,并多次拒绝曹操的聘请。七十八岁时病死于辽东。', - panghui:'庞会,(214—?),三国时期曹魏名将,庞德之子。曹丕即位后,思庞德忠烈,遂赐庞会等兄弟四人爵关内侯,邑各百户。庞会勇烈,有先父之风,官至中尉将军,封列侯。', - chenjiao:'陈矫(?-237年7月11日),字季弼,广陵郡东阳县(治今安徽省天长市西北,今地属江苏省如皋市)人。三国时期曹魏名臣。陈矫本姓刘,因过继与母族而改姓陈。早年避乱江东,后广陵太守陈登请为功曹。曹操辟为丞相掾属,迁任相县令,转任征南长史。又为彭城、乐陵太守,迁任魏郡西部都尉。曹操东征,拜丞相长史,转西曹属、尚书。曹丕称帝,领吏部事,封高陵亭侯,迁尚书令。明帝继位后,进爵东乡侯,后转侍中,加光禄大夫,又拜司徒。景初元年(237年),陈矫去世,谥贞侯。', - gongsundu:'公孙度 (?-204年),字升济,辽东襄平(今辽宁辽阳)人,东汉末年辽东太守。少随父迁居玄菟郡。初为玄菟小吏,建宁二年(169年),继升尚书郎、冀州刺史,后被免官。初平元年(190年),经同乡徐荣推荐,被董卓任命为辽东太守。公孙度到任后,厉行严刑峻法,打击豪强势力,使令行政通,羽翼渐丰。不久,中原地区董卓乱起,各地军阀无暇东顾。公孙度趁机自立为辽东侯、平州牧。继则东伐高句丽,西击乌桓,南取辽东半岛,越海取胶东半岛北部东莱诸县,开疆扩土;又招贤纳士,设馆开学,广招流民,威行海外,俨然以辽东王自居。建安九年(204年)病逝,子公孙康继承其位由于公孙度的锐意进取和苦心经营,使辽东地区在汉末三国的战乱年代,获得了暂时的安宁,推动了当地生产技术和封建文化的发展。', - leibo:'雷薄(生卒年不详),本为东汉末年袁术麾下部将。离开称帝后昏庸奢侈的袁术,与陈兰一起占据嵩山为山贼。后来袭击兵败的袁术,抢夺财宝。同时在《三国演义》中也有出场。', - liupi:'刘辟,东汉末年黄巾起义军将领。黄巾军将领。黄巾之乱后,与龚都一起率军盘踞在汝南。欲追随刘备,将汝南让给刘备。《三国演义》中,在与曹操的部将高览交战时,为保护刘备而战死。', - zhenghun:'郑浑(生卒年不详),字文公。开封(今河南省开封市)人。汉末及三国时期曹魏大臣,东汉名儒郑众曾孙、名士郑泰之弟。郑浑早年避乱淮南,后转投豫章太守华歆。又被曹操辟为掾属,历任下蔡县长、邵陵县令,任内颇有政绩,深得民心。任左冯翊时,击杀扰乱郡县的梁兴,又击败作乱的山贼。历任上党太守、京兆尹、丞相掾属等职。曹丕称帝后,拜侍御史,加驸马都尉。先后任阳平、沛郡太守,任内兴修水利,使农田常年丰收,被百姓称为“郑陂”。后转任山阳和魏郡太守。魏明帝曹叡听闻郑浑的事迹之后,下诏将其政绩布告天下。官至将作大匠。卒年不详。', - furongfuqian:'傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”
    傅佥[qiān] ( ? ~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。', - qinlang:'秦朗(生卒年不详),字元明,小字阿蘇(一作阿鳔),新兴(治今山西忻州)云中人。三国时期曹魏将领,官至骁骑将军、给事中,曾率兵讨伐鲜卑轲比能和步度根的叛军。', - xianglang:'向朗(约167年—247年),字巨达。襄阳郡宜城县(今湖北宜城)人,三国时期蜀汉官员、藏书家、学者。向朗早年师从于司马徽,并被荆州牧刘表任命为临沮县长。后随刘备入蜀,历任巴西、牂牁、房陵太守,并拜步兵校尉,领丞相长史,随丞相诸葛亮北伐。因包庇马谡被免职,后为光禄勋,转左将军、特进,封显明亭侯。曾代理丞相册封张皇后及太子刘璿。晚年专心研究典籍,诱导青年学习,家中藏书丰富,受到举国尊重。延熙十年(247年),向朗去世。《全三国文》收录有一篇《遗言戒子》', - yuantanyuanxiyuanshang:'袁谭、袁尚的武将介绍请移步「袁谭袁尚」,此处为袁熙的介绍。
    袁熙(?-207年),字显奕(《后汉书》、《东光世系》作显雍),汝南郡汝阳县(今河南商水)人,是东汉末年占据河北的军阀袁绍次子,袁绍打败公孙瓒后,令袁熙为幽州刺史。袁绍官渡兵败后不久病死,其兄长袁谭、弟弟袁尚各自独立,互相攻伐,曹操趁机进攻袁谭、袁尚,并逐渐占河北。袁熙接纳兵败的袁尚后,因为属下叛变而逃往乌桓,被曹操击败后,逃往辽东太守公孙康帐下,却被公孙康杀死,二人首级被献给曹操。', - zhanghu:'张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。张辽之子,三国时期曹魏武将。官至偏将军,封晋阳侯,有一子张统。', - mengjie:'孟节,南中蛮王孟获之兄。是小说《三国演义》中杜撰的人物,史上并无记载。诸葛亮南征孟获之时,帐下军士因误饮哑泉之水失语。当地山神告知诸葛亮,言万安溪畔有一高士隐居彼处,号“万安隐者”。其草庵后有一泉,名安乐泉,可解哑泉之毒。庵前生有一草,名薤叶芸香,可防瘴气之染。诸葛亮于是带人连夜前往其隐居之处,求得泉水草叶解毒防瘴,拜求隐士姓名,方知其名为孟节,由此而叹:“方信盗跖、下惠之事,今亦有之。”诸葛亮欲申奏刘禅,立其为王,孟节辞之。又以金帛赠之,孟节坚辞不受。诸葛亮嗟叹不已,拜别而回。', - peiyuanshao:'裴元绍,《三国演义》人物,原黄巾军之武将。黄巾起义失败之后,与周仓一同率领残部在山中落草当山贼。公元200年,在关羽欲返刘备旗下,在突破曹操的五道关卡后路过其落草之地,与周仓一同向关羽要求能以期成为关羽家臣。但此时仅周仓同行,其他弟兄则于山中等待。不久后,因其欲夺偶然路过的赵云之马,反遭讨伐战败身死。', - zhangchu:'张楚,《阵面对决》第九弹“燎原”中登场的一个原创人物。她是张角的女儿,张宁的姐姐,在逃亡途中被刘备捕获。之后在诸葛亮的建议下,张楚被囚禁。在《阵面对决》的“怒焰”故事线中,张楚随着刘备入了西川,并被软禁在成都。夷陵之战后,刘备大败,全国主力外出用以支援刘备,朝内空虚,张楚趁机逃跑。', - dongwan:'董绾,袁术老婆,嫉妒冯芳女的美貌,与冯方女有矛盾。', - yuanyin:'袁胤(生卒年不详),东汉末期人物,据说是袁隗之子,是袁术从弟。兴平二年(公元195年)被袁术任命为丹杨太守,后因孙策平定江东被逐。建安四年(公元199年),袁术卒,袁胤因畏惧曹操,遂率领袁术部曲并带着其灵柩及妻子到皖城并投奔庐江太守刘勋。6个月后皖城被孙策所破,袁胤等人迁居吴郡,此后事迹不详。', - gaoxiang:'高翔(又作高详、高祥)(生卒年不详),荆州南郡(治今湖北省公安县)人,三国时期蜀汉将领。曾随刘备攻打汉中,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争。建兴九年(公元231年)的北伐中大破司马懿。官至杂号大将军(即某杂号将军加大,但无考何杂号将军),封玄乡侯。此后,关于高翔的记载不详。', - zhoushan:'周善,《三国演义》中人物,不见于正史记载。为吴侯孙权的家将,此人最有胆量,自幼穿房入户,多随孙策。权为骗其妹回吴,遣善将五百人,扮为商人,分作五船;更诈修国书,以备盘诘;船内暗藏兵器。周善领命,往荆州。正骗得孙夫人带刘禅上船,赵云前来抢走禅,周善在后梢挟住舵,只顾放船下水。正僵持时张飞赶到,周善见张飞上船,提刀来迎,被张飞手起一剑砍倒,提头掷于孙夫人前。', - zhangkai:'张闿,陶谦的手下都尉。奉命截杀曹操之父曹嵩,杀死曹嵩,夺去财宝逃往淮南投奔袁术,并担任刺杀陈王刘宠和陈国相骆俊的任务。', - mengyou:'孟优,《三国演义》里的人物,南蛮王孟获之弟。与诸葛亮的南征军交战,向败战的兄长推荐朵思大王,劝兄长借助朵思之力与蜀汉军对抗。后来与兄长一起发誓归顺蜀汉。', - liuchongluojun:'刘宠(?~197年),汉明帝刘庄玄孙,陈敬王刘羡曾孙,陈顷王刘崇之孙,陈孝王刘承之子,陈国第六位国君,也是东汉陈国的最后一位国君。骆俊(?-197),字孝远,东汉末年扬州会稽郡乌伤县(今浙江义乌)人。宗室陈王刘宠的国相,在任期间励精图治,深得民众爱戴。刘宠勇猛过人,善使弓弩,箭法高超。在其父刘承死后,继承陈王爵位。中平年间,黄巾军起义,郡县官兵都弃城逃走,刘宠于是征兵自守卫。当时天下饥荒,诸王侯都已不再享有租赋,反屡遭抢掠,有的甚至流离在外,死于荒野。只有陈国仍很富强,邻郡百姓纷纷前去投靠,陈国拥有部众达十余万人。初平元年(190年),各州郡起兵讨伐董卓,刘宠率军屯驻阳夏,自称辅汉大将军。建安二年(197年),袁术向陈国求取粮草,遭陈国国相骆俊拒绝,袁术大为生气,便派刺客张闿假装路过陈国,乘机杀死骆俊和刘宠。', - yuechen:'乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。', - kuaiqi:'蒯祺(?~219年),南郡中卢人,荆州望族子弟,与荆州牧刘表帐下谋士蒯良、蒯越为同族,东汉末年房陵太守。建安二十四年(219年),汉中王刘备遣宜都太守孟达从秭归北攻房陵,蒯祺于战斗中被孟达所部士兵所杀。清朝任兆麟《心斋十种》中的《襄阳记》辑本引用《万历襄阳府志》“(蒯)钦从祖祺妇,即诸葛孔明之姊也”,称蒯祺娶故兖州泰山郡丞诸葛珪长女,即他是知名政治家、蜀汉丞相诸葛亮的姐夫。但在任兆麟之前的《襄阳记》辑本中,并没有这一条。', - pangshanmin:'庞山民,荆州襄阳人,三国时期曹魏大臣。庞山民出身荆州庞氏,为隐士庞德公之子、凤雏庞统的堂兄,娶诸葛亮二姐诸葛氏(“若雪”为网络小说虚构)为妻。后出仕曹魏,历任黄门、吏部郎等职。', - gongsunxiu:'公孙修(?-238),三国时期人物,公孙渊之子。景初元年(237年),魏明帝曹叡派出幽州刺史毌丘俭攻打公孙渊,久战不利回师。公孙渊即自立为燕王,改元绍汉,引诱鲜卑侵扰北方,背叛曹魏。景初二年(238年)春,曹魏又派司马懿和高句丽国王高位宫率军攻打公孙渊,围城日久,公孙渊粮尽之后,与儿子公孙修一起出逃后被擒获,父子二人同时被斩首示众。', - }, - characterTitle:{ - }, - characterFilter:{ - }, - dynamicTranslate:{ - cuijian:function(player){ - return '出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你'+(player.hasMark('zhtongyuan_basic')?'':',然后你交给其等量的牌')+'。'+(player.hasMark('zhtongyuan_trick')?'若其手牌中没有【闪】,则你摸两张牌。':''); + characterTitle: {}, + characterFilter: {}, + dynamicTranslate: { + cuijian: function (player) { + return ( + "出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你" + + (player.hasMark("zhtongyuan_basic") ? "" : ",然后你交给其等量的牌") + + "。" + + (player.hasMark("zhtongyuan_trick") ? "若其手牌中没有【闪】,则你摸两张牌。" : "") + ); }, - dunshi:function(player){ - var info=player.storage.dunshi; - var str='每回合限一次。你可以视为使用或打出一张'; - var list=['sha','shan','tao','jiu']; - for(var i of list){ - var strx='【'+get.translation(i)+'】'; - if(!info||!info[0].includes(i)) strx=(''+strx+''); - str+=strx; - if(i!='jiu') str+='/'; + dunshi: function (player) { + var info = player.storage.dunshi; + var str = "每回合限一次。你可以视为使用或打出一张"; + var list = ["sha", "shan", "tao", "jiu"]; + for (var i of list) { + var strx = "【" + get.translation(i) + "】"; + if (!info || !info[0].includes(i)) + strx = '' + strx + ""; + str += strx; + if (i != "jiu") str += "/"; } - str+=',然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。'; + str += + ",然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。"; return str; }, - dcporui:function(player){ - return '每轮限'+(player.hasMark('dcgonghu_basic')?'两':'一')+'次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】'+(player.hasMark('dcgonghu_damage')?'':',然后你交给其X张手牌')+'(X为其本回合失去的牌数且至多为5)。'; + dcporui: function (player) { + return ( + "每轮限" + + (player.hasMark("dcgonghu_basic") ? "两" : "一") + + "次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】" + + (player.hasMark("dcgonghu_damage") ? "" : ",然后你交给其X张手牌") + + "(X为其本回合失去的牌数且至多为5)。" + ); }, - dcmanwang:function(player){ - var num=4-player.countMark('dcmanwang'); - var str='出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:'; - var list=[ - '⒈获得〖叛侵〗。', - '⒉摸一张牌。', - '⒊回复1点体力。', - '⒋摸两张牌并失去〖叛侵〗。', - ]; - for(var i=0;i<4;i++){ - if(i==num){ - str+=''; + dcmanwang: function (player) { + var num = 4 - player.countMark("dcmanwang"); + var str = "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:"; + var list = ["⒈获得〖叛侵〗。", "⒉摸一张牌。", "⒊回复1点体力。", "⒋摸两张牌并失去〖叛侵〗。"]; + for (var i = 0; i < 4; i++) { + if (i == num) { + str += ''; } - str+=list[i]; + str += list[i]; } - if(num<4) str+=''; + if (num < 4) str += ""; return str; }, - dcjianzhuan(player){ - let str='锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:'; - const list=[ - '⒈令一名角色弃置X张牌', - ';', - '⒉摸X张牌', - ';', - '⒊重铸X张牌', - ';', - '⒋弃置X张牌', - ],info=get.info('dcjianzhuan').choices,storage=player.getStorage('dcjianzhuan'); - let choices=[]; - for(const k in info) choices.push(k); - for(let i=0;ii).includes(j); - if(goon&&storage.includes(choices[j])) str+=''; - str+=list[i]; - if(goon&&storage.includes(choices[j])) str+=''; + dcjianzhuan(player) { + let str = "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:"; + const list = [ + "⒈令一名角色弃置X张牌", + ";", + "⒉摸X张牌", + ";", + "⒊重铸X张牌", + ";", + "⒋弃置X张牌", + ], + info = get.info("dcjianzhuan").choices, + storage = player.getStorage("dcjianzhuan"); + let choices = []; + for (const k in info) choices.push(k); + for (let i = 0; i < list.length; i++) { + const j = i / 2, + goon = Array.from({ length: list.length }) + .map((_, i) => i) + .includes(j); + if (goon && storage.includes(choices[j])) + str += ''; + str += list[i]; + if (goon && storage.includes(choices[j])) str += ""; } - return str+'(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。'; + return ( + str + + "(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。" + ); }, }, - perfectPair:{}, - characterReplace:{ - dongbai:['dongbai','re_dongbai','jsrg_dongbai'], - chunyuqiong:['chunyuqiong','re_chunyuqiong','jsrg_chunyuqiong'], - kanze:['kanze','re_kanze'], - chendeng:['ol_chendeng','re_chendeng','chendeng','jsrg_chendeng'], - miheng:['re_miheng','miheng'], - liuba:['ol_liuba','dc_liuba','liuba'], - lvkuanglvxiang:['lvkuanglvxiang','dc_lvkuanglvxiang'], - dc_huangquan:['xf_huangquan','dc_huangquan'], - yuejiu:['dc_yuejiu','yuejiu'], - jiling:['dc_jiling','tw_jiling','jiling'], - sp_jiaxu:['sp_jiaxu','dc_sp_jiaxu','yj_jiaxu'], - qiaorui:['qiaorui','tw_qiaorui'], - mamidi:['mamidi','xin_mamidi'], - mengyou:['mengyou','ns_mengyou'], - zhangchu:['zhangchu','jsrg_zhangchu'], - xianglang:['xianglang','mb_xianglang'], - chengui:['chengui','mb_chengui'], - liuyong:['liuyong','jsrg_liuyong'], - zhangxuan:['zhangxuan','jsrg_zhangxuan'], - gaoxiang:['gaoxiang','jsrg_gaoxiang'], - lingcao:['lingcao','dc_lingcao'], - sp_menghuo:['sp_menghuo','dc_sp_menghuo'], - sunchen:['dc_sunchen','pe_sunchen'], + perfectPair: {}, + characterReplace: { + dongbai: ["dongbai", "re_dongbai", "jsrg_dongbai"], + chunyuqiong: ["chunyuqiong", "re_chunyuqiong", "jsrg_chunyuqiong"], + kanze: ["kanze", "re_kanze"], + chendeng: ["ol_chendeng", "re_chendeng", "chendeng", "jsrg_chendeng"], + miheng: ["re_miheng", "miheng"], + liuba: ["ol_liuba", "dc_liuba", "liuba"], + lvkuanglvxiang: ["lvkuanglvxiang", "dc_lvkuanglvxiang"], + dc_huangquan: ["xf_huangquan", "dc_huangquan"], + yuejiu: ["dc_yuejiu", "yuejiu"], + jiling: ["dc_jiling", "tw_jiling", "jiling"], + sp_jiaxu: ["sp_jiaxu", "dc_sp_jiaxu", "yj_jiaxu"], + qiaorui: ["qiaorui", "tw_qiaorui"], + mamidi: ["mamidi", "xin_mamidi"], + mengyou: ["mengyou", "ns_mengyou"], + zhangchu: ["zhangchu", "jsrg_zhangchu"], + xianglang: ["xianglang", "mb_xianglang"], + chengui: ["chengui", "mb_chengui"], + liuyong: ["liuyong", "jsrg_liuyong"], + zhangxuan: ["zhangxuan", "jsrg_zhangxuan"], + gaoxiang: ["gaoxiang", "jsrg_gaoxiang"], + lingcao: ["lingcao", "dc_lingcao"], + sp_menghuo: ["sp_menghuo", "dc_sp_menghuo"], + sunchen: ["dc_sunchen", "pe_sunchen"], }, - translate:{ - re_panfeng:'潘凤', - xinkuangfu:'狂斧', - xinkuangfu_info:'出牌阶段限一次,你可选择:1,弃置装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】造成伤害,你摸两张牌。2,弃置一名其他角色装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】未造成伤害,你弃置两张手牌。(均无距离和次数限制)', - xingdaorong:'邢道荣', - xuxie:'虚猲', - xuxie_info:'出牌阶段开始时,你可以减1点体力上限并选择所有距离1以内的角色,弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时,若你的体力上限不为全场最多,则你加1点体力上限,然后回复1点体力或摸两张牌。', - caoxing:'曹性', - cxliushi:'流矢', - cxliushi2:'流矢', - cxliushi_info:'出牌阶段,你可以将一张红桃牌置于牌堆顶,视为对一名角色使用一张【杀】(无距离限制且不计入使用次数)。当此【杀】造成伤害后,受到伤害的角色获得一个“流”。有“流”的角色手牌上限-X(X为其“流”数)。', - zhanwan:'斩腕', - zhanwan_info:'锁定技,有“流”的角色于弃牌阶段弃牌后,你摸等量的牌,然后其移去所有的“流”。', - re_chunyuqiong:'淳于琼', - recangchu:'仓储', - recangchu2:'仓储', - recangchu3:'仓储', - recangchu_info:'锁定技。①游戏开始时,你获得3个“粮”。你的手牌上限+X(X为“粮”数)。②每回合限一次,当你于回合外得到牌后,你获得一个“粮”。(你的“粮”数不能超过存活角色数)', - reliangying:'粮营', - reliangying_info:'弃牌阶段开始时,你可以摸至多X张牌,然后交给等量的角色各一张牌。(X为你的“粮”数)', - reshishou:'失守', - reshishou2:'失守', - reshishou_info:'锁定技,当你使用【酒】时或受到1点火焰伤害后,你移去一个“粮”。准备阶段,若你没有“粮”,你失去1点体力。', - xiahoujie:'夏侯杰', - liedan:'裂胆', - liedan_info:'锁定技,其他角色的准备阶段开始时,若X大于0,则你摸X张牌。若X等于3,则你加1点体力上限(至多加到8)。若X为0,则你失去1点体力并获得一枚“裂”(X为你的手牌数,体力值,装备区牌数中大于其的数量)。准备阶段,若“裂”数大于4,则你死亡。', - zhuangdan:'壮胆', - zhuangdan_mark:'壮胆', - zhuangdan_info:'锁定技,其他角色的回合结束时,若你的手牌数为全场唯一最多,则你令〖裂胆〗失效直到你下回合结束。', - dc_caiyang:'蔡阳', - dcxunji:'寻嫉', - dcxunji_info:'出牌阶段限一次,你可以选择一名其他角色。该角色的下个结束阶段开始时,若其此回合使用过黑色牌,则你视为对其使用一张【决斗】,且当此【决斗】对其造成伤害后,其对你造成等量的伤害。', - dcjiaofeng:'交锋', - dcjiaofeng_info:'锁定技。每回合限一次,当你造成伤害时,若你本回合内未造成过其他伤害且你已损失的体力值:大于0,则你摸一张牌;大于1,则此伤害+1;大于2,则你回复1点体力。', - zhoushan:'周善', - dcmiyun:'密运', - dcmiyun_tag:'安', - dcmiyun_info:'锁定技。①一轮游戏开始时,你依次执行:1.若你有“安”,你将包括“安”的在内的任意张手牌交给一名其他角色,然后你将手牌补至体力上限;2.你正面向上获得一名其他角色的一张牌,称为“安”。②当你不因〖密运①〗失去“安”后,你失去1点体力。', - dcdanying:'胆迎', - dcdanying_info:'每回合限一次。你可以展示“安”,然后视为使用或打出一张【杀】或【闪】。然后当你于本回合下一次成为牌的目标后,使用者弃置你的一张牌。', - re_sunluyu:'孙鲁育', - remeibu:'魅步', - remeibu_info:'其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌A,该角色于本阶段内拥有〖止息〗,且当其因〖止息〗弃置与牌A花色相同的牌时,你获得之。', - rezhixi:'止息', - rezhixi_info:'锁定技,当你使用【杀】或普通锦囊牌时,你弃置一张手牌。', - remumu:'穆穆', - remumu_info:'出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌,然后你本回合可使用【杀】的次数+1;2.获得一名角色装备区里的一张牌,然后你本回合可使用【杀】的次数-1。', - re_dongbai:'董白', - relianzhu:'连诛', - relianzhu_info:'出牌阶段限一次,你可将一张牌正面朝上交给一名其他角色。若此牌为:红色,你摸一张牌;黑色,对方弃置两张牌或令你摸两张牌。', - rexiahui:'黠慧', - rexiahui_info:'锁定技,①你的黑色牌不计入手牌上限。②当有其他角色获得你的黑色牌后,其于下次扣减体力前不能使用,打出,弃置这些牌。③一名其他角色的回合结束时,若其本回合失去过其所有“黠慧”牌,则其失去1点体力。', - heyan:'何晏', - yachai:'崖柴', - yachai_info:'当你受到伤害后,你可令伤害来源选择一项:①其本回合不能再使用手牌,然后你摸两张牌;②其展示所有手牌,然后将其手牌中一种花色的所有牌交给你;③弃置一半数量的手牌(向上取整)。', - qingtan:'清谈', - qingtan_info:'出牌阶段限一次,你可令所有有手牌的角色同时选择一张手牌并同时展示。你可以获得其中一种花色的牌,然后展示此花色牌的角色各摸一张牌。若如此做,弃置其他的牌。', - zhaoyan:'赵嫣', - jinhui:'锦绘', - jinhui_info:'出牌阶段限一次,你可以随机亮出牌堆中的三张不具有“伤害”标签且使用目标范围为“自己”或“一名角色”的牌,然后选择一名其他角色。该角色选择并按如下“锦绘”规则使用其中一张,然后你可以按如下“锦绘”规则使用剩余的任意张牌:若此牌的使用目标为“自己”,则对自己使用该牌,否则对对方使用该牌(无距离限制且不计入次数限制)。', - qingman:'轻幔', - qingman_info:'锁定技。一名角色的回合结束时,你将手牌摸至X张(X为其装备区中空栏的数量)。', - wangtao:'王桃', - wangyue:'王悦', - huguan:'护关', - huguan_info:'一名角色于出牌阶段内使用第一张牌时,若此牌为红色,则你可以声明一种花色。该花色的牌不计入其本回合的手牌上限。', - yaopei:'摇佩', - yaopei_info:'其他角色的弃牌阶段结束时,若你本回合内对其发动过〖护关〗,则你可以弃置一张与其于此阶段弃置的牌花色均不相同的牌。然后你选择一项:①其摸两张牌,你回复1点体力。②其回复1点体力,你摸两张牌。', - mingluan:'鸣鸾', - mingluan_info:'其他角色的结束阶段开始时,若有角色于本回合内回复过体力,则你可以弃置任意张牌,然后摸X张牌(X为当前角色的手牌数,且至多摸至5张)。', - zhangxuan:'张嫙', - tongli:'同礼', + translate: { + re_panfeng: "潘凤", + xinkuangfu: "狂斧", + xinkuangfu_info: + "出牌阶段限一次,你可选择:1,弃置装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】造成伤害,你摸两张牌。2,弃置一名其他角色装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】未造成伤害,你弃置两张手牌。(均无距离和次数限制)", + xingdaorong: "邢道荣", + xuxie: "虚猲", + xuxie_info: + "出牌阶段开始时,你可以减1点体力上限并选择所有距离1以内的角色,弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时,若你的体力上限不为全场最多,则你加1点体力上限,然后回复1点体力或摸两张牌。", + caoxing: "曹性", + cxliushi: "流矢", + cxliushi2: "流矢", + cxliushi_info: + "出牌阶段,你可以将一张红桃牌置于牌堆顶,视为对一名角色使用一张【杀】(无距离限制且不计入使用次数)。当此【杀】造成伤害后,受到伤害的角色获得一个“流”。有“流”的角色手牌上限-X(X为其“流”数)。", + zhanwan: "斩腕", + zhanwan_info: "锁定技,有“流”的角色于弃牌阶段弃牌后,你摸等量的牌,然后其移去所有的“流”。", + re_chunyuqiong: "淳于琼", + recangchu: "仓储", + recangchu2: "仓储", + recangchu3: "仓储", + recangchu_info: + "锁定技。①游戏开始时,你获得3个“粮”。你的手牌上限+X(X为“粮”数)。②每回合限一次,当你于回合外得到牌后,你获得一个“粮”。(你的“粮”数不能超过存活角色数)", + reliangying: "粮营", + reliangying_info: + "弃牌阶段开始时,你可以摸至多X张牌,然后交给等量的角色各一张牌。(X为你的“粮”数)", + reshishou: "失守", + reshishou2: "失守", + reshishou_info: + "锁定技,当你使用【酒】时或受到1点火焰伤害后,你移去一个“粮”。准备阶段,若你没有“粮”,你失去1点体力。", + xiahoujie: "夏侯杰", + liedan: "裂胆", + liedan_info: + "锁定技,其他角色的准备阶段开始时,若X大于0,则你摸X张牌。若X等于3,则你加1点体力上限(至多加到8)。若X为0,则你失去1点体力并获得一枚“裂”(X为你的手牌数,体力值,装备区牌数中大于其的数量)。准备阶段,若“裂”数大于4,则你死亡。", + zhuangdan: "壮胆", + zhuangdan_mark: "壮胆", + zhuangdan_info: + "锁定技,其他角色的回合结束时,若你的手牌数为全场唯一最多,则你令〖裂胆〗失效直到你下回合结束。", + dc_caiyang: "蔡阳", + dcxunji: "寻嫉", + dcxunji_info: + "出牌阶段限一次,你可以选择一名其他角色。该角色的下个结束阶段开始时,若其此回合使用过黑色牌,则你视为对其使用一张【决斗】,且当此【决斗】对其造成伤害后,其对你造成等量的伤害。", + dcjiaofeng: "交锋", + dcjiaofeng_info: + "锁定技。每回合限一次,当你造成伤害时,若你本回合内未造成过其他伤害且你已损失的体力值:大于0,则你摸一张牌;大于1,则此伤害+1;大于2,则你回复1点体力。", + zhoushan: "周善", + dcmiyun: "密运", + dcmiyun_tag: "安", + dcmiyun_info: + "锁定技。①一轮游戏开始时,你依次执行:1.若你有“安”,你将包括“安”的在内的任意张手牌交给一名其他角色,然后你将手牌补至体力上限;2.你正面向上获得一名其他角色的一张牌,称为“安”。②当你不因〖密运①〗失去“安”后,你失去1点体力。", + dcdanying: "胆迎", + dcdanying_info: + "每回合限一次。你可以展示“安”,然后视为使用或打出一张【杀】或【闪】。然后当你于本回合下一次成为牌的目标后,使用者弃置你的一张牌。", + re_sunluyu: "孙鲁育", + remeibu: "魅步", + remeibu_info: + "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌A,该角色于本阶段内拥有〖止息〗,且当其因〖止息〗弃置与牌A花色相同的牌时,你获得之。", + rezhixi: "止息", + rezhixi_info: "锁定技,当你使用【杀】或普通锦囊牌时,你弃置一张手牌。", + remumu: "穆穆", + remumu_info: + "出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌,然后你本回合可使用【杀】的次数+1;2.获得一名角色装备区里的一张牌,然后你本回合可使用【杀】的次数-1。", + re_dongbai: "董白", + relianzhu: "连诛", + relianzhu_info: + "出牌阶段限一次,你可将一张牌正面朝上交给一名其他角色。若此牌为:红色,你摸一张牌;黑色,对方弃置两张牌或令你摸两张牌。", + rexiahui: "黠慧", + rexiahui_info: + "锁定技,①你的黑色牌不计入手牌上限。②当有其他角色获得你的黑色牌后,其于下次扣减体力前不能使用,打出,弃置这些牌。③一名其他角色的回合结束时,若其本回合失去过其所有“黠慧”牌,则其失去1点体力。", + heyan: "何晏", + yachai: "崖柴", + yachai_info: + "当你受到伤害后,你可令伤害来源选择一项:①其本回合不能再使用手牌,然后你摸两张牌;②其展示所有手牌,然后将其手牌中一种花色的所有牌交给你;③弃置一半数量的手牌(向上取整)。", + qingtan: "清谈", + qingtan_info: + "出牌阶段限一次,你可令所有有手牌的角色同时选择一张手牌并同时展示。你可以获得其中一种花色的牌,然后展示此花色牌的角色各摸一张牌。若如此做,弃置其他的牌。", + zhaoyan: "赵嫣", + jinhui: "锦绘", + jinhui_info: + "出牌阶段限一次,你可以随机亮出牌堆中的三张不具有“伤害”标签且使用目标范围为“自己”或“一名角色”的牌,然后选择一名其他角色。该角色选择并按如下“锦绘”规则使用其中一张,然后你可以按如下“锦绘”规则使用剩余的任意张牌:若此牌的使用目标为“自己”,则对自己使用该牌,否则对对方使用该牌(无距离限制且不计入次数限制)。", + qingman: "轻幔", + qingman_info: "锁定技。一名角色的回合结束时,你将手牌摸至X张(X为其装备区中空栏的数量)。", + wangtao: "王桃", + wangyue: "王悦", + huguan: "护关", + huguan_info: + "一名角色于出牌阶段内使用第一张牌时,若此牌为红色,则你可以声明一种花色。该花色的牌不计入其本回合的手牌上限。", + yaopei: "摇佩", + yaopei_info: + "其他角色的弃牌阶段结束时,若你本回合内对其发动过〖护关〗,则你可以弃置一张与其于此阶段弃置的牌花色均不相同的牌。然后你选择一项:①其摸两张牌,你回复1点体力。②其回复1点体力,你摸两张牌。", + mingluan: "鸣鸾", + mingluan_info: + "其他角色的结束阶段开始时,若有角色于本回合内回复过体力,则你可以弃置任意张牌,然后摸X张牌(X为当前角色的手牌数,且至多摸至5张)。", + zhangxuan: "张嫙", + tongli: "同礼", //tongli_info:'当你于出牌阶段内不因〖同礼〗而使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内不因〖同礼〗而使用过的牌数相等,则你可以于此牌结算结束后依次视为对此牌的所有目标使用X张名称和属性相同的牌(X为你手牌中的花色数)。', - tongli_info:'当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以令此牌额外结算X次(X为你手牌中的花色数)。', - shezang:'奢葬', - shezang_info:'每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以从牌堆中获得每种花色的牌各一张。', - tengyin:'滕胤', - chenjian:'陈见', - chenjian_info:'准备阶段,你可亮出牌堆顶的3+X张牌(X为你“陈见”标记的数量且至多为2),然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌。', - xixiu:'皙秀', - xixiu_info:'锁定技。①当你成为其他角色使用牌的目标时,若你的装备区内有和此牌花色相同的牌,则你摸一张牌。②若你装备区内的牌数为1,则其他角色不能弃置你装备区内的牌。', - zhangyao:'张媱', - yuanyu:"怨语", - yuanyu_info:"出牌阶段限一次。你可以摸一张牌,然后选择一张手牌和一名其他角色。该角色获得如下效果直到你发动〖夕颜〗:{你与该角色的弃牌阶段开始时,或当该角色造成1点伤害后,其须将一张手牌作为“怨”置于你的武将牌上}。然后你将你选择的手牌作为“怨”置于你的武将牌上。", - xiyan:"夕颜", - xiyan_info:"当有牌作为“怨”移动到你的武将牌上后,若“怨”中的花色数达到4种,则你可以获得所有“怨”。然后若当前回合角色:是你,你本回合手牌上限+4且使用牌无次数限制且重置你的〖怨语〗于此阶段的发动次数;不是你,你可令当前回合角色本回合手牌上限-4且不能使用基本牌。", - xiahoulingnv:'夏侯令女', - fuping:'浮萍', - fuping_info:'①其他角色对你使用的牌结算结束后,若你未因此技能记录过此牌的名称且你有未废除的装备栏,则你可以废除一个装备栏,记录此牌的名称。②每回合每种牌名限一次。你可以将一张非基本牌当做〖浮萍①〗记录过的基本牌或锦囊牌使用或打出。③若你的所有装备栏均已被废除,则你使用牌无距离限制。', - weilie:'炜烈', - weilie_info:'每局游戏限X次。出牌阶段,你可以弃置一张牌并选择一名已受伤的角色,令该角色回复1点体力。然后若其体力值小于体力上限,则其摸一张牌(X为你〖浮萍①〗中的记录数+1)。', - dc_sunru:'孙茹', - xiecui:'撷翠', - xiecui_info:'当有角色于回合内第一次因执行牌的效果而造成伤害时,你可以令此伤害+1。若其势力为吴,则该角色获得此伤害牌对应的实体牌,且其本回合的手牌上限+1。', - youxu:'忧恤', - youxu_info:'一名角色A的回合结束时,若其手牌数大于体力值,则你可以展示A的一张牌,然后将此牌交给另一名角色B。若B的体力值为全场最少,则B回复1点体力。', - huaxin:'华歆', - wanggui:'望归', - wanggui_info:'每回合限触发一次,当你造成或受到伤害后,若你:仅明置了此武将牌,则你可对与你势力不同的一名角色造成1点伤害;武将牌均明置,则你可令与你势力相同的角色各摸一张牌。', - spwanggui:'望归', - spwanggui_info:'①当你受到伤害后,你可以摸一张牌,或和一名势力相同的其他角色各摸一张牌;②每回合限一次,当你造成伤害后,你可以对一名与你势力不同的角色造成1点伤害。', - xibing:'息兵', - xibing_info:'当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸五张)且本回合不能再使用手牌。', - xibing_info_guozhan:'当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。', - luyusheng:'陆郁生', - zhente:'贞特', - zhente2:'贞特', - zhente_info:'每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.此牌对你无效。', - zhente_info_guozhan:'每回合限一次,当你成为其他角色使用黑色基本牌或黑色普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用黑色牌;2.此牌对你无效。', - zhiwei:'至微', - zhiwei2:'至微', - zhiwei_info:'游戏开始时/你的回合开始时,若场上没有因此法被选择过的角色存活,则你选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。', - zhiwei_info_guozhan:'你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。', - zhanghu:'张虎', - cuijian:'摧坚', - cuijian_info:'出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你,然后你交给其等量的牌。', - zhtongyuan:'同援', - zhtongyuan_info:'锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。', - lvlingqi:'吕玲绮', - guowu:'帼舞', - guowu_info:'出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】或普通锦囊牌可以多指定至多两个目标。', - guowu_info_guozhan:'出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】可以多指定至多两个目标。', - zhuangrong:'妆戎', - zhuangrong_info:'觉醒技,一名角色的回合结束时,若你的体力值或手牌数为1,你减1点体力上限并回复体力至上限,将手牌摸至体力上限,然后获得〖神威〗和〖无双〗。', - llqshenwei:'神威', - llqshenwei_info:'锁定技,摸牌阶段开始时,你令额定摸牌数+2;你的手牌上限+2。', - re_kanze:'阚泽', - rekuanshi:'宽释', - rekuanshi_info:'结束阶段,你可以选择一名角色。你获得如下效果直到你下回合开始:每回合限一次,当其于一回合内受到第2点伤害后,其回复1点体力。', - liuyong:'刘永', - zhuning:'诛佞', - zhuning_info:'出牌阶段限一次。你可将任意张牌交给一名其他角色(称为“隙”),然后可视为使用一张具有伤害标签的基本牌/锦囊牌(不计入次数限制)。若你以此法使用的牌未造成伤害,则你将〖诛佞〗于本回合内改为“限两次”。', - fengxiang:'封乡', - fengxiang_info:'锁定技。①当你受到伤害后,若场上:存在“隙”唯一最多的角色,则其回复1点体力;不存在,则你摸一张牌。②当有角色的手牌移动后,若场上“隙”最多的角色因此发生变化,则你摸一张牌。', - fengxiang_tag:'隙', - re_xunchen:'荀谌', - refenglve:'锋略', - refenglve_info:'出牌阶段限一次,你可以和一名其他角色进行拼点。若你赢,其将区域内的两张牌交给你;若平局,则你令此技能于本阶段内的发动次数上限+1;若你输,其获得你的拼点牌。', - anyong:'暗涌', - anyong_info:'当一名角色于其回合内第一次对另一名其他角色造成伤害后,若伤害值为1,则你可弃置一张牌,并对受伤角色造成1点伤害。', - wanniangongzhu:'万年公主', - zhenge:'枕戈', - zhenge_info:'准备阶段,你可以选择一名角色。该角色本局游戏的攻击范围+1(至多+5)。然后若除其外的所有角色都在该角色的攻击范围内,则你可以令其视为对另一名角色使用一张【杀】。', - xinghan:'兴汉', - xinghan_info:'锁定技,每回合的第一张【杀】造成伤害后,若此【杀】的使用者成为过〖枕戈〗的目标,则你摸一张牌。若你的手牌数不是全场唯一最多的,则改为摸X张牌(X为该角色的攻击范围且最多为5)。', - re_chendeng:'陈登', - refuyuan:'扶援', - refuyuan_info:'一名角色成为【杀】的目标后,若其本回合内没有成为过其他红色牌的目标,则你可以令其摸一张牌。', - reyingshui:'营说', - reyingshui_info:'出牌阶段限一次,你可将一张牌交给攻击范围内的一名其他角色,然后其选择一项:①交给你至少两张装备牌。②受到1点伤害。', - rewangzu:'望族', - rewangzu_info:'每回合限一次。当你受到其他角色造成的伤害时,你可随机弃置一张手牌,令此伤害-1。若你所在阵营的存活角色数是全场最多的,则你可以自行选择弃置的牌。', - re_miheng:'祢衡', - rekuangcai:'狂才', - rekuangcai_info:'锁定技。①你于回合内使用牌无距离和次数限制。②弃牌阶段开始时,若你本回合内:未使用过牌,则你本局游戏的手牌上限+1;使用过牌但未造成过伤害,则你本局游戏的手牌上限-1。③结束阶段开始时,你摸X张牌(X为你本回合内造成的伤害且至多为5)。', - reshejian:'舌剑', - reshejian_info:'每回合限两次。当你成为其他角色使用牌的唯一目标后,你可以弃置至少两张手牌。若如此做,你选择一项:⒈弃置其等量的牌。⒉对其造成1点伤害。', - fengxi:'冯熙', - yusui:'玉碎', - yusui_info:'当你成为其他角色使用黑色牌的目标后,你可以失去1点体力,然后选择一项:⒈令其将手牌数弃置至与你相同;⒉令其失去Y点体力(Y为其的体力值减去你的体力值,不为正时不可选择)。', - boyan:'驳言', - boyan_info:'出牌阶段限一次,你可选择一名其他角色。其将手牌摸至体力上限(至多摸至五张),然后其本回合不能使用或打出手牌。', - re_dengzhi:'邓芝', - jianliang:'简亮', - jianliang_info:'摸牌阶段开始时,若你的手牌数不为全场最多,则你可以令至多两名角色各摸一张牌。', - weimeng:'危盟', - weimeng_info:'出牌阶段限一次,你可以获得一名其他角色的至多X张手牌,然后交给其等量的牌(X为你的体力值)。若你给出的牌点数之和:大于得到的牌,则你摸一张牌;小于得到的牌,弃置该角色区域内的一张牌。', - mamidi:'马日磾', - bingjie:'秉节', - bingjie_info:'出牌阶段开始时,你可减1点体力上限,然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。', - zhengding:'正订', - zhengding_info:'锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌颜色相同,则你加1点体力上限并回复1点体力。', - dc_jiben:'吉本', - xunli:'询疠', - xunli_info:'锁定技。①当有黑色牌因弃置而进入弃牌堆后,若X大于0,则你将其中的X张牌置于武将牌上作为“疠”(X=min(这些牌的数量,9-Y),Y=你的“疠”数)。②出牌阶段开始时,你可以用任意张黑色手牌交换等量的“疠”。', - zhishi:'指誓', - zhishi_info:'结束阶段,你可选择一名角色。当该角色于你的下回合开始前{成为【杀】的目标后或进入濒死状态时},你可移去任意张“疠”,然后其摸等量的牌。', - lieyi:'烈医', - lieyi_info:'出牌阶段限一次。你可以展示所有“疠”并选择一名其他角色,对其使用其中的一张可对其使用的牌(无距离和次数限制)并重复此流程,并将其余的牌置于弃牌堆。然后若其存活且未于此流程中因受到伤害而进入过濒死状态,则你失去1点体力。', - guanning:'管宁', - dunshi:'遁世', - dunshi_info:'每回合限一次。你可以视为使用或打出一张【杀】/【闪】/【桃】/【酒】,然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。', - dc_gaolan:'高览', - xizhen:'袭阵', - xizhen_info:'出牌阶段开始时,你可选择一名其他角色,视为对其使用【杀】或【决斗】。然后当有角色于本阶段内使用或打出牌响应你时,该角色回复1点体力,你摸一张牌(若其满体力,改为两张)。', - dc_huangchengyan:'黄承彦', - dcjiezhen:'解阵', - dcjiezhen_info:'出牌阶段限一次,你可选择一名其他角色。该角色获得〖八阵〗,且其所有不为{锁定技、限定技、觉醒技、主公技、带有Charlotte标签}的技能失效。你的下回合开始时,或其因〖八卦阵〗发起的判定结算结束后,你令其恢复其以此法失效的所有技能并失去以此法获得的〖八阵〗,然后获得其区域内的一张牌。', - dczecai:'择才', - dczecai_info:'限定技。一轮游戏开始时,若游戏轮数大于1,则你可令一名其他角色获得〖集智〗直到下一轮游戏开始;若其是上一轮内使用过锦囊牌数量唯一最多的角色,则其获得一个额外的回合。', - dcyinshi:'隐世', - dcyinshi_info:'锁定技。①每回合限一次,当你受到伤害时,若此伤害的渠道不为有颜色的牌,则你防止此伤害。②当有因〖八卦阵〗发起的判定的判定牌生效时,你获得此判定牌。', - tenggongzhu:'滕公主', - xingchong:'幸宠', - xingchong_info:'一轮游戏开始时,你可声明两个自然数X和Y,且(X+Y)≤min(5, 你的体力上限)。你摸X张牌并展示Y张手牌。若如此做,当你于本轮内失去一张以此法展示的牌后,你摸两张牌。', - liunian:'流年', - liunian_info:'锁定技。一名角色的回合结束时,若本回合内进行了本次游戏的第一次洗牌,则你加1点体力上限;若本回合内进行了本次游戏的第二次洗牌,则你于本回合结束时回复1点体力,且本局游戏内的手牌上限+10。', - caimaozhangyun:'蔡瑁张允', - lianzhou:'连舟', - lianzhou_info:'锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。', - jinglan:'惊澜', - jinglan_info:'锁定技。当你造成伤害后,若你的手牌数:大于体力值,你弃置四张手牌;等于体力值,你弃置一张手牌并回复1点体力;小于体力值,你受到1点无来源火焰伤害并摸五张牌。', - dc_yanghu:'羊祜', - dcdeshao:'德劭', - dcdeshao_info:'每回合限两次。当你成为其他角色使用的黑色牌的目标后,你可以摸一张牌,然后若其手牌数不小于你,则你弃置其一张牌。', - dcmingfa:'明伐', - dcmingfa_info:'①出牌阶段限一次。当你使用【杀】或普通锦囊牌结算结束后,若你的武将牌上没有“明伐”牌,则你可以将此牌作为“明伐”牌置于武将牌上并选择一名其他角色,记录该角色和此牌的名称。②一名角色的回合结束时,若其是你〖明伐①〗记录的角色,则你视为对其依次使用X张〖明伐①〗记录的牌,然后移去“明伐”牌(X为其手牌数且至少为1,至多为5)。③一名角色死亡时,若其是你〖明伐①〗记录的角色,则你移去“明伐”牌。', - dc_jiling:'纪灵', - dcshuangren:'双刃', - dcshuangren_info:'出牌阶段开始时,你可以和一名其他角色A进行拼点。若你赢,你选择一名角色B,或选择包含A在内的两名角色A和B(B的势力需与A相同),然后视为对被选择的角色使用一张【杀】(不计入次数限制);若你没赢,则你本阶段内不能使用【杀】。', - zhangxun:'张勋', - suizheng:'随征', - suizheng_info:'结束阶段,你可以选择一名角色A,获得如下效果直到其下回合结束:①A于下回合出牌阶段内使用【杀】的次数上限+1且无距离限制;②A下回合的出牌阶段结束时,你可以选择一名此阶段内受到过A造成的伤害的角色B,视为对B使用一张【杀】。', - dc_liuba:'刘巴', - dczhubi:'铸币', - dczhubi_info:'当有♦牌因弃置而进入弃牌堆后,你可以令系统从牌堆/弃牌堆中检索一张【无中生有】,并将此牌置于牌堆顶。', - dcliuzhuan:'流转', - dcliuzhuan_tag:'转', - dcliuzhuan_info:'锁定技。①其他角色于其回合内不于摸牌阶段而得到的牌称为“转”。②你不能成为实体牌中包含“转”的牌的目标。③当有“转”直接进入弃牌堆或经由处理区进入弃牌堆后,你获得之。', - huzhao:'胡昭', - midu:'弥笃', - midu_info:'出牌阶段限一次。你可以选择一项:⒈废除任意个装备栏或判定区,并令一名角色摸等量的牌。⒉恢复一个已经被废除的装备栏或判定区,然后你获得〖活墨〗直到下回合开始。', - xianwang:'贤望', - xianwang_info:'锁定技。若你有被废除的装备栏,则其他角色至你的距离+1,你至其他角色的距离-1;若废除的装备栏数大于2,则改为距离+2/-2。', - guanhai:'管亥', - suoliang:'索粮', - suoliang_info:'每回合限一次。当你对其他角色造成伤害后,你可以选择并展示其的至多X张牌(X为其体力上限且至多为5)。若这些牌中有♥或♣牌,则你获得这些牌;否则你弃置这些牌。', - qinbao:'侵暴', - qinbao_info:'锁定技。当你使用【杀】或普通锦囊牌时,你令所有手牌数不小于你的角色不能响应此牌。', - dc_lvkuanglvxiang:'吕旷吕翔', - dcshuhe:'数合', - dcshuhe_info:'出牌阶段限一次,你可以展示一张手牌并获得一枚“爵”。若场上有与此牌点数相同的牌,则你获得这些牌;否则你将此牌交给一名其他角色。', - dcliehou:'列侯', - dcliehou_info:'锁定技。摸牌阶段开始时,你令额定摸牌数+X;然后此摸牌阶段结束时,你选择一项:⒈弃置X张牌。⒉失去1点体力(X为你的“爵”数+1且至多为5)。', - yinfuren:'尹夫人', - dcyingyu:'媵予', - dcyingyu_info:'准备阶段开始时,你可以展示两名角色的各一张手牌。若这两张牌的花色不同,则你可以令一名角色获得另一名角色的展示牌。', - dcyongbi:'拥嬖', - dcyongbi_info:'限定技。出牌阶段,你可以将所有手牌交给一名其他男性角色。你将〖媵予〗的发动时机改为“准备阶段和结束阶段开始时”。然后若这些牌中包含的花色数:大于1,则你与其本局游戏的手牌上限+2;大于2,则当你或其于本局游戏内受到大于1的伤害时,此伤害-1。', - dc_huangquan:'黄权', - dcquanjian:'劝谏', - dcquanjian_info:'出牌阶段每项各限一次。你可以选择一项流程并选择一名其他角色A:⒈令A对其攻击范围内的另一名角色B造成1点伤害。⒉令A将手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌。然后A选择一项:⒈执行此流程。⒉本回合下次受到的伤害+1。', - dctujue:'途绝', - dctujue_info:'限定技。当你进入濒死状态时,你可以将所有牌交给一名其他角色。然后你回复等量的体力并摸等量的牌。', - chengui:'陈珪', - dcyingtu:'营图', - dcyingtu_info:'每回合限一次。当你的上家/下家于摸牌阶段外得到牌后,你可以获得其一张牌,然后将一张牌交给你的下家/上家。若你给出的牌为装备牌,则其使用之。', - dccongshi:'从势', - dccongshi_info:'锁定技。一名角色使用的装备牌结算结束后,若其装备区内的牌数为全场最多,则你摸一张牌。', - wanglie:'王烈', - dcchongwang:'崇望', - dcchongwang_info:'其他角色使用基本牌或普通锦囊牌时,若你是本局游戏内上一张被使用的牌的使用者,则你可以选择一项:⒈令其于此牌结算结束后收回此牌对应的所有实体牌;⒉取消此牌的所有目标。', - dchuagui:'化归', - dchuagui_info:'出牌阶段开始时,你可以选择至多X名有牌的其他角色(X为场上每个阵营中最大阵营的人数,且你的选择结果不展示)。这些角色同时选择一项:⒈交给你一张牌,⒉展示一张牌。若这些角色均选择选项二,则你获得所有展示牌。', - gongsundu:'公孙度', - dczhenze:'震泽', - dczhenze_info:'弃牌阶段开始时,你可以选择一项:1.令所有手牌数与体力值大小关系与你不同的角色失去1点体力;2.令所有手牌数和体力值关系与你相同的角色回复1点体力。', - dcanliao:'安辽', - dcanliao_info:'出牌阶段限X次(X为群势力角色数)。你可以重铸一名角色的一张牌。', - dc_yuejiu:'乐就', - dccuijin:'催进', - dccuijin_info:'当你或你攻击范围内的角色使用【杀】或【决斗】时,你可以弃置一张牌,令此牌的伤害基数+1。然后当此牌被目标角色抵消或无效或防止伤害后,你摸两张牌并对使用者造成1点伤害。', - panghui:'庞会', - dcyiyong:'异勇', - dcyiyong_info:'当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。', - chenjiao:'陈矫', - dcxieshoux:'协守/清严', - dcxieshou:'协守', - dcxieshou_info:'每回合限一次。当一名角色受到伤害后,若你至其的距离不大于2,你可以令你的手牌上限-1,然后其选择一项:1.回复1点体力;2.复原,摸两张牌。', - dcqingyan:'清严', - dcqingyan_info:'每回合限两次。当你成为其他角色使用黑色牌的目标后,若你的手牌数:小于体力值,你可以将手牌补至体力上限;不小于体力值,你可以弃置一张牌令你的手牌上限+1。', - dcqizi:'弃子', - dcqizi_info:'锁定技。你不能对至其的距离大于2且正在进行濒死流程的角色使用【桃】。', - leibo:'雷薄', - dcsilve:'私掠', - dcsilve_info:'游戏开始时,你选择一名其他角色(对其他角色不可见),称为“私掠”角色。然后你获得以下效果:①当“私掠”角色造成伤害后,若你本回合未因此效果得到过受伤角色的牌,你可以获得受伤角色一张牌;②当“私掠”角色受到其他角色造成的伤害后,若伤害来源存活,你须对伤害来源使用一张【杀】(无距离限制),否则你弃置一张手牌。', - dcshuaijie:'衰劫', - dcshuaijie_info:'限定技。出牌阶段,若你的体力值与装备区里的牌数均大于“私掠”角色,或没有角色有“私掠”,你可以减1点体力上限,然后选择一项:1.获得“私掠”角色至多三张牌;2.从牌堆随机获得三张类型各不同的牌。最后将你的“私掠”角色改为你。', - dc_sp_jiaxu:'新杀SP贾诩', - dc_sp_jiaxu_prefix:'新杀SP', - dcjianshu:'间书', - dcjianshu_info:'出牌阶段限一次。你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,你令前者与后者拼点。赢的角色随机弃置一张牌,没赢的角色失去1点体力。若有角色因此死亡,你令你〖间书〗于此阶段发动的次数上限+1。', - dcyongdi:'拥嫡', - dcyongdi_info:'限定技。出牌阶段,你可以选择一名男性角色,若其:体力上限最少,其加1点体力上限;体力值最少,其回复1点体力;手牌数最少,其摸X张牌(X为其体力上限且至多为5)。', - liupi:'新杀刘辟', - liupi_prefix:'新杀', - dcjuying:'踞营', - dcjuying_info:'出牌阶段结束时,若你于此阶段内使用【杀】的次数未达到上限,你可以选择任意项:1.下回合使用【杀】的次数上限+1;2.本回合手牌上限+2;3.摸三张牌。若你选择的项数超过了你的体力值,你弃置一张牌。', - dc_huanghao:'新杀黄皓', - dc_huanghao_prefix:'新杀', - dcqinqing:'寝情', - dcqinqing_info:'结束阶段,你可以弃置一名攻击范围内包含一号位的其他角色一张牌。然后若其手牌数大于一号位,你摸一张牌。', - dccunwei:'存畏', - dccunwei_info:'锁定技。当你成为其他角色使用的锦囊牌的目标后,若你是唯一目标,你摸一张牌;否则你弃置一张牌。', - dc_zhaotongzhaoguang:'赵统赵广', - dcqingren:'青刃', - dcqingren_info:'结束阶段,你可以摸X张牌(X为你本回合发动〖翊赞〗的次数)。', - dclongyuan:'龙渊', - dclongyuan_info:'锁定技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。', - zhenghun:'郑浑', - dcqiangzhi:'强峙', - dcqiangzhi_info:'出牌阶段限一次。你可以弃置你和一名其他角色的共计三张牌。然后若你与其之中有角色因此失去了三张牌,该角色对另一名角色造成1点伤害。', - dcpitian:'辟田', - dcpitian_info:'①当你的牌被弃置后,或当你受到伤害后,你的手牌上限+1。②结束阶段,若你的手牌数小于手牌上限,你可以摸至手牌上限(至多摸五张),然后重置因〖辟田①〗增加的手牌上限。', - furongfuqian:'傅肜傅佥', - dcxuewei:'血卫', - dcxuewei_info:'结束阶段,你可以选择一名体力值不大于你的角色,然后你获得如下效果直到你的下回合开始时:当其受到伤害时,防止此伤害,然后你失去1点体力,你与其各摸一张牌(若该角色为你,则改为你摸一张牌)。', - dcyuguan:'御关', - dcyuguan_info:'一名角色的回合结束时,若你已损失的体力值为全场最多,你可以减1点体力上限,然后令至多X名角色将手牌摸至体力上限(X为你已损失的体力值)。', - qinlang:'秦朗', - dchaochong:'昊宠', - dchaochong_info:'当你使用牌后,你可以将手牌摸至或弃置至你的手牌上限数(至多摸五张)。然后若你以此法:得到牌,你的手牌上限-1;失去牌,你的手牌上限+1。', - dcjinjin:'矜谨', - dcjinjin_info:'每回合限两次。当你造成或受到伤害后,你可以重置因〖昊宠〗增加或减少的手牌上限,令伤害来源弃置至多X张牌,然后你摸Y张牌(X为你以此法变化的手牌上限且至少为1,Y为X减其以此法弃置的牌数)。', - xianglang:'向朗', - dckanji:'勘集', - dckanji_info:'出牌阶段限两次。你可以展示所有手牌,若花色均不同,你摸两张牌。然后若你的手牌因此包含了四种花色,你跳过下一个弃牌阶段。', - dcqianzheng:'愆正', - dcqianzheng_info:'每回合限两次。当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以重铸两张牌。若你以此法重铸的牌中没有与指定你为目标的牌类别相同的牌,你于此牌对应的实体牌进入弃牌堆后获得此牌对应的所有实体牌。', - qiaorui:'桥蕤', - dcaishou:'隘守', - dcaishou_tag:'隘', - dcaishou_info:'①结束阶段,你可以摸X张牌,称为“隘”(X为你的体力上限)。②准备阶段,你弃置所有“隘”,若你以此法弃置的牌数大于体力值且你的体力上限小于9,你加1点体力上限。③当你于回合外失去最后一张“隘”后,你减1点体力上限。', - dcsaowei:'扫围', - dcsaowei_info:'当一名其他角色使用【杀】结算结束后,若此牌的目标角色不包含你且均在你的攻击范围内,你可以将一张“隘”当做【杀】对所有目标角色使用。以此法转化的【杀】结算完毕后,若此【杀】造成过伤害,你获得此【杀】对应的实体牌。', - yuantanyuanxiyuanshang:'袁谭袁尚袁熙', - dcneifa:'内伐', - dcneifa_info:'出牌阶段开始时,你可以摸三张牌,然后弃置一张牌。若你弃置的牌类型为:基本牌,本阶段你不能使用锦囊牌,且【杀】的使用次数上限+X且可以额外指定一名目标;锦囊牌,本阶段你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5。你以此法选择的额外目标均无距离限制)。', - dc_sunziliufang:'新杀孙资刘放', - dc_sunziliufang_prefix:'新杀', - dcqinshen:'勤慎', - dcqinshen_info:'弃牌阶段结束时,你可以摸X张牌(X为本回合未进入过弃牌堆的花色数)。', - dcweidang:'伪谠', - dcweidang_info:'其他角色的结束阶段,你可以将一张字数为X的牌置于牌堆底,然后获得牌堆里一张字数为X的牌(X为本回合未进入过弃牌堆的花色数)。若你能使用此牌,你使用之。', - mengjie:'孟节', - dcyinlu:'引路', - dcyinlu_info:'①游戏开始时,你令三名角色依次分别获得“乐泉”、“藿溪”、“瘴气”标记(若场上角色数为2则改为令一名其他角色获得其中2枚,你获得剩余标记),然后你获得“芸香”标记并获得1点“芸香”值。②准备阶段/有〖引路〗标记的角色死亡时,你可以移动一名角色的1枚/其的所有〖引路〗标记。', - dcyinlu_lequan:'乐泉', - dcyinlu_lequan_info:'结束阶段,你可以弃置一张♦牌并回复1点体力。', - dcyinlu_huoxi:'藿溪', - dcyinlu_huoxi_info:'结束阶段,你可以弃置一张♥牌并摸两张牌。', - dcyinlu_zhangqi:'瘴气', - dcyinlu_zhangqi_info:'锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。', - dcyinlu_yunxiang:'芸香', - dcyinlu_yunxiang_info:'①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。', - dcyouqi:'幽栖', - dcyouqi_info:'锁定技。当其他角色因〖引路〗标记弃置牌后,你有一定概率获得此牌。', - dcyouqi_faq:'〖幽栖〗概率
    ', - dcyouqi_faq_info:'当满足〖幽栖〗条件时,系统生成一个随机数X∈[0,1)。若X小于(1.25-0.25Y),或幸运星模式已开启,你获得此牌(Y为你至该角色的距离)。', - dc_sunhanhua:'孙寒华', - dchuiling:'汇灵', - dchuiling_info:'锁定技。当你使用牌时,若此牌颜色为弃牌堆中数量较少的颜色,你获得1枚“灵”标记。若弃牌堆中:红色牌数大于黑色牌数,你回复1点体力;黑色牌数大于红色牌数,你可以弃置一名其他角色的一张牌。', - dcchongxu:'冲虚', - dcchongxu_info:'限定技。出牌阶段,若“灵”数不小于4,你可以失去〖汇灵〗,增加等同于“灵”数的体力上限(至多增加场上人数的体力上限),然后获得〖踏寂〗和〖清荒〗。', - dctaji:'踏寂', - dctaji_info:'当你失去手牌后,根据你失去牌的原因执行以下效果:1.使用:你弃置其他角色一张牌;2.打出:你摸一张牌;3.弃置:你回复1点体力;4.其他:你下一次对其他角色造成伤害时,此伤害+1。', - dcqinghuang:'清荒', - dcqinghuang_info:'出牌阶段开始时,你可以减1点体力上限,然后你于本回合发动〖踏寂〗时额外随机执行一种效果。', - dc_huojun:'霍峻', - dcgue:'孤扼', - dcgue_info:'每回合限一次。当你需要于回合外使用或打出【杀】或【闪】时,你可以发动此技能:你展示所有手牌,若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。', - dcsigong:'伺攻', - dcsigong_info:'其他角色的回合结束时,若其于本回合内使用牌被响应过,你可以将手牌摸至或弃置至1,视为对其使用一张需使用X张【闪】抵消的【杀】,且此【杀】的伤害基数+1(X为你以此法弃置的牌数且至少为1)。当你以此法造成伤害后,该技能于本轮失效。', - peiyuanshao:'裴元绍', - dcmoyu:'没欲', - dcmoyu_info:'出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】,且此【杀】伤害基数为X(X为你于本回合发动此技能的次数)。若此【杀】对你造成了伤害,你令此技能于本回合失效。', - zhangchu:'张楚', - dcjizhong:'集众', - dcjizhong_info:'出牌阶段限一次。你可以令一名其他角色摸两张牌,然后其选择一项:1.若其没有“信众”标记,其获得“信众”标记;2.交给你三张手牌。', - dcrihui:'日彗', - dcrihui_info:'每回合限一次。当你使用普通锦囊牌或黑色基本牌结算结束后,若此牌的目标数为1且目标不为你,且其:没有“信众”,则所有有“信众”的角色依次视为对其使用一张与此牌牌名和属性相同的牌;有“信众”,则你可以获得其区域里的一张牌。', - dcguangshi:'光噬', - dcguangshi_info:'锁定技。准备阶段,若所有其他角色均有“信众”,你摸两张牌并失去1点体力。', - dongwan:'董绾', - dcshengdu:'生妒', - dcshengdu_info:'回合开始时,你可以选择一名其他角色,令其获得1枚“生妒”标记。有“生妒”标记的角色于摸牌阶段得到牌后,你摸X张牌,然后其移去所有“生妒”标记(X为摸牌数乘以其拥有的“生妒”标记数)。', - dcjieling:'介绫', - dcjieling_info:'出牌阶段每种花色限一次,你可以将两张花色不同的手牌当无距离限制且无任何次数限制的【杀】使用。然后若此【杀】:造成了伤害,所有目标角色失去1点体力;未造成伤害,所有目标角色依次获得1枚“生妒”标记。', - yuanyin:'袁胤', - dcmoshou:'墨守', - dcmoshou_info:'当你成为其他角色使用的黑色牌的目标后,你可以摸X张牌(X为你本局游戏此前发动过此技能的次数÷3的余数+1)。', - dcyunjiu:'运柩', - dcyunjiu_info:'一名角色死亡后,你可以弃置等同于其因死亡事件的规则而弃置的牌数,将其此次弃置的牌交给一名其他角色。然后你加1点体力上限并回复1点体力。', - gaoxiang:'高翔', - dcchiying:'驰应', - dcchiying_info:'出牌阶段限一次。你可以选择一名体力不大于你的角色,令其攻击范围内的其他角色依次弃置一张牌。然后若你选择的角色不为你,其获得以此法弃置的牌中所有的基本牌。', - zhangkai:'张闿', - dcxiangshu:'相鼠', - dcxiangshu_info:'其他角色的出牌阶段开始时,若其手牌数不小于其体力值,你可以选择一个不大于5的非负整数,然后你弃置一张牌或声明此数字。若如此做,此阶段结束时,若其手牌数与你选择的数字:差值不大于1,你获得其一张牌;相等,你对其造成1点伤害。', - mengyou:'孟优', - dcmanzhi:'蛮智', - dcmanzhi_info:'①准备阶段,你可以选择一名其他角色并选择一项:1.令其交给你两张牌,然后其视为使用一张无距离限制的【杀】;2.获得其区域内至多两张牌,然后交给其等量的牌并摸一张牌。②结束阶段,若你的体力值与本回合准备阶段时的体力值相等,你可以执行你未于本回合执行过的〖蛮智①〗的分支。', - dc_sunchen:'孙綝', - dczigu:'自固', - dczigu_info:'出牌阶段限一次。你可以弃置一张牌,然后获得场上的一张装备牌。若你没有因此获得其他角色的牌,你摸一张牌。', - dczuowei:'作威', - dczuowei_info:'当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌且不能于本回合再触发该选项(X为你装备区里牌的数量且至少为1)。', - liuchongluojun:'刘宠骆俊', - dcminze:'悯泽', - dcminze_info:'①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)。', - dcjini:'击逆', - dcjini_info:'当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。', - yuechen:'乐綝', - dcporui:'破锐', - dcporui_info:'每轮限一次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为其本回合失去的牌数且至多为5)。', - dcgonghu:'共护', - dcgonghu_info:'锁定技。①当你于回合外失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你造成或受到伤害后,若你本回合内造成或受到的总伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。', - yue_caiwenji:'乐蔡琰', - yue_caiwenji_prefix:'乐', - dcshuangjia:'霜笳', - dcshuangjia_tag:'胡笳', - dcshuangjia_info:'锁定技。①游戏开始,你将你的手牌标记为“胡笳”。②你的“胡笳”牌不计入手牌上限。③其他角色至你的距离+X(X为你的“胡笳”数且至多为5)。', - dcbeifen:'悲愤', - dcbeifen_info:'锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。', - dc_wuban:'吴班', - dcyouzhan:'诱战', - dcyouzhan_info:'锁定技。当其他角色于你的回合内失去一张牌后,你摸一张牌(不计入本回合的手牌上限),且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数且至多为3)。', - yue_zhoufei:'乐周妃', - yue_zhoufei_prefix:'乐', - dclingkong:'灵箜', - dclingkong_tag:'箜篌', - dclingkong_info:'锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于一回合内首次于摸牌阶段外得到牌后,你将这些牌标记为“箜篌”。', - dcxianshu:'贤淑', - dcxianshu_info:'出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色,然后你摸X张牌(X为你与其的体力值之差且至多为5)。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。', - dc_zhangmancheng:'张曼成', - dclvecheng:'掠城', - dclvecheng_info:'出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。', - dczhongji:'螽集', - dczhongji_info:'当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。', - dc_jiachong:'贾充', - dcbeini:'悖逆', - dcbeini_info:'出牌阶段限一次。你可以将手牌调整至体力上限,然后令一名角色视为对另一名角色使用一张【杀】,且这些角色的非锁定技失效直到回合结束。', - dcshizong:'恃纵', - dcshizong_info:'当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。', - pangshanmin:'庞山民', - dccaisi:'才思', - dccaisi_info:'当你于回合内/回合外使用基本牌结算结束后,你可以从牌堆/弃牌堆随机获得一张非基本牌,然后若你本回合发动此技能的次数:小于你的体力上限,本回合你发动此技能获得的牌数+1;大于等于你的体力上限,本回合此技能失效。', - dczhuoli:'擢吏', - dczhuoli_info:'锁定技。一名角色的回合结束时,若你本回合使用或获得的牌数大于体力值,你加1点体力上限(不能超过游戏人数),回复1点体力。', - yue_caiyong:'乐蔡邕', - yue_caiyong_prefix:'乐', - dcjiaowei:'焦尾', - dcjiaowei_tag:'弦', - dcjiaowei_info:'锁定技。①游戏开始时,你将所有手牌标记为“弦”。②你的“弦”牌不计入手牌上限。③当你受到伤害时,若来源的手牌数不大于你的“弦”牌数,防止此伤害。', - dcfeibai:'飞白', - dcfeibai_info:'每回合限一次。当你使用牌结算结束后,若你本回合使用过至少两张牌,你可以随机获得一张字数为X的牌。若你的“弦”数不大于X,你重置〖飞白〗(X为此牌与你使用的上一张牌的字数之和)。', - kuaiqi:'蒯祺', - dcliangxiu:'良秀', - dcliangxiu_info:'出牌阶段,你可以弃置两张不同类型的牌,然后从两张与你弃置的牌类型均不同的牌中选择一张获得之(每阶段每种类型限一次)。', - dcxunjie:'殉节', - dcxunjie_info:'每轮每项限一次。一名角色的回合结束时,若你本回合于摸牌阶段外得到过牌,你可以选择一项:1.令一名角色将手牌数摸或弃置至与其体力值相同;2.令一名角色将体力回复或失去至与其手牌数相同。', - dc_dongzhao:'董昭', - dcyijia:'移驾', - dcyijia_info:'一名角色受到伤害后,若你至其的距离不大于1,你可以将场上一张装备牌移动至其对应装备栏(替换原装备)。若其因此脱离了一名角色的攻击范围,你摸一张牌。', - dcdingji:'定基', - dcdingji_info:'准备阶段,你可以令一名角色将手牌摸或弃置至五张,然后其展示手牌。若牌名均不同,则其可以视为使用其中一张基本或普通锦囊牌。', - yue_xiaoqiao:'乐小乔', - yue_xiaoqiao_prefix:'乐', - dcqiqin:'绮琴', - dcqiqin_tag:'琴', - dcqiqin_info:'锁定技。①游戏开始时,你将所有手牌标记为“琴”。②你的“琴”牌不计入手牌上限。③准备阶段,你获得位于弃牌堆的所有“琴”。', - dcweiwan:'媦婉', - dcweiwan_info:'出牌阶段限一次,你可以弃置一张“琴”并随机获得一名其他角色区域内花色与此牌不相同的牌各一张,若你获得了:一张牌,其失去1点体力;两张牌,本回合你对其使用牌无距离和次数限制;三张牌,本回合你不能对其使用牌。', - dc_lingcao:'新杀凌操', - dc_lingcao_prefix:'新杀', - dcdufeng:'独锋', - dcdufeng_info:'锁定技。出牌阶段开始时,你失去1点体力或废除一个装备栏,摸X张牌,然后你的攻击范围与使用【杀】的次数上限均为X直到回合结束(X为你已废除的装备栏数与损失的体力值之和,至多为你的体力上限)。', - dc_sp_menghuo:'群孟获', - dc_sp_menghuo_prefix:'群', - dcmanwang:'蛮王', - dcmanwang_info:'出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。', - dcpanqin:'叛侵', - dcpanqin_info:'出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项,然后加1点体力上限并回复1点体力。', - dc_kongrong:'孔融', - dckrmingshi:'名士', - dckrmingshi_info:'锁定技,当你受到其他角色造成的伤害时,若其手牌数大于你,则其需弃置一张手牌,否则此伤害-1。', - yue_daqiao:'乐大乔', - yue_daqiao_prefix:'乐', - dczixi:'姊希', - dczixi_info:'①出牌阶段开始和结束时,你可以将一张“琴”当作一张无效果的【乐不思蜀】、【兵粮寸断】或【闪电】置于一名角色的判定区。②当你使用基本牌或普通锦囊牌指定唯一目标后,你可根据其判定区内的牌数执行对应项:1.令此牌对其额外结算一次;2.摸两张牌;3.弃置其判定区所有牌,对其造成3点伤害。', - jiangfei:'蒋琬费祎', - dcshengxi:'生息', - dcshengxi_info:'弃牌阶段结束时,若你本回合未造成过伤害,你可以摸两张牌。', - dcshoucheng:'守成', - dcshoucheng_info:'一名角色于其回合外失去最后的手牌后,你可令其摸两张牌。', - dc_liuli:'刘理', - dcfuli:'抚黎', - dcfuli_info:'出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。若你因此弃置了伤害类卡牌,则你可以选择一名角色,令其攻击范围-1直到你的下个回合开始。', - dcdehua:'德化', - dcdehua_info:'锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。', - gongsunxiu:'公孙修', - dcgangu:'干蛊', - dcgangu_info:'锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。', - dckuizhen:'溃阵', - dckuizhen_info:'出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。', - dc_jiangji:'蒋济', - dcshiju:'势举', - dcshiju_info:'其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。', - dcyingshi:'应时', - dcyingshi_info:'每回合每项各限一次。当你使用普通锦囊牌指定第一个目标后,若有目标不为本回合第一次成为牌的目标,则你可以令其选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。', - dc_wangling:'王淩', - dcjichou:'集筹', - dcjichou_info:'出牌阶段结束时,若你于此阶段使用过牌且这些牌的牌名均不同,你可以观看位于弃牌堆中的这些牌,选择任意张牌并选择等量角色,将这些牌交给这些角色各一张,然后你摸X张牌(X为你本局游戏首次发动〖集筹〗给出的牌数)。', - dcmouli:'谋立', - dcmouli_info:'觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数不小于5,你加1点体力上限并回复1点体力,然后获得〖自缚〗。', - dczifu:'自缚', - dczifu_info:'锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。', - dc_simashi:'司马师', - dcsanshi:'散士', - dcsanshi_tag:'死士', - dcsanshi_info:'锁定技。①第一轮游戏开始时,你令系统将牌堆中每个点数的随机一张牌永久标记为“死士”(“死士”对你可见)。②一名角色的回合结束时,若本回合有“死士”不因你使用或打出而进入弃牌堆,你于弃牌堆中获得这些牌。③你使用“死士”不能被响应。', - dczhenrao:'震扰', - dczhenrao_info:'每回合每名角色限一次。当你使用牌指定第一个目标后,若目标角色包含其他角色,或当其他角色使用牌指定你为目标后,你可以选择手牌数大于你的其中一个目标或此牌的使用者,然后对其造成1点伤害。', - dcchenlve:'沉略', - dcchenlve_info:'限定技。出牌阶段,你可以将牌堆、弃牌堆、场上及其他角色的手牌区里的所有“死士”置入处理区,然后你获得这些牌。若如此做,你获得如下效果:1.此回合结束时,你将这些牌移出游戏;2.当你死亡时,你将所有以此法移出游戏的“死士”置入弃牌堆。', - dc_caoshuang:'新杀曹爽', - dc_caoshuang_prefix:'新杀', - dcjianzhuan:'渐专', - dcjianzhuan_info:'锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:⒈令一名角色弃置X张牌;⒉摸X张牌;⒊重铸X张牌;⒋弃置X张牌(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。', - dcjianzhuan_faq:'渐专概率', - dcjianzhuan_faq_info:'
    当系统随机选择要删除的选项时,“弃置X张牌”的选项概率固定为90%;剩余选项平分剩余的的10%概率。
    如第一次删除时,删除弃牌选项概率为90%,其余三个选项被删除的概率均为3.33%,若删除了非弃牌选项,第二次删除时,删除弃牌选项的概率依旧是90%,其余两个选项被删除的概率均为5%。', - dcfanshi:'返势', - dcfanshi_info:'觉醒技,结束阶段,若〖渐专①〗剩余选项数小于2,则你执行三次X视为1的剩余选项,然后增加2点体力上限并回复2点体力,失去技能〖渐专〗并获得技能〖覆斗〗。', - dcfudou:'覆斗', - dcfudou_info:'当你使用黑色牌/红色牌指定唯一目标后,若该角色不为你,且其于本局游戏对你/未对你造成过伤害,则你可以与其各失去1点体力/各摸一张牌。', + tongli_info: + "当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以令此牌额外结算X次(X为你手牌中的花色数)。", + shezang: "奢葬", + shezang_info: + "每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以从牌堆中获得每种花色的牌各一张。", + tengyin: "滕胤", + chenjian: "陈见", + chenjian_info: + "准备阶段,你可亮出牌堆顶的3+X张牌(X为你“陈见”标记的数量且至多为2),然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌。", + xixiu: "皙秀", + xixiu_info: + "锁定技。①当你成为其他角色使用牌的目标时,若你的装备区内有和此牌花色相同的牌,则你摸一张牌。②若你装备区内的牌数为1,则其他角色不能弃置你装备区内的牌。", + zhangyao: "张媱", + yuanyu: "怨语", + yuanyu_info: + "出牌阶段限一次。你可以摸一张牌,然后选择一张手牌和一名其他角色。该角色获得如下效果直到你发动〖夕颜〗:{你与该角色的弃牌阶段开始时,或当该角色造成1点伤害后,其须将一张手牌作为“怨”置于你的武将牌上}。然后你将你选择的手牌作为“怨”置于你的武将牌上。", + xiyan: "夕颜", + xiyan_info: + "当有牌作为“怨”移动到你的武将牌上后,若“怨”中的花色数达到4种,则你可以获得所有“怨”。然后若当前回合角色:是你,你本回合手牌上限+4且使用牌无次数限制且重置你的〖怨语〗于此阶段的发动次数;不是你,你可令当前回合角色本回合手牌上限-4且不能使用基本牌。", + xiahoulingnv: "夏侯令女", + fuping: "浮萍", + fuping_info: + "①其他角色对你使用的牌结算结束后,若你未因此技能记录过此牌的名称且你有未废除的装备栏,则你可以废除一个装备栏,记录此牌的名称。②每回合每种牌名限一次。你可以将一张非基本牌当做〖浮萍①〗记录过的基本牌或锦囊牌使用或打出。③若你的所有装备栏均已被废除,则你使用牌无距离限制。", + weilie: "炜烈", + weilie_info: + "每局游戏限X次。出牌阶段,你可以弃置一张牌并选择一名已受伤的角色,令该角色回复1点体力。然后若其体力值小于体力上限,则其摸一张牌(X为你〖浮萍①〗中的记录数+1)。", + dc_sunru: "孙茹", + xiecui: "撷翠", + xiecui_info: + "当有角色于回合内第一次因执行牌的效果而造成伤害时,你可以令此伤害+1。若其势力为吴,则该角色获得此伤害牌对应的实体牌,且其本回合的手牌上限+1。", + youxu: "忧恤", + youxu_info: + "一名角色A的回合结束时,若其手牌数大于体力值,则你可以展示A的一张牌,然后将此牌交给另一名角色B。若B的体力值为全场最少,则B回复1点体力。", + huaxin: "华歆", + wanggui: "望归", + wanggui_info: + "每回合限触发一次,当你造成或受到伤害后,若你:仅明置了此武将牌,则你可对与你势力不同的一名角色造成1点伤害;武将牌均明置,则你可令与你势力相同的角色各摸一张牌。", + spwanggui: "望归", + spwanggui_info: + "①当你受到伤害后,你可以摸一张牌,或和一名势力相同的其他角色各摸一张牌;②每回合限一次,当你造成伤害后,你可以对一名与你势力不同的角色造成1点伤害。", + xibing: "息兵", + xibing_info: + "当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸五张)且本回合不能再使用手牌。", + xibing_info_guozhan: + "当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。", + luyusheng: "陆郁生", + zhente: "贞特", + zhente2: "贞特", + zhente_info: + "每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.此牌对你无效。", + zhente_info_guozhan: + "每回合限一次,当你成为其他角色使用黑色基本牌或黑色普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用黑色牌;2.此牌对你无效。", + zhiwei: "至微", + zhiwei2: "至微", + zhiwei_info: + "游戏开始时/你的回合开始时,若场上没有因此法被选择过的角色存活,则你选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。", + zhiwei_info_guozhan: + "你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。", + zhanghu: "张虎", + cuijian: "摧坚", + cuijian_info: + "出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你,然后你交给其等量的牌。", + zhtongyuan: "同援", + zhtongyuan_info: + "锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。", + lvlingqi: "吕玲绮", + guowu: "帼舞", + guowu_info: + "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】或普通锦囊牌可以多指定至多两个目标。", + guowu_info_guozhan: + "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】可以多指定至多两个目标。", + zhuangrong: "妆戎", + zhuangrong_info: + "觉醒技,一名角色的回合结束时,若你的体力值或手牌数为1,你减1点体力上限并回复体力至上限,将手牌摸至体力上限,然后获得〖神威〗和〖无双〗。", + llqshenwei: "神威", + llqshenwei_info: "锁定技,摸牌阶段开始时,你令额定摸牌数+2;你的手牌上限+2。", + re_kanze: "阚泽", + rekuanshi: "宽释", + rekuanshi_info: + "结束阶段,你可以选择一名角色。你获得如下效果直到你下回合开始:每回合限一次,当其于一回合内受到第2点伤害后,其回复1点体力。", + liuyong: "刘永", + zhuning: "诛佞", + zhuning_info: + "出牌阶段限一次。你可将任意张牌交给一名其他角色(称为“隙”),然后可视为使用一张具有伤害标签的基本牌/锦囊牌(不计入次数限制)。若你以此法使用的牌未造成伤害,则你将〖诛佞〗于本回合内改为“限两次”。", + fengxiang: "封乡", + fengxiang_info: + "锁定技。①当你受到伤害后,若场上:存在“隙”唯一最多的角色,则其回复1点体力;不存在,则你摸一张牌。②当有角色的手牌移动后,若场上“隙”最多的角色因此发生变化,则你摸一张牌。", + fengxiang_tag: "隙", + re_xunchen: "荀谌", + refenglve: "锋略", + refenglve_info: + "出牌阶段限一次,你可以和一名其他角色进行拼点。若你赢,其将区域内的两张牌交给你;若平局,则你令此技能于本阶段内的发动次数上限+1;若你输,其获得你的拼点牌。", + anyong: "暗涌", + anyong_info: + "当一名角色于其回合内第一次对另一名其他角色造成伤害后,若伤害值为1,则你可弃置一张牌,并对受伤角色造成1点伤害。", + wanniangongzhu: "万年公主", + zhenge: "枕戈", + zhenge_info: + "准备阶段,你可以选择一名角色。该角色本局游戏的攻击范围+1(至多+5)。然后若除其外的所有角色都在该角色的攻击范围内,则你可以令其视为对另一名角色使用一张【杀】。", + xinghan: "兴汉", + xinghan_info: + "锁定技,每回合的第一张【杀】造成伤害后,若此【杀】的使用者成为过〖枕戈〗的目标,则你摸一张牌。若你的手牌数不是全场唯一最多的,则改为摸X张牌(X为该角色的攻击范围且最多为5)。", + re_chendeng: "陈登", + refuyuan: "扶援", + refuyuan_info: + "一名角色成为【杀】的目标后,若其本回合内没有成为过其他红色牌的目标,则你可以令其摸一张牌。", + reyingshui: "营说", + reyingshui_info: + "出牌阶段限一次,你可将一张牌交给攻击范围内的一名其他角色,然后其选择一项:①交给你至少两张装备牌。②受到1点伤害。", + rewangzu: "望族", + rewangzu_info: + "每回合限一次。当你受到其他角色造成的伤害时,你可随机弃置一张手牌,令此伤害-1。若你所在阵营的存活角色数是全场最多的,则你可以自行选择弃置的牌。", + re_miheng: "祢衡", + rekuangcai: "狂才", + rekuangcai_info: + "锁定技。①你于回合内使用牌无距离和次数限制。②弃牌阶段开始时,若你本回合内:未使用过牌,则你本局游戏的手牌上限+1;使用过牌但未造成过伤害,则你本局游戏的手牌上限-1。③结束阶段开始时,你摸X张牌(X为你本回合内造成的伤害且至多为5)。", + reshejian: "舌剑", + reshejian_info: + "每回合限两次。当你成为其他角色使用牌的唯一目标后,你可以弃置至少两张手牌。若如此做,你选择一项:⒈弃置其等量的牌。⒉对其造成1点伤害。", + fengxi: "冯熙", + yusui: "玉碎", + yusui_info: + "当你成为其他角色使用黑色牌的目标后,你可以失去1点体力,然后选择一项:⒈令其将手牌数弃置至与你相同;⒉令其失去Y点体力(Y为其的体力值减去你的体力值,不为正时不可选择)。", + boyan: "驳言", + boyan_info: + "出牌阶段限一次,你可选择一名其他角色。其将手牌摸至体力上限(至多摸至五张),然后其本回合不能使用或打出手牌。", + re_dengzhi: "邓芝", + jianliang: "简亮", + jianliang_info: "摸牌阶段开始时,若你的手牌数不为全场最多,则你可以令至多两名角色各摸一张牌。", + weimeng: "危盟", + weimeng_info: + "出牌阶段限一次,你可以获得一名其他角色的至多X张手牌,然后交给其等量的牌(X为你的体力值)。若你给出的牌点数之和:大于得到的牌,则你摸一张牌;小于得到的牌,弃置该角色区域内的一张牌。", + mamidi: "马日磾", + bingjie: "秉节", + bingjie_info: + "出牌阶段开始时,你可减1点体力上限,然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。", + zhengding: "正订", + zhengding_info: + "锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌颜色相同,则你加1点体力上限并回复1点体力。", + dc_jiben: "吉本", + xunli: "询疠", + xunli_info: + "锁定技。①当有黑色牌因弃置而进入弃牌堆后,若X大于0,则你将其中的X张牌置于武将牌上作为“疠”(X=min(这些牌的数量,9-Y),Y=你的“疠”数)。②出牌阶段开始时,你可以用任意张黑色手牌交换等量的“疠”。", + zhishi: "指誓", + zhishi_info: + "结束阶段,你可选择一名角色。当该角色于你的下回合开始前{成为【杀】的目标后或进入濒死状态时},你可移去任意张“疠”,然后其摸等量的牌。", + lieyi: "烈医", + lieyi_info: + "出牌阶段限一次。你可以展示所有“疠”并选择一名其他角色,对其使用其中的一张可对其使用的牌(无距离和次数限制)并重复此流程,并将其余的牌置于弃牌堆。然后若其存活且未于此流程中因受到伤害而进入过濒死状态,则你失去1点体力。", + guanning: "管宁", + dunshi: "遁世", + dunshi_info: + "每回合限一次。你可以视为使用或打出一张【杀】/【闪】/【桃】/【酒】,然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。", + dc_gaolan: "高览", + xizhen: "袭阵", + xizhen_info: + "出牌阶段开始时,你可选择一名其他角色,视为对其使用【杀】或【决斗】。然后当有角色于本阶段内使用或打出牌响应你时,该角色回复1点体力,你摸一张牌(若其满体力,改为两张)。", + dc_huangchengyan: "黄承彦", + dcjiezhen: "解阵", + dcjiezhen_info: + "出牌阶段限一次,你可选择一名其他角色。该角色获得〖八阵〗,且其所有不为{锁定技、限定技、觉醒技、主公技、带有Charlotte标签}的技能失效。你的下回合开始时,或其因〖八卦阵〗发起的判定结算结束后,你令其恢复其以此法失效的所有技能并失去以此法获得的〖八阵〗,然后获得其区域内的一张牌。", + dczecai: "择才", + dczecai_info: + "限定技。一轮游戏开始时,若游戏轮数大于1,则你可令一名其他角色获得〖集智〗直到下一轮游戏开始;若其是上一轮内使用过锦囊牌数量唯一最多的角色,则其获得一个额外的回合。", + dcyinshi: "隐世", + dcyinshi_info: + "锁定技。①每回合限一次,当你受到伤害时,若此伤害的渠道不为有颜色的牌,则你防止此伤害。②当有因〖八卦阵〗发起的判定的判定牌生效时,你获得此判定牌。", + tenggongzhu: "滕公主", + xingchong: "幸宠", + xingchong_info: + "一轮游戏开始时,你可声明两个自然数X和Y,且(X+Y)≤min(5, 你的体力上限)。你摸X张牌并展示Y张手牌。若如此做,当你于本轮内失去一张以此法展示的牌后,你摸两张牌。", + liunian: "流年", + liunian_info: + "锁定技。一名角色的回合结束时,若本回合内进行了本次游戏的第一次洗牌,则你加1点体力上限;若本回合内进行了本次游戏的第二次洗牌,则你于本回合结束时回复1点体力,且本局游戏内的手牌上限+10。", + caimaozhangyun: "蔡瑁张允", + lianzhou: "连舟", + lianzhou_info: "锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。", + jinglan: "惊澜", + jinglan_info: + "锁定技。当你造成伤害后,若你的手牌数:大于体力值,你弃置四张手牌;等于体力值,你弃置一张手牌并回复1点体力;小于体力值,你受到1点无来源火焰伤害并摸五张牌。", + dc_yanghu: "羊祜", + dcdeshao: "德劭", + dcdeshao_info: + "每回合限两次。当你成为其他角色使用的黑色牌的目标后,你可以摸一张牌,然后若其手牌数不小于你,则你弃置其一张牌。", + dcmingfa: "明伐", + dcmingfa_info: + "①出牌阶段限一次。当你使用【杀】或普通锦囊牌结算结束后,若你的武将牌上没有“明伐”牌,则你可以将此牌作为“明伐”牌置于武将牌上并选择一名其他角色,记录该角色和此牌的名称。②一名角色的回合结束时,若其是你〖明伐①〗记录的角色,则你视为对其依次使用X张〖明伐①〗记录的牌,然后移去“明伐”牌(X为其手牌数且至少为1,至多为5)。③一名角色死亡时,若其是你〖明伐①〗记录的角色,则你移去“明伐”牌。", + dc_jiling: "纪灵", + dcshuangren: "双刃", + dcshuangren_info: + "出牌阶段开始时,你可以和一名其他角色A进行拼点。若你赢,你选择一名角色B,或选择包含A在内的两名角色A和B(B的势力需与A相同),然后视为对被选择的角色使用一张【杀】(不计入次数限制);若你没赢,则你本阶段内不能使用【杀】。", + zhangxun: "张勋", + suizheng: "随征", + suizheng_info: + "结束阶段,你可以选择一名角色A,获得如下效果直到其下回合结束:①A于下回合出牌阶段内使用【杀】的次数上限+1且无距离限制;②A下回合的出牌阶段结束时,你可以选择一名此阶段内受到过A造成的伤害的角色B,视为对B使用一张【杀】。", + dc_liuba: "刘巴", + dczhubi: "铸币", + dczhubi_info: + "当有♦牌因弃置而进入弃牌堆后,你可以令系统从牌堆/弃牌堆中检索一张【无中生有】,并将此牌置于牌堆顶。", + dcliuzhuan: "流转", + dcliuzhuan_tag: "转", + dcliuzhuan_info: + "锁定技。①其他角色于其回合内不于摸牌阶段而得到的牌称为“转”。②你不能成为实体牌中包含“转”的牌的目标。③当有“转”直接进入弃牌堆或经由处理区进入弃牌堆后,你获得之。", + huzhao: "胡昭", + midu: "弥笃", + midu_info: + "出牌阶段限一次。你可以选择一项:⒈废除任意个装备栏或判定区,并令一名角色摸等量的牌。⒉恢复一个已经被废除的装备栏或判定区,然后你获得〖活墨〗直到下回合开始。", + xianwang: "贤望", + xianwang_info: + "锁定技。若你有被废除的装备栏,则其他角色至你的距离+1,你至其他角色的距离-1;若废除的装备栏数大于2,则改为距离+2/-2。", + guanhai: "管亥", + suoliang: "索粮", + suoliang_info: + "每回合限一次。当你对其他角色造成伤害后,你可以选择并展示其的至多X张牌(X为其体力上限且至多为5)。若这些牌中有♥或♣牌,则你获得这些牌;否则你弃置这些牌。", + qinbao: "侵暴", + qinbao_info: "锁定技。当你使用【杀】或普通锦囊牌时,你令所有手牌数不小于你的角色不能响应此牌。", + dc_lvkuanglvxiang: "吕旷吕翔", + dcshuhe: "数合", + dcshuhe_info: + "出牌阶段限一次,你可以展示一张手牌并获得一枚“爵”。若场上有与此牌点数相同的牌,则你获得这些牌;否则你将此牌交给一名其他角色。", + dcliehou: "列侯", + dcliehou_info: + "锁定技。摸牌阶段开始时,你令额定摸牌数+X;然后此摸牌阶段结束时,你选择一项:⒈弃置X张牌。⒉失去1点体力(X为你的“爵”数+1且至多为5)。", + yinfuren: "尹夫人", + dcyingyu: "媵予", + dcyingyu_info: + "准备阶段开始时,你可以展示两名角色的各一张手牌。若这两张牌的花色不同,则你可以令一名角色获得另一名角色的展示牌。", + dcyongbi: "拥嬖", + dcyongbi_info: + "限定技。出牌阶段,你可以将所有手牌交给一名其他男性角色。你将〖媵予〗的发动时机改为“准备阶段和结束阶段开始时”。然后若这些牌中包含的花色数:大于1,则你与其本局游戏的手牌上限+2;大于2,则当你或其于本局游戏内受到大于1的伤害时,此伤害-1。", + dc_huangquan: "黄权", + dcquanjian: "劝谏", + dcquanjian_info: + "出牌阶段每项各限一次。你可以选择一项流程并选择一名其他角色A:⒈令A对其攻击范围内的另一名角色B造成1点伤害。⒉令A将手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌。然后A选择一项:⒈执行此流程。⒉本回合下次受到的伤害+1。", + dctujue: "途绝", + dctujue_info: + "限定技。当你进入濒死状态时,你可以将所有牌交给一名其他角色。然后你回复等量的体力并摸等量的牌。", + chengui: "陈珪", + dcyingtu: "营图", + dcyingtu_info: + "每回合限一次。当你的上家/下家于摸牌阶段外得到牌后,你可以获得其一张牌,然后将一张牌交给你的下家/上家。若你给出的牌为装备牌,则其使用之。", + dccongshi: "从势", + dccongshi_info: + "锁定技。一名角色使用的装备牌结算结束后,若其装备区内的牌数为全场最多,则你摸一张牌。", + wanglie: "王烈", + dcchongwang: "崇望", + dcchongwang_info: + "其他角色使用基本牌或普通锦囊牌时,若你是本局游戏内上一张被使用的牌的使用者,则你可以选择一项:⒈令其于此牌结算结束后收回此牌对应的所有实体牌;⒉取消此牌的所有目标。", + dchuagui: "化归", + dchuagui_info: + "出牌阶段开始时,你可以选择至多X名有牌的其他角色(X为场上每个阵营中最大阵营的人数,且你的选择结果不展示)。这些角色同时选择一项:⒈交给你一张牌,⒉展示一张牌。若这些角色均选择选项二,则你获得所有展示牌。", + gongsundu: "公孙度", + dczhenze: "震泽", + dczhenze_info: + "弃牌阶段开始时,你可以选择一项:1.令所有手牌数与体力值大小关系与你不同的角色失去1点体力;2.令所有手牌数和体力值关系与你相同的角色回复1点体力。", + dcanliao: "安辽", + dcanliao_info: "出牌阶段限X次(X为群势力角色数)。你可以重铸一名角色的一张牌。", + dc_yuejiu: "乐就", + dccuijin: "催进", + dccuijin_info: + "当你或你攻击范围内的角色使用【杀】或【决斗】时,你可以弃置一张牌,令此牌的伤害基数+1。然后当此牌被目标角色抵消或无效或防止伤害后,你摸两张牌并对使用者造成1点伤害。", + panghui: "庞会", + dcyiyong: "异勇", + dcyiyong_info: + "当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。", + chenjiao: "陈矫", + dcxieshoux: "协守/清严", + dcxieshou: "协守", + dcxieshou_info: + "每回合限一次。当一名角色受到伤害后,若你至其的距离不大于2,你可以令你的手牌上限-1,然后其选择一项:1.回复1点体力;2.复原,摸两张牌。", + dcqingyan: "清严", + dcqingyan_info: + "每回合限两次。当你成为其他角色使用黑色牌的目标后,若你的手牌数:小于体力值,你可以将手牌补至体力上限;不小于体力值,你可以弃置一张牌令你的手牌上限+1。", + dcqizi: "弃子", + dcqizi_info: "锁定技。你不能对至其的距离大于2且正在进行濒死流程的角色使用【桃】。", + leibo: "雷薄", + dcsilve: "私掠", + dcsilve_info: + "游戏开始时,你选择一名其他角色(对其他角色不可见),称为“私掠”角色。然后你获得以下效果:①当“私掠”角色造成伤害后,若你本回合未因此效果得到过受伤角色的牌,你可以获得受伤角色一张牌;②当“私掠”角色受到其他角色造成的伤害后,若伤害来源存活,你须对伤害来源使用一张【杀】(无距离限制),否则你弃置一张手牌。", + dcshuaijie: "衰劫", + dcshuaijie_info: + "限定技。出牌阶段,若你的体力值与装备区里的牌数均大于“私掠”角色,或没有角色有“私掠”,你可以减1点体力上限,然后选择一项:1.获得“私掠”角色至多三张牌;2.从牌堆随机获得三张类型各不同的牌。最后将你的“私掠”角色改为你。", + dc_sp_jiaxu: "新杀SP贾诩", + dc_sp_jiaxu_prefix: "新杀SP", + dcjianshu: "间书", + dcjianshu_info: + "出牌阶段限一次。你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,你令前者与后者拼点。赢的角色随机弃置一张牌,没赢的角色失去1点体力。若有角色因此死亡,你令你〖间书〗于此阶段发动的次数上限+1。", + dcyongdi: "拥嫡", + dcyongdi_info: + "限定技。出牌阶段,你可以选择一名男性角色,若其:体力上限最少,其加1点体力上限;体力值最少,其回复1点体力;手牌数最少,其摸X张牌(X为其体力上限且至多为5)。", + liupi: "新杀刘辟", + liupi_prefix: "新杀", + dcjuying: "踞营", + dcjuying_info: + "出牌阶段结束时,若你于此阶段内使用【杀】的次数未达到上限,你可以选择任意项:1.下回合使用【杀】的次数上限+1;2.本回合手牌上限+2;3.摸三张牌。若你选择的项数超过了你的体力值,你弃置一张牌。", + dc_huanghao: "新杀黄皓", + dc_huanghao_prefix: "新杀", + dcqinqing: "寝情", + dcqinqing_info: + "结束阶段,你可以弃置一名攻击范围内包含一号位的其他角色一张牌。然后若其手牌数大于一号位,你摸一张牌。", + dccunwei: "存畏", + dccunwei_info: + "锁定技。当你成为其他角色使用的锦囊牌的目标后,若你是唯一目标,你摸一张牌;否则你弃置一张牌。", + dc_zhaotongzhaoguang: "赵统赵广", + dcqingren: "青刃", + dcqingren_info: "结束阶段,你可以摸X张牌(X为你本回合发动〖翊赞〗的次数)。", + dclongyuan: "龙渊", + dclongyuan_info: + "锁定技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。", + zhenghun: "郑浑", + dcqiangzhi: "强峙", + dcqiangzhi_info: + "出牌阶段限一次。你可以弃置你和一名其他角色的共计三张牌。然后若你与其之中有角色因此失去了三张牌,该角色对另一名角色造成1点伤害。", + dcpitian: "辟田", + dcpitian_info: + "①当你的牌被弃置后,或当你受到伤害后,你的手牌上限+1。②结束阶段,若你的手牌数小于手牌上限,你可以摸至手牌上限(至多摸五张),然后重置因〖辟田①〗增加的手牌上限。", + furongfuqian: "傅肜傅佥", + dcxuewei: "血卫", + dcxuewei_info: + "结束阶段,你可以选择一名体力值不大于你的角色,然后你获得如下效果直到你的下回合开始时:当其受到伤害时,防止此伤害,然后你失去1点体力,你与其各摸一张牌(若该角色为你,则改为你摸一张牌)。", + dcyuguan: "御关", + dcyuguan_info: + "一名角色的回合结束时,若你已损失的体力值为全场最多,你可以减1点体力上限,然后令至多X名角色将手牌摸至体力上限(X为你已损失的体力值)。", + qinlang: "秦朗", + dchaochong: "昊宠", + dchaochong_info: + "当你使用牌后,你可以将手牌摸至或弃置至你的手牌上限数(至多摸五张)。然后若你以此法:得到牌,你的手牌上限-1;失去牌,你的手牌上限+1。", + dcjinjin: "矜谨", + dcjinjin_info: + "每回合限两次。当你造成或受到伤害后,你可以重置因〖昊宠〗增加或减少的手牌上限,令伤害来源弃置至多X张牌,然后你摸Y张牌(X为你以此法变化的手牌上限且至少为1,Y为X减其以此法弃置的牌数)。", + xianglang: "向朗", + dckanji: "勘集", + dckanji_info: + "出牌阶段限两次。你可以展示所有手牌,若花色均不同,你摸两张牌。然后若你的手牌因此包含了四种花色,你跳过下一个弃牌阶段。", + dcqianzheng: "愆正", + dcqianzheng_info: + "每回合限两次。当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以重铸两张牌。若你以此法重铸的牌中没有与指定你为目标的牌类别相同的牌,你于此牌对应的实体牌进入弃牌堆后获得此牌对应的所有实体牌。", + qiaorui: "桥蕤", + dcaishou: "隘守", + dcaishou_tag: "隘", + dcaishou_info: + "①结束阶段,你可以摸X张牌,称为“隘”(X为你的体力上限)。②准备阶段,你弃置所有“隘”,若你以此法弃置的牌数大于体力值且你的体力上限小于9,你加1点体力上限。③当你于回合外失去最后一张“隘”后,你减1点体力上限。", + dcsaowei: "扫围", + dcsaowei_info: + "当一名其他角色使用【杀】结算结束后,若此牌的目标角色不包含你且均在你的攻击范围内,你可以将一张“隘”当做【杀】对所有目标角色使用。以此法转化的【杀】结算完毕后,若此【杀】造成过伤害,你获得此【杀】对应的实体牌。", + yuantanyuanxiyuanshang: "袁谭袁尚袁熙", + dcneifa: "内伐", + dcneifa_info: + "出牌阶段开始时,你可以摸三张牌,然后弃置一张牌。若你弃置的牌类型为:基本牌,本阶段你不能使用锦囊牌,且【杀】的使用次数上限+X且可以额外指定一名目标;锦囊牌,本阶段你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5。你以此法选择的额外目标均无距离限制)。", + dc_sunziliufang: "新杀孙资刘放", + dc_sunziliufang_prefix: "新杀", + dcqinshen: "勤慎", + dcqinshen_info: "弃牌阶段结束时,你可以摸X张牌(X为本回合未进入过弃牌堆的花色数)。", + dcweidang: "伪谠", + dcweidang_info: + "其他角色的结束阶段,你可以将一张字数为X的牌置于牌堆底,然后获得牌堆里一张字数为X的牌(X为本回合未进入过弃牌堆的花色数)。若你能使用此牌,你使用之。", + mengjie: "孟节", + dcyinlu: "引路", + dcyinlu_info: + "①游戏开始时,你令三名角色依次分别获得“乐泉”、“藿溪”、“瘴气”标记(若场上角色数为2则改为令一名其他角色获得其中2枚,你获得剩余标记),然后你获得“芸香”标记并获得1点“芸香”值。②准备阶段/有〖引路〗标记的角色死亡时,你可以移动一名角色的1枚/其的所有〖引路〗标记。", + dcyinlu_lequan: "乐泉", + dcyinlu_lequan_info: "结束阶段,你可以弃置一张♦牌并回复1点体力。", + dcyinlu_huoxi: "藿溪", + dcyinlu_huoxi_info: "结束阶段,你可以弃置一张♥牌并摸两张牌。", + dcyinlu_zhangqi: "瘴气", + dcyinlu_zhangqi_info: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。", + dcyinlu_yunxiang: "芸香", + dcyinlu_yunxiang_info: + "①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。", + dcyouqi: "幽栖", + dcyouqi_info: "锁定技。当其他角色因〖引路〗标记弃置牌后,你有一定概率获得此牌。", + dcyouqi_faq: "〖幽栖〗概率
    ", + dcyouqi_faq_info: + "当满足〖幽栖〗条件时,系统生成一个随机数X∈[0,1)。若X小于(1.25-0.25Y),或幸运星模式已开启,你获得此牌(Y为你至该角色的距离)。", + dc_sunhanhua: "孙寒华", + dchuiling: "汇灵", + dchuiling_info: + "锁定技。当你使用牌时,若此牌颜色为弃牌堆中数量较少的颜色,你获得1枚“灵”标记。若弃牌堆中:红色牌数大于黑色牌数,你回复1点体力;黑色牌数大于红色牌数,你可以弃置一名其他角色的一张牌。", + dcchongxu: "冲虚", + dcchongxu_info: + "限定技。出牌阶段,若“灵”数不小于4,你可以失去〖汇灵〗,增加等同于“灵”数的体力上限(至多增加场上人数的体力上限),然后获得〖踏寂〗和〖清荒〗。", + dctaji: "踏寂", + dctaji_info: + "当你失去手牌后,根据你失去牌的原因执行以下效果:1.使用:你弃置其他角色一张牌;2.打出:你摸一张牌;3.弃置:你回复1点体力;4.其他:你下一次对其他角色造成伤害时,此伤害+1。", + dcqinghuang: "清荒", + dcqinghuang_info: + "出牌阶段开始时,你可以减1点体力上限,然后你于本回合发动〖踏寂〗时额外随机执行一种效果。", + dc_huojun: "霍峻", + dcgue: "孤扼", + dcgue_info: + "每回合限一次。当你需要于回合外使用或打出【杀】或【闪】时,你可以发动此技能:你展示所有手牌,若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。", + dcsigong: "伺攻", + dcsigong_info: + "其他角色的回合结束时,若其于本回合内使用牌被响应过,你可以将手牌摸至或弃置至1,视为对其使用一张需使用X张【闪】抵消的【杀】,且此【杀】的伤害基数+1(X为你以此法弃置的牌数且至少为1)。当你以此法造成伤害后,该技能于本轮失效。", + peiyuanshao: "裴元绍", + dcmoyu: "没欲", + dcmoyu_info: + "出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】,且此【杀】伤害基数为X(X为你于本回合发动此技能的次数)。若此【杀】对你造成了伤害,你令此技能于本回合失效。", + zhangchu: "张楚", + dcjizhong: "集众", + dcjizhong_info: + "出牌阶段限一次。你可以令一名其他角色摸两张牌,然后其选择一项:1.若其没有“信众”标记,其获得“信众”标记;2.交给你三张手牌。", + dcrihui: "日彗", + dcrihui_info: + "每回合限一次。当你使用普通锦囊牌或黑色基本牌结算结束后,若此牌的目标数为1且目标不为你,且其:没有“信众”,则所有有“信众”的角色依次视为对其使用一张与此牌牌名和属性相同的牌;有“信众”,则你可以获得其区域里的一张牌。", + dcguangshi: "光噬", + dcguangshi_info: "锁定技。准备阶段,若所有其他角色均有“信众”,你摸两张牌并失去1点体力。", + dongwan: "董绾", + dcshengdu: "生妒", + dcshengdu_info: + "回合开始时,你可以选择一名其他角色,令其获得1枚“生妒”标记。有“生妒”标记的角色于摸牌阶段得到牌后,你摸X张牌,然后其移去所有“生妒”标记(X为摸牌数乘以其拥有的“生妒”标记数)。", + dcjieling: "介绫", + dcjieling_info: + "出牌阶段每种花色限一次,你可以将两张花色不同的手牌当无距离限制且无任何次数限制的【杀】使用。然后若此【杀】:造成了伤害,所有目标角色失去1点体力;未造成伤害,所有目标角色依次获得1枚“生妒”标记。", + yuanyin: "袁胤", + dcmoshou: "墨守", + dcmoshou_info: + "当你成为其他角色使用的黑色牌的目标后,你可以摸X张牌(X为你本局游戏此前发动过此技能的次数÷3的余数+1)。", + dcyunjiu: "运柩", + dcyunjiu_info: + "一名角色死亡后,你可以弃置等同于其因死亡事件的规则而弃置的牌数,将其此次弃置的牌交给一名其他角色。然后你加1点体力上限并回复1点体力。", + gaoxiang: "高翔", + dcchiying: "驰应", + dcchiying_info: + "出牌阶段限一次。你可以选择一名体力不大于你的角色,令其攻击范围内的其他角色依次弃置一张牌。然后若你选择的角色不为你,其获得以此法弃置的牌中所有的基本牌。", + zhangkai: "张闿", + dcxiangshu: "相鼠", + dcxiangshu_info: + "其他角色的出牌阶段开始时,若其手牌数不小于其体力值,你可以选择一个不大于5的非负整数,然后你弃置一张牌或声明此数字。若如此做,此阶段结束时,若其手牌数与你选择的数字:差值不大于1,你获得其一张牌;相等,你对其造成1点伤害。", + mengyou: "孟优", + dcmanzhi: "蛮智", + dcmanzhi_info: + "①准备阶段,你可以选择一名其他角色并选择一项:1.令其交给你两张牌,然后其视为使用一张无距离限制的【杀】;2.获得其区域内至多两张牌,然后交给其等量的牌并摸一张牌。②结束阶段,若你的体力值与本回合准备阶段时的体力值相等,你可以执行你未于本回合执行过的〖蛮智①〗的分支。", + dc_sunchen: "孙綝", + dczigu: "自固", + dczigu_info: + "出牌阶段限一次。你可以弃置一张牌,然后获得场上的一张装备牌。若你没有因此获得其他角色的牌,你摸一张牌。", + dczuowei: "作威", + dczuowei_info: + "当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌且不能于本回合再触发该选项(X为你装备区里牌的数量且至少为1)。", + liuchongluojun: "刘宠骆俊", + dcminze: "悯泽", + dcminze_info: + "①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)。", + dcjini: "击逆", + dcjini_info: + "当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。", + yuechen: "乐綝", + dcporui: "破锐", + dcporui_info: + "每轮限一次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为其本回合失去的牌数且至多为5)。", + dcgonghu: "共护", + dcgonghu_info: + "锁定技。①当你于回合外失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你造成或受到伤害后,若你本回合内造成或受到的总伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。", + yue_caiwenji: "乐蔡琰", + yue_caiwenji_prefix: "乐", + dcshuangjia: "霜笳", + dcshuangjia_tag: "胡笳", + dcshuangjia_info: + "锁定技。①游戏开始,你将你的手牌标记为“胡笳”。②你的“胡笳”牌不计入手牌上限。③其他角色至你的距离+X(X为你的“胡笳”数且至多为5)。", + dcbeifen: "悲愤", + dcbeifen_info: + "锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。", + dc_wuban: "吴班", + dcyouzhan: "诱战", + dcyouzhan_info: + "锁定技。当其他角色于你的回合内失去一张牌后,你摸一张牌(不计入本回合的手牌上限),且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数且至多为3)。", + yue_zhoufei: "乐周妃", + yue_zhoufei_prefix: "乐", + dclingkong: "灵箜", + dclingkong_tag: "箜篌", + dclingkong_info: + "锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于一回合内首次于摸牌阶段外得到牌后,你将这些牌标记为“箜篌”。", + dcxianshu: "贤淑", + dcxianshu_info: + "出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色,然后你摸X张牌(X为你与其的体力值之差且至多为5)。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。", + dc_zhangmancheng: "张曼成", + dclvecheng: "掠城", + dclvecheng_info: + "出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。", + dczhongji: "螽集", + dczhongji_info: + "当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。", + dc_jiachong: "贾充", + dcbeini: "悖逆", + dcbeini_info: + "出牌阶段限一次。你可以将手牌调整至体力上限,然后令一名角色视为对另一名角色使用一张【杀】,且这些角色的非锁定技失效直到回合结束。", + dcshizong: "恃纵", + dcshizong_info: + "当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。", + pangshanmin: "庞山民", + dccaisi: "才思", + dccaisi_info: + "当你于回合内/回合外使用基本牌结算结束后,你可以从牌堆/弃牌堆随机获得一张非基本牌,然后若你本回合发动此技能的次数:小于你的体力上限,本回合你发动此技能获得的牌数+1;大于等于你的体力上限,本回合此技能失效。", + dczhuoli: "擢吏", + dczhuoli_info: + "锁定技。一名角色的回合结束时,若你本回合使用或获得的牌数大于体力值,你加1点体力上限(不能超过游戏人数),回复1点体力。", + yue_caiyong: "乐蔡邕", + yue_caiyong_prefix: "乐", + dcjiaowei: "焦尾", + dcjiaowei_tag: "弦", + dcjiaowei_info: + "锁定技。①游戏开始时,你将所有手牌标记为“弦”。②你的“弦”牌不计入手牌上限。③当你受到伤害时,若来源的手牌数不大于你的“弦”牌数,防止此伤害。", + dcfeibai: "飞白", + dcfeibai_info: + "每回合限一次。当你使用牌结算结束后,若你本回合使用过至少两张牌,你可以随机获得一张字数为X的牌。若你的“弦”数不大于X,你重置〖飞白〗(X为此牌与你使用的上一张牌的字数之和)。", + kuaiqi: "蒯祺", + dcliangxiu: "良秀", + dcliangxiu_info: + "出牌阶段,你可以弃置两张不同类型的牌,然后从两张与你弃置的牌类型均不同的牌中选择一张获得之(每阶段每种类型限一次)。", + dcxunjie: "殉节", + dcxunjie_info: + "每轮每项限一次。一名角色的回合结束时,若你本回合于摸牌阶段外得到过牌,你可以选择一项:1.令一名角色将手牌数摸或弃置至与其体力值相同;2.令一名角色将体力回复或失去至与其手牌数相同。", + dc_dongzhao: "董昭", + dcyijia: "移驾", + dcyijia_info: + "一名角色受到伤害后,若你至其的距离不大于1,你可以将场上一张装备牌移动至其对应装备栏(替换原装备)。若其因此脱离了一名角色的攻击范围,你摸一张牌。", + dcdingji: "定基", + dcdingji_info: + "准备阶段,你可以令一名角色将手牌摸或弃置至五张,然后其展示手牌。若牌名均不同,则其可以视为使用其中一张基本或普通锦囊牌。", + yue_xiaoqiao: "乐小乔", + yue_xiaoqiao_prefix: "乐", + dcqiqin: "绮琴", + dcqiqin_tag: "琴", + dcqiqin_info: + "锁定技。①游戏开始时,你将所有手牌标记为“琴”。②你的“琴”牌不计入手牌上限。③准备阶段,你获得位于弃牌堆的所有“琴”。", + dcweiwan: "媦婉", + dcweiwan_info: + "出牌阶段限一次,你可以弃置一张“琴”并随机获得一名其他角色区域内花色与此牌不相同的牌各一张,若你获得了:一张牌,其失去1点体力;两张牌,本回合你对其使用牌无距离和次数限制;三张牌,本回合你不能对其使用牌。", + dc_lingcao: "新杀凌操", + dc_lingcao_prefix: "新杀", + dcdufeng: "独锋", + dcdufeng_info: + "锁定技。出牌阶段开始时,你失去1点体力或废除一个装备栏,摸X张牌,然后你的攻击范围与使用【杀】的次数上限均为X直到回合结束(X为你已废除的装备栏数与损失的体力值之和,至多为你的体力上限)。", + dc_sp_menghuo: "群孟获", + dc_sp_menghuo_prefix: "群", + dcmanwang: "蛮王", + dcmanwang_info: + "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。", + dcpanqin: "叛侵", + dcpanqin_info: + "出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项,然后加1点体力上限并回复1点体力。", + dc_kongrong: "孔融", + dckrmingshi: "名士", + dckrmingshi_info: + "锁定技,当你受到其他角色造成的伤害时,若其手牌数大于你,则其需弃置一张手牌,否则此伤害-1。", + yue_daqiao: "乐大乔", + yue_daqiao_prefix: "乐", + dczixi: "姊希", + dczixi_info: + "①出牌阶段开始和结束时,你可以将一张“琴”当作一张无效果的【乐不思蜀】、【兵粮寸断】或【闪电】置于一名角色的判定区。②当你使用基本牌或普通锦囊牌指定唯一目标后,你可根据其判定区内的牌数执行对应项:1.令此牌对其额外结算一次;2.摸两张牌;3.弃置其判定区所有牌,对其造成3点伤害。", + jiangfei: "蒋琬费祎", + dcshengxi: "生息", + dcshengxi_info: "弃牌阶段结束时,若你本回合未造成过伤害,你可以摸两张牌。", + dcshoucheng: "守成", + dcshoucheng_info: "一名角色于其回合外失去最后的手牌后,你可令其摸两张牌。", + dc_liuli: "刘理", + dcfuli: "抚黎", + dcfuli_info: + "出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。若你因此弃置了伤害类卡牌,则你可以选择一名角色,令其攻击范围-1直到你的下个回合开始。", + dcdehua: "德化", + dcdehua_info: + "锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。", + gongsunxiu: "公孙修", + dcgangu: "干蛊", + dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。", + dckuizhen: "溃阵", + dckuizhen_info: + "出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。", + dc_jiangji: "蒋济", + dcshiju: "势举", + dcshiju_info: + "其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。", + dcyingshi: "应时", + dcyingshi_info: + "每回合每项各限一次。当你使用普通锦囊牌指定第一个目标后,若有目标不为本回合第一次成为牌的目标,则你可以令其选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。", + dc_wangling: "王淩", + dcjichou: "集筹", + dcjichou_info: + "出牌阶段结束时,若你于此阶段使用过牌且这些牌的牌名均不同,你可以观看位于弃牌堆中的这些牌,选择任意张牌并选择等量角色,将这些牌交给这些角色各一张,然后你摸X张牌(X为你本局游戏首次发动〖集筹〗给出的牌数)。", + dcmouli: "谋立", + dcmouli_info: + "觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数不小于5,你加1点体力上限并回复1点体力,然后获得〖自缚〗。", + dczifu: "自缚", + dczifu_info: + "锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。", + dc_simashi: "司马师", + dcsanshi: "散士", + dcsanshi_tag: "死士", + dcsanshi_info: + "锁定技。①第一轮游戏开始时,你令系统将牌堆中每个点数的随机一张牌永久标记为“死士”(“死士”对你可见)。②一名角色的回合结束时,若本回合有“死士”不因你使用或打出而进入弃牌堆,你于弃牌堆中获得这些牌。③你使用“死士”不能被响应。", + dczhenrao: "震扰", + dczhenrao_info: + "每回合每名角色限一次。当你使用牌指定第一个目标后,若目标角色包含其他角色,或当其他角色使用牌指定你为目标后,你可以选择手牌数大于你的其中一个目标或此牌的使用者,然后对其造成1点伤害。", + dcchenlve: "沉略", + dcchenlve_info: + "限定技。出牌阶段,你可以将牌堆、弃牌堆、场上及其他角色的手牌区里的所有“死士”置入处理区,然后你获得这些牌。若如此做,你获得如下效果:1.此回合结束时,你将这些牌移出游戏;2.当你死亡时,你将所有以此法移出游戏的“死士”置入弃牌堆。", + dc_caoshuang: "新杀曹爽", + dc_caoshuang_prefix: "新杀", + dcjianzhuan: "渐专", + dcjianzhuan_info: + "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:⒈令一名角色弃置X张牌;⒉摸X张牌;⒊重铸X张牌;⒋弃置X张牌(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。", + dcjianzhuan_faq: "渐专概率", + dcjianzhuan_faq_info: + "
    当系统随机选择要删除的选项时,“弃置X张牌”的选项概率固定为90%;剩余选项平分剩余的的10%概率。
    如第一次删除时,删除弃牌选项概率为90%,其余三个选项被删除的概率均为3.33%,若删除了非弃牌选项,第二次删除时,删除弃牌选项的概率依旧是90%,其余两个选项被删除的概率均为5%。", + dcfanshi: "返势", + dcfanshi_info: + "觉醒技,结束阶段,若〖渐专①〗剩余选项数小于2,则你执行三次X视为1的剩余选项,然后增加2点体力上限并回复2点体力,失去技能〖渐专〗并获得技能〖覆斗〗。", + dcfudou: "覆斗", + dcfudou_info: + "当你使用黑色牌/红色牌指定唯一目标后,若该角色不为你,且其于本局游戏对你/未对你造成过伤害,则你可以与其各失去1点体力/各摸一张牌。", - sp_baigei:'无双上将', - sp_caizijiaren:'才子佳人', - sp_zhilan:'芝兰玉树', - sp_zongheng:'纵横捭阖', - sp_guixin:'天下归心', - sp_jianghu:'江湖之远', - sp_daihan:'代汉涂高', - sp_taiping:'太平甲子', - sp_yanhan:'匡鼎炎汉', - sp_jishi:'悬壶济世', - sp_raoting:'绕庭之鸦', - sp_yijun:'异军突起', - sp_zhengyin:'正音雅乐', - sp_zhonghu:'冢虎狼顾', + sp_baigei: "无双上将", + sp_caizijiaren: "才子佳人", + sp_zhilan: "芝兰玉树", + sp_zongheng: "纵横捭阖", + sp_guixin: "天下归心", + sp_jianghu: "江湖之远", + sp_daihan: "代汉涂高", + sp_taiping: "太平甲子", + sp_yanhan: "匡鼎炎汉", + sp_jishi: "悬壶济世", + sp_raoting: "绕庭之鸦", + sp_yijun: "异军突起", + sp_zhengyin: "正音雅乐", + sp_zhonghu: "冢虎狼顾", }, }; }); diff --git a/character/jiange.js b/character/jiange.js index 3efb2a006..09edeb54a 100644 --- a/character/jiange.js +++ b/character/jiange.js @@ -1,576 +1,609 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { - return { - name:'jiange', - character:{ - jg_pangtong:['male','shu',3,['qiwu','tianyu']], - jg_huangyueying:['female','shu',3,['zhinang','jingmiao']], - jg_zhugeliang:['male','shu',3,['biantian','bazhen']], - jg_liubei:['male','shu',4,['jizhen','lingfeng']], - jg_xiahouyuan:['male','wei',4,['xinshensu','juechen']], - jg_caozhen:['male','wei',4,['chiying','jingfan']], - jg_zhanghe:['male','wei',4,['huodi','jueji']], - jg_simayi:['male','wei',5,['xuanlei','sfanshi','konghun']], - }, - skill:{ - sfanshi:{ - trigger:{player:'phaseEnd'}, - forced:true, - check:function(){ - return false; - }, - content:function(){ - player.loseHp(); - } - }, - konghun:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - if(game.players.length>=6){ - return player.hp<=2; - } - return player.hp<=1; - }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('konghun'),function(card,player,target){ - return player!=target; - },[1,Math.min(4,Math.floor((game.players.length-1)/2))]).ai=function(target){ - return get.damageEffect(target,player,player,'thunder')+1; - } - "step 1" - if(result.bool){ - event.targets=result.targets.slice(0); - player.logSkill('konghun',event.targets,'thunder'); - event.targets.sort(lib.sort.seat); - event.num=0; - } - else{ - event.finish(); - } - "step 2" - if(event.num0&&event.player!=player&&event.player.hp1||event.targets[0]!=player); - }, - silent:true, - content:function(){ - player.addTempSkill('huodi3'); - } - }, - huodi3:{}, - jingfan:{ - trigger:{player:'phaseUseEnd'}, - unique:true, - direct:true, - content:function(){ - "step 0" - var num=player.countUsed()-player.countCards('h'); - event.num=num; - if(num>0){ - player.draw(num); - } - "step 1" - if(event.num>0){ - player.chooseTarget('选择至多'+get.cnNumber(event.num)+'名角色令其进攻距离+1',[1,event.num],function(card,player,target){ - return player!=target; - }).ai=function(target){ - return get.attitude(player,target); - } - } - else{ - event.finish(); - } - "step 2" - if(result.bool&&result.targets){ - player.logSkill('jingfan',result.targets); - for(var i=0;i0; - }, - filter:function(event,player){ - if(event.num<=1) return false; - return true; - }, - content:function(){ - trigger.num=1; - if(trigger.source){ - trigger.source.addTempSkill('chiying2','damageAfter'); - } - } - }, - chiying2:{ - trigger:{source:'damageEnd'}, - forced:true, - popup:false, - content:function(){ - player.draw(); - } - }, - juechen:{ - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card.name=='sha'; - }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('juechen'),function(card,player,target){ - return player!=target&&!trigger.targets.includes(target)&&target.countCards('he')>0; - }).set('autodelay',true).ai=function(target){ - return -get.attitude(player,target); - } - "step 1" - if(result.bool){ - player.logSkill('juechen',result.targets); - player.discardPlayerCard(true,result.targets[0],'he'); - } - } - }, - lingfeng:{ - trigger:{player:'phaseDrawBefore'}, - check:function(event,player){ - for(var i=0;i0; - }).ai=function(target){ - return -get.attitude(player,target); - } - } - "step 2" - if(result.bool&&result.targets&&result.targets.length){ - player.discardPlayerCard(result.targets[0],'he',true); - } - "step 3" - player.gain(event.cards); - player.$draw(event.cards); - game.delay(); - }, - ai:{ - threaten:1.1 - } - }, - biantian4:{ - trigger:{player:'dieBegin'}, - forced:true, - popup:false, - content:function(){ - for(var i=0;i0; - }, - content:function(){ - "step 0" - player.choosePlayerCard(trigger.player,get.prompt('jingmiao',trigger.player),'he'); - "step 1" - if(result.bool){ - player.logSkill('jingmiao',trigger.player); - trigger.player.discard(result.links); - } - }, - ai:{ - expose:0.2 - } - }, - zhinang:{ - trigger:{player:'phaseBegin'}, - frequent:true, - content:function(){ - "step 0" - event.cards=get.cards(3); - event.cards2=[]; - for(var i=0;iplayer.hp){ - if(target==player) return Math.max(1,att-2); - } - if(target==player) return att+5; - return att; - } - } - "step 2" - if(result&&result.targets&&result.targets.length){ - event.target=result.targets[0]; - } - if(event.cards2.length){ - event.target.gain(event.cards2,'gain2'); - } - }, - ai:{ - threaten:1.3 - } - }, - tianyu:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ - for(var i=0;i= 6) { + return player.hp <= 2; + } + return player.hp <= 1; + }, + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("konghun"), + function (card, player, target) { + return player != target; + }, + [1, Math.min(4, Math.floor((game.players.length - 1) / 2))] + ).ai = function (target) { + return get.damageEffect(target, player, player, "thunder") + 1; + }; + ("step 1"); + if (result.bool) { + event.targets = result.targets.slice(0); + player.logSkill("konghun", event.targets, "thunder"); + event.targets.sort(lib.sort.seat); + event.num = 0; + } else { + event.finish(); + } + ("step 2"); + if (event.num < event.targets.length) { + event.targets[event.num].damage("thunder"); + event.num++; + event.redo(); + } + ("step 3"); + player.recover(event.targets.length); + }, + }, + xuanlei: { + trigger: { player: "phaseBegin" }, + forced: true, + filter: function (event, player) { + for (var i = 0; i < game.players.length; i++) { + if (game.players[i] != player && game.players[i].countCards("j")) return true; + } + return false; + }, + content: function () { + "step 0"; + event.targets = []; + for (var i = 0; i < game.players.length; i++) { + if (game.players[i] != player && game.players[i].countCards("j")) { + event.targets.push(game.players[i]); + } + } + event.targets.sort(lib.sort.seat); + ("step 1"); + if (event.targets.length) { + event.targets.shift().damage("thunder"); + event.redo(); + } + }, + }, + jueji: { + trigger: { global: "phaseDrawBegin" }, + direct: true, + filter: function (event, player) { + return ( + event.num > 0 && + event.player != player && + event.player.hp < event.player.maxHp && + player.countCards("he") + ); + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + "是否弃置一张牌令" + get.translation(trigger.player) + "的摸牌数-1?" + ); + next.ai = function (card) { + if (get.attitude(player, trigger.player) < 0) { + return 6 - get.value(card); + } + return 0; + }; + next.logSkill = ["jueji", trigger.player]; + ("step 1"); + if (result.bool) { + trigger.num--; + } + }, + ai: { + expose: 0.2, + threaten: 1.8, + }, + }, + huodi: { + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return !player.hasSkill("huodi3"); + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("huodi"), function (card, player, target) { + return target.countCards("he") && player != target; + }).ai = function (target) { + return -get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("huodi", result.targets); + player.discardPlayerCard(result.targets[0], true, "he"); + } + }, + ai: { + expose: 0.2, + threaten: 1.2, + }, + group: "huodi2", + }, + huodi2: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return ( + _status.currentPhase == player && + event.targets && + (event.targets.length > 1 || event.targets[0] != player) + ); + }, + silent: true, + content: function () { + player.addTempSkill("huodi3"); + }, + }, + huodi3: {}, + jingfan: { + trigger: { player: "phaseUseEnd" }, + unique: true, + direct: true, + content: function () { + "step 0"; + var num = player.countUsed() - player.countCards("h"); + event.num = num; + if (num > 0) { + player.draw(num); + } + ("step 1"); + if (event.num > 0) { + player.chooseTarget( + "选择至多" + get.cnNumber(event.num) + "名角色令其进攻距离+1", + [1, event.num], + function (card, player, target) { + return player != target; + } + ).ai = function (target) { + return get.attitude(player, target); + }; + } else { + event.finish(); + } + ("step 2"); + if (result.bool && result.targets) { + player.logSkill("jingfan", result.targets); + for (var i = 0; i < result.targets.length; i++) { + result.targets[i].addSkill("jingfan2"); + result.targets[i].popup("jingfan"); + } + } + }, + mod: { + globalFrom: function (from, to, distance) { + if (_status.currentPhase == from) { + return distance - from.countUsed(); + } + }, + }, + ai: { + expose: 0.1, + }, + }, + jingfan2: { + mod: { + globalFrom: function (from, to, distance) { + return distance - 1; + }, + }, + trigger: { player: "phaseEnd" }, + forced: true, + content: function () { + player.removeSkill("jingfan2"); + }, + }, + chiying: { + trigger: { global: "damageBegin2" }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + filter: function (event, player) { + if (event.num <= 1) return false; + return true; + }, + content: function () { + trigger.num = 1; + if (trigger.source) { + trigger.source.addTempSkill("chiying2", "damageAfter"); + } + }, + }, + chiying2: { + trigger: { source: "damageEnd" }, + forced: true, + popup: false, + content: function () { + player.draw(); + }, + }, + juechen: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "sha"; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("juechen"), function (card, player, target) { + return ( + player != target && + !trigger.targets.includes(target) && + target.countCards("he") > 0 + ); + }) + .set("autodelay", true).ai = function (target) { + return -get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("juechen", result.targets); + player.discardPlayerCard(true, result.targets[0], "he"); + } + }, + }, + lingfeng: { + trigger: { player: "phaseDrawBefore" }, + check: function (event, player) { + for (var i = 0; i < game.players.length; i++) { + if (player != game.players[i]) { + if (get.attitude(player, game.players[i]) < 0) return true; + } + } + return false; + }, + content: function () { + "step 0"; + trigger.cancel(); + event.cards = get.cards(2); + player.showCards(event.cards); + ("step 1"); + if (get.color(event.cards[0]) != get.color(event.cards[1])) { + player.chooseTarget("是否弃置一名角色一张牌?", function (card, player, target) { + return player != target && target.countCards("he") > 0; + }).ai = function (target) { + return -get.attitude(player, target); + }; + } + ("step 2"); + if (result.bool && result.targets && result.targets.length) { + player.discardPlayerCard(result.targets[0], "he", true); + } + ("step 3"); + player.gain(event.cards); + player.$draw(event.cards); + game.delay(); + }, + ai: { + threaten: 1.1, + }, + }, + biantian4: { + trigger: { player: "dieBegin" }, + forced: true, + popup: false, + content: function () { + for (var i = 0; i < game.players.length; i++) { + if (game.players[i].hasSkill("biantian3")) { + game.players[i].removeSkill("biantian3"); + game.players[i].popup("biantian3"); + } + } + }, + }, + biantian: { + trigger: { player: "phaseBegin" }, + forced: true, + unique: true, + group: "biantian4", + content: function () { + "step 0"; + player.removeSkill("biantian2"); + for (var i = 0; i < game.players.length; i++) { + if (game.players[i].hasSkill("biantian3")) { + game.players[i].removeSkill("biantian3"); + game.players[i].popup("biantian3"); + } + } + player.judge(function (card) { + if (get.color(card) == "red") return 1; + if (get.suit(card) == "spade") return 3; + return -1; + }); + ("step 1"); + if (result.color == "red") { + player.chooseTarget( + "选择至多三名角色获得狂风标记", + [1, 3], + function (card, player, target) { + return player != target; + } + ).ai = function (target) { + if (target.hasSkillTag("nofire")) return 0; + return -get.attitude(player, target); + }; + } else { + event.finish(); + if (result.suit == "spade") { + player.addSkill("biantian2"); + } + } + ("step 2"); + if (result.bool && result.targets) { + for (var i = 0; i < result.targets.length; i++) { + result.targets[i].addSkill("biantian3"); + result.targets[i].popup("kuangfeng"); + } + player.logSkill("kuangfeng", result.targets, "fire"); + } + }, + }, + biantian2: { + trigger: { player: "damageBefore" }, + filter: function (event) { + if (event.nature != "thunder") return true; + return false; + }, + forced: true, + content: function () { + trigger.cancel(); + }, + ai: { + nofire: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && !get.tag(card, "thunderDamage")) return [0, 0]; + }, + }, + }, + }, + biantian3: { + trigger: { player: "damageBegin" }, + filter: function (event) { + if (event.nature == "fire") return true; + return false; + }, + forced: true, + content: function () { + trigger.num++; + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "fireDamage")) return 1.5; + }, + }, + }, + }, + jingmiao: { + trigger: { global: "useCardAfter" }, + direct: true, + filter: function (event, player) { + return ( + event.player != player && + event.card.name == "wuxie" && + event.player.countCards("he") > 0 + ); + }, + content: function () { + "step 0"; + player.choosePlayerCard(trigger.player, get.prompt("jingmiao", trigger.player), "he"); + ("step 1"); + if (result.bool) { + player.logSkill("jingmiao", trigger.player); + trigger.player.discard(result.links); + } + }, + ai: { + expose: 0.2, + }, + }, + zhinang: { + trigger: { player: "phaseBegin" }, + frequent: true, + content: function () { + "step 0"; + event.cards = get.cards(3); + event.cards2 = []; + for (var i = 0; i < event.cards.length; i++) { + var type = get.type(event.cards[i]); + if (type == "trick" || type == "equip") { + event.cards2.push(event.cards[i]); + } + } + if (!event.isMine() || event.cards2.length == 0) { + player.showCards(event.cards); + } + ("step 1"); + if (event.cards2.length == 0) { + event.finish(); + } else { + var dialog = ui.create.dialog("将三张牌中的锦囊牌或装备牌交给一名角色", "hidden"); + dialog.add(event.cards); + for (var i = 0; i < dialog.buttons.length; i++) { + if (event.cards2.includes(dialog.buttons[i].link)) { + dialog.buttons[i].style.opacity = 1; + } else { + dialog.buttons[i].style.opacity = 0.5; + } + } + var next = player.chooseTarget(true, dialog); + next.ai = function (target) { + if (player.hasJudge("lebu")) { + if (target == player) return 0.1; + } + var att = get.attitude(player, target); + if (player.countCards("h") > player.hp) { + if (target == player) return Math.max(1, att - 2); + } + if (target == player) return att + 5; + return att; + }; + } + ("step 2"); + if (result && result.targets && result.targets.length) { + event.target = result.targets[0]; + } + if (event.cards2.length) { + event.target.gain(event.cards2, "gain2"); + } + }, + ai: { + threaten: 1.3, + }, + }, + tianyu: { + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + for (var i = 0; i < game.players.length; i++) { + if (!game.players[i].isLinked() && player != game.players[i]) { + return true; + } + } + }, + content: function () { + "step 0"; + var num = 0; + for (var i = 0; i < game.players.length; i++) { + if (!game.players[i].isLinked() && player != game.players[i]) { + num++; + } + } + player.chooseTarget(get.prompt("tianyu"), [1, num], function (card, player, target) { + return !target.isLinked() && player != target; + }).ai = function (target) { + return -get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("tianyu", result.targets); + event.targets = result.targets; + event.num = 0; + } else { + event.finish(); + } + ("step 2"); + if (event.num < event.targets.length) { + event.targets[event.num].link(); + event.num++; + event.redo(); + } + }, + ai: { + expose: 0.3, + }, + }, + jizhen: { + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + for (var i = 0; i < game.players.length; i++) { + if (game.players[i].hp < game.players[i].maxHp && player != game.players[i]) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + var num = 0; + for (var i = 0; i < game.players.length; i++) { + if (!game.players[i].isLinked() && player != game.players[i]) { + num++; + } + } + player.chooseTarget(get.prompt("jizhen"), [1, 2], function (card, player, target) { + return target.hp < target.maxHp && player != target; + }).ai = function (target) { + return get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("jizhen", result.targets); + game.asyncDraw(result.targets); + } + }, + ai: { + expose: 0.3, + threaten: 1.3, + }, + }, + }, + translate: { + jg_pangtong: "浴火士元", + jg_huangyueying: "工神月英", + jg_zhugeliang: "天侯孔明", + jg_liubei: "烈帝玄德", + jg_xiahouyuan: "绝尘妙才", + jg_caozhen: "佳人子丹", + jg_zhanghe: "巧魁儁乂", + jg_simayi: "断狱仲达", + tianyu: "天狱", + zhinang: "智囊", + jingmiao: "精妙", + biantian: "变天", + biantian2: "大雾", + biantian3: "狂风", + jizhen: "激阵", + xuanlei: "玄雷", + xuanlei_info: "锁定技,准备阶段,你令所有判定区内有牌的其他角色受到1点雷电伤害。", + sfanshi: "反噬", + sfanshi_info: "锁定技,结束阶段,你失去1点体力。", + konghun: "控魂", + konghun_info: + "出牌阶段开始时,若你的体力值不大于1(场上存活角色数不小于6时改为2),你可以对至多X名角色各造成1点雷电伤害,然后你恢复等量体力,X为场上其他存活角色数的一半(向下取整且至多为4)。", + jizhen_info: "结束阶段,你可以令所至多两名已受伤角色摸一张牌。", + // biantian2_info:'已获得大雾标记', + // biantian3_info:'已获得狂风标记', + lingfeng: "灵锋", + jueji: "绝汲", + huodi: "惑敌", + huodi_info: + "结束阶段,若你本回合内没有使用过指定其他角色为目标的卡牌,你可以弃置一名其他角色的一张牌。", + jueji_info: "其他角色的摸牌阶段开始时,若其已受伤,你可以弃置一张牌令其摸牌数-1。", + lingfeng_info: + "摸牌阶段,你可以弃置摸牌,改为亮出牌堆顶的两张牌并获得之,若两张牌颜色不同,你可以弃置一名角色的一张牌。", + biantian_info: + "锁定技,准备阶段,你进行一次判定,若为红色,你可以选择至多三名角色进入“狂风”状态直到你的下一回合开始,若为黑桃,直到下个回合开始前,你处于“大雾”状态。", + jingmiao_info: "每当有一名其他角色使用无懈可击,你可以弃置其一张牌。", + zhinang_info: "准备阶段,你可以亮出牌堆顶的三张牌,你可以将其中锦囊或装备牌交给一名角色。", + tianyu_info: "结束阶段,你可以将任意名未横置的其他角色横置。", + juechen: "绝尘", + juechen_info: "每当你使用一张杀,可以弃置一名其他角色的一张牌(不能是杀的目标)。", + chiying: "持盈", + chiying_info: "每当一名角色受到多于1伤害时,你可以令其防止其余伤害,然后令伤害来源摸一张牌。", + jingfan: "惊帆", + jingfan2: "惊帆", + jingfan_info: + "回合内,每当你使用一张卡牌,你的进攻距离+1;出牌阶段结束时,你可以将手牌数补至X,并指定至多X名角色令其进攻距离+1直到其下一回合结束,X为你回合内使用的卡牌数。", + }, + }; +}); diff --git a/character/jsrg.js b/character/jsrg.js index 0bc332c38..c9ab43b4d 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -1,3877 +1,4822 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'jsrg', - connect:true, - characterSort:{ - jsrg:{ - jiangshanrugu_qi:['jsrg_liuhong','jsrg_hejin','jsrg_sunjian','jsrg_huangfusong','jsrg_xushao','jsrg_dongbai','jsrg_qiaoxuan','jsrg_yangbiao','jsrg_kongrong','jsrg_zhujun','jsrg_liubei','jsrg_wangyun','jsrg_liuyan','jsrg_caocao','jsrg_nanhualaoxian'], - jiangshanrugu_cheng:['jsrg_sunce','jsrg_xuyou','jsrg_lvbu','jsrg_zhanghe','jsrg_zoushi','jsrg_guanyu','jsrg_chendeng','jsrg_zhenji','jsrg_zhangliao','jsrg_xugong','jsrg_chunyuqiong'], - jiangshanrugu_zhuan:['jsrg_guojia','jsrg_zhangfei','jsrg_machao','jsrg_lougui','jsrg_zhangren','jsrg_huangzhong','jsrg_xiahourong','jsrg_sunshangxiang','jsrg_pangtong','jsrg_hansui','jsrg_zhangchu','jsrg_xiahouen','jsrg_fanjiangzhangda'], - jiangshanrugu_he:['jsrg_zhugeliang','jsrg_jiangwei','jsrg_luxun','jsrg_zhaoyun','jsrg_simayi','jsrg_guoxun','jsrg_sunlubansunluyu','jsrg_caofang','jsrg_sunjun','jsrg_liuyong','jsrg_weiwenzhugezhi','jsrg_zhangxuan','jsrg_gaoxiang','jsrg_guozhao'], + name: "jsrg", + connect: true, + characterSort: { + jsrg: { + jiangshanrugu_qi: [ + "jsrg_liuhong", + "jsrg_hejin", + "jsrg_sunjian", + "jsrg_huangfusong", + "jsrg_xushao", + "jsrg_dongbai", + "jsrg_qiaoxuan", + "jsrg_yangbiao", + "jsrg_kongrong", + "jsrg_zhujun", + "jsrg_liubei", + "jsrg_wangyun", + "jsrg_liuyan", + "jsrg_caocao", + "jsrg_nanhualaoxian", + ], + jiangshanrugu_cheng: [ + "jsrg_sunce", + "jsrg_xuyou", + "jsrg_lvbu", + "jsrg_zhanghe", + "jsrg_zoushi", + "jsrg_guanyu", + "jsrg_chendeng", + "jsrg_zhenji", + "jsrg_zhangliao", + "jsrg_xugong", + "jsrg_chunyuqiong", + ], + jiangshanrugu_zhuan: [ + "jsrg_guojia", + "jsrg_zhangfei", + "jsrg_machao", + "jsrg_lougui", + "jsrg_zhangren", + "jsrg_huangzhong", + "jsrg_xiahourong", + "jsrg_sunshangxiang", + "jsrg_pangtong", + "jsrg_hansui", + "jsrg_zhangchu", + "jsrg_xiahouen", + "jsrg_fanjiangzhangda", + ], + jiangshanrugu_he: [ + "jsrg_zhugeliang", + "jsrg_jiangwei", + "jsrg_luxun", + "jsrg_zhaoyun", + "jsrg_simayi", + "jsrg_guoxun", + "jsrg_sunlubansunluyu", + "jsrg_caofang", + "jsrg_sunjun", + "jsrg_liuyong", + "jsrg_weiwenzhugezhi", + "jsrg_zhangxuan", + "jsrg_gaoxiang", + "jsrg_guozhao", + ], }, }, - character:{ + character: { //起 - jsrg_liuhong:['male','qun',4,['jsrgchaozheng','jsrgshenchong','jsrgjulian'],['zhu']], - jsrg_hejin:['male','qun',4,['jsrgzhaobing','jsrgzhuhuan','jsrgyanhuo']], - jsrg_sunjian:['male','qun',4,['jsrgpingtao','jsrgjuelie']], - jsrg_huangfusong:['male','qun',4,['jsrgguanhuo','jsrgjuxia']], - jsrg_xushao:['male','qun',3,['sbyingmen','sbpingjian']], - jsrg_dongbai:['female','qun',3,['jsrgshichong','jsrglianzhu']], - jsrg_qiaoxuan:['male','qun',3,['jsrgjuezhi','jsrgjizhao']], - jsrg_yangbiao:['male','qun','3/4',['jsrgzhaohan','jsrgrangjie','jsrgyizheng']], - jsrg_kongrong:['male','qun',3,['jsrglirang','jsrgzhengyi']], - jsrg_zhujun:['male','qun',4,['jsrgfendi','jsrgjuxiang']], - jsrg_liubei:['male','qun',4,['jsrgjishan','jsrgzhenqiao']], - jsrg_wangyun:['male','qun',3,['jsrgshelun','jsrgfayi'],['clan:太原王氏']], - jsrg_liuyan:['male','qun',3,['xinfu_limu','jsrgtushe','jsrgtongjue'],['zhu']], - jsrg_caocao:['male','qun',4,['jsrgzhenglve','jsrghuilie']], - jsrg_nanhualaoxian:['male','qun',3,['jsrgshoushu','jsrgxundao','jsrglinghua']], + jsrg_liuhong: ["male", "qun", 4, ["jsrgchaozheng", "jsrgshenchong", "jsrgjulian"], ["zhu"]], + jsrg_hejin: ["male", "qun", 4, ["jsrgzhaobing", "jsrgzhuhuan", "jsrgyanhuo"]], + jsrg_sunjian: ["male", "qun", 4, ["jsrgpingtao", "jsrgjuelie"]], + jsrg_huangfusong: ["male", "qun", 4, ["jsrgguanhuo", "jsrgjuxia"]], + jsrg_xushao: ["male", "qun", 3, ["sbyingmen", "sbpingjian"]], + jsrg_dongbai: ["female", "qun", 3, ["jsrgshichong", "jsrglianzhu"]], + jsrg_qiaoxuan: ["male", "qun", 3, ["jsrgjuezhi", "jsrgjizhao"]], + jsrg_yangbiao: ["male", "qun", "3/4", ["jsrgzhaohan", "jsrgrangjie", "jsrgyizheng"]], + jsrg_kongrong: ["male", "qun", 3, ["jsrglirang", "jsrgzhengyi"]], + jsrg_zhujun: ["male", "qun", 4, ["jsrgfendi", "jsrgjuxiang"]], + jsrg_liubei: ["male", "qun", 4, ["jsrgjishan", "jsrgzhenqiao"]], + jsrg_wangyun: ["male", "qun", 3, ["jsrgshelun", "jsrgfayi"], ["clan:太原王氏"]], + jsrg_liuyan: ["male", "qun", 3, ["xinfu_limu", "jsrgtushe", "jsrgtongjue"], ["zhu"]], + jsrg_caocao: ["male", "qun", 4, ["jsrgzhenglve", "jsrghuilie"]], + jsrg_nanhualaoxian: ["male", "qun", 3, ["jsrgshoushu", "jsrgxundao", "jsrglinghua"]], //承 - jsrg_sunce:['male','wu',4,['jsrgduxing','jsrgzhiheng','jsrgzhasi','jsrgbashi'],['zhu']], - jsrg_xuyou:['male','wei',3,['jsrglipan','jsrgqingxi','jsrgjinmie'],['doublegroup:wei:qun']], - jsrg_lvbu:['male','qun',5,['jsrgwuchang','jsrgqingjiao','jsrgchengxu'],['doublegroup:shu:qun']], - jsrg_zhanghe:['male','wei',4,['jsrgqiongtu','jsrgxianzhu'],['doublegroup:wei:qun']], - jsrg_zoushi:['female','qun',3,['jsrgguyin','jsrgzhangdeng']], - jsrg_guanyu:['male','shu',5,['jsrgguanjue','jsrgnianen'],['border:wei']], - jsrg_chendeng:['male','qun',3,['jsrglunshi','jsrgguitu']], - jsrg_zhenji:['female','qun',3,['jsrgjixiang','jsrgchengxian']], - jsrg_zhangliao:['male','qun',4,['jsrgzhengbing','jsrgtuwei'],['doublegroup:wei:qun']], - jsrg_xugong:['male','wu',3,['jsrgbiaozhao','jsrgyechou']], - jsrg_chunyuqiong:['male','qun',4,['jsrgcangchu','jsrgshishou']], + jsrg_sunce: ["male", "wu", 4, ["jsrgduxing", "jsrgzhiheng", "jsrgzhasi", "jsrgbashi"], ["zhu"]], + jsrg_xuyou: [ + "male", + "wei", + 3, + ["jsrglipan", "jsrgqingxi", "jsrgjinmie"], + ["doublegroup:wei:qun"], + ], + jsrg_lvbu: [ + "male", + "qun", + 5, + ["jsrgwuchang", "jsrgqingjiao", "jsrgchengxu"], + ["doublegroup:shu:qun"], + ], + jsrg_zhanghe: ["male", "wei", 4, ["jsrgqiongtu", "jsrgxianzhu"], ["doublegroup:wei:qun"]], + jsrg_zoushi: ["female", "qun", 3, ["jsrgguyin", "jsrgzhangdeng"]], + jsrg_guanyu: ["male", "shu", 5, ["jsrgguanjue", "jsrgnianen"], ["border:wei"]], + jsrg_chendeng: ["male", "qun", 3, ["jsrglunshi", "jsrgguitu"]], + jsrg_zhenji: ["female", "qun", 3, ["jsrgjixiang", "jsrgchengxian"]], + jsrg_zhangliao: ["male", "qun", 4, ["jsrgzhengbing", "jsrgtuwei"], ["doublegroup:wei:qun"]], + jsrg_xugong: ["male", "wu", 3, ["jsrgbiaozhao", "jsrgyechou"]], + jsrg_chunyuqiong: ["male", "qun", 4, ["jsrgcangchu", "jsrgshishou"]], //转 - jsrg_guojia:['male','wei',3,['jsrgqingzi','jsrgdingce','jsrgzhenfeng']], - jsrg_zhangfei:['male','shu',5,['jsrgbaohe','jsrgxushi']], - jsrg_machao:['male','qun',4,['jsrgzhuiming','mashu']], - jsrg_lougui:['male','wei',3,['jsrgshacheng','jsrgninghan']], - jsrg_zhangren:['male','qun',4,['jsrgfuni','jsrgchuanxin']], - jsrg_huangzhong:['male','shu',4,['jsrgcuifeng','jsrgdengnan']], - jsrg_xiahourong:['male','wei',4,['jsrgfenjian']], - jsrg_sunshangxiang:['female','wu',3,['jsrgguiji','jsrgjiaohao']], - jsrg_pangtong:['male','qun',3,['jsrgmanjuan','jsrgyangming']], - jsrg_hansui:['male','qun',4,['jsrgniluan','jsrghuchou','jsrgjiemeng'],['zhu']], - jsrg_zhangchu:['female','qun',3,['jsrghuozhong','jsrgrihui']], - jsrg_xiahouen:['male','wei',4,['jsrghujian','jsrgshili'],['die_audio:tw_xiahouen']], - jsrg_fanjiangzhangda:['male','wu',5,['jsrgfushan']], + jsrg_guojia: ["male", "wei", 3, ["jsrgqingzi", "jsrgdingce", "jsrgzhenfeng"]], + jsrg_zhangfei: ["male", "shu", 5, ["jsrgbaohe", "jsrgxushi"]], + jsrg_machao: ["male", "qun", 4, ["jsrgzhuiming", "mashu"]], + jsrg_lougui: ["male", "wei", 3, ["jsrgshacheng", "jsrgninghan"]], + jsrg_zhangren: ["male", "qun", 4, ["jsrgfuni", "jsrgchuanxin"]], + jsrg_huangzhong: ["male", "shu", 4, ["jsrgcuifeng", "jsrgdengnan"]], + jsrg_xiahourong: ["male", "wei", 4, ["jsrgfenjian"]], + jsrg_sunshangxiang: ["female", "wu", 3, ["jsrgguiji", "jsrgjiaohao"]], + jsrg_pangtong: ["male", "qun", 3, ["jsrgmanjuan", "jsrgyangming"]], + jsrg_hansui: ["male", "qun", 4, ["jsrgniluan", "jsrghuchou", "jsrgjiemeng"], ["zhu"]], + jsrg_zhangchu: ["female", "qun", 3, ["jsrghuozhong", "jsrgrihui"]], + jsrg_xiahouen: ["male", "wei", 4, ["jsrghujian", "jsrgshili"], ["die_audio:tw_xiahouen"]], + jsrg_fanjiangzhangda: ["male", "wu", 5, ["jsrgfushan"]], //合 - jsrg_zhugeliang:['male','shu',3,['jsrgwentian','jsrgchushi','jsrgyinlve']], - jsrg_jiangwei:['male','shu',4,['jsrgjinfa','jsrgfumou','jsrgxuanfeng'],['border:wei']], - jsrg_luxun:['male','wu',3,['jsrgyoujin','jsrgdailao','jsrgzhubei']], - jsrg_zhaoyun:['male','shu',4,['jsrglonglin','jsrgzhendan']], - jsrg_simayi:['male','wei',4,['jsrgyingshi','jsrgtuigu']], - jsrg_guoxun:['male','wei',4,['jsrgeqian','jsrgfusha']], - jsrg_sunlubansunluyu:['female','wu',3,['jsrgdaimou','jsrgfangjie']], - jsrg_caofang:['male','wei','3/4',['jsrgzhaotu','jsrgjingju','jsrgweizhui'],['zhu']], - jsrg_sunjun:['male','wu',4,['jsrgyaoyan','jsrgbazheng']], - jsrg_liuyong:['male','shu',3,['jsrgdanxin','jsrgfengxiang']], - jsrg_weiwenzhugezhi:['male','wu',4,['jsrgfuhai']], - jsrg_zhangxuan:['female','wu',4,['jsrgtongli','jsrgshezang']], - jsrg_gaoxiang:['male','shu',4,['jsrgchiying']], - jsrg_guozhao:['female','wei',3,['jsrgpianchong','jsrgzunwei']], + jsrg_zhugeliang: ["male", "shu", 3, ["jsrgwentian", "jsrgchushi", "jsrgyinlve"]], + jsrg_jiangwei: ["male", "shu", 4, ["jsrgjinfa", "jsrgfumou", "jsrgxuanfeng"], ["border:wei"]], + jsrg_luxun: ["male", "wu", 3, ["jsrgyoujin", "jsrgdailao", "jsrgzhubei"]], + jsrg_zhaoyun: ["male", "shu", 4, ["jsrglonglin", "jsrgzhendan"]], + jsrg_simayi: ["male", "wei", 4, ["jsrgyingshi", "jsrgtuigu"]], + jsrg_guoxun: ["male", "wei", 4, ["jsrgeqian", "jsrgfusha"]], + jsrg_sunlubansunluyu: ["female", "wu", 3, ["jsrgdaimou", "jsrgfangjie"]], + jsrg_caofang: ["male", "wei", "3/4", ["jsrgzhaotu", "jsrgjingju", "jsrgweizhui"], ["zhu"]], + jsrg_sunjun: ["male", "wu", 4, ["jsrgyaoyan", "jsrgbazheng"]], + jsrg_liuyong: ["male", "shu", 3, ["jsrgdanxin", "jsrgfengxiang"]], + jsrg_weiwenzhugezhi: ["male", "wu", 4, ["jsrgfuhai"]], + jsrg_zhangxuan: ["female", "wu", 4, ["jsrgtongli", "jsrgshezang"]], + jsrg_gaoxiang: ["male", "shu", 4, ["jsrgchiying"]], + jsrg_guozhao: ["female", "wei", 3, ["jsrgpianchong", "jsrgzunwei"]], }, - characterIntro:{ - qiaoxuan:'桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。', - lougui:'娄圭,字子伯,荆州南阳郡(治今河南南阳)人。曹魏时期著名谋士、将军,娄圭年轻时与曹操有交情,曾经随曹操平定冀州,南征刘表,击破马超,立有功劳,连曹操都感叹他的计谋。 后来曹操和他的儿子们一起出去游玩,娄圭当时也一起随行。因言语不当,被南郡(治今湖北荆州)人习授举报,曹操认为有意诽谤,遭杀害。在小说《三国演义》里,娄圭被设定为京兆人(今陕西西安),隐居终南山,道号“梦梅居士”。于第59回登场。', - xiahourong:'夏侯荣(207年—219年) ,字幼权,名将夏侯渊之子。建安二十四年(219年)汉中之战,父亲夏侯渊战死后,夏侯荣不愿逃跑,随后拔剑冲入敌阵,战死。', - guoxun:'郭脩(?~253年),一作郭循,字孝先,凉州西平人,三国时期曹魏官员。原为曹魏中郎,被蜀汉将领姜维俘虏后降蜀汉,任左将军,后来刺杀了蜀汉大将军费祎。被曹魏追封为长乐乡侯,谥曰威侯。', - caofang:'曹芳(232年-274年),字兰卿,沛国谯县(今安徽省亳州市)人。三国时期曹魏第三位皇帝(239年1月22日-254年10月17日在位),疑为魏武帝曹操曾孙,任城威王曹彰之孙,任城王曹楷之子。太和六年(232年),生于任城王府。青龙三年(235年),选为魏明帝曹叡养子,册封齐王。景初三年(239年),立为皇太子,同日魏明帝曹叡病死,曹芳正式即位,由大将军曹爽和太尉司马懿共同辅政。正始十年,经历高平陵之变,曹爽倒台,政权落入司马氏手中。嘉平六年(254年),中书令李丰和光禄大夫张缉图谋废掉司马师,改立夏侯玄为大将军。司马师平定叛乱后,将曹芳废为齐王,拥戴高贵乡公曹髦继位。西晋建立后,册封邵陵县公。泰始十年(274年),曹芳病逝,终年四十三岁,谥号为厉。', - sunjun:'孙峻(219年-256年10月19日),字子远,扬州吴郡富春(今浙江省杭州市)人,昭义中郎将孙静曾孙,定武中郎将孙暠之孙,散骑侍郎孙恭之子。三国时期吴国宗室、权臣。孙峻从小弓马娴熟,胆量非凡。孙权晚年时,孙峻担任武卫都尉,掌握军权,然后又任侍中,开始涉足朝政。孙权临终前,孙峻接受遗诏同诸葛恪、滕胤共同辅佐朝政。此后,其身兼武卫将军,一直主持宫廷的值班、守卫等要害部门,并被封为都乡侯。孙峻生性喜好专断,容不下诸葛恪,于是与吴主孙亮密谋发动政变,在酒宴中设伏兵杀死诸葛恪。孙峻谋杀诸葛恪之后,升任丞相、大将军,督察内外一切军务,假节,晋封富春侯。此后,孙峻独揽朝政。孙峻在任职期间,滥施刑杀,淫乱宫女,和全公主孙鲁班私通。五凤元年(254年),吴侯孙英企图谋杀孙峻,后来事情被泄露,孙英自杀。时隔一年,吴国将军孙仪、张怡、林恂等人乘蜀国使节来访之机,共同谋划诛杀孙峻。后被孙峻发觉,孙仪自杀,林恂等被认为有罪诛死。太平元年(256年),孙峻梦见被诸葛恪所击,因惊悸恐惧发病而死,时年38岁。', - sunlubansunluyu:'孙鲁班,孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。
    孙鲁育,又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。', - jsrg_caocao:'初平元年二月,董卓徙天子都长安,焚洛阳宫室,众诸侯畏卓兵强,莫敢进。操怒斥众人:“为人臣而临此境,当举义兵以诛暴乱,大众已合,诸君何疑?此一战而天下定矣!”遂引兵汴水,遇卓将徐荣,大破之。操迎天子,攻吕布,伐袁术,安汉室,拜为征西将军。是时,袁绍兼四州之地,将攻许都。操欲扫清寰宇,兴复汉室,遂屯兵官渡。既克绍,操曰:“若天命在吾,吾为周文王矣。”', - jsrg_sunce:'建安五年,操、绍相拒于官渡,孙策欲阴袭许昌,迎汉帝,遂密治兵,部署诸将。未发,会为许贡门客所刺,将计就计,尽托江东于权,诈死以待天时。八月,操、绍决战,孙策亲冒矢石,斩将刈旗,得扬、豫之地。曹操败走冀、青,刘备远遁荆、益。而后历时七年,孙策三分天下已有其二,帝于洛阳,建霸王未竟之功业。权表求吴王,封为仲帝,共治天下。', - jsrg_guojia:'初平元年二月,郭嘉拜见袁绍,闻曹操怒斥众诸侯,乃对曰:“董卓于汴水或有埋伏,慎之!”曹操未从,果败于徐荣。三月,曹操与郭嘉论天下事:“使孤成大业者,必此人也。”郭嘉从破袁绍,讨谭、尚,连战数克,计定辽东。时年三十八,征乌桓归途郭嘉因劳染疾,命悬之际竟意外饮下柳皮醋水而愈。建安十三年,曹操屯兵赤壁,郭嘉识破连环之计,议上中下三策,可胜刘备。尚未献策,曹操便决意采纳上策,“奉孝之才,足胜孤百倍,卿言上策,如何不取?”由此,赤壁战后曹操尽得天下。', - jsrg_zhugeliang:'建兴六年春,汉丞相诸葛亮使赵云、邓芝为先锋,马谡为副将拒箕谷,牵制曹真主力。自率三十万大军攻祁山,三郡叛魏应亮,关中响震。曹叡命张郃拒亮,亮使定军山降将姜维与郃战于街亭,张郃久攻不下。后曹真强攻赵云军,赵云死战,坚守箕谷,马谡、邓芝当场战死忠勇殉国。……既克张郃,曹真溃逃,曹叡弃守长安,迁都邺城。十月,司马懿击退孙权,回援曹真。而后三年,丞相所到之处,无不望风而降,皆箪食壶浆,以迎汉军。尽收豫、徐、兖、并之地,建兴十年春,司马懿父子三人死于诸葛武侯火计,同年,孙权上表称臣,至此四海清平,大汉一统。而后诸葛亮荐蒋琬为丞相,姜维为大将军,自回隆中归隐,后主挽留再三,皆不受。魏延亦辞官相随,侍奉左右。后主时有不决之事,便往隆中拜访相父,均未得面,童子答曰外出云游,遗数锦囊,拆而视之,皆治国之良策也。', + characterIntro: { + qiaoxuan: + "桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。", + lougui: "娄圭,字子伯,荆州南阳郡(治今河南南阳)人。曹魏时期著名谋士、将军,娄圭年轻时与曹操有交情,曾经随曹操平定冀州,南征刘表,击破马超,立有功劳,连曹操都感叹他的计谋。 后来曹操和他的儿子们一起出去游玩,娄圭当时也一起随行。因言语不当,被南郡(治今湖北荆州)人习授举报,曹操认为有意诽谤,遭杀害。在小说《三国演义》里,娄圭被设定为京兆人(今陕西西安),隐居终南山,道号“梦梅居士”。于第59回登场。", + xiahourong: + "夏侯荣(207年—219年) ,字幼权,名将夏侯渊之子。建安二十四年(219年)汉中之战,父亲夏侯渊战死后,夏侯荣不愿逃跑,随后拔剑冲入敌阵,战死。", + guoxun: "郭脩(?~253年),一作郭循,字孝先,凉州西平人,三国时期曹魏官员。原为曹魏中郎,被蜀汉将领姜维俘虏后降蜀汉,任左将军,后来刺杀了蜀汉大将军费祎。被曹魏追封为长乐乡侯,谥曰威侯。", + caofang: + "曹芳(232年-274年),字兰卿,沛国谯县(今安徽省亳州市)人。三国时期曹魏第三位皇帝(239年1月22日-254年10月17日在位),疑为魏武帝曹操曾孙,任城威王曹彰之孙,任城王曹楷之子。太和六年(232年),生于任城王府。青龙三年(235年),选为魏明帝曹叡养子,册封齐王。景初三年(239年),立为皇太子,同日魏明帝曹叡病死,曹芳正式即位,由大将军曹爽和太尉司马懿共同辅政。正始十年,经历高平陵之变,曹爽倒台,政权落入司马氏手中。嘉平六年(254年),中书令李丰和光禄大夫张缉图谋废掉司马师,改立夏侯玄为大将军。司马师平定叛乱后,将曹芳废为齐王,拥戴高贵乡公曹髦继位。西晋建立后,册封邵陵县公。泰始十年(274年),曹芳病逝,终年四十三岁,谥号为厉。", + sunjun: "孙峻(219年-256年10月19日),字子远,扬州吴郡富春(今浙江省杭州市)人,昭义中郎将孙静曾孙,定武中郎将孙暠之孙,散骑侍郎孙恭之子。三国时期吴国宗室、权臣。孙峻从小弓马娴熟,胆量非凡。孙权晚年时,孙峻担任武卫都尉,掌握军权,然后又任侍中,开始涉足朝政。孙权临终前,孙峻接受遗诏同诸葛恪、滕胤共同辅佐朝政。此后,其身兼武卫将军,一直主持宫廷的值班、守卫等要害部门,并被封为都乡侯。孙峻生性喜好专断,容不下诸葛恪,于是与吴主孙亮密谋发动政变,在酒宴中设伏兵杀死诸葛恪。孙峻谋杀诸葛恪之后,升任丞相、大将军,督察内外一切军务,假节,晋封富春侯。此后,孙峻独揽朝政。孙峻在任职期间,滥施刑杀,淫乱宫女,和全公主孙鲁班私通。五凤元年(254年),吴侯孙英企图谋杀孙峻,后来事情被泄露,孙英自杀。时隔一年,吴国将军孙仪、张怡、林恂等人乘蜀国使节来访之机,共同谋划诛杀孙峻。后被孙峻发觉,孙仪自杀,林恂等被认为有罪诛死。太平元年(256年),孙峻梦见被诸葛恪所击,因惊悸恐惧发病而死,时年38岁。", + sunlubansunluyu: + "孙鲁班,孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。
    孙鲁育,又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。", + jsrg_caocao: + "初平元年二月,董卓徙天子都长安,焚洛阳宫室,众诸侯畏卓兵强,莫敢进。操怒斥众人:“为人臣而临此境,当举义兵以诛暴乱,大众已合,诸君何疑?此一战而天下定矣!”遂引兵汴水,遇卓将徐荣,大破之。操迎天子,攻吕布,伐袁术,安汉室,拜为征西将军。是时,袁绍兼四州之地,将攻许都。操欲扫清寰宇,兴复汉室,遂屯兵官渡。既克绍,操曰:“若天命在吾,吾为周文王矣。”", + jsrg_sunce: + "建安五年,操、绍相拒于官渡,孙策欲阴袭许昌,迎汉帝,遂密治兵,部署诸将。未发,会为许贡门客所刺,将计就计,尽托江东于权,诈死以待天时。八月,操、绍决战,孙策亲冒矢石,斩将刈旗,得扬、豫之地。曹操败走冀、青,刘备远遁荆、益。而后历时七年,孙策三分天下已有其二,帝于洛阳,建霸王未竟之功业。权表求吴王,封为仲帝,共治天下。", + jsrg_guojia: + "初平元年二月,郭嘉拜见袁绍,闻曹操怒斥众诸侯,乃对曰:“董卓于汴水或有埋伏,慎之!”曹操未从,果败于徐荣。三月,曹操与郭嘉论天下事:“使孤成大业者,必此人也。”郭嘉从破袁绍,讨谭、尚,连战数克,计定辽东。时年三十八,征乌桓归途郭嘉因劳染疾,命悬之际竟意外饮下柳皮醋水而愈。建安十三年,曹操屯兵赤壁,郭嘉识破连环之计,议上中下三策,可胜刘备。尚未献策,曹操便决意采纳上策,“奉孝之才,足胜孤百倍,卿言上策,如何不取?”由此,赤壁战后曹操尽得天下。", + jsrg_zhugeliang: + "建兴六年春,汉丞相诸葛亮使赵云、邓芝为先锋,马谡为副将拒箕谷,牵制曹真主力。自率三十万大军攻祁山,三郡叛魏应亮,关中响震。曹叡命张郃拒亮,亮使定军山降将姜维与郃战于街亭,张郃久攻不下。后曹真强攻赵云军,赵云死战,坚守箕谷,马谡、邓芝当场战死忠勇殉国。……既克张郃,曹真溃逃,曹叡弃守长安,迁都邺城。十月,司马懿击退孙权,回援曹真。而后三年,丞相所到之处,无不望风而降,皆箪食壶浆,以迎汉军。尽收豫、徐、兖、并之地,建兴十年春,司马懿父子三人死于诸葛武侯火计,同年,孙权上表称臣,至此四海清平,大汉一统。而后诸葛亮荐蒋琬为丞相,姜维为大将军,自回隆中归隐,后主挽留再三,皆不受。魏延亦辞官相随,侍奉左右。后主时有不决之事,便往隆中拜访相父,均未得面,童子答曰外出云游,遗数锦囊,拆而视之,皆治国之良策也。", }, - characterTitle:{ - }, - perfectPair:{}, - card:{ - xumou_jsrg:{ - type:'special_delay', - allowDuplicate:true, - blankCard:true, - fullimage:true, - wuxieable:false, - effect:function(){ - 'step 0' - var card=get.autoViewAs(event.cards[0]); - card.storage.xumou_jsrg=true; - player.chooseUseTarget(card,event.cards,`蓄谋:是否使用${get.translation(card)}?`,`请选择要使用的目标。若不使用此牌,则判定区内的所有“蓄谋”牌都将被置入弃牌堆。`); - 'step 1' - if(!result.bool){ - var cards=player.getCards('j',card=>{ - return (card.viewAs||card.name)=='xumou_jsrg'; + characterTitle: {}, + perfectPair: {}, + card: { + xumou_jsrg: { + type: "special_delay", + allowDuplicate: true, + blankCard: true, + fullimage: true, + wuxieable: false, + effect: function () { + "step 0"; + var card = get.autoViewAs(event.cards[0]); + card.storage.xumou_jsrg = true; + player.chooseUseTarget( + card, + event.cards, + `蓄谋:是否使用${get.translation(card)}?`, + `请选择要使用的目标。若不使用此牌,则判定区内的所有“蓄谋”牌都将被置入弃牌堆。` + ); + ("step 1"); + if (!result.bool) { + var cards = player.getCards("j", (card) => { + return (card.viewAs || card.name) == "xumou_jsrg"; }); - if(cards.length>0) player.loseToDiscardpile(cards); - } - else{ - player.addTempSkill('xumou_jsrg_temp','phaseChange'); - player.markAuto('xumou_jsrg_temp',[event.cards[0].name]) + if (cards.length > 0) player.loseToDiscardpile(cards); + } else { + player.addTempSkill("xumou_jsrg_temp", "phaseChange"); + player.markAuto("xumou_jsrg_temp", [event.cards[0].name]); } }, }, - ying:{ - audio:true, - fullskin:true, - type:'basic', - enable:false, - destroy:'discardPile', - getYing:function(count){ - var cards=[]; - if(typeof count!='number') count=1; - while(count--){ - let card=game.createCard('ying','spade',1); + ying: { + audio: true, + fullskin: true, + type: "basic", + enable: false, + destroy: "discardPile", + getYing: function (count) { + var cards = []; + if (typeof count != "number") count = 1; + while (count--) { + let card = game.createCard("ying", "spade", 1); cards.push(card); } return cards; }, - ai:{ - basic:{ - useful:0, - value:0, + ai: { + basic: { + useful: 0, + value: 0, }, }, }, }, - characterFilter:{ - jsrg_xushao:function(mode){ - return mode!='guozhan'; + characterFilter: { + jsrg_xushao: function (mode) { + return mode != "guozhan"; }, }, - skill:{ + skill: { //江山如故·合 //蓄谋临时禁用 - xumou_jsrg_temp:{ - charlotte:true, - onremove:true, - mod:{ - cardEnabled(card,player){ - if(!card.storage||!card.storage.xumou_jsrg) return; - if(player.getStorage('xumou_jsrg_temp').includes(get.name(card,false))) return false; + xumou_jsrg_temp: { + charlotte: true, + onremove: true, + mod: { + cardEnabled(card, player) { + if (!card.storage || !card.storage.xumou_jsrg) return; + if (player.getStorage("xumou_jsrg_temp").includes(get.name(card, false))) + return false; }, }, }, //404诸葛亮 - jsrgwentian:{ - audio:2, - trigger:{ - player:['phaseZhunbeiBegin','phaseJudgeBegin','phaseDrawBegin','phaseUseBegin','phaseDiscardBegin','phaseJieshuBegin'], + jsrgwentian: { + audio: 2, + trigger: { + player: [ + "phaseZhunbeiBegin", + "phaseJudgeBegin", + "phaseDrawBegin", + "phaseUseBegin", + "phaseDiscardBegin", + "phaseJieshuBegin", + ], }, - usable:1, - prompt2:'观看牌堆顶的五张牌,将其中一张交给其他角色,并将其余牌置于牌堆顶或牌堆底', - group:'jsrgwentian_viewas', - async content(event,trigger,player){ - const cards=get.cards(5); + usable: 1, + prompt2: "观看牌堆顶的五张牌,将其中一张交给其他角色,并将其余牌置于牌堆顶或牌堆底", + group: "jsrgwentian_viewas", + async content(event, trigger, player) { + const cards = get.cards(5); game.cardsGotoOrdering(cards); - const {result}=await player.chooseButton([ - '问天:将一张牌交给一名其他角色', - cards - ],true); - if(result.bool){ - const {result:result2}=await player.chooseTarget(`将${get.translation(result.links)}交给一名其他角色`,lib.filter.notMe,true).set('ai',target=>{ - return get.attitude(get.player(),target); - }); - if(result2.bool){ + const { result } = await player.chooseButton( + ["问天:将一张牌交给一名其他角色", cards], + true + ); + if (result.bool) { + const { result: result2 } = await player + .chooseTarget( + `将${get.translation(result.links)}交给一名其他角色`, + lib.filter.notMe, + true + ) + .set("ai", (target) => { + return get.attitude(get.player(), target); + }); + if (result2.bool) { cards.removeArray(result.links); - const target=result2.targets[0]; - player.line(target,'green'); - await target.gain(result.links,'gain2').set('giver',player); + const target = result2.targets[0]; + player.line(target, "green"); + await target.gain(result.links, "gain2").set("giver", player); } } - const next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards.filterInD()], - ['牌堆底'], - ]); - next.set('prompt','问天:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=list=>{ - const cards=list[0][1],player=_status.event.player; - const top=[]; - const judges=player.getCards('j'); - let stopped=false; - if(!player.hasWuxie()){ - for(let i=0;ijudge(b)-judge(a)); - if(judge(cards[0])<0){ - stopped=true;break; - } - else{ + const next = player.chooseToMove(); + next.set("list", [["牌堆顶", cards.filterInD()], ["牌堆底"]]); + next.set("prompt", "问天:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = (list) => { + const cards = list[0][1], + player = _status.event.player; + const top = []; + const judges = player.getCards("j"); + let stopped = false; + if (!player.hasWuxie()) { + for (let i = 0; i < judges.length; i++) { + const judge = get.judge(judges[i]); + cards.sort((a, b) => judge(b) - judge(a)); + if (judge(cards[0]) < 0) { + stopped = true; + break; + } else { top.unshift(cards.shift()); } } } let bottom; - if(!stopped){ - cards.sort((a,b)=>get.value(b,player)-get.value(a,player)); - while(cards.length){ - if(get.value(cards[0],player)<=5) break; + if (!stopped) { + cards.sort((a, b) => get.value(b, player) - get.value(a, player)); + while (cards.length) { + if (get.value(cards[0], player) <= 5) break; top.unshift(cards.shift()); } } - bottom=cards; - return [top,bottom]; - } - const {result:{moved}}=await next; - const top=moved[0]; - const bottom=moved[1]; + bottom = cards; + return [top, bottom]; + }; + const { + result: { moved }, + } = await next; + const top = moved[0]; + const bottom = moved[1]; top.reverse(); - game.cardsGotoPile( - top.concat(bottom), - ['top_cards',top], - (event,card)=>{ - if(event.top_cards.includes(card)) return ui.cardPile.firstChild; - return null; - } - ); - player.popup(get.cnNumber(top.length)+'上'+get.cnNumber(bottom.length)+'下'); - game.log(player,'将'+get.cnNumber(top.length)+'张牌置于牌堆顶'); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); game.asyncDelayx(); }, - subSkill:{ - viewas:{ - audio:'jsrgwentian', - enable:'chooseToUse', - filter:function(event,player){ - for(const name of ['wuxie','huogong']){ - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)) return true; + subSkill: { + viewas: { + audio: "jsrgwentian", + enable: "chooseToUse", + filter: function (event, player) { + for (const name of ["wuxie", "huogong"]) { + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) + return true; } return false; }, - hiddenCard:function(player,name){ - if(player.isTempBanned('jsrgwentian')) return false; - return name=='wuxie'; + hiddenCard: function (player, name) { + if (player.isTempBanned("jsrgwentian")) return false; + return name == "wuxie"; }, - viewAs:function(cards,player){ - const event=get.event(),filter=event._backup.filterCard; - for(const name of ['wuxie','huogong']){ - if(filter(get.autoViewAs({name},'unsure'),player,event)) return {name}; + viewAs: function (cards, player) { + const event = get.event(), + filter = event._backup.filterCard; + for (const name of ["wuxie", "huogong"]) { + if (filter(get.autoViewAs({ name }, "unsure"), player, event)) + return { name }; } return null; }, - filterCard:()=>false, - selectCard:-1, - prompt:function(){ - const player=get.player(); - const event=get.event(),filter=event._backup.filterCard; - let str='将牌堆顶的牌当【'; - for(const name of ['wuxie','huogong']){ - if(filter({name},player,event)){ - str+=get.translation(name); break; + filterCard: () => false, + selectCard: -1, + prompt: function () { + const player = get.player(); + const event = get.event(), + filter = event._backup.filterCard; + let str = "将牌堆顶的牌当【"; + for (const name of ["wuxie", "huogong"]) { + if (filter({ name }, player, event)) { + str += get.translation(name); + break; } } - str+='】使用'; + str += "】使用"; return str; }, - precontent(){ - player.logSkill('jsrgwentian'); - const cards=get.cards(); - event.result.cards=cards; + precontent() { + player.logSkill("jsrgwentian"); + const cards = get.cards(); + event.result.cards = cards; delete event.result.skill; game.cardsGotoOrdering(cards); - const color=event.result.card.name=='wuxie'?'black':'red'; - if(get.color(cards,false)!=color){ - player.tempBanSkill('jsrgwentian','roundStart'); + const color = event.result.card.name == "wuxie" ? "black" : "red"; + if (get.color(cards, false) != color) { + player.tempBanSkill("jsrgwentian", "roundStart"); } - } - } - } - }, - jsrgchushi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter(event,player){ - const zhu=get.zhu(player); - if(!zhu||!zhu.isZhu2()||!zhu.countCards('h')) return false; - return !player.isZhu2()&&player.countCards('h'); + }, + }, }, - async content(event,trigger,player){ - player.chooseToDebate(game.filterPlayer(current=>{ - return (current==player||current.isZhu2())&¤t.countCards('h'); - })).set('callback',async event=>{ - const result=event.debateResult; - if(result.bool&&result.opinion){ - const {opinion,targets}=result; - targets.sortBySeat(); - if(opinion=='red'){ - do{ - for(const current of targets){ - await current.draw(); - } + }, + jsrgchushi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + const zhu = get.zhu(player); + if (!zhu || !zhu.isZhu2() || !zhu.countCards("h")) return false; + return !player.isZhu2() && player.countCards("h"); + }, + async content(event, trigger, player) { + player + .chooseToDebate( + game.filterPlayer((current) => { + return (current == player || current.isZhu2()) && current.countCards("h"); + }) + ) + .set("callback", async (event) => { + const result = event.debateResult; + if (result.bool && result.opinion) { + const { opinion, targets } = result; + targets.sortBySeat(); + if (opinion == "red") { + do { + for (const current of targets) { + await current.draw(); + } + } while ( + targets + .map((current) => { + return current.countCards("h"); + }) + .reduce((p, c) => { + return p + c; + }, 0) < 7 + ); + } else { + player.addMark("jsrgchushi_add", 1, false); + player.addTempSkill("jsrgchushi_add", "roundStart"); } - while(targets.map(current=>{ - return current.countCards('h'); - }).reduce((p,c)=>{ - return p+c; - },0)<7); } - else{ - player.addMark('jsrgchushi_add',1,false); - player.addTempSkill('jsrgchushi_add','roundStart'); - } - } - }) + }); }, - subSkill:{ - add:{ - audio:'jsrgchushi', - trigger:{source:'damageBegin1'}, - filter:function(event){ - return event.hasNature('linked'); + subSkill: { + add: { + audio: "jsrgchushi", + trigger: { source: "damageBegin1" }, + filter: function (event) { + return event.hasNature("linked"); }, - forced:true, - charlotte:true, - onremove:true, - async content(_,trigger,player){ - trigger.num+=player.countMark('jsrgchushi_add'); + forced: true, + charlotte: true, + onremove: true, + async content(_, trigger, player) { + trigger.num += player.countMark("jsrgchushi_add"); }, - ai:{ - damageBonus:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='damageBonus') return arg&&arg.card&&game.hasNature(arg.card,'linked'); - } + ai: { + damageBonus: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "damageBonus") + return arg && arg.card && game.hasNature(arg.card, "linked"); + }, }, - intro:{ - content:'造成的属性伤害+#', - } - } - } + intro: { + content: "造成的属性伤害+#", + }, + }, + }, }, - jsrgyinlve:{ - audio:2, - trigger:{ - global:'damageBegin4', + jsrgyinlve: { + audio: 2, + trigger: { + global: "damageBegin4", }, - filter:function(event,player){ - return event.player.isIn()&&['fire','thunder'].some(n=>!player.hasSkill(`jsrgyinlve_${n}`)&&event.hasNature(n)); + filter: function (event, player) { + return ( + event.player.isIn() && + ["fire", "thunder"].some( + (n) => !player.hasSkill(`jsrgyinlve_${n}`) && event.hasNature(n) + ) + ); }, - check:function(event,player){ - if(get.damageEffect(event.player,event.source,player,get.natureList(event.nature))<-5) return true; + check: function (event, player) { + if ( + get.damageEffect(event.player, event.source, player, get.natureList(event.nature)) < + -5 + ) + return true; return false; }, - logTarget:'player', - async content(event,trigger,player){ + logTarget: "player", + async content(event, trigger, player) { trigger.cancel(); - const natures=['fire','thunder']; + const natures = ["fire", "thunder"]; let index; - if(natures.every(n=>!player.hasSkill(`jsrgyinlve_${n}`)&&trigger.hasNature(n))){ - const {result}=await player.chooseControl(['摸牌阶段','弃牌阶段']).set('prompt','请选择要新回合内仅有的阶段'); - index=result.index; - } - else index=[0,1].find(i=>!player.hasSkill(`jsrgyinlve_${natures[i]}`)&&trigger.hasNature(natures[i])); - player.addTempSkill(`jsrgyinlve_${natures[index]}`,'roundStart'); - player.insertPhase().set('phaseList',[['phaseDraw','phaseDiscard'][index]]); + if (natures.every((n) => !player.hasSkill(`jsrgyinlve_${n}`) && trigger.hasNature(n))) { + const { result } = await player + .chooseControl(["摸牌阶段", "弃牌阶段"]) + .set("prompt", "请选择要新回合内仅有的阶段"); + index = result.index; + } else + index = [0, 1].find( + (i) => + !player.hasSkill(`jsrgyinlve_${natures[i]}`) && trigger.hasNature(natures[i]) + ); + player.addTempSkill(`jsrgyinlve_${natures[index]}`, "roundStart"); + player.insertPhase().set("phaseList", [["phaseDraw", "phaseDiscard"][index]]); + }, + subSkill: { + fire: { charlotte: true }, + thunder: { charlotte: true }, }, - subSkill:{ - fire:{charlotte:true}, - thunder:{charlotte:true}, - } }, //姜维 - jsrgjinfa:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:true, - position:'h', - discard:false, - lose:false, - delay:false, - check:function(){ - return 1+Math.random(); + jsrgjinfa: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + check: function () { + return 1 + Math.random(); }, - async content(event,trigger,player){ + async content(event, trigger, player) { await player.showCards(event.cards); - player.chooseToDebate(game.filterPlayer(current=>{ - return current.maxHp<=player.maxHp; - })).set('callback',async (event)=>{ - const result=event.debateResult; - if(result.bool&&result.opinion){ - const {cards:fixedCards}=event.getParent('jsrgjinfa'); - const color=get.color(fixedCards); - const {opinion,targets}=result; - if(opinion==color){ - const {result}=await player.chooseTarget('是否令至多两名参与议事的角色将手牌摸至体力上限?',[1,2],(card,player,target)=>{ - return get.event('targets').includes(target); - }).set('targets',targets).set('ai',target=>{ - const player=get.player(); - const att=get.attitude(player,target); - if(att<=0) return -1; - return att*Math.sqrt(Math.max(0.1,target.maxHp-target.countCards('h'))); - }); - if(result.bool){ - const targets=result.targets; - targets.sortBySeat(); - player.line(targets,'green'); - for(const current of targets){ - if(current.countCards('h') { + return current.maxHp <= player.maxHp; + }) + ) + .set("callback", async (event) => { + const result = event.debateResult; + if (result.bool && result.opinion) { + const { cards: fixedCards } = event.getParent("jsrgjinfa"); + const color = get.color(fixedCards); + const { opinion, targets } = result; + if (opinion == color) { + const { result } = await player + .chooseTarget( + "是否令至多两名参与议事的角色将手牌摸至体力上限?", + [1, 2], + (card, player, target) => { + return get.event("targets").includes(target); + } + ) + .set("targets", targets) + .set("ai", (target) => { + const player = get.player(); + const att = get.attitude(player, target); + if (att <= 0) return -1; + return ( + att * + Math.sqrt( + Math.max(0.1, target.maxHp - target.countCards("h")) + ) + ); + }); + if (result.bool) { + const targets = result.targets; + targets.sortBySeat(); + player.line(targets, "green"); + for (const current of targets) { + if (current.countCards("h") < current.maxHp) + await current.drawTo(current.maxHp); + } } + } else { + await player.gain(lib.card.ying.getYing(2), "gain2"); } } - else{ - await player.gain(lib.card.ying.getYing(2),'gain2'); + const { red, black } = result; + if ( + (red.length == 1 && red[0][0] == player) || + (black.length == 1 && black[0][0] == player) + ) { + const list = lib.group.slice(); + list.remove(player.group); + list.push("cancel2"); + const { + result: { control }, + } = await player + .chooseControl(list) + .set("prompt", "是否变更势力?") + .set("ai", () => { + if (!get.event("change")) return "cancel2"; + const controls = get.event("controls"); + const groups = ["wei", "shu"].filter((g) => controls.includes(g)); + if (groups.length) return groups.randomGet(); + return controls.randomGet(); + }) + .set( + "change", + ["wei", "shu"].includes(player.group) ? Math.random() < 0.5 : true + ); + if (control != "cancel2") { + player.popup(control + "2", get.groupnature(control, "raw")); + player.changeGroup(control); + } } - } - const {red,black}=result; - if(red.length==1&&red[0][0]==player||black.length==1&&black[0][0]==player){ - const list=lib.group.slice(); - list.remove(player.group); - list.push('cancel2'); - const {result:{control}}=await player.chooseControl(list).set('prompt','是否变更势力?').set('ai',()=>{ - if(!get.event('change')) return 'cancel2'; - const controls=get.event('controls'); - const groups=['wei','shu'].filter(g=>controls.includes(g)); - if(groups.length) return groups.randomGet(); - return controls.randomGet(); - }).set('change',['wei','shu'].includes(player.group)?(Math.random()<0.5):true); - if(control!='cancel2'){ - player.popup(control+'2',get.groupnature(control,'raw')); - player.changeGroup(control); - } - } - }); + }); }, - ai:{ - order:function(item,player){ - if(player.countCards('h')==1) return 10; + ai: { + order: function (item, player) { + if (player.countCards("h") == 1) return 10; return 1; }, - result:{ - player:1, + result: { + player: 1, }, - } + }, }, - jsrgfumou:{ - audio:2, - trigger:{global:'chooseToDebateAfter'}, - groupSkill:true, - forced:true, - locked:false, - filter:function(event,player){ - if(player.group!='wei') return false; - if(!event.targets.includes(player)) return false; - if(event.red.some(i=>i[0]==player)) return event.black.length; - if(event.black.some(i=>i[0]==player)) return event.red.length; + jsrgfumou: { + audio: 2, + trigger: { global: "chooseToDebateAfter" }, + groupSkill: true, + forced: true, + locked: false, + filter: function (event, player) { + if (player.group != "wei") return false; + if (!event.targets.includes(player)) return false; + if (event.red.some((i) => i[0] == player)) return event.black.length; + if (event.black.some((i) => i[0] == player)) return event.red.length; return false; }, - async content(event,trigger,player){ - const targets=[]; - if(trigger.red.some(i=>i[0]==player)) targets.addArray(trigger.black.map(i=>i[0])); - if(trigger.black.some(i=>i[0]==player)) targets.addArray(trigger.red.map(i=>i[0])); - player.line(targets,'thunder'); - targets.forEach(target=>{ - target.addTempSkill('jsrgfumou_forbid'); - target.markAuto('jsrgfumou_forbid',['red','black'].filter(color=>{ - return trigger[color].some(i=>i[0]==target); - })) + async content(event, trigger, player) { + const targets = []; + if (trigger.red.some((i) => i[0] == player)) + targets.addArray(trigger.black.map((i) => i[0])); + if (trigger.black.some((i) => i[0] == player)) + targets.addArray(trigger.red.map((i) => i[0])); + player.line(targets, "thunder"); + targets.forEach((target) => { + target.addTempSkill("jsrgfumou_forbid"); + target.markAuto( + "jsrgfumou_forbid", + ["red", "black"].filter((color) => { + return trigger[color].some((i) => i[0] == target); + }) + ); }); - game.broadcastAll(targets=>{ - lib.skill.jsrgfumou_backup.targets=targets; - },targets); - const next=player.chooseToUse(); - next.set('openskilldialog',`是否将一张【影】当【出其不意】对一名与你意见不同的角色使用?`); - next.set('norestore',true); - next.set('_backupevent','jsrgfumou_backup'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + game.broadcastAll((targets) => { + lib.skill.jsrgfumou_backup.targets = targets; + }, targets); + const next = player.chooseToUse(); + next.set( + "openskilldialog", + `是否将一张【影】当【出其不意】对一名与你意见不同的角色使用?` + ); + next.set("norestore", true); + next.set("_backupevent", "jsrgfumou_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('jsrgfumou_backup'); + next.backup("jsrgfumou_backup"); }, - subSkill:{ - backup:{ - filterCard:function(card){ - return get.itemtype(card)=='card'&&get.name(card)=='ying'; + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card" && get.name(card) == "ying"; }, - viewAs:{ - name:'chuqibuyi', + viewAs: { + name: "chuqibuyi", }, - selectCard:1, - position:'hs', - log:false, - filterTarget:function(card,player,target){ - const targets=lib.skill.jsrgfumou_backup.targets; - if(!targets.includes(target)||ui.selected.targets.containsSome(targets)) return false; - return lib.filter.targetEnabled.apply(this,arguments); + selectCard: 1, + position: "hs", + log: false, + filterTarget: function (card, player, target) { + const targets = lib.skill.jsrgfumou_backup.targets; + if (!targets.includes(target) || ui.selected.targets.containsSome(targets)) + return false; + return lib.filter.targetEnabled.apply(this, arguments); }, - ai1:function(card){ - return 6-get.value(card); + ai1: function (card) { + return 6 - get.value(card); }, - precontent:function(){ + precontent: function () { delete event.result.skill; }, }, - forbid:{ - charlotte:true, - onremove:true, - mod:{ - cardEnabled:function(card,player){ + forbid: { + charlotte: true, + onremove: true, + mod: { + cardEnabled: function (card, player) { const color = get.color(card); - if (color != 'unsure' && player.getStorage('jsrgfumou_forbid').includes(color)) return false; + if ( + color != "unsure" && + player.getStorage("jsrgfumou_forbid").includes(color) + ) + return false; }, - cardRespondable:function(card,player){ + cardRespondable: function (card, player) { const color = get.color(card); - if (color != 'unsure' && player.getStorage('jsrgfumou_forbid').includes(color)) return false; + if ( + color != "unsure" && + player.getStorage("jsrgfumou_forbid").includes(color) + ) + return false; }, - cardSavable:function(card,player){ + cardSavable: function (card, player) { const color = get.color(card); - if (color != 'unsure' && player.getStorage('jsrgfumou_forbid').includes(color)) return false; + if ( + color != "unsure" && + player.getStorage("jsrgfumou_forbid").includes(color) + ) + return false; }, }, - mark:true, - intro:{ - content:'本回合不能使用或打出$牌', + mark: true, + intro: { + content: "本回合不能使用或打出$牌", }, - } - } - }, - jsrgxuanfeng:{ - audio:2, - enable:'chooseToUse', - filterCard:{name:'ying'}, - position:'hs', - groupSkill:true, - locked:false, - viewAs:{ - name:'sha', - nature:'stab', - storage:{jsrgxuanfeng:true}, - }, - viewAsFilter(player){ - if(player.group!='shu') return false; - if(!player.countCards('hs','ying')) return false; - }, - prompt:'将一张【影】当无距离和次数限制的刺【杀】使用', - check(card){ - const val=get.value(card); - return 5-val; - }, - mod:{ - targetInRange:function(card,player,target){ - if(card.storage&&card.storage.jsrgxuanfeng) return true; }, - cardUsable:function(card){ - if(card.storage&&card.storage.jsrgxuanfeng) return Infinity; - } }, - ai:{ - order:2, - } + }, + jsrgxuanfeng: { + audio: 2, + enable: "chooseToUse", + filterCard: { name: "ying" }, + position: "hs", + groupSkill: true, + locked: false, + viewAs: { + name: "sha", + nature: "stab", + storage: { jsrgxuanfeng: true }, + }, + viewAsFilter(player) { + if (player.group != "shu") return false; + if (!player.countCards("hs", "ying")) return false; + }, + prompt: "将一张【影】当无距离和次数限制的刺【杀】使用", + check(card) { + const val = get.value(card); + return 5 - val; + }, + mod: { + targetInRange: function (card, player, target) { + if (card.storage && card.storage.jsrgxuanfeng) return true; + }, + cardUsable: function (card) { + if (card.storage && card.storage.jsrgxuanfeng) return Infinity; + }, + }, + ai: { + order: 2, + }, }, //陆逊 - jsrgyoujin:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return game.hasPlayer(current=>{ + jsrgyoujin: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer((current) => { return player.canCompare(current); }); }, - direct:true, - async content(event,trigger,player){ - const {result}=await player.chooseTarget(get.prompt2('jsrgyoujin'),(card,player,target)=>{ - return player.canCompare(target); - }).set('ai',target=>{ - if(!get.event('goon')) return 0; - return -get.attitude(get.player(),target); - }).set('goon',player.countCards('hs',['shan','caochuan'])||player.getHp()>=3); - if(!result.bool) return; - const {targets}=result,target=targets[0]; - player.logSkill('jsrgyoujin',target); - const {result:result2}=await player.chooseToCompare(target).set('small',true); - player.addTempSkill('jsrgyoujin_forbid'); - player.markAuto('jsrgyoujin_forbid',[result2.num1]); - target.addTempSkill('jsrgyoujin_forbid'); - target.markAuto('jsrgyoujin_forbid',[result2.num2]); - if(!result2.tie){ - const targets=[target,player]; - if(result2.bool) targets.reverse(); - const sha=new lib.element.VCard({name:'sha'}); - if(targets[0].canUse(sha,targets[1],false)){ - targets[0].useCard(sha,targets[1],false); + direct: true, + async content(event, trigger, player) { + const { result } = await player + .chooseTarget(get.prompt2("jsrgyoujin"), (card, player, target) => { + return player.canCompare(target); + }) + .set("ai", (target) => { + if (!get.event("goon")) return 0; + return -get.attitude(get.player(), target); + }) + .set("goon", player.countCards("hs", ["shan", "caochuan"]) || player.getHp() >= 3); + if (!result.bool) return; + const { targets } = result, + target = targets[0]; + player.logSkill("jsrgyoujin", target); + const { result: result2 } = await player.chooseToCompare(target).set("small", true); + player.addTempSkill("jsrgyoujin_forbid"); + player.markAuto("jsrgyoujin_forbid", [result2.num1]); + target.addTempSkill("jsrgyoujin_forbid"); + target.markAuto("jsrgyoujin_forbid", [result2.num2]); + if (!result2.tie) { + const targets = [target, player]; + if (result2.bool) targets.reverse(); + const sha = new lib.element.VCard({ name: "sha" }); + if (targets[0].canUse(sha, targets[1], false)) { + targets[0].useCard(sha, targets[1], false); } } }, - subSkill:{ - forbid:{ - charlotte:true, - onremove:true, - mod:{ - cardEnabled2:function(card,player){ - if(get.itemtype(card)=='card'&&player.getStorage('jsrgyoujin_forbid').some(num=>num>get.number(card))) return false; + subSkill: { + forbid: { + charlotte: true, + onremove: true, + mod: { + cardEnabled2: function (card, player) { + if ( + get.itemtype(card) == "card" && + player + .getStorage("jsrgyoujin_forbid") + .some((num) => num > get.number(card)) + ) + return false; }, }, - mark:true, - intro:{ - content:'本回合不能使用或打出点数小于$的手牌', + mark: true, + intro: { + content: "本回合不能使用或打出点数小于$的手牌", }, - } - } + }, + }, }, - jsrgdailao:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return !player.hasCard(card=>{ - return player.hasUseTarget(card,true,true); + jsrgdailao: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return !player.hasCard((card) => { + return player.hasUseTarget(card, true, true); }); }, - async content(event,trigger,player){ + async content(event, trigger, player) { await player.showHandcards(); await player.draw(2); - const evt=event.getParent('phase'); - if(evt){ + const evt = event.getParent("phase"); + if (evt) { game.resetSkills(); - _status.event=evt; + _status.event = evt; _status.event.finish(); _status.event.untrigger(true); } }, - ai:{ - order:0.0001, - result:{player:1}, - } - }, - jsrgzhubei:{ - audio:2, - trigger:{source:'damageBegin1'}, - forced:true, - init(player){ - player.addSkill('jsrgzhubei_record'); + ai: { + order: 0.0001, + result: { player: 1 }, }, - filter(event,player){ - return event.player.hasHistory('damage',evt=>{ - return evt.source==player; + }, + jsrgzhubei: { + audio: 2, + trigger: { source: "damageBegin1" }, + forced: true, + init(player) { + player.addSkill("jsrgzhubei_record"); + }, + filter(event, player) { + return event.player.hasHistory("damage", (evt) => { + return evt.source == player; }); }, - logTarget:'player', - async content(event,trigger,player){ + logTarget: "player", + async content(event, trigger, player) { trigger.num++; }, - subSkill:{ - record:{ - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + record: { + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - charlotte:true, - silent:true, - filter(event,player){ - return game.hasPlayer(current=>{ - if(current.countCards('h')) return false; - const evt=event.getl(current); - return evt&&evt.hs&&evt.hs.length; + charlotte: true, + silent: true, + filter(event, player) { + return game.hasPlayer((current) => { + if (current.countCards("h")) return false; + const evt = event.getl(current); + return evt && evt.hs && evt.hs.length; }); }, - async content(event,trigger,player){ - game.countPlayer(current=>{ - if(current.countCards('h')) return false; - const evt=trigger.getl(current); - if(evt&&evt.hs&&evt.hs.length) current.addTempSkill('jsrgzhubei_lost'); + async content(event, trigger, player) { + game.countPlayer((current) => { + if (current.countCards("h")) return false; + const evt = trigger.getl(current); + if (evt && evt.hs && evt.hs.length) current.addTempSkill("jsrgzhubei_lost"); }); }, }, - lost:{charlotte:true}, + lost: { charlotte: true }, }, - mod:{ - cardUsableTarget(card,player,target){ - if(target.hasSkill('jsrgzhubei_lost')) return true; + mod: { + cardUsableTarget(card, player, target) { + if (target.hasSkill("jsrgzhubei_lost")) return true; }, }, }, //赵云 - jsrglonglin:{ - audio:2, - trigger:{ - global:'useCardToPlayered', + jsrglonglin: { + audio: 2, + trigger: { + global: "useCardToPlayered", }, - usable:1, - filter(event,player){ - if(event.player==player) return false; - if(event.card.name!='sha') return false; - return event.isFirstTarget&&event.player.isPhaseUsing(); + usable: 1, + filter(event, player) { + if (event.player == player) return false; + if (event.card.name != "sha") return false; + return event.isFirstTarget && event.player.isPhaseUsing(); }, - direct:true, - async content(event,trigger,player){ - const juedou=new lib.element.VCard({name:'juedou',storage:{jsrglonglin:true}}); - const {result}=await player.chooseToDiscard(get.prompt2('jsrglonglin'),'he').set('ai',card=>{ - if(get.event('goon')) return 5-get.value(card); - return 0; - }).set('goon',(trigger.player.canUse(juedou,player)?Math.max(0,get.effect(player,juedou,trigger.player,trigger.player)):0)+trigger.targets.map(target=>{ - return get.effect(target,trigger.card,trigger.player,player); - }).reduce((p,c)=>{ - return p+c; - },0)<-4).set('logSkill',['jsrglonglin',trigger.player]); - if(result.bool){ + direct: true, + async content(event, trigger, player) { + const juedou = new lib.element.VCard({ name: "juedou", storage: { jsrglonglin: true } }); + const { result } = await player + .chooseToDiscard(get.prompt2("jsrglonglin"), "he") + .set("ai", (card) => { + if (get.event("goon")) return 5 - get.value(card); + return 0; + }) + .set( + "goon", + (trigger.player.canUse(juedou, player) + ? Math.max(0, get.effect(player, juedou, trigger.player, trigger.player)) + : 0) + + trigger.targets + .map((target) => { + return get.effect(target, trigger.card, trigger.player, player); + }) + .reduce((p, c) => { + return p + c; + }, 0) < + -4 + ) + .set("logSkill", ["jsrglonglin", trigger.player]); + if (result.bool) { trigger.excluded.addArray(trigger.targets); game.asyncDelayx(); - if(trigger.player.canUse(juedou,player)){ - const {result}=await trigger.player.chooseBool(`是否视为对${get.translation(player)}使用一张【决斗】?`).set('choice',get.effect(player,juedou,trigger.player,trigger.player)>=0); - if(result.bool){ - player.addTempSkill('jsrglonglin_source'); - trigger.player.useCard(juedou,player); + if (trigger.player.canUse(juedou, player)) { + const { result } = await trigger.player + .chooseBool(`是否视为对${get.translation(player)}使用一张【决斗】?`) + .set( + "choice", + get.effect(player, juedou, trigger.player, trigger.player) >= 0 + ); + if (result.bool) { + player.addTempSkill("jsrglonglin_source"); + trigger.player.useCard(juedou, player); } } } }, - subSkill:{ - source:{ - trigger:{source:'damageSource'}, - charlotte:true, - forced:true, - popup:false, - filter(event,player){ - return event.card&&event.card.storage&&event.card.storage.jsrglonglin; + subSkill: { + source: { + trigger: { source: "damageSource" }, + charlotte: true, + forced: true, + popup: false, + filter(event, player) { + return event.card && event.card.storage && event.card.storage.jsrglonglin; }, - async content(event,trigger,player){ + async content(event, trigger, player) { player.line(trigger.player); - trigger.player.addTempSkill('jsrglonglin_forbid'); - } + trigger.player.addTempSkill("jsrglonglin_forbid"); + }, }, - forbid:{ - mod:{ - cardEnabled:function(card,player){ - if(!card.cards) return; - if(card.cards.some(cardx=>get.position(cardx)=='h')) return false; + forbid: { + mod: { + cardEnabled: function (card, player) { + if (!card.cards) return; + if (card.cards.some((cardx) => get.position(cardx) == "h")) return false; }, - cardSavable:function(card,player){ - if(!card.cards) return; - if(card.cards.some(cardx=>get.position(cardx)=='h')) return false; + cardSavable: function (card, player) { + if (!card.cards) return; + if (card.cards.some((cardx) => get.position(cardx) == "h")) return false; }, }, - charlotte:true, - mark:true, - intro:{ - content:'不能使用手牌', + charlotte: true, + mark: true, + intro: { + content: "不能使用手牌", }, }, }, }, - jsrgzhendan:{ - audio:2, - trigger:{ - player:'damageEnd', - global:'roundStart', + jsrgzhendan: { + audio: 2, + trigger: { + player: "damageEnd", + global: "roundStart", }, - filter(event,player){ - let count=0; - let roundCount=1+(event.name!='damage'); - const curLen=player.actionHistory.length; - for(let i=curLen-1;i>=0;i--){ - if(roundCount==1&&game.hasPlayer(current=>{ - const history=current.actionHistory[i]; - if(!history.isMe||history.isSkipped) return false; - return true; - })){ + filter(event, player) { + let count = 0; + let roundCount = 1 + (event.name != "damage"); + const curLen = player.actionHistory.length; + for (let i = curLen - 1; i >= 0; i--) { + if ( + roundCount == 1 && + game.hasPlayer((current) => { + const history = current.actionHistory[i]; + if (!history.isMe || history.isSkipped) return false; + return true; + }) + ) { count++; } - if(player.actionHistory[i].isRound) roundCount--; - if(roundCount<=0) break; + if (player.actionHistory[i].isRound) roundCount--; + if (roundCount <= 0) break; } - if(!player.storage.jsrgzhendan_mark&&count>0) return true; + if (!player.storage.jsrgzhendan_mark && count > 0) return true; return false; }, - forced:true, - locked:false, - group:'jsrgzhendan_viewas', - async content(event,trigger,player){ - let count=0; - let roundCount=1+(trigger.name!='damage'); - const curLen=player.actionHistory.length; - for(let i=curLen-1;i>=0;i--){ - if(roundCount==1&&game.hasPlayer(current=>{ - const history=current.actionHistory[i]; - if(!history.isMe||history.isSkipped) return false; - return true; - })){ + forced: true, + locked: false, + group: "jsrgzhendan_viewas", + async content(event, trigger, player) { + let count = 0; + let roundCount = 1 + (trigger.name != "damage"); + const curLen = player.actionHistory.length; + for (let i = curLen - 1; i >= 0; i--) { + if ( + roundCount == 1 && + game.hasPlayer((current) => { + const history = current.actionHistory[i]; + if (!history.isMe || history.isSkipped) return false; + return true; + }) + ) { count++; } - if(player.actionHistory[i].isRound) roundCount--; - if(roundCount<=0) break; + if (player.actionHistory[i].isRound) roundCount--; + if (roundCount <= 0) break; } - count=Math.min(5,count); + count = Math.min(5, count); await player.draw(count); - if(trigger.name=='damage'){ - player.tempBanSkill('jsrgzhendan','roundStart'); - player.storage.jsrgzhendan_mark=true; - player.when({global:'roundStart'}).assign({ - lastDo:true, - }).then(()=>{ - delete player.storage.jsrgzhendan_mark; - }); + if (trigger.name == "damage") { + player.tempBanSkill("jsrgzhendan", "roundStart"); + player.storage.jsrgzhendan_mark = true; + player + .when({ global: "roundStart" }) + .assign({ + lastDo: true, + }) + .then(() => { + delete player.storage.jsrgzhendan_mark; + }); } }, - subSkill:{ - viewas:{ - audio:'jsrgzhendan', - enable:['chooseToUse','chooseToRespond'], - filter(event,player){ - if(event.type=='wuxie') return false; - if(!_status.connectMode&&!player.countCards('hs',card=>{ - return get.type2(card)!='basic'; - })) return false; - return get.inpileVCardList(info=>{ - if(info[0]!='basic') return false; - return event.filterCard(get.autoViewAs({name:info[2],nature:info[3]},'unsure'),player,event); + subSkill: { + viewas: { + audio: "jsrgzhendan", + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + if (event.type == "wuxie") return false; + if ( + !_status.connectMode && + !player.countCards("hs", (card) => { + return get.type2(card) != "basic"; + }) + ) + return false; + return get.inpileVCardList((info) => { + if (info[0] != "basic") return false; + return event.filterCard( + get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), + player, + event + ); }).length; }, - chooseButton:{ - dialog(event,player){ - const vcards=get.inpileVCardList(info=>{ - if(info[0]!='basic') return false; - return event.filterCard(get.autoViewAs({name:info[2],nature:info[3]},'unsure'),player,event); + chooseButton: { + dialog(event, player) { + const vcards = get.inpileVCardList((info) => { + if (info[0] != "basic") return false; + return event.filterCard( + get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), + player, + event + ); }); - return ui.create.dialog('镇胆',[vcards,'vcard']); + return ui.create.dialog("镇胆", [vcards, "vcard"]); }, - check(button){ - if(get.event().getParent().type!='phase') return 1; - return get.player().getUseValue({name:button.link[2],nature:button.link[3]}); + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get + .player() + .getUseValue({ name: button.link[2], nature: button.link[3] }); }, - backup(links,player){ + backup(links, player) { return { - audio:'jsrgzhendan', - popname:true, - viewAs:{name:links[0][2],nature:links[0][3]}, - filterCard(card,player){ - return get.type2(card)!='basic'; + audio: "jsrgzhendan", + popname: true, + viewAs: { name: links[0][2], nature: links[0][3] }, + filterCard(card, player) { + return get.type2(card) != "basic"; }, - selectCard:1, - position:'hs', - } + selectCard: 1, + position: "hs", + }; }, - prompt(links,player){ - return '将一张非基本手牌当'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用或打出'; - } - }, - hiddenCard(player,name){ - return get.type(name)=='basic'&&player.countCards('hs')>0; - }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter(player){ - return player.countCards('hs')>0; + prompt(links, player) { + return ( + "将一张非基本手牌当" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用或打出" + ); }, - order:0.5, - result:{ - player(player){ - if(get.event().dying){ - return get.attitude(player,get.event().dying); + }, + hiddenCard(player, name) { + return get.type(name) == "basic" && player.countCards("hs") > 0; + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter(player) { + return player.countCards("hs") > 0; + }, + order: 0.5, + result: { + player(player) { + if (get.event().dying) { + return get.attitude(player, get.event().dying); } return 1; }, }, }, }, - viewas_backup:{}, - } + viewas_backup: {}, + }, }, //司马懿 - jsrgyingshi:{ - audio:2, - trigger:{player:'turnOverAfter'}, - async content(event,trigger,player){ - const number=(game.dead.length>2)?5:3; - const cards=get.bottomCards(number); + jsrgyingshi: { + audio: 2, + trigger: { player: "turnOverAfter" }, + async content(event, trigger, player) { + const number = game.dead.length > 2 ? 5 : 3; + const cards = get.bottomCards(number); game.cardsGotoOrdering(cards); - const next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶'], - ['牌堆底',cards.reverse()], - ]); - next.set('prompt','鹰眎:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=list=>{ - const cards=list[1][1],player=_status.event.player; - const top=[]; - const judges=player.getCards('j'); - let stopped=false; - if(!player.hasWuxie()){ - for(let i=0;ijudge(b)-judge(a)); - if(judge(cards[0])<0){ - stopped=true;break; - } - else{ + const next = player.chooseToMove(); + next.set("list", [["牌堆顶"], ["牌堆底", cards.reverse()]]); + next.set("prompt", "鹰眎:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = (list) => { + const cards = list[1][1], + player = _status.event.player; + const top = []; + const judges = player.getCards("j"); + let stopped = false; + if (!player.hasWuxie()) { + for (let i = 0; i < judges.length; i++) { + const judge = get.judge(judges[i]); + cards.sort((a, b) => judge(b) - judge(a)); + if (judge(cards[0]) < 0) { + stopped = true; + break; + } else { top.unshift(cards.shift()); } } } let bottom; - if(!stopped){ - cards.sort((a,b)=>get.value(b,player)-get.value(a,player)); - while(cards.length){ - if(get.value(cards[0],player)<=5) break; + if (!stopped) { + cards.sort((a, b) => get.value(b, player) - get.value(a, player)); + while (cards.length) { + if (get.value(cards[0], player) <= 5) break; top.unshift(cards.shift()); } } - bottom=cards; - return [top,bottom]; - } - const {result:{moved}}=await next; - const top=moved[0]; - const bottom=moved[1]; + bottom = cards; + return [top, bottom]; + }; + const { + result: { moved }, + } = await next; + const top = moved[0]; + const bottom = moved[1]; top.reverse(); - game.cardsGotoPile( - top.concat(bottom), - ['top_cards',top], - (event,card)=>{ - if(event.top_cards.includes(card)) return ui.cardPile.firstChild; - return null; - } - ); - player.popup(get.cnNumber(top.length)+'上'+get.cnNumber(bottom.length)+'下'); - game.log(player,'将'+get.cnNumber(top.length)+'张牌置于牌堆顶'); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); game.asyncDelayx(); }, }, - jsrgtuigu:{ - audio:2, - trigger:{player:'phaseBegin'}, - prompt2(event,player){ - const num=Math.floor(game.countPlayer()/2); - return `你翻面,令你本回合的手牌上限+${num},摸${get.cnNumber(num)}张牌,视为使用一张【解甲归田】(目标角色不能使用这些牌直到其下回合结束)。`; + jsrgtuigu: { + audio: 2, + trigger: { player: "phaseBegin" }, + prompt2(event, player) { + const num = Math.floor(game.countPlayer() / 2); + return `你翻面,令你本回合的手牌上限+${num},摸${get.cnNumber( + num + )}张牌,视为使用一张【解甲归田】(目标角色不能使用这些牌直到其下回合结束)。`; }, - group:['jsrgtuigu_insert','jsrgtuigu_recover'], - async content(event,trigger,player){ + group: ["jsrgtuigu_insert", "jsrgtuigu_recover"], + async content(event, trigger, player) { await player.turnOver(); - const num=Math.floor(game.countPlayer()/2); - player.addTempSkill('jsrgtuigu_handcard'); - player.addMark('jsrgtuigu_handcard',num,false); + const num = Math.floor(game.countPlayer() / 2); + player.addTempSkill("jsrgtuigu_handcard"); + player.addMark("jsrgtuigu_handcard", num, false); await player.draw(num); - const jiejia=new lib.element.VCard({name:'jiejia',storage:{jsrgtuigu:true}}); - if(player.hasUseTarget(jiejia)){ - player.addTempSkill('jsrgtuigu_block'); - player.chooseUseTarget(jiejia,true); + const jiejia = new lib.element.VCard({ name: "jiejia", storage: { jsrgtuigu: true } }); + if (player.hasUseTarget(jiejia)) { + player.addTempSkill("jsrgtuigu_block"); + player.chooseUseTarget(jiejia, true); } }, - subSkill:{ - insert:{ - audio:'jsrgtuigu', - trigger:{global:'roundStart'}, - filter(event,player){ - const curLen=player.actionHistory.length; - if(curLen<=2) return false; - for(let i=curLen-2;i>=0;i--){ - const history=player.actionHistory[i]; - if(history.isMe&&!history.isSkipped&&!history._jsrgtuigu) return false; - if(history.isRound) break; + subSkill: { + insert: { + audio: "jsrgtuigu", + trigger: { global: "roundStart" }, + filter(event, player) { + const curLen = player.actionHistory.length; + if (curLen <= 2) return false; + for (let i = curLen - 2; i >= 0; i--) { + const history = player.actionHistory[i]; + if (history.isMe && !history.isSkipped && !history._jsrgtuigu) return false; + if (history.isRound) break; } return true; }, - forced:true, - locked:false, - async content(event,trigger,player){ - const evt=trigger,evtx=player.insertPhase(); - player.when('phaseBeforeStart') - .filter(evtt=>evtt==evtx) - .then(()=>{ - game.players.slice().concat(game.dead).forEach(current=>{ - current.getHistory()._jsrgtuigu=true; - current.getStat()._jsrgtuigu=true; + forced: true, + locked: false, + async content(event, trigger, player) { + const evt = trigger, + evtx = player.insertPhase(); + player + .when("phaseBeforeStart") + .filter((evtt) => evtt == evtx) + .then(() => { + game.players + .slice() + .concat(game.dead) + .forEach((current) => { + current.getHistory()._jsrgtuigu = true; + current.getStat()._jsrgtuigu = true; + }); }); - }); - if(evt.player!=player&&!evt._finished){ + if (evt.player != player && !evt._finished) { evt.finish(); - evt._triggered=5; - const evtxx=evt.player.insertPhase(); + evt._triggered = 5; + const evtxx = evt.player.insertPhase(); delete evtxx.skill; } }, }, - recover:{ - audio:'jsrgtuigu', - trigger:{ - player:'loseAfter', - global:['gainAfter','equipAfter','addJudgeAfter','loseAsyncAfter','addToExpansionAfter'], + recover: { + audio: "jsrgtuigu", + trigger: { + player: "loseAfter", + global: [ + "gainAfter", + "equipAfter", + "addJudgeAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter(event,player){ - if(player.isHealthy()) return false; - const evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; + filter(event, player) { + if (player.isHealthy()) return false; + const evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; }, - forced:true, - locked:false, - async content(event,trigger,player){ + forced: true, + locked: false, + async content(event, trigger, player) { player.recover(); - } - }, - handcard:{ - markimage:'image/card/handcard.png', - intro:{ - content(storage,player){ - return '手牌上限+'+storage; - } - }, - onremove:true, - charlotte:true, - mod:{ - maxHandcard(player,num){ - return num+player.countMark('jsrgtuigu_handcard'); - } }, }, - block:{ - trigger:{global:'gainAfter'}, - filter(event,player){ - if(event.getParent().name!='jiejia') return false; - const card=event.getParent(2).card; - if(card&&card.storage&&card.storage.jsrgtuigu) return true; + handcard: { + markimage: "image/card/handcard.png", + intro: { + content(storage, player) { + return "手牌上限+" + storage; + }, + }, + onremove: true, + charlotte: true, + mod: { + maxHandcard(player, num) { + return num + player.countMark("jsrgtuigu_handcard"); + }, + }, + }, + block: { + trigger: { global: "gainAfter" }, + filter(event, player) { + if (event.getParent().name != "jiejia") return false; + const card = event.getParent(2).card; + if (card && card.storage && card.storage.jsrgtuigu) return true; return false; }, - charlotte:true, - forced:true, - silent:true, - content(){ - trigger.player.addGaintag(trigger.cards,'jsrgtuigu'); - trigger.player.addTempSkill('jsrgtuigu_blocked',{player:'phaseAfter'}); - } + charlotte: true, + forced: true, + silent: true, + content() { + trigger.player.addGaintag(trigger.cards, "jsrgtuigu"); + trigger.player.addTempSkill("jsrgtuigu_blocked", { player: "phaseAfter" }); + }, }, - blocked:{ - mod:{ - cardEnabled2(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('jsrgtuigu')) return false; + blocked: { + mod: { + cardEnabled2(card) { + if (get.itemtype(card) == "card" && card.hasGaintag("jsrgtuigu")) + return false; }, }, - charlotte:true, - forced:true, - popup:false, - onremove(player){ - player.removeGaintag('jsrgtuigu'); + charlotte: true, + forced: true, + popup: false, + onremove(player) { + player.removeGaintag("jsrgtuigu"); }, }, - } + }, }, //郭循 - jsrgeqian:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(!event.isFirstTarget||event.targets.length!=1||event.target==player) return false; - if(event.card.name=='sha') return true; - return event.getParent(3).name=='xumou_jsrg'; + jsrgeqian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget || event.targets.length != 1 || event.target == player) + return false; + if (event.card.name == "sha") return true; + return event.getParent(3).name == "xumou_jsrg"; }, - prompt2(event,player){ - return `令${get.translation(event.card)}不计入次数限制,且你获得${get.translation(event.target)}一张牌,然后其可以令你本回合至其的距离+2`; + prompt2(event, player) { + return `令${get.translation(event.card)}不计入次数限制,且你获得${get.translation( + event.target + )}一张牌,然后其可以令你本回合至其的距离+2`; }, - group:'jsrgeqian_prepare', - logTarget:'target', - async content(event,trigger,player){ - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(typeof stat[name]=='number') stat[name]--; + group: "jsrgeqian_prepare", + logTarget: "target", + async content(event, trigger, player) { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; } - await player.gainPlayerCard(trigger.target,'he',true); - const {result:{bool}}=await trigger.target.chooseBool(`是否令${get.translation(player)}至你的距离于本回合内+2?`).set('ai',()=>true); - if(bool){ - player.addTempSkill('jsrgeqian_distance'); - if(!player.storage.jsrgeqian_distance) player.storage.jsrgeqian_distance={}; - const id=trigger.target.playerid; - if(typeof player.storage.jsrgeqian_distance[id]!='number') player.storage.jsrgeqian_distance[id]=0; - player.storage.jsrgeqian_distance[id]+=2; - player.markSkill('jsrgeqian_distance'); + await player.gainPlayerCard(trigger.target, "he", true); + const { + result: { bool }, + } = await trigger.target + .chooseBool(`是否令${get.translation(player)}至你的距离于本回合内+2?`) + .set("ai", () => true); + if (bool) { + player.addTempSkill("jsrgeqian_distance"); + if (!player.storage.jsrgeqian_distance) player.storage.jsrgeqian_distance = {}; + const id = trigger.target.playerid; + if (typeof player.storage.jsrgeqian_distance[id] != "number") + player.storage.jsrgeqian_distance[id] = 0; + player.storage.jsrgeqian_distance[id] += 2; + player.markSkill("jsrgeqian_distance"); } }, - subSkill:{ - prepare:{ - audio:'jsrgeqian', - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return player.countCards('h'); + subSkill: { + prepare: { + audio: "jsrgeqian", + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.countCards("h"); }, - direct:true, - async content(event,trigger,player){ - while(player.countCards('h')>0){ - const {result:{bool,cards}}=await player.chooseCard(get.prompt('jsrgeqian'),'你可以蓄谋任意次').set('ai',card=>{ - const player=get.player(); - if(player.hasValueTarget(card)) return player.getUseValue(card); - return 0; - }); - if(!bool) break; - await player.addJudge({name:'xumou_jsrg'},cards); + direct: true, + async content(event, trigger, player) { + while (player.countCards("h") > 0) { + const { + result: { bool, cards }, + } = await player + .chooseCard(get.prompt("jsrgeqian"), "你可以蓄谋任意次") + .set("ai", (card) => { + const player = get.player(); + if (player.hasValueTarget(card)) return player.getUseValue(card); + return 0; + }); + if (!bool) break; + await player.addJudge({ name: "xumou_jsrg" }, cards); } }, }, - distance:{ - onremove:true, - charlotte:true, - mod:{ - globalFrom(player,target,distance){ - if(!player.storage.jsrgeqian_distance) return; - const dis=player.storage.jsrgeqian_distance[target.playerid]; - if(typeof dis=='number') return distance+dis; + distance: { + onremove: true, + charlotte: true, + mod: { + globalFrom(player, target, distance) { + if (!player.storage.jsrgeqian_distance) return; + const dis = player.storage.jsrgeqian_distance[target.playerid]; + if (typeof dis == "number") return distance + dis; }, }, - intro:{ - content(storage,player){ - if(!storage) return; - const map=(_status.connectMode?lib.playerOL:game.playerMap); - let str=`你本回合:`; - for(const id in storage){ - str+='
  • 至'+get.translation(map[id])+'的距离+'+storage[id]; + intro: { + content(storage, player) { + if (!storage) return; + const map = _status.connectMode ? lib.playerOL : game.playerMap; + let str = `你本回合:`; + for (const id in storage) { + str += "
  • 至" + get.translation(map[id]) + "的距离+" + storage[id]; } return str; - } - } + }, + }, }, - } - }, - jsrgfusha:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'fire', - filter(event,player){ - return game.countPlayer(current=>{ - return player.inRange(current); - })==1; }, - filterTarget(card,player,target){ + }, + jsrgfusha: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "fire", + filter(event, player) { + return ( + game.countPlayer((current) => { + return player.inRange(current); + }) == 1 + ); + }, + filterTarget(card, player, target) { return player.inRange(target); }, - selectTarget:-1, - async content(event,trigger,player){ - player.awakenSkill('jsrgfusha'); - event.target.damage(Math.min(game.countPlayer(),player.getAttackRange())); + selectTarget: -1, + async content(event, trigger, player) { + player.awakenSkill("jsrgfusha"); + event.target.damage(Math.min(game.countPlayer(), player.getAttackRange())); }, - ai:{ - order:1, - result:{ - target:-2, + ai: { + order: 1, + result: { + target: -2, }, }, }, //大小虎 - jsrgdaimou:{ - audio:2, - trigger:{ - global:'useCardToPlayer', + jsrgdaimou: { + audio: 2, + trigger: { + global: "useCardToPlayer", }, - filter(event,player){ - if(event.card.name!='sha') return false; - if(event.target!=player) return !player.hasSkill('jsrgdaimou_other'); - return !player.hasSkill('jsrgdaimou_me')&&player.hasCard(card=>{ - return (card.viewAs||card.name)=='xumou_jsrg'&&lib.filter.cardDiscardable(card,player,'jsrgdaimou'); - },'j'); + filter(event, player) { + if (event.card.name != "sha") return false; + if (event.target != player) return !player.hasSkill("jsrgdaimou_other"); + return ( + !player.hasSkill("jsrgdaimou_me") && + player.hasCard((card) => { + return ( + (card.viewAs || card.name) == "xumou_jsrg" && + lib.filter.cardDiscardable(card, player, "jsrgdaimou") + ); + }, "j") + ); }, - direct:true, - async content(event,trigger,player){ - if(trigger.target==player){ - player.logSkill('jsrgdaimou'); - player.addTempSkill('jsrgdaimou_me'); - const {result:{bool,links}}=await player.chooseButton([ - '殆谋:请弃置区域里的一张蓄谋牌', - player.getCards('j',card=>{ - return (card.viewAs||card.name)=='xumou_jsrg'; + direct: true, + async content(event, trigger, player) { + if (trigger.target == player) { + player.logSkill("jsrgdaimou"); + player.addTempSkill("jsrgdaimou_me"); + const { + result: { bool, links }, + } = await player + .chooseButton( + [ + "殆谋:请弃置区域里的一张蓄谋牌", + player.getCards("j", (card) => { + return (card.viewAs || card.name) == "xumou_jsrg"; + }), + ], + true + ) + .set("filterButton", (button) => { + return lib.filter.cardDiscardable(button.link, get.player(), "jsrgdaimou"); }) - ],true).set('filterButton',button=>{ - return lib.filter.cardDiscardable(button.link,get.player(),'jsrgdaimou'); - }).set('ai',button=>{ - const player=get.player(); - return 1/Math.max(0.01,player.getUseValue(button.link)); - }); - if(bool){ + .set("ai", (button) => { + const player = get.player(); + return 1 / Math.max(0.01, player.getUseValue(button.link)); + }); + if (bool) { player.discard(links); } - } - else{ - const {result:{bool}}=await player.chooseBool(get.prompt('jsrgdaimou'),'你可以用牌堆顶的牌蓄谋').set('ai',()=>true); - if(bool){ - player.logSkill('jsrgdaimou'); - player.addTempSkill('jsrgdaimou_other'); - player.addJudge({name:'xumou_jsrg'},get.cards()); + } else { + const { + result: { bool }, + } = await player + .chooseBool(get.prompt("jsrgdaimou"), "你可以用牌堆顶的牌蓄谋") + .set("ai", () => true); + if (bool) { + player.logSkill("jsrgdaimou"); + player.addTempSkill("jsrgdaimou_other"); + player.addJudge({ name: "xumou_jsrg" }, get.cards()); } } }, - subSkill:{ - me:{charlotte:true}, - other:{charlotte:true}, + subSkill: { + me: { charlotte: true }, + other: { charlotte: true }, }, }, - jsrgfangjie:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - async content(event,trigger,player){ - if(!player.hasCard(card=>{ - return (card.viewAs||card.name)=='xumou_jsrg'; - },'j')){ - player.logSkill('jsrgfangjie'); + jsrgfangjie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + async content(event, trigger, player) { + if ( + !player.hasCard((card) => { + return (card.viewAs || card.name) == "xumou_jsrg"; + }, "j") + ) { + player.logSkill("jsrgfangjie"); await player.recover(); await player.draw(); - } - else{ - const {result:{bool,links}}=await player.chooseButton([ - '是否弃置区域里的任意张蓄谋牌并失去〖芳洁〗?', - player.getCards('j',card=>{ - return (card.viewAs||card.name)=='xumou_jsrg'; + } else { + const { + result: { bool, links }, + } = await player + .chooseButton( + [ + "是否弃置区域里的任意张蓄谋牌并失去〖芳洁〗?", + player.getCards("j", (card) => { + return (card.viewAs || card.name) == "xumou_jsrg"; + }), + ], + [1, Infinity] + ) + .set("filterButton", (button) => { + return lib.filter.cardDiscardable(button.link, get.player(), "jsrgdaimou"); }) - ],[1,Infinity]).set('filterButton',button=>{ - return lib.filter.cardDiscardable(button.link,get.player(),'jsrgdaimou'); - }).set('ai',()=>0); - if(bool){ - player.logSkill('jsrgfangjie'); + .set("ai", () => 0); + if (bool) { + player.logSkill("jsrgfangjie"); await player.discard(links); - player.removeSkills('jsrgfangjie'); + player.removeSkills("jsrgfangjie"); } } }, }, //曹芳 - jsrgzhaotu:{ - audio:2, - enable:'chooseToUse', - viewAs:{name:'lebu'}, - position:'hes', - round:1, - viewAsFilter(player){ - return player.countCards('hes'); + jsrgzhaotu: { + audio: 2, + enable: "chooseToUse", + viewAs: { name: "lebu" }, + position: "hes", + round: 1, + viewAsFilter(player) { + return player.countCards("hes"); }, - filterCard(card,player){ - return get.color(card)=='red'&&get.type2(card)!='trick'; + filterCard(card, player) { + return get.color(card) == "red" && get.type2(card) != "trick"; }, - onuse(result,player){ - player.tempBanSkill('jsrgzhaotu',null,false); + onuse(result, player) { + player.tempBanSkill("jsrgzhaotu", null, false); result.targets[0].insertPhase(); - result.targets[0].addTempSkill('jsrgzhaotu_handcard',{player:'phaseAfter'}); - result.targets[0].addMark('jsrgzhaotu_handcard',2,false); + result.targets[0].addTempSkill("jsrgzhaotu_handcard", { player: "phaseAfter" }); + result.targets[0].addMark("jsrgzhaotu_handcard", 2, false); }, - subSkill:{ - handcard:{ - intro:{ - content(storage,player){ - return '手牌上限-'+storage; - } + subSkill: { + handcard: { + intro: { + content(storage, player) { + return "手牌上限-" + storage; + }, }, - charlotte:true, - onremove:true, - mod:{ - maxHandcard(player,num){ - return num-player.countMark('jsrgzhaotu_handcard'); - } + charlotte: true, + onremove: true, + mod: { + maxHandcard(player, num) { + return num - player.countMark("jsrgzhaotu_handcard"); + }, }, }, }, - ai:{ - order:5, - result:{ - target(player,target){ - let dis=0.5-0.75*target.needsToDiscard(2,null,true); - if(dis>0) return dis; - if(player.hasSkill('jsrgjingju')&&player.hasZhuSkill('jsrgweizhui')&&get.attitude(player,target)>0) return game.countPlayer(current=>{ - if(current===player||current===target||current.group!=='wei') return false; - return player.hasZhuSkill('jsrgweizhui',current)&&get.attitude(player,current)>0; - }); + ai: { + order: 5, + result: { + target(player, target) { + let dis = 0.5 - 0.75 * target.needsToDiscard(2, null, true); + if (dis > 0) return dis; + if ( + player.hasSkill("jsrgjingju") && + player.hasZhuSkill("jsrgweizhui") && + get.attitude(player, target) > 0 + ) + return game.countPlayer((current) => { + if (current === player || current === target || current.group !== "wei") + return false; + return ( + player.hasZhuSkill("jsrgweizhui", current) && + get.attitude(player, current) > 0 + ); + }); return dis; }, }, }, }, - jsrgjingju:{ - audio:2, - enable:'chooseToUse', - filter(event,player){ - if(event.type=='wuxie'||event.jsrgjingju) return false; - if(!player.canMoveCard(null,false,game.filterPlayer(i=>i!=player),player,card=>{ - return get.position(card)=='j'; - })) return false; - return get.inpileVCardList(info=>{ - if(info[0]!='basic') return false; - return event.filterCard(get.autoViewAs({name:info[2],nature:info[3]},'unsure'),player,event); + jsrgjingju: { + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if (event.type == "wuxie" || event.jsrgjingju) return false; + if ( + !player.canMoveCard( + null, + false, + game.filterPlayer((i) => i != player), + player, + (card) => { + return get.position(card) == "j"; + } + ) + ) + return false; + return get.inpileVCardList((info) => { + if (info[0] != "basic") return false; + return event.filterCard( + get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), + player, + event + ); }).length; }, - chooseButton:{ - dialog:function(event,player){ - const vcards=get.inpileVCardList(info=>{ - if(info[0]!='basic') return false; - return event.filterCard(get.autoViewAs({name:info[2],nature:info[3]},'unsure'),player,event); + chooseButton: { + dialog: function (event, player) { + const vcards = get.inpileVCardList((info) => { + if (info[0] != "basic") return false; + return event.filterCard( + get.autoViewAs({ name: info[2], nature: info[3] }, "unsure"), + player, + event + ); }); - return ui.create.dialog('惊惧',[vcards,'vcard'],'hidden'); + return ui.create.dialog("惊惧", [vcards, "vcard"], "hidden"); }, - check:function(button){ - let player=_status.event.player; - if(get.event().getParent().type!='phase') return 1; - return get.player().getUseValue({name:button.link[2],nature:button.link[3]})+game.countPlayer(current=>{ - if(current===player||current.group!=='wei') return false; - return player.hasZhuSkill('jsrgweizhui',current)&&get.attitude(player,current)>0; - }); + check: function (button) { + let player = _status.event.player; + if (get.event().getParent().type != "phase") return 1; + return ( + get.player().getUseValue({ name: button.link[2], nature: button.link[3] }) + + game.countPlayer((current) => { + if (current === player || current.group !== "wei") return false; + return ( + player.hasZhuSkill("jsrgweizhui", current) && + get.attitude(player, current) > 0 + ); + }) + ); }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:()=>false, - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, + filterCard: () => false, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, }, - selectCard:-1, - precontent(){ - 'step 0' - player.moveCard(`惊惧:将其他角色判定区里的牌移动至你的判定区`,game.filterPlayer(i=>i!=player),player,card=>{ - return get.position(card)=='j'; - }).set('logSkill','jsrgjingju'); - 'step 1' - if(result.bool){ + selectCard: -1, + precontent() { + "step 0"; + player + .moveCard( + `惊惧:将其他角色判定区里的牌移动至你的判定区`, + game.filterPlayer((i) => i != player), + player, + (card) => { + return get.position(card) == "j"; + } + ) + .set("logSkill", "jsrgjingju"); + ("step 1"); + if (result.bool) { delete event.result.skill; - } - else{ - event.getParent().jsrgjingju=true; + } else { + event.getParent().jsrgjingju = true; event.getParent().goto(0); delete event.getParent().openskilldialog; event.finish(); } - 'step 2' + ("step 2"); game.delayx(); }, - } + }; + }, + prompt: function (links, player) { + return ( + "选择" + + get.translation(links[0][3] || "") + + "【" + + get.translation(links[0][2]) + + "】的目标" + ); }, - prompt:function(links,player){ - return '选择'+get.translation(links[0][3]||'')+'【'+get.translation(links[0][2])+'】的目标'; - } }, - ai:{ - order:function(){ - const player=get.player(),event=_status.event; - if(player.canMoveCard(null,false,game.filterPlayer(),player,card=>{ - return get.position(card)=='j'; - })){ - if(event.type=='dying'){ - if(event.filterCard({name:'tao'},player,event)){ + ai: { + order: function () { + const player = get.player(), + event = _status.event; + if ( + player.canMoveCard(null, false, game.filterPlayer(), player, (card) => { + return get.position(card) == "j"; + }) + ) { + if (event.type == "dying") { + if (event.filterCard({ name: "tao" }, player, event)) { return 0.5; } - } - else{ - if(event.filterCard({name:'tao'},player,event)||event.filterCard({name:'shan'},player,event)){ + } else { + if ( + event.filterCard({ name: "tao" }, player, event) || + event.filterCard({ name: "shan" }, player, event) + ) { return 4; } - if(event.filterCard({name:'sha'},player,event)){ + if (event.filterCard({ name: "sha" }, player, event)) { return 2.9; } } } return 0; }, - save:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - return player.canMoveCard(null,false,game.filterPlayer(),player,card=>{ - return get.position(card)=='j'; - }) + save: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + return player.canMoveCard(null, false, game.filterPlayer(), player, (card) => { + return get.position(card) == "j"; + }); }, - result:{ - player:function(player){ - if(get.event().type=='dying'){ - return get.attitude(player,get.event().dying); + result: { + player: function (player) { + if (get.event().type == "dying") { + return get.attitude(player, get.event().dying); } return 1; - } - } - } - }, - jsrgweizhui:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - zhuSkill:true, - direct:true, - filter(event,player){ - return player!=event.player&&event.player.group=='wei'&&event.player.isIn()&&player.hasZhuSkill('jsrgweizhui',event.player); + }, + }, }, - async content(event,trigger,player){ - const {result:{bool,cards}}=await trigger.player.chooseCard(`是否响应${get.translation(player)}的主公技【危坠】?`,'将一张黑色手牌当【过河拆桥】对其使用',(card,player)=>{ - if(get.color(card)!='black') return false; - return player.canUse(get.autoViewAs({name:'guohe'},[card]),get.event('target')); - }).set('target',player).set('ai',card=>{ - if(get.effect(get.event('target'),get.autoViewAs({name:'guohe'},[card]),player)<=0) return 0; - return 7-get.value(card); - }); - if(bool){ - trigger.player.logSkill('jsrgweizhui',player); - trigger.player.useCard(get.autoViewAs({name:'guohe'},cards),cards,player); + }, + jsrgweizhui: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + zhuSkill: true, + direct: true, + filter(event, player) { + return ( + player != event.player && + event.player.group == "wei" && + event.player.isIn() && + player.hasZhuSkill("jsrgweizhui", event.player) + ); + }, + async content(event, trigger, player) { + const { + result: { bool, cards }, + } = await trigger.player + .chooseCard( + `是否响应${get.translation(player)}的主公技【危坠】?`, + "将一张黑色手牌当【过河拆桥】对其使用", + (card, player) => { + if (get.color(card) != "black") return false; + return player.canUse( + get.autoViewAs({ name: "guohe" }, [card]), + get.event("target") + ); + } + ) + .set("target", player) + .set("ai", (card) => { + if ( + get.effect( + get.event("target"), + get.autoViewAs({ name: "guohe" }, [card]), + player + ) <= 0 + ) + return 0; + return 7 - get.value(card); + }); + if (bool) { + trigger.player.logSkill("jsrgweizhui", player); + trigger.player.useCard(get.autoViewAs({ name: "guohe" }, cards), cards, player); } }, }, //孙峻 - jsrgyaoyan:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - prompt:'是否发动【邀宴】?', - logTarget:()=>game.filterPlayer(), - async content(event,trigger,player){ - const targets=game.filterPlayer(); - const toDebateList=[]; - while(targets.length){ - const current=targets.shift(); - const {result:{bool}}=await current.chooseBool(`是否响应${get.translation(player)}的【邀宴】,于回合结束参与议事?`).set('ai',()=>Math.random()<0.5); - if(bool){ + jsrgyaoyan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + prompt: "是否发动【邀宴】?", + logTarget: () => game.filterPlayer(), + async content(event, trigger, player) { + const targets = game.filterPlayer(); + const toDebateList = []; + while (targets.length) { + const current = targets.shift(); + const { + result: { bool }, + } = await current + .chooseBool(`是否响应${get.translation(player)}的【邀宴】,于回合结束参与议事?`) + .set("ai", () => Math.random() < 0.5); + if (bool) { toDebateList.add(current); - current.popup('同意','wood'); - game.log(current,'#g同意','参加',player,'的议事'); - } - else{ - current.popup('拒绝','fire'); - game.log(current,'#r拒绝','参加',player,'的议事'); + current.popup("同意", "wood"); + game.log(current, "#g同意", "参加", player, "的议事"); + } else { + current.popup("拒绝", "fire"); + game.log(current, "#r拒绝", "参加", player, "的议事"); } } - if(toDebateList.length){ - player.addTempSkill('jsrgyaoyan_hold'); - player.markAuto('jsrgyaoyan_hold',toDebateList); + if (toDebateList.length) { + player.addTempSkill("jsrgyaoyan_hold"); + player.markAuto("jsrgyaoyan_hold", toDebateList); } }, - subSkill:{ - hold:{ - trigger:{player:'phaseEnd'}, - charlotte:true, - forced:true, - popup:false, - onremove:true, - filter(event,player){ - return player.getStorage('jsrgyaoyan_hold').some(i=>i.isIn()); + subSkill: { + hold: { + trigger: { player: "phaseEnd" }, + charlotte: true, + forced: true, + popup: false, + onremove: true, + filter(event, player) { + return player.getStorage("jsrgyaoyan_hold").some((i) => i.isIn()); }, - async content(event,trigger,player){ - player.chooseToDebate(player.getStorage('jsrgyaoyan_hold').filter(i=>i.isIn())).set('callback',async event=>{ - const {bool,opinion,targets}=event.debateResult; - if(bool&&opinion){ - if(opinion=='red'){ - const notDebated=game.filterPlayer().removeArray(targets); - if(notDebated.length){ - const {result}=await player.chooseTarget('获得任意名未议事的角色的各一张手牌',[1,Infinity],true,(card,player,target)=>{ - return get.event('targets').includes(target)&&target.countGainableCards(player,'h'); - }).set('targets',notDebated).set('ai',target=>{ - const player=get.player(); - const att=get.attitude(player,target); - return -att; - }); - if(result.bool){ - const targets=result.targets; - targets.sortBySeat(); - player.line(targets,'green'); - for(const current of targets){ - await player.gainPlayerCard(current,'h',true); + async content(event, trigger, player) { + player + .chooseToDebate(player.getStorage("jsrgyaoyan_hold").filter((i) => i.isIn())) + .set("callback", async (event) => { + const { bool, opinion, targets } = event.debateResult; + if (bool && opinion) { + if (opinion == "red") { + const notDebated = game.filterPlayer().removeArray(targets); + if (notDebated.length) { + const { result } = await player + .chooseTarget( + "获得任意名未议事的角色的各一张手牌", + [1, Infinity], + true, + (card, player, target) => { + return ( + get.event("targets").includes(target) && + target.countGainableCards(player, "h") + ); + } + ) + .set("targets", notDebated) + .set("ai", (target) => { + const player = get.player(); + const att = get.attitude(player, target); + return -att; + }); + if (result.bool) { + const targets = result.targets; + targets.sortBySeat(); + player.line(targets, "green"); + for (const current of targets) { + await player.gainPlayerCard(current, "h", true); + } } } + } else { + const { + result: { bool, targets: targets2 }, + } = await player + .chooseTarget( + "是否对一名议事的角色造成2点伤害?", + (card, player, target) => { + return get.event("targets").includes(target); + } + ) + .set("targets", targets) + .set("ai", (target) => { + const player = get.player(); + const eff = get.damageEffect(target, player, player); + return eff; + }); + if (bool) { + player.line(targets2[0]); + targets2[0].damage(2); + } } } - else{ - const {result:{bool,targets:targets2}}=await player.chooseTarget('是否对一名议事的角色造成2点伤害?',(card,player,target)=>{ - return get.event('targets').includes(target); - }).set('targets',targets).set('ai',target=>{ - const player=get.player(); - const eff=get.damageEffect(target,player,player); - return eff; - }); - if(bool){ - player.line(targets2[0]); - targets2[0].damage(2); - } - } - } - }); + }); }, - } - } - }, - jsrgbazheng:{ - audio:2, - trigger:{global:'debateShowOpinion'}, - filter(event,player){ - if(!event.targets.includes(player)) return false; - const damagedPlayers=player.getHistory('sourceDamage').map(evt=>evt.player).toUniqued(); - let dissent; - const colors=['red','black']; - for(const color of colors){ - if(event[color].some(i=>i[0]==player)){ - dissent=colors.find(i=>i!=color); - break; - } - } - return event[dissent].some(i=>damagedPlayers.includes(i[0])); + }, }, - forced:true, - locked:false, - direct:true, - async content(event,trigger,player){ - let myOpinion,dissent; - const colors=['red','black']; - for(const color of colors){ - if(trigger[color].some(i=>i[0]==player)){ - myOpinion=color; - dissent=colors.find(i=>i!=color); + }, + jsrgbazheng: { + audio: 2, + trigger: { global: "debateShowOpinion" }, + filter(event, player) { + if (!event.targets.includes(player)) return false; + const damagedPlayers = player + .getHistory("sourceDamage") + .map((evt) => evt.player) + .toUniqued(); + let dissent; + const colors = ["red", "black"]; + for (const color of colors) { + if (event[color].some((i) => i[0] == player)) { + dissent = colors.find((i) => i != color); break; } } - const damagedPlayers=player.getHistory('sourceDamage').map(evt=>evt.player).toUniqued(); - let dissident=[]; - for(let i=0;i damagedPlayers.includes(i[0])); + }, + forced: true, + locked: false, + direct: true, + async content(event, trigger, player) { + let myOpinion, dissent; + const colors = ["red", "black"]; + for (const color of colors) { + if (trigger[color].some((i) => i[0] == player)) { + myOpinion = color; + dissent = colors.find((i) => i != color); + break; + } + } + const damagedPlayers = player + .getHistory("sourceDamage") + .map((evt) => evt.player) + .toUniqued(); + let dissident = []; + for (let i = 0; i < trigger[dissent].length; i++) { + const pair = trigger[dissent][i]; + if (damagedPlayers.includes(pair[0])) { dissident.push(pair[0]); trigger[myOpinion].push(pair); - trigger[dissent].splice(i--,1); + trigger[dissent].splice(i--, 1); } } - player.logSkill('jsrgbazheng',dissident); + player.logSkill("jsrgbazheng", dissident); }, }, //刘永 - jsrgdanxin:{ - audio:2, - enable:'chooseToUse', - viewAs:{ - name:'tuixinzhifu', - storage:{jsrgdanxin:true}, + jsrgdanxin: { + audio: 2, + enable: "chooseToUse", + viewAs: { + name: "tuixinzhifu", + storage: { jsrgdanxin: true }, }, - filterCard:true, - position:'hes', - precontent(){ - player.addTempSkill('jsrgdanxin_effect'); + filterCard: true, + position: "hes", + precontent() { + player.addTempSkill("jsrgdanxin_effect"); }, - subSkill:{ - effect:{ - audio:'jsrgdanxin', - trigger:{ - global:'gainAfter', + subSkill: { + effect: { + audio: "jsrgdanxin", + trigger: { + global: "gainAfter", }, - filter(event,player){ - const level=event.player!=player?1:2; - if(event.player!=player&&event.getParent(level).name!='tuixinzhifu') return false; - if(event.player==player&&event.getParent(level).name!='tuixinzhifu') return false; - const card=event.getParent(level+1).card; - return card&&card.storage&&card.storage.jsrgdanxin; + filter(event, player) { + const level = event.player != player ? 1 : 2; + if (event.player != player && event.getParent(level).name != "tuixinzhifu") + return false; + if (event.player == player && event.getParent(level).name != "tuixinzhifu") + return false; + const card = event.getParent(level + 1).card; + return card && card.storage && card.storage.jsrgdanxin; }, - forced:true, - popup:false, - charlotte:true, - async content(event,trigger,player){ - const level=trigger.player!=player?1:2; - const {targets}=trigger.getParent(level+1); + forced: true, + popup: false, + charlotte: true, + async content(event, trigger, player) { + const level = trigger.player != player ? 1 : 2; + const { targets } = trigger.getParent(level + 1); await player.showCards(trigger.cards); - if(trigger.cards.some(card=>get.suit(card)=='heart')){ - const owners=trigger.cards.filter((card=>get.suit(card)=='heart')).map(card=>get.owner(card)).toUniqued(); - for(const owner of owners){ - if(owner&&owner.isIn()) await owner.recover(); + if (trigger.cards.some((card) => get.suit(card) == "heart")) { + const owners = trigger.cards + .filter((card) => get.suit(card) == "heart") + .map((card) => get.owner(card)) + .toUniqued(); + for (const owner of owners) { + if (owner && owner.isIn()) await owner.recover(); } } - if(trigger.player==player) return; - player.addTempSkill('jsrgdanxin_distance'); - if(!player.storage.jsrgdanxin_distance) player.storage.jsrgdanxin_distance={}; - const id=targets[0].playerid; - if(typeof player.storage.jsrgdanxin_distance[id]!='number') player.storage.jsrgdanxin_distance[id]=0; + if (trigger.player == player) return; + player.addTempSkill("jsrgdanxin_distance"); + if (!player.storage.jsrgdanxin_distance) player.storage.jsrgdanxin_distance = {}; + const id = targets[0].playerid; + if (typeof player.storage.jsrgdanxin_distance[id] != "number") + player.storage.jsrgdanxin_distance[id] = 0; player.storage.jsrgdanxin_distance[id]++; - player.markSkill('jsrgdanxin_distance'); + player.markSkill("jsrgdanxin_distance"); }, }, - distance:{ - onremove:true, - charlotte:true, - mod:{ - globalFrom(player,target,distance){ - if(!player.storage.jsrgdanxin_distance) return; - const dis=player.storage.jsrgdanxin_distance[target.playerid]; - if(typeof dis=='number') return distance+dis; + distance: { + onremove: true, + charlotte: true, + mod: { + globalFrom(player, target, distance) { + if (!player.storage.jsrgdanxin_distance) return; + const dis = player.storage.jsrgdanxin_distance[target.playerid]; + if (typeof dis == "number") return distance + dis; }, }, - intro:{ - content(storage,player){ - if(!storage) return; - const map=(_status.connectMode?lib.playerOL:game.playerMap); - let str=`你本回合:`; - for(const id in storage){ - str+='
  • 至'+get.translation(map[id])+'的距离+'+storage[id]; + intro: { + content(storage, player) { + if (!storage) return; + const map = _status.connectMode ? lib.playerOL : game.playerMap; + let str = `你本回合:`; + for (const id in storage) { + str += "
  • 至" + get.translation(map[id]) + "的距离+" + storage[id]; } return str; - } - } + }, + }, }, - } - }, - jsrgfengxiang:{ - audio:'fengxiang', - trigger:{player:'damageEnd'}, - forced:true, - direct:true, - filter(event,player){ - return game.hasPlayer(current=>{ - return current.countCards('e'); - }) }, - async content(event,trigger,player){ - const {result:{bool,targets}}=await player.chooseTarget('封乡:与一名其他角色交换装备区里的所有牌',(card,player,target)=>{ - return target.countCards('e')+player.countCards('e')>0&&player!=target; - },true).set('ai',target=>{ - const player=get.player(); - const att=get.attitude(player,target); - let delta=get.value(target.getCards('e'),player)-get.value(player.getCards('e'),player); - if(att>0){ - if(delta<0) delta+=att/3; - } - else{ - if(delta<0) delta-=att/3; - } - return delta; + }, + jsrgfengxiang: { + audio: "fengxiang", + trigger: { player: "damageEnd" }, + forced: true, + direct: true, + filter(event, player) { + return game.hasPlayer((current) => { + return current.countCards("e"); }); - if(bool){ - player.logSkill('jsrgfengxiang',targets[0]); - const num=player.countCards('e'); + }, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "封乡:与一名其他角色交换装备区里的所有牌", + (card, player, target) => { + return ( + target.countCards("e") + player.countCards("e") > 0 && player != target + ); + }, + true + ) + .set("ai", (target) => { + const player = get.player(); + const att = get.attitude(player, target); + let delta = + get.value(target.getCards("e"), player) - + get.value(player.getCards("e"), player); + if (att > 0) { + if (delta < 0) delta += att / 3; + } else { + if (delta < 0) delta -= att / 3; + } + return delta; + }); + if (bool) { + player.logSkill("jsrgfengxiang", targets[0]); + const num = player.countCards("e"); await player.swapEquip(targets[0]); - const delta=num-player.countCards('e'); - if(delta>0) player.draw(delta); + const delta = num - player.countCards("e"); + if (delta > 0) player.draw(delta); } }, }, - jsrgfuhai:{ - audio:'xinfu_fuhai', - enable:'phaseUse', - usable:1, - filter(event,player){ - return game.hasPlayer(current=>{ - return current.countCards('h')&¤t!=player; - }) - }, - filterTarget(card,player,target){ - return target.countCards('h')&&target!=player; - }, - selectTarget:-1, - multitarget:true, - multiline:true, - async content(event,trigger,player){ - const targets=event.targets.sortBySeat(); - const next=player.chooseCardOL(targets,'请展示一张手牌',true).set('ai',card=>{ - return -get.value(card); - }).set('aiCard',target=>{ - const hs=target.getCards('h'); - return {bool:true,cards:[hs.randomGet()]}; + jsrgfuhai: { + audio: "xinfu_fuhai", + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer((current) => { + return current.countCards("h") && current != player; }); - next._args.remove('glow_result'); - const {result}=await next; - const cards=[]; - const videoId=lib.status.videoId++; - for(let i=0;i { + return -get.value(card); + }) + .set("aiCard", (target) => { + const hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; + }); + next._args.remove("glow_result"); + const { result } = await next; + const cards = []; + const videoId = lib.status.videoId++; + for (let i = 0; i < targets.length; i++) { cards.push(result[i].cards[0]); - game.log(targets[i],'展示了',result[i].cards[0]); + game.log(targets[i], "展示了", result[i].cards[0]); } - game.broadcastAll((targets,cards,id,player)=>{ - var dialog=ui.create.dialog(get.translation(player)+'发动了【浮海】',cards); - dialog.videoId=id; - const getName=(target)=>{ - if(target._tempTranslate) return target._tempTranslate; - var name=target.name; - if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; - return get.translation(name); - } - for(let i=0;i { + var dialog = ui.create.dialog(get.translation(player) + "发动了【浮海】", cards); + dialog.videoId = id; + const getName = (target) => { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + }; + for (let i = 0; i < targets.length; i++) { + dialog.buttons[i].querySelector(".info").innerHTML = + getName(targets[i]) + "|" + get.strNumber(cards[i].number); + } + }, + targets, + cards, + videoId, + player + ); await game.asyncDelay(4); - game.broadcastAll('closeDialog',videoId); - let clock=-1,anticlock=-1; - for(let j=0;j<2;j++){ - let increase=-Infinity,decrease=Infinity,count=0; - for(let i=0;iincrease){ - increase=number; - flag=true; - } - else increase=Infinity; - if(number increase) { + increase = number; + flag = true; + } else increase = Infinity; + if (number < decrease) { + decrease = number; + flag = true; + } else decrease = -Infinity; + if (flag) count++; else break; } targets.reverse(); cards.reverse(); - if(j==0) anticlock=Math.max(1,count); - else clock=Math.max(1,count); + if (j == 0) anticlock = Math.max(1, count); + else clock = Math.max(1, count); } - const {result:{index}}=await player.chooseControl(`↖顺时针(${clock})`,`逆时针(${anticlock})↗`).set('prompt','请选择一个方向,摸对应数量的牌').set('ai',()=>get.event('choice')).set('choice',clock>anticlock?0:1) - player.draw(index==0?clock:anticlock); + const { + result: { index }, + } = await player + .chooseControl(`↖顺时针(${clock})`, `逆时针(${anticlock})↗`) + .set("prompt", "请选择一个方向,摸对应数量的牌") + .set("ai", () => get.event("choice")) + .set("choice", clock > anticlock ? 0 : 1); + player.draw(index == 0 ? clock : anticlock); + }, + ai: { + order: 8, + result: { player: 1 }, }, - ai:{ - order:8, - result:{player:1}, - } }, //张嫙 - jsrgtongli:{ - audio:'tongli', - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(!event.isFirstTarget) return false; - const type=get.type(event.card); - if(type!='basic'&&type!='trick') return false; - const hs=player.getCards('h'); - if(!hs.length) return false; - const evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - const num1=player.getHistory('useCard',evtx=>{ - return evtx.getParent('phaseUse')==evt; + jsrgtongli: { + audio: "tongli", + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + const type = get.type(event.card); + if (type != "basic" && type != "trick") return false; + const hs = player.getCards("h"); + if (!hs.length) return false; + const evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + const num1 = player.getHistory("useCard", (evtx) => { + return evtx.getParent("phaseUse") == evt; }).length; - if(hs.length{ - let str='奢葬'; - if(player==game.me&&!_status.auto){ - str+=':获得任意张花色各不相同的牌'; - } - const dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,videoId,cards); - const time=get.utc(); - game.addVideo('showCards',player,['奢葬',get.cardsInfo(event.cards)]); - game.addVideo('delay',null,2); - const list=[]; - for(const i of cards) list.add(get.suit(i,false)); - const next=player.chooseButton([1,list.length]); - next.set('dialog',event.videoId); - next.set('filterButton',function(button){ - for(var i=0;i { + let str = "奢葬"; + if (player == game.me && !_status.auto) { + str += ":获得任意张花色各不相同的牌"; + } + const dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + videoId, + cards + ); + const time = get.utc(); + game.addVideo("showCards", player, ["奢葬", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + const list = []; + for (const i of cards) list.add(get.suit(i, false)); + const next = player.chooseButton([1, list.length]); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.suit(ui.selected.buttons[i].link) == get.suit(button.link)) return false; } return true; }); - next.set('ai',function(button){ - return get.value(button.link,_status.event.player); + next.set("ai", function (button) { + return get.value(button.link, _status.event.player); }); - const {result}=await next; - if(result.bool&&result.links){ - const time2=1000-(get.utc()-time); - if(time2>0){ - await game.asyncDelay(0,time2); + const { result } = await next; + if (result.bool && result.links) { + const time2 = 1000 - (get.utc() - time); + if (time2 > 0) { + await game.asyncDelay(0, time2); } - game.broadcastAll('closeDialog',videoId); - player.gain(result.links,'gain2'); + game.broadcastAll("closeDialog", videoId); + player.gain(result.links, "gain2"); } }, }, - jsrgchiying:{ - audio:'dcchiying', - enable:'phaseUse', - usable:1, - filterTarget:true, - async content(event,trigger,player){ - const target=event.target; - const targets=game.filterPlayer(current=>target.inRange(current)&¤t!=player).sortBySeat(player); - if(!targets.length) return; - while(targets.length){ - const current=targets.shift(); - if(current.countCards('he')) await current.chooseToDiscard('驰应:请弃置一张牌','he',true); + jsrgchiying: { + audio: "dcchiying", + enable: "phaseUse", + usable: 1, + filterTarget: true, + async content(event, trigger, player) { + const target = event.target; + const targets = game + .filterPlayer((current) => target.inRange(current) && current != player) + .sortBySeat(player); + if (!targets.length) return; + while (targets.length) { + const current = targets.shift(); + if (current.countCards("he")) + await current.chooseToDiscard("驰应:请弃置一张牌", "he", true); } - let cards=[]; - game.getGlobalHistory('cardMove',evt=>{ - if(evt.getParent(3)==event){ - cards.addArray(evt.cards.filter(card=>get.type(card)=='basic')); + let cards = []; + game.getGlobalHistory("cardMove", (evt) => { + if (evt.getParent(3) == event) { + cards.addArray(evt.cards.filter((card) => get.type(card) == "basic")); } }); - if(cards.length<=target.getHp()){ - cards=cards.filterInD('d'); - if(cards.length) target.gain(cards,'gain2'); + if (cards.length <= target.getHp()) { + cards = cards.filterInD("d"); + if (cards.length) target.gain(cards, "gain2"); } }, - ai:{ - order:6, - result:{ - target(player,target){ - const targets=game.filterPlayer(current=>target.inRange(current)&¤t!=player); - let eff=0; - for(const targetx of targets){ - let effx=get.effect(targetx,{name:'guohe_copy2'},player,target); - if(get.attitude(player,targetx)<0) effx/=2; - eff+=effx; + ai: { + order: 6, + result: { + target(player, target) { + const targets = game.filterPlayer( + (current) => target.inRange(current) && current != player + ); + let eff = 0; + for (const targetx of targets) { + let effx = get.effect(targetx, { name: "guohe_copy2" }, player, target); + if (get.attitude(player, targetx) < 0) effx /= 2; + eff += effx; } - return eff*(get.attitude(player,target)<=0?0.75:1); - } - } - } + return eff * (get.attitude(player, target) <= 0 ? 0.75 : 1); + }, + }, + }, }, //郭照 - jsrgpianchong:{ - audio:'pianchong', - trigger:{global:'phaseJieshuBegin'}, - filter(event,player){ - return player.getHistory('lose').length; + jsrgpianchong: { + audio: "pianchong", + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return player.getHistory("lose").length; }, - frequent:true, - async content(event,trigger,player){ - const {result} = await player.judge(); + frequent: true, + async content(event, trigger, player) { + const { result } = await player.judge(); let num = 0; - game.getGlobalHistory('cardMove',evt=>{ - if(evt.name!='cardsDiscard'){ - if(evt.name!='lose'||evt.position!=ui.discardPile) return false; + game.getGlobalHistory("cardMove", (evt) => { + if (evt.name != "cardsDiscard") { + if (evt.name != "lose" || evt.position != ui.discardPile) return false; } - num += (evt.cards.filter(i=>get.color(i,false) == result.color).length); + num += evt.cards.filter((i) => get.color(i, false) == result.color).length; }); if (num > 0) player.draw(num); }, }, - jsrgzunwei:{ - audio:'zunwei', - enable:'phaseUse', - usable:1, - filter(event,player){ - const storage=player.getStorage('jsrgzunwei'); - return storage.length<3&&game.hasPlayer(current=>{ - return player.isDamaged()&¤t.getHp()>player.getHp()&&!storage.includes(2)|| - current.countCards('h')>player.countCards('h')&&!storage.includes(0)|| - current.countCards('e')>player.countCards('e')&&!storage.includes(1); - }); + jsrgzunwei: { + audio: "zunwei", + enable: "phaseUse", + usable: 1, + filter(event, player) { + const storage = player.getStorage("jsrgzunwei"); + return ( + storage.length < 3 && + game.hasPlayer((current) => { + return ( + (player.isDamaged() && + current.getHp() > player.getHp() && + !storage.includes(2)) || + (current.countCards("h") > player.countCards("h") && !storage.includes(0)) || + (current.countCards("e") > player.countCards("e") && !storage.includes(1)) + ); + }) + ); }, - chooseButton:{ - dialog(event,player){ - const list=[ - '选择手牌数大于你的一名角色', - '选择装备数大于你的一名角色', - '选择体力值大于你的一名角色', + chooseButton: { + dialog(event, player) { + const list = [ + "选择手牌数大于你的一名角色", + "选择装备数大于你的一名角色", + "选择体力值大于你的一名角色", ]; - const choiceList=ui.create.dialog('尊位:请选择一项','forcebutton','hidden'); - choiceList.add([list.map((item,i)=>{ - if(player.getStorage('jsrgzunwei').includes(i)) item=`${item}`; - return [i,item]; - }),'textbutton']) + const choiceList = ui.create.dialog("尊位:请选择一项", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + if (player.getStorage("jsrgzunwei").includes(i)) + item = `${item}`; + return [i, item]; + }), + "textbutton", + ]); return choiceList; }, - filter(button){ - const player=get.player(); - if(player.getStorage('jsrgzunwei').includes(button.link)) return false; - if(button.link==2){ - if(!player.isDamaged()) return false; - return game.hasPlayer(current=>{ - return current.getHp()>player.getHp(); + filter(button) { + const player = get.player(); + if (player.getStorage("jsrgzunwei").includes(button.link)) return false; + if (button.link == 2) { + if (!player.isDamaged()) return false; + return game.hasPlayer((current) => { + return current.getHp() > player.getHp(); }); } - if(button.link==0){ - return game.hasPlayer(current=>{ - return current.countCards('h')>player.countCards('h'); + if (button.link == 0) { + return game.hasPlayer((current) => { + return current.countCards("h") > player.countCards("h"); }); } - if(button.link==1){ - return game.hasPlayer(current=>{ - return current.countCards('e')>player.countCards('e'); + if (button.link == 1) { + return game.hasPlayer((current) => { + return current.countCards("e") > player.countCards("e"); }); } }, - backup(links){ - const next=get.copy(lib.skill.jsrgzunwei.backups[links[0]]); - next.audio='zunwei'; - next.filterCard=function(){return false}; - next.selectCard=-1; + backup(links) { + const next = get.copy(lib.skill.jsrgzunwei.backups[links[0]]); + next.audio = "zunwei"; + next.filterCard = function () { + return false; + }; + next.selectCard = -1; return next; }, - check(button){ - const player=get.player(); - switch(button.link){ - case 2:{ - const target=game.findPlayer(function(current){ + check(button) { + const player = get.player(); + switch (button.link) { + case 2: { + const target = game.findPlayer(function (current) { return current.isMaxHp(); }); - return (Math.min(target.hp,player.maxHp)-player.hp)*2; + return (Math.min(target.hp, player.maxHp) - player.hp) * 2; } - case 0:{ - const target=game.findPlayer(function(current){ + case 0: { + const target = game.findPlayer(function (current) { return current.isMaxHandcard(); }); - return Math.min(5,target.countCards('h')-player.countCards('h'))*0.8; + return Math.min(5, target.countCards("h") - player.countCards("h")) * 0.8; } - case 1:{ - const target=game.findPlayer(function(current){ + case 1: { + const target = game.findPlayer(function (current) { return current.isMaxEquip(); }); - return (target.countCards('e')-player.countCards('e'))*1.4; + return (target.countCards("e") - player.countCards("e")) * 1.4; } } }, - prompt(links){ + prompt(links) { return [ - '选择一名手牌数大于你的其他角色,将手牌数摸至与其相同(至多摸五张)', - '选择一名装备区内牌数大于你的其他角色,将其装备区里的牌移至你的装备区,直到你装备数不小于其', - '选择一名体力值大于你的其他角色,将体力值回复至与其相同', + "选择一名手牌数大于你的其他角色,将手牌数摸至与其相同(至多摸五张)", + "选择一名装备区内牌数大于你的其他角色,将其装备区里的牌移至你的装备区,直到你装备数不小于其", + "选择一名体力值大于你的其他角色,将体力值回复至与其相同", ][links[0]]; }, }, - backups:[ - { - filterTarget(card,player,target){ - return target.countCards('h')>player.countCards('h'); - }, - async content(event,trigger,player){ - player.draw(Math.min(5,event.target.countCards('h')-player.countCards('h'))); - if(!player.storage.jsrgzunwei) player.storage.jsrgzunwei=[]; - player.storage.jsrgzunwei.add(0); - }, - ai:{ - order:10, - result:{ - player:function(player,target){ - return Math.min(5,target.countCards('h')-player.countCards('h')); + backups: [ + { + filterTarget(card, player, target) { + return target.countCards("h") > player.countCards("h"); + }, + async content(event, trigger, player) { + player.draw(Math.min(5, event.target.countCards("h") - player.countCards("h"))); + if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; + player.storage.jsrgzunwei.add(0); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(5, target.countCards("h") - player.countCards("h")); + }, }, }, }, - }, - { - filterTarget(card,player,target){ - return target.countCards('e')>player.countCards('e'); - }, - async content(event,trigger,player){ - if(!player.storage.jsrgzunwei) player.storage.jsrgzunwei=[]; - player.storage.jsrgzunwei.add(1); - const target=event.target; - do{ - if(!target.countCards('e',card=>{ - return player.canEquip(card); - })) break; - const {result:{bool,links}}=await player.chooseButton([ - `尊位:将${get.translation(target)}的一张装备牌移至你的区域内`, - target.getCards('e') - ],true).set('filterButton',button=>{ - return get.player().canEquip(button.link); - }).set('ai',get.buttonValue); - if(bool){ - target.$give(links[0],player,false); - await player.equip(links[0]); - } - } - while(player.countCards('e') player.countCards("e"); + }, + async content(event, trigger, player) { + if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; + player.storage.jsrgzunwei.add(1); + const target = event.target; + do { + if ( + !target.countCards("e", (card) => { + return player.canEquip(card); + }) + ) + break; + const { + result: { bool, links }, + } = await player + .chooseButton( + [ + `尊位:将${get.translation(target)}的一张装备牌移至你的区域内`, + target.getCards("e"), + ], + true + ) + .set("filterButton", (button) => { + return get.player().canEquip(button.link); + }) + .set("ai", get.buttonValue); + if (bool) { + target.$give(links[0], player, false); + await player.equip(links[0]); + } + } while (player.countCards("e") < target.countCards("e")); + }, + ai: { + order: 10, + result: { + player(player, target) { + return target.countCards("e") - player.countCards("e"); + }, }, }, }, - }, - { - filterTarget(card,player,target){ - if(player.isHealthy()) return false; - return target.hp>player.hp; - }, - async content(event,trigger,player){ - player.recover(event.target.hp-player.hp); - if(!player.storage.jsrgzunwei) player.storage.jsrgzunwei=[]; - player.storage.jsrgzunwei.add(2); - }, - ai:{ - order:10, - result:{ - player:function(player,target){ - return (Math.min(target.hp,player.maxHp)-player.hp); + { + filterTarget(card, player, target) { + if (player.isHealthy()) return false; + return target.hp > player.hp; + }, + async content(event, trigger, player) { + player.recover(event.target.hp - player.hp); + if (!player.storage.jsrgzunwei) player.storage.jsrgzunwei = []; + player.storage.jsrgzunwei.add(2); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(target.hp, player.maxHp) - player.hp; + }, }, }, }, - }, ], - ai:{ - order:10, - result:{ - player:1, + ai: { + order: 10, + result: { + player: 1, }, }, - subSkill:{ - backup:{}, - } + subSkill: { + backup: {}, + }, }, //江山如故·转 //404郭嘉 - jsrgqingzi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.hasPlayer(current=>{ - if(current==player) return false; - return current.hasCard(card=>{ - return lib.filter.canBeDiscarded(card,player,current); - },'e'); - }) - }, - derivation:'xinshensu', - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgqingzi'),'弃置任意名其他角色装备区里的一张牌,然后令这些角色获得〖神速〗直到你的下回合开始',[1,Infinity],(card,player,target)=>{ - return target!=player&&target.hasCard(card=>{ - return lib.filter.canBeDiscarded(card,player,target); - },'e'); - }).set('ai',target=>{ - var player=_status.event.player; - return target.hasCard(card=>{ - return lib.filter.canBeDiscarded(card,player,target)&&get.value(card,target)>3||target.hp==1&&get.value(card,target)>0; - }); + jsrgqingzi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer((current) => { + if (current == player) return false; + return current.hasCard((card) => { + return lib.filter.canBeDiscarded(card, player, current); + }, "e"); }); - 'step 1' - if(result.bool){ - var targets=result.targets.slice(); + }, + derivation: "xinshensu", + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jsrgqingzi"), + "弃置任意名其他角色装备区里的一张牌,然后令这些角色获得〖神速〗直到你的下回合开始", + [1, Infinity], + (card, player, target) => { + return ( + target != player && + target.hasCard((card) => { + return lib.filter.canBeDiscarded(card, player, target); + }, "e") + ); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + return target.hasCard((card) => { + return ( + (lib.filter.canBeDiscarded(card, player, target) && + get.value(card, target) > 3) || + (target.hp == 1 && get.value(card, target) > 0) + ); + }); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.slice(); targets.sortBySeat(); - event.targets=targets; - event.num=0; - player.logSkill('jsrgqingzi',targets); - player.addSkill('jsrgqingzi_clear'); - } - else event.finish(); - 'step 2' - var target=targets[num]; - if(target.hasCard(card=>{ - return lib.filter.canBeDiscarded(card,player,target); - },'e')){ - player.discardPlayerCard(target,'e',true); - target.addAdditionalSkills('jsrgqingzi_'+player.playerid,'xinshensu'); - player.markAuto('jsrgqingzi_clear',[target]); + event.targets = targets; + event.num = 0; + player.logSkill("jsrgqingzi", targets); + player.addSkill("jsrgqingzi_clear"); + } else event.finish(); + ("step 2"); + var target = targets[num]; + if ( + target.hasCard((card) => { + return lib.filter.canBeDiscarded(card, player, target); + }, "e") + ) { + player.discardPlayerCard(target, "e", true); + target.addAdditionalSkills("jsrgqingzi_" + player.playerid, "xinshensu"); + player.markAuto("jsrgqingzi_clear", [target]); } event.num++; - if(event.num0; + return player.getStorage("jsrgqingzi_clear").length > 0; }, - content:function(){ - 'step 0' - var targets=player.getStorage('jsrgqingzi_clear'); - if(trigger.name=='die'&&player==trigger.player){ - for(var target of targets){ + content: function () { + "step 0"; + var targets = player.getStorage("jsrgqingzi_clear"); + if (trigger.name == "die" && player == trigger.player) { + for (var target of targets) { target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); } - player.removeSkill('jsrgqingzi_clear'); + player.removeSkill("jsrgqingzi_clear"); event.finish(); return; } - if(trigger.name=='phase') event.targets=targets.slice(0).sortBySeat(); - else event.targets=[trigger.player]; - 'step 1' - var target=targets.shift(); - var storage=player.getStorage('jsrgqingzi_clear'); - if(storage.includes(target)){ + if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat(); + else event.targets = [trigger.player]; + ("step 1"); + var target = targets.shift(); + var storage = player.getStorage("jsrgqingzi_clear"); + if (storage.includes(target)) { storage.remove(target); target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); } - if(targets.length>0){ + if (targets.length > 0) { event.redo(); - } - else if(!storage.length){ - player.removeSkill('jsrgqingzi_clear'); + } else if (!storage.length) { + player.removeSkill("jsrgqingzi_clear"); } }, }, }, }, - jsrgdingce:{ - audio:2, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - return player.hasCard(card=>{ - return lib.filter.cardDiscardable(card,player,'jsrgdingce'); + jsrgdingce: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return player.hasCard((card) => { + return lib.filter.cardDiscardable(card, player, "jsrgdingce"); }); }, - direct:true, - content:function(){ - 'step 0' - var target=trigger.source; - event.target=target; - player.chooseToDiscard(get.prompt('jsrgdingce',target),'弃置你与其的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。').set('ai',card=>{ - if(_status.event.goon) return 6-get.value(card); - return 0; - }).set('goon',get.attitude(player,target)<0||player.getCards('h').concat(target.getCards('h')).filter(card=>{ - return get.value(card)<5.5; - }).length>=2).set('logSkill',['jsrgdingce',target]); - 'step 1' - if(result.bool){ - event.card=result.cards[0]; - if(target.countDiscardableCards(player,'h')){ - var next=player.discardPlayerCard(target,'h',true); - if(target==player) next.set('ai',button=>{ - var card=button.link; - return (get.color(card,false)==_status.event.color?7.5:5)-get.value(card); - }).set('color',get.color(event.card,false)); - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - if(get.color(event.card,false)==get.color(card,false)){ + direct: true, + content: function () { + "step 0"; + var target = trigger.source; + event.target = target; + player + .chooseToDiscard( + get.prompt("jsrgdingce", target), + "弃置你与其的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。" + ) + .set("ai", (card) => { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set( + "goon", + get.attitude(player, target) < 0 || + player + .getCards("h") + .concat(target.getCards("h")) + .filter((card) => { + return get.value(card) < 5.5; + }).length >= 2 + ) + .set("logSkill", ["jsrgdingce", target]); + ("step 1"); + if (result.bool) { + event.card = result.cards[0]; + if (target.countDiscardableCards(player, "h")) { + var next = player.discardPlayerCard(target, "h", true); + if (target == player) + next.set("ai", (button) => { + var card = button.link; + return ( + (get.color(card, false) == _status.event.color ? 7.5 : 5) - + get.value(card) + ); + }).set("color", get.color(event.card, false)); + } else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + if (get.color(event.card, false) == get.color(card, false)) { game.delayex(); - player.chooseUseTarget('dongzhuxianji',true); + player.chooseUseTarget("dongzhuxianji", true); } } }, }, - jsrgzhenfeng:{ - audio:2, - enable:'phaseUse', - locked:false, - filter:function(event,player){ - if(!event.jsrgzhenfeng) return false; - return event.jsrgzhenfeng.some(info=>event.filterCard({ - name:info[2], - nature:info[3], - storage:{jsrgzhenfeng:true}, - isCard:true, - },player,event)); + jsrgzhenfeng: { + audio: 2, + enable: "phaseUse", + locked: false, + filter: function (event, player) { + if (!event.jsrgzhenfeng) return false; + return event.jsrgzhenfeng.some((info) => + event.filterCard( + { + name: info[2], + nature: info[3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }, + player, + event + ) + ); }, - onChooseToUse:function(event){ - if(!event.jsrgzhenfeng&&!game.online){ - var str=''; - game.countPlayer(current=>{ - current.getSkills(null,false,false).forEach(skill=>{ - var info=get.info(skill); - if(!info||info.charlotte) return; - var translation=get.skillInfoTranslation(skill,current); - str+=translation; + onChooseToUse: function (event) { + if (!event.jsrgzhenfeng && !game.online) { + var str = ""; + game.countPlayer((current) => { + current.getSkills(null, false, false).forEach((skill) => { + var info = get.info(skill); + if (!info || info.charlotte) return; + var translation = get.skillInfoTranslation(skill, current); + str += translation; }); }); - event.set('jsrgzhenfeng',lib.skill.jsrgzhenfeng.getInclusion(str,null,event.player)); + event.set( + "jsrgzhenfeng", + lib.skill.jsrgzhenfeng.getInclusion(str, null, event.player) + ); } }, - getInclusion:function(str,checkCard,player){ - let list=[]; - const names=Object.keys(lib.card); - for(const name of names){ - let type=get.type(name); - if(!['basic','trick'].includes(type)) continue; - if(player&&player.getStorage('jsrgzhenfeng_effect').includes(type)) continue; - const reg=`【${get.translation(name)}】`; - if(name=='sha'){ - if(str.includes(reg)){ - if(checkCard&&checkCard.name==name) return true; - list.push([type,'',name]); + getInclusion: function (str, checkCard, player) { + let list = []; + const names = Object.keys(lib.card); + for (const name of names) { + let type = get.type(name); + if (!["basic", "trick"].includes(type)) continue; + if (player && player.getStorage("jsrgzhenfeng_effect").includes(type)) continue; + const reg = `【${get.translation(name)}】`; + if (name == "sha") { + if (str.includes(reg)) { + if (checkCard && checkCard.name == name) return true; + list.push([type, "", name]); } - for(let nature of lib.inpile_nature){ - const reg1=`【${get.translation(nature)+get.translation(name)}】`,reg2=`${get.translation(nature)}【${get.translation(name)}】`; - if(str.includes(reg1)||str.includes(reg2)){ - if(checkCard&&checkCard.name==name&&checkCard.nature==nature) return true; - list.push([type,'',name,nature]); + for (let nature of lib.inpile_nature) { + const reg1 = `【${get.translation(nature) + get.translation(name)}】`, + reg2 = `${get.translation(nature)}【${get.translation(name)}】`; + if (str.includes(reg1) || str.includes(reg2)) { + if (checkCard && checkCard.name == name && checkCard.nature == nature) + return true; + list.push([type, "", name, nature]); } } - } - else{ - if(!str.includes(reg)) continue; - if(checkCard&&checkCard.name==name) return true; - list.push([type,'',name]); + } else { + if (!str.includes(reg)) continue; + if (checkCard && checkCard.name == name) return true; + list.push([type, "", name]); } } - if(checkCard) return false; + if (checkCard) return false; return list; }, - chooseButton:{ - dialog:function(event,player){ - var list=event.jsrgzhenfeng.filter(info=>{ - return event.filterCard({ - name:info[2], - nature:info[3], - storage:{jsrgzhenfeng:true}, - isCard:true, - },player,event); + chooseButton: { + dialog: function (event, player) { + var list = event.jsrgzhenfeng.filter((info) => { + return event.filterCard( + { + name: info[2], + nature: info[3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }, + player, + event + ); }); - return ui.create.dialog('针锋',[list,'vcard']); + return ui.create.dialog("针锋", [list, "vcard"]); }, - filter:function(button,player){ - return _status.event.getParent().filterCard({ - name:button.link[2], - nature:button.link[3], - storage:{jsrgzhenfeng:true}, - isCard:true, - },player,_status.event.getParent()); + filter: function (button, player) { + return _status.event.getParent().filterCard( + { + name: button.link[2], + nature: button.link[3], + storage: { jsrgzhenfeng: true }, + isCard: true, + }, + player, + _status.event.getParent() + ); }, - check:function(button){ - var player=_status.event.player; - var card={ - name:button.link[2], - nature:button.link[3], - storage:{jsrgzhenfeng:true}, - isCard:true, + check: function (button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + storage: { jsrgzhenfeng: true }, + isCard: true, }; - var eff=player.getUseValue(card); - if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].includes(button.link[2])) eff/=5; - var info=get.info(card); - if(info.toself){ - var str=player.getSkills(null,false,false).map(skill=>{ - var info=get.info(skill); - if(!info||info.charlotte) return; - return get.skillInfoTranslation(skill,player); - }).join('\n'); - if(lib.skill.jsrgzhenfeng.getInclusion(str,card)) eff+=get.damageEffect(player,player,player); + var eff = player.getUseValue(card); + if ( + [ + "wugu", + "zhulu_card", + "yiyi", + "lulitongxin", + "lianjunshengyan", + "diaohulishan", + ].includes(button.link[2]) + ) + eff /= 5; + var info = get.info(card); + if (info.toself) { + var str = player + .getSkills(null, false, false) + .map((skill) => { + var info = get.info(skill); + if (!info || info.charlotte) return; + return get.skillInfoTranslation(skill, player); + }) + .join("\n"); + if (lib.skill.jsrgzhenfeng.getInclusion(str, card)) + eff += get.damageEffect(player, player, player); } return eff; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'jsrgzhenfeng', - filterCard:()=>false, - selectCard:-1, - popname:true, - viewAs:{ - name:links[0][2], - nature:links[0][3], - storage:{jsrgzhenfeng:true}, - isCard:true, + audio: "jsrgzhenfeng", + filterCard: () => false, + selectCard: -1, + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + storage: { jsrgzhenfeng: true }, + isCard: true, }, - precontent:function(){ + precontent: function () { delete event.result.skill; - player.logSkill('jsrgzhenfeng'); - event.getParent().addCount=false; - player.addTempSkill('jsrgzhenfeng_effect','phaseUseAfter'); - player.markAuto('jsrgzhenfeng_effect',[get.type(event.result.card)]); + player.logSkill("jsrgzhenfeng"); + event.getParent().addCount = false; + player.addTempSkill("jsrgzhenfeng_effect", "phaseUseAfter"); + player.markAuto("jsrgzhenfeng_effect", [get.type(event.result.card)]); }, - } + }; }, - prompt:function(links,player){ - return '视为使用一张'+(get.translation(links[0][3])||'')+get.translation(links[0][2]); - } - }, - mod:{ - cardUsable:function(card){ - if(card.storage&&card.storage.jsrgzhenfeng) return Infinity; - }, - targetInRange:function(card){ - if(card.storage&&card.storage.jsrgzhenfeng) return true; + prompt: function (links, player) { + return ( + "视为使用一张" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + ); }, }, - ai:{ - order:1, - result:{ - player:1, + mod: { + cardUsable: function (card) { + if (card.storage && card.storage.jsrgzhenfeng) return Infinity; + }, + targetInRange: function (card) { + if (card.storage && card.storage.jsrgzhenfeng) return true; }, }, - subSkill:{ - effect:{ - audio:'jsrgzhenfeng', - trigger:{ - global:'useCardToBegin', + ai: { + order: 1, + result: { + player: 1, + }, + }, + subSkill: { + effect: { + audio: "jsrgzhenfeng", + trigger: { + global: "useCardToBegin", }, - charlotte:true, - forced:true, - onremove:true, - filter:function(event,player){ - if(!event.card.storage||!event.card.storage.jsrgzhenfeng) return false; + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { + if (!event.card.storage || !event.card.storage.jsrgzhenfeng) return false; // debugger - var str=event.target.getSkills(null,false,false).map(skill=>{ - var info=get.info(skill); - if(!info||info.charlotte) return; - return get.skillInfoTranslation(skill,event.target); - }).join('\n'); - return lib.skill.jsrgzhenfeng.getInclusion(str,event.card); + var str = event.target + .getSkills(null, false, false) + .map((skill) => { + var info = get.info(skill); + if (!info || info.charlotte) return; + return get.skillInfoTranslation(skill, event.target); + }) + .join("\n"); + return lib.skill.jsrgzhenfeng.getInclusion(str, event.card); }, - logTarget:'target', - content:function(){ + logTarget: "target", + content: function () { trigger.target.damage(); - } + }, }, }, }, //张飞 - jsrgbaohe:{ - audio:2, - trigger:{global:'phaseUseEnd'}, - filter:function(event,player){ - return player.countCards('he')>=2&&game.hasPlayer(current=>{ - return current.inRange(event.player)&&player.canUse('sha',current,false); - }); + jsrgbaohe: { + audio: 2, + trigger: { global: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.countCards("he") >= 2 && + game.hasPlayer((current) => { + return current.inRange(event.player) && player.canUse("sha", current, false); + }) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('jsrgbaohe'),2,'he').set('ai',card=>{ - var val=_status.event.val; - if(val>20) return 6-get.value(card); - if(val>0) return 4-get.value(card); - return 0; - }).set('val',game.filterPlayer(current=>{ - return current.inRange(trigger.player)&&player.canUse('sha',current,false); - }).map(i=>get.effect(i,{name:'sha'},player,player)).reduce((p,c)=>{ - return p+c; - },0)).set('logSkill','jsrgbaohe'); - 'step 1' - if(result.bool){ - var targets=game.filterPlayer(current=>{ - return current.inRange(trigger.player)&&player.canUse('sha',current,false); + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("jsrgbaohe"), 2, "he") + .set("ai", (card) => { + var val = _status.event.val; + if (val > 20) return 6 - get.value(card); + if (val > 0) return 4 - get.value(card); + return 0; + }) + .set( + "val", + game + .filterPlayer((current) => { + return ( + current.inRange(trigger.player) && + player.canUse("sha", current, false) + ); + }) + .map((i) => get.effect(i, { name: "sha" }, player, player)) + .reduce((p, c) => { + return p + c; + }, 0) + ) + .set("logSkill", "jsrgbaohe"); + ("step 1"); + if (result.bool) { + var targets = game.filterPlayer((current) => { + return current.inRange(trigger.player) && player.canUse("sha", current, false); }); - if(targets.length){ + if (targets.length) { game.delayex(); - player.useCard({name:'sha',isCard:true,storage:{jsrgbaohe:true}},targets,false); - player.addTempSkill('jsrgbaohe_add'); + player.useCard( + { name: "sha", isCard: true, storage: { jsrgbaohe: true } }, + targets, + false + ); + player.addTempSkill("jsrgbaohe_add"); } } }, - subSkill:{ - add:{ - audio:'jsrgbaohe', - trigger:{ - global:'useCard', + subSkill: { + add: { + audio: "jsrgbaohe", + trigger: { + global: "useCard", }, - charlotte:true, - forced:true, - filter:function(event,player){ - let evt=event.getParent(3),respondTo=event.respondTo; - if(evt.name!='useCard'||!Array.isArray(respondTo)||!respondTo[1].storage||!respondTo[1].storage.jsrgbaohe) return false; - return evt.targets.length>evt.num+1; + charlotte: true, + forced: true, + filter: function (event, player) { + let evt = event.getParent(3), + respondTo = event.respondTo; + if ( + evt.name != "useCard" || + !Array.isArray(respondTo) || + !respondTo[1].storage || + !respondTo[1].storage.jsrgbaohe + ) + return false; + return evt.targets.length > evt.num + 1; }, - logTarget:function(event){ - let evt=event.getParent(3); - return evt.targets.slice(evt.num+1); + logTarget: function (event) { + let evt = event.getParent(3); + return evt.targets.slice(evt.num + 1); }, - content:function(){ - 'step 0' - var evt=trigger.getParent(3); - var targets=evt.targets.slice(evt.num+1); - var map=evt.customArgs; - for(var target of targets){ - var id=target.playerid; - if(!map[id]) map[id]={}; - if(typeof map[id].extraDamage!='number'){ - map[id].extraDamage=0; + content: function () { + "step 0"; + var evt = trigger.getParent(3); + var targets = evt.targets.slice(evt.num + 1); + var map = evt.customArgs; + for (var target of targets) { + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") { + map[id].extraDamage = 0; } map[id].extraDamage++; } game.delayx(); }, - } + }, }, }, - jsrgxushi:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:true, - filterTarget:lib.filter.notMe, - selectCard:[1,Infinity], - selectTarget:[1,Infinity], - position:'he', - filterOk:function(){ - return ui.selected.cards.length==ui.selected.targets.length; + jsrgxushi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + selectTarget: [1, Infinity], + position: "he", + filterOk: function () { + return ui.selected.cards.length == ui.selected.targets.length; }, - check:function(card){ - var player=get.player(); - if(ui.selected.cards.length>=game.countPlayer(current=>{ - return current!=player&&get.attitude(player,current)>0; - })) return 0; - return 5-get.value(card); + check: function (card) { + var player = get.player(); + if ( + ui.selected.cards.length >= + game.countPlayer((current) => { + return current != player && get.attitude(player, current) > 0; + }) + ) + return 0; + return 5 - get.value(card); }, - prompt:'按顺序选择卡牌和角色,并将卡牌交给对应顺序的角色。然后你获得两倍数量的【影】。', - complexSelect:true, - multitarget:true, - multiline:true, - discard:false, - lose:false, - delay:false, - contentBefore:function(){ - event.getParent()._jsrgxushi_targets=targets.slice(); + prompt: "按顺序选择卡牌和角色,并将卡牌交给对应顺序的角色。然后你获得两倍数量的【影】。", + complexSelect: true, + multitarget: true, + multiline: true, + discard: false, + lose: false, + delay: false, + contentBefore: function () { + event.getParent()._jsrgxushi_targets = targets.slice(); }, - content:function(){ - 'step 0' - var targets=event.getParent()._jsrgxushi_targets; - var list=[]; - for(var i=0;i{ - var player=get.player(),target=get.event('target'),att=get.attitude(player,target)>0?1:-1; - var list=get.event('controls').map(i=>[i,target.getCards('he').map(get.value).reduce((p,c)=>p+c,0)]).sort((a,b)=>{ - return att*(a[1]-b[1]); - }); - return list[0][0]; - }).set('target',target); - var color=result.control; - if(color=='cancel2'){ - event.finish(); - return; - } - player.logSkill('jsrgzhuiming',target); - player.popup(color,color=='red'?'fire':'thunder'); - game.log(player,'声明了',color); - var prompt=`追命:${get.translation(player)}声明了${get.translation(color)}`,prompt2=`请弃置任意张牌,然后其展示你一张牌,若此牌颜色为${get.translation(color)},此【杀】不计入次数限制、不可被响应且伤害+1` - yield target.chooseToDiscard(prompt,prompt2,[1,Infinity],'he',true).set('ai',card=>{ - var color=get.event('color'),player=get.player(); - if(get.position(card)=='e'&&get.color(card)==color) return 2; - if(player.getHp()<=2&&get.color(card)==color) return Math.random()<0.5; - return 0; - }).set('color',color); - if(target.countCards('he')) result=yield player.choosePlayerCard(target,'he',true).set('ai',button=>{ - var color=get.event('color'),att=get.event('att'); - if(get.position(button.link)=='e'&&get.color(button.link)==color){ - return 100*att; - } - return 1+Math.random(); - }).set('color',color).set('att',get.attitude(player,target)>0?1:-1); - else{ - event.finish(); - return; - } - var card=result.cards[0]; - player.showCards(card,`${get.translation(target)}因【追命】被展示`); - if(get.color(card)==color){ - trigger.directHit.addArray(game.players); - var evt=trigger.getParent(); - if(evt.addCount!==false){ - evt.addCount=false; - player.getStat().card.sha--; - } - var map=trigger.getParent().customArgs; - var id=target.playerid; - if(!map[id]) map[id]={}; - if(typeof map[id].extraDamage!='number'){ - map[id].extraDamage=0; - } - map[id].extraDamage++; - game.log(trigger.card,'不计入次数限制、不可被响应、伤害+1'); - } - } - }, - //娄圭 - jsrgshacheng:{ - audio:2, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return event.targets.some(i=>i.isIn()&&i.hasHistory('lose',evt=>evt.cards2.length))&&player.getExpansions('jsrgshacheng').length; - }, - direct:true, - group:'jsrgshacheng_build', - content:function(){ - 'step 0' - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - var targets=trigger.targets.filter(i=>i.isIn()&&i.hasHistory('lose',evt=>evt.cards2.length)); - player.chooseTarget(get.prompt('jsrgshacheng'),'令一名目标角色摸X张牌,然后移去一张“城”(X为对应角色本回合失去过的牌数且至多为5)',(card,player,target)=>{ - return get.event('targets').includes(target); - }).set('targets',targets).set('ai',target=>{ - return target==get.event('targetx')?1:0; - }).set('targetx',(()=>{ - let info=[]; - targets.filter(target=>{ - let att=get.attitude(player,target); - if(att<=0) return false; - if(Math.abs(att)>1) att=Math.sign(att)*Math.sqrt(Math.abs(att)); - info.push([target,att*target.getHistory('lose').map(evt=>evt.cards2.length).reduce((p,c)=>p+c,0)]); - return false; - }); - if(!info.length) return null; - info=info.sort((a,b)=>{ - return b[1]-a[1]; - })[0]; - if(info[1]<=0) return null; - return info[0]; - })()); - 'step 1' - if(result.bool){ - event.target=result.targets[0]; - var cards=player.getExpansions('jsrgshacheng'); - if(cards.length==1) event._result={bool:true,links:cards}; - else player.chooseButton([`沙城:移去一张“城”`,cards],true); - } - else{ - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} - event.finish(); - } - 'step 2' - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} - if(result.bool){ - player.logSkill('jsrgshacheng',target); - player.loseToDiscardpile(result.links); - target.draw(Math.min(5,target.getHistory('lose').map(evt=>evt.cards2.length).reduce((p,c)=>p+c,0))); - } - }, - marktext:'城', - intro:{ - content:'expansion', - markcount:'expansion', - }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); - }, - subSkill:{ - build:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', - }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - var cards=get.cards(2); - player.addToExpansion(cards,'gain2').gaintag.add('jsrgshacheng'); - }, - } - } - }, - jsrgninghan:{ - audio:2, - init:(player)=>{ - game.addGlobalSkill('jsrgninghan_frozen'); - }, - onremove:(player)=>{ - if(!game.hasPlayer(current=>current.hasSkill('jsrgninghan'),true)) game.removeGlobalSkill('jsrgninghan_frozen'); - }, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - if(!event.hasNature('ice')) return false; - return event.cards&&event.cards.filterInD().length; - }, - forced:true, - content:function(){ - var cards=trigger.cards.filterInD(); - player.addToExpansion(cards,'gain2').gaintag.add('jsrgshacheng'); - }, - subSkill:{ - frozen:{ - mod:{ - cardnature:function(card,player){ - if(card.name==='sha'&&get.suit(card)==='club') return 'ice'; - }, - aiOrder:(player,card,num)=>{ - if(num&&card.name==='sha'&&game.hasNature(card,'ice')){ - let lg=game.findPlayer(current=>current.hasSkill('jsrgninghan')); - if(lg) return num+0.15*Math.sign(get.attitude(player,lg)); - } - } - }, - trigger:{player:'dieAfter'}, - filter:(event,player)=>{ - return !game.hasPlayer(current=>!current.hasSkill('jsrgninghan'),true); - }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('jsrgninghan_frozen'); - } }, }, - ai:{ - combo:'jsrgshacheng' - } + }, + jsrgzhuiming: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return event.isFirstTarget && event.targets.length == 1 && event.target.isIn(); + }, + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + target = trigger.target; + var colors = Object.keys(lib.color).remove("none"); + var result = yield player + .chooseControl(colors, "cancel2") + .set("prompt", get.prompt("jsrgzhuiming")) + .set("prompt2", `声明一种颜色并令${get.translation(trigger.target)}弃置任意张牌`) + .set("ai", () => { + var player = get.player(), + target = get.event("target"), + att = get.attitude(player, target) > 0 ? 1 : -1; + var list = get + .event("controls") + .map((i) => [ + i, + target + .getCards("he") + .map(get.value) + .reduce((p, c) => p + c, 0), + ]) + .sort((a, b) => { + return att * (a[1] - b[1]); + }); + return list[0][0]; + }) + .set("target", target); + var color = result.control; + if (color == "cancel2") { + event.finish(); + return; + } + player.logSkill("jsrgzhuiming", target); + player.popup(color, color == "red" ? "fire" : "thunder"); + game.log(player, "声明了", color); + var prompt = `追命:${get.translation(player)}声明了${get.translation(color)}`, + prompt2 = `请弃置任意张牌,然后其展示你一张牌,若此牌颜色为${get.translation( + color + )},此【杀】不计入次数限制、不可被响应且伤害+1`; + yield target + .chooseToDiscard(prompt, prompt2, [1, Infinity], "he", true) + .set("ai", (card) => { + var color = get.event("color"), + player = get.player(); + if (get.position(card) == "e" && get.color(card) == color) return 2; + if (player.getHp() <= 2 && get.color(card) == color) return Math.random() < 0.5; + return 0; + }) + .set("color", color); + if (target.countCards("he")) + result = yield player + .choosePlayerCard(target, "he", true) + .set("ai", (button) => { + var color = get.event("color"), + att = get.event("att"); + if (get.position(button.link) == "e" && get.color(button.link) == color) { + return 100 * att; + } + return 1 + Math.random(); + }) + .set("color", color) + .set("att", get.attitude(player, target) > 0 ? 1 : -1); + else { + event.finish(); + return; + } + var card = result.cards[0]; + player.showCards(card, `${get.translation(target)}因【追命】被展示`); + if (get.color(card) == color) { + trigger.directHit.addArray(game.players); + var evt = trigger.getParent(); + if (evt.addCount !== false) { + evt.addCount = false; + player.getStat().card.sha--; + } + var map = trigger.getParent().customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") { + map[id].extraDamage = 0; + } + map[id].extraDamage++; + game.log(trigger.card, "不计入次数限制、不可被响应、伤害+1"); + } + }, + }, + //娄圭 + jsrgshacheng: { + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return ( + event.targets.some( + (i) => i.isIn() && i.hasHistory("lose", (evt) => evt.cards2.length) + ) && player.getExpansions("jsrgshacheng").length + ); + }, + direct: true, + group: "jsrgshacheng_build", + content: function () { + "step 0"; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + var targets = trigger.targets.filter( + (i) => i.isIn() && i.hasHistory("lose", (evt) => evt.cards2.length) + ); + player + .chooseTarget( + get.prompt("jsrgshacheng"), + "令一名目标角色摸X张牌,然后移去一张“城”(X为对应角色本回合失去过的牌数且至多为5)", + (card, player, target) => { + return get.event("targets").includes(target); + } + ) + .set("targets", targets) + .set("ai", (target) => { + return target == get.event("targetx") ? 1 : 0; + }) + .set( + "targetx", + (() => { + let info = []; + targets.filter((target) => { + let att = get.attitude(player, target); + if (att <= 0) return false; + if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); + info.push([ + target, + att * + target + .getHistory("lose") + .map((evt) => evt.cards2.length) + .reduce((p, c) => p + c, 0), + ]); + return false; + }); + if (!info.length) return null; + info = info.sort((a, b) => { + return b[1] - a[1]; + })[0]; + if (info[1] <= 0) return null; + return info[0]; + })() + ); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + var cards = player.getExpansions("jsrgshacheng"); + if (cards.length == 1) event._result = { bool: true, links: cards }; + else player.chooseButton([`沙城:移去一张“城”`, cards], true); + } else { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + event.finish(); + } + ("step 2"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (result.bool) { + player.logSkill("jsrgshacheng", target); + player.loseToDiscardpile(result.links); + target.draw( + Math.min( + 5, + target + .getHistory("lose") + .map((evt) => evt.cards2.length) + .reduce((p, c) => p + c, 0) + ) + ); + } + }, + marktext: "城", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { + build: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + var cards = get.cards(2); + player.addToExpansion(cards, "gain2").gaintag.add("jsrgshacheng"); + }, + }, + }, + }, + jsrgninghan: { + audio: 2, + init: (player) => { + game.addGlobalSkill("jsrgninghan_frozen"); + }, + onremove: (player) => { + if (!game.hasPlayer((current) => current.hasSkill("jsrgninghan"), true)) + game.removeGlobalSkill("jsrgninghan_frozen"); + }, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!event.hasNature("ice")) return false; + return event.cards && event.cards.filterInD().length; + }, + forced: true, + content: function () { + var cards = trigger.cards.filterInD(); + player.addToExpansion(cards, "gain2").gaintag.add("jsrgshacheng"); + }, + subSkill: { + frozen: { + mod: { + cardnature: function (card, player) { + if (card.name === "sha" && get.suit(card) === "club") return "ice"; + }, + aiOrder: (player, card, num) => { + if (num && card.name === "sha" && game.hasNature(card, "ice")) { + let lg = game.findPlayer((current) => current.hasSkill("jsrgninghan")); + if (lg) return num + 0.15 * Math.sign(get.attitude(player, lg)); + } + }, + }, + trigger: { player: "dieAfter" }, + filter: (event, player) => { + return !game.hasPlayer((current) => !current.hasSkill("jsrgninghan"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("jsrgninghan_frozen"); + }, + }, + }, + ai: { + combo: "jsrgshacheng", + }, }, //张任 - jsrgfuni:{ - audio:2, - trigger:{global:'roundStart'}, - group:['jsrgfuni_unlimit','jsrgfuni_zero'], - forced:true, - direct:true, - content:function*(event,map){ - var player=map.player,trigger=map.trigger; - var count=Math.ceil(game.countPlayer()/2); - var result=yield player.chooseTarget(`伏匿:请选择至多${get.cnNumber(count)}名角色`,`令这些角色获得共计${get.cnNumber(count)}张【影】`,true,[1,count]).set('ai',target=>{ - return get.attitude(get.player(),target)+get.event().getRand(target.playerid); - }); - if(result.bool){ - var targets=result.targets.slice().sortBySeat(_status.currentPhase); - player.logSkill('jsrgfuni',targets); - } - else event.finish(); + jsrgfuni: { + audio: 2, + trigger: { global: "roundStart" }, + group: ["jsrgfuni_unlimit", "jsrgfuni_zero"], + forced: true, + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + var count = Math.ceil(game.countPlayer() / 2); + var result = yield player + .chooseTarget( + `伏匿:请选择至多${get.cnNumber(count)}名角色`, + `令这些角色获得共计${get.cnNumber(count)}张【影】`, + true, + [1, count] + ) + .set("ai", (target) => { + return get.attitude(get.player(), target) + get.event().getRand(target.playerid); + }); + if (result.bool) { + var targets = result.targets.slice().sortBySeat(_status.currentPhase); + player.logSkill("jsrgfuni", targets); + } else event.finish(); yield null; - var num=count/targets.length; - if(num==1||num==count){ - result={ - bool:true, - links:targets.map(current=>{ + var num = count / targets.length; + if (num == 1 || num == count) { + result = { + bool: true, + links: targets.map((current) => { return `${num}|${current.playerid}`; }), }; - } - else{ - var dialog=[ - '伏匿:选择每名角色要获得的【影】数', - ]; - var len=count-targets.length+1; - for(var target of targets){ + } else { + var dialog = ["伏匿:选择每名角色要获得的【影】数"]; + var len = count - targets.length + 1; + for (var target of targets) { dialog.addArray([ `
    ${get.translation(target)}
    `, - [Array.from({length:len}).map((_,i)=>{ - return [`${i+1}|${target.playerid}`,get.cnNumber(i+1,true)]; - }),'tdnodes'], + [ + Array.from({ length: len }).map((_, i) => { + return [`${i + 1}|${target.playerid}`, get.cnNumber(i + 1, true)]; + }), + "tdnodes", + ], ]); } - result=yield player.chooseButton(dialog,true).set('filterButton',button=>{ - var total=0,info=button.link.split('|'); - var numFix=0; - for(var buttonx of ui.selected.buttons){ - var infox=buttonx.link.split('|'); - var num=parseInt(infox[0]); - total+=num; - if(infox[1]==info[1]) numFix=num; - } - return total+parseInt(info[0])-numFix<=get.event('count'); - }).set('count',count).set('filterOk',()=>{ - var total=0; - for(var buttonx of ui.selected.buttons){ - total+=parseInt(buttonx.link.split('|')[0]); - } - return total==get.event('count'); - }).set('selectButton',()=>{ - return [get.event('len'),Math.max(get.event('len'),ui.selected.buttons.length)+1]; - }).set('len',targets.length).set('custom',{ - add:{}, - replace:{ - button:function(button){ - if(!_status.event.isMine()) return; - if(button.classList.contains('selectable')==false) return; - if(button.classList.contains('selected')){ - ui.selected.buttons.remove(button); - button.classList.remove('selected'); - if(_status.multitarget||_status.event.complexSelect){ - game.uncheck(); - game.check(); + result = yield player + .chooseButton(dialog, true) + .set("filterButton", (button) => { + var total = 0, + info = button.link.split("|"); + var numFix = 0; + for (var buttonx of ui.selected.buttons) { + var infox = buttonx.link.split("|"); + var num = parseInt(infox[0]); + total += num; + if (infox[1] == info[1]) numFix = num; + } + return total + parseInt(info[0]) - numFix <= get.event("count"); + }) + .set("count", count) + .set("filterOk", () => { + var total = 0; + for (var buttonx of ui.selected.buttons) { + total += parseInt(buttonx.link.split("|")[0]); + } + return total == get.event("count"); + }) + .set("selectButton", () => { + return [ + get.event("len"), + Math.max(get.event("len"), ui.selected.buttons.length) + 1, + ]; + }) + .set("len", targets.length) + .set("custom", { + add: {}, + replace: { + button: function (button) { + if (!_status.event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + if (button.classList.contains("selected")) { + ui.selected.buttons.remove(button); + button.classList.remove("selected"); + if (_status.multitarget || _status.event.complexSelect) { + game.uncheck(); + game.check(); + } + } else { + var current = button.parentNode.querySelector(".selected"); + if (current) { + ui.selected.buttons.remove(current); + current.classList.remove("selected"); + } + button.classList.add("selected"); + ui.selected.buttons.add(button); } - } - else{ - var current=button.parentNode.querySelector('.selected'); - if(current){ - ui.selected.buttons.remove(current); - current.classList.remove('selected'); - } - button.classList.add('selected'); - ui.selected.buttons.add(button); - } - game.check(); + game.check(); + }, }, - } - }).set('processAI',()=>{ - return get.event('aiResult'); - }).set('aiResult',(()=>{ - var result=targets.map(i=>{ - return [i==player?2:1,i.playerid]; - }); - var rest=count-targets.length-1; - while(rest--) result[Math.floor(Math.random()*result.length)][0]++; - return { - bool:true, - links:result.map(i=>`${i[0]}|${i[1]}`), - }; - })()); + }) + .set("processAI", () => { + return get.event("aiResult"); + }) + .set( + "aiResult", + (() => { + var result = targets.map((i) => { + return [i == player ? 2 : 1, i.playerid]; + }); + var rest = count - targets.length - 1; + while (rest--) result[Math.floor(Math.random() * result.length)][0]++; + return { + bool: true, + links: result.map((i) => `${i[0]}|${i[1]}`), + }; + })() + ); } - if(result.bool){ - var links=result.links; - var list=[]; - for(var link of links){ - var info=link.split('|'); - var id=info[1]; - var target=(_status.connectMode?lib.playerOL:game.playerMap)[id]; + if (result.bool) { + var links = result.links; + var list = []; + for (var link of links) { + var info = link.split("|"); + var id = info[1]; + var target = (_status.connectMode ? lib.playerOL : game.playerMap)[id]; player.line(target); - var yings=lib.card.ying.getYing(parseInt(info[0])); - list.push([target,yings]); - game.log(target,'获得了',yings); + var yings = lib.card.ying.getYing(parseInt(info[0])); + list.push([target, yings]); + game.log(target, "获得了", yings); } game.loseAsync({ - gain_list:list, - animate:'gain2', - }).setContent('gaincardMultiple'); + gain_list: list, + animate: "gain2", + }).setContent("gaincardMultiple"); } }, - subSkill:{ - zero:{ - priority:Infinity, - mod:{ - attackRange:()=>0, + subSkill: { + zero: { + priority: Infinity, + mod: { + attackRange: () => 0, }, }, - unlimit:{ - audio:'jsrgfuni', - trigger:{ - global:['loseAfter','loseAsyncAfter','cardsDiscardAfter'], + unlimit: { + audio: "jsrgfuni", + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter"], }, - filter:function(event,player){ - return event.getd().some(i=>get.name(i,false)=='ying'); + filter: function (event, player) { + return event.getd().some((i) => get.name(i, false) == "ying"); }, - forced:true, - content:function(){ - player.addTempSkill('jsrgfuni_buff'); + forced: true, + content: function () { + player.addTempSkill("jsrgfuni_buff"); }, }, - buff:{ - charlotte:true, - trigger:{player:'useCard1'}, - forced:true, - popup:false, - content:function(){ + buff: { + charlotte: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + content: function () { trigger.directHit.addArray(game.players); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); }, - mark:true, - intro:{ - content:'使用牌无距离限制且不能被响应', + mark: true, + intro: { + content: "使用牌无距离限制且不能被响应", }, - mod:{ - targetInRange:()=>true, + mod: { + targetInRange: () => true, }, }, }, - ai:{ - expose:0.15, + ai: { + expose: 0.15, }, }, - jsrgchuanxin:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('hes')&&game.hasPlayer(current=>player.canUse({ - name:'sha', - storage:{jsrgchuanxin:true}, - },current)); + jsrgchuanxin: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.countCards("hes") && + game.hasPlayer((current) => + player.canUse( + { + name: "sha", + storage: { jsrgchuanxin: true }, + }, + current + ) + ) + ); }, - direct:true, - content:function(){ - var next=player.chooseToUse(); - next.set('openskilldialog',`###${get.prompt('jsrgchuanxin')}###将一张牌当【杀】使用,且当一名角色受到此【杀】伤害时,此伤害+X(X为其本回合回复过的体力值)。`); - next.set('norestore',true); - next.set('_backupevent','jsrgchuanxin_backup'); - next.set('addCount',false); - next.set('logSkill','jsrgchuanxin'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + direct: true, + content: function () { + var next = player.chooseToUse(); + next.set( + "openskilldialog", + `###${get.prompt( + "jsrgchuanxin" + )}###将一张牌当【杀】使用,且当一名角色受到此【杀】伤害时,此伤害+X(X为其本回合回复过的体力值)。` + ); + next.set("norestore", true); + next.set("_backupevent", "jsrgchuanxin_backup"); + next.set("addCount", false); + next.set("logSkill", "jsrgchuanxin"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('jsrgchuanxin_backup'); + next.backup("jsrgchuanxin_backup"); }, - subSkill:{ - backup:{ - filterCard:function(card){ - return get.itemtype(card)=='card'; + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; }, - viewAs:{ - name:'sha', - storage:{jsrgchuanxin:true}, + viewAs: { + name: "sha", + storage: { jsrgchuanxin: true }, }, - selectCard:1, - position:'hes', - ai1:function(card){ - var player=get.player(); - var maxVal=5.5; - if(get.name(card,false)=='ying'&&player.hasSkill('jsrgchuanxin')) maxVal-=3; - return maxVal-get.value(card); + selectCard: 1, + position: "hes", + ai1: function (card) { + var player = get.player(); + var maxVal = 5.5; + if (get.name(card, false) == "ying" && player.hasSkill("jsrgchuanxin")) + maxVal -= 3; + return maxVal - get.value(card); }, - precontent:function(){ + precontent: function () { delete event.result.skill; - player.addTempSkill('jsrgchuanxin_add'); + player.addTempSkill("jsrgchuanxin_add"); }, }, - add:{ - trigger:{global:'damageBegin3'}, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.jsrgchuanxin) return false; - if(event.getParent().type!='card') return false; - return game.hasGlobalHistory('changeHp',evt=>{ - return evt.getParent().name=='recover'&&evt.player==event.player; + add: { + trigger: { global: "damageBegin3" }, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.jsrgchuanxin) + return false; + if (event.getParent().type != "card") return false; + return game.hasGlobalHistory("changeHp", (evt) => { + return evt.getParent().name == "recover" && evt.player == event.player; }); }, - forced:true, - charlotte:true, - content:function(){ - var num=game.getGlobalHistory('changeHp',evt=>{ - return evt.getParent().name=='recover'&&evt.player==trigger.player; - }).map(evt=>evt.num).reduce((p,c)=>p+c,0); - trigger.num+=num; - game.log(trigger.card,'的伤害+'+num); + forced: true, + charlotte: true, + content: function () { + var num = game + .getGlobalHistory("changeHp", (evt) => { + return evt.getParent().name == "recover" && evt.player == trigger.player; + }) + .map((evt) => evt.num) + .reduce((p, c) => p + c, 0); + trigger.num += num; + game.log(trigger.card, "的伤害+" + num); }, }, }, }, //黄忠 - jsrgcuifeng:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'orange', - locked:false, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - var info=lib.card[name]; - if(!info||info.notarget||(info.selectTarget&&info.selectTarget!=1)||!get.tag({name:name},'damage')) continue; - if(name=='sha'){ - list.push(['基本','','sha']); - for(var nature of lib.inpile_nature) list.push(['基本','',name,nature]); - } - else if(get.type(name)=='trick') list.push(['锦囊','',name]); - else if(get.type(name)=='basic') list.push(['基本','',name]); + jsrgcuifeng: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + locked: false, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if ( + !info || + info.notarget || + (info.selectTarget && info.selectTarget != 1) || + !get.tag({ name: name }, "damage") + ) + continue; + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var nature of lib.inpile_nature) list.push(["基本", "", name, nature]); + } else if (get.type(name) == "trick") list.push(["锦囊", "", name]); + else if (get.type(name) == "basic") list.push(["基本", "", name]); } - return ui.create.dialog('摧锋',[list,'vcard']); + return ui.create.dialog("摧锋", [list, "vcard"]); }, - filter:function(button,player){ - return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3],isCard:true,storage:{jsrgcuifeng:true},},player,_status.event.getParent()); + filter: function (button, player) { + return _status.event + .getParent() + .filterCard( + { + name: button.link[2], + nature: button.link[3], + isCard: true, + storage: { jsrgcuifeng: true }, + }, + player, + _status.event.getParent() + ); }, - check:function(button){ - var player=_status.event.player; - var effect=player.getUseValue({name:button.link[2],nature:button.link[3],storage:{jsrgcuifeng:true}}); - if(effect>0) return effect; + check: function (button) { + var player = _status.event.player; + var effect = player.getUseValue({ + name: button.link[2], + nature: button.link[3], + storage: { jsrgcuifeng: true }, + }); + if (effect > 0) return effect; return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'jsrgcuifeng', - selectCard:-1, - filterCard:()=>false, - popname:true, - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, - storage:{jsrgcuifeng:true}, + audio: "jsrgcuifeng", + selectCard: -1, + filterCard: () => false, + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, + storage: { jsrgcuifeng: true }, }, - precontent:function(){ - player.logSkill('jsrgcuifeng'); - player.awakenSkill('jsrgcuifeng'); + precontent: function () { + player.logSkill("jsrgcuifeng"); + player.awakenSkill("jsrgcuifeng"); delete event.result.skill; - if(!player.storage.jsrgcuifeng_check) player.when('phaseEnd').then(()=>{ - var num=0; - player.checkHistory('sourceDamage',evt=>{ - if(evt.card.storage.jsrgcuifeng) num+=evt.num; - }); - if(num==0||num>1){ - player.restoreSkill('jsrgcuifeng'); - game.log(player,'重置了','#g【摧锋】'); - } - delete player.storage.jsrgcuifeng_check; - }).translation('摧锋'); - player.setStorage('jsrgcuifeng_check',true); - } - } + if (!player.storage.jsrgcuifeng_check) + player + .when("phaseEnd") + .then(() => { + var num = 0; + player.checkHistory("sourceDamage", (evt) => { + if (evt.card.storage.jsrgcuifeng) num += evt.num; + }); + if (num == 0 || num > 1) { + player.restoreSkill("jsrgcuifeng"); + game.log(player, "重置了", "#g【摧锋】"); + } + delete player.storage.jsrgcuifeng_check; + }) + .translation("摧锋"); + player.setStorage("jsrgcuifeng_check", true); + }, + }; }, - prompt:function(links,player){ - return '请选择'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'的目标'; - } - }, - mod:{ - targetInRange:card=>{ - if(card.storage&&card.storage.jsrgcuifeng) return true; + prompt: function (links, player) { + return ( + "请选择" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "的目标" + ); }, }, - ai:{ - order:1.9, - result:{ - player:1, + mod: { + targetInRange: (card) => { + if (card.storage && card.storage.jsrgcuifeng) return true; + }, + }, + ai: { + order: 1.9, + result: { + player: 1, }, }, }, - jsrgdengnan:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'orange', - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - var info=lib.card[name]; - if(!info||info.type!='trick'||info.notarget||get.tag({name:name},'damage')) continue; - list.push(['锦囊','',name]); + jsrgdengnan: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if ( + !info || + info.type != "trick" || + info.notarget || + get.tag({ name: name }, "damage") + ) + continue; + list.push(["锦囊", "", name]); } - return ui.create.dialog('登难',[list,'vcard']); + return ui.create.dialog("登难", [list, "vcard"]); }, - filter:function(button,player){ - return _status.event.getParent().filterCard({name:button.link[2],isCard:true},player,_status.event.getParent()); + filter: function (button, player) { + return _status.event + .getParent() + .filterCard( + { name: button.link[2], isCard: true }, + player, + _status.event.getParent() + ); }, - check:function(button){ - var player=_status.event.player; + check: function (button) { + var player = _status.event.player; return player.getUseValue(button.link[2]); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'jsrgdengnan', - selectCard:-1, - filterCard:()=>false, - popname:true, - viewAs:{ - name:links[0][2], - isCard:true, - storage:{jsrgdengnan:true}, + audio: "jsrgdengnan", + selectCard: -1, + filterCard: () => false, + popname: true, + viewAs: { + name: links[0][2], + isCard: true, + storage: { jsrgdengnan: true }, }, - precontent:function(){ - player.logSkill('jsrgdengnan'); - player.awakenSkill('jsrgdengnan'); + precontent: function () { + player.logSkill("jsrgdengnan"); + player.awakenSkill("jsrgdengnan"); delete event.result.skill; - if(!player.storage.jsrgdengnan_check) player.when('phaseEnd').then(()=>{ - var targets=[]; - player.checkHistory('useCard',evt=>{ - if(evt.card.storage.jsrgdengnan) targets.addArray(evt.targets); - }); - if(targets.every(current=>{ - return current.hasHistory('damage'); - })){ - player.restoreSkill('jsrgdengnan'); - game.log(player,'重置了','#g【登难】'); - } - delete player.storage.jsrgdengnan_check; - }).translation('登难'); - player.setStorage('jsrgdengnan_check',true); - } - } + if (!player.storage.jsrgdengnan_check) + player + .when("phaseEnd") + .then(() => { + var targets = []; + player.checkHistory("useCard", (evt) => { + if (evt.card.storage.jsrgdengnan) + targets.addArray(evt.targets); + }); + if ( + targets.every((current) => { + return current.hasHistory("damage"); + }) + ) { + player.restoreSkill("jsrgdengnan"); + game.log(player, "重置了", "#g【登难】"); + } + delete player.storage.jsrgdengnan_check; + }) + .translation("登难"); + player.setStorage("jsrgdengnan_check", true); + }, + }; + }, + prompt: function (links, player) { + return ( + "请选择" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "的目标" + ); }, - prompt:function(links,player){ - return '请选择'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'的目标'; - } }, - ai:{ - order:2, - result:{ - player:1, + ai: { + order: 2, + result: { + player: 1, }, }, }, //夏侯荣 - jsrgfenjian:{ - audio:2, - enable:'chooseToUse', - locked:false, - filter:function(event,player){ - return ['juedou','tao'].some(name=>{ - return !player.getStorage('jsrgfenjian_used').includes(name)&&event.filterCard({ - name:name, - isCard:true, - storage:{jsrgfenjian:true}, - },player,event); + jsrgfenjian: { + audio: 2, + enable: "chooseToUse", + locked: false, + filter: function (event, player) { + return ["juedou", "tao"].some((name) => { + return ( + !player.getStorage("jsrgfenjian_used").includes(name) && + event.filterCard( + { + name: name, + isCard: true, + storage: { jsrgfenjian: true }, + }, + player, + event + ) + ); }); }, - hiddenCard:function(player,name){ - if(['juedou','tao'].some(i=>i==name&&!player.getStorage('jsrgfenjian_used').includes(name))) return true; + hiddenCard: function (player, name) { + if ( + ["juedou", "tao"].some( + (i) => i == name && !player.getStorage("jsrgfenjian_used").includes(name) + ) + ) + return true; return false; }, - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('奋剑',[['juedou','tao'].filter(name=>!player.getStorage('jsrgfenjian_used').includes(name)),'vcard']); - dialog.direct=true; + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("奋剑", [ + ["juedou", "tao"].filter( + (name) => !player.getStorage("jsrgfenjian_used").includes(name) + ), + "vcard", + ]); + dialog.direct = true; return dialog; }, - filter:function(button,player){ - var evt=_status.event.getParent(); - return evt.filterCard({ - name:button.link[2], - isCard:true, - storage:{jsrgfenjian:true}, - },player,evt); + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard( + { + name: button.link[2], + isCard: true, + storage: { jsrgfenjian: true }, + }, + player, + evt + ); }, - check:function(button){ - if(button.link[2]==='tao'){ - let dying=_status.event.getParent(2).dying; - if(dying) return get.effect(dying,{ - name:'tao', - isCard:true, - storage:{jsrgfenjian:true}, - },_status.event.player); + check: function (button) { + if (button.link[2] === "tao") { + let dying = _status.event.getParent(2).dying; + if (dying) + return get.effect( + dying, + { + name: "tao", + isCard: true, + storage: { jsrgfenjian: true }, + }, + _status.event.player + ); } return _status.event.player.getUseValue({ - name:button.link[2], - isCard:true, - storage:{jsrgfenjian:true}, + name: button.link[2], + isCard: true, + storage: { jsrgfenjian: true }, }); }, - backup:function(links){ + backup: function (links) { return { - audio:'jsrgfenjian', - viewAs:{ - name:links[0][2], - isCard:true, - storage:{jsrgfenjian:true}, + audio: "jsrgfenjian", + viewAs: { + name: links[0][2], + isCard: true, + storage: { jsrgfenjian: true }, }, - filterCard:()=>false, - selectCard:-1, - precontent:function(){ - player.logSkill('jsrgfenjian'); + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.logSkill("jsrgfenjian"); delete event.result.skill; - player.addTempSkill('jsrgfenjian_effect'); - player.addMark('jsrgfenjian_effect',1,false); - if(!player.storage.jsrgfenjian_used) player.when({global:'phaseAfter'}).then(()=>{ - delete player.storage.jsrgfenjian_used; - }); - player.markAuto('jsrgfenjian_used',[event.result.card.name]); + player.addTempSkill("jsrgfenjian_effect"); + player.addMark("jsrgfenjian_effect", 1, false); + if (!player.storage.jsrgfenjian_used) + player.when({ global: "phaseAfter" }).then(() => { + delete player.storage.jsrgfenjian_used; + }); + player.markAuto("jsrgfenjian_used", [event.result.card.name]); }, - } + }; }, - prompt:function(links){ - return '奋剑:令你本回合受到的伤害+1,视为使用'+get.translation(links[0][2]); + prompt: function (links) { + return "奋剑:令你本回合受到的伤害+1,视为使用" + get.translation(links[0][2]); }, }, - mod:{ - targetEnabled:function(card,player,target){ - if(player==target&&card.storage&&card.storage.jsrgfenjian) return false; + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.jsrgfenjian) return false; }, }, - ai:{ - order:function(item,player){ - return Math.max(get.order({name:'juedou'}),get.order({name:'tao'}))+0.2; + ai: { + order: function (item, player) { + return Math.max(get.order({ name: "juedou" }), get.order({ name: "tao" })) + 0.2; }, - result:{ - player:(player)=>{ - if(_status.event.dying) return 2*get.sgnAttitude(player,_status.event.dying); + result: { + player: (player) => { + if (_status.event.dying) return 2 * get.sgnAttitude(player, _status.event.dying); return 1; - } - } - }, - subSkill:{ - effect:{ - audio:'jsrgfenjian', - charlotte:true, - trigger:{player:'damageBegin3'}, - forced:true, - onremove:true, - content:function(){ - trigger.num+=player.countMark('jsrgfenjian_effect'); }, - intro:{content:'本回合受到的伤害+#'}, + }, + }, + subSkill: { + effect: { + audio: "jsrgfenjian", + charlotte: true, + trigger: { player: "damageBegin3" }, + forced: true, + onremove: true, + content: function () { + trigger.num += player.countMark("jsrgfenjian_effect"); + }, + intro: { content: "本回合受到的伤害+#" }, }, }, }, //孙尚香 - jsrgguiji:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(player.hasSkill('jsrgguiji_used')) return false; - return game.hasPlayer(current=>lib.skill.jsrgguiji.filterTarget('keiki',player,current)); + jsrgguiji: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("jsrgguiji_used")) return false; + return game.hasPlayer((current) => + lib.skill.jsrgguiji.filterTarget("keiki", player, current) + ); }, - filterTarget:function(card,player,target){ - return target.countCards('h')get.value(i)).reduce((p,c)=>p+c,0); - var val2=target.getCards('h').map(i=>get.value(i)).reduce((p,c)=>p+c,0); - return val-val2; - } - } + ai: { + order: 6, + result: { + target: function (player, target) { + var val = player + .getCards("h") + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0); + var val2 = target + .getCards("h") + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0); + return val - val2; + }, + }, }, - subSkill:{ - used:{charlotte:true}, - swapback:{ - audio:'jsrgguiji', - trigger:{ - global:['phaseUseEnd','dieAfter'], + subSkill: { + used: { charlotte: true }, + swapback: { + audio: "jsrgguiji", + trigger: { + global: ["phaseUseEnd", "dieAfter"], }, - filter:function(event,player){ - return player.getStorage('jsrgguiji_swapback').includes(event.player); + filter: function (event, player) { + return player.getStorage("jsrgguiji_swapback").includes(event.player); }, - charlotte:true, - direct:true, - check:function(event,player){ - return player.getCards('h').map(i=>get.value(i)).reduce((p,c)=>p+c,0)get.value(i)).reduce((p,c)=>p+c,0)+4*Math.random(); + charlotte: true, + direct: true, + check: function (event, player) { + return ( + player + .getCards("h") + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0) < + event.player + .getCards("h") + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0) + + 4 * Math.random() + ); }, - content:function(){ - 'step 0' - if(trigger.name=='phaseUse'){ - player.chooseBool(get.prompt('jsrgguiji_swapback',trigger.player),'与其交换手牌。').set('ai',()=>{ - return get.event('bool'); - }).set('bool',lib.skill.jsrgguiji_swapback.check(trigger,player)>0); - } - else{ - player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); + content: function () { + "step 0"; + if (trigger.name == "phaseUse") { + player + .chooseBool( + get.prompt("jsrgguiji_swapback", trigger.player), + "与其交换手牌。" + ) + .set("ai", () => { + return get.event("bool"); + }) + .set("bool", lib.skill.jsrgguiji_swapback.check(trigger, player) > 0); + } else { + player.unmarkAuto("jsrgguiji_swapback", [trigger.player]); event.finish(); } - 'step 1' - if(result.bool){ - player.logSkill('jsrgguiji_swapback',trigger.player); + ("step 1"); + if (result.bool) { + player.logSkill("jsrgguiji_swapback", trigger.player); player.swapHandcards(trigger.player); } - player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); + player.unmarkAuto("jsrgguiji_swapback", [trigger.player]); }, - intro:{ - content:'$的下个出牌阶段结束时,你可以与其交换手牌' + intro: { + content: "$的下个出牌阶段结束时,你可以与其交换手牌", }, }, }, }, - jsrgjiaohao:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return [1,2,3,4,5].some(i=>player.countEmptySlot(i)); + jsrgjiaohao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return [1, 2, 3, 4, 5].some((i) => player.countEmptySlot(i)); }, - forced:true, - locked:false, - global:'jsrgjiaohao_g', - content:function(){ - 'step 0' - var count=Math.ceil([1,2,3,4,5].map(i=>player.countEmptySlot(i)).reduce((p,c)=>p+c,0)/2); - player.gain(lib.card.ying.getYing(count),'gain2'); + forced: true, + locked: false, + global: "jsrgjiaohao_g", + content: function () { + "step 0"; + var count = Math.ceil( + [1, 2, 3, 4, 5].map((i) => player.countEmptySlot(i)).reduce((p, c) => p + c, 0) / 2 + ); + player.gain(lib.card.ying.getYing(count), "gain2"); }, - subSkill:{ - g:{ - audio:'jsrgjiaohao', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(current=>{ - if(current==player||!current.hasSkill('jsrgjiaohao')) return false; - return player.hasCard(card=>{ - return get.type(card)=='equip'&¤t.canEquip(card); + subSkill: { + g: { + audio: "jsrgjiaohao", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => { + if (current == player || !current.hasSkill("jsrgjiaohao")) return false; + return player.hasCard((card) => { + return get.type(card) == "equip" && current.canEquip(card); }); }); }, - filterTarget:function(card,player,target){ - if(target.isMin()) return false; - return target!=player&&target.hasSkill('jsrgjiaohao')&&target.canEquip(card); + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + return ( + target != player && target.hasSkill("jsrgjiaohao") && target.canEquip(card) + ); }, - selectTarget:function(){ - var num=game.countPlayer(current=>{ - return current.hasSkill('jsrgjiaohao'); + selectTarget: function () { + var num = game.countPlayer((current) => { + return current.hasSkill("jsrgjiaohao"); }); - return num>1?1:-1; + return num > 1 ? 1 : -1; }, - filterCard:function(card){ - return get.type(card)=='equip'; + filterCard: function (card) { + return get.type(card) == "equip"; }, - check:function(card){ - var player=get.player(); - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); + check: function (card) { + var player = get.player(); + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); } - return 6-get.value(card); + return 6 - get.value(card); }, - prompt:function(){ - var list=game.filterPlayer(current=>{ - return current.hasSkill('jsrgjiaohao'); + prompt: function () { + var list = game.filterPlayer((current) => { + return current.hasSkill("jsrgjiaohao"); }); - return `将一张装备牌置于${get.translation(list)}${list.length>1?'中的一人':''}的装备区`; + return `将一张装备牌置于${get.translation(list)}${ + list.length > 1 ? "中的一人" : "" + }的装备区`; }, - discard:false, - lose:false, - prepare:function(cards,player,targets){ - player.$give(cards,targets[0],false); + discard: false, + lose: false, + prepare: function (cards, player, targets) { + player.$give(cards, targets[0], false); }, - content:function(){ + content: function () { target.equip(cards[0]); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - var card=ui.selected.cards[0]; - if(card) return get.effect(target,card,target,target); + ai: { + order: 10, + result: { + target: function (player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); return 0; }, }, }, }, - } + }, }, //庞统 - jsrgmanjuan:{ - audio:2, - trigger:{ - player:'loseEnd', - global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + jsrgmanjuan: { + audio: 2, + trigger: { + player: "loseEnd", + global: ["equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"], }, - filter:function(event,player){ - return (player.countCards('h')==0)^player.hasSkill('jsrgmanjuan_in'); + filter: function (event, player) { + return (player.countCards("h") == 0) ^ player.hasSkill("jsrgmanjuan_in"); }, - forced:true, - locked:false, - firstDo:true, - silent:true, - content:function(){ - 'step 0' - if(!player.countCards('h')){ - var cards=[]; - game.checkGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ - cards.addArray(evt.cards.filterInD('d')); + forced: true, + locked: false, + firstDo: true, + silent: true, + content: function () { + "step 0"; + if (!player.countCards("h")) { + var cards = []; + game.checkGlobalHistory("cardMove", (evt) => { + if ( + (evt.name == "lose" && evt.position == ui.discardPile) || + evt.name == "cardsDiscard" + ) { + cards.addArray(evt.cards.filterInD("d")); } }); - var cardsx=cards.map(card=>{ - var cardx=ui.create.card(); + var cardsx = cards.map((card) => { + var cardx = ui.create.card(); cardx.init(get.cardInfo(card)); - cardx._cardid=card.cardid; + cardx._cardid = card.cardid; return cardx; }); - player.directgains(cardsx,null,'jsrgmanjuan'); - player.addSkill('jsrgmanjuan_in'); - } - else{ - player.removeSkill('jsrgmanjuan_in'); + player.directgains(cardsx, null, "jsrgmanjuan"); + player.addSkill("jsrgmanjuan_in"); + } else { + player.removeSkill("jsrgmanjuan_in"); } }, - subSkill:{ - in:{ - audio:'jsrgmanjuan', - trigger:{ - global:['loseAfter','loseAsyncAfter','cardsDiscardAfter','equipAfter'], + subSkill: { + in: { + audio: "jsrgmanjuan", + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], }, - forced:true, - locked:false, - silent:true, - filter:function(event,player){ - var cards=event.getd(); + forced: true, + locked: false, + silent: true, + filter: function (event, player) { + var cards = event.getd(); return cards.length; }, - onremove:function(player){ - var cards2=player.getCards('s',card=>{ - return card.hasGaintag('jsrgmanjuan'); + onremove: function (player) { + var cards2 = player.getCards("s", (card) => { + return card.hasGaintag("jsrgmanjuan"); }); - if(player.isOnline2()){ - player.send(function(cards,player){ - cards.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - },cards2,player); + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); } - cards2.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); + cards2.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); }, - group:['jsrgmanjuan_use','jsrgmanjuan_lose'], - content:function(){ - var cards=[]; - var idList=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')).map(i=>i._cardid); - game.checkGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ - cards.addArray(evt.cards.filter(i=>get.position(i,true)=='d'&&!idList.includes(i.cardid))); + group: ["jsrgmanjuan_use", "jsrgmanjuan_lose"], + content: function () { + var cards = []; + var idList = player + .getCards("s", (card) => card.hasGaintag("jsrgmanjuan")) + .map((i) => i._cardid); + game.checkGlobalHistory("cardMove", (evt) => { + if ( + (evt.name == "lose" && evt.position == ui.discardPile) || + evt.name == "cardsDiscard" + ) { + cards.addArray( + evt.cards.filter( + (i) => get.position(i, true) == "d" && !idList.includes(i.cardid) + ) + ); } }); - var cards2=cards.map(card=>{ - var cardx=ui.create.card(); + var cards2 = cards.map((card) => { + var cardx = ui.create.card(); cardx.init(get.cardInfo(card)); - cardx._cardid=card.cardid; + cardx._cardid = card.cardid; return cardx; }); - player.directgains(cards2,null,'jsrgmanjuan'); + player.directgains(cards2, null, "jsrgmanjuan"); }, - mod:{ - cardEnabled2:function(card,player){ - if(get.itemtype(card)=='card'&&card.hasGaintag('jsrgmanjuan')&&player.getStorage('jsrgmanjuan_used').includes(get.number(card,false))) return false; + mod: { + cardEnabled2: function (card, player) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("jsrgmanjuan") && + player.getStorage("jsrgmanjuan_used").includes(get.number(card, false)) + ) + return false; }, }, }, - use:{ - trigger:{ - player:['useCardBefore','respondBefore'], + use: { + trigger: { + player: ["useCardBefore", "respondBefore"], }, - charlotte:true, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - var cards=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')&&card._cardid); - return event.cards&&event.cards.some(card=>{ - return cards.includes(card); - }); + charlotte: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + var cards = player.getCards( + "s", + (card) => card.hasGaintag("jsrgmanjuan") && card._cardid + ); + return ( + event.cards && + event.cards.some((card) => { + return cards.includes(card); + }) + ); }, - content:function(){ - var idList=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')).map(i=>i._cardid); - var cards=[]; - game.checkGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ - cards.addArray(evt.cards.filter(i=>idList.includes(i.cardid))); + content: function () { + var idList = player + .getCards("s", (card) => card.hasGaintag("jsrgmanjuan")) + .map((i) => i._cardid); + var cards = []; + game.checkGlobalHistory("cardMove", (evt) => { + if ( + (evt.name == "lose" && evt.position == ui.discardPile) || + evt.name == "cardsDiscard" + ) { + cards.addArray(evt.cards.filter((i) => idList.includes(i.cardid))); } }); - var cards2=[]; - for(var card of trigger.cards){ - var cardx=cards.find(cardx=>cardx.cardid==card._cardid); - if(cardx) cards2.push(cardx); + var cards2 = []; + for (var card of trigger.cards) { + var cardx = cards.find((cardx) => cardx.cardid == card._cardid); + if (cardx) cards2.push(cardx); } - var cards3=trigger.cards.slice(); - trigger.cards=cards2; - trigger.card.cards=cards2; - if(player.isOnline2()){ - player.send(function(cards,player){ - cards.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - },cards3,player); + var cards3 = trigger.cards.slice(); + trigger.cards = cards2; + trigger.card.cards = cards2; + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards3, + player + ); } - cards3.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - if(!player.storage.jsrgmanjuan_used){ - player.when({global:'phaseAfter'}) - .then(()=>{ - delete player.storage.jsrgmanjuan_used; - }) + cards3.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + if (!player.storage.jsrgmanjuan_used) { + player.when({ global: "phaseAfter" }).then(() => { + delete player.storage.jsrgmanjuan_used; + }); } - player.markAuto('jsrgmanjuan_used',cards3.map(card=>get.number(card,false))); + player.markAuto( + "jsrgmanjuan_used", + cards3.map((card) => get.number(card, false)) + ); }, }, - lose:{ - trigger:{ - global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd','cardsGotoOrderingBegin','phaseAfter'], + lose: { + trigger: { + global: [ + "loseEnd", + "equipEnd", + "addJudgeEnd", + "gainEnd", + "loseAsyncEnd", + "addToExpansionEnd", + "cardsGotoOrderingBegin", + "phaseAfter", + ], }, - charlotte:true, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - if(event.name=='phase') return true; - var idList=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')).map(i=>i._cardid); - return event.cards&&event.cards.some(card=>{ - return idList.includes(card.cardid); - }); - }, - content:function(){ - var cards2; - if(trigger.name=='phase'){ - cards2=player.getCards('s',card=>{ - return card.hasGaintag('jsrgmanjuan'); + charlotte: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.name == "phase") return true; + var idList = player + .getCards("s", (card) => card.hasGaintag("jsrgmanjuan")) + .map((i) => i._cardid); + return ( + event.cards && + event.cards.some((card) => { + return idList.includes(card.cardid); }) - } - else{ - var idList=[]; - game.checkGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ - idList.addArray(evt.cards.filter(i=>get.position(i,true)=='d').map(i=>i.cardid)); + ); + }, + content: function () { + var cards2; + if (trigger.name == "phase") { + cards2 = player.getCards("s", (card) => { + return card.hasGaintag("jsrgmanjuan"); + }); + } else { + var idList = []; + game.checkGlobalHistory("cardMove", (evt) => { + if ( + (evt.name == "lose" && evt.position == ui.discardPile) || + evt.name == "cardsDiscard" + ) { + idList.addArray( + evt.cards + .filter((i) => get.position(i, true) == "d") + .map((i) => i.cardid) + ); } }); - cards2=player.getCards('s',card=>{ - return card.hasGaintag('jsrgmanjuan')&&!idList.includes(card._cardid); + cards2 = player.getCards("s", (card) => { + return card.hasGaintag("jsrgmanjuan") && !idList.includes(card._cardid); }); } - if(player.isOnline2()){ - player.send(function(cards,player){ - cards.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - },cards2,player); + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); } - cards2.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - } + cards2.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + }, }, - } + }, }, - jsrgyangming:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(current=>{ + jsrgyangming: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => { return player.canCompare(current); }); }, - filterTarget:function(card,player,current){ + filterTarget: function (card, player, current) { return player.canCompare(current); }, - content:function(){ - 'step 0' - event.num=0; - 'step 1' - player.chooseToCompare(target).set('small',get.attitude(player,target)>0&&(player.countCards('h',card=>{ - return get.value(card)<6; - })<=1||target.countCards('h',card=>{ - return get.value(card)<6; - })<=1)); - 'step 2' - if(result.winner!=target){ - if(!player.canCompare(target)) event._result={bool:false}; - else player.chooseBool('是否与其重复此拼点流程?').set('ai',()=>get.event('bool')).set('bool',get.effect(target,'jsrgyangming',player,player)>0); + content: function () { + "step 0"; + event.num = 0; + ("step 1"); + player.chooseToCompare(target).set( + "small", + get.attitude(player, target) > 0 && + (player.countCards("h", (card) => { + return get.value(card) < 6; + }) <= 1 || + target.countCards("h", (card) => { + return get.value(card) < 6; + }) <= 1) + ); + ("step 2"); + if (result.winner != target) { + if (!player.canCompare(target)) event._result = { bool: false }; + else + player + .chooseBool("是否与其重复此拼点流程?") + .set("ai", () => get.event("bool")) + .set("bool", get.effect(target, "jsrgyangming", player, player) > 0); event.num++; - } - else{ - if(event.num) target.draw(event.num); + } else { + if (event.num) target.draw(event.num); player.recover(); event.finish(); } - 'step 3' - if(result.bool){ + ("step 3"); + if (result.bool) { event.goto(1); } }, - ai:{ - order:1, - expose:0.15, - result:{ - target:function(player,target){ - var maxnum=0; - var cards2=target.getCards('h'); - for(var i=0;imaxnum){ - maxnum=get.number(cards2[i]); + ai: { + order: 1, + expose: 0.15, + result: { + target: function (player, target) { + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); } } - if(maxnum>10) maxnum=10; - if(maxnum<5&&cards2.length>1) maxnum=5; - var cards=player.getCards('h'); - for(var i=0;i 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; } return 0; - } - } - } + }, + }, + }, }, //韩遂 - jsrgniluan:{ - audio:'niluan', - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - var damaged=game.filterPlayer(current=>{ - return current.hasAllHistory('sourceDamage',evt=>evt.player==player); + jsrgniluan: { + audio: "niluan", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + var damaged = game.filterPlayer((current) => { + return current.hasAllHistory("sourceDamage", (evt) => evt.player == player); }); - var undamaged=game.filterPlayer().removeArray(damaged); + var undamaged = game.filterPlayer().removeArray(damaged); player.chooseCardTarget({ - prompt:get.prompt('jsrgniluan'), - prompt2:`${undamaged.length?'选择一张牌弃置并选择一名未对你造成过伤害的角色,你对其造成1点伤害':''}${undamaged.length&&damaged.length?';
    或':''}${damaged.length?'仅选择一名对你造成过伤害的角色,你令其摸两张牌':''}。`, - damaged:damaged, - aiTarget:(()=>{ - if(undamaged.includes(player)&&!undamaged.some(i=>{ - if(i===player) return false; - let att=get.attitude(player,i); - if(att>0) return true; - return att<0&&i.getHp(true)+i.hujia<2; - })&&(player.hp>2||get.damageEffect(player,player,player)>=0)) return player; - var info=game.filterPlayer().map(current=>{ - let damage=undamaged.includes(current),card={name:damage?'damage':'draw'}; - return [current,get.effect(current,card,player,player)*(damage?0.7:2)]; - }).sort((a,b)=>b[1]-a[1])[0]; - if(info[1]>0) return info[0]; + prompt: get.prompt("jsrgniluan"), + prompt2: `${ + undamaged.length + ? "选择一张牌弃置并选择一名未对你造成过伤害的角色,你对其造成1点伤害" + : "" + }${undamaged.length && damaged.length ? ";
    或" : ""}${ + damaged.length ? "仅选择一名对你造成过伤害的角色,你令其摸两张牌" : "" + }。`, + damaged: damaged, + aiTarget: (() => { + if ( + undamaged.includes(player) && + !undamaged.some((i) => { + if (i === player) return false; + let att = get.attitude(player, i); + if (att > 0) return true; + return att < 0 && i.getHp(true) + i.hujia < 2; + }) && + (player.hp > 2 || get.damageEffect(player, player, player) >= 0) + ) + return player; + var info = game + .filterPlayer() + .map((current) => { + let damage = undamaged.includes(current), + card = { name: damage ? "damage" : "draw" }; + return [ + current, + get.effect(current, card, player, player) * (damage ? 0.7 : 2), + ]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (info[1] > 0) return info[0]; return null; })(), - filterCard:lib.filter.cardDiscardable, - selectCard:function(){ - if(get.event('damaged').length==0) return 1; - if(get.event('damaged').length==game.countPlayer()) return 0; - return [0,1]; + filterCard: lib.filter.cardDiscardable, + selectCard: function () { + if (get.event("damaged").length == 0) return 1; + if (get.event("damaged").length == game.countPlayer()) return 0; + return [0, 1]; }, - position:'he', - filterTarget:function(card,player,target){ - var damaged=get.event('damaged'); - return damaged.includes(target)^(ui.selected.cards.length>0); + position: "he", + filterTarget: function (card, player, target) { + var damaged = get.event("damaged"); + return damaged.includes(target) ^ (ui.selected.cards.length > 0); }, - selectTarget:1, - ai1:function(card){ - if(get.event('damaged').includes(get.event('aiTarget'))) return 0; - return 6-get.value(card); + selectTarget: 1, + ai1: function (card) { + if (get.event("damaged").includes(get.event("aiTarget"))) return 0; + return 6 - get.value(card); }, - ai2:function(target){ - return target==get.event('aiTarget')?10:0; + ai2: function (target) { + return target == get.event("aiTarget") ? 10 : 0; }, }); - 'step 1' - if(result.bool){ - var cards=result.cards,target=result.targets[0]; - player.logSkill('jsrgniluan',target); - if(cards&&cards.length){ + ("step 1"); + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.logSkill("jsrgniluan", target); + if (cards && cards.length) { player.discard(cards); game.delayex(); target.damage(); - } - else{ + } else { target.draw(2); } } }, }, - jsrghuchou:{ - audio:2, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - const history=_status.globalHistory; - for(let i=history.length-1;i>=0;i--){ - let evts=history[i]['useCard']; - for(let j=evts.length-1;j>=0;j--){ - var evt=evts[j]; - let card=evt.card,targets=evt.targets; - if(!get.tag(card,'damage')||!targets.includes(player)) continue; - return event.player==evt.player; + jsrghuchou: { + audio: 2, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + const history = _status.globalHistory; + for (let i = history.length - 1; i >= 0; i--) { + let evts = history[i]["useCard"]; + for (let j = evts.length - 1; j >= 0; j--) { + var evt = evts[j]; + let card = evt.card, + targets = evt.targets; + if (!get.tag(card, "damage") || !targets.includes(player)) continue; + return event.player == evt.player; } } return false; }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.num++; }, - ai:{ - damageBonus:true, - skillTagFilter:(player,tag,arg)=>{ - if(tag==='damageBonus'&&arg&&arg.target){ - const history=_status.globalHistory; - for(let i=history.length-1;i>=0;i--){ - let evts=history[i]['useCard']; - for(let j=evts.length-1;j>=0;j--){ - var evt=evts[j]; - let card=evt.card,targets=evt.targets; - if(!get.tag(card,'damage')||!targets.includes(player)) continue; - return arg.target===evt.player; + ai: { + damageBonus: true, + skillTagFilter: (player, tag, arg) => { + if (tag === "damageBonus" && arg && arg.target) { + const history = _status.globalHistory; + for (let i = history.length - 1; i >= 0; i--) { + let evts = history[i]["useCard"]; + for (let j = evts.length - 1; j >= 0; j--) { + var evt = evts[j]; + let card = evt.card, + targets = evt.targets; + if (!get.tag(card, "damage") || !targets.includes(player)) continue; + return arg.target === evt.player; } } return false; } }, - effect:{ - player:(card,player,target)=>{ - if(get.tag(card,'damage')&&target&&lib.skill.jsrghuchou.ai.skillTagFilter(player,'damageBonus',{ - card:card, - target:target - })&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card - })) return [1,0,2,0]; - } - } - } + effect: { + player: (card, player, target) => { + if ( + get.tag(card, "damage") && + target && + lib.skill.jsrghuchou.ai.skillTagFilter(player, "damageBonus", { + card: card, + target: target, + }) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + return [1, 0, 2, 0]; + }, + }, + }, }, - jsrgjiemeng:{ - audio:2, - zhuSkill:true, - forced:true, - init:()=>{ - game.addGlobalSkill('jsrgjiemeng_effect'); + jsrgjiemeng: { + audio: 2, + zhuSkill: true, + forced: true, + init: () => { + game.addGlobalSkill("jsrgjiemeng_effect"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('jsrgjiemeng'),true)) game.removeGlobalSkill('jsrgjiemeng_effect'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("jsrgjiemeng"), true)) + game.removeGlobalSkill("jsrgjiemeng_effect"); }, - subSkill:{ - effect:{ - mod:{ - globalFrom:function(from,to,distance){ - if(from.group!='qun') return; - if(to.hasZhuSkill('jsrgjiemeng')) return; - return distance-game.countPlayer(current=>current.group=='qun'); + subSkill: { + effect: { + mod: { + globalFrom: function (from, to, distance) { + if (from.group != "qun") return; + if (to.hasZhuSkill("jsrgjiemeng")) return; + return distance - game.countPlayer((current) => current.group == "qun"); }, }, - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('jsrgjiemeng'),true); + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("jsrgjiemeng"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("jsrgjiemeng_effect"); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('jsrgjiemeng_effect'); - } }, }, }, //张楚 - jsrghuozhong:{ - audio:'dcjizhong', - global:'jsrghuozhong_g', - subSkill:{ - g:{ - audio:'dcjizhong', - enable:'phaseUse', - usable:1, - filter:function (event,player){ - if(player.hasJudge('bingliang')) return false; - if(!game.hasPlayer(current=>current.hasSkill('jsrghuozhong'))) return false; - return player.countCards('hes',card=>get.color(card)=='black'&&get.type2(card)!='trick')>0; + jsrghuozhong: { + audio: "dcjizhong", + global: "jsrghuozhong_g", + subSkill: { + g: { + audio: "dcjizhong", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.hasJudge("bingliang")) return false; + if (!game.hasPlayer((current) => current.hasSkill("jsrghuozhong"))) return false; + return ( + player.countCards( + "hes", + (card) => get.color(card) == "black" && get.type2(card) != "trick" + ) > 0 + ); }, - viewAs:{name:'bingliang'}, - position:'hes', - discard:false, - prompt:function(){ - var list=game.filterPlayer(target=>{ - return target.hasSkill('jsrghuozhong'); + viewAs: { name: "bingliang" }, + position: "hes", + discard: false, + prompt: function () { + var list = game.filterPlayer((target) => { + return target.hasSkill("jsrghuozhong"); }); - return `将一张黑色非锦囊牌当【兵粮寸断】置于自己的判定区,然后令${get.translation(list)}${list.length>1?'中的一人':''}摸两张牌。`; + return `将一张黑色非锦囊牌当【兵粮寸断】置于自己的判定区,然后令${get.translation( + list + )}${list.length > 1 ? "中的一人" : ""}摸两张牌。`; }, - filterCard:function(card,player,event){ - return get.color(card)=='black'&&get.type2(card)!='trick'&&player.canAddJudge({name:'bingliang',cards:[card]}); + filterCard: function (card, player, event) { + return ( + get.color(card) == "black" && + get.type2(card) != "trick" && + player.canAddJudge({ name: "bingliang", cards: [card] }) + ); }, - selectTarget:-1, - filterTarget:function (card,player,target){ - return player==target; + selectTarget: -1, + filterTarget: function (card, player, target) { + return player == target; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - precontent:function*(event,map){ - var player=map.player; - var targets=game.filterPlayer(current=>current.hasSkill('jsrghuozhong')); + precontent: function* (event, map) { + var player = map.player; + var targets = game.filterPlayer((current) => current.hasSkill("jsrghuozhong")); var result; - if(targets.length) result={bool:true,targets:targets}; - else result=yield player.chooseTarget('请选择一名传教士,发动其的【惑众】',true,(card,player,target)=>{ - return get.event('targets').includes(target); - }).set('targets',targets); - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrghuozhong',target); - var next=game.createEvent('jsrghuozhong_draw',false); - next.set('player',player); - next.set('target',target); + if (targets.length) result = { bool: true, targets: targets }; + else + result = yield player + .chooseTarget( + "请选择一名传教士,发动其的【惑众】", + true, + (card, player, target) => { + return get.event("targets").includes(target); + } + ) + .set("targets", targets); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrghuozhong", target); + var next = game.createEvent("jsrghuozhong_draw", false); + next.set("player", player); + next.set("target", target); event.next.remove(next); event.getParent().after.push(next); - next.setContent(function(){ + next.setContent(function () { target.draw(2); }); } }, - ai:{ - result:{ - player:function(player){ - if(game.hasPlayer(current=>get.attitude(player,current)>2&¤t.hasSkill('jsrghuozhong'))) return 1; + ai: { + result: { + player: function (player) { + if ( + game.hasPlayer( + (current) => + get.attitude(player, current) > 2 && + current.hasSkill("jsrghuozhong") + ) + ) + return 1; return 0; }, }, - order:9, + order: 9, }, }, }, }, - jsrgrihui:{ - audio:'dcrihui', - locked:false, - trigger:{source:'damageSource'}, - filter:function(event,player){ - return event.getParent().type=='card'&&event.card&&event.card.name=='sha'&&game.hasPlayer(current=>{ - return current!=player&¤t.countCards('j'); + jsrgrihui: { + audio: "dcrihui", + locked: false, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return ( + event.getParent().type == "card" && + event.card && + event.card.name == "sha" && + game.hasPlayer((current) => { + return current != player && current.countCards("j"); + }) + ); + }, + prompt: "是否发动【日彗】?", + prompt2: function (event, player) { + var list = game.filterPlayer((current) => { + return current != player && current.countCards("j"); + }); + return `令${get.translation(list)}${list.length > 1 ? "各" : ""}摸一张牌。`; + }, + logTarget: function (event, player) { + return game.filterPlayer((current) => { + return current != player && current.countCards("j"); }); }, - prompt:'是否发动【日彗】?', - prompt2:function(event,player){ - var list=game.filterPlayer(current=>{ - return current!=player&¤t.countCards('j'); - }); - return `令${get.translation(list)}${list.length>1?'各':''}摸一张牌。`; + group: "jsrgrihui_sha", + content: function () { + game.asyncDraw(lib.skill.jsrgrihui.logTarget(trigger, player)); }, - logTarget:function(event,player){ - return game.filterPlayer(current=>{ - return current!=player&¤t.countCards('j'); - }); - }, - group:'jsrgrihui_sha', - content:function(){ - game.asyncDraw(lib.skill.jsrgrihui.logTarget(trigger,player)); - }, - mod:{ - cardUsableTarget:function(card,player,target){ - if(card.name=='sha'&&!player.getStorage('jsrgrihui_targeted').includes(target)) return true; + mod: { + cardUsableTarget: function (card, player, target) { + if (card.name == "sha" && !player.getStorage("jsrgrihui_targeted").includes(target)) + return true; }, }, - subSkill:{ - sha:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - silent:true, - firstDo:true, - content:function(){ - player.addTempSkill('jsrgrihui_targeted'); - player.markAuto('jsrgrihui_targeted',trigger.target); - } + subSkill: { + sha: { + trigger: { player: "useCardToPlayered" }, + forced: true, + silent: true, + firstDo: true, + content: function () { + player.addTempSkill("jsrgrihui_targeted"); + player.markAuto("jsrgrihui_targeted", trigger.target); + }, }, - targeted:{ - charlotte:true, - onremove:true, + targeted: { + charlotte: true, + onremove: true, }, }, }, //夏侯恩 - jsrghujian:{ - audio:'twfujian', - trigger:{ - global:'phaseEnd', + jsrghujian: { + audio: "twfujian", + trigger: { + global: "phaseEnd", }, - filter:function(event,player){ - if(!Array.from(ui.discardPile.childNodes).some(i=>i.name=='chixueqingfeng')) return false; - return game.hasGlobalHistory('everything',evt=>['useCard','respond'].includes(evt.name)&&evt.player.isIn()); + filter: function (event, player) { + if (!Array.from(ui.discardPile.childNodes).some((i) => i.name == "chixueqingfeng")) + return false; + return game.hasGlobalHistory( + "everything", + (evt) => ["useCard", "respond"].includes(evt.name) && evt.player.isIn() + ); }, - popup:false, - forced:true, - locked:false, - group:'jsrghujian_begin', - content:function(){ - 'step 0' - var cards=Array.from(ui.discardPile.childNodes).filter(i=>i.name=='chixueqingfeng'); - if(cards.length){ - event.cards=cards; - var history=_status.globalHistory,target=null; - for(var i=history.length-1;i>=0&&!target;i--){ - var evts=history[i]['everything']; - for(var j=evts.length-1;j>=0;j--){ - var evt=evts[j]; - if(!['useCard','respond'].includes(evt.name)) continue; - target=evt.player; + popup: false, + forced: true, + locked: false, + group: "jsrghujian_begin", + content: function () { + "step 0"; + var cards = Array.from(ui.discardPile.childNodes).filter( + (i) => i.name == "chixueqingfeng" + ); + if (cards.length) { + event.cards = cards; + var history = _status.globalHistory, + target = null; + for (var i = history.length - 1; i >= 0 && !target; i--) { + var evts = history[i]["everything"]; + for (var j = evts.length - 1; j >= 0; j--) { + var evt = evts[j]; + if (!["useCard", "respond"].includes(evt.name)) continue; + target = evt.player; break; } } - if(target&&target.isIn()){ - event.target=target; - target.chooseBool(`是否响应${get.translation(player)}的【护剑】?`,'获得弃牌堆里的【赤血青锋】。'); - } - else event.finish(); - } - else event.finish(); - 'step 1' - if(result.bool){ - player.logSkill('jsrghujian'); + if (target && target.isIn()) { + event.target = target; + target.chooseBool( + `是否响应${get.translation(player)}的【护剑】?`, + "获得弃牌堆里的【赤血青锋】。" + ); + } else event.finish(); + } else event.finish(); + ("step 1"); + if (result.bool) { + player.logSkill("jsrghujian"); player.line(target); - target.gain(cards,'gain2'); + target.gain(cards, "gain2"); } }, - subSkill:{ - begin:{ - audio:'twfujian', - trigger:{ - global:'phaseBefore', - player:'enterGame', + subSkill: { + begin: { + audio: "twfujian", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + player.gain(game.createCard2("chixueqingfeng", "spade", 6), "gain2"); }, - content:function(){ - player.gain(game.createCard2('chixueqingfeng','spade',6),'gain2'); - } }, }, }, - jsrgshili:{ - audio:'twjianwei', - enable:'phaseUse', - usable:1, - viewAs:{ - name:'juedou', + jsrgshili: { + audio: "twjianwei", + enable: "phaseUse", + usable: 1, + viewAs: { + name: "juedou", }, - filterCard:{type:'equip'}, - position:'hs', - viewAsFilter:function(player){ - return player.hasCard({type:'equip'},'hs'); + filterCard: { type: "equip" }, + position: "hs", + viewAsFilter: function (player) { + return player.hasCard({ type: "equip" }, "hs"); }, - check:function(card){ - return (get.name(card,false)=='chixueqingfeng'?20:12)-_status.event.player.getUseValue(card); + check: function (card) { + return ( + (get.name(card, false) == "chixueqingfeng" ? 20 : 12) - + _status.event.player.getUseValue(card) + ); }, - ai:{ - order:0.001, + ai: { + order: 0.001, }, }, //范疆张达 - jsrgfushan:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return game.hasPlayer(i=>i!=player); + jsrgfushan: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return game.hasPlayer((i) => i != player); }, - content:function*(event,map){ - var player=map.player,trigger=map.trigger, targets=game.filterPlayer(i=>i!=player); - var shas=player.mayHaveSha(target,'use',null,'count')-player.getCardUsable('sha',true); - for(var target of targets){ - var att=get.attitude(target,player); - var result=yield target.chooseCard('he',`负山:是否交给${get.translation(player)}一张牌?`,`若如此做,其此阶段使用【杀】的次数上限+1`).set('att',att).set('ai',card=>{ - if(!get.event('goon')) return -get.value(card); - var isSha=get.name(card,get.event('target'))=='sha'; - if(get.event('att')<0) return (isSha?0:5)-get.value(card); - return (isSha?10:0)-get.value(card); - }).set('goon',att>0&&shas>=0||att<0&&target.hp>player.getCardUsable('sha',true)&&shas<-1/Math.max(1,player.hp)).set('target',player); - if(result.bool){ - target.give(result.cards,player); + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + targets = game.filterPlayer((i) => i != player); + var shas = + player.mayHaveSha(target, "use", null, "count") - player.getCardUsable("sha", true); + for (var target of targets) { + var att = get.attitude(target, player); + var result = yield target + .chooseCard( + "he", + `负山:是否交给${get.translation(player)}一张牌?`, + `若如此做,其此阶段使用【杀】的次数上限+1` + ) + .set("att", att) + .set("ai", (card) => { + if (!get.event("goon")) return -get.value(card); + var isSha = get.name(card, get.event("target")) == "sha"; + if (get.event("att") < 0) return (isSha ? 0 : 5) - get.value(card); + return (isSha ? 10 : 0) - get.value(card); + }) + .set( + "goon", + (att > 0 && shas >= 0) || + (att < 0 && + target.hp > player.getCardUsable("sha", true) && + shas < -1 / Math.max(1, player.hp)) + ) + .set("target", player); + if (result.bool) { + target.give(result.cards, player); target.line(player); - player.addTempSkill('jsrgfushan_sha','phaseAfter'); - player.addMark('jsrgfushan_sha',1,false); - player.markAuto('jsrgfushan_given',target); + player.addTempSkill("jsrgfushan_sha", "phaseAfter"); + player.addMark("jsrgfushan_sha", 1, false); + player.markAuto("jsrgfushan_given", target); } } - player.when('phaseUseAfter').filter((evt=>evt==trigger)).then(()=>{ - player.logSkill('jsrgfushan'); - if(player.getCardUsable('sha',true)>player.getHistory('useCard',evt=>{ - return evt.getParent('phaseUse')==trigger&&evt.card.name=='sha'&&evt.addCount!==false; - }).length&&player.storage.jsrgfushan_given&&player.storage.jsrgfushan_given.every(i=>i.isIn())){ - player.loseHp(2); - } - else{ - player.drawTo(player.maxHp); - } - delete player.storage.jsrgfushan_given; - }); + player + .when("phaseUseAfter") + .filter((evt) => evt == trigger) + .then(() => { + player.logSkill("jsrgfushan"); + if ( + player.getCardUsable("sha", true) > + player.getHistory("useCard", (evt) => { + return ( + evt.getParent("phaseUse") == trigger && + evt.card.name == "sha" && + evt.addCount !== false + ); + }).length && + player.storage.jsrgfushan_given && + player.storage.jsrgfushan_given.every((i) => i.isIn()) + ) { + player.loseHp(2); + } else { + player.drawTo(player.maxHp); + } + delete player.storage.jsrgfushan_given; + }); }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - marktext:'负', - intro:{content:'使用【杀】的次数上限+#'}, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('jsrgfushan_sha'); + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "负", + intro: { content: "使用【杀】的次数上限+#" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("jsrgfushan_sha"); }, }, }, @@ -3879,831 +4824,955 @@ game.import('character', function () { }, //江山如故·承 //404孙策 - jsrgduxing:{ - audio:2, - enable:'phaseUse', - viewAs:{ - name:'juedou', - storage:{jsrgduxing:true}, - isCard:true, + jsrgduxing: { + audio: 2, + enable: "phaseUse", + viewAs: { + name: "juedou", + storage: { jsrgduxing: true }, + isCard: true, }, - viewAsFilter:function(player){ - if(player.hasSkill('jsrgduxing_used')) return false; + viewAsFilter: function (player) { + if (player.hasSkill("jsrgduxing_used")) return false; }, - filterCard:()=>false, - selectCard:-1, - selectTarget:[1,Infinity], - precontent:function(){ - player.logSkill('jsrgduxing'); + filterCard: () => false, + selectCard: -1, + selectTarget: [1, Infinity], + precontent: function () { + player.logSkill("jsrgduxing"); delete event.result.skill; - var targets=event.result.targets; - for(var target of targets){ - target.addTempSkill('jsrgduxing_allsha'); + var targets = event.result.targets; + for (var target of targets) { + target.addTempSkill("jsrgduxing_allsha"); } - player.addTempSkill('jsrgduxing_restore'); - player.addTempSkill('jsrgduxing_used','phaseUseAfter'); + player.addTempSkill("jsrgduxing_restore"); + player.addTempSkill("jsrgduxing_used", "phaseUseAfter"); }, - ai:{ - order:5, - result:{ - player:function(player,target){ - var eff=Math.sign(get.effect(target,{name:'juedou'},player,player)); - if(player.hasSkillTag('directHit_ai',true,{ - target:target, - card:{name:'juedou'}, - },true)||ui.selected.targets.concat(target).reduce((p,c)=>{ - return p+c.countCards('h'); - },0) { + return p + c.countCards("h"); + }, 0) < player.countCards("h", "sha") + ) { return 0; } return -114514; }, - target:-1.5, - } + target: -1.5, + }, }, - subSkill:{ - allsha:{ - charlotte:true, - mod:{ - cardname:function(card,player,name){ - return 'sha'; + subSkill: { + allsha: { + charlotte: true, + mod: { + cardname: function (card, player, name) { + return "sha"; }, - } - }, - used:{ - charlotte:true, - }, - restore:{ - charlotte:true, - trigger:{ - global:'useCardAfter', }, - forced:true, - popup:false, - forceDie:true, - forceOut:true, - filter:function(event,player){ - return event.card.name=='juedou'&&event.card.storage&&event.card.storage.jsrgduxing; + }, + used: { + charlotte: true, + }, + restore: { + charlotte: true, + trigger: { + global: "useCardAfter", + }, + forced: true, + popup: false, + forceDie: true, + forceOut: true, + filter: function (event, player) { + return ( + event.card.name == "juedou" && + event.card.storage && + event.card.storage.jsrgduxing + ); + }, + content: function () { + game.countPlayer((current) => { + current.removeSkill("jsrgduxing_allsha"); + }, true); }, - content:function(){ - game.countPlayer(current=>{ - current.removeSkill('jsrgduxing_allsha'); - },true); - } }, }, }, - jsrgzhiheng:{ - audio:2, - trigger:{ - source:'damageBegin1', + jsrgzhiheng: { + audio: 2, + trigger: { + source: "damageBegin1", }, - forced:true, - filter:function(event,player){ - if(event.getParent().type!='card') return false; - var respondEvts=[]; - respondEvts.addArray(event.player.getHistory('useCard')).addArray(event.player.getHistory('respond')); - respondEvts=respondEvts.filter(i=>i.respondTo).map(evt=>evt.respondTo); - return respondEvts.some(list=>{ - return list[0]==player; + forced: true, + filter: function (event, player) { + if (event.getParent().type != "card") return false; + var respondEvts = []; + respondEvts + .addArray(event.player.getHistory("useCard")) + .addArray(event.player.getHistory("respond")); + respondEvts = respondEvts.filter((i) => i.respondTo).map((evt) => evt.respondTo); + return respondEvts.some((list) => { + return list[0] == player; }); }, - content:function(){ + content: function () { trigger.num++; }, }, - jsrgzhasi:{ - audio:2, - trigger:{ - player:'damageBegin4', + jsrgzhasi: { + audio: 2, + trigger: { + player: "damageBegin4", }, - limited:true, - skillAnimation:true, - animationColor:'wood', - filter:function(event,player){ - return event.num>=player.getHp(); + limited: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return event.num >= player.getHp(); }, - content:function(){ - player.awakenSkill('jsrgzhasi'); + content: function () { + player.awakenSkill("jsrgzhasi"); trigger.cancel(); - player.changeSkills(['rezhiheng'],['jsrgzhiheng']); - player.addSkill('jsrgzhasi_undist'); + player.changeSkills(["rezhiheng"], ["jsrgzhiheng"]); + player.addSkill("jsrgzhasi_undist"); }, - derivation:'rezhiheng', - subSkill:{ - undist:{ - group:'undist', - trigger:{ - player:['useCardAfter','damageEnd'], + derivation: "rezhiheng", + subSkill: { + undist: { + group: "undist", + trigger: { + player: ["useCardAfter", "damageEnd"], }, - filter:function(event,player){ - if(event.name=='useCard') return event.targets.some(target=>{ - return target!=player; - }); + filter: function (event, player) { + if (event.name == "useCard") + return event.targets.some((target) => { + return target != player; + }); return true; }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - player.removeSkill('jsrgzhasi_undist'); + forced: true, + popup: false, + charlotte: true, + content: function () { + player.removeSkill("jsrgzhasi_undist"); }, - mark:true, - intro:{ - content:'诈死中,不计入距离和座次的计算', + mark: true, + intro: { + content: "诈死中,不计入距离和座次的计算", }, }, }, }, - jsrgbashi:{ - audio:2, - trigger:{player:'chooseToRespondBefore'}, - zhuSkill:true, - filter:function(event,player){ - if(event.responded) return false; - if(player.storage.jsrgbashiing) return false; - if(!player.hasZhuSkill('jsrgbashi')) return false; - if(!event.filterCard({name:'sha'},player,event)&&!event.filterCard({name:'shan'},player,event)) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wu'; + jsrgbashi: { + audio: 2, + trigger: { player: "chooseToRespondBefore" }, + zhuSkill: true, + filter: function (event, player) { + if (event.responded) return false; + if (player.storage.jsrgbashiing) return false; + if (!player.hasZhuSkill("jsrgbashi")) return false; + if ( + !event.filterCard({ name: "sha" }, player, event) && + !event.filterCard({ name: "shan" }, player, event) + ) + return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wu"; }); }, - check:function(event,player){ - if(get.damageEffect(player,event.player,player)>=0) return false; + check: function (event, player) { + if (get.damageEffect(player, event.player, player) >= 0) return false; return true; }, - content:function(){ - 'step 0' - event.targets=game.filterPlayer(); - 'step 1' - var target=event.targets.shift(); - event.target=target; - if(!target) event.finish(); - else if(!target.isIn()||target==player) event.redo(); - else if(target.group=='wu'){ - if((target==game.me&&!_status.auto)||( - get.attitude(target,player)>2)|| - target.isOnline()){ - player.storage.jsrgbashiing=true; - var list=['sha','shan'].filter(name=>trigger.filterCard({name:name},player,trigger)); - var names=list.map(i=>'【'+get.translation(i)+'】').join('或'); - var next=target.chooseToRespond('是否替'+get.translation(player)+'打出一张'+names+'?',{name:list}); - next.set('ai',function(){ - var event=_status.event; - return (get.attitude(event.player,event.source)-2); + content: function () { + "step 0"; + event.targets = game.filterPlayer(); + ("step 1"); + var target = event.targets.shift(); + event.target = target; + if (!target) event.finish(); + else if (!target.isIn() || target == player) event.redo(); + else if (target.group == "wu") { + if ( + (target == game.me && !_status.auto) || + get.attitude(target, player) > 2 || + target.isOnline() + ) { + player.storage.jsrgbashiing = true; + var list = ["sha", "shan"].filter((name) => + trigger.filterCard({ name: name }, player, trigger) + ); + var names = list.map((i) => "【" + get.translation(i) + "】").join("或"); + var next = target.chooseToRespond( + "是否替" + get.translation(player) + "打出一张" + names + "?", + { name: list } + ); + next.set("ai", function () { + var event = _status.event; + return get.attitude(event.player, event.source) - 2; }); - next.set('skillwarn','替'+get.translation(player)+'打出一张'+names); - next.autochoose=function(){ - if(!lib.filter.autoRespondSha.apply(this,arguments)) return false; - return lib.filter.autoRespondShan.apply(this,arguments); + next.set("skillwarn", "替" + get.translation(player) + "打出一张" + names); + next.autochoose = function () { + if (!lib.filter.autoRespondSha.apply(this, arguments)) return false; + return lib.filter.autoRespondShan.apply(this, arguments); }; - next.set('source',player); + next.set("source", player); } } - 'step 2' + ("step 2"); delete player.storage.jsrgbashiing; - if(result.bool){ + if (result.bool) { event.finish(); - var name=result.card.name; - trigger.result={bool:true,card:{name:name,isCard:true}}; - trigger.responded=true; - trigger.animate=false; - if(typeof target.ai.shown=='number'&&target.ai.shown<0.95){ - target.ai.shown+=0.3; - if(target.ai.shown>0.95) target.ai.shown=0.95; + var name = result.card.name; + trigger.result = { bool: true, card: { name: name, isCard: true } }; + trigger.responded = true; + trigger.animate = false; + if (typeof target.ai.shown == "number" && target.ai.shown < 0.95) { + target.ai.shown += 0.3; + if (target.ai.shown > 0.95) target.ai.shown = 0.95; } - } - else{ + } else { event.goto(1); } }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(arg=='use') return false; - if(player.storage.jsrgbashiing) return false; - if(!player.hasZhuSkill('jsrgbashi')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wu'; + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "use") return false; + if (player.storage.jsrgbashiing) return false; + if (!player.hasZhuSkill("jsrgbashi")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wu"; }); }, }, }, //许攸 - jsrglipan:{ - audio:2, - trigger:{ - player:'phaseEnd', + jsrglipan: { + audio: 2, + trigger: { + player: "phaseEnd", }, - direct:true, - content:function(){ - 'step 0' - var list=lib.group.slice(); + direct: true, + content: function () { + "step 0"; + var list = lib.group.slice(); list.remove(player.group); - var getV=function(group){ - var val=1; - if(group=='wei'||group=='qun') val++; - game.countPlayer(current=>{ - if(current.group!=group) return false; - var att=get.attitude(player,current); - if(att>0) val++; - else if(att==0) val+=0.5; + var getV = function (group) { + var val = 1; + if (group == "wei" || group == "qun") val++; + game.countPlayer((current) => { + if (current.group != group) return false; + var att = get.attitude(player, current); + if (att > 0) val++; + else if (att == 0) val += 0.5; else val--; }); return val; }; - var maxGroup=list.slice().sort((a,b)=>{ - return getV(b)-getV(a); + var maxGroup = list.slice().sort((a, b) => { + return getV(b) - getV(a); })[0]; - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt('jsrglipan')).set('prompt2','变更为另一个势力').set('ai',()=>{ - return _status.event.choice; - }).set('choice',maxGroup); - 'step 1' - var group=result.control; - if(group=='cancel2') return; - player.logSkill('jsrglipan'); - player.popup(group+'2',get.groupnature(group,'raw')); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("jsrglipan")) + .set("prompt2", "变更为另一个势力") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", maxGroup); + ("step 1"); + var group = result.control; + if (group == "cancel2") return; + player.logSkill("jsrglipan"); + player.popup(group + "2", get.groupnature(group, "raw")); player.changeGroup(group); - var num=game.countPlayer(current=>{ - return current.group==group&¤t!=player; + var num = game.countPlayer((current) => { + return current.group == group && current != player; }); - if(num>0) player.draw(num); - var next=player.phaseUse(); - next.jsrglipan=true; + if (num > 0) player.draw(num); + var next = player.phaseUse(); + next.jsrglipan = true; event.next.remove(next); trigger.next.push(next); - player.addTempSkill('jsrglipan_backfire'); + player.addTempSkill("jsrglipan_backfire"); }, - subSkill:{ - backfire:{ - trigger:{ - player:'phaseUseEnd', + subSkill: { + backfire: { + trigger: { + player: "phaseUseEnd", }, - charlotte:true, - forced:true, - popup:false, - filter:function(event,player){ + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { return event.jsrglipan; }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>{ - return current.group==player.group; + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => { + return current.group == player.group; }); targets.sortBySeat(); - event.targets=targets; - 'step 1' - var target=targets.shift(); - event.target=target; - if(target&&target.isIn()&&target.canUse({name:'juedou'},player)){ + event.targets = targets; + ("step 1"); + var target = targets.shift(); + event.target = target; + if (target && target.isIn() && target.canUse({ name: "juedou" }, player)) { target.chooseCardTarget({ - position:'hes', - prompt:'是否将一张牌当【决斗】对'+get.translation(player)+'使用?', - filterCard:function(card,player){ - return player.canUse(get.autoViewAs({name:'juedou'},[card]),_status.event.getParent().player); + position: "hes", + prompt: "是否将一张牌当【决斗】对" + get.translation(player) + "使用?", + filterCard: function (card, player) { + return player.canUse( + get.autoViewAs({ name: "juedou" }, [card]), + _status.event.getParent().player + ); }, - filterTarget:function(card,player,target){ - var source=_status.event.getParent().player; - if(target!=source&&!ui.selected.targets.includes(source)) return false; - card=get.autoViewAs({name:'juedou'},[card]); - return lib.filter.filterTarget.apply(this,arguments); + filterTarget: function (card, player, target) { + var source = _status.event.getParent().player; + if (target != source && !ui.selected.targets.includes(source)) + return false; + card = get.autoViewAs({ name: "juedou" }, [card]); + return lib.filter.filterTarget.apply(this, arguments); }, - selectTarget:function(){ - var card=get.card(),player=get.player(); - if(!card) return; - card=get.autoViewAs({name:'juedou'},[card]); - var range=[1,1]; - game.checkMod(card,player,range,'selectTarget',player); + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (!card) return; + card = get.autoViewAs({ name: "juedou" }, [card]); + var range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); return range; }, - ai1:function(card){ - var player=_status.event.player,target=_status.event.getParent().player; - var eff=get.effect(target,get.autoViewAs({name:'juedou'},[card]),player,player); - if(eff<=0) return 0; - return (player.hp==1?10:6)-get.value(card); + ai1: function (card) { + var player = _status.event.player, + target = _status.event.getParent().player; + var eff = get.effect( + target, + get.autoViewAs({ name: "juedou" }, [card]), + player, + player + ); + if (eff <= 0) return 0; + return (player.hp == 1 ? 10 : 6) - get.value(card); + }, + ai2: function (target) { + if (target == _status.event.getParent().player) return 100; + return get.effect(target, { name: "juedou" }, _status.event.player); }, - ai2:function(target){ - if(target==_status.event.getParent().player) return 100; - return get.effect(target,{name:'juedou'},_status.event.player); - } }); } - 'step 2' - if(result.bool){ - var cards=result.cards; - var cardx=get.autoViewAs({name:'juedou'},cards); - var targets=result.targets.filter(targetx=>{ - return target.canUse(cardx,targetx); + ("step 2"); + if (result.bool) { + var cards = result.cards; + var cardx = get.autoViewAs({ name: "juedou" }, cards); + var targets = result.targets.filter((targetx) => { + return target.canUse(cardx, targetx); }); - if(targets.length) target.useCard(cardx,cards,targets); + if (targets.length) target.useCard(cardx, cards, targets); } - if(targets.length) event.goto(1); - } - } + if (targets.length) event.goto(1); + }, + }, }, }, - jsrgqingxi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(player.group!='qun') return false; - return game.hasPlayer(current=>lib.skill.jsrgqingxi.filterTarget('',player,current)); + jsrgqingxi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.group != "qun") return false; + return game.hasPlayer((current) => + lib.skill.jsrgqingxi.filterTarget("", player, current) + ); }, - groupSkill:true, - filterTarget:function(card,player,target){ - if(target.countCards('h')>=player.countCards('h')) return false; - return !player.getStorage('jsrgqingxi_used').includes(target); + groupSkill: true, + filterTarget: function (card, player, target) { + if (target.countCards("h") >= player.countCards("h")) return false; + return !player.getStorage("jsrgqingxi_used").includes(target); }, - content:function(){ - 'step 0' - player.addTempSkill('jsrgqingxi_used','phaseUseAfter'); - player.markAuto('jsrgqingxi_used',[target]); - var num=player.countCards('h')-target.countCards('h'); - if(num>0) player.chooseToDiscard(num,true,'轻袭:弃置'+get.cnNumber(num)+'张手牌'); - 'step 1' - var card={ - name:'sha', - nature:'stab', - isCard:true, + content: function () { + "step 0"; + player.addTempSkill("jsrgqingxi_used", "phaseUseAfter"); + player.markAuto("jsrgqingxi_used", [target]); + var num = player.countCards("h") - target.countCards("h"); + if (num > 0) + player.chooseToDiscard(num, true, "轻袭:弃置" + get.cnNumber(num) + "张手牌"); + ("step 1"); + var card = { + name: "sha", + nature: "stab", + isCard: true, }; - if(player.canUse(card,target,false)) player.useCard(card,target,false); + if (player.canUse(card, target, false)) player.useCard(card, target, false); }, - ai:{ - order:8, - result:{ - target:(player,target)=>{ - let num=player.countCards('h')-target.countCards('h'), - eff=get.effect(target,{name:'sha',nature:'stab'},player,target), - val=0, - ph=_status.event.getTempCache('jsrgqingxi_result','ph'); - if(!ph){ - ph=player.getCards('h').sort((a,b)=>{ - return get.value(a)-get.value(b); + ai: { + order: 8, + result: { + target: (player, target) => { + let num = player.countCards("h") - target.countCards("h"), + eff = get.effect(target, { name: "sha", nature: "stab" }, player, target), + val = 0, + ph = _status.event.getTempCache("jsrgqingxi_result", "ph"); + if (!ph) { + ph = player.getCards("h").sort((a, b) => { + return get.value(a) - get.value(b); }); - _status.event.putTempCache('jsrgqingxi_result','ph',ph); + _status.event.putTempCache("jsrgqingxi_result", "ph", ph); } - ph.slice(0,num).forEach(i=>{ - val+=get.value(i,player); + ph.slice(0, num).forEach((i) => { + val += get.value(i, player); }); - eff=Math.sign(eff)*Math.sqrt(Math.abs(eff)); - if(val>2*Math.abs(eff)) return 0; - return eff/num; - } - } + eff = Math.sign(eff) * Math.sqrt(Math.abs(eff)); + if (val > 2 * Math.abs(eff)) return 0; + return eff / num; + }, + }, }, - subSkill:{ - used:{ - onremove:true, - charlotte:true, - } + subSkill: { + used: { + onremove: true, + charlotte: true, + }, }, }, - jsrgjinmie:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(player.group!='wei') return false; - return game.hasPlayer(current=>current.countCards('h')>player.countCards('h')); + jsrgjinmie: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.group != "wei") return false; + return game.hasPlayer((current) => current.countCards("h") > player.countCards("h")); }, - groupSkill:true, - filterTarget:function(card,player,target){ - return target.countCards('h')>player.countCards('h'); + groupSkill: true, + filterTarget: function (card, player, target) { + return target.countCards("h") > player.countCards("h"); }, - content:function(){ - 'step 0' - var card={ - name:'sha', - nature:'fire', - storage:{jsrgjinmie:target}, - isCard:true, + content: function () { + "step 0"; + var card = { + name: "sha", + nature: "fire", + storage: { jsrgjinmie: target }, + isCard: true, }; - if(player.canUse(card,target,false)){ - player.useCard(card,target,false); - player.addTempSkill('jsrgjinmie_effect'); + if (player.canUse(card, target, false)) { + player.useCard(card, target, false); + player.addTempSkill("jsrgjinmie_effect"); } }, - ai:{ - order:0.5, - result:{ - target:function(player,target){ - var eff=get.effect(target,{name:'sha',nature:'fire'},player,target)/30; - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) eff*=2; - var del=target.countCards('h')-player.countCards('h')+1.5; - eff*=Math.sqrt(del); + ai: { + order: 0.5, + result: { + target: function (player, target) { + var eff = + get.effect(target, { name: "sha", nature: "fire" }, player, target) / 30; + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + eff *= 2; + var del = target.countCards("h") - player.countCards("h") + 1.5; + eff *= Math.sqrt(del); return eff; - } - } + }, + }, }, - subSkill:{ - effect:{ - trigger:{ - source:'damageSource', + subSkill: { + effect: { + trigger: { + source: "damageSource", }, - filter:function(event,player){ - return event.card&&event.card.storage&&event.card.storage.jsrgjinmie&&event.card.storage.jsrgjinmie.isIn(); + filter: function (event, player) { + return ( + event.card && + event.card.storage && + event.card.storage.jsrgjinmie && + event.card.storage.jsrgjinmie.isIn() + ); }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - 'step 0' - var target=trigger.card.storage.jsrgjinmie; - var del=target.countCards('h')-player.countCards('h'); - if(del>0){ + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + var target = trigger.card.storage.jsrgjinmie; + var del = target.countCards("h") - player.countCards("h"); + if (del > 0) { player.line(target); - player.discardPlayerCard(target,'h',true,del); + player.discardPlayerCard(target, "h", true, del); } // else if(del<0){ // player.line(target); // target.draw(-del); // } - } - } + }, + }, }, }, //吕布 - jsrgwuchang:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + jsrgwuchang: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - forced:true, - filter:function(event,player){ - var cards=event.getg(player); - if(!cards.length) return false; - return game.hasPlayer(current=>{ - if(current==player) return false; + forced: true, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer((current) => { + if (current == player) return false; return event.getl(current).cards2.length; }); }, - group:'jsrgwuchang_add', - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>{ - if(current==player) return false; + group: "jsrgwuchang_add", + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => { + if (current == player) return false; return trigger.getl(current).cards2.length; }); - var target=targets[0]; + var target = targets[0]; player.changeGroup(target.group); - player.popup(target.group+'2',get.groupnature(target.group,'raw')); + player.popup(target.group + "2", get.groupnature(target.group, "raw")); }, - subSkill:{ - add:{ - trigger:{ - source:'damageBegin1', + subSkill: { + add: { + trigger: { + source: "damageBegin1", }, - filter:function(event,player){ - if(!event.card||!['sha','juedou'].includes(event.card.name)||event.getParent().type!='card') return false; - return event.player.group==player.group; + filter: function (event, player) { + if ( + !event.card || + !["sha", "juedou"].includes(event.card.name) || + event.getParent().type != "card" + ) + return false; + return event.player.group == player.group; }, - forced:true, - content:function(){ - 'step 0' + forced: true, + content: function () { + "step 0"; trigger.num++; - var group='qun'; + var group = "qun"; player.changeGroup(group); - player.popup(group+'2',get.groupnature(group,'raw')); - }, - } - }, - }, - jsrgqingjiao:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(player.group!='qun') return false; - if(!player.countCards('hes')) return false; - return !player.hasSkill('jsrgqingjiao_tuixinzhifu')&&game.hasPlayer(current=>{ - return current.countCards('h')>player.countCards('h'); - })||!player.hasSkill('jsrgqingjiao_chenghuodajie')&&game.hasPlayer(current=>{ - return current.countCards('h')0?'tuixinzhifu':'chenghuodajie'; - if(player.hasSkill('jsrgqingjiao_'+name)) return false; - return player.canUse({name:name,cards:ui.selected.cards},target); - }, - content:function(){ - var del=target.countCards('h')-player.countCards('h'); - var name=del>0?'tuixinzhifu':'chenghuodajie'; - player.useCard({name:name},target,cards); - player.addTempSkill('jsrgqingjiao_'+name,'phaseUseAfter'); - }, - ai:{ - order:7, - result:{ - player:function(player,target){ - var name=(target.countCards('h')>player.countCards('h')?'tuixinzhifu':'chenghuodajie'); - var list=[]; - if(ui.selected.cards.length) list.addArray(ui.selected.cards); - var card=get.autoViewAs({name:name},list); - return get.effect(target,card,player,player); + player.popup(group + "2", get.groupnature(group, "raw")); }, }, }, - subSkill:{ - tuixinzhifu:{ - charlotte:true, - }, - chenghuodajie:{ - charlotte:true, - }, - } }, - jsrgchengxu:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - locked:false, - filter:function(event,player){ - if(player.group!='shu') return false; - return game.hasPlayer(current=>{ - return current!=player&¤t.group==player.group; + jsrgqingjiao: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.group != "qun") return false; + if (!player.countCards("hes")) return false; + return ( + (!player.hasSkill("jsrgqingjiao_tuixinzhifu") && + game.hasPlayer((current) => { + return current.countCards("h") > player.countCards("h"); + })) || + (!player.hasSkill("jsrgqingjiao_chenghuodajie") && + game.hasPlayer((current) => { + return current.countCards("h") < player.countCards("h"); + })) + ); + }, + groupSkill: true, + position: "hes", + filterCard: true, + selectCard: 1, + discard: false, + lose: false, + delay: false, + filterTarget: function (card, player, target) { + var mod = game.checkMod( + ui.selected.cards[0], + player, + "unchanged", + "cardEnabled2", + player + ); + if (!mod) return false; + var del = target.countCards("h") - player.countCards("h"); + if (del == 0) return false; + var name = del > 0 ? "tuixinzhifu" : "chenghuodajie"; + if (player.hasSkill("jsrgqingjiao_" + name)) return false; + return player.canUse({ name: name, cards: ui.selected.cards }, target); + }, + content: function () { + var del = target.countCards("h") - player.countCards("h"); + var name = del > 0 ? "tuixinzhifu" : "chenghuodajie"; + player.useCard({ name: name }, target, cards); + player.addTempSkill("jsrgqingjiao_" + name, "phaseUseAfter"); + }, + ai: { + order: 7, + result: { + player: function (player, target) { + var name = + target.countCards("h") > player.countCards("h") + ? "tuixinzhifu" + : "chenghuodajie"; + var list = []; + if (ui.selected.cards.length) list.addArray(ui.selected.cards); + var card = get.autoViewAs({ name: name }, list); + return get.effect(target, card, player, player); + }, + }, + }, + subSkill: { + tuixinzhifu: { + charlotte: true, + }, + chenghuodajie: { + charlotte: true, + }, + }, + }, + jsrgchengxu: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if (player.group != "shu") return false; + return game.hasPlayer((current) => { + return current != player && current.group == player.group; }); }, - groupSkill:true, - content:function(){ - trigger.directHit.addArray(game.filterPlayer(current=>{ - return current!=player&¤t.group==player.group; - })); + groupSkill: true, + content: function () { + trigger.directHit.addArray( + game.filterPlayer((current) => { + return current != player && current.group == player.group; + }) + ); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return player.group=='shu'&&player.group==arg.target.group; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return player.group == "shu" && player.group == arg.target.group; }, }, }, //张郃 - jsrgqiongtu:{ - audio:2, - enable:'chooseToUse', - groupSkill:true, - viewAs:{ - name:'wuxie', - suit:'none', - number:null, - isCard:true, + jsrgqiongtu: { + audio: 2, + enable: "chooseToUse", + groupSkill: true, + viewAs: { + name: "wuxie", + suit: "none", + number: null, + isCard: true, }, - filter:function(event,player){ - if(!player.countCards('he',card=>_status.connectMode||get.type(card)!='basic')) return false; - return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); + filter: function (event, player) { + if (!player.countCards("he", (card) => _status.connectMode || get.type(card) != "basic")) + return false; + return player.group == "qun" && !player.hasSkill("jsrgqiongtu_check"); }, - viewAsFilter:function(player){ - if(!player.countCards('he',card=>_status.connectMode||get.type(card)!='basic')) return false; - return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); + viewAsFilter: function (player) { + if (!player.countCards("he", (card) => _status.connectMode || get.type(card) != "basic")) + return false; + return player.group == "qun" && !player.hasSkill("jsrgqiongtu_check"); }, - filterCard:function(card){ - return get.type(card)!='basic'; + filterCard: function (card) { + return get.type(card) != "basic"; }, - position:'he', - popname:true, - ignoreMod:true, - precontent:function(){ - 'step 0' - player.logSkill('jsrgqiongtu'); + position: "he", + popname: true, + ignoreMod: true, + precontent: function () { + "step 0"; + player.logSkill("jsrgqiongtu"); delete event.result.skill; - var card=event.result.cards[0]; - event.card=card; - event.result.card={ - name:event.result.card.name, - storage:{jsrgqiongtu:true}, - isCard:true, + var card = event.result.cards[0]; + event.card = card; + event.result.card = { + name: event.result.card.name, + storage: { jsrgqiongtu: true }, + isCard: true, }; - event.result.cards=[]; - player.addToExpansion(card,player,'give').gaintag.add('jsrgqiongtu'); - player.addTempSkill('jsrgqiongtu_check'); + event.result.cards = []; + player.addToExpansion(card, player, "give").gaintag.add("jsrgqiongtu"); + player.addTempSkill("jsrgqiongtu_check"); }, - marktext:'途', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "途", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); delete player.storage[skill]; }, - subSkill:{ - check:{ - trigger:{ - global:'useCardAfter', + subSkill: { + check: { + trigger: { + global: "useCardAfter", }, - filter:function(event,player){ - return event.card.name=='wuxie'&&event.card.storage&&event.card.storage.jsrgqiongtu; + filter: function (event, player) { + return ( + event.card.name == "wuxie" && + event.card.storage && + event.card.storage.jsrgqiongtu + ); }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - 'step 0' + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; game.delayx(); - var evt=trigger.getParent(4); - if(evt.name=='phaseJudge'){ - state=evt.cancelled; + var evt = trigger.getParent(4); + if (evt.name == "phaseJudge") { + state = evt.cancelled; + } else { + state = evt._neutralized; } - else{ - state=evt._neutralized; - } - if(state){ + if (state) { player.draw(); + } else { + player.changeGroup("wei"); + var cards = player.getExpansions("jsrgqiongtu"); + if (cards.length) player.gain(cards, "gain2"); } - else{ - player.changeGroup('wei'); - var cards=player.getExpansions('jsrgqiongtu'); - if(cards.length) player.gain(cards,'gain2'); - } - } + }, }, }, }, - jsrgxianzhu:{ - audio:2, - enable:'chooseToUse', - filter:function(event,player){ - return player.group=='wei'&&player.hasCard(card=>{ - return _status.connectMode||get.type(card)=='trick'; - },'hs'); + jsrgxianzhu: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.group == "wei" && + player.hasCard((card) => { + return _status.connectMode || get.type(card) == "trick"; + }, "hs") + ); }, - groupSkill:true, - locked:false, - viewAs:{ - name:'sha', - storage:{jsrgxianzhu:true}, + groupSkill: true, + locked: false, + viewAs: { + name: "sha", + storage: { jsrgxianzhu: true }, }, - position:'hs', - filterCard:function(card){ - return get.type(card)=='trick'; + position: "hs", + filterCard: function (card) { + return get.type(card) == "trick"; }, - check:function(card){ - var player=_status.event.player; - var cardx={ - name:'sha', - storage:{jsrgxianzhu:true}, - cards:[card], - } - if(game.hasPlayer(current=>{ - return player.canUse(cardx,current)&&get.effect(current,card,player,player)>0&&get.effect(current,cardx,player,player)>0; - })) return 15-get.value(card); + check: function (card) { + var player = _status.event.player; + var cardx = { + name: "sha", + storage: { jsrgxianzhu: true }, + cards: [card], + }; + if ( + game.hasPlayer((current) => { + return ( + player.canUse(cardx, current) && + get.effect(current, card, player, player) > 0 && + get.effect(current, cardx, player, player) > 0 + ); + }) + ) + return 15 - get.value(card); return 0; }, - onuse:function(links,player){ - player.addTempSkill('jsrgxianzhu_after'); + onuse: function (links, player) { + player.addTempSkill("jsrgxianzhu_after"); }, - mod:{ - cardUsable:function(card){ - if(card.storage&&card.storage.jsrgxianzhu) return Infinity; + mod: { + cardUsable: function (card) { + if (card.storage && card.storage.jsrgxianzhu) return Infinity; }, }, - subSkill:{ - after:{ - trigger:{ - global:'damageSource', + subSkill: { + after: { + trigger: { + global: "damageSource", }, - filter:function(event,player){ - var targets=event.getParent(2).targets; - if(!targets||targets.length!=1) return false; - if(!event.card||!event.card.storage||!event.card.storage.jsrgxianzhu) return false; - var target=event.player,card=event.cards[0]; - if(!target.isIn()) return false; - if(get.type(card)!='trick') return false; - if(!player.canUse(card,target,false)) return false; + filter: function (event, player) { + var targets = event.getParent(2).targets; + if (!targets || targets.length != 1) return false; + if (!event.card || !event.card.storage || !event.card.storage.jsrgxianzhu) + return false; + var target = event.player, + card = event.cards[0]; + if (!target.isIn()) return false; + if (get.type(card) != "trick") return false; + if (!player.canUse(card, target, false)) return false; return true; }, - forced:true, - charlotte:true, - group:'jsrgxianzhu_inf', - content:function(){ - var card={ - name:trigger.cards[0].name, - isCard:true, - } - player.useCard(card,trigger.player,false); + forced: true, + charlotte: true, + group: "jsrgxianzhu_inf", + content: function () { + var card = { + name: trigger.cards[0].name, + isCard: true, + }; + player.useCard(card, trigger.player, false); game.delayx(); }, }, - inf:{ - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - if(event.card.storage&&event.card.storage.jsrgxianzhu&&event.addCount!==false) return true; + inf: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if ( + event.card.storage && + event.card.storage.jsrgxianzhu && + event.addCount !== false + ) + return true; return false; }, - content:function(){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(typeof stat[name]=='number') stat[name]--; + content: function () { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; }, }, }, }, //邹氏 - jsrgguyin:{ - audio:2, - trigger:{ - player:'phaseZhunbeiBegin', + jsrgguyin: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", }, - check:function(event,player){ - return player.isTurnedOver()||game.countPlayer2(current=>current.hasSex('male'))>=2; + check: function (event, player) { + return ( + player.isTurnedOver() || game.countPlayer2((current) => current.hasSex("male")) >= 2 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.turnOver(); - 'step 1' - var targets=game.filterPlayer(current=>current!=player&¤t.hasSex('male')); - event.targets=targets; + ("step 1"); + var targets = game.filterPlayer((current) => current != player && current.hasSex("male")); + event.targets = targets; player.line(targets); game.delayx(); - 'step 2' - var target=targets.shift(); - event.target=target; - target.chooseBool('是否响应'+get.translation(player)+'的【孤吟】?','你可以翻面。').set('ai',()=>{ - return _status.event.bool; - }).set('bool',function(){ - return target.isTurnedOver()||get.attitude(target,player)>0&&(game.countPlayer2(current=>current.hasSex('male'))>=3||target.getHp()<=1&&player.hasSkill('jsrgzhangdeng')); - }()); - 'step 3' - if(result.bool){ + ("step 2"); + var target = targets.shift(); + event.target = target; + target + .chooseBool("是否响应" + get.translation(player) + "的【孤吟】?", "你可以翻面。") + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + (function () { + return ( + target.isTurnedOver() || + (get.attitude(target, player) > 0 && + (game.countPlayer2((current) => current.hasSex("male")) >= 3 || + (target.getHp() <= 1 && player.hasSkill("jsrgzhangdeng")))) + ); + })() + ); + ("step 3"); + if (result.bool) { target.turnOver(); } - if(targets.length) event.goto(2); - 'step 4' - var targets=game.filterPlayer(current=>{ - return current==player||current.isTurnedOver(); + if (targets.length) event.goto(2); + ("step 4"); + var targets = game.filterPlayer((current) => { + return current == player || current.isTurnedOver(); }); - event.targets=targets; - event.num=0; - event.index=0; - 'step 5' - var target=targets[event.index]; - if(target.isIn()){ + event.targets = targets; + event.num = 0; + event.index = 0; + ("step 5"); + var target = targets[event.index]; + if (target.isIn()) { target.draw(); event.num++; } event.index++; - if(event.index>=targets.length) event.index=0; - 'step 6' - if(event.num>=game.countPlayer2(current=>current.hasSex('male'))) event.finish(); + if (event.index >= targets.length) event.index = 0; + ("step 6"); + if (event.num >= game.countPlayer2((current) => current.hasSex("male"))) event.finish(); else event.goto(5); }, }, - jsrgzhangdeng:{ - audio:2, - trigger:{ - global:'logSkill', + jsrgzhangdeng: { + audio: 2, + trigger: { + global: "logSkill", }, - filter:function(event,player){ - return event.player.getHistory('useSkill',evt=>{ - return evt.skill=='jsrgzhangdeng_jiu'; - }).map(evt=>evt.event).indexOf(event.log_event)==1; + filter: function (event, player) { + return ( + event.player + .getHistory("useSkill", (evt) => { + return evt.skill == "jsrgzhangdeng_jiu"; + }) + .map((evt) => evt.event) + .indexOf(event.log_event) == 1 + ); }, - global:'jsrgzhangdeng_jiu', - forced:true, - locked:false, - content:function(){ + global: "jsrgzhangdeng_jiu", + forced: true, + locked: false, + content: function () { player.turnOver(false); }, - subSkill:{ - jiu:{ - audio:'jsrgzhangdeng', - enable:'chooseToUse', - filter:function(event,player){ - return player.isTurnedOver()&&game.hasPlayer(current=>{ - return current.hasSkill('jsrgzhangdeng')&¤t.isTurnedOver(); - }); + subSkill: { + jiu: { + audio: "jsrgzhangdeng", + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.isTurnedOver() && + game.hasPlayer((current) => { + return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); + }) + ); }, - viewAs:{name:'jiu',isCard:true}, - viewAsFilter:function(player){ - return player.isTurnedOver()&&game.hasPlayer(current=>{ - return current.hasSkill('jsrgzhangdeng')&¤t.isTurnedOver(); - }); + viewAs: { name: "jiu", isCard: true }, + viewAsFilter: function (player) { + return ( + player.isTurnedOver() && + game.hasPlayer((current) => { + return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); + }) + ); }, - filterCard:()=>false, - selectCard:-1, - precontent:function(){ - player.logSkill('jsrgzhangdeng_jiu'); - var targets=game.filterPlayer(current=>{ - return current.hasSkill('jsrgzhangdeng')&¤t.isTurnedOver(); + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.logSkill("jsrgzhangdeng_jiu"); + var targets = game.filterPlayer((current) => { + return current.hasSkill("jsrgzhangdeng") && current.isTurnedOver(); }); player.line(targets[0]); delete event.result.skill; @@ -4712,718 +5781,867 @@ game.import('character', function () { }, }, //关羽 - jsrgguanjue:{ - audio:2, - trigger:{ - player:['useCard','respond'], + jsrgguanjue: { + audio: 2, + trigger: { + player: ["useCard", "respond"], }, - filter:function(event,player){ + filter: function (event, player) { return lib.suit.includes(get.suit(event.card)); }, - forced:true, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>current!=player); - var suit=get.suit(trigger.card); - for(var target of targets){ - target.addTempSkill('jsrgguanjue_ban'); - target.markAuto('jsrgguanjue_ban',[suit]); + forced: true, + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => current != player); + var suit = get.suit(trigger.card); + for (var target of targets) { + target.addTempSkill("jsrgguanjue_ban"); + target.markAuto("jsrgguanjue_ban", [suit]); } }, - subSkill:{ - ban:{ - onremove:true, - charlotte:true, - mod:{ - cardEnabled:function(card,player){ - if(player.getStorage('jsrgguanjue_ban').includes(get.suit(card))) return false; + subSkill: { + ban: { + onremove: true, + charlotte: true, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) + return false; }, - cardRespondable:function(card,player){ - if(player.getStorage('jsrgguanjue_ban').includes(get.suit(card))) return false; + cardRespondable: function (card, player) { + if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) + return false; }, - cardSavable:function(card,player){ - if(player.getStorage('jsrgguanjue_ban').includes(get.suit(card))) return false; + cardSavable: function (card, player) { + if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) + return false; }, }, - mark:true, - marktext:'绝', - intro:{ - content:'本回合内不能使用或打出$的牌', + mark: true, + marktext: "绝", + intro: { + content: "本回合内不能使用或打出$的牌", }, }, }, }, - jsrgnianen:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - filter:function(event,player){ - if(!player.countCards('hes')) return false; - if(player.hasSkill('jsrgnianen_blocker')) return false; - for(var name of lib.inpile){ - if(get.type2(name)!='basic') continue; - var card={name:name}; - if(event.filterCard(get.autoViewAs(card,'unsure'),player,event)) return true; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(get.autoViewAs(card,'unsure'),player,event)) return true; + jsrgnianen: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if (!player.countCards("hes")) return false; + if (player.hasSkill("jsrgnianen_blocker")) return false; + for (var name of lib.inpile) { + if (get.type2(name) != "basic") continue; + var card = { name: name }; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(get.autoViewAs(card, "unsure"), player, event)) + return true; } } } return false; }, - derivation:'mashu', - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - if(name=='sha'){ - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)) list.push(['基本','','sha']); - for(var nature of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name,nature},'unsure'),player,event)) list.push(['基本','','sha',nature]); + derivation: "mashu", + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (name == "sha") { + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) + list.push(["基本", "", "sha"]); + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name, nature }, "unsure"), + player, + event + ) + ) + list.push(["基本", "", "sha", nature]); } - } - else if(get.type(name)=='basic'&&event.filterCard(get.autoViewAs({name},'unsure'),player,event)) list.push(['基本','',name]); + } else if ( + get.type(name) == "basic" && + event.filterCard(get.autoViewAs({ name }, "unsure"), player, event) + ) + list.push(["基本", "", name]); } - var dialog=ui.create.dialog('念恩',[list,'vcard']); - dialog.direct=true; + var dialog = ui.create.dialog("念恩", [list, "vcard"]); + dialog.direct = true; return dialog; }, - filter:function(button,player){ - return _status.event.getParent().filterCard(get.autoViewAs({name:button.link[2],nature:button.link[3]},'unsure'),player,_status.event.getParent()); + filter: function (button, player) { + return _status.event + .getParent() + .filterCard( + get.autoViewAs({ name: button.link[2], nature: button.link[3] }, "unsure"), + player, + _status.event.getParent() + ); }, - check:function(button){ - if(_status.event.getParent().type!='phase') return 1; - var player=_status.event.player; - if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].includes(button.link[2])) return 0; + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + if ( + [ + "wugu", + "zhulu_card", + "yiyi", + "lulitongxin", + "lianjunshengyan", + "diaohulishan", + ].includes(button.link[2]) + ) + return 0; return player.getUseValue({ - name:button.link[2], - nature:button.link[3], + name: button.link[2], + nature: button.link[3], }); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'jsrgnianen', - filterCard:true, - popname:true, - check:function(card){ - return 8-get.value(card); + audio: "jsrgnianen", + filterCard: true, + popname: true, + check: function (card) { + return 8 - get.value(card); }, - position:'hes', - viewAs:{name:links[0][2],nature:links[0][3]}, - precontent:function(){ - player.logSkill('jsrgnianen'); + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent: function () { + player.logSkill("jsrgnianen"); delete event.result.skill; - var card=event.result.card; - if(get.color(card,player)!='red'||get.name(card)!='sha'||get.natureList(card).length){ - player.addTempSkill('jsrgnianen_blocker'); - player.addAdditionalSkill('jsrgnianen_blocker','mashu'); + var card = event.result.card; + if ( + get.color(card, player) != "red" || + get.name(card) != "sha" || + get.natureList(card).length + ) { + player.addTempSkill("jsrgnianen_blocker"); + player.addAdditionalSkill("jsrgnianen_blocker", "mashu"); } }, - } + }; }, - prompt:function(links,player){ - return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; - } - }, - hiddenCard:function(player,name){ - if(!lib.inpile.includes(name)) return false; - var type=get.type2(name); - return type=='basic'&&player.countCards('hes')>0&&!player.hasSkill('jsrgnianen_blocker'); - }, - ai:{ - fireAttack:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player){ - if(!player.countCards('hes')||player.hasSkill('jsrgnianen_blocker')) return false; + prompt: function (links, player) { + return ( + "将一张牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - order:1, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + }, + hiddenCard: function (player, name) { + if (!lib.inpile.includes(name)) return false; + var type = get.type2(name); + return ( + type == "basic" && + player.countCards("hes") > 0 && + !player.hasSkill("jsrgnianen_blocker") + ); + }, + ai: { + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if (!player.countCards("hes") || player.hasSkill("jsrgnianen_blocker")) return false; + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, - subSkill:{ - blocker:{ - charlotte:true, - mark:true, - marktext:'恩', - intro:{content:'视为拥有〖马术〗'}, + subSkill: { + blocker: { + charlotte: true, + mark: true, + marktext: "恩", + intro: { content: "视为拥有〖马术〗" }, }, }, }, //生鱼片 - jsrglunshi:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return game.hasPlayer(current=>{ + jsrglunshi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return game.hasPlayer((current) => { return current.inRangeOf(target); }); }, - content:function(){ - 'step 0' - var num=game.countPlayer(current=>{ + content: function () { + "step 0"; + var num = game.countPlayer((current) => { return current.inRangeOf(target); }); - var len=target.countCards('h'); - num=Math.max(0,Math.min(len+num,5)-len); - if(num>0) target.draw(num); - 'step 1' - var num=game.countPlayer(current=>{ + var len = target.countCards("h"); + num = Math.max(0, Math.min(len + num, 5) - len); + if (num > 0) target.draw(num); + ("step 1"); + var num = game.countPlayer((current) => { return current.inRange(target); }); - if(num>0) target.chooseToDiscard(num,'he',true,get.translation(player)+'对你发动了【论势】','请弃置'+get.cnNumber(num)+'张牌'); + if (num > 0) + target.chooseToDiscard( + num, + "he", + true, + get.translation(player) + "对你发动了【论势】", + "请弃置" + get.cnNumber(num) + "张牌" + ); }, - ai:{ - order:6, - result:{ - target:function(player,target){ - var num1=game.countPlayer(current=>{ - return current.inRangeOf(target); - }),num2=game.countPlayer(current=>{ - return current.inRange(target); - }); - var len=target.countCards('h'); - num1=Math.max(0,Math.min(len+num1,5)-len); - return (num1-num2+1)/2; - } - } + ai: { + order: 6, + result: { + target: function (player, target) { + var num1 = game.countPlayer((current) => { + return current.inRangeOf(target); + }), + num2 = game.countPlayer((current) => { + return current.inRange(target); + }); + var len = target.countCards("h"); + num1 = Math.max(0, Math.min(len + num1, 5) - len); + return (num1 - num2 + 1) / 2; + }, + }, }, }, - jsrgguitu:{ - audio:2, - trigger:{ - player:'phaseZhunbeiBegin', + jsrgguitu: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", }, - direct:true, - filter:function(event,player){ - return game.countPlayer(current=>{ - return current.getEquips(1).length; - })>=2; + direct: true, + filter: function (event, player) { + return ( + game.countPlayer((current) => { + return current.getEquips(1).length; + }) >= 2 + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgguitu'),(card,player,target)=>{ - return target.getEquips(1).length; - },[1,2]).set('filterOk',()=>{ - var num=0; - for(var target of ui.selected.targets){ - num+=target.getEquips(1).length; - } - return num>=2; - }).set('ai',target=>{ - var sign=-1; - var val=0; - if(ui.selected.targets.length){ - sign=1; - var targetx=ui.selected.targets[0]; - var cards=targetx.getEquips(1); - var list=cards.map(card=>{ - return [card,get.value(card,targetx)]; + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt2("jsrgguitu"), + (card, player, target) => { + return target.getEquips(1).length; + }, + [1, 2] + ) + .set("filterOk", () => { + var num = 0; + for (var target of ui.selected.targets) { + num += target.getEquips(1).length; + } + return num >= 2; + }) + .set("ai", (target) => { + var sign = -1; + var val = 0; + if (ui.selected.targets.length) { + sign = 1; + var targetx = ui.selected.targets[0]; + var cards = targetx.getEquips(1); + var list = cards.map((card) => { + return [card, get.value(card, targetx)]; + }); + list.sort((a, b) => { + return b[1] - a[1]; + }); + val = get.attitude(_status.event.player, targetx) * list[0][1]; + } + var cards = target.getEquips(1); + var list = cards.map((card) => { + return [card, get.value(card, target)]; }); - list.sort((a,b)=>{ - return b[1]-a[1]; + list.sort((a, b) => { + return b[1] - a[1]; }); - val=get.attitude(_status.event.player,targetx)*list[0][1]; - } - var cards=target.getEquips(1); - var list=cards.map(card=>{ - return [card,get.value(card,target)]; + return get.attitude(_status.event.player, target) * list[0][1] * sign - val; }); - list.sort((a,b)=>{ - return b[1]-a[1]; - }); - return get.attitude(_status.event.player,target)*list[0][1]*sign-val; - }); - 'step 1' - if(result.bool){ - var targets=result.targets.slice(); + ("step 1"); + if (result.bool) { + var targets = result.targets.slice(); targets.sortBySeat(); - event.targets=targets; - player.logSkill('jsrgguitu',targets); - event.rangeList=targets.map(target=>{ + event.targets = targets; + player.logSkill("jsrgguitu", targets); + event.rangeList = targets.map((target) => { return target.getAttackRange(); }); - var weapons=[]; - for(var target of targets){ + var weapons = []; + for (var target of targets) { weapons.addArray(target.getEquips(1)); } - if(weapons.length>2){ - var list=['诡图:选择要交换的武器牌']; - for(var target of targets){ + if (weapons.length > 2) { + var list = ["诡图:选择要交换的武器牌"]; + for (var target of targets) { list.addArray([ - '
    '+get.translation(target)+'的武器牌
    ', - target.getEquips(1) - ]) + '
    ' + get.translation(target) + "的武器牌
    ", + target.getEquips(1), + ]); } - player.chooseButton(list,true,2).set('filterButton',button=>{ - var count=_status.event.count; - if(count==1) return true; - for(var i=0;i{ - var player=_status.event.player; - var card=button.link; - var owner=get.owner(card); - var att=get.attitude(player,owner); - var val=-get.value(card)*att; - return val; - }); - } - else event._result={bool:true,links:weapons}; - } - else event.finish(); - 'step 2' - if(result.bool){ - var links=result.links; - var list=[]; - for(var target of targets){ - var weapons=target.getEquips(1); - weapons=weapons.filter(i=>links.includes(i)); - if(weapons.length){ - list.push([target,weapons]); + player + .chooseButton(list, true, 2) + .set("filterButton", (button) => { + var count = _status.event.count; + if (count == 1) return true; + for (var i = 0; i < ui.selected.buttons.length; i++) { + if (get.owner(button.link) == get.owner(ui.selected.buttons[i].link)) + return false; + } + return true; + }) + .set("count", targets.length) + .set("ai", (button) => { + var player = _status.event.player; + var card = button.link; + var owner = get.owner(card); + var att = get.attitude(player, owner); + var val = -get.value(card) * att; + return val; + }); + } else event._result = { bool: true, links: weapons }; + } else event.finish(); + ("step 2"); + if (result.bool) { + var links = result.links; + var list = []; + for (var target of targets) { + var weapons = target.getEquips(1); + weapons = weapons.filter((i) => links.includes(i)); + if (weapons.length) { + list.push([target, weapons]); } } - if(list.length==2){ - event.players=list.map(i=>i[0]); - event.cards=list.map(i=>i[1]); - } - else{ - event.players=[list[0][0],list[0][0]]; - event.cards=list[0][1]; + if (list.length == 2) { + event.players = list.map((i) => i[0]); + event.cards = list.map((i) => i[1]); + } else { + event.players = [list[0][0], list[0][0]]; + event.cards = list[0][1]; } game.loseAsync({ - player:event.players[0], - target:event.players[1], - cards1:event.cards[0], - cards2:event.cards[1], - }).setContent('swapHandcardsx'); + player: event.players[0], + target: event.players[1], + cards1: event.cards[0], + cards2: event.cards[1], + }).setContent("swapHandcardsx"); + } else event.finish(); + ("step 3"); + for (var i = 0; i < event.cards[1].length; i++) { + if (get.position(event.cards[1][i], true) == "o") + event.players[0].equip(event.cards[1][i]); } - else event.finish(); - 'step 3' - for(var i=0;i{ + ("step 4"); + var rangeList = targets.map((target) => { return target.getAttackRange(); }); - for(var i=0;ilist.includes(name)); - var str=get.translation(trigger.player)+(evt.card?'因'+get.translation(evt.card):'')+'需要'+reason+'一张'+names+',是否弃置一张牌视为其'+reason+'之'+ - (used.length?('(你不能以此法令其'+reason+get.translation(used)+')'):'')+'?若如此做,你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。'; - event.str=str; - if(!listx.length) event.finish(); - else if(listx.length==1) event._result={bool:true,links:listx}; - else{ - event.asked=true; - player.chooseButton([ - '###'+get.prompt('jsrgjixiang',trigger.player)+'###
    '+str+'
    ', - [listx,'vcard'], - ]).set('ai',()=>Math.random()+1); + names = names.slice(0, names.length - 1); + var reason = trigger.name == "chooseToUse" ? "使用" : "打出"; + var used = player.getStorage("jsrgjixiang_used").filter((name) => list.includes(name)); + var str = + get.translation(trigger.player) + + (evt.card ? "因" + get.translation(evt.card) : "") + + "需要" + + reason + + "一张" + + names + + ",是否弃置一张牌视为其" + + reason + + "之" + + (used.length ? "(你不能以此法令其" + reason + get.translation(used) + ")" : "") + + "?若如此做,你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。"; + event.str = str; + if (!listx.length) event.finish(); + else if (listx.length == 1) event._result = { bool: true, links: listx }; + else { + event.asked = true; + player + .chooseButton([ + "###" + + get.prompt("jsrgjixiang", trigger.player) + + '###
    ' + + str + + "
    ", + [listx, "vcard"], + ]) + .set("ai", () => Math.random() + 1); } - event.list=list; - 'step 1' - if(result.bool){ - var name=result.links[0][2],nature=result.links[0][3]; - var card={name:name,nature:nature,isCard:true}; - event.card=card; - var evt=trigger.getParent(); - var reason=(trigger.name=='chooseToUse'?'使用':'打出'); - var prompt=event.asked? - '济乡:是否弃置一张牌'+(trigger.filterTarget?'并选择目标角色':'')+'?': - get.prompt('jsrgjixiang',trigger.player); - var str=event.asked?'若如此做,视为'+get.translation(trigger.player)+reason+get.translation(card)+',然后你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。':event.str; - var next=player.chooseCardTarget({ - prompt:prompt, - prompt2:str, - filterCard:lib.filter.cardDiscardable, - position:'he', - goon:get.attitude(player,trigger.player)>1&&(evt.card?get.effect(trigger.player,evt.card,evt.player,player)<0:get.effect(trigger.player,{name:event.list[0]},trigger.player,player)>0), - ai1:function(card){ - if(_status.event.goon) return 6-get.value(card); + event.list = list; + ("step 1"); + if (result.bool) { + var name = result.links[0][2], + nature = result.links[0][3]; + var card = { name: name, nature: nature, isCard: true }; + event.card = card; + var evt = trigger.getParent(); + var reason = trigger.name == "chooseToUse" ? "使用" : "打出"; + var prompt = event.asked + ? "济乡:是否弃置一张牌" + (trigger.filterTarget ? "并选择目标角色" : "") + "?" + : get.prompt("jsrgjixiang", trigger.player); + var str = event.asked + ? "若如此做,视为" + + get.translation(trigger.player) + + reason + + get.translation(card) + + ",然后你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。" + : event.str; + var next = player.chooseCardTarget({ + prompt: prompt, + prompt2: str, + filterCard: lib.filter.cardDiscardable, + position: "he", + goon: + get.attitude(player, trigger.player) > 1 && + (evt.card + ? get.effect(trigger.player, evt.card, evt.player, player) < 0 + : get.effect( + trigger.player, + { name: event.list[0] }, + trigger.player, + player + ) > 0), + ai1: function (card) { + if (_status.event.goon) return 6 - get.value(card); return 0; }, - _get_card:card, + _get_card: card, }); - var keys=['filterTarget','selectTarget','ai2']; - for(var key of keys) delete next[key]; - for(var i in trigger){ - if(!(i in next)) next[i]=trigger[i]; + var keys = ["filterTarget", "selectTarget", "ai2"]; + for (var key of keys) delete next[key]; + for (var i in trigger) { + if (!(i in next)) next[i] = trigger[i]; } - next.filterTargetx=trigger.filterTarget||(()=>false); - next.filterTarget=function(card,player,target){ - var filter=this.filterTargetx; - if(typeof filter!='function') filter=(()=>filter); - card=_status.event._get_card; - player=_status.event.getTrigger().player; - return this.filterTargetx.apply(this,arguments); + next.filterTargetx = trigger.filterTarget || (() => false); + next.filterTarget = function (card, player, target) { + var filter = this.filterTargetx; + if (typeof filter != "function") filter = () => filter; + card = _status.event._get_card; + player = _status.event.getTrigger().player; + return this.filterTargetx.apply(this, arguments); }; - if(typeof next.selectTarget!='number'&&typeof next.selectTarget!='function'&&get.itemtype(next.selectTarget)!='select') next.selectTarget=-1; - } - else event.finish(); - 'step 2' - if(result.bool){ - var cardx=result.cards[0]; - var targets=result.targets||[]; - event.targets=targets; - player.logSkill('jsrgjixiang',trigger.player); - player.addTempSkill('jsrgjixiang_used'); - player.markAuto('jsrgjixiang_used',[card.name]); + if ( + typeof next.selectTarget != "number" && + typeof next.selectTarget != "function" && + get.itemtype(next.selectTarget) != "select" + ) + next.selectTarget = -1; + } else event.finish(); + ("step 2"); + if (result.bool) { + var cardx = result.cards[0]; + var targets = result.targets || []; + event.targets = targets; + player.logSkill("jsrgjixiang", trigger.player); + player.addTempSkill("jsrgjixiang_used"); + player.markAuto("jsrgjixiang_used", [card.name]); player.discard(cardx); trigger.untrigger(); - trigger.set('responded',true); - var result={ - bool:true, - card:card + trigger.set("responded", true); + var result = { + bool: true, + card: card, }; - if(targets.length) result.targets=targets; - trigger.result=result; + if (targets.length) result.targets = targets; + trigger.result = result; player.draw(); var phaseName; - for(var name of lib.phaseName){ - var evt=trigger.getParent(name); - if(!evt||evt.name!=name) continue; - phaseName=name; + for (var name of lib.phaseName) { + var evt = trigger.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; break; } - if(phaseName){ - player.addTempSkill('jsrgjixiang_add',phaseName+'After'); - player.addMark('jsrgjixiang_add',1,false); + if (phaseName) { + player.addTempSkill("jsrgjixiang_add", phaseName + "After"); + player.addMark("jsrgjixiang_add", 1, false); } } }, - subSkill:{ - used:{ - charlotte:true, - onremove:true, - mark:true, - marktext:'乡', - intro:{ - content:'已触发过牌名:$', + subSkill: { + used: { + charlotte: true, + onremove: true, + mark: true, + marktext: "乡", + intro: { + content: "已触发过牌名:$", }, }, - add:{ - charlotte:true, - onremove:true, - mark:true, - intro:{ - markcount:(storage,player)=>2+(storage||0), - content:(storage,player)=>'〖称贤〗剩余可发动次数为'+(2+(storage||0)), + add: { + charlotte: true, + onremove: true, + mark: true, + intro: { + markcount: (storage, player) => 2 + (storage || 0), + content: (storage, player) => "〖称贤〗剩余可发动次数为" + (2 + (storage || 0)), }, }, - save:{ - charlotte:true, - ai:{ - save:true, - skillTagFilter:function(player,arg,target){ - return _status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('jsrgjixiang')&&_status.currentPhase.countCards('he'); + save: { + charlotte: true, + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + return ( + _status.currentPhase && + _status.currentPhase != player && + _status.currentPhase.hasSkill("jsrgjixiang") && + _status.currentPhase.countCards("he") + ); }, }, }, }, }, - jsrgchengxian:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(!player.countCards('hs')) return false; - if(2+player.countMark('jsrgjixiang_add')<=0) return false; - for(var name of lib.inpile){ - if(get.type(name)!='trick') continue; - if(player.getStorage('jsrgchengxian_used').includes(name)) continue; - if(event.filterCard({name:name},player,event)) return true; + jsrgchengxian: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("hs")) return false; + if (2 + player.countMark("jsrgjixiang_add") <= 0) return false; + for (var name of lib.inpile) { + if (get.type(name) != "trick") continue; + if (player.getStorage("jsrgchengxian_used").includes(name)) continue; + if (event.filterCard({ name: name }, player, event)) return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - if(player.getStorage('jsrgchengxian_used').includes(name)) continue; - var info=get.info({name:name}); - if(!info||info.type!='trick') continue; - if(info.notarget) continue; - if(!info.selectTarget) continue; - if(get.type(name)=='trick'&&event.filterCard({name:name},player,event)) list.push(['锦囊','',name]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (player.getStorage("jsrgchengxian_used").includes(name)) continue; + var info = get.info({ name: name }); + if (!info || info.type != "trick") continue; + if (info.notarget) continue; + if (!info.selectTarget) continue; + if (get.type(name) == "trick" && event.filterCard({ name: name }, player, event)) + list.push(["锦囊", "", name]); } - var dialog=ui.create.dialog('称贤',[list,'vcard']); + var dialog = ui.create.dialog("称贤", [list, "vcard"]); return dialog; }, - filter:function(button,player){ - return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent()); + filter: function (button, player) { + return _status.event + .getParent() + .filterCard( + { name: button.link[2], nature: button.link[3] }, + player, + _status.event.getParent() + ); }, - check:function(button){ - if(_status.event.getParent().type!='phase') return 1; - var player=_status.event.player; - if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].includes(button.link[2])) return 0; + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + if ( + [ + "wugu", + "zhulu_card", + "yiyi", + "lulitongxin", + "lianjunshengyan", + "diaohulishan", + ].includes(button.link[2]) + ) + return 0; return player.getUseValue({ - name:button.link[2], - nature:button.link[3], + name: button.link[2], + nature: button.link[3], }); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'jsrgchengxian', - filterCard:function(card,player){ - var num=game.countPlayer(current=>{ - return player.canUse(card,current); + audio: "jsrgchengxian", + filterCard: function (card, player) { + var num = game.countPlayer((current) => { + return player.canUse(card, current); }); - if(!num) return false; - var cardx=get.copy(lib.skill.jsrgchengxian_backup.viewAs); - cardx.cards=[card]; - var num2=game.countPlayer(current=>{ - return player.canUse(cardx,current); + if (!num) return false; + var cardx = get.copy(lib.skill.jsrgchengxian_backup.viewAs); + cardx.cards = [card]; + var num2 = game.countPlayer((current) => { + return player.canUse(cardx, current); }); - return num==num2; + return num == num2; }, - popname:true, - check:function(card){ - return 8-get.value(card); + popname: true, + check: function (card) { + return 8 - get.value(card); }, - position:'hs', - viewAs:{name:links[0][2]}, - precontent:function(){ - player.logSkill('jsrgchengxian'); - player.addTempSkill('jsrgjixiang_add'); - if(typeof player.storage.jsrgjixiang_add!='number') player.storage.jsrgjixiang_add=0; + position: "hs", + viewAs: { name: links[0][2] }, + precontent: function () { + player.logSkill("jsrgchengxian"); + player.addTempSkill("jsrgjixiang_add"); + if (typeof player.storage.jsrgjixiang_add != "number") + player.storage.jsrgjixiang_add = 0; player.storage.jsrgjixiang_add--; - player.addTempSkill('jsrgchengxian_used'); - player.markAuto('jsrgchengxian_used',[event.result.card.name]); + player.addTempSkill("jsrgchengxian_used"); + player.markAuto("jsrgchengxian_used", [event.result.card.name]); delete event.result.skill; }, - } + }; + }, + prompt: function (links, player) { + return ( + "将一张合法目标数与" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "相同的手牌当此牌使用" + ); }, - prompt:function(links,player){ - return '将一张合法目标数与'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'相同的手牌当此牌使用'; - } }, //理解错了,下面这个不用了 - getNumber:function(card,player){ - var rangex=null; - var info=get.info(card); - if(!info) return null; - if(info.notarget) return null; - if(info.selectTarget!=undefined){ - var select=get.select(info.selectTarget); - if(select[0]<0){ - if(!info.toself){ - var count=game.countPlayer(current=>{ - return lib.filter.targetEnabled(card,player,current); + getNumber: function (card, player) { + var rangex = null; + var info = get.info(card); + if (!info) return null; + if (info.notarget) return null; + if (info.selectTarget != undefined) { + var select = get.select(info.selectTarget); + if (select[0] < 0) { + if (!info.toself) { + var count = game.countPlayer((current) => { + return lib.filter.targetEnabled(card, player, current); }); - } - else count=1; - rangex=[count,count]; - } - else rangex=select; + } else count = 1; + rangex = [count, count]; + } else rangex = select; } return rangex; }, - ai:{ - order:1, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + ai: { + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, - subSkill:{ - used:{ - charlotte:true, - onremove:true, - mark:true, - intro:{ - content:'已使用过$', + subSkill: { + used: { + charlotte: true, + onremove: true, + mark: true, + intro: { + content: "已使用过$", }, }, }, }, //张辽 - jsrgzhengbing:{ - audio:2, - enable:'phaseUse', - usable:3, - filter:function(event,player){ - return player.group=='qun'; + jsrgzhengbing: { + audio: 2, + enable: "phaseUse", + usable: 3, + filter: function (event, player) { + return player.group == "qun"; }, - filterCard:lib.filter.cardRecastable, - check:function(card){ - var player=_status.event.player,val=5+['shan','tao'].includes(get.name(card))*1.5; - if(player.needsToDiscard()>2&&get.name(card)=='sha'&&player.countCards('hs','sha')>1) val+=0.5; - return val-get.value(card); + filterCard: lib.filter.cardRecastable, + check: function (card) { + var player = _status.event.player, + val = 5 + ["shan", "tao"].includes(get.name(card)) * 1.5; + if ( + player.needsToDiscard() > 2 && + get.name(card) == "sha" && + player.countCards("hs", "sha") > 1 + ) + val += 0.5; + return val - get.value(card); }, - position:'he', - groupSkill:true, - lose:false, - discard:false, - delay:false, - content:function(){ - 'step 0' + position: "he", + groupSkill: true, + lose: false, + discard: false, + delay: false, + content: function () { + "step 0"; player.recast(cards); - switch(get.name(cards[0])){ - case 'sha': - player.addTempSkill('jsrgzhengbing_sha'); - player.addMark('jsrgzhengbing_sha',2,false); + switch (get.name(cards[0])) { + case "sha": + player.addTempSkill("jsrgzhengbing_sha"); + player.addMark("jsrgzhengbing_sha", 2, false); break; - case 'shan': + case "shan": player.draw(); break; - case 'tao': - player.changeGroup('wei'); + case "tao": + player.changeGroup("wei"); } }, - ai:{ - order:7, - result:{player:1}, + ai: { + order: 7, + result: { player: 1 }, }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('jsrgzhengbing_sha'); + subSkill: { + sha: { + charlotte: true, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("jsrgzhengbing_sha"); }, }, - intro:{ - content:'手牌上限+#', + intro: { + content: "手牌上限+#", }, - } + }, }, }, - jsrgtuwei:{ - audio:2, - trigger:{ - player:'phaseUseBegin', + jsrgtuwei: { + audio: 2, + trigger: { + player: "phaseUseBegin", }, - filter:function(event,player){ - return player.group=='wei'&&game.hasPlayer(current=>{ - return player.inRange(current)&¤t.countGainableCards(player,'he')>0; - }); + filter: function (event, player) { + return ( + player.group == "wei" && + game.hasPlayer((current) => { + return player.inRange(current) && current.countGainableCards(player, "he") > 0; + }) + ); }, - groupSkill:true, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgtuwei'),'获得攻击范围内任意名角色的各一张牌。然后回合结束时这些角色中未受过伤害的角色依次获得你的一张牌。',(card,player,target)=>{ - return player.inRange(target)&&target.countGainableCards(player,'he')>0; - },[1,Infinity]).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,{name:'shunshou_copy2'},player,player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.slice(); + groupSkill: true, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jsrgtuwei"), + "获得攻击范围内任意名角色的各一张牌。然后回合结束时这些角色中未受过伤害的角色依次获得你的一张牌。", + (card, player, target) => { + return player.inRange(target) && target.countGainableCards(player, "he") > 0; + }, + [1, Infinity] + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.slice(); targets.sortBySeat(); - player.logSkill('jsrgtuwei',targets); - player.gainMultiple(result.targets,'he'); - player.addTempSkill('jsrgtuwei_backfire'); - player.markAuto('jsrgtuwei_backfire',targets); + player.logSkill("jsrgtuwei", targets); + player.gainMultiple(result.targets, "he"); + player.addTempSkill("jsrgtuwei_backfire"); + player.markAuto("jsrgtuwei_backfire", targets); } }, - subSkill:{ - backfire:{ - audio:'jsrgtuwei', - trigger:{ - player:'phaseEnd', + subSkill: { + backfire: { + audio: "jsrgtuwei", + trigger: { + player: "phaseEnd", }, - charlotte:true, - onremove:true, - forced:true, - filter:function(event,player){ - return player.getStorage('jsrgtuwei_backfire').some(target=>{ - return !target.getHistory('damage').length&&target.isIn(); + charlotte: true, + onremove: true, + forced: true, + filter: function (event, player) { + return player.getStorage("jsrgtuwei_backfire").some((target) => { + return !target.getHistory("damage").length && target.isIn(); }); }, - content:function(){ - 'step 0' - var targets=player.getStorage('jsrgtuwei_backfire').filter(target=>{ - return !target.getHistory('damage').length&&target.isIn(); + content: function () { + "step 0"; + var targets = player.getStorage("jsrgtuwei_backfire").filter((target) => { + return !target.getHistory("damage").length && target.isIn(); }); - event.targets=targets.sortBySeat(); - 'step 1' - var target=targets.shift(); - if(target.isIn()&&player.countGainableCards(target,'he')){ + event.targets = targets.sortBySeat(); + ("step 1"); + var target = targets.shift(); + if (target.isIn() && player.countGainableCards(target, "he")) { target.line(player); - target.gainPlayerCard(player,true,'he'); + target.gainPlayerCard(player, true, "he"); } - if(player.countCards('he')&&targets.length) event.redo(); + if (player.countCards("he") && targets.length) event.redo(); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(player!=target&&get.tag(card,'damage')&&target&&player.getStorage('jsrgtuwei_backfire').includes(target)&&!target.getHistory('damage').length) return [1,1,1,0]; + ai: { + effect: { + player: function (card, player, target) { + if ( + player != target && + get.tag(card, "damage") && + target && + player.getStorage("jsrgtuwei_backfire").includes(target) && + !target.getHistory("damage").length + ) + return [1, 1, 1, 0]; }, }, }, @@ -5431,296 +6649,318 @@ game.import('character', function () { }, }, //许贡 - jsrgbiaozhao:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.countPlayer(current=>current!=player)>=2; + jsrgbiaozhao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.countPlayer((current) => current != player) >= 2; }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgbiaozhao'),lib.filter.notMe,2).set('ai',target=>{ - var player=_status.event.player; - var att=get.attitude(player,target); - if(!ui.selected.targets.length) return att*(Math.sqrt(target.countCards('hs'))+0.1); - return -att/Math.sqrt(target.countCards('hs')+0.1); - }).set('targetprompt',['用牌无限制','打你变疼']); - 'step 1' - if(result.bool){ - var targets=result.targets; - player.logSkill('jsrgbiaozhao',targets); - player.addTempSkill('jsrgbiaozhao_syujin',{player:['phaseBegin','die']}); - if(!player.storage.jsrgbiaozhao_syujin) player.storage.jsrgbiaozhao_syujin=[]; + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("jsrgbiaozhao"), lib.filter.notMe, 2) + .set("ai", (target) => { + var player = _status.event.player; + var att = get.attitude(player, target); + if (!ui.selected.targets.length) + return att * (Math.sqrt(target.countCards("hs")) + 0.1); + return -att / Math.sqrt(target.countCards("hs") + 0.1); + }) + .set("targetprompt", ["用牌无限制", "打你变疼"]); + ("step 1"); + if (result.bool) { + var targets = result.targets; + player.logSkill("jsrgbiaozhao", targets); + player.addTempSkill("jsrgbiaozhao_syujin", { player: ["phaseBegin", "die"] }); + if (!player.storage.jsrgbiaozhao_syujin) player.storage.jsrgbiaozhao_syujin = []; player.storage.jsrgbiaozhao_syujin.push(targets); - targets[0].addSkill('jsrgbiaozhao_A'); - targets[0].markAuto('jsrgbiaozhao_A',[targets[1]]); - targets[1].addSkill('jsrgbiaozhao_B'); - targets[1].addMark('jsrgbiaozhao_B'+player.playerid,1,false); - targets[1].markAuto('jsrgbiaozhao_B',[player]); + targets[0].addSkill("jsrgbiaozhao_A"); + targets[0].markAuto("jsrgbiaozhao_A", [targets[1]]); + targets[1].addSkill("jsrgbiaozhao_B"); + targets[1].addMark("jsrgbiaozhao_B" + player.playerid, 1, false); + targets[1].markAuto("jsrgbiaozhao_B", [player]); } }, - subSkill:{ - syujin:{ - charlotte:true, - onremove:function(player,skill){ - var list=player.storage.jsrgbiaozhao_syujin; - for(var targets of list){ - targets[0].unmarkAuto('jsrgbiaozhao_A',[targets[1]]); - targets[1].unmarkAuto('jsrgbiaozhao_B',[player]); - delete targets[1].storage['jsrgbiaozhao_B'+player.playerid]; - if(!targets[0].getStorage('jsrgbiaozhao_A')) targets[0].removeSkill('jsrgbiaozhao_A'); - if(!targets[1].getStorage('jsrgbiaozhao_B')) targets[1].removeSkill('jsrgbiaozhao_B'); + subSkill: { + syujin: { + charlotte: true, + onremove: function (player, skill) { + var list = player.storage.jsrgbiaozhao_syujin; + for (var targets of list) { + targets[0].unmarkAuto("jsrgbiaozhao_A", [targets[1]]); + targets[1].unmarkAuto("jsrgbiaozhao_B", [player]); + delete targets[1].storage["jsrgbiaozhao_B" + player.playerid]; + if (!targets[0].getStorage("jsrgbiaozhao_A")) + targets[0].removeSkill("jsrgbiaozhao_A"); + if (!targets[1].getStorage("jsrgbiaozhao_B")) + targets[1].removeSkill("jsrgbiaozhao_B"); } delete player.storage.jsrgbiaozhao_syujin; }, }, - A:{ - charlotte:true, - onremove:true, - mark:true, - marktext:'表', - intro:{ - content:'对$使用牌无次数和距离限制', + A: { + charlotte: true, + onremove: true, + mark: true, + marktext: "表", + intro: { + content: "对$使用牌无次数和距离限制", }, - mod:{ - targetInRange:function(card,player,target){ - if(player.getStorage('jsrgbiaozhao_A').includes(target)) return true; + mod: { + targetInRange: function (card, player, target) { + if (player.getStorage("jsrgbiaozhao_A").includes(target)) return true; }, - cardUsableTarget:function(card,player,target){ - if(player.getStorage('jsrgbiaozhao_A').includes(target)) return true; + cardUsableTarget: function (card, player, target) { + if (player.getStorage("jsrgbiaozhao_A").includes(target)) return true; }, }, }, - B:{ - trigger:{ - source:'damageBegin1', + B: { + trigger: { + source: "damageBegin1", }, - charlotte:true, - forced:true, - onremove:function(player,skill){ - for(var i in player.storage){ - if(i.indexOf('jsrgbiaozhao_B')==0) delete player.storage[i]; + charlotte: true, + forced: true, + onremove: function (player, skill) { + for (var i in player.storage) { + if (i.indexOf("jsrgbiaozhao_B") == 0) delete player.storage[i]; } }, - filter:function(event,player){ - return event.card&&player.getStorage('jsrgbiaozhao_B').includes(event.player); + filter: function (event, player) { + return event.card && player.getStorage("jsrgbiaozhao_B").includes(event.player); }, - content:function(){ - trigger.num+=player.countMark('jsrgbiaozhao_B'+trigger.player.playerid)||1; + content: function () { + trigger.num += player.countMark("jsrgbiaozhao_B" + trigger.player.playerid) || 1; }, - mark:true, - marktext:'召', - intro:{ - content:function(storage,player){ - var str=''; - for(var target of storage){ - str+='对'+get.translation(target)+'使用牌造成的伤害+'+player.countMark('jsrgbiaozhao_B'+target.playerid); + mark: true, + marktext: "召", + intro: { + content: function (storage, player) { + var str = ""; + for (var target of storage) { + str += + "对" + + get.translation(target) + + "使用牌造成的伤害+" + + player.countMark("jsrgbiaozhao_B" + target.playerid); } return str; - } + }, }, }, - } + }, }, - jsrgyechou:{ - audio:2, - trigger:{player:'die'}, - forceDie:true, - direct:true, - skillAnimation:true, - animationColor:'wood', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgyechou'),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - return -get.attitude(player,target); + jsrgyechou: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + direct: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("jsrgyechou"), lib.filter.notMe).set("ai", (target) => { + var player = _status.event.player; + return -get.attitude(player, target); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgyechou',target); - target.addSkill('jsrgyechou_effect'); - target.addMark('jsrgyechou_effect',1,false); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgyechou", target); + target.addSkill("jsrgyechou_effect"); + target.addMark("jsrgyechou_effect", 1, false); } }, - subSkill:{ - effect:{ - trigger:{ - player:'damageBegin3', + subSkill: { + effect: { + trigger: { + player: "damageBegin3", }, - filter:function(event,player){ - return event.num>=player.getHp(); + filter: function (event, player) { + return event.num >= player.getHp(); }, - forced:true, - charlotte:true, - onremove:true, - content:function(){ - trigger.num*=2*player.countMark('jsrgyechou_effect'); + forced: true, + charlotte: true, + onremove: true, + content: function () { + trigger.num *= 2 * player.countMark("jsrgyechou_effect"); }, - mark:true, - marktext:'仇', - intro:{ - content:'当你受到伤害值不小于体力值的伤害时,此伤害翻&倍', + mark: true, + marktext: "仇", + intro: { + content: "当你受到伤害值不小于体力值的伤害时,此伤害翻&倍", }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target.hp==1) return 2; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return 2; } - } - } + }, + }, }, }, - } + }, }, //淳于琼 - jsrgcangchu:{ - audio:'recangchu', - trigger:{ - global:'phaseJieshuBegin', + jsrgcangchu: { + audio: "recangchu", + trigger: { + global: "phaseJieshuBegin", }, - filter:function(event,player){ - if(player.hasSkill('jsrgshishou_blocker')) return false; - return player.getHistory('gain').length; + filter: function (event, player) { + if (player.hasSkill("jsrgshishou_blocker")) return false; + return player.getHistory("gain").length; }, - direct:true, - content:function(){ - 'step 0' - var num=0; - player.getHistory('gain',evt=>{ - num+=evt.cards.length; + direct: true, + content: function () { + "step 0"; + var num = 0; + player.getHistory("gain", (evt) => { + num += evt.cards.length; }); - event.num=num; - player.chooseTarget(get.prompt('jsrgcangchu'),'令至多'+get.cnNumber(num)+'名角色各摸'+get.cnNumber(num>game.countPlayer()?2:1)+'张牌',[1,num]).set('ai',target=>{ - var player=_status.event.player; - return get.attitude(player,target)/Math.sqrt(target.countCards('hs')+1); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.slice(); + event.num = num; + player + .chooseTarget( + get.prompt("jsrgcangchu"), + "令至多" + + get.cnNumber(num) + + "名角色各摸" + + get.cnNumber(num > game.countPlayer() ? 2 : 1) + + "张牌", + [1, num] + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.attitude(player, target) / Math.sqrt(target.countCards("hs") + 1); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.slice(); targets.sortBySeat(); - player.logSkill('jsrgcangchu',targets); - game.asyncDraw(targets,num>game.countPlayer()?2:1); + player.logSkill("jsrgcangchu", targets); + game.asyncDraw(targets, num > game.countPlayer() ? 2 : 1); game.delayex(); } }, }, - jsrgshishou:{ - audio:'reshishou', - trigger:{ - player:'useCard', + jsrgshishou: { + audio: "reshishou", + trigger: { + player: "useCard", }, - forced:true, - filter:function(event,player){ - return event.card.name=='jiu'; + forced: true, + filter: function (event, player) { + return event.card.name == "jiu"; }, - group:'jsrgshishou_burn', - content:function(){ - 'step 0' + group: "jsrgshishou_burn", + content: function () { + "step 0"; player.draw(3); - player.addTempSkill('jsrgshishou_nouse'); + player.addTempSkill("jsrgshishou_nouse"); }, - mod:{ - aiOrder:function(player,card,num){ - if(card.name=='jiu') return 0.01; + mod: { + aiOrder: function (player, card, num) { + if (card.name == "jiu") return 0.01; }, }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(card.name=='jiu') return [1,1]; + ai: { + effect: { + player_use: function (card, player, target) { + if (card.name == "jiu") return [1, 1]; }, - } + }, }, - subSkill:{ - nouse:{ - charlotte:true, - mod:{ - cardEnabled:function(card,player){ + subSkill: { + nouse: { + charlotte: true, + mod: { + cardEnabled: function (card, player) { return false; }, - cardUsable:function(card,player){ + cardUsable: function (card, player) { return false; }, - cardSavable:function(card,player){ + cardSavable: function (card, player) { return false; }, }, - mark:true, - marktext:'失', - intro:{ - content:'喝醉了,不能再使用牌', - } - }, - burn:{ - audio:'reshishou', - trigger:{ - player:'damageEnd', + mark: true, + marktext: "失", + intro: { + content: "喝醉了,不能再使用牌", + }, + }, + burn: { + audio: "reshishou", + trigger: { + player: "damageEnd", + }, + forced: true, + filter: function (event, player) { + return event.hasNature("fire"); + }, + content: function () { + player.addTempSkill("jsrgshishou_blocker", { player: "phaseEnd" }); + }, + }, + blocker: { + charlotte: true, + mark: true, + marktext: "守", + intro: { + content: "〖仓储〗失效直到下回合结束", }, - forced:true, - filter:function(event,player){ - return event.hasNature('fire'); - }, - content:function(){ - player.addTempSkill('jsrgshishou_blocker',{player:'phaseEnd'}); - } }, - blocker:{ - charlotte:true, - mark:true, - marktext:'守', - intro:{ - content:'〖仓储〗失效直到下回合结束', - } - } }, }, //江山如故·起 - sbyingmen:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + sbyingmen: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - if(!_status.characterlist) lib.skill.pingjian.initList(); - var characters=_status.characterlist.randomRemove(4); - lib.skill.sbyingmen.addVisitors(characters,player); + content: function () { + if (!_status.characterlist) lib.skill.pingjian.initList(); + var characters = _status.characterlist.randomRemove(4); + lib.skill.sbyingmen.addVisitors(characters, player); game.delayx(); }, - group:'sbyingmen_reload', - subSkill:{ - reload:{ - trigger:{player:'phaseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.getStorage('sbyingmen').length<4; + group: "sbyingmen_reload", + subSkill: { + reload: { + trigger: { player: "phaseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.getStorage("sbyingmen").length < 4; }, - content:function(){ - if(!_status.characterlist) lib.skill.pingjian.initList(); - var characters=_status.characterlist.randomRemove(4-player.getStorage('sbyingmen').length); - lib.skill.sbyingmen.addVisitors(characters,player); + content: function () { + if (!_status.characterlist) lib.skill.pingjian.initList(); + var characters = _status.characterlist.randomRemove( + 4 - player.getStorage("sbyingmen").length + ); + lib.skill.sbyingmen.addVisitors(characters, player); game.delayx(); }, }, }, - getSkills:function(characters,player){ - var skills=[]; - for(var name of characters){ - if(Array.isArray(lib.character[name])){ - for(var skill of lib.character[name][3]){ - var list=get.skillCategoriesOf(skill,player); - list.remove('锁定技'); - if(list.length>0) continue; - var info=get.info(skill); - if(info&&(!info.unique||info.gainable)){ + getSkills: function (characters, player) { + var skills = []; + for (var name of characters) { + if (Array.isArray(lib.character[name])) { + for (var skill of lib.character[name][3]) { + var list = get.skillCategoriesOf(skill, player); + list.remove("锁定技"); + if (list.length > 0) continue; + var info = get.info(skill); + if (info && (!info.unique || info.gainable)) { // lib.skill.rehuashen.createAudio(name,skill,'jsrg_xushao'); skills.add(skill); } @@ -5729,506 +6969,661 @@ game.import('character', function () { } return skills; }, - addVisitors:function(characters,player){ - player.addSkillBlocker('sbyingmen'); - game.log(player,'将','#y'+get.translation(characters),'加入了','#g“访客”'); - game.broadcastAll(function(player,characters){ - player.tempname.addArray(characters); - player.$draw(characters.map(function(name){ - var cardname='huashen_card_'+name; - lib.card[cardname]={ - fullimage:true, - image:'character:'+name - }; - lib.translate[cardname]=get.rawName2(name); - return game.createCard(cardname,' ',' '); - }),'nobroadcast'); - },player,characters); - player.markAuto('sbyingmen',characters) - var storage=player.getStorage('sbyingmen'); - var skills=lib.skill.sbyingmen.getSkills(storage,player); + addVisitors: function (characters, player) { + player.addSkillBlocker("sbyingmen"); + game.log(player, "将", "#y" + get.translation(characters), "加入了", "#g“访客”"); + game.broadcastAll( + function (player, characters) { + player.tempname.addArray(characters); + player.$draw( + characters.map(function (name) { + var cardname = "huashen_card_" + name; + lib.card[cardname] = { + fullimage: true, + image: "character:" + name, + }; + lib.translate[cardname] = get.rawName2(name); + return game.createCard(cardname, " ", " "); + }), + "nobroadcast" + ); + }, + player, + characters + ); + player.markAuto("sbyingmen", characters); + var storage = player.getStorage("sbyingmen"); + var skills = lib.skill.sbyingmen.getSkills(storage, player); player.addInvisibleSkill(skills); }, - removeVisitors:function(characters,player){ - var skills=lib.skill.sbyingmen.getSkills(characters,player); - var characters2=player.getStorage('sbyingmen').slice(0); + removeVisitors: function (characters, player) { + var skills = lib.skill.sbyingmen.getSkills(characters, player); + var characters2 = player.getStorage("sbyingmen").slice(0); characters2.removeArray(characters); - skills.removeArray(lib.skill.sbyingmen.getSkills(characters2,player)); - game.broadcastAll((player,characters)=>player.tempname.removeArray(characters),player,characters); - player.unmarkAuto('sbyingmen',characters); + skills.removeArray(lib.skill.sbyingmen.getSkills(characters2, player)); + game.broadcastAll( + (player, characters) => player.tempname.removeArray(characters), + player, + characters + ); + player.unmarkAuto("sbyingmen", characters); _status.characterlist.addArray(characters); player.removeInvisibleSkill(skills); }, - onremove:function(player,skill){ - lib.skill.sbyingmen.removeVisitors(player.getSkills('sbyingmen'),player); - player.removeSkillBlocker('sbyingmen'); + onremove: function (player, skill) { + lib.skill.sbyingmen.removeVisitors(player.getSkills("sbyingmen"), player); + player.removeSkillBlocker("sbyingmen"); }, - skillBlocker:function(skill,player){ - if(!player.invisibleSkills.includes(skill)||skill=='sbpingjian'||skill=='sbpingjian') return false; - return !player.hasSkill('sbpingjian'); + skillBlocker: function (skill, player) { + if ( + !player.invisibleSkills.includes(skill) || + skill == "sbpingjian" || + skill == "sbpingjian" + ) + return false; + return !player.hasSkill("sbpingjian"); }, - marktext:'客', - intro:{ - name:'访客', - mark:function(dialog,storage,player){ - if(!storage||!storage.length) return '当前没有“访客”'; - dialog.addSmall([storage,'character']); - var skills=lib.skill.sbyingmen.getSkills(storage,player); - if(skills.length) dialog.addText('
  • 当前可用技能:'+get.translation(skills),false); + marktext: "客", + intro: { + name: "访客", + mark: function (dialog, storage, player) { + if (!storage || !storage.length) return "当前没有“访客”"; + dialog.addSmall([storage, "character"]); + var skills = lib.skill.sbyingmen.getSkills(storage, player); + if (skills.length) + dialog.addText("
  • 当前可用技能:" + get.translation(skills), false); }, }, }, - sbpingjian:{ - trigger:{player:['useSkill','logSkillBegin']}, - forced:true, - locked:false, - filter:function(event,player){ - var skill=event.sourceSkill||event.skill; - return player.invisibleSkills.includes(skill)&&lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player).includes(skill); + sbpingjian: { + trigger: { player: ["useSkill", "logSkillBegin"] }, + forced: true, + locked: false, + filter: function (event, player) { + var skill = event.sourceSkill || event.skill; + return ( + player.invisibleSkills.includes(skill) && + lib.skill.sbyingmen.getSkills(player.getStorage("sbyingmen"), player).includes(skill) + ); }, - content:function(){ - 'step 0' - var visitors=player.getStorage('sbyingmen').slice(0); - var drawers=visitors.filter(function(name){ - return Array.isArray(lib.character[name])&&lib.character[name][3].includes(trigger.sourceSkill); + content: function () { + "step 0"; + var visitors = player.getStorage("sbyingmen").slice(0); + var drawers = visitors.filter(function (name) { + return ( + Array.isArray(lib.character[name]) && + lib.character[name][3].includes(trigger.sourceSkill) + ); }); - event.drawers=drawers; - if(visitors.length==1) event._result={bool:true,links:visitors}; - else{ - var dialog=['评鉴:请选择移去一张“访客”']; - if(drawers.length) dialog.push('
    如果移去'+get.translation(drawers)+',则你摸一张牌
    '); - dialog.push([visitors,'character']); - player.chooseButton(dialog,true); + event.drawers = drawers; + if (visitors.length == 1) event._result = { bool: true, links: visitors }; + else { + var dialog = ["评鉴:请选择移去一张“访客”"]; + if (drawers.length) + dialog.push( + '
    如果移去' + + get.translation(drawers) + + ",则你摸一张牌
    " + ); + dialog.push([visitors, "character"]); + player.chooseButton(dialog, true); } - 'step 1' - if(result.bool){ - lib.skill.sbyingmen.removeVisitors(result.links,player); - game.log(player,'移去了','#y'+get.translation(result.links[0])); - if(event.drawers.includes(result.links[0])){ - player.addTempSkill('sbpingjian_draw'); + ("step 1"); + if (result.bool) { + lib.skill.sbyingmen.removeVisitors(result.links, player); + game.log(player, "移去了", "#y" + get.translation(result.links[0])); + if (event.drawers.includes(result.links[0])) { + player.addTempSkill("sbpingjian_draw"); player.storage.sbpingjian_draw.push(trigger.skill); } } }, - group:'sbpingjian_trigger', - subSkill:{ - draw:{ - charlotte:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + group: "sbpingjian_trigger", + subSkill: { + draw: { + charlotte: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - onremove:true, - trigger:{player:['useSkillAfter','logSkill']}, - forced:true, - popup:false, - filter:function(event,player){ - return player.getStorage('sbpingjian_draw').includes(event.skill); + onremove: true, + trigger: { player: ["useSkillAfter", "logSkill"] }, + forced: true, + popup: false, + filter: function (event, player) { + return player.getStorage("sbpingjian_draw").includes(event.skill); }, - content:function(){ + content: function () { player.storage.sbpingjian_draw.remove(trigger.skill); player.draw(); - if(!player.storage.sbpingjian_draw.length) player.removeSkill('sbpingjian_draw'); + if (!player.storage.sbpingjian_draw.length) player.removeSkill("sbpingjian_draw"); }, }, - trigger:{ - trigger:{player:'triggerInvisible'}, - forced:true, - forceDie:true, - popup:false, - charlotte:true, - priority:10, - filter:function(event,player){ - if(event.revealed) return false; - var info=get.info(event.skill); - if(info.charlotte) return false; - var skills=lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player); + trigger: { + trigger: { player: "triggerInvisible" }, + forced: true, + forceDie: true, + popup: false, + charlotte: true, + priority: 10, + filter: function (event, player) { + if (event.revealed) return false; + var info = get.info(event.skill); + if (info.charlotte) return false; + var skills = lib.skill.sbyingmen.getSkills( + player.getStorage("sbyingmen"), + player + ); game.expandSkills(skills); return skills.includes(event.skill); }, - content:function(){ - "step 0" - if(get.info(trigger.skill).silent){ + content: function () { + "step 0"; + if (get.info(trigger.skill).silent) { event.finish(); - } - else{ - var info=get.info(trigger.skill); - var event=trigger,trigger=event._trigger; + } else { + var info = get.info(trigger.skill); + var event = trigger, + trigger = event._trigger; var str; - var check=info.check; - if(info.prompt) str=info.prompt; - else{ - if(typeof info.logTarget=='string'){ - str=get.prompt(event.skill,trigger[info.logTarget],player); - } - else if(typeof info.logTarget=='function'){ - var logTarget=info.logTarget(trigger,player,trigger.triggername,trigger.indexedData); - if(get.itemtype(logTarget).indexOf('player')==0) str=get.prompt(event.skill,logTarget,player); - } - else{ - str=get.prompt(event.skill,null,player); + var check = info.check; + if (info.prompt) str = info.prompt; + else { + if (typeof info.logTarget == "string") { + str = get.prompt(event.skill, trigger[info.logTarget], player); + } else if (typeof info.logTarget == "function") { + var logTarget = info.logTarget( + trigger, + player, + trigger.triggername, + trigger.indexedData + ); + if (get.itemtype(logTarget).indexOf("player") == 0) + str = get.prompt(event.skill, logTarget, player); + } else { + str = get.prompt(event.skill, null, player); } } - if(typeof str=='function'){str=str(trigger,player,trigger.triggername,trigger.indexedData)} - var next=player.chooseBool('评鉴:'+str); - next.set('yes',!info.check||info.check(trigger,player,trigger.triggername,trigger.indexedData)); - next.set('hsskill',event.skill); - next.set('forceDie',true); - next.set('ai',function(){ + if (typeof str == "function") { + str = str(trigger, player, trigger.triggername, trigger.indexedData); + } + var next = player.chooseBool("评鉴:" + str); + next.set( + "yes", + !info.check || + info.check(trigger, player, trigger.triggername, trigger.indexedData) + ); + next.set("hsskill", event.skill); + next.set("forceDie", true); + next.set("ai", function () { return _status.event.yes; }); - if(typeof info.prompt2=='function'){ - next.set('prompt2',info.prompt2(trigger,player,trigger.triggername,trigger.indexedData)); + if (typeof info.prompt2 == "function") { + next.set( + "prompt2", + info.prompt2( + trigger, + player, + trigger.triggername, + trigger.indexedData + ) + ); + } else if (typeof info.prompt2 == "string") { + next.set("prompt2", info.prompt2); + } else if (info.prompt2 != false) { + if (lib.dynamicTranslate[event.skill]) + next.set( + "prompt2", + lib.dynamicTranslate[event.skill](player, event.skill) + ); + else if (lib.translate[event.skill + "_info"]) + next.set("prompt2", lib.translate[event.skill + "_info"]); } - else if(typeof info.prompt2=='string'){ - next.set('prompt2',info.prompt2); - } - else if(info.prompt2!=false){ - if(lib.dynamicTranslate[event.skill]) next.set('prompt2',lib.dynamicTranslate[event.skill](player,event.skill)); - else if(lib.translate[event.skill+'_info']) next.set('prompt2',lib.translate[event.skill+'_info']); - } - if(trigger.skillwarn){ - if(next.prompt2){ - next.set('prompt2',''+trigger.skillwarn+'。'+next.prompt2); - } - else{ - next.set('prompt2',trigger.skillwarn); + if (trigger.skillwarn) { + if (next.prompt2) { + next.set( + "prompt2", + '' + + trigger.skillwarn + + "。" + + next.prompt2 + ); + } else { + next.set("prompt2", trigger.skillwarn); } } } - "step 1" - if(result.bool){ - trigger.revealed=true; - } - else{ + ("step 1"); + if (result.bool) { + trigger.revealed = true; + } else { trigger.untrigger(); - trigger.cancelled=true; + trigger.cancelled = true; } - } + }, }, }, - ai:{ - combo:'sbyingmen' - } + ai: { + combo: "sbyingmen", + }, }, - jsrgchaozheng:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - logTarget:function(event,player){ - return game.filterPlayer(i=>i!=player); + jsrgchaozheng: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + logTarget: function (event, player) { + return game.filterPlayer((i) => i != player); }, - prompt:'是否发动【朝争】?', - content:function(){ - player.chooseToDebate(game.filterPlayer(i=>i!=player)).set('callback',lib.skill.jsrgchaozheng.callback); + prompt: "是否发动【朝争】?", + content: function () { + player + .chooseToDebate(game.filterPlayer((i) => i != player)) + .set("callback", lib.skill.jsrgchaozheng.callback); }, - callback:function(){ - var result=event.debateResult; - if(result.bool&&result.opinion){ - var opinion=result.opinion,targets=result.red.map(i=>i[0]); + callback: function () { + var result = event.debateResult; + if (result.bool && result.opinion) { + var opinion = result.opinion, + targets = result.red.map((i) => i[0]); targets.sortBySeat(); - targets.forEach(i=>i[opinion=='red'?'recover':'loseHp']()); - if(targets.length==0||result.black.length==0) player.draw(result.targets.length); + targets.forEach((i) => i[opinion == "red" ? "recover" : "loseHp"]()); + if (targets.length == 0 || result.black.length == 0) + player.draw(result.targets.length); } - } + }, }, - jsrgshenchong:{ - audio:2, - enable:'phaseUse', - limited:true, - filterTarget:lib.filter.notMe, - skillAnimation:true, - animationColor:'soil', - content:function(){ - 'step 0' - player.awakenSkill('jsrgshenchong'); - target.addSkillLog('jsrgfeiyang'); - target.addSkillLog('jsrgbahu'); - 'step 1' - player.addSkill('jsrgshenchong_die'); - player.markAuto('jsrgshenchong_die',[target]); + jsrgshenchong: { + audio: 2, + enable: "phaseUse", + limited: true, + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "soil", + content: function () { + "step 0"; + player.awakenSkill("jsrgshenchong"); + target.addSkillLog("jsrgfeiyang"); + target.addSkillLog("jsrgbahu"); + ("step 1"); + player.addSkill("jsrgshenchong_die"); + player.markAuto("jsrgshenchong_die", [target]); }, - ai:{ - order:1, - result:{target:1} + ai: { + order: 1, + result: { target: 1 }, }, - subSkill:{ - die:{ - audio:'jsrgshenchong', - trigger:{player:'die'}, - charlotte:true, - forced:true, - forceDie:true, - filter:function(event,player){ - return player.getStorage('jsrgshenchong_die').length; + subSkill: { + die: { + audio: "jsrgshenchong", + trigger: { player: "die" }, + charlotte: true, + forced: true, + forceDie: true, + filter: function (event, player) { + return player.getStorage("jsrgshenchong_die").length; }, - content:function(){ - var targets=player.getStorage('jsrgshenchong_die'); + content: function () { + var targets = player.getStorage("jsrgshenchong_die"); player.line(targets); - targets.sortBySeat().forEach(current=>{ + targets.sortBySeat().forEach((current) => { current.clearSkills(true); - current.chooseToDiscard(current.countCards('h'),'h',true); + current.chooseToDiscard(current.countCards("h"), "h", true); }); - } - } - } - }, - jsrgfeiyang:{ - trigger:{player:'phaseJudgeBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('j')&&player.countCards('h')>1; + }, + }, }, - content:function(){ - 'step 0' - player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ - if(_status.event.goon) return 6-get.value(card); - return 0; - }).set('goon',(()=>{ - if(player.hasSkillTag('rejudge')&&player.countCards('j')<2) return false; - return player.hasCard(function(card){ - if(get.tag(card,'damage')&&get.damageEffect(player,player,_status.event.player,get.natureList(card))>=0) return false; - return get.effect(player,{ - name:card.viewAs||card.name, - cards:[card], - },player,player)<0; - },'j'); - })()); - 'step 1' - if(result.bool){ - player.discardPlayerCard(player,'j',true); + }, + jsrgfeiyang: { + trigger: { player: "phaseJudgeBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("j") && player.countCards("h") > 1; + }, + content: function () { + "step 0"; + player + .chooseToDiscard( + "h", + 2, + get.prompt("jsrgfeiyang"), + "弃置两张手牌并弃置判定区里的一张牌" + ) + .set("logSkill", "jsrgfeiyang") + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set( + "goon", + (() => { + if (player.hasSkillTag("rejudge") && player.countCards("j") < 2) return false; + return player.hasCard(function (card) { + if ( + get.tag(card, "damage") && + get.damageEffect( + player, + player, + _status.event.player, + get.natureList(card) + ) >= 0 + ) + return false; + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j"); + })() + ); + ("step 1"); + if (result.bool) { + player.discardPlayerCard(player, "j", true); } }, }, - jsrgbahu:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ + jsrgbahu: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { player.draw(); }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, }, - jsrgjulian:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasZhuSkill('jsrgjulian')&&lib.skill.jsrgjulian.logTarget(null,player).length; + jsrgjulian: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.hasZhuSkill("jsrgjulian") && + lib.skill.jsrgjulian.logTarget(null, player).length + ); }, - prompt:'是否发动【聚敛】?', - prompt2:'你可以获得其他所有群势力角色的各一张牌', - logTarget:function(event,player){ - return game.filterPlayer(current=>{ - return current.group=='qun'&¤t.countGainableCards(player,'he')>0&¤t!=player; - }) - }, - content:function(){ - game.filterPlayer(current=>{ - return current.group=='qun'&¤t!=player; - }).sortBySeat().forEach(i=>{ - player.gainPlayerCard(i,'he',true); + prompt: "是否发动【聚敛】?", + prompt2: "你可以获得其他所有群势力角色的各一张牌", + logTarget: function (event, player) { + return game.filterPlayer((current) => { + return ( + current.group == "qun" && + current.countGainableCards(player, "he") > 0 && + current != player + ); }); }, - group:'jsrgjulian_draw', - zhuSkill:true, - subSkill:{ - draw:{ - audio:'jsrgjulian', - trigger:{global:'gainAfter'}, - filter:function(event,player){ - var source=event.player; - if(source==player||source.group!='qun') return false; - var evt=event.getParent('phaseDraw'); - return (!evt||evt.player!=source)&&event.getParent().name=='draw'&&event.getParent(2).name!='jsrgjulian_draw'&&player.hasZhuSkill('jsrgjulian',event.player); + content: function () { + game.filterPlayer((current) => { + return current.group == "qun" && current != player; + }) + .sortBySeat() + .forEach((i) => { + player.gainPlayerCard(i, "he", true); + }); + }, + group: "jsrgjulian_draw", + zhuSkill: true, + subSkill: { + draw: { + audio: "jsrgjulian", + trigger: { global: "gainAfter" }, + filter: function (event, player) { + var source = event.player; + if (source == player || source.group != "qun") return false; + var evt = event.getParent("phaseDraw"); + return ( + (!evt || evt.player != source) && + event.getParent().name == "draw" && + event.getParent(2).name != "jsrgjulian_draw" && + player.hasZhuSkill("jsrgjulian", event.player) + ); }, - direct:true, - usable:2, - content:function(){ - 'step 0' - var source=trigger.player; - event.source=source; - source.chooseBool('是否响应'+get.translation(player)+'的【聚敛】摸一张牌?'); - 'step 1' - if(result.bool){ - source.logSkill('jsrgjulian_draw',player); + direct: true, + usable: 2, + content: function () { + "step 0"; + var source = trigger.player; + event.source = source; + source.chooseBool("是否响应" + get.translation(player) + "的【聚敛】摸一张牌?"); + ("step 1"); + if (result.bool) { + source.logSkill("jsrgjulian_draw", player); source.draw(); - } - else player.storage.counttrigger.jsrgjulian_draw--; - } + } else player.storage.counttrigger.jsrgjulian_draw--; + }, }, - give:{ - charlotte:true, - onremove:true - } - } + give: { + charlotte: true, + onremove: true, + }, + }, }, //何进 - jsrgzhaobing:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'jsrgzhaobing')) return false; + jsrgzhaobing: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "jsrgzhaobing")) return false; } return true; }, - content:function(){ - 'step 0' - var cards=player.getCards('h'); - var num=cards.length; - var prompt2='弃置所有手牌,令至多'+get.cnNumber(num)+'名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力'; - player.chooseTarget(get.prompt('jsrgzhaobing'),prompt2,[1,num],lib.filter.notMe).set('ai',target=>{ - if(!_status.event.goon) return 0; - return 2-get.attitude(_status.event.player,target); - }).set('goon',num/2{ - return 2-get.attitude(player,current)>0; - })); - 'step 1' - if(result.bool){ - player.logSkill('jsrgzhaobing',result.targets); - event.targets=result.targets; + content: function () { + "step 0"; + var cards = player.getCards("h"); + var num = cards.length; + var prompt2 = + "弃置所有手牌,令至多" + + get.cnNumber(num) + + "名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力"; + player + .chooseTarget(get.prompt("jsrgzhaobing"), prompt2, [1, num], lib.filter.notMe) + .set("ai", (target) => { + if (!_status.event.goon) return 0; + return 2 - get.attitude(_status.event.player, target); + }) + .set( + "goon", + num / 2 < + game.countPlayer((current) => { + return 2 - get.attitude(player, current) > 0; + }) + ); + ("step 1"); + if (result.bool) { + player.logSkill("jsrgzhaobing", result.targets); + event.targets = result.targets; event.targets.sortBySeat(); - player.chooseToDiscard(true,'h',player.countCards('h')); - } - else event.finish(); - 'step 2' - var target=targets.shift(); - event.target=target; - target.chooseCard('诏兵:交给'+get.translation(player)+'一张【杀】,或失去1点体力',(card)=>{ - return get.name(card)=='sha'; - }).set('ai',card=>{ - if(_status.event.goon) return 0; - return 6-get.value(card); - }).set('goon',get.effect(target,{name:'losehp'},target,target)>=0); - 'step 3' - if(result.bool) target.give(result.cards,player,true); + player.chooseToDiscard(true, "h", player.countCards("h")); + } else event.finish(); + ("step 2"); + var target = targets.shift(); + event.target = target; + target + .chooseCard( + "诏兵:交给" + get.translation(player) + "一张【杀】,或失去1点体力", + (card) => { + return get.name(card) == "sha"; + } + ) + .set("ai", (card) => { + if (_status.event.goon) return 0; + return 6 - get.value(card); + }) + .set("goon", get.effect(target, { name: "losehp" }, target, target) >= 0); + ("step 3"); + if (result.bool) target.give(result.cards, player, true); else target.loseHp(); - if(targets.length) event.goto(2); + if (targets.length) event.goto(2); + }, + ai: { + expose: 0.2, }, - ai:{ - expose:0.2 - } }, - jsrgzhuhuan:{ - audio:'mouzhu', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - var hs=player.getCards('h','sha'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'jsrgzhuhuan')) return false; + jsrgzhuhuan: { + audio: "mouzhu", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var hs = player.getCards("h", "sha"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "jsrgzhuhuan")) return false; } return true; }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgzhuhuan'),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player); + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("jsrgzhuhuan"), lib.filter.notMe).set("ai", (target) => { + var player = _status.event.player; + return get.damageEffect(target, player, player); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgzhuhuan',target); - var hs=player.getCards('h','sha'); - event.num=hs.length; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jsrgzhuhuan", target); + var hs = player.getCards("h", "sha"); + event.num = hs.length; player.discard(hs); - } - else event.finish(); - 'step 2' - target.chooseToDiscard(get.translation(player)+'对你发动了【诛宦】','弃置'+get.cnNumber(num)+'张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸'+get.cnNumber(num)+'张牌').set('ai',card=>{ - if(_status.event.goon) return 0; - return 5.5-get.value(card); - }).set('goon',target.hp<=2||get.attitude(target,player)>=0||player.isHealthy()); - 'step 3' - if(result.bool){ + } else event.finish(); + ("step 2"); + target + .chooseToDiscard( + get.translation(player) + "对你发动了【诛宦】", + "弃置" + + get.cnNumber(num) + + "张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸" + + get.cnNumber(num) + + "张牌" + ) + .set("ai", (card) => { + if (_status.event.goon) return 0; + return 5.5 - get.value(card); + }) + .set( + "goon", + target.hp <= 2 || get.attitude(target, player) >= 0 || player.isHealthy() + ); + ("step 3"); + if (result.bool) { target.loseHp(); - } - else{ + } else { player.draw(num); player.recover(); } }, - ai:{ - expose:0.2 - } + ai: { + expose: 0.2, + }, }, - jsrgyanhuo:{ - inherit:'spyanhuo', - forced:true, + jsrgyanhuo: { + inherit: "spyanhuo", + forced: true, }, //孙坚 - jsrgpingtao:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - var att=get.attitude(target,player); - target.chooseCard(get.translation(player)+'对你发动了【平讨】','交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】','he').set('ai',card=>{ - if(_status.event.give){ - if(card.name=='sha'||card.name=='tao'||card.name=='jiu') return 0; - return 8-get.value(card); - } - if(_status.event.att<0&&card.name=='sha') return -1; - return 4-get.value(card); - }).set('give',(att>=0||target.hp==1&&target.countCards('hs','shan')<=1)&&get.effect(target,{name:'sha'},player,target)<0).set('att',att); - 'step 1' - if(result.bool){ - target.give(result.cards,player); - player.addTempSkill('jsrgpingtao_sha'); - player.addMark('jsrgpingtao_sha',1,false); - } - else if(player.canUse('sha',target,false)){ - player.useCard({name:'sha',isCard:true},target,false); + jsrgpingtao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + var att = get.attitude(target, player); + target + .chooseCard( + get.translation(player) + "对你发动了【平讨】", + "交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】", + "he" + ) + .set("ai", (card) => { + if (_status.event.give) { + if (card.name == "sha" || card.name == "tao" || card.name == "jiu") return 0; + return 8 - get.value(card); + } + if (_status.event.att < 0 && card.name == "sha") return -1; + return 4 - get.value(card); + }) + .set( + "give", + (att >= 0 || (target.hp == 1 && target.countCards("hs", "shan") <= 1)) && + get.effect(target, { name: "sha" }, player, target) < 0 + ) + .set("att", att); + ("step 1"); + if (result.bool) { + target.give(result.cards, player); + player.addTempSkill("jsrgpingtao_sha"); + player.addMark("jsrgpingtao_sha", 1, false); + } else if (player.canUse("sha", target, false)) { + player.useCard({ name: "sha", isCard: true }, target, false); } }, - ai:{ - expose:0.15, - order:5, - result:{target:-1} + ai: { + expose: 0.15, + order: 5, + result: { target: -1 }, }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - marktext:'讨', - intro:{ - content:'本回合使用【杀】的次数上限+#', + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "讨", + intro: { + content: "本回合使用【杀】的次数上限+#", }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('jsrgpingtao_sha'); + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("jsrgpingtao_sha"); }, - } - } - } - }, - jsrgjuelie:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return player.countCards('he')&&event.card.name=='sha'; + }, + }, }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌',[1,Infinity],'he').set('ai',card=>{ - if(ui.selected.cards.length>=_status.event.max) return 0; - if(_status.event.goon) return 4.5-get.value(card); - return 0; - }).set('max',trigger.target.countDiscardableCards(player,'he')).set('goon',get.attitude(player,trigger.target)<0).set('logSkill',['jsrgjuelie_discard',trigger.target]); - 'step 1' - if(result.bool){ - var num=result.cards.length; - if(trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard('平讨:弃置'+get.translation(trigger.target)+get.cnNumber(num)+'张牌',num,'he',trigger.target,true); + }, + jsrgjuelie: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return player.countCards("he") && event.card.name == "sha"; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard( + get.prompt("jsrgjuelie", trigger.target), + "当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌", + [1, Infinity], + "he" + ) + .set("ai", (card) => { + if (ui.selected.cards.length >= _status.event.max) return 0; + if (_status.event.goon) return 4.5 - get.value(card); + return 0; + }) + .set("max", trigger.target.countDiscardableCards(player, "he")) + .set("goon", get.attitude(player, trigger.target) < 0) + .set("logSkill", ["jsrgjuelie_discard", trigger.target]); + ("step 1"); + if (result.bool) { + var num = result.cards.length; + if (trigger.target.countDiscardableCards(player, "he")) + player.discardPlayerCard( + "平讨:弃置" + get.translation(trigger.target) + get.cnNumber(num) + "张牌", + num, + "he", + trigger.target, + true + ); } /* else event.finish(); @@ -6244,2132 +7639,2661 @@ game.import('character', function () { } */ }, - shaRelated:true, - ai:{ - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.name||arg.name!='sha') return false; - if(!arg.target) return false; - var card=arg.target.getEquip(2); - return card&&get.value(card)>0&&player.hasCard(cardx=>{ - return lib.filter.cardDiscardable(cardx,player,'jsrgjuelie_discard')&&get.value(cardx)<5; - }); + shaRelated: true, + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.name || arg.name != "sha") return false; + if (!arg.target) return false; + var card = arg.target.getEquip(2); + return ( + card && + get.value(card) > 0 && + player.hasCard((cardx) => { + return ( + lib.filter.cardDiscardable(cardx, player, "jsrgjuelie_discard") && + get.value(cardx) < 5 + ); + }) + ); }, }, - group:'jsrgjuelie_pojun', - subSkill:{ - pojun:{ - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - if(!player.isMinHandcard()&&!player.isMinHp()) return false; - return event.getParent().name=='sha'; + group: "jsrgjuelie_pojun", + subSkill: { + pojun: { + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + if (!player.isMinHandcard() && !player.isMinHp()) return false; + return event.getParent().name == "sha"; }, - forced:true, - locked:false, - logTarget:'player', - content:function(){ + forced: true, + locked: false, + logTarget: "player", + content: function () { trigger.num++; }, }, }, }, //皇甫嵩 - jsrgguanhuo:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.card.storage&&event.card.storage.jsrgguanhuo&&!game.hasPlayer2(current=>{ - return current.hasHistory('damage',evt=>evt.card==event.card); - }); + jsrgguanhuo: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.jsrgguanhuo && + !game.hasPlayer2((current) => { + return current.hasHistory("damage", (evt) => evt.card == event.card); + }) + ); }, - forced:true, - locked:false, - group:'jsrgguanhuo_viewas', - content:function(){ - 'step 0' - var count=player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length; - if(count==1){ - player.addTempSkill('jsrgguanhuo_ex','phaseUseAfter'); - player.addMark('jsrgguanhuo_ex',1,false); - trigger.targets.forEach(i=>i.removeSkill('huogong2')); - } - else{ - player.removeSkills('jsrgguanhuo'); + forced: true, + locked: false, + group: "jsrgguanhuo_viewas", + content: function () { + "step 0"; + var count = player.getHistory( + "useSkill", + (evt) => evt.skill == "jsrgguanhuo_viewas" + ).length; + if (count == 1) { + player.addTempSkill("jsrgguanhuo_ex", "phaseUseAfter"); + player.addMark("jsrgguanhuo_ex", 1, false); + trigger.targets.forEach((i) => i.removeSkill("huogong2")); + } else { + player.removeSkills("jsrgguanhuo"); } }, - ai:{ - effect:{ - player:function(card,player){ - if(_status.event.getParent().skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length==1) return 'zeroplayertarget'; - if(_status.event.type=='phase'&&_status.event.skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length>1&&player.countCards('h')<=3) return [0,0]; - } - } - }, - subSkill:{ - viewas:{ - audio:'jsrgguanhuo', - enable:'phaseUse', - viewAs:{ - name:'huogong', - isCard:true, - storage:{ - jsrgguanhuo:true - } + ai: { + effect: { + player: function (card, player) { + if ( + _status.event.getParent().skill == "jsrgguanhuo_viewas" && + player.getHistory("useSkill", (evt) => evt.skill == "jsrgguanhuo_viewas") + .length == 1 + ) + return "zeroplayertarget"; + if ( + _status.event.type == "phase" && + _status.event.skill == "jsrgguanhuo_viewas" && + player.getHistory("useSkill", (evt) => evt.skill == "jsrgguanhuo_viewas") + .length > 1 && + player.countCards("h") <= 3 + ) + return [0, 0]; }, - filterCard:()=>false, - selectCard:-1, - prompt:'视为使用一张【火攻】', - ai:{ - order:function(item,player){ - return get.order({name:'huogong'})+0.01; - }, - } }, - ex:{ - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return event.card&&event.card.name=='huogong'&&event.getParent().type=='card'; + }, + subSkill: { + viewas: { + audio: "jsrgguanhuo", + enable: "phaseUse", + viewAs: { + name: "huogong", + isCard: true, + storage: { + jsrgguanhuo: true, + }, }, - forced:true, - charlotte:true, - onremove:true, - intro:{content:'当你造成渠道为【火攻】的伤害时,此伤害+#'}, - content:function(){ - trigger.num+=player.countMark('jsrgguanhuo_ex'); - } - } - } + filterCard: () => false, + selectCard: -1, + prompt: "视为使用一张【火攻】", + ai: { + order: function (item, player) { + return get.order({ name: "huogong" }) + 0.01; + }, + }, + }, + ex: { + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return ( + event.card && event.card.name == "huogong" && event.getParent().type == "card" + ); + }, + forced: true, + charlotte: true, + onremove: true, + intro: { content: "当你造成渠道为【火攻】的伤害时,此伤害+#" }, + content: function () { + trigger.num += player.countMark("jsrgguanhuo_ex"); + }, + }, + }, }, - jsrgjuxia:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - usable:1, - countSkill:function(player){ - return player.getSkills(null,false,false).filter(function(skill){ - var info=get.info(skill); - if(!info||info.charlotte) return false; - if(info.zhuSkill) return player.hasZhuSkill(skill); + jsrgjuxia: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + usable: 1, + countSkill: function (player) { + return player.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; + if (info.zhuSkill) return player.hasZhuSkill(skill); return true; }).length; }, - filter:function(event,player){ - return event.player!=player&&lib.skill.jsrgjuxia.countSkill(event.player)>lib.skill.jsrgjuxia.countSkill(player); + filter: function (event, player) { + return ( + event.player != player && + lib.skill.jsrgjuxia.countSkill(event.player) > lib.skill.jsrgjuxia.countSkill(player) + ); }, - direct:true, - content:function(){ - 'step 0' - var goon=get.effect(player,trigger.card,trigger.player,trigger.player)<1; - if(goon&&!event.isMine()&&!event.isOnline()) game.delayx(); - trigger.player.chooseBool('是否对'+get.translation(player)+'发动【居下】?','令'+get.translation(trigger.card)+'对其无效,然后其摸两张牌').set('ai',()=>{ - return _status.event.goon; - }).set('goon',goon); - 'step 1' - if(result.bool){ - trigger.player.logSkill('jsrgjuxia',player); + direct: true, + content: function () { + "step 0"; + var goon = get.effect(player, trigger.card, trigger.player, trigger.player) < 1; + if (goon && !event.isMine() && !event.isOnline()) game.delayx(); + trigger.player + .chooseBool( + "是否对" + get.translation(player) + "发动【居下】?", + "令" + get.translation(trigger.card) + "对其无效,然后其摸两张牌" + ) + .set("ai", () => { + return _status.event.goon; + }) + .set("goon", goon); + ("step 1"); + if (result.bool) { + trigger.player.logSkill("jsrgjuxia", player); trigger.excluded.add(player); player.draw(2); - } - else player.storage.counttrigger.jsrgjuxia--; + } else player.storage.counttrigger.jsrgjuxia--; }, - ai:{ - effect:{ - target:function(card,player,target){ - if(lib.skill.jsrgjuxia.countSkill(target)>=lib.skill.jsrgjuxia.countSkill(player)) return; - if(card&&(card.cards||card.isCard)&&get.attitude(target,player)>0&&(!target.storage.counttrigger||!target.storage.counttrigger.jsrgjuxia)) return [0,0.5,0,0.5]; + ai: { + effect: { + target: function (card, player, target) { + if ( + lib.skill.jsrgjuxia.countSkill(target) >= + lib.skill.jsrgjuxia.countSkill(player) + ) + return; + if ( + card && + (card.cards || card.isCard) && + get.attitude(target, player) > 0 && + (!target.storage.counttrigger || !target.storage.counttrigger.jsrgjuxia) + ) + return [0, 0.5, 0, 0.5]; }, }, - } + }, }, //许劭 - jsrgyingmen:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:['enterGame','phaseBegin'], + jsrgyingmen: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseBegin"], }, - forced:true, - filter:function(event,player,name){ - if(player.getStorage('jsrgyingmen').length>=4) return false; - if(name=='phaseBefore') return game.phaseNumber==0; - return event.name!='phase'||event.player==player; + forced: true, + filter: function (event, player, name) { + if (player.getStorage("jsrgyingmen").length >= 4) return false; + if (name == "phaseBefore") return game.phaseNumber == 0; + return event.name != "phase" || event.player == player; }, - update:function(player){ - var id=player.playerid; - var characters=player.getStorage('jsrgyingmen'); - var skillName='jsrgpingjian_'+id; - var skillsx=[],skillsx2=[]; - var map={}; - var skillsy=lib.skill[skillName]?lib.skill[skillName].group:[]; - for(var name of characters){ - var skills=lib.character[name][3].slice(); - skills=skills.filter(skill=>{ - var list=get.skillCategoriesOf(skill,player); - list.removeArray(['锁定技','Charlotte']); - if(list.length) return false; - var info=get.info(skill); - return info&&(!info.unique||info.gainable); + update: function (player) { + var id = player.playerid; + var characters = player.getStorage("jsrgyingmen"); + var skillName = "jsrgpingjian_" + id; + var skillsx = [], + skillsx2 = []; + var map = {}; + var skillsy = lib.skill[skillName] ? lib.skill[skillName].group : []; + for (var name of characters) { + var skills = lib.character[name][3].slice(); + skills = skills.filter((skill) => { + var list = get.skillCategoriesOf(skill, player); + list.removeArray(["锁定技", "Charlotte"]); + if (list.length) return false; + var info = get.info(skill); + return info && (!info.unique || info.gainable); }); game.expandSkills(skills); - for(var i=0;i{ - return lib.skill.jsrgyingmen.bannedList.includes(skill); - })) continue; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + var skills = lib.character[name][3].slice(); + if ( + skills.some((skill) => { + return lib.skill.jsrgyingmen.bannedList.includes(skill); + }) + ) + continue; list.push(name); _status.characterlist.remove(name); - if(list.length>=4-num) break; + if (list.length >= 4 - num) break; } - if(list.length){ - player.markAuto('jsrgyingmen',list); - if(player.hasSkill('jsrgpingjian',null,false,false)) lib.skill.jsrgyingmen.update(player); - game.log(player,'将','#g'+get.translation(list),'置为','#y访客'); - game.broadcastAll(function(player,list){ - var cards=[]; - for(var i=0;i{ - return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; - })) return true; + var info = get.info(skill); + if (info && (info.charlotte || info.silent)) continue; + if ( + skills.some((skillx) => { + return ( + skill.indexOf(skillx) == 0 || + name.indexOf(skillx + "_" + player.playerid) == 0 + ); + }) + ) + return true; } return false; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; var current; - var skill=trigger.skill,name=trigger.event?trigger.event.name:''; - var visitors=player.getStorage('jsrgyingmen'); - for(var visitor of visitors){ - var skills=lib.character[visitor][3].slice(); + var skill = trigger.skill, + name = trigger.event ? trigger.event.name : ""; + var visitors = player.getStorage("jsrgyingmen"); + for (var visitor of visitors) { + var skills = lib.character[visitor][3].slice(); game.expandSkills(skills); - var info=get.info(skill); - if(info&&info.charlotte) continue; - if(skills.some(skillx=>{ - return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; - })){ - current=visitor; + var info = get.info(skill); + if (info && info.charlotte) continue; + if ( + skills.some((skillx) => { + return ( + skill.indexOf(skillx) == 0 || + name.indexOf(skillx + "_" + player.playerid) == 0 + ); + }) + ) { + current = visitor; break; } } - event.current=current; - player.chooseButton(['###评鉴:移去一名访客###
    若移去的访客为'+get.translation(current)+',则你摸一张牌
    ',[player.getStorage('jsrgyingmen'),'character']],true).set('ai',button=>{ - if(button.link==_status.event.toremove) return 1; - return Math.random(); - }).set('toremove',function(){ - var list=player.getStorage('jsrgyingmen'); - var rand=Math.random(); - if(rand<0.33) return list[0]; - if(rand<0.66) return current; - return list.randomGet(); - }()); - 'step 1' - if(result.bool){ - var visitor=result.links[0]; - game.log(player,'从','#y访客','中移去了','#g'+get.translation(visitor)); + event.current = current; + player + .chooseButton( + [ + '###评鉴:移去一名访客###
    若移去的访客为' + + get.translation(current) + + ",则你摸一张牌
    ", + [player.getStorage("jsrgyingmen"), "character"], + ], + true + ) + .set("ai", (button) => { + if (button.link == _status.event.toremove) return 1; + return Math.random(); + }) + .set( + "toremove", + (function () { + var list = player.getStorage("jsrgyingmen"); + var rand = Math.random(); + if (rand < 0.33) return list[0]; + if (rand < 0.66) return current; + return list.randomGet(); + })() + ); + ("step 1"); + if (result.bool) { + var visitor = result.links[0]; + game.log(player, "从", "#y访客", "中移去了", "#g" + get.translation(visitor)); player.popup(visitor); - player.unmarkAuto('jsrgyingmen',[visitor]); + player.unmarkAuto("jsrgyingmen", [visitor]); _status.characterlist.add(visitor); - if(visitor==event.current) player.draw(); + if (visitor == event.current) player.draw(); lib.skill.jsrgyingmen.update(player); } }, - subSkill:{ - blocker:{ - init:function(player,skill){ + subSkill: { + blocker: { + init: function (player, skill) { player.addSkillBlocker(skill); }, - onremove:function(player,skill){ + onremove: function (player, skill) { player.removeSkillBlocker(skill); }, - charlotte:true, - locked:true, - skillBlocker:function(skill,player){ - if(skill!='jsrgpingjian_'+player.playerid) return false; - if(player._jsrgpingjian_blockerChecking) return; - player._jsrgpingjian_blockerChecking=true; - var own=player.hasSkill('jsrgpingjian'); + charlotte: true, + locked: true, + skillBlocker: function (skill, player) { + if (skill != "jsrgpingjian_" + player.playerid) return false; + if (player._jsrgpingjian_blockerChecking) return; + player._jsrgpingjian_blockerChecking = true; + var own = player.hasSkill("jsrgpingjian"); delete player._jsrgpingjian_blockerChecking; return !own; - } + }, }, - } + }, }, //董白 - jsrgshichong:{ - audio:2, - zhuanhuanji:true, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.target!=player&&event.targets.length==1&&event.target.isIn()&&event.target.countCards('h'); + jsrgshichong: { + audio: 2, + zhuanhuanji: true, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return ( + event.target != player && + event.targets.length == 1 && + event.target.isIn() && + event.target.countCards("h") + ); }, - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - var str='转换技。当你使用牌指定其他角色为唯一目标后,'; - if(storage) return str+'目标角色可以交给你一张手牌。'; - return str+'你可以获得目标角色一张手牌。'; + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + var str = "转换技。当你使用牌指定其他角色为唯一目标后,"; + if (storage) return str + "目标角色可以交给你一张手牌。"; + return str + "你可以获得目标角色一张手牌。"; }, }, - content:function(){ - 'step 0' - if(!player.storage.jsrgshichong){ - player.chooseBool(get.prompt('jsrgshichong',trigger.target),'你可以获得该角色的一张手牌').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.attitude(player,trigger.target)<=0); + content: function () { + "step 0"; + if (!player.storage.jsrgshichong) { + player + .chooseBool( + get.prompt("jsrgshichong", trigger.target), + "你可以获得该角色的一张手牌" + ) + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.attitude(player, trigger.target) <= 0); + } else { + trigger.target + .chooseCard( + "是否发动" + get.translation(player) + "的【恃宠】?", + "你可以选择一张手牌,并交给该角色" + ) + .set("ai", (card) => { + if (_status.event.goon) return 5 - get.value(card); + return 0 - get.value(card); + }) + .set("goon", get.attitude(trigger.target, player) > 2); } - else{ - trigger.target.chooseCard('是否发动'+get.translation(player)+'的【恃宠】?','你可以选择一张手牌,并交给该角色').set('ai',card=>{ - if(_status.event.goon) return 5-get.value(card); - return 0-get.value(card); - }).set('goon',get.attitude(trigger.target,player)>2); - } - 'step 1' - if(result.bool){ - if(!player.storage.jsrgshichong){ - player.logSkill('jsrgshichong',trigger.target); - player.gainPlayerCard(trigger.target,'h',true); + ("step 1"); + if (result.bool) { + if (!player.storage.jsrgshichong) { + player.logSkill("jsrgshichong", trigger.target); + player.gainPlayerCard(trigger.target, "h", true); + } else { + trigger.target.logSkill("jsrgshichong", player); + trigger.target.give(result.cards, player); } - else{ - trigger.target.logSkill('jsrgshichong',player); - trigger.target.give(result.cards,player); - } - player.changeZhuanhuanji('jsrgshichong'); + player.changeZhuanhuanji("jsrgshichong"); } - } - }, - jsrglianzhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:{color:'black'}, - position:'h', - filterTarget:lib.filter.notMe, - lose:false, - discard:false, - delay:false, - content:function(){ - 'step 0' - player.showCards(cards,get.translation(player)+'发动了【连诛】'); - 'step 1' - player.give(cards,target); - 'step 2' - event.targets=game.filterPlayer(current=>{ - return current.group==target.group&¤t!=player; - }).sortBySeat(); - game.delayx(); - 'step 3' - var target=targets.shift(); - if(player.canUse('guohe',target)){ - player.useCard({name:'guohe',isCard:true},target); - } - if(targets.length) event.redo(); }, - ai:{ - order:4, - result:{ - target:function(player,target){ - var targets=game.filterPlayer(current=>{ - return current.group==target.group&¤t!=player; - }); - var eff=targets.reduce((p,c)=>{ - return p+get.effect(c,{name:'guohe'},player,player); - },0) - if(ui.selected.cards.length) eff+=get.value(ui.selected.cards[0],target); - return eff; - } + }, + jsrglianzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: { color: "black" }, + position: "h", + filterTarget: lib.filter.notMe, + lose: false, + discard: false, + delay: false, + content: function () { + "step 0"; + player.showCards(cards, get.translation(player) + "发动了【连诛】"); + ("step 1"); + player.give(cards, target); + ("step 2"); + event.targets = game + .filterPlayer((current) => { + return current.group == target.group && current != player; + }) + .sortBySeat(); + game.delayx(); + ("step 3"); + var target = targets.shift(); + if (player.canUse("guohe", target)) { + player.useCard({ name: "guohe", isCard: true }, target); } - } + if (targets.length) event.redo(); + }, + ai: { + order: 4, + result: { + target: function (player, target) { + var targets = game.filterPlayer((current) => { + return current.group == target.group && current != player; + }); + var eff = targets.reduce((p, c) => { + return p + get.effect(c, { name: "guohe" }, player, player); + }, 0); + if (ui.selected.cards.length) eff += get.value(ui.selected.cards[0], target); + return eff; + }, + }, + }, }, //桥玄 - jsrgjuezhi:{ - audio:2, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - if(_status.currentPhase!=player||player.hasSkill('jsrgjuezhi_used',null,null,false)) return false; - return event.card&&event.getParent().type=='card'&&lib.skill.jsrgjuezhi.getNum(event.player,player)>0; + jsrgjuezhi: { + audio: 2, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + if ( + _status.currentPhase != player || + player.hasSkill("jsrgjuezhi_used", null, null, false) + ) + return false; + return ( + event.card && + event.getParent().type == "card" && + lib.skill.jsrgjuezhi.getNum(event.player, player) > 0 + ); }, - forced:true, - locked:false, - getNum:function(target,player){ - return target.countCards('e',card=>{ - var subtype=get.subtypes(card); - for(var i of subtype){ - if(player.hasDisabledSlot(i)) return true; + forced: true, + locked: false, + getNum: function (target, player) { + return target.countCards("e", (card) => { + var subtype = get.subtypes(card); + for (var i of subtype) { + if (player.hasDisabledSlot(i)) return true; } return false; }); }, - group:'jsrgjuezhi_disable', - content:function(){ - player.addTempSkill('jsrgjuezhi_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); - trigger.num+=lib.skill.jsrgjuezhi.getNum(trigger.player,player); + group: "jsrgjuezhi_disable", + content: function () { + player.addTempSkill("jsrgjuezhi_used", [ + "phaseZhunbeiAfter", + "phaseJudgeAfter", + "phaseDrawAfter", + "phaseUseAfter", + "phaseDiscardAfter", + "phaseJieshuAfter", + ]); + trigger.num += lib.skill.jsrgjuezhi.getNum(trigger.player, player); }, - subSkill:{ - disable:{ - audio:'jsrgjuezhi', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + disable: { + audio: "jsrgjuezhi", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; + direct: true, + filter: function (event, player) { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; }, - content:function(){ - 'step 0' - event.cards=trigger.getl(player).es; - 'step 1' - var card=cards.shift(),subtypes=get.subtypes(card).filter(slot=>player.hasEnabledSlot(slot)); - event.subtypes=subtypes; - if(subtypes.length>0){ - player.chooseBool(get.prompt('jsrgjuezhi_disable'),'废除你的'+get.translation(subtypes)+'栏').set('ai',()=>1); - } - else event._result={bool:false}; - 'step 2' - if(result.bool){ - player.logSkill('jsrgjuezhi_disable'); + content: function () { + "step 0"; + event.cards = trigger.getl(player).es; + ("step 1"); + var card = cards.shift(), + subtypes = get.subtypes(card).filter((slot) => player.hasEnabledSlot(slot)); + event.subtypes = subtypes; + if (subtypes.length > 0) { + player + .chooseBool( + get.prompt("jsrgjuezhi_disable"), + "废除你的" + get.translation(subtypes) + "栏" + ) + .set("ai", () => 1); + } else event._result = { bool: false }; + ("step 2"); + if (result.bool) { + player.logSkill("jsrgjuezhi_disable"); player.disableEquip(event.subtypes); } - if(cards.length>0) event.goto(1); + if (cards.length > 0) event.goto(1); }, }, - used:{charlotte:true} - } + used: { charlotte: true }, + }, }, - jsrgjizhao:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgjizhao')).set('ai',target=>{ - var player=_status.event.player; - if(player.countCards('j')) return player==target?10:0.1; - return 6-get.attitude(player,target); + jsrgjizhao: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("jsrgjizhao")).set("ai", (target) => { + var player = _status.event.player; + if (player.countCards("j")) return player == target ? 10 : 0.1; + return 6 - get.attitude(player, target); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgjizhao',target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jsrgjizhao", target); target.chooseToUse({ - filterCard:function(card,player,event){ - if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; - return lib.filter.filterCard.apply(this,arguments); + filterCard: function (card, player, event) { + if ( + get.itemtype(card) != "card" || + (get.position(card) != "h" && get.position(card) != "s") + ) + return false; + return lib.filter.filterCard.apply(this, arguments); }, - prompt:'急召:使用一张手牌,否则'+get.translation(player)+'可以移动你区域里的一张牌', - addCount:false, - goon:target!=player||!player.countCards('j'), - ai1:function(card){ - if(_status.event.goon) return get.order(card); + prompt: + "急召:使用一张手牌,否则" + + get.translation(player) + + "可以移动你区域里的一张牌", + addCount: false, + goon: target != player || !player.countCards("j"), + ai1: function (card) { + if (_status.event.goon) return get.order(card); return 0; - } + }, }); - } - else{ + } else { event.finish(); return; } - 'step 2' - if(result.bool){event.finish();return;} - var targets=game.filterPlayer(current=>{ - if(current==target) return false; - var hs=target.getCards('h'); - if(hs.length) return true; - var js=target.getCards('j'); - for(var i=0;i { + if (current == target) return false; + var hs = target.getCards("h"); + if (hs.length) return true; + var js = target.getCards("j"); + for (var i = 0; i < js.length; i++) { + if (current.canAddJudge(js[i])) return true; } - if(current.isMin()) return false; - var es=target.getCards('e'); - for(var i=0;i0) return att; + if ( + i == es.length && + (!from.countCards("j", function (card) { + return target.canAddJudge(card); + }) || + att2 <= 0) + ) { + if (from.countCards("h") > 0) return att; return 0; } - return -att*att2; + return -att * att2; }); - next.set('targetprompt','移动目标'); - next.set('prompt','急召:是否移动'+get.translation(target)+'的一张牌?'); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target2=result.targets[0]; - event.targets=[target,target2]; - player.line2(event.targets,'green'); - } - else{ + next.set("targetprompt", "移动目标"); + next.set("prompt", "急召:是否移动" + get.translation(target) + "的一张牌?"); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target2 = result.targets[0]; + event.targets = [target, target2]; + player.line2(event.targets, "green"); + } else { event.finish(); } - 'step 4' + ("step 4"); game.delay(); - 'step 5' - if(targets.length==2){ - player.choosePlayerCard('hej',true,function(button){ - var player=_status.event.player; - var targets0=_status.event.targets0; - var targets1=_status.event.targets1; - if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ - if(get.position(button.link)=='j') return 12; - if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; - return 0; - } - else{ - if(get.position(button.link)=='j') return -10; - if(get.position(button.link)=='h') return 10; - return get.value(button.link)*get.effect(targets1,button.link,player,targets1); - } - },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ - var targets1=_status.event.targets1; - if(get.position(button.link)=='h'){ - return true; - } - else if(get.position(button.link)=='j'){ - return targets1.canAddJudge(button.link); - } - else{ - return targets1.canEquip(button.link); - } - }); - } - else{ + ("step 5"); + if (targets.length == 2) { + player + .choosePlayerCard( + "hej", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if ( + get.attitude(player, targets0) > 0 && + get.attitude(player, targets1) < 0 + ) { + if (get.position(button.link) == "j") return 12; + if ( + get.value(button.link, targets0) < 0 && + get.effect(targets1, button.link, player, targets1) > 0 + ) + return 10; + return 0; + } else { + if (get.position(button.link) == "j") return -10; + if (get.position(button.link) == "h") return 10; + return ( + get.value(button.link) * + get.effect(targets1, button.link, player, targets1) + ); + } + }, + targets[0] + ) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + if (get.position(button.link) == "h") { + return true; + } else if (get.position(button.link) == "j") { + return targets1.canAddJudge(button.link); + } else { + return targets1.canEquip(button.link); + } + }); + } else { event.finish(); } - 'step 6' - if(result.bool&&result.links.length){ - var link=result.links[0]; - if(get.position(link)=='h') event.targets[1].gain(link,event.targets[0],'giveAuto'); - else{ - event.targets[0].$give(link,event.targets[1],false); - if(get.position(link)=='e') event.targets[1].equip(link); - else if(link.viewAs) event.targets[1].addJudge({name:link.viewAs},[link]); + ("step 6"); + if (result.bool && result.links.length) { + var link = result.links[0]; + if (get.position(link) == "h") + event.targets[1].gain(link, event.targets[0], "giveAuto"); + else { + event.targets[0].$give(link, event.targets[1], false); + if (get.position(link) == "e") event.targets[1].equip(link); + else if (link.viewAs) event.targets[1].addJudge({ name: link.viewAs }, [link]); else event.targets[1].addJudge(link); } - game.log(event.targets[0],'的',get.position(link)=='h'?'一张手牌':link,'被移动给了',event.targets[1]); + game.log( + event.targets[0], + "的", + get.position(link) == "h" ? "一张手牌" : link, + "被移动给了", + event.targets[1] + ); game.delay(); } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='delay'&¤t<0){ - if(target.countCards('j')) return; - return 'zerotarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && current < 0) { + if (target.countCards("j")) return; + return "zerotarget"; } }, }, - } + }, }, //杨彪 - jsrgzhaohan:{ - audio:'zhaohan', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, + jsrgzhaohan: { + audio: "zhaohan", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, //locked:false, - filter:function(event,player){ - if(game.shuffleNumber==0) return player.isDamaged(); + filter: function (event, player) { + if (game.shuffleNumber == 0) return player.isDamaged(); return true; }, - content:function(){ - player[game.shuffleNumber>0?'loseHp':'recover'](); - } + content: function () { + player[game.shuffleNumber > 0 ? "loseHp" : "recover"](); + }, }, - jsrgrangjie:{ - audio:'rangjie', - trigger:{player:'damageEnd'}, - filter:function(event,player){ + jsrgrangjie: { + audio: "rangjie", + trigger: { player: "damageEnd" }, + filter: function (event, player) { return player.canMoveCard(); }, - check:function(event,player){ + check: function (event, player) { return player.canMoveCard(true); }, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); event.num--; - if(player.canMoveCard()) player.moveCard(true); - 'step 2' - if(result.bool){ - var card=result.card; - var suit=get.suit(card,false); - var cards=Array.from(ui.discardPile.childNodes); - var gains=[]; - var history=game.getGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose') return evt.position==ui.discardPile; - return evt.name=='cardsDiscard'; + if (player.canMoveCard()) player.moveCard(true); + ("step 2"); + if (result.bool) { + var card = result.card; + var suit = get.suit(card, false); + var cards = Array.from(ui.discardPile.childNodes); + var gains = []; + var history = game.getGlobalHistory("cardMove", (evt) => { + if (evt.name == "lose") return evt.position == ui.discardPile; + return evt.name == "cardsDiscard"; }); - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - var cards2=evt.cards.filter(card=>{ - return cards.includes(card)&&get.suit(card,false)==suit; + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + var cards2 = evt.cards.filter((card) => { + return cards.includes(card) && get.suit(card, false) == suit; }); - if(cards2.length){ + if (cards2.length) { gains.addArray(cards2); cards.removeArray(cards2); } - if(!cards.length) break; + if (!cards.length) break; } - if(gains.length){ - player.chooseButton(['让节:是否获得一张'+get.translation(suit)+'牌?',gains]).set('ai',get.buttonValue); - } - else event._result={bool:false}; + if (gains.length) { + player + .chooseButton(["让节:是否获得一张" + get.translation(suit) + "牌?", gains]) + .set("ai", get.buttonValue); + } else event._result = { bool: false }; } - 'step 3' - if(result.bool){ - player.gain(result.links,'gain2'); + ("step 3"); + if (result.bool) { + player.gain(result.links, "gain2"); } - 'step 4' - if(event.num>0&&player.hasSkill('jsrgrangjie')){ - player.chooseBool(get.prompt2('jsrgrangjie')).set('ai',()=>_status.event.bool).set('bool',lib.skill.jsrgrangjie.check(trigger,player)); - } - else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('jsrgrangjie'); + ("step 4"); + if (event.num > 0 && player.hasSkill("jsrgrangjie")) { + player + .chooseBool(get.prompt2("jsrgrangjie")) + .set("ai", () => _status.event.bool) + .set("bool", lib.skill.jsrgrangjie.check(trigger, player)); + } else event.finish(); + ("step 5"); + if (result.bool) { + player.logSkill("jsrgrangjie"); event.goto(1); } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target._jsrgrangjie_aiChecking) return; - target._jsrgrangjie_aiChecking=true; - var moveCard=target.canMoveCard(true); + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target._jsrgrangjie_aiChecking) return; + target._jsrgrangjie_aiChecking = true; + var moveCard = target.canMoveCard(true); delete target._jsrgrangjie_aiChecking; - if(!moveCard||!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()) num=0.5; - else num=0.3; + if (!moveCard || !target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.5; + else num = 0.3; } - if(target.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } }, }, }, }, - jsrgyizheng:{ - audio:'yizheng', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + jsrgyizheng: { + audio: "yizheng", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h") && player.canCompare(current); }); }, - filterTarget:function(card,player,current){ - return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + filterTarget: function (card, player, current) { + return current.countCards("h") > player.countCards("h") && player.canCompare(current); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - target.skip('phaseDraw'); - target.addTempSkill('yizheng2',{player:'phaseDrawSkipped'}); + ("step 1"); + if (result.bool) { + target.skip("phaseDraw"); + target.addTempSkill("yizheng2", { player: "phaseDrawSkipped" }); event.finish(); + } else { + target + .chooseControl("1", "2", "cancel") + .set("prompt", "是否对" + get.translation(player) + "造成至多2点伤害?") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + get.damageEffect(player, target, target) > 0 + ? get.attitude(target, player) > 0 + ? 0 + : 1 + : "cancel2" + ); } - else{ - target.chooseControl('1','2','cancel').set('prompt','是否对'+get.translation(player)+'造成至多2点伤害?').set('ai',()=>{ - return _status.event.choice; - }).set('choice',get.damageEffect(player,target,target)>0?(get.attitude(target,player)>0?0:1):'cancel2'); - } - 'step 2' - if(result.control!='cancel2'){ - var num=result.index+1; + ("step 2"); + if (result.control != "cancel2") { + var num = result.index + 1; target.line(player); - player.damage(target,num); + player.damage(target, num); } }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(target.skipList.includes('phaseDraw')||target.hasSkill('pingkou')) return 0; - var hs=player.getCards('h').sort(function(a,b){ - return b.number-a.number; + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou")) return 0; + var hs = player.getCards("h").sort(function (a, b) { + return b.number - a.number; }); - var ts=target.getCards('h').sort(function(a,b){ - return b.number-a.number; + var ts = target.getCards("h").sort(function (a, b) { + return b.number - a.number; }); - if(!hs.length||!ts.length) return 0; - if(hs[0].number>ts[0].number) return -1; + if (!hs.length || !ts.length) return 0; + if (hs[0].number > ts[0].number) return -1; return 0; }, }, }, }, //孔融 - jsrglirang:{ - audio:'splirang', - trigger:{global:'phaseDrawBegin'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&!player.hasSkill('jsrglirang_used')&&player.countCards('he')>1; + jsrglirang: { + audio: "splirang", + trigger: { global: "phaseDrawBegin" }, + direct: true, + filter: function (event, player) { + return ( + event.player != player && + !player.hasSkill("jsrglirang_used") && + player.countCards("he") > 1 + ); }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt('jsrglirang',trigger.player),'你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。',2,'he').set('ai',card=>{ - if(!_status.event.give) return 0; - var player=_status.event.player,target=_status.event.target; - return target.getUseValue(card)-player.getUseValue(card)+0.5; - }).set('give',get.attitude(player,trigger.player)>0).set('target',trigger.player); - 'step 1' - if(result.bool){ - player.logSkill('jsrglirang',trigger.player); - var cards=result.cards; - player.give(cards,trigger.player); - player.addTempSkill('jsrglirang_used','roundStart'); - player.addTempSkill('jsrglirang_given'); - player.markAuto('jsrglirang_used',[trigger.player]); + content: function () { + "step 0"; + player + .chooseCard( + get.prompt("jsrglirang", trigger.player), + "你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。", + 2, + "he" + ) + .set("ai", (card) => { + if (!_status.event.give) return 0; + var player = _status.event.player, + target = _status.event.target; + return target.getUseValue(card) - player.getUseValue(card) + 0.5; + }) + .set("give", get.attitude(player, trigger.player) > 0) + .set("target", trigger.player); + ("step 1"); + if (result.bool) { + player.logSkill("jsrglirang", trigger.player); + var cards = result.cards; + player.give(cards, trigger.player); + player.addTempSkill("jsrglirang_used", "roundStart"); + player.addTempSkill("jsrglirang_given"); + player.markAuto("jsrglirang_used", [trigger.player]); } }, - subSkill:{ - used:{ - charlotte:true, - onremove:true, - intro:{content:'本轮〖礼让〗目标:$'}, + subSkill: { + used: { + charlotte: true, + onremove: true, + intro: { content: "本轮〖礼让〗目标:$" }, }, - given:{ - audio:'splirang', - trigger:{global:'phaseDiscardEnd'}, - filter:function(event,player){ - return event.player.hasHistory('lose',evt=>{ - return evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.cards2.filterInD('d').length>0; + given: { + audio: "splirang", + trigger: { global: "phaseDiscardEnd" }, + filter: function (event, player) { + return event.player.hasHistory("lose", (evt) => { + return ( + evt.type == "discard" && + evt.getParent("phaseDiscard") == event && + evt.cards2.filterInD("d").length > 0 + ); }); }, - charlotte:true, - prompt2:function(event,player){ - var cards=[]; - event.player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2.filterInD('d')); + charlotte: true, + prompt2: function (event, player) { + var cards = []; + event.player.getHistory("lose", (evt) => { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) + cards.addArray(evt.cards2.filterInD("d")); }); - return '获得'+get.translation(cards); + return "获得" + get.translation(cards); }, - content:function(){ - var cards=[]; - trigger.player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2.filterInD('d')); + content: function () { + var cards = []; + trigger.player.getHistory("lose", (evt) => { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) + cards.addArray(evt.cards2.filterInD("d")); }); - player.gain(cards,'gain2'); - } - } - } - }, - jsrgzhengyi:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - var list=player.getStorage('jsrglirang_used'); - if(!list.length) return false; - return !player.getHistory('damage').length&&list[0].isIn(); + player.gain(cards, "gain2"); + }, + }, }, - direct:true, - content:function(){ - 'step 0' - var target=player.getStorage('jsrglirang_used')[0]; - event.target=target; - target.chooseBool('是否对'+get.translation(player)+'发动【争义】?','将此'+(trigger.source?'来源为'+get.translation(trigger.source):'无来源')+'的'+trigger.num+'点伤害转移给你').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.damageEffect(player,trigger.source,target)>get.damageEffect(target,trigger.source,target)); - 'step 1' - if(result.bool){ - target.logSkill('jsrgzhengyi',player); + }, + jsrgzhengyi: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + var list = player.getStorage("jsrglirang_used"); + if (!list.length) return false; + return !player.getHistory("damage").length && list[0].isIn(); + }, + direct: true, + content: function () { + "step 0"; + var target = player.getStorage("jsrglirang_used")[0]; + event.target = target; + target + .chooseBool( + "是否对" + get.translation(player) + "发动【争义】?", + "将此" + + (trigger.source ? "来源为" + get.translation(trigger.source) : "无来源") + + "的" + + trigger.num + + "点伤害转移给你" + ) + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + get.damageEffect(player, trigger.source, target) > + get.damageEffect(target, trigger.source, target) + ); + ("step 1"); + if (result.bool) { + target.logSkill("jsrgzhengyi", player); trigger.cancel(); - target.damage(trigger.source,trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); + target + .damage(trigger.source, trigger.nature, trigger.num) + .set("card", trigger.card) + .set("cards", trigger.cards); } - } + }, }, //朱儁 - jsrgfendi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.targets.length==1&&event.card.name=='sha'&&event.targets[0].countCards('h')>0; + jsrgfendi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return ( + event.targets.length == 1 && + event.card.name == "sha" && + event.targets[0].countCards("h") > 0 + ); }, - usable:1, - logTarget:'target', - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - player.choosePlayerCard(target,'h',true,[1,Infinity],'分敌:展示'+get.translation(target)+'的任意张手牌').set('ai',button=>{ - if(_status.event.all) return 1; - if(ui.selected.buttons.length) return 0; - return Math.random(); - }).set('all',!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))&&Math.random()<0.75).set('forceAuto',true); - 'step 1' - if(result.bool){ - var cards=result.cards; - target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【分敌】'); - target.addGaintag(cards,'jsrgfendi_tag'); - target.addTempSkill('jsrgfendi_blocker'); - player.addTempSkill('jsrgfendi_gain'); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.jsrgfendi=cards.slice(); - player.storage.jsrgfendi_gain=target; - } - else player.storage.counttrigger.jsrgfendi--; + usable: 1, + logTarget: "target", + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + player + .choosePlayerCard( + target, + "h", + true, + [1, Infinity], + "分敌:展示" + get.translation(target) + "的任意张手牌" + ) + .set("ai", (button) => { + if (_status.event.all) return 1; + if (ui.selected.buttons.length) return 0; + return Math.random(); + }) + .set( + "all", + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) && Math.random() < 0.75 + ) + .set("forceAuto", true); + ("step 1"); + if (result.bool) { + var cards = result.cards; + target.showCards( + cards, + get.translation(player) + "对" + get.translation(target) + "发动了【分敌】" + ); + target.addGaintag(cards, "jsrgfendi_tag"); + target.addTempSkill("jsrgfendi_blocker"); + player.addTempSkill("jsrgfendi_gain"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.jsrgfendi = cards.slice(); + player.storage.jsrgfendi_gain = target; + } else player.storage.counttrigger.jsrgfendi--; }, - subSkill:{ - blocker:{ - trigger:{ - player:['damageBefore','damageCancelled','damageZero'], - target:['shaMiss','useCardToExcluded','useCardToEnd'], - global:['useCardEnd'], + subSkill: { + blocker: { + trigger: { + player: ["damageBefore", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], + global: ["useCardEnd"], }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - player.removeSkill('jsrgfendi_blocker'); + forced: true, + popup: false, + charlotte: true, + content: function () { + player.removeSkill("jsrgfendi_blocker"); }, - mod:{ - cardEnabled:function(card,player){ - if(card.cards){ - for(var i of card.cards){ - if(!i.hasGaintag('jsrgfendi_tag')) return false; + mod: { + cardEnabled: function (card, player) { + if (card.cards) { + for (var i of card.cards) { + if (!i.hasGaintag("jsrgfendi_tag")) return false; } - } - else if(get.itemtype(card)=='card'){ - if(!card.hasGaintag('jsrgfendi_tag')) return false; + } else if (get.itemtype(card) == "card") { + if (!card.hasGaintag("jsrgfendi_tag")) return false; } }, - cardRespondable:function(card,player){ - return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + cardRespondable: function (card, player) { + return lib.skill.jsrgfendi.cardEnabled.apply(this, arguments); }, - cardSavable:function(card,player){ - return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + cardSavable: function (card, player) { + return lib.skill.jsrgfendi.cardEnabled.apply(this, arguments); }, }, }, - gain:{ - trigger:{global:'damageSource'}, - charlotte:true, - forced:true, - direct:true, - onremove:true, - filter:function(event,player){ - if(!event.card||!event.card.storage) return false; - var cards=event.card.storage.jsrgfendi; - var target=player.storage.jsrgfendi_gain; - if(!cards||!target||!target.isIn()) return false; - var cardsx=target.getCards('h'); + gain: { + trigger: { global: "damageSource" }, + charlotte: true, + forced: true, + direct: true, + onremove: true, + filter: function (event, player) { + if (!event.card || !event.card.storage) return false; + var cards = event.card.storage.jsrgfendi; + var target = player.storage.jsrgfendi_gain; + if (!cards || !target || !target.isIn()) return false; + var cardsx = target.getCards("h"); cardsx.addArray(Array.from(ui.discardPile)); - return cards.some(i=>cardsx.includes(i)); + return cards.some((i) => cardsx.includes(i)); //target.hasCard(card=>{ // return card.hasGaintag('jsrgfendi_tag'); //},'h'); }, - content:function(){ - var target=player.storage.jsrgfendi_gain; - player.logSkill('jsrgfendi_gain',target); - var cardsx=target.getCards('h'); + content: function () { + var target = player.storage.jsrgfendi_gain; + player.logSkill("jsrgfendi_gain", target); + var cardsx = target.getCards("h"); cardsx.addArray(Array.from(ui.discardPile)); - var cards=trigger.card.storage.jsrgfendi.filter(i=>cardsx.includes(i)); - player.gain(cards,'give'); - } - } - } - }, - jsrgjuxiang:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + var cards = trigger.card.storage.jsrgfendi.filter((i) => cardsx.includes(i)); + player.gain(cards, "give"); + }, + }, }, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - if(evt&&evt.name=='phaseDraw') return false; - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.includes(i)); - if(!cards.length) return false; - for(var card of cards){ - if(!lib.filter.cardDiscardable(card,player,'jsrgjuxiang')) return false; + }, + jsrgjuxiang: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; + var hs = player.getCards("h"); + var cards = event.getg(player).filter((i) => hs.includes(i)); + if (!cards.length) return false; + for (var card of cards) { + if (!lib.filter.cardDiscardable(card, player, "jsrgjuxiang")) return false; } return true; }, - check:function(event,player){ - var target=_status.currentPhase; - if(!target||get.attitude(player,target)<=0) return false; - var evt=event.getParent('phaseDiscard'),evt2=event.getParent('phaseJieshu'); - if(evt&&evt.name=='phaseDiscard'||evt2&&evt.name=='phaseJieshu') return false; - if(target.getCardUsable({name:'sha'})>=target.countCards('hs','sha')) return false; - if(!target.hasValueTarget({name:'sha'})) return false; - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.includes(i)); - var val=0; - for(var i of cards) val+=get.value(i); - if(val<10) return true; + check: function (event, player) { + var target = _status.currentPhase; + if (!target || get.attitude(player, target) <= 0) return false; + var evt = event.getParent("phaseDiscard"), + evt2 = event.getParent("phaseJieshu"); + if ((evt && evt.name == "phaseDiscard") || (evt2 && evt.name == "phaseJieshu")) + return false; + if (target.getCardUsable({ name: "sha" }) >= target.countCards("hs", "sha")) return false; + if (!target.hasValueTarget({ name: "sha" })) return false; + var hs = player.getCards("h"); + var cards = event.getg(player).filter((i) => hs.includes(i)); + var val = 0; + for (var i of cards) val += get.value(i); + if (val < 10) return true; return false; }, - prompt2:function(event,player){ - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.includes(i)); - var target=_status.currentPhase; - var str='弃置'+get.translation(cards); - if(target&&target.isIn()){ - var list=[]; - for(var card of cards){ - list.add(get.suit(card,player)); + prompt2: function (event, player) { + var hs = player.getCards("h"); + var cards = event.getg(player).filter((i) => hs.includes(i)); + var target = _status.currentPhase; + var str = "弃置" + get.translation(cards); + if (target && target.isIn()) { + var list = []; + for (var card of cards) { + list.add(get.suit(card, player)); } - var num=list.length; - str+=',然后令'+get.translation(target)+'于此回合额定的出牌阶段内使用【杀】的次数上限+'+num; + var num = list.length; + str += + ",然后令" + + get.translation(target) + + "于此回合额定的出牌阶段内使用【杀】的次数上限+" + + num; } return str; }, - content:function(){ - 'step 0' - var hs=player.getCards('h'); - var cards=trigger.getg(player).filter(i=>hs.includes(i)); - var list=[]; - for(var card of cards){ - list.add(get.suit(card,player)); + content: function () { + "step 0"; + var hs = player.getCards("h"); + var cards = trigger.getg(player).filter((i) => hs.includes(i)); + var list = []; + for (var card of cards) { + list.add(get.suit(card, player)); } - event.num=list.length; + event.num = list.length; player.discard(cards); - 'step 1' - var target=_status.currentPhase; - if(target&&target.isIn()){ - target.addTempSkill('jsrgjuxiang_sha'); - target.addMark('jsrgjuxiang_sha',num,false); - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'&&!evt.skill){ - evt.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); - evt.player.addMark('jsrgjuxiang_buff',num,false); + ("step 1"); + var target = _status.currentPhase; + if (target && target.isIn()) { + target.addTempSkill("jsrgjuxiang_sha"); + target.addMark("jsrgjuxiang_sha", num, false); + var evt = trigger.getParent("phaseUse"); + if (evt && evt.name == "phaseUse" && !evt.skill) { + evt.player.addTempSkill("jsrgjuxiang_buff", "phaseUseAfter"); + evt.player.addMark("jsrgjuxiang_buff", num, false); } } }, - subSkill:{ - sha:{ - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ + subSkill: { + sha: { + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { return !event.skill; }, - silent:true, - charlotte:true, - forced:true, - onremove:true, - content:function(){ - trigger.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); - trigger.player.addMark('jsrgjuxiang_buff',player.countMark('jsrgjuxiang_sha'),false); - } + silent: true, + charlotte: true, + forced: true, + onremove: true, + content: function () { + trigger.player.addTempSkill("jsrgjuxiang_buff", "phaseUseAfter"); + trigger.player.addMark( + "jsrgjuxiang_buff", + player.countMark("jsrgjuxiang_sha"), + false + ); + }, }, - buff:{ - charlotte:true, - intro:{content:'使用【杀】的次数上限+#'}, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('jsrgjuxiang_buff'); + buff: { + charlotte: true, + intro: { content: "使用【杀】的次数上限+#" }, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("jsrgjuxiang_buff"); }, - } - } - } + }, + }, + }, }, //刘备 - jsrgjishan:{ - audio:2, - trigger:{global:'damageBegin4'}, - usable:1, - filter:function(event,player){ - return player.hp>0; + jsrgjishan: { + audio: 2, + trigger: { global: "damageBegin4" }, + usable: 1, + filter: function (event, player) { + return player.hp > 0; }, - logTarget:'player', - onremove:true, - prompt2:'失去1点体力并防止此伤害,然后你与其各摸一张牌', - check:function(event,player){ - return get.damageEffect(event.player,event.source,_status.event.player,event.nature)*event.num < - get.effect(player,{name:'losehp'},player,_status.event.player)+get.effect(player,{name:'draw'},player,_status.event.player)+get.effect(event.player,{name:'draw'},player,_status.event.player)/2; + logTarget: "player", + onremove: true, + prompt2: "失去1点体力并防止此伤害,然后你与其各摸一张牌", + check: function (event, player) { + return ( + get.damageEffect(event.player, event.source, _status.event.player, event.nature) * + event.num < + get.effect(player, { name: "losehp" }, player, _status.event.player) + + get.effect(player, { name: "draw" }, player, _status.event.player) + + get.effect(event.player, { name: "draw" }, player, _status.event.player) / 2 + ); }, - group:'jsrgjishan_recover', - content:function(){ - 'step 0' + group: "jsrgjishan_recover", + content: function () { + "step 0"; trigger.cancel(); player.loseHp(); - player.markAuto('jsrgjishan',[trigger.player]); - 'step 1' - if(player.isIn()&&trigger.player.isIn()){ - var targets=[player,trigger.player]; + player.markAuto("jsrgjishan", [trigger.player]); + ("step 1"); + if (player.isIn() && trigger.player.isIn()) { + var targets = [player, trigger.player]; targets.sortBySeat(_status.currentPhase); - targets[0].draw('nodelay'); + targets[0].draw("nodelay"); targets[1].draw(); } }, - intro:{content:'已帮助$抵挡过伤害'}, - ai:{expose:0.2}, - subSkill:{ - recover:{ - audio:'jsrgjishan', - trigger:{source:'damageSource'}, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current.isMinHp()&&player.getStorage('jsrgjishan').includes(current); + intro: { content: "已帮助$抵挡过伤害" }, + ai: { expose: 0.2 }, + subSkill: { + recover: { + audio: "jsrgjishan", + trigger: { source: "damageSource" }, + filter: function (event, player) { + return game.hasPlayer((current) => { + return current.isMinHp() && player.getStorage("jsrgjishan").includes(current); }); }, - usable:1, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgjishan_recover'),'令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力',(card,player,target)=>{ - return target.isMinHp()&&player.getStorage('jsrgjishan').includes(target); - }).set('ai',target=>{ - return get.recoverEffect(target,_status.event.player,_status.event.player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgjishan_recover',target); + usable: 1, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jsrgjishan_recover"), + "令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力", + (card, player, target) => { + return ( + target.isMinHp() && + player.getStorage("jsrgjishan").includes(target) + ); + } + ) + .set("ai", (target) => { + return get.recoverEffect( + target, + _status.event.player, + _status.event.player + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgjishan_recover", target); target.recover(); - } - else player.storage.counttrigger.jsrgjishan_recover--; - } - } - } - }, - jsrgzhenqiao:{ - audio:2, - trigger:{player:'useCardToTargeted'}, - forced:true, - shaRelated:true, - filter:function(event,player){ - return event.isFirstTarget&&event.card.name=='sha'&&player.hasEmptySlot(1); + } else player.storage.counttrigger.jsrgjishan_recover--; + }, + }, }, - content:function(){ + }, + jsrgzhenqiao: { + audio: 2, + trigger: { player: "useCardToTargeted" }, + forced: true, + shaRelated: true, + filter: function (event, player) { + return event.isFirstTarget && event.card.name == "sha" && player.hasEmptySlot(1); + }, + content: function () { // trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); trigger.getParent().effectCount++; }, - mod:{ - attackRange:function(player,num){ - return num+1; + mod: { + attackRange: function (player, num) { + return num + 1; }, - aiOrder:(player,card,num)=>{ - if(num>0&&get.itemtype(card)==='card'&&get.subtype(card)==='equip1'&&!player.getEquip(1)){ - if(card.name!=='zhuge'||player.getCardUsable('sha')||!player.needsToDiscard()||player.countCards('hs',i=>{ - return get.name(i)==='sha'&&lib.filter.cardEnabled(i,player); - })<2) return 0; + aiOrder: (player, card, num) => { + if ( + num > 0 && + get.itemtype(card) === "card" && + get.subtype(card) === "equip1" && + !player.getEquip(1) + ) { + if ( + card.name !== "zhuge" || + player.getCardUsable("sha") || + !player.needsToDiscard() || + player.countCards("hs", (i) => { + return get.name(i) === "sha" && lib.filter.cardEnabled(i, player); + }) < 2 + ) + return 0; } }, - aiValue:(player,card,num)=>{ - if(num>0&&get.itemtype(card)==='card'&&card.name!=='zhuge'&&get.subtype(card)==='equip1'&&!player.getEquip(1)) return 0.01*num; + aiValue: (player, card, num) => { + if ( + num > 0 && + get.itemtype(card) === "card" && + card.name !== "zhuge" && + get.subtype(card) === "equip1" && + !player.getEquip(1) + ) + return 0.01 * num; }, - aiUseful:()=>{ - return lib.skill.jsrgzhenqiao.mod.aiValue.apply(this,arguments); - } - } + aiUseful: () => { + return lib.skill.jsrgzhenqiao.mod.aiValue.apply(this, arguments); + }, + }, }, //王允 - jsrgshelun:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(current=>player.inRange(current)); + jsrgshelun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => player.inRange(current)); }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return player.inRange(target); }, - content:function(){ - var num=player.countCards('h'); - var targets=game.filterPlayer(current=>{ - return current.countCards('h')<=num&¤t!=target; + content: function () { + var num = player.countCards("h"); + var targets = game.filterPlayer((current) => { + return current.countCards("h") <= num && current != target; }); - player.chooseToDebate(targets).set('callback',function(){ - var result=event.debateResult; - if(result.bool&&result.opinion){ - var opinion=result.opinion; - var target=event.getParent(2).target; - if(opinion=='red') player.discardPlayerCard(target,'he',true); - else target.damage(); - } - }).set('ai',card=>{ - var player=_status.event.player; - var color=(player==_status.event.source||get.damageEffect(_status.event.getParent(2).target,player,player)>0)?'black':'red'; - var val=5-get.value(card); - if(get.color(card)==color) val+=10; - return val; - }).set('aiCard',target=>{ - var color=(target==_status.event.source||get.damageEffect(_status.event.getParent(2).target,target,target)>0)?'black':'red'; - var hs=target.getCards('h',{color:color}); - if(!hs.length) hs=target.getCards('h'); - return {bool:true,cards:[hs.randomGet()]}; - }).set('target',target); + player + .chooseToDebate(targets) + .set("callback", function () { + var result = event.debateResult; + if (result.bool && result.opinion) { + var opinion = result.opinion; + var target = event.getParent(2).target; + if (opinion == "red") player.discardPlayerCard(target, "he", true); + else target.damage(); + } + }) + .set("ai", (card) => { + var player = _status.event.player; + var color = + player == _status.event.source || + get.damageEffect(_status.event.getParent(2).target, player, player) > 0 + ? "black" + : "red"; + var val = 5 - get.value(card); + if (get.color(card) == color) val += 10; + return val; + }) + .set("aiCard", (target) => { + var color = + target == _status.event.source || + get.damageEffect(_status.event.getParent(2).target, target, target) > 0 + ? "black" + : "red"; + var hs = target.getCards("h", { color: color }); + if (!hs.length) hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; + }) + .set("target", target); + }, + ai: { + order: 8, + expose: 0.2, + result: { target: -1 }, }, - ai:{ - order:8, - expose:0.2, - result:{target:-1}, - } }, - jsrgfayi:{ - audio:2, - trigger:{global:'chooseToDebateAfter'}, - filter:function(event,player){ - if(!event.targets.includes(player)) return false; - if(event.red.map(i=>i[0]).includes(player)) return event.black.length; - if(event.black.map(i=>i[0]).includes(player)) return event.red.length; + jsrgfayi: { + audio: 2, + trigger: { global: "chooseToDebateAfter" }, + filter: function (event, player) { + if (!event.targets.includes(player)) return false; + if (event.red.map((i) => i[0]).includes(player)) return event.black.length; + if (event.black.map((i) => i[0]).includes(player)) return event.red.length; return false; }, - direct:true, - content:function(){ - 'step 0' - var targets=[]; - if(trigger.red.map(i=>i[0]).includes(player)) targets=trigger.black; - if(trigger.black.map(i=>i[0]).includes(player)) targets=trigger.red; - player.chooseTarget(get.prompt('jsrgfayi'),'对一名与你意见不同的角色造成1点伤害',(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('targets',targets.map(i=>i[0])).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgfayi',target); + direct: true, + content: function () { + "step 0"; + var targets = []; + if (trigger.red.map((i) => i[0]).includes(player)) targets = trigger.black; + if (trigger.black.map((i) => i[0]).includes(player)) targets = trigger.red; + player + .chooseTarget( + get.prompt("jsrgfayi"), + "对一名与你意见不同的角色造成1点伤害", + (card, player, target) => { + return _status.event.targets.includes(target); + } + ) + .set( + "targets", + targets.map((i) => i[0]) + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgfayi", target); target.damage(); } - } + }, }, - jsrgtushe:{ - audio:'xinfu_tushe', + jsrgtushe: { + audio: "xinfu_tushe", mod: { aiOrder(player, card, num) { - if (get.tag(card, 'multitarget')) { - if (player.countCards('h', { type: 'basic' })) return num / 10; + if (get.tag(card, "multitarget")) { + if (player.countCards("h", { type: "basic" })) return num / 10; return num * 10; } - if (get.type(card) === 'basic') return num + 10; + if (get.type(card) === "basic") return num + 10; }, aiValue(player, card, num) { - if (card.name === 'zhangba') { + if (card.name === "zhangba") { let fact = (n) => { - if (n > 1) return n * fact(n - 1); - return 1; - }, basic = 0; - return fact(Math.min(player.countCards('hs', i => { - if (get.tag(i, 'multitarget')) return 2; - if (!['shan', 'tao', 'jiu'].includes(card.name)) return 1; - basic++; - }) / (1 + basic), player.getCardUsable('sha'))); + if (n > 1) return n * fact(n - 1); + return 1; + }, + basic = 0; + return fact( + Math.min( + player.countCards("hs", (i) => { + if (get.tag(i, "multitarget")) return 2; + if (!["shan", "tao", "jiu"].includes(card.name)) return 1; + basic++; + }) / + (1 + basic), + player.getCardUsable("sha") + ) + ); } - if (['shan', 'tao', 'jiu'].includes(card.name)) { - if (player.getEquip('zhangba') && player.countCards('hs') > 1) return 0.01; + if (["shan", "tao", "jiu"].includes(card.name)) { + if (player.getEquip("zhangba") && player.countCards("hs") > 1) return 0.01; return num / 2; } - if (get.tag(card, 'multitarget')) return num + game.players.length; + if (get.tag(card, "multitarget")) return num + game.players.length; }, aiUseful(player, card, num) { - if (get.name(card, player) === 'shan') { - if (player.countCards('hs', i => { - if (card === i || card.cards && card.cards.includes(i)) return false; - return get.name(i, player) === 'shan'; - })) return -1; + if (get.name(card, player) === "shan") { + if ( + player.countCards("hs", (i) => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.name(i, player) === "shan"; + }) + ) + return -1; return num / Math.pow(Math.max(1, player.hp), 2); } - } + }, }, - trigger:{ - player:'useCardToPlayered', + trigger: { + player: "useCardToPlayered", }, - filter:function (event,player){ - if(get.type(event.card)=='equip') return false; - if(event.getParent().triggeredTargets3.length>1) return false; - return event.targets.length>0; + filter: function (event, player) { + if (get.type(event.card) == "equip") return false; + if (event.getParent().triggeredTargets3.length > 1) return false; + return event.targets.length > 0; }, - check:function(event,player){ - return !player.countCards('h',{type:'basic'}); + check: function (event, player) { + return !player.countCards("h", { type: "basic" }); }, locked: false, - content:function (){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - 'step 1' - if(player.countCards('h',{type:'basic'})) event.finish(); - else player.chooseBool('图射:是否摸'+get.cnNumber(trigger.targets.length)+'张牌?').set('ai',()=>1); - 'step 2' - if(result.bool){ + ("step 1"); + if (player.countCards("h", { type: "basic" })) event.finish(); + else + player + .chooseBool("图射:是否摸" + get.cnNumber(trigger.targets.length) + "张牌?") + .set("ai", () => 1); + ("step 2"); + if (result.bool) { player.draw(trigger.targets.length); } }, - ai:{ - presha:true, - pretao:true, - threaten:1.8, + ai: { + presha: true, + pretao: true, + threaten: 1.8, effect: { player(card, player, target) { - if (typeof card === 'object' && card.name !== 'shan' && get.type(card) !== 'equip' && !player.countCards('h', i => { - if (card === i || card.cards && card.cards.includes(i)) return false; - return get.type(i) === 'basic'; - })) { - let targets = [], evt = _status.event.getParent('useCard'); + if ( + typeof card === "object" && + card.name !== "shan" && + get.type(card) !== "equip" && + !player.countCards("h", (i) => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.type(i) === "basic"; + }) + ) { + let targets = [], + evt = _status.event.getParent("useCard"); targets.addArray(ui.selected.targets); if (evt && evt.card == card) targets.addArray(evt.targets); if (targets.length) return [1, targets.length]; - if (get.tag(card, 'multitarget')) return [1, game.players.length - 1]; + if (get.tag(card, "multitarget")) return [1, game.players.length - 1]; return [1, 1]; } - } - } - } + }, + }, + }, }, - jsrgtongjue:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuSkill:true, - filter:function(event,player){ - return player.hasZhuSkill('jsrgtongjue')&&game.hasPlayer(current=>current!=player&¤t.group=='qun'); + jsrgtongjue: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuSkill: true, + filter: function (event, player) { + return ( + player.hasZhuSkill("jsrgtongjue") && + game.hasPlayer((current) => current != player && current.group == "qun") + ); }, - filterCard:true, - selectCard:[1,Infinity], - filterTarget:function(card,player,target){ - return target!=player&&target.group=='qun'; + filterCard: true, + selectCard: [1, Infinity], + filterTarget: function (card, player, target) { + return target != player && target.group == "qun"; }, - selectTarget:[1,Infinity], - filterOk:function(){ - return ui.selected.cards.length==ui.selected.targets.length; + selectTarget: [1, Infinity], + filterOk: function () { + return ui.selected.cards.length == ui.selected.targets.length; }, - check:function(card){ - var player=_status.event.player; - if(player.hasCard(card=>{ - return player.hasValueTarget(card); - },'hs')){ - return 3-player.getUseValue(card); + check: function (card) { + var player = _status.event.player; + if ( + player.hasCard((card) => { + return player.hasValueTarget(card); + }, "hs") + ) { + return 3 - player.getUseValue(card); } - return 3-get.value(card); + return 3 - get.value(card); }, - multiline:true, - multitarget:true, - delay:false, - discard:false, - lose:false, - content:function(){ - 'step 0' - var list=[]; - for(var i=0;icurrent.getSeatNum()==1); - return event.player==zhu; + jsrgzhenglve: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var zhu = get.zhu(player) || game.findPlayer((current) => current.getSeatNum() == 1); + return event.player == zhu; }, - locked:false, - group:'jsrgzhenglve_damage', - prompt2:function(event,player){ - var num=Math.min(event.player.getHistory('sourceDamage').length>0?1:2,game.countPlayer(current=>{ - return !current.hasMark('jsrgzhenglve_mark'); - })); - if(num==0) return '你可以摸一张牌'; - return '你可以摸一张牌并令'+get.cnNumber(num)+'名角色获得“猎”标记'; + locked: false, + group: "jsrgzhenglve_damage", + prompt2: function (event, player) { + var num = Math.min( + event.player.getHistory("sourceDamage").length > 0 ? 1 : 2, + game.countPlayer((current) => { + return !current.hasMark("jsrgzhenglve_mark"); + }) + ); + if (num == 0) return "你可以摸一张牌"; + return "你可以摸一张牌并令" + get.cnNumber(num) + "名角色获得“猎”标记"; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - var damaged=trigger.player.getHistory('sourceDamage').length>0; - var num=damaged?1:2; - var targets=game.filterPlayer(current=>{ - return !current.hasMark('jsrgzhenglve_mark'); + ("step 1"); + var damaged = trigger.player.getHistory("sourceDamage").length > 0; + var num = damaged ? 1 : 2; + var targets = game.filterPlayer((current) => { + return !current.hasMark("jsrgzhenglve_mark"); }); - if(!targets.length) event.finish(); - else if(targets.length<=num) event._result={bool:true,targets:targets}; - else player.chooseTarget('令'+(num>1?'至多':'')+get.cnNumber(num)+'名角色获得“猎”标记',true,[1,num],(card,player,target)=>{ - return !target.hasMark('jsrgzhenglve_mark'); - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - return 100-att; - }); - 'step 2' - if(result.bool){ - var targets=result.targets; + if (!targets.length) event.finish(); + else if (targets.length <= num) event._result = { bool: true, targets: targets }; + else + player + .chooseTarget( + "令" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "名角色获得“猎”标记", + true, + [1, num], + (card, player, target) => { + return !target.hasMark("jsrgzhenglve_mark"); + } + ) + .set("ai", (target) => { + var att = get.attitude(_status.event.player, target); + return 100 - att; + }); + ("step 2"); + if (result.bool) { + var targets = result.targets; player.line(targets); - targets.forEach(i=>i.addMark('jsrgzhenglve_mark',1)); + targets.forEach((i) => i.addMark("jsrgzhenglve_mark", 1)); } }, - mod:{ - cardUsableTarget:function(card,player,target){ - if(target.hasMark('jsrgzhenglve_mark')) return true; + mod: { + cardUsableTarget: function (card, player, target) { + if (target.hasMark("jsrgzhenglve_mark")) return true; }, - targetInRange:function(card,player,target){ - if(target.hasMark('jsrgzhenglve_mark')) return true; + targetInRange: function (card, player, target) { + if (target.hasMark("jsrgzhenglve_mark")) return true; }, }, - subSkill:{ - damage:{ - audio:'jsrgzhenglve', - trigger:{source:'damageSource'}, - usable:1, - filter:function(event,player){ - return event.player.hasMark('jsrgzhenglve_mark'); + subSkill: { + damage: { + audio: "jsrgzhenglve", + trigger: { source: "damageSource" }, + usable: 1, + filter: function (event, player) { + return event.player.hasMark("jsrgzhenglve_mark"); }, - prompt2:function(event,player){ - var cards=event.cards||[]; - return '摸一张牌'+(cards.filterInD().length?'并获得'+get.translation(event.cards.filterInD()):''); + prompt2: function (event, player) { + var cards = event.cards || []; + return ( + "摸一张牌" + + (cards.filterInD().length + ? "并获得" + get.translation(event.cards.filterInD()) + : "") + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - var cards=trigger.cards; - if(cards&&cards.filterInD().length){ - player.gain(cards.filterInD(),'gain2'); + var cards = trigger.cards; + if (cards && cards.filterInD().length) { + player.gain(cards.filterInD(), "gain2"); } - } - }, - mark:{ - marktext:'猎', - intro:{ - name:'猎(政略)', - name2:'猎', - markcount:()=>0, - content:'已拥有“猎”标记', - } - } - } - }, - jsrghuilie:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'thunder', - derivation:['jsrgpingrong','feiying'], - filter:function(event,player){ - return game.countPlayer(current=>current.hasMark('jsrgzhenglve_mark'))>2; - }, - content:function(){ - 'step 0' - player.awakenSkill('jsrghuilie'); - player.loseMaxHp(); - 'step 1' - player.addSkills(['jsrgpingrong','feiying']); - } - }, - jsrgpingrong:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return !player.hasSkill('jsrgpingrong_used')&&game.hasPlayer(current=>current.hasMark('jsrgzhenglve_mark')); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrghuilie'),'移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。',(card,player,target)=>{ - return target.hasMark('jsrgzhenglve_mark'); - }).set('ai',target=>{ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgpingrong',target); - player.addTempSkill('jsrgpingrong_used','roundStart'); - target.removeMark('jsrgzhenglve_mark',target.countMark('jsrgzhenglve_mark')); - player.insertPhase(); - player.addSkill('jsrgpingrong_check'); - } - }, - subSkill:{ - used:{charlotte:true}, - check:{ - audio:'jsrgpingrong', - trigger:{player:'phaseAfter'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return event.skill=='jsrgpingrong'&&!player.getHistory('sourceDamage').length; }, - content:function(){ - player.loseHp(); - } + }, + mark: { + marktext: "猎", + intro: { + name: "猎(政略)", + name2: "猎", + markcount: () => 0, + content: "已拥有“猎”标记", + }, + }, + }, + }, + jsrghuilie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + derivation: ["jsrgpingrong", "feiying"], + filter: function (event, player) { + return game.countPlayer((current) => current.hasMark("jsrgzhenglve_mark")) > 2; + }, + content: function () { + "step 0"; + player.awakenSkill("jsrghuilie"); + player.loseMaxHp(); + ("step 1"); + player.addSkills(["jsrgpingrong", "feiying"]); + }, + }, + jsrgpingrong: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return ( + !player.hasSkill("jsrgpingrong_used") && + game.hasPlayer((current) => current.hasMark("jsrgzhenglve_mark")) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jsrghuilie"), + "移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。", + (card, player, target) => { + return target.hasMark("jsrgzhenglve_mark"); + } + ) + .set("ai", (target) => { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jsrgpingrong", target); + player.addTempSkill("jsrgpingrong_used", "roundStart"); + target.removeMark("jsrgzhenglve_mark", target.countMark("jsrgzhenglve_mark")); + player.insertPhase(); + player.addSkill("jsrgpingrong_check"); } - } + }, + subSkill: { + used: { charlotte: true }, + check: { + audio: "jsrgpingrong", + trigger: { player: "phaseAfter" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return event.skill == "jsrgpingrong" && !player.getHistory("sourceDamage").length; + }, + content: function () { + player.loseHp(); + }, + }, + }, }, //南华老仙 - jsrgshoushu:{ - audio:2, - forced:true, - trigger:{ + jsrgshoushu: { + audio: 2, + forced: true, + trigger: { //player:'enterGame', //global:'phaseBefore', - global:'roundStart', + global: "roundStart", }, - filter:function(event,player){ - if(game.hasPlayer(function(current){ - return current.countCards('hej','taipingyaoshu'); - })) return false; + filter: function (event, player) { + if ( + game.hasPlayer(function (current) { + return current.countCards("hej", "taipingyaoshu"); + }) + ) + return false; return true; //return event.name!='phase'||game.phaseNumber==0; }, - direct:true, - group:'jsrgshoushu_destroy', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgshoushu'),'将【太平要术】置入一名角色的装备区',(card,player,target)=>{ - var card={name:'taipingyaoshu'}; - return target.canEquip(card,true); - }).set('ai',target=>{ - return target.getUseValue({name:'taipingyaoshu'})*get.attitude(_status.event.player,target); - }) - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgshoushu',target); - if(!lib.inpile.includes('taipingyaoshu')){ - lib.inpile.push('taipingyaoshu'); + direct: true, + group: "jsrgshoushu_destroy", + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jsrgshoushu"), + "将【太平要术】置入一名角色的装备区", + (card, player, target) => { + var card = { name: "taipingyaoshu" }; + return target.canEquip(card, true); + } + ) + .set("ai", (target) => { + return ( + target.getUseValue({ name: "taipingyaoshu" }) * + get.attitude(_status.event.player, target) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jsrgshoushu", target); + if (!lib.inpile.includes("taipingyaoshu")) { + lib.inpile.push("taipingyaoshu"); } - event.card=game.createCard2('taipingyaoshu','heart',3); - } - else event.finish(); - 'step 2' - if(card) target.equip(card); + event.card = game.createCard2("taipingyaoshu", "heart", 3); + } else event.finish(); + ("step 2"); + if (card) target.equip(card); }, - subSkill:{ - destroy:{ - audio:'jsrgshoushu', - trigger:{ - global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + subSkill: { + destroy: { + audio: "jsrgshoushu", + trigger: { + global: [ + "loseEnd", + "equipEnd", + "addJudgeEnd", + "gainEnd", + "loseAsyncEnd", + "addToExpansionEnd", + ], }, - forced:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - var evt=event.getl(current); - if(evt&&evt.es) return evt.es.some(i=>i.name=='taipingyaoshu'); + forced: true, + filter: function (event, player) { + return game.hasPlayer((current) => { + var evt = event.getl(current); + if (evt && evt.es) return evt.es.some((i) => i.name == "taipingyaoshu"); return false; }); }, - content:function(){ - var cards=[]; - game.countPlayer(current=>{ - var evt=trigger.getl(current); - if(evt&&evt.es) return cards.addArray(evt.es.filter(i=>i.name=='taipingyaoshu')); + content: function () { + var cards = []; + game.countPlayer((current) => { + var evt = trigger.getl(current); + if (evt && evt.es) + return cards.addArray(evt.es.filter((i) => i.name == "taipingyaoshu")); }); game.cardsGotoSpecial(cards); - game.log(cards,'被销毁了'); - } - } - } - }, - jsrgxundao:{ - audio:2, - trigger:{player:'judge'}, - filter:function(event,player){ - return game.hasPlayer(current=>current.countCards('he')); + game.log(cards, "被销毁了"); + }, + }, }, - direct:true, - content:function(){ - 'step 0' - var prompt2=get.translation(player)+'(你)的'+(trigger.judgestr||'')+'判定为'+ - get.translation(player.judging[0])+','+'是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?'; - player.chooseTarget(get.prompt('jsrgxundao'),prompt2,[1,2],(card,player,target)=>{ - return target.countCards('he'); - }).set('ai',target=>{ - var player=_status.event.player; - if(!_status.event.todiscard) return 0; - if(_status.event.todiscard!='all'){ - if(target==_status.event.todiscard) return 100; - } - return get.effect(target,{name:'guohe_copy2'},player,player)/2; - }).set('todiscard',function(){ - if(trigger.judgestr=='闪电'&&get.damageEffect(player,null,player,'thunder')>=0) return 'all'; - var friends=game.filterPlayer(i=>get.attitude(i,player)>0); - for(var friend of friends){ - var cardsx=friend.getCards('he',card=>trigger.judge(card)>0); - cardsx.sort((a,b)=>{ - return get.value(a)-get.value(b); - }); - if(cardsx.length){ - var card=cardsx[0]; - if(trigger.judge(player.judging[0])>=0){ - if(get.value(card)>4) return false; - } - return get.owner(card); + }, + jsrgxundao: { + audio: 2, + trigger: { player: "judge" }, + filter: function (event, player) { + return game.hasPlayer((current) => current.countCards("he")); + }, + direct: true, + content: function () { + "step 0"; + var prompt2 = + get.translation(player) + + "(你)的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(player.judging[0]) + + "," + + "是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?"; + player + .chooseTarget(get.prompt("jsrgxundao"), prompt2, [1, 2], (card, player, target) => { + return target.countCards("he"); + }) + .set("ai", (target) => { + var player = _status.event.player; + if (!_status.event.todiscard) return 0; + if (_status.event.todiscard != "all") { + if (target == _status.event.todiscard) return 100; } - } - return 'all'; - }()) - 'step 1' - if(result.bool){ - var targets=result.targets; + return get.effect(target, { name: "guohe_copy2" }, player, player) / 2; + }) + .set( + "todiscard", + (function () { + if ( + trigger.judgestr == "闪电" && + get.damageEffect(player, null, player, "thunder") >= 0 + ) + return "all"; + var friends = game.filterPlayer((i) => get.attitude(i, player) > 0); + for (var friend of friends) { + var cardsx = friend.getCards("he", (card) => trigger.judge(card) > 0); + cardsx.sort((a, b) => { + return get.value(a) - get.value(b); + }); + if (cardsx.length) { + var card = cardsx[0]; + if (trigger.judge(player.judging[0]) >= 0) { + if (get.value(card) > 4) return false; + } + return get.owner(card); + } + } + return "all"; + })() + ); + ("step 1"); + if (result.bool) { + var targets = result.targets; targets.sortBySeat(_status.currentPhase); - event.targets=targets; - player.logSkill('jsrgxundao',targets); - event.cards=[]; - } - else event.finish(); - 'step 2' - var target=targets.shift(); - target.chooseToDiscard('寻道:请弃置一张牌'+(target==player?'':',可能被作为新判定牌'),'he',true).set('ai',card=>{ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0.1; - if(attitude>0){ - return result+0.01; - } - else{ - return 0.01-result; - } - }); - 'step 3' - if(result.bool){ + event.targets = targets; + player.logSkill("jsrgxundao", targets); + event.cards = []; + } else event.finish(); + ("step 2"); + var target = targets.shift(); + target + .chooseToDiscard( + "寻道:请弃置一张牌" + (target == player ? "" : ",可能被作为新判定牌"), + "he", + true + ) + .set("ai", (card) => { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0.1; + if (attitude > 0) { + return result + 0.01; + } else { + return 0.01 - result; + } + }); + ("step 3"); + if (result.bool) { event.cards.addArray(result.cards); } - if(targets.length) event.goto(2); - 'step 4' - var cards=event.cards.filterInD('d'); - if(cards.length){ - player.chooseButton(['寻道:选择一张作为新判定牌',cards],true).set('ai',button=>{ - return trigger.judge(button.link); - }); - } - else event.finish(); - 'step 5' - if(result.bool){ - var card=result.links[0]; - event.card=card; - game.cardsGotoOrdering(card).relatedEvent=trigger; - } - else event.finish(); - 'step 6' - if(player.judging[0].clone){ - game.broadcastAll(function(card,card2,player){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); - } - var node=player.$throwordered(card2.copy(),true); - node.classList.add('thrownhighlight'); - ui.arena.classList.add('thrownhighlight'); - },player.judging[0],card,player); - game.addVideo('deletenode',player,get.cardsInfo([player.judging[0].clone])); + if (targets.length) event.goto(2); + ("step 4"); + var cards = event.cards.filterInD("d"); + if (cards.length) { + player + .chooseButton(["寻道:选择一张作为新判定牌", cards], true) + .set("ai", (button) => { + return trigger.judge(button.link); + }); + } else event.finish(); + ("step 5"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + game.cardsGotoOrdering(card).relatedEvent = trigger; + } else event.finish(); + ("step 6"); + if (player.judging[0].clone) { + game.broadcastAll( + function (card, card2, player) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + var node = player.$throwordered(card2.copy(), true); + node.classList.add("thrownhighlight"); + ui.arena.classList.add("thrownhighlight"); + }, + player.judging[0], + card, + player + ); + game.addVideo("deletenode", player, get.cardsInfo([player.judging[0].clone])); } game.cardsDiscard(player.judging[0]); - player.judging[0]=card; + player.judging[0] = card; trigger.orderingCards.add(card); - game.log(player,'的判定牌改为',card); + game.log(player, "的判定牌改为", card); game.delay(2); }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, }, - jsrglinghua:{ - audio:2, - trigger:{ - player:['phaseZhunbeiBegin','phaseJieshuBegin'], + jsrglinghua: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], }, - prompt2:function(event,player){ - var zhunbei=event.name=='phaseZhunbei'; - return '进行目标为你'+(zhunbei?'':'且效果反转')+'的【闪电】判定。若你未因此受到伤害,你可以'+(zhunbei?'令一名角色回复1点体力':'对一名角色造成1点雷电伤害'); + prompt2: function (event, player) { + var zhunbei = event.name == "phaseZhunbei"; + return ( + "进行目标为你" + + (zhunbei ? "" : "且效果反转") + + "的【闪电】判定。若你未因此受到伤害,你可以" + + (zhunbei ? "令一名角色回复1点体力" : "对一名角色造成1点雷电伤害") + ); }, - check:function(event,player){ - var e2=player.getEquip(2); - if(e2&&e2.name=='taipingyaoshu') return true; - if(event.name=='phaseZhunbei'&&game.hasPlayer(current=>{ - return get.recoverEffect(current,player,player)>=0; - })) return true; - if(event.name=='phaseJieshu'&&game.hasPlayer(current=>{ - return get.damageEffect(current,player,player,'thunder')>=0; - })&&player.hasSkillTag('rejudge')&&player.hasCard(card=>{ - return lib.card.shandian.judge(card)<0; - },'he')) return true; + check: function (event, player) { + var e2 = player.getEquip(2); + if (e2 && e2.name == "taipingyaoshu") return true; + if ( + event.name == "phaseZhunbei" && + game.hasPlayer((current) => { + return get.recoverEffect(current, player, player) >= 0; + }) + ) + return true; + if ( + event.name == "phaseJieshu" && + game.hasPlayer((current) => { + return get.damageEffect(current, player, player, "thunder") >= 0; + }) && + player.hasSkillTag("rejudge") && + player.hasCard((card) => { + return lib.card.shandian.judge(card) < 0; + }, "he") + ) + return true; return false; }, - content:function(){ - 'step 0' - var next=event.executeDelayCardEffect=player.executeDelayCardEffect('shandian'); - if(event.triggername!='phaseJieshuBegin') return; - next.judge=card=>-lib.card.shandian.judge(card)-4; - next.judge2=result=>!lib.card.shandian.judge2(result); - 'step 1' - var executeDelayCardEffect=event.executeDelayCardEffect; - if(!player.hasHistory('damage',evt=>evt.getParent(2)==executeDelayCardEffect)){ - if(trigger.name=='phaseZhunbei'){ - player.chooseTarget('灵化:是否令一名角色回复1点体力?').set('ai',target=>{ - var player=_status.event.player; - return get.recoverEffect(target,player,player); + content: function () { + "step 0"; + var next = (event.executeDelayCardEffect = player.executeDelayCardEffect("shandian")); + if (event.triggername != "phaseJieshuBegin") return; + next.judge = (card) => -lib.card.shandian.judge(card) - 4; + next.judge2 = (result) => !lib.card.shandian.judge2(result); + ("step 1"); + var executeDelayCardEffect = event.executeDelayCardEffect; + if (!player.hasHistory("damage", (evt) => evt.getParent(2) == executeDelayCardEffect)) { + if (trigger.name == "phaseZhunbei") { + player.chooseTarget("灵化:是否令一名角色回复1点体力?").set("ai", (target) => { + var player = _status.event.player; + return get.recoverEffect(target, player, player); }); + } else { + player + .chooseTarget("灵化:是否对一名角色造成1点雷电伤害?") + .set("ai", (target) => { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder"); + }); } - else{ - player.chooseTarget('灵化:是否对一名角色造成1点雷电伤害?').set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player,'thunder'); - }); - } - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - if(trigger.name=='phaseZhunbei') target.recover(); - else target.damage('thunder'); + if (trigger.name == "phaseZhunbei") target.recover(); + else target.damage("thunder"); } }, - ai:{ - threaten:2.8 - } + ai: { + threaten: 2.8, + }, }, }, - characterReplace:{}, - dynamicTranslate:{ - jsrgshichong:function(player){ - if(player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + characterReplace: {}, + dynamicTranslate: { + jsrgshichong: function (player) { + if (player.storage.jsrgshichong) + return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; }, }, - translate:{ + translate: { //江山如故·起 - jsrg_liuhong:'起刘宏', - jsrg_liuhong_prefix:'起', - jsrgchaozheng:'朝争', - jsrgchaozheng_info:'准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。', - jsrgshenchong:'甚宠', - jsrgshenchong_info:'限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。', - jsrgjulian:'聚敛', - jsrgjulian_info:'主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。', - jsrgfeiyang:'飞扬', - jsrgfeiyang_info:'判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。', - jsrgbahu:'跋扈', - jsrgbahu_info:'锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。', - jsrg_hejin:'起何进', - jsrg_hejin_prefix:'起', - jsrgzhaobing:'诏兵', - jsrgzhaobing_info:'结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。', - jsrgzhuhuan:'诛宦', - jsrgzhuhuan_info:'准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。', - jsrgyanhuo:'延祸', - jsrgyanhuo_info:'锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。', - jsrg_sunjian:'起孙坚', - jsrg_sunjian_prefix:'起', - jsrgpingtao:'平讨', - jsrgpingtao_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。', - jsrgjuelie:'绝烈', - jsrgjuelie_info:'①当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌并弃置其等量的牌。②若你的手牌数或体力值为全场最小,则你使用【杀】造成的伤害+1。', - jsrg_huangfusong:'起皇甫嵩', - jsrg_huangfusong_prefix:'起', - jsrgguanhuo:'观火', - jsrgguanhuo_info:'①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。', - jsrgjuxia:'居下', - jsrgjuxia_info:'每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。', - jsrg_xushao:'起许劭', - jsrg_xushao_prefix:'起', - jsrgyingmen:'盈门', - jsrgyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', - jsrgpingjian:'评鉴', - jsrgpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。', - jsrg_dongbai:'起董白', - jsrg_dongbai_prefix:'起', - jsrgshichong:'恃宠', - jsrgshichong_info:'转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。', - jsrglianzhu:'连诛', - jsrglianzhu_info:'出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。', - jsrg_qiaoxuan:'起桥玄', - jsrg_qiaoxuan_prefix:'起', - jsrgjuezhi:'绝质', - jsrgjuezhi_info:'①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。', - jsrgjizhao:'急召', - jsrgjizhao_info:'准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。', - jsrg_yangbiao:'起杨彪', - jsrg_yangbiao_prefix:'起', - jsrgzhaohan:'昭汉', - jsrgzhaohan_info:'锁定技。准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。', - jsrgrangjie:'让节', - jsrgrangjie_info:'当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。', - jsrgyizheng:'义争', - jsrgyizheng_info:'出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。', - jsrg_kongrong:'起孔融', - jsrg_kongrong_prefix:'起', - jsrglirang:'礼让', - jsrglirang_info:'每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。', - jsrgzhengyi:'争义', - jsrgzhengyi_info:'当你每回合首次受到伤害时,本轮因〖礼让〗得到过牌的其他角色可以将此伤害转移给其。', - jsrg_zhujun:'起朱儁', - jsrg_zhujun_prefix:'起', - jsrgfendi:'分敌', - jsrgfendi_tag:'分敌', - jsrgfendi_info:'每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你于其手牌区或弃牌堆获得这些牌。', - jsrgjuxiang:'拒降', - jsrgjuxiang_info:'当你不于摸牌阶段得到牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。', - jsrg_liubei:'起刘备', - jsrg_liubei_prefix:'起', - jsrgjishan:'积善', - jsrgjishan_info:'①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。', - jsrgzhenqiao:'振鞘', - jsrgzhenqiao_info:'锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。', - jsrg_wangyun:'起王允', - jsrg_wangyun_prefix:'起', - jsrgshelun:'赦论', - jsrgshelun_info:'出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。', - jsrgfayi:'伐异', - jsrgfayi_info:'当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。', - jsrg_liuyan:'起刘焉', - jsrg_liuyan_prefix:'起', - jsrgtushe:'图射', - jsrgtushe_info:'当你使用非装备牌指定目标后,你可以展示所有手牌(无牌则不展示)。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。', - jsrgtongjue:'通绝', - jsrgtongjue_info:'主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。', - jsrg_caocao:'梦曹操', - jsrg_caocao_prefix:'梦', - jsrgzhenglve:'政略', - jsrgzhenglve_info:'①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为至多两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。', - jsrghuilie:'会猎', - jsrghuilie_info:'觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。', - jsrgpingrong:'平戎', - jsrgpingrong_info:'每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。', - jsrg_nanhualaoxian:'起南华老仙', - jsrg_nanhualaoxian_prefix:'起', - jsrgshoushu:'授术', - jsrgshoushu_info:'锁定技。①一轮游戏开始时,若场上没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', - jsrgxundao:'寻道', - jsrgxundao_info:'当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。', - jsrglinghua:'灵化', - jsrglinghua_info:'①准备阶段,你可以执行目标角色为你的【闪电】效果。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以执行目标角色为你且判定效果反转的【闪电】效果。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。', - sbyingmen:'盈门', - sbyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', - sbpingjian:'评鉴', - sbpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。', + jsrg_liuhong: "起刘宏", + jsrg_liuhong_prefix: "起", + jsrgchaozheng: "朝争", + jsrgchaozheng_info: + "准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。", + jsrgshenchong: "甚宠", + jsrgshenchong_info: + "限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。", + jsrgjulian: "聚敛", + jsrgjulian_info: + "主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。", + jsrgfeiyang: "飞扬", + jsrgfeiyang_info: + "判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。", + jsrgbahu: "跋扈", + jsrgbahu_info: "锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。", + jsrg_hejin: "起何进", + jsrg_hejin_prefix: "起", + jsrgzhaobing: "诏兵", + jsrgzhaobing_info: + "结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。", + jsrgzhuhuan: "诛宦", + jsrgzhuhuan_info: + "准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。", + jsrgyanhuo: "延祸", + jsrgyanhuo_info: + "锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。", + jsrg_sunjian: "起孙坚", + jsrg_sunjian_prefix: "起", + jsrgpingtao: "平讨", + jsrgpingtao_info: + "出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。", + jsrgjuelie: "绝烈", + jsrgjuelie_info: + "①当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌并弃置其等量的牌。②若你的手牌数或体力值为全场最小,则你使用【杀】造成的伤害+1。", + jsrg_huangfusong: "起皇甫嵩", + jsrg_huangfusong_prefix: "起", + jsrgguanhuo: "观火", + jsrgguanhuo_info: + "①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。", + jsrgjuxia: "居下", + jsrgjuxia_info: + "每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。", + jsrg_xushao: "起许劭", + jsrg_xushao_prefix: "起", + jsrgyingmen: "盈门", + jsrgyingmen_info: + "锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。", + jsrgpingjian: "评鉴", + jsrgpingjian_info: + "你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。", + jsrg_dongbai: "起董白", + jsrg_dongbai_prefix: "起", + jsrgshichong: "恃宠", + jsrgshichong_info: + "转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。", + jsrglianzhu: "连诛", + jsrglianzhu_info: + "出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。", + jsrg_qiaoxuan: "起桥玄", + jsrg_qiaoxuan_prefix: "起", + jsrgjuezhi: "绝质", + jsrgjuezhi_info: + "①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。", + jsrgjizhao: "急召", + jsrgjizhao_info: + "准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。", + jsrg_yangbiao: "起杨彪", + jsrg_yangbiao_prefix: "起", + jsrgzhaohan: "昭汉", + jsrgzhaohan_info: + "锁定技。准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。", + jsrgrangjie: "让节", + jsrgrangjie_info: + "当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。", + jsrgyizheng: "义争", + jsrgyizheng_info: + "出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。", + jsrg_kongrong: "起孔融", + jsrg_kongrong_prefix: "起", + jsrglirang: "礼让", + jsrglirang_info: + "每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。", + jsrgzhengyi: "争义", + jsrgzhengyi_info: + "当你每回合首次受到伤害时,本轮因〖礼让〗得到过牌的其他角色可以将此伤害转移给其。", + jsrg_zhujun: "起朱儁", + jsrg_zhujun_prefix: "起", + jsrgfendi: "分敌", + jsrgfendi_tag: "分敌", + jsrgfendi_info: + "每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你于其手牌区或弃牌堆获得这些牌。", + jsrgjuxiang: "拒降", + jsrgjuxiang_info: + "当你不于摸牌阶段得到牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。", + jsrg_liubei: "起刘备", + jsrg_liubei_prefix: "起", + jsrgjishan: "积善", + jsrgjishan_info: + "①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。", + jsrgzhenqiao: "振鞘", + jsrgzhenqiao_info: + "锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。", + jsrg_wangyun: "起王允", + jsrg_wangyun_prefix: "起", + jsrgshelun: "赦论", + jsrgshelun_info: + "出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。", + jsrgfayi: "伐异", + jsrgfayi_info: "当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。", + jsrg_liuyan: "起刘焉", + jsrg_liuyan_prefix: "起", + jsrgtushe: "图射", + jsrgtushe_info: + "当你使用非装备牌指定目标后,你可以展示所有手牌(无牌则不展示)。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。", + jsrgtongjue: "通绝", + jsrgtongjue_info: + "主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。", + jsrg_caocao: "梦曹操", + jsrg_caocao_prefix: "梦", + jsrgzhenglve: "政略", + jsrgzhenglve_info: + "①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为至多两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。", + jsrghuilie: "会猎", + jsrghuilie_info: + "觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。", + jsrgpingrong: "平戎", + jsrgpingrong_info: + "每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。", + jsrg_nanhualaoxian: "起南华老仙", + jsrg_nanhualaoxian_prefix: "起", + jsrgshoushu: "授术", + jsrgshoushu_info: + "锁定技。①一轮游戏开始时,若场上没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。", + jsrgxundao: "寻道", + jsrgxundao_info: + "当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。", + jsrglinghua: "灵化", + jsrglinghua_info: + "①准备阶段,你可以执行目标角色为你的【闪电】效果。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以执行目标角色为你且判定效果反转的【闪电】效果。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。", + sbyingmen: "盈门", + sbyingmen_info: + "锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。", + sbpingjian: "评鉴", + sbpingjian_info: + "你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。", //江山如故·承 - jsrg_sunce:'梦孙策', - jsrg_sunce_prefix:'梦', - jsrgduxing:'独行', - jsrgduxing_info:'出牌阶段限一次。你可以视为使用一张可以指定任意名目标角色的【决斗】,且所有目标角色的手牌均视为【杀】直到此牌结算结束。', - jsrgzhiheng:'猘横', - jsrgzhiheng_info:'锁定技。当你因执行牌的效果对目标角色造成伤害时,若其于此回合响应过你使用过的牌,此伤害+1。', - jsrgzhasi:'诈死', - jsrgzhasi_info:'限定技。当你受到伤害值不小于你的体力值的伤害时,你可以防止此伤害,然后失去〖猘横〗并获得〖制衡〗。然后你不计入距离和座次计算直到你对其他角色使用牌后或当你受到伤害后。', - jsrgbashi:'霸世', - jsrgbashi_info:'主公技。当你需要打出【杀】或【闪】时,你可以令其他吴势力角色选择是否打出一张【杀】或【闪】。若有角色响应,则视为你打出了一张【杀】或【闪】。', - jsrg_xuyou:'承许攸', - jsrg_xuyou_prefix:'承', - jsrglipan:'离叛', - jsrglipan_info:'回合结束时,你可以变更势力,然后摸X张牌并执行一个额外的出牌阶段。此阶段结束时,所有与你势力相同的角色依次可以将一张牌当【决斗】对你使用(X为与你势力相同的其他角色数)。', - jsrgqingxi:'轻袭', - jsrgqingxi_info:'群势力技。出牌阶段每名角色限一次。你可以选择一名手牌数小于你的角色,你将手牌数弃置至与其相同,然后视为对其使用一张刺【杀】。', - jsrgjinmie:'烬灭', - jsrgjinmie_info:'魏势力技。出牌阶段限一次。你可以选择一名手牌数大于你的角色,你视为对其使用一张火【杀】。当此牌造成伤害后,你将其手牌数弃置至与你相同。', - jsrg_lvbu:'承吕布', - jsrg_lvbu_prefix:'承', - jsrgwuchang:'无常', - jsrgwuchang_info:'锁定技。①当你获得其他角色的牌后,你变更势力为与其相同。②当你使用【杀】或【决斗】对与你势力相同的目标角色造成伤害时,此伤害+1,然后变更势力为群。', - jsrgqingjiao:'轻狡', - jsrgqingjiao_info:'群势力技。出牌阶段各限一次。你可以将一张牌当【推心置腹】/【趁火打劫】对一名手牌数大于/小于你的角色使用。', - jsrgchengxu:'乘虚', - jsrgchengxu_info:'蜀势力技。与你势力相同的其他角色不能响应你使用的牌。', - jsrg_zhanghe:'承张郃', - jsrg_zhanghe_prefix:'承', - jsrgqiongtu:'穷途', - jsrgqiongtu_info:'群势力技。每回合限一次。你可以将一张非基本牌置于武将牌上视为使用一张【无懈可击】。若此牌生效,你摸一张牌,否则你变更势力为魏并获得所有“穷途”牌。', - jsrgxianzhu:'先著', - jsrgxianzhu_info:'魏势力技。你可以将一张普通锦囊牌当无次数限制的【杀】使用。当此牌对唯一目标造成伤害后,你视为对该角色使用一张此普通锦囊牌。', - jsrg_zoushi:'承邹氏', - jsrg_zoushi_prefix:'承', - jsrgguyin:'孤吟', - jsrgguyin_info:'准备阶段,你可以翻面,且令所有其他男性角色依次选择是否翻面。然后你和所有背面朝上的角色轮流各摸一张牌,直到你们累计以此法得到X张牌(X为场上存活角色与死亡角色中男性角色数)。', - jsrgzhangdeng:'帐灯', - jsrgzhangdeng_info:'①当一名武将牌背面朝上的角色需要使用【酒】时,若你的武将牌背面朝上,其可以视为使用之。②当一名角色于一回合第二次发动〖帐灯①〗时,你将武将牌翻面至正面朝上。', - jsrg_guanyu:'承关羽', - jsrg_guanyu_prefix:'承', - jsrgguanjue:'冠绝', - jsrgguanjue_info:'锁定技。当你使用或打出有花色的牌时,你令所有其他角色于此回合内不能使用或打出该花色的牌。', - jsrgnianen:'念恩', - jsrgnianen_info:'你可以将一张牌当任意基本牌使用或打出,然后若此牌不为红色或你以此法使用或打出的牌不为普通【杀】,则直到此回合结束,该技能失效且你视为拥有〖马术〗。', - jsrg_chendeng:'承陈登', - jsrg_chendeng_prefix:'承', - jsrglunshi:'论势', - jsrglunshi_info:'出牌阶段限一次。你可以令一名角色摸等同于其攻击范围内角色数的牌(至多摸至五张),然后其弃置等同于攻击范围内含有其的角色数的牌。', - jsrgguitu:'诡图', - jsrgguitu_info:'准备阶段,你可以交换场上的两张武器牌,然后攻击范围以此法减少的角色回复1点体力。', - jsrg_zhenji:'承甄宓', - jsrg_zhenji_prefix:'承', - jsrgjixiang:'济乡', - jsrgjixiang_info:'回合内每种牌名限一次。当一名其他角色需要使用或打出一张基本牌时,你可以弃置一张牌令其视为使用或打出之,然后你摸一张牌并令〖称贤〗于此阶段可发动次数上限+1。', - jsrgchengxian:'称贤', - jsrgchengxian_info:'出牌阶段限两次。你可以将一张手牌当一张本回合未以此法使用过的普通锦囊牌使用(此转化牌须与以此法转化的手牌的合法目标数相同)。', - jsrg_zhangliao:'承张辽', - jsrg_zhangliao_prefix:'承', - jsrgzhengbing:'整兵', - jsrgzhengbing_info:'群势力技。出牌阶段限三次。你可以重铸一张牌,若此牌为:【杀】,你本回合手牌上限+2;【闪】,你摸一张牌;【桃】,你变更势力为魏。', - jsrgtuwei:'突围', - jsrgtuwei_info:'魏势力技。出牌阶段开始时,你可以获得攻击范围内任意名角色各一张牌。然后此回合结束时,这些角色中未于本回合受到过伤害的角色依次获得你的一张牌。', - jsrg_xugong:'承许贡', - jsrg_xugong_prefix:'承', - jsrgbiaozhao:'表召', - jsrgbiaozhao_info:'准备阶段,你可以选择两名其他角色A和B。直到你的下回合开始时或你死亡后,A对B使用牌无次数和距离限制,且B对你使用的牌造成的伤害+1。', - jsrgyechou:'业仇', - jsrgyechou_info:'当你死亡时,你可以令一名其他角色获得如下效果:当其受到伤害值不小于其体力值的伤害时,其令此伤害翻倍。', - jsrg_chunyuqiong:'承淳于琼', - jsrg_chunyuqiong_prefix:'承', - jsrgcangchu:'仓储', - jsrgcangchu_info:'一名角色的结束阶段,你可以令至多X名角色各摸一张牌,若X大于存活角色数,则改为各摸两张牌(X为你于此回合得到的牌数)。', - jsrgshishou:'失守', - jsrgshishou_info:'锁定技。①当你使用【酒】时,你摸三张牌,然后你本回合不能再使用牌。②当你受到火焰伤害后,你令〖仓储〗失效直到你的下回合结束后。', + jsrg_sunce: "梦孙策", + jsrg_sunce_prefix: "梦", + jsrgduxing: "独行", + jsrgduxing_info: + "出牌阶段限一次。你可以视为使用一张可以指定任意名目标角色的【决斗】,且所有目标角色的手牌均视为【杀】直到此牌结算结束。", + jsrgzhiheng: "猘横", + jsrgzhiheng_info: + "锁定技。当你因执行牌的效果对目标角色造成伤害时,若其于此回合响应过你使用过的牌,此伤害+1。", + jsrgzhasi: "诈死", + jsrgzhasi_info: + "限定技。当你受到伤害值不小于你的体力值的伤害时,你可以防止此伤害,然后失去〖猘横〗并获得〖制衡〗。然后你不计入距离和座次计算直到你对其他角色使用牌后或当你受到伤害后。", + jsrgbashi: "霸世", + jsrgbashi_info: + "主公技。当你需要打出【杀】或【闪】时,你可以令其他吴势力角色选择是否打出一张【杀】或【闪】。若有角色响应,则视为你打出了一张【杀】或【闪】。", + jsrg_xuyou: "承许攸", + jsrg_xuyou_prefix: "承", + jsrglipan: "离叛", + jsrglipan_info: + "回合结束时,你可以变更势力,然后摸X张牌并执行一个额外的出牌阶段。此阶段结束时,所有与你势力相同的角色依次可以将一张牌当【决斗】对你使用(X为与你势力相同的其他角色数)。", + jsrgqingxi: "轻袭", + jsrgqingxi_info: + "群势力技。出牌阶段每名角色限一次。你可以选择一名手牌数小于你的角色,你将手牌数弃置至与其相同,然后视为对其使用一张刺【杀】。", + jsrgjinmie: "烬灭", + jsrgjinmie_info: + "魏势力技。出牌阶段限一次。你可以选择一名手牌数大于你的角色,你视为对其使用一张火【杀】。当此牌造成伤害后,你将其手牌数弃置至与你相同。", + jsrg_lvbu: "承吕布", + jsrg_lvbu_prefix: "承", + jsrgwuchang: "无常", + jsrgwuchang_info: + "锁定技。①当你获得其他角色的牌后,你变更势力为与其相同。②当你使用【杀】或【决斗】对与你势力相同的目标角色造成伤害时,此伤害+1,然后变更势力为群。", + jsrgqingjiao: "轻狡", + jsrgqingjiao_info: + "群势力技。出牌阶段各限一次。你可以将一张牌当【推心置腹】/【趁火打劫】对一名手牌数大于/小于你的角色使用。", + jsrgchengxu: "乘虚", + jsrgchengxu_info: "蜀势力技。与你势力相同的其他角色不能响应你使用的牌。", + jsrg_zhanghe: "承张郃", + jsrg_zhanghe_prefix: "承", + jsrgqiongtu: "穷途", + jsrgqiongtu_info: + "群势力技。每回合限一次。你可以将一张非基本牌置于武将牌上视为使用一张【无懈可击】。若此牌生效,你摸一张牌,否则你变更势力为魏并获得所有“穷途”牌。", + jsrgxianzhu: "先著", + jsrgxianzhu_info: + "魏势力技。你可以将一张普通锦囊牌当无次数限制的【杀】使用。当此牌对唯一目标造成伤害后,你视为对该角色使用一张此普通锦囊牌。", + jsrg_zoushi: "承邹氏", + jsrg_zoushi_prefix: "承", + jsrgguyin: "孤吟", + jsrgguyin_info: + "准备阶段,你可以翻面,且令所有其他男性角色依次选择是否翻面。然后你和所有背面朝上的角色轮流各摸一张牌,直到你们累计以此法得到X张牌(X为场上存活角色与死亡角色中男性角色数)。", + jsrgzhangdeng: "帐灯", + jsrgzhangdeng_info: + "①当一名武将牌背面朝上的角色需要使用【酒】时,若你的武将牌背面朝上,其可以视为使用之。②当一名角色于一回合第二次发动〖帐灯①〗时,你将武将牌翻面至正面朝上。", + jsrg_guanyu: "承关羽", + jsrg_guanyu_prefix: "承", + jsrgguanjue: "冠绝", + jsrgguanjue_info: + "锁定技。当你使用或打出有花色的牌时,你令所有其他角色于此回合内不能使用或打出该花色的牌。", + jsrgnianen: "念恩", + jsrgnianen_info: + "你可以将一张牌当任意基本牌使用或打出,然后若此牌不为红色或你以此法使用或打出的牌不为普通【杀】,则直到此回合结束,该技能失效且你视为拥有〖马术〗。", + jsrg_chendeng: "承陈登", + jsrg_chendeng_prefix: "承", + jsrglunshi: "论势", + jsrglunshi_info: + "出牌阶段限一次。你可以令一名角色摸等同于其攻击范围内角色数的牌(至多摸至五张),然后其弃置等同于攻击范围内含有其的角色数的牌。", + jsrgguitu: "诡图", + jsrgguitu_info: "准备阶段,你可以交换场上的两张武器牌,然后攻击范围以此法减少的角色回复1点体力。", + jsrg_zhenji: "承甄宓", + jsrg_zhenji_prefix: "承", + jsrgjixiang: "济乡", + jsrgjixiang_info: + "回合内每种牌名限一次。当一名其他角色需要使用或打出一张基本牌时,你可以弃置一张牌令其视为使用或打出之,然后你摸一张牌并令〖称贤〗于此阶段可发动次数上限+1。", + jsrgchengxian: "称贤", + jsrgchengxian_info: + "出牌阶段限两次。你可以将一张手牌当一张本回合未以此法使用过的普通锦囊牌使用(此转化牌须与以此法转化的手牌的合法目标数相同)。", + jsrg_zhangliao: "承张辽", + jsrg_zhangliao_prefix: "承", + jsrgzhengbing: "整兵", + jsrgzhengbing_info: + "群势力技。出牌阶段限三次。你可以重铸一张牌,若此牌为:【杀】,你本回合手牌上限+2;【闪】,你摸一张牌;【桃】,你变更势力为魏。", + jsrgtuwei: "突围", + jsrgtuwei_info: + "魏势力技。出牌阶段开始时,你可以获得攻击范围内任意名角色各一张牌。然后此回合结束时,这些角色中未于本回合受到过伤害的角色依次获得你的一张牌。", + jsrg_xugong: "承许贡", + jsrg_xugong_prefix: "承", + jsrgbiaozhao: "表召", + jsrgbiaozhao_info: + "准备阶段,你可以选择两名其他角色A和B。直到你的下回合开始时或你死亡后,A对B使用牌无次数和距离限制,且B对你使用的牌造成的伤害+1。", + jsrgyechou: "业仇", + jsrgyechou_info: + "当你死亡时,你可以令一名其他角色获得如下效果:当其受到伤害值不小于其体力值的伤害时,其令此伤害翻倍。", + jsrg_chunyuqiong: "承淳于琼", + jsrg_chunyuqiong_prefix: "承", + jsrgcangchu: "仓储", + jsrgcangchu_info: + "一名角色的结束阶段,你可以令至多X名角色各摸一张牌,若X大于存活角色数,则改为各摸两张牌(X为你于此回合得到的牌数)。", + jsrgshishou: "失守", + jsrgshishou_info: + "锁定技。①当你使用【酒】时,你摸三张牌,然后你本回合不能再使用牌。②当你受到火焰伤害后,你令〖仓储〗失效直到你的下回合结束后。", //江山如故·转 - ying:'影', - ying_info:'当此牌进入弃牌堆后,系统将此牌移出游戏。', - jsrg_guojia:'梦郭嘉', - jsrg_guojia_prefix:'梦', - jsrgqingzi:'轻辎', - jsrgqingzi_info:'准备阶段,你可以弃置任意名其他角色装备区里的各一张牌,然后令这些角色获得〖神速〗直到你的下回合开始。', - jsrgdingce:'定策', - jsrgdingce_info:'当你受到伤害后,你可以依次弃置你与伤害来源的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。', - jsrgzhenfeng:'针锋', - jsrgzhenfeng_info:'出牌阶段每种类别各限一次。你可以视为使用一张存活角色的技能描述中包含的基本牌或普通锦囊牌(无距离和次数限制)。当此牌对技能描述中包含此牌的角色生效时,你对其造成1点伤害。', - jsrg_zhangfei:'转张飞', - jsrg_zhangfei_prefix:'转', - jsrgbaohe:'暴喝', - jsrgbaohe_info:'一名角色的出牌阶段结束时,你可以弃置两张牌,然后视为你对攻击范围内包含其的所有角色使用一张【杀】。当一名角色使用牌响应此【杀】后,此【杀】对后续目标角色造成的伤害+1。', - jsrgxushi:'虚势', - jsrgxushi_info:'出牌阶段限一次。你可以交给任意名角色各一张牌,然后你获得两倍数量的【影】。', - jsrg_machao:'转马超', - jsrg_machao_prefix:'转', - jsrgzhuiming:'追命', - jsrgzhuiming_info:'当你使用【杀】指定唯一目标后,你可以声明一种颜色并令目标角色弃置任意张牌,然后你展示目标角色一张牌。若此牌颜色与你声明的颜色相同,则此【杀】不计入次数限制、不可被响应且伤害+1。', - jsrg_lougui:'转娄圭', - jsrg_lougui_prefix:'转', - jsrgshacheng:'沙城', - jsrgshacheng_info:'①游戏开始时,你将牌堆顶的两张牌置于武将牌上,称为“城”。②当一名角色使用【杀】结算结束后,你可以移去一张“城”,令此牌的其中一名目标角色摸X张牌(X为该角色本回合失去过的牌数且至多为5)。', - jsrgninghan:'凝寒', - jsrgninghan_info:'锁定技。①所有角色手牌中的♣【杀】均视为冰【杀】。②当一名角色受到冰冻伤害后,你将造成此伤害的牌对应的实体牌置入“城”。', - jsrg_zhangren:'转张任', - jsrg_zhangren_prefix:'转', - jsrgfuni:'伏匿', - jsrgfuni_info:'锁定技。①你的攻击范围终值为0。②一轮游戏开始时,你令任意名角色获得共计X张【影】(X为存活角色数的一半,向上取整)。③当有牌进入弃牌堆后,若其中有【影】,你于本回合使用牌无距离限制且不能被响应。', - jsrgchuanxin:'穿心', - jsrgchuanxin_info:'一名角色的结束阶段,你可以将一张牌当【杀】使用。当一名角色受到渠道为此【杀】的伤害时,此伤害+Y(Y为其本回合回复过的体力值)。', - jsrg_huangzhong:'转黄忠', - jsrg_huangzhong_prefix:'转', - jsrgcuifeng:'摧锋', - jsrgcuifeng_info:'限定技。出牌阶段,你可以视为使用一张单目标的伤害类牌(无距离限制)。此回合结束时,若此牌未造成伤害或造成的伤害值大于1,你重置〖摧锋〗。', - jsrgdengnan:'登难', - jsrgdengnan_info:'限定技。出牌阶段,你可以视为使用一张非伤害类普通锦囊牌。此回合结束时,若此牌的目标均于此回合受到过伤害,你重置〖登难〗。', - jsrg_xiahourong:'转夏侯荣', - jsrg_xiahourong_prefix:'转', - jsrgfenjian:'奋剑', - jsrgfenjian_info:'每回合各限一次。当你需要对其他角色使用【决斗】或【桃】时,你可以令你本回合受到的伤害+1,视为使用之。', - jsrg_sunshangxiang:'转孙尚香', - jsrg_sunshangxiang_prefix:'转', - jsrgguiji:'闺忌', - jsrgguiji_info:'每回合限一次。出牌阶段,你可以与一名手牌数小于你的男性角色交换手牌。然后其下个出牌阶段结束时,你可以与其交换手牌。', - jsrgjiaohao:'骄豪', - jsrgjiaohao_info:'①其他角色的出牌阶段限一次。其可以将手牌中的一张装备牌置于你的装备区。②准备阶段,你获得X张【影】(X为你空置装备栏数的一半,向上取整)。', - jsrg_pangtong:'转庞统', - jsrg_pangtong_prefix:'转', - jsrgmanjuan:'漫卷', - jsrgmanjuan_info:'若你没有手牌,你可以如手牌般使用或打出于本回合进入弃牌堆的牌(每种点数每回合限一次)。', - jsrgyangming:'养名', - jsrgyangming_info:'出牌阶段限一次。你可以与一名角色拼点,若其:没赢,你可以与其重复此流程;赢,其摸X张牌,然后你回复1点体力(X为其此阶段没赢的次数)。', - jsrg_hansui:'转韩遂', - jsrg_hansui_prefix:'转', - jsrgniluan:'逆乱', - jsrgniluan_info:'准备阶段,你可以选择一项:1.弃置一张牌,对一名未对你造成过伤害的角色造成1点伤害;2.令一名对你造成过伤害的角色摸两张牌。', - jsrghuchou:'互雠', - jsrghuchou_info:'锁定技。当你对最后对你使用伤害类牌的角色造成伤害时,此伤害+1。', - jsrgjiemeng:'皆盟', - jsrgjiemeng_info:'主公技,锁定技。所有群势力角色至其他角色的距离-X(X为群势力角色数)。', - jsrg_zhangchu:'转张楚', - jsrg_zhangchu_prefix:'转', - jsrghuozhong:'惑众', - jsrghuozhong_info:'所有角色出牌阶段限一次。其可以将一张黑色非锦囊牌当【兵粮寸断】置于其判定区,然后令你摸两张牌。', - jsrgrihui:'日彗', - jsrgrihui_info:'①当你使用【杀】对目标角色造成伤害后,你可以令判定区有牌的其他角色各摸一张牌。②你于一回合内对判定区没有牌的角色使用的第一张【杀】无任何次数限制。', - jsrg_xiahouen:'转夏侯恩', - jsrg_xiahouen_prefix:'转', - jsrghujian:'护剑', - jsrghujian_info:'①游戏开始时,你从游戏外获得一张【赤血青锋】。②一名角色的回合结束时,此回合最后一名使用或打出牌的角色可以获得弃牌堆中的【赤血青锋】。', - jsrgshili:'恃力', - jsrgshili_info:'出牌阶段限一次。你可以将一张手牌中的装备牌当【决斗】使用。', - jsrg_fanjiangzhangda:'转范强张达', - jsrg_fanjiangzhangda_ab:'转范疆张达', - jsrg_fanjiangzhangda_prefix:'转', - jsrgfushan:'负山', - jsrgfushan_info:'出牌阶段开始时,所有其他角色可以依次交给你一张牌并令你此阶段使用【杀】的次数上限+1。此阶段结束时,若你使用【杀】的次数未达到上限且此阶段以此法交给你牌的角色均存活,你失去2点体力,否则你将手牌摸至体力上限。', + ying: "影", + ying_info: "当此牌进入弃牌堆后,系统将此牌移出游戏。", + jsrg_guojia: "梦郭嘉", + jsrg_guojia_prefix: "梦", + jsrgqingzi: "轻辎", + jsrgqingzi_info: + "准备阶段,你可以弃置任意名其他角色装备区里的各一张牌,然后令这些角色获得〖神速〗直到你的下回合开始。", + jsrgdingce: "定策", + jsrgdingce_info: + "当你受到伤害后,你可以依次弃置你与伤害来源的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。", + jsrgzhenfeng: "针锋", + jsrgzhenfeng_info: + "出牌阶段每种类别各限一次。你可以视为使用一张存活角色的技能描述中包含的基本牌或普通锦囊牌(无距离和次数限制)。当此牌对技能描述中包含此牌的角色生效时,你对其造成1点伤害。", + jsrg_zhangfei: "转张飞", + jsrg_zhangfei_prefix: "转", + jsrgbaohe: "暴喝", + jsrgbaohe_info: + "一名角色的出牌阶段结束时,你可以弃置两张牌,然后视为你对攻击范围内包含其的所有角色使用一张【杀】。当一名角色使用牌响应此【杀】后,此【杀】对后续目标角色造成的伤害+1。", + jsrgxushi: "虚势", + jsrgxushi_info: "出牌阶段限一次。你可以交给任意名角色各一张牌,然后你获得两倍数量的【影】。", + jsrg_machao: "转马超", + jsrg_machao_prefix: "转", + jsrgzhuiming: "追命", + jsrgzhuiming_info: + "当你使用【杀】指定唯一目标后,你可以声明一种颜色并令目标角色弃置任意张牌,然后你展示目标角色一张牌。若此牌颜色与你声明的颜色相同,则此【杀】不计入次数限制、不可被响应且伤害+1。", + jsrg_lougui: "转娄圭", + jsrg_lougui_prefix: "转", + jsrgshacheng: "沙城", + jsrgshacheng_info: + "①游戏开始时,你将牌堆顶的两张牌置于武将牌上,称为“城”。②当一名角色使用【杀】结算结束后,你可以移去一张“城”,令此牌的其中一名目标角色摸X张牌(X为该角色本回合失去过的牌数且至多为5)。", + jsrgninghan: "凝寒", + jsrgninghan_info: + "锁定技。①所有角色手牌中的♣【杀】均视为冰【杀】。②当一名角色受到冰冻伤害后,你将造成此伤害的牌对应的实体牌置入“城”。", + jsrg_zhangren: "转张任", + jsrg_zhangren_prefix: "转", + jsrgfuni: "伏匿", + jsrgfuni_info: + "锁定技。①你的攻击范围终值为0。②一轮游戏开始时,你令任意名角色获得共计X张【影】(X为存活角色数的一半,向上取整)。③当有牌进入弃牌堆后,若其中有【影】,你于本回合使用牌无距离限制且不能被响应。", + jsrgchuanxin: "穿心", + jsrgchuanxin_info: + "一名角色的结束阶段,你可以将一张牌当【杀】使用。当一名角色受到渠道为此【杀】的伤害时,此伤害+Y(Y为其本回合回复过的体力值)。", + jsrg_huangzhong: "转黄忠", + jsrg_huangzhong_prefix: "转", + jsrgcuifeng: "摧锋", + jsrgcuifeng_info: + "限定技。出牌阶段,你可以视为使用一张单目标的伤害类牌(无距离限制)。此回合结束时,若此牌未造成伤害或造成的伤害值大于1,你重置〖摧锋〗。", + jsrgdengnan: "登难", + jsrgdengnan_info: + "限定技。出牌阶段,你可以视为使用一张非伤害类普通锦囊牌。此回合结束时,若此牌的目标均于此回合受到过伤害,你重置〖登难〗。", + jsrg_xiahourong: "转夏侯荣", + jsrg_xiahourong_prefix: "转", + jsrgfenjian: "奋剑", + jsrgfenjian_info: + "每回合各限一次。当你需要对其他角色使用【决斗】或【桃】时,你可以令你本回合受到的伤害+1,视为使用之。", + jsrg_sunshangxiang: "转孙尚香", + jsrg_sunshangxiang_prefix: "转", + jsrgguiji: "闺忌", + jsrgguiji_info: + "每回合限一次。出牌阶段,你可以与一名手牌数小于你的男性角色交换手牌。然后其下个出牌阶段结束时,你可以与其交换手牌。", + jsrgjiaohao: "骄豪", + jsrgjiaohao_info: + "①其他角色的出牌阶段限一次。其可以将手牌中的一张装备牌置于你的装备区。②准备阶段,你获得X张【影】(X为你空置装备栏数的一半,向上取整)。", + jsrg_pangtong: "转庞统", + jsrg_pangtong_prefix: "转", + jsrgmanjuan: "漫卷", + jsrgmanjuan_info: + "若你没有手牌,你可以如手牌般使用或打出于本回合进入弃牌堆的牌(每种点数每回合限一次)。", + jsrgyangming: "养名", + jsrgyangming_info: + "出牌阶段限一次。你可以与一名角色拼点,若其:没赢,你可以与其重复此流程;赢,其摸X张牌,然后你回复1点体力(X为其此阶段没赢的次数)。", + jsrg_hansui: "转韩遂", + jsrg_hansui_prefix: "转", + jsrgniluan: "逆乱", + jsrgniluan_info: + "准备阶段,你可以选择一项:1.弃置一张牌,对一名未对你造成过伤害的角色造成1点伤害;2.令一名对你造成过伤害的角色摸两张牌。", + jsrghuchou: "互雠", + jsrghuchou_info: "锁定技。当你对最后对你使用伤害类牌的角色造成伤害时,此伤害+1。", + jsrgjiemeng: "皆盟", + jsrgjiemeng_info: "主公技,锁定技。所有群势力角色至其他角色的距离-X(X为群势力角色数)。", + jsrg_zhangchu: "转张楚", + jsrg_zhangchu_prefix: "转", + jsrghuozhong: "惑众", + jsrghuozhong_info: + "所有角色出牌阶段限一次。其可以将一张黑色非锦囊牌当【兵粮寸断】置于其判定区,然后令你摸两张牌。", + jsrgrihui: "日彗", + jsrgrihui_info: + "①当你使用【杀】对目标角色造成伤害后,你可以令判定区有牌的其他角色各摸一张牌。②你于一回合内对判定区没有牌的角色使用的第一张【杀】无任何次数限制。", + jsrg_xiahouen: "转夏侯恩", + jsrg_xiahouen_prefix: "转", + jsrghujian: "护剑", + jsrghujian_info: + "①游戏开始时,你从游戏外获得一张【赤血青锋】。②一名角色的回合结束时,此回合最后一名使用或打出牌的角色可以获得弃牌堆中的【赤血青锋】。", + jsrgshili: "恃力", + jsrgshili_info: "出牌阶段限一次。你可以将一张手牌中的装备牌当【决斗】使用。", + jsrg_fanjiangzhangda: "转范强张达", + jsrg_fanjiangzhangda_ab: "转范疆张达", + jsrg_fanjiangzhangda_prefix: "转", + jsrgfushan: "负山", + jsrgfushan_info: + "出牌阶段开始时,所有其他角色可以依次交给你一张牌并令你此阶段使用【杀】的次数上限+1。此阶段结束时,若你使用【杀】的次数未达到上限且此阶段以此法交给你牌的角色均存活,你失去2点体力,否则你将手牌摸至体力上限。", //江山如故·合 - jsrg_zhugeliang:'梦诸葛亮', - jsrg_zhugeliang_prefix:'梦', - jsrgwentian:'问天', - jsrgwentian_info:'①你可以将牌堆顶的牌当【无懈可击】/【火攻】使用,若此牌不为黑色/红色,〖问天〗于本轮失效。②每回合限一次。你的一个阶段开始时,你可以观看牌堆顶的五张牌,然后将其中一张牌交给一名其他角色,将其余牌以任意顺序置于牌堆顶或牌堆底。', - jsrgchushi:'出师', - jsrgchushi_info:'出牌阶段限一次。若你不为主公,你可以与主公议事。若结果为:红色,你与其各摸一张牌,若你与其手牌数之和小于7,重复此流程;黑色,当你于本轮内造成属性伤害时,此伤害+1。', - jsrgyinlve:'隐略', - jsrgyinlve_info:'每轮各限一次。当一名角色受到火焰/雷电伤害时,你可以防止此伤害,然后于当前回合结束后执行一个只有摸牌/弃牌阶段的回合。', - jsrg_jiangwei:'合姜维', - jsrg_jiangwei_prefix:'合', - jsrgjinfa:'矜伐', - jsrgjinfa_info:'出牌阶段限一次。你可以展示一张手牌,然后令所有体力上限不大于你的角色议事。若结果与此牌颜色:相同,你令其中至多两名角色将手牌摸至体力上限;不同,你获得两张【影】。然后若没有其他角色与你意见相同,你可以变更势力。', - jsrgfumou:'复谋', - jsrgfumou_info:'魏势力技。当你议事结算结束后,与你意见不同的角色本回合不能使用或打出与其意见颜色相同的牌,你可以将一张【影】当【出其不意】对一名与你意见不同的角色使用。', - jsrgxuanfeng:'选锋', - jsrgxuanfeng_info:'蜀势力技。你可以将一张【影】当无距离和次数限制的刺【杀】使用。', - jsrg_luxun:'合陆逊', - jsrg_luxun_prefix:'合', - jsrgyoujin:'诱进', - jsrgyoujin_info:'出牌阶段开始时,你可以与一名角色拼点,你与其本回合不能使用或打出点数小于自己拼点牌的手牌,且赢的角色视为对没赢的角色使用一张【杀】。', - jsrgdailao:'待劳', - jsrgdailao_info:'出牌阶段,若你没有可以使用的手牌,你可以展示所有手牌并摸两张牌,然后结束此回合。', - jsrgzhubei:'逐北', - jsrgzhubei_info:'锁定技。①当你对本回合受到过伤害的角色造成伤害时,此伤害+1。②你对本回合失去过最后手牌的角色使用牌无次数限制。', - jsrg_zhaoyun:'合赵云', - jsrg_zhaoyun_prefix:'合', - jsrglonglin:'龙临', - jsrglonglin_info:'其他角色于其出牌阶段内首次使用【杀】指定第一个目标后,你可以弃置一张牌令此【杀】无效,然后其可以视为对你使用一张【决斗】,你以此法造成伤害后,其本阶段不能再使用手牌。', - jsrgzhendan:'镇胆', - jsrgzhendan_info:'①你可以将一张非基本手牌当任意基本牌使用或打出。②当你受到伤害后,你摸X张牌并令该技能本轮失效(X为本轮所有角色执行过的回合数且至多为5)。③一轮游戏开始时,若上一轮该技能未因〖镇胆②〗失效过,你摸Y张牌(Y为上一轮所有角色执行过的回合数且至多为5)。', - jsrg_simayi:'合司马懿', - jsrg_simayi_prefix:'合', - jsrgyingshi:'鹰眎', - jsrgyingshi_info:'当你翻面时,你可以观看牌堆底的三张牌(若死亡角色数大于2则改为五张),然后将其中任意数量的牌以任意顺序置于牌堆顶,其余以任意顺序置于牌堆底。', - jsrgtuigu:'蜕骨', - jsrgtuigu_info:'①回合开始时,你可以翻面并令你本回合的手牌上限+X,然后摸X张牌并视为使用一张【解甲归田】(X为存活角色数的一半,向下取整),目标角色不能使用以此法得到的牌直到其回合结束。②一轮游戏开始时,若你上一轮未执行过回合(因〖蜕骨②〗执行的回合除外),你获得一个额外的回合。③当你失去装备牌里的牌后,你回复1点体力。', - jsrg_guoxun:'合郭循', - jsrg_guoxun_prefix:'合', - jsrgeqian:'遏前', - jsrgeqian_info:'①结束阶段,你可以蓄谋任意次。②当你使用【杀】或蓄谋牌指定其他角色为唯一目标后,你可以令此牌不计入次数限制并获得目标一张牌,然后其可以令你本回合至其的距离+2。', - jsrgfusha:'伏杀', - jsrgfusha_info:'限定技。出牌阶段,若你的攻击范围内仅有一名角色,你可以对其造成X点伤害(X为你的攻击范围,至多为游戏人数)。', - jsrg_sunlubansunluyu:'合大小虎', - jsrg_sunlubansunluyu_prefix:'合', - jsrgdaimou:'殆谋', - jsrgdaimou_info:'每回合各限一次。当一名角色使用【杀】指定其他角色/你为目标时,你可以用牌堆顶的牌蓄谋/你须弃置你区域里的一张蓄谋牌。', - jsrgfangjie:'芳洁', - jsrgfangjie_info:'准备阶段,若你没有蓄谋牌,你回复1点体力并摸一张牌,否则你可以弃置你区域里的任意张蓄谋牌并失去〖芳洁〗。', - jsrg_caofang:'合曹芳', - jsrg_caofang_prefix:'合', - jsrgzhaotu:'诏图', - jsrgzhaotu_info:'每轮限一次。你可以将一张红色非锦囊牌当【乐不思蜀】使用,然后当前回合结束后,目标执行一个手牌上限-2的额外回合。', - jsrgjingju:'惊惧', - jsrgjingju_info:'当你需要使用任意一种基本牌时,你可以将其他角色判定区里的一张牌移动至你的判定区,视为你使用之。', - jsrgweizhui:'危坠', - jsrgweizhui_info:'主公技。其他魏势力角色的结束阶段,其可以将一张黑色手牌当【过河拆桥】对你使用。', - jsrg_sunjun:'合孙峻', - jsrg_sunjun_prefix:'合', - jsrgyaoyan:'邀宴', - jsrgyaoyan_info:'准备阶段,你可以令所有角色依次选择是否于回合结束时议事,若议事结果为:红色,你获得任意名未议事的角色各一张手牌;黑色,你可以对一名议事的角色造成2点伤害。', - jsrgbazheng:'霸政', - jsrgbazheng_info:'当你参与的议事展示意见时,本回合受到过你伤害的角色意见视为与你相同。', - jsrg_liuyong:'合刘永', - jsrg_liuyong_prefix:'合', - jsrgdanxin:'丹心', - jsrgdanxin_info:'你可以将一张牌当【推心置腹】使用,你展示以此法交出与得到的牌,以此法得到♥牌的角色回复1点体力,然后你至目标角色的距离+1直到回合结束。', - jsrgfengxiang:'封乡', - jsrgfengxiang_info:'锁定技。当你受到伤害后,你与一名其他角色交换装备区里的所有牌。若你装备区里的牌因此减少,你摸等同于减少牌数的牌。', - jsrg_weiwenzhugezhi:'合卫温诸葛直', - jsrg_weiwenzhugezhi_prefix:'合', - jsrgfuhai:'浮海', - jsrgfuhai_info:'出牌阶段限一次。你可以令所有有手牌的其他角色同时展示一张手牌,然后你选择一个方向并摸X张牌(X为该方向上的角色展示的点数连续严格递增或严格递减的牌数,至少为1)。', - jsrg_zhangxuan:'合张嫙', - jsrg_zhangxuan_prefix:'合', - jsrgtongli:'同礼', - jsrgtongli_info:'当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以展示所有手牌,令此牌额外结算一次。', - jsrgshezang:'奢葬', - jsrgshezang_info:'每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以亮出牌堆顶的四张牌,获得其中任意张花色各不相同的牌。', - jsrg_gaoxiang:'合高翔', - jsrg_gaoxiang_prefix:'合', - jsrgchiying:'驰应', - jsrgchiying_info:'出牌阶段限一次。你可以选择一名角色,令其攻击范围内的其他角色依次弃置一张牌。若以此法弃置的基本牌数不大于其体力值,其获得这些基本牌。', - jsrg_guozhao:'合郭照', - jsrg_guozhao_prefix:'合', - jsrgpianchong:'偏宠', - jsrgpianchong_info:'一名角色的结束阶段,若你于此回合内失去过牌,你可以判定。若结果为红色/黑色,你摸此回合进入弃牌堆的红色/黑色牌数量的牌。', - jsrgzunwei:'尊位', - jsrgzunwei_info:'出牌阶段限一次。你可以选择一名其他角色并选择执行一项,然后移除该选项:1.将手牌数摸至与该角色相同(最多摸五张);2.将其装备牌移至你的装备区,直到你装备区的牌数不少于其;3.将体力值回复至与该角色相同。', + jsrg_zhugeliang: "梦诸葛亮", + jsrg_zhugeliang_prefix: "梦", + jsrgwentian: "问天", + jsrgwentian_info: + "①你可以将牌堆顶的牌当【无懈可击】/【火攻】使用,若此牌不为黑色/红色,〖问天〗于本轮失效。②每回合限一次。你的一个阶段开始时,你可以观看牌堆顶的五张牌,然后将其中一张牌交给一名其他角色,将其余牌以任意顺序置于牌堆顶或牌堆底。", + jsrgchushi: "出师", + jsrgchushi_info: + "出牌阶段限一次。若你不为主公,你可以与主公议事。若结果为:红色,你与其各摸一张牌,若你与其手牌数之和小于7,重复此流程;黑色,当你于本轮内造成属性伤害时,此伤害+1。", + jsrgyinlve: "隐略", + jsrgyinlve_info: + "每轮各限一次。当一名角色受到火焰/雷电伤害时,你可以防止此伤害,然后于当前回合结束后执行一个只有摸牌/弃牌阶段的回合。", + jsrg_jiangwei: "合姜维", + jsrg_jiangwei_prefix: "合", + jsrgjinfa: "矜伐", + jsrgjinfa_info: + "出牌阶段限一次。你可以展示一张手牌,然后令所有体力上限不大于你的角色议事。若结果与此牌颜色:相同,你令其中至多两名角色将手牌摸至体力上限;不同,你获得两张【影】。然后若没有其他角色与你意见相同,你可以变更势力。", + jsrgfumou: "复谋", + jsrgfumou_info: + "魏势力技。当你议事结算结束后,与你意见不同的角色本回合不能使用或打出与其意见颜色相同的牌,你可以将一张【影】当【出其不意】对一名与你意见不同的角色使用。", + jsrgxuanfeng: "选锋", + jsrgxuanfeng_info: "蜀势力技。你可以将一张【影】当无距离和次数限制的刺【杀】使用。", + jsrg_luxun: "合陆逊", + jsrg_luxun_prefix: "合", + jsrgyoujin: "诱进", + jsrgyoujin_info: + "出牌阶段开始时,你可以与一名角色拼点,你与其本回合不能使用或打出点数小于自己拼点牌的手牌,且赢的角色视为对没赢的角色使用一张【杀】。", + jsrgdailao: "待劳", + jsrgdailao_info: + "出牌阶段,若你没有可以使用的手牌,你可以展示所有手牌并摸两张牌,然后结束此回合。", + jsrgzhubei: "逐北", + jsrgzhubei_info: + "锁定技。①当你对本回合受到过伤害的角色造成伤害时,此伤害+1。②你对本回合失去过最后手牌的角色使用牌无次数限制。", + jsrg_zhaoyun: "合赵云", + jsrg_zhaoyun_prefix: "合", + jsrglonglin: "龙临", + jsrglonglin_info: + "其他角色于其出牌阶段内首次使用【杀】指定第一个目标后,你可以弃置一张牌令此【杀】无效,然后其可以视为对你使用一张【决斗】,你以此法造成伤害后,其本阶段不能再使用手牌。", + jsrgzhendan: "镇胆", + jsrgzhendan_info: + "①你可以将一张非基本手牌当任意基本牌使用或打出。②当你受到伤害后,你摸X张牌并令该技能本轮失效(X为本轮所有角色执行过的回合数且至多为5)。③一轮游戏开始时,若上一轮该技能未因〖镇胆②〗失效过,你摸Y张牌(Y为上一轮所有角色执行过的回合数且至多为5)。", + jsrg_simayi: "合司马懿", + jsrg_simayi_prefix: "合", + jsrgyingshi: "鹰眎", + jsrgyingshi_info: + "当你翻面时,你可以观看牌堆底的三张牌(若死亡角色数大于2则改为五张),然后将其中任意数量的牌以任意顺序置于牌堆顶,其余以任意顺序置于牌堆底。", + jsrgtuigu: "蜕骨", + jsrgtuigu_info: + "①回合开始时,你可以翻面并令你本回合的手牌上限+X,然后摸X张牌并视为使用一张【解甲归田】(X为存活角色数的一半,向下取整),目标角色不能使用以此法得到的牌直到其回合结束。②一轮游戏开始时,若你上一轮未执行过回合(因〖蜕骨②〗执行的回合除外),你获得一个额外的回合。③当你失去装备牌里的牌后,你回复1点体力。", + jsrg_guoxun: "合郭循", + jsrg_guoxun_prefix: "合", + jsrgeqian: "遏前", + jsrgeqian_info: + "①结束阶段,你可以蓄谋任意次。②当你使用【杀】或蓄谋牌指定其他角色为唯一目标后,你可以令此牌不计入次数限制并获得目标一张牌,然后其可以令你本回合至其的距离+2。", + jsrgfusha: "伏杀", + jsrgfusha_info: + "限定技。出牌阶段,若你的攻击范围内仅有一名角色,你可以对其造成X点伤害(X为你的攻击范围,至多为游戏人数)。", + jsrg_sunlubansunluyu: "合大小虎", + jsrg_sunlubansunluyu_prefix: "合", + jsrgdaimou: "殆谋", + jsrgdaimou_info: + "每回合各限一次。当一名角色使用【杀】指定其他角色/你为目标时,你可以用牌堆顶的牌蓄谋/你须弃置你区域里的一张蓄谋牌。", + jsrgfangjie: "芳洁", + jsrgfangjie_info: + "准备阶段,若你没有蓄谋牌,你回复1点体力并摸一张牌,否则你可以弃置你区域里的任意张蓄谋牌并失去〖芳洁〗。", + jsrg_caofang: "合曹芳", + jsrg_caofang_prefix: "合", + jsrgzhaotu: "诏图", + jsrgzhaotu_info: + "每轮限一次。你可以将一张红色非锦囊牌当【乐不思蜀】使用,然后当前回合结束后,目标执行一个手牌上限-2的额外回合。", + jsrgjingju: "惊惧", + jsrgjingju_info: + "当你需要使用任意一种基本牌时,你可以将其他角色判定区里的一张牌移动至你的判定区,视为你使用之。", + jsrgweizhui: "危坠", + jsrgweizhui_info: + "主公技。其他魏势力角色的结束阶段,其可以将一张黑色手牌当【过河拆桥】对你使用。", + jsrg_sunjun: "合孙峻", + jsrg_sunjun_prefix: "合", + jsrgyaoyan: "邀宴", + jsrgyaoyan_info: + "准备阶段,你可以令所有角色依次选择是否于回合结束时议事,若议事结果为:红色,你获得任意名未议事的角色各一张手牌;黑色,你可以对一名议事的角色造成2点伤害。", + jsrgbazheng: "霸政", + jsrgbazheng_info: "当你参与的议事展示意见时,本回合受到过你伤害的角色意见视为与你相同。", + jsrg_liuyong: "合刘永", + jsrg_liuyong_prefix: "合", + jsrgdanxin: "丹心", + jsrgdanxin_info: + "你可以将一张牌当【推心置腹】使用,你展示以此法交出与得到的牌,以此法得到♥牌的角色回复1点体力,然后你至目标角色的距离+1直到回合结束。", + jsrgfengxiang: "封乡", + jsrgfengxiang_info: + "锁定技。当你受到伤害后,你与一名其他角色交换装备区里的所有牌。若你装备区里的牌因此减少,你摸等同于减少牌数的牌。", + jsrg_weiwenzhugezhi: "合卫温诸葛直", + jsrg_weiwenzhugezhi_prefix: "合", + jsrgfuhai: "浮海", + jsrgfuhai_info: + "出牌阶段限一次。你可以令所有有手牌的其他角色同时展示一张手牌,然后你选择一个方向并摸X张牌(X为该方向上的角色展示的点数连续严格递增或严格递减的牌数,至少为1)。", + jsrg_zhangxuan: "合张嫙", + jsrg_zhangxuan_prefix: "合", + jsrgtongli: "同礼", + jsrgtongli_info: + "当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以展示所有手牌,令此牌额外结算一次。", + jsrgshezang: "奢葬", + jsrgshezang_info: + "每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以亮出牌堆顶的四张牌,获得其中任意张花色各不相同的牌。", + jsrg_gaoxiang: "合高翔", + jsrg_gaoxiang_prefix: "合", + jsrgchiying: "驰应", + jsrgchiying_info: + "出牌阶段限一次。你可以选择一名角色,令其攻击范围内的其他角色依次弃置一张牌。若以此法弃置的基本牌数不大于其体力值,其获得这些基本牌。", + jsrg_guozhao: "合郭照", + jsrg_guozhao_prefix: "合", + jsrgpianchong: "偏宠", + jsrgpianchong_info: + "一名角色的结束阶段,若你于此回合内失去过牌,你可以判定。若结果为红色/黑色,你摸此回合进入弃牌堆的红色/黑色牌数量的牌。", + jsrgzunwei: "尊位", + jsrgzunwei_info: + "出牌阶段限一次。你可以选择一名其他角色并选择执行一项,然后移除该选项:1.将手牌数摸至与该角色相同(最多摸五张);2.将其装备牌移至你的装备区,直到你装备区的牌数不少于其;3.将体力值回复至与该角色相同。", - xumou_jsrg:'蓄谋', - xumou_jsrg_info:'“蓄谋”牌可在判定区内重复存在。判定阶段开始时,你选择一项:⒈使用此牌对应的实体牌,然后本阶段不能再使用此牌名的牌;⒉将所有的“蓄谋”牌置入弃牌堆。', + xumou_jsrg: "蓄谋", + xumou_jsrg_info: + "“蓄谋”牌可在判定区内重复存在。判定阶段开始时,你选择一项:⒈使用此牌对应的实体牌,然后本阶段不能再使用此牌名的牌;⒉将所有的“蓄谋”牌置入弃牌堆。", - jiangshanrugu_qi:'江山如故·起', - jiangshanrugu_cheng:'江山如故·承', - jiangshanrugu_zhuan:'江山如故·转', - jiangshanrugu_he:'江山如故·合', + jiangshanrugu_qi: "江山如故·起", + jiangshanrugu_cheng: "江山如故·承", + jiangshanrugu_zhuan: "江山如故·转", + jiangshanrugu_he: "江山如故·合", }, }; }); diff --git a/character/mobile.js b/character/mobile.js index ee670b27a..8fa736ce0 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -1,5898 +1,7366 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'mobile', + name: "mobile", //connectBanned:['miheng'], - connect:true, - characterSort:{ - mobile:{ - mobile_default:['mb_sp_guanqiujian','mb_caomao','chengji','lizhaojiaobo','xin_huojun','muludawang','mb_chengui','mb_huban','mb_xianglang','yanxiang','xin_wuban','laimin','baoxin','jiangji','liwei','xin_guozhao',"miheng","taoqian","lingcao","sunru","lifeng","zhuling","liuye","zhaotongzhaoguang","majun","simazhao","wangyuanji","pangdegong","shenpei","hujinding","zhangyì","jiakui","yangbiao","chendeng","dongcheng","yangyi","dengzhi","zhengxuan","sp_sufei","furong","dingyuan","simashi","yanghuiyu","hucheer","gongsunkang","nanhualaoxian","zhouqun","qiaozhou","fuqian","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi','yangfeng'], - mobile_yijiang:["yj_zhanghe","yj_zhangliao","yj_xuhuang","yj_ganning",'yj_huangzhong','yj_weiyan','yj_zhoubuyi'], - mobile_standard:["xin_xiahoudun","xin_zhangfei"], - mobile_shenhua_feng:['re_xiaoqiao',"xin_zhoutai"], - mobile_shenhua_huo:["re_pangtong","re_sp_zhugeliang","re_xunyu","re_dianwei","re_yanwen","xin_yuanshao"], - mobile_shenhua_lin:["re_dongzhuo","re_sunjian","re_zhurong"], - mobile_shenhua_shan:["re_liushan","re_dengai","re_jiangwei","re_caiwenji",'re_zhangzhang',"re_sunben"], - mobile_shenhua_yin:['xin_sunliang'], - mobile_shenhua_lei:["re_guanqiujian"], - mobile_yijiang1:["re_xusheng","re_lingtong","ol_yujin","re_wuguotai","re_gaoshun",'re_caozhi'], - mobile_yijiang2:["xin_liaohua","xin_caozhang","re_liubiao","re_handang","xin_chengpu","xin_gongsunzan","re_zhonghui","re_bulianshi"], - mobile_yijiang3:["re_liru","xin_jianyong","xin_zhuran","xin_guohuai","xin_panzhangmazhong","xin_fuhuanghou","re_yufan"], - mobile_yijiang4:["xin_zhoucang","xin_caifuren","xin_guyong","xin_sunluban","xin_caozhen","xin_jushou","xin_wuyi","xin_zhuhuan","re_chenqun"], - mobile_yijiang5:['xin_zhangyi','xin_sunxiu','xin_quancong','xin_zhuzhi','xin_caoxiu'], - mobile_yijiang67:["re_jikang"], - mobile_changshi:['scs_zhangrang','scs_zhaozhong','scs_sunzhang','scs_bilan','scs_xiayun','scs_hankui','scs_lisong','scs_duangui','scs_guosheng','scs_gaowang'], - mobile_sp:["old_yuanshu","re_wangyun","re_baosanniang","re_weiwenzhugezhi","re_zhanggong","re_xugong","re_heqi","liuzan","xin_hansui",'mb_sunluyu'], + connect: true, + characterSort: { + mobile: { + mobile_default: [ + "mb_sp_guanqiujian", + "mb_caomao", + "chengji", + "lizhaojiaobo", + "xin_huojun", + "muludawang", + "mb_chengui", + "mb_huban", + "mb_xianglang", + "yanxiang", + "xin_wuban", + "laimin", + "baoxin", + "jiangji", + "liwei", + "xin_guozhao", + "miheng", + "taoqian", + "lingcao", + "sunru", + "lifeng", + "zhuling", + "liuye", + "zhaotongzhaoguang", + "majun", + "simazhao", + "wangyuanji", + "pangdegong", + "shenpei", + "hujinding", + "zhangyì", + "jiakui", + "yangbiao", + "chendeng", + "dongcheng", + "yangyi", + "dengzhi", + "zhengxuan", + "sp_sufei", + "furong", + "dingyuan", + "simashi", + "yanghuiyu", + "hucheer", + "gongsunkang", + "nanhualaoxian", + "zhouqun", + "qiaozhou", + "fuqian", + "simafu", + "mayuanyi", + "yanpu", + "sunhanhua", + "sp_maojie", + "peixiu", + "sp_jianggan", + "ruanhui", + "xin_mamidi", + "sp_caosong", + "yangfu", + "wangjun", + "sp_pengyang", + "qianzhao", + "shichangshi", + "yangfeng", + ], + mobile_yijiang: [ + "yj_zhanghe", + "yj_zhangliao", + "yj_xuhuang", + "yj_ganning", + "yj_huangzhong", + "yj_weiyan", + "yj_zhoubuyi", + ], + mobile_standard: ["xin_xiahoudun", "xin_zhangfei"], + mobile_shenhua_feng: ["re_xiaoqiao", "xin_zhoutai"], + mobile_shenhua_huo: [ + "re_pangtong", + "re_sp_zhugeliang", + "re_xunyu", + "re_dianwei", + "re_yanwen", + "xin_yuanshao", + ], + mobile_shenhua_lin: ["re_dongzhuo", "re_sunjian", "re_zhurong"], + mobile_shenhua_shan: [ + "re_liushan", + "re_dengai", + "re_jiangwei", + "re_caiwenji", + "re_zhangzhang", + "re_sunben", + ], + mobile_shenhua_yin: ["xin_sunliang"], + mobile_shenhua_lei: ["re_guanqiujian"], + mobile_yijiang1: [ + "re_xusheng", + "re_lingtong", + "ol_yujin", + "re_wuguotai", + "re_gaoshun", + "re_caozhi", + ], + mobile_yijiang2: [ + "xin_liaohua", + "xin_caozhang", + "re_liubiao", + "re_handang", + "xin_chengpu", + "xin_gongsunzan", + "re_zhonghui", + "re_bulianshi", + ], + mobile_yijiang3: [ + "re_liru", + "xin_jianyong", + "xin_zhuran", + "xin_guohuai", + "xin_panzhangmazhong", + "xin_fuhuanghou", + "re_yufan", + ], + mobile_yijiang4: [ + "xin_zhoucang", + "xin_caifuren", + "xin_guyong", + "xin_sunluban", + "xin_caozhen", + "xin_jushou", + "xin_wuyi", + "xin_zhuhuan", + "re_chenqun", + ], + mobile_yijiang5: ["xin_zhangyi", "xin_sunxiu", "xin_quancong", "xin_zhuzhi", "xin_caoxiu"], + mobile_yijiang67: ["re_jikang"], + mobile_changshi: [ + "scs_zhangrang", + "scs_zhaozhong", + "scs_sunzhang", + "scs_bilan", + "scs_xiayun", + "scs_hankui", + "scs_lisong", + "scs_duangui", + "scs_guosheng", + "scs_gaowang", + ], + mobile_sp: [ + "old_yuanshu", + "re_wangyun", + "re_baosanniang", + "re_weiwenzhugezhi", + "re_zhanggong", + "re_xugong", + "re_heqi", + "liuzan", + "xin_hansui", + "mb_sunluyu", + ], }, }, - character:{ - mb_sp_guanqiujian:['male','wei',4,['mbcuizhen','mbkuili']], - mb_caomao:['male','wei',3,['mbqianlong','mbweitong'],['zhu']], - chengji:['male','wei',4,['mbkuangli','mbxiongsi']], - lizhaojiaobo:['male','wei',4,['mbzuoyou','mbshishou']], - yangfeng:['male','qun',4,['mbxuetu','mbweiming']], - xin_huojun:['male','shu',4,['sidai','jieyu'],['character:tw_huojun','die_audio:tw_huojun']], - muludawang:['male','qun','3/3/1',['shoufa','zhoulin','yuxiang']], - mb_chengui:['male','qun',3,['guimou','zhouxian']], - mb_huban:['male','wei',4,['mbyilie']], - mb_xianglang:['male','shu',3,['naxue','yijie']], - yanxiang:['male','qun',3,['kujian','twruilian'],['die_audio:tw_yanxiang']], - mb_sunluyu:['female','wu',3,['mbmeibu','mbmumu']], - xin_wuban:['male','shu',4,['xinjintao'],['clan:陈留吴氏','character:wuban']], - baoxin:['male','qun',4,['mutao','yimou'],['die_audio:tw_baoxin']], - jiangji:['male','wei',3,['twjichou','jilun'],['character:tw_jiangji','die_audio:tw_jiangji']], - liwei:['male','shu',4,['jiaohua'],['die_audio:tw_liwei']], - laimin:['male','shu',3,['laishou','luanqun']], - yj_zhoubuyi:['male','wei',3,['mbhuiyao','mbquesong']], - xin_guozhao:['female','wei',3,['yichong','wufei']], - xin_zhangyi:['male','shu',4,['xinwurong','shizhi']], - xin_sunliang:['male','wu',3,['xinzhizheng','xinkuizhu','xinlijun'],['zhu']], - re_xiaoqiao:['female','wu',3,['retianxiang','xinhongyan']], - shichangshi:['male','qun',1,['mbdanggu','mbmowang'],['sex:male_castrated']], - re_zhangzhang:['male','wu',3,['rezhijian','guzheng']], - qianzhao:['male','wei',4,['mbshihe','mbzhenfu']], - re_yanwen:["male","qun",4,["reshuangxiong"]], - xin_zhoutai:['male','wu',4,['buqu','new_fenji']], - re_caozhi:['male','wei',3,['reluoying','rejiushi','chengzhang']], - yj_weiyan:['male','qun',5,['mbguli','mbaosi']], - re_chenqun:['male','wei',3,['redingpin','refaen']], - xin_caoxiu:['male','wei',4,['qianju','xinqingxi']], - xin_zhuhuan:['male','wu',4,['fenli','xinpingkou']], - sp_pengyang:['male','shu',3,['spdaming','spxiaoni']], - wangjun:['male','qun',4,['zhujian','duansuo']], - xin_zhuzhi:['male','wu',4,['sbanguo']], - xin_wuyi:['male','shu',4,['sbbenxi']], - yangfu:['male','wei',4,['jiebing','hannan']], - sp_caosong:['male','wei',3,['yijin','guanzong']], - re_liru:['male','qun',3,['rejuece','remieji','xinfencheng']], - re_dianwei:["male","wei",4,["reqiangxi"]], - xin_mamidi:['male','qun',3,['chengye','buxu']], - ruanhui:['female','wei',3,['mingcha','jingzhong']], - xin_quancong:['male','wu',4,['sbyaoming']], - re_xunyu:["male","wei",3,["quhu","rejieming"],['clan:颍川荀氏']], - xin_jushou:['male','qun','2/3/3',['xinjianying','shibei']], - re_bulianshi:['female','wu',3,['reanxu','zhuiyi']], - re_caiwenji:['female','qun',3,['rebeige','duanchang']], - sp_jianggan:['male','wei',3,['mbdaoshu','spdaizui']], - peixiu:['male','qun',3,['xingtu','juezhi']], - re_gaoshun:['male','qun',4,['rexianzhen','rejinjiu']], - re_wuguotai:['female','wu',3,['reganlu','buyi']], - xin_sunxiu:['male','wu',3,['mobileyanzhu','mobilexingxue','zhaofu'],['zhu']], - sp_maojie:['male','wei',3,['bingqing','yingfeng']], - yj_huangzhong:['male','qun',4,['spshidi','spyishi','spqishe']], - re_yufan:['male','wu',3,['zhiyan','rezongxuan']], - sunhanhua:['female','wu',3,['chongxu','miaojian','shhlianhua']], - yanpu:['male','qun',3,['huantu','bihuo']], - mayuanyi:['male','qun',4,['jibing','wangjing','moucuan']], - simafu:['male','wei',3,['xunde','chenjie']], - fuqian:['male','shu',4,['jueyong','poxiang']], - xin_caozhen:['male','wei',4,['discretesidi']], - xin_sunluban:['female','wu',3,['xinzenhui','xinjiaojin']], - qiaozhou:['male','shu',3,['zhiming','xingbu']], - xin_guyong:['male','wu',3,['xinshenxing','xinbingyi']], - re_zhonghui:['male','wei',4,['requanji','zili'],['clan:颍川钟氏']], - xin_caifuren:['female','qun',3,['xinqieting','xianzhou']], - xin_zhoucang:['male','shu',4,['mobilezhongyong']], - ol_yujin:['male','wei',4,['rejieyue']], - zhouqun:['male','shu',3,['tiansuan']], - re_zhurong:['female','shu',4,['juxiang','relieren']], - re_jiangwei:['male','shu',4,['retiaoxin','zhiji']], - nanhualaoxian:['male','qun',3,['yufeng','tianshu']], - re_handang:['male','wu',4,['regongji','jiefan']], - re_dengai:['male','wei',4,['retuntian','zaoxian']], - xin_fuhuanghou:['female','qun',3,['xinzhuikong','xinqiuyuan']], - xin_panzhangmazhong:['male','wu',4,['xinduodao','xinanjian']], - xin_guohuai:['male','wei',4,['mobilejingce']], - gongsunkang:['male','qun',4,['juliao','taomie']], - xin_zhangfei:['male','shu',4,['new_repaoxiao','liyong']], - xin_hansui:['male','qun','4/4/1',['xinniluan','xiaoxi_hansui']], - hucheer:['male','qun',4,['daoji']], - re_lingtong:['male','wu',4,['rexuanfeng']], - re_liubiao:['male','qun',3,['zishou','rezongshi']], - simashi:['male','wei',4,['baiyi','jinglve','shanli']], - yanghuiyu:['female','wei',3,['hongyi','requanfeng']], - xin_zhuran:['male','wu',4,['mobiledanshou']], - xin_gongsunzan:['male','qun',4,['xinyicong','qiaomeng']], - dingyuan:['male','qun',4,['beizhu']], - xin_jianyong:['male','shu',3,['xinqiaoshui','xinjyzongshi']], - xin_caozhang:['male','wei',4,['rejiangchi']], - xin_liaohua:['male','shu',4,['redangxian','refuli']], - furong:['male','shu',4,['xuewei','liechi']], - re_dongzhuo:['male','qun',8,['rejiuchi','roulin','benghuai','baonue'],['zhu']], - re_xusheng:['male','wu',4,['repojun']], - sp_sufei:['male','qun',4,['zhengjian','gaoyuan']], - yj_zhangliao:['male','qun',4,['weifeng']], - yj_zhanghe:['male','qun',4,['xinzhilve']], - yj_xuhuang:['male','qun',4,['xinxhzhiyan']], - yj_ganning:['male','qun',4,['gnjinfan','gnsheque']], - re_sunjian:['male','wu',4,['gzyinghun','repolu']], - zhengxuan:['male','qun',3,['zhengjing']], - dengzhi:['male','shu',3,['jimeng','shuaiyan']], - xin_chengpu:['male','wu',4,['relihuo','chunlao']], - yangyi:['male','shu',3,['duoduan','gongsun']], - dongcheng:['male','qun',4,['chengzhao']], - re_pangtong:['male','shu',3,['xinlianhuan','niepan']], - re_guanqiujian:['male','wei',4,['rezhengrong','rehongju']], - chendeng:['male','qun',3,['zhouxuan','fengji']], - re_heqi:['male','wu',4,['reqizhou','reshanxi']], - yangbiao:['male','qun',3,['zhaohan','rangjie','yizheng']], - re_sp_zhugeliang:["male","shu",3,["bazhen","rehuoji","rekanpo"]], - xin_xiahoudun:['male','wei',4,['reganglie','xinqingjian']], - zhangyì:['male','shu',4,['rezhiyi']], - jiakui:['male','wei',3,['zhongzuo','wanlan']], - re_jikang:["male","wei",3,["new_qingxian","new_juexiang"]], - miheng:['male','qun',3,['kuangcai','shejian']], - taoqian:['male','qun',3,['zhaohuo','yixiang','yirang']], - liuzan:['male','wu',4,['fenyin']], - lingcao:['male','wu',4,['dujin']], - sunru:['female','wu',3,['yingjian','shixin']], - lifeng:['male','shu',3,['tunchu','shuliang']], - zhuling:['male','wei',4,['xinzhanyi']], - liuye:['male','wei',3,['polu','choulve']], - zhaotongzhaoguang:["male","shu",4,["yizan_use","xinfu_longyuan"]], - majun:["male","wei",3,["xinfu_jingxie1","qiaosi"]], - simazhao:["male","wei",3,["xinfu_daigong","xinfu_zhaoxin"]], - wangyuanji:["female","wei",3,["xinfu_qianchong","xinfu_shangjian"]], - pangdegong:["male","qun",3,["xinfu_pingcai","xinfu_pdgyingshi"]], - old_yuanshu:['male','qun',4,['xinyongsi','yjixi']], + character: { + mb_sp_guanqiujian: ["male", "wei", 4, ["mbcuizhen", "mbkuili"]], + mb_caomao: ["male", "wei", 3, ["mbqianlong", "mbweitong"], ["zhu"]], + chengji: ["male", "wei", 4, ["mbkuangli", "mbxiongsi"]], + lizhaojiaobo: ["male", "wei", 4, ["mbzuoyou", "mbshishou"]], + yangfeng: ["male", "qun", 4, ["mbxuetu", "mbweiming"]], + xin_huojun: [ + "male", + "shu", + 4, + ["sidai", "jieyu"], + ["character:tw_huojun", "die_audio:tw_huojun"], + ], + muludawang: ["male", "qun", "3/3/1", ["shoufa", "zhoulin", "yuxiang"]], + mb_chengui: ["male", "qun", 3, ["guimou", "zhouxian"]], + mb_huban: ["male", "wei", 4, ["mbyilie"]], + mb_xianglang: ["male", "shu", 3, ["naxue", "yijie"]], + yanxiang: ["male", "qun", 3, ["kujian", "twruilian"], ["die_audio:tw_yanxiang"]], + mb_sunluyu: ["female", "wu", 3, ["mbmeibu", "mbmumu"]], + xin_wuban: ["male", "shu", 4, ["xinjintao"], ["clan:陈留吴氏", "character:wuban"]], + baoxin: ["male", "qun", 4, ["mutao", "yimou"], ["die_audio:tw_baoxin"]], + jiangji: [ + "male", + "wei", + 3, + ["twjichou", "jilun"], + ["character:tw_jiangji", "die_audio:tw_jiangji"], + ], + liwei: ["male", "shu", 4, ["jiaohua"], ["die_audio:tw_liwei"]], + laimin: ["male", "shu", 3, ["laishou", "luanqun"]], + yj_zhoubuyi: ["male", "wei", 3, ["mbhuiyao", "mbquesong"]], + xin_guozhao: ["female", "wei", 3, ["yichong", "wufei"]], + xin_zhangyi: ["male", "shu", 4, ["xinwurong", "shizhi"]], + xin_sunliang: ["male", "wu", 3, ["xinzhizheng", "xinkuizhu", "xinlijun"], ["zhu"]], + re_xiaoqiao: ["female", "wu", 3, ["retianxiang", "xinhongyan"]], + shichangshi: ["male", "qun", 1, ["mbdanggu", "mbmowang"], ["sex:male_castrated"]], + re_zhangzhang: ["male", "wu", 3, ["rezhijian", "guzheng"]], + qianzhao: ["male", "wei", 4, ["mbshihe", "mbzhenfu"]], + re_yanwen: ["male", "qun", 4, ["reshuangxiong"]], + xin_zhoutai: ["male", "wu", 4, ["buqu", "new_fenji"]], + re_caozhi: ["male", "wei", 3, ["reluoying", "rejiushi", "chengzhang"]], + yj_weiyan: ["male", "qun", 5, ["mbguli", "mbaosi"]], + re_chenqun: ["male", "wei", 3, ["redingpin", "refaen"]], + xin_caoxiu: ["male", "wei", 4, ["qianju", "xinqingxi"]], + xin_zhuhuan: ["male", "wu", 4, ["fenli", "xinpingkou"]], + sp_pengyang: ["male", "shu", 3, ["spdaming", "spxiaoni"]], + wangjun: ["male", "qun", 4, ["zhujian", "duansuo"]], + xin_zhuzhi: ["male", "wu", 4, ["sbanguo"]], + xin_wuyi: ["male", "shu", 4, ["sbbenxi"]], + yangfu: ["male", "wei", 4, ["jiebing", "hannan"]], + sp_caosong: ["male", "wei", 3, ["yijin", "guanzong"]], + re_liru: ["male", "qun", 3, ["rejuece", "remieji", "xinfencheng"]], + re_dianwei: ["male", "wei", 4, ["reqiangxi"]], + xin_mamidi: ["male", "qun", 3, ["chengye", "buxu"]], + ruanhui: ["female", "wei", 3, ["mingcha", "jingzhong"]], + xin_quancong: ["male", "wu", 4, ["sbyaoming"]], + re_xunyu: ["male", "wei", 3, ["quhu", "rejieming"], ["clan:颍川荀氏"]], + xin_jushou: ["male", "qun", "2/3/3", ["xinjianying", "shibei"]], + re_bulianshi: ["female", "wu", 3, ["reanxu", "zhuiyi"]], + re_caiwenji: ["female", "qun", 3, ["rebeige", "duanchang"]], + sp_jianggan: ["male", "wei", 3, ["mbdaoshu", "spdaizui"]], + peixiu: ["male", "qun", 3, ["xingtu", "juezhi"]], + re_gaoshun: ["male", "qun", 4, ["rexianzhen", "rejinjiu"]], + re_wuguotai: ["female", "wu", 3, ["reganlu", "buyi"]], + xin_sunxiu: ["male", "wu", 3, ["mobileyanzhu", "mobilexingxue", "zhaofu"], ["zhu"]], + sp_maojie: ["male", "wei", 3, ["bingqing", "yingfeng"]], + yj_huangzhong: ["male", "qun", 4, ["spshidi", "spyishi", "spqishe"]], + re_yufan: ["male", "wu", 3, ["zhiyan", "rezongxuan"]], + sunhanhua: ["female", "wu", 3, ["chongxu", "miaojian", "shhlianhua"]], + yanpu: ["male", "qun", 3, ["huantu", "bihuo"]], + mayuanyi: ["male", "qun", 4, ["jibing", "wangjing", "moucuan"]], + simafu: ["male", "wei", 3, ["xunde", "chenjie"]], + fuqian: ["male", "shu", 4, ["jueyong", "poxiang"]], + xin_caozhen: ["male", "wei", 4, ["discretesidi"]], + xin_sunluban: ["female", "wu", 3, ["xinzenhui", "xinjiaojin"]], + qiaozhou: ["male", "shu", 3, ["zhiming", "xingbu"]], + xin_guyong: ["male", "wu", 3, ["xinshenxing", "xinbingyi"]], + re_zhonghui: ["male", "wei", 4, ["requanji", "zili"], ["clan:颍川钟氏"]], + xin_caifuren: ["female", "qun", 3, ["xinqieting", "xianzhou"]], + xin_zhoucang: ["male", "shu", 4, ["mobilezhongyong"]], + ol_yujin: ["male", "wei", 4, ["rejieyue"]], + zhouqun: ["male", "shu", 3, ["tiansuan"]], + re_zhurong: ["female", "shu", 4, ["juxiang", "relieren"]], + re_jiangwei: ["male", "shu", 4, ["retiaoxin", "zhiji"]], + nanhualaoxian: ["male", "qun", 3, ["yufeng", "tianshu"]], + re_handang: ["male", "wu", 4, ["regongji", "jiefan"]], + re_dengai: ["male", "wei", 4, ["retuntian", "zaoxian"]], + xin_fuhuanghou: ["female", "qun", 3, ["xinzhuikong", "xinqiuyuan"]], + xin_panzhangmazhong: ["male", "wu", 4, ["xinduodao", "xinanjian"]], + xin_guohuai: ["male", "wei", 4, ["mobilejingce"]], + gongsunkang: ["male", "qun", 4, ["juliao", "taomie"]], + xin_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "liyong"]], + xin_hansui: ["male", "qun", "4/4/1", ["xinniluan", "xiaoxi_hansui"]], + hucheer: ["male", "qun", 4, ["daoji"]], + re_lingtong: ["male", "wu", 4, ["rexuanfeng"]], + re_liubiao: ["male", "qun", 3, ["zishou", "rezongshi"]], + simashi: ["male", "wei", 4, ["baiyi", "jinglve", "shanli"]], + yanghuiyu: ["female", "wei", 3, ["hongyi", "requanfeng"]], + xin_zhuran: ["male", "wu", 4, ["mobiledanshou"]], + xin_gongsunzan: ["male", "qun", 4, ["xinyicong", "qiaomeng"]], + dingyuan: ["male", "qun", 4, ["beizhu"]], + xin_jianyong: ["male", "shu", 3, ["xinqiaoshui", "xinjyzongshi"]], + xin_caozhang: ["male", "wei", 4, ["rejiangchi"]], + xin_liaohua: ["male", "shu", 4, ["redangxian", "refuli"]], + furong: ["male", "shu", 4, ["xuewei", "liechi"]], + re_dongzhuo: ["male", "qun", 8, ["rejiuchi", "roulin", "benghuai", "baonue"], ["zhu"]], + re_xusheng: ["male", "wu", 4, ["repojun"]], + sp_sufei: ["male", "qun", 4, ["zhengjian", "gaoyuan"]], + yj_zhangliao: ["male", "qun", 4, ["weifeng"]], + yj_zhanghe: ["male", "qun", 4, ["xinzhilve"]], + yj_xuhuang: ["male", "qun", 4, ["xinxhzhiyan"]], + yj_ganning: ["male", "qun", 4, ["gnjinfan", "gnsheque"]], + re_sunjian: ["male", "wu", 4, ["gzyinghun", "repolu"]], + zhengxuan: ["male", "qun", 3, ["zhengjing"]], + dengzhi: ["male", "shu", 3, ["jimeng", "shuaiyan"]], + xin_chengpu: ["male", "wu", 4, ["relihuo", "chunlao"]], + yangyi: ["male", "shu", 3, ["duoduan", "gongsun"]], + dongcheng: ["male", "qun", 4, ["chengzhao"]], + re_pangtong: ["male", "shu", 3, ["xinlianhuan", "niepan"]], + re_guanqiujian: ["male", "wei", 4, ["rezhengrong", "rehongju"]], + chendeng: ["male", "qun", 3, ["zhouxuan", "fengji"]], + re_heqi: ["male", "wu", 4, ["reqizhou", "reshanxi"]], + yangbiao: ["male", "qun", 3, ["zhaohan", "rangjie", "yizheng"]], + re_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "rehuoji", "rekanpo"]], + xin_xiahoudun: ["male", "wei", 4, ["reganglie", "xinqingjian"]], + zhangyì: ["male", "shu", 4, ["rezhiyi"]], + jiakui: ["male", "wei", 3, ["zhongzuo", "wanlan"]], + re_jikang: ["male", "wei", 3, ["new_qingxian", "new_juexiang"]], + miheng: ["male", "qun", 3, ["kuangcai", "shejian"]], + taoqian: ["male", "qun", 3, ["zhaohuo", "yixiang", "yirang"]], + liuzan: ["male", "wu", 4, ["fenyin"]], + lingcao: ["male", "wu", 4, ["dujin"]], + sunru: ["female", "wu", 3, ["yingjian", "shixin"]], + lifeng: ["male", "shu", 3, ["tunchu", "shuliang"]], + zhuling: ["male", "wei", 4, ["xinzhanyi"]], + liuye: ["male", "wei", 3, ["polu", "choulve"]], + zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "xinfu_longyuan"]], + majun: ["male", "wei", 3, ["xinfu_jingxie1", "qiaosi"]], + simazhao: ["male", "wei", 3, ["xinfu_daigong", "xinfu_zhaoxin"]], + wangyuanji: ["female", "wei", 3, ["xinfu_qianchong", "xinfu_shangjian"]], + pangdegong: ["male", "qun", 3, ["xinfu_pingcai", "xinfu_pdgyingshi"]], + old_yuanshu: ["male", "qun", 4, ["xinyongsi", "yjixi"]], - shenpei:["male","qun","2/3",["shouye","liezhi"]], - re_wangyun:['male','qun',3,['relianji','remoucheng'],['clan:太原王氏']], + shenpei: ["male", "qun", "2/3", ["shouye", "liezhi"]], + re_wangyun: ["male", "qun", 3, ["relianji", "remoucheng"], ["clan:太原王氏"]], - re_baosanniang:['female','shu',3,['meiyong','rexushen','rezhennan']], + re_baosanniang: ["female", "shu", 3, ["meiyong", "rexushen", "rezhennan"]], - hujinding:['female','shu','2/6',['renshi','wuyuan','huaizi']], + hujinding: ["female", "shu", "2/6", ["renshi", "wuyuan", "huaizi"]], - re_zhanggong:['male','wei',3,['reqianxin','rezhenxing']], - re_xugong:['male','qun',3,['rebiaozhao','yechou'],['doublegroup:wu:qun']], - re_weiwenzhugezhi:['male','wu',4,['refuhai']], + re_zhanggong: ["male", "wei", 3, ["reqianxin", "rezhenxing"]], + re_xugong: ["male", "qun", 3, ["rebiaozhao", "yechou"], ["doublegroup:wu:qun"]], + re_weiwenzhugezhi: ["male", "wu", 4, ["refuhai"]], - xin_yuanshao:['male','qun',4,['reluanji','xueyi'],['zhu']], - re_liushan:['male','shu',3,['xiangle','refangquan','ruoyu'],['zhu']], - re_sunben:['male','wu',4,['jiang','rehunzi','zhiba'],['zhu']], + xin_yuanshao: ["male", "qun", 4, ["reluanji", "xueyi"], ["zhu"]], + re_liushan: ["male", "shu", 3, ["xiangle", "refangquan", "ruoyu"], ["zhu"]], + re_sunben: ["male", "wu", 4, ["jiang", "rehunzi", "zhiba"], ["zhu"]], - scs_zhangrang:['male','qun','',['scstaoluan'],['unseen','sex:male_castrated']], - scs_zhaozhong:['male','qun','',['scschiyan'],['unseen','sex:male_castrated']], - scs_sunzhang:['male','qun','',['scszimou'],['unseen','sex:male_castrated']], - scs_bilan:['male','qun','',['scspicai'],['unseen','sex:male_castrated']], - scs_xiayun:['male','qun','',['scsyaozhuo'],['unseen','sex:male_castrated']], - scs_hankui:['male','qun','',['scsxiaolu'],['unseen','sex:male_castrated']], - scs_lisong:['male','qun','',['scskuiji'],['unseen','sex:male_castrated']], - scs_duangui:['male','qun','',['scschihe'],['unseen','sex:male_castrated']], - scs_guosheng:['male','qun','',['scsniqu'],['unseen','sex:male_castrated']], - scs_gaowang:['male','qun','',['scsmiaoyu'],['unseen','sex:male_castrated']], + scs_zhangrang: ["male", "qun", "", ["scstaoluan"], ["unseen", "sex:male_castrated"]], + scs_zhaozhong: ["male", "qun", "", ["scschiyan"], ["unseen", "sex:male_castrated"]], + scs_sunzhang: ["male", "qun", "", ["scszimou"], ["unseen", "sex:male_castrated"]], + scs_bilan: ["male", "qun", "", ["scspicai"], ["unseen", "sex:male_castrated"]], + scs_xiayun: ["male", "qun", "", ["scsyaozhuo"], ["unseen", "sex:male_castrated"]], + scs_hankui: ["male", "qun", "", ["scsxiaolu"], ["unseen", "sex:male_castrated"]], + scs_lisong: ["male", "qun", "", ["scskuiji"], ["unseen", "sex:male_castrated"]], + scs_duangui: ["male", "qun", "", ["scschihe"], ["unseen", "sex:male_castrated"]], + scs_guosheng: ["male", "qun", "", ["scsniqu"], ["unseen", "sex:male_castrated"]], + scs_gaowang: ["male", "qun", "", ["scsmiaoyu"], ["unseen", "sex:male_castrated"]], }, - characterIntro:{ - lizhaojiaobo:'李昭(?—约公元260年),三国时期曹魏官吏,官拜冗从仆射,为魏帝曹髦的亲信。
    焦伯,三国时期人物,魏帝曹髦护卫,官拜黄门从官。
    曹髦见自己权力威势日渐削弱,感到不胜忿恨,于公元260年(甘露五年)五月初六夜里,令李昭和焦伯等在陵云台布署甲士,出讨司马昭,但最终失败,曹髦为成济所弑,李昭和焦伯等应该也战死。在《三国演义》里,焦伯挺枪出战成济,亦被成济所杀。', - chengji:'成济(?~260年6月21日),三国时期曹魏官员。官至太子舍人。在魏帝曹髦起兵讨司马昭时,受到司马昭之心腹贾充指使,刺死曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。', - yangfeng:'杨奉(?-197年/198年),东汉末年将领。杨奉早年参加白波军起义,曾经帮助李傕对抗郭汜,后来背叛李傕。兴平二年,加号兴义将军,护送汉献帝刘协东归雒阳,颇有功勋,加号车骑将军,屯兵于梁县。建安元年,随着汉献帝迁都许县,失去权力,先后依附于袁术、吕布,劫掠徐州和扬州地区。建安二年(一说三年),带兵进犯刘备领地,被刘备诱杀。', - muludawang:'古典小说《三国演义》中的虚构人物,八纳洞主,孟获盟友。擅驱兽法,能行风雨,控制猛兽并指挥它们作战。在法术帮助下最初对蜀军取得一些胜利,但在诸葛亮的喷火木兽将他的动物吓跑后战败,最后死于乱军之中。', - laimin:'来敏(165年—261年),字敬达,义阳新野人,东汉太中大夫来歙之后,司空来艳之子,三国时期蜀汉官员。东汉末年,逢董卓之乱,来敏跟随姐夫黄琬到荆州避难,黄琬是刘璋祖母的侄子,来敏又与姐姐来氏入蜀,被刘璋引为宾客。来敏喜欢读书,尤其喜欢《左氏春秋》。刘备平定益州后,以来敏为典学校尉,后立太子,来敏为家令。刘禅继位后,任命来敏为虎贲中郎将,诸葛亮驻汉中,请来敏为军祭酒、辅军将军。却因其口出狂言而被罢官,诸葛亮死后,来敏历任大长秋、光禄大夫、执慎将军等职,期间多次因说错话而被免官,蜀汉景耀年间,来敏去世,时年九十七岁。', - shichangshi:'十常侍,指中国东汉(公元25年—220年)灵帝时期(168年-189年)操纵政权的十二个宦官:张让、赵忠、夏恽、郭胜、孙璋、毕岚、栗嵩、段珪、高望、张恭、韩悝、宋典(在小说《三国演义》里,十常侍指的是指张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人),他们都任职中常侍。玩弄小皇帝于股掌之中,以至灵帝称“张常侍是我父,赵常侍是我母”。十常侍自己横征暴敛,卖官鬻爵,他们的父兄子弟遍布天下,横行乡里,祸害百姓,无官敢管。人民不堪剥削、压迫,纷纷起来反抗。当时一些比较清醒的官吏,已看出宦官集团的黑暗腐败,导致大规模农民起义的形势。郎中张钧在给皇帝的奏章中明确指出,黄巾起义是外戚宦官专权逼出来的,他说:“张角所以能兴兵作乱,万人所以乐附之者,其源皆由十常侍多放父兄、子弟、婚宗、宾客典据州郡,辜确财利,侵略百姓,百姓之怨无所告诉,故谋议不轨,聚为‘盗贼’。”后被曹操、袁绍所歼。', - sunzhang:'孙璋(?-189年?)东汉末期汉灵帝的宦官,官居中常侍,为十常侍之一,在张让、赵忠之下位居第三。光熹元年(189年),张让、赵忠、段珪等诛杀何进,袁绍率军入宫,诛杀孙璋。', - bilan:'毕岚(?—189),东汉宦官,十常侍之一。十常侍朋比为奸,祸乱朝纲,制造出党锢之祸,后被袁绍诛杀。另外,毕岚曾制造翻车,用于取河水洒路。', - xiayun:'夏恽(?—189),东汉宦官,十常侍之一。后被袁绍、曹操诛于翠花楼前。', - hankui:'韩悝(?—189),东汉宦官,十常侍之一。后被袁绍所诛。', - lisong:'栗嵩,东汉宦官,十常侍之一,与张让等人均一同任职中常侍。', - duangui:'段珪(?—189),东汉宦官,十常侍之一。段珪与张让、赵忠等人朋比为奸,党同伐异,横征暴敛,卖官鬻爵,引起了以何进为首的外戚集团的不满。何进谋诛宦官,却不纳曹操、陈琳之谏,多结外镇军阀,翘首京师,与袁绍等谋诛宦竖。终于事泄,被宦官集团查知。张让、段珪等人先下手为强,斩杀何进于嘉德殿前,却也引起了京师的变乱。袁绍等人趁机带兵冲入皇宫,大肆诛杀太监。洛阳卫军变乱后,段珪与张让等人劫持少帝刘辩、陈留王刘协出逃,后被杀。', - guosheng:'郭胜,南阳宛(今河南南阳)人。汉灵帝时为中常侍,与张让、赵忠等狼狈为奸,并皆封侯。曾助同乡何进、何太后贵幸。后被袁绍等人率兵诛灭。', - gaowang:'高望(?~189年),京兆人,东汉宦官,十常侍之一,为小黄门兼任尚药监,颇得皇子刘辩的信任。中平六年(189年),张让等人杀害大将军何进,袁绍与王匡等人率兵杀入雒阳端门,在承明堂上斩杀中常侍高望。', - qianzhao:'牵招(?—231年),字子经,安平郡观津县(今河北省武邑县)人。三国时期曹魏名将。牵招早年师从乐隐,与刘备成为刎颈之交。投靠冀州牧袁绍,担任冀州从事,统领乌丸突骑。袁绍死后,跟随冀州刺史袁尚,受到并州牧高干加害,投奔丞相曹操,授军谋掾。从平乌丸,出任护乌丸校尉。举茂才出身,从平汉中,授中护军。拜平虏校尉,平定东莱郡叛乱。魏文帝曹丕时期,授护鲜卑校尉,驻扎昌平,迁右中郎将、雁门太守,遏制鲜卑轲比能发展壮大。魏明帝即位,赐爵关内侯,营救护乌丸校尉田豫。太和五年,去世。', - fuqian:'傅佥(?~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。', - wangjun:'王濬(207年~286年),字士治,小名阿童,弘农郡湖县(今河南省灵宝市阌乡)人。西晋时期名将。王濬出身世家,博学多闻,容颜英俊,多谋善战。举秀才出身,起家河东郡从事。泰始八年(272年),担任广汉太守,平定益州叛乱,迁益州刺史。利用长江上游地势之利,修造战船,组建强大的水军。上书晋武帝,促成晋灭吴之战。咸宁六年(280年),率兵顺流而下,熔毁横江铁链,攻克丹阳郡,率先攻取石头城,接受吴末帝孙皓投降,完成西晋统一大业。凭借功勋,拜辅国将军、步兵校尉,册封襄阳侯。为避猜忌,纵情享受,累迁特进、抚军大将军、开府仪同三司、散骑常侍、后军将军等。太康六年十二月(286年1月18日),王濬去世,享年八十岁,谥号为“武”,安葬于柏谷山。', - yangfu:'杨阜(172年—244年),字义山,汉天水冀县(今甘谷县东南)人。三国时期曹魏名臣。汉献帝建安初年,任凉州从事,旋拜安定长史;韦康任刺史后辟为别驾,改任州参军;后因讨马超有功,赐爵关内侯。曹操征汉中时,杨阜担任益州刺史,回来后又担任武都太守。魏明帝时,由将作大匠改少府。杨阜不但卓识远见,而且刚正不阿,敢于直言,对朝廷弊政多有诤谏,六次进言谏魏明帝应勤政爱民,魏明帝对他颇有敬畏之心。杨阜勤政廉洁,在宫内担任少府时,专管宝器、珍膳、衣物等,而他死后则家无馀财。皇帝让杨阜的孙子杨豹继任了少府之职。原甘谷县文昌宫西侧有杨氏家祠,内悬“两代尚书”匾额。', - ruanhui:'阮氏女,是指三国时期曹魏名士许允之妻阮氏,陈留尉氏人。阮氏女是中国古代四大丑女之一,貌丑而见识非凡。她出身士族之家,是卫尉阮共(字伯彦)之女、阮侃(字德如)之妹。嫁与许允后生有二子:许奇,官至司隶校尉;许猛,官至幽州刺史。', - peixiu:'裴秀(224年-271年4月3日),字季彦。河东郡闻喜县(今山西省闻喜县)人。[1]魏晋时期名臣、地图学家,东汉尚书令裴茂之孙、曹魏光禄大夫裴潜之子。出身河东裴氏,少年时便颇有名气,后被大将军曹爽辟为掾属,袭爵清阳亭侯,又迁黄门侍郎。高平陵之变后,因是曹爽的故吏而被罢免。此后历任廷尉正、安东将军及卫将军司马,参与谋划军国之政,参与平定诸葛诞叛乱。因功转任尚书,进封鲁阳乡侯。魏元帝继位后,进爵鲁阳县侯,任尚书仆射。咸熙元年(264年),受命负责修改官制,又提议恢复五等爵制。五等制恢复后,获封济川侯。他建议立司马炎为世子,司马炎继位晋王后,拜裴秀为尚书令、右光禄大夫。西晋建立后,加左光禄大夫,封钜鹿郡公。泰始三年(267年),升任司空。泰始七年(271年),裴秀因服食寒食散后饮冷酒而逝世,年四十八,谥号“元”。有文集三卷。裴秀作《禹贡地域图》,开创了中国古代地图绘制学。李约瑟称他为“中国科学制图学之父”,与古希腊著名地图学家托勒密齐名,是世界古代地图学史上东西辉映的两颗灿烂明星。为纪念这位中国地图科学创始人而设立的“裴秀奖”,每两年评选一次,是中国地图学界最高奖项。由于他的贡献突出,联合国天文组织将月球正面的一个环形山命名为“裴秀环形山”,', - liucheng:'游卡桌游的原创人物。设定为黄忠的妻子。', - jiangwan:'蒋琬(?-246年),字公琰。零陵郡湘乡县人。三国时期蜀汉政治家,与诸葛亮、董允、费祎合称“蜀汉四相”。蒋琬最初随刘备入蜀,为广都县长。因其不理政事,惹怒刘备,在诸葛亮的劝说下才免于一死。后重获启用,受到诸葛亮的悉心培养,累官丞相长史兼抚军将军。建兴十二年(234年),诸葛亮去世,蒋琬继其执政,拜尚书令,又加行都护、假节,领益州刺史,再迁大将军,录尚书事,封安阳亭侯。延熙元年(238年),受命开府,加大司马,总揽蜀汉军政。曾制定由水路进攻曹魏的计划,但未被采纳。延熙九年(246年),蒋琬病逝,谥号为恭。', - sunhanhua:'孙寒华,三国时女仙。梁·陶弘景《真诰》卷一三、五代·杜光庭《墉城集仙录》卷七:其父孙贲为孙权堂兄,寒华少时与杜契有私情,后从杜契受玄白之要,颜容日少。周旋吴越诸山十馀年,得道仙去。《鉴后集》卷四:一云即吴大帝孙权之女。于茅山修道,道成,冲虚而去,因号其山为华姥山。山在茅山崇禧观前。《神异典》卷二五九人于明代,误。', - yanpu:'阎圃,生卒年不详,是益州巴西安汉(今四川省南充市)人。张鲁割据巴、汉,就以阎圃为功曹。东汉末年人物,本为张鲁部下谋士,后随张鲁一同投降曹操,封平乐乡侯。', - mayuanyi:'马元义(?—184年6月7日),东汉末年黄巾之乱的组织者之一,是黄巾大方首领。光和六年(183年),马元义奉黄巾军首领张角之命,筹划起事的准备工作。马元义聚集荆州、扬州信徒数万人约定于邺城相会,并收买中常侍封谞、徐奉等为内应,准备于次年(甲子年)三月初五(戊申日)内外同时起事。由于张角弟子济南人唐周的告密,马元义于于中平元年(184年)正月在河内郡山阳县被捕,送往洛阳车裂,同时被杀的还有教众近千人。由于马元义的被杀,迫使张角提前于二月起兵发动叛乱。', - simafu:'司马孚(180年-272年4月3日),字叔达。河内郡温县(今河南温县)人。三国曹魏至西晋初年重臣,西晋宗室,东汉京兆尹司马防第三子,晋宣帝司马懿之弟。自曹操时代起,司马孚就任文学掾,而后历仕魏国五代皇帝,累迁至太傅。司马孚在“高平陵事变”之际,协助司马懿控制京师,诛杀曹爽一党。后又督军成功防御吴、蜀的进攻,为司马氏政权的稳固多有功劳。但他性格十分谨慎,自司马懿执掌大权起,便逐渐引退,更未直接参与司马氏废立魏帝的谋划。西晋代魏后,司马孚进拜太宰,封安平王。晋武帝司马炎对他十分尊宠,但他并不以此为荣,至死仍以魏臣自称。泰始八年二月壬辰日(272年4月3日),司马孚去世,年九十三。武帝为其举哀三日,葬礼规格比照东汉东平献王刘苍,赐谥献王。', - sunchen:'孙綝(231年-259年1月18日),字子通,吴郡富春(今浙江杭州市富阳区)人。三国时期吴国宗室、权臣,昭义中郎将孙静曾孙、定武中郎将孙暠之孙、安民都尉孙绰的儿子。门荫入仕,初任偏将军。太平元年(256年),升任侍中、武卫将军、都督中外诸军事。掌权以后,诛杀大司马滕胤、骠骑将军吕据等重臣,升任大将军,册封永宁县侯。嗜好杀戮,与皇帝孙亮的矛盾激化,最终废黜孙亮,拥立琅琊王孙休即位,累迁丞相、荆州牧。永安元年十二月(259年1月),在左将军张布的协助下,遭到皇帝孙休捕杀,时年二十八岁,削除宗籍,改姓故氏。', - qiaozhou:'谯周(201年-270年),字允南,巴西郡西充国县(今四川西充县槐树镇)人。三国时期蜀汉大臣、学者、儒学家、史学家。幼年丧父,少读典籍,精研六经,颇晓天文,成为蜀地大儒之一,门下有陈寿、罗宪等学生。诸葛亮担任益州牧时,授劝学从事。诸葛亮死后,不顾朝令,前往奔丧。后主刘禅册立太子时,授太子仆,迁太子家令、光禄大夫。反对姜维北伐,著《仇国论》,力陈北伐之失。炎兴元年(263年),邓艾攻打成都时期,力劝刘禅投降,“有全国之功”,投降魏国后,受封阳城亭侯,迁骑都尉。泰始六年(270年),授散骑常侍,同年去世,时年七十岁。', - gongsunkang:'公孙康(生卒年不详),辽东襄平(今辽宁辽阳)人。东汉末年辽东地区割据军阀,辽东太守公孙度长子(一作庶子)、车骑将军公孙恭之兄。公孙康在其父死后继任辽东太守。建安十二年(207年),擒斩图谋不轨的袁尚、袁熙兄弟,将其首级献予曹操,被拜为左将军,封襄平侯。建安十四年(209年),公孙康大破高句丽,陷其国都,并讨伐韩濊,设置带方郡。死后因二子年幼,由公孙恭继任。曹丕称帝后,被追赠为大司马。', - zhouqun:'周群(生卒年不详),字仲直,巴西阆中(今四川阆中)人。周群年少时随父周舒学习占验天算之术。后来刘璋聘请周群为师友从事,其预言大多得以应验。刘备割据益州,任命周群为儒林校尉。曾劝说刘备攻汉中必定不利,事后得到应验,被举荐为茂才。', - dongzhao:'董昭(156年-236年7月4日),字公仁,济阴定陶(今山东省菏泽市定陶区)人。东汉末年曹魏谋士、重臣、开国元勋。董昭年轻时被举为孝廉,后担任袁绍帐下参军。多有战功,但是袁绍听信谗言,董昭不得已离开袁绍投奔张杨。张杨率军迎接汉献帝时,董昭随行,并拜为议郎。后与曹操在洛阳相见,又建议曹操将汉献帝迎接到许昌。董昭自此成为曹操的谋士。建安年间(198年)历任河南尹、冀州牧、徐州牧、魏郡太守等职,多有功劳,深受曹操器重。曹操受封魏公、魏王的谋划都是出自董昭之手。曹丕继魏王位后,董昭任将作大匠。曹丕称帝后,升任大鸿胪。此后先后担任侍中、太常、光禄大夫、太仆等重要职位。魏明帝曹叡即位后转任卫尉。太和六年(232年)升任司徒。青龙四年(236年)卒,时年八十一,谥曰定。', - nanhualaoxian:'南华老仙,是古典小说《三国演义》中的虚拟人物。其原型来自道教典籍中对庄子的封号,又称“南华仙人”、“南华真人”等。在古典小说《三国演义》通行本的第一回中,描述了南华老仙将《太平要术》赠送给张角的情节。', - chenzhen:'陈震(?—公元235年),字孝起。荆州南阳郡(今河南南阳)人。三国时期蜀汉官员。刘备领荆州牧时,辟陈震为从事。后随刘备入蜀,为蜀郡北部都尉、汶山太守、犍为太守。建兴三年(225年),拜尚书,迁尚书令。建兴七年(229年),孙权称帝。蜀汉以陈震为卫尉,前往祝贺,与孙权开坛歃盟,交分天下。还蜀,封城阳亭侯。建兴十三年(235年),卒。', - nanhualaoxian:'南华老仙,其原型来自道教典籍中对庄子的封号,又称“南华仙人”、“南华真人”等。在古典小说《三国演义》通行本的第一回中,描述了南华老仙将《太平要术》赠送给张角的情节。', - hucheer:'胡车儿(生卒年不详),东汉末年武将,初从张绣,为其心腹猛将,勇冠三军,与贾诩交情甚佳。宛城大战后,张绣投降曹操,曹操爱胡车儿之骁勇,手以黄金与之。后因曹操私纳张绣亡叔张济的遗孀邹氏,张绣深感其辱,欲杀曹操,与贾诩商议后决心反曹。《三国演义》中,作者考虑到典韦的勇猛,便增加了令胡车儿盗走典韦的双戟的情节。最终典韦、曹昂(曹操长子)、曹安民(曹操侄子)皆死于此次战斗。野史说胡车儿跟随曹操征战,被赵云在长坂坡上红枪挑死。', - simashi:'司马师(208年~255年3月23日),字子元,河内温县(今河南省温县)人。三国时期曹魏权臣,西晋王朝的奠基人之一,晋宣帝司马懿与宣穆皇后张春华的长子,晋文帝司马昭的同母兄,晋武帝司马炎的伯父。司马师沉着坚强,雄才大略,早年与夏侯玄、何晏齐名。高平陵政变后,以功封长平乡侯,旋加卫将军。司马懿死后,以抚军大将军辅政,独揽朝廷大权,次年升为大将军。掌权后,他制定选拔官吏的法规,命百官推荐贤才,整顿纲纪,使其各有职掌,朝野肃然。司马师也有卓越的军事才能,曾用计于新城之战击溃吴国诸葛恪的大军。嘉平六年(254年),魏帝曹芳与中书令李丰等人密谋除司马师,事情泄露,司马师杀死参与者,迫郭太后废曹芳,改立高贵乡公曹髦为帝。次年,亲自率兵平定毌丘俭、文钦之乱。回师途中病死,时年四十八岁,谥号“忠武”。后被追尊为晋景王。西晋建立后,被追尊为景皇帝,庙号世宗。', - yanghuiyu:'羊徽瑜(214年-278年),泰山南城(今山东新泰)人,晋景帝司马师第三任妻子。羊徽瑜出身官宦世家泰山羊氏,她是南阳太守羊续的孙女,上党太守羊衜之女;其母为东汉名士左中郎将蔡邕之女、蔡文姬的姐妹。羊徽瑜聪慧贤德,嫁给司马师后未有子女。以司马师之弟司马昭的次子司马攸为继子。司马师死后,司马攸侍奉羊徽瑜非常孝顺。泰始元年(265年),司马昭长子司马炎受禅登基,建立西晋,追谥伯父司马师为景皇帝。泰始二年(266年),尊奉羊徽瑜为景皇后,因居弘训宫,故称弘训太后。咸宁四年(278年),羊徽瑜去世,时年六十五岁,谥号景献皇后,与司马师合葬峻平陵。', - dingyuan:'丁原(?—189年),字建阳,兖州泰山郡南城县(山东省平邑县郑城镇)人。东汉末年军阀,官拜执金吾、并州刺史。任并州刺史期间,他亲近、善待主簿吕布,又调遣部下张杨、张辽等名将到洛阳任职。汉灵帝驾崩后,带兵进入洛阳,担任执金吾,并与大将军何进谋划诛杀十常侍,但不久事情败露,何进被宦官杀死。在宦官被诛灭之后,丁原与军阀董卓在废帝问题上意见不合产生矛盾,于是董卓诱使吕布将其杀害,其势力亦被吞并。', - furong:'傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”', - zhengxuan:'郑玄(127年-200年),字康成。北海郡高密县(今山东省高密市)人。东汉末年儒家学者、经学大师。郑玄曾入太学攻《京氏易》、《公羊春秋》及《三统历》、《九章算术》,又从张恭祖学《古文尚书》、《周礼》和《左传》等,最后从马融学古文经。游学归里之后,复客耕东莱,聚徒授课,弟子达数千人,家贫好学,终为大儒。党锢之祸起,遭禁锢,杜门注疏,潜心著述。晚年守节不仕,却遭逼迫从军,最终病逝于元城,年七十四。郑玄治学以古文经学为主,兼采今文经学。他遍注儒家经典,以毕生精力整理古代文化遗产,使经学进入了一个“小统一时代”。著有《天文七政论》、《中侯》等书,共百万余言,世称“郑学”,为汉代经学的集大成者。唐贞观年间,列郑玄于二十二“先师”之列,配享孔庙。宋代时被追封为高密伯。后人建有郑公祠以纪念。', - dengzhi:'邓芝(178年-251年),字伯苗。义阳郡新野县(今河南新野)人。东汉名将邓禹之后,三国时期蜀汉重臣。邓芝早年曾被预言能位至大将,后被刘备任为郫令,升迁为广汉太守。因任官公廉且有治绩,被征入朝为尚书。刘备逝世后,奉命出使吴国,成功修复两国关系,并深为吴大帝孙权所赏识。建兴六年(228年),丞相诸葛亮策划北伐,命邓芝与大将赵云佯攻郿城,以吸引魏国曹真军主力。建兴十二年(234年),迁前军师、前将军,领兖州刺史,封阳武亭侯,不久督领江州。延熙六年(243年),迁车骑将军,后授假节。又率军平定涪陵叛乱。延熙十四年(251年),邓芝病逝。邓芝性格正直、简单,不刻意修饰情绪。他为将二十多年,赏罚明断,体恤士卒。身上的衣食取自官府,从未经营过私产,妻儿甚至还有忍饥挨饿之时,死时家中也没有多余财物。', - yangyi:'杨仪(?-235年),字威公,襄阳(今湖北襄阳)人,三国时期蜀汉官员。最初为荆州刺史傅群的主簿,后投奔关羽,任为功曹。关羽遣其至成都,大受刘备赞赏,擢为尚书。因与尚书令刘巴不和,调为弘农太守。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。诸葛亮在生前定蒋琬继己任,杨仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。', - dongcheng:'董承(?~200年),字号不详,冀州河间人(今河北献县)人。东汉末年外戚大臣,汉灵帝母亲董太后侄子,汉献帝嫔妃董贵人之父。初从西凉军,为董卓女婿牛辅部曲。护卫汉献帝刘协从长安东归洛阳,拜为卫将军,受封列侯。建安四年(199年),拜车骑将军。自称领受汉献帝衣带诏,联合刘备、种辑、吴子兰、王子服、吴硕等人密谋诛杀曹操。五年正月,图谋泄露,董承诸人及董贵人全部遇害。', - chendeng:'陈登(163—201),字元龙,下邳淮浦(今江苏涟水西)人。东汉末年将领、官员。沛相陈珪之子。为人爽朗,性格沈静,智谋过人,少年时有扶世济民之志,并且博览群书,学识渊博。二十五岁时,举孝廉,任东阳县长。虽然年轻,但他能够体察民情,抚弱育孤,深得百姓敬重。后来,徐州牧陶谦提拔他为典农校尉,主管一州农业生产。他亲自考察徐州的土壤状况,开发水利,发展农田灌溉,使汉末迭遭破坏的徐州农业得到一定程度的恢复,百姓们安居乐业,“秔稻丰积”。建安初奉使赴许,向曹操献灭吕布之策,被授广陵太守。以灭吕布有功,加伏波将军。又迁东城太守。年三十九卒。其子陈肃,魏文帝时追陈登之功,为郎中。', - yangbiao:'杨彪(142年-225年),字文先。弘农郡华阴县(今陕西华阴)人。东汉末年名臣,太尉杨赐之子、名士杨修之父。杨彪少年时受家学熏陶,初举孝廉、茂才。其后征拜为议郎,参与续写《东观汉记》。任京兆尹时,揭发黄门令王甫的贪赃行为,使其被定罪诛杀。累任侍中、五官中郎将、卫尉等职。汉献帝时,遍历三公(司空、司徒、太尉)之职。权臣董卓意图迁都时,他据理力争。献帝东迁时,杨彪尽节护主。曹操挟献帝定都许县后,将杨彪下狱,获释后又任太常。他见汉室衰微,便诈称脚疾,不理世事。曹魏建立后,拒绝出任太尉,改光禄大夫,待以客礼。黄初六年(225年),杨彪去世,年八十四。其著作现仅存《答曹公书》一篇。', - zhangyì:'张翼(?-264年),字伯恭,益州犍为郡武阳县人。三国时期蜀汉将领。历任梓潼、广汉、蜀郡三郡太守,出任庲降都督,后随诸葛亮和姜维北伐,官至左车骑将军,领冀州刺史。初封关内侯,进爵都亭侯。蜀汉灭亡后,魏将钟会密谋造反,成都大乱,张翼亦为乱兵所杀。张翼是蜀汉第三任庲降都督,由于执法严厉,不得南夷欢心。在北伐上,张翼认为国小民疲,不应滥用武力,是蜀汉朝廷当时极少敢当朝和姜维争辩北伐问题的大臣。', - jiakui:'贾逵(174年—228年),本名贾衢,字梁道,河东襄陵人(今山西临汾县)。汉末三国时期魏国名臣,西晋开国功臣贾充父亲。初为并州郡吏,迁渑池县令,拜弘农太守,历仕曹操、曹丕、曹叡三世,是曹魏政权中具有军政才干的人物,终其一生为魏国统一事业作出卓越贡献。担任豫州刺史期间,兴修水利,凿通运河二百余里,时称“贾侯渠”,便利民生。随同曹丕伐吴,进封阳里亭侯,加号建威将军。石亭之战,率军救出曹休。太和二年,去世,赠本官,谥号为肃,《唐会要》将其尊为魏晋八君子之一。', - shenpei:'审配(?-204年),字正南,魏郡阴安(今河北清丰北)人。为人正直, 袁绍领冀州,审配被委以腹心之任,并总幕府。河北平定,袁绍以审配、逢纪统军事,审配恃其强盛,力主与曹操决战。曾率领弓弩手大破曹军于官渡。官渡战败,审配二子被俘,反因此受谮见疑,幸得逢纪力保。袁绍病死,审配等矫诏立袁尚为嗣,导致兄弟相争,被曹操各个击破。曹操围邺,审配死守数月,终城破被擒,拒不投降,慷慨受死。', - hujinding:'胡金定,女,传说中关羽之妻。关索之母,配偶关羽,出处《花关索传》和元代《三国志评话》民间传说人物。', + characterIntro: { + lizhaojiaobo: + "李昭(?—约公元260年),三国时期曹魏官吏,官拜冗从仆射,为魏帝曹髦的亲信。
    焦伯,三国时期人物,魏帝曹髦护卫,官拜黄门从官。
    曹髦见自己权力威势日渐削弱,感到不胜忿恨,于公元260年(甘露五年)五月初六夜里,令李昭和焦伯等在陵云台布署甲士,出讨司马昭,但最终失败,曹髦为成济所弑,李昭和焦伯等应该也战死。在《三国演义》里,焦伯挺枪出战成济,亦被成济所杀。", + chengji: + "成济(?~260年6月21日),三国时期曹魏官员。官至太子舍人。在魏帝曹髦起兵讨司马昭时,受到司马昭之心腹贾充指使,刺死曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。", + yangfeng: + "杨奉(?-197年/198年),东汉末年将领。杨奉早年参加白波军起义,曾经帮助李傕对抗郭汜,后来背叛李傕。兴平二年,加号兴义将军,护送汉献帝刘协东归雒阳,颇有功勋,加号车骑将军,屯兵于梁县。建安元年,随着汉献帝迁都许县,失去权力,先后依附于袁术、吕布,劫掠徐州和扬州地区。建安二年(一说三年),带兵进犯刘备领地,被刘备诱杀。", + muludawang: + "古典小说《三国演义》中的虚构人物,八纳洞主,孟获盟友。擅驱兽法,能行风雨,控制猛兽并指挥它们作战。在法术帮助下最初对蜀军取得一些胜利,但在诸葛亮的喷火木兽将他的动物吓跑后战败,最后死于乱军之中。", + laimin: "来敏(165年—261年),字敬达,义阳新野人,东汉太中大夫来歙之后,司空来艳之子,三国时期蜀汉官员。东汉末年,逢董卓之乱,来敏跟随姐夫黄琬到荆州避难,黄琬是刘璋祖母的侄子,来敏又与姐姐来氏入蜀,被刘璋引为宾客。来敏喜欢读书,尤其喜欢《左氏春秋》。刘备平定益州后,以来敏为典学校尉,后立太子,来敏为家令。刘禅继位后,任命来敏为虎贲中郎将,诸葛亮驻汉中,请来敏为军祭酒、辅军将军。却因其口出狂言而被罢官,诸葛亮死后,来敏历任大长秋、光禄大夫、执慎将军等职,期间多次因说错话而被免官,蜀汉景耀年间,来敏去世,时年九十七岁。", + shichangshi: + "十常侍,指中国东汉(公元25年—220年)灵帝时期(168年-189年)操纵政权的十二个宦官:张让、赵忠、夏恽、郭胜、孙璋、毕岚、栗嵩、段珪、高望、张恭、韩悝、宋典(在小说《三国演义》里,十常侍指的是指张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人),他们都任职中常侍。玩弄小皇帝于股掌之中,以至灵帝称“张常侍是我父,赵常侍是我母”。十常侍自己横征暴敛,卖官鬻爵,他们的父兄子弟遍布天下,横行乡里,祸害百姓,无官敢管。人民不堪剥削、压迫,纷纷起来反抗。当时一些比较清醒的官吏,已看出宦官集团的黑暗腐败,导致大规模农民起义的形势。郎中张钧在给皇帝的奏章中明确指出,黄巾起义是外戚宦官专权逼出来的,他说:“张角所以能兴兵作乱,万人所以乐附之者,其源皆由十常侍多放父兄、子弟、婚宗、宾客典据州郡,辜确财利,侵略百姓,百姓之怨无所告诉,故谋议不轨,聚为‘盗贼’。”后被曹操、袁绍所歼。", + sunzhang: + "孙璋(?-189年?)东汉末期汉灵帝的宦官,官居中常侍,为十常侍之一,在张让、赵忠之下位居第三。光熹元年(189年),张让、赵忠、段珪等诛杀何进,袁绍率军入宫,诛杀孙璋。", + bilan: "毕岚(?—189),东汉宦官,十常侍之一。十常侍朋比为奸,祸乱朝纲,制造出党锢之祸,后被袁绍诛杀。另外,毕岚曾制造翻车,用于取河水洒路。", + xiayun: "夏恽(?—189),东汉宦官,十常侍之一。后被袁绍、曹操诛于翠花楼前。", + hankui: "韩悝(?—189),东汉宦官,十常侍之一。后被袁绍所诛。", + lisong: "栗嵩,东汉宦官,十常侍之一,与张让等人均一同任职中常侍。", + duangui: + "段珪(?—189),东汉宦官,十常侍之一。段珪与张让、赵忠等人朋比为奸,党同伐异,横征暴敛,卖官鬻爵,引起了以何进为首的外戚集团的不满。何进谋诛宦官,却不纳曹操、陈琳之谏,多结外镇军阀,翘首京师,与袁绍等谋诛宦竖。终于事泄,被宦官集团查知。张让、段珪等人先下手为强,斩杀何进于嘉德殿前,却也引起了京师的变乱。袁绍等人趁机带兵冲入皇宫,大肆诛杀太监。洛阳卫军变乱后,段珪与张让等人劫持少帝刘辩、陈留王刘协出逃,后被杀。", + guosheng: + "郭胜,南阳宛(今河南南阳)人。汉灵帝时为中常侍,与张让、赵忠等狼狈为奸,并皆封侯。曾助同乡何进、何太后贵幸。后被袁绍等人率兵诛灭。", + gaowang: + "高望(?~189年),京兆人,东汉宦官,十常侍之一,为小黄门兼任尚药监,颇得皇子刘辩的信任。中平六年(189年),张让等人杀害大将军何进,袁绍与王匡等人率兵杀入雒阳端门,在承明堂上斩杀中常侍高望。", + qianzhao: + "牵招(?—231年),字子经,安平郡观津县(今河北省武邑县)人。三国时期曹魏名将。牵招早年师从乐隐,与刘备成为刎颈之交。投靠冀州牧袁绍,担任冀州从事,统领乌丸突骑。袁绍死后,跟随冀州刺史袁尚,受到并州牧高干加害,投奔丞相曹操,授军谋掾。从平乌丸,出任护乌丸校尉。举茂才出身,从平汉中,授中护军。拜平虏校尉,平定东莱郡叛乱。魏文帝曹丕时期,授护鲜卑校尉,驻扎昌平,迁右中郎将、雁门太守,遏制鲜卑轲比能发展壮大。魏明帝即位,赐爵关内侯,营救护乌丸校尉田豫。太和五年,去世。", + fuqian: "傅佥(?~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。", + wangjun: + "王濬(207年~286年),字士治,小名阿童,弘农郡湖县(今河南省灵宝市阌乡)人。西晋时期名将。王濬出身世家,博学多闻,容颜英俊,多谋善战。举秀才出身,起家河东郡从事。泰始八年(272年),担任广汉太守,平定益州叛乱,迁益州刺史。利用长江上游地势之利,修造战船,组建强大的水军。上书晋武帝,促成晋灭吴之战。咸宁六年(280年),率兵顺流而下,熔毁横江铁链,攻克丹阳郡,率先攻取石头城,接受吴末帝孙皓投降,完成西晋统一大业。凭借功勋,拜辅国将军、步兵校尉,册封襄阳侯。为避猜忌,纵情享受,累迁特进、抚军大将军、开府仪同三司、散骑常侍、后军将军等。太康六年十二月(286年1月18日),王濬去世,享年八十岁,谥号为“武”,安葬于柏谷山。", + yangfu: "杨阜(172年—244年),字义山,汉天水冀县(今甘谷县东南)人。三国时期曹魏名臣。汉献帝建安初年,任凉州从事,旋拜安定长史;韦康任刺史后辟为别驾,改任州参军;后因讨马超有功,赐爵关内侯。曹操征汉中时,杨阜担任益州刺史,回来后又担任武都太守。魏明帝时,由将作大匠改少府。杨阜不但卓识远见,而且刚正不阿,敢于直言,对朝廷弊政多有诤谏,六次进言谏魏明帝应勤政爱民,魏明帝对他颇有敬畏之心。杨阜勤政廉洁,在宫内担任少府时,专管宝器、珍膳、衣物等,而他死后则家无馀财。皇帝让杨阜的孙子杨豹继任了少府之职。原甘谷县文昌宫西侧有杨氏家祠,内悬“两代尚书”匾额。", + ruanhui: + "阮氏女,是指三国时期曹魏名士许允之妻阮氏,陈留尉氏人。阮氏女是中国古代四大丑女之一,貌丑而见识非凡。她出身士族之家,是卫尉阮共(字伯彦)之女、阮侃(字德如)之妹。嫁与许允后生有二子:许奇,官至司隶校尉;许猛,官至幽州刺史。", + peixiu: "裴秀(224年-271年4月3日),字季彦。河东郡闻喜县(今山西省闻喜县)人。[1]魏晋时期名臣、地图学家,东汉尚书令裴茂之孙、曹魏光禄大夫裴潜之子。出身河东裴氏,少年时便颇有名气,后被大将军曹爽辟为掾属,袭爵清阳亭侯,又迁黄门侍郎。高平陵之变后,因是曹爽的故吏而被罢免。此后历任廷尉正、安东将军及卫将军司马,参与谋划军国之政,参与平定诸葛诞叛乱。因功转任尚书,进封鲁阳乡侯。魏元帝继位后,进爵鲁阳县侯,任尚书仆射。咸熙元年(264年),受命负责修改官制,又提议恢复五等爵制。五等制恢复后,获封济川侯。他建议立司马炎为世子,司马炎继位晋王后,拜裴秀为尚书令、右光禄大夫。西晋建立后,加左光禄大夫,封钜鹿郡公。泰始三年(267年),升任司空。泰始七年(271年),裴秀因服食寒食散后饮冷酒而逝世,年四十八,谥号“元”。有文集三卷。裴秀作《禹贡地域图》,开创了中国古代地图绘制学。李约瑟称他为“中国科学制图学之父”,与古希腊著名地图学家托勒密齐名,是世界古代地图学史上东西辉映的两颗灿烂明星。为纪念这位中国地图科学创始人而设立的“裴秀奖”,每两年评选一次,是中国地图学界最高奖项。由于他的贡献突出,联合国天文组织将月球正面的一个环形山命名为“裴秀环形山”,", + liucheng: "游卡桌游的原创人物。设定为黄忠的妻子。", + jiangwan: + "蒋琬(?-246年),字公琰。零陵郡湘乡县人。三国时期蜀汉政治家,与诸葛亮、董允、费祎合称“蜀汉四相”。蒋琬最初随刘备入蜀,为广都县长。因其不理政事,惹怒刘备,在诸葛亮的劝说下才免于一死。后重获启用,受到诸葛亮的悉心培养,累官丞相长史兼抚军将军。建兴十二年(234年),诸葛亮去世,蒋琬继其执政,拜尚书令,又加行都护、假节,领益州刺史,再迁大将军,录尚书事,封安阳亭侯。延熙元年(238年),受命开府,加大司马,总揽蜀汉军政。曾制定由水路进攻曹魏的计划,但未被采纳。延熙九年(246年),蒋琬病逝,谥号为恭。", + sunhanhua: + "孙寒华,三国时女仙。梁·陶弘景《真诰》卷一三、五代·杜光庭《墉城集仙录》卷七:其父孙贲为孙权堂兄,寒华少时与杜契有私情,后从杜契受玄白之要,颜容日少。周旋吴越诸山十馀年,得道仙去。《鉴后集》卷四:一云即吴大帝孙权之女。于茅山修道,道成,冲虚而去,因号其山为华姥山。山在茅山崇禧观前。《神异典》卷二五九人于明代,误。", + yanpu: "阎圃,生卒年不详,是益州巴西安汉(今四川省南充市)人。张鲁割据巴、汉,就以阎圃为功曹。东汉末年人物,本为张鲁部下谋士,后随张鲁一同投降曹操,封平乐乡侯。", + mayuanyi: + "马元义(?—184年6月7日),东汉末年黄巾之乱的组织者之一,是黄巾大方首领。光和六年(183年),马元义奉黄巾军首领张角之命,筹划起事的准备工作。马元义聚集荆州、扬州信徒数万人约定于邺城相会,并收买中常侍封谞、徐奉等为内应,准备于次年(甲子年)三月初五(戊申日)内外同时起事。由于张角弟子济南人唐周的告密,马元义于于中平元年(184年)正月在河内郡山阳县被捕,送往洛阳车裂,同时被杀的还有教众近千人。由于马元义的被杀,迫使张角提前于二月起兵发动叛乱。", + simafu: "司马孚(180年-272年4月3日),字叔达。河内郡温县(今河南温县)人。三国曹魏至西晋初年重臣,西晋宗室,东汉京兆尹司马防第三子,晋宣帝司马懿之弟。自曹操时代起,司马孚就任文学掾,而后历仕魏国五代皇帝,累迁至太傅。司马孚在“高平陵事变”之际,协助司马懿控制京师,诛杀曹爽一党。后又督军成功防御吴、蜀的进攻,为司马氏政权的稳固多有功劳。但他性格十分谨慎,自司马懿执掌大权起,便逐渐引退,更未直接参与司马氏废立魏帝的谋划。西晋代魏后,司马孚进拜太宰,封安平王。晋武帝司马炎对他十分尊宠,但他并不以此为荣,至死仍以魏臣自称。泰始八年二月壬辰日(272年4月3日),司马孚去世,年九十三。武帝为其举哀三日,葬礼规格比照东汉东平献王刘苍,赐谥献王。", + sunchen: + "孙綝(231年-259年1月18日),字子通,吴郡富春(今浙江杭州市富阳区)人。三国时期吴国宗室、权臣,昭义中郎将孙静曾孙、定武中郎将孙暠之孙、安民都尉孙绰的儿子。门荫入仕,初任偏将军。太平元年(256年),升任侍中、武卫将军、都督中外诸军事。掌权以后,诛杀大司马滕胤、骠骑将军吕据等重臣,升任大将军,册封永宁县侯。嗜好杀戮,与皇帝孙亮的矛盾激化,最终废黜孙亮,拥立琅琊王孙休即位,累迁丞相、荆州牧。永安元年十二月(259年1月),在左将军张布的协助下,遭到皇帝孙休捕杀,时年二十八岁,削除宗籍,改姓故氏。", + qiaozhou: + "谯周(201年-270年),字允南,巴西郡西充国县(今四川西充县槐树镇)人。三国时期蜀汉大臣、学者、儒学家、史学家。幼年丧父,少读典籍,精研六经,颇晓天文,成为蜀地大儒之一,门下有陈寿、罗宪等学生。诸葛亮担任益州牧时,授劝学从事。诸葛亮死后,不顾朝令,前往奔丧。后主刘禅册立太子时,授太子仆,迁太子家令、光禄大夫。反对姜维北伐,著《仇国论》,力陈北伐之失。炎兴元年(263年),邓艾攻打成都时期,力劝刘禅投降,“有全国之功”,投降魏国后,受封阳城亭侯,迁骑都尉。泰始六年(270年),授散骑常侍,同年去世,时年七十岁。", + gongsunkang: + "公孙康(生卒年不详),辽东襄平(今辽宁辽阳)人。东汉末年辽东地区割据军阀,辽东太守公孙度长子(一作庶子)、车骑将军公孙恭之兄。公孙康在其父死后继任辽东太守。建安十二年(207年),擒斩图谋不轨的袁尚、袁熙兄弟,将其首级献予曹操,被拜为左将军,封襄平侯。建安十四年(209年),公孙康大破高句丽,陷其国都,并讨伐韩濊,设置带方郡。死后因二子年幼,由公孙恭继任。曹丕称帝后,被追赠为大司马。", + zhouqun: + "周群(生卒年不详),字仲直,巴西阆中(今四川阆中)人。周群年少时随父周舒学习占验天算之术。后来刘璋聘请周群为师友从事,其预言大多得以应验。刘备割据益州,任命周群为儒林校尉。曾劝说刘备攻汉中必定不利,事后得到应验,被举荐为茂才。", + dongzhao: + "董昭(156年-236年7月4日),字公仁,济阴定陶(今山东省菏泽市定陶区)人。东汉末年曹魏谋士、重臣、开国元勋。董昭年轻时被举为孝廉,后担任袁绍帐下参军。多有战功,但是袁绍听信谗言,董昭不得已离开袁绍投奔张杨。张杨率军迎接汉献帝时,董昭随行,并拜为议郎。后与曹操在洛阳相见,又建议曹操将汉献帝迎接到许昌。董昭自此成为曹操的谋士。建安年间(198年)历任河南尹、冀州牧、徐州牧、魏郡太守等职,多有功劳,深受曹操器重。曹操受封魏公、魏王的谋划都是出自董昭之手。曹丕继魏王位后,董昭任将作大匠。曹丕称帝后,升任大鸿胪。此后先后担任侍中、太常、光禄大夫、太仆等重要职位。魏明帝曹叡即位后转任卫尉。太和六年(232年)升任司徒。青龙四年(236年)卒,时年八十一,谥曰定。", + nanhualaoxian: + "南华老仙,是古典小说《三国演义》中的虚拟人物。其原型来自道教典籍中对庄子的封号,又称“南华仙人”、“南华真人”等。在古典小说《三国演义》通行本的第一回中,描述了南华老仙将《太平要术》赠送给张角的情节。", + chenzhen: + "陈震(?—公元235年),字孝起。荆州南阳郡(今河南南阳)人。三国时期蜀汉官员。刘备领荆州牧时,辟陈震为从事。后随刘备入蜀,为蜀郡北部都尉、汶山太守、犍为太守。建兴三年(225年),拜尚书,迁尚书令。建兴七年(229年),孙权称帝。蜀汉以陈震为卫尉,前往祝贺,与孙权开坛歃盟,交分天下。还蜀,封城阳亭侯。建兴十三年(235年),卒。", + nanhualaoxian: + "南华老仙,其原型来自道教典籍中对庄子的封号,又称“南华仙人”、“南华真人”等。在古典小说《三国演义》通行本的第一回中,描述了南华老仙将《太平要术》赠送给张角的情节。", + hucheer: + "胡车儿(生卒年不详),东汉末年武将,初从张绣,为其心腹猛将,勇冠三军,与贾诩交情甚佳。宛城大战后,张绣投降曹操,曹操爱胡车儿之骁勇,手以黄金与之。后因曹操私纳张绣亡叔张济的遗孀邹氏,张绣深感其辱,欲杀曹操,与贾诩商议后决心反曹。《三国演义》中,作者考虑到典韦的勇猛,便增加了令胡车儿盗走典韦的双戟的情节。最终典韦、曹昂(曹操长子)、曹安民(曹操侄子)皆死于此次战斗。野史说胡车儿跟随曹操征战,被赵云在长坂坡上红枪挑死。", + simashi: + "司马师(208年~255年3月23日),字子元,河内温县(今河南省温县)人。三国时期曹魏权臣,西晋王朝的奠基人之一,晋宣帝司马懿与宣穆皇后张春华的长子,晋文帝司马昭的同母兄,晋武帝司马炎的伯父。司马师沉着坚强,雄才大略,早年与夏侯玄、何晏齐名。高平陵政变后,以功封长平乡侯,旋加卫将军。司马懿死后,以抚军大将军辅政,独揽朝廷大权,次年升为大将军。掌权后,他制定选拔官吏的法规,命百官推荐贤才,整顿纲纪,使其各有职掌,朝野肃然。司马师也有卓越的军事才能,曾用计于新城之战击溃吴国诸葛恪的大军。嘉平六年(254年),魏帝曹芳与中书令李丰等人密谋除司马师,事情泄露,司马师杀死参与者,迫郭太后废曹芳,改立高贵乡公曹髦为帝。次年,亲自率兵平定毌丘俭、文钦之乱。回师途中病死,时年四十八岁,谥号“忠武”。后被追尊为晋景王。西晋建立后,被追尊为景皇帝,庙号世宗。", + yanghuiyu: + "羊徽瑜(214年-278年),泰山南城(今山东新泰)人,晋景帝司马师第三任妻子。羊徽瑜出身官宦世家泰山羊氏,她是南阳太守羊续的孙女,上党太守羊衜之女;其母为东汉名士左中郎将蔡邕之女、蔡文姬的姐妹。羊徽瑜聪慧贤德,嫁给司马师后未有子女。以司马师之弟司马昭的次子司马攸为继子。司马师死后,司马攸侍奉羊徽瑜非常孝顺。泰始元年(265年),司马昭长子司马炎受禅登基,建立西晋,追谥伯父司马师为景皇帝。泰始二年(266年),尊奉羊徽瑜为景皇后,因居弘训宫,故称弘训太后。咸宁四年(278年),羊徽瑜去世,时年六十五岁,谥号景献皇后,与司马师合葬峻平陵。", + dingyuan: + "丁原(?—189年),字建阳,兖州泰山郡南城县(山东省平邑县郑城镇)人。东汉末年军阀,官拜执金吾、并州刺史。任并州刺史期间,他亲近、善待主簿吕布,又调遣部下张杨、张辽等名将到洛阳任职。汉灵帝驾崩后,带兵进入洛阳,担任执金吾,并与大将军何进谋划诛杀十常侍,但不久事情败露,何进被宦官杀死。在宦官被诛灭之后,丁原与军阀董卓在废帝问题上意见不合产生矛盾,于是董卓诱使吕布将其杀害,其势力亦被吞并。", + furong: "傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”", + zhengxuan: + "郑玄(127年-200年),字康成。北海郡高密县(今山东省高密市)人。东汉末年儒家学者、经学大师。郑玄曾入太学攻《京氏易》、《公羊春秋》及《三统历》、《九章算术》,又从张恭祖学《古文尚书》、《周礼》和《左传》等,最后从马融学古文经。游学归里之后,复客耕东莱,聚徒授课,弟子达数千人,家贫好学,终为大儒。党锢之祸起,遭禁锢,杜门注疏,潜心著述。晚年守节不仕,却遭逼迫从军,最终病逝于元城,年七十四。郑玄治学以古文经学为主,兼采今文经学。他遍注儒家经典,以毕生精力整理古代文化遗产,使经学进入了一个“小统一时代”。著有《天文七政论》、《中侯》等书,共百万余言,世称“郑学”,为汉代经学的集大成者。唐贞观年间,列郑玄于二十二“先师”之列,配享孔庙。宋代时被追封为高密伯。后人建有郑公祠以纪念。", + dengzhi: + "邓芝(178年-251年),字伯苗。义阳郡新野县(今河南新野)人。东汉名将邓禹之后,三国时期蜀汉重臣。邓芝早年曾被预言能位至大将,后被刘备任为郫令,升迁为广汉太守。因任官公廉且有治绩,被征入朝为尚书。刘备逝世后,奉命出使吴国,成功修复两国关系,并深为吴大帝孙权所赏识。建兴六年(228年),丞相诸葛亮策划北伐,命邓芝与大将赵云佯攻郿城,以吸引魏国曹真军主力。建兴十二年(234年),迁前军师、前将军,领兖州刺史,封阳武亭侯,不久督领江州。延熙六年(243年),迁车骑将军,后授假节。又率军平定涪陵叛乱。延熙十四年(251年),邓芝病逝。邓芝性格正直、简单,不刻意修饰情绪。他为将二十多年,赏罚明断,体恤士卒。身上的衣食取自官府,从未经营过私产,妻儿甚至还有忍饥挨饿之时,死时家中也没有多余财物。", + yangyi: "杨仪(?-235年),字威公,襄阳(今湖北襄阳)人,三国时期蜀汉官员。最初为荆州刺史傅群的主簿,后投奔关羽,任为功曹。关羽遣其至成都,大受刘备赞赏,擢为尚书。因与尚书令刘巴不和,调为弘农太守。建兴三年(225年)任丞相参军,此后一直跟随诸葛亮战斗。亮卒,他部署安全退军。诸葛亮在生前定蒋琬继己任,杨仪仅拜中军师。建兴十三年(235年),因多出怨言,被削职流放至汉嘉郡。但杨仪仍不自省,又上书诽谤,言辞激烈,最后下狱,自杀身亡。", + dongcheng: + "董承(?~200年),字号不详,冀州河间人(今河北献县)人。东汉末年外戚大臣,汉灵帝母亲董太后侄子,汉献帝嫔妃董贵人之父。初从西凉军,为董卓女婿牛辅部曲。护卫汉献帝刘协从长安东归洛阳,拜为卫将军,受封列侯。建安四年(199年),拜车骑将军。自称领受汉献帝衣带诏,联合刘备、种辑、吴子兰、王子服、吴硕等人密谋诛杀曹操。五年正月,图谋泄露,董承诸人及董贵人全部遇害。", + chendeng: + "陈登(163—201),字元龙,下邳淮浦(今江苏涟水西)人。东汉末年将领、官员。沛相陈珪之子。为人爽朗,性格沈静,智谋过人,少年时有扶世济民之志,并且博览群书,学识渊博。二十五岁时,举孝廉,任东阳县长。虽然年轻,但他能够体察民情,抚弱育孤,深得百姓敬重。后来,徐州牧陶谦提拔他为典农校尉,主管一州农业生产。他亲自考察徐州的土壤状况,开发水利,发展农田灌溉,使汉末迭遭破坏的徐州农业得到一定程度的恢复,百姓们安居乐业,“秔稻丰积”。建安初奉使赴许,向曹操献灭吕布之策,被授广陵太守。以灭吕布有功,加伏波将军。又迁东城太守。年三十九卒。其子陈肃,魏文帝时追陈登之功,为郎中。", + yangbiao: + "杨彪(142年-225年),字文先。弘农郡华阴县(今陕西华阴)人。东汉末年名臣,太尉杨赐之子、名士杨修之父。杨彪少年时受家学熏陶,初举孝廉、茂才。其后征拜为议郎,参与续写《东观汉记》。任京兆尹时,揭发黄门令王甫的贪赃行为,使其被定罪诛杀。累任侍中、五官中郎将、卫尉等职。汉献帝时,遍历三公(司空、司徒、太尉)之职。权臣董卓意图迁都时,他据理力争。献帝东迁时,杨彪尽节护主。曹操挟献帝定都许县后,将杨彪下狱,获释后又任太常。他见汉室衰微,便诈称脚疾,不理世事。曹魏建立后,拒绝出任太尉,改光禄大夫,待以客礼。黄初六年(225年),杨彪去世,年八十四。其著作现仅存《答曹公书》一篇。", + zhangyì: + "张翼(?-264年),字伯恭,益州犍为郡武阳县人。三国时期蜀汉将领。历任梓潼、广汉、蜀郡三郡太守,出任庲降都督,后随诸葛亮和姜维北伐,官至左车骑将军,领冀州刺史。初封关内侯,进爵都亭侯。蜀汉灭亡后,魏将钟会密谋造反,成都大乱,张翼亦为乱兵所杀。张翼是蜀汉第三任庲降都督,由于执法严厉,不得南夷欢心。在北伐上,张翼认为国小民疲,不应滥用武力,是蜀汉朝廷当时极少敢当朝和姜维争辩北伐问题的大臣。", + jiakui: "贾逵(174年—228年),本名贾衢,字梁道,河东襄陵人(今山西临汾县)。汉末三国时期魏国名臣,西晋开国功臣贾充父亲。初为并州郡吏,迁渑池县令,拜弘农太守,历仕曹操、曹丕、曹叡三世,是曹魏政权中具有军政才干的人物,终其一生为魏国统一事业作出卓越贡献。担任豫州刺史期间,兴修水利,凿通运河二百余里,时称“贾侯渠”,便利民生。随同曹丕伐吴,进封阳里亭侯,加号建威将军。石亭之战,率军救出曹休。太和二年,去世,赠本官,谥号为肃,《唐会要》将其尊为魏晋八君子之一。", + shenpei: + "审配(?-204年),字正南,魏郡阴安(今河北清丰北)人。为人正直, 袁绍领冀州,审配被委以腹心之任,并总幕府。河北平定,袁绍以审配、逢纪统军事,审配恃其强盛,力主与曹操决战。曾率领弓弩手大破曹军于官渡。官渡战败,审配二子被俘,反因此受谮见疑,幸得逢纪力保。袁绍病死,审配等矫诏立袁尚为嗣,导致兄弟相争,被曹操各个击破。曹操围邺,审配死守数月,终城破被擒,拒不投降,慷慨受死。", + hujinding: + "胡金定,女,传说中关羽之妻。关索之母,配偶关羽,出处《花关索传》和元代《三国志评话》民间传说人物。", }, - characterTitle:{ - }, - card:{ - ly_piliche:{ - fullskin:true, + characterTitle: {}, + card: { + ly_piliche: { + fullskin: true, //vanish:true, - derivation:'liuye', - type:'equip', - subtype:'equip1', - distance:{attackFrom:-8}, - skills:['ly_piliche'], + derivation: "liuye", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -8 }, + skills: ["ly_piliche"], //destroy:'polu' }, - "wolong_card":{ - type:"takaramono", - fullskin:true, + wolong_card: { + type: "takaramono", + fullskin: true, //derivation:"pangdegong", }, - "fengchu_card":{ - type:"takaramono", - fullskin:true, + fengchu_card: { + type: "takaramono", + fullskin: true, //derivation:"pangdegong", }, - "xuanjian_card":{ - fullskin:true, - type:"takaramono", + xuanjian_card: { + fullskin: true, + type: "takaramono", //derivation:"pangdegong", }, - "shuijing_card":{ - fullskin:true, - type:"takaramono", + shuijing_card: { + fullskin: true, + type: "takaramono", //derivation:"pangdegong", }, - "rewrite_bagua":{ - derivation:"majun", + rewrite_bagua: { + derivation: "majun", //cardimage:"bagua", - fullskin:true, - type:"equip", - subtype:"equip2", - ai:{ - basic:{ - equipValue:7.5, + fullskin: true, + type: "equip", + subtype: "equip2", + ai: { + basic: { + equipValue: 7.5, }, }, - skills:["rw_bagua_skill"], + skills: ["rw_bagua_skill"], }, - "rewrite_baiyin":{ - derivation:"majun", - fullskin:true, + rewrite_baiyin: { + derivation: "majun", + fullskin: true, //cardimage:"baiyin", - type:"equip", - subtype:"equip2", - loseDelay:false, - onLose:function(){ - player.addTempSkill('rw_baiyin_skill_lose') + type: "equip", + subtype: "equip2", + loseDelay: false, + onLose: function () { + player.addTempSkill("rw_baiyin_skill_lose"); }, - skills:["rw_baiyin_skill"], - tag:{ - recover:1, + skills: ["rw_baiyin_skill"], + tag: { + recover: 1, }, - ai:{ - order:9.5, - equipValue:function(card,player){ - if(player.hp==player.maxHp) return 5; - if(player.countCards('h','rewrite_baiyin')) return 6; + ai: { + order: 9.5, + equipValue: function (card, player) { + if (player.hp == player.maxHp) return 5; + if (player.countCards("h", "rewrite_baiyin")) return 6; return 0; }, - basic:{ - equipValue:5, + basic: { + equipValue: 5, }, }, }, - "rewrite_lanyinjia":{ - derivation:"majun", + rewrite_lanyinjia: { + derivation: "majun", //cardimage:"lanyinjia", - fullskin:true, - type:"equip", - subtype:"equip2", - skills:["rw_lanyinjia","lanyinjia2"], - ai:{ - equipValue:6, - basic:{ - equipValue:1, + fullskin: true, + type: "equip", + subtype: "equip2", + skills: ["rw_lanyinjia", "lanyinjia2"], + ai: { + equipValue: 6, + basic: { + equipValue: 1, }, }, }, - "rewrite_renwang":{ - derivation:"majun", + rewrite_renwang: { + derivation: "majun", //cardimage:"renwang", - fullskin:true, - type:"equip", - subtype:"equip2", - skills:["rw_renwang_skill"], - ai:{ - basic:{ - equipValue:7.5, + fullskin: true, + type: "equip", + subtype: "equip2", + skills: ["rw_renwang_skill"], + ai: { + basic: { + equipValue: 7.5, }, }, }, - "rewrite_tengjia":{ - derivation:"majun", + rewrite_tengjia: { + derivation: "majun", //cardimage:"tengjia", - fullskin:true, - type:"equip", - subtype:"equip2", + fullskin: true, + type: "equip", + subtype: "equip2", //cardnature:"fire", - ai:{ - equipValue:function(card,player){ - if(player.hasSkillTag('maixie')&&player.hp>1) return 0; - if(player.hasSkillTag('noDirectDamage')) return 10; - if(get.damageEffect(player,player,player,'fire')>=0) return 10; - var num=3-game.countPlayer(function(current){ - return get.attitude(current,player)<0; - }); - if(player.hp==1) num+=4; - if(player.hp==2) num+=1; - if(player.hp==3) num--; - if(player.hp>3) num-=4; + ai: { + equipValue: function (card, player) { + if (player.hasSkillTag("maixie") && player.hp > 1) return 0; + if (player.hasSkillTag("noDirectDamage")) return 10; + if (get.damageEffect(player, player, player, "fire") >= 0) return 10; + var num = + 3 - + game.countPlayer(function (current) { + return get.attitude(current, player) < 0; + }); + if (player.hp == 1) num += 4; + if (player.hp == 2) num += 1; + if (player.hp == 3) num--; + if (player.hp > 3) num -= 4; return num; }, - basic:{ - equipValue:3, + basic: { + equipValue: 3, }, }, - skills:["rw_tengjia1","rw_tengjia2","rw_tengjia3","rw_tengjia4"], + skills: ["rw_tengjia1", "rw_tengjia2", "rw_tengjia3", "rw_tengjia4"], }, - "rewrite_zhuge":{ - derivation:"majun", + rewrite_zhuge: { + derivation: "majun", //cardimage:"zhuge", - distance:{ - attackFrom:-2, + distance: { + attackFrom: -2, }, - fullskin:true, - type:"equip", - subtype:"equip1", - ai:{ - equipValue:function(card,player){ - if(!game.hasPlayer(function(current){ - return player.canUse('sha',current)&&get.effect(current,{name:'sha'},player,player)>0; - })){ + fullskin: true, + type: "equip", + subtype: "equip1", + ai: { + equipValue: function (card, player) { + if ( + !game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) { return 1; } - if(player.hasSha()&&_status.currentPhase==player){ - if(player.getEquip('zhuge')||player.getCardUsable('sha')==0){ + if (player.hasSha() && _status.currentPhase == player) { + if (player.getEquip("zhuge") || player.getCardUsable("sha") == 0) { return 10; } } - var num=player.countCards('h','sha'); - if(num>1) return 6+num; - return 3+num; + var num = player.countCards("h", "sha"); + if (num > 1) return 6 + num; + return 3 + num; }, - basic:{ - equipValue:5, + basic: { + equipValue: 5, }, - tag:{ - valueswap:1, + tag: { + valueswap: 1, }, }, - skills:["rw_zhuge_skill"], + skills: ["rw_zhuge_skill"], }, }, - characterFilter:{ - simashi:function(mode){ - if(['boss','chess','tafang','stone'].includes(mode)) return false; - if(mode=='versus') return _status.mode!='three'; + characterFilter: { + simashi: function (mode) { + if (["boss", "chess", "tafang", "stone"].includes(mode)) return false; + if (mode == "versus") return _status.mode != "three"; return true; }, }, - skill:{ + skill: { //李昭焦伯 - mbzuoyou:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuanhuanji:true, - filterTarget(card,player,target){ - if(player.storage.mbzuoyou) return target.countCards('h'); + mbzuoyou: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuanhuanji: true, + filterTarget(card, player, target) { + if (player.storage.mbzuoyou) return target.countCards("h"); return true; }, - async content(event,trigger,player){ - const storage = player.storage.mbzuoyou, target = event.target; - if (event.name === 'mbzuoyou') player.changeZhuanhuanji('mbzuoyou'); + async content(event, trigger, player) { + const storage = player.storage.mbzuoyou, + target = event.target; + if (event.name === "mbzuoyou") player.changeZhuanhuanji("mbzuoyou"); if (!storage) { await target.draw(3); - await target.chooseToDiscard(2,true,'he'); - } - else { - await target.chooseToDiscard(target===player ? '佐佑' : `${get.translation(player)}对你发动了【佐佑】`, '请弃置一张手牌,然后获得1点护甲', true); + await target.chooseToDiscard(2, true, "he"); + } else { + await target.chooseToDiscard( + target === player ? "佐佑" : `${get.translation(player)}对你发动了【佐佑】`, + "请弃置一张手牌,然后获得1点护甲", + true + ); await target.changeHujia(1, null, true); } }, - mark:true, - marktext:'☯', - intro:{ - content(storage,player){ - if(!storage) return '转换技。出牌阶段限一次,你可以令一名角色摸三张牌,然后其弃置两张牌。'; - return '转换技。出牌阶段限一次,你可以令一名角色弃置一张手牌,然后其获得1点护甲。'; - } + mark: true, + marktext: "☯", + intro: { + content(storage, player) { + if (!storage) + return "转换技。出牌阶段限一次,你可以令一名角色摸三张牌,然后其弃置两张牌。"; + return "转换技。出牌阶段限一次,你可以令一名角色弃置一张手牌,然后其获得1点护甲。"; + }, }, - ai:{ - order(item,player){ - if(player.storage.mbzuoyou&&game.hasPlayer(current=>{ - return current!==player&&get.effect(current,'mbzuoyou',player,player)>0; - })) return get.order({name:'zengbin'})+0.1; + ai: { + order(item, player) { + if ( + player.storage.mbzuoyou && + game.hasPlayer((current) => { + return ( + current !== player && get.effect(current, "mbzuoyou", player, player) > 0 + ); + }) + ) + return get.order({ name: "zengbin" }) + 0.1; return 2; }, - result:{ - target(player,target){ - let eff=0; - if(player.storage.mbzuoyou) eff=target.hujia<5?1:0; - else eff=1; - if(target===player&&player.hasSkill('mbshishou')) eff/=10; + result: { + target(player, target) { + let eff = 0; + if (player.storage.mbzuoyou) eff = target.hujia < 5 ? 1 : 0; + else eff = 1; + if (target === player && player.hasSkill("mbshishou")) eff /= 10; return eff; }, - } + }, }, }, - mbshishou:{ - audio:2, - forced:true, - trigger:{player:'useSkillAfter'}, - filter(event,player){ - return event.skill==='mbzuoyou'&&!event.targets.includes(player); + mbshishou: { + audio: 2, + forced: true, + trigger: { player: "useSkillAfter" }, + filter(event, player) { + return event.skill === "mbzuoyou" && !event.targets.includes(player); }, - forced:true, - async content(event,trigger,player){ - await lib.skill.mbzuoyou.content({ - target: player, - }, {}, player); + forced: true, + async content(event, trigger, player) { + await lib.skill.mbzuoyou.content( + { + target: player, + }, + {}, + player + ); }, }, //成济 - mbkuangli:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return game.hasPlayer(current=>current!==player); + mbkuangli: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer((current) => current !== player); }, - forced:true, - group:['mbkuangli_target','mbkuangli_remove'], - async content(event,trigger,player){ - let targets = game.filterPlayer(current => current !== player).randomSort(); + forced: true, + group: ["mbkuangli_target", "mbkuangli_remove"], + async content(event, trigger, player) { + let targets = game.filterPlayer((current) => current !== player).randomSort(); targets = targets.slice(0, Math.ceil(Math.random() * targets.length)); targets.sortBySeat(); - player.line(targets, 'thunder'); - targets.forEach(current => { - current.addSkill('mbkuangli_mark'); + player.line(targets, "thunder"); + targets.forEach((current) => { + current.addSkill("mbkuangli_mark"); }); await game.asyncDelayx(); }, - subSkill:{ - target:{ - audio:'mbkuangli', - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - return event.target.hasSkill('mbkuangli_mark')&&[player,event.target].some(current=>current.countCards('he')); + subSkill: { + target: { + audio: "mbkuangli", + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return ( + event.target.hasSkill("mbkuangli_mark") && + [player, event.target].some((current) => current.countCards("he")) + ); }, - forced:true, - logTarget:'target', - usable:2, - async content(event,trigger,player){ + forced: true, + logTarget: "target", + usable: 2, + async content(event, trigger, player) { const target = trigger.target; - const playerCards = player.getCards('he', card => { - return lib.filter.cardDiscardable(card, player, 'mbkuangli'); + const playerCards = player.getCards("he", (card) => { + return lib.filter.cardDiscardable(card, player, "mbkuangli"); }); - if(playerCards.length>0) await player.discard(playerCards.randomGet()); - const targetCards = target.getCards('he', card => { - return lib.filter.cardDiscardable(card, target, 'mbkuangli'); + if (playerCards.length > 0) await player.discard(playerCards.randomGet()); + const targetCards = target.getCards("he", (card) => { + return lib.filter.cardDiscardable(card, target, "mbkuangli"); }); - if(targetCards.length>0) await target.discard(targetCards.randomGet()); + if (targetCards.length > 0) await target.discard(targetCards.randomGet()); await game.asyncDelayx(); await player.draw(); await game.asyncDelayx(); }, - ai:{ - effect:{ - player(card,player,target,current){ - if(!target) return; - const counttrigger=player.storage.counttrigger; - if(counttrigger&&counttrigger.mbkuangli_target&&counttrigger.mbkuangli_target>=lib.skill.mbkuangli_target.usable) return; - if(target.hasSkill('mbkuangli_mark')){ - if(get.attitude(player,target)>0) return 0.75; + ai: { + effect: { + player(card, player, target, current) { + if (!target) return; + const counttrigger = player.storage.counttrigger; + if ( + counttrigger && + counttrigger.mbkuangli_target && + counttrigger.mbkuangli_target >= lib.skill.mbkuangli_target.usable + ) + return; + if (target.hasSkill("mbkuangli_mark")) { + if (get.attitude(player, target) > 0) return 0.75; return 1.25; } - } - } + }, + }, }, }, - remove:{ - audio:'mbkuangli', - trigger:{player:'phaseEnd'}, - filter(event,player){ - return game.hasPlayer(current=>current.hasSkill('mbkuangli_mark')); + remove: { + audio: "mbkuangli", + trigger: { player: "phaseEnd" }, + filter(event, player) { + return game.hasPlayer((current) => current.hasSkill("mbkuangli_mark")); }, - forced:true, - async content(event,trigger,player){ - game.countPlayer(current=>{ - if(current.hasSkill('mbkuangli_mark')){ + forced: true, + async content(event, trigger, player) { + game.countPlayer((current) => { + if (current.hasSkill("mbkuangli_mark")) { player.line(current); - current.removeSkill('mbkuangli_mark'); + current.removeSkill("mbkuangli_mark"); } }); }, }, - mark:{ - mark:true, - marktext:'戾', - charlotte:true, - intro:{ - name:'狂戾', - name2:'狂戾', - content:'已拥有“狂戾”标记', - } + mark: { + mark: true, + marktext: "戾", + charlotte: true, + intro: { + name: "狂戾", + name2: "狂戾", + content: "已拥有“狂戾”标记", + }, }, }, }, - mbxiongsi:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return player.countCards('h')>=3; + mbxiongsi: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countCards("h") >= 3; }, - limited:true, - skillAnimation:true, - animationColor:'fire', - filterCard:true, - selectCard:[-1,-2], - async content(event,trigger,player){ - player.awakenSkill('mbxiongsi'); - const targets = game.filterPlayer(current => current !== player); + limited: true, + skillAnimation: true, + animationColor: "fire", + filterCard: true, + selectCard: [-1, -2], + async content(event, trigger, player) { + player.awakenSkill("mbxiongsi"); + const targets = game.filterPlayer((current) => current !== player); for (const target of targets) { - player.line(target, 'thunder'); + player.line(target, "thunder"); await target.loseHp(); } }, - ai:{ - order(item,player){ - if(get.effect(player,'mbxiongsi',player)<=0) return 1; - if(player.countCards('h')>3&&player.countCards('h',card=>{ - return player.hasValueTarget(card); - })>0) return 0.1; + ai: { + order(item, player) { + if (get.effect(player, "mbxiongsi", player) <= 0) return 1; + if ( + player.countCards("h") > 3 && + player.countCards("h", (card) => { + return player.hasValueTarget(card); + }) > 0 + ) + return 0.1; return 8; }, - result:{ - player(player){ - let eff=0; - game.countPlayer(current=>{ - let effx=get.effect(current,{name:'losehp'},player,player); - if(get.attitude(player,current)<-6&¤t.getHp()<=1) effx*=1.3; - eff+=effx; + result: { + player(player) { + let eff = 0; + game.countPlayer((current) => { + let effx = get.effect(current, { name: "losehp" }, player, player); + if (get.attitude(player, current) < -6 && current.getHp() <= 1) effx *= 1.3; + eff += effx; }); - eff*=player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=2?1.5:0.35; - eff-=player.getCards('h').map(card=>{ - if(lib.filter.cardDiscardable(card,player,'mbxiongsi')) return get.value(card); - return 0; - }).reduce((p,c)=>p+c,0); - if(eff>0) return 2; + eff *= + player.getHp() + + player.countCards("hs", (card) => player.canSaveCard(card, player)) <= + 2 + ? 1.5 + : 0.35; + eff -= player + .getCards("h") + .map((card) => { + if (lib.filter.cardDiscardable(card, player, "mbxiongsi")) + return get.value(card); + return 0; + }) + .reduce((p, c) => p + c, 0); + if (eff > 0) return 2; return -1; }, }, }, }, //SP母兵脸 - mbcuizhen:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + mbcuizhen: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&game.hasPlayer(current=>{ - return current!==player&¤t.hasEnabledSlot(1); - })&&get.mode()=='identity'; + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer((current) => { + return current !== player && current.hasEnabledSlot(1); + }) && + get.mode() == "identity" + ); }, - async cost(event,trigger,player){ - event.result = await player.chooseTarget(get.prompt('mbcuizhen'), '废除至多两名其他角色的武器栏', [1, 2], (card, player, target) => { - return target !== player && target.hasEnabledSlot(1); - }).set('ai', target => { - return -get.attitude(get.player(), target); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("mbcuizhen"), + "废除至多两名其他角色的武器栏", + [1, 2], + (card, player, target) => { + return target !== player && target.hasEnabledSlot(1); + } + ) + .set("ai", (target) => { + return -get.attitude(get.player(), target); + }) + .forResult(); }, - group:['mbcuizhen_inphase','mbcuizhen_draw'], - async content(event,trigger,player){ + group: ["mbcuizhen_inphase", "mbcuizhen_draw"], + async content(event, trigger, player) { const targets = event.targets.slice().sortBySeat(); for (const target of targets) { await target.disableEquip(1); } await game.asyncDelay(); }, - subSkill:{ - inphase:{ - audio:'mbcuizhen', - trigger:{ - player:'useCardToPlayered', + subSkill: { + inphase: { + audio: "mbcuizhen", + trigger: { + player: "useCardToPlayered", }, - filter(event,player){ - if(!player.isPhaseUsing()) return false; - if(!get.tag(event.card,'damage')) return false; - const target=event.target; - return target!==player&&target.countCards('h')>=target.getHp()&&target.hasEnabledSlot(1); + filter(event, player) { + if (!player.isPhaseUsing()) return false; + if (!get.tag(event.card, "damage")) return false; + const target = event.target; + return ( + target !== player && + target.countCards("h") >= target.getHp() && + target.hasEnabledSlot(1) + ); }, - prompt2:'废除其的武器栏', - logTarget:'target', - check(event,player){ - return get.attitude(player,event.target)<=0; + prompt2: "废除其的武器栏", + logTarget: "target", + check(event, player) { + return get.attitude(player, event.target) <= 0; }, - async content(event,trigger,player){ + async content(event, trigger, player) { await trigger.target.disableEquip(1); await game.asyncDelayx(); }, }, - draw:{ - audio:'mbcuizhen', - trigger:{player:'phaseDrawBegin2'}, - forced:true, - locked:false, - filter(event,player){ - return !event.numFixed&&game.hasPlayer(current=>{ - return current.hasDisabledSlot(1); - }); + draw: { + audio: "mbcuizhen", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + locked: false, + filter(event, player) { + return ( + !event.numFixed && + game.hasPlayer((current) => { + return current.hasDisabledSlot(1); + }) + ); }, - async content(event,trigger,player){ - trigger.num += Math.min(2, game.countPlayer(current => { - return current.countDisabledSlot(1); - })); + async content(event, trigger, player) { + trigger.num += Math.min( + 2, + game.countPlayer((current) => { + return current.countDisabledSlot(1); + }) + ); }, }, }, }, - mbkuili:{ - audio:2, - trigger:{ - player:'damageEnd', + mbkuili: { + audio: 2, + trigger: { + player: "damageEnd", }, - filter(event,player){ - return player.countCards('h')>0||event.source&&event.source.isIn()&&event.source.hasDisabledSlot(1); + filter(event, player) { + return ( + player.countCards("h") > 0 || + (event.source && event.source.isIn() && event.source.hasDisabledSlot(1)) + ); }, - forced:true, - async content(event,trigger,player){ - if (player.countCards('h') > 0) { - await player.chooseToDiscard(`溃离:请弃置${get.cnNumber(trigger.num)}张手牌`, trigger.num, true); + forced: true, + async content(event, trigger, player) { + if (player.countCards("h") > 0) { + await player.chooseToDiscard( + `溃离:请弃置${get.cnNumber(trigger.num)}张手牌`, + trigger.num, + true + ); } const source = trigger.source; if (source && source.isIn() && source.hasDisabledSlot(1)) { - player.line(source, 'green'); + player.line(source, "green"); await source.enableEquip(1, player); } }, - ai:{ - neg:true, - } + ai: { + neg: true, + }, }, //曹髦 史?! - mbqianlong:{ - audio:6, - trigger:{ - player:['mbqianlong_beginAfter','mbqianlong_addAfter','mbweitongAfter'], + mbqianlong: { + audio: 6, + trigger: { + player: ["mbqianlong_beginAfter", "mbqianlong_addAfter", "mbweitongAfter"], }, - filter(event,player){ - let skills=[]; - if(player.additionalSkills&&player.additionalSkills.mbqianlong) skills.addArray(player.additionalSkills.mbqianlong); - return player.countMark('mbqianlong')>=25*skills.length; + filter(event, player) { + let skills = []; + if (player.additionalSkills && player.additionalSkills.mbqianlong) + skills.addArray(player.additionalSkills.mbqianlong); + return player.countMark("mbqianlong") >= 25 * skills.length; }, - forced:true, - locked:false, - beginMarkCount:20, - maxMarkCount:100, - derivation:['mbcmqingzheng','mbcmjiushi','mbcmfangzhu','mbjuejin'], - addMark(player,num){ - num = Math.min(num, lib.skill.mbqianlong.maxMarkCount - player.countMark('mbqianlong')); - player.addMark('mbqianlong', num); + forced: true, + locked: false, + beginMarkCount: 20, + maxMarkCount: 100, + derivation: ["mbcmqingzheng", "mbcmjiushi", "mbcmfangzhu", "mbjuejin"], + addMark(player, num) { + num = Math.min(num, lib.skill.mbqianlong.maxMarkCount - player.countMark("mbqianlong")); + player.addMark("mbqianlong", num); }, - group:['mbqianlong_begin','mbqianlong_add'], - async content(event,trigger,player){ - player.addAdditionalSkill('mbqianlong', lib.skill.mbqianlong.derivation.slice(0, Math.floor(player.countMark('mbqianlong') / 25))); + group: ["mbqianlong_begin", "mbqianlong_add"], + async content(event, trigger, player) { + player.addAdditionalSkill( + "mbqianlong", + lib.skill.mbqianlong.derivation.slice( + 0, + Math.floor(player.countMark("mbqianlong") / 25) + ) + ); }, - marktext:'道', - intro:{ - name:'道心(潜龙)', - name2:'道心', - content:'当前道心数为#', + marktext: "道", + intro: { + name: "道心(潜龙)", + name2: "道心", + content: "当前道心数为#", }, - subSkill:{ - begin:{ - audio:'mbqianlong', - trigger:{ - global:'phaseBefore', - player:'enterGame', + subSkill: { + begin: { + audio: "mbqianlong", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - async content(event,trigger,player){ + forced: true, + locked: false, + async content(event, trigger, player) { lib.skill.mbqianlong.addMark(player, lib.skill.mbqianlong.beginMarkCount); }, }, - add:{ - audio:'mbqianlong', - trigger:{ - player:['gainAfter','damageEnd'], - source:'damageSource', - global:'loseAsyncAfter', + add: { + audio: "mbqianlong", + trigger: { + player: ["gainAfter", "damageEnd"], + source: "damageSource", + global: "loseAsyncAfter", }, - filter(event,player){ - if(player.countMark('mbqianlong')>=lib.skill.mbqianlong.maxMarkCount) return false; - if(event.name==='damage') return event.num>0; - return event.getg(player).length>0; + filter(event, player) { + if (player.countMark("mbqianlong") >= lib.skill.mbqianlong.maxMarkCount) + return false; + if (event.name === "damage") return event.num > 0; + return event.getg(player).length > 0; }, - getIndex(event,player,triggername){ - if(event.name==='damage') return event.num; + getIndex(event, player, triggername) { + if (event.name === "damage") return event.num; return 1; }, - forced:true, - locked:false, - async content(event,trigger,player){ - let toAdd = 5 * (1 + (trigger.name === 'damage') + (event.triggername === 'damageSource')); + forced: true, + locked: false, + async content(event, trigger, player) { + let toAdd = + 5 * + (1 + (trigger.name === "damage") + (event.triggername === "damageSource")); lib.skill.mbqianlong.addMark(player, toAdd); }, }, }, }, - mbweitong:{ - audio:1, - trigger:{ - global:'phaseBefore', - player:'enterGame', + mbweitong: { + audio: 1, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&game.hasPlayer(current=>{ - return current!==player&¤t.group==='wei'&&player.hasZhuSkill('mbweitong',current); - }); + filter(event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer((current) => { + return ( + current !== player && + current.group === "wei" && + player.hasZhuSkill("mbweitong", current) + ); + }) + ); }, - zhuSkill:true, - forced:true, - locked:false, - async content(event,trigger,player){ - lib.skill.mbqianlong.addMark(player, 20 * game.countPlayer(current => { - return current !== player && current.group === 'wei' && player.hasZhuSkill('mbweitong', current); - })); + zhuSkill: true, + forced: true, + locked: false, + async content(event, trigger, player) { + lib.skill.mbqianlong.addMark( + player, + 20 * + game.countPlayer((current) => { + return ( + current !== player && + current.group === "wei" && + player.hasZhuSkill("mbweitong", current) + ); + }) + ); }, }, - mbcmqingzheng:{ - audio:'sbqingzheng', - audioname:['mb_caomao'], - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return player.countCards('h')>0; + mbcmqingzheng: { + audio: "sbqingzheng", + audioname: ["mb_caomao"], + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return player.countCards("h") > 0; }, - direct:true, - content(){ - 'step 0' - var num=2; - var prompt='###'+get.prompt('sbqingzheng')+'###弃置'+get.cnNumber(num)+'种花色的所有牌'; - var next=player.chooseButton([prompt,[lib.suit.map(i=>['','','lukai_'+i]),'vcard']],num); - next.set('filterButton',button=>{ - var player=_status.event.player; - var cards=player.getCards('h',{suit:button.link[2].slice(6)}); - return cards.length>0&&cards.filter(card=>lib.filter.cardDiscardable(card,player,'sbqingzheng')).length==cards.length; + direct: true, + content() { + "step 0"; + var num = 2; + var prompt = + "###" + get.prompt("sbqingzheng") + "###弃置" + get.cnNumber(num) + "种花色的所有牌"; + var next = player.chooseButton( + [prompt, [lib.suit.map((i) => ["", "", "lukai_" + i]), "vcard"]], + num + ); + next.set("filterButton", (button) => { + var player = _status.event.player; + var cards = player.getCards("h", { suit: button.link[2].slice(6) }); + return ( + cards.length > 0 && + cards.filter((card) => lib.filter.cardDiscardable(card, player, "sbqingzheng")) + .length == cards.length + ); }); - next.set('ai',button=>{ - var player=_status.event.player; - return 15-player.getCards('h',{suit:button.link[2].slice(6)}).map(i=>get.value(i)).reduce((p,c)=>p+c,0); + next.set("ai", (button) => { + var player = _status.event.player; + return ( + 15 - + player + .getCards("h", { suit: button.link[2].slice(6) }) + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0) + ); }); - next.set('custom',{ - replace:{ - button:function(button){ - if(!_status.event.isMine()) return; - if(button.classList.contains('selectable')==false) return; - var cards=_status.event.player.getCards('h',{suit:button.link[2].slice(6)}); - if(cards.length){ - var chosen=cards.filter(i=>ui.selected.cards.includes(i)).length==cards.length; - if(chosen){ + next.set("custom", { + replace: { + button: function (button) { + if (!_status.event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + var cards = _status.event.player.getCards("h", { + suit: button.link[2].slice(6), + }); + if (cards.length) { + var chosen = + cards.filter((i) => ui.selected.cards.includes(i)).length == + cards.length; + if (chosen) { ui.selected.cards.removeArray(cards); - cards.forEach(card=>{ - card.classList.remove('selected'); + cards.forEach((card) => { + card.classList.remove("selected"); card.updateTransform(false); }); - }else{ + } else { ui.selected.cards.addArray(cards); - cards.forEach(card=>{ - card.classList.add('selected'); + cards.forEach((card) => { + card.classList.add("selected"); card.updateTransform(true); }); } } - if(button.classList.contains('selected')){ + if (button.classList.contains("selected")) { ui.selected.buttons.remove(button); - button.classList.remove('selected'); - if(_status.multitarget||_status.event.complexSelect){ + button.classList.remove("selected"); + if (_status.multitarget || _status.event.complexSelect) { game.uncheck(); game.check(); } - } - else{ - button.classList.add('selected'); + } else { + button.classList.add("selected"); ui.selected.buttons.add(button); } - var custom=_status.event.custom; - if(custom&&custom.add&&custom.add.button){ + var custom = _status.event.custom; + if (custom && custom.add && custom.add.button) { custom.add.button(); } game.check(); - } + }, }, - add:next.custom.add + add: next.custom.add, }); - 'step 1' - if(result.bool){ - var cards=result.cards; - if(!cards.length){ - var suits=result.links.map(i=>i[2].slice(6)); - cards=player.getCards('h',card=>suits.includes(get.suit(card,player))); + ("step 1"); + if (result.bool) { + var cards = result.cards; + if (!cards.length) { + var suits = result.links.map((i) => i[2].slice(6)); + cards = player.getCards("h", (card) => suits.includes(get.suit(card, player))); } - event.cards=cards; - if(!cards.length) event.finish(); - else player.chooseTarget('清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌',(card,player,target)=>{ - return target!=player&&target.countCards('h'); - }).set('ai',target=>{ - var player=_status.event.player,att=get.attitude(player,target); - if(att>=0) return 0; - return 1-att/2+Math.sqrt(target.countCards('h')); - }); + event.cards = cards; + if (!cards.length) event.finish(); + else + player + .chooseTarget( + "清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌", + (card, player, target) => { + return target != player && target.countCards("h"); + } + ) + .set("ai", (target) => { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + return 1 - att / 2 + Math.sqrt(target.countCards("h")); + }); } else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('sbqingzheng',target); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbqingzheng", target); player.discard(cards); - var list=[]; - var dialog=['清正:弃置'+get.translation(target)+'一种花色的所有牌']; - for(var suit of lib.suit.concat('none')){ - if(target.countCards('h',{suit:suit})){ - dialog.push('
    '+get.translation(suit+'2')+'牌
    '); - dialog.push(target.getCards('h',{suit:suit})); + var list = []; + var dialog = ["清正:弃置" + get.translation(target) + "一种花色的所有牌"]; + for (var suit of lib.suit.concat("none")) { + if (target.countCards("h", { suit: suit })) { + dialog.push( + '
    ' + get.translation(suit + "2") + "牌
    " + ); + dialog.push(target.getCards("h", { suit: suit })); list.push(suit); } } - if(list.length){ - player.chooseControl(list).set('dialog',dialog).set('ai',()=>{ - return _status.event.control; - }).set('control',(()=>{ - var getv=(cards)=>cards.map(i=>get.value(i)).reduce((p,c)=>p+c,0); - return list.sort((a,b)=>{ - return getv(target.getCards('h',{suit:b}))-getv(target.getCards('h',{suit:a})); - })[0]; - })()); + if (list.length) { + player + .chooseControl(list) + .set("dialog", dialog) + .set("ai", () => { + return _status.event.control; + }) + .set( + "control", + (() => { + var getv = (cards) => + cards.map((i) => get.value(i)).reduce((p, c) => p + c, 0); + return list.sort((a, b) => { + return ( + getv(target.getCards("h", { suit: b })) - + getv(target.getCards("h", { suit: a })) + ); + })[0]; + })() + ); } } else event.finish(); - 'step 3' - var cards2=target.getCards('h',{suit:result.control}); - event.cards2=cards2; - target.discard(cards2,'notBySelf').set('discarder',player); - 'step 4' - if(event.cards2.lengthcurrent!==player); + mbcmfangzhu: { + audio: "sbfangzhu", + audioname: ["mb_caomao"], + inherit: "sbfangzhu", + filter(event, player) { + return game.hasPlayer((current) => current !== player); }, - usable:1, - chooseButton:{ - dialog(){ - const dialog=ui.create.dialog('放逐:令一名其他角色...','hidden'); - dialog.add([[ - [1,'不能使用手牌中的非锦囊牌直到其回合结束'], - [2,'非Charlotte技能失效直到其回合结束'], - ],'textbutton']); + usable: 1, + chooseButton: { + dialog() { + const dialog = ui.create.dialog("放逐:令一名其他角色...", "hidden"); + dialog.add([ + [ + [1, "不能使用手牌中的非锦囊牌直到其回合结束"], + [2, "非Charlotte技能失效直到其回合结束"], + ], + "textbutton", + ]); return dialog; }, - check(button){ - const player=get.player(); - if(button.link===2){ - if(game.hasPlayer(target=>{ - if(target.hasSkill('mbcmfangzhu_ban')||target.hasSkill('fengyin')||target.hasSkill('baiban')) return false; - return get.attitude(player,target)<0&&['name','name1','name2'].map((sum,name)=>{ - if(target[name]&&(name!='name1'||target.name!=target.name1)){ - if(get.character(target[name])) return get.rank(target[name],true); - } - return 0; - }).reduce((p,c)=>{ - return p+c; - },0)>5; - })) return 6; + check(button) { + const player = get.player(); + if (button.link === 2) { + if ( + game.hasPlayer((target) => { + if ( + target.hasSkill("mbcmfangzhu_ban") || + target.hasSkill("fengyin") || + target.hasSkill("baiban") + ) + return false; + return ( + get.attitude(player, target) < 0 && + ["name", "name1", "name2"] + .map((sum, name) => { + if ( + target[name] && + (name != "name1" || target.name != target.name1) + ) { + if (get.character(target[name])) + return get.rank(target[name], true); + } + return 0; + }) + .reduce((p, c) => { + return p + c; + }, 0) > 5 + ); + }) + ) + return 6; } - return button.link===1?1:0; + return button.link === 1 ? 1 : 0; }, - backup(links,player){ + backup(links, player) { return { - num:links[0], - audio:'sbfangzhu', - filterCard:()=>false, - selectCard:-1, - filterTarget(card,player,target){ - if(target==player) return false; - const num=lib.skill.mbcmfangzhu_backup.num,storage=target.getStorage('mbcmfangzhu_ban'); - return num!=1||!storage.length; + num: links[0], + audio: "sbfangzhu", + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + if (target == player) return false; + const num = lib.skill.mbcmfangzhu_backup.num, + storage = target.getStorage("mbcmfangzhu_ban"); + return num != 1 || !storage.length; }, - async content(event,trigger,player){ - const target=event.target; - const num=lib.skill.mbcmfangzhu_backup.num; - switch(num){ + async content(event, trigger, player) { + const target = event.target; + const num = lib.skill.mbcmfangzhu_backup.num; + switch (num) { case 1: - target.addTempSkill('mbcmfangzhu_ban',{player:'phaseEnd'}); - target.markAuto('mbcmfangzhu_ban',['trick']); + target.addTempSkill("mbcmfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("mbcmfangzhu_ban", ["trick"]); break; case 2: - target.addTempSkill('mbcmfangzhu_baiban',{player:'phaseEnd'}); + target.addTempSkill("mbcmfangzhu_baiban", { player: "phaseEnd" }); break; } }, - ai:{ - result:{ - target(player,target){ - switch(lib.skill.mbcmfangzhu_backup.num){ + ai: { + result: { + target(player, target) { + switch (lib.skill.mbcmfangzhu_backup.num) { case 1: - return -target.countCards('h',card=>get.type(card)!='trick')-1; + return ( + -target.countCards( + "h", + (card) => get.type(card) != "trick" + ) - 1 + ); case 2: - return -target.getSkills(null,null,false).reduce((sum,skill)=>{ - return sum+Math.max(get.skillRank(skill,'out'),get.skillRank(skill,'in')); - },0); + return -target + .getSkills(null, null, false) + .reduce((sum, skill) => { + return ( + sum + + Math.max( + get.skillRank(skill, "out"), + get.skillRank(skill, "in") + ) + ); + }, 0); } }, }, }, - } + }; }, - prompt(links,player){ - const str='###放逐###'; - switch(links[0]){ + prompt(links, player) { + const str = "###放逐###"; + switch (links[0]) { case 1: - return str+'令一名其他角色不能使用手牌中的非锦囊牌直到其回合结束'; + return str + "令一名其他角色不能使用手牌中的非锦囊牌直到其回合结束"; case 2: - return str+'令一名其他角色的非Charlotte技能失效直到其回合结束'; + return str + "令一名其他角色的非Charlotte技能失效直到其回合结束"; } - } + }, }, - ai:{ - order:10, - result:{ - player(player){ - return game.hasPlayer(current=>get.attitude(player,current)<0)?1:0; + ai: { + order: 10, + result: { + player(player) { + return game.hasPlayer((current) => get.attitude(player, current) < 0) ? 1 : 0; }, }, }, - subSkill:{ - backup:{}, - baiban:{ - inherit:'baiban', - marktext:'逐', + subSkill: { + backup: {}, + baiban: { + inherit: "baiban", + marktext: "逐", }, - ban:{ - charlotte:true, - onremove:true, - mark:true, - marktext:'禁', - intro:{ - markcount:()=>0, - content(storage){ - if(storage.length>1) return '不能使用手牌'; - return '不能使用手牌中的非'+get.translation(storage[0])+'牌'; + ban: { + charlotte: true, + onremove: true, + mark: true, + marktext: "禁", + intro: { + markcount: () => 0, + content(storage) { + if (storage.length > 1) return "不能使用手牌"; + return "不能使用手牌中的非" + get.translation(storage[0]) + "牌"; }, }, - mod:{ - cardEnabled(card,player){ - const storage=player.getStorage('mbcmfangzhu_ban'); - const hs=player.getCards('h'),cards=[card]; - if(Array.isArray(card.cards)) cards.addArray(card.cards); - if(cards.containsSome(...hs)&&!storage.includes(get.type2(card))) return false; + mod: { + cardEnabled(card, player) { + const storage = player.getStorage("mbcmfangzhu_ban"); + const hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + if (cards.containsSome(...hs) && !storage.includes(get.type2(card))) + return false; }, - cardSavable(card,player){ - const storage=player.getStorage('mbcmfangzhu_ban'); - const hs=player.getCards('h'),cards=[card]; - if(Array.isArray(card.cards)) cards.addArray(card.cards); - if(cards.containsSome(...hs)&&!storage.includes(get.type2(card))) return false; + cardSavable(card, player) { + const storage = player.getStorage("mbcmfangzhu_ban"); + const hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + if (cards.containsSome(...hs) && !storage.includes(get.type2(card))) + return false; }, }, }, }, }, - mbjuejin:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'thunder', - filterCard:()=>false, - selectCard:[-1,-2], - filterTarget:true, - selectTarget:-1, - multiline:true, - async contentBefore(event,trigger,player){ - player.awakenSkill('mbjuejin'); + mbjuejin: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filterCard: () => false, + selectCard: [-1, -2], + filterTarget: true, + selectTarget: -1, + multiline: true, + async contentBefore(event, trigger, player) { + player.awakenSkill("mbjuejin"); }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = event.target; - const delt = target.getHp(true) - 1, num = Math.abs(delt); - await target[delt > 0 ? 'loseHp' : 'recover'](num); - if (num > 0) await target.changeHujia(num, null ,true); + const delt = target.getHp(true) - 1, + num = Math.abs(delt); + await target[delt > 0 ? "loseHp" : "recover"](num); + if (num > 0) await target.changeHujia(num, null, true); }, - async contentAfter(event,trigger,player){ - game.addGlobalSkill('mbjuejin_xiangsicunwei'); - player.$fullscreenpop('向死存魏!', 'thunder'); + async contentAfter(event, trigger, player) { + game.addGlobalSkill("mbjuejin_xiangsicunwei"); + player.$fullscreenpop("向死存魏!", "thunder"); }, - ai:{ - order:0.1, - result:{ - player(player){ - let eff=1; - game.countPlayer(current=>{ - const att=get.attitude(player,current),num=Math.abs(current.getHp(true)-1); - const delt=Math.max(0,num+current.hujia-5); - eff-=att*delt; + ai: { + order: 0.1, + result: { + player(player) { + let eff = 1; + game.countPlayer((current) => { + const att = get.attitude(player, current), + num = Math.abs(current.getHp(true) - 1); + const delt = Math.max(0, num + current.hujia - 5); + eff -= att * delt; }); - return eff>0?1:0; + return eff > 0 ? 1 : 0; }, }, }, - subSkill:{ - xiangsicunwei:{ - trigger:{ - global:['loseAfter','equipAfter','loseAsyncAfter','cardsDiscardAfter'], + subSkill: { + xiangsicunwei: { + trigger: { + global: ["loseAfter", "equipAfter", "loseAsyncAfter", "cardsDiscardAfter"], }, - forced:true, - silent:true, - firstDo:true, - filter(event,player){ - const nameList=['shan','tao','jiu']; - return event.getd().some(card=>{ - return nameList.includes(get.name(card,false))&&get.position(card,true)==='d'; + forced: true, + silent: true, + firstDo: true, + filter(event, player) { + const nameList = ["shan", "tao", "jiu"]; + return event.getd().some((card) => { + return ( + nameList.includes(get.name(card, false)) && + get.position(card, true) === "d" + ); }); }, - async content(event,trigger,player){ - const nameList = ['shan','tao','jiu']; - const cards = trigger.getd().filter(card => { - return nameList.includes(get.name(card, false)) && get.position(card, true) === 'd'; + async content(event, trigger, player) { + const nameList = ["shan", "tao", "jiu"]; + const cards = trigger.getd().filter((card) => { + return ( + nameList.includes(get.name(card, false)) && + get.position(card, true) === "d" + ); }); await game.cardsGotoSpecial(cards); - game.log(cards, '被移出了游戏'); - } + game.log(cards, "被移出了游戏"); + }, }, }, }, //杨奉 - mbxuetu:{ - audio:2, - audioname:['re_yangfeng'], - enable:'phaseUse', - usable:2, - filter(event,player){ - if (player.countMark('mbxuetu_status') !== 1 && player.getStat('skill').mbxuetu) return false; - if (!player.storage.mbxuetu) return player.countCards('he'); + mbxuetu: { + audio: 2, + audioname: ["re_yangfeng"], + enable: "phaseUse", + usable: 2, + filter(event, player) { + if (player.countMark("mbxuetu_status") !== 1 && player.getStat("skill").mbxuetu) + return false; + if (!player.storage.mbxuetu) return player.countCards("he"); return true; }, - zhuanhuanji2(skill, player){ - return player.countMark('mbxuetu_status') !== 1; + zhuanhuanji2(skill, player) { + return player.countMark("mbxuetu_status") !== 1; }, - filterCard(card,player){ - if (player.countMark('mbxuetu_status') > 1) return false; - if (player.countMark('mbxuetu_status') === 1) { - if (player.getStorage('mbxuetu_used').includes(false)) return false; + filterCard(card, player) { + if (player.countMark("mbxuetu_status") > 1) return false; + if (player.countMark("mbxuetu_status") === 1) { + if (player.getStorage("mbxuetu_used").includes(false)) return false; return true; } return !player.storage.mbxuetu; }, - selectCard(){ + selectCard() { const player = get.player(); - if (player.countMark('mbxuetu_status') > 1) return -1; - if (player.countMark('mbxuetu_status') === 1) { - if (player.getStorage('mbxuetu_used').includes(false)) return -1; - if (player.getStorage('mbxuetu_used').includes(true)) return 1; - return [0,1]; + if (player.countMark("mbxuetu_status") > 1) return -1; + if (player.countMark("mbxuetu_status") === 1) { + if (player.getStorage("mbxuetu_used").includes(false)) return -1; + if (player.getStorage("mbxuetu_used").includes(true)) return 1; + return [0, 1]; } return !player.storage.mbxuetu ? 1 : -1; }, - check(card){ - return 6-get.value(card); + check(card) { + return 6 - get.value(card); }, - prompt(){ - const player = get.player(), storage = player.storage.mbxuetu, status = player.countMark('mbxuetu_status'); + prompt() { + const player = get.player(), + storage = player.storage.mbxuetu, + status = player.countMark("mbxuetu_status"); if (status === 0) { - if (storage) return '转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。'; - return '转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。'; - } - else if (status === 1) { - return '出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。'; - } - else { - if (storage) return '转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。'; - return '转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。'; + if (storage) + return "转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。"; + return "转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。"; + } else if (status === 1) { + return "出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。"; + } else { + if (storage) + return "转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。"; + return "转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。"; } }, - position:'he', - filterTarget:true, - onremove:['mbxuetu','mbxuetu_status'], - derivation:['mbxuetu_achieve','mbxuetu_fail'], - async content(event,trigger,player){ - const target = event.targets[0], storage = Boolean(player.storage.mbxuetu); - const status = player.countMark('mbxuetu_status'); - player.changeZhuanhuanji('mbxuetu'); + position: "he", + filterTarget: true, + onremove: ["mbxuetu", "mbxuetu_status"], + derivation: ["mbxuetu_achieve", "mbxuetu_fail"], + async content(event, trigger, player) { + const target = event.targets[0], + storage = Boolean(player.storage.mbxuetu); + const status = player.countMark("mbxuetu_status"); + player.changeZhuanhuanji("mbxuetu"); if (status < 2) { if (!player.storage.mbxuetu_used) { - player.when(['phaseUseAfter', 'mbweiming_achieveAfter']).then(() => { + player.when(["phaseUseAfter", "mbweiming_achieveAfter"]).then(() => { delete player.storage.mbxuetu_used; }); } - player.markAuto('mbxuetu_used',[status===0?storage:(!event.cards.length)]); - if (status === 0 && !storage || status === 1 && event.cards.length) { + player.markAuto("mbxuetu_used", [status === 0 ? storage : !event.cards.length]); + if ((status === 0 && !storage) || (status === 1 && event.cards.length)) { await target.recover(); - } - else { + } else { await player.loseHp(); await target.draw(2); } - } - else { + } else { if (!storage) { await player.recover(); - await target.chooseToDiscard(2,true,'he'); - } - else { + await target.chooseToDiscard(2, true, "he"); + } else { await player.draw(); await target.damage(); } } }, - mark:true, - marktext:'☯', - intro:{ - content:(storage,player)=>{ - if (!player.countMark('mbxuetu_status')) { - if (storage) return '转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。'; - return '转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。'; + mark: true, + marktext: "☯", + intro: { + content: (storage, player) => { + if (!player.countMark("mbxuetu_status")) { + if (storage) + return "转换技。出牌阶段限一次,你可以失去1点体力,然后令一名角色摸两张牌。"; + return "转换技。出牌阶段限一次,你可以弃置一张牌,然后令一名角色回复1点体力。"; + } else { + if (storage) + return "转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。"; + return "转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。"; } - else { - if (storage) return '转换技。出牌阶段限一次,你可以摸一张牌,然后对一名角色造成1点伤害。'; - return '转换技。出牌阶段限一次,你可以回复1点体力,然后令一名角色弃置两张牌。'; - } - } + }, }, - ai:{ - order(item,player){ - const status = player.countMark('mbxuetu_status'); - if (status > 1) return Math.max(get.order({ name: 'guohe' }), get.order({ name: 'chuqibuyi' })); + ai: { + order(item, player) { + const status = player.countMark("mbxuetu_status"); + if (status > 1) + return Math.max(get.order({ name: "guohe" }), get.order({ name: "chuqibuyi" })); if (status === 1 || player.storage.mbxuetu) return 9; return 2; }, - result:{ - target(player,target){ - const status = player.countMark('mbxuetu_status'); + result: { + target(player, target) { + const status = player.countMark("mbxuetu_status"); if (status > 1) { - if (player.storage.mbxuetu) return -get.damageEffect(target, player, player) / 10; + if (player.storage.mbxuetu) + return -get.damageEffect(target, player, player) / 10; return -2; } - if (status === 0 && player.storage.mbxuetu || status === 1 && !ui.selected.cards.length) return 2; + if ( + (status === 0 && player.storage.mbxuetu) || + (status === 1 && !ui.selected.cards.length) + ) + return 2; const eff = get.recoverEffect(target, player, player); - return eff > 0 ? 2 : (eff < 0 ? -get.sgnAttitude(player, target) : 0); + return eff > 0 ? 2 : eff < 0 ? -get.sgnAttitude(player, target) : 0; }, - player(player,target){ - const status = player.countMark('mbxuetu_status'); + player(player, target) { + const status = player.countMark("mbxuetu_status"); if (status > 1) { if (player.storage.mbxuetu) return 1; return get.recoverEffect(player, player) / 6; } if (status === 1 || !player.storage.mbxuetu) return -0.5; - const eff = get.effect(player, {name: 'losehp'}, player, player); + const eff = get.effect(player, { name: "losehp" }, player, player); if (eff >= 0) return Math.min(1, eff / 2); - const hp = player.getHp() + player.countCards('hes', card => { - return player.canSaveCard(card, player); - }); + const hp = + player.getHp() + + player.countCards("hes", (card) => { + return player.canSaveCard(card, player); + }); return -1.5 * Math.max(0, 3 - hp); }, }, }, }, - mbweiming:{ - audio:3, - dutySkill:true, - locked:true, - group:['mbweiming_achieve', 'mbweiming_fail','mbweiming_effect'], - intro:{ - content: '已记录$', + mbweiming: { + audio: 3, + dutySkill: true, + locked: true, + group: ["mbweiming_achieve", "mbweiming_fail", "mbweiming_effect"], + intro: { + content: "已记录$", }, subSkill: { - effect:{ - audio:'mbweiming1.mp3', - trigger:{ - player:'phaseUseBegin', + effect: { + audio: "mbweiming1.mp3", + trigger: { + player: "phaseUseBegin", }, - filter(event,player){ - return game.hasPlayer(current => { - return !player.getStorage('mbweiming').includes(current); + filter(event, player) { + return game.hasPlayer((current) => { + return !player.getStorage("mbweiming").includes(current); }); }, - forced:true, - direct:true, - async content(event, trigger, player){ - const targets = await player.chooseTarget('威命:记录一名未记录过的角色','当你杀死没有被记录过的角色后,则〖威命〗使命成功;如果在你杀死这些角色中的一名之前,有被记录过的角色死亡,则你〖威命〗使命失败。',true) - .set('filterTarget', (card, player, target) => { - return !player.getStorage('mbweiming').includes(target); + forced: true, + direct: true, + async content(event, trigger, player) { + const targets = await player + .chooseTarget( + "威命:记录一名未记录过的角色", + "当你杀死没有被记录过的角色后,则〖威命〗使命成功;如果在你杀死这些角色中的一名之前,有被记录过的角色死亡,则你〖威命〗使命失败。", + true + ) + .set("filterTarget", (card, player, target) => { + return !player.getStorage("mbweiming").includes(target); }) - .set('ai', target => { + .set("ai", (target) => { if (target === player) return 1; - return 1 + Math.sqrt(Math.abs(get.attitude(player, target))) * Math.abs(get.threaten(target)) / Math.sqrt(target.getHp() + 1) / Math.sqrt(target.countCards('hes') + 1); + return ( + 1 + + (Math.sqrt(Math.abs(get.attitude(player, target))) * + Math.abs(get.threaten(target))) / + Math.sqrt(target.getHp() + 1) / + Math.sqrt(target.countCards("hes") + 1) + ); }) .forResultTargets(); if (targets && targets.length > 0) { const target = targets[0]; - player.logSkill('mbweiming_effect', target); - player.markAuto('mbweiming', target); + player.logSkill("mbweiming_effect", target); + player.markAuto("mbweiming", target); } }, }, achieve: { - audio:'mbweiming2.mp3', - trigger:{ - source:'dieAfter', + audio: "mbweiming2.mp3", + trigger: { + source: "dieAfter", }, - filter(event,player){ - return !player.getStorage('mbweiming').includes(event.player); + filter(event, player) { + return !player.getStorage("mbweiming").includes(event.player); }, - dutySkill:true, - forced:true, - skillAnimation:true, - animationColor:'fire', - async content(event, trigger, player){ - game.log(player,'成功完成使命'); - player.awakenSkill('mbweiming'); + dutySkill: true, + forced: true, + skillAnimation: true, + animationColor: "fire", + async content(event, trigger, player) { + game.log(player, "成功完成使命"); + player.awakenSkill("mbweiming"); player.storage.mbxuetu_status = 1; - player.unmarkSkill('mbxuetu'); + player.unmarkSkill("mbxuetu"); await game.asyncDelayx(); - } + }, }, fail: { - audio:'mbweiming3.mp3', - trigger:{ - global:'dieAfter', + audio: "mbweiming3.mp3", + trigger: { + global: "dieAfter", }, - filter(event,player){ - return player.getStorage('mbweiming').includes(event.player); + filter(event, player) { + return player.getStorage("mbweiming").includes(event.player); }, - dutySkill:true, - forced:true, - async content(event, trigger, player){ - game.log(player,'使命失败'); - player.awakenSkill('mbweiming'); + dutySkill: true, + forced: true, + async content(event, trigger, player) { + game.log(player, "使命失败"); + player.awakenSkill("mbweiming"); player.storage.mbxuetu_status = 2; - game.broadcastAll(player=>{ - player.tempname.add('re_yangfeng'); - },player); + game.broadcastAll((player) => { + player.tempname.add("re_yangfeng"); + }, player); await game.asyncDelayx(); - } + }, }, }, }, //霍骏 - sidai:{ - audio:'twsidai', - enable:'phaseUse', - usable:1, - locked:false, - limited:true, - skillAnimation:true, - animationColor:'fire', - filter:function(event,player){ - var cards=player.getCards('h',{type:'basic'}); - if(!cards.length) return false; - for(var i of cards){ - if(!game.checkMod(i,player,'unchanged','cardEnabled2',player)) return false; + sidai: { + audio: "twsidai", + enable: "phaseUse", + usable: 1, + locked: false, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + var cards = player.getCards("h", { type: "basic" }); + if (!cards.length) return false; + for (var i of cards) { + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; } - return event.filterCard(get.autoViewAs({name:'sha',storage:{sidai:true}},cards),player,event); + return event.filterCard( + get.autoViewAs({ name: "sha", storage: { sidai: true } }, cards), + player, + event + ); }, - viewAs:{name:'sha',storage:{sidai:true}}, - filterCard:{type:'basic'}, - selectCard:-1, - check:()=>1, - onuse:function(result,player){ - player.awakenSkill('sidai'); - player.addTempSkill('sidai_tao'); - player.addTempSkill('sidai_shan'); + viewAs: { name: "sha", storage: { sidai: true } }, + filterCard: { type: "basic" }, + selectCard: -1, + check: () => 1, + onuse: function (result, player) { + player.awakenSkill("sidai"); + player.addTempSkill("sidai_tao"); + player.addTempSkill("sidai_shan"); }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'},player)+0.1; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) + 0.1; }, - result:{ - target:function(player,target){ - var cards=ui.selected.cards.slice(0); - var names=[]; - for(var i of cards) names.add(i.name); - if(names.length=0) return -20; - return lib.card.sha.ai.result.target.apply(this,arguments); + result: { + target: function (player, target) { + var cards = ui.selected.cards.slice(0); + var names = []; + for (var i of cards) names.add(i.name); + if (names.length < player.hp) return 0; + if (player.hasUnknown() && (player.identity != "fan" || !target.isZhu)) return 0; + if (get.attitude(player, target) >= 0) return -20; + return lib.card.sha.ai.result.target.apply(this, arguments); }, }, }, - subSkill:{ - tao:{ - trigger:{source:'damageSource'}, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.sidai||!event.player.isIn()) return false; - for(var i of event.cards){ - if(i.name=='tao') return true; + subSkill: { + tao: { + trigger: { source: "damageSource" }, + filter: function (event, player) { + if ( + !event.card || + !event.card.storage || + !event.card.storage.sidai || + !event.player.isIn() + ) + return false; + for (var i of event.cards) { + if (i.name == "tao") return true; } return false; }, - forced:true, - popup:false, - content:function(){ + forced: true, + popup: false, + content: function () { trigger.player.loseMaxHp(); }, }, - shan:{ - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.sidai||!event.target.isIn()) return false; - for(var i of event.cards){ - if(i.name=='shan') return true; + shan: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if ( + !event.card || + !event.card.storage || + !event.card.storage.sidai || + !event.target.isIn() + ) + return false; + for (var i of event.cards) { + if (i.name == "shan") return true; } return false; }, - forced:true, - popup:false, - content:function(){ - 'step 0' - trigger.target.chooseToDiscard('h',{type:'basic'},'弃置一张基本牌,否则不能响应'+get.translation(trigger.card)).set('ai',function(card){ - var player=_status.event.player; - if(player.hasCard('hs',function(cardx){ - return cardx!=card&&get.name(cardx,player)=='shan'; - })) return 12-get.value(card); - return 0; - }); - 'step 1' - if(!result.bool) trigger.directHit.add(trigger.target); + forced: true, + popup: false, + content: function () { + "step 0"; + trigger.target + .chooseToDiscard( + "h", + { type: "basic" }, + "弃置一张基本牌,否则不能响应" + get.translation(trigger.card) + ) + .set("ai", function (card) { + var player = _status.event.player; + if ( + player.hasCard("hs", function (cardx) { + return cardx != card && get.name(cardx, player) == "shan"; + }) + ) + return 12 - get.value(card); + return 0; + }); + ("step 1"); + if (!result.bool) trigger.directHit.add(trigger.target); }, }, }, }, - jieyu:{ - audio:'twjieyu', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - for(let i=0;i1?'牌名各不相同的':'')+'基本牌'; + prompt2: function (event, player) { + const num = lib.skill.jieyu.getNum(player); + return ( + "获得弃牌堆中" + + get.cnNumber(num) + + "张" + + (num > 1 ? "牌名各不相同的" : "") + + "基本牌" + ); }, - async content(event,trigger,player){ - const num=lib.skill.jieyu.getNum(player,event); - let gains=[],names=[]; - for(let i=0;i=0;i--){ - const evt=history[i]; - if(evt.name=='jieyu'&&evt.player==player){ - if(!event||evt!=event) break; + getNum: function (player, event) { + let num = get.mode() == "identity" ? 3 : 4; + const history = game.getAllGlobalHistory("everything"); + for (let i = history.length - 1; i >= 0; i--) { + const evt = history[i]; + if (evt.name == "jieyu" && evt.player == player) { + if (!event || evt != event) break; } - if(evt.name=='useCard'&&evt.player!=player&&evt.targets&&evt.targets.includes(player)&&get.tag(evt.card,'damage')){ + if ( + evt.name == "useCard" && + evt.player != player && + evt.targets && + evt.targets.includes(player) && + get.tag(evt.card, "damage") + ) { num--; - if(num==1) break; + if (num == 1) break; } } return num; }, }, //木鹿大王 - shoufa:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + shoufa: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - filter:function(event,player,name){ - if(name=='damageSource'&&player.getHistory('sourceDamage').indexOf(event)!=0) return false; - return game.hasPlayer(target=>{ - if(get.mode()!='doudizhu'){ - if(name=='damageEnd'&&get.distance(player,target)<=2) return false; - if(name=='damageSource'&&get.distance(player,target)>2) return false; + filter: function (event, player, name) { + if (name == "damageSource" && player.getHistory("sourceDamage").indexOf(event) != 0) + return false; + return game.hasPlayer((target) => { + if (get.mode() != "doudizhu") { + if (name == "damageEnd" && get.distance(player, target) <= 2) return false; + if (name == "damageSource" && get.distance(player, target) > 2) return false; } - const zhoufa=player.storage.zhoulin_zhoufa; - if(!zhoufa) return true; - if(zhoufa=='豹'||zhoufa=='兔') return true; - if(zhoufa=='鹰') return target.countCards('he'); - return target.countDiscardableCards(player,'e'); + const zhoufa = player.storage.zhoulin_zhoufa; + if (!zhoufa) return true; + if (zhoufa == "豹" || zhoufa == "兔") return true; + if (zhoufa == "鹰") return target.countCards("he"); + return target.countDiscardableCards(player, "e"); }); }, - direct:true, - async content(event,trigger,player){ - const zhoufa=player.storage.zhoulin_zhoufa; - const str=zhoufa?[ - '令其受到1点无来源伤害', - '你随机获得其一张牌', - '你随机弃置其装备区的一张牌', - '令其摸一张牌', - ][['豹','鹰','熊','兔'].indexOf(zhoufa)]:'令其随机执行一个效果'; - const nodoudizhu=(get.mode()=='doudizhu'?'':('距离'+(event.triggername=='damageEnd'?'':'不')+'大于2的')); - const {result:{bool,targets}}=await player.chooseTarget(get.prompt('shoufa'),'选择一名'+nodoudizhu+'角色,'+str,(card,player,target)=>{ - const name=_status.event.triggername; - if(get.mode()!='doudizhu'){ - if(name=='damageEnd'&&get.distance(player,target)<=2) return false; - if(name=='damageSource'&&get.distance(player,target)>2) return false; - } - const zhoufa=player.storage.zhoulin_zhoufa; - if(!zhoufa) return true; - if(zhoufa=='豹'||zhoufa=='兔') return true; - if(zhoufa=='鹰') return target.countCards('he'); - return target.countDiscardableCards(player,'e'); - }).set('ai',target=>{ - const player=_status.event.player; - const zhoufa=player.storage.zhoulin_zhoufa; - if(!zhoufa) return -get.attitude(player,target); - switch(zhoufa){ - case '豹': - return get.damageEffect(target,player,player); - case '鹰': - return get.effect(target,{name:'guohe_copy2'},player,player); - case '熊': - let att=get.attitude(player,target),eff=0; - target.getCards('e',card=>{ - var val=get.value(card,target); - eff=Math.max(eff,-val*att); - }); - return eff; - case '兔': - return get.effect(target,{name:'draw'},player,player); - } - }).set('triggername',event.triggername); - if(!bool) return; - const target=targets[0]; - player.logSkill('shoufa',target); - const shoufa=zhoufa?zhoufa:['豹','鹰','熊','兔'].randomGet(); - game.log(target,'执行','#g'+shoufa,'效果'); - switch(shoufa){ - case '豹': - target.damage('nosource'); + direct: true, + async content(event, trigger, player) { + const zhoufa = player.storage.zhoulin_zhoufa; + const str = zhoufa + ? [ + "令其受到1点无来源伤害", + "你随机获得其一张牌", + "你随机弃置其装备区的一张牌", + "令其摸一张牌", + ][["豹", "鹰", "熊", "兔"].indexOf(zhoufa)] + : "令其随机执行一个效果"; + const nodoudizhu = + get.mode() == "doudizhu" + ? "" + : "距离" + (event.triggername == "damageEnd" ? "" : "不") + "大于2的"; + const { + result: { bool, targets }, + } = await player + .chooseTarget( + get.prompt("shoufa"), + "选择一名" + nodoudizhu + "角色," + str, + (card, player, target) => { + const name = _status.event.triggername; + if (get.mode() != "doudizhu") { + if (name == "damageEnd" && get.distance(player, target) <= 2) + return false; + if (name == "damageSource" && get.distance(player, target) > 2) + return false; + } + const zhoufa = player.storage.zhoulin_zhoufa; + if (!zhoufa) return true; + if (zhoufa == "豹" || zhoufa == "兔") return true; + if (zhoufa == "鹰") return target.countCards("he"); + return target.countDiscardableCards(player, "e"); + } + ) + .set("ai", (target) => { + const player = _status.event.player; + const zhoufa = player.storage.zhoulin_zhoufa; + if (!zhoufa) return -get.attitude(player, target); + switch (zhoufa) { + case "豹": + return get.damageEffect(target, player, player); + case "鹰": + return get.effect(target, { name: "guohe_copy2" }, player, player); + case "熊": + let att = get.attitude(player, target), + eff = 0; + target.getCards("e", (card) => { + var val = get.value(card, target); + eff = Math.max(eff, -val * att); + }); + return eff; + case "兔": + return get.effect(target, { name: "draw" }, player, player); + } + }) + .set("triggername", event.triggername); + if (!bool) return; + const target = targets[0]; + player.logSkill("shoufa", target); + const shoufa = zhoufa ? zhoufa : ["豹", "鹰", "熊", "兔"].randomGet(); + game.log(target, "执行", "#g" + shoufa, "效果"); + switch (shoufa) { + case "豹": + target.damage("nosource"); break; - case '鹰': - player.gain(target.getGainableCards(player,'he').randomGet(),target,'giveAuto'); + case "鹰": + player.gain( + target.getGainableCards(player, "he").randomGet(), + target, + "giveAuto" + ); break; - case '熊': - target.discard(target.getGainableCards(player,'e').randomGet()).discarder=player; + case "熊": + target.discard(target.getGainableCards(player, "e").randomGet()).discarder = + player; break; - case '兔': + case "兔": target.draw(); break; } }, }, - yuxiang:{ - mod:{ - globalFrom(from,to,distance){ - if(from.hujia>0) return distance-1; + yuxiang: { + mod: { + globalFrom(from, to, distance) { + if (from.hujia > 0) return distance - 1; }, - globalTo(from,to,distance){ - if(to.hujia>0) return distance+1; + globalTo(from, to, distance) { + if (to.hujia > 0) return distance + 1; }, }, - audio:true, - trigger:{player:'damageBegin2'}, - filter:function(event,player){ - return player.hujia>0&&event.hasNature('fire'); + audio: true, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return player.hujia > 0 && event.hasNature("fire"); }, - forced:true, - async content(event,trigger,player){ + forced: true, + async content(event, trigger, player) { trigger.num++; }, }, - zhoulin:{ - audio:2, - limited:true, - unique:true, - enable:'phaseUse', - skillAnimation:true, - animationColor:'fire', - async content(event,trigger,player){ - player.awakenSkill('zhoulin'); - player.changeHujia(2,null,true); - const {result:{control}}=await player.chooseControl('豹','鹰','熊','兔').set('ai',()=>'豹').set('prompt','选择一个固定效果'); - if(control){ + zhoulin: { + audio: 2, + limited: true, + unique: true, + enable: "phaseUse", + skillAnimation: true, + animationColor: "fire", + async content(event, trigger, player) { + player.awakenSkill("zhoulin"); + player.changeHujia(2, null, true); + const { + result: { control }, + } = await player + .chooseControl("豹", "鹰", "熊", "兔") + .set("ai", () => "豹") + .set("prompt", "选择一个固定效果"); + if (control) { player.popup(control); - game.log(player,'选择了','#g'+control,'效果'); - player.addTempSkill('zhoulin_zhoufa'); - player.storage.zhoulin_zhoufa=control; - player.markSkill('zhoulin_zhoufa'); - game.broadcastAll(function(player,zhoufa){ - if(player.marks.zhoulin_zhoufa) player.marks.zhoulin_zhoufa.firstChild.innerHTML=zhoufa; - },player,control); + game.log(player, "选择了", "#g" + control, "效果"); + player.addTempSkill("zhoulin_zhoufa"); + player.storage.zhoulin_zhoufa = control; + player.markSkill("zhoulin_zhoufa"); + game.broadcastAll( + function (player, zhoufa) { + if (player.marks.zhoulin_zhoufa) + player.marks.zhoulin_zhoufa.firstChild.innerHTML = zhoufa; + }, + player, + control + ); } }, - ai:{ - order:12, - result:{player:1}, + ai: { + order: 12, + result: { player: 1 }, }, - subSkill:{ - zhoufa:{ - charlotte:true, - onremove:true, - intro:{content:'已选择$效果'}, + subSkill: { + zhoufa: { + charlotte: true, + onremove: true, + intro: { content: "已选择$效果" }, }, - } + }, }, //陈珪 - guimou:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:['enterGame','phaseEnd','phaseZhunbeiBegin'], + guimou: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseEnd", "phaseZhunbeiBegin"], }, - filter:function(event,player,name){ - if(event.name=='phaseZhunbei'||name=='phaseEnd') return true; - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player, name) { + if (event.name == "phaseZhunbei" || name == "phaseEnd") return true; + return event.name != "phase" || game.phaseNumber == 0; }, - direct:true, - locked:true, - content:function*(event,map){ - var player=map.player,trigger=map.trigger; - if(trigger.name!='phaseZhunbei'){ - player.logSkill('guimou'); - var result,choiceList=[ - '惩罚期间使用牌最少的角色', - '惩罚期间弃置牌最少的角色', - '惩罚期间得到牌最少的角色', - ]; - if(trigger.name!='phase'||game.phaseNumber==0) result={index:get.rand(0,2)}; - else result=yield player.chooseControl().set('choiceList',choiceList).set('ai',()=>get.rand(0,2)); - var str=choiceList[result.index]; - game.log(player,'选择','#g'+str); - player.addSkill('guimou_'+result.index); + direct: true, + locked: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + if (trigger.name != "phaseZhunbei") { + player.logSkill("guimou"); + var result, + choiceList = [ + "惩罚期间使用牌最少的角色", + "惩罚期间弃置牌最少的角色", + "惩罚期间得到牌最少的角色", + ]; + if (trigger.name != "phase" || game.phaseNumber == 0) + result = { index: get.rand(0, 2) }; + else + result = yield player + .chooseControl() + .set("choiceList", choiceList) + .set("ai", () => get.rand(0, 2)); + var str = choiceList[result.index]; + game.log(player, "选择", "#g" + str); + player.addSkill("guimou_" + result.index); return; } - var targets=[]; - for(var i=0;i<=2;i++){ - var skill='guimou_'+i; - if(player.hasSkill(skill)){ - var storage=player.storage[skill],nums=storage[0].slice(); - var targetx=nums.sort((a,b)=>storage[1][storage[0].indexOf(a)]-storage[1][storage[0].indexOf(b)]); - targetx=targetx.filter(target=>storage[1][storage[0].indexOf(target)]==storage[1][storage[0].indexOf(targetx[0])]); + var targets = []; + for (var i = 0; i <= 2; i++) { + var skill = "guimou_" + i; + if (player.hasSkill(skill)) { + var storage = player.storage[skill], + nums = storage[0].slice(); + var targetx = nums.sort( + (a, b) => + storage[1][storage[0].indexOf(a)] - storage[1][storage[0].indexOf(b)] + ); + targetx = targetx.filter( + (target) => + storage[1][storage[0].indexOf(target)] == + storage[1][storage[0].indexOf(targetx[0])] + ); targets.addArray(targetx); player.removeSkill(skill); } } - targets=targets.filter(target=>target!=player&&target.countCards('h')); - if(targets.length){ - var result=yield player.chooseTarget('请选择【诡谋】的目标','观看一名可选择的角色的手牌并选择其中一张牌,然后你可以此牌交给另一名其他角色或弃置此牌',(card,player,target)=>{ - return _status.event.targets.includes(target)&&target.countCards('h'); - },true).set('ai',target=>{ - return Math.sqrt(Math.min(3,target.countCards('h')))*get.effect(target,{name:'guohe_copy2'},player,player); - }).set('targets',targets); - if(result.bool){ - var target=result.targets[0]; - player.logSkill('guimou',target); + targets = targets.filter((target) => target != player && target.countCards("h")); + if (targets.length) { + var result = yield player + .chooseTarget( + "请选择【诡谋】的目标", + "观看一名可选择的角色的手牌并选择其中一张牌,然后你可以此牌交给另一名其他角色或弃置此牌", + (card, player, target) => { + return _status.event.targets.includes(target) && target.countCards("h"); + }, + true + ) + .set("ai", (target) => { + return ( + Math.sqrt(Math.min(3, target.countCards("h"))) * + get.effect(target, { name: "guohe_copy2" }, player, player) + ); + }) + .set("targets", targets); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("guimou", target); player.addExpose(0.3); - var result2=yield player.choosePlayerCard(target,'h','visible',true).set('ai',button=>{ - return get.value(button.link); - }).set('prompt','诡谋:请选择'+get.translation(target)+'的一张手牌').set('prompt2','
    将选择的牌交给另一名其他角色或弃置此牌
    '); - if(result2.bool){ - var cards=result2.links.slice(),result3; - if(!game.hasPlayer(targetx=>targetx!=player&&targetx!=target)) result3={bool:false}; - else result3=yield player.chooseTarget('是否令另一名其他角色获得'+get.translation(cards)+'?',(card,player,target)=>{ - return target!=player&&target!=_status.event.target; - }).set('ai',target=>get.attitude(_status.event.player,target)).set('target',target); - if(result3.bool){ - var targetx=result3.targets[0]; + var result2 = yield player + .choosePlayerCard(target, "h", "visible", true) + .set("ai", (button) => { + return get.value(button.link); + }) + .set("prompt", "诡谋:请选择" + get.translation(target) + "的一张手牌") + .set( + "prompt2", + '
    将选择的牌交给另一名其他角色或弃置此牌
    ' + ); + if (result2.bool) { + var cards = result2.links.slice(), + result3; + if (!game.hasPlayer((targetx) => targetx != player && targetx != target)) + result3 = { bool: false }; + else + result3 = yield player + .chooseTarget( + "是否令另一名其他角色获得" + get.translation(cards) + "?", + (card, player, target) => { + return target != player && target != _status.event.target; + } + ) + .set("ai", (target) => get.attitude(_status.event.player, target)) + .set("target", target); + if (result3.bool) { + var targetx = result3.targets[0]; player.line(targetx); - targetx.gain(cards,target,'give'); - } - else target.discard(cards).discarder=player; + targetx.gain(cards, target, "give"); + } else target.discard(cards).discarder = player; } } } }, - subSkill:{ - '0':{ - charlotte:true, - onremove:true, - init:function(player,skill){ - if(!player.storage[skill]){ - player.storage[skill]=[[],[]]; - var targets=game.filterPlayer().sortBySeat(player); - targets.forEach(target=>{ + subSkill: { + 0: { + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) { + player.storage[skill] = [[], []]; + var targets = game.filterPlayer().sortBySeat(player); + targets.forEach((target) => { player.storage[skill][0].push(target); player.storage[skill][1].push(0); }); } }, - mark:true, - intro:{ - markcount:storage=>0, - content:function(storage,player){ - var str='当前使用牌数排行榜'; - var lose=storage[1].slice().sort((a,b)=>a-b)[0]; - storage[0].forEach(target=>{ - str+='
  • '; - var score=storage[1][storage[0].indexOf(target)]; - if(score==lose) str+=''; - str+=(' '+get.translation(target)+' '); - str+=(score+'张'); - if(score==lose) str+=''; + mark: true, + intro: { + markcount: (storage) => 0, + content: function (storage, player) { + var str = "当前使用牌数排行榜"; + var lose = storage[1].slice().sort((a, b) => a - b)[0]; + storage[0].forEach((target) => { + str += "
  • "; + var score = storage[1][storage[0].indexOf(target)]; + if (score == lose) + str += ""; + str += " " + get.translation(target) + " "; + str += score + "张"; + if (score == lose) str += ""; }); return str; }, }, - trigger:{global:'useCard1'}, - forced:true, - popup:false, - content:function(){ - var storage=player.storage['guimou_0']; - if(!storage[0].includes(trigger.player)){ + trigger: { global: "useCard1" }, + forced: true, + popup: false, + content: function () { + var storage = player.storage["guimou_0"]; + if (!storage[0].includes(trigger.player)) { storage[0].push(trigger.player); storage[1].push(0); } storage[1][storage[0].indexOf(trigger.player)]++; }, }, - '1':{ - charlotte:true, - onremove:true, - init:function(player,skill){ - if(!player.storage[skill]){ - player.storage[skill]=[[],[]]; - var targets=game.filterPlayer().sortBySeat(player); - targets.forEach(target=>{ + 1: { + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) { + player.storage[skill] = [[], []]; + var targets = game.filterPlayer().sortBySeat(player); + targets.forEach((target) => { player.storage[skill][0].push(target); player.storage[skill][1].push(0); }); } }, - mark:true, - intro:{ - markcount:storage=>0, - content:function(storage,player){ - var str='当前弃置牌数排行榜'; - var lose=storage[1].slice().sort((a,b)=>a-b)[0]; - storage[0].forEach(target=>{ - str+='
  • '; - var score=storage[1][storage[0].indexOf(target)]; - if(score==lose) str+=''; - str+=(' '+get.translation(target)+' '); - str+=(score+'张'); - if(score==lose) str+=''; + mark: true, + intro: { + markcount: (storage) => 0, + content: function (storage, player) { + var str = "当前弃置牌数排行榜"; + var lose = storage[1].slice().sort((a, b) => a - b)[0]; + storage[0].forEach((target) => { + str += "
  • "; + var score = storage[1][storage[0].indexOf(target)]; + if (score == lose) + str += ""; + str += " " + get.translation(target) + " "; + str += score + "张"; + if (score == lose) str += ""; }); return str; }, }, - trigger:{global:['loseAfter','loseAsyncAfter']}, - filter:function (event,player){ - return event.type=='discard'&&game.hasPlayer(target=>event.getl(target).cards2.length); + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + return ( + event.type == "discard" && + game.hasPlayer((target) => event.getl(target).cards2.length) + ); }, - forced:true, - popup:false, - content:function(){ - var storage=player.storage['guimou_1']; - var targets=game.filterPlayer(target=>trigger.getl(target).cards2.length); - targets.forEach(target=>{ - if(!storage[0].includes(target)){ + forced: true, + popup: false, + content: function () { + var storage = player.storage["guimou_1"]; + var targets = game.filterPlayer((target) => trigger.getl(target).cards2.length); + targets.forEach((target) => { + if (!storage[0].includes(target)) { storage[0].push(target); storage[1].push(0); } - storage[1][storage[0].indexOf(target)]+=trigger.getl(target).cards2.length; + storage[1][storage[0].indexOf(target)] += trigger.getl(target).cards2.length; }); }, }, - '2':{ - charlotte:true, - onremove:true, - init:function(player,skill){ - if(!player.storage[skill]){ - player.storage[skill]=[[],[]]; - var targets=game.filterPlayer().sortBySeat(player); - targets.forEach(target=>{ + 2: { + charlotte: true, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) { + player.storage[skill] = [[], []]; + var targets = game.filterPlayer().sortBySeat(player); + targets.forEach((target) => { player.storage[skill][0].push(target); player.storage[skill][1].push(0); }); } }, - mark:true, - intro:{ - markcount:storage=>0, - content:function(storage,player){ - var str='当前得到牌数排行榜'; - var lose=storage[1].slice().sort((a,b)=>a-b)[0]; - storage[0].forEach(target=>{ - str+='
  • '; - var score=storage[1][storage[0].indexOf(target)]; - if(score==lose) str+=''; - str+=(' '+get.translation(target)+' '); - str+=(score+'张'); - if(score==lose) str+=''; + mark: true, + intro: { + markcount: (storage) => 0, + content: function (storage, player) { + var str = "当前得到牌数排行榜"; + var lose = storage[1].slice().sort((a, b) => a - b)[0]; + storage[0].forEach((target) => { + str += "
  • "; + var score = storage[1][storage[0].indexOf(target)]; + if (score == lose) + str += ""; + str += " " + get.translation(target) + " "; + str += score + "张"; + if (score == lose) str += ""; }); return str; }, }, - trigger:{global:['gainAfter','loseAsyncAfter']}, - forced:true, - popup:false, - content:function(){ - var storage=player.storage['guimou_2']; - var targets=game.filterPlayer(target=>trigger.getg(target).length); - targets.forEach(target=>{ - if(!storage[0].includes(target)){ + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + forced: true, + popup: false, + content: function () { + var storage = player.storage["guimou_2"]; + var targets = game.filterPlayer((target) => trigger.getg(target).length); + targets.forEach((target) => { + if (!storage[0].includes(target)) { storage[0].push(target); storage[1].push(0); } - storage[1][storage[0].indexOf(target)]+=trigger.getg(target).length; + storage[1][storage[0].indexOf(target)] += trigger.getg(target).length; }); }, }, }, }, - zhouxian:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return event.player!=player&&get.tag(event.card,'damage'); + zhouxian: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return event.player != player && get.tag(event.card, "damage"); }, - forced:true, - logTarget:'player', - content:function*(event,map){ - var player=map.player,trigger=map.trigger,target=trigger.player; - var cards=get.cards(3); + forced: true, + logTarget: "player", + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + target = trigger.player; + var cards = get.cards(3); yield game.cardsDiscard(cards); - player.showCards(cards,get.translation(player)+'发动了【州贤】'); - var result=yield target.chooseToDiscard('he','州贤:弃置一张其中有的类别的牌,或令此牌对'+get.translation(player)+'无效',(card,player)=>{ - return _status.event.cards.some(cardx=>get.type2(cardx)==get.type2(card)); - }).set('cards',cards).set('ai',card=>{ - if(!_status.event.goon) return 0; - return 7.5-get.value(card); - }).set('goon',get.effect(player,trigger.card,target,target)>0); - if(!result.bool) trigger.getParent().excluded.add(player); + player.showCards(cards, get.translation(player) + "发动了【州贤】"); + var result = yield target + .chooseToDiscard( + "he", + "州贤:弃置一张其中有的类别的牌,或令此牌对" + get.translation(player) + "无效", + (card, player) => { + return _status.event.cards.some( + (cardx) => get.type2(cardx) == get.type2(card) + ); + } + ) + .set("cards", cards) + .set("ai", (card) => { + if (!_status.event.goon) return 0; + return 7.5 - get.value(card); + }) + .set("goon", get.effect(player, trigger.card, target, target) > 0); + if (!result.bool) trigger.getParent().excluded.add(player); }, - ai:{ - effect:{ - target_use:function(card,player,target,current){ - if(get.tag(card,'damage')&&get.attitude(player,target)<0&&target!=player){ - if(_status.event.name=='zhouxian') return; - if(get.attitude(player,target)>0&¤t<0) return 'zerotarget'; - var bs=player.getDiscardableCards(player,'he'); + ai: { + effect: { + target_use: function (card, player, target, current) { + if ( + get.tag(card, "damage") && + get.attitude(player, target) < 0 && + target != player + ) { + if (_status.event.name == "zhouxian") return; + if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; + var bs = player.getDiscardableCards(player, "he"); bs.remove(card); - if(card.cards) bs.removeArray(card.cards); + if (card.cards) bs.removeArray(card.cards); else bs.removeArray(ui.selected.cards); - var cardx=Array.from(ui.cardPile.childNodes).slice(0,3); - bs=bs.filter(i=>cardx.some(j=>get.type2(j)==get.type2(i))); - if(!bs.length) return 'zerotarget'; - if(bs.length<=2){ - if(bs.some(bsi=>get.value(bsi)<7)) return [1,0,1,-0.5]; - return [1,0,0.3,0]; + var cardx = Array.from(ui.cardPile.childNodes).slice(0, 3); + bs = bs.filter((i) => cardx.some((j) => get.type2(j) == get.type2(i))); + if (!bs.length) return "zerotarget"; + if (bs.length <= 2) { + if (bs.some((bsi) => get.value(bsi) < 7)) return [1, 0, 1, -0.5]; + return [1, 0, 0.3, 0]; } - return [1,0,1,-0.5]; + return [1, 0, 1, -0.5]; } }, }, }, }, //胡班 - mbyilie:{ - audio:3, - trigger:{global:'phaseBefore',player:'enterGame'}, - filter:function(event,player){ - return !player.storage.mbyilie2&&(event.name!='phase'||game.phaseNumber==0); + mbyilie: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + filter: function (event, player) { + return !player.storage.mbyilie2 && (event.name != "phase" || game.phaseNumber == 0); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('mbyilie'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return Math.max(1+get.attitude(player,target)*get.threaten(target),Math.random()); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('mbyilie',target); - player.storage.mbyilie2=target; - player.addSkill('mbyilie2'); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("mbyilie"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + return Math.max( + 1 + get.attitude(player, target) * get.threaten(target), + Math.random() + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mbyilie", target); + player.storage.mbyilie2 = target; + player.addSkill("mbyilie2"); } }, - marktext:'烈', - intro:{ - name2:'烈', - content:'mark', + marktext: "烈", + intro: { + name2: "烈", + content: "mark", }, - group:'mbyilie3', + group: "mbyilie3", }, - mbyilie2:{ - charlotte:true, - audio:'mbyilie', - trigger:{global:['damageBegin4','damageSource']}, - filter:function(event,player,name){ - var target=player.storage.mbyilie2; - if(name=='damageSource') return event.source==target&&event.player!=target&&player.isDamaged(); - return event.player==target&&player.countMark('mbyilie')<2; + mbyilie2: { + charlotte: true, + audio: "mbyilie", + trigger: { global: ["damageBegin4", "damageSource"] }, + filter: function (event, player, name) { + var target = player.storage.mbyilie2; + if (name == "damageSource") + return event.source == target && event.player != target && player.isDamaged(); + return event.player == target && player.countMark("mbyilie") < 2; }, - forced:true, - logTarget:function(event,player){ + forced: true, + logTarget: function (event, player) { return player.storage.mbyilie2; }, - content:function(){ - if(event.triggername=='damageSource') player.recover(); - else{ - player.addMark('mbyilie',trigger.num); + content: function () { + if (event.triggername == "damageSource") player.recover(); + else { + player.addMark("mbyilie", trigger.num); trigger.cancel(); } }, }, - mbyilie3:{ - audio:'mbyilie', - trigger:{player:'phaseEnd'}, + mbyilie3: { + audio: "mbyilie", + trigger: { player: "phaseEnd" }, //filter:function(event,player){ // return player.countMark('mbyilie'); //}, - forced:true, - content:function(){ - 'step 0' + forced: true, + content: function () { + "step 0"; player.draw(); - 'step 1' - var num=player.countMark('mbyilie'); - if(num){ + ("step 1"); + var num = player.countMark("mbyilie"); + if (num) { player.loseHp(num); - player.removeMark('mbyilie',num); + player.removeMark("mbyilie", num); } }, }, //向朗 - naxue:{ - audio:2, - trigger:{player:'phaseUseBefore'}, - check:function(event,player){ - var cards=player.getCards('h',card=>player.hasValueTarget(card)); - if(!cards.length) return true; - if(!(player.hp>=2&&player.countCards('h')<=player.hp+1)) return false; - return game.hasPlayer(function(target){ - if(target.hasJudge('lebu')||target==player) return false; - if(get.attitude(player,target)>4){ - return (get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1)>0); + naxue: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + check: function (event, player) { + var cards = player.getCards("h", (card) => player.hasValueTarget(card)); + if (!cards.length) return true; + if (!(player.hp >= 2 && player.countCards("h") <= player.hp + 1)) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return ( + get.threaten(target) / + Math.sqrt(target.hp + 1) / + Math.sqrt(target.countCards("h") + 1) > + 0 + ); } return false; }); }, - content:function*(event,map){ - var player=map.player; + content: function* (event, map) { + var player = map.player; map.trigger.cancel(); - var num=player.countDiscardableCards(player,'he'); - if(num){ - var result=yield player.chooseToDiscard('纳学:是否弃置任意张牌并摸等量的牌?','he',[1,num]).set('ai',lib.skill.zhiheng.check); - if(result.bool) yield player.draw(result.cards.length); + var num = player.countDiscardableCards(player, "he"); + if (num) { + var result = yield player + .chooseToDiscard("纳学:是否弃置任意张牌并摸等量的牌?", "he", [1, num]) + .set("ai", lib.skill.zhiheng.check); + if (result.bool) yield player.draw(result.cards.length); } - if(player.countCards('h')){ - var result2=yield player.chooseCardTarget({ - prompt:'是否交给至多两名其他角色各一张手牌?', - prompt2:'先按顺序选中所有要给出的牌,然后再按顺序选择等量的目标角色。', - selectCard:[1,2], - filterCard:true, - filterTarget:lib.filter.notMe, - selectTarget:function(){ + if (player.countCards("h")) { + var result2 = yield player.chooseCardTarget({ + prompt: "是否交给至多两名其他角色各一张手牌?", + prompt2: "先按顺序选中所有要给出的牌,然后再按顺序选择等量的目标角色。", + selectCard: [1, 2], + filterCard: true, + filterTarget: lib.filter.notMe, + selectTarget: function () { return ui.selected.cards.length; }, - filterOk:()=>{ - return ui.selected.cards.length==ui.selected.targets.length; + filterOk: () => { + return ui.selected.cards.length == ui.selected.targets.length; }, - position:'h', - ai1:function(card){ - if(card.name=='du') return 10; - else if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - var player=_status.event.player; - if(ui.selected.cards.length>4||!game.hasPlayer(function(current){ - return get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); - })) return 0; - return 1/Math.max(0.1,get.value(card)); + position: "h", + ai1: function (card) { + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") + return 0; + var player = _status.event.player; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(ui.selected.cards[0].name=='du') return -att; - if(target.hasSkillTag('nogain')) att/=6; + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; return att; }, }); - if(result2.bool){ - const list=[]; - for(let i=0;itarget!=player); + yijie: { + audio: 2, + trigger: { player: "die" }, + filter: function (event, player) { + return game.hasPlayer((target) => target != player); }, - forced:true, - forceDie:true, - skillAnimation:true, - animationColor:'orange', - logTarget:function(event,player){ - return game.filterPlayer(target=>target!=player); + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "orange", + logTarget: function (event, player) { + return game.filterPlayer((target) => target != player); }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(target=>target!=player); - var sum=targets.reduce((num,target)=>num+=target.hp,0); - sum=Math.max(1,Math.floor(sum/targets.length)); - event.num=sum; - event.targets=targets; - 'step 1' - var target=targets.shift(); - var delta=target.hp-num; - if(delta!=0){ - target[delta>0?'loseHp':'recover'](Math.abs(delta)); + content: function () { + "step 0"; + var targets = game.filterPlayer((target) => target != player); + var sum = targets.reduce((num, target) => (num += target.hp), 0); + sum = Math.max(1, Math.floor(sum / targets.length)); + event.num = sum; + event.targets = targets; + ("step 1"); + var target = targets.shift(); + var delta = target.hp - num; + if (delta != 0) { + target[delta > 0 ? "loseHp" : "recover"](Math.abs(delta)); } - if(targets.length) event.redo(); + if (targets.length) event.redo(); }, }, //阎象 - kujian:{ - audio:'twkujian', - inherit:'twkujian', - selectCard:[1,2], - content:function(){ - player.give(cards,target).gaintag.add('twkujianx'); - player.addSkill('kujian_draw'); - player.addSkill('twkujian_discard'); + kujian: { + audio: "twkujian", + inherit: "twkujian", + selectCard: [1, 2], + content: function () { + player.give(cards, target).gaintag.add("twkujianx"); + player.addSkill("kujian_draw"); + player.addSkill("twkujian_discard"); }, - subSkill:{ - draw:{ - charlotte:true, - audio:'twkujian', - trigger:{global:['useCardAfter','respondAfter']}, - filter:function(event,player){ - return event.player.hasHistory('lose',evt=>{ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('twkujianx')) return true; + subSkill: { + draw: { + charlotte: true, + audio: "twkujian", + trigger: { global: ["useCardAfter", "respondAfter"] }, + filter: function (event, player) { + return event.player.hasHistory("lose", (evt) => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; } }); }, - forced:true, - logTarget:'player', - content:function(){ - 'step 0' - game.asyncDraw([player,trigger.player],2); - 'step 1' + forced: true, + logTarget: "player", + content: function () { + "step 0"; + game.asyncDraw([player, trigger.player], 2); + ("step 1"); game.delayx(); }, }, }, }, //手杀差异化孙鲁育 - mbmumu:{ - audio:'mumu', - inherit:'new_mumu', - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current.countCards('e')>0; + mbmumu: { + audio: "mumu", + inherit: "new_mumu", + filter: function (event, player) { + return game.hasPlayer((current) => { + return current.countCards("e") > 0; }); }, - content:function (){ - 'step 0' - player.chooseTarget(get.prompt('mbmumu'),'弃置场上的一张装备牌,或者获得场上的一张防具牌。',function(card,player,target){ - return target.countCards('e')>0; - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target) - if(target.getEquip(2)&&player.hasEmptySlot(2)){ - return -2*att; - } - return -att; - }); - 'step 1' - if(result.bool&&result.targets&&result.targets.length){ - event.target=result.targets[0]; - player.logSkill('mbmumu',event.target); - player.line(event.target,'green'); - var e=event.target.getEquips(2); - event.e=e; - if(e.length>0){ - player.chooseControl('弃置一张装备牌','获得一张防具牌').set('ai',function(){ - if(_status.event.player.getEquips(2).length>0){ - return '弃置一张装备牌'; + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("mbmumu"), + "弃置场上的一张装备牌,或者获得场上的一张防具牌。", + function (card, player, target) { + return target.countCards("e") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.getEquip(2) && player.hasEmptySlot(2)) { + return -2 * att; + } + return -att; + }); + ("step 1"); + if (result.bool && result.targets && result.targets.length) { + event.target = result.targets[0]; + player.logSkill("mbmumu", event.target); + player.line(event.target, "green"); + var e = event.target.getEquips(2); + event.e = e; + if (e.length > 0) { + player.chooseControl("弃置一张装备牌", "获得一张防具牌").set("ai", function () { + if (_status.event.player.getEquips(2).length > 0) { + return "弃置一张装备牌"; } - return '获得一张防具牌'; + return "获得一张防具牌"; }); + } else { + event.choice = "弃置一张装备牌"; } - else{ - event.choice='弃置一张装备牌'; - } - } - else event.finish(); - 'step 2' - var choice=event.choice||result.control; - if(choice=='弃置一张装备牌'){ - player.discardPlayerCard(event.target,'e',true); - } - else{ - if(event.e){ - player.gain(event.e,event.target,'give','bySelf'); - player.addTempSkill('new_mumu2'); + } else event.finish(); + ("step 2"); + var choice = event.choice || result.control; + if (choice == "弃置一张装备牌") { + player.discardPlayerCard(event.target, "e", true); + } else { + if (event.e) { + player.gain(event.e, event.target, "give", "bySelf"); + player.addTempSkill("new_mumu2"); } } }, }, - mbmeibu:{ - inherit:'new_meibu', - derivation:['mbzhixi'], - content:function (){ - "step 0" - var check=lib.skill.new_meibu.checkx(trigger,player); - player.chooseToDiscard(get.prompt2('mbmeibu',trigger.player),'he').set('ai',function(card){ - if(_status.event.check) return 6-get.value(card); - return 0; - }).set('check',check).set('logSkill',['mbmeibu',trigger.player]); - "step 1" - if(result.bool){ - var target=trigger.player; - var card=result.cards[0]; - player.line(target,'green'); - target.addTempSkills('mbzhixi','phaseUseAfter'); - if(card.name!='sha'&&get.type(card)!='trick'&&get.color(card)!='black'){ - target.addTempSkill('new_meibu_range','phaseUseAfter'); - target.markAuto('new_meibu_range',player); + mbmeibu: { + inherit: "new_meibu", + derivation: ["mbzhixi"], + content: function () { + "step 0"; + var check = lib.skill.new_meibu.checkx(trigger, player); + player + .chooseToDiscard(get.prompt2("mbmeibu", trigger.player), "he") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", check) + .set("logSkill", ["mbmeibu", trigger.player]); + ("step 1"); + if (result.bool) { + var target = trigger.player; + var card = result.cards[0]; + player.line(target, "green"); + target.addTempSkills("mbzhixi", "phaseUseAfter"); + if (card.name != "sha" && get.type(card) != "trick" && get.color(card) != "black") { + target.addTempSkill("new_meibu_range", "phaseUseAfter"); + target.markAuto("new_meibu_range", player); } - target.markSkillCharacter('mbmeibu',player,'魅步','锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。'); + target.markSkillCharacter( + "mbmeibu", + player, + "魅步", + "锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。" + ); } }, }, - mbzhixi:{ - mod:{ - cardEnabled:function(card,player){ - if(player.countMark('mbzhixi')>=player.hp) return false; + mbzhixi: { + mod: { + cardEnabled: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; }, - cardUsable:function(card,player){ - if(player.countMark('mbzhixi')>=player.hp) return false; + cardUsable: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; }, - cardRespondable:function(card,player){ - if(player.countMark('mbzhixi')>=player.hp) return false; + cardRespondable: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; }, - cardSavable:function(card,player){ - if(player.countMark('mbzhixi')>=player.hp) return false; + cardSavable: function (card, player) { + if (player.countMark("mbzhixi") >= player.hp) return false; }, }, - trigger:{ - player:"useCard1", + trigger: { + player: "useCard1", }, - forced:true, - popup:false, - onremove:true, - firstDo:true, - init:function(player,skill){ - player.storage[skill]=0; - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.player==player){ - player.getHistory('useCard',function(evtx){ - if(evtx.getParent('phaseUse')==evt){ + forced: true, + popup: false, + onremove: true, + firstDo: true, + init: function (player, skill) { + player.storage[skill] = 0; + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.player == player) { + player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") == evt) { player.storage[skill]++; } - }) + }); } }, - onremove:function(player){ - player.unmarkSkill('mbmeibu'); + onremove: function (player) { + player.unmarkSkill("mbmeibu"); delete player.storage.mbzhixi; }, - content:function(){ - player.addMark('mbzhixi',1,false); - if(get.type2(trigger.card)=='trick'){ - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.player==player){ - evt.skipped=true; - game.log(player,'结束了出牌阶段'); + content: function () { + player.addMark("mbzhixi", 1, false); + if (get.type2(trigger.card) == "trick") { + var evt = trigger.getParent("phaseUse"); + if (evt && evt.player == player) { + evt.skipped = true; + game.log(player, "结束了出牌阶段"); } } }, - ai:{presha:true,pretao:true,nokeep:true}, + ai: { presha: true, pretao: true, nokeep: true }, }, //庞统 - xinlianhuan:{ - audio:2, - audioname:['ol_pangtong'], - inherit:'lianhuan', - group:'xinlianhuan_add', - subSkill:{ - add:{ - audio:'xinlianhuan', - audioname:['ol_pangtong'], - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='tiesuo') return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(current=>{ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current); - })) return true; + xinlianhuan: { + audio: 2, + audioname: ["ol_pangtong"], + inherit: "lianhuan", + group: "xinlianhuan_add", + subSkill: { + add: { + audio: "xinlianhuan", + audioname: ["ol_pangtong"], + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "tiesuo") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer((current) => { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) + ); + }) + ) + return true; } return false; }, - charlotte:true, - forced:true, - popup:false, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('xinlianhuan'),'为'+get.translation(trigger.card)+'额外指定一个目标',(card,player,target)=>{ - return !_status.event.sourcex.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayex(); - } - else event.finish(); - 'step 2' - if(result.bool){ - var targets=result.targets; - player.logSkill('xinlianhuan_add',targets); + charlotte: true, + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("xinlianhuan"), + "为" + get.translation(trigger.card) + "额外指定一个目标", + (card, player, target) => { + return ( + !_status.event.sourcex.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayex(); + } else event.finish(); + ("step 2"); + if (result.bool) { + var targets = result.targets; + player.logSkill("xinlianhuan_add", targets); trigger.targets.addArray(targets); - game.log(targets,'也成为了',trigger.card,'的目标'); + game.log(targets, "也成为了", trigger.card, "的目标"); } }, }, }, }, //吴班 - xinjintao:{ - audio:'jintao', - inherit:'jintao', - content:function(){ - var evt=trigger.getParent('phaseUse'); - var index=player.getHistory('useCard',function(evtx){ - return evtx.card.name=='sha'&&evtx.getParent('phaseUse')==evt; - }).indexOf(trigger); - if(index==0){ - game.log(trigger.card,'不可被响应'); + xinjintao: { + audio: "jintao", + inherit: "jintao", + content: function () { + var evt = trigger.getParent("phaseUse"); + var index = player + .getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + }) + .indexOf(trigger); + if (index == 0) { + game.log(trigger.card, "不可被响应"); trigger.directHit.addArray(game.players); - } - else{ - game.log(trigger.card,'伤害+1'); - if(typeof trigger.baseDamage!='number') trigger.baseDamage=1; + } else { + game.log(trigger.card, "伤害+1"); + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; trigger.baseDamage++; } }, }, //鲍信 - mutao:{ - audio:'twmutao', - inherit:'twmutao', - content:function(){ - 'step 0' - event.togive=target.getNext(); - var cards=target.getCards('h',{name:'sha'}); - if(!cards.length){ - game.log('但',target,'没有','#y杀','!'); + mutao: { + audio: "twmutao", + inherit: "twmutao", + content: function () { + "step 0"; + event.togive = target.getNext(); + var cards = target.getCards("h", { name: "sha" }); + if (!cards.length) { + game.log("但", target, "没有", "#y杀", "!"); event.finish(); - } - else target.addToExpansion(cards,target,'give').gaintag.add('mutao'); - 'step 1' - var card=target.getExpansions('mutao').randomGet(); - target.give(card,event.togive); - 'step 2' - if(target.getExpansions('mutao').length){ - event.togive=event.togive.getNext(); + } else target.addToExpansion(cards, target, "give").gaintag.add("mutao"); + ("step 1"); + var card = target.getExpansions("mutao").randomGet(); + target.give(card, event.togive); + ("step 2"); + if (target.getExpansions("mutao").length) { + event.togive = event.togive.getNext(); event.goto(1); - } - else{ + } else { target.line(event.togive); - event.togive.damage(Math.min(2,event.togive.countCards('h',{name:'sha'})),target); + event.togive.damage( + Math.min(2, event.togive.countCards("h", { name: "sha" })), + target + ); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, }, - yimou:{ - audio:'twyimou', - inherit:'twyimou', - content:function(){ - 'step 0' - if(trigger.player!=player) player.addExpose(0.3); - var target=get.translation(trigger.player); - var choiceList=[ - '令'+target+'获得牌堆里的一张【杀】', - '令'+target+'将一张牌交给另一名角色,然后'+target+'摸一张牌', + yimou: { + audio: "twyimou", + inherit: "twyimou", + content: function () { + "step 0"; + if (trigger.player != player) player.addExpose(0.3); + var target = get.translation(trigger.player); + var choiceList = [ + "令" + target + "获得牌堆里的一张【杀】", + "令" + target + "将一张牌交给另一名角色,然后" + target + "摸一张牌", ]; - var list=['选项一']; - if(trigger.player.countCards('h')) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - player.chooseControl(list).set('prompt','毅谋:请选择一项').set('choiceList',choiceList).set('ai',function(){ - var evt=_status.event.getTrigger(),list=_status.event.list; - var player=_status.event.player; - var target=evt.player; - if(target.countCards('h')&&list.includes('选项二')) return '选项二'; - return '选项一'; - }).set('list',list); - 'step 1' - event.choice=result.control; - 'step 2' - if(event.choice!='选项二'){ - var card=get.cardPile2(function(card){ - return card.name=='sha'; + var list = ["选项一"]; + if (trigger.player.countCards("h")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + player + .chooseControl(list) + .set("prompt", "毅谋:请选择一项") + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event.getTrigger(), + list = _status.event.list; + var player = _status.event.player; + var target = evt.player; + if (target.countCards("h") && list.includes("选项二")) return "选项二"; + return "选项一"; + }) + .set("list", list); + ("step 1"); + event.choice = result.control; + ("step 2"); + if (event.choice != "选项二") { + var card = get.cardPile2(function (card) { + return card.name == "sha"; }); - if(card) trigger.player.gain(card,'gain2'); - else game.log('但牌堆里已经没有','#y杀','了!'); - if(event.choice=='选项一') event.finish(); + if (card) trigger.player.gain(card, "gain2"); + else game.log("但牌堆里已经没有", "#y杀", "了!"); + if (event.choice == "选项一") event.finish(); } - 'step 3' - if(event.choice!='选项一'){ - if(trigger.player.countCards('h')) trigger.player.chooseCardTarget({ - prompt:'毅谋:将一张手牌交给另一名其他角色', - filterCard:true, - forced:true, - filterTarget:lib.filter.notMe, - ai1:function(card){ - return 1/Math.max(0.1,get.value(card)); - }, - ai2:function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) att/=9; - return 4+att; - }, - }); + ("step 3"); + if (event.choice != "选项一") { + if (trigger.player.countCards("h")) + trigger.player.chooseCardTarget({ + prompt: "毅谋:将一张手牌交给另一名其他角色", + filterCard: true, + forced: true, + filterTarget: lib.filter.notMe, + ai1: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 9; + return 4 + att; + }, + }); else event.finish(); } - 'step 4' - var target=result.targets[0]; + ("step 4"); + var target = result.targets[0]; trigger.player.line(target); - trigger.player.give(result.cards,target); + trigger.player.give(result.cards, target); trigger.player.draw(); }, }, //蒋济 - jilun:{ - audio:'twjilun', - inherit:'twjilun', - filter:function(event,player){ - return player.hasSkill('twjichou',null,false,false); + jilun: { + audio: "twjilun", + inherit: "twjilun", + filter: function (event, player) { + return player.hasSkill("twjichou", null, false, false); }, - content:function(){ - 'step 0' - var choices=['选项一']; - var choiceList=[ - '摸两张牌', - '获得一个“机论”标记', - ]; - if(!player.getStorage('twjichou').length||!player.getStorage('twjichou').filter(function(name){ - return !player.getStorage('jilun').includes(name)&&player.hasUseTarget({name:name}); - }).length) choiceList[1]=''+choiceList[1]+''; - else choices.push('选项二'); - player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('jilun')).set('ai',()=>{ - if(_status.event.choiceList.length==1||!player.getStorage('twjichou').length) return 0; - var val=player.getUseValue({name:'wuzhong'}); - for(var name of player.getStorage('twjichou')){ - if(player.getStorage('jilun').includes(name)) continue; - if(player.getUseValue({name:name})>val) return 1; - } - return 0; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('jilun'); - if(result.control=='选项一') player.draw(2); - else player.addMark('jilun_mark',1); + content: function () { + "step 0"; + var choices = ["选项一"]; + var choiceList = ["摸两张牌", "获得一个“机论”标记"]; + if ( + !player.getStorage("twjichou").length || + !player.getStorage("twjichou").filter(function (name) { + return ( + !player.getStorage("jilun").includes(name) && + player.hasUseTarget({ name: name }) + ); + }).length + ) + choiceList[1] = '' + choiceList[1] + ""; + else choices.push("选项二"); + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("jilun")) + .set("ai", () => { + if (_status.event.choiceList.length == 1 || !player.getStorage("twjichou").length) + return 0; + var val = player.getUseValue({ name: "wuzhong" }); + for (var name of player.getStorage("twjichou")) { + if (player.getStorage("jilun").includes(name)) continue; + if (player.getUseValue({ name: name }) > val) return 1; + } + return 0; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("jilun"); + if (result.control == "选项一") player.draw(2); + else player.addMark("jilun_mark", 1); } }, - group:'jilun_effect', - subSkill:{ - mark:{ - intro:{content:'mark'}, + group: "jilun_effect", + subSkill: { + mark: { + intro: { content: "mark" }, }, - effect:{ - audio:'twjilun', - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasMark('jilun_mark'); + effect: { + audio: "twjilun", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasMark("jilun_mark"); }, - forced:true, - content:function(){ - 'step 0' - if(!player.getStorage('twjichou').length||!player.getStorage('twjichou').filter(function(name){ - return !player.getStorage('jilun').includes(name)&&player.hasUseTarget({name:name}); - }).length){ - if(player.hasMark('jilun_mark')) player.removeMark('jilun_mark',player.countMark('jilun_mark')); + forced: true, + content: function () { + "step 0"; + if ( + !player.getStorage("twjichou").length || + !player.getStorage("twjichou").filter(function (name) { + return ( + !player.getStorage("jilun").includes(name) && + player.hasUseTarget({ name: name }) + ); + }).length + ) { + if (player.hasMark("jilun_mark")) + player.removeMark("jilun_mark", player.countMark("jilun_mark")); event.finish(); return; } - var list=[]; - for(var name of player.getStorage('twjichou')){ - if(!player.getStorage('jilun').includes(name)){ - list.push(['锦囊','',name]); + var list = []; + for (var name of player.getStorage("twjichou")) { + if (!player.getStorage("jilun").includes(name)) { + list.push(["锦囊", "", name]); } } - player.chooseButton(['###机论:请选择你要执行的选项###
  • 失去1枚“机论”标记,视为使用一张〖急筹〗已记录但〖机论〗未记录的普通锦囊牌
  • 失去所有“机论”标记',[list,'vcard']]).set('filterButton',function(button){ - return _status.event.player.hasUseTarget({name:button.link[2]}); - }).set('ai',function(button){ - return _status.event.getParent().player.getUseValue({name:button.link[2]},null,true); - }); - 'step 1' - if(result.bool){ - player.removeMark('jilun_mark',1); - var card={name:result.links[0][2],isCard:true}; - player.chooseUseTarget(card,true); - player.markAuto('jilun',[card.name]); - player.syncStorage('jilun'); - } - else{ - player.removeMark('jilun_mark',player.countMark('jilun_mark')); + player + .chooseButton([ + '###机论:请选择你要执行的选项###
  • 失去1枚“机论”标记,视为使用一张〖急筹〗已记录但〖机论〗未记录的普通锦囊牌
  • 失去所有“机论”标记', + [list, "vcard"], + ]) + .set("filterButton", function (button) { + return _status.event.player.hasUseTarget({ name: button.link[2] }); + }) + .set("ai", function (button) { + return _status.event + .getParent() + .player.getUseValue({ name: button.link[2] }, null, true); + }); + ("step 1"); + if (result.bool) { + player.removeMark("jilun_mark", 1); + var card = { name: result.links[0][2], isCard: true }; + player.chooseUseTarget(card, true); + player.markAuto("jilun", [card.name]); + player.syncStorage("jilun"); + } else { + player.removeMark("jilun_mark", player.countMark("jilun_mark")); event.finish(); } - 'step 2' - if(player.hasMark('jilun_mark')) event.goto(0); + ("step 2"); + if (player.hasMark("jilun_mark")) event.goto(0); }, }, }, - ai:{ - combo:'twjichou' - } + ai: { + combo: "twjichou", + }, }, //李遗 - jiaohua:{ - onremove:true, - audio:'twjiaohua', - enable:'phaseUse', - usable:2, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('###教化###选择一种牌的类型,令一名角色从牌堆获得此类型的一张牌'); + jiaohua: { + onremove: true, + audio: "twjiaohua", + enable: "phaseUse", + usable: 2, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog( + "###教化###选择一种牌的类型,令一名角色从牌堆获得此类型的一张牌" + ); }, - chooseControl:function(event,player){ - var list=['basic','trick','equip'].filter(type=>!player.getStorage('jiaohua').includes(type)); - list.push('cancel2'); + chooseControl: function (event, player) { + var list = ["basic", "trick", "equip"].filter( + (type) => !player.getStorage("jiaohua").includes(type) + ); + list.push("cancel2"); return list; }, - check:function(event,player){ - var list=['trick','equip','basic'].filter(type=>!player.getStorage('jiaohua').includes(type)); + check: function (event, player) { + var list = ["trick", "equip", "basic"].filter( + (type) => !player.getStorage("jiaohua").includes(type) + ); return list[0]; }, - backup:function(result,player){ - return{ - type:result.control, - audio:'twjiaohua', - filterCard:()=>false, - selectCard:-1, - filterTarget:true, - content:function(){ - 'step 0' - var type=lib.skill.jiaohua_backup.type; - var card=get.cardPile2(card=>get.type2(card)==type); - if(card) target.gain(card,'gain2'); - else game.log('但牌堆里已经没有','#y'+get.translation(type)+'牌','了!'); - 'step 1' - player.markAuto('jiaohua',[lib.skill.jiaohua_backup.type]); - 'step 2' - if(!['basic','trick','equip'].some(type=>!player.getStorage('jiaohua').includes(type))){ - player.popup('教化'); - player.unmarkAuto('jiaohua',player.getStorage('jiaohua')); - game.log(player,'清空了','#g【教化】','记录'); + backup: function (result, player) { + return { + type: result.control, + audio: "twjiaohua", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + content: function () { + "step 0"; + var type = lib.skill.jiaohua_backup.type; + var card = get.cardPile2((card) => get.type2(card) == type); + if (card) target.gain(card, "gain2"); + else + game.log("但牌堆里已经没有", "#y" + get.translation(type) + "牌", "了!"); + ("step 1"); + player.markAuto("jiaohua", [lib.skill.jiaohua_backup.type]); + ("step 2"); + if ( + !["basic", "trick", "equip"].some( + (type) => !player.getStorage("jiaohua").includes(type) + ) + ) { + player.popup("教化"); + player.unmarkAuto("jiaohua", player.getStorage("jiaohua")); + game.log(player, "清空了", "#g【教化】", "记录"); } }, - ai:{ - result:{target:1}, + ai: { + result: { target: 1 }, }, - } + }; }, - prompt:function(result,player){ - return '令一名角色从牌堆中获得一张'+get.translation(result.control)+'牌'; + prompt: function (result, player) { + return "令一名角色从牌堆中获得一张" + get.translation(result.control) + "牌"; }, }, - ai:{ - order:7, - result:{player:1}, + ai: { + order: 7, + result: { player: 1 }, }, - intro:{content:'已记录$牌'}, + intro: { content: "已记录$牌" }, }, //来敏 - laishou:{ - audio:3, - trigger:{player:['damageBegin4','phaseZhunbeiBegin']}, - filter:function(event,player){ - var num=9; - if(event.name=='damage') return event.num>=player.getHp()&&player.maxHp=num; + laishou: { + audio: 3, + trigger: { player: ["damageBegin4", "phaseZhunbeiBegin"] }, + filter: function (event, player) { + var num = 9; + if (event.name == "damage") return event.num >= player.getHp() && player.maxHp < num; + return player.maxHp >= num; }, - forced:true, - content:function(){ - if(trigger.name=='damage'){ + forced: true, + content: function () { + if (trigger.name == "damage") { player.gainMaxHp(trigger.num); trigger.cancel(); - } - else player.die(); + } else player.die(); }, }, - luanqun:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h'); + luanqun: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h"); }, - usable:1, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>current.countCards('h')).sortBySeat(); - event.targets=targets; - var next=player.chooseCardOL(targets,'乱群:请选择要展示的牌',true).set('ai',function(card){ - return -get.value(card); - }).set('source',player); - next.aiCard=function(target){ - var hs=target.getCards('h'); - return {bool:true,cards:[hs.randomGet()]}; + usable: 1, + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => current.countCards("h")).sortBySeat(); + event.targets = targets; + var next = player + .chooseCardOL(targets, "乱群:请选择要展示的牌", true) + .set("ai", function (card) { + return -get.value(card); + }) + .set("source", player); + next.aiCard = function (target) { + var hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; }; - next._args.remove('glow_result'); - 'step 1' - var cards=[]; - event.videoId=lib.status.videoId++; - for(var i=0;icardy!=card&&get.color(cardy,targets[cards.indexOf(cardy)])==get.color(card,player)); - if(cardx.length){ - player.chooseButton(['乱群:是否获得其中的一张牌',cardx]).set('forceAuto',true).set('ai',function(button){ - var cards=_status.event.list[0]; - var targets=_status.event.list[1]; - var player=_status.event.player; - if(get.attitude(player,targets[cards.indexOf(button.link)])>0) return 0; - return get.value(button.link,player); - }).set('list',[cards,targets]); + ("step 2"); + game.broadcastAll("closeDialog", event.videoId); + var card = cards[targets.indexOf(player)]; + var cardx = cards.filter( + (cardy) => + cardy != card && + get.color(cardy, targets[cards.indexOf(cardy)]) == get.color(card, player) + ); + if (cardx.length) { + player + .chooseButton(["乱群:是否获得其中的一张牌", cardx]) + .set("forceAuto", true) + .set("ai", function (button) { + var cards = _status.event.list[0]; + var targets = _status.event.list[1]; + var player = _status.event.player; + if (get.attitude(player, targets[cards.indexOf(button.link)]) > 0) return 0; + return get.value(button.link, player); + }) + .set("list", [cards, targets]); + } else event.goto(4); + ("step 3"); + if (result.bool) { + var card = result.links[0]; + player.gain(card, get.owner(card), "give"); } - else event.goto(4); - 'step 3' - if(result.bool){ - var card=result.links[0]; - player.gain(card,get.owner(card),'give'); - } - 'step 4' - var card=cards[targets.indexOf(player)]; - targets=targets.filter(target=>get.color(cards[targets.indexOf(target)],target)!=get.color(card,player)); - if(targets.length){ + ("step 4"); + var card = cards[targets.indexOf(player)]; + targets = targets.filter( + (target) => + get.color(cards[targets.indexOf(target)], target) != get.color(card, player) + ); + if (targets.length) { player.line(targets); - targets.forEach(target=>{ - target.addTempSkill('luanqun_effect',{player:'phaseUseAfter'}); - target.markAuto('luanqun_effect',[player]); + targets.forEach((target) => { + target.addTempSkill("luanqun_effect", { player: "phaseUseAfter" }); + target.markAuto("luanqun_effect", [player]); }); } }, - ai:{ - order:9, - result:{ - player:function(player,target){ - if(player.hasSkill('laishou')) return 1; - return player.hp>=2?1:0; + ai: { + order: 9, + result: { + player: function (player, target) { + if (player.hasSkill("laishou")) return 1; + return player.hp >= 2 ? 1 : 0; }, }, }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - intro:{content:'出牌阶段第一张【杀】只能指定$为目标,且此牌不可被响应'}, - mod:{ - playerEnabled:function(card,player,target){ - if(!player.isPhaseUsing()) return; - if(card.name=='sha'&&!player.getStorage('luanqun_effect').includes(target)) return false; + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { content: "出牌阶段第一张【杀】只能指定$为目标,且此牌不可被响应" }, + mod: { + playerEnabled: function (card, player, target) { + if (!player.isPhaseUsing()) return; + if ( + card.name == "sha" && + !player.getStorage("luanqun_effect").includes(target) + ) + return false; }, }, - trigger:{player:'useCard1'}, - filter:function(event,player){ - return player.isPhaseUsing()&&event.card.name=='sha'; + trigger: { player: "useCard1" }, + filter: function (event, player) { + return player.isPhaseUsing() && event.card.name == "sha"; }, - forced:true, - content:function(){ - trigger.directHit.addArray(player.getStorage('luanqun_effect')); - player.removeSkill('luanqun_effect'); + forced: true, + content: function () { + trigger.directHit.addArray(player.getStorage("luanqun_effect")); + player.removeSkill("luanqun_effect"); }, }, }, }, //☆周不疑 - mbhuiyao:{ - audio:2, - enable:'phaseUse', - usable:1, + mbhuiyao: { + audio: 2, + enable: "phaseUse", + usable: 1, // filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - player.damage('nosource'); - 'step 1' - if(game.countPlayer()<2) event.finish(); - if(game.countPlayer()==2) event._result={bool:true,targets:[game.findPlayer(i=>i!=player),player]}; - else player.chooseTarget(`慧夭:请选择两名角色`,`令不为你的第一名角色视为对第二名角色造成过1点伤害。`,(card,player,target)=>{ - if(!ui.selected.targets.length) return player!=target; - return true; - },2,true).set('multitarget',true).set('targetprompt',['伤害来源','受伤角色']).set('ai',target=>{ - return target==get.event('aiTargets')[ui.selected.targets.length]?10:0; - }).set('aiTargets',lib.skill.mbhuiyao.getUnrealDamageTargets(player,[game.filterPlayer(i=>i!=player),game.filterPlayer()],true)); - 'step 2' - if(result.bool){ - var targets=result.targets; - player.line2(targets,'green'); + content: function () { + "step 0"; + player.damage("nosource"); + ("step 1"); + if (game.countPlayer() < 2) event.finish(); + if (game.countPlayer() == 2) + event._result = { + bool: true, + targets: [game.findPlayer((i) => i != player), player], + }; + else + player + .chooseTarget( + `慧夭:请选择两名角色`, + `令不为你的第一名角色视为对第二名角色造成过1点伤害。`, + (card, player, target) => { + if (!ui.selected.targets.length) return player != target; + return true; + }, + 2, + true + ) + .set("multitarget", true) + .set("targetprompt", ["伤害来源", "受伤角色"]) + .set("ai", (target) => { + return target == get.event("aiTargets")[ui.selected.targets.length] ? 10 : 0; + }) + .set( + "aiTargets", + lib.skill.mbhuiyao.getUnrealDamageTargets( + player, + [game.filterPlayer((i) => i != player), game.filterPlayer()], + true + ) + ); + ("step 2"); + if (result.bool) { + var targets = result.targets; + player.line2(targets, "green"); game.delaye(); - targets[1].damage(targets[0],'unreal'); + targets[1].damage(targets[0], "unreal"); } }, - getUnrealDamageTargets:(player,lists,forced)=>{ - const targets=[null,null]; - let sourceList,targetList; - if(lists.length==2&&lists.every(l=>Array.isArray(l))){ - sourceList=lists[0]; targetList=lists[1]; + getUnrealDamageTargets: (player, lists, forced) => { + const targets = [null, null]; + let sourceList, targetList; + if (lists.length == 2 && lists.every((l) => Array.isArray(l))) { + sourceList = lists[0]; + targetList = lists[1]; + } else { + sourceList = lists.slice(); + targetList = lists.slice(); } - else{ - sourceList=lists.slice(); targetList=lists.slice(); - } - const list=targetList.map(current=>{ - const _hp=current.hp,_maxhp=current.maxHp; - current.hp=100; current.maxHp=100; - const att=-get.sgnAttitude(player,current); - let val=get.damageEffect(current,player,current)*att; - current.getSkills(null,false,false).forEach(skill=>{ - const info=get.info(skill); - if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att); - }); - const eff=100/val+15; - current.hp=_hp; current.maxHp=_maxhp; - return [current,eff]; - }).sort((a,b)=>b[1]-a[1])[0]; - if(list[1]<0&&!forced) return targets; - const targetx=list[0]; - targets[1]=targetx; - const list2=sourceList.filter(i=>i!=targetx).map(current=>{ - const _hp=targetx.hp,_maxhp=targetx.maxHp; - targetx.hp=100; targetx.maxHp=100; - const att=-get.sgnAttitude(player,current); - const eff=get.damageEffect(targetx,current,current)*att; - targetx.hp=_hp; targetx.maxHp=_maxhp; - return [current,eff]; - }).sort((a,b)=>b[1]-a[1])[0]; - if(!list2) return targets; - targets[0]=list2[0]; + const list = targetList + .map((current) => { + const _hp = current.hp, + _maxhp = current.maxHp; + current.hp = 100; + current.maxHp = 100; + const att = -get.sgnAttitude(player, current); + let val = get.damageEffect(current, player, current) * att; + current.getSkills(null, false, false).forEach((skill) => { + const info = get.info(skill); + if ( + info && + info.ai && + (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend) + ) + val = Math[val > 0 ? "max" : "min"](val > 0 ? 0.1 : -0.1, val + 2 * att); + }); + const eff = 100 / val + 15; + current.hp = _hp; + current.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (list[1] < 0 && !forced) return targets; + const targetx = list[0]; + targets[1] = targetx; + const list2 = sourceList + .filter((i) => i != targetx) + .map((current) => { + const _hp = targetx.hp, + _maxhp = targetx.maxHp; + targetx.hp = 100; + targetx.maxHp = 100; + const att = -get.sgnAttitude(player, current); + const eff = get.damageEffect(targetx, current, current) * att; + targetx.hp = _hp; + targetx.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (!list2) return targets; + targets[0] = list2[0]; return targets; }, - ai:{ - order:6, - result:{ - player:function(player){ - if(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=1) return 0; - var limit=25; - var quesong=player.hasSkill('mbquesong')&&!player.getStat().damaged; - if(quesong){ - limit-=7.5; + ai: { + order: 6, + result: { + player: function (player) { + if ( + player.getHp() + + player.countCards("hs", (card) => player.canSaveCard(card, player)) <= + 1 + ) + return 0; + var limit = 25; + var quesong = player.hasSkill("mbquesong") && !player.getStat().damaged; + if (quesong) { + limit -= 7.5; } - if(quesong&&game.hasPlayer(target=>{ - var att=get.attitude(player,target); - if(att<0) return false; - return att*Math.sqrt(Math.max(1,[1,2,3,4].reduce((p,c)=>p+target.countEmptySlot(c),0)))>=10||target.getHp()<=2; - })) return 1; - if(!quesong&&game.hasPlayer(target=>{ - if(target==player) return false; - var _hp=target.hp,_maxhp=target.maxHp; - target.hp=100; target.maxHp=100; - var att=-get.sgnAttitude(player,target); - var val=get.damageEffect(target,player,target)*att; - target.getSkills(null,false,false).forEach(skill=>{ - var info=get.info(skill); - if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att); - }); - var eff=100/val; - target.hp=_hp; target.maxHp=_maxhp; - if(eff { + var att = get.attitude(player, target); + if (att < 0) return false; + return ( + att * + Math.sqrt( + Math.max( + 1, + [1, 2, 3, 4].reduce( + (p, c) => p + target.countEmptySlot(c), + 0 + ) + ) + ) >= + 10 || target.getHp() <= 2 + ); + }) + ) + return 1; + if ( + !quesong && + game.hasPlayer((target) => { + if (target == player) return false; + var _hp = target.hp, + _maxhp = target.maxHp; + target.hp = 100; + target.maxHp = 100; + var att = -get.sgnAttitude(player, target); + var val = get.damageEffect(target, player, target) * att; + target.getSkills(null, false, false).forEach((skill) => { + var info = get.info(skill); + if ( + info && + info.ai && + (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend) + ) + val = Math[val > 0 ? "max" : "min"]( + val > 0 ? 0.1 : -0.1, + val + 2 * att + ); + }); + var eff = 100 / val; + target.hp = _hp; + target.maxHp = _maxhp; + if (eff < limit) return false; + return true; + }) + ) + return 1; return 0; - } - } + }, + }, }, }, - mbquesong:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.getHistory('damage').length; + mbquesong: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getHistory("damage").length; }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('mbquesong')).set('ai',target=>{ - var player=_status.event.player; - if(get.attitude(player,target)<=0) return 0; - var len=lib.skill.mbquesong.getNum(target),hp=target.getHp(); - return len+target.isTurnedOver()*2+1.5*Math.min(4,target.getDamagedHp())/(hp+1); + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("mbquesong")).set("ai", (target) => { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) return 0; + var len = lib.skill.mbquesong.getNum(target), + hp = target.getHp(); + return ( + len + + target.isTurnedOver() * 2 + + (1.5 * Math.min(4, target.getDamagedHp())) / (hp + 1) + ); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('mbquesong',target); - var len=lib.skill.mbquesong.getNum(target); - if(target.isHealthy()) event._result={index:0}; - else{ - target.chooseControl().set('choiceList',[ - '摸'+get.cnNumber(len)+'张牌并复原武将牌', - '回复1点体力', - ]).set('prompt','雀颂:请选择一项').set('ai',()=>{ - var player=_status.event.player; - var len=_status.event.len; - return get.effect(player,{name:'draw'},player,player)*len>=get.recoverEffect(player,player,player)?0:1; - }).set('len',len); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("mbquesong", target); + var len = lib.skill.mbquesong.getNum(target); + if (target.isHealthy()) event._result = { index: 0 }; + else { + target + .chooseControl() + .set("choiceList", [ + "摸" + get.cnNumber(len) + "张牌并复原武将牌", + "回复1点体力", + ]) + .set("prompt", "雀颂:请选择一项") + .set("ai", () => { + var player = _status.event.player; + var len = _status.event.len; + return get.effect(player, { name: "draw" }, player, player) * len >= + get.recoverEffect(player, player, player) + ? 0 + : 1; + }) + .set("len", len); } - } - else event.finish(); - 'step 2' - if(result.index==1){ + } else event.finish(); + ("step 2"); + if (result.index == 1) { target.recover(); event.finish(); - } - else target.draw(lib.skill.mbquesong.getNum(target)); - 'step 3' + } else target.draw(lib.skill.mbquesong.getNum(target)); + ("step 3"); target.link(false); - 'step 4' + ("step 4"); target.turnOver(false); }, - getNum:function(player){ - return player.countCards('e',card=>get.subtype(card)!='equip5')>=3?2:3; + getNum: function (player) { + return player.countCards("e", (card) => get.subtype(card) != "equip5") >= 3 ? 2 : 3; }, - ai:{ - expose:0.2, - maixie:true, - skillTagFilter:function(player,tag){ - if(player.getStat().damaged) return false; + ai: { + expose: 0.2, + maixie: true, + skillTagFilter: function (player, tag) { + if (player.getStat().damaged) return false; }, - } + }, }, //郭照 - yichong:{ - initSkill:function(skill){ - if(!lib.skill[skill]){ - lib.skill[skill]={ - charlotte:true, - onremove:true, - mark:true, - marktext:'雀', - intro:{ - markcount:function(storage){ - return (storage||0).toString(); + yichong: { + initSkill: function (skill) { + if (!lib.skill[skill]) { + lib.skill[skill] = { + charlotte: true, + onremove: true, + mark: true, + marktext: "雀", + intro: { + markcount: function (storage) { + return (storage || 0).toString(); }, - content:function(storage){ - return '已被掠夺'+(storage||0)+'张牌'; + content: function (storage) { + return "已被掠夺" + (storage || 0) + "张牌"; }, }, }; - lib.translate[skill]='易宠'; - lib.translate[skill+'_bg']='雀'; + lib.translate[skill] = "易宠"; + lib.translate[skill + "_bg"] = "雀"; } }, - getLimit:1, - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('yichong'),'选择一名其他角色并选择一个花色,获得其此花色的所有牌并令其获得“雀”标记',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0) return 0; - var getNum=function(player){ - var list=[]; - for(var i of lib.suit) list.push((player.countCards('he',{suit:i})+3)); - return list.sort((a,b)=>b-a)[0]; - }; - return getNum(target)+target.countCards('h')/10; + getLimit: 1, + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("yichong"), + "选择一名其他角色并选择一个花色,获得其此花色的所有牌并令其获得“雀”标记", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return 0; + var getNum = function (player) { + var list = []; + for (var i of lib.suit) list.push(player.countCards("he", { suit: i }) + 3); + return list.sort((a, b) => b - a)[0]; + }; + return getNum(target) + target.countCards("h") / 10; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yichong", target); + event.target = target; + player + .chooseControl(lib.suit.slice(0).reverse()) + .set("prompt", "请声明一个花色") + .set("ai", function () { + var target = _status.event.target, + cards = target.getCards("he"); + var suits = lib.suit.slice(0); + suits.sort(function (a, b) { + var num = function (suit) { + return cards.filter(function (card) { + return get.suit(card) == suit; + }).length; + }; + return num(b) - num(a); + }); + return suits[0]; + }) + .set("target", target); + } else event.finish(); + ("step 2"); + var suit = result.control; + event.suit = suit; + player.chat(get.translation(suit + 2)); + game.log(player, "选择了", "#y" + get.translation(suit + 2)); + if (target.countCards("e", { suit: suit })) + player.gain(target.getCards("e", { suit: suit }), target, "giveAuto"); + ("step 3"); + var suit = event.suit; + if (target.countCards("h", { suit: suit })) { + player + .chooseButton(["选择获得其中一张牌", target.getCards("h", { suit: suit })], true) + .set("ai", (button) => get.value(button.link)); + } else event.goto(5); + ("step 4"); + if (result.bool) { + var card = result.links[0]; + if (lib.filter.canBeGained(card, player, target)) + player.gain(card, target, "giveAuto", "bySelf"); + else game.log("但", card, "不能被", player, "获得!"); + } + ("step 5"); + var suit = event.suit; + player.storage.yichong = suit; + player.markSkill("yichong"); + var skill = "yichong_" + player.playerid; + game.broadcastAll(lib.skill.yichong.initSkill, skill); + game.broadcastAll( + function (player, suit) { + if (player.marks.yichong) + player.marks.yichong.firstChild.innerHTML = get.translation(suit); + }, + player, + suit + ); + game.countPlayer(function (current) { + current.removeSkill("yichong_" + player.playerid); + if (current == target) target.addSkill("yichong_" + player.playerid); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('yichong',target); - event.target=target; - player.chooseControl(lib.suit.slice(0).reverse()).set('prompt','请声明一个花色').set('ai',function(){ - var target=_status.event.target,cards=target.getCards('he'); - var suits=lib.suit.slice(0); - suits.sort(function(a,b){ - var num=function(suit){ - return cards.filter(function(card){ - return get.suit(card)==suit; - }).length; - }; - return num(b)-num(a); - }); - return suits[0]; - }).set('target',target); - } - else event.finish(); - 'step 2' - var suit=result.control; - event.suit=suit; - player.chat(get.translation(suit+2)); - game.log(player,'选择了','#y'+get.translation(suit+2)); - if(target.countCards('e',{suit:suit})) player.gain(target.getCards('e',{suit:suit}),target,'giveAuto'); - 'step 3' - var suit=event.suit; - if(target.countCards('h',{suit:suit})){ - player.chooseButton(['选择获得其中一张牌',target.getCards('h',{suit:suit})],true).set('ai',button=>get.value(button.link)); - } - else event.goto(5); - 'step 4' - if(result.bool){ - var card=result.links[0]; - if(lib.filter.canBeGained(card,player,target)) player.gain(card,target,'giveAuto','bySelf'); - else game.log('但',card,'不能被',player,'获得!'); - } - 'step 5' - var suit=event.suit; - player.storage.yichong=suit; - player.markSkill('yichong'); - var skill='yichong_'+player.playerid; - game.broadcastAll(lib.skill.yichong.initSkill,skill); - game.broadcastAll(function(player,suit){ - if(player.marks.yichong) player.marks.yichong.firstChild.innerHTML=get.translation(suit); - },player,suit); - game.countPlayer(function(current){ - current.removeSkill('yichong_'+player.playerid); - if(current==target) target.addSkill('yichong_'+player.playerid); - }); - player.addTempSkill('yichong_clear',{player:'phaseBegin'}); + player.addTempSkill("yichong_clear", { player: "phaseBegin" }); }, - onremove:true, - intro:{content:'拥有“雀”标记的角色得到$牌后,你获得之'}, - group:'yichong_gain', - subSkill:{ - gain:{ - audio:'yichong', - trigger:{global:['gainAfter','loseAsyncAfter']}, - filter:function(event,player){ - if(!player.storage.yichong) return false; - return game.hasPlayer(function(current){ - if(!event.getg(current).length||!current.hasSkill('yichong_'+player.playerid)) return false; - if(current.countMark('yichong_'+player.playerid)>=lib.skill.yichong.getLimit) return false; - return event.getg(current).some(card=>get.suit(card,current)==player.storage.yichong&&lib.filter.canBeGained(card,current,player)); + onremove: true, + intro: { content: "拥有“雀”标记的角色得到$牌后,你获得之" }, + group: "yichong_gain", + subSkill: { + gain: { + audio: "yichong", + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + if (!player.storage.yichong) return false; + return game.hasPlayer(function (current) { + if ( + !event.getg(current).length || + !current.hasSkill("yichong_" + player.playerid) + ) + return false; + if ( + current.countMark("yichong_" + player.playerid) >= + lib.skill.yichong.getLimit + ) + return false; + return event + .getg(current) + .some( + (card) => + get.suit(card, current) == player.storage.yichong && + lib.filter.canBeGained(card, current, player) + ); }); }, - forced:true, - content:function(){ - 'step 0' - var target=game.findPlayer(function(current){ - if(!trigger.getg(current).length||!current.hasSkill('yichong_'+player.playerid)) return false; - if(current.countMark('yichong_'+player.playerid)>=lib.skill.yichong.getLimit) return false; - return trigger.getg(current).some(card=>get.suit(card,current)==player.storage.yichong&&lib.filter.canBeGained(card,current,player)); + forced: true, + content: function () { + "step 0"; + var target = game.findPlayer(function (current) { + if ( + !trigger.getg(current).length || + !current.hasSkill("yichong_" + player.playerid) + ) + return false; + if ( + current.countMark("yichong_" + player.playerid) >= + lib.skill.yichong.getLimit + ) + return false; + return trigger + .getg(current) + .some( + (card) => + get.suit(card, current) == player.storage.yichong && + lib.filter.canBeGained(card, current, player) + ); }); - event.target=target; - var cards=trigger.getg(target).filter(card=>get.suit(card,target)==player.storage.yichong&&lib.filter.canBeGained(card,target,player)); - if(cards.length<=lib.skill.yichong.getLimit-target.countMark('yichong_'+player.playerid)) event._result={bool:true,links:cards}; - else{ - var num=(lib.skill.yichong.getLimit-target.countMark('yichong_'+player.playerid)); - player.chooseButton(['易宠:获得其中的'+get.cnNumber(num)+'张牌',cards],num,true).set('ai',function(button){ - return get.value(button.link); - }); + event.target = target; + var cards = trigger + .getg(target) + .filter( + (card) => + get.suit(card, target) == player.storage.yichong && + lib.filter.canBeGained(card, target, player) + ); + if ( + cards.length <= + lib.skill.yichong.getLimit - target.countMark("yichong_" + player.playerid) + ) + event._result = { bool: true, links: cards }; + else { + var num = + lib.skill.yichong.getLimit - + target.countMark("yichong_" + player.playerid); + player + .chooseButton( + ["易宠:获得其中的" + get.cnNumber(num) + "张牌", cards], + num, + true + ) + .set("ai", function (button) { + return get.value(button.link); + }); } - 'step 1' - if(result.bool){ - player.gain(result.links,target,'give'); - target.addMark('yichong_'+player.playerid,result.links.length,false); + ("step 1"); + if (result.bool) { + player.gain(result.links, target, "give"); + target.addMark("yichong_" + player.playerid, result.links.length, false); } }, }, - clear:{ - charlotte:true, - onremove:function(player){ - game.countPlayer(function(current){ - current.removeSkill('yichong_'+player.playerid); + clear: { + charlotte: true, + onremove: function (player) { + game.countPlayer(function (current) { + current.removeSkill("yichong_" + player.playerid); }); }, }, }, }, - wufei:{ - audio:2, - trigger:{player:['useCardToPlayered','damageEnd']}, - filter:function(event,player){ - var target=game.findPlayer(current=>current.hasSkill('yichong_'+player.playerid)); - if(!target) return false; - if(event.name=='damage') return target.hp>3; - return event.isFirstTarget&&(event.card.name=='sha'||(get.type(event.card)=='trick'&&get.tag(event.card,'damage'))); + wufei: { + audio: 2, + trigger: { player: ["useCardToPlayered", "damageEnd"] }, + filter: function (event, player) { + var target = game.findPlayer((current) => current.hasSkill("yichong_" + player.playerid)); + if (!target) return false; + if (event.name == "damage") return target.hp > 3; + return ( + event.isFirstTarget && + (event.card.name == "sha" || + (get.type(event.card) == "trick" && get.tag(event.card, "damage"))) + ); }, - direct:true, - content:function(){ - 'step 0' - var target=game.findPlayer(current=>current.hasSkill('yichong_'+player.playerid)); - event.target=target; - if(trigger.name=='damage'){ - player.chooseBool(get.prompt('wufei',target),'令'+get.translation(target)+'受到1点无来源伤害').set('choice',get.damageEffect(target,player,player)>0); - } - else{ - player.logSkill('wufei',target); - player.addTempSkill('wufei_effect'); - player.markAuto('wufei_effect',[trigger.card]); - game.log(target,'成为了',trigger.card,'的伤害来源'); + direct: true, + content: function () { + "step 0"; + var target = game.findPlayer((current) => current.hasSkill("yichong_" + player.playerid)); + event.target = target; + if (trigger.name == "damage") { + player + .chooseBool( + get.prompt("wufei", target), + "令" + get.translation(target) + "受到1点无来源伤害" + ) + .set("choice", get.damageEffect(target, player, player) > 0); + } else { + player.logSkill("wufei", target); + player.addTempSkill("wufei_effect"); + player.markAuto("wufei_effect", [trigger.card]); + game.log(target, "成为了", trigger.card, "的伤害来源"); event.finish(); } - 'step 1' - if(result.bool){ - player.logSkill('wufei',target); - target.damage('nosource'); + ("step 1"); + if (result.bool) { + player.logSkill("wufei", target); + target.damage("nosource"); } }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{source:'damageBefore'}, - filter:function(event,player){ - if(!event.card) return false; - return player.getStorage('wufei_effect').includes(event.card); + subSkill: { + effect: { + charlotte: true, + trigger: { source: "damageBefore" }, + filter: function (event, player) { + if (!event.card) return false; + return player.getStorage("wufei_effect").includes(event.card); }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - var target=game.findPlayer(current=>current.hasSkill('yichong_'+player.playerid)); - if(!target) delete trigger.source; - else trigger.source=target; + forced: true, + popup: false, + firstDo: true, + content: function () { + var target = game.findPlayer((current) => + current.hasSkill("yichong_" + player.playerid) + ); + if (!target) delete trigger.source; + else trigger.source = target; }, }, }, - ai:{ - combo:'yichong' - } + ai: { + combo: "yichong", + }, }, //张嶷 - xinwurong:{ - audio:3, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - player.chooseToDuiben(target).set('title','谋弈').set('namelist',[ - '反抗','归顺','镇压','安抚' - ]).set('ai',button=>1+Math.random()); - 'step 1' - if(result.bool){ - if(result.player=='db_def1'){ + xinwurong: { + audio: 3, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + player + .chooseToDuiben(target) + .set("title", "谋弈") + .set("namelist", ["反抗", "归顺", "镇压", "安抚"]) + .set("ai", (button) => 1 + Math.random()); + ("step 1"); + if (result.bool) { + if (result.player == "db_def1") { target.damage(); player.draw(); event.finish(); - } - else{ - var cards=target.getCards('he'); - if(cards.length<2){ - target.skip('phaseDraw'); - target.addTempSkill('xinwurong_skip',{player:'phaseDrawSkipped'}); + } else { + var cards = target.getCards("he"); + if (cards.length < 2) { + target.skip("phaseDraw"); + target.addTempSkill("xinwurong_skip", { player: "phaseDrawSkipped" }); event.finish(); - } - else if(cards.length==2) event._result={bool:true,cards:cards}; - else target.chooseCard('怃戎:交给'+get.translation(player)+'两张牌',2,true,'he'); + } else if (cards.length == 2) event._result = { bool: true, cards: cards }; + else + target.chooseCard( + "怃戎:交给" + get.translation(player) + "两张牌", + 2, + true, + "he" + ); } - } - else{ - if(result.player=='db_def1'){ - player.gainPlayerCard(target,'he',true); + } else { + if (result.player == "db_def1") { + player.gainPlayerCard(target, "he", true); event.goto(3); - } - else{ + } else { player.damage(); player.draw(2); event.finish(); } } - 'step 2' - if(result.bool) player.gain(result.cards,target,'giveAuto'); + ("step 2"); + if (result.bool) player.gain(result.cards, target, "giveAuto"); event.finish(); - 'step 3' - var cards=player.getCards('he'); - if(!cards.length) event.finish(); - else if(cards.length<=2) event._result={bool:true,cards:cards}; - else player.chooseCard('怃戎:交给'+get.translation(target)+'两张牌',2,true,'he'); - 'step 4' - if(result.bool) target.gain(result.cards,player,'giveAuto'); + ("step 3"); + var cards = player.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { bool: true, cards: cards }; + else player.chooseCard("怃戎:交给" + get.translation(target) + "两张牌", 2, true, "he"); + ("step 4"); + if (result.bool) target.gain(result.cards, player, "giveAuto"); }, - ai:{ - order:7, - result:{ - player:1, - target:-1, + ai: { + order: 7, + result: { + player: 1, + target: -1, }, }, - subSkill:{ - skip:{ - charlotte:true, - mark:true, - intro:{content:'跳过下个摸牌阶段'}, + subSkill: { + skip: { + charlotte: true, + mark: true, + intro: { content: "跳过下个摸牌阶段" }, }, }, }, //孙亮 - xinkuizhu:{ - audio:'nzry_kuizhu', - trigger:{player:'phaseDiscardAfter'}, - filter:function(event,player){ - return player.getHistory('lose',function(evt){ - return evt.type=='discard'&&evt.getParent('phaseDiscard')==event; + xinkuizhu: { + audio: "nzry_kuizhu", + trigger: { player: "phaseDiscardAfter" }, + filter: function (event, player) { + return player.getHistory("lose", function (evt) { + return evt.type == "discard" && evt.getParent("phaseDiscard") == event; }).length; }, - direct:true, - content:function(){ - 'step 0' - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2); + direct: true, + content: function () { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) + cards.addArray(evt.cards2); }); - event.num=cards.length; - event.str1='令至多'+event.num+'名角色摸一张牌'; - event.str2='对任意名体力值之和为'+event.num+'的角色造成1点伤害'; - player.chooseControl('cancel2').set('ai',function(){ - if(game.countPlayer(function(current){return get.attitude(player,current)<0&¤t.hp==event.num})>0&&event.num<=3) return 1; - return 0; - }).set('choiceList',[event.str1,event.str2]).set('prompt','是否发动【溃诛】?'); - 'step 1' - if(result.control=='cancel2') event.finish(); - event.control=[event.str1,event.str2][result.index]; - 'step 2' - var str='请选择〖溃诛〗的目标'; - if(event.bool==false) str='
    所选目标体力之和不足'+event.num+',请重选'; - if(event.control==event.str2){ - player.chooseTarget(str,function(card,player,target){ - var targets=ui.selected.targets; - var num=0; - for(var i=0;i 0 && + event.num <= 3 + ) + return 1; + return 0; + }) + .set("choiceList", [event.str1, event.str2]) + .set("prompt", "是否发动【溃诛】?"); + ("step 1"); + if (result.control == "cancel2") event.finish(); + event.control = [event.str1, event.str2][result.index]; + ("step 2"); + var str = "请选择〖溃诛〗的目标"; + if (event.bool == false) str = "
    所选目标体力之和不足" + event.num + ",请重选"; + if (event.control == event.str2) { + player + .chooseTarget(str, function (card, player, target) { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) num += targets[i].hp; + return num + target.hp <= _status.event.num; + }) + .set("ai", function (target) { + if (ui.selected.targets[0] != undefined) return -1; + return get.attitude(player, target) < 0; + }) + .set("promptbar", "none") + .set("num", event.num) + .set("selectTarget", function () { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) num += targets[i].hp; + if (num == _status.event.num) return ui.selected.targets.length; + return ui.selected.targets.length + 1; + }); + } else { + player + .chooseTarget( + "请选择〖溃诛〗的目标", + "令至多" + get.cnNumber(event.num) + "名角色各摸一张牌", + [1, event.num] + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); } - else{ - player.chooseTarget('请选择〖溃诛〗的目标','令至多'+get.cnNumber(event.num)+'名角色各摸一张牌',[1,event.num]).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - } - 'step 3' - if(result.bool){ - var targets=result.targets.sortBySeat(); - if(event.control==event.str1){ - player.logSkill('xinkuizhu',targets); + ("step 3"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + if (event.control == event.str1) { + player.logSkill("xinkuizhu", targets); game.asyncDraw(targets); - } - else{ - var num=0; - for(var i=0;i=2) player.loseHp(); + } else { + player.logSkill("xinkuizhu", targets); + for (var i of targets) i.damage(); + if (targets.length >= 2) player.loseHp(); } } } }, }, - xinzhizheng:{ - audio:'nzry_zhizheng', - mod:{ - playerEnabled:function(card,player,target){ - var info=get.info(card); - if(target!=player&&(!info||!info.singleCard||!ui.selected.targets.length)&&player.isPhaseUsing()&&!target.inRange(player)) return false; + xinzhizheng: { + audio: "nzry_zhizheng", + mod: { + playerEnabled: function (card, player, target) { + var info = get.info(card); + if ( + target != player && + (!info || !info.singleCard || !ui.selected.targets.length) && + player.isPhaseUsing() && + !target.inRange(player) + ) + return false; }, }, - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.getHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==event; - }).length0); - 'step 1' - if(result.bool){ - player.logSkill('xinlijun',trigger.player); - player.gain(trigger.cards.filterInD(),'gain2'); - player.chooseBool().set('prompt','是否令'+get.translation(trigger.player)+'摸一张牌?').set('choice',get.attitude(player,trigger.player)>0); - } - else event.finish(); - 'step 2' - if(result.bool) trigger.player.draw(); + zhuSkill: true, + direct: true, + content: function () { + "step 0"; + trigger.player + .chooseBool( + get.prompt("xinlijun"), + "将" + get.translation(trigger.cards) + "交给" + get.translation(player) + ) + .set("choice", get.attitude(trigger.player, player) > 0); + ("step 1"); + if (result.bool) { + player.logSkill("xinlijun", trigger.player); + player.gain(trigger.cards.filterInD(), "gain2"); + player + .chooseBool() + .set("prompt", "是否令" + get.translation(trigger.player) + "摸一张牌?") + .set("choice", get.attitude(player, trigger.player) > 0); + } else event.finish(); + ("step 2"); + if (result.bool) trigger.player.draw(); }, }, //十常侍 - mbdanggu:{ - audio:2, - trigger:{ - player:'enterGame', - global:'phaseBefore', + mbdanggu: { + audio: 2, + trigger: { + player: "enterGame", + global: "phaseBefore", }, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - derivation:['mbdanggu_faq','mbdanggu_faq2'], - forced:true, - unique:true, - onremove:function(player){ + derivation: ["mbdanggu_faq", "mbdanggu_faq2"], + forced: true, + unique: true, + onremove: function (player) { delete player.storage.mbdanggu; delete player.storage.mbdanggu_current; - if(lib.skill.mbdanggu.isSingleShichangshi(player)){ - game.broadcastAll(function(player){ - player.name1=player.name; + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + game.broadcastAll(function (player) { + player.name1 = player.name; player.smoothAvatar(false); - player.node.avatar.setBackground(player.name,'character'); - player.node.name.innerHTML=get.slimName(player.name); + player.node.avatar.setBackground(player.name, "character"); + player.node.name.innerHTML = get.slimName(player.name); delete player.name2; - player.classList.remove('fullskin2'); - player.node.avatar2.classList.add('hidden'); - player.node.name2.innerHTML=''; - if(player==game.me&&ui.fakeme){ - ui.fakeme.style.backgroundImage=player.node.avatar.style.backgroundImage; + player.classList.remove("fullskin2"); + player.node.avatar2.classList.add("hidden"); + player.node.name2.innerHTML = ""; + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = player.node.avatar.style.backgroundImage; } - },player); + }, player); } }, - changshi:[ - ['scs_zhangrang','scstaoluan'], - ['scs_zhaozhong','scschiyan'], - ['scs_sunzhang','scszimou'], - ['scs_bilan','scspicai'], - ['scs_xiayun','scsyaozhuo'], - ['scs_hankui','scsxiaolu'], - ['scs_lisong','scskuiji'], - ['scs_duangui','scschihe'], - ['scs_guosheng','scsniqu'], - ['scs_gaowang','scsmiaoyu'] + changshi: [ + ["scs_zhangrang", "scstaoluan"], + ["scs_zhaozhong", "scschiyan"], + ["scs_sunzhang", "scszimou"], + ["scs_bilan", "scspicai"], + ["scs_xiayun", "scsyaozhuo"], + ["scs_hankui", "scsxiaolu"], + ["scs_lisong", "scskuiji"], + ["scs_duangui", "scschihe"], + ["scs_guosheng", "scsniqu"], + ["scs_gaowang", "scsmiaoyu"], ], - conflictMap:function(player){ - if(!_status.changshiMap){ - _status.changshiMap={ - scs_zhangrang:[], - scs_zhaozhong:[], - scs_sunzhang:[], - scs_bilan:['scs_hankui'], - scs_xiayun:[], - scs_hankui:['scs_bilan'], - scs_lisong:[], - scs_duangui:['scs_guosheng'], - scs_guosheng:['scs_duangui'], - scs_gaowang:[], + conflictMap: function (player) { + if (!_status.changshiMap) { + _status.changshiMap = { + scs_zhangrang: [], + scs_zhaozhong: [], + scs_sunzhang: [], + scs_bilan: ["scs_hankui"], + scs_xiayun: [], + scs_hankui: ["scs_bilan"], + scs_lisong: [], + scs_duangui: ["scs_guosheng"], + scs_guosheng: ["scs_duangui"], + scs_gaowang: [], }; - if(!get.isLuckyStar(player)){ - var list=lib.skill.mbdanggu.changshi.map(i=>i[0]); - for(var i of list){ - var select=list.filter(scs=>scs!=i&&!_status.changshiMap[i].includes(i)); - _status.changshiMap[i].addArray(select.randomGets(get.rand(0,select.length))); + if (!get.isLuckyStar(player)) { + var list = lib.skill.mbdanggu.changshi.map((i) => i[0]); + for (var i of list) { + var select = list.filter( + (scs) => scs != i && !_status.changshiMap[i].includes(i) + ); + _status.changshiMap[i].addArray( + select.randomGets(get.rand(0, select.length)) + ); } } } return _status.changshiMap; }, - group:'mbdanggu_back', - content:function(){ - 'step 0' - var list=lib.skill.mbdanggu.changshi.map(i=>i[0]); - player.markAuto('mbdanggu',list); - game.broadcastAll(function(player,list){ - var cards=[]; - for(var i=0;i i[0]); + player.markAuto("mbdanggu", list); + game.broadcastAll( + function (player, list) { + var cards = []; + for (var i = 0; i < list.length; i++) { + var cardname = "huashen_card_" + list[i]; + lib.card[cardname] = { + fullimage: true, + image: "character/" + list[i], + }; + lib.translate[cardname] = get.rawName2(list[i]); + cards.push(game.createCard(cardname, "", "")); } - lib.translate[cardname]=get.rawName2(list[i]); - cards.push(game.createCard(cardname,'','')); - } - player.$draw(cards,'nobroadcast'); - },player,list); - 'step 1' - var next=game.createEvent('mbdanggu_clique'); - next.player=player; + player.$draw(cards, "nobroadcast"); + }, + player, + list + ); + ("step 1"); + var next = game.createEvent("mbdanggu_clique"); + next.player = player; next.setContent(lib.skill.mbdanggu.contentx); }, - contentx:function(){ - 'step 0' - var list=player.getStorage('mbdanggu').slice(); - var first=list.randomRemove(); - event.first=first; - var others=list.randomGets(4); - if(others.length==1) event._result={bool:true,links:others}; - else{ - var map={ - 'scs_bilan':'scs_hankui', - 'scs_hankui':'scs_bilan', - 'scs_duangui':'scs_guosheng', - 'scs_guosheng':'scs_duangui', - },map2=lib.skill.mbdanggu.conflictMap(player); - var conflictList=others.filter(changshi=>{ - if(map[first]&&others.some(changshi2=>map[first]==changshi2)) return map[first]==changshi; - else return map2[first].includes(changshi); - }),list=others.slice(); - if(conflictList.length){ - var conflict=conflictList.randomGet(); + contentx: function () { + "step 0"; + var list = player.getStorage("mbdanggu").slice(); + var first = list.randomRemove(); + event.first = first; + var others = list.randomGets(4); + if (others.length == 1) event._result = { bool: true, links: others }; + else { + var map = { + scs_bilan: "scs_hankui", + scs_hankui: "scs_bilan", + scs_duangui: "scs_guosheng", + scs_guosheng: "scs_duangui", + }, + map2 = lib.skill.mbdanggu.conflictMap(player); + var conflictList = others.filter((changshi) => { + if (map[first] && others.some((changshi2) => map[first] == changshi2)) + return map[first] == changshi; + else return map2[first].includes(changshi); + }), + list = others.slice(); + if (conflictList.length) { + var conflict = conflictList.randomGet(); list.remove(conflict); - game.broadcastAll(function(changshi,player){ - if(lib.config.background_speak){ - if(player.isUnderControl(true)) game.playAudio('skill',changshi+'_enter'); - } - },conflict,player); + game.broadcastAll( + function (changshi, player) { + if (lib.config.background_speak) { + if (player.isUnderControl(true)) + game.playAudio("skill", changshi + "_enter"); + } + }, + conflict, + player + ); } - player.chooseButton([ - '党锢:请选择结党对象', - [[first],'character'], - '
    可选常侍
    ', - [others,'character'] - ],true).set('filterButton',button=>{ - return _status.event.canChoose.includes(button.link); - }).set('canChoose',list).set('ai',button=>Math.random()*10); + player + .chooseButton( + [ + "党锢:请选择结党对象", + [[first], "character"], + '
    可选常侍
    ', + [others, "character"], + ], + true + ) + .set("filterButton", (button) => { + return _status.event.canChoose.includes(button.link); + }) + .set("canChoose", list) + .set("ai", (button) => Math.random() * 10); } - 'step 1' - if(result.bool){ - var first=event.first; - var chosen=result.links[0]; - var skills=[]; - var list=lib.skill.mbdanggu.changshi; - var changshis=[first,chosen]; - player.unmarkAuto('mbdanggu',changshis); - player.storage.mbdanggu_current=changshis; - for(var changshi of changshis){ - for(var cs of list){ - if(changshi==cs[0]) skills.push(cs[1]); + ("step 1"); + if (result.bool) { + var first = event.first; + var chosen = result.links[0]; + var skills = []; + var list = lib.skill.mbdanggu.changshi; + var changshis = [first, chosen]; + player.unmarkAuto("mbdanggu", changshis); + player.storage.mbdanggu_current = changshis; + for (var changshi of changshis) { + for (var cs of list) { + if (changshi == cs[0]) skills.push(cs[1]); } } - if(lib.skill.mbdanggu.isSingleShichangshi(player)){ - game.broadcastAll(function(player,first,chosen){ - player.name1=first; - player.node.avatar.setBackground(first,'character'); - player.node.name.innerHTML=get.slimName(first); - player.name2=chosen; - player.classList.add('fullskin2'); - player.node.avatar2.classList.remove('hidden'); - player.node.avatar2.setBackground(chosen,'character'); - player.node.name2.innerHTML=get.slimName(chosen); - if(player==game.me&&ui.fakeme){ - ui.fakeme.style.backgroundImage=player.node.avatar.style.backgroundImage; - } - },player,first,chosen); + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + game.broadcastAll( + function (player, first, chosen) { + player.name1 = first; + player.node.avatar.setBackground(first, "character"); + player.node.name.innerHTML = get.slimName(first); + player.name2 = chosen; + player.classList.add("fullskin2"); + player.node.avatar2.classList.remove("hidden"); + player.node.avatar2.setBackground(chosen, "character"); + player.node.name2.innerHTML = get.slimName(chosen); + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = + player.node.avatar.style.backgroundImage; + } + }, + player, + first, + chosen + ); } - game.log(player,'选择了常侍','#y'+get.translation(changshis)); - if(skills.length){ - player.addAdditionalSkill('mbdanggu',skills); - var str=''; - for(var i of skills){ - str+='【'+get.translation(i)+'】、'; + game.log(player, "选择了常侍", "#y" + get.translation(changshis)); + if (skills.length) { + player.addAdditionalSkill("mbdanggu", skills); + var str = ""; + for (var i of skills) { + str += "【" + get.translation(i) + "】、"; player.popup(i); } - str=str.slice(0,-1); - game.log(player,'获得了技能','#g'+str); + str = str.slice(0, -1); + game.log(player, "获得了技能", "#g" + str); } } }, - isSingleShichangshi:function(player){ - var map=lib.skill.mbdanggu.conflictMap(player); - return player.name=='shichangshi'&&(map[player.name1]&&map[player.name2]||map[player.name1]&&!player.name2||!player.name1&&!player.name2||player.name==player.name1&&!player.name2); + isSingleShichangshi: function (player) { + var map = lib.skill.mbdanggu.conflictMap(player); + return ( + player.name == "shichangshi" && + ((map[player.name1] && map[player.name2]) || + (map[player.name1] && !player.name2) || + (!player.name1 && !player.name2) || + (player.name == player.name1 && !player.name2)) + ); }, - mod:{ - aiValue:function(player,card,num){ - if(['shan','tao','wuxie','caochuan'].includes(card.name)) return num/10; + mod: { + aiValue: function (player, card, num) { + if (["shan", "tao", "wuxie", "caochuan"].includes(card.name)) return num / 10; }, - aiUseful:function(){ - return lib.skill.mbdanggu.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.mbdanggu.mod.aiValue.apply(this, arguments); }, }, - ai:{ - combo:'mbmowang', - nokeep:true, + ai: { + combo: "mbmowang", + nokeep: true, }, - intro:{ - mark:function(dialog,storage,player){ - dialog.addText('剩余常侍'); - dialog.addSmall([storage,'character']); - if(player.storage.mbdanggu_current&&player.isIn()){ - dialog.addText('当前常侍'); - dialog.addSmall([player.storage.mbdanggu_current,'character']); + intro: { + mark: function (dialog, storage, player) { + dialog.addText("剩余常侍"); + dialog.addSmall([storage, "character"]); + if (player.storage.mbdanggu_current && player.isIn()) { + dialog.addText("当前常侍"); + dialog.addSmall([player.storage.mbdanggu_current, "character"]); } - } + }, }, - subSkill:{ - back:{ - audio:'mbdanggu', - trigger:{global:'restEnd'}, - filter:function(event,player){ - return event.getTrigger().player==player; + subSkill: { + back: { + audio: "mbdanggu", + trigger: { global: "restEnd" }, + filter: function (event, player) { + return event.getTrigger().player == player; }, - forced:true, - content:function(){ - 'step 0' + forced: true, + content: function () { + "step 0"; delete player.storage.mbdanggu_current; - if(lib.skill.mbdanggu.isSingleShichangshi(player)){ - game.broadcastAll(function(player){ - player.name1=player.name; + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + game.broadcastAll(function (player) { + player.name1 = player.name; player.smoothAvatar(false); - player.node.avatar.setBackground(player.name,'character'); - player.node.name.innerHTML=get.slimName(player.name); + player.node.avatar.setBackground(player.name, "character"); + player.node.name.innerHTML = get.slimName(player.name); delete player.name2; - player.classList.remove('fullskin2'); - player.node.avatar2.classList.add('hidden'); - player.node.name2.innerHTML=''; - if(player==game.me&&ui.fakeme){ - ui.fakeme.style.backgroundImage=player.node.avatar.style.backgroundImage; + player.classList.remove("fullskin2"); + player.node.avatar2.classList.add("hidden"); + player.node.name2.innerHTML = ""; + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = + player.node.avatar.style.backgroundImage; } - },player); + }, player); } - 'step 1' - var next=game.createEvent('mbdanggu_clique'); - next.player=player; + ("step 1"); + var next = game.createEvent("mbdanggu_clique"); + next.player = player; next.setContent(lib.skill.mbdanggu.contentx); player.draw(); - } - } - } - }, - mbmowang:{ - audio:2, - trigger:{player:'dieBefore'}, - filter:function(event,player){ - return player.getStorage('mbdanggu').length&&event.getParent().name!='giveup'&&player.maxHp>0; + }, + }, }, - derivation:'mbmowang_faq', - forced:true, - direct:true, - priority:15, - group:['mbmowang_die','mbmowang_return'], - content:function(){ - if(_status.mbmowang_return&&_status.mbmowang_return[player.playerid]){ + }, + mbmowang: { + audio: 2, + trigger: { player: "dieBefore" }, + filter: function (event, player) { + return ( + player.getStorage("mbdanggu").length && + event.getParent().name != "giveup" && + player.maxHp > 0 + ); + }, + derivation: "mbmowang_faq", + forced: true, + direct: true, + priority: 15, + group: ["mbmowang_die", "mbmowang_return"], + content: function () { + if (_status.mbmowang_return && _status.mbmowang_return[player.playerid]) { trigger.cancel(); - } - else{ - player.logSkill('mbmowang'); - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('die','shichangshiRest'); + } else { + player.logSkill("mbmowang"); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("die", "shichangshiRest"); }); trigger.setContent(lib.skill.mbmowang.dieContent); - trigger.includeOut=true; + trigger.includeOut = true; } }, - ai:{ - combo:'mbdanggu', - neg:true + ai: { + combo: "mbdanggu", + neg: true, }, - dieContent:function(){ - 'step 0' - event.forceDie=true; - if(source){ - game.log(player,'被',source,'杀害'); - if(source.stat[source.stat.length-1].kill==undefined){ - source.stat[source.stat.length-1].kill=1; - } - else{ - source.stat[source.stat.length-1].kill++; + dieContent: function () { + "step 0"; + event.forceDie = true; + if (source) { + game.log(player, "被", source, "杀害"); + if (source.stat[source.stat.length - 1].kill == undefined) { + source.stat[source.stat.length - 1].kill = 1; + } else { + source.stat[source.stat.length - 1].kill++; } + } else { + game.log(player, "阵亡"); } - else{ - game.log(player,'阵亡'); - } - if(player.isIn()&&(!_status.mbmowang_return||!_status.mbmowang_return[player.playerid])){ - event.reserveOut=true; - game.log(player,'进入了修整状态'); - game.log(player,'移出了游戏'); + if ( + player.isIn() && + (!_status.mbmowang_return || !_status.mbmowang_return[player.playerid]) + ) { + event.reserveOut = true; + game.log(player, "进入了修整状态"); + game.log(player, "移出了游戏"); //game.addGlobalSkill('mbmowang_return'); - if(!_status.mbmowang_return) _status.mbmowang_return={}; - _status.mbmowang_return[player.playerid]=1; + if (!_status.mbmowang_return) _status.mbmowang_return = {}; + _status.mbmowang_return[player.playerid] = 1; + } else event.finish(); + if (!game.countPlayer()) game.over(); + else if (player.hp != 0) { + player.changeHp(0 - player.hp, false).forceDie = true; } - else event.finish(); - if(!game.countPlayer()) game.over(); - else if(player.hp!=0){ - player.changeHp(0-player.hp,false).forceDie=true; - } - game.broadcastAll(function(player){ - if(player.isLinked()){ - if(get.is.linked2(player)){ - player.classList.toggle('linked2'); - } - else{ - player.classList.toggle('linked'); + game.broadcastAll(function (player) { + if (player.isLinked()) { + if (get.is.linked2(player)) { + player.classList.toggle("linked2"); + } else { + player.classList.toggle("linked"); } } - if(player.isTurnedOver()){ - player.classList.toggle('turnedover'); + if (player.isTurnedOver()) { + player.classList.toggle("turnedover"); } - },player); - game.addVideo('link',player,player.isLinked()); - game.addVideo('turnOver',player,player.classList.contains('turnedover')); - 'step 1' - event.trigger('die'); - 'step 2' - if(event.reserveOut){ - if(!game.reserveDead){ - for(var mark in player.marks){ - if(mark=='mbdanggu') continue; + }, player); + game.addVideo("link", player, player.isLinked()); + game.addVideo("turnOver", player, player.classList.contains("turnedover")); + ("step 1"); + event.trigger("die"); + ("step 2"); + if (event.reserveOut) { + if (!game.reserveDead) { + for (var mark in player.marks) { + if (mark == "mbdanggu") continue; player.unmarkSkill(mark); } - var count=1; - var list=Array.from(player.node.marks.childNodes); - if(list.some(i=>i.name=='mbdanggu')) count++; - while(player.node.marks.childNodes.length>count){ - var node=player.node.marks.lastChild; - if(node.name=='mbdanggu'){ - node=node.previousSibling; + var count = 1; + var list = Array.from(player.node.marks.childNodes); + if (list.some((i) => i.name == "mbdanggu")) count++; + while (player.node.marks.childNodes.length > count) { + var node = player.node.marks.lastChild; + if (node.name == "mbdanggu") { + node = node.previousSibling; } node.remove(); } - game.broadcast(function(player,count){ - while(player.node.marks.childNodes.length>count){ - var node=player.node.marks.lastChild; - if(node.name=='mbdanggu'){ - node=node.previousSibling; + game.broadcast( + function (player, count) { + while (player.node.marks.childNodes.length > count) { + var node = player.node.marks.lastChild; + if (node.name == "mbdanggu") { + node = node.previousSibling; + } + node.remove(); } - node.remove(); - } - },player,count); + }, + player, + count + ); } - for(var i in player.tempSkills){ + for (var i in player.tempSkills) { player.removeSkill(i); } - var skills=player.getSkills(); - for(var i=0;ii[0])); + ("step 3"); + if (event.reserveOut) { + game.broadcastAll( + function (player, list) { + player.classList.add("out"); + if (list.includes(player.name1) || player.name1 == "shichangshi") { + player.smoothAvatar(false); + player.node.avatar.setBackground(player.name1 + "_dead", "character"); + } + if (list.includes(player.name2) || player.name2 == "shichangshi") { + player.smoothAvatar(true); + player.node.avatar2.setBackground(player.name2 + "_dead", "character"); + } + }, + player, + lib.skill.mbdanggu.changshi.map((i) => i[0]) + ); } - if(source&&lib.config.border_style=='auto'&&(lib.config.autoborder_count=='kill'||lib.config.autoborder_count=='mix')){ - switch(source.node.framebg.dataset.auto){ - case 'gold':case 'silver':source.node.framebg.dataset.auto='gold';break; - case 'bronze':source.node.framebg.dataset.auto='silver';break; - default:source.node.framebg.dataset.auto=lib.config.autoborder_start||'bronze'; + if ( + source && + lib.config.border_style == "auto" && + (lib.config.autoborder_count == "kill" || lib.config.autoborder_count == "mix") + ) { + switch (source.node.framebg.dataset.auto) { + case "gold": + case "silver": + source.node.framebg.dataset.auto = "gold"; + break; + case "bronze": + source.node.framebg.dataset.auto = "silver"; + break; + default: + source.node.framebg.dataset.auto = lib.config.autoborder_start || "bronze"; } - if(lib.config.autoborder_count=='kill'){ - source.node.framebg.dataset.decoration=source.node.framebg.dataset.auto; - } - else{ - var dnum=0; - for(var j=0;j=4) source.node.framebg.dataset.decoration='bronze';break; - case 'silver':if(dnum>=8) source.node.framebg.dataset.decoration='silver';break; - case 'gold':if(dnum>=12) source.node.framebg.dataset.decoration='gold';break; + source.node.framebg.dataset.decoration = ""; + switch (source.node.framebg.dataset.auto) { + case "bronze": + if (dnum >= 4) source.node.framebg.dataset.decoration = "bronze"; + break; + case "silver": + if (dnum >= 8) source.node.framebg.dataset.decoration = "silver"; + break; + case "gold": + if (dnum >= 12) source.node.framebg.dataset.decoration = "gold"; + break; } } - source.classList.add('topcount'); + source.classList.add("topcount"); } }, - subSkill:{ - die:{ - audio:'mbmowang', - trigger:{player:'phaseAfter'}, - forced:true, - forceDie:true, - content:function(){ - 'step 0' - if(lib.skill.mbdanggu.isSingleShichangshi(player)){ - if(!player.getStorage('mbdanggu').length){ - game.broadcastAll(function(player){ - player.name1=player.name; + subSkill: { + die: { + audio: "mbmowang", + trigger: { player: "phaseAfter" }, + forced: true, + forceDie: true, + content: function () { + "step 0"; + if (lib.skill.mbdanggu.isSingleShichangshi(player)) { + if (!player.getStorage("mbdanggu").length) { + game.broadcastAll(function (player) { + player.name1 = player.name; player.smoothAvatar(false); - player.node.avatar.setBackground(player.name+'_dead','character'); - player.node.name.innerHTML=get.slimName(player.name); + player.node.avatar.setBackground(player.name + "_dead", "character"); + player.node.name.innerHTML = get.slimName(player.name); delete player.name2; - player.classList.remove('fullskin2'); - player.node.avatar2.classList.add('hidden'); - player.node.name2.innerHTML=''; - if(player==game.me&&ui.fakeme){ - ui.fakeme.style.backgroundImage=player.node.avatar.style.backgroundImage; + player.classList.remove("fullskin2"); + player.node.avatar2.classList.add("hidden"); + player.node.name2.innerHTML = ""; + if (player == game.me && ui.fakeme) { + ui.fakeme.style.backgroundImage = + player.node.avatar.style.backgroundImage; } - },player); + }, player); } } - if(!player.getStorage('mbdanggu').length){ + if (!player.getStorage("mbdanggu").length) { game.delay(); } - 'step 1' + ("step 1"); player.die(); }, }, - return:{ - trigger:{player:'phaseBefore'}, - forced:true, - charlotte:true, - silent:true, - forceDie:true, - forceOut:true, - filter:function(event,player){ - return !event._mbmowang_return&&event.player.isOut()&&_status.mbmowang_return[event.player.playerid]; + return: { + trigger: { player: "phaseBefore" }, + forced: true, + charlotte: true, + silent: true, + forceDie: true, + forceOut: true, + filter: function (event, player) { + return ( + !event._mbmowang_return && + event.player.isOut() && + _status.mbmowang_return[event.player.playerid] + ); }, - content:function(){ - 'step 0' - trigger._mbmowang_return=true; - game.broadcastAll(function(player){ - player.classList.remove('out'); - },trigger.player); - game.log(trigger.player,'移回了游戏'); + content: function () { + "step 0"; + trigger._mbmowang_return = true; + game.broadcastAll(function (player) { + player.classList.remove("out"); + }, trigger.player); + game.log(trigger.player, "移回了游戏"); delete _status.mbmowang_return[trigger.player.playerid]; - trigger.player.recover(trigger.player.maxHp-trigger.player.hp); - game.broadcastAll(function(player){ - if(player.name1=='shichangshi'){ + trigger.player.recover(trigger.player.maxHp - trigger.player.hp); + game.broadcastAll(function (player) { + if (player.name1 == "shichangshi") { player.smoothAvatar(false); - player.node.avatar.setBackground(player.name1,'character'); + player.node.avatar.setBackground(player.name1, "character"); } - if(player.name2=='shichangshi'){ + if (player.name2 == "shichangshi") { player.smoothAvatar(true); - player.node.avatar2.setBackground(player.name2,'character'); + player.node.avatar2.setBackground(player.name2, "character"); } - },trigger.player); - 'step 1' - event.trigger('restEnd'); - } - } - } + }, trigger.player); + ("step 1"); + event.trigger("restEnd"); + }, + }, + }, }, //张让 - scstaoluan:{ - audio:1, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('hes')>0; + scstaoluan: { + audio: 1, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("hes") > 0; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i=0;i0) return 0; - if(button.link[2]=='wugu') return; - var effect=player.getUseValue(button.link[2]); - if(effect>0) return effect; + check: function (button) { + var player = _status.event.player; + if (player.countCards("hs", button.link[2]) > 0) return 0; + if (button.link[2] == "wugu") return; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:true, - audio:'scstaoluan', - selectCard:1, - popname:true, - check:function(card){ - return 6-get.value(card); + filterCard: true, + audio: "scstaoluan", + selectCard: 1, + popname: true, + check: function (card) { + return 6 - get.value(card); }, - position:'hes', - viewAs:{name:links[0][2],nature:links[0][3]} - } + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + }; + }, + prompt: function (links, player) { + return ( + "将一张牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - prompt:function(links,player){ - return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; - } }, - ai:{ - order:4, - result:{ - player:1 + ai: { + order: 4, + result: { + player: 1, }, - threaten:1.9, + threaten: 1.9, }, }, //赵忠 - scschiyan:{ - audio:1, - shaRelated:true, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.hp>0&&event.target.countCards('he')>0; + scschiyan: { + audio: 1, + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - var next=player.choosePlayerCard(trigger.target,'he',get.prompt('scschiyan',trigger.target)); - next.set('ai',function(button){ - if(!_status.event.goon) return 0; - var val=get.value(button.link); - if(button.link==_status.event.target.getEquip(2)) return 2*(val+3); + content: function () { + "step 0"; + var next = player.choosePlayerCard( + trigger.target, + "he", + get.prompt("scschiyan", trigger.target) + ); + next.set("ai", function (button) { + if (!_status.event.goon) return 0; + var val = get.value(button.link); + if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3); return val; }); - next.set('goon',get.attitude(player,trigger.target)<=0); - next.set('forceAuto',true); - 'step 1' - if(result.bool){ - var target=trigger.target; - player.logSkill('scschiyan',target); - target.addSkill('scschiyan_get'); - target.addToExpansion('giveAuto',result.cards,target).gaintag.add('scschiyan_get'); + next.set("goon", get.attitude(player, trigger.target) <= 0); + next.set("forceAuto", true); + ("step 1"); + if (result.bool) { + var target = trigger.target; + player.logSkill("scschiyan", target); + target.addSkill("scschiyan_get"); + target.addToExpansion("giveAuto", result.cards, target).gaintag.add("scschiyan_get"); } }, - ai:{ - unequip_ai:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(get.attitude(player,arg.target)>0) return false; - if(tag=='directHit_ai') return arg.target.hp>=Math.max(1,arg.target.countCards('h')-1); - if(arg&&arg.name=='sha'&&arg.target.getEquip(2)) return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0) return false; + if (tag == "directHit_ai") + return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; return false; - } + }, }, - group:'scschiyan_damage', - subSkill:{ - get:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return player.getExpansions('scschiyan_get').length>0; + group: "scschiyan_damage", + subSkill: { + get: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("scschiyan_get").length > 0; }, - content:function(){ - 'step 0' - var cards=player.getExpansions('scschiyan_get'); - player.gain(cards,'draw'); - game.log(player,'收回了'+get.cnNumber(cards.length)+'张“鸱咽”牌'); - 'step 1' - player.removeSkill('scschiyan_get'); + content: function () { + "step 0"; + var cards = player.getExpansions("scschiyan_get"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“鸱咽”牌"); + ("step 1"); + player.removeSkill("scschiyan_get"); }, - intro:{ - markcount:'expansion', - mark:function(dialog,storage,player){ - var cards=player.getExpansions('scschiyan_get'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("scschiyan_get"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; }, }, }, - damage:{ - audio:'scschiyan', - trigger:{source:'damageBegin1'}, - forced:true, - locked:false, - logTarget:'player', - filter:function(event,player){ - var target=event.player; - return event.getParent().name=='sha'&&player.countCards('h')>=target.countCards('h')&&player.countCards('e')>=target.countCards('e'); + damage: { + audio: "scschiyan", + trigger: { source: "damageBegin1" }, + forced: true, + locked: false, + logTarget: "player", + filter: function (event, player) { + var target = event.player; + return ( + event.getParent().name == "sha" && + player.countCards("h") >= target.countCards("h") && + player.countCards("e") >= target.countCards("e") + ); }, - content:function(){ + content: function () { trigger.num++; }, - } - } + }, + }, }, //孙璋 - scszimou:{ - audio:1, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - var num=player.getHistory('useCard',evtx=>evtx.getParent('phaseUse')==evt).length; - return num==2||num==4||num==6; + scszimou: { + audio: 1, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var num = player.getHistory( + "useCard", + (evtx) => evtx.getParent("phaseUse") == evt + ).length; + return num == 2 || num == 4 || num == 6; }, - content:function(){ - var evt=trigger.getParent('phaseUse'); - var num=player.getHistory('useCard',evtx=>evtx.getParent('phaseUse')==evt).length; - var cards=[]; - if(num==2){ - var card=get.cardPile2(card=>{ - return ['jiu','xionghuangjiu'].includes(card.name); + content: function () { + var evt = trigger.getParent("phaseUse"); + var num = player.getHistory( + "useCard", + (evtx) => evtx.getParent("phaseUse") == evt + ).length; + var cards = []; + if (num == 2) { + var card = get.cardPile2((card) => { + return ["jiu", "xionghuangjiu"].includes(card.name); }); - if(card) cards.push(card); - } - else if(num==4){ - var card=get.cardPile2(card=>{ - return card.name=='sha'; + if (card) cards.push(card); + } else if (num == 4) { + var card = get.cardPile2((card) => { + return card.name == "sha"; }); - if(card) cards.push(card); - } - else if(num==6){ - var card=get.cardPile2(card=>{ - return card.name=='juedou'; + if (card) cards.push(card); + } else if (num == 6) { + var card = get.cardPile2((card) => { + return card.name == "juedou"; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); }, }, //毕岚 - scspicai:{ - audio:1, - enable:'phaseUse', - usable:1, - frequent:true, - content:function(){ - 'step 0' - event.cards=[]; - event.suits=[]; - 'step 1' - player.judge(function(result){ - var evt=_status.event.getParent('scspicai'); - if(evt&&evt.suits&&evt.suits.includes(get.suit(result))) return 0; - return 1; - }).set('callback',lib.skill.scspicai.callback).judge2=function(result){ - return result.bool?true:false; + scspicai: { + audio: 1, + enable: "phaseUse", + usable: 1, + frequent: true, + content: function () { + "step 0"; + event.cards = []; + event.suits = []; + ("step 1"); + player + .judge(function (result) { + var evt = _status.event.getParent("scspicai"); + if (evt && evt.suits && evt.suits.includes(get.suit(result))) return 0; + return 1; + }) + .set("callback", lib.skill.scspicai.callback).judge2 = function (result) { + return result.bool ? true : false; }; - 'step 2' - var cards=cards.filterInD(); - if(cards.length) player.chooseTarget('将'+get.translation(cards)+'交给一名角色',true).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target)/Math.sqrt(1+target.countCards('h')); - if(target.hasSkillTag('nogain')) att/=10; - return att; - }); - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - target.gain(cards,'gain2').giver=player; - } + ("step 2"); + var cards = cards.filterInD(); + if (cards.length) + player + .chooseTarget("将" + get.translation(cards) + "交给一名角色", true) + .set("ai", function (target) { + var player = _status.event.player; + var att = + get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.gain(cards, "gain2").giver = player; + } else event.finish(); }, - callback:function(){ - 'step 0' - var evt=event.getParent(2); + callback: function () { + "step 0"; + var evt = event.getParent(2); event.getParent().orderingCards.remove(event.judgeResult.card); evt.cards.push(event.judgeResult.card); - if(event.getParent().result.bool){ + if (event.getParent().result.bool) { evt.suits.push(event.getParent().result.suit); - player.chooseBool('是否继续发动【庀材】?').set('frequentSkill','scspicai'); - } - else event._result={bool:false}; - 'step 1' - if(result.bool) event.getParent(2).redo(); + player.chooseBool("是否继续发动【庀材】?").set("frequentSkill", "scspicai"); + } else event._result = { bool: false }; + ("step 1"); + if (result.bool) event.getParent(2).redo(); }, - ai:{ - order:9, - result:{ - player:1, + ai: { + order: 9, + result: { + player: 1, }, }, }, //夏恽 - scsyaozhuo:{ - audio:1, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ + scsyaozhuo: { + audio: 1, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { return player.canCompare(current); }); }, - filterTarget:function(card,player,current){ + filterTarget: function (card, player, current) { return player.canCompare(current); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - target.skip('phaseDraw'); - target.addTempSkill('scsyaozhuo_skip',{player:'phaseDrawSkipped'}); - } - else player.chooseToDiscard(2,true,'he'); + ("step 1"); + if (result.bool) { + target.skip("phaseDraw"); + target.addTempSkill("scsyaozhuo_skip", { player: "phaseDrawSkipped" }); + } else player.chooseToDiscard(2, true, "he"); }, - subSkill:{ - skip:{ - mark:true, - intro:{content:'跳过下一个摸牌阶段'}, - } + subSkill: { + skip: { + mark: true, + intro: { content: "跳过下一个摸牌阶段" }, + }, }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(target.skipList.includes('phaseDraw')||target.hasSkill('pingkou')) return 0; - var hs=player.getCards('h').sort(function(a,b){ - return b.number-a.number; + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.skipList.includes("phaseDraw") || target.hasSkill("pingkou")) return 0; + var hs = player.getCards("h").sort(function (a, b) { + return b.number - a.number; }); - var ts=target.getCards('h').sort(function(a,b){ - return b.number-a.number; + var ts = target.getCards("h").sort(function (a, b) { + return b.number - a.number; }); - if(!hs.length||!ts.length) return 0; - if(hs[0].number>ts[0].number-2&&hs[0].number>5) return -1; + if (!hs.length || !ts.length) return 0; + if (hs[0].number > ts[0].number - 2 && hs[0].number > 5) return -1; return 0; }, }, }, }, //韩悝 - scsxiaolu:{ - audio:1, - enable:'phaseUse', - usable:1, - content:function(){ - 'step 0' + scsxiaolu: { + audio: 1, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; player.draw(2); - 'step 1' - var num=player.countCards('he'); - if(!num) event.finish(); - else if(num<2) event._result={index:1}; - else player.chooseControl().set('choiceList',[ - '将两张牌交给一名其他角色', - '弃置两张牌', - ]).set('ai',function(){ - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })) return 0; - return 1; - }); - 'step 2' - if(result.index==0){ + ("step 1"); + var num = player.countCards("he"); + if (!num) event.finish(); + else if (num < 2) event._result = { index: 1 }; + else + player + .chooseControl() + .set("choiceList", ["将两张牌交给一名其他角色", "弃置两张牌"]) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + return 0; + return 1; + }); + ("step 2"); + if (result.index == 0) { player.chooseCardTarget({ - position:'he', - filterCard:true, - selectCard:2, - filterTarget:function(card,player,target){ - return player!=target; + position: "he", + filterCard: true, + selectCard: 2, + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ + ai1: function (card) { return get.unuseful(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(target.hasSkillTag('nogain')) att/=10; - if(target.hasJudge('lebu')) att/=5; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 5; return att; }, - prompt:'选择两张牌,交给一名其他角色', - forced:true, + prompt: "选择两张牌,交给一名其他角色", + forced: true, }); - } - else{ - player.chooseToDiscard(2,true,'he'); + } else { + player.chooseToDiscard(2, true, "he"); event.finish(); } - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.give(result.cards,target); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.give(result.cards, target); } }, - ai:{ - order:9, - result:{player:2} - } + ai: { + order: 9, + result: { player: 2 }, + }, }, //栗嵩 - scskuiji:{ - audio:1, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + scskuiji: { + audio: 1, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - event.list1=[]; - event.list2=[]; - if(player.countCards('h')>0){ - var chooseButton=player.chooseButton(4,['你的手牌',player.getCards('h'),get.translation(target.name)+'的手牌',target.getCards('h')]); + content: function () { + "step 0"; + event.list1 = []; + event.list2 = []; + if (player.countCards("h") > 0) { + var chooseButton = player.chooseButton(4, [ + "你的手牌", + player.getCards("h"), + get.translation(target.name) + "的手牌", + target.getCards("h"), + ]); + } else { + var chooseButton = player.chooseButton(4, [ + get.translation(target.name) + "的手牌", + target.getCards("h"), + ]); } - else{ - var chooseButton=player.chooseButton(4,[get.translation(target.name)+'的手牌',target.getCards('h')]); - } - chooseButton.set('target',target); - chooseButton.set('ai',function(button){ - var player=_status.event.player; - var target=_status.event.target; - var ps=[]; - var ts=[]; - for(var i=0;i0) return false; + logTarget: "target", + locked: false, + check: function (event, player) { + var target = event.target; + if (get.attitude(player, target) > 0) return false; return true; }, - content:function(){ - var num=2; - var evt=trigger.getParent(); - var suit=get.suit(trigger.card); - var suits=[]; - if(num>0){ - if(typeof evt.baseDamage!='number') evt.baseDamage=1; - var cards=get.cards(num); - player.showCards(cards.slice(0),get.translation(player)+'发动了【叱吓】'); - while(cards.length>0){ - var card=cards.pop(); - var suitx=get.suit(card,false); + content: function () { + var num = 2; + var evt = trigger.getParent(); + var suit = get.suit(trigger.card); + var suits = []; + if (num > 0) { + if (typeof evt.baseDamage != "number") evt.baseDamage = 1; + var cards = get.cards(num); + player.showCards(cards.slice(0), get.translation(player) + "发动了【叱吓】"); + while (cards.length > 0) { + var card = cards.pop(); + var suitx = get.suit(card, false); suits.add(suitx); - if(suit==suitx) evt.baseDamage++; + if (suit == suitx) evt.baseDamage++; } game.updateRoundNumber(); } - evt._scschihe_player=player; - var target=trigger.target; - target.addTempSkill('scschihe_block'); - if(!target.storage.scschihe_block) target.storage.scschihe_block=[]; - target.storage.scschihe_block.push([evt.card,suits]); + evt._scschihe_player = player; + var target = trigger.target; + target.addTempSkill("scschihe_block"); + if (!target.storage.scschihe_block) target.storage.scschihe_block = []; + target.storage.scschihe_block.push([evt.card, suits]); lib.skill.scschihe.updateBlocker(target); }, - updateBlocker:function(player){ - var list=[],storage=player.storage.scschihe_block; - if(storage&&storage.length){ - for(var i of storage) list.addArray(i[1]); + updateBlocker: function (player) { + var list = [], + storage = player.storage.scschihe_block; + if (storage && storage.length) { + for (var i of storage) list.addArray(i[1]); } - player.storage.scschihe_blocker=list; + player.storage.scschihe_blocker = list; }, - ai:{ - threaten:2.5, - halfneg:true, + ai: { + threaten: 2.5, + halfneg: true, }, - subSkill:{ - block:{ - mod:{ - cardEnabled:function(card,player){ - if(!player.storage.scschihe_blocker) return; - var suit=get.suit(card); - if(suit=='none'||suit=='unsure') return; - var evt=_status.event; - if(evt.name!='chooseToUse') evt=evt.getParent('chooseToUse'); - if(!evt||!evt.respondTo||evt.respondTo[1].name!='sha') return; - if(player.storage.scschihe_blocker.includes(suit)) return false; + subSkill: { + block: { + mod: { + cardEnabled: function (card, player) { + if (!player.storage.scschihe_blocker) return; + var suit = get.suit(card); + if (suit == "none" || suit == "unsure") return; + var evt = _status.event; + if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); + if (!evt || !evt.respondTo || evt.respondTo[1].name != "sha") return; + if (player.storage.scschihe_blocker.includes(suit)) return false; }, }, - trigger:{ - player:['damageBefore','damageCancelled','damageZero'], - target:['shaMiss','useCardToExcluded','useCardToEnd'], - global:['useCardEnd'], + trigger: { + player: ["damageBefore", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], + global: ["useCardEnd"], }, - forced:true, - firstDo:true, - charlotte:true, - popup:false, - onremove:function(player){ + forced: true, + firstDo: true, + charlotte: true, + popup: false, + onremove: function (player) { delete player.storage.scschihe_block; delete player.storage.scschihe_blocker; }, - filter:function(event,player){ - if(!event.card||!player.storage.scschihe_block) return false; - for(var i of player.storage.scschihe_block){ - if(i[0]==event.card) return true; + filter: function (event, player) { + if (!event.card || !player.storage.scschihe_block) return false; + for (var i of player.storage.scschihe_block) { + if (i[0] == event.card) return true; } return false; }, - content:function(){ - var storage=player.storage.scschihe_block; - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max){ - max=temp; - name2=map[name]; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; } } } - if(name2==get.suit(card,player)) return (name2=='diamond'?(5-get.value(card)):20-get.value(card)); + if (name2 == get.suit(card, player)) + return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); return 0; } return 1; }, - position:'hes', - filterCard:function(card,player,event){ - event=event||_status.event; - var filter=event._backup.filterCard; - var name=get.suit(card,player); - if(name=='club'&&filter({name:'shan',cards:[card]},player,event)) return true; - if(name=='diamond'&&filter({name:'sha',cards:[card],nature:'fire'},player,event)) return true; - if(name=='spade'&&filter({name:'wuxie',cards:[card]},player,event)) return true; - if(name=='heart'&&filter({name:'tao',cards:[card]},player,event)) return true; + position: "hes", + filterCard: function (card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if ( + name == "diamond" && + filter({ name: "sha", cards: [card], nature: "fire" }, player, event) + ) + return true; + if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) + return true; + if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; return false; }, - filter:function(event,player){ - var filter=event.filterCard; - if(filter(get.autoViewAs({name:'sha',nature:'fire'},'unsure'),player,event)&&player.countCards('hes',{suit:'diamond'})) return true; - if(filter(get.autoViewAs({name:'shan'},'unsure'),player,event)&&player.countCards('hes',{suit:'club'})) return true; - if(filter(get.autoViewAs({name:'tao'},'unsure'),player,event)&&player.countCards('hes',{suit:'heart'})) return true; - if(filter(get.autoViewAs({name:'wuxie'},'unsure'),player,event)&&player.countCards('hes',{suit:'spade'})) return true; + filter: function (event, player) { + var filter = event.filterCard; + if ( + filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && + player.countCards("hes", { suit: "diamond" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && + player.countCards("hes", { suit: "club" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && + player.countCards("hes", { suit: "heart" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && + player.countCards("hes", { suit: "spade" }) + ) + return true; return false; }, - precontent:function(){ - 'step 0' - player.addTempSkill('scsanruo_effect'); + precontent: function () { + "step 0"; + player.addTempSkill("scsanruo_effect"); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { var name; - switch(tag){ - case 'respondSha':name='diamond';break; - case 'respondShan':name='club';break; - case 'save':name='heart';break; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; } - if(!player.countCards('hes',{suit:name})) return false; + if (!player.countCards("hes", { suit: name })) return false; }, - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max) max=temp; + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; } } - max/=1.1; + max /= 1.1; return max; } return 2; }, }, - hiddenCard:function(player,name){ - if(name=='wuxie'&&_status.connectMode&&player.countCards('hes')>0) return true; - if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>0; - if(name=='tao') return player.countCards('hes',{suit:'heart'})>0; + hiddenCard: function (player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; }, - subSkill:{ - effect:{ - audio:'scsanruo', - trigger:{ - player:['useCard','respond'], + subSkill: { + effect: { + audio: "scsanruo", + trigger: { + player: ["useCard", "respond"], }, - filter:function(event,player){ - return event.skill=='scsanruo'; + filter: function (event, player) { + return event.skill == "scsanruo"; }, - direct:true, - forced:true, - charlotte:true, - content:function(){ - 'step 0' - var name=trigger.card.name; - var next=game.createEvent('scsanruo_'+name); - next.player=player; - next.setContent(lib.skill.scsanruo_effect[name=='shan'?'sha':name]||function(){}); + direct: true, + forced: true, + charlotte: true, + content: function () { + "step 0"; + var name = trigger.card.name; + var next = game.createEvent("scsanruo_" + name); + next.player = player; + next.setContent( + lib.skill.scsanruo_effect[name == "shan" ? "sha" : name] || function () {} + ); }, - sha:function(){ - 'step 0' - var trigger=event.getParent().getTrigger(); - if(trigger.name=='useCard'){ - var target=lib.skill.chongzhen.logTarget(trigger,player); + sha: function () { + "step 0"; + var trigger = event.getParent().getTrigger(); + if (trigger.name == "useCard") { + var target = lib.skill.chongzhen.logTarget(trigger, player); + } else { + var target = trigger.source; } - else{ - var target=trigger.source; - } - event.target=target; - if(!target||!target.countGainableCards(player,'he')) event._result={bool:false}; - else player.chooseBool(get.prompt('scsanruo_effect',target),'获得该角色的一张牌').set('ai',()=>{ - return _status.event.goon; - }).set('goon',get.attitude(player,target)<1); - 'step 1' - if(result.bool){ - player.logSkill('scsanruo_effect',target); - player.gainPlayerCard(target,'he',true); + event.target = target; + if (!target || !target.countGainableCards(player, "he")) + event._result = { bool: false }; + else + player + .chooseBool(get.prompt("scsanruo_effect", target), "获得该角色的一张牌") + .set("ai", () => { + return _status.event.goon; + }) + .set("goon", get.attitude(player, target) < 1); + ("step 1"); + if (result.bool) { + player.logSkill("scsanruo_effect", target); + player.gainPlayerCard(target, "he", true); } }, - tao:function(){ - 'step 0' - player.chooseTarget(get.prompt('scsanruo'),'获得一名其他角色的一张牌',(card,player,target)=>{ - return target.countGainableCards(player,'he')&&target!=player; - }).set('ai',target=>{ - return 1-get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('scsanruo_effect',target); - player.gainPlayerCard(target,'he',true); + tao: function () { + "step 0"; + player + .chooseTarget( + get.prompt("scsanruo"), + "获得一名其他角色的一张牌", + (card, player, target) => { + return target.countGainableCards(player, "he") && target != player; + } + ) + .set("ai", (target) => { + return 1 - get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("scsanruo_effect", target); + player.gainPlayerCard(target, "he", true); } }, - wuxie:function(){ - 'step 0' - var trigger=event.getParent().getTrigger(); - if(!trigger.respondTo){event.finish();return;} - var target=trigger.respondTo[0]; - event.target=target; - if(!target||!target.countGainableCards(player,player==target?'e':'he')) event._result={bool:false}; - else player.chooseBool(get.prompt('scsanruo_effect',target),'获得该角色的一张牌').set('ai',()=>{ - return _status.event.goon; - }).set('goon',get.attitude(player,target)<1); - 'step 1' - if(result.bool){ - player.logSkill('scsanruo_effect',target); - player.gainPlayerCard(target,player==target?'e':'he',true); + wuxie: function () { + "step 0"; + var trigger = event.getParent().getTrigger(); + if (!trigger.respondTo) { + event.finish(); + return; } - } + var target = trigger.respondTo[0]; + event.target = target; + if (!target || !target.countGainableCards(player, player == target ? "e" : "he")) + event._result = { bool: false }; + else + player + .chooseBool(get.prompt("scsanruo_effect", target), "获得该角色的一张牌") + .set("ai", () => { + return _status.event.goon; + }) + .set("goon", get.attitude(player, target) < 1); + ("step 1"); + if (result.bool) { + player.logSkill("scsanruo_effect", target); + player.gainPlayerCard(target, player == target ? "e" : "he", true); + } + }, }, }, }, - scsmiaoyu:{ - audio:'scsanruo', - enable:['chooseToUse','chooseToRespond'], - prompt:'将至多两张♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】使用或打出', - viewAs:function(cards,player){ - var name=false; - var nature=null; - switch(get.suit(cards[0],player)){ - case 'club':name='shan';break; - case 'diamond':name='sha';nature='fire';break; - case 'spade':name='wuxie';break; - case 'heart':name='tao';break; + scsmiaoyu: { + audio: "scsanruo", + enable: ["chooseToUse", "chooseToRespond"], + prompt: "将至多两张♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】使用或打出", + viewAs: function (cards, player) { + var name = false; + var nature = null; + switch (get.suit(cards[0], player)) { + case "club": + name = "shan"; + break; + case "diamond": + name = "sha"; + nature = "fire"; + break; + case "spade": + name = "wuxie"; + break; + case "heart": + name = "tao"; + break; } //返回判断结果 - if(name) return {name:name,nature:nature}; + if (name) return { name: name, nature: nature }; return null; }, - check:function(card){ - if(ui.selected.cards.length) return 0; - var player=_status.event.player; - if(_status.event.type=='phase'){ - var max=0; + check: function (card) { + if (ui.selected.cards.length) return 0; + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; var name2; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max){ - max=temp; - name2=map[name]; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ name: name, nature: name == "sha" ? "fire" : null }) > 0 + ) { + var temp = get.order({ name: name, nature: name == "sha" ? "fire" : null }); + if (temp > max) { + max = temp; + name2 = map[name]; } } } - if(name2==get.suit(card,player)) return (name2=='diamond'?(5-get.value(card)):20-get.value(card)); + if (name2 == get.suit(card, player)) + return name2 == "diamond" ? 5 - get.value(card) : 20 - get.value(card); return 0; } return 1; }, - selectCard:[1,2], - complexCard:true, - position:'hes', - filterCard:function(card,player,event){ - if(ui.selected.cards.length) return get.suit(card,player)==get.suit(ui.selected.cards[0],player); - event=event||_status.event; - var filter=event._backup.filterCard; - var name=get.suit(card,player); - if(name=='club'&&filter({name:'shan',cards:[card]},player,event)) return true; - if(name=='diamond'&&filter({name:'sha',cards:[card],nature:'fire'},player,event)) return true; - if(name=='spade'&&filter({name:'wuxie',cards:[card]},player,event)) return true; - if(name=='heart'&&filter({name:'tao',cards:[card]},player,event)) return true; + selectCard: [1, 2], + complexCard: true, + position: "hes", + filterCard: function (card, player, event) { + if (ui.selected.cards.length) + return get.suit(card, player) == get.suit(ui.selected.cards[0], player); + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.suit(card, player); + if (name == "club" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if ( + name == "diamond" && + filter({ name: "sha", cards: [card], nature: "fire" }, player, event) + ) + return true; + if (name == "spade" && filter({ name: "wuxie", cards: [card] }, player, event)) + return true; + if (name == "heart" && filter({ name: "tao", cards: [card] }, player, event)) return true; return false; }, - filter:function(event,player){ - var filter=event.filterCard; - if(filter(get.autoViewAs({name:'sha',nature:'fire'},'unsure'),player,event)&&player.countCards('hes',{suit:'diamond'})) return true; - if(filter(get.autoViewAs({name:'shan'},'unsure'),player,event)&&player.countCards('hes',{suit:'club'})) return true; - if(filter(get.autoViewAs({name:'tao'},'unsure'),player,event)&&player.countCards('hes',{suit:'heart'})) return true; - if(filter(get.autoViewAs({name:'wuxie'},'unsure'),player,event)&&player.countCards('hes',{suit:'spade'})) return true; + filter: function (event, player) { + var filter = event.filterCard; + if ( + filter(get.autoViewAs({ name: "sha", nature: "fire" }, "unsure"), player, event) && + player.countCards("hes", { suit: "diamond" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && + player.countCards("hes", { suit: "club" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && + player.countCards("hes", { suit: "heart" }) + ) + return true; + if ( + filter(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && + player.countCards("hes", { suit: "spade" }) + ) + return true; return false; }, - precontent:function(){ - player.addTempSkill('scsmiaoyu_num'); - player.addTempSkill('scsmiaoyu_discard'); + precontent: function () { + player.addTempSkill("scsmiaoyu_num"); + player.addTempSkill("scsmiaoyu_discard"); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { var name; - switch(tag){ - case 'respondSha':name='diamond';break; - case 'respondShan':name='club';break; - case 'save':name='heart';break; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; } - if(!player.countCards('hes',{suit:name})) return false; + if (!player.countCards("hes", { suit: name })) return false; }, - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i0&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max) max=temp; + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) > 0 && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; } } - max/=1.1; + max /= 1.1; return max; } return 2; }, }, - hiddenCard:function(player,name){ - if(name=='wuxie'&&_status.connectMode&&player.countCards('hs')>0) return true; - if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>0; - if(name=='tao') return player.countCards('hes',{suit:'heart'})>0; + hiddenCard: function (player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hs") > 0) return true; + if (name == "wuxie") return player.countCards("hes", { suit: "spade" }) > 0; + if (name == "tao") return player.countCards("hes", { suit: "heart" }) > 0; }, - subSkill:{ - num:{ - charlotte:true, - trigger:{player:'useCard'}, - filter:function(event){ - return ['sha','tao'].includes(event.card.name)&&event.skill=='scsmiaoyu'&&event.cards&&event.cards.length==2; + subSkill: { + num: { + charlotte: true, + trigger: { player: "useCard" }, + filter: function (event) { + return ( + ["sha", "tao"].includes(event.card.name) && + event.skill == "scsmiaoyu" && + event.cards && + event.cards.length == 2 + ); }, - forced:true, - popup:false, - content:function(){ + forced: true, + popup: false, + content: function () { trigger.baseDamage++; }, }, - discard:{ - charlotte:true, - trigger:{player:['useCardAfter','respondAfter']}, - autodelay:function(event){ - return event.name=='respond'?0.5:false; + discard: { + charlotte: true, + trigger: { player: ["useCardAfter", "respondAfter"] }, + autodelay: function (event) { + return event.name == "respond" ? 0.5 : false; }, - filter:function(event,player){ - return ['shan','wuxie'].includes(event.card.name)&&event.skill=='scsmiaoyu'&&event.cards&&event.cards.length==2&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.countDiscardableCards(player,'he'); + filter: function (event, player) { + return ( + ["shan", "wuxie"].includes(event.card.name) && + event.skill == "scsmiaoyu" && + event.cards && + event.cards.length == 2 && + _status.currentPhase && + _status.currentPhase != player && + _status.currentPhase.countDiscardableCards(player, "he") + ); }, - forced:true, - popup:false, - content:function(){ - player.line(_status.currentPhase,'green'); - player.discardPlayerCard(_status.currentPhase,'he',true); + forced: true, + popup: false, + content: function () { + player.line(_status.currentPhase, "green"); + player.discardPlayerCard(_status.currentPhase, "he", true); }, }, }, }, //牵招 - mbshihe:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(current=>player.canCompare(current)); + mbshihe: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => player.canCompare(current)); }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return player.canCompare(target); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - target.addTempSkill('mbshihe_prevent',{player:'phaseAfter'}); - target.markAuto('mbshihe_prevent',[player]); - } - else{ - var cards=player.getCards('he',card=>{ - return lib.filter.cardDiscardable(card,player,'mbshihe'); + ("step 1"); + if (result.bool) { + target.addTempSkill("mbshihe_prevent", { player: "phaseAfter" }); + target.markAuto("mbshihe_prevent", [player]); + } else { + var cards = player.getCards("he", (card) => { + return lib.filter.cardDiscardable(card, player, "mbshihe"); }); - if(cards.length>0) player.discard(cards.randomGet()); + if (cards.length > 0) player.discard(cards.randomGet()); } }, - ai:{ - order:6, - result:{ - player:function(player,target){ - if((get.realAttitude||get.attitude)(target,player)>=0||get.damageEffect(player,target,player)>=0) return 0; - var card=player.getCards('h').sort(function(a,b){ - return get.number(b)-get.number(a); + ai: { + order: 6, + result: { + player: function (player, target) { + if ( + (get.realAttitude || get.attitude)(target, player) >= 0 || + get.damageEffect(player, target, player) >= 0 + ) + return 0; + var card = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); })[0]; - return get.number(card)>=10||get.number(card)>=7&&target.countCards('h')<=2?1:-1; + return get.number(card) >= 10 || + (get.number(card) >= 7 && target.countCards("h") <= 2) + ? 1 + : -1; }, }, }, - subSkill:{ - prevent:{ - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - if(get.mode()=='identity') return player.getStorage('mbshihe_prevent').includes(event.player); - return player.getStorage('mbshihe_prevent').some(target=>event.player.isFriendOf(target)); + subSkill: { + prevent: { + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + if (get.mode() == "identity") + return player.getStorage("mbshihe_prevent").includes(event.player); + return player + .getStorage("mbshihe_prevent") + .some((target) => event.player.isFriendOf(target)); }, - onremove:true, - forced:true, - charlotte:true, - content:function(){ + onremove: true, + forced: true, + charlotte: true, + content: function () { trigger.cancel(); }, - mark:true, - marktext:'吓', - intro:{ - content:function(storage,player){ - var targets=storage.filter(i=>i.isIn()); - return '被'+get.translation(targets)+'吓到了,对他'+(targets.length>1?'们':'')+(get.mode()!='identity'?'和他的友方角色':'')+'打不出伤害'; + mark: true, + marktext: "吓", + intro: { + content: function (storage, player) { + var targets = storage.filter((i) => i.isIn()); + return ( + "被" + + get.translation(targets) + + "吓到了,对他" + + (targets.length > 1 ? "们" : "") + + (get.mode() != "identity" ? "和他的友方角色" : "") + + "打不出伤害" + ); }, }, - ai:{ - effect:{ - player:function(card,player,target,current){ - if(get.tag(card,'damage')){ - var bool=false; - if(get.mode()=='identity'&&player.getStorage('mbshihe_prevent').includes(target)) bool=true; - if(get.mode()!='identity'&&player.getStorage('mbshihe_prevent').some(targetx=>target.isFriendOf(targetx))) bool=true; - if(bool) return 'zeroplayertarget'; + ai: { + effect: { + player: function (card, player, target, current) { + if (get.tag(card, "damage")) { + var bool = false; + if ( + get.mode() == "identity" && + player.getStorage("mbshihe_prevent").includes(target) + ) + bool = true; + if ( + get.mode() != "identity" && + player + .getStorage("mbshihe_prevent") + .some((targetx) => target.isFriendOf(targetx)) + ) + bool = true; + if (bool) return "zeroplayertarget"; } - } - }, - } - } - } - }, - mbzhenfu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasHistory('lose',evt=>{ - return evt.type=='discard'; - }); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('mbzhenfu'),'令一名其他角色获得1点护甲',(card,player,target)=>{ - return target!=player&&target.hujia<5; - }).set('ai',target=>{ - return Math.max(0,get.threaten(target))*get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('mbzhenfu',target); - target.changeHujia(1,null,true); - } - }, - ai:{ - expose:0.2, - }, - }, - //☆胃炎 - mbguli:{ - audio:2, - enable:'phaseUse', - filterCard:true, - selectCard:-1, - position:'h', - filter:function(event,player){ - if(player.hasSkill('mbguli_used')) return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var card of hs){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2===false) return false; - } - return event.filterCard(get.autoViewAs({name:'sha'},hs)); - }, - viewAs:{ - name:'sha', - storage:{mbguli:true} - }, - onuse:function(links,player){ - player.addTempSkill('mbguli_used','phaseUseAfter'); - }, - ai:{ - order:1, - threaten:1.14, - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.name=='sha'&&arg.card&&arg.card.storage&&arg.card.storage.mbguli) return true; - return false; - } - }, - subSkill:{ - used:{ - audio:'mbguli', - trigger:{global:'useCardAfter'}, - charlotte:true, - prompt2:'失去1点体力,然后将手牌摸至体力上限', - check:function(event,player){ - var num=player.maxHp-player.countCards('h'); - return num>=3&&player.hp>=2||num>=2&&player.hp>=3; - }, - filter:function(event,player){ - return event.card.storage&&event.card.storage.mbguli&&game.hasPlayer2(current=>{ - return current.hasHistory('sourceDamage',evt=>evt.card==event.card); - }); - }, - content:function(){ - 'step 0' - player.loseHp(); - 'step 1' - player.drawTo(player.maxHp); - }, - group:'mbguli_unequip', - }, - unequip:{ - trigger:{ - player:'useCardToPlayered', - }, - filter:function({card}){ - return card.name=='sha' && card.storage && card.storage.mbguli; - }, - forced:true, - popup:false, - logTarget:'target', - content:function(){ - trigger.target.addTempSkill('qinggang2'); - trigger.target.storage.qinggang2.add(trigger.card); - trigger.target.markSkill('qinggang2'); - }, - }, - }, - }, - mbaosi:{ - audio:2, - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - return player.inRange(event.player)&&player.isPhaseUsing()&&event.player.isIn()&&!player.getStorage('mbaosi_inf').includes(event.player); - }, - logTarget:'player', - content:function(){ - player.addTempSkill('mbaosi_inf','phaseUseAfter'); - player.markAuto('mbaosi_inf',[trigger.player]); - }, - subSkill:{ - inf:{ - charlotte:true, - onremove:true, - forced:true, - intro:{content:'对$使用牌无次数限制'}, - mod:{ - cardUsableTarget:function(card,player,target){ - if(player.getStorage('mbaosi_inf').includes(target)) return true; - }, - }, - } - } - }, - // 界曹休 - xinqingxi:{ - audio:2, - usable:1, - trigger:{source:'damageBegin1'}, - check:function(event,player){ - return get.attitude(player,event.player)<0; - }, - filter:function(event,player){ - return event.player!=player; - }, - content:function(){ - 'step 0' - var num=Math.max(1,4-get.distance(player,trigger.player)); - if(trigger.player.countCards('h')2){ - return 0; - } - return 8-get.value(card); - } - }); - } - 'step 1' - if(!result.bool){ - trigger.num++; - } - } - }, - // 界朱桓 - xinpingkou:{ - audio:2, - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return player.getHistory('skipped').length>0; - }, - content:function(){ - 'step 0' - player.chooseTarget([1,player.getHistory('skipped').length],get.prompt2('xinpingkou'),function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - player.logSkill('xinpingkou',result.targets); - event.targets=result.targets.slice(0).sortBySeat(); - } - else{ - event.finish(); - } - 'step 2' - if(event.targets&&event.targets.length){ - event.targets.shift().damage(); - event.redo(); - } - 'step 3' - var card=get.cardPile2(card=>get.type(card,false)=='equip'); - if(card) player.gain(card,'gain2'); - }, - ai:{ - combo:'fenli', - effect:{ - target:function(card){ - if(card.name=='lebu'||card.name=='bingliang') return 0.5; - } - } - } - }, - // 彭羕 - spdaming:{ - audio:3, - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - locked:false, - global:'spdaming_give', - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); - }, - change:function(player,num){ - if(!player.storage.spdaming) player.storage.spdaming=0; - if(!num) return; - player.storage.spdaming+=num; - player.markSkill('spdaming'); - game.log(player,(num>0?'获得了':'减少了')+get.cnNumber(Math.abs(num))+'点“达命”值'); - }, - content:function(){ - lib.skill.spdaming.change(player,1); - }, - intro:{ - name:'达命值', - markcount:function(storage,player){ - return (storage||0).toString(); - }, - content:'当前有#点“达命”值', - }, - subSkill:{ - used:{charlotte:true}, - give:{ - audio:2, - enable:'phaseUse', - nopop:true, - filter:function(event,player){ - if(!player.countCards('he')) return false; - return game.hasPlayer(current=>{ - return current!=player&¤t.hasSkill('spdaming')&&!current.hasSkill('spdaming_used'); - }); - }, - selectCard:1, - filterCard:true, - filterTarget:function(card,player,target){ - return target.hasSkill('spdaming')&&!target.hasSkill('spdaming_used'); - }, - selectTarget:function(){ - var player=_status.event.player; - var targets=game.filterPlayer(current=>{ - return current!=player&¤t.hasSkill('spdaming')&&!current.hasSkill('spdaming_used'); - }); - return targets.length>1?1:-1; - }, - complexSelect:true, - prompt:function(){ - var player=_status.event.player; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('spdaming')&&!current.hasSkill('spdaming_used'); - }); - return '将一张牌交给'+get.translation(targets)+(targets.length>1?'中的一人':''); - }, - position:'he', - discard:false, - lose:false, - delay:false, - check:function(card){ - var player=_status.event.player; - if(game.hasPlayer(current=>{ - return lib.skill.spdaming_give.filterTarget(null,player,current)&&get.attitude(player,current)>0; - })){ - return 6+Math.random()-get.value(card)/15; - } - return 0; - }, - content:function(){ - 'step 0' - game.trySkillAudio('spdaming',target); - player.give(cards,target); - if(!game.hasPlayer(current=>current!=player&¤t!=target)) event.finish(); - target.addTempSkill('spdaming_used','phaseUseAfter'); - 'step 1' - var type=get.type(cards[0],'trick',target); - event.cardtype=type; - var str=get.translation(type),user=get.translation(player); - target.chooseTarget('达命:选择另一名其他角色','若该角色有'+str+'牌,其将一张该类型的牌交给'+user+',你获得1点“达命”值;否则你将'+get.translation(cards)+'交给'+user,(card,player,target)=>{ - return target!=player&&target!=_status.event.getParent().player; - }).set('ai',target=>1-get.attitude(_status.event.player,target)); - 'step 2' - if(result.bool){ - var targetx=result.targets[0],type=event.cardtype; - target.line(targetx); - event.targetx=targetx; - if(targetx.countCards('he',{type:type})>0){ - targetx.chooseCard('交给'+get.translation(player)+'一张'+get.translation(type)+'牌','he',true,card=>{ - return get.type(card)==_status.event.getParent().cardtype; - }).set('ai',card=>10-get.value(card)); - } - else { - var cards=cards.filter(i=>get.owner(i)==target); - if(cards.length) target.give(cards,player); - event.finish(); - } - } else event.finish(); - 'step 3' - if(result.bool){ - event.targetx.give(result.cards,player); - event.targetx.line(player); - lib.skill.spdaming.change(target,1); - game.delayx(); - } - }, - ai:{ - expose:0.2, - order:10, - result:{target:1}, - }, - } - }, - }, - spxiaoni:{ - audio:2, - enable:'phaseUse', - usable:1, - locked:false, - filter:function(event,player){ - return (player.storage.spdaming||0)>0; - }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - if(name=='sha'){ - list.push(['基本','','sha']); - for(var i of lib.inpile_nature) list.push(['基本','','sha',i]); - } - if(!get.tag({name:name},'damage')) continue; - if(get.type2(name)=='trick') list.push(['锦囊','',name]); - } - return ui.create.dialog('嚣逆',[list,'vcard']); - }, - filter:function(button,player){ - return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); - }, - check:function(button){ - var player=_status.event.player; - if(player.countCards('hs',button.link[2])>0) return 0; - var effect=player.getUseValue(button.link[2]); - if(effect>0) return effect; - return 0; - }, - backup:function(links,player){ - return { - filterCard:true, - audio:'spxiaoni', - selectCard:1, - popname:true, - check:function(card){ - return 6-get.value(card); - }, - position:'hes', - viewAs:{name:links[0][2],nature:links[0][3]}, - onuse:function(result,player){ - lib.skill.spdaming.change(player,-result.targets.length); - }, - } - }, - prompt:function(links,player){ - return '将一张牌当'+(get.translation(links[0][3])||'')+'【'+get.translation(links[0][2])+'】使用'; - } - }, - mod:{ - maxHandcardBase:function(player,num){ - return Math.min(Math.max(0,player.storage.spdaming||0),player.hp); - } - }, - ai:{ - order:4, - result:{ - player:1 - }, - threaten:1.4, - combo:'spdaming' - }, - subSkill:{ - backup:{}, - } - }, - // 灭霸 - zhujian:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.countCards('e')>0; - }, - selectTarget:[2,Infinity], - multiline:true, - multitarget:true, - filter:function(event,player){ - return game.countPlayer(current=>current.countCards('e')>0)>=2; - }, - content:function(){ - game.asyncDraw(targets); - }, - ai:{ - order:8, - result:{target:1}, - } - }, - duansuo:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.isLinked(); - }, - selectTarget:[1,Infinity], - multiline:true, - multitarget:true, - filter:function(event,player){ - return game.countPlayer(current=>current.isLinked()); - }, - content:function(){ - 'step 0' - event.targets=targets.sortBySeat(); - for(var i of event.targets){ - i.link(false); - } - 'step 1' - for(var i of targets){ - i.damage('fire'); - } - }, - ai:{ - order:2, - result:{target:-1}, - } - }, - // 界朱治 - sbanguo:{ - audio:3, - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - locked:false, - direct:true, - group:['sbanguo_move','sbanguo_damage','sbanguo_dying'], - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - 'step 0' - player.chooseTarget('安国:令一名其他角色获得“安国”标记',lib.filter.notMe,true); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbanguo',target); - target.addMark('sbanguo_mark',1,false); - target.addAdditionalSkill('sbanguo_'+player.playerid,'sbanguo_mark'); - target.addMark('sbanguo_marked',1,false); - } - }, - subSkill:{ - mark:{ - onremove:true, - marktext:'安', - charlotte:true, - intro:{ - name:'安国', - name2:'安国', - content:'已拥有“安国”标记', - }, - mod:{ - maxHandcardBase:function(player,num){ - return player.maxHp; - } - } - }, - move:{ - audio:'sbanguo', - direct:true, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return game.hasPlayer(current=>current.hasSkill('sbanguo_mark'))&&game.hasPlayer(current=>!current.hasMark('sbanguo_marked')&¤t!=player); - }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>current.hasSkill('sbanguo_mark')); - var prompt2=targets.length==1?('将'+get.translation(targets[0])+'的“安国”交给一名未获得过“安国”的其他角色'):('选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色'); - player.chooseTarget(get.prompt('sbanguo'),prompt2,targets.length==1?1:2,(card,player,target)=>{ - if(ui.selected.targets.length==0&&_status.event.targets.length>1) return target.hasSkill('sbanguo_mark'); - return !target.hasMark('sbanguo_marked')&&target!=player; - }).set('ai',target=>{ - var player=_status.event.player; - if(ui.selected.targets.length==0&&_status.event.targets.length>1) return -get.attitude(player,target); - return get.attitude(player,_status.event.targets[0])current.hasSkill('sbanguo_mark'))[0]; - var target2=targets[0]; - }else{ - var target1=targets[0]; - var target2=targets[1]; - } - player.logSkill('sbanguo_move',target2,false); - player.line2([target1,target2],'green'); - var map=target1.additionalSkills; - for(var key in map){ - if(key.indexOf('sbanguo_')!=0) continue; - var id=parseInt(key.slice(8)); - target1.removeAdditionalSkill('sbanguo_'+id); - target2.addMark('sbanguo_mark',1,false); - target2.addAdditionalSkill('sbanguo_'+id,'sbanguo_mark'); - target2.addMark('sbanguo_marked',1,false); - } - } - } - }, - damage:{ - audio:'sbanguo', - forced:true, - locked:false, - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - if(!game.hasPlayer(current=>current.hasSkill('sbanguo_mark'))) return false; - if(event.source&&event.source.isIn()&&event.source.hasSkill('sbanguo_mark')) return false; - return event.num>=player.hp; - }, - content:function(){ - trigger.cancel(); - }, - ai:{ - nofire:true, - nothunder:true, - nodamage:true, - effect:{ - target:function(card,player,target,current){ - if(!game.hasPlayer(current=>current.hasSkill('sbanguo_mark'))) return; - if(player.hasSkill('sbanguo_mark')) return; - if(get.tag(card,'damage')){ - if(target.hp<=1) return [0,0]; - return 0.5; - } - } - }, - }, - }, - dying:{ - audio:'sbanguo', - forced:true, - locked:false, - trigger:{global:'dying'}, - filter:function(event,player){ - var skills=event.player.additionalSkills['sbanguo_'+player.playerid]; - return skills&&skills.length; - }, - logTarget:'player', - content:function(){ - 'step 0' - trigger.player.removeAdditionalSkill('sbanguo_'+player.playerid); - var num=1-trigger.player.hp; - if(num>0) trigger.player.recover(num); - 'step 1' - var hp=player.hp-1,maxhp=player.maxHp-1; - if(hp>0&&maxhp>0){ - player.chooseControl().set('prompt','安国:请选择一项').set('choiceList',[ - '失去'+hp+'点体力,令'+get.translation(trigger.player)+'获得1点护甲', - '减'+maxhp+'点体力上限,令'+get.translation(trigger.player)+'获得1点护甲' - ]).set('ai',()=>'选项一'); - } - else if(hp>0) event._result={control:'选项一'}; - else if(maxhp>0) event._result={control:'选项二'}; - else event.finish(); - 'step 2' - if(result.control=='选项一'){ - var num=player.hp-1; - if(num>0) player.loseHp(num); - } - else{ - var num=player.maxHp-1; - if(num>0) player.loseMaxHp(num); - } - trigger.player.changeHujia(1,null,true); - } - } - } - }, - // 界吴懿 - sbbenxi:{ - audio:3, - trigger:{ - player:'phaseUseBegin', - }, - filter:function(event,player){ - return player.countDiscardableCards(player,'he')>0; - }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('sbbenxi'),[1,Infinity],'he').set('logSkill','sbbenxi').set('ai',card=>{ - var player=_status.event.player; - if(ui.selected.cards.length<_status.event.num) return 100-(get.useful(card,player)+player.getUseValue(card)/3); - return 0; - }).set('num',(function(){ - var count=0; - var list=[],list2=[]; - var targets=game.filterPlayer(current=>get.distance(player,current)>=1); - var cards=player.getCards('hs',card=>{ - return player.hasUseTarget(card,false)&&['basic','trick'].includes(get.type(card,false,player))&&get.info(card).allowMultiple!=false; - }); - var cards2=player.getCards('he').filter(i=>lib.filter.cardDiscardable(i,player,'sbbenxi')).sort((a,b)=>{ - return (get.useful(a,player)+player.getUseValue(a)/3)-(get.useful(b,player)+player.getUseValue(b)/3); - }); - for(var i=0; i0) count+=get.effect(player,{name:'draw'},player); - var targets2=targets.filter(current=>{ - return player.canUse(card,current,false)&&get.distance(player,current)<=num&&get.effect(current,card,player,player)>0; - }); - targets2=targets2.map(target=>get.effect(target,card,player,player)).sort((a,b)=>b-a); - targets2.slice(0,num).forEach(eff=>count+=eff); - list.push(count-1.2*get.value(cards2[i])); - } - var val=list.sort((a,b)=>b-a)[0]; - if(!isNaN(val)) list2.push([val,i]); - } - list2=list2.filter(i=>i[0]>0); - if(!list2.length) return 0; - return list2.sort((a,b)=>b[0]-a[0])[0][1]; - })()); - 'step 1' - if(result.bool){ - var num=result.cards.length; - player.addTempSkill('sbbenxi_effect','phaseUseAfter'); - player.addTempSkill('sbbenxi_effect2','phaseUseAfter'); - player.addMark('sbbenxi_effect2',num,false); - } - }, - subSkill:{ - effect:{ - audio:'sbbenxi', - trigger:{player:'useCard2'}, - forced:true, - charlotte:true, - direct:true, - onremove:true, - filter:function(event,player){ - var type=get.type(event.card,false); - return type=='basic'||type=='trick'; - }, - content:function(){ - 'step 0' - var num=player.countMark('sbbenxi_effect2'); - player.removeSkill('sbbenxi_effect'); - player.addTempSkill('sbbenxi_effect3','phaseUseAfter'); - player.markAuto('sbbenxi_effect3',[trigger.card]); - var filter=function(event,player){ - var card=event.card,info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current)&&get.distance(player,current)==1; - })){ - return true; - } - } - return false; - } - if(!filter(trigger,player)) event.finish(); - else{ - var prompt='为'+get.translation(trigger.card)+'增加至多'+get.cnNumber(num)+'个距离为1的目标?'; - trigger.player.chooseTarget(get.prompt('sbbenxi_effect'),prompt,[1,num],function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target)&&get.distance(player,target)==1; - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - } - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - } - else event.finish(); - 'step 2' - player.logSkill('sbbenxi_effect',result.targets); - game.log(result.targets,'也成为了',trigger.card,'的目标'); - trigger.targets.addArray(result.targets); - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player.canUse(card,target)&&get.distance(player,target)!=1) return 1.2; }, }, }, }, - effect2:{ - audio:'sbbenxi', - trigger:{ - global:'useCardAfter', + }, + }, + mbzhenfu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasHistory("lose", (evt) => { + return evt.type == "discard"; + }); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("mbzhenfu"), + "令一名其他角色获得1点护甲", + (card, player, target) => { + return target != player && target.hujia < 5; + } + ) + .set("ai", (target) => { + return ( + Math.max(0, get.threaten(target)) * get.attitude(_status.event.player, target) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mbzhenfu", target); + target.changeHujia(1, null, true); + } + }, + ai: { + expose: 0.2, + }, + }, + //☆胃炎 + mbguli: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: -1, + position: "h", + filter: function (event, player) { + if (player.hasSkill("mbguli_used")) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var card of hs) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; + } + return event.filterCard(get.autoViewAs({ name: "sha" }, hs)); + }, + viewAs: { + name: "sha", + storage: { mbguli: true }, + }, + onuse: function (links, player) { + player.addTempSkill("mbguli_used", "phaseUseAfter"); + }, + ai: { + order: 1, + threaten: 1.14, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + arg && + arg.name == "sha" && + arg.card && + arg.card.storage && + arg.card.storage.mbguli + ) + return true; + return false; + }, + }, + subSkill: { + used: { + audio: "mbguli", + trigger: { global: "useCardAfter" }, + charlotte: true, + prompt2: "失去1点体力,然后将手牌摸至体力上限", + check: function (event, player) { + var num = player.maxHp - player.countCards("h"); + return (num >= 3 && player.hp >= 2) || (num >= 2 && player.hp >= 3); }, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return player.getStorage('sbbenxi_effect3').includes(event.card)&&game.hasPlayer2(current=>{ - return current.hasHistory('damage',evt=>{ - return event.card==evt.card; - }); + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.mbguli && + game.hasPlayer2((current) => { + return current.hasHistory( + "sourceDamage", + (evt) => evt.card == event.card + ); + }) + ); + }, + content: function () { + "step 0"; + player.loseHp(); + ("step 1"); + player.drawTo(player.maxHp); + }, + group: "mbguli_unequip", + }, + unequip: { + trigger: { + player: "useCardToPlayered", + }, + filter: function ({ card }) { + return card.name == "sha" && card.storage && card.storage.mbguli; + }, + forced: true, + popup: false, + logTarget: "target", + content: function () { + trigger.target.addTempSkill("qinggang2"); + trigger.target.storage.qinggang2.add(trigger.card); + trigger.target.markSkill("qinggang2"); + }, + }, + }, + }, + mbaosi: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return ( + player.inRange(event.player) && + player.isPhaseUsing() && + event.player.isIn() && + !player.getStorage("mbaosi_inf").includes(event.player) + ); + }, + logTarget: "player", + content: function () { + player.addTempSkill("mbaosi_inf", "phaseUseAfter"); + player.markAuto("mbaosi_inf", [trigger.player]); + }, + subSkill: { + inf: { + charlotte: true, + onremove: true, + forced: true, + intro: { content: "对$使用牌无次数限制" }, + mod: { + cardUsableTarget: function (card, player, target) { + if (player.getStorage("mbaosi_inf").includes(target)) return true; + }, + }, + }, + }, + }, + // 界曹休 + xinqingxi: { + audio: 2, + usable: 1, + trigger: { source: "damageBegin1" }, + check: function (event, player) { + return get.attitude(player, event.player) < 0; + }, + filter: function (event, player) { + return event.player != player; + }, + content: function () { + "step 0"; + var num = Math.max(1, 4 - get.distance(player, trigger.player)); + if (trigger.player.countCards("h") < num) { + event._result = { bool: false }; + } else { + trigger.player + .chooseToDiscard( + num, + "弃置" + + get.cnNumber(num) + + "张手牌,或令" + + get.translation(player) + + "对你造成的此伤害+1" + ) + .set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1) { + if (get.type(card) == "basic") { + return 8 - get.value(card); + } else { + return 10 - get.value(card); + } + } else { + if (num > 2) { + return 0; + } + return 8 - get.value(card); + } + }); + } + ("step 1"); + if (!result.bool) { + trigger.num++; + } + }, + }, + // 界朱桓 + xinpingkou: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.getHistory("skipped").length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget( + [1, player.getHistory("skipped").length], + get.prompt2("xinpingkou"), + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("xinpingkou", result.targets); + event.targets = result.targets.slice(0).sortBySeat(); + } else { + event.finish(); + } + ("step 2"); + if (event.targets && event.targets.length) { + event.targets.shift().damage(); + event.redo(); + } + ("step 3"); + var card = get.cardPile2((card) => get.type(card, false) == "equip"); + if (card) player.gain(card, "gain2"); + }, + ai: { + combo: "fenli", + effect: { + target: function (card) { + if (card.name == "lebu" || card.name == "bingliang") return 0.5; + }, + }, + }, + }, + // 彭羕 + spdaming: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + global: "spdaming_give", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + change: function (player, num) { + if (!player.storage.spdaming) player.storage.spdaming = 0; + if (!num) return; + player.storage.spdaming += num; + player.markSkill("spdaming"); + game.log( + player, + (num > 0 ? "获得了" : "减少了") + get.cnNumber(Math.abs(num)) + "点“达命”值" + ); + }, + content: function () { + lib.skill.spdaming.change(player, 1); + }, + intro: { + name: "达命值", + markcount: function (storage, player) { + return (storage || 0).toString(); + }, + content: "当前有#点“达命”值", + }, + subSkill: { + used: { charlotte: true }, + give: { + audio: 2, + enable: "phaseUse", + nopop: true, + filter: function (event, player) { + if (!player.countCards("he")) return false; + return game.hasPlayer((current) => { + return ( + current != player && + current.hasSkill("spdaming") && + !current.hasSkill("spdaming_used") + ); }); }, - content:function(){ - player.draw(5); + selectCard: 1, + filterCard: true, + filterTarget: function (card, player, target) { + return target.hasSkill("spdaming") && !target.hasSkill("spdaming_used"); }, - mod:{ - aiOrder:function(player,card,num){ - var evt=_status.event.getParent('phaseUse'); - if(!evt||evt.player!=player) return; - if(player.hasHistory('useCard',evtx=>{ - return evtx.getParent('phaseUse')==evt&&['basic','trick'].includes(get.type(evtx.card)); - })) return; - if(get.tag(card,'damage')||get.type(card)=='equip') return num+10; - }, - globalFrom:function(from,to,distance){ - return distance-from.countMark('sbbenxi_effect2'); + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer((current) => { + return ( + current != player && + current.hasSkill("spdaming") && + !current.hasSkill("spdaming_used") + ); + }); + return targets.length > 1 ? 1 : -1; + }, + complexSelect: true, + prompt: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return ( + current != player && + current.hasSkill("spdaming") && + !current.hasSkill("spdaming_used") + ); + }); + return ( + "将一张牌交给" + + get.translation(targets) + + (targets.length > 1 ? "中的一人" : "") + ); + }, + position: "he", + discard: false, + lose: false, + delay: false, + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer((current) => { + return ( + lib.skill.spdaming_give.filterTarget(null, player, current) && + get.attitude(player, current) > 0 + ); + }) + ) { + return 6 + Math.random() - get.value(card) / 15; + } + return 0; + }, + content: function () { + "step 0"; + game.trySkillAudio("spdaming", target); + player.give(cards, target); + if (!game.hasPlayer((current) => current != player && current != target)) + event.finish(); + target.addTempSkill("spdaming_used", "phaseUseAfter"); + ("step 1"); + var type = get.type(cards[0], "trick", target); + event.cardtype = type; + var str = get.translation(type), + user = get.translation(player); + target + .chooseTarget( + "达命:选择另一名其他角色", + "若该角色有" + + str + + "牌,其将一张该类型的牌交给" + + user + + ",你获得1点“达命”值;否则你将" + + get.translation(cards) + + "交给" + + user, + (card, player, target) => { + return target != player && target != _status.event.getParent().player; + } + ) + .set("ai", (target) => 1 - get.attitude(_status.event.player, target)); + ("step 2"); + if (result.bool) { + var targetx = result.targets[0], + type = event.cardtype; + target.line(targetx); + event.targetx = targetx; + if (targetx.countCards("he", { type: type }) > 0) { + targetx + .chooseCard( + "交给" + + get.translation(player) + + "一张" + + get.translation(type) + + "牌", + "he", + true, + (card) => { + return get.type(card) == _status.event.getParent().cardtype; + } + ) + .set("ai", (card) => 10 - get.value(card)); + } else { + var cards = cards.filter((i) => get.owner(i) == target); + if (cards.length) target.give(cards, player); + event.finish(); + } + } else event.finish(); + ("step 3"); + if (result.bool) { + event.targetx.give(result.cards, player); + event.targetx.line(player); + lib.skill.spdaming.change(target, 1); + game.delayx(); } }, - marktext:'奔', - intro:{ - content:function(storage,player){ - var str='于此阶段至其他角色的距离-'+storage; - if(player.hasSkill('sbbenxi_effect')) str+=';使用下一张基本牌或普通锦囊牌选择目标后,可以增加'+get.cnNumber(storage)+'个目标'; - return str; + ai: { + expose: 0.2, + order: 10, + result: { target: 1 }, + }, + }, + }, + }, + spxiaoni: { + audio: 2, + enable: "phaseUse", + usable: 1, + locked: false, + filter: function (event, player) { + return (player.storage.spdaming || 0) > 0; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (name == "sha") { + list.push(["基本", "", "sha"]); + for (var i of lib.inpile_nature) list.push(["基本", "", "sha", i]); + } + if (!get.tag({ name: name }, "damage")) continue; + if (get.type2(name) == "trick") list.push(["锦囊", "", name]); + } + return ui.create.dialog("嚣逆", [list, "vcard"]); + }, + filter: function (button, player) { + return lib.filter.filterCard( + { name: button.link[2] }, + player, + _status.event.getParent() + ); + }, + check: function (button) { + var player = _status.event.player; + if (player.countCards("hs", button.link[2]) > 0) return 0; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + filterCard: true, + audio: "spxiaoni", + selectCard: 1, + popname: true, + check: function (card) { + return 6 - get.value(card); + }, + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + onuse: function (result, player) { + lib.skill.spdaming.change(player, -result.targets.length); + }, + }; + }, + prompt: function (links, player) { + return ( + "将一张牌当" + + (get.translation(links[0][3]) || "") + + "【" + + get.translation(links[0][2]) + + "】使用" + ); + }, + }, + mod: { + maxHandcardBase: function (player, num) { + return Math.min(Math.max(0, player.storage.spdaming || 0), player.hp); + }, + }, + ai: { + order: 4, + result: { + player: 1, + }, + threaten: 1.4, + combo: "spdaming", + }, + subSkill: { + backup: {}, + }, + }, + // 灭霸 + zhujian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("e") > 0; + }, + selectTarget: [2, Infinity], + multiline: true, + multitarget: true, + filter: function (event, player) { + return game.countPlayer((current) => current.countCards("e") > 0) >= 2; + }, + content: function () { + game.asyncDraw(targets); + }, + ai: { + order: 8, + result: { target: 1 }, + }, + }, + duansuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.isLinked(); + }, + selectTarget: [1, Infinity], + multiline: true, + multitarget: true, + filter: function (event, player) { + return game.countPlayer((current) => current.isLinked()); + }, + content: function () { + "step 0"; + event.targets = targets.sortBySeat(); + for (var i of event.targets) { + i.link(false); + } + ("step 1"); + for (var i of targets) { + i.damage("fire"); + } + }, + ai: { + order: 2, + result: { target: -1 }, + }, + }, + // 界朱治 + sbanguo: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + direct: true, + group: ["sbanguo_move", "sbanguo_damage", "sbanguo_dying"], + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); + }, + content: function () { + "step 0"; + player.chooseTarget("安国:令一名其他角色获得“安国”标记", lib.filter.notMe, true); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbanguo", target); + target.addMark("sbanguo_mark", 1, false); + target.addAdditionalSkill("sbanguo_" + player.playerid, "sbanguo_mark"); + target.addMark("sbanguo_marked", 1, false); + } + }, + subSkill: { + mark: { + onremove: true, + marktext: "安", + charlotte: true, + intro: { + name: "安国", + name2: "安国", + content: "已拥有“安国”标记", + }, + mod: { + maxHandcardBase: function (player, num) { + return player.maxHp; + }, + }, + }, + move: { + audio: "sbanguo", + direct: true, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ( + game.hasPlayer((current) => current.hasSkill("sbanguo_mark")) && + game.hasPlayer( + (current) => !current.hasMark("sbanguo_marked") && current != player + ) + ); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => current.hasSkill("sbanguo_mark")); + var prompt2 = + targets.length == 1 + ? "将" + + get.translation(targets[0]) + + "的“安国”交给一名未获得过“安国”的其他角色" + : "选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色"; + player + .chooseTarget( + get.prompt("sbanguo"), + prompt2, + targets.length == 1 ? 1 : 2, + (card, player, target) => { + if ( + ui.selected.targets.length == 0 && + _status.event.targets.length > 1 + ) + return target.hasSkill("sbanguo_mark"); + return !target.hasMark("sbanguo_marked") && target != player; + } + ) + .set("ai", (target) => { + var player = _status.event.player; + if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) + return -get.attitude(player, target); + return ( + get.attitude(player, _status.event.targets[0]) < + get.attitude(player, target) + ); + }) + .set("targets", targets); + ("step 1"); + if (result.bool) { + var targets = result.targets; + if (targets.length == 1) { + var target1 = game.filterPlayer((current) => + current.hasSkill("sbanguo_mark") + )[0]; + var target2 = targets[0]; + } else { + var target1 = targets[0]; + var target2 = targets[1]; + } + player.logSkill("sbanguo_move", target2, false); + player.line2([target1, target2], "green"); + var map = target1.additionalSkills; + for (var key in map) { + if (key.indexOf("sbanguo_") != 0) continue; + var id = parseInt(key.slice(8)); + target1.removeAdditionalSkill("sbanguo_" + id); + target2.addMark("sbanguo_mark", 1, false); + target2.addAdditionalSkill("sbanguo_" + id, "sbanguo_mark"); + target2.addMark("sbanguo_marked", 1, false); + } } }, }, - effect3:{ - forced:true, - charlotte:true, - popup:false, - onremove:true, + damage: { + audio: "sbanguo", + forced: true, + locked: false, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + if (!game.hasPlayer((current) => current.hasSkill("sbanguo_mark"))) return false; + if (event.source && event.source.isIn() && event.source.hasSkill("sbanguo_mark")) + return false; + return event.num >= player.hp; + }, + content: function () { + trigger.cancel(); + }, + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (!game.hasPlayer((current) => current.hasSkill("sbanguo_mark"))) + return; + if (player.hasSkill("sbanguo_mark")) return; + if (get.tag(card, "damage")) { + if (target.hp <= 1) return [0, 0]; + return 0.5; + } + }, + }, + }, + }, + dying: { + audio: "sbanguo", + forced: true, + locked: false, + trigger: { global: "dying" }, + filter: function (event, player) { + var skills = event.player.additionalSkills["sbanguo_" + player.playerid]; + return skills && skills.length; + }, + logTarget: "player", + content: function () { + "step 0"; + trigger.player.removeAdditionalSkill("sbanguo_" + player.playerid); + var num = 1 - trigger.player.hp; + if (num > 0) trigger.player.recover(num); + ("step 1"); + var hp = player.hp - 1, + maxhp = player.maxHp - 1; + if (hp > 0 && maxhp > 0) { + player + .chooseControl() + .set("prompt", "安国:请选择一项") + .set("choiceList", [ + "失去" + + hp + + "点体力,令" + + get.translation(trigger.player) + + "获得1点护甲", + "减" + + maxhp + + "点体力上限,令" + + get.translation(trigger.player) + + "获得1点护甲", + ]) + .set("ai", () => "选项一"); + } else if (hp > 0) event._result = { control: "选项一" }; + else if (maxhp > 0) event._result = { control: "选项二" }; + else event.finish(); + ("step 2"); + if (result.control == "选项一") { + var num = player.hp - 1; + if (num > 0) player.loseHp(num); + } else { + var num = player.maxHp - 1; + if (num > 0) player.loseMaxHp(num); + } + trigger.player.changeHujia(1, null, true); + }, + }, + }, + }, + // 界吴懿 + sbbenxi: { + audio: 3, + trigger: { + player: "phaseUseBegin", + }, + filter: function (event, player) { + return player.countDiscardableCards(player, "he") > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("sbbenxi"), [1, Infinity], "he") + .set("logSkill", "sbbenxi") + .set("ai", (card) => { + var player = _status.event.player; + if (ui.selected.cards.length < _status.event.num) + return 100 - (get.useful(card, player) + player.getUseValue(card) / 3); + return 0; + }) + .set( + "num", + (function () { + var count = 0; + var list = [], + list2 = []; + var targets = game.filterPlayer( + (current) => get.distance(player, current) >= 1 + ); + var cards = player.getCards("hs", (card) => { + return ( + player.hasUseTarget(card, false) && + ["basic", "trick"].includes(get.type(card, false, player)) && + get.info(card).allowMultiple != false + ); + }); + var cards2 = player + .getCards("he") + .filter((i) => lib.filter.cardDiscardable(i, player, "sbbenxi")) + .sort((a, b) => { + return ( + get.useful(a, player) + + player.getUseValue(a) / 3 - + (get.useful(b, player) + player.getUseValue(b) / 3) + ); + }); + for (var i = 0; i < cards2.length; i++) { + count = 0; + list = []; + for (var card of cards) { + var num = i + 1; + if (cards2.slice(0, num).includes(card)) continue; + if (get.tag(card, "damage") && i > 0) + count += get.effect(player, { name: "draw" }, player); + var targets2 = targets.filter((current) => { + return ( + player.canUse(card, current, false) && + get.distance(player, current) <= num && + get.effect(current, card, player, player) > 0 + ); + }); + targets2 = targets2 + .map((target) => get.effect(target, card, player, player)) + .sort((a, b) => b - a); + targets2.slice(0, num).forEach((eff) => (count += eff)); + list.push(count - 1.2 * get.value(cards2[i])); + } + var val = list.sort((a, b) => b - a)[0]; + if (!isNaN(val)) list2.push([val, i]); + } + list2 = list2.filter((i) => i[0] > 0); + if (!list2.length) return 0; + return list2.sort((a, b) => b[0] - a[0])[0][1]; + })() + ); + ("step 1"); + if (result.bool) { + var num = result.cards.length; + player.addTempSkill("sbbenxi_effect", "phaseUseAfter"); + player.addTempSkill("sbbenxi_effect2", "phaseUseAfter"); + player.addMark("sbbenxi_effect2", num, false); } }, + subSkill: { + effect: { + audio: "sbbenxi", + trigger: { player: "useCard2" }, + forced: true, + charlotte: true, + direct: true, + onremove: true, + filter: function (event, player) { + var type = get.type(event.card, false); + return type == "basic" || type == "trick"; + }, + content: function () { + "step 0"; + var num = player.countMark("sbbenxi_effect2"); + player.removeSkill("sbbenxi_effect"); + player.addTempSkill("sbbenxi_effect3", "phaseUseAfter"); + player.markAuto("sbbenxi_effect3", [trigger.card]); + var filter = function (event, player) { + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) && + get.distance(player, current) == 1 + ); + }) + ) { + return true; + } + } + return false; + }; + if (!filter(trigger, player)) event.finish(); + else { + var prompt = + "为" + + get.translation(trigger.card) + + "增加至多" + + get.cnNumber(num) + + "个距离为1的目标?"; + trigger.player + .chooseTarget( + get.prompt("sbbenxi_effect"), + prompt, + [1, num], + function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2( + _status.event.card, + player, + target + ) && + get.distance(player, target) == 1 + ); + } + ) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + } + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + ("step 2"); + player.logSkill("sbbenxi_effect", result.targets); + game.log(result.targets, "也成为了", trigger.card, "的目标"); + trigger.targets.addArray(result.targets); + }, + ai: { + effect: { + target: function (card, player, target) { + if (player.canUse(card, target) && get.distance(player, target) != 1) + return 1.2; + }, + }, + }, + }, + effect2: { + audio: "sbbenxi", + trigger: { + global: "useCardAfter", + }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + player.getStorage("sbbenxi_effect3").includes(event.card) && + game.hasPlayer2((current) => { + return current.hasHistory("damage", (evt) => { + return event.card == evt.card; + }); + }) + ); + }, + content: function () { + player.draw(5); + }, + mod: { + aiOrder: function (player, card, num) { + var evt = _status.event.getParent("phaseUse"); + if (!evt || evt.player != player) return; + if ( + player.hasHistory("useCard", (evtx) => { + return ( + evtx.getParent("phaseUse") == evt && + ["basic", "trick"].includes(get.type(evtx.card)) + ); + }) + ) + return; + if (get.tag(card, "damage") || get.type(card) == "equip") return num + 10; + }, + globalFrom: function (from, to, distance) { + return distance - from.countMark("sbbenxi_effect2"); + }, + }, + marktext: "奔", + intro: { + content: function (storage, player) { + var str = "于此阶段至其他角色的距离-" + storage; + if (player.hasSkill("sbbenxi_effect")) + str += + ";使用下一张基本牌或普通锦囊牌选择目标后,可以增加" + + get.cnNumber(storage) + + "个目标"; + return str; + }, + }, + }, + effect3: { + forced: true, + charlotte: true, + popup: false, + onremove: true, + }, + }, }, // 杨阜 - jiebing:{ - audio:2, - trigger:{ - player:'damageEnd', + jiebing: { + audio: 2, + trigger: { + player: "damageEnd", }, - direct:true, - forced:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current!=event.source&¤t!=player&¤t.countGainableCards(player,'he'); + direct: true, + forced: true, + filter: function (event, player) { + return game.hasPlayer((current) => { + return ( + current != event.source && + current != player && + current.countGainableCards(player, "he") + ); }); }, - content:function(){ - 'step 0' - player.chooseTarget('借兵:选择一名其他角色',get.skillInfoTranslation('jiebing'),true,(card,player,target)=>{ - return player!=target&&target!=_status.event.getTrigger().source&&target.countGainableCards(player,'he'); - }).set('ai',target=>get.effect(target,{name:'shunshou_copy2'},player,player) /** (target.countCards('he')>1?1.5:1)*/); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jiebing',target); - if(target.ai.shown>0) player.addExpose(0.15); - var cards=target.getGainableCards(player,'he').randomGets(1); - event.cards=cards; - player.gain(target,cards,'give','bySelf'); - player.showCards(cards,'借兵'); + content: function () { + "step 0"; + player + .chooseTarget( + "借兵:选择一名其他角色", + get.skillInfoTranslation("jiebing"), + true, + (card, player, target) => { + return ( + player != target && + target != _status.event.getTrigger().source && + target.countGainableCards(player, "he") + ); + } + ) + .set( + "ai", + (target) => + get.effect( + target, + { name: "shunshou_copy2" }, + player, + player + ) /** (target.countCards('he')>1?1.5:1)*/ + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jiebing", target); + if (target.ai.shown > 0) player.addExpose(0.15); + var cards = target.getGainableCards(player, "he").randomGets(1); + event.cards = cards; + player.gain(target, cards, "give", "bySelf"); + player.showCards(cards, "借兵"); } else event.finish(); - 'step 2' - for(var card of cards){ - if(get.type(card)=='equip'&&player.hasUseTarget(card)&&get.owner(card)==player){ - player.chooseUseTarget(card,true); + ("step 2"); + for (var card of cards) { + if ( + get.type(card) == "equip" && + player.hasUseTarget(card) && + get.owner(card) == player + ) { + player.chooseUseTarget(card, true); } } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(player!=target&&!player.getFriends().length) return; - if(game.hasPlayer(current=>{ - return current!=player&&get.attitude(player,current)>0&¤t.countGainableCards(target,'he')>0; - })) return [1,1]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (player != target && !player.getFriends().length) return; + if ( + game.hasPlayer((current) => { + return ( + current != player && + get.attitude(player, current) > 0 && + current.countGainableCards(target, "he") > 0 + ); + }) + ) + return [1, 1]; } }, }, }, }, - hannan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return !player.hasSkillTag('noCompareSource'); + hannan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkillTag("noCompareSource"); }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return player.canCompare(target); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(!result.tie){ - var players=[player,target]; - if(result.bool) players.reverse(); - players[1].line(players[0],'thunder'); - players[0].damage(players[1],2); + ("step 1"); + if (!result.tie) { + var players = [player, target]; + if (result.bool) players.reverse(); + players[1].line(players[0], "thunder"); + players[0].damage(players[1], 2); } }, - ai:{ - order:7, - result:{ - target:function(player,target){ - var hs=player.getCards('h').sort(function(a,b){ - return get.number(b)-get.number(a); + ai: { + order: 7, + result: { + target: function (player, target) { + var hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); }); - var ts=target.getCards('h').sort(function(a,b){ - return get.number(b)-get.number(a); + var ts = target.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); }); - if(!hs.length||!ts.length) return 0; - if(get.number(hs[0])>get.number(ts[0])||get.number(hs[0])-ts.length>=(9+Math.min(2,player.hp/2))) return get.sgnAttitude(player,target)*get.damageEffect(target,player,player); + if (!hs.length || !ts.length) return 0; + if ( + get.number(hs[0]) > get.number(ts[0]) || + get.number(hs[0]) - ts.length >= 9 + Math.min(2, player.hp / 2) + ) + return ( + get.sgnAttitude(player, target) * get.damageEffect(target, player, player) + ); return 0; }, }, }, }, // 曹嵩 - yijin:{ - audio:3, - trigger:{player:'phaseUseBegin'}, - forced:true, - direct:true, - group:['yijin_upstart','yijin_die'], - filter:function(event,player){ - if(!game.hasPlayer(current=>current!=player && !lib.skill.yijin.getKane(current).length)) return false; + yijin: { + audio: 3, + trigger: { player: "phaseUseBegin" }, + forced: true, + direct: true, + group: ["yijin_upstart", "yijin_die"], + filter: function (event, player) { + if ( + !game.hasPlayer( + (current) => current != player && !lib.skill.yijin.getKane(current).length + ) + ) + return false; return lib.skill.yijin.getKane(player).length; }, - getKane:function(player){ - var list=lib.skill.yijin.derivation; - return list.filter(mark=>player.hasMark(mark)); + getKane: function (player) { + var list = lib.skill.yijin.derivation; + return list.filter((mark) => player.hasMark(mark)); }, - derivation:['yijin_wushi','yijin_jinmi','yijin_guxiong','yijin_tongshen','yijin_yongbi','yijin_houren'], - getValue:function(player,mark,target){ - let dis=Math.sqrt(get.distance(player,target,'absolute')); - if(target.isTurnedOver()) dis++; - let draw=get.effect(target,{name:'draw'},target,target); - switch(mark.slice(6)){ - case 'wushi': - if(target.hasJudge('bingliang')) return 12/(1+target.getCardUsable('sha',true)); - return 5*draw/dis+12/(1+target.getCardUsable('sha',true)); - case 'jinmi': - if(target.hasJudge('lebu')&&!target.hasCard({name:'wuxie'},'hs')) return draw*target.needsToDiscard(2.2)/dis; - return get.effect(target,{name:'lebu'},player,target)+draw*target.needsToDiscard(2.2)/dis; - case 'guxiong': - if(target.hasJudge('lebu')) return -draw*target.needsToDiscard(3)/dis; - return get.effect(target,{name:'losehp'},target,target)*2/dis-draw*target.needsToDiscard(3)/dis; - case 'tongshen': - if(target.isMin()) return 0; - var eff=-get.damageEffect(target,player,target); - if(eff<=0) return 0; - if(target.hp<2) return eff*dis*2; - if(target.hp<3&&target.countCards('he')<3) return eff*dis*1.5; - if(target.hp>3) return eff*dis/target.hp; - return eff*dis; - case 'yongbi': - if(target.hasJudge('bingliang')&&!target.hasCard({name:'wuxie'},'hs')) return 0; - return get.effect(target,{name:'bingliang'},player,target)*2/dis; - case 'houren': - return Math.min(5,2+target.getDamagedHp())*get.recoverEffect(target,player,target)/dis; + derivation: [ + "yijin_wushi", + "yijin_jinmi", + "yijin_guxiong", + "yijin_tongshen", + "yijin_yongbi", + "yijin_houren", + ], + getValue: function (player, mark, target) { + let dis = Math.sqrt(get.distance(player, target, "absolute")); + if (target.isTurnedOver()) dis++; + let draw = get.effect(target, { name: "draw" }, target, target); + switch (mark.slice(6)) { + case "wushi": + if (target.hasJudge("bingliang")) + return 12 / (1 + target.getCardUsable("sha", true)); + return (5 * draw) / dis + 12 / (1 + target.getCardUsable("sha", true)); + case "jinmi": + if (target.hasJudge("lebu") && !target.hasCard({ name: "wuxie" }, "hs")) + return (draw * target.needsToDiscard(2.2)) / dis; + return ( + get.effect(target, { name: "lebu" }, player, target) + + (draw * target.needsToDiscard(2.2)) / dis + ); + case "guxiong": + if (target.hasJudge("lebu")) return (-draw * target.needsToDiscard(3)) / dis; + return ( + (get.effect(target, { name: "losehp" }, target, target) * 2) / dis - + (draw * target.needsToDiscard(3)) / dis + ); + case "tongshen": + if (target.isMin()) return 0; + var eff = -get.damageEffect(target, player, target); + if (eff <= 0) return 0; + if (target.hp < 2) return eff * dis * 2; + if (target.hp < 3 && target.countCards("he") < 3) return eff * dis * 1.5; + if (target.hp > 3) return (eff * dis) / target.hp; + return eff * dis; + case "yongbi": + if (target.hasJudge("bingliang") && !target.hasCard({ name: "wuxie" }, "hs")) + return 0; + return (get.effect(target, { name: "bingliang" }, player, target) * 2) / dis; + case "houren": + return ( + (Math.min(5, 2 + target.getDamagedHp()) * + get.recoverEffect(target, player, target)) / + dis + ); } }, - content:function(){ - 'step 0' - player.chooseTarget('亿金:令一名其他角色获得1枚“金”',true,(card,player,target)=>{ - return player!=target&&!lib.skill.yijin.getKane(target).length; - }).set('ai',target=>{ - let player=_status.event.player,att=get.attitude(player,target),kane=lib.skill.yijin.getKane(player); - if(Math.abs(att)>1) att=Math.sign(att)*Math.sqrt(Math.abs(att)); - return Math.max.apply(Math.max,kane.map(i=>{ - return att*lib.skill.yijin.getValue(player,i,target); - })); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('yijin',target); - var kane=lib.skill.yijin.getKane(player); - var choiceList=kane.map(i=>{ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    ' + - '
    '+get.skillInfoTranslation(i,player)+'
    '; + content: function () { + "step 0"; + player + .chooseTarget("亿金:令一名其他角色获得1枚“金”", true, (card, player, target) => { + return player != target && !lib.skill.yijin.getKane(target).length; + }) + .set("ai", (target) => { + let player = _status.event.player, + att = get.attitude(player, target), + kane = lib.skill.yijin.getKane(player); + if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); + return Math.max.apply( + Math.max, + kane.map((i) => { + return att * lib.skill.yijin.getValue(player, i, target); + }) + ); }); - player.chooseControl(kane).set('choiceList',choiceList).set('displayIndex',false).set('prompt','选择令'+get.translation(target)+'获得的“金”').set('ai',()=>{ - let controls=_status.event.controls,player=_status.event.player,target=_status.event.getParent().target,att=get.attitude(player,target); - if(Math.abs(att)>1) att=Math.sign(att)*Math.sqrt(Math.abs(att)); - let list=controls.map(i=>{ - return [i,att*lib.skill.yijin.getValue(player,i,target)]; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("yijin", target); + var kane = lib.skill.yijin.getKane(player); + var choiceList = kane.map((i) => { + return ( + '
    【' + + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + + "】
    " + + "
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }); + player + .chooseControl(kane) + .set("choiceList", choiceList) + .set("displayIndex", false) + .set("prompt", "选择令" + get.translation(target) + "获得的“金”") + .set("ai", () => { + let controls = _status.event.controls, + player = _status.event.player, + target = _status.event.getParent().target, + att = get.attitude(player, target); + if (Math.abs(att) > 1) att = Math.sign(att) * Math.sqrt(Math.abs(att)); + let list = controls.map((i) => { + return [i, att * lib.skill.yijin.getValue(player, i, target)]; + }); + list.sort((a, b) => b[1] - a[1]); + if (list.length) return list[0][0]; + return controls.randomGet(); }); - list.sort((a,b)=>b[1]-a[1]); - if(list.length) return list[0][0]; - return controls.randomGet(); - }); } else event.finish(); - 'step 2' - var kane=result.control; - player.removeMark(kane,1); - player.popup(kane,'metal'); - player.addSkill('yijin_clear'); - target.addMark(kane,1); - target.addAdditionalSkill('yijin_'+player.playerid,kane); + ("step 2"); + var kane = result.control; + player.removeMark(kane, 1); + player.popup(kane, "metal"); + player.addSkill("yijin_clear"); + target.addMark(kane, 1); + target.addAdditionalSkill("yijin_" + player.playerid, kane); game.delayx(); }, - subSkill:{ - mark:{ - mark:true, - marktext:'金', - intro:{ - name:'金(膴仕)', - name2:'金(膴仕)', - markcount:function(storage,player){ + subSkill: { + mark: { + mark: true, + marktext: "金", + intro: { + name: "金(膴仕)", + name2: "金(膴仕)", + markcount: function (storage, player) { return lib.skill.yijin.getKane(player).length; }, - content:function(storage,player){ - return '剩余金:'+get.translation(lib.skill.yijin.getKane(player)); + content: function (storage, player) { + return "剩余金:" + get.translation(lib.skill.yijin.getKane(player)); }, }, }, - upstart:{ - audio:'yijin', - trigger:{ - global:'phaseBefore', - player:'enterGame', + upstart: { + audio: "yijin", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - var kane=lib.skill.yijin.derivation; - for(var mark of kane){ - player.addMark(mark,1,false); + content: function () { + var kane = lib.skill.yijin.derivation; + for (var mark of kane) { + player.addMark(mark, 1, false); player.unmarkSkill(mark); } - player.addSkill('yijin_mark'); - } + player.addSkill("yijin_mark"); + }, }, - die:{ - audio:'yijin', - trigger:{player:'phaseBegin'}, - forced:true, - check:()=>false, - filter:function(event,player){ + die: { + audio: "yijin", + trigger: { player: "phaseBegin" }, + forced: true, + check: () => false, + filter: function (event, player) { return !lib.skill.yijin.getKane(player).length; }, - content:function(){ + content: function () { player.die(); - } + }, }, - clear:{ - trigger:{ - global:'phaseAfter', - player:'die', + clear: { + trigger: { + global: "phaseAfter", + player: "die", }, - charlotte:true, - forced:true, - popup:false, - forceDie:true, - filter:function(event,player){ - if(event.name=='die') return true; - return lib.skill.yijin.getKane(event.player).length&&event.player.additionalSkills['yijin_'+player.playerid]; + charlotte: true, + forced: true, + popup: false, + forceDie: true, + filter: function (event, player) { + if (event.name == "die") return true; + return ( + lib.skill.yijin.getKane(event.player).length && + event.player.additionalSkills["yijin_" + player.playerid] + ); }, - content:function(){ - 'step 0' - if(trigger.name=='die'){ - game.countPlayer(current=>{ - var skills=current.additionalSkills['yijin_'+player.playerid]; - if(skills&&skills.length){ - current.removeAdditionalSkill('yijin_'+player.playerid); - for(var i of skills){ + content: function () { + "step 0"; + if (trigger.name == "die") { + game.countPlayer((current) => { + var skills = current.additionalSkills["yijin_" + player.playerid]; + if (skills && skills.length) { + current.removeAdditionalSkill("yijin_" + player.playerid); + for (var i of skills) { trigger.player.removeSkill(i); } } }); event.finish(); return; + } else { + const skills = trigger.player.additionalSkills["yijin_" + player.playerid]; + for (const mark of skills) trigger.player.removeMark(mark, 1); } - else { - const skills=trigger.player.additionalSkills['yijin_'+player.playerid]; - for(const mark of skills) trigger.player.removeMark(mark,1); - } - 'step 1' - trigger.player.removeAdditionalSkill('yijin_'+player.playerid); + ("step 1"); + trigger.player.removeAdditionalSkill("yijin_" + player.playerid); }, }, - wushi:{ - charlotte:true, - forced:true, - trigger:{player:'phaseDrawBegin2'}, - content:function(){ - trigger.num+=4; + wushi: { + charlotte: true, + forced: true, + trigger: { player: "phaseDrawBegin2" }, + content: function () { + trigger.num += 4; }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, - marktext:'金', - intro:{ - name:'金(膴仕)', - name2:'金(膴仕)', - content:'摸牌阶段多摸四张牌;使用【杀】的次数上限+1', + marktext: "金", + intro: { + name: "金(膴仕)", + name2: "金(膴仕)", + content: "摸牌阶段多摸四张牌;使用【杀】的次数上限+1", }, }, - jinmi:{ - charlotte:true, - forced:true, - trigger:{player:'phaseBegin'}, - content:function(){ - player.skip('phaseUse'); - player.skip('phaseDiscard'); + jinmi: { + charlotte: true, + forced: true, + trigger: { player: "phaseBegin" }, + content: function () { + player.skip("phaseUse"); + player.skip("phaseDiscard"); }, - marktext:'金', - intro:{ - name:'金(金迷)', - name2:'金(金迷)', - content:'回合开始时,跳过下一个出牌阶段和弃牌阶段', + marktext: "金", + intro: { + name: "金(金迷)", + name2: "金(金迷)", + content: "回合开始时,跳过下一个出牌阶段和弃牌阶段", }, }, - guxiong:{ - charlotte:true, - forced:true, - trigger:{player:'phaseUseBegin'}, - content:function(){ + guxiong: { + charlotte: true, + forced: true, + trigger: { player: "phaseUseBegin" }, + content: function () { player.loseHp(); }, - mod:{ - maxHandcard:function(player,num){ - return num-3; - } - }, - marktext:'金', - intro:{ - name:'金(贾凶)', - name2:'金(贾凶)', - content:'出牌阶段开始时,失去1点体力;手牌上限-3', - }, - }, - tongshen:{ - charlotte:true, - forced:true, - trigger:{player:'damageBegin4'}, - filter:function(event){ - return !event.hasNature('thunder'); - }, - content:function(){ - trigger.cancel(); - }, - ai:{ - nofire:true, - nodamage:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return [0,0]; - } + mod: { + maxHandcard: function (player, num) { + return num - 3; }, }, - marktext:'金', - intro:{ - name:'金(通神)', - name2:'金(通神)', - content:'当你受到非雷电伤害时,防止之', + marktext: "金", + intro: { + name: "金(贾凶)", + name2: "金(贾凶)", + content: "出牌阶段开始时,失去1点体力;手牌上限-3", }, }, - yongbi:{ - charlotte:true, - forced:true, - trigger:{player:'phaseZhunbeiBegin'}, - content:function(){ - player.skip('phaseDraw'); + tongshen: { + charlotte: true, + forced: true, + trigger: { player: "damageBegin4" }, + filter: function (event) { + return !event.hasNature("thunder"); }, - marktext:'金', - intro:{ - name:'金(拥蔽)', - name2:'金(拥蔽)', - content:'准备阶段,跳过下一个摸牌阶段', + content: function () { + trigger.cancel(); + }, + ai: { + nofire: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && !get.tag(card, "thunderDamage")) + return [0, 0]; + }, + }, + }, + marktext: "金", + intro: { + name: "金(通神)", + name2: "金(通神)", + content: "当你受到非雷电伤害时,防止之", }, }, - houren:{ - charlotte:true, - forced:true, - trigger:{player:'phaseEnd'}, - content:function(){ + yongbi: { + charlotte: true, + forced: true, + trigger: { player: "phaseZhunbeiBegin" }, + content: function () { + player.skip("phaseDraw"); + }, + marktext: "金", + intro: { + name: "金(拥蔽)", + name2: "金(拥蔽)", + content: "准备阶段,跳过下一个摸牌阶段", + }, + }, + houren: { + charlotte: true, + forced: true, + trigger: { player: "phaseEnd" }, + content: function () { player.recover(3); }, - marktext:'金', - intro:{ - name:'金(厚任)', - name2:'金(厚任)', - content:'回合结束时,回复3点体力', + marktext: "金", + intro: { + name: "金(厚任)", + name2: "金(厚任)", + content: "回合结束时,回复3点体力", }, - } - } - }, - guanzong:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.countPlayer(current=>current!=player)>=2; - }, - filterTarget:lib.filter.notMe, - selectTarget:2, - multitarget:true, - targetprompt:['伤害来源','受伤角色'], - content:function(){ - targets[1].damage(targets[0],'unreal'); - }, - ai:{ - result:{ - target:function(player,target){ - if(game.countPlayer(i=>i!=player)<2) return 0; - var list=game.filterPlayer(current=>current!=player).map(current=>{ - var _hp=current.hp,_maxhp=current.maxHp; - current.hp=10; current.maxHp=10; - var att=-get.sgnAttitude(player,current); - var val=get.damageEffect(current,player,current)*att; - current.getSkills(null,false,false).forEach(skill=>{ - var info=get.info(skill); - if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att); - }); - var eff=100/val+15; - current.hp=_hp; current.maxHp=_maxhp; - return [current,eff]; - }).sort((a,b)=>b[1]-a[1])[0]; - if(list[1]<0) return 0; - var targetx=list[0],sign=get.sgnAttitude(player,target); - if(ui.selected.targets.length) return target==targetx?sign:0; - return sign*(game.filterPlayer(current=>{ - return current!=player&¤t!=targetx; - }).map(current=>{ - var _hp=targetx.hp,_maxhp=targetx.maxHp; - targetx.hp=10; targetx.maxHp=10; - var eff=-get.damageEffect(targetx,current,current); - targetx.hp=_hp; targetx.maxHp=_maxhp; - return [current,eff]; - }).sort((a,b)=>b[1]-a[1])[0][0]==target?10:1); - } }, - order:9.5, - expose:0.2 - } + }, + }, + guanzong: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.countPlayer((current) => current != player) >= 2; + }, + filterTarget: lib.filter.notMe, + selectTarget: 2, + multitarget: true, + targetprompt: ["伤害来源", "受伤角色"], + content: function () { + targets[1].damage(targets[0], "unreal"); + }, + ai: { + result: { + target: function (player, target) { + if (game.countPlayer((i) => i != player) < 2) return 0; + var list = game + .filterPlayer((current) => current != player) + .map((current) => { + var _hp = current.hp, + _maxhp = current.maxHp; + current.hp = 10; + current.maxHp = 10; + var att = -get.sgnAttitude(player, current); + var val = get.damageEffect(current, player, current) * att; + current.getSkills(null, false, false).forEach((skill) => { + var info = get.info(skill); + if ( + info && + info.ai && + (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend) + ) + val = Math[val > 0 ? "max" : "min"]( + val > 0 ? 0.1 : -0.1, + val + 2 * att + ); + }); + var eff = 100 / val + 15; + current.hp = _hp; + current.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0]; + if (list[1] < 0) return 0; + var targetx = list[0], + sign = get.sgnAttitude(player, target); + if (ui.selected.targets.length) return target == targetx ? sign : 0; + return ( + sign * + (game + .filterPlayer((current) => { + return current != player && current != targetx; + }) + .map((current) => { + var _hp = targetx.hp, + _maxhp = targetx.maxHp; + targetx.hp = 10; + targetx.maxHp = 10; + var eff = -get.damageEffect(targetx, current, current); + targetx.hp = _hp; + targetx.maxHp = _maxhp; + return [current, eff]; + }) + .sort((a, b) => b[1] - a[1])[0][0] == target + ? 10 + : 1) + ); + }, + }, + order: 9.5, + expose: 0.2, + }, }, //马日磾 - chengye:{ - audio:3, - liujing_filter:[ - function(card){ - return get.type(card,false)=='trick'&&get.tag(card,'damage',null,false)>0; + chengye: { + audio: 3, + liujing_filter: [ + function (card) { + return get.type(card, false) == "trick" && get.tag(card, "damage", null, false) > 0; }, - (card)=>get.type(card,false)=='basic', - (card)=>get.name(card,false)=='wuxie', - (card)=>get.name(card,false)=='wuzhong', - (card)=>get.name(card,false)=='lebu', - (card)=>get.type(card,false)=='equip', + (card) => get.type(card, false) == "basic", + (card) => get.name(card, false) == "wuxie", + (card) => get.name(card, false) == "wuzhong", + (card) => get.name(card, false) == "lebu", + (card) => get.type(card, false) == "equip", ], - getLiujing:function(player,index){ - var filter=lib.skill.chengye.liujing_filter[index],expansion=player.getExpansions('chengye'); - for(var i of expansion){ - if(filter(i)) return i; + getLiujing: function (player, index) { + var filter = lib.skill.chengye.liujing_filter[index], + expansion = player.getExpansions("chengye"); + for (var i of expansion) { + if (filter(i)) return i; } return false; }, - trigger:{global:['useCardAfter','loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, - forced:true, - filter:function(event,player){ - if(player==event.player) return false; - if(event.name=='useCard'){ - if(!event.card.isCard) return false; - var cards=event.cards.filterInD(); - if(!cards.length) return false; - } - else if(event.name!='cardsDiscard'){ - var cards=event.getd(null,'cards2').filter(function(card){ - if(get.position(card,true)!='d') return false; - var type=get.type(card,false); - return type=='delay'||type=='equip'; + trigger: { + global: [ + "useCardAfter", + "loseAfter", + "cardsDiscardAfter", + "loseAsyncAfter", + "equipAfter", + ], + }, + forced: true, + filter: function (event, player) { + if (player == event.player) return false; + if (event.name == "useCard") { + if (!event.card.isCard) return false; + var cards = event.cards.filterInD(); + if (!cards.length) return false; + } else if (event.name != "cardsDiscard") { + var cards = event.getd(null, "cards2").filter(function (card) { + if (get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay" || type == "equip"; }); - cards.removeArray(event.getd(player,'cards2')); - if(!cards.length) return false; - } - else{ - var evtx=event.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evt2=(evtx.relatedEvent||evtx.getParent()); - if(evt2.name!='phaseJudge'||evt2.player==player) return; - var cards=event.cards.filter(function(card){ - if(get.position(card,true)!='d') return false; - var type=get.type(card,false); - return type=='delay'; + cards.removeArray(event.getd(player, "cards2")); + if (!cards.length) return false; + } else { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + if (evt2.name != "phaseJudge" || evt2.player == player) return; + var cards = event.cards.filter(function (card) { + if (get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay"; }); - if(!cards.length) return false; + if (!cards.length) return false; } - for(var i=0;i<6;i++){ - if(lib.skill.chengye.getLiujing(player,i)) continue; - for(var j of cards){ - if(lib.skill.chengye.liujing_filter[i](j)) return true; + for (var i = 0; i < 6; i++) { + if (lib.skill.chengye.getLiujing(player, i)) continue; + for (var j of cards) { + if (lib.skill.chengye.liujing_filter[i](j)) return true; } } return false; }, - content:function(){ - var cards,cards2=[]; - if(trigger.name=='useCard'){ - cards=trigger.cards.filterInD(); - } - else if(trigger.name!='cardsDiscard'){ - cards=trigger.getd().filter(function(card){ - if(card.original=='j'||get.position(card,true)!='d') return false; - var type=get.type(card,false); - return type=='delay'||type=='equip'; + content: function () { + var cards, + cards2 = []; + if (trigger.name == "useCard") { + cards = trigger.cards.filterInD(); + } else if (trigger.name != "cardsDiscard") { + cards = trigger.getd().filter(function (card) { + if (card.original == "j" || get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay" || type == "equip"; }); cards.removeArray(trigger.getd(player)); - } - else{ - cards=trigger.cards.filter(function(card){ - if(get.position(card,true)!='d') return false; - var type=get.type(card,false); - return type=='delay'; + } else { + cards = trigger.cards.filter(function (card) { + if (get.position(card, true) != "d") return false; + var type = get.type(card, false); + return type == "delay"; }); } - for(var i=0;i<6;i++){ - if(lib.skill.chengye.getLiujing(player,i)) continue; - for(var j of cards){ - if(lib.skill.chengye.liujing_filter[i](j)){ + for (var i = 0; i < 6; i++) { + if (lib.skill.chengye.getLiujing(player, i)) continue; + for (var j of cards) { + if (lib.skill.chengye.liujing_filter[i](j)) { cards.remove(j); cards2.push(j); break; } } - if(!cards.length) break; + if (!cards.length) break; } - player.addToExpansion(cards2,'gain2').gaintag.add('chengye'); + player.addToExpansion(cards2, "gain2").gaintag.add("chengye"); }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - marktext:'经', - intro:{ - name:'六经', - markcount:'expansion', - content:'expansion', - mark:function(dialog,storage,player){ - var list=['《诗经》','《尚书》','《仪礼》','《易经》','《乐经》','《春秋》']; - var desc=['伤害类锦囊牌','基本牌','无懈可击','无中生有','乐不思蜀','装备牌']; - for(var i=0;i<6;i++){ + marktext: "经", + intro: { + name: "六经", + markcount: "expansion", + content: "expansion", + mark: function (dialog, storage, player) { + var list = ["《诗经》", "《尚书》", "《仪礼》", "《易经》", "《乐经》", "《春秋》"]; + var desc = ["伤害类锦囊牌", "基本牌", "无懈可击", "无中生有", "乐不思蜀", "装备牌"]; + for (var i = 0; i < 6; i++) { dialog.addText(list[i]); - var card=lib.skill.chengye.getLiujing(player,i); - if(!card) dialog.addText('(缺少 '+desc[i]+')'); + var card = lib.skill.chengye.getLiujing(player, i); + if (!card) dialog.addText("(缺少 " + desc[i] + ")"); else dialog.addSmall([card]); } }, }, - group:'chengye_gain', - subSkill:{ - gain:{ - audio:'chengye', - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.getExpansions('chengye').length>=6; + group: "chengye_gain", + subSkill: { + gain: { + audio: "chengye", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.getExpansions("chengye").length >= 6; }, - forced:true, - content:function(){ - player.gain(player.getExpansions('chengye'),'gain2'); + forced: true, + content: function () { + player.gain(player.getExpansions("chengye"), "gain2"); }, }, }, }, - buxu:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - var num=(player.getStat('skill').buxu||0)+1; - return player.countCards('he')>=num&&player.getExpansions('chengye').length<6; + buxu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + var num = (player.getStat("skill").buxu || 0) + 1; + return player.countCards("he") >= num && player.getExpansions("chengye").length < 6; }, - chooseButton:{ - chooseControl:function(event,player){ - var list=['诗经','尚书','仪礼','易经','乐经','春秋']; - var choices=[]; - for(var i=0;i<6;i++){ - if(!lib.skill.chengye.getLiujing(player,i)) choices.push(list[i]); + chooseButton: { + chooseControl: function (event, player) { + var list = ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"]; + var choices = []; + for (var i = 0; i < 6; i++) { + if (!lib.skill.chengye.getLiujing(player, i)) choices.push(list[i]); } - choices.push('cancel2'); + choices.push("cancel2"); return choices; }, - check:function(event,player){ - var list=[4,3,5,0,2,1]; - for(var i of list){ - if(!lib.skill.chengye.getLiujing(player,i)){ - return ['诗经','尚书','仪礼','易经','乐经','春秋'][i]; + check: function (event, player) { + var list = [4, 3, 5, 0, 2, 1]; + for (var i of list) { + if (!lib.skill.chengye.getLiujing(player, i)) { + return ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"][i]; } } - return 'cancel2'; + return "cancel2"; }, - dialog:function(event,player){ - var num=(player.getStat('skill').buxu||0)+1; - return ui.create.dialog('###补叙###弃置'+get.cnNumber(num)+'张牌并补充一张“六经”'); + dialog: function (event, player) { + var num = (player.getStat("skill").buxu || 0) + 1; + return ui.create.dialog( + "###补叙###弃置" + get.cnNumber(num) + "张牌并补充一张“六经”" + ); }, - prompt:function(links,player){ - var num=(player.getStat('skill').buxu||0)+1; - return '弃置'+get.cnNumber(num)+'张牌并补充一张《'+links.control+'》'; + prompt: function (links, player) { + var num = (player.getStat("skill").buxu || 0) + 1; + return "弃置" + get.cnNumber(num) + "张牌并补充一张《" + links.control + "》"; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'buxu', - index:['诗经','尚书','仪礼','易经','乐经','春秋'].indexOf(links.control), - filterCard:true, - position:'he', - selectCard:(player.getStat('skill').buxu||0)+1, - ai1:function(card){ - var player=_status.event.player; - if(player.needsToDiscard(0,(i,player)=>{ - return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); - })) return 10/Math.max(0.1,get.value(card)); - return 5-(player.getStat('skill').buxu||0)-get.value(card); + audio: "buxu", + index: ["诗经", "尚书", "仪礼", "易经", "乐经", "春秋"].indexOf(links.control), + filterCard: true, + position: "he", + selectCard: (player.getStat("skill").buxu || 0) + 1, + ai1: function (card) { + var player = _status.event.player; + if ( + player.needsToDiscard(0, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 10 / Math.max(0.1, get.value(card)); + return 5 - (player.getStat("skill").buxu || 0) - get.value(card); }, - ai2:()=>1, - content:function(){ - var filter=lib.skill.chengye.liujing_filter[lib.skill.buxu_backup.index]; - var card=get.cardPile(filter); - if(card) player.addToExpansion(card,'gain2').gaintag.add('chengye'); + ai2: () => 1, + content: function () { + var filter = lib.skill.chengye.liujing_filter[lib.skill.buxu_backup.index]; + var card = get.cardPile(filter); + if (card) player.addToExpansion(card, "gain2").gaintag.add("chengye"); }, - ai:{result:{player:1}}, - } + ai: { result: { player: 1 } }, + }; }, }, - ai:{ - combo:'chengye', - order:0.2, - result:{player:1}, + ai: { + combo: "chengye", + order: 0.2, + result: { player: 1 }, }, }, //阮慧 - mingcha:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - forced:true, - locked:false, - filter:(event)=>!event.numFixed, - content:function(){ - 'step 0' - var cards=game.cardsGotoOrdering(get.cards(3)).cards,cards2=cards.slice(0); - event.cards=cards.filter(function(i){ - return get.number(i)<9; + mingcha: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + forced: true, + locked: false, + filter: (event) => !event.numFixed, + content: function () { + "step 0"; + var cards = game.cardsGotoOrdering(get.cards(3)).cards, + cards2 = cards.slice(0); + event.cards = cards.filter(function (i) { + return get.number(i) < 9; }); // while(cards2.length>0){ // var card=cards2.pop(); @@ -5900,2133 +7368,2617 @@ game.import('character', function () { // ui.cardPile.insertBefore(card,ui.cardPile.firstChild); // } // game.updateRoundNumber(); - player.showCards(cards,get.translation(player)+'发动了【明察】'); - if(!event.cards.length) event.finish(); - 'step 1' - player.chooseBool('是否放弃摸牌并获得'+get.translation(cards)).set('goon',trigger.num-cards.length<=1); - 'step 2' - if(result.bool){ + player.showCards(cards, get.translation(player) + "发动了【明察】"); + if (!event.cards.length) event.finish(); + ("step 1"); + player + .chooseBool("是否放弃摸牌并获得" + get.translation(cards)) + .set("goon", trigger.num - cards.length <= 1); + ("step 2"); + if (result.bool) { trigger.changeToZero(); - player.gain(cards,'gain2'); - } - else event.finish(); - 'step 3' - player.chooseTarget('是否随机获得其他角色的一张牌?',function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }).set('ai',function(target){ - return 3-get.attitude(player,target); - }); - 'step 4' - if(result.bool){ - var target=result.targets[0],cards=target.getGainableCards(player,'he'); - player.line(target,'green'); - if(cards.length) player.gain(cards.randomGet(),target,'giveAuto','bySelf'); + player.gain(cards, "gain2"); + } else event.finish(); + ("step 3"); + player + .chooseTarget("是否随机获得其他角色的一张牌?", function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + return 3 - get.attitude(player, target); + }); + ("step 4"); + if (result.bool) { + var target = result.targets[0], + cards = target.getGainableCards(player, "he"); + player.line(target, "green"); + if (cards.length) player.gain(cards.randomGet(), target, "giveAuto", "bySelf"); } }, }, - jingzhong:{ - audio:2, - trigger:{player:'phaseDiscardAfter'}, - filter:function(event,player){ - var num=0; - player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event){ - for(var i of evt.cards2){ - if(get.color(i,player)=='black') num++; + jingzhong: { + audio: 2, + trigger: { player: "phaseDiscardAfter" }, + filter: function (event, player) { + var num = 0; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) { + for (var i of evt.cards2) { + if (get.color(i, player) == "black") num++; } } }); - return num>1; + return num > 1; }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jingzhong'),'获得一名其他角色下回合出牌阶段内使用的牌',lib.filter.notMe).set('ai',function(target){ - return Math.sqrt(target.countCards('h'))*get.threaten(target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jingzhong',target); - player.addSkill('jingzhong_effect'); - player.markAuto('jingzhong_effect',[target]); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jingzhong"), + "获得一名其他角色下回合出牌阶段内使用的牌", + lib.filter.notMe + ) + .set("ai", function (target) { + return Math.sqrt(target.countCards("h")) * get.threaten(target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jingzhong", target); + player.addSkill("jingzhong_effect"); + player.markAuto("jingzhong_effect", [target]); game.delayx(); } }, - subSkill:{ - effect:{ - trigger:{global:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - if(!player.getStorage('jingzhong_effect').includes(event.player)||!event.cards.filterInD().length) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=event.player) return false; - return player.getHistory('useSkill',function(evtx){ - return evtx.skill=='jingzhong_effect'&&evtx.event.getParent('phaseUse')==evt; - }).length<3; + subSkill: { + effect: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if ( + !player.getStorage("jingzhong_effect").includes(event.player) || + !event.cards.filterInD().length + ) + return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + player.getHistory("useSkill", function (evtx) { + return ( + evtx.skill == "jingzhong_effect" && + evtx.event.getParent("phaseUse") == evt + ); + }).length < 3 + ); }, - logTarget:'player', - content:function(){ - player.gain(trigger.cards.filterInD(),'gain2'); + logTarget: "player", + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); }, - mark:true, - intro:{content:'已指定$为目标'}, - group:'jingzhong_remove', + mark: true, + intro: { content: "已指定$为目标" }, + group: "jingzhong_remove", }, - remove:{ - trigger:{global:'phaseAfter'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - filter:function(event,player){ - return player.getStorage('jingzhong_effect').includes(event.player); + remove: { + trigger: { global: "phaseAfter" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return player.getStorage("jingzhong_effect").includes(event.player); }, - content:function(){ - var storage=player.getStorage('jingzhong_effect'); + content: function () { + var storage = player.getStorage("jingzhong_effect"); storage.remove(trigger.player); - if(!storage.length) player.removeSkill('jingzhong_effect'); + if (!storage.length) player.removeSkill("jingzhong_effect"); }, }, }, }, //全琮 - sbyaoming:{ - audio:2, - chargeSkill:true, - enable:'phaseUse', - filter:function(event,player){ - return player.countMark('charge')>0; + sbyaoming: { + audio: 2, + chargeSkill: true, + enable: "phaseUse", + filter: function (event, player) { + return player.countMark("charge") > 0; }, - filterTarget:true, - prompt:function(){ - var num=_status.event.player.storage.sbyaoming_status; - var list=['弃置一名手牌数不小于你的角色的一张牌',';或令一名手牌数不大于你的角色摸一张牌'] - if(typeof num=='number') list[num]+='(上次选择)'; - return list[0]+list[1]; + filterTarget: true, + prompt: function () { + var num = _status.event.player.storage.sbyaoming_status; + var list = [ + "弃置一名手牌数不小于你的角色的一张牌", + ";或令一名手牌数不大于你的角色摸一张牌", + ]; + if (typeof num == "number") list[num] += "(上次选择)"; + return list[0] + list[1]; }, - content:function(){ - 'step 0' - player.removeMark('charge',1); - var num=target.countCards('h'),num2=player.countCards('h'); - if(num==num2&&target.countCards('he')>0){ - var choice=get.attitude(player,target)>0?1:0; - var str=get.translation(target),choiceList=[ - '弃置'+str+'的一张牌', - '令'+str+'摸一张牌', - ]; - if(typeof player.storage.sbyaoming_status=='number') choiceList[player.storage.sbyaoming_status]+='(上次选择)'; - var next=player.chooseControl().set('choiceList',choiceList); - next.set('ai_choice',choice); - next.set('ai',()=>_status.event.ai_choice); - } - else event._result={index:num>num2?0:1}; - 'step 1' - if(result.index==0){ - player.discardPlayerCard(target,true,'he'); - } - else target.draw(); - if(typeof player.storage.sbyaoming_status=='number'&&result.index!=player.storage.sbyaoming_status){ - player.addMark('charge',1); + content: function () { + "step 0"; + player.removeMark("charge", 1); + var num = target.countCards("h"), + num2 = player.countCards("h"); + if (num == num2 && target.countCards("he") > 0) { + var choice = get.attitude(player, target) > 0 ? 1 : 0; + var str = get.translation(target), + choiceList = ["弃置" + str + "的一张牌", "令" + str + "摸一张牌"]; + if (typeof player.storage.sbyaoming_status == "number") + choiceList[player.storage.sbyaoming_status] += "(上次选择)"; + var next = player.chooseControl().set("choiceList", choiceList); + next.set("ai_choice", choice); + next.set("ai", () => _status.event.ai_choice); + } else event._result = { index: num > num2 ? 0 : 1 }; + ("step 1"); + if (result.index == 0) { + player.discardPlayerCard(target, true, "he"); + } else target.draw(); + if ( + typeof player.storage.sbyaoming_status == "number" && + result.index != player.storage.sbyaoming_status + ) { + player.addMark("charge", 1); delete player.storage.sbyaoming_status; - } - else{ - player.storage.sbyaoming_status=result.index; + } else { + player.storage.sbyaoming_status = result.index; } }, - ai:{ - order:6, - result:{ - player:function(player,target){ - var att=get.attitude(player,target),eff=[0,0]; - var hs=player.countCards('h'),ht=target.countCards('h'); - if(hs>=ht){ - eff[0]=get.effect(target,{name:'draw'},player,player); - if(player.storage.sbyaoming_status==0) eff[0]*=1.2; + ai: { + order: 6, + result: { + player: function (player, target) { + var att = get.attitude(player, target), + eff = [0, 0]; + var hs = player.countCards("h"), + ht = target.countCards("h"); + if (hs >= ht) { + eff[0] = get.effect(target, { name: "draw" }, player, player); + if (player.storage.sbyaoming_status == 0) eff[0] *= 1.2; } - if(hs<=ht){ - eff[1]=get.effect(target,{name:'guohe_copy2'},player,player); - if(player.storage.sbyaoming_status==1) eff[1]*=1.2; + if (hs <= ht) { + eff[1] = get.effect(target, { name: "guohe_copy2" }, player, player); + if (player.storage.sbyaoming_status == 1) eff[1] *= 1.2; } - return Math.max.apply(Math,eff); + return Math.max.apply(Math, eff); }, }, }, - group:['sbyaoming_damage','sbyaoming_init'], - subSkill:{ - damage:{ - trigger:{player:'damageEnd'}, - direct:true, - content:function(){ - 'step 0' - var num=Math.min(trigger.num,4-player.countMark('charge')); - if(num>0){ - player.logSkill('sbyaoming_damage'); - player.addMark('charge',num); + group: ["sbyaoming_damage", "sbyaoming_init"], + subSkill: { + damage: { + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + var num = Math.min(trigger.num, 4 - player.countMark("charge")); + if (num > 0) { + player.logSkill("sbyaoming_damage"); + player.addMark("charge", num); game.delayx(); } - 'step 1' - player.chooseTarget(get.prompt('sbyaoming'),lib.skill.sbyaoming.prompt()).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,'sbyaoming',player,player) - }); - 'step 2' - if(result.bool){ - player.useSkill('sbyaoming',result.targets); + ("step 1"); + player + .chooseTarget(get.prompt("sbyaoming"), lib.skill.sbyaoming.prompt()) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, "sbyaoming", player, player); + }); + ("step 2"); + if (result.bool) { + player.useSkill("sbyaoming", result.targets); } }, }, - init:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + init: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.countMark('charge')<4; + forced: true, + locked: false, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + player.countMark("charge") < 4 + ); }, - content:function(){ - player.addMark('charge',Math.min(2,4-player.countMark('charge'))); + content: function () { + player.addMark("charge", Math.min(2, 4 - player.countMark("charge"))); }, }, }, }, //手杀界荀彧 - rejieming:{ - audio:2, - trigger:{ - player:"damageEnd", + rejieming: { + audio: 2, + trigger: { + player: "damageEnd", }, - direct:true, - content:function (){ - "step 0" - event.count=trigger.num; - "step 1" - player.chooseTarget(get.prompt('rejieming'),'令一名角色摸两张牌。然后若其手牌数少于体力上限,你摸一张牌').set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>2){ - if((target.maxHp-target.countCards('h'))>2) return 2*att; - return att; - } - return att/3; - }); - "step 2" - if(result.bool){ - event.current=result.targets[0]; - player.logSkill('rejieming',event.current); - player.line(event.current,'thunder'); + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); + player + .chooseTarget( + get.prompt("rejieming"), + "令一名角色摸两张牌。然后若其手牌数少于体力上限,你摸一张牌" + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 2) { + if (target.maxHp - target.countCards("h") > 2) return 2 * att; + return att; + } + return att / 3; + }); + ("step 2"); + if (result.bool) { + event.current = result.targets[0]; + player.logSkill("rejieming", event.current); + player.line(event.current, "thunder"); event.current.draw(2); event.count--; - } - else event.finish(); - "step 3" - if(event.current.countCards('h')0&&player.hasSkill('rejieming')) event.goto(1); + ("step 4"); + if (event.count > 0 && player.hasSkill("rejieming")) event.goto(1); }, - ai:{ - maixie:true, - "maixie_hp":true, - effect:{ - target:function (card,player,target,current){ - if(get.tag(card,'damage')&&target.hp>1){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - var max=0; - var players=game.filterPlayer(); - for(var i=0;i0){ - max=Math.max(Math.min(5,players[i].hp)-players[i].countCards('h'),max); + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max( + Math.min(5, players[i].hp) - players[i].countCards("h"), + max + ); } } - switch(max){ - case 0:return 2; - case 1:return 1.5; - case 2:return [1,2]; - default:return [0,max]; + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; } } - if((card.name=='tao'||card.name=='caoyao')&& - target.hp>1&&target.countCards('h')<=target.hp) return [0,0]; + if ( + (card.name == "tao" || card.name == "caoyao") && + target.hp > 1 && + target.countCards("h") <= target.hp + ) + return [0, 0]; }, }, }, }, //沮授 - xinjianying:{ - audio:2, - subfrequent:['draw'], - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(!player.countCards('he')) return false; - for(var i of lib.inpile){ - if(i!='du'&&get.type(i,false)=='basic'){ - if(event.filterCard({name:i},player,event)) return true; - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard({name:i,nature:j},player,event)) return true; + xinjianying: { + audio: 2, + subfrequent: ["draw"], + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (!player.countCards("he")) return false; + for (var i of lib.inpile) { + if (i != "du" && get.type(i, false) == "basic") { + if (event.filterCard({ name: i }, player, event)) return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j }, player, event)) return true; } } } } return false; }, - onChooseToUse:function(event){ - if(event.type=='phase'&&!game.online){ - var last=event.player.getLastUsed(); - if(last&&last.getParent('phaseUse')==event.getParent()){ - var suit=get.suit(last.card,false); - if(suit!='none') event.set('xinjianying_suit',suit); + onChooseToUse: function (event) { + if (event.type == "phase" && !game.online) { + var last = event.player.getLastUsed(); + if (last && last.getParent("phaseUse") == event.getParent()) { + var suit = get.suit(last.card, false); + if (suit != "none") event.set("xinjianying_suit", suit); } } }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - var suit=event.xinjianying_suit||'',str=get.translation(suit); - for(var i of lib.inpile){ - if(i!='du'&&get.type(i,false)=='basic'){ - if(event.filterCard({name:i},player,event)) list.push(['基本',str,i]); - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard({name:i,nature:j},player,event)) list.push(['基本',str,i,j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + var suit = event.xinjianying_suit || "", + str = get.translation(suit); + for (var i of lib.inpile) { + if (i != "du" && get.type(i, false) == "basic") { + if (event.filterCard({ name: i }, player, event)) list.push(["基本", str, i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j }, player, event)) + list.push(["基本", str, i, j]); } } } } - return ui.create.dialog('渐营',[list,'vcard']); + return ui.create.dialog("渐营", [list, "vcard"]); }, - check:function(button){ - if(button.link[2]=='jiu') return 0; - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); + check: function (button) { + if (button.link[2] == "jiu") return 0; + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); }, - backup:function(links,player){ - var next={ - audio:'xinjianying', - filterCard:true, - popname:true, - position:'he', - viewAs:{ - name:links[0][2], - nature:links[0][3], + backup: function (links, player) { + var next = { + audio: "xinjianying", + filterCard: true, + popname: true, + position: "he", + viewAs: { + name: links[0][2], + nature: links[0][3], }, - ai1:function(card){ - return 7-_status.event.player.getUseValue(card,null,true); + ai1: function (card) { + return 7 - _status.event.player.getUseValue(card, null, true); }, }; - if(_status.event.xinjianying_suit) next.viewAs.suit=_status.event.xinjianying_suit; + if (_status.event.xinjianying_suit) next.viewAs.suit = _status.event.xinjianying_suit; return next; }, - prompt:function(links){ - return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+(_status.event.xinjianying_suit?('('+get.translation(_status.event.xinjianying_suit)+')'):'')+'使用'; + prompt: function (links) { + return ( + "将一张牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + (_status.event.xinjianying_suit + ? "(" + get.translation(_status.event.xinjianying_suit) + ")" + : "") + + "使用" + ); }, }, - ai:{ - order:function(item,player){ - if(_status.event.xinjianying_suit) return 16; + ai: { + order: function (item, player) { + if (_status.event.xinjianying_suit) return 16; return 3; }, - result:{player:7}, + result: { player: 7 }, }, - group:['xinjianying_draw','jianying_mark'], - init:function(player){ - if(player.isPhaseUsing()){ - var evt=_status.event.getParent('phaseUse'); - var history=player.getHistory('useCard',function(evt2){ - return evt2.getParent('phaseUse')==evt; + group: ["xinjianying_draw", "jianying_mark"], + init: function (player) { + if (player.isPhaseUsing()) { + var evt = _status.event.getParent("phaseUse"); + var history = player.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == evt; }); - if(history.length){ - var trigger=history[history.length-1]; - player.storage.jianying_mark=trigger.card; - player.markSkill('jianying_mark'); - game.broadcastAll(function(player,suit){ - if(player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML=get.translation(suit); - },player,get.suit(trigger.card,player)); - player.when('phaseUseAfter').then(()=>{ - player.unmarkSkill('jianying_mark'); + if (history.length) { + var trigger = history[history.length - 1]; + player.storage.jianying_mark = trigger.card; + player.markSkill("jianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.jianying_mark) + player.marks.jianying_mark.firstChild.innerHTML = + get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + player.when("phaseUseAfter").then(() => { + player.unmarkSkill("jianying_mark"); delete player.storage.jianying_mark; }); } } }, - onremove:function(player){ - player.unmarkSkill('jianying_mark'); + onremove: function (player) { + player.unmarkSkill("jianying_mark"); delete player.storage.jianying_mark; }, - subSkill:{ - draw:{inherit:'jianying',audio:'xinjianying'}, + subSkill: { + draw: { inherit: "jianying", audio: "xinjianying" }, }, }, //步练师 - reanxu:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.countPlayer()>2&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he'); - }); - }, - selectTarget:2, - filterTarget:function(card,player,target){ - if(target==player) return false; - if(!ui.selected.targets.length) return target.countCards('he')>0; - return target!=ui.selected.targets[0]&&ui.selected.targets[0].countGainableCards(target,'he')>0; - }, - multitarget:true, - targetprompt:['被拿牌','得到牌'], - content:function(){ - 'step 0' - targets[1].gainPlayerCard(targets[0],'he',true); - 'step 1' - if(targets[0].getHistory('lose',function(evt){ - return evt.getParent(3)==event&&!evt.es.length; - }).length) player.draw(); - 'step 2' - if(targets[0].isIn()&&targets[1].isIn()&& - targets[0].countCards('h')!=targets[1].countCards('h')){ - event.target=targets[targets[0].countCards('h')>targets[1].countCards('h')?1:0]; - player.chooseBool('是否令'+get.translation(event.target)+'摸一张牌?').set('ai',function(){ - var evt=_status.event.getParent(); - return get.attitude(evt.player,evt.target)>0; + reanxu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + game.countPlayer() > 2 && + game.hasPlayer(function (current) { + return current != player && current.countCards("he"); }) - } - else event.finish(); - 'step 3' - if(result.bool) target.draw(); + ); }, - ai:{ - expose:0.2, - threaten:2, - order:9, - result:{ - player:function(player,target){ - if(ui.selected.targets.length) return 0.01; - return target.countCards('e')?0:0.5; + selectTarget: 2, + filterTarget: function (card, player, target) { + if (target == player) return false; + if (!ui.selected.targets.length) return target.countCards("he") > 0; + return ( + target != ui.selected.targets[0] && + ui.selected.targets[0].countGainableCards(target, "he") > 0 + ); + }, + multitarget: true, + targetprompt: ["被拿牌", "得到牌"], + content: function () { + "step 0"; + targets[1].gainPlayerCard(targets[0], "he", true); + ("step 1"); + if ( + targets[0].getHistory("lose", function (evt) { + return evt.getParent(3) == event && !evt.es.length; + }).length + ) + player.draw(); + ("step 2"); + if ( + targets[0].isIn() && + targets[1].isIn() && + targets[0].countCards("h") != targets[1].countCards("h") + ) { + event.target = + targets[targets[0].countCards("h") > targets[1].countCards("h") ? 1 : 0]; + player + .chooseBool("是否令" + get.translation(event.target) + "摸一张牌?") + .set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target) > 0; + }); + } else event.finish(); + ("step 3"); + if (result.bool) target.draw(); + }, + ai: { + expose: 0.2, + threaten: 2, + order: 9, + result: { + player: function (player, target) { + if (ui.selected.targets.length) return 0.01; + return target.countCards("e") ? 0 : 0.5; }, - target:function(player,target){ - if(ui.selected.targets.length){ - player=target; - target=ui.selected.targets[0]; - if(get.attitude(player,target)>1){ + target: function (player, target) { + if (ui.selected.targets.length) { + player = target; + target = ui.selected.targets[0]; + if (get.attitude(player, target) > 1) { return 0; } - return target.countCards('h')-player.countCards('h')>(target.countCards('e')?2:1)?2:1; - } - else{ - if(get.attitude(player,target)<=0) return (target.countCards('he',function(card){ - return card.name=='tengjia'||get.value(card)>0; - })>0)?-1.5:1.5; - return (target.countCards('he',function(card){ - return card.name!='tengjia'&&get.value(card)<=0; - })>0)?1.5:-1.5 + return target.countCards("h") - player.countCards("h") > + (target.countCards("e") ? 2 : 1) + ? 2 + : 1; + } else { + if (get.attitude(player, target) <= 0) + return target.countCards("he", function (card) { + return card.name == "tengjia" || get.value(card) > 0; + }) > 0 + ? -1.5 + : 1.5; + return target.countCards("he", function (card) { + return card.name != "tengjia" && get.value(card) <= 0; + }) > 0 + ? 1.5 + : -1.5; } }, }, }, }, //蒋干 - spdaoshu:{ - audio:3, - group:'spdaoshu_effect', - subSkill:{ - effect:{ - audio:'spdaoshu1', - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - var goon=(event.player!=player&&(get.mode()=='identity'||get.mode()=='guozhan'||event.player.isEnemyOf(player))); - return goon&&event.player.countCards('h')>0&&event.player.hasUseTarget({name:'jiu',isCard:true},null,true); + spdaoshu: { + audio: 3, + group: "spdaoshu_effect", + subSkill: { + effect: { + audio: "spdaoshu1", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + var goon = + event.player != player && + (get.mode() == "identity" || + get.mode() == "guozhan" || + event.player.isEnemyOf(player)); + return ( + goon && + event.player.countCards("h") > 0 && + event.player.hasUseTarget({ name: "jiu", isCard: true }, null, true) + ); }, - round:1, - logTarget:'player', - prompt2:()=>lib.translate.spdaoshu_info, - check:function(event,player){ - var target=event.player; - var att=get.attitude(player,target); - if(att>0) return false; - if(att==0) return !player.inRangeOf(target); + round: 1, + logTarget: "player", + prompt2: () => lib.translate.spdaoshu_info, + check: function (event, player) { + var target = event.player; + var att = get.attitude(player, target); + if (att > 0) return false; + if (att == 0) return !player.inRangeOf(target); return true; }, - content:function(){ - 'step 0' - event.target=trigger.player; - event.target.chooseUseTarget('jiu',true); - 'step 1' - if(!target.countCards('h')){ + content: function () { + "step 0"; + event.target = trigger.player; + event.target.chooseUseTarget("jiu", true); + ("step 1"); + if (!target.countCards("h")) { event.finish(); return; } - var list=[]; - for(var i of lib.inpile){ - if(get.type(i)=='basic') list.push(i); + var list = []; + for (var i of lib.inpile) { + if (get.type(i) == "basic") list.push(i); } - if(!list.length){ + if (!list.length) { event.finish(); return; } - target.chooseControl(list).set('prompt','请声明一种基本牌').set('ai',()=>_status.event.rand).set('rand',get.rand(0,list.length-1)); - 'step 2' - event.cardname=result.control; - target.chat('我声明'+get.translation(event.cardname)); - game.log(target,'声明的牌名为','#y'+get.translation(event.cardname)); + target + .chooseControl(list) + .set("prompt", "请声明一种基本牌") + .set("ai", () => _status.event.rand) + .set("rand", get.rand(0, list.length - 1)); + ("step 2"); + event.cardname = result.control; + target.chat("我声明" + get.translation(event.cardname)); + game.log(target, "声明的牌名为", "#y" + get.translation(event.cardname)); game.delayx(); - player.chooseControl('有!','没有!').set('prompt','你觉得'+get.translation(target)+'的手牌区里有'+get.translation(event.cardname)+'吗?').set('ai',function(){ - return _status.event.choice; - }).set('choice',function(){ - var rand={ - sha:0.273, - shan:0.149, - tao:0.074, - jiu:0.031, - }[event.cardname]||0.1; - return (1-Math.pow(1-rand,target.countCards('h')))>0.5?'有!':'没有!'; - }()); - 'step 3' + player + .chooseControl("有!", "没有!") + .set( + "prompt", + "你觉得" + + get.translation(target) + + "的手牌区里有" + + get.translation(event.cardname) + + "吗?" + ) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var rand = + { + sha: 0.273, + shan: 0.149, + tao: 0.074, + jiu: 0.031, + }[event.cardname] || 0.1; + return 1 - Math.pow(1 - rand, target.countCards("h")) > 0.5 + ? "有!" + : "没有!"; + })() + ); + ("step 3"); player.chat(result.control); - game.log(player,'认为','#y'+result.control); + game.log(player, "认为", "#y" + result.control); game.delayx(); - 'step 4' - var bool1=(result.index==0); - var bool2=(target.hasCard(function(card){ - return get.name(card,target)==event.cardname; - },'h')); - if(bool1==bool2){ - player.popup('判断正确','wood'); - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','spdaoshu2'); + ("step 4"); + var bool1 = result.index == 0; + var bool2 = target.hasCard(function (card) { + return get.name(card, target) == event.cardname; + }, "h"); + if (bool1 == bool2) { + player.popup("判断正确", "wood"); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spdaoshu2"); }); - player.gainPlayerCard(target,'h',2,true); + player.gainPlayerCard(target, "h", 2, true); //var cards=target.getCards('h',function(card){ // return lib.filter.canBeGained(card,player,target); //}).randomGets(5); //if(cards.length>0) player.gain(cards,target,'giveAuto','bySelf'); - } - else{ - player.popup('判断错误','fire'); - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','spdaoshu3'); + } else { + player.popup("判断错误", "fire"); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spdaoshu3"); }); //player.addTempSkill('spdaoshu_respond'); } }, - ai:{expose:0.3}, + ai: { expose: 0.3 }, }, - respond:{ - trigger:{global:'useCard1'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.player==_status.currentPhase; + respond: { + trigger: { global: "useCard1" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.player == _status.currentPhase; }, - content:function(){ + content: function () { trigger.directHit.add(player); }, }, }, }, - spdaoshu1:{audio:true}, - mbdaoshu:{ - audio:3, - group:'mbdaoshu_use', - subSkill:{ - use:{ - audio:'mbdaoshu1', - enable:'phaseUse', - filter:function(event,player){ - return game.hasPlayer(target=>target!=player&&target.countCards('h')>2); + spdaoshu1: { audio: true }, + mbdaoshu: { + audio: 3, + group: "mbdaoshu_use", + subSkill: { + use: { + audio: "mbdaoshu1", + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer((target) => target != player && target.countCards("h") > 2); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>2; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 2; }, - usable:1, - prompt:()=>lib.translate.mbdaoshu_info, - content:function*(event,map){ - var player=map.player,target=event.target; - var targets=[player],names=lib.inpile.randomGets(3); - if(!names.length) return; - var map={}; - names.forEach(name=>map[get.translation(name)]=name); - if(get.mode()!='identity'&&get.mode()!='guozhan') targets.addArray(player.getFriends()); + usable: 1, + prompt: () => lib.translate.mbdaoshu_info, + content: function* (event, map) { + var player = map.player, + target = event.target; + var targets = [player], + names = lib.inpile.randomGets(3); + if (!names.length) return; + var map = {}; + names.forEach((name) => (map[get.translation(name)] = name)); + if (get.mode() != "identity" && get.mode() != "guozhan") + targets.addArray(player.getFriends()); targets.remove(target); targets.sortBySeat(); - var result=yield target.chooseButton([ - '盗书:请选择伪装的牌和牌名', - target.getCards('h'), - [Object.keys(map),'tdnodes'], - ],2,true).set('filterButton',button=>{ - var map=_status.event.map; - if(!ui.selected.buttons.length) return true; - if(typeof button.link==typeof ui.selected.buttons[0].link) return false; - if(typeof button.link=='string') return get.name(ui.selected.buttons[0].link,false)!=map[button.link]; - return map[ui.selected.buttons[0].link]!=get.name(button.link,false); - }).set('ai',button=>{ - var map=_status.event.map; - if(!ui.selected.buttons.length){ - if(typeof button.link=='object'){ - if(Object.values(map).some(name=>lib.card.list.some(card=>card[0]==get.suit(button.link,false)&&card[1]==get.number(button.link,false)&&card[2]==name))) return 5; - return 3.5+Math.random(); + var result = yield target + .chooseButton( + [ + "盗书:请选择伪装的牌和牌名", + target.getCards("h"), + [Object.keys(map), "tdnodes"], + ], + 2, + true + ) + .set("filterButton", (button) => { + var map = _status.event.map; + if (!ui.selected.buttons.length) return true; + if (typeof button.link == typeof ui.selected.buttons[0].link) + return false; + if (typeof button.link == "string") + return ( + get.name(ui.selected.buttons[0].link, false) != map[button.link] + ); + return map[ui.selected.buttons[0].link] != get.name(button.link, false); + }) + .set("ai", (button) => { + var map = _status.event.map; + if (!ui.selected.buttons.length) { + if (typeof button.link == "object") { + if ( + Object.values(map).some((name) => + lib.card.list.some( + (card) => + card[0] == get.suit(button.link, false) && + card[1] == get.number(button.link, false) && + card[2] == name + ) + ) + ) + return 5; + return 3.5 + Math.random(); + } + return 0; + } + if (typeof button.link == "string") { + var cardx = ui.selected.buttons[0].link; + if ( + lib.card.list.some( + (card) => + card[0] == get.suit(cardx, false) && + card[1] == get.number(cardx, false) && + card[2] == map[button.link] + ) + ) + return 2 + Math.random(); + return 1; } return 0; - } - if(typeof button.link=='string'){ - var cardx=ui.selected.buttons[0].link; - if(lib.card.list.some(card=>card[0]==get.suit(cardx,false)&&card[1]==get.number(cardx,false)&&card[2]==map[button.link])) return 2+Math.random(); - return 1; - } - return 0; - }).set('map',map); - if(result.bool){ - var guessWinner=[]; - if(typeof result.links[0]=='string') result.links.reverse(); - var OriginCard=result.links[0],ChangeName=map[result.links[1]],cards=target.getCards('h').slice(); - var card=game.createCard(ChangeName,get.suit(OriginCard,false),get.number(OriginCard,false)); - cards[cards.indexOf(OriginCard)]=card; - if(_status.connectMode){ - var list=targets.map(target2=>[target2,['请猜测'+get.translation(target)+'伪装的手牌',cards],true]); - var result2=yield player.chooseButtonOL(list).set('switchToAuto',()=>_status.event.result='ai').set('processAI',()=>{ - var cards=_status.event.cards.slice(); - var card=cards.find(card=>lib.card.list.some(cardx=>cardx[2]==card.name)&&!lib.card.list.some(cardx=>cardx[2]==card.name&&cardx[0]==get.suit(card,false)&&cardx[0]==get.number(card,false))); - return { - bool:true, - links:card?card:cards.randomGet(), - } - }).set('cards',cards); - for(var i in result2){ - if(result2[i].links[0]==card) guessWinner.push(lib.playerOL[i]); + }) + .set("map", map); + if (result.bool) { + var guessWinner = []; + if (typeof result.links[0] == "string") result.links.reverse(); + var OriginCard = result.links[0], + ChangeName = map[result.links[1]], + cards = target.getCards("h").slice(); + var card = game.createCard( + ChangeName, + get.suit(OriginCard, false), + get.number(OriginCard, false) + ); + cards[cards.indexOf(OriginCard)] = card; + if (_status.connectMode) { + var list = targets.map((target2) => [ + target2, + ["请猜测" + get.translation(target) + "伪装的手牌", cards], + true, + ]); + var result2 = yield player + .chooseButtonOL(list) + .set("switchToAuto", () => (_status.event.result = "ai")) + .set("processAI", () => { + var cards = _status.event.cards.slice(); + var card = cards.find( + (card) => + lib.card.list.some((cardx) => cardx[2] == card.name) && + !lib.card.list.some( + (cardx) => + cardx[2] == card.name && + cardx[0] == get.suit(card, false) && + cardx[0] == get.number(card, false) + ) + ); + return { + bool: true, + links: card ? card : cards.randomGet(), + }; + }) + .set("cards", cards); + for (var i in result2) { + if (result2[i].links[0] == card) guessWinner.push(lib.playerOL[i]); } - } - else{ - var guessTargets=targets.slice(); - while(guessTargets.length){ - var target2=guessTargets.shift(); - var result2=yield target2.chooseButton(['请猜测'+get.translation(target)+'伪装的手牌',cards],true).set('ai',button=>{ - var cards=_status.event.cards.slice(); - var card=cards.find(card=>lib.card.list.some(cardx=>cardx[2]==get.name(card,false))&&!lib.card.list.some(cardx=>cardx[2]==get.name(card,false)&&cardx[0]==get.suit(card,false)&&cardx[0]==get.number(card,false))); - return button.link==card?3:1+Math.random(); - }).set('cards',cards); - if(result2.bool){ - if(result2.links[0]==card) guessWinner.push(target2); + } else { + var guessTargets = targets.slice(); + while (guessTargets.length) { + var target2 = guessTargets.shift(); + var result2 = yield target2 + .chooseButton( + ["请猜测" + get.translation(target) + "伪装的手牌", cards], + true + ) + .set("ai", (button) => { + var cards = _status.event.cards.slice(); + var card = cards.find( + (card) => + lib.card.list.some( + (cardx) => cardx[2] == get.name(card, false) + ) && + !lib.card.list.some( + (cardx) => + cardx[2] == get.name(card, false) && + cardx[0] == get.suit(card, false) && + cardx[0] == get.number(card, false) + ) + ); + return button.link == card ? 3 : 1 + Math.random(); + }) + .set("cards", cards); + if (result2.bool) { + if (result2.links[0] == card) guessWinner.push(target2); } } } - targets.forEach(target2=>{ - if(guessWinner.includes(target2)){ - target2.popup('判断正确','wood'); - game.log(target2,'猜测','#g正确'); - game.broadcastAll(()=>{ - if(lib.config.background_speak) game.playAudio('skill','mbdaoshu2'); + targets.forEach((target2) => { + if (guessWinner.includes(target2)) { + target2.popup("判断正确", "wood"); + game.log(target2, "猜测", "#g正确"); + game.broadcastAll(() => { + if (lib.config.background_speak) + game.playAudio("skill", "mbdaoshu2"); }); target2.line(target); - target.damage(1,target2); - } - else{ - target2.popup('判断错误','fire'); - game.log(target2,'猜测','#y错误'); - game.broadcastAll(()=>{ - if(lib.config.background_speak) game.playAudio('skill','mbdaoshu3'); + target.damage(1, target2); + } else { + target2.popup("判断错误", "fire"); + game.log(target2, "猜测", "#y错误"); + game.broadcastAll(() => { + if (lib.config.background_speak) + game.playAudio("skill", "mbdaoshu3"); }); - if(target2.countCards('h')>=2) target2.discard(target2.getCards('h').randomGets(2)); + if (target2.countCards("h") >= 2) + target2.discard(target2.getCards("h").randomGets(2)); else target2.loseHp(); } }); } }, - ai:{ - order:9, - result:{ - target:function(player,target){ - return -1/target.countCards('h'); + ai: { + order: 9, + result: { + target: function (player, target) { + return -1 / target.countCards("h"); }, }, }, }, }, }, - mbdaoshu1:{audio:true}, - spdaizui:{ - audio:2, - trigger:{player:'damageBegin2'}, - limited:true, - logTarget:'source', - filter:function(event,player){ - return event.num>=player.hp&&event.source&&event.source.isIn()&&event.cards&&event.cards.filterInD().length>0; + mbdaoshu1: { audio: true }, + spdaizui: { + audio: 2, + trigger: { player: "damageBegin2" }, + limited: true, + logTarget: "source", + filter: function (event, player) { + return ( + event.num >= player.hp && + event.source && + event.source.isIn() && + event.cards && + event.cards.filterInD().length > 0 + ); }, - prompt2:function(event){ - return '防止即将受到的'+get.cnNumber(event.num)+'点伤害,并令'+get.translation(event.source)+'将'+get.translation(event.cards.filterInD())+'置于武将牌上且回合结束时收回'; + prompt2: function (event) { + return ( + "防止即将受到的" + + get.cnNumber(event.num) + + "点伤害,并令" + + get.translation(event.source) + + "将" + + get.translation(event.cards.filterInD()) + + "置于武将牌上且回合结束时收回" + ); }, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - player.awakenSkill('spdaizui'); - trigger.source.addSkill('spdaizui2'); - trigger.source.addToExpansion(trigger.cards.filterInD(),'gain2').gaintag.add('spdaizui2'); + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.awakenSkill("spdaizui"); + trigger.source.addSkill("spdaizui2"); + trigger.source + .addToExpansion(trigger.cards.filterInD(), "gain2") + .gaintag.add("spdaizui2"); trigger.cancel(); }, }, - spdaizui2:{ - trigger:{global:'phaseEnd'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.getExpansions('spdaizui2').length>0; + spdaizui2: { + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("spdaizui2").length > 0; }, - content:function(){ - 'step 0' - var cards=player.getExpansions('spdaizui2'); - player.gain(cards,'gain2'); - 'step 1' - player.removeSkill('spdaizui2'); + content: function () { + "step 0"; + var cards = player.getExpansions("spdaizui2"); + player.gain(cards, "gain2"); + ("step 1"); + player.removeSkill("spdaizui2"); }, - marktext:'释', - intro:{ - markcount:'expansion', - content:'expansion', + marktext: "释", + intro: { + markcount: "expansion", + content: "expansion", }, }, //裴秀 - xingtu:{ - trigger:{player:'useCard'}, - filter:function(event,player){ - var evt=lib.skill.dcjianying.getLastUsed(player,event); - if(!evt||!evt.card) return false; - var num1=get.number(event.card),num2=get.number(evt.card); - return typeof num1=='number'&&typeof num2=='number'&&num2%num1==0; + xingtu: { + trigger: { player: "useCard" }, + filter: function (event, player) { + var evt = lib.skill.dcjianying.getLastUsed(player, event); + if (!evt || !evt.card) return false; + var num1 = get.number(event.card), + num2 = get.number(evt.card); + return typeof num1 == "number" && typeof num2 == "number" && num2 % num1 == 0; }, - forced:true, - content:function(){ + forced: true, + content: function () { player.draw(); }, - mod:{ - cardUsable:function(card,player){ - if(typeof card=='object'){ - var evt=lib.skill.dcjianying.getLastUsed(player); - if(!evt||!evt.card) return; - var num1=get.number(card),num2=get.number(evt.card); - if(num1==='unsure'||typeof num1=='number'&&typeof num2=='number'&&num1%num2==0) return Infinity; + mod: { + cardUsable: function (card, player) { + if (typeof card == "object") { + var evt = lib.skill.dcjianying.getLastUsed(player); + if (!evt || !evt.card) return; + var num1 = get.number(card), + num2 = get.number(evt.card); + if ( + num1 === "unsure" || + (typeof num1 == "number" && typeof num2 == "number" && num1 % num2 == 0) + ) + return Infinity; } }, - aiOrder:function(player,card,num){ - if(typeof card=='object'){ - var evt=lib.skill.dcjianying.getLastUsed(player); - if(!evt||!evt.card) return; - var num1=get.number(card),num2=num2=get.number(evt.card); - if(num1==='unsure'||typeof num1=='number'&&typeof num2=='number'&&num2%num1==0) return num+5; + aiOrder: function (player, card, num) { + if (typeof card == "object") { + var evt = lib.skill.dcjianying.getLastUsed(player); + if (!evt || !evt.card) return; + var num1 = get.number(card), + num2 = (num2 = get.number(evt.card)); + if ( + num1 === "unsure" || + (typeof num1 == "number" && typeof num2 == "number" && num2 % num1 == 0) + ) + return num + 5; } }, }, - init:function(player){ - player.addSkill('xingtu_mark'); - var history=player.getAllHistory('useCard'); - if(history.length){ - var trigger=history[history.length-1],num=get.number(trigger.card); - player.storage.xingtu_mark=num; - player[typeof num!='number'?'unmarkSkill':'markSkill']('xingtu_mark'); + init: function (player) { + player.addSkill("xingtu_mark"); + var history = player.getAllHistory("useCard"); + if (history.length) { + var trigger = history[history.length - 1], + num = get.number(trigger.card); + player.storage.xingtu_mark = num; + player[typeof num != "number" ? "unmarkSkill" : "markSkill"]("xingtu_mark"); } }, - onremove:function(player){ - player.removeSkill('xingtu_mark'); - player.removeGaintag('xingtu1'); - player.removeGaintag('xingtu2'); + onremove: function (player) { + player.removeSkill("xingtu_mark"); + player.removeGaintag("xingtu1"); + player.removeGaintag("xingtu2"); delete player.storage.xingtu_mark; }, - subSkill:{ - mark:{ - charlotte:true, - trigger:{ - player:['useCard1','gainAfter'], - global:'loseAsyncAfter', + subSkill: { + mark: { + charlotte: true, + trigger: { + player: ["useCard1", "gainAfter"], + global: "loseAsyncAfter", }, - filter:function(event,player,name){ - if(!player.countCards('h')) return false; - return name=='useCard1'||event.getg(player).length; + filter: function (event, player, name) { + if (!player.countCards("h")) return false; + return name == "useCard1" || event.getg(player).length; }, - direct:true, - firstDo:true, - content:function(){ - 'step 0' - player.removeGaintag('xingtu1'); - player.removeGaintag('xingtu2'); - if(event.triggername=='useCard1'){ - var num=get.number(trigger.card,player); - player.storage.xingtu_mark=num; - player[typeof num!='number'?'unmarkSkill':'markSkill']('xingtu_mark'); - if(typeof num!='number') event.finish(); + direct: true, + firstDo: true, + content: function () { + "step 0"; + player.removeGaintag("xingtu1"); + player.removeGaintag("xingtu2"); + if (event.triggername == "useCard1") { + var num = get.number(trigger.card, player); + player.storage.xingtu_mark = num; + player[typeof num != "number" ? "unmarkSkill" : "markSkill"]("xingtu_mark"); + if (typeof num != "number") event.finish(); } - 'step 1' - var cards1=[],cards2=[],num=player.storage.xingtu_mark; - player.getCards('h').forEach(card=>{ - var numx=get.number(card,player); - if(typeof numx=='number'){ - if(numx%num==0) cards1.push(card); - if(num%numx==0) cards2.push(card); + ("step 1"); + var cards1 = [], + cards2 = [], + num = player.storage.xingtu_mark; + player.getCards("h").forEach((card) => { + var numx = get.number(card, player); + if (typeof numx == "number") { + if (numx % num == 0) cards1.push(card); + if (num % numx == 0) cards2.push(card); } }); - player.addGaintag(cards1,'xingtu1'); - player.addGaintag(cards2,'xingtu2'); + player.addGaintag(cards1, "xingtu1"); + player.addGaintag(cards2, "xingtu2"); }, - intro:{content:'上一张牌的点数:#'}, + intro: { content: "上一张牌的点数:#" }, }, }, }, - juezhi:{ - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he')>1; + juezhi: { + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") > 1; }, - filterCard:true, - position:'he', - selectCard:[2,Infinity], - check:function(card){ - if(ui.selected.cards.length>1) return 0; - var player=_status.event.player; - if(player.hasSkill('xingtu')&&player.storage.xingtu){ - var cards=player.getCards('he'); - var num=player.storage.xingtu,stop=false; - for(var i=0;i<=cards.length;i++){ - if(i!=cards.length){ - var num1=get.number(cards[i],player); - if(typeof num1!='number') continue; - for(var j=0;j 1) return 0; + var player = _status.event.player; + if (player.hasSkill("xingtu") && player.storage.xingtu) { + var cards = player.getCards("he"); + var num = player.storage.xingtu, + stop = false; + for (var i = 0; i <= cards.length; i++) { + if (i != cards.length) { + var num1 = get.number(cards[i], player); + if (typeof num1 != "number") continue; + for (var j = 0; j < cards.length; j++) { + if (i == j) continue; + var num2 = get.number(cards[j], player); + if (typeof num2 != "number") continue; + var sum = num1 + num2; + if (sum % num == 0 || num % sum == 0) { + stop = true; break; } } - if(stop) break; + if (stop) break; } } - if(i!=cards.length){ - var cardx=[cards[i],cards[j]]; - if(cardx.includes(card)) return 10-get.value(card); + if (i != cards.length) { + var cardx = [cards[i], cards[j]]; + if (cardx.includes(card)) return 10 - get.value(card); } } - return 5-get.value(card); + return 5 - get.value(card); }, - content:function(){ - var num=0; - for(var i of cards) num+=get.number(i,player); - num=num%13; - if(num==0) num=13; - var card=get.cardPile2(function(card){ - return get.number(card,false)==num; + content: function () { + var num = 0; + for (var i of cards) num += get.number(i, player); + num = num % 13; + if (num == 0) num = 13; + var card = get.cardPile2(function (card) { + return get.number(card, false) == num; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); }, - ai:{ - order:1, - result:{player:1}, + ai: { + order: 1, + result: { player: 1 }, }, }, - reganlu:{ - enable:'phaseUse', - usable:1, - audio:2, - selectTarget:2, - delay:0, - filterTarget:function(card,player,target){ - if(target.isMin()) return false; - if(ui.selected.targets.length==0) return true; - if(ui.selected.targets[0].countCards('e')==0&&target.countCards('e')==0) return false; - return target==player||ui.selected.targets[0]==player||Math.abs(ui.selected.targets[0].countCards('e')-target.countCards('e'))<=player.maxHp-player.hp; + reganlu: { + enable: "phaseUse", + usable: 1, + audio: 2, + selectTarget: 2, + delay: 0, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + if (ui.selected.targets.length == 0) return true; + if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) + return false; + return ( + target == player || + ui.selected.targets[0] == player || + Math.abs(ui.selected.targets[0].countCards("e") - target.countCards("e")) <= + player.maxHp - player.hp + ); }, - multitarget:true, - multiline:true, - content:function(){ + multitarget: true, + multiline: true, + content: function () { targets[0].swapEquip(targets[1]); }, - ai:{ - order:10, - threaten:function(player,target){ - return 0.8*Math.max(1+target.maxHp-target.hp); + ai: { + order: 10, + threaten: function (player, target) { + return 0.8 * Math.max(1 + target.maxHp - target.hp); }, - result:{ - target:function(player,target){ - var list1=[]; - var list2=[]; - var num=player.maxHp-player.hp; - var players=game.filterPlayer(); - for(var i=0;i0) list1.push(players[i]); - else if(get.attitude(player,players[i])<0) list2.push(players[i]); + result: { + target: function (player, target) { + var list1 = []; + var list2 = []; + var num = player.maxHp - player.hp; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) list1.push(players[i]); + else if (get.attitude(player, players[i]) < 0) list2.push(players[i]); } - list1.sort(function(a,b){ - return a.countCards('e')-b.countCards('e'); + list1.sort(function (a, b) { + return a.countCards("e") - b.countCards("e"); }); - list2.sort(function(a,b){ - return b.countCards('e')-a.countCards('e'); + list2.sort(function (a, b) { + return b.countCards("e") - a.countCards("e"); }); var delta; - for(var i=0;i0; + mobilexingxue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return (player.storage.mobileyanzhu ? player.maxHp : player.hp) > 0; }, - direct:true, - content:function(){ - 'step 0' - var num=player.storage.mobileyanzhu?player.maxHp:player.hp; - player.chooseTarget([1,num],get.prompt2('mobilexingxue')).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(target.countCards('he')) return att; - return att/10; + direct: true, + content: function () { + "step 0"; + var num = player.storage.mobileyanzhu ? player.maxHp : player.hp; + player.chooseTarget([1, num], get.prompt2("mobilexingxue")).set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("he")) return att; + return att / 10; }); - 'step 1' - if(result.bool){ - player.logSkill('mobilexingxue',result.targets); - event.targets=result.targets; - event.targets2=event.targets.slice(0); + ("step 1"); + if (result.bool) { + player.logSkill("mobilexingxue", result.targets); + event.targets = result.targets; + event.targets2 = event.targets.slice(0); event.targets.sort(lib.sort.seat); - } - else{ + } else { event.finish(); } - 'step 2' - if(event.targets.length){ - var target=event.targets.shift(); + ("step 2"); + if (event.targets.length) { + var target = event.targets.shift(); target.draw(); - event.current=target; - } - else{ + event.current = target; + } else { event.finish(); } - 'step 3' - if(event.current&&event.current.countCards('he')){ - if(!player.storage.mobileyanzhu||event.targets2.length==1) event.current.chooseCard('选择一张牌置于牌堆顶','he',true); - else event.current.chooseCardTarget({ - prompt:'将一张牌置于牌堆顶,或交给其他目标角色', - filterCard:true, - position:'he', - filterTarget:function(card,player,target){ - return target!=player&&_status.event.getParent().targets2.includes(target); - }, - forced:true, - selectTarget:[0,1], - ai1:(card)=>6-get.value(card), - ai2:(target)=>get.attitude(_status.event.player,target), - }); - } - else{ + ("step 3"); + if (event.current && event.current.countCards("he")) { + if (!player.storage.mobileyanzhu || event.targets2.length == 1) + event.current.chooseCard("选择一张牌置于牌堆顶", "he", true); + else + event.current.chooseCardTarget({ + prompt: "将一张牌置于牌堆顶,或交给其他目标角色", + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { + return ( + target != player && + _status.event.getParent().targets2.includes(target) + ); + }, + forced: true, + selectTarget: [0, 1], + ai1: (card) => 6 - get.value(card), + ai2: (target) => get.attitude(_status.event.player, target), + }); + } else { event.goto(2); } - 'step 4' - if(result&&result.cards){ - event.card=result.cards[0]; - if(!result.targets||!result.targets.length){ - event.current.lose(result.cards,ui.cardPile,'insert'); - game.broadcastAll(function(player){ - var cardx=ui.create.card(); - cardx.classList.add('infohidden'); - cardx.classList.add('infoflip'); - player.$throw(cardx,1000,'nobroadcast'); - },event.current); - } - else{ - event.current.give(result.cards,result.targets[0]); + ("step 4"); + if (result && result.cards) { + event.card = result.cards[0]; + if (!result.targets || !result.targets.length) { + event.current.lose(result.cards, ui.cardPile, "insert"); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, event.current); + } else { + event.current.give(result.cards, result.targets[0]); } + } else { + event.card = null; } - else{ - event.card=null; - } - 'step 5' + ("step 5"); event.goto(2); }, - derivation:'mobilexingxuex', + derivation: "mobilexingxuex", }, - mobileyanzhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.countCards('hej')>0&&target!=player; + mobileyanzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("hej") > 0 && target != player; }, - content:function(){ - 'step 0' - if(target.countCards('e')){ - target.chooseBool('是否将装备区内的所有牌交给'+get.translation(player)+'?','若选择“取消”,则其将获得你区域里的一张牌').set('ai',function(){ - if(_status.event.effect>0) return false; - if(_status.event.player.countCards('e')>=3) return false; - return true; - }).set('effect',get.effect(target,{name:'shunshou'},player,target)); - } - else{ - player.gainPlayerCard(target,true,'he'); + content: function () { + "step 0"; + if (target.countCards("e")) { + target + .chooseBool( + "是否将装备区内的所有牌交给" + get.translation(player) + "?", + "若选择“取消”,则其将获得你区域里的一张牌" + ) + .set("ai", function () { + if (_status.event.effect > 0) return false; + if (_status.event.player.countCards("e") >= 3) return false; + return true; + }) + .set("effect", get.effect(target, { name: "shunshou" }, player, target)); + } else { + player.gainPlayerCard(target, true, "he"); event.finish(); } - 'step 1' - if(result.bool){ - var es=target.getCards('e'); - target.give(es,player,'give'); - player.removeSkills('mobileyanzhu'); - player.storage.mobileyanzhu=true; - player.popup('兴学'); - game.log(player,'修改了技能','#g【兴学】'); - } - else{ - player.gainPlayerCard(target,true,'hej'); + ("step 1"); + if (result.bool) { + var es = target.getCards("e"); + target.give(es, player, "give"); + player.removeSkills("mobileyanzhu"); + player.storage.mobileyanzhu = true; + player.popup("兴学"); + game.log(player, "修改了技能", "#g【兴学】"); + } else { + player.gainPlayerCard(target, true, "hej"); } }, - ai:{ - order:6, - result:{ - target:function(player,target){ - var ne=target.countCards('e'),nj=target.countCards('j'); - if(nj) return 2.5; - if(!ne) return -2; - if(ne>=2) return -ne; + ai: { + order: 6, + result: { + target: function (player, target) { + var ne = target.countCards("e"), + nj = target.countCards("j"); + if (nj) return 2.5; + if (!ne) return -2; + if (ne >= 2) return -ne; return 0; }, }, }, }, //毛玠 - bingqing:{ - audio:2, - trigger:{player:'useCardAfter'}, - direct:true, - filter:function(event,player){ - var suit=get.suit(event.card); - if(!lib.suit.includes(suit)) return false; - var evt=event.getParent('phaseUse'); - if(!evt||player!=evt.player) return false; - var list=[],history=player.getHistory('useCard'); - if(history.length<2) return false; - for(var i of history){ - if(i.getParent('phaseUse')!=evt) continue; - var suit2=get.suit(i.card); - if(!lib.suit.includes(suit2)) continue; - if(i!=event&&suit2==suit) return false; - if(i.finished) list.add(suit2); + bingqing: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + var suit = get.suit(event.card); + if (!lib.suit.includes(suit)) return false; + var evt = event.getParent("phaseUse"); + if (!evt || player != evt.player) return false; + var list = [], + history = player.getHistory("useCard"); + if (history.length < 2) return false; + for (var i of history) { + if (i.getParent("phaseUse") != evt) continue; + var suit2 = get.suit(i.card); + if (!lib.suit.includes(suit2)) continue; + if (i != event && suit2 == suit) return false; + if (i.finished) list.add(suit2); } - return list.length>1&&list.length<5; + return list.length > 1 && list.length < 5; }, - content:function(){ - 'step 0' - var suit=get.suit(trigger.card); - var evt=event.getParent('phaseUse'); - var list=[],history=player.getHistory('useCard'); - for(var i of history){ - if(i.getParent('phaseUse')!=evt) continue; - var suit2=get.suit(i.card); - if(!lib.suit.includes(suit2)) continue; - if(i.finished) list.add(suit2); + content: function () { + "step 0"; + var suit = get.suit(trigger.card); + var evt = event.getParent("phaseUse"); + var list = [], + history = player.getHistory("useCard"); + for (var i of history) { + if (i.getParent("phaseUse") != evt) continue; + var suit2 = get.suit(i.card); + if (!lib.suit.includes(suit2)) continue; + if (i.finished) list.add(suit2); } - var prompt,filterTarget,ai; - switch(list.length){ + var prompt, filterTarget, ai; + switch (list.length) { case 2: - prompt='令一名角色摸两张牌'; - filterTarget=function(card,player,target){ + prompt = "令一名角色摸两张牌"; + filterTarget = function (card, player, target) { return true; }; - ai=function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(target.hasSkill('nogain')) att/=10; - return att/Math.sqrt(Math.min(5,1+target.countCards('h'))); - } + ai = function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.hasSkill("nogain")) att /= 10; + return att / Math.sqrt(Math.min(5, 1 + target.countCards("h"))); + }; break; case 3: - prompt='弃置一名角色区域内的一张牌'; - filterTarget=function(card,player,target){ - return target.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,target); - },'hej'); + prompt = "弃置一名角色区域内的一张牌"; + filterTarget = function (card, player, target) { + return target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "hej"); + }; + ai = function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy" }, player, player); }; - ai=function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy'},player,player); - } break; case 4: - prompt='对一名其他角色造成1点伤害'; - filterTarget=function(card,player,target){ - return target!=player; + prompt = "对一名其他角色造成1点伤害"; + filterTarget = function (card, player, target) { + return target != player; + }; + ai = function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); }; - ai=function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - } break; default: event.finish(); return; } - event.num=list.length; - player.chooseTarget(get.prompt('bingqing'),prompt,filterTarget).set('ai',ai); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('bingqing',target); - event.target=target; + event.num = list.length; + player.chooseTarget(get.prompt("bingqing"), prompt, filterTarget).set("ai", ai); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("bingqing", target); + event.target = target; event.goto(num); - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); target.draw(2); event.finish(); - 'step 3' - player.discardPlayerCard(target,true,'hej'); + ("step 3"); + player.discardPlayerCard(target, true, "hej"); event.finish(); - 'step 4' + ("step 4"); target.damage(); }, }, - yingfeng:{ - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('yingfeng'),'令一名角色获得“奉”标记',function(card,player,target){ - return !target.hasSkill('yingfeng_mark'); - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<=0) return 0; - var eff=0.1; - var preTarget=game.findPlayer(function(current){ - return (current!=target&¤t.hasSkill('yingfeng_mark')); + yingfeng: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("yingfeng"), + "令一名角色获得“奉”标记", + function (card, player, target) { + return !target.hasSkill("yingfeng_mark"); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return 0; + var eff = 0.1; + var preTarget = game.findPlayer(function (current) { + return current != target && current.hasSkill("yingfeng_mark"); + }); + if (preTarget) { + if (get.attitude(player, preTarget) < 0) eff += 4; + else if ( + preTarget.hasValueTarget({ name: "sha" }, false) && + !preTarget.hasValueTarget({ name: "sha" }) + ) + eff -= 3; + } + if ( + target.hasValueTarget({ name: "sha" }, false) && + !target.hasValueTarget({ name: "sha" }) + ) + eff += 3; + if (player == target) att *= 1.2; + return 0.01 + att * eff; }); - if(preTarget){ - if(get.attitude(player,preTarget)<0) eff+=4; - else if(preTarget.hasValueTarget({name:'sha'},false)&&!preTarget.hasValueTarget({name:'sha'})) eff-=3; - } - if(target.hasValueTarget({name:'sha'},false)&&!target.hasValueTarget({name:'sha'})) eff+=3; - if(player==target) att*=1.2; - return 0.01+att*eff; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('yingfeng',target); - target.addAdditionalSkill('yingfeng_'+player.playerid,'yingfeng_mark'); - game.countPlayer(function(current){ - if(current!=target&¤t.hasSkill('yingfeng_mark')){ - current.removeSkill('yingfeng_mark'); - current.removeAdditionalSkill('yingfeng_'+player.playerid); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yingfeng", target); + target.addAdditionalSkill("yingfeng_" + player.playerid, "yingfeng_mark"); + game.countPlayer(function (current) { + if (current != target && current.hasSkill("yingfeng_mark")) { + current.removeSkill("yingfeng_mark"); + current.removeAdditionalSkill("yingfeng_" + player.playerid); } }); } }, - subSkill:{ - mark:{ - charlotte:true, - mark:true, - marktext:'奉', - mod:{ - targetInRange:()=>true, + subSkill: { + mark: { + charlotte: true, + mark: true, + marktext: "奉", + mod: { + targetInRange: () => true, }, - intro:{content:'使用牌无距离限制'}, + intro: { content: "使用牌无距离限制" }, }, }, }, //猩黄忠 - spshidi:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - forced:true, - zhuanhuanji:'number', - filter:function(event,player){ - return (player.countMark('spshidi')%2)==['phaseJieshu','phaseZhunbei'].indexOf(event.name); + spshidi: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + zhuanhuanji: "number", + filter: function (event, player) { + return ( + player.countMark("spshidi") % 2 == ["phaseJieshu", "phaseZhunbei"].indexOf(event.name) + ); }, - content:function(){ - player.changeZhuanhuanji('spshidi'); + content: function () { + player.changeZhuanhuanji("spshidi"); }, - mod:{ - globalFrom:function(from,to,distance){ - if(from.countMark('spshidi')%2==0) return distance-1; + mod: { + globalFrom: function (from, to, distance) { + if (from.countMark("spshidi") % 2 == 0) return distance - 1; }, - globalTo:function(from,to,distance){ - if(to.countMark('spshidi')%2==1) return distance+1; + globalTo: function (from, to, distance) { + if (to.countMark("spshidi") % 2 == 1) return distance + 1; }, - aiOrder:function(player,card,num){ - if(player.countMark('spshidi')%2==0&&card.name=='sha'&&get.color(card)=='black') return num+0.1; + aiOrder: function (player, card, num) { + if ( + player.countMark("spshidi") % 2 == 0 && + card.name == "sha" && + get.color(card) == "black" + ) + return num + 0.1; }, }, - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - return '已转换过'+(storage||0)+'次'; + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + return "已转换过" + (storage || 0) + "次"; }, }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.card||!arg.target||(arg.card.name!='sha')) return false; - return player.countMark('spshidi')%2==0&&get.color(arg.card)=='black'; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || !arg.target || arg.card.name != "sha") return false; + return player.countMark("spshidi") % 2 == 0 && get.color(arg.card) == "black"; }, }, - group:['spshidi_use','spshidi_beused'], - subSkill:{ - use:{ - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.countMark('spshidi')%2==0&&get.color(event.card,false)=='black'; + group: ["spshidi_use", "spshidi_beused"], + subSkill: { + use: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + player.countMark("spshidi") % 2 == 0 && + get.color(event.card, false) == "black" + ); }, - content:function(){ + content: function () { trigger.directHit.addArray(game.players); }, }, - beused:{ - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.countMark('spshidi')%2==1&&get.color(event.card,false)=='red'; + beused: { + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + player.countMark("spshidi") % 2 == 1 && + get.color(event.card, false) == "red" + ); }, - content:function(){ + content: function () { trigger.directHit.add(player); }, }, }, }, - spyishi:{ - audio:2, - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - return player!=event.player&&event.player.countCards('e')>0; + spyishi: { + audio: 2, + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return player != event.player && event.player.countCards("e") > 0; }, - check:function(event,player){ - return get.damageEffect(event.player,player,player)<0||(!event.player.hasSkillTag('noe')&&event.player.hasCard(function(card){ - return get.value(card)>6; - },'e')) + check: function (event, player) { + return ( + get.damageEffect(event.player, player, player) < 0 || + (!event.player.hasSkillTag("noe") && + event.player.hasCard(function (card) { + return get.value(card) > 6; + }, "e")) + ); }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.num--; - player.gainPlayerCard(trigger.player,'e',true); + player.gainPlayerCard(trigger.player, "e", true); }, }, - spqishe:{ - enable:'chooseToUse', - viewAs:{name:'jiu'}, - filterCard:{type:'equip'}, - position:'hes', - viewAsFilter:function(player){ - return player.hasCard({type:'equip'},'ehs'); + spqishe: { + enable: "chooseToUse", + viewAs: { name: "jiu" }, + filterCard: { type: "equip" }, + position: "hes", + viewAsFilter: function (player) { + return player.hasCard({ type: "equip" }, "ehs"); }, - check:function(card){ - if(_status.event.type=='dying') return 1/(get.value(card)||0.5); - return 5-get.value(card); + check: function (card) { + if (_status.event.type == "dying") return 1 / (get.value(card) || 0.5); + return 5 - get.value(card); }, - locked:false, - mod:{ - maxHandcard:function(player,num){ - return num+player.countCards('e'); + locked: false, + mod: { + maxHandcard: function (player, num) { + return num + player.countCards("e"); }, }, }, //虞翻 - rezongxuan:{ - inherit:'zongxuan', - group:'rezongxuan_place', + rezongxuan: { + inherit: "zongxuan", + group: "rezongxuan_place", }, - rezongxuan_place:{ - audio:'rezongxuan', - enable:'phaseUse', - usable:1, - content:function(){ - 'step 0' + rezongxuan_place: { + audio: "rezongxuan", + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; player.draw(); - 'step 1' - player.chooseCard('he',true,'将一张牌置于牌堆顶'); - 'step 2' - if(result&&result.cards){ - event.card=result.cards[0]; - player.lose(result.cards,ui.cardPile,'insert'); - game.log(player,'将',(get.position(event.card)=='h'?'一张牌':event.card),'置于牌堆顶'); - game.broadcastAll(function(player){ - var cardx=ui.create.card(); - cardx.classList.add('infohidden'); - cardx.classList.add('infoflip'); - player.$throw(cardx,1000,'nobroadcast'); - },player); - } - else event.finish(); + ("step 1"); + player.chooseCard("he", true, "将一张牌置于牌堆顶"); + ("step 2"); + if (result && result.cards) { + event.card = result.cards[0]; + player.lose(result.cards, ui.cardPile, "insert"); + game.log( + player, + "将", + get.position(event.card) == "h" ? "一张牌" : event.card, + "置于牌堆顶" + ); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, player); + } else event.finish(); }, - ai:{ - order:1, - result:{player:1}, + ai: { + order: 1, + result: { player: 1 }, }, }, //孙寒华 - chongxu:{ - enable:'phaseUse', - usable:1, - content:function(){ - 'step 0' + chongxu: { + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; player.chooseToPlayBeatmap(lib.skill.chongxu.beatmaps.randomGet()); - 'step 1' - var score=Math.floor(Math.min(5,result.accuracy/17)); - event.score=score; - game.log(player,'的演奏评级为','#y'+result.rank[0],',获得积分点数','#y'+score,'分'); - if(score<3){ - if(score>=2) player.draw(); + ("step 1"); + var score = Math.floor(Math.min(5, result.accuracy / 17)); + event.score = score; + game.log( + player, + "的演奏评级为", + "#y" + result.rank[0], + ",获得积分点数", + "#y" + score, + "分" + ); + if (score < 3) { + if (score >= 2) player.draw(); event.finish(); return; } - var list=[]; - if(player.countMark('miaojian')<2&&player.hasSkill('miaojian')) list.push('修改【妙剑】'); - if(player.countMark('shhlianhua')<2&&player.hasSkill('shhlianhua')) list.push('修改【莲华】'); - if(list.length){ - list.push('全部摸牌'); - player.chooseControl(list).set('prompt','冲虚:修改技能'+(score==5?'并摸一张牌':'')+';或摸'+Math.floor(score/2)+'张牌'); + var list = []; + if (player.countMark("miaojian") < 2 && player.hasSkill("miaojian")) + list.push("修改【妙剑】"); + if (player.countMark("shhlianhua") < 2 && player.hasSkill("shhlianhua")) + list.push("修改【莲华】"); + if (list.length) { + list.push("全部摸牌"); + player + .chooseControl(list) + .set( + "prompt", + "冲虚:修改技能" + + (score == 5 ? "并摸一张牌" : "") + + ";或摸" + + Math.floor(score / 2) + + "张牌" + ); + } else event._result = { control: "全部摸牌" }; + ("step 2"); + var score = event.score; + if (result.control != "全部摸牌") { + score -= 3; + var skill = result.control == "修改【妙剑】" ? "miaojian" : "shhlianhua"; + player.addMark(skill, 1, false); + game.log(player, "修改了技能", "#g【" + get.translation(skill) + "】"); } - else event._result={control:'全部摸牌'}; - 'step 2' - var score=event.score; - if(result.control!='全部摸牌'){ - score-=3; - var skill=result.control=='修改【妙剑】'?'miaojian':'shhlianhua'; - player.addMark(skill,1,false); - game.log(player,'修改了技能','#g【'+get.translation(skill)+'】'); - } - if(score>1) player.draw(Math.floor(score/2)); + if (score > 1) player.draw(Math.floor(score / 2)); }, - ai:{ - order:10, - result:{ - player:1, + ai: { + order: 10, + result: { + player: 1, }, }, - beatmaps:[ + beatmaps: [ { //歌曲名称 - name:'鳥の詩', + name: "鳥の詩", //歌曲文件名(默认在audio/effect文件夹下 若要重定向到扩展 请写为'ext:扩展名称/文件名'的格式) - filename:'tori_no_uta', + filename: "tori_no_uta", //每个音符的开始时间点(毫秒,相对未偏移的开始播放时间) - timeleap:[1047,3012,4978,5469,5961,6452,6698,7435,8909,10875,12840], + timeleap: [1047, 3012, 4978, 5469, 5961, 6452, 6698, 7435, 8909, 10875, 12840], //开始播放时间的偏移量(毫秒) - current:-110, + current: -110, //判定栏高度(相对整个对话框高度比例) - judgebar_height:0.16, + judgebar_height: 0.16, //Good/Great/Prefect的位置判定范围(百分比,相对于整个对话框。以滑条的底部作为判定基准) - range1:[84,110], - range2:[90,104], - range3:[94,100], + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], //滑条每相对于整个对话框下落1%所需的时间(毫秒) - speed:25, + speed: 25, }, { - name:'竹取飛翔 ~ Lunatic Princess', - filename:'taketori_hishou', - timeleap:[1021,1490,1959,2896,3834,4537,4771,5709,6646,7585,8039,8494,9403,10291,11180,11832,12049,12920,13345,13771,14196], - current:-110, - judgebar_height:0.16, - range1:[84,110], - range2:[90,104], - range3:[94,100], - speed:25, - node_color:'linear-gradient(rgba(250, 170, 190, 1), rgba(240, 160, 180, 1))', - judgebar_color:'linear-gradient(rgba(240, 120, 243, 1), rgba(245, 106, 230, 1))', + name: "竹取飛翔 ~ Lunatic Princess", + filename: "taketori_hishou", + timeleap: [ + 1021, 1490, 1959, 2896, 3834, 4537, 4771, 5709, 6646, 7585, 8039, 8494, 9403, + 10291, 11180, 11832, 12049, 12920, 13345, 13771, 14196, + ], + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(rgba(250, 170, 190, 1), rgba(240, 160, 180, 1))", + judgebar_color: "linear-gradient(rgba(240, 120, 243, 1), rgba(245, 106, 230, 1))", }, { - name:'ignotus', - filename:'ignotus', + name: "ignotus", + filename: "ignotus", //Number of tracks //轨道数量 - number_of_tracks:4, + number_of_tracks: 4, //Customize the track to generate for every note (0 is the first track) //自定义每个音符生成的轨道(0是第一个轨道) - mapping:[0,2,3,1,1,0,3,0,0,3,0,0,2,1,2], + mapping: [0, 2, 3, 1, 1, 0, 3, 0, 0, 3, 0, 0, 2, 1, 2], //Convert from beats (0 is the first beat) to timeleap //将节拍(0是第一拍)转换为开始时间点 - timeleap:game.generateBeatmapTimeleap(170,[0,4,8,12,14,16,16.5,23.5,24,31,32,40,45,46,47]), - current:-110, - judgebar_height:0.16, - range1:[84,110], - range2:[90,104], - range3:[94,100], - speed:25, - node_color:'linear-gradient(rgba(240, 250, 240, 1), rgba(230, 240, 230, 1))', - judgebar_color:'linear-gradient(rgba(161, 59, 150, 1), rgba(58, 43, 74, 1))', + timeleap: game.generateBeatmapTimeleap( + 170, + [0, 4, 8, 12, 14, 16, 16.5, 23.5, 24, 31, 32, 40, 45, 46, 47] + ), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(rgba(240, 250, 240, 1), rgba(230, 240, 230, 1))", + judgebar_color: "linear-gradient(rgba(161, 59, 150, 1), rgba(58, 43, 74, 1))", }, { - name:'Super Mario 3D World Theme', - filename:'sm3dw_overworld', + name: "Super Mario 3D World Theme", + filename: "sm3dw_overworld", //Random (Randomly choose tracks to generate notes each play) //随机(每次演奏时音符会随机选择轨道生成) - mapping:'random', - timeleap:[0,1071,1518,2054,4018,4286,5357,6429,7500,8571,9643,10714,11786,12321,12589,12857,13929,15000,16071,17143,18214,18482,18750,19018,19286,20357], - current:-110, - judgebar_height:0.16, - range1:[84,110], - range2:[90,104], - range3:[94,100], - speed:25, - node_color:'linear-gradient(rgba(120, 130, 240, 1), rgba(100, 100, 230, 1))', - judgebar_color:'linear-gradient(rgba(230, 40, 30, 1), rgba(220, 30, 10, 1))', + mapping: "random", + timeleap: [ + 0, 1071, 1518, 2054, 4018, 4286, 5357, 6429, 7500, 8571, 9643, 10714, 11786, + 12321, 12589, 12857, 13929, 15000, 16071, 17143, 18214, 18482, 18750, 19018, + 19286, 20357, + ], + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(rgba(120, 130, 240, 1), rgba(100, 100, 230, 1))", + judgebar_color: "linear-gradient(rgba(230, 40, 30, 1), rgba(220, 30, 10, 1))", }, { - name:'只因你太美', - filename:'chicken_you_are_so_beautiful', - number_of_tracks:7, - mapping:[3,6,4,5,6,2,3,2,1,2,0,4,3,6,5,4,3,6,3,2,3,1,0,1,2,3,4,5,6], - timeleap:game.generateBeatmapTimeleap(107,[2,3.5,4.5,5.5,6.5,8.5,10,11.5,12.5,13.5,14.5,15.5,18,19.5,20.5,21.5,22.5,24.5,26,27.5,28.5,29.5,30.5,31,31.5,32,32.5,33,33.5]), + name: "只因你太美", + filename: "chicken_you_are_so_beautiful", + number_of_tracks: 7, + mapping: [ + 3, 6, 4, 5, 6, 2, 3, 2, 1, 2, 0, 4, 3, 6, 5, 4, 3, 6, 3, 2, 3, 1, 0, 1, 2, 3, 4, + 5, 6, + ], + timeleap: game.generateBeatmapTimeleap( + 107, + [ + 2, 3.5, 4.5, 5.5, 6.5, 8.5, 10, 11.5, 12.5, 13.5, 14.5, 15.5, 18, 19.5, 20.5, + 21.5, 22.5, 24.5, 26, 27.5, 28.5, 29.5, 30.5, 31, 31.5, 32, 32.5, 33, 33.5, + ] + ), //Hitsound file name (By default in the audio/effect folder. To redirect to the extension, please write in the format of 'ext:extension_name') //打击音文件名(默认在audio/effect文件夹下 若要重定向到扩展 请写为'ext:扩展名称'的格式) - hitsound:'chickun.wav', - current:-110, - judgebar_height:0.16, - range1:[84,110], - range2:[90,104], - range3:[94,100], - speed:25, - node_color:'linear-gradient(#99f, #66c)', - judgebar_color:'linear-gradient(#ccf, #99c)', + hitsound: "chickun.wav", + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#99f, #66c)", + judgebar_color: "linear-gradient(#ccf, #99c)", }, { - name:'Croatian Rhapsody', - filename:'croatian_rhapsody', - mapping:[4,1,2,1,0,0,4,5,1,3,2,1,0,0], - timeleap:game.generateBeatmapTimeleap(96,[4,6,8,9,10,11,12,13.5,14,15.5,16,17,18,19]), - current:-110, - judgebar_height:0.16, - range1:[84,110], - range2:[90,104], - range3:[94,100], - speed:25, - node_color:'linear-gradient(#fff, #ccc)', - judgebar_color:'linear-gradient(#fff, #ccc)', + name: "Croatian Rhapsody", + filename: "croatian_rhapsody", + mapping: [4, 1, 2, 1, 0, 0, 4, 5, 1, 3, 2, 1, 0, 0], + timeleap: game.generateBeatmapTimeleap( + 96, + [4, 6, 8, 9, 10, 11, 12, 13.5, 14, 15.5, 16, 17, 18, 19] + ), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#fff, #ccc)", + judgebar_color: "linear-gradient(#fff, #ccc)", }, { - name:'罗刹海市', - filename:'rakshasa_sea_city', - number_of_tracks:7, - mapping:'random', - timeleap:game.generateBeatmapTimeleap(150,[0,2,4,6,7,9,11,13,14,16,18,20,21,23,25,27]), - current:-110, - judgebar_height:0.16, - range1:[84,110], - range2:[90,104], - range3:[94,100], - speed:25, - node_color:'linear-gradient(#333, #000)', - judgebar_color:'linear-gradient(#c66, #933)', + name: "罗刹海市", + filename: "rakshasa_sea_city", + number_of_tracks: 7, + mapping: "random", + timeleap: game.generateBeatmapTimeleap( + 150, + [0, 2, 4, 6, 7, 9, 11, 13, 14, 16, 18, 20, 21, 23, 25, 27] + ), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#333, #000)", + judgebar_color: "linear-gradient(#c66, #933)", }, { - name:'Pigstep (Stereo Mix)', - filename:'pigstep', - number_of_tracks:16, - timeleap:game.generateBeatmapTimeleap(170,[3,4,6,6.5,7.5,11,12,14,14.5,15.5,19,20,22,22.5,23.5,27,28,30,30.5,31.5,35,36,38,38.5,39.5,43,44,46,46.5,47.5,51,52,54,54.5,55.5,59,60,62,62.5]), - current:-110, - judgebar_height:0.16, - range1:[84,110], - range2:[90,104], - range3:[94,100], - speed:25, - node_color:'linear-gradient(#066, #033)', - judgebar_color:'linear-gradient(#633, #300)', + name: "Pigstep (Stereo Mix)", + filename: "pigstep", + number_of_tracks: 16, + timeleap: game.generateBeatmapTimeleap( + 170, + [ + 3, 4, 6, 6.5, 7.5, 11, 12, 14, 14.5, 15.5, 19, 20, 22, 22.5, 23.5, 27, 28, 30, + 30.5, 31.5, 35, 36, 38, 38.5, 39.5, 43, 44, 46, 46.5, 47.5, 51, 52, 54, 54.5, + 55.5, 59, 60, 62, 62.5, + ] + ), + current: -110, + judgebar_height: 0.16, + range1: [84, 110], + range2: [90, 104], + range3: [94, 100], + speed: 25, + node_color: "linear-gradient(#066, #033)", + judgebar_color: "linear-gradient(#633, #300)", }, ], - derivation:'chongxu_faq', + derivation: "chongxu_faq", }, - miaojian:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var level=player.countMark('miaojian'); - if(event.filterCard({name:'sha',nature:'stab'},player,event)){ - if(level==2) return true; - if(level==1&&player.hasCard(function(card){ - return get.type2(card)=='basic'; - },'hs')) return true; - if(level==0&&player.hasCard(function(card){ - return get.name(card)=='sha'; - },'hs')) return true; + miaojian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var level = player.countMark("miaojian"); + if (event.filterCard({ name: "sha", nature: "stab" }, player, event)) { + if (level == 2) return true; + if ( + level == 1 && + player.hasCard(function (card) { + return get.type2(card) == "basic"; + }, "hs") + ) + return true; + if ( + level == 0 && + player.hasCard(function (card) { + return get.name(card) == "sha"; + }, "hs") + ) + return true; } - if(event.filterCard({name:'wuzhong'},player,event)){ - if(level==2) return true; - if(level==1&&player.hasCard(function(card){ - return get.type2(card)!='basic'; - },'hes')) return true; - if(level==0&&player.hasCard(function(card){ - return get.type2(card)=='trick'; - },'hs')) return true; + if (event.filterCard({ name: "wuzhong" }, player, event)) { + if (level == 2) return true; + if ( + level == 1 && + player.hasCard(function (card) { + return get.type2(card) != "basic"; + }, "hes") + ) + return true; + if ( + level == 0 && + player.hasCard(function (card) { + return get.type2(card) == "trick"; + }, "hs") + ) + return true; } return false; }, - chooseButton:{ - dialog:function(){ - return ui.create.dialog('妙剑',[[ - ['基本','','sha','stab'], - ['锦囊','','wuzhong'], - ],'vcard']); + chooseButton: { + dialog: function () { + return ui.create.dialog("妙剑", [ + [ + ["基本", "", "sha", "stab"], + ["锦囊", "", "wuzhong"], + ], + "vcard", + ]); }, - filter:function(button,player){ - var event=_status.event.getParent(),level=player.countMark('miaojian'); - if(button.link[2]=='sha'){ - if(!event.filterCard({name:'sha',nature:'stab'},player,event)) return false; - if(level==2) return true; - if(level==1) return player.hasCard(function(card){ - return get.type2(card)=='basic'; - },'hs'); - return level==0&&player.hasCard(function(card){ - return get.name(card)=='sha'; - },'hs'); + filter: function (button, player) { + var event = _status.event.getParent(), + level = player.countMark("miaojian"); + if (button.link[2] == "sha") { + if (!event.filterCard({ name: "sha", nature: "stab" }, player, event)) + return false; + if (level == 2) return true; + if (level == 1) + return player.hasCard(function (card) { + return get.type2(card) == "basic"; + }, "hs"); + return ( + level == 0 && + player.hasCard(function (card) { + return get.name(card) == "sha"; + }, "hs") + ); } - if(button.link[2]=='wuzhong'){ - if(!event.filterCard({name:'wuzhong'},player,event)) return false; - if(level==2) return true; - if(level==1) return player.hasCard(function(card){ - return get.type2(card)!='basic'; - },'hes'); - return level==0&&player.hasCard(function(card){ - return get.type2(card)=='trick'; - },'hs'); + if (button.link[2] == "wuzhong") { + if (!event.filterCard({ name: "wuzhong" }, player, event)) return false; + if (level == 2) return true; + if (level == 1) + return player.hasCard(function (card) { + return get.type2(card) != "basic"; + }, "hes"); + return ( + level == 0 && + player.hasCard(function (card) { + return get.type2(card) == "trick"; + }, "hs") + ); } }, - check:function(button){ - var card={name:button.link[2],nature:button.link[3]},player=_status.event.player; - return get.value(card,player)*get.sgn(player.getUseValue(card)); + check: function (button) { + var card = { name: button.link[2], nature: button.link[3] }, + player = _status.event.player; + return get.value(card, player) * get.sgn(player.getUseValue(card)); }, - backup:function(links,player){ - var index=(links[0][2]=='sha'?0:1),level=player.countMark('miaojian'); - var next={ - audio:'miaojian', - filterCard:[[ - function(card){ - return get.name(card)=='sha'; - }, - function(card){ - return get.type(card)=='basic'; - }, - ()=>false, - ],[ - function(card){ - return get.type2(card)=='trick'; - }, - function(card){ - return get.type(card)!='basic'; - }, - ()=>false, - ]][index][level], - position:'hes', - check:function(card){ - if(card) return 6.5-get.value(card); + backup: function (links, player) { + var index = links[0][2] == "sha" ? 0 : 1, + level = player.countMark("miaojian"); + var next = { + audio: "miaojian", + filterCard: [ + [ + function (card) { + return get.name(card) == "sha"; + }, + function (card) { + return get.type(card) == "basic"; + }, + () => false, + ], + [ + function (card) { + return get.type2(card) == "trick"; + }, + function (card) { + return get.type(card) != "basic"; + }, + () => false, + ], + ][index][level], + position: "hes", + check: function (card) { + if (card) return 6.5 - get.value(card); return 1; }, - viewAs:[{ - name:'sha', - nature:'stab', - },{ - name:'wuzhong', - }][index], - } - if(level==2){ - next.selectCard=-1; - next.viewAs.isCard=true; + viewAs: [ + { + name: "sha", + nature: "stab", + }, + { + name: "wuzhong", + }, + ][index], + }; + if (level == 2) { + next.selectCard = -1; + next.viewAs.isCard = true; } return next; }, - prompt:function(links,player){ - var index=(links[0][2]=='sha'?0:1),level=player.countMark('miaojian'); - return [[ - '将一张【杀】当做刺【杀】使用', - '将一张基本牌当做刺【杀】使用', - '请选择刺【杀】的目标', - ],[ - '将一张锦囊牌当做【无中生有】使用', - '将一张非基本牌当做【无中生有】使用', - '请选择【无中生有】的目标', - ]][index][level]; + prompt: function (links, player) { + var index = links[0][2] == "sha" ? 0 : 1, + level = player.countMark("miaojian"); + return [ + [ + "将一张【杀】当做刺【杀】使用", + "将一张基本牌当做刺【杀】使用", + "请选择刺【杀】的目标", + ], + [ + "将一张锦囊牌当做【无中生有】使用", + "将一张非基本牌当做【无中生有】使用", + "请选择【无中生有】的目标", + ], + ][index][level]; }, }, - onremove:true, - derivation:['miaojian1','miaojian2'], - subSkill:{backup:{audio:'miaojian'}}, - ai:{ - order:7, - result:{player:1}, + onremove: true, + derivation: ["miaojian1", "miaojian2"], + subSkill: { backup: { audio: "miaojian" } }, + ai: { + order: 7, + result: { player: 1 }, }, }, - shhlianhua:{ - audio:2, - derivation:['shhlianhua1','shhlianhua2'], - trigger:{target:'useCardToTargeted'}, - forced:true, - locked:false, - filter:(event)=>event.card.name=='sha', - content:function(){ - 'step 0' + shhlianhua: { + audio: 2, + derivation: ["shhlianhua1", "shhlianhua2"], + trigger: { target: "useCardToTargeted" }, + forced: true, + locked: false, + filter: (event) => event.card.name == "sha", + content: function () { + "step 0"; player.draw(); - var level=player.countMark('shhlianhua'); - if(!level) event.finish(); - else if(level==2) event.goto(2); - else player.judge(function(result){ - return get.suit(result)=='spade'?1:-1; - }).set('judge2',(result)=>result.bool); - 'step 1' - if(result.bool) trigger.excluded.add(player); + var level = player.countMark("shhlianhua"); + if (!level) event.finish(); + else if (level == 2) event.goto(2); + else + player + .judge(function (result) { + return get.suit(result) == "spade" ? 1 : -1; + }) + .set("judge2", (result) => result.bool); + ("step 1"); + if (result.bool) trigger.excluded.add(player); event.finish(); - 'step 2' - var eff=get.effect(player,trigger.card,trigger.player,trigger.player); - trigger.player.chooseToDiscard('he','弃置一张牌,或令'+get.translation(trigger.card)+'对'+get.translation(player)+'无效').set('ai',function(card){ - if(_status.event.eff>0){ - return 10-get.value(card); - } - return 0; - }).set('eff',eff); - 'step 3' - if(result.bool==false){ + ("step 2"); + var eff = get.effect(player, trigger.card, trigger.player, trigger.player); + trigger.player + .chooseToDiscard( + "he", + "弃置一张牌,或令" + + get.translation(trigger.card) + + "对" + + get.translation(player) + + "无效" + ) + .set("ai", function (card) { + if (_status.event.eff > 0) { + return 10 - get.value(card); + } + return 0; + }) + .set("eff", eff); + ("step 3"); + if (result.bool == false) { trigger.getParent().excluded.add(player); } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'&¤t<0) return 0.7; - } + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && current < 0) return 0.7; + }, }, }, }, //阎圃 - huantu:{ - audio:2, - trigger:{global:'phaseDrawBefore'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0&&!player.hasSkill('huantu_round')&&player.inRange(event.player); + huantu: { + audio: 2, + trigger: { global: "phaseDrawBefore" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + !player.hasSkill("huantu_round") && + player.inRange(event.player) + ); }, - checkx:function(event,player){ - var target=event.player; - return get.attitude(player,target)>0&&(target.hasSkill('pingkou')||target.skipList.includes('phaseUse')||target.isDamaged()&&target.hp<=2||target.needsToDiscard()); + checkx: function (event, player) { + var target = event.player; + return ( + get.attitude(player, target) > 0 && + (target.hasSkill("pingkou") || + target.skipList.includes("phaseUse") || + (target.isDamaged() && target.hp <= 2) || + target.needsToDiscard()) + ); }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt('huantu',trigger.player),'交给其一张牌并令其暂时跳过摸牌阶段','he').set('ai',function(card){ - if(!_status.event.checkx) return 0; - return 1+Math.random(); - }).set('checkx',lib.skill.huantu.checkx(trigger,player)); - 'step 1' - if(result.bool){ - player.addTempSkill('huantu_round','roundStart'); - player.logSkill('huantu',trigger.player); - player.give(result.cards,trigger.player); + content: function () { + "step 0"; + player + .chooseCard( + get.prompt("huantu", trigger.player), + "交给其一张牌并令其暂时跳过摸牌阶段", + "he" + ) + .set("ai", function (card) { + if (!_status.event.checkx) return 0; + return 1 + Math.random(); + }) + .set("checkx", lib.skill.huantu.checkx(trigger, player)); + ("step 1"); + if (result.bool) { + player.addTempSkill("huantu_round", "roundStart"); + player.logSkill("huantu", trigger.player); + player.give(result.cards, trigger.player); trigger.cancel(); - player.addTempSkill('huantu_effect'); + player.addTempSkill("huantu_effect"); } }, - subSkill:{ - round:{ - charlotte:true, - mark:true, - intro:{content:'本轮已发动'}, + subSkill: { + round: { + charlotte: true, + mark: true, + intro: { content: "本轮已发动" }, }, - effect:{ - audio:'huantu', - trigger:{global:'phaseJieshuBegin'}, - forced:true, - charlotte:true, - logTarget:'player', - filter:function(event,player){ + effect: { + audio: "huantu", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + logTarget: "player", + filter: function (event, player) { return event.player.isIn(); }, - content:function(){ - 'step 0' - var str=get.translation(trigger.player); - player.chooseControl().set('choiceList',[ - '令'+str+'回复1点体力并摸两张牌', - '摸三张牌,然后交给'+str+'两张手牌', - ]).set('choice',trigger.player.isDamaged()?0:1); - 'step 1' - if(result.index==0){ + content: function () { + "step 0"; + var str = get.translation(trigger.player); + player + .chooseControl() + .set("choiceList", [ + "令" + str + "回复1点体力并摸两张牌", + "摸三张牌,然后交给" + str + "两张手牌", + ]) + .set("choice", trigger.player.isDamaged() ? 0 : 1); + ("step 1"); + if (result.index == 0) { trigger.player.recover(); trigger.player.draw(2); event.finish(); - } - else{ - event.target=trigger.player; + } else { + event.target = trigger.player; player.draw(3); } - 'step 2' - var hs=player.getCards('h'); - if(hs.length&&target.isIn()&&player.isIn()){ - if(hs.length<=2) event._result={bool:true,cards:hs}; - else player.chooseCard('h',2,true,'交给'+get.translation(target)+'两张手牌'); - } - else event.finish(); - 'step 3' - if(result.bool) player.give(result.cards,trigger.player); + ("step 2"); + var hs = player.getCards("h"); + if (hs.length && target.isIn() && player.isIn()) { + if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else + player.chooseCard( + "h", + 2, + true, + "交给" + get.translation(target) + "两张手牌" + ); + } else event.finish(); + ("step 3"); + if (result.bool) player.give(result.cards, trigger.player); }, }, }, }, - bihuo:{ - trigger:{global:'dyingAfter'}, - logTarget:'player', - limited:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ + bihuo: { + trigger: { global: "dyingAfter" }, + logTarget: "player", + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { return event.player.isIn(); }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ - player.awakenSkill('bihuo'); + content: function () { + player.awakenSkill("bihuo"); trigger.player.draw(3); - trigger.player.addTempSkill('bihuo_effect','roundStart'); - trigger.player.addMark('bihuo_effect',game.countPlayer(),false); + trigger.player.addTempSkill("bihuo_effect", "roundStart"); + trigger.player.addMark("bihuo_effect", game.countPlayer(), false); }, - subSkill:{ - effect:{ - onremove:true, - charlotte:true, - mod:{ - globalTo:function(from,to,distance){ - return distance+to.countMark('bihuo_effect'); + subSkill: { + effect: { + onremove: true, + charlotte: true, + mod: { + globalTo: function (from, to, distance) { + return distance + to.countMark("bihuo_effect"); }, }, - intro:{content:'其他角色至你的距离+#'}, + intro: { content: "其他角色至你的距离+#" }, }, }, }, //马元义 - jibing:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - filter:function(event,player){ - return player.getExpansions('jibing').length>0&&(event.filterCard(get.autoViewAs({name:'sha'},'unsure'),player,event)||event.filterCard(get.autoViewAs({name:'shan'},'unsure'),player,event)); + jibing: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + return ( + player.getExpansions("jibing").length > 0 && + (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) || + event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) + ); }, - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('集兵','hidden'); - if(event.filterCard(get.autoViewAs({name:'sha'},'unsure'),player,event)&&event.filterCard(get.autoViewAs({name:'shan'},'unsure'),player,event)){ - dialog._chooseButton=2; - var list=['sha','shan']; - dialog.add([list.map(i=>{ - return [i,get.translation(i)]; - }),'tdnodes']); - } - else dialog._cardName=event.filterCard(get.autoViewAs({name:'sha'},'unsure'),player,event)?'sha':'shan'; - dialog.add(player.getExpansions('jibing')); + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("集兵", "hidden"); + if ( + event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && + event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event) + ) { + dialog._chooseButton = 2; + var list = ["sha", "shan"]; + dialog.add([ + list.map((i) => { + return [i, get.translation(i)]; + }), + "tdnodes", + ]); + } else + dialog._cardName = event.filterCard( + get.autoViewAs({ name: "sha" }, "unsure"), + player, + event + ) + ? "sha" + : "shan"; + dialog.add(player.getExpansions("jibing")); return dialog; }, - filter:function(button){ - var evt=_status.event,player=_status.event.player; - if(evt.dialog){ - if(!evt.dialog._chooseButton){ - var evt2=_status.event.getParent(); - return evt2.filterCard(get.autoViewAs({name:evt.dialog._cardName},[button.link]),player,evt2); + filter: function (button) { + var evt = _status.event, + player = _status.event.player; + if (evt.dialog) { + if (!evt.dialog._chooseButton) { + var evt2 = _status.event.getParent(); + return evt2.filterCard( + get.autoViewAs({ name: evt.dialog._cardName }, [button.link]), + player, + evt2 + ); } - if(ui.selected.buttons.length){ - var str=ui.selected.buttons[0].link; - if(typeof str!='string'||typeof button.link=='string') return false; - var evt2=_status.event.getParent(); - return evt2.filterCard(get.autoViewAs({name:str},[button.link]),player,evt2); + if (ui.selected.buttons.length) { + var str = ui.selected.buttons[0].link; + if (typeof str != "string" || typeof button.link == "string") return false; + var evt2 = _status.event.getParent(); + return evt2.filterCard( + get.autoViewAs({ name: str }, [button.link]), + player, + evt2 + ); } - return typeof button.link=='string'; + return typeof button.link == "string"; } return false; }, - select:function(){ - return _status.event.dialog?(_status.event.dialog._chooseButton||1):1; + select: function () { + return _status.event.dialog ? _status.event.dialog._chooseButton || 1 : 1; }, - backup:function(links,player){ - var card,name; - if(links.length==2){ - name=links[0]; - card=links[1]; - } - else{ - card=links[0]; - var event=_status.event; - name=event.filterCard(get.autoViewAs({name:'sha'},[card]),player,event)?'sha':'shan'; + backup: function (links, player) { + var card, name; + if (links.length == 2) { + name = links[0]; + card = links[1]; + } else { + card = links[0]; + var event = _status.event; + name = event.filterCard(get.autoViewAs({ name: "sha" }, [card]), player, event) + ? "sha" + : "shan"; } return { - audio:'jibing', - filterCard:function(card){ - return card==lib.skill.jibing_backup.card; + audio: "jibing", + filterCard: function (card) { + return card == lib.skill.jibing_backup.card; }, - selectCard:-1, - position:'x', - viewAs:{name:name}, - card:card, - } + selectCard: -1, + position: "x", + viewAs: { name: name }, + card: card, + }; }, - prompt:function(links,player){ - return '请选择【杀】的目标'; + prompt: function (links, player) { + return "请选择【杀】的目标"; }, }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - return player.getExpansions('jibing').length>0; + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + return player.getExpansions("jibing").length > 0; }, - order:function(item,player){ - if(player.hasSkill('binghuo')) return 6; - return 1 + order: function (item, player) { + if (player.hasSkill("binghuo")) return 6; + return 1; }, - result:{ - player:1, + result: { + player: 1, }, }, - group:'jibing_place', - subSkill:{ - place:{ - audio:'jibing', - trigger:{player:'phaseDrawBegin1'}, - prompt2:'摸牌阶段开始时,若你的“兵”数小于势力数,则你可以改为将牌堆顶的两张牌置于你的武将牌上,称为“兵”。', - filter:function(event,player){ - return !event.numFixed&&player.getExpansions('jibing').length0&&player.isMaxHp()){ - if(get.attitude(target,player)<=0){ - return [0,0,1,0.3]; + ai: { + combo: "jibing", + mingzhi: false, + effect: { + target: function (card, player, target, current) { + if ( + (get.tag(card, "respondShan") || get.tag(card, "respondSha")) && + target.getExpansions("jibing").length > 0 && + player.isMaxHp() + ) { + if (get.attitude(target, player) <= 0) { + return [0, 0, 1, 0.3]; } } }, }, - } - }, - moucuan:{ - audio:2, - derivation:'binghuo', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'metal', - filter:function(event,player){ - return player.getExpansions('jibing').length>=game.countGroup(); }, - content:function(){ - player.awakenSkill('moucuan'); + }, + moucuan: { + audio: 2, + derivation: "binghuo", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + return player.getExpansions("jibing").length >= game.countGroup(); + }, + content: function () { + player.awakenSkill("moucuan"); player.loseMaxHp(); - player.addSkills('binghuo'); + player.addSkills("binghuo"); }, - ai:{combo:'jibing'}, + ai: { combo: "jibing" }, }, - binghuo:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.hasHistory('useCard',function(evt){ - return evt.skill=='jibing_backup'; - })||player.hasHistory('respond',function(evt){ - return evt.skill=='jibing_backup'; - }); + binghuo: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.hasHistory("useCard", function (evt) { + return evt.skill == "jibing_backup"; + }) || + player.hasHistory("respond", function (evt) { + return evt.skill == "jibing_backup"; + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('binghuo')).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("binghuo")).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('binghuo',target); - target.judge(function(card){ - if(get.color(card)=='black') return -2; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("binghuo", target); + target.judge(function (card) { + if (get.color(card) == "black") return -2; return 0.1; - }).judge2=function(result){ - return result.bool===false?true:false; + }).judge2 = function (result) { + return result.bool === false ? true : false; }; - } - else event.finish(); - 'step 2' - if(result.bool==false) target.damage('thunder'); + } else event.finish(); + ("step 2"); + if (result.bool == false) target.damage("thunder"); }, - ai:{combo:'jibing',expose:0.2}, + ai: { combo: "jibing", expose: 0.2 }, }, //司马孚 - xunde:{ - audio:2, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - return event.player.isIn()&&get.distance(player,event.player)<=1; + xunde: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.player.isIn() && get.distance(player, event.player) <= 1; }, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)>0&&(!event.source||get.attitude(player,event.source)<0); + logTarget: "player", + check: function (event, player) { + return ( + get.attitude(player, event.player) > 0 && + (!event.source || get.attitude(player, event.source) < 0) + ); }, - content:function(){ - 'step 0' - player.judge().set('callback',function(){ - if(event.judgeResult.number>5){ - var player=event.getParent(2)._trigger.player; - if(get.position(card,true)=='o') player.gain(card,'gain2'); + content: function () { + "step 0"; + player.judge().set("callback", function () { + if (event.judgeResult.number > 5) { + var player = event.getParent(2)._trigger.player; + if (get.position(card, true) == "o") player.gain(card, "gain2"); } }); - 'step 1' - if(result.number<7){ - var source=trigger.source; - if(source&&source.isIn()&&source.countCards('he')>0){ + ("step 1"); + if (result.number < 7) { + var source = trigger.source; + if (source && source.isIn() && source.countCards("he") > 0) { player.line(source); - source.chooseToDiscard('he',true); + source.chooseToDiscard("he", true); } } }, }, - chenjie:{ - audio:2, - trigger:{global:'judge'}, - filter:function(event,player){ - var suit=get.suit(event.player.judging[0],event.player); - return player.countCards('hes',function(card){ - if(_status.connectMode&&get.position(card)!='e') return true; - return get.suit(card)==suit; - })>0; + chenjie: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + var suit = get.suit(event.player.judging[0], event.player); + return ( + player.countCards("hes", function (card) { + if (_status.connectMode && get.position(card) != "e") return true; + return get.suit(card) == suit; + }) > 0 + ); }, - direct:true, - preHidden:true, - content:function(){ - "step 0" - var suit=get.suit(trigger.player.judging[0],trigger.player); - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('chenjie'),'hes',function(card){ - if(get.suit(card)!=_status.event.suit) return false; - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0.1; - if(attitude>0){ - return result+0.01; - } - else{ - return 0.01-result; - } - }).set('judging',trigger.player.judging[0]).set('suit',suit).setHiddenSkill(event.name); - "step 1" - if(result.bool){ - event.card=result.cards[0]; - player.respond(result.cards,'highlight','chenjie','noOrdering'); - } - else{ + direct: true, + preHidden: true, + content: function () { + "step 0"; + var suit = get.suit(trigger.player.judging[0], trigger.player); + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("chenjie"), + "hes", + function (card) { + if (get.suit(card) != _status.event.suit) return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0.1; + if (attitude > 0) { + return result + 0.01; + } else { + return 0.01 - result; + } + }) + .set("judging", trigger.player.judging[0]) + .set("suit", suit) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + event.card = result.cards[0]; + player.respond(result.cards, "highlight", "chenjie", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=card; + trigger.player.judging[0] = card; trigger.orderingCards.add(card); - game.log(trigger.player,'的判定牌改为',card); + game.log(trigger.player, "的判定牌改为", card); player.draw(2); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:0.1, - } - } + ai: { + rejudge: true, + tag: { + rejudge: 0.1, + }, + }, }, //傅佥 - jueyong:{ - audio:2, - trigger:{target:'useCardToTarget'}, - forced:true, - filter:function(event,player){ - return event.card.name!='jiu'&&event.card.name!='tao'&& - event.targets.length==1&&event.card.isCard&&event.cards.length==1&&event.getParent(2).name!='jueyong_timeout'&& - get.position(event.cards[0],true)=='o'&&event.card.name==event.cards[0].name&& - (!player.storage.jueyong||player.storage.jueyong[0].length=result1) return 'zerotarget'; + ai: { + reverseEquip: true, + effect: { + target: function (card, player, target, current) { + if ( + get.type(card) == "equip" && + !get.tag(card, "gifts") && + target.storage.jueyong && + target.storage.jueyong[1].length + ) { + var result1 = get.equipResult(player, target, card.name), + subtype = get.subtype(card); + for (var i of target.storage.jueyong[0]) { + if ( + get.subtype(i, false) == subtype && + get.equipResult(target, target, i.name) >= result1 + ) + return "zerotarget"; } } }, }, }, - group:'jueyong_timeout', - subSkill:{ - timeout:{ - audio:'jueyong', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player.storage.jueyong&&player.storage.jueyong[0].length>0;//=Math.max(1,player.getDamagedHp()); + group: "jueyong_timeout", + subSkill: { + timeout: { + audio: "jueyong", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.storage.jueyong && player.storage.jueyong[0].length > 0; //=Math.max(1,player.getDamagedHp()); }, - content:function(){ - var list=player.storage.jueyong,card=list[0].shift(),source=list[1].shift(); - if(player.getExpansions('jueyong').includes(card)){ - if(source&&source.isIn()&&source.canUse(card,player,false)) source.useCard(card,player,false); + content: function () { + var list = player.storage.jueyong, + card = list[0].shift(), + source = list[1].shift(); + if (player.getExpansions("jueyong").includes(card)) { + if (source && source.isIn() && source.canUse(card, player, false)) + source.useCard(card, player, false); else player.loseToDiscardpile(card); } - if(list[0].length) event.redo(); + if (list[0].length) event.redo(); }, }, }, }, - poxiang:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:(event,player)=>player.countCards('he')>0, - filterCard:true, - filterTarget:lib.filter.notMe, - position:'he', - discard:false, - lose:false, - delay:false, - check:function(card){ - var player=_status.event.player; - if(!player.storage.jueyong||!player.storage.jueyong[0].length||player.hp<=1&&!player.storage.jueyong[0].some(function(card){ - return get.tag(card,'damage')>0; - })||!player.storage.jueyong[0].some(function(card){ - return get.effect(player,card,player.storage.jueyong[1][player.storage.jueyong[0].indexOf(card)],player)<0; - })) return -1; - return 20-get.value(card); + poxiang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: (event, player) => player.countCards("he") > 0, + filterCard: true, + filterTarget: lib.filter.notMe, + position: "he", + discard: false, + lose: false, + delay: false, + check: function (card) { + var player = _status.event.player; + if ( + !player.storage.jueyong || + !player.storage.jueyong[0].length || + (player.hp <= 1 && + !player.storage.jueyong[0].some(function (card) { + return get.tag(card, "damage") > 0; + })) || + !player.storage.jueyong[0].some(function (card) { + return ( + get.effect( + player, + card, + player.storage.jueyong[1][player.storage.jueyong[0].indexOf(card)], + player + ) < 0 + ); + }) + ) + return -1; + return 20 - get.value(card); }, - content:function(){ - 'step 0' - player.give(cards,target); - player.draw(3).gaintag=['poxiang']; - player.addTempSkill('poxiang_mark') - 'step 1' - var cards=player.getExpansions('jueyong'); - if(cards.length) player.loseToDiscardpile(cards); - player.unmarkSkill('jueyong'); + content: function () { + "step 0"; + player.give(cards, target); + player.draw(3).gaintag = ["poxiang"]; + player.addTempSkill("poxiang_mark"); + ("step 1"); + var cards = player.getExpansions("jueyong"); + if (cards.length) player.loseToDiscardpile(cards); + player.unmarkSkill("jueyong"); player.loseHp(); - 'step 2' + ("step 2"); //player.skip('phaseDiscard'); game.delayx(); }, - ai:{ - order:12, - result:{ - player:4, - target:1, + ai: { + order: 12, + result: { + player: 4, + target: 1, }, }, - subSkill:{ - mark:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('poxiang'); + subSkill: { + mark: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("poxiang"); }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('poxiang')){ + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("poxiang")) { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('poxiang')){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("poxiang")) { return false; } }, @@ -8035,1280 +9987,1555 @@ game.import('character', function () { }, }, //曹真 - disordersidi:{audio:2}, - discretesidi:{ - audio:'disordersidi', - trigger:{player:'useCardAfter'}, - direct:true, - filter:function(event,player){ - return get.type(event.card,false)!='delay'&&game.hasPlayer(function(current){ - return player!=current&&(!player.storage.discretesidi||!player.storage.discretesidi.includes(current)); - }); + disordersidi: { audio: 2 }, + discretesidi: { + audio: "disordersidi", + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + return ( + get.type(event.card, false) != "delay" && + game.hasPlayer(function (current) { + return ( + player != current && + (!player.storage.discretesidi || + !player.storage.discretesidi.includes(current)) + ); + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('discretesidi'),'选择两名角色a,b建立二元序偶,或仅选择一名角色,建立二元序偶',[1,2],function(card,player,target){ - if(ui.selected.targets.length) return true; - return target!=player&&(!player.storage.discretesidi||!player.storage.discretesidi.includes(target)); - }).set('complexTarget',true).set('complexSelect',true).set('targetprompt',['第一元素','第二元素']).set('ai',function(target){ - var player=_status.event.player; - if(!ui.selected.targets.length){ - if(target.getEnemies().length==1) return 2+Math.random(); - return 1+Math.random(); - } - var targetx=ui.selected.targets[0]; - if(targetx.getEnemies().includes(target)&&targetx.inRange(target)) return Math.random()-0.5; - return 0; - }).animate=false; - 'step 1' - if(result.bool&&result.targets.length){ - var targets=result.targets; - player.logSkill('discretesidi',targets[0]); - if(targets.length==1) targets.push(targets[0]); - if(!player.storage.discretesidi) player.storage.discretesidi=[]; - if(!player.storage.discretesidi2) player.storage.discretesidi2=[]; + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("discretesidi"), + "选择两名角色a,b建立二元序偶,或仅选择一名角色,建立二元序偶", + [1, 2], + function (card, player, target) { + if (ui.selected.targets.length) return true; + return ( + target != player && + (!player.storage.discretesidi || + !player.storage.discretesidi.includes(target)) + ); + } + ) + .set("complexTarget", true) + .set("complexSelect", true) + .set("targetprompt", ["第一元素", "第二元素"]) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + if (target.getEnemies().length == 1) return 2 + Math.random(); + return 1 + Math.random(); + } + var targetx = ui.selected.targets[0]; + if (targetx.getEnemies().includes(target) && targetx.inRange(target)) + return Math.random() - 0.5; + return 0; + }).animate = false; + ("step 1"); + if (result.bool && result.targets.length) { + var targets = result.targets; + player.logSkill("discretesidi", targets[0]); + if (targets.length == 1) targets.push(targets[0]); + if (!player.storage.discretesidi) player.storage.discretesidi = []; + if (!player.storage.discretesidi2) player.storage.discretesidi2 = []; player.storage.discretesidi.push(targets[0]); player.storage.discretesidi2.push(targets[1]); - player.markSkill('discretesidi'); + player.markSkill("discretesidi"); game.delayx(); } }, - intro:{ - content:function(storage,player){ - if((player==game.me||player.isUnderControl())&&!game.observe){ - var str='R={ '; - for(var i=0;i0&&get.effect(evt.target,evt.card,evt.player,player)<0) return 0; - return 1; - }); - 'step 1' - if(result.index==0){ + var target = trigger.player; + event.target = target; + player + .chooseControl("cancel2") + .set("choiceList", [ + "取消" + + get.translation(trigger.card) + + "的所有目标并对" + + get.translation(target) + + "造成1点伤害", + "摸两张牌", + ]) + .set("ai", function () { + var player = _status.event.player, + evt = _status.event.getTrigger(); + if ( + get.damageEffect(evt.player, player, player) > 0 && + get.effect(evt.target, evt.card, evt.player, player) < 0 + ) + return 0; + return 1; + }); + ("step 1"); + if (result.index == 0) { trigger.cancel(); - trigger.targets.length=0; - trigger.getParent().triggeredTargets1.length=0; - if(!_status.dying.length) target.damage(); - } - else if(result.index==1) player.draw(2); + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + if (!_status.dying.length) target.damage(); + } else if (result.index == 1) player.draw(2); }, }, - } + }, }, //孙鲁班 - xinzenhui:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - if(event.targets.length!=1) return false; - var card=event.card; - if(card.name!='sha'&&(get.type(card,null,false)!='trick'||get.color(card,false)!='black')) return false; - if(!player.isPhaseUsing()||player.hasSkill('xinzenhui2')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t!=event.target&&lib.filter.targetEnabled2(card,player,current)&&lib.filter.targetInRange(card,player,current); + xinzenhui: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (event.targets.length != 1) return false; + var card = event.card; + if ( + card.name != "sha" && + (get.type(card, null, false) != "trick" || get.color(card, false) != "black") + ) + return false; + if (!player.isPhaseUsing() || player.hasSkill("xinzenhui2")) return false; + return game.hasPlayer(function (current) { + return ( + current != player && + current != event.target && + lib.filter.targetEnabled2(card, player, current) && + lib.filter.targetInRange(card, player, current) + ); }); }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('xinzenhui'),function(card,player,target){ - if(player==target) return false; - var evt=_status.event.getTrigger(); - return !evt.targets.includes(target)&&lib.filter.targetEnabled2(evt.card,player,target)&&lib.filter.targetInRange(evt.card,player,target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return Math.max((target.countGainableCards(player,'he')?get.effect(target,{name:'shunshou_copy2'},player,player):0),get.effect(target,trigger.card,player,player)); - }); - "step 1" - if(result.bool){ - player.addTempSkill('xinzenhui2','phaseUseAfter'); - var target=result.targets[0],str=get.translation(target); - event.target=target; - player.logSkill('xinzenhui',target); - if(!target.countGainableCards(player,'he')) event._result={index:0}; - else player.chooseControl().set('choiceList',[ - '令'+str+'也成为'+get.translation(trigger.card)+'的目标', - '获得'+str+'的一张牌,然后其成为'+get.translation(trigger.card)+'的使用者', - ]).set('ai',function(){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player,target=_status.event.getParent().target; - return (target.countGainableCards(player,'he')?get.effect(target,{name:'shunshou_copy2'},player,player):0)>get.effect(target,trigger.card,player,player)?1:0; + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinzenhui"), function (card, player, target) { + if (player == target) return false; + var evt = _status.event.getTrigger(); + return ( + !evt.targets.includes(target) && + lib.filter.targetEnabled2(evt.card, player, target) && + lib.filter.targetInRange(evt.card, player, target) + ); }) - } - else event.finish(); - "step 2" - if(result.index==1){ + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return Math.max( + target.countGainableCards(player, "he") + ? get.effect(target, { name: "shunshou_copy2" }, player, player) + : 0, + get.effect(target, trigger.card, player, player) + ); + }); + ("step 1"); + if (result.bool) { + player.addTempSkill("xinzenhui2", "phaseUseAfter"); + var target = result.targets[0], + str = get.translation(target); + event.target = target; + player.logSkill("xinzenhui", target); + if (!target.countGainableCards(player, "he")) event._result = { index: 0 }; + else + player + .chooseControl() + .set("choiceList", [ + "令" + str + "也成为" + get.translation(trigger.card) + "的目标", + "获得" + + str + + "的一张牌,然后其成为" + + get.translation(trigger.card) + + "的使用者", + ]) + .set("ai", function () { + var trigger = _status.event.getTrigger(); + var player = _status.event.player, + target = _status.event.getParent().target; + return (target.countGainableCards(player, "he") + ? get.effect(target, { name: "shunshou_copy2" }, player, player) + : 0) > get.effect(target, trigger.card, player, player) + ? 1 + : 0; + }); + } else event.finish(); + ("step 2"); + if (result.index == 1) { trigger.untrigger(); - trigger.getParent().player=event.target; - game.log(event.target,'成为了',trigger.card,'的使用者'); - player.gainPlayerCard(target,true,'he'); - } - else{ - game.log(event.target,'成为了',trigger.card,'的额外目标'); + trigger.getParent().player = event.target; + game.log(event.target, "成为了", trigger.card, "的使用者"); + player.gainPlayerCard(target, true, "he"); + } else { + game.log(event.target, "成为了", trigger.card, "的额外目标"); trigger.getParent().targets.push(event.target); } - } - }, - xinzenhui2:{}, - xinjiaojin:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - return player.countCards('he',{type:'equip'})&&event.source&&event.source.hasSex('male'); }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he','骄矜:是否弃置一张装备牌防止伤害?',function(card,player){ - return get.type(card)=='equip'; - }); - next.set('ai',function(card){ - var player=_status.event.player; - if(player.hp==1||_status.event.getTrigger().num>1){ - return 9-get.value(card); + }, + xinzenhui2: {}, + xinjiaojin: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return ( + player.countCards("he", { type: "equip" }) && + event.source && + event.source.hasSex("male") + ); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + "骄矜:是否弃置一张装备牌防止伤害?", + function (card, player) { + return get.type(card) == "equip"; } - if(player.hp==2){ - return 8-get.value(card); + ); + next.set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1 || _status.event.getTrigger().num > 1) { + return 9 - get.value(card); } - return 7-get.value(card); + if (player.hp == 2) { + return 8 - get.value(card); + } + return 7 - get.value(card); }); - next.logSkill='xinjiaojin'; - "step 1" - if(result.bool){ + next.logSkill = "xinjiaojin"; + ("step 1"); + if (result.bool) { game.delay(0.5); trigger.cancel(); } - } + }, }, //新华歆 - yuanqing:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - forced:true, - filter:function(event,player){ - return player.hasHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==event; + yuanqing: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return player.hasHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; }); }, - content:function(){ - var map={},cards=[]; - player.getHistory('useCard',function(evt){ - if(evt.getParent('phaseUse')==trigger){ - var type=get.type2(evt.card,false); - if(!map[type]) map[type]=[]; + content: function () { + var map = {}, + cards = []; + player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") == trigger) { + var type = get.type2(evt.card, false); + if (!map[type]) map[type] = []; } }); - for(var i=0;i3; + trigger: { global: "dying" }, + forced: true, + filter: function (event, player) { + return _status.renku.length > 3; }, - logTarget:'player', - content:function(){ - player.gain(_status.renku,'gain2','fromRenku'); - _status.renku.length=0; + logTarget: "player", + content: function () { + player.gain(_status.renku, "gain2", "fromRenku"); + _status.renku.length = 0; game.updateRenku(); trigger.player.recover(); }, }, //谯周 - zhiming:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseDiscardEnd']}, - frequent:true, - content:function(){ - 'step 0' + zhiming: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseDiscardEnd"] }, + frequent: true, + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.countCards('he')>0){ - var next=player.chooseCard('he','是否将一张牌置于牌堆顶?'); - if(trigger.name=='phaseZhunbei'){ - next.set('ai',function(card){ - var player=_status.event.player,js=player.getCards('j'); - if(js.length){ - var judge=get.judge(js[0]); - if(judge&&judge(card)>=0) return 20-get.value(card); + ("step 1"); + if (player.countCards("he") > 0) { + var next = player.chooseCard("he", "是否将一张牌置于牌堆顶?"); + if (trigger.name == "phaseZhunbei") { + next.set("ai", function (card) { + var player = _status.event.player, + js = player.getCards("j"); + if (js.length) { + var judge = get.judge(js[0]); + if (judge && judge(card) >= 0) return 20 - get.value(card); } return 0; }); - } - else next.set('ai',function(card){ - var player=_status.event.player,js=player.next.getCards('j'); - if(js.length){ - var judge=get.judge(js[0]); - if(judge&&(judge(card)+0.01)*get.attitude(player,player.next)>0) return 20-get.value(card); - } - return 0; - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.$throw(get.position(result.cards[0])=='e'?result.cards[0]:1,1000); - game.log(player,'将',get.position(result.cards[0])=='e'?result.cards[0]:'#y一张手牌','置于了牌堆顶'); - player.lose(result.cards,ui.cardPile,'insert'); - } - else event.finish(); - 'step 3' + } else + next.set("ai", function (card) { + var player = _status.event.player, + js = player.next.getCards("j"); + if (js.length) { + var judge = get.judge(js[0]); + if (judge && (judge(card) + 0.01) * get.attitude(player, player.next) > 0) + return 20 - get.value(card); + } + return 0; + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.$throw(get.position(result.cards[0]) == "e" ? result.cards[0] : 1, 1000); + game.log( + player, + "将", + get.position(result.cards[0]) == "e" ? result.cards[0] : "#y一张手牌", + "置于了牌堆顶" + ); + player.lose(result.cards, ui.cardPile, "insert"); + } else event.finish(); + ("step 3"); game.updateRoundNumber(); game.delayx(); }, - ai:{guanxing:true}, + ai: { guanxing: true }, }, - xingbu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - prompt2:'亮出牌堆顶的三张牌,并可以根据其中红色牌的数量,令一名其他角色获得一种效果', - content:function(){ - 'step 0' - var cards=get.cards(3); + xingbu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + prompt2: "亮出牌堆顶的三张牌,并可以根据其中红色牌的数量,令一名其他角色获得一种效果", + content: function () { + "step 0"; + var cards = get.cards(3); //for(var i=cards.length-1;i--;i>=0){ // ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); //} game.updateRoundNumber(); - event.cards=cards; + event.cards = cards; //game.cardsGotoOrdering(cards); - player.showCards(cards,get.translation(player)+'发动了【星卜】'); - 'step 1' - var num=0; - for(var i of cards){ - if(get.color(i,false)=='red') num++; + player.showCards(cards, get.translation(player) + "发动了【星卜】"); + ("step 1"); + var num = 0; + for (var i of cards) { + if (get.color(i, false) == "red") num++; } - player.chooseTarget('是否选择一名其他角色获得星卜效果('+get.cnNumber(num)+'张)?',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,num=_status.event.getParent().num; - var att=get.attitude(player,target); - if(num<3) att*=(-1); - if(num==2&&target.hasJudge('lebu')) att*=(-1.4); - return att; - }); - if(num==0) num=1; - event.num=num; - 'step 2' - if(result.bool){ - var skill='xingbu_effect'+num,target=result.targets[0]; - player.line(target,'green'); - game.log(player,'选择了',target); - target.addTempSkill(skill,{player:'phaseEnd'}); - target.addMark(skill,1,false); + player + .chooseTarget( + "是否选择一名其他角色获得星卜效果(" + get.cnNumber(num) + "张)?", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player, + num = _status.event.getParent().num; + var att = get.attitude(player, target); + if (num < 3) att *= -1; + if (num == 2 && target.hasJudge("lebu")) att *= -1.4; + return att; + }); + if (num == 0) num = 1; + event.num = num; + ("step 2"); + if (result.bool) { + var skill = "xingbu_effect" + num, + target = result.targets[0]; + player.line(target, "green"); + game.log(player, "选择了", target); + target.addTempSkill(skill, { player: "phaseEnd" }); + target.addMark(skill, 1, false); game.delayx(); } }, - subSkill:{ - effect1:{ - charlotte:true, - onremove:true, - intro:{content:'准备阶段开始时弃置#张手牌'}, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.countCards('h')>0; + subSkill: { + effect1: { + charlotte: true, + onremove: true, + intro: { content: "准备阶段开始时弃置#张手牌" }, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - player.chooseToDiscard('h',true,player.countMark('xingbu_effect1')); + content: function () { + player.chooseToDiscard("h", true, player.countMark("xingbu_effect1")); }, }, - effect2:{ - charlotte:true, - onremove:true, - intro:{content:'使用【杀】的次数上限-#,跳过弃牌阶段'}, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num-player.countMark('xingbu_effect2'); + effect2: { + charlotte: true, + onremove: true, + intro: { content: "使用【杀】的次数上限-#,跳过弃牌阶段" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("xingbu_effect2"); }, }, - trigger:{player:'phaseDiscardBegin'}, - forced:true, - content:function(){ + trigger: { player: "phaseDiscardBegin" }, + forced: true, + content: function () { trigger.cancel(); }, }, - effect3:{ - charlotte:true, - onremove:true, - intro:{content:'摸牌阶段多摸2*#张牌,使用【杀】的次数上限+#。'}, - trigger:{player:['phaseDrawBegin2']}, - forced:true, - filter:function(event,player){ + effect3: { + charlotte: true, + onremove: true, + intro: { content: "摸牌阶段多摸2*#张牌,使用【杀】的次数上限+#。" }, + trigger: { player: ["phaseDrawBegin2"] }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - if(trigger.name=='phaseDraw') trigger.num+=(player.countMark('xingbu_effect3')*2); + content: function () { + if (trigger.name == "phaseDraw") + trigger.num += player.countMark("xingbu_effect3") * 2; }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('xingbu_effect3'); + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("xingbu_effect3"); }, }, }, }, }, //顾雍 - xinshenxing:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return (player.getStat('skill').xinshenxing||0)1; + xinshenxing: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + (player.getStat("skill").xinshenxing || 0) < player.hp && player.countCards("he") > 1 + ); }, - selectCard:2, - position:'he', - check:function(card){ - if(!ui.selected.cards.length||get.color(card)!=get.color(ui.selected.cards[0])) return 6.5-get.value(card); - return 6.5-get.value(card)-get.value(ui.selected.cards[0]); + selectCard: 2, + position: "he", + check: function (card) { + if (!ui.selected.cards.length || get.color(card) != get.color(ui.selected.cards[0])) + return 6.5 - get.value(card); + return 6.5 - get.value(card) - get.value(ui.selected.cards[0]); }, - filterCard:true, - content:function(){ - player.draw(get.color(cards)=='none'?2:1); + filterCard: true, + content: function () { + player.draw(get.color(cards) == "none" ? 2 : 1); }, - ai:{ - order:1, - result:{player:1}, + ai: { + order: 1, + result: { player: 1 }, }, }, - xinbingyi:{ - audio:'bingyi', - audioname:['xin_guyong'], - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('h')>0; + xinbingyi: { + audio: "bingyi", + audioname: ["xin_guyong"], + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterx:function(event,player){ - var cards=player.getCards('h'); - if(cards.length==1) return true; - var color=get.color(cards[0],player),type=get.type2(cards[0],player); - for(var i=1;i{ - if(num<=0||typeof card!=='object'||!player.isPhaseUsing()||!player.hasSkill('zili')||player.needsToDiscard()) return num; - if(player.getExpansions('quanji').length<3&&player.getUseValue(card) { + if ( + num <= 0 || + typeof card !== "object" || + !player.isPhaseUsing() || + !player.hasSkill("zili") || + player.needsToDiscard() + ) + return num; + if ( + player.getExpansions("quanji").length < 3 && + player.getUseValue(card) < Math.min(4, (player.hp * player.hp) / 4) + ) + return 0; + }, }, - trigger:{player:['damageEnd','phaseUseEnd']}, - frequent:true, - locked:false, - notemp:true, - filter:function(event,player){ - if(event.name=='phaseUse') return player.countCards('h')>player.hp; - return event.num>0; + trigger: { player: ["damageEnd", "phaseUseEnd"] }, + frequent: true, + locked: false, + notemp: true, + filter: function (event, player) { + if (event.name == "phaseUse") return player.countCards("h") > player.hp; + return event.num > 0; }, - content:function(){ - "step 0" - event.count=trigger.num||1; - "step 1" + content: function () { + "step 0"; + event.count = trigger.num || 1; + ("step 1"); event.count--; player.draw(); - "step 2" - if(player.countCards('h')){ - player.chooseCard('将一张手牌置于武将牌上作为“权”',true); - } - else{ + ("step 2"); + if (player.countCards("h")) { + player.chooseCard("将一张手牌置于武将牌上作为“权”", true); + } else { event.goto(4); } - "step 3" - if(result.cards&&result.cards.length){ - player.addToExpansion(result.cards,player,'give').gaintag.add('quanji'); + ("step 3"); + if (result.cards && result.cards.length) { + player.addToExpansion(result.cards, player, "give").gaintag.add("quanji"); } - "step 4" - if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2('requanji')).set('frequentSkill',event.name); - } - else event.finish(); - "step 5" - if(result.bool){ - player.logSkill('requanji'); + ("step 4"); + if ( + event.count > 0 && + player.hasSkill(event.name) && + !get.is.blocked(event.name, player) + ) { + player.chooseBool(get.prompt2("requanji")).set("frequentSkill", event.name); + } else event.finish(); + ("step 5"); + if (result.bool) { + player.logSkill("requanji"); event.goto(1); } }, - mod:{ - maxHandcard:function(player,num){ - return num+player.getExpansions('quanji').length; - } + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("quanji").length; + }, }, - onremove:function(player,skill){ - var cards=player.getExpansions('quanji'); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions("quanji"); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{ - maixie:true, - maixie_hp:true, - threaten:0.8, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(target.hp>=4) return [0.5,get.tag(card,'damage')*2]; - if(!target.hasSkill('paiyi')&&target.hp>1) return [0.5,get.tag(card,'damage')*1.5]; - if(target.hp==3) return [0.5,get.tag(card,'damage')*1.5]; - if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.8, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("paiyi") && target.hp > 1) + return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; } - } - } - } + }, + }, + }, }, //蔡夫人 - xinqieting:{ - audio:2, - trigger:{global:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&event.player.getHistory('sourceDamage',function(evt){ - return evt.player!=event.player; - }).length==0; + xinqieting: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.getHistory("sourceDamage", function (evt) { + return evt.player != event.player; + }).length == 0 + ); }, - content:function(){ - 'step 0' - var list=['摸一张牌'],target=trigger.player,str=get.translation(target); - event.target=target; - event.addIndex=0; - if(target.countCards('h')>0) list.push('观看'+str+'的两张手牌并获得其中一张'); + content: function () { + "step 0"; + var list = ["摸一张牌"], + target = trigger.player, + str = get.translation(target); + event.target = target; + event.addIndex = 0; + if (target.countCards("h") > 0) list.push("观看" + str + "的两张手牌并获得其中一张"); else event.addIndex++; - if(target.countCards('e',function(card){ - return player.canEquip(card); - })>0) list.push('将'+str+'装备区内的一张牌移动至自己的装备区'); - player.chooseControl('cancel2').set('choiceList',list).set('prompt',get.prompt('xinqieting',target)).set('ai',function(){ - var evt=_status.event.getParent(); - if(get.attitude(evt.player,evt.target)>0) return 0; - var val=evt.target.hasSkillTag('noe')?6:0; - if(evt.target.countCards('e',function(card){ - return evt.player.canEquip(card)&&get.value(card,evt.target)>val&&get.effect(evt.player,card,evt.player,evt.player)>0; - })>0) return 2-evt.addIndex; - if(evt.target.countCards('h')>0) return 1; - return 0; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('xinqieting',target); - if(result.index==0){ + if ( + target.countCards("e", function (card) { + return player.canEquip(card); + }) > 0 + ) + list.push("将" + str + "装备区内的一张牌移动至自己的装备区"); + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("xinqieting", target)) + .set("ai", function () { + var evt = _status.event.getParent(); + if (get.attitude(evt.player, evt.target) > 0) return 0; + var val = evt.target.hasSkillTag("noe") ? 6 : 0; + if ( + evt.target.countCards("e", function (card) { + return ( + evt.player.canEquip(card) && + get.value(card, evt.target) > val && + get.effect(evt.player, card, evt.player, evt.player) > 0 + ); + }) > 0 + ) + return 2 - evt.addIndex; + if (evt.target.countCards("h") > 0) return 1; + return 0; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("xinqieting", target); + if (result.index == 0) { player.draw(); event.finish(); - } - else if(result.index+event.addIndex==1){ - player.choosePlayerCard(target,'h',2,true); + } else if (result.index + event.addIndex == 1) { + player.choosePlayerCard(target, "h", 2, true); player.addExpose(0.2); event.goto(3); - } - else{ + } else { player.addExpose(0.1); - player.choosePlayerCard(target,'e',true).set('filterButton',function(button){ - return _status.event.player.canEquip(button.link); - }).set('ai',function(button){ - var player=_status.event.player; - return get.effect(player,button.link,player,player); - }); + player + .choosePlayerCard(target, "e", true) + .set("filterButton", function (button) { + return _status.event.player.canEquip(button.link); + }) + .set("ai", function (button) { + var player = _status.event.player; + return get.effect(player, button.link, player, player); + }); } - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - target.$give(card,player,false); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + target.$give(card, player, false); game.delay(0.5); player.equip(card); } event.finish(); - 'step 3' - if(result.bool) player.chooseButton(['选择获得一张牌',result.cards],true); + ("step 3"); + if (result.bool) player.chooseButton(["选择获得一张牌", result.cards], true); else event.finish(); - 'step 4' - if(result.bool){ - var card=result.links[0]; - if(lib.filter.canBeGained(card,player,target)) player.gain(card,target,'giveAuto','bySelf'); - else game.log('但',card,'不能被',player,'获得!'); + ("step 4"); + if (result.bool) { + var card = result.links[0]; + if (lib.filter.canBeGained(card, player, target)) + player.gain(card, target, "giveAuto", "bySelf"); + else game.log("但", card, "不能被", player, "获得!"); } }, }, - mobilezhongyong:{ - audio:2, - trigger:{player:'useCardAfter'}, - direct:true, - filter:function(event,player){ - if(event.card.name!='sha'||!event.isPhaseUsing(player)) return false; - if(event.cards.filterInD().length>0) return true; - var list=lib.skill.mobilezhongyong.getResponds(event); - if(list.length){ - for(var evt of list){ - if(evt.cards.filterInD('od').length>0) return true; + mobilezhongyong: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (event.card.name != "sha" || !event.isPhaseUsing(player)) return false; + if (event.cards.filterInD().length > 0) return true; + var list = lib.skill.mobilezhongyong.getResponds(event); + if (list.length) { + for (var evt of list) { + if (evt.cards.filterInD("od").length > 0) return true; } } return false; }, - getResponds:function(event){ - var list=[]; - for(var i of event.targets){ - list.addArray(i.getHistory('useCard',function(evt){ - return evt.card.name=='shan'&&evt.respondTo&&evt.respondTo[1]==event.card; - })) + getResponds: function (event) { + var list = []; + for (var i of event.targets) { + list.addArray( + i.getHistory("useCard", function (evt) { + return ( + evt.card.name == "shan" && evt.respondTo && evt.respondTo[1] == event.card + ); + }) + ); } return list; }, - content:function(){ - 'step 0' - event.shas=trigger.cards.filterInD(); - var list=lib.skill.mobilezhongyong.getResponds(trigger); - if(list.length){ - event.shans=[]; - for(var evt of list){ - event.shans.addArray(evt.cards.filterInD('od')); + content: function () { + "step 0"; + event.shas = trigger.cards.filterInD(); + var list = lib.skill.mobilezhongyong.getResponds(trigger); + if (list.length) { + event.shans = []; + for (var evt of list) { + event.shans.addArray(evt.cards.filterInD("od")); } event.goto(2); - } - else player.chooseBool(get.prompt('mobilezhongyong'),'获得'+get.translation(event.shas)).set('ai',function(){ - var evt=_status.event.getParent(); - return get.value(evt.shas,evt.player)>0; - }); - 'step 1' - if(result.bool){ - player.logSkill('mobilezhongyong'); - player.addTempSkill('mobilezhongyong_buff'); - player.gain(event.shas,'gain2').gaintag.add('mobilezhongyong'); + } else + player + .chooseBool(get.prompt("mobilezhongyong"), "获得" + get.translation(event.shas)) + .set("ai", function () { + var evt = _status.event.getParent(); + return get.value(evt.shas, evt.player) > 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("mobilezhongyong"); + player.addTempSkill("mobilezhongyong_buff"); + player.gain(event.shas, "gain2").gaintag.add("mobilezhongyong"); } event.finish(); - 'step 2' - var shans=get.translation(event.shans),choiceList=[ - '获得'+shans, - ]; - if(game.hasPlayer(function(current){ - return current!=player&&!trigger.targets.includes(current); - })){ - if(event.shas.length) choiceList[0]+=(',然后可以令另一名其他角色获得'+get.translation(event.shas)); - choiceList.push('令另一名其他角色获得'+shans+',然后你于本回合内使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1'); + ("step 2"); + var shans = get.translation(event.shans), + choiceList = ["获得" + shans]; + if ( + game.hasPlayer(function (current) { + return current != player && !trigger.targets.includes(current); + }) + ) { + if (event.shas.length) + choiceList[0] += ",然后可以令另一名其他角色获得" + get.translation(event.shas); + choiceList.push( + "令另一名其他角色获得" + + shans + + ",然后你于本回合内使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1" + ); } - player.chooseControl('cancel2').set('choiceList',choiceList).set('prompt',get.prompt('mobilezhongyong')).set('ai',function(){ - var evt=_status.event.getParent(),player=evt.player,tri=_status.event.getTrigger(); - if(game.hasPlayer(function(current){ - return current!=player&&!tri.targets.includes(current)&&get.attitude(player,current)>0; - })&&player.countCards('hs',function(card){ - return get.name(card)=='sha'&&player.hasValueTarget(card); - })>player.getCardUsable({name:'sha'})) return 1; - return 0; - }); - 'step 3' - if(result.index==0){ - player.logSkill('mobilezhongyong'); - player.addTempSkill('mobilezhongyong_buff'); - player.gain(event.shans,'gain2').gaintag.add('mobilezhongyong'); + player + .chooseControl("cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("mobilezhongyong")) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.player, + tri = _status.event.getTrigger(); + if ( + game.hasPlayer(function (current) { + return ( + current != player && + !tri.targets.includes(current) && + get.attitude(player, current) > 0 + ); + }) && + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) > player.getCardUsable({ name: "sha" }) + ) + return 1; + return 0; + }); + ("step 3"); + if (result.index == 0) { + player.logSkill("mobilezhongyong"); + player.addTempSkill("mobilezhongyong_buff"); + player.gain(event.shans, "gain2").gaintag.add("mobilezhongyong"); + } else event.goto(6); + ("step 4"); + event.shas = event.shas.filterInD("od"); + if ( + event.shas.length && + game.hasPlayer(function (current) { + return current != player && !trigger.targets.includes(current); + }) + ) { + player + .chooseTarget( + "是否令一名其他角色获得" + get.translation(event.shas) + "?", + function (card, player, target) { + return ( + target != player && + !_status.event.getTrigger().targets.includes(target) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return att; + if (target.hasSkillTag("nogain")) return att / 10; + if (!target.hasSha()) return 2 * att; + return att; + }); + } else event.finish(); + ("step 5"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(event.shas, "gain2"); } - else event.goto(6); - 'step 4' - event.shas=event.shas.filterInD('od'); - if(event.shas.length&&game.hasPlayer(function(current){ - return current!=player&&!trigger.targets.includes(current); - })){ - player.chooseTarget('是否令一名其他角色获得'+get.translation(event.shas)+'?',function(card,player,target){ - return target!=player&&!_status.event.getTrigger().targets.includes(target); - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<=0) return att; - if(target.hasSkillTag('nogain')) return att/10; - if(!target.hasSha()) return 2*att; + event.finish(); + ("step 6"); + player + .chooseTarget( + "令一名其他角色获得" + get.translation(event.shans), + true, + function (card, player, target) { + return ( + target != player && !_status.event.getTrigger().targets.includes(target) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return att; + if (target.hasSkillTag("nogain")) return att / 10; + if (!target.hasShan()) return 2 * att; return att; }); - } - else event.finish(); - 'step 5' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(event.shas,'gain2'); - } - event.finish(); - 'step 6' - player.chooseTarget('令一名其他角色获得'+get.translation(event.shans),true,function(card,player,target){ - return target!=player&&!_status.event.getTrigger().targets.includes(target); - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<=0) return att; - if(target.hasSkillTag('nogain')) return att/10; - if(!target.hasShan()) return 2*att; - return att; - }); - 'step 7' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('mobilezhongyong',target); - target.gain(event.shans,'gain2'); - player.addTempSkill('mobilezhongyong_buff'); - player.addMark('mobilezhongyong_buff',1,false); - player.addMark('mobilezhongyong_damage',1,false); + ("step 7"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mobilezhongyong", target); + target.gain(event.shans, "gain2"); + player.addTempSkill("mobilezhongyong_buff"); + player.addMark("mobilezhongyong_buff", 1, false); + player.addMark("mobilezhongyong_damage", 1, false); } }, - subSkill:{ - buff:{ - mod:{ - cardEnabled2:function(card,player){ - if(get.itemtype(card)=='card'&&card.hasGaintag('mobilezhongyong')) return false; + subSkill: { + buff: { + mod: { + cardEnabled2: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("mobilezhongyong")) + return false; }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('mobilezhongyong_buff'); + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("mobilezhongyong_buff"); }, }, - trigger:{player:'useCard1'}, - firstDo:true, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - return event.card.name=='sha'&&player.countMark('mobilezhongyong_damage')>0; + trigger: { player: "useCard1" }, + firstDo: true, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return event.card.name == "sha" && player.countMark("mobilezhongyong_damage") > 0; }, - content:function(){ - trigger.baseDamage+=player.storage.mobilezhongyong_damage; + content: function () { + trigger.baseDamage += player.storage.mobilezhongyong_damage; delete player.storage.mobilezhongyong_damage; }, - onremove:function(player){ + onremove: function (player) { delete player.storage.mobilezhongyong_buff; delete player.storage.mobilezhongyong_damage; - player.removeGaintag('mobilezhongyong'); + player.removeGaintag("mobilezhongyong"); }, }, }, }, - rejieyue:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + rejieyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt2('rejieyue'), - filterCard:true, - position:'he', - filterTarget:lib.filter.notMe, - ai1:function(card){ - var player=_status.event.player; - if(get.name(card)=='du') return 20; - if(get.position(card)=='e'&&get.value(card)<=0) return 14; - if(get.position(card)=='h'&&game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0&¤t.getUseValue(card)>player.getUseValue(card)&¤t.getUseValue(card)>player.getUseValue(card); - })) return 12; - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })){ - if(card.name=='wuxie') return 11; - if(card.name=='shan'&&player.countCards('h','shan')>1) return 9 + prompt: get.prompt2("rejieyue"), + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + ai1: function (card) { + var player = _status.event.player; + if (get.name(card) == "du") return 20; + if (get.position(card) == "e" && get.value(card) <= 0) return 14; + if ( + get.position(card) == "h" && + game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) > 0 && + current.getUseValue(card) > player.getUseValue(card) && + current.getUseValue(card) > player.getUseValue(card) + ); + }) + ) + return 12; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) { + if (card.name == "wuxie") return 11; + if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; } - return 6/Math.max(1,get.value(card)); + return 6 / Math.max(1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player; - var card=ui.selected.cards[0]; - var att=get.attitude(player,target); - if(card.name=='du') return -6*att; - if(att>0){ - if(get.position(card)=='h'&&target.getUseValue(card)>player.getUseValue(card)) return 4*att; - if(get.value(card,target)>get.value(card,player)) return 2*att; - return 1.2*att; + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (card.name == "du") return -6 * att; + if (att > 0) { + if ( + get.position(card) == "h" && + target.getUseValue(card) > player.getUseValue(card) + ) + return 4 * att; + if (get.value(card, target) > get.value(card, player)) return 2 * att; + return 1.2 * att; } - return -att*Math.min(4,target.countCards('he'))/4; + return (-att * Math.min(4, target.countCards("he"))) / 4; }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('rejieyue',target); - player.give(result.cards,target); - } - else event.finish(); - 'step 2' - var num=0; - if(target.countCards('h')) num++; - if(target.countCards('e')) num++; - if(num>0){ - var next=target.chooseCard('he',num,'选择保留每个区域的各一张牌,然后弃置其余的牌。或点取消,令'+get.translation(player)+'摸三张牌',function(card){ - for(var i=0;i 0) { + var next = target.chooseCard( + "he", + num, + "选择保留每个区域的各一张牌,然后弃置其余的牌。或点取消,令" + + get.translation(player) + + "摸三张牌", + function (card) { + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.position(ui.selected.cards[i]) == get.position(card)) + return false; + } + return true; } - return true; - }); - next.set('complexCard',true); - next.set('goon',get.attitude(target,player)>=0); - next.set('maxNum',num); - next.set('ai',function(card){ - if(_status.event.goon) return -1; - var num=_status.event.maxNum; - if(ui.selected.cards.length>=num-1){ - var cards=player.getCards('he',function(cardx){ - return cardx!=card&&!ui.selected.cards.includes(cardx); + ); + next.set("complexCard", true); + next.set("goon", get.attitude(target, player) >= 0); + next.set("maxNum", num); + next.set("ai", function (card) { + if (_status.event.goon) return -1; + var num = _status.event.maxNum; + if (ui.selected.cards.length >= num - 1) { + var cards = player.getCards("he", function (cardx) { + return cardx != card && !ui.selected.cards.includes(cardx); }); - var val=0; - for(var cardx of cards) val+=get.value(cardx); - if(val>=14) return 0; + var val = 0; + for (var cardx of cards) val += get.value(cardx); + if (val >= 14) return 0; } return get.value(card); }); - } - else event._result={bool:false}; - 'step 3' - if(!result.bool) player.draw(3); + } else event._result = { bool: false }; + ("step 3"); + if (!result.bool) player.draw(3); else { - var cards=target.getCards('he'); + var cards = target.getCards("he"); cards.removeArray(result.cards); - if(cards.length) target.discard(cards); + if (cards.length) target.discard(cards); } }, - ai:{ - threaten:1.3, - expose:0.2, + ai: { + threaten: 1.3, + expose: 0.2, }, }, - tiansuan:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ + tiansuan: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { return !player.storage.tiansuan2; }, - content:function(){ - 'step 0' - player.chooseControl('上上签','上签','中签','下签','下下签','cancel2').set('prompt','天算:是否增加其中一个命运签的权重?').set('ai',function(){ - return Math.random()<0.5?0:4; - }); - 'step 1' - var list=[0,1,1,2,2,2,3,3,4]; - if(result.control!='cancel2') list.push(result.index); - var num=list.randomGet(); - event.num=num; - var str=get.translation(player)+'抽取的命运签为:'+lib.skill['tiansuan2_'+num].name; - game.log(player,'抽取出了','#g'+lib.skill['tiansuan2_'+num].name); - event.dialog=ui.create.dialog(str); - event.videoId=lib.status.videoId++; - game.broadcast('createDialog',event.videoId,str); - game.pause(); - setTimeout(function(){ - game.resume(); - },1500); - 'step 2' - event.dialog.close(); - game.broadcast('closeDialog',event.videoId); - player.chooseTarget(true,'令一名角色获得“'+lib.skill['tiansuan2_'+num].name+'”').set('ai',lib.skill['tiansuan2_'+num].aiCheck); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - game.log(player,'令',target,'获得了命运签'); - player.storage.tiansuan2=target; - player.storage.tiansuan3='tiansuan2_'+num; - player.addTempSkill('tiansuan2',{player:'phaseBegin'}); - target.addSkill('tiansuan2_'+num); - if(num<2&&target.countGainableCards(player,target==player?'e':'he')>0){ - var next=player.gainPlayerCard(target,target==player?'e':'he',true); - if(num==0) next.visible=true; - } - else game.delayx(); - } + content: function () { + "step 0"; + player + .chooseControl("上上签", "上签", "中签", "下签", "下下签", "cancel2") + .set("prompt", "天算:是否增加其中一个命运签的权重?") + .set("ai", function () { + return Math.random() < 0.5 ? 0 : 4; + }); + ("step 1"); + var list = [0, 1, 1, 2, 2, 2, 3, 3, 4]; + if (result.control != "cancel2") list.push(result.index); + var num = list.randomGet(); + event.num = num; + var str = + get.translation(player) + "抽取的命运签为:" + lib.skill["tiansuan2_" + num].name; + game.log(player, "抽取出了", "#g" + lib.skill["tiansuan2_" + num].name); + event.dialog = ui.create.dialog(str); + event.videoId = lib.status.videoId++; + game.broadcast("createDialog", event.videoId, str); + game.pause(); + setTimeout(function () { + game.resume(); + }, 1500); + ("step 2"); + event.dialog.close(); + game.broadcast("closeDialog", event.videoId); + player + .chooseTarget(true, "令一名角色获得“" + lib.skill["tiansuan2_" + num].name + "”") + .set("ai", lib.skill["tiansuan2_" + num].aiCheck); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(player, "令", target, "获得了命运签"); + player.storage.tiansuan2 = target; + player.storage.tiansuan3 = "tiansuan2_" + num; + player.addTempSkill("tiansuan2", { player: "phaseBegin" }); + target.addSkill("tiansuan2_" + num); + if (num < 2 && target.countGainableCards(player, target == player ? "e" : "he") > 0) { + var next = player.gainPlayerCard(target, target == player ? "e" : "he", true); + if (num == 0) next.visible = true; + } else game.delayx(); + } }, - derivation:'tiansuan_faq', - ai:{ - order:7, - result:{ - player:1, + derivation: "tiansuan_faq", + ai: { + order: 7, + result: { + player: 1, }, }, }, - tiansuan2:{ - charlotte:true, - onremove:function(player,skill){ - if(player.storage.tiansuan2) player.storage.tiansuan2.removeSkill(player.storage.tiansuan3); + tiansuan2: { + charlotte: true, + onremove: function (player, skill) { + if (player.storage.tiansuan2) + player.storage.tiansuan2.removeSkill(player.storage.tiansuan3); delete player.storage.tiansuan2; delete player.storage.tiansuan3; }, }, - tiansuan2_0:{ - name:'上上签', - trigger:{player:'damageBegin4'}, - forced:true, - charlotte:true, - content:function(){ + tiansuan2_0: { + name: "上上签", + trigger: { player: "damageBegin4" }, + forced: true, + charlotte: true, + content: function () { trigger.cancel(); }, - mark:true, - intro:{ - content:'当你受到伤害时,防止此伤害。', + mark: true, + intro: { + content: "当你受到伤害时,防止此伤害。", }, - aiCheck:function(target){ - if(target.hasSkill('tiansuan2_0')) return 0; - var player=_status.event.player; - var att=get.attitude(player,target); - if(target.countCards('e',function(card){ - return get.value(card,target)<=0; - })) att*=2; - return att/Math.sqrt(Math.max(1,target.hp)); + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_0")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) + ) + att *= 2; + return att / Math.sqrt(Math.max(1, target.hp)); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&!player.hasSkillTag('jueqing',false,target)) return 'zerotarget'; - } + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) + return "zerotarget"; + }, }, }, }, - tiansuan2_1:{ - name:'上签', - trigger:{player:'damageBegin4'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.num>1; + tiansuan2_1: { + name: "上签", + trigger: { player: "damageBegin4" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.num > 1; }, - content:function(){ - trigger.num=1; + content: function () { + trigger.num = 1; }, - group:'tiansuan2_damage', - mark:true, - intro:{ - content:'当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。', + group: "tiansuan2_damage", + mark: true, + intro: { + content: "当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。", }, - aiCheck:function(target){ - if(target.hasSkill('tiansuan2_1')) return 0; - var player=_status.event.player; - var att=get.attitude(player,target); - if(target.countCards('e',function(card){ - return get.value(card,target)<=0; - })) att*=2; - if(target.hp==1) return att/2; - return att/Math.sqrt(Math.max(1,target.hp)); + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_1")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) + ) + att *= 2; + if (target.hp == 1) return att / 2; + return att / Math.sqrt(Math.max(1, target.hp)); }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.player){ - if(arg.player.hasSkillTag('jueqing',false,player)) return false; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; } }, - effect:{ - target:function(card,player,target,current){ - if(target&&target.hp>1&&get.tag(card,'damage')&&!player.hasSkillTag('jueqing',false,target)) return 0.8; - } + effect: { + target: function (card, player, target, current) { + if ( + target && + target.hp > 1 && + get.tag(card, "damage") && + !player.hasSkillTag("jueqing", false, target) + ) + return 0.8; + }, }, }, }, - tiansuan2_damage:{ - trigger:{player:'damageEnd'}, - charlotte:true, - content:function(){ + tiansuan2_damage: { + trigger: { player: "damageEnd" }, + charlotte: true, + content: function () { player.draw(trigger.num); }, }, - tiansuan2_2:{ - name:'中签', - trigger:{player:'damageBegin4'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.num>1; + tiansuan2_2: { + name: "中签", + trigger: { player: "damageBegin4" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.num > 1; }, - content:function(){ - trigger.num=1; + content: function () { + trigger.num = 1; }, - mark:true, - intro:{ - content:'当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。', + mark: true, + intro: { + content: "当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。", }, - aiCheck:function(target){ - if(target.hasSkill('tiansuan2_2')) return 0; - var player=_status.event.player; - target.addSkill('tiansuan2_ai'); - var num=get.damageEffect(target,player,player,'fire'); - target.removeSkill('tiansuan2_ai'); + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_2")) return 0; + var player = _status.event.player; + target.addSkill("tiansuan2_ai"); + var num = get.damageEffect(target, player, player, "fire"); + target.removeSkill("tiansuan2_ai"); return num; }, - group:['tiansuan2_fire','tiansuan2_ai'], + group: ["tiansuan2_fire", "tiansuan2_ai"], }, - tiansuan2_ai:{ - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.player){ - if(arg.player.hasSkillTag('jueqing',false,player)) return false; + tiansuan2_ai: { + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; } }, }, }, - tiansuan2_fire:{ - trigger:{player:'damageBefore'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return !event.hasNature('fire'); + tiansuan2_fire: { + trigger: { player: "damageBefore" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.hasNature("fire"); }, - content:function(){ - game.setNature(trigger,'fire'); + content: function () { + game.setNature(trigger, "fire"); }, }, - tiansuan2_3:{ - name:'下签', - trigger:{player:'damageBegin3'}, - forced:true, - charlotte:true, - content:function(){ + tiansuan2_3: { + name: "下签", + trigger: { player: "damageBegin3" }, + forced: true, + charlotte: true, + content: function () { trigger.num++; }, - mark:true, - intro:{ - content:'当你受到伤害时,你令此伤害+1。', + mark: true, + intro: { + content: "当你受到伤害时,你令此伤害+1。", }, - aiCheck:function(target){ - if(target.hasSkill('tiansuan2_3')) return 0; - var player=_status.event.player; - var att=get.attitude(player,target); - return -att/Math.sqrt(Math.max(1,target.hp)); + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_3")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + return -att / Math.sqrt(Math.max(1, target.hp)); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&!player.hasSkillTag('jueqing',false,target)&¤t<0) return 1.3; - } + ai: { + effect: { + target: function (card, player, target, current) { + if ( + get.tag(card, "damage") && + !player.hasSkillTag("jueqing", false, target) && + current < 0 + ) + return 1.3; + }, }, }, }, - tiansuan2_4:{ - name:'下下签', - trigger:{player:'damageBegin3'}, - forced:true, - charlotte:true, - content:function(){ + tiansuan2_4: { + name: "下下签", + trigger: { player: "damageBegin3" }, + forced: true, + charlotte: true, + content: function () { trigger.num++; }, - mod:{ - cardEnabled:function(card,player){ - if(card.name=='tao'||card.name=='jiu') return false; + mod: { + cardEnabled: function (card, player) { + if (card.name == "tao" || card.name == "jiu") return false; }, - cardSavable:function(card,player){ - if(card.name=='tao'||card.name=='jiu') return false; + cardSavable: function (card, player) { + if (card.name == "tao" || card.name == "jiu") return false; }, }, - mark:true, - intro:{ - content:'当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。', + mark: true, + intro: { + content: "当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。", }, - aiCheck:function(target){ - if(target.hasSkill('tiansuan2_4')) return 0; - var player=_status.event.player; - var att=get.attitude(player,target); - return -att/Math.sqrt(Math.max(1,target.hp)); + aiCheck: function (target) { + if (target.hasSkill("tiansuan2_4")) return 0; + var player = _status.event.player; + var att = get.attitude(player, target); + return -att / Math.sqrt(Math.max(1, target.hp)); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&!player.hasSkillTag('jueqing',false,target)&¤t<0) return 1.3; - } + ai: { + effect: { + target: function (card, player, target, current) { + if ( + get.tag(card, "damage") && + !player.hasSkillTag("jueqing", false, target) && + current < 0 + ) + return 1.3; + }, }, }, }, - relieren:{ - shaRelated:true, - audio:2, - audioname:['boss_lvbu3'], - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'&&player.canCompare(event.target); + relieren: { + shaRelated: true, + audio: 2, + audioname: ["boss_lvbu3"], + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && player.canCompare(event.target); }, - check:function(event,player){ - return get.attitude(player,event.target)<0; + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, //priority:5, - content:function(){ - "step 0" - player.chooseToCompare(trigger.target).clear=false; - "step 1" - if(result.bool){ - if(trigger.target.countGainableCards(player,'he')) player.gainPlayerCard(trigger.target,true,'he'); + content: function () { + "step 0"; + player.chooseToCompare(trigger.target).clear = false; + ("step 1"); + if (result.bool) { + if (trigger.target.countGainableCards(player, "he")) + player.gainPlayerCard(trigger.target, true, "he"); ui.clear(); + } else { + var card1 = result.player; + var card2 = result.target; + if (get.position(card1) == "d") trigger.target.gain(card1, "gain2"); + if (get.position(card2) == "d") player.gain(card2, "gain2"); } - else{ - var card1=result.player; - var card2=result.target; - if(get.position(card1)=='d') trigger.target.gain(card1,'gain2'); - if(get.position(card2)=='d') player.gain(card2,'gain2'); - } - } - }, - retiaoxin:{ - audio:'tiaoxin', - audioname:['sp_jiangwei','xiahouba','re_jiangwei'], - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he'); }, - content:function(){ - "step 0" - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'挑衅:对'+get.translation(player)+'使用一张杀,或令其弃置你的一张牌').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',player); - "step 1" - if(result.bool==false&&target.countCards('he')>0){ - player.discardPlayerCard(target,'he',true); - } - else{ + }, + retiaoxin: { + audio: "tiaoxin", + audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei"], + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he"); + }, + content: function () { + "step 0"; + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "挑衅:对" + get.translation(player) + "使用一张杀,或令其弃置你的一张牌") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", player); + ("step 1"); + if (result.bool == false && target.countCards("he") > 0) { + player.discardPlayerCard(target, "he", true); + } else { event.finish(); } }, - ai:{ - order:4, - expose:0.2, - result:{ - target:-1, - player:function(player,target){ - if(!target.canUse('sha',player)) return 0; - if(target.countCards('h')==0) return 0; - if(target.countCards('h')==1) return -0.1; - if(player.hp<=2) return -2; - if(player.countCards('h','shan')==0) return -1; + ai: { + order: 4, + expose: 0.2, + result: { + target: -1, + player: function (player, target) { + if (!target.canUse("sha", player)) return 0; + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; return -0.5; - } + }, }, - threaten:1.1 - } + threaten: 1.1, + }, }, //南华老仙 - yufeng:{ - inherit:'yufeng_old', - content:function(){ - "step 0" - if(_status.connectMode) event.time=lib.configOL.choose_timeout; - event.videoId=lib.status.videoId++; - var maxScore = Math.max(2,1+player.countMark('yufeng')); - if(player.isUnderControl()){ + yufeng: { + inherit: "yufeng_old", + content: function () { + "step 0"; + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + event.videoId = lib.status.videoId++; + var maxScore = Math.max(2, 1 + player.countMark("yufeng")); + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ + var switchToAuto = function () { game.pause(); game.countChoose(); - setTimeout(function(){ - _status.imchoosing=false; - var max=Math.max(2,1+player.countMark('yufeng')); - var score=Math.random()<0.5?max:get.rand(1,max); - event._result={ - bool:true, - score:score, - win:score>=max, + setTimeout(function () { + _status.imchoosing = false; + var max = Math.max(2, 1 + player.countMark("yufeng")); + var score = Math.random() < 0.5 ? max : get.rand(1, max); + event._result = { + bool: true, + score: score, + win: score >= max, }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); game.resume(); - },5000); + }, 5000); }; - var createDialog=function(player,id){ - if(_status.connectMode) lib.configOL.choose_timeout='30'; - if(player==game.me) return; - var str=get.translation(player)+'正在表演《御风飞行》...
    '; - ui.create.dialog(str).videoId=id; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在表演《御风飞行》...
    "; + ui.create.dialog(str).videoId = id; + }; + var chooseButton = function (maxScore) { + lib.skill.yufeng.$playFlappyBird(maxScore); }; - var chooseButton=function(maxScore){lib.skill.yufeng.$playFlappyBird(maxScore)}; //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog,player,event.videoId); - if(event.isMine()){ + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { chooseButton(maxScore); - } - else if(event.isOnline()){ - event.player.send(chooseButton,maxScore); + } else if (event.isOnline()) { + event.player.send(chooseButton, maxScore); event.player.wait(); game.pause(); - } - else{ + } else { switchToAuto(); } - "step 1" - game.broadcastAll(function(id,time){ - if(_status.connectMode) lib.configOL.choose_timeout=time; - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - },event.videoId,event.time); - var result=event.result||result; - player.popup(get.cnNumber(result.score)+'分',result.win?'wood':'fire') - game.log(player,'御风飞行',result.win?'#g成功':'#y失败'); - game.log(player,'获得了','#g'+result.score+'分'); - var max=player.countMark('yufeng'); - if(!result.win){ - if(result.score) player.draw(result.score); - if(max) player.removeMark('yufeng',max,false); + ("step 1"); + game.broadcastAll( + function (id, time) { + if (_status.connectMode) lib.configOL.choose_timeout = time; + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + }, + event.videoId, + event.time + ); + var result = event.result || result; + player.popup(get.cnNumber(result.score) + "分", result.win ? "wood" : "fire"); + game.log(player, "御风飞行", result.win ? "#g成功" : "#y失败"); + game.log(player, "获得了", "#g" + result.score + "分"); + var max = player.countMark("yufeng"); + if (!result.win) { + if (result.score) player.draw(result.score); + if (max) player.removeMark("yufeng", max, false); event.finish(); + } else { + if (max < 2) player.addMark("yufeng", 1, false); + event.score = result.score; + player + .chooseTarget( + "请选择【御风】的目标", + [1, result.score], + function (card, player, target) { + return target != player && !target.hasSkill("yufeng2"); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target), + attx = att * 2; + if (att <= 0 || target.hasSkill("xinfu_pdgyingshi")) return 0; + if (target.hasJudge("lebu")) attx -= att; + if (target.hasJudge("bingliang")) attx -= att; + return attx / Math.max(2.25, Math.sqrt(target.countCards("h") + 1)); + }); } - else{ - if(max<2) player.addMark('yufeng',1,false); - event.score=result.score; - player.chooseTarget('请选择【御风】的目标',[1,result.score],function(card,player,target){ - return target!=player&&!target.hasSkill('yufeng2'); - }).set('ai',function(target){ - var player=_status.event.player; - var att=-get.attitude(player,target),attx=att*2; - if(att<=0||target.hasSkill('xinfu_pdgyingshi')) return 0; - if(target.hasJudge('lebu')) attx-=att; - if(target.hasJudge('bingliang')) attx-=att; - return attx/Math.max(2.25,Math.sqrt(target.countCards('h')+1)); - }); - } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { result.targets.sortBySeat(); - player.line(result.targets,'green'); - game.log(result.targets,'获得了','#y“御风”','效果'); - for(var i of result.targets) i.addSkill('yufeng2'); - if(event.score>result.targets.length) player.draw(event.score-result.targets.length); - } - else player.draw(event.score); + player.line(result.targets, "green"); + game.log(result.targets, "获得了", "#y“御风”", "效果"); + for (var i of result.targets) i.addSkill("yufeng2"); + if (event.score > result.targets.length) + player.draw(event.score - result.targets.length); + } else player.draw(event.score); }, - $playFlappyBird:function(maxScore,title){ + $playFlappyBird: function (maxScore, title) { //Forked from: https://github.com/aaarafat/JS-Flappy-Bird - const event=_status.event; - const dialog=ui.create.dialog('forcebutton','hidden'); - dialog.textPrompt=dialog.add('
    准备好了吗?
    '); - dialog.classList.add('fixed'); - dialog.classList.add('scroll1'); - dialog.classList.add('scroll2'); - dialog.classList.add('fullwidth'); - dialog.classList.add('fullheight'); - dialog.classList.add('noupdate'); - const updateText=function(str){ - dialog.textPrompt.innerHTML='
    '+str+'
    '; - } + const event = _status.event; + const dialog = ui.create.dialog("forcebutton", "hidden"); + dialog.textPrompt = dialog.add('
    准备好了吗?
    '); + dialog.classList.add("fixed"); + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.classList.add("noupdate"); + const updateText = function (str) { + dialog.textPrompt.innerHTML = '
    ' + str + "
    "; + }; - const canvas=document.createElement('canvas'); + const canvas = document.createElement("canvas"); dialog.appendChild(canvas); - canvas.style.position="absolute"; - canvas.style.width='276px'; - canvas.style.height='414px'; - canvas.style.left="calc(50% - 141px)"; - canvas.style.top="calc(50% - 200px)"; - canvas.width=276; - canvas.height=414; - canvas.style.border='3px solid'; + canvas.style.position = "absolute"; + canvas.style.width = "276px"; + canvas.style.height = "414px"; + canvas.style.left = "calc(50% - 141px)"; + canvas.style.top = "calc(50% - 200px)"; + canvas.width = 276; + canvas.height = 414; + canvas.style.border = "3px solid"; const RAD = Math.PI / 180; - const ctx=canvas.getContext('2d'); + const ctx = canvas.getContext("2d"); let frames = 0; let dx = 0.1; let previousDOMHighResTimeStamp = performance.now(); @@ -9318,8 +11545,8 @@ game.import('character', function () { getReady: 0, Play: 1, gameOver: 2, - gameSuccess:3, - } + gameSuccess: 3, + }; const SFX = { start: new Audio(), flap: new Audio(), @@ -9337,10 +11564,10 @@ game.import('character', function () { ctx.drawImage(this.sprite, this.x, this.y); }, update: function () { - if(state.curr == state.gameOver || state.curr == state.gameSuccess) return; + if (state.curr == state.gameOver || state.curr == state.gameSuccess) return; this.x -= dx * deltaTime; const halfWidth = this.sprite.width / 4; - if(this.x <= -halfWidth) this.x += halfWidth; + if (this.x <= -halfWidth) this.x += halfWidth; }, }; const bg = { @@ -9378,7 +11605,7 @@ game.import('character', function () { this.timeElapsed -= 1600; this.pipes.push({ x: parseFloat(canvas.width), - y: -210 * Math.min(Math.random()*0.8 + 1.2, 1.8), + y: -210 * Math.min(Math.random() * 0.8 + 1.2, 1.8), }); } this.pipes.forEach((pipe) => { @@ -9419,12 +11646,13 @@ game.import('character', function () { this.totalTimeElapsed += deltaTime; let r = parseFloat(this.animations[0].sprite.width) / 2; switch (state.curr) { - case state.getReady: case state.gameSuccess: + case state.getReady: + case state.gameSuccess: this.rotatation = 0; this.timeElapsed += deltaTime; if (this.timeElapsed >= 200) { this.timeElapsed -= 200; - this.y += Math.sin(this.totalTimeElapsed / 10 * RAD); + this.y += Math.sin((this.totalTimeElapsed / 10) * RAD); this.frame++; } break; @@ -9437,17 +11665,16 @@ game.import('character', function () { this.y += this.speed * deltaTime; this.setRotation(); this.speed += this.gravity * deltaTime; - if(UI.score.curr >= maxScore){ + if (UI.score.curr >= maxScore) { state.curr = state.gameSuccess; this.timeElapsed = 0; - updateText(`${title||'御风飞行'}表演成功!`) - setTimeout(switchToAuto,2000); - } - else if (this.y + r >= gnd.y || this.collisioned()) { + updateText(`${title || "御风飞行"}表演成功!`); + setTimeout(switchToAuto, 2000); + } else if (this.y + r >= gnd.y || this.collisioned()) { state.curr = state.gameOver; this.timeElapsed = 0; - updateText(`${title||'御风飞行'}表演失败……`) - setTimeout(switchToAuto,2000); + updateText(`${title || "御风飞行"}表演失败……`); + setTimeout(switchToAuto, 2000); } break; case state.gameOver: @@ -9499,8 +11726,7 @@ game.import('character', function () { Promise.resolve(SFX.hit.play()).catch(() => void 0); return true; } - } - else if (pipe.moved) { + } else if (pipe.moved) { updateText(`当前分数:${++UI.score.curr}`); const score = SFX.score; score.currentTime = 0; @@ -9526,7 +11752,7 @@ game.import('character', function () { frame: 0, timeElapsed: 0, draw: function () { - switch (state.curr) { + switch (state.curr) { case state.getReady: this.y = parseFloat(canvas.height - this.getReady.sprite.height) / 2; this.x = parseFloat(canvas.width - this.getReady.sprite.width) / 2; @@ -9536,13 +11762,19 @@ game.import('character', function () { ctx.drawImage(this.getReady.sprite, this.x, this.y); ctx.drawImage(this.tap[this.frame].sprite, this.tx, this.ty); break; - case state.gameOver: case state.gameSuccess: + case state.gameOver: + case state.gameSuccess: this.y = parseFloat(canvas.height - this.gameOver.sprite.height) / 2; this.x = parseFloat(canvas.width - this.gameOver.sprite.width) / 2; this.tx = parseFloat(canvas.width - this.tap[0].sprite.width) / 2; this.ty = this.y + this.gameOver.sprite.height - this.tap[0].sprite.height; - ctx.drawImage((state.curr == state.gameOver ? this.gameOver : this.gameClear).sprite, this.x, this.y); + ctx.drawImage( + (state.curr == state.gameOver ? this.gameOver : this.gameClear) + .sprite, + this.x, + this.y + ); } }, update: function () { @@ -9556,44 +11788,44 @@ game.import('character', function () { if (this.frame >= tapLength) this.frame -= tapLength; }, }; - gnd.sprite.src = lib.assetURL+"image/flappybird/ground.png"; - bg.sprite.src = lib.assetURL+"image/flappybird/BG.png"; - pipe.top.sprite.src = lib.assetURL+"image/flappybird/toppipe.png"; - pipe.bot.sprite.src = lib.assetURL+"image/flappybird/botpipe.png"; - UI.gameOver.sprite.src = lib.assetURL+"image/flappybird/gameover.png"; - UI.gameClear.sprite.src = lib.assetURL+"image/flappybird/gameclear.png"; - UI.getReady.sprite.src = lib.assetURL+"image/flappybird/getready.png"; - UI.tap[0].sprite.src = lib.assetURL+"image/flappybird/tap/t0.png"; - UI.tap[1].sprite.src = lib.assetURL+"image/flappybird/tap/t1.png"; - bird.animations[0].sprite.src = lib.assetURL+"image/flappybird/bird/b0.png"; - bird.animations[1].sprite.src = lib.assetURL+"image/flappybird/bird/b1.png"; - bird.animations[2].sprite.src = lib.assetURL+"image/flappybird/bird/b2.png"; - bird.animations[3].sprite.src = lib.assetURL+"image/flappybird/bird/b0.png"; + gnd.sprite.src = lib.assetURL + "image/flappybird/ground.png"; + bg.sprite.src = lib.assetURL + "image/flappybird/BG.png"; + pipe.top.sprite.src = lib.assetURL + "image/flappybird/toppipe.png"; + pipe.bot.sprite.src = lib.assetURL + "image/flappybird/botpipe.png"; + UI.gameOver.sprite.src = lib.assetURL + "image/flappybird/gameover.png"; + UI.gameClear.sprite.src = lib.assetURL + "image/flappybird/gameclear.png"; + UI.getReady.sprite.src = lib.assetURL + "image/flappybird/getready.png"; + UI.tap[0].sprite.src = lib.assetURL + "image/flappybird/tap/t0.png"; + UI.tap[1].sprite.src = lib.assetURL + "image/flappybird/tap/t1.png"; + bird.animations[0].sprite.src = lib.assetURL + "image/flappybird/bird/b0.png"; + bird.animations[1].sprite.src = lib.assetURL + "image/flappybird/bird/b1.png"; + bird.animations[2].sprite.src = lib.assetURL + "image/flappybird/bird/b2.png"; + bird.animations[3].sprite.src = lib.assetURL + "image/flappybird/bird/b0.png"; - SFX.start.src = lib.assetURL+"audio/effect/flappybird_start.wav"; - SFX.flap.src = lib.assetURL+"audio/effect/flappybird_flap.wav"; - SFX.score.src = lib.assetURL+"audio/effect/flappybird_score.wav"; - SFX.hit.src = lib.assetURL+"audio/effect/flappybird_hit.wav"; - SFX.die.src = lib.assetURL+"audio/effect/flappybird_die.wav"; + SFX.start.src = lib.assetURL + "audio/effect/flappybird_start.wav"; + SFX.flap.src = lib.assetURL + "audio/effect/flappybird_flap.wav"; + SFX.score.src = lib.assetURL + "audio/effect/flappybird_score.wav"; + SFX.hit.src = lib.assetURL + "audio/effect/flappybird_hit.wav"; + SFX.die.src = lib.assetURL + "audio/effect/flappybird_die.wav"; - const gameLoop = domHighResTimeStamp => { - if(frames<0) return; + const gameLoop = (domHighResTimeStamp) => { + if (frames < 0) return; deltaTime = domHighResTimeStamp - previousDOMHighResTimeStamp; previousDOMHighResTimeStamp = domHighResTimeStamp; update(); draw(); frames++; window.requestAnimationFrame(gameLoop); - } + }; - const update = function(){ + const update = function () { bird.update(); gnd.update(); pipe.update(); UI.update(); - } + }; - const draw = function(){ + const draw = function () { ctx.fillStyle = "#30c0df"; ctx.fillRect(0, 0, canvas.width, canvas.height); bg.draw(); @@ -9602,9 +11834,9 @@ game.import('character', function () { bird.draw(); gnd.draw(); UI.draw(); - } + }; - const click = function(){ + const click = function () { switch (state.curr) { case state.getReady: state.curr = state.Play; @@ -9612,690 +11844,824 @@ game.import('character', function () { Promise.resolve(SFX.start.play()).catch(() => void 0); updateText(`当前分数:${UI.score.curr}`); break; - case state.Play: bird.flap(); + case state.Play: + bird.flap(); } }; - const switchToAuto = function(){ - event._result={ - bool:true, - score:UI.score.curr, - win:UI.score.curr>=maxScore, + const switchToAuto = function () { + event._result = { + bool: true, + score: UI.score.curr, + win: UI.score.curr >= maxScore, }; dialog.close(); game.resume(); - _status.imchoosing=false; - frames=-1; - document.removeEventListener(lib.config.touchscreen?'touchstart':'mousedown',click); - } + _status.imchoosing = false; + frames = -1; + document.removeEventListener( + lib.config.touchscreen ? "touchstart" : "mousedown", + click + ); + }; dialog.open(); game.pause(); game.countChoose(); - document.addEventListener(lib.config.touchscreen?'touchstart':'mousedown',click); + document.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", click); window.requestAnimationFrame(gameLoop); }, }, - yufeng_old:{ - audio:2, - enable:'phaseUse', - usable:1, - content:function(){ - "step 0" - if(_status.connectMode) event.time=lib.configOL.choose_timeout; - event.videoId=lib.status.videoId++; - if(player.isUnderControl()){ + yufeng_old: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ + var switchToAuto = function () { game.pause(); game.countChoose(); - setTimeout(function(){ - _status.imchoosing=false; - var max=Math.max(2,1+game.me.countMark('yufeng')); - var score=Math.random()<0.5?max:get.rand(1,max); - event._result={ - bool:true, - score:score, - win:score>=max, + setTimeout(function () { + _status.imchoosing = false; + var max = Math.max(2, 1 + game.me.countMark("yufeng")); + var score = Math.random() < 0.5 ? max : get.rand(1, max); + event._result = { + bool: true, + score: score, + win: score >= max, }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); game.resume(); - },5000); + }, 5000); }; - var createDialog=function(player,id){ - if(_status.connectMode) lib.configOL.choose_timeout='30'; - if(player==game.me) return; - var str=get.translation(player)+'正在表演《御风飞行》...
    '; - ui.create.dialog(str).videoId=id; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在表演《御风飞行》...
    "; + ui.create.dialog(str).videoId = id; }; - var chooseButton=function(){ - var roundmenu=false; - if(ui.roundmenu&&ui.roundmenu.display!='none'){ - roundmenu=true; - ui.roundmenu.style.display='none'; + var chooseButton = function () { + var roundmenu = false; + if (ui.roundmenu && ui.roundmenu.display != "none") { + roundmenu = true; + ui.roundmenu.style.display = "none"; } - var event=_status.event; - event.settleed=false; - event.score=0; - event.dialog=ui.create.dialog('forcebutton','hidden'); - event.dialog.textPrompt=event.dialog.add('
    准备好了吗?准备好了的话就点击屏幕开始吧!
    '); - var max=Math.max(2,1+game.me.countMark('yufeng')); - event.dialog.textPrompt.style["z-index"]=10; - event.switchToAuto=function(){ - event._result={ - bool:true, - score:event.score, - win:event.score>=max, + var event = _status.event; + event.settleed = false; + event.score = 0; + event.dialog = ui.create.dialog("forcebutton", "hidden"); + event.dialog.textPrompt = event.dialog.add( + '
    准备好了吗?准备好了的话就点击屏幕开始吧!
    ' + ); + var max = Math.max(2, 1 + game.me.countMark("yufeng")); + event.dialog.textPrompt.style["z-index"] = 10; + event.switchToAuto = function () { + event._result = { + bool: true, + score: event.score, + win: event.score >= max, }; event.dialog.close(); game.resume(); - _status.imchoosing=false; - if(roundmenu) ui.roundmenu.style.display=''; + _status.imchoosing = false; + if (roundmenu) ui.roundmenu.style.display = ""; }; - event.dialog.classList.add('fixed'); - event.dialog.classList.add('scroll1'); - event.dialog.classList.add('scroll2'); - event.dialog.classList.add('fullwidth'); - event.dialog.classList.add('fullheight'); - event.dialog.classList.add('noupdate'); - event.dialog.style.overflow='hidden'; + event.dialog.classList.add("fixed"); + event.dialog.classList.add("scroll1"); + event.dialog.classList.add("scroll2"); + event.dialog.classList.add("fullwidth"); + event.dialog.classList.add("fullheight"); + event.dialog.classList.add("noupdate"); + event.dialog.style.overflow = "hidden"; event.dialog.open(); - var height=event.dialog.offsetHeight; - var width=event.dialog.offsetWidth; - var top=50; - var speed=0; - var start=false; + var height = event.dialog.offsetHeight; + var width = event.dialog.offsetWidth; + var top = 50; + var speed = 0; + var start = false; - var bird=ui.create.div(''); - bird.style["background-image"]='linear-gradient(rgba(240, 235, 3, 1), rgba(230, 225, 5, 1))'; - bird.style["border-radius"]='3px'; - var pipes=[]; - bird.style.position='absolute'; - bird.style.height='40px'; - bird.style.width='40px'; - bird.style.left=Math.ceil(width/3)+'px'; - bird.style.top=(top/100*height)+'px'; - bird.updatePosition=function(){ - bird.style.transform='translateY('+(top/100*height-bird.offsetTop)+'px)'; + var bird = ui.create.div(""); + bird.style["background-image"] = + "linear-gradient(rgba(240, 235, 3, 1), rgba(230, 225, 5, 1))"; + bird.style["border-radius"] = "3px"; + var pipes = []; + bird.style.position = "absolute"; + bird.style.height = "40px"; + bird.style.width = "40px"; + bird.style.left = Math.ceil(width / 3) + "px"; + bird.style.top = (top / 100) * height + "px"; + bird.updatePosition = function () { + bird.style.transform = + "translateY(" + ((top / 100) * height - bird.offsetTop) + "px)"; }; event.dialog.appendChild(bird); - var isDead=function(){ - if(top>100||top<0) return true; - var btop=top; - var bleft=100/3; - var bdown=btop+5; - var bright=bleft+5; - for(var i of pipes){ - var left2=i.left; - var right2=left2+10; - var bottom2=i.height1; - var top2=i.height2; + var isDead = function () { + if (top > 100 || top < 0) return true; + var btop = top; + var bleft = 100 / 3; + var bdown = btop + 5; + var bright = bleft + 5; + for (var i of pipes) { + var left2 = i.left; + var right2 = left2 + 10; + var bottom2 = i.height1; + var top2 = i.height2; - if(left2>bright||right2top2) return true; + if (left2 > bright || right2 < bleft) continue; + if (btop < bottom2) return true; + if (bdown > top2) return true; return false; } return false; }; - var fly=function(){ - if(!start){ - start=true; - event.dialog.textPrompt.innerHTML='
    当前分数:'+event.score+'
    '; - speed=-4; - event.fly=setInterval(function(){ - top+=speed; - if(top<0) top=0; + var fly = function () { + if (!start) { + start = true; + event.dialog.textPrompt.innerHTML = + '
    当前分数:' + event.score + "
    "; + speed = -4; + event.fly = setInterval(function () { + top += speed; + if (top < 0) top = 0; bird.updatePosition(); - for(var i of pipes){ - i.left-=0.5; + for (var i of pipes) { + i.left -= 0.5; i.updateLeft(); } - speed+=0.5; - if(speed>2.5) speed=2.5; + speed += 0.5; + if (speed > 2.5) speed = 2.5; - if(isDead()==true){ + if (isDead() == true) { event.settle(); } - },35); - var addPipe=function(){ - var num=get.rand(5,55); + }, 35); + var addPipe = function () { + var num = get.rand(5, 55); - var pipe1=ui.create.div(''); - pipe1.style["background-image"]='linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))'; - pipe1.style["border-radius"]='3px'; - pipe1.style.position='absolute'; - pipe1.height1=num; - pipe1.height2=num+50; - pipe1.left=110; - pipe1.num=1; - pipe1.style.height=Math.ceil(height*num/100)+'px'; - pipe1.style.width=(width/10)+'px'; - pipe1.style.left=(pipe1.left*width/100)+'px'; - pipe1.style.top='0px'; + var pipe1 = ui.create.div(""); + pipe1.style["background-image"] = + "linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))"; + pipe1.style["border-radius"] = "3px"; + pipe1.style.position = "absolute"; + pipe1.height1 = num; + pipe1.height2 = num + 50; + pipe1.left = 110; + pipe1.num = 1; + pipe1.style.height = Math.ceil((height * num) / 100) + "px"; + pipe1.style.width = width / 10 + "px"; + pipe1.style.left = (pipe1.left * width) / 100 + "px"; + pipe1.style.top = "0px"; - var pipe2=ui.create.div(''); - pipe2.style["background-image"]='linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))'; - pipe2.style["border-radius"]='3px'; - pipe1.pipe2=pipe2; - pipe2.style.position='absolute'; - pipe2.style.height=Math.ceil((100-pipe1.height2)*height/100)+'px'; - pipe2.style.width=(width/10)+'px'; - pipe2.style.left=(pipe1.left*width/100)+'px'; - pipe2.style.top=Math.ceil(pipe1.height2*height/100)+'px'; + var pipe2 = ui.create.div(""); + pipe2.style["background-image"] = + "linear-gradient(rgba(57, 133, 4, 1), rgba(60, 135, 6, 1))"; + pipe2.style["border-radius"] = "3px"; + pipe1.pipe2 = pipe2; + pipe2.style.position = "absolute"; + pipe2.style.height = + Math.ceil(((100 - pipe1.height2) * height) / 100) + "px"; + pipe2.style.width = width / 10 + "px"; + pipe2.style.left = (pipe1.left * width) / 100 + "px"; + pipe2.style.top = Math.ceil((pipe1.height2 * height) / 100) + "px"; pipes.add(pipe1); event.dialog.appendChild(pipe1); event.dialog.appendChild(pipe2); - pipe1.updateLeft=function(){ - this.style.transform='translateX('+((this.left/100*width)-this.offsetLeft)+'px)'; - this.pipe2.style.transform='translateX('+((this.left/100*width)-this.pipe2.offsetLeft)+'px)'; - if(this.left<25&&!this.score){ - this.score=true; + pipe1.updateLeft = function () { + this.style.transform = + "translateX(" + + ((this.left / 100) * width - this.offsetLeft) + + "px)"; + this.pipe2.style.transform = + "translateX(" + + ((this.left / 100) * width - this.pipe2.offsetLeft) + + "px)"; + if (this.left < 25 && !this.score) { + this.score = true; event.score++; - event.dialog.textPrompt.innerHTML='
    当前分数:'+event.score+'
    '; - if(event.score>=max){ + event.dialog.textPrompt.innerHTML = + '
    当前分数:' + + event.score + + "
    "; + if (event.score >= max) { event.settle(); } } - if(this.left<-15){ + if (this.left < -15) { this.remove(); this.pipe2.remove(); pipes.remove(this); } - } + }; }; - event.addPipe=setInterval(addPipe,2500); - } - else if(speed>0){ - speed=-4; + event.addPipe = setInterval(addPipe, 2500); + } else if (speed > 0) { + speed = -4; } }; - document.addEventListener(lib.config.touchscreen?'touchstart':'mousedown',fly); + document.addEventListener(lib.config.touchscreen ? "touchstart" : "mousedown", fly); - event.settle=function(){ + event.settle = function () { clearInterval(event.fly); clearInterval(event.addPipe); - document.removeEventListener(lib.config.touchscreen?'touchstart':'mousedown',fly); - setTimeout(function(){ - event.switchToAuto() - },1000); + document.removeEventListener( + lib.config.touchscreen ? "touchstart" : "mousedown", + fly + ); + setTimeout(function () { + event.switchToAuto(); + }, 1000); }; game.pause(); game.countChoose(); }; //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog,player,event.videoId); - if(event.isMine()){ + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { chooseButton(); - } - else if(event.isOnline()){ + } else if (event.isOnline()) { event.player.send(chooseButton); event.player.wait(); game.pause(); - } - else{ + } else { switchToAuto(); } - "step 1" - game.broadcastAll(function(id,time){ - if(_status.connectMode) lib.configOL.choose_timeout=time; - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - },event.videoId,event.time); - var result=event.result||result; - player.popup(get.cnNumber(result.score)+'分',result.win?'wood':'fire') - game.log(player,'御风飞行',result.win?'#g成功':'#y失败'); - game.log(player,'获得了','#g'+result.score+'分'); - var max=player.countMark('yufeng'); - if(!result.win){ - if(result.score) player.draw(result.score); - if(max) player.removeMark('yufeng',max,false); + ("step 1"); + game.broadcastAll( + function (id, time) { + if (_status.connectMode) lib.configOL.choose_timeout = time; + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + }, + event.videoId, + event.time + ); + var result = event.result || result; + player.popup(get.cnNumber(result.score) + "分", result.win ? "wood" : "fire"); + game.log(player, "御风飞行", result.win ? "#g成功" : "#y失败"); + game.log(player, "获得了", "#g" + result.score + "分"); + var max = player.countMark("yufeng"); + if (!result.win) { + if (result.score) player.draw(result.score); + if (max) player.removeMark("yufeng", max, false); event.finish(); + } else { + if (max < 2) player.addMark("yufeng", 1, false); + event.score = result.score; + player + .chooseTarget( + "请选择【御风】的目标", + [1, result.score], + function (card, player, target) { + return target != player && !target.hasSkill("yufeng2"); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target), + attx = att * 2; + if (att <= 0 || target.hasSkill("xinfu_pdgyingshi")) return 0; + if (target.hasJudge("lebu")) attx -= att; + if (target.hasJudge("bingliang")) attx -= att; + return attx / Math.max(2.25, Math.sqrt(target.countCards("h") + 1)); + }); } - else{ - if(max<2) player.addMark('yufeng',1,false); - event.score=result.score; - player.chooseTarget('请选择【御风】的目标',[1,result.score],function(card,player,target){ - return target!=player&&!target.hasSkill('yufeng2'); - }).set('ai',function(target){ - var player=_status.event.player; - var att=-get.attitude(player,target),attx=att*2; - if(att<=0||target.hasSkill('xinfu_pdgyingshi')) return 0; - if(target.hasJudge('lebu')) attx-=att; - if(target.hasJudge('bingliang')) attx-=att; - return attx/Math.max(2.25,Math.sqrt(target.countCards('h')+1)); - }); - } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { result.targets.sortBySeat(); - player.line(result.targets,'green'); - game.log(result.targets,'获得了','#y“御风”','效果'); - for(var i of result.targets) i.addSkill('yufeng2'); - if(event.score>result.targets.length) player.draw(event.score-result.targets.length); - } - else player.draw(event.score); + player.line(result.targets, "green"); + game.log(result.targets, "获得了", "#y“御风”", "效果"); + for (var i of result.targets) i.addSkill("yufeng2"); + if (event.score > result.targets.length) + player.draw(event.score - result.targets.length); + } else player.draw(event.score); + }, + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, }, - ai:{ - order:10, - result:{player:1}, - threaten:3.2, - } }, - yufeng2:{ - trigger:{player:'phaseZhunbeiBegin'}, - audio:false, - forced:true, - charlotte:true, - content:function(){ - 'step 0' - player.removeSkill('yufeng2'); + yufeng2: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: false, + forced: true, + charlotte: true, + content: function () { + "step 0"; + player.removeSkill("yufeng2"); player.judge(); - 'step 1' - if(result.color=='red') player.skip('phaseDraw'); - else{ - player.skip('phaseUse'); - player.skip('phaseDiscard'); + ("step 1"); + if (result.color == "red") player.skip("phaseDraw"); + else { + player.skip("phaseUse"); + player.skip("phaseDiscard"); } }, - mark:true, - intro:{ - content:'准备阶段时进行判定,结果为红则跳过摸牌阶段,为黑则跳过出牌阶段和弃牌阶段', + mark: true, + intro: { + content: "准备阶段时进行判定,结果为红则跳过摸牌阶段,为黑则跳过出牌阶段和弃牌阶段", }, - ai:{ - order:7, - result:{ - player:1, + ai: { + order: 7, + result: { + player: 1, }, }, }, - tianshu:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.countCards('he')&&!game.hasPlayer(function(current){ - return current.countCards('ej','taipingyaoshu'); - }); + tianshu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ( + player.countCards("he") && + !game.hasPlayer(function (current) { + return current.countCards("ej", "taipingyaoshu"); + }) + ); }, - direct:true, - content:function(){ - 'step 0' + direct: true, + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt2('tianshu'), - filterCard:true, - position:'he', - ai1:function(card){ - return 5-get.value(card); + prompt: get.prompt2("tianshu"), + filterCard: true, + position: "he", + ai1: function (card) { + return 5 - get.value(card); }, - ai2:function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>0&&!target.hasEmptySlot(2)) return 0; - return get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0 && !target.hasEmptySlot(2)) return 0; + return get.attitude(player, target); }, }); - 'step 1' - if(!result.bool){event.finish();return;} - var target=result.targets[0]; - event.target=target; - player.logSkill('tianshu',target); - player.discard(result.cards); - if(!lib.inpile.includes('taipingyaoshu')){ - lib.inpile.push('taipingyaoshu'); - event.card=game.createCard2('taipingyaoshu','heart',3); + ("step 1"); + if (!result.bool) { + event.finish(); + return; } - else{ - event.card=get.cardPile(function(card){ - return card.name=='taipingyaoshu'; + var target = result.targets[0]; + event.target = target; + player.logSkill("tianshu", target); + player.discard(result.cards); + if (!lib.inpile.includes("taipingyaoshu")) { + lib.inpile.push("taipingyaoshu"); + event.card = game.createCard2("taipingyaoshu", "heart", 3); + } else { + event.card = get.cardPile(function (card) { + return card.name == "taipingyaoshu"; }); } - if(!event.card) event.finish(); - else target.gain(event.card,'gain2'); - 'step 2' - if(target.getCards('h').includes(card)&&get.name(card,target)=='taipingyaoshu') target.chooseUseTarget(card,'nopopup',true); + if (!event.card) event.finish(); + else target.gain(event.card, "gain2"); + ("step 2"); + if (target.getCards("h").includes(card) && get.name(card, target) == "taipingyaoshu") + target.chooseUseTarget(card, "nopopup", true); }, }, //界伏寿 - xinzhuikong:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - check:function(event,player){ - if(get.attitude(player,event.player)<-2){ - var cards=player.getCards('h'); - if(cards.length>player.hp) return true; - for(var i=0;i7&&useful<7) return true; + xinzhuikong: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (get.attitude(player, event.player) < -2) { + var cards = player.getCards("h"); + if (cards.length > player.hp) return true; + for (var i = 0; i < cards.length; i++) { + var useful = get.useful(cards[i]); + if (useful < 5) return true; + if (cards[i].number > 7 && useful < 7) return true; } } return false; }, - logTarget:'player', - filter:function(event,player){ - return !player.hasSkill('xinzhuikong2')&&player.hp<=event.player.hp&&player.canCompare(event.player); + logTarget: "player", + filter: function (event, player) { + return ( + !player.hasSkill("xinzhuikong2") && + player.hp <= event.player.hp && + player.canCompare(event.player) + ); }, - content:function(){ - "step 0" - player.addTempSkill('xinzhuikong2','roundStart'); - player.chooseToCompare(trigger.player).set('small',(player.hp>1&&get.effect(player,{name:'sha'},trigger.player,player)>0&&Math.random()<0.9)); - "step 1" - if(result.bool){ - trigger.player.addTempSkill('zishou2'); + content: function () { + "step 0"; + player.addTempSkill("xinzhuikong2", "roundStart"); + player + .chooseToCompare(trigger.player) + .set( + "small", + player.hp > 1 && + get.effect(player, { name: "sha" }, trigger.player, player) > 0 && + Math.random() < 0.9 + ); + ("step 1"); + if (result.bool) { + trigger.player.addTempSkill("zishou2"); event.finish(); - } - else if(result.target&&get.position(result.target)=='d') player.gain(result.target,'gain2','log'); - "step 2" - var card={name:'sha',isCard:true}; - if(trigger.player.canUse(card,player,false)) trigger.player.useCard(card,player,false); + } else if (result.target && get.position(result.target) == "d") + player.gain(result.target, "gain2", "log"); + ("step 2"); + var card = { name: "sha", isCard: true }; + if (trigger.player.canUse(card, player, false)) + trigger.player.useCard(card, player, false); }, }, - xinzhuikong2:{charlotte:true}, - xinqiuyuan:{ - audio:2, - trigger:{target:'useCardToTarget'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&game.hasPlayer(function(current){ - return current!=player&&!event.targets.includes(current)&&lib.filter.targetEnabled(event.card,event.player,current); - }); + xinzhuikong2: { charlotte: true }, + xinqiuyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return ( + current != player && + !event.targets.includes(current) && + lib.filter.targetEnabled(event.card, event.player, current) + ); + }) + ); }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('xinqiuyuan'),function(card,player,target){ - var evt=_status.event.getTrigger(); - return target!=player&&!evt.targets.includes(target)&&lib.filter.targetEnabled(evt.card,evt.player,target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,trigger.player,player)+0.1; - }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('xinqiuyuan',target); - event.target=target; - target.chooseCard(function(card,player){ - var name=get.name(card,player); - return name!='sha'&&get.type(name)=='basic'; - },'h','交给'+get.translation(player)+ - '一张不为【杀】的基本牌,或成为此杀的额外目标').set('ai',function(card){ - return get.attitude(target,_status.event.sourcex)>=0?1:-1; - }).set('sourcex',player); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinqiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + !evt.targets.includes(target) && + lib.filter.targetEnabled(evt.card, evt.player, target) + ); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xinqiuyuan", target); + event.target = target; + target + .chooseCard( + function (card, player) { + var name = get.name(card, player); + return name != "sha" && get.type(name) == "basic"; + }, + "h", + "交给" + + get.translation(player) + + "一张不为【杀】的基本牌,或成为此杀的额外目标" + ) + .set("ai", function (card) { + return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; + }) + .set("sourcex", player); game.delay(); - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool){ - target.give(result.cards,player); + ("step 2"); + if (result.bool) { + target.give(result.cards, player); game.delay(); - } - else{ + } else { trigger.getParent().targets.push(event.target); trigger.getParent().triggeredTargets2.push(event.target); - game.log(event.target,'成为了',trigger.card,'的额外目标'); + game.log(event.target, "成为了", trigger.card, "的额外目标"); } }, - ai:{ - expose:0.2, - effect:{ - target:function(card,player,target){ - if(card.name!='sha') return; - var players=game.filterPlayer(); - if(get.attitude(player,target)<=0){ - for(var i=0;i0&& - get.effect(target2,{name:'shacopy',nature:card.nature,suit:card.suit},player,player)<0){ - if(target.hp==target.maxHp) return 0.3; + ai: { + expose: 0.2, + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + var players = game.filterPlayer(); + if (get.attitude(player, target) <= 0) { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if ( + player != target2 && + target != target2 && + player.canUse(card, target2, false) && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + target + ) > 0 && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + player + ) < 0 + ) { + if (target.hp == target.maxHp) return 0.3; return 0.6; } } - } - else{ - for(var i=0;i0){ - if(player.canUse(card,target2)) return; - if(target.hp==target.maxHp) return [0,1]; - return [0,0]; + } else { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if ( + player != target2 && + target != target2 && + player.canUse(card, target2, false) && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + player + ) > 0 + ) { + if (player.canUse(card, target2)) return; + if (target.hp == target.maxHp) return [0, 1]; + return [0, 0]; } } } - } - } - } + }, + }, + }, }, //界潘璋马忠 - xinduodao:{ - audio:2, - trigger:{player:'damageEnd'}, - logTarget:'source', - filter:function(event,player){ - var source=event.source; - if(!source) return false; - var cards=source.getEquips(1); - return cards.some(card=>lib.filter.canBeGained(card,player,source)); + xinduodao: { + audio: 2, + trigger: { player: "damageEnd" }, + logTarget: "source", + filter: function (event, player) { + var source = event.source; + if (!source) return false; + var cards = source.getEquips(1); + return cards.some((card) => lib.filter.canBeGained(card, player, source)); }, - prompt2:function(event,player){ - var source=event.source; - var cards=source.getEquips(1).filter(card=>lib.filter.canBeGained(card,player,source)); - return '获得其装备区中的'+get.translation(cards); + prompt2: function (event, player) { + var source = event.source; + var cards = source + .getEquips(1) + .filter((card) => lib.filter.canBeGained(card, player, source)); + return "获得其装备区中的" + get.translation(cards); }, - check:function(event,player){ - return (get.attitude(player,event.source)+0.1)*get.value(event.source.getEquip(1),event.source); + check: function (event, player) { + return ( + (get.attitude(player, event.source) + 0.1) * + get.value(event.source.getEquip(1), event.source) + ); }, - content:function(){ - var source=trigger.source; - var cards=source.getEquips(1).filter(card=>lib.filter.canBeGained(card,player,source)); - player.gain(cards,source,'give','bySelf'); + content: function () { + var source = trigger.source; + var cards = source + .getEquips(1) + .filter((card) => lib.filter.canBeGained(card, player, source)); + player.gain(cards, source, "give", "bySelf"); }, }, - xinanjian:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - forced:true, - logTarget:'target', - filter:function(event,player){ - return event.card.name=='sha'&&!player.inRangeOf(event.target); + xinanjian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + logTarget: "target", + filter: function (event, player) { + return event.card.name == "sha" && !player.inRangeOf(event.target); }, - content:function(){ - 'step 0' - var card=get.translation(trigger.card); - var target=get.translation(trigger.target); - player.chooseControl().set('prompt','暗箭:请选择一项').set('choiceList',[ - '令'+target+'不能响应'+card, - '令'+card+'对'+target+'的伤害值基数+1', - ]).set('ai',function(){ - var target=_status.event.getTrigger().target; - var player=_status.event.player; - var num=target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))?0:1; - if(get.attitude(player,target)>0) num=1-num; - return num; - }); - 'step 1' - if(result.index==0){ - game.log(player,'令',trigger.card,'不能被',trigger.target,'响应'); + content: function () { + "step 0"; + var card = get.translation(trigger.card); + var target = get.translation(trigger.target); + player + .chooseControl() + .set("prompt", "暗箭:请选择一项") + .set("choiceList", [ + "令" + target + "不能响应" + card, + "令" + card + "对" + target + "的伤害值基数+1", + ]) + .set("ai", function () { + var target = _status.event.getTrigger().target; + var player = _status.event.player; + var num = target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ? 0 + : 1; + if (get.attitude(player, target) > 0) num = 1 - num; + return num; + }); + ("step 1"); + if (result.index == 0) { + game.log(player, "令", trigger.card, "不能被", trigger.target, "响应"); trigger.directHit.push(trigger.target); - } - else{ - game.log(player,'令',trigger.card,'对',trigger.target,'的伤害+1'); - var id=trigger.target.playerid; - var map=trigger.customArgs; - if(!map[id]) map[id]={}; - if(!map[id].extraDamage) map[id].extraDamage=0; + } else { + game.log(player, "令", trigger.card, "对", trigger.target, "的伤害+1"); + var id = trigger.target.playerid; + var map = trigger.customArgs; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; map[id].extraDamage++; } }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.card||!arg.target||arg.card.name!='sha'||arg.target.inRange(player)||get.attitude(player,arg.target)>0) return false; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + !arg || + !arg.card || + !arg.target || + arg.card.name != "sha" || + arg.target.inRange(player) || + get.attitude(player, arg.target) > 0 + ) + return false; }, }, }, //界郭笨 - mobilejingce:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - filter:function(event,player){ - var num=0; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name!='cardsDiscard') return; - var evtx=evt.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evt2=(evtx.relatedEvent||evtx.getParent()); - if(evt2&&(evt2.name=='useCard'||evt2.name=='respond')) num+=evt.cards.length; + mobilejingce: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + var num = 0; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "cardsDiscard") return; + var evtx = evt.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + if (evt2 && (evt2.name == "useCard" || evt2.name == "respond")) + num += evt.cards.length; }); - return num>=player.hp; + return num >= player.hp; }, - content:function(){ + content: function () { player.draw(2); }, - group:'mobilejingce_count', - intro:{ - content:function(num,player){ - if(num==0) return '一张都没有?就这?'; - if(num 0; + if (bool1 && bool2 && target.hp <= evt.num + 1) return 2; + if (bool1) return 0; + return 1; }); - var bool2=get.effect(target,{name:'shunshou'},player,player)>0; - if(bool1&&bool2&&target.hp<=evt.num+1) return 2; - if(bool1) return 0; - return 1; - }); - 'step 1' - if(result.index==2){ - trigger.taomie_player=trigger.player; - trigger.player.addTempSkill('taomie4'); + ("step 1"); + if (result.index == 2) { + trigger.taomie_player = trigger.player; + trigger.player.addTempSkill("taomie4"); } - if(result.index!=1){ + if (result.index != 1) { trigger.num++; } - if(result.index!=0&&trigger.player.countGainableCards(player,'hej')>0){ - player.gainPlayerCard(trigger.player,'hej',true); + if (result.index != 0 && trigger.player.countGainableCards(player, "hej") > 0) { + player.gainPlayerCard(trigger.player, "hej", true); + } else event.finish(); + ("step 2"); + var card = result.cards[0]; + if ( + card && + player.getCards("h").includes(card) && + game.hasPlayer(function (current) { + return current != player && current != trigger.player; + }) + ) { + event.card = card; + player + .chooseTarget( + "是否将" + get.translation(card) + "交给一名其他角色?", + function (card, player, target) { + return target != player && target != _status.event.getTrigger().player; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var card = _status.event.getParent().card; + if ( + target.hasSkillTag("nogain") || + !player.needsToDiscard() || + (get.tag(card, "damage") && + player.hasValueTarget(card, null, false) && + get.effect(_status.event.getTrigger().player, card, null, false) > 0) + ) + return 0; + return get.attitude(player, target) / (1 + target.countCards("h")); + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target); + player.give(card, target); } - else event.finish(); - 'step 2' - var card=result.cards[0]; - if(card&&player.getCards('h').includes(card)&&game.hasPlayer(function(current){ - return current!=player&¤t!=trigger.player; - })){ - event.card=card; - player.chooseTarget('是否将'+get.translation(card)+'交给一名其他角色?',function(card,player,target){ - return target!=player&&target!=_status.event.getTrigger().player; - }).set('ai',function(target){ - var player=_status.event.player; - var card=_status.event.getParent().card; - if(target.hasSkillTag('nogain')||!player.needsToDiscard()||(get.tag(card,'damage')&&player.hasValueTarget(card,null,false)&&get.effect(_status.event.getTrigger().player,card,null,false)>0)) return 0; - return get.attitude(player,target)/(1+target.countCards('h')); - }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target); - player.give(card,target); - } }, - mod:{ - inRangeOf:function(from,to){ - if(from.hasMark('taomie')) return true; + mod: { + inRangeOf: function (from, to) { + if (from.hasMark("taomie")) return true; }, - inRange:function(from,to){ - if(to.hasMark('taomie')) return true; + inRange: function (from, to) { + if (to.hasMark("taomie")) return true; }, }, - intro:{ - content:'mark', + intro: { + content: "mark", }, - ai:{ - effect:{ - player:function(card,player,target){ - if(target&&get.tag(card,'damage')&&target.hasMark('taomie')){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(get.attitude(player,target)>0){ + ai: { + effect: { + player: function (card, player, target) { + if (target && get.tag(card, "damage") && target.hasMark("taomie")) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.attitude(player, target) > 0) { return 0.7; } return 1.2; @@ -10304,255 +12670,295 @@ game.import('character', function () { }, }, }, - taomie1:{ - audio:true, - trigger:{ - player:'damageEnd', - source:'damageSource', + taomie1: { + audio: true, + trigger: { + player: "damageEnd", + source: "damageSource", }, - logTarget:function(trigger,player){ - if(player==trigger.player) return trigger.source; + logTarget: function (trigger, player) { + if (player == trigger.player) return trigger.source; return trigger.player; }, - filter:function(event,player){ - var target=lib.skill.taomie1.logTarget(event,player); - return target&&target.isIn()&&!target.hasMark('taomie'); + filter: function (event, player) { + var target = lib.skill.taomie1.logTarget(event, player); + return target && target.isIn() && !target.hasMark("taomie"); }, - check:function(event,player){ - var target=lib.skill.taomie1.logTarget(event,player); - if(get.attitude(player,target)>0) return false; - var target0=game.findPlayer(function(current){ - return current.hasMark('taomie'); + check: function (event, player) { + var target = lib.skill.taomie1.logTarget(event, player); + if (get.attitude(player, target) > 0) return false; + var target0 = game.findPlayer(function (current) { + return current.hasMark("taomie"); }); - if(!target0) return true; - var eff1=0,eff2=0; - player.countCards('h',function(card){ - if(!get.tag(card,'damage')) return false; - if(player.hasValueTarget(card,null,true)>0){ - if(player.canUse(card,target,null,true)){ - var eff=get.effect(target,card,player,player); - if(eff>0) eff1+=eff; + if (!target0) return true; + var eff1 = 0, + eff2 = 0; + player.countCards("h", function (card) { + if (!get.tag(card, "damage")) return false; + if (player.hasValueTarget(card, null, true) > 0) { + if (player.canUse(card, target, null, true)) { + var eff = get.effect(target, card, player, player); + if (eff > 0) eff1 += eff; } - if(player.canUse(card,target0,null,true)){ - var eff=get.effect(target0,card,player,player); - if(eff>0) eff2+=eff; + if (player.canUse(card, target0, null, true)) { + var eff = get.effect(target0, card, player, player); + if (eff > 0) eff2 += eff; } } }); - return eff1>eff2; + return eff1 > eff2; }, - prompt2:function(event,player){ - var target=lib.skill.taomie1.logTarget(event,player); - var str='令'+get.translation(target)+'获得“讨灭”标记'; - if(game.hasPlayer(function(current){ - return current.hasMark('taomie'); - })) str+=',并移去场上已有的“讨灭”标记'; + prompt2: function (event, player) { + var target = lib.skill.taomie1.logTarget(event, player); + var str = "令" + get.translation(target) + "获得“讨灭”标记"; + if ( + game.hasPlayer(function (current) { + return current.hasMark("taomie"); + }) + ) + str += ",并移去场上已有的“讨灭”标记"; return str; }, - content:function(){ - game.countPlayer(function(current){ - var num=current.countMark('taomie'); - if(num) current.removeMark('taomie'); + content: function () { + game.countPlayer(function (current) { + var num = current.countMark("taomie"); + if (num) current.removeMark("taomie"); }); - lib.skill.taomie1.logTarget(trigger,player).addMark('taomie',1); + lib.skill.taomie1.logTarget(trigger, player).addMark("taomie", 1); }, }, - taomie2:{audio:true}, - taomie3:{audio:true}, - taomie4:{ - trigger:{ - global:['damageAfter','damageCancelled','damageZero'], - player:'dieBegin', + taomie2: { audio: true }, + taomie3: { audio: true }, + taomie4: { + trigger: { + global: ["damageAfter", "damageCancelled", "damageZero"], + player: "dieBegin", }, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return player.hasMark('taomie')&&(event.name=='die'||event.taomie_player==player); + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.hasMark("taomie") && (event.name == "die" || event.taomie_player == player); }, - content:function(){ - player.removeMark('taomie',player.countMark('taomie')); - player.removeSkill('taomie2'); + content: function () { + player.removeMark("taomie", player.countMark("taomie")); + player.removeSkill("taomie2"); }, }, //铁骑飞 - liyong:{ - audio:'retishen', - trigger:{player:'shaMiss'}, - forced:true, - filter:function(event,player){ + liyong: { + audio: "retishen", + trigger: { player: "shaMiss" }, + forced: true, + filter: function (event, player) { return player.isPhaseUsing(); }, - content:function(){ - trigger.getParent().liyong=true; - player.addTempSkill('liyong2','phaseUseEnd'); + content: function () { + trigger.getParent().liyong = true; + player.addTempSkill("liyong2", "phaseUseEnd"); }, }, - liyong2:{ - audio:'retishen', - mark:true, - intro:{ - content:'铁骑!强命!加伤!然后掉血嘞…', + liyong2: { + audio: "retishen", + mark: true, + intro: { + content: "铁骑!强命!加伤!然后掉血嘞…", }, - trigger:{player:'useCardToPlayered'}, - forced:true, - filter:function(event,player){ - if(!event.card||event.card.name!='sha') return false; - var evt=event.getParent(); - if(evt.liyong) return false; - var history=player.getHistory('useCard',function(evt){ - return evt.card.name=='sha'; + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + if (!event.card || event.card.name != "sha") return false; + var evt = event.getParent(); + if (evt.liyong) return false; + var history = player.getHistory("useCard", function (evt) { + return evt.card.name == "sha"; }); - var evt2=history[history.indexOf(evt)-1]; - return evt2&&evt2.liyong; + var evt2 = history[history.indexOf(evt) - 1]; + return evt2 && evt2.liyong; }, - logTarget:'target', - content:function(){ - var target=trigger.target; - target.addTempSkill('fengyin'); + logTarget: "target", + content: function () { + var target = trigger.target; + target.addTempSkill("fengyin"); trigger.directHit.add(target); - var id=target.playerid; - var map=trigger.customArgs; - if(!map[id]) map[id]={}; - if(!map[id].extraDamage) map[id].extraDamage=0; + var id = target.playerid; + var map = trigger.customArgs; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; map[id].extraDamage++; - trigger.getParent().liyong2=true; + trigger.getParent().liyong2 = true; }, - group:['liyong3','liyong4'], + group: ["liyong3", "liyong4"], }, - liyong3:{ - trigger:{source:'damageSource'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&& - event.player.isIn()&&event.getParent(2).liyong2==true; + liyong3: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.player.isIn() && + event.getParent(2).liyong2 == true + ); }, - content:function(){ + content: function () { player.loseHp(); }, }, - liyong4:{ - trigger:{player:'useCardAfter'}, - forced:true, - silent:true, - filter:function(evt,player){ - if(!evt.card||evt.card.name!='sha') return false; - if(evt.liyong) return false; - var history=player.getHistory('useCard',function(evt){ - return evt.card.name=='sha'; + liyong4: { + trigger: { player: "useCardAfter" }, + forced: true, + silent: true, + filter: function (evt, player) { + if (!evt.card || evt.card.name != "sha") return false; + if (evt.liyong) return false; + var history = player.getHistory("useCard", function (evt) { + return evt.card.name == "sha"; }); - var evt2=history[history.indexOf(evt)-1]; - return evt2&&evt2.liyong; + var evt2 = history[history.indexOf(evt) - 1]; + return evt2 && evt2.liyong; }, - content:function(){ - player.removeSkill('liyong2'); + content: function () { + player.removeSkill("liyong2"); }, }, //韩遂 - xinniluan:{ - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&event.player.isIn()&&event.player.getHistory('useCard',function(evt){ - if(evt.targets&&evt.targets.length){ - var targets=evt.targets.slice(0); - while(targets.includes(event.player)) targets.remove(event.player); - return targets.length>0; - } - return false; - }).length>0&&(_status.connectMode||player.hasSha()); + xinniluan: { + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.isIn() && + event.player.getHistory("useCard", function (evt) { + if (evt.targets && evt.targets.length) { + var targets = evt.targets.slice(0); + while (targets.includes(event.player)) targets.remove(event.player); + return targets.length > 0; + } + return false; + }).length > 0 && + (_status.connectMode || player.hasSha()) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToUse({ - logSkill:'xinniluan', - preTarget:trigger.player, - prompt:'是否发动【逆乱】,对'+get.translation(trigger.player)+'使用一张【杀】?', - filterCard:function(card,player){ - return get.name(card)=='sha'&&lib.filter.filterCard.apply(this,arguments); + logSkill: "xinniluan", + preTarget: trigger.player, + prompt: "是否发动【逆乱】,对" + get.translation(trigger.player) + "使用一张【杀】?", + filterCard: function (card, player) { + return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); }, - filterTarget:function(card,player,target){ - return target==_status.event.preTarget&&lib.filter.targetEnabled.apply(this,arguments); + filterTarget: function (card, player, target) { + return ( + target == _status.event.preTarget && + lib.filter.targetEnabled.apply(this, arguments) + ); }, - addCount:false, + addCount: false, }); - 'step 1' - if(result.bool&&player.getHistory('sourceDamage',function(evt){ - return evt.getParent(4)==event; - }).length&&trigger.player.countDiscardableCards(player,'he')>0) player.discardPlayerCard(trigger.player,true,'he').boolline=true; + ("step 1"); + if ( + result.bool && + player.getHistory("sourceDamage", function (evt) { + return evt.getParent(4) == event; + }).length && + trigger.player.countDiscardableCards(player, "he") > 0 + ) + player.discardPlayerCard(trigger.player, true, "he").boolline = true; }, }, - xiaoxi_hansui:{ - audio:2, - enable:['chooseToRespond','chooseToUse'], - filterCard:function(card,player){ - return get.color(card)=='black'; + xiaoxi_hansui: { + audio: 2, + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card, player) { + return get.color(card) == "black"; }, - position:'hse', - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - if(!player.countCards('hse',{color:'black'})) return false; + position: "hse", + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (!player.countCards("hse", { color: "black" })) return false; }, - prompt:'将一张黑色牌当杀使用或打出', - check:function(card){return 4.5-get.value(card)}, - ai:{ - skillTagFilter:function(player){ - if(!player.countCards('hes',{color:'black'})) return false; + prompt: "将一张黑色牌当杀使用或打出", + check: function (card) { + return 4.5 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("hes", { color: "black" })) return false; }, - respondSha:true, - } + respondSha: true, + }, }, //胡车儿 - daoji:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',function(card){ - return get.type(card)!='basic'; - })&&game.hasPlayer(function(target){ - return target!=player&&target.countCards('e')>0; - }); + daoji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) && + game.hasPlayer(function (target) { + return target != player && target.countCards("e") > 0; + }) + ); }, - filterCard:function(card){ - return get.type(card)!='basic'; + filterCard: function (card) { + return get.type(card) != "basic"; }, - position:'he', - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('e')>0; + position: "he", + filterTarget: function (card, player, target) { + return target != player && target.countCards("e") > 0; }, - check:function(card){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)<0&&get.damageEffect(current,player,player)>0&¤t.getEquip(1); - })) return 8-get.value(card); - return 5-get.value(card) + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) < 0 && + get.damageEffect(current, player, player) > 0 && + current.getEquip(1) + ); + }) + ) + return 8 - get.value(card); + return 5 - get.value(card); }, - content:function(){ - 'step 0' - player.gainPlayerCard(target,'e',true).set('ai',function(button){ - var card=button.link; - var player=_status.event.player; - if(get.subtype(card)=='equip1'&&get.damageEffect(_status.event.target,player,player)>0) return 6+get.value(card); + content: function () { + "step 0"; + player.gainPlayerCard(target, "e", true).set("ai", function (button) { + var card = button.link; + var player = _status.event.player; + if ( + get.subtype(card) == "equip1" && + get.damageEffect(_status.event.target, player, player) > 0 + ) + return 6 + get.value(card); return get.value(card); }); - 'step 1' - if(!result||!result.bool||!result.cards||!result.cards.length){ + ("step 1"); + if (!result || !result.bool || !result.cards || !result.cards.length) { event.finish(); return; } - var card=result.cards[0]; - event.card=card; - if(player.getCards('h').includes(card)&&get.type(card)=='equip') player.chooseUseTarget(card,true).nopopup=true; - 'step 2' - if(get.subtype(card,false)=='equip1') target.damage(); + var card = result.cards[0]; + event.card = card; + if (player.getCards("h").includes(card) && get.type(card) == "equip") + player.chooseUseTarget(card, true).nopopup = true; + ("step 2"); + if (get.subtype(card, false) == "equip1") target.damage(); }, - ai:{ - order:6, - result:{ - target:function(player,current){ - if(get.damageEffect(current,player,player)>0&¤t.getEquip(1)) return -1.5; + ai: { + order: 6, + result: { + target: function (player, current) { + if (get.damageEffect(current, player, player) > 0 && current.getEquip(1)) + return -1.5; return -1; }, }, @@ -10560,213 +12966,243 @@ game.import('character', function () { }, //司马师夫妇 //垃圾 - baiyi:{ - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - selectTarget:2, - limited:true, - skillAnimation:false, + baiyi: { + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + selectTarget: 2, + limited: true, + skillAnimation: false, //animationColor:'thunder', - filter:function(event,player){ - return player.isDamaged()&&game.players.length>2; + filter: function (event, player) { + return player.isDamaged() && game.players.length > 2; }, - multitarget:true, - multiline:true, - changeSeat:true, - contentBefore:function(){ - player.$fullscreenpop('败移','thunder'); + multitarget: true, + multiline: true, + changeSeat: true, + contentBefore: function () { + player.$fullscreenpop("败移", "thunder"); }, - content:function(){ - player.awakenSkill('baiyi'); - game.broadcastAll(function(target1,target2){ - game.swapSeat(target1,target2); - },targets[0],targets[1]) + content: function () { + player.awakenSkill("baiyi"); + game.broadcastAll( + function (target1, target2) { + game.swapSeat(target1, target2); + }, + targets[0], + targets[1] + ); }, - ai:{ - order:function(){ - return get.order({name:'tao'})+1; + ai: { + order: function () { + return get.order({ name: "tao" }) + 1; }, - result:{ - target:function(player,target){ - if(player.hasUnknown()&&target!=player.next&&target!=player.previous) return 0; - var distance=Math.pow(get.distance(player,target,'absolute'),2); - if(!ui.selected.targets.length) return distance; - var distance2=Math.pow(get.distance(player,ui.selected.targets[0],'absolute'),2); - return Math.min(0,distance-distance2); - } + result: { + target: function (player, target) { + if (player.hasUnknown() && target != player.next && target != player.previous) + return 0; + var distance = Math.pow(get.distance(player, target, "absolute"), 2); + if (!ui.selected.targets.length) return distance; + var distance2 = Math.pow( + get.distance(player, ui.selected.targets[0], "absolute"), + 2 + ); + return Math.min(0, distance - distance2); + }, }, }, }, - jinglve:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(player.hasSkill('jinglve2')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; + jinglve: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.hasSkill("jinglve2")) return false; + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; }); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - if(!player.storage.jinglve4) player.storage.jinglve4=[]; + content: function () { + "step 0"; + if (!player.storage.jinglve4) player.storage.jinglve4 = []; player.storage.jinglve4.add(target); - player.chooseButton(['选择一张牌作为「死士」',target.getCards('h')],true).set('ai',function(button){ - var target=_status.event.getParent().target; - var card=button.link; - var val=target.getUseValue(card); - if(val>0) return val; - return get.value(card); - }); - 'step 1' - if(result.bool){ - player.storage.jinglve2=target; - player.storage.jinglve3=result.links[0]; - player.addSkill('jinglve2'); + player + .chooseButton(["选择一张牌作为「死士」", target.getCards("h")], true) + .set("ai", function (button) { + var target = _status.event.getParent().target; + var card = button.link; + var val = target.getUseValue(card); + if (val > 0) return val; + return get.value(card); + }); + ("step 1"); + if (result.bool) { + player.storage.jinglve2 = target; + player.storage.jinglve3 = result.links[0]; + player.addSkill("jinglve2"); } }, - ai:{ - order:12, - result:{ - target:-1, + ai: { + order: 12, + result: { + target: -1, }, }, }, - jinglve2:{ - mark:true, - intro:{ - name:'死士', - mark:function(dialog,content,player){ - dialog.addText('记录目标'); + jinglve2: { + mark: true, + intro: { + name: "死士", + mark: function (dialog, content, player) { + dialog.addText("记录目标"); dialog.add([content]); - if(player==game.me||player.isUnderControl()){ - dialog.addText('死士牌'); + if (player == game.me || player.isUnderControl()) { + dialog.addText("死士牌"); dialog.add([player.storage.jinglve3]); } }, }, - onremove:function(player){ + onremove: function (player) { delete player.storage.jinglve2; delete player.storage.jinglve3; }, - trigger:{global:['dieEnd','loseEnd','gainEnd']}, - silent:true, - lastDo:true, - charlotte:true, - filter:function(event,player){ - if(event.name!='gain'&&event.player!=player.storage.jinglve2) return false; - return event.name=='die'||(event.cards.includes(player.storage.jinglve3)&&(event.name=='gain'||event.position!=ui.ordering&&event.position!=ui.discardPile)); + trigger: { global: ["dieEnd", "loseEnd", "gainEnd"] }, + silent: true, + lastDo: true, + charlotte: true, + filter: function (event, player) { + if (event.name != "gain" && event.player != player.storage.jinglve2) return false; + return ( + event.name == "die" || + (event.cards.includes(player.storage.jinglve3) && + (event.name == "gain" || + (event.position != ui.ordering && event.position != ui.discardPile))) + ); }, - content:function(){ - player.removeSkill('jinglve2'); + content: function () { + player.removeSkill("jinglve2"); }, - group:'jinglve3', + group: "jinglve3", }, - jinglve3:{ - audio:'jinglve', - trigger:{global:['loseAfter','useCard','phaseAfter','cardsDiscardAfter','loseAsyncAfter']}, - filter:function(event,player){ - if(event.player&&event.player!=player.storage.jinglve2) return false; - var card=player.storage.jinglve3; - if(event.name=='phase') return event.player.getCards('hej').includes(card); - if(event.name=='useCard') return event.cards.includes(card); - return (get.position(card,true)=='d'&&event.getd().includes(card)); + jinglve3: { + audio: "jinglve", + trigger: { + global: ["loseAfter", "useCard", "phaseAfter", "cardsDiscardAfter", "loseAsyncAfter"], }, - forced:true, - charlotte:true, - logTarget:'player', - content:function(){ - if(trigger.name=='useCard'){ - trigger.all_excluded=true; - trigger.targets.length=0; + filter: function (event, player) { + if (event.player && event.player != player.storage.jinglve2) return false; + var card = player.storage.jinglve3; + if (event.name == "phase") return event.player.getCards("hej").includes(card); + if (event.name == "useCard") return event.cards.includes(card); + return get.position(card, true) == "d" && event.getd().includes(card); + }, + forced: true, + charlotte: true, + logTarget: "player", + content: function () { + if (trigger.name == "useCard") { + trigger.all_excluded = true; + trigger.targets.length = 0; + } else { + if (trigger.name == "phase") { + player.gain(player.storage.jinglve3, trigger.player, "giveAuto", "bySelf"); + } else if (get.position(player.storage.jinglve3, true) == "d") + player.gain(player.storage.jinglve3, "gain2"); } - else{ - if(trigger.name=='phase'){ - player.gain(player.storage.jinglve3,trigger.player,'giveAuto','bySelf'); - } - else if(get.position(player.storage.jinglve3,true)=='d') player.gain(player.storage.jinglve3,'gain2'); - } - player.removeSkill('jinglve2'); + player.removeSkill("jinglve2"); }, }, - shanli:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.storage.baiyi&&player.getStorage('jinglve4').length>1; + shanli: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.storage.baiyi && player.getStorage("jinglve4").length > 1; }, - content:function(){ - 'step 0' - player.awakenSkill('shanli'); + content: function () { + "step 0"; + player.awakenSkill("shanli"); player.loseMaxHp(); - player.chooseTarget(true,'选择【擅立】的目标').set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(target==game.me||target.isUnderControl()&&target.isOnline()) return 2*att; + player.chooseTarget(true, "选择【擅立】的目标").set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target == game.me || (target.isUnderControl() && target.isOnline())) + return 2 * att; return att; }); - 'step 1' - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - game.log(player,'拥立',target); - var list=[]; - if(!_status.characterlist){ - if(_status.connectMode) var list=get.charactersOL(); - else{ - var list=[]; - for(var i in lib.character){ - if(lib.filter.characterDisabled2(i)||lib.filter.characterDisabled(i)) continue; + ("step 1"); + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + game.log(player, "拥立", target); + var list = []; + if (!_status.characterlist) { + if (_status.connectMode) var list = get.charactersOL(); + else { + var list = []; + for (var i in lib.character) { + if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) + continue; list.push(i); } } - game.countPlayer2(function(current){ + game.countPlayer2(function (current) { list.remove(current.name); list.remove(current.name1); list.remove(current.name2); - if(current.storage.rehuashen&¤t.storage.rehuashen.character) list.removeArray(current.storage.rehuashen.character) + if (current.storage.rehuashen && current.storage.rehuashen.character) + list.removeArray(current.storage.rehuashen.character); }); - _status.characterlist=list; + _status.characterlist = list; } _status.characterlist.randomSort(); - var chara=[]; - var skills=[]; - for(var i of _status.characterlist){ - if(i=='key_yuri') continue; - var character=lib.character[i]; - if(character&&character[3]){ - for(var j of character[3]){ - if(skills.includes(j)||j=='yuri_wangxi'||target.hasSkill('j')) continue; - var info=get.info(j); - if(info&&info.zhuSkill){ + var chara = []; + var skills = []; + for (var i of _status.characterlist) { + if (i == "key_yuri") continue; + var character = lib.character[i]; + if (character && character[3]) { + for (var j of character[3]) { + if (skills.includes(j) || j == "yuri_wangxi" || target.hasSkill("j")) + continue; + var info = get.info(j); + if (info && info.zhuSkill) { skills.add(j); chara.add(i); continue; } } } - if(skills.length>=3) break; + if (skills.length >= 3) break; } - if(!skills.length){event.finish();return} - event.chara=chara; - event.skills=skills; - player.chooseControl(skills).set('dialog',['选择令'+get.translation(target)+'获得一个技能',[chara,'character']]); - 'step 2' + if (!skills.length) { + event.finish(); + return; + } + event.chara = chara; + event.skills = skills; + player + .chooseControl(skills) + .set("dialog", [ + "选择令" + get.translation(target) + "获得一个技能", + [chara, "character"], + ]); + ("step 2"); target.addSkills(result.control); - target.setAvatarQueue(target.name1||target.name,[event.chara[event.skills.indexOf(result.control)]]); + target.setAvatarQueue(target.name1 || target.name, [ + event.chara[event.skills.indexOf(result.control)], + ]); }, }, - hongyi:{ - audio:2, - enable:'phaseUse', - usable:1, + hongyi: { + audio: 2, + enable: "phaseUse", + usable: 1, //filter:function(event,player){ // return player.countCards('he')>=Math.min(2,game.dead.length); //}, @@ -10774,205 +13210,252 @@ game.import('character', function () { // return Math.min(2,game.dead.length); //}, //filterCard:true, - filterTarget:lib.filter.notMe, - check:function(card){ - var num=Math.min(2,game.dead.length); - if(!num) return 1; - if(num==1) return 7-get.value(card); - return 5-get.value(card); + filterTarget: lib.filter.notMe, + check: function (card) { + var num = Math.min(2, game.dead.length); + if (!num) return 1; + if (num == 1) return 7 - get.value(card); + return 5 - get.value(card); }, - position:'he', - content:function(){ - player.addTempSkill('hongyi2',{player:'phaseBeginStart'}); + position: "he", + content: function () { + player.addTempSkill("hongyi2", { player: "phaseBeginStart" }); player.storage.hongyi2.add(target); - player.markSkill('hongyi2'); + player.markSkill("hongyi2"); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(target.hasJudge('lebu')) return -0.5; - return -1-target.countCards('h'); + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.hasJudge("lebu")) return -0.5; + return -1 - target.countCards("h"); }, }, }, }, - hongyi2:{ - audio:'hongyi', - trigger:{global:'damageBegin1'}, - charlotte:true, - forced:true, - logTarget:'source', - filter:function(event,player){ + hongyi2: { + audio: "hongyi", + trigger: { global: "damageBegin1" }, + charlotte: true, + forced: true, + logTarget: "source", + filter: function (event, player) { return player.storage.hongyi2.includes(event.source); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.source.judge(); - 'step 1' - if(result.color=='black') trigger.num--; + ("step 1"); + if (result.color == "black") trigger.num--; else trigger.player.draw(); }, - onremove:true, - intro:{ - content:'已选中$为技能目标', + onremove: true, + intro: { + content: "已选中$为技能目标", }, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, }, - requanfeng:{ - audio:'quanfeng', - enable:'chooseToUse', - limited:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return event.type=='dying'&&player==event.dying; + requanfeng: { + audio: "quanfeng", + enable: "chooseToUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return event.type == "dying" && player == event.dying; }, - content:function(){ - player.awakenSkill('requanfeng'); + content: function () { + player.awakenSkill("requanfeng"); player.gainMaxHp(2); player.recover(4); }, - ai:{ - save:true, - skillTagFilter:function(player,tag,arg){ - return player==arg; + ai: { + save: true, + skillTagFilter: function (player, tag, arg) { + return player == arg; }, - order:10, - result:{ - player:1, + order: 10, + result: { + player: 1, }, }, - group:'requanfeng_gain', + group: "requanfeng_gain", }, - requanfeng_gain:{ - audio:'quanfeng', - trigger:{global:'die'}, - filter:function(event,player){ - return player.hasSkill('hongyi')&&event.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte; - }).length>0; + requanfeng_gain: { + audio: "quanfeng", + trigger: { global: "die" }, + filter: function (event, player) { + return ( + player.hasSkill("hongyi") && + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }).length > 0 + ); }, - logTarget:'player', - skillAnimation:true, - animationColor:'thunder', - prompt2:'(限定技)失去技能【劝封】,并获得该角色武将牌上的所有技能,然后加1点体力上限并回复1点体力', - check:(event,player)=>{ - if(event.player.getStockSkills('仲村由理','天下第一').filter(skill=>{ - let info=get.info(skill); - return info&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte; - }).some(i=>{ - let info=get.info(i); - if(info&&info.ai) return info.ai.neg||info.ai.halfneg; - })) return false; + logTarget: "player", + skillAnimation: true, + animationColor: "thunder", + prompt2: + "(限定技)失去技能【劝封】,并获得该角色武将牌上的所有技能,然后加1点体力上限并回复1点体力", + check: (event, player) => { + if ( + event.player + .getStockSkills("仲村由理", "天下第一") + .filter((skill) => { + let info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }) + .some((i) => { + let info = get.info(i); + if (info && info.ai) return info.ai.neg || info.ai.halfneg; + }) + ) + return false; return true; }, - content:function(){ - player.awakenSkill('requanfeng'); - player.removeSkills('hongyi'); - var skills=trigger.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte; - }); - if(skills.length){ + content: function () { + player.awakenSkill("requanfeng"); + player.removeSkills("hongyi"); + var skills = trigger.player + .getStockSkills("仲村由理", "天下第一") + .filter(function (skill) { + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }); + if (skills.length) { player.addSkills(skills); - game.broadcastAll(function(list){ + game.broadcastAll(function (list) { game.expandSkills(list); - for(var i of list){ - var info=lib.skill[i]; - if(!info) continue; - if(!info.audioname2) info.audioname2={}; - info.audioname2.yanghuiyu='quanfeng'; + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.yanghuiyu = "quanfeng"; } - },skills); + }, skills); } player.gainMaxHp(); player.recover(); - } - }, - quanfeng:{ - audio:2, - trigger:{global:'die'}, - filter:function(event,player){ - return event.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; - }).length>0; }, - logTarget:'player', - skillAnimation:true, - limited:true, - forced:true, - animationColor:'thunder', - content:function(){ - 'step 0' - player.awakenSkill('quanfeng'); - var list=trigger.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; + }, + quanfeng: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return ( + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return ( + info && + !info.juexingji && + !info.hiddenSkill && + !info.zhuSkill && + !info.charlotte && + !info.limited && + !info.dutySkill + ); + }).length > 0 + ); + }, + logTarget: "player", + skillAnimation: true, + limited: true, + forced: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("quanfeng"); + var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return ( + info && + !info.juexingji && + !info.hiddenSkill && + !info.zhuSkill && + !info.charlotte && + !info.limited && + !info.dutySkill + ); }); - if(list.length==1) event._result={control:list[0]}; - else player.chooseControl(list).set('prompt','选择获得'+get.translation(trigger.player)+'的一个技能').set('forceDie',true).set('ai',function(){ - return list.randomGet(); - }); - 'step 1' + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set("prompt", "选择获得" + get.translation(trigger.player) + "的一个技能") + .set("forceDie", true) + .set("ai", function () { + return list.randomGet(); + }); + ("step 1"); player.addSkills(result.control); - game.broadcastAll(function(skill){ - var list=[skill];game.expandSkills(list); - for(var i of list){ - var info=lib.skill[i]; - if(!info) continue; - if(!info.audioname2) info.audioname2={}; - info.audioname2.yanghuiyu='quanfeng'; + game.broadcastAll(function (skill) { + var list = [skill]; + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.yanghuiyu = "quanfeng"; } - },result.control); + }, result.control); player.gainMaxHp(); player.recover(); }, }, //手杀界朱然 //设计师你改技能有瘾🐴 - mobiledanshou:{ - trigger:{global:'phaseJieshuBegin'}, - audio:2, - direct:true, - filter:function(event,player){ - if(player==event.player) return false; - var num=event.player.getHistory('useCard',function(evt){ + mobiledanshou: { + trigger: { global: "phaseJieshuBegin" }, + audio: 2, + direct: true, + filter: function (event, player) { + if (player == event.player) return false; + var num = event.player.getHistory("useCard", function (evt) { return evt.targets.includes(player); }).length; - return num==0||event.player.isIn()&&num<=player.countCards('he'); + return num == 0 || (event.player.isIn() && num <= player.countCards("he")); }, - content:function(){ - 'step 0' - var num=trigger.player.getHistory('useCard',function(evt){ + content: function () { + "step 0"; + var num = trigger.player.getHistory("useCard", function (evt) { return evt.targets.includes(player); }).length; - event.num=num; - if(num==0){ - if(player.hasSkill('mobiledanshou')) event._result={bool:true}; - else player.chooseBool('是否发动【胆守】摸一张牌?',lib.translate.mobiledanshou_info); - } - else event.goto(2); - 'step 1' - if(result.bool){ - player.logSkill('mobiledanshou'); + event.num = num; + if (num == 0) { + if (player.hasSkill("mobiledanshou")) event._result = { bool: true }; + else + player.chooseBool("是否发动【胆守】摸一张牌?", lib.translate.mobiledanshou_info); + } else event.goto(2); + ("step 1"); + if (result.bool) { + player.logSkill("mobiledanshou"); player.draw(); } event.finish(); - 'step 2' - player.chooseToDiscard(num,get.prompt('mobiledanshou',trigger.player),'弃置'+get.translation(num)+'张牌并对其造成1点伤害','he').set('ai',function(card){ - if(!_status.event.goon) return 0; - var num=_status.event.getParent().num; - if(num==1) return 8-get.value(card); - if(num==2) return 6.5-get.value(card); - return 5-get.value(card); - }).set('goon',get.damageEffect(trigger.player,player,player)>0).logSkill=['mobiledanshou',trigger.player]; - 'step 3' - if(result.bool){ + ("step 2"); + player + .chooseToDiscard( + num, + get.prompt("mobiledanshou", trigger.player), + "弃置" + get.translation(num) + "张牌并对其造成1点伤害", + "he" + ) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + var num = _status.event.getParent().num; + if (num == 1) return 8 - get.value(card); + if (num == 2) return 6.5 - get.value(card); + return 5 - get.value(card); + }) + .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = [ + "mobiledanshou", + trigger.player, + ]; + ("step 3"); + if (result.bool) { player.addExpose(0.2); trigger.player.damage(); } @@ -10980,128 +13463,144 @@ game.import('character', function () { }, //丁原 //程序员和设计师至少有一个脑子有坑 - beizhu:{ - audio:3, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(target){ - return lib.skill.beizhu.filterTarget(null,player,target); + beizhu: { + audio: 3, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return lib.skill.beizhu.filterTarget(null, player, target); }); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - player.addTempSkill('beizhu_draw'); + content: function () { + "step 0"; + player.addTempSkill("beizhu_draw"); player.viewHandcards(target); - 'step 1' - var cards=target.getCards('h','sha'); - if(cards.length){ - event.cards=cards; + ("step 1"); + var cards = target.getCards("h", "sha"); + if (cards.length) { + event.cards = cards; event.goto(5); - } - else player.discardPlayerCard('he',target,'visible',true); - 'step 2' - player.chooseBool('是否令'+get.translation(target)+'获得一张【杀】?').set('choice',get.attitude(player,target)>0); - 'step 3' - if(result.bool){ - var card=get.cardPile2(function(card){ - return card.name=='sha'; + } else player.discardPlayerCard("he", target, "visible", true); + ("step 2"); + player + .chooseBool("是否令" + get.translation(target) + "获得一张【杀】?") + .set("choice", get.attitude(player, target) > 0); + ("step 3"); + if (result.bool) { + var card = get.cardPile2(function (card) { + return card.name == "sha"; }); - if(card) target.gain(card,'gain2'); - } - else event.finish(); - 'step 4' + if (card) target.gain(card, "gain2"); + } else event.finish(); + ("step 4"); game.updateRoundNumber(); event.finish(); - 'step 5' - var hs=target.getCards('h'); - cards=cards.filter(function(card){ - return hs.includes(card)&&get.name(card,target)=='sha'&&target.canUse({ - name:'sha', - isCard:true, - cards:[card], - },player,false); + ("step 5"); + var hs = target.getCards("h"); + cards = cards.filter(function (card) { + return ( + hs.includes(card) && + get.name(card, target) == "sha" && + target.canUse( + { + name: "sha", + isCard: true, + cards: [card], + }, + player, + false + ) + ); }); - if(cards.length){ - var card=cards.randomRemove(1)[0]; - target.useCard(player,false,card).card.beizhu=true; + if (cards.length) { + var card = cards.randomRemove(1)[0]; + target.useCard(player, false, card).card.beizhu = true; event.redo(); } }, - ai:{ - order:7, - threaten:1.14+5.14, - result:{ - player:function(player,target){ - var eff=get.effect(target,{name:'guohe_copy2'},player,player); - var cards=target.getCards('h',{name:'sha'}); - if(!cards.length) return eff; - return eff/(cards.length+3); + ai: { + order: 7, + threaten: 1.14 + 5.14, + result: { + player: function (player, target) { + var eff = get.effect(target, { name: "guohe_copy2" }, player, player); + var cards = target.getCards("h", { name: "sha" }); + if (!cards.length) return eff; + return eff / (cards.length + 3); }, }, }, }, - beizhu_draw:{ - trigger:{player:'damageEnd'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return event.card&&event.card.beizhu; + beizhu_draw: { + trigger: { player: "damageEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.card && event.card.beizhu; }, - content:function(){ + content: function () { player.draw(trigger.num); }, }, //新简雍 - xinqiaoshui:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + xinqiaoshui: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool) player.addTempSkill('qiaoshui3','phaseUseEnd'); - else{ - player.addTempSkill('qiaoshui2','phaseUseEnd'); + ("step 1"); + if (result.bool) player.addTempSkill("qiaoshui3", "phaseUseEnd"); + else { + player.addTempSkill("qiaoshui2", "phaseUseEnd"); } }, - ai:{ - order:function(item,player){ - if(player.countCards('h',function(card){ - return player.hasValueTarget(card); - })) return 10; + ai: { + order: function (item, player) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) + return 10; return 1; }, - result:{ - target:function(player,target){ - if(player.countCards('h',function(card){ - return player.hasValueTarget(card); - })){ - if(player.hasSkill('qiaoshui3')) return 0; - var nd=!player.needsToDiscard(); - if(player.hasCard(function(card){ - if(get.position(card)!="h") return false; - var val=get.value(card) - if(nd&&val<0) return true; - if(val<=5){ - return card.number>=12; - } - if(val<=6){ - return card.number>=13; - } - return false; - })) return -1; + result: { + target: function (player, target) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) { + if (player.hasSkill("qiaoshui3")) return 0; + var nd = !player.needsToDiscard(); + if ( + player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (nd && val < 0) return true; + if (val <= 5) { + return card.number >= 12; + } + if (val <= 6) { + return card.number >= 13; + } + return false; + }) + ) + return -1; return 0; } return -1; @@ -11109,545 +13608,603 @@ game.import('character', function () { }, }, }, - xinjyzongshi:{ - audio:2, - trigger:{ - player:['chooseToCompareAfter','compareMultipleAfter'], - target:['chooseToCompareAfter','compareMultipleAfter'] + xinjyzongshi: { + audio: 2, + trigger: { + player: ["chooseToCompareAfter", "compareMultipleAfter"], + target: ["chooseToCompareAfter", "compareMultipleAfter"], }, - filter:function(event,player){ - if(event.preserve) return false; - if(event.name=='compareMultiple') return true; + filter: function (event, player) { + if (event.preserve) return false; + if (event.name == "compareMultiple") return true; return !event.compareMultiple; }, - frequent:true, - content:function(){ - 'step 0' - var str='
    牌堆顶'; - var cards=get.cards(); - if(trigger.name=='chooseToCompare'&&trigger.compareMeanwhile){ - var result=trigger.result; - var list=[[result.num1[0],result.player]]; - list.addArray(result.num2.map(function(card,i){ - return [card,result.targets[i]]; - })); - list.sort(function(a,b){ - return a[0]-b[0]; + frequent: true, + content: function () { + "step 0"; + var str = '
    牌堆顶'; + var cards = get.cards(); + if (trigger.name == "chooseToCompare" && trigger.compareMeanwhile) { + var result = trigger.result; + var list = [[result.num1[0], result.player]]; + list.addArray( + result.num2.map(function (card, i) { + return [card, result.targets[i]]; + }) + ); + list.sort(function (a, b) { + return a[0] - b[0]; }); - if(list[0][0]trigger.num2&&get.position(trigger.card2,true)=='o'){ - str+='/拼点牌'; - cards.push(trigger.card2) - } - else if(trigger.num1 trigger.num2 && get.position(trigger.card2, true) == "o") { + str += "/拼点牌"; + cards.push(trigger.card2); + } else if ( + trigger.num1 < trigger.num2 && + get.position(trigger.card1, true) == "o" + ) { + str += "/拼点牌"; cards.push(trigger.card1); } - } - else{ - if(trigger.num1trigger.num2&&get.position(trigger.card2,true)=='o'){ - str+='/拼点牌'; + } else if ( + trigger.num1 > trigger.num2 && + get.position(trigger.card2, true) == "o" + ) { + str += "/拼点牌"; cards.push(trigger.card2); } } } - str+='
    '; - event.cards=cards; - player.chooseButton(['纵适:选择要获得的牌',str,cards],true).set('ai',get.buttonValue); - 'step 1' - if(result.bool){ - var draw=result.links[0]==cards[0]; - player.gain(result.links,draw?'draw':'gain2').log=false; - game.log(player,'获得了',draw?'牌堆顶的一张牌':result.links); - if(!draw){ + str += "
    "; + event.cards = cards; + player + .chooseButton(["纵适:选择要获得的牌", str, cards], true) + .set("ai", get.buttonValue); + ("step 1"); + if (result.bool) { + var draw = result.links[0] == cards[0]; + player.gain(result.links, draw ? "draw" : "gain2").log = false; + game.log(player, "获得了", draw ? "牌堆顶的一张牌" : result.links); + if (!draw) { cards[0].fix(); - ui.cardPile.insertBefore(cards[0],ui.cardPile.firstChild); + ui.cardPile.insertBefore(cards[0], ui.cardPile.firstChild); game.updateRoundNumber(); } } - } + }, }, //通渠张恭 - rezhenxing:{ - audio:'xinfu_zhenxing', - trigger:{ - player:["damageEnd","phaseJieshuBegin"], + rezhenxing: { + audio: "xinfu_zhenxing", + trigger: { + player: ["damageEnd", "phaseJieshuBegin"], }, - frequent:true, - content:function(){ - 'step 0' - event.cards=get.cards(3); - player.chooseButton(['【镇行】:请选择要获得的牌',event.cards]).set('filterButton',function(button){ - var cards=_status.event.cards; - for(var i=0;i=0;i--){ - if(result.bool&&result.links.includes(event.cards[i])){ - player.gain(event.cards[i],'gain2'); - } - else{ + frequent: true, + content: function () { + "step 0"; + event.cards = get.cards(3); + player + .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) + .set("filterButton", function (button) { + var cards = _status.event.cards; + for (var i = 0; i < cards.length; i++) { + if (button.link != cards[i] && get.suit(cards[i]) == get.suit(button.link)) + return false; + } + return true; + }) + .set("ai", function (button) { + return get.value(button.link); + }) + .set("cards", event.cards); + ("step 1"); + for (var i = event.cards.length - 1; i >= 0; i--) { + if (result.bool && result.links.includes(event.cards[i])) { + player.gain(event.cards[i], "gain2"); + } else { event.cards[i].fix(); - ui.cardPile.insertBefore(event.cards[i],ui.cardPile.childNodes[0]); + ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); } } game.updateRoundNumber(); }, }, //芙蓉,手杀界廖化,手杀界曹彰 - rejiangchi:{ - audio:2, - trigger:{ - player:"phaseUseBegin", + rejiangchi: { + audio: 2, + trigger: { + player: "phaseUseBegin", }, - direct:true, - content:function(){ - "step 0" - var list=['弃牌','摸牌','取消']; - if(!player.countCards('he')) list.remove('弃牌'); - player.chooseControl(list,function(){ - var player=_status.event.player; - if(list.includes('弃牌')){ - if(player.countCards('h')>3&&player.countCards('h','sha')>1){ - return '弃牌'; + direct: true, + content: function () { + "step 0"; + var list = ["弃牌", "摸牌", "取消"]; + if (!player.countCards("he")) list.remove("弃牌"); + player + .chooseControl(list, function () { + var player = _status.event.player; + if (list.includes("弃牌")) { + if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { + return "弃牌"; + } + if (player.countCards("h", "sha") > 2) { + return "弃牌"; + } } - if(player.countCards('h','sha')>2){ - return '弃牌'; + if (!player.countCards("h", "sha")) { + return "摸牌"; } - } - if(!player.countCards('h','sha')){ - return '摸牌'; - } - return 'cancel2'; - }).set('prompt',get.prompt2('rejiangchi')); - "step 1" - if(result.control=='弃牌'){ - player.chooseToDiscard(true,'he'); - player.addTempSkill('jiangchi2','phaseUseEnd'); - player.logSkill('rejiangchi'); - } - else if(result.control=='摸牌'){ + return "cancel2"; + }) + .set("prompt", get.prompt2("rejiangchi")); + ("step 1"); + if (result.control == "弃牌") { + player.chooseToDiscard(true, "he"); + player.addTempSkill("jiangchi2", "phaseUseEnd"); + player.logSkill("rejiangchi"); + } else if (result.control == "摸牌") { player.draw(); - player.addTempSkill('rejiangchi3','phaseUseEnd'); - player.logSkill('rejiangchi'); + player.addTempSkill("rejiangchi3", "phaseUseEnd"); + player.logSkill("rejiangchi"); } }, }, - rejiangchi3:{ - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + rejiangchi3: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, }, }, - refuli:{ - skillAnimation:true, - animationColor:'soil', - audio:2, - unique:true, - limited:true, - enable:'chooseToUse', - mark:true, - filter:function(event,player){ - if(event.type!='dying') return false; - if(player!=event.dying) return false; + refuli: { + skillAnimation: true, + animationColor: "soil", + audio: 2, + unique: true, + limited: true, + enable: "chooseToUse", + mark: true, + filter: function (event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; return true; }, - content:function(){ - "step 0" - player.awakenSkill('refuli'); - event.num=game.countGroup(); - if(event.num>player.hp) player.recover(event.num-player.hp); - "step 1" - if(player.isMaxHp(true)) player.turnOver(); + content: function () { + "step 0"; + player.awakenSkill("refuli"); + event.num = game.countGroup(); + if (event.num > player.hp) player.recover(event.num - player.hp); + ("step 1"); + if (player.isMaxHp(true)) player.turnOver(); }, - ai:{ - save:true, - skillTagFilter:function(player,arg,target){ - return player==target; + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + return player == target; }, - result:{ - player:10 + result: { + player: 10, + }, + threaten: function (player, target) { + if (!target.storage.refuli) return 0.9; }, - threaten:function(player,target){ - if(!target.storage.refuli) return 0.9; - } }, }, - redangxian:{ - trigger:{player:'phaseBegin'}, - forced:true, - audio:'dangxian', - audioname:['guansuo','xin_liaohua'], - content:function(){ - 'step 0' - var card=get.discardPile(function(card){ - return card.name=='sha'; + redangxian: { + trigger: { player: "phaseBegin" }, + forced: true, + audio: "dangxian", + audioname: ["guansuo", "xin_liaohua"], + content: function () { + "step 0"; + var card = get.discardPile(function (card) { + return card.name == "sha"; }); - if(card) player.gain(card,'gain2'); - 'step 1' + if (card) player.gain(card, "gain2"); + ("step 1"); game.updateRoundNumber(); - var next=player.phaseUse(); + var next = player.phaseUse(); event.next.remove(next); trigger.next.push(next); }, }, - xuewei:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('xuewei'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(player==get.zhu(player)&&player.hp<=2) return 0; - return get.attitude(player,target)-4; - }).animate=false; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('xuewei'); - player.addTempSkill('xuewei2',{player:'phaseBegin'}); - player.storage.xuewei2=target; + xuewei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("xuewei"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player; + if (player == get.zhu(player) && player.hp <= 2) return 0; + return get.attitude(player, target) - 4; + }).animate = false; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xuewei"); + player.addTempSkill("xuewei2", { player: "phaseBegin" }); + player.storage.xuewei2 = target; } }, - ai:{ - threaten:1.05, + ai: { + threaten: 1.05, }, }, - xuewei2:{ - audio:'xuewei', - forced:true, - onremove:true, - trigger:{global:'damageBegin4'}, - charlotte:true, - filter:function(event,player){ - return event.player==player.storage.xuewei2; + xuewei2: { + audio: "xuewei", + forced: true, + onremove: true, + trigger: { global: "damageBegin4" }, + charlotte: true, + filter: function (event, player) { + return event.player == player.storage.xuewei2; }, - logTarget:'player', - content:function(){ - player.removeSkill('xuewei2'); + logTarget: "player", + content: function () { + player.removeSkill("xuewei2"); trigger.cancel(); - player.damage(trigger.num,trigger.source||'nosource'); - if(trigger.source&&trigger.source.isIn()) trigger.source.damage(trigger.num,trigger.nature,player); + player.damage(trigger.num, trigger.source || "nosource"); + if (trigger.source && trigger.source.isIn()) + trigger.source.damage(trigger.num, trigger.nature, player); }, }, - liechi:{ - trigger:{player:'dying'}, - forced:true, - filter:function(event,player){ - return event.getParent().name=='damage'&&event.source&&event.source.countCards('he'); + liechi: { + trigger: { player: "dying" }, + forced: true, + filter: function (event, player) { + return ( + event.getParent().name == "damage" && event.source && event.source.countCards("he") + ); }, - audio:2, - content:function(){ - trigger.source.chooseToDiscard('he',true); + audio: 2, + content: function () { + trigger.source.chooseToDiscard("he", true); }, }, - rejiuchi:{ - group:['jiuchi'], - audioname:['re_dongzhuo'], - trigger:{source:'damage'}, - forced:true, - popup:false, - locked:false, - audio:'jiuchi', - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.getParent(2).jiu==true&&!player.hasSkill('rejiuchi_air'); + rejiuchi: { + group: ["jiuchi"], + audioname: ["re_dongzhuo"], + trigger: { source: "damage" }, + forced: true, + popup: false, + locked: false, + audio: "jiuchi", + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.getParent(2).jiu == true && + !player.hasSkill("rejiuchi_air") + ); }, - content:function(){ - player.logSkill('jiuchi'); - player.addTempSkill('rejiuchi_air'); + content: function () { + player.logSkill("jiuchi"); + player.addTempSkill("rejiuchi_air"); }, - subSkill:{ - air:{}, + subSkill: { + air: {}, }, }, //苏飞,新贾逵 - tongqu:{ - audio:2, - trigger:{ - global:['phaseBefore','dying','phaseDrawBegin2'], - player:['enterGame','phaseZhunbeiBegin'], + tongqu: { + audio: 2, + trigger: { + global: ["phaseBefore", "dying", "phaseDrawBegin2"], + player: ["enterGame", "phaseZhunbeiBegin"], }, - direct:true, - filter:function(event,player){ - if(event.name=='phaseDraw') return event.player.hasMark('tongqu'); - if(event.name=='dying') return event.player.hasMark('tongqu'); - if(event.name=='phaseZhunbei') return game.hasPlayer(function(current){ - return !current.hasMark('tongqu'); - }); - return !player.hasMark('tongqu')&&(event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - 'step 0' - if(trigger.name=='phaseDraw'){ - player.logSkill('tongqu',trigger.player); - trigger.player.draw('nodelay'); - trigger.player.addTempSkill('tongqu2','phaseDrawAfter'); - event.finish(); - } - else if(trigger.name=='dying'){ - player.logSkill('tongqu',trigger.player); - trigger.player.removeMark('tongqu',1); - event.finish(); - } - else if(trigger.name=='phaseZhunbei'){ - player.chooseTarget(get.prompt2('tongqu'),function(card,player,target){ - return !target.hasMark('tongqu'); - }).set('ai',function(target){ - if(_status.event.player.hp<3) return 0; - return get.attitude(_status.event.player,target); + direct: true, + filter: function (event, player) { + if (event.name == "phaseDraw") return event.player.hasMark("tongqu"); + if (event.name == "dying") return event.player.hasMark("tongqu"); + if (event.name == "phaseZhunbei") + return game.hasPlayer(function (current) { + return !current.hasMark("tongqu"); }); - } - else{ - player.logSkill('tongqu'); - player.addMark('tongqu',1); + return !player.hasMark("tongqu") && (event.name != "phase" || game.phaseNumber == 0); + }, + content: function () { + "step 0"; + if (trigger.name == "phaseDraw") { + player.logSkill("tongqu", trigger.player); + trigger.player.draw("nodelay"); + trigger.player.addTempSkill("tongqu2", "phaseDrawAfter"); + event.finish(); + } else if (trigger.name == "dying") { + player.logSkill("tongqu", trigger.player); + trigger.player.removeMark("tongqu", 1); + event.finish(); + } else if (trigger.name == "phaseZhunbei") { + player + .chooseTarget(get.prompt2("tongqu"), function (card, player, target) { + return !target.hasMark("tongqu"); + }) + .set("ai", function (target) { + if (_status.event.player.hp < 3) return 0; + return get.attitude(_status.event.player, target); + }); + } else { + player.logSkill("tongqu"); + player.addMark("tongqu", 1); event.finish(); } - 'step 1' - if(result.bool){ - var target=result.targets[0]; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; player.loseHp(); - player.logSkill('tongqu',target); - target.addMark('tongqu',1); + player.logSkill("tongqu", target); + target.addMark("tongqu", 1); } }, - marktext:'渠', - intro:{content:'mark',name2:'渠'}, + marktext: "渠", + intro: { content: "mark", name2: "渠" }, }, - tongqu2:{ - trigger:{player:'phaseDrawEnd'}, - forced:true, - silent:true, - filter:function(event,player){ - var bool=game.hasPlayer(function(current){ - return current!=player&¤t.hasMark('tongqu'); + tongqu2: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + silent: true, + filter: function (event, player) { + var bool = game.hasPlayer(function (current) { + return current != player && current.hasMark("tongqu"); }); - return player.countCards('he',function(card){ - if(bool) return true; - return lib.filter.cardDiscardable(card,player); - })>0; + return ( + player.countCards("he", function (card) { + if (bool) return true; + return lib.filter.cardDiscardable(card, player); + }) > 0 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - forced:true, - position:'he', - filterCard:true, - filterTarget:function(card,player,target){ - return player!=target&&target.hasMark('tongqu'); + forced: true, + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { + return player != target && target.hasMark("tongqu"); }, - selectTarget:function(){ - if(ui.selected.cards.length&&!lib.filter.cardDiscardable(ui.selected.cards[0],_status.event.player)) return [1,1]; - return [0,1]; + selectTarget: function () { + if ( + ui.selected.cards.length && + !lib.filter.cardDiscardable(ui.selected.cards[0], _status.event.player) + ) + return [1, 1]; + return [0, 1]; }, - prompt:'弃置一张牌,或将一张牌交给一名有“渠”的其他角色', - ai1:function(card){ - var player=_status.event.player; - if(get.name(card)=='du') return 20; - if(get.position(card)=='e'&&get.value(card)<=0) return 14; - if(get.position(card)=='h'&&game.hasPlayer(function(current){ - return current!=player&¤t.hasMark('tongqu')&&get.attitude(player,current)>0&¤t.getUseValue(card)>player.getUseValue(card)&¤t.getUseValue(card)>player.getUseValue(card); - })) return 12; - if(game.hasPlayer(function(current){ - return current!=player&¤t.hasMark('tongqu')&&get.attitude(player,current)>0; - })){ - if(card.name=='wuxie') return 11; - if(card.name=='shan'&&player.countCards('h','shan')>1) return 9 + prompt: "弃置一张牌,或将一张牌交给一名有“渠”的其他角色", + ai1: function (card) { + var player = _status.event.player; + if (get.name(card) == "du") return 20; + if (get.position(card) == "e" && get.value(card) <= 0) return 14; + if ( + get.position(card) == "h" && + game.hasPlayer(function (current) { + return ( + current != player && + current.hasMark("tongqu") && + get.attitude(player, current) > 0 && + current.getUseValue(card) > player.getUseValue(card) && + current.getUseValue(card) > player.getUseValue(card) + ); + }) + ) + return 12; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current.hasMark("tongqu") && + get.attitude(player, current) > 0 + ); + }) + ) { + if (card.name == "wuxie") return 11; + if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; } - return 6/Math.max(1,get.value(card)); + return 6 / Math.max(1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player; - var card=ui.selected.cards[0]; - var att=get.attitude(player,target); - if(card.name=='du') return -6*att; - if(att>0){ - if(get.position(card)=='h'&&target.getUseValue(card)>player.getUseValue(card)) return 4*att; - if(target.hasUseTarget(card)) return 2*att; - return 1.2*att; + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (card.name == "du") return -6 * att; + if (att > 0) { + if ( + get.position(card) == "h" && + target.getUseValue(card) > player.getUseValue(card) + ) + return 4 * att; + if (target.hasUseTarget(card)) return 2 * att; + return 1.2 * att; } return 0; }, }); - 'step 1' - if(result.bool){ - if(result.targets.length){ - event.target=result.targets[0]; - player.give(result.cards,event.target); - event.card=result.cards[0]; - } - else{ + ("step 1"); + if (result.bool) { + if (result.targets.length) { + event.target = result.targets[0]; + player.give(result.cards, event.target); + event.card = result.cards[0]; + } else { player.discard(result.cards); event.finish(); } } - 'step 2' - if(target.getCards('h').includes(card)&&get.type(card)=='equip'){ - target.chooseUseTarget(card,true); + ("step 2"); + if (target.getCards("h").includes(card) && get.type(card) == "equip") { + target.chooseUseTarget(card, true); } }, }, - xinwanlan:{ - audio:'wanlan', - trigger:{global:'damageBegin4'}, - filter:function(event,player){ - return event.player.hp<=event.num&&player.countCards('e')>=1; + xinwanlan: { + audio: "wanlan", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + return event.player.hp <= event.num && player.countCards("e") >= 1; }, - logTarget:'player', - check:function(event,player){ - if(get.attitude(player,event.player)<4) return false; - if(player.countCards('hs',card=>player.canSaveCard(card,event.player))>=1+event.num-event.player.hp) return false; - if(event.player==player||event.player==get.zhu(player)) return true; + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) < 4) return false; + if ( + player.countCards("hs", (card) => player.canSaveCard(card, event.player)) >= + 1 + event.num - event.player.hp + ) + return false; + if (event.player == player || event.player == get.zhu(player)) return true; return !player.hasUnknown(); }, - content:function(){ - player.discard(player.getCards('e')); + content: function () { + player.discard(player.getCards("e")); trigger.cancel(); }, }, - zhengjian:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - locked:true, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget('请选择【诤荐】的目标',lib.translate.zhengjian_info).set('ai',function(target){ - if(target.hasSkill('zhengjian_mark')) return 0; - if(player==target) return 0.5; - return get.attitude(_status.event.player,target)*(1+target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('zhengjian',target); - target.addSkill('zhengjian_mark'); - } - }, - group:'zhengjian_draw', - ai:{ - notemp:true, - }, - }, - zhengjian_draw:{ - audio:'zhengjian', - trigger:{player:'phaseBegin'}, - forced:true, - filter:function(event){ - return game.hasPlayer(function(current){ - return current.hasSkill('zhengjian_mark'); - }); - }, - logTarget:function(event){ - return game.filterPlayer(function(current){ - return current.hasSkill('zhengjian_mark'); - }); - }, - content:function(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current.countMark('zhengjian_mark')>0; - }); - if(list.length>1){ - event.delay=true; - game.asyncDraw(list,function(target){ - return Math.min(5,target.maxHp,target.countMark('zhengjian_mark')); + zhengjian: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + locked: true, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget("请选择【诤荐】的目标", lib.translate.zhengjian_info) + .set("ai", function (target) { + if (target.hasSkill("zhengjian_mark")) return 0; + if (player == target) return 0.5; + return get.attitude(_status.event.player, target) * (1 + target.countCards("h")); }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhengjian", target); + target.addSkill("zhengjian_mark"); } - else if(list.length==1) list[0].draw(Math.min(5,list[0].maxHp,list[0].countMark('zhengjian_mark'))); - 'step 1' - game.countPlayer(function(current){ - current.removeSkill('zhengjian_mark'); - }); - if(event.delay) game.delayx(); + }, + group: "zhengjian_draw", + ai: { + notemp: true, }, }, - zhengjian_mark:{ - trigger:{player:['useCard1','respond']}, - silent:true, - firstDo:true, - onremove:true, - charlotte:true, - content:function(){ - player.addMark('zhengjian_mark',1,false); - }, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=0; - }, - mark:true, - intro:{ - content:'已使用/打出过#张牌', - }, - }, - gaoyuan:{ - audio:2, - trigger:{target:'useCardToTarget'}, - direct:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(player.countCards('he')==0) return false; - return game.hasPlayer(function(current){ - return current!=event.player&¤t!=player&& - current.hasSkill('zhengjian_mark')&&lib.filter.targetEnabled(event.card,event.player,current); + zhengjian_draw: { + audio: "zhengjian", + trigger: { player: "phaseBegin" }, + forced: true, + filter: function (event) { + return game.hasPlayer(function (current) { + return current.hasSkill("zhengjian_mark"); }); }, - content:function(){ - "step 0" - var next=player.chooseCardTarget({ - position:'he', - filterCard:lib.filter.cardDiscardable, - filterTarget:function(card,player,target){ - var trigger=_status.event; - if(target!=player&&target!=trigger.source){ - if(target.hasSkill('zhengjian_mark')&&lib.filter.targetEnabled(trigger.card,trigger.source,target)) return true; + logTarget: function (event) { + return game.filterPlayer(function (current) { + return current.hasSkill("zhengjian_mark"); + }); + }, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current.countMark("zhengjian_mark") > 0; + }); + if (list.length > 1) { + event.delay = true; + game.asyncDraw(list, function (target) { + return Math.min(5, target.maxHp, target.countMark("zhengjian_mark")); + }); + } else if (list.length == 1) + list[0].draw(Math.min(5, list[0].maxHp, list[0].countMark("zhengjian_mark"))); + ("step 1"); + game.countPlayer(function (current) { + current.removeSkill("zhengjian_mark"); + }); + if (event.delay) game.delayx(); + }, + }, + zhengjian_mark: { + trigger: { player: ["useCard1", "respond"] }, + silent: true, + firstDo: true, + onremove: true, + charlotte: true, + content: function () { + player.addMark("zhengjian_mark", 1, false); + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = 0; + }, + mark: true, + intro: { + content: "已使用/打出过#张牌", + }, + }, + gaoyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (player.countCards("he") == 0) return false; + return game.hasPlayer(function (current) { + return ( + current != event.player && + current != player && + current.hasSkill("zhengjian_mark") && + lib.filter.targetEnabled(event.card, event.player, current) + ); + }); + }, + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + position: "he", + filterCard: lib.filter.cardDiscardable, + filterTarget: function (card, player, target) { + var trigger = _status.event; + if (target != player && target != trigger.source) { + if ( + target.hasSkill("zhengjian_mark") && + lib.filter.targetEnabled(trigger.card, trigger.source, target) + ) + return true; } return false; }, - ai1:function(card){ - return get.unuseful(card)+9; + ai1: function (card) { + return get.unuseful(card) + 9; }, - ai2:function(target){ - if(_status.event.player.countCards('h','shan')){ - return -get.attitude(_status.event.player,target); + ai2: function (target) { + if (_status.event.player.countCards("h", "shan")) { + return -get.attitude(_status.event.player, target); } - if(get.attitude(_status.event.player,target)<5){ - return 6-get.attitude(_status.event.player,target); + if (get.attitude(_status.event.player, target) < 5) { + return 6 - get.attitude(_status.event.player, target); } - if(_status.event.player.hp==1&&player.countCards('h','shan')==0){ - return 10-get.attitude(_status.event.player,target); + if (_status.event.player.hp == 1 && player.countCards("h", "shan") == 0) { + return 10 - get.attitude(_status.event.player, target); } - if(_status.event.player.hp==2&&player.countCards('h','shan')==0){ - return 8-get.attitude(_status.event.player,target); + if (_status.event.player.hp == 2 && player.countCards("h", "shan") == 0) { + return 8 - get.attitude(_status.event.player, target); } return -1; }, - prompt:get.prompt('gaoyuan'), - prompt2:'弃置一张牌,将此【杀】转移给一名有“诤”的角色', - source:trigger.player, - card:trigger.card, + prompt: get.prompt("gaoyuan"), + prompt2: "弃置一张牌,将此【杀】转移给一名有“诤”的角色", + source: trigger.player, + card: trigger.card, }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill(event.name,target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill(event.name, target); player.discard(result.cards); - var evt=trigger.getParent(); + var evt = trigger.getParent(); evt.triggeredTargets2.remove(player); evt.targets.remove(player); evt.targets.push(target); @@ -11655,313 +14212,361 @@ game.import('character', function () { }, }, //一 将 成 名 - zhilve:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - 'step 0' - if(!player.canMoveCard()) event._result={index:1}; - else player.chooseControl().set('choiceList',[ - '移动场上的一张牌', - '本回合的摸牌阶段多摸一张牌且第一张杀无距离次数限制', - ]).set('ai',function(){return 1}); - 'step 1' - if(result.index==1){ - player.addTempSkill('zhilve_yingzi'); - if(!player.getHistory('useCard',function(card){ - return card.card.name=='sha'; - }).length) player.addTempSkill('zhilve_xiandeng'); + zhilve: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; + if (!player.canMoveCard()) event._result = { index: 1 }; + else + player + .chooseControl() + .set("choiceList", [ + "移动场上的一张牌", + "本回合的摸牌阶段多摸一张牌且第一张杀无距离次数限制", + ]) + .set("ai", function () { + return 1; + }); + ("step 1"); + if (result.index == 1) { + player.addTempSkill("zhilve_yingzi"); + if ( + !player.getHistory("useCard", function (card) { + return card.card.name == "sha"; + }).length + ) + player.addTempSkill("zhilve_xiandeng"); event.finish(); - } - else player.moveCard(true); - 'step 2' - if(result.position=='e') player.loseHp(); - else player.addTempSkill('zhilve_dis'); + } else player.moveCard(true); + ("step 2"); + if (result.position == "e") player.loseHp(); + else player.addTempSkill("zhilve_dis"); }, - subSkill:{ - dis:{ - mod:{ - maxHandcard:function(player,num){ - return num-1; + subSkill: { + dis: { + mod: { + maxHandcard: function (player, num) { + return num - 1; }, }, }, - yingzi:{ - trigger:{player:'phaseDrawBegin2'}, - popup:false, - forced:true, - filter:function(event,player){ + yingzi: { + trigger: { player: "phaseDrawBegin2" }, + popup: false, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){trigger.num++}, + content: function () { + trigger.num++; + }, }, - xiandeng:{ - mod:{ - targetInRange:function(card,player){ - if(card.name=='sha') return true; + xiandeng: { + mod: { + targetInRange: function (card, player) { + if (card.name == "sha") return true; }, }, - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - return event.card.name=='sha'; + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.card.name == "sha"; }, - content:function(){ + content: function () { player.removeSkill(event.name); - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat('card'); - if(stat&&stat.sha) stat.sha--; + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat("card"); + if (stat && stat.sha) stat.sha--; } }, }, }, }, - xhzhiyan:{ - enable:'phaseUse', - audio:2, - filter:function(event,player){ - return player.countCards('h')!=player.maxHp; + xhzhiyan: { + enable: "phaseUse", + audio: 2, + filter: function (event, player) { + return player.countCards("h") != player.maxHp; }, - filterCard:true, - selectCard:function(){ - var player=_status.event.player; - var num=Math.max(0,player.countCards('h')-player.maxHp); - return [num,num]; + filterCard: true, + selectCard: function () { + var player = _status.event.player; + var num = Math.max(0, player.countCards("h") - player.maxHp); + return [num, num]; }, - check:function(card){ - var player=_status.event.player; - if(player.getUseValue(card)<=0&&game.hasPlayer(function(current){ - return current!=player&&get.value(card,current)*get.attitude(player,current)>0; - })) return 1; + check: function (card) { + var player = _status.event.player; + if ( + player.getUseValue(card) <= 0 && + game.hasPlayer(function (current) { + return ( + current != player && + get.value(card, current) * get.attitude(player, current) > 0 + ); + }) + ) + return 1; return 0; }, - content:function(){ - 'step 0' - if(!cards.length){ - player.draw(player.maxHp-player.countCards('h')); - player.addTempSkill('zishou2'); + content: function () { + "step 0"; + if (!cards.length) { + player.draw(player.maxHp - player.countCards("h")); + player.addTempSkill("zishou2"); event.finish(); - } - else{ - cards=cards.filterInD('d'); - if(cards.length) player.chooseButton(['是否将其中的一张牌交给一名其他角色?',cards]).set('',function(button){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current!=player&&get.value(button.link,current)*get.attitude(player,current)>0; - })) return Math.abs(get.value(button.link)); - return 0; - }); + } else { + cards = cards.filterInD("d"); + if (cards.length) + player + .chooseButton(["是否将其中的一张牌交给一名其他角色?", cards]) + .set("", function (button) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + get.value(button.link, current) * + get.attitude(player, current) > + 0 + ); + }) + ) + return Math.abs(get.value(button.link)); + return 0; + }); else event.finish(); } - 'step 1' - if(result.bool&&game.hasPlayer(current=>current!=player)){ - event.card=result.links[0]; - player.chooseTarget(true,lib.filter.notMe,'选择一名其他角色获得'+get.translation(event.card)).set('ai',function(target){ - return get.value(_status.event.getParent().card,target)*get.attitude(_status.event.player,target); - }); - } - else event.finish(); - 'step 2' - var target=result.targets[0]; - player.line(target,'green'); - target.gain(card,'gain2','log'); + ("step 1"); + if (result.bool && game.hasPlayer((current) => current != player)) { + event.card = result.links[0]; + player + .chooseTarget( + true, + lib.filter.notMe, + "选择一名其他角色获得" + get.translation(event.card) + ) + .set("ai", function (target) { + return ( + get.value(_status.event.getParent().card, target) * + get.attitude(_status.event.player, target) + ); + }); + } else event.finish(); + ("step 2"); + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2", "log"); }, - ai:{ - order:function(obj,player){ - if(player.countCards('h')>player.maxHp) return 10; + ai: { + order: function (obj, player) { + if (player.countCards("h") > player.maxHp) return 10; return 0.5; }, - result:{ - player:1, + result: { + player: 1, }, }, }, //水 果 忍 者 - zhengjing_guanju:{audio:true}, - zhengjing:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return !player.hasSkill('zhengjing3'); + zhengjing_guanju: { audio: true }, + zhengjing: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return !player.hasSkill("zhengjing3"); }, - content:function(){ - "step 0" + content: function () { + "step 0"; //game.trySkillAudio('zhengjing_guanju',player); - if(_status.connectMode) event.time=lib.configOL.choose_timeout; - var cards=[]; - var names=[]; - while(true){ - var card=get.cardPile(function(carde){ - return carde.name!='du'&&!names.includes(carde.name); + if (_status.connectMode) event.time = lib.configOL.choose_timeout; + var cards = []; + var names = []; + while (true) { + var card = get.cardPile(function (carde) { + return carde.name != "du" && !names.includes(carde.name); }); - if(card){ + if (card) { cards.push(card); names.push(card.name); - if(get.mode()=='doudizhu'){ - if(cards.length==1&&!get.isLuckyStar(player)&&Math.random()<0.33) break; - if(cards.length==2&&!get.isLuckyStar(player)&&Math.random()<0.5) break; - if(cards.length>=3) break; + if (get.mode() == "doudizhu") { + if (cards.length == 1 && !get.isLuckyStar(player) && Math.random() < 0.33) + break; + if (cards.length == 2 && !get.isLuckyStar(player) && Math.random() < 0.5) + break; + if (cards.length >= 3) break; + } else { + if (cards.length == 3 && !get.isLuckyStar(player) && Math.random() < 0.33) + break; + if (cards.length == 4 && !get.isLuckyStar(player) && Math.random() < 0.5) + break; + if (cards.length >= 5) break; } - else{ - if(cards.length==3&&!get.isLuckyStar(player)&&Math.random()<0.33) break; - if(cards.length==4&&!get.isLuckyStar(player)&&Math.random()<0.5) break; - if(cards.length>=5) break; - } - } - else break; - }; - event.cards=cards; - if(!cards.length){event.finish();return;}; - event.videoId=lib.status.videoId++; - if(player.isUnderControl()){ + } else break; + } + event.cards = cards; + if (!cards.length) { + event.finish(); + return; + } + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ - names.remove('du'); + var switchToAuto = function () { + names.remove("du"); game.pause(); game.countChoose(); - setTimeout(function(){ - _status.imchoosing=false; - event._result={ - bool:true, - links:names.slice(0), + setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, + links: names.slice(0), }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); game.resume(); - },5000); + }, 5000); }; - var createDialog=function(player,id){ - if(_status.connectMode) lib.configOL.choose_timeout='30'; - if(player==game.me) return; - var str=get.translation(player)+'正在整理经书...
    '; - ui.create.dialog(str).videoId=id; + var createDialog = function (player, id) { + if (_status.connectMode) lib.configOL.choose_timeout = "30"; + if (player == game.me) return; + var str = get.translation(player) + "正在整理经书...
    "; + ui.create.dialog(str).videoId = id; }; - var chooseButton=function(list){ - var roundmenu=false; - if(ui.roundmenu&&ui.roundmenu.display!='none'){ - roundmenu=true; - ui.roundmenu.style.display='none'; + var chooseButton = function (list) { + var roundmenu = false; + if (ui.roundmenu && ui.roundmenu.display != "none") { + roundmenu = true; + ui.roundmenu.style.display = "none"; } - var event=_status.event; - event.settleed=false; - event.finishedx=[]; - event.map={}; - var names=list.slice(0) - event.zhengjing_nodes=[]; - names.push('du'); - names.randomSort() - var names2=names.slice(0); - for(var i=0;i<2;i++){ + var event = _status.event; + event.settleed = false; + event.finishedx = []; + event.map = {}; + var names = list.slice(0); + event.zhengjing_nodes = []; + names.push("du"); + names.randomSort(); + var names2 = names.slice(0); + for (var i = 0; i < 2; i++) { names2.randomSort(); - names=names.concat(names2); + names = names.concat(names2); } - event.zhengjing=names; - for(var i of list){ - event.map[i]=0; + event.zhengjing = names; + for (var i of list) { + event.map[i] = 0; } - event.dialog=ui.create.dialog('forcebutton','hidden'); - event.dialog.textPrompt=event.dialog.add('
    及时点击卡牌,但不要点到毒了!
    '); - var str='
    '; - for(var i of list){ - str+=(get.translation(i)+':'+Math.min(2,event.map[i])+'/2 '); + event.dialog = ui.create.dialog("forcebutton", "hidden"); + event.dialog.textPrompt = event.dialog.add( + '
    及时点击卡牌,但不要点到毒了!
    ' + ); + var str = '
    '; + for (var i of list) { + str += get.translation(i) + ":" + Math.min(2, event.map[i]) + "/2 "; } - str+='
    '; - event.dialog.textPrompt2=event.dialog.add(str); - event.switchToAuto=function(){ - event._result={ - bool:true, - links:event.finishedx.slice(0), + str += "
    "; + event.dialog.textPrompt2 = event.dialog.add(str); + event.switchToAuto = function () { + event._result = { + bool: true, + links: event.finishedx.slice(0), }; event.dialog.close(); game.resume(); - _status.imchoosing=false; - if(roundmenu) ui.roundmenu.style.display=''; + _status.imchoosing = false; + if (roundmenu) ui.roundmenu.style.display = ""; }; - event.dialog.classList.add('fixed'); - event.dialog.classList.add('scroll1'); - event.dialog.classList.add('scroll2'); - event.dialog.classList.add('fullwidth'); - event.dialog.classList.add('fullheight'); - event.dialog.classList.add('noupdate'); + event.dialog.classList.add("fixed"); + event.dialog.classList.add("scroll1"); + event.dialog.classList.add("scroll2"); + event.dialog.classList.add("fullwidth"); + event.dialog.classList.add("fullheight"); + event.dialog.classList.add("noupdate"); event.dialog.open(); - event.settle=function(du){ - if(event.settleed) return; - event.settleed=true; - event.dialog.textPrompt2.innerHTML=''; - if(du){ - if(lib.config.background_speak) game.playAudio('skill','zhengjing_boom'); - event.dialog.textPrompt.innerHTML='
    叫你别点毒你非得点 这下翻车了吧
    '; + event.settle = function (du) { + if (event.settleed) return; + event.settleed = true; + event.dialog.textPrompt2.innerHTML = ""; + if (du) { + if (lib.config.background_speak) game.playAudio("skill", "zhengjing_boom"); + event.dialog.textPrompt.innerHTML = + '
    叫你别点毒你非得点 这下翻车了吧
    '; + } else { + if (lib.config.background_speak) game.playAudio("skill", "zhengjing_finish"); + event.dialog.textPrompt.innerHTML = + '
    整理经典结束!共整理出' + + get.cnNumber(event.finishedx.length) + + "份经典
    "; } - else { - if(lib.config.background_speak) game.playAudio('skill','zhengjing_finish'); - event.dialog.textPrompt.innerHTML='
    整理经典结束!共整理出'+get.cnNumber(event.finishedx.length)+'份经典
    '; - } - while(event.zhengjing_nodes.length){ + while (event.zhengjing_nodes.length) { event.zhengjing_nodes.shift().delete(); } - setTimeout(function(){ - event.switchToAuto(); - },1000); + setTimeout(function () { + event.switchToAuto(); + }, 1000); }; - var click=function(){ - var name=this.name; - if(name=='du'){ - event.zhengjing.length=0; + var click = function () { + var name = this.name; + if (name == "du") { + event.zhengjing.length = 0; event.settle(true); - } - else{ - if(lib.config.background_speak) game.playAudio('skill','zhengjing_click'); + } else { + if (lib.config.background_speak) game.playAudio("skill", "zhengjing_click"); event.map[name]++; - if(event.map[name]>1) event.finishedx.add(name); - if(event.finishedx.length 1) event.finishedx.add(name); + if (event.finishedx.length < list.length) { + var str = '
    '; + for (var i of list) { + str += get.translation(i) + ":" + Math.min(2, event.map[i]) + "/2 "; } - str+='
    '; - event.dialog.textPrompt2.innerHTML=str; - } - else{ - event.zhengjing.length=0; + str += ""; + event.dialog.textPrompt2.innerHTML = str; + } else { + event.zhengjing.length = 0; event.settle(); } } event.zhengjing_nodes.remove(this); - this.style.transition='all 0.5s'; - this.style.transform='scale(1.2)'; + this.style.transition = "all 0.5s"; + this.style.transform = "scale(1.2)"; this.delete(); }; - var addNode=function(){ - if(event.zhengjing.length){ - var card=ui.create.card(ui.special,'noclick',true); - card.init(['','',event.zhengjing.shift()]); - card.addEventListener(lib.config.touchscreen?'touchstart':'mousedown',click); + var addNode = function () { + if (event.zhengjing.length) { + var card = ui.create.card(ui.special, "noclick", true); + card.init(["", "", event.zhengjing.shift()]); + card.addEventListener( + lib.config.touchscreen ? "touchstart" : "mousedown", + click + ); event.zhengjing_nodes.push(card); - card.style.position='absolute'; - var rand1=Math.round(Math.random()*100); - var rand2=Math.round(Math.random()*100); - var rand3=Math.round(Math.random()*40)-20; - card.style.left='calc('+rand1+'% - '+rand1+'px)'; - card.style.top='calc('+rand2+'% - '+rand2+'px)'; - card.style.transform='scale(0.8) rotate('+rand3+'deg)'; - card.style.opacity=0; + card.style.position = "absolute"; + var rand1 = Math.round(Math.random() * 100); + var rand2 = Math.round(Math.random() * 100); + var rand3 = Math.round(Math.random() * 40) - 20; + card.style.left = "calc(" + rand1 + "% - " + rand1 + "px)"; + card.style.top = "calc(" + rand2 + "% - " + rand2 + "px)"; + card.style.transform = "scale(0.8) rotate(" + rand3 + "deg)"; + card.style.opacity = 0; event.dialog.appendChild(card); ui.refresh(card); - card.style.opacity=1; - card.style.transform='scale(1) rotate('+rand3+'deg)'; + card.style.opacity = 1; + card.style.transform = "scale(1) rotate(" + rand3 + "deg)"; } - if(event.zhengjing_nodes.length>(event.zhengjing.length>0?2:0)) event.zhengjing_nodes.shift().delete(); - if(event.zhengjing.length||event.zhengjing_nodes.length) setTimeout(function(){ - addNode(); - },800); + if (event.zhengjing_nodes.length > (event.zhengjing.length > 0 ? 2 : 0)) + event.zhengjing_nodes.shift().delete(); + if (event.zhengjing.length || event.zhengjing_nodes.length) + setTimeout(function () { + addNode(); + }, 800); else event.settle(); }; @@ -11970,3202 +14575,3739 @@ game.import('character', function () { addNode(); }; //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog,player,event.videoId); - if(event.isMine()){ + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { chooseButton(names); - } - else if(event.isOnline()){ - event.player.send(chooseButton,names); + } else if (event.isOnline()) { + event.player.send(chooseButton, names); event.player.wait(); game.pause(); - } - else{ + } else { switchToAuto(); } - "step 1" - game.broadcastAll(function(id,time){ - if(_status.connectMode) lib.configOL.choose_timeout=time; - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - },event.videoId,event.time); - var result=event.result||result; - for(var i=0;i0; + next.set("filterOk", function (moved) { + return moved[0].length > 0; }); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0).sort(function(a,b){ - return get.value(a)-get.value(b); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(a) - get.value(b); }); - return [cards.splice(0,1),cards]; - }) - "step 5" - if(result.bool){ - var cards=result.moved[0],gains=result.moved[1]; - target.addSkill('zhengjing2'); - target.addToExpansion(cards,'gain2').gaintag.add('zhengjing2'); - if(gains.length) player.gain(gains,'gain2'); + return [cards.splice(0, 1), cards]; + }); + ("step 5"); + if (result.bool) { + var cards = result.moved[0], + gains = result.moved[1]; + target.addSkill("zhengjing2"); + target.addToExpansion(cards, "gain2").gaintag.add("zhengjing2"); + if (gains.length) player.gain(gains, "gain2"); } }, - ai:{ - order:10, - result:{player:1}, - threaten:3.2, - } + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, + }, }, //恁就是仲村由理? - zhengjing2:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - charlotte:true, - intro:{content:'expansion',markcount:'expansion'}, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + zhengjing2: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + intro: { content: "expansion", markcount: "expansion" }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - content:function(){ - 'step 0' - player.gain(player.getExpansions('zhengjing2'),'gain2'); - player.skip('phaseJudge'); - player.skip('phaseDraw'); - 'step 1' - player.removeSkill('zhengjing2'); + content: function () { + "step 0"; + player.gain(player.getExpansions("zhengjing2"), "gain2"); + player.skip("phaseJudge"); + player.skip("phaseDraw"); + ("step 1"); + player.removeSkill("zhengjing2"); }, }, - zhengjing3:{}, + zhengjing3: {}, //邓芝 - jimeng:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countGainableCards(player,'he')>0; - }) - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jimeng'),function(card,player,target){ - return target!=player&&target.countGainableCards(player,'he')>0; - }).set('ai',function(target){ - var player=_status.event.player; - if(player.hp>1&&get.attitude(player,target)<2) return 0; - return get.effect(target,{name:'shunshou'},player,player); + jimeng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countGainableCards(player, "he") > 0; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jimeng',target); - player.gainPlayerCard(target,'he',true); - } - else event.finish(); - 'step 2' - var hs=player.getCards('he'); - if(player.hp>0&&hs.length){ - if(hs.length<=player.hp) event._result={bool:true,cards:hs}; - else player.chooseCard(player.hp,true,'交给'+get.translation(target)+get.cnNumber(player.hp)+'张牌','he',true); - } - else event.finish(); - 'step 3' - player.give(result.cards,target); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("jimeng"), function (card, player, target) { + return target != player && target.countGainableCards(player, "he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hp > 1 && get.attitude(player, target) < 2) return 0; + return get.effect(target, { name: "shunshou" }, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jimeng", target); + player.gainPlayerCard(target, "he", true); + } else event.finish(); + ("step 2"); + var hs = player.getCards("he"); + if (player.hp > 0 && hs.length) { + if (hs.length <= player.hp) event._result = { bool: true, cards: hs }; + else + player.chooseCard( + player.hp, + true, + "交给" + get.translation(target) + get.cnNumber(player.hp) + "张牌", + "he", + true + ); + } else event.finish(); + ("step 3"); + player.give(result.cards, target); }, }, - shuaiyan:{ - audio:2, - trigger:{player:'phaseDiscardBegin'}, - filter:function(event,player){ - return player.countCards('h')>1; + shuaiyan: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return player.countCards("h") > 1; }, - check:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he')&&lib.skill.shuaiyan.check2(current,player); + check: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && + current.countCards("he") && + lib.skill.shuaiyan.check2(current, player) + ); }); }, - check2:function(target,player){ - if(get.itemtype(player)!='player') player=_status.event.player; - return -get.attitude(player,target)/target.countCards('he'); + check2: function (target, player) { + if (get.itemtype(player) != "player") player = _status.event.player; + return -get.attitude(player, target) / target.countCards("he"); }, - content:function(){ - 'step 0' - player.showHandcards(get.translation(player)+'发动了【率言】'); - 'step 1' - var filter=function(card,player,target){ - return player!=target&&target.countCards('he')>0; + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【率言】"); + ("step 1"); + var filter = function (card, player, target) { + return player != target && target.countCards("he") > 0; }; - if(game.hasPlayer(function(current){ - return filter('我约等于白板',player,current); - })){ - player.chooseTarget(true,filter,'选择一名其他角色,令其交给你一张牌').set('ai',lib.skill.shuaiyan.check2); - } - else event.finish(); - 'step 2' - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); - 'step 3' - target.give(result.cards,player); + if ( + game.hasPlayer(function (current) { + return filter("我约等于白板", player, current); + }) + ) { + player + .chooseTarget(true, filter, "选择一名其他角色,令其交给你一张牌") + .set("ai", lib.skill.shuaiyan.check2); + } else event.finish(); + ("step 2"); + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + ("step 3"); + target.give(result.cards, player); }, }, - relihuo:{ - audio:2, - group:['relihuo_baigei','relihuo_damage'], - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; + relihuo: { + audio: 2, + group: ["relihuo_baigei", "relihuo_damage"], + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; }, - check:function(event,player){ + check: function (event, player) { return false; }, - content:function(){ - game.setNature(trigger.card,'fire'); - trigger.relihuo=true; + content: function () { + game.setNature(trigger.card, "fire"); + trigger.relihuo = true; }, }, - relihuo_damage:{ - trigger:{source:'damageBegin1'}, - forced:true, - audio:'relihuo', - filter:function(event,player){ - return event.getParent(2).relihuo==true&&event.player.isLinked(); + relihuo_damage: { + trigger: { source: "damageBegin1" }, + forced: true, + audio: "relihuo", + filter: function (event, player) { + return event.getParent(2).relihuo == true && event.player.isLinked(); }, - content:function(){ + content: function () { trigger.num++; }, }, - relihuo_baigei:{ - trigger:{player:'useCardAfter'}, - forced:true, - audio:'relihuo', - filter:function(event,player){ - if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; - var num=0; - player.getHistory('sourceDamage',function(evt){ - if(evt.card==event.card) num+=evt.num; + relihuo_baigei: { + trigger: { player: "useCardAfter" }, + forced: true, + audio: "relihuo", + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + var num = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.card == event.card) num += evt.num; }); - return num>1; + return num > 1; }, - content:function(){ - var num=0; - player.getHistory('sourceDamage',function(evt){ - if(evt.card==trigger.card) num+=evt.num; + content: function () { + var num = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.card == trigger.card) num += evt.num; }); - player.loseHp(Math.floor(num/2)); + player.loseHp(Math.floor(num / 2)); }, }, - gongsun:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>1; + gongsun: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 1; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt2('gongsun'), - selectCard:2, - filterCard:lib.filter.cardDiscardable, - filterTarget:lib.filter.notMe, - position:'he', - ai1:function(card){ - var friend=0,enemy=0,player=_status.event.player; - var num=game.countPlayer(function(target){ - var att=get.attitude(player,target); - if(att<0) enemy++; - if(target!=player&&att>0) friend++; + prompt: get.prompt2("gongsun"), + selectCard: 2, + filterCard: lib.filter.cardDiscardable, + filterTarget: lib.filter.notMe, + position: "he", + ai1: function (card) { + var friend = 0, + enemy = 0, + player = _status.event.player; + var num = game.countPlayer(function (target) { + var att = get.attitude(player, target); + if (att < 0) enemy++; + if (target != player && att > 0) friend++; return true; }); - if(num>(friend+enemy+2)) return 0; - if(friend friend + enemy + 2) return 0; + if (friend < enemy) return 0; + if (card.name == "sha") return 10 - enemy; + return 10 - enemy - get.value(card); }, - ai2:function(target){ - return -get.attitude(_status.event.player,target)*(1+target.countCards('h')); + ai2: function (target) { + return -get.attitude(_status.event.player, target) * (1 + target.countCards("h")); }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('gongsun',target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("gongsun", target); player.discard(result.cards); - player.addTempSkill('gongsun_shadow',{player:['phaseBegin','die']}); - var list=[]; - for(var i=0;i0) str+='
    ' - str+=get.translation(shadow[i][0]); - str+=':'; - str+=get.translation(shadow[i][1]); + marktext: "损", + onremove: true, + intro: { + content: function (shadow) { + var str = ""; + for (var i = 0; i < shadow.length; i++) { + if (i > 0) str += "
    "; + str += get.translation(shadow[i][0]); + str += ":"; + str += get.translation(shadow[i][1]); } return str; }, }, - mod:{ - cardEnabled:function(card,player){ - var list=player.storage.gongsun_shadow; - for(var i=0;i0&&!player.hasSkill('duoduan_im'); + duoduan: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + player.countCards("he") > 0 && + !player.hasSkill("duoduan_im") + ); }, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt2('duoduan'),lib.filter.cardRecastable).set('ai',function(card){ - if(_status.event.goon) return 8-get.value(card); - return 0; - }).set('goon',function(){ - if(get.attitude(trigger.player,player)>0) return true; - if(!trigger.player.countCards('he')) return true; - if(!player.hasShan()) return true; - return event.getRand()<0.5; - }()); - 'step 1' - if(result.bool){ - player.addTempSkill('duoduan_im'); - player.logSkill('duoduan',trigger.player); + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt2("duoduan"), lib.filter.cardRecastable) + .set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + if (get.attitude(trigger.player, player) > 0) return true; + if (!trigger.player.countCards("he")) return true; + if (!player.hasShan()) return true; + return event.getRand() < 0.5; + })() + ); + ("step 1"); + if (result.bool) { + player.addTempSkill("duoduan_im"); + player.logSkill("duoduan", trigger.player); player.recast(result.cards); - } - else event.finish(); - 'step 2' - var sha=get.translation(trigger.card); - if(!trigger.player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,trigger.player,'duoduan'); - })) event.finish(); - else player.chooseControl().set('choiceList',[ - '令其摸两张牌,然后令'+sha+'对你无效', - '令其弃置一张牌,然后你不可响应'+sha, - ]).set('prompt','度断:令'+get.translation(trigger.player)+'执行一项').set('ai',function(){ - var player=_status.event.player; - var source=_status.event.getTrigger().player; - if(get.attitude(player,source)>0) return 0; - if(!player.hasShan()&&player.hp>=2) return 1; - return 0; - }); - 'step 3' - if(result.index==0) event.goto(5); - else trigger.player.chooseToDiscard('弃置一张牌令'+get.translation(player)+'不能闪避此【杀】','he',true); - 'step 4' - if(result.bool){ + } else event.finish(); + ("step 2"); + var sha = get.translation(trigger.card); + if ( + !trigger.player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, trigger.player, "duoduan"); + }) + ) + event.finish(); + else + player + .chooseControl() + .set("choiceList", [ + "令其摸两张牌,然后令" + sha + "对你无效", + "令其弃置一张牌,然后你不可响应" + sha, + ]) + .set("prompt", "度断:令" + get.translation(trigger.player) + "执行一项") + .set("ai", function () { + var player = _status.event.player; + var source = _status.event.getTrigger().player; + if (get.attitude(player, source) > 0) return 0; + if (!player.hasShan() && player.hp >= 2) return 1; + return 0; + }); + ("step 3"); + if (result.index == 0) event.goto(5); + else + trigger.player.chooseToDiscard( + "弃置一张牌令" + get.translation(player) + "不能闪避此【杀】", + "he", + true + ); + ("step 4"); + if (result.bool) { trigger.directHit.add(player); } event.finish(); - 'step 5' + ("step 5"); trigger.player.draw(2); trigger.excluded.add(player); }, }, - duoduan_im:{ + duoduan_im: { //'im' refers to 'Iwasawa Masami' in 'Angel Beats!' //Although she disappeared in the Episode 3 of the anime, but her route in the game is really worth to play. }, - chengzhao:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - var num=0; - player.getHistory('gain',function(evt){ - num+=evt.cards.length; - }); - if(num<2) return false; - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return player!=current&&player.canCompare(current); + chengzhao: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + var num = 0; + player.getHistory("gain", function (evt) { + num += evt.cards.length; }); + if (num < 2) return false; + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return player != current && player.canCompare(current); + }) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('chengzhao'),function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)/target.countCards('h'); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('chengzhao',target); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("chengzhao"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) / target.countCards("h"); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("chengzhao", target); player.chooseToCompare(target); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card={name:'sha',isCard:true}; - if(player.canUse(card,target,false)) player.useCard(card,target,false).card.chengzhao=true; + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = { name: "sha", isCard: true }; + if (player.canUse(card, target, false)) + player.useCard(card, target, false).card.chengzhao = true; } }, - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.card||arg.card.chengzhao!=true) return false; + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || arg.card.chengzhao != true) return false; }, }, }, - rezhengrong:{ - trigger:{player:'useCardAfter'}, - direct:true, - audio:'drlt_zhenrong', - filter:function(event,player){ - if(!event.targets) return false; - if(!event.isPhaseUsing(player)) return false; - var bool=false; - for(var i=0;i0; - }).set('ai',function(target){ - return (1-get.attitude(_status.event.player,target))/target.countCards('he'); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=result.targets[0]; - player.logSkill('rezhengrong',target); - var card=target.getCards('he').randomGet(); - player.addToExpansion(card,target,'give').gaintag.add('rezhengrong'); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("rezhengrong"), + "将一名其他角色的随机一张牌置于你的武将牌上,成为「荣」", + function (card, player, target) { + return target != player && target.countCards("he") > 0; + } + ) + .set("ai", function (target) { + return (1 - get.attitude(_status.event.player, target)) / target.countCards("he"); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = result.targets[0]; + player.logSkill("rezhengrong", target); + var card = target.getCards("he").randomGet(); + player.addToExpansion(card, target, "give").gaintag.add("rezhengrong"); } }, - marktext:'荣', - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + marktext: "荣", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, }, - rehongju:{ - trigger:{player:'phaseZhunbeiBegin'}, - audio:'drlt_hongju', - forced:true, - unique:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - derivation:'reqingce', - filter:function(event,player){ - return player.getExpansions('rezhengrong').length>=3&&game.dead.length>0; + rehongju: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "drlt_hongju", + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + derivation: "reqingce", + filter: function (event, player) { + return player.getExpansions("rezhengrong").length >= 3 && game.dead.length > 0; }, - content:function(){ - 'step 0' - player.awakenSkill('rehongju'); - player.draw(player.getExpansions('rezhengrong').length); - 'step 1' - if(player.countCards('h')==0) event.goto(3); - else{ - var dialog=['请选择要交换的手牌和「荣」,或点「取消」','
    「征荣」牌
    ',player.getExpansions('rezhengrong'),'
    手牌区
    ',player.getCards('h')]; - var next=player.chooseButton(dialog); - next.set('filterButton',function(button){ - var ss=_status.event.player.getExpansions('rezhengrong'); - var hs=_status.event.player.getCards('h'); - var sn=0; - var hn=0; - var ub=ui.selected.buttons; - for(var i=0;i「征荣」牌', + player.getExpansions("rezhengrong"), + '
    手牌区
    ', + player.getCards("h"), + ]; + var next = player.chooseButton(dialog); + next.set("filterButton", function (button) { + var ss = _status.event.player.getExpansions("rezhengrong"); + var hs = _status.event.player.getCards("h"); + var sn = 0; + var hn = 0; + var ub = ui.selected.buttons; + for (var i = 0; i < ub.length; i++) { + if (ss.includes(ub[i].link)) sn++; else hn++; } - return !(sn>=hs.length&&ss.includes(button.link)||hn>=ss.length&&hs.includes(button.link)); + return !( + (sn >= hs.length && ss.includes(button.link)) || + (hn >= ss.length && hs.includes(button.link)) + ); }); - next.set('selectButton',function(){ - if(ui.selected.buttons.length==0) return 2; - var ss=_status.event.player.getExpansions('rezhengrong'); - var hs=_status.event.player.getCards('h'); - var sn=0; - var hn=0; - var ub=ui.selected.buttons; - for(var i=0;i0; + reqingce: { + enable: "phaseUse", + audio: "drlt_qingce", + filter: function (event, player) { + return player.getExpansions("rezhengrong").length > 0; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('请选择要移去的「荣」',player.getExpansions('rezhengrong'),'hidden'); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog( + "请选择要移去的「荣」", + player.getExpansions("rezhengrong"), + "hidden" + ); }, - backup:function(links,player){ + backup: function (links, player) { return { - card:links[0], - filterCard:function(){return false}, - selectCard:-1, - filterTarget:function(card,player,target){ - return target.countDiscardableCards(player,'ej')>0; + card: links[0], + filterCard: function () { + return false; }, - delay:false, - audio:'drlt_qingce', - content:lib.skill.reqingce.contentx, - ai:{ - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - if(att>0&&(target.countCards('j')>0||target.countCards('e',function(card){ - return get.value(card,target)<0; - }))) return 2; - if(att<0&&target.countCards('e')>0&&!target.hasSkillTag('noe')) return -1; + selectCard: -1, + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; + }, + delay: false, + audio: "drlt_qingce", + content: lib.skill.reqingce.contentx, + ai: { + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if ( + att > 0 && + (target.countCards("j") > 0 || + target.countCards("e", function (card) { + return get.value(card, target) < 0; + })) + ) + return 2; + if ( + att < 0 && + target.countCards("e") > 0 && + !target.hasSkillTag("noe") + ) + return -1; return 0; }, }, }, - } + }; }, - prompt:function(links,player){ - return '弃置一名角色装备区或判定区内的一张牌'; + prompt: function (links, player) { + return "弃置一名角色装备区或判定区内的一张牌"; }, }, - contentx:function(){ - 'step 0' - var card=lib.skill.reqingce_backup.card; + contentx: function () { + "step 0"; + var card = lib.skill.reqingce_backup.card; player.loseToDiscardpile(card); - 'step 1' - if(target.countDiscardableCards(player,'ej')>0){ - player.discardPlayerCard('ej',true,target); + ("step 1"); + if (target.countDiscardableCards(player, "ej") > 0) { + player.discardPlayerCard("ej", true, target); } }, - ai:{ - order:8, - result:{ - player:function(player){ - if(game.hasPlayer(function(current){ - var att=get.attitude(player,current); - if((att>0&¤t.countCards('j')>0)||(att<0&¤t.countCards('e')>0)) return true; - return false; - })) return 1; + ai: { + order: 8, + result: { + player: function (player) { + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + if ( + (att > 0 && current.countCards("j") > 0) || + (att < 0 && current.countCards("e") > 0) + ) + return true; + return false; + }) + ) + return 1; return 0; }, }, }, }, - fengji:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return typeof player.storage.fengji=='number'&&player.countCards('h')>=player.storage.fengji; + fengji: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + typeof player.storage.fengji == "number" && + player.countCards("h") >= player.storage.fengji + ); }, - content:function(){ + content: function () { player.draw(2); - player.addTempSkill('fengji3'); + player.addTempSkill("fengji3"); }, - group:'fengji2', - intro:{ - content:'上回合结束时的手牌数:#', + group: "fengji2", + intro: { + content: "上回合结束时的手牌数:#", }, }, - fengji2:{ - trigger:{player:'phaseEnd'}, - silent:true, - content:function(){ - player.storage.fengji=player.countCards('h'); - if(player.hasSkill('fengji')) player.markSkill('fengji'); + fengji2: { + trigger: { player: "phaseEnd" }, + silent: true, + content: function () { + player.storage.fengji = player.countCards("h"); + if (player.hasSkill("fengji")) player.markSkill("fengji"); }, }, - fengji3:{ - mod:{ - maxHandcardBase:function(player,num){ + fengji3: { + mod: { + maxHandcardBase: function (player, num) { return player.maxHp; }, }, }, - zhouxuan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0; + zhouxuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - position:'he', - filterTarget:lib.filter.notMe, - check:function(card){ - return 6-get.value(card); + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + check: function (card) { + return 6 - get.value(card); }, - content:function(){ - 'step 0' - player.addSkill('zhouxuan2'); - target.addTempSkill('zhouxuan_ai',{player:'phaseUseAfter'}); - player.storage.zhouxuan2={}; - player.storage.zhouxuan2.player=target; - var list=[]; - var basic=[]; - for(var i=0;i0) return Math.max(1,target.hp)*target.countCards('h',function(card){ - return target.getUseValue(card)>0; + event.basic = basic; + player + .chooseControl(list) + .set("prompt", "请选择一种基本牌的名称或非基本牌的类别") + .set("ai", function () { + var player = _status.event.player; + var target = player.storage.zhouxuan2.player; + var cards = target.getCards("h", function (card) { + return target.hasUseTarget(card); }); + var map = {}; + for (var i = 0; i < cards.length; i++) { + var type = get.type(cards[i], "trick"); + map[type == "basic" ? get.name(cards[i]) : type] = true; + } + if (map.equip) return "equip"; + if (map.trick) return "trick"; + if (map.sha) return "sha"; + if (map.tao) return "tao"; + return 0; + }); + ("step 1"); + player.storage.zhouxuan2.card = result.control; + if (event.basic.includes(result.control)) player.storage.zhouxuan2.isbasic = true; + player.markSkill("zhouxuan2"); + }, + ai: { + order: 1, + result: { + player: function (player, target) { + if (get.attitude(player, target) > 0) + return ( + Math.max(1, target.hp) * + target.countCards("h", function (card) { + return target.getUseValue(card) > 0; + }) + ); return 0; }, }, }, }, - zhouxuan_ai:{ - mod:{ - aiOrder:function(player,card,num){ - if(game.hasPlayer(function(current){ - return current.storage.zhouxuan2&¤t.storage.zhouxuan2.player==player&&get.attitude(player,current)>0&&(current.storage.zhouxuan2.isbasic?card.name:get.type(card,'trick'))==current.storage.zhouxuan2.card; - })) return num+10; - } - }, - }, - zhouxuan2:{ - intro:{ - mark:function(player,storage){ - return get.translation(storage.player)+'使用或打出下一张牌时,若此牌为'+get.translation(storage.card)+(storage.isbasic?'':'牌')+',你观看牌堆顶的三张牌并分配给任意角色'; + zhouxuan_ai: { + mod: { + aiOrder: function (player, card, num) { + if ( + game.hasPlayer(function (current) { + return ( + current.storage.zhouxuan2 && + current.storage.zhouxuan2.player == player && + get.attitude(player, current) > 0 && + (current.storage.zhouxuan2.isbasic + ? card.name + : get.type(card, "trick")) == current.storage.zhouxuan2.card + ); + }) + ) + return num + 10; }, }, - audio:'zhouxuan', - forced:true, - charlotte:true, - trigger:{global:['useCard','respond']}, - filter:function(event,player){ - if(event.zhouxuanable) return true; - if(player.storage.zhouxuan2){ - var map=player.storage.zhouxuan2; - if(map.player!=event.player) return false; + }, + zhouxuan2: { + intro: { + mark: function (player, storage) { + return ( + get.translation(storage.player) + + "使用或打出下一张牌时,若此牌为" + + get.translation(storage.card) + + (storage.isbasic ? "" : "牌") + + ",你观看牌堆顶的三张牌并分配给任意角色" + ); + }, + }, + audio: "zhouxuan", + forced: true, + charlotte: true, + trigger: { global: ["useCard", "respond"] }, + filter: function (event, player) { + if (event.zhouxuanable) return true; + if (player.storage.zhouxuan2) { + var map = player.storage.zhouxuan2; + if (map.player != event.player) return false; delete player.storage.zhouxuan2; - player.unmarkSkill('zhouxuan2'); - if(map.card!=(map.isbasic?event.card.name:get.type(event.card,'trick'))) return false; - event.zhouxuanable=true; + player.unmarkSkill("zhouxuan2"); + if (map.card != (map.isbasic ? event.card.name : get.type(event.card, "trick"))) + return false; + event.zhouxuanable = true; return true; } return false; }, - logTarget:'player', - content:function(){ - 'step 0' - event.cards=game.cardsGotoOrdering(get.cards(3)).cards; - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - 'step 1' - if(event.cards.length>1){ - player.chooseCardButton('周旋:请选择要分配的牌',true,event.cards,[1,event.cards.length]).set('ai',function(button){ - if(ui.selected.buttons.length==0) return 1; - return 0; + logTarget: "player", + content: function () { + "step 0"; + event.cards = game.cardsGotoOrdering(get.cards(3)).cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - } - else if(event.cards.length==1){ - event._result={links:event.cards.slice(0),bool:true}; - } - else{ + event.given_map = {}; + ("step 1"); + if (event.cards.length > 1) { + player + .chooseCardButton("周旋:请选择要分配的牌", true, event.cards, [ + 1, + event.cards.length, + ]) + .set("ai", function (button) { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + } else if (event.cards.length == 1) { + event._result = { links: event.cards.slice(0), bool: true }; + } else { event.finish(); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { event.cards.removeArray(result.links); - event.togive=result.links.slice(0); - player.chooseTarget('选择一名角色获得'+get.translation(result.links),true).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.enemy){ - return -att; - } - else if(att>0){ - return att/(1+target.countCards('h')); - } - else{ - return att/100; - } - }).set('enemy',get.value(event.togive[0],player,'raw')<0); + event.togive = result.links.slice(0); + player + .chooseTarget("选择一名角色获得" + get.translation(result.links), true) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); } - 'step 3' - if(result.targets.length){ - var id=result.targets[0].playerid,map=event.given_map; - if(!map[id]) map[id]=[]; + ("step 3"); + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; map[id].addArray(event.togive); } - if(cards.length>0) event.goto(1); - 'step 4' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + if (cards.length > 0) event.goto(1); + ("step 4"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - var list=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - list.push([source,event.given_map[i]]); + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); } game.loseAsync({ - gain_list:list, - giver:player, - animate:'draw', - }).setContent('gaincardMultiple'); + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); }, }, - reshanxi:{ - audio:'shanxi', - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.hp>0&&player.countCards('h',function(card){ - if(_status.connectMode) return true; - return get.color(card)=='red'&&get.type(card)=='basic'; - })>0; + reshanxi: { + audio: "shanxi", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.hp > 0 && + player.countCards("h", function (card) { + if (_status.connectMode) return true; + return get.color(card) == "red" && get.type(card) == "basic"; + }) > 0 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:function(card){ - return get.color(card)=='red'&&get.type(card)=='basic'&&lib.filter.cardDiscardable.apply(this,arguments); + filterCard: function (card) { + return ( + get.color(card) == "red" && + get.type(card) == "basic" && + lib.filter.cardDiscardable.apply(this, arguments) + ); }, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('he')>0; + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 0; + }, + prompt: get.prompt("reshanxi"), + prompt2: + "弃置一张红色基本牌并选择一名其他角色,将其的至多X张牌置于其武将牌上直到回合结束。(X为你的体力值)", + ai1: function () { + return -1; }, - prompt:get.prompt('reshanxi'), - prompt2:'弃置一张红色基本牌并选择一名其他角色,将其的至多X张牌置于其武将牌上直到回合结束。(X为你的体力值)', - ai1:function(){return -1}, }); - 'step 1' - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('reshanxi',event.target); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("reshanxi", event.target); player.discard(result.cards); - } - else event.finish(); - 'step 2' - var max=Math.min(player.hp,target.countCards('he')); - if(max>0&&target.isIn()){ - player.choosePlayerCard('he',target,true,[1,max]).set('forceAuto',true).set('prompt','将'+get.translation(target)+'的至多'+get.cnNumber(max)+'张牌置于其武将牌上'); - } - else event.finish(); - 'step 3' - target.addSkill('reshanxi2'); - target.addToExpansion(result.cards,'giveAuto',target).gaintag.add('reshanxi2'); + } else event.finish(); + ("step 2"); + var max = Math.min(player.hp, target.countCards("he")); + if (max > 0 && target.isIn()) { + player + .choosePlayerCard("he", target, true, [1, max]) + .set("forceAuto", true) + .set( + "prompt", + "将" + + get.translation(target) + + "的至多" + + get.cnNumber(max) + + "张牌置于其武将牌上" + ); + } else event.finish(); + ("step 3"); + target.addSkill("reshanxi2"); + target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("reshanxi2"); }, }, - reshanxi2:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + reshanxi2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - content:function(){ - 'step 0' - var cards=player.getExpansions('reshanxi2'); - if(cards.length) player.gain(cards,'draw'); - 'step 1' - player.removeSkill('reshanxi2'); + content: function () { + "step 0"; + var cards = player.getExpansions("reshanxi2"); + if (cards.length) player.gain(cards, "draw"); + ("step 1"); + player.removeSkill("reshanxi2"); }, - intro:{ - markcount:'expansion', - mark:function(dialog,storage,player){ - var cards=player.getExpansions('reshanxi2'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("reshanxi2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; }, }, }, - reqizhou:{ - trigger:{player:['equipEnd','loseEnd']}, - forced:true, - popup:false, - derivation:['reyingzi','qixi','rexuanfeng'], - filter:function(event,player){ - if(player.equiping) return false; - var suits=[]; - var es=player.getCards('e'); - for(var i=0;i3) suits.length=3; - if(player.additionalSkills.reqizhou){ - return player.additionalSkills.reqizhou.length!=suits.length; - } - else{ - return suits.length>0; + if (suits.length > 3) suits.length = 3; + if (player.additionalSkills.reqizhou) { + return player.additionalSkills.reqizhou.length != suits.length; + } else { + return suits.length > 0; } }, - content:function(){ - lib.skill.reqizhou.init(player,'reqizhou'); + content: function () { + lib.skill.reqizhou.init(player, "reqizhou"); }, - init:function(player,skill){ - var suits=[]; - var es=player.getCards('e'); - for(var i=0;i3) suits.length=3; + if (suits.length > 3) suits.length = 3; player.removeAdditionalSkill(skill); - switch(suits.length){ - case 1:player.addAdditionalSkill(skill,['reyingzi']);break; - case 2:player.addAdditionalSkill(skill,['reyingzi','qixi']);break; - case 3:player.addAdditionalSkill(skill,['reyingzi','qixi','rexuanfeng']);break; + switch (suits.length) { + case 1: + player.addAdditionalSkill(skill, ["reyingzi"]); + break; + case 2: + player.addAdditionalSkill(skill, ["reyingzi", "qixi"]); + break; + case 3: + player.addAdditionalSkill(skill, ["reyingzi", "qixi", "rexuanfeng"]); + break; } }, - ai:{ - threaten:1.2 - } + ai: { + threaten: 1.2, + }, }, - zhaohan:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.phaseNumber<8; + zhaohan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.phaseNumber < 8; }, - check:function(event,player){ - return player.phaseNumber<3; + check: function (event, player) { + return player.phaseNumber < 3; }, - content:function(){ - if(player.phaseNumber<5){ + content: function () { + if (player.phaseNumber < 5) { player.gainMaxHp(); player.recover(); - } - else player.loseMaxHp(); + } else player.loseMaxHp(); }, }, - rangjie:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + rangjie: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - var choiceList=['获得一张指定类型的牌']; - if(player.canMoveCard()) choiceList.push('移动场上的一张牌'); - player.chooseControl('cancel2').set('choiceList',choiceList).set('prompt',get.prompt('rangjie')).set('ai',function(){ - var player=_status.event.player; - if(player.canMoveCard(true)) return 1; - return 0; - }); - 'step 2' - if(result.control=='cancel2') event.finish(); - else{ - player.logSkill('rangjie'); + var choiceList = ["获得一张指定类型的牌"]; + if (player.canMoveCard()) choiceList.push("移动场上的一张牌"); + player + .chooseControl("cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("rangjie")) + .set("ai", function () { + var player = _status.event.player; + if (player.canMoveCard(true)) return 1; + return 0; + }); + ("step 2"); + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("rangjie"); player.draw(); - if(result.index==0){ - player.chooseControl('basic','trick','equip').set('prompt','选择获得一种类型的牌').set('ai',function(){ - var player=_status.event.player; - if(player.hp<=3&&!player.countCards('h',{name:['shan','tao']})) return 'basic'; - if(player.countCards('he',{type:'equip'})<2) return 'equip'; - return 'trick'; - }); - } - else{ + if (result.index == 0) { + player + .chooseControl("basic", "trick", "equip") + .set("prompt", "选择获得一种类型的牌") + .set("ai", function () { + var player = _status.event.player; + if (player.hp <= 3 && !player.countCards("h", { name: ["shan", "tao"] })) + return "basic"; + if (player.countCards("he", { type: "equip" }) < 2) return "equip"; + return "trick"; + }); + } else { player.moveCard(true); event.goto(4); } } - 'step 3' - var card=get.cardPile2(function(card){ - return get.type(card,'trick')==result.control; + ("step 3"); + var card = get.cardPile2(function (card) { + return get.type(card, "trick") == result.control; }); - if(card) player.gain(card,'gain2','log'); - 'step 4' - if(event.count>0&&player.hasSkill('rangjie')) event.goto(1); + if (card) player.gain(card, "gain2", "log"); + ("step 4"); + if (event.count > 0 && player.hasSkill("rangjie")) event.goto(1); }, - ai:{ - maixie:true, - "maixie_hp":true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()) num=0.7; - else num=0.5; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; } - if(target.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } }, }, }, }, - yizheng:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.hp<=player.hp&&player.canCompare(current); + yizheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hp <= player.hp && player.canCompare(current); }); }, - filterTarget:function(card,player,current){ - return current.hp<=player.hp&&player.canCompare(current); + filterTarget: function (card, player, current) { + return current.hp <= player.hp && player.canCompare(current); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - target.skip('phaseDraw'); - target.addTempSkill('yizheng2',{player:'phaseDrawSkipped'}); - } - else player.loseMaxHp(); + ("step 1"); + if (result.bool) { + target.skip("phaseDraw"); + target.addTempSkill("yizheng2", { player: "phaseDrawSkipped" }); + } else player.loseMaxHp(); }, - ai:{ - order:1, - result:{ - player:(player,target)=>{ - let hs=player.getCards('h').sort(function(a,b){ - return get.number(b)-get.number(a); + ai: { + order: 1, + result: { + player: (player, target) => { + let hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); }); - if(!hs.length) return 0; - let a=get.number(hs[0]),b=4; - if(player.getDamagedHp()) b=2; - return -b*(1-Math.pow((a-1)/13,target.countCards('h'))); + if (!hs.length) return 0; + let a = get.number(hs[0]), + b = 4; + if (player.getDamagedHp()) b = 2; + return -b * (1 - Math.pow((a - 1) / 13, target.countCards("h"))); }, - target:(player,target)=>{ - if(target.skipList.includes('phaseDraw')||target.hasSkill('pingkou')||target.hasSkill('xinpingkou')) return 0; - let hs=player.getCards('h').sort(function(a,b){ - return get.number(b)-get.number(a); + target: (player, target) => { + if ( + target.skipList.includes("phaseDraw") || + target.hasSkill("pingkou") || + target.hasSkill("xinpingkou") + ) + return 0; + let hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); }); - if(!hs.length) return 0; - return -Math.pow((get.number(hs[0])-1)/13,target.countCards('h'))*2; - } + if (!hs.length) return 0; + return -Math.pow((get.number(hs[0]) - 1) / 13, target.countCards("h")) * 2; + }, }, }, }, - yizheng2:{ - mark:true, - intro:{content:'跳过下回合的摸牌阶段'}, + yizheng2: { + mark: true, + intro: { content: "跳过下回合的摸牌阶段" }, }, - rw_zhuge_skill:{ - equipSkill:true, - audio:true, - firstDo:true, - trigger:{player:'useCard1'}, - forced:true, - filter:function(event,player){ - return !event.audioed&&event.card.name=='sha'&&player.countUsed('sha',true)>1&&event.getParent().type=='phase'; + rw_zhuge_skill: { + equipSkill: true, + audio: true, + firstDo: true, + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + return ( + !event.audioed && + event.card.name == "sha" && + player.countUsed("sha", true) > 1 && + event.getParent().type == "phase" + ); }, - content:function(){ - trigger.audioed=true; + content: function () { + trigger.audioed = true; }, - mod:{ - cardUsable:function(card,player,num){ - var cards=player.getEquips('rewrite_zhuge') - if(card.name=='sha'){ - if(!cards.length||player.hasSkill('rw_zhuge_skill',null,false)||cards.some(card=>(card!=_status.rw_zhuge_temp&&!ui.selected.cards.includes(card)))){ - if(get.is.versus()||get.is.changban()){ - return num+3; + mod: { + cardUsable: function (card, player, num) { + var cards = player.getEquips("rewrite_zhuge"); + if (card.name == "sha") { + if ( + !cards.length || + player.hasSkill("rw_zhuge_skill", null, false) || + cards.some( + (card) => + card != _status.rw_zhuge_temp && !ui.selected.cards.includes(card) + ) + ) { + if (get.is.versus() || get.is.changban()) { + return num + 3; } return Infinity; } } }, - cardEnabled2:function(card,player){ - if(!_status.event.addCount_extra||player.hasSkill('rw_zhuge_skill',null,false)) return; - var cards=player.getEquips('rewrite_zhuge'); - if(card&&cards.includes(card)){ - try{ - var cardz=get.card(); - } - catch(e){ + cardEnabled2: function (card, player) { + if (!_status.event.addCount_extra || player.hasSkill("rw_zhuge_skill", null, false)) + return; + var cards = player.getEquips("rewrite_zhuge"); + if (card && cards.includes(card)) { + try { + var cardz = get.card(); + } catch (e) { return; } - if(!cardz||cardz.name!='sha') return; - _status.rw_zhuge_temp=card; - var bool=lib.filter.cardUsable(get.autoViewAs({name:'sha'},ui.selected.cards.concat([card])),player); + if (!cardz || cardz.name != "sha") return; + _status.rw_zhuge_temp = card; + var bool = lib.filter.cardUsable( + get.autoViewAs({ name: "sha" }, ui.selected.cards.concat([card])), + player + ); delete _status.rw_zhuge_temp; - if(!bool) return false; + if (!bool) return false; } }, }, }, - xinqingjian:{ - audio:'qingjian', - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + xinqingjian: { + audio: "qingjian", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - direct:true, - usable:1, - filter:function(event,player){ - return event.getg(player).length&&event.getParent('phaseDraw').player!=player&&player.countCards('he')>0; + direct: true, + usable: 1, + filter: function (event, player) { + return ( + event.getg(player).length && + event.getParent("phaseDraw").player != player && + player.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt2('xinqingjian'),'he',[1,player.countCards('he')]).ai=function(){return -1}; - 'step 1' - if(result.bool){ - player.logSkill('xinqingjian'); - player.addSkill('xinqingjian2'); - player.addToExpansion(result.cards,'giveAuto',player).gaintag.add('xinqingjian2'); - } - else player.storage.counttrigger.xinqingjian--; + content: function () { + "step 0"; + player.chooseCard(get.prompt2("xinqingjian"), "he", [1, player.countCards("he")]).ai = + function () { + return -1; + }; + ("step 1"); + if (result.bool) { + player.logSkill("xinqingjian"); + player.addSkill("xinqingjian2"); + player.addToExpansion(result.cards, "giveAuto", player).gaintag.add("xinqingjian2"); + } else player.storage.counttrigger.xinqingjian--; }, }, - xinqingjian2:{ - audio:'xinqingjian', - charlotte:true, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return player.getExpansions('xinqingjian2').length>0; + xinqingjian2: { + audio: "xinqingjian", + charlotte: true, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return player.getExpansions("xinqingjian2").length > 0; }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - content:function(){ - 'step 0' - var cards=player.getExpansions('xinqingjian2'); - player.chooseTarget(true,lib.filter.notMe).set('createDialog',['清俭:将这些牌交给一名角色'+(cards.length>1?',然后摸一张牌':''),cards]); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'thunder'); - if(player.give(player.getExpansions('xinqingjian2'),target).cards.length>1) player.draw(); + content: function () { + "step 0"; + var cards = player.getExpansions("xinqingjian2"); + player + .chooseTarget(true, lib.filter.notMe) + .set("createDialog", [ + "清俭:将这些牌交给一名角色" + (cards.length > 1 ? ",然后摸一张牌" : ""), + cards, + ]); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + if (player.give(player.getExpansions("xinqingjian2"), target).cards.length > 1) + player.draw(); } - 'step 2' - player.removeSkill('xinqingjian2'); + ("step 2"); + player.removeSkill("xinqingjian2"); }, - intro:{ - markcount:'expansion', - mark:function(dialog,storage,player){ - var cards=player.getExpansions('xinqingjian2'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("xinqingjian2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; }, }, }, - zhongzuo:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.getHistory('damage').length>0||player.getHistory('sourceDamage').length>0; + zhongzuo: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.getHistory("damage").length > 0 || player.getHistory("sourceDamage").length > 0 + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhongzuo'),'令一名角色摸两张牌。若其已受伤,则你摸一张牌。').set('ai',function(target){ - if(target.hasSkillTag('nogain')) return target.isDamaged()?0:1; - let att=get.attitude(_status.event.player,target); - if(att<=0) return 0; - if(target.isDamaged()) return 1+att/5; - return att/5; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('zhongzuo',target); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhongzuo"), + "令一名角色摸两张牌。若其已受伤,则你摸一张牌。" + ) + .set("ai", function (target) { + if (target.hasSkillTag("nogain")) return target.isDamaged() ? 0 : 1; + let att = get.attitude(_status.event.player, target); + if (att <= 0) return 0; + if (target.isDamaged()) return 1 + att / 5; + return att / 5; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhongzuo", target); target.draw(2); - if(target.isDamaged()) player.draw(); + if (target.isDamaged()) player.draw(); } }, }, - wanlan:{ - audio:2, - trigger:{global:'dying'}, - check:function(event,player){ - if(get.attitude(player,event.player)<4) return false; - if(player.countCards('hs',card=>player.canSaveCard(card,event.player))>=1-event.player.hp) return false; - if(event.player==player||event.player==get.zhu(player)) return true; - if(_status.currentPhase&&get.damageEffect(_status.currentPhase,player,player)<0) return false; + wanlan: { + audio: 2, + trigger: { global: "dying" }, + check: function (event, player) { + if (get.attitude(player, event.player) < 4) return false; + if ( + player.countCards("hs", (card) => player.canSaveCard(card, event.player)) >= + 1 - event.player.hp + ) + return false; + if (event.player == player || event.player == get.zhu(player)) return true; + if (_status.currentPhase && get.damageEffect(_status.currentPhase, player, player) < 0) + return false; return !player.hasUnknown(); }, - limited:true, - unique:true, - filter:function(event,player){ - return event.player.hp<=0; + limited: true, + unique: true, + filter: function (event, player) { + return event.player.hp <= 0; }, - skillAnimation:true, - animationColor:'thunder', - logTarget:'player', - content:function(){ - 'step 0' - player.awakenSkill('wanlan'); - var hs=player.getCards('h') - if(hs.length) player.discard(hs); - 'step 1' - var num=1-trigger.player.hp; - if(num) trigger.player.recover(num); - 'step 2' - if(_status.currentPhase&&_status.currentPhase.isIn()){ - var next=_status.currentPhase.damage(); + skillAnimation: true, + animationColor: "thunder", + logTarget: "player", + content: function () { + "step 0"; + player.awakenSkill("wanlan"); + var hs = player.getCards("h"); + if (hs.length) player.discard(hs); + ("step 1"); + var num = 1 - trigger.player.hp; + if (num) trigger.player.recover(num); + ("step 2"); + if (_status.currentPhase && _status.currentPhase.isIn()) { + var next = _status.currentPhase.damage(); event.next.remove(next); trigger.after.push(next); } }, }, - rezhiyi:{ - audio:'zhiyi', - trigger:{global:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player.getHistory('useCard',function(card){ - return get.type(card.card)=='basic'; - }).length>0||player.getHistory('respond',function(card){ - return get.type(card.card)=='basic'; - }).length>0; + rezhiyi: { + audio: "zhiyi", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (card) { + return get.type(card.card) == "basic"; + }).length > 0 || + player.getHistory("respond", function (card) { + return get.type(card.card) == "basic"; + }).length > 0 + ); }, - content:function(){ - 'step 0' - var list=[]; - player.getHistory('useCard',function(evt){ - if(get.type(evt.card)!='basic') return; - var name=evt.card.name; - if(name=='sha'){ - var nature=evt.card.nature; - switch(nature){ - case 'fire':name='huosha';break; - case 'thunder':name='leisha';break; - case 'kami':name='kamisha';break; - case 'ice':name='icesha';break; - case 'stab':name='cisha';break; + content: function () { + "step 0"; + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card) != "basic") return; + var name = evt.card.name; + if (name == "sha") { + var nature = evt.card.nature; + switch (nature) { + case "fire": + name = "huosha"; + break; + case "thunder": + name = "leisha"; + break; + case "kami": + name = "kamisha"; + break; + case "ice": + name = "icesha"; + break; + case "stab": + name = "cisha"; + break; } } list.add(name); }); - player.getHistory('respond',function(evt){ - if(get.type(evt.card)!='basic') return; - var name=evt.card.name; - if(name=='sha'){ - var nature=evt.card.nature; - switch(nature){ - case 'fire':name='huosha';break; - case 'thunder':name='leisha';break; - case 'kami':name='kamisha';break; - case 'ice':name='icesha';break; - case 'stab':name='cisha';break; + player.getHistory("respond", function (evt) { + if (get.type(evt.card) != "basic") return; + var name = evt.card.name; + if (name == "sha") { + var nature = evt.card.nature; + switch (nature) { + case "fire": + name = "huosha"; + break; + case "thunder": + name = "leisha"; + break; + case "kami": + name = "kamisha"; + break; + case "ice": + name = "icesha"; + break; + case "stab": + name = "cisha"; + break; } } list.add(name); }); - player.chooseButton(['执义:选择要使用的牌,或点取消摸一张牌',[list.map(function(name){ - return ['基本','',name]; - }),'vcard']],function(button){ - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); - },function(button){ - return _status.event.player.hasUseTarget({name:button.link[2],nature:button.link[3]}); - }); - 'step 1' - if(!result.bool) player.draw(); - else player.chooseUseTarget({name:result.links[0][2],isCard:true,nature:result.links[0][3]},true); + player.chooseButton( + [ + "执义:选择要使用的牌,或点取消摸一张牌", + [ + list.map(function (name) { + return ["基本", "", name]; + }), + "vcard", + ], + ], + function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + function (button) { + return _status.event.player.hasUseTarget({ + name: button.link[2], + nature: button.link[3], + }); + } + ); + ("step 1"); + if (!result.bool) player.draw(); + else + player.chooseUseTarget( + { name: result.links[0][2], isCard: true, nature: result.links[0][3] }, + true + ); }, }, - zhiyi:{ - audio:2, - trigger:{player:['useCard','respond']}, - forced:true, - filter:function(event,player){ - if(get.type(event.card)!='basic') return false; - var history=player.getHistory('useCard',function(evt){ - return get.type(evt.card)=='basic'; - }).concat(player.getHistory('respond',function(evt){ - return get.type(evt.card)=='basic'; - })); - return history.length==1&&history[0]==event; + zhiyi: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + if (get.type(event.card) != "basic") return false; + var history = player + .getHistory("useCard", function (evt) { + return get.type(evt.card) == "basic"; + }) + .concat( + player.getHistory("respond", function (evt) { + return get.type(evt.card) == "basic"; + }) + ); + return history.length == 1 && history[0] == event; }, - content:function(){ - 'step 0' - var info=get.info(trigger.card); - if(!info||!info.enable) event._result={index:0}; - else{ - var evt=trigger; - if(evt.respondTo&&evt.getParent('useCard').name=='useCard') evt=evt.getParent('useCard'); - event.evt=evt; - player.chooseControl().set('prompt','执义:请选择一项').set('choiceList',[ - '摸一张牌', - '于'+get.translation(evt.card)+'的使用结算结束之后视为使用一张'+get.translation({name:trigger.card.name,nature:trigger.card.nature,isCard:true}), - ]).set('ai',function(){return _status.event.choice}).set('choice',function(){ - var card={name:trigger.card.name,nature:trigger.card.nature,isCard:true}; - if(card.name=='sha'){ - if(player.getUseValue(card)>0) return 1; - } - else if(card.name=='tao'){ - var hp=player.maxHp-player.hp; - if(trigger.targets.includes(player)) hp--; - return hp>0?1:0; - } - return 0; - }()); + content: function () { + "step 0"; + var info = get.info(trigger.card); + if (!info || !info.enable) event._result = { index: 0 }; + else { + var evt = trigger; + if (evt.respondTo && evt.getParent("useCard").name == "useCard") + evt = evt.getParent("useCard"); + event.evt = evt; + player + .chooseControl() + .set("prompt", "执义:请选择一项") + .set("choiceList", [ + "摸一张牌", + "于" + + get.translation(evt.card) + + "的使用结算结束之后视为使用一张" + + get.translation({ + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }), + ]) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + if (card.name == "sha") { + if (player.getUseValue(card) > 0) return 1; + } else if (card.name == "tao") { + var hp = player.maxHp - player.hp; + if (trigger.targets.includes(player)) hp--; + return hp > 0 ? 1 : 0; + } + return 0; + })() + ); } - 'step 1' - if(result.index==0){ + ("step 1"); + if (result.index == 0) { player.draw(); - } - else{ - var next=player.chooseUseTarget({name:trigger.card.name,nature:trigger.card.nature,isCard:true},false,true); + } else { + var next = player.chooseUseTarget( + { name: trigger.card.name, nature: trigger.card.nature, isCard: true }, + false, + true + ); _status.event.next.remove(next); event.evt.after.push(next); - next.logSkill='zhiyi'; + next.logSkill = "zhiyi"; } }, }, //表演测试 - qiaosi_map:{charlotte:true}, - qiaosi:{ - audio:'xinfu_qiaosi', - derivation:'qiaosi_map', - enable:'phaseUse', - usable:1, - content:function(){ - "step 0" - event.videoId=lib.status.videoId++; - if(player.isUnderControl()){ + qiaosi_map: { charlotte: true }, + qiaosi: { + audio: "xinfu_qiaosi", + derivation: "qiaosi_map", + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ + var switchToAuto = function () { game.pause(); game.countChoose(); - setTimeout(function(){ - _status.imchoosing=false; - event._result={ - bool:true, - links:['qiaosi_c1','qiaosi_c6'].concat(['qiaosi_c2','qiaosi_c3','qiaosi_c4','qiaosi_c5'].randomGets(1)), + setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, + links: ["qiaosi_c1", "qiaosi_c6"].concat( + ["qiaosi_c2", "qiaosi_c3", "qiaosi_c4", "qiaosi_c5"].randomGets(1) + ), }; - if(event.dialog) event.dialog.close(); - if(event.controls){ - for(var i of event.controls) i.close(); + if (event.dialog) event.dialog.close(); + if (event.controls) { + for (var i of event.controls) i.close(); } game.resume(); - },5000); + }, 5000); }; - var createDialog=function(player,id){ - if(player==game.me) return; - var str=get.translation(player)+'正在表演...
    '; - for(var i=1;i<7;i++){ - str+=get.translation('qiaosi_c'+i); - if(i%3!=0) str+='  '; - if(i==3) str+='
    '; + var createDialog = function (player, id) { + if (player == game.me) return; + var str = get.translation(player) + "正在表演...
    "; + for (var i = 1; i < 7; i++) { + str += get.translation("qiaosi_c" + i); + if (i % 3 != 0) str += "  "; + if (i == 3) str += "
    "; } - ui.create.dialog(str,'forcebutton').videoId=id; + ui.create.dialog(str, "forcebutton").videoId = id; }; - var chooseButton=function(player){ - var event=_status.event; - player=player||event.player; - event.status={ - qiaosi_c1:0, - qiaosi_c2:0, - qiaosi_c3:0, - qiaosi_c4:0, - qiaosi_c5:0, - qiaosi_c6:0, - } - event.map={ - qiaosi_c1:[40,60], - qiaosi_c2:[80,120], - qiaosi_c3:[90,110], - qiaosi_c4:[90,110], - qiaosi_c5:[80,120], - qiaosi_c6:[40,60], - } - event.finishedx=[]; - event.str='请开始你的表演
    qiaosi_c1% qiaosi_c2% qiaosi_c3%
    qiaosi_c4%qiaosi_c5% qiaosi_c6%'; - event.dialog=ui.create.dialog(event.str,'forcebutton','hidden'); - event.dialog.addText('
  • 点击下方的按钮,可以增加按钮对应的角色的「表演完成度」。对于不同的角色,点击时增加的完成度不同,最终获得的牌也不同。一次表演最多只能完成3名角色的进度。',false); + var chooseButton = function (player) { + var event = _status.event; + player = player || event.player; + event.status = { + qiaosi_c1: 0, + qiaosi_c2: 0, + qiaosi_c3: 0, + qiaosi_c4: 0, + qiaosi_c5: 0, + qiaosi_c6: 0, + }; + event.map = { + qiaosi_c1: [40, 60], + qiaosi_c2: [80, 120], + qiaosi_c3: [90, 110], + qiaosi_c4: [90, 110], + qiaosi_c5: [80, 120], + qiaosi_c6: [40, 60], + }; + event.finishedx = []; + event.str = + '请开始你的表演
    qiaosi_c1% qiaosi_c2% qiaosi_c3%
    qiaosi_c4%qiaosi_c5% qiaosi_c6%'; + event.dialog = ui.create.dialog(event.str, "forcebutton", "hidden"); + event.dialog.addText( + "
  • 点击下方的按钮,可以增加按钮对应的角色的「表演完成度」。对于不同的角色,点击时增加的完成度不同,最终获得的牌也不同。一次表演最多只能完成3名角色的进度。", + false + ); event.dialog.open(); - for(var i in event.status){ - event.dialog.content.childNodes[0].innerHTML=event.dialog.content.childNodes[0].innerHTML.replace(i,event.status[i]); + for (var i in event.status) { + event.dialog.content.childNodes[0].innerHTML = + event.dialog.content.childNodes[0].innerHTML.replace(i, event.status[i]); } - for(var i=0;i=100){ - event.status[link]=100; - var str=event.str.slice(0); - for(var i in event.status){ - str=str.replace(i,event.status[i]); - } - event.dialog.content.childNodes[0].innerHTML=str; - event.finishedx.push(link); - if(event.finishedx.length>=3){ - event._result={ - bool:true, - links:event.finishedx.slice(0), - }; - event.dialog.close(); - for(var i of event.controls) i.close(); - game.resume(); - _status.imchoosing=false; - } - } - else{ - var str=event.str.slice(0); - for(var i in event.status){ - str=str.replace(i,event.status[i]); - } - event.dialog.content.childNodes[0].innerHTML=str; - } - })); - for(var i=0;i= 100) { + event.status[link] = 100; + var str = event.str.slice(0); + for (var i in event.status) { + str = str.replace(i, event.status[i]); + } + event.dialog.content.childNodes[0].innerHTML = str; + event.finishedx.push(link); + if (event.finishedx.length >= 3) { + event._result = { + bool: true, + links: event.finishedx.slice(0), + }; + event.dialog.close(); + for (var i of event.controls) i.close(); + game.resume(); + _status.imchoosing = false; + } + } else { + var str = event.str.slice(0); + for (var i in event.status) { + str = str.replace(i, event.status[i]); + } + event.dialog.content.childNodes[0].innerHTML = str; + } + }) + ); + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("selectable"); } game.pause(); game.countChoose(); }; //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog,player,event.videoId); - if(event.isMine()){ + game.broadcastAll(createDialog, player, event.videoId); + if (event.isMine()) { chooseButton(); - } - else if(event.isOnline()){ - event.player.send(chooseButton,event.player); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.player); event.player.wait(); game.pause(); - } - else{ + } else { switchToAuto(); } - "step 1" - game.broadcastAll('closeDialog',event.videoId); - var map=event.result||result; + ("step 1"); + game.broadcastAll("closeDialog", event.videoId); + var map = event.result || result; //game.print(map); - if(!map||!map.bool||!map.links){ - game.log(player,'表演失败'); + if (!map || !map.bool || !map.links) { + game.log(player, "表演失败"); event.finish(); return; } - var list=map.links; - if(!list.length){ - game.log(player,'表演失败'); + var list = map.links; + if (!list.length) { + game.log(player, "表演失败"); event.finish(); return; } - var cards=[]; - var list2=[]; - if(list.includes('qiaosi_c1')){ - list2.push('trick'); - list2.push('trick'); + var cards = []; + var list2 = []; + if (list.includes("qiaosi_c1")) { + list2.push("trick"); + list2.push("trick"); } - if(list.includes('qiaosi_c2')){ - if(list.includes('qiaosi_c1')) list2.push(['sha','jiu']); - else list2.push(Math.random()<0.66?'equip':['sha','jiu']); + if (list.includes("qiaosi_c2")) { + if (list.includes("qiaosi_c1")) list2.push(["sha", "jiu"]); + else list2.push(Math.random() < 0.66 ? "equip" : ["sha", "jiu"]); } - if(list.includes('qiaosi_c3')){ - list2.push([Math.random()<0.66?'sha':'jiu']) + if (list.includes("qiaosi_c3")) { + list2.push([Math.random() < 0.66 ? "sha" : "jiu"]); } - if(list.includes('qiaosi_c4')){ - list2.push([Math.random()<0.66?'shan':'tao']) + if (list.includes("qiaosi_c4")) { + list2.push([Math.random() < 0.66 ? "shan" : "tao"]); } - if(list.includes('qiaosi_c5')){ - if(list.includes('qiaosi_c6')) list2.push(['shan','tao']); - else list2.push(Math.random()<0.66?'trick':['shan','tao']); + if (list.includes("qiaosi_c5")) { + if (list.includes("qiaosi_c6")) list2.push(["shan", "tao"]); + else list2.push(Math.random() < 0.66 ? "trick" : ["shan", "tao"]); } - if(list.includes('qiaosi_c6')){ - list2.push('equip'); - list2.push('equip'); + if (list.includes("qiaosi_c6")) { + list2.push("equip"); + list2.push("equip"); } - while(list2.length){ - var filter=list2.shift(); - var card=get.cardPile(function(x){ - if(cards.includes(x)) return false; - if(typeof filter=='string'&&get.type(x,'trick')==filter) return true; - if(typeof filter=='object'&&filter.includes(x.name)) return true; + while (list2.length) { + var filter = list2.shift(); + var card = get.cardPile(function (x) { + if (cards.includes(x)) return false; + if (typeof filter == "string" && get.type(x, "trick") == filter) return true; + if (typeof filter == "object" && filter.includes(x.name)) return true; }); - if(card) cards.push(card); - else{ - var card=get.cardPile(function(x){ + if (card) cards.push(card); + else { + var card = get.cardPile(function (x) { return !cards.includes(x); }); - if(card) cards.push(card); + if (card) cards.push(card); } } - if(cards.length){ - event.cards=cards; - event.num=cards.length; + if (cards.length) { + event.cards = cards; + event.num = cards.length; player.showCards(cards); - } - else event.finish(); - "step 2" - player.gain(event.cards,'gain2'); - player.chooseControl().set('choiceList',[ - '将'+get.cnNumber(event.num)+'张牌交给一名其他角色', - '弃置'+get.cnNumber(event.num)+'张牌', - ]).set('ai',function(){ - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>2; - })) return 0; - return 1; - }); - "step 3" - if(result.index==0){ + } else event.finish(); + ("step 2"); + player.gain(event.cards, "gain2"); + player + .chooseControl() + .set("choiceList", [ + "将" + get.cnNumber(event.num) + "张牌交给一名其他角色", + "弃置" + get.cnNumber(event.num) + "张牌", + ]) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 2; + }) + ) + return 0; + return 1; + }); + ("step 3"); + if (result.index == 0) { player.chooseCardTarget({ - position:'he', - filterCard:true, - selectCard:event.num, - filterTarget:function(card,player,target){ - return player!=target; + position: "he", + filterCard: true, + selectCard: event.num, + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ + ai1: function (card) { return 1; }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(target.hasSkillTag('nogain')) att/=10; - if(target.hasJudge('lebu')) att/=5; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 5; return att; }, - prompt:'选择'+get.cnNumber(event.num)+'张牌,交给一名其他角色。', - forced:true, + prompt: "选择" + get.cnNumber(event.num) + "张牌,交给一名其他角色。", + forced: true, }); - } - else{ - player.chooseToDiscard(event.num,true,'he'); + } else { + player.chooseToDiscard(event.num, true, "he"); event.finish(); } - "step 4" - if(result.bool){ - var target=result.targets[0]; - player.give(result.cards,target); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.give(result.cards, target); } }, - ai:{ - order:10, - result:{player:1}, - threaten:3.2, - } + ai: { + order: 10, + result: { player: 1 }, + threaten: 3.2, + }, }, - refuhai:{ - audio:'xinfu_fuhai', - enable:'phaseUse', - usable:1, - content:function(){ - 'step 0' - event.current=player.next; - event.upper=[]; - event.lower=[]; - event.acted=[]; - event.num=0; - event.stopped=false; - 'step 1' + refuhai: { + audio: "xinfu_fuhai", + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + event.current = player.next; + event.upper = []; + event.lower = []; + event.acted = []; + event.num = 0; + event.stopped = false; + ("step 1"); event.acted.push(event.current); - event.current.chooseControl('潮起','潮落').set('prompt','潮鸣起乎?潮鸣落乎?').ai=function(){ - return Math.random()<0.5?0:1; - }; - 'step 2' - if(!event.chosen) event.chosen=result.control; - if(event.chosen!=result.control) event.stopped=true; - if(!event.stopped) event.num++; - if(result.control=='潮起'){ - event.upper.push(event.current) - } - else event.lower.push(event.current); - event.current=event.current.next; - if(event.current!=player&&!event.acted.includes(event.current)) event.goto(1); - 'step 3' - for(var i=0;i1) player.draw(num); + ("step 4"); + if (num > 1) player.draw(num); }, - ai:{ - order:10, - result:{player:1}, + ai: { + order: 10, + result: { player: 1 }, }, }, - rebiaozhao:{ - audio:'biaozhao', - intro:{ - content:"expansion", - markcount:'expansion', + rebiaozhao: { + audio: "biaozhao", + intro: { + content: "expansion", + markcount: "expansion", }, - trigger:{ - player:"phaseJieshuBegin", + trigger: { + player: "phaseJieshuBegin", }, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0&&!player.getExpansions('rebiaozhao').length; + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0 && !player.getExpansions("rebiaozhao").length; }, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('rebiaozhao'),'将一张牌置于武将牌上作为“表”').ai=function(card){ - return 6-get.value(card); - } - 'step 1' - if(result.bool){ - player.logSkill('rebiaozhao'); - player.addToExpansion(player,'give',result.cards).gaintag.add('rebiaozhao'); + content: function () { + "step 0"; + player.chooseCard("he", get.prompt("rebiaozhao"), "将一张牌置于武将牌上作为“表”").ai = + function (card) { + return 6 - get.value(card); + }; + ("step 1"); + if (result.bool) { + player.logSkill("rebiaozhao"); + player.addToExpansion(player, "give", result.cards).gaintag.add("rebiaozhao"); } }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{notemp:true}, - group:['rebiaozhao2','rebiaozhao3'], + ai: { notemp: true }, + group: ["rebiaozhao2", "rebiaozhao3"], }, - rebiaozhao2:{ - trigger:{ - global:["loseAfter","cardsDiscardAfter","loseAsyncAfter",'equipAfter'], + rebiaozhao2: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], }, - forced:true, - audio:"biaozhao", - filter:function(event,player){ - var cards=player.getExpansions('rebiaozhao'),cards2=event.getd(); - if(!cards.length||!cards2.length) return false; - var num=get.number(cards[0]); - var cards=event.getd(); - for(var card of cards){ - if(get.number(card)==num) return true; + forced: true, + audio: "biaozhao", + filter: function (event, player) { + var cards = player.getExpansions("rebiaozhao"), + cards2 = event.getd(); + if (!cards.length || !cards2.length) return false; + var num = get.number(cards[0]); + var cards = event.getd(); + for (var card of cards) { + if (get.number(card) == num) return true; } return false; }, - content:function(){ - player.loseToDiscardpile(player.getExpansions('rebiaozhao')); + content: function () { + player.loseToDiscardpile(player.getExpansions("rebiaozhao")); player.loseHp(); }, }, - rebiaozhao3:{ - trigger:{ - player:"phaseZhunbeiBegin", + rebiaozhao3: { + trigger: { + player: "phaseZhunbeiBegin", }, - forced:true, - charlotte:true, - audio:"biaozhao", - filter:function(event,player){ - return player.getExpansions('rebiaozhao').length>0; + forced: true, + charlotte: true, + audio: "biaozhao", + filter: function (event, player) { + return player.getExpansions("rebiaozhao").length > 0; }, - content:function(){ - "step 0" - player.loseToDiscardpile(player.getExpansions('rebiaozhao')); - "step 1" - player.chooseTarget('令一名角色摸三张牌并回复1点体力',true).ai=function(target){ - var num=2; - if(target.isDamaged()) num++; - return num*get.attitude(_status.event.player,target); + content: function () { + "step 0"; + player.loseToDiscardpile(player.getExpansions("rebiaozhao")); + ("step 1"); + player.chooseTarget("令一名角色摸三张牌并回复1点体力", true).ai = function (target) { + var num = 2; + if (target.isDamaged()) num++; + return num * get.attitude(_status.event.player, target); }; - "step 2" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.draw(3); target.recover(); } }, }, - reqianxin:{ - audio:'xinfu_qianxin', - enable:'phaseUse', - usable:1, - filterCard:true, - selectCard:function(){ - return [1,Math.min(2,game.players.length-1)]; + reqianxin: { + audio: "xinfu_qianxin", + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: function () { + return [1, Math.min(2, game.players.length - 1)]; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - discard:false, - lose:false, - delay:false, - content:function(){ - var targets=game.filterPlayer(function(current){ - return current!=player; - }).randomGets(cards.length); - var map=[]; - for(var i=0;i0) return 0; - if(player.maxHp-player.countCards('h')>1) return 1; - return Math.random()>0.5?0:1; - }); - 'step 2' - if(result.index==0) source.draw(2); - else{ - player.addTempSkill('reqianxin3') - player.addMark('reqianxin3',2,false) + content: function () { + "step 0"; + var current = player.storage.reqianxin2.shift(); + event.source = current[1]; + if (!event.source.isIn() || !player.getCards("h").includes(current[0])) event.goto(3); + ("step 1"); + source.logSkill("reqianxin", player); + player + .chooseControl() + .set("choiceList", [ + "令" + get.translation(source) + "摸两张牌", + "令自己本回合的手牌上限-2", + ]) + .set("prompt", get.translation(source) + "发动了【遣信】,请选择一项") + .set("source", source) + .set("ai", function () { + var player = _status.event.player; + if (get.attitude(player, _status.event.source) > 0) return 0; + if (player.maxHp - player.countCards("h") > 1) return 1; + return Math.random() > 0.5 ? 0 : 1; + }); + ("step 2"); + if (result.index == 0) source.draw(2); + else { + player.addTempSkill("reqianxin3"); + player.addMark("reqianxin3", 2, false); } - 'step 3' - if(player.storage.reqianxin2.length) event.goto(0); - else player.removeSkill('reqianxin2'); + ("step 3"); + if (player.storage.reqianxin2.length) event.goto(0); + else player.removeSkill("reqianxin2"); }, }, - reqianxin3:{ - onremove:true, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('reqianxin3'); + reqianxin3: { + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("reqianxin3"); }, }, }, - renshi:{ - audio:2, - trigger:{player:'damageBegin4'}, - forced:true, - filter:function(event,player){ - return player.isDamaged()&&event.card&&event.card.name=='sha'; + renshi: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return player.isDamaged() && event.card && event.card.name == "sha"; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.cancel(); - if(trigger.cards){ - var cards=trigger.cards.filterInD(); - if(cards.length) player.gain(cards,'gain2','log'); + if (trigger.cards) { + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2", "log"); } - 'step 1' + ("step 1"); player.loseMaxHp(); }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.card&&arg.card.name=='sha') return true; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") return true; return false; }, }, }, - wuyuan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h','sha')>0; + wuyuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; }, - filterCard:{name:'sha'}, - filterTarget:lib.filter.notMe, - check:function(card){ - var player=_status.event.player; - if(get.color(card)=='red'&&game.hasPlayer(function(current){ - return current!=player&¤t.isDamaged()&&get.attitude(player,current)>2; - })) return 2; - if(get.natureList(card).length) return 1.5; + filterCard: { name: "sha" }, + filterTarget: lib.filter.notMe, + check: function (card) { + var player = _status.event.player; + if ( + get.color(card) == "red" && + game.hasPlayer(function (current) { + return ( + current != player && current.isDamaged() && get.attitude(player, current) > 2 + ); + }) + ) + return 2; + if (get.natureList(card).length) return 1.5; return 1; }, - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - player.give(cards,target,'give'); + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target, "give"); player.recover(); - 'step 1' - var num=1; - if(get.natureList(cards[0]).length) num++; + ("step 1"); + var num = 1; + if (get.natureList(cards[0]).length) num++; target.draw(num); - if(get.color(cards[0])=='red') target.recover(); + if (get.color(cards[0]) == "red") target.recover(); }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(player.isDamaged()) return 1; + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.isDamaged()) return 1; return 0; }, - target:function(player,target){ - if(ui.selected.cards.length){ - var num=1; - if(get.natureList(ui.selected.cards[0]).length) num++; - if(target.hasSkillTag('nogain')) num=0; - if(get.color(ui.selected.cards[0])=='red') return num+2 - else return num+1; + target: function (player, target) { + if (ui.selected.cards.length) { + var num = 1; + if (get.natureList(ui.selected.cards[0]).length) num++; + if (target.hasSkillTag("nogain")) num = 0; + if (get.color(ui.selected.cards[0]) == "red") return num + 2; + else return num + 1; } return 1; }, }, }, }, - huaizi:{ - mod:{ - maxHandcardBase:function(player,num){ + huaizi: { + mod: { + maxHandcardBase: function (player, num) { return player.maxHp; }, }, //audio:2, //trigger:{player:'phaseDiscardBegin'}, - forced:true, - firstDo:true, - filter:function(event,player){ - return player.isDamaged()&&player.countCards('h')>player.hp; + forced: true, + firstDo: true, + filter: function (event, player) { + return player.isDamaged() && player.countCards("h") > player.hp; }, - content:function(){}, + content: function () {}, }, - rexushen:{ - derivation:['new_rewusheng','redangxian'], - audio:'xinfu_xushen', - limited:true, - enable:'phaseUse', - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.hasSex('male'); - }) + rexushen: { + derivation: ["new_rewusheng", "redangxian"], + audio: "xinfu_xushen", + limited: true, + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hasSex("male"); + }); }, - skillAnimation:true, - animationColor:'fire', - content:function(){ - player.addSkill('rexushen2'); - player.awakenSkill('rexushen'); - player.loseHp(game.countPlayer(function(current){ - return current.hasSex('male'); - })); + skillAnimation: true, + animationColor: "fire", + content: function () { + player.addSkill("rexushen2"); + player.awakenSkill("rexushen"); + player.loseHp( + game.countPlayer(function (current) { + return current.hasSex("male"); + }) + ); }, - ai:{ - order:10, - result:{ - player:function(player){ - if(player.hp!=game.countPlayer(function(current){ - return current.hasSex('male'); - })) return 0; - return game.hasPlayer(function(current){ - return get.attitude(player,current)>4&¤t.countCards('h','tao') - })?1:0; + ai: { + order: 10, + result: { + player: function (player) { + if ( + player.hp != + game.countPlayer(function (current) { + return current.hasSex("male"); + }) + ) + return 0; + return game.hasPlayer(function (current) { + return get.attitude(player, current) > 4 && current.countCards("h", "tao"); + }) + ? 1 + : 0; }, }, }, }, - rexushen2:{ - charlotte:true, - subSkill:{ - count:{ - trigger:{ - player:"recoverBegin", + rexushen2: { + charlotte: true, + subSkill: { + count: { + trigger: { + player: "recoverBegin", }, - forced:true, - silent:true, - popup:false, - filter:function(event,player){ - if(!event.source) return false; - if(!player.isDying()) return false; - var evt=event.getParent('dying').getParent(2); - return evt.name=='rexushen'&&evt.player==player; + forced: true, + silent: true, + popup: false, + filter: function (event, player) { + if (!event.source) return false; + if (!player.isDying()) return false; + var evt = event.getParent("dying").getParent(2); + return evt.name == "rexushen" && evt.player == player; }, - content:function(){ - trigger.rexushen=true; + content: function () { + trigger.rexushen = true; }, - sub:true, + sub: true, }, }, - group:["rexushen2_count"], - trigger:{ - player:"recoverAfter", + group: ["rexushen2_count"], + trigger: { + player: "recoverAfter", }, - filter:function(event,player){ - if(player.isDying()) return false; - return event.rexushen==true; + filter: function (event, player) { + if (player.isDying()) return false; + return event.rexushen == true; }, - direct:true, - silent:true, - popup:false, - content:function(){ - 'step 0' - player.removeSkill('rexushen2'); - player.chooseBool('是否令'+get.translation(trigger.source)+'获得技能〖武圣〗和〖当先〗').ai=function(){ - return get.attitude(player,trigger.source)>0; + direct: true, + silent: true, + popup: false, + content: function () { + "step 0"; + player.removeSkill("rexushen2"); + player.chooseBool( + "是否令" + get.translation(trigger.source) + "获得技能〖武圣〗和〖当先〗" + ).ai = function () { + return get.attitude(player, trigger.source) > 0; }; - 'step 1' - if(result.bool){ - player.line(trigger.source,'fire'); - trigger.source.addSkills(['new_rewusheng','redangxian']); + ("step 1"); + if (result.bool) { + player.line(trigger.source, "fire"); + trigger.source.addSkills(["new_rewusheng", "redangxian"]); } }, }, - rezhennan:{ - audio:'xinfu_zhennan', - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return event.player!=player&&event.targets&&event.targets.length&&event.targets.length>event.player.hp; + rezhennan: { + audio: "xinfu_zhennan", + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return ( + event.player != player && + event.targets && + event.targets.length && + event.targets.length > event.player.hp + ); }, - direct:true, - content:function(){ - 'step 0' - var next=player.chooseToDiscard(get.prompt('rezhennan',trigger.player),'弃置一张牌并对其造成1点伤害','he'); - next.set('logSkill',['rezhennan',trigger.player]); - next.set('ai',function(card){ - var player=_status.event.player; - var target=_status.event.getTrigger().player; - if(get.damageEffect(target,player,player)>0) return 7-get.value(card); + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + get.prompt("rezhennan", trigger.player), + "弃置一张牌并对其造成1点伤害", + "he" + ); + next.set("logSkill", ["rezhennan", trigger.player]); + next.set("ai", function (card) { + var player = _status.event.player; + var target = _status.event.getTrigger().player; + if (get.damageEffect(target, player, player) > 0) return 7 - get.value(card); return -1; }); - 'step 1' - if(result.bool) trigger.player.damage(); + ("step 1"); + if (result.bool) trigger.player.damage(); }, }, - meiyong:{ - inherit:'xinfu_wuniang', - audio:'xinfu_wuniang', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('meiyong'),'获得一名其他角色的一张牌,然后其摸一张牌。',function(card,player,target){ - if(player==target) return false; - return target.countGainableCards(player,'he')>0; - }).set('ai',function(target){ - return 10-get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('meiyong',target); - player.gainPlayerCard(target,'he',true); - } - else event.finish(); - 'step 2' + meiyong: { + inherit: "xinfu_wuniang", + audio: "xinfu_wuniang", + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("meiyong"), + "获得一名其他角色的一张牌,然后其摸一张牌。", + function (card, player, target) { + if (player == target) return false; + return target.countGainableCards(player, "he") > 0; + } + ) + .set("ai", function (target) { + return 10 - get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("meiyong", target); + player.gainPlayerCard(target, "he", true); + } else event.finish(); + ("step 2"); target.draw(); }, }, - relianji:{ - audio:'wylianji', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.players.length>1; + relianji: { + audio: "wylianji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.players.length > 1; }, - filterTarget:lib.filter.notMe, - targetprompt:['打人','被打'], - selectTarget:2, - multitarget:true, - content:function(){ - 'step 0' + filterTarget: lib.filter.notMe, + targetprompt: ["打人", "被打"], + selectTarget: 2, + multitarget: true, + content: function () { + "step 0"; game.delay(0.5); - if(!targets[0].hasEquipableSlot(1)) event.goto(2); - 'step 1' - var target=targets[0]; - var equip1=get.cardPile2(function(card){ - return get.subtype(card)=='equip1'&&target.canUse(card,target); + if (!targets[0].hasEquipableSlot(1)) event.goto(2); + ("step 1"); + var target = targets[0]; + var equip1 = get.cardPile2(function (card) { + return get.subtype(card) == "equip1" && target.canUse(card, target); }); - if(!equip1){ - player.popup('连计失败'); - game.log('牌堆中无装备'); + if (!equip1) { + player.popup("连计失败"); + game.log("牌堆中无装备"); event.finish(); return; } - if(equip1.name=='qinggang'&&!lib.inpile.includes('qibaodao')){ + if (equip1.name == "qinggang" && !lib.inpile.includes("qibaodao")) { equip1.remove(); - equip1=game.createCard('qibaodao',equip1.suit,equip1.number); + equip1 = game.createCard("qibaodao", equip1.suit, equip1.number); } target.$draw(equip1); - target.chooseUseTarget(equip1,'noanimate','nopopup',true); - 'step 2' + target.chooseUseTarget(equip1, "noanimate", "nopopup", true); + ("step 2"); game.updateRoundNumber(); - var list=['nanman','wanjian','huogong','juedou','sha']; - var list2=game.players.slice(0); + var list = ["nanman", "wanjian", "huogong", "juedou", "sha"]; + var list2 = game.players.slice(0); list2.remove(player); - for(var i=0;i2; + forced: true, + filter: function (event, player) { + return player.storage.relianji && player.storage.relianji > 2; }, - audio:'moucheng', - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - player.awakenSkill('remoucheng'); - player.changeSkills(['jingong','relianji']); + audio: "moucheng", + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.awakenSkill("remoucheng"); + player.changeSkills(["jingong", "relianji"]); player.gainMaxHp(); player.recover(); }, }, - shouye:{ - audio:2, - group:'shouye_after', - trigger:{target:"useCardToTarget"}, - filter:function(event,player){ - return event.player!=player&&event.targets.length==1; + shouye: { + audio: 2, + group: "shouye_after", + trigger: { target: "useCardToTarget" }, + filter: function (event, player) { + return event.player != player && event.targets.length == 1; }, - check:function(event,player){ - if(event.player==game.me||event.player.isOnline()) return get.attitude(player,event.player)<0; - return get.effect(player,event.card,event.player,player)<0; + check: function (event, player) { + if (event.player == game.me || event.player.isOnline()) + return get.attitude(player, event.player) < 0; + return get.effect(player, event.card, event.player, player) < 0; }, - usable:1, - logTarget:'player', - content:function(){ - 'step 0' - player.line(trigger.player,'green'); + usable: 1, + logTarget: "player", + content: function () { + "step 0"; + player.line(trigger.player, "green"); player.chooseToDuiben(trigger.player); - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { trigger.targets.remove(player); trigger.getParent().triggeredTargets2.remove(player); - trigger.getParent().shouyeer=player; + trigger.getParent().shouyeer = player; } }, - subSkill:{ - after:{ - sub:true, - trigger:{global:'useCardAfter'}, - forced:true, - silent:true, - popup:false, - filter:function(event,player){ - if(event.shouyeer!=player) return false; - if(event.cards){ - for(var i=0;i0; - }).ai=function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe'},player,player); + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("liezhi"), + "弃置至多两名其他角色区域内的各一张牌", + [1, 2], + function (card, player, target) { + return target != player && target.countDiscardableCards(player, "hej") > 0; + } + ).ai = function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe" }, player, player); }; - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { result.targets.sortBySeat(); - event.targets=result.targets; - player.line(result.targets,'green'); - player.logSkill('liezhi',result.targets); - } - else event.finish(); - 'step 2' - event.current=targets.shift(); - player.discardPlayerCard(event.current,'hej',true) - if(targets.length) event.redo(); + event.targets = result.targets; + player.line(result.targets, "green"); + player.logSkill("liezhi", result.targets); + } else event.finish(); + ("step 2"); + event.current = targets.shift(); + player.discardPlayerCard(event.current, "hej", true); + if (targets.length) event.redo(); }, - subSkill:{ - disable:{ - sub:true, - trigger:{player:'phaseAfter'}, - forced:true, - silent:true, - popup:false, - charlotte:true, + subSkill: { + disable: { + sub: true, + trigger: { player: "phaseAfter" }, + forced: true, + silent: true, + popup: false, + charlotte: true, //filter:function(event){return !event.liezhi}, - content:function(){player.removeSkill('liezhi_disable')}, + content: function () { + player.removeSkill("liezhi_disable"); + }, }, - damage:{ - trigger:{player:'damage'}, - forced:true, - silent:true, - popup:false, - content:function(){player.addSkill('liezhi_disable')} + damage: { + trigger: { player: "damage" }, + forced: true, + silent: true, + popup: false, + content: function () { + player.addSkill("liezhi_disable"); + }, }, }, }, - xinzhanyi:{ - audio:'zhanyi', - enable:'phaseUse', - usable:1, - filterCard:true, - position:'he', - check:function(card){ - var player=_status.event.player; - if(player.hp<3) return 0; - var type=get.type(card,'trick'); - if(type=='trick'){ - return 6-get.value(card); - } - else if(type=='equip'){ - if(player.hasSha()&&game.hasPlayer(function(current){ - return (player.canUse('sha',current)&& - get.attitude(player,current)<0&& - get.effect(current,{name:'sha'},player,player)>0) - })){ - return 6-get.value(card); + xinzhanyi: { + audio: "zhanyi", + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + check: function (card) { + var player = _status.event.player; + if (player.hp < 3) return 0; + var type = get.type(card, "trick"); + if (type == "trick") { + return 6 - get.value(card); + } else if (type == "equip") { + if ( + player.hasSha() && + game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + get.attitude(player, current) < 0 && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) { + return 6 - get.value(card); } } return 0; }, - content:function(){ + content: function () { player.loseHp(); - switch(get.type(cards[0],'trick',cards[0].original=='h'?player:false)){ - case 'basic':player.addTempSkill('xinzhanyi_basic');player.addMark('xinzhanyi_basic1',1,false);break; - case 'equip':player.addTempSkill('xinzhanyi_equip');break; - case 'trick':player.addTempSkill('xinzhanyi_trick');player.draw(3);break; + switch (get.type(cards[0], "trick", cards[0].original == "h" ? player : false)) { + case "basic": + player.addTempSkill("xinzhanyi_basic"); + player.addMark("xinzhanyi_basic1", 1, false); + break; + case "equip": + player.addTempSkill("xinzhanyi_equip"); + break; + case "trick": + player.addTempSkill("xinzhanyi_trick"); + player.draw(3); + break; } }, - ai:{ - order:9.1, - result:{ - player:1 - } - } - }, - xinzhanyi_basic1:{ - trigger:{player:"useCard"}, - filter:function(event,player){ - return get.type(event.card,false)=='basic'&&player.hasMark('xinzhanyi_basic1'); - }, - forced:true, - silent:true, - popup:false, - content:function(){ - if(!trigger.baseDamage) trigger.baseDamage=1; - var num=player.countMark('xinzhanyi_basic1'); - trigger.baseDamage+=num; - player.removeMark('xinzhanyi_basic1',num,false); - game.log(trigger.card,'的伤害值/回复值','#y+'+num); + ai: { + order: 9.1, + result: { + player: 1, + }, }, }, - xinzhanyi_basic:{ - group:['xinzhanyi_basic1'], - onremove:function(p,s){ - delete p.storage[s+1]; + xinzhanyi_basic1: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return get.type(event.card, false) == "basic" && player.hasMark("xinzhanyi_basic1"); }, - hiddenCard:function(player,name){ - return get.type(name)=='basic'&&player.countCards('h',{type:'basic'})>0; + forced: true, + silent: true, + popup: false, + content: function () { + if (!trigger.baseDamage) trigger.baseDamage = 1; + var num = player.countMark("xinzhanyi_basic1"); + trigger.baseDamage += num; + player.removeMark("xinzhanyi_basic1", num, false); + game.log(trigger.card, "的伤害值/回复值", "#y+" + num); }, - enable:"chooseToUse", - filter:function(event,player){ - if(!player.hasCard(function(card){ - return get.type(card)=='basic'; - },'hs')) return false; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)) return true; + }, + xinzhanyi_basic: { + group: ["xinzhanyi_basic1"], + onremove: function (p, s) { + delete p.storage[s + 1]; + }, + hiddenCard: function (player, name) { + return get.type(name) == "basic" && player.countCards("h", { type: "basic" }) > 0; + }, + enable: "chooseToUse", + filter: function (event, player) { + if ( + !player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs") + ) + return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)) list.push(['基本','',name]); - if(name!='sha') continue; - for(var j of lib.inpile_nature){ - if(event.filterCard({name:name,nature:j},player,event)) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) + list.push(["基本", "", name]); + if (name != "sha") continue; + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: name, nature: j }, player, event)) + list.push(["基本", "", "sha", j]); } } - return ui.create.dialog('战意',[list,'vcard'],'hidden'); + return ui.create.dialog("战意", [list, "vcard"], "hidden"); }, - check:function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - if(game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ - switch(button.link[2]){ - case 'tao':return 5; - case 'jiu':{ - if(player.countCards('hs',{type:'basic'})>=2) return 3; - }; - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder'||button.link[3]=='ice') return 2.92; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": { + if (player.countCards("hs", { type: "basic" }) >= 2) return 3; + } + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") + return 2.92; else return 2.9; } } return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'zhanyi', - filterCard:function(card,player,target){ - return get.type(card)=='basic'; + audio: "zhanyi", + filterCard: function (card, player, target) { + return get.type(card) == "basic"; }, - check:function(card,player,target){ - return 9-get.value(card); + check: function (card, player, target) { + return 9 - get.value(card); }, - viewAs:{name:links[0][2],nature:links[0][3]}, - position:'hs', - popname:true, - } + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hs", + popname: true, + }; }, - prompt:function(links,player){ - return '将一张基本牌当做'+get.translation(links[0][3]||'')+get.translation(links[0][2])+'使用'; + prompt: function (links, player) { + return ( + "将一张基本牌当做" + + get.translation(links[0][3] || "") + + get.translation(links[0][2]) + + "使用" + ); }, }, - ai:{ - order:function(){ - var player=_status.event.player; - var event=_status.event; - if(event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0&&player.countCards('hs',{type:'basic'})>=2){ + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + if ( + event.filterCard({ name: "jiu" }, player, event) && + get.effect(player, { name: "jiu" }) > 0 && + player.countCards("hs", { type: "basic" }) >= 2 + ) { return 3.3; } return 3.1; }, - respondSha:true, - skillTagFilter:function(player,tag,arg){ - if(player.hasCard(function(card){ - return get.type(card)=='basic'; - },'hs')){ - if(tag=='respondSha'){ - if(arg!='use') return false; + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if ( + player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs") + ) { + if (tag == "respondSha") { + if (arg != "use") return false; } - } - else{ + } else { return false; } }, - result:{ - player:1, + result: { + player: 1, }, }, }, - xinzhanyi_equip:{ - audio:'zhanyi', - trigger:{player:'useCardToPlayered'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.countCards('he')>0&&event.targets.length==1; + xinzhanyi_equip: { + audio: "zhanyi", + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.target.countCards("he") > 0 && + event.targets.length == 1 + ); }, - check:function(event,player){ - return get.attitude(player,event.target)<0; + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + content: function () { + "step 0"; + trigger.target.chooseToDiscard("he", true, 2); + ("step 1"); + if (result.bool && result.cards && result.cards.length) { + if (result.cards.length == 1) { + event._result = { bool: true, links: result.cards.slice(0) }; + } else + player.chooseButton(["选择获得其中的一张牌", result.cards.slice(0)], true).ai = + function (button) { + return get.value(button.link); + }; + } else event.finish(); + ("step 2"); + if (result.links) player.gain(result.links, "gain2"); }, - content:function(){ - 'step 0' - trigger.target.chooseToDiscard('he',true,2); - 'step 1' - if(result.bool&&result.cards&&result.cards.length){ - if(result.cards.length==1){ - event._result={bool:true,links:result.cards.slice(0)}; - } - else player.chooseButton(['选择获得其中的一张牌',result.cards.slice(0)],true).ai=function(button){ - return get.value(button.link); - }; - } - else event.finish(); - 'step 2' - if(result.links) player.gain(result.links,'gain2'); - } }, - xinzhanyi_trick:{ - mod:{ - wuxieRespondable:function(){ + xinzhanyi_trick: { + mod: { + wuxieRespondable: function () { return false; - } - } + }, + }, }, - "xinfu_daigong":{ - usable:1, - audio:2, - trigger:{ - player:"damageBegin4", + xinfu_daigong: { + usable: 1, + audio: 2, + trigger: { + player: "damageBegin4", }, - filter:function(event,player){ - return event.source!=undefined&&player.countCards('h')>0; + filter: function (event, player) { + return event.source != undefined && player.countCards("h") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - 'step 1' - var cards=player.getCards('h'); - var suits=[]; - for(var i=0;i0) return 6.5-get.value(card); + trigger.source + .chooseCard( + "he", + "交给" + get.translation(player) + "一张满足条件的牌,否则防止此伤害。", + function (card) { + return !_status.event.suits.includes(get.suit(card)); + } + ) + .set("suits", suits).ai = function (card) { + var player = _status.event.player; + var target = _status.event.getParent("xinfu_daigong").player; + if (get.damageEffect(target, player, player) > 0) return 6.5 - get.value(card); return 0; }; - 'step 2' - if(result.bool){ - trigger.source.give(result.cards,player,true); - } - else trigger.cancel(); + ("step 2"); + if (result.bool) { + trigger.source.give(result.cards, player, true); + } else trigger.cancel(); }, }, - xinfu_zhaoxin:{ - group:["zhaoxin_give"], - intro:{ - content:'expansion', - markcount:'expansion', + xinfu_zhaoxin: { + group: ["zhaoxin_give"], + intro: { + content: "expansion", + markcount: "expansion", }, - enable:"phaseUse", - usable:1, - audio:2, - filter:function(event,player){ - return player.countCards('h')>0&&player.getExpansions('xinfu_zhaoxin').length<3; + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > 0 && player.getExpansions("xinfu_zhaoxin").length < 3; }, - filterCard:true, - selectCard:function(){ - var player=_status.event.player; - return [1,3-player.getExpansions('xinfu_zhaoxin').length]; + filterCard: true, + selectCard: function () { + var player = _status.event.player; + return [1, 3 - player.getExpansions("xinfu_zhaoxin").length]; }, - discard:false, - lose:false, - delay:false, - content:function(){ - player.addToExpansion(player,'give',cards).gaintag.add('xinfu_zhaoxin'); + discard: false, + lose: false, + delay: false, + content: function () { + player.addToExpansion(player, "give", cards).gaintag.add("xinfu_zhaoxin"); player.draw(cards.length); }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{ - order:1, - result:{ - player:1, + ai: { + order: 1, + result: { + player: 1, }, }, }, - zhaoxin_give:{ - trigger:{ - global:"phaseDrawAfter", + zhaoxin_give: { + trigger: { + global: "phaseDrawAfter", }, - filter:function(event,player){ - if(!player.getExpansions('xinfu_zhaoxin').length) return false; - return player==event.player||player.inRange(event.player); + filter: function (event, player) { + if (!player.getExpansions("xinfu_zhaoxin").length) return false; + return player == event.player || player.inRange(event.player); }, - direct:true, - content:function(){ - 'step 0' - player.chooseCardButton(get.prompt('xinfu_zhaoxin',trigger.player),player.getExpansions('xinfu_zhaoxin'),function(button){ - return true; - }).set('ai',function(button){ - return 1+Math.random(); - }); - 'step 1' - if(result.bool){ - event.card=result.links[0]; - player.logSkill('xinfu_zhaoxin',target); - player.line(trigger.player,'thunder'); + direct: true, + content: function () { + "step 0"; + player + .chooseCardButton( + get.prompt("xinfu_zhaoxin", trigger.player), + player.getExpansions("xinfu_zhaoxin"), + function (button) { + return true; + } + ) + .set("ai", function (button) { + return 1 + Math.random(); + }); + ("step 1"); + if (result.bool) { + event.card = result.links[0]; + player.logSkill("xinfu_zhaoxin", target); + player.line(trigger.player, "thunder"); player.showCards(event.card); - } - else event.finish(); - 'step 2' - trigger.player.chooseBool('是否获得'+get.translation(event.card)+'?').ai=function(){ - return get.attitude(trigger.player,player)>0; - }; - 'step 3' - if(result.bool){ - trigger.player.gain(event.card,'give',player,'bySelf'); - player.chooseBool('是否对'+get.translation(trigger.player)+'造成1点伤害?').ai=function(){ - return get.damageEffect(trigger.player,player,player)>0 + } else event.finish(); + ("step 2"); + trigger.player.chooseBool("是否获得" + get.translation(event.card) + "?").ai = + function () { + return get.attitude(trigger.player, player) > 0; }; - } - else{ - trigger.player.chat('拒绝'); + ("step 3"); + if (result.bool) { + trigger.player.gain(event.card, "give", player, "bySelf"); + player.chooseBool("是否对" + get.translation(trigger.player) + "造成1点伤害?").ai = + function () { + return get.damageEffect(trigger.player, player, player) > 0; + }; + } else { + trigger.player.chat("拒绝"); event.finish(); } - 'step 4' - if(result.bool){ - trigger.player.damage('nocard'); + ("step 4"); + if (result.bool) { + trigger.player.damage("nocard"); } }, }, - "xinfu_qianchong":{ - audio:3, - group:["qc_weimu","qc_mingzhe"], - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - mod:{ - cardUsable:function(card,player){ - var type=get.type2(card); - if(player.getStorage('xinfu_qianchong_effect').includes(type)) return Infinity; + xinfu_qianchong: { + audio: 3, + group: ["qc_weimu", "qc_mingzhe"], + subSkill: { + effect: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player) { + var type = get.type2(card); + if (player.getStorage("xinfu_qianchong_effect").includes(type)) + return Infinity; }, - targetInRange:function(card,player){ - var type=get.type2(card); - if(player.getStorage('xinfu_qianchong_effect').includes(type)) return true; + targetInRange: function (card, player) { + var type = get.type2(card); + if (player.getStorage("xinfu_qianchong_effect").includes(type)) return true; }, }, }, }, - trigger:{ - player:"phaseUseBegin", + trigger: { + player: "phaseUseBegin", }, - direct:true, - filter:function(event,player){ - var es=player.getCards('e'); - if(!es.length) return true; - var col=get.color(es[0]); - for(var i=0;i1){ - player.chooseControl(list).set('ai',function(){ - return list[0]; - }).set('prompt',get.prompt('xinfu_qianchong')).set('prompt2','你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。'); - } - else event.finish(); - 'step 1' - if(result.control&&result.control!='cancel2'){ - player.logSkill('xinfu_qianchong'); - var type=result.control; - player.addTempSkill('xinfu_qianchong_effect'); - player.markAuto('xinfu_qianchong_effect',[type]); - var str=get.translation(type)+'牌'; - game.log(player,'声明了','#y'+str); - player.popup(str,'thunder'); + content: function () { + "step 0"; + var list = ["basic", "trick", "equip", "cancel2"]; + list.removeArray(player.getStorage("xinfu_qianchong_effect")); + if (list.length > 1) { + player + .chooseControl(list) + .set("ai", function () { + return list[0]; + }) + .set("prompt", get.prompt("xinfu_qianchong")) + .set( + "prompt2", + "你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。" + ); + } else event.finish(); + ("step 1"); + if (result.control && result.control != "cancel2") { + player.logSkill("xinfu_qianchong"); + var type = result.control; + player.addTempSkill("xinfu_qianchong_effect"); + player.markAuto("xinfu_qianchong_effect", [type]); + var str = get.translation(type) + "牌"; + game.log(player, "声明了", "#y" + str); + player.popup(str, "thunder"); } }, }, - "qc_weimu":{ - audio:"xinfu_qianchong", - mod:{ - targetEnabled:function(card,player,target){ - var bool=true; - var es=target.getCards('e'); - if(!es.length) bool=false; - for(var i=0;i0&&num<=player.hp + return num > 0 && num <= player.hp; }, - forced:true, - content:function(){ - 'step 0' - var num=0; - player.getHistory('lose',function(evt){ - var evt2=evt.getParent(); - if(evt2.name=='useCard'&&evt2.player==player&&get.type(evt2.card,null,false)=='equip') return; - if(evt.cards2) num+=evt.cards2.length; + forced: true, + content: function () { + "step 0"; + var num = 0; + player.getHistory("lose", function (evt) { + var evt2 = evt.getParent(); + if ( + evt2.name == "useCard" && + evt2.player == player && + get.type(evt2.card, null, false) == "equip" + ) + return; + if (evt.cards2) num += evt.cards2.length; }); - if(num>0){ + if (num > 0) { player.draw(num); } }, }, - "rw_bagua_skill":{ - inherit:"bagua_skill", - audio:true, - content:function(){ - "step 0" - player.judge('rewrite_bagua',function(card){return (get.suit(card)!='spade')?1.5:-0.5}).judge2=function(result){ + rw_bagua_skill: { + inherit: "bagua_skill", + audio: true, + content: function () { + "step 0"; + player.judge("rewrite_bagua", function (card) { + return get.suit(card) != "spade" ? 1.5 : -0.5; + }).judge2 = function (result) { return result.bool; }; - "step 1" - if(result.judge>0){ + ("step 1"); + if (result.judge > 0) { trigger.untrigger(); - trigger.set('responded',true); - trigger.result={bool:true,card:{name:'shan'}} + trigger.set("responded", true); + trigger.result = { bool: true, card: { name: "shan" } }; } }, }, - "rw_baiyin_skill":{ - inherit:"baiyin_skill", - audio:true, - subSkill:{ - lose:{ - audio:'rw_baiyin_skill', - forced:true, - charlotte:true, - equipSkill:true, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + rw_baiyin_skill: { + inherit: "baiyin_skill", + audio: true, + subSkill: { + lose: { + audio: "rw_baiyin_skill", + forced: true, + charlotte: true, + equipSkill: true, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:(event,player)=>{ - if(player.hasSkillTag('unequip2')) return false; - var evt=event.getl(player); - return evt&&evt.es.some(card=>card.name=='rewrite_baiyin') + filter: (event, player) => { + if (player.hasSkillTag("unequip2")) return false; + var evt = event.getl(player); + return evt && evt.es.some((card) => card.name == "rewrite_baiyin"); }, - content:function(){ - var evt=trigger.getl(player); - evt.es.forEach(card=>{ - if(card.name=='rewrite_baiyin'){ + content: function () { + var evt = trigger.getl(player); + evt.es.forEach((card) => { + if (card.name == "rewrite_baiyin") { player.recover(); player.draw(2); } - }) + }); }, }, }, }, - "rw_lanyinjia":{ - inherit:"lanyinjia", - audio:"lanyinjia", + rw_lanyinjia: { + inherit: "lanyinjia", + audio: "lanyinjia", }, - "rw_minguangkai_cancel":{ - inherit:"minguangkai_cancel", + rw_minguangkai_cancel: { + inherit: "minguangkai_cancel", }, - "rw_minguangkai_link":{ - inherit:"minguangkai_link", - trigger:{ - player:"linkBefore", + rw_minguangkai_link: { + inherit: "minguangkai_link", + trigger: { + player: "linkBefore", }, - forced:true, + forced: true, //priority:20, - filter:function(event,player){ + filter: function (event, player) { return !player.isLinked(); }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(['tiesuo','lulitongxin'].includes(card.name)){ - return 'zerotarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if (["tiesuo", "lulitongxin"].includes(card.name)) { + return "zerotarget"; } }, }, }, }, - "rw_renwang_skill":{ - inherit:"renwang_skill", - audio:true, - filter:function(event,player){ - if(player.hasSkillTag('unequip2')) return false; - if(event.player.hasSkillTag('unequip',false,{ - name:event.card?event.card.name:null, - target:player, - card:event.card - })) return false; - return (event.card.name=='sha'&&(get.suit(event.card)=='heart'||get.color(event.card)=='black')) + rw_renwang_skill: { + inherit: "renwang_skill", + audio: true, + filter: function (event, player) { + if (player.hasSkillTag("unequip2")) return false; + if ( + event.player.hasSkillTag("unequip", false, { + name: event.card ? event.card.name : null, + target: player, + card: event.card, + }) + ) + return false; + return ( + event.card.name == "sha" && + (get.suit(event.card) == "heart" || get.color(event.card) == "black") + ); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(typeof card!=='object'||target.hasSkillTag('unequip2')) return; - if(player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:player, - card:card - })||player.hasSkillTag('unequip_ai',false,{ - name:card?card.name:null, - target:player, - card:card - })) return; - if(card.name=='sha'&&['spade','club','heart'].includes(get.suit(card))) return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target) { + if (typeof card !== "object" || target.hasSkillTag("unequip2")) return; + if ( + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; + if (card.name == "sha" && ["spade", "club", "heart"].includes(get.suit(card))) + return "zeroplayertarget"; }, }, }, }, - "rw_tengjia1":{ - inherit:"tengjia1", - audio:true, + rw_tengjia1: { + inherit: "tengjia1", + audio: true, }, - "rw_tengjia2":{ - inherit:"tengjia2", - audio:true, + rw_tengjia2: { + inherit: "tengjia2", + audio: true, }, - "rw_tengjia3":{ - audio:"rw_tengjia1", - inherit:"rw_minguangkai_link", - ai:{ - effect:{ - target:function(card,player,target,current){ - if(['tiesuo','lulitongxin'].includes(card.name)){ - return 'zeroplayertarget'; + rw_tengjia3: { + audio: "rw_tengjia1", + inherit: "rw_minguangkai_link", + ai: { + effect: { + target: function (card, player, target, current) { + if (["tiesuo", "lulitongxin"].includes(card.name)) { + return "zeroplayertarget"; } }, }, }, }, - rw_tengjia4:{ - inherit:"tengjia3", - audio:"rw_tengjia1", + rw_tengjia4: { + inherit: "tengjia3", + audio: "rw_tengjia1", }, - xinfu_pingcai:{ - subSkill:{backup:{}}, - wolong_card:function(){ - 'step 0' - var ingame=game.hasPlayer(function(current){ - return ['sp_zhugeliang','re_sp_zhugeliang','ol_sp_zhugeliang','prp_zhugeliang'].includes(current.name)||['sp_zhugeliang','re_sp_zhugeliang','ol_sp_zhugeliang','prp_zhugeliang'].includes(current.name2); - })?true:false; - var prompt='请选择'; - prompt+=ingame?'至多两名':'一名'; - prompt+='角色,对其造成1点火焰伤害'; - var range=ingame?[1,2]:[1,1] - player.chooseTarget(prompt,range).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player,'fire'); + xinfu_pingcai: { + subSkill: { backup: {} }, + wolong_card: function () { + "step 0"; + var ingame = game.hasPlayer(function (current) { + return ( + [ + "sp_zhugeliang", + "re_sp_zhugeliang", + "ol_sp_zhugeliang", + "prp_zhugeliang", + ].includes(current.name) || + [ + "sp_zhugeliang", + "re_sp_zhugeliang", + "ol_sp_zhugeliang", + "prp_zhugeliang", + ].includes(current.name2) + ); + }) + ? true + : false; + var prompt = "请选择"; + prompt += ingame ? "至多两名" : "一名"; + prompt += "角色,对其造成1点火焰伤害"; + var range = ingame ? [1, 2] : [1, 1]; + player.chooseTarget(prompt, range).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "fire"); }); - 'step 1' - if(result.bool&&result.targets.length){ - player.line(result.targets,'fire'); + ("step 1"); + if (result.bool && result.targets.length) { + player.line(result.targets, "fire"); result.targets.sortBySeat(); - for(var i=0;itarget.canEquip(card)) + shuijing_card: function () { + "step 0"; + event.ingame = game.hasPlayer(function (current) { + return current.name == "simahui" || current.name2 == "simahui"; + }) + ? true + : false; + var prompt = "将一名角色装备区中的"; + prompt += event.ingame ? "一张牌" : "防具牌"; + prompt += "移动到另一名角色的装备区中"; + var next = player.chooseTarget(2, function (card, player, target) { + if (ui.selected.targets.length) { + if (!_status.event.ingame) { + var cards = ui.selected.targets[0].getEquips(2); + return cards.some((card) => target.canEquip(card)); } - var from=ui.selected.targets[0]; - if(target.isMin()) return false; - var es=from.getCards('e'); - for(var i=0;i0; + return target.countCards("e") > 0; } }); - next.set('ingame',event.ingame) - next.set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(ui.selected.targets.length==0){ - if(att<0){ - if(game.hasPlayer(function(current){ - if(get.attitude(player,current)>0){ - var es=target.getCards('e'); - for(var i=0;i 0) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (current.canEquip(es[i])) return true; + } + return false; } - return false; - } - })) return -att; + }) + ) + return -att; } return 0; } - if(att>0){ - var es=ui.selected.targets[0].getCards('e'); + if (att > 0) { + var es = ui.selected.targets[0].getCards("e"); var i; - for(i=0;i1; - })) return 1+Math.random(); + check: function (button) { + var name = button.link[2]; + var player = _status.event.player; + if (name == "xuanjian_card") { + if ( + game.hasPlayer(function (current) { + return ( + current.isDamaged() && + current.hp < 3 && + get.attitude(player, current) > 1 + ); + }) + ) + return 1 + Math.random(); else return 1; - } - else if(name=='wolong_card'){ - if(game.hasPlayer(function(current){ - return get.damageEffect(current,player,player,'fire')>0; - })) return 1.2+Math.random(); + } else if (name == "wolong_card") { + if ( + game.hasPlayer(function (current) { + return get.damageEffect(current, player, player, "fire") > 0; + }) + ) + return 1.2 + Math.random(); else return 0.5; - } - else return 0.6; + } else return 0.6; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'xinfu_pingcai', - filterCard:()=>false, - selectCard:-1, - takara:links[0][2], - content:lib.skill.xinfu_pingcai.contentx, - } + audio: "xinfu_pingcai", + filterCard: () => false, + selectCard: -1, + takara: links[0][2], + content: lib.skill.xinfu_pingcai.contentx, + }; }, }, - contentx:function(){ - "step 0" - event.pingcai_delayed=true; - var name=lib.skill.xinfu_pingcai_backup.takara; - event.cardname=name; - event.videoId=lib.status.videoId++; - if(player.isUnderControl()){ + contentx: function () { + "step 0"; + event.pingcai_delayed = true; + var name = lib.skill.xinfu_pingcai_backup.takara; + event.cardname = name; + event.videoId = lib.status.videoId++; + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ + var switchToAuto = function () { game.pause(); game.countChoose(); - event.timeout=setTimeout(function(){ - _status.imchoosing=false; - event._result={ - bool:true, + event.timeout = setTimeout(function () { + _status.imchoosing = false; + event._result = { + bool: true, }; game.resume(); - },9000); + }, 9000); }; - var createDialog=function(player,id,name){ - if(player==game.me) return; - var dialog=ui.create.dialog('forcebutton','hidden'); - var str=get.translation(player)+'正在擦拭宝物上的灰尘…'; - var canSkip=(!_status.connectMode); - if(canSkip) str+='
    (点击宝物可以跳过等待AI操作)'; - dialog.textPrompt=dialog.add('
    '+str+'
    '); - dialog.classList.add('fixed'); - dialog.classList.add('scroll1'); - dialog.classList.add('scroll2'); - dialog.classList.add('fullwidth'); - dialog.classList.add('fullheight'); - dialog.classList.add('noupdate'); - dialog.videoId=id; + var createDialog = function (player, id, name) { + if (player == game.me) return; + var dialog = ui.create.dialog("forcebutton", "hidden"); + var str = get.translation(player) + "正在擦拭宝物上的灰尘…"; + var canSkip = !_status.connectMode; + if (canSkip) str += "
    (点击宝物可以跳过等待AI操作)"; + dialog.textPrompt = dialog.add('
    ' + str + "
    "); + dialog.classList.add("fixed"); + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.classList.add("noupdate"); + dialog.videoId = id; - var canvas2=document.createElement('canvas'); - dialog.canvas_viewer=canvas2; + var canvas2 = document.createElement("canvas"); + dialog.canvas_viewer = canvas2; dialog.appendChild(canvas2); - canvas2.classList.add('grayscale'); - canvas2.style.position="absolute"; - canvas2.style.width='249px'; - canvas2.style.height='249px'; - canvas2.style['border-radius']='6px'; - canvas2.style.left="calc(50% - 125px)"; - canvas2.style.top="calc(50% - 125px)"; - canvas2.width=249; - canvas2.height=249; - canvas2.style.border='3px solid'; + canvas2.classList.add("grayscale"); + canvas2.style.position = "absolute"; + canvas2.style.width = "249px"; + canvas2.style.height = "249px"; + canvas2.style["border-radius"] = "6px"; + canvas2.style.left = "calc(50% - 125px)"; + canvas2.style.top = "calc(50% - 125px)"; + canvas2.width = 249; + canvas2.height = 249; + canvas2.style.border = "3px solid"; - var ctx2=canvas2.getContext('2d'); - var img=new Image(); - img.src=lib.assetURL+'image/card/'+name+'.png'; - img.onload=function(){ - ctx2.drawImage(this,0,0,this.width,this.height,0,0,canvas2.width,canvas2.height); - } - if(canSkip){ - var skip=function(){ - if(event.pingcai_delayed){ + var ctx2 = canvas2.getContext("2d"); + var img = new Image(); + img.src = lib.assetURL + "image/card/" + name + ".png"; + img.onload = function () { + ctx2.drawImage( + this, + 0, + 0, + this.width, + this.height, + 0, + 0, + canvas2.width, + canvas2.height + ); + }; + if (canSkip) { + var skip = function () { + if (event.pingcai_delayed) { delete event.pingcai_delayed; clearTimeout(event.timeout); - event._result={ - bool:true, + event._result = { + bool: true, }; game.resume(); - canvas2.removeEventListener(lib.config.touchscreen?'touchend':'click',skip); + canvas2.removeEventListener( + lib.config.touchscreen ? "touchend" : "click", + skip + ); } }; - canvas2.addEventListener(lib.config.touchscreen?'touchend':'click',skip); + canvas2.addEventListener(lib.config.touchscreen ? "touchend" : "click", skip); } dialog.open(); }; - var chooseButton=function(id,name){ - var event=_status.event; - _status.xinfu_pingcai_finished=false; + var chooseButton = function (id, name) { + var event = _status.event; + _status.xinfu_pingcai_finished = false; - var dialog=ui.create.dialog('forcebutton','hidden'); - dialog.textPrompt=dialog.add('
    擦拭掉宝物上的灰尘吧!
    '); - event.switchToAuto=function(){ - event._result={ - bool:_status.xinfu_pingcai_finished, + var dialog = ui.create.dialog("forcebutton", "hidden"); + dialog.textPrompt = dialog.add( + '
    擦拭掉宝物上的灰尘吧!
    ' + ); + event.switchToAuto = function () { + event._result = { + bool: _status.xinfu_pingcai_finished, }; game.resume(); - _status.imchoosing=false; - _status.xinfu_pingcai_finished=true; + _status.imchoosing = false; + _status.xinfu_pingcai_finished = true; }; - dialog.classList.add('fixed'); - dialog.classList.add('scroll1'); - dialog.classList.add('scroll2'); - dialog.classList.add('fullwidth'); - dialog.classList.add('fullheight'); - dialog.classList.add('noupdate'); - dialog.videoId=id; + dialog.classList.add("fixed"); + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + dialog.classList.add("noupdate"); + dialog.videoId = id; - var canvas=document.createElement('canvas'); - var canvas2=document.createElement('canvas'); + var canvas = document.createElement("canvas"); + var canvas2 = document.createElement("canvas"); dialog.appendChild(canvas2); dialog.appendChild(canvas); - canvas.style.position="absolute"; - canvas.style.width='249px'; - canvas.style.height='249px'; - canvas.style['border-radius']='6px'; - canvas.style.left="calc(50% - 125px)"; - canvas.style.top="calc(50% - 125px)"; - canvas.width=249; - canvas.height=249; - canvas.style.border='3px solid'; + canvas.style.position = "absolute"; + canvas.style.width = "249px"; + canvas.style.height = "249px"; + canvas.style["border-radius"] = "6px"; + canvas.style.left = "calc(50% - 125px)"; + canvas.style.top = "calc(50% - 125px)"; + canvas.width = 249; + canvas.height = 249; + canvas.style.border = "3px solid"; - canvas2.style.position="absolute"; - canvas2.style.width='249px'; - canvas2.style.height='249px'; - canvas2.style['border-radius']='6px'; - canvas2.style.left="calc(50% - 125px)"; - canvas2.style.top="calc(50% - 125px)"; - canvas2.width=249; - canvas2.height=249; - canvas2.style.border='3px solid'; + canvas2.style.position = "absolute"; + canvas2.style.width = "249px"; + canvas2.style.height = "249px"; + canvas2.style["border-radius"] = "6px"; + canvas2.style.left = "calc(50% - 125px)"; + canvas2.style.top = "calc(50% - 125px)"; + canvas2.width = 249; + canvas2.height = 249; + canvas2.style.border = "3px solid"; - var ctx=canvas.getContext('2d'); - var ctx2=canvas2.getContext('2d'); + var ctx = canvas.getContext("2d"); + var ctx2 = canvas2.getContext("2d"); - var img=new Image(); - img.src=lib.assetURL+'image/card/'+name+'.png'; - img.onload=function(){ - ctx2.drawImage(this,0,0,this.width,this.height,0,0,canvas2.width,canvas2.height); - } + var img = new Image(); + img.src = lib.assetURL + "image/card/" + name + ".png"; + img.onload = function () { + ctx2.drawImage( + this, + 0, + 0, + this.width, + this.height, + 0, + 0, + canvas2.width, + canvas2.height + ); + }; - ctx.fillStyle='lightgray'; - ctx.fillRect(0,0,canvas.width,canvas.height); + ctx.fillStyle = "lightgray"; + ctx.fillRect(0, 0, canvas.width, canvas.height); - canvas.onmousedown=function(ev){ + canvas.onmousedown = function (ev) { //if(_status.xinfu_pingcai_finished) return; - canvas.onmousemove=function(e){ - if(_status.xinfu_pingcai_finished) return; + canvas.onmousemove = function (e) { + if (_status.xinfu_pingcai_finished) return; ctx.beginPath(); - ctx.clearRect(e.offsetX-16,e.offsetY-16,32,32); - var data=ctx.getImageData(canvas.width*0.1,canvas.height*0.1,canvas.width*0.8,canvas.height*0.8).data; - var sum=0; - for(var i=3;i=(canvas.width*canvas.height)*0.6){ + if (sum >= canvas.width * canvas.height * 0.6) { //ctx.clearRect(0,0,canvas.width,canvas.height); - if(!_status.xinfu_pingcai_finished){ - _status.xinfu_pingcai_finished=true; + if (!_status.xinfu_pingcai_finished) { + _status.xinfu_pingcai_finished = true; event.switchToAuto(); } } - } - } - canvas.ontouchstart=function(ev){ + }; + }; + canvas.ontouchstart = function (ev) { //if(_status.xinfu_pingcai_finished) return; - canvas.ontouchmove=function(e){ - if(_status.xinfu_pingcai_finished) return; + canvas.ontouchmove = function (e) { + if (_status.xinfu_pingcai_finished) return; ctx.beginPath(); - var rect=canvas.getBoundingClientRect(); - var X=((e.touches[0].clientX-rect.left)/rect.width*canvas.width); - var Y=((e.touches[0].clientY-rect.top)/rect.height*canvas.height); - ctx.clearRect(X-16,Y-16,32,32); - var data=ctx.getImageData(canvas.width*0.1,canvas.height*0.1,canvas.width*0.8,canvas.height*0.8).data; - var sum=0; - for(var i=3;i=(canvas.width*canvas.height)*0.6){ - if(!_status.xinfu_pingcai_finished){ - _status.xinfu_pingcai_finished=true; + if (sum >= canvas.width * canvas.height * 0.6) { + if (!_status.xinfu_pingcai_finished) { + _status.xinfu_pingcai_finished = true; event.switchToAuto(); } } - } - } - canvas.onmouseup=function(ev){ - canvas.onmousemove=null; - } - canvas.ontouchend=function(ev){ - canvas.ontouchmove=null; - } + }; + }; + canvas.onmouseup = function (ev) { + canvas.onmousemove = null; + }; + canvas.ontouchend = function (ev) { + canvas.ontouchmove = null; + }; dialog.open(); @@ -15173,585 +18315,663 @@ game.import('character', function () { game.countChoose(); }; //event.switchToAuto=switchToAuto; - game.broadcastAll(createDialog,player,event.videoId,name); - if(event.isMine()){ - chooseButton(event.videoId,name); - } - else if(event.isOnline()){ - event.player.send(chooseButton,event.videoId,name); + game.broadcastAll(createDialog, player, event.videoId, name); + if (event.isMine()) { + chooseButton(event.videoId, name); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.videoId, name); event.player.wait(); game.pause(); - } - else{ + } else { switchToAuto(); } - "step 1" - var result=event.result||result; - if(!result) result={bool:false}; - event._result=result; - game.broadcastAll(function(id,result,player){ - _status.xinfu_pingcai_finished=true; - var dialog=get.idDialog(id); - if(dialog){ - dialog.textPrompt.innerHTML='
    '+(get.translation(player)+'擦拭宝物'+(result.bool?'成功!':'失败…'))+'
    '; - if(result.bool&&dialog.canvas_viewer) dialog.canvas_viewer.classList.remove('grayscale'); - } - if(!_status.connectMode) delete event.pingcai_delayed; - },event.videoId,result,player); + ("step 1"); + var result = event.result || result; + if (!result) result = { bool: false }; + event._result = result; + game.broadcastAll( + function (id, result, player) { + _status.xinfu_pingcai_finished = true; + var dialog = get.idDialog(id); + if (dialog) { + dialog.textPrompt.innerHTML = + '
    ' + + (get.translation(player) + + "擦拭宝物" + + (result.bool ? "成功!" : "失败…")) + + "
    "; + if (result.bool && dialog.canvas_viewer) + dialog.canvas_viewer.classList.remove("grayscale"); + } + if (!_status.connectMode) delete event.pingcai_delayed; + }, + event.videoId, + result, + player + ); game.delay(2.5); - "step 2" - game.broadcastAll('closeDialog',event.videoId); - if(result.bool){ - player.logSkill('pcaudio_'+event.cardname); - event.insert(lib.skill.xinfu_pingcai[event.cardname],{ - player:player, + ("step 2"); + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + player.logSkill("pcaudio_" + event.cardname); + event.insert(lib.skill.xinfu_pingcai[event.cardname], { + player: player, }); } }, - ai:{ - order:7, - fireAttack:true, - threaten:1.7, - result:{ - player:1, + ai: { + order: 7, + fireAttack: true, + threaten: 1.7, + result: { + player: 1, }, }, }, - "xinfu_pdgyingshi":{ - mod:{ - targetEnabled:function(card,player,target){ - if(get.type(card)=='delay'){ + xinfu_pdgyingshi: { + mod: { + targetEnabled: function (card, player, target) { + if (get.type(card) == "delay") { return false; } }, }, - trigger:{ - player:['phaseZhunbeiBefore','phaseJieshuBefore'], + trigger: { + player: ["phaseZhunbeiBefore", "phaseJieshuBefore"], }, - forced:true, - audio:2, - group:'xinfu_pdgyingshi2', - content:function(){ + forced: true, + audio: 2, + group: "xinfu_pdgyingshi2", + content: function () { trigger.cancel(); - game.log(player,'跳过了',event.triggername=='phaseZhunbeiBefore'?'准备阶段':'结束阶段'); + game.log( + player, + "跳过了", + event.triggername == "phaseZhunbeiBefore" ? "准备阶段" : "结束阶段" + ); }, }, - xinfu_pdgyingshi2:{ - popup:false, - trigger:{ - player:"phaseJudgeBefore", + xinfu_pdgyingshi2: { + popup: false, + trigger: { + player: "phaseJudgeBefore", }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.cancel(); - game.log(player,'跳过了判定阶段'); + game.log(player, "跳过了判定阶段"); }, }, - "pcaudio_wolong_card":{ - audio:true, + pcaudio_wolong_card: { + audio: true, }, - "pcaudio_fengchu_card":{ - audio:true, + pcaudio_fengchu_card: { + audio: true, }, - "pcaudio_shuijing_card":{ - audio:true, + pcaudio_shuijing_card: { + audio: true, }, - "pcaudio_xuanjian_card":{ - audio:true, + pcaudio_xuanjian_card: { + audio: true, }, - "yizan_use":{ - audio:'yizan_respond_shan', - intro:{ - content:"已发动过#次", + yizan_use: { + audio: "yizan_respond_shan", + intro: { + content: "已发动过#次", }, - enable:["chooseToUse","chooseToRespond"], - hiddenCard:function(player,name){ - if(get.type(name)!='basic') return false; - if(!player.storage.yizan&&player.countCards('hes')<2) return false; - return player.hasCard(function(card){ - return get.type(card)=='basic'; - },'hs'); + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + if (!player.storage.yizan && player.countCards("hes") < 2) return false; + return player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs"); }, - filter:function(event,player){ - if(!player.storage.yizan&&player.countCards('hes')<2) return false; - if(!player.hasCard(function(card){ - return get.type(card)=='basic'; - },'hs')) return false; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)) return true; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name,nature},'unsure'),player,event)) return true; + filter: function (event, player) { + if (!player.storage.yizan && player.countCards("hes") < 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hs") + ) + return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name, nature }, "unsure"), + player, + event + ) + ) + return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)){ - list.push(['基本','',name]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) { + list.push(["基本", "", name]); } - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name,nature},'unsure'),player,event)) list.push(['基本','','sha',nature]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name, nature }, "unsure"), + player, + event + ) + ) + list.push(["基本", "", "sha", nature]); } } } - return ui.create.dialog('翊赞',[list,'vcard'],'hidden'); + return ui.create.dialog("翊赞", [list, "vcard"], "hidden"); }, - check:function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - if(_status.event.getParent().type!='phase'||game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ - switch(button.link[2]){ - case 'tao':case 'shan':return 5; - case 'jiu':{ - if(player.storage.yizan&&player.countCards('hs',{type:'basic'})>2) return 3; - }; - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder'||button.link[3]=='ice') return 2.92; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + _status.event.getParent().type != "phase" || + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "tao": + case "shan": + return 5; + case "jiu": { + if ( + player.storage.yizan && + player.countCards("hs", { type: "basic" }) > 2 + ) + return 3; + } + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") + return 2.92; else return 2.9; } } return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'yizan_respond_shan', - filterCard:function(card,player,target){ - if(player.storage.yizan) return get.type(card)=='basic'; - else if(ui.selected.cards.length){ - if(get.type(ui.selected.cards[0])=='basic') return true; - return get.type(card)=='basic'; + audio: "yizan_respond_shan", + filterCard: function (card, player, target) { + if (player.storage.yizan) return get.type(card) == "basic"; + else if (ui.selected.cards.length) { + if (get.type(ui.selected.cards[0]) == "basic") return true; + return get.type(card) == "basic"; } return true; }, - complexCard:true, - selectCard:function(){ - var player=_status.event.player; - if(player.storage.yizan) return 1; + complexCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.storage.yizan) return 1; return 2; }, - check:function(card,player,target){ - if(!ui.selected.cards.length&&get.type(card)=='basic') return 6; - else return 6-get.value(card); + check: function (card, player, target) { + if (!ui.selected.cards.length && get.type(card) == "basic") return 6; + else return 6 - get.value(card); }, - viewAs:{name:links[0][2],nature:links[0][3]}, - position:'hes', - popname:true, - precontent:function(){ - player.addMark('yizan_use',1,false); + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hes", + popname: true, + precontent: function () { + player.addMark("yizan_use", 1, false); }, - } + }; }, - prompt:function(links,player){ - var str=player.storage.yizan?'一张基本牌':'两张牌(其中至少应有一张基本牌)'; - return '将'+str+'当做'+get.translation(links[0][3]||'')+get.translation(links[0][2])+'使用或打出'; + prompt: function (links, player) { + var str = player.storage.yizan ? "一张基本牌" : "两张牌(其中至少应有一张基本牌)"; + return ( + "将" + + str + + "当做" + + get.translation(links[0][3] || "") + + get.translation(links[0][2]) + + "使用或打出" + ); }, }, - ai:{ - order:function(){ - var player=_status.event.player; - var event=_status.event; - if(event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0&&player.storage.yizan&&player.countCards('hs',{type:'basic'})>2){ + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + if ( + event.filterCard({ name: "jiu" }, player, event) && + get.effect(player, { name: "jiu" }) > 0 && + player.storage.yizan && + player.countCards("hs", { type: "basic" }) > 2 + ) { return 3.3; } return 3.1; }, - skillTagFilter:function(player,tag,arg){ - if(tag=='fireAttack') return true; - if(!player.storage.yizan&&player.countCards('hes')<2) return false; - if(!player.hasCard(function(card){ - return get.type(card)=='basic'; - },'hes')){ + skillTagFilter: function (player, tag, arg) { + if (tag == "fireAttack") return true; + if (!player.storage.yizan && player.countCards("hes") < 2) return false; + if ( + !player.hasCard(function (card) { + return get.type(card) == "basic"; + }, "hes") + ) { return false; } }, - result:{ - player:1, + result: { + player: 1, }, - respondSha:true, - respondShan:true, - fireAttack:true, + respondSha: true, + respondShan: true, + fireAttack: true, }, }, - "yizan_respond_shan":{ - audio:2, + yizan_respond_shan: { + audio: 2, }, - "xinfu_longyuan":{ - audio:2, - forced:true, - unique:true, - juexingji:true, - trigger:{ - player:'phaseZhunbeiBegin', + xinfu_longyuan: { + audio: 2, + forced: true, + unique: true, + juexingji: true, + trigger: { + player: "phaseZhunbeiBegin", }, - skillAnimation:true, - animationColor:'orange', - filter:function(event,player){ - return player.countMark('yizan_use')>=3; + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.countMark("yizan_use") >= 3; }, - content:function(){ - player.awakenSkill('xinfu_longyuan'); - player.storage.yizan=true; + content: function () { + player.awakenSkill("xinfu_longyuan"); + player.storage.yizan = true; + }, + derivation: "yizan_rewrite", + ai: { + combo: "yizan_use", }, - derivation:'yizan_rewrite', - ai:{ - combo:'yizan_use' - } }, - xinfu_jingxie:{ - audio:2, - video:function(player,info){ - var l2=player.getCards(info[0]?'e':'h'),l1=info[1]; - for(var j=0;jget.subtype(card)=='equip2'&&player.canRecast(card), - filter:(event,player)=>{ - if(event.type!='dying') return false; - if(player!=event.dying) return false; - return player.hasCard(card=>lib.skill.xinfu_jingxie2.filterCard(card,player),'he'); + xinfu_jingxie2: { + prompt: "重铸一张防具牌,然后将体力回复至1点。", + audio: "xinfu_jingxie", + enable: "chooseToUse", + filterCard: (card, player) => get.subtype(card) == "equip2" && player.canRecast(card), + filter: (event, player) => { + if (event.type != "dying") return false; + if (player != event.dying) return false; + return player.hasCard((card) => lib.skill.xinfu_jingxie2.filterCard(card, player), "he"); }, - position:"he", - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' + position: "he", + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; player.recast(cards); - 'step 1' - var num=1-player.hp; - if(num) player.recover(num); + ("step 1"); + var num = 1 - player.hp; + if (num) player.recover(num); }, - ai:{ - order:0.5, - skillTagFilter:function(player,arg,target){ - if(player!=target) return false; - return player.hasCard(card=>_status.connectMode&&get.position(card)=='h'||get.subtype(card)=='equip2'&&player.canRecast(card),'he'); + ai: { + order: 0.5, + skillTagFilter: function (player, arg, target) { + if (player != target) return false; + return player.hasCard( + (card) => + (_status.connectMode && get.position(card) == "h") || + (get.subtype(card) == "equip2" && player.canRecast(card)), + "he" + ); }, - save:true, - result:{ - player:function(player){ + save: true, + result: { + player: function (player) { return 10; }, }, }, }, - "xinfu_qiaosi":{ - enable:"phaseUse", - usable:1, - content:function(){ - 'step 0' - if(get.isLuckyStar(player)){ - event.num=6; + xinfu_qiaosi: { + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; + if (get.isLuckyStar(player)) { + event.num = 6; player.throwDice(6); - } - else player.throwDice(); - 'step 1' - event.cards=get.cards(event.num); + } else player.throwDice(); + ("step 1"); + event.cards = get.cards(event.num); player.showCards(event.cards); - 'step 2' - player.gain(event.cards,'gain2'); - player.chooseControl().set('choiceList',[ - '将'+get.cnNumber(event.num)+'张牌交给一名其他角色', - '弃置'+get.cnNumber(event.num)+'张牌', - ]).set('ai',function(){ - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>2; - })) return 0; - return 1; - }); - 'step 3' - if(result.index==0){ + ("step 2"); + player.gain(event.cards, "gain2"); + player + .chooseControl() + .set("choiceList", [ + "将" + get.cnNumber(event.num) + "张牌交给一名其他角色", + "弃置" + get.cnNumber(event.num) + "张牌", + ]) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 2; + }) + ) + return 0; + return 1; + }); + ("step 3"); + if (result.index == 0) { player.chooseCardTarget({ - position:'he', - filterCard:true, - selectCard:event.num, - filterTarget:function(card,player,target){ - return player!=target; + position: "he", + filterCard: true, + selectCard: event.num, + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ + ai1: function (card) { return 1; }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); + ai2: function (target) { + var att = get.attitude(_status.event.player, target); return att; }, - prompt:'请选择要送人的卡牌', - forced:true, + prompt: "请选择要送人的卡牌", + forced: true, }); - } - else{ - player.chooseToDiscard(event.num,true,'he'); + } else { + player.chooseToDiscard(event.num, true, "he"); event.finish(); } - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.give(result.cards,target); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.give(result.cards, target); } }, - ai:{ - order:7.5, - result:{ - player:1, + ai: { + order: 7.5, + result: { + player: 1, }, }, }, - zhaohuo:{ - audio:2, - audioname:['re_taoqian'], - trigger:{global:'dying'}, - forced:true, + zhaohuo: { + audio: 2, + audioname: ["re_taoqian"], + trigger: { global: "dying" }, + forced: true, //priority:12, - filter:function(event,player){ - return event.player!=player&&player.maxHp>1; + filter: function (event, player) { + return event.player != player && player.maxHp > 1; }, - content:function(){ - 'step 0' - event.num=player.maxHp-1; - player.loseMaxHp(event.num,true); - 'step 1' + content: function () { + "step 0"; + event.num = player.maxHp - 1; + player.loseMaxHp(event.num, true); + ("step 1"); player.draw(event.num); - } + }, }, - yixiang:{ - audio:2, - audioname:['re_taoqian'], - trigger:{target:'useCardToTargeted'}, - frequent:true, - filter:function(event,player){ - if(event.player.hp<=player.hp) return false; + yixiang: { + audio: 2, + audioname: ["re_taoqian"], + trigger: { target: "useCardToTargeted" }, + frequent: true, + filter: function (event, player) { + if (event.player.hp <= player.hp) return false; //if(event.targets.length>1) return false; - var hs=player.getCards('h'); - var names=['sha','shan','tao','jiu','du']; - for(var i=0;iplayer.maxHp; + return game.hasPlayer(function (current) { + return current.maxHp > player.maxHp; }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('yirang'),function(card,player,target){ - return target.maxHp>player.maxHp; - }).set('ai',function(target){ - return (get.attitude(_status.event.player,target)-2)*target.maxHp; - }); - 'step 1' - if(result.bool){ - var cards=player.getCards('he',function(card){ - return get.type(card)!='basic'; + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yirang"), function (card, player, target) { + return target.maxHp > player.maxHp; + }) + .set("ai", function (target) { + return (get.attitude(_status.event.player, target) - 2) * target.maxHp; }); - var target=result.targets[0]; - var types=[]; - for(var i=0;i0; - }).ai=function(target){ - return -get.attitude(player,target); + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("shejian"), + "弃置一名其他角色的一张牌", + function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he") > 0; + } + ).ai = function (target) { + return -get.attitude(player, target); }; - 'step 1' - if(result.bool){ - player.logSkill('shejian',result.targets); - player.discardPlayerCard(result.targets[0],'he',true); - } - else{ + ("step 1"); + if (result.bool) { + player.logSkill("shejian", result.targets); + player.discardPlayerCard(result.targets[0], "he", true); + } else { event.finish(); } }, }, - shixin:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter:function(event){ - return event.hasNature('fire'); + shixin: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event) { + return event.hasNature("fire"); }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.cancel(); }, - ai:{ - nofire:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'fireDamage')) return 'zerotarget'; - } - } - } + ai: { + nofire: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "fireDamage")) return "zerotarget"; + }, + }, + }, }, - fenyin:{ - locked:false, - mod:{ - aiOrder:function(player,card,num){ - if(typeof card=='object'&&player==_status.currentPhase){ - var evt=player.getLastUsed(); - if(evt&&evt.card&&get.color(evt.card)!='none'&&get.color(card)!='none'&&get.color(evt.card)!=get.color(card)){ - return num+10; + fenyin: { + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object" && player == _status.currentPhase) { + var evt = player.getLastUsed(); + if ( + evt && + evt.card && + get.color(evt.card) != "none" && + get.color(card) != "none" && + get.color(evt.card) != get.color(card) + ) { + return num + 10; } } }, }, - audio:2, - trigger:{player:'useCard'}, - frequent:true, + audio: 2, + trigger: { player: "useCard" }, + frequent: true, //usable:3, - filter:function(event,player){ - if(_status.currentPhase!=player) return false; - var evt=player.getLastUsed(1); - if(!evt) return false; - var color1=get.color(evt.card); - var color2=get.color(event.card); - return color1&&color2&&color1!='none'&&color2!='none'&&color1!=color2; + filter: function (event, player) { + if (_status.currentPhase != player) return false; + var evt = player.getLastUsed(1); + if (!evt) return false; + var color1 = get.color(evt.card); + var color2 = get.color(event.card); + return color1 && color2 && color1 != "none" && color2 != "none" && color1 != color2; }, - content:function(){ + content: function () { player.draw(); }, - ai:{ - threaten:3, + ai: { + threaten: 3, }, }, - dujin:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - frequent:true, - preHidden:true, - filter:function(event,player){ + dujin: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + preHidden: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=1+Math.ceil(player.countCards('e')/2); - } - }, - yingjian:{ - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - audio:'qingyi', - content:function(){ - player.chooseUseTarget('###是否发动【影箭】?###视为使用一张没有距离限制的【杀】',{name:'sha'},false,'nodistance').logSkill='yingjian'; + content: function () { + trigger.num += 1 + Math.ceil(player.countCards("e") / 2); }, - ai:{ - threaten:function(player,target){ - return 1.6; - } - } }, - tunchu:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - frequent:true, - preHidden:true, - locked:false, - filter:function(event,player){ - if(event.numFixed||player.getExpansions('tunchu').length) return false; + yingjian: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + audio: "qingyi", + content: function () { + player.chooseUseTarget( + "###是否发动【影箭】?###视为使用一张没有距离限制的【杀】", + { name: "sha" }, + false, + "nodistance" + ).logSkill = "yingjian"; + }, + ai: { + threaten: function (player, target) { + return 1.6; + }, + }, + }, + tunchu: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + preHidden: true, + locked: false, + filter: function (event, player) { + if (event.numFixed || player.getExpansions("tunchu").length) return false; return true; }, - content:function(){ - trigger.num+=2; - player.addTempSkill('tunchu_choose','phaseDrawAfter'); + content: function () { + trigger.num += 2; + player.addTempSkill("tunchu_choose", "phaseDrawAfter"); }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - mod:{ - cardEnabled:function(card,player){ - if(player.getExpansions('tunchu').length&&card.name=='sha'){ + mod: { + cardEnabled: function (card, player) { + if (player.getExpansions("tunchu").length && card.name == "sha") { return false; } }, }, - subSkill:{ - choose:{ - trigger:{player:'phaseDrawEnd'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - 'step 0' - player.removeSkill('tunchu_choose'); - var nh=player.countCards('h'); - if(nh){ - player.chooseCard('h',[1,nh],'将任意张手牌置于你的武将牌上').set('ai',function(card){ - var player=_status.event.player; - var count=game.countPlayer(function(current){ - return get.attitude(player,current)>2&¤t.hp-current.countCards('h')>1; + subSkill: { + choose: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + player.removeSkill("tunchu_choose"); + var nh = player.countCards("h"); + if (nh) { + player + .chooseCard("h", [1, nh], "将任意张手牌置于你的武将牌上") + .set("ai", function (card) { + var player = _status.event.player; + var count = game.countPlayer(function (current) { + return ( + get.attitude(player, current) > 2 && + current.hp - current.countCards("h") > 1 + ); + }); + if (ui.selected.cards.length >= count) return -get.value(card); + return 5 - get.value(card); }); - if(ui.selected.cards.length>=count) return -get.value(card); - return 5-get.value(card); - }); - } - else{ + } else { event.finish(); } - 'step 1' - if(result.bool){ - player.addToExpansion(result.cards,player,'giveAuto').gaintag.add('tunchu'); + ("step 1"); + if (result.bool) { + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("tunchu"); } - } + }, }, - } - }, - shuliang:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.getExpansions('tunchu').length>0&&event.player.countCards('h')0); - player.chooseCardButton(get.prompt('shuliang',trigger.player),player.getExpansions('tunchu')).set('ai',function(){ - if(_status.event.goon) return 1; - return 0; - }).set('goon',goon); - 'step 1' - if(result.bool){ - player.logSkill('shuliang',trigger.player); + }, + shuliang: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.getExpansions("tunchu").length > 0 && + event.player.countCards("h") < event.player.hp && + event.player.isIn() + ); + }, + content: function () { + "step 0"; + var goon = get.attitude(player, trigger.player) > 0; + player + .chooseCardButton( + get.prompt("shuliang", trigger.player), + player.getExpansions("tunchu") + ) + .set("ai", function () { + if (_status.event.goon) return 1; + return 0; + }) + .set("goon", goon); + ("step 1"); + if (result.bool) { + player.logSkill("shuliang", trigger.player); player.loseToDiscardpile(result.links); trigger.player.draw(2); } }, - ai:{combo:'tunchu'}, + ai: { combo: "tunchu" }, }, - choulve:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he'); - }) + choulve: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); + }); }, - content:function(){ - 'step 0' - var str='令一名其他角色交给你一张牌'; - var history=player.getAllHistory('damage',function(evt){ - return evt.card&&evt.card.name&&lib.card[evt.card.name]; - }) - if(history.length) event.cardname=history[history.length-1].card.name; - if(event.cardname){ - str+='若其如此做,视为你使用【'+get.translation(event.cardname)+'】'; + content: function () { + "step 0"; + var str = "令一名其他角色交给你一张牌"; + var history = player.getAllHistory("damage", function (evt) { + return evt.card && evt.card.name && lib.card[evt.card.name]; + }); + if (history.length) event.cardname = history[history.length - 1].card.name; + if (event.cardname) { + str += "若其如此做,视为你使用【" + get.translation(event.cardname) + "】"; } - var goon=true; - if(event.cardname){ - goon=game.hasPlayer(function(current){ - return player.canUse(event.cardname,current)&&get.effect(current,{name:event.cardname},player,player)>0; + var goon = true; + if (event.cardname) { + goon = game.hasPlayer(function (current) { + return ( + player.canUse(event.cardname, current) && + get.effect(current, { name: event.cardname }, player, player) > 0 + ); }); } - player.chooseTarget(get.prompt('choulve'),str,function(card,player,target){ - return target!=player&&target.countCards('he'); - }).set('ai',function(target){ - if(!_status.event.goon) return 0; - var player=_status.event.player; - if(get.attitude(player,target)>=0&&get.attitude(target,player)>=0){ - return Math.sqrt(target.countCards('he')); - } - return 0; - }).set('goon',goon); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('choulve',target); - target.chooseCard('he','是否交给'+get.translation(player)+'一张牌?', - event.cardname?('若如此做,视为'+get.translation(player)+ - '使用【'+get.translation(event.cardname)+'】'):null).set('ai',function(card){ - if(_status.event.goon) return 7-get.value(card); + player + .chooseTarget(get.prompt("choulve"), str, function (card, player, target) { + return target != player && target.countCards("he"); + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var player = _status.event.player; + if (get.attitude(player, target) >= 0 && get.attitude(target, player) >= 0) { + return Math.sqrt(target.countCards("he")); + } return 0; - }).set('goon',get.attitude(target,player)>1); - event.target=target; - } - else{ + }) + .set("goon", goon); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("choulve", target); + target + .chooseCard( + "he", + "是否交给" + get.translation(player) + "一张牌?", + event.cardname + ? "若如此做,视为" + + get.translation(player) + + "使用【" + + get.translation(event.cardname) + + "】" + : null + ) + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) > 1); + event.target = target; + } else { event.finish(); } - 'step 2' - if(result.bool){ - event.target.give(result.cards,player); - if(event.cardname){ - player.chooseUseTarget(event.cardname,true,false); + ("step 2"); + if (result.bool) { + event.target.give(result.cards, player); + if (event.cardname) { + player.chooseUseTarget(event.cardname, true, false); } } }, }, - polu:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - if(!lib.inpile.includes('ly_piliche')) return true; - return !!get.cardPile(function(card){ - return card.name=='ly_piliche'; + polu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!lib.inpile.includes("ly_piliche")) return true; + return !!get.cardPile(function (card) { + return card.name == "ly_piliche"; }); }, - content:function(){ + content: function () { var card; - if(!lib.inpile.includes('ly_piliche')){ - card=game.createCard2('ly_piliche','diamond',1); - lib.inpile.push('ly_piliche'); - } - else card=get.cardPile(function(card){ - return card.name=='ly_piliche'; - }); - player.chooseUseTarget(card,true,'nopopup'); + if (!lib.inpile.includes("ly_piliche")) { + card = game.createCard2("ly_piliche", "diamond", 1); + lib.inpile.push("ly_piliche"); + } else + card = get.cardPile(function (card) { + return card.name == "ly_piliche"; + }); + player.chooseUseTarget(card, true, "nopopup"); }, - group:'polu_damage', - subSkill:{ - damage:{ - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - return !player.getEquips('ly_piliche').length; + group: "polu_damage", + subSkill: { + damage: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return !player.getEquips("ly_piliche").length; }, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; player.draw(); - 'step 2' - var card=get.cardPile2(function(card){ - return get.subtype(card,false)=='equip1'&&player.canUse(card,player); + ("step 2"); + var card = get.cardPile2(function (card) { + return get.subtype(card, false) == "equip1" && player.canUse(card, player); }); - if(card) player.chooseUseTarget(card,true,'nopopup'); - 'step 3' - if(event.count>0&&!player.getEquips('ly_piliche').length) event.goto(1); + if (card) player.chooseUseTarget(card, true, "nopopup"); + ("step 3"); + if (event.count > 0 && !player.getEquips("ly_piliche").length) event.goto(1); }, }, }, }, - ly_piliche:{ - trigger:{source:'damageSource'}, - check:function(event,player){ - return get.attitude(player,event.player)*get.value(event.player.getDiscardableCards(player,'e'),event.player)<=0; + ly_piliche: { + trigger: { source: "damageSource" }, + check: function (event, player) { + return ( + get.attitude(player, event.player) * + get.value(event.player.getDiscardableCards(player, "e"), event.player) <= + 0 + ); }, - filter:function(event,player){ - return player!=event.player&&event.player.countDiscardableCards(player,'e')>0; + filter: function (event, player) { + return player != event.player && event.player.countDiscardableCards(player, "e") > 0; + }, + logTarget: "player", + content: function () { + player.discardPlayerCard(trigger.player, "e", true, trigger.player.countCards("e")); }, - logTarget:'player', - content:function(){ - player.discardPlayerCard(trigger.player,'e',true,trigger.player.countCards('e')); - } }, - xinzhilve:{ - enable:'phaseUse', - audio:'zhilve', - usable:1, - chooseButton:{ - dialog:function(event,player){ - var list=[ - '移动场上的一张牌', - '摸一张牌并视为使用一张【杀】', - ]; - var choiceList=ui.create.dialog('知略:失去1点体力并...','forcebutton','hidden'); - choiceList.add([list.map((item,i)=>{ - return [i,item]; - }),'textbutton']); + xinzhilve: { + enable: "phaseUse", + audio: "zhilve", + usable: 1, + chooseButton: { + dialog: function (event, player) { + var list = ["移动场上的一张牌", "摸一张牌并视为使用一张【杀】"]; + var choiceList = ui.create.dialog("知略:失去1点体力并...", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ]); return choiceList; }, - filter:function(button,player){ - if(button.link==0) return player.canMoveCard(); - return player.hasUseTarget({name:'sha',isCard:true},false); + filter: function (button, player) { + if (button.link == 0) return player.canMoveCard(); + return player.hasUseTarget({ name: "sha", isCard: true }, false); }, - check:function(button){ + check: function (button) { return button.link; }, - backup:function(links){ - return lib.skill['xinzhilve_'+['move','use'][links[0]]]; + backup: function (links) { + return lib.skill["xinzhilve_" + ["move", "use"][links[0]]]; + }, + prompt: function () { + return "请选择【杀】的目标"; }, - prompt:function(){return '请选择【杀】的目标'}, }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'})+0.1; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; }, - result:{ - player:function(player){ - if(player.hp>2&&player.hasValueTarget({name:'sha'})) return 1; + result: { + player: function (player) { + if (player.hp > 2 && player.hasValueTarget({ name: "sha" })) return 1; return 0; }, }, }, }, - xinzhilve_move:{ - audio:'zhilve', - filterCard:function(){return false}, - selectCard:-1, - delay:false, - content:function(){ - 'step 0' - event.forceDie=true; - if(!player.canMoveCard(null,event.nojudge)){ + xinzhilve_move: { + audio: "zhilve", + filterCard: function () { + return false; + }, + selectCard: -1, + delay: false, + content: function () { + "step 0"; + event.forceDie = true; + if (!player.canMoveCard(null, event.nojudge)) { event.finish(); return; } - var next=player.chooseTarget(2,function(card,player,target){ - if(ui.selected.targets.length){ - var from=ui.selected.targets[0]; - var js=from.getCards('j'); - for(var i=0;i0; + } else { + var range = "ej"; + if (_status.event.nojudge) range = "e"; + return target.countCards(range) > 0; } }); - next.set('nojudge',event.nojudge||false); - next.set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - var sgnatt=get.sgn(att); - if(ui.selected.targets.length==0){ - if(att>0){ - if(!_status.event.nojudge&&target.countCards('j',function(card){ - return game.hasPlayer(function(current){ - return current.canAddJudge(card)&&get.attitude(player,current)<0; + next.set("nojudge", event.nojudge || false); + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var sgnatt = get.sgn(att); + if (ui.selected.targets.length == 0) { + if (att > 0) { + if ( + !_status.event.nojudge && + target.countCards("j", function (card) { + return game.hasPlayer(function (current) { + return ( + current.canAddJudge(card) && get.attitude(player, current) < 0 + ); + }); }) - })) return 14; - if(target.countCards('e',function(card){ - return get.value(card,target)<0&&game.hasPlayer(function(current){ - return current!=target&&get.attitude(player,current)<0&¤t.canEquip(card) - }); - })>0) return 9; - } - else if(att<0){ - if(game.hasPlayer(function(current){ - if(current!=target&&get.attitude(player,current)>0){ - var es=target.getCards('e'); - for(var i=0;i0&¤t.canEquip(es[i])&&get.value(es[i],current)>0) return true; + ) + return 14; + if ( + target.countCards("e", function (card) { + return ( + get.value(card, target) < 0 && + game.hasPlayer(function (current) { + return ( + current != target && + get.attitude(player, current) < 0 && + current.canEquip(card) + ); + }) + ); + }) > 0 + ) + return 9; + } else if (att < 0) { + if ( + game.hasPlayer(function (current) { + if (current != target && get.attitude(player, current) > 0) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if ( + get.value(es[i], target) > 0 && + current.canEquip(es[i]) && + get.value(es[i], current) > 0 + ) + return true; + } } - } - })){ + }) + ) { return -att; } } return 0; } - var es=ui.selected.targets[0].getCards('e'); + var es = ui.selected.targets[0].getCards("e"); var i; - var att2=get.sgn(get.attitude(player,ui.selected.targets[0])); - for(i=0;i0&&get.attitude(player,targets1)<0){ - if(get.position(button.link)=='j') return 12; - if(get.value(button.link,targets0)<0) return 10; - return 0; - } - else{ - if(get.position(button.link)=='j') return -10; - return get.equipValue(button.link); - } - },targets[0]).set('nojudge',event.nojudge||false).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ - var targets1=_status.event.targets1; - if(get.position(button.link)=='j'){ - if(_status.event.nojudge) return false; - return targets1.canAddJudge(button.link); - } - else{ - return targets1.canEquip(button.link); - } - }); - } - else{ + ("step 3"); + if (targets.length == 2) { + player + .choosePlayerCard( + "ej", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if ( + get.attitude(player, targets0) > 0 && + get.attitude(player, targets1) < 0 + ) { + if (get.position(button.link) == "j") return 12; + if (get.value(button.link, targets0) < 0) return 10; + return 0; + } else { + if (get.position(button.link) == "j") return -10; + return get.equipValue(button.link); + } + }, + targets[0] + ) + .set("nojudge", event.nojudge || false) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + if (get.position(button.link) == "j") { + if (_status.event.nojudge) return false; + return targets1.canAddJudge(button.link); + } else { + return targets1.canEquip(button.link); + } + }); + } else { event.finish(); } - 'step 4' - if(result.bool&&result.links.length){ + ("step 4"); + if (result.bool && result.links.length) { player.loseHp(); } - 'step 5' - if(result.bool&&result.links.length){ - var link=result.links[0]; - if(get.position(link)=='e'){ + ("step 5"); + if (result.bool && result.links.length) { + var link = result.links[0]; + if (get.position(link) == "e") { event.targets[1].equip(link); - } - else if(link.viewAs){ - event.targets[1].addJudge({name:link.viewAs},[link]); - } - else{ + } else if (link.viewAs) { + event.targets[1].addJudge({ name: link.viewAs }, [link]); + } else { event.targets[1].addJudge(link); } - event.targets[0].$give(link,event.targets[1]) - event.result.card=link; - event.result.position=get.position(link); + event.targets[0].$give(link, event.targets[1]); + event.result.card = link; + event.result.position = get.position(link); game.delay(); - player.addTempSkill('xinzhilve_mark'); - player.addMark('xinzhilve_mark',1,false); + player.addTempSkill("xinzhilve_mark"); + player.addMark("xinzhilve_mark", 1, false); } }, }, - xinzhilve_use:{ - audio:'zhilve', - filterCard:function(){return false}, - selectCard:-1, - filterTarget:function(card,player,target){ - return player.canUse({name:'sha',isCard:true},target,false); + xinzhilve_use: { + audio: "zhilve", + filterCard: function () { + return false; }, - content:function(){ + selectCard: -1, + filterTarget: function (card, player, target) { + return player.canUse({ name: "sha", isCard: true }, target, false); + }, + content: function () { player.loseHp(); player.draw(); - player.useCard({name:'sha',isCard:true},false,target).forceDie=true; - player.addTempSkill('xinzhilve_mark'); - player.addMark('xinzhilve_mark',1,false); + player.useCard({ name: "sha", isCard: true }, false, target).forceDie = true; + player.addTempSkill("xinzhilve_mark"); + player.addMark("xinzhilve_mark", 1, false); }, - ai:{ - result:{ - target:function(player,target){ - return get.effect(target,{name:'sha'},player,target); + ai: { + result: { + target: function (player, target) { + return get.effect(target, { name: "sha" }, player, target); }, }, }, }, - xinzhilve_mark:{ - intro:{content:'本回合手牌上限+#'}, - onremove:true, - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('xinzhilve_mark'); + xinzhilve_mark: { + intro: { content: "本回合手牌上限+#" }, + onremove: true, + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("xinzhilve_mark"); }, }, }, - xinxhzhiyan:{ - audio:'xhzhiyan', - enable:'phaseUse', - filter:function(event,player){ - return (!player.hasSkill('xinxhzhiyan_true')&&player.countCards('h')>player.hp)||(!player.hasSkill('xinxhzhiyan_false')&&player.countCards('h') player.hp) || + (!player.hasSkill("xinxhzhiyan_false") && player.countCards("h") < player.maxHp) + ); }, - filterCard:true, - selectCard:function(){ - var player=_status.event.player; - if(player.hasSkill('xinxhzhiyan_true')) return 0; - var num=Math.max(0,player.countCards('h')-player.hp); - if(ui.selected.cards.length||player.hasSkill('xinxhzhiyan_false')||player.countCards('h')>=player.maxHp) return [num,num]; - return [0,num] + filterCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.hasSkill("xinxhzhiyan_true")) return 0; + var num = Math.max(0, player.countCards("h") - player.hp); + if ( + ui.selected.cards.length || + player.hasSkill("xinxhzhiyan_false") || + player.countCards("h") >= player.maxHp + ) + return [num, num]; + return [0, num]; }, - filterTarget:lib.filter.notMe, - selectTarget:function(){ - if(ui.selected.cards.length) return [1,1]; - return [0,0]; + filterTarget: lib.filter.notMe, + selectTarget: function () { + if (ui.selected.cards.length) return [1, 1]; + return [0, 0]; }, - check:function(card){ - var player=_status.event.player; - var checkx=function(card){ - if(player.getUseValue(card,null,true)<=0&&game.hasPlayer(function(current){ - return current!=player&&get.value(card,current)>0&&get.attitude(player,current)>0; - })) return 2; + check: function (card) { + var player = _status.event.player; + var checkx = function (card) { + if ( + player.getUseValue(card, null, true) <= 0 && + game.hasPlayer(function (current) { + return ( + current != player && + get.value(card, current) > 0 && + get.attitude(player, current) > 0 + ); + }) + ) + return 2; return 1; - } - if(player.countCards('h',function(card){ - return checkx(card)>0; - })<(player.countCards('h')-player.hp)) return 0; + }; + if ( + player.countCards("h", function (card) { + return checkx(card) > 0; + }) < + player.countCards("h") - player.hp + ) + return 0; return checkx(card); }, - delay:false, - discard:false, - lose:false, - content:function(){ - var bool=(cards&&cards.length>0); - player.addTempSkill('xinxhzhiyan_'+bool,'phaseUseEnd'); - if(!bool){ - player.draw(player.maxHp-player.countCards('h')); - } - else{ - player.give(cards,target); + delay: false, + discard: false, + lose: false, + content: function () { + var bool = cards && cards.length > 0; + player.addTempSkill("xinxhzhiyan_" + bool, "phaseUseEnd"); + if (!bool) { + player.draw(player.maxHp - player.countCards("h")); + } else { + player.give(cards, target); } }, - ai:{ - order:function(obj,player){ - if(player.countCards('h')>player.hp) return 10; + ai: { + order: function (obj, player) { + if (player.countCards("h") > player.hp) return 10; return 0.5; }, - result:{ - player:function(player,target){ - if(!ui.selected.cards.length&&player.countCards('h')0) player.gainPlayerCard(trigger.player,'he',true); - trigger.player.unmarkSkill('weifeng2'); - } - else{ - game.countPlayer(function(current){ - if(current.storage.weifeng2) current.unmarkSkill('weifeng2'); - }); - player.removeSkill('weifeng3'); + content: function () { + if (trigger.name == "damage") { + player.logSkill("weifeng", trigger.player); + if (trigger.card && trigger.card.name == trigger.player.storage.weifeng2) + trigger.num++; + else if (trigger.player.countGainableCards(player, "he") > 0) + player.gainPlayerCard(trigger.player, "he", true); + trigger.player.unmarkSkill("weifeng2"); + } else { + game.countPlayer(function (current) { + if (current.storage.weifeng2) current.unmarkSkill("weifeng2"); + }); + player.removeSkill("weifeng3"); } }, }, - gnjinfan:{ - trigger:{player:'phaseDiscardBegin'}, - direct:true, - locked:false, - audio:2, - filter:function(event,player){ - var list=[]; - player.getCards('s',function(card){ - if(card.hasGaintag('gnjinfan')) list.add(get.suit(card)); + gnjinfan: { + trigger: { player: "phaseDiscardBegin" }, + direct: true, + locked: false, + audio: 2, + filter: function (event, player) { + var list = []; + player.getCards("s", function (card) { + if (card.hasGaintag("gnjinfan")) list.add(get.suit(card)); }); - if(list.length>=lib.suit.length) return false; - return player.countCards('h',function(card){ - return _status.connectMode||!list.includes(get.suit(card)); - })>0; + if (list.length >= lib.suit.length) return false; + return ( + player.countCards("h", function (card) { + return _status.connectMode || !list.includes(get.suit(card)); + }) > 0 + ); }, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('gnjinfan'),'将任意张手牌当做“铃”置于武将牌上',[1,function(){ - var list=[]; - var list2=[]; - player.getCards('s',function(card){ - if(card.hasGaintag('gnjinfan')) list.add(get.suit(card)); - }); - player.getCards('h',function(card){ - list2.add(get.suit(card)); - }); - list2.removeArray(list); - return Math.max(1,list2.length); - }()],function(card,player){ - return !player.countCards('s',function(cardx){ - return cardx.hasGaintag('gnjinfan')&&get.suit(cardx,false)==get.suit(card,player); - })&&!ui.selected.cards.filter(function(cardx){ - return get.suit(cardx,player)==get.suit(card,player); - }).length; - }).set('ai',function(card){ - var player=_status.event.player; - if(player.hasUseTarget(card)&&!player.hasValueTarget(card)) return 0; - if(['sha','shan','wuxie','caochuan'].includes(card.name)) return 2+Math.random(); - return 1+Math.random(); - }).set('complexCard',true); - 'step 1' - if(result.bool){ - player.logSkill('gnjinfan'); - game.log(player,'将',result.cards,'放到了武将牌上'); - player.loseToSpecial(result.cards,'gnjinfan').visible=true; - } - else event.finish(); - 'step 2' - player.markSkill('gnjinfan'); + content: function () { + "step 0"; + player + .chooseCard( + "h", + get.prompt("gnjinfan"), + "将任意张手牌当做“铃”置于武将牌上", + [ + 1, + (function () { + var list = []; + var list2 = []; + player.getCards("s", function (card) { + if (card.hasGaintag("gnjinfan")) list.add(get.suit(card)); + }); + player.getCards("h", function (card) { + list2.add(get.suit(card)); + }); + list2.removeArray(list); + return Math.max(1, list2.length); + })(), + ], + function (card, player) { + return ( + !player.countCards("s", function (cardx) { + return ( + cardx.hasGaintag("gnjinfan") && + get.suit(cardx, false) == get.suit(card, player) + ); + }) && + !ui.selected.cards.filter(function (cardx) { + return get.suit(cardx, player) == get.suit(card, player); + }).length + ); + } + ) + .set("ai", function (card) { + var player = _status.event.player; + if (player.hasUseTarget(card) && !player.hasValueTarget(card)) return 0; + if (["sha", "shan", "wuxie", "caochuan"].includes(card.name)) + return 2 + Math.random(); + return 1 + Math.random(); + }) + .set("complexCard", true); + ("step 1"); + if (result.bool) { + player.logSkill("gnjinfan"); + game.log(player, "将", result.cards, "放到了武将牌上"); + player.loseToSpecial(result.cards, "gnjinfan").visible = true; + } else event.finish(); + ("step 2"); + player.markSkill("gnjinfan"); }, - group:['gnjinfan_gain'], - marktext:'铃', - intro:{ - mark:function(dialog,storage,player){ - dialog.addAuto(player.getCards('s',function(card){ - return card.hasGaintag('gnjinfan'); - })); + group: ["gnjinfan_gain"], + marktext: "铃", + intro: { + mark: function (dialog, storage, player) { + dialog.addAuto( + player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); + }) + ); }, - markcount:function(storage,player){ - return player.getCards('s',function(card){ - return card.hasGaintag('gnjinfan'); + markcount: function (storage, player) { + return player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); }).length; }, - onunmark:function(storage,player){ - var cards=player.getCards('s',function(card){ - return card.hasGaintag('gnjinfan'); + onunmark: function (storage, player) { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); }); - if(cards.length){ - player.lose(cards,ui.discardPile); - player.$throw(cards,1000); - game.log(cards,'进入了弃牌堆'); + if (cards.length) { + player.lose(cards, ui.discardPile); + player.$throw(cards, 1000); + game.log(cards, "进入了弃牌堆"); } }, }, - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('gnjinfan')) return num+0.5; + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("gnjinfan")) return num + 0.5; }, }, }, - gnjinfan_gain:{ - audio:'gnjinfan', - trigger:{player:'loseAfter'}, - forced:true, - filter:function(event,player){ - if(!event.ss||!event.ss.length) return false; - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('gnjinfan')) return true; + gnjinfan_gain: { + audio: "gnjinfan", + trigger: { player: "loseAfter" }, + forced: true, + filter: function (event, player) { + if (!event.ss || !event.ss.length) return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("gnjinfan")) return true; return false; } }, - content:function(){ - 'step 0' - var cards=[]; - for(var i of trigger.ss){ - if(!trigger.gaintag_map[i.cardid]||!trigger.gaintag_map[i.cardid].includes('gnjinfan')) continue; - var suit=get.suit(i,false); - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&get.suit(card,false)==suit; + content: function () { + "step 0"; + var cards = []; + for (var i of trigger.ss) { + if ( + !trigger.gaintag_map[i.cardid] || + !trigger.gaintag_map[i.cardid].includes("gnjinfan") + ) + continue; + var suit = get.suit(i, false); + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.suit(card, false) == suit; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); - var num=player.getCards('s',function(card){ - return card.hasGaintag('gnjinfan'); + if (cards.length) player.gain(cards, "gain2"); + var num = player.getCards("s", function (card) { + return card.hasGaintag("gnjinfan"); }).length; - if(num) player.markSkill('gnjinfan'); - else player.unmarkSkill('gnjinfan'); - 'step 1' + if (num) player.markSkill("gnjinfan"); + else player.unmarkSkill("gnjinfan"); + ("step 1"); game.updateRoundNumber(); }, }, - gnsheque:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return event.player.isIn()&&event.player.countCards('e')>0&& - lib.filter.targetEnabled({name:'sha'},player,event.player)&&(player.hasSha()||_status.connectMode&&player.countCards('h')>0); + gnsheque: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return ( + event.player.isIn() && + event.player.countCards("e") > 0 && + lib.filter.targetEnabled({ name: "sha" }, player, event.player) && + (player.hasSha() || (_status.connectMode && player.countCards("h") > 0)) + ); }, - content:function(){ - player.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'射却:是否对'+get.translation(trigger.player)+'使用一张杀?').set('logSkill','gnsheque').set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',trigger.player).set('oncard',function(card){ - try{ - card.gnsheque_tag=true; - }catch(e){ - alert('发生了一个导致【射却】无法正常触发无视防具效果的错误。请关闭十周年UI/手杀ui等扩展以解决'); - } - }); + content: function () { + player + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "射却:是否对" + get.translation(trigger.player) + "使用一张杀?") + .set("logSkill", "gnsheque") + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.player) + .set("oncard", function (card) { + try { + card.gnsheque_tag = true; + } catch (e) { + alert( + "发生了一个导致【射却】无法正常触发无视防具效果的错误。请关闭十周年UI/手杀ui等扩展以解决" + ); + } + }); + }, + ai: { + unequip: true, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "unequip_ai") { + if (_status.event.getParent().name != "gnsheque") return false; + } else if (!arg || !arg.card || !arg.card.gnsheque_tag) return false; + }, }, - ai:{ - unequip:true, - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='unequip_ai'){ - if(_status.event.getParent().name!='gnsheque') return false; - } - else if(!arg||!arg.card||!arg.card.gnsheque_tag) return false; - }, - }, }, - _doublegroup_choice:{ - trigger:{ - global:'gameStart', - player:'enterGame', + _doublegroup_choice: { + trigger: { + global: "gameStart", + player: "enterGame", }, - forced:true, - charlotte:true, - firstDo:true, - popup:false, - filter:function(event,player){ - return get.mode()!='guozhan'&&get.is.double(player.name1)&&!player._groupChosen; + forced: true, + charlotte: true, + firstDo: true, + popup: false, + filter: function (event, player) { + return get.mode() != "guozhan" && get.is.double(player.name1) && !player._groupChosen; }, - content:function(){ - 'step 0' - player._groupChosen=true; - player.chooseControl(get.is.double(player.name1,true)).set('prompt','请选择你的势力'); - 'step 1' + content: function () { + "step 0"; + player._groupChosen = true; + player.chooseControl(get.is.double(player.name1, true)).set("prompt", "请选择你的势力"); + ("step 1"); player.changeGroup(result.control); }, }, }, - dynamicTranslate:{ - yizan_use:function(player){ - if(player.storage.yizan) return '你可以将一张基本牌当做任意基本牌使用或打出。'; - return '你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。'; + dynamicTranslate: { + yizan_use: function (player) { + if (player.storage.yizan) return "你可以将一张基本牌当做任意基本牌使用或打出。"; + return "你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。"; }, - miaojian:function(player){ + miaojian: function (player) { return [ - '出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。', - '出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。', - '出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。', - ][player.countMark('miaojian')]; + "出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。", + "出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。", + "出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。", + ][player.countMark("miaojian")]; }, - shhlianhua:function(player){ + shhlianhua: function (player) { return [ - '当你成为【杀】的目标后,你摸一张牌。', - '当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。', - '当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。', - ][player.countMark('shhlianhua')]; + "当你成为【杀】的目标后,你摸一张牌。", + "当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。", + "当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。", + ][player.countMark("shhlianhua")]; }, - spshidi:function(player){ - if(player.countMark('spshidi')%2==0) return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; + spshidi: function (player) { + if (player.countMark("spshidi") % 2 == 0) + return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; }, - mobilexingxue:function(player){ - return lib.translate[(player.storage.mobileyanzhu?'mobilexingxuex':'mobilexingxue')+'_info']; + mobilexingxue: function (player) { + return lib.translate[ + (player.storage.mobileyanzhu ? "mobilexingxuex" : "mobilexingxue") + "_info" + ]; }, - shoufa:function(player){ - const zhoufa=player.storage.zhoulin_zhoufa; - const nodoudizhu=(get.mode()=='doudizhu'?'':'与你距离大于/不大于2的'); - if(!zhoufa) return '当你受到伤害后/于一回合首次造成伤害后,你可以选择一名'+nodoudizhu+'角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。'; - let str='当你受到伤害后/于一回合首次造成伤害后,你可以选择一名'+nodoudizhu+'角色,'; - str+=[ - '令其受到1点无来源伤害', - '你随机获得其一张牌', - '你随机弃置其装备区的一张牌', - '令其摸一张牌', - ][['豹','鹰','熊','兔'].indexOf(zhoufa)]; - return str+'。'; + shoufa: function (player) { + const zhoufa = player.storage.zhoulin_zhoufa; + const nodoudizhu = get.mode() == "doudizhu" ? "" : "与你距离大于/不大于2的"; + if (!zhoufa) + return ( + "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名" + + nodoudizhu + + "角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。" + ); + let str = "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名" + nodoudizhu + "角色,"; + str += [ + "令其受到1点无来源伤害", + "你随机获得其一张牌", + "你随机弃置其装备区的一张牌", + "令其摸一张牌", + ][["豹", "鹰", "熊", "兔"].indexOf(zhoufa)]; + return str + "。"; }, - mbxuetu(player){ - const xuetu=player.storage.mbxuetu, status = player.countMark('mbxuetu_status'); + mbxuetu(player) { + const xuetu = player.storage.mbxuetu, + status = player.countMark("mbxuetu_status"); if (status === 0) { - if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; + if (!xuetu) + return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; return '转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。'; - } - else if (status === 1) { + } else if (status === 1) { return lib.translate.mbxuetu_achieve_info; - } - else { - if (!xuetu) return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; + } else { + if (!xuetu) + return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; return '转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。'; } }, - mbzuoyou(player){ + mbzuoyou(player) { const mbzuoyou = player.storage.mbzuoyou; - if (mbzuoyou) return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。' - return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。' - } + if (mbzuoyou) + return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。'; + return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。'; + }, }, - perfectPair:{ - simazhao:['simayi','jin_simayi','jin_wangyuanji'], - xugong:['yanbaihu'], + perfectPair: { + simazhao: ["simayi", "jin_simayi", "jin_wangyuanji"], + xugong: ["yanbaihu"], }, - characterReplace:{ - caochun:['caochun','old_caochun'], - majun:['majun','old_majun'], - zhanggong:['zhanggong','re_zhanggong'], - baosanniang:['xin_baosanniang','re_baosanniang','baosanniang'], - heqi:['re_heqi','heqi'], - weiwenzhugezhi:['weiwenzhugezhi','re_weiwenzhugezhi','jsrg_weiwenzhugezhi'], - xugong:['xugong','re_xugong','jsrg_xugong'], - liuzan:['re_liuzan','liuzan'], - sufei:['yj_sufei','sp_sufei','xf_sufei'], - jiakui:['jiakui','old_jiakui'], - shenpei:['shenpei','sp_shenpei'], - sunru:['dc_sunru','sunru'], - liuye:['dc_liuye','liuye'], - zhaotongzhaoguang:['dc_zhaotongzhaoguang','zhaotongzhaoguang'], - yangbiao:['yangbiao','dc_yangbiao','jsrg_yangbiao'], - qiaozhou:['yj_qiaozhou','qiaozhou'], - sunhanhua:['dc_sunhanhua','sunhanhua'], - zhoubuyi:['zhoubuyi','yj_zhoubuyi'], + characterReplace: { + caochun: ["caochun", "old_caochun"], + majun: ["majun", "old_majun"], + zhanggong: ["zhanggong", "re_zhanggong"], + baosanniang: ["xin_baosanniang", "re_baosanniang", "baosanniang"], + heqi: ["re_heqi", "heqi"], + weiwenzhugezhi: ["weiwenzhugezhi", "re_weiwenzhugezhi", "jsrg_weiwenzhugezhi"], + xugong: ["xugong", "re_xugong", "jsrg_xugong"], + liuzan: ["re_liuzan", "liuzan"], + sufei: ["yj_sufei", "sp_sufei", "xf_sufei"], + jiakui: ["jiakui", "old_jiakui"], + shenpei: ["shenpei", "sp_shenpei"], + sunru: ["dc_sunru", "sunru"], + liuye: ["dc_liuye", "liuye"], + zhaotongzhaoguang: ["dc_zhaotongzhaoguang", "zhaotongzhaoguang"], + yangbiao: ["yangbiao", "dc_yangbiao", "jsrg_yangbiao"], + qiaozhou: ["yj_qiaozhou", "qiaozhou"], + sunhanhua: ["dc_sunhanhua", "sunhanhua"], + zhoubuyi: ["zhoubuyi", "yj_zhoubuyi"], }, - translate:{ - liuzan:'手杀留赞', - liuzan_prefix:'手杀', - re_sp_zhugeliang:'手杀界卧龙', - re_sp_zhugeliang_prefix:'手杀界', - ly_piliche:'霹雳车', - ly_piliche_info:'当你对其他角色造成伤害后,你可以弃置其装备区内的所有牌。', - polu:'破橹', - polu_info:'锁定技,回合开始时,若【霹雳车】未加入游戏或在牌堆/弃牌堆内,则你使用之;当你受到1点伤害后,若你的装备区里没有【霹雳车】,则你摸一张牌并使用牌堆中的一张随机武器牌。', - choulve:'筹略', - choulve_info:'出牌阶段开始时,你可以令一名其他角色交给你一张牌,若其如此做,视为你使用上一张对你过造成伤害且不为延时锦囊牌的牌。', - tunchu:'屯储', - tunchu_info:'摸牌阶段,若你没有「粮」,你可以多摸两张牌。若如此做,摸牌阶段结束时,你可以将任意张手牌置于你的武将上,称为「粮」,只要你的武将牌上有「粮」,你便不能使用【杀】。', - shuliang:'输粮', - shuliang_info:'一名角色的结束阶段开始时,若其手牌数少于体力值,你可以移去一张「粮」,然后该角色摸两张牌。', - fenyin:'奋音', - yingjian:'影箭', - fenyin_info:'你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。', - yingjian_info:'准备阶段开始时,你可以视为使用一张无距离限制的【杀】。', - dujin:'独进', - dujin_info:'摸牌阶段,你可以多摸X+1张牌(X为你装备区里牌数的一半且向上取整)。', - shixin:'释衅', - shixin_info:'锁定技,当你受到火属性伤害时,你防止此伤害。', - zhaohuo:'招祸', - zhaohuo_info:'锁定技,当其他角色进入濒死状态时,你将体力上限调整为1点。若你的体力上限因此减少,则你摸X张牌。(X为你以此法减少的体力上限)', - yixiang:'义襄', - yixiang_info:'每名角色的回合限一次,当你成为一名角色使用牌的目标后,若该角色的体力值大于你的体力值,你可以随机获得牌堆里的一张你没有的基本牌。', - yirang:'揖让', - yirang_info:'出牌阶段开始时,你可以将所有非基本牌交给一名体力上限大于你的其他角色,然后调整体力上限至与该角色相同并回复X点体力(X为你以此法交给其的牌的类别数)。', - kuangcai:'狂才', - kuangcai_info:'出牌阶段开始时,你可以令你此阶段内的主动出牌时间变为5秒。若如此做,你于此阶段内使用牌没距离和次数限制,且每当你于此阶段内使用牌时,你摸一张牌且主动出牌时间-1秒。若主动出牌时间减至0,则你结束出牌阶段。', - shejian:'舌剑', - shejian_info:'弃牌阶段结束时,若你于此阶段弃置的所有牌花色均不相同,则你可以弃置一名其他角色的一张牌。', - "xinfu_daigong":"怠攻", - "xinfu_daigong_info":"每回合限一次。当你受到伤害时,你可以展示所有手牌,然后令伤害来源选择一项:交给你一张与你所有手牌花色均不相同的一张牌,或防止此伤害。", - "xinfu_zhaoxin":"昭心", - "xinfu_zhaoxin_info":"出牌阶段限一次,你可以将任意张手牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", - "zhaoxin_give":"昭心", - "zhaoxin_give_info":"", - "xinfu_qianchong":"谦冲", - "xinfu_qianchong_info":"锁定技,若你的装备区内有牌且:均为红色,则你视为拥有技能〖明哲〗。均为黑色,则你视为拥有技能〖帷幕〗。若均不满足,则出牌阶段开始时,你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。", - "qc_weimu":"帷幕", - "qc_weimu_info":"", - "qc_mingzhe":"明哲", - "qc_mingzhe_info":"", - "xinfu_shangjian":"尚俭", - "xinfu_shangjian_info":"锁定技。一名角色的结束阶段开始时,若你于此回合内不因使用装备牌而失去了X张或更少的牌,则你摸等量的牌(X为你的体力值)。", - "rw_bagua_skill":"先天八卦阵", - "rw_bagua_skill_info":"当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", - "rw_baiyin_skill":"照月狮子盔", - "rw_baiyin_skill_info":"锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", - "rw_lanyinjia":"精银甲", - "rw_lanyinjia_info":"你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", - "rw_minguangkai_cancel":"耀光铠", - "rw_minguangkai_cancel_info":"锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", - "rw_minguangkai_link":"耀光铠", - "rw_minguangkai_link_info":"锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", - "rw_renwang_skill":"仁王金刚盾", - "rw_renwang_skill_info":"黑色【杀】和红桃【杀】对你无效。", - "rw_tengjia1":"桐油百韧甲", - "rw_tengjia1_info":"锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - "rw_tengjia2":"桐油百韧甲", - "rw_tengjia2_info":"锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - "rw_tengjia3":"桐油百韧甲", - "rw_tengjia3_info":"锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - "rw_tengjia4":"桐油百韧甲", - "rewrite_bagua":"先天八卦阵", - "rewrite_bagua_info":"当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", - "rewrite_baiyin":"照月狮子盔", - "rewrite_baiyin_info":"锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", - "rewrite_lanyinjia":"精银甲", - "rewrite_lanyinjia_info":"你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", - "rewrite_minguangkai":"耀光铠", - "rewrite_minguangkai_info":"锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", - "rewrite_renwang":"仁王金刚盾", - "rewrite_renwang_info":"黑色【杀】和红桃【杀】对你无效。", - "rewrite_tengjia":"桐油百韧甲", - "rewrite_tengjia_info":"锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", - "rewrite_zhuge":"元戎精械弩", - "rewrite_zhuge_info":"锁定技,你于出牌阶段内使用【杀】无次数限制。", - rw_zhuge_skill:'诸葛连弩', - rw_zhuge_skill_info:'锁定技,你于出牌阶段内使用【杀】无次数限制。', - takaramono:"宝物", - "wolong_card":"卧龙", - "wolong_card_info":"对一名角色造成1点火焰伤害。若场上有存活的诸葛亮(火),则改为对至多两名角色各造成1点火焰伤害。", - "fengchu_card":"凤雏", - "fengchu_card_info":"横置至多三名角色。若场上有存活的庞统(火),则改为横置至多四名角色。", - "xuanjian_card":"玄剑", - "xuanjian_card_info":"令一名角色摸一张牌并回复1点体力。若场上有存活的徐庶(将/界),则改为令一名角色摸一张牌并回复1点体力,然后你摸一张牌。", - "shuijing_card":"水镜", - "shuijing_card_info":"将一名角色装备区内的防具牌移动到另一名角色对应区域。若场上有存活的司马徽,则改为将1名角色装备区内的1件装备移动到另1角色对应区域。", - "xinfu_pingcai":"评才", - "xinfu_pingcai_info":"出牌阶段限一次,你可以挑选一个宝物并擦拭掉其上面的灰尘。然后,你可以根据宝物类型执行对应的效果。", - "xinfu_pdgyingshi":"隐世", - "xinfu_pdgyingshi2":"隐世", - "xinfu_pdgyingshi_info":"锁定技,你始终跳过准备阶段,判定阶段,结束阶段。你不能被选择为延时锦囊牌的目标。", - "pcaudio_wolong_card":"卧龙", - "pcaudio_wolong_card_info":"", - "pcaudio_fengchu_card":"凤雏", - "pcaudio_fengchu_card_info":"", - "pcaudio_shuijing_card":"水镜", - "pcaudio_shuijing_card_info":"", - "pcaudio_xuanjian_card":"玄剑", - "pcaudio_xuanjian_card_info":"", - "yizan_respond_sha":"翊赞", - "yizan_respond_sha_info":"", - "yizan_use":"翊赞", - yizan_use_backup:'翊赞', - "yizan_use_info":"你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。", - "yizan_respond_shan":"翊赞", - "yizan_respond_shan_info":"", - "xinfu_longyuan":"龙渊", - "xinfu_longyuan_info":"觉醒技,准备阶段,若你本局游戏内发动过〖翊赞〗的次数大于等于3,则你修改〖翊赞〗。", - yizan_rewrite:'翊赞·改', - yizan_rewrite_info:'你可以将一张基本牌当做任意基本牌使用或打出。', - "yizan_count":"翊赞", - "yizan_count_info":"", - "xinfu_jingxie1":"精械", - "xinfu_jingxie1_info":"出牌阶段,你可以展示一张未强化过的【诸葛连弩】或标准包/军争包/SP包中的防具牌,然后对其进行强化。当你处于濒死状态时,你可以重铸一张防具牌,然后将体力回复至1点。", - "xinfu_jingxie2":"精械", - "xinfu_jingxie2_info":"", - "xinfu_qiaosi":"巧思", - "xinfu_qiaosi_info":"出牌阶段限一次,你可以投掷一枚六面骰子,亮出牌堆顶的X张牌并获得之。然后,你选择一项:1.交给一名其他角色X张牌。2.弃置X张牌。(X为骰子的点数)", - xin_xiahoudun:'手杀界夏侯惇', - xin_xiahoudun_prefix:'手杀界', - xinqingjian:'清俭', - xinqingjian2:'清俭', - xinqingjian_info:'每回合限一次。当你不因摸牌阶段的额定摸牌而得到牌后,你可以将任意张牌扣置于武将牌上。回合结束时,你将这些牌交给一名其他角色。若这些牌的数量大于1,你摸一张牌。', - zhangyì:'张翼', - jiakui:'贾逵', - zhiyi:'执义', - zhiyi_info:'锁定技,当你于一回合内使用或打出第一张基本牌时,你选择一项:1.摸一张牌。2.于此牌A(若此牌是因响应牌B而使用或打出的,则改为牌B)的使用或打出流程结算完成后,视为使用一张与此牌名称和属性相同的卡牌。', - rezhiyi:'执义', - rezhiyi_info:'锁定技,一名角色的结束阶段开始时,若你本回合内使用或打出过基本牌,则你选择一项:1.摸一张牌。2.视为使用一张你本回合内使用或打出过的基本牌。', - zhongzuo:'忠佐', - zhongzuo_info:'一名角色的结束阶段开始时,若你于此回合内造成或受到过伤害,则你可以令一名角色摸两张牌。若该角色已受伤,则你摸一张牌。', - wanlan:'挽澜', - wanlan_info:'限定技,当一名角色进入濒死状态时,你可以弃置所有手牌(无牌可不弃)。其回复体力至1点,然后你对当前回合角色造成1点伤害。', - re_jikang:'手杀嵇康', - re_jikang_prefix:'手杀', - shenpei:'审配', - re_wangyun:'手杀王允', - re_wangyun_prefix:'手杀', - relianji:'连计', - relianji_info:'出牌阶段限一次,你可以选择两名其他角色。第一名角色随机使用牌堆中的一张武器牌,然后这名角色视为对另一名角色随机使用一张下列的牌名的牌:【决斗】、【火攻】、【南蛮入侵】、【万箭齐发】或普【杀】。然后若此牌造成伤害,你获得X枚“连计”标记(X为此次扣减的体力值点数)。', - remoucheng:'谋逞', - remoucheng_info:'觉醒技,当一名角色因〖连计〗造成伤害后,若你拥有的“连计”标记数大于2,你加1点体力上限,回复1点体力,失去“连计”,获得“矜功”。', + translate: { + liuzan: "手杀留赞", + liuzan_prefix: "手杀", + re_sp_zhugeliang: "手杀界卧龙", + re_sp_zhugeliang_prefix: "手杀界", + ly_piliche: "霹雳车", + ly_piliche_info: "当你对其他角色造成伤害后,你可以弃置其装备区内的所有牌。", + polu: "破橹", + polu_info: + "锁定技,回合开始时,若【霹雳车】未加入游戏或在牌堆/弃牌堆内,则你使用之;当你受到1点伤害后,若你的装备区里没有【霹雳车】,则你摸一张牌并使用牌堆中的一张随机武器牌。", + choulve: "筹略", + choulve_info: + "出牌阶段开始时,你可以令一名其他角色交给你一张牌,若其如此做,视为你使用上一张对你过造成伤害且不为延时锦囊牌的牌。", + tunchu: "屯储", + tunchu_info: + "摸牌阶段,若你没有「粮」,你可以多摸两张牌。若如此做,摸牌阶段结束时,你可以将任意张手牌置于你的武将上,称为「粮」,只要你的武将牌上有「粮」,你便不能使用【杀】。", + shuliang: "输粮", + shuliang_info: + "一名角色的结束阶段开始时,若其手牌数少于体力值,你可以移去一张「粮」,然后该角色摸两张牌。", + fenyin: "奋音", + yingjian: "影箭", + fenyin_info: + "你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。", + yingjian_info: "准备阶段开始时,你可以视为使用一张无距离限制的【杀】。", + dujin: "独进", + dujin_info: "摸牌阶段,你可以多摸X+1张牌(X为你装备区里牌数的一半且向上取整)。", + shixin: "释衅", + shixin_info: "锁定技,当你受到火属性伤害时,你防止此伤害。", + zhaohuo: "招祸", + zhaohuo_info: + "锁定技,当其他角色进入濒死状态时,你将体力上限调整为1点。若你的体力上限因此减少,则你摸X张牌。(X为你以此法减少的体力上限)", + yixiang: "义襄", + yixiang_info: + "每名角色的回合限一次,当你成为一名角色使用牌的目标后,若该角色的体力值大于你的体力值,你可以随机获得牌堆里的一张你没有的基本牌。", + yirang: "揖让", + yirang_info: + "出牌阶段开始时,你可以将所有非基本牌交给一名体力上限大于你的其他角色,然后调整体力上限至与该角色相同并回复X点体力(X为你以此法交给其的牌的类别数)。", + kuangcai: "狂才", + kuangcai_info: + "出牌阶段开始时,你可以令你此阶段内的主动出牌时间变为5秒。若如此做,你于此阶段内使用牌没距离和次数限制,且每当你于此阶段内使用牌时,你摸一张牌且主动出牌时间-1秒。若主动出牌时间减至0,则你结束出牌阶段。", + shejian: "舌剑", + shejian_info: + "弃牌阶段结束时,若你于此阶段弃置的所有牌花色均不相同,则你可以弃置一名其他角色的一张牌。", + xinfu_daigong: "怠攻", + xinfu_daigong_info: + "每回合限一次。当你受到伤害时,你可以展示所有手牌,然后令伤害来源选择一项:交给你一张与你所有手牌花色均不相同的一张牌,或防止此伤害。", + xinfu_zhaoxin: "昭心", + xinfu_zhaoxin_info: + "出牌阶段限一次,你可以将任意张手牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", + zhaoxin_give: "昭心", + zhaoxin_give_info: "", + xinfu_qianchong: "谦冲", + xinfu_qianchong_info: + "锁定技,若你的装备区内有牌且:均为红色,则你视为拥有技能〖明哲〗。均为黑色,则你视为拥有技能〖帷幕〗。若均不满足,则出牌阶段开始时,你可以选择一种类别的牌,然后你本回合内使用该类别的牌时没有次数和距离限制。", + qc_weimu: "帷幕", + qc_weimu_info: "", + qc_mingzhe: "明哲", + qc_mingzhe_info: "", + xinfu_shangjian: "尚俭", + xinfu_shangjian_info: + "锁定技。一名角色的结束阶段开始时,若你于此回合内不因使用装备牌而失去了X张或更少的牌,则你摸等量的牌(X为你的体力值)。", + rw_bagua_skill: "先天八卦阵", + rw_bagua_skill_info: + "当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", + rw_baiyin_skill: "照月狮子盔", + rw_baiyin_skill_info: + "锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", + rw_lanyinjia: "精银甲", + rw_lanyinjia_info: "你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", + rw_minguangkai_cancel: "耀光铠", + rw_minguangkai_cancel_info: + "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", + rw_minguangkai_link: "耀光铠", + rw_minguangkai_link_info: + "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", + rw_renwang_skill: "仁王金刚盾", + rw_renwang_skill_info: "黑色【杀】和红桃【杀】对你无效。", + rw_tengjia1: "桐油百韧甲", + rw_tengjia1_info: + "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rw_tengjia2: "桐油百韧甲", + rw_tengjia2_info: + "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rw_tengjia3: "桐油百韧甲", + rw_tengjia3_info: + "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rw_tengjia4: "桐油百韧甲", + rewrite_bagua: "先天八卦阵", + rewrite_bagua_info: + "当你需要使用或打出一张【闪】时,你可以进行判定,若判定结果不为黑桃,视为你使用或打出了一张【闪】。", + rewrite_baiyin: "照月狮子盔", + rewrite_baiyin_info: + "锁定技,当你受到大于1的伤害时,你将伤害值改为1;当你失去装备区里的【照月狮子盔】时,你回复1点体力并摸两张牌。", + rewrite_lanyinjia: "精银甲", + rewrite_lanyinjia_info: "你可以将一张手牌当做【闪】使用或打出。锁定技,【精银甲】不会无效。", + rewrite_minguangkai: "耀光铠", + rewrite_minguangkai_info: + "锁定技,当你成为【火烧连营】、【火攻】或火【杀】的目标时,或即将被横置时,取消之。", + rewrite_renwang: "仁王金刚盾", + rewrite_renwang_info: "黑色【杀】和红桃【杀】对你无效。", + rewrite_tengjia: "桐油百韧甲", + rewrite_tengjia_info: + "锁定技,【南蛮入侵】、【万箭齐发】和普【杀】对你无效。当你受到火焰伤害时,此伤害+1。当你即将被横置时,取消之。", + rewrite_zhuge: "元戎精械弩", + rewrite_zhuge_info: "锁定技,你于出牌阶段内使用【杀】无次数限制。", + rw_zhuge_skill: "诸葛连弩", + rw_zhuge_skill_info: "锁定技,你于出牌阶段内使用【杀】无次数限制。", + takaramono: "宝物", + wolong_card: "卧龙", + wolong_card_info: + "对一名角色造成1点火焰伤害。若场上有存活的诸葛亮(火),则改为对至多两名角色各造成1点火焰伤害。", + fengchu_card: "凤雏", + fengchu_card_info: "横置至多三名角色。若场上有存活的庞统(火),则改为横置至多四名角色。", + xuanjian_card: "玄剑", + xuanjian_card_info: + "令一名角色摸一张牌并回复1点体力。若场上有存活的徐庶(将/界),则改为令一名角色摸一张牌并回复1点体力,然后你摸一张牌。", + shuijing_card: "水镜", + shuijing_card_info: + "将一名角色装备区内的防具牌移动到另一名角色对应区域。若场上有存活的司马徽,则改为将1名角色装备区内的1件装备移动到另1角色对应区域。", + xinfu_pingcai: "评才", + xinfu_pingcai_info: + "出牌阶段限一次,你可以挑选一个宝物并擦拭掉其上面的灰尘。然后,你可以根据宝物类型执行对应的效果。", + xinfu_pdgyingshi: "隐世", + xinfu_pdgyingshi2: "隐世", + xinfu_pdgyingshi_info: + "锁定技,你始终跳过准备阶段,判定阶段,结束阶段。你不能被选择为延时锦囊牌的目标。", + pcaudio_wolong_card: "卧龙", + pcaudio_wolong_card_info: "", + pcaudio_fengchu_card: "凤雏", + pcaudio_fengchu_card_info: "", + pcaudio_shuijing_card: "水镜", + pcaudio_shuijing_card_info: "", + pcaudio_xuanjian_card: "玄剑", + pcaudio_xuanjian_card_info: "", + yizan_respond_sha: "翊赞", + yizan_respond_sha_info: "", + yizan_use: "翊赞", + yizan_use_backup: "翊赞", + yizan_use_info: "你可以将两张牌(其中至少一张为基本牌)当做任意基本牌使用或打出。", + yizan_respond_shan: "翊赞", + yizan_respond_shan_info: "", + xinfu_longyuan: "龙渊", + xinfu_longyuan_info: + "觉醒技,准备阶段,若你本局游戏内发动过〖翊赞〗的次数大于等于3,则你修改〖翊赞〗。", + yizan_rewrite: "翊赞·改", + yizan_rewrite_info: "你可以将一张基本牌当做任意基本牌使用或打出。", + yizan_count: "翊赞", + yizan_count_info: "", + xinfu_jingxie1: "精械", + xinfu_jingxie1_info: + "出牌阶段,你可以展示一张未强化过的【诸葛连弩】或标准包/军争包/SP包中的防具牌,然后对其进行强化。当你处于濒死状态时,你可以重铸一张防具牌,然后将体力回复至1点。", + xinfu_jingxie2: "精械", + xinfu_jingxie2_info: "", + xinfu_qiaosi: "巧思", + xinfu_qiaosi_info: + "出牌阶段限一次,你可以投掷一枚六面骰子,亮出牌堆顶的X张牌并获得之。然后,你选择一项:1.交给一名其他角色X张牌。2.弃置X张牌。(X为骰子的点数)", + xin_xiahoudun: "手杀界夏侯惇", + xin_xiahoudun_prefix: "手杀界", + xinqingjian: "清俭", + xinqingjian2: "清俭", + xinqingjian_info: + "每回合限一次。当你不因摸牌阶段的额定摸牌而得到牌后,你可以将任意张牌扣置于武将牌上。回合结束时,你将这些牌交给一名其他角色。若这些牌的数量大于1,你摸一张牌。", + zhangyì: "张翼", + jiakui: "贾逵", + zhiyi: "执义", + zhiyi_info: + "锁定技,当你于一回合内使用或打出第一张基本牌时,你选择一项:1.摸一张牌。2.于此牌A(若此牌是因响应牌B而使用或打出的,则改为牌B)的使用或打出流程结算完成后,视为使用一张与此牌名称和属性相同的卡牌。", + rezhiyi: "执义", + rezhiyi_info: + "锁定技,一名角色的结束阶段开始时,若你本回合内使用或打出过基本牌,则你选择一项:1.摸一张牌。2.视为使用一张你本回合内使用或打出过的基本牌。", + zhongzuo: "忠佐", + zhongzuo_info: + "一名角色的结束阶段开始时,若你于此回合内造成或受到过伤害,则你可以令一名角色摸两张牌。若该角色已受伤,则你摸一张牌。", + wanlan: "挽澜", + wanlan_info: + "限定技,当一名角色进入濒死状态时,你可以弃置所有手牌(无牌可不弃)。其回复体力至1点,然后你对当前回合角色造成1点伤害。", + re_jikang: "手杀嵇康", + re_jikang_prefix: "手杀", + shenpei: "审配", + re_wangyun: "手杀王允", + re_wangyun_prefix: "手杀", + relianji: "连计", + relianji_info: + "出牌阶段限一次,你可以选择两名其他角色。第一名角色随机使用牌堆中的一张武器牌,然后这名角色视为对另一名角色随机使用一张下列的牌名的牌:【决斗】、【火攻】、【南蛮入侵】、【万箭齐发】或普【杀】。然后若此牌造成伤害,你获得X枚“连计”标记(X为此次扣减的体力值点数)。", + remoucheng: "谋逞", + remoucheng_info: + "觉醒技,当一名角色因〖连计〗造成伤害后,若你拥有的“连计”标记数大于2,你加1点体力上限,回复1点体力,失去“连计”,获得“矜功”。", - shouye:'守邺', - shouye_info:'每回合限一次。当其他角色使用牌指定你为唯一目标时,你可以与其进行【对策】。若你赢,则你取消此牌的目标,且你于此牌结算完成后获得其对应的所有实体牌。', - liezhi:'烈直', - liezhi_info:'准备阶段,你可以依次弃置至多两名其他角色区域内的各一张牌。若你受到过伤害,则〖烈直〗于你的下个回合无效。', + shouye: "守邺", + shouye_info: + "每回合限一次。当其他角色使用牌指定你为唯一目标时,你可以与其进行【对策】。若你赢,则你取消此牌的目标,且你于此牌结算完成后获得其对应的所有实体牌。", + liezhi: "烈直", + liezhi_info: + "准备阶段,你可以依次弃置至多两名其他角色区域内的各一张牌。若你受到过伤害,则〖烈直〗于你的下个回合无效。", - xinzhanyi:'战意', - xinzhanyi_info:'出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作杀、酒或桃使用,且你本回合第一次以此法使用的牌的回复值/伤害值+1;锦囊牌,摸三张牌且你使用的牌不能被【无懈可击】响应;装备牌,你使用【杀】指定唯一目标后,其弃置两张牌,然后你获得其中的一张。', - xinzhanyi_basic_backup:'战意', - xinzhanyi_basic:'战意', - xinzhanyi_equip:'战意', + xinzhanyi: "战意", + xinzhanyi_info: + "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作杀、酒或桃使用,且你本回合第一次以此法使用的牌的回复值/伤害值+1;锦囊牌,摸三张牌且你使用的牌不能被【无懈可击】响应;装备牌,你使用【杀】指定唯一目标后,其弃置两张牌,然后你获得其中的一张。", + xinzhanyi_basic_backup: "战意", + xinzhanyi_basic: "战意", + xinzhanyi_equip: "战意", - meiyong:'姝勇', - meiyong_info:'当你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后其摸一张牌。', - rexushen:'许身', - rexushen_info:'限定技,出牌阶段,你可以失去X点体力(X为场上男性角色的数量)。若你以此法进入了濒死状态,则当你因一名角色而脱离此濒死状态后,你可以令其获得技能〖武圣〗和〖当先〗。', - rezhennan:'镇南', - rezhennan_info:'当你成为其他角色使用的牌的目标后,若此牌的目标数大于该角色的体力值,则你可以弃置一张牌并对其造成1点伤害。', + meiyong: "姝勇", + meiyong_info: "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后其摸一张牌。", + rexushen: "许身", + rexushen_info: + "限定技,出牌阶段,你可以失去X点体力(X为场上男性角色的数量)。若你以此法进入了濒死状态,则当你因一名角色而脱离此濒死状态后,你可以令其获得技能〖武圣〗和〖当先〗。", + rezhennan: "镇南", + rezhennan_info: + "当你成为其他角色使用的牌的目标后,若此牌的目标数大于该角色的体力值,则你可以弃置一张牌并对其造成1点伤害。", - hujinding:'手杀胡金定', - hujinding_prefix:'手杀', - huaizi:'怀子', - huaizi_info:'锁定技,你的手牌上限为你的体力上限。', - renshi:'仁释', - renshi_info:'锁定技,当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并获得此【杀】对应的所有实体牌,然后减1点体力上限。', - wuyuan:'武缘', - wuyuan_info:'出牌阶段限一次,你可将一张【杀】交给一名其他角色,然后你回复1点体力,其摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。', + hujinding: "手杀胡金定", + hujinding_prefix: "手杀", + huaizi: "怀子", + huaizi_info: "锁定技,你的手牌上限为你的体力上限。", + renshi: "仁释", + renshi_info: + "锁定技,当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并获得此【杀】对应的所有实体牌,然后减1点体力上限。", + wuyuan: "武缘", + wuyuan_info: + "出牌阶段限一次,你可将一张【杀】交给一名其他角色,然后你回复1点体力,其摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。", - re_weiwenzhugezhi:'手杀卫温诸葛直', - re_weiwenzhugezhi_prefix:'手杀', - gz_re_xugong:'许贡', - re_xugong:'手杀许贡', - re_xugong_prefix:'手杀', - re_zhanggong:'手杀张恭', - re_zhanggong_prefix:'手杀', - reqianxin:'遣信', - reqianxin_info:'出牌阶段限一次,你可将至多两张手牌随机交给等量的其他角色,称为「信」。这些角色的准备阶段开始时,若其手牌中有「信」,则其选择一项:令你摸两张牌,本回合手牌上限-2。', - rebiaozhao:"表召", - "rebiaozhao_info":"结束阶段,你可以将一张牌置于武将牌上,称为「表」。当有一张与「表」点数相同的牌进入弃牌堆后,你将「表」置入弃牌堆并失去1点体力。准备阶段,若你的武将牌上有「表」,则你移去「表」并选择一名角色,该角色回复1点体力并摸三张牌。", - "rebiaozhao2":"表召", - "rebiaozhao2_info":"", - "rebiaozhao3":"表召", - "rebiaozhao3_info":"", - refuhai:'浮海', - refuhai_info:'出牌阶段限一次,你可令其他角色同时在「潮起」和「潮落」中选择一项,并依次展示这些角色的选项。若从你下家开始选择了相同选项的角色数目大于1,则你摸X张牌(X为连续相同结果的数量)。', - qiaosi:'巧思', - qiaosi_info:'出牌阶段限一次,你可以表演「大键角色图」并根据表演结果获得相应的牌。然后,你选择一项:1.弃置X张牌。2.将X张牌交给一名其他角色。(X为你以此法得到的牌数)', - qiaosi_map:'大键角色图', - qiaosi_map_info:'
  • 星野 梦美:锦囊牌*2
  • 能美 库特莉亚芙卡:装备牌/【杀】/【酒】*1
  • 友利 奈绪:【杀】/【酒】*1
  • 神尾 观铃:【闪】/【桃】*1
  • 伊吹 风子:锦囊牌/【闪】/【桃】*1
  • 仲村 由理:装备牌*2
  • Illustration:うら;Twitter:@ura530', - qiaosi_c1:' ', + re_weiwenzhugezhi: "手杀卫温诸葛直", + re_weiwenzhugezhi_prefix: "手杀", + gz_re_xugong: "许贡", + re_xugong: "手杀许贡", + re_xugong_prefix: "手杀", + re_zhanggong: "手杀张恭", + re_zhanggong_prefix: "手杀", + reqianxin: "遣信", + reqianxin_info: + "出牌阶段限一次,你可将至多两张手牌随机交给等量的其他角色,称为「信」。这些角色的准备阶段开始时,若其手牌中有「信」,则其选择一项:令你摸两张牌,本回合手牌上限-2。", + rebiaozhao: "表召", + rebiaozhao_info: + "结束阶段,你可以将一张牌置于武将牌上,称为「表」。当有一张与「表」点数相同的牌进入弃牌堆后,你将「表」置入弃牌堆并失去1点体力。准备阶段,若你的武将牌上有「表」,则你移去「表」并选择一名角色,该角色回复1点体力并摸三张牌。", + rebiaozhao2: "表召", + rebiaozhao2_info: "", + rebiaozhao3: "表召", + rebiaozhao3_info: "", + refuhai: "浮海", + refuhai_info: + "出牌阶段限一次,你可令其他角色同时在「潮起」和「潮落」中选择一项,并依次展示这些角色的选项。若从你下家开始选择了相同选项的角色数目大于1,则你摸X张牌(X为连续相同结果的数量)。", + qiaosi: "巧思", + qiaosi_info: + "出牌阶段限一次,你可以表演「大键角色图」并根据表演结果获得相应的牌。然后,你选择一项:1.弃置X张牌。2.将X张牌交给一名其他角色。(X为你以此法得到的牌数)", + qiaosi_map: "大键角色图", + qiaosi_map_info: + "
  • 星野 梦美:锦囊牌*2
  • 能美 库特莉亚芙卡:装备牌/【杀】/【酒】*1
  • 友利 奈绪:【杀】/【酒】*1
  • 神尾 观铃:【闪】/【桃】*1
  • 伊吹 风子:锦囊牌/【闪】/【桃】*1
  • 仲村 由理:装备牌*2
  • Illustration:うら;Twitter:@ura530", + qiaosi_c1: ' ', //星野 梦美 - qiaosi_c2:' ', + qiaosi_c2: ' ', //能美 库特莉亚芙卡 - qiaosi_c3:' ', + qiaosi_c3: ' ', //友利 奈绪 - qiaosi_c4:' ', + qiaosi_c4: ' ', //神尾 观铃 - qiaosi_c5:' ', + qiaosi_c5: ' ', //伊吹 风子 - qiaosi_c6:' ', + qiaosi_c6: ' ', //仲村 由理 - yangbiao:'手杀杨彪', - yangbiao_prefix:'手杀', - zhaohan:'昭汉', - zhaohan_info:'锁定技,你的第1-4个准备阶段开始时,你加1点体力上限并回复1点体力,你的第5-7个准备阶段开始时,你减1点体力上限。', - rangjie:'让节', - rangjie_info:'当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆里你选择的类型的一张牌,或移动场上的一张牌。', - yizheng:'义争', - yizheng2:'义争', - yizheng_info:'出牌阶段限一次,你可以和一名体力值不大于你的其他角色拼点。若你赢,其跳过下个摸牌阶段。若你没赢,你减1点体力上限。', - re_heqi:'手杀贺齐', - re_heqi_prefix:'手杀', - reqizhou:'绮胄', - reqizhou_info:'锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖英姿〗;2种或以上:〖奇袭〗;3种或以上:〖旋风〗。', - reshanxi:'闪袭', - reshanxi2:'闪袭', - reshanxi_info:'出牌阶段开始时,你可以弃置一张红色基本牌并选择一名有牌的其他角色,将其的至多X张牌置于其的武将牌上(X为你的体力值)。回合结束时,该角色获得这些牌。', - chendeng:'手杀陈登', - chendeng_prefix:'手杀', - zhouxuan:'周旋', - zhouxuan2:'周旋', - zhouxuan_info:'出牌阶段限一次,你可以弃置一张牌并指定一名角色,然后选择一个基本牌的名称或非基本牌的类型。其使用或打出下一张牌时,若此牌的名称或类型和你选择的相同,则你观看牌堆顶的三张牌,然后将这些牌以任意分割方式交给任意名角色。', - fengji:'丰积', - fengji_info:'锁定技,回合结束时,你记录你的手牌数。准备阶段开始时,若你的手牌数不小于你记录的手牌数,则你摸两张牌且本回合手牌上限为体力上限。', - re_guanqiujian:'手杀毌丘俭', - re_guanqiujian_prefix:'手杀', - rezhengrong:'征荣', - rehongju:'鸿举', - reqingce:'清侧', - reqingce_backup:'清侧', - rezhengrong_info:'当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你可以将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。', - rehongju_info:'觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3且有角色死亡,则你摸等同于「荣」数量的牌。然后可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。', - reqingce_info:'出牌阶段,你可以将一张「荣」置入弃牌堆,然后弃置场上的一张牌。', - re_pangtong:'手杀界庞统', - re_pangtong_prefix:'手杀界', - dongcheng:'手杀董承', - dongcheng_prefix:'手杀', - chengzhao:'承诏', - chengzhao_info:'一名角色的结束阶段,若你于本回合内获得了两张以上的牌,则你可以与一名其他角色拼点。若你赢,你视为对其使用一张无视防具的【杀】。', - yangyi:'手杀杨仪', - yangyi_prefix:'手杀', - duoduan:'度断', - duoduan_info:'每回合限一次,当你成为【杀】的目标后,你可以重铸一张牌。若如此做,你选择一项:①令使用者摸两张牌,且此【杀】无效。②令使用弃置一张牌,且你不能响应此【杀】。', - gongsun:'共损', - gongsun_info:'出牌阶段开始时,你可以弃置两张牌并指定一名其他角色。你选择一个基本牌或普通锦囊牌的牌名。直到你的下回合开始或你死亡,你与其不能使用或打出或弃置此名称的牌。', - gongsun_shadow:'共损', - xin_chengpu:'手杀界程普', - xin_chengpu_prefix:'手杀界', - relihuo:'疠火', - relihuo_damage:'疠火', - relihuo_baigei:'疠火', - relihuo_info:'当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。', - dengzhi:'手杀邓芝', - dengzhi_prefix:'手杀', - jimeng:'急盟', - jimeng_info:'出牌阶段开始时,你可以获得一名其他角色的一张牌,然后交给该角色X张牌(X为你当前体力值)。', - shuaiyan:'率言', - shuaiyan_info:'弃牌阶段开始时,若你的手牌数大于1,则你可以展示所有手牌,然后你令一名其他角色交给你一张牌。', - zhengxuan:'郑玄', - zhengjing:'整经', - zhengjing_info:'出牌阶段,你可以整理卡牌。然后,你将整理出的卡牌中的至少一张作为“经”置于一名角色的武将牌上,然后获得其余的牌。该角色的准备阶段获得这些牌,且跳过此回合的判定和摸牌阶段。', - zhengjing2:'整经', + yangbiao: "手杀杨彪", + yangbiao_prefix: "手杀", + zhaohan: "昭汉", + zhaohan_info: + "锁定技,你的第1-4个准备阶段开始时,你加1点体力上限并回复1点体力,你的第5-7个准备阶段开始时,你减1点体力上限。", + rangjie: "让节", + rangjie_info: + "当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆里你选择的类型的一张牌,或移动场上的一张牌。", + yizheng: "义争", + yizheng2: "义争", + yizheng_info: + "出牌阶段限一次,你可以和一名体力值不大于你的其他角色拼点。若你赢,其跳过下个摸牌阶段。若你没赢,你减1点体力上限。", + re_heqi: "手杀贺齐", + re_heqi_prefix: "手杀", + reqizhou: "绮胄", + reqizhou_info: + "锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖英姿〗;2种或以上:〖奇袭〗;3种或以上:〖旋风〗。", + reshanxi: "闪袭", + reshanxi2: "闪袭", + reshanxi_info: + "出牌阶段开始时,你可以弃置一张红色基本牌并选择一名有牌的其他角色,将其的至多X张牌置于其的武将牌上(X为你的体力值)。回合结束时,该角色获得这些牌。", + chendeng: "手杀陈登", + chendeng_prefix: "手杀", + zhouxuan: "周旋", + zhouxuan2: "周旋", + zhouxuan_info: + "出牌阶段限一次,你可以弃置一张牌并指定一名角色,然后选择一个基本牌的名称或非基本牌的类型。其使用或打出下一张牌时,若此牌的名称或类型和你选择的相同,则你观看牌堆顶的三张牌,然后将这些牌以任意分割方式交给任意名角色。", + fengji: "丰积", + fengji_info: + "锁定技,回合结束时,你记录你的手牌数。准备阶段开始时,若你的手牌数不小于你记录的手牌数,则你摸两张牌且本回合手牌上限为体力上限。", + re_guanqiujian: "手杀毌丘俭", + re_guanqiujian_prefix: "手杀", + rezhengrong: "征荣", + rehongju: "鸿举", + reqingce: "清侧", + reqingce_backup: "清侧", + rezhengrong_info: + "当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你可以将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。", + rehongju_info: + "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3且有角色死亡,则你摸等同于「荣」数量的牌。然后可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", + reqingce_info: "出牌阶段,你可以将一张「荣」置入弃牌堆,然后弃置场上的一张牌。", + re_pangtong: "手杀界庞统", + re_pangtong_prefix: "手杀界", + dongcheng: "手杀董承", + dongcheng_prefix: "手杀", + chengzhao: "承诏", + chengzhao_info: + "一名角色的结束阶段,若你于本回合内获得了两张以上的牌,则你可以与一名其他角色拼点。若你赢,你视为对其使用一张无视防具的【杀】。", + yangyi: "手杀杨仪", + yangyi_prefix: "手杀", + duoduan: "度断", + duoduan_info: + "每回合限一次,当你成为【杀】的目标后,你可以重铸一张牌。若如此做,你选择一项:①令使用者摸两张牌,且此【杀】无效。②令使用弃置一张牌,且你不能响应此【杀】。", + gongsun: "共损", + gongsun_info: + "出牌阶段开始时,你可以弃置两张牌并指定一名其他角色。你选择一个基本牌或普通锦囊牌的牌名。直到你的下回合开始或你死亡,你与其不能使用或打出或弃置此名称的牌。", + gongsun_shadow: "共损", + xin_chengpu: "手杀界程普", + xin_chengpu_prefix: "手杀界", + relihuo: "疠火", + relihuo_damage: "疠火", + relihuo_baigei: "疠火", + relihuo_info: + "当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。", + dengzhi: "手杀邓芝", + dengzhi_prefix: "手杀", + jimeng: "急盟", + jimeng_info: + "出牌阶段开始时,你可以获得一名其他角色的一张牌,然后交给该角色X张牌(X为你当前体力值)。", + shuaiyan: "率言", + shuaiyan_info: + "弃牌阶段开始时,若你的手牌数大于1,则你可以展示所有手牌,然后你令一名其他角色交给你一张牌。", + zhengxuan: "郑玄", + zhengjing: "整经", + zhengjing_info: + "出牌阶段,你可以整理卡牌。然后,你将整理出的卡牌中的至少一张作为“经”置于一名角色的武将牌上,然后获得其余的牌。该角色的准备阶段获得这些牌,且跳过此回合的判定和摸牌阶段。", + zhengjing2: "整经", - mobile_yijiang:'将星独具', - yj_zhanghe:'☆张郃', - yj_zhanghe_prefix:'☆', - yj_zhangliao:'☆张辽', - yj_zhangliao_prefix:'☆', - yj_xuhuang:'☆徐晃', - yj_xuhuang_prefix:'☆', - yj_ganning:'☆甘宁', - yj_ganning_prefix:'☆', - xhzhiyan:'治严', - xhzhiyan_info:'出牌阶段,若你的手牌数不等于体力上限,则你可以将手牌摸至/弃至手牌上限,然后本回合不能对其他角色使用牌/可以将弃置的一张牌交给一名其他角色。', - zhilve:'知略', - zhilve_info:'锁定技,准备阶段,你选择一项:1.移动场上装备区的一张牌并失去1点体力。2.移动场上判定区的一张牌并令本回合手牌上限-1。3.本回合摸牌阶段多摸一张牌且使用的第一张【杀】无距离限制且不计入次数限制。', - xinzhilve:'知略', - xinzhilve_backup:'知略', - xinzhilve_mark:'知略', - xinzhilve_info:'出牌阶段限一次,你可以失去1点体力并选择一项:1.移动场上的一张牌;2.视为使用一张无距离限制且不计入次数限制的【杀】并摸一张牌。然后你本回合的手牌上限+1。', - xinxhzhiyan:'治严', - xinxhzhiyan_false:'治严', - xinxhzhiyan_info:'出牌阶段每项各限一次,若你的手牌数:大于体力值,则你可以将X张手牌交给一名其他角色(X为你的手牌数与体力值之差);小于体力上限,则你可以摸X张牌且本阶段内不能再对其他角色使用牌。(X为你的手牌数与体力上限之差)', - weifeng:'威风', - weifeng2:'威风', - weifeng3:'威风', - weifeng_info:'锁定技,当你于出牌阶段内使用第一张伤害性基本牌或普通锦囊牌后,你令此牌的一名没有“惧”的其他目标角色获得一枚名称为此牌牌名的“惧”。有“惧”的角色受到伤害时,其移去“惧”,然后若造成伤害的牌名称和“惧”:相同,此伤害+1;不同,你获得该角色的一张牌。准备阶段开始时或你死亡时,你移去场上的所有“惧”。', - gnjinfan:'锦帆', - gnjinfan_gain:'锦帆', - gnjinfan_info:'弃牌阶段开始时,你可将任意张手牌置于武将牌上,称为“铃”(每种花色的“铃”限一张)。你可以如手牌般使用或打出“铃”。当有“铃”移动到处理区后,你从牌堆中获得与“铃”花色相同的一张牌。', - gnsheque:'射却', - gnsheque_info:'一名其他角色的准备阶段开始时,若其装备区内有牌,则你可以对其使用一张【杀】(无距离关系的限制且无视防具)。', - sp_sufei:'手杀苏飞', - sp_sufei_prefix:'手杀', - zhengjian:'诤荐', - zhengjian_draw:'诤荐', - zhengjian_mark:'诤荐', - zhengjian_info:'锁定技,结束阶段,你令一名角色获得一枚“诤”。回合开始时,你令有“诤”的角色移去“诤”并摸X张牌(X为其最后一次获得“诤”后使用和打出的牌数,且至多不能超过其体力上限或5)。', - gaoyuan:'告援', - gaoyuan_info:'当你成为【杀】的目标时,你可弃置一张牌将此【杀】转移给一名有“诤”且不是此【杀】使用者的其他角色。', - tongqu:'通渠', - tongqu_info:'游戏开始时,你拥有一个“渠”标记。准备阶段,你可以失去1点体力令一名没有“渠”标记的角色获得“渠”标记。有“渠”的角色摸牌阶段额外摸一张牌,然后将一张牌交给其他有“渠”的角色或弃置。若以此法给出的是装备牌则使用之。当有“渠”的角色进入濒死状态时,移除其“渠”标记。', - xinwanlan:'挽澜', - xinwanlan_info:'当一名角色受到伤害值不小于体力值的伤害时,你可以弃置装备区中的所有牌(至少一张) 防止此伤害。', - re_xusheng:'手杀界徐盛', - re_xusheng_prefix:'手杀界', - re_dongzhuo:'手杀界董卓', - re_dongzhuo_prefix:'手杀界', - rejiuchi:'酒池', - rejiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的〖崩坏〗失效直到回合结束。', - furong:'手杀傅肜', - furong_prefix:'手杀', - xuewei:'血卫', - xuewei_info:'准备阶段,你可以选择一名其他角色(仅自己可见)。若如此做,直到你的下回合开始前,当其第一次受到伤害时,你防止此伤害,改为由你受到等量的伤害并对伤害来源造成等量同属性的伤害。', - liechi:'烈斥', - liechi_info:'锁定技,当你进入濒死状态时,伤害来源弃置一张牌。', - xin_liaohua:'手杀界廖化', - xin_liaohua_prefix:'手杀界', - redangxian:'当先', - redangxian_info:'锁定技,回合开始时,你从弃牌堆中获得一张【杀】并进行一个额外的出牌阶段。', - refuli:'伏枥', - refuli_info:'限定技,当你处于濒死状态时,你可以将体力值回复至X点(X为势力数)。然后若你的体力值为全场唯一最多,你翻面。', - xin_caozhang:'手杀界曹彰', - xin_caozhang_prefix:'手杀界', - "rejiangchi":"将驰", - "rejiangchi_info":"出牌阶段开始时,你可以选择一项:1、摸一张牌,若如此做,你本阶段内不能使用【杀】。 2、弃置一张牌,若如此做,此阶段你使用【杀】无距离限制且你可以额外使用一张【杀】。", - rezhenxing:"镇行", - rezhenxing_info:"结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", - xin_jianyong:'手杀界简雍', - xin_jianyong_prefix:'手杀界', - xinqiaoshui:'巧说', - xinqiaoshui_info:'出牌阶段限一次,你可以和一名其他角色拼点。若你赢,则你本阶段内使用的下一张基本牌或普通锦囊牌可以增加减少一个目标。若你没赢,你本阶段内不能使用锦囊牌。', - xinjyzongshi:'纵适', - xinjyzongshi_info:'当你拼点后,你可以观看牌堆顶的一张牌,然后选择一项:获得此牌,或获得两张拼点牌中点数较小的一张。', - dingyuan:'手杀丁原', - dingyuan_prefix:'手杀', - beizhu:'备诛', - beizhu_draw:'备诛', - beizhu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌。若其中:没有【杀】,你弃置其一张牌,然后你可令其获得牌堆中的一张【杀】;有【杀】,其依次对你使用这些【杀】,当你因此受到1点伤害后,你摸一张牌。', - xin_zhuran:'手杀界朱然', - xin_zhuran_prefix:'手杀界', - mobiledanshou:'胆守', - mobiledanshou_info:'一名其他角色的结束阶段开始时,若X:为0,你摸一张牌;不等于0,你可弃置X张牌并对其造成1点伤害(X为其本回合内使用的目标包含你的牌的数量)。', - yanghuiyu:'羊徽瑜', - hongyi:'弘仪', - hongyi2:'弘仪', - hongyi_info:'出牌阶段限一次,你可以选择一名其他角色。你的下回合开始前,该角色造成伤害时进行判定,若结果为:黑色,此伤害-1。红色,受到伤害的角色摸一张牌。', - requanfeng:'劝封', - requanfeng_gain:'劝封', - requanfeng_info:'限定技。①其他角色死亡时,你可失去〖弘仪〗,然后获得其武将牌上的所有非主公技,非隐匿技和非Charlotte技,加1点体力上限并回复1点体力。②当你处于濒死状态时,你可以加2点体力上限,然后回复4点体力。', - quanfeng:'劝封', - quanfeng_info:'锁定技,限定技,一名角色死亡时,你选择获得其的一个技能(主公技,限定技,觉醒技,隐匿技,使命技,带有Charlotte标签的技能除外),然后加1点体力上限并回复1点体力。', - simashi:'手杀司马师', - simashi_prefix:'手杀', - baiyi:'败移', - baiyi_info:'限定技,出牌阶段,若你已受伤,你可以交换两名其他角色的座次。', - jinglve:'景略', - jinglve2:'景略', - jinglve3:'景略', - jinglve_info:'出牌阶段限一次,若场上没有与你对应的「死士」牌,则你可以观看一名其他角色的手牌,将其中一张牌标记为「死士」。当其使用对应的实体牌中包含「死士」的牌时,你取消此牌的所有目标。当「死士」牌不因使用而进入弃牌堆,或其回合结束后,若「死士」牌仍在其区域内,则你获得此牌。', - shanli:'擅立', - shanli_info:'觉醒技,准备阶段,若你已发动过〖败移〗且对至少两名角色发动过〖景略〗,则你减1点体力上限并选择一名角色。系统随机选择三个不为〖忘隙(仲村由理)〗的主公技,然后你选择其中一个技能,令其获得之。其将交互表情中的【拖鞋】和【酒杯】替换为【枷锁】和【玉玺】。', - re_lingtong:'手杀界凌统', - re_lingtong_prefix:'手杀界', - re_liubiao:'手杀界刘表', - re_liubiao_prefix:'手杀界', - hucheer:'手杀胡车儿', - hucheer_prefix:'手杀', - daoji:'盗戟', - daoji_info:'出牌阶段限一次,你可以弃置一张非基本牌并选择一名装备区里有牌的其他角色,你获得其装备区中的一张牌并使用之。若你以此法得到的牌是武器牌,则你使用此牌后对其造成1点伤害。', - xin_hansui:'手杀韩遂', - xin_hansui_prefix:'手杀', - xinniluan:'逆乱', - xinniluan_info:'其他角色的结束阶段,若其本回合对除其以外的角色使用过牌,则你可以对其使用一张【杀】。若以此法使用的【杀】造成伤害,则你弃置其一张牌。', - xiaoxi_hansui:'骁袭', - xiaoxi_hansui_info:'你可以将一张黑色牌当做【杀】使用或打出。', - xin_zhangfei:'手杀界张飞', - xin_zhangfei_prefix:'手杀界', - liyong:'厉勇', - liyong2:'厉勇', - liyong3:'厉勇', - liyong_info:'锁定技,若你于出牌阶段内使用的【杀】被【闪】抵消,则你获得如下效果:你本回合使用的下一张【杀】不可被响应且伤害+1,指定的目标本回合非锁定技失效,当此【杀】造成伤害后,若目标角色未死亡,你失去1点体力。', - gongsunkang:'公孙康', - juliao:'据辽', - juliao_info:'锁定技,其他角色计算与你的距离始终+X(X为场上势力数-1)。', - taomie:'讨灭', - taomie1:'讨灭', - taomie2:'讨灭', - taomie3:'讨灭', - taomie4:'讨灭', - taomie_info:'当你受到伤害后或当你造成伤害后,你可以令伤害来源或受伤角色获得“讨灭”标记(如场上已有标记则转移给该角色);你和拥有“讨灭”标记的角色视为在彼此的攻击范围内,且当你对该角色造成伤害时,选择一项:1. 此伤害+1;2. 你获得其区域内的一张牌并可将之交给另一名角色;3. 依次执行前两项并于伤害结算后弃置其“讨灭”标记。', - xin_guohuai:'手杀界郭淮', - xin_guohuai_prefix:'手杀界', - mobilejingce:'精策', - mobilejingce_info:'结束阶段,若此回合因使用或打出而置入弃牌堆的牌的数量不小于你的体力值,则你可以摸两张牌。', - xin_panzhangmazhong:'手杀界潘璋马忠', - xin_panzhangmazhong_prefix:'手杀界', - xinduodao:'夺刀', - xinduodao_info:'当你受到伤害后,你可以获得伤害来源装备区里的武器牌。', - xinanjian:'暗箭', - xinanjian_info:'锁定技,当你使用【杀】指定目标后,若你不在目标角色攻击范围内,你选择一项:1. 令其无法响应此【杀】;2. 其受到此【杀】造成的伤害+1。', - xin_fuhuanghou:'手杀界伏寿', - xin_fuhuanghou_prefix:'手杀界', - xinzhuikong:'惴恐', - xinzhuikong_info:'每轮限一次,其他角色的回合开始时,若其体力值不小于你,你可与其拼点。若你赢,其本回合无法使用牌指定除其以外的角色为目标;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。', - xinqiuyuan:'求援', - xinqiuyuan_info:'当你成为【杀】的目标时,你可以令另一名其他角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标。', - xin_gongsunzan:'手杀界公孙瓒', - xin_gongsunzan_prefix:'手杀界', - re_dengai:'手杀界邓艾', - re_dengai_prefix:'手杀界', - flappybird:'飞鸟', - flappybird_info:'出牌阶段,你可游玩一局Flappy Bird。', - re_handang:'手杀界韩当', - re_handang_prefix:'手杀界', - nanhualaoxian:'手杀南华老仙', - nanhualaoxian_prefix:'手杀', - yufeng:'御风', - yufeng2:'御风', - yufeng_info:'出牌阶段限一次,你可以表演“御风飞行”。若表演失败,则你摸X张牌。若表演成功,则你可以选择至多X名其他角色获得“御风”效果,然后摸X-Y张牌(准备阶段开始时,你进行判定。若结果为:红色,你跳过摸牌阶段;黑色,你跳过出牌阶段和弃牌阶段。X为你的得分。Y为你选择的角色数)。', - tianshu:'天书', - tianshu_info:'出牌阶段开始时,若场上没有【太平要术】,则你可以弃置一张牌并选择一名角色。该角色获得并使用【太平要术】。', - re_jiangwei:'手杀界姜维', - re_jiangwei_prefix:'手杀界', - retiaoxin:'挑衅', - retiaoxin_info:'出牌阶段限一次,你可以指定一名有牌的其他角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。', - re_zhurong:'手杀界祝融', - re_zhurong_prefix:'手杀界', - relieren:'烈刃', - relieren_info:'当你使用【杀】指定目标后,你可以和目标角色进行拼点。若你赢,你获得其一张牌。若你没赢,你获得对方的拼点牌,其获得你的拼点牌。', - zhouqun:'周群', - tiansuan:'天算', - tiansuan_info:'出牌阶段限一次,若场上没有因你产生的“命运签”,则你可以抽取一张“命运签”,然后令一名角色获得“命运签”直到你的下回合开始。若你以此法抽取的“命运签”为:上上签,你观看其手牌;上上签/上签,你获得其区域内的一张牌。', - tiansuan_faq:'【命运签】说明', - tiansuan_faq_info:'当你抽取“命运签”时,你可以令其中一种命运签的权重+1。
    上上签(权重1):当你受到伤害时,防止此伤害。
    上签(权重2):当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。
    中签(权重3):当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。
    下签(权重2):当你受到伤害时,你令此伤害+1。
    下下签(权重1):当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。', - tiansuan2_0:'命运签', - tiansuan2_1:'命运签', - tiansuan2_2:'命运签', - tiansuan2_damage:'命运签', - tiansuan2_fire:'命运签', - tiansuan2_3:'命运签', - tiansuan2_4:'命运签', - ol_yujin:'手杀界于禁', - ol_yujin_prefix:'手杀界', - rejieyue:'节钺', - rejieyue_info:'结束阶段开始时,你可以将一张牌交给一名其他角色。然后其选择一项:令你摸三张牌:或其保留一张手牌和装备区的牌,然后弃置其余的牌。', - xin_zhoucang:'手杀界周仓', - xin_zhoucang_prefix:'手杀界', - mobilezhongyong:'忠勇', - mobilezhongyong_info:'当你于出牌阶段内使用的【杀】结算结束后,若没有目标角色使用【闪】响应过此【杀】,则你可获得此【杀】;否则你可选择一项:①获得目标角色使用的【闪】,然后可将此【杀】交给另一名其他角色。②将目标角色使用的【闪】交给另一名其他角色,然后你本回合使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1。(你不能使用本回合因执行〖忠勇〗的效果得到的牌)', - xin_caifuren:'手杀界蔡夫人', - xin_caifuren_prefix:'手杀界', - xinqieting:'窃听', - xinqieting_info:'其他角色的回合结束时,若其本回合内未对其他角色造成过伤害,则你可选择一项:①摸一张牌。②观看其两张手牌并获得其中的一张。③将其装备区内的一张牌移动至你的装备区。', - xinguixiu:'闺秀', - xinguixiu_info:'锁定技。结束阶段,若你的体力值为:奇数,你摸一张牌;偶数,你回复1点体力。', - re_zhonghui:'手杀界钟会', - re_zhonghui_prefix:'手杀界', - requanji:'权计', - requanji_info:'出牌阶段结束时,若你的手牌数大于体力值,或当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。', - xin_guyong:'手杀界顾雍', - xin_guyong_prefix:'手杀界', - xinshenxing:'慎行', - xinshenxing_info:'出牌阶段限X次(X为你的体力值),你可以弃置两张牌,然后摸一张牌。若这两张牌颜色不同,则改为摸两张牌。', - xinbingyi:'秉壹', - xinbingyi_info:'结束阶段,你可展示所有手牌。若这些牌的颜色或类型均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数)。', - qiaozhou:'手杀谯周', - qiaozhou_prefix:'手杀', - zhiming:'知命', - zhiming_info:'准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。', - xingbu:'星卜', - xingbu_info:'结束阶段,你可以亮出牌堆顶的三张牌,然后你可以根据X值(X为这三张牌中红色牌的数量),令一名其他角色获得对应的效果直到其下回合结束:①三张:其摸牌阶段多摸两张牌,使用【杀】的次数上限+1。②两张:其使用【杀】的次数上限-1,跳过弃牌阶段。③小于两张:其于准备阶段开始时弃置一张手牌。', - xin_sunluban:'手杀界孙鲁班', - xin_sunluban_prefix:'手杀界', - xinzenhui:'谮毁', - xinzenhui_info:'出牌阶段限一次。当你使用【杀】或黑色普通锦囊牌指定目标时,你可选择另一名能成为此牌目标的其他角色并选择一项:①令其也成为此牌的目标。②获得其一张牌,然后将此牌的使用者改为该角色。', - xinjiaojin:'骄矜', - xinjiaojin_info:'当你受到男性角色造成的伤害时,你可以弃置一张装备牌并防止此伤害。', - xin_caozhen:'手杀界曹真', - xin_caozhen_prefix:'手杀界', - discretesidi:'司敌', - discretesidi_info:'①当你使用的不为延时锦囊牌的牌结算结束后,你可选择一名R内不存在以a为第一序偶的二元序偶的其他角色a,并选择一名角色b,在关系R内建立二元序偶<a,b>(b对其他角色不可见)。②一名角色a使用不为延时锦囊牌的牌指定b为目标时,若(aRb)∧(此牌目标数为1)为真,则{你从R内移除<a,b>,且:若b为你,你摸一张牌;若b不为你,你可选择:⒈取消此牌的目标,然后若场上没有处于濒死状态的角色,则你对a造成1点伤害。⒉摸两张牌};否则{你清除R内以a为第一元素的二元序偶}。', - fuqian:'傅佥', - jueyong:'绝勇', - jueyong_info:'锁定技。①当你不因〖绝勇〗成为唯一牌的目标时,若此牌不为转化牌且对应的实体牌牌数为1且不为【桃】或【酒】且你的“绝”数小于你的体力值,则你将此牌置于你的武将牌上,称为“绝”,且取消此牌的目标。②结束阶段开始时,若你有“绝”,则你令所有“绝”的原使用者依次对你使用所有“绝”,将无法使用的“绝”置入弃牌堆。', - poxiang:'破降', - poxiang_info:'出牌阶段限一次。你可以将一张牌交给一名其他角色。你摸三张牌(不计入本回合的手牌上限),移去所有“绝”并失去1点体力。', - simafu:'司马孚', - xunde:'勋德', - xunde_info:'一名角色受到伤害后,若你至其的距离不大于1,则你可判定。若判定结果:大于5,你令该角色获得判定牌;小于7,你令伤害来源弃置一张牌。', - chenjie:'臣节', - chenjie_info:'一名角色的判定牌生效前,你可打出一张花色相同的牌。系统将你打出的牌作为新判定牌,将原判定牌置入弃牌堆。然后你摸两张牌。', - mayuanyi:'马元义', - jibing:'集兵', - jibing_info:'①摸牌阶段开始时,若你的“兵”数小于势力数,则你可以改为将牌堆顶的两张牌置于你的武将牌上,称为“兵”。②你可以将一张“兵”当做【杀】或【闪】使用或打出。', - wangjing:'往京', - wangjing_info:'锁定技。当你因〖集兵〗而使用或打出牌时,若对方是场上体力值最高的角色,则你摸一张牌。', - moucuan:'谋篡', - moucuan_info:'觉醒技。准备阶段,若你的“兵”数不小于势力数,则你减1点体力上限并获得〖兵祸〗。', - binghuo:'兵祸', - binghuo_info:'一名角色的结束阶段开始时,若你本回合内因〖集兵〗而使用或打出过牌,则你可令一名角色判定。若判定结果为黑色,则你对其造成1点雷属性伤害。', - yanpu:'阎圃', - huantu:'缓图', - huantu_info:'每轮限一次。一名角色的摸牌阶段开始前,若其在你攻击范围内,则你可以交给其一张牌并令其跳过此阶段。然后你于此回合的结束阶段选择一项:①令其回复1点体力并摸两张牌。②你摸三张牌,然后交给其两张手牌。', - bihuo:'避祸', - bihuo_info:'限定技。一名角色脱离濒死状态时,你可以令其摸三张牌,然后其他角色计算至其的距离时+X直到本轮结束(X为角色数)。', - sunhanhua:'手杀孙寒华', - sunhanhua_prefix:'手杀', - chongxu:'冲虚', - chongxu_info:'出牌阶段限一次,你可以随机演奏一首音乐,并根据完成度来获得相应的分数(至多五分)。然后你可修改〖妙剑〗或〖莲华〗(消耗3分),并使用剩余的分数进行摸牌(每张2分)。', - chongxu_faq:'目前的曲库', - chongxu_faq_info:' 
    《鸟之诗》- 折户伸治
    《竹取飛翔 ~ Lunatic Princess》- ZUN
    《ignotus》- ak+q
    《Super Mario 3D World Theme》- 横田真人
    《只因你太美》- SWIN-S
    《Croatian Rhapsody》- Maksim
    《罗刹海市》- 刀郎
    《Pigstep (Stereo Mix)》- Lena Raine', - miaojian:'妙剑', - miaojian_info:'出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。', - miaojian1:'妙剑·改', - miaojian1_info:'出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。', - miaojian2:'妙剑·极', - miaojian2_info:'出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。', - shhlianhua:'莲华', - shhlianhua_info:'当你成为【杀】的目标后,你摸一张牌。', - shhlianhua1:'莲华·改', - shhlianhua1_info:'当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。', - shhlianhua2:'莲华·极', - shhlianhua2_info:'当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。', - re_yufan:'手杀界虞翻', - re_yufan_prefix:'手杀界', - rezongxuan:'纵玄', - rezongxuan_place:'纵玄', - rezongxuan_info:'当你的牌因弃置而进入弃牌堆后,你可以将其以任意顺序置于牌堆顶。出牌阶段限一次,你可以摸一张牌,然后将一张牌置于牌堆顶。', - yj_huangzhong:'☆黄忠', - yj_huangzhong_prefix:'☆', - spshidi:'势敌', - spshidi_info:'转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。', - spyishi:'义释', - spyishi_info:'当你对装备区有牌的其他角色造成伤害时,你可令此伤害-1,然后获得其装备区内的一张牌。', - spqishe:'骑射', - spqishe_info:'你可以将一张装备牌当做【酒】使用。你的手牌上限+X(X为你装备区内的牌数)。', - sp_maojie:'毛玠', - bingqing:'秉清', - bingqing_info:'当你于出牌阶段内使用的牌结算结束后,若你于本阶段内使用的所有已结算结束的其他牌与此牌花色均不相同,则你可根据X的值执行对应效果:为2,你令一名角色摸两张牌;为3,你弃置一名角色区域内的一张牌;为4,你对一名其他角色造成1点伤害。(X为你本阶段内使用过的已结算结束的牌中包含的花色数)', - yingfeng:'迎奉', - yingfeng_info:'准备阶段,你可以令一名角色获得“奉”标记并移除场上所有其他的“奉”标记。有“奉”标记的角色使用牌没有距离限制。', - xin_sunxiu:'手杀界孙休', - xin_sunxiu_prefix:'手杀界', - mobileyanzhu:'宴诛', - mobileyanzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色选择一项:①你获得其装备区里所有的牌,然后你失去技能〖宴诛〗并修改技能〖兴学〗。②你获得其区域里的一张牌。', - mobilexingxue:'兴学', - mobilexingxue_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值)。', - mobilexingxuex:'兴学·改', - mobilexingxuex_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶或交给一名其他目标角色(X为你的体力上限)。', - re_wuguotai:'手杀界吴国太', - re_wuguotai_prefix:'手杀界', - reganlu:'甘露', - reganlu_info:'出牌阶段限一次,你可以选择装备区牌数之差的绝对值不大于X的两名角色或包含你在内的两名角色,然后交换这两名角色装备区内的牌。(X为你已损失的体力值)', - taoqian:'手杀陶谦', - taoqian_prefix:'手杀', - miheng:'手杀祢衡', - miheng_prefix:'手杀', - re_gaoshun:'手杀界高顺', - re_gaoshun_prefix:'手杀界', - peixiu:'裴秀', - xingtu:'行图', - xingtu1:'倍数', - xingtu2:'约数', - xingtu_info:'锁定技。你使用点数为X的倍数的牌无次数限制,你使用点数为X的约数的牌时摸一张牌(X为你本局游戏使用的上一张牌的点数)。', - juezhi:'爵制', - juezhi_info:'出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为Y的牌(Y为这些牌的点数和对13取余,余数为0时Y取13)。', - sp_jianggan:'手杀蒋干', - sp_jianggan_prefix:'手杀', - spdaoshu:'盗书', - spdaoshu_info:'每轮限一次。一名敌方角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。', - spdaoshu_info_identity:'每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。', - spdaoshu_info_guozhan:'每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。', - mbdaoshu:'盗书', - mbdaoshu_info:'出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你和队友观看其手牌并猜测其伪装的手牌,猜对的角色对其造成1点伤害,猜错的角色随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。', - mbdaoshu_info_identity:'出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。', - mbdaoshu_info_guozhan:'出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。', - spdaizui:'戴罪', - spdaizui2:'戴罪', - spdaizui_info:'限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。', - re_caiwenji:'手杀界蔡琰', - re_caiwenji_prefix:'手杀界', - re_bulianshi:'手杀界步练师', - re_bulianshi_prefix:'手杀界', - reanxu:'安恤', - reanxu_info:'出牌阶段限一次,你可以选择两名其他角色,令其中一名角色获得另一名角色的一张牌。若以此法移动的牌不来自装备区,则你摸一张牌。然后你可以令二者中手牌数较少的一名角色摸一张牌。', - xin_jushou:'手杀界沮授', - xin_jushou_prefix:'手杀界', - xinjianying:'渐营', - xinjianying_info:'①当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。②出牌阶段限一次,你可以将一张牌当做任意基本牌使用。若你于此阶段内使用的上一张牌有花色,则此牌的花色视为上一张牌的花色。', - re_xunyu:'手杀界荀彧', - re_xunyu_prefix:'手杀界', - rejieming:"节命", - rejieming_info:"当你受到1点伤害后,你可以令一名角色摸两张牌。然后若其手牌数小于体力上限,则你摸一张牌。", - xin_quancong:'手杀界全琮', - xin_quancong_prefix:'手杀界', - sbyaoming:'邀名', - sbyaoming_info:'蓄力技(2/4)。①当你受到1点伤害后,你可以获得1点蓄力值。②出牌阶段或当你受到伤害后,你可消耗1点蓄力值并选择一项:⒈弃置一名手牌数不小于你的角色的一张牌。⒉令一名手牌数不大于你的角色摸一张牌。若你上次发动〖邀名②〗时未获得过蓄力值且你选择的选项和上次不同,则你获得1点蓄力值。', - ruanhui:'阮慧', - mingcha:'明察', - mingcha_info:'摸牌阶段开始时,你亮出牌堆顶的三张牌。若这三张牌中有点数小于9的牌,则你可以放弃摸牌并获得这些牌,然后你可以获得一名其他角色的随机一张牌。', - jingzhong:'敬重', - jingzhong_info:'弃牌阶段结束时,若你于本阶段内弃置过至少两张黑色牌,则你可以选择一名其他角色并获得如下效果直到其回合结束:每阶段限三次,其于出牌阶段内使用的牌结算结束后,你获得此牌对应的实体牌。', - xin_mamidi:'手杀马日磾', - xin_mamidi_prefix:'手杀', - chengye:'承业', - chengye_info:'锁定技。①其他角色使用的非转化牌结算结束后,或其他角色的装备牌和延时锦囊牌进入弃牌堆后,或有延时锦囊牌因其他角色执行判定阶段的流程而进入弃牌堆后,若你的“六经”有空缺的位置可以置入此牌,则你将此牌置于你武将牌上,填补“六经”的对应位置。②出牌阶段开始时,若你的“六经”没有空缺的位置,则你获得所有“六经”。', - chengye_append:'
  • 《诗经》:伤害类锦囊牌
  • 《尚书》:基本牌
  • 《仪礼》:无懈可击
  • 《易经》:无中生有
  • 《乐经》:乐不思蜀
  • 《春秋》:装备牌', - buxu:'补叙', - buxu_backup:'补叙', - buxu_info:'出牌阶段,若你的“六经”中有空缺的位置,则你可以弃置X+1张牌并选择一种空缺的“六经”(X为你本阶段内发动过〖补叙〗的次数)。系统从牌堆或弃牌堆中检索一张对应的牌,然后你将此牌置于你武将牌上,填补“六经”的对应位置。', - re_dianwei:'手杀界典韦', - re_dianwei_prefix:'手杀界', - liuye:'手杀刘晔', - liuye_prefix:'手杀', - sp_caosong:'手杀曹嵩', - sp_caosong_prefix:'手杀', - yijin:'亿金', - yijin_info:'锁定技。①游戏开始时,你获得“膴仕”、“金迷”、“贾凶”、“通神”、“拥蔽”、“厚任”各1枚(均称为“金”)。②出牌阶段开始时,你选择一名没有“金”的其他角色。你交给其1枚“金”,且令其获得对应效果。③一名角色的回合结束后,若其有你交给其的“金”,其移去此“金”。④当你死亡时,移去场上所有你交出的“金”。⑤回合开始时,若你没有“金”,你死亡。', - yijin_wushi:'膴仕', - yijin_wushi_info:'锁定技。①摸牌阶段,你多摸四张牌。②你使用【杀】的次数上限+1。', - yijin_jinmi:'金迷', - yijin_jinmi_info:'锁定技。回合开始时,你跳过下一个出牌阶段和弃牌阶段。', - yijin_guxiong:'贾凶', - yijin_guxiong_info:'锁定技。①出牌阶段开始时,你失去1点体力。②你的手牌上限-3。', - yijin_tongshen:'通神', - yijin_tongshen_info:'锁定技。当你受到非雷电伤害时,防止之。', - yijin_yongbi:'拥蔽', - yijin_yongbi_info:'锁定技。准备阶段,你跳过下一个摸牌阶段。', - yijin_houren:'厚任', - yijin_houren_info:'锁定技。回合结束时,你回复3点体力。', - guanzong:'惯纵', - guanzong_info:'出牌阶段限一次。你可以令一名其他角色视为对另一名其他角色造成过1点伤害。', - yangfu:'杨阜', - jiebing:'借兵', - jiebing_info:'锁定技。当你受到伤害后,你选择来源外的一名其他角色,随机获得其一张牌并展示。若此牌为装备牌,你使用之。', - hannan:'扞难', - hannan_info:'出牌阶段限一次。你可以与一名角色拼点,赢的角色对没赢的角色造成2点伤害。', - xin_wuyi:'手杀界吴懿', - xin_wuyi_prefix:'手杀界', - sbbenxi:'奔袭', - sbbenxi_info:'出牌阶段开始时,你可以弃置至少一张牌,然后你于此阶段获得如下效果:①你至其他角色距离-X;②当你使用的下一张基本牌或普通锦囊牌A选择目标后,你可以额外指定X名距离为1的角色为目标;③牌A结算结束后,若此牌造成过伤害,你摸五张牌(X为你以此法弃置的牌数)。', - xin_zhuzhi:'手杀界朱治', - xin_zhuzhi_prefix:'手杀界', - sbanguo:'安国', - sbanguo_info:'①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得1点护甲。', - wangjun:'手杀王濬', - wangjun_prefix:'手杀', - zhujian:'筑舰', - zhujian_info:'出牌阶段限一次。你可以令至少两名装备区里有牌的角色各摸一张牌。', - duansuo:'断索', - duansuo_info:'出牌阶段限一次。你可以重置任意名处于连环状态的角色,然后对这些角色各造成1点火焰伤害。', - sp_pengyang:'手杀彭羕', - sp_pengyang_prefix:'手杀', - spdaming:'达命', - spdaming_info:'①游戏开始时,你获得1点“达命”值。②其他角色A的出牌阶段限一次。其可以交给你一张牌,然后你选择另一名其他角色B。若B有与此牌相同类型的牌,其将一张该类型的牌交给A,你获得1点“达命”值;否则你将此牌交给A。', - spxiaoni:'嚣逆', - spxiaoni_info:'①出牌阶段限一次。若你的“达命”值大于0,你可以将一张牌当任意一种【杀】或伤害类锦囊牌使用。然后你减少等同于此牌指定目标数的“达命”值。②你的手牌上限基数为X(X为“达命”值,且至多为你的体力值,至少为0)。', - xin_zhuhuan:'手杀界朱桓', - xin_zhuhuan_prefix:'手杀界', - xinpingkou:'平寇', - xinpingkou_info:'回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。然后你从牌堆中获得一张装备牌。', - xin_caoxiu:'手杀界曹休', - xin_caoxiu_prefix:'手杀界', - xinqingxi:'倾袭', - xinqingxi_info:'每回合限一次。当你对其他角色造成伤害时,你可以令其选择一项:1.弃置X张手牌(X为4减去你至其的距离,至少为1);2.令此伤害+1。', - yj_weiyan:'☆魏延', - yj_weiyan_prefix:'☆', - mbguli:'孤厉', - mbguli_info:'出牌阶段限一次。你可以将所有手牌当做一张无视防具的【杀】使用。此牌结算结束后,若此牌造成过伤害,你可以失去1点体力并将手牌摸至X张(X为你的体力上限)。', - mbaosi:'骜肆', - mbaosi_info:'锁定技。当你于出牌阶段对一名攻击范围内的角色造成伤害后,你于此阶段对其使用牌无次数限制。', - xin_zhoutai:'手杀界周泰', - xin_zhoutai_prefix:'手杀界', - re_yanwen:'手杀界颜良文丑', - re_yanwen_prefix:'手杀界', - qianzhao:'手杀牵招', - qianzhao_prefix:'手杀', - mbshihe:'势吓', - mbshihe_info_identity:'出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你造成伤害时,取消之;没赢,你随机弃置一张牌。', - mbshihe_info:'出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你和你的友方角色造成伤害时,取消之;没赢,你随机弃置一张牌。', - mbzhenfu:'镇抚', - mbzhenfu_info:'结束阶段,若你本回合因弃置失去过牌,你可以令一名其他角色获得1点护甲。', - shichangshi:'十常侍', - mbdanggu:'党锢', - mbdanggu_info:'锁定技。①游戏开始时,你获得十张“常侍”牌,然后你进行一次结党。②当你修整结束后,你进行一次结党并摸一张牌。③若你有亮出的“常侍”牌,你视为拥有这些牌的技能。', - mbdanggu_faq:'关于结党', - mbdanggu_faq_info:'
    系统随机选择一张未亮出过的“常侍”牌,然后选择四张未亮出过的“常侍”牌。你观看前者,然后从后者中选择一名认可前者的“常侍”牌。然后若此时不为双将模式,你将这两张武将牌作为你的武将牌(不移除原有技能);否则你获得这两张武将牌上的技能。', - mbdanggu_faq2:'关于认可', - mbdanggu_faq2_info:'
    双向不认可常侍为固定组合:
  • 郭胜、段珪
  • 韩悝、毕岚
    单向不认可常侍为系统随机分配。
    每次结党至多存在一张不认可主将的常侍牌,且若此次结党仅有一张常侍牌,则不会存在不认可情况。', - mbmowang:'殁亡', - mbmowang_info:'锁定技。①当你死亡前,若你有未亮出的“常侍”牌且体力上限大于0,你将死亡改为修整至你的下个回合开始前,然后你复原武将牌,且不于此次死亡事件中进行展示身份牌、检测游戏胜利条件与执行奖惩的流程。②回合结束后,你死亡。', - mbmowang_faq:'关于修整', - mbmowang_faq_info:'
    将武将牌移出游戏(视为你存活)。当该角色修整结束,其移回游戏。', - scs_zhangrang:'张让', - scstaoluan:'滔乱', - scstaoluan_info:'出牌阶段限一次。你可以将一张牌当任意一种基本牌或普通锦囊牌使用。', - scs_zhaozhong:'赵忠', - scschiyan:'鸱咽', - scschiyan_info:'①当你使用【杀】指定目标后,你可以将其的一张牌置于其武将牌上,然后其于当前回合结束时获得这些牌。②当你因执行【杀】的效果对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,此伤害+1。', - scs_sunzhang:'孙璋', - scszimou:'自谋', - scszimou_info:'锁定技。出牌阶段,当你使用第二/四/六张牌时,你从牌堆中获得一张【酒】/【杀】/【决斗】。', - scs_bilan:'毕岚', - scspicai:'庀材', - scspicai_info:'出牌阶段限一次。你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同,则你可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。', - scs_xiayun:'夏恽', - scsyaozhuo:'谣诼', - scsyaozhuo_info:'出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置两张牌。', - scs_hankui:'韩悝', - scsxiaolu:'宵赂', - scsxiaolu_info:'出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张牌;2.将两张牌交给一名其他角色。', - scs_lisong:'栗嵩', - scskuiji:'窥机', - scskuiji_info:'出牌阶段限一次。你可以观看一名其他角色的手牌,然后弃置你与其的共计四张花色各不相同的手牌。', - scs_duangui:'段珪', - scschihe:'叱吓', - scschihe_info:'当你使用【杀】指定唯一目标后,你可亮出牌堆顶的两张牌,令此【杀】的伤害值基数+X(X为亮出牌中花色与此【杀】相同的牌数),且目标角色不能使用亮出牌包含的花色的牌响应此【杀】。', - scs_guosheng:'郭胜', - scsniqu:'逆取', - scsniqu_info:'出牌阶段限一次。你可以对一名角色造成1点火焰伤害。', - scs_gaowang:'高望', - scsanruo:'安弱', - scsanruo_info:'你可以将一张♥牌当【桃】、♦牌当火【杀】、♣牌当【闪】、♠牌当【无懈可击】使用。当你以此法使用或打出【杀】或【闪】时,你可以获得对方的一张牌;当你以此法使用【桃】时,你可以获得一名其他角色的一张牌;当你以此法使用【无懈可击】时,你可以获得此牌响应的普通锦囊牌的使用者的一张牌。', - scsmiaoyu:'妙语', - scsmiaoyu_info:'你可以将至多两张相同花色的牌按照以下规则使用或打出:♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。', - re_xiaoqiao:'手杀界小乔', - re_xiaoqiao_prefix:'手杀界', - xin_sunliang:'手杀孙亮', - xin_sunliang_prefix:'手杀', - xinkuizhu:'溃诛', - xinkuizhu_info:'弃牌阶段结束后,你可以选择一项:1.令至多X名角色各摸一张牌。2.对任意名体力值之和为X的角色造成1点伤害,若你以此法选择的角色数不小于2,你失去1点体力。(X为你此阶段弃置的牌数)', - xinzhizheng:'掣政', - xinzhizheng_info:'锁定技,你的出牌阶段内,攻击范围内不包含你的其他角色不能成为你使用牌的目标。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。', - xinlijun:'立军', - xinlijun_info:'主公技,其他吴势力角色于其回合内使用【杀】结算完毕后,其可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌。', - xin_zhangyi:'手杀界张嶷', - xin_zhangyi_prefix:'手杀界', - xinwurong:'怃戎', - xinwurong_info:'出牌阶段限一次,你可以与一名其他角色进行谋弈:
  • 若你选择“镇压”且其选择“反抗”,你对其造成1点伤害,然后你摸一张牌。
  • 若你选择“安抚”且其选择“归顺”,其须交给你两张牌(若其牌数不足两张,则改为令其跳过其下个摸牌阶段)。
  • 若你选择“镇压”且其选择“归顺”,你获得其一张牌,然后你交给其两张牌。
  • 若你选择“安抚”且其选择“反抗”,你受到1点伤害,然后你摸两张牌。', - xin_guozhao:'手杀郭照', - xin_guozhao_prefix:'手杀', - yichong:'易宠', - yichong_info:'①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的装备牌和其一张此花色的手牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到一张牌)。', - wufei:'诬诽', - wufei_info:'若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于3,则你可以令A受到1点无来源伤害。', - yj_zhoubuyi:'☆周不疑', - yj_zhoubuyi_prefix:'☆', - mbhuiyao:'慧夭', - mbhuiyao_info:'出牌阶段限一次。你可以受到1点无来源伤害,然后你选择一名其他角色,令其视为对另一名角色造成过1点伤害。', - mbquesong:'雀颂', - mbquesong_info:'一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸X张牌并复原武将牌(X为3,若其装备区非宝物牌牌数不小于三张则X为2);2.回复1点体力。', - xin_yuanshao:'手杀界袁绍', - xin_yuanshao_prefix:'手杀界', - re_baosanniang:'手杀鲍三娘', - re_baosanniang_prefix:'手杀', - re_liushan:'手杀界刘禅', - re_liushan_prefix:'手杀界', - re_sunben:'界孙笨', - re_sunben_prefix:'界', - re_zhangzhang:'手杀界张昭张纮', - re_zhangzhang_prefix:'手杀界', - re_caozhi:'手杀界曹植', - re_caozhi_prefix:'手杀界', - re_sunjian:'手杀界孙坚', - re_sunjian_prefix:'手杀界', - sunru:'手杀孙茹', - sunru_prefix:'手杀', - pangdegong:"手杀庞德公", - pangdegong_prefix:'手杀', - zhaotongzhaoguang:"手杀赵统赵广", - zhaotongzhaoguang_prefix:'手杀', - re_liru:'手杀界李儒', - re_liru_prefix:'手杀界', - re_chenqun:'手杀界陈群', - re_chenqun_prefix:'手杀界', - re_liru:'手杀界李儒', - re_liru_prefix:'手杀界', - re_chenqun:'手杀界陈群', - re_chenqun_prefix:'手杀界', - old_yuanshu:'手杀袁术', - old_yuanshu_prefix:'手杀', - baoxin:'鲍信', - mutao:'募讨', - mutao_info:'出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。', - yimou:'毅谋', - yimou_info:'当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。', - jiangji:'手杀蒋济', - jiangji_prefix:'手杀', - jilun:'机论', - jilun_info:'①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸两张牌。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。', - liwei:'李遗', - jiaohua:'教化', - jiaohua_backup:'教化', - jiaohua_info:'出牌阶段限两次,你可以选择一个未被〖教化〗记录过的牌的类型,令一名角色从牌堆中获得一张此类型的牌,然后记录此类型,若基本、锦囊、装备均已被你发动〖教化〗记录,则你清空〖教化〗记录。', - laimin:'来敏', - laishou:'来寿', - laishou_info:'锁定技。①当你受到伤害值大于等于你的体力值的伤害时,若你的体力上限小于9,你防止此伤害并增加等量体力上限。②准备阶段,若你的体力上限不小于9,你死亡。', - luanqun:'乱群', - luanqun_info:'出牌阶段限一次,若你有手牌,则你可以令所有有手牌的角色同时展示一张手牌,然后你可以获得其中一张与你展示的牌颜色相同的展示牌,所有本次展示牌颜色与你展示的牌颜色不同的角色的下个出牌阶段使用的第一张【杀】只能对你使用,且此【杀】不可被响应。', - xin_wuban:'吴班', - xinjintao:'进讨', - xinjintao_info:'锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】不可被响应,第二张【杀】伤害+1。', - xinlianhuan:'连环', - xinlianhuan_info:'你可以将一张♣手牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。', - mb_sunluyu:'手杀孙鲁育', - mb_sunluyu_prefix:'手杀', - mbmumu:'穆穆', - mbmumu_info:'出牌阶段开始时,你可以选择一项:1.弃置场上的一张装备牌;2.获得场上的一张防具牌,然后你本回合不能使用或打出【杀】。', - mbmeibu:'魅步', - mbmeibu_info:'其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。', - mbzhixi:'止息', - mbzhixi_info:'锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。', - yanxiang:'阎象', - kujian:'苦谏', - kujian_info:'出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。', - mb_xianglang:'手杀向朗', - mb_xianglang_prefix:'手杀', - naxue:'纳学', - naxue_info:'你可以跳过出牌阶段。若如此做,你可以弃置任意张牌并摸等量的牌,然后你可以交给至多两名其他角色各一张手牌。', - yijie:'遗诫', - yijie_info:'锁定技。当你死亡时,你令所有其他角色将体力回复或失去至X(X为所有其他角色的体力之和除以所有其他角色数,向下取整,且X至少为1)。', - mb_chengui:'手杀陈珪', - mb_chengui_prefix:'手杀', - guimou:'诡谋', - guimou_info:'锁定技。游戏开始时/回合结束时,你随机/须选择以下一项直到你的下个准备阶段:①记录场上期间角色使用牌数;②记录期间场上角色弃置牌数;③记录期间场上角色获得牌数。准备阶段,你可以选择一名场上对应记录数值最少的其他角色,观看其手牌并选择其中一张牌,然后你将此牌交给另一名其他角色或弃置此牌。', - zhouxian:'州贤', - zhouxian_info:'锁定技。当你成为其他角色使用的伤害类卡牌的目标后,你亮出牌堆顶的三张牌,然后其须选择一项:①弃置一张与亮出牌之一类别相同的牌;②令此牌对你无效。', - mb_huban:'手杀胡班', - mb_huban_prefix:'手杀', - mbyilie:'义烈', - mbyilie2:'义烈', - mbyilie3:'义烈', - mbyilie_info:'锁定技。①游戏开始时,你选择一名其他角色,然后你获得以下效果:其受到伤害时,若你没有“烈”,则你获得等同于伤害值的“烈”标记,然后防止此伤害;其对其他角色造成伤害后,你回复1点体力。②结束阶段,你摸一张牌并失去X点体力,然后移去所有“烈”(X为你拥有的“烈”标记数)。', - muludawang:'木鹿大王', - shoufa:'兽法', - shoufa_info:'当你受到伤害后/于一回合首次造成伤害后,你可以选择一名与你距离大于/不大于2的角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。', - shoufa_info_doudizhu:'当你受到伤害后/于一回合首次造成伤害后,你可以选择一名角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。', - yuxiang:'御象', - yuxiang_info:'锁定技,若你有护甲值,则:①你计算与其他角色的距离-1,其他角色计算与你的距离+1;②当你受到火焰伤害时,此伤害+1。', - zhoulin:'咒鳞', - zhoulin_info:'限定技,出牌阶段,你可以获得2点护甲值,然后选择一个“兽法”效果,你发动〖兽法〗的执行效果改为你选择的效果直到你的下个回合结束。', - xin_huojun:'手杀霍峻', - xin_huojun_prefix:'手杀', - sidai:'伺怠', - sidai_info:'限定技,出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限。', - jieyu:'竭御', - jieyu_info:'结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为4-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。', - jieyu_info_identity:'结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为3-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。', - yangfeng:'杨奉', - mbxuetu:'血途', - mbxuetu_info:'转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。', - mbxuetu_achieve:'血途·成功', - mbxuetu_achieve_info:'出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。', - mbxuetu_fail:'血途·失败', - mbxuetu_fail_info:'转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。', - mbweiming:'威命', - mbweiming_info:'使命技,锁定技。①出牌阶段开始时,你记录一名未以此法记录过的角色。②成功:当你杀死一名未被〖威命①〗记录过的角色后,修改〖血途〗为成功版本。③失败:当一名被〖威命①〗记录过的角色死亡后,你修改〖血途〗为失败版本。', - lizhaojiaobo:'李昭焦伯', - mbzuoyou:'佐佑', - mbzuoyou_info:'转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。', - mbshishou:'侍守', - mbshishou_info:'锁定技。当你发动〖佐佑〗后,若目标角色不为你,你执行〖佐佑〗中目标角色未执行的一项。', - chengji:'成济', - mbkuangli:'狂戾', - mbkuangli_info:'锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你与其各随机弃置一张牌,然后你摸一张牌。③回合结束时,你移除所有角色的“狂戾”。', - mbxiongsi:'凶肆', - mbxiongsi_info:'限定技。出牌阶段,若你的手牌数不少于三张,你可以弃置所有手牌,然后令所有其他角色依次失去1点体力。', - mb_sp_guanqiujian:'SP毌丘俭', - mb_sp_guanqiujian_prefix:'SP', - mbcuizhen:'摧阵', - mbcuizhen_info_identity:'①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。', - mbcuizhen_info:'①当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。②摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。', - mbkuili:'溃离', - mbkuili_info:'锁定技。当你受到伤害后,你弃置等同于伤害值的手牌;若来源有被废除的武器栏,你令其恢复武器栏。', - mb_caomao:'手杀曹髦', - mb_caomao_prefix:'手杀', - mbqianlong:'潜龙', - mbqianlong_info:'①游戏开始时,你获得20枚“道心”标记。②当你得到牌后/受到1点伤害后/造成1点伤害后,你获得5/10/15枚“道心”(上限为100枚)。③若你的“道心”数不小于25/50/75/100,你视为拥有〖清正〗/〖酒诗〗/〖放逐〗/〖决进〗。', - mbcmqingzheng:'清正', - mbcmqingzheng_info:'出牌阶段开始时,你可以弃置两种花色的所有手牌,并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。', - mbcmjiushi:'酒诗', - mbcmjiushi_info:'①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌背面向上,你可以翻面。③当你翻面后,你获得牌堆里的一张锦囊牌。', - mbcmfangzhu:'放逐', - mbcmfangzhu_info:'出牌阶段限一次。你可以选择一名其他角色,选择一项:⒈令其不能使用手牌中的非锦囊牌直到其回合结束;⒉令其所有非Charlotte技能失效直到其回合结束。', - mbjuejin:'决进', - mbjuejin_info:'限定技。出牌阶段,你可以令所有角色依次将体力回复或失去至1并获得X点护甲(X为一名角色以此法变化的体力值)。然后你增加如下“向死存魏”的全局技能:当有牌进入弃牌堆后,系统将这些牌中的【闪】、【桃】和【酒】移出游戏。', - mbweitong:'卫统', - mbweitong_info:'主公技。游戏开始时,若你有〖潜龙〗,你获得20X枚“道心”(X为其他魏势力角色数)。', + mobile_yijiang: "将星独具", + yj_zhanghe: "☆张郃", + yj_zhanghe_prefix: "☆", + yj_zhangliao: "☆张辽", + yj_zhangliao_prefix: "☆", + yj_xuhuang: "☆徐晃", + yj_xuhuang_prefix: "☆", + yj_ganning: "☆甘宁", + yj_ganning_prefix: "☆", + xhzhiyan: "治严", + xhzhiyan_info: + "出牌阶段,若你的手牌数不等于体力上限,则你可以将手牌摸至/弃至手牌上限,然后本回合不能对其他角色使用牌/可以将弃置的一张牌交给一名其他角色。", + zhilve: "知略", + zhilve_info: + "锁定技,准备阶段,你选择一项:1.移动场上装备区的一张牌并失去1点体力。2.移动场上判定区的一张牌并令本回合手牌上限-1。3.本回合摸牌阶段多摸一张牌且使用的第一张【杀】无距离限制且不计入次数限制。", + xinzhilve: "知略", + xinzhilve_backup: "知略", + xinzhilve_mark: "知略", + xinzhilve_info: + "出牌阶段限一次,你可以失去1点体力并选择一项:1.移动场上的一张牌;2.视为使用一张无距离限制且不计入次数限制的【杀】并摸一张牌。然后你本回合的手牌上限+1。", + xinxhzhiyan: "治严", + xinxhzhiyan_false: "治严", + xinxhzhiyan_info: + "出牌阶段每项各限一次,若你的手牌数:大于体力值,则你可以将X张手牌交给一名其他角色(X为你的手牌数与体力值之差);小于体力上限,则你可以摸X张牌且本阶段内不能再对其他角色使用牌。(X为你的手牌数与体力上限之差)", + weifeng: "威风", + weifeng2: "威风", + weifeng3: "威风", + weifeng_info: + "锁定技,当你于出牌阶段内使用第一张伤害性基本牌或普通锦囊牌后,你令此牌的一名没有“惧”的其他目标角色获得一枚名称为此牌牌名的“惧”。有“惧”的角色受到伤害时,其移去“惧”,然后若造成伤害的牌名称和“惧”:相同,此伤害+1;不同,你获得该角色的一张牌。准备阶段开始时或你死亡时,你移去场上的所有“惧”。", + gnjinfan: "锦帆", + gnjinfan_gain: "锦帆", + gnjinfan_info: + "弃牌阶段开始时,你可将任意张手牌置于武将牌上,称为“铃”(每种花色的“铃”限一张)。你可以如手牌般使用或打出“铃”。当有“铃”移动到处理区后,你从牌堆中获得与“铃”花色相同的一张牌。", + gnsheque: "射却", + gnsheque_info: + "一名其他角色的准备阶段开始时,若其装备区内有牌,则你可以对其使用一张【杀】(无距离关系的限制且无视防具)。", + sp_sufei: "手杀苏飞", + sp_sufei_prefix: "手杀", + zhengjian: "诤荐", + zhengjian_draw: "诤荐", + zhengjian_mark: "诤荐", + zhengjian_info: + "锁定技,结束阶段,你令一名角色获得一枚“诤”。回合开始时,你令有“诤”的角色移去“诤”并摸X张牌(X为其最后一次获得“诤”后使用和打出的牌数,且至多不能超过其体力上限或5)。", + gaoyuan: "告援", + gaoyuan_info: + "当你成为【杀】的目标时,你可弃置一张牌将此【杀】转移给一名有“诤”且不是此【杀】使用者的其他角色。", + tongqu: "通渠", + tongqu_info: + "游戏开始时,你拥有一个“渠”标记。准备阶段,你可以失去1点体力令一名没有“渠”标记的角色获得“渠”标记。有“渠”的角色摸牌阶段额外摸一张牌,然后将一张牌交给其他有“渠”的角色或弃置。若以此法给出的是装备牌则使用之。当有“渠”的角色进入濒死状态时,移除其“渠”标记。", + xinwanlan: "挽澜", + xinwanlan_info: + "当一名角色受到伤害值不小于体力值的伤害时,你可以弃置装备区中的所有牌(至少一张) 防止此伤害。", + re_xusheng: "手杀界徐盛", + re_xusheng_prefix: "手杀界", + re_dongzhuo: "手杀界董卓", + re_dongzhuo_prefix: "手杀界", + rejiuchi: "酒池", + rejiuchi_info: + "你可以将一张黑桃手牌当做【酒】使用。当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的〖崩坏〗失效直到回合结束。", + furong: "手杀傅肜", + furong_prefix: "手杀", + xuewei: "血卫", + xuewei_info: + "准备阶段,你可以选择一名其他角色(仅自己可见)。若如此做,直到你的下回合开始前,当其第一次受到伤害时,你防止此伤害,改为由你受到等量的伤害并对伤害来源造成等量同属性的伤害。", + liechi: "烈斥", + liechi_info: "锁定技,当你进入濒死状态时,伤害来源弃置一张牌。", + xin_liaohua: "手杀界廖化", + xin_liaohua_prefix: "手杀界", + redangxian: "当先", + redangxian_info: "锁定技,回合开始时,你从弃牌堆中获得一张【杀】并进行一个额外的出牌阶段。", + refuli: "伏枥", + refuli_info: + "限定技,当你处于濒死状态时,你可以将体力值回复至X点(X为势力数)。然后若你的体力值为全场唯一最多,你翻面。", + xin_caozhang: "手杀界曹彰", + xin_caozhang_prefix: "手杀界", + rejiangchi: "将驰", + rejiangchi_info: + "出牌阶段开始时,你可以选择一项:1、摸一张牌,若如此做,你本阶段内不能使用【杀】。 2、弃置一张牌,若如此做,此阶段你使用【杀】无距离限制且你可以额外使用一张【杀】。", + rezhenxing: "镇行", + rezhenxing_info: + "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", + xin_jianyong: "手杀界简雍", + xin_jianyong_prefix: "手杀界", + xinqiaoshui: "巧说", + xinqiaoshui_info: + "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,则你本阶段内使用的下一张基本牌或普通锦囊牌可以增加减少一个目标。若你没赢,你本阶段内不能使用锦囊牌。", + xinjyzongshi: "纵适", + xinjyzongshi_info: + "当你拼点后,你可以观看牌堆顶的一张牌,然后选择一项:获得此牌,或获得两张拼点牌中点数较小的一张。", + dingyuan: "手杀丁原", + dingyuan_prefix: "手杀", + beizhu: "备诛", + beizhu_draw: "备诛", + beizhu_info: + "出牌阶段限一次,你可以观看一名其他角色的手牌。若其中:没有【杀】,你弃置其一张牌,然后你可令其获得牌堆中的一张【杀】;有【杀】,其依次对你使用这些【杀】,当你因此受到1点伤害后,你摸一张牌。", + xin_zhuran: "手杀界朱然", + xin_zhuran_prefix: "手杀界", + mobiledanshou: "胆守", + mobiledanshou_info: + "一名其他角色的结束阶段开始时,若X:为0,你摸一张牌;不等于0,你可弃置X张牌并对其造成1点伤害(X为其本回合内使用的目标包含你的牌的数量)。", + yanghuiyu: "羊徽瑜", + hongyi: "弘仪", + hongyi2: "弘仪", + hongyi_info: + "出牌阶段限一次,你可以选择一名其他角色。你的下回合开始前,该角色造成伤害时进行判定,若结果为:黑色,此伤害-1。红色,受到伤害的角色摸一张牌。", + requanfeng: "劝封", + requanfeng_gain: "劝封", + requanfeng_info: + "限定技。①其他角色死亡时,你可失去〖弘仪〗,然后获得其武将牌上的所有非主公技,非隐匿技和非Charlotte技,加1点体力上限并回复1点体力。②当你处于濒死状态时,你可以加2点体力上限,然后回复4点体力。", + quanfeng: "劝封", + quanfeng_info: + "锁定技,限定技,一名角色死亡时,你选择获得其的一个技能(主公技,限定技,觉醒技,隐匿技,使命技,带有Charlotte标签的技能除外),然后加1点体力上限并回复1点体力。", + simashi: "手杀司马师", + simashi_prefix: "手杀", + baiyi: "败移", + baiyi_info: "限定技,出牌阶段,若你已受伤,你可以交换两名其他角色的座次。", + jinglve: "景略", + jinglve2: "景略", + jinglve3: "景略", + jinglve_info: + "出牌阶段限一次,若场上没有与你对应的「死士」牌,则你可以观看一名其他角色的手牌,将其中一张牌标记为「死士」。当其使用对应的实体牌中包含「死士」的牌时,你取消此牌的所有目标。当「死士」牌不因使用而进入弃牌堆,或其回合结束后,若「死士」牌仍在其区域内,则你获得此牌。", + shanli: "擅立", + shanli_info: + "觉醒技,准备阶段,若你已发动过〖败移〗且对至少两名角色发动过〖景略〗,则你减1点体力上限并选择一名角色。系统随机选择三个不为〖忘隙(仲村由理)〗的主公技,然后你选择其中一个技能,令其获得之。其将交互表情中的【拖鞋】和【酒杯】替换为【枷锁】和【玉玺】。", + re_lingtong: "手杀界凌统", + re_lingtong_prefix: "手杀界", + re_liubiao: "手杀界刘表", + re_liubiao_prefix: "手杀界", + hucheer: "手杀胡车儿", + hucheer_prefix: "手杀", + daoji: "盗戟", + daoji_info: + "出牌阶段限一次,你可以弃置一张非基本牌并选择一名装备区里有牌的其他角色,你获得其装备区中的一张牌并使用之。若你以此法得到的牌是武器牌,则你使用此牌后对其造成1点伤害。", + xin_hansui: "手杀韩遂", + xin_hansui_prefix: "手杀", + xinniluan: "逆乱", + xinniluan_info: + "其他角色的结束阶段,若其本回合对除其以外的角色使用过牌,则你可以对其使用一张【杀】。若以此法使用的【杀】造成伤害,则你弃置其一张牌。", + xiaoxi_hansui: "骁袭", + xiaoxi_hansui_info: "你可以将一张黑色牌当做【杀】使用或打出。", + xin_zhangfei: "手杀界张飞", + xin_zhangfei_prefix: "手杀界", + liyong: "厉勇", + liyong2: "厉勇", + liyong3: "厉勇", + liyong_info: + "锁定技,若你于出牌阶段内使用的【杀】被【闪】抵消,则你获得如下效果:你本回合使用的下一张【杀】不可被响应且伤害+1,指定的目标本回合非锁定技失效,当此【杀】造成伤害后,若目标角色未死亡,你失去1点体力。", + gongsunkang: "公孙康", + juliao: "据辽", + juliao_info: "锁定技,其他角色计算与你的距离始终+X(X为场上势力数-1)。", + taomie: "讨灭", + taomie1: "讨灭", + taomie2: "讨灭", + taomie3: "讨灭", + taomie4: "讨灭", + taomie_info: + "当你受到伤害后或当你造成伤害后,你可以令伤害来源或受伤角色获得“讨灭”标记(如场上已有标记则转移给该角色);你和拥有“讨灭”标记的角色视为在彼此的攻击范围内,且当你对该角色造成伤害时,选择一项:1. 此伤害+1;2. 你获得其区域内的一张牌并可将之交给另一名角色;3. 依次执行前两项并于伤害结算后弃置其“讨灭”标记。", + xin_guohuai: "手杀界郭淮", + xin_guohuai_prefix: "手杀界", + mobilejingce: "精策", + mobilejingce_info: + "结束阶段,若此回合因使用或打出而置入弃牌堆的牌的数量不小于你的体力值,则你可以摸两张牌。", + xin_panzhangmazhong: "手杀界潘璋马忠", + xin_panzhangmazhong_prefix: "手杀界", + xinduodao: "夺刀", + xinduodao_info: "当你受到伤害后,你可以获得伤害来源装备区里的武器牌。", + xinanjian: "暗箭", + xinanjian_info: + "锁定技,当你使用【杀】指定目标后,若你不在目标角色攻击范围内,你选择一项:1. 令其无法响应此【杀】;2. 其受到此【杀】造成的伤害+1。", + xin_fuhuanghou: "手杀界伏寿", + xin_fuhuanghou_prefix: "手杀界", + xinzhuikong: "惴恐", + xinzhuikong_info: + "每轮限一次,其他角色的回合开始时,若其体力值不小于你,你可与其拼点。若你赢,其本回合无法使用牌指定除其以外的角色为目标;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。", + xinqiuyuan: "求援", + xinqiuyuan_info: + "当你成为【杀】的目标时,你可以令另一名其他角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标。", + xin_gongsunzan: "手杀界公孙瓒", + xin_gongsunzan_prefix: "手杀界", + re_dengai: "手杀界邓艾", + re_dengai_prefix: "手杀界", + flappybird: "飞鸟", + flappybird_info: "出牌阶段,你可游玩一局Flappy Bird。", + re_handang: "手杀界韩当", + re_handang_prefix: "手杀界", + nanhualaoxian: "手杀南华老仙", + nanhualaoxian_prefix: "手杀", + yufeng: "御风", + yufeng2: "御风", + yufeng_info: + "出牌阶段限一次,你可以表演“御风飞行”。若表演失败,则你摸X张牌。若表演成功,则你可以选择至多X名其他角色获得“御风”效果,然后摸X-Y张牌(准备阶段开始时,你进行判定。若结果为:红色,你跳过摸牌阶段;黑色,你跳过出牌阶段和弃牌阶段。X为你的得分。Y为你选择的角色数)。", + tianshu: "天书", + tianshu_info: + "出牌阶段开始时,若场上没有【太平要术】,则你可以弃置一张牌并选择一名角色。该角色获得并使用【太平要术】。", + re_jiangwei: "手杀界姜维", + re_jiangwei_prefix: "手杀界", + retiaoxin: "挑衅", + retiaoxin_info: + "出牌阶段限一次,你可以指定一名有牌的其他角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。", + re_zhurong: "手杀界祝融", + re_zhurong_prefix: "手杀界", + relieren: "烈刃", + relieren_info: + "当你使用【杀】指定目标后,你可以和目标角色进行拼点。若你赢,你获得其一张牌。若你没赢,你获得对方的拼点牌,其获得你的拼点牌。", + zhouqun: "周群", + tiansuan: "天算", + tiansuan_info: + "出牌阶段限一次,若场上没有因你产生的“命运签”,则你可以抽取一张“命运签”,然后令一名角色获得“命运签”直到你的下回合开始。若你以此法抽取的“命运签”为:上上签,你观看其手牌;上上签/上签,你获得其区域内的一张牌。", + tiansuan_faq: "【命运签】说明", + tiansuan_faq_info: + "当你抽取“命运签”时,你可以令其中一种命运签的权重+1。
    上上签(权重1):当你受到伤害时,防止此伤害。
    上签(权重2):当你受到伤害时,你令伤害值改为1;当你受到1点伤害后,你摸一张牌。
    中签(权重3):当你受到伤害时,你令伤害属性改为火属性并将伤害值改为1。
    下签(权重2):当你受到伤害时,你令此伤害+1。
    下下签(权重1):当你受到伤害时,你令此伤害+1。你不能使用【酒】或【桃】。", + tiansuan2_0: "命运签", + tiansuan2_1: "命运签", + tiansuan2_2: "命运签", + tiansuan2_damage: "命运签", + tiansuan2_fire: "命运签", + tiansuan2_3: "命运签", + tiansuan2_4: "命运签", + ol_yujin: "手杀界于禁", + ol_yujin_prefix: "手杀界", + rejieyue: "节钺", + rejieyue_info: + "结束阶段开始时,你可以将一张牌交给一名其他角色。然后其选择一项:令你摸三张牌:或其保留一张手牌和装备区的牌,然后弃置其余的牌。", + xin_zhoucang: "手杀界周仓", + xin_zhoucang_prefix: "手杀界", + mobilezhongyong: "忠勇", + mobilezhongyong_info: + "当你于出牌阶段内使用的【杀】结算结束后,若没有目标角色使用【闪】响应过此【杀】,则你可获得此【杀】;否则你可选择一项:①获得目标角色使用的【闪】,然后可将此【杀】交给另一名其他角色。②将目标角色使用的【闪】交给另一名其他角色,然后你本回合使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1。(你不能使用本回合因执行〖忠勇〗的效果得到的牌)", + xin_caifuren: "手杀界蔡夫人", + xin_caifuren_prefix: "手杀界", + xinqieting: "窃听", + xinqieting_info: + "其他角色的回合结束时,若其本回合内未对其他角色造成过伤害,则你可选择一项:①摸一张牌。②观看其两张手牌并获得其中的一张。③将其装备区内的一张牌移动至你的装备区。", + xinguixiu: "闺秀", + xinguixiu_info: "锁定技。结束阶段,若你的体力值为:奇数,你摸一张牌;偶数,你回复1点体力。", + re_zhonghui: "手杀界钟会", + re_zhonghui_prefix: "手杀界", + requanji: "权计", + requanji_info: + "出牌阶段结束时,若你的手牌数大于体力值,或当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", + xin_guyong: "手杀界顾雍", + xin_guyong_prefix: "手杀界", + xinshenxing: "慎行", + xinshenxing_info: + "出牌阶段限X次(X为你的体力值),你可以弃置两张牌,然后摸一张牌。若这两张牌颜色不同,则改为摸两张牌。", + xinbingyi: "秉壹", + xinbingyi_info: + "结束阶段,你可展示所有手牌。若这些牌的颜色或类型均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数)。", + qiaozhou: "手杀谯周", + qiaozhou_prefix: "手杀", + zhiming: "知命", + zhiming_info: "准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。", + xingbu: "星卜", + xingbu_info: + "结束阶段,你可以亮出牌堆顶的三张牌,然后你可以根据X值(X为这三张牌中红色牌的数量),令一名其他角色获得对应的效果直到其下回合结束:①三张:其摸牌阶段多摸两张牌,使用【杀】的次数上限+1。②两张:其使用【杀】的次数上限-1,跳过弃牌阶段。③小于两张:其于准备阶段开始时弃置一张手牌。", + xin_sunluban: "手杀界孙鲁班", + xin_sunluban_prefix: "手杀界", + xinzenhui: "谮毁", + xinzenhui_info: + "出牌阶段限一次。当你使用【杀】或黑色普通锦囊牌指定目标时,你可选择另一名能成为此牌目标的其他角色并选择一项:①令其也成为此牌的目标。②获得其一张牌,然后将此牌的使用者改为该角色。", + xinjiaojin: "骄矜", + xinjiaojin_info: "当你受到男性角色造成的伤害时,你可以弃置一张装备牌并防止此伤害。", + xin_caozhen: "手杀界曹真", + xin_caozhen_prefix: "手杀界", + discretesidi: "司敌", + discretesidi_info: + "①当你使用的不为延时锦囊牌的牌结算结束后,你可选择一名R内不存在以a为第一序偶的二元序偶的其他角色a,并选择一名角色b,在关系R内建立二元序偶<a,b>(b对其他角色不可见)。②一名角色a使用不为延时锦囊牌的牌指定b为目标时,若(aRb)∧(此牌目标数为1)为真,则{你从R内移除<a,b>,且:若b为你,你摸一张牌;若b不为你,你可选择:⒈取消此牌的目标,然后若场上没有处于濒死状态的角色,则你对a造成1点伤害。⒉摸两张牌};否则{你清除R内以a为第一元素的二元序偶}。", + fuqian: "傅佥", + jueyong: "绝勇", + jueyong_info: + "锁定技。①当你不因〖绝勇〗成为唯一牌的目标时,若此牌不为转化牌且对应的实体牌牌数为1且不为【桃】或【酒】且你的“绝”数小于你的体力值,则你将此牌置于你的武将牌上,称为“绝”,且取消此牌的目标。②结束阶段开始时,若你有“绝”,则你令所有“绝”的原使用者依次对你使用所有“绝”,将无法使用的“绝”置入弃牌堆。", + poxiang: "破降", + poxiang_info: + "出牌阶段限一次。你可以将一张牌交给一名其他角色。你摸三张牌(不计入本回合的手牌上限),移去所有“绝”并失去1点体力。", + simafu: "司马孚", + xunde: "勋德", + xunde_info: + "一名角色受到伤害后,若你至其的距离不大于1,则你可判定。若判定结果:大于5,你令该角色获得判定牌;小于7,你令伤害来源弃置一张牌。", + chenjie: "臣节", + chenjie_info: + "一名角色的判定牌生效前,你可打出一张花色相同的牌。系统将你打出的牌作为新判定牌,将原判定牌置入弃牌堆。然后你摸两张牌。", + mayuanyi: "马元义", + jibing: "集兵", + jibing_info: + "①摸牌阶段开始时,若你的“兵”数小于势力数,则你可以改为将牌堆顶的两张牌置于你的武将牌上,称为“兵”。②你可以将一张“兵”当做【杀】或【闪】使用或打出。", + wangjing: "往京", + wangjing_info: + "锁定技。当你因〖集兵〗而使用或打出牌时,若对方是场上体力值最高的角色,则你摸一张牌。", + moucuan: "谋篡", + moucuan_info: "觉醒技。准备阶段,若你的“兵”数不小于势力数,则你减1点体力上限并获得〖兵祸〗。", + binghuo: "兵祸", + binghuo_info: + "一名角色的结束阶段开始时,若你本回合内因〖集兵〗而使用或打出过牌,则你可令一名角色判定。若判定结果为黑色,则你对其造成1点雷属性伤害。", + yanpu: "阎圃", + huantu: "缓图", + huantu_info: + "每轮限一次。一名角色的摸牌阶段开始前,若其在你攻击范围内,则你可以交给其一张牌并令其跳过此阶段。然后你于此回合的结束阶段选择一项:①令其回复1点体力并摸两张牌。②你摸三张牌,然后交给其两张手牌。", + bihuo: "避祸", + bihuo_info: + "限定技。一名角色脱离濒死状态时,你可以令其摸三张牌,然后其他角色计算至其的距离时+X直到本轮结束(X为角色数)。", + sunhanhua: "手杀孙寒华", + sunhanhua_prefix: "手杀", + chongxu: "冲虚", + chongxu_info: + "出牌阶段限一次,你可以随机演奏一首音乐,并根据完成度来获得相应的分数(至多五分)。然后你可修改〖妙剑〗或〖莲华〗(消耗3分),并使用剩余的分数进行摸牌(每张2分)。", + chongxu_faq: "目前的曲库", + chongxu_faq_info: + " 
    《鸟之诗》- 折户伸治
    《竹取飛翔 ~ Lunatic Princess》- ZUN
    《ignotus》- ak+q
    《Super Mario 3D World Theme》- 横田真人
    《只因你太美》- SWIN-S
    《Croatian Rhapsody》- Maksim
    《罗刹海市》- 刀郎
    《Pigstep (Stereo Mix)》- Lena Raine", + miaojian: "妙剑", + miaojian_info: + "出牌阶段限一次。你可将一张【杀】当做刺【杀】使用,或将一张锦囊牌当做【无中生有】使用。", + miaojian1: "妙剑·改", + miaojian1_info: + "出牌阶段限一次。你可将一张基本牌当做刺【杀】使用,或将一张非基本牌当做【无中生有】使用。", + miaojian2: "妙剑·极", + miaojian2_info: "出牌阶段限一次。你可视为使用一张刺【杀】或【无中生有】。", + shhlianhua: "莲华", + shhlianhua_info: "当你成为【杀】的目标后,你摸一张牌。", + shhlianhua1: "莲华·改", + shhlianhua1_info: + "当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。", + shhlianhua2: "莲华·极", + shhlianhua2_info: + "当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。", + re_yufan: "手杀界虞翻", + re_yufan_prefix: "手杀界", + rezongxuan: "纵玄", + rezongxuan_place: "纵玄", + rezongxuan_info: + "当你的牌因弃置而进入弃牌堆后,你可以将其以任意顺序置于牌堆顶。出牌阶段限一次,你可以摸一张牌,然后将一张牌置于牌堆顶。", + yj_huangzhong: "☆黄忠", + yj_huangzhong_prefix: "☆", + spshidi: "势敌", + spshidi_info: + "转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。", + spyishi: "义释", + spyishi_info: + "当你对装备区有牌的其他角色造成伤害时,你可令此伤害-1,然后获得其装备区内的一张牌。", + spqishe: "骑射", + spqishe_info: "你可以将一张装备牌当做【酒】使用。你的手牌上限+X(X为你装备区内的牌数)。", + sp_maojie: "毛玠", + bingqing: "秉清", + bingqing_info: + "当你于出牌阶段内使用的牌结算结束后,若你于本阶段内使用的所有已结算结束的其他牌与此牌花色均不相同,则你可根据X的值执行对应效果:为2,你令一名角色摸两张牌;为3,你弃置一名角色区域内的一张牌;为4,你对一名其他角色造成1点伤害。(X为你本阶段内使用过的已结算结束的牌中包含的花色数)", + yingfeng: "迎奉", + yingfeng_info: + "准备阶段,你可以令一名角色获得“奉”标记并移除场上所有其他的“奉”标记。有“奉”标记的角色使用牌没有距离限制。", + xin_sunxiu: "手杀界孙休", + xin_sunxiu_prefix: "手杀界", + mobileyanzhu: "宴诛", + mobileyanzhu_info: + "出牌阶段限一次,你可以令一名有牌的其他角色选择一项:①你获得其装备区里所有的牌,然后你失去技能〖宴诛〗并修改技能〖兴学〗。②你获得其区域里的一张牌。", + mobilexingxue: "兴学", + mobilexingxue_info: + "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值)。", + mobilexingxuex: "兴学·改", + mobilexingxuex_info: + "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶或交给一名其他目标角色(X为你的体力上限)。", + re_wuguotai: "手杀界吴国太", + re_wuguotai_prefix: "手杀界", + reganlu: "甘露", + reganlu_info: + "出牌阶段限一次,你可以选择装备区牌数之差的绝对值不大于X的两名角色或包含你在内的两名角色,然后交换这两名角色装备区内的牌。(X为你已损失的体力值)", + taoqian: "手杀陶谦", + taoqian_prefix: "手杀", + miheng: "手杀祢衡", + miheng_prefix: "手杀", + re_gaoshun: "手杀界高顺", + re_gaoshun_prefix: "手杀界", + peixiu: "裴秀", + xingtu: "行图", + xingtu1: "倍数", + xingtu2: "约数", + xingtu_info: + "锁定技。你使用点数为X的倍数的牌无次数限制,你使用点数为X的约数的牌时摸一张牌(X为你本局游戏使用的上一张牌的点数)。", + juezhi: "爵制", + juezhi_info: + "出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为Y的牌(Y为这些牌的点数和对13取余,余数为0时Y取13)。", + sp_jianggan: "手杀蒋干", + sp_jianggan_prefix: "手杀", + spdaoshu: "盗书", + spdaoshu_info: + "每轮限一次。一名敌方角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", + spdaoshu_info_identity: + "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", + spdaoshu_info_guozhan: + "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", + mbdaoshu: "盗书", + mbdaoshu_info: + "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你和队友观看其手牌并猜测其伪装的手牌,猜对的角色对其造成1点伤害,猜错的角色随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + mbdaoshu_info_identity: + "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + mbdaoshu_info_guozhan: + "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + spdaizui: "戴罪", + spdaizui2: "戴罪", + spdaizui_info: + "限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。", + re_caiwenji: "手杀界蔡琰", + re_caiwenji_prefix: "手杀界", + re_bulianshi: "手杀界步练师", + re_bulianshi_prefix: "手杀界", + reanxu: "安恤", + reanxu_info: + "出牌阶段限一次,你可以选择两名其他角色,令其中一名角色获得另一名角色的一张牌。若以此法移动的牌不来自装备区,则你摸一张牌。然后你可以令二者中手牌数较少的一名角色摸一张牌。", + xin_jushou: "手杀界沮授", + xin_jushou_prefix: "手杀界", + xinjianying: "渐营", + xinjianying_info: + "①当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。②出牌阶段限一次,你可以将一张牌当做任意基本牌使用。若你于此阶段内使用的上一张牌有花色,则此牌的花色视为上一张牌的花色。", + re_xunyu: "手杀界荀彧", + re_xunyu_prefix: "手杀界", + rejieming: "节命", + rejieming_info: + "当你受到1点伤害后,你可以令一名角色摸两张牌。然后若其手牌数小于体力上限,则你摸一张牌。", + xin_quancong: "手杀界全琮", + xin_quancong_prefix: "手杀界", + sbyaoming: "邀名", + sbyaoming_info: + "蓄力技(2/4)。①当你受到1点伤害后,你可以获得1点蓄力值。②出牌阶段或当你受到伤害后,你可消耗1点蓄力值并选择一项:⒈弃置一名手牌数不小于你的角色的一张牌。⒉令一名手牌数不大于你的角色摸一张牌。若你上次发动〖邀名②〗时未获得过蓄力值且你选择的选项和上次不同,则你获得1点蓄力值。", + ruanhui: "阮慧", + mingcha: "明察", + mingcha_info: + "摸牌阶段开始时,你亮出牌堆顶的三张牌。若这三张牌中有点数小于9的牌,则你可以放弃摸牌并获得这些牌,然后你可以获得一名其他角色的随机一张牌。", + jingzhong: "敬重", + jingzhong_info: + "弃牌阶段结束时,若你于本阶段内弃置过至少两张黑色牌,则你可以选择一名其他角色并获得如下效果直到其回合结束:每阶段限三次,其于出牌阶段内使用的牌结算结束后,你获得此牌对应的实体牌。", + xin_mamidi: "手杀马日磾", + xin_mamidi_prefix: "手杀", + chengye: "承业", + chengye_info: + "锁定技。①其他角色使用的非转化牌结算结束后,或其他角色的装备牌和延时锦囊牌进入弃牌堆后,或有延时锦囊牌因其他角色执行判定阶段的流程而进入弃牌堆后,若你的“六经”有空缺的位置可以置入此牌,则你将此牌置于你武将牌上,填补“六经”的对应位置。②出牌阶段开始时,若你的“六经”没有空缺的位置,则你获得所有“六经”。", + chengye_append: + '
  • 《诗经》:伤害类锦囊牌
  • 《尚书》:基本牌
  • 《仪礼》:无懈可击
  • 《易经》:无中生有
  • 《乐经》:乐不思蜀
  • 《春秋》:装备牌', + buxu: "补叙", + buxu_backup: "补叙", + buxu_info: + "出牌阶段,若你的“六经”中有空缺的位置,则你可以弃置X+1张牌并选择一种空缺的“六经”(X为你本阶段内发动过〖补叙〗的次数)。系统从牌堆或弃牌堆中检索一张对应的牌,然后你将此牌置于你武将牌上,填补“六经”的对应位置。", + re_dianwei: "手杀界典韦", + re_dianwei_prefix: "手杀界", + liuye: "手杀刘晔", + liuye_prefix: "手杀", + sp_caosong: "手杀曹嵩", + sp_caosong_prefix: "手杀", + yijin: "亿金", + yijin_info: + "锁定技。①游戏开始时,你获得“膴仕”、“金迷”、“贾凶”、“通神”、“拥蔽”、“厚任”各1枚(均称为“金”)。②出牌阶段开始时,你选择一名没有“金”的其他角色。你交给其1枚“金”,且令其获得对应效果。③一名角色的回合结束后,若其有你交给其的“金”,其移去此“金”。④当你死亡时,移去场上所有你交出的“金”。⑤回合开始时,若你没有“金”,你死亡。", + yijin_wushi: "膴仕", + yijin_wushi_info: "锁定技。①摸牌阶段,你多摸四张牌。②你使用【杀】的次数上限+1。", + yijin_jinmi: "金迷", + yijin_jinmi_info: "锁定技。回合开始时,你跳过下一个出牌阶段和弃牌阶段。", + yijin_guxiong: "贾凶", + yijin_guxiong_info: "锁定技。①出牌阶段开始时,你失去1点体力。②你的手牌上限-3。", + yijin_tongshen: "通神", + yijin_tongshen_info: "锁定技。当你受到非雷电伤害时,防止之。", + yijin_yongbi: "拥蔽", + yijin_yongbi_info: "锁定技。准备阶段,你跳过下一个摸牌阶段。", + yijin_houren: "厚任", + yijin_houren_info: "锁定技。回合结束时,你回复3点体力。", + guanzong: "惯纵", + guanzong_info: "出牌阶段限一次。你可以令一名其他角色视为对另一名其他角色造成过1点伤害。", + yangfu: "杨阜", + jiebing: "借兵", + jiebing_info: + "锁定技。当你受到伤害后,你选择来源外的一名其他角色,随机获得其一张牌并展示。若此牌为装备牌,你使用之。", + hannan: "扞难", + hannan_info: "出牌阶段限一次。你可以与一名角色拼点,赢的角色对没赢的角色造成2点伤害。", + xin_wuyi: "手杀界吴懿", + xin_wuyi_prefix: "手杀界", + sbbenxi: "奔袭", + sbbenxi_info: + "出牌阶段开始时,你可以弃置至少一张牌,然后你于此阶段获得如下效果:①你至其他角色距离-X;②当你使用的下一张基本牌或普通锦囊牌A选择目标后,你可以额外指定X名距离为1的角色为目标;③牌A结算结束后,若此牌造成过伤害,你摸五张牌(X为你以此法弃置的牌数)。", + xin_zhuzhi: "手杀界朱治", + xin_zhuzhi_prefix: "手杀界", + sbanguo: "安国", + sbanguo_info: + "①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得1点护甲。", + wangjun: "手杀王濬", + wangjun_prefix: "手杀", + zhujian: "筑舰", + zhujian_info: "出牌阶段限一次。你可以令至少两名装备区里有牌的角色各摸一张牌。", + duansuo: "断索", + duansuo_info: + "出牌阶段限一次。你可以重置任意名处于连环状态的角色,然后对这些角色各造成1点火焰伤害。", + sp_pengyang: "手杀彭羕", + sp_pengyang_prefix: "手杀", + spdaming: "达命", + spdaming_info: + "①游戏开始时,你获得1点“达命”值。②其他角色A的出牌阶段限一次。其可以交给你一张牌,然后你选择另一名其他角色B。若B有与此牌相同类型的牌,其将一张该类型的牌交给A,你获得1点“达命”值;否则你将此牌交给A。", + spxiaoni: "嚣逆", + spxiaoni_info: + "①出牌阶段限一次。若你的“达命”值大于0,你可以将一张牌当任意一种【杀】或伤害类锦囊牌使用。然后你减少等同于此牌指定目标数的“达命”值。②你的手牌上限基数为X(X为“达命”值,且至多为你的体力值,至少为0)。", + xin_zhuhuan: "手杀界朱桓", + xin_zhuhuan_prefix: "手杀界", + xinpingkou: "平寇", + xinpingkou_info: + "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。然后你从牌堆中获得一张装备牌。", + xin_caoxiu: "手杀界曹休", + xin_caoxiu_prefix: "手杀界", + xinqingxi: "倾袭", + xinqingxi_info: + "每回合限一次。当你对其他角色造成伤害时,你可以令其选择一项:1.弃置X张手牌(X为4减去你至其的距离,至少为1);2.令此伤害+1。", + yj_weiyan: "☆魏延", + yj_weiyan_prefix: "☆", + mbguli: "孤厉", + mbguli_info: + "出牌阶段限一次。你可以将所有手牌当做一张无视防具的【杀】使用。此牌结算结束后,若此牌造成过伤害,你可以失去1点体力并将手牌摸至X张(X为你的体力上限)。", + mbaosi: "骜肆", + mbaosi_info: + "锁定技。当你于出牌阶段对一名攻击范围内的角色造成伤害后,你于此阶段对其使用牌无次数限制。", + xin_zhoutai: "手杀界周泰", + xin_zhoutai_prefix: "手杀界", + re_yanwen: "手杀界颜良文丑", + re_yanwen_prefix: "手杀界", + qianzhao: "手杀牵招", + qianzhao_prefix: "手杀", + mbshihe: "势吓", + mbshihe_info_identity: + "出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你造成伤害时,取消之;没赢,你随机弃置一张牌。", + mbshihe_info: + "出牌阶段限一次。你可以与一名角色拼点。若你:赢,当其于其下回合结束前对你和你的友方角色造成伤害时,取消之;没赢,你随机弃置一张牌。", + mbzhenfu: "镇抚", + mbzhenfu_info: "结束阶段,若你本回合因弃置失去过牌,你可以令一名其他角色获得1点护甲。", + shichangshi: "十常侍", + mbdanggu: "党锢", + mbdanggu_info: + "锁定技。①游戏开始时,你获得十张“常侍”牌,然后你进行一次结党。②当你修整结束后,你进行一次结党并摸一张牌。③若你有亮出的“常侍”牌,你视为拥有这些牌的技能。", + mbdanggu_faq: "关于结党", + mbdanggu_faq_info: + "
    系统随机选择一张未亮出过的“常侍”牌,然后选择四张未亮出过的“常侍”牌。你观看前者,然后从后者中选择一名认可前者的“常侍”牌。然后若此时不为双将模式,你将这两张武将牌作为你的武将牌(不移除原有技能);否则你获得这两张武将牌上的技能。", + mbdanggu_faq2: "关于认可", + mbdanggu_faq2_info: + "
    双向不认可常侍为固定组合:
  • 郭胜、段珪
  • 韩悝、毕岚
    单向不认可常侍为系统随机分配。
    每次结党至多存在一张不认可主将的常侍牌,且若此次结党仅有一张常侍牌,则不会存在不认可情况。", + mbmowang: "殁亡", + mbmowang_info: + "锁定技。①当你死亡前,若你有未亮出的“常侍”牌且体力上限大于0,你将死亡改为修整至你的下个回合开始前,然后你复原武将牌,且不于此次死亡事件中进行展示身份牌、检测游戏胜利条件与执行奖惩的流程。②回合结束后,你死亡。", + mbmowang_faq: "关于修整", + mbmowang_faq_info: "
    将武将牌移出游戏(视为你存活)。当该角色修整结束,其移回游戏。", + scs_zhangrang: "张让", + scstaoluan: "滔乱", + scstaoluan_info: "出牌阶段限一次。你可以将一张牌当任意一种基本牌或普通锦囊牌使用。", + scs_zhaozhong: "赵忠", + scschiyan: "鸱咽", + scschiyan_info: + "①当你使用【杀】指定目标后,你可以将其的一张牌置于其武将牌上,然后其于当前回合结束时获得这些牌。②当你因执行【杀】的效果对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,此伤害+1。", + scs_sunzhang: "孙璋", + scszimou: "自谋", + scszimou_info: + "锁定技。出牌阶段,当你使用第二/四/六张牌时,你从牌堆中获得一张【酒】/【杀】/【决斗】。", + scs_bilan: "毕岚", + scspicai: "庀材", + scspicai_info: + "出牌阶段限一次。你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同,则你可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。", + scs_xiayun: "夏恽", + scsyaozhuo: "谣诼", + scsyaozhuo_info: + "出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置两张牌。", + scs_hankui: "韩悝", + scsxiaolu: "宵赂", + scsxiaolu_info: + "出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张牌;2.将两张牌交给一名其他角色。", + scs_lisong: "栗嵩", + scskuiji: "窥机", + scskuiji_info: + "出牌阶段限一次。你可以观看一名其他角色的手牌,然后弃置你与其的共计四张花色各不相同的手牌。", + scs_duangui: "段珪", + scschihe: "叱吓", + scschihe_info: + "当你使用【杀】指定唯一目标后,你可亮出牌堆顶的两张牌,令此【杀】的伤害值基数+X(X为亮出牌中花色与此【杀】相同的牌数),且目标角色不能使用亮出牌包含的花色的牌响应此【杀】。", + scs_guosheng: "郭胜", + scsniqu: "逆取", + scsniqu_info: "出牌阶段限一次。你可以对一名角色造成1点火焰伤害。", + scs_gaowang: "高望", + scsanruo: "安弱", + scsanruo_info: + "你可以将一张♥牌当【桃】、♦牌当火【杀】、♣牌当【闪】、♠牌当【无懈可击】使用。当你以此法使用或打出【杀】或【闪】时,你可以获得对方的一张牌;当你以此法使用【桃】时,你可以获得一名其他角色的一张牌;当你以此法使用【无懈可击】时,你可以获得此牌响应的普通锦囊牌的使用者的一张牌。", + scsmiaoyu: "妙语", + scsmiaoyu_info: + "你可以将至多两张相同花色的牌按照以下规则使用或打出:♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。", + re_xiaoqiao: "手杀界小乔", + re_xiaoqiao_prefix: "手杀界", + xin_sunliang: "手杀孙亮", + xin_sunliang_prefix: "手杀", + xinkuizhu: "溃诛", + xinkuizhu_info: + "弃牌阶段结束后,你可以选择一项:1.令至多X名角色各摸一张牌。2.对任意名体力值之和为X的角色造成1点伤害,若你以此法选择的角色数不小于2,你失去1点体力。(X为你此阶段弃置的牌数)", + xinzhizheng: "掣政", + xinzhizheng_info: + "锁定技,你的出牌阶段内,攻击范围内不包含你的其他角色不能成为你使用牌的目标。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", + xinlijun: "立军", + xinlijun_info: + "主公技,其他吴势力角色于其回合内使用【杀】结算完毕后,其可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌。", + xin_zhangyi: "手杀界张嶷", + xin_zhangyi_prefix: "手杀界", + xinwurong: "怃戎", + xinwurong_info: + "出牌阶段限一次,你可以与一名其他角色进行谋弈:
  • 若你选择“镇压”且其选择“反抗”,你对其造成1点伤害,然后你摸一张牌。
  • 若你选择“安抚”且其选择“归顺”,其须交给你两张牌(若其牌数不足两张,则改为令其跳过其下个摸牌阶段)。
  • 若你选择“镇压”且其选择“归顺”,你获得其一张牌,然后你交给其两张牌。
  • 若你选择“安抚”且其选择“反抗”,你受到1点伤害,然后你摸两张牌。", + xin_guozhao: "手杀郭照", + xin_guozhao_prefix: "手杀", + yichong: "易宠", + yichong_info: + "①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的装备牌和其一张此花色的手牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到一张牌)。", + wufei: "诬诽", + wufei_info: + "若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于3,则你可以令A受到1点无来源伤害。", + yj_zhoubuyi: "☆周不疑", + yj_zhoubuyi_prefix: "☆", + mbhuiyao: "慧夭", + mbhuiyao_info: + "出牌阶段限一次。你可以受到1点无来源伤害,然后你选择一名其他角色,令其视为对另一名角色造成过1点伤害。", + mbquesong: "雀颂", + mbquesong_info: + "一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸X张牌并复原武将牌(X为3,若其装备区非宝物牌牌数不小于三张则X为2);2.回复1点体力。", + xin_yuanshao: "手杀界袁绍", + xin_yuanshao_prefix: "手杀界", + re_baosanniang: "手杀鲍三娘", + re_baosanniang_prefix: "手杀", + re_liushan: "手杀界刘禅", + re_liushan_prefix: "手杀界", + re_sunben: "界孙笨", + re_sunben_prefix: "界", + re_zhangzhang: "手杀界张昭张纮", + re_zhangzhang_prefix: "手杀界", + re_caozhi: "手杀界曹植", + re_caozhi_prefix: "手杀界", + re_sunjian: "手杀界孙坚", + re_sunjian_prefix: "手杀界", + sunru: "手杀孙茹", + sunru_prefix: "手杀", + pangdegong: "手杀庞德公", + pangdegong_prefix: "手杀", + zhaotongzhaoguang: "手杀赵统赵广", + zhaotongzhaoguang_prefix: "手杀", + re_liru: "手杀界李儒", + re_liru_prefix: "手杀界", + re_chenqun: "手杀界陈群", + re_chenqun_prefix: "手杀界", + re_liru: "手杀界李儒", + re_liru_prefix: "手杀界", + re_chenqun: "手杀界陈群", + re_chenqun_prefix: "手杀界", + old_yuanshu: "手杀袁术", + old_yuanshu_prefix: "手杀", + baoxin: "鲍信", + mutao: "募讨", + mutao_info: + "出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。", + yimou: "毅谋", + yimou_info: + "当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。", + jiangji: "手杀蒋济", + jiangji_prefix: "手杀", + jilun: "机论", + jilun_info: + "①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸两张牌。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。", + liwei: "李遗", + jiaohua: "教化", + jiaohua_backup: "教化", + jiaohua_info: + "出牌阶段限两次,你可以选择一个未被〖教化〗记录过的牌的类型,令一名角色从牌堆中获得一张此类型的牌,然后记录此类型,若基本、锦囊、装备均已被你发动〖教化〗记录,则你清空〖教化〗记录。", + laimin: "来敏", + laishou: "来寿", + laishou_info: + "锁定技。①当你受到伤害值大于等于你的体力值的伤害时,若你的体力上限小于9,你防止此伤害并增加等量体力上限。②准备阶段,若你的体力上限不小于9,你死亡。", + luanqun: "乱群", + luanqun_info: + "出牌阶段限一次,若你有手牌,则你可以令所有有手牌的角色同时展示一张手牌,然后你可以获得其中一张与你展示的牌颜色相同的展示牌,所有本次展示牌颜色与你展示的牌颜色不同的角色的下个出牌阶段使用的第一张【杀】只能对你使用,且此【杀】不可被响应。", + xin_wuban: "吴班", + xinjintao: "进讨", + xinjintao_info: + "锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】不可被响应,第二张【杀】伤害+1。", + xinlianhuan: "连环", + xinlianhuan_info: + "你可以将一张♣手牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。", + mb_sunluyu: "手杀孙鲁育", + mb_sunluyu_prefix: "手杀", + mbmumu: "穆穆", + mbmumu_info: + "出牌阶段开始时,你可以选择一项:1.弃置场上的一张装备牌;2.获得场上的一张防具牌,然后你本回合不能使用或打出【杀】。", + mbmeibu: "魅步", + mbmeibu_info: + "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", + mbzhixi: "止息", + mbzhixi_info: + "锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。", + yanxiang: "阎象", + kujian: "苦谏", + kujian_info: + "出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。", + mb_xianglang: "手杀向朗", + mb_xianglang_prefix: "手杀", + naxue: "纳学", + naxue_info: + "你可以跳过出牌阶段。若如此做,你可以弃置任意张牌并摸等量的牌,然后你可以交给至多两名其他角色各一张手牌。", + yijie: "遗诫", + yijie_info: + "锁定技。当你死亡时,你令所有其他角色将体力回复或失去至X(X为所有其他角色的体力之和除以所有其他角色数,向下取整,且X至少为1)。", + mb_chengui: "手杀陈珪", + mb_chengui_prefix: "手杀", + guimou: "诡谋", + guimou_info: + "锁定技。游戏开始时/回合结束时,你随机/须选择以下一项直到你的下个准备阶段:①记录场上期间角色使用牌数;②记录期间场上角色弃置牌数;③记录期间场上角色获得牌数。准备阶段,你可以选择一名场上对应记录数值最少的其他角色,观看其手牌并选择其中一张牌,然后你将此牌交给另一名其他角色或弃置此牌。", + zhouxian: "州贤", + zhouxian_info: + "锁定技。当你成为其他角色使用的伤害类卡牌的目标后,你亮出牌堆顶的三张牌,然后其须选择一项:①弃置一张与亮出牌之一类别相同的牌;②令此牌对你无效。", + mb_huban: "手杀胡班", + mb_huban_prefix: "手杀", + mbyilie: "义烈", + mbyilie2: "义烈", + mbyilie3: "义烈", + mbyilie_info: + "锁定技。①游戏开始时,你选择一名其他角色,然后你获得以下效果:其受到伤害时,若你没有“烈”,则你获得等同于伤害值的“烈”标记,然后防止此伤害;其对其他角色造成伤害后,你回复1点体力。②结束阶段,你摸一张牌并失去X点体力,然后移去所有“烈”(X为你拥有的“烈”标记数)。", + muludawang: "木鹿大王", + shoufa: "兽法", + shoufa_info: + "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名与你距离大于/不大于2的角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。", + shoufa_info_doudizhu: + "当你受到伤害后/于一回合首次造成伤害后,你可以选择一名角色,令其随机执行以下一项:豹,令其受到1点无来源伤害;鹰,你随机获得其一张牌;熊,你随机弃置其装备区的一张牌;兔,令其摸一张牌。", + yuxiang: "御象", + yuxiang_info: + "锁定技,若你有护甲值,则:①你计算与其他角色的距离-1,其他角色计算与你的距离+1;②当你受到火焰伤害时,此伤害+1。", + zhoulin: "咒鳞", + zhoulin_info: + "限定技,出牌阶段,你可以获得2点护甲值,然后选择一个“兽法”效果,你发动〖兽法〗的执行效果改为你选择的效果直到你的下个回合结束。", + xin_huojun: "手杀霍峻", + xin_huojun_prefix: "手杀", + sidai: "伺怠", + sidai_info: + "限定技,出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限。", + jieyu: "竭御", + jieyu_info: + "结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为4-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。", + jieyu_info_identity: + "结束阶段,你可以从弃牌堆中获得共X张不同牌名的基本牌(X为3-你上次发动〖竭御〗至今你成为其他角色使用伤害类卡牌目标的次数,且X至少为1)。", + yangfeng: "杨奉", + mbxuetu: "血途", + mbxuetu_info: + "转换技。出牌阶段限一次,阴:你可以弃置一张牌,然后令一名角色回复1点体力;阳:你可以失去1点体力,然后令一名角色摸两张牌。", + mbxuetu_achieve: "血途·成功", + mbxuetu_achieve_info: + "出牌阶段各限一次。⒈你可以弃置一张牌,然后令一名角色回复1点体力;⒉你可以失去1点体力,然后令一名角色摸两张牌。", + mbxuetu_fail: "血途·失败", + mbxuetu_fail_info: + "转换技。出牌阶段限一次,阴:你可以回复1点体力,然后令一名角色弃置两张牌;阳:你可以摸一张牌,然后对一名角色造成1点伤害。", + mbweiming: "威命", + mbweiming_info: + "使命技,锁定技。①出牌阶段开始时,你记录一名未以此法记录过的角色。②成功:当你杀死一名未被〖威命①〗记录过的角色后,修改〖血途〗为成功版本。③失败:当一名被〖威命①〗记录过的角色死亡后,你修改〖血途〗为失败版本。", + lizhaojiaobo: "李昭焦伯", + mbzuoyou: "佐佑", + mbzuoyou_info: + "转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名角色弃置一张手牌,然后其获得1点护甲。", + mbshishou: "侍守", + mbshishou_info: + "锁定技。当你发动〖佐佑〗后,若目标角色不为你,你执行〖佐佑〗中目标角色未执行的一项。", + chengji: "成济", + mbkuangli: "狂戾", + mbkuangli_info: + "锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你与其各随机弃置一张牌,然后你摸一张牌。③回合结束时,你移除所有角色的“狂戾”。", + mbxiongsi: "凶肆", + mbxiongsi_info: + "限定技。出牌阶段,若你的手牌数不少于三张,你可以弃置所有手牌,然后令所有其他角色依次失去1点体力。", + mb_sp_guanqiujian: "SP毌丘俭", + mb_sp_guanqiujian_prefix: "SP", + mbcuizhen: "摧阵", + mbcuizhen_info_identity: + "①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", + mbcuizhen_info: + "①当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。②摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", + mbkuili: "溃离", + mbkuili_info: + "锁定技。当你受到伤害后,你弃置等同于伤害值的手牌;若来源有被废除的武器栏,你令其恢复武器栏。", + mb_caomao: "手杀曹髦", + mb_caomao_prefix: "手杀", + mbqianlong: "潜龙", + mbqianlong_info: + "①游戏开始时,你获得20枚“道心”标记。②当你得到牌后/受到1点伤害后/造成1点伤害后,你获得5/10/15枚“道心”(上限为100枚)。③若你的“道心”数不小于25/50/75/100,你视为拥有〖清正〗/〖酒诗〗/〖放逐〗/〖决进〗。", + mbcmqingzheng: "清正", + mbcmqingzheng_info: + "出牌阶段开始时,你可以弃置两种花色的所有手牌,并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。", + mbcmjiushi: "酒诗", + mbcmjiushi_info: + "①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌背面向上,你可以翻面。③当你翻面后,你获得牌堆里的一张锦囊牌。", + mbcmfangzhu: "放逐", + mbcmfangzhu_info: + "出牌阶段限一次。你可以选择一名其他角色,选择一项:⒈令其不能使用手牌中的非锦囊牌直到其回合结束;⒉令其所有非Charlotte技能失效直到其回合结束。", + mbjuejin: "决进", + mbjuejin_info: + "限定技。出牌阶段,你可以令所有角色依次将体力回复或失去至1并获得X点护甲(X为一名角色以此法变化的体力值)。然后你增加如下“向死存魏”的全局技能:当有牌进入弃牌堆后,系统将这些牌中的【闪】、【桃】和【酒】移出游戏。", + mbweitong: "卫统", + mbweitong_info: "主公技。游戏开始时,若你有〖潜龙〗,你获得20X枚“道心”(X为其他魏势力角色数)。", - mobile_standard:'手杀异构·标准包', - mobile_shenhua_feng:'手杀异构·其疾如风', - mobile_shenhua_huo:'手杀异构·侵掠如火', - mobile_shenhua_lin:'手杀异构·其徐如林', - mobile_shenhua_shan:'手杀异构·不动如山', - mobile_shenhua_yin:'手杀异构·难知如阴', - mobile_shenhua_lei:'手杀异构·动如雷霆', - mobile_yijiang1:'手杀异构·将1', - mobile_yijiang2:'手杀异构·将2', - mobile_yijiang3:'手杀异构·将3', - mobile_yijiang4:'手杀异构·将4', - mobile_yijiang5:'手杀异构·将5', - mobile_yijiang67:'手杀异构·原创设计', - mobile_sp:'手杀异构·SP', - mobile_default:'袖里乾坤', - mobile_others:'其他', - mobile_changshi:'十常侍单体', - } + mobile_standard: "手杀异构·标准包", + mobile_shenhua_feng: "手杀异构·其疾如风", + mobile_shenhua_huo: "手杀异构·侵掠如火", + mobile_shenhua_lin: "手杀异构·其徐如林", + mobile_shenhua_shan: "手杀异构·不动如山", + mobile_shenhua_yin: "手杀异构·难知如阴", + mobile_shenhua_lei: "手杀异构·动如雷霆", + mobile_yijiang1: "手杀异构·将1", + mobile_yijiang2: "手杀异构·将2", + mobile_yijiang3: "手杀异构·将3", + mobile_yijiang4: "手杀异构·将4", + mobile_yijiang5: "手杀异构·将5", + mobile_yijiang67: "手杀异构·原创设计", + mobile_sp: "手杀异构·SP", + mobile_default: "袖里乾坤", + mobile_others: "其他", + mobile_changshi: "十常侍单体", + }, }; }); diff --git a/character/mtg.js b/character/mtg.js index 4a66add3a..ec346ae92 100644 --- a/character/mtg.js +++ b/character/mtg.js @@ -1,492 +1,516 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'mtg', - character:{ - mtg_jiding:['male','qun',4,['mbaizhan','msilian']], + name: "mtg", + character: { + mtg_jiding: ["male", "qun", 4, ["mbaizhan", "msilian"]], // mtg_qianzhuo:['female','shu',3,[]], - mtg_jiesi:['male','wei',3,['mtongnian','msuoling','mhuanyi']], - mtg_lilianna:['female','qun',3,['lingyong','mduohun']], + mtg_jiesi: ["male", "wei", 3, ["mtongnian", "msuoling", "mhuanyi"]], + mtg_lilianna: ["female", "qun", 3, ["lingyong", "mduohun"]], // mtg_nisha:['female','wu',3,[]], // mtg_ayeni:['male','qun',4,[]], }, - characterIntro:{ - mtg_jiding:'这名白色魔法的使用者极其注重忠诚,正义和荣誉。他曾全力追捕茜卓纳拉,如今已不可思议地与这位火焰法师成为伙伴。', - mtg_qianzhuo:'茜卓纳拉是使用红色法术力的旅法师。她擅长使用火焰:除了火焰,还是火焰。茜卓性格冲动、易怒、富有激情,不断增长的火焰法术能力随时都准备爆发。她的火花在还很年轻时便已点燃,如今已是相当有经验的烈焰术士和旅法师。', - mtg_jiesi:'杰斯贝连是使用蓝色法术的鹏洛客。他擅长心灵法术:读取心灵,幻影,知识,以及欺瞒的咒语。', - mtg_lilianna:'莉莲娜维斯是一位精通死灵术的旅法师,她擅长用黑色法术力来复活死者,腐化生者,并从死亡中召唤力量。', - mtg_nisha:'赞迪卡妖精部落玖瑞加的一名战士,做事倾尽全力,与大地有密切的联系,还擅使元素魔法。她能够引导时空的魔法生机地脉,为土地赋予生命。', - mtg_ayeni:'金鬃阿耶尼是使用白色法术的鹏洛客。他长于净化身体与心灵的法术:用咒语来治疗、强化盟友,以及唤醒他人内在的心灵精华。', + characterIntro: { + mtg_jiding: + "这名白色魔法的使用者极其注重忠诚,正义和荣誉。他曾全力追捕茜卓纳拉,如今已不可思议地与这位火焰法师成为伙伴。", + mtg_qianzhuo: + "茜卓纳拉是使用红色法术力的旅法师。她擅长使用火焰:除了火焰,还是火焰。茜卓性格冲动、易怒、富有激情,不断增长的火焰法术能力随时都准备爆发。她的火花在还很年轻时便已点燃,如今已是相当有经验的烈焰术士和旅法师。", + mtg_jiesi: + "杰斯贝连是使用蓝色法术的鹏洛客。他擅长心灵法术:读取心灵,幻影,知识,以及欺瞒的咒语。", + mtg_lilianna: + "莉莲娜维斯是一位精通死灵术的旅法师,她擅长用黑色法术力来复活死者,腐化生者,并从死亡中召唤力量。", + mtg_nisha: + "赞迪卡妖精部落玖瑞加的一名战士,做事倾尽全力,与大地有密切的联系,还擅使元素魔法。她能够引导时空的魔法生机地脉,为土地赋予生命。", + mtg_ayeni: + "金鬃阿耶尼是使用白色法术的鹏洛客。他长于净化身体与心灵的法术:用咒语来治疗、强化盟友,以及唤醒他人内在的心灵精华。", }, - skill:{ - mduohun:{ - trigger:{player:'dyingAfter'}, - forced:true, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source.hp>0; + skill: { + mduohun: { + trigger: { player: "dyingAfter" }, + forced: true, + filter: function (event, player) { + return event.source && event.source.isIn() && event.source.hp > 0; }, - logTarget:'source', - content:function(){ + logTarget: "source", + content: function () { trigger.source.loseHp(); }, - ai:{ - threaten:function(player,target){ - if(target.hp==1) return 0.6; + ai: { + threaten: function (player, target) { + if (target.hp == 1) return 0.6; return 1; }, - effect:{ - target:function(card,player,target,current){ - if(!target.hasFriend()) return; - if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-1]; - } - } - } + effect: { + target: function (card, player, target, current) { + if (!target.hasFriend()) return; + if (target.hp <= 1 && get.tag(card, "damage")) return [1, 0, 0, -1]; + }, + }, + }, }, - lingyong:{ - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('subplayer')&&player.getSubPlayers('lingyong_get').length>0; + lingyong: { + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("subplayer") && player.getSubPlayers("lingyong_get").length > 0; }, - nosub:true, - group:'lingyong_get', - direct:true, - delay:0, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - player.callSubPlayer().set('tag','lingyong_get'); + nosub: true, + group: "lingyong_get", + direct: true, + delay: 0, + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.callSubPlayer().set("tag", "lingyong_get"); }, - ai:{ - order:1, - result:{ - player:function(player,target){ + ai: { + order: 1, + result: { + player: function (player, target) { return 1; // if(player.hp<=1) return 1; // if(!player.needsToDiscard(player.hp-1)) return 1; // return 0; - } - } - }, - subSkill:{ - get:{ - trigger:{global:'dieAfter'}, - forced:true, - filter:function(event,player){ - return !event.player.isMin()&&![player.name,player.name1,player.name2].includes(event.player.name); }, - content:function(){ - var skills=lib.character[trigger.player.name][3].slice(0); - for(var i=0;i=5) return false; - return lib.skill.msuoling.getc(player).number>0; + filter: function (event, player) { + var nh = player.countCards("h"); + if (nh <= 1 || nh >= 5) return false; + return lib.skill.msuoling.getc(player).number > 0; }, - getc:function(player){ - var hs=player.getCards('h'); - for(var i=0;i1){ - for(var i=0;i 1) { + for (var i = 0; i < arr.length - 1; i++) { + for (var j = i + 1; j < arr.length; j++) { + var brr = []; + for (var k = 0; k < arr.length; k++) { + if (k != i && k != j) { brr.push(arr[k]); } } - if(lib.skill.msuoling.calc(brr.concat([arr[i]+arr[j]]),num)) return true; - if(lib.skill.msuoling.calc(brr.concat([arr[i]-arr[j]]),num)) return true; - if(lib.skill.msuoling.calc(brr.concat([arr[i]*arr[j]]),num)) return true; - if(lib.skill.msuoling.calc(brr.concat([arr[i]/arr[j]]),num)) return true; + if (lib.skill.msuoling.calc(brr.concat([arr[i] + arr[j]]), num)) return true; + if (lib.skill.msuoling.calc(brr.concat([arr[i] - arr[j]]), num)) return true; + if (lib.skill.msuoling.calc(brr.concat([arr[i] * arr[j]]), num)) return true; + if (lib.skill.msuoling.calc(brr.concat([arr[i] / arr[j]]), num)) return true; } } } return false; }, - check:function(card){ + check: function (card) { // if(player.isUnderControl(true)) return 0; - var player=_status.event.player; - if(player.hasSkill('msuoling_ai')){ + var player = _status.event.player; + if (player.hasSkill("msuoling_ai")) { return false; } - if(lib.skill.msuoling.test(player)){ + if (lib.skill.msuoling.test(player)) { return true; - } - else{ - player.addTempSkill('msuoling_ai',{player:['gainAfter','phaseAfter']}); + } else { + player.addTempSkill("msuoling_ai", { player: ["gainAfter", "phaseAfter"] }); return false; } }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - 'step 1' - if(lib.skill.msuoling.test(player)){ - var card=lib.skill.msuoling.getc(player); - card.classList.remove('glow'); + ("step 1"); + if (lib.skill.msuoling.test(player)) { + var card = lib.skill.msuoling.getc(player); + card.classList.remove("glow"); delete card.mtongnian_link; delete card._destroy; - var list=lib.skill.mtongnian.getList(player); - if(list.length){ - var card=list.randomGet(); - var fake=game.createCard(card); - fake.mtongnian_link=card; - player.gain(fake,'draw')._triggered=null; - fake.classList.add('glow'); - fake._destroy='mtongnian'; + var list = lib.skill.mtongnian.getList(player); + if (list.length) { + var card = list.randomGet(); + var fake = game.createCard(card); + fake.mtongnian_link = card; + player.gain(fake, "draw")._triggered = null; + fake.classList.add("glow"); + fake._destroy = "mtongnian"; } } }, - selectCard:[1,Infinity], - ai:{ - order:11 - } + selectCard: [1, Infinity], + ai: { + order: 11, + }, }, - mtongnian:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - filter:function(event,player){ - var enemies=player.getEnemies(); - for(var i=0;i0; + mbaizhan: { + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event) { + return event.num > 0; }, - content:function(){ + content: function () { player.changeHujia(trigger.num); }, - ai:{ - damageBonus:true - } + ai: { + damageBonus: true, + }, }, - msilian:{ - trigger:{player:'phaseEnd'}, - filter:function(event,player){ - return player.hujia>0; + msilian: { + trigger: { player: "phaseEnd" }, + filter: function (event, player) { + return player.hujia > 0; }, - check:function(event,player){ - return player.hujia>1&&player.hp>1; + check: function (event, player) { + return player.hujia > 1 && player.hp > 1; }, - content:function(){ - player.storage.msilian=player.hujia; + content: function () { + player.storage.msilian = player.hujia; player.changeHujia(-player.hujia); player.insertPhase(); }, - group:['msilian_hp','msilian_draw'], - subSkill:{ - hp:{ - trigger:{player:'phaseAfter'}, - silent:true, - filter:function(event,player){ - return event.skill=='msilian'&&!player.getStat('damage'); + group: ["msilian_hp", "msilian_draw"], + subSkill: { + hp: { + trigger: { player: "phaseAfter" }, + silent: true, + filter: function (event, player) { + return event.skill == "msilian" && !player.getStat("damage"); }, - content:function(){ + content: function () { player.loseHp(); - } - }, - draw:{ - trigger:{player:'phaseDrawBegin'}, - filter:function(event){ - return event.getParent('phase').skill=='msilian'; }, - silent:true, - content:function(){ - trigger.num+=player.storage.msilian-2; - } - } - } - } + }, + draw: { + trigger: { player: "phaseDrawBegin" }, + filter: function (event) { + return event.getParent("phase").skill == "msilian"; + }, + silent: true, + content: function () { + trigger.num += player.storage.msilian - 2; + }, + }, + }, + }, }, - translate:{ - mtg_jiding:'基定', - mtg_qianzhuo:'茜卓', - mtg_jiesi:'杰斯', - mtg_lilianna:'莉莲娜', - mtg_nisha:'妮莎', - mtg_ayeni:'阿耶尼', + translate: { + mtg_jiding: "基定", + mtg_qianzhuo: "茜卓", + mtg_jiesi: "杰斯", + mtg_lilianna: "莉莲娜", + mtg_nisha: "妮莎", + mtg_ayeni: "阿耶尼", - mduohun:'夺魂', - mduohun_info:'锁定技,当你解除濒死状态后,令你进入濒死状态的角色失去1点体力。', - lingyong:'灵俑', - lingyong2:'灵俑', - lingyong3:'灵俑', - lingyong3_bg:'俑', - lingyong_info:'锁定技,每当一名其他角色死亡,你获得一个与该角色同名且体力上限为1、初始手牌为2的随从;出牌阶段,你可以调遣以此法获得的随从(直到随从死亡不可再次切换)。', - mbaizhan:'百战', - mbaizhan_info:'锁定技,每当你造成1点伤害,你获得1点护甲。', - msilian:'祀炼', - msilian_info:'结束阶段,若你有护甲,你可以移去全部护甲,然后进行一个额外回合;在额外回合中,你的摸牌阶段摸牌基数为你移去的护甲数;额外回合结束后,若你未造成伤害,你失去1点体力。', - mtongnian:'通念', - mtongnian_info:'锁定技,出牌阶段开始时,你获得一张替身牌,此牌对应一名随机敌人的一张随机手牌;每当你使用一张非替身牌,随机更换替身牌对应的牌;当你使用替身牌时,改为使用替身牌对应的牌;当出牌阶段结束,或替身牌离开手牌区,或敌方角色没有手牌时,销毁替身牌。', - msuoling:'塑灵', - msuoling_info:'每轮限一次,当一名其他角色使用一张非转化的普通锦囊牌时,你可以弃置一张与之花色相同的牌取消之,然后你视为使用该锦囊牌。', - msuoling_old_info:'出牌阶段限一次,若你手牌中有替身牌且手牌数不超过5,你可以展示手牌,若其中的非替身手牌能通过四则运算得到你的替身牌的点数,你将替身牌转化为非替身牌,然后获得一张新的替身牌(此技能托管无效)。', - mhuanyi:'幻逸', - mhuanyi_info:'每两轮限一次,结束阶段,你可以选择一名其他角色和一种卡牌类型(选择结果对其他角色不可见),直到下一回合开始,当你首次成为该类型卡牌的惟一目标时,你将目标转移给你指定的角色(目标须合法)。', + mduohun: "夺魂", + mduohun_info: "锁定技,当你解除濒死状态后,令你进入濒死状态的角色失去1点体力。", + lingyong: "灵俑", + lingyong2: "灵俑", + lingyong3: "灵俑", + lingyong3_bg: "俑", + lingyong_info: + "锁定技,每当一名其他角色死亡,你获得一个与该角色同名且体力上限为1、初始手牌为2的随从;出牌阶段,你可以调遣以此法获得的随从(直到随从死亡不可再次切换)。", + mbaizhan: "百战", + mbaizhan_info: "锁定技,每当你造成1点伤害,你获得1点护甲。", + msilian: "祀炼", + msilian_info: + "结束阶段,若你有护甲,你可以移去全部护甲,然后进行一个额外回合;在额外回合中,你的摸牌阶段摸牌基数为你移去的护甲数;额外回合结束后,若你未造成伤害,你失去1点体力。", + mtongnian: "通念", + mtongnian_info: + "锁定技,出牌阶段开始时,你获得一张替身牌,此牌对应一名随机敌人的一张随机手牌;每当你使用一张非替身牌,随机更换替身牌对应的牌;当你使用替身牌时,改为使用替身牌对应的牌;当出牌阶段结束,或替身牌离开手牌区,或敌方角色没有手牌时,销毁替身牌。", + msuoling: "塑灵", + msuoling_info: + "每轮限一次,当一名其他角色使用一张非转化的普通锦囊牌时,你可以弃置一张与之花色相同的牌取消之,然后你视为使用该锦囊牌。", + msuoling_old_info: + "出牌阶段限一次,若你手牌中有替身牌且手牌数不超过5,你可以展示手牌,若其中的非替身手牌能通过四则运算得到你的替身牌的点数,你将替身牌转化为非替身牌,然后获得一张新的替身牌(此技能托管无效)。", + mhuanyi: "幻逸", + mhuanyi_info: + "每两轮限一次,结束阶段,你可以选择一名其他角色和一种卡牌类型(选择结果对其他角色不可见),直到下一回合开始,当你首次成为该类型卡牌的惟一目标时,你将目标转移给你指定的角色(目标须合法)。", }, }; }); diff --git a/character/offline.js b/character/offline.js index 8c321f207..bb3b656fc 100644 --- a/character/offline.js +++ b/character/offline.js @@ -1,618 +1,830 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'offline', - connect:true, - connectBanned:['zhangliang'], - characterSort:{ - offline:{ - offline_star:['jsp_ganfuren',"sp_xiahoushi","jsp_zhaoyun","huangjinleishi","sp_pangtong","sp_daqiao","sp_ganning","sp_xiahoudun","sp_lvmeng","sp_zhangfei","sp_liubei","old_machao","zhangliang","jsp_caoren"], - offline_sticker:['sp_gongsunzan','sp_simazhao','sp_wangyuanji','sp_xinxianying','sp_liuxie'], - offline_yijiang:['ol_xinxianying'], - offline_luanwu:["ns_lijue","ns_zhangji","ns_fanchou"], - offline_yongjian:["ns_chendao","yj_caoang","yj_caocao",'yj_liru','yj_caohong','yj_zhangfei','yongjian_ganning','yj_dongzhuo','yj_xuyou','yj_jiaxu','yj_zhenji'], - offline_piracyE:['shen_jiaxu','pe_wangyun','pe_zhonghui','pe_sunchen','pe_mengda','pe_wenqin','ns_caoanmin','jiangqing','kongrong','jiling','tianfeng','mateng'], - offline_piracyS:['ns_jiaxu','longyufei','ps_guanyu','ps1059_guojia','ps2070_guojia','ps2063_zhaoyun','ps2067_zhaoyun','ps1062_zhouyu','ps2080_zhouyu','ps_caozhi','ps_jin_simayi','ps_caopi','ps_simayi','ps2068_simayi','ps_machao','ps_zhugeliang','ps2066_zhugeliang','ps_jiaxu','ps_lvbu','ps_shen_machao','jsp_liubei'], - offline_piracyK:['pk_sp_duyu'], - offline_vtuber:['vtb_xiaosha','vtb_xiaoshan','vtb_xiaotao','vtb_xiaole','vtb_xiaojiu'], - offline_longyutao:['drag_guanyu','drag_caoren','drag_lvchang'], + name: "offline", + connect: true, + connectBanned: ["zhangliang"], + characterSort: { + offline: { + offline_star: [ + "jsp_ganfuren", + "sp_xiahoushi", + "jsp_zhaoyun", + "huangjinleishi", + "sp_pangtong", + "sp_daqiao", + "sp_ganning", + "sp_xiahoudun", + "sp_lvmeng", + "sp_zhangfei", + "sp_liubei", + "old_machao", + "zhangliang", + "jsp_caoren", + ], + offline_sticker: [ + "sp_gongsunzan", + "sp_simazhao", + "sp_wangyuanji", + "sp_xinxianying", + "sp_liuxie", + ], + offline_yijiang: ["ol_xinxianying"], + offline_luanwu: ["ns_lijue", "ns_zhangji", "ns_fanchou"], + offline_yongjian: [ + "ns_chendao", + "yj_caoang", + "yj_caocao", + "yj_liru", + "yj_caohong", + "yj_zhangfei", + "yongjian_ganning", + "yj_dongzhuo", + "yj_xuyou", + "yj_jiaxu", + "yj_zhenji", + ], + offline_piracyE: [ + "shen_jiaxu", + "pe_wangyun", + "pe_zhonghui", + "pe_sunchen", + "pe_mengda", + "pe_wenqin", + "ns_caoanmin", + "jiangqing", + "kongrong", + "jiling", + "tianfeng", + "mateng", + ], + offline_piracyS: [ + "ns_jiaxu", + "longyufei", + "ps_guanyu", + "ps1059_guojia", + "ps2070_guojia", + "ps2063_zhaoyun", + "ps2067_zhaoyun", + "ps1062_zhouyu", + "ps2080_zhouyu", + "ps_caozhi", + "ps_jin_simayi", + "ps_caopi", + "ps_simayi", + "ps2068_simayi", + "ps_machao", + "ps_zhugeliang", + "ps2066_zhugeliang", + "ps_jiaxu", + "ps_lvbu", + "ps_shen_machao", + "jsp_liubei", + ], + offline_piracyK: ["pk_sp_duyu"], + offline_vtuber: ["vtb_xiaosha", "vtb_xiaoshan", "vtb_xiaotao", "vtb_xiaole", "vtb_xiaojiu"], + offline_longyutao: ["drag_guanyu", "drag_caoren", "drag_lvchang"], //offline_others:[""], }, }, - character:{ - drag_guanyu:['male','shu',4,['dragchaojue','dragjunshen']], - drag_caoren:['male','wei',4,['draglizhong','dragjuesui']], - drag_lvchang:['male','wei',3,['dragjuwu','dragshouxiang']], - jsp_ganfuren:['female','shu',3,['shushen','shenzhi'],['character:gz_ganfuren']], - ol_xinxianying:['female','wei',3,['xincaishi','xinzhongjian']], - zhangliang:["male","qun",4,["old_jijun","old_fangtong"]], - jsp_caoren:['male','wei',4,['kuiwei','yanzheng']], - old_machao:['male','qun',4,['zhuiji','oldcihuai']], - vtb_xiaosha:['female','qun',4,['vtbguisha','vtbshuli']], - vtb_xiaoshan:['female','qun',4,['vtbshanwu','vtbxianli']], - vtb_xiaotao:['female','qun',4,['vtbtaoyan','vtbyanli']], - vtb_xiaole:['female','qun',4,['vtbleyu','vtbyuanli']], - vtb_xiaojiu:['female','qun',4,['vtbmeiniang','vtbyaoli']], - ps_shen_machao:['male','shen',4,['psshouli','pshengwu'],['qun']], - mateng:['male','qun',4,['mashu','xiongyi']], - tianfeng:['male','qun',3,['sijian','gzsuishi']], - jiling:['male','qun',4,['shuangren']], - kongrong:['male','qun',3,['zymingshi','lirang']], - jiangqing:['male','wu',4,['zyshangyi']], - pk_sp_duyu:['male','qun',4,['pkwuku','pksanchen']], - ps_lvbu:['male','qun',4,['wushuang','pssheji']], - ps_jiaxu:['male','qun',4,['wansha','psqupo','psbaoquan']], - ps_machao:['male','shu',4,['mashu','tieji','psweihou']], - ps2066_zhugeliang:['male','shu',3,['pszhiji','psjiefeng','kongcheng']], - ps_zhugeliang:['male','shu',3,['psguanxing','pslongyin']], - ps_simayi:['male','wei',3,['reguicai','pshuxiao']], - ps2068_simayi:['male','wei',3,['refankui','reguicai','pszhonghu']], - ps_caopi:['male','wei',3,['psjianwei','fangzhu','songwei'],['zhu']], - ps_jin_simayi:['male','jin',3,['smyyingshi','psquanyi']], - ps_caozhi:['male','wei',3,['psliushang','psqibu']], - ps1062_zhouyu:['male','wu',3,['yingzi','psoldshiyin']], - ps2080_zhouyu:['male','wu',3,['psshiyin','psquwu','psliaozou']], - ps2063_zhaoyun:['male','shu',4,['psqijin','psqichu','pslongxin']], - ps2067_zhaoyun:['male','shu',4,['longdan','pshuiqiang','pshuntu']], - ps1059_guojia:['male','wei',3,['tiandu','psqizuo']], - ps2070_guojia:['male','wei',3,['yiji','psquanmou']], - ps_guanyu:['male','shu',4,['wusheng','pszhonghun','nuzhan']], - pe_wenqin:['male','wei',4,['gzjinfa']], - pe_sunchen:['male','wu',4,['zyshilu','zyxiongnve']], - pe_mengda:['male','wei',4,['qiuan','liangfan']], - pe_zhonghui:['male','wei',4,['zyquanji','zypaiyi'],['clan:颍川钟氏']], - pe_wangyun:['male','qun',3,['zylianji','zymoucheng'],['clan:太原王氏']], - shen_jiaxu:['male','shen',3,['weimu','zybishi','zyjianbing'],['qun']], - yj_zhenji:['female','wei',3,['yjluoshen','qingguo']], - yj_jiaxu:['male','wei',3,['yjzhenlve','yjjianshu','yjyongdi']], - yj_xuyou:['male','qun',3,['yjshicai','yjchenggong','yjzezhu']], - yj_dongzhuo:['male','qun',7,['yjtuicheng','yjyaoling','yjshicha','yjyongquan'],['zhu']], - yongjian_ganning:['male','wu',4,['yjjielve']], - yj_zhangfei:['male','shu',4,['yjmangji']], - yj_caohong:['male','wei',4,['yjlifeng']], - yj_liru:['male','qun',3,['yjdumou','yjweiquan','yjrenwang']], - yj_caocao:['male','qun',4,['yjxiandao','yjsancai','yjyibing']], - longyufei:['female','shu',3,['longyi','zhenjue']], - sp_liubei:['male','shu',4,['zhaolie','shichou'],['zhu']], - sp_zhangfei:['male','shu',4,['jie','dahe']], - sp_lvmeng:['male','wu',3,['tanhu','mouduan']], - sp_xiahoudun:['male','wei',4,['fenyong','xuehen'],['die_audio']], - sp_ganning:['male','qun',4,['yinling','junwei']], - sp_daqiao:['female','wu',3,['yanxiao','anxian']], - sp_pangtong:['male','qun',3,['xinmanjuan','zuixiang']], - huangjinleishi:['female','qun',3,['fulu','fuji']], - jsp_zhaoyun:['male','qun',3,['chixin','reyicong','suiren']], - sp_xiahoushi:["female","shu",3,["xinfu_yanyu","xinfu_xiaode"]], - sp_gongsunzan:['male','qun',4,['spyicong','sptuji']], - sp_simazhao:['male','wei',3,['spzhaoxin','splanggu']], - sp_wangyuanji:['female','wei',3,['spfuluan','spshude']], - sp_xinxianying:['female','wei',3,['spmingjian','spyinzhi']], - sp_liuxie:['male','qun',3,['sphuangen','sphantong']], - ns_lijue:['male','qun','4/6',['nsfeixiong','nscesuan']], - ns_zhangji:['male','qun',4,['nslulve']], - ns_fanchou:['male','qun',4,['nsyangwu']], - ns_jiaxu:['male','qun',3,['nsyice','luanwu']], - ns_chendao:['male','shu',4,['nsjianglie']], - yj_caoang:['male','wei',4,['yjxuepin']], - ns_caoanmin:['male','wei',4,['nskuishe']], - jsp_liubei:['male','qun',4,['jsprende']], + character: { + drag_guanyu: ["male", "shu", 4, ["dragchaojue", "dragjunshen"]], + drag_caoren: ["male", "wei", 4, ["draglizhong", "dragjuesui"]], + drag_lvchang: ["male", "wei", 3, ["dragjuwu", "dragshouxiang"]], + jsp_ganfuren: ["female", "shu", 3, ["shushen", "shenzhi"], ["character:gz_ganfuren"]], + ol_xinxianying: ["female", "wei", 3, ["xincaishi", "xinzhongjian"]], + zhangliang: ["male", "qun", 4, ["old_jijun", "old_fangtong"]], + jsp_caoren: ["male", "wei", 4, ["kuiwei", "yanzheng"]], + old_machao: ["male", "qun", 4, ["zhuiji", "oldcihuai"]], + vtb_xiaosha: ["female", "qun", 4, ["vtbguisha", "vtbshuli"]], + vtb_xiaoshan: ["female", "qun", 4, ["vtbshanwu", "vtbxianli"]], + vtb_xiaotao: ["female", "qun", 4, ["vtbtaoyan", "vtbyanli"]], + vtb_xiaole: ["female", "qun", 4, ["vtbleyu", "vtbyuanli"]], + vtb_xiaojiu: ["female", "qun", 4, ["vtbmeiniang", "vtbyaoli"]], + ps_shen_machao: ["male", "shen", 4, ["psshouli", "pshengwu"], ["qun"]], + mateng: ["male", "qun", 4, ["mashu", "xiongyi"]], + tianfeng: ["male", "qun", 3, ["sijian", "gzsuishi"]], + jiling: ["male", "qun", 4, ["shuangren"]], + kongrong: ["male", "qun", 3, ["zymingshi", "lirang"]], + jiangqing: ["male", "wu", 4, ["zyshangyi"]], + pk_sp_duyu: ["male", "qun", 4, ["pkwuku", "pksanchen"]], + ps_lvbu: ["male", "qun", 4, ["wushuang", "pssheji"]], + ps_jiaxu: ["male", "qun", 4, ["wansha", "psqupo", "psbaoquan"]], + ps_machao: ["male", "shu", 4, ["mashu", "tieji", "psweihou"]], + ps2066_zhugeliang: ["male", "shu", 3, ["pszhiji", "psjiefeng", "kongcheng"]], + ps_zhugeliang: ["male", "shu", 3, ["psguanxing", "pslongyin"]], + ps_simayi: ["male", "wei", 3, ["reguicai", "pshuxiao"]], + ps2068_simayi: ["male", "wei", 3, ["refankui", "reguicai", "pszhonghu"]], + ps_caopi: ["male", "wei", 3, ["psjianwei", "fangzhu", "songwei"], ["zhu"]], + ps_jin_simayi: ["male", "jin", 3, ["smyyingshi", "psquanyi"]], + ps_caozhi: ["male", "wei", 3, ["psliushang", "psqibu"]], + ps1062_zhouyu: ["male", "wu", 3, ["yingzi", "psoldshiyin"]], + ps2080_zhouyu: ["male", "wu", 3, ["psshiyin", "psquwu", "psliaozou"]], + ps2063_zhaoyun: ["male", "shu", 4, ["psqijin", "psqichu", "pslongxin"]], + ps2067_zhaoyun: ["male", "shu", 4, ["longdan", "pshuiqiang", "pshuntu"]], + ps1059_guojia: ["male", "wei", 3, ["tiandu", "psqizuo"]], + ps2070_guojia: ["male", "wei", 3, ["yiji", "psquanmou"]], + ps_guanyu: ["male", "shu", 4, ["wusheng", "pszhonghun", "nuzhan"]], + pe_wenqin: ["male", "wei", 4, ["gzjinfa"]], + pe_sunchen: ["male", "wu", 4, ["zyshilu", "zyxiongnve"]], + pe_mengda: ["male", "wei", 4, ["qiuan", "liangfan"]], + pe_zhonghui: ["male", "wei", 4, ["zyquanji", "zypaiyi"], ["clan:颍川钟氏"]], + pe_wangyun: ["male", "qun", 3, ["zylianji", "zymoucheng"], ["clan:太原王氏"]], + shen_jiaxu: ["male", "shen", 3, ["weimu", "zybishi", "zyjianbing"], ["qun"]], + yj_zhenji: ["female", "wei", 3, ["yjluoshen", "qingguo"]], + yj_jiaxu: ["male", "wei", 3, ["yjzhenlve", "yjjianshu", "yjyongdi"]], + yj_xuyou: ["male", "qun", 3, ["yjshicai", "yjchenggong", "yjzezhu"]], + yj_dongzhuo: ["male", "qun", 7, ["yjtuicheng", "yjyaoling", "yjshicha", "yjyongquan"], ["zhu"]], + yongjian_ganning: ["male", "wu", 4, ["yjjielve"]], + yj_zhangfei: ["male", "shu", 4, ["yjmangji"]], + yj_caohong: ["male", "wei", 4, ["yjlifeng"]], + yj_liru: ["male", "qun", 3, ["yjdumou", "yjweiquan", "yjrenwang"]], + yj_caocao: ["male", "qun", 4, ["yjxiandao", "yjsancai", "yjyibing"]], + longyufei: ["female", "shu", 3, ["longyi", "zhenjue"]], + sp_liubei: ["male", "shu", 4, ["zhaolie", "shichou"], ["zhu"]], + sp_zhangfei: ["male", "shu", 4, ["jie", "dahe"]], + sp_lvmeng: ["male", "wu", 3, ["tanhu", "mouduan"]], + sp_xiahoudun: ["male", "wei", 4, ["fenyong", "xuehen"], ["die_audio"]], + sp_ganning: ["male", "qun", 4, ["yinling", "junwei"]], + sp_daqiao: ["female", "wu", 3, ["yanxiao", "anxian"]], + sp_pangtong: ["male", "qun", 3, ["xinmanjuan", "zuixiang"]], + huangjinleishi: ["female", "qun", 3, ["fulu", "fuji"]], + jsp_zhaoyun: ["male", "qun", 3, ["chixin", "reyicong", "suiren"]], + sp_xiahoushi: ["female", "shu", 3, ["xinfu_yanyu", "xinfu_xiaode"]], + sp_gongsunzan: ["male", "qun", 4, ["spyicong", "sptuji"]], + sp_simazhao: ["male", "wei", 3, ["spzhaoxin", "splanggu"]], + sp_wangyuanji: ["female", "wei", 3, ["spfuluan", "spshude"]], + sp_xinxianying: ["female", "wei", 3, ["spmingjian", "spyinzhi"]], + sp_liuxie: ["male", "qun", 3, ["sphuangen", "sphantong"]], + ns_lijue: ["male", "qun", "4/6", ["nsfeixiong", "nscesuan"]], + ns_zhangji: ["male", "qun", 4, ["nslulve"]], + ns_fanchou: ["male", "qun", 4, ["nsyangwu"]], + ns_jiaxu: ["male", "qun", 3, ["nsyice", "luanwu"]], + ns_chendao: ["male", "shu", 4, ["nsjianglie"]], + yj_caoang: ["male", "wei", 4, ["yjxuepin"]], + ns_caoanmin: ["male", "wei", 4, ["nskuishe"]], + jsp_liubei: ["male", "qun", 4, ["jsprende"]], }, - characterIntro:{ - lvchang:'吕常(161—221年),荆州南阳博望(今河南省南阳市方城县博望镇)人,汉末至三国时期曹魏将领。吕常曾担任曹魏横海将军、章陵太守,为武猛都尉厉节中郎将裨将军,封关内侯。常以中勇,显名州司,试守雉长,执戈秉戎,慎守易,兵不顿于敌国,坠不侵于四邻,拜武猛都尉厉节中郎将裨将军,封关内侯。王师南征,与充军从,奄有江汉,舍爵册勋,封阴德亭侯,领郡。鸠集荒散,为民统纪,三考有成,转拜平狄将军,改封卢亭侯,莅国赋政,十有三年。会蜀将关羽猖獗为寇,常御之,羽不能克。文帝加其庸,转拜横海将军,徙封西鄂都乡侯,食邑并七百户。年六十一,黄初二年正月卒。', - huangjinleishi:"黄巾军中负责施法的女祭司二人组。", - longyufei:'《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。', - pk_sp_duyu:'杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。', - ps_shen_machao:'字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。', - xiaosha:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为三国杀新手菜鸡,误打误撞参加了三国杀组织的《三国之星》选秀大赛,没想到一路靠着颜值和风风火火的爽快性格过关斩将吸粉无数,获得了冠军,成为官方签约的形象代言人。
    小杀现于B站还存在对应账号,但早已荒废。', - xiaoshan:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀同系不同班的同学,由于本身性格比较安静,所以和风风火火的小杀有些不对盘。知道小杀也玩三国杀后,外表高冷、内心傲娇的她偷偷也去玩了游戏,立志要在游戏里碾压她。
    小闪对应B站账号已销号。', - xiaotao:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀的亲妹妹,陪姐姐去拍摄代言宣传照的时候,被导演看中,觉得三国美貌姐妹花是非常好的噱头,于是一并签下。正所谓“三国姐妹花,永远不分家!”。
    小桃对应B站账号已销号。', - xiaole:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上小乐家与小桃小杀家是世交,三人从小就认识。和小闪是同班同学,小乐很喜欢安静的小闪。和小酒是小杀介绍认识的,大家都是打三国杀的网友,在打游戏时候比较依赖小酒——躺赢人躺赢魂,躺赢都是人上人。
    小乐对应B站账号已销号。', - xiaojiu:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为非人类,是一只年龄成迷的神兽,真身是白泽。是小杀网上玩游戏认识的网友,爱好是喝酒,和小杀也有好酒友的关系。
    小酒对应B站账号已销号。', + characterIntro: { + lvchang: + "吕常(161—221年),荆州南阳博望(今河南省南阳市方城县博望镇)人,汉末至三国时期曹魏将领。吕常曾担任曹魏横海将军、章陵太守,为武猛都尉厉节中郎将裨将军,封关内侯。常以中勇,显名州司,试守雉长,执戈秉戎,慎守易,兵不顿于敌国,坠不侵于四邻,拜武猛都尉厉节中郎将裨将军,封关内侯。王师南征,与充军从,奄有江汉,舍爵册勋,封阴德亭侯,领郡。鸠集荒散,为民统纪,三考有成,转拜平狄将军,改封卢亭侯,莅国赋政,十有三年。会蜀将关羽猖獗为寇,常御之,羽不能克。文帝加其庸,转拜横海将军,徙封西鄂都乡侯,食邑并七百户。年六十一,黄初二年正月卒。", + huangjinleishi: "黄巾军中负责施法的女祭司二人组。", + longyufei: + "《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。", + pk_sp_duyu: + "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。", + ps_shen_machao: + "字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。", + xiaosha: + '2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为三国杀新手菜鸡,误打误撞参加了三国杀组织的《三国之星》选秀大赛,没想到一路靠着颜值和风风火火的爽快性格过关斩将吸粉无数,获得了冠军,成为官方签约的形象代言人。
    小杀现于B站还存在对应账号,但早已荒废。', + xiaoshan: + "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀同系不同班的同学,由于本身性格比较安静,所以和风风火火的小杀有些不对盘。知道小杀也玩三国杀后,外表高冷、内心傲娇的她偷偷也去玩了游戏,立志要在游戏里碾压她。
    小闪对应B站账号已销号。", + xiaotao: + "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀的亲妹妹,陪姐姐去拍摄代言宣传照的时候,被导演看中,觉得三国美貌姐妹花是非常好的噱头,于是一并签下。正所谓“三国姐妹花,永远不分家!”。
    小桃对应B站账号已销号。", + xiaole: "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上小乐家与小桃小杀家是世交,三人从小就认识。和小闪是同班同学,小乐很喜欢安静的小闪。和小酒是小杀介绍认识的,大家都是打三国杀的网友,在打游戏时候比较依赖小酒——躺赢人躺赢魂,躺赢都是人上人。
    小乐对应B站账号已销号。", + xiaojiu: + "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为非人类,是一只年龄成迷的神兽,真身是白泽。是小杀网上玩游戏认识的网友,爱好是喝酒,和小杀也有好酒友的关系。
    小酒对应B站账号已销号。", }, - characterTitle:{ - jsp_liubei:'S1019', - ns_caoanmin:'S1023', - longyufei:'S1044', - ps1059_guojia:'S1059', - ps_lvbu:'S1061', - ps1062_zhouyu:'S1062', - ps_jiaxu:'S1066', - ps_jin_simayi:'S1067', - ps_guanyu:'S2065', - ps2063_zhaoyun:'S2063', - ps2066_zhugeliang:'S2066', - ps2067_zhaoyun:'S2067', - ps2068_simayi:'S2068', - ps_machao:'S2069', - ps2070_guojia:'S2070', - ps_simayi:'S2073', - ps_zhugeliang:'S2073', - ps_caopi:'S2075', - ns_jiaxu:'S2079', - ps2080_zhouyu:'S2080', - ps_caozhi:'S2081', - ps_shen_machao:'SX015', + characterTitle: { + jsp_liubei: "S1019", + ns_caoanmin: "S1023", + longyufei: "S1044", + ps1059_guojia: "S1059", + ps_lvbu: "S1061", + ps1062_zhouyu: "S1062", + ps_jiaxu: "S1066", + ps_jin_simayi: "S1067", + ps_guanyu: "S2065", + ps2063_zhaoyun: "S2063", + ps2066_zhugeliang: "S2066", + ps2067_zhaoyun: "S2067", + ps2068_simayi: "S2068", + ps_machao: "S2069", + ps2070_guojia: "S2070", + ps_simayi: "S2073", + ps_zhugeliang: "S2073", + ps_caopi: "S2075", + ns_jiaxu: "S2079", + ps2080_zhouyu: "S2080", + ps_caozhi: "S2081", + ps_shen_machao: "SX015", }, - perfectPair:{}, - card:{ - yanxiao_card:{ - type:'special_delay', - fullimage:true, - noEffect:true, - ai:{ - basic:{ - order:1, - useful:1, - value:8, + perfectPair: {}, + card: { + yanxiao_card: { + type: "special_delay", + fullimage: true, + noEffect: true, + ai: { + basic: { + order: 1, + useful: 1, + value: 8, }, - result:{ - target:1 + result: { + target: 1, }, - } + }, }, }, - characterFilter:{ - }, - skill:{ + characterFilter: {}, + skill: { //龙起襄樊 //关羽 //界界关羽 - dragchaojue:{ - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - if(!game.hasPlayer(target=>target!=player)) return false; - return player.countCards('h',card=>_status.connectMode||lib.filter.cardDiscardable(card,player)); + dragchaojue: { + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + if (!game.hasPlayer((target) => target != player)) return false; + return player.countCards( + "h", + (card) => _status.connectMode || lib.filter.cardDiscardable(card, player) + ); }, - async cost(event,trigger,player){ - event.result=await player.chooseToDiscard(get.prompt2('dragchaojue'),'h').set('ai',card=>{ - const player=get.event('player'); - if(!game.hasPlayer(target=>get.attitude(player,target)<0)) return 0; - return 7.5-get.value(card); - }).set('logSkill','dragchaojue').forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseToDiscard(get.prompt2("dragchaojue"), "h") + .set("ai", (card) => { + const player = get.event("player"); + if (!game.hasPlayer((target) => get.attitude(player, target) < 0)) return 0; + return 7.5 - get.value(card); + }) + .set("logSkill", "dragchaojue") + .forResult(); }, - popup:false, - async content(event,trigger,player){ - const targets=game.filterPlayer(target=>target!=player).sortBySeat(); - if(targets.length){ - const suits=event.cards.reduce((list,card)=>list.add(get.suit(card,player)),[]).sort((a,b)=>{ - return lib.suit.indexOf(a)-lib.suit.indexOf(b); - }); + popup: false, + async content(event, trigger, player) { + const targets = game.filterPlayer((target) => target != player).sortBySeat(); + if (targets.length) { + const suits = event.cards + .reduce((list, card) => list.add(get.suit(card, player)), []) + .sort((a, b) => { + return lib.suit.indexOf(a) - lib.suit.indexOf(b); + }); player.line(targets); - for(const i of targets){ - i.addTempSkill('dragchaojue_buff'); - i.markAuto('dragchaojue_buff',suits); + for (const i of targets) { + i.addTempSkill("dragchaojue_buff"); + i.markAuto("dragchaojue_buff", suits); } - for(const target of targets){ - const {result:{bool}}=await target.chooseToGive(player,(card,player)=>{ - return get.event('suits').includes(get.suit(card)); - },'h','give').set('suits',suits).set('ai',card=>{ - const player=get.event('player'),target=get.event().getParent().player; - const att=get.attitude(player,target); - if(att>0) return 7.5-get.value(card); - if(att==0&&get.attitude(target,player)==0) return 0; - if(att<0&&get.attitude(target,player)<0&&player.getSkills(null,false,false).some(skill=>{ - if(get.is.locked(skill,player)) return false; - const info=get.info(skill); - return info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend); - })&&player.getHp()>2) return 0; - return 7.5-get.value(card); - }).set('prompt','超绝:交给'+get.translation(player)+'一张'+get.translation(suits)+'手牌,或本回合非锁定技失效'); - if(!bool) target.addTempSkill('fengyin'); + for (const target of targets) { + const { + result: { bool }, + } = await target + .chooseToGive( + player, + (card, player) => { + return get.event("suits").includes(get.suit(card)); + }, + "h", + "give" + ) + .set("suits", suits) + .set("ai", (card) => { + const player = get.event("player"), + target = get.event().getParent().player; + const att = get.attitude(player, target); + if (att > 0) return 7.5 - get.value(card); + if (att == 0 && get.attitude(target, player) == 0) return 0; + if ( + att < 0 && + get.attitude(target, player) < 0 && + player.getSkills(null, false, false).some((skill) => { + if (get.is.locked(skill, player)) return false; + const info = get.info(skill); + return ( + info && + info.ai && + (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend) + ); + }) && + player.getHp() > 2 + ) + return 0; + return 7.5 - get.value(card); + }) + .set( + "prompt", + "超绝:交给" + + get.translation(player) + + "一张" + + get.translation(suits) + + "手牌,或本回合非锁定技失效" + ); + if (!bool) target.addTempSkill("fengyin"); } } }, - subSkill:{ - buff:{ - onremove:true, - charlotte:true, - mod:{ - cardEnabled2(card,player){ - if(player.getStorage('jsrgguanjue_ban').includes(get.suit(card))) return false; + subSkill: { + buff: { + onremove: true, + charlotte: true, + mod: { + cardEnabled2(card, player) { + if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) + return false; }, }, - marktext:'绝', - intro:{content:'本回合内不能使用或打出$牌'}, + marktext: "绝", + intro: { content: "本回合内不能使用或打出$牌" }, }, }, }, - dragjunshen:{ - mod:{ - targetInRange(card,player){ - if(get.suit(card)=='diamond'&&card.name=='sha') return true; + dragjunshen: { + mod: { + targetInRange(card, player) { + if (get.suit(card) == "diamond" && card.name == "sha") return true; }, }, - locked:false, - enable:['chooseToUse','chooseToRespond'], - filterCard(card,player){ - return get.color(card)=='red'; + locked: false, + enable: ["chooseToUse", "chooseToRespond"], + filterCard(card, player) { + return get.color(card) == "red"; }, - viewAsFilter(player){ - return player.countCards('hes',{color:'red'}); + viewAsFilter(player) { + return player.countCards("hes", { color: "red" }); }, - position:'hes', - viewAs:{name:'sha'}, - prompt:'将一张红色牌当作【杀】使用或打出', - check(card){ - const val=get.value(card); - if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); - return 5-val; + position: "hes", + viewAs: { name: "sha" }, + prompt: "将一张红色牌当作【杀】使用或打出", + check(card) { + const val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 5 - val; }, - ai:{ - order(item,player){ - if(!player||!_status.event.type||_status.event.type!='phase'){ + ai: { + order(item, player) { + if (!player || !_status.event.type || _status.event.type != "phase") { return 0.1; } - return get.order({name:'sha'},player)+0.3; + return get.order({ name: "sha" }, player) + 0.3; }, - respondSha:true, - skillTagFilter(player){ - if(!player.countCards('hes',{color:'red'})) return false; + respondSha: true, + skillTagFilter(player) { + if (!player.countCards("hes", { color: "red" })) return false; }, }, - group:['dragjunshen_add','dragjunshen_damage'], - subSkill:{ - add:{ - trigger:{player:'useCard2'}, - filter(event,player){ - if(event.card.name!='sha'||get.suit(event.card)!='heart') return false; - return game.hasPlayer(target=>{ - return target!=player&&!event.targets.includes(target)&&lib.filter.targetEnabled2(event.card,player,target)&&lib.filter.targetInRange(event.card,player,target); + group: ["dragjunshen_add", "dragjunshen_damage"], + subSkill: { + add: { + trigger: { player: "useCard2" }, + filter(event, player) { + if (event.card.name != "sha" || get.suit(event.card) != "heart") return false; + return game.hasPlayer((target) => { + return ( + target != player && + !event.targets.includes(target) && + lib.filter.targetEnabled2(event.card, player, target) && + lib.filter.targetInRange(event.card, player, target) + ); }); }, - async cost(event,trigger,player){ - event.result=await player.chooseTarget(get.prompt('dragjunshen_add'),'为'+get.translation(trigger.card)+'额外指定一个目标',(card,player,target)=>{ - const evt=get.event().getTrigger(); - return target!=player&&!evt.targets.includes(target)&&lib.filter.targetEnabled2(evt.card,player,target)&&lib.filter.targetInRange(evt.card,player,target); - }).set('ai',target=>get.effect(target,_status.event.getTrigger().card,_status.event.player)).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("dragjunshen_add"), + "为" + get.translation(trigger.card) + "额外指定一个目标", + (card, player, target) => { + const evt = get.event().getTrigger(); + return ( + target != player && + !evt.targets.includes(target) && + lib.filter.targetEnabled2(evt.card, player, target) && + lib.filter.targetInRange(evt.card, player, target) + ); + } + ) + .set("ai", (target) => + get.effect(target, _status.event.getTrigger().card, _status.event.player) + ) + .forResult(); }, - content(){ + content() { trigger.targets.addArray(event.targets); }, }, - damage:{ - trigger:{source:'damageBegin1'}, - filter(event,player){ - const evt=event.getParent(2); - return evt.name=='useCard'&&evt.skill=='dragjunshen'; + damage: { + trigger: { source: "damageBegin1" }, + filter(event, player) { + const evt = event.getParent(2); + return evt.name == "useCard" && evt.skill == "dragjunshen"; }, - logTarget:'player', - prompt2(event,player){ - return '令'+get.translation(event.player)+'选择弃置装备区所有牌或令此伤害+1'; + logTarget: "player", + prompt2(event, player) { + return "令" + get.translation(event.player) + "选择弃置装备区所有牌或令此伤害+1"; }, - async content(event,trigger,player){ - const target=trigger.player; + async content(event, trigger, player) { + const target = trigger.player; let result; - if(!target.countDiscardableCards(target,'e')) result={index:1}; - else result=await target.chooseControl().set('choiceList',[ - '弃置装备区所有牌', - '令此伤害+1', - ]).set('ai',()=>{ - const player=get.event('player'),trigger=get.event().getTrigger(); - if(player.getHp()<=2||player.getDiscardableCards(player,'e').reduce((sum,card)=>{ - return sum+get.value(card,player); - },0)<7) return 0; - return 1; - }).forResult(); - if(result.index==0){ - await target.discard(target.getDiscardableCards(target,'e')); - } - else trigger.increase('num'); + if (!target.countDiscardableCards(target, "e")) result = { index: 1 }; + else + result = await target + .chooseControl() + .set("choiceList", ["弃置装备区所有牌", "令此伤害+1"]) + .set("ai", () => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + if ( + player.getHp() <= 2 || + player.getDiscardableCards(player, "e").reduce((sum, card) => { + return sum + get.value(card, player); + }, 0) < 7 + ) + return 0; + return 1; + }) + .forResult(); + if (result.index == 0) { + await target.discard(target.getDiscardableCards(target, "e")); + } else trigger.increase("num"); }, }, }, }, //龙曹仁 - draglizhong:{ - trigger:{player:'phaseJieshuBegin'}, - async cost(event,trigger,player){ - let choiceList=[ - '将任意张装备牌至于任意名角色的装备区', - '令你或任意名装备区里有牌的角色摸一张牌', - ],choices=['置入装备','团体摸牌','cancel2']; - if(!player.countCards('he',card=>{ - if(get.type(card)!='equip') return false; - return game.hasPlayer(target=>{ - return target.canEquip(card); + draglizhong: { + trigger: { player: "phaseJieshuBegin" }, + async cost(event, trigger, player) { + let choiceList = [ + "将任意张装备牌至于任意名角色的装备区", + "令你或任意名装备区里有牌的角色摸一张牌", + ], + choices = ["置入装备", "团体摸牌", "cancel2"]; + if ( + !player.countCards("he", (card) => { + if (get.type(card) != "equip") return false; + return game.hasPlayer((target) => { + return target.canEquip(card); + }); }) - })){ + ) { choices.shift(); - choiceList[0]=''+choiceList[0]+''; + choiceList[0] = '' + choiceList[0] + ""; } - const {result:{control}}=await player.chooseControl(choices) - .set('prompt','###'+get.prompt('draglizhong')+'###选择首先执行的一项') - .set('choiceList',choiceList).set('ai',()=>{ - return get.event('controls')[0]; - }); - event.result={bool:(control!='cancel2'),cost_data:control}; + const { + result: { control }, + } = await player + .chooseControl(choices) + .set("prompt", "###" + get.prompt("draglizhong") + "###选择首先执行的一项") + .set("choiceList", choiceList) + .set("ai", () => { + return get.event("controls")[0]; + }); + event.result = { bool: control != "cancel2", cost_data: control }; }, - async content(event,trigger,player){ - let choices=['置入装备','团体摸牌'],used=false; - if(event.cost_data=='团体摸牌') choices.reverse(); + async content(event, trigger, player) { + let choices = ["置入装备", "团体摸牌"], + used = false; + if (event.cost_data == "团体摸牌") choices.reverse(); choices.push(event.cost_data); - for(let i=1;i<=3;i++){ - if(i==3&&used) break; - switch(choices[i-1]){ - case '置入装备': - while(player.hasCard(card=>{ - if(get.type(card)!='equip') return false; - return game.hasPlayer(target=>{ - return target.canEquip(card); - }) - },'he')){ - const {result:{bool,cards,targets}}=await player.chooseCardTarget({ - prompt:'厉战:将一张装备牌置于一名角色的装备区', - filterCard(card){ - return get.type(card)=='equip'; + for (let i = 1; i <= 3; i++) { + if (i == 3 && used) break; + switch (choices[i - 1]) { + case "置入装备": + while ( + player.hasCard((card) => { + if (get.type(card) != "equip") return false; + return game.hasPlayer((target) => { + return target.canEquip(card); + }); + }, "he") + ) { + const { + result: { bool, cards, targets }, + } = await player.chooseCardTarget({ + prompt: "厉战:将一张装备牌置于一名角色的装备区", + filterCard(card) { + return get.type(card) == "equip"; }, - position:'he', - filterTarget(card,player,target){ + position: "he", + filterTarget(card, player, target) { return target.canEquip(card); }, - ai1(card){ - return 6-get.value(card); + ai1(card) { + return 6 - get.value(card); }, - ai2(target){ - const player=get.event('player'); - const att=get.attitude(player,target); - if(att<=0||target.countCards('e')) return 0; - return att*(target==player?1:3); + ai2(target) { + const player = get.event("player"); + const att = get.attitude(player, target); + if (att <= 0 || target.countCards("e")) return 0; + return att * (target == player ? 1 : 3); }, }); - if(bool){ - if(i==1&&!used) used=true; - const card=cards[0],target=targets[0]; + if (bool) { + if (i == 1 && !used) used = true; + const card = cards[0], + target = targets[0]; player.line(target); - if(target!=player){ - player.$give(card,target,false); + if (target != player) { + player.$give(card, target, false); } await game.asyncDelay(0.5); await target.equip(card); - } - else break; + } else break; } break; - case '团体摸牌': - const {result}=await player.chooseTarget('厉战:令你或任意名装备区有牌的角色摸一张牌',(card,player,target)=>{ - if(target!=player&&!target.countCards('e')) return false; - if(ui.selected.targets.length){ - const choose=ui.selected.targets[0]; - if(choose==player&&!player.countCards('e')) return false; - } - return true; - },[1,Infinity]).set('multitarget',true).set('complexTarget',true).set('ai',target=>{ - const player=get.event('player'); - if(!player.countCards('e')){ - if(game.countPlayer(choose=>{ - return choose.countCards('e')&&get.attitude(player,choose)>0; - })>1&&target==player) return 0; - } - return get.attitude(player,target); - }); - if(result.bool){ - if(i==1&&!used) used=true; - const targets=result.targets.sortBySeat(); + case "团体摸牌": + const { result } = await player + .chooseTarget( + "厉战:令你或任意名装备区有牌的角色摸一张牌", + (card, player, target) => { + if (target != player && !target.countCards("e")) return false; + if (ui.selected.targets.length) { + const choose = ui.selected.targets[0]; + if (choose == player && !player.countCards("e")) return false; + } + return true; + }, + [1, Infinity] + ) + .set("multitarget", true) + .set("complexTarget", true) + .set("ai", (target) => { + const player = get.event("player"); + if (!player.countCards("e")) { + if ( + game.countPlayer((choose) => { + return ( + choose.countCards("e") && + get.attitude(player, choose) > 0 + ); + }) > 1 && + target == player + ) + return 0; + } + return get.attitude(player, target); + }); + if (result.bool) { + if (i == 1 && !used) used = true; + const targets = result.targets.sortBySeat(); player.line(targets); choices.addArray(targets); - for(let j=0;j0; + enable: "chooseToUse", + filterCard: true, + position: "e", + viewAs: { name: "wuxie" }, + filter(event, player) { + return player.countCards("e") > 0; }, - viewAsFilter(player){ - return player.countCards('e')>0; + viewAsFilter(player) { + return player.countCards("e") > 0; }, - prompt:'将一张装备区的牌当作【无懈可击】使用', - check(card){ - return 8-get.equipValue(card); + prompt: "将一张装备区的牌当作【无懈可击】使用", + check(card) { + return 8 - get.equipValue(card); }, - mark:true, - marktext:'守', - intro:{content:'手牌上限+2,可将装备区的牌当作【无懈可击】使用'}, + mark: true, + marktext: "守", + intro: { content: "手牌上限+2,可将装备区的牌当作【无懈可击】使用" }, }, }, }, //撅碎(难视 - dragjuesui:{ - trigger:{global:'dying'}, - filter(event,player){ - return !player.getStorage('dragjuesui').includes(event.player)&&event.player.hasEnabledSlot(); + dragjuesui: { + trigger: { global: "dying" }, + filter(event, player) { + return ( + !player.getStorage("dragjuesui").includes(event.player) && + event.player.hasEnabledSlot() + ); }, - check(event,player){ - const target=event.player; - if(get.attitude(player,target)<=0) return false; - return player.countCards('hs',card=>player.canSaveCard(card,target))+target.countCards('hs',card=>target.canSaveCard(card,target))<1-target.hp; + check(event, player) { + const target = event.player; + if (get.attitude(player, target) <= 0) return false; + return ( + player.countCards("hs", (card) => player.canSaveCard(card, target)) + + target.countCards("hs", (card) => target.canSaveCard(card, target)) < + 1 - target.hp + ); }, - logTarget:'player', - async content(event,trigger,player){ - const target=trigger.player; - player.markAuto('dragjuesui',[target]); - const {result:{bool}}=await target.chooseBool('是否将体力值回复至1点并废除装备栏?'); - if(bool){ + logTarget: "player", + async content(event, trigger, player) { + const target = trigger.player; + player.markAuto("dragjuesui", [target]); + const { + result: { bool }, + } = await target.chooseBool("是否将体力值回复至1点并废除装备栏?"); + if (bool) { await target.recoverTo(1); - let disables=[]; - for(let i=1;i<=5;i++){ - for(let j=0;j{ - return get.color(card)=='black'&&get.type(card)!='basic'; - })) return false; + position: "hse", + viewAs: { name: "sha", storage: { dragjuesui: true } }, + viewAsFilter(player) { + if ( + !player.countCards("hes", (card) => { + return get.color(card) == "black" && get.type(card) != "basic"; + }) + ) + return false; }, - prompt:'将一张黑色非基本牌当作无次数限制的【杀】使用或打出', - check(card){ - return 7-get.value(card); + prompt: "将一张黑色非基本牌当作无次数限制的【杀】使用或打出", + check(card) { + return 7 - get.value(card); }, - ai:{ - order(item,player){ - if(!player||!_status.event.type||_status.event.type!='phase'){ + ai: { + order(item, player) { + if (!player || !_status.event.type || _status.event.type != "phase") { return 0.1; } - return get.order({name:'sha'},player)*0.99; + return get.order({ name: "sha" }, player) * 0.99; }, - respondSha:true, - skillTagFilter(player){ - if(!player.countCards('hes',card=>{ - return get.color(card)=='black'&&get.type(card)!='basic'; - })) return false; + respondSha: true, + skillTagFilter(player) { + if ( + !player.countCards("hes", (card) => { + return get.color(card) == "black" && get.type(card) != "basic"; + }) + ) + return false; }, }, }, }, }, //吕常×SP淳于琼√ - dragjuwu:{ - trigger:{target:'shaBefore'}, - filter(event,player){ - return game.countPlayer(target=>event.player.inRange(target))>=3; + dragjuwu: { + trigger: { target: "shaBefore" }, + filter(event, player) { + return game.countPlayer((target) => event.player.inRange(target)) >= 3; }, - forced:true, - content(){ + forced: true, + content() { trigger.cancel(); }, - ai:{ - effect:{ - target(card,player,target){ - if(card.name=='sha'&&game.countPlayer(targetx=>player.inRange(targetx))>=3) return 'zerotarget'; + ai: { + effect: { + target(card, player, target) { + if ( + card.name == "sha" && + game.countPlayer((targetx) => player.inRange(targetx)) >= 3 + ) + return "zerotarget"; }, }, }, }, - dragshouxiang:{ - trigger:{player:'phaseDrawBegin2'}, - filter(event,player){ - if(!game.hasPlayer(target=>target.inRange(player))) return false; + dragshouxiang: { + trigger: { player: "phaseDrawBegin2" }, + filter(event, player) { + if (!game.hasPlayer((target) => target.inRange(player))) return false; return !event.numFixed; }, - check(event,player){ - if(player.skipList.includes('phaseUse')) return true; - return player.countCards('h')+event.num+Math.min(5,game.countPlayer(target=>{ - return target.inRange(player); - }))-game.countPlayer(target=>{ - return target!=player&&get.attitude(player,target)>0; - })<=player.getHandcardLimit(); + check(event, player) { + if (player.skipList.includes("phaseUse")) return true; + return ( + player.countCards("h") + + event.num + + Math.min( + 5, + game.countPlayer((target) => { + return target.inRange(player); + }) + ) - + game.countPlayer((target) => { + return target != player && get.attitude(player, target) > 0; + }) <= + player.getHandcardLimit() + ); }, - content(){ - trigger.num+=Math.min(5,game.countPlayer(target=>target.inRange(player))); - player.skip('phaseUse'); - player.addTempSkill('dragshouxiang_effect'); + content() { + trigger.num += Math.min( + 5, + game.countPlayer((target) => target.inRange(player)) + ); + player.skip("phaseUse"); + player.addTempSkill("dragshouxiang_effect"); }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{player:'phaseDiscardBegin'}, - filter(event,player){ - return game.hasPlayer(target=>target.inRange(player)); + subSkill: { + effect: { + charlotte: true, + trigger: { player: "phaseDiscardBegin" }, + filter(event, player) { + return game.hasPlayer((target) => target.inRange(player)); }, - forced:true, - async content(event,trigger,player){ - const num=Math.min(5,game.countPlayer(target=>target.inRange(player))); - if(num){ - if(_status.connectMode) game.broadcastAll(()=>_status.noclearcountdown=true); - let list=[]; - while(num-list.length>0&&player.hasCard(card=>{ - return !list.some(list=>list[1]==card); - },'h')&&game.hasPlayer(target=>{ - return target!=player&&!list.some(list=>list[0]==target); - })){ - const {result:{bool,targets,cards}}=await player.chooseCardTarget({ - prompt:'守襄:你可以交给任意名角色各一张手牌', - prompt2:'(还可分配'+(num-list.length)+'张)', - position:'h', - animate:false, - filterCard(card,player){ - return !get.event('list').some(list=>list[1]==card); - }, - filterTarget(card,player,target){ - return target!=player&&!get.event('list').some(list=>list[0]==target); - }, - ai1(card){ - if(card.name=='shan') return 1; - return Math.random(); - }, - ai2(target){ - return get.attitude(get.event('player'),target); - }, - }).set('list',list); - if(bool){ - list.push([targets[0],cards[0]]); - player.addGaintag(cards,'olsujian_given'); - } - else break; + forced: true, + async content(event, trigger, player) { + const num = Math.min( + 5, + game.countPlayer((target) => target.inRange(player)) + ); + if (num) { + if (_status.connectMode) + game.broadcastAll(() => (_status.noclearcountdown = true)); + let list = []; + while ( + num - list.length > 0 && + player.hasCard((card) => { + return !list.some((list) => list[1] == card); + }, "h") && + game.hasPlayer((target) => { + return target != player && !list.some((list) => list[0] == target); + }) + ) { + const { + result: { bool, targets, cards }, + } = await player + .chooseCardTarget({ + prompt: "守襄:你可以交给任意名角色各一张手牌", + prompt2: "(还可分配" + (num - list.length) + "张)", + position: "h", + animate: false, + filterCard(card, player) { + return !get.event("list").some((list) => list[1] == card); + }, + filterTarget(card, player, target) { + return ( + target != player && + !get.event("list").some((list) => list[0] == target) + ); + }, + ai1(card) { + if (card.name == "shan") return 1; + return Math.random(); + }, + ai2(target) { + return get.attitude(get.event("player"), target); + }, + }) + .set("list", list); + if (bool) { + list.push([targets[0], cards[0]]); + player.addGaintag(cards, "olsujian_given"); + } else break; } - if(_status.connectMode){ - game.broadcastAll(()=>{ + if (_status.connectMode) { + game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose(); }); } - if(list.length){ - await game.loseAsync({ - gain_list:list, - player:player, - cards:list.slice().map(list=>list[1]), - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); + if (list.length) { + await game + .loseAsync({ + gain_list: list, + player: player, + cards: list.slice().map((list) => list[1]), + giver: player, + animate: "giveAuto", + }) + .setContent("gaincardMultiple"); } } }, @@ -621,3238 +833,4067 @@ game.import('character', function () { }, //天书乱斗虚拟偶像线下化 //小杀 - vtbguisha:{ - audio:1, - trigger:{global:'useCard'}, - direct:true, - shaRelated:true, - filter:function(event,player){ - return event.player!=player&&event.card.name=='sha'&&player.countCards('he')>0&&event.player.isPhaseUsing(); + vtbguisha: { + audio: 1, + trigger: { global: "useCard" }, + direct: true, + shaRelated: true, + filter: function (event, player) { + return ( + event.player != player && + event.card.name == "sha" && + player.countCards("he") > 0 && + event.player.isPhaseUsing() + ); }, - content:function(){ - 'step 0' - var go=false,d1=false; - if(get.attitude(player,trigger.player)>0){ - d1=true; - if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false; - for(var target of trigger.targets){ - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))||trigger.player.hasSkillTag('directHit_ai',true,{ - target:target, - card:trigger.card, - },true)){ - if(!target.hasSkill('gangzhi')) d1=false; - if(target.hasSkillTag('filterDamage',null,{ - player:trigger.player, - card:trigger.card, - })||get.attitude(player,target)>=0) d1=false; + content: function () { + "step 0"; + var go = false, + d1 = false; + if (get.attitude(player, trigger.player) > 0) { + d1 = true; + if (trigger.player.hasSkill("jueqing") || trigger.player.hasSkill("gangzhi")) + d1 = false; + for (var target of trigger.targets) { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) || + trigger.player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: trigger.card, + }, + true + ) + ) { + if (!target.hasSkill("gangzhi")) d1 = false; + if ( + target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) || + get.attitude(player, target) >= 0 + ) + d1 = false; } } - if(trigger.addCount===false||!trigger.player.isPhaseUsing()) go=false; - else if(!trigger.player.hasSkill('paoxiao')&& - !trigger.player.hasSkill('tanlin3')&& - !trigger.player.hasSkill('zhaxiang2')&& - !trigger.player.hasSkill('fengnu')&& - !trigger.player.getEquip('zhuge')){ - var nh=trigger.player.countCards('h'); - if(player==trigger.player){ - go=(player.countCards('h','sha')>0); - } - else if(nh>=4){ - go=true; - } - else if(player.countCards('h','sha')){ - if(nh==3){ - go=Math.random()<0.8; + if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false; + else if ( + !trigger.player.hasSkill("paoxiao") && + !trigger.player.hasSkill("tanlin3") && + !trigger.player.hasSkill("zhaxiang2") && + !trigger.player.hasSkill("fengnu") && + !trigger.player.getEquip("zhuge") + ) { + var nh = trigger.player.countCards("h"); + if (player == trigger.player) { + go = player.countCards("h", "sha") > 0; + } else if (nh >= 4) { + go = true; + } else if (player.countCards("h", "sha")) { + if (nh == 3) { + go = Math.random() < 0.8; + } else if (nh == 2) { + go = Math.random() < 0.5; } - else if(nh==2){ - go=Math.random()<0.5; - } - } - else if(nh>=3){ - if(nh==3){ - go=Math.random()<0.5; - } - else if(nh==2){ - go=Math.random()<0.2; + } else if (nh >= 3) { + if (nh == 3) { + go = Math.random() < 0.5; + } else if (nh == 2) { + go = Math.random() < 0.2; } } } } - go=go*Math.random()+d1*Math.random()>0.4; + go = go * Math.random() + d1 * Math.random() > 0.4; //AI停顿 - if(go&&!event.isMine()&&!event.isOnline()&&player.hasCard(function(card){ - return get.value(card)<6&&lib.filter.cardDiscardable(card,player,event.name); - },'he')){ + if ( + go && + !event.isMine() && + !event.isOnline() && + player.hasCard(function (card) { + return ( + get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name) + ); + }, "he") + ) { game.delayx(); } - var next=player.chooseToDiscard(get.prompt('vtbguisha'),'弃置一张牌,令'+get.translation(trigger.player)+'本次使用的【杀】不计入使用次数,且对'+get.translation(trigger.targets)+'造成的伤害+1','he'); - next.logSkill=['vtbguisha',trigger.player]; - next.set('ai',function(card){ - if(_status.event.go){ - return 6-get.value(card); + var next = player.chooseToDiscard( + get.prompt("vtbguisha"), + "弃置一张牌,令" + + get.translation(trigger.player) + + "本次使用的【杀】不计入使用次数,且对" + + get.translation(trigger.targets) + + "造成的伤害+1", + "he" + ); + next.logSkill = ["vtbguisha", trigger.player]; + next.set("ai", function (card) { + if (_status.event.go) { + return 6 - get.value(card); } return 0; }); - next.set('go',go); - 'step 1' - if(result.bool){ - if(trigger.addCount!==false){ - trigger.addCount=false; + next.set("go", go); + ("step 1"); + if (result.bool) { + if (trigger.addCount !== false) { + trigger.addCount = false; trigger.player.getStat().card.sha--; } - trigger.player.addTempSkill('vtbguisha_bonus'); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.vtbguisha_targets=trigger.targets; + trigger.player.addTempSkill("vtbguisha_bonus"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.vtbguisha_targets = trigger.targets; } }, - ai:{ - expose:0.2 + ai: { + expose: 0.2, }, - subSkill:{ - bonus:{ - trigger:{ - source:'damageBegin1', + subSkill: { + bonus: { + trigger: { + source: "damageBegin1", }, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.card.storage&&event.card.storage.vtbguisha_targets&&event.card.storage.vtbguisha_targets.includes(event.player); + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.card.storage && + event.card.storage.vtbguisha_targets && + event.card.storage.vtbguisha_targets.includes(event.player) + ); }, - content:function(){ + content: function () { trigger.num++; - } - } - } + }, + }, + }, }, - vtbshuli:{ - audio:1, - trigger:{ - global:'damageSource', + vtbshuli: { + audio: 1, + trigger: { + global: "damageSource", }, - usable:2, - filter:function(event,player){ - return event.source&&event.source!=player&&event.card&&event.card.name=='sha'&&event.source.isIn(); + usable: 2, + filter: function (event, player) { + return ( + event.source && + event.source != player && + event.card && + event.card.name == "sha" && + event.source.isIn() + ); }, - check:function(event,player){ - return get.attitude(player,event.source)>=0||get.attitude(player,event.source)>=-4 - &&get.distance(_status.currentPhase,player,'absolute')>get.distance(_status.currentPhase,event.source,'absolute'); + check: function (event, player) { + return ( + get.attitude(player, event.source) >= 0 || + (get.attitude(player, event.source) >= -4 && + get.distance(_status.currentPhase, player, "absolute") > + get.distance(_status.currentPhase, event.source, "absolute")) + ); }, - content:function(){ - 'step 0' - var drawers=[trigger.source,player].sortBySeat(_status.currentPhase); + content: function () { + "step 0"; + var drawers = [trigger.source, player].sortBySeat(_status.currentPhase); game.asyncDraw(drawers); }, }, //小闪 - vtbshanwu:{ - audio:1, - trigger:{ - global:'useCardToTarget', + vtbshanwu: { + audio: 1, + trigger: { + global: "useCardToTarget", }, - filter:function(event,player){ - return event.card.name=='sha'&&event.target!=player&&event.isFirstTarget&&player.hasCard(card=>{ - return get.name(card)=='shan'||_status.connectMode; - }); + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.target != player && + event.isFirstTarget && + player.hasCard((card) => { + return get.name(card) == "shan" || _status.connectMode; + }) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('vtbshanwu'),'弃置一张【闪】,取消此【杀】对'+get.translation(trigger.targets)+'的目标',{name:'shan'}).set('logSkill','vtbshanwu').set('ai',card=>{ - if(_status.event.goon) return 6-get.value(card); - return 0; - }).set('goon',function(){ - var effect=0; - for(var target of trigger.targets){ - var eff=get.effect(target,trigger.card,trigger.player,player); - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))||trigger.player.hasSkillTag('directHit_ai',true,{ - target:target, - card:trigger.card, - },true)){ - eff*=1.25; - } - if(target.hp<=2) eff*=1.1; - effect+=eff; - } - return effect<0; - }()); - 'step 1' - if(result.bool){ - game.log(player,'取消了',trigger.card,'的所有目标'); - trigger.targets.length=0; - trigger.getParent().triggeredTargets2.length=0; + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard( + get.prompt("vtbshanwu"), + "弃置一张【闪】,取消此【杀】对" + get.translation(trigger.targets) + "的目标", + { name: "shan" } + ) + .set("logSkill", "vtbshanwu") + .set("ai", (card) => { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + var effect = 0; + for (var target of trigger.targets) { + var eff = get.effect(target, trigger.card, trigger.player, player); + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) || + trigger.player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: trigger.card, + }, + true + ) + ) { + eff *= 1.25; + } + if (target.hp <= 2) eff *= 1.1; + effect += eff; + } + return effect < 0; + })() + ); + ("step 1"); + if (result.bool) { + game.log(player, "取消了", trigger.card, "的所有目标"); + trigger.targets.length = 0; + trigger.getParent().triggeredTargets2.length = 0; trigger.untrigger(); } }, - ai:{ - expose:0.2 - } + ai: { + expose: 0.2, + }, }, - vtbxianli:{ - audio:1, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + vtbxianli: { + audio: 1, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - usable:2, - filter:function(event,player){ - if(!_status.currentPhase||!_status.currentPhase.isIn()||!_status.currentPhase.countGainableCards(player,'he')) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.some(card=>{ - return get.name(card,false)=='shan'; - }); + usable: 2, + filter: function (event, player) { + if ( + !_status.currentPhase || + !_status.currentPhase.isIn() || + !_status.currentPhase.countGainableCards(player, "he") + ) + return false; + var evt = event.getl(player); + return ( + evt && + evt.cards2 && + evt.cards2.some((card) => { + return get.name(card, false) == "shan"; + }) + ); }, - check:function(event,player){ - return get.effect(_status.currentPhase,{name:'shunshou_copy2'},player,player)>0; + check: function (event, player) { + return get.effect(_status.currentPhase, { name: "shunshou_copy2" }, player, player) > 0; }, - prompt2:function(event,player){ - return '获得'+get.translation(_status.currentPhase)+'的一张牌'; + prompt2: function (event, player) { + return "获得" + get.translation(_status.currentPhase) + "的一张牌"; }, - logTarget:()=>_status.currentPhase, - content:function(){ - 'step 0' - player.gainPlayerCard(_status.currentPhase,'he',true); + logTarget: () => _status.currentPhase, + content: function () { + "step 0"; + player.gainPlayerCard(_status.currentPhase, "he", true); + }, + ai: { + expose: 0.15, }, - ai:{ - expose:0.15, - } }, //小桃 - vtbtaoyan:{ - audio:1, - trigger:{ - player:'phaseBegin', + vtbtaoyan: { + audio: 1, + trigger: { + player: "phaseBegin", }, - direct:true, - content:function(){ - 'step 0' - if(!_status.vtbtaoyan_count){ - _status.vtbtaoyan_count=5; + direct: true, + content: function () { + "step 0"; + if (!_status.vtbtaoyan_count) { + _status.vtbtaoyan_count = 5; } - player.chooseTarget(get.prompt('vtbtaoyan'),'令一或两名其他角色摸一张牌并从游戏外获得一张【桃】(♥6)',lib.filter.notMe,[1,2]).set('ai',target=>{ - var player=_status.event.player; - return get.recoverEffect(target,player,player)/2+get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.slice(); + player + .chooseTarget( + get.prompt("vtbtaoyan"), + "令一或两名其他角色摸一张牌并从游戏外获得一张【桃】(♥6)", + lib.filter.notMe, + [1, 2] + ) + .set("ai", (target) => { + var player = _status.event.player; + return ( + get.recoverEffect(target, player, player) / 2 + get.attitude(player, target) + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.slice(); targets.sortBySeat(); - player.logSkill('vtbtaoyan',targets); - game.broadcastAll(function(){ - if(!lib.inpile.includes('tao')){ - lib.inpile.add('tao'); + player.logSkill("vtbtaoyan", targets); + game.broadcastAll(function () { + if (!lib.inpile.includes("tao")) { + lib.inpile.add("tao"); } }); - player.addSkill('vtbtaoyan_remove'); - for(var target of targets){ + player.addSkill("vtbtaoyan_remove"); + for (var target of targets) { target.draw(); - if(!_status.vtbtaoyan_count) continue; - if(!_status.vtbtaoyan_cards) _status.vtbtaoyan_cards=[]; + if (!_status.vtbtaoyan_count) continue; + if (!_status.vtbtaoyan_cards) _status.vtbtaoyan_cards = []; _status.vtbtaoyan_count--; - var card=game.createCard('tao','heart',6); + var card = game.createCard("tao", "heart", 6); _status.vtbtaoyan_cards.push(card.cardid); - target.gain(card,'gain2'); + target.gain(card, "gain2"); } } }, - ai:{ - expose:0.3, - threaten:3.2, + ai: { + expose: 0.3, + threaten: 3.2, }, - subSkill:{ - remove:{ - trigger:{ - global:['loseAfter','loseAsyncAfter','cardsDiscardAfter','equipAfter'], + subSkill: { + remove: { + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], }, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - forceDie:true, - filter:function(event,player){ - if(typeof _status.vtbtaoyan_count!='number') return false; - var cards=event.getd(); - return cards.some(card=>{ + forced: true, + charlotte: true, + popup: false, + firstDo: true, + forceDie: true, + filter: function (event, player) { + if (typeof _status.vtbtaoyan_count != "number") return false; + var cards = event.getd(); + return cards.some((card) => { return _status.vtbtaoyan_cards.includes(card.cardid); }); }, - content:function(){ - var cards=trigger.getd(),remove=[]; - for(var card of cards){ - if(_status.vtbtaoyan_cards.includes(card.cardid)){ + content: function () { + var cards = trigger.getd(), + remove = []; + for (var card of cards) { + if (_status.vtbtaoyan_cards.includes(card.cardid)) { _status.vtbtaoyan_cards.remove(card.cardid); remove.push(card); } } - if(remove.length){ - remove.forEach(i=>{ + if (remove.length) { + remove.forEach((i) => { i.remove(); _status.vtbtaoyan_count++; }); - game.log(remove,'被移出了游戏'); + game.log(remove, "被移出了游戏"); } }, - } - } + }, + }, }, - vtbyanli:{ - audio:1, - trigger:{ - global:'dying', + vtbyanli: { + audio: 1, + trigger: { + global: "dying", }, - filter:function(event,player){ - if(player.hasSkill('vtbyanli_used')) return false; - if(_status.currentPhase==player) return false; - return event.player.hp<=0; + filter: function (event, player) { + if (player.hasSkill("vtbyanli_used")) return false; + if (_status.currentPhase == player) return false; + return event.player.hp <= 0; }, - check:function(event,player){ - return get.recoverEffect(event.player,player,player)>0; + check: function (event, player) { + return get.recoverEffect(event.player, player, player) > 0; }, - content:function(){ - 'step 0' - player.addTempSkill('vtbyanli_used','roundStart'); - trigger.player.recover(1-trigger.player.hp); + content: function () { + "step 0"; + player.addTempSkill("vtbyanli_used", "roundStart"); + trigger.player.recover(1 - trigger.player.hp); trigger.player.draw(); }, - subSkill:{ - used:{ - charlotte:true, - } - } + subSkill: { + used: { + charlotte: true, + }, + }, }, //小乐 - vtbleyu:{ - audio:1, - trigger:{ - global:'phaseBegin', - }, - direct:true, - filter:function(event,player){ - return player.countCards('he')>=3; - }, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('vtbleyu',trigger.player),3,'he').set('ai',card=>{ - if(ui.selected.cards.length==2) return 10-get.value(card); - if(_status.event.effect>0){ - return 6-get.value(card); - } - return 0; - }).set('effect',trigger.player.hasJudge('lebu')?0:get.effect(trigger.player,{name:'lebu'},player,player)).set('logSkill',['vtbleyu',trigger.player]); - 'step 1' - if(result.bool){ - trigger.player.judge(lib.card.lebu.judge).judge2=lib.card.lebu.judge2; - } else event.finish(); - 'step 2' - if(!result.bool){ - trigger.player.skip('phaseUse'); - } - }, - ai:{ - expose:0.3, - threaten:2.9, - }, - }, - vtbyuanli:{ - audio:1, - trigger:{global:['phaseUseSkipped','phaseUseCancelled']}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('vtbyuanli'),lib.filter.notMe).set('ai',target=>get.attitude(_status.event.player,target)+1); - 'step 1' - if(result.bool){ - player.logSkill('vtbyuanli',result.targets[0]); - game.asyncDraw([player,result.targets[0]].sortBySeat(_status.currentPhase)); - } - }, - ai:{ - expose:0.1, - }, - }, - vtbmeiniang:{ - audio:1, - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return event.player!=player; - }, - check:function(event,player){ - return get.attitude(player,event.player)>0&&event.player.getUseValue('jiu')>=0; - }, - logTarget:'player', - content:function(){ - trigger.player.chooseUseTarget('jiu',true,false); - } - }, - vtbyaoli:{ - audio:1, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.card.name=='jiu'&&event.player!=player&&event.player.isPhaseUsing(); - }, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)>0; + vtbleyu: { + audio: 1, + trigger: { + global: "phaseBegin", }, - content:function(){ - trigger.player.addTempSkill('vtbyaoli_effect'); - trigger.player.addMark('vtbyaoli_effect',1,false); - }, - ai:{ - expose:0.15, - }, - subSkill:{ - effect:{ - audio:'vtbyaoli', - charlotte:true, - trigger:{player:'useCard2'}, - forced:true, - popup:false, - onremove:true, - nopop:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.countMark('vtbyaoli_effect')>0; - }, - content:function(){ - 'step 0' - trigger.directHit.addArray(game.filterPlayer()); - var num=player.countMark('vtbyaoli_effect'); - if(!game.hasPlayer(current=>{ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,player,current); - })) event.finish(); - else player.chooseTarget('媱丽:是否为'+get.translation(trigger.card)+'额外指定'+(num>1?'至多':'')+get.cnNumber(num)+'个目标?',num==1?1:[1,num],(card,player,target)=>{ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else { - event.finish(); - } - 'step 2' - player.logSkill('vtbyaoli_effect',event.targets); - trigger.targets.addArray(event.targets); - player.removeSkill('vtbyaoli_effect'); - }, - marktext:'媱', - intro:{ - content:'下一张【杀】不可被响应且可以额外指定&个目标', - }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg.card.name=='sha'; - }, - } - } - } + direct: true, + filter: function (event, player) { + return player.countCards("he") >= 3; + }, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("vtbleyu", trigger.player), 3, "he") + .set("ai", (card) => { + if (ui.selected.cards.length == 2) return 10 - get.value(card); + if (_status.event.effect > 0) { + return 6 - get.value(card); + } + return 0; + }) + .set( + "effect", + trigger.player.hasJudge("lebu") + ? 0 + : get.effect(trigger.player, { name: "lebu" }, player, player) + ) + .set("logSkill", ["vtbleyu", trigger.player]); + ("step 1"); + if (result.bool) { + trigger.player.judge(lib.card.lebu.judge).judge2 = lib.card.lebu.judge2; + } else event.finish(); + ("step 2"); + if (!result.bool) { + trigger.player.skip("phaseUse"); + } + }, + ai: { + expose: 0.3, + threaten: 2.9, + }, + }, + vtbyuanli: { + audio: 1, + trigger: { global: ["phaseUseSkipped", "phaseUseCancelled"] }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("vtbyuanli"), lib.filter.notMe) + .set("ai", (target) => get.attitude(_status.event.player, target) + 1); + ("step 1"); + if (result.bool) { + player.logSkill("vtbyuanli", result.targets[0]); + game.asyncDraw([player, result.targets[0]].sortBySeat(_status.currentPhase)); + } + }, + ai: { + expose: 0.1, + }, + }, + vtbmeiniang: { + audio: 1, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player != player; + }, + check: function (event, player) { + return get.attitude(player, event.player) > 0 && event.player.getUseValue("jiu") >= 0; + }, + logTarget: "player", + content: function () { + trigger.player.chooseUseTarget("jiu", true, false); + }, + }, + vtbyaoli: { + audio: 1, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.card.name == "jiu" && event.player != player && event.player.isPhaseUsing(); + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + content: function () { + trigger.player.addTempSkill("vtbyaoli_effect"); + trigger.player.addMark("vtbyaoli_effect", 1, false); + }, + ai: { + expose: 0.15, + }, + subSkill: { + effect: { + audio: "vtbyaoli", + charlotte: true, + trigger: { player: "useCard2" }, + forced: true, + popup: false, + onremove: true, + nopop: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countMark("vtbyaoli_effect") > 0; }, + content: function () { + "step 0"; + trigger.directHit.addArray(game.filterPlayer()); + var num = player.countMark("vtbyaoli_effect"); + if ( + !game.hasPlayer((current) => { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, player, current) + ); + }) + ) + event.finish(); + else + player + .chooseTarget( + "媱丽:是否为" + + get.translation(trigger.card) + + "额外指定" + + (num > 1 ? "至多" : "") + + get.cnNumber(num) + + "个目标?", + num == 1 ? 1 : [1, num], + (card, player, target) => { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { + event.finish(); + } + ("step 2"); + player.logSkill("vtbyaoli_effect", event.targets); + trigger.targets.addArray(event.targets); + player.removeSkill("vtbyaoli_effect"); + }, + marktext: "媱", + intro: { + content: "下一张【杀】不可被响应且可以额外指定&个目标", + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.card.name == "sha"; + }, + }, + }, + }, + }, //官盗S特015神马超 - psshouli:{ - audio:'shouli', - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - if(player!=_status.currentPhase&&(name=='sha'||name=='shan')) return true; + psshouli: { + audio: "shouli", + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (player != _status.currentPhase && (name == "sha" || name == "shan")) return true; }, - filter:function(event,player){ - if(event.responded||event.psshouli||event.type=='wuxie') return false; - if(game.hasPlayer(function(current){ - return current.getEquips(4).length>0; - })&&event.filterCard(get.autoViewAs({ - name:'sha', - storage:{psshouli:true}, - },'unsure'),player,event)) return true; - if(game.hasPlayer(function(current){ - return current.getEquips(3).length>0; - })&&event.filterCard(get.autoViewAs({ - name:'shan', - storage:{psshouli:true}, - },'unsure'),player,event)) return true; + filter: function (event, player) { + if (event.responded || event.psshouli || event.type == "wuxie") return false; + if ( + game.hasPlayer(function (current) { + return current.getEquips(4).length > 0; + }) && + event.filterCard( + get.autoViewAs( + { + name: "sha", + storage: { psshouli: true }, + }, + "unsure" + ), + player, + event + ) + ) + return true; + if ( + game.hasPlayer(function (current) { + return current.getEquips(3).length > 0; + }) && + event.filterCard( + get.autoViewAs( + { + name: "shan", + storage: { psshouli: true }, + }, + "unsure" + ), + player, + event + ) + ) + return true; return false; }, - delay:false, - locked:true, - filterTarget:function(card,player,target){ - var event=_status.event,evt=event; - if(event._backup) evt=event._backup; - var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); - var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); - if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({ - name:'shan', - storage:{psshouli:true}, - },[card]),player,event))) return true; - return equip4.some(card=>{ - var sha=get.autoViewAs({ - name:'sha', - storage:{psshouli:true}, - },[card]); - if(evt.filterCard(sha,player,event)){ - if(!evt.filterTarget) return true; - return game.hasPlayer(function(current){ - return evt.filterTarget(sha,player,current); - }) - } - }) - }, - prompt:'将场上的一张坐骑牌当做【杀】或【闪】使用或打出', - content:function(){ - 'step 0' - var evt=event.getParent(2); - evt.set('psshouli',true); - var list=[]; - var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); - var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); - var backupx=_status.event; - _status.event=evt; - try{ - if(equip3.length&&equip3.some(card=>{ - var shan=get.autoViewAs({ - name:'shan', - storage:{psshouli:true}, - },[card]); - if(evt.filterCard(shan,player,event)) return true; - return false; - })){ - list.push('shan'); - } - if(equip4.length&&equip4.some(card=>{ - var sha=get.autoViewAs({ - name:'sha', - storage:{psshouli:true}, - },[card]); - if(evt.filterCard(sha,player,evt)&&(!evt.filterTarget||game.hasPlayer(function(current){ - return evt.filterTarget(sha,player,current); - }))) return true; - return false; - })){ - list.push('sha'); - } - }catch(e){game.print(e)} - _status.event=backupx; - if(list.length==1){ - event.cardName=list[0]; - var cards=list[0]=='shan'?equip3:equip4; - if(cards.length==1) event._result={ - bool:true, - links:[cards[0]], - } - else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - return _status.event.cards.includes(button.link); - }).set('cards',cards) - } - else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - var card=button.link; - return get.is.attackingMount(card)||get.is.defendingMount(card); - }); - 'step 1' - var evt=event.getParent(2); - if(result.bool&&result.links&&result.links.length){ - var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan')); - if(evt.name=='chooseToUse'){ - game.broadcastAll(function(result,name){ - lib.skill.psshouli_backup.viewAs={ - name:name, - cards:[result], - storage:{psshouli:true}, - }; - lib.skill.psshouli_backup.prompt=('选择'+get.translation(name)+'('+get.translation(result)+')的目标'); - },result.links[0],name); - evt.set('_backupevent','psshouli_backup'); - evt.backup('psshouli_backup'); - evt.set('openskilldialog','选择'+get.translation(name)+'('+get.translation(result.links[0])+')的目标'); - evt.set('norestore',true); - evt.set('custom',{ - add:{}, - replace:{window:function(){}} + delay: false, + locked: true, + filterTarget: function (card, player, target) { + var event = _status.event, + evt = event; + if (event._backup) evt = event._backup; + var equip3 = target.getCards("e", (card) => get.is.defendingMount(card, false)); + var equip4 = target.getCards("e", (card) => get.is.attackingMount(card, false)); + if ( + equip3.length && + equip3.some((card) => + evt.filterCard( + get.autoViewAs( + { + name: "shan", + storage: { psshouli: true }, + }, + [card] + ), + player, + event + ) + ) + ) + return true; + return equip4.some((card) => { + var sha = get.autoViewAs( + { + name: "sha", + storage: { psshouli: true }, + }, + [card] + ); + if (evt.filterCard(sha, player, event)) { + if (!evt.filterTarget) return true; + return game.hasPlayer(function (current) { + return evt.filterTarget(sha, player, current); }); } - else{ + }); + }, + prompt: "将场上的一张坐骑牌当做【杀】或【闪】使用或打出", + content: function () { + "step 0"; + var evt = event.getParent(2); + evt.set("psshouli", true); + var list = []; + var equip3 = target.getCards("e", (card) => get.is.defendingMount(card, false)); + var equip4 = target.getCards("e", (card) => get.is.attackingMount(card, false)); + var backupx = _status.event; + _status.event = evt; + try { + if ( + equip3.length && + equip3.some((card) => { + var shan = get.autoViewAs( + { + name: "shan", + storage: { psshouli: true }, + }, + [card] + ); + if (evt.filterCard(shan, player, event)) return true; + return false; + }) + ) { + list.push("shan"); + } + if ( + equip4.length && + equip4.some((card) => { + var sha = get.autoViewAs( + { + name: "sha", + storage: { psshouli: true }, + }, + [card] + ); + if ( + evt.filterCard(sha, player, evt) && + (!evt.filterTarget || + game.hasPlayer(function (current) { + return evt.filterTarget(sha, player, current); + })) + ) + return true; + return false; + }) + ) { + list.push("sha"); + } + } catch (e) { + game.print(e); + } + _status.event = backupx; + if (list.length == 1) { + event.cardName = list[0]; + var cards = list[0] == "shan" ? equip3 : equip4; + if (cards.length == 1) + event._result = { + bool: true, + links: [cards[0]], + }; + else + player + .choosePlayerCard(true, target, "e") + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set("cards", cards); + } else + player.choosePlayerCard(true, target, "e").set("filterButton", function (button) { + var card = button.link; + return get.is.attackingMount(card) || get.is.defendingMount(card); + }); + ("step 1"); + var evt = event.getParent(2); + if (result.bool && result.links && result.links.length) { + var name = + event.cardName || (get.is.attackingMount(result.links[0]) ? "sha" : "shan"); + if (evt.name == "chooseToUse") { + game.broadcastAll( + function (result, name) { + lib.skill.psshouli_backup.viewAs = { + name: name, + cards: [result], + storage: { psshouli: true }, + }; + lib.skill.psshouli_backup.prompt = + "选择" + + get.translation(name) + + "(" + + get.translation(result) + + ")的目标"; + }, + result.links[0], + name + ); + evt.set("_backupevent", "psshouli_backup"); + evt.backup("psshouli_backup"); + evt.set( + "openskilldialog", + "选择" + + get.translation(name) + + "(" + + get.translation(result.links[0]) + + ")的目标" + ); + evt.set("norestore", true); + evt.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + } else { delete evt.result.skill; delete evt.result.used; - evt.result.card=get.autoViewAs({ - name:name, - cards:[result.links[0]], - storage:{psshouli:true}, - },result.links); - evt.result.cards=[result.links[0]]; - target.$give(result.links[0],player,false); - if(player!=target) target.addTempSkill('fengyin'); - target.addTempSkill('psshouli_thunder'); - player.addTempSkill('psshouli_thunder'); + evt.result.card = get.autoViewAs( + { + name: name, + cards: [result.links[0]], + storage: { psshouli: true }, + }, + result.links + ); + evt.result.cards = [result.links[0]]; + target.$give(result.links[0], player, false); + if (player != target) target.addTempSkill("fengyin"); + target.addTempSkill("psshouli_thunder"); + player.addTempSkill("psshouli_thunder"); evt.redo(); return; } } evt.goto(0); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ - var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount']; - return game.hasPlayer(function(current){ - return current.hasCard(card=>func(card,false),'e'); + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + var func = get.is[tag == "respondSha" ? "attackingMount" : "defendingMount"]; + return game.hasPlayer(function (current) { + return current.hasCard((card) => func(card, false), "e"); }); }, - order:2, - result:{ - player:function(player,target){ - var att=Math.max(8,get.attitude(player,target)); - if(_status.event.type!='phase') return 9-att; - if(!player.hasValueTarget({name:'sha'})) return 0; - return 9-att; + order: 2, + result: { + player: function (player, target) { + var att = Math.max(8, get.attitude(player, target)); + if (_status.event.type != "phase") return 9 - att; + if (!player.hasValueTarget({ name: "sha" })) return 0; + return 9 - att; }, }, }, - group:'psshouli_init', - subSkill:{ - thunder:{ - charlotte:true, - trigger:{player:'damageBegin1'}, - forced:true, - mark:true, - content:function(){ + group: "psshouli_init", + subSkill: { + thunder: { + charlotte: true, + trigger: { player: "damageBegin1" }, + forced: true, + mark: true, + content: function () { trigger.num++; - game.setNature(trigger,'thunder'); + game.setNature(trigger, "thunder"); }, - marktext:'⚡', - intro:{ - content:'受到的伤害+1且改为雷属性', + marktext: "⚡", + intro: { + content: "受到的伤害+1且改为雷属性", }, - ai:{ - effect:{ - target:(card,player,target)=>{ - if(!get.tag(card,'damage')) return; - if(target.hasSkillTag('nodamage')||target.hasSkillTag('nothunder')) return 'zeroplayertarget'; - if(target.hasSkillTag('filterDamage',null,{ - player:player, - card:new lib.element.VCard({ - name:card.name, - nature:'thunder' - },[card]) - })) return; + ai: { + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage")) return; + if (target.hasSkillTag("nodamage") || target.hasSkillTag("nothunder")) + return "zeroplayertarget"; + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: new lib.element.VCard( + { + name: card.name, + nature: "thunder", + }, + [card] + ), + }) + ) + return; return 2; - } - } - } + }, + }, + }, }, - init:{ - audio:'psshouli', - trigger:{ - global:'phaseBefore', - player:'enterGame', + init: { + audio: "psshouli", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - logTarget:()=>game.filterPlayer(), - equips:[ - ['heart',5,'chitu'], - ['diamond',13,'zixin'], - ['spade',5,'jueying'], - ['diamond',13,'hualiu'], - ['club',5,'dilu'], - ['spade',13,'dawan'], - ['heart',13,'zhuahuang'], - ['heart',3,'jingfanma'] + logTarget: () => game.filterPlayer(), + equips: [ + ["heart", 5, "chitu"], + ["diamond", 13, "zixin"], + ["spade", 5, "jueying"], + ["diamond", 13, "hualiu"], + ["club", 5, "dilu"], + ["spade", 13, "dawan"], + ["heart", 13, "zhuahuang"], + ["heart", 3, "jingfanma"], ], - content:function(){ - 'step 0' - event.targets=game.filterPlayer().sortBySeat(_status.firstAct2||game.zhong||game.zhu||_status.firstAct||player); - event.target=event.targets.shift(); + content: function () { + "step 0"; + event.targets = game + .filterPlayer() + .sortBySeat( + _status.firstAct2 || game.zhong || game.zhu || _status.firstAct || player + ); + event.target = event.targets.shift(); game.delayx(); - 'step 1' - player.line(target,'green'); - target.chooseToUse('狩骊:使用一张坐骑牌并摸一张牌,或使用一张坐骑牌指示物',function(card,player,event){ - if(get.subtype(card)!='equip3'&&get.subtype(card)!='equip4'&&get.subtype(card)!='equip6') return false; - return lib.filter.filterCard.apply(this,arguments); - }).set('ai',()=>1); - 'step 2' - if(result.bool) target.draw(); - else{ - var cardx=lib.skill.psshouli_init.equips.randomRemove(); - if(!cardx) return; - cardx={ - suit:cardx[0], - number:cardx[1], - name:cardx[2], - } - var card=game.createCard(cardx); - if(!_status.psshouli_equips) _status.psshouli_equips=[]; + ("step 1"); + player.line(target, "green"); + target + .chooseToUse( + "狩骊:使用一张坐骑牌并摸一张牌,或使用一张坐骑牌指示物", + function (card, player, event) { + if ( + get.subtype(card) != "equip3" && + get.subtype(card) != "equip4" && + get.subtype(card) != "equip6" + ) + return false; + return lib.filter.filterCard.apply(this, arguments); + } + ) + .set("ai", () => 1); + ("step 2"); + if (result.bool) target.draw(); + else { + var cardx = lib.skill.psshouli_init.equips.randomRemove(); + if (!cardx) return; + cardx = { + suit: cardx[0], + number: cardx[1], + name: cardx[2], + }; + var card = game.createCard(cardx); + if (!_status.psshouli_equips) _status.psshouli_equips = []; _status.psshouli_equips.push(card.cardid); - if(card){ - target.chooseUseTarget(card,true,'nopopup','noanimate'); - player.addSkill('psshouli_remove'); + if (card) { + target.chooseUseTarget(card, true, "nopopup", "noanimate"); + player.addSkill("psshouli_remove"); } } - 'step 3' - event.target=event.targets.shift(); - if(event.target){ + ("step 3"); + event.target = event.targets.shift(); + if (event.target) { event.goto(1); } }, }, - remove:{ - trigger:{ - global:['loseAfter','loseAsyncAfter','cardsDiscardAfter','equipAfter'], + remove: { + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], }, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - forceDie:true, - filter:function(event,player){ - if(!_status.psshouli_equips||!_status.psshouli_equips.length) return false; - var cards=event.getd(); - return cards.filter(i=>_status.psshouli_equips.includes(i.cardid)).length; + forced: true, + charlotte: true, + popup: false, + firstDo: true, + forceDie: true, + filter: function (event, player) { + if (!_status.psshouli_equips || !_status.psshouli_equips.length) return false; + var cards = event.getd(); + return cards.filter((i) => _status.psshouli_equips.includes(i.cardid)).length; }, - content:function(){ - var cards=trigger.getd(),remove=[]; - for(var card of cards){ - if(_status.psshouli_equips.includes(card.cardid)){ + content: function () { + var cards = trigger.getd(), + remove = []; + for (var card of cards) { + if (_status.psshouli_equips.includes(card.cardid)) { _status.psshouli_equips.remove(card.cardid); remove.push(card); } } - if(remove.length){ + if (remove.length) { game.cardsGotoSpecial(remove); - lib.skill.psshouli_init.equips.addArray(remove.map(i=>[i.suit,i.number,i.name])); - game.log('坐骑指示物',remove,'被移出了游戏'); + lib.skill.psshouli_init.equips.addArray( + remove.map((i) => [i.suit, i.number, i.name]) + ); + game.log("坐骑指示物", remove, "被移出了游戏"); } }, - } + }, }, }, - psshouli_backup:{ - sourceSkill:'psshouli', - precontent:function(){ - 'step 0' + psshouli_backup: { + sourceSkill: "psshouli", + precontent: function () { + "step 0"; delete event.result.skill; - event.result._apply_args={'throw':false}; - var cards=event.result.card.cards; - event.result.cards=cards; - var owner=get.owner(cards[0]); - event.target=owner; + event.result._apply_args = { throw: false }; + var cards = event.result.card.cards; + event.result.cards = cards; + var owner = get.owner(cards[0]); + event.target = owner; owner.$throw(cards[0]); - player.popup(event.result.card.name,'metal'); + player.popup(event.result.card.name, "metal"); game.delayx(); - event.getParent().addCount=false; - 'step 1' - if(player!=target) target.addTempSkill('fengyin'); - target.addTempSkill('psshouli_thunder'); - player.addTempSkill('psshouli_thunder'); + event.getParent().addCount = false; + ("step 1"); + if (player != target) target.addTempSkill("fengyin"); + target.addTempSkill("psshouli_thunder"); + player.addTempSkill("psshouli_thunder"); }, - filterCard:function(){return false}, - prompt:'请选择【杀】的目标', - selectCard:-1, - }, - pshengwu:{ - audio:'hengwu', - mod:{ - aiOrder:(player,card,num)=>{ - if(num>0&&get.tag(card,'draw')&&ui.cardPile.childNodes.length+ui.discardPile.childNodes.length<20) return 0; - }, - aiValue:(player,card,num)=>{ - if(num>0&&card.name==='zhuge') return 20; - }, - aiUseful:(player,card,num)=>{ - if(num>0&&card.name==='zhuge') return 10; - } - }, - trigger:{player:['useCard','respond']}, - direct:true, - locked:false, - filter:function(event,player){ - return game.hasPlayer(i=>i.countCards('ej',cardx=>get.type(cardx)=='equip'&&get.suit(event.card)==get.suit(cardx))); - }, - content:function(){ - 'step 0' - var suit=get.suit(trigger.card),extra=game.filterPlayer().map(i=>i.countCards('ej',cardx=>{ - return get.type(cardx)=='equip'&&get.suit(trigger.card)==get.suit(cardx); - })).reduce((p,c)=>p+c); - var prompt2='弃置任意张'+get.translation(suit)+'手牌,然后摸X张牌(X为你弃置的牌数+'+extra+')'; - player.chooseToDiscard('h',[1,player.countCards('h',{suit:suit})],{suit:suit}).set('prompt',get.prompt('pshengwu')).set('prompt2',prompt2).set('ai',card=>{ - if(_status.event.tie) return 0; - let player=_status.event.player; - if(_status.event.goon) return 12-get.value(card); - if(player==_status.currentPhase){ - if(['shan','caochuan','tao','wuxie'].includes(card.name)) return 8-get.value(card); - return 6-get.value(card); - } - return 5.5-get.value(card); - }).set('goon',player.countCards('h',{suit:suit})==1).set('tie',extra>ui.cardPile.childNodes.length+ui.discardPile.childNodes.length).set('logSkill','pshengwu'); - 'step 1' - if(result.bool){ - var num=result.cards.length; - player.draw(num+game.filterPlayer().map(i=>i.countCards('ej',cardx=>get.type(cardx)=='equip'&&get.suit(trigger.card)==get.suit(cardx))).reduce((p,c)=>p+c)); - } - }, - ai:{ - threaten:100, - reverseEquip:true, - effect:{ - player:(card,player,target)=>{ - if(typeof card!=='object') return; - let suit=get.suit(card); - if(!lib.suit.includes(suit)||player.hasCard(function(i){ - return get.suit(i,player)==suit; - },'h')) return; - return [1,game.countPlayer(current=>{ - return current.countCards('e',card=>{ - return get.suit(card,current)==suit; - }); - })]; - }, - target:(card,player,target)=>{ - if(card.name==='sha'&&!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card - },true)&&game.hasPlayer(current=>{ - return current.hasCard(cardx=>{ - return get.subtype(cardx)==='equip3'; - },'e'); - })) return [0, -0.5]; - } - } - } - }, - //战役篇田丰 - gzsuishi:{ - audio:'suishi', - preHidden:['gzsuishi2'], - trigger:{global:'dying'}, - forced:true, - //priority:6.5, - check:function(){ + filterCard: function () { return false; }, - filter:function(event,player){ - return event.player!=player&&event.parent.name=='damage'&&event.parent.source&&event.parent.source.isFriendOf(player); + prompt: "请选择【杀】的目标", + selectCard: -1, + }, + pshengwu: { + audio: "hengwu", + mod: { + aiOrder: (player, card, num) => { + if ( + num > 0 && + get.tag(card, "draw") && + ui.cardPile.childNodes.length + ui.discardPile.childNodes.length < 20 + ) + return 0; + }, + aiValue: (player, card, num) => { + if (num > 0 && card.name === "zhuge") return 20; + }, + aiUseful: (player, card, num) => { + if (num > 0 && card.name === "zhuge") return 10; + }, }, - content:function(){ + trigger: { player: ["useCard", "respond"] }, + direct: true, + locked: false, + filter: function (event, player) { + return game.hasPlayer((i) => + i.countCards( + "ej", + (cardx) => get.type(cardx) == "equip" && get.suit(event.card) == get.suit(cardx) + ) + ); + }, + content: function () { + "step 0"; + var suit = get.suit(trigger.card), + extra = game + .filterPlayer() + .map((i) => + i.countCards("ej", (cardx) => { + return ( + get.type(cardx) == "equip" && + get.suit(trigger.card) == get.suit(cardx) + ); + }) + ) + .reduce((p, c) => p + c); + var prompt2 = + "弃置任意张" + + get.translation(suit) + + "手牌,然后摸X张牌(X为你弃置的牌数+" + + extra + + ")"; + player + .chooseToDiscard("h", [1, player.countCards("h", { suit: suit })], { suit: suit }) + .set("prompt", get.prompt("pshengwu")) + .set("prompt2", prompt2) + .set("ai", (card) => { + if (_status.event.tie) return 0; + let player = _status.event.player; + if (_status.event.goon) return 12 - get.value(card); + if (player == _status.currentPhase) { + if (["shan", "caochuan", "tao", "wuxie"].includes(card.name)) + return 8 - get.value(card); + return 6 - get.value(card); + } + return 5.5 - get.value(card); + }) + .set("goon", player.countCards("h", { suit: suit }) == 1) + .set("tie", extra > ui.cardPile.childNodes.length + ui.discardPile.childNodes.length) + .set("logSkill", "pshengwu"); + ("step 1"); + if (result.bool) { + var num = result.cards.length; + player.draw( + num + + game + .filterPlayer() + .map((i) => + i.countCards( + "ej", + (cardx) => + get.type(cardx) == "equip" && + get.suit(trigger.card) == get.suit(cardx) + ) + ) + .reduce((p, c) => p + c) + ); + } + }, + ai: { + threaten: 100, + reverseEquip: true, + effect: { + player: (card, player, target) => { + if (typeof card !== "object") return; + let suit = get.suit(card); + if ( + !lib.suit.includes(suit) || + player.hasCard(function (i) { + return get.suit(i, player) == suit; + }, "h") + ) + return; + return [ + 1, + game.countPlayer((current) => { + return current.countCards("e", (card) => { + return get.suit(card, current) == suit; + }); + }), + ]; + }, + target: (card, player, target) => { + if ( + card.name === "sha" && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) && + game.hasPlayer((current) => { + return current.hasCard((cardx) => { + return get.subtype(cardx) === "equip3"; + }, "e"); + }) + ) + return [0, -0.5]; + }, + }, + }, + }, + //战役篇田丰 + gzsuishi: { + audio: "suishi", + preHidden: ["gzsuishi2"], + trigger: { global: "dying" }, + forced: true, + //priority:6.5, + check: function () { + return false; + }, + filter: function (event, player) { + return ( + event.player != player && + event.parent.name == "damage" && + event.parent.source && + event.parent.source.isFriendOf(player) + ); + }, + content: function () { player.draw(); }, - group:'gzsuishi2' + group: "gzsuishi2", }, - gzsuishi2:{ - audio:'suishi', - trigger:{global:'dieAfter'}, - forced:true, - check:function(){return false}, - filter:function(event,player){ + gzsuishi2: { + audio: "suishi", + trigger: { global: "dieAfter" }, + forced: true, + check: function () { + return false; + }, + filter: function (event, player) { return event.player.isFriendOf(player); }, - content:function(){ + content: function () { player.loseHp(); - } + }, }, //战役篇孔融 - zymingshi:{ - audio:'mingshi', - forced:true, - trigger:{target:'useCardToBefore'}, - priority:15, - filter:function(event,player){ - if(!player.hasEmptySlot(2)) return false; - if(event.card.name!='sha') return false; + zymingshi: { + audio: "mingshi", + forced: true, + trigger: { target: "useCardToBefore" }, + priority: 15, + filter: function (event, player) { + if (!player.hasEmptySlot(2)) return false; + if (event.card.name != "sha") return false; return game.hasNature(event.card); }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name==='sha'&&game.hasNature(card)&&target.hasEmptySlot(2)) return 'zeroplayertarget'; - if(get.subtype(card)=='equip2'&&target.isEmpty(2)) return [0.6,-0.8]; - } - } - } + ai: { + effect: { + target: function (card, player, target) { + if (card.name === "sha" && game.hasNature(card) && target.hasEmptySlot(2)) + return "zeroplayertarget"; + if (get.subtype(card) == "equip2" && target.isEmpty(2)) return [0.6, -0.8]; + }, + }, + }, }, //战役篇蒋钦 - zyshangyi:{ - audio:'shangyi', - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target; + zyshangyi: { + audio: "shangyi", + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; target.viewHandcards(player); - 'step 1' - if(!target.countCards('h')) event.finish(); - else player.chooseCardButton(target,target.getCards('h')); - 'step 2' - if(result.bool){ + ("step 1"); + if (!target.countCards("h")) event.finish(); + else player.chooseCardButton(target, target.getCards("h")); + ("step 2"); + if (result.bool) { target.discard(result.links[0]); } }, - ai:{ - order:11, - result:{ - target:function(player,target){ - return -target.countCards('h'); - } + ai: { + order: 11, + result: { + target: function (player, target) { + return -target.countCards("h"); + }, }, - threaten:1.1 + threaten: 1.1, }, }, //官盗K系列杜预 - pkwuku:{ - audio:'spwuku', - trigger:{global:'useCard'}, - forced:true, - preHidden:true, - filter:function(event,player){ - if(get.type(event.card)!='equip') return false; - return player.countMark('pkwuku')<3; + pkwuku: { + audio: "spwuku", + trigger: { global: "useCard" }, + forced: true, + preHidden: true, + filter: function (event, player) { + if (get.type(event.card) != "equip") return false; + return player.countMark("pkwuku") < 3; }, - content:function(){ - player.addMark('pkwuku',1); + content: function () { + player.addMark("pkwuku", 1); }, - marktext:'库', - intro:{ - content:'mark', + marktext: "库", + intro: { + content: "mark", }, - ai:{ - combo:'pksanchen', - threaten:3.6, + ai: { + combo: "pksanchen", + threaten: 3.6, }, }, - pksanchen:{ - audio:'spsanchen', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return player.countMark('pkwuku')>2; + pksanchen: { + audio: "spsanchen", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countMark("pkwuku") > 2; }, - content:function(){ - player.awakenSkill('pksanchen'); + content: function () { + player.awakenSkill("pksanchen"); player.gainMaxHp(); player.recover(); - player.addSkills('pkmiewu'); + player.addSkills("pkmiewu"); }, - ai:{ - combo:'pkwuku', + ai: { + combo: "pkwuku", }, - derivation:'pkmiewu', + derivation: "pkmiewu", }, - pkmiewu:{ - audio:'spmiewu', - enable:['chooseToUse','chooseToRespond'], - filter:function(event,player){ - if(!player.countMark('pkwuku')||player.hasSkill('pkmiewu2')) return false; - for(var i of lib.inpile){ - var type=get.type(i); - if((type=='basic'||type=='trick')&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; + pkmiewu: { + audio: "spmiewu", + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if (!player.countMark("pkwuku") || player.hasSkill("pkmiewu2")) return false; + for (var i of lib.inpile) { + var type = get.type(i); + if ( + (type == "basic" || type == "trick") && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i=0;ifalse, - selectCard:-1, - popname:true, - viewAs:{name:links[0][2],nature:links[0][3]}, - precontent:function(){ - player.addTempSkill('pkmiewu2'); - player.removeMark('pkwuku',1); + audio: "spmiewu", + filterCard: () => false, + selectCard: -1, + popname: true, + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent: function () { + player.addTempSkill("pkmiewu2"); + player.removeMark("pkwuku", 1); }, - } + }; }, - prompt:function(links,player){ - return '视为使用'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'并摸一张牌'; - } - }, - hiddenCard:function(player,name){ - if(!lib.inpile.includes(name)) return false; - var type=get.type(name); - return (type=='basic'||type=='trick')&&player.countMark('pkwuku')>0&&!player.hasSkill('pkmiewu2'); - }, - ai:{ - combo:'pkwuku', - fireAttack:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player){ - if(!player.countMark('pkwuku')||player.hasSkill('pkmiewu2')) return false; + prompt: function (links, player) { + return ( + "视为使用" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "并摸一张牌" + ); }, - order:1, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + }, + hiddenCard: function (player, name) { + if (!lib.inpile.includes(name)) return false; + var type = get.type(name); + return ( + (type == "basic" || type == "trick") && + player.countMark("pkwuku") > 0 && + !player.hasSkill("pkmiewu2") + ); + }, + ai: { + combo: "pkwuku", + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if (!player.countMark("pkwuku") || player.hasSkill("pkmiewu2")) return false; + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, }, - pkmiewu2:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - return event.skill=='pkmiewu_backup'; + pkmiewu2: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return event.skill == "pkmiewu_backup"; }, - content:function(){ + content: function () { player.draw(); }, }, - pkmiewu_backup:{audio:'pkmiewu'}, + pkmiewu_backup: { audio: "pkmiewu" }, //官盗S系列关羽 - pszhonghun:{ - audio:'zhongyi', - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - return get.color(event.card)=='red'; + pszhonghun: { + audio: "zhongyi", + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + return get.color(event.card) == "red"; }, - frequent:true, - content:function(){ - 'step 0' - var card=game.cardsGotoOrdering(get.cards()).cards[0]; - event.card=card; + frequent: true, + content: function () { + "step 0"; + var card = game.cardsGotoOrdering(get.cards()).cards[0]; + event.card = card; game.updateRoundNumber(); - player.showCards(card,get.translation(player)+'发动了【忠魂】'); - 'step 1' - if(get.color(card)=='red') player.gain(card,'gain2'); - } + player.showCards(card, get.translation(player) + "发动了【忠魂】"); + ("step 1"); + if (get.color(card) == "red") player.gain(card, "gain2"); + }, }, //官盗S系列郭嘉·一版 - psqizuo:{ - audio:2, - trigger:{global:['damageBegin1','damageBegin3']}, - filter:function(event,player,name){ - return name=='damageBegin1'&&event.source&&event.source.isIn()&&player.inRange(event.source)||name=='damageBegin3'&&event.player&&event.player.isIn()&&player.inRange(event.player); + psqizuo: { + audio: 2, + trigger: { global: ["damageBegin1", "damageBegin3"] }, + filter: function (event, player, name) { + return ( + (name == "damageBegin1" && + event.source && + event.source.isIn() && + player.inRange(event.source)) || + (name == "damageBegin3" && + event.player && + event.player.isIn() && + player.inRange(event.player)) + ); }, - direct:true, - content:function(){ - 'step 0' - var name=event.triggername; - var source=get.translation(trigger.source),target=get.translation(trigger.player),num=trigger.num; - var targetx=trigger[name=='damageBegin1'?'source':'player']; - var str=name=='damageBegin1'?(source+'即将对'+target+'造成'+num+'点伤害'):(target+'即将受到'+source+'造成的'+num+'点伤害'); - player.chooseToDiscard(get.prompt('psqizuo',targetx),str+',是否弃置一张牌并判定,若结果颜色与此牌相同,你可以令此伤害+1或-1?','he').set('ai',card=>{ - if(_status.event.goon) return 5.25-get.value(card)+(get.color(card)==get.color(_status.pileTop)?0.75:0); - return 0; - }).set('goon',function(){ - var eff=get.damageEffect(trigger.player,trigger.source,player); - if(eff>5&&!trigger.player.hasSkillTag('filterDamage',null,{ - player:player, - card:trigger.card, - })) return true; - if(eff<-5) return true; - return false; - }()).set('logSkill',['psqizuo',targetx]); - 'step 1' - if(result.bool){ - event.color=get.color(result.cards[0],player); - player.judge(function(card){ - if(get.color(card)==_status.event.getParent('psqizuo').color) return 1; + direct: true, + content: function () { + "step 0"; + var name = event.triggername; + var source = get.translation(trigger.source), + target = get.translation(trigger.player), + num = trigger.num; + var targetx = trigger[name == "damageBegin1" ? "source" : "player"]; + var str = + name == "damageBegin1" + ? source + "即将对" + target + "造成" + num + "点伤害" + : target + "即将受到" + source + "造成的" + num + "点伤害"; + player + .chooseToDiscard( + get.prompt("psqizuo", targetx), + str + ",是否弃置一张牌并判定,若结果颜色与此牌相同,你可以令此伤害+1或-1?", + "he" + ) + .set("ai", (card) => { + if (_status.event.goon) + return ( + 5.25 - + get.value(card) + + (get.color(card) == get.color(_status.pileTop) ? 0.75 : 0) + ); + return 0; + }) + .set( + "goon", + (function () { + var eff = get.damageEffect(trigger.player, trigger.source, player); + if ( + eff > 5 && + !trigger.player.hasSkillTag("filterDamage", null, { + player: player, + card: trigger.card, + }) + ) + return true; + if (eff < -5) return true; + return false; + })() + ) + .set("logSkill", ["psqizuo", targetx]); + ("step 1"); + if (result.bool) { + event.color = get.color(result.cards[0], player); + player.judge(function (card) { + if (get.color(card) == _status.event.getParent("psqizuo").color) return 1; return 0; }); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.chooseControl('+1','-1','cancel2').set('prompt','是否令此伤害+1或-1?').set('ai',()=>{ - if(_status.event.eff<0) return 1; - return 0; - }).set('eff',get.damageEffect(trigger.player,trigger.source,player)); - } - else event.finish(); - 'step 3' - if(result.index==0){ + } else event.finish(); + ("step 2"); + if (result.bool) { + player + .chooseControl("+1", "-1", "cancel2") + .set("prompt", "是否令此伤害+1或-1?") + .set("ai", () => { + if (_status.event.eff < 0) return 1; + return 0; + }) + .set("eff", get.damageEffect(trigger.player, trigger.source, player)); + } else event.finish(); + ("step 3"); + if (result.index == 0) { trigger.num++; - player.popup(' +1 ','fire'); - game.log(player,'令此伤害+1'); + player.popup(" +1 ", "fire"); + game.log(player, "令此伤害+1"); } - if(result.index==1){ + if (result.index == 1) { trigger.num--; - player.popup(' -1 ','water'); - game.log(player,'令此伤害-1'); + player.popup(" -1 ", "water"); + game.log(player, "令此伤害-1"); } }, - ai:{ - threaten:0.8 - } + ai: { + threaten: 0.8, + }, }, //官盗S系列郭嘉·二版 - psquanmou:{ - audio:2, - trigger:{ - global:'useCardAfter', + psquanmou: { + audio: 2, + trigger: { + global: "useCardAfter", }, - direct:true, - filter:function(event,player){ - return get.type2(event.card)=='trick'&&event.player!=player&&event.targets&&event.targets.includes(player)&&event.cards.filterInD('odj').length&&player.countCards('h'); + direct: true, + filter: function (event, player) { + return ( + get.type2(event.card) == "trick" && + event.player != player && + event.targets && + event.targets.includes(player) && + event.cards.filterInD("odj").length && + player.countCards("h") + ); }, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('psquanmou'),'弃置一张'+get.translation(get.color(trigger.card))+'手牌,获得'+get.translation(trigger.cards),'h',(card,player)=>{ - return get.color(card)==_status.event.color; - }).set('ai',card=>{ - return _status.event.value-get.value(card); - }).set('logSkill','psquanmou').set('value',get.value(trigger.cards,player)).set('color',get.color(trigger.card)); - 'step 1' - if(result.bool){ - var cards=trigger.cards.filterInD('odj'); - if(cards.filterInD('od').length) player.gain(cards.filterInD('od'),'gain2'); - if(cards.filterInD('j').length) player.gain(cards.filterInD('j'),get.owner(cards.filterInD('j')[0]),'give'); + content: function () { + "step 0"; + player + .chooseToDiscard( + get.prompt("psquanmou"), + "弃置一张" + + get.translation(get.color(trigger.card)) + + "手牌,获得" + + get.translation(trigger.cards), + "h", + (card, player) => { + return get.color(card) == _status.event.color; + } + ) + .set("ai", (card) => { + return _status.event.value - get.value(card); + }) + .set("logSkill", "psquanmou") + .set("value", get.value(trigger.cards, player)) + .set("color", get.color(trigger.card)); + ("step 1"); + if (result.bool) { + var cards = trigger.cards.filterInD("odj"); + if (cards.filterInD("od").length) player.gain(cards.filterInD("od"), "gain2"); + if (cards.filterInD("j").length) + player.gain(cards.filterInD("j"), get.owner(cards.filterInD("j")[0]), "give"); } - } + }, }, //官盗S赵云·一版 - pshuiqiang:{ - audio:2, - trigger:{player:['shaMiss','eventNeutralized']}, - direct:true, - filter:function(event,player){ - if(!event.card||event.card.name!='sha') return false; - return event.target.isIn()&&player.canUse('sha',event.target,false)&&(player.hasSha()||_status.connectMode&&player.countCards('h')); + pshuiqiang: { + audio: 2, + trigger: { player: ["shaMiss", "eventNeutralized"] }, + direct: true, + filter: function (event, player) { + if (!event.card || event.card.name != "sha") return false; + return ( + event.target.isIn() && + player.canUse("sha", event.target, false) && + (player.hasSha() || (_status.connectMode && player.countCards("h"))) + ); + }, + content: function () { + "step 0"; + player + .chooseToUse( + get.prompt2("pshuiqiang", trigger.target), + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + trigger.target, + -1 + ) + .set("addCount", false).logSkill = "pshuiqiang"; }, - content:function(){ - "step 0" - player.chooseToUse(get.prompt2('pshuiqiang',trigger.target),function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },trigger.target,-1).set('addCount',false).logSkill='pshuiqiang'; - } }, - pshuntu:{ - audio:2, - trigger:{source:'damageSource'}, - usable:1, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.getParent(2).player==player&&event.notLink()&&player.isPhaseUsing(); + pshuntu: { + audio: 2, + trigger: { source: "damageSource" }, + usable: 1, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.getParent(2).player == player && + event.notLink() && + player.isPhaseUsing() + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToUse( + get.prompt2("pshuntu", trigger.player), + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + trigger.player, + -1 + ) + .set("addCount", false).logSkill = "pshuntu"; + ("step 1"); + if (!result.bool) player.storage.counttrigger.pshuntu--; }, - direct:true, - content:function(){ - 'step 0' - player.chooseToUse(get.prompt2('pshuntu',trigger.player),function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },trigger.player,-1).set('addCount',false).logSkill='pshuntu'; - 'step 1' - if(!result.bool) player.storage.counttrigger.pshuntu--; - } }, //官盗S赵云·二版 - psqijin:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ + psqijin: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.changeToZero(); - event.cards=get.cards(7); + event.cards = get.cards(7); game.cardsGotoOrdering(event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - var str='七进'; - if(player==game.me&&!_status.auto) str+=':获得一种颜色的所有牌'; - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - event.time=get.utc(); - game.addVideo('showCards',player,['七进',get.cardsInfo(event.cards)]); - game.addVideo('delay',null,2); - 'step 1' - var list=[]; - for(var i of cards) list.add(get.color(i,false)); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str = "七进"; + if (player == game.me && !_status.auto) str += ":获得一种颜色的所有牌"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + event.time = get.utc(); + game.addVideo("showCards", player, ["七进", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + ("step 1"); + var list = []; + for (var i of cards) list.add(get.color(i, false)); list.sort(); - var next=player.chooseControl(list); - next.set('ai',function(){ + var next = player.chooseControl(list); + next.set("ai", function () { return _status.event.choice; - }).set('choice',function(){ - if(list.length==0) return list[0]; - var color=list[0]; - var cards1=cards.filter(i=>get.color(i)==color),cards2=cards.filter(i=>get.color(i)==list[1]); - if(get.value(cards1)*cards1.length>get.value(cards2)*cards2.length) return list[0]; - return list[1]; - }()); - 'step 2' - event.color=result.control; - var time=1000-(get.utc()-event.time); - if(time>0) game.delay(0,time); - 'step 3' - game.broadcastAll('closeDialog',event.videoId); - player.gain(cards.filter(i=>get.color(i,false)==event.color),'gain2'); + }).set( + "choice", + (function () { + if (list.length == 0) return list[0]; + var color = list[0]; + var cards1 = cards.filter((i) => get.color(i) == color), + cards2 = cards.filter((i) => get.color(i) == list[1]); + if (get.value(cards1) * cards1.length > get.value(cards2) * cards2.length) + return list[0]; + return list[1]; + })() + ); + ("step 2"); + event.color = result.control; + var time = 1000 - (get.utc() - event.time); + if (time > 0) game.delay(0, time); + ("step 3"); + game.broadcastAll("closeDialog", event.videoId); + player.gain( + cards.filter((i) => get.color(i, false) == event.color), + "gain2" + ); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5 - } }, - psqichu:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - if(player!=_status.currentPhase&&!player.hasSkill('psqichu_used')&&get.type(name)=='basic'&&lib.inpile.includes(name)) return true; + psqichu: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if ( + player != _status.currentPhase && + !player.hasSkill("psqichu_used") && + get.type(name) == "basic" && + lib.inpile.includes(name) + ) + return true; }, - filter:function(event,player){ - if(event.responded||player==_status.currentPhase||player.hasSkill('psqichu_used')) return false; - for(var i of lib.inpile){ - if(get.type(i)=='basic'&&event.filterCard({name:i},player,event)) return true; + filter: function (event, player) { + if (event.responded || player == _status.currentPhase || player.hasSkill("psqichu_used")) + return false; + for (var i of lib.inpile) { + if (get.type(i) == "basic" && event.filterCard({ name: i }, player, event)) + return true; } return false; }, - delay:false, - content:function(){ - 'step 0' - player.addTempSkill('psqichu_used'); - var evt=event.getParent(2); - var cards=get.cards(2); - for(var i=cards.length-1;i>=0;i--){ - ui.cardPile.insertBefore(cards[i].fix(),ui.cardPile.firstChild); + delay: false, + content: function () { + "step 0"; + player.addTempSkill("psqichu_used"); + var evt = event.getParent(2); + var cards = get.cards(2); + for (var i = cards.length - 1; i >= 0; i--) { + ui.cardPile.insertBefore(cards[i].fix(), ui.cardPile.firstChild); } - var aozhan=player.hasSkill('aozhan'); - player.chooseButton(['七出:选择要'+(evt.name=='chooseToUse'?'使用':'打出')+'的牌',cards]).set('filterButton',function(button){ - return _status.event.cards.includes(button.link); - }).set('cards',cards.filter(function(card){ - if(get.type(card)!='basic') return false; - if(aozhan&&card.name=='tao'){ - return evt.filterCard({ - name:'sha',isCard:true,cards:[card], - },evt.player,evt)||evt.filterCard({ - name:'shan',isCard:true,cards:[card], - },evt.player,evt); + var aozhan = player.hasSkill("aozhan"); + player + .chooseButton([ + "七出:选择要" + (evt.name == "chooseToUse" ? "使用" : "打出") + "的牌", + cards, + ]) + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set( + "cards", + cards.filter(function (card) { + if (get.type(card) != "basic") return false; + if (aozhan && card.name == "tao") { + return ( + evt.filterCard( + { + name: "sha", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) || + evt.filterCard( + { + name: "shan", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) + ); + } + return evt.filterCard(card, evt.player, evt); + }) + ) + .set("ai", function (button) { + var evt = _status.event.getParent(3); + if (evt && evt.ai) { + var tmp = _status.event; + _status.event = evt; + var result = (evt.ai || event.ai1)(button.link, _status.event.player, evt); + _status.event = tmp; + return result; + } + return 1; + }); + ("step 1"); + var evt = event.getParent(2); + if (result.bool && result.links && result.links.length) { + var name = result.links[0].name, + aozhan = player.hasSkill("aozhan") && name == "tao"; + if (aozhan) { + name = evt.filterCard( + { + name: "sha", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) + ? "sha" + : "shan"; } - return evt.filterCard(card,evt.player,evt); - })).set('ai',function(button){ - var evt=_status.event.getParent(3); - if(evt&&evt.ai){ - var tmp=_status.event; - _status.event=evt; - var result=(evt.ai||event.ai1)(button.link,_status.event.player,evt); - _status.event=tmp; - return result; - } - return 1; - }); - 'step 1' - var evt=event.getParent(2); - if(result.bool&&result.links&&result.links.length){ - var name=result.links[0].name,aozhan=(player.hasSkill('aozhan')&&name=='tao'); - if(aozhan){ - name=evt.filterCard({ - name:'sha',isCard:true,cards:[card], - },evt.player,evt)?'sha':'shan'; - } - if(evt.name=='chooseToUse'){ - game.broadcastAll(function(result,name){ - lib.skill.psqichu_backup.viewAs={name:name,cards:[result],isCard:true}; - lib.skill.psqichu_backup.prompt='选择'+get.translation(result)+'的目标'; - },result.links[0],name); - evt.set('_backupevent','psqichu_backup'); - evt.backup('psqichu_backup'); - } - else{ + if (evt.name == "chooseToUse") { + game.broadcastAll( + function (result, name) { + lib.skill.psqichu_backup.viewAs = { + name: name, + cards: [result], + isCard: true, + }; + lib.skill.psqichu_backup.prompt = + "选择" + get.translation(result) + "的目标"; + }, + result.links[0], + name + ); + evt.set("_backupevent", "psqichu_backup"); + evt.backup("psqichu_backup"); + } else { delete evt.result.skill; delete evt.result.used; - evt.result.card=get.autoViewAs(result.links[0]); - if(aozhan) evt.result.card.name=name; - evt.result.cards=[result.links[0]]; + evt.result.card = get.autoViewAs(result.links[0]); + if (aozhan) evt.result.card.name = name; + evt.result.cards = [result.links[0]]; evt.redo(); return; } } evt.goto(0); }, - ai:{ - effect:{ - target:function(card,player,target,effect){ - if(target.hasSkill('psqichu_used')) return; - if(get.tag(card,'respondShan')) return 0.7; - if(get.tag(card,'respondSha')) return 0.7; - } - }, - order:11, - respondShan:true, - respondSha:true, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); - return 1; - } - } - }, - subSkill:{ - backup:{ - precontent:function(){ - delete event.result.skill; - var name=event.result.card.name; - event.result.cards=event.result.card.cards; - event.result.card=get.autoViewAs(event.result.cards[0]); - event.result.card.name=name; + ai: { + effect: { + target: function (card, player, target, effect) { + if (target.hasSkill("psqichu_used")) return; + if (get.tag(card, "respondShan")) return 0.7; + if (get.tag(card, "respondSha")) return 0.7; + }, + }, + order: 11, + respondShan: true, + respondSha: true, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; }, - filterCard:function(){return false}, - selectCard:-1, }, - used:{charlotte:true}, - } - }, - pslongxin:{ - audio:2, - trigger:{player:'phaseJudgeBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('j')&&player.countCards('h'); }, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('pslongxin'),{type:'equip'},'he').set('logSkill','pslongxin').set('ai',card=>{ - if(_status.event.goon) return 15-get.value(card); - return 0; - }).set('goon',player.hasCard(card=>{ - var cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(player,cardj,player,player)<0; - },'j')); - 'step 1' - if(result.bool){ - player.discardPlayerCard(player,'j',true); + subSkill: { + backup: { + precontent: function () { + delete event.result.skill; + var name = event.result.card.name; + event.result.cards = event.result.card.cards; + event.result.card = get.autoViewAs(event.result.cards[0]); + event.result.card.name = name; + }, + filterCard: function () { + return false; + }, + selectCard: -1, + }, + used: { charlotte: true }, + }, + }, + pslongxin: { + audio: 2, + trigger: { player: "phaseJudgeBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("j") && player.countCards("h"); + }, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("pslongxin"), { type: "equip" }, "he") + .set("logSkill", "pslongxin") + .set("ai", (card) => { + if (_status.event.goon) return 15 - get.value(card); + return 0; + }) + .set( + "goon", + player.hasCard((card) => { + var cardj = card.viewAs ? { name: card.viewAs } : card; + return get.effect(player, cardj, player, player) < 0; + }, "j") + ); + ("step 1"); + if (result.bool) { + player.discardPlayerCard(player, "j", true); } }, }, //官盗S周瑜·一版 - psoldshiyin:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + psoldshiyin: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - frequent:true, - filter:function(event,player){ - if(player!=_status.currentPhase) return false; - return event.getg(player).filter(i=>get.owner(i)==player).length>0; + frequent: true, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + return event.getg(player).filter((i) => get.owner(i) == player).length > 0; }, - content:function(){ - 'step 0' - player.showCards(trigger.getg(player).filter(i=>get.owner(i)==player),get.translation(player)+'发动了【识音】'); - 'step 1' - var suits=[],cards=trigger.getg(player).filter(i=>get.owner(i)==player); - for(var card of cards) suits.add(get.suit(card,player)); - player.addTempSkill('psoldshiyin_effect'); - if(!player.storage.psoldshiyin_effect) player.storage.psoldshiyin_effect=0; - player.storage.psoldshiyin_effect=Math.max(player.storage.psoldshiyin_effect,suits.length); - if(suits.length>=2) player.addMark('psoldshiyin_damage',1,false); + content: function () { + "step 0"; + player.showCards( + trigger.getg(player).filter((i) => get.owner(i) == player), + get.translation(player) + "发动了【识音】" + ); + ("step 1"); + var suits = [], + cards = trigger.getg(player).filter((i) => get.owner(i) == player); + for (var card of cards) suits.add(get.suit(card, player)); + player.addTempSkill("psoldshiyin_effect"); + if (!player.storage.psoldshiyin_effect) player.storage.psoldshiyin_effect = 0; + player.storage.psoldshiyin_effect = Math.max( + player.storage.psoldshiyin_effect, + suits.length + ); + if (suits.length >= 2) player.addMark("psoldshiyin_damage", 1, false); }, - subSkill:{ - effect:{ - trigger:{player:'useCard'}, - charlotte:true, - forced:true, - onremove:['psoldshiyin_effect','psoldshiyin_damage'], - content:function(){ - var num=player.countMark('psoldshiyin_effect'); - if(num>=1) trigger.directHit.addArray(game.players); - if(num>=2&&get.tag(trigger.card,'damage')) trigger.baseDamage+=player.countMark('psoldshiyin_damage'); - if(num>=3) player.draw(); - player.removeSkill('psoldshiyin_effect'); + subSkill: { + effect: { + trigger: { player: "useCard" }, + charlotte: true, + forced: true, + onremove: ["psoldshiyin_effect", "psoldshiyin_damage"], + content: function () { + var num = player.countMark("psoldshiyin_effect"); + if (num >= 1) trigger.directHit.addArray(game.players); + if (num >= 2 && get.tag(trigger.card, "damage")) + trigger.baseDamage += player.countMark("psoldshiyin_damage"); + if (num >= 3) player.draw(); + player.removeSkill("psoldshiyin_effect"); }, - mod:{ - aiOrder:function(player,card,num){ - var numx=player.countMark('psoldshiyin_effect'); - if(numx>=2&&get.tag(card,'damage')) return num+10; + mod: { + aiOrder: function (player, card, num) { + var numx = player.countMark("psoldshiyin_effect"); + if (numx >= 2 && get.tag(card, "damage")) return num + 10; }, - } - } - } + }, + }, + }, }, //官盗S周瑜·二版 - psshiyin:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + psshiyin: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - direct:true, - group:'psshiyin_change', - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + direct: true, + group: "psshiyin_change", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt('psshiyin'),'将一张手牌置于武将牌上,称为“杂音”牌').set('ai',card=>20-get.value(card)); - 'step 1' - if(result.bool){ - player.logSkill('psshiyin'); - player.addToExpansion(result.cards,player,'give').gaintag.add('psshiyin'); + content: function () { + "step 0"; + player + .chooseCard(get.prompt("psshiyin"), "将一张手牌置于武将牌上,称为“杂音”牌") + .set("ai", (card) => 20 - get.value(card)); + ("step 1"); + if (result.bool) { + player.logSkill("psshiyin"); + player.addToExpansion(result.cards, player, "give").gaintag.add("psshiyin"); } }, - marktext:'音', - intro:{ - name:'杂音', - name2:'杂音', - content:'expansion', - markcount:'expansion', + marktext: "音", + intro: { + name: "杂音", + name2: "杂音", + content: "expansion", + markcount: "expansion", }, - subSkill:{ - change:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.getExpansions('psshiyin').length&&player.countCards('h'); + subSkill: { + change: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("psshiyin").length && player.countCards("h"); }, - content:function(){ - 'step 0' - var card=player.getExpansions('psshiyin')[0]; - player.chooseCard(get.prompt('psshiyin'),'用一张手牌替换“杂音”牌('+get.translation(card)+')').set('ai',card=>{ - if(_status.event.suit&&get.suit(card)==_status.event.suit) return 8-get.value(card); - return 0; - }).set('suit',function(){ - var suits=lib.suit.slice().map(i=>[i,(get.suit(card)==i?1:0)+player.countCards('h',{suit:i})]).filter(i=>i[1]>0); - suits.sort((a,b)=>a[1]-b[1]); - if(suits.length>0) return suits[0][0]; - return null; - }()); - 'step 1' - if(result.bool){ - player.logSkill('psshiyin'); - player.addToExpansion(result.cards[0],'give',player).gaintag.add('psshiyin'); - var card=player.getExpansions('psshiyin')[0]; - if(card) player.gain(card,'gain2'); + content: function () { + "step 0"; + var card = player.getExpansions("psshiyin")[0]; + player + .chooseCard( + get.prompt("psshiyin"), + "用一张手牌替换“杂音”牌(" + get.translation(card) + ")" + ) + .set("ai", (card) => { + if (_status.event.suit && get.suit(card) == _status.event.suit) + return 8 - get.value(card); + return 0; + }) + .set( + "suit", + (function () { + var suits = lib.suit + .slice() + .map((i) => [ + i, + (get.suit(card) == i ? 1 : 0) + + player.countCards("h", { suit: i }), + ]) + .filter((i) => i[1] > 0); + suits.sort((a, b) => a[1] - b[1]); + if (suits.length > 0) return suits[0][0]; + return null; + })() + ); + ("step 1"); + if (result.bool) { + player.logSkill("psshiyin"); + player + .addToExpansion(result.cards[0], "give", player) + .gaintag.add("psshiyin"); + var card = player.getExpansions("psshiyin")[0]; + if (card) player.gain(card, "gain2"); } }, - } - } - }, - psquwu:{ - audio:2, - forced:true, - trigger:{target:'useCardToBefore'}, - filter:function(event,player){ - return player.getExpansions('psshiyin').length&&get.suit(player.getExpansions('psshiyin')[0])==get.suit(event.card); + }, }, - content:function(){ + }, + psquwu: { + audio: 2, + forced: true, + trigger: { target: "useCardToBefore" }, + filter: function (event, player) { + return ( + player.getExpansions("psshiyin").length && + get.suit(player.getExpansions("psshiyin")[0]) == get.suit(event.card) + ); + }, + content: function () { trigger.cancel(); }, - ai:{ - threaten:1.1, - combo:'psshiyin', - effect:{ - target:function(card,player,target,current){ - var list=target.getExpansions('psshiyin'); - for(var cardx of list){ - if(get.suit(cardx)==get.suit(card)) return 'zeroplayertarget'; + ai: { + threaten: 1.1, + combo: "psshiyin", + effect: { + target: function (card, player, target, current) { + var list = target.getExpansions("psshiyin"); + for (var cardx of list) { + if (get.suit(cardx) == get.suit(card)) return "zeroplayertarget"; } }, - } + }, }, - mod:{ - cardEnabled2:function(card,player){ - var list=player.getExpansions('psshiyin'); - for(var cardx of list){ - if(get.suit(cardx)==get.suit(card)) return false; + mod: { + cardEnabled2: function (card, player) { + var list = player.getExpansions("psshiyin"); + for (var cardx of list) { + if (get.suit(cardx) == get.suit(card)) return false; } }, - cardRespondable:function(card,player){ - var list=player.getExpansions('psshiyin'); - for(var cardx of list){ - if(get.suit(cardx)==get.suit(card)) return false; + cardRespondable: function (card, player) { + var list = player.getExpansions("psshiyin"); + for (var cardx of list) { + if (get.suit(cardx) == get.suit(card)) return false; } }, - cardSavable:function(card,player){ - var list=player.getExpansions('psshiyin'); - for(var cardx of list){ - if(get.suit(cardx)==get.suit(card)) return false; + cardSavable: function (card, player) { + var list = player.getExpansions("psshiyin"); + for (var cardx of list) { + if (get.suit(cardx) == get.suit(card)) return false; } }, - } + }, }, - psliaozou:{ - audio:2, - enable:'phaseUse', - locked:false, - filter:function(event,player){ - return !player.hasSkill('psliaozou_blocker',null,null,false)&&player.getExpansions('psshiyin').length>0; + psliaozou: { + audio: 2, + enable: "phaseUse", + locked: false, + filter: function (event, player) { + return ( + !player.hasSkill("psliaozou_blocker", null, null, false) && + player.getExpansions("psshiyin").length > 0 + ); }, - content:function(){ - 'step 0' - player.showHandcards(get.translation(player)+'发动了【聊奏】'); - 'step 1' - var cards=player.getExpansions('psshiyin'),bool=true; - for(var card of cards){ - var suit=get.suit(card); - if(player.hasCard(cardx=>get.suit(cardx)==suit)){ - bool=false; break; + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【聊奏】"); + ("step 1"); + var cards = player.getExpansions("psshiyin"), + bool = true; + for (var card of cards) { + var suit = get.suit(card); + if (player.hasCard((cardx) => get.suit(cardx) == suit)) { + bool = false; + break; } } - if(bool) player.draw(); - else player.addTempSkill('psliaozou_blocker',{player:['useCard1','useSkillBegin','phaseUseEnd']}); + if (bool) player.draw(); + else + player.addTempSkill("psliaozou_blocker", { + player: ["useCard1", "useSkillBegin", "phaseUseEnd"], + }); }, - subSkill:{ - blocker:{charlotte:true} + subSkill: { + blocker: { charlotte: true }, }, - mod:{ - aiValue:function(player,card,num){ - var suit=get.suit(card); - if(player.isPhaseUsing()&&player.getExpansions('psshiyin').some(i=>get.suit(i)==suit)) return num/5; + mod: { + aiValue: function (player, card, num) { + var suit = get.suit(card); + if ( + player.isPhaseUsing() && + player.getExpansions("psshiyin").some((i) => get.suit(i) == suit) + ) + return num / 5; }, - aiUseful:function(){ - return lib.skill.psliaozou.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.psliaozou.mod.aiValue.apply(this, arguments); }, }, - ai:{ - combo:'psshiyin', - order:9.9, - result:{ - player:function(player){ - var cards=player.getExpansions('psshiyin'),bool=true; - for(var card of cards){ - var suit=get.suit(card); - if(player.hasCard(cardx=>get.suit(cardx)==suit)) return 0; + ai: { + combo: "psshiyin", + order: 9.9, + result: { + player: function (player) { + var cards = player.getExpansions("psshiyin"), + bool = true; + for (var card of cards) { + var suit = get.suit(card); + if (player.hasCard((cardx) => get.suit(cardx) == suit)) return 0; } return 1; - } - } - } + }, + }, + }, }, //官盗S武将传晋司马 - psquanyi:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + psquanyi: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - group:'psquanyi_tianbian', - content:function(){ - 'step 0' - player.chooseToCompare(target,function(card){ - if(typeof card=='string'&&lib.skill[card]){ - var ais=lib.skill[card].check||function(){return 0}; + group: "psquanyi_tianbian", + content: function () { + "step 0"; + player.chooseToCompare(target, function (card) { + if (typeof card == "string" && lib.skill[card]) { + var ais = + lib.skill[card].check || + function () { + return 0; + }; return ais(); } - var player=get.owner(card); - var getn=function(card){ - if(player.hasSkill('tianbian')&&get.suit(card)=='heart') return 13; + var player = get.owner(card); + var getn = function (card) { + if (player.hasSkill("tianbian") && get.suit(card) == "heart") return 13; return get.number(card); - } - var event=_status.event.getParent(); - var to=(player==event.player?event.target:event.player); - var addi=(get.value(card)>=8&&get.type(card)!='equip')?-6:0; - if(card.name=='du') addi-=5; - if(get.color(card)=='black') addi-=6; - if(player==event.player){ - if(event.small){ - return -getn(card)-get.value(card)/2+addi; + }; + var event = _status.event.getParent(); + var to = player == event.player ? event.target : event.player; + var addi = get.value(card) >= 8 && get.type(card) != "equip" ? -6 : 0; + if (card.name == "du") addi -= 5; + if (get.color(card) == "black") addi -= 6; + if (player == event.player) { + if (event.small) { + return -getn(card) - get.value(card) / 2 + addi; } - return getn(card)-get.value(card)/2+addi; - } - else{ - if((get.attitude(player,to)<=0)==Boolean(event.small)){ - return -getn(card)-get.value(card)/2+addi; + return getn(card) - get.value(card) / 2 + addi; + } else { + if (get.attitude(player, to) <= 0 == Boolean(event.small)) { + return -getn(card) - get.value(card) / 2 + addi; } - return getn(card)-get.value(card)/2+addi; + return getn(card) - get.value(card) / 2 + addi; } }); - 'step 1' - if(result.tie) event.finish(); - else{ - var targets=[player,target]; - if(!result.bool) targets.reverse(); - var suits=[result.player,result.target].map(i=>get.suit(i,false)); - event.targets=targets; - event.suits=suits; + ("step 1"); + if (result.tie) event.finish(); + else { + var targets = [player, target]; + if (!result.bool) targets.reverse(); + var suits = [result.player, result.target].map((i) => get.suit(i, false)); + event.targets = targets; + event.suits = suits; } - 'step 2' - if(event.suits.includes('heart')){ - if(targets[1].countGainableCards('hej',targets[0])>0){ - targets[0].gainPlayerCard(targets[1],'hej',true); + ("step 2"); + if (event.suits.includes("heart")) { + if (targets[1].countGainableCards("hej", targets[0]) > 0) { + targets[0].gainPlayerCard(targets[1], "hej", true); } } - 'step 3' - if(event.suits.includes('diamond')){ + ("step 3"); + if (event.suits.includes("diamond")) { targets[1].damage(targets[0]); } - 'step 4' - if(event.suits.includes('spade')){ + ("step 4"); + if (event.suits.includes("spade")) { targets[0].loseHp(); } - 'step 5' - if(event.suits.includes('club')){ - if(targets[0].countDiscardableCards(targets[0],'he')){ - targets[0].chooseToDiscard(2,true,'he'); + ("step 5"); + if (event.suits.includes("club")) { + if (targets[0].countDiscardableCards(targets[0], "he")) { + targets[0].chooseToDiscard(2, true, "he"); } } }, - ai:{ - order:6, - result:{ - target:-1 - } + ai: { + order: 6, + result: { + target: -1, + }, }, - subSkill:{ - tianbian:{ - audio:'psquanyi', - enable:'chooseCard', - check:function(event){ - var player=_status.event.player; - if(player.hasSkill('smyyingshi')){ - var card=ui.cardPile.childNodes[0]; - if(get.color(card)=='black'&&get.number(card)<=4||get.color(card)=='red'&&get.number(card)>=11) return 20; + subSkill: { + tianbian: { + audio: "psquanyi", + enable: "chooseCard", + check: function (event) { + var player = _status.event.player; + if (player.hasSkill("smyyingshi")) { + var card = ui.cardPile.childNodes[0]; + if ( + (get.color(card) == "black" && get.number(card) <= 4) || + (get.color(card) == "red" && get.number(card) >= 11) + ) + return 20; } - return (!player.hasCard(function(card){ - var val=get.value(card); - return val<0||(get.color(card)=='black'&&val<=4||get.color(card)=='red'&&get.number(card)>=11); - },'h'))?20:0; + return !player.hasCard(function (card) { + var val = get.value(card); + return ( + val < 0 || + (get.color(card) == "black" && val <= 4) || + (get.color(card) == "red" && get.number(card) >= 11) + ); + }, "h") + ? 20 + : 0; }, - filter:function(event){ - return event.type=='compare'&&!event.directresult; + filter: function (event) { + return event.type == "compare" && !event.directresult; }, - onCompare:function(player){ + onCompare: function (player) { return game.cardsGotoOrdering(get.cards()).cards; }, - } - } + }, + }, }, //官盗S曹植 - psliushang:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - forced:true, - filter:function(event,player){ + psliushang: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - group:'psliushang_give', - content:function(){ - 'step 0' + group: "psliushang_give", + content: function () { + "step 0"; trigger.changeToZero(); - player.draw(1+Math.max(3,game.countPlayer())); - event.targets=game.filterPlayer(i=>i!=player); - 'step 1' - var current=targets.shift(); - if(!player.countCards('h')) event.finish(); - else player.chooseCardTarget({ - prompt:'流殇:将一张牌置于'+get.translation(current)+'武将牌上', - current:current, - filterCard:true, - forced:true, - filterTarget:function(card,player,target){ - return target==_status.event.current; - }, - selectTarget:-1, - ai1:function(card){ - var current=_status.event.current; - return get.value(card,current)*get.attitude(_status.event.player,current); - }, - ai2:()=>1 - }); - 'step 2' - if(result.bool){ - result.targets[0].addToExpansion(result.cards,player,'give').gaintag.add('psliushang'); + player.draw(1 + Math.max(3, game.countPlayer())); + event.targets = game.filterPlayer((i) => i != player); + ("step 1"); + var current = targets.shift(); + if (!player.countCards("h")) event.finish(); + else + player.chooseCardTarget({ + prompt: "流殇:将一张牌置于" + get.translation(current) + "武将牌上", + current: current, + filterCard: true, + forced: true, + filterTarget: function (card, player, target) { + return target == _status.event.current; + }, + selectTarget: -1, + ai1: function (card) { + var current = _status.event.current; + return get.value(card, current) * get.attitude(_status.event.player, current); + }, + ai2: () => 1, + }); + ("step 2"); + if (result.bool) { + result.targets[0] + .addToExpansion(result.cards, player, "give") + .gaintag.add("psliushang"); } - if(targets.length) event.goto(1); + if (targets.length) event.goto(1); }, - marktext:'殇', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "殇", + intro: { + content: "expansion", + markcount: "expansion", }, - subSkill:{ - give:{ - trigger:{global:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return event.player!=player&&event.player.getExpansions('psliushang').length; + subSkill: { + give: { + trigger: { global: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return event.player != player && event.player.getExpansions("psliushang").length; }, - forced:true, - logTarget:'player', - content:function(){ - 'step 0' - var cards=trigger.player.getExpansions('psliushang'),name=get.translation(cards); - event.cards=cards; - trigger.player.chooseControl().set('choiceList',[ - '获得'+name+',且于本回合防止对'+get.translation(player)+'的伤害', - '将'+name+'置入弃牌堆' - ]).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(get.damageEffect(player,trigger.player,trigger.player)<=0) return 0; - if(get.value(cards,trigger.player)<0) return 1; - if(trigger.player.hasCard(card=>{ - return get.tag(card,'damage')&&trigger.player.canUse(card,player)&&get.effect(player,card,trigger.player,trigger.player)>0; - },'hs')) return 1; - return 0; - }()); - 'step 1' - if(result.index==0){ - trigger.player.gain(cards,'gain2'); - trigger.player.addTempSkill('psliushang_prevent'); - trigger.player.markAuto('psliushang_prevent',[player]); - } - else{ + forced: true, + logTarget: "player", + content: function () { + "step 0"; + var cards = trigger.player.getExpansions("psliushang"), + name = get.translation(cards); + event.cards = cards; + trigger.player + .chooseControl() + .set("choiceList", [ + "获得" + name + ",且于本回合防止对" + get.translation(player) + "的伤害", + "将" + name + "置入弃牌堆", + ]) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (get.damageEffect(player, trigger.player, trigger.player) <= 0) + return 0; + if (get.value(cards, trigger.player) < 0) return 1; + if ( + trigger.player.hasCard((card) => { + return ( + get.tag(card, "damage") && + trigger.player.canUse(card, player) && + get.effect(player, card, trigger.player, trigger.player) > + 0 + ); + }, "hs") + ) + return 1; + return 0; + })() + ); + ("step 1"); + if (result.index == 0) { + trigger.player.gain(cards, "gain2"); + trigger.player.addTempSkill("psliushang_prevent"); + trigger.player.markAuto("psliushang_prevent", [player]); + } else { trigger.player.loseToDiscardpile(cards); } - 'step 2' + ("step 2"); game.delayx(); - } - }, - prevent:{ - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - return player.getStorage('psliushang_prevent').includes(event.player); }, - forced:true, - onremove:true, - charlotte:true, - logTarget:'player', - content:function(){ + }, + prevent: { + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return player.getStorage("psliushang_prevent").includes(event.player); + }, + forced: true, + onremove: true, + charlotte: true, + logTarget: "player", + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function (card,player,target,current){ - if(player.getStorage('psliushang_prevent').includes(target)&&get.tag(card,'damage')){ - return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if ( + player.getStorage("psliushang_prevent").includes(target) && + get.tag(card, "damage") + ) { + return "zeroplayertarget"; } }, }, - } - } - } - }, - psqibu:{ - trigger:{player:'dying'}, - filter:function(event,player){ - return player.hp<=0; + }, + }, }, - limited:true, - skillAnimation:true, - animationColor:'water', - content:function(){ - 'step 0' - player.awakenSkill('psqibu'); - var cards=game.cardsGotoOrdering(get.cards(7)).cards; + }, + psqibu: { + trigger: { player: "dying" }, + filter: function (event, player) { + return player.hp <= 0; + }, + limited: true, + skillAnimation: true, + animationColor: "water", + content: function () { + "step 0"; + player.awakenSkill("psqibu"); + var cards = game.cardsGotoOrdering(get.cards(7)).cards; game.updateRoundNumber(); - event.cards=cards; - player.showCards(cards,get.translation(player)+'发动了【流殇】'); - 'step 1' - var num=cards.filter(i=>get.suit(i)=='heart').length; - var gains=cards.filter(i=>get.suit(i)=='club'); - if(num>0) player.recover(num); - if(gains.length) player.gain(gains,'gain2'); - } + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【流殇】"); + ("step 1"); + var num = cards.filter((i) => get.suit(i) == "heart").length; + var gains = cards.filter((i) => get.suit(i) == "club"); + if (num > 0) player.recover(num); + if (gains.length) player.gain(gains, "gain2"); + }, }, //官盗S曹丕 - psjianwei:{ - audio:2, - trigger:{player:'phaseBegin'}, - skillAnimation:true, - animationColor:'water', - limited:true, - direct:true, - filter:function(event,player){ - return player.hp>=1; + psjianwei: { + audio: 2, + trigger: { player: "phaseBegin" }, + skillAnimation: true, + animationColor: "water", + limited: true, + direct: true, + filter: function (event, player) { + return player.hp >= 1; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('psjianwei'),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - if(player.hp==1&&!player.canSave(player)) return 0; - var sgn=get.sgnAttitude(player,target); - var valMine=[0,0],valHis=[0,0]; - player.getCards('hej',card=>{ - if(get.position(card)=='j'){ - valMine[0]+=get.effect(player,card,player); - valMine[1]+=get.effect(target,card,player); - } - else{ - valMine[0]+=get.value(card,player); - valMine[1]+=get.value(card,target)*sgn; + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("psjianwei"), lib.filter.notMe).set("ai", (target) => { + var player = _status.event.player; + if (player.hp == 1 && !player.canSave(player)) return 0; + var sgn = get.sgnAttitude(player, target); + var valMine = [0, 0], + valHis = [0, 0]; + player.getCards("hej", (card) => { + if (get.position(card) == "j") { + valMine[0] += get.effect(player, card, player); + valMine[1] += get.effect(target, card, player); + } else { + valMine[0] += get.value(card, player); + valMine[1] += get.value(card, target) * sgn; } }); - target.getCards('hej',card=>{ - if(get.position(card)=='j'){ - valHis[0]+=get.effect(player,card,player); - valHis[1]+=get.effect(target,card,player); - } - else{ - valHis[0]+=get.value(card,player); - valHis[1]+=get.value(card,target)*sgn; + target.getCards("hej", (card) => { + if (get.position(card) == "j") { + valHis[0] += get.effect(player, card, player); + valHis[1] += get.effect(target, card, player); + } else { + valHis[0] += get.value(card, player); + valHis[1] += get.value(card, target) * sgn; } }); - return valMine[1]-valMine[0]+valHis[0]-valHis[1]>=60; + return valMine[1] - valMine[0] + valHis[0] - valHis[1] >= 60; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('psjianwei',target); - player.awakenSkill('psjianwei'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("psjianwei", target); + player.awakenSkill("psjianwei"); player.loseHp(); - } - else event.finish(); - 'step 2' - if(player.isIn()&&target.isIn()){ - var next=game.createEvent('psjianwei_swap'); - next.player=player; - next.target=target; - next.set('cards1',player.getCards('hej')); - next.set('cards2',target.getCards('hej')); + } else event.finish(); + ("step 2"); + if (player.isIn() && target.isIn()) { + var next = game.createEvent("psjianwei_swap"); + next.player = player; + next.target = target; + next.set("cards1", player.getCards("hej")); + next.set("cards2", target.getCards("hej")); next.setContent(lib.skill.psjianwei.swapRegioncards); } }, - swapRegioncards:function(){ - 'step 0' - player.$giveAuto(event.cards1,target); - target.$giveAuto(event.cards2,player); - 'step 1' - event.h1=event.cards1.filter(i=>get.position(i)=='h'); - event.e1=event.cards1.filter(i=>get.position(i)=='e'); - event.j1=event.cards1.filter(i=>get.position(i)=='j'); - event.h2=event.cards2.filter(i=>get.position(i)=='h'); - event.e2=event.cards2.filter(i=>get.position(i)=='e'); - event.j2=event.cards2.filter(i=>get.position(i)=='j'); + swapRegioncards: function () { + "step 0"; + player.$giveAuto(event.cards1, target); + target.$giveAuto(event.cards2, player); + ("step 1"); + event.h1 = event.cards1.filter((i) => get.position(i) == "h"); + event.e1 = event.cards1.filter((i) => get.position(i) == "e"); + event.j1 = event.cards1.filter((i) => get.position(i) == "j"); + event.h2 = event.cards2.filter((i) => get.position(i) == "h"); + event.e2 = event.cards2.filter((i) => get.position(i) == "e"); + event.j2 = event.cards2.filter((i) => get.position(i) == "j"); game.loseAsync({ - lose_list:[ - [player,event.cards1], - [target,event.cards2] - ] - }).setContent('chooseToCompareLose'); - 'step 2' - var todis=[]; - for(var i=0;iget.position(i,true)=='o')], - [target,event.h1.filter(i=>get.position(i,true)=='o')] + lose_list: [ + [player, event.cards1], + [target, event.cards2], ], - }).setContent('gaincardMultiple'); - for(var i=0;i get.position(i, true) == "o")], + [target, event.h1.filter((i) => get.position(i, true) == "o")], + ], + }).setContent("gaincardMultiple"); + for (var i = 0; i < event.e2.length; i++) { + if (get.position(event.e2[i], true) == "o") player.equip(event.e2[i]); } - for(var i=0;i0&&!player.hasSkill('pslongyin_used'); - }, - ai:{ - fireAttack:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player){ - if(!player.countCards('hse')||player.hasSkill('pslongyin_used')) return false; + prompt: function (links, player) { + return ( + "将任意张点数和为13牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - order:1, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + }, + hiddenCard: function (player, name) { + if (!lib.inpile.includes(name)) return false; + var type = get.type(name); + return ( + (type == "basic" || type == "trick") && + player.countCards("she") > 0 && + !player.hasSkill("pslongyin_used") + ); + }, + ai: { + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if (!player.countCards("hse") || player.hasSkill("pslongyin_used")) return false; + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, - subSkill:{ - used:{charlotte:true} - } + subSkill: { + used: { charlotte: true }, + }, }, //官盗S武将传诸葛亮 - pszhiji:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - if(!ui.selected.targets.length) return true; - return target.group!=ui.selected.targets[0].group; + pszhiji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return true; + return target.group != ui.selected.targets[0].group; }, - selectTarget:2, - complexTarget:true, - multitarget:true, - multiline:true, - filterCard:true, - selectCard:2, - check:function(card){ - return 6-get.value(card); + selectTarget: 2, + complexTarget: true, + multitarget: true, + multiline: true, + filterCard: true, + selectCard: 2, + check: function (card) { + return 6 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; targets.sortBySeat(); - if(targets[0].canUse('sha',targets[1],false)) targets[0].useCard({name:'sha',isCard:true},targets[1],false,'noai'); - 'step 1' - if(targets[1].canUse('sha',targets[0],false)) targets[1].useCard({name:'sha',isCard:true},targets[0],false,'noai'); + if (targets[0].canUse("sha", targets[1], false)) + targets[0].useCard({ name: "sha", isCard: true }, targets[1], false, "noai"); + ("step 1"); + if (targets[1].canUse("sha", targets[0], false)) + targets[1].useCard({ name: "sha", isCard: true }, targets[0], false, "noai"); }, - ai:{ - order:2.5, - result:{ - player:1, - target:function(player,target){ - if(ui.selected.targets.length){ - var targetx=ui.selected.targets[0]; - if(get.effect(targetx,{name:'sha'},target,player)+get.effect(target,{name:'sha'},targetx,player)<0) return 0; + ai: { + order: 2.5, + result: { + player: 1, + target: function (player, target) { + if (ui.selected.targets.length) { + var targetx = ui.selected.targets[0]; + if ( + get.effect(targetx, { name: "sha" }, target, player) + + get.effect(target, { name: "sha" }, targetx, player) < + 0 + ) + return 0; return -1; } return -1; - } - } - } + }, + }, + }, }, - psjiefeng:{ - audio:2, - enable:'phaseUse', - filterCard:true, - selectCard:2, - check:function(card){ - return 6-get.value(card); + psjiefeng: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: 2, + check: function (card) { + return 6 - get.value(card); }, - content:function(){ - 'step 0' - var cards=game.cardsGotoOrdering(get.cards(5)).cards; - event.cards=cards; - player.showCards(cards,get.translation(player)+'发动了【借风】'); - 'step 1' - if(cards.filter(i=>get.color(i)=='red').length>=2){ - player.chooseUseTarget('wanjian',true); + content: function () { + "step 0"; + var cards = game.cardsGotoOrdering(get.cards(5)).cards; + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【借风】"); + ("step 1"); + if (cards.filter((i) => get.color(i) == "red").length >= 2) { + player.chooseUseTarget("wanjian", true); } }, - ai:{ - order:9, - result:{ - player:function(player){ - if(player.getUseValue({name:'wanjian'})<0) return 0; + ai: { + order: 9, + result: { + player: function (player) { + if (player.getUseValue({ name: "wanjian" }) < 0) return 0; return 1; - } - } - } + }, + }, + }, }, //官盗S马超 - psweihou:{ - trigger:{player:'judgeBegin'}, - filter:function(event,player){ + psweihou: { + trigger: { player: "judgeBegin" }, + filter: function (event, player) { return !event.directresult; }, - content:function(){ - 'step 0' - var cards=get.cards(2); - for(var i=cards.length-1;i>=0;i--){ - ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); + content: function () { + "step 0"; + var cards = get.cards(2); + for (var i = cards.length - 1; i >= 0; i--) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); } game.updateRoundNumber(); - event.cards=cards; - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - var str; - if(player==game.me&&!_status.auto) str='威侯:选择一张作为本次判定结果'; - else str=get.translation(player)+'发动了【威侯】'; - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - game.addVideo('showCards',player,['威侯',get.cardsInfo(event.cards)]); - if(!event.isMine()&&!event.isOnline()) game.delayx(); - 'step 1' - player.chooseButton(['威侯:选择一张作为本次判定结果',cards],true).set('ai',button=>{ - return _status.event.getTrigger().judge(button.link); - }).set('dialog',event.videoId); - 'step 2' - game.broadcastAll('closeDialog',event.videoId); - if(result.bool){ - trigger.directresult=result.links[0]; - game.cardsDiscard(cards.removeArray(result.links).filter(i=>get.position(i)=='c')); + event.cards = cards; + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) str = "威侯:选择一张作为本次判定结果"; + else str = get.translation(player) + "发动了【威侯】"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, ["威侯", get.cardsInfo(event.cards)]); + if (!event.isMine() && !event.isOnline()) game.delayx(); + ("step 1"); + player + .chooseButton(["威侯:选择一张作为本次判定结果", cards], true) + .set("ai", (button) => { + return _status.event.getTrigger().judge(button.link); + }) + .set("dialog", event.videoId); + ("step 2"); + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + trigger.directresult = result.links[0]; + game.cardsDiscard( + cards.removeArray(result.links).filter((i) => get.position(i) == "c") + ); } - 'step 3' + ("step 3"); game.updateRoundNumber(); - } + }, }, //官盗S1066★贾诩 - psqupo:{ - audio:2, - trigger:{global:'phaseBegin'}, - filter:function(event,player){ - return player.countCards('he'); + psqupo: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + return player.countCards("he"); }, - direct:true, - content:function(){ - 'step 0' - var cards=player.getCards('he'); - var current=trigger.player; - var ai1=function(card){ - var player=_status.event.player,current=_status.event.current; - var card=get.color(card); - if(color=='black'){ - if(!current.hasSha()||!current.hasUseTarget({name:'sha'})) return 0; - if(targets.length) return 5.5-get.value(card); - } - else if(color=='red'){ - if(get.attitude(player,current)<=0) return 0; - if(current.hasCard(card=>{ - if(!get.tag(card,'damage')) return false; - var targetsx=game.filterPlayer(currentx=>{ - if(currentx==current||current==player) return false; - return current.canUse(card,currentx)&&get.effect(currentx,card,current,player)>0; - }); - targets2.addArray(targetsx); - return targetsx.length; - },'hs')) return 5.5-get.value(card); + direct: true, + content: function () { + "step 0"; + var cards = player.getCards("he"); + var current = trigger.player; + var ai1 = function (card) { + var player = _status.event.player, + current = _status.event.current; + var card = get.color(card); + if (color == "black") { + if (!current.hasSha() || !current.hasUseTarget({ name: "sha" })) return 0; + if (targets.length) return 5.5 - get.value(card); + } else if (color == "red") { + if (get.attitude(player, current) <= 0) return 0; + if ( + current.hasCard((card) => { + if (!get.tag(card, "damage")) return false; + var targetsx = game.filterPlayer((currentx) => { + if (currentx == current || current == player) return false; + return ( + current.canUse(card, currentx) && + get.effect(currentx, card, current, player) > 0 + ); + }); + targets2.addArray(targetsx); + return targetsx.length; + }, "hs") + ) + return 5.5 - get.value(card); } return 0; - } - var targets=game.filterPlayer(currentx=>{ - if(currentx==current||current==player) return false; - return !current.canUse('sha',currentx)||get.effect(currentx,{name:'sha'},current,player)>0&&get.attitude(player,currentx)>-3; + }; + var targets = game.filterPlayer((currentx) => { + if (currentx == current || current == player) return false; + return ( + !current.canUse("sha", currentx) || + (get.effect(currentx, { name: "sha" }, current, player) > 0 && + get.attitude(player, currentx) > -3) + ); }); - targets.sort((a,b)=>get.attitude(player,b)-get.attitude(player,a)); - var targets2=[]; - var cardx=cards.sort((a,b)=>ai1(b)-ai1(a))[0]; - targets2.sort((a,b)=>get.threaten(b,current)-get.threaten(a,current)); - var next=player.chooseCardTarget({ - filterCard:true, - prompt:get.prompt2('psqupo'), - current:trigger.player, - filterTarget:function(card,player,target){ - return player!=target&&target!=_status.event.current; + targets.sort((a, b) => get.attitude(player, b) - get.attitude(player, a)); + var targets2 = []; + var cardx = cards.sort((a, b) => ai1(b) - ai1(a))[0]; + targets2.sort((a, b) => get.threaten(b, current) - get.threaten(a, current)); + var next = player.chooseCardTarget({ + filterCard: true, + prompt: get.prompt2("psqupo"), + current: trigger.player, + filterTarget: function (card, player, target) { + return player != target && target != _status.event.current; }, - ai1:function(card){ - return card==_status.event.cardx?1:0; + ai1: function (card) { + return card == _status.event.cardx ? 1 : 0; }, - ai2:function(target){ - return target==_status.event.targetx?1:0; + ai2: function (target) { + return target == _status.event.targetx ? 1 : 0; }, }); - if(ai1(cardx)>0){ - next.cardx=cardx; - if(get.color(cardx)=='black'){ - if(targets.length) next.targetx=targets[0]; - } - else{ - if(targets2.length) next.targetx=targets2[0]; + if (ai1(cardx) > 0) { + next.cardx = cardx; + if (get.color(cardx) == "black") { + if (targets.length) next.targetx = targets[0]; + } else { + if (targets2.length) next.targetx = targets2[0]; } } - 'step 1' - if(result.bool){ - var target=result.targets[0],cards=result.cards; - player.logSkill('psqupo',target); - player.give(cards,target); - var color=get.color(cards[0]); - if(color=='black'){ - _status.currentPhase.addTempSkill('psqupo_black'); - _status.currentPhase.markAuto('psqupo_black',[target]); - } - else if(color=='red'){ - target.addTempSkill('psqupo_red'); - target.addMark('psqupo_red',1,false); + ("step 1"); + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.logSkill("psqupo", target); + player.give(cards, target); + var color = get.color(cards[0]); + if (color == "black") { + _status.currentPhase.addTempSkill("psqupo_black"); + _status.currentPhase.markAuto("psqupo_black", [target]); + } else if (color == "red") { + target.addTempSkill("psqupo_red"); + target.addMark("psqupo_red", 1, false); } } }, - subSkill:{ - black:{ - trigger:{player:'useCardToTarget'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - var targets=player.getStorage('psqupo_black').slice(); + subSkill: { + black: { + trigger: { player: "useCardToTarget" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + var targets = player.getStorage("psqupo_black").slice(); targets.remove(event.target); return targets.length; }, - content:function(){ - var targets=player.getStorage('psqupo_black').slice(); + content: function () { + var targets = player.getStorage("psqupo_black").slice(); targets.remove(trigger.target); player.loseHp(targets.length); - } + }, + }, + red: { + trigger: { player: "damageBegin3" }, + charlotte: true, + forced: true, + onremove: true, + content: function () { + player.loseHp(player.countMark("psqupo_red")); + player.removeSkill("psqupo_red"); + }, }, - red:{ - trigger:{player:'damageBegin3'}, - charlotte:true, - forced:true, - onremove:true, - content:function(){ - player.loseHp(player.countMark('psqupo_red')); - player.removeSkill('psqupo_red'); - } - } - } - }, - psbaoquan:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - return player.countCards('h',{type:['trick','delay']})||_status.connectMode; }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('psbaoquan'),{type:['trick','delay']}).set('logSkill','psbaoquan').set('ai',card=>{ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).set('goon',get.damageEffect(player,trigger.source,player)<-5); - 'step 1' - if(result.bool){ + }, + psbaoquan: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return player.countCards("h", { type: ["trick", "delay"] }) || _status.connectMode; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("psbaoquan"), { type: ["trick", "delay"] }) + .set("logSkill", "psbaoquan") + .set("ai", (card) => { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", get.damageEffect(player, trigger.source, player) < -5); + ("step 1"); + if (result.bool) { trigger.cancel(); } - } + }, }, //官盗S吕布 - pssheji:{ - audio:2, - enable:'phaseUse', - filterCard:true, - selectCard:-1, - position:'h', - locked:false, - filter:function(event,player){ - if(player.hasSkill('pssheji_used')) return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var card of hs){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2===false) return false; + pssheji: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: -1, + position: "h", + locked: false, + filter: function (event, player) { + if (player.hasSkill("pssheji_used")) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var card of hs) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; } - return event.filterCard(get.autoViewAs({name:'sha'},hs)); + return event.filterCard(get.autoViewAs({ name: "sha" }, hs)); }, - viewAs:{ - name:'sha', - storage:{pssheji:true} + viewAs: { + name: "sha", + storage: { pssheji: true }, }, - onuse:function(links,player){ - player.addTempSkill('pssheji_used','phaseUseAfter'); + onuse: function (links, player) { + player.addTempSkill("pssheji_used", "phaseUseAfter"); }, - ai:{ - order:1, - threaten:1.1, + ai: { + order: 1, + threaten: 1.1, }, - mod:{ - targetInRange:function(card,player,target){ - if(card.storage&&card.storage.pssheji) return true; - } + mod: { + targetInRange: function (card, player, target) { + if (card.storage && card.storage.pssheji) return true; + }, }, - subSkill:{ - used:{ - audio:'pssheji', - trigger:{source:'damageSource'}, - charlotte:true, - forced:true, - popup:false, - logTarget:'player', - filter:function(event,player){ - return event.card.storage&&event.card.storage.pssheji&&event.player.hasCard(card=>{ - if(!lib.filter.canBeGained(card,player,event.player)) return false; - return ['equip1','equip3','equip4','equip6'].includes(get.subtype(card)); - },'e'); + subSkill: { + used: { + audio: "pssheji", + trigger: { source: "damageSource" }, + charlotte: true, + forced: true, + popup: false, + logTarget: "player", + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.pssheji && + event.player.hasCard((card) => { + if (!lib.filter.canBeGained(card, player, event.player)) return false; + return ["equip1", "equip3", "equip4", "equip6"].includes( + get.subtype(card) + ); + }, "e") + ); }, - content:function(){ - var cards=trigger.player.getCards('e',card=>{ - if(!lib.filter.canBeGained(card,player,trigger.player)) return false; - return ['equip1','equip3','equip4','equip6'].includes(get.subtype(card)); + content: function () { + var cards = trigger.player.getCards("e", (card) => { + if (!lib.filter.canBeGained(card, player, trigger.player)) return false; + return ["equip1", "equip3", "equip4", "equip6"].includes(get.subtype(card)); }); - if(cards.length) player.gain(cards,'giveAuto',trigger.player); - } - } + if (cards.length) player.gain(cards, "giveAuto", trigger.player); + }, + }, }, }, //战役篇国战将转身份 //钟会 - zyquanji:{ - audio:'gzquanji', - trigger:{ - player:'damageEnd', - source:'damageSource', + zyquanji: { + audio: "gzquanji", + trigger: { + player: "damageEnd", + source: "damageSource", }, - frequent:true, - filter:function(event,player,name){ - if(name=='damageEnd') return true; - var evt=event.getParent(); - if(evt.player!=player) return false; - return evt.card&&evt.type=='card'&&evt.targets.length==1; + frequent: true, + filter: function (event, player, name) { + if (name == "damageEnd") return true; + var evt = event.getParent(); + if (evt.player != player) return false; + return evt.card && evt.type == "card" && evt.targets.length == 1; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - var hs=player.getCards('he'); - if(hs.length>0){ - if(hs.length==1) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,'选择一张牌作为“权”'); - } - else event.finish(); - 'step 2' - if(result.bool){ - var cs=result.cards; - player.addToExpansion(cs,player,'give').gaintag.add('zyquanji'); + ("step 1"); + var hs = player.getCards("he"); + if (hs.length > 0) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, "选择一张牌作为“权”"); + } else event.finish(); + ("step 2"); + if (result.bool) { + var cs = result.cards; + player.addToExpansion(cs, player, "give").gaintag.add("zyquanji"); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - locked:false, - mod:{ - maxHandcard:function(player,num){ - return num+player.getExpansions('zyquanji').length; + locked: false, + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("zyquanji").length; }, }, }, - zypaiyi:{ - audio:'gzpaiyi', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.getExpansions('zyquanji').length>0; + zypaiyi: { + audio: "gzpaiyi", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getExpansions("zyquanji").length > 0; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('排异',player.getExpansions('zyquanji'),'hidden') + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("排异", player.getExpansions("zyquanji"), "hidden"); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'gzpaiyi', - filterTarget:true, - filterCard:function(){return false}, - selectCard:-1, - card:links[0], - delay:false, - content:lib.skill.zypaiyi.contentx, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(target!=player) return 0; - if(player.getExpansions('zyquanji').length<=1||(player.needsToDiscard()&&!player.getEquip('zhuge')&&!player.hasSkill('new_paoxiao'))) return 0; + audio: "gzpaiyi", + filterTarget: true, + filterCard: function () { + return false; + }, + selectCard: -1, + card: links[0], + delay: false, + content: lib.skill.zypaiyi.contentx, + ai: { + order: 10, + result: { + target: function (player, target) { + if (target != player) return 0; + if ( + player.getExpansions("zyquanji").length <= 1 || + (player.needsToDiscard() && + !player.getEquip("zhuge") && + !player.hasSkill("new_paoxiao")) + ) + return 0; return 1; - } + }, }, }, - } + }; + }, + prompt: function () { + return "请选择【排异】的目标"; }, - prompt:function(){return '请选择【排异】的目标'}, }, - contentx:function(){ - "step 0" - var card=lib.skill.zypaiyi_backup.card; + contentx: function () { + "step 0"; + var card = lib.skill.zypaiyi_backup.card; player.loseToDiscardpile(card); - "step 1" - var num=player.getExpansions('zyquanji').length; - if(num>0) target.draw(Math.min(7,num)); - "step 2" - if(target.countCards('h')>player.countCards('h')){ + ("step 1"); + var num = player.getExpansions("zyquanji").length; + if (num > 0) target.draw(Math.min(7, num)); + ("step 2"); + if (target.countCards("h") > player.countCards("h")) { target.damage(); } }, - ai:{ - order:function(item,player){ - var num=player.getExpansions('zyquanji').length; - if(num==1) return 8; + ai: { + order: function (item, player) { + var num = player.getExpansions("zyquanji").length; + if (num == 1) return 8; return 1; }, - result:{ - player:1, + result: { + player: 1, }, }, }, //孙綝 - zyshilu:{ - audio:'gzshilu', - preHidden:true, - trigger:{global:'dieAfter'}, - prompt2:function(event,player){ - return '将其的所有武将牌'+(player==event.source?'及武将牌库里的一张随机武将牌':'')+'置于武将牌上作为“戮”'; + zyshilu: { + audio: "gzshilu", + preHidden: true, + trigger: { global: "dieAfter" }, + prompt2: function (event, player) { + return ( + "将其的所有武将牌" + + (player == event.source ? "及武将牌库里的一张随机武将牌" : "") + + "置于武将牌上作为“戮”" + ); }, - logTarget:'player', - content:function(){ - var list=[],target=trigger.player; - if(target.name1&&!target.isUnseen(0)&&target.name1.indexOf('gz_shibing')!=0&&_status.characterlist.includes(target.name1)) list.push(target.name1); - if(target.name2&&!target.isUnseen(1)&&target.name2.indexOf('gz_shibing')!=0&&_status.characterlist.includes(target.name1)) list.push(target.name2); + logTarget: "player", + content: function () { + var list = [], + target = trigger.player; + if ( + target.name1 && + !target.isUnseen(0) && + target.name1.indexOf("gz_shibing") != 0 && + _status.characterlist.includes(target.name1) + ) + list.push(target.name1); + if ( + target.name2 && + !target.isUnseen(1) && + target.name2.indexOf("gz_shibing") != 0 && + _status.characterlist.includes(target.name1) + ) + list.push(target.name2); _status.characterlist.removeArray(list); - if(player==trigger.source) list.addArray(_status.characterlist.randomRemove(1)); - if(list.length){ - player.markAuto('zyshilu',list); - game.log(player,'将','#g'+get.translation(list),'置于武将牌上作为','#y“戮”'); - game.broadcastAll(function(player,list){ - var cards=[]; - for(var i=0;i0&&player.countCards('he')>0; + group: "zyshilu_zhiheng", + subSkill: { + zhiheng: { + audio: "zyshilu", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getStorage("zyshilu").length > 0 && player.countCards("he") > 0; }, - direct:true, - content:function(){ - 'step 0' - var num=Math.min(player.getStorage('zyshilu').length,player.countCards('he')); - player.chooseToDiscard('he',get.prompt('zyshilu'),'弃置至多'+get.cnNumber(num)+'张牌并摸等量的牌',[1,num]).logSkill='zyshilu_zhiheng'; - 'step 1' - if(result.bool&&result.cards&&result.cards.length) player.draw(result.cards.length); + direct: true, + content: function () { + "step 0"; + var num = Math.min(player.getStorage("zyshilu").length, player.countCards("he")); + player.chooseToDiscard( + "he", + get.prompt("zyshilu"), + "弃置至多" + get.cnNumber(num) + "张牌并摸等量的牌", + [1, num] + ).logSkill = "zyshilu_zhiheng"; + ("step 1"); + if (result.bool && result.cards && result.cards.length) + player.draw(result.cards.length); }, }, }, }, - zyxiongnve:{ - audio:'gzxiongnve', - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.getStorage('zyshilu').length>0; + zyxiongnve: { + audio: "gzxiongnve", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.getStorage("zyshilu").length > 0; }, - content:function(){ - 'step 0' - player.chooseButton([get.prompt('zyxiongnve'),[player.storage.zyshilu,'character']]).set('ai',function(button){ - if(!_status.event.goon) return 0; - return 1; - }).set('goon',player.countCards('hs',function(card){ - return get.tag(card,'damage')&&player.hasValueTarget(card); - })>1); - 'step 1' - if(result.bool){ - player.logSkill('zyxiongnve'); - lib.skill.zyxiongnve.throwCharacter(player,result.links); + content: function () { + "step 0"; + player + .chooseButton([get.prompt("zyxiongnve"), [player.storage.zyshilu, "character"]]) + .set("ai", function (button) { + if (!_status.event.goon) return 0; + return 1; + }) + .set( + "goon", + player.countCards("hs", function (card) { + return get.tag(card, "damage") && player.hasValueTarget(card); + }) > 1 + ); + ("step 1"); + if (result.bool) { + player.logSkill("zyxiongnve"); + lib.skill.zyxiongnve.throwCharacter(player, result.links); game.delayx(); - player.chooseControl().set('prompt','选择获得一项效果').set('choiceList',[ - '本回合造成的伤害+1', - '本回合造成伤害时,获得其一张牌', - '本回合使用牌没有次数限制', - ]).set('ai',function(){ - var player=_status.event.player; - if(player.countCards('hs',function(card){ - return get.name(card)=='sha'&&player.hasValueTarget(card); - })>player.getCardUsable('sha')) return 0; - return get.rand(1,2); - }); - } - else event.finish(); - 'step 2' - var skill='zyxiongnve_effect'+result.index; + player + .chooseControl() + .set("prompt", "选择获得一项效果") + .set("choiceList", [ + "本回合造成的伤害+1", + "本回合造成伤害时,获得其一张牌", + "本回合使用牌没有次数限制", + ]) + .set("ai", function () { + var player = _status.event.player; + if ( + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) > player.getCardUsable("sha") + ) + return 0; + return get.rand(1, 2); + }); + } else event.finish(); + ("step 2"); + var skill = "zyxiongnve_effect" + result.index; player.addTempSkill(skill); - game.log(player,'本回合','#g'+lib.skill[skill].promptx) + game.log(player, "本回合", "#g" + lib.skill[skill].promptx); }, - group:'zyxiongnve_end', - throwCharacter:function(player,list){ - player.unmarkAuto('zyshilu',list); + group: "zyxiongnve_end", + throwCharacter: function (player, list) { + player.unmarkAuto("zyshilu", list); _status.characterlist.addArray(list); - game.log(player,'从','#y“戮”','中移去了','#g'+get.translation(list)); - game.broadcastAll(function(player,list){ - var cards=[]; - for(var i=0;i0; + trigger: { source: "damageBegin1" }, + forced: true, + filter: function (event, player) { + return ( + player != event.player && event.player.countGainableCards(player, "he") > 0 + ); }, - logTarget:'player', - content:function(){ - player.gainPlayerCard(trigger.player,true,'he'); - } - }, - effect2:{ - promptx:'使用牌没有次数限制', - charlotte:true, - onremove:true, - intro:{ - content:'使用牌没有次数限制', - }, - mod:{ - cardUsable:()=>Infinity + logTarget: "player", + content: function () { + player.gainPlayerCard(trigger.player, true, "he"); }, }, - effect3:{ - charlotte:true, - audio:'zyxiongnve', - mark:true, - intro:{ - content:'受到的伤害-1', + effect2: { + promptx: "使用牌没有次数限制", + charlotte: true, + onremove: true, + intro: { + content: "使用牌没有次数限制", }, - trigger:{player:'damageBegin4'}, - forced:true, - filter:function(event,player){ - return event.source!=player&&event.source&&event.source.isIn(); + mod: { + cardUsable: () => Infinity, }, - content:function(){ + }, + effect3: { + charlotte: true, + audio: "zyxiongnve", + mark: true, + intro: { + content: "受到的伤害-1", + }, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return event.source != player && event.source && event.source.isIn(); + }, + content: function () { trigger.num--; }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - var num=get.tag(card,'damage'); - if(num){ - if(num>1) return 0.5; + ai: { + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + var num = get.tag(card, "damage"); + if (num) { + if (num > 1) return 0.5; return 0; } - } - } + }, + }, }, }, - end:{ - trigger:{player:'phaseUseEnd'}, - direct:true, - filter:function(event,player){ - return player.getStorage('zyshilu').length>1; + end: { + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return player.getStorage("zyshilu").length > 1; }, - content:function(){ - 'step 0' - player.chooseButton(['凶虐:是否移去两张“戮”获得减伤?',[player.storage.zyshilu,'character']],2).set('ai',function(button){ - var player=_status.event.player; - if(game.countPlayer()*1.5+player.storage.zyshilu.length/2>8) return 1; - if(player.hp<=2) return 1; - return 0; - }); - 'step 1' - if(result.bool){ - player.logSkill('zyxiongnve'); - lib.skill.zyxiongnve.throwCharacter(player,result.links); - player.addTempSkill('zyxiongnve_effect3',{player:'phaseBegin'}); + content: function () { + "step 0"; + player + .chooseButton( + [ + "凶虐:是否移去两张“戮”获得减伤?", + [player.storage.zyshilu, "character"], + ], + 2 + ) + .set("ai", function (button) { + var player = _status.event.player; + if (game.countPlayer() * 1.5 + player.storage.zyshilu.length / 2 > 8) + return 1; + if (player.hp <= 2) return 1; + return 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("zyxiongnve"); + lib.skill.zyxiongnve.throwCharacter(player, result.links); + player.addTempSkill("zyxiongnve_effect3", { player: "phaseBegin" }); game.delayx(); } }, }, }, - ai:{ - combo:'zyshilu' - } + ai: { + combo: "zyshilu", + }, }, //孟达 - qiuan:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - return event.cards&&event.cards.filterInD().length>0&&!player.getExpansions('qiuan').length; + qiuan: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return ( + event.cards && + event.cards.filterInD().length > 0 && + !player.getExpansions("qiuan").length + ); }, - check:function(event,player){ - if(get.damageEffect(player,event.source||player,player,event.nature)>=0) return false; + check: function (event, player) { + if (get.damageEffect(player, event.source || player, player, event.nature) >= 0) + return false; return true; }, - preHidden:true, - content:function(){ - var cards=trigger.cards.filterInD(); - player.addToExpansion('gain2',cards).gaintag.add('qiuan'); + preHidden: true, + content: function () { + var cards = trigger.cards.filterInD(); + player.addToExpansion("gain2", cards).gaintag.add("qiuan"); trigger.cancel(); }, - ai:{ - combo:'liangfan' + ai: { + combo: "liangfan", }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - marktext:'函', + marktext: "函", }, - liangfan:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.getExpansions('qiuan').length>0; + liangfan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.getExpansions("qiuan").length > 0; }, - content:function(){ - 'step 0' - var cards=player.getExpansions('qiuan'); - player.gain(cards,'gain2').gaintag.add('liangfan'); - player.addTempSkill('liangfan2'); - 'step 1' + content: function () { + "step 0"; + var cards = player.getExpansions("qiuan"); + player.gain(cards, "gain2").gaintag.add("liangfan"); + player.addTempSkill("liangfan2"); + ("step 1"); player.loseHp(); }, - ai:{ - combo:'qiuan' - } + ai: { + combo: "qiuan", + }, }, - liangfan2:{ - audio:'liangfan', - mark:true, - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('liangfan')) return num+0.1; + liangfan2: { + audio: "liangfan", + mark: true, + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("liangfan")) return num + 0.1; }, }, - intro:{content:'使用“量反”牌造成伤害后,可获得目标角色的一张牌'}, - trigger:{source:'damageEnd'}, - logTarget:'player', - charlotte:true, - onremove:function(player){ - player.removeGaintag('liangfan'); + intro: { content: "使用“量反”牌造成伤害后,可获得目标角色的一张牌" }, + trigger: { source: "damageEnd" }, + logTarget: "player", + charlotte: true, + onremove: function (player) { + player.removeGaintag("liangfan"); }, - prompt:(event)=>('量反:是否获得'+get.translation(event.player)+'的一张牌?'), - filter:function(event,player){ - var evt=event.getParent(2); - if(evt.name!='useCard'||evt.card!=event.card) return false; - if(!event.player.countGainableCards(player,'he')) return false; - return player.getHistory('lose',function(evt2){ - if(evt2.getParent()!=evt) return false; - for(var i in evt2.gaintag_map){ - if(evt2.gaintag_map[i].includes('liangfan')) return true; - } - return false; - }).length>0; + prompt: (event) => "量反:是否获得" + get.translation(event.player) + "的一张牌?", + filter: function (event, player) { + var evt = event.getParent(2); + if (evt.name != "useCard" || evt.card != event.card) return false; + if (!event.player.countGainableCards(player, "he")) return false; + return ( + player.getHistory("lose", function (evt2) { + if (evt2.getParent() != evt) return false; + for (var i in evt2.gaintag_map) { + if (evt2.gaintag_map[i].includes("liangfan")) return true; + } + return false; + }).length > 0 + ); }, - marktext:'反', - content:function(){ - player.gainPlayerCard(trigger.player,true,'he'); + marktext: "反", + content: function () { + player.gainPlayerCard(trigger.player, true, "he"); }, }, //文钦 - gzjinfa:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he')>0; - }) + gzjinfa: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }) + ); }, - filterCard:true, - position:'he', - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - content:function(){ - 'step 0' - target.chooseCard('he','交给'+get.translation(player)+'一张装备牌,或令其获得你的一张牌',{type:'equip'}).set('ai',function(card){ - if(_status.event.goon&&get.suit(card)=='spade') return 8-get.value(card); - return 5-get.value(card); - }).set('goon',target.canUse('sha',player,false)&&get.effect(player,{name:'sha'},target,target)>0); - 'step 1' - if(!result.bool){ - player.gainPlayerCard(target,'he',true); + content: function () { + "step 0"; + target + .chooseCard( + "he", + "交给" + get.translation(player) + "一张装备牌,或令其获得你的一张牌", + { type: "equip" } + ) + .set("ai", function (card) { + if (_status.event.goon && get.suit(card) == "spade") return 8 - get.value(card); + return 5 - get.value(card); + }) + .set( + "goon", + target.canUse("sha", player, false) && + get.effect(player, { name: "sha" }, target, target) > 0 + ); + ("step 1"); + if (!result.bool) { + player.gainPlayerCard(target, "he", true); event.finish(); - } - else target.give(result.cards,player); - 'step 2' - if(result.bool&&result.cards&&result.cards.length&& - target.isIn()&&player.isIn()&&get.suit(result.cards[0],target)=='spade'&&target.canUse('sha',player,false)) target.useCard({name:'sha',isCard:true},false,player); + } else target.give(result.cards, player); + ("step 2"); + if ( + result.bool && + result.cards && + result.cards.length && + target.isIn() && + player.isIn() && + get.suit(result.cards[0], target) == "spade" && + target.canUse("sha", player, false) + ) + target.useCard({ name: "sha", isCard: true }, false, player); }, - ai:{ - order:6, - result:{ - player:function(player,target){ - if(target.countCards('e',function(card){ - return get.suit(card)=='spade'&&get.value(card)<8; - })&&target.canUse('sha',player,false)) return get.effect(player,{name:'sha'},target,player); + ai: { + order: 6, + result: { + player: function (player, target) { + if ( + target.countCards("e", function (card) { + return get.suit(card) == "spade" && get.value(card) < 8; + }) && + target.canUse("sha", player, false) + ) + return get.effect(player, { name: "sha" }, target, player); return 0; }, - target:function(player,target){ - var es=target.getCards('e').sort(function(a,b){ - return get.value(b,target)-get.value(a,target); + target: function (player, target) { + var es = target.getCards("e").sort(function (a, b) { + return get.value(b, target) - get.value(a, target); }); - if(es.length) return -Math.min(2,get.value(es[0])) + if (es.length) return -Math.min(2, get.value(es[0])); return -2; }, }, }, }, //一战成名·群雄逐鹿·长安之战专属神贾诩 - zybishi:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.player!=player; + zybishi: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return event.card.name == "sha" && event.player != player; }, - check:function(event,player){ - var effect=0; - if(event.targets&&event.targets.length){ - for(var i=0; i0; + zyjianbing: { + audio: 2, + trigger: { global: "damageBegin3" }, + logTarget: "player", + filter: function (event, player) { + return ( + event.player != player && + event.player.isIn() && + event.card && + event.card.name == "sha" && + event.player.countGainableCards(player, "he") > 0 + ); }, - content:function(){ - 'step 0' - player.gainPlayerCard(trigger.player,true,'he'); - 'step 1' - if(result.bool&&result.cards&&result.cards.length){ - var card=result.cards[0]; - if(get.suit(card,trigger.player)=='heart'){ + content: function () { + "step 0"; + player.gainPlayerCard(trigger.player, true, "he"); + ("step 1"); + if (result.bool && result.cards && result.cards.length) { + var card = result.cards[0]; + if (get.suit(card, trigger.player) == "heart") { trigger.player.recover(); } } }, }, //战役篇改王允 - zylianji:{ - audio:'wylianji', - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.hasHistory('useCard',evt=>evt.getParent('phaseUse')==event); + zylianji: { + audio: "wylianji", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return player.hasHistory("useCard", (evt) => evt.getParent("phaseUse") == event); }, - direct:true, - content:function(){ - 'step 0' - var types=[]; - player.getHistory('useCard',evt=>{ - if(evt.getParent('phaseUse')!=trigger) return false; + direct: true, + content: function () { + "step 0"; + var types = []; + player.getHistory("useCard", (evt) => { + if (evt.getParent("phaseUse") != trigger) return false; types.add(get.type2(evt.card)); }); - event.num=types.length; - event.logged=false; - player.chooseTarget(get.prompt('zylianji'),'令一名角色摸一张牌').set('ai',target=>{ - var player=_status.event.player; - if(target==player&&player.needsToDiscard(1)) return 1; - return get.effect(target,{name:'draw'},player,player); + event.num = types.length; + event.logged = false; + player.chooseTarget(get.prompt("zylianji"), "令一名角色摸一张牌").set("ai", (target) => { + var player = _status.event.player; + if (target == player && player.needsToDiscard(1)) return 1; + return get.effect(target, { name: "draw" }, player, player); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - if(!event.logged){event.logged=true;player.logSkill('zylianji',target);} + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + if (!event.logged) { + event.logged = true; + player.logSkill("zylianji", target); + } target.draw(); } - if(event.num<=1) event.finish(); - 'step 2' - if(player.isHealthy()) event._result={bool:false}; - else player.chooseBool(get.prompt('zylianji'),'回复1点体力').set('ai',()=>true); - 'step 3' - if(result.bool){ - if(!event.logged){event.logged=true;player.logSkill('zylianji');} + if (event.num <= 1) event.finish(); + ("step 2"); + if (player.isHealthy()) event._result = { bool: false }; + else player.chooseBool(get.prompt("zylianji"), "回复1点体力").set("ai", () => true); + ("step 3"); + if (result.bool) { + if (!event.logged) { + event.logged = true; + player.logSkill("zylianji"); + } player.recover(); } - if(event.num<=2) event.finish(); - 'step 4' - player.chooseTarget(get.prompt('zylianji'),'跳过本回合的剩余阶段,然后令一名其他角色执行这些阶段',lib.filter.notMe).set('ai',target=>{ - var att=get.attitude(_status.event.player,target),num=target.needsToDiscard(),numx=player.needsToDiscard(); - if(att<0&&num>0) return -att*Math.sqrt(num)/3+numx; - var skills=target.getSkills(); - var val=0; - for(var skill of skills){ - var info=get.info(skill); - if(info.trigger&&info.trigger.player&&(info.trigger.player.indexOf('phaseJieshu')==0||Array.isArray(info.trigger.player)&&info.trigger.player.some(i=>i.indexOf('phaseJieshu')==0))){ - var threaten=info.ai&&info.ai.threaten?info.ai.threaten:1; - if(info.ai&&info.ai.neg) val-=3*threaten; - else if(info.ai&&info.ai.halfneg) val-=1.5*threaten; - else val+=threaten; + if (event.num <= 2) event.finish(); + ("step 4"); + player + .chooseTarget( + get.prompt("zylianji"), + "跳过本回合的剩余阶段,然后令一名其他角色执行这些阶段", + lib.filter.notMe + ) + .set("ai", (target) => { + var att = get.attitude(_status.event.player, target), + num = target.needsToDiscard(), + numx = player.needsToDiscard(); + if (att < 0 && num > 0) return (-att * Math.sqrt(num)) / 3 + numx; + var skills = target.getSkills(); + var val = 0; + for (var skill of skills) { + var info = get.info(skill); + if ( + info.trigger && + info.trigger.player && + (info.trigger.player.indexOf("phaseJieshu") == 0 || + (Array.isArray(info.trigger.player) && + info.trigger.player.some((i) => i.indexOf("phaseJieshu") == 0))) + ) { + var threaten = info.ai && info.ai.threaten ? info.ai.threaten : 1; + if (info.ai && info.ai.neg) val -= 3 * threaten; + else if (info.ai && info.ai.halfneg) val -= 1.5 * threaten; + else val += threaten; + } } - } - return att*val/2+numx; - }); - 'step 5' - if(result.bool){ - var target=result.targets[0]; - if(!event.logged){event.logged=true;player.logSkill('zylianji',target);} - else player.line(target); - player.addTempSkill('zylianji_skip'); - player.storage.zylianji_insert=target; + return (att * val) / 2 + numx; + }); + ("step 5"); + if (result.bool) { + var target = result.targets[0]; + if (!event.logged) { + event.logged = true; + player.logSkill("zylianji", target); + } else player.line(target); + player.addTempSkill("zylianji_skip"); + player.storage.zylianji_insert = target; } }, - subSkill:{ - skip:{ - trigger:{ - player:['phaseZhunbeiBefore','phaseJudgeBefore','phaseDrawBefore','phaseUseBefore','phaseDiscardBefore','phaseJieshuBefore'], + subSkill: { + skip: { + trigger: { + player: [ + "phaseZhunbeiBefore", + "phaseJudgeBefore", + "phaseDrawBefore", + "phaseUseBefore", + "phaseDiscardBefore", + "phaseJieshuBefore", + ], }, - init:function(player){ - if(!player.storage.zylianji_skip) player.storage.zylianji_skip=[]; + init: function (player) { + if (!player.storage.zylianji_skip) player.storage.zylianji_skip = []; }, - forced:true, - charlotte:true, - group:'zylianji_insert', - onremove:true, - content:function(){ + forced: true, + charlotte: true, + group: "zylianji_insert", + onremove: true, + content: function () { trigger.cancel(); player.storage.zylianji_skip.push(trigger.name); - } - }, - insert:{ - trigger:{player:'phaseEnd'}, - filter:function(event,player){ - return player.storage.zylianji_skip&&player.storage.zylianji_skip.length&&player.storage.zylianji_insert&&player.storage.zylianji_insert.isIn(); }, - forced:true, - charlotte:true, - onremove:true, - getStr:function(str){ - switch(str){ - case 'phaseDraw': - return 'player.phaseDraw();if(!player.noPhaseDelay){if(player==game.me){game.delay()}else{game.delayx()}}'; - case 'phaseDiscard': - return 'game.broadcastAll(function(){if(ui.tempnowuxie){ui.tempnowuxie.close();delete ui.tempnowuxie;}});player.phaseDiscard();if(!player.noPhaseDelay){game.delayx()};delete player._noSkill;'; + }, + insert: { + trigger: { player: "phaseEnd" }, + filter: function (event, player) { + return ( + player.storage.zylianji_skip && + player.storage.zylianji_skip.length && + player.storage.zylianji_insert && + player.storage.zylianji_insert.isIn() + ); + }, + forced: true, + charlotte: true, + onremove: true, + getStr: function (str) { + switch (str) { + case "phaseDraw": + return "player.phaseDraw();if(!player.noPhaseDelay){if(player==game.me){game.delay()}else{game.delayx()}}"; + case "phaseDiscard": + return "game.broadcastAll(function(){if(ui.tempnowuxie){ui.tempnowuxie.close();delete ui.tempnowuxie;}});player.phaseDiscard();if(!player.noPhaseDelay){game.delayx()};delete player._noSkill;"; default: - return 'player.'+str+'();'; + return "player." + str + "();"; } }, - content:function(){ - 'step 0' - var func=''; - for(var i=0;i0){ + if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge")) + next.set("callback", function () { + if (get.position(card, true) == "o") player.gain(card, "gain2"); + }); + else + next.set("callback", function () { + event.getParent().orderingCards.remove(card); + }); + ("step 2"); + if (result.judge > 0) { event.cards.push(result.card); - player.chooseBool('是否再次发动【洛神】?').set('frequentSkill','yjluoshen'); - } - else{ - for(var i=0;i0; }, - filterTarget:function(card,player,target){ - if(target==player) return false; - if(ui.selected.targets.length){ - return ui.selected.targets[0]!=target&&!ui.selected.targets[0].hasSkillTag('noCompareSource')&&target.countCards('h') - &&!target.hasSkillTag('noCompareTarget'); + }, + yjjianshu: { + audio: "jianshu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + if (target == player) return false; + if (ui.selected.targets.length) { + return ( + ui.selected.targets[0] != target && + !ui.selected.targets[0].hasSkillTag("noCompareSource") && + target.countCards("h") && + !target.hasSkillTag("noCompareTarget") + ); } return true; }, - filterCard:true, - discard:false, - lose:false, - delay:false, - check:function(card){ - if(_status.event.player.hp==1) return 8-get.value(card); - return 6-get.value(card); + filterCard: true, + discard: false, + lose: false, + delay: false, + check: function (card) { + if (_status.event.player.hp == 1) return 8 - get.value(card); + return 6 - get.value(card); }, - selectTarget:2, - targetprompt:['发起者','拼点对象'], - multitarget:true, - content:function(){ - 'step 0' - player.give(cards,targets[0],'give'); - 'step 1' + selectTarget: 2, + targetprompt: ["发起者", "拼点对象"], + multitarget: true, + content: function () { + "step 0"; + player.give(cards, targets[0], "give"); + ("step 1"); targets[0].chooseToCompare(targets[1]); - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { targets[1].loseHp(); - } - else if(result.tie){ - targets[0].loseHp() - targets[1].loseHp() - } - else{ + } else if (result.tie) { + targets[0].loseHp(); + targets[1].loseHp(); + } else { targets[0].loseHp(); } }, - ai:{ - expose:0.4, - order:4, - result:{ - target:function(player,target){ - if(ui.selected.targets.length) return -1; + ai: { + expose: 0.4, + order: 4, + result: { + target: function (player, target) { + if (ui.selected.targets.length) return -1; return -0.5; - } - } - } - }, - yjyongdi:{ - audio:'yongdi', - unique:true, - limited:true, - trigger:{player:'phaseZhunbeiBegin'}, - animationColor:'thunder', - skillAnimation:'legend', - mark:true, - intro:{ - content:'limited' + }, + }, }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('yjyongdi'),function(card,player,target){ - return target.hasSex('male')||target.name=='key_yuri'; - }).set('ai',function(target){ - if(!_status.event.goon) return 0; - var player=_status.event.player; - var att=get.attitude(player,target); - if(att<=1) return 0; - var mode=get.mode(); - if(mode=='identity'||(mode=='versus'&&_status.mode=='four')){ - if(target.name&&lib.character[target.name]){ - for(var i=0;i1&&event.player.isIn(); + filter: function (event, player) { + return event.isFirstTarget && event.targets.length > 1 && event.player.isIn(); }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.player.draw(); }, - ai:{expose:0.2} + ai: { expose: 0.2 }, }, - yjzezhu:{ - audio:'zezhu', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var zhu=get.mode()=='identity'?get.zhu(player):game.filterPlayer(i=>i.getSeatNum()==1)[0]; - if(!zhu) return false; - return zhu.countGainableCards(player,zhu==player?'ej':'hej'); + yjzezhu: { + audio: "zezhu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var zhu = + get.mode() == "identity" + ? get.zhu(player) + : game.filterPlayer((i) => i.getSeatNum() == 1)[0]; + if (!zhu) return false; + return zhu.countGainableCards(player, zhu == player ? "ej" : "hej"); }, - filterTarget:function(card,player,target){ - var zhu=get.mode()=='identity'?get.zhu(player):game.filterPlayer(i=>i.getSeatNum()==1)[0]; - return target==zhu; + filterTarget: function (card, player, target) { + var zhu = + get.mode() == "identity" + ? get.zhu(player) + : game.filterPlayer((i) => i.getSeatNum() == 1)[0]; + return target == zhu; }, - selectTarget:1, - content:function(){ - 'step 0' - player.gainPlayerCard(target,player==target?'ej':'hej',true); - 'step 1' - if(!player.countCards('he')||player==target) event.finish(); - else player.chooseCard('择主:交给'+get.translation(target)+'一张牌','he',true); - 'step 2' - player.give(result.cards,target); + selectTarget: 1, + content: function () { + "step 0"; + player.gainPlayerCard(target, player == target ? "ej" : "hej", true); + ("step 1"); + if (!player.countCards("he") || player == target) event.finish(); + else player.chooseCard("择主:交给" + get.translation(target) + "一张牌", "he", true); + ("step 2"); + player.give(result.cards, target); + }, + ai: { + order: 2.9, + result: { player: 1 }, }, - ai:{ - order:2.9, - result:{player:1} - } }, //用间beta董卓 - yjtuicheng:{ - audio:2, - enable:'phaseUse', - viewAs:{name:'tuixinzhifu',isCard:true}, - filterCard:()=>false, - selectCard:-1, - log:false, - precontent:function(){ - player.logSkill('yjtuicheng'); + yjtuicheng: { + audio: 2, + enable: "phaseUse", + viewAs: { name: "tuixinzhifu", isCard: true }, + filterCard: () => false, + selectCard: -1, + log: false, + precontent: function () { + player.logSkill("yjtuicheng"); player.loseHp(); }, - ai:{ - effect:{ - player:function(card,player){ - if(get.name(card)!='tuixinzhifu'||_status.event.skill!='yjtuicheng') return; - if(player.hp<3) return 'zeroplayertarget'; - if(player.hasSkill('yjshicha')&&!player.hasHistory('useSkill',evt=>evt.skill=='yjtuicheng')) return [1,2]; - return 'zeroplayertarget'; - } - } - } - }, - yjyaoling:{ - audio:2, - trigger:{ - player:'phaseUseEnd', + ai: { + effect: { + player: function (card, player) { + if (get.name(card) != "tuixinzhifu" || _status.event.skill != "yjtuicheng") + return; + if (player.hp < 3) return "zeroplayertarget"; + if ( + player.hasSkill("yjshicha") && + !player.hasHistory("useSkill", (evt) => evt.skill == "yjtuicheng") + ) + return [1, 2]; + return "zeroplayertarget"; + }, + }, }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('yjyaoling'),'减1点体力上限,选择一名其他角色A和一名角色B,令A选择对B使用杀或被你弃牌',2,(card,player,target)=>{ - if(!ui.selected.targets.length) return target!=player; - return ui.selected.targets[0].canUse('sha',target,false); - }).set('targetprompt',['打人','被打']).set('complexSelect',true).set('ai',target=>{ - var player=_status.event.player; - if(!ui.selected.targets.length) return get.effect(target,{name:'guohe_copy2'},player,player); - var targetx=ui.selected.targets[0]; - return get.effect(target,{name:'sha'},targetx,player)+5; - }); - 'step 1' - if(result.bool){ - var targets=result.targets; - event.targets=targets; - player.logSkill('yjyaoling',targets,false); + }, + yjyaoling: { + audio: 2, + trigger: { + player: "phaseUseEnd", + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("yjyaoling"), + "减1点体力上限,选择一名其他角色A和一名角色B,令A选择对B使用杀或被你弃牌", + 2, + (card, player, target) => { + if (!ui.selected.targets.length) return target != player; + return ui.selected.targets[0].canUse("sha", target, false); + } + ) + .set("targetprompt", ["打人", "被打"]) + .set("complexSelect", true) + .set("ai", (target) => { + var player = _status.event.player; + if (!ui.selected.targets.length) + return get.effect(target, { name: "guohe_copy2" }, player, player); + var targetx = ui.selected.targets[0]; + return get.effect(target, { name: "sha" }, targetx, player) + 5; + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; + event.targets = targets; + player.logSkill("yjyaoling", targets, false); player.line2(targets); player.loseMaxHp(); - targets[0].chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'耀令:对'+get.translation(targets[1])+'使用一张杀,或令'+get.translation(player)+'弃置你的一张牌').set('targetRequired',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',targets[1]); + targets[0] + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "耀令:对" + + get.translation(targets[1]) + + "使用一张杀,或令" + + get.translation(player) + + "弃置你的一张牌") + .set("targetRequired", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", targets[1]); + } else event.finish(); + ("step 2"); + if (!result.bool && targets[0].countDiscardableCards(player, "he")) { + player.discardPlayerCard(targets[0], "he", true); } - else event.finish(); - 'step 2' - if(!result.bool&&targets[0].countDiscardableCards(player,'he')){ - player.discardPlayerCard(targets[0],'he',true); - } - } + }, }, - yjshicha:{ - audio:2, - trigger:{player:'phaseDiscardBegin'}, - forced:true, - filter:function(event,player){ - var tuicheng=false,yaoling=false; - player.getHistory('useSkill',evt=>{ - if(evt.skill=='yjtuicheng') tuicheng=true; - if(evt.skill=='yjyaoling') yaoling=true; + yjshicha: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + forced: true, + filter: function (event, player) { + var tuicheng = false, + yaoling = false; + player.getHistory("useSkill", (evt) => { + if (evt.skill == "yjtuicheng") tuicheng = true; + if (evt.skill == "yjyaoling") yaoling = true; }); - return !(tuicheng&&yaoling); + return !(tuicheng && yaoling); }, - content:function(){ - player.addTempSkill('yjshicha_limit'); + content: function () { + player.addTempSkill("yjshicha_limit"); }, - subSkill:{ - limit:{ - charlotte:true, - mark:true, - intro:{content:'本回合手牌上限为1'}, - mod:{ - maxHandcard:()=>1 - } - } + subSkill: { + limit: { + charlotte: true, + mark: true, + intro: { content: "本回合手牌上限为1" }, + mod: { + maxHandcard: () => 1, + }, + }, + }, + ai: { + neg: true, }, - ai:{ - neg:true - } }, - yjyongquan:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - zhuSkill:true, - filter:function(event,player){ - return player.hasZhuSkill('yjyongquan')&&game.hasPlayer(current=>{ - return current!=player&&player.hasZhuSkill(current)&¤t.group=='qun'; + yjyongquan: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + zhuSkill: true, + filter: function (event, player) { + return ( + player.hasZhuSkill("yjyongquan") && + game.hasPlayer((current) => { + return current != player && player.hasZhuSkill(current) && current.group == "qun"; + }) + ); + }, + logTarget: function (event, player) { + return game.filterPlayer((current) => { + return current != player && player.hasZhuSkill(current) && current.group == "qun"; }); }, - logTarget:function(event,player){ - return game.filterPlayer(current=>{ - return current!=player&&player.hasZhuSkill(current)&¤t.group=='qun'; - }); - }, - content:function(){ - 'step 0' - var targets=lib.skill.yjyongquan.logTarget(trigger,player); - event.targets=targets; - 'step 1' - var target=targets.shift(); - event.target=target; - target.chooseCard('拥权:是否交给'+get.translation(player)+'一张牌?','he').set('ai',card=>{ - if(_status.event.goon) return 4.5-get.value(card); - return 0; - }).set('goon',get.attitude(target,player)>3); - 'step 2' - if(result.bool){ + content: function () { + "step 0"; + var targets = lib.skill.yjyongquan.logTarget(trigger, player); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + event.target = target; + target + .chooseCard("拥权:是否交给" + get.translation(player) + "一张牌?", "he") + .set("ai", (card) => { + if (_status.event.goon) return 4.5 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) > 3); + ("step 2"); + if (result.bool) { target.line(player); - target.give(result.cards,player); + target.give(result.cards, player); } - 'step 3' - if(targets.length) event.goto(1); - } + ("step 3"); + if (targets.length) event.goto(1); + }, }, //用间beta甘宁的新版 - yjjielve:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('yjjielve_ban'); + yjjielve: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("yjjielve_ban"); }, - viewAs:{name:'chenghuodajie'}, - filterCard:function(card,player){ - if(ui.selected.cards.length) return get.color(card)==get.color(ui.selected.cards[0]); - var cards=player.getCards('hes'); - for(var cardx of cards){ - if(card!=cardx&&get.color(card)==get.color(cardx)) return true; + viewAs: { name: "chenghuodajie" }, + filterCard: function (card, player) { + if (ui.selected.cards.length) return get.color(card) == get.color(ui.selected.cards[0]); + var cards = player.getCards("hes"); + for (var cardx of cards) { + if (card != cardx && get.color(card) == get.color(cardx)) return true; } return false; }, - position:'hes', - selectCard:2, - complexCard:true, - check:function(card){ - return 5-get.value(card); + position: "hes", + selectCard: 2, + complexCard: true, + check: function (card) { + return 5 - get.value(card); }, - onuse:function(links,player){ - player.addTempSkill('yjjielve_check'); + onuse: function (links, player) { + player.addTempSkill("yjjielve_check"); }, - subSkill:{ - check:{ - trigger:{source:'damageSource'}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - return event.card&&event.card.name=='chenghuodajie'&&event.getParent().skill=='yjjielve'; + subSkill: { + check: { + trigger: { source: "damageSource" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return ( + event.card && + event.card.name == "chenghuodajie" && + event.getParent().skill == "yjjielve" + ); + }, + content: function () { + player.addTempSkill("yjjielve_ban"); }, - content:function(){ - player.addTempSkill('yjjielve_ban'); - } }, - ban:{charlotte:true} - } + ban: { charlotte: true }, + }, }, //用间beta张飞 - yjmangji:{ - audio:2, - forced:true, - trigger:{ - player:['loseAfter','damageEnd','loseHpEnd','recoverEnd'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + yjmangji: { + audio: 2, + forced: true, + trigger: { + player: ["loseAfter", "damageEnd", "loseHpEnd", "recoverEnd"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function (event,player){ - if(player.hp<1||!player.countDiscardableCards(player,'h')) return false; - if(['damage','loseHp','recover'].includes(event.name)) return true; - var evt=event.getl(player); - if(event.name=='equip'&&event.player==player) return !evt||evt.cards.length!=1; - if(!evt||!evt.es.length) return false; - return game.hasPlayer(current=>player.canUse('sha',current,false)); + direct: true, + filter: function (event, player) { + if (player.hp < 1 || !player.countDiscardableCards(player, "h")) return false; + if (["damage", "loseHp", "recover"].includes(event.name)) return true; + var evt = event.getl(player); + if (event.name == "equip" && event.player == player) return !evt || evt.cards.length != 1; + if (!evt || !evt.es.length) return false; + return game.hasPlayer((current) => player.canUse("sha", current, false)); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:'莽击:弃置一张手牌,视为对一名其他角色使用一张【杀】', - forced:true, - filterCard:lib.filter.cardDiscardable, - filterTarget:function(card,player,target){ - return player.canUse('sha',target,false); + prompt: "莽击:弃置一张手牌,视为对一名其他角色使用一张【杀】", + forced: true, + filterCard: lib.filter.cardDiscardable, + filterTarget: function (card, player, target) { + return player.canUse("sha", target, false); }, - ai2:function(target){ - return get.effect(target,{name:'sha'},_status.event.player); + ai2: function (target) { + return get.effect(target, { name: "sha" }, _status.event.player); }, - }) - 'step 1' - if(result.bool){ - var target=result.targets[0],cards=result.cards; - player.logSkill('yjmangji',target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.logSkill("yjmangji", target); player.discard(cards); - if(player.canUse('sha',target,false)) player.useCard({name:'sha',isCard:true},target,false); + if (player.canUse("sha", target, false)) + player.useCard({ name: "sha", isCard: true }, target, false); } }, }, //用间beta曹洪 - yjlifeng:{ - audio:2, - enable:'phaseUse', - usable:1, - locked:false, - filter:function(event,player){ - for(var card of ui.discardPile.childNodes){ - if(get.type(card)=='equip') return true; + yjlifeng: { + audio: 2, + enable: "phaseUse", + usable: 1, + locked: false, + filter: function (event, player) { + for (var card of ui.discardPile.childNodes) { + if (get.type(card) == "equip") return true; } return false; }, - content:function(){ - 'step 0' - var cards=Array.from(ui.discardPile.childNodes).filter(i=>get.type(i)=='equip'); - player.chooseButton(['厉锋:获得一张装备牌',cards],cards.length>0).set('ai',get.buttonValue); - 'step 1' - if(result.bool){ - var card=result.links[0]; - player.gain(card,'gain2'); + content: function () { + "step 0"; + var cards = Array.from(ui.discardPile.childNodes).filter((i) => get.type(i) == "equip"); + player + .chooseButton(["厉锋:获得一张装备牌", cards], cards.length > 0) + .set("ai", get.buttonValue); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + player.gain(card, "gain2"); } }, - ai:{ - order:10, - result:{player:1}, - effect:{ - target:function(card,player,target){ - if(card&&get.type(card)=='equip'&&_status.event.skill=='_gifting') return 0; + ai: { + order: 10, + result: { player: 1 }, + effect: { + target: function (card, player, target) { + if (card && get.type(card) == "equip" && _status.event.skill == "_gifting") + return 0; }, }, }, - mod:{ - cardGiftable:function(card,player){ - return get.type(card)=='equip'; - } - } + mod: { + cardGiftable: function (card, player) { + return get.type(card) == "equip"; + }, + }, }, //用间篇李儒 - yjdumou:{ - audio:2, - forced:true, - mod:{ - cardname:function(card,player,name){ - if(player==_status.currentPhase&&card.name=='du') return 'guohe'; + yjdumou: { + audio: 2, + forced: true, + mod: { + cardname: function (card, player, name) { + if (player == _status.currentPhase && card.name == "du") return "guohe"; }, - aiValue:function(player,card,num){ - if(card.name=='du') return get.value({name:'guohe'}); + aiValue: function (player, card, num) { + if (card.name == "du") return get.value({ name: "guohe" }); }, }, - init:()=>{ - game.addGlobalSkill('yjdumou_du'); + init: () => { + game.addGlobalSkill("yjdumou_du"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('yjdumou'),true)) game.removeGlobalSkill('yjdumou_du'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("yjdumou"), true)) + game.removeGlobalSkill("yjdumou_du"); }, - subSkill:{ - du:{ - mod:{ - cardname:function(card,player,name){ - if(_status.currentPhase&&player!=_status.currentPhase&&_status.currentPhase.hasSkill('yjdumou')&&get.color(card)=='black') return 'du'; + subSkill: { + du: { + mod: { + cardname: function (card, player, name) { + if ( + _status.currentPhase && + player != _status.currentPhase && + _status.currentPhase.hasSkill("yjdumou") && + get.color(card) == "black" + ) + return "du"; }, - aiValue:function(player,card,num){ - if(get.name(card)=='du'&&card.name!='du') return get.value({name:card.name}); + aiValue: function (player, card, num) { + if (get.name(card) == "du" && card.name != "du") + return get.value({ name: card.name }); }, }, - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('yjdumou'),true); + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("yjdumou"), true); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('yjdumou_du'); - } - } + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("yjdumou_du"); + }, + }, }, - ai:{threaten:2.1} + ai: { threaten: 2.1 }, }, - yjweiquan:{ - audio:2, - enable:'phaseUse', - skillAnimation:true, - animationColor:'soil', - filterTarget:true, - limited:true, - selectTarget:()=>[1,game.roundNumber], - contentBefore:function(){ - 'step 0' - player.awakenSkill('yjweiquan'); - player.chooseTarget('威权:选择获得牌的角色',true).set('ai',target=>{ - var att=get.attitude(_status.event.player,target),num=target.needsToDiscard(targets.filter(i=>i!=target&&i.countCards('h')).length); - if(att>0&&num<=2) return 0; - if(att<0&&target.needsToDiscard(-5)) return -att-Math.sqrt(num); - return att-Math.sqrt(num); + yjweiquan: { + audio: 2, + enable: "phaseUse", + skillAnimation: true, + animationColor: "soil", + filterTarget: true, + limited: true, + selectTarget: () => [1, game.roundNumber], + contentBefore: function () { + "step 0"; + player.awakenSkill("yjweiquan"); + player.chooseTarget("威权:选择获得牌的角色", true).set("ai", (target) => { + var att = get.attitude(_status.event.player, target), + num = target.needsToDiscard( + targets.filter((i) => i != target && i.countCards("h")).length + ); + if (att > 0 && num <= 2) return 0; + if (att < 0 && target.needsToDiscard(-5)) return -att - Math.sqrt(num); + return att - Math.sqrt(num); }); - 'step 1' - event.getParent()._yjweiquan=result.targets[0]; + ("step 1"); + event.getParent()._yjweiquan = result.targets[0]; }, - content:function(){ - 'step 0' - var targetx=event.getParent()._yjweiquan; - if(target==targetx||!target.countCards('h')) event.finish(); - else target.chooseCard('威权:将一张手牌交给'+get.translation(targetx),true); - 'step 1' - if(result.bool){ - var targetx=event.getParent()._yjweiquan; - target.give(result.cards,targetx); + content: function () { + "step 0"; + var targetx = event.getParent()._yjweiquan; + if (target == targetx || !target.countCards("h")) event.finish(); + else target.chooseCard("威权:将一张手牌交给" + get.translation(targetx), true); + ("step 1"); + if (result.bool) { + var targetx = event.getParent()._yjweiquan; + target.give(result.cards, targetx); } }, - contentAfter:function(){ - var targetx=event.getParent()._yjweiquan; - if(targetx.countCards('h')>targetx.hp){ - var next=targetx.phase(); + contentAfter: function () { + var targetx = event.getParent()._yjweiquan; + if (targetx.countCards("h") > targetx.hp) { + var next = targetx.phase(); event.next.remove(next); event.getParent().after.push(next); - next.player=targetx; - next._noTurnOver=true; - next._triggered=null; - next.setContent(function(){ - game.broadcastAll(function(){ - if(ui.tempnowuxie){ + next.player = targetx; + next._noTurnOver = true; + next._triggered = null; + next.setContent(function () { + game.broadcastAll(function () { + if (ui.tempnowuxie) { ui.tempnowuxie.close(); delete ui.tempnowuxie; } }); player.phaseDiscard(); - if(!player.noPhaseDelay) game.delayx(); + if (!player.noPhaseDelay) game.delayx(); delete player._noSkill; }); } }, - ai:{ - order:6, - result:{ - player:function(player){ - var num=game.countPlayer(current=>get.attitude(player,current)<0&¤t.countCards('h')); - if(game.roundNumber2||!game.hasPlayer(current=>{ - return get.attitude(player,current)>0&¤t.needsToDiscard(num)<2||get.attitude(player,current)<0&¤t.needsToDiscard(-5); - })) return -10; + ai: { + order: 6, + result: { + player: function (player) { + var num = game.countPlayer( + (current) => get.attitude(player, current) < 0 && current.countCards("h") + ); + if ( + (game.roundNumber < num && player.hp > 2) || + !game.hasPlayer((current) => { + return ( + (get.attitude(player, current) > 0 && + current.needsToDiscard(num) < 2) || + (get.attitude(player, current) < 0 && current.needsToDiscard(-5)) + ); + }) + ) + return -10; return 1; }, - target:-1, - } - } - }, - yjrenwang:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - for(var card of ui.discardPile.childNodes){ - if(get.color(card)=='black'&&get.type(card)=='basic') return true; - } - return false; - }, - content:function(){ - 'step 0' - var cards=Array.from(ui.discardPile.childNodes).filter(i=>get.color(i)=='black'&&get.type(i)=='basic'); - player.chooseButton(['人望:选择一张黑色基本牌',cards],cards.length>0).set('ai',get.buttonValue); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget('选择一名角色获得'+get.translation(card),true).set('ai',target=>get.attitude(_status.event.player,target)); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target); - target.gain(card,'gain2'); - } - }, - ai:{ - order:10, - result:{player:1} - } - }, - //群曹操 - yjxiandao:{ - trigger:{player:'giftAccepted'}, - usable:1, - forced:true, - locked:false, - filter:(event,player)=>event.target!=player&&event.target.isIn(), - logTarget:'target', - content:function(){ - 'step 0' - event.target=trigger.target; - event.card=trigger.card; - event.target.markAuto('yjxiandao_block',[get.suit(event.card,false)]); - event.target.addTempSkill('yjxiandao_block'); - 'step 1' - var type=get.type(card,false); - if(type=='trick') player.draw(2); - if(type=='equip'){ - if(target.countGainableCards(player,'he',function(cardx){ - return cardx!=card; - })>0) player.gainPlayerCard(target,'he',true).set('card',card).set('filterButton',function(button){ - return button.link!=_status.event.card; - }); - if(get.subtype(card,false)=='equip1') target.damage(); - } - }, - subSkill:{ - block:{ - charlotte:true, - onremove:true, - mod:{ - cardEnabled:function(card,player){ - if(player.getStorage('yjxiandao_block').includes(get.suit(card))) return false; - }, - cardRespondable:function(card,player){ - if(player.getStorage('yjxiandao_block').includes(get.suit(card))) return false; - }, - cardSavable:function(card,player){ - if(player.getStorage('yjxiandao_block').includes(get.suit(card))) return false; - }, - }, - mark:true, - intro:{content:'不能使用或打出$牌'}, + target: -1, }, }, }, - yjsancai:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + yjrenwang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + for (var card of ui.discardPile.childNodes) { + if (get.color(card) == "black" && get.type(card) == "basic") return true; + } + return false; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; + var cards = Array.from(ui.discardPile.childNodes).filter( + (i) => get.color(i) == "black" && get.type(i) == "basic" + ); + player + .chooseButton(["人望:选择一张黑色基本牌", cards], cards.length > 0) + .set("ai", get.buttonValue); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget("选择一名角色获得" + get.translation(card), true) + .set("ai", (target) => get.attitude(_status.event.player, target)); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target); + target.gain(card, "gain2"); + } + }, + ai: { + order: 10, + result: { player: 1 }, + }, + }, + //群曹操 + yjxiandao: { + trigger: { player: "giftAccepted" }, + usable: 1, + forced: true, + locked: false, + filter: (event, player) => event.target != player && event.target.isIn(), + logTarget: "target", + content: function () { + "step 0"; + event.target = trigger.target; + event.card = trigger.card; + event.target.markAuto("yjxiandao_block", [get.suit(event.card, false)]); + event.target.addTempSkill("yjxiandao_block"); + ("step 1"); + var type = get.type(card, false); + if (type == "trick") player.draw(2); + if (type == "equip") { + if ( + target.countGainableCards(player, "he", function (cardx) { + return cardx != card; + }) > 0 + ) + player + .gainPlayerCard(target, "he", true) + .set("card", card) + .set("filterButton", function (button) { + return button.link != _status.event.card; + }); + if (get.subtype(card, false) == "equip1") target.damage(); + } + }, + subSkill: { + block: { + charlotte: true, + onremove: true, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("yjxiandao_block").includes(get.suit(card))) + return false; + }, + cardRespondable: function (card, player) { + if (player.getStorage("yjxiandao_block").includes(get.suit(card))) + return false; + }, + cardSavable: function (card, player) { + if (player.getStorage("yjxiandao_block").includes(get.suit(card))) + return false; + }, + }, + mark: true, + intro: { content: "不能使用或打出$牌" }, + }, + }, + }, + yjsancai: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; player.showHandcards(); - var hs=player.getCards('h'); - if(hs.length>1){ - var type=get.type2(hs[0],player); - for(var i=1;i 1) { + var type = get.type2(hs[0], player); + for (var i = 1; i < hs.length; i++) { + if (get.type(hs[i]) != type) { event.finish(); return; } } } - 'step 1' + ("step 1"); player.chooseCardTarget({ - prompt:'是否赠予一张手牌?', - filterCard:true, - filterTarget:lib.filter.notMe, + prompt: "是否赠予一张手牌?", + filterCard: true, + filterTarget: lib.filter.notMe, }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.gift(result.cards,target); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.gift(result.cards, target); } - } + }, }, - yjyibing:{ - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + yjyibing: { + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - direct:true, - filter:function(event,player){ - if(event.getParent().name=='gift') return false; - if(event.getParent('yjyibing').player==player) return false; - var evt=event.getParent('phaseDraw'),hs=player.getCards('h'),cards=event.getg(player); - return cards.length>0&&(!evt||evt.player!=player)&&cards.filter(function(card){ - return hs.includes(card)&&game.checkMod(card,player,'unchanged','cardEnabled2',player)!==false; - }).length==cards.length&&player.hasUseTarget({ - name:'sha', - cards:event.cards, - },false); + direct: true, + filter: function (event, player) { + if (event.getParent().name == "gift") return false; + if (event.getParent("yjyibing").player == player) return false; + var evt = event.getParent("phaseDraw"), + hs = player.getCards("h"), + cards = event.getg(player); + return ( + cards.length > 0 && + (!evt || evt.player != player) && + cards.filter(function (card) { + return ( + hs.includes(card) && + game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false + ); + }).length == cards.length && + player.hasUseTarget( + { + name: "sha", + cards: event.cards, + }, + false + ) + ); }, - content:function(){ - var cards=trigger.getg(player); - player.chooseUseTarget(get.prompt('yjyibing'),'将'+get.translation(cards)+'当做【杀】使用','sha',cards,false,'nodistance').logSkill='yjyibing'; + content: function () { + var cards = trigger.getg(player); + player.chooseUseTarget( + get.prompt("yjyibing"), + "将" + get.translation(cards) + "当做【杀】使用", + "sha", + cards, + false, + "nodistance" + ).logSkill = "yjyibing"; }, }, //龙羽飞 - longyi:{ - enable:['chooseToUse','chooseToRespond'], - filter:function(event,player){ - if(event.type=='wuxie') return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of hs){ - if(game.checkMod(i,player,'unchanged','cardEnabled2',player)===false) return false; + longyi: { + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if (event.type == "wuxie") return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (game.checkMod(i, player, "unchanged", "cardEnabled2", player) === false) + return false; } - for(var i of lib.inpile){ - if(i!='du'&&get.type(i)=='basic'&&event.filterCard({name:i,cards:hs},player,event)) return true; - if(i=='sha'){ - var list=['fire','thunder','ice']; - for(var j of list){ - if(event.filterCard({name:i,nature:j,cards:hs},player,event)) return true; + for (var i of lib.inpile) { + if ( + i != "du" && + get.type(i) == "basic" && + event.filterCard({ name: i, cards: hs }, player, event) + ) + return true; + if (i == "sha") { + var list = ["fire", "thunder", "ice"]; + for (var j of list) { + if (event.filterCard({ name: i, nature: j, cards: hs }, player, event)) + return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var vcards=[],hs=player.getCards('h'); - for(var i of lib.inpile){ - if(i!='du'&&get.type(i)=='basic'&&event.filterCard({name:i,cards:hs},player,event)) vcards.push(['基本','',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard({name:i,nature:j,cards:hs},player,event)) vcards.push(['基本','',i,j]); + chooseButton: { + dialog: function (event, player) { + var vcards = [], + hs = player.getCards("h"); + for (var i of lib.inpile) { + if ( + i != "du" && + get.type(i) == "basic" && + event.filterCard({ name: i, cards: hs }, player, event) + ) + vcards.push(["基本", "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j, cards: hs }, player, event)) + vcards.push(["基本", "", i, j]); } } } - return ui.create.dialog('龙裔',[vcards,'vcard']); + return ui.create.dialog("龙裔", [vcards, "vcard"]); }, - check:function(button,player){ - if(_status.event.getParent().type!='phase') return 1; - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); + check: function (button, player) { + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'longyi', - popname:true, - viewAs:{name:links[0][2],nature:links[0][3]}, - filterCard:true, - selectCard:-1, - position:'h', - } + audio: "longyi", + popname: true, + viewAs: { name: links[0][2], nature: links[0][3] }, + filterCard: true, + selectCard: -1, + position: "h", + }; }, - prompt:function(links,player){ - return '将所有手牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用或打出'; - } - }, - hiddenCard:function(player,name){ - return name!='du'&&get.type(name)=='basic'&&player.countCards('h')>0; - }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player){ - return player.countCards('h')>0; + prompt: function (links, player) { + return ( + "将所有手牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用或打出" + ); }, - order:0.5, - result:{ - player:function(player){ - if(_status.event.dying){ - return get.attitude(player,_status.event.dying); + }, + hiddenCard: function (player, name) { + return name != "du" && get.type(name) == "basic" && player.countCards("h") > 0; + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + return player.countCards("h") > 0; + }, + order: 0.5, + result: { + player: function (player) { + if (_status.event.dying) { + return get.attitude(player, _status.event.dying); } - if(_status.event.type=='respondShan') return 1; - var val=0,hs=player.getCards('h'),max=0; - for(var i of hs){ - val+=get.value(i,player); - if(get.type(i,player)=='trick') max+=5; + if (_status.event.type == "respondShan") return 1; + var val = 0, + hs = player.getCards("h"), + max = 0; + for (var i of hs) { + val += get.value(i, player); + if (get.type(i, player) == "trick") max += 5; } - if(player.hasSkill('zhenjue')) max+=7; - return val<=max?1:0; + if (player.hasSkill("zhenjue")) max += 7; + return val <= max ? 1 : 0; }, }, }, - group:'longyi_effect', - subSkill:{ - effect:{ - trigger:{player:['useCard','respond']}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - if(event.skill!='longyi_backup') return false; - for(var i of event.cards){ - var type=get.type2(i,player); - if(type=='equip'||type=='trick') return true; + group: "longyi_effect", + subSkill: { + effect: { + trigger: { player: ["useCard", "respond"] }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + if (event.skill != "longyi_backup") return false; + for (var i of event.cards) { + var type = get.type2(i, player); + if (type == "equip" || type == "trick") return true; } return false; }, - content:function(){ - var map={}; - for(var i of trigger.cards){ - map[get.type2(i,player)]=true; + content: function () { + var map = {}; + for (var i of trigger.cards) { + map[get.type2(i, player)] = true; } - if(map.trick) player.draw(); - if(map.equip&&trigger.directHit) trigger.directHit.addArray(game.players); + if (map.trick) player.draw(); + if (map.equip && trigger.directHit) trigger.directHit.addArray(game.players); }, }, - backup:{}, + backup: {}, }, }, - zhenjue:{ - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('h')==0; + zhenjue: { + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") == 0; }, - logTarget:'player', - content:function(){ - 'step 0' - trigger.player.chooseToDiscard('he','弃置一张牌,或令'+get.translation(player)+'摸一张牌').set('ai',function(card){ - if(_status.event.goon) return 7-get.value(card); - return -get.value(card); - }).set('goon',get.attitude(trigger.player,player)<0); - 'step 1' - if(!result.bool) player.draw(); + logTarget: "player", + content: function () { + "step 0"; + trigger.player + .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return -get.value(card); + }) + .set("goon", get.attitude(trigger.player, player) < 0); + ("step 1"); + if (!result.bool) player.draw(); }, }, //群刘备 - jsprende:{ - audio:'rerende', - enable:'phaseUse', - filterCard:true, - selectCard:[1,Infinity], - discard:false, - lose:false, - delay:false, - filterTarget:function(card,player,target){ - return player!=target; + jsprende: { + audio: "rerende", + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + discard: false, + lose: false, + delay: false, + filterTarget: function (card, player, target) { + return player != target; }, - onremove:true, - check:function(card){ - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - var player=get.owner(card); - if(ui.selected.cards.length>=Math.max(2,player.countCards('h')-player.hp)) return 0; - if(player.hp==player.maxHp||player.storage.jsprende<0||player.countCards('h')<=1){ - var players=game.filterPlayer(); - for(var i=0;i=3&& - get.attitude(players[i],player)>=3){ - return 11-get.value(card); + onremove: true, + check: function (card) { + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + var player = get.owner(card); + if (ui.selected.cards.length >= Math.max(2, player.countCards("h") - player.hp)) return 0; + if ( + player.hp == player.maxHp || + player.storage.jsprende < 0 || + player.countCards("h") <= 1 + ) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].hasSkill("haoshi") && + !players[i].isTurnedOver() && + !players[i].hasJudge("lebu") && + get.attitude(player, players[i]) >= 3 && + get.attitude(players[i], player) >= 3 + ) { + return 11 - get.value(card); } } - if(player.countCards('h')>player.hp) return 10-get.value(card); - if(player.countCards('h')>2) return 6-get.value(card); + if (player.countCards("h") > player.hp) return 10 - get.value(card); + if (player.countCards("h") > 2) return 6 - get.value(card); return -1; } - return 10-get.value(card); + return 10 - get.value(card); }, - content:function(){ - 'step 0' - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'&&!evt.jsprende){ - var next=game.createEvent('jsprende_clear'); + content: function () { + "step 0"; + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse" && !evt.jsprende) { + var next = game.createEvent("jsprende_clear"); _status.event.next.remove(next); evt.after.push(next); - evt.jsprende=true; - next.player=player; - next.setContent(function(){ + evt.jsprende = true; + next.player = player; + next.setContent(function () { delete player.storage.jsprende; }); } - player.give(cards,target); - if(typeof player.storage.jsprende!='number'){ - player.storage.jsprende=0; + player.give(cards, target); + if (typeof player.storage.jsprende != "number") { + player.storage.jsprende = 0; } - if(player.storage.jsprende>=0){ - player.storage.jsprende+=cards.length; - if(player.storage.jsprende>=2){ - var list=[]; - if(lib.filter.cardUsable({name:'sha',isCard:true},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse('sha',current); - })){ - list.push(['基本','','sha']); + if (player.storage.jsprende >= 0) { + player.storage.jsprende += cards.length; + if (player.storage.jsprende >= 2) { + var list = []; + if ( + lib.filter.cardUsable( + { name: "sha", isCard: true }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse("sha", current); + }) + ) { + list.push(["基本", "", "sha"]); } - for(var i of lib.inpile_nature){ - if(lib.filter.cardUsable({name:'sha',nature:i,isCard:true},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse({name:'sha',nature:i,isCard:true},current); - })){ - list.push(['基本','','sha',i]); + for (var i of lib.inpile_nature) { + if ( + lib.filter.cardUsable( + { name: "sha", nature: i, isCard: true }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse( + { name: "sha", nature: i, isCard: true }, + current + ); + }) + ) { + list.push(["基本", "", "sha", i]); } } - if(lib.filter.cardUsable({name:'tao',isCard:true},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse('tao',current); - })){ - list.push(['基本','','tao']); + if ( + lib.filter.cardUsable( + { name: "tao", isCard: true }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse("tao", current); + }) + ) { + list.push(["基本", "", "tao"]); } - if(lib.filter.cardUsable({name:'jiu',isCard:true},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse('jiu',current); - })){ - list.push(['基本','','jiu']); + if ( + lib.filter.cardUsable( + { name: "jiu", isCard: true }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse("jiu", current); + }) + ) { + list.push(["基本", "", "jiu"]); } - if(list.length){ - player.chooseButton(['是否视为使用一张基本牌?',[list,'vcard']]).set('ai',function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3],isCard:true}; - if(card.name=='tao'){ - if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()){ - return 5; + if (list.length) { + player + .chooseButton(["是否视为使用一张基本牌?", [list, "vcard"]]) + .set("ai", function (button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }; + if (card.name == "tao") { + if ( + player.hp == 1 || + (player.hp == 2 && !player.hasShan()) || + player.needsToDiscard() + ) { + return 5; + } + return 1; } - return 1; - } - if(card.name=='sha'){ - if(game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0 - })){ - if(card.nature=='fire') return 2.95; - if(card.nature=='thunder'||card.nature=='ice') return 2.92; - return 2.9; + if (card.name == "sha") { + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + if (card.nature == "fire") return 2.95; + if (card.nature == "thunder" || card.nature == "ice") + return 2.92; + return 2.9; + } + return 0; + } + if (card.name == "jiu") { + return 0.5; } return 0; - } - if(card.name=='jiu'){ - return 0.5; - } - return 0; - }); - } - else{ + }); + } else { event.finish(); } - player.storage.jsprende=-1; - } - else{ + player.storage.jsprende = -1; + } else { event.finish(); } - } - else{ + } else { event.finish(); } - 'step 1' - if(result&&result.bool&&result.links[0]){ - var card={name:result.links[0][2],nature:result.links[0][3],isCard:true}; - player.chooseUseTarget(card,true); + ("step 1"); + if (result && result.bool && result.links[0]) { + var card = { name: result.links[0][2], nature: result.links[0][3], isCard: true }; + player.chooseUseTarget(card, true); } }, - ai:{ - fireAttack:true, - order:function(skill,player){ - if(player.hp1){ + ai: { + fireAttack: true, + order: function (skill, player) { + if ( + player.hp < player.maxHp && + player.storage.jsprende < 2 && + player.countCards("h") > 1 + ) { return 10; } return 4; }, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; return -10; } - if(target.hasJudge('lebu')) return 0; - var nh=target.countCards('h'); - var np=player.countCards('h'); - if(player.hp==player.maxHp||player.storage.jsprende<0||player.countCards('h')<=1){ - if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; + if (target.hasJudge("lebu")) return 0; + var nh = target.countCards("h"); + var np = player.countCards("h"); + if ( + player.hp == player.maxHp || + player.storage.jsprende < 0 || + player.countCards("h") <= 1 + ) { + if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; } - return Math.max(1,5-nh); - } + return Math.max(1, 5 - nh); + }, }, - effect:{ - target:function(card,player,target){ - if(player==target&&get.type(card)=='equip'){ - if(player.countCards('e',{subtype:get.subtype(card)})){ - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })){ + effect: { + target: function (card, player, target) { + if (player == target && get.type(card) == "equip") { + if (player.countCards("e", { subtype: get.subtype(card) })) { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) { return 0; } } } - } + }, }, - threaten:0.8 - } + threaten: 0.8, + }, }, //曹安民 - nskuishe:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; + nskuishe: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.choosePlayerCard(target,'he',true).set('ai',get.buttonValue); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - event.card=card; - player.chooseTarget('将'+get.translation(target)+'的'+(get.position(card)=='h'&&!player.hasSkillTag('viewHandcard',null,target,true)?'手牌':get.translation(card))+'交给一名角色',true,function(target){ - return target!=_status.event.getParent().target; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.du){ - if(target.hasSkillTag('nodu')) return 0; - return -att; - } - if(target.hasSkillTag('nogain')) return 0.1; - if(att>0){ - return att+Math.max(0,5-target.countCards('h')); - } - return att; - }).set('du',event.card.name=='du'); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target2=result.targets[0]; - target.line(target2,'green'); - target2.gain(target,card,'giveAuto').giver=player; - } - else event.finish(); - 'step 3' - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'是否对'+get.translation(player)+'使用一张杀?').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',player); + content: function () { + "step 0"; + player.choosePlayerCard(target, "he", true).set("ai", get.buttonValue); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + event.card = card; + player + .chooseTarget( + "将" + + get.translation(target) + + "的" + + (get.position(card) == "h" && + !player.hasSkillTag("viewHandcard", null, target, true) + ? "手牌" + : get.translation(card)) + + "交给一名角色", + true, + function (target) { + return target != _status.event.getParent().target; + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.du) { + if (target.hasSkillTag("nodu")) return 0; + return -att; + } + if (target.hasSkillTag("nogain")) return 0.1; + if (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du"); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2, "green"); + target2.gain(target, card, "giveAuto").giver = player; + } else event.finish(); + ("step 3"); + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "是否对" + get.translation(player) + "使用一张杀?") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", player); }, - ai:{ - order:6, - expose:0.2, - result:{ - target:-1.5, - player:function(player,target){ - if(!target.canUse('sha',player)) return 0; - if(target.countCards('h')==1) return 0.1; - if(player.hasShan()) return -0.5; - if(player.hp<=1) return -2; - if(player.hp<=2) return -1; + ai: { + order: 6, + expose: 0.2, + result: { + target: -1.5, + player: function (player, target) { + if (!target.canUse("sha", player)) return 0; + if (target.countCards("h") == 1) return 0.1; + if (player.hasShan()) return -0.5; + if (player.hp <= 1) return -2; + if (player.hp <= 2) return -1; return 0; - } - }, - }, - }, - //文和乱武 - nsyangwu:{ - enable:'phaseUse', - usable:1, - filterCard:{suit:'heart'}, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>player.countCards('h'); - }, - filter:function(event,player){ - var info=lib.skill.nsyangwu; - return player.countCards('h',info.filterCard)&&game.hasPlayer(function(target){ - return info.filterTarget(null,player,target); - }); - }, - check:function(card){ - var num=0; - var player=_status.event.player; - game.countPlayer(function(current){ - if(current!=player&&get.attitude(player,current)<0) num=Math.max(num,current.countCards('h')-player.countCards('h')); - }); - return Math.ceil((num+1)/2)*2+4-get.value(card); - }, - content:function(){ - var num=Math.ceil((target.countCards('h')-player.countCards('h'))/2); - if(num) player.gainPlayerCard(target,true,'h',num,'visible'); - }, - ai:{ - order:4, - result:{ - target:function(player,target){ - return player.countCards('h')-target.countCards('h'); }, }, }, }, - nslulve:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('e')>0&¤t.countCards('e')<=player.countCards('he'); + //文和乱武 + nsyangwu: { + enable: "phaseUse", + usable: 1, + filterCard: { suit: "heart" }, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > player.countCards("h"); + }, + filter: function (event, player) { + var info = lib.skill.nsyangwu; + return ( + player.countCards("h", info.filterCard) && + game.hasPlayer(function (target) { + return info.filterTarget(null, player, target); + }) + ); + }, + check: function (card) { + var num = 0; + var player = _status.event.player; + game.countPlayer(function (current) { + if (current != player && get.attitude(player, current) < 0) + num = Math.max(num, current.countCards("h") - player.countCards("h")); + }); + return Math.ceil((num + 1) / 2) * 2 + 4 - get.value(card); + }, + content: function () { + var num = Math.ceil((target.countCards("h") - player.countCards("h")) / 2); + if (num) player.gainPlayerCard(target, true, "h", num, "visible"); + }, + ai: { + order: 4, + result: { + target: function (player, target) { + return player.countCards("h") - target.countCards("h"); + }, + }, + }, + }, + nslulve: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current.countCards("e") > 0 && current.countCards("e") <= player.countCards("he") + ); }); }, - filterCard:function(){ - if(ui.selected.targets.length) return false; + filterCard: function () { + if (ui.selected.targets.length) return false; return true; }, - position:'he', - selectCard:[1,Infinity], - complexSelect:true, - complexCard:true, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('e')>0&&ui.selected.cards.length==target.countCards('e'); + position: "he", + selectCard: [1, Infinity], + complexSelect: true, + complexCard: true, + filterTarget: function (card, player, target) { + return ( + target != player && + target.countCards("e") > 0 && + ui.selected.cards.length == target.countCards("e") + ); }, - check:function(card){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current!=player&¤t.countCards('e')>0&&ui.selected.cards.length==current.countCards('e')&&get.damageEffect(current,player,player)>0; - })) return 0; - switch(ui.selected.cards.length){ - case 0:return 8-get.value(card); - case 1:return 6-get.value(card); - case 2:return 3-get.value(card); - default:return 0; - } - }, - content:function(){ - target.damage('nocard'); - }, - ai:{ - damage:true, - order:2, - result:{ - target:function(player,target){ - return get.damageEffect(target,player); - } - }, - expose:0.3 - } - }, - nsfeixiong:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&&player.canCompare(current); - }); - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('nsfeixiong'),function(card,player,target){ - return player!=target&&player.canCompare(target); - }).set('ai',function(target){ - var player=_status.event.player; - var hs=player.getCards('h').sort(function(a,b){ - return b.number-a.number; - }); - var ts=target.getCards('h').sort(function(a,b){ - return b.number-a.number; - }); - if(!hs.length||!ts.length) return 0; - if(hs[0].number>ts[0].number) return get.damageEffect(target,player,player); + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current.countCards("e") > 0 && + ui.selected.cards.length == current.countCards("e") && + get.damageEffect(current, player, player) > 0 + ); + }) + ) return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('nsfeixiong',target); - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2); - player.chooseToCompare(target); + switch (ui.selected.cards.length) { + case 0: + return 8 - get.value(card); + case 1: + return 6 - get.value(card); + case 2: + return 3 - get.value(card); + default: + return 0; } - else event.finish(); - 'step 2' - if(!result.tie){ - var targets=[player,target]; - if(result.bool) targets.reverse(); + }, + content: function () { + target.damage("nocard"); + }, + ai: { + damage: true, + order: 2, + result: { + target: function (player, target) { + return get.damageEffect(target, player); + }, + }, + expose: 0.3, + }, + }, + nsfeixiong: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("nsfeixiong"), function (card, player, target) { + return player != target && player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + var hs = player.getCards("h").sort(function (a, b) { + return b.number - a.number; + }); + var ts = target.getCards("h").sort(function (a, b) { + return b.number - a.number; + }); + if (!hs.length || !ts.length) return 0; + if (hs[0].number > ts[0].number) return get.damageEffect(target, player, player); + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("nsfeixiong", target); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); + player.chooseToCompare(target); + } else event.finish(); + ("step 2"); + if (!result.tie) { + var targets = [player, target]; + if (result.bool) targets.reverse(); targets[0].damage(targets[1]); } }, }, - nscesuan:{ - trigger:{player:'damageBegin3'}, - forced:true, - content:function(){ - 'step 0' + nscesuan: { + trigger: { player: "damageBegin3" }, + forced: true, + content: function () { + "step 0"; trigger.cancel(); - event.lose=player.loseMaxHp(); - 'step 1' - if(event.lose&&event.lose.loseHp) player.draw(); + event.lose = player.loseMaxHp(); + ("step 1"); + if (event.lose && event.lose.loseHp) player.draw(); }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.player){ - if(arg.player.hasSkillTag('jueqing',false,player)) return false; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; } }, }, }, //S贾诩 - nsyice:{ - trigger:{ - player:'loseAfter', - global:['cardsDiscardAfter','loseAsyncAfter'], + nsyice: { + trigger: { + player: "loseAfter", + global: ["cardsDiscardAfter", "loseAsyncAfter"], }, - filter:function(event,player){ - if(event.name!='cardsDiscard'){ - if(event.type!='discard') return false; - var evt=event.getl(player); - return evt.cards2&&evt.cards2.filterInD('d').length>0; - } - else{ - var evt=event.getParent(); - if(evt.name!='orderingDiscard'||!evt.relatedEvent||evt.relatedEvent.player!=player||!['useCard','respond'].includes(evt.relatedEvent.name)) return false; - return event.cards.filterInD('d').length>0; + filter: function (event, player) { + if (event.name != "cardsDiscard") { + if (event.type != "discard") return false; + var evt = event.getl(player); + return evt.cards2 && evt.cards2.filterInD("d").length > 0; + } else { + var evt = event.getParent(); + if ( + evt.name != "orderingDiscard" || + !evt.relatedEvent || + evt.relatedEvent.player != player || + !["useCard", "respond"].includes(evt.relatedEvent.name) + ) + return false; + return event.cards.filterInD("d").length > 0; } }, - forced:true, - content:function(){ - 'step 0' - var evt=trigger.getParent().relatedEvent; - if((trigger.name=='discard'&&!trigger.delay)||evt&&evt.name=='respond') game.delayx(); - 'step 1' + forced: true, + content: function () { + "step 0"; + var evt = trigger.getParent().relatedEvent; + if ((trigger.name == "discard" && !trigger.delay) || (evt && evt.name == "respond")) + game.delayx(); + ("step 1"); var cards; - if(trigger.getl) cards=trigger.getl(player).cards2.filterInD('d'); - else cards=trigger.cards.filterInD('d'); - if(cards.length==1) event._result={bool:true,links:cards}; - else{ - var dialog=['遗策:选择要放置的卡牌','
    (从左到右为从旧到新,后选择的后置入)
    ',cards]; - var cards2=player.getExpansions('nsyice'); + if (trigger.getl) cards = trigger.getl(player).cards2.filterInD("d"); + else cards = trigger.cards.filterInD("d"); + if (cards.length == 1) event._result = { bool: true, links: cards }; + else { + var dialog = [ + "遗策:选择要放置的卡牌", + '
    (从左到右为从旧到新,后选择的后置入)
    ', + cards, + ]; + var cards2 = player.getExpansions("nsyice"); cards2.reverse(); - if(cards2.length){ + if (cards2.length) { dialog.push('
    原有“策”
    '); dialog.push(cards2); } - player.chooseButton(dialog,true,cards.length).set('filterButton',function(button){ - return _status.event.cards.includes(button.link); - }).set('cards',cards); + player + .chooseButton(dialog, true, cards.length) + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set("cards", cards); } - 'step 2' - player.addToExpansion(result.links,'gain2').gaintag.add('nsyice'); - 'step 3' - var storage=player.getExpansions('nsyice'); - var bool=false; - for(var i=0;ii;j--){ - if(get.number(storage[i])==get.number(storage[j])){ - bool=true; + ("step 2"); + player.addToExpansion(result.links, "gain2").gaintag.add("nsyice"); + ("step 3"); + var storage = player.getExpansions("nsyice"); + var bool = false; + for (var i = 0; i < storage.length; i++) { + for (var j = storage.length - 1; j > i; j--) { + if (get.number(storage[i]) == get.number(storage[j])) { + bool = true; break; } } - if(bool) break; + if (bool) break; } - if(bool){ - event.cards=storage.splice(i,j-i+1); - } - else event.finish(); - 'step 4' - var cardsx=[]; + if (bool) { + event.cards = storage.splice(i, j - i + 1); + } else event.finish(); + ("step 4"); + var cardsx = []; cardsx.push(cards.shift()); cardsx.push(cards.pop()); - if(cards.length) player.gain(cards,'gain2'); - event.cards=cardsx; - 'step 5' - player.chooseButton(['将一张牌置于牌堆顶,将另一张牌置于牌堆底',cards],true); - 'step 6' - player.lose(event.cards,ui.cardPile).set('topper',result.links[0]).insert_index=function(event,card){ - if(card==event.topper) return ui.cardPile.firstChild; - return null; - }; - if(_status.dying.length) event.finish(); - 'step 7' - player.chooseTarget('对一名角色造成1点伤害',true).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); + if (cards.length) player.gain(cards, "gain2"); + event.cards = cardsx; + ("step 5"); + player.chooseButton(["将一张牌置于牌堆顶,将另一张牌置于牌堆底", cards], true); + ("step 6"); + player.lose(event.cards, ui.cardPile).set("topper", result.links[0]).insert_index = + function (event, card) { + if (card == event.topper) return ui.cardPile.firstChild; + return null; + }; + if (_status.dying.length) event.finish(); + ("step 7"); + player.chooseTarget("对一名角色造成1点伤害", true).set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); }); - 'step 8' - if(result.bool){ - var target=result.targets[0]; + ("step 8"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - target.damage('nocard'); + target.damage("nocard"); } }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - marktext:'策', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "策", + intro: { + content: "expansion", + markcount: "expansion", }, }, //用间篇 - yjxuepin:{ - enable:'phaseUse', - usable:1, - filterTarget:function(event,player,target){ - return player.inRange(target)&&target.countDiscardableCards(player,'he')>0; + yjxuepin: { + enable: "phaseUse", + usable: 1, + filterTarget: function (event, player, target) { + return player.inRange(target) && target.countDiscardableCards(player, "he") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseHp(); - 'step 1' - if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,2,'he',true); + ("step 1"); + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, 2, "he", true); else event.finish(); - 'step 2' - if(result.bool&&result.cards.length==2&&get.type2(result.cards[0],result.cards[0].original=='h'?target:false)==get.type2(result.cards[1],result.cards[1].original=='h'?target:false)) player.recover(); + ("step 2"); + if ( + result.bool && + result.cards.length == 2 && + get.type2(result.cards[0], result.cards[0].original == "h" ? target : false) == + get.type2(result.cards[1], result.cards[1].original == "h" ? target : false) + ) + player.recover(); }, - ai:{ - order:4, - result:{ - player:function(player,target){ - if(player.hp==1) return -8; - if(target.countCards('e')>1) return 0; - if(player.hp>2||target.countCards('h')>1) return -0.5; + ai: { + order: 4, + result: { + player: function (player, target) { + if (player.hp == 1) return -8; + if (target.countCards("e") > 1) return 0; + if (player.hp > 2 || target.countCards("h") > 1) return -0.5; return -2; }, - target:function(player,target){ - if(target.countDiscardableCards(player,'he')<2) return 0; + target: function (player, target) { + if (target.countDiscardableCards(player, "he") < 2) return 0; return -2; }, }, }, }, - nsjianglie:{ - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.countCards('h')>0; + nsjianglie: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("h") > 0; }, - check:function(event,player){ - return get.attitude(player,event.target)<0; + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - logTarget:'target', - content:function(){ - 'step 0' + logTarget: "target", + content: function () { + "step 0"; trigger.target.showHandcards(); - 'step 1' - var cards=trigger.target.getCards('h'); - var list=[]; - for(var i=0;i=get.value(player.getCards('h',{color:'black'}))) return 'black'; - return 'red'; - }); + trigger.target + .chooseControl(list) + .set("prompt", "选择弃置一种颜色的所有手牌") + .set("ai", function () { + var player = _status.event.player; + if ( + get.value(player.getCards("h", { color: "red" })) >= + get.value(player.getCards("h", { color: "black" })) + ) + return "black"; + return "red"; + }); } - 'step 2' - trigger.target.discard(trigger.target.getCards('h',{color:result.control})); + ("step 2"); + trigger.target.discard(trigger.target.getCards("h", { color: result.control })); }, }, //桌游志贴纸 - spyinzhi:{ - trigger:{player:'damageEnd'}, - frequent:true, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + spyinzhi: { + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - var cards=game.cardsGotoOrdering(get.cards(2)).cards; + var cards = game.cardsGotoOrdering(get.cards(2)).cards; player.showCards(cards); - event.count2=0; - for(var i=0;i0){ - player.chooseTarget('令一名角色获得'+get.translation(trigger.source)+'的一张手牌',function(card,player,target){ - var source=_status.event.source; - return target!=source&&source.countGainableCards(target,'h')>0; - }).set('source',trigger.source); + if (trigger.source.countCards("h") > 0) { + player + .chooseTarget( + "令一名角色获得" + get.translation(trigger.source) + "的一张手牌", + function (card, player, target) { + var source = _status.event.source; + return target != source && source.countGainableCards(target, "h") > 0; + } + ) + .set("source", trigger.source); + } else event.goto(4); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line([trigger.source, target], "green"); + target.gainPlayerCard(trigger.source, "h", true); + if (event.count2) event.goto(2); } - else event.goto(4); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line([trigger.source,target],'green'); - target.gainPlayerCard(trigger.source,'h',true); - if(event.count2) event.goto(2) - } - 'step 4' - if(cards.length) player.gain(cards,'gain2','log'); - 'step 5' - if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2('spyinzhi')).set('frequentSkill',event.name); - } - else event.finish(); - 'step 6' - if(result.bool){ - player.logSkill('spyinzhi'); + ("step 4"); + if (cards.length) player.gain(cards, "gain2", "log"); + ("step 5"); + if ( + event.count > 0 && + player.hasSkill(event.name) && + !get.is.blocked(event.name, player) + ) { + player.chooseBool(get.prompt2("spyinzhi")).set("frequentSkill", event.name); + } else event.finish(); + ("step 6"); + if (result.bool) { + player.logSkill("spyinzhi"); event.goto(1); } }, }, - spmingjian:{ - trigger:{global:'phaseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + spmingjian: { + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - var next=player.chooseCard(get.prompt2('spmingjian',trigger.player),'he'); - next.set('ai',function(card){ - var target=_status.event.getTrigger().player; - var player=_status.event.player; - if(get.attitude(player,target)>0&&target.countCards('j')>0) return 5-get.value(card); + content: function () { + "step 0"; + var next = player.chooseCard(get.prompt2("spmingjian", trigger.player), "he"); + next.set("ai", function (card) { + var target = _status.event.getTrigger().player; + var player = _status.event.player; + if (get.attitude(player, target) > 0 && target.countCards("j") > 0) + return 5 - get.value(card); return -1; }); - next.set('filterCard',function(card,player){ - if(get.position(card)=='e') return lib.filter.cardDiscardable.apply(this,arguments); + next.set("filterCard", function (card, player) { + if (get.position(card) == "e") + return lib.filter.cardDiscardable.apply(this, arguments); return true; }); //next.set('logSkill',['spmingjian',trigger.player]); - 'step 1' - if(result.bool){ - player.logSkill('spmingjian',trigger.player); - var card=result.cards[0]; - event.card=card; - if(get.position(card)=='e') event._result={index:0}; - else if(!lib.filter.cardDiscardable(card,player,event)) event._result={index:1}; - else{ - var name=get.translation(trigger.player); - player.chooseControl().set('choiceList',[ - '令'+name+'跳过本回合的判定阶段', - '令'+name+'于本回合的判定中不触发「判定结果生效前」的时机', - ]).set('ai',function(){return 0}); + ("step 1"); + if (result.bool) { + player.logSkill("spmingjian", trigger.player); + var card = result.cards[0]; + event.card = card; + if (get.position(card) == "e") event._result = { index: 0 }; + else if (!lib.filter.cardDiscardable(card, player, event)) + event._result = { index: 1 }; + else { + var name = get.translation(trigger.player); + player + .chooseControl() + .set("choiceList", [ + "令" + name + "跳过本回合的判定阶段", + "令" + name + "于本回合的判定中不触发「判定结果生效前」的时机", + ]) + .set("ai", function () { + return 0; + }); } - } - else event.finish(); - 'step 2' - if(result.index==0){ + } else event.finish(); + ("step 2"); + if (result.index == 0) { player.discard(card); - trigger.player.skip('phaseJudge'); - } - else{ - trigger.player.addToExpansion(card,player,'giveAuto').gaintag.add('spmingjian_charlotte'); - trigger.player.addSkill('spmingjian_charlotte'); + trigger.player.skip("phaseJudge"); + } else { + trigger.player + .addToExpansion(card, player, "giveAuto") + .gaintag.add("spmingjian_charlotte"); + trigger.player.addSkill("spmingjian_charlotte"); } }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, - spmingjian_charlotte:{ - trigger:{player:['judgeBefore','phaseAfter']}, - forced:true, - firstDo:true, - silent:true, - popup:false, - charlotte:true, - content:function(){ - if(trigger.name=='phase') player.removeSkill(event.name); - else trigger.noJudgeTrigger=true; + spmingjian_charlotte: { + trigger: { player: ["judgeBefore", "phaseAfter"] }, + forced: true, + firstDo: true, + silent: true, + popup: false, + charlotte: true, + content: function () { + if (trigger.name == "phase") player.removeSkill(event.name); + else trigger.noJudgeTrigger = true; }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - marktext:'鉴', - intro:{ - name:'明鉴', - content:'expansion', - markcount:'expansion', + marktext: "鉴", + intro: { + name: "明鉴", + content: "expansion", + markcount: "expansion", }, }, - spshude:{ - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - filter:function(event,player){ - return player.countCards('h')2; - return get.suit(card)==get.suit(ui.selected.cards[0]); + complexCard: true, + filterCard: function (card, player) { + if (!ui.selected.cards.length) + return player.countCards("he", { suit: get.suit(card) }) > 2; + return get.suit(card) == get.suit(ui.selected.cards[0]); }, - content:function(){ + content: function () { target.turnOver(); - player.addTempSkill('spfuluan2'); + player.addTempSkill("spfuluan2"); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(target.isTurnedOver()) return 2; + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.isTurnedOver()) return 2; return -1; }, }, }, }, - spfuluan2:{ - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + spfuluan2: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, }, }, - spzhaoxin:{ - trigger:{player:'phaseDrawEnd'}, - check:function(event,player){ - return player.getUseValue({name:'sha',isCard:true})>0; + spzhaoxin: { + trigger: { player: "phaseDrawEnd" }, + check: function (event, player) { + return player.getUseValue({ name: "sha", isCard: true }) > 0; }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - 'step 1' - player.chooseUseTarget('sha',false); + ("step 1"); + player.chooseUseTarget("sha", false); }, }, - splanggu:{ - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return get.itemtype(event.source)=='player'; + splanggu: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return get.itemtype(event.source) == "player"; }, - logTarget:'source', - content:function(){ - 'step 0' + logTarget: "source", + content: function () { + "step 0"; player.judge(); - 'step 1' - if(trigger.source.countCards('h')>0){ - var next=player.discardPlayerCard(trigger.source,'h',[1,Infinity]); - next.set('suit',result.suit); - next.set('filterButton',function(button){ - return get.suit(button.link)==_status.event.suit; + ("step 1"); + if (trigger.source.countCards("h") > 0) { + var next = player.discardPlayerCard(trigger.source, "h", [1, Infinity]); + next.set("suit", result.suit); + next.set("filterButton", function (button) { + return get.suit(button.link) == _status.event.suit; }); - next.set('visible',true); + next.set("visible", true); } }, - group:'splanggu_rewrite', + group: "splanggu_rewrite", }, - splanggu_rewrite:{ - trigger:{player:'judge'}, - filter:function (event,player){ - return player.countCards('hs')>0&&event.getParent().name=='splanggu'; + splanggu_rewrite: { + trigger: { player: "judge" }, + filter: function (event, player) { + return player.countCards("hs") > 0 && event.getParent().name == "splanggu"; }, - direct:true, - content:function (){ - "step 0" - player.chooseCard('狼顾的判定结果为'+ - get.translation(trigger.player.judging[0])+',是否打出一张手牌进行代替?','hs',function(card){ - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - return -1; - }); - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight','splanggu','noOrdering'); - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + "狼顾的判定结果为" + + get.translation(trigger.player.judging[0]) + + ",是否打出一张手牌进行代替?", + "hs", + function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + return -1; + }); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "splanggu", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); game.delay(2); } }, }, - sphantong:{ - trigger:{ - player:'loseEnd', + sphantong: { + trigger: { + player: "loseEnd", }, - frequent:true, - filter:function(event,player){ - return event.type=='discard'&&event.getParent(3).name=='phaseDiscard'&&event.cards.filterInD('d').length>0; + frequent: true, + filter: function (event, player) { + return ( + event.type == "discard" && + event.getParent(3).name == "phaseDiscard" && + event.cards.filterInD("d").length > 0 + ); }, - content:function(){ - if(!player.storage.sphantong) player.storage.sphantong=[]; - var cards=trigger.cards.filterInD('d'); + content: function () { + if (!player.storage.sphantong) player.storage.sphantong = []; + var cards = trigger.cards.filterInD("d"); player.storage.sphantong.addArray(cards); player.$gain2(cards); - game.log(player,'将',cards,'置于武将牌上'); - player.markSkill('sphantong'); + game.log(player, "将", cards, "置于武将牌上"); + player.markSkill("sphantong"); }, - group:['sphantong_gain'], - derivation:['hujia','jijiang','jiuyuan','xueyi'], - marktext:'诏', - intro:{ - content:'cards', - onunmark:'throw', + group: ["sphantong_gain"], + derivation: ["hujia", "jijiang", "jiuyuan", "xueyi"], + marktext: "诏", + intro: { + content: "cards", + onunmark: "throw", }, }, - sphantong_gain:{ - trigger:{global:'phaseBegin'}, - direct:true, - filter:function(event,player){ - return player.storage.sphantong&&player.storage.sphantong.length>0; + sphantong_gain: { + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return player.storage.sphantong && player.storage.sphantong.length > 0; }, - content:function(){ - 'step 0' - player.chooseButton([get.prompt('sphantong'),player.storage.sphantong],function(button){ - var player=_status.event.player; - if(_status.currentPhase==player){ - //血裔 - if((player.hasJudge('lebu')||player.skipList.includes('phaseUse'))&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='qun'; - })) return 1; - //激将 - if(!player.hasJudge('lebu')&&!player.skipList.includes('phaseUse')&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'&¤t.hasSha()&&get.attitude(player,current)>0&&get.attitude(current,player)>0; - })&&game.hasPlayer(function(target){ - return player.canUse({name:'sha'},target)&&get.effect(target,{name:'sha'},player,player)>0; - })) return 1; + content: function () { + "step 0"; + player.chooseButton( + [get.prompt("sphantong"), player.storage.sphantong], + function (button) { + var player = _status.event.player; + if (_status.currentPhase == player) { + //血裔 + if ( + (player.hasJudge("lebu") || player.skipList.includes("phaseUse")) && + game.hasPlayer(function (current) { + return current != player && current.group == "qun"; + }) + ) + return 1; + //激将 + if ( + !player.hasJudge("lebu") && + !player.skipList.includes("phaseUse") && + game.hasPlayer(function (current) { + return ( + current != player && + current.group == "shu" && + current.hasSha() && + get.attitude(player, current) > 0 && + get.attitude(current, player) > 0 + ); + }) && + game.hasPlayer(function (target) { + return ( + player.canUse({ name: "sha" }, target) && + get.effect(target, { name: "sha" }, player, player) > 0 + ); + }) + ) + return 1; + } + //护驾 + else if ( + !player.hasShan() && + game.hasPlayer(function (current) { + return ( + current != player && + current.group == "wei" && + current.mayHaveShan(player, "respond") && + get.attitude(player, current) > 0 && + get.attitude(current, player) > 0 + ); + }) + ) + return 1; + return -1; } - //护驾 - else if(!player.hasShan()&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'&¤t.mayHaveShan(player,'respond')&&get.attitude(player,current)>0&&get.attitude(current,player)>0; - })) return 1; - return -1; - }); - 'step 1' - if(result.bool){ - player.logSkill('sphantong'); - var card=result.links[0]; + ); + ("step 1"); + if (result.bool) { + player.logSkill("sphantong"); + var card = result.links[0]; player.$throw(card); - game.log(player,'将',card,'置入了弃牌堆'); + game.log(player, "将", card, "置入了弃牌堆"); player.storage.sphantong.remove(card); - player[player.storage.sphantong.length>0?'markSkill':'unmarkSkill']('sphantong'); + player[player.storage.sphantong.length > 0 ? "markSkill" : "unmarkSkill"]( + "sphantong" + ); game.cardsDiscard(card); - var list=['hujia','jijiang','jiuyuan','xueyi']; - for(var i=0;i0&&get.attitude(current,player)>0; - })&&game.hasPlayer(function(target){ - return player.canUse({name:'sha'},target)&&get.effect(target,{name:'sha'},player,player)>0; - })) return 'jijiang'; - } - //护驾 - else if(!player.hasShan()&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'&¤t.mayHaveShan(player,'respond')&&get.attitude(player,current)>0&&get.attitude(current,player)>0; - })) return 'hujia'; - }); - } - else event.finish(); - } - else event.finish(); - 'step 2' - var skill=result.control; + if (list.length) { + player + .chooseControl(list) + .set("prompt", "选择获得以下技能中的一个") + .set("ai", function () { + var player = _status.event.player; + if (_status.currentPhase == player) { + //血裔 + if ( + (player.hasJudge("lebu") || + player.skipList.includes("phaseUse")) && + game.hasPlayer(function (current) { + return current != player && current.group == "qun"; + }) + ) + return "xueyi"; + //激将 + if ( + !player.hasJudge("lebu") && + !player.skipList.includes("phaseUse") && + game.hasPlayer(function (current) { + return ( + current != player && + current.group == "shu" && + current.hasSha() && + get.attitude(player, current) > 0 && + get.attitude(current, player) > 0 + ); + }) && + game.hasPlayer(function (target) { + return ( + player.canUse({ name: "sha" }, target) && + get.effect(target, { name: "sha" }, player, player) > 0 + ); + }) + ) + return "jijiang"; + } + //护驾 + else if ( + !player.hasShan() && + game.hasPlayer(function (current) { + return ( + current != player && + current.group == "wei" && + current.mayHaveShan(player, "respond") && + get.attitude(player, current) > 0 && + get.attitude(current, player) > 0 + ); + }) + ) + return "hujia"; + }); + } else event.finish(); + } else event.finish(); + ("step 2"); + var skill = result.control; player.addTempSkills(skill); // player.popup(skill,'wood'); // game.log(player,'获得了技能','#g【'+get.translation(skill)+'】'); }, }, - sphuangen:{ - trigger:{global:'useCardToPlayered'}, - filter:function(event,player){ - if(!event.isFirstTarget) return false; - if(get.type(event.card)!='trick') return false; - if(get.info(event.card).multitarget) return false; - if(event.targets.length<2) return false; - return player.hp>0; + sphuangen: { + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget) return false; + if (get.type(event.card) != "trick") return false; + if (get.info(event.card).multitarget) return false; + if (event.targets.length < 2) return false; + return player.hp > 0; }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('sphuangen'), - [1,Math.min(player.hp,trigger.targets.length)],function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - return -get.effect(target,trigger.card,trigger.player,_status.event.player); - }).set('targets',trigger.targets); - "step 1" - if(result.bool){ - player.logSkill('sphuangen',result.targets); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("sphuangen"), + [1, Math.min(player.hp, trigger.targets.length)], + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("ai", function (target) { + return -get.effect(target, trigger.card, trigger.player, _status.event.player); + }) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + player.logSkill("sphuangen", result.targets); trigger.excluded.addArray(result.targets); player.draw(); } }, }, - spyicong:{ - trigger:{player:'phaseDiscardEnd'}, - direct:true, - locked:false, - filter:function(event,player){ - return player.countCards('he')>0; + spyicong: { + trigger: { player: "phaseDiscardEnd" }, + direct: true, + locked: false, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseCard('he',[1,player.countCards('he')],get.prompt2('spyicong')).set('ai',function(card){ - if(card.name=='du') return 10; - if(ui.selected.cards.length) return -1; - return 4-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('spyicong'); - player.addToExpansion(result.cards,player,'give').gaintag.add('spyicong'); + content: function () { + "step 0"; + player + .chooseCard("he", [1, player.countCards("he")], get.prompt2("spyicong")) + .set("ai", function (card) { + if (card.name == "du") return 10; + if (ui.selected.cards.length) return -1; + return 4 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("spyicong"); + player.addToExpansion(result.cards, player, "give").gaintag.add("spyicong"); } }, - mod:{ - globalTo:function(from,to,num){ - return num+to.getExpansions('spyicong').length; + mod: { + globalTo: function (from, to, num) { + return num + to.getExpansions("spyicong").length; }, }, - marktext:'扈', - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + marktext: "扈", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - name:'义从', - content:function(storage,player){ - return '共有'+get.cnNumber(player.getExpansions('spyicong').length)+'张“扈”'; + intro: { + name: "义从", + content: function (storage, player) { + return "共有" + get.cnNumber(player.getExpansions("spyicong").length) + "张“扈”"; }, - markcount:'expansion', + markcount: "expansion", }, }, - sptuji:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.getExpansions('spyicong').length>0; + sptuji: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.getExpansions("spyicong").length > 0; }, - content:function(){ - var cards=player.getExpansions('spyicong'); - var num=cards.length; - player.addMark('sptuji2',num,false); - player.addTempSkill('sptuji2'); + content: function () { + var cards = player.getExpansions("spyicong"); + var num = cards.length; + player.addMark("sptuji2", num, false); + player.addTempSkill("sptuji2"); player.loseToDiscardpile(cards); - if(num<=1) player.draw(); + if (num <= 1) player.draw(); }, }, - sptuji2:{ - onremove:true, - charlotte:true, - mod:{ - globalFrom:function(from,to,num){ - return num-from.countMark('sptuji2'); + sptuji2: { + onremove: true, + charlotte: true, + mod: { + globalFrom: function (from, to, num) { + return num - from.countMark("sptuji2"); }, }, - marktext:'突', - intro:{ - name:'突骑', - content:'至其他角色的距离-#', + marktext: "突", + intro: { + name: "突骑", + content: "至其他角色的距离-#", }, }, - xinfu_yanyu:{ - trigger:{ - global:"phaseUseBegin", + xinfu_yanyu: { + trigger: { + global: "phaseUseBegin", }, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - var next=player.chooseToDiscard(get.prompt('xinfu_yanyu'),get.translation('xinfu_yanyu_info'),'he').set('logSkill','xinfu_yanyu'); - if(player==trigger.player){ - next.set('goon',function(){ - var map={ - basic:0, - trick:0.1, - }; - var hs=trigger.player.getCards('h'); - var sha=false; - var jiu=false; - for(var i=0;i=3) return false; - var type=player.storage.xinfu_yanyu,cards=event.getd(); - for(var i=0;i= 3) return false; + var type = player.storage.xinfu_yanyu, + cards = event.getd(); + for (var i = 0; i < cards.length; i++) { + if (get.type(cards[i], "trick") == type && get.position(cards[i], true) == "d") + return true; } return false; }, - content:function(){ - 'step 0' - event.logged=false; - event.cards=[]; - var type=player.storage.xinfu_yanyu; - var cards=trigger.getd(); - for(var i=0;i=3) event.finish(); - else player.chooseCardButton(event.cards,'【燕语】:是否将其中的一张牌交给一名角色?').ai=function(card){ - if(card.name=='du') return 10; - return get.value(card); - }; - 'step 2' - if(result.bool){ + ("step 1"); + if (player.storage.xinfu_yanyu2 >= 3) event.finish(); + else + player.chooseCardButton( + event.cards, + "【燕语】:是否将其中的一张牌交给一名角色?" + ).ai = function (card) { + if (card.name == "du") return 10; + return get.value(card); + }; + ("step 2"); + if (result.bool) { player.storage.xinfu_yanyu2++; - if(!event.logged){ - player.logSkill('xinfu_yanyu'); + if (!event.logged) { + player.logSkill("xinfu_yanyu"); player.addExpose(0.25); - event.logged=true; + event.logged = true; } - event.togain=result.links[0]; + event.togain = result.links[0]; event.cards.remove(event.togain); - player.chooseTarget(true,'请选择要获得'+get.translation(event.togain)+'的角色').set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - var card=_status.event.card; - var val=get.value(card); - if(player.storage.xinfu_yanyu2<3&&target==_status.currentPhase&&target.hasValueTarget(card,null,true)) att=att*5; - else if(target==player&&!player.hasJudge('lebu')&&get.type(card)=='trick') att=att*3; - if(target.hasSkillTag('nogain')) att/=10; - return att*val; - }).set('card',event.togain); - } - else event.finish(); - 'step 3' - var target=result.targets[0]; - player.line(target,'green'); - target.gain(event.togain,'gain2'); - if(event.cards.length) event.goto(1); + player + .chooseTarget(true, "请选择要获得" + get.translation(event.togain) + "的角色") + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var card = _status.event.card; + var val = get.value(card); + if ( + player.storage.xinfu_yanyu2 < 3 && + target == _status.currentPhase && + target.hasValueTarget(card, null, true) + ) + att = att * 5; + else if ( + target == player && + !player.hasJudge("lebu") && + get.type(card) == "trick" + ) + att = att * 3; + if (target.hasSkillTag("nogain")) att /= 10; + return att * val; + }) + .set("card", event.togain); + } else event.finish(); + ("step 3"); + var target = result.targets[0]; + player.line(target, "green"); + target.gain(event.togain, "gain2"); + if (event.cards.length) event.goto(1); }, }, - "xinfu_xiaode":{ - subSkill:{ - remove:{ - unique:true, - charlotte:true, - trigger:{ - player:"phaseAfter", + xinfu_xiaode: { + subSkill: { + remove: { + unique: true, + charlotte: true, + trigger: { + player: "phaseAfter", }, - forced:true, - popup:false, - content:function(){ - player.removeAdditionalSkill('xinfu_xiaode'); - player.removeSkill('xinfu_xiaode_remove'); + forced: true, + popup: false, + content: function () { + player.removeAdditionalSkill("xinfu_xiaode"); + player.removeSkill("xinfu_xiaode_remove"); }, }, }, - trigger:{ - global:"dieAfter", + trigger: { + global: "dieAfter", }, - direct:true, - filter:function (skill,event){ - return !event.hasSkill('xinfu_xiaode_remove'); + direct: true, + filter: function (skill, event) { + return !event.hasSkill("xinfu_xiaode_remove"); }, - content:function (){ - 'step 0' - var list=[]; - var listm=[]; - var listv=[]; - if(trigger.player.name1!=undefined) listm=lib.character[trigger.player.name1][3]; - else listm=lib.character[trigger.player.name][3]; - if(trigger.player.name2!=undefined) listv=lib.character[trigger.player.name2][3]; - listm=listm.concat(listv); - var func=function(skill){ - var info=get.info(skill); - if(info.charlotte||info.zhuSkill||(info.unique&&!info.limited)||info.juexingji||info.dutySkill||info.hiddenSkill) return false; + content: function () { + "step 0"; + var list = []; + var listm = []; + var listv = []; + if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3]; + else listm = lib.character[trigger.player.name][3]; + if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3]; + listm = listm.concat(listv); + var func = function (skill) { + var info = get.info(skill); + if ( + info.charlotte || + info.zhuSkill || + (info.unique && !info.limited) || + info.juexingji || + info.dutySkill || + info.hiddenSkill + ) + return false; return true; }; - for(var i=0;i0; + filter: function (event, player) { + var hs = player.getCards("h"); + return ( + event.type != "xinmanjuan" && + event.getg(player).filter(function (card) { + return hs.includes(card); + }).length > 0 + ); }, - content:function(){ - "step 0" - var hs=player.getCards('h'),cards=trigger.getg(player).filter(function(card){ - return hs.includes(card); - }); - event.cards=cards; - event.rawCards=cards.slice(0); + content: function () { + "step 0"; + var hs = player.getCards("h"), + cards = trigger.getg(player).filter(function (card) { + return hs.includes(card); + }); + event.cards = cards; + event.rawCards = cards.slice(0); player.loseToDiscardpile(cards); - if(_status.currentPhase!=player) event.finish(); - "step 1" - event.card=event.cards.shift(); - event.togain=[]; - var number=get.number(event.card); - for(var i=0;imaxval){ - maxval=tempval; + if (cards.length) { + var maxval = 0; + for (var i = 0; i < cards.length; i++) { + var tempval = get.value(cards[i]); + if (tempval > maxval) { + maxval = tempval; } } - maxval+=cards.length-1; - var next=player.chooseToDiscard('he',{suit:suits}); - next.set('ai',function(card){ - return _status.event.maxval-get.value(card); + maxval += cards.length - 1; + var next = player.chooseToDiscard("he", { suit: suits }); + next.set("ai", function (card) { + return _status.event.maxval - get.value(card); }); - next.set('maxval',maxval); - next.set('dialog',[get.prompt(event.name),'hidden',cards]) - next.logSkill=event.name; - event.cards=cards; + next.set("maxval", maxval); + next.set("dialog", [get.prompt(event.name), "hidden", cards]); + next.logSkill = event.name; + event.cards = cards; } - "step 2" - if(result.bool){ - player.gain(event.cards,'gain2','log'); + ("step 2"); + if (result.bool) { + player.gain(event.cards, "gain2", "log"); } }, - ai:{ - threaten:1.3 - } + ai: { + threaten: 1.3, + }, }, - zuixiang:{ - skillAnimation:true, - animationColor:'gray', - audio:true, - unique:true, - limited:true, - trigger:{player:'phaseZhunbeiBegin'}, - content:function(){ - 'step 0' - player.awakenSkill('zuixiang'); - event.cards=player.showCards(get.cards(3)).cards; - player.addToExpansion(event.cards,'gain2').gaintag.add('zuixiang2'); - 'step 1' - if(lib.skill.zuixiang.filterSame(cards)){ - player.gain(cards,'gain2').type='xinmanjuan'; - } - else{ - trigger._zuixiang=true; - player.addSkill('zuixiang2'); + zuixiang: { + skillAnimation: true, + animationColor: "gray", + audio: true, + unique: true, + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + content: function () { + "step 0"; + player.awakenSkill("zuixiang"); + event.cards = player.showCards(get.cards(3)).cards; + player.addToExpansion(event.cards, "gain2").gaintag.add("zuixiang2"); + ("step 1"); + if (lib.skill.zuixiang.filterSame(cards)) { + player.gain(cards, "gain2").type = "xinmanjuan"; + } else { + trigger._zuixiang = true; + player.addSkill("zuixiang2"); } }, - filterSame:function(c){ - for(var i=0;i0; + position: "he", + filter: function (event, player) { + return player.countCards("he", { suit: "diamond" }) > 0; }, - discard:false, - lose:false, - delay:false, - prepare:'give', - content:function(){ - 'step 0' - game.addGlobalSkill('yanxiao_global'); - target.addJudge({name:'yanxiao_card'},cards); - 'step 1' + discard: false, + lose: false, + delay: false, + prepare: "give", + content: function () { + "step 0"; + game.addGlobalSkill("yanxiao_global"); + target.addJudge({ name: "yanxiao_card" }, cards); + ("step 1"); game.delay(); }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(target.countCards('j',function(card){ - return get.effect(target,{ - name:card.viewAs||card.name, - cards:[card], - },target,target)<0; - })) return 1; + ai: { + order: 8, + result: { + target: function (player, target) { + if ( + target.countCards("j", function (card) { + return ( + get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + target, + target + ) < 0 + ); + }) + ) + return 1; return 0; - } - } - } - }, - yanxiao_global:{ - trigger:{player:'phaseJudgeBegin'}, - forced:true, - filter:function(event,player){ - return player.countCards('j')>0&&player.hasJudge('yanxiao_card'); - }, - content:function(){ - player.gain(player.getCards('j'),'gain2'); - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.type(card)=='delay'&&target.hasJudge('yanxiao_card')) return [0,0,0,0.1]; - } - } - } - }, - anxian:{ - audio:2, - group:['anxian_source','anxian_target'], - subSkill:{ - source:{ - audio:"anxian", - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'; }, - check:function(event,player){ - if(get.damageEffect(event.player,player,player)<=0) return true; + }, + }, + }, + yanxiao_global: { + trigger: { player: "phaseJudgeBegin" }, + forced: true, + filter: function (event, player) { + return player.countCards("j") > 0 && player.hasJudge("yanxiao_card"); + }, + content: function () { + player.gain(player.getCards("j"), "gain2"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.type(card) == "delay" && target.hasJudge("yanxiao_card")) + return [0, 0, 0, 0.1]; + }, + }, + }, + }, + anxian: { + audio: 2, + group: ["anxian_source", "anxian_target"], + subSkill: { + source: { + audio: "anxian", + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + check: function (event, player) { + if (get.damageEffect(event.player, player, player) <= 0) return true; return false; }, - content:function(){ - 'step 0' - if(trigger.player.countCards('h')){ + content: function () { + "step 0"; + if (trigger.player.countCards("h")) { trigger.player.chooseToDiscard(true); } - 'step 1' + ("step 1"); player.draw(); trigger.cancel(); - } - }, - target:{ - audio:"anxian", - trigger:{target:'useCardToTargeted'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.countCards('h'); }, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt2('anxian')); - next.set('ai',function(card){ - var player=_status.event.player; - var trigger=_status.event.getTrigger(); - if(get.attitude(player,trigger.player)>0){ - return 9-get.value(card); + }, + target: { + audio: "anxian", + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countCards("h"); + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt2("anxian")); + next.set("ai", function (card) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (get.attitude(player, trigger.player) > 0) { + return 9 - get.value(card); } - if(player.countCards('h',{name:'shan'})) return -1; - return 7-get.value(card); + if (player.countCards("h", { name: "shan" })) return -1; + return 7 - get.value(card); }); - next.logSkill='anxian'; - "step 1" - if(result.bool){ + next.logSkill = "anxian"; + ("step 1"); + if (result.bool) { trigger.player.draw(); trigger.getParent().excluded.push(player); } }, - } - } - }, - junwei:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.getExpansions('yinling').length>=3; + }, }, - content:function(){ - 'step 0' - var cards=player.getExpansions('yinling'); - if(cards.length>3){ - player.chooseButton(3,[get.prompt('junwei'),'hidden',cards]).set('ai',function(button){ - return 1; - }); - } - else{ - player.chooseBool().set('createDialog',[get.prompt('junwei'),'hidden',cards]).set('dialogselectx',true).set('choice',true); - event.cards=cards.slice(0); - } - 'step 1' - if(result.bool){ - player.logSkill('junwei'); - var cards=event.cards||result.links; - player.loseToDiscardpile(cards); - player.chooseTarget(true,function(card,player,target){ - return player!=target; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)/Math.sqrt(1+target.hp); - }); - } - else{ - event.finish(); - } - 'step 2' - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(result.targets); - event.target=target; - var nshan=target.countCards('h',function(card){ - if(_status.connectMode) return true; - return card.name=='shan'; - }); - if(nshan==0){ - event.directfalse=true; - } - else{ - target.chooseCard('交给'+get.translation(player)+'一张【闪】,或失去1点体力',function(card){ - return card.name=='shan'; - }).set('ai',function(card){ - if(_status.event.nshan>1) return 1; - if(_status.event.player.hp>=3) return 0; + }, + junwei: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("yinling").length >= 3; + }, + content: function () { + "step 0"; + var cards = player.getExpansions("yinling"); + if (cards.length > 3) { + player + .chooseButton(3, [get.prompt("junwei"), "hidden", cards]) + .set("ai", function (button) { return 1; - }).set('nshan',nshan); - } + }); + } else { + player + .chooseBool() + .set("createDialog", [get.prompt("junwei"), "hidden", cards]) + .set("dialogselectx", true) + .set("choice", true); + event.cards = cards.slice(0); } - else{ + ("step 1"); + if (result.bool) { + player.logSkill("junwei"); + var cards = event.cards || result.links; + player.loseToDiscardpile(cards); + player + .chooseTarget(true, function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) / Math.sqrt(1 + target.hp); + }); + } else { event.finish(); } - 'step 3' - if(!event.directfalse&&result.bool) game.delay(); - ui.clear(); - 'step 4' - if(!event.directfalse&&result.bool){ - event.cards=result.cards; - event.target.$throw(result.cards); - player.chooseTarget('将'+get.translation(event.cards)+'交给一名角色',true,function(card,player,target){ - return target!=_status.event.getParent().target; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target)/(target.countCards('h','shan')+1); + ("step 2"); + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(result.targets); + event.target = target; + var nshan = target.countCards("h", function (card) { + if (_status.connectMode) return true; + return card.name == "shan"; }); + if (nshan == 0) { + event.directfalse = true; + } else { + target + .chooseCard( + "交给" + get.translation(player) + "一张【闪】,或失去1点体力", + function (card) { + return card.name == "shan"; + } + ) + .set("ai", function (card) { + if (_status.event.nshan > 1) return 1; + if (_status.event.player.hp >= 3) return 0; + return 1; + }) + .set("nshan", nshan); + } + } else { + event.finish(); } - else{ + ("step 3"); + if (!event.directfalse && result.bool) game.delay(); + ui.clear(); + ("step 4"); + if (!event.directfalse && result.bool) { + event.cards = result.cards; + event.target.$throw(result.cards); + player + .chooseTarget( + "将" + get.translation(event.cards) + "交给一名角色", + true, + function (card, player, target) { + return target != _status.event.getParent().target; + } + ) + .set("ai", function (target) { + return ( + get.attitude(_status.event.player, target) / + (target.countCards("h", "shan") + 1) + ); + }); + } else { event.target.loseHp(); delete event.cards; } - 'step 5' - if(event.cards){ - player.line(result.targets,'green'); - result.targets[0].gain(event.cards,'gain2').giver=player; - game.log(player,'将',event.cards,'交给',result.targets[0]); + ("step 5"); + if (event.cards) { + player.line(result.targets, "green"); + result.targets[0].gain(event.cards, "gain2").giver = player; + game.log(player, "将", event.cards, "交给", result.targets[0]); event.finish(); - } - else{ - if(event.target.countCards('e')){ - player.choosePlayerCard('e','将'+get.translation(event.target)+'的一张装备牌移出游戏',true,event.target); - } - else{ + } else { + if (event.target.countCards("e")) { + player.choosePlayerCard( + "e", + "将" + get.translation(event.target) + "的一张装备牌移出游戏", + true, + event.target + ); + } else { event.finish(); } } - 'step 6' - if(result.bool){ - var card=result.links[0]; - target.addToExpansion(card,target,'give').gaintag.add('junwei2'); - target.addSkill('junwei2'); + ("step 6"); + if (result.bool) { + var card = result.links[0]; + target.addToExpansion(card, target, "give").gaintag.add("junwei2"); + target.addSkill("junwei2"); } }, - ai:{ - combo:'yinling' - } + ai: { + combo: "yinling", + }, }, - junwei2:{ - mark:true, - intro:{ - content:'expansion', - markcount:'expansion', + junwei2: { + mark: true, + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - charlotte:true, - content:function(){ - 'step 0' - var cards=player.getExpansions('junwei2').filter(function(card){ - return player.canEquip(card,true); + trigger: { player: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + content: function () { + "step 0"; + var cards = player.getExpansions("junwei2").filter(function (card) { + return player.canEquip(card, true); }); - if(cards.length){ - player.$give(cards[0],player,false); + if (cards.length) { + player.$give(cards[0], player, false); game.delay(0.5); player.equip(cards[0]); event.redo(); } - 'step 1' - player.removeSkill('junwei2'); - } + ("step 1"); + player.removeSkill("junwei2"); + }, }, - yinling:{ - enable:'phaseUse', - filterCard:{color:'black'}, - position:'he', - marktext:'锦', - intro:{ - content:'expansion', - markcount:'expansion' + yinling: { + enable: "phaseUse", + filterCard: { color: "black" }, + position: "he", + marktext: "锦", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - filter:function(event,player){ - return player.countCards('he',{color:'black'})>0&&player.getExpansions('yinling').length<4; + filter: function (event, player) { + return ( + player.countCards("he", { color: "black" }) > 0 && + player.getExpansions("yinling").length < 4 + ); }, - filterTarget:function(card,player,target){ - return target.countCards('he')>0&&target!=player; + filterTarget: function (card, player, target) { + return target.countCards("he") > 0 && target != player; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - content:function(){ - 'step 0' - player.choosePlayerCard('hej',target,true); - 'step 1' - if(result.bool&&result.links&&result.links.length){ - player.addToExpansion(result.links,target,'give').gaintag.add('yinling'); + content: function () { + "step 0"; + player.choosePlayerCard("hej", target, true); + ("step 1"); + if (result.bool && result.links && result.links.length) { + player.addToExpansion(result.links, target, "give").gaintag.add("yinling"); } }, - ai:{ - order:10.1, - expose:0.1, - result:{ - target:function(player,target){ - if(target.hasSkill('tuntian')) return 0; - var es=target.getCards('e'); - var nh=target.countCards('h'); - var noe=(es.length==0||target.hasSkillTag('noe')); - var noe2=(es.length==1&&es[0].name=='baiyin'&&target.hp=0){ + ai: { + order: 10.1, + expose: 0.1, + result: { + target: function (player, target) { + if (target.hasSkill("tuntian")) return 0; + var es = target.getCards("e"); + var nh = target.countCards("h"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = es.length == 1 && es[0].name == "baiyin" && target.hp < target.maxHp; + var noh = nh == 0 || target.hasSkillTag("noh"); + if (noh && noe) return 0; + if (noh && noe2) return 0.01; + if (get.attitude(player, target) <= 0) + return target.countCards("he") ? -1.5 : 1.5; + var js = target.getCards("j"); + if (js.length) { + var jj = js[0].viewAs ? { name: js[0].viewAs } : js[0]; + if (jj.name == "guohe") return 3; + if (js.length == 1 && get.effect(target, jj, target, player) >= 0) { return -1.5; } return 2; @@ -6309,1026 +7818,1167 @@ game.import('character', function () { return -1.5; }, }, - } - }, - fenyong:{ - audio:2, - trigger:{player:'damageEnd'}, - content:function(){ - player.addTempSkill('fenyong2'); - } - }, - fenyong2:{ - audio:'fenyong', - mark:true, - intro:{ - content:'防止你受到的所有伤害' }, - trigger:{player:'damageBegin3'}, - forced:true, - content:function(){ + }, + fenyong: { + audio: 2, + trigger: { player: "damageEnd" }, + content: function () { + player.addTempSkill("fenyong2"); + }, + }, + fenyong2: { + audio: "fenyong", + mark: true, + intro: { + content: "防止你受到的所有伤害", + }, + trigger: { player: "damageBegin3" }, + forced: true, + content: function () { trigger.cancel(); }, - ai:{ - maixie:true, - maixie_hp:true, - nofire:true, - nothunder:true, - nodamage:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')) return [0,0]; - } + ai: { + maixie: true, + maixie_hp: true, + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return [0, 0]; + }, }, - } - }, - xuehen:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.hasSkill('fenyong2')&&event.player.isIn(); }, - content:function(){ - 'step 0' - player.removeSkill('fenyong2'); - player.chooseControl('弃牌','出杀',function(){ - var player=_status.event.player; - var trigger=_status.event.getTrigger(); - if(get.attitude(player,trigger.player)<0){ - var he=trigger.player.countCards('he'); - if(he<2) return '出杀'; - if(player.maxHp-player.hp>=2&&he<=3){ - return '弃牌'; + }, + xuehen: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.hasSkill("fenyong2") && event.player.isIn(); + }, + content: function () { + "step 0"; + player.removeSkill("fenyong2"); + player + .chooseControl("弃牌", "出杀", function () { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (get.attitude(player, trigger.player) < 0) { + var he = trigger.player.countCards("he"); + if (he < 2) return "出杀"; + if (player.maxHp - player.hp >= 2 && he <= 3) { + return "弃牌"; + } + if (player.maxHp - player.hp >= 3 && he <= 5) { + return "弃牌"; + } + if (player.maxHp - player.hp > 3) { + return "弃牌"; + } + return "出杀"; } - if(player.maxHp-player.hp>=3&&he<=5){ - return '弃牌'; - } - if(player.maxHp-player.hp>3){ - return '弃牌'; - } - return '出杀'; + return "出杀"; + }) + .set( + "prompt", + "弃置" + + get.translation(trigger.player) + + get.cnNumber(player.maxHp - player.hp) + + "张牌,或对任意一名角色使用一张杀" + ); + ("step 1"); + if (result.control == "弃牌") { + player.line(trigger.player, "green"); + if (player.hp < player.maxHp && trigger.player.countCards("he")) { + player.discardPlayerCard(trigger.player, true, "he", player.maxHp - player.hp); } - return '出杀'; - }).set('prompt','弃置'+get.translation(trigger.player)+get.cnNumber(player.maxHp-player.hp)+'张牌,或对任意一名角色使用一张杀'); - 'step 1' - if(result.control=='弃牌'){ - player.line(trigger.player,'green'); - if(player.hp2; + filter: function (event, player) { + return ( + player._mouduan_mark && + player._mouduan_mark.name == "文" && + player.countCards("h") > 2 + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard('he','谋断:是否弃置一张牌将标记变为“武”?').ai=function(){ + direct: true, + content: function () { + "step 0"; + player.chooseToDiscard("he", "谋断:是否弃置一张牌将标记变为“武”?").ai = function () { return -1; + }; + ("step 1"); + if (result.bool && player.countCards("h") > 2) { + game.broadcastAll(function (player) { + if (!player._mouduan_mark) return; + player._mouduan_mark.name = "武"; + player._mouduan_mark.skill = "武"; + player._mouduan_mark.firstChild.innerHTML = "武"; + player._mouduan_mark.info.content = "拥有技能【激昂】、【谦逊】"; + }, player); + player.addAdditionalSkills("mouduan", ["jiang", "qianxun"]); } - 'step 1' - if(result.bool&&player.countCards('h')>2){ - game.broadcastAll(function(player){ - if(!player._mouduan_mark) return; - player._mouduan_mark.name='武'; - player._mouduan_mark.skill='武'; - player._mouduan_mark.firstChild.innerHTML='武'; - player._mouduan_mark.info.content='拥有技能【激昂】、【谦逊】'; - },player); - player.addAdditionalSkills('mouduan',['jiang','qianxun']); - } - } + }, }, - tanhu:{ - audio:1, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + tanhu: { + audio: 1, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - target.addTempSkill('tanhu2'); + ("step 1"); + if (result.bool) { + target.addTempSkill("tanhu2"); } }, - ai:{ - result:{ - target:function(player,target){ - var hs=player.getCards('h'); - if(hs.length<3) return 0; - var bool=false; - for(var i=0;i=9&&get.value(hs[i])<7){ - bool=true; + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + var bool = false; + for (var i = 0; i < hs.length; i++) { + if (hs[i].number >= 9 && get.value(hs[i]) < 7) { + bool = true; break; } } - if(!bool) return 0; + if (!bool) return 0; return -1; - } + }, }, - order:9, + order: 9, }, - group:'tanhu3' + group: "tanhu3", }, - tanhu2:{ - mark:true, - intro:{ - content:'已成为探虎目标' - } + tanhu2: { + mark: true, + intro: { + content: "已成为探虎目标", + }, }, - tanhu3:{ - mod:{ - globalFrom:function(from,to){ - if(to.hasSkill('tanhu2')) return -Infinity; + tanhu3: { + mod: { + globalFrom: function (from, to) { + if (to.hasSkill("tanhu2")) return -Infinity; + }, + wuxieRespondable: function (card, player, target) { + if (target && target.hasSkill("tanhu2")) return false; }, - wuxieRespondable:function(card,player,target){ - if(target&&target.hasSkill('tanhu2')) return false; - } - } - }, - jie:{ - audio:1, - trigger:{source:'damageBegin1'}, - filter:function(event){ - return event.card&&event.card.name=='sha'&&get.color(event.card)=='red'&&event.notLink(); }, - forced:true, - content:function(){ + }, + jie: { + audio: 1, + trigger: { source: "damageBegin1" }, + filter: function (event) { + return ( + event.card && + event.card.name == "sha" && + get.color(event.card) == "red" && + event.notLink() + ); + }, + forced: true, + content: function () { trigger.num++; - } + }, }, - dahe:{ - audio:true, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + dahe: { + audio: true, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' - player.chooseToCompare(target).set('preserve','win'); - 'step 1' - if(result.bool&&result.target){ - event.type=true; - event.card=result.target; - player.chooseTarget('将'+get.translation(result.target)+'交给一名角色',function(card,player,target){ - return target.hp<=player.hp; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.du) return -att; - return att; - }).set('du',event.card.name=='du'); - target.addTempSkill('dahe2'); - } - else{ - event.type=false; - if(player.countCards('h')){ + content: function () { + "step 0"; + player.chooseToCompare(target).set("preserve", "win"); + ("step 1"); + if (result.bool && result.target) { + event.type = true; + event.card = result.target; + player + .chooseTarget( + "将" + get.translation(result.target) + "交给一名角色", + function (card, player, target) { + return target.hp <= player.hp; + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.du) return -att; + return att; + }) + .set("du", event.card.name == "du"); + target.addTempSkill("dahe2"); + } else { + event.type = false; + if (player.countCards("h")) { player.showHandcards(); - player.chooseToDiscard('h',true); + player.chooseToDiscard("h", true); } } - 'step 2' - if(event.type){ - if(result.bool){ - player.line(result.targets,'green'); - result.targets[0].gain(event.card,'gain2'); + ("step 2"); + if (event.type) { + if (result.bool) { + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "gain2"); } } }, - ai:{ - result:{ - target:function(player,target){ - var hs=player.getCards('h'); - if(hs.length<3) return 0; - var bool=false; - for(var i=0;i=9&&get.value(hs[i])<7){ - bool=true; + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + var bool = false; + for (var i = 0; i < hs.length; i++) { + if (hs[i].number >= 9 && get.value(hs[i]) < 7) { + bool = true; break; } } - if(!bool) return 0; - if(player.canUse('sha',target)&&(player.countCards('h','sha'))){ + if (!bool) return 0; + if (player.canUse("sha", target) && player.countCards("h", "sha")) { return -2; } return -0.5; - } + }, }, - order:9, - } - }, - dahe2:{ - mark:true, - intro:{ - content:'非红桃闪无效' + order: 9, }, - mod:{ - cardRespondable:function(card,player){ - if(card.name=='shan'){ - const suit=get.suit(card); - if(suit!='heart'&&suit!='unsure') return false; - } - }, - cardEnabled:function(card,player){ - if(card.name=='shan'){ - const suit=get.suit(card); - if(suit!='heart'&&suit!='unsure') return false; - } - }, - } }, - shichou:{ + dahe2: { + mark: true, + intro: { + content: "非红桃闪无效", + }, + mod: { + cardRespondable: function (card, player) { + if (card.name == "shan") { + const suit = get.suit(card); + if (suit != "heart" && suit != "unsure") return false; + } + }, + cardEnabled: function (card, player) { + if (card.name == "shan") { + const suit = get.suit(card); + if (suit != "heart" && suit != "unsure") return false; + } + }, + }, + }, + shichou: { //audio:1, - skillAnimation:true, - animationColor:'orange', - unique:true, - limited:true, - mark:false, - trigger:{player:'phaseZhunbeiBegin'}, - zhuSkill:true, - direct:true, - filter:function(event,player){ - if(!player.hasZhuSkill('shichou'))return false; - if(player.countCards('he')<2) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'; + skillAnimation: true, + animationColor: "orange", + unique: true, + limited: true, + mark: false, + trigger: { player: "phaseZhunbeiBegin" }, + zhuSkill: true, + direct: true, + filter: function (event, player) { + if (!player.hasZhuSkill("shichou")) return false; + if (player.countCards("he") < 2) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "shu"; }); }, - init:function(player){ - if(player.hasZhuSkill('shichou')){ - player.markSkill('shichou'); - player.storage.shichou=false; + init: function (player) { + if (player.hasZhuSkill("shichou")) { + player.markSkill("shichou"); + player.storage.shichou = false; } }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt2('shichou'), - selectCard:2, - filterTarget:function(card,player,target){ - return target.group=='shu'&&target!=player; + prompt: get.prompt2("shichou"), + selectCard: 2, + filterTarget: function (card, player, target) { + return target.group == "shu" && target != player; }, - filterCard:true, - position:'he', - ai1:function(card){ - return 7-get.value(card); + filterCard: true, + position: "he", + ai1: function (card) { + return 7 - get.value(card); }, - ai2:function(target){ - var player=_status.event.player; - if(player.hasUnknown()) return 0; - var att=get.attitude(player,target); - if(att<=0){ - if(target.hp==1) return (10-att)/2; - return 10-att; - } - else{ - if(target.hp==1) return 0; - return (10-att)/4; + ai2: function (target) { + var player = _status.event.player; + if (player.hasUnknown()) return 0; + var att = get.attitude(player, target); + if (att <= 0) { + if (target.hp == 1) return (10 - att) / 2; + return 10 - att; + } else { + if (target.hp == 1) return 0; + return (10 - att) / 4; } }, }); - "step 1" - if(!result.bool) return; - var target=result.targets[0]; - var cards=result.cards; - player.storage.shichou=true; - player.logSkill('shichou',target); - player.awakenSkill('shichou'); - player.give(cards,target); - player.storage.shichou_target=target; - player.addSkill('shichou2'); - target.markSkillCharacter('shichou',player,'誓仇','代替'+get.translation(player)+'承受伤害直到首次进入濒死状态'); + ("step 1"); + if (!result.bool) return; + var target = result.targets[0]; + var cards = result.cards; + player.storage.shichou = true; + player.logSkill("shichou", target); + player.awakenSkill("shichou"); + player.give(cards, target); + player.storage.shichou_target = target; + player.addSkill("shichou2"); + target.markSkillCharacter( + "shichou", + player, + "誓仇", + "代替" + get.translation(player) + "承受伤害直到首次进入濒死状态" + ); }, - intro:{ - content:'limited' + intro: { + content: "limited", }, }, - shichou2:{ - group:'shichou3', - trigger:{player:'damageBegin3'}, - forced:true, - popup:false, - content:function(){ - trigger.player=player.storage.shichou_target; - trigger.shichou4=true; - trigger.player.addSkill('shichou4'); - player.logSkill('shichou2',player.storage.shichou_target); + shichou2: { + group: "shichou3", + trigger: { player: "damageBegin3" }, + forced: true, + popup: false, + content: function () { + trigger.player = player.storage.shichou_target; + trigger.shichou4 = true; + trigger.player.addSkill("shichou4"); + player.logSkill("shichou2", player.storage.shichou_target); game.delay(0.5); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(get.attitude(player,target)>0) return [0,0]; - var eff=get.damageEffect(target.storage.shichou_target,player,target); - if(eff>0){ - return [0,1]; - } - else if(eff<0){ - return [0,-2]; - } - else{ - return [0,0]; + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (get.attitude(player, target) > 0) return [0, 0]; + var eff = get.damageEffect(target.storage.shichou_target, player, target); + if (eff > 0) { + return [0, 1]; + } else if (eff < 0) { + return [0, -2]; + } else { + return [0, 0]; } } - } - } - } - }, - shichou3:{ - trigger:{global:['dying','dieBegin']}, - forced:true, - popup:false, - //priority:10, - filter:function(event,player){ - return event.player==player.storage.shichou_target; + }, + }, }, - content:function(){ - trigger.player.unmarkSkill('shichou'); - delete player.storage.shichou_target; - player.removeSkill('shichou2'); - } }, - shichou4:{ - trigger:{player:['damageAfter','damageCancelled']}, - forced:true, - popup:false, - audio:false, - content:function(){ - if(!trigger.shichou4) return; - if(event.triggername=='damageAfter'&&trigger.num){ + shichou3: { + trigger: { global: ["dying", "dieBegin"] }, + forced: true, + popup: false, + //priority:10, + filter: function (event, player) { + return event.player == player.storage.shichou_target; + }, + content: function () { + trigger.player.unmarkSkill("shichou"); + delete player.storage.shichou_target; + player.removeSkill("shichou2"); + }, + }, + shichou4: { + trigger: { player: ["damageAfter", "damageCancelled"] }, + forced: true, + popup: false, + audio: false, + content: function () { + if (!trigger.shichou4) return; + if (event.triggername == "damageAfter" && trigger.num) { player.draw(trigger.num); } - player.removeSkill('shichou4'); - } + player.removeSkill("shichou4"); + }, }, - zhaolie:{ - trigger:{player:'phaseDrawBegin2'}, - direct:true, - filter:function(event,player){ + zhaolie: { + trigger: { player: "phaseDrawBegin2" }, + direct: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('zhaolie'),function(card,player,target){ - return target!=player&&player.inRange(target); - }).set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>0) return 0; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("zhaolie"), function (card, player, target) { + return target != player && player.inRange(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) return 0; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { trigger.num--; - player.storage.zhaolie=result.targets[0]; - player.logSkill('zhaolie',result.targets); - player.addTempSkill('zhaolie2','phaseDrawAfter'); + player.storage.zhaolie = result.targets[0]; + player.logSkill("zhaolie", result.targets); + player.addTempSkill("zhaolie2", "phaseDrawAfter"); } - } + }, }, - zhaolie2:{ - trigger:{player:'phaseDrawEnd'}, - forced:true, - popup:false, - content:function(){ - 'step 0' - event.cards=get.cards(3); + zhaolie2: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + popup: false, + content: function () { + "step 0"; + event.cards = get.cards(3); player.showCards(event.cards); - 'step 1' - event.basic=[]; - event.nonbasic=[]; - event.todis=[]; - for(var i=0;i 1 ? 0 : 7 - get.value(card); + case 2: + return 8 - get.value(card); + case 3: + return 10 - get.value(card); + default: + return 0; + } + }) + .set("num", num); } - else{ - player.storage.zhaolie.chooseToDiscard(num,'he','弃置'+get.cnNumber(num)+ - '张牌并令'+get.translation(player)+'拿牌,或受到'+get.cnNumber(num)+'点伤害并拿牌').set('ai',function(card){ - var player=_status.event.player; - switch(_status.event.num){ - case 1:return player.hp>1?0:7-get.value(card); - case 2:return 8-get.value(card); - case 3:return 10-get.value(card); - default:return 0; - } - }).set('num',num); - } - 'step 2' - var num=event.nonbasic.length; - var undone=false; - if(num==0){ - if(event.basic.length){ - result.targets[0].gain(event.basic,'gain2','log'); + ("step 2"); + var num = event.nonbasic.length; + var undone = false; + if (num == 0) { + if (event.basic.length) { + result.targets[0].gain(event.basic, "gain2", "log"); } - } - else{ - if(result.bool){ - if(event.basic.length){ - player.gain(event.basic,'gain2','log'); + } else { + if (result.bool) { + if (event.basic.length) { + player.gain(event.basic, "gain2", "log"); } - } - else{ + } else { player.storage.zhaolie.damage(num); - if(event.basic.length){ - undone=true; + if (event.basic.length) { + undone = true; } } } - if(!undone){ + if (!undone) { delete player.storage.zhaolie; event.finish(); } - 'step 3' - if(player.storage.zhaolie.isIn()){ - player.storage.zhaolie.gain(event.basic,'gain2','log'); - } - else{ + ("step 3"); + if (player.storage.zhaolie.isIn()) { + player.storage.zhaolie.gain(event.basic, "gain2", "log"); + } else { game.cardsDiscard(event.basic); } delete player.storage.zhaolie; - } + }, }, - fulu:{ - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; + fulu: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; }, - audio:true, - check:function(event,player){ - var eff=0; - for(var i=0;i=0; + return eff >= 0; }, - content:function(){ - game.setNature(trigger.card,'thunder'); - if(get.itemtype(trigger.card)=='card'){ - var next=game.createEvent('fulu_clear'); - next.card=trigger.card; + content: function () { + game.setNature(trigger.card, "thunder"); + if (get.itemtype(trigger.card) == "card") { + var next = game.createEvent("fulu_clear"); + next.card = trigger.card; event.next.remove(next); trigger.after.push(next); - next.setContent(function(){ - game.setNature(card,[]); + next.setContent(function () { + game.setNature(card, []); }); } - } + }, }, - fuji:{ - trigger:{global:'damageBegin1'}, - filter:function(event){ - return event.source&&event.source.isIn()&&event.hasNature('thunder'); + fuji: { + trigger: { global: "damageBegin1" }, + filter: function (event) { + return event.source && event.source.isIn() && event.hasNature("thunder"); }, - check:function(event,player){ - return get.attitude(player,event.source)>0&&get.attitude(player,event.player)<0; + check: function (event, player) { + return get.attitude(player, event.source) > 0 && get.attitude(player, event.player) < 0; }, - prompt:function(event){ - return get.translation(event.source)+'即将对'+get.translation(event.player)+'造成伤害,'+get.prompt('fuji'); + prompt: function (event) { + return ( + get.translation(event.source) + + "即将对" + + get.translation(event.player) + + "造成伤害," + + get.prompt("fuji") + ); }, - logTarget:'source', - content:function(){ - trigger.source.judge().callback=lib.skill.fuji.callback; + logTarget: "source", + content: function () { + trigger.source.judge().callback = lib.skill.fuji.callback; }, - callback:function(){ - var evt=event.getParent(2); - if(event.judgeResult.color=='black'){ + callback: function () { + var evt = event.getParent(2); + if (event.judgeResult.color == "black") { //game.cardsDiscard(card); evt._trigger.num++; - } - else{ - evt._trigger.source.gain(card,'gain2'); + } else { + evt._trigger.source.gain(card, "gain2"); } }, }, }, - characterReplace:{}, - dynamicTranslate:{ - }, - translate:{ - sp_gongsunzan:'SP公孙瓒', - sp_gongsunzan_prefix:'SP', - sp_simazhao:'SP司马昭', - sp_simazhao_prefix:'SP', - sp_wangyuanji:'SP王元姬', - sp_wangyuanji_prefix:'SP', - sp_xinxianying:'SP辛宪英', - sp_xinxianying_prefix:'SP', - sp_liuxie:'SP刘协', - sp_liuxie_prefix:'SP', - spyicong_info:'弃牌阶段结束时,你可以将任意张牌置于你的武将牌上,称为「扈」。每有一张「扈」,其他角色与你计算距离时便+1。', - spyicong:'义从', - sptuji:'突骑', - sptuji_info:'准备开始时,你将所有「扈」置于弃牌堆,然后你本回合内计算与其他角色的距离时-X。若X不大于1,你摸一张牌。(X为以此法进入弃牌堆的「扈」的数量)', - sphuangen:'皇恩', - sphuangen_info:'一名角色使用锦囊牌指定目标时,若此牌的目标数大于1,则你可以令此牌对其中的至多X个目标无效,然后摸一张牌。(X为你的体力值)', - sphantong:'汉统', - sphantong_gain:'汉统', - sphantong_info:'当你的牌因弃牌阶段的游戏规则要求而进入弃牌堆后,你可以将这些牌置于你的武将牌上,称为「诏」。一名角色的回合开始时,你可以弃置一张「诏」并获得〖护驾〗/〖激将〗/〖救援〗/〖血裔〗中的一个技能直至当前回合结束。', - spzhaoxin:'昭心', - spzhaoxin_info:'摸牌阶段结束时,你可以展示所有手牌,然后视为使用一张【杀】。', - splanggu:'狼顾', - splanggu_rewrite:'狼顾', - splanggu_info:'当你受到有来源的伤害后,你可以进行判定(此判定结果生效前,你可以打出一张手牌替换判定牌)。然后你可以观看伤害来源的手牌并弃置其中的任意张与判定结果花色相同的牌。', - spfuluan:'扶乱', - spfuluan_info:'出牌阶段限一次,你可以弃置三张花色相同的牌并选择攻击范围内的一名角色。若如此做,该角色翻面且你不能使用【杀】直到回合结束。', - spshude:'淑德', - spshude_info:'结束阶段开始时,你可以将手牌补至体力上限。', - spmingjian:'明鉴', - spmingjian_info:'一名角色的回合开始时,你可以选择一项:①弃置一张牌,然后其跳过本回合的判定阶段。②将一张手牌置于其武将牌上,然后其本回合内进行判定时不触发「判定结果生效前」的时机,且其回合结束时将此牌置入弃牌堆。', - spyinzhi:'隐智', - spyinzhi_info:'当你受到1点伤害后,你可以亮出牌堆顶的两张牌。若其中有黑桃牌,则你可以进行至多X次「令一名角色获得伤害来源的一张手牌」的步骤。然后获得其余的牌。(X为其中黑桃牌的数量)', - yj_caoang:'用间曹昂', - yj_caoang_prefix:'用间', - yjxuepin:'血拼', - yjxuepin_info:'出牌阶段限一次,你可以选择攻击范围内的一名角色并失去1点体力。你弃置其两张牌。若这两张牌类型相同,你回复1点体力。', - ns_chendao:'用间陈到', - ns_chendao_prefix:'用间', - nsjianglie:'将烈', - nsjianglie_info:'当你使用【杀】指定目标后,你可以令其展示所有手牌,然后弃置其中一种颜色的牌。', - ns_jiaxu:'★贾诩', - ns_jiaxu_prefix:'★', - nsyice:'遗策', - nsyice_info:'锁定技,当你使用/打出/弃置的牌进入弃牌堆后,你将这些牌以任意顺序置于你的武将牌上,称为“策”。若这些“策”中有点数相同的牌,则你获得这两张牌中的所有牌,将这两张牌置于牌堆两端。若场上没有处于濒死状态的角色,则你对一名角色造成1点伤害。', - ns_lijue:'SP李傕', - ns_lijue_prefix:'SP', - ns_zhangji:'SP张济', - ns_zhangji_prefix:'SP', - nsfeixiong:'飞熊', - nsfeixiong_info:'出牌阶段开始时,你可以和一名其他角色拼点。赢的角色对没赢的角色造成1点伤害。', - nscesuan:'策算', - nscesuan_info:'锁定技,当你受到伤害时,你防止此伤害并失去1点体力上限。若你因以此法失去体力上限导致体力值减少,则你摸一张牌。', - nslulve:'掳掠', - nslulve_info:'出牌阶段限一次,你可以弃置X张牌并选择一名装备区内有牌的其他角色,然后对其造成1点伤害(X为其装备区内的牌数)。', - ns_fanchou:'SP樊稠', - ns_fanchou_prefix:'SP', - nsyangwu:'扬武', - nsyangwu_info:'出牌阶段限一次,你可以弃置一张♥手牌并选择一名手牌数大于你的其他角色。你观看其手牌并获得其中的X张牌(X为其与你手牌数之差的一半且向上取整)。', - jsp_liubei:'★刘备', - jsp_liubei_prefix:'★', - jsprende:'仁德', - jsprende_info:'出牌阶段,你可以将至少一张手牌交给其他角色;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。', - ns_caoanmin:'战役篇曹安民', - ns_caoanmin_prefix:'战役篇', - nskuishe:'窥舍', - nskuishe_info:'出牌阶段限一次,你可以选择一名其他角色A的一张牌,并将此牌交给不为A的一名角色。然后A可以对你使用一张【杀】。', - sp_xiahoushi:"SP夏侯氏", - sp_xiahoushi_prefix:'SP', - xinfu_yanyu:"燕语", - xinfu_yanyu_info:"一名角色的出牌阶段开始时,你可以弃置一张牌。若如此做,则该出牌阶段内限三次,当一张与你弃置的牌类别相同的其他牌进入弃牌堆后,你可令任意一名角色获得此牌。", - xinfu_yanyu2:"燕语", - xinfu_xiaode:"孝德", - xinfu_xiaode_info:"其他角色死亡后,你可以声明该角色武将牌上的一个技能(主公技、觉醒技、隐匿技、使命技除外)。若如此做,你获得此技能且不能再发动〖孝德〗直到你的回合结束。", - jsp_zhaoyun:'J.SP赵云', - jsp_zhaoyun_prefix:'J.SP', - chixin:'赤心', - chixin1:'赤心', - chixin2:'赤心', - chixin_info:'你可以将♦牌当作【杀】或【闪】使用或打出。出牌阶段,你对在你攻击范围内且本回合内未成为过你使用的【杀】的目标的角色使用的【杀】没有次数限制。', - suiren:'随仁', - suiren_info:'限定技,准备阶段开始时,你可以失去技能〖义从〗,然后加1点体力上限并回复1点体力,然后令一名角色摸三张牌。', - huangjinleishi:'黄巾雷使', - fulu:'符箓', - fulu_info:'当你声明使用普通【杀】后,你可以将此【杀】改为雷【杀】。', - fuji:'助祭', - fuji_info:'当一名角色造成雷属性伤害时,你可以令其进行判定,若结果为黑色,此伤害+1;若结果为红色,该角色获得判定牌。', - sp_pangtong:'☆SP庞统', - sp_pangtong_prefix:'☆SP', - manjuan:'漫卷', - manjuan_info:'其他角色的牌因弃置而进入弃牌堆后,你可以弃置一张花色与之不同的牌,然后获得此牌。', - xinmanjuan:'漫卷', - xinmanjuan_info:'锁定技,当你不因〖漫卷〗或〖醉乡〗而得到牌时,你将此牌置入弃牌堆。然后若此时处于你的回合内,则你可以从弃牌堆中选择获得一张与此牌点数相同的其他牌。', - zuixiang:'醉乡', - zuixiang2:'醉乡', - zuixiang_info:'限定技。准备阶段开始时,你可以亮出牌堆顶的三张牌并置于你的武将牌上。你不能使用或打出与该些牌同类的牌,所有同类牌对你无效。之后的每个准备阶段,你须重复展示一次,直到这些牌中任意两张点数相同。然后,你获得这些牌。', - sp_daqiao:'☆SP大乔', - sp_daqiao_prefix:'☆SP', - yanxiao:'言笑', - yanxiao_info:'出牌阶段,你可以将一张♦牌置于一名角色的判定区内。判定区内有〖言笑〗牌的角色下个判定阶段开始时,其获得判定区里的所有牌。', - anxian:'安娴', - anxian_info:'当你使用【杀】对目标角色造成伤害时,你可以防止此伤害,令其弃置一张手牌,然后你摸一张牌;当你成为【杀】的目标后,你可以弃置一张手牌,令此【杀】对你无效,然后此【杀】的使用者摸一张牌。', - sp_ganning:'☆SP甘宁', - sp_ganning_prefix:'☆SP', - yinling:'银铃', - yinling_bg:'锦', - yinling_info:'出牌阶段,若你的“锦”小于四张,你可以弃置一张黑色牌并指定一名其他角色。若如此做,你将其的一张牌置于你的武将牌上,称为“锦”。', - junwei:'军威', - junwei2:'军威', - junwei_info:'结束阶段开始时,你可以移去三张“锦”。若如此做,你须指定一名角色并令其选择一项:1.展示一张【闪】,然后你将此【闪】交给一名其他角色。2.该角色失去1点体力,然后你将其装备区内的一张牌移出游戏。该角色的回合结束后,将以此法移出游戏的装备牌移回原处。', - sp_xiahoudun:'☆SP夏侯惇', - sp_xiahoudun_prefix:'☆SP', - fenyong:'愤勇', - fenyong2:'愤勇', - fenyong2_bg:'勇', - fenyong_info:'每当你受到一次伤害后,你可以获得一枚「愤勇」标记;当你拥有「愤勇」标记时,防止你受到的所有伤害。', - xuehen:'雪恨', - xuehen_info:'每个角色的结束阶段开始时,若你有愤勇标记,你弃置之,然后选择一项:1.弃置当前回合角色X张牌(X为你已损失的体力值);2.视为对一名任意角色使用一张【杀】。', - sp_lvmeng:'☆SP吕蒙', - sp_lvmeng_prefix:'☆SP', - tanhu:'探虎', - tanhu2:'探虎', - tanhu3:'探虎', - tanhu_info:'出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得以下效果直到回合结束:你与该角色的距离为1,你对该角色使用的普通锦囊牌不能被【无懈可击】响应。', - mouduan:'谋断', - mouduan_info:'游戏开始时,你获得标记“武”并获得技能〖激昂〗和〖谦逊〗。当你失去手牌后,若手牌数不大于2,你须将你的标记变为“文”,将这两项技能改为〖英姿〗和〖克己〗。一名角色的回合开始前,你可弃一张牌将标记翻回。', - sp_zhangfei:'☆SP张飞', - sp_zhangfei_prefix:'☆SP', - jie:'嫉恶', - jie_info:'锁定技,当你使用红色【杀】造成伤害时,此伤害+1。', - dahe:'大喝', - dahe2:'大喝', - dahe2_bg:'喝', - dahe_info:'出牌阶段限一次,你可以与一名其他角色拼点。若你赢,该角色不能使用或打出不为♥花色的【闪】直到回合结束,且你可将该角色拼点的牌交给场上一名体力不多于你的角色。若你没赢,你须展示手牌并弃置其中的一张。', - sp_liubei:'☆SP刘备', - sp_liubei_prefix:'☆SP', - zhaolie:'昭烈', - zhaolie_info:'摸牌阶段摸牌时,你可以少摸一张牌并指定攻击范围内的一名角色。你亮出牌堆顶的三张牌,将其中的非基本牌和【桃】置于弃牌堆,然后该角色选择一项:1.你对其造成X点伤害,然后其获得这些基本牌;2.其弃置X张牌,然后你获得这些基本牌。(X为其中非基本牌的数量)', - shichou:'誓仇', - shichou2:'誓仇', - shichou_info:'主公技,限定技,准备阶段,你可指定一名蜀势力角色并交给其两张牌。本局游戏中,当你受到伤害时,改为该角色受到等量的伤害并摸等量的牌,直至该角色第一次进入濒死状态。', - longyufei:'龙羽飞', - longyi:'龙裔', - longyi_info:'你可将所有手牌当做任意基本牌使用或打出。若此牌对应的实体牌中:有锦囊牌,你摸一张牌;有装备牌,此牌不可被响应。', - zhenjue:'阵绝', - zhenjue_info:'一名角色的结束阶段开始时,若你没有手牌,则你可以令其选择一项:①弃置一张牌。②令你摸一张牌。', + characterReplace: {}, + dynamicTranslate: {}, + translate: { + sp_gongsunzan: "SP公孙瓒", + sp_gongsunzan_prefix: "SP", + sp_simazhao: "SP司马昭", + sp_simazhao_prefix: "SP", + sp_wangyuanji: "SP王元姬", + sp_wangyuanji_prefix: "SP", + sp_xinxianying: "SP辛宪英", + sp_xinxianying_prefix: "SP", + sp_liuxie: "SP刘协", + sp_liuxie_prefix: "SP", + spyicong_info: + "弃牌阶段结束时,你可以将任意张牌置于你的武将牌上,称为「扈」。每有一张「扈」,其他角色与你计算距离时便+1。", + spyicong: "义从", + sptuji: "突骑", + sptuji_info: + "准备开始时,你将所有「扈」置于弃牌堆,然后你本回合内计算与其他角色的距离时-X。若X不大于1,你摸一张牌。(X为以此法进入弃牌堆的「扈」的数量)", + sphuangen: "皇恩", + sphuangen_info: + "一名角色使用锦囊牌指定目标时,若此牌的目标数大于1,则你可以令此牌对其中的至多X个目标无效,然后摸一张牌。(X为你的体力值)", + sphantong: "汉统", + sphantong_gain: "汉统", + sphantong_info: + "当你的牌因弃牌阶段的游戏规则要求而进入弃牌堆后,你可以将这些牌置于你的武将牌上,称为「诏」。一名角色的回合开始时,你可以弃置一张「诏」并获得〖护驾〗/〖激将〗/〖救援〗/〖血裔〗中的一个技能直至当前回合结束。", + spzhaoxin: "昭心", + spzhaoxin_info: "摸牌阶段结束时,你可以展示所有手牌,然后视为使用一张【杀】。", + splanggu: "狼顾", + splanggu_rewrite: "狼顾", + splanggu_info: + "当你受到有来源的伤害后,你可以进行判定(此判定结果生效前,你可以打出一张手牌替换判定牌)。然后你可以观看伤害来源的手牌并弃置其中的任意张与判定结果花色相同的牌。", + spfuluan: "扶乱", + spfuluan_info: + "出牌阶段限一次,你可以弃置三张花色相同的牌并选择攻击范围内的一名角色。若如此做,该角色翻面且你不能使用【杀】直到回合结束。", + spshude: "淑德", + spshude_info: "结束阶段开始时,你可以将手牌补至体力上限。", + spmingjian: "明鉴", + spmingjian_info: + "一名角色的回合开始时,你可以选择一项:①弃置一张牌,然后其跳过本回合的判定阶段。②将一张手牌置于其武将牌上,然后其本回合内进行判定时不触发「判定结果生效前」的时机,且其回合结束时将此牌置入弃牌堆。", + spyinzhi: "隐智", + spyinzhi_info: + "当你受到1点伤害后,你可以亮出牌堆顶的两张牌。若其中有黑桃牌,则你可以进行至多X次「令一名角色获得伤害来源的一张手牌」的步骤。然后获得其余的牌。(X为其中黑桃牌的数量)", + yj_caoang: "用间曹昂", + yj_caoang_prefix: "用间", + yjxuepin: "血拼", + yjxuepin_info: + "出牌阶段限一次,你可以选择攻击范围内的一名角色并失去1点体力。你弃置其两张牌。若这两张牌类型相同,你回复1点体力。", + ns_chendao: "用间陈到", + ns_chendao_prefix: "用间", + nsjianglie: "将烈", + nsjianglie_info: "当你使用【杀】指定目标后,你可以令其展示所有手牌,然后弃置其中一种颜色的牌。", + ns_jiaxu: "★贾诩", + ns_jiaxu_prefix: "★", + nsyice: "遗策", + nsyice_info: + "锁定技,当你使用/打出/弃置的牌进入弃牌堆后,你将这些牌以任意顺序置于你的武将牌上,称为“策”。若这些“策”中有点数相同的牌,则你获得这两张牌中的所有牌,将这两张牌置于牌堆两端。若场上没有处于濒死状态的角色,则你对一名角色造成1点伤害。", + ns_lijue: "SP李傕", + ns_lijue_prefix: "SP", + ns_zhangji: "SP张济", + ns_zhangji_prefix: "SP", + nsfeixiong: "飞熊", + nsfeixiong_info: "出牌阶段开始时,你可以和一名其他角色拼点。赢的角色对没赢的角色造成1点伤害。", + nscesuan: "策算", + nscesuan_info: + "锁定技,当你受到伤害时,你防止此伤害并失去1点体力上限。若你因以此法失去体力上限导致体力值减少,则你摸一张牌。", + nslulve: "掳掠", + nslulve_info: + "出牌阶段限一次,你可以弃置X张牌并选择一名装备区内有牌的其他角色,然后对其造成1点伤害(X为其装备区内的牌数)。", + ns_fanchou: "SP樊稠", + ns_fanchou_prefix: "SP", + nsyangwu: "扬武", + nsyangwu_info: + "出牌阶段限一次,你可以弃置一张♥手牌并选择一名手牌数大于你的其他角色。你观看其手牌并获得其中的X张牌(X为其与你手牌数之差的一半且向上取整)。", + jsp_liubei: "★刘备", + jsp_liubei_prefix: "★", + jsprende: "仁德", + jsprende_info: + "出牌阶段,你可以将至少一张手牌交给其他角色;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。", + ns_caoanmin: "战役篇曹安民", + ns_caoanmin_prefix: "战役篇", + nskuishe: "窥舍", + nskuishe_info: + "出牌阶段限一次,你可以选择一名其他角色A的一张牌,并将此牌交给不为A的一名角色。然后A可以对你使用一张【杀】。", + sp_xiahoushi: "SP夏侯氏", + sp_xiahoushi_prefix: "SP", + xinfu_yanyu: "燕语", + xinfu_yanyu_info: + "一名角色的出牌阶段开始时,你可以弃置一张牌。若如此做,则该出牌阶段内限三次,当一张与你弃置的牌类别相同的其他牌进入弃牌堆后,你可令任意一名角色获得此牌。", + xinfu_yanyu2: "燕语", + xinfu_xiaode: "孝德", + xinfu_xiaode_info: + "其他角色死亡后,你可以声明该角色武将牌上的一个技能(主公技、觉醒技、隐匿技、使命技除外)。若如此做,你获得此技能且不能再发动〖孝德〗直到你的回合结束。", + jsp_zhaoyun: "J.SP赵云", + jsp_zhaoyun_prefix: "J.SP", + chixin: "赤心", + chixin1: "赤心", + chixin2: "赤心", + chixin_info: + "你可以将♦牌当作【杀】或【闪】使用或打出。出牌阶段,你对在你攻击范围内且本回合内未成为过你使用的【杀】的目标的角色使用的【杀】没有次数限制。", + suiren: "随仁", + suiren_info: + "限定技,准备阶段开始时,你可以失去技能〖义从〗,然后加1点体力上限并回复1点体力,然后令一名角色摸三张牌。", + huangjinleishi: "黄巾雷使", + fulu: "符箓", + fulu_info: "当你声明使用普通【杀】后,你可以将此【杀】改为雷【杀】。", + fuji: "助祭", + fuji_info: + "当一名角色造成雷属性伤害时,你可以令其进行判定,若结果为黑色,此伤害+1;若结果为红色,该角色获得判定牌。", + sp_pangtong: "☆SP庞统", + sp_pangtong_prefix: "☆SP", + manjuan: "漫卷", + manjuan_info: "其他角色的牌因弃置而进入弃牌堆后,你可以弃置一张花色与之不同的牌,然后获得此牌。", + xinmanjuan: "漫卷", + xinmanjuan_info: + "锁定技,当你不因〖漫卷〗或〖醉乡〗而得到牌时,你将此牌置入弃牌堆。然后若此时处于你的回合内,则你可以从弃牌堆中选择获得一张与此牌点数相同的其他牌。", + zuixiang: "醉乡", + zuixiang2: "醉乡", + zuixiang_info: + "限定技。准备阶段开始时,你可以亮出牌堆顶的三张牌并置于你的武将牌上。你不能使用或打出与该些牌同类的牌,所有同类牌对你无效。之后的每个准备阶段,你须重复展示一次,直到这些牌中任意两张点数相同。然后,你获得这些牌。", + sp_daqiao: "☆SP大乔", + sp_daqiao_prefix: "☆SP", + yanxiao: "言笑", + yanxiao_info: + "出牌阶段,你可以将一张♦牌置于一名角色的判定区内。判定区内有〖言笑〗牌的角色下个判定阶段开始时,其获得判定区里的所有牌。", + anxian: "安娴", + anxian_info: + "当你使用【杀】对目标角色造成伤害时,你可以防止此伤害,令其弃置一张手牌,然后你摸一张牌;当你成为【杀】的目标后,你可以弃置一张手牌,令此【杀】对你无效,然后此【杀】的使用者摸一张牌。", + sp_ganning: "☆SP甘宁", + sp_ganning_prefix: "☆SP", + yinling: "银铃", + yinling_bg: "锦", + yinling_info: + "出牌阶段,若你的“锦”小于四张,你可以弃置一张黑色牌并指定一名其他角色。若如此做,你将其的一张牌置于你的武将牌上,称为“锦”。", + junwei: "军威", + junwei2: "军威", + junwei_info: + "结束阶段开始时,你可以移去三张“锦”。若如此做,你须指定一名角色并令其选择一项:1.展示一张【闪】,然后你将此【闪】交给一名其他角色。2.该角色失去1点体力,然后你将其装备区内的一张牌移出游戏。该角色的回合结束后,将以此法移出游戏的装备牌移回原处。", + sp_xiahoudun: "☆SP夏侯惇", + sp_xiahoudun_prefix: "☆SP", + fenyong: "愤勇", + fenyong2: "愤勇", + fenyong2_bg: "勇", + fenyong_info: + "每当你受到一次伤害后,你可以获得一枚「愤勇」标记;当你拥有「愤勇」标记时,防止你受到的所有伤害。", + xuehen: "雪恨", + xuehen_info: + "每个角色的结束阶段开始时,若你有愤勇标记,你弃置之,然后选择一项:1.弃置当前回合角色X张牌(X为你已损失的体力值);2.视为对一名任意角色使用一张【杀】。", + sp_lvmeng: "☆SP吕蒙", + sp_lvmeng_prefix: "☆SP", + tanhu: "探虎", + tanhu2: "探虎", + tanhu3: "探虎", + tanhu_info: + "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得以下效果直到回合结束:你与该角色的距离为1,你对该角色使用的普通锦囊牌不能被【无懈可击】响应。", + mouduan: "谋断", + mouduan_info: + "游戏开始时,你获得标记“武”并获得技能〖激昂〗和〖谦逊〗。当你失去手牌后,若手牌数不大于2,你须将你的标记变为“文”,将这两项技能改为〖英姿〗和〖克己〗。一名角色的回合开始前,你可弃一张牌将标记翻回。", + sp_zhangfei: "☆SP张飞", + sp_zhangfei_prefix: "☆SP", + jie: "嫉恶", + jie_info: "锁定技,当你使用红色【杀】造成伤害时,此伤害+1。", + dahe: "大喝", + dahe2: "大喝", + dahe2_bg: "喝", + dahe_info: + "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,该角色不能使用或打出不为♥花色的【闪】直到回合结束,且你可将该角色拼点的牌交给场上一名体力不多于你的角色。若你没赢,你须展示手牌并弃置其中的一张。", + sp_liubei: "☆SP刘备", + sp_liubei_prefix: "☆SP", + zhaolie: "昭烈", + zhaolie_info: + "摸牌阶段摸牌时,你可以少摸一张牌并指定攻击范围内的一名角色。你亮出牌堆顶的三张牌,将其中的非基本牌和【桃】置于弃牌堆,然后该角色选择一项:1.你对其造成X点伤害,然后其获得这些基本牌;2.其弃置X张牌,然后你获得这些基本牌。(X为其中非基本牌的数量)", + shichou: "誓仇", + shichou2: "誓仇", + shichou_info: + "主公技,限定技,准备阶段,你可指定一名蜀势力角色并交给其两张牌。本局游戏中,当你受到伤害时,改为该角色受到等量的伤害并摸等量的牌,直至该角色第一次进入濒死状态。", + longyufei: "龙羽飞", + longyi: "龙裔", + longyi_info: + "你可将所有手牌当做任意基本牌使用或打出。若此牌对应的实体牌中:有锦囊牌,你摸一张牌;有装备牌,此牌不可被响应。", + zhenjue: "阵绝", + zhenjue_info: + "一名角色的结束阶段开始时,若你没有手牌,则你可以令其选择一项:①弃置一张牌。②令你摸一张牌。", //用间 - yj_caocao:'用间曹操', - yj_caocao_prefix:'用间', - yjxiandao:'献刀', - yjxiandao_info:'每回合限一次。当你赠予其他角色一张牌后,你令其不能使用或打出与本次赠予移动的牌A花色相同的牌直到回合结束。然后若牌A:为锦囊牌,你摸两张牌。为装备牌,你获得其一张不为A的牌。为武器牌,你对其造成1点伤害。', - yjsancai:'散财', - yjsancai_info:'出牌阶段限一次,你可以展示所有手牌。若这些牌的类别均相同,则你可以赠予一名其他角色一张手牌。', - yjyibing:'义兵', - yjyibing_info:'当你不因赠予且不因〖义兵〗的嵌套结算而于摸牌阶段外得到牌时,你可以将此次得到的所有牌当做【杀】使用(无距离限制且不计入使用次数)。', - yj_caohong:'用间曹洪', - yj_caohong_prefix:'用间', - yjlifeng:'厉锋', - yjlifeng_info:'①出牌阶段限一次。你可以获得弃牌堆里的一张装备牌。②你发动〖赠予〗可以选择手牌区里的装备牌或装备区里的牌。', - yj_zhangfei:'用间张飞', - yj_zhangfei_prefix:'用间', - yjmangji:'莽击', - yjmangji_info:'锁定技。当你装备区里的牌数或体力值变化后,若你的体力值不小于1,你弃置一张手牌并视为使用一张【杀】。', - yongjian_ganning:'用间甘宁', - yongjian_ganning_prefix:'用间', - yjjielve:'劫掠', - yjjielve_info:'你可以将两张颜色相同的牌当【趁火打劫】使用,若你以此法造成伤害,此技能于本回合失效。', + yj_caocao: "用间曹操", + yj_caocao_prefix: "用间", + yjxiandao: "献刀", + yjxiandao_info: + "每回合限一次。当你赠予其他角色一张牌后,你令其不能使用或打出与本次赠予移动的牌A花色相同的牌直到回合结束。然后若牌A:为锦囊牌,你摸两张牌。为装备牌,你获得其一张不为A的牌。为武器牌,你对其造成1点伤害。", + yjsancai: "散财", + yjsancai_info: + "出牌阶段限一次,你可以展示所有手牌。若这些牌的类别均相同,则你可以赠予一名其他角色一张手牌。", + yjyibing: "义兵", + yjyibing_info: + "当你不因赠予且不因〖义兵〗的嵌套结算而于摸牌阶段外得到牌时,你可以将此次得到的所有牌当做【杀】使用(无距离限制且不计入使用次数)。", + yj_caohong: "用间曹洪", + yj_caohong_prefix: "用间", + yjlifeng: "厉锋", + yjlifeng_info: + "①出牌阶段限一次。你可以获得弃牌堆里的一张装备牌。②你发动〖赠予〗可以选择手牌区里的装备牌或装备区里的牌。", + yj_zhangfei: "用间张飞", + yj_zhangfei_prefix: "用间", + yjmangji: "莽击", + yjmangji_info: + "锁定技。当你装备区里的牌数或体力值变化后,若你的体力值不小于1,你弃置一张手牌并视为使用一张【杀】。", + yongjian_ganning: "用间甘宁", + yongjian_ganning_prefix: "用间", + yjjielve: "劫掠", + yjjielve_info: + "你可以将两张颜色相同的牌当【趁火打劫】使用,若你以此法造成伤害,此技能于本回合失效。", //什么?孙鲁班?谁会做这种离谱的东西 - yj_dongzhuo:'用间董卓', - yj_dongzhuo_prefix:'用间', - yjtuicheng:'推诚', - yjtuicheng_info:'你可以失去1点体力并视为使用一张【推心置腹】。', - yjyaoling:'耀令', - yjyaoling_info:'出牌阶段结束时,你可以减1点体力上限并选择一名其他角色A和一名角色B,你令A选择一项:1.对B使用一张【杀】;2.你弃置其一张牌。', - yjshicha:'失察', - yjshicha_info:'锁定技。弃牌阶段开始时,若你本回合未发动过〖推诚〗或〖耀令〗之一,你本回合的手牌上限为1。', - yjyongquan:'拥权', - yjyongquan_info:'主公技。结束阶段,其他群势力角色依次可以交给你一张牌。', - yj_liru:'用间李儒', - yj_liru_prefix:'用间', - yjdumou:'毒谋', - yjdumou_info:'锁定技。你的回合内,其他角色的黑色手牌均视为【毒】,你的【毒】均视为【过河拆桥】。', - yjweiquan:'威权', - yjweiquan_info:'限定技。出牌阶段,你可以选择至多X名角色(X为游戏轮数),然后选择一名角色A,这些角色依次将一张手牌交给A。然后若A的手牌数大于体力值,其插入执行一个仅有弃牌阶段的回合。', - yjrenwang:'人望', - yjrenwang_info:'出牌阶段限一次。你可以选择弃牌堆中的一张黑色基本牌,令一名角色获得之。', - yj_xuyou:'用间许攸', - yj_xuyou_prefix:'用间', - yjshicai:'恃才', - yjshicai_info:'①回合内,牌堆顶的一张牌对你可见。②出牌阶段限一次。你可以弃置一张牌,展示并获得牌堆顶的一张牌。当此牌离开你的手牌区后,重置〖恃才②〗。', - yjchenggong:'逞功', - yjchenggong_info:'当一名角色使用牌指定第一个目标后,若此牌目标数大于1,你可以令其摸一张牌。', - yjzezhu:'择主', - yjzezhu_info:'出牌阶段限一次。你可以获得主公区域内的一张牌,然后交给其一张牌。', - yj_jiaxu:'用间贾诩', - yj_jiaxu_prefix:'用间', - yjzhenlve:'缜略', - yjzhenlve_info:'锁定技。①你使用的普通锦囊牌不能被响应。②你不能成为延时锦囊牌的目标。', - yjjianshu:'间书', - yjjianshu_info:'出牌阶段限一次。你可以将一张手牌交给一名其他角色,令其与你选择的另一名其他角色拼点,没赢的角色失去1点体力。', - yjyongdi:'拥嫡', - yjyongdi_info:'限定技。准备阶段,你可以令一名男性角色加1点体力上限并回复1点体力,然后若其武将牌上有主公技且其不为主公,其获得此主公技。', - yj_zhugedan:'用间诸葛诞', - yj_zhugedan_prefix:'用间', - yj_zhenji:'用间甄宓', - yj_zhenji_prefix:'用间', - yjluoshen:'洛神', - yjluoshen_info:'准备阶段,你可以判定并获得判定牌,且可重复此流程直到结果的颜色不同。', + yj_dongzhuo: "用间董卓", + yj_dongzhuo_prefix: "用间", + yjtuicheng: "推诚", + yjtuicheng_info: "你可以失去1点体力并视为使用一张【推心置腹】。", + yjyaoling: "耀令", + yjyaoling_info: + "出牌阶段结束时,你可以减1点体力上限并选择一名其他角色A和一名角色B,你令A选择一项:1.对B使用一张【杀】;2.你弃置其一张牌。", + yjshicha: "失察", + yjshicha_info: + "锁定技。弃牌阶段开始时,若你本回合未发动过〖推诚〗或〖耀令〗之一,你本回合的手牌上限为1。", + yjyongquan: "拥权", + yjyongquan_info: "主公技。结束阶段,其他群势力角色依次可以交给你一张牌。", + yj_liru: "用间李儒", + yj_liru_prefix: "用间", + yjdumou: "毒谋", + yjdumou_info: + "锁定技。你的回合内,其他角色的黑色手牌均视为【毒】,你的【毒】均视为【过河拆桥】。", + yjweiquan: "威权", + yjweiquan_info: + "限定技。出牌阶段,你可以选择至多X名角色(X为游戏轮数),然后选择一名角色A,这些角色依次将一张手牌交给A。然后若A的手牌数大于体力值,其插入执行一个仅有弃牌阶段的回合。", + yjrenwang: "人望", + yjrenwang_info: "出牌阶段限一次。你可以选择弃牌堆中的一张黑色基本牌,令一名角色获得之。", + yj_xuyou: "用间许攸", + yj_xuyou_prefix: "用间", + yjshicai: "恃才", + yjshicai_info: + "①回合内,牌堆顶的一张牌对你可见。②出牌阶段限一次。你可以弃置一张牌,展示并获得牌堆顶的一张牌。当此牌离开你的手牌区后,重置〖恃才②〗。", + yjchenggong: "逞功", + yjchenggong_info: "当一名角色使用牌指定第一个目标后,若此牌目标数大于1,你可以令其摸一张牌。", + yjzezhu: "择主", + yjzezhu_info: "出牌阶段限一次。你可以获得主公区域内的一张牌,然后交给其一张牌。", + yj_jiaxu: "用间贾诩", + yj_jiaxu_prefix: "用间", + yjzhenlve: "缜略", + yjzhenlve_info: "锁定技。①你使用的普通锦囊牌不能被响应。②你不能成为延时锦囊牌的目标。", + yjjianshu: "间书", + yjjianshu_info: + "出牌阶段限一次。你可以将一张手牌交给一名其他角色,令其与你选择的另一名其他角色拼点,没赢的角色失去1点体力。", + yjyongdi: "拥嫡", + yjyongdi_info: + "限定技。准备阶段,你可以令一名男性角色加1点体力上限并回复1点体力,然后若其武将牌上有主公技且其不为主公,其获得此主公技。", + yj_zhugedan: "用间诸葛诞", + yj_zhugedan_prefix: "用间", + yj_zhenji: "用间甄宓", + yj_zhenji_prefix: "用间", + yjluoshen: "洛神", + yjluoshen_info: "准备阶段,你可以判定并获得判定牌,且可重复此流程直到结果的颜色不同。", //线下E系列 一战成名 战役篇官盗 - shen_jiaxu:'战役篇神贾诩', - shen_jiaxu_prefix:'战役篇神', - zybishi:'避世', - zybishi_info:'当你成为【杀】的目标后,你可以令使用者摸一张牌,然后令此【杀】无效。', - zyjianbing:'谏兵', - zyjianbing_info:'当一名其他角色受到执行【杀】的效果而受到伤害时,你可以获得其一张牌。若此牌花色为♥,其回复1点体力。', - pe_wangyun:'战役篇王允', - pe_wangyun_prefix:'战役篇', - zylianji:'连计', - zylianji_info:'出牌阶段结束时,若你于此阶段使用牌的类别数达到:1,你可以令一名角色摸一张牌;2,你可以回复1点体力;3,你可以跳过本回合剩余阶段,然后令一名其他角色执行一个仅有你于此回合未执行过的阶段的回合。', - zymoucheng:'谋逞', - zymoucheng_info:'每回合限一次。你可以将一张黑色牌当【借刀杀人】使用。', - pe_zhonghui:'战役篇钟会', - pe_zhonghui_prefix:'战役篇', - zyquanji:'权计', - zyquanji_info:'①当你受到伤害后或使用牌对唯一目标造成伤害后,你可以摸一张牌并将一张牌置于武将上,称为“权”。②你的手牌上限+X(X为“权”数)。', - zypaiyi:'排异', - zypaiyi_backup:'排异', - zypaiyi_info:'出牌阶段限一次。你可以移去一张“权”并令一名角色摸X张牌(X为“权”数,且至多为7),然后若其手牌数大于你,你对其造成1点伤害。', - pe_mengda:'战役篇孟达', - pe_mengda_prefix:'战役篇', - qiuan:'求安', - qiuan_info:'当你受到伤害后,若此伤害的渠道有对应的实体牌且你的武将牌上没有“函”,则你可以防止此伤害并将这些牌置于你的武将牌上,称为“函”。', - liangfan:'量反', - liangfan2:'量反', - liangfan_info:'锁定技,准备阶段开始时,若你的武将牌上有“函”,则你获得这些牌,然后失去1点体力。当你于此回合内因使用实体牌中包含“函”的牌且执行这些牌的效果而造成伤害后,你可以获得目标角色的一张牌。', - pe_sunchen:'战役篇孙綝', - pe_sunchen_prefix:'战役篇', - zyshilu:'嗜戮', - zyshilu_info:'①一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。', - zyxiongnve:'凶虐', - zyxiongnve_info:'①出牌阶段开始时,你可以将一张“戮”置入武将牌堆并选择一项直到回合结束:1.当你造成伤害时,此伤害+1;2.当你对其他角色造成伤害时,获得其一张牌;3.你使用牌无次数限制。②出牌阶段结束时,你可以将两张“戮”置入武将牌堆,然后当你于下回合开始前受到其他角色造成的伤害时,此伤害-1。', - pe_wenqin:'战役篇文钦', - pe_wenqin_prefix:'战役篇', - gzjinfa:'矜伐', - gzjinfa_info:'出牌阶段限一次。你可以弃置一张牌,令一名其他角色选择一项:1.令你获得其一张牌;2.交给你一张装备牌,若此牌花色为♠,其视为对你使用一张【杀】。', - zyshangyi:'尚义', - zyshangyi_info:'出牌阶段限一次。你可以令一名其他角色观看你的手牌,然后你观看其手牌并可以弃置其中一张牌。', - zymingshi:'名士', - zymingshi_info:'锁定技。若你有空置的防具栏,属性【杀】对你无效。', - gzsuishi:'随势', - gzsuishi2:'随势', - gzsuishi_info:'锁定技,其他角色进入濒死状态时,若伤害来源与你势力相同,你摸一张牌;其他角色死亡时,若其与你势力相同,你失去1点体力。', + shen_jiaxu: "战役篇神贾诩", + shen_jiaxu_prefix: "战役篇神", + zybishi: "避世", + zybishi_info: "当你成为【杀】的目标后,你可以令使用者摸一张牌,然后令此【杀】无效。", + zyjianbing: "谏兵", + zyjianbing_info: + "当一名其他角色受到执行【杀】的效果而受到伤害时,你可以获得其一张牌。若此牌花色为♥,其回复1点体力。", + pe_wangyun: "战役篇王允", + pe_wangyun_prefix: "战役篇", + zylianji: "连计", + zylianji_info: + "出牌阶段结束时,若你于此阶段使用牌的类别数达到:1,你可以令一名角色摸一张牌;2,你可以回复1点体力;3,你可以跳过本回合剩余阶段,然后令一名其他角色执行一个仅有你于此回合未执行过的阶段的回合。", + zymoucheng: "谋逞", + zymoucheng_info: "每回合限一次。你可以将一张黑色牌当【借刀杀人】使用。", + pe_zhonghui: "战役篇钟会", + pe_zhonghui_prefix: "战役篇", + zyquanji: "权计", + zyquanji_info: + "①当你受到伤害后或使用牌对唯一目标造成伤害后,你可以摸一张牌并将一张牌置于武将上,称为“权”。②你的手牌上限+X(X为“权”数)。", + zypaiyi: "排异", + zypaiyi_backup: "排异", + zypaiyi_info: + "出牌阶段限一次。你可以移去一张“权”并令一名角色摸X张牌(X为“权”数,且至多为7),然后若其手牌数大于你,你对其造成1点伤害。", + pe_mengda: "战役篇孟达", + pe_mengda_prefix: "战役篇", + qiuan: "求安", + qiuan_info: + "当你受到伤害后,若此伤害的渠道有对应的实体牌且你的武将牌上没有“函”,则你可以防止此伤害并将这些牌置于你的武将牌上,称为“函”。", + liangfan: "量反", + liangfan2: "量反", + liangfan_info: + "锁定技,准备阶段开始时,若你的武将牌上有“函”,则你获得这些牌,然后失去1点体力。当你于此回合内因使用实体牌中包含“函”的牌且执行这些牌的效果而造成伤害后,你可以获得目标角色的一张牌。", + pe_sunchen: "战役篇孙綝", + pe_sunchen_prefix: "战役篇", + zyshilu: "嗜戮", + zyshilu_info: + "①一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。", + zyxiongnve: "凶虐", + zyxiongnve_info: + "①出牌阶段开始时,你可以将一张“戮”置入武将牌堆并选择一项直到回合结束:1.当你造成伤害时,此伤害+1;2.当你对其他角色造成伤害时,获得其一张牌;3.你使用牌无次数限制。②出牌阶段结束时,你可以将两张“戮”置入武将牌堆,然后当你于下回合开始前受到其他角色造成的伤害时,此伤害-1。", + pe_wenqin: "战役篇文钦", + pe_wenqin_prefix: "战役篇", + gzjinfa: "矜伐", + gzjinfa_info: + "出牌阶段限一次。你可以弃置一张牌,令一名其他角色选择一项:1.令你获得其一张牌;2.交给你一张装备牌,若此牌花色为♠,其视为对你使用一张【杀】。", + zyshangyi: "尚义", + zyshangyi_info: + "出牌阶段限一次。你可以令一名其他角色观看你的手牌,然后你观看其手牌并可以弃置其中一张牌。", + zymingshi: "名士", + zymingshi_info: "锁定技。若你有空置的防具栏,属性【杀】对你无效。", + gzsuishi: "随势", + gzsuishi2: "随势", + gzsuishi_info: + "锁定技,其他角色进入濒死状态时,若伤害来源与你势力相同,你摸一张牌;其他角色死亡时,若其与你势力相同,你失去1点体力。", //线下S系列 - ps_guanyu:'★关羽', - ps_guanyu_prefix:'★', - pszhonghun:'忠魂', - pszhonghun_info:'当你使用或打出红色牌时,你可以亮出牌堆顶的一张牌。若此牌为红色,你获得之。', - ps2070_guojia:'★郭嘉', - ps2070_guojia_prefix:'★', - psquanmou:'全谋', - psquanmou_info:'当其他角色使用锦囊牌结算结束后,若你是此牌目标,你可以弃置一张与此牌颜色相同的手牌并获得之。', - ps1059_guojia:'★郭嘉', - ps1059_guojia_prefix:'★', - psqizuo:'奇佐', - psqizuo_info:'当你攻击范围内的角色造成或受到伤害时,你可以弃置一张牌并判定,若此牌颜色与结果相同,你可以令此伤害+1或-1。', - ps2063_zhaoyun:'★赵云', - ps2063_zhaoyun_prefix:'★', - psqijin:'七进', - psqijin_info:'摸牌阶段,你可以改为亮出牌堆顶的七张牌,并获得其中一种颜色的所有牌。', - psqichu:'七出', - psqichu_info:'每回合限一次。当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若其中有此牌,你可以使用或打出之。', - pslongxin:'龙心', - pslongxin_info:'判定阶段开始时,你可以弃置一张装备牌,然后弃置你判定区里的一张牌。', - ps2080_zhouyu:'★周瑜', - ps2080_zhouyu_prefix:'★', - psshiyin:'识音', - psshiyin_info:'①游戏开始时,你可以将一张手牌置于武将牌上,称为“杂音”牌。②出牌阶段开始时,你可以用一张手牌替换“杂音”牌。', - psquwu:'曲误', - psquwu_info:'锁定技。你不能使用或打出与“杂音”牌花色相同的牌,且这些牌对你无效。', - psliaozou:'聊奏', - psliaozou_info:'出牌阶段,你可以展示所有手牌,若其中没有与“杂音”牌花色相同的牌,你摸一张牌。', - ps1062_zhouyu:'★周瑜', - ps1062_zhouyu_prefix:'★', - psoldshiyin:'识音', - psoldshiyin_info:'当你于回合内得到牌后,你可以展示之,然后根据你展示的牌包含的花色数令你本回合使用的下一张牌获得对应效果:不小于1,不能被响应;不小于2,造成的伤害+1;不小于3,使用时摸一张牌。', - ps_caozhi:'★曹植', - ps_caozhi_prefix:'★', - psliushang:'流殇', - psliushang_info:'锁定技。①摸牌阶段,你改为摸X+1张牌,然后依次将一张手牌置于所有其他角色的武将牌上,称为“流殇”牌(X为场上角色数且至少为3)。②其他角色的准备阶段,其选择一项:1.获得其“流殇”牌,且当其于本回合对你造成伤害时,防止此伤害;2.将其“流殇”牌置入弃牌堆。', - psqibu:'七步', - psqibu_info:'限定技。当你进入濒死状态时,你可以亮出牌堆顶的七张牌,回复等同于其中♥牌数的体力,并获得所有♣牌。', - ps_jin_simayi:'★司马懿', - ps_jin_simayi_prefix:'★', - psquanyi:'权奕', - psquanyi_info:'①出牌阶段限一次。你可以与一名角色拼点,赢的角色根据所有拼点牌的花色执行以下效果:♥,其获得没赢的角色区域里的一张牌;♦其对没赢的角色造成1点伤害;♠,其失去1点体力;♣,其弃置两张牌。②当你拼点时,你可以选择牌堆顶的牌作为拼点牌。', - ps2067_zhaoyun:'武将传赵云', - ps2067_zhaoyun_prefix:'武将传', - pshuiqiang:'回枪', - pshuiqiang_info:'当你使用的【杀】被【闪】抵消后,你可以对其使用一张【杀】。', - pshuntu:'魂突', - pshuntu_info:'出牌阶段限一次。当你使用【杀】对目标角色造成伤害后,你可以对其使用一张【杀】。', - ps_caopi:'★曹丕', - ps_caopi_prefix:'★', - psjianwei:'僭位', - psjianwei_info:'限定技。回合开始时,你可以失去1点体力,然后与一名其他角色交换区域里的所有牌。', - ps2068_simayi:'★司马懿', - ps2068_simayi_prefix:'★', - pszhonghu:'冢虎', - pszhonghu_info:'当一名角色于你的回合外死亡后,你可以结束此回合,然后令所有角色于其回合开始前跳过此回合直到你的回合开始前。', - ps_simayi:'★司马懿', - ps_simayi_prefix:'★', - pshuxiao:'虎啸', - pshuxiao_info:'回合开始时,你可以判定。若结果为基本牌或普通锦囊牌,你于本回合内获得如下效果:你可以将与结果点数或花色相同的手牌当与判定牌牌名和属性相同的牌使用。', - ps_zhugeliang:'★诸葛亮', - ps_zhugeliang_prefix:'★', - psguanxing:'观星', - psguanxing_info:'准备阶段,你可以观看牌堆顶的五张牌,并将其以任意顺序置于牌堆项或牌堆底。', - pslongyin:'龙吟', - pslongyin_info:'每回合限一次。你可以将任意张点数和为13的牌当做任意一张基本牌或普通锦囊牌使用或打出。', - ps2066_zhugeliang:'武将传诸葛亮', - ps2066_zhugeliang_prefix:'武将传', - pszhiji:'智激', - pszhiji_info:'出牌阶段限一次。你可以弃置两张手牌并选择两名势力不同的角色,视为这两名角色依次视为对对方使用一张【杀】。', - psjiefeng:'借风', - psjiefeng_info:'出牌阶段,你可以弃置两张手牌,然后亮出牌堆顶五张牌。若其中有至少两张红色牌,你视为使用一张【万箭齐发】。', - ps_machao:'★马超', - ps_machao_prefix:'★', - psweihou:'威侯', - psweihou_info:'当你判定前,你可以亮出牌堆顶的两张牌,选择其中一张作为你的本次判定结果,然后将另一张置入弃牌堆。', - ps_lvbu:'★吕布', - ps_lvbu_prefix:'★', - pssheji:'射戟', - pssheji_info:'出牌阶段限一次。你可以将所有手牌当一张无距离限制的【杀】使用,然后当此【杀】对目标角色造成伤害后,你获得其装备区里的所有武器牌和坐骑牌。', - ps_jiaxu:'★贾诩', - ps_jiaxu_prefix:'★', - psqupo:'驱魄', - psqupo_info:'一名角色A的回合开始时,你可以将一张牌交给另一名其他角色B。若此牌为:黑色,当A使用【杀】指定不为B的角色为目标时,A失去1点体力;红色,当B于本回合下一次受到伤害时,B失去1点体力。', - psbaoquan:'保全', - psbaoquan_info:'当你受到伤害时,你可以弃置一张锦囊牌并防止此伤害。', + ps_guanyu: "★关羽", + ps_guanyu_prefix: "★", + pszhonghun: "忠魂", + pszhonghun_info: "当你使用或打出红色牌时,你可以亮出牌堆顶的一张牌。若此牌为红色,你获得之。", + ps2070_guojia: "★郭嘉", + ps2070_guojia_prefix: "★", + psquanmou: "全谋", + psquanmou_info: + "当其他角色使用锦囊牌结算结束后,若你是此牌目标,你可以弃置一张与此牌颜色相同的手牌并获得之。", + ps1059_guojia: "★郭嘉", + ps1059_guojia_prefix: "★", + psqizuo: "奇佐", + psqizuo_info: + "当你攻击范围内的角色造成或受到伤害时,你可以弃置一张牌并判定,若此牌颜色与结果相同,你可以令此伤害+1或-1。", + ps2063_zhaoyun: "★赵云", + ps2063_zhaoyun_prefix: "★", + psqijin: "七进", + psqijin_info: "摸牌阶段,你可以改为亮出牌堆顶的七张牌,并获得其中一种颜色的所有牌。", + psqichu: "七出", + psqichu_info: + "每回合限一次。当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若其中有此牌,你可以使用或打出之。", + pslongxin: "龙心", + pslongxin_info: "判定阶段开始时,你可以弃置一张装备牌,然后弃置你判定区里的一张牌。", + ps2080_zhouyu: "★周瑜", + ps2080_zhouyu_prefix: "★", + psshiyin: "识音", + psshiyin_info: + "①游戏开始时,你可以将一张手牌置于武将牌上,称为“杂音”牌。②出牌阶段开始时,你可以用一张手牌替换“杂音”牌。", + psquwu: "曲误", + psquwu_info: "锁定技。你不能使用或打出与“杂音”牌花色相同的牌,且这些牌对你无效。", + psliaozou: "聊奏", + psliaozou_info: "出牌阶段,你可以展示所有手牌,若其中没有与“杂音”牌花色相同的牌,你摸一张牌。", + ps1062_zhouyu: "★周瑜", + ps1062_zhouyu_prefix: "★", + psoldshiyin: "识音", + psoldshiyin_info: + "当你于回合内得到牌后,你可以展示之,然后根据你展示的牌包含的花色数令你本回合使用的下一张牌获得对应效果:不小于1,不能被响应;不小于2,造成的伤害+1;不小于3,使用时摸一张牌。", + ps_caozhi: "★曹植", + ps_caozhi_prefix: "★", + psliushang: "流殇", + psliushang_info: + "锁定技。①摸牌阶段,你改为摸X+1张牌,然后依次将一张手牌置于所有其他角色的武将牌上,称为“流殇”牌(X为场上角色数且至少为3)。②其他角色的准备阶段,其选择一项:1.获得其“流殇”牌,且当其于本回合对你造成伤害时,防止此伤害;2.将其“流殇”牌置入弃牌堆。", + psqibu: "七步", + psqibu_info: + "限定技。当你进入濒死状态时,你可以亮出牌堆顶的七张牌,回复等同于其中♥牌数的体力,并获得所有♣牌。", + ps_jin_simayi: "★司马懿", + ps_jin_simayi_prefix: "★", + psquanyi: "权奕", + psquanyi_info: + "①出牌阶段限一次。你可以与一名角色拼点,赢的角色根据所有拼点牌的花色执行以下效果:♥,其获得没赢的角色区域里的一张牌;♦其对没赢的角色造成1点伤害;♠,其失去1点体力;♣,其弃置两张牌。②当你拼点时,你可以选择牌堆顶的牌作为拼点牌。", + ps2067_zhaoyun: "武将传赵云", + ps2067_zhaoyun_prefix: "武将传", + pshuiqiang: "回枪", + pshuiqiang_info: "当你使用的【杀】被【闪】抵消后,你可以对其使用一张【杀】。", + pshuntu: "魂突", + pshuntu_info: "出牌阶段限一次。当你使用【杀】对目标角色造成伤害后,你可以对其使用一张【杀】。", + ps_caopi: "★曹丕", + ps_caopi_prefix: "★", + psjianwei: "僭位", + psjianwei_info: "限定技。回合开始时,你可以失去1点体力,然后与一名其他角色交换区域里的所有牌。", + ps2068_simayi: "★司马懿", + ps2068_simayi_prefix: "★", + pszhonghu: "冢虎", + pszhonghu_info: + "当一名角色于你的回合外死亡后,你可以结束此回合,然后令所有角色于其回合开始前跳过此回合直到你的回合开始前。", + ps_simayi: "★司马懿", + ps_simayi_prefix: "★", + pshuxiao: "虎啸", + pshuxiao_info: + "回合开始时,你可以判定。若结果为基本牌或普通锦囊牌,你于本回合内获得如下效果:你可以将与结果点数或花色相同的手牌当与判定牌牌名和属性相同的牌使用。", + ps_zhugeliang: "★诸葛亮", + ps_zhugeliang_prefix: "★", + psguanxing: "观星", + psguanxing_info: "准备阶段,你可以观看牌堆顶的五张牌,并将其以任意顺序置于牌堆项或牌堆底。", + pslongyin: "龙吟", + pslongyin_info: + "每回合限一次。你可以将任意张点数和为13的牌当做任意一张基本牌或普通锦囊牌使用或打出。", + ps2066_zhugeliang: "武将传诸葛亮", + ps2066_zhugeliang_prefix: "武将传", + pszhiji: "智激", + pszhiji_info: + "出牌阶段限一次。你可以弃置两张手牌并选择两名势力不同的角色,视为这两名角色依次视为对对方使用一张【杀】。", + psjiefeng: "借风", + psjiefeng_info: + "出牌阶段,你可以弃置两张手牌,然后亮出牌堆顶五张牌。若其中有至少两张红色牌,你视为使用一张【万箭齐发】。", + ps_machao: "★马超", + ps_machao_prefix: "★", + psweihou: "威侯", + psweihou_info: + "当你判定前,你可以亮出牌堆顶的两张牌,选择其中一张作为你的本次判定结果,然后将另一张置入弃牌堆。", + ps_lvbu: "★吕布", + ps_lvbu_prefix: "★", + pssheji: "射戟", + pssheji_info: + "出牌阶段限一次。你可以将所有手牌当一张无距离限制的【杀】使用,然后当此【杀】对目标角色造成伤害后,你获得其装备区里的所有武器牌和坐骑牌。", + ps_jiaxu: "★贾诩", + ps_jiaxu_prefix: "★", + psqupo: "驱魄", + psqupo_info: + "一名角色A的回合开始时,你可以将一张牌交给另一名其他角色B。若此牌为:黑色,当A使用【杀】指定不为B的角色为目标时,A失去1点体力;红色,当B于本回合下一次受到伤害时,B失去1点体力。", + psbaoquan: "保全", + psbaoquan_info: "当你受到伤害时,你可以弃置一张锦囊牌并防止此伤害。", //S特 - ps_shen_machao:'S特神马超', - ps_shen_machao_prefix:'S特神', - psshouli:'狩骊', - psshouli_info:'锁定技。①游戏开始时,所有角色依次选择一项:1.使用一张坐骑牌,然后摸一张牌;2.随机从游戏外的八张坐骑牌指示物中使用一张。②你可以将场上一张进攻坐骑当【杀】,防御坐骑当【闪】使用或打出,若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。', - pshengwu:'横骛', - pshengwu_info:'当你使用或打出牌时,若场上有该花色的装备牌,你可以弃置任意张该花色的手牌,然后摸X张牌(X为你弃置的牌数与场上与此牌花色相同的装备牌数之和)。', + ps_shen_machao: "S特神马超", + ps_shen_machao_prefix: "S特神", + psshouli: "狩骊", + psshouli_info: + "锁定技。①游戏开始时,所有角色依次选择一项:1.使用一张坐骑牌,然后摸一张牌;2.随机从游戏外的八张坐骑牌指示物中使用一张。②你可以将场上一张进攻坐骑当【杀】,防御坐骑当【闪】使用或打出,若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。", + pshengwu: "横骛", + pshengwu_info: + "当你使用或打出牌时,若场上有该花色的装备牌,你可以弃置任意张该花色的手牌,然后摸X张牌(X为你弃置的牌数与场上与此牌花色相同的装备牌数之和)。", //线下K系列木盒 - pk_sp_duyu:'K系列杜预', - pk_sp_duyu_prefix:'K系列', - pkwuku:'武库', - pkwuku_info:'锁定技。当有角色使用装备牌时,若你的“武库”数小于3,则你获得1枚“武库”。', - pksanchen:'三陈', - pksanchen_info:'觉醒技。结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。', - pkmiewu:'灭吴', - pkmiewu2:'灭吴', - pkmiewu_info:'每回合限一次。你可移去1枚“武库”,视为使用或打出任意一张基本牌或普通锦囊牌,然后摸一张牌。', + pk_sp_duyu: "K系列杜预", + pk_sp_duyu_prefix: "K系列", + pkwuku: "武库", + pkwuku_info: "锁定技。当有角色使用装备牌时,若你的“武库”数小于3,则你获得1枚“武库”。", + pksanchen: "三陈", + pksanchen_info: + "觉醒技。结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。", + pkmiewu: "灭吴", + pkmiewu2: "灭吴", + pkmiewu_info: + "每回合限一次。你可移去1枚“武库”,视为使用或打出任意一张基本牌或普通锦囊牌,然后摸一张牌。", //天书乱斗虚拟偶像 - vtb_xiaosha:'小杀', - vtbguisha:'瑰杀', - vtbguisha_info:'当其他角色使用【杀】时,你可以弃置一张牌令此【杀】不计入次数,且此【杀】对目标角色造成的伤害+1。', - vtbshuli:'淑丽', - vtbshuli_info:'每回合限两次。当其他角色使用【杀】造成伤害后,你可以与其各摸一张牌。', - vtb_xiaoshan:'小闪', - vtbshanwu:'闪舞', - vtbshanwu_info:'当其他角色成为【杀】的第一个目标时,你可以弃置一张【闪】,然后取消此【杀】的所有目标。', - vtbxianli:'娴丽', - vtbxianli_info:'每回合限两次。当你失去牌后,若其中有【闪】,你可以获得当前回合角色的一张牌。', - vtb_xiaotao:'小桃', - vtbtaoyan:'桃宴', - vtbtaoyan_info:'回合开始时,你可以令至多两名其他角色摸一张牌并于游戏外获得一张【桃】(共五张且均为♥6)。', - vtbyanli:'妍丽', - vtbyanli_info:'每轮限一次。一名角色于你的回合外进入濒死状态时,你可以令其回复至1点体力,然后其摸一张牌。', - vtb_xiaole:'小乐', - vtbleyu:'乐虞', - vtbleyu_info:'一名角色的回合开始时,你可以弃置三张牌令其判定。若结果不为♥,其跳过本回合的出牌阶段。', - vtbyuanli:'媛丽', - vtbyuanli_info:'一名角色跳过出牌阶段后,你可以与一名其他角色各摸一张牌。', - vtb_xiaojiu:'小酒', - vtbmeiniang:'美酿', - vtbmeiniang_info:'其他角色的出牌阶段开始时,你可以令其视为使用一张无次数限制且不计入次数的【酒】。', - vtbyaoli:'媱丽', - vtbyaoli_info:'其他角色于其出牌阶段内使用【酒】后,你可以令其于本回合内使用的下一张【杀】不能被响应且可以额外指定一个目标。', - old_machao:'J.SP马超', - old_machao_prefix:'J.SP', - jsp_caoren:'☆SP曹仁', - jsp_caoren_prefix:'☆SP', - jsp_ganfuren:'SP甘夫人', - jsp_ganfuren_prefix:'SP', - zhangliang:'SP张梁', - zhangliang_prefix:'SP', - ol_xinxianying:'将辛宪英', - ol_xinxianying_prefix:'将', - jiangqing:'战役篇蒋钦', - jiangqing_prefix:'战役篇', - tianfeng:'战役篇田丰', - tianfeng_prefix:'战役篇', - jiling:'战役篇纪灵', - jiling_prefix:'战役篇', - kongrong:'战役篇孔融', - kongrong_prefix:'战役篇', - mateng:'战役篇马腾', - mateng_prefix:'战役篇', - drag_guanyu:'龙关羽', - drag_guanyu_prefix:'龙', - drag_caoren:'龙曹仁', - drag_caoren_prefix:'龙', - drag_lvchang:'龙吕常', - drag_lvchang_prefix:'龙', - dragchaojue:'超绝', - dragchaojue_info:'准备阶段,你可以弃置一张手牌,然后令所有其他角色本回合不能使用或打出此花色的牌,然后这些角色依次选择一项:①正面朝上交给你一张牌;②本回合非锁定技失效。', - dragjunshen:'军神', - dragjunshen_info:'①你可以将一张红色牌当作【杀】使用或打出。②当你使用〖军神①〗转化的【杀】造成伤害时,你可以令受伤角色选择弃置装备区的所有牌或令此伤害+1。③你使用方片【杀】无距离限制,使用红桃【杀】可以额外选择一个目标。', - draglizhong:'厉众', - draglizhong_info:'结束阶段,你可以以任意顺序选择执行任意项:①将任意张装备牌置入任意名角色的装备区;②令你或任意名装备区里有牌的角色各摸一张牌。然后本次成为〖厉众②〗的角色于本轮手牌上限+2且可以将装备区的牌当作【无懈可击】使用。', - dragjuesui:'玦碎', - dragjuesui_info:'每名角色限一次,一名角色进入濒死状态时,你可以令其选择是否将体力值回复至1点并废除装备栏。若其选择是,则其本局游戏获得以下效果:你可以将一张黑色非基本牌当作无次数限制的【杀】使用或打出。', - dragjuwu:'拒武', - dragjuwu_info:'锁定技,攻击范围内至少包含三名角色的角色使用的无属性【杀】对你无效。', - dragshouxiang:'守襄', - dragshouxiang_info:'摸牌阶段,你可以额外摸X张牌。若如此做,你跳过出牌阶段,且本回合的弃牌阶段开始时,你可以交给至多X名角色各一张手牌。(X为攻击范围内包含你的角色)', + vtb_xiaosha: "小杀", + vtbguisha: "瑰杀", + vtbguisha_info: + "当其他角色使用【杀】时,你可以弃置一张牌令此【杀】不计入次数,且此【杀】对目标角色造成的伤害+1。", + vtbshuli: "淑丽", + vtbshuli_info: "每回合限两次。当其他角色使用【杀】造成伤害后,你可以与其各摸一张牌。", + vtb_xiaoshan: "小闪", + vtbshanwu: "闪舞", + vtbshanwu_info: + "当其他角色成为【杀】的第一个目标时,你可以弃置一张【闪】,然后取消此【杀】的所有目标。", + vtbxianli: "娴丽", + vtbxianli_info: "每回合限两次。当你失去牌后,若其中有【闪】,你可以获得当前回合角色的一张牌。", + vtb_xiaotao: "小桃", + vtbtaoyan: "桃宴", + vtbtaoyan_info: + "回合开始时,你可以令至多两名其他角色摸一张牌并于游戏外获得一张【桃】(共五张且均为♥6)。", + vtbyanli: "妍丽", + vtbyanli_info: + "每轮限一次。一名角色于你的回合外进入濒死状态时,你可以令其回复至1点体力,然后其摸一张牌。", + vtb_xiaole: "小乐", + vtbleyu: "乐虞", + vtbleyu_info: + "一名角色的回合开始时,你可以弃置三张牌令其判定。若结果不为♥,其跳过本回合的出牌阶段。", + vtbyuanli: "媛丽", + vtbyuanli_info: "一名角色跳过出牌阶段后,你可以与一名其他角色各摸一张牌。", + vtb_xiaojiu: "小酒", + vtbmeiniang: "美酿", + vtbmeiniang_info: + "其他角色的出牌阶段开始时,你可以令其视为使用一张无次数限制且不计入次数的【酒】。", + vtbyaoli: "媱丽", + vtbyaoli_info: + "其他角色于其出牌阶段内使用【酒】后,你可以令其于本回合内使用的下一张【杀】不能被响应且可以额外指定一个目标。", + old_machao: "J.SP马超", + old_machao_prefix: "J.SP", + jsp_caoren: "☆SP曹仁", + jsp_caoren_prefix: "☆SP", + jsp_ganfuren: "SP甘夫人", + jsp_ganfuren_prefix: "SP", + zhangliang: "SP张梁", + zhangliang_prefix: "SP", + ol_xinxianying: "将辛宪英", + ol_xinxianying_prefix: "将", + jiangqing: "战役篇蒋钦", + jiangqing_prefix: "战役篇", + tianfeng: "战役篇田丰", + tianfeng_prefix: "战役篇", + jiling: "战役篇纪灵", + jiling_prefix: "战役篇", + kongrong: "战役篇孔融", + kongrong_prefix: "战役篇", + mateng: "战役篇马腾", + mateng_prefix: "战役篇", + drag_guanyu: "龙关羽", + drag_guanyu_prefix: "龙", + drag_caoren: "龙曹仁", + drag_caoren_prefix: "龙", + drag_lvchang: "龙吕常", + drag_lvchang_prefix: "龙", + dragchaojue: "超绝", + dragchaojue_info: + "准备阶段,你可以弃置一张手牌,然后令所有其他角色本回合不能使用或打出此花色的牌,然后这些角色依次选择一项:①正面朝上交给你一张牌;②本回合非锁定技失效。", + dragjunshen: "军神", + dragjunshen_info: + "①你可以将一张红色牌当作【杀】使用或打出。②当你使用〖军神①〗转化的【杀】造成伤害时,你可以令受伤角色选择弃置装备区的所有牌或令此伤害+1。③你使用方片【杀】无距离限制,使用红桃【杀】可以额外选择一个目标。", + draglizhong: "厉众", + draglizhong_info: + "结束阶段,你可以以任意顺序选择执行任意项:①将任意张装备牌置入任意名角色的装备区;②令你或任意名装备区里有牌的角色各摸一张牌。然后本次成为〖厉众②〗的角色于本轮手牌上限+2且可以将装备区的牌当作【无懈可击】使用。", + dragjuesui: "玦碎", + dragjuesui_info: + "每名角色限一次,一名角色进入濒死状态时,你可以令其选择是否将体力值回复至1点并废除装备栏。若其选择是,则其本局游戏获得以下效果:你可以将一张黑色非基本牌当作无次数限制的【杀】使用或打出。", + dragjuwu: "拒武", + dragjuwu_info: "锁定技,攻击范围内至少包含三名角色的角色使用的无属性【杀】对你无效。", + dragshouxiang: "守襄", + dragshouxiang_info: + "摸牌阶段,你可以额外摸X张牌。若如此做,你跳过出牌阶段,且本回合的弃牌阶段开始时,你可以交给至多X名角色各一张手牌。(X为攻击范围内包含你的角色)", - offline_star:'桌游志·SP', - offline_sticker:'桌游志·贴纸', - offline_yijiang:'一将成名', - offline_luanwu:'文和乱武', - offline_yongjian:'用间篇', - offline_yongjian_prefix:'用间', - offline_feihongyingxue:'飞鸿映雪', - offline_piracyE:'官盗E系列·战役篇', - offline_piracyS:'官盗S系列', - offline_vtuber:'天书乱斗·虚拟偶像', - offline_piracyK:'官盗K系列', - offline_others:'线下其他系列', - offline_longyutao:'龙起襄樊', + offline_star: "桌游志·SP", + offline_sticker: "桌游志·贴纸", + offline_yijiang: "一将成名", + offline_luanwu: "文和乱武", + offline_yongjian: "用间篇", + offline_yongjian_prefix: "用间", + offline_feihongyingxue: "飞鸿映雪", + offline_piracyE: "官盗E系列·战役篇", + offline_piracyS: "官盗S系列", + offline_vtuber: "天书乱斗·虚拟偶像", + offline_piracyK: "官盗K系列", + offline_others: "线下其他系列", + offline_longyutao: "龙起襄樊", }, }; }); diff --git a/character/old.js b/character/old.js index 1e0886310..093932d42 100755 --- a/character/old.js +++ b/character/old.js @@ -1,1229 +1,1507 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'old', - connect:true, - characterSort:{ - old:{ - old_standard:['ol_yuanshu'], - old_shenhua:['old_shen_zhaoyun','old_caocao',"yuji","zhangjiao","old_zhugezhan","old_guanqiujian","xiahouyuan","weiyan","old_xiaoqiao","pangde","xuhuang",'junk_sunquan',"huangzhong","new_caoren",'old_chendao'], - old_refresh:["old_zhangfei","old_huatuo","old_zhaoyun","ol_huaxiong",'old_guanyu'], - old_yijiang1:["masu","xushu","xin_yujin","old_xusheng","old_lingtong","fazheng",'old_gaoshun','re_yujin'], - old_yijiang2:["old_zhonghui","madai",'old_handang','old_liubiao','oldre_liubiao','old_guanzhang','old_wangyi'], - old_yijiang3:["liru","old_zhuran","old_fuhuanghou","old_caochong"], - old_yijiang4:["old_caozhen","old_chenqun","old_zhuhuan",'old_caorui'], - old_yijiang5:["old_caoxiu","old_zhuzhi"], - old_yijiang67:["ol_zhangrang",'old_huanghao','old_liyan'], - old_sp:['old_shixie',"panfeng","old_wanglang","old_maliang","old_zhangxingcai","old_wangyun",'old_dingfeng','old_guanyinping'], - old_yingbian:['junk_simayi','old_yangyan','old_yangzhi'], - old_mobile:["old_caochun"], + name: "old", + connect: true, + characterSort: { + old: { + old_standard: ["ol_yuanshu"], + old_shenhua: [ + "old_shen_zhaoyun", + "old_caocao", + "yuji", + "zhangjiao", + "old_zhugezhan", + "old_guanqiujian", + "xiahouyuan", + "weiyan", + "old_xiaoqiao", + "pangde", + "xuhuang", + "junk_sunquan", + "huangzhong", + "new_caoren", + "old_chendao", + ], + old_refresh: ["old_zhangfei", "old_huatuo", "old_zhaoyun", "ol_huaxiong", "old_guanyu"], + old_yijiang1: [ + "masu", + "xushu", + "xin_yujin", + "old_xusheng", + "old_lingtong", + "fazheng", + "old_gaoshun", + "re_yujin", + ], + old_yijiang2: [ + "old_zhonghui", + "madai", + "old_handang", + "old_liubiao", + "oldre_liubiao", + "old_guanzhang", + "old_wangyi", + ], + old_yijiang3: ["liru", "old_zhuran", "old_fuhuanghou", "old_caochong"], + old_yijiang4: ["old_caozhen", "old_chenqun", "old_zhuhuan", "old_caorui"], + old_yijiang5: ["old_caoxiu", "old_zhuzhi"], + old_yijiang67: ["ol_zhangrang", "old_huanghao", "old_liyan"], + old_sp: [ + "old_shixie", + "panfeng", + "old_wanglang", + "old_maliang", + "old_zhangxingcai", + "old_wangyun", + "old_dingfeng", + "old_guanyinping", + ], + old_yingbian: ["junk_simayi", "old_yangyan", "old_yangzhi"], + old_mobile: ["old_caochun"], }, }, - character:{ - old_shixie:['male','qun',3,['biluan','lixia']], - panfeng:['male','qun',4,['kuangfu']], - old_shen_zhaoyun:['male','shen',2,['oldjuejing','oldlonghun'],['shu']], - old_guanyinping:['female','shu',3,['xueji_old','oldhuxiao','oldwuji']], - old_caocao:['male','shen',3,['junkguixin','feiying'],['die_audio']], - old_chendao:['male','shu',4,['drlt_wanglie']], - old_liyan:['male','shu',3,['duliang','fulin']], - old_guanzhang:['male','shu',4,['old_fuhun']], - new_caoren:['male','wei',4,['moon_jushou','jiewei']], - huangzhong:['male','shu',4,['liegong']], - junk_sunquan:['male','shen',4,['dili','yuheng'],['wei']], - old_dingfeng:['male','wu',4,['fenxun','duanbing']], - old_huanghao:['male','shu',3,['oldqinqing','oldhuisheng']], - oldre_liubiao:['male','qun',3,['zishou','zongshi']], - old_liubiao:['male','qun',4,['oldzishou','zongshi']], - old_gaoshun:['male','qun',4,['xianzhen','jinjiu']], - old_caorui:['male','wei',3,['huituo','oldmingjian','xingshuai'],['zhu']], - old_handang:['male','wu',4,['oldgongji','oldjiefan']], - old_yangzhi:['female','jin',3,['wanyi','maihuo']], - old_yangyan:['female','jin',3,['xuanbei','xianwan']], - madai:['male','shu',4,['mashu','oldqianxi']], - xuhuang:['male','wei',4,['gzduanliang']], - junk_simayi:['male','jin',3,['buchen','smyyingshi','xiongzhi','quanbian'],['hiddenSkill']], - fazheng:['male','shu',3,['enyuan','xuanhuo']], - ol_yuanshu:['male','qun',4,['wangzun','tongji']], - pangde:['male','qun',4,['mashu','mengjin']], - ol_huaxiong:["male","qun",6,["new_reyaowu"]], - old_wangyun:['male','qun',4,['wylianji','moucheng'],['clan:太原王氏']], - old_xiaoqiao:['female','wu',3,['tianxiang','hongyan']], - weiyan:['male','shu',4,['kuanggu']], - xiahouyuan:['male','wei',4,['shensu']], - old_zhangxingcai:['female','shu',3,['oldshenxian','qiangwu']], - old_fuhuanghou:['female','qun',3,['oldzhuikong','oldqiuyuan']], - old_caochong:['male','wei',3,['oldrenxin','oldchengxiang']], - yuji:['male','qun',3,['old_guhuo']], - zhangjiao:['male','qun',3,['leiji','guidao','huangtian'],['zhu']], - old_zhangfei:['male','shu',4,['new_repaoxiao','new_tishen']], - old_zhaoyun:['male','shu',4,['longdan','new_yajiao']], - old_huatuo:['male','qun',3,['jijiu','chulao']], - old_guanyu:['male','shu',4,['wusheng','yijue']], - old_caochun:['male','wei',4,['shanjia']], - masu:['male','shu',3,['xinzhan','huilei']], - xushu:['male','shu',3,['xswuyan','jujian'],['border:wei']], - liru:['male','qun',3,['juece','mieji','fencheng']], - xin_yujin:['male','wei',4,['jieyue']], + character: { + old_shixie: ["male", "qun", 3, ["biluan", "lixia"]], + panfeng: ["male", "qun", 4, ["kuangfu"]], + old_shen_zhaoyun: ["male", "shen", 2, ["oldjuejing", "oldlonghun"], ["shu"]], + old_guanyinping: ["female", "shu", 3, ["xueji_old", "oldhuxiao", "oldwuji"]], + old_caocao: ["male", "shen", 3, ["junkguixin", "feiying"], ["die_audio"]], + old_chendao: ["male", "shu", 4, ["drlt_wanglie"]], + old_liyan: ["male", "shu", 3, ["duliang", "fulin"]], + old_guanzhang: ["male", "shu", 4, ["old_fuhun"]], + new_caoren: ["male", "wei", 4, ["moon_jushou", "jiewei"]], + huangzhong: ["male", "shu", 4, ["liegong"]], + junk_sunquan: ["male", "shen", 4, ["dili", "yuheng"], ["wei"]], + old_dingfeng: ["male", "wu", 4, ["fenxun", "duanbing"]], + old_huanghao: ["male", "shu", 3, ["oldqinqing", "oldhuisheng"]], + oldre_liubiao: ["male", "qun", 3, ["zishou", "zongshi"]], + old_liubiao: ["male", "qun", 4, ["oldzishou", "zongshi"]], + old_gaoshun: ["male", "qun", 4, ["xianzhen", "jinjiu"]], + old_caorui: ["male", "wei", 3, ["huituo", "oldmingjian", "xingshuai"], ["zhu"]], + old_handang: ["male", "wu", 4, ["oldgongji", "oldjiefan"]], + old_yangzhi: ["female", "jin", 3, ["wanyi", "maihuo"]], + old_yangyan: ["female", "jin", 3, ["xuanbei", "xianwan"]], + madai: ["male", "shu", 4, ["mashu", "oldqianxi"]], + xuhuang: ["male", "wei", 4, ["gzduanliang"]], + junk_simayi: [ + "male", + "jin", + 3, + ["buchen", "smyyingshi", "xiongzhi", "quanbian"], + ["hiddenSkill"], + ], + fazheng: ["male", "shu", 3, ["enyuan", "xuanhuo"]], + ol_yuanshu: ["male", "qun", 4, ["wangzun", "tongji"]], + pangde: ["male", "qun", 4, ["mashu", "mengjin"]], + ol_huaxiong: ["male", "qun", 6, ["new_reyaowu"]], + old_wangyun: ["male", "qun", 4, ["wylianji", "moucheng"], ["clan:太原王氏"]], + old_xiaoqiao: ["female", "wu", 3, ["tianxiang", "hongyan"]], + weiyan: ["male", "shu", 4, ["kuanggu"]], + xiahouyuan: ["male", "wei", 4, ["shensu"]], + old_zhangxingcai: ["female", "shu", 3, ["oldshenxian", "qiangwu"]], + old_fuhuanghou: ["female", "qun", 3, ["oldzhuikong", "oldqiuyuan"]], + old_caochong: ["male", "wei", 3, ["oldrenxin", "oldchengxiang"]], + yuji: ["male", "qun", 3, ["old_guhuo"]], + zhangjiao: ["male", "qun", 3, ["leiji", "guidao", "huangtian"], ["zhu"]], + old_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "new_tishen"]], + old_zhaoyun: ["male", "shu", 4, ["longdan", "new_yajiao"]], + old_huatuo: ["male", "qun", 3, ["jijiu", "chulao"]], + old_guanyu: ["male", "shu", 4, ["wusheng", "yijue"]], + old_caochun: ["male", "wei", 4, ["shanjia"]], + masu: ["male", "shu", 3, ["xinzhan", "huilei"]], + xushu: ["male", "shu", 3, ["xswuyan", "jujian"], ["border:wei"]], + liru: ["male", "qun", 3, ["juece", "mieji", "fencheng"]], + xin_yujin: ["male", "wei", 4, ["jieyue"]], //lusu:['male','wu',3,['haoshi','dimeng']], //yuanshao:['male','qun',4,['luanji','xueyi'],['zhu']], - old_zhonghui:['male','wei',3,['zzhenggong','zquanji','zbaijiang'],['clan:颍川钟氏']], - old_xusheng:['male','wu',4,['pojun']], - old_zhuran:['male','wu',4,['olddanshou']], - old_lingtong:['male','wu',4,['oldxuanfeng']], - old_caoxiu:['male','wei',4,['taoxi']], - old_caozhen:['male','wei',4,['sidi']], - old_maliang:['male','shu',3,['xiemu','naman']], - old_chenqun:['male','wei',3,['dingpin','oldfaen']], - old_zhuhuan:['male','wu',4,['youdi']], - old_zhuzhi:['male','wu',4,['anguo']], + old_zhonghui: ["male", "wei", 3, ["zzhenggong", "zquanji", "zbaijiang"], ["clan:颍川钟氏"]], + old_xusheng: ["male", "wu", 4, ["pojun"]], + old_zhuran: ["male", "wu", 4, ["olddanshou"]], + old_lingtong: ["male", "wu", 4, ["oldxuanfeng"]], + old_caoxiu: ["male", "wei", 4, ["taoxi"]], + old_caozhen: ["male", "wei", 4, ["sidi"]], + old_maliang: ["male", "shu", 3, ["xiemu", "naman"]], + old_chenqun: ["male", "wei", 3, ["dingpin", "oldfaen"]], + old_zhuhuan: ["male", "wu", 4, ["youdi"]], + old_zhuzhi: ["male", "wu", 4, ["anguo"]], - old_zhugezhan:["male","shu",3,["old_zuilun","old_fuyin"]], - ol_zhangrang:['male','qun',3,['xintaoluan'],['sex:male_castrated']], + old_zhugezhan: ["male", "shu", 3, ["old_zuilun", "old_fuyin"]], + ol_zhangrang: ["male", "qun", 3, ["xintaoluan"], ["sex:male_castrated"]], //ol_manchong:['male','wei',3,['yuce','junxing']], - old_guanqiujian:["male","wei",4,["drlt_zhenrong","drlt_hongju"],[]], - old_wanglang:['male','wei',3,['gushe','jici']], - old_wangyi:['female','wei',3,['oldzhenlie','oldmiji']], - re_yujin:['male','wei',4,['yizhong']], + old_guanqiujian: ["male", "wei", 4, ["drlt_zhenrong", "drlt_hongju"], []], + old_wanglang: ["male", "wei", 3, ["gushe", "jici"]], + old_wangyi: ["female", "wei", 3, ["oldzhenlie", "oldmiji"]], + re_yujin: ["male", "wei", 4, ["yizhong"]], }, - skill:{ + skill: { //山包初版神赵 - oldjuejing:{ - audio:'xinjuejing', - trigger:{player:'phaseDrawBegin2'}, - filter:function(event,player){ - return !event.numFixed&&player.getHp()num+2, + mod: { + maxHandcard: (player, num) => num + 2, }, }, - oldlonghun:{ - audio:'relonghun', - inherit:'xinlonghun', - prompt:()=>`将${get.cnNumber(Math.max(1,get.player().getHp()))}张♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出`, - selectCard:()=>Math.max(1,get.player().getHp()), - complexCard:true, - precontent:function(){ + oldlonghun: { + audio: "relonghun", + inherit: "xinlonghun", + prompt: () => + `将${get.cnNumber( + Math.max(1, get.player().getHp()) + )}张♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出`, + selectCard: () => Math.max(1, get.player().getHp()), + complexCard: true, + precontent: function () { delete event.result.skill; - player.logSkill('oldlonghun'); + player.logSkill("oldlonghun"); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { var name; - switch(tag){ - case 'respondSha':name='diamond';break; - case 'respondShan':name='club';break; - case 'save':name='heart';break; + switch (tag) { + case "respondSha": + name = "diamond"; + break; + case "respondShan": + name = "club"; + break; + case "save": + name = "heart"; + break; } - if(!player.countCards('hes',{suit:name})) return false; + if (!player.countCards("hes", { suit: name })) return false; }, - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao']; - var map={sha:'diamond',tao:'heart'} - for(var i=0;i=Math.max(1,player.getHp())&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ - var temp=get.order({name:name,nature:name=='sha'?'fire':null}); - if(temp>max) max=temp; + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao"]; + var map = { sha: "diamond", tao: "heart" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hes", function (card) { + return ( + (name != "sha" || get.value(card) < 5) && + get.suit(card, player) == map[name] + ); + }) >= Math.max(1, player.getHp()) && + player.getUseValue({ + name: name, + nature: name == "sha" ? "fire" : null, + }) > 0 + ) { + var temp = get.order({ + name: name, + nature: name == "sha" ? "fire" : null, + }); + if (temp > max) max = temp; } } - max/=1.1; + max /= 1.1; return max; } return 2; }, }, - hiddenCard:function(player,name){ - if(name=='wuxie'&&_status.connectMode&&player.countCards('hes')>0) return true; - if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>=Math.max(1,get.player().getHp()); - if(name=='tao') return player.countCards('hes',{suit:'heart'})>=Math.max(1,get.player().getHp()); + hiddenCard: function (player, name) { + if (name == "wuxie" && _status.connectMode && player.countCards("hes") > 0) return true; + if (name == "wuxie") + return ( + player.countCards("hes", { suit: "spade" }) >= Math.max(1, get.player().getHp()) + ); + if (name == "tao") + return ( + player.countCards("hes", { suit: "heart" }) >= Math.max(1, get.player().getHp()) + ); }, }, //魏武帝 - junkguixin:{ - init:function(){ - if(!_status.junkguixin){ - _status.junkguixin=[]; - if(!_status.characterlist){ + junkguixin: { + init: function () { + if (!_status.junkguixin) { + _status.junkguixin = []; + if (!_status.characterlist) { lib.skill.pingjian.initList(); } - for(const name of _status.characterlist){ - if(!lib.character[name][3]) continue; - _status.junkguixin.addArray(lib.character[name][3].filter(skill=>{ - var info=get.info(skill); - return info&&info.zhuSkill&&(!info.ai||!info.ai.combo); - })); + for (const name of _status.characterlist) { + if (!lib.character[name][3]) continue; + _status.junkguixin.addArray( + lib.character[name][3].filter((skill) => { + var info = get.info(skill); + return info && info.zhuSkill && (!info.ai || !info.ai.combo); + }) + ); } } }, - unique:true, - audio:'guixin', - trigger:{player:'phaseEnd'}, - direct:true, - content:function(){ - 'step 0' - var controls=['获得技能','修改势力','cancel2']; - if(!_status.junkguixin.some(skill=>!player.hasSkill(skill,null,false,false))) controls.shift(); - player.chooseControl(controls).set('prompt',get.prompt2('junkguixin')).set('ai',()=>_status.event.controls.length==3?'获得技能':'cancel2'); - 'step 1' - if(result.control!='cancel2'){ - var next=game.createEvent('junkguixinx'); - next.player=player; - next.setContent(lib.skill.junkguixin['content_'+result.control]); + unique: true, + audio: "guixin", + trigger: { player: "phaseEnd" }, + direct: true, + content: function () { + "step 0"; + var controls = ["获得技能", "修改势力", "cancel2"]; + if (!_status.junkguixin.some((skill) => !player.hasSkill(skill, null, false, false))) + controls.shift(); + player + .chooseControl(controls) + .set("prompt", get.prompt2("junkguixin")) + .set("ai", () => (_status.event.controls.length == 3 ? "获得技能" : "cancel2")); + ("step 1"); + if (result.control != "cancel2") { + var next = game.createEvent("junkguixinx"); + next.player = player; + next.setContent(lib.skill.junkguixin["content_" + result.control]); } }, - content_获得技能:function(){ - 'step 0' - var list=_status.junkguixin.slice().filter(skill=>!player.hasSkill(skill,null,false,false)); - if(!list.length){event.finish();return;} - list=list.map(skill=>{ + content_获得技能: function () { + "step 0"; + var list = _status.junkguixin + .slice() + .filter((skill) => !player.hasSkill(skill, null, false, false)); + if (!list.length) { + event.finish(); + return; + } + list = list.map((skill) => { return [ skill, - '', + '", ]; }); - player.chooseButton([ - '归心:选择获得一个主公技', - [list,'textbutton'], - ],true).set('ai',button=>1+Math.random()); - 'step 1' - if(result.bool){ - player.logSkill('junkguixin'); + player + .chooseButton(["归心:选择获得一个主公技", [list, "textbutton"]], true) + .set("ai", (button) => 1 + Math.random()); + ("step 1"); + if (result.bool) { + player.logSkill("junkguixin"); player.addSkills(result.links[0]); } }, - content_修改势力:function(){ - 'step 0' - player.chooseTarget('请选择【归心】的目标','更改一名其他角色的势力',lib.filter.notMe,true).set('ai',target=>1+Math.random()); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('junkguixin',target); - var list=lib.group.slice(); - list.removeArray(['shen',target.group]); - player.chooseControl(list).set('prompt','请选择'+get.translation(target)+'变更的势力').set('ai',()=>_status.event.controls.randomGet()); - } - else event.finish(); - 'step 2' - if(result.control){ - player.popup(get.translation(result.control+'2')); + content_修改势力: function () { + "step 0"; + player + .chooseTarget( + "请选择【归心】的目标", + "更改一名其他角色的势力", + lib.filter.notMe, + true + ) + .set("ai", (target) => 1 + Math.random()); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("junkguixin", target); + var list = lib.group.slice(); + list.removeArray(["shen", target.group]); + player + .chooseControl(list) + .set("prompt", "请选择" + get.translation(target) + "变更的势力") + .set("ai", () => _status.event.controls.randomGet()); + } else event.finish(); + ("step 2"); + if (result.control) { + player.popup(get.translation(result.control + "2")); target.changeGroup(result.control); } }, }, - oldqinqing:{ - audio:'qinqing', - mode:['identity','versus'], - available:function(mode){ - if(mode=='versus'&&_status.mode!='four') return false; - if(mode=='identity'&&_status.mode=='purple') return false; + oldqinqing: { + audio: "qinqing", + mode: ["identity", "versus"], + available: function (mode) { + if (mode == "versus" && _status.mode != "four") return false; + if (mode == "identity" && _status.mode == "purple") return false; }, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - var zhu=get.zhu(player); - if(!zhu||!zhu.isZhu) return false; - return game.hasPlayer(function(current){ - return current!=zhu&¤t!=player&¤t.inRange(zhu); + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var zhu = get.zhu(player); + if (!zhu || !zhu.isZhu) return false; + return game.hasPlayer(function (current) { + return current != zhu && current != player && current.inRange(zhu); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('dcqinqing'),function(card,player,target){ - var zhu=get.zhu(player); - return target!=player&&target.inRange(zhu); - }).set('ai',function(target){ - var zhu=get.zhu(player); - var he=target.countCards('he'); - if(get.attitude(_status.event.player,target)>0){ - if(target.countCards('h')>zhu.countCards('h')+1) return 0.1; - } - else{ - if(he>zhu.countCards('h')+1) return 2; - if(he>0) return 1; - } - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('dcqinqing',target); - if(target.countDiscardableCards(player,'he')) player.discardPlayerCard(target,'he',true); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dcqinqing"), function (card, player, target) { + var zhu = get.zhu(player); + return target != player && target.inRange(zhu); + }) + .set("ai", function (target) { + var zhu = get.zhu(player); + var he = target.countCards("he"); + if (get.attitude(_status.event.player, target) > 0) { + if (target.countCards("h") > zhu.countCards("h") + 1) return 0.1; + } else { + if (he > zhu.countCards("h") + 1) return 2; + if (he > 0) return 1; + } + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcqinqing", target); + if (target.countDiscardableCards(player, "he")) + player.discardPlayerCard(target, "he", true); target.draw(); - } - else{ + } else { event.finish(); } - 'step 2' - var zhu=get.zhu(player); - if(zhu&&zhu.isIn()){ - if(target.countCards('h')>zhu.countCards('h')) player.draw(); + ("step 2"); + var zhu = get.zhu(player); + if (zhu && zhu.isIn()) { + if (target.countCards("h") > zhu.countCards("h")) player.draw(); } - } + }, }, - oldhuisheng:{ - audio:'huisheng', - trigger:{player:'damageBegin4'}, - direct:true, - filter:function(event,player){ - if(!player.countCards('he')) return false; - if(!event.source||event.source==player||!event.source.isIn()) return false; - if(player.storage.oldhuisheng&&player.storage.oldhuisheng.includes(event.source)) return false; + oldhuisheng: { + audio: "huisheng", + trigger: { player: "damageBegin4" }, + direct: true, + filter: function (event, player) { + if (!player.countCards("he")) return false; + if (!event.source || event.source == player || !event.source.isIn()) return false; + if (player.storage.oldhuisheng && player.storage.oldhuisheng.includes(event.source)) + return false; return true; }, - init:function(player){ - if(player.storage.oldhuisheng) player.storage.oldhuisheng=[]; + init: function (player) { + if (player.storage.oldhuisheng) player.storage.oldhuisheng = []; }, - content:function(){ - 'step 0' - if(!player.storage.oldhuisheng) player.storage.oldhuisheng=[]; + content: function () { + "step 0"; + if (!player.storage.oldhuisheng) player.storage.oldhuisheng = []; player.storage.oldhuisheng.push(trigger.source); - var att=(get.attitude(player,trigger.source)>0); - var goon=false; - if(player.hp==1){ - goon=true; - } - else{ - var he=player.getCards('he'); - var num=0; - for(var i=0;i 0; + var goon = false; + if (player.hp == 1) { + goon = true; + } else { + var he = player.getCards("he"); + var num = 0; + for (var i = 0; i < he.length; i++) { + if (get.value(he[i]) < 8) { num++; - if(num>=2){ - goon=true;break; + if (num >= 2) { + goon = true; + break; } } } } - player.chooseCard('he',[1,player.countCards('he')],get.prompt2('oldhuisheng',trigger.source)).set('ai',function(card){ - if(_status.event.att){ - return 10-get.value(card); - } - if(_status.event.goon){ - return 8-get.value(card); - } - if(!ui.selected.cards.length){ - return 7-get.value(card); - } - return 0; - }).set('goon',goon).set('att',att); - 'step 1' - if(result.bool){ - player.logSkill('oldhuisheng',trigger.source); - game.delay(); - event.num=result.cards.length; - var goon=false; - if(event.num>2||get.attitude(trigger.source,player)>=0){ - goon=true; - } - var forced=false; - var str='获得其中一张牌并防止伤害'; - if(trigger.source.countCards('he') 2 || get.attitude(trigger.source, player) >= 0) { + goon = true; + } + var forced = false; + var str = "获得其中一张牌并防止伤害"; + if (trigger.source.countCards("he") < event.num) { + forced = true; + } else { + str += ",或取消并弃置" + get.cnNumber(result.cards.length) + "张牌"; + } + trigger.source + .chooseButton([str, result.cards], forced) + .set("ai", function (button) { + if (_status.event.goon) { + return get.value(button.link); + } + return get.value(button.link) - 8; + }) + .set("goon", goon); + } else { event.finish(); } - 'step 2' - if(result.bool){ - var card=result.links[0]; - trigger.source.gain(card,player,'giveAuto','bySelf'); + ("step 2"); + if (result.bool) { + var card = result.links[0]; + trigger.source.gain(card, player, "giveAuto", "bySelf"); trigger.cancel(); + } else { + trigger.source.chooseToDiscard(event.num, true, "he"); } - else{ - trigger.source.chooseToDiscard(event.num,true,'he'); - } - } + }, }, - oldzishou:{ - audio:'zishou', - audioname:['re_liubiao'], - trigger:{player:'phaseDrawBegin2'}, - check:function(event,player){ - return (player.countCards('h')<=2&&player.getDamagedHp()>=2)||player.skipList.includes('phaseUse'); + oldzishou: { + audio: "zishou", + audioname: ["re_liubiao"], + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + return ( + (player.countCards("h") <= 2 && player.getDamagedHp() >= 2) || + player.skipList.includes("phaseUse") + ); }, - filter:function(event,player){ - return !event.numFixed&&player.isDamaged(); + filter: function (event, player) { + return !event.numFixed && player.isDamaged(); }, - content:function(){ - trigger.num+=player.getDamagedHp(); - player.skip('phaseUse'); + content: function () { + trigger.num += player.getDamagedHp(); + player.skip("phaseUse"); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5 - } }, - oldgongji:{ - audio:'gongji', - enable:['chooseToUse','chooseToRespond'], - locked:false, - filterCard:{type:'equip'}, - position:'hes', - viewAs:{ - name:'sha', - storage:{oldgongji:true} + oldgongji: { + audio: "gongji", + enable: ["chooseToUse", "chooseToRespond"], + locked: false, + filterCard: { type: "equip" }, + position: "hes", + viewAs: { + name: "sha", + storage: { oldgongji: true }, }, - viewAsFilter:function(player){ - if(!player.countCards('hes',{type:'equip'})) return false; + viewAsFilter: function (player) { + if (!player.countCards("hes", { type: "equip" })) return false; }, - prompt:'将一张装备牌当无距离限制的【杀】使用或打出', - check:function(card){ - var val=get.value(card); - if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); - return 5-val; + prompt: "将一张装备牌当无距离限制的【杀】使用或打出", + check: function (card) { + var val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 5 - val; }, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.oldgongji) return true; + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.oldgongji) return true; }, }, - ai:{ - respondSha:true, - skillTagFilter:function(player){ - if(!player.countCards('hes',{type:'equip'})) return false; + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (!player.countCards("hes", { type: "equip" })) return false; }, }, }, - oldjiefan:{ - audio:'jiefan', - enable:'chooseToUse', - filter:function(event,player){ - return event.type=='dying'&&_status.currentPhase&&_status.currentPhase.isIn(); + oldjiefan: { + audio: "jiefan", + enable: "chooseToUse", + filter: function (event, player) { + return event.type == "dying" && _status.currentPhase && _status.currentPhase.isIn(); }, - direct:true, - content:function(){ - player.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },get.prompt2('oldjiefan')).set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.currentPhase&&!ui.selected.targets.includes(_status.currentPhase)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('logSkill','oldjiefan').set('oncard',function(){ - _status.event.player.addTempSkill('oldjiefan_recover'); - }).set('custom',{ - add:{}, - replace:{ - window:()=>{ - ui.click.cancel(); - } - }, - }); + direct: true, + content: function () { + player + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, get.prompt2("oldjiefan")) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.currentPhase && + !ui.selected.targets.includes(_status.currentPhase) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("logSkill", "oldjiefan") + .set("oncard", function () { + _status.event.player.addTempSkill("oldjiefan_recover"); + }) + .set("custom", { + add: {}, + replace: { + window: () => { + ui.click.cancel(); + }, + }, + }); }, - ai:{ - save:true, - order:3, - result:{player:1} + ai: { + save: true, + order: 3, + result: { player: 1 }, }, - subSkill:{ - recover:{ + subSkill: { + recover: { // audio:'jiefan', - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - return event.getParent(4).name=='oldjiefan'; + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return event.getParent(4).name == "oldjiefan"; }, - forced:true, - popup:false, - charlotte:true, - content:function(){ + forced: true, + popup: false, + charlotte: true, + content: function () { trigger.cancel(); - var evt=event.getParent('_save'); - var card={name:'tao',isCard:true}; - if(evt&&evt.dying&&player.canUse(card,evt.dying)){ - player.useCard(card,evt.dying,'oldjiefan_recover'); + var evt = event.getParent("_save"); + var card = { name: "tao", isCard: true }; + if (evt && evt.dying && player.canUse(card, evt.dying)) { + player.useCard(card, evt.dying, "oldjiefan_recover"); } - } - } - } - }, - oldmingjian:{ - audio:'mingjian', - trigger:{player:'phaseUseBefore'}, - filter:function(event,player){ - return player.countCards('h'); + }, + }, }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('oldmingjian'),'跳过出牌阶段并将所有手牌交给一名其他角色,你结束此回合,然后其于此回合后获得一个额外的出牌阶段',lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) return 0.01*att; - if(player.countCards('h')==player.countCards('h','du')) return -att; - if(target.hasJudge('lebu')) att*=1.25; - if(get.attitude(player,target)>3){ - var basis=get.threaten(target)*att; - if(player==get.zhu(player)&&player.hp<=2&&player.countCards('h','shan')&&!game.hasPlayer(function(current){ - return get.attitude(current,player)>3&¤t.countCards('h','tao')>0; - })) return 0; - if(target.countCards('h')+player.countCards('h')>target.hp+2) return basis*0.8; - return basis; - } - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('oldmingjian',target); - player.give(player.getCards('h'),target); + }, + oldmingjian: { + audio: "mingjian", + trigger: { player: "phaseUseBefore" }, + filter: function (event, player) { + return player.countCards("h"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("oldmingjian"), + "跳过出牌阶段并将所有手牌交给一名其他角色,你结束此回合,然后其于此回合后获得一个额外的出牌阶段", + lib.filter.notMe + ) + .set("ai", (target) => { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) return 0.01 * att; + if (player.countCards("h") == player.countCards("h", "du")) return -att; + if (target.hasJudge("lebu")) att *= 1.25; + if (get.attitude(player, target) > 3) { + var basis = get.threaten(target) * att; + if ( + player == get.zhu(player) && + player.hp <= 2 && + player.countCards("h", "shan") && + !game.hasPlayer(function (current) { + return ( + get.attitude(current, player) > 3 && + current.countCards("h", "tao") > 0 + ); + }) + ) + return 0; + if (target.countCards("h") + player.countCards("h") > target.hp + 2) + return basis * 0.8; + return basis; + } + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oldmingjian", target); + player.give(player.getCards("h"), target); trigger.cancel(); - } - else event.finish(); - 'step 2' - var evt=trigger.getParent('phase'); - if(evt){ - game.log(player,'结束了回合'); + } else event.finish(); + ("step 2"); + var evt = trigger.getParent("phase"); + if (evt) { + game.log(player, "结束了回合"); evt.finish(); } - var next=target.insertPhase(); - next._noTurnOver=true; - next.phaseList=['phaseUse']; + var next = target.insertPhase(); + next._noTurnOver = true; + next.phaseList = ["phaseUse"]; //next.setContent(lib.skill.oldmingjian.phase); }, - phase:function(){ - 'step 0' + phase: function () { + "step 0"; player.phaseUse(); - 'step 1' - game.broadcastAll(function(){ - if(ui.tempnowuxie){ + ("step 1"); + game.broadcastAll(function () { + if (ui.tempnowuxie) { ui.tempnowuxie.close(); delete ui.tempnowuxie; } }); }, }, - oldshenxian:{ - audio:'shenxian', - inherit:'shenxian', + oldshenxian: { + audio: "shenxian", + inherit: "shenxian", }, - old_guhuo:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - return (lib.inpile.includes(name)&&player.countCards('hs')>0); + old_guhuo: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return lib.inpile.includes(name) && player.countCards("hs") > 0; }, - filter:function(event,player){ - if(!player.countCards('hs')) return false; - for(var i of lib.inpile){ - var type=get.type(i); - if((type=='basic'||type=='trick')&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name:i,nature:j},'unsure'),player,event)) return true; + filter: function (event, player) { + if (!player.countCards("hs")) return false; + for (var i of lib.inpile) { + var type = get.type(i); + if ( + (type == "basic" || type == "trick") && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name: i, nature: j }, "unsure"), + player, + event + ) + ) + return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i of lib.inpile){ - if(event.type!='phase') if(!event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) continue; - var type=get.type(i); - if(type=='basic'||type=='trick') list.push([type,'',i]); - if(i=='sha'){ - if(event.type!='phase') if(!event.filterCard(get.autoViewAs({name:i,nature:j},'unsure'),player,event)) continue; - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if (event.type != "phase") + if (!event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) + continue; + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + if (event.type != "phase") + if ( + !event.filterCard( + get.autoViewAs({ name: i, nature: j }, "unsure"), + player, + event + ) + ) + continue; + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } } - return ui.create.dialog('蛊惑',[list,'vcard']); + return ui.create.dialog("蛊惑", [list, "vcard"]); }, - check:function(button){ - var player=_status.event.player; - var order=Math.max(0,get.order(card)+1); - var enemyNum=game.countPlayer(function(current){ - return current!=player&&(get.realAttitude||get.attitude)(current,player)<0&¤t.hp>0; + check: function (button) { + var player = _status.event.player; + var order = Math.max(0, get.order(card) + 1); + var enemyNum = game.countPlayer(function (current) { + return ( + current != player && + (get.realAttitude || get.attitude)(current, player) < 0 && + current.hp > 0 + ); }); - var card={name:button.link[2],nature:button.link[3]}; - if(player.isDying()&&!player.hasCard(function(cardx){ - if(get.suit(cardx)!='heart') return false; - var mod2=game.checkMod(cardx,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(cardx,player,player,'unchanged','cardSavable',player); - if(mod!='unchanged') return mod; - var savable=get.info(cardx).savable; - if(typeof savable=='function') savable=savable(card,player,player); - return savable; - },'hs')){ - if(!player.getStorage('old_guhuo_cheated').includes(card.name+card.nature)&&Math.random()<0.4) return 1; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + player.isDying() && + !player.hasCard(function (cardx) { + if (get.suit(cardx) != "heart") return false; + var mod2 = game.checkMod(cardx, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod( + cardx, + player, + player, + "unchanged", + "cardSavable", + player + ); + if (mod != "unchanged") return mod; + var savable = get.info(cardx).savable; + if (typeof savable == "function") savable = savable(card, player, player); + return savable; + }, "hs") + ) { + if ( + !player.getStorage("old_guhuo_cheated").includes(card.name + card.nature) && + Math.random() < 0.4 + ) + return 1; return 0; } - var val=_status.event.getParent().type=='phase'?player.getUseValue(card):1; - if(player.getStorage('old_guhuo_cheated').includes(card.name+card.nature)&&!player.hasCard(function(cardx){ - if(card.name==cardx.name){ - if(card.name!='sha') return true; - return get.is.sameNature(card,cardx); - } - return false; - },'hs')&&Math.random()<0.7) return 0; - if(val<=0) return 0; - if(enemyNum){ - if(!player.hasCard(function(cardx){ - if(card.name==cardx.name){ - if(card.name!='sha') return true; - return get.is.sameNature(card,cardx); + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + if ( + player.getStorage("old_guhuo_cheated").includes(card.name + card.nature) && + !player.hasCard(function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); } return false; - },'hs')){ - if(get.value(card,player,'raw')<6) return Math.sqrt(val)*(0.25+Math.random()/1.5); - if(enemyNum<=2) return Math.sqrt(val)/1.5+order*10; + }, "hs") && + Math.random() < 0.7 + ) + return 0; + if (val <= 0) return 0; + if (enemyNum) { + if ( + !player.hasCard(function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); + } + return false; + }, "hs") + ) { + if (get.value(card, player, "raw") < 6) + return Math.sqrt(val) * (0.25 + Math.random() / 1.5); + if (enemyNum <= 2) return Math.sqrt(val) / 1.5 + order * 10; return 0; } - return 3*val+order*10; + return 3 * val + order * 10; } - return val+order*10; + return val + order * 10; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:function(card,player,target){ - var result=true; - var suit=card.suit,number=card.number; - card.suit='none';card.number=null; - var mod=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod!='unchanged') result=mod; - card.suit=suit;card.number=number; + filterCard: function (card, player, target) { + var result = true; + var suit = card.suit, + number = card.number; + card.suit = "none"; + card.number = null; + var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod != "unchanged") result = mod; + card.suit = suit; + card.number = number; return result; }, - selectCard:1, - position:'hs', - ignoreMod:true, - aiUse:Math.random(), - viewAs:{ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null + selectCard: 1, + position: "hs", + ignoreMod: true, + aiUse: Math.random(), + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, }, - ai1:function(card){ - var player=_status.event.player; - var enemyNum=game.countPlayer(function(current){ - return current!=player&&(get.realAttitude||get.attitude)(current,player)<0&¤t.hp>0; + ai1: function (card) { + var player = _status.event.player; + var enemyNum = game.countPlayer(function (current) { + return ( + current != player && + (get.realAttitude || get.attitude)(current, player) < 0 && + current.hp > 0 + ); }); - var cardx=lib.skill.old_guhuo_backup.viewAs; - if(enemyNum){ - if(card.name==cardx.name&&(card.name!='sha'||get.is.sameNature(card,cardx))||player.getStorage('old_guhuo_cheated').includes(card.name+card.nature)) return (get.suit(card)=='heart'?8:4)+Math.random()*3; - else if(lib.skill.old_guhuo_backup.aiUse<0.5&&!player.isDying()) return 0; + var cardx = lib.skill.old_guhuo_backup.viewAs; + if (enemyNum) { + if ( + (card.name == cardx.name && + (card.name != "sha" || get.is.sameNature(card, cardx))) || + player + .getStorage("old_guhuo_cheated") + .includes(card.name + card.nature) + ) + return (get.suit(card) == "heart" ? 8 : 4) + Math.random() * 3; + else if (lib.skill.old_guhuo_backup.aiUse < 0.5 && !player.isDying()) + return 0; } - return get.value(cardx)-get.value(card); + return get.value(cardx) - get.value(card); }, - precontent:function(){ - player.logSkill('old_guhuo'); - player.addTempSkill('old_guhuo_guess'); - var card=event.result.cards[0]; - event.result.card.suit=get.suit(card); - event.result.card.number=get.number(card); + precontent: function () { + player.logSkill("old_guhuo"); + player.addTempSkill("old_guhuo_guess"); + var card = event.result.cards[0]; + event.result.card.suit = get.suit(card); + event.result.card.number = get.number(card); }, - } + }; }, - prompt:function(links,player){ - return '将一张手牌当做'+(links[0][3]?get.translation(links[0][3]):'')+'【'+get.translation(links[0][2])+'】'+(_status.event.name=='chooseToRespond'?'打出':'使用'); + prompt: function (links, player) { + return ( + "将一张手牌当做" + + (links[0][3] ? get.translation(links[0][3]) : "") + + "【" + + get.translation(links[0][2]) + + "】" + + (_status.event.name == "chooseToRespond" ? "打出" : "使用") + ); }, }, - ai:{ - save:true, - respondSha:true, - respondShan:true, - fireAttack:true, - skillTagFilter:function(player){ - if(!player.countCards('hs')) return false; + ai: { + save: true, + respondSha: true, + respondShan: true, + fireAttack: true, + skillTagFilter: function (player) { + if (!player.countCards("hs")) return false; }, - threaten:1.2, - order:10, - result:{player:1}, + threaten: 1.2, + order: 10, + result: { player: 1 }, }, - subSkill:{ - cheated:{ - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + subSkill: { + cheated: { + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - charlotte:true, - forced:true, - silent:true, - popup:false, - firstDo:true, - onremove:true, - filter:function(event,player){ - if(event.getParent().name=='draw') return true; - var cards=event.getg(player); - if(!cards.length) return false; - return game.hasPlayer(current=>{ - if(current==player) return false; - var evt=event.getl(current); - if(evt&&evt.cards&&evt.cards.length) return true; + charlotte: true, + forced: true, + silent: true, + popup: false, + firstDo: true, + onremove: true, + filter: function (event, player) { + if (event.getParent().name == "draw") return true; + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer((current) => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.length) return true; return false; }); }, - content:function(){ - player.removeSkill('old_guhuo_cheated'); - } - } - } + content: function () { + player.removeSkill("old_guhuo_cheated"); + }, + }, + }, }, - old_guhuo_guess:{ - audio:'old_guhuo', - trigger:{ - player:['useCardBefore','respondBefore'], + old_guhuo_guess: { + audio: "old_guhuo", + trigger: { + player: ["useCardBefore", "respondBefore"], }, - forced:true, - silent:true, - popup:false, - firstDo:true, - charlotte:true, - filter:function(event,player){ - return event.skill&&event.skill.indexOf('old_guhuo_')==0; + forced: true, + silent: true, + popup: false, + firstDo: true, + charlotte: true, + filter: function (event, player) { + return event.skill && event.skill.indexOf("old_guhuo_") == 0; }, - content:function(){ - 'step 0' - event.fake=false; - event.goon=true; - event.betrayers=[]; - var card=trigger.cards[0]; - if(card.name!=trigger.card.name||(card.name=='sha'&&!get.is.sameNature(trigger.card,card))) event.fake=true; - if(event.fake){ - player.addSkill('old_guhuo_cheated'); - player.markAuto('old_guhuo_cheated',[trigger.card.name+trigger.card.nature]); + content: function () { + "step 0"; + event.fake = false; + event.goon = true; + event.betrayers = []; + var card = trigger.cards[0]; + if ( + card.name != trigger.card.name || + (card.name == "sha" && !get.is.sameNature(trigger.card, card)) + ) + event.fake = true; + if (event.fake) { + player.addSkill("old_guhuo_cheated"); + player.markAuto("old_guhuo_cheated", [trigger.card.name + trigger.card.nature]); } - player.popup(trigger.card.name,'metal'); - player.lose(card,ui.ordering).relatedEvent=trigger; - trigger.throw=false; - trigger.skill='old_guhuo_backup'; - game.log(player,'声明',trigger.targets&&trigger.targets.length?'对':'',trigger.targets||'',trigger.name=='useCard'?'使用':'打出',trigger.card); - event.prompt=get.translation(player)+'声明'+(trigger.targets&&trigger.targets.length?'对'+get.translation(trigger.targets):'')+ - (trigger.name=='useCard'?'使用':'打出')+(get.translation(trigger.card.nature)||'')+get.translation(trigger.card.name)+',是否质疑?'; - event.targets=game.filterPlayer(i=>i!=player&&i.hp>0).sortBySeat(_status.currentPhase); + player.popup(trigger.card.name, "metal"); + player.lose(card, ui.ordering).relatedEvent = trigger; + trigger.throw = false; + trigger.skill = "old_guhuo_backup"; + game.log( + player, + "声明", + trigger.targets && trigger.targets.length ? "对" : "", + trigger.targets || "", + trigger.name == "useCard" ? "使用" : "打出", + trigger.card + ); + event.prompt = + get.translation(player) + + "声明" + + (trigger.targets && trigger.targets.length + ? "对" + get.translation(trigger.targets) + : "") + + (trigger.name == "useCard" ? "使用" : "打出") + + (get.translation(trigger.card.nature) || "") + + get.translation(trigger.card.name) + + ",是否质疑?"; + event.targets = game + .filterPlayer((i) => i != player && i.hp > 0) + .sortBySeat(_status.currentPhase); - game.broadcastAll(function(card,player){ - _status.old_guhuoNode=card.copy('thrown'); - if(lib.config.cardback_style!='default'){ - _status.old_guhuoNode.style.transitionProperty='none'; - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.classList.add('infohidden'); - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transitionProperty=''; - } - else{ - _status.old_guhuoNode.classList.add('infohidden'); - } - _status.old_guhuoNode.style.transform='perspective(600px) rotateY(180deg) translateX(0)'; - player.$throwordered2(_status.old_guhuoNode); - },trigger.cards[0],player); - event.onEnd01=function(){ - _status.old_guhuoNode.removeEventListener('webkitTransitionEnd',_status.event.onEnd01); - setTimeout(function(){ - _status.old_guhuoNode.style.transition='all ease-in 0.3s'; - _status.old_guhuoNode.style.transform='perspective(600px) rotateY(270deg)'; - var onEnd=function(){ - _status.old_guhuoNode.classList.remove('infohidden'); - _status.old_guhuoNode.style.transition='all 0s'; + game.broadcastAll( + function (card, player) { + _status.old_guhuoNode = card.copy("thrown"); + if (lib.config.cardback_style != "default") { + _status.old_guhuoNode.style.transitionProperty = "none"; ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transform='perspective(600px) rotateY(-90deg)'; + _status.old_guhuoNode.classList.add("infohidden"); ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transition=''; - ui.refresh(_status.old_guhuoNode); - _status.old_guhuoNode.style.transform=''; - _status.old_guhuoNode.removeEventListener('webkitTransitionEnd',onEnd); + _status.old_guhuoNode.style.transitionProperty = ""; + } else { + _status.old_guhuoNode.classList.add("infohidden"); } + _status.old_guhuoNode.style.transform = + "perspective(600px) rotateY(180deg) translateX(0)"; + player.$throwordered2(_status.old_guhuoNode); + }, + trigger.cards[0], + player + ); + event.onEnd01 = function () { + _status.old_guhuoNode.removeEventListener( + "webkitTransitionEnd", + _status.event.onEnd01 + ); + setTimeout(function () { + _status.old_guhuoNode.style.transition = "all ease-in 0.3s"; + _status.old_guhuoNode.style.transform = "perspective(600px) rotateY(270deg)"; + var onEnd = function () { + _status.old_guhuoNode.classList.remove("infohidden"); + _status.old_guhuoNode.style.transition = "all 0s"; + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.style.transform = "perspective(600px) rotateY(-90deg)"; + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.style.transition = ""; + ui.refresh(_status.old_guhuoNode); + _status.old_guhuoNode.style.transform = ""; + _status.old_guhuoNode.removeEventListener("webkitTransitionEnd", onEnd); + }; _status.old_guhuoNode.listenTransition(onEnd); - },300); + }, 300); }; - if(!event.targets.length) event.goto(3); - 'step 1' - event.target=event.targets.shift(); - event.target.chooseButton([event.prompt,[['reguhuo_ally','reguhuo_betray'],'vcard']],true).set('ai',function(button){ - var player=_status.event.player; - var evt=_status.event.getParent('old_guhuo_guess'),evtx=evt.getTrigger(); - if(!evt) return Math.random(); - var card={name:evtx.card.name,nature:evtx.card.nature,isCard:true}; - var ally=button.link[2]=='reguhuo_ally'; - if(ally&&(player.hp<=1||get.attitude(player,evt.player)>=0)) return 1.1; - if(!ally&&get.effect(player,{name:'losehp'},player,player)>=0) return 10; - if(!ally&&get.attitude(player,evt.player)<0){ - if(evtx.name=='useCard'){ - var eff=0; - var targetsx=evtx.targets||[]; - for(var target of targetsx){ - var isMe=target==evt.player; - eff+=get.effect(target,card,evt.player,player)/(isMe?1.35:1); + if (!event.targets.length) event.goto(3); + ("step 1"); + event.target = event.targets.shift(); + event.target + .chooseButton([event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true) + .set("ai", function (button) { + var player = _status.event.player; + var evt = _status.event.getParent("old_guhuo_guess"), + evtx = evt.getTrigger(); + if (!evt) return Math.random(); + var card = { name: evtx.card.name, nature: evtx.card.nature, isCard: true }; + var ally = button.link[2] == "reguhuo_ally"; + if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; + if (!ally && get.effect(player, { name: "losehp" }, player, player) >= 0) + return 10; + if (!ally && get.attitude(player, evt.player) < 0) { + if (evtx.name == "useCard") { + var eff = 0; + var targetsx = evtx.targets || []; + for (var target of targetsx) { + var isMe = target == evt.player; + eff += + get.effect(target, card, evt.player, player) / (isMe ? 1.35 : 1); + } + eff /= 1.5 * targetsx.length || 1; + if (eff > 0) return 0; + if (eff < -7) + return ( + (Math.random() + Math.pow(-(eff + 7) / 8, 2)) / + Math.sqrt(evt.betrayers.length + 1) + + (player.hp - 3) * 0.05 + + Math.max(0, 4 - evt.player.hp) * 0.05 - + (player.hp == 1 && !get.tag(card, "damage") ? 0.2 : 0) + ); + return ( + Math.pow( + (get.value(card, evt.player, "raw") - 4) / (eff == 0 ? 3.1 : 10), + 2 + ) / + Math.sqrt(evt.betrayers.length || 1) + + (player.hp - 3) * 0.05 + + Math.max(0, 4 - evt.player.hp) * 0.05 + ); } - eff/=(1.5*targetsx.length)||1; - if(eff>0) return 0; - if(eff<-7) return (Math.random()+Math.pow(-(eff+7)/8,2))/Math.sqrt(evt.betrayers.length+1)+(player.hp-3)*0.05+Math.max(0,4-evt.player.hp)*0.05-(player.hp==1&&!get.tag(card,'damage')?0.2:0); - return Math.pow((get.value(card,evt.player,'raw')-4)/(eff==0?3.1:10),2)/Math.sqrt(evt.betrayers.length||1)+(player.hp-3)*0.05+Math.max(0,4-evt.player.hp)*0.05; + if ( + evt.player + .getStorage("old_guhuo_cheated") + .includes(card.name + card.nature) + ) + return Math.random() + 0.3; } - if(evt.player.getStorage('old_guhuo_cheated').includes(card.name+card.nature)) return Math.random()+0.3; - } - return Math.random(); - }); - 'step 2' - if(result.links[0][2]=='reguhuo_betray'){ + return Math.random(); + }); + ("step 2"); + if (result.links[0][2] == "reguhuo_betray") { target.addExpose(0.2); - game.log(target,'#y质疑'); - target.popup('质疑!','fire'); + game.log(target, "#y质疑"); + target.popup("质疑!", "fire"); event.betrayers.push(target); + } else { + game.log(target, "#g不质疑"); + target.popup("不质疑", "wood"); } - else{ - game.log(target,'#g不质疑'); - target.popup('不质疑','wood'); - } - if(targets.length) event.goto(1); - 'step 3' + if (targets.length) event.goto(1); + ("step 3"); game.delayx(); - game.broadcastAll(function(onEnd){ - _status.event.onEnd01=onEnd; - if(_status.old_guhuoNode) _status.old_guhuoNode.listenTransition(onEnd,300); - },event.onEnd01); - 'step 4' + game.broadcastAll(function (onEnd) { + _status.event.onEnd01 = onEnd; + if (_status.old_guhuoNode) _status.old_guhuoNode.listenTransition(onEnd, 300); + }, event.onEnd01); + ("step 4"); game.delay(2); - 'step 5' - if(!event.betrayers.length){ + ("step 5"); + if (!event.betrayers.length) { event.goto(7); } - 'step 6' - if(event.fake){ - for(var target of event.betrayers){ - target.popup('质疑正确','wood'); + ("step 6"); + if (event.fake) { + for (var target of event.betrayers) { + target.popup("质疑正确", "wood"); } - event.goon=false; - } - else{ - for(var target of event.betrayers){ - target.popup('质疑错误','fire'); + event.goon = false; + } else { + for (var target of event.betrayers) { + target.popup("质疑错误", "fire"); target.loseHp(); } - if(get.suit(trigger.cards[0],player)!='heart'){ - event.goon=false; + if (get.suit(trigger.cards[0], player) != "heart") { + event.goon = false; } } - 'step 7' - if(!event.goon){ - game.log(player,'声明的',trigger.card,'作废了'); + ("step 7"); + if (!event.goon) { + game.log(player, "声明的", trigger.card, "作废了"); trigger.cancel(); trigger.getParent().goto(0); - trigger.line=false; + trigger.line = false; } - 'step 8' + ("step 8"); game.delay(); - 'step 9' - if(!event.goon){ - if(event.fake) game.asyncDraw(event.betrayers); + ("step 9"); + if (!event.goon) { + if (event.fake) game.asyncDraw(event.betrayers); game.broadcastAll(ui.clear); } }, }, - old_zuilun:{ - audio:'xinfu_zuilun', - subSkill:{ - e:{}, - h:{}, + old_zuilun: { + audio: "xinfu_zuilun", + subSkill: { + e: {}, + h: {}, }, - enable:"phaseUse", - usable:2, - filterTarget:function(card,player,target){ - if(player==target) return false; - var pos='he'; - if(player.hasSkill('old_zuilun_h')) pos='e'; - if(player.hasSkill('old_zuilun_e')) pos='h'; - return target.countGainableCards(player,pos)>0; + enable: "phaseUse", + usable: 2, + filterTarget: function (card, player, target) { + if (player == target) return false; + var pos = "he"; + if (player.hasSkill("old_zuilun_h")) pos = "e"; + if (player.hasSkill("old_zuilun_e")) pos = "h"; + return target.countGainableCards(player, pos) > 0; }, - content:function(){ - 'step 0' - var pos='he'; - if(player.hasSkill('old_zuilun_h')) pos='e'; - if(player.hasSkill('old_zuilun_e')) pos='h'; - player.gainPlayerCard(target,pos,true); - 'step 1' - if(result.bool&&result.cards&&result.cards.length){ + content: function () { + "step 0"; + var pos = "he"; + if (player.hasSkill("old_zuilun_h")) pos = "e"; + if (player.hasSkill("old_zuilun_e")) pos = "h"; + player.gainPlayerCard(target, pos, true); + ("step 1"); + if (result.bool && result.cards && result.cards.length) { target.draw(); - var pos=result.cards[0].original; - if(pos=='h'||pos=='e') player.addTempSkill('old_zuilun_'+pos,'phaseUseAfter'); + var pos = result.cards[0].original; + if (pos == "h" || pos == "e") + player.addTempSkill("old_zuilun_" + pos, "phaseUseAfter"); } }, - ai:{ - order:7, - result:{ - target:-1, + ai: { + order: 7, + result: { + target: -1, }, }, }, - old_fuyin:{ - mod:{ - targetEnabled:function(card,player,target){ - if((card.name=='juedou'||card.name=='sha'||card.name=='huogong')&&player!=target&&player.countCards('h')>=target.countCards('h')&&target.hasEmptySlot(2)) return false; + old_fuyin: { + mod: { + targetEnabled: function (card, player, target) { + if ( + (card.name == "juedou" || card.name == "sha" || card.name == "huogong") && + player != target && + player.countCards("h") >= target.countCards("h") && + target.hasEmptySlot(2) + ) + return false; }, }, }, - old_jijun:{ - marktext:"方", - audio:"xinfu_jijun", - intro:{ - content:"expansion", - markcount:'expansion', + old_jijun: { + marktext: "方", + audio: "xinfu_jijun", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - enable:"phaseUse", - filterCard:true, - selectCard:[1,Infinity], - filter:function(event,player){ - return player.countCards('h')>0; + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + filter: function (event, player) { + return player.countCards("h") > 0; }, - check:function(card){ - var player=_status.event.player; - if((36-player.getExpansions('old_jijun').length)<=player.countCards('h')) return 1; - return 5-get.value(card); + check: function (card) { + var player = _status.event.player; + if (36 - player.getExpansions("old_jijun").length <= player.countCards("h")) return 1; + return 5 - get.value(card); }, - discard:false, - lose:false, - content:function(){ - player.addToExpansion(cards,player,'give').gaintag.add('old_jijun'); + discard: false, + lose: false, + content: function () { + player.addToExpansion(cards, player, "give").gaintag.add("old_jijun"); }, - ai:{order:1,result:{player:1}}, + ai: { order: 1, result: { player: 1 } }, }, - old_fangtong:{ - trigger:{ - player:"phaseJieshuBegin", + old_fangtong: { + trigger: { + player: "phaseJieshuBegin", }, - audio:"xinfu_fangtong", - forced:true, - skillAnimation:true, - animationColor:'metal', - filter:function(event,player){ - return (player.getExpansions('old_jijun').length>35); + audio: "xinfu_fangtong", + forced: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + return player.getExpansions("old_jijun").length > 35; }, - content:function(){ - var winners=player.getFriends(); - game.over(player==game.me||winners.includes(game.me)); + content: function () { + var winners = player.getFriends(); + game.over(player == game.me || winners.includes(game.me)); }, }, - oldanxu:{ - enable:'phaseUse', - usable:1, - multitarget:true, - audio:2, - filterTarget:function(card,player,target){ - if(player==target) return false; - var num=target.countCards('h'); - if(ui.selected.targets.length){ - return numplayers[i].countCards('h')) return true; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; } return false; }, - selectTarget:2, - content:function(){ - 'step 0' - var gainner,giver; - if(targets[0].countCards('h')0) return -1; - var players=game.filterPlayer(); - for(var i=0;i=0&&num2 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (att2 >= 0 && num2 < num) return -1; } return 0; - } - else{ + } else { return 1; } }, - player:0.1 - } - } + player: 0.1, + }, + }, }, - oldfaen:{ - audio:'faen', - trigger:{global:['turnOverAfter','linkAfter']}, - filter:function(event,player){ - if(event.name=='link') return event.player.isLinked(); + oldfaen: { + audio: "faen", + trigger: { global: ["turnOverAfter", "linkAfter"] }, + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); return true; }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.player.draw(); }, - ai:{ - expose:0.2 - } + ai: { + expose: 0.2, + }, }, - oldxuanfeng:{ - audio:'xuanfeng', - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + oldxuanfeng: { + audio: "xuanfeng", + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; + direct: true, + filter: function (event, player) { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('oldxuanfeng'),function(card,player,target){ - if(target==player) return false; - return get.distance(player,target)<=1||player.canUse('sha',target,false); - }).set('ai',function(target){ - if(get.distance(player,target)<=1){ - return get.damageEffect(target,player,player)*2; - } - else{ - return get.effect(target,{name:'sha'},player,player); - } - }); - 'step 1' - if(result.bool){ - player.logSkill('oldxuanfeng',result.targets); - var target=result.targets[0]; - var distance=get.distance(player,target); - if(distance<=1&&player.canUse('sha',target,false)){ - player.chooseControl('出杀','造成伤害').set('ai',function(){ - return '造成伤害'; + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("oldxuanfeng"), function (card, player, target) { + if (target == player) return false; + return get.distance(player, target) <= 1 || player.canUse("sha", target, false); + }) + .set("ai", function (target) { + if (get.distance(player, target) <= 1) { + return get.damageEffect(target, player, player) * 2; + } else { + return get.effect(target, { name: "sha" }, player, player); + } + }); + ("step 1"); + if (result.bool) { + player.logSkill("oldxuanfeng", result.targets); + var target = result.targets[0]; + var distance = get.distance(player, target); + if (distance <= 1 && player.canUse("sha", target, false)) { + player.chooseControl("出杀", "造成伤害").set("ai", function () { + return "造成伤害"; }); - event.target=target; - } - else if(distance<=1){ + event.target = target; + } else if (distance <= 1) { target.damage(); event.finish(); - } - else{ - player.useCard({name:'sha',isCard:true},target,false).animate=false; + } else { + player.useCard({ name: "sha", isCard: true }, target, false).animate = false; game.delay(); event.finish(); } - } - else{ + } else { event.finish(); } - 'step 2' - var target=event.target; - if(result.control=='出杀'){ - player.useCard({name:'sha',isCard:true},target,false).animate=false; + ("step 2"); + var target = event.target; + if (result.control == "出杀") { + player.useCard({ name: "sha", isCard: true }, target, false).animate = false; game.delay(); - } - else{ + } else { target.damage(); } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip') return [1,3]; - } + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip") return [1, 3]; + }, }, - reverseEquip:true, - noe:true - } + reverseEquip: true, + noe: true, + }, }, }, - translate:{ - old_zhangxingcai:'旧张星彩', - old_zhangxingcai_prefix:'旧', - old_xusheng:'旧徐盛', - old_xusheng_prefix:'旧', - old_lingtong:'旧凌统', - old_lingtong_prefix:'旧', - old_zhuran:'旧朱然', - old_zhuran_prefix:'旧', - old_caoxiu:'旧曹休', - old_caoxiu_prefix:'旧', - old_caozhen:'旧曹真', - old_caozhen_prefix:'旧', - old_maliang:'旧马良', - old_maliang_prefix:'旧', - old_chenqun:'旧陈群', - old_chenqun_prefix:'旧', - old_zhuhuan:'旧朱桓', - old_zhuhuan_prefix:'旧', - old_zhuzhi:'旧朱治', - old_zhuzhi_prefix:'旧', - old_zhugezhan:'旧诸葛瞻', - old_zhugezhan_prefix:'旧', - yuji:'旧于吉', - yuji_prefix:'旧', - old_zhangfei:'新杀张飞', - old_zhangfei_prefix:'新杀', - old_huatuo:'OL华佗', - old_huatuo_prefix:'OL', - old_guanyu:'旧关羽', - old_guanyu_prefix:'旧', - ol_zhangrang:'旧张让', - ol_zhangrang_prefix:'旧', - ol_liaohua:'OL廖化', - ol_liaohua_prefix:'OL', - ol_zhuran:'OL朱然', - ol_zhuran_prefix:'OL', - ol_manchong:'OL满宠', - ol_manchong_prefix:'OL', - old_fuhuanghou:'旧伏寿', - old_fuhuanghou_prefix:'旧', - old_caochong:'旧曹冲', - old_caochong_prefix:'旧', - old_guanqiujian:'旧毌丘俭', - old_guanqiujian_prefix:'旧', - old_wangyun:'旧王允', - old_wangyun_prefix:'旧', - old_zhaoyun:'新杀赵云', - old_zhaoyun_prefix:'新杀', - ol_huaxiong:'旧华雄', - ol_huaxiong_prefix:'旧', - old_xiaoqiao:'旧小乔', - old_xiaoqiao_prefix:'旧', - old_wanglang:'旧王朗', - old_wanglang_prefix:'旧', - old_wangyi:'旧王异', - old_wangyi_prefix:'旧', - xin_yujin:'节钺于禁', - xin_yujin_prefix:'节钺', - re_yujin:'毅重于禁', - re_yujin_prefix:'毅重', + translate: { + old_zhangxingcai: "旧张星彩", + old_zhangxingcai_prefix: "旧", + old_xusheng: "旧徐盛", + old_xusheng_prefix: "旧", + old_lingtong: "旧凌统", + old_lingtong_prefix: "旧", + old_zhuran: "旧朱然", + old_zhuran_prefix: "旧", + old_caoxiu: "旧曹休", + old_caoxiu_prefix: "旧", + old_caozhen: "旧曹真", + old_caozhen_prefix: "旧", + old_maliang: "旧马良", + old_maliang_prefix: "旧", + old_chenqun: "旧陈群", + old_chenqun_prefix: "旧", + old_zhuhuan: "旧朱桓", + old_zhuhuan_prefix: "旧", + old_zhuzhi: "旧朱治", + old_zhuzhi_prefix: "旧", + old_zhugezhan: "旧诸葛瞻", + old_zhugezhan_prefix: "旧", + yuji: "旧于吉", + yuji_prefix: "旧", + old_zhangfei: "新杀张飞", + old_zhangfei_prefix: "新杀", + old_huatuo: "OL华佗", + old_huatuo_prefix: "OL", + old_guanyu: "旧关羽", + old_guanyu_prefix: "旧", + ol_zhangrang: "旧张让", + ol_zhangrang_prefix: "旧", + ol_liaohua: "OL廖化", + ol_liaohua_prefix: "OL", + ol_zhuran: "OL朱然", + ol_zhuran_prefix: "OL", + ol_manchong: "OL满宠", + ol_manchong_prefix: "OL", + old_fuhuanghou: "旧伏寿", + old_fuhuanghou_prefix: "旧", + old_caochong: "旧曹冲", + old_caochong_prefix: "旧", + old_guanqiujian: "旧毌丘俭", + old_guanqiujian_prefix: "旧", + old_wangyun: "旧王允", + old_wangyun_prefix: "旧", + old_zhaoyun: "新杀赵云", + old_zhaoyun_prefix: "新杀", + ol_huaxiong: "旧华雄", + ol_huaxiong_prefix: "旧", + old_xiaoqiao: "旧小乔", + old_xiaoqiao_prefix: "旧", + old_wanglang: "旧王朗", + old_wanglang_prefix: "旧", + old_wangyi: "旧王异", + old_wangyi_prefix: "旧", + xin_yujin: "节钺于禁", + xin_yujin_prefix: "节钺", + re_yujin: "毅重于禁", + re_yujin_prefix: "毅重", - old_guhuo:"蛊惑", - old_guhuo_info:"你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,体力值不为0的其他角色依次选择是否质疑。然后,若有质疑的角色,你展示此牌:若为假,此牌作废,这些角色摸一张牌;若为真,这些角色失去1点体力,且若此牌不为♥,此牌作废。", - old_guhuo_guess:"蛊惑", - old_jijun:"集军", - old_jijun_info:"出牌阶段,你可以将任意张手牌置于武将牌上,称为“方”。", - old_fangtong:"方统", - old_fangtong_info:"锁定技。结束阶段,若你的“方”数目不小于36,则以你的阵营胜利结束本局游戏。", - old_zuilun:"罪论", - old_zuilun_info:"出牌阶段,你可以获得一名其他角色的一张牌(手牌、装备区各一次),然后该角色摸一张牌。", - old_fuyin:"父荫", - old_fuyin_info:"锁定技。若你的装备区里没有防具牌,你不能成为手牌数不小于你的其他角色使用【杀】、【决斗】或【火攻】的目标。", - oldanxu:'安恤', - oldanxu_info:'出牌阶段限一次。你可以选择手牌数不相等的两名其他角色,其中手牌少的角色获得手牌多的角色的一张手牌并展示之,然后若此牌不为黑桃,你摸一张牌。', - oldfaen:'法恩', - oldfaen_info:'当一名角色翻面或横置后,你可以令其摸一张牌。', - oldxuanfeng:'旋风', - oldxuanfeng_info:'当你失去装备区里的牌后,你可以选择一项:1.视为对一名其他角色使用一张【杀】;2.对一名距离为1的角色造成1点伤害。', - ol_yuanshu:'旧袁术', - ol_yuanshu_prefix:'旧', - fazheng:'旧法正', - fazheng_prefix:'旧', - junk_simayi:'旧晋司马懿', - junk_simayi_prefix:'旧晋', - madai:'旧马岱', - madai_prefix:'旧', - old_yangzhi:'旧杨芷', - old_yangzhi_prefix:'旧', - old_yangyan:'旧杨艳', - old_yangyan_prefix:'旧', - old_caorui:'旧曹叡', - old_caorui_prefix:'旧', - oldmingjian:'明鉴', - oldmingjian_info:'出牌阶段开始前,你可以跳过此阶段并将所有手牌交给一名其他角色。若如此做,你结束当前回合,然后其获得一个额外的回合(仅包含出牌阶段)。', - old_handang:'旧韩当', - old_handang_prefix:'旧', - oldgongji:'弓骑', - oldgongji_info:'你可以将一张装备牌当做无距离限制的【杀】使用或打出。', - oldjiefan:'解烦', - oldjiefan_info:'当一名角色A于你的回合外处于濒死状态时,你可以对当前回合角色使用一张【杀】。当此【杀】造成伤害时,你防止此伤害,视为对A使用一张【桃】。', - old_gaoshun:'旧高顺', - old_gaoshun_prefix:'旧', - old_liubiao:'旧刘表', - old_liubiao_prefix:'旧', - oldre_liubiao:'RE刘表', - oldre_liubiao_prefix:'RE', - oldzishou:'自守', - oldzishou_info:'摸牌阶段,若你已受伤,你可令额定摸牌数+X(X为你已损失的体力值),然后跳过下一个出牌阶段。', - old_huanghao:'旧黄皓', - old_huanghao_prefix:'旧', - oldqinqing:'寝情', - oldqinqing_info:'结束阶段,你可以选择一名攻击范围内含有主公的其他角色,然后你弃置该角色的一张牌(无牌则不弃),并令其摸一张牌。若该角色的手牌数大于主公,你摸一张牌。', - oldhuisheng:'贿生', - oldhuisheng_info:'每名角色限一次。当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张并防止此伤害;2.弃置等量的牌。', - old_dingfeng:'旧丁奉', - old_dingfeng_prefix:'旧', - junk_sunquan:'旧神孙权', - junk_sunquan_prefix:'旧神', - new_caoren:'旧曹仁', - new_caoren_prefix:'旧', - old_liyan:'旧李严', - old_liyan_prefix:'旧', - old_chendao:'旧陈到', - old_chendao_prefix:'旧', - old_caocao:'旧神曹操', - old_caocao_prefix:'旧神', - junkguixin:'归心', - junkguixin_info:'回合结束时,你可以选择一项:①获得剩余武将牌堆的所有主公技的其中一个技能;②更改一名其他角色的势力。', - old_caochun:'旧曹纯', - old_caochun_prefix:'旧', - old_guanyinping:'旧关银屏', - old_guanyinping_prefix:'旧', - old_shen_zhaoyun:'旧神赵云', - old_shen_zhaoyun_prefix:'旧神', - oldjuejing:'绝境', - oldjuejing_info:'锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。', - oldlonghun:'龙魂', - oldlonghun_info:'你可以将花色相同的Y张牌按下列规则使用或打出:♥当【桃】,♦当火【杀】,♣当【闪】,♠当普【无懈可击】(Y为你的体力值且至少为1)。', - panfeng:'旧潘凤', - panfeng_prefix:'旧', - old_shixie:'旧士燮', - old_shixie_prefix:'旧', + old_guhuo: "蛊惑", + old_guhuo_info: + "你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,体力值不为0的其他角色依次选择是否质疑。然后,若有质疑的角色,你展示此牌:若为假,此牌作废,这些角色摸一张牌;若为真,这些角色失去1点体力,且若此牌不为♥,此牌作废。", + old_guhuo_guess: "蛊惑", + old_jijun: "集军", + old_jijun_info: "出牌阶段,你可以将任意张手牌置于武将牌上,称为“方”。", + old_fangtong: "方统", + old_fangtong_info: "锁定技。结束阶段,若你的“方”数目不小于36,则以你的阵营胜利结束本局游戏。", + old_zuilun: "罪论", + old_zuilun_info: + "出牌阶段,你可以获得一名其他角色的一张牌(手牌、装备区各一次),然后该角色摸一张牌。", + old_fuyin: "父荫", + old_fuyin_info: + "锁定技。若你的装备区里没有防具牌,你不能成为手牌数不小于你的其他角色使用【杀】、【决斗】或【火攻】的目标。", + oldanxu: "安恤", + oldanxu_info: + "出牌阶段限一次。你可以选择手牌数不相等的两名其他角色,其中手牌少的角色获得手牌多的角色的一张手牌并展示之,然后若此牌不为黑桃,你摸一张牌。", + oldfaen: "法恩", + oldfaen_info: "当一名角色翻面或横置后,你可以令其摸一张牌。", + oldxuanfeng: "旋风", + oldxuanfeng_info: + "当你失去装备区里的牌后,你可以选择一项:1.视为对一名其他角色使用一张【杀】;2.对一名距离为1的角色造成1点伤害。", + ol_yuanshu: "旧袁术", + ol_yuanshu_prefix: "旧", + fazheng: "旧法正", + fazheng_prefix: "旧", + junk_simayi: "旧晋司马懿", + junk_simayi_prefix: "旧晋", + madai: "旧马岱", + madai_prefix: "旧", + old_yangzhi: "旧杨芷", + old_yangzhi_prefix: "旧", + old_yangyan: "旧杨艳", + old_yangyan_prefix: "旧", + old_caorui: "旧曹叡", + old_caorui_prefix: "旧", + oldmingjian: "明鉴", + oldmingjian_info: + "出牌阶段开始前,你可以跳过此阶段并将所有手牌交给一名其他角色。若如此做,你结束当前回合,然后其获得一个额外的回合(仅包含出牌阶段)。", + old_handang: "旧韩当", + old_handang_prefix: "旧", + oldgongji: "弓骑", + oldgongji_info: "你可以将一张装备牌当做无距离限制的【杀】使用或打出。", + oldjiefan: "解烦", + oldjiefan_info: + "当一名角色A于你的回合外处于濒死状态时,你可以对当前回合角色使用一张【杀】。当此【杀】造成伤害时,你防止此伤害,视为对A使用一张【桃】。", + old_gaoshun: "旧高顺", + old_gaoshun_prefix: "旧", + old_liubiao: "旧刘表", + old_liubiao_prefix: "旧", + oldre_liubiao: "RE刘表", + oldre_liubiao_prefix: "RE", + oldzishou: "自守", + oldzishou_info: + "摸牌阶段,若你已受伤,你可令额定摸牌数+X(X为你已损失的体力值),然后跳过下一个出牌阶段。", + old_huanghao: "旧黄皓", + old_huanghao_prefix: "旧", + oldqinqing: "寝情", + oldqinqing_info: + "结束阶段,你可以选择一名攻击范围内含有主公的其他角色,然后你弃置该角色的一张牌(无牌则不弃),并令其摸一张牌。若该角色的手牌数大于主公,你摸一张牌。", + oldhuisheng: "贿生", + oldhuisheng_info: + "每名角色限一次。当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张并防止此伤害;2.弃置等量的牌。", + old_dingfeng: "旧丁奉", + old_dingfeng_prefix: "旧", + junk_sunquan: "旧神孙权", + junk_sunquan_prefix: "旧神", + new_caoren: "旧曹仁", + new_caoren_prefix: "旧", + old_liyan: "旧李严", + old_liyan_prefix: "旧", + old_chendao: "旧陈到", + old_chendao_prefix: "旧", + old_caocao: "旧神曹操", + old_caocao_prefix: "旧神", + junkguixin: "归心", + junkguixin_info: + "回合结束时,你可以选择一项:①获得剩余武将牌堆的所有主公技的其中一个技能;②更改一名其他角色的势力。", + old_caochun: "旧曹纯", + old_caochun_prefix: "旧", + old_guanyinping: "旧关银屏", + old_guanyinping_prefix: "旧", + old_shen_zhaoyun: "旧神赵云", + old_shen_zhaoyun_prefix: "旧神", + oldjuejing: "绝境", + oldjuejing_info: "锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。", + oldlonghun: "龙魂", + oldlonghun_info: + "你可以将花色相同的Y张牌按下列规则使用或打出:♥当【桃】,♦当火【杀】,♣当【闪】,♠当普【无懈可击】(Y为你的体力值且至少为1)。", + panfeng: "旧潘凤", + panfeng_prefix: "旧", + old_shixie: "旧士燮", + old_shixie_prefix: "旧", - old_standard:'标准包', - old_shenhua:'神话再临', - old_refresh:'界限突破', - old_yijiang1:'一将成名2011', - old_yijiang2:'一将成名2012', - old_yijiang3:'一将成名2013', - old_yijiang4:'一将成名2014', - old_yijiang5:'一将成名2015', - old_yijiang67:'原创设计', - old_sp:'SP', - old_yingbian:'文德武备', - old_mobile:'移动版', - } + old_standard: "标准包", + old_shenhua: "神话再临", + old_refresh: "界限突破", + old_yijiang1: "一将成名2011", + old_yijiang2: "一将成名2012", + old_yijiang3: "一将成名2013", + old_yijiang4: "一将成名2014", + old_yijiang5: "一将成名2015", + old_yijiang67: "原创设计", + old_sp: "SP", + old_yingbian: "文德武备", + old_mobile: "移动版", + }, }; }); diff --git a/character/onlyOL.js b/character/onlyOL.js index 79c15ebde..ee7c36f75 100644 --- a/character/onlyOL.js +++ b/character/onlyOL.js @@ -1,619 +1,899 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'onlyOL', - connect:true, - character:{ - ol_sb_jiangwei:['male','shu',4,['olsbzhuri','olsbranji']], - ol_caozhang:['male','wei',4,['oljiangchi'],['die_audio:xin_caozhang']], - ol_jianyong:['male','shu',3,['olqiaoshui','jyzongshi'],['tempname:re_jianyong','die_audio:re_jianyong']], - ol_lingtong:['male','wu',4,['olxuanfeng'],['die_audio:re_lingtong']], - ol_sb_guanyu:['male','shu',4,['olsbweilin','olsbduoshou']], - ol_sb_taishici:['male','wu',4,['olsbdulie','olsbdouchan']], - ol_gaoshun:['male','qun',4,['olxianzhen','decadejinjiu'],['die_audio:re_gaoshun']], - ol_sb_yuanshao:['male','qun',4,['olsbhetao','olsbshenli','olsbyufeng','olsbshishou'],['zhu']], - ol_yufan:['male','wu',3,['olzongxuan','olzhiyan'],['tempname:re_yufan','die_audio:re_yufan']], - ol_chengpu:['male','wu',4,['dclihuo','olchunlao'],['tempname:xin_chengpu','die_audio:xin_chengpu']], - ol_wangyi:['female','wei',3,['olzhenlie','olmiji']], + name: "onlyOL", + connect: true, + character: { + ol_sb_jiangwei: ["male", "shu", 4, ["olsbzhuri", "olsbranji"]], + ol_caozhang: ["male", "wei", 4, ["oljiangchi"], ["die_audio:xin_caozhang"]], + ol_jianyong: [ + "male", + "shu", + 3, + ["olqiaoshui", "jyzongshi"], + ["tempname:re_jianyong", "die_audio:re_jianyong"], + ], + ol_lingtong: ["male", "wu", 4, ["olxuanfeng"], ["die_audio:re_lingtong"]], + ol_sb_guanyu: ["male", "shu", 4, ["olsbweilin", "olsbduoshou"]], + ol_sb_taishici: ["male", "wu", 4, ["olsbdulie", "olsbdouchan"]], + ol_gaoshun: ["male", "qun", 4, ["olxianzhen", "decadejinjiu"], ["die_audio:re_gaoshun"]], + ol_sb_yuanshao: [ + "male", + "qun", + 4, + ["olsbhetao", "olsbshenli", "olsbyufeng", "olsbshishou"], + ["zhu"], + ], + ol_yufan: [ + "male", + "wu", + 3, + ["olzongxuan", "olzhiyan"], + ["tempname:re_yufan", "die_audio:re_yufan"], + ], + ol_chengpu: [ + "male", + "wu", + 4, + ["dclihuo", "olchunlao"], + ["tempname:xin_chengpu", "die_audio:xin_chengpu"], + ], + ol_wangyi: ["female", "wei", 3, ["olzhenlie", "olmiji"]], }, - characterSort:{ - onlyOL:{ - onlyOL_yijiang1:['ol_jianyong','ol_lingtong','ol_gaoshun'], - onlyOL_yijiang2:['ol_caozhang','ol_chengpu','ol_wangyi'], - onlyOL_yijiang3:['ol_yufan'], - onlyOL_sb:['ol_sb_jiangwei','ol_sb_guanyu','ol_sb_taishici','ol_sb_yuanshao'], + characterSort: { + onlyOL: { + onlyOL_yijiang1: ["ol_jianyong", "ol_lingtong", "ol_gaoshun"], + onlyOL_yijiang2: ["ol_caozhang", "ol_chengpu", "ol_wangyi"], + onlyOL_yijiang3: ["ol_yufan"], + onlyOL_sb: ["ol_sb_jiangwei", "ol_sb_guanyu", "ol_sb_taishici", "ol_sb_yuanshao"], }, }, - characterIntro:{ + characterIntro: {}, + characterReplace: {}, + characterSubstitute: { + ol_sb_yuanshao: [], }, - characterReplace:{ - }, - characterSubstitute:{ - ol_sb_yuanshao:[ - ], - }, - card:{ - sizhaojian:{ - derivation:'ol_sb_yuanshao', - fullskin:true, - type:'equip', - subtype:'equip1', - get destroy(){ + card: { + sizhaojian: { + derivation: "ol_sb_yuanshao", + fullskin: true, + type: "equip", + subtype: "equip1", + get destroy() { return !lib.card.sizhaojian.inShanShanFestival(); }, - inShanShanFestival(){ + inShanShanFestival() { //闪闪节外离开装备区会销毁 - const date=new Date(); - return date.getMonth()+1==3&&date.getDate()>=2&&date.getDate()<=15; + const date = new Date(); + return date.getMonth() + 1 == 3 && date.getDate() >= 2 && date.getDate() <= 15; }, - distance:{attackFrom:-1}, - ai:{basic:{equipValue:7}}, - skills:['olsbyufeng_sizhaojian'], + distance: { attackFrom: -1 }, + ai: { basic: { equipValue: 7 } }, + skills: ["olsbyufeng_sizhaojian"], }, }, - skill:{ + skill: { //王异 - olzhenlie:{ - audio:2, - inherit:'zhenlie', - async content(event,trigger,player){ - const target=trigger.player; - if(get.attitude(player,target)<0&&target.countDiscardableCards(player,'he')) player.addTempSkill('zhenlie_lose'); + olzhenlie: { + audio: 2, + inherit: "zhenlie", + async content(event, trigger, player) { + const target = trigger.player; + if (get.attitude(player, target) < 0 && target.countDiscardableCards(player, "he")) + player.addTempSkill("zhenlie_lose"); await player.loseHp(); - player.removeSkill('zhenlie_lose'); + player.removeSkill("zhenlie_lose"); trigger.getParent().excluded.add(player); - if(!player.isIn()) return; - const goon=target.hasCard(card=>{ - if(get.position(card)=='h') return true; - return lib.filter.canBeGained(card,player,target); - },'he'); - if(goon||player.isDamaged()){ + if (!player.isIn()) return; + const goon = target.hasCard((card) => { + if (get.position(card) == "h") return true; + return lib.filter.canBeGained(card, player, target); + }, "he"); + if (goon || player.isDamaged()) { let result; - if(goon&&player.isDamaged()) result=await player.chooseControl().set('choiceList',[ - '获得'+get.translation(target)+'的一张牌', - '发动一次〖秘计〗', - ]).set('ai',()=>{ - const player=get.event('player'),target=get.event().getTrigger().player; - return get.effect(target,{name:'shunshou_copy2'},player,player)>get.effect(player,{name:'draw'},player,player)*player.getDamagedHp()?0:1 - }).forResult(); - else result={index:goon?0:1}; - if(result.index==0){ - await player.gainPlayerCard(target,'he',true); - } - else{ - await player.useSkill('olmiji'); + if (goon && player.isDamaged()) + result = await player + .chooseControl() + .set("choiceList", [ + "获得" + get.translation(target) + "的一张牌", + "发动一次〖秘计〗", + ]) + .set("ai", () => { + const player = get.event("player"), + target = get.event().getTrigger().player; + return get.effect(target, { name: "shunshou_copy2" }, player, player) > + get.effect(player, { name: "draw" }, player, player) * + player.getDamagedHp() + ? 0 + : 1; + }) + .forResult(); + else result = { index: goon ? 0 : 1 }; + if (result.index == 0) { + await player.gainPlayerCard(target, "he", true); + } else { + await player.useSkill("olmiji"); } } }, }, - olmiji:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ + olmiji: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { return player.isDamaged(); }, - async content(event,trigger,player){ - let num=player.getDamagedHp(); + async content(event, trigger, player) { + let num = player.getDamagedHp(); await player.draw(num); - if(player.countCards('he')&&game.hasPlayer(target=>target!=player)){ - if(_status.connectMode) game.broadcastAll(()=>_status.noclearcountdown=true); - let given_map=[]; - while(num>0&&player.hasCard(card=>!card.hasGaintag('olsujian_given'),'he')){ - const {result:{bool,cards,targets}}=await player.chooseCardTarget({ - filterCard(card,player){ - return !card.hasGaintag('olsujian_given'); + if (player.countCards("he") && game.hasPlayer((target) => target != player)) { + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + let given_map = []; + while ( + num > 0 && + player.hasCard((card) => !card.hasGaintag("olsujian_given"), "he") + ) { + const { + result: { bool, cards, targets }, + } = await player.chooseCardTarget({ + filterCard(card, player) { + return !card.hasGaintag("olsujian_given"); }, - selectCard:[1,num], - position:'he', - filterTarget:lib.filter.notMe, - prompt:'秘计:请选择要分配的卡牌和目标', - prompt2:'(还可分配'+num+'张)', - ai1(card){ - return (!ui.selected.cards.length&&card.name=='du')?1:0; + selectCard: [1, num], + position: "he", + filterTarget: lib.filter.notMe, + prompt: "秘计:请选择要分配的卡牌和目标", + prompt2: "(还可分配" + num + "张)", + ai1(card) { + return !ui.selected.cards.length && card.name == "du" ? 1 : 0; }, - ai2(target){ - const player=get.event('player'); - const card=ui.selected.cards[0]; - if(card) return get.value(card,target)*get.attitude(player,target); + ai2(target) { + const player = get.event("player"); + const card = ui.selected.cards[0]; + if (card) return get.value(card, target) * get.attitude(player, target); return 0; }, }); - if(bool){ - num-=cards.length; - const target=targets[0]; - if(given_map.some(i=>i[0]==target)){ - given_map[given_map.indexOf(given_map.find(i=>i[0]==target))][1].addArray(cards); - } - else given_map.push([target,cards]); - player.addGaintag(cards,'olsujian_given'); - } - else break; + if (bool) { + num -= cards.length; + const target = targets[0]; + if (given_map.some((i) => i[0] == target)) { + given_map[ + given_map.indexOf(given_map.find((i) => i[0] == target)) + ][1].addArray(cards); + } else given_map.push([target, cards]); + player.addGaintag(cards, "olsujian_given"); + } else break; } - if(_status.connectMode){ - game.broadcastAll(()=>{ + if (_status.connectMode) { + game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose(); }); } - if(given_map.length){ - await game.loseAsync({ - gain_list:given_map, - player:player, - cards:given_map.slice().map(list=>list[1]), - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); + if (given_map.length) { + await game + .loseAsync({ + gain_list: given_map, + player: player, + cards: given_map.slice().map((list) => list[1]), + giver: player, + animate: "giveAuto", + }) + .setContent("gaincardMultiple"); } } }, }, //程普 - dclihuo:{ - audio:'relihuo', - trigger:{player:'useCard1'}, - filter(event,player){ - return event.card.name=='sha'&&!game.hasNature(event.card,'fire'); + dclihuo: { + audio: "relihuo", + trigger: { player: "useCard1" }, + filter(event, player) { + return event.card.name == "sha" && !game.hasNature(event.card, "fire"); }, - check(event,player){ - let card=new lib.element.VCard(get.copy(event.card)); - game.setNature(card,'fire'); - const eff1=event.targets.reduce((sum,target)=>{ - return sum+get.effect(target,event.card,player,player); - },0); - let targets=event.targets.slice(); - if(get.info('lihuo2').filter(event,player)){ - let targetx=game.filterPlayer(target=>{ - return !targets.includes(target)&&player.canUse(card,target)&&get.effect(target,card,player,player)>0; + check(event, player) { + let card = new lib.element.VCard(get.copy(event.card)); + game.setNature(card, "fire"); + const eff1 = event.targets.reduce((sum, target) => { + return sum + get.effect(target, event.card, player, player); + }, 0); + let targets = event.targets.slice(); + if (get.info("lihuo2").filter(event, player)) { + let targetx = game.filterPlayer((target) => { + return ( + !targets.includes(target) && + player.canUse(card, target) && + get.effect(target, card, player, player) > 0 + ); }); - if(targetx.length) targets.add(targetx.sort((a,b)=>{ - return get.effect(b,card,player,player)-get.effect(a,card,player,player); - })[0]); + if (targetx.length) + targets.add( + targetx.sort((a, b) => { + return ( + get.effect(b, card, player, player) - + get.effect(a, card, player, player) + ); + })[0] + ); } - const eff2=targets.reduce((sum,target)=>{ - return sum+get.effect(target,card,player,player); - },0); - return eff2>eff1; + const eff2 = targets.reduce((sum, target) => { + return sum + get.effect(target, card, player, player); + }, 0); + return eff2 > eff1; }, - content(){ - game.log(player,'将',trigger.card,'改为了火属性'); - game.setNature(trigger.card,'fire'); - player.when('useCardAfter').filter(evt=>evt==trigger).then(()=>{ - if(game.hasPlayer2(target=>{ - return target.getHistory('damage',evt=>evt.card&&evt.card==trigger.card).length; - })){ - player.chooseToDiscard('he','疠火:弃置一张牌,或失去1点体力').set('ai',card=>{ - const player=get.event('player'); - if((get.name(card)=='tao'||get.name(card)=='jiu')&&lib.filter.cardSavable(card,player,player)) return -1; - if(player.hp<=1){ - if(cards.length{ - return (get.name(cardx)=='tao'||get.name(cardx)=='jiu')&&lib.filter.cardSavable(cardx,player,player); - },'hs')) return 7-get.value(card); - return -1; - } - return 24-5*cards.length-2*Math.min(4,player.getHp())-get.value(card); - }); - } - else event.finish(); - }).then(()=>{ - if(!result.bool) player.loseHp(); - }); + content() { + game.log(player, "将", trigger.card, "改为了火属性"); + game.setNature(trigger.card, "fire"); + player + .when("useCardAfter") + .filter((evt) => evt == trigger) + .then(() => { + if ( + game.hasPlayer2((target) => { + return target.getHistory( + "damage", + (evt) => evt.card && evt.card == trigger.card + ).length; + }) + ) { + player + .chooseToDiscard("he", "疠火:弃置一张牌,或失去1点体力") + .set("ai", (card) => { + const player = get.event("player"); + if ( + (get.name(card) == "tao" || get.name(card) == "jiu") && + lib.filter.cardSavable(card, player, player) + ) + return -1; + if (player.hp <= 1) { + if ( + cards.length < player.getEnemies().length && + player.hasCard((cardx) => { + return ( + (get.name(cardx) == "tao" || + get.name(cardx) == "jiu") && + lib.filter.cardSavable(cardx, player, player) + ); + }, "hs") + ) + return 7 - get.value(card); + return -1; + } + return ( + 24 - + 5 * cards.length - + 2 * Math.min(4, player.getHp()) - + get.value(card) + ); + }); + } else event.finish(); + }) + .then(() => { + if (!result.bool) player.loseHp(); + }); }, - ai:{fireAttack:true}, - group:'dclihuo_add', - subSkill:{ - add:{ - inherit:'lihuo2', - async content(event,trigger,player){ - const {result:{bool,targets}}=await player.chooseTarget(get.prompt('dclihuo'),'为'+get.translation(trigger.card)+'增加一个目标',(card,player,target)=>{ - const trigger=get.event().getTrigger(); - return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); - }).set('card',trigger.card).set('ai',target=>{ - const player=get.event('player'),trigger=get.event().getTrigger(); - return get.effect(target,trigger.card,player,player); - }); - if(bool){ - player.logSkill('dclihuo',targets); + ai: { fireAttack: true }, + group: "dclihuo_add", + subSkill: { + add: { + inherit: "lihuo2", + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget( + get.prompt("dclihuo"), + "为" + get.translation(trigger.card) + "增加一个目标", + (card, player, target) => { + const trigger = get.event().getTrigger(); + return ( + !trigger.targets.includes(target) && + player.canUse(trigger.card, target) + ); + } + ) + .set("card", trigger.card) + .set("ai", (target) => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + if (bool) { + player.logSkill("dclihuo", targets); trigger.targets.addArray(targets); } }, }, }, }, - olchunlao:{ - audio:'chunlao', - audioname:['xin_chengpu'], - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + olchunlao: { + audio: "chunlao", + audioname: ["xin_chengpu"], + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - filter(event,player){ - if(event.type!='discard'||event.getlx===false) return false; - const evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.some(i=>i.name=='sha'&&get.position(i)=='d'); + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + const evt = event.getl(player); + return ( + evt && evt.cards2 && evt.cards2.some((i) => i.name == "sha" && get.position(i) == "d") + ); }, - forced:true, - locked:false, - content(){ - const evt=trigger.getl(player); - player.addToExpansion(evt.cards2.filter(i=>i.name=='sha'&&get.position(i)=='d'),'gain2').gaintag.add('olchunlao'); + forced: true, + locked: false, + content() { + const evt = trigger.getl(player); + player + .addToExpansion( + evt.cards2.filter((i) => i.name == "sha" && get.position(i) == "d"), + "gain2" + ) + .gaintag.add("olchunlao"); }, - ai:{ - effect:{ - player(card,player,target){ - if(_status.currentPhase!=player) return; - if(card.name=='sha'&&!player.getExpansions('olchunlao').length&&target.hp>1){ - return 'zeroplayertarget'; + ai: { + effect: { + player(card, player, target) { + if (_status.currentPhase != player) return; + if ( + card.name == "sha" && + !player.getExpansions("olchunlao").length && + target.hp > 1 + ) { + return "zeroplayertarget"; } }, }, }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'olchunlao_save', - subSkill:{ - save:{ - inherit:'chunlao2', - filter(event,player){ - return event.type=='dying'&&event.dying&&event.dying.hp<=0&&player.getExpansions('olchunlao').length; + group: "olchunlao_save", + subSkill: { + save: { + inherit: "chunlao2", + filter(event, player) { + return ( + event.type == "dying" && + event.dying && + event.dying.hp <= 0 && + player.getExpansions("olchunlao").length + ); }, - async content(event,trigger,player){ - const target=event.targets[0]; - const {result:{bool,links}}=await player.chooseCardButton(get.translation('olchunlao'),player.getExpansions('olchunlao'),true); - if(bool){ - player.logSkill('olchunlao',target); + async content(event, trigger, player) { + const target = event.targets[0]; + const { + result: { bool, links }, + } = await player.chooseCardButton( + get.translation("olchunlao"), + player.getExpansions("olchunlao"), + true + ); + if (bool) { + player.logSkill("olchunlao", target); await player.loseToDiscardpile(links); - event.type='dying'; - await target.useCard({name:'jiu',isCard:true},target); + event.type = "dying"; + await target.useCard({ name: "jiu", isCard: true }, target); } }, - ai:{ - save:true, - skillTagFilter(player){ - return player.getExpansions('olchunlao').length; + ai: { + save: true, + skillTagFilter(player) { + return player.getExpansions("olchunlao").length; }, - order:6, - result:{target:1}, + order: 6, + result: { target: 1 }, }, }, }, }, //虞翻 - olzongxuan:{ - audio:'rezongxuan', - trigger:{global:['loseAfter','loseAsyncAfter']}, - filter(event,player){ - if(event.type!='discard'||event.getlx===false) return false; - return get.info('olzongxuan').getCards(event,player).length; + olzongxuan: { + audio: "rezongxuan", + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + return get.info("olzongxuan").getCards(event, player).length; }, - check(event,player){ - if(event.getParent(3).name!='phaseDiscard') return false; - const cards=get.info('olzongxuan').getCards(event,player); - return game.hasPlayer(target=>{ - if(cards.some(i=>get.type(i,target)=='equip')&&(get.attitude(player,target)>0||get.recoverEffect(target,player,player)>0)) return true; - if(cards.some(i=>get.type(i,target)!='equip')&&target.getHp()>=player.getHp()&&get.effect(target,{name:'losehp'},player,player)>0) return true; + check(event, player) { + if (event.getParent(3).name != "phaseDiscard") return false; + const cards = get.info("olzongxuan").getCards(event, player); + return game.hasPlayer((target) => { + if ( + cards.some((i) => get.type(i, target) == "equip") && + (get.attitude(player, target) > 0 || + get.recoverEffect(target, player, player) > 0) + ) + return true; + if ( + cards.some((i) => get.type(i, target) != "equip") && + target.getHp() >= player.getHp() && + get.effect(target, { name: "losehp" }, player, player) > 0 + ) + return true; return false; }); }, - async content(event,trigger,player){ - const {result:{bool,moved}}=await player.chooseToMove('纵玄:将任意张牌置于牌堆顶',true).set('list',[ - ['本次弃置的牌',get.info('olzongxuan').getCards(trigger,player)], - ['牌堆顶'], - ]).set('filterOk',moved=>moved[1].length).set('processAI',list=>{ - const player=get.event('player'); - const cards=list[0][1].slice(),cards2=cards.filter(card=>{ - return game.hasPlayer(target=>{ - if(get.type(card,target)=='equip'&&(get.attitude(player,target)>0||get.recoverEffect(target,player,player)>0)) return true; - if(get.type(card,target)!='equip'&&target.getHp()>=player.getHp()&&get.effect(target,{name:'losehp'},player,player)>0) return true; - return false; - }); - }),cards3=(cards2.length?cards2.randomGet():cards.randomGet()); - return [[],[cards3]]; - }); - if(bool){ - let cards=moved[1].slice(); - game.log(player,'将',cards,'置于了牌堆顶'); - while(cards.length){ - ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); + async content(event, trigger, player) { + const { + result: { bool, moved }, + } = await player + .chooseToMove("纵玄:将任意张牌置于牌堆顶", true) + .set("list", [ + ["本次弃置的牌", get.info("olzongxuan").getCards(trigger, player)], + ["牌堆顶"], + ]) + .set("filterOk", (moved) => moved[1].length) + .set("processAI", (list) => { + const player = get.event("player"); + const cards = list[0][1].slice(), + cards2 = cards.filter((card) => { + return game.hasPlayer((target) => { + if ( + get.type(card, target) == "equip" && + (get.attitude(player, target) > 0 || + get.recoverEffect(target, player, player) > 0) + ) + return true; + if ( + get.type(card, target) != "equip" && + target.getHp() >= player.getHp() && + get.effect(target, { name: "losehp" }, player, player) > 0 + ) + return true; + return false; + }); + }), + cards3 = cards2.length ? cards2.randomGet() : cards.randomGet(); + return [[], [cards3]]; + }); + if (bool) { + let cards = moved[1].slice(); + game.log(player, "将", cards, "置于了牌堆顶"); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); } } }, - getCards(event,player){ - let cards=[]; - for(const target of [player,player.getPrevious()]){ - const evt=event.getl(target); - if(evt&&evt.cards2&&evt.cards2.some(i=>get.position(i)=='d')) cards.addArray(evt.cards2.filter(i=>get.position(i)=='d')); + getCards(event, player) { + let cards = []; + for (const target of [player, player.getPrevious()]) { + const evt = event.getl(target); + if (evt && evt.cards2 && evt.cards2.some((i) => get.position(i) == "d")) + cards.addArray(evt.cards2.filter((i) => get.position(i) == "d")); } return cards; }, }, - olzhiyan:{ - audio:'zhiyan', - audioname:['re_yufan'], - trigger:{global:'phaseJieshuBegin'}, - filter(event,player){ - return event.player==player||event.player==player.getPrevious(); + olzhiyan: { + audio: "zhiyan", + audioname: ["re_yufan"], + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + return event.player == player || event.player == player.getPrevious(); }, - direct:true, - async content(event,trigger,player){ - const {result:{bool,targets}}=await player.chooseTarget(get.prompt2('olzhiyan')).set('ai',target=>{ - const player=get.event('player'),cards=get.event('cards'); - if(!cards.length) return 0; - const card=cards[0],att=get.attitude(player,target); - if(get.type(card,target)=='equip'&&(get.attitude(player,target)>0||get.recoverEffect(target,player,player)>0)) return get.recoverEffect(target,player,player)*20+att/114514; - if(get.type(card,target)!='equip'){ - if(target.getHp()>=player.getHp()) return get.effect(target,{name:'losehp'},player,player)*20-att/114514; - return get.effect(target,{name:'draw'},player,player); - } - return 0; - }).set('cards',Array.from(ui.cardPile.childNodes||[])||[]); - if(bool){ - const target=targets[0]; - player.logSkill('olzhiyan',target); - const {result}=await target.draw('visible'); - if(result){ - const card=result[0]; - if(get.type(card,target)=='equip'){ - if(target.getCards('h').includes(card)&&target.hasUseTarget(card)){ - const {result:{bool}}=await target.chooseUseTarget(card,true,'nopopup'); - if(bool) await target.recover(); - } + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt2("olzhiyan")) + .set("ai", (target) => { + const player = get.event("player"), + cards = get.event("cards"); + if (!cards.length) return 0; + const card = cards[0], + att = get.attitude(player, target); + if ( + get.type(card, target) == "equip" && + (get.attitude(player, target) > 0 || + get.recoverEffect(target, player, player) > 0) + ) + return get.recoverEffect(target, player, player) * 20 + att / 114514; + if (get.type(card, target) != "equip") { + if (target.getHp() >= player.getHp()) + return ( + get.effect(target, { name: "losehp" }, player, player) * 20 - + att / 114514 + ); + return get.effect(target, { name: "draw" }, player, player); } - else if(target.getHp()>=player.getHp()) await target.loseHp(); + return 0; + }) + .set("cards", Array.from(ui.cardPile.childNodes || []) || []); + if (bool) { + const target = targets[0]; + player.logSkill("olzhiyan", target); + const { result } = await target.draw("visible"); + if (result) { + const card = result[0]; + if (get.type(card, target) == "equip") { + if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { + const { + result: { bool }, + } = await target.chooseUseTarget(card, true, "nopopup"); + if (bool) await target.recover(); + } + } else if (target.getHp() >= player.getHp()) await target.loseHp(); } } }, - ai:{expose:0.2}, + ai: { expose: 0.2 }, }, //OL谋袁绍 //真·四世三公——袁神,启动 - olsbhetao:{ - audio:3, - audioname:['ol_sb_yuanshao_shadow'], - trigger:{global:'useCardToPlayered'}, - filter(event,player){ - return event.player!=player&&event.isFirstTarget&&event.targets.length>1&&player.countCards('he',card=>{ - if(get.position(card)=='h'&&_status.connectMode) return true; - return get.color(card)==get.color(event.card)&&lib.filter.cardDiscardable(card,player); - }); + olsbhetao: { + audio: 3, + audioname: ["ol_sb_yuanshao_shadow"], + trigger: { global: "useCardToPlayered" }, + filter(event, player) { + return ( + event.player != player && + event.isFirstTarget && + event.targets.length > 1 && + player.countCards("he", (card) => { + if (get.position(card) == "h" && _status.connectMode) return true; + return ( + get.color(card) == get.color(event.card) && + lib.filter.cardDiscardable(card, player) + ); + }) + ); }, - direct:true, - async content(event,trigger,player){ - const {result:{bool,cards,targets}}=await player.chooseCardTarget({ - prompt:get.prompt('olsbhetao'), - filterCard(card,player){ - return get.color(card)==get.color(get.event().getTrigger().card)&&lib.filter.cardDiscardable(card,player); - }, - position:'he', - filterTarget(card,player,target){ - return get.event().getTrigger().targets.includes(target); - }, - ai1(card){ - return 7.5-get.value(card); - }, - ai2(target){ - const player=get.event('player'),trigger=get.event().getTrigger(); - const att=get.attitude(player,target),eff=get.effect(target,trigger.card,trigger.player,player); - if(trigger.card.name=='tiesuo') return eff>0?0:get.sgn(att)*(2+get.sgn(att)); - const sum=trigger.targets.reduce((i,j)=>i+get.effect(j,trigger.card,trigger.player,player),0); - return get.sgn(att)*(eff*2-sum); - }, - }).set('prompt2','弃置一张'+get.translation(get.color(trigger.card))+'牌,令'+get.translation(trigger.card)+'改为对其中一个目标结算两次'); - if(bool){ - const target=targets[0]; - player.logSkill('olsbhetao',target); - player.changeSkin('olsbhetao','ol_sb_yuanshao'); + direct: true, + async content(event, trigger, player) { + const { + result: { bool, cards, targets }, + } = await player + .chooseCardTarget({ + prompt: get.prompt("olsbhetao"), + filterCard(card, player) { + return ( + get.color(card) == get.color(get.event().getTrigger().card) && + lib.filter.cardDiscardable(card, player) + ); + }, + position: "he", + filterTarget(card, player, target) { + return get.event().getTrigger().targets.includes(target); + }, + ai1(card) { + return 7.5 - get.value(card); + }, + ai2(target) { + const player = get.event("player"), + trigger = get.event().getTrigger(); + const att = get.attitude(player, target), + eff = get.effect(target, trigger.card, trigger.player, player); + if (trigger.card.name == "tiesuo") + return eff > 0 ? 0 : get.sgn(att) * (2 + get.sgn(att)); + const sum = trigger.targets.reduce( + (i, j) => i + get.effect(j, trigger.card, trigger.player, player), + 0 + ); + return get.sgn(att) * (eff * 2 - sum); + }, + }) + .set( + "prompt2", + "弃置一张" + + get.translation(get.color(trigger.card)) + + "牌,令" + + get.translation(trigger.card) + + "改为对其中一个目标结算两次" + ); + if (bool) { + const target = targets[0]; + player.logSkill("olsbhetao", target); + player.changeSkin("olsbhetao", "ol_sb_yuanshao"); player.discard(cards); trigger.getParent().effectCount++; - trigger.getParent().excluded.addArray(game.filterPlayer(i=>trigger.targets.includes(i)&&target!=i)); + trigger + .getParent() + .excluded.addArray( + game.filterPlayer((i) => trigger.targets.includes(i) && target != i) + ); } }, - ai:{threaten:3.5}, - global:'olsbhetao_ai', - subSkill:{ - ai:{ - effect:{ - player(card,player){ - if(!game.hasPlayer(target=>{ - return target.hasSkill('olsbhetao')&&(get.attitude(player,target)<0||get.attitude(target,player)<0); - })||game.countPlayer(target=>{ - return player.canUse(card,target); - })<2) return; - const select=get.copy(get.info(card).selectTarget); + ai: { threaten: 3.5 }, + global: "olsbhetao_ai", + subSkill: { + ai: { + effect: { + player(card, player) { + if ( + !game.hasPlayer((target) => { + return ( + target.hasSkill("olsbhetao") && + (get.attitude(player, target) < 0 || + get.attitude(target, player) < 0) + ); + }) || + game.countPlayer((target) => { + return player.canUse(card, target); + }) < 2 + ) + return; + const select = get.copy(get.info(card).selectTarget); let range; - if(select==undefined) range=[1,1]; - else if(typeof select=='number') range=[select,select]; - else if(get.itemtype(select)=='select') range=select; - else if(typeof select=='function') range=select(card,player); - game.checkMod(card,player,range,'selectTarget',player); - if(range[1]==-1||(range[1]>1&&ui.selected.targets&&ui.selected.targets.length)) return 'zeroplayertarget'; + if (select == undefined) range = [1, 1]; + else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); + if ( + range[1] == -1 || + (range[1] > 1 && ui.selected.targets && ui.selected.targets.length) + ) + return "zeroplayertarget"; }, }, }, }, }, - olsbshenli:{ - audio:3, - audioname:['ol_sb_yuanshao_shadow'], - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(!player.isPhaseUsing()||player.hasSkill('olsbshenli_used')) return false; - return event.card.name=='sha'&&game.hasPlayer(target=>{ - return !event.targets.includes(target)&&player.canUse(event.card,target,false); - })&&event.isFirstTarget; + olsbshenli: { + audio: 3, + audioname: ["ol_sb_yuanshao_shadow"], + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!player.isPhaseUsing() || player.hasSkill("olsbshenli_used")) return false; + return ( + event.card.name == "sha" && + game.hasPlayer((target) => { + return ( + !event.targets.includes(target) && player.canUse(event.card, target, false) + ); + }) && + event.isFirstTarget + ); }, - check(event,player){ - const targets=game.filterPlayer(target=>player.canUse(event.card,target,false)); - const num1=event.targets.reduce((sum,target)=>sum+get.effect(target,event.card,player,player),0); - const num2=targets.reduce((sum,target)=>sum+get.effect(target,event.card,player,player),0); - if(num2>=num1) return true; - let num=(event.baseDamage||1); - if(event.extraDamage) num+=event.extraDamage; - let extra_num=0; - for(const target of targets){ - if(target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))&&!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:event.card, - },true)){ - if(player.hasSkill('jueqing')||target.hasSkill('gangzhi')) extra_num--; - else if(target.hasSkillTag('filterDamage',null,{ - player:event.player, - card:event.card, - })) extra_num++; - } - else extra_num+=num; + check(event, player) { + const targets = game.filterPlayer((target) => player.canUse(event.card, target, false)); + const num1 = event.targets.reduce( + (sum, target) => sum + get.effect(target, event.card, player, player), + 0 + ); + const num2 = targets.reduce( + (sum, target) => sum + get.effect(target, event.card, player, player), + 0 + ); + if (num2 >= num1) return true; + let num = event.baseDamage || 1; + if (event.extraDamage) num += event.extraDamage; + let extra_num = 0; + for (const target of targets) { + if ( + target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: event.card, + }, + true + ) + ) { + if (player.hasSkill("jueqing") || target.hasSkill("gangzhi")) extra_num--; + else if ( + target.hasSkillTag("filterDamage", null, { + player: event.player, + card: event.card, + }) + ) + extra_num++; + } else extra_num += num; } - const sum=targets.length+extra_num; - return num2+(sum>player.countCards('h')?Math.min(5,sum):0)+(sum>player.getHp()?num2:0)>=num1; + const sum = targets.length + extra_num; + return ( + num2 + + (sum > player.countCards("h") ? Math.min(5, sum) : 0) + + (sum > player.getHp() ? num2 : 0) >= + num1 + ); }, - async content(event,trigger,player){ - player.changeSkin('olsbshenli','ol_sb_yuanshao_shadow'); - player.addTempSkill('olsbshenli_used','phaseUseAfter'); - trigger.getParent().targets.addArray(game.filterPlayer(target=>{ - return !trigger.targets.includes(target)&&player.canUse(trigger.card,target,false); - })); - player.when('useCardAfter').filter(evt=>evt==trigger.getParent()) - .then(()=>{ - const sum=player.getHistory('sourceDamage',evt=>evt.card&&evt.card==trigger.card).reduce((num,evt)=>{ - return num+evt.num; - },0); - const bool=(sum>player.countCards('h')),goon=(sum>player.getHp()); - if(bool) player.draw(Math.min(5,sum)); - if(goon){ - const targets=game.filterPlayer(target=>trigger.targets.includes(target)&&player.canUse(trigger.card,target,false)); - if(targets.length&&(!trigger.cards||!trigger.cards.length||trigger.cards.every(card=>{ - return !get.owner(card); - }))) player.useCard(trigger.card,targets,false); - } - }); + async content(event, trigger, player) { + player.changeSkin("olsbshenli", "ol_sb_yuanshao_shadow"); + player.addTempSkill("olsbshenli_used", "phaseUseAfter"); + trigger.getParent().targets.addArray( + game.filterPlayer((target) => { + return ( + !trigger.targets.includes(target) && + player.canUse(trigger.card, target, false) + ); + }) + ); + player + .when("useCardAfter") + .filter((evt) => evt == trigger.getParent()) + .then(() => { + const sum = player + .getHistory("sourceDamage", (evt) => evt.card && evt.card == trigger.card) + .reduce((num, evt) => { + return num + evt.num; + }, 0); + const bool = sum > player.countCards("h"), + goon = sum > player.getHp(); + if (bool) player.draw(Math.min(5, sum)); + if (goon) { + const targets = game.filterPlayer( + (target) => + trigger.targets.includes(target) && + player.canUse(trigger.card, target, false) + ); + if ( + targets.length && + (!trigger.cards || + !trigger.cards.length || + trigger.cards.every((card) => { + return !get.owner(card); + })) + ) + player.useCard(trigger.card, targets, false); + } + }); }, - ai:{threaten:3.5}, - subSkill:{used:{charlotte:true}}, + ai: { threaten: 3.5 }, + subSkill: { used: { charlotte: true } }, }, - olsbyufeng:{ - audio:2, - audioname2:{ - ol_sb_yuanshao_shadow:'olsbyufeng_ol_sb_yuanshao_shadow', + olsbyufeng: { + audio: 2, + audioname2: { + ol_sb_yuanshao_shadow: "olsbyufeng_ol_sb_yuanshao_shadow", }, - trigger:{ - global:'phaseBefore', - player:'enterGame', + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter(event,player){ - const card=get.cardPile('sizhaojian','field')||game.createCard2('sizhaojian','diamond',6); - return (event.name!='phase'||game.phaseNumber==0)&&player.canEquip(card,true); + filter(event, player) { + const card = + get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + return (event.name != "phase" || game.phaseNumber == 0) && player.canEquip(card, true); }, - forced:true, - locked:false, - async content(event,trigger,player){ - if(lib.card.sizhaojian.inShanShanFestival()){ - game.broadcastAll(()=>lib.inpile.add('sizhaojian')); + forced: true, + locked: false, + async content(event, trigger, player) { + if (lib.card.sizhaojian.inShanShanFestival()) { + game.broadcastAll(() => lib.inpile.add("sizhaojian")); } - const card=get.cardPile('sizhaojian','field')||game.createCard2('sizhaojian','diamond',6); - if(get.owner(card)) get.owner(card).$give(card,player,false); - else{ - player.$gain2(card,false); + const card = + get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + if (get.owner(card)) get.owner(card).$give(card, player, false); + else { + player.$gain2(card, false); game.delayx(); } player.equip(card); }, - subSkill:{ - ol_sb_yuanshao_shadow:{ - audio:1, + subSkill: { + ol_sb_yuanshao_shadow: { + audio: 1, }, - sizhaojian:{ - equipSkill:true, - mod:{ - aiOrder(player,card,num){ - if(card.name=='sha'&&typeof get.number(card)=='number') return num+get.number(card)/114514; + sizhaojian: { + equipSkill: true, + mod: { + aiOrder(player, card, num) { + if (card.name == "sha" && typeof get.number(card) == "number") + return num + get.number(card) / 114514; }, }, - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - return event.card.name=='sha'&&typeof get.number(event.card)=='number'; + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return event.card.name == "sha" && typeof get.number(event.card) == "number"; }, - forced:true, - locked:false, - logTarget:'target', - async content(event,trigger,player){ - const target=trigger.target; - target.addTempSkill('olsbyufeng_block'); - target.markAuto('olsbyufeng_block',[trigger.card]); + forced: true, + locked: false, + logTarget: "target", + async content(event, trigger, player) { + const target = trigger.target; + target.addTempSkill("olsbyufeng_block"); + target.markAuto("olsbyufeng_block", [trigger.card]); }, }, - block:{ - mod:{ - cardEnabled(card,player){ - if(!player.storage.olsbyufeng_block) return; - const storage=player.getStorage('olsbyufeng_block'); - let evt=_status.event; - if(evt.name!='chooseToUse') evt=evt.getParent('chooseToUse'); - if(!evt||!evt.respondTo||!storage.includes(evt.respondTo[1])) return; - const num=get.number(card); - if(num!='unsure'&&typeof num=='number'&&num{ - if(target==player||target.group!='qun') return false; - const evt=event.getl(target); - return evt&&evt.player==target&&evt.es&&evt.es.length>0; + olsbshishou: { + unique: true, + audio: 3, + audioname: ["ol_sb_yuanshao_shadow"], + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + filter(event, player) { + if (player.getEquip(1)) return false; + const card = + get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + if (!player.canEquip(card, true)) return false; + return game.hasPlayer((target) => { + if (target == player || target.group != "qun") return false; + const evt = event.getl(target); + return evt && evt.player == target && evt.es && evt.es.length > 0; }); }, - direct:true, - zhuSkill:true, - async content(event,trigger,player){ - const targets=game.filterPlayer(target=>{ - if(target==player||target.group!='qun') return false; - const evt=trigger.getl(target); - return evt&&evt.player==target&&evt.es&&evt.es.length>0; - }).sortBySeat(); - const card=get.cardPile('sizhaojian','field')||game.createCard2('sizhaojian','diamond',6); - for(const target of targets){ - const {result:{bool}}=await target.chooseBool(get.prompt('olsbshishou',player),'将'+get.translation(card)+'置入'+get.translation(player)+'的装备区中').set('choice',get.attitude(target,player)>0); - if(bool){ - target.logSkill('olsbshishou',player); - if(get.owner(card)) get.owner(card).$give(card,player,false); - else{ - player.$gain2(card,false); + direct: true, + zhuSkill: true, + async content(event, trigger, player) { + const targets = game + .filterPlayer((target) => { + if (target == player || target.group != "qun") return false; + const evt = trigger.getl(target); + return evt && evt.player == target && evt.es && evt.es.length > 0; + }) + .sortBySeat(); + const card = + get.cardPile("sizhaojian", "field") || game.createCard2("sizhaojian", "diamond", 6); + for (const target of targets) { + const { + result: { bool }, + } = await target + .chooseBool( + get.prompt("olsbshishou", player), + "将" + get.translation(card) + "置入" + get.translation(player) + "的装备区中" + ) + .set("choice", get.attitude(target, player) > 0); + if (bool) { + target.logSkill("olsbshishou", player); + if (get.owner(card)) get.owner(card).$give(card, player, false); + else { + player.$gain2(card, false); game.delayx(); } player.equip(card); @@ -621,806 +901,1045 @@ game.import('character', function () { } } }, - ai:{combo:'olsbyufeng'}, + ai: { combo: "olsbyufeng" }, }, //界高顺 - olxianzhen:{ - audio:'rexianzhen', - inherit:'xianzhen', - async content(event,trigger,player){ - const target=event.target; - const {result:{bool}}=await player.chooseToCompare(target); - if(bool){ - player.storage.xinxianzhen=target; - player.addTempSkill('xinxianzhen2'); - } - else{ - player.markAuto('olxianzhen_buff',[target]); - player.addTempSkill('olxianzhen_buff'); + olxianzhen: { + audio: "rexianzhen", + inherit: "xianzhen", + async content(event, trigger, player) { + const target = event.target; + const { + result: { bool }, + } = await player.chooseToCompare(target); + if (bool) { + player.storage.xinxianzhen = target; + player.addTempSkill("xinxianzhen2"); + } else { + player.markAuto("olxianzhen_buff", [target]); + player.addTempSkill("olxianzhen_buff"); } }, - subSkill:{ - buff:{ - charlotte:true, - onremove:true, - mod:{ - playerEnabled(card,player,target){ - if(get.name(card,player)=='sha'&&player.getStorage('olxianzhen_buff').includes(target)) return false; + subSkill: { + buff: { + charlotte: true, + onremove: true, + mod: { + playerEnabled(card, player, target) { + if ( + get.name(card, player) == "sha" && + player.getStorage("olxianzhen_buff").includes(target) + ) + return false; }, - ignoredHandcard(card,player){ - if(get.name(card,player)=='sha') return true; + ignoredHandcard(card, player) { + if (get.name(card, player) == "sha") return true; }, - cardDiscardable(card,player,name){ - if(name=='phaseDiscard'&&get.name(card,player)=='sha') return false; + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && get.name(card, player) == "sha") return false; }, }, }, }, }, //新OL谋关羽 - olsbweilin:{ - audio:2, - enable:'chooseToUse', - filter(event,player){ - return get.inpileVCardList(info=>{ - const name=info[2]; - if(name!='sha'&&name!='jiu') return false; - return get.type(name)=='basic'; - }).some(card=>player.hasCard(cardx=>event.filterCard({name:card[2],nature:card[3],cards:[cardx]},player,event),'hes')); + olsbweilin: { + audio: 2, + enable: "chooseToUse", + filter(event, player) { + return get + .inpileVCardList((info) => { + const name = info[2]; + if (name != "sha" && name != "jiu") return false; + return get.type(name) == "basic"; + }) + .some((card) => + player.hasCard( + (cardx) => + event.filterCard( + { name: card[2], nature: card[3], cards: [cardx] }, + player, + event + ), + "hes" + ) + ); }, - usable:1, - chooseButton:{ - dialog(event,player){ - const list=get.inpileVCardList(info=>{ - const name=info[2]; - if(name!='sha'&&name!='jiu') return false; - return get.type(name)=='basic'; - }).filter(card=>player.hasCard(cardx=>event.filterCard({name:card[2],nature:card[3],cards:[cardx]},player,event),'hes')); - return ui.create.dialog('威临',[list,'vcard']); + usable: 1, + chooseButton: { + dialog(event, player) { + const list = get + .inpileVCardList((info) => { + const name = info[2]; + if (name != "sha" && name != "jiu") return false; + return get.type(name) == "basic"; + }) + .filter((card) => + player.hasCard( + (cardx) => + event.filterCard( + { name: card[2], nature: card[3], cards: [cardx] }, + player, + event + ), + "hes" + ) + ); + return ui.create.dialog("威临", [list, "vcard"]); }, - filter(button,player){ - return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent()); + filter(button, player) { + return _status.event + .getParent() + .filterCard( + { name: button.link[2], nature: button.link[3] }, + player, + _status.event.getParent() + ); }, - check(button){ - if(_status.event.getParent().type!='phase') return 1; - const player=get.event('player'),value=player.getUseValue({name:button.link[2],nature:button.link[3]}); - if(button.link[2]=='sha'&&!player.getHistory('useCard',evt=>get.type(evt.card)=='basic').length){ - if(value>0) return value+20; + check(button) { + if (_status.event.getParent().type != "phase") return 1; + const player = get.event("player"), + value = player.getUseValue({ name: button.link[2], nature: button.link[3] }); + if ( + button.link[2] == "sha" && + !player.getHistory("useCard", (evt) => get.type(evt.card) == "basic").length + ) { + if (value > 0) return value + 20; } return value; }, - backup(links,player){ + backup(links, player) { return { - audio:'olsbweilin', - filterCard:true, - popname:true, - check(card){ - const name=lib.skill.olsbweilin_backup.viewAs.name,color=get.color(card); - const phase=(_status.event.getParent().type=='phase'); - if(phase&&name=='sha'&&color=='red') return 10-get.value(card); - if(name=='tao') return 7+[-2,0,2][['black','red','none'].indexOf(color)]-get.value(card); - return 6-get.value(card); + audio: "olsbweilin", + filterCard: true, + popname: true, + check(card) { + const name = lib.skill.olsbweilin_backup.viewAs.name, + color = get.color(card); + const phase = _status.event.getParent().type == "phase"; + if (phase && name == "sha" && color == "red") return 10 - get.value(card); + if (name == "tao") + return ( + 7 + + [-2, 0, 2][["black", "red", "none"].indexOf(color)] - + get.value(card) + ); + return 6 - get.value(card); }, - position:'hse', - viewAs:{name:links[0][2],nature:links[0][3]}, - precontent(){ - if(!player.storage.olsbweilin_backup){ - player.storage.olsbweilin_backup=true; - player.when('useCardToTargeted') - .filter(evt=>evt.getParent().skill=='olsbweilin_backup'&&evt.getParent().triggeredTargets3.length==evt.targets.length) - .then(()=>{ - delete player.storage.olsbweilin_backup; - const targets=trigger.targets.slice().sortBySeat(); - player.line(targets); - for(const target of targets){ - target.addTempSkill('olsbweilin_wusheng'); - target.markAuto('olsbweilin_wusheng',[get.color(trigger.card)]); - } - }); + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent() { + if (!player.storage.olsbweilin_backup) { + player.storage.olsbweilin_backup = true; + player + .when("useCardToTargeted") + .filter( + (evt) => + evt.getParent().skill == "olsbweilin_backup" && + evt.getParent().triggeredTargets3.length == evt.targets.length + ) + .then(() => { + delete player.storage.olsbweilin_backup; + const targets = trigger.targets.slice().sortBySeat(); + player.line(targets); + for (const target of targets) { + target.addTempSkill("olsbweilin_wusheng"); + target.markAuto("olsbweilin_wusheng", [ + get.color(trigger.card), + ]); + } + }); } }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(get.event('skill')!='olsbweilin_backup') return false; - return arg&&arg.card&&arg.card.name=='sha'&&get.color(arg.card)=='red'; + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (get.event("skill") != "olsbweilin_backup") return false; + return ( + arg && + arg.card && + arg.card.name == "sha" && + get.color(arg.card) == "red" + ); }, }, - } + }; }, - prompt(links,player){ - return '将一张牌当作'+(get.translation(links[0][3])||'')+'【'+get.translation(links[0][2])+'】使用'; - } - }, - hiddenCard(player,name){ - if(!lib.inpile.includes(name)||name!='jiu') return false; - return get.type(name)=='basic'&&!player.getStat('skill').olsbweilin&&player.countCards('hes'); - }, - ai:{ - fireAttack:true, - respondSha:true, - skillTagFilter(player,tag,arg){ - if(arg=='respond') return false; - if(player.getStat('skill').olsbweilin||!player.countCards('hes')) return false; + prompt(links, player) { + return ( + "将一张牌当作" + + (get.translation(links[0][3]) || "") + + "【" + + get.translation(links[0][2]) + + "】使用" + ); }, - order(item,player){ - if(player&&_status.event.type=='phase'&&player.hasValueTarget({name:'sha'},true,true)){ - let max=0,names=get.inpileVCardList(info=>{ - const name=info[2]; - if(name!='sha'&&name!='jiu') return false; - return get.type(name)=='basic'; + }, + hiddenCard(player, name) { + if (!lib.inpile.includes(name) || name != "jiu") return false; + return ( + get.type(name) == "basic" && + !player.getStat("skill").olsbweilin && + player.countCards("hes") + ); + }, + ai: { + fireAttack: true, + respondSha: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + if (player.getStat("skill").olsbweilin || !player.countCards("hes")) return false; + }, + order(item, player) { + if ( + player && + _status.event.type == "phase" && + player.hasValueTarget({ name: "sha" }, true, true) + ) { + let max = 0, + names = get.inpileVCardList((info) => { + const name = info[2]; + if (name != "sha" && name != "jiu") return false; + return get.type(name) == "basic"; + }); + names = names.map((namex) => { + return { name: namex[2], nature: namex[3] }; }); - names=names.map(namex=>{return {name:namex[2],nature:namex[3]}}); - names.forEach(card=>{ - if(player.getUseValue(card)>0){ - let temp=get.order(card); - if(card.name=='jiu'){ - let cards=player.getCards('hs',cardx=>get.value(cardx)<8); - cards.sort((a,b)=>get.value(a)-get.value(b)); - if(!cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) temp=0; + names.forEach((card) => { + if (player.getUseValue(card) > 0) { + let temp = get.order(card); + if (card.name == "jiu") { + let cards = player.getCards("hs", (cardx) => get.value(cardx) < 8); + cards.sort((a, b) => get.value(a) - get.value(b)); + if ( + !cards.some( + (cardx) => + get.name(cardx) == "sha" && + !cards.slice(0, 2).includes(cardx) + ) + ) + temp = 0; } - if(temp>max) max=temp; + if (temp > max) max = temp; } }); - if(max>0) max+=15; + if (max > 0) max += 15; return max; } return 0.5; }, - result:{ - player(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + result: { + player(player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, - subSkill:{ - backup:{}, - wusheng:{ - charlotte:true, - onremove:true, - mod:{ - cardname(card,player){ - if(player.getStorage('olsbweilin_wusheng').includes(get.color(card))) return 'sha'; + subSkill: { + backup: {}, + wusheng: { + charlotte: true, + onremove: true, + mod: { + cardname(card, player) { + if (player.getStorage("olsbweilin_wusheng").includes(get.color(card))) + return "sha"; }, }, - intro:{content:'手牌中所有$牌均视为【杀】'}, + intro: { content: "手牌中所有$牌均视为【杀】" }, }, }, }, - olsbduoshou:{ - init(player){ - if(player.getHistory('useCard',evt=>get.color(evt.card)=='red').length) player.addTempSkill('olsbduoshou_used'); + olsbduoshou: { + init(player) { + if (player.getHistory("useCard", (evt) => get.color(evt.card) == "red").length) + player.addTempSkill("olsbduoshou_used"); }, - mod:{ - targetInRange(card,player,target){ - if(get.color(card)=='red'&&!player.hasSkill('olsbduoshou_used')) return true; + mod: { + targetInRange(card, player, target) { + if (get.color(card) == "red" && !player.hasSkill("olsbduoshou_used")) return true; }, }, - audio:2, - trigger:{ - player:'useCard', - source:'damageSource', + audio: 2, + trigger: { + player: "useCard", + source: "damageSource", }, - filter(event,player){ - if(event.name=='damage') return player.getHistory('sourceDamage').indexOf(event)==0; - if(get.color(event.card)=='red'&&!player.hasSkill('olsbduoshou_used')) return true; - return get.type(event.card)=='basic'&&player.getHistory('useCard',evt=>get.type(evt.card)=='basic').indexOf(event)==0; + filter(event, player) { + if (event.name == "damage") return player.getHistory("sourceDamage").indexOf(event) == 0; + if (get.color(event.card) == "red" && !player.hasSkill("olsbduoshou_used")) return true; + return ( + get.type(event.card) == "basic" && + player.getHistory("useCard", (evt) => get.type(evt.card) == "basic").indexOf(event) == + 0 + ); }, - forced:true, - async content(event,trigger,player){ - if(trigger.name=='damage') player.draw(); - else{ - if(get.color(trigger.card)=='red'&&!player.hasSkill('olsbduoshou_used')){ - game.log(trigger.card,'无距离限制'); - player.addTempSkill('olsbduoshou_used'); + forced: true, + async content(event, trigger, player) { + if (trigger.name == "damage") player.draw(); + else { + if (get.color(trigger.card) == "red" && !player.hasSkill("olsbduoshou_used")) { + game.log(trigger.card, "无距离限制"); + player.addTempSkill("olsbduoshou_used"); } - if(get.type(trigger.card)=='basic'&&player.getHistory('useCard',evt=>get.type(evt.card)=='basic').indexOf(trigger)==0){ - game.log(trigger.card,'不计入次数上限'); + if ( + get.type(trigger.card) == "basic" && + player + .getHistory("useCard", (evt) => get.type(evt.card) == "basic") + .indexOf(trigger) == 0 + ) { + game.log(trigger.card, "不计入次数上限"); if (trigger.addCount !== false) { - trigger.addCount=false; - const stat = player.stat[player.stat.length-1].card; - if (typeof stat[trigger.card.name] === 'number') stat[trigger.card.name]--; + trigger.addCount = false; + const stat = player.stat[player.stat.length - 1].card; + if (typeof stat[trigger.card.name] === "number") stat[trigger.card.name]--; } } } }, - subSkill:{used:{charlotte:true}}, + subSkill: { used: { charlotte: true } }, }, //OL谋太史慈 - olsbdulie:{ - audio:2, - trigger:{target:'useCardToTarget'}, - filter(event,player){ - if(event.player==player||!event.isFirstTarget||event.targets.length!=1) return false; - if(player.getAttackRange()<=0) return; - return ['basic','trick'].includes(get.type(event.card)); + olsbdulie: { + audio: 2, + trigger: { target: "useCardToTarget" }, + filter(event, player) { + if (event.player == player || !event.isFirstTarget || event.targets.length != 1) + return false; + if (player.getAttackRange() <= 0) return; + return ["basic", "trick"].includes(get.type(event.card)); }, - prompt2(event,player){ - return '令'+get.translation(event.card)+'额外结算一次,此牌结算完毕后,你摸等同于你攻击范围的牌'; + prompt2(event, player) { + return ( + "令" + + get.translation(event.card) + + "额外结算一次,此牌结算完毕后,你摸等同于你攻击范围的牌" + ); }, - check(event,player){ - const num=Math.min(5,player.getAttackRange()); - if(get.effect(player,event.card,event.player,player)>0) return true; - if(event.card.name=='guohe'||event.card.name=='shunshou'||event.card.name=='zhujinqiyuan') return num>(event.effectCount||0); - if(!get.tag(event.card,'damage')) return true; - return num>1; + check(event, player) { + const num = Math.min(5, player.getAttackRange()); + if (get.effect(player, event.card, event.player, player) > 0) return true; + if ( + event.card.name == "guohe" || + event.card.name == "shunshou" || + event.card.name == "zhujinqiyuan" + ) + return num > (event.effectCount || 0); + if (!get.tag(event.card, "damage")) return true; + return num > 1; }, - usable:1, - async content(event,trigger,player){ + usable: 1, + async content(event, trigger, player) { trigger.getParent().effectCount++; - player.when({global:'useCardAfter'}) - .filter(evt=>evt==trigger.getParent()) - .then(()=>{ - const num=Math.min(5,player.getAttackRange()); - if(num>0) player.draw(num); - }); + player + .when({ global: "useCardAfter" }) + .filter((evt) => evt == trigger.getParent()) + .then(() => { + const num = Math.min(5, player.getAttackRange()); + if (num > 0) player.draw(num); + }); }, }, - olsbdouchan:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - async content(event,trigger,player){ - const card=get.cardPile2(card=>card.name=='juedou'); - if(card) player.gain(card,'gain2'); - else if(player.countMark('olsbdouchan') card.name == "juedou"); + if (card) player.gain(card, "gain2"); + else if (player.countMark("olsbdouchan") < game.players.length + game.dead.length) + player.addMark("olsbdouchan", 1, false); }, - mod:{ - attackRange(player,num){ - return num+player.countMark('olsbdouchan'); + mod: { + attackRange(player, num) { + return num + player.countMark("olsbdouchan"); }, - cardUsable(card,player,num){ - if(card.name=='sha') return num+player.countMark('olsbdouchan'); + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("olsbdouchan"); }, }, - intro:{content:'
  • 攻击距离+#
  • 使用【杀】的次数上限+#'}, + intro: { content: "
  • 攻击距离+#
  • 使用【杀】的次数上限+#" }, }, //OL谋关羽 //可以和手杀谋关羽组成卧龙凤雏了 - olsbfumeng:{ - audio:2, - trigger:{global:'roundStart'}, - filter(event,player){ - return player.countCards('h',card=>{ - if(_status.connectMode) return true; - return get.name(card,player)!='sha'; + olsbfumeng: { + audio: 2, + trigger: { global: "roundStart" }, + filter(event, player) { + return player.countCards("h", (card) => { + if (_status.connectMode) return true; + return get.name(card, player) != "sha"; }); }, - direct:true, - async content(event,trigger,player){ - const {result:{bool,cards}}=await player.chooseCard(get.prompt2('olsbfumeng'),[1,Infinity],(card,player)=>{ - return get.name(card,player)!='sha'; - }).set('ai',card=>{ - const player=get.event('player'); - if(player.hasSkill('olsbfumeng')) return 7-get.value(card); - return 4.5-get.value(card); - }); - if(!bool) return; - player.logSkill('olsbfumeng'); - player.addSkill('olsbfumeng_buff'); - player.addGaintag(cards,'olsbfumeng_buff'); + direct: true, + async content(event, trigger, player) { + const { + result: { bool, cards }, + } = await player + .chooseCard(get.prompt2("olsbfumeng"), [1, Infinity], (card, player) => { + return get.name(card, player) != "sha"; + }) + .set("ai", (card) => { + const player = get.event("player"); + if (player.hasSkill("olsbfumeng")) return 7 - get.value(card); + return 4.5 - get.value(card); + }); + if (!bool) return; + player.logSkill("olsbfumeng"); + player.addSkill("olsbfumeng_buff"); + player.addGaintag(cards, "olsbfumeng_buff"); }, - subSkill:{ - buff:{ - charlotte:true, - mod:{ - cardname:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('olsbfumeng_buff')) return 'sha'; + subSkill: { + buff: { + charlotte: true, + mod: { + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("olsbfumeng_buff")) + return "sha"; }, }, }, }, }, - olsbguidao:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - if(event.olsbguidao_num>2) return false; - const card=new lib.element.VCard({name:'juedou',storage:{olsbguidao:true}}); - return game.hasPlayer(target=>{ - return player.canUse(card,target,false); - })&&player.countCards('he',cardx=>{ - return player.canRecast(cardx); - })>=2&&player.countCards('he',cardx=>{ - return get.name(cardx,player)=='sha'&&player.canRecast(cardx); - })>=event.olsbguidao_num; + olsbguidao: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + if (event.olsbguidao_num > 2) return false; + const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); + return ( + game.hasPlayer((target) => { + return player.canUse(card, target, false); + }) && + player.countCards("he", (cardx) => { + return player.canRecast(cardx); + }) >= 2 && + player.countCards("he", (cardx) => { + return get.name(cardx, player) == "sha" && player.canRecast(cardx); + }) >= event.olsbguidao_num + ); }, - onChooseToUse(event){ - if(!game.online&&!event.olsbguidao_num){ - const player=event.player,history=player.getHistory('custom',evt=>evt.olsbguidao_num); - if(!history.length) event.set('olsbguidao_num',1); - else{ - const evt=history[history.length-1]; - event.set('olsbguidao_num',evt.olsbguidao_num); + onChooseToUse(event) { + if (!game.online && !event.olsbguidao_num) { + const player = event.player, + history = player.getHistory("custom", (evt) => evt.olsbguidao_num); + if (!history.length) event.set("olsbguidao_num", 1); + else { + const evt = history[history.length - 1]; + event.set("olsbguidao_num", evt.olsbguidao_num); } } }, - filterCard(card,player){ - const num=get.event('olsbguidao_num'); - if(ui.selected.cards.filter(cardx=>get.name(cardx,player)=='sha').length get.name(cardx, player) == "sha").length < num && + get.name(card, player) != "sha" + ) + return false; return player.canRecast(card); }, - selectCard:2, - position:'he', - check(card){ - const player=get.event('player'); - if(get.name(card,player)=='sha') return 1/(get.value(card)||0.5); - return 7-get.value(card); + selectCard: 2, + position: "he", + check(card) { + const player = get.event("player"); + if (get.name(card, player) == "sha") return 1 / (get.value(card) || 0.5); + return 7 - get.value(card); }, - complexCard:true, - lose:false, - discard:false, - delay:0, - filterTarget(card,player,target){ - const cardx=new lib.element.VCard({name:'juedou',storage:{olsbguidao:true}}); - return player.canUse(cardx,target,false); + complexCard: true, + lose: false, + discard: false, + delay: 0, + filterTarget(card, player, target) { + const cardx = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); + return player.canUse(cardx, target, false); }, - prompt(){ - let str='重铸两张牌'; - const num=get.event('olsbguidao_num'); - if(num>0) str+='(至少重铸'+get.cnNumber(num)+'张【杀】)'; - str+='并视为使用【决斗】'; + prompt() { + let str = "重铸两张牌"; + const num = get.event("olsbguidao_num"); + if (num > 0) str += "(至少重铸" + get.cnNumber(num) + "张【杀】)"; + str += "并视为使用【决斗】"; return str; }, - async content(event,trigger,player){ - const target=event.target,cards=event.cards; - player.getHistory('custom').push({olsbguidao_num:cards.filter(card=>get.name(card,player)=='sha').length+1}); - const card=new lib.element.VCard({name:'juedou',storage:{olsbguidao:true}}); + async content(event, trigger, player) { + const target = event.target, + cards = event.cards; + player + .getHistory("custom") + .push({ + olsbguidao_num: + cards.filter((card) => get.name(card, player) == "sha").length + 1, + }); + const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); await player.recast(cards); - player.addTempSkill('olsbguidao_buff'); - if(player.canUse(card,target,false)) player.useCard(card,target,false); + player.addTempSkill("olsbguidao_buff"); + if (player.canUse(card, target, false)) player.useCard(card, target, false); }, - ai:{ - order(item,player){ - const card=new lib.element.VCard({name:'juedou',storage:{olsbguidao:true}}); - const order=get.order(card,player); - if(order<=0) return 0; - return order+0.1; + ai: { + order(item, player) { + const card = new lib.element.VCard({ name: "juedou", storage: { olsbguidao: true } }); + const order = get.order(card, player); + if (order <= 0) return 0; + return order + 0.1; }, - result:{ - target(player,target){ - const card=new lib.element.VCard({name:'juedou',storage:{olsbguidao:true}}); - return get.sgn(get.attitude(player,target))*get.effect(target,card,player,player); + result: { + target(player, target) { + const card = new lib.element.VCard({ + name: "juedou", + storage: { olsbguidao: true }, + }); + return ( + get.sgn(get.attitude(player, target)) * + get.effect(target, card, player, player) + ); }, }, }, - subSkill:{ - buff:{ - charlotte:true, - trigger:{global:'damageBegin3'}, - filter(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.olsbguidao) return false; - if(!event.source||event.source!=player) return false; - const evt=event.getParent('useCard'); - return evt.player==player&&evt.targets.includes(event.player); + subSkill: { + buff: { + charlotte: true, + trigger: { global: "damageBegin3" }, + filter(event, player) { + if (!event.card || !event.card.storage || !event.card.storage.olsbguidao) + return false; + if (!event.source || event.source != player) return false; + const evt = event.getParent("useCard"); + return evt.player == player && evt.targets.includes(event.player); }, - forced:true, - popup:false, - async content(event,trigger,player){ - const target=trigger.player; - const {result:{control}}=await target.chooseControl('【杀】更多','非【杀】更多') - .set('prompt','归刀:请猜测'+get.translation(player)+'手牌中【杀】与非【杀】牌数哪个更多') - .set('prompt2','若猜错,则'+get.translation(trigger.card)+'对你造成的伤害+1') - .set('ai',()=>_status.event.controls.randomGet()); - const goon1=player.countCards('h',card=>get.name(card,player)=='sha')>=player.countCards('h',card=>get.name(card,player)!='sha'); - const goon2=player.countCards('h',card=>get.name(card,player)!='sha')>=player.countCards('h',card=>get.name(card,player)=='sha'); - if((goon1&&control=='【杀】更多')||(goon2&&control=='非【杀】更多')){ - target.popup('洗具'); - game.log(target,'猜测','#g正确'); - } - else{ - target.popup('杯具'); - game.log(target,'猜测','#y错误'); - trigger.increase('num'); + forced: true, + popup: false, + async content(event, trigger, player) { + const target = trigger.player; + const { + result: { control }, + } = await target + .chooseControl("【杀】更多", "非【杀】更多") + .set( + "prompt", + "归刀:请猜测" + + get.translation(player) + + "手牌中【杀】与非【杀】牌数哪个更多" + ) + .set( + "prompt2", + "若猜错,则" + get.translation(trigger.card) + "对你造成的伤害+1" + ) + .set("ai", () => _status.event.controls.randomGet()); + const goon1 = + player.countCards("h", (card) => get.name(card, player) == "sha") >= + player.countCards("h", (card) => get.name(card, player) != "sha"); + const goon2 = + player.countCards("h", (card) => get.name(card, player) != "sha") >= + player.countCards("h", (card) => get.name(card, player) == "sha"); + if ((goon1 && control == "【杀】更多") || (goon2 && control == "非【杀】更多")) { + target.popup("洗具"); + game.log(target, "猜测", "#g正确"); + } else { + target.popup("杯具"); + game.log(target, "猜测", "#y错误"); + trigger.increase("num"); } }, }, }, }, //OL谋姜维 - olsbzhuri:{ - audio:2, - trigger:{player:['phaseZhunbeiEnd','phaseJudgeEnd','phaseDrawEnd','phaseUseEnd','phaseDiscardEnd','phaseJieshuEnd']}, - filter:function(event,player){ - if(player.hasSkill('olsbzhuri_block')) return false; - if(!game.hasPlayer(target=>player.canCompare(target))) return false; - return player.getHistory('gain',evt=>evt.getParent(event.name)==event).length+player.getHistory('lose',evt=>evt.getParent(event.name)==event&&evt.hs.length).length; + olsbzhuri: { + audio: 2, + trigger: { + player: [ + "phaseZhunbeiEnd", + "phaseJudgeEnd", + "phaseDrawEnd", + "phaseUseEnd", + "phaseDiscardEnd", + "phaseJieshuEnd", + ], }, - direct:true, - content:function*(event,map){ - var player=map.player; - var trigger=map.trigger; - var result=yield player.chooseTarget(get.prompt('olsbzhuri'),'与一名角色进行拼点,若你赢,你可以使用其中的一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合失效',(card,player,target)=>{ - return player.canCompare(target); - }).set('ai',target=>{ - var player=_status.event.player; - var ts=target.getCards('h').sort((a,b)=>get.number(a)-get.number(b)); - if(get.attitude(player,target)<0){ - var hs=player.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - var ts=target.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - if(get.number(hs[0])>get.number(ts[0])) return 1; - if(get.effect(player,{name:'losehp'},player,player)>0) return Math.random()+0.2; - if(player.getHp()>2) return Math.random()-0.5; + filter: function (event, player) { + if (player.hasSkill("olsbzhuri_block")) return false; + if (!game.hasPlayer((target) => player.canCompare(target))) return false; + return ( + player.getHistory("gain", (evt) => evt.getParent(event.name) == event).length + + player.getHistory( + "lose", + (evt) => evt.getParent(event.name) == event && evt.hs.length + ).length + ); + }, + direct: true, + content: function* (event, map) { + var player = map.player; + var trigger = map.trigger; + var result = yield player + .chooseTarget( + get.prompt("olsbzhuri"), + "与一名角色进行拼点,若你赢,你可以使用其中的一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合失效", + (card, player, target) => { + return player.canCompare(target); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b)); + if (get.attitude(player, target) < 0) { + var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (get.number(hs[0]) > get.number(ts[0])) return 1; + if (get.effect(player, { name: "losehp" }, player, player) > 0) + return Math.random() + 0.2; + if (player.getHp() > 2) return Math.random() - 0.5; + return 0; + } return 0; - } - return 0; - }); - if(result.bool){ - var target=result.targets[0]; - player.logSkill('olsbzhuri',target); - var result2=yield player.chooseToCompare(target); - if(result2.bool){ - var cards=[result2.player,result2.target].filterInD('d'); - cards=cards.filter(card=>player.hasUseTarget(card)); - if(cards.length){ - var result3=yield player.chooseButton(['是否使用其中的牌?',cards]).set('ai',button=>_status.event.player.getUseValue(button.link)); - if(result3.bool){ - var card=result3.links[0]; - player.$gain2(card,false); + }); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olsbzhuri", target); + var result2 = yield player.chooseToCompare(target); + if (result2.bool) { + var cards = [result2.player, result2.target].filterInD("d"); + cards = cards.filter((card) => player.hasUseTarget(card)); + if (cards.length) { + var result3 = yield player + .chooseButton(["是否使用其中的牌?", cards]) + .set("ai", (button) => _status.event.player.getUseValue(button.link)); + if (result3.bool) { + var card = result3.links[0]; + player.$gain2(card, false); game.delayx(); - player.chooseUseTarget(true,card,false); + player.chooseUseTarget(true, card, false); } } - } - else{ - var list=lib.skill.olsbranji.getList(trigger); - var result3=yield player.chooseControl('失去体力','技能失效').set('prompt','逐日:失去1点体力,或令此技能于本回合失效').set('ai',()=>{ - var player=_status.event.player; - if(player.getHp()>2){ - var list=_status.event.list; - list.removeArray(player.skipList); - if(list.includes('phaseDraw')||list.includes('phaseUse')) return '失去体力'; - } - if(get.effect(player,{name:'losehp'},player,player)>0) return '失去体力'; - return '技能失效'; - }).set('list',list.slice(trigger.getParent().num,list.length)); - player[result3.control=='失去体力'?'loseHp':'addTempSkill'](result3.control=='失去体力'?1:'olsbzhuri_block'); + } else { + var list = lib.skill.olsbranji.getList(trigger); + var result3 = yield player + .chooseControl("失去体力", "技能失效") + .set("prompt", "逐日:失去1点体力,或令此技能于本回合失效") + .set("ai", () => { + var player = _status.event.player; + if (player.getHp() > 2) { + var list = _status.event.list; + list.removeArray(player.skipList); + if (list.includes("phaseDraw") || list.includes("phaseUse")) + return "失去体力"; + } + if (get.effect(player, { name: "losehp" }, player, player) > 0) + return "失去体力"; + return "技能失效"; + }) + .set("list", list.slice(trigger.getParent().num, list.length)); + player[result3.control == "失去体力" ? "loseHp" : "addTempSkill"]( + result3.control == "失去体力" ? 1 : "olsbzhuri_block" + ); } } }, - subSkill:{ - block:{ - charlotte:true, - mark:true, - marktext:'', - intro:{content:'追不动太阳了'}, + subSkill: { + block: { + charlotte: true, + mark: true, + marktext: '', + intro: { content: "追不动太阳了" }, }, }, }, - olsbranji:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - prompt2:function(event,player){ - var str='获得技能'; - var num=lib.skill.olsbranji.getNum(player); - if(num>=player.getHp()) str+='【困奋】'; - if(num==player.getHp()) str+='和'; - if(num<=player.getHp()) str+='【诈降】'; - str+=',然后'; - var num1=(player.countCards('h')-player.getHandcardLimit()); - if(num1||player.isDamaged()){ - if(num1) str+=(num1<0?'摸'+get.cnNumber(-num1)+'张牌':'弃置'+get.cnNumber(num1)+'张牌'); - if(num1&&player.isDamaged()) str+='或'; - if(player.isDamaged()) str+=('回复'+player.getDamagedHp()+'点体力'); - str+=',最后'; + olsbranji: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + prompt2: function (event, player) { + var str = "获得技能"; + var num = lib.skill.olsbranji.getNum(player); + if (num >= player.getHp()) str += "【困奋】"; + if (num == player.getHp()) str += "和"; + if (num <= player.getHp()) str += "【诈降】"; + str += ",然后"; + var num1 = player.countCards("h") - player.getHandcardLimit(); + if (num1 || player.isDamaged()) { + if (num1) + str += + num1 < 0 + ? "摸" + get.cnNumber(-num1) + "张牌" + : "弃置" + get.cnNumber(num1) + "张牌"; + if (num1 && player.isDamaged()) str += "或"; + if (player.isDamaged()) str += "回复" + player.getDamagedHp() + "点体力"; + str += ",最后"; } - str+='你不能回复体力直到你杀死角色。'; + str += "你不能回复体力直到你杀死角色。"; return str; }, - check:function(event,player){ - var num=lib.skill.olsbranji.getNum(player); - if(num==player.getHp()) return true; - return player.getHandcardLimit()-player.countCards('h')>=3||player.getDamagedHp()>=2; + check: function (event, player) { + var num = lib.skill.olsbranji.getNum(player); + if (num == player.getHp()) return true; + return ( + player.getHandcardLimit() - player.countCards("h") >= 3 || player.getDamagedHp() >= 2 + ); }, - limited:true, - skillAnimation:true, - animationColor:'fire', - content:function*(event,map){ - var player=map.player; - var trigger=map.trigger; - player.awakenSkill('olsbranji'); - var num=lib.skill.olsbranji.getNum(player); + limited: true, + skillAnimation: true, + animationColor: "fire", + content: function* (event, map) { + var player = map.player; + var trigger = map.trigger; + player.awakenSkill("olsbranji"); + var num = lib.skill.olsbranji.getNum(player); const skills = []; - if(num>=player.getHp()){ - skills.push('kunfen'); - player.storage.kunfen=true; + if (num >= player.getHp()) { + skills.push("kunfen"); + player.storage.kunfen = true; } - if(num<=player.getHp()) skills.push('zhaxiang'); + if (num <= player.getHp()) skills.push("zhaxiang"); player.addSkills(skills); - if(player.countCards('h')!=player.getHandcardLimit()||player.isDamaged()){ - var result,num1=player.countCards('h')-player.getHandcardLimit(); - if(!num1) result={index:1}; - else if(player.isHealthy()) result={index:0}; - else{ - result=yield player.chooseControl('手牌数','体力值').set('choiceList',[ - num1<0?'摸'+get.cnNumber(-num1)+'张牌':'弃置'+get.cnNumber(num1)+'张牌', - '回复'+(player.getDamagedHp())+'点体力', - ]).set('ai',()=>{ - var player=_status.event.player; - var list=_status.event.list; - var num1=get.effect(player,{name:'draw'},player,player); - var num2=get.recoverEffect(player,player,player); - return num1*list[0]>num2*list[1]?0:1; - }).set('list',[-num1,player.getDamagedHp()]); + if (player.countCards("h") != player.getHandcardLimit() || player.isDamaged()) { + var result, + num1 = player.countCards("h") - player.getHandcardLimit(); + if (!num1) result = { index: 1 }; + else if (player.isHealthy()) result = { index: 0 }; + else { + result = yield player + .chooseControl("手牌数", "体力值") + .set("choiceList", [ + num1 < 0 + ? "摸" + get.cnNumber(-num1) + "张牌" + : "弃置" + get.cnNumber(num1) + "张牌", + "回复" + player.getDamagedHp() + "点体力", + ]) + .set("ai", () => { + var player = _status.event.player; + var list = _status.event.list; + var num1 = get.effect(player, { name: "draw" }, player, player); + var num2 = get.recoverEffect(player, player, player); + return num1 * list[0] > num2 * list[1] ? 0 : 1; + }) + .set("list", [-num1, player.getDamagedHp()]); } - if(result.index==0){ - if(num1<0) yield player.drawTo(player.getHandcardLimit()); - else yield player.chooseToDiscard(num1,'h',true); - } - else{ - yield player.recover(player.maxHp-player.hp); + if (result.index == 0) { + if (num1 < 0) yield player.drawTo(player.getHandcardLimit()); + else yield player.chooseToDiscard(num1, "h", true); + } else { + yield player.recover(player.maxHp - player.hp); } } - player.addSkill('olsbranji_norecover'); - player.when({source:'dieAfter'}).then(()=>player.removeSkill('olsbranji_norecover')); + player.addSkill("olsbranji_norecover"); + player.when({ source: "dieAfter" }).then(() => player.removeSkill("olsbranji_norecover")); }, - derivation:['kunfenx','zhaxiang'], - getList:function(event){ - return event.getParent().phaseList.map(list=>list.split('|')[0]); + derivation: ["kunfenx", "zhaxiang"], + getList: function (event) { + return event.getParent().phaseList.map((list) => list.split("|")[0]); }, - getNum:function(player){ - return player.getHistory('useCard',evt=>{ - return lib.phaseName.some(name=>{ - return evt.getParent(name).name==name; - }); - }).reduce((list,evt)=>{ - return list.add(evt.getParent(lib.phaseName.find(name=>evt.getParent(name).name==name))); - },[]).length; + getNum: function (player) { + return player + .getHistory("useCard", (evt) => { + return lib.phaseName.some((name) => { + return evt.getParent(name).name == name; + }); + }) + .reduce((list, evt) => { + return list.add( + evt.getParent(lib.phaseName.find((name) => evt.getParent(name).name == name)) + ); + }, []).length; }, - subSkill:{ - norecover:{ - charlotte:true, - mark:true, - intro:{content:'不能回复体力'}, - trigger:{player:'recoverBefore'}, - forced:true, - firstDo:true, - content:function(){ + subSkill: { + norecover: { + charlotte: true, + mark: true, + intro: { content: "不能回复体力" }, + trigger: { player: "recoverBefore" }, + forced: true, + firstDo: true, + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'recover')) return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "recover")) return "zeroplayertarget"; }, }, }, }, }, }, - kunfenx:{ - audio:'kunfen', - audioname:['ol_sb_jiangwei'], + kunfenx: { + audio: "kunfen", + audioname: ["ol_sb_jiangwei"], }, //界曹彰 - oljiangchi:{ - audio:'rejiangchi', - trigger:{player:'phaseDrawEnd'}, - direct:true, - content:function*(event,map){ - var player=map.player; - var choiceList=[ - '摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。', - '重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。', - ],list=['cancel2']; - if(player.countCards('he',card=>player.canRecast(card))) list.unshift('重铸,+1'); - else choiceList[1]=''+choiceList[1]+''; - list.unshift('摸牌,-1'); - var result=yield player.chooseControl(list).set('ai',()=>{ - var player=_status.event.player; - var controls=_status.event.controls.slice(); - if(controls.includes('重铸,+1')&&player.countCards('hs',card=>get.name(card)=='sha'&&player.hasValueTarget(card))>=2) return '重铸,+1'; - return '摸牌,-1'; - }).set('choiceList',choiceList).set('prompt',get.prompt('oljiangchi')); - if(result.control!='cancel2'){ - player.logSkill('oljiangchi'); - if(result.control=='摸牌,-1'){ + oljiangchi: { + audio: "rejiangchi", + trigger: { player: "phaseDrawEnd" }, + direct: true, + content: function* (event, map) { + var player = map.player; + var choiceList = [ + "摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。", + "重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。", + ], + list = ["cancel2"]; + if (player.countCards("he", (card) => player.canRecast(card))) list.unshift("重铸,+1"); + else choiceList[1] = '' + choiceList[1] + ""; + list.unshift("摸牌,-1"); + var result = yield player + .chooseControl(list) + .set("ai", () => { + var player = _status.event.player; + var controls = _status.event.controls.slice(); + if ( + controls.includes("重铸,+1") && + player.countCards( + "hs", + (card) => get.name(card) == "sha" && player.hasValueTarget(card) + ) >= 2 + ) + return "重铸,+1"; + return "摸牌,-1"; + }) + .set("choiceList", choiceList) + .set("prompt", get.prompt("oljiangchi")); + if (result.control != "cancel2") { + player.logSkill("oljiangchi"); + if (result.control == "摸牌,-1") { player.draw(); - player.addTempSkill('oljiangchi_less'); - player.addMark('oljiangchi_less',1,false); - } - else{ - var result2=yield player.chooseCard('he','将驰:请重铸一张牌',true,(card,player)=>player.canRecast(card)); - if(result2.bool){ + player.addTempSkill("oljiangchi_less"); + player.addMark("oljiangchi_less", 1, false); + } else { + var result2 = yield player.chooseCard( + "he", + "将驰:请重铸一张牌", + true, + (card, player) => player.canRecast(card) + ); + if (result2.bool) { player.recast(result2.cards); - player.addTempSkill('oljiangchi_more'); - player.addMark('oljiangchi_more',1,false); + player.addTempSkill("oljiangchi_more"); + player.addMark("oljiangchi_more", 1, false); } } } }, - subSkill:{ - less:{ - charlotte:true, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num-player.countMark('oljiangchi_less'); + subSkill: { + less: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("oljiangchi_less"); }, - ignoredHandcard:function(card,player){ - if(card.name=='sha') return true; + ignoredHandcard: function (card, player) { + if (card.name == "sha") return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.name=='sha') return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.name == "sha") return false; }, }, }, - more:{ - charlotte:true, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('oljiangchi_more'); + more: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("oljiangchi_more"); }, - targetInRange:function (card,player){ - if(card.name=='sha') return true; + targetInRange: function (card, player) { + if (card.name == "sha") return true; }, }, }, }, }, //界简雍 - olqiaoshui:{ - audio:'reqiaoshui', - inherit:'reqiaoshui', - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasSkill('olqiaoshui_used'); + olqiaoshui: { + audio: "reqiaoshui", + inherit: "reqiaoshui", + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("olqiaoshui_used"); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool) player.addTempSkill('qiaoshui3',{player:'phaseUseAfter'}); - else{ - player.addTempSkill('qiaoshui2'); - player.addTempSkill('olqiaoshui_used'); + ("step 1"); + if (result.bool) player.addTempSkill("qiaoshui3", { player: "phaseUseAfter" }); + else { + player.addTempSkill("qiaoshui2"); + player.addTempSkill("olqiaoshui_used"); } }, - subSkill:{ - used:{ - charlotte:true, - mark:true, - marktext:'', - intro:{content:'被迫闭嘴'}, + subSkill: { + used: { + charlotte: true, + mark: true, + marktext: '', + intro: { content: "被迫闭嘴" }, }, }, }, //界凌统 - olxuanfeng:{ - audio:'xuanfeng', - audioname:['boss_lvbu3'], - audioname2:{ - lingtong:'xuanfeng', - ol_lingtong:'xuanfeng_re_lingtong', + olxuanfeng: { + audio: "xuanfeng", + audioname: ["boss_lvbu3"], + audioname2: { + lingtong: "xuanfeng", + ol_lingtong: "xuanfeng_re_lingtong", }, - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var evt=event.getl(player); - return evt&&(evt.es.length||evt.cards2.length>1); + filter: function (event, player) { + var evt = event.getl(player); + return evt && (evt.es.length || evt.cards2.length > 1); }, - direct:true, - content:function(){ - 'step 0' - event.count=2; - event.logged=false; - 'step 1' - player.chooseTarget(get.prompt('olxuanfeng'),'弃置一名其他角色的一张牌',function(card,player,target){ - if(player==target) return false; - return target.countDiscardableCards(player,'he'); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - 'step 2' - if(result.bool){ - if(!event.logged){ - player.logSkill('olxuanfeng',result.targets); - event.logged=true; - } - else player.line(result.targets[0],'green'); - player.discardPlayerCard(result.targets[0],'he',true); + direct: true, + content: function () { + "step 0"; + event.count = 2; + event.logged = false; + ("step 1"); + player + .chooseTarget( + get.prompt("olxuanfeng"), + "弃置一名其他角色的一张牌", + function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + ("step 2"); + if (result.bool) { + if (!event.logged) { + player.logSkill("olxuanfeng", result.targets); + event.logged = true; + } else player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "he", true); event.count--; - } - else event.finish(); - 'step 3' - if(event.count) event.goto(1); + } else event.finish(); + ("step 3"); + if (event.count) event.goto(1); }, - ai:{ - reverseEquip:true, - noe:true, - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; + ai: { + reverseEquip: true, + noe: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; }, }, }, }, - xuanfeng_re_lingtong:{audio:2}, + xuanfeng_re_lingtong: { audio: 2 }, }, - dynamicTranslate:{ - }, - translate:{ - ol_lingtong:'OL界凌统', - ol_lingtong_prefix:'OL界', - olxuanfeng:'旋风', - olxuanfeng_info:'当你一次性失去至少两张牌后,或失去装备区的牌后,你可以依次弃置一至两名其他角色的共计两张牌。', - ol_jianyong:'OL界简雍', - ol_jianyong_prefix:'OL界', - olqiaoshui:'巧说', - olqiaoshui_info:'出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,此技能于本回合失效且本回合你不能使用锦囊牌。', - ol_caozhang:'OL界曹彰', - ol_caozhang_prefix:'OL界', - oljiangchi:'将驰', - oljiangchi_info:'摸牌阶段结束时,你可以选择一项:①摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。②重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。', - ol_sb_jiangwei:'OL谋姜维', - ol_sb_jiangwei_prefix:'OL谋', - olsbzhuri:'逐日', - olsbzhuri_info:'你的阶段结束时,若你本阶段失去过手牌或得到过牌,则你可以与一名角色拼点。若你赢,你可以使用其中一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合无效。', - olsbranji:'燃己', - olsbranji_info:'限定技,结束阶段。若你本回合使用过牌的阶段数大于等于/小于等于体力值,你可以获得技能〖困奋〗/〖诈降〗(同时满足则都获得,以此法获得的〖困奋〗直接修改为非锁定技)。若如此做,你将手牌数调整至手牌上限或将体力值回复至体力上限,然后你不能回复体力直到你杀死角色。', - kunfenx:'困奋', - kunfenx_info:'结束阶段开始时,你可以失去1点体力,然后摸两张牌。', - ol_sb_guanyu:'OL谋关羽', - ol_sb_guanyu_prefix:'OL谋', - olsbfumeng:'赴梦', - olsbfumeng_info:'一轮游戏开始时,你可以令任意张手牌的牌名视为【杀】。', - olsbguidao:'归刀', - olsbguidao_info:'出牌阶段,你可以重铸两张牌并视为使用一张【决斗】(重铸的【杀】数须比本回合上次发动〖归刀〗重铸的【杀】数多)。目标角色受到此牌伤害时,其须猜测你手牌中牌名为【杀】的牌数量多还是牌名不为【杀】的牌数多,若其猜错,则此【决斗】对其造成的伤害+1。', - ol_sb_taishici:'OL谋太史慈', - ol_sb_taishici_prefix:'OL谋', - olsbdulie:'笃烈', - olsbdulie_info:'每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的唯一目标时,你可以令此牌额外结算一次。若如此做,此牌结算完毕后,你摸X张牌(X为你的攻击范围且至多为5)。', - olsbdouchan:'斗缠', - olsbdouchan_info:'锁定技,准备阶段,你从牌堆中获得一张【决斗】,若牌堆没有【决斗】,则你的攻击范围和出牌阶段使用【杀】的次数上限+1(增加次数不超过游戏人数)。', - olsbweilin:'威临', - olsbweilin_info:'每回合限一次,你可以将一张牌当作任意【杀】或【酒】使用,且你以此法使用的牌指定最后一个目标后,你令所有目标角色本回合与此牌颜色相同的手牌均视为【杀】。', - olsbduoshou:'夺首', - olsbduoshou_info:'锁定技。①你每回合使用的第一张红色牌无距离限制。②你每回合使用的第一张基本牌不计入使用次数。③你每回合第一次造成伤害后,你摸一张牌。', - ol_gaoshun:'OL界高顺', - ol_gaoshun_prefix:'OL界', - olxianzhen:'陷阵', - olxianzhen_info:'出牌阶段限一次,你可以与一名角色拼点。若你赢,本回合你无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标;若你没赢,本回合你不能对其使用【杀】且你的【杀】不计入手牌上限。', - ol_sb_yuanshao:'OL谋袁绍', - ol_sb_yuanshao_prefix:'OL谋', - olsbhetao:'合讨', - olsbhetao_info:'其他角色使用牌执行第一个目标后,若此牌指定的目标数大于1,则你可以弃置一张与此牌颜色相同的牌并令此牌改为对其中一名目标角色结算两次。', - olsbshenli:'神离', - olsbshenli_info:'出牌阶段限一次,当你使用【杀】指定目标后,你可以令所有可成为此牌目标的其他角色均成为此牌目标,此牌结算完毕后,若你因此牌造成的伤害值X:大于你的手牌数,你摸X张牌(至多摸五张);大于你的体力值,你再次对所有目标角色中可以成为此牌目标的角色使用此牌。', - olsbyufeng:'玉锋', - olsbyufeng_sizhaojian:'思召剑', - olsbyufeng_block:'思召剑', - olsbyufeng_info:'游戏开始时,你将【思召剑】置入装备区。', - sizhaojian:'思召剑', - sizhaojian_info:'当你使用有点数的【杀】指定目标后,你令目标角色只能使用无点数或点数大于等于此【杀】的【闪】响应此牌。', - sizhaojian_append:'【思召剑】于闪闪节(3月2日-3月15日)外离开装备区后,销毁此牌', - olsbshishou:'士首', - olsbshishou_info:'主公技,其他群势力角色失去装备区的牌后,若你的装备区中没有武器牌,其可将【思召剑】置入你的装备区。', - ol_yufan:'OL界虞翻', - ol_yufan_prefix:'OL界', - olzongxuan:'纵玄', - olzongxuan_info:'当你或你的上家因弃置而失去牌后,你可以将位于弃牌堆的这些牌中的任意牌以任意顺序置于牌堆顶。', - olzhiyan:'直言', - olzhiyan_info:'你或你的上家的结束阶段,你可以令一名角色正面朝上摸一张牌,然后若此牌:为装备牌,则其使用此牌并回复1点体力;不为装备牌且其体力值大于等于你,则其失去1点体力。', - ol_chengpu:'OL界程普', - ol_chengpu_prefix:'OL界', - dclihuo:'疠火', - dclihuo_info:'①你使用的非火【杀】可以改为火【杀】,若如此做,此牌结算完毕后,若此牌造成过伤害,则你弃置一张牌或失去1点体力。②你使用火【杀】可以额外指定一个目标。', - olchunlao:'醇醪', - olchunlao_info:'①当你的【杀】因弃置进入弃牌堆后,你将位于弃牌堆的这些牌称为“醇”置于武将牌上。②一名角色处于濒死状态时,你可以将一张“醇”置入弃牌堆,然后令其视为使用一张【酒】。', - ol_wangyi:'OL界王异', - ol_wangyi_prefix:'OL界', - olzhenlie:'贞烈', - olzhenlie_info:'当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后你选择一项:①获得使用者的一张牌;②发动一次〖秘计〗。', - olmiji:'秘计', - olmiji_info:'结束阶段,若你已受伤,则你可以摸X张牌,然后你可以将至多X张牌任意分配给其他角色(X为你已损失的体力值)。', + dynamicTranslate: {}, + translate: { + ol_lingtong: "OL界凌统", + ol_lingtong_prefix: "OL界", + olxuanfeng: "旋风", + olxuanfeng_info: + "当你一次性失去至少两张牌后,或失去装备区的牌后,你可以依次弃置一至两名其他角色的共计两张牌。", + ol_jianyong: "OL界简雍", + ol_jianyong_prefix: "OL界", + olqiaoshui: "巧说", + olqiaoshui_info: + "出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,此技能于本回合失效且本回合你不能使用锦囊牌。", + ol_caozhang: "OL界曹彰", + ol_caozhang_prefix: "OL界", + oljiangchi: "将驰", + oljiangchi_info: + "摸牌阶段结束时,你可以选择一项:①摸一张牌,本回合使用【杀】的次数上限-1,且【杀】不计入手牌上限。②重铸一张牌,本回合使用【杀】无距离限制,且使用【杀】的次数上限+1。", + ol_sb_jiangwei: "OL谋姜维", + ol_sb_jiangwei_prefix: "OL谋", + olsbzhuri: "逐日", + olsbzhuri_info: + "你的阶段结束时,若你本阶段失去过手牌或得到过牌,则你可以与一名角色拼点。若你赢,你可以使用其中一张拼点牌;若你没赢,你失去1点体力或令此技能于本回合无效。", + olsbranji: "燃己", + olsbranji_info: + "限定技,结束阶段。若你本回合使用过牌的阶段数大于等于/小于等于体力值,你可以获得技能〖困奋〗/〖诈降〗(同时满足则都获得,以此法获得的〖困奋〗直接修改为非锁定技)。若如此做,你将手牌数调整至手牌上限或将体力值回复至体力上限,然后你不能回复体力直到你杀死角色。", + kunfenx: "困奋", + kunfenx_info: "结束阶段开始时,你可以失去1点体力,然后摸两张牌。", + ol_sb_guanyu: "OL谋关羽", + ol_sb_guanyu_prefix: "OL谋", + olsbfumeng: "赴梦", + olsbfumeng_info: "一轮游戏开始时,你可以令任意张手牌的牌名视为【杀】。", + olsbguidao: "归刀", + olsbguidao_info: + "出牌阶段,你可以重铸两张牌并视为使用一张【决斗】(重铸的【杀】数须比本回合上次发动〖归刀〗重铸的【杀】数多)。目标角色受到此牌伤害时,其须猜测你手牌中牌名为【杀】的牌数量多还是牌名不为【杀】的牌数多,若其猜错,则此【决斗】对其造成的伤害+1。", + ol_sb_taishici: "OL谋太史慈", + ol_sb_taishici_prefix: "OL谋", + olsbdulie: "笃烈", + olsbdulie_info: + "每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的唯一目标时,你可以令此牌额外结算一次。若如此做,此牌结算完毕后,你摸X张牌(X为你的攻击范围且至多为5)。", + olsbdouchan: "斗缠", + olsbdouchan_info: + "锁定技,准备阶段,你从牌堆中获得一张【决斗】,若牌堆没有【决斗】,则你的攻击范围和出牌阶段使用【杀】的次数上限+1(增加次数不超过游戏人数)。", + olsbweilin: "威临", + olsbweilin_info: + "每回合限一次,你可以将一张牌当作任意【杀】或【酒】使用,且你以此法使用的牌指定最后一个目标后,你令所有目标角色本回合与此牌颜色相同的手牌均视为【杀】。", + olsbduoshou: "夺首", + olsbduoshou_info: + "锁定技。①你每回合使用的第一张红色牌无距离限制。②你每回合使用的第一张基本牌不计入使用次数。③你每回合第一次造成伤害后,你摸一张牌。", + ol_gaoshun: "OL界高顺", + ol_gaoshun_prefix: "OL界", + olxianzhen: "陷阵", + olxianzhen_info: + "出牌阶段限一次,你可以与一名角色拼点。若你赢,本回合你无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标;若你没赢,本回合你不能对其使用【杀】且你的【杀】不计入手牌上限。", + ol_sb_yuanshao: "OL谋袁绍", + ol_sb_yuanshao_prefix: "OL谋", + olsbhetao: "合讨", + olsbhetao_info: + "其他角色使用牌执行第一个目标后,若此牌指定的目标数大于1,则你可以弃置一张与此牌颜色相同的牌并令此牌改为对其中一名目标角色结算两次。", + olsbshenli: "神离", + olsbshenli_info: + "出牌阶段限一次,当你使用【杀】指定目标后,你可以令所有可成为此牌目标的其他角色均成为此牌目标,此牌结算完毕后,若你因此牌造成的伤害值X:大于你的手牌数,你摸X张牌(至多摸五张);大于你的体力值,你再次对所有目标角色中可以成为此牌目标的角色使用此牌。", + olsbyufeng: "玉锋", + olsbyufeng_sizhaojian: "思召剑", + olsbyufeng_block: "思召剑", + olsbyufeng_info: "游戏开始时,你将【思召剑】置入装备区。", + sizhaojian: "思召剑", + sizhaojian_info: + "当你使用有点数的【杀】指定目标后,你令目标角色只能使用无点数或点数大于等于此【杀】的【闪】响应此牌。", + sizhaojian_append: + '【思召剑】于闪闪节(3月2日-3月15日)外离开装备区后,销毁此牌', + olsbshishou: "士首", + olsbshishou_info: + "主公技,其他群势力角色失去装备区的牌后,若你的装备区中没有武器牌,其可将【思召剑】置入你的装备区。", + ol_yufan: "OL界虞翻", + ol_yufan_prefix: "OL界", + olzongxuan: "纵玄", + olzongxuan_info: + "当你或你的上家因弃置而失去牌后,你可以将位于弃牌堆的这些牌中的任意牌以任意顺序置于牌堆顶。", + olzhiyan: "直言", + olzhiyan_info: + "你或你的上家的结束阶段,你可以令一名角色正面朝上摸一张牌,然后若此牌:为装备牌,则其使用此牌并回复1点体力;不为装备牌且其体力值大于等于你,则其失去1点体力。", + ol_chengpu: "OL界程普", + ol_chengpu_prefix: "OL界", + dclihuo: "疠火", + dclihuo_info: + "①你使用的非火【杀】可以改为火【杀】,若如此做,此牌结算完毕后,若此牌造成过伤害,则你弃置一张牌或失去1点体力。②你使用火【杀】可以额外指定一个目标。", + olchunlao: "醇醪", + olchunlao_info: + "①当你的【杀】因弃置进入弃牌堆后,你将位于弃牌堆的这些牌称为“醇”置于武将牌上。②一名角色处于濒死状态时,你可以将一张“醇”置入弃牌堆,然后令其视为使用一张【酒】。", + ol_wangyi: "OL界王异", + ol_wangyi_prefix: "OL界", + olzhenlie: "贞烈", + olzhenlie_info: + "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后你选择一项:①获得使用者的一张牌;②发动一次〖秘计〗。", + olmiji: "秘计", + olmiji_info: + "结束阶段,若你已受伤,则你可以摸X张牌,然后你可以将至多X张牌任意分配给其他角色(X为你已损失的体力值)。", - onlyOL_yijiang1:'OL专属·将1', - onlyOL_yijiang2:'OL专属·将2', - onlyOL_yijiang3:'OL专属·将3', - onlyOL_sb:'OL专属·上兵伐谋', + onlyOL_yijiang1: "OL专属·将1", + onlyOL_yijiang2: "OL专属·将2", + onlyOL_yijiang3: "OL专属·将3", + onlyOL_sb: "OL专属·上兵伐谋", }, }; }); diff --git a/character/ow.js b/character/ow.js index f3a30e768..33e437721 100644 --- a/character/ow.js +++ b/character/ow.js @@ -1,573 +1,612 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'ow', - character:{ - ow_liekong:['female','shu',3,['shanxian','shanhui']], - ow_sishen:['male','shu',4,['xiandan','yihun','shouge']], - ow_tianshi:['female','qun',3,['shouhu','ziyu','feiying']], - ow_falaozhiying:['female','shu',3,['feidan','huoyu','feiying']], - ow_zhixuzhiguang:['female','qun',3,['guangshu']], - ow_luxiao:['male','wu',3,['yuedong','kuoyin','huhuan']], - ow_shibing:['male','shu',4,['tuji','mujing','lichang']], - ow_yuanshi:['male','qun',3,['feiren','lianpo','zhanlong']], - ow_chanyata:['male','qun',3,['xie','luan','sheng']], - ow_dva:['female','shu',2,['jijia','tuijin','zihui','chongzhuang']], - ow_mei:['female','wei',3,['bingqiang','jidong','baoxue']], - ow_ana:['female','wei',3,['zhiyuan','mianzhen','aqianghua']], - ow_heibaihe:['female','qun',3,['juji','duwen','dulei']], - ow_maikelei:['male','shu',4,['shanguang','tiandan','shenqiang']], - ow_kuangshu:['male','shu',3,['liudan','shoujia','shihuo']], + name: "ow", + character: { + ow_liekong: ["female", "shu", 3, ["shanxian", "shanhui"]], + ow_sishen: ["male", "shu", 4, ["xiandan", "yihun", "shouge"]], + ow_tianshi: ["female", "qun", 3, ["shouhu", "ziyu", "feiying"]], + ow_falaozhiying: ["female", "shu", 3, ["feidan", "huoyu", "feiying"]], + ow_zhixuzhiguang: ["female", "qun", 3, ["guangshu"]], + ow_luxiao: ["male", "wu", 3, ["yuedong", "kuoyin", "huhuan"]], + ow_shibing: ["male", "shu", 4, ["tuji", "mujing", "lichang"]], + ow_yuanshi: ["male", "qun", 3, ["feiren", "lianpo", "zhanlong"]], + ow_chanyata: ["male", "qun", 3, ["xie", "luan", "sheng"]], + ow_dva: ["female", "shu", 2, ["jijia", "tuijin", "zihui", "chongzhuang"]], + ow_mei: ["female", "wei", 3, ["bingqiang", "jidong", "baoxue"]], + ow_ana: ["female", "wei", 3, ["zhiyuan", "mianzhen", "aqianghua"]], + ow_heibaihe: ["female", "qun", 3, ["juji", "duwen", "dulei"]], + ow_maikelei: ["male", "shu", 4, ["shanguang", "tiandan", "shenqiang"]], + ow_kuangshu: ["male", "shu", 3, ["liudan", "shoujia", "shihuo"]], - ow_tuobiang:['male','shu',3,['paotai','maoding']], - ow_baolei:['male','qun',4,['bshaowei','zhencha']], - ow_banzang:['male','qun',4,['bfengshi','yinbo']], - ow_laiyinhate:['male','qun',4,['zhongdun','mengji']], - ow_luba:['male','shu',4,['liangou','xiyang']], - ow_wensidun:['male','shu',4,['feitiao','dianji']], - ow_zhaliya:['female','wei',4,['pingzhang','owliyong']], + ow_tuobiang: ["male", "shu", 3, ["paotai", "maoding"]], + ow_baolei: ["male", "qun", 4, ["bshaowei", "zhencha"]], + ow_banzang: ["male", "qun", 4, ["bfengshi", "yinbo"]], + ow_laiyinhate: ["male", "qun", 4, ["zhongdun", "mengji"]], + ow_luba: ["male", "shu", 4, ["liangou", "xiyang"]], + ow_wensidun: ["male", "shu", 4, ["feitiao", "dianji"]], + ow_zhaliya: ["female", "wei", 4, ["pingzhang", "owliyong"]], - ow_heiying:['female','wei',3,['qinru','yinshen','maichong']], - ow_orisa:['female','wu',4,['qianggu','woliu']], + ow_heiying: ["female", "wei", 3, ["qinru", "yinshen", "maichong"]], + ow_orisa: ["female", "wu", 4, ["qianggu", "woliu"]], }, - characterIntro:{ - ow_orisa:'奥丽莎是用在努巴尼昙花一现的OR15防御机器人的零件组装而成的,她是这座城市的新一代守护者,但依然有很大的成长空间', - ow_liekong:'莉娜·奥克斯顿(代号:“猎空”)是守望先锋原型机试飞计划的最年轻成员。但在第一次试飞过程中,原型机的传送阵列出现故障,包括飞行员在内完全失踪。莉娜在几个月后再次出现,不过她身上的分子却无法和时间流同步。这种被称为“时间解离”的症状使她彻底变成了一个“活生生”的幽灵,时隐时现。直到一位名叫温斯顿的科学家设计出了“时间加速器”,一台可以让“猎空”维持在当前时间的装置。不仅如此,这一装置还让“猎空”有能力控制她自己的时间流,使她可以任意加速或减慢时间。有了这一全新的能力,她成了守望先锋最强大的特工之一。守望先锋解散后,“猎空”依旧选择为了正义而战,守护无辜。', - ow_sishen:'关于这个黑袍恐怖分子的传闻并不多,只知道大家都称他为“死神”。虽然没人知道他的真实身份和动机,但有一点是可以肯定的,他的出现意味着死亡。“死神”是一名极其不稳定、残暴、冷酷的雇佣兵,在世界各地犯下多起恐怖袭击案件。在过去的数十年间,他参与了许多武装冲突,但其本人却不属于任何组织。在多年的追踪后,“死神”神秘的面纱终于被慢慢揭开。据信,“死神”正在追杀前守望先锋特工并系统地逐一消灭。', - ow_tianshi:'齐格勒是瑞士一家顶尖医院的手术部门负责人。正是她在医学领域的成就,引起了守望先锋的注意。由于齐格勒的双亲都被战争夺走了生命,因此她从一开始就极其反对该组织通过军事手段进行维和。但最终,她意识到守望先锋给她提供了一个可以拯救更多人生命的机会。作为守望先锋医学研究部门的负责人,安吉拉致力于更好地在前线治疗受到致命伤的病员。尽管她对守望先锋做出了巨大的贡献,但齐格勒博士经常质疑她的上司以及守望先锋的长远目标。而当守望先锋解散之后,齐格勒博士便致力于帮助那些受战争波及的受难者。', - ow_falaozhiying:'本名法芮尔,来自一个军功卓越的军人世家,贡献与荣耀就是她最高的追求。在加入埃及军队后,她的坚韧和在战术上的天赋使她很快就晋升为了一名军官。作为一名果敢的领袖,任何在她手下服役的士兵都对她抱有绝对的忠诚。有了所有这些卓越的表现,法芮尔自然成了守望先锋最青睐的一名候选人。但在她正式加入之前,守望先锋就解散了。当她带着所有的荣誉退役后,法芮尔加入了一家名为“海力士国际安保”的私人安保公司,该公司的最重要的一笔订单就是负责保护吉萨高原地下的人工智能研究设施。尽管她对守望先锋的解散感到无比的遗憾,但她依旧梦想着能为正义而战并改变这个残破的世界。', - ow_zhixuzhiguang:'当被认为是为数不多可以成为光子建筑师的人才之后,年轻的塞特娅·法斯瓦尼离开了贫穷的家乡,成为了费斯卡光子建筑师学院的一员。她很快就成为了乌托邦最顶尖的光子建筑师。但费斯卡集团在塞特娅身上还是看到了更广阔的发展潜力。费斯卡集团称其为“秩序之光”,为了集团的利益和扩大在其他国家的影响力,将其派遣到全球执行秘密任务。虽然“秩序之光”相信她的所作所为是为了实现人性之“大善”,但有时候她也会怀疑她所希望实现的控制和秩序,是否真的是人类最需要的。', - ow_luxiao:'卢西奥•科雷亚•多斯桑托斯在里约热内卢长大。“智能危机”结束后,由于经济的一蹶不振导致这里变成了一个贫穷拥挤的贫民区。他想找到一个办法激发周围人的信心与活力:音乐。他开始在街边、社区派对进行表演,随着年龄的增长便开始了一系列传奇的地下演出。但当多国集团费斯卡集团计划重建城市的大部分地区时,卢西奥所在的社区陷入了混乱,人们失去了自由。卢西奥绝对不会容忍这一切。他偷走了费斯卡用来压迫人民的音波技术,反过来将人们团结在一起。最终,在一场暴动中,他们将费斯卡集团赶出了家园。卢西奥的领导能力让他在一夜之间成为了明星和社会正能量的象征。他的音乐在人们心中的地位如火箭般蹿升。随着影响力的不断扩大,卢西奥意识到他有机会可以改变这个世界,让这个世界变得更美好。', - ow_shibing:'被全球通缉的独行侠“士兵:76”独自一人发动了一场旨在查出守望先锋解散真相的战争。“士兵:76”在全球一系列针对金融机构、秘密集团和守望先锋基地的袭击活动中被曝光。尽管外界至今不清楚他的动机是什么,但有人认为他曾是一位守望先锋特工,决心查出守望先锋垮台的幕后黑手。', - ow_yuanshi:'岛田忍者家族大名最年轻的儿子,但对家族的非法生意毫无兴趣,被视为一个危险的累赘。在家族大名意外死亡后,他与哥哥半藏的矛盾激化,最终导致了一场生死对决,源氏也因此差点送命。后来被守望先锋救下,并被改造成机械忍者以摧毁他父亲的邪恶帝国。在完成任务后,源氏因无法接受自己的机械身躯,离开了守户先锋,并游历世界希望能找到自己存在的意义。数年之后,他遇到了智械僧侣禅雅塔,并且在这位僧侣的引导下,源氏体内的人类和机械体验终于融合在了一起。他开始明白,尽管他有一副机械身躯,但他的人类灵魂是完整的,他渐渐意识到自己的新形态是给予自己的恩赐和力量。', - ow_chanyata:'在“智能危机”结束之后,一群被放逐的智能机器人感受到了被其称为“灵魂觉醒”的升华之道,他们渐渐相信他们和人类一样,同样拥有灵魂。由神秘僧侣泰哈撒·孟达塔带领的这些僧侣开始寻找让人类和机器人重回曾经的和谐相处之道。他们最终被世人所接纳,并得到了全球数百万人的支持。但其中一位僧侣,禅雅塔并不赞同这一新道路。他认为要解决人类和机器人之间根深蒂固的问题,不能依靠循循善诱,而必须通过个体联系和互动。最终,他选择离开寺庙,游走世界,帮助那些他所遇到的人摆脱凡尘。但如果有必要,他也会为了保护无辜而拿起武器,无论人类还是机器人。', - ow_dva:'D.Va曾是一名职业玩家,而现在则利用自己的技巧驾驶一台尖端机甲保卫国家。随着智能机械不断进化,它最终干扰了MEKA的无人机控制网络,迫使军方派驾驶员驾驶这些机甲。由于难以找到合适的候选人,政府开始向那些拥有足以操控机甲尖端武器系统的必要反应和本能的国内职业玩家寻求帮助,其中就包括顶尖玩家之一的“D.Va”宋哈娜。作为一名为了获胜不惜一切代价的精英玩家,D.Va从来都不会对对手表现出丝毫的仁慈。D.Va将这次新任务视为一款全新的游戏,无所畏惧地和其他MEKA机甲冲向战场,随时准备保卫自己的国家。最近,她开始向她的粉丝直播战斗行动,而这也让她成为了世界巨星。', - ow_mei:'守望先锋为了查明全球不断升级的怪异气候现象的真正原因,在世界各个位置建立了一系列生态监测站。周美灵就是这一长久项目的成员之一。当她来到该项目的南极洲监控站时,一场突如其来的极地风暴摧毁了大部分设施并将这里与外界隔绝了开来。随着补给物资的不断消耗,科学家们进入了急冻状态希望能够撑到救援队抵达的那一天。但救援并没有抵达。几年后,当这些科学家的急冻舱最终被发现时,美是唯一的幸存者。此时,守望先锋已经解散,所有的生态监测站也都已经被废弃,他们之前收集的研究数据全部丢失。美最终决定独自继续她的工作。她带上了一台可穿戴式气候控制装置,游历世界,希望能够重新建立起生态监测网络,查出威胁着这个星球生态系统的真正原因。', - ow_ana:'守望先锋的创始成员之一,世界公认的顶级狙击手。智械危机结束后,安娜被晋升为了上尉。尽管身居要职,但已年过半百的安娜拒绝离开战场,依然亲临前线。直至在一次人质解救行动中,遭遇了一个叫做“黑百合”的黑爪特工,所有人都认为安娜死在了那场战斗中。但事实上,安娜活了下来,身受重伤并且失去了自己的右眼。在恢复期间,她感受到了战斗中生命的不可承受之重,因此决定就此隐居。然而随着时间一天天过去,看着自己家乡遭到的威胁愈演愈烈,她突然意识到自己依然有责任保护身边的亲人。在“征用”了守望先锋军械库中的装备后,安娜重新回到了这个世界,为了一个更安全、稳定的和平世界而战。', - ow_heibaihe:'“黑百合”在成为如今的杀手之前,曾与对抗恐怖组织“黑爪”的守望先锋探员杰哈·拉克瓦结婚。在多次刺杀杰哈无果之后,黑爪决定将目标转向他的妻子,艾米丽。黑爪特工绑架了艾米丽并对其进行了一项高强度神经重构计划。他们击垮了她的意志,抑制了其本身的人性,将其变成了一个潜伏特工。她最终被守望先锋探员找到并在确认无致命伤之后重新过上了以前的生活。两周之后,她杀死了睡梦中的杰哈,并回归了黑爪。', - ow_maikelei:'曾是美国西南部因非法军火交易而臭名昭著的“死局”帮中,最令人胆寒的一员,后被守望先锋逮捕。由于其枪法精湛且足智多谋,守望先锋给了他两个选择:在最高安全级别的监狱中度过余生,或加入守望先锋的秘密行动部队“暗影守望”。他选择了后者。尽管一开始他对守望先锋的理念嗤之以鼻,但他逐渐相信可以通过扫除世上的不公,来弥补自己过去犯下的罪行。后来,暗影守望内部出现了异样的气氛:废除守望先锋,独掌大权。麦克雷由于不想参与其中,于是便独自离开,销声匿迹。多年之后,他以雇佣兵的身份再次出现。尽管许多大小团体都想拉拢他,但他只为自己眼中的正义而战。', - ow_kuangshu:'由于澳大利亚智能中枢核心在遭到攻击后发生爆炸,这片地区现在变成了寸草不生的辐射荒地。但即便如此,还是有一群自称为“拾荒者”的人类生存了下来。他们在残骸中寻找一切还可利用的东西,渐渐形成了一个野蛮、危险的团体。“狂鼠”就是其中的一员。和其他人一样,他也受到了辐射,因此变成了一个痴迷于危险炸弹的疯子。当他在中枢废墟中发掘出一个极其珍贵的宝藏后,全世界都知道了这个疯子的名号。尽管几乎没人知道他到底发现了什么,但他身后总有数不清的赏金猎人、黑帮和投机分子想要杀掉他,直到他与“拾荒者”打手“路霸”达到了一个协议:只要今后找到的宝贝五五分成,“路霸”就会是“狂鼠”的私人保镖。', - ow_tuobiang:'托比昂是一个极其不信任智械的天才工程师,但他的同行都认为这只是他杞人忧天而已。但托比昂最担心的事情最终还是发生了,一场机器人对抗其人类发明者的“智能危机”在全球范围内爆发。由于其在工程学方面的天才造诣,守望先锋向他伸出了橄榄枝,并将其纳入了最早的守望先锋攻击部队,而他也证明了自己在终结这场危机中的关键价值。但在守望先锋解散后,托比昂设计出的许多武器被偷走并被藏在世界各地。出于对自己作品的责任心,托比昂便发誓不能让这些武器落入敌手,危害无辜的世人。', - ow_baolei:'“堡垒”系列在设计之初是被用于维和目的的,这一系列的机器单位拥有能够快速在突击和攻城模式之间转换的独特能力。但在“智能危机”期间,该系列却被用来对抗其人类发明者,成为了机器人叛军的中坚力量。随着后来危机的解除,几乎所有的“堡垒”系列机器人都被销毁或拆解。直到今天,“堡垒”依旧是当年那场可怕战争的代名词。但是有一台独特的“堡垒”机器人,在那场战争的决战中严重受损,因此被遗忘了数十年。直到有一天,它被意外地重新激活,它的战斗程序几乎全部受损,取而代之的是对自然世界及其住民的强烈好奇。好奇的“堡垒”于是在这个被战火蹂躏过的世界上,开始了探索和寻找自我价值的旅途。', - ow_banzang:'岛田家据传已有数百年的历史。以忍者为主要成员的岛田家,经过多年的发展,已经建立起一个以军火和非法物资交易为主的庞大黑道帝国。作为大名的长子,半藏注定要继承他的父亲统治岛田帝国。父亲过世后,家族长老就建议半藏帮助他那刚愎自用的弟弟源氏,以便两人携手管理岛田帝国。在遭到源氏拒绝后,半藏被迫亲手了结了自己的弟弟。半藏因此深受打击,他拒绝继承父亲的遗产并最终抛弃了自己的家族和所有辛苦换来的成果。现在,半藏四海为家,不断磨练着自己作为一名武士的技巧,希望终有一天能挽回自己的名誉并真正放下自己的过去。', - ow_laiyinhate:'莱因哈特•威尔海姆的行事作风就像一个属于过去的勇士,时刻铭记着骑士的信条:无畏、公正、勇敢。莱因哈特独特的道德观和舍小为大的信念,深得其上级的喜爱。他有话直说,因此成为了守望先锋最坚定的拥护者,同时在有必要时,也是守望先锋最刻薄的批评者,时刻提醒着其他人,守望先锋是一支正义之师。莱因哈特一直服役到将近六十岁,因此不得不面临强制退役。而守望先锋又深陷腐败和煽动叛乱之嫌的泥沼,莱因哈特只能眼睁睁地看着自己守护了一生的信念被吞噬。尽管守望先锋最终解散,但莱因哈特绝不会在世界陷入混乱之时袖手旁观。他再一次穿上了十字军战甲,立誓为正义而战,像曾经的白银骑士那样守护欧罗巴大陆无辜的人民,坚信光明的未来必将到来。', - ow_luba:'“路霸”马可曾是众多居住在澳洲内陆的居民之一。在智能危机爆发后,政府作出了一个极具争议的决定,将这里送给了差点摧毁整个国家的智能机器人,以求达成永久的和平协定。这一决定直接导致马可和大批居民被迫离开,因失去家园而怒不可遏的马可和其他人开始了一场暴力起义,最终,引发了一场大爆炸,导致周围数公里地区全部遭到辐射,只留下了变形的金属和残骸。为了在这种环境下生存下来,他戴上了面具、骑着破烂摩托开上了通往澳洲内陆的残破高速公路。一路上,他的人性一点一点地被消磨,马可最终消失了,而“路霸”就此诞生。', - ow_wensidun:'在“地平线”月球殖民地的居民中,有一群经过基因改造的大猩猩。其中一只大猩猩在接受了哈罗德·温斯顿博士团队的基因改造后,显示出了极快的脑部发育迹象,博士本人也将人类科学和创造力教给了这只猩猩。但当其他大猩猩发动叛乱,杀死了所有科学家并占领殖民地后,他的生活便再也回不到过去了。出于对哈罗德博士的爱戴,这只大猩猩决定继承他的姓氏:温斯顿,并设计出了一枚临时火箭逃往了地球。他找到了新家:守望先锋 —— 这是一个代表着他所憧憬的所有人性的组织。温斯顿终于有机会实现哈罗德博士生前不断教导他的英雄理念。但随着后来守望先锋的解散,温斯顿也隐居了起来,再一次与他报以厚望的世界失去联系,但他却从未放弃对英雄最终回归的期望。', - ow_zhaliya:'亚历山德拉·查莉娅诺娃是世界上最强壮的女运动员之一。然而就在世锦赛前夕,一直处于休眠状态的西伯利亚机器人控制中枢再度发动攻击,战火再次蔓延到了她的家乡。早已名利双收的亚历山德拉,毅然抛弃了一切,立即回到家乡加入了当地的防御部队。', - ow_heiying:'作为全世界最臭名昭著的黑客,“黑影”利用信息与情报操控权贵。早在她称自己为“黑影”之前,░░░░░░是千千万万在智械危机后变成孤儿的儿童之一。在家乡大部分基础设施都被摧毁的情况下,她依靠自己在黑客以及计算机方面的天赋活了下来。在黑客领域的一连串的胜利让░░░░░░对自己的实力过度自信,最终她在毫无防备的情况下,陷入了一张覆盖全球的阴谋网——并且也因此被人盯上了。由于自己的安全面临严重威胁,░░░░░░不得不删除关于自己的全部信息,从此销声匿迹。后来,她以“黑影”的身份再度出现,经过改造的她决心查出那张阴谋网背后的真相。', + characterIntro: { + ow_orisa: + "奥丽莎是用在努巴尼昙花一现的OR15防御机器人的零件组装而成的,她是这座城市的新一代守护者,但依然有很大的成长空间", + ow_liekong: + "莉娜·奥克斯顿(代号:“猎空”)是守望先锋原型机试飞计划的最年轻成员。但在第一次试飞过程中,原型机的传送阵列出现故障,包括飞行员在内完全失踪。莉娜在几个月后再次出现,不过她身上的分子却无法和时间流同步。这种被称为“时间解离”的症状使她彻底变成了一个“活生生”的幽灵,时隐时现。直到一位名叫温斯顿的科学家设计出了“时间加速器”,一台可以让“猎空”维持在当前时间的装置。不仅如此,这一装置还让“猎空”有能力控制她自己的时间流,使她可以任意加速或减慢时间。有了这一全新的能力,她成了守望先锋最强大的特工之一。守望先锋解散后,“猎空”依旧选择为了正义而战,守护无辜。", + ow_sishen: + "关于这个黑袍恐怖分子的传闻并不多,只知道大家都称他为“死神”。虽然没人知道他的真实身份和动机,但有一点是可以肯定的,他的出现意味着死亡。“死神”是一名极其不稳定、残暴、冷酷的雇佣兵,在世界各地犯下多起恐怖袭击案件。在过去的数十年间,他参与了许多武装冲突,但其本人却不属于任何组织。在多年的追踪后,“死神”神秘的面纱终于被慢慢揭开。据信,“死神”正在追杀前守望先锋特工并系统地逐一消灭。", + ow_tianshi: + "齐格勒是瑞士一家顶尖医院的手术部门负责人。正是她在医学领域的成就,引起了守望先锋的注意。由于齐格勒的双亲都被战争夺走了生命,因此她从一开始就极其反对该组织通过军事手段进行维和。但最终,她意识到守望先锋给她提供了一个可以拯救更多人生命的机会。作为守望先锋医学研究部门的负责人,安吉拉致力于更好地在前线治疗受到致命伤的病员。尽管她对守望先锋做出了巨大的贡献,但齐格勒博士经常质疑她的上司以及守望先锋的长远目标。而当守望先锋解散之后,齐格勒博士便致力于帮助那些受战争波及的受难者。", + ow_falaozhiying: + "本名法芮尔,来自一个军功卓越的军人世家,贡献与荣耀就是她最高的追求。在加入埃及军队后,她的坚韧和在战术上的天赋使她很快就晋升为了一名军官。作为一名果敢的领袖,任何在她手下服役的士兵都对她抱有绝对的忠诚。有了所有这些卓越的表现,法芮尔自然成了守望先锋最青睐的一名候选人。但在她正式加入之前,守望先锋就解散了。当她带着所有的荣誉退役后,法芮尔加入了一家名为“海力士国际安保”的私人安保公司,该公司的最重要的一笔订单就是负责保护吉萨高原地下的人工智能研究设施。尽管她对守望先锋的解散感到无比的遗憾,但她依旧梦想着能为正义而战并改变这个残破的世界。", + ow_zhixuzhiguang: + "当被认为是为数不多可以成为光子建筑师的人才之后,年轻的塞特娅·法斯瓦尼离开了贫穷的家乡,成为了费斯卡光子建筑师学院的一员。她很快就成为了乌托邦最顶尖的光子建筑师。但费斯卡集团在塞特娅身上还是看到了更广阔的发展潜力。费斯卡集团称其为“秩序之光”,为了集团的利益和扩大在其他国家的影响力,将其派遣到全球执行秘密任务。虽然“秩序之光”相信她的所作所为是为了实现人性之“大善”,但有时候她也会怀疑她所希望实现的控制和秩序,是否真的是人类最需要的。", + ow_luxiao: + "卢西奥•科雷亚•多斯桑托斯在里约热内卢长大。“智能危机”结束后,由于经济的一蹶不振导致这里变成了一个贫穷拥挤的贫民区。他想找到一个办法激发周围人的信心与活力:音乐。他开始在街边、社区派对进行表演,随着年龄的增长便开始了一系列传奇的地下演出。但当多国集团费斯卡集团计划重建城市的大部分地区时,卢西奥所在的社区陷入了混乱,人们失去了自由。卢西奥绝对不会容忍这一切。他偷走了费斯卡用来压迫人民的音波技术,反过来将人们团结在一起。最终,在一场暴动中,他们将费斯卡集团赶出了家园。卢西奥的领导能力让他在一夜之间成为了明星和社会正能量的象征。他的音乐在人们心中的地位如火箭般蹿升。随着影响力的不断扩大,卢西奥意识到他有机会可以改变这个世界,让这个世界变得更美好。", + ow_shibing: + "被全球通缉的独行侠“士兵:76”独自一人发动了一场旨在查出守望先锋解散真相的战争。“士兵:76”在全球一系列针对金融机构、秘密集团和守望先锋基地的袭击活动中被曝光。尽管外界至今不清楚他的动机是什么,但有人认为他曾是一位守望先锋特工,决心查出守望先锋垮台的幕后黑手。", + ow_yuanshi: + "岛田忍者家族大名最年轻的儿子,但对家族的非法生意毫无兴趣,被视为一个危险的累赘。在家族大名意外死亡后,他与哥哥半藏的矛盾激化,最终导致了一场生死对决,源氏也因此差点送命。后来被守望先锋救下,并被改造成机械忍者以摧毁他父亲的邪恶帝国。在完成任务后,源氏因无法接受自己的机械身躯,离开了守户先锋,并游历世界希望能找到自己存在的意义。数年之后,他遇到了智械僧侣禅雅塔,并且在这位僧侣的引导下,源氏体内的人类和机械体验终于融合在了一起。他开始明白,尽管他有一副机械身躯,但他的人类灵魂是完整的,他渐渐意识到自己的新形态是给予自己的恩赐和力量。", + ow_chanyata: + "在“智能危机”结束之后,一群被放逐的智能机器人感受到了被其称为“灵魂觉醒”的升华之道,他们渐渐相信他们和人类一样,同样拥有灵魂。由神秘僧侣泰哈撒·孟达塔带领的这些僧侣开始寻找让人类和机器人重回曾经的和谐相处之道。他们最终被世人所接纳,并得到了全球数百万人的支持。但其中一位僧侣,禅雅塔并不赞同这一新道路。他认为要解决人类和机器人之间根深蒂固的问题,不能依靠循循善诱,而必须通过个体联系和互动。最终,他选择离开寺庙,游走世界,帮助那些他所遇到的人摆脱凡尘。但如果有必要,他也会为了保护无辜而拿起武器,无论人类还是机器人。", + ow_dva: "D.Va曾是一名职业玩家,而现在则利用自己的技巧驾驶一台尖端机甲保卫国家。随着智能机械不断进化,它最终干扰了MEKA的无人机控制网络,迫使军方派驾驶员驾驶这些机甲。由于难以找到合适的候选人,政府开始向那些拥有足以操控机甲尖端武器系统的必要反应和本能的国内职业玩家寻求帮助,其中就包括顶尖玩家之一的“D.Va”宋哈娜。作为一名为了获胜不惜一切代价的精英玩家,D.Va从来都不会对对手表现出丝毫的仁慈。D.Va将这次新任务视为一款全新的游戏,无所畏惧地和其他MEKA机甲冲向战场,随时准备保卫自己的国家。最近,她开始向她的粉丝直播战斗行动,而这也让她成为了世界巨星。", + ow_mei: "守望先锋为了查明全球不断升级的怪异气候现象的真正原因,在世界各个位置建立了一系列生态监测站。周美灵就是这一长久项目的成员之一。当她来到该项目的南极洲监控站时,一场突如其来的极地风暴摧毁了大部分设施并将这里与外界隔绝了开来。随着补给物资的不断消耗,科学家们进入了急冻状态希望能够撑到救援队抵达的那一天。但救援并没有抵达。几年后,当这些科学家的急冻舱最终被发现时,美是唯一的幸存者。此时,守望先锋已经解散,所有的生态监测站也都已经被废弃,他们之前收集的研究数据全部丢失。美最终决定独自继续她的工作。她带上了一台可穿戴式气候控制装置,游历世界,希望能够重新建立起生态监测网络,查出威胁着这个星球生态系统的真正原因。", + ow_ana: "守望先锋的创始成员之一,世界公认的顶级狙击手。智械危机结束后,安娜被晋升为了上尉。尽管身居要职,但已年过半百的安娜拒绝离开战场,依然亲临前线。直至在一次人质解救行动中,遭遇了一个叫做“黑百合”的黑爪特工,所有人都认为安娜死在了那场战斗中。但事实上,安娜活了下来,身受重伤并且失去了自己的右眼。在恢复期间,她感受到了战斗中生命的不可承受之重,因此决定就此隐居。然而随着时间一天天过去,看着自己家乡遭到的威胁愈演愈烈,她突然意识到自己依然有责任保护身边的亲人。在“征用”了守望先锋军械库中的装备后,安娜重新回到了这个世界,为了一个更安全、稳定的和平世界而战。", + ow_heibaihe: + "“黑百合”在成为如今的杀手之前,曾与对抗恐怖组织“黑爪”的守望先锋探员杰哈·拉克瓦结婚。在多次刺杀杰哈无果之后,黑爪决定将目标转向他的妻子,艾米丽。黑爪特工绑架了艾米丽并对其进行了一项高强度神经重构计划。他们击垮了她的意志,抑制了其本身的人性,将其变成了一个潜伏特工。她最终被守望先锋探员找到并在确认无致命伤之后重新过上了以前的生活。两周之后,她杀死了睡梦中的杰哈,并回归了黑爪。", + ow_maikelei: + "曾是美国西南部因非法军火交易而臭名昭著的“死局”帮中,最令人胆寒的一员,后被守望先锋逮捕。由于其枪法精湛且足智多谋,守望先锋给了他两个选择:在最高安全级别的监狱中度过余生,或加入守望先锋的秘密行动部队“暗影守望”。他选择了后者。尽管一开始他对守望先锋的理念嗤之以鼻,但他逐渐相信可以通过扫除世上的不公,来弥补自己过去犯下的罪行。后来,暗影守望内部出现了异样的气氛:废除守望先锋,独掌大权。麦克雷由于不想参与其中,于是便独自离开,销声匿迹。多年之后,他以雇佣兵的身份再次出现。尽管许多大小团体都想拉拢他,但他只为自己眼中的正义而战。", + ow_kuangshu: + "由于澳大利亚智能中枢核心在遭到攻击后发生爆炸,这片地区现在变成了寸草不生的辐射荒地。但即便如此,还是有一群自称为“拾荒者”的人类生存了下来。他们在残骸中寻找一切还可利用的东西,渐渐形成了一个野蛮、危险的团体。“狂鼠”就是其中的一员。和其他人一样,他也受到了辐射,因此变成了一个痴迷于危险炸弹的疯子。当他在中枢废墟中发掘出一个极其珍贵的宝藏后,全世界都知道了这个疯子的名号。尽管几乎没人知道他到底发现了什么,但他身后总有数不清的赏金猎人、黑帮和投机分子想要杀掉他,直到他与“拾荒者”打手“路霸”达到了一个协议:只要今后找到的宝贝五五分成,“路霸”就会是“狂鼠”的私人保镖。", + ow_tuobiang: + "托比昂是一个极其不信任智械的天才工程师,但他的同行都认为这只是他杞人忧天而已。但托比昂最担心的事情最终还是发生了,一场机器人对抗其人类发明者的“智能危机”在全球范围内爆发。由于其在工程学方面的天才造诣,守望先锋向他伸出了橄榄枝,并将其纳入了最早的守望先锋攻击部队,而他也证明了自己在终结这场危机中的关键价值。但在守望先锋解散后,托比昂设计出的许多武器被偷走并被藏在世界各地。出于对自己作品的责任心,托比昂便发誓不能让这些武器落入敌手,危害无辜的世人。", + ow_baolei: + "“堡垒”系列在设计之初是被用于维和目的的,这一系列的机器单位拥有能够快速在突击和攻城模式之间转换的独特能力。但在“智能危机”期间,该系列却被用来对抗其人类发明者,成为了机器人叛军的中坚力量。随着后来危机的解除,几乎所有的“堡垒”系列机器人都被销毁或拆解。直到今天,“堡垒”依旧是当年那场可怕战争的代名词。但是有一台独特的“堡垒”机器人,在那场战争的决战中严重受损,因此被遗忘了数十年。直到有一天,它被意外地重新激活,它的战斗程序几乎全部受损,取而代之的是对自然世界及其住民的强烈好奇。好奇的“堡垒”于是在这个被战火蹂躏过的世界上,开始了探索和寻找自我价值的旅途。", + ow_banzang: + "岛田家据传已有数百年的历史。以忍者为主要成员的岛田家,经过多年的发展,已经建立起一个以军火和非法物资交易为主的庞大黑道帝国。作为大名的长子,半藏注定要继承他的父亲统治岛田帝国。父亲过世后,家族长老就建议半藏帮助他那刚愎自用的弟弟源氏,以便两人携手管理岛田帝国。在遭到源氏拒绝后,半藏被迫亲手了结了自己的弟弟。半藏因此深受打击,他拒绝继承父亲的遗产并最终抛弃了自己的家族和所有辛苦换来的成果。现在,半藏四海为家,不断磨练着自己作为一名武士的技巧,希望终有一天能挽回自己的名誉并真正放下自己的过去。", + ow_laiyinhate: + "莱因哈特•威尔海姆的行事作风就像一个属于过去的勇士,时刻铭记着骑士的信条:无畏、公正、勇敢。莱因哈特独特的道德观和舍小为大的信念,深得其上级的喜爱。他有话直说,因此成为了守望先锋最坚定的拥护者,同时在有必要时,也是守望先锋最刻薄的批评者,时刻提醒着其他人,守望先锋是一支正义之师。莱因哈特一直服役到将近六十岁,因此不得不面临强制退役。而守望先锋又深陷腐败和煽动叛乱之嫌的泥沼,莱因哈特只能眼睁睁地看着自己守护了一生的信念被吞噬。尽管守望先锋最终解散,但莱因哈特绝不会在世界陷入混乱之时袖手旁观。他再一次穿上了十字军战甲,立誓为正义而战,像曾经的白银骑士那样守护欧罗巴大陆无辜的人民,坚信光明的未来必将到来。", + ow_luba: + "“路霸”马可曾是众多居住在澳洲内陆的居民之一。在智能危机爆发后,政府作出了一个极具争议的决定,将这里送给了差点摧毁整个国家的智能机器人,以求达成永久的和平协定。这一决定直接导致马可和大批居民被迫离开,因失去家园而怒不可遏的马可和其他人开始了一场暴力起义,最终,引发了一场大爆炸,导致周围数公里地区全部遭到辐射,只留下了变形的金属和残骸。为了在这种环境下生存下来,他戴上了面具、骑着破烂摩托开上了通往澳洲内陆的残破高速公路。一路上,他的人性一点一点地被消磨,马可最终消失了,而“路霸”就此诞生。", + ow_wensidun: + "在“地平线”月球殖民地的居民中,有一群经过基因改造的大猩猩。其中一只大猩猩在接受了哈罗德·温斯顿博士团队的基因改造后,显示出了极快的脑部发育迹象,博士本人也将人类科学和创造力教给了这只猩猩。但当其他大猩猩发动叛乱,杀死了所有科学家并占领殖民地后,他的生活便再也回不到过去了。出于对哈罗德博士的爱戴,这只大猩猩决定继承他的姓氏:温斯顿,并设计出了一枚临时火箭逃往了地球。他找到了新家:守望先锋 —— 这是一个代表着他所憧憬的所有人性的组织。温斯顿终于有机会实现哈罗德博士生前不断教导他的英雄理念。但随着后来守望先锋的解散,温斯顿也隐居了起来,再一次与他报以厚望的世界失去联系,但他却从未放弃对英雄最终回归的期望。", + ow_zhaliya: + "亚历山德拉·查莉娅诺娃是世界上最强壮的女运动员之一。然而就在世锦赛前夕,一直处于休眠状态的西伯利亚机器人控制中枢再度发动攻击,战火再次蔓延到了她的家乡。早已名利双收的亚历山德拉,毅然抛弃了一切,立即回到家乡加入了当地的防御部队。", + ow_heiying: + "作为全世界最臭名昭著的黑客,“黑影”利用信息与情报操控权贵。早在她称自己为“黑影”之前,░░░░░░是千千万万在智械危机后变成孤儿的儿童之一。在家乡大部分基础设施都被摧毁的情况下,她依靠自己在黑客以及计算机方面的天赋活了下来。在黑客领域的一连串的胜利让░░░░░░对自己的实力过度自信,最终她在毫无防备的情况下,陷入了一张覆盖全球的阴谋网——并且也因此被人盯上了。由于自己的安全面临严重威胁,░░░░░░不得不删除关于自己的全部信息,从此销声匿迹。后来,她以“黑影”的身份再度出现,经过改造的她决心查出那张阴谋网背后的真相。", }, - skill:{ - woliu:{ - trigger:{player:'phaseEnd'}, - direct:true, - unique:true, - forceunique:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('woliu'),lib.filter.notMe,[1,2]).ai=function(target){ - if(get.attitude(player,target)<0){ - return get.effect(target,{name:'sha'},player,player); + skill: { + woliu: { + trigger: { player: "phaseEnd" }, + direct: true, + unique: true, + forceunique: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("woliu"), lib.filter.notMe, [1, 2]).ai = function ( + target + ) { + if (get.attitude(player, target) < 0) { + return get.effect(target, { name: "sha" }, player, player); } return 0; - } - 'step 1' - if(result.bool){ - player.logSkill('woliu',result.targets); - var list=[player].concat(result.targets); - for(var i=0;i0){ - return [0,num]; + if (target.hasSkill("qianggu2") && get.attitude(player, target) > 0) { + return [0, num]; } - if(target.hp==1&&!target.hasShan()) return; - return [1,num]; + if (target.hp == 1 && !target.hasShan()) return; + return [1, num]; } - } - } - } - }, - qianggu:{ - enable:'phaseUse', - usable:1, - filterCard:true, - selectCard:2, - position:'he', - check:function(card){ - return 8-get.value(card); - }, - filter:function(event,player){ - return player.countCards('he')>=2; - }, - content:function(){ - player.changeHujia(2); - player.addTempSkill('qianggu2',{player:'phaseBegin'}); - }, - ai:{ - result:{ - player:1 + }, }, - order:2.5 - } + }, }, - qianggu2:{ - trigger:{target:'useCardToBefore'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'; + qianggu: { + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: 2, + position: "he", + check: function (card) { + return 8 - get.value(card); }, - mark:true, - intro:{ - content:'其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效' + filter: function (event, player) { + return player.countCards("he") >= 2; }, - content:function(){ - "step 0" + content: function () { + player.changeHujia(2); + player.addTempSkill("qianggu2", { player: "phaseBegin" }); + }, + ai: { + result: { + player: 1, + }, + order: 2.5, + }, + }, + qianggu2: { + trigger: { target: "useCardToBefore" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + mark: true, + intro: { + content: "其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效", + }, + content: function () { + "step 0"; var eff; - if(player.hasSkill('woliu2')){ - eff=-get.attitude(trigger.player,player); + if (player.hasSkill("woliu2")) { + eff = -get.attitude(trigger.player, player); + } else { + eff = get.effect(player, trigger.card, trigger.player, trigger.player); } - else{ - eff=get.effect(player,trigger.card,trigger.player,trigger.player); - } - trigger.player.chooseToDiscard('强固:弃置一张基本牌,否则杀对'+get.translation(player)+'无效',function(card){ - return get.type(card)=='basic'; - }).set('ai',function(card){ - if(_status.event.eff>0){ - return 10-get.value(card); - } - return 0; - }).set('eff',eff); - "step 1" - if(result.bool==false){ + trigger.player + .chooseToDiscard( + "强固:弃置一张基本牌,否则杀对" + get.translation(player) + "无效", + function (card) { + return get.type(card) == "basic"; + } + ) + .set("ai", function (card) { + if (_status.event.eff > 0) { + return 10 - get.value(card); + } + return 0; + }) + .set("eff", eff); + ("step 1"); + if (result.bool == false) { trigger.cancel(); } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'){ - if(_status.event.name=='qianggu2') return; - if(get.attitude(player,target)>0) return; - var bs=player.getCards('h',{type:'basic'}); - if(bs.length<2) return 0; - if(player.hasSkill('jiu')||player.hasSkill('tianxianjiu')) return; - if(bs.length<=3&&player.countCards('h','sha')<=1){ - for(var i=0;i 0) return; + var bs = player.getCards("h", { type: "basic" }); + if (bs.length < 2) return 0; + if (player.hasSkill("jiu") || player.hasSkill("tianxianjiu")) return; + if (bs.length <= 3 && player.countCards("h", "sha") <= 1) { + for (var i = 0; i < bs.length; i++) { + if (bs[i].name != "sha" && get.value(bs[i]) < 7) { + return [1, 0, 1, -0.5]; } } return 0; } - return [1,0,1,-0.5]; + return [1, 0, 1, -0.5]; } - } - } - } - }, - dianji:{ - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h')>0; - }, - filterCard:true, - usable:1, - viewAs:{name:'jingleishan',nature:'thunder'}, - check:function(card){ - return 8-get.value(card) - }, - ai:{ - order:8, - expose:0.2, - threaten:1.2 - }, - mod:{ - playerEnabled:function(card,player,target){ - if(_status.event.skill=='dianji'&&get.distance(player,target)>2) return false; - } - } - }, - feitiao:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; - }, - content:function(){ - 'step 0' - var next=player.chooseCardTarget({ - prompt:get.prompt('feitiao'), - position:'he', - filterCard:true, - ai1:function(card){ - return 7-get.value(card); }, - ai2:function(target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - if(!target.countCards('he')) return -0.01; - var dist=get.distance(player,target); - if(dist>2){ - att-=2; - } - else if(dist==2){ + }, + }, + }, + dianji: { + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterCard: true, + usable: 1, + viewAs: { name: "jingleishan", nature: "thunder" }, + check: function (card) { + return 8 - get.value(card); + }, + ai: { + order: 8, + expose: 0.2, + threaten: 1.2, + }, + mod: { + playerEnabled: function (card, player, target) { + if (_status.event.skill == "dianji" && get.distance(player, target) > 2) return false; + }, + }, + }, + feitiao: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + prompt: get.prompt("feitiao"), + position: "he", + filterCard: true, + ai1: function (card) { + return 7 - get.value(card); + }, + ai2: function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if (!target.countCards("he")) return -0.01; + var dist = get.distance(player, target); + if (dist > 2) { + att -= 2; + } else if (dist == 2) { att--; } return -att; }, - filterTarget:function(card,player,target){ - return player!=target; - } + filterTarget: function (card, player, target) { + return player != target; + }, }); - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { player.discard(result.cards); - var target=result.targets[0]; - player.logSkill('feitiao',target); - player.storage.feitiao2=target; - player.addTempSkill('feitiao2'); + var target = result.targets[0]; + player.logSkill("feitiao", target); + player.storage.feitiao2 = target; + player.addTempSkill("feitiao2"); target.randomDiscard(); } - } + }, }, - feitiao2:{ - mod:{ - globalFrom:function(from,to){ - if(to==from.storage.feitiao2) return -Infinity; - } + feitiao2: { + mod: { + globalFrom: function (from, to) { + if (to == from.storage.feitiao2) return -Infinity; + }, }, - mark:'character', - intro:{ - content:'与$的距离视为1直到回合结束' + mark: "character", + intro: { + content: "与$的距离视为1直到回合结束", }, - onremove:true + onremove: true, }, - zhencha:{ - init:function(player){ - player.storage.zhencha=true; + zhencha: { + init: function (player) { + player.storage.zhencha = true; }, - mark:true, - intro:{ - content:function(storage,player){ - if(storage){ - return '每当你使用一张杀,你摸一张牌或回复1点体力'; - } - else if(player.hasSkill('bshaowei')&&player.storage.bshaowei){ - return '你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀'; - } - else{ - return '无额外技能'; - } - } - }, - trigger:{player:'phaseEnd'}, - filter:function(event,player){ - if(player.hasSkill('zhencha2')) return false; - return !player.storage.zhencha; - }, - content:function(){ - player.storage.bshaowei=false; - player.storage.zhencha=true; - if(player.marks.zhencha){ - player.marks.zhencha.firstChild.innerHTML='侦'; - } - player.addTempSkill('zhencha2'); - }, - subSkill:{ - sha:{ - trigger:{player:'shaBegin'}, - direct:true, - filter:function(event,player){ - return player.storage.zhencha&&event.card&&event.card.name=='sha'; - }, - content:function(){ - player.chooseDrawRecover(get.prompt('zhencha')).logSkill='zhencha'; - } - } - }, - group:'zhencha_sha' - }, - bshaowei:{ - init:function(player){ - player.storage.bshaowei=false; - }, - trigger:{player:'phaseEnd'}, - filter:function(event,player){ - if(player.hasSkill('zhencha2')) return false; - return !player.storage.bshaowei; - }, - check:function(event,player){ - if(!player.hasShan()) return true; - if(!player.hasSha()) return false; - return Math.random()<0.5; - }, - content:function(){ - player.storage.bshaowei=true; - player.storage.zhencha=false; - if(player.marks.zhencha){ - player.marks.zhencha.firstChild.innerHTML='哨'; - } - player.addTempSkill('zhencha2'); - }, - subSkill:{ - sha:{ - mod:{ - targetInRange:function(card,player,target,now){ - if(card.name=='sha'&&player.storage.bshaowei) return true; - }, - cardUsable:function(card,player,num){ - if(card.name=='sha'&&player.storage.bshaowei) return Infinity; - } - }, - trigger:{target:'shaBegin',player:'shaBegin'}, - forced:true, - filter:function(event,player){ - return player.storage.bshaowei; - }, - check:function(){ - return false; - }, - content:function(){ - trigger.directHit=true; - }, - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(!player.storage.bshaowei) return false; - if(arg&&arg.name=='sha') return true; - return false; - } - } - } - }, - group:'bshaowei_sha', - ai:{ - threaten:function(player,target){ - if(target.storage.bshaowei) return 1.7; - return 1; - } - } - }, - zhencha2:{}, - pingzhang:{ - trigger:{global:'damageBegin'}, - // alter:true, - intro:{ - content:function(storage,player){ - if(player.hasSkill('pingzhang2')){ - if(player.hasSkill('pingzhang3')){ - return '已对自已和其他角色发动屏障'; - } - else{ - return '已对自已发动屏障'; - } - } - else{ - return '已对其他角色发动屏障'; + mark: true, + intro: { + content: function (storage, player) { + if (storage) { + return "每当你使用一张杀,你摸一张牌或回复1点体力"; + } else if (player.hasSkill("bshaowei") && player.storage.bshaowei) { + return "你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀"; + } else { + return "无额外技能"; } }, - markcount:function(storage,player){ - if(player.hasSkill('pingzhang2')&&player.hasSkill('pingzhang3')){ + }, + trigger: { player: "phaseEnd" }, + filter: function (event, player) { + if (player.hasSkill("zhencha2")) return false; + return !player.storage.zhencha; + }, + content: function () { + player.storage.bshaowei = false; + player.storage.zhencha = true; + if (player.marks.zhencha) { + player.marks.zhencha.firstChild.innerHTML = "侦"; + } + player.addTempSkill("zhencha2"); + }, + subSkill: { + sha: { + trigger: { player: "shaBegin" }, + direct: true, + filter: function (event, player) { + return player.storage.zhencha && event.card && event.card.name == "sha"; + }, + content: function () { + player.chooseDrawRecover(get.prompt("zhencha")).logSkill = "zhencha"; + }, + }, + }, + group: "zhencha_sha", + }, + bshaowei: { + init: function (player) { + player.storage.bshaowei = false; + }, + trigger: { player: "phaseEnd" }, + filter: function (event, player) { + if (player.hasSkill("zhencha2")) return false; + return !player.storage.bshaowei; + }, + check: function (event, player) { + if (!player.hasShan()) return true; + if (!player.hasSha()) return false; + return Math.random() < 0.5; + }, + content: function () { + player.storage.bshaowei = true; + player.storage.zhencha = false; + if (player.marks.zhencha) { + player.marks.zhencha.firstChild.innerHTML = "哨"; + } + player.addTempSkill("zhencha2"); + }, + subSkill: { + sha: { + mod: { + targetInRange: function (card, player, target, now) { + if (card.name == "sha" && player.storage.bshaowei) return true; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha" && player.storage.bshaowei) return Infinity; + }, + }, + trigger: { target: "shaBegin", player: "shaBegin" }, + forced: true, + filter: function (event, player) { + return player.storage.bshaowei; + }, + check: function () { + return false; + }, + content: function () { + trigger.directHit = true; + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (!player.storage.bshaowei) return false; + if (arg && arg.name == "sha") return true; + return false; + }, + }, + }, + }, + group: "bshaowei_sha", + ai: { + threaten: function (player, target) { + if (target.storage.bshaowei) return 1.7; + return 1; + }, + }, + }, + zhencha2: {}, + pingzhang: { + trigger: { global: "damageBegin" }, + // alter:true, + intro: { + content: function (storage, player) { + if (player.hasSkill("pingzhang2")) { + if (player.hasSkill("pingzhang3")) { + return "已对自已和其他角色发动屏障"; + } else { + return "已对自已发动屏障"; + } + } else { + return "已对其他角色发动屏障"; + } + }, + markcount: function (storage, player) { + if (player.hasSkill("pingzhang2") && player.hasSkill("pingzhang3")) { return 2; } return 1; + }, + }, + filter: function (event, player) { + if (event.num <= 0) return false; + var position = get.is.altered("pingzhang") ? "h" : "he"; + if (event.player == player) { + if (player.hasSkill("pingzhang2")) return false; + return player.countCards(position, { suit: "heart" }); + } else { + if (player.hasSkill("pingzhang3")) return false; + return player.countCards(position, { suit: "spade" }); } }, - filter:function(event,player){ - if(event.num<=0) return false; - var position=get.is.altered('pingzhang')?'h':'he'; - if(event.player==player){ - if(player.hasSkill('pingzhang2')) return false; - return player.countCards(position,{suit:'heart'}); - } - else{ - if(player.hasSkill('pingzhang3')) return false; - return player.countCards(position,{suit:'spade'}); - } - }, - direct:true, - content:function(){ - 'step 0' - var position=get.is.altered('pingzhang')?'h':'he'; - var suit=(player==trigger.player)?'heart':'spade'; - var next=player.chooseToDiscard(position,{suit:suit},get.prompt('pingzhang',trigger.player)); - next.ai=function(card){ - if(get.damageEffect(trigger.player,trigger.source,player)<0){ - return 8-get.value(card); + direct: true, + content: function () { + "step 0"; + var position = get.is.altered("pingzhang") ? "h" : "he"; + var suit = player == trigger.player ? "heart" : "spade"; + var next = player.chooseToDiscard( + position, + { suit: suit }, + get.prompt("pingzhang", trigger.player) + ); + next.ai = function (card) { + if (get.damageEffect(trigger.player, trigger.source, player) < 0) { + return 8 - get.value(card); } return 0; - } - next.logSkill=['pingzhang',trigger.player]; - 'step 1' - if(result.bool){ + }; + next.logSkill = ["pingzhang", trigger.player]; + ("step 1"); + if (result.bool) { trigger.num--; - if(player==trigger.player){ - player.addSkill('pingzhang2'); + if (player == trigger.player) { + player.addSkill("pingzhang2"); + } else { + player.addSkill("pingzhang3"); } - else{ - player.addSkill('pingzhang3'); - } - player.markSkill('pingzhang'); + player.markSkill("pingzhang"); } }, - group:['pingzhang_count'], - subSkill:{ - count:{ - trigger:{player:'phaseBegin'}, - silent:true, - content:function(){ - player.storage.pingzhang=0; - if(player.hasSkill('pingzhang2')){ + group: ["pingzhang_count"], + subSkill: { + count: { + trigger: { player: "phaseBegin" }, + silent: true, + content: function () { + player.storage.pingzhang = 0; + if (player.hasSkill("pingzhang2")) { player.storage.pingzhang++; - player.removeSkill('pingzhang2'); + player.removeSkill("pingzhang2"); } - if(player.hasSkill('pingzhang3')){ + if (player.hasSkill("pingzhang3")) { player.storage.pingzhang++; - player.removeSkill('pingzhang3'); + player.removeSkill("pingzhang3"); } - player.unmarkSkill('pingzhang'); - } - } + player.unmarkSkill("pingzhang"); + }, + }, + }, + ai: { + expose: 0.2, + threaten: 1.5, }, - ai:{ - expose:0.2, - threaten:1.5 - } }, - pingzhang2:{}, - pingzhang3:{}, - owliyong:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - filter:function(event,player){ - return player.storage.pingzhang>0; + pingzhang2: {}, + pingzhang3: {}, + owliyong: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + filter: function (event, player) { + return player.storage.pingzhang > 0; + }, + content: function () { + trigger.num += player.storage.pingzhang; }, - content:function(){ - trigger.num+=player.storage.pingzhang; - } }, - liangou:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player; + liangou: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; }, - filterCard:true, - position:'he', - check:function(card){ - return 5-get.value(card); + filterCard: true, + position: "he", + check: function (card) { + return 5 - get.value(card); }, - content:function(){ - 'step 0' - player.judge(function(card){ - return get.suit(card)!='heart'?1:-1; + content: function () { + "step 0"; + player.judge(function (card) { + return get.suit(card) != "heart" ? 1 : -1; }); - 'step 1' - if(result.bool){ - target.addTempSkill('liangou2'); - target.storage.liangou2=player; + ("step 1"); + if (result.bool) { + target.addTempSkill("liangou2"); + target.storage.liangou2 = player; } }, - ai:{ - order:10, - expose:0.2, - result:{ - target:function(player,target){ - if(get.damageEffect(target,player,target)<0&&player.hasCard(function(card){ - return get.tag(card,'damage')?true:false; - })){ + ai: { + order: 10, + expose: 0.2, + result: { + target: function (player, target) { + if ( + get.damageEffect(target, player, target) < 0 && + player.hasCard(function (card) { + return get.tag(card, "damage") ? true : false; + }) + ) { return -1; } return 0; - } - } - } + }, + }, + }, }, - liangou2:{ - mod:{ + liangou2: { + mod: { // cardEnabled:function(card,player){ // return false; // }, @@ -580,16 +619,16 @@ game.import('character', function () { // cardSavable:function(card,player){ // return false; // }, - globalTo:function(from,to){ - if(from==to.storage.liangou2) return -Infinity; - } + globalTo: function (from, to) { + if (from == to.storage.liangou2) return -Infinity; + }, }, - onremove:true, - trigger:{player:'damageBegin'}, - usable:1, - forced:true, - popup:false, - content:function(){ + onremove: true, + trigger: { player: "damageBegin" }, + usable: 1, + forced: true, + popup: false, + content: function () { trigger.num++; }, // ai:{ @@ -601,3065 +640,3275 @@ game.import('character', function () { // } // } }, - xiyang:{ - trigger:{player:'phaseEnd'}, - filter:function(event,player){ - return !player.isTurnedOver()&&player.isDamaged(); + xiyang: { + trigger: { player: "phaseEnd" }, + filter: function (event, player) { + return !player.isTurnedOver() && player.isDamaged(); }, - check:function(event,player){ - return player.hp<=1; + check: function (event, player) { + return player.hp <= 1; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.turnOver(); - 'step 1' + ("step 1"); player.recover(2); - } + }, }, - qinru:{ - trigger:{player:'useCardToBegin'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.target!=player&&event.target&&!event.target.hasSkill('fengyin'); + qinru: { + trigger: { player: "useCardToBegin" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.target != player && + event.target && + !event.target.hasSkill("fengyin") + ); }, - logTarget:'target', - check:function(event,player){ - return get.attitude(player,event.target)<0; + logTarget: "target", + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - intro:{ - content:'players', - mark:function(dialog,storage,player){ - var one=[],two=[],three=[]; - for(var i=0;i1){ + count: { + trigger: { player: "phaseAfter" }, + silent: true, + content: function () { + for (var i = 0; i < player.storage.qinru_turn.length; i++) { + if (player.storage.qinru_turn[i] > 1) { player.storage.qinru_turn[i]--; - } - else{ - player.storage.qinru.splice(i,1); - player.storage.qinru_turn.splice(i,1); + } else { + player.storage.qinru.splice(i, 1); + player.storage.qinru_turn.splice(i, 1); i--; } } - if(!player.storage.qinru.length){ - player.unmarkSkill('qinru'); - } - else{ + if (!player.storage.qinru.length) { + player.unmarkSkill("qinru"); + } else { player.updateMarks(); } - } - } + }, + }, }, - group:['qinru_count','qinru_die'] + group: ["qinru_count", "qinru_die"], }, - yinshen:{ - trigger:{player:'loseEnd'}, - forced:true, - filter:function(event,player){ - if(player.countCards('h',{type:'basic'})) return false; - for(var i=0;i0; }, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('yinshen'),'he',{type:'equip'}); - next.logSkill='yinshen'; - next.ai=function(card){ - if(player.hp==1) return 8-get.value(card); - if(player.isZhu) return 7-get.value(card); - if(player.hp==2) return 6-get.value(card); - return 5-get.value(card); + }, + yinshen_old: { + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("yinshen"), "he", { type: "equip" }); + next.logSkill = "yinshen"; + next.ai = function (card) { + if (player.hp == 1) return 8 - get.value(card); + if (player.isZhu) return 7 - get.value(card); + if (player.hp == 2) return 6 - get.value(card); + return 5 - get.value(card); }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.tempHide(); } }, }, - maichong:{ - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(!player.hasSkill('qinru')||!player.storage.qinru||!player.storage.qinru.length) return false; - if(get.type(event.card)=='trick'&&event.cards[0]&&event.cards[0]==event.card){ - for(var i=0;i0; + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hujia > 0; }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return !target.hujia; }, - filterCard:true, - position:'he', - check:function(card){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current.hp==1&&get.attitude(player,current)>2; - })){ - return 7-get.value(card); + filterCard: true, + position: "he", + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current.hp == 1 && get.attitude(player, current) > 2; + }) + ) { + return 7 - get.value(card); } - return 5-get.value(card); + return 5 - get.value(card); }, - content:function(){ + content: function () { player.changeHujia(-1); target.changeHujia(); }, - ai:{ - order:5, - expose:0.2, - result:{ - target:function(player,target){ - return 1/Math.max(1,target.hp); - } - } - } + ai: { + order: 5, + expose: 0.2, + result: { + target: function (player, target) { + return 1 / Math.max(1, target.hp); + }, + }, + }, }, - maoding:{ - trigger:{player:'damageEnd',source:'damageEnd'}, - frequent:true, - filter:function(event,player){ - if(get.is.altered('maoding')&&event.source!=player) return false; + maoding: { + trigger: { player: "damageEnd", source: "damageEnd" }, + frequent: true, + filter: function (event, player) { + if (get.is.altered("maoding") && event.source != player) return false; return true; }, // alter:true, - content:function(){ - var list=get.typeCard('hslingjian'); - if(!list.length){ + content: function () { + var list = get.typeCard("hslingjian"); + if (!list.length) { return; } - player.gain(game.createCard(list.randomGet()),'gain2'); + player.gain(game.createCard(list.randomGet()), "gain2"); + }, + group: "maoding2", + ai: { + threaten: 1.5, + maixie_defend: true, }, - group:'maoding2', - ai:{ - threaten:1.5, - maixie_defend:true - } }, - maoding2:{ - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h',{type:'hslingjian'})>1; + maoding2: { + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", { type: "hslingjian" }) > 1; }, - filterCard:{type:'hslingjian'}, - filterTarget:function(card,player,target){ + filterCard: { type: "hslingjian" }, + filterTarget: function (card, player, target) { return !target.hujia; }, - selectCard:2, + selectCard: 2, // usable:1, - content:function(){ + content: function () { target.changeHujia(); }, - ai:{ - order:9, - result:{ - target:function(player,target){ - return 2/Math.max(1,Math.sqrt(target.hp)); + ai: { + order: 9, + result: { + target: function (player, target) { + return 2 / Math.max(1, Math.sqrt(target.hp)); }, }, - } + }, }, - paotai:{ - enable:'phaseUse', - intro:{ - content:function(storage){ + paotai: { + enable: "phaseUse", + intro: { + content: function (storage) { var num; - switch(storage){ - case 1:num=30;break; - case 2:num=60;break; - case 3:num=100;break; + switch (storage) { + case 1: + num = 30; + break; + case 2: + num = 60; + break; + case 3: + num = 100; + break; } - return '结束阶段,有'+num+'%机率对一名随机敌人造成1点火焰伤害'; - } + return "结束阶段,有" + num + "%机率对一名随机敌人造成1点火焰伤害"; + }, }, - init:function(player){ - player.storage.paotai=0; + init: function (player) { + player.storage.paotai = 0; }, - filter:function(event,player){ - return player.countCards('h','sha')>0&&player.storage.paotai<3; + filter: function (event, player) { + return player.countCards("h", "sha") > 0 && player.storage.paotai < 3; }, - filterCard:{name:'sha'}, - content:function(){ + filterCard: { name: "sha" }, + content: function () { player.storage.paotai++; - player.markSkill('paotai'); + player.markSkill("paotai"); }, - ai:{ - order:5, - threaten:1.5, - result:{ - player:1 - } + ai: { + order: 5, + threaten: 1.5, + result: { + player: 1, + }, }, - group:['paotai2','paotai3'] + group: ["paotai2", "paotai3"], }, - paotai2:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter:function(event,player){ - var num=0; - switch(player.storage.paotai){ - case 1:num=30;break; - case 2:num=60;break; - case 3:num=100;break; + paotai2: { + trigger: { player: "phaseEnd" }, + forced: true, + filter: function (event, player) { + var num = 0; + switch (player.storage.paotai) { + case 1: + num = 30; + break; + case 2: + num = 60; + break; + case 3: + num = 100; + break; } - return 100*Math.random()0&&event.num>0; }, - content:function(){ - player.storage.paotai-=trigger.num; - if(player.storage.paotai<=0){ - player.storage.paotai=0; - player.unmarkSkill('paotai'); - } - else{ + }, + paotai3: { + trigger: { player: "damageEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + return player.storage.paotai > 0 && event.num > 0; + }, + content: function () { + player.storage.paotai -= trigger.num; + if (player.storage.paotai <= 0) { + player.storage.paotai = 0; + player.unmarkSkill("paotai"); + } else { player.updateMarks(); } - } + }, }, - bfengshi:{ - trigger:{player:'shaBegin'}, - forced:true, + bfengshi: { + trigger: { player: "shaBegin" }, + forced: true, // alter:true, - check:function(event,player){ - return get.attitude(player,event.target)<=0; + check: function (event, player) { + return get.attitude(player, event.target) <= 0; }, - filter:function(event,player){ - if(player.hasSkill('bfengshi4')) return false; - var num=0.2; - if(get.is.altered('bfengshi')) num=0.15; - return Math.random()0; + bfengshi4: {}, + yinbo: { + enable: "phaseUse", + usable: 1, + filterCard: { suit: "spade" }, + position: "he", + filter: function (event, player) { + return player.countCards("he", { suit: "spade" }) > 0; }, - check:function(card){ - return 7-get.value(card); + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - 'step 0' - var targets=player.getEnemies(function(target){ - return target.countCards('he')>0; + content: function () { + "step 0"; + var targets = player.getEnemies(function (target) { + return target.countCards("he") > 0; }); - if(targets.length){ - event.targets=targets.randomGets(3); + if (targets.length) { + event.targets = targets.randomGets(3); event.targets.sort(lib.sort.seat); - player.line(event.targets,'green'); + player.line(event.targets, "green"); } - 'step 1' - if(event.targets.length){ - var target=event.targets.shift(); - var he=target.getCards('he'); - if(he.length){ + ("step 1"); + if (event.targets.length) { + var target = event.targets.shift(); + var he = target.getCards("he"); + if (he.length) { target.addExpose(0.1); target.discard(he.randomGet()); } event.redo(); } }, - ai:{ - order:10, - expose:0.3, - result:{ - player:1 - } - } + ai: { + order: 10, + expose: 0.3, + result: { + player: 1, + }, + }, }, - aqianghua:{ - enable:'phaseUse', - usable:1, + aqianghua: { + enable: "phaseUse", + usable: 1, // alter:true, - filter:function(event,player){ - return player.countCards('h')>=1; + filter: function (event, player) { + return player.countCards("h") >= 1; }, - filterTarget:function(card,player,target){ - return target!=player; + filterTarget: function (card, player, target) { + return target != player; }, - filterCard:true, - selectCard:-1, - discard:false, - prepare:'give', - content:function(){ + filterCard: true, + selectCard: -1, + discard: false, + prepare: "give", + content: function () { target.gain(cards); - if(!get.is.altered('aqianghua')) target.changeHujia(); - target.addSkill('aqianghua2'); + if (!get.is.altered("aqianghua")) target.changeHujia(); + target.addSkill("aqianghua2"); }, - ai:{ - threaten:1.5, - order:2.1, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(get.attitude(player,target)<3) return 0; - if(target.hasJudge('lebu')) return 0; - if(target.hasSkill('aqianghua2')) return 0.1; + ai: { + threaten: 1.5, + order: 2.1, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (get.attitude(player, target) < 3) return 0; + if (target.hasJudge("lebu")) return 0; + if (target.hasSkill("aqianghua2")) return 0.1; return 1; - } - } - } + }, + }, + }, }, - aqianghua2:{ - trigger:{source:'damageBegin'}, - forced:true, - content:function(){ + aqianghua2: { + trigger: { source: "damageBegin" }, + forced: true, + content: function () { trigger.num++; - player.unmarkSkill('aqianghua2'); - player.removeSkill('aqianghua2'); + player.unmarkSkill("aqianghua2"); + player.removeSkill("aqianghua2"); + }, + mark: true, + intro: { + content: "下一次造成的伤害+1", }, - mark:true, - intro:{ - content:'下一次造成的伤害+1' - } }, - shihuo:{ - trigger:{global:'damageEnd'}, - forced:true, - filter:function(event){ - return event.hasNature('fire'); + shihuo: { + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event) { + return event.hasNature("fire"); }, - content:function(){ + content: function () { player.draw(); - } + }, }, - shoujia:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + shoujia: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - check:function(card){ - return 6-get.value(card); + filterCard: true, + check: function (card) { + return 6 - get.value(card); }, - discard:false, - prepare:'give2', - filterTarget:function(card,player,target){ - return target!=player&&!target.hasSkill('shoujia2'); + discard: false, + prepare: "give2", + filterTarget: function (card, player, target) { + return target != player && !target.hasSkill("shoujia2"); }, - content:function(){ - target.storage.shoujia=cards[0]; - target.storage.shoujia2=player; - target.addSkill('shoujia2'); - target.syncStorage('shoujia'); + content: function () { + target.storage.shoujia = cards[0]; + target.storage.shoujia2 = player; + target.addSkill("shoujia2"); + target.syncStorage("shoujia"); + }, + ai: { + order: 1, + expose: 0.2, + threaten: 1.4, + result: { + target: -1, + }, }, - ai:{ - order:1, - expose:0.2, - threaten:1.4, - result:{ - target:-1 - } - } }, - shoujia2:{ - mark:true, - trigger:{player:'useCardToBegin'}, - forced:true, - filter:function(event,player){ - return get.suit(event.card)==get.suit(player.storage.shoujia)&&event.target&&event.target!=player; + shoujia2: { + mark: true, + trigger: { player: "useCardToBegin" }, + forced: true, + filter: function (event, player) { + return ( + get.suit(event.card) == get.suit(player.storage.shoujia) && + event.target && + event.target != player + ); }, - content:function(){ - 'step 0' - player.showCards([player.storage.shoujia],get.translation(player)+'发动了【兽夹】'); - 'step 1' + content: function () { + "step 0"; + player.showCards([player.storage.shoujia], get.translation(player) + "发动了【兽夹】"); + ("step 1"); player.storage.shoujia.discard(); delete player.storage.shoujia; delete player.storage.shoujia2; - player.removeSkill('shoujia2'); - game.addVideo('storage',player,['shoujia',null]); - game.addVideo('storage',player,['shoujia2',null]); + player.removeSkill("shoujia2"); + game.addVideo("storage", player, ["shoujia", null]); + game.addVideo("storage", player, ["shoujia2", null]); player.turnOver(true); }, - intro:{ - mark:function(dialog,content,player){ - if(player.storage.shoujia2&&player.storage.shoujia2.isUnderControl(true)){ + intro: { + mark: function (dialog, content, player) { + if (player.storage.shoujia2 && player.storage.shoujia2.isUnderControl(true)) { dialog.add([player.storage.shoujia]); - } - else{ - return '已成为'+get.translation(player.storage.shoujia2)+'的兽夹目标'; + } else { + return "已成为" + get.translation(player.storage.shoujia2) + "的兽夹目标"; } }, - content:function(content,player){ - if(player.storage.shoujia2&&player.storage.shoujia2.isUnderControl(true)){ + content: function (content, player) { + if (player.storage.shoujia2 && player.storage.shoujia2.isUnderControl(true)) { return get.translation(player.storage.shoujia); } - return '已成为'+get.translation(player.storage.shoujia2)+'的兽夹目标'; - } + return "已成为" + get.translation(player.storage.shoujia2) + "的兽夹目标"; + }, }, - group:'shoujia3' + group: "shoujia3", }, - shoujia3:{ - trigger:{global:'damageEnd'}, - forced:true, - filter:function(event,player){ - return event.player==player.storage.shoujia2; + shoujia3: { + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.player == player.storage.shoujia2; }, - content:function(){ + content: function () { player.storage.shoujia.discard(); player.$throw(player.storage.shoujia); - game.log(player.storage.shoujia,'被置入弃牌堆') + game.log(player.storage.shoujia, "被置入弃牌堆"); delete player.storage.shoujia; delete player.storage.shoujia2; - player.removeSkill('shoujia2'); - game.addVideo('storage',player,['shoujia',null]); - game.addVideo('storage',player,['shoujia2',null]); - } + player.removeSkill("shoujia2"); + game.addVideo("storage", player, ["shoujia", null]); + game.addVideo("storage", player, ["shoujia2", null]); + }, }, - liudan:{ - trigger:{player:'useCard'}, - check:function(event,player){ - return game.countPlayer(function(current){ - if(event.targets.includes(current)==false&¤t!=player&& - lib.filter.targetEnabled(event.card,player,current)){ - return get.effect(current,event.card,player,player); - } - })>=0; + liudan: { + trigger: { player: "useCard" }, + check: function (event, player) { + return ( + game.countPlayer(function (current) { + if ( + event.targets.includes(current) == false && + current != player && + lib.filter.targetEnabled(event.card, player, current) + ) { + return get.effect(current, event.card, player, player); + } + }) >= 0 + ); }, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return (event.targets.includes(current)==false&¤t!=player&& - lib.filter.targetEnabled(event.card,player,current)); + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return ( + event.targets.includes(current) == false && + current != player && + lib.filter.targetEnabled(event.card, player, current) + ); }); }, - content:function(){ - var list=game.filterPlayer(function(current){ - return (trigger.targets.includes(current)==false&¤t!=player&& - lib.filter.targetEnabled(trigger.card,player,current)); + content: function () { + var list = game.filterPlayer(function (current) { + return ( + trigger.targets.includes(current) == false && + current != player && + lib.filter.targetEnabled(trigger.card, player, current) + ); }); - if(list.length){ - var list2=[]; - for(var i=0;iplayer.countCards('h')&&!player.skipList.includes('phaseUse')&&!player.skipList.includes('phaseDiscard'); }, - check:function(event,player){ - var nh=player.countCards('h'); - if(Math.min(5,player.hp)-nh>=2) return true; + }, + tiandan: { + trigger: { player: "phaseDrawBegin" }, + filter: function (event, player) { + return ( + Math.min(5, player.hp) > player.countCards("h") && + !player.skipList.includes("phaseUse") && + !player.skipList.includes("phaseDiscard") + ); + }, + check: function (event, player) { + var nh = player.countCards("h"); + if (Math.min(5, player.hp) - nh >= 2) return true; return false; }, - content:function(){ - var num=Math.min(5,player.hp)-player.countCards('h'); - var cards=[]; - while(num--){ - cards.push(game.createCard('sha')); + content: function () { + var num = Math.min(5, player.hp) - player.countCards("h"); + var cards = []; + while (num--) { + cards.push(game.createCard("sha")); } - player.gain(cards,'gain2'); - player.skip('phaseUse'); - player.skip('phaseDiscard'); - } + player.gain(cards, "gain2"); + player.skip("phaseUse"); + player.skip("phaseDiscard"); + }, }, - shanguang:{ - enable:'phaseUse', - usable:1, - filterCard:{suit:'diamond'}, - position:'he', - filter:function(event,player){ - return player.countCards('he',{suit:'diamond'})>0; + shanguang: { + enable: "phaseUse", + usable: 1, + filterCard: { suit: "diamond" }, + position: "he", + filter: function (event, player) { + return player.countCards("he", { suit: "diamond" }) > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&get.distance(player,target,'attack')<=1; + filterTarget: function (card, player, target) { + return target != player && get.distance(player, target, "attack") <= 1; }, - check:function(card){ - if(card.name=='sha'&&_status.event.player.countCards('h','sha')<3) return 0; - return 6-get.value(card); + check: function (card) { + if (card.name == "sha" && _status.event.player.countCards("h", "sha") < 3) return 0; + return 6 - get.value(card); }, - content:function(){ - target.addTempSkill('shanguang2'); + content: function () { + target.addTempSkill("shanguang2"); }, - ai:{ - order:7.9, - result:{ - target:function(player,target){ - var nh=target.countCards('h'); - if(get.attitude(player,target)<0&&nh>=3&& - player.canUse('sha',target)&&player.countCards('h','sha')&& - get.effect(target,{name:'sha'},player,player)>0){ - return -nh-5; + ai: { + order: 7.9, + result: { + target: function (player, target) { + var nh = target.countCards("h"); + if ( + get.attitude(player, target) < 0 && + nh >= 3 && + player.canUse("sha", target) && + player.countCards("h", "sha") && + get.effect(target, { name: "sha" }, player, player) > 0 + ) { + return -nh - 5; } return -nh; - } - } - } - }, - shanguang2:{ - mod:{ - cardEnabled:function(){ - return false; + }, }, - cardUsable:function(){ - return false; - }, - cardRespondable:function(){ - return false; - }, - cardSavable:function(){ - return false; - } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')||get.tag(card,'respondSha')){ - if(current<0) return 1.5; + }, + shanguang2: { + mod: { + cardEnabled: function () { + return false; + }, + cardUsable: function () { + return false; + }, + cardRespondable: function () { + return false; + }, + cardSavable: function () { + return false; + }, + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") || get.tag(card, "respondSha")) { + if (current < 0) return 1.5; } - } - } - } + }, + }, + }, }, - baoxue:{ - enable:'phaseUse', - init:function(player){ - player.storage.baoxue=false; + baoxue: { + enable: "phaseUse", + init: function (player) { + player.storage.baoxue = false; }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - mark:true, - unique:true, - skillAnimation:true, - animationColor:'water', - line:'thunder', - filter:function(event,player){ - return !player.storage.baoxue&&player.countCards('he',{color:'black'})>0; + mark: true, + unique: true, + skillAnimation: true, + animationColor: "water", + line: "thunder", + filter: function (event, player) { + return !player.storage.baoxue && player.countCards("he", { color: "black" }) > 0; }, - filterTarget:function(card,player,target){ - return target!=player; + filterTarget: function (card, player, target) { + return target != player; }, - selectTarget:function(){ - return [1,_status.event.player.countCards('he',{color:'black'})]; + selectTarget: function () { + return [1, _status.event.player.countCards("he", { color: "black" })]; }, // alter:true, - delay:false, - contentBefore:function(){ - 'step 0' + delay: false, + contentBefore: function () { + "step 0"; game.delayx(); - 'step 1' - player.storage.baoxue=true; - player.awakenSkill('baoxue'); + ("step 1"); + player.storage.baoxue = true; + player.awakenSkill("baoxue"); player.showHandcards(); - player.discard(player.getCards('he',{color:'black'})); + player.discard(player.getCards("he", { color: "black" })); }, - content:function(){ - 'step 0' - if(!get.is.altered('baoxue')){ - var he=target.getCards('he'); - if(he.length){ + content: function () { + "step 0"; + if (!get.is.altered("baoxue")) { + var he = target.getCards("he"); + if (he.length) { target.discard(he.randomGet()); } } - 'step 1' + ("step 1"); target.turnOver(true); }, - contentAfter:function(){ + contentAfter: function () { player.turnOver(true); }, - ai:{ - order:function(skill,player){ - var num=game.countPlayer(function(current){ - return get.attitude(player,current)<0; + ai: { + order: function (skill, player) { + var num = game.countPlayer(function (current) { + return get.attitude(player, current) < 0; }); - var nh=player.countCards('he',{color:'black'}); - if(nh==1&&num>1) return 0; - if(nh>num) return 1; + var nh = player.countCards("he", { color: "black" }); + if (nh == 1 && num > 1) return 0; + if (nh > num) return 1; return 11; }, - result:{ - target:function(player,target){ - if(target.hasSkillTag('noturn')) return 0; - if(player.hasUnknown()) return 0; + result: { + target: function (player, target) { + if (target.hasSkillTag("noturn")) return 0; + if (player.hasUnknown()) return 0; return -1; - } - } - } + }, + }, + }, }, - mianzhen:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0; + mianzhen: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&!target.hasSkill('mianzhen2'); + filterTarget: function (card, player, target) { + return target != player && !target.hasSkill("mianzhen2"); }, - filterCard:true, - position:'he', - check:function(card){ - return 8-get.value(card); + filterCard: true, + position: "he", + check: function (card) { + return 8 - get.value(card); }, - content:function(){ - 'step 0' - target.chooseToRespond({name:'shan'}); - 'step 1' - if(!result.bool) target.addSkill('mianzhen2'); + content: function () { + "step 0"; + target.chooseToRespond({ name: "shan" }); + ("step 1"); + if (!result.bool) target.addSkill("mianzhen2"); + }, + ai: { + order: 2.2, + result: { + target: function (player, target) { + return Math.min(-0.1, -1 - target.countCards("h") + Math.sqrt(target.hp) / 2); + }, + }, }, - ai:{ - order:2.2, - result:{ - target:function(player,target){ - return Math.min(-0.1,-1-target.countCards('h')+Math.sqrt(target.hp)/2); - } - } - } }, - mianzhen2:{ - mark:true, - intro:{ - content:'不能使用或打出手牌直到受到伤害或下一回合结束' + mianzhen2: { + mark: true, + intro: { + content: "不能使用或打出手牌直到受到伤害或下一回合结束", }, - trigger:{player:['damageEnd','phaseEnd']}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('mianzhen2'); + trigger: { player: ["damageEnd", "phaseEnd"] }, + forced: true, + popup: false, + content: function () { + player.removeSkill("mianzhen2"); }, - mod:{ - cardEnabled:function(){ + mod: { + cardEnabled: function () { return false; }, - cardUsable:function(){ + cardUsable: function () { return false; }, - cardRespondable:function(){ + cardRespondable: function () { return false; }, - cardSavable:function(){ + cardSavable: function () { return false; - } + }, + }, + ai: { + threaten: 0.6, }, - ai:{ - threaten:0.6 - } }, - zhiyuan:{ - trigger:{source:'damageBefore'}, - check:function(event,player){ - player.disableSkill('tmp','zhiyuan'); - var eff=get.damageEffect(event.player,player,player); - var att=get.attitude(player,event.player); - var bool=false; - if(att>0){ - if(eff<=0||event.player.hp 0) { + if (eff <= 0 || event.player.hp < event.player.maxHp) { + bool = true; + } + } else { + if (eff < 0 && event.player.hp == event.player.maxHp) { + bool = true; } } - else{ - if(eff<0&&event.player.hp==event.player.maxHp){ - bool=true; - } - } - player.enableSkill('tmp','zhiyuan'); + player.enableSkill("tmp", "zhiyuan"); return bool; }, - logTarget:'player', - filter:function(event,player){ - return event.num>0; + logTarget: "player", + filter: function (event, player) { + return event.num > 0; }, - content:function(){ + content: function () { trigger.cancel(); trigger.player.recover(trigger.num); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(get.tag(card,'damage')&&get.attitude(player,target)>0){ - if(target.hp==target.maxHp||get.recoverEffect(target,player,player)<=0) return 'zeroplayertarget'; - return [0,0,0,1]; + ai: { + effect: { + player: function (card, player, target) { + if (get.tag(card, "damage") && get.attitude(player, target) > 0) { + if ( + target.hp == target.maxHp || + get.recoverEffect(target, player, player) <= 0 + ) + return "zeroplayertarget"; + return [0, 0, 0, 1]; } - } - } - } + }, + }, + }, }, - duwen:{ - trigger:{source:'damageBegin'}, - check:function(event,player){ - return get.attitude(player,event.player)<=0; + duwen: { + trigger: { source: "damageBegin" }, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; }, - forced:true, - filter:function(event,player){ - return player.countCards('h')==event.player.countCards('h')&&event.notLink(); + forced: true, + filter: function (event, player) { + return player.countCards("h") == event.player.countCards("h") && event.notLink(); }, - content:function(){ + content: function () { trigger.num++; }, - ai:{ - threaten:1.5 + ai: { + threaten: 1.5, }, }, - duwen2:{ - trigger:{source:'damageEnd'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.hp==event.player.hp&&event.notLink(); + duwen2: { + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + player.hp == event.player.hp && + event.notLink() + ); }, - content:function(){ + content: function () { player.draw(2); - } - }, - juji:{ - enable:'phaseUse', - usable:1, - position:'he', - filter:function(event,player){ - return player.countCards('he')>0; }, - filterCard:function(card){ - var suit=get.suit(card); - for(var i=0;i 0; + }, + filterCard: function (card) { + var suit = get.suit(card); + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.suit(ui.selected.cards[i]) == suit) return false; } return true; }, - complexCard:true, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + complexCard: true, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - check:function(card){ - if(ui.selected.cards.length>1) return 0; - return 5-get.value(card); + check: function (card) { + if (ui.selected.cards.length > 1) return 0; + return 5 - get.value(card); }, - selectCard:[1,4], - content:function(){ - var suits=[]; - for(var i=0;inum){ - min.length=0; + ai: { + order: 4, + result: { + target: function (player, target) { + if (!player.countCards("h", "sha")) return 0; + if (target.countCards("h") <= 1 && get.distance(player, target, "attack") <= 1) + return 0; + var min = []; + var num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && player.canUse("sha", players[i], false)) { + var eff = get.effect(players[i], { name: "sha" }, player, player); + if (eff > num) { + min.length = 0; min.push(players[i]); - num=eff; + num = eff; } } } - for(var i=0;i0) return 0; - if(min[i].countCards('h')<=1&&get.distance(player,min[i],'attack')<=1) return 0; + for (var i = 0; i < min.length; i++) { + if (get.attitude(player, min[i]) > 0) return 0; + if ( + min[i].countCards("h") <= 1 && + get.distance(player, min[i], "attack") <= 1 + ) + return 0; } - if(min.includes(target)) return -1; + if (min.includes(target)) return -1; return 0; - } - } + }, + }, }, }, - juji2:{ - ai:{ - effect:{ - player:function(card,player,target){ - if(card.name=='sha'&&target==player.storage.juji2) return [1,0,1,-1]; - } - } + juji2: { + ai: { + effect: { + player: function (card, player, target) { + if (card.name == "sha" && target == player.storage.juji2) return [1, 0, 1, -1]; + }, + }, }, - trigger:{player:'phaseAfter'}, - forced:true, - popup:false, - content:function(){ - player.unmarkSkill('juji2'); - player.removeSkill('juji2'); + trigger: { player: "phaseAfter" }, + forced: true, + popup: false, + content: function () { + player.unmarkSkill("juji2"); + player.removeSkill("juji2"); delete player.storage.juji2; }, - group:'juji3' + group: "juji3", }, - juji3:{ - trigger:{player:'shaBegin'}, - forced:true, - filter:function(event,player){ - return event.target==player.storage.juji2; + juji3: { + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event, player) { + return event.target == player.storage.juji2; }, - content:function(){ - trigger.directHit=true; + content: function () { + trigger.directHit = true; + }, + mod: { + globalFrom: function (from, to) { + if (to == from.storage.juji2) return -Infinity; + }, }, - mod:{ - globalFrom:function(from,to){ - if(to==from.storage.juji2) return -Infinity; - } - } }, - dulei:{ - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('dulei2'); + dulei: { + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("dulei2"); }, - filterCard:true, - check:function(card){ - return 6-get.value(card); + filterCard: true, + check: function (card) { + return 6 - get.value(card); }, - discard:false, - prepare:function(cards,player){ - player.$give(1,player,false); + discard: false, + prepare: function (cards, player) { + player.$give(1, player, false); }, - content:function(){ - player.storage.dulei=cards[0]; - player.addSkill('dulei2'); - player.syncStorage('dulei'); + content: function () { + player.storage.dulei = cards[0]; + player.addSkill("dulei2"); + player.syncStorage("dulei"); + }, + ai: { + order: 1, + result: { + player: 1, + }, }, - ai:{ - order:1, - result:{ - player:1 - } - } }, - dulei2:{ - mark:true, - trigger:{target:'useCardToBegin'}, - forced:true, - filter:function(event,player){ - return event.player!=player&&get.suit(event.card)==get.suit(player.storage.dulei); + dulei2: { + mark: true, + trigger: { target: "useCardToBegin" }, + forced: true, + filter: function (event, player) { + return event.player != player && get.suit(event.card) == get.suit(player.storage.dulei); }, - content:function(){ - 'step 0' - player.showCards([player.storage.dulei],get.translation(player)+'发动了【诡雷】'); - 'step 1' + content: function () { + "step 0"; + player.showCards([player.storage.dulei], get.translation(player) + "发动了【诡雷】"); + ("step 1"); player.storage.dulei.discard(); delete player.storage.dulei; - player.removeSkill('dulei2'); - game.addVideo('storage',player,['dulei',null]); + player.removeSkill("dulei2"); + game.addVideo("storage", player, ["dulei", null]); trigger.player.loseHp(); - 'step 2' - var he=trigger.player.getCards('he'); - if(he.length){ + ("step 2"); + var he = trigger.player.getCards("he"); + if (he.length) { trigger.player.discard(he.randomGet()); } }, - intro:{ - mark:function(dialog,content,player){ - if(player==game.me||player.isUnderControl()){ + intro: { + mark: function (dialog, content, player) { + if (player == game.me || player.isUnderControl()) { dialog.add([player.storage.dulei]); - } - else{ - return '已发动诡雷'; + } else { + return "已发动诡雷"; } }, - content:function(content,player){ - if(player==game.me||player.isUnderControl()){ + content: function (content, player) { + if (player == game.me || player.isUnderControl()) { return get.translation(player.storage.dulei); } - return '已发动诡雷'; - } - } + return "已发动诡雷"; + }, + }, }, - juji_old:{ - trigger:{player:'shaBegin'}, - forced:true, - filter:function(event,player){ - return get.distance(event.target,player,'attack')>1; + juji_old: { + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event, player) { + return get.distance(event.target, player, "attack") > 1; }, - content:function(){ - trigger.directHit=true; + content: function () { + trigger.directHit = true; }, - group:'juji2' + group: "juji2", }, - juji2_old:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player; + juji2_old: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; }, - content:function(){ - target.addTempSkill('juji3',{player:'phaseEnd'}); - if(!target.storage.juji3){ - target.storage.juji3=[]; + content: function () { + target.addTempSkill("juji3", { player: "phaseEnd" }); + if (!target.storage.juji3) { + target.storage.juji3 = []; } target.storage.juji3.push(player); }, - mod:{ - targetInRange:function(card,player,target){ - if(target.hasSkill('juji3')&&Array.isArray(target.storage.juji3)&&target.storage.juji3.includes(player)){ + mod: { + targetInRange: function (card, player, target) { + if ( + target.hasSkill("juji3") && + Array.isArray(target.storage.juji3) && + target.storage.juji3.includes(player) + ) { return true; } - } - } - }, - juji3_old:{ - mark:true, - intro:{ - nocount:true, - content:function(storage){ - return '对'+get.translation(storage)+'使用卡牌无视距离'; - } + }, }, - mod:{ - targetInRange:function(card,player,target){ - if(Array.isArray(player.storage.juji3)&&player.storage.juji3.includes(target)){ + }, + juji3_old: { + mark: true, + intro: { + nocount: true, + content: function (storage) { + return "对" + get.translation(storage) + "使用卡牌无视距离"; + }, + }, + mod: { + targetInRange: function (card, player, target) { + if (Array.isArray(player.storage.juji3) && player.storage.juji3.includes(target)) { return true; } - } - } + }, + }, }, - zhuagou:{ - enable:'phaseUse', - usable:1, - changeSeat:true, - filterTarget:function(card,player,target){ - return player!=target&&player.next!=target; + zhuagou: { + 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); + filterCard: true, + check: function (card) { + return 4 - get.value(card); }, - content:function(){ - while(player.next!=target){ - game.swapSeat(player,player.next); + 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; + 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; - } - } - } + }, + }, + }, }, - bingqiang:{ - enable:'phaseUse', - position:'he', - filterCard:function(card){ - var color=get.color(card); - for(var i=0;imax){ - max=num; + check: function (card) { + if (ui.selected.cards.length) return 0; + var player = _status.event.player; + var max = 0, + min = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (!lib.skill.bingqiang.filterTarget(null, player, players[i])) continue; + var num = lib.skill.bingqiang.ai.result.playerx(player, players[i]); + if (num > max) { + max = num; } - if(num-min){ - if(get.color(card)=='red') return 5-get.value(card); - } - else{ - if(get.color(card)=='black') return 5-get.value(card); + if (max == -min) { + return 5 - get.value(card); + } else if (max > -min) { + if (get.color(card) == "red") return 5 - get.value(card); + } else { + if (get.color(card) == "black") return 5 - get.value(card); } return 0; }, - changeTarget:function(player,targets){ - var target=targets[0]; - var add=game.filterPlayer(function(player){ - return get.distance(target,player,'pure')==1; + changeTarget: function (player, targets) { + var target = targets[0]; + var add = game.filterPlayer(function (player) { + return get.distance(target, player, "pure") == 1; }); - for(var i=0;i0; + bingqiang_remove: { + trigger: { player: ["phaseBegin", "dieBegin"] }, + forced: true, + popup: false, + filter: function (event, player) { + return player.storage.bingqiang && player.storage.bingqiang.length > 0; }, - content:function(){ - for(var i=0;i0; + bingqiang_old: { + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - var goon=false; - var goon2=false; - var att=get.attitude(player,trigger.player); - if(att>0){ - if(trigger.player.hp==1) goon=true; + content: function () { + "step 0"; + var goon = false; + var goon2 = false; + var att = get.attitude(player, trigger.player); + if (att > 0) { + if (trigger.player.hp == 1) goon = true; + } else { + if (Math.random() < 0.5) goon = true; } - else{ - if(Math.random()<0.5) goon=true; - } - if(Math.random()<0.3) goon2=true; - player.chooseToDiscard([1,player.countCards('h')],'he',get.prompt('bingqiang',trigger.player)).set('logSkill',['bingqiang',trigger.player]).ai=function(card){ - if(ui.selected.cards.length) return 0; - if(goon) return 6-get.value(card); - if(goon2) return 4-get.value(card); + if (Math.random() < 0.3) goon2 = true; + player + .chooseToDiscard( + [1, player.countCards("h")], + "he", + get.prompt("bingqiang", trigger.player) + ) + .set("logSkill", ["bingqiang", trigger.player]).ai = function (card) { + if (ui.selected.cards.length) return 0; + if (goon) return 6 - get.value(card); + if (goon2) return 4 - get.value(card); return 0; - } - 'step 1' - if(result.bool){ - var num=result.cards.length; - event.num=num; - player.chooseControl('选项一','选项二','选项三','选项四',function(){ - if(get.attitude(player,trigger.player)>0){ - if(Math.random()<0.7) return '选项一'; - return '选项三'; - } - else{ - if(Math.random()<0.7) return '选项四'; - return '选项二'; - } - }).set('prompt','冰墙

    选项一:防御距离+'+num+ - '

    选项二:防御距离-'+num+ - '

    选项三:进攻距离+'+num+ - '

    选项四:进攻距离-'+num+'
    '); - } - else{ + }; + ("step 1"); + if (result.bool) { + var num = result.cards.length; + event.num = num; + player + .chooseControl("选项一", "选项二", "选项三", "选项四", function () { + if (get.attitude(player, trigger.player) > 0) { + if (Math.random() < 0.7) return "选项一"; + return "选项三"; + } else { + if (Math.random() < 0.7) return "选项四"; + return "选项二"; + } + }) + .set( + "prompt", + '冰墙

    选项一:防御距离+' + + num + + '

    选项二:防御距离-' + + num + + '

    选项三:进攻距离+' + + num + + '

    选项四:进攻距离-' + + num + + "
    " + ); + } else { event.finish(); } - 'step 2' - switch(result.control){ - case '选项一':{ - trigger.player.storage.bingqiang2=event.num; - trigger.player.addTempSkill('bingqiang2',{player:'phaseBegin'}); + ("step 2"); + switch (result.control) { + case "选项一": { + trigger.player.storage.bingqiang2 = event.num; + trigger.player.addTempSkill("bingqiang2", { player: "phaseBegin" }); break; } - case '选项二':{ - trigger.player.storage.bingqiang3=event.num; - trigger.player.addTempSkill('bingqiang3',{player:'phaseBegin'}); + case "选项二": { + trigger.player.storage.bingqiang3 = event.num; + trigger.player.addTempSkill("bingqiang3", { player: "phaseBegin" }); break; } - case '选项三':{ - trigger.player.storage.bingqiang4=event.num; - trigger.player.addTempSkill('bingqiang4',{player:'phaseBegin'}); + case "选项三": { + trigger.player.storage.bingqiang4 = event.num; + trigger.player.addTempSkill("bingqiang4", { player: "phaseBegin" }); break; } - case '选项四':{ - trigger.player.storage.bingqiang5=event.num; - trigger.player.addTempSkill('bingqiang5',{player:'phaseBegin'}); + case "选项四": { + trigger.player.storage.bingqiang5 = event.num; + trigger.player.addTempSkill("bingqiang5", { player: "phaseBegin" }); break; } } }, - ai:{ - expose:0.1 - } - }, - bingqiang2:{ - mark:true, - intro:{ - content:'防御距离+#' + ai: { + expose: 0.1, }, - mod:{ - globalTo:function(from,to,distance){ - if(typeof to.storage.bingqiang2=='number') return distance+to.storage.bingqiang2; + }, + bingqiang2: { + mark: true, + intro: { + content: "防御距离+#", + }, + mod: { + globalTo: function (from, to, distance) { + if (typeof to.storage.bingqiang2 == "number") return distance + to.storage.bingqiang2; }, - } - }, - bingqiang3:{ - mark:true, - intro:{ - content:'防御距离-#' }, - mod:{ - globalTo:function(from,to,distance){ - if(typeof to.storage.bingqiang3=='number') return distance-to.storage.bingqiang3; + }, + bingqiang3: { + mark: true, + intro: { + content: "防御距离-#", + }, + mod: { + globalTo: function (from, to, distance) { + if (typeof to.storage.bingqiang3 == "number") return distance - to.storage.bingqiang3; }, - } + }, }, - bingqiang4:{ - mark:true, - intro:{ - content:'进攻距离+#' + bingqiang4: { + mark: true, + intro: { + content: "进攻距离+#", + }, + mod: { + globalFrom: function (from, to, distance) { + if (typeof from.storage.bingqiang4 == "number") + return distance - from.storage.bingqiang4; + }, }, - mod:{ - globalFrom:function(from,to,distance){ - if(typeof from.storage.bingqiang4=='number') return distance-from.storage.bingqiang4; - } - } }, - bingqiang5:{ - mark:true, - intro:{ - content:'进攻距离-#' + bingqiang5: { + mark: true, + intro: { + content: "进攻距离-#", + }, + mod: { + globalFrom: function (from, to, distance) { + if (typeof from.storage.bingqiang5 == "number") + return distance + from.storage.bingqiang5; + }, }, - mod:{ - globalFrom:function(from,to,distance){ - if(typeof from.storage.bingqiang5=='number') return distance+from.storage.bingqiang5; - } - } }, - shuangqiang:{ - trigger:{source:'damageBegin'}, - check:function(event,player){ - var att=get.attitude(player,event.player); - if(event.player.hp==1) return att>0; - return att<=0; + shuangqiang: { + trigger: { source: "damageBegin" }, + check: function (event, player) { + var att = get.attitude(player, event.player); + if (event.player.hp == 1) return att > 0; + return att <= 0; }, - logTarget:'player', - filter:function(event,player){ - return !event.player.isTurnedOver()&&event.num>0; + logTarget: "player", + filter: function (event, player) { + return !event.player.isTurnedOver() && event.num > 0; }, - content:function(){ + content: function () { trigger.num--; trigger.player.draw(); trigger.player.turnOver(); - } + }, }, - jidong:{ - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return player.hp==1&&!player.isTurnedOver(); + jidong: { + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return player.hp == 1 && !player.isTurnedOver(); }, // alter:true, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.turnOver(); player.recover(2); - 'step 1' - if(player.isTurnedOver()&&!get.is.altered('jidong')){ - player.addTempSkill('jidong2',{player:'turnOverAfter'}); + ("step 1"); + if (player.isTurnedOver() && !get.is.altered("jidong")) { + player.addTempSkill("jidong2", { player: "turnOverAfter" }); } }, - ai:{ - threaten:function(player,target){ - if(target.hp==1) return 2; + ai: { + threaten: function (player, target) { + if (target.hp == 1) return 2; return 1; - } - } - }, - jidong2:{ - trigger:{player:'damageBefore'}, - 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]; - } }, }, - mod:{ - targetEnabled:function(card,player,target){ - if(player!=target) return false; - } - } }, - chongzhuang:{ - trigger:{source:'damageEnd'}, - forced:true, - filter:function(event,player){ - return player.storage.jijia<=0&&event.num>0; + jidong2: { + trigger: { player: "damageBefore" }, + forced: true, + content: function () { + trigger.cancel(); }, - popup:false, - unique:true, - content:function(){ - player.storage.jijia2+=trigger.num; - if(player.storage.jijia2>=4){ - player.storage.jijia=4; - player.storage.jijia2=0; - player.markSkill('jijia'); - if(lib.config.skill_animation_type!='off'){ - player.logSkill('chongzhuang'); - player.$skill('重装') + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return [0, 0]; + }, + }, + }, + mod: { + targetEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, + }, + chongzhuang: { + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player.storage.jijia <= 0 && event.num > 0; + }, + popup: false, + unique: true, + content: function () { + player.storage.jijia2 += trigger.num; + if (player.storage.jijia2 >= 4) { + player.storage.jijia = 4; + player.storage.jijia2 = 0; + player.markSkill("jijia"); + if (lib.config.skill_animation_type != "off") { + player.logSkill("chongzhuang"); + player.$skill("重装"); } } - } + }, }, - tuijin:{ - enable:'phaseUse', - usable:1, - unique:true, - filter:function(event,player){ - if(player.storage.jijia>0){ - return game.hasPlayer(function(current){ - return get.distance(player,current)>1 + tuijin: { + enable: "phaseUse", + usable: 1, + unique: true, + filter: function (event, player) { + if (player.storage.jijia > 0) { + return game.hasPlayer(function (current) { + return get.distance(player, current) > 1; }); } return false; }, - filterTarget:function(card,player,target){ - return target!=player&&get.distance(player,target)>1; + filterTarget: function (card, player, target) { + return target != player && get.distance(player, target) > 1; }, - content:function(){ - player.storage.tuijin2=target; - player.addTempSkill('tuijin2'); + content: function () { + player.storage.tuijin2 = target; + player.addTempSkill("tuijin2"); }, - ai:{ - order:11, - result:{ - target:function(player,target){ - if(get.attitude(player,target)<0){ - if(get.distance(player,target)>2) return -1.5; + ai: { + order: 11, + result: { + target: function (player, target) { + if (get.attitude(player, target) < 0) { + if (get.distance(player, target) > 2) return -1.5; return -1; } return 0.3; - } - } - } + }, + }, + }, }, - tuijin2:{ - mod:{ - globalFrom:function(from,to){ - if(to==from.storage.tuijin2) return -Infinity; - } + tuijin2: { + mod: { + globalFrom: function (from, to) { + if (to == from.storage.tuijin2) return -Infinity; + }, }, - mark:'character', - intro:{ - content:'与$的距离视为1直到回合结束' + mark: "character", + intro: { + content: "与$的距离视为1直到回合结束", }, - onremove:true + onremove: true, }, - jijia:{ - mark:true, - unique:true, - init:function(player){ - player.storage.jijia=4; - player.storage.jijia2=0; + jijia: { + mark: true, + unique: true, + init: function (player) { + player.storage.jijia = 4; + player.storage.jijia2 = 0; }, - intro:{ - content:'机甲体力值:#' + intro: { + content: "机甲体力值:#", }, - mod:{ - maxHandcard:function(player,num){ - if(player.storage.jijia>0){ - return num+player.storage.jijia; + mod: { + maxHandcard: function (player, num) { + if (player.storage.jijia > 0) { + return num + player.storage.jijia; } - } + }, }, - trigger:{player:'changeHp'}, - forced:true, - popup:false, - filter:function(event,player){ - return player.storage.jijia>0&&event.parent.name=='damage'&&event.num<0; + trigger: { player: "changeHp" }, + forced: true, + popup: false, + filter: function (event, player) { + return player.storage.jijia > 0 && event.parent.name == "damage" && event.num < 0; }, - content:function(){ - player.hp-=trigger.num; + content: function () { + player.hp -= trigger.num; player.update(); - player.storage.jijia+=trigger.num; - if(player.storage.jijia<=0){ - player.unmarkSkill('jijia'); - } - else{ + player.storage.jijia += trigger.num; + if (player.storage.jijia <= 0) { + player.unmarkSkill("jijia"); + } else { player.updateMarks(); } }, - ai:{ - threaten:function(player,target){ - if(target.storage.jijia<=0) return 2; + ai: { + threaten: function (player, target) { + if (target.storage.jijia <= 0) return 2; return 1; - } - } + }, + }, }, - zihui:{ - enable:'phaseUse', - filter:function(event,player){ - return player.storage.jijia>0; + zihui: { + enable: "phaseUse", + filter: function (event, player) { + return player.storage.jijia > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&get.distance(player,target)<=2; + filterTarget: function (card, player, target) { + return target != player && get.distance(player, target) <= 2; }, - unique:true, - selectTarget:-1, - skillAnimation:true, - animationColor:'fire', - line:'fire', + unique: true, + selectTarget: -1, + skillAnimation: true, + animationColor: "fire", + line: "fire", // alter:true, - content:function(){ - 'step 0' - var num=player.storage.jijia; - if(get.is.altered('zihui')){ - num=Math.max(1,Math.min(num,target.countCards('he'))); + content: function () { + "step 0"; + var num = player.storage.jijia; + if (get.is.altered("zihui")) { + num = Math.max(1, Math.min(num, target.countCards("he"))); } - target.chooseToDiscard(num,'he','弃置'+get.cnNumber(num)+'张牌,或受到2点火焰伤害').ai=function(card){ - if(target.hasSkillTag('nofire')) return 0; - if(get.type(card)!='basic') return 11-get.value(card); - if(target.hp>4) return 7-get.value(card); - if(target.hp==4&&num>=3) return 7-get.value(card); - if(target.hp==3&&num>=4) return 7-get.value(card); - if(num>1) return 8-get.value(card); - return 10-get.value(card); + target.chooseToDiscard( + num, + "he", + "弃置" + get.cnNumber(num) + "张牌,或受到2点火焰伤害" + ).ai = function (card) { + if (target.hasSkillTag("nofire")) return 0; + if (get.type(card) != "basic") return 11 - get.value(card); + if (target.hp > 4) return 7 - get.value(card); + if (target.hp == 4 && num >= 3) return 7 - get.value(card); + if (target.hp == 3 && num >= 4) return 7 - get.value(card); + if (num > 1) return 8 - get.value(card); + return 10 - get.value(card); }; - 'step 1' - if(!result.bool){ - target.damage(2,'fire'); + ("step 1"); + if (!result.bool) { + target.damage(2, "fire"); } - if(target==targets[targets.length-1]){ - player.storage.jijia=0; - player.unmarkSkill('jijia'); + if (target == targets[targets.length - 1]) { + player.storage.jijia = 0; + player.unmarkSkill("jijia"); } }, - ai:{ - order:2, - result:{ - player:function(player){ - var num=0; - var players=game.filterPlayer(); - for(var i=0;i2) continue; - var nh=players[i].countCards('h'); - var att=get.attitude(player,players[i]); - if(nh 2 + ) + continue; + var nh = players[i].countCards("h"); + var att = get.attitude(player, players[i]); + if (nh < player.storage.jijia) { + if (att < 0) { + if (players[i].hp <= 2) { + num += 2; + } else { + num += 1.5; } - else{ - num+=1.5; + } else if (att > 0) { + if (players[i].hp <= 2) { + num -= 2; + } else { + num -= 1.5; } } - else if(att>0){ - if(players[i].hp<=2){ - num-=2; - } - else{ - num-=1.5; - } - } - } - else if(nh==player.storage.jijia){ - if(att<0){ - num+=0.5; - } - else if(att>0){ - num-=0.5; + } else if (nh == player.storage.jijia) { + if (att < 0) { + num += 0.5; + } else if (att > 0) { + num -= 0.5; } } } - if(num>=2) return 1; + if (num >= 2) return 1; return 0; - } - } - } + }, + }, + }, }, - xiandan:{ - trigger:{player:'shaBegin'}, - direct:true, - content:function(){ - "step 0" - var dis=trigger.target.countCards('h','shan')||trigger.target.hasSkillTag('freeShan',false,{ - player:player, - card:trigger.card - },true)||trigger.target.countCards('h')>2; - var att=get.attitude(player,trigger.target); - var next=player.chooseToDiscard(get.prompt('xiandan')); - next.ai=function(card){ - if(att) return 0; - if(dis) return 7-get.value(card); + xiandan: { + trigger: { player: "shaBegin" }, + direct: true, + content: function () { + "step 0"; + var dis = + trigger.target.countCards("h", "shan") || + trigger.target.hasSkillTag( + "freeShan", + false, + { + player: player, + card: trigger.card, + }, + true + ) || + trigger.target.countCards("h") > 2; + var att = get.attitude(player, trigger.target); + var next = player.chooseToDiscard(get.prompt("xiandan")); + next.ai = function (card) { + if (att) return 0; + if (dis) return 7 - get.value(card); return 0; - } - next.logSkill='xiandan'; - "step 1" - if(result.bool){ - if(get.color(result.cards[0])=='red'){ - trigger.directHit=true; - } - else{ - player.addTempSkill('xiandan2','shaAfter'); + }; + next.logSkill = "xiandan"; + ("step 1"); + if (result.bool) { + if (get.color(result.cards[0]) == "red") { + trigger.directHit = true; + } else { + player.addTempSkill("xiandan2", "shaAfter"); } } - } - }, - xiandan2:{ - trigger:{source:'damageBegin'}, - filter:function(event){ - return event.card&&event.card.name=='sha'&&event.notLink(); }, - forced:true, - popup:false, - content:function(){ + }, + xiandan2: { + trigger: { source: "damageBegin" }, + filter: function (event) { + return event.card && event.card.name == "sha" && event.notLink(); + }, + forced: true, + popup: false, + content: function () { trigger.num++; - } + }, }, - shouge:{ - trigger:{source:'dieAfter'}, - frequent:true, - content:function(){ - player.gain(game.createCard('zhiliaobo'),'gain2'); - } + shouge: { + trigger: { source: "dieAfter" }, + frequent: true, + content: function () { + player.gain(game.createCard("zhiliaobo"), "gain2"); + }, }, - tuji:{ - mod:{ - globalFrom:function(from,to,distance){ - if(_status.currentPhase==from){ - return distance-from.countUsed(); + tuji: { + mod: { + globalFrom: function (from, to, distance) { + if (_status.currentPhase == from) { + return distance - from.countUsed(); } }, }, }, - mujing:{ - enable:['chooseToRespond','chooseToUse'], - filterCard:function(card){ - return get.color(card)=='black'; + mujing: { + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card) { + return get.color(card) == "black"; }, - position:'he', - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - if(!player.countCards('he',{color:'black'})) return false; + position: "he", + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (!player.countCards("he", { color: "black" })) return false; }, - prompt:'将一张黑色牌当杀使用或打出', - check:function(card){return 4-get.value(card)}, - ai:{ - skillTagFilter:function(player){ - if(!player.countCards('he',{color:'black'})) return false; + prompt: "将一张黑色牌当杀使用或打出", + check: function (card) { + return 4 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("he", { color: "black" })) return false; }, - respondSha:true, + respondSha: true, }, - group:'mujing2' + group: "mujing2", }, - mujing2:{ - trigger:{player:'shaMiss'}, - forced:true, - popup:false, - filter:function(event){ + mujing2: { + trigger: { player: "shaMiss" }, + forced: true, + popup: false, + filter: function (event) { return !event.parent._mujinged; }, - content:function(){ - trigger.parent._mujinged=true; + content: function () { + trigger.parent._mujinged = true; player.getStat().card.sha--; - } - }, - lichang:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',{color:'red'})>0; }, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('lichang'),'he',{color:'red'}); - next.logSkill='lichang'; - next.ai=function(card){ - return 6-get.value(card); + }, + lichang: { + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { color: "red" }) > 0; + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("lichang"), "he", { color: "red" }); + next.logSkill = "lichang"; + next.ai = function (card) { + return 6 - get.value(card); }; - "step 1" - if(result.bool){ - player.addSkill('lichang2'); + ("step 1"); + if (result.bool) { + player.addSkill("lichang2"); } }, }, - lichang2:{ - trigger:{player:'phaseBegin'}, - direct:true, - mark:true, - intro:{ - content:'下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌' + lichang2: { + trigger: { player: "phaseBegin" }, + direct: true, + mark: true, + intro: { + content: "下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌", }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('lichang'),function(card,player,target){ - return get.distance(player,target)<=1; - }).ai=function(target){ - var att=get.attitude(player,target); - if(att>0){ - if(target.hp==1&&target.maxHp>1) return att*2; + content: function () { + "step 0"; + player.chooseTarget(get.prompt("lichang"), function (card, player, target) { + return get.distance(player, target) <= 1; + }).ai = function (target) { + var att = get.attitude(player, target); + if (att > 0) { + if (target.hp == 1 && target.maxHp > 1) return att * 2; } return att; }; - player.removeSkill('lichang2'); - 'step 1' - if(result.bool){ - player.logSkill('lichang',result.targets); - result.targets[0].chooseDrawRecover(2,true); + player.removeSkill("lichang2"); + ("step 1"); + if (result.bool) { + player.logSkill("lichang", result.targets); + result.targets[0].chooseDrawRecover(2, true); } - } - }, - mujing_old:{ - trigger:{player:'useCardToBegin'}, - filter:function(event,player){ - return event.target&&event.target!=player&&get.distance(event.target,player,'attack')>1; }, - direct:true, - content:function(){ - 'step 0' - player.discardPlayerCard(get.prompt('mujing'),trigger.target).logSkill=['mujing']; - 'step 1' - if(result.bool&&player.countCards('h')<=trigger.target.countCards('h')){ + }, + mujing_old: { + trigger: { player: "useCardToBegin" }, + filter: function (event, player) { + return ( + event.target && + event.target != player && + get.distance(event.target, player, "attack") > 1 + ); + }, + direct: true, + content: function () { + "step 0"; + player.discardPlayerCard(get.prompt("mujing"), trigger.target).logSkill = ["mujing"]; + ("step 1"); + if (result.bool && player.countCards("h") <= trigger.target.countCards("h")) { player.draw(); } - } + }, }, - zhanlong:{ - trigger:{player:'phaseBegin'}, - unique:true, - mark:true, - skillAnimation:true, - init:function(player){ - player.storage.zhanlong=false; + zhanlong: { + trigger: { player: "phaseBegin" }, + unique: true, + mark: true, + skillAnimation: true, + init: function (player) { + player.storage.zhanlong = false; }, - check:function(event,player){ - if(player.hasJudge('lebu')) return false; + check: function (event, player) { + if (player.hasJudge("lebu")) return false; return true; }, - filter:function(event,player){ - if(player.storage.zhanlong) return false; - if(player.countCards('he')==0) return false; - if(player.hp!=1) return false; + filter: function (event, player) { + if (player.storage.zhanlong) return false; + if (player.countCards("he") == 0) return false; + if (player.hp != 1) return false; return true; }, - content:function(){ - 'step 0' - player.discard(player.getCards('he')); - 'step 1' - player.addTempSkill('zhanlong2'); - player.awakenSkill('zhanlong'); - player.storage.zhanlong=true; - var cards=[]; - for(var i=0;i<3;i++){ - cards.push(game.createCard('sha')); + content: function () { + "step 0"; + player.discard(player.getCards("he")); + ("step 1"); + player.addTempSkill("zhanlong2"); + player.awakenSkill("zhanlong"); + player.storage.zhanlong = true; + var cards = []; + for (var i = 0; i < 3; i++) { + cards.push(game.createCard("sha")); } - player.gain(cards,'gain2'); + player.gain(cards, "gain2"); }, - ai:{ - threaten:function(player,target){ - if(target.hp==1) return 3; + ai: { + threaten: function (player, target) { + if (target.hp == 1) return 3; return 1; }, - effect:{ - target:function(card,player,target){ - if(!target.hasFriend()) return; - if(get.tag(card,'damage')==1&&target.hp==2&&target.countCards('he')&& - !target.isTurnedOver()&&_status.currentPhase!=target){ - if(get.distance(_status.currentPhase,target,'absolute')<=2) return [0.5,1]; + effect: { + target: function (card, player, target) { + if (!target.hasFriend()) return; + if ( + get.tag(card, "damage") == 1 && + target.hp == 2 && + target.countCards("he") && + !target.isTurnedOver() && + _status.currentPhase != target + ) { + if (get.distance(_status.currentPhase, target, "absolute") <= 2) + return [0.5, 1]; return 0.8; } - } - } + }, + }, + }, + intro: { + content: "limited", }, - intro:{ - content:'limited' - } }, - zhanlong2:{ - mod:{ - cardUsable:function(card){ - if(card.name=='sha') return Infinity; - } - } + zhanlong2: { + mod: { + cardUsable: function (card) { + if (card.name == "sha") return Infinity; + }, + }, }, - feiren:{ - trigger:{source:'damageBegin'}, - forced:true, + feiren: { + trigger: { source: "damageBegin" }, + forced: true, // alter:true, - filter:function(event,player){ - return !get.is.altered('feiren')&&event.card&&event.card.name=='sha'&&get.suit(event.card)=='spade'&&event.notLink(); + filter: function (event, player) { + return ( + !get.is.altered("feiren") && + event.card && + event.card.name == "sha" && + get.suit(event.card) == "spade" && + event.notLink() + ); }, - content:function(){ + content: function () { trigger.num++; }, - mod:{ - targetInRange:function(card){ - if(card.name=='sha') return true; + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; }, - selectTarget:function(card,player,range){ - if(card.name=='sha'&&range[1]!=-1&&get.suit(card)=='club'){ + selectTarget: function (card, player, range) { + if (card.name == "sha" && range[1] != -1 && get.suit(card) == "club") { range[1]++; } }, }, - ai:{ - threaten:1.4 - } + ai: { + threaten: 1.4, + }, }, - feiren3:{ - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - if(event.parent.name=='feiren2') return false; - if(event.card.name!='sha') return false; - if(get.suit(event.card)!='spade') return false; - var card=game.createCard(event.card.name,event.card.suit,event.card.number,event.card.nature); - for(var i=0;i0){ + if (current && get.recoverEffect(current, player, player) > 0) { return 0; } - return get.recoverEffect(target,player,target); - } - } - } - }, - xie2:{ - mark:true, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - if(player.storage.xie=='now'){ - return event.player==player; - } - var num=game.phaseNumber-player.storage.xie; - return num&&num%6==0; + return get.recoverEffect(target, player, target); + }, + }, }, - content:function(){ - if(player.storage.xie=='now'){ - player.storage.xie=game.phaseNumber; + }, + xie2: { + mark: true, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + if (player.storage.xie == "now") { + return event.player == player; + } + var num = game.phaseNumber - player.storage.xie; + return num && num % 6 == 0; + }, + content: function () { + if (player.storage.xie == "now") { + player.storage.xie = game.phaseNumber; } player.recover(); }, - intro:{ - content:function(storage,player){ - var str='每隔六回合回复1点体力,直到'+get.translation(storage)+'死亡'; - if(typeof player.storage.xie=='number'){ - var num=game.phaseNumber-player.storage.xie; - num=num%6; - if(num==0){ - str+='(下次生效于本回合)' - } - else{ - str+='(下次生效于'+(6-num)+'回合后)' + intro: { + content: function (storage, player) { + var str = "每隔六回合回复1点体力,直到" + get.translation(storage) + "死亡"; + if (typeof player.storage.xie == "number") { + var num = game.phaseNumber - player.storage.xie; + num = num % 6; + if (num == 0) { + str += "(下次生效于本回合)"; + } else { + str += "(下次生效于" + (6 - num) + "回合后)"; } } return str; }, - onunmark:function(storage,player){ + onunmark: function (storage, player) { delete player.storage.xie; delete player.storage.xie2; - } + }, }, - group:['xie3','xie4'] + group: ["xie3", "xie4"], }, - xie3:{ - trigger:{global:'phaseBegin'}, - forced:true, - popup:false, - content:function(){ - var num=game.phaseNumber-player.storage.xie; - num=num%6; - if(num){ - num=6-num; + xie3: { + trigger: { global: "phaseBegin" }, + forced: true, + popup: false, + content: function () { + var num = game.phaseNumber - player.storage.xie; + num = num % 6; + if (num) { + num = 6 - num; } - player.storage.xie2_markcount=num; + player.storage.xie2_markcount = num; player.updateMarks(); - } + }, }, - xie4:{ - trigger:{global:'dieAfter'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.player==player.storage.xie2; + xie4: { + trigger: { global: "dieAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.player == player.storage.xie2; + }, + content: function () { + game.log(player, "解除了", "【谐】"); + player.removeSkill("xie2"); }, - content:function(){ - game.log(player,'解除了','【谐】'); - player.removeSkill('xie2'); - } }, - luan:{ - enable:'phaseUse', - unique:true, - filterTarget:function(card,player,target){ - return target!=player&&!target.hasSkill('luan2'); + luan: { + enable: "phaseUse", + unique: true, + filterTarget: function (card, player, target) { + return target != player && !target.hasSkill("luan2"); }, - filter:function(event,player){ - return player.countCards('h',{suit:'spade'}); + filter: function (event, player) { + return player.countCards("h", { suit: "spade" }); }, - filterCard:{suit:'spade'}, - check:function(card){ - return 7-get.value(card); + filterCard: { suit: "spade" }, + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - var current=game.findPlayer(function(player){ - return player.hasSkill('luan2'); + content: function () { + var current = game.findPlayer(function (player) { + return player.hasSkill("luan2"); }); - if(current){ - current.removeSkill('luan2'); + if (current) { + current.removeSkill("luan2"); } - target.addSkill('luan2'); + target.addSkill("luan2"); // target.storage.luan='now'; - target.storage.luan2=player; + target.storage.luan2 = player; }, - ai:{ - expose:0.2, - order:9.1, - threaten:2, - result:{ - target:function(player,target){ - var current=game.findPlayer(function(player){ - return player.hasSkill('luan2'); + ai: { + expose: 0.2, + order: 9.1, + threaten: 2, + result: { + target: function (player, target) { + var current = game.findPlayer(function (player) { + return player.hasSkill("luan2"); }); - if(current&&get.attitude(player,current)<0){ + if (current && get.attitude(player, current) < 0) { return 0; } - if(target.hp==1) return 0.5; + if (target.hp == 1) return 0.5; return -1; - } - } - } - }, - luan2:{ - mark:true, - intro:{ - content:'受到的伤害后失去1点体力,直到首次进入濒死状态' + }, + }, }, - trigger:{player:'damageEnd'}, - forced:true, - content:function(){ + }, + luan2: { + mark: true, + intro: { + content: "受到的伤害后失去1点体力,直到首次进入濒死状态", + }, + trigger: { player: "damageEnd" }, + forced: true, + content: function () { player.loseHp(); }, - ai:{ - threaten:1.2 + ai: { + threaten: 1.2, }, - group:['luan3','luan4'] + group: ["luan3", "luan4"], }, - luan3:{ - trigger:{player:'dyingAfter'}, - forced:true, - popup:false, - content:function(){ - game.log(player,'解除了','【乱】'); - player.removeSkill('luan2'); - } + luan3: { + trigger: { player: "dyingAfter" }, + forced: true, + popup: false, + content: function () { + game.log(player, "解除了", "【乱】"); + player.removeSkill("luan2"); + }, }, - luan2_old:{ - mark:true, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - if(player.storage.luan=='now'){ - return event.player==player; + luan2_old: { + mark: true, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + if (player.storage.luan == "now") { + return event.player == player; } - var num=game.phaseNumber-player.storage.luan; - return num&&num%6==0; + var num = game.phaseNumber - player.storage.luan; + return num && num % 6 == 0; }, - content:function(){ - if(player.storage.luan=='now'){ - player.storage.luan=game.phaseNumber; + content: function () { + if (player.storage.luan == "now") { + player.storage.luan = game.phaseNumber; } player.loseHp(); }, - intro:{ - content:function(storage,player){ - var str='每隔六回合失去1点体力,直到'+get.translation(storage)+'死亡'; - if(typeof player.storage.luan=='number'){ - var num=game.phaseNumber-player.storage.luan; - num=num%6; - if(num==0){ - str+='(下次生效于本回合)' - } - else{ - str+='(下次生效于'+(6-num)+'回合后)' + intro: { + content: function (storage, player) { + var str = "每隔六回合失去1点体力,直到" + get.translation(storage) + "死亡"; + if (typeof player.storage.luan == "number") { + var num = game.phaseNumber - player.storage.luan; + num = num % 6; + if (num == 0) { + str += "(下次生效于本回合)"; + } else { + str += "(下次生效于" + (6 - num) + "回合后)"; } } return str; }, - onunmark:function(storage,player){ + onunmark: function (storage, player) { delete player.storage.luan; delete player.storage.luan2; - } + }, }, - group:['luan3','luan4'] + group: ["luan3", "luan4"], }, - luan3_old:{ - trigger:{global:'phaseBegin'}, - forced:true, - popup:false, - content:function(){ - var num=game.phaseNumber-player.storage.luan; - num=num%6; - if(num){ - num=6-num; + luan3_old: { + trigger: { global: "phaseBegin" }, + forced: true, + popup: false, + content: function () { + var num = game.phaseNumber - player.storage.luan; + num = num % 6; + if (num) { + num = 6 - num; } - player.storage.luan2_markcount=num; + player.storage.luan2_markcount = num; player.updateMarks(); - } - }, - luan4:{ - trigger:{global:'dieAfter'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.player==player.storage.luan2; }, - content:function(){ - game.log(player,'解除了','【乱】'); - player.removeSkill('luan2'); - } }, - sheng:{ - enable:'phaseUse', - unique:true, - mark:true, - skillAnimation:true, - animationColor:'metal', - init:function(player){ - player.storage.sheng=false; + luan4: { + trigger: { global: "dieAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.player == player.storage.luan2; }, - filter:function(event,player){ - if(player.storage.sheng) return false; + content: function () { + game.log(player, "解除了", "【乱】"); + player.removeSkill("luan2"); + }, + }, + sheng: { + enable: "phaseUse", + unique: true, + mark: true, + skillAnimation: true, + animationColor: "metal", + init: function (player) { + player.storage.sheng = false; + }, + filter: function (event, player) { + if (player.storage.sheng) return false; return true; }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return target.isDamaged(); }, - selectTarget:[1,Infinity], - contentBefore:function(){ + selectTarget: [1, Infinity], + contentBefore: function () { player.turnOver(); - player.addSkill('sheng2'); - player.awakenSkill('sheng'); - player.storage.sheng=true; + player.addSkill("sheng2"); + player.awakenSkill("sheng"); + player.storage.sheng = true; }, - content:function(){ + content: function () { target.recover(); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var eff=get.recoverEffect(target,player,target); - if(player.hp==1) return eff; - if(player.hasUnknown()) return 0; - var num1=0,num2=0,num3=0,players=game.filterPlayer(); - for(var i=0;i0){ + ai: { + order: 1, + result: { + target: function (player, target) { + var eff = get.recoverEffect(target, player, target); + if (player.hp == 1) return eff; + if (player.hasUnknown()) return 0; + var num1 = 0, + num2 = 0, + num3 = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) { num1++; - if(players[i].isDamaged()){ + if (players[i].isDamaged()) { num2++; - if(players[i].hp<=1){ + if (players[i].hp <= 1) { num3++; } } } } - if(num1==num2) return eff; - if(num2==num1-1&&num3) return eff; - if(num3>=2) return eff; + if (num1 == num2) return eff; + if (num2 == num1 - 1 && num3) return eff; + if (num3 >= 2) return eff; return 0; - } + }, }, }, - intro:{ - content:'limited' - } - }, - sheng2:{ - trigger:{player:'phaseBegin'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('sheng2'); + intro: { + content: "limited", }, - mod:{ - targetEnabled:function(card,player,target){ - if(player!=target) return false; - } - } }, - yihun:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',{color:'black'})>0&&!player.hasSkill('yihun2'); + sheng2: { + trigger: { player: "phaseBegin" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("sheng2"); }, - content:function(){ - 'step 0' - var next=player.chooseCardTarget({ - prompt:get.prompt('yihun'), - position:'he', - filterCard:function(card,player){ - return get.color(card)=='black'&&lib.filter.cardDiscardable(card,player); + mod: { + targetEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, + }, + yihun: { + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { color: "black" }) > 0 && !player.hasSkill("yihun2"); + }, + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + prompt: get.prompt("yihun"), + position: "he", + filterCard: function (card, player) { + return get.color(card) == "black" && lib.filter.cardDiscardable(card, player); }, - ai1:function(card){ - return 7-get.value(card); + ai1: function (card) { + return 7 - get.value(card); }, - ai2:function(target){ - var att=-get.attitude(player,target); - if(target==player.next){ - att/=10; + ai2: function (target) { + var att = -get.attitude(player, target); + if (target == player.next) { + att /= 10; } - if(target==player.next.next){ - att/=2; + if (target == player.next.next) { + att /= 2; } return att; }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, }); - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { player.discard(result.cards); - player.logSkill('yihun',result.targets); - player.addSkill('yihun2'); - var target=result.targets[0] - player.storage.yihun2=target; - if(target&&(get.mode()!='guozhan')||!target.isUnseen()){ - player.markSkillCharacter('yihun2',target,'移魂','在'+get.translation(target)+'的下一准备阶段视为对其使用一张杀'); + player.logSkill("yihun", result.targets); + player.addSkill("yihun2"); + var target = result.targets[0]; + player.storage.yihun2 = target; + if ((target && get.mode() != "guozhan") || !target.isUnseen()) { + player.markSkillCharacter( + "yihun2", + target, + "移魂", + "在" + get.translation(target) + "的下一准备阶段视为对其使用一张杀" + ); } } }, }, - yihun2:{ - trigger:{global:['phaseBegin','dieAfter']}, - forced:true, - filter:function(event,player){ - return event.player==player.storage.yihun2; + yihun2: { + trigger: { global: ["phaseBegin", "dieAfter"] }, + forced: true, + filter: function (event, player) { + return event.player == player.storage.yihun2; }, - content:function(){ - if(player.storage.yihun2.isIn()){ - player.useCard({name:'sha'},player.storage.yihun2); + content: function () { + if (player.storage.yihun2.isIn()) { + player.useCard({ name: "sha" }, player.storage.yihun2); } - player.removeSkill('yihun2'); + player.removeSkill("yihun2"); delete player.storage.yihun2; }, - mod:{ - targetEnabled:function(){ + mod: { + targetEnabled: function () { return false; }, - cardEnabled:function(card,player){ + cardEnabled: function (card, player) { return false; }, - } - }, - huoyu:{ - enable:'phaseUse', - unique:true, - mark:true, - skillAnimation:true, - animationColor:'fire', - init:function(player){ - player.storage.huoyu=false; }, - filter:function(event,player){ - if(player.storage.huoyu) return false; - if(player.countCards('he',{color:'red'})<2) return false; + }, + huoyu: { + enable: "phaseUse", + unique: true, + mark: true, + skillAnimation: true, + animationColor: "fire", + init: function (player) { + player.storage.huoyu = false; + }, + filter: function (event, player) { + if (player.storage.huoyu) return false; + if (player.countCards("he", { color: "red" }) < 2) return false; return true; }, - filterTarget:function(card,player,target){ - return player.canUse('chiyuxi',target); + filterTarget: function (card, player, target) { + return player.canUse("chiyuxi", target); }, - filterCard:{color:'red'}, - selectCard:2, - position:'he', - check:function(card){ - return 7-get.value(card); + filterCard: { color: "red" }, + selectCard: 2, + position: "he", + check: function (card) { + return 7 - get.value(card); }, - selectTarget:-1, - multitarget:true, - multiline:true, - line:'fire', - content:function(){ - 'step 0' + selectTarget: -1, + multitarget: true, + multiline: true, + line: "fire", + content: function () { + "step 0"; targets.sort(lib.sort.seat); - player.awakenSkill('huoyu'); - player.storage.huoyu=true; - player.useCard({name:'chiyuxi'},targets).animate=false; - 'step 1' - player.useCard({name:'chiyuxi'},targets).animate=false; + player.awakenSkill("huoyu"); + player.storage.huoyu = true; + player.useCard({ name: "chiyuxi" }, targets).animate = false; + ("step 1"); + player.useCard({ name: "chiyuxi" }, targets).animate = false; }, - ai:{ - order:5, - result:{ - target:function(player,target){ - if(player.hasUnknown()) return 0; - return get.effect(target,{name:'chiyuxi'},player,target); - } + ai: { + order: 5, + result: { + target: function (player, target) { + if (player.hasUnknown()) return 0; + return get.effect(target, { name: "chiyuxi" }, player, target); + }, }, }, - intro:{ - content:'limited' - } + intro: { + content: "limited", + }, }, - feidan:{ - trigger:{source:'damageAfter'}, - direct:true, - filter:function(event,player){ - if(player.countCards('he')==0) return false; - if(!event.card) return false; - if(event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return current!=event.player&&get.distance(event.player,current)<=1 + feidan: { + trigger: { source: "damageAfter" }, + direct: true, + filter: function (event, player) { + if (player.countCards("he") == 0) return false; + if (!event.card) return false; + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return current != event.player && get.distance(event.player, current) <= 1; }); }, - content:function(){ - "step 0" - var eff=0; - var targets=game.filterPlayer(function(current){ - if(current!=trigger.player&&get.distance(trigger.player,current)<=1){ - eff+=get.damageEffect(current,player,player); + content: function () { + "step 0"; + var eff = 0; + var targets = game.filterPlayer(function (current) { + if (current != trigger.player && get.distance(trigger.player, current) <= 1) { + eff += get.damageEffect(current, player, player); return true; } }); - event.targets=targets; - player.chooseToDiscard(get.prompt('feidan',targets)).set('ai',function(card){ - if(eff>0) return 7-get.value(card); - return 0; - }).set('logSkill',['feidan',targets]); - "step 1" - if(result.bool){ + event.targets = targets; + player + .chooseToDiscard(get.prompt("feidan", targets)) + .set("ai", function (card) { + if (eff > 0) return 7 - get.value(card); + return 0; + }) + .set("logSkill", ["feidan", targets]); + ("step 1"); + if (result.bool) { event.targets.sort(lib.sort.seat); - } - else{ + } else { event.finish(); } - "step 2" - if(event.targets.length){ + ("step 2"); + if (event.targets.length) { event.targets.shift().damage(); event.redo(); } }, - mod:{ - targetInRange:function(card,player,target){ - if(card.name=='sha'){ - if(get.distance(player,target)<=1) return false; + mod: { + targetInRange: function (card, player, target) { + if (card.name == "sha") { + if (get.distance(player, target) <= 1) return false; return true; } - } - } + }, + }, }, - yuedong:{ - trigger:{player:'phaseUseEnd'}, - direct:true, - content:function(){ - 'step 0' - var num=1+player.storage.yuedong_num; - player.chooseTarget(get.prompt('yuedong'),[1,num],function(card,player,target){ - if(player.storage.yuedong_recover){ - return target.hp1) return att/5; - if(num2==1){ - if(num>1) return att/3; - return att/4; + yuedong: { + trigger: { player: "phaseUseEnd" }, + direct: true, + content: function () { + "step 0"; + var num = 1 + player.storage.yuedong_num; + player + .chooseTarget(get.prompt("yuedong"), [1, num], function (card, player, target) { + if (player.storage.yuedong_recover) { + return target.hp < target.maxHp; } - return att*1.1; - } - return att; - }); - 'step 1' - if(result.bool){ - player.logSkill('yuedong',result.targets); - var eff=1+player.storage.yuedong_eff; - if(player.storage.yuedong_recover){ + return true; + }) + .set("ai", function (target) { + if (player.storage.yuedong_recover) { + return get.recoverEffect(target, player, player); + } + var att = get.attitude(player, target) / Math.sqrt(2 + target.countCards("h")); + if (player == target) { + var num2 = player.needsToDiscard(num); + if (num2 > 1) return att / 5; + if (num2 == 1) { + if (num > 1) return att / 3; + return att / 4; + } + return att * 1.1; + } + return att; + }); + ("step 1"); + if (result.bool) { + player.logSkill("yuedong", result.targets); + var eff = 1 + player.storage.yuedong_eff; + if (player.storage.yuedong_recover) { result.targets.sort(lib.sort.seat); - for(var i=0;i1&&!player.storage.yuedong_recover; + huhuan: { + enable: "phaseUse", + filterCard: true, + selectCard: 2, + position: "he", + filter: function (event, player) { + return player.countCards("he") > 1 && !player.storage.yuedong_recover; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - content:function(){ - player.storage.yuedong_recover=true; + content: function () { + player.storage.yuedong_recover = true; }, - ai:{ - order:10.2, - result:{ - player:function(player){ - var num1=0,num2=0,players=game.filterPlayer(); - for(var i=0;i0){ + ai: { + order: 10.2, + result: { + player: function (player) { + var num1 = 0, + num2 = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) { num2++; - if(players[i].hp<=2&&players[i].maxHp>2){ + if (players[i].hp <= 2 && players[i].maxHp > 2) { num1++; - if(players[i].hp==1){ + if (players[i].hp == 1) { num1++; } } } } - if(num1>=3){ + if (num1 >= 3) { return 1; } return 0; - } - } - } + }, + }, + }, }, - kuoyin:{ - enable:'phaseUse', - filterCard:true, - selectCard:function(){ - if(get.is.altered('kuoyin')) return 1; - if(_status.event.player.storage.yuedong_eff) return 1; - if(_status.event.player.storage.yuedong_num) return 2; - return [1,2]; + kuoyin: { + enable: "phaseUse", + filterCard: true, + selectCard: function () { + if (get.is.altered("kuoyin")) return 1; + if (_status.event.player.storage.yuedong_eff) return 1; + if (_status.event.player.storage.yuedong_num) return 2; + return [1, 2]; }, - position:'he', + position: "he", // alter:true, - filter:function(event,player){ - if(get.is.altered('kuoyin')&&player.storage.yuedong_num) return false; - if(player.storage.yuedong_eff&&player.storage.yuedong_num) return false; - return player.countCards('he')>0; + filter: function (event, player) { + if (get.is.altered("kuoyin") && player.storage.yuedong_num) return false; + if (player.storage.yuedong_eff && player.storage.yuedong_num) return false; + return player.countCards("he") > 0; }, - check:function(card){ - var player=_status.event.player; - var num1=0,num2=0,players=game.filterPlayer(); - for(var i=0;i0){ + check: function (card) { + var player = _status.event.player; + var num1 = 0, + num2 = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) { num2++; - if(players[i].hp<=2&&players[i].maxHp>2){ + if (players[i].hp <= 2 && players[i].maxHp > 2) { num1++; } } } - if(player.storage.yuedong_recover){ - if(num1>1&&!player.storage.yuedong_num){ - if(ui.selected.cards.length) return 0; - return 7-get.value(card); + if (player.storage.yuedong_recover) { + if (num1 > 1 && !player.storage.yuedong_num) { + if (ui.selected.cards.length) return 0; + return 7 - get.value(card); } return 0; - } - else{ - if(num2>1&&!player.storage.yuedong_num){ - if(ui.selected.cards.length) return 0; - return 7-get.value(card); + } else { + if (num2 > 1 && !player.storage.yuedong_num) { + if (ui.selected.cards.length) return 0; + return 7 - get.value(card); } - if(num2>2){ - return 6-get.value(card); + if (num2 > 2) { + return 6 - get.value(card); } - return 5-get.value(card); + return 5 - get.value(card); } }, - content:function(){ - if(cards.length==1){ - player.storage.yuedong_num+=2; - } - else{ + content: function () { + if (cards.length == 1) { + player.storage.yuedong_num += 2; + } else { player.storage.yuedong_eff++; } }, - ai:{ - threaten:1.6, - order:10.1, - result:{ - player:1 - } - }, - group:'kuoyin2' - }, - kuoyin2:{ - trigger:{player:'phaseBegin'}, - silent:true, - content:function(){ - player.storage.yuedong_recover=false; - player.storage.yuedong_num=0; - player.storage.yuedong_eff=0; - } - }, - guangshu:{ - enable:'phaseUse', - check:function(card){ - var player=_status.event.player; - var suit=get.suit(card); - if(suit=='heart'){ - if(game.hasPlayer(function(current){ - return current.hp==1&&get.attitude(player,current)>0 - })); - } - else if(suit=='spade'){ - return 7-get.value(card); - } - return 6-get.value(card); - }, - filter:function(event,player){ - return player.countCards('he')>0; - }, - filterTarget:function(card,player,target){ - return !target.hasSkill('guangshu_heart')&& - !target.hasSkill('guangshu_spade')&& - !target.hasSkill('guangshu_club')&& - !target.hasSkill('guangshu_diamond'); - }, - filterCard:true, - position:'he', - content:function(){ - target.addSkill('guangshu_'+get.suit(cards[0])); - }, - ai:{ - expose:0.2, - threaten:1.6, - order:5, - result:{ - target:function(player,target){ - if(!ui.selected.cards.length) return 0; - switch(get.suit(ui.selected.cards[0])){ - case 'heart':if(target.hp==1) return 1;return 0.1; - case 'diamond':return 1+Math.sqrt(target.countCards('h')); - case 'club':return -target.countCards('h')-Math.sqrt(target.countCards('h','sha')); - case 'spade':return get.damageEffect(target,player,target,'thunder'); - default:return 0; - } - } - } - } - }, - guangshu_diamond:{ - mark:true, - intro:{ - content:'下次造成伤害时摸两张牌' - }, - trigger:{source:'damageEnd'}, - forced:true, - content:function(){ - player.draw(2); - player.removeSkill('guangshu_diamond'); - } - }, - guangshu_heart:{ - mark:true, - intro:{ - content:'下次受到伤害时回复1点体力' - }, - trigger:{player:'damageEnd'}, - priority:6, - forced:true, - content:function(){ - player.recover(); - player.removeSkill('guangshu_heart'); - } - }, - guangshu_club:{ - mark:true, - intro:{ - content:'无法使用杀直到下一回合结束' - }, - trigger:{player:'phaseEnd'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('guangshu_club'); - }, - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; - } - } - }, - guangshu_spade:{ - mark:true, - intro:{ - content:'下个结束阶段受到1点无来源的雷电伤害' - }, - trigger:{player:'phaseEnd'}, - forced:true, - content:function(){ - player.damage('thunder','nosource'); - player.removeSkill('guangshu_spade'); - } - }, - ziyu:{ - trigger:{global:'phaseEnd'}, - direct:true, - filter:function(event,player){ - if(get.is.altered('ziyu')) return game.phaseNumber%6==0; - return game.phaseNumber%4==0; - }, - // alter:true, - content:function(){ - player.chooseDrawRecover(get.prompt('ziyu')).logSkill='ziyu'; - } - }, - shouhu:{ - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + ai: { + threaten: 1.6, + order: 10.1, + result: { + player: 1, }, }, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h','sha')>0; - }, - filterTarget:function(card,player,target){ - return target.hpplayer.hp&&player.countCards('h','lebu')==0)||get.distance(player,event.player)>1); + }, + guangshu: { + enable: "phaseUse", + check: function (card) { + var player = _status.event.player; + var suit = get.suit(card); + if (suit == "heart") { + if ( + game.hasPlayer(function (current) { + return current.hp == 1 && get.attitude(player, current) > 0; + }) + ); + } else if (suit == "spade") { + return 7 - get.value(card); + } + return 6 - get.value(card); + }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + filterTarget: function (card, player, target) { + return ( + !target.hasSkill("guangshu_heart") && + !target.hasSkill("guangshu_spade") && + !target.hasSkill("guangshu_club") && + !target.hasSkill("guangshu_diamond") + ); + }, + filterCard: true, + position: "he", + content: function () { + target.addSkill("guangshu_" + get.suit(cards[0])); + }, + ai: { + expose: 0.2, + threaten: 1.6, + order: 5, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + switch (get.suit(ui.selected.cards[0])) { + case "heart": + if (target.hp == 1) return 1; + return 0.1; + case "diamond": + return 1 + Math.sqrt(target.countCards("h")); + case "club": + return -target.countCards("h") - Math.sqrt(target.countCards("h", "sha")); + case "spade": + return get.damageEffect(target, player, target, "thunder"); + default: + return 0; + } + }, + }, + }, + }, + guangshu_diamond: { + mark: true, + intro: { + content: "下次造成伤害时摸两张牌", + }, + trigger: { source: "damageEnd" }, + forced: true, + content: function () { + player.draw(2); + player.removeSkill("guangshu_diamond"); + }, + }, + guangshu_heart: { + mark: true, + intro: { + content: "下次受到伤害时回复1点体力", + }, + trigger: { player: "damageEnd" }, + priority: 6, + forced: true, + content: function () { + player.recover(); + player.removeSkill("guangshu_heart"); + }, + }, + guangshu_club: { + mark: true, + intro: { + content: "无法使用杀直到下一回合结束", + }, + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("guangshu_club"); + }, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + guangshu_spade: { + mark: true, + intro: { + content: "下个结束阶段受到1点无来源的雷电伤害", + }, + trigger: { player: "phaseEnd" }, + forced: true, + content: function () { + player.damage("thunder", "nosource"); + player.removeSkill("guangshu_spade"); + }, + }, + ziyu: { + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + if (get.is.altered("ziyu")) return game.phaseNumber % 6 == 0; + return game.phaseNumber % 4 == 0; }, // alter:true, - intro:{ - content:function(storage,player){ - var str=''; - if(player.storage.shanxian_h.length){ - if(player.isUnderControl(true)){ - str+='手牌区:'+get.translation(player.storage.shanxian_h); - } - else{ - str+='手牌区:'+(player.storage.shanxian_h.length)+'张牌'; + content: function () { + player.chooseDrawRecover(get.prompt("ziyu")).logSkill = "ziyu"; + }, + }, + shouhu: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", "sha") > 0; + }, + filterTarget: function (card, player, target) { + return target.hp < target.maxHp && target != player; + }, + content: function () { + target.recover(); + }, + filterCard: { name: "sha" }, + ai: { + order: 7, + threaten: 2, + result: { + target: function (player, target) { + return get.recoverEffect(target, player, target); + }, + }, + }, + }, + shanxian: { + trigger: { global: "phaseBefore" }, + filter: function (event, player) { + return event.player != player && !player.isTurnedOver() && !player.storage.shanxian; + }, + check: function (event, player) { + return ( + get.attitude(player, event.player) < 0 && + ((player.countCards("h") > player.hp && player.countCards("h", "lebu") == 0) || + get.distance(player, event.player) > 1) + ); + }, + // alter:true, + intro: { + content: function (storage, player) { + var str = ""; + if (player.storage.shanxian_h.length) { + if (player.isUnderControl(true)) { + str += "手牌区:" + get.translation(player.storage.shanxian_h); + } else { + str += "手牌区:" + player.storage.shanxian_h.length + "张牌"; } } - if(player.storage.shanxian_e.length){ - if(str.length) str+='、'; - if(player.isUnderControl(true)){ - str+='装备区:'+get.translation(player.storage.shanxian_e); - } - else{ - str+='装备区:'+(player.storage.shanxian_e.length)+'张牌'; + if (player.storage.shanxian_e.length) { + if (str.length) str += "、"; + if (player.isUnderControl(true)) { + str += "装备区:" + get.translation(player.storage.shanxian_e); + } else { + str += "装备区:" + player.storage.shanxian_e.length + "张牌"; } } return str; }, - mark:function(dialog,content,player){ - if(player.storage.shanxian_h.length){ - if(player.isUnderControl(true)){ + mark: function (dialog, content, player) { + if (player.storage.shanxian_h.length) { + if (player.isUnderControl(true)) { dialog.add('
    手牌区
    '); dialog.addSmall(player.storage.shanxian_h); - } - else{ - dialog.add('
    手牌区:'+player.storage.shanxian_h.length+'张牌
    '); + } else { + dialog.add( + '
    手牌区:' + + player.storage.shanxian_h.length + + "张牌
    " + ); } } - if(player.storage.shanxian_e.length){ - if(player.isUnderControl(true)){ + if (player.storage.shanxian_e.length) { + if (player.isUnderControl(true)) { dialog.add('
    装备区
    '); dialog.addSmall(player.storage.shanxian_e); - } - else{ - dialog.add('
    装备区:'+player.storage.shanxian_e.length+'张牌
    '); + } else { + dialog.add( + '
    装备区:' + + player.storage.shanxian_e.length + + "张牌
    " + ); } } }, }, - logTarget:'player', - content:function(){ - "step 0" - if(!get.is.altered('shanxian')){ + logTarget: "player", + content: function () { + "step 0"; + if (!get.is.altered("shanxian")) { player.draw(false); player.$draw(); } - "step 1" - player.storage.shanxian_h=player.getCards('h'); - player.storage.shanxian_e=player.getCards('e'); - player.storage.shanxian_n=1; - player.syncStorage('shanxian_e'); - player.phase('shanxian'); - player.storage.shanxian=trigger.player; - player.removeSkill('shanxian2'); - player.markSkill('shanxian'); - "step 2" + ("step 1"); + player.storage.shanxian_h = player.getCards("h"); + player.storage.shanxian_e = player.getCards("e"); + player.storage.shanxian_n = 1; + player.syncStorage("shanxian_e"); + player.phase("shanxian"); + player.storage.shanxian = trigger.player; + player.removeSkill("shanxian2"); + player.markSkill("shanxian"); + ("step 2"); player.turnOver(true); delete player.storage.shanxian; }, - mod:{ - targetInRange:function(card,player,target,now){ - if(target==player.storage.shanxian) return true; + mod: { + targetInRange: function (card, player, target, now) { + if (target == player.storage.shanxian) return true; }, }, - ai:{ - expose:0.1, - effect:{ - target:function(card){ - if(card.name=='guiyoujie') return [0,0]; - } - } - } - }, - shanxian2:{ - trigger:{player:['gainBegin','loseBegin']}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('shanxian2'); - } - }, - shanhui:{ - unique:true, - trigger:{player:'damageEnd',source:'damageEnd'}, - filter:function(event,player){ - return player.storage.shanxian_h&&player.storage.shanxian_e&& - player.storage.shanxian_n>0&&!player.hasSkill('shanxian2'); + ai: { + expose: 0.1, + effect: { + target: function (card) { + if (card.name == "guiyoujie") return [0, 0]; + }, + }, }, - check:function(event,player){ - var n1=player.countCards('he'); - var n2=player.storage.shanxian_h.length+player.storage.shanxian_e.length; - if(n1 0 && + !player.hasSkill("shanxian2") + ); + }, + check: function (event, player) { + var n1 = player.countCards("he"); + var n2 = player.storage.shanxian_h.length + player.storage.shanxian_e.length; + if (n1 < n2) return true; + if (player.hp == player.maxHp) return false; + if (n1 == n2 + 1) return true; + if (n2 == n2 + 2 && player.hp <= 1) return true; return false; }, - video:function(player){ - var cards=player.getCards('he'); - for(var i=0;iplayer.storage.shanxian_h.length+player.storage.shanxian_e.length){ + if (cards.length > player.storage.shanxian_h.length + player.storage.shanxian_e.length) { player.recover(); } player.storage.shanxian_n--; - if(player.storage.shanxian_n<=0){ + if (player.storage.shanxian_n <= 0) { delete player.storage.shanxian_h; delete player.storage.shanxian_e; delete player.storage.shanxian_n; - player.unmarkSkill('shanxian'); + player.unmarkSkill("shanxian"); + } else { + player.addSkill("shanxian2"); } - else{ - player.addSkill('shanxian2'); - } - } - } + }, + }, + }, + translate: { + woliu: "涡流", + woliu2: "涡流", + woliu_info: + "结束阶段,你可以选择至多两名角色,当你或目标中的任意一名角色成为杀的目标时,其余角色也将被追加为目标,直到你死亡或下一回合开始。", + qianggu: "强固", + qianggu_info: + "出牌阶段限一次,你可以弃置两张牌并获得2点护甲,若如此做,直到你的下个回合开始,其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。", + qianggu2: "强固", + qianggu2_bg: "固", + qianggu2_info: "其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。", + pingzhang: "屏障", + pingzhang_info: + "每轮各限一次,当你受到伤害时,你可以弃置一张红桃牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃牌令伤害-1。", + pingzhang_info_alter: + "每轮各限一次,当你受到伤害时,你可以弃置一张红桃手牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃手牌令伤害-1。", + owliyong: "力涌", + owliyong_info: "锁定技,你摸牌阶段摸牌数+X,X为你上一轮发动屏障的次数。", + dianji: "电击", + dianji_info: "出牌阶段限一次,你可以将一张手牌当作惊雷闪对距离2以内的角色使用。", + feitiao: "飞跳", + feitiao2: "飞跳", + feitiao_info: + "出牌阶段开始时,你可以弃置一张牌并指定一名角色,你与该角色的距离视为1直到回合结束,然后该角色随机弃置一张牌。", + bshaowei: "哨卫", + bshaowei_info: + "结束阶段,你可以切换至哨卫模式。当处于此模式时,你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀。", + zhencha: "侦查", + zhencha_info: + "结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张杀,你摸一张牌或回复1点体力。", + liangou: "链钩", + liangou_info: + "出牌阶段限一次,你可以弃置一张牌,指定一名其他角色并进行一次判定,若结果不为红桃,该角色与你距离为1且受到的首次伤害+1直到回合结束。", + xiyang: "吸氧", + xiyang_info: "结束阶段,若你武将牌正面朝上,你可以翻面并回复2点体力。", + qinru: "侵入", + qinru_info: + "每当你使用杀指定目标时,你可以令其进行一次判定,若结果不为红桃,该角色的非锁定技失效直到其下一回合结束。", + yinshen: "隐身", + yinshen_info: "锁定技,每当你失去最后一张基本牌,你获得潜行直到下一回合开始。", + yinshen_info_old: "结束阶段,你可以弃置一张装备牌并获得潜行直到下一回合开始。", + maichong: "脉冲", + maichong_info: + "锁定技,每当你使用一张普通锦囊牌,你令最近三回合内被你侵入过的角色各随机弃置一张牌。", + maichong_info_alter: "准备阶段,你可以令最近两名被你侵入的角色各随机弃置一张牌。", + lichang: "力场", + lichang2: "力场", + lichang_info: + "结束阶段,你可以弃置一张红色牌,若如此做,你可以在下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌。", + mengji: "猛击", + mengji_info: "锁定技,若你已发动重盾,当你没有护甲时,你的杀造成的伤害+1。", + zhongdun: "重盾", + zhongdun_info: + "游戏开始时,你获得8点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色。", + zhongdun_info_alter: + "游戏开始时,你获得6点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色。", + paotai: "炮台", + paotai2: "炮台", + paotai_info: + "出牌阶段,你可以弃置一张杀布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成1点火焰伤害;每当你受到1点伤害,炮台降低一级。", + maoding: "铆钉", + maoding2: "铆钉", + maoding_info: + "每当你造成或受到一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲。", + maoding_info_alter: + "每当你造成一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲。", + bfengshi: "风矢", + bfengshi2: "风矢", + bfengshi_info: + "锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加20%的概率强制命中;你的首张杀造成伤害后增加20%的概率令伤害+1。", + bfengshi_info_alter: + "锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加15%的概率强制命中;你的首张杀造成伤害后增加15%的概率令伤害+1。", + yinbo: "音波", + yinbo_info: "出牌阶段限一次,你可以弃置一张黑桃牌,然后随机弃置三名敌人各一张牌。", + liudan: "榴弹", + liudan_info: "每当你使用一张杀,你可以令所有不是此杀目标的其他角色有50%概率成为此杀的额外目标。", + shoujia: "兽夹", + shoujia2: "兽夹", + shoujia3: "兽夹", + shoujia_info: + "出牌阶段限一次,你可以将一张牌背面朝上置于一名其他角色的武将牌上,当该角色使用一张与此牌花色相同的牌指定其他角色为目标时,移去此牌,该角色将武将牌翻至背面;当你受到伤害时,移去此牌。", + shihuo: "嗜火", + shihuo_info: "锁定技,每当一名角色受到火焰伤害,你摸一张牌。", + shanguang: "闪光", + shanguang_info: + "出牌阶段限一次,你可以弃置一张方片牌令攻击范围内的一名其他角色本回合内不能使用或打出卡牌。", + tiandan: "填弹", + tiandan_info: + "摸牌阶段开始时,你可以跳过出牌和弃牌阶段,然后获得若干张杀直到你的手牌数等于你的体值(最多为5)。", + shenqiang: "神枪", + shenqiang_info: "锁定技,每当你在出牌阶段使用杀造成伤害,本阶段内出杀次数上限+1。", + mianzhen: "眠针", + mianzhen2: "眠针", + mianzhen_info: + "出牌阶段限一次,你可以弃置一张牌并令一名其他角色打出一张闪,否则该角色不能使用或打出卡牌直到其受到伤害或下一回合结束。", + aqianghua: "强化", + aqianghua2: "强化", + aqianghua_info: + "出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色获得1点护甲且下一次造成的伤害+1。", + aqianghua_info_alter: + "出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色下一次造成的伤害+1。", + zhiyuan: "支援", + zhiyuan_info: "每当你即将造成伤害,你可以防止此伤害,改为令目标回复等量的体力。", + juji: "狙击", + juji2: "狙击", + juji3: "狙击", + juji_info: + "出牌阶段限一次,你可以弃置任意张花色不同的牌并指定一名有手牌的其他角色,若该角色的手牌中含有与你弃置的牌花色相同的牌,则本回合内你与其距离为1且该角色不能闪避你的杀。", + duwen: "毒吻", + duwen2: "毒吻", + duwen_info: "锁定技,当你造成伤害时,若你的手牌数与受伤害角色相等,此伤害+1。", + zhuagou: "抓钩", + zhuagou_info: "出牌阶段限一次,你可以弃置一张手牌并将你的座位移到任意位置。", + dulei: "诡雷", + dulei2: "诡雷", + dulei_info: + "出牌阶段,若你武将牌上没有牌,你可以将一张牌背面朝上置于你的武将牌上,当一名角色使用与该牌花色相同的牌指定你为目标时,你展示并移去此牌,然后该角色失去1点体力并随机弃置一张牌。", + shuangqiang: "霜枪", + shuangqiang_info: "每当你对一名未翻面的角色造成伤害,你可以令伤害-1,然后令受伤害角色翻面。", + baoxue: "暴雪", + baoxue_info: + "限定技,出牌阶段,若你未翻面,你可以展示并弃置你的所有黑色牌,然后令至多X名其他角色随机弃置一张牌并将武将牌翻至背面,X为你的弃牌数;结算后你将武将牌翻至背面。", + baoxue_info_alter: + "限定技,出牌阶段,你可以展示并弃置你的所有黑色牌,并选择等量其他角色将武将牌翻至背面,结算后你将武将牌翻至背面。", + bingqiang: "冰墙", + bingqiang2: "冰墙", + bingqiang2_bg: "墙", + bingqiang3: "冰墙", + bingqiang3_bg: "墙", + bingqiang4: "冰墙", + bingqiang4_bg: "墙", + bingqiang5: "冰墙", + bingqiang5_bg: "障", + bingqiang_info: + "出牌阶段,你可以弃置X张红色牌令一名角色和其相邻角色的防御离+X,或弃置X张黑色牌令一名角色和其相邻角色的进攻离-X,效果持续到你的下个回合开始。", + jidong: "急冻", + jidong_info: + "在一名角色的结束阶段,若你的体力值为1且未翻面,你可以翻面并回复2点体力,在你的武将牌翻至正面前,你防止所有伤害,也不能成为其他角色卡牌的目标。", + jidong_info_alter: "在一名角色的结束阶段,若你的体力值为1,你可以翻面并回复2点体力。", + jijia: "机甲", + jijia_info: + "锁定技,游戏开始时,你获得一个体力为4的机甲;你的手牌上限为你和机甲的体力之和;你受到的伤害由机甲承担。", + zihui: "自毁", + zihui_info: + "出牌阶段,你可以令距离2以内的所有其他角色选择一项:弃置数量等同你机甲体力值的牌,或受到2点火焰伤害,并在结算完毕后摧毁你的机甲。", + zihui_info_alter: + "出牌阶段,你可以令距离2以内的所有其他角色选择一项:1. 弃置数量等同你机甲体力值的牌(不足则全弃,至少弃1张);2. 或受到2点火焰伤害,并在结算完毕后摧毁你的机甲。", + tuijin: "推进", + tuijin2: "推进", + tuijin_info: "出牌阶段限一次,若你有机甲,你可以指定一名角色,本回合内视为与其距离为1。", + chongzhuang: "重装", + chongzhuang_info: "在你失去机甲后,当你累计造成了4点伤害时,你重新获得机甲。", + shouge: "收割", + shouge_info: "每当你杀死一名角色,你可以获得一张治疗波。", + tuji: "突击", + tuji_info: "锁定技,在你的回合内,每当你使用一张牌,你的进攻距离+1。", + mujing: "目镜", + mujing2: "目镜", + mujing_info: "你可以将一张黑色牌当作杀使用或打出;当你的杀被闪避后,此杀不计入出杀次数。", + mujing_old_info: + "每当你对攻击范围不含你的角色使用一张牌,你可以弃置目标一张牌;若你的手牌数不多于目标,你摸一张牌。", + feiren: "飞刃", + feiren2: "飞刃", + feiren_info: "你的杀无视距离;你的黑桃杀造成的伤害+1,梅花杀可以额外指定一个目标。", + feiren_info_alter: "你的杀无视距离;你的梅花杀可以额外指定一个目标。", + zhanlong: "斩龙", + zhanlong_info: + "限定技,准备阶段,若你体力值为1,你可以弃置所有牌(至少一张),然后将三张杀置入你的手牌,若如此做,你本回合使用杀无次数限制。", + xie: "谐", + xie2: "谐", + xie_info: + "出牌阶段,你可以弃置一张红桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合回复1点体力,直到你死亡。同一时间只能对一人发动。", + luan: "乱", + luan2: "乱", + luan_old_info: + "出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合失去1点体力,直到你死亡。同一时间只能对一人发动。", + luan_info: + "出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色受到伤害后失去1点体力,直到你死亡或其首次进入濒死状态。同一时间只能对一人发动。", + sheng: "圣", + sheng_info: + "限定技,出牌阶段,你可以将你的武将牌翻面,然后令任意名角色回复1点体力,若如此做,你不能成为其他角色的卡牌目标直到下一回合开始。", + xiandan: "霰弹", + xiandan_info: + "每当你使用一张杀,你可以弃置一张红色牌令此杀不可闪避,或弃置一张黑色牌令此杀伤害+1。", + yihun: "移魂", + yihun_info: + "结束阶段,你可以弃置一张黑色牌并指定一名其他角色,你在该角色下一准备阶段视为对其使用一张杀;在此之前,你不能使用卡牌,也不能成为卡牌的目标。", + feidan: "飞弹", + feidan_info: + "你的杀只能对距离1以外的角色使用;每当你使用杀造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成1点伤害。", + huoyu: "火雨", + huoyu_info: "限定技,出牌阶段,你可以弃置两张红色牌,视为使用两张炽羽袭。", + yuedong: "乐动", + yuedong_info: "出牌阶段结束时,你可以令一名角色摸一张牌。", + kuoyin: "扩音", + kuoyin_info: + "出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3,或弃置两张牌令本回合乐动的摸牌量改为2。", + kuoyin_info_alter: "出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3。", + huhuan: "互换", + huhuan_info: "出牌阶段,你可以弃置两张牌令本回合乐动的摸牌效果改为回复等量体力。", + guangshu: "光枢", + guangshu_heart: "光盾", + guangshu_spade: "光塔", + guangshu_club: "光井", + guangshu_diamond: "光流", + guangshu_info: + "出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复1点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用杀直到下一回合结束;♠该角色于下个结束阶段受到1点无来源的雷电伤害。", + ziyu: "自愈", + ziyu_info: "在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔四回合发动一次。", + ziyu_info_alter: "在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔六回合发动一次。", + shouhu: "守护", + shouhu_info: "你不能使用杀;出牌阶段,你可以弃置一张杀令一名其他角色回复1点体力。", + shanxian: "闪现", + shanxian_info: + "在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以摸一张牌并进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。", + shanxian_info_alter: + "在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。", + shanhui: "闪回", + shanhui_info: + "当你造成或受到伤害后,你可以将你的牌重置为上次发动闪现时的状态,若你的牌数因此而减少,你回复1点体力。", + ow_liekong: "猎空", + ow_sishen: "死神", + ow_tianshi: "天使", + ow_falaozhiying: "法老之鹰", + ow_zhixuzhiguang: "秩序之光", + ow_luxiao: "卢西奥", + ow_shibing: "士兵76", + ow_yuanshi: "源氏", + ow_chanyata: "禅雅塔", + ow_dva: "DVA", + ow_mei: "小美", + ow_heibaihe: "黑百合", + ow_ana: "安娜", + ow_baolei: "堡垒", + ow_maikelei: "麦克雷", + ow_banzang: "半藏", + ow_kuangshu: "狂鼠", + ow_tuobiang: "托比昂", + ow_laiyinhate: "莱因哈特", + ow_luba: "路霸", + ow_wensidun: "温斯顿", + ow_zhaliya: "查莉娅", + ow_heiying: "黑影", + ow_orisa: "奥丽莎", }, - translate:{ - woliu:'涡流', - woliu2:'涡流', - woliu_info:'结束阶段,你可以选择至多两名角色,当你或目标中的任意一名角色成为杀的目标时,其余角色也将被追加为目标,直到你死亡或下一回合开始。', - qianggu:'强固', - qianggu_info:'出牌阶段限一次,你可以弃置两张牌并获得2点护甲,若如此做,直到你的下个回合开始,其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。', - qianggu2:'强固', - qianggu2_bg:'固', - qianggu2_info:'其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。', - pingzhang:'屏障', - pingzhang_info:'每轮各限一次,当你受到伤害时,你可以弃置一张红桃牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃牌令伤害-1。', - pingzhang_info_alter:'每轮各限一次,当你受到伤害时,你可以弃置一张红桃手牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃手牌令伤害-1。', - owliyong:'力涌', - owliyong_info:'锁定技,你摸牌阶段摸牌数+X,X为你上一轮发动屏障的次数。', - dianji:'电击', - dianji_info:'出牌阶段限一次,你可以将一张手牌当作惊雷闪对距离2以内的角色使用。', - feitiao:'飞跳', - feitiao2:'飞跳', - feitiao_info:'出牌阶段开始时,你可以弃置一张牌并指定一名角色,你与该角色的距离视为1直到回合结束,然后该角色随机弃置一张牌。', - bshaowei:'哨卫', - bshaowei_info:'结束阶段,你可以切换至哨卫模式。当处于此模式时,你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀。', - zhencha:'侦查', - zhencha_info:'结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张杀,你摸一张牌或回复1点体力。', - liangou:'链钩', - liangou_info:'出牌阶段限一次,你可以弃置一张牌,指定一名其他角色并进行一次判定,若结果不为红桃,该角色与你距离为1且受到的首次伤害+1直到回合结束。', - xiyang:'吸氧', - xiyang_info:'结束阶段,若你武将牌正面朝上,你可以翻面并回复2点体力。', - qinru:'侵入', - qinru_info:'每当你使用杀指定目标时,你可以令其进行一次判定,若结果不为红桃,该角色的非锁定技失效直到其下一回合结束。', - yinshen:'隐身', - yinshen_info:'锁定技,每当你失去最后一张基本牌,你获得潜行直到下一回合开始。', - yinshen_info_old:'结束阶段,你可以弃置一张装备牌并获得潜行直到下一回合开始。', - maichong:'脉冲', - maichong_info:'锁定技,每当你使用一张普通锦囊牌,你令最近三回合内被你侵入过的角色各随机弃置一张牌。', - maichong_info_alter:'准备阶段,你可以令最近两名被你侵入的角色各随机弃置一张牌。', - lichang:'力场', - lichang2:'力场', - lichang_info:'结束阶段,你可以弃置一张红色牌,若如此做,你可以在下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌。', - mengji:'猛击', - mengji_info:'锁定技,若你已发动重盾,当你没有护甲时,你的杀造成的伤害+1。', - zhongdun:'重盾', - zhongdun_info:'游戏开始时,你获得8点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色。', - zhongdun_info_alter:'游戏开始时,你获得6点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色。', - paotai:'炮台', - paotai2:'炮台', - paotai_info:'出牌阶段,你可以弃置一张杀布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成1点火焰伤害;每当你受到1点伤害,炮台降低一级。', - maoding:'铆钉', - maoding2:'铆钉', - maoding_info:'每当你造成或受到一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲。', - maoding_info_alter:'每当你造成一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲。', - bfengshi:'风矢', - bfengshi2:'风矢', - bfengshi_info:'锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加20%的概率强制命中;你的首张杀造成伤害后增加20%的概率令伤害+1。', - bfengshi_info_alter:'锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加15%的概率强制命中;你的首张杀造成伤害后增加15%的概率令伤害+1。', - yinbo:'音波', - yinbo_info:'出牌阶段限一次,你可以弃置一张黑桃牌,然后随机弃置三名敌人各一张牌。', - liudan:'榴弹', - liudan_info:'每当你使用一张杀,你可以令所有不是此杀目标的其他角色有50%概率成为此杀的额外目标。', - shoujia:'兽夹', - shoujia2:'兽夹', - shoujia3:'兽夹', - shoujia_info:'出牌阶段限一次,你可以将一张牌背面朝上置于一名其他角色的武将牌上,当该角色使用一张与此牌花色相同的牌指定其他角色为目标时,移去此牌,该角色将武将牌翻至背面;当你受到伤害时,移去此牌。', - shihuo:'嗜火', - shihuo_info:'锁定技,每当一名角色受到火焰伤害,你摸一张牌。', - shanguang:'闪光', - shanguang_info:'出牌阶段限一次,你可以弃置一张方片牌令攻击范围内的一名其他角色本回合内不能使用或打出卡牌。', - tiandan:'填弹', - tiandan_info:'摸牌阶段开始时,你可以跳过出牌和弃牌阶段,然后获得若干张杀直到你的手牌数等于你的体值(最多为5)。', - shenqiang:'神枪', - shenqiang_info:'锁定技,每当你在出牌阶段使用杀造成伤害,本阶段内出杀次数上限+1。', - mianzhen:'眠针', - mianzhen2:'眠针', - mianzhen_info:'出牌阶段限一次,你可以弃置一张牌并令一名其他角色打出一张闪,否则该角色不能使用或打出卡牌直到其受到伤害或下一回合结束。', - aqianghua:'强化', - aqianghua2:'强化', - aqianghua_info:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色获得1点护甲且下一次造成的伤害+1。', - aqianghua_info_alter:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色下一次造成的伤害+1。', - zhiyuan:'支援', - zhiyuan_info:'每当你即将造成伤害,你可以防止此伤害,改为令目标回复等量的体力。', - juji:'狙击', - juji2:'狙击', - juji3:'狙击', - juji_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌并指定一名有手牌的其他角色,若该角色的手牌中含有与你弃置的牌花色相同的牌,则本回合内你与其距离为1且该角色不能闪避你的杀。', - duwen:'毒吻', - duwen2:'毒吻', - duwen_info:'锁定技,当你造成伤害时,若你的手牌数与受伤害角色相等,此伤害+1。', - zhuagou:'抓钩', - zhuagou_info:'出牌阶段限一次,你可以弃置一张手牌并将你的座位移到任意位置。', - dulei:'诡雷', - dulei2:'诡雷', - dulei_info:'出牌阶段,若你武将牌上没有牌,你可以将一张牌背面朝上置于你的武将牌上,当一名角色使用与该牌花色相同的牌指定你为目标时,你展示并移去此牌,然后该角色失去1点体力并随机弃置一张牌。', - shuangqiang:'霜枪', - shuangqiang_info:'每当你对一名未翻面的角色造成伤害,你可以令伤害-1,然后令受伤害角色翻面。', - baoxue:'暴雪', - baoxue_info:'限定技,出牌阶段,若你未翻面,你可以展示并弃置你的所有黑色牌,然后令至多X名其他角色随机弃置一张牌并将武将牌翻至背面,X为你的弃牌数;结算后你将武将牌翻至背面。', - baoxue_info_alter:'限定技,出牌阶段,你可以展示并弃置你的所有黑色牌,并选择等量其他角色将武将牌翻至背面,结算后你将武将牌翻至背面。', - bingqiang:'冰墙', - bingqiang2:'冰墙', - bingqiang2_bg:'墙', - bingqiang3:'冰墙', - bingqiang3_bg:'墙', - bingqiang4:'冰墙', - bingqiang4_bg:'墙', - bingqiang5:'冰墙', - bingqiang5_bg:'障', - bingqiang_info:'出牌阶段,你可以弃置X张红色牌令一名角色和其相邻角色的防御离+X,或弃置X张黑色牌令一名角色和其相邻角色的进攻离-X,效果持续到你的下个回合开始。', - jidong:'急冻', - jidong_info:'在一名角色的结束阶段,若你的体力值为1且未翻面,你可以翻面并回复2点体力,在你的武将牌翻至正面前,你防止所有伤害,也不能成为其他角色卡牌的目标。', - jidong_info_alter:'在一名角色的结束阶段,若你的体力值为1,你可以翻面并回复2点体力。', - jijia:'机甲', - jijia_info:'锁定技,游戏开始时,你获得一个体力为4的机甲;你的手牌上限为你和机甲的体力之和;你受到的伤害由机甲承担。', - zihui:'自毁', - zihui_info:'出牌阶段,你可以令距离2以内的所有其他角色选择一项:弃置数量等同你机甲体力值的牌,或受到2点火焰伤害,并在结算完毕后摧毁你的机甲。', - zihui_info_alter:'出牌阶段,你可以令距离2以内的所有其他角色选择一项:1. 弃置数量等同你机甲体力值的牌(不足则全弃,至少弃1张);2. 或受到2点火焰伤害,并在结算完毕后摧毁你的机甲。', - tuijin:'推进', - tuijin2:'推进', - tuijin_info:'出牌阶段限一次,若你有机甲,你可以指定一名角色,本回合内视为与其距离为1。', - chongzhuang:'重装', - chongzhuang_info:'在你失去机甲后,当你累计造成了4点伤害时,你重新获得机甲。', - shouge:'收割', - shouge_info:'每当你杀死一名角色,你可以获得一张治疗波。', - tuji:'突击', - tuji_info:'锁定技,在你的回合内,每当你使用一张牌,你的进攻距离+1。', - mujing:'目镜', - mujing2:'目镜', - mujing_info:'你可以将一张黑色牌当作杀使用或打出;当你的杀被闪避后,此杀不计入出杀次数。', - mujing_old_info:'每当你对攻击范围不含你的角色使用一张牌,你可以弃置目标一张牌;若你的手牌数不多于目标,你摸一张牌。', - feiren:'飞刃', - feiren2:'飞刃', - feiren_info:'你的杀无视距离;你的黑桃杀造成的伤害+1,梅花杀可以额外指定一个目标。', - feiren_info_alter:'你的杀无视距离;你的梅花杀可以额外指定一个目标。', - zhanlong:'斩龙', - zhanlong_info:'限定技,准备阶段,若你体力值为1,你可以弃置所有牌(至少一张),然后将三张杀置入你的手牌,若如此做,你本回合使用杀无次数限制。', - xie:'谐', - xie2:'谐', - xie_info:'出牌阶段,你可以弃置一张红桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合回复1点体力,直到你死亡。同一时间只能对一人发动。', - luan:'乱', - luan2:'乱', - luan_old_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合失去1点体力,直到你死亡。同一时间只能对一人发动。', - luan_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色受到伤害后失去1点体力,直到你死亡或其首次进入濒死状态。同一时间只能对一人发动。', - sheng:'圣', - sheng_info:'限定技,出牌阶段,你可以将你的武将牌翻面,然后令任意名角色回复1点体力,若如此做,你不能成为其他角色的卡牌目标直到下一回合开始。', - xiandan:'霰弹', - xiandan_info:'每当你使用一张杀,你可以弃置一张红色牌令此杀不可闪避,或弃置一张黑色牌令此杀伤害+1。', - yihun:'移魂', - yihun_info:'结束阶段,你可以弃置一张黑色牌并指定一名其他角色,你在该角色下一准备阶段视为对其使用一张杀;在此之前,你不能使用卡牌,也不能成为卡牌的目标。', - feidan:'飞弹', - feidan_info:'你的杀只能对距离1以外的角色使用;每当你使用杀造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成1点伤害。', - huoyu:'火雨', - huoyu_info:'限定技,出牌阶段,你可以弃置两张红色牌,视为使用两张炽羽袭。', - yuedong:'乐动', - yuedong_info:'出牌阶段结束时,你可以令一名角色摸一张牌。', - kuoyin:'扩音', - kuoyin_info:'出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3,或弃置两张牌令本回合乐动的摸牌量改为2。', - kuoyin_info_alter:'出牌阶段,你可以弃置一张牌令本回合乐动的目标数改为3。', - huhuan:'互换', - huhuan_info:'出牌阶段,你可以弃置两张牌令本回合乐动的摸牌效果改为回复等量体力。', - guangshu:'光枢', - guangshu_heart:'光盾', - guangshu_spade:'光塔', - guangshu_club:'光井', - guangshu_diamond:'光流', - guangshu_info:'出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复1点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用杀直到下一回合结束;♠该角色于下个结束阶段受到1点无来源的雷电伤害。', - ziyu:'自愈', - ziyu_info:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔四回合发动一次。', - ziyu_info_alter:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔六回合发动一次。', - shouhu:'守护', - shouhu_info:'你不能使用杀;出牌阶段,你可以弃置一张杀令一名其他角色回复1点体力。', - shanxian:'闪现', - shanxian_info:'在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以摸一张牌并进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。', - shanxian_info_alter:'在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。', - shanhui:'闪回', - shanhui_info:'当你造成或受到伤害后,你可以将你的牌重置为上次发动闪现时的状态,若你的牌数因此而减少,你回复1点体力。', - ow_liekong:'猎空', - ow_sishen:'死神', - ow_tianshi:'天使', - ow_falaozhiying:'法老之鹰', - ow_zhixuzhiguang:'秩序之光', - ow_luxiao:'卢西奥', - ow_shibing:'士兵76', - ow_yuanshi:'源氏', - ow_chanyata:'禅雅塔', - ow_dva:'DVA', - ow_mei:'小美', - ow_heibaihe:'黑百合', - ow_ana:'安娜', - ow_baolei:'堡垒', - ow_maikelei:'麦克雷', - ow_banzang:'半藏', - ow_kuangshu:'狂鼠', - ow_tuobiang:'托比昂', - ow_laiyinhate:'莱因哈特', - ow_luba:'路霸', - ow_wensidun:'温斯顿', - ow_zhaliya:'查莉娅', - ow_heiying:'黑影', - ow_orisa:'奥丽莎', - } }; }); diff --git a/character/rank.js b/character/rank.js index ba8c0ab92..886204598 100644 --- a/character/rank.js +++ b/character/rank.js @@ -1,2748 +1,2748 @@ -window.noname_character_rank={ - s:[ - 'gjqt_bailitusu', - 'gjqt_beiluo', - 'gjqt_xieyi', - 'hs_malorne', - 'hs_medivh', - 'hs_sthrall', - 'pal_yuejinzhao', - 'swd_cheyun', - 'swd_duguningke', - 'swd_guyue', - 'swd_huanglei', - 'swd_murongshi', - 'swd_muyun', - 'swd_septem', - 'swd_tuobayuer', - 'swd_xuanyuanjianxian', - 'swd_yuxiaoxue', - 'swd_zhaoyun', - 'key_shiki', - 'shen_zhaoyun', - 'shen_ganning', - 're_liuzan', - 'chunyuqiong', - 'yangbiao', - 'dc_zhaoxiang', - 'sp_xiahoushi', - 'ns_zhangwei', - 'wanglang', - 'caojinyu', - 'zhangmancheng', - 'wu_zhugeliang', - 'sunlingluan', - 'wu_luxun', - 'key_mio', - 'key_midori', - 'key_yuri', - 'key_yui', - 'key_lucia', - 'db_key_hina', - 'sp_key_kanade', - 'key_shizuru', - 'key_sakuya', - 'boss_zhaoyun', - 'noname', - 'sb_machao', - 'dc_zhouxuān', - 'key_iriya', - 'dc_zhaoyun', +window.noname_character_rank = { + s: [ + "gjqt_bailitusu", + "gjqt_beiluo", + "gjqt_xieyi", + "hs_malorne", + "hs_medivh", + "hs_sthrall", + "pal_yuejinzhao", + "swd_cheyun", + "swd_duguningke", + "swd_guyue", + "swd_huanglei", + "swd_murongshi", + "swd_muyun", + "swd_septem", + "swd_tuobayuer", + "swd_xuanyuanjianxian", + "swd_yuxiaoxue", + "swd_zhaoyun", + "key_shiki", + "shen_zhaoyun", + "shen_ganning", + "re_liuzan", + "chunyuqiong", + "yangbiao", + "dc_zhaoxiang", + "sp_xiahoushi", + "ns_zhangwei", + "wanglang", + "caojinyu", + "zhangmancheng", + "wu_zhugeliang", + "sunlingluan", + "wu_luxun", + "key_mio", + "key_midori", + "key_yuri", + "key_yui", + "key_lucia", + "db_key_hina", + "sp_key_kanade", + "key_shizuru", + "key_sakuya", + "boss_zhaoyun", + "noname", + "sb_machao", + "dc_zhouxuān", + "key_iriya", + "dc_zhaoyun", ], - ap:[ - 'xia_guanyu', - 'ol_sb_yuanshao', - 'gjqt_aruan', - 'gjqt_cenying', - 'gjqt_ouyangshaogong', - 'gjqt_yunwuyue', - 'gw_diandian', - 'gw_yioufeisisp', - 'hs_alakir', - 'hs_ashamoer', - 'hs_aya', - 'hs_hajiasha', - 'hs_malygos', - 'hs_neptulon', - 'hs_tyrande', - 'hs_xsylvanas', - 'ns_nanhua', - 'ow_ana', - 'ow_dva', - 'ow_liekong', - 'ow_luxiao', - 'ow_mei', - 'ow_yuanshi', - 'pal_liumengli', - 'pal_lixiaoyao', - 'pal_murongziying', - 'pal_xiahoujinxuan', - 'pal_xuanxiao', - 'pal_yueqi', - 'pal_yuntianhe', - 'pal_zixuan', - 'swd_huanyuanzhi', - 'swd_huiyan', - 'swd_jiliang', - 'swd_jipeng', - 'swd_muyue', - 'swd_qi', - 'swd_shuijing', - 'swd_shuwaner', - 'swd_tuwei', - 'swd_yuwentuo', - 'xuyou', - 'xushi', - 'zhangrang', - 'shen_guanyu', - 'shen_caocao', - 'shen_caopi', - 'majun', - 'jiakui', - 'guozhao', - 'ol_yuanshao', - 'caoying', - 'simahui', - 'guansuo', - 'yuantanyuanshang', - 'dongyun', - 're_sunyi', - 'shen_xunyu', - 'shen_guojia', - 'yangyan', - 'liuhui', - 'luyi', - 'shen_zhangfei', - 'clan_xuncai', - 'zhujianping', - 'liuzhang', - 'ol_wanglang', - 'key_kamome', - 'key_yukine', - 'key_inari', - 'key_shiina', - 'key_kud', - 'key_yukito', - 'key_yuuki', - 'db_key_liyingxia', - 'key_kiyu', - 'jsrg_pangtong', - 'star_dongzhuo', - 'clan_xunyou', - 'caoxian', - 'sb_guanyu', - 'mb_chengui', - 'jsrg_guozhao', - 'sb_caopi', - 'xia_yuzhenzi', - 'dc_simashi', - 'dc_sb_simayi', - 'caofang', - 'dc_shen_huatuo', - 'sp_zhenji', - 'wu_guanyu', + ap: [ + "xia_guanyu", + "ol_sb_yuanshao", + "gjqt_aruan", + "gjqt_cenying", + "gjqt_ouyangshaogong", + "gjqt_yunwuyue", + "gw_diandian", + "gw_yioufeisisp", + "hs_alakir", + "hs_ashamoer", + "hs_aya", + "hs_hajiasha", + "hs_malygos", + "hs_neptulon", + "hs_tyrande", + "hs_xsylvanas", + "ns_nanhua", + "ow_ana", + "ow_dva", + "ow_liekong", + "ow_luxiao", + "ow_mei", + "ow_yuanshi", + "pal_liumengli", + "pal_lixiaoyao", + "pal_murongziying", + "pal_xiahoujinxuan", + "pal_xuanxiao", + "pal_yueqi", + "pal_yuntianhe", + "pal_zixuan", + "swd_huanyuanzhi", + "swd_huiyan", + "swd_jiliang", + "swd_jipeng", + "swd_muyue", + "swd_qi", + "swd_shuijing", + "swd_shuwaner", + "swd_tuwei", + "swd_yuwentuo", + "xuyou", + "xushi", + "zhangrang", + "shen_guanyu", + "shen_caocao", + "shen_caopi", + "majun", + "jiakui", + "guozhao", + "ol_yuanshao", + "caoying", + "simahui", + "guansuo", + "yuantanyuanshang", + "dongyun", + "re_sunyi", + "shen_xunyu", + "shen_guojia", + "yangyan", + "liuhui", + "luyi", + "shen_zhangfei", + "clan_xuncai", + "zhujianping", + "liuzhang", + "ol_wanglang", + "key_kamome", + "key_yukine", + "key_inari", + "key_shiina", + "key_kud", + "key_yukito", + "key_yuuki", + "db_key_liyingxia", + "key_kiyu", + "jsrg_pangtong", + "star_dongzhuo", + "clan_xunyou", + "caoxian", + "sb_guanyu", + "mb_chengui", + "jsrg_guozhao", + "sb_caopi", + "xia_yuzhenzi", + "dc_simashi", + "dc_sb_simayi", + "caofang", + "dc_shen_huatuo", + "sp_zhenji", + "wu_guanyu", ], - a:[ - 'star_caoren', - 'star_yuanshao', - 'xia_shitao', - 'diy_zaozhirenjun', - 'gjqt_fanglansheng', - 'gjqt_fengqingxue', - 'gjqt_xiayize', - 'gw_aigeleisi', - 'gw_aimin', - 'gw_airuiting', - 'gw_aisinie', - 'gw_bulanwang', - 'gw_dagong', - 'gw_enxier', - 'gw_falanxisika', - 'gw_fulisi', - 'gw_gaier', - 'gw_haluo', - 'gw_jieluote', - 'gw_kairuisi', - 'gw_kanbi', - 'gw_kaxier', - 'gw_linjing', - 'gw_luobo', - 'gw_luoqi', - 'gw_meizi', - 'gw_nvyemo', - 'gw_puxila', - 'gw_shasixiwusi', - 'gw_telisi', - 'gw_xili', - 'gw_yenaifa', - 'gw_yioufeisi', - 'gw_yisilinni', - 'gw_zhangyujushou', - 'hs_alleria', - 'hs_amala', - 'hs_anduin', - 'hs_antonidas', - 'hs_bannabusi', - 'hs_bchillmaw', - 'hs_enzoth', - 'hs_fandral', - 'hs_fuding', - 'hs_heifengqishi', - 'hs_jaina', - 'hs_kaituozhe', - 'hs_kalimosi', - 'hs_khadgar', - 'hs_lafamu', - 'hs_laila', - 'hs_laxiao', - 'hs_lrhonin', - 'hs_manyututeng', - 'hs_morgl', - 'hs_pengpeng', - 'hs_sainaliusi', - 'hs_sapphiron', - 'hs_shanlingjuren', - 'hs_siwangxianzhi', - 'hs_trueheart', - 'hs_tuoqi', - 'hs_walian', - 'hs_xialikeer', - 'hs_xukongzhiying', - 'hs_yashaji', - 'hs_yelinlonghou', - 'hs_yinggencao', - 'hs_yngvar', - 'hs_ysera', - 'hs_zhanzhenggushu', - 'hs_zhihuanhua', - 'hs_zhishigushu', - 'mtg_jiding', - 'mtg_jiesi', - 'mtg_lilianna', - 'ns_caocao', - 'ns_caocaosp', - 'ns_guanlu', - 'ns_jinke', - 'ns_lvmeng', - 'ns_simazhao', - 'ns_wangyun', - 'ns_yanliang', - 'ow_banzang', - 'ow_chanyata', - 'ow_heiying', - 'ow_laiyinhate', - 'ow_maikelei', - 'ow_tianshi', - 'ow_tuobiang', - 'ow_zhaliya', - 'pal_jingtian', - 'pal_longkui', - 'pal_luozhaoyan', - 'pal_mingxiu', - 'pal_muchanglan', - 'pal_nangonghuang', - 'pal_tangyurou', - 'pal_wangpengxu', - 'pal_xia', - 'pal_xingxuan', - 'swd_anka', - 'swd_chenjingchou', - 'swd_hengai', - 'swd_huzhongxian', - 'swd_kangnalishi', - 'swd_kendi', - 'swd_lanyin', - 'swd_shanxiaoxiao', - 'swd_sikongyu', - 'swd_wangsiyue', - 'swd_xiarou', - 'swd_ziqiao', - 'yxs_caocao', - 'yxs_diaochan', - 'yxs_guiguzi', - 'yxs_luobinhan', - 'yxs_luzhishen', - 'yxs_wuzetian', - 'yxs_yangyuhuan', - 'zhangxiu', - 'liuyan', - 'xin_masu', - 'zhugezhan', - 'key_kagari', - 'shen_luxun', - 'shen_zhugeliang', - 'wenyang', - 'huaman', - 'puyuan', - 'lijue', - 'zhangchangpu', - 'zhangqiying', - 'wangyuanji', - 'miheng', - 're_guojia', - 're_sunquan', - 're_zhangjiao', - 're_zuoci', - 'sunhao', - 'shixie', - 'dc_shixie', - 'ol_zhangchangpu', - 'shamoke', - 'diy_wenyang', - 'xin_lingtong', - 'wolongfengchu', - 'yanghuiyu', - 'liubian', - 'panshu', - 'caochun', - 'xin_caifuren', - 'ol_wangrong', - 're_nanhualaoxian', - 'fuqian', - 'liuyong', - 'dc_liuli', - 'sunhanhua', - 're_pangdegong', - 're_fengfangnv', - 'caomao', - 'guanning', - 'ol_puyuan', - 'ns_limi', - 'jin_zhouchu', - 'huojun', - 'xiahouxuan', - 'ol_liuba', - 'wanglie', - 'zhaozhi', - 'shen_zhangjiao', - 'junk_zhangjiao', - 'tw_jiangji', - 'tw_niufudongxie', - 'tw_shen_lvmeng', - 'dc_tengfanglan', - 'xia_lusu', - 'zhanghua', - 'zerong', - 'wangguan', - 'duanqiaoxiao', - 'old_wanglang', - 'shichangshi', - 'ol_wenqin', - 'clan_zhonghui', - 'jsrg_chunyuqiong', - 'jsrg_guanyu', - 'dc_caocao', - 'dc_liubei', - 'dc_sunquan', - 'yuechen', - 'sunli', - 'dc_zhangmancheng', - 'jsrg_guojia', - 'jsrg_lougui', - 'jsrg_zhangfei', - 'jsrg_fanjiangzhangda', - 'jsrg_hansui', - 'jsrg_zhangren', - 'key_misuzu', - 'key_sunohara', - 'key_umi', - 'key_tsumugi', - 'key_saya', - 'key_hisako', - 'key_ao', - 'key_yuzuru', - 'key_kyoko', - 'key_jojiro', - 'key_shiroha', - 'key_shiori', - 'key_iwasawa', - 'key_hiroto', - 'key_nao', - 'key_kotarou', - 'key_kyou', - 'key_tomoyo', - 'star_yuanshu', - 'jiangji', - 'tianshangyi', - 'malingli', - 'caoyi', - 'sb_sp_zhugeliang', - 'sb_zhugeliang', - 'ol_jianyong', - 'ol_sb_jiangwei', - 'dc_sb_zhouyu', - 'dc_lingcao', - 'jsrg_zhugeliang', - 'shen_lusu', - 'huzun', - 'star_zhangchunhua', - 'mb_caomao', - 'drag_guanyu', - 'drag_caoren', - 'drag_lvchang', + a: [ + "star_caoren", + "star_yuanshao", + "xia_shitao", + "diy_zaozhirenjun", + "gjqt_fanglansheng", + "gjqt_fengqingxue", + "gjqt_xiayize", + "gw_aigeleisi", + "gw_aimin", + "gw_airuiting", + "gw_aisinie", + "gw_bulanwang", + "gw_dagong", + "gw_enxier", + "gw_falanxisika", + "gw_fulisi", + "gw_gaier", + "gw_haluo", + "gw_jieluote", + "gw_kairuisi", + "gw_kanbi", + "gw_kaxier", + "gw_linjing", + "gw_luobo", + "gw_luoqi", + "gw_meizi", + "gw_nvyemo", + "gw_puxila", + "gw_shasixiwusi", + "gw_telisi", + "gw_xili", + "gw_yenaifa", + "gw_yioufeisi", + "gw_yisilinni", + "gw_zhangyujushou", + "hs_alleria", + "hs_amala", + "hs_anduin", + "hs_antonidas", + "hs_bannabusi", + "hs_bchillmaw", + "hs_enzoth", + "hs_fandral", + "hs_fuding", + "hs_heifengqishi", + "hs_jaina", + "hs_kaituozhe", + "hs_kalimosi", + "hs_khadgar", + "hs_lafamu", + "hs_laila", + "hs_laxiao", + "hs_lrhonin", + "hs_manyututeng", + "hs_morgl", + "hs_pengpeng", + "hs_sainaliusi", + "hs_sapphiron", + "hs_shanlingjuren", + "hs_siwangxianzhi", + "hs_trueheart", + "hs_tuoqi", + "hs_walian", + "hs_xialikeer", + "hs_xukongzhiying", + "hs_yashaji", + "hs_yelinlonghou", + "hs_yinggencao", + "hs_yngvar", + "hs_ysera", + "hs_zhanzhenggushu", + "hs_zhihuanhua", + "hs_zhishigushu", + "mtg_jiding", + "mtg_jiesi", + "mtg_lilianna", + "ns_caocao", + "ns_caocaosp", + "ns_guanlu", + "ns_jinke", + "ns_lvmeng", + "ns_simazhao", + "ns_wangyun", + "ns_yanliang", + "ow_banzang", + "ow_chanyata", + "ow_heiying", + "ow_laiyinhate", + "ow_maikelei", + "ow_tianshi", + "ow_tuobiang", + "ow_zhaliya", + "pal_jingtian", + "pal_longkui", + "pal_luozhaoyan", + "pal_mingxiu", + "pal_muchanglan", + "pal_nangonghuang", + "pal_tangyurou", + "pal_wangpengxu", + "pal_xia", + "pal_xingxuan", + "swd_anka", + "swd_chenjingchou", + "swd_hengai", + "swd_huzhongxian", + "swd_kangnalishi", + "swd_kendi", + "swd_lanyin", + "swd_shanxiaoxiao", + "swd_sikongyu", + "swd_wangsiyue", + "swd_xiarou", + "swd_ziqiao", + "yxs_caocao", + "yxs_diaochan", + "yxs_guiguzi", + "yxs_luobinhan", + "yxs_luzhishen", + "yxs_wuzetian", + "yxs_yangyuhuan", + "zhangxiu", + "liuyan", + "xin_masu", + "zhugezhan", + "key_kagari", + "shen_luxun", + "shen_zhugeliang", + "wenyang", + "huaman", + "puyuan", + "lijue", + "zhangchangpu", + "zhangqiying", + "wangyuanji", + "miheng", + "re_guojia", + "re_sunquan", + "re_zhangjiao", + "re_zuoci", + "sunhao", + "shixie", + "dc_shixie", + "ol_zhangchangpu", + "shamoke", + "diy_wenyang", + "xin_lingtong", + "wolongfengchu", + "yanghuiyu", + "liubian", + "panshu", + "caochun", + "xin_caifuren", + "ol_wangrong", + "re_nanhualaoxian", + "fuqian", + "liuyong", + "dc_liuli", + "sunhanhua", + "re_pangdegong", + "re_fengfangnv", + "caomao", + "guanning", + "ol_puyuan", + "ns_limi", + "jin_zhouchu", + "huojun", + "xiahouxuan", + "ol_liuba", + "wanglie", + "zhaozhi", + "shen_zhangjiao", + "junk_zhangjiao", + "tw_jiangji", + "tw_niufudongxie", + "tw_shen_lvmeng", + "dc_tengfanglan", + "xia_lusu", + "zhanghua", + "zerong", + "wangguan", + "duanqiaoxiao", + "old_wanglang", + "shichangshi", + "ol_wenqin", + "clan_zhonghui", + "jsrg_chunyuqiong", + "jsrg_guanyu", + "dc_caocao", + "dc_liubei", + "dc_sunquan", + "yuechen", + "sunli", + "dc_zhangmancheng", + "jsrg_guojia", + "jsrg_lougui", + "jsrg_zhangfei", + "jsrg_fanjiangzhangda", + "jsrg_hansui", + "jsrg_zhangren", + "key_misuzu", + "key_sunohara", + "key_umi", + "key_tsumugi", + "key_saya", + "key_hisako", + "key_ao", + "key_yuzuru", + "key_kyoko", + "key_jojiro", + "key_shiroha", + "key_shiori", + "key_iwasawa", + "key_hiroto", + "key_nao", + "key_kotarou", + "key_kyou", + "key_tomoyo", + "star_yuanshu", + "jiangji", + "tianshangyi", + "malingli", + "caoyi", + "sb_sp_zhugeliang", + "sb_zhugeliang", + "ol_jianyong", + "ol_sb_jiangwei", + "dc_sb_zhouyu", + "dc_lingcao", + "jsrg_zhugeliang", + "shen_lusu", + "huzun", + "star_zhangchunhua", + "mb_caomao", + "drag_guanyu", + "drag_caoren", + "drag_lvchang", ], - am:[ - 'tw_yanliang', - 'tw_wenchou', - 'tw_yuantan', - 'bailingyun', - 'clan_wuqiao', - 'muludawang', - 'diy_caiwenji', - 'diy_liuyan', - 'diy_zhenji', - 'diy_zhouyu', - 'gjqt_chuqi', - 'gjqt_xiangling', - 'gjqt_xunfang', - 'gjqt_yanjiaxieyi', - 'gjqt_yuewuyi', - 'gw_bierna', - 'gw_fenghuang', - 'gw_fuertaisite', - 'gw_gaier', - 'gw_haizhiyezhu', - 'gw_hengsaite', - 'gw_huoge', - 'gw_kaerweite', - 'gw_kuite', - 'gw_laduoweide', - 'gw_lanbote', - 'gw_laomaotou', - 'gw_mieren', - 'gw_nitelila', - 'gw_oudimu', - 'gw_sanhanya', - 'gw_saqiya', - 'gw_shanhu', - 'gw_xigedelifa', - 'gw_zhuoertan', - 'hs_aedwin', - 'hs_aiqinvyao', - 'hs_alextrasza', - 'hs_barnes', - 'hs_bilanyoulong', - 'hs_blingtron', - 'hs_bolvar', - 'hs_brann', - 'hs_fachaotuteng', - 'hs_jiaziruila', - 'hs_kazhakusi', - 'hs_kchromaggus', - 'hs_kcthun', - 'hs_magni', - 'hs_mijiaojisi', - 'hs_mojinbaozi', - 'hs_pyros', - 'hs_ronghejuren', - 'hs_shaku', - 'hs_shizugui', - 'hs_shuiwenxuejia', - 'hs_siwangzhiyi', - 'hs_taisi', - 'hs_totemic', - 'hs_wujiyuansu', - 'hs_wvelen', - 'hs_yangyanwageli', - 'hs_yogg', - 'ns_duangui', - 'ns_huangzu', - 'ns_masu', - 'ns_shenpei', - 'ns_sunjian', - 'ns_xinxianying', - 'ns_yuji', - 'ns_yujisp', - 'ns_zhangxiu', - 'ns_zuoci', - 'ow_baolei', - 'ow_falaozhiying', - 'ow_kuangshu', - 'ow_orisa', - 'ow_shibing', - 'ow_wensidun', - 'ow_zhixuzhiguang', - 'pal_anu', - 'pal_changqing', - 'pal_hanlingsha', - 'pal_jushifang', - 'pal_wenhui', - 'pal_xianqing', - 'pal_xuejian', - 'pal_zhaoliner', - 'swd_duanmeng', - 'swd_duopeng', - 'swd_fengyu', - 'swd_fuyan', - 'swd_jiuyou', - 'swd_kama', - 'swd_linyue', - 'swd_maixing', - 'swd_nicole', - 'swd_rongshuang', - 'swd_weida', - 'swd_xiaohuanglong', - 'swd_xiyan', - 'swd_xuanyuanjiantong', - 'swd_yeyaxi', - 'swd_yuchiyanhong', - 'swd_yuli', - 'yxs_direnjie', - 'yxs_huamulan', - 'yxs_libai', - 'yxs_luban', - 'yxs_nandinggeer', - 'yxs_napolun', - 'yxs_sunwu', - 'yxs_wangzhaojun', - 'yxs_xiangyu', - 'yxs_yangguang', - 'yxs_yingzheng', - 'yxs_zhangsanfeng', - 're_yuanshu', - 'guojia', - 'caopi', - 're_yuanshao', - 'wangping', - 'luji', - 'haozhao', - 'lukang', - 'lvdai', - 'zhoufang', - 'zhuzhi', - 're_zhuzhi', - 'guohuai', - 'caorui', - 'liuyu', - 'qinmi', - 'shen_diaochan', - 'shen_zhenji', - 'shen_simayi', - 'xushao', - 'tw_yujin', - 'xurong', - 'beimihu', - 'guanlu', - 'gexuan', - 're_xusheng', - 'pangdegong', - 'sp_sufei', - 'xin_zhuran', - 're_zhanggong', - 'zhengxuan', - 're_sunshangxiang', - 're_lvbu', - 'caoren', - 'ol_xiahouyuan', - 're_huangzhong', - 'ol_huangzhong', - 'ol_weiyan', - 'zhoutai', - 're_xunyu', - 'yujin_yujin', - 're_bulianshi', - 're_zhonghui', - 're_zhuran', - 're_wuyi', - 'zhangbao', - 'maliang', - 'zhugedan', - 'chenlin', - 'xizhicai', - 'luzhi', - 'huangfusong', - 'sp_pangtong', - 'ns_jiaxu', - 'old_jiakui', - 'jin_simayi', - 'jin_simashi', - 'jin_wangyuanji', - 'duyu', - 'yj_ganning', - 'key_kyousuke', - 'key_yusa', - 'key_misa', - 'key_masato', - 'key_harukakanata', - 'key_rin', - 'key_yuiko', - 'key_nagisa', - 'key_godan', - 'key_yuu', - 'sp_key_yuri', - 'key_kotomi', - 'tw_beimihu', - 'ns_caoshuang', - 'key_shizuku', - 'wangrong', - 're_fazheng', - 'tw_re_fazheng', - 'huaxin', - 're_chunyuqiong', - 'ns_luyusheng', - 'sp_chenzhen', - 'sp_wangcan', - 'caosong', - 'sp_duyu', - 'xiahoujie', - 'ns_huangwudie', - 'ns_chentai', - 'ns_yanghu', - 'ns_zhangning', - 'huangchengyan', - 'lvlingqi', - 'zhongyan', - 'wangling', - 'zhouchu', - 'yangwan', - 're_dongcheng', - 'ol_yujin', - 'ol_huaxin', - 'qiaozhou', - 're_xunchen', - 'sp_cuiyan', - 'ol_dongzhao', - 'xin_jushou', - 'sp_zhujun', - 're_guohuanghou', - 'tw_liuhong', - 're_zhangbao', - 're_dengzhi', - 'sp_jianggan', - 'tw_caozhao', - 'tw_guohuai', - 'shen_jiangwei', - 'dc_luotong', - 'dc_huangchengyan', - 'tengfanglan', - 'tenggongzhu', - 'sp_menghuo', - 'dc_sp_menghuo', - 'dc_qinghegongzhu', - 'ruiji', - 're_liuchen', - 'dc_gongsunzan', - 'ol_xunyu', - 'zhangxuan', - 'tw_shenguanyu', - 'dc_sunru', - 'dc_wangchang', - 'fengfang', - 'prp_zhugeliang', - 'dukui', - 'quanhuijie', - 'yinfuren', - 'dc_zhaoyǎn', - 'clan_wuxian', - 'clan_xunchen', - 'chenjiao', - 'chengbing', - 'sb_caosong', - 'guyong', - 'tw_jiangqing', - 'tw_liuzhang', - 'tw_wangling', - 'tw_zhangji', - 'tw_liyàn', - 'xuelingyun', - 'dc_zhaotongzhaoguang', - 'mengjie', - 'yj_qiaozhou', - 'yj_sufei', - 'dc_ruiji', - 'yuantanyuanxiyuanshang', - 'yanghong', - 'dc_sunhanhua', - 'shen_dianwei', - 'zhoubuyi', - 'jsrg_sunce', - 're_caorui', - 'ol_zhouqun', - 'caoxi', - 'zhaoxiang', - 'chenshi', - 'xiahoumao', - 'dc_xujing', - 'le_shen_jiaxu', - 'jsrg_xiahourong', - 'jsrg_sunshangxiang', - 'jsrg_machao', - 'sunyu', - 're_caorui', - 're_zhugedan', - 'tw_yanxiang', - 'yanxiang', - 'nezha', - 'dc_jiachong', - 'pangshanmin', - 'kuaiqi', - 'shen_huatuo', - 'dc_guansuo', - 'dc_dongzhao', - 'zhugeruoxue', - 'zhugemengxue', - 'dc_sb_lusu', - 'mb_huban', - 'jsrg_simayi', - 'jsrg_zhaoyun', - 'jsrg_zhangxuan', - 'sb_xunyu', - 'ol_sb_taishici', - 'tianchou', - 'ol_sb_guanyu', - 'gongsunxiu', - 'dc_caoshuang', - 'clan_wangling', - 'clan_wangguang', - 'lizhaojiaobo', + am: [ + "tw_yanliang", + "tw_wenchou", + "tw_yuantan", + "bailingyun", + "clan_wuqiao", + "muludawang", + "diy_caiwenji", + "diy_liuyan", + "diy_zhenji", + "diy_zhouyu", + "gjqt_chuqi", + "gjqt_xiangling", + "gjqt_xunfang", + "gjqt_yanjiaxieyi", + "gjqt_yuewuyi", + "gw_bierna", + "gw_fenghuang", + "gw_fuertaisite", + "gw_gaier", + "gw_haizhiyezhu", + "gw_hengsaite", + "gw_huoge", + "gw_kaerweite", + "gw_kuite", + "gw_laduoweide", + "gw_lanbote", + "gw_laomaotou", + "gw_mieren", + "gw_nitelila", + "gw_oudimu", + "gw_sanhanya", + "gw_saqiya", + "gw_shanhu", + "gw_xigedelifa", + "gw_zhuoertan", + "hs_aedwin", + "hs_aiqinvyao", + "hs_alextrasza", + "hs_barnes", + "hs_bilanyoulong", + "hs_blingtron", + "hs_bolvar", + "hs_brann", + "hs_fachaotuteng", + "hs_jiaziruila", + "hs_kazhakusi", + "hs_kchromaggus", + "hs_kcthun", + "hs_magni", + "hs_mijiaojisi", + "hs_mojinbaozi", + "hs_pyros", + "hs_ronghejuren", + "hs_shaku", + "hs_shizugui", + "hs_shuiwenxuejia", + "hs_siwangzhiyi", + "hs_taisi", + "hs_totemic", + "hs_wujiyuansu", + "hs_wvelen", + "hs_yangyanwageli", + "hs_yogg", + "ns_duangui", + "ns_huangzu", + "ns_masu", + "ns_shenpei", + "ns_sunjian", + "ns_xinxianying", + "ns_yuji", + "ns_yujisp", + "ns_zhangxiu", + "ns_zuoci", + "ow_baolei", + "ow_falaozhiying", + "ow_kuangshu", + "ow_orisa", + "ow_shibing", + "ow_wensidun", + "ow_zhixuzhiguang", + "pal_anu", + "pal_changqing", + "pal_hanlingsha", + "pal_jushifang", + "pal_wenhui", + "pal_xianqing", + "pal_xuejian", + "pal_zhaoliner", + "swd_duanmeng", + "swd_duopeng", + "swd_fengyu", + "swd_fuyan", + "swd_jiuyou", + "swd_kama", + "swd_linyue", + "swd_maixing", + "swd_nicole", + "swd_rongshuang", + "swd_weida", + "swd_xiaohuanglong", + "swd_xiyan", + "swd_xuanyuanjiantong", + "swd_yeyaxi", + "swd_yuchiyanhong", + "swd_yuli", + "yxs_direnjie", + "yxs_huamulan", + "yxs_libai", + "yxs_luban", + "yxs_nandinggeer", + "yxs_napolun", + "yxs_sunwu", + "yxs_wangzhaojun", + "yxs_xiangyu", + "yxs_yangguang", + "yxs_yingzheng", + "yxs_zhangsanfeng", + "re_yuanshu", + "guojia", + "caopi", + "re_yuanshao", + "wangping", + "luji", + "haozhao", + "lukang", + "lvdai", + "zhoufang", + "zhuzhi", + "re_zhuzhi", + "guohuai", + "caorui", + "liuyu", + "qinmi", + "shen_diaochan", + "shen_zhenji", + "shen_simayi", + "xushao", + "tw_yujin", + "xurong", + "beimihu", + "guanlu", + "gexuan", + "re_xusheng", + "pangdegong", + "sp_sufei", + "xin_zhuran", + "re_zhanggong", + "zhengxuan", + "re_sunshangxiang", + "re_lvbu", + "caoren", + "ol_xiahouyuan", + "re_huangzhong", + "ol_huangzhong", + "ol_weiyan", + "zhoutai", + "re_xunyu", + "yujin_yujin", + "re_bulianshi", + "re_zhonghui", + "re_zhuran", + "re_wuyi", + "zhangbao", + "maliang", + "zhugedan", + "chenlin", + "xizhicai", + "luzhi", + "huangfusong", + "sp_pangtong", + "ns_jiaxu", + "old_jiakui", + "jin_simayi", + "jin_simashi", + "jin_wangyuanji", + "duyu", + "yj_ganning", + "key_kyousuke", + "key_yusa", + "key_misa", + "key_masato", + "key_harukakanata", + "key_rin", + "key_yuiko", + "key_nagisa", + "key_godan", + "key_yuu", + "sp_key_yuri", + "key_kotomi", + "tw_beimihu", + "ns_caoshuang", + "key_shizuku", + "wangrong", + "re_fazheng", + "tw_re_fazheng", + "huaxin", + "re_chunyuqiong", + "ns_luyusheng", + "sp_chenzhen", + "sp_wangcan", + "caosong", + "sp_duyu", + "xiahoujie", + "ns_huangwudie", + "ns_chentai", + "ns_yanghu", + "ns_zhangning", + "huangchengyan", + "lvlingqi", + "zhongyan", + "wangling", + "zhouchu", + "yangwan", + "re_dongcheng", + "ol_yujin", + "ol_huaxin", + "qiaozhou", + "re_xunchen", + "sp_cuiyan", + "ol_dongzhao", + "xin_jushou", + "sp_zhujun", + "re_guohuanghou", + "tw_liuhong", + "re_zhangbao", + "re_dengzhi", + "sp_jianggan", + "tw_caozhao", + "tw_guohuai", + "shen_jiangwei", + "dc_luotong", + "dc_huangchengyan", + "tengfanglan", + "tenggongzhu", + "sp_menghuo", + "dc_sp_menghuo", + "dc_qinghegongzhu", + "ruiji", + "re_liuchen", + "dc_gongsunzan", + "ol_xunyu", + "zhangxuan", + "tw_shenguanyu", + "dc_sunru", + "dc_wangchang", + "fengfang", + "prp_zhugeliang", + "dukui", + "quanhuijie", + "yinfuren", + "dc_zhaoyǎn", + "clan_wuxian", + "clan_xunchen", + "chenjiao", + "chengbing", + "sb_caosong", + "guyong", + "tw_jiangqing", + "tw_liuzhang", + "tw_wangling", + "tw_zhangji", + "tw_liyàn", + "xuelingyun", + "dc_zhaotongzhaoguang", + "mengjie", + "yj_qiaozhou", + "yj_sufei", + "dc_ruiji", + "yuantanyuanxiyuanshang", + "yanghong", + "dc_sunhanhua", + "shen_dianwei", + "zhoubuyi", + "jsrg_sunce", + "re_caorui", + "ol_zhouqun", + "caoxi", + "zhaoxiang", + "chenshi", + "xiahoumao", + "dc_xujing", + "le_shen_jiaxu", + "jsrg_xiahourong", + "jsrg_sunshangxiang", + "jsrg_machao", + "sunyu", + "re_caorui", + "re_zhugedan", + "tw_yanxiang", + "yanxiang", + "nezha", + "dc_jiachong", + "pangshanmin", + "kuaiqi", + "shen_huatuo", + "dc_guansuo", + "dc_dongzhao", + "zhugeruoxue", + "zhugemengxue", + "dc_sb_lusu", + "mb_huban", + "jsrg_simayi", + "jsrg_zhaoyun", + "jsrg_zhangxuan", + "sb_xunyu", + "ol_sb_taishici", + "tianchou", + "ol_sb_guanyu", + "gongsunxiu", + "dc_caoshuang", + "clan_wangling", + "clan_wangguang", + "lizhaojiaobo", ], - bp:[ - 'xin_huojun', - 'chess_diaochan', - 'chess_huangzhong', - 'chess_sunshangxiang', - 'chess_taishici', - 'chess_zhangliao', - 'diy_liuzan', - 'diy_lukang', - 'diy_xuhuang', - 'diy_yangyi', - 'gjqt_hongyu', - 'gjqt_wenrenyu', - 'gjqt_yinqianshang', - 'gw_aokeweisite', - 'gw_feilafanruide', - 'gw_qigaiwang', - 'hs_anomalus', - 'hs_duyaxinshi', - 'hs_fengjianhuanfengzhe', - 'hs_finley', - 'hs_guldan', - 'hs_hallazeal', - 'hs_hemite', - 'hs_hudunren', - 'hs_huolituteng', - 'hs_jgarrosh', - 'hs_liadrin', - 'hs_loatheb', - 'hs_lreno', - 'hs_lrexxar', - 'hs_malfurion', - 'hs_nate', - 'hs_nozdormu', - 'hs_ruanniguai', - 'hs_selajin', - 'hs_shifazhe', - 'hs_tanghangu', - 'hs_tgolem', - 'hs_waleera', - 'hs_wuther', - 'hs_xuanzhuanjijia', - 'hs_xuefashi', - 'hs_yelise', - 'hs_zhouzhuo', - 'ns_huamulan', - 'ns_yangyi', - 'ns_zhangbao', - 'ns_zhugeliang', - 'ow_heibaihe', - 'ow_luba', - 'ow_sishen', - 'pal_jiangcheng', - 'pal_jiangyunfan', - 'pal_leiyuange', - 'pal_longyou', - 'pal_shenqishuang', - 'pal_sumei', - 'pal_wangxiaohu', - 'pal_xiaoman', - 'swd_chunyuheng', - 'swd_fengtianling', - 'swd_haidapang', - 'swd_hanlong', - 'swd_hupo', - 'swd_huyue', - 'swd_jiangwu', - 'swd_jiangziya', - 'swd_jiting', - 'swd_lilian', - 'swd_moye', - 'swd_qiner', - 'swd_quxian', - 'swd_shangzhang', - 'swd_shaowei', - 'swd_situqiang', - 'swd_zhiyin', - 'swd_zhuoshanzhu', - 'swd_zidashu', - 'yxs_aijiyanhou', - 'yxs_bole', - 'yxs_fuermosi', - 'yxs_jinke', - 'yxs_kaisa', - 'yxs_lanlinwang', - 'yxs_luocheng', - 'yxs_meixi', - 'yxs_mozi', - 'yxs_xiaoqiao', - 'yxs_yuefei', - 'yxs_zhaoyong', - 'yxs_zhuyuanzhang', - 'zhangliao', - 'zhenji', - 'zhugeliang', - 'sunquan', - 'daqiao', - 'diaochan', - 'liubei', - 'xf_yiji', - 'zhoufei', - 'xunyu', - 'kuailiangkuaiyue', - 'dianwei', - 're_lusu', - 'panjun', - 'ol_xinxianying', - 'liubiao', - 'zhongyao', - 'liuchen', - 'caochong', - 'liufeng', - 'zhangsong', - 'zhuhuan', - 'wuxian', - 'jikang', - 'shen_lvbu', - 'shen_liubei', - 're_maliang', - 'caobuxing', - 'caoxing', - 're_panfeng', - 'leitong', - 'sp_liuqi', - 'xf_tangzi', - 'liuzan', - 'lingcao', - 'sunyang', - 'sunru', - 'lifeng', - 'zhangyì', - 'yj_xuhuang', - 'xin_liaohua', - 'sp_sunshao', - 're_wangyun', - 're_caocao', - 're_guanyu', - 're_huanggai', - 're_liubei', - 're_zhangliao', - 're_zhugeliang', - 're_daqiao', - 're_diaochan', - 'ol_pangtong', - 'ol_pangde', - 're_zhurong', - 're_menghuo', - 're_liubiao', - 'xin_liubiao', - 're_liru', - 're_manchong', - 're_jianyong', - 're_yufan', - 're_zhangyi', - 're_sunxiu', - 'caoang', - 'sp_caoren', - 'zhugeke', - 'quyi', - 'yuanshu', - 'sp_zhaoyun', - 'zhangxingcai', - 'chengyu', - 'buzhi', - 'jsp_zhaoyun', - 'huangjinleishi', - 're_xinxianying', - 'sp_wangyuanji', - 'sp_xinxianying', - 'sp_liuxie', - 'hanfu', - 're_quyi', - 'zhanghuyuechen', - 'fanyufeng', - 'key_kengo', - 'key_riki', - 'key_hinata', - 'key_akane', - 'key_shiorimiyuki', - 'key_miki', - 'key_ryoichi', - 'key_kotori', - 'key_chihaya', - 'key_rumi', - 'nashime', - 'ns_huangchengyan', - 'ns_yuanxi', - 're_fuhuanghou', - 're_gongsunyuan', - 're_caozhen', - 'ol_lisu', - 'jin_simazhao', - 'jin_zhangchunhua', - 'xin_handang', - 'luotong', - 're_zhoucang', - 'ruanyu', - 'wujing', - 'nanhualaoxian', - 'ns_sunyi', - 'key_kyouko', - 're_guotufengji', - 'ol_jiangwei', - 'key_tenzen', - 'jsp_liubei', - 'liangxing', - 'tangji', - 'gaogan', - 'sp_xunchen', - 'duxi', - 'heyan', - 're_caifuren', - 'sp_kongrong', - 'qiaogong', - 'tw_qiaogong', - 're_guyong', - 'xin_zhonghui', - 'jiachong', - 'wuban', - 'tw_zhaoxiang', - 'ol_lusu', - 'zhangzhongjing', - 'db_wenyang', - 'dufuren', - 'yuanhuan', - 'zhouyi', - 'yangzhi', - 'wanniangongzhu', - 'sunyi', - 'sp_gaolan', - 'simafu', - 'mayuanyi', - 'fengfangnv', - 'ol_yangyi', - 'sp_zhangchangpu', - 'sp_jiangwan', - 'xinchang', - 'xin_yufan', - 'ol_yufan', - 'tw_re_caohong', - 'tw_mayunlu', - 'tw_hucheer', - 'sp_lvfan', - 'lvfan', - 'cuimao', - 'liqueguosi', - 're_chendeng', - 'wuyan', - 'wangyue', - 'xin_sunxiu', - 'sp_maojie', - 'ol_xuhuang', - 'ol_zhuling', - 'tw_zangba', - 're_miheng', - 'fengxi', - 'tw_chengpu', - 'key_satomi', - 'key_erika', - 'jin_yanghu', - 'qinghegongzhu', - 're_zhanghe', - 'wufan', - 'yanfuren', - 'tw_wangcan', - 'tw_wangchang', - 'jin_jiachong', - 'licaiwei', - 'tengyin', - 'old_yangzhi', - 'laiyinger', - 'yanrou', - 'weizi', - 'shen_machao', - 'sb_yujin', - 'sb_huangzhong', - 'dc_yanghu', - 'dc_gongsunzan', - 'caohua', - 'zhaoang', - 'ns_zhonglimu', - 'caoxiancaohua', - 'dc_liuba', - 'key_seira', - 'lukai', - 'ol_lukai', - 'niufu', - 're_liufeng', - 'huzhao', - 'guanhai', - 'zhangfen', - 'ol_dianwei', - 'wangyan', - 'chengui', - 'ol_hujinding', - 'dc_huangquan', - 'dc_huban', - 'dingshangwan', - 're_zhuhuan', - 'xin_zhuhuan', - 'dc_liuye', - 'zhugeshang', - 're_xunyou', - 'liwan', - 'ol_furong', - 'shiyi', - 'gongsundu', - 'yuanji', - 'dc_chenqun', - 'liupi', - 'ol_liupi', - 'mazhong', - 're_mazhong', - 'tw_baoxin', - 'tw_bingyuan', - 'tw_chenzhen', - 'tw_handang', - 'tw_haomeng', - 'tw_liwei', - 'tw_mateng', - 'tw_xunchen', - 'tw_zhangfei', - 'tw_zhangning', - 'xia_tongyuan', - 'xia_wangyue', - 'dc_huanghao', - 'dc_yangbiao', - 'ns_sundeng', - 'dc_huojun', - 'ol_zhangyì', - 'ol_zhujun', - 'liyan', - 're_lidian', - 'qinlang', - 'xia_dianwei', - 'xia_zhaoe', - 'zhangkai', - 'sunhong', - 'zhangjinyun', - 'dc_mengda', - 'xiaoyuehankehan', - 'zhutiexiong', - 'shen_dengai', - 'libai', - 'tw_gongsunfan', - 'yue_caiwenji', - 'yue_xiaoqiao', - 'yue_daqiao', - 'vtb_xiaole', - 'vtb_xiaojiu', - 'ol_zhangzhang', - 'ol_mengda', - 'dc_wuban', - 're_caochong', - 'jsrg_lvbu', - 'jsrg_xuyou', - 'jsrg_zhangliao', - 'jsrg_zhenji', - 'junk_xuyou', - 'sp_machao', - 'liupan', - 'mengyou', - 're_wenpin', - 'yue_zhoufei', - 'ns_mengyou', - 'zhangyan', - 'jsrg_huangzhong', - 'jsrg_zhangchu', - 'ol_dingshangwan', - 'ol_liwan', - 'chengjichengcui', - 'xin_zhangliang', - 'liwei', - 'xin_wuban', - 'ol_liuyan', - 'sunhuan', - 'yue_caiyong', - 'sb_huangyueying', - 'jsrg_jiangwei', - 'jsrg_luxun', - 'jsrg_caofang', - 'jsrg_guoxun', - 'jsrg_gaoxiang', - 'jsrg_sunlubansunluyu', - 'jsrg_weiwenzhugezhi', - 'shen_xuzhu', - 'dc_jiangji', - 'dc_wangling', - 'yangfeng', - 'sb_xiahoudun', - 'sb_gaoshun', - 're_wangyi', - 'ol_wangyi', - 'chengji', - 'mb_sp_guanqiujian', + bp: [ + "xin_huojun", + "chess_diaochan", + "chess_huangzhong", + "chess_sunshangxiang", + "chess_taishici", + "chess_zhangliao", + "diy_liuzan", + "diy_lukang", + "diy_xuhuang", + "diy_yangyi", + "gjqt_hongyu", + "gjqt_wenrenyu", + "gjqt_yinqianshang", + "gw_aokeweisite", + "gw_feilafanruide", + "gw_qigaiwang", + "hs_anomalus", + "hs_duyaxinshi", + "hs_fengjianhuanfengzhe", + "hs_finley", + "hs_guldan", + "hs_hallazeal", + "hs_hemite", + "hs_hudunren", + "hs_huolituteng", + "hs_jgarrosh", + "hs_liadrin", + "hs_loatheb", + "hs_lreno", + "hs_lrexxar", + "hs_malfurion", + "hs_nate", + "hs_nozdormu", + "hs_ruanniguai", + "hs_selajin", + "hs_shifazhe", + "hs_tanghangu", + "hs_tgolem", + "hs_waleera", + "hs_wuther", + "hs_xuanzhuanjijia", + "hs_xuefashi", + "hs_yelise", + "hs_zhouzhuo", + "ns_huamulan", + "ns_yangyi", + "ns_zhangbao", + "ns_zhugeliang", + "ow_heibaihe", + "ow_luba", + "ow_sishen", + "pal_jiangcheng", + "pal_jiangyunfan", + "pal_leiyuange", + "pal_longyou", + "pal_shenqishuang", + "pal_sumei", + "pal_wangxiaohu", + "pal_xiaoman", + "swd_chunyuheng", + "swd_fengtianling", + "swd_haidapang", + "swd_hanlong", + "swd_hupo", + "swd_huyue", + "swd_jiangwu", + "swd_jiangziya", + "swd_jiting", + "swd_lilian", + "swd_moye", + "swd_qiner", + "swd_quxian", + "swd_shangzhang", + "swd_shaowei", + "swd_situqiang", + "swd_zhiyin", + "swd_zhuoshanzhu", + "swd_zidashu", + "yxs_aijiyanhou", + "yxs_bole", + "yxs_fuermosi", + "yxs_jinke", + "yxs_kaisa", + "yxs_lanlinwang", + "yxs_luocheng", + "yxs_meixi", + "yxs_mozi", + "yxs_xiaoqiao", + "yxs_yuefei", + "yxs_zhaoyong", + "yxs_zhuyuanzhang", + "zhangliao", + "zhenji", + "zhugeliang", + "sunquan", + "daqiao", + "diaochan", + "liubei", + "xf_yiji", + "zhoufei", + "xunyu", + "kuailiangkuaiyue", + "dianwei", + "re_lusu", + "panjun", + "ol_xinxianying", + "liubiao", + "zhongyao", + "liuchen", + "caochong", + "liufeng", + "zhangsong", + "zhuhuan", + "wuxian", + "jikang", + "shen_lvbu", + "shen_liubei", + "re_maliang", + "caobuxing", + "caoxing", + "re_panfeng", + "leitong", + "sp_liuqi", + "xf_tangzi", + "liuzan", + "lingcao", + "sunyang", + "sunru", + "lifeng", + "zhangyì", + "yj_xuhuang", + "xin_liaohua", + "sp_sunshao", + "re_wangyun", + "re_caocao", + "re_guanyu", + "re_huanggai", + "re_liubei", + "re_zhangliao", + "re_zhugeliang", + "re_daqiao", + "re_diaochan", + "ol_pangtong", + "ol_pangde", + "re_zhurong", + "re_menghuo", + "re_liubiao", + "xin_liubiao", + "re_liru", + "re_manchong", + "re_jianyong", + "re_yufan", + "re_zhangyi", + "re_sunxiu", + "caoang", + "sp_caoren", + "zhugeke", + "quyi", + "yuanshu", + "sp_zhaoyun", + "zhangxingcai", + "chengyu", + "buzhi", + "jsp_zhaoyun", + "huangjinleishi", + "re_xinxianying", + "sp_wangyuanji", + "sp_xinxianying", + "sp_liuxie", + "hanfu", + "re_quyi", + "zhanghuyuechen", + "fanyufeng", + "key_kengo", + "key_riki", + "key_hinata", + "key_akane", + "key_shiorimiyuki", + "key_miki", + "key_ryoichi", + "key_kotori", + "key_chihaya", + "key_rumi", + "nashime", + "ns_huangchengyan", + "ns_yuanxi", + "re_fuhuanghou", + "re_gongsunyuan", + "re_caozhen", + "ol_lisu", + "jin_simazhao", + "jin_zhangchunhua", + "xin_handang", + "luotong", + "re_zhoucang", + "ruanyu", + "wujing", + "nanhualaoxian", + "ns_sunyi", + "key_kyouko", + "re_guotufengji", + "ol_jiangwei", + "key_tenzen", + "jsp_liubei", + "liangxing", + "tangji", + "gaogan", + "sp_xunchen", + "duxi", + "heyan", + "re_caifuren", + "sp_kongrong", + "qiaogong", + "tw_qiaogong", + "re_guyong", + "xin_zhonghui", + "jiachong", + "wuban", + "tw_zhaoxiang", + "ol_lusu", + "zhangzhongjing", + "db_wenyang", + "dufuren", + "yuanhuan", + "zhouyi", + "yangzhi", + "wanniangongzhu", + "sunyi", + "sp_gaolan", + "simafu", + "mayuanyi", + "fengfangnv", + "ol_yangyi", + "sp_zhangchangpu", + "sp_jiangwan", + "xinchang", + "xin_yufan", + "ol_yufan", + "tw_re_caohong", + "tw_mayunlu", + "tw_hucheer", + "sp_lvfan", + "lvfan", + "cuimao", + "liqueguosi", + "re_chendeng", + "wuyan", + "wangyue", + "xin_sunxiu", + "sp_maojie", + "ol_xuhuang", + "ol_zhuling", + "tw_zangba", + "re_miheng", + "fengxi", + "tw_chengpu", + "key_satomi", + "key_erika", + "jin_yanghu", + "qinghegongzhu", + "re_zhanghe", + "wufan", + "yanfuren", + "tw_wangcan", + "tw_wangchang", + "jin_jiachong", + "licaiwei", + "tengyin", + "old_yangzhi", + "laiyinger", + "yanrou", + "weizi", + "shen_machao", + "sb_yujin", + "sb_huangzhong", + "dc_yanghu", + "dc_gongsunzan", + "caohua", + "zhaoang", + "ns_zhonglimu", + "caoxiancaohua", + "dc_liuba", + "key_seira", + "lukai", + "ol_lukai", + "niufu", + "re_liufeng", + "huzhao", + "guanhai", + "zhangfen", + "ol_dianwei", + "wangyan", + "chengui", + "ol_hujinding", + "dc_huangquan", + "dc_huban", + "dingshangwan", + "re_zhuhuan", + "xin_zhuhuan", + "dc_liuye", + "zhugeshang", + "re_xunyou", + "liwan", + "ol_furong", + "shiyi", + "gongsundu", + "yuanji", + "dc_chenqun", + "liupi", + "ol_liupi", + "mazhong", + "re_mazhong", + "tw_baoxin", + "tw_bingyuan", + "tw_chenzhen", + "tw_handang", + "tw_haomeng", + "tw_liwei", + "tw_mateng", + "tw_xunchen", + "tw_zhangfei", + "tw_zhangning", + "xia_tongyuan", + "xia_wangyue", + "dc_huanghao", + "dc_yangbiao", + "ns_sundeng", + "dc_huojun", + "ol_zhangyì", + "ol_zhujun", + "liyan", + "re_lidian", + "qinlang", + "xia_dianwei", + "xia_zhaoe", + "zhangkai", + "sunhong", + "zhangjinyun", + "dc_mengda", + "xiaoyuehankehan", + "zhutiexiong", + "shen_dengai", + "libai", + "tw_gongsunfan", + "yue_caiwenji", + "yue_xiaoqiao", + "yue_daqiao", + "vtb_xiaole", + "vtb_xiaojiu", + "ol_zhangzhang", + "ol_mengda", + "dc_wuban", + "re_caochong", + "jsrg_lvbu", + "jsrg_xuyou", + "jsrg_zhangliao", + "jsrg_zhenji", + "junk_xuyou", + "sp_machao", + "liupan", + "mengyou", + "re_wenpin", + "yue_zhoufei", + "ns_mengyou", + "zhangyan", + "jsrg_huangzhong", + "jsrg_zhangchu", + "ol_dingshangwan", + "ol_liwan", + "chengjichengcui", + "xin_zhangliang", + "liwei", + "xin_wuban", + "ol_liuyan", + "sunhuan", + "yue_caiyong", + "sb_huangyueying", + "jsrg_jiangwei", + "jsrg_luxun", + "jsrg_caofang", + "jsrg_guoxun", + "jsrg_gaoxiang", + "jsrg_sunlubansunluyu", + "jsrg_weiwenzhugezhi", + "shen_xuzhu", + "dc_jiangji", + "dc_wangling", + "yangfeng", + "sb_xiahoudun", + "sb_gaoshun", + "re_wangyi", + "ol_wangyi", + "chengji", + "mb_sp_guanqiujian", ], - b:[ - 'junk_guanyu', - 'liyi', - 'diy_feishi', - 'diy_liufu', - 'diy_tianyu', - 'diy_yuji', - 'hs_huzhixiannv', - 'hs_jiawodun', - 'hs_jinglinglong', - 'hs_shirencao', - 'hs_yelinchulong', - 'pal_linyueru', - 'swd_fu', - 'swd_hanluo', - 'swd_jialanduo', - 'swd_luchengxuan', - 'swd_youzhao', - 'swd_zhanggao', - 'yxs_baosi', - 'yxs_chengjisihan', - 'yxs_chengyaojin', - 'yxs_lishimin', - 'yxs_lvzhi', - 'yxs_mingchenghuanghou', - 'yxs_tangbohu', - 'yxs_weizhongxian', - 'yxs_yujix', - 'simayi', - 'huatuo', - 'huangyueying', - 'zhouyu', - 'sunshangxiang', - 're_weiyan', - 'guanqiujian', - 'zhanghe', - 'caiwenji', - 're_xiahouyuan', - 'yl_yuanshu', - 'sunliang', - 're_pangde', - 'zuoci', - 'wangji', - 'jiaxu', - 'liushan', - 'zhangzhang', - 'yanjun', - 're_jsp_pangtong', - 'handang', - 're_zhangchunhua', - 'xunyou', - 'yufan', - 're_chengong', - 'chengong', - 'bulianshi', - 'dc_bulianshi', - 'fuhuanghou', - 'manchong', - 'chenqun', - 'yj_jushou', - 'xiahoushi', - 'zhoucang', - 'gaoshun', - 'caozhen', - 'zhangyi', - 'gongsunyuan', - 'guotufengji', - 'xin_liru', - 'old_liyan', - 'cenhun', - 'huanghao', - 'sunziliufang', - 'ol_zhangliao', - 'shen_lvmeng', - 'shen_zhouyu', - 'zhanggong', - 'weiwenzhugezhi', - 'liuhong', - 'zhujun', - 'zhangji', - 'xf_sufei', - 'xugong', - 'sp_shenpei', - 'xunchen', - 'sp_zhanghe', - 'sp_xuyou', - 'lvkuanglvxiang', - 'wulan', - 're_sunben', - 'hujinding', - 'dc_hujinding', - 'dongcheng', - 'taoqian', - 'chendeng', - 'xin_xiahoudun', - 're_jikang', - 'dc_jikang', - 'zhuling', - 'zhaotongzhaoguang', - 'simazhao', - 're_xiahoudun', - 're_machao', - 're_zhangfei', - 're_zhaoyun', - 're_zhouyu', - 're_ganning', - 're_huangyueying', - 're_zhenji', - 'xin_yuji', - 're_taishici', - 're_yanwen', - 'ol_sunjian', - 're_caopi', - 're_xuhuang', - 'ol_dongzhuo', - 're_dengai', - 're_jiangwei', - 're_caiwenji', - 'ol_liushan', - 're_zhangzhang', - 're_masu', - 'old_madai', - 're_madai', - 'wangyi', - 'guanzhang', - 're_guanzhang', - 'ns_chengpu', - 're_sunluban', - 're_caoxiu', - 'xin _caoxiu', - 'sunluyu', - 'mb_sunluyu', - 'sp_diaochan', - 'liuxie', - 'zhugejin', - 'guanyinping', - 'yangxiu', - 'sp_caiwenji', - 'sp_jiangwei', - 'dc_sp_machao', - 'yanbaihu', - 'jsp_huangyueying', - 'zumao', - 'wenpin', - 'zhangling', - 'guotu', - 'caoshuang', - 'fuwan', - 'litong', - 'mizhu', - 'dongbai', - 'sp_lvmeng', - 'sp_zhangfei', - 'sp_simazhao', - 'jianggan', - 'yj_chendao', - 'yj_caoang', - 'xin_hansui', - 'ns_caimao', - 'sp_zhangliao', - 'xinxianying', - 'sp_bianfuren', - 'tw_bianfuren', - 'key_haruko', - 'key_rei', - 'key_komari', - 'key_yoshino', - 'key_sasami', - 'key_doruji', - 'key_noda', - 'key_tomoya', - 'key_ayato', - 'key_kaori', - 'key_akiko', - 'key_abyusa', - 'key_asara', - 'ns_sunchensunjun', - 'simashi', - 'xin_panzhangmazhong', - 're_xiaoqiao', - 'caoanmin', - 'luyusheng', - 'dingfeng', - 'huangzu', - 'jin_yanghuiyu', - 'sp_mifuren', - 'sp_xinpi', - 'cheliji', - 'shibao', - 'zhangmiao', - 'ol_zhurong', - 'sp_mifangfushiren', - 'zhangheng', - 're_hucheer', - 're_guanping', - 'feiyi', - 'xiangchong', - 'qiuliju', - 're_dongbai', - 'xin_guyong', - 'duosidawang', - 're_jiaxu', - 'xin_caozhen', - 'ol_dengzhi', - 'sundeng', - 're_sundeng', - 're_duji', - 'sp_chendong', - 'sp_zongyu', - 'old_yangyan', - 'zuofen', - 're_kanze', - 'tongyuan', - 'zhangning', - 'sp_huaman', - 'sp_wangshuang', - 'yanpu', - 'sp_jiangqing', - 'tw_hejin', - 'xuangongzhu', - 'sp_huangfusong', - 'yj_huangzhong', - 're_xiahoushi', - 'sp_yangwan', - 'wangtao', - 'tianyu', - 'fanjiangzhangda', - 'zhaoyan', - 'huojun', - 'tw_caocao', - 'xin_wuguotai', - 'dc_xushu', - 'dc_jiben', - 'ol_caiwenji', - 'dc_gaolan', - 'liuba', - 'jin_guohuai', - 'tw_tianyu', - 'zhangyao', - 'sb_huaxiong', - 'shen_sunquan', - 're_jushou', - 'dc_huangzu', - 'dc_liuyu', - 'qinyilu', - 'zhaoyǎn', - 'zhangxun', - 'xiahoulingnv', - 're_sp_taishici', - 'dc_lvkuanglvxiang', - 'dengzhong', - 'dc_liru', - 'kebineng', - 'wangwei', - 'zhangzhi', - 'clan_xuncan', - 'clan_xunshu', - 'sunlang', - 'yangfu', - 'sp_pengyang', - 'tw_caoxiu', - 'tw_chendong', - 'tw_feiyi', - 'tw_fengxí', - 'tw_guyong', - 'tw_huchuquan', - 'tw_jianshuo', - 'dc_jiling', - 'tw_jiling', - 'tw_liufuren', - 'tw_madai', - 'tw_sunyi', - 'tw_xuezong', - 'tw_yufuluo', - 'tw_zongyu', - 'xia_xushu', - 'clan_hanrong', - 'clan_hanshao', - 'ns_duji', - 'yj_weiyan', - 'dc_sunziliufang', - 'maxiumatie', - 'chendao', - 'quhuang', - 'xia_xiahouzie', - 'xielingyu', - 'ol_yanwen', - 'sp_mushun', - 'tw_yangang', - 'sb_zhurong', - 'vtb_xiaoshan', - 'vtb_xiaotao', - 'zhangchu', - 'chentai', - 'clan_zhongyan', - 'sb_zhurong', - 'haopu', - 'xizheng', - 'dc_duyu', - 'clan_wanghun', - 'jsrg_chendeng', - 'jsrg_zhanghe', - 'jsrg_zoushi', - 'gaoxiang', - 'ol_qianzhao', - 'yj_zhoubuyi', - 'feiyao', - 'jsrg_xiahouen', - 'old_shen_zhaoyun', - 'sb_qiaoxiao', - 're_simalang', - 'laimin', - 'baoxin', - 'mb_xianglang', - 'lvboshe', - 'ol_caozhang', - 'ol_lingtong', - 'jsrg_liuyong', - 'jsrg_sunjun', - 'xia_shie', - 'clan_wangmingshan', + b: [ + "junk_guanyu", + "liyi", + "diy_feishi", + "diy_liufu", + "diy_tianyu", + "diy_yuji", + "hs_huzhixiannv", + "hs_jiawodun", + "hs_jinglinglong", + "hs_shirencao", + "hs_yelinchulong", + "pal_linyueru", + "swd_fu", + "swd_hanluo", + "swd_jialanduo", + "swd_luchengxuan", + "swd_youzhao", + "swd_zhanggao", + "yxs_baosi", + "yxs_chengjisihan", + "yxs_chengyaojin", + "yxs_lishimin", + "yxs_lvzhi", + "yxs_mingchenghuanghou", + "yxs_tangbohu", + "yxs_weizhongxian", + "yxs_yujix", + "simayi", + "huatuo", + "huangyueying", + "zhouyu", + "sunshangxiang", + "re_weiyan", + "guanqiujian", + "zhanghe", + "caiwenji", + "re_xiahouyuan", + "yl_yuanshu", + "sunliang", + "re_pangde", + "zuoci", + "wangji", + "jiaxu", + "liushan", + "zhangzhang", + "yanjun", + "re_jsp_pangtong", + "handang", + "re_zhangchunhua", + "xunyou", + "yufan", + "re_chengong", + "chengong", + "bulianshi", + "dc_bulianshi", + "fuhuanghou", + "manchong", + "chenqun", + "yj_jushou", + "xiahoushi", + "zhoucang", + "gaoshun", + "caozhen", + "zhangyi", + "gongsunyuan", + "guotufengji", + "xin_liru", + "old_liyan", + "cenhun", + "huanghao", + "sunziliufang", + "ol_zhangliao", + "shen_lvmeng", + "shen_zhouyu", + "zhanggong", + "weiwenzhugezhi", + "liuhong", + "zhujun", + "zhangji", + "xf_sufei", + "xugong", + "sp_shenpei", + "xunchen", + "sp_zhanghe", + "sp_xuyou", + "lvkuanglvxiang", + "wulan", + "re_sunben", + "hujinding", + "dc_hujinding", + "dongcheng", + "taoqian", + "chendeng", + "xin_xiahoudun", + "re_jikang", + "dc_jikang", + "zhuling", + "zhaotongzhaoguang", + "simazhao", + "re_xiahoudun", + "re_machao", + "re_zhangfei", + "re_zhaoyun", + "re_zhouyu", + "re_ganning", + "re_huangyueying", + "re_zhenji", + "xin_yuji", + "re_taishici", + "re_yanwen", + "ol_sunjian", + "re_caopi", + "re_xuhuang", + "ol_dongzhuo", + "re_dengai", + "re_jiangwei", + "re_caiwenji", + "ol_liushan", + "re_zhangzhang", + "re_masu", + "old_madai", + "re_madai", + "wangyi", + "guanzhang", + "re_guanzhang", + "ns_chengpu", + "re_sunluban", + "re_caoxiu", + "xin _caoxiu", + "sunluyu", + "mb_sunluyu", + "sp_diaochan", + "liuxie", + "zhugejin", + "guanyinping", + "yangxiu", + "sp_caiwenji", + "sp_jiangwei", + "dc_sp_machao", + "yanbaihu", + "jsp_huangyueying", + "zumao", + "wenpin", + "zhangling", + "guotu", + "caoshuang", + "fuwan", + "litong", + "mizhu", + "dongbai", + "sp_lvmeng", + "sp_zhangfei", + "sp_simazhao", + "jianggan", + "yj_chendao", + "yj_caoang", + "xin_hansui", + "ns_caimao", + "sp_zhangliao", + "xinxianying", + "sp_bianfuren", + "tw_bianfuren", + "key_haruko", + "key_rei", + "key_komari", + "key_yoshino", + "key_sasami", + "key_doruji", + "key_noda", + "key_tomoya", + "key_ayato", + "key_kaori", + "key_akiko", + "key_abyusa", + "key_asara", + "ns_sunchensunjun", + "simashi", + "xin_panzhangmazhong", + "re_xiaoqiao", + "caoanmin", + "luyusheng", + "dingfeng", + "huangzu", + "jin_yanghuiyu", + "sp_mifuren", + "sp_xinpi", + "cheliji", + "shibao", + "zhangmiao", + "ol_zhurong", + "sp_mifangfushiren", + "zhangheng", + "re_hucheer", + "re_guanping", + "feiyi", + "xiangchong", + "qiuliju", + "re_dongbai", + "xin_guyong", + "duosidawang", + "re_jiaxu", + "xin_caozhen", + "ol_dengzhi", + "sundeng", + "re_sundeng", + "re_duji", + "sp_chendong", + "sp_zongyu", + "old_yangyan", + "zuofen", + "re_kanze", + "tongyuan", + "zhangning", + "sp_huaman", + "sp_wangshuang", + "yanpu", + "sp_jiangqing", + "tw_hejin", + "xuangongzhu", + "sp_huangfusong", + "yj_huangzhong", + "re_xiahoushi", + "sp_yangwan", + "wangtao", + "tianyu", + "fanjiangzhangda", + "zhaoyan", + "huojun", + "tw_caocao", + "xin_wuguotai", + "dc_xushu", + "dc_jiben", + "ol_caiwenji", + "dc_gaolan", + "liuba", + "jin_guohuai", + "tw_tianyu", + "zhangyao", + "sb_huaxiong", + "shen_sunquan", + "re_jushou", + "dc_huangzu", + "dc_liuyu", + "qinyilu", + "zhaoyǎn", + "zhangxun", + "xiahoulingnv", + "re_sp_taishici", + "dc_lvkuanglvxiang", + "dengzhong", + "dc_liru", + "kebineng", + "wangwei", + "zhangzhi", + "clan_xuncan", + "clan_xunshu", + "sunlang", + "yangfu", + "sp_pengyang", + "tw_caoxiu", + "tw_chendong", + "tw_feiyi", + "tw_fengxí", + "tw_guyong", + "tw_huchuquan", + "tw_jianshuo", + "dc_jiling", + "tw_jiling", + "tw_liufuren", + "tw_madai", + "tw_sunyi", + "tw_xuezong", + "tw_yufuluo", + "tw_zongyu", + "xia_xushu", + "clan_hanrong", + "clan_hanshao", + "ns_duji", + "yj_weiyan", + "dc_sunziliufang", + "maxiumatie", + "chendao", + "quhuang", + "xia_xiahouzie", + "xielingyu", + "ol_yanwen", + "sp_mushun", + "tw_yangang", + "sb_zhurong", + "vtb_xiaoshan", + "vtb_xiaotao", + "zhangchu", + "chentai", + "clan_zhongyan", + "sb_zhurong", + "haopu", + "xizheng", + "dc_duyu", + "clan_wanghun", + "jsrg_chendeng", + "jsrg_zhanghe", + "jsrg_zoushi", + "gaoxiang", + "ol_qianzhao", + "yj_zhoubuyi", + "feiyao", + "jsrg_xiahouen", + "old_shen_zhaoyun", + "sb_qiaoxiao", + "re_simalang", + "laimin", + "baoxin", + "mb_xianglang", + "lvboshe", + "ol_caozhang", + "ol_lingtong", + "jsrg_liuyong", + "jsrg_sunjun", + "xia_shie", + "clan_wangmingshan", ], - bm:[ - 'kongrong', - 'diy_xizhenxihong', - 'ns_nanhua_left', - 'ns_nanhua_right', - 'ns_wenchou', - 'yxs_goujian', - 'machao', - 'ganning', - 'caocao', - 'huangzhong', - 'xuhuang', - 'old_chendao', - 'dongzhuo', - 'taishici', - 'yanwen', - 'menghuo', - 'sp_zhugeliang', - 'jiangwei', - 'dengai', - 'sunce', - 'sunjian', - 'zhurong', - 'xin_zhoutai', - 'old_caoren', - 'pangtong', - 'yanyan', - 'sp_zhangjiao', - 're_yuji', - 'wangcan', - 'xuezong', - 'caozhi', - 'zhonghui', - 'wuyi', - 'caifuren', - 'lingtong', - 'sunxiu', - 'quancong', - 'guohuanghou', - 'fazheng', - 'guanping', - 'old_guanzhang', - 'old_wangyi', - 'zhuran', - 'xusheng', - 'wuguotai', - 'jianyong', - 'shen_zhangliao', - 'lvkai', - 'xinpi', - 'mangyachang', - 'xin_baosanniang', - 're_sunluyu', - 'wangshuang', - 'xingdaorong', - 'fanchou', - 'guosi', - 'xf_huangquan', - 'xin_caozhang', - 're_heqi', - 're_sp_zhugeliang', - 're_liushan', - 're_pangtong', - 'xin_yuanshao', - 'liuye', - 're_weiwenzhugezhi', - 'xin_jianyong', - 're_sunjian', - 'old_bulianshi', - 're_guanqiujian', - 'shenpei', - 're_baosanniang', - 're_xugong', - 're_simayi', - 'old_re_lidian', - 're_xuzhu', - 're_xushu', - 're_lvmeng', - 're_luxun', - 're_huatuo', - 're_huaxiong', - 're_gongsunzan', - 'ol_xiaoqiao', - 'ol_sp_zhugeliang', - 're_dianwei', - 're_sunce', - 'ol_dengai', - 're_wuguotai', - 're_gaoshun', - 'ol_gaoshun', - 're_caozhi', - 're_lingtong', - 'xin_xusheng', - 'xin_fazheng', - 're_handang', - 're_liaohua', - 're_caozhang', - 're_guohuai', - 'xin_guohuai', - 're_panzhangmazhong', - 're_quancong', - 'jsp_guanyu', - 'caohong', - 'xiahouba', - 'simalang', - 'sp_sunshangxiang', - 'mayunlu', - 'zhanglu', - 'wutugu', - 'zhugeguo', - 'daxiaoqiao', - 'dc_daxiaoqiao', - 'sp_pangde', - 'sp_jiaxu', - 'dc_sp_jiaxu', - 'kanze', - 'heqi', - 'wangyun', - 'dc_wangyun', - 'sunqian', - 'xujing', - 'baosanniang', - 'cuiyan', - 'sp_daqiao', - 'sp_ganning', - 'sp_xiahoudun', - 'sp_liubei', - 'sp_gongsunzan', - 'ganfuren', - 'yuejin', - 'hetaihou', - 'niujin', - 'ns_lijue', - 'ns_zhangji', - 'ol_dingyuan', - 'hucheer', - 'jin_xiahouhui', - 'xin_zhangfei', - 'xin_fuhuanghou', - 'zhaozhong', - 'zongyu', - 'simazhou', - 'sp_fuhuanghou', - 'sp_jiben', - 'sp_fuwan', - 're_chengpu', - 'ol_chengpu', - 're_niujin', - 'wangfuzhaolei', - 'caizhenji', - 'longyufei', - 'sp_zhangwen', - 're_zoushi', - 'yuejiu', - 'dc_yuejiu', - 'xin_sunluban', - 'ol_bianfuren', - 'sp_ol_zhanghe', - 'liucheng', - 'peixiu', - 'haomeng', - 'mamidi', - 'tw_wujing', - 'dc_zhuling', - 'tw_puyangxing', - 'ruanhui', - 'xin_mamidi', - 'xin_quancong', - 'dc_caiyang', - 're_caiyong', - 'liyixiesheng', - 'panghui', - 'leibo', - 'dongguiren', - 'tw_daxiaoqiao', - 'tw_fanchou', - 'tw_qiaorui', - 'tw_weixu', - 'tw_xujing', - 'tw_yangyi', - 'tw_zhouchu', - 'tw_zhugeguo', - 'dc_caozhi', - 'hanlong', - 'oldre_liubiao', - 'wuanguo', - 'qiaorui', - 'clan_wukuang', - 'yeshiwen', - 'qianzhao', - 'vtb_xiaosha', - 'huanfan', - 'jsrg_xugong', - 'old_xiaoqiao', - 'old_guanyu', - 'dc_kongrong', + bm: [ + "kongrong", + "diy_xizhenxihong", + "ns_nanhua_left", + "ns_nanhua_right", + "ns_wenchou", + "yxs_goujian", + "machao", + "ganning", + "caocao", + "huangzhong", + "xuhuang", + "old_chendao", + "dongzhuo", + "taishici", + "yanwen", + "menghuo", + "sp_zhugeliang", + "jiangwei", + "dengai", + "sunce", + "sunjian", + "zhurong", + "xin_zhoutai", + "old_caoren", + "pangtong", + "yanyan", + "sp_zhangjiao", + "re_yuji", + "wangcan", + "xuezong", + "caozhi", + "zhonghui", + "wuyi", + "caifuren", + "lingtong", + "sunxiu", + "quancong", + "guohuanghou", + "fazheng", + "guanping", + "old_guanzhang", + "old_wangyi", + "zhuran", + "xusheng", + "wuguotai", + "jianyong", + "shen_zhangliao", + "lvkai", + "xinpi", + "mangyachang", + "xin_baosanniang", + "re_sunluyu", + "wangshuang", + "xingdaorong", + "fanchou", + "guosi", + "xf_huangquan", + "xin_caozhang", + "re_heqi", + "re_sp_zhugeliang", + "re_liushan", + "re_pangtong", + "xin_yuanshao", + "liuye", + "re_weiwenzhugezhi", + "xin_jianyong", + "re_sunjian", + "old_bulianshi", + "re_guanqiujian", + "shenpei", + "re_baosanniang", + "re_xugong", + "re_simayi", + "old_re_lidian", + "re_xuzhu", + "re_xushu", + "re_lvmeng", + "re_luxun", + "re_huatuo", + "re_huaxiong", + "re_gongsunzan", + "ol_xiaoqiao", + "ol_sp_zhugeliang", + "re_dianwei", + "re_sunce", + "ol_dengai", + "re_wuguotai", + "re_gaoshun", + "ol_gaoshun", + "re_caozhi", + "re_lingtong", + "xin_xusheng", + "xin_fazheng", + "re_handang", + "re_liaohua", + "re_caozhang", + "re_guohuai", + "xin_guohuai", + "re_panzhangmazhong", + "re_quancong", + "jsp_guanyu", + "caohong", + "xiahouba", + "simalang", + "sp_sunshangxiang", + "mayunlu", + "zhanglu", + "wutugu", + "zhugeguo", + "daxiaoqiao", + "dc_daxiaoqiao", + "sp_pangde", + "sp_jiaxu", + "dc_sp_jiaxu", + "kanze", + "heqi", + "wangyun", + "dc_wangyun", + "sunqian", + "xujing", + "baosanniang", + "cuiyan", + "sp_daqiao", + "sp_ganning", + "sp_xiahoudun", + "sp_liubei", + "sp_gongsunzan", + "ganfuren", + "yuejin", + "hetaihou", + "niujin", + "ns_lijue", + "ns_zhangji", + "ol_dingyuan", + "hucheer", + "jin_xiahouhui", + "xin_zhangfei", + "xin_fuhuanghou", + "zhaozhong", + "zongyu", + "simazhou", + "sp_fuhuanghou", + "sp_jiben", + "sp_fuwan", + "re_chengpu", + "ol_chengpu", + "re_niujin", + "wangfuzhaolei", + "caizhenji", + "longyufei", + "sp_zhangwen", + "re_zoushi", + "yuejiu", + "dc_yuejiu", + "xin_sunluban", + "ol_bianfuren", + "sp_ol_zhanghe", + "liucheng", + "peixiu", + "haomeng", + "mamidi", + "tw_wujing", + "dc_zhuling", + "tw_puyangxing", + "ruanhui", + "xin_mamidi", + "xin_quancong", + "dc_caiyang", + "re_caiyong", + "liyixiesheng", + "panghui", + "leibo", + "dongguiren", + "tw_daxiaoqiao", + "tw_fanchou", + "tw_qiaorui", + "tw_weixu", + "tw_xujing", + "tw_yangyi", + "tw_zhouchu", + "tw_zhugeguo", + "dc_caozhi", + "hanlong", + "oldre_liubiao", + "wuanguo", + "qiaorui", + "clan_wukuang", + "yeshiwen", + "qianzhao", + "vtb_xiaosha", + "huanfan", + "jsrg_xugong", + "old_xiaoqiao", + "old_guanyu", + "dc_kongrong", ], - c:[ - 'xiahoudun', - 'zhaoyun', - 'huanggai', - 'luxun', - 'lvbu', - 'guanyu', - 'zhangfei', - 'yl_luzhi', - 'lvqian', - 're_zhangliang', - 'sp_taishici', - 'liuyao', - 'panzhangmazhong', - 'caiyong', - 'caoxiu', - 'caozhang', - 'caojie', - 'hanhaoshihuan', - 'liaohua', - 'sunluban', - 'xin_xushu', - 'madai', - 'lisu', - 're_hejin', - 'hansui', - 'gaolan', - 'furong', - 'yangyi', - 'dengzhi', - 'yj_zhangliao', - 'yj_zhanghe', - 'xin_gongsunzan', - 're_dongzhuo', - 'old_yuanshu', - 're_hanhaoshihuan', - 'lingju', - 'panfeng', - 'hanba', - 'ns_fanchou', - 'zhangchunhua', - 'weiguan', - 're_chenqun', - 'sp_huaxin', - 'sp_xujing', - 'caimaozhangyun', - 'ahuinan', - 'mushun', - 'tw_dengzhi', - 'tw_furong', - 'tw_niujin', - 'tw_zhangnan', - 'macheng', - 'old_caorui', - 'old_dingfeng', - 'old_gaoshun', - 'old_huanghao', - 'old_liubiao', - 'luoxian', - 'ol_huban', - 'sb_menghuo', - 'old_caocao', - 'sb_yl_luzhi', + c: [ + "xiahoudun", + "zhaoyun", + "huanggai", + "luxun", + "lvbu", + "guanyu", + "zhangfei", + "yl_luzhi", + "lvqian", + "re_zhangliang", + "sp_taishici", + "liuyao", + "panzhangmazhong", + "caiyong", + "caoxiu", + "caozhang", + "caojie", + "hanhaoshihuan", + "liaohua", + "sunluban", + "xin_xushu", + "madai", + "lisu", + "re_hejin", + "hansui", + "gaolan", + "furong", + "yangyi", + "dengzhi", + "yj_zhangliao", + "yj_zhanghe", + "xin_gongsunzan", + "re_dongzhuo", + "old_yuanshu", + "re_hanhaoshihuan", + "lingju", + "panfeng", + "hanba", + "ns_fanchou", + "zhangchunhua", + "weiguan", + "re_chenqun", + "sp_huaxin", + "sp_xujing", + "caimaozhangyun", + "ahuinan", + "mushun", + "tw_dengzhi", + "tw_furong", + "tw_niujin", + "tw_zhangnan", + "macheng", + "old_caorui", + "old_dingfeng", + "old_gaoshun", + "old_huanghao", + "old_liubiao", + "luoxian", + "ol_huban", + "sb_menghuo", + "old_caocao", + "sb_yl_luzhi", ], - d:[ - 'chendong', - 'lvmeng', - 'huaxiong', - 'gongsunzan', - 'xuzhu', - 'old_huaxiong', - 'chengpu', - 'zhangwen', - 'dingyuan', - 'xin_chengpu', - 'sunshao', - 'tadun', - 'zangba', - 'junk_zhangrang', - 'ol_guohuai', - 'junk_simayi', - 'key_youta', - 'old_chenqun', - 'duanwei', - 'wangxiang', - 'duji', - 'bianxi', - 'junk_sunquan', - 'clan_wuban', - 'wangjun', - 'xin_wuyi', - 'xin_zhuzhi', - 'tw_guanqiujian', - 'tw_xiahouen', - 'tw_yl_luzhi', - 'junk_huangyueying', - 'junk_liubei', - 'new_caoren', - 'old_handang', - 'old_zhoutai', - 'tengfanglan', - 'junk_lidian', - 'junk_duanwei', - 'std_panfeng', - 'qianzhao', + d: [ + "chendong", + "lvmeng", + "huaxiong", + "gongsunzan", + "xuzhu", + "old_huaxiong", + "chengpu", + "zhangwen", + "dingyuan", + "xin_chengpu", + "sunshao", + "tadun", + "zangba", + "junk_zhangrang", + "ol_guohuai", + "junk_simayi", + "key_youta", + "old_chenqun", + "duanwei", + "wangxiang", + "duji", + "bianxi", + "junk_sunquan", + "clan_wuban", + "wangjun", + "xin_wuyi", + "xin_zhuzhi", + "tw_guanqiujian", + "tw_xiahouen", + "tw_yl_luzhi", + "junk_huangyueying", + "junk_liubei", + "new_caoren", + "old_handang", + "old_zhoutai", + "tengfanglan", + "junk_lidian", + "junk_duanwei", + "std_panfeng", + "qianzhao", ], - rarity:{ - legend:[ - 'star_caoren', - 'dc_zhaoyun', - 'dc_caocao', - 'dc_liubei', - 'dc_sunquan', - 'dc_sunce', - 'xia_yuzhenzi', - 'xia_guanyu', - 'ol_sb_yuanshao', - 'swd_muyun', - 'swd_zhaoyun', - 'swd_septem', - 'swd_yuwentuo', - 'swd_duguningke', - 'swd_guyue', - 'swd_yuxiaoxue', - 'swd_huanglei', - 'swd_xuanyuanjianxian', - 'swd_qi', - 'swd_huzhongxian', - 'swd_murongshi', - 'swd_huiyan', - 'gjqt_aruan', - 'hs_neptulon', - 'hs_sthrall', - 'hs_malorne', - 'hs_medivh', - 'hs_pyros', - 'hs_siwangzhiyi', - 'hs_aya', - 'hs_kazhakusi', - 'hs_malygos', - 'hs_ysera', - 'pal_liumengli', - 'pal_yuntianhe', - 'gw_jieluote', - 'gw_yenaifa', - 'gw_telisi', - 'gw_xili', - 'yxs_wuzetian', - 'diy_caiwenji', - 'shen_caocao', - 'shen_lvbu', - 'shen_zhaoyun', - 'shen_simayi', - 'shen_liubei', - 'shen_luxun', - 'shen_zhangliao', - 'shen_ganning', - 'shen_caopi', - 'shen_zhenji', - 'key_shiki', - 'key_kagari', - 'ol_zhangliao', - 'shen_diaochan', - 'guansuo', - 'xin_baosanniang', - 're_baosanniang', - 'baosanniang', - 'caoying', - 'caoshuang', - 'caochun', - 'wanglang', - 'yuantanyuanshang', - 'xurong', - 're_liuzan', - 'zhaoxiang', - 'dc_zhaoxiang', - 'liuyan', - 'miheng', - 'majun', - 'pangdegong', - 'yangbiao', - 'zhangqiying', - 'chunyuqiong', - 'lingju', - 'simahui', - 'sp_xiahoushi', - 'sp_pangtong', - 'shixie', - 'dc_shixie', - 'guohuai', - 're_zuoci', - 'ns_zhangwei', - 'ol_yuanshao', - 'guozhao', - 'boss_zhaoyun', - 'yanghuiyu', - 'nanhualaoxian', - 'panshu', - 're_nanhualaoxian', - 'shen_sunce', - 'sunhanhua', - 'caojinyu', - 're_fengfangnv', - 'key_yuri', - 'key_yuzuru', - 'sp_key_kanade', - 'key_iwasawa', - 'key_yui', - 'key_misuzu', - 'key_nagisa', - 'key_kud', - 'key_saya', - 'key_kyousuke', - 'key_umi', - 'key_nao', - 'key_yuu', - 'sp_key_yuri', - 'key_abyusa', - 'key_ayato', - 'key_godan', - 're_machao', - 're_sunben', - 'ol_dingyuan', - 'wujing', - 'yangwan', - 're_sunyi', - 'shen_guojia', - 'shen_taishici', - 'shen_xunyu', - 'tw_gexuan', - 'fengfangnv', - 'zhangmancheng', - 'guanning', - 'shen_jiangwei', - 'ol_puyuan', - 'sb_huangzhong', - 'shen_sunquan', - 'shen_machao', - 'tw_shen_guanyu', - 'huojun', - 'quanhuijie', - 'clan_wuxian', - 'luyi', - 'shen_zhangfei', - 'clan_xuncai', - 'wanglie', - 'zhujianping', - 'zhaozhi', - 'liuhui', - 'shen_zhangjiao', - 'sb_machao', - 'dc_zhouxuān', - 'dc_tengfanglan', - 're_lidian', - 'tw_jiangji', - 'tw_niufudongxie', - 'tw_shen_lvmeng', - 'zhangjinyun', - 'sunwukong', - 'libai', - 'old_lingju', - 'wu_zhugeliang', - 'yue_caiwenji', - 'clan_zhongyan', - 'shen_dianwei', - 'sunlingluan', - 'ol_zhouqun', - 'wu_luxun', - 'key_tomoya', - 'key_masato', - 'key_shiorimiyuki', - 'key_hisako', - 'key_hinata', - 'key_kotori', - 'key_inari', - 'key_kamome', - 'key_noda', - 'key_shiina', - 'key_shiroha', - 'db_key_hina', - 'key_sakuya', - 'key_yuuki', - 'key_kyouko', - 'key_tenzen', - 'key_kotarou', - 'key_kyou', - 'key_erika', - 'key_satomi', - 'key_seira', - 'key_kiyu', - 'key_tomoyo', - 'key_minagi', - 'key_michiru', - 'noname', - 'ol_wanglang', - 'xin_guozhao', - 'shichangshi', - 'dc_guansuo', - 'dc_xujing', - 'caoxian', - 'wu_guanyu', + rarity: { + legend: [ + "star_caoren", + "dc_zhaoyun", + "dc_caocao", + "dc_liubei", + "dc_sunquan", + "dc_sunce", + "xia_yuzhenzi", + "xia_guanyu", + "ol_sb_yuanshao", + "swd_muyun", + "swd_zhaoyun", + "swd_septem", + "swd_yuwentuo", + "swd_duguningke", + "swd_guyue", + "swd_yuxiaoxue", + "swd_huanglei", + "swd_xuanyuanjianxian", + "swd_qi", + "swd_huzhongxian", + "swd_murongshi", + "swd_huiyan", + "gjqt_aruan", + "hs_neptulon", + "hs_sthrall", + "hs_malorne", + "hs_medivh", + "hs_pyros", + "hs_siwangzhiyi", + "hs_aya", + "hs_kazhakusi", + "hs_malygos", + "hs_ysera", + "pal_liumengli", + "pal_yuntianhe", + "gw_jieluote", + "gw_yenaifa", + "gw_telisi", + "gw_xili", + "yxs_wuzetian", + "diy_caiwenji", + "shen_caocao", + "shen_lvbu", + "shen_zhaoyun", + "shen_simayi", + "shen_liubei", + "shen_luxun", + "shen_zhangliao", + "shen_ganning", + "shen_caopi", + "shen_zhenji", + "key_shiki", + "key_kagari", + "ol_zhangliao", + "shen_diaochan", + "guansuo", + "xin_baosanniang", + "re_baosanniang", + "baosanniang", + "caoying", + "caoshuang", + "caochun", + "wanglang", + "yuantanyuanshang", + "xurong", + "re_liuzan", + "zhaoxiang", + "dc_zhaoxiang", + "liuyan", + "miheng", + "majun", + "pangdegong", + "yangbiao", + "zhangqiying", + "chunyuqiong", + "lingju", + "simahui", + "sp_xiahoushi", + "sp_pangtong", + "shixie", + "dc_shixie", + "guohuai", + "re_zuoci", + "ns_zhangwei", + "ol_yuanshao", + "guozhao", + "boss_zhaoyun", + "yanghuiyu", + "nanhualaoxian", + "panshu", + "re_nanhualaoxian", + "shen_sunce", + "sunhanhua", + "caojinyu", + "re_fengfangnv", + "key_yuri", + "key_yuzuru", + "sp_key_kanade", + "key_iwasawa", + "key_yui", + "key_misuzu", + "key_nagisa", + "key_kud", + "key_saya", + "key_kyousuke", + "key_umi", + "key_nao", + "key_yuu", + "sp_key_yuri", + "key_abyusa", + "key_ayato", + "key_godan", + "re_machao", + "re_sunben", + "ol_dingyuan", + "wujing", + "yangwan", + "re_sunyi", + "shen_guojia", + "shen_taishici", + "shen_xunyu", + "tw_gexuan", + "fengfangnv", + "zhangmancheng", + "guanning", + "shen_jiangwei", + "ol_puyuan", + "sb_huangzhong", + "shen_sunquan", + "shen_machao", + "tw_shen_guanyu", + "huojun", + "quanhuijie", + "clan_wuxian", + "luyi", + "shen_zhangfei", + "clan_xuncai", + "wanglie", + "zhujianping", + "zhaozhi", + "liuhui", + "shen_zhangjiao", + "sb_machao", + "dc_zhouxuān", + "dc_tengfanglan", + "re_lidian", + "tw_jiangji", + "tw_niufudongxie", + "tw_shen_lvmeng", + "zhangjinyun", + "sunwukong", + "libai", + "old_lingju", + "wu_zhugeliang", + "yue_caiwenji", + "clan_zhongyan", + "shen_dianwei", + "sunlingluan", + "ol_zhouqun", + "wu_luxun", + "key_tomoya", + "key_masato", + "key_shiorimiyuki", + "key_hisako", + "key_hinata", + "key_kotori", + "key_inari", + "key_kamome", + "key_noda", + "key_shiina", + "key_shiroha", + "db_key_hina", + "key_sakuya", + "key_yuuki", + "key_kyouko", + "key_tenzen", + "key_kotarou", + "key_kyou", + "key_erika", + "key_satomi", + "key_seira", + "key_kiyu", + "key_tomoyo", + "key_minagi", + "key_michiru", + "noname", + "ol_wanglang", + "xin_guozhao", + "shichangshi", + "dc_guansuo", + "dc_xujing", + "caoxian", + "wu_guanyu", ], - epic:[ - 'dc_caoshuang', - 'tianchou', - 'star_yuanshao', - 'yue_xiaoqiao', - 'yue_daqiao', - 'mb_chengui', - 'ol_pengyang', - 'ol_luyusheng', - 'clan_xunchen', - 'peiyuanshao', - 'tw_zhangzhao', - 'tw_zhanghong', - 'tw_ol_sunjian', - 'yj_huangzhong', - 'clan_zhongyu', - 'zhoushan', - 'pal_yueqi', - 'pal_yuejinzhao', - 'pal_mingxiu', - 'pal_xuanxiao', - 'pal_zixuan', - 'pal_xuejian', - 'pal_murongziying', - 'pal_lixiaoyao', - 'pal_xingxuan', - 'hs_tyrande', - 'hs_amala', - 'hs_alextrasza', - 'hs_totemic', - 'hs_bchillmaw', - 'hs_aedwin', - 'hs_antonidas', - 'hs_wvelen', - 'hs_alakir', - 'hs_xsylvanas', - 'hs_blingtron', - 'hs_fuding', - 'hs_lafamu', - 'hs_nozdormu', - 'hs_jiaziruila', - 'hs_yelise', - 'hs_xuefashi', - 'hs_liadrin', - 'yxs_libai', - 'yxs_luban', - 'yxs_yangyuhuan', - 'yxs_guiguzi', - 'yxs_aijiyanhou', - 'swd_shuwaner', - 'swd_kendi', - 'swd_weida', - 'swd_lilian', - 'swd_jipeng', - 'swd_cheyun', - 'swd_tuobayuer', - 'swd_jiliang', - 'swd_muyue', - 'swd_lanyin', - 'swd_chenjingchou', - 'swd_kama', - 'swd_anka', - 'swd_huanyuanzhi', - 'swd_kangnalishi', - 'swd_zhiyin', - 'swd_xiarou', - 'swd_wangsiyue', - 'swd_qiner', - 'gjqt_fanglansheng', - 'gjqt_fengqingxue', - 'gjqt_xiayize', - 'gjqt_bailitusu', - 'gjqt_ouyangshaogong', - 'gjqt_xunfang', - 'diy_zhenji', - 'ow_yuanshi', - 'ow_tianshi', - 'ow_zhixuzhiguang', - 'gw_aisinie', - 'gw_falanxisika', - 'shen_guanyu', - 'shen_lvmeng', - 'shen_zhugeliang', - 'shen_zhouyu', - 'chenlin', - 'yangxiu', - 'chengyu', - 'zhugeke', - 'guyong', - 'litong', - 'mazhong', - 'simazhao', - 'sp_sufei', - 'taoqian', - 'zhengxuan', - 'yj_ganning', - 're_xusheng', - 'liuzan', - 'lijue', - 'beimihu', - 'zhangchangpu', - 'ol_zhangchangpu', - 'guanlu', - 'gexuan', - 'puyuan', - 'xushao', - 'wenyang', - 'huaman', - 'wangshuang', - 'xizhicai', - 'mayunlu', - 'zhugeguo', - 'sunhao', - 'wangyun', - 'zhangbao', - 'huangfusong', - 'huangjinleishi', - 'sp_liuxie', - 'shamoke', - 'jianggan', - 'wangyuanji', - 're_heqi', - 'tw_beimihu', - 'sp_machao', - 'wutugu', - 'zhangrang', - 'jikang', - 'xushi', - 'machao', - 'sunce', - 're_sunce', - 're_wangyun', - 'zuoci', - 'xuyou', - 'zhangxiu', - 're_zhangjiao', - 're_yuanshao', - 'zhugedan', - 'leitong', - 'wulan', - 'caoxing', - 'diy_wenyang', - 'ns_caoshuang', - 'ns_huangchengyan', - 'ns_sunchensunjun', - 'ns_yuanxi', - 'ns_jiaxu', - 'liubian', - 'simashi', - 'jin_simayi', - 'jin_zhangchunhua', - 'liuhong', - 'jin_wangyuanji', - 'jin_simazhao', - 'jin_xiahouhui', - 'jin_simashi', - 'zhangling', - 'guotu', - 'ns_luyusheng', - 'fanyufeng', - 're_taoqian', - 'caosong', - 'sp_duyu', - 'jin_yanghuiyu', - 'xiahoujie', - 'ruanyu', - 'zhouqun', - 'ns_chentai', - 'ns_huangwudie', - 'ns_sunyi', - 'ns_zhangning', - 'ns_yanghu', - 'ol_huaxin', - 'longyufei', - 're_panshu', - 'db_wenyang', - 'qiaozhou', - 'lvlingqi', - 'wangtao', - 'wangyue', - 're_pangdegong', - 'zhongyan', - 'kaisa', - 'tw_zhaoxiang', - 'tw_caocao', - 'tw_liuhong', - 'tw_caozhao', - 'wufan', - 'dc_luotong', - 'dc_huangchengyan', - 'laiyinger', - 'ns_ruanji', - 'ns_zanghong', - 'caohua', - 'ns_limi', - 'ol_xunyu', - 'ns_zhonglimu', - 'dc_sunru', - 'zhangfen', - 'xiahouxuan', - 'prp_zhugeliang', - 'zhangzhi', - 'ol_liuba', - 'shiyi', - 'yuanji', - 'tw_liuzhang', - 'tw_mateng', - 'dc_wangyun', - 'tw_zhangning', - 'tw_zhugeguo', - 'xuelingyun', - 'dc_zhaotongzhaoguang', - 'mengjie', - 'dc_ruiji', - 'xia_zhaoe', - 'duanqiaoxiao', - 'longwang', - 'taoshen', - 'xiaoyuehankehan', - 'zhutiexiong', - 'sunyang', - 'yeshiwen', - 'ganfurenmifuren', - 'ruanji', - 'zhangxuan', - 'zhangchu', - 'dc_sunhanhua', - 'dc_wangjun', - 'zhanghua', - 'lushi', - 'clan_zhonghui', - 'zhoubuyi', - 'dc_wangjun', - 'ns_mengyou', - 'key_kano', - 'key_haruko', - 'key_akiko', - 'key_sunohara', - 'key_yukine', - 'key_komari', - 'key_rin', - 'key_kengo', - 'key_harukakanata', - 'key_mio', - 'key_midori', - 'key_sasami', - 'key_riki', - 'key_kaori', - 'key_shiori', - 'key_yuiko', - 'key_lucia', - 'key_akane', - 'key_shizuru', - 'key_ao', - 'key_tsumugi', - 'key_kyoko', - 'key_miki', - 'key_rei', - 'key_yusa', - 'key_misa', - 'key_shizuku', - 'key_hiroto', - 'key_rumi', - 'key_chihaya', - 'key_yukito', - 'key_kotomi', - 'db_key_liyingxia', - 'key_iriya', - 'star_dongzhuo', - 'star_yuanshu', - 'clan_xunyou', - 'lvboshe', - 'yj_zhoubuyi', - 'ol_jianyong', - 'ol_sb_jiangwei', - 'dc_sb_zhouyu', - 'xia_shitao', - 'bailingyun', - 'dc_sb_simayi', - 'caofang', - 'mb_caomao', - 'dc_shen_huatuo', - 'sp_zhenji', - 'drag_guanyu', - 'drag_caoren', + epic: [ + "dc_caoshuang", + "tianchou", + "star_yuanshao", + "yue_xiaoqiao", + "yue_daqiao", + "mb_chengui", + "ol_pengyang", + "ol_luyusheng", + "clan_xunchen", + "peiyuanshao", + "tw_zhangzhao", + "tw_zhanghong", + "tw_ol_sunjian", + "yj_huangzhong", + "clan_zhongyu", + "zhoushan", + "pal_yueqi", + "pal_yuejinzhao", + "pal_mingxiu", + "pal_xuanxiao", + "pal_zixuan", + "pal_xuejian", + "pal_murongziying", + "pal_lixiaoyao", + "pal_xingxuan", + "hs_tyrande", + "hs_amala", + "hs_alextrasza", + "hs_totemic", + "hs_bchillmaw", + "hs_aedwin", + "hs_antonidas", + "hs_wvelen", + "hs_alakir", + "hs_xsylvanas", + "hs_blingtron", + "hs_fuding", + "hs_lafamu", + "hs_nozdormu", + "hs_jiaziruila", + "hs_yelise", + "hs_xuefashi", + "hs_liadrin", + "yxs_libai", + "yxs_luban", + "yxs_yangyuhuan", + "yxs_guiguzi", + "yxs_aijiyanhou", + "swd_shuwaner", + "swd_kendi", + "swd_weida", + "swd_lilian", + "swd_jipeng", + "swd_cheyun", + "swd_tuobayuer", + "swd_jiliang", + "swd_muyue", + "swd_lanyin", + "swd_chenjingchou", + "swd_kama", + "swd_anka", + "swd_huanyuanzhi", + "swd_kangnalishi", + "swd_zhiyin", + "swd_xiarou", + "swd_wangsiyue", + "swd_qiner", + "gjqt_fanglansheng", + "gjqt_fengqingxue", + "gjqt_xiayize", + "gjqt_bailitusu", + "gjqt_ouyangshaogong", + "gjqt_xunfang", + "diy_zhenji", + "ow_yuanshi", + "ow_tianshi", + "ow_zhixuzhiguang", + "gw_aisinie", + "gw_falanxisika", + "shen_guanyu", + "shen_lvmeng", + "shen_zhugeliang", + "shen_zhouyu", + "chenlin", + "yangxiu", + "chengyu", + "zhugeke", + "guyong", + "litong", + "mazhong", + "simazhao", + "sp_sufei", + "taoqian", + "zhengxuan", + "yj_ganning", + "re_xusheng", + "liuzan", + "lijue", + "beimihu", + "zhangchangpu", + "ol_zhangchangpu", + "guanlu", + "gexuan", + "puyuan", + "xushao", + "wenyang", + "huaman", + "wangshuang", + "xizhicai", + "mayunlu", + "zhugeguo", + "sunhao", + "wangyun", + "zhangbao", + "huangfusong", + "huangjinleishi", + "sp_liuxie", + "shamoke", + "jianggan", + "wangyuanji", + "re_heqi", + "tw_beimihu", + "sp_machao", + "wutugu", + "zhangrang", + "jikang", + "xushi", + "machao", + "sunce", + "re_sunce", + "re_wangyun", + "zuoci", + "xuyou", + "zhangxiu", + "re_zhangjiao", + "re_yuanshao", + "zhugedan", + "leitong", + "wulan", + "caoxing", + "diy_wenyang", + "ns_caoshuang", + "ns_huangchengyan", + "ns_sunchensunjun", + "ns_yuanxi", + "ns_jiaxu", + "liubian", + "simashi", + "jin_simayi", + "jin_zhangchunhua", + "liuhong", + "jin_wangyuanji", + "jin_simazhao", + "jin_xiahouhui", + "jin_simashi", + "zhangling", + "guotu", + "ns_luyusheng", + "fanyufeng", + "re_taoqian", + "caosong", + "sp_duyu", + "jin_yanghuiyu", + "xiahoujie", + "ruanyu", + "zhouqun", + "ns_chentai", + "ns_huangwudie", + "ns_sunyi", + "ns_zhangning", + "ns_yanghu", + "ol_huaxin", + "longyufei", + "re_panshu", + "db_wenyang", + "qiaozhou", + "lvlingqi", + "wangtao", + "wangyue", + "re_pangdegong", + "zhongyan", + "kaisa", + "tw_zhaoxiang", + "tw_caocao", + "tw_liuhong", + "tw_caozhao", + "wufan", + "dc_luotong", + "dc_huangchengyan", + "laiyinger", + "ns_ruanji", + "ns_zanghong", + "caohua", + "ns_limi", + "ol_xunyu", + "ns_zhonglimu", + "dc_sunru", + "zhangfen", + "xiahouxuan", + "prp_zhugeliang", + "zhangzhi", + "ol_liuba", + "shiyi", + "yuanji", + "tw_liuzhang", + "tw_mateng", + "dc_wangyun", + "tw_zhangning", + "tw_zhugeguo", + "xuelingyun", + "dc_zhaotongzhaoguang", + "mengjie", + "dc_ruiji", + "xia_zhaoe", + "duanqiaoxiao", + "longwang", + "taoshen", + "xiaoyuehankehan", + "zhutiexiong", + "sunyang", + "yeshiwen", + "ganfurenmifuren", + "ruanji", + "zhangxuan", + "zhangchu", + "dc_sunhanhua", + "dc_wangjun", + "zhanghua", + "lushi", + "clan_zhonghui", + "zhoubuyi", + "dc_wangjun", + "ns_mengyou", + "key_kano", + "key_haruko", + "key_akiko", + "key_sunohara", + "key_yukine", + "key_komari", + "key_rin", + "key_kengo", + "key_harukakanata", + "key_mio", + "key_midori", + "key_sasami", + "key_riki", + "key_kaori", + "key_shiori", + "key_yuiko", + "key_lucia", + "key_akane", + "key_shizuru", + "key_ao", + "key_tsumugi", + "key_kyoko", + "key_miki", + "key_rei", + "key_yusa", + "key_misa", + "key_shizuku", + "key_hiroto", + "key_rumi", + "key_chihaya", + "key_yukito", + "key_kotomi", + "db_key_liyingxia", + "key_iriya", + "star_dongzhuo", + "star_yuanshu", + "clan_xunyou", + "lvboshe", + "yj_zhoubuyi", + "ol_jianyong", + "ol_sb_jiangwei", + "dc_sb_zhouyu", + "xia_shitao", + "bailingyun", + "dc_sb_simayi", + "caofang", + "mb_caomao", + "dc_shen_huatuo", + "sp_zhenji", + "drag_guanyu", + "drag_caoren", ], - rare:[ - 'drag_lvchang', - 're_wangyi', - 'ol_wangyi', - 'tw_yanliang', - 'tw_wenchou', - 'tw_yuantan', - 'zhugemengxue', - 'ol_sb_taishici', - 'clan_wuqiao', - 'xin_huojun', - 'muludawang', - 'mb_huban', - 'sp_jianggan', - 'ol_caozhang', - 'ol_lingtong', - 'luoxian', - 'ol_mengda', - 'tw_menghuo', - 'hejin', - 'hansui', - 'clan_xunshu', - 'clan_xuncan', - 'huanfan', - 'xin_zhangyi', - 'pal_shenqishuang', - 'hs_selajin', - 'hs_enzoth', - 'hs_yashaji', - 'hs_yogg', - 'hs_kcthun', - 'pal_nangonghuang', - 'pal_wangpengxu', - 'gw_yioufeisi', - 'gw_luoqi', - 'swd_xiyan', - 'ow_falaozhiying', - 'yxs_kaisa', - 'yxs_napolun', - 'hs_nate', - 'yxs_jinke', - 'yxs_yuefei', - 'hs_anomalus', - 'hs_jinglinglong', - 'hs_alleria', - 'hs_lreno', - 'hs_zhouzhuo', - 'hs_loatheb', - 'hs_finley', - 'ow_chanyata', - 'yxs_huamulan', - 'swd_quxian', - 'ow_liekong', - 'ow_zhixuzhiguang', - 'hs_xialikeer', - 'hs_sainaliusi', - 'hs_lrhonin', - 'yxs_diaochan', - 'hs_anduin', - 'swd_hengai', - 'hs_wuther', - 'swd_shuijing', - 'swd_sikongyu', - 'diy_yuji', - 'hs_zhishigushu', - 'pal_jingtian', - 'swd_shanxiaoxiao', - 'yxs_caocao', - 'swd_linyue', - 'swd_xuanyuanjiantong', - 'swd_maixing', - 'diy_xuhuang', - 'hs_jaina', - 'gjqt_xiangling', - 'swd_jiuyou', - 'diy_zhouyu', - 'pal_changqing', - 'swd_yuchiyanhong', - 'swd_duopeng', - 'swd_yuli', - 'swd_rongshuang', - 'pal_zhaoliner', - 'swd_situqiang', - 'hs_malfurion', - 'yxs_bole', - 'gjqt_yuewuyi', - 'hs_mijiaojisi', - 'yxs_mozi', - 'gjqt_hongyu', - 'hs_waleera', - 'swd_chunyuheng', - 'swd_jiangziya', - 'swd_nicole', - 'swd_zhuoshanzhu', - 'swd_shaowei', - 'pal_linyueru', - 'swd_jialanduo', - 'hs_yngvar', - 're_wuyi', - 're_zhuran', - 'key_yoshino', - 'key_kyoko', - 'jiakui', - 'hujinding', - 'dc_hujinding', - 'zhangyì', - 'lingcao', - 'sunru', - 'zhaotongzhaoguang', - 'yj_xuhuang', - 'yuanshu', - 'guosi', - 'zhangji', - 're_panfeng', - 'gaolan', - 'xunchen', - 'caobuxing', - 're_maliang', - 'sp_caiwenji', - 'luzhi', - 'guanyinping', - 'zhangxingcai', - 'xiahouba', - 'dc_xiahouba', - 'sunluyu', - 'zhugejin', - 'liuxie', - 'sp_zhaoyun', - 'sp_simazhao', - 'sp_wangyuanji', - 'sp_xinxianying', - 'liuye', - 'zhuling', - 'lifeng', - 'chendeng', - 'shenpei', - 'xin_liaohua', - 'nashime', - 'caoang', - 'sp_caoren', - 'sp_jiangwei', - 'zhanggong', - 'xugong', - 'sp_shenpei', - 'dongyun', - 'maliang', - 'mizhu', - 'buzhi', - 'dongbai', - 'jsp_huangyueying', - 'quyi', - 'yanbaihu', - 'zhanglu', - 'jsp_zhaoyun', - 'ganfuren', - 'xin_masu', - 'xunyou', - 'caochong', - 'liufeng', - 'zhuhuan', - 'caifuren', - 'zhangsong', - 'caorui', - 'zhongyao', - 're_zhongyao', - 'liuchen', - 'zhuzhi', - 'gongsunyuan', - 'liuyu', - 'ol_xinxianying', - 'xinxianying', - 'qinmi', - 'wuxian', - 'lvdai', - 're_jsp_pangtong', - 'zhoufang', - 'panjun', - 'yanjun', - 're_yuanshu', - 're_zhanggong', - 'xf_yiji', - 'xf_tangzi', - 'sp_liuqi', - 'sp_diaochan', - 'dianwei', - 're_lusu', - 'caopi', - 'jiaxu', - 'kuailiangkuaiyue', - 'wangji', - 'wangping', - 'luji', - 'haozhao', - 'zhugezhan', - 'zhoufei', - 'lukang', - 'guanqiujian', - 're_caocao', - 're_guojia', - 're_xiahoudun', - 're_zhangliao', - 're_zhenji', - 're_guanyu', - 're_huangyueying', - 're_liubei', - 're_zhangfei', - 're_zhaoyun', - 're_zhugeliang', - 're_daqiao', - 're_huanggai', - 're_sunquan', - 're_sunshangxiang', - 're_diaochan', - 're_lvbu', - 'caoren', - 'ol_weiyan', - 'ol_xiahouyuan', - 're_huangzhong', - 'ol_xiaoqiao', - 'xin_yuji', - 'zhoutai', - 're_xunyu', - 'ol_pangde', - 're_taishici', - 're_yanwen', - 're_caopi', - 're_xuhuang', - 're_menghuo', - 're_zhurong', - 'ol_sunjian', - 'ol_dongzhuo', - 're_jiangwei', - 'ol_liushan', - 're_zhangzhang', - 're_caiwenji', - 're_caozhi', - 'yujin_yujin', - 'tw_yujin', - 'gaoshun', - 're_zhonghui', - 'old_madai', - 're_bulianshi', - 're_liubiao', - 'liubiao', - 're_chengpu', - 'ol_chengpu', - 're_manchong', - 're_yufan', - 're_liru', - 're_jianyong', - 're_sunluban', - 're_sunxiu', - 'xiahoushi', - 'guotufengji', - 'ns_chendao', - 'caozhang', - 'key_jojiro', - 'key_doruji', - 'key_ryoichi', - 'key_asara', - 'tw_maliang', - 'tw_dingfeng', - 'tw_xiahouba', - 'ns_lijue', - 'ns_zhangji', - 'ns_fanchou', - 'xin_zhuran', - 'xin_lingtong', - 'xin_liubiao', - 're_xinxianying', - 'xin_zhangfei', - 'wangrong', - 're_quyi', - 'hanfu', - 'xin_hansui', - 'duyu', - 'zhanghuyuechen', - 're_fazheng', - 'tw_re_fazheng', - 're_fuhuanghou', - 'gongsunkang', - 'xin_panzhangmazhong', - 'ol_dengai', - 'caoanmin', - 're_gongsunyuan', - 're_caozhen', - 're_chunyuqiong', - 'sp_chenzhen', - 'sp_wangcan', - 'lisu', - 'ol_lisu', - 'zhaozhong', - 're_zhangchunhua', - 'xin_handang', - 'sp_bianfuren', - 'tw_bianfuren', - 'luotong', - 'feiyi', - 'sp_jiben', - 'sp_fuhuanghou', - 'ns_chengpu', - 're_zhoucang', - 'sp_mifuren', - 'cheliji', - 're_guotufengji', - 'ol_jiangwei', - 'ol_zhurong', - 'huangchengyan', - 'liangxing', - 'wangling', - 'tw_wangling', - 'zhouchu', - 'dongcheng', - 'tangji', - 'gaogan', - 'caizhenji', - 'duxi', - 'heyan', - 're_caifuren', - 're_dongbai', - 'tw_dongzhao', - 'xin_caifuren', - 'sp_yanghu', - 'qiaogong', - 'tw_qiaogong', - 'liuzhang', - 'zhangzhongjing', - 'xin_zhonghui', - 'jiachong', - 'ol_lusu', - 'xin_sunluban', - 'ol_wangrong', - 'dufuren', - 'yuanhuan', - 'zhouyi', - 'fuqian', - 'yangyan', - 'yangzhi', - 'zuofen', - 'liuyong', - 'dc_liuli', - 'zhangning', - 'wanniangongzhu', - 're_xunchen', - 'tongyuan', - 'simafu', - 'mayuanyi', - 'sp_huaman', - 'ol_yangyi', - 'sp_cuiyan', - 'sp_zhangchangpu', - 'ol_dongzhao', - 'xin_yufan', - 'ol_yufan', - 'xuangongzhu', - 'xinchang', - 'tw_mayunlu', - 'tw_re_caohong', - 'tw_hucheer', - 'sp_yangwan', - 're_xiahoushi', - 're_chendeng', - 'xin_sunxiu', - 'wuyan', - 'sp_maojie', - 'sp_zhujun', - 'ol_chendeng', - 'ol_xuhuang', - 're_guohuanghou', - 'tw_huojun', - 'zhaoyan', - 're_miheng', - 'tw_chengpu', - 'jin_yanghu', - 'qinghegongzhu', - 'tw_guohuai', - 'tw_wangcan', - 'tw_wangchang', - 'licaiwei', - 'jin_jiachong', - 'ol_caiwenji', - 'tengyin', - 'dc_gaolan', - 'caomao', - 'tw_tianyu', - 'tw_puyangxing', - 'jin_guohuai', - 'liuba', - 'sp_menghuo', - 'dc_sp_menghuo', - 'dc_qinghegongzhu', - 'tenggongzhu', - 'tengfanglan', - 'dc_bulianshi', - 'ruiji', - 'weizi', - 'yanrou', - 'zhangyao', - 're_jushou', - 'xin_jushou', - 'yj_jushou', - 're_guyong', - 'dc_yanghu', - 're_duji', - 're_liuchen', - 'dc_liuyu', - 'qinyilu', - 'dc_jiling', - 'dc_wangchang', - 'jin_zhouchu', - 'lukai', - 'ol_lukai', - 'caoxiancaohua', - 'huzhao', - 're_liufeng', - 'guanhai', - 'dukui', - 'ol_dianwei', - 'chengui', - 'ol_hujinding', - 'dingshangwan', - 're_zhuhuan', - 'xin_zhuhuan', - 'yinfuren', - 'dc_liuye', - 'dc_zhaoyǎn', - 'zhugeshang', - 're_xunyou', - 'liwan', - 'furong', - 'sunlang', - 'chengbing', - 'gongsundu', - 'xin_caoxiu', - 'dc_chenqun', - 'liupi', - 'ol_liupi', - 'tw_baoxin', - 'tw_bingyuan', - 'tw_chenzhen', - 'tw_fengxí', - 'tw_haomeng', - 'tw_huchuquan', - 'tw_jiangqing', - 'tw_jianshuo', - 'tw_jiling', - 'tw_liufuren', - 'tw_liwei', - 'tw_xunchen', - 'tw_zhangfei', - 'tw_zhangji', - 'xia_liyàn', - 'xia_tongyuan', - 'xia_wangyue', - 'clan_hanrong', - 'clan_hanshao', - 'dc_yangbiao', - 'ns_duji', - 'ns_sundeng', - 'ol_huangzhong', - 'yj_qiaozhou', - 'yj_sufei', - 'yj_weiyan', - 'dc_huojun', - 'ol_zhangyì', - 'ol_zhujun', - 'xia_dianwei', - 'xia_xiahouzie', - 'zhangkai', - 'wangguan', - 'ol_yanwen', - 'yanghong', - 're_zhuzhi', - 'dongguiren', - 'xielingyu', - 'liupi', - 'xianglang', - 'furongfuqian', - 'zhenghun', - 'clan_wangling', - 'clan_wangguang', - 'clan_wangyun', - 'quhuang', - 'ol_wenqin', - 'clan_wanghun', - 'yue_zhoufei', - 'ol_dingshangwan', - 'ol_liwan', - 'dc_sb_lusu', - 'clan_wangmingshan', - 'chengji', - 'mb_sp_guanqiujian', - 'lizhaojiaobo', + rare: [ + "drag_lvchang", + "re_wangyi", + "ol_wangyi", + "tw_yanliang", + "tw_wenchou", + "tw_yuantan", + "zhugemengxue", + "ol_sb_taishici", + "clan_wuqiao", + "xin_huojun", + "muludawang", + "mb_huban", + "sp_jianggan", + "ol_caozhang", + "ol_lingtong", + "luoxian", + "ol_mengda", + "tw_menghuo", + "hejin", + "hansui", + "clan_xunshu", + "clan_xuncan", + "huanfan", + "xin_zhangyi", + "pal_shenqishuang", + "hs_selajin", + "hs_enzoth", + "hs_yashaji", + "hs_yogg", + "hs_kcthun", + "pal_nangonghuang", + "pal_wangpengxu", + "gw_yioufeisi", + "gw_luoqi", + "swd_xiyan", + "ow_falaozhiying", + "yxs_kaisa", + "yxs_napolun", + "hs_nate", + "yxs_jinke", + "yxs_yuefei", + "hs_anomalus", + "hs_jinglinglong", + "hs_alleria", + "hs_lreno", + "hs_zhouzhuo", + "hs_loatheb", + "hs_finley", + "ow_chanyata", + "yxs_huamulan", + "swd_quxian", + "ow_liekong", + "ow_zhixuzhiguang", + "hs_xialikeer", + "hs_sainaliusi", + "hs_lrhonin", + "yxs_diaochan", + "hs_anduin", + "swd_hengai", + "hs_wuther", + "swd_shuijing", + "swd_sikongyu", + "diy_yuji", + "hs_zhishigushu", + "pal_jingtian", + "swd_shanxiaoxiao", + "yxs_caocao", + "swd_linyue", + "swd_xuanyuanjiantong", + "swd_maixing", + "diy_xuhuang", + "hs_jaina", + "gjqt_xiangling", + "swd_jiuyou", + "diy_zhouyu", + "pal_changqing", + "swd_yuchiyanhong", + "swd_duopeng", + "swd_yuli", + "swd_rongshuang", + "pal_zhaoliner", + "swd_situqiang", + "hs_malfurion", + "yxs_bole", + "gjqt_yuewuyi", + "hs_mijiaojisi", + "yxs_mozi", + "gjqt_hongyu", + "hs_waleera", + "swd_chunyuheng", + "swd_jiangziya", + "swd_nicole", + "swd_zhuoshanzhu", + "swd_shaowei", + "pal_linyueru", + "swd_jialanduo", + "hs_yngvar", + "re_wuyi", + "re_zhuran", + "key_yoshino", + "key_kyoko", + "jiakui", + "hujinding", + "dc_hujinding", + "zhangyì", + "lingcao", + "sunru", + "zhaotongzhaoguang", + "yj_xuhuang", + "yuanshu", + "guosi", + "zhangji", + "re_panfeng", + "gaolan", + "xunchen", + "caobuxing", + "re_maliang", + "sp_caiwenji", + "luzhi", + "guanyinping", + "zhangxingcai", + "xiahouba", + "dc_xiahouba", + "sunluyu", + "zhugejin", + "liuxie", + "sp_zhaoyun", + "sp_simazhao", + "sp_wangyuanji", + "sp_xinxianying", + "liuye", + "zhuling", + "lifeng", + "chendeng", + "shenpei", + "xin_liaohua", + "nashime", + "caoang", + "sp_caoren", + "sp_jiangwei", + "zhanggong", + "xugong", + "sp_shenpei", + "dongyun", + "maliang", + "mizhu", + "buzhi", + "dongbai", + "jsp_huangyueying", + "quyi", + "yanbaihu", + "zhanglu", + "jsp_zhaoyun", + "ganfuren", + "xin_masu", + "xunyou", + "caochong", + "liufeng", + "zhuhuan", + "caifuren", + "zhangsong", + "caorui", + "zhongyao", + "re_zhongyao", + "liuchen", + "zhuzhi", + "gongsunyuan", + "liuyu", + "ol_xinxianying", + "xinxianying", + "qinmi", + "wuxian", + "lvdai", + "re_jsp_pangtong", + "zhoufang", + "panjun", + "yanjun", + "re_yuanshu", + "re_zhanggong", + "xf_yiji", + "xf_tangzi", + "sp_liuqi", + "sp_diaochan", + "dianwei", + "re_lusu", + "caopi", + "jiaxu", + "kuailiangkuaiyue", + "wangji", + "wangping", + "luji", + "haozhao", + "zhugezhan", + "zhoufei", + "lukang", + "guanqiujian", + "re_caocao", + "re_guojia", + "re_xiahoudun", + "re_zhangliao", + "re_zhenji", + "re_guanyu", + "re_huangyueying", + "re_liubei", + "re_zhangfei", + "re_zhaoyun", + "re_zhugeliang", + "re_daqiao", + "re_huanggai", + "re_sunquan", + "re_sunshangxiang", + "re_diaochan", + "re_lvbu", + "caoren", + "ol_weiyan", + "ol_xiahouyuan", + "re_huangzhong", + "ol_xiaoqiao", + "xin_yuji", + "zhoutai", + "re_xunyu", + "ol_pangde", + "re_taishici", + "re_yanwen", + "re_caopi", + "re_xuhuang", + "re_menghuo", + "re_zhurong", + "ol_sunjian", + "ol_dongzhuo", + "re_jiangwei", + "ol_liushan", + "re_zhangzhang", + "re_caiwenji", + "re_caozhi", + "yujin_yujin", + "tw_yujin", + "gaoshun", + "re_zhonghui", + "old_madai", + "re_bulianshi", + "re_liubiao", + "liubiao", + "re_chengpu", + "ol_chengpu", + "re_manchong", + "re_yufan", + "re_liru", + "re_jianyong", + "re_sunluban", + "re_sunxiu", + "xiahoushi", + "guotufengji", + "ns_chendao", + "caozhang", + "key_jojiro", + "key_doruji", + "key_ryoichi", + "key_asara", + "tw_maliang", + "tw_dingfeng", + "tw_xiahouba", + "ns_lijue", + "ns_zhangji", + "ns_fanchou", + "xin_zhuran", + "xin_lingtong", + "xin_liubiao", + "re_xinxianying", + "xin_zhangfei", + "wangrong", + "re_quyi", + "hanfu", + "xin_hansui", + "duyu", + "zhanghuyuechen", + "re_fazheng", + "tw_re_fazheng", + "re_fuhuanghou", + "gongsunkang", + "xin_panzhangmazhong", + "ol_dengai", + "caoanmin", + "re_gongsunyuan", + "re_caozhen", + "re_chunyuqiong", + "sp_chenzhen", + "sp_wangcan", + "lisu", + "ol_lisu", + "zhaozhong", + "re_zhangchunhua", + "xin_handang", + "sp_bianfuren", + "tw_bianfuren", + "luotong", + "feiyi", + "sp_jiben", + "sp_fuhuanghou", + "ns_chengpu", + "re_zhoucang", + "sp_mifuren", + "cheliji", + "re_guotufengji", + "ol_jiangwei", + "ol_zhurong", + "huangchengyan", + "liangxing", + "wangling", + "tw_wangling", + "zhouchu", + "dongcheng", + "tangji", + "gaogan", + "caizhenji", + "duxi", + "heyan", + "re_caifuren", + "re_dongbai", + "tw_dongzhao", + "xin_caifuren", + "sp_yanghu", + "qiaogong", + "tw_qiaogong", + "liuzhang", + "zhangzhongjing", + "xin_zhonghui", + "jiachong", + "ol_lusu", + "xin_sunluban", + "ol_wangrong", + "dufuren", + "yuanhuan", + "zhouyi", + "fuqian", + "yangyan", + "yangzhi", + "zuofen", + "liuyong", + "dc_liuli", + "zhangning", + "wanniangongzhu", + "re_xunchen", + "tongyuan", + "simafu", + "mayuanyi", + "sp_huaman", + "ol_yangyi", + "sp_cuiyan", + "sp_zhangchangpu", + "ol_dongzhao", + "xin_yufan", + "ol_yufan", + "xuangongzhu", + "xinchang", + "tw_mayunlu", + "tw_re_caohong", + "tw_hucheer", + "sp_yangwan", + "re_xiahoushi", + "re_chendeng", + "xin_sunxiu", + "wuyan", + "sp_maojie", + "sp_zhujun", + "ol_chendeng", + "ol_xuhuang", + "re_guohuanghou", + "tw_huojun", + "zhaoyan", + "re_miheng", + "tw_chengpu", + "jin_yanghu", + "qinghegongzhu", + "tw_guohuai", + "tw_wangcan", + "tw_wangchang", + "licaiwei", + "jin_jiachong", + "ol_caiwenji", + "tengyin", + "dc_gaolan", + "caomao", + "tw_tianyu", + "tw_puyangxing", + "jin_guohuai", + "liuba", + "sp_menghuo", + "dc_sp_menghuo", + "dc_qinghegongzhu", + "tenggongzhu", + "tengfanglan", + "dc_bulianshi", + "ruiji", + "weizi", + "yanrou", + "zhangyao", + "re_jushou", + "xin_jushou", + "yj_jushou", + "re_guyong", + "dc_yanghu", + "re_duji", + "re_liuchen", + "dc_liuyu", + "qinyilu", + "dc_jiling", + "dc_wangchang", + "jin_zhouchu", + "lukai", + "ol_lukai", + "caoxiancaohua", + "huzhao", + "re_liufeng", + "guanhai", + "dukui", + "ol_dianwei", + "chengui", + "ol_hujinding", + "dingshangwan", + "re_zhuhuan", + "xin_zhuhuan", + "yinfuren", + "dc_liuye", + "dc_zhaoyǎn", + "zhugeshang", + "re_xunyou", + "liwan", + "furong", + "sunlang", + "chengbing", + "gongsundu", + "xin_caoxiu", + "dc_chenqun", + "liupi", + "ol_liupi", + "tw_baoxin", + "tw_bingyuan", + "tw_chenzhen", + "tw_fengxí", + "tw_haomeng", + "tw_huchuquan", + "tw_jiangqing", + "tw_jianshuo", + "tw_jiling", + "tw_liufuren", + "tw_liwei", + "tw_xunchen", + "tw_zhangfei", + "tw_zhangji", + "xia_liyàn", + "xia_tongyuan", + "xia_wangyue", + "clan_hanrong", + "clan_hanshao", + "dc_yangbiao", + "ns_duji", + "ns_sundeng", + "ol_huangzhong", + "yj_qiaozhou", + "yj_sufei", + "yj_weiyan", + "dc_huojun", + "ol_zhangyì", + "ol_zhujun", + "xia_dianwei", + "xia_xiahouzie", + "zhangkai", + "wangguan", + "ol_yanwen", + "yanghong", + "re_zhuzhi", + "dongguiren", + "xielingyu", + "liupi", + "xianglang", + "furongfuqian", + "zhenghun", + "clan_wangling", + "clan_wangguang", + "clan_wangyun", + "quhuang", + "ol_wenqin", + "clan_wanghun", + "yue_zhoufei", + "ol_dingshangwan", + "ol_liwan", + "dc_sb_lusu", + "clan_wangmingshan", + "chengji", + "mb_sp_guanqiujian", + "lizhaojiaobo", ], - junk:[ - 'ol_sb_guanyu', - 'junk_guanyu', - 'sunshao', - 'ol_guohuai', - 'gongsunzan', - 'chengpu', - 'zangba', - 'tianfeng', - 'dingyuan', - 'caiyong', - 'xin_chengpu', - 'junk_zhangrang', - 'wolongfengchu', - 're_chenqun', - 'sp_ol_zhanghe', - 'key_youta', - 'sp_xujing', - 'fanjiangzhangda', - 'wangxiang', - 'duji', - 'dc_liuba', - 'bianxi', - 'junk_sunquan', - 'clan_wuban', - 'clan_wukuang', - 'ahuinan', - 'sp_caosong', - 'yangfu', - 'wangjun', - 'xin_wuyi', - 'xin_zhuzhi', - 'tw_xiahouen', - 'ol_maliang', - 'old_bulianshi', - 'junk_huangyueying', - 'junk_liubei', - 'old_jiakui', - 'new_caoren', - 'old_zhoutai', - 'dongtuna', - 'junk_lidian', - 'junk_duanwei', - 'zerong', - 'std_panfeng', - 're_caochong', - 're_caorui', - 'junk_xuyou', - 're_zhongyao', - 'junk_zhangjiao', + junk: [ + "ol_sb_guanyu", + "junk_guanyu", + "sunshao", + "ol_guohuai", + "gongsunzan", + "chengpu", + "zangba", + "tianfeng", + "dingyuan", + "caiyong", + "xin_chengpu", + "junk_zhangrang", + "wolongfengchu", + "re_chenqun", + "sp_ol_zhanghe", + "key_youta", + "sp_xujing", + "fanjiangzhangda", + "wangxiang", + "duji", + "dc_liuba", + "bianxi", + "junk_sunquan", + "clan_wuban", + "clan_wukuang", + "ahuinan", + "sp_caosong", + "yangfu", + "wangjun", + "xin_wuyi", + "xin_zhuzhi", + "tw_xiahouen", + "ol_maliang", + "old_bulianshi", + "junk_huangyueying", + "junk_liubei", + "old_jiakui", + "new_caoren", + "old_zhoutai", + "dongtuna", + "junk_lidian", + "junk_duanwei", + "zerong", + "std_panfeng", + "re_caochong", + "re_caorui", + "junk_xuyou", + "re_zhongyao", + "junk_zhangjiao", ], - } + }, }; diff --git a/character/refresh.js b/character/refresh.js index 2d87240e9..f5b125879 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -1,3244 +1,3953 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'refresh', - characterSort:{ - refresh:{ - refresh_standard:["re_caocao","re_simayi","re_guojia","re_zhangliao","re_xuzhu","re_xiahoudun","re_zhangfei","re_zhaoyun","re_guanyu","re_machao","re_zhouyu","re_lvmeng","re_ganning","re_luxun","re_daqiao","re_huanggai","re_lvbu","re_huatuo","re_liubei","re_diaochan","re_huangyueying","re_sunquan","re_sunshangxiang","re_zhenji","re_zhugeliang","re_huaxiong",'re_gongsunzan',"re_lidian","re_xushu"], - refresh_feng:['caoren','ol_xiahouyuan','ol_weiyan','ol_xiaoqiao','zhoutai','re_zhangjiao','xin_yuji','ol_huangzhong'], - refresh_huo:["ol_sp_zhugeliang","ol_xunyu","ol_dianwei","ol_yanwen","ol_pangtong","ol_yuanshao","ol_pangde","re_taishici"], - refresh_lin:['re_menghuo','ol_sunjian','re_caopi','ol_xuhuang','ol_dongzhuo','ol_zhurong','re_jiaxu','ol_lusu'], - refresh_shan:['ol_jiangwei','ol_caiwenji','ol_liushan','ol_zhangzhang','re_zuoci','re_sunce','ol_dengai','re_zhanghe'], - refresh_yijiang1:['xin_wuguotai','xin_gaoshun','dc_caozhi','yujin_yujin','re_masu','xin_xusheng','re_fazheng','xin_lingtong','re_zhangchunhua','dc_xushu','re_chengong'], - refresh_yijiang2:['re_madai','re_wangyi','xin_handang','xin_zhonghui','re_liaohua','re_chengpu','re_caozhang','dc_bulianshi','xin_liubiao','re_xunyou','re_guanzhang'], - refresh_yijiang3:['re_jianyong','re_guohuai','re_zhuran','re_panzhangmazhong','xin_yufan','dc_liru','re_manchong','re_fuhuanghou','re_guanping','re_liufeng','re_caochong'], - refresh_yijiang4:['re_sunluban','re_wuyi','re_hanhaoshihuan','re_caozhen','re_zhoucang','dc_chenqun','re_caifuren','re_guyong','re_jushou','re_zhuhuan','re_zhangsong'], - refresh_yijiang5:['re_zhangyi','re_quancong','re_caoxiu','re_sunxiu','re_gongsunyuan','re_guotufengji','re_xiahoushi','re_liuchen','re_zhuzhi','re_caorui','re_zhongyao'], - refresh_yijiang6:['re_guohuanghou','re_sundeng'], - refresh_xinghuo:['xin_zhangliang','re_zhugedan','re_simalang','re_duji','dc_gongsunzan','re_sp_taishici','re_caiyong','re_mazhong','re_wenpin','re_jsp_huangyueying'], + name: "refresh", + characterSort: { + refresh: { + refresh_standard: [ + "re_caocao", + "re_simayi", + "re_guojia", + "re_zhangliao", + "re_xuzhu", + "re_xiahoudun", + "re_zhangfei", + "re_zhaoyun", + "re_guanyu", + "re_machao", + "re_zhouyu", + "re_lvmeng", + "re_ganning", + "re_luxun", + "re_daqiao", + "re_huanggai", + "re_lvbu", + "re_huatuo", + "re_liubei", + "re_diaochan", + "re_huangyueying", + "re_sunquan", + "re_sunshangxiang", + "re_zhenji", + "re_zhugeliang", + "re_huaxiong", + "re_gongsunzan", + "re_lidian", + "re_xushu", + ], + refresh_feng: [ + "caoren", + "ol_xiahouyuan", + "ol_weiyan", + "ol_xiaoqiao", + "zhoutai", + "re_zhangjiao", + "xin_yuji", + "ol_huangzhong", + ], + refresh_huo: [ + "ol_sp_zhugeliang", + "ol_xunyu", + "ol_dianwei", + "ol_yanwen", + "ol_pangtong", + "ol_yuanshao", + "ol_pangde", + "re_taishici", + ], + refresh_lin: [ + "re_menghuo", + "ol_sunjian", + "re_caopi", + "ol_xuhuang", + "ol_dongzhuo", + "ol_zhurong", + "re_jiaxu", + "ol_lusu", + ], + refresh_shan: [ + "ol_jiangwei", + "ol_caiwenji", + "ol_liushan", + "ol_zhangzhang", + "re_zuoci", + "re_sunce", + "ol_dengai", + "re_zhanghe", + ], + refresh_yijiang1: [ + "xin_wuguotai", + "xin_gaoshun", + "dc_caozhi", + "yujin_yujin", + "re_masu", + "xin_xusheng", + "re_fazheng", + "xin_lingtong", + "re_zhangchunhua", + "dc_xushu", + "re_chengong", + ], + refresh_yijiang2: [ + "re_madai", + "re_wangyi", + "xin_handang", + "xin_zhonghui", + "re_liaohua", + "re_chengpu", + "re_caozhang", + "dc_bulianshi", + "xin_liubiao", + "re_xunyou", + "re_guanzhang", + ], + refresh_yijiang3: [ + "re_jianyong", + "re_guohuai", + "re_zhuran", + "re_panzhangmazhong", + "xin_yufan", + "dc_liru", + "re_manchong", + "re_fuhuanghou", + "re_guanping", + "re_liufeng", + "re_caochong", + ], + refresh_yijiang4: [ + "re_sunluban", + "re_wuyi", + "re_hanhaoshihuan", + "re_caozhen", + "re_zhoucang", + "dc_chenqun", + "re_caifuren", + "re_guyong", + "re_jushou", + "re_zhuhuan", + "re_zhangsong", + ], + refresh_yijiang5: [ + "re_zhangyi", + "re_quancong", + "re_caoxiu", + "re_sunxiu", + "re_gongsunyuan", + "re_guotufengji", + "re_xiahoushi", + "re_liuchen", + "re_zhuzhi", + "re_caorui", + "re_zhongyao", + ], + refresh_yijiang6: ["re_guohuanghou", "re_sundeng"], + refresh_xinghuo: [ + "xin_zhangliang", + "re_zhugedan", + "re_simalang", + "re_duji", + "dc_gongsunzan", + "re_sp_taishici", + "re_caiyong", + "re_mazhong", + "re_wenpin", + "re_jsp_huangyueying", + ], }, }, - connect:true, - character:{ - re_xushu:['male','shu',4,['zhuhai','qianxin']], - re_lidian:['male','wei',3,['xunxun','xinwangxi']], - re_zhongyao:['male','wei',3,['rehuomo','zuoding'],['clan:颍川钟氏']], - xin_zhangliang:['male','qun',4,['rejijun','refangtong']], - re_simalang:['male','wei',3,['requji','rejunbing']], - re_zhugedan:['male','wei',4,['regongao','rejuyi']], - re_caorui:['male','wei',3,['huituo','remingjian','rexingshuai'],['zhu']], - re_caochong:['male','wei',3,['rechengxiang','renxin']], - ol_zhangzhang:['male','wu',3,['olzhijian','olguzheng']], - re_jsp_huangyueying:['female','qun',3,['rejiqiao','relinglong']], - re_zhangsong:['male','shu',3,['qiangzhi','rexiantu']], - re_zhuzhi:['male','wu',4,['reanguo']], - dc_caozhi:['male','wei',3,['reluoying','dcjiushi']], - ol_huangzhong:['male','shu',4,['xinliegong','remoshi']], - re_wenpin:['male','wei',5,['rezhenwei']], - re_guanzhang:['male','shu',4,['fuhun','retongxin']], - re_mazhong:['male','shu',4,['refuman']], - dc_chenqun:['male','wei',3,['repindi','dcfaen']], - re_sundeng:['male','wu',4,['rekuangbi']], - re_caiyong:['male','qun',3,['rebizhuan','retongbo']], - re_chengong:['male','qun',3,['remingce','zhichi']], - re_xunyou:['male','wei',3,['reqice','rezhiyu'],['clan:颍川荀氏']], - dc_liru:['male','qun',3,['xinjuece','dcmieji','dcfencheng']], - re_zhuhuan:['male','wu',4,['refenli','repingkou']], - ol_dianwei:['male','wei',4,['olqiangxi','olningwu']], - re_sp_taishici:['male','qun',4,['rejixu']], - re_liufeng:['male','shu',4,['rexiansi']], - ol_xunyu:['male','wei',3,['quhu','oljieming'],['clan:颍川荀氏']], - re_liuchen:['male','shu',4,['rezhanjue','reqinwang'],['zhu']], - dc_gongsunzan:['male','qun',4,['dcyicong','dcqiaomeng']], - re_duji:['male','wei',3,['reandong','reyingshi']], - re_jushou:['male','qun',3,['dcjianying','dcshibei']], - re_zhanghe:['male','wei',4,['reqiaobian']], - dc_xushu:['male','shu',4,['rezhuhai','xsqianxin']], - xin_gaoshun:['male','qun',4,['decadexianzhen','decadejinjiu']], - re_guohuanghou:['female','wei',3,['rejiaozhao','redanxin']], - re_xiahoushi:['female','shu',3,['reqiaoshi','reyanyu']], - ol_lusu:['male','wu',3,['olhaoshi','oldimeng']], - re_jiaxu:['male','qun',3,['rewansha','reluanwu','reweimu']], - re_guyong:['male','wu',3,['reshenxing','rebingyi']], - xin_zhonghui:['male','wei',4,['xinquanji','xinzili'],['clan:颍川钟氏']], - re_caifuren:['female','qun',3,['reqieting','rexianzhou']], - re_guanping:['male','shu',4,['relongyin','jiezhong']], - re_guotufengji:['male','qun',3,['rejigong','shifei']], - re_zhoucang:['male','shu',4,['rezhongyong']], - ol_zhurong:['female','shu',4,['juxiang','lieren','changbiao']], - re_zhangchunhua:['female','wei',3,['rejueqing','reshangshi']], - re_gongsunyuan:['male','qun',4,['rehuaiyi']], - re_caozhen:['male','wei',4,['residi']], - re_fuhuanghou:['female','qun',3,['rezhuikong','reqiuyuan']], - re_fazheng:['male','shu',3,['reenyuan','rexuanhuo']], - xin_lingtong:['male','wu',4,['decadexuanfeng','yongjin']], - xin_liubiao:['male','qun',3,['decadezishou','decadezongshi']], - re_caoxiu:['male','wei',4,['qianju','reqingxi']], - re_sunxiu:['male','wu',3,['reyanzhu','rexingxue','zhaofu'],['zhu']], - ol_dengai:['male','wei',4,['oltuntian','olzaoxian']], - re_gongsunzan:['male','qun',4,['reqiaomeng','reyicong']], - re_manchong:['male','wei',3,['rejunxing','yuce']], - xin_yufan:['male','wu',3,['xinzhiyan','xinzongxuan']], - dc_bulianshi:['female','wu',3,['dcanxu','dczhuiyi']], - re_hanhaoshihuan:['male','wei',4,['reshenduan','reyonglve']], - re_panzhangmazhong:['male','wu',4,['reduodao','reanjian']], - re_wangyi:['female','wei',4,['zhenlie','miji']], - re_madai:['male','shu',4,['mashu','reqianxi']], - xin_xusheng:['male','wu',4,['decadepojun']], - re_taishici:['male','wu',4,['tianyi','hanzhan']], - re_masu:['male','shu',3,['resanyao','rezhiman']], - re_sunluban:['female','wu',3,['rechanhui','rejiaojin']], - xin_handang:['male','wu',4,['xingongji','xinjiefan']], - yujin_yujin:['male','wei',4,['decadezhenjun']], - re_caozhang:['male','wei',4,['xinjiangchi']], - re_chengpu:['male','wu',4,['ollihuo','rechunlao']], - re_quancong:['male','wu',4,['xinyaoming']], - re_liaohua:['male','shu',4,['xindangxian','xinfuli']], - re_guohuai:['male','wei',4,['decadejingce']], - re_wuyi:['male','shu',4,['xinbenxi'],['clan:陈留吴氏']], - re_zhuran:['male','wu',4,['xindanshou']], - ol_pangtong:['male','shu',3,['ollianhuan','olniepan'],[]], - re_zhangyi:['male','shu',5,['rewurong','reshizhi']], - xin_wuguotai:['female','wu',3,['xinganlu','xinbuyi']], - re_caocao:['male','wei',4,['new_rejianxiong','rehujia'],['zhu']], - re_simayi:['male','wei',3,['refankui','reguicai']], - re_guojia:['male','wei',3,['tiandu','new_reyiji']], - re_zhangliao:['male','wei',4,['new_retuxi']], - re_xuzhu:['male','wei',4,['new_reluoyi']], - re_xiahoudun:['male','wei',4,['reganglie','new_qingjian']], - re_zhangfei:['male','shu',4,['olpaoxiao','oltishen']], - re_zhaoyun:['male','shu',4,['ollongdan','olyajiao']], - re_guanyu:['male','shu',4,['new_rewusheng','new_yijue']], - re_machao:['male','shu',4,['mashu','retieji']], - re_zhouyu:['male','wu',3,['reyingzi','refanjian']], - re_lvmeng:['male','wu',4,['keji','qinxue','rebotu']], - re_ganning:['male','wu',4,['qixi','fenwei']], - re_luxun:['male','wu',3,['reqianxun','relianying']], - re_daqiao:['female','wu',3,['reguose','liuli']], - re_huanggai:['male','wu',4,['rekurou','zhaxiang']], - re_lvbu:['male','qun',5,['wushuang','new_liyu']], - re_huatuo:['male','qun',3,['jijiu','new_reqingnang']], - re_liubei:['male','shu',4,['rerende','rejijiang'],['zhu']], - re_diaochan:['female','qun',3,['lijian','rebiyue']], - re_huangyueying:['female','shu',3,['rejizhi','reqicai']], - re_sunquan:['male','wu',4,['rezhiheng','rejiuyuan'],['zhu']], - re_sunshangxiang:['female','wu',3,['xiaoji','rejieyin']], - re_zhenji:['female','wei',3,['reluoshen','reqingguo']], - re_zhugeliang:['male','shu',3,['reguanxing','kongcheng']], - re_huaxiong:["male","qun",6,["reyaowu","shizhan"]], + connect: true, + character: { + re_xushu: ["male", "shu", 4, ["zhuhai", "qianxin"]], + re_lidian: ["male", "wei", 3, ["xunxun", "xinwangxi"]], + re_zhongyao: ["male", "wei", 3, ["rehuomo", "zuoding"], ["clan:颍川钟氏"]], + xin_zhangliang: ["male", "qun", 4, ["rejijun", "refangtong"]], + re_simalang: ["male", "wei", 3, ["requji", "rejunbing"]], + re_zhugedan: ["male", "wei", 4, ["regongao", "rejuyi"]], + re_caorui: ["male", "wei", 3, ["huituo", "remingjian", "rexingshuai"], ["zhu"]], + re_caochong: ["male", "wei", 3, ["rechengxiang", "renxin"]], + ol_zhangzhang: ["male", "wu", 3, ["olzhijian", "olguzheng"]], + re_jsp_huangyueying: ["female", "qun", 3, ["rejiqiao", "relinglong"]], + re_zhangsong: ["male", "shu", 3, ["qiangzhi", "rexiantu"]], + re_zhuzhi: ["male", "wu", 4, ["reanguo"]], + dc_caozhi: ["male", "wei", 3, ["reluoying", "dcjiushi"]], + ol_huangzhong: ["male", "shu", 4, ["xinliegong", "remoshi"]], + re_wenpin: ["male", "wei", 5, ["rezhenwei"]], + re_guanzhang: ["male", "shu", 4, ["fuhun", "retongxin"]], + re_mazhong: ["male", "shu", 4, ["refuman"]], + dc_chenqun: ["male", "wei", 3, ["repindi", "dcfaen"]], + re_sundeng: ["male", "wu", 4, ["rekuangbi"]], + re_caiyong: ["male", "qun", 3, ["rebizhuan", "retongbo"]], + re_chengong: ["male", "qun", 3, ["remingce", "zhichi"]], + re_xunyou: ["male", "wei", 3, ["reqice", "rezhiyu"], ["clan:颍川荀氏"]], + dc_liru: ["male", "qun", 3, ["xinjuece", "dcmieji", "dcfencheng"]], + re_zhuhuan: ["male", "wu", 4, ["refenli", "repingkou"]], + ol_dianwei: ["male", "wei", 4, ["olqiangxi", "olningwu"]], + re_sp_taishici: ["male", "qun", 4, ["rejixu"]], + re_liufeng: ["male", "shu", 4, ["rexiansi"]], + ol_xunyu: ["male", "wei", 3, ["quhu", "oljieming"], ["clan:颍川荀氏"]], + re_liuchen: ["male", "shu", 4, ["rezhanjue", "reqinwang"], ["zhu"]], + dc_gongsunzan: ["male", "qun", 4, ["dcyicong", "dcqiaomeng"]], + re_duji: ["male", "wei", 3, ["reandong", "reyingshi"]], + re_jushou: ["male", "qun", 3, ["dcjianying", "dcshibei"]], + re_zhanghe: ["male", "wei", 4, ["reqiaobian"]], + dc_xushu: ["male", "shu", 4, ["rezhuhai", "xsqianxin"]], + xin_gaoshun: ["male", "qun", 4, ["decadexianzhen", "decadejinjiu"]], + re_guohuanghou: ["female", "wei", 3, ["rejiaozhao", "redanxin"]], + re_xiahoushi: ["female", "shu", 3, ["reqiaoshi", "reyanyu"]], + ol_lusu: ["male", "wu", 3, ["olhaoshi", "oldimeng"]], + re_jiaxu: ["male", "qun", 3, ["rewansha", "reluanwu", "reweimu"]], + re_guyong: ["male", "wu", 3, ["reshenxing", "rebingyi"]], + xin_zhonghui: ["male", "wei", 4, ["xinquanji", "xinzili"], ["clan:颍川钟氏"]], + re_caifuren: ["female", "qun", 3, ["reqieting", "rexianzhou"]], + re_guanping: ["male", "shu", 4, ["relongyin", "jiezhong"]], + re_guotufengji: ["male", "qun", 3, ["rejigong", "shifei"]], + re_zhoucang: ["male", "shu", 4, ["rezhongyong"]], + ol_zhurong: ["female", "shu", 4, ["juxiang", "lieren", "changbiao"]], + re_zhangchunhua: ["female", "wei", 3, ["rejueqing", "reshangshi"]], + re_gongsunyuan: ["male", "qun", 4, ["rehuaiyi"]], + re_caozhen: ["male", "wei", 4, ["residi"]], + re_fuhuanghou: ["female", "qun", 3, ["rezhuikong", "reqiuyuan"]], + re_fazheng: ["male", "shu", 3, ["reenyuan", "rexuanhuo"]], + xin_lingtong: ["male", "wu", 4, ["decadexuanfeng", "yongjin"]], + xin_liubiao: ["male", "qun", 3, ["decadezishou", "decadezongshi"]], + re_caoxiu: ["male", "wei", 4, ["qianju", "reqingxi"]], + re_sunxiu: ["male", "wu", 3, ["reyanzhu", "rexingxue", "zhaofu"], ["zhu"]], + ol_dengai: ["male", "wei", 4, ["oltuntian", "olzaoxian"]], + re_gongsunzan: ["male", "qun", 4, ["reqiaomeng", "reyicong"]], + re_manchong: ["male", "wei", 3, ["rejunxing", "yuce"]], + xin_yufan: ["male", "wu", 3, ["xinzhiyan", "xinzongxuan"]], + dc_bulianshi: ["female", "wu", 3, ["dcanxu", "dczhuiyi"]], + re_hanhaoshihuan: ["male", "wei", 4, ["reshenduan", "reyonglve"]], + re_panzhangmazhong: ["male", "wu", 4, ["reduodao", "reanjian"]], + re_wangyi: ["female", "wei", 4, ["zhenlie", "miji"]], + re_madai: ["male", "shu", 4, ["mashu", "reqianxi"]], + xin_xusheng: ["male", "wu", 4, ["decadepojun"]], + re_taishici: ["male", "wu", 4, ["tianyi", "hanzhan"]], + re_masu: ["male", "shu", 3, ["resanyao", "rezhiman"]], + re_sunluban: ["female", "wu", 3, ["rechanhui", "rejiaojin"]], + xin_handang: ["male", "wu", 4, ["xingongji", "xinjiefan"]], + yujin_yujin: ["male", "wei", 4, ["decadezhenjun"]], + re_caozhang: ["male", "wei", 4, ["xinjiangchi"]], + re_chengpu: ["male", "wu", 4, ["ollihuo", "rechunlao"]], + re_quancong: ["male", "wu", 4, ["xinyaoming"]], + re_liaohua: ["male", "shu", 4, ["xindangxian", "xinfuli"]], + re_guohuai: ["male", "wei", 4, ["decadejingce"]], + re_wuyi: ["male", "shu", 4, ["xinbenxi"], ["clan:陈留吴氏"]], + re_zhuran: ["male", "wu", 4, ["xindanshou"]], + ol_pangtong: ["male", "shu", 3, ["ollianhuan", "olniepan"], []], + re_zhangyi: ["male", "shu", 5, ["rewurong", "reshizhi"]], + xin_wuguotai: ["female", "wu", 3, ["xinganlu", "xinbuyi"]], + re_caocao: ["male", "wei", 4, ["new_rejianxiong", "rehujia"], ["zhu"]], + re_simayi: ["male", "wei", 3, ["refankui", "reguicai"]], + re_guojia: ["male", "wei", 3, ["tiandu", "new_reyiji"]], + re_zhangliao: ["male", "wei", 4, ["new_retuxi"]], + re_xuzhu: ["male", "wei", 4, ["new_reluoyi"]], + re_xiahoudun: ["male", "wei", 4, ["reganglie", "new_qingjian"]], + re_zhangfei: ["male", "shu", 4, ["olpaoxiao", "oltishen"]], + re_zhaoyun: ["male", "shu", 4, ["ollongdan", "olyajiao"]], + re_guanyu: ["male", "shu", 4, ["new_rewusheng", "new_yijue"]], + re_machao: ["male", "shu", 4, ["mashu", "retieji"]], + re_zhouyu: ["male", "wu", 3, ["reyingzi", "refanjian"]], + re_lvmeng: ["male", "wu", 4, ["keji", "qinxue", "rebotu"]], + re_ganning: ["male", "wu", 4, ["qixi", "fenwei"]], + re_luxun: ["male", "wu", 3, ["reqianxun", "relianying"]], + re_daqiao: ["female", "wu", 3, ["reguose", "liuli"]], + re_huanggai: ["male", "wu", 4, ["rekurou", "zhaxiang"]], + re_lvbu: ["male", "qun", 5, ["wushuang", "new_liyu"]], + re_huatuo: ["male", "qun", 3, ["jijiu", "new_reqingnang"]], + re_liubei: ["male", "shu", 4, ["rerende", "rejijiang"], ["zhu"]], + re_diaochan: ["female", "qun", 3, ["lijian", "rebiyue"]], + re_huangyueying: ["female", "shu", 3, ["rejizhi", "reqicai"]], + re_sunquan: ["male", "wu", 4, ["rezhiheng", "rejiuyuan"], ["zhu"]], + re_sunshangxiang: ["female", "wu", 3, ["xiaoji", "rejieyin"]], + re_zhenji: ["female", "wei", 3, ["reluoshen", "reqingguo"]], + re_zhugeliang: ["male", "shu", 3, ["reguanxing", "kongcheng"]], + re_huaxiong: ["male", "qun", 6, ["reyaowu", "shizhan"]], - re_zhangjiao:['male','qun',3,['xinleiji','xinguidao','xinhuangtian'],['zhu']], - xin_yuji:['male','qun',3,['reguhuo']], - re_zuoci:['male','qun',3,['rehuashen','rexinsheng']], + re_zhangjiao: ["male", "qun", 3, ["xinleiji", "xinguidao", "xinhuangtian"], ["zhu"]], + xin_yuji: ["male", "qun", 3, ["reguhuo"]], + re_zuoci: ["male", "qun", 3, ["rehuashen", "rexinsheng"]], - ol_xiahouyuan:['male','wei',4,['xinshensu','shebian']], - caoren:['male','wei',4,['xinjushou','xinjiewei']], - ol_weiyan:['male','shu',4,['xinkuanggu','reqimou']], - ol_xiaoqiao:['female','wu',3,['oltianxiang','olhongyan','piaoling']], - zhoutai:['male','wu',4,['buqu','fenji']], - ol_pangde:['male','qun',4,['mashu','rejianchu']], - ol_xuhuang:['male','wei',4,['olduanliang','oljiezi']], - ol_sp_zhugeliang:["male","shu",3,["bazhen","olhuoji","olkanpo","cangzhuo"],[]], - ol_yanwen:["male","qun",4,["olshuangxiong"],[]], - ol_yuanshao:['male','qun',4,['olluanji','olxueyi'],['zhu']], - re_menghuo:['male','shu',4,['huoshou','rezaiqi']], - ol_dongzhuo:['male','qun',8,['oljiuchi','roulin','benghuai','olbaonue'],['zhu']], - ol_sunjian:['male','wu','4/5',['gzyinghun','wulie']], - re_caopi:['male','wei',3,['rexingshang','refangzhu','songwei'],['zhu']], - ol_jiangwei:['male','shu',4,['oltiaoxin','olzhiji']], - ol_caiwenji:['female','qun',3,['olbeige','duanchang']], - ol_liushan:['male','shu',3,['xiangle','olfangquan','olruoyu'],['zhu']], + ol_xiahouyuan: ["male", "wei", 4, ["xinshensu", "shebian"]], + caoren: ["male", "wei", 4, ["xinjushou", "xinjiewei"]], + ol_weiyan: ["male", "shu", 4, ["xinkuanggu", "reqimou"]], + ol_xiaoqiao: ["female", "wu", 3, ["oltianxiang", "olhongyan", "piaoling"]], + zhoutai: ["male", "wu", 4, ["buqu", "fenji"]], + ol_pangde: ["male", "qun", 4, ["mashu", "rejianchu"]], + ol_xuhuang: ["male", "wei", 4, ["olduanliang", "oljiezi"]], + ol_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "olhuoji", "olkanpo", "cangzhuo"], []], + ol_yanwen: ["male", "qun", 4, ["olshuangxiong"], []], + ol_yuanshao: ["male", "qun", 4, ["olluanji", "olxueyi"], ["zhu"]], + re_menghuo: ["male", "shu", 4, ["huoshou", "rezaiqi"]], + ol_dongzhuo: ["male", "qun", 8, ["oljiuchi", "roulin", "benghuai", "olbaonue"], ["zhu"]], + ol_sunjian: ["male", "wu", "4/5", ["gzyinghun", "wulie"]], + re_caopi: ["male", "wei", 3, ["rexingshang", "refangzhu", "songwei"], ["zhu"]], + ol_jiangwei: ["male", "shu", 4, ["oltiaoxin", "olzhiji"]], + ol_caiwenji: ["female", "qun", 3, ["olbeige", "duanchang"]], + ol_liushan: ["male", "shu", 3, ["xiangle", "olfangquan", "olruoyu"], ["zhu"]], - re_sunce:['male','wu',4,['oljiang','olhunzi','olzhiba'],['zhu']], - re_jianyong:['male','shu',3,['reqiaoshui','jyzongshi']], + re_sunce: ["male", "wu", 4, ["oljiang", "olhunzi", "olzhiba"], ["zhu"]], + re_jianyong: ["male", "shu", 3, ["reqiaoshui", "jyzongshi"]], }, - characterIntro:{ - jsp_huangyueying:'荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。', - re_gongsunzan:'群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。', - re_lidian:'字曼成,曹操麾下将领。李典深明大义,不与人争功,崇尚学习与高贵儒雅,尊重博学之士,在军中被称为长者。李典有长者之风,官至破虏将军,三十六岁去世。魏文帝曹丕继位后追谥号为愍侯。', - sunben:' ', + characterIntro: { + jsp_huangyueying: + "荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。", + re_gongsunzan: + "群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。", + re_lidian: + "字曼成,曹操麾下将领。李典深明大义,不与人争功,崇尚学习与高贵儒雅,尊重博学之士,在军中被称为长者。李典有长者之风,官至破虏将军,三十六岁去世。魏文帝曹丕继位后追谥号为愍侯。", + sunben: " ", }, - characterFilter:{ - re_zuoci:function(mode){ - return mode!='guozhan'; - } + characterFilter: { + re_zuoci: function (mode) { + return mode != "guozhan"; + }, }, - perfectPair:{ - sunben:['zhouyu','taishici','daqiao'], - re_xushu:['zhaoyun','sp_zhugeliang'], - re_guohuai:['xiahouyuan','zhanghe'], + perfectPair: { + sunben: ["zhouyu", "taishici", "daqiao"], + re_xushu: ["zhaoyun", "sp_zhugeliang"], + re_guohuai: ["xiahouyuan", "zhanghe"], }, - skill:{ - ollianhuan:{ - audio:'xinlianhuan', - audioname:['ol_pangtong'], - hiddenCard:(player,name)=>{ - return name=='tiesuo'&&player.hasCard(card=>get.suit(card)=='club','she'); + skill: { + ollianhuan: { + audio: "xinlianhuan", + audioname: ["ol_pangtong"], + hiddenCard: (player, name) => { + return name == "tiesuo" && player.hasCard((card) => get.suit(card) == "club", "she"); }, - filter:function(event,player){ - if(!player.hasCard(card=>get.suit(card)=='club','she')) return false; - return (event.type=='phase'||event.filterCard({name:'tiesuo'},player,event)); + filter: function (event, player) { + if (!player.hasCard((card) => get.suit(card) == "club", "she")) return false; + return event.type == "phase" || event.filterCard({ name: "tiesuo" }, player, event); }, - position:'hes', - inherit:'lianhuan', - group:'ollianhuan_add', - subSkill:{ - add:{ - audio:'xinlianhuan', - audioname:['ol_pangtong'], - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='tiesuo') return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(current=>{ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current); - })) return true; + position: "hes", + inherit: "lianhuan", + group: "ollianhuan_add", + subSkill: { + add: { + audio: "xinlianhuan", + audioname: ["ol_pangtong"], + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "tiesuo") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer((current) => { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) + ); + }) + ) + return true; } return false; }, - charlotte:true, - forced:true, - popup:false, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('ollianhuan'),'为'+get.translation(trigger.card)+'额外指定一个目标',(card,player,target)=>{ - return !_status.event.sourcex.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayex(); - } - else event.finish(); - 'step 2' - if(result.bool){ - var targets=result.targets; - player.logSkill('ollianhuan_add',targets); + charlotte: true, + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("ollianhuan"), + "为" + get.translation(trigger.card) + "额外指定一个目标", + (card, player, target) => { + return ( + !_status.event.sourcex.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayex(); + } else event.finish(); + ("step 2"); + if (result.bool) { + var targets = result.targets; + player.logSkill("ollianhuan_add", targets); trigger.targets.addArray(targets); - game.log(targets,'也成为了',trigger.card,'的目标'); + game.log(targets, "也成为了", trigger.card, "的目标"); } }, }, }, }, - rehuomo:{ - audio:'huomo', - audioname:['huzhao','re_zhongyao'], - enable:'chooseToUse', - hiddenCard:function(player,name){ - if(get.type(name)!='basic') return false; - const list=player.getStorage('rehuomo'); - if(list.includes(name)) return false; - return player.hasCard(function(card){ - return get.color(card)=='black'&&get.type(card)!='basic'; - },'eh'); + rehuomo: { + audio: "huomo", + audioname: ["huzhao", "re_zhongyao"], + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + const list = player.getStorage("rehuomo"); + if (list.includes(name)) return false; + return player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh"); }, - filter:function(event,player){ - if(event.type=='wuxie'||!player.hasCard(function(card){ - return get.color(card)=='black'&&get.type(card)!='basic'; - },'eh')) return false; - const list=player.getStorage('rehuomo'); - for(let name of lib.inpile){ - if(get.type(name)!='basic'||list.includes(name)) continue; - let card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) return true; - if(name=='sha'){ - for(let nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) return true; + filter: function (event, player) { + if ( + event.type == "wuxie" || + !player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh") + ) + return false; + const list = player.getStorage("rehuomo"); + for (let name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + let card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (let nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - const vcards=[]; - const list=player.getStorage('rehuomo'); - for(let name of lib.inpile){ - if(get.type(name)!='basic'||list.includes(name)) continue; - let card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); - if(name=='sha'){ - for(let nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name,nature]); + chooseButton: { + dialog: function (event, player) { + const vcards = []; + const list = player.getStorage("rehuomo"); + for (let name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + let card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + if (name == "sha") { + for (let nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) + vcards.push(["基本", "", name, nature]); } } } - return ui.create.dialog('活墨',[vcards,'vcard'],'hidden'); + return ui.create.dialog("活墨", [vcards, "vcard"], "hidden"); }, - check:function(button){ - const player=_status.event.player; - const card={name:button.link[2],nature:button.link[3]}; - if(game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ - switch(button.link[2]){ - case 'tao':return 5; - case 'jiu':return 3.01; - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder') return 2.92; + check: function (button) { + const player = _status.event.player; + const card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": + return 3.01; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder") return 2.92; else return 2.9; - case 'shan':return 1; + case "shan": + return 1; } } return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - check:function(card){ - return 1/Math.max(0.1,get.value(card)); + check: function (card) { + return 1 / Math.max(0.1, get.value(card)); }, - filterCard:function(card){ - return get.type(card)!='basic'&&get.color(card)=='black'; + filterCard: function (card) { + return get.type(card) != "basic" && get.color(card) == "black"; }, - viewAs:{ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null, - isCard:true, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, }, - position:'he', - popname:true, - ignoreMod:true, - precontent:function(){ - player.logSkill('rehuomo'); - var card=event.result.cards[0]; - game.log(player,'将',card,'置于牌堆顶'); - player.loseToDiscardpile(card,ui.cardPile,'visible','insert').log=false; - var viewAs={name:event.result.card.name,nature:event.result.card.nature}; - event.result.card=viewAs; - event.result.cards=[]; - if(!player.storage.rehuomo){ - player.when({global:'phaseAfter'}).then(()=>{player.unmarkSkill('rehuomo')}); + position: "he", + popname: true, + ignoreMod: true, + precontent: function () { + player.logSkill("rehuomo"); + var card = event.result.cards[0]; + game.log(player, "将", card, "置于牌堆顶"); + player.loseToDiscardpile(card, ui.cardPile, "visible", "insert").log = false; + var viewAs = { + name: event.result.card.name, + nature: event.result.card.nature, + }; + event.result.card = viewAs; + event.result.cards = []; + if (!player.storage.rehuomo) { + player.when({ global: "phaseAfter" }).then(() => { + player.unmarkSkill("rehuomo"); + }); } - player.markAuto('rehuomo',viewAs.name) + player.markAuto("rehuomo", viewAs.name); }, - } + }; + }, + prompt: function (links, player) { + return ( + "将一张黑色非基本牌置于牌堆顶并视为使用一张" + + get.translation(links[0][3] || "") + + get.translation(links[0][2]) + ); }, - prompt:function(links,player){ - return '将一张黑色非基本牌置于牌堆顶并视为使用一张'+get.translation(links[0][3]||'')+get.translation(links[0][2]); - } }, - marktext:'墨', - intro:{ - content:'本回合已因〖活墨〗使用过$', - onunmark:true, + marktext: "墨", + intro: { + content: "本回合已因〖活墨〗使用过$", + onunmark: true, }, - ai:{ - order:function(){ - var player=_status.event.player; - var event=_status.event; - var list=player.getStorage('rehuomo'); - if(!list.includes('jiu')&&event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0){ + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + var list = player.getStorage("rehuomo"); + if ( + !list.includes("jiu") && + event.filterCard({ name: "jiu" }, player, event) && + get.effect(player, { name: "jiu" }) > 0 + ) { return 3.1; } return 2.9; }, - respondSha:true, - fireAttack:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='fireAttack') return true; - if(player.hasCard(function(card){ - return get.color(card)=='black'&&get.type(card)!='basic'; - },'he')){ - var list=player.getStorage('rehuomo'); - if(tag=='respondSha'){ - if(arg!='use') return false; - if(list.includes('sha')) return false; + respondSha: true, + fireAttack: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "fireAttack") return true; + if ( + player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "he") + ) { + var list = player.getStorage("rehuomo"); + if (tag == "respondSha") { + if (arg != "use") return false; + if (list.includes("sha")) return false; + } else if (tag == "respondShan") { + if (list.includes("shan")) return false; } - else if(tag=='respondShan'){ - if(list.includes('shan')) return false; - } - } - else{ + } else { return false; } }, - result:{ - player:1 - } - } + result: { + player: 1, + }, + }, }, //界张梁 - rejijun:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.targets&&event.targets.includes(player); + rejijun: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return event.targets && event.targets.includes(player); }, - frequent:true, - content:function(){ - player.judge(card=>1).callback=lib.skill.rejijun.callback; + frequent: true, + content: function () { + player.judge((card) => 1).callback = lib.skill.rejijun.callback; }, - callback:function(){ - if(typeof card.number=='number') player.addToExpansion(card,'gain2').gaintag.add('rejijun'); + callback: function () { + if (typeof card.number == "number") + player.addToExpansion(card, "gain2").gaintag.add("rejijun"); }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - marktext:'方', - ai:{combo:'refangtong'}, + marktext: "方", + ai: { combo: "refangtong" }, }, - refangtong:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('h'); + refangtong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h"); }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard(get.prompt2('refangtong'),(card,player)=>typeof card.number=='number').set('ai',card=>{ - var player=_status.event.player; - if(!game.hasPlayer(target=>target!=player&&get.damageEffect(target,player,player,'thunder')>0)) return 0; - if(player.getExpansions('rejijun').reduce(function(num,card){ - return num+get.number(card,false); - },0)>36) return 1/(get.value(card)||0.5); - else{ - if(lib.skill.refangtong.thunderEffect(card,player)) return 10-get.value(card); - return 5-get.value(card); - } - }); - 'step 1' - if(result.bool){ - player.logSkill('refangtong'); - player.addToExpansion(result.cards,player,'give').gaintag.add('rejijun'); - } - else event.finish(); - 'step 2' - player.chooseButton(['###是否移去任意张“方”,对一名其他角色造成1点雷属性伤害?###若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害',player.getExpansions('rejijun')],[1,player.getExpansions('rejijun').length]).set('ai',button=>{ - var player=_status.event.player; - var cards=player.getExpansions('rejijun'); - if(cards.reduce(function(num,card){ - return num+get.number(card,false); - },0)<=36){ - if(!ui.selected.buttons.length) return 1/get.number(button.link,false); - return 0; - } - else{ - var num=0,list=[]; - cards.sort((a,b)=>get.number(b,false)-get.number(a,false)); - for(var i=0;i36) break; + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + get.prompt2("refangtong"), + (card, player) => typeof card.number == "number" + ) + .set("ai", (card) => { + var player = _status.event.player; + if ( + !game.hasPlayer( + (target) => + target != player && + get.damageEffect(target, player, player, "thunder") > 0 + ) + ) + return 0; + if ( + player.getExpansions("rejijun").reduce(function (num, card) { + return num + get.number(card, false); + }, 0) > 36 + ) + return 1 / (get.value(card) || 0.5); + else { + if (lib.skill.refangtong.thunderEffect(card, player)) + return 10 - get.value(card); + return 5 - get.value(card); } - return list.includes(button.link)?1:0; - } - }); - 'step 3' - if(result.bool){ - var bool=(result.links.reduce(function(num,card){ - return num+get.number(card,false); - },0)>36); - event.bool=bool; + }); + ("step 1"); + if (result.bool) { + player.logSkill("refangtong"); + player.addToExpansion(result.cards, player, "give").gaintag.add("rejijun"); + } else event.finish(); + ("step 2"); + player + .chooseButton( + [ + "###是否移去任意张“方”,对一名其他角色造成1点雷属性伤害?###若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害", + player.getExpansions("rejijun"), + ], + [1, player.getExpansions("rejijun").length] + ) + .set("ai", (button) => { + var player = _status.event.player; + var cards = player.getExpansions("rejijun"); + if ( + cards.reduce(function (num, card) { + return num + get.number(card, false); + }, 0) <= 36 + ) { + if (!ui.selected.buttons.length) return 1 / get.number(button.link, false); + return 0; + } else { + var num = 0, + list = []; + cards.sort((a, b) => get.number(b, false) - get.number(a, false)); + for (var i = 0; i < cards.length; i++) { + list.push(cards[i]); + num += get.number(cards[i], false); + if (num > 36) break; + } + return list.includes(button.link) ? 1 : 0; + } + }); + ("step 3"); + if (result.bool) { + var bool = + result.links.reduce(function (num, card) { + return num + get.number(card, false); + }, 0) > 36; + event.bool = bool; player.loseToDiscardpile(result.links); - player.chooseTarget('请选择一名其他角色','对其造成'+(bool?3:1)+'点雷属性伤害',lib.filter.notMe).set('ai',target=>get.damageEffect(target,_status.event.player,_status.event.player,'thunder')); - } - else event.finish(); - 'step 4' - if(result.bool){ - var target=result.targets[0]; + player + .chooseTarget( + "请选择一名其他角色", + "对其造成" + (bool ? 3 : 1) + "点雷属性伤害", + lib.filter.notMe + ) + .set("ai", (target) => + get.damageEffect( + target, + _status.event.player, + _status.event.player, + "thunder" + ) + ); + } else event.finish(); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - target.damage(event.bool?3:1,'thunder'); + target.damage(event.bool ? 3 : 1, "thunder"); } }, - thunderEffect:function(card,player){ - var cards=player.getExpansions('rejijun'),num=0; + thunderEffect: function (card, player) { + var cards = player.getExpansions("rejijun"), + num = 0; cards.push(card); - if(cards.reduce(function(num,card){ - return num+get.number(card,false); - },0)<=36) return false; - cards.sort((a,b)=>get.number(b,false)-get.number(a,false)); - var bool=false; - for(var i=0;i36) break; + if ( + cards.reduce(function (num, card) { + return num + get.number(card, false); + }, 0) <= 36 + ) + return false; + cards.sort((a, b) => get.number(b, false) - get.number(a, false)); + var bool = false; + for (var i = 0; i < cards.length; i++) { + if (cards[i] == card) bool = true; + num += get.number(cards[i], false); + if (num > 36) break; } return bool; }, - ai:{combo:'rejijun'}, + ai: { combo: "rejijun" }, }, //界司马朗 - requji:{ - inherit:'quji', - content:function(){ - 'step 0' + requji: { + inherit: "quji", + content: function () { + "step 0"; target.recover(); - 'step 1' - if(target.isDamaged()) target.draw(); - 'step 2' - if(target==targets[targets.length-1]&&cards.some(card=>get.color(card,player)=='black')) player.loseHp(); + ("step 1"); + if (target.isDamaged()) target.draw(); + ("step 2"); + if ( + target == targets[targets.length - 1] && + cards.some((card) => get.color(card, player) == "black") + ) + player.loseHp(); }, }, - rejunbing:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player.countCards('h')0); - 'step 1' - if(result.bool){ - player.logSkill('rejunbing',target); - if(target!=player) game.log(target,'响应了',player,'的','#g【郡兵】'); + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + event.player = player; + event.target = target; + target + .chooseBool( + target == player + ? get.prompt("rejunbing") + : "是否响应" + get.translation(player) + "的【郡兵】?", + "摸一张牌" + + (target == player + ? "" + : ",将所有手牌交给" + + get.translation(player) + + ",然后其可以交给你等量张牌") + ) + .set("choice", get.attitude(target, player) > 0); + ("step 1"); + if (result.bool) { + player.logSkill("rejunbing", target); + if (target != player) game.log(target, "响应了", player, "的", "#g【郡兵】"); target.draw(); + } else event.finish(); + ("step 2"); + var cards = target.getCards("h"); + if (target == player || !cards.length) { + event.finish(); + return; } - else event.finish(); - 'step 2' - var cards=target.getCards('h'); - if(target==player||!cards.length){event.finish();return;} - target.give(cards,player); - event.num=cards.length; - 'step 3' - if(player.countCards('he'){ - var player=_status.event.player; - var target=_status.event.target; - if(get.attitude(player,target)<=0){ - if(card.name=='du') return 1145141919810; - return -get.value(card); - } - return 6-get.value(card); - }).set('target',target); - 'step 4' - if(result.bool) player.give(result.cards,target); + target.give(cards, player); + event.num = cards.length; + ("step 3"); + if (player.countCards("he") < num) event.finish(); + else + player + .chooseCard( + "郡兵:是否还给" + get.translation(target) + get.translation(num) + "张牌?", + "he", + num + ) + .set("ai", (card) => { + var player = _status.event.player; + var target = _status.event.target; + if (get.attitude(player, target) <= 0) { + if (card.name == "du") return 1145141919810; + return -get.value(card); + } + return 6 - get.value(card); + }) + .set("target", target); + ("step 4"); + if (result.bool) player.give(result.cards, target); }, }, //界诸葛诞 - regongao:{ - audio:2, - trigger:{global:'dying'}, - filter:function(event,player){ - if(player==event.player) return false; - return !player.getAllHistory('useSkill',evt=>evt.skill=='regongao'&&evt.targets[0]==event.player).length; + regongao: { + audio: 2, + trigger: { global: "dying" }, + filter: function (event, player) { + if (player == event.player) return false; + return !player.getAllHistory( + "useSkill", + (evt) => evt.skill == "regongao" && evt.targets[0] == event.player + ).length; }, - forced:true, - logTarget:'player', - content:function(){ + forced: true, + logTarget: "player", + content: function () { player.gainMaxHp(); player.recover(); }, }, - rejuyi:{ - unique:true, - audio:2, - derivation:['benghuai','reweizhong'], - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.maxHp>game.countPlayer()&&player.isDamaged(); + rejuyi: { + unique: true, + audio: 2, + derivation: ["benghuai", "reweizhong"], + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.maxHp > game.countPlayer() && player.isDamaged(); }, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - 'step 0' - player.awakenSkill('rejuyi'); - 'step 1' + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("rejuyi"); + ("step 1"); player.drawTo(player.maxHp); - 'step 2' - player.addSkills(['benghuai','reweizhong']); - } + ("step 2"); + player.addSkills(["benghuai", "reweizhong"]); + }, }, - reweizhong:{ - audio:2, - inherit:'weizhong', - content:function(){ + reweizhong: { + audio: 2, + inherit: "weizhong", + content: function () { player.draw(2); }, }, //堪比界曹冲的界曹叡 - remingjian:{ - inherit:'mingjian', - content:function(){ - player.give(cards,target); - target.addTempSkill('remingjian_buff',{player:'phaseAfter'}); - if(!target.storage.remingjian_buff) target.storage.remingjian_buff=[]; + remingjian: { + inherit: "mingjian", + content: function () { + player.give(cards, target); + target.addTempSkill("remingjian_buff", { player: "phaseAfter" }); + if (!target.storage.remingjian_buff) target.storage.remingjian_buff = []; target.storage.remingjian_buff.push(player); - target.markSkill('remingjian_buff'); + target.markSkill("remingjian_buff"); }, - subSkill:{ - buff:{ - charlotte:true, - mark:true, - marktext:'鉴', - intro:{ - content:(storage,player)=>{ - const num=storage.length; - return `
  • 被${get.translation(storage.toUniqued())}鉴识
  • 手牌上限+${num},出杀次数+${num}`; + subSkill: { + buff: { + charlotte: true, + mark: true, + marktext: "鉴", + intro: { + content: (storage, player) => { + const num = storage.length; + return `
  • 被${get.translation( + storage.toUniqued() + )}鉴识
  • 手牌上限+${num},出杀次数+${num}`; }, }, - onremove:true, - trigger:{ - source:'damageSource', + onremove: true, + trigger: { + source: "damageSource", }, - filter:function(event,player){ - if(_status.currentPhase!=player) return false; - return player.getHistory('sourceDamage').indexOf(event)==0&&player.getStorage('remingjian_buff').some(i=>i.isIn()); + filter: function (event, player) { + if (_status.currentPhase != player) return false; + return ( + player.getHistory("sourceDamage").indexOf(event) == 0 && + player.getStorage("remingjian_buff").some((i) => i.isIn()) + ); }, - content:function*(event,map){ - const player=map.player; - const masters=player.getStorage('remingjian_buff').filter(i=>i.isIn()).toUniqued().sortBySeat(_status.currentPhase); - while(masters.length){ - const master=masters.shift(); - if(!master.isIn()) continue; - const result=yield player.chooseBool(`是否令${get.translation(master)}发动一次〖恢拓〗?`).set('choice',get.attitude(player,master)>0); - if(!result.bool) continue; - if(!player.isUnderControl(true)&&!event.isOnline()) game.delayx(); - player.logSkill('remingjian_buff',master); - const next=game.createEvent('huituo'); + content: function* (event, map) { + const player = map.player; + const masters = player + .getStorage("remingjian_buff") + .filter((i) => i.isIn()) + .toUniqued() + .sortBySeat(_status.currentPhase); + while (masters.length) { + const master = masters.shift(); + if (!master.isIn()) continue; + const result = yield player + .chooseBool(`是否令${get.translation(master)}发动一次〖恢拓〗?`) + .set("choice", get.attitude(player, master) > 0); + if (!result.bool) continue; + if (!player.isUnderControl(true) && !event.isOnline()) game.delayx(); + player.logSkill("remingjian_buff", master); + const next = game.createEvent("huituo"); next.setContent(lib.skill.huituo.content); - next.player=master; - next.forced=true; - next._trigger=map.trigger; + next.player = master; + next.forced = true; + next._trigger = map.trigger; yield next; } }, - mod:{ - maxHandcard:function(player,num){ - return num+player.getStorage('remingjian_buff').length; + mod: { + maxHandcard: function (player, num) { + return num + player.getStorage("remingjian_buff").length; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") + return num + player.getStorage("remingjian_buff").length; }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.getStorage('remingjian_buff').length; - } }, - } + }, }, }, - rexingshuai:{ - audio:2, - skillAnimation:true, - animationColor:'thunder', - trigger:{player:'dying'}, - zhuSkill:true, - filter:function(event,player){ - if(player.hp>0) return false; - if(!player.hasZhuSkill('rexingshuai')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'; + rexingshuai: { + audio: 2, + skillAnimation: true, + animationColor: "thunder", + trigger: { player: "dying" }, + zhuSkill: true, + filter: function (event, player) { + if (player.hp > 0) return false; + if (!player.hasZhuSkill("rexingshuai")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; }); }, - limited:true, - mark:true, - content:function(){ - 'step 0' - player.awakenSkill('rexingshuai'); - var targets=game.filterPlayer(); + limited: true, + mark: true, + content: function () { + "step 0"; + player.awakenSkill("rexingshuai"); + var targets = game.filterPlayer(); targets.sortBySeat(_status.currentPhase); targets.remove(player); - event.targets=targets; - event.damages=[]; - player.addSkill('rexingshuai_restore'); - 'step 1' - if(event.targets.length){ - var current=event.targets.shift(); - if(current.group=='wei'){ - current.chooseBool('是否令'+get.translation(player)+'回复1点体力?').set('ai',function(){ - return get.attitude(_status.event.player,_status.event.target)>2; - }).set('target',player); - event.current=current; - } - else{ + event.targets = targets; + event.damages = []; + player.addSkill("rexingshuai_restore"); + ("step 1"); + if (event.targets.length) { + var current = event.targets.shift(); + if (current.group == "wei") { + current + .chooseBool("是否令" + get.translation(player) + "回复1点体力?") + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) > 2; + }) + .set("target", player); + event.current = current; + } else { event.redo(); } - } - else{ + } else { event.goto(3); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { event.damages.push(event.current); - event.current.line(player,'green'); - game.log(event.current,'令',player,'回复1点体力'); + event.current.line(player, "green"); + game.log(event.current, "令", player, "回复1点体力"); player.recover(); } - if(event.targets.length){ + if (event.targets.length) { event.goto(1); } - 'step 3' - if(event.damages.length){ - var next=game.createEvent('rexingshuai_next'); + ("step 3"); + if (event.damages.length) { + var next = game.createEvent("rexingshuai_next"); event.next.remove(next); trigger.after.push(next); - next.targets=event.damages; - next.setContent(function(){ + next.targets = event.damages; + next.setContent(function () { targets.shift().damage(); - if(targets.length) event.redo(); + if (targets.length) event.redo(); }); } }, - subSkill:{ - restore:{ - trigger:{ - global:'dieAfter', + subSkill: { + restore: { + trigger: { + global: "dieAfter", }, - charlotte:true, - forced:true, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source.hasSkill('mingjian2'); + charlotte: true, + forced: true, + filter: function (event, player) { + return event.source && event.source.isIn() && event.source.hasSkill("mingjian2"); + }, + content: function () { + player.restoreSkill("rexingshuai"); + game.log(player, "重置了", "#g【兴衰】"); }, - content:function(){ - player.restoreSkill('rexingshuai'); - game.log(player,'重置了','#g【兴衰】'); - } }, - } + }, }, //不想突破可以不突破的界曹冲 - rechengxiang:{ - audio:2, - group:'rechengxiang_gain', - trigger:{ - player:'rechengxiang_gainEnd', + rechengxiang: { + audio: 2, + group: "rechengxiang_gain", + trigger: { + player: "rechengxiang_gainEnd", }, - direct:true, - subfrequent:['gain'], - filter:function(event,player){ - return event.cards2&&event.cards2.map(card=>{ - return get.number(card); - }).reduce((sum,num)=>{ - return sum+=num; - },0)==13; + direct: true, + subfrequent: ["gain"], + filter: function (event, player) { + return ( + event.cards2 && + event.cards2 + .map((card) => { + return get.number(card); + }) + .reduce((sum, num) => { + return (sum += num); + }, 0) == 13 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.link(false); - 'step 1' + ("step 1"); player.turnOver(false); }, - subSkill:{ - gain:{ - inherit:'chengxiang', - audio:'rechengxiang', - } - } + subSkill: { + gain: { + inherit: "chengxiang", + audio: "rechengxiang", + }, + }, }, //OL界二张 - olzhijian:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0; + olzhijian: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; }, - filterCard:function(card){ - return get.type(card)=='equip'; + filterCard: function (card) { + return get.type(card) == "equip"; }, - position:'he', - check:function(card){ - var player=_status.currentPhase; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); + position: "he", + check: function (card) { + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); } - return 6-get.value(card); + return 6 - get.value(card); }, - filterTarget:function(card,player,target){ - if(target.isMin()) return false; - return player!=target&&target.canEquip(card,true); + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + return player != target && target.canEquip(card, true); }, - content:function(){ + content: function () { target.equip(cards[0]); player.draw(); }, - discard:false, - lose:false, - prepare:function(cards,player,targets){ - player.$give(cards,targets[0],false); + discard: false, + lose: false, + prepare: function (cards, player, targets) { + player.$give(cards, targets[0], false); }, - ai:{ - basic:{ - order:10 + ai: { + basic: { + order: 10, }, - result:{ - target:function(player,target){ - var card=ui.selected.cards[0]; - if(card) return get.effect(target,card,target,target); + result: { + target: function (player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); return 0; }, }, - threaten:1.35 - } - }, - olguzheng:{ - audio:2, - trigger:{ - global:['loseAfter','loseAsyncAfter'], + threaten: 1.35, }, - filter:function(event,player){ - if(event.type!='discard') return false; - if(player.hasSkill('olguzheng_used')) return false; + }, + olguzheng: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], + }, + filter: function (event, player) { + if (event.type != "discard") return false; + if (player.hasSkill("olguzheng_used")) return false; var phaseName; - for(var name of lib.phaseName){ - var evt=event.getParent(name); - if(!evt||evt.name!=name) continue; - phaseName=name; + for (var name of lib.phaseName) { + var evt = event.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; break; } - if(!phaseName) return false; - return game.hasPlayer(current=>{ - if(current==player) return false; - var evt=event.getl(current); - if(!evt||!evt.cards2||evt.cards2.filterInD('d').length<2) return false; + if (!phaseName) return false; + return game.hasPlayer((current) => { + if (current == player) return false; + var evt = event.getl(current); + if (!evt || !evt.cards2 || evt.cards2.filterInD("d").length < 2) return false; return true; }); }, - checkx:function(event,player,cards){ - if(cards.length>2||get.attitude(player,event.player)>0) return true; - for(var i=0;i 2 || get.attitude(player, event.player) > 0) return true; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i], event.player, "raw") < 0) return true; } return false; }, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - var targets=[],cardsList=[]; - var players=game.filterPlayer().sortBySeat(_status.currentPhase); - for(var current of players){ - if(current==player) continue; - var cards=[]; - var evt=trigger.getl(current); - if(!evt||!evt.cards2) continue; - var cardsx=evt.cards2.filterInD('d'); + direct: true, + preHidden: true, + content: function () { + "step 0"; + var targets = [], + cardsList = []; + var players = game.filterPlayer().sortBySeat(_status.currentPhase); + for (var current of players) { + if (current == player) continue; + var cards = []; + var evt = trigger.getl(current); + if (!evt || !evt.cards2) continue; + var cardsx = evt.cards2.filterInD("d"); cards.addArray(cardsx); - if(cards.length){ + if (cards.length) { targets.push(current); cardsList.push(cards); } } - event.targets=targets; - event.cardsList=cardsList; - 'step 1' - var target=targets.shift(); - var cards=event.cardsList.shift(); - event.target=target; - event.cards=cards; - player.chooseButton(2,[ - get.prompt('olguzheng',target), - '被选择的牌将成为对方收回的牌', - cards, - [['获得剩余的牌','放弃剩余的牌'],'tdnodes'], - ]).set('filterButton',function(button){ - var type=typeof button.link; - if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; - return true; - }).set('check',lib.skill.olguzheng.checkx(trigger,player,cards)).set('ai',function(button){ - if(typeof button.link=='string'){ - return button.link=='获得剩余的牌'?1:0; - } - if(_status.event.check){ - return 20-get.value(button.link,_status.event.getTrigger().player); - } - return 0; - }).setHiddenSkill('olguzheng'); - 'step 2' - if(result.bool){ - player.logSkill('olguzheng',target); - player.addTempSkill('olguzheng_used',['phaseZhunbeiAfter','phaseDrawAfter','phaseJudgeAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); - if(typeof result.links[0]!='string') result.links.reverse(); - var card=result.links[1]; - target.gain(card,'gain2'); + event.targets = targets; + event.cardsList = cardsList; + ("step 1"); + var target = targets.shift(); + var cards = event.cardsList.shift(); + event.target = target; + event.cards = cards; + player + .chooseButton(2, [ + get.prompt("olguzheng", target), + '被选择的牌将成为对方收回的牌', + cards, + [["获得剩余的牌", "放弃剩余的牌"], "tdnodes"], + ]) + .set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) + return false; + return true; + }) + .set("check", lib.skill.olguzheng.checkx(trigger, player, cards)) + .set("ai", function (button) { + if (typeof button.link == "string") { + return button.link == "获得剩余的牌" ? 1 : 0; + } + if (_status.event.check) { + return 20 - get.value(button.link, _status.event.getTrigger().player); + } + return 0; + }) + .setHiddenSkill("olguzheng"); + ("step 2"); + if (result.bool) { + player.logSkill("olguzheng", target); + player.addTempSkill("olguzheng_used", [ + "phaseZhunbeiAfter", + "phaseDrawAfter", + "phaseJudgeAfter", + "phaseUseAfter", + "phaseDiscardAfter", + "phaseJieshuAfter", + ]); + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1]; + target.gain(card, "gain2"); event.cards.remove(card); - if(result.links[0]!='获得剩余的牌') event.finish(); - } - else if(event.targets.length) event.goto(1); + if (result.links[0] != "获得剩余的牌") event.finish(); + } else if (event.targets.length) event.goto(1); else event.finish(); - 'step 3' - var cards=cards.filterInD('d'); - if(cards.length>0) player.gain(cards,'gain2'); + ("step 3"); + var cards = cards.filterInD("d"); + if (cards.length > 0) player.gain(cards, "gain2"); }, - ai:{ - threaten:1.3, - expose:0.2 + ai: { + threaten: 1.3, + expose: 0.2, }, - subSkill:{ - used:{ - charlotte:true, - } + subSkill: { + used: { + charlotte: true, + }, }, }, //SP黄月英 - rejiqiao:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + rejiqiao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('rejiqiao'),[1,player.countCards('he')],'he').set('ai',function(card){ - if(card.name=='bagua') return 10; - return 7-get.value(card); - }).set('logSkill','rejiqiao'); - 'step 1' - if(result.bool){ - var num=result.cards.length; - for(var i of result.cards){ - if(get.type(i,false)=='equip') num++; + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("rejiqiao"), [1, player.countCards("he")], "he") + .set("ai", function (card) { + if (card.name == "bagua") return 10; + return 7 - get.value(card); + }) + .set("logSkill", "rejiqiao"); + ("step 1"); + if (result.bool) { + var num = result.cards.length; + for (var i of result.cards) { + if (get.type(i, false) == "equip") num++; } - event.cards=game.cardsGotoOrdering(get.cards(num)).cards; + event.cards = game.cardsGotoOrdering(get.cards(num)).cards; player.showCards(event.cards); - } - else{ + } else { event.finish(); } - 'step 2' - var gained=[]; - var tothrow=[]; - for(var i=0;i get.subtypes(i).includes("equip5"))) + return false; } - else if(event.name!='phase'&&(event.name!='equip'||event.player!=player)){ - var evt=event.getl(player); - if(!evt||!evt.es||!evt.es.some(i=>get.subtypes(i).includes('equip5'))) return false; - } - var skills=player.additionalSkills['relinglong']; - return (skills&&skills.length>0)!=player.hasEmptySlot(5); + var skills = player.additionalSkills["relinglong"]; + return (skills && skills.length > 0) != player.hasEmptySlot(5); }, - direct:true, - content:function(){ - player.removeAdditionalSkill('relinglong'); - if(player.hasEmptySlot(5)){ - player.addAdditionalSkill('relinglong',['reqicai']); + direct: true, + content: function () { + player.removeAdditionalSkill("relinglong"); + if (player.hasEmptySlot(5)) { + player.addAdditionalSkill("relinglong", ["reqicai"]); } }, - group:['linglong_bagua','relinglong_directhit'], - mod:{ - maxHandcard:function(player,num){ - if(!player.hasEmptySlot(3)||!player.hasEmptySlot(4)) return; - return num+2; + group: ["linglong_bagua", "relinglong_directhit"], + mod: { + maxHandcard: function (player, num) { + if (!player.hasEmptySlot(3) || !player.hasEmptySlot(4)) return; + return num + 2; }, }, - subSkill:{ - directhit:{ - audio:'relinglong', - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(event.card.name!='sha'&&get.type(event.card,false)!='trick') return false; - for(var i=2;i<6;i++){ - if(!player.hasEmptySlot(i)) return false; + subSkill: { + directhit: { + audio: "relinglong", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha" && get.type(event.card, false) != "trick") + return false; + for (var i = 2; i < 6; i++) { + if (!player.hasEmptySlot(i)) return false; } return true; }, - content:function(){ + content: function () { trigger.directHit.addArray(game.players); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.card||!arg.target||(arg.card.name!='sha'&&get.type(arg.card,false)!='trick')) return false; - for(var i=2;i<6;i++){ - if(!player.hasEmptySlot(i)) return false; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + !arg || + !arg.card || + !arg.target || + (arg.card.name != "sha" && get.type(arg.card, false) != "trick") + ) + return false; + for (var i = 2; i < 6; i++) { + if (!player.hasEmptySlot(i)) return false; } return true; }, }, - } - } + }, + }, }, //张松 - rexiantu:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return event.player!=player; + rexiantu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player != player; }, - logTarget:'player', - check:function(event,player){ - if(get.attitude(_status.event.player,event.player)<1) return false; - return player.hp>1||player.hasCard(card=>(get.name(card)==='tao'||get.name(card)==='jiu')&&lib.filter.cardEnabled(card,player),'hs'); + logTarget: "player", + check: function (event, player) { + if (get.attitude(_status.event.player, event.player) < 1) return false; + return ( + player.hp > 1 || + player.hasCard( + (card) => + (get.name(card) === "tao" || get.name(card) === "jiu") && + lib.filter.cardEnabled(card, player), + "hs" + ) + ); }, - content:function(){ - 'step 0' - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2); + content: function () { + "step 0"; + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); player.draw(2); - 'step 1' - var cards=player.getCards('he'); - if(!cards.length) event.finish(); - else if(cards.length<=2) event._result={cards:cards}; - else player.chooseCard(2,'he',true,'交给'+get.translation(trigger.player)+'两张牌').set('ai',function(card){ - if(ui.selected.cards.length&&card.name==ui.selected.cards[0].name) return -1; - if(get.tag(card,'damage')) return 1; - if(get.type(card)=='equip') return 1; - return 0; - }); - 'step 2' - player.give(result.cards,trigger.player); - trigger.player.addTempSkill('rexiantu_check','phaseUseAfter'); - trigger.player.markAuto('rexiantu_check',[player]); + ("step 1"); + var cards = player.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { cards: cards }; + else + player + .chooseCard(2, "he", true, "交给" + get.translation(trigger.player) + "两张牌") + .set("ai", function (card) { + if (ui.selected.cards.length && card.name == ui.selected.cards[0].name) + return -1; + if (get.tag(card, "damage")) return 1; + if (get.type(card) == "equip") return 1; + return 0; + }); + ("step 2"); + player.give(result.cards, trigger.player); + trigger.player.addTempSkill("rexiantu_check", "phaseUseAfter"); + trigger.player.markAuto("rexiantu_check", [player]); }, - ai:{ - threaten:function(player,target){ - return 1+game.countPlayer((current)=>{ - if(current!=target&&get.attitude(target,current)>0) return 0.5; - return 0; - }); + ai: { + threaten: function (player, target) { + return ( + 1 + + game.countPlayer((current) => { + if (current != target && get.attitude(target, current) > 0) return 0.5; + return 0; + }) + ); }, - expose:0.3 + expose: 0.3, }, - subSkill:{ - check:{ - charlotte:true, - trigger:{player:'phaseUseEnd'}, - forced:true, - popup:false, - onremove:true, - filter:function(event,player){ - return !player.getHistory('sourceDamage',evt=>{ - return evt.getParent('phaseUse')==event; + subSkill: { + check: { + charlotte: true, + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + onremove: true, + filter: function (event, player) { + return !player.getHistory("sourceDamage", (evt) => { + return evt.getParent("phaseUse") == event; }).length; }, - content:function(){ - var targets=player.getStorage('rexiantu_check'); + content: function () { + var targets = player.getStorage("rexiantu_check"); targets.sortBySeat(); - for(var i of targets){ - if(i.isIn()){ + for (var i of targets) { + if (i.isIn()) { i.loseHp(); } } - player.removeSkill('rexiantu_check'); - } - } - } + player.removeSkill("rexiantu_check"); + }, + }, + }, }, //新服公孙瓒 - dcyicong:{ - trigger:{ - player:["changeHp"], + dcyicong: { + trigger: { + player: ["changeHp"], }, - audio:2, - forced:true, - filter:function(event,player){ - return get.sgn(player.getDamagedHp()-1.5)!=get.sgn(player.getDamagedHp()-1.5+event.num); + audio: 2, + forced: true, + filter: function (event, player) { + return ( + get.sgn(player.getDamagedHp() - 1.5) != + get.sgn(player.getDamagedHp() - 1.5 + event.num) + ); }, - content:function (){}, - mod:{ - globalFrom:function(from,to,current){ - return current-1; + content: function () {}, + mod: { + globalFrom: function (from, to, current) { + return current - 1; }, - globalTo:function(from,to,current){ - if(to.getDamagedHp()>=2) return current+1; + globalTo: function (from, to, current) { + if (to.getDamagedHp() >= 2) return current + 1; }, }, - ai:{ - threaten:0.8 - } + ai: { + threaten: 0.8, + }, }, //朱治 - reanguo:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - if(target.isMinHandcard()){ + reanguo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + if (target.isMinHandcard()) { target.draw(); - event.h=true; + event.h = true; } - 'step 1' - if(target.isMinHp()&&target.isDamaged()){ + ("step 1"); + if (target.isMinHp() && target.isDamaged()) { target.recover(); - event.hp=true; + event.hp = true; } - 'step 2' - var equip=get.cardPile(function(card){ - return get.type(card)=='equip'&&target.hasUseTarget(card); + ("step 2"); + var equip = get.cardPile(function (card) { + return get.type(card) == "equip" && target.hasUseTarget(card); }); - if(target.isMinEquip()&&equip){ - target.chooseUseTarget(equip,'nothrow','nopopup',true); - event.e=true; + if (target.isMinEquip() && equip) { + target.chooseUseTarget(equip, "nothrow", "nopopup", true); + event.e = true; } - 'step 3' + ("step 3"); game.updateRoundNumber(); - if(!event.h&&player.isMinHandcard()){ + if (!event.h && player.isMinHandcard()) { player.draw(); - event.h=true; + event.h = true; } - 'step 4' - if(!event.hp&&player.isMinHp()&&player.isDamaged()){ + ("step 4"); + if (!event.hp && player.isMinHp() && player.isDamaged()) { player.recover(); - event.hp=true; + event.hp = true; } - 'step 5' - if(!event.e&&player.isMinEquip()){ - var equip=get.cardPile(function(card){ - return get.type(card)=='equip'&&player.hasUseTarget(card); + ("step 5"); + if (!event.e && player.isMinEquip()) { + var equip = get.cardPile(function (card) { + return get.type(card) == "equip" && player.hasUseTarget(card); }); - if(equip){ - player.chooseUseTarget(equip,'nothrow','nopopup',true); - event.e=true; + if (equip) { + player.chooseUseTarget(equip, "nothrow", "nopopup", true); + event.e = true; } } - 'step 6' - if(event.h&&event.hp&&event.e){ - player.chooseCard('安国:是否重铸任意张牌?',[1,Infinity],lib.filter.cardRecastable,'he').set('ai',card=>{ - return 6-get.value(card); - }); - } - else event.finish(); - 'step 7' - if(result.bool){ + ("step 6"); + if (event.h && event.hp && event.e) { + player + .chooseCard( + "安国:是否重铸任意张牌?", + [1, Infinity], + lib.filter.cardRecastable, + "he" + ) + .set("ai", (card) => { + return 6 - get.value(card); + }); + } else event.finish(); + ("step 7"); + if (result.bool) { player.recast(result.cards); } }, - ai:{ - threaten:1.65, - order:9, - result:{ - player:function(player,target){ - if(get.attitude(player,target)<=0){ - if(target.isMinHandcard()||target.isMinEquip()||target.isMinHp()) return -1; + ai: { + threaten: 1.65, + order: 9, + result: { + player: function (player, target) { + if (get.attitude(player, target) <= 0) { + if (target.isMinHandcard() || target.isMinEquip() || target.isMinHp()) + return -1; } - var num=0; - if(player.isMinHandcard()||target.isMinHandcard()) num++; - if(player.isMinEquip()||target.isMinEquip()) num++; - if((player.isMinHp()&&player.isDamaged())||(target.isMinHp()&&target.isDamaged())) num+=2.1; + var num = 0; + if (player.isMinHandcard() || target.isMinHandcard()) num++; + if (player.isMinEquip() || target.isMinEquip()) num++; + if ( + (player.isMinHp() && player.isDamaged()) || + (target.isMinHp() && target.isDamaged()) + ) + num += 2.1; return num; - } - } - } + }, + }, + }, }, //颜良文丑 - olshuangxiong:{ - audio:2, - trigger:{player:'phaseDrawEnd'}, - direct:true, - filter:(event,player)=>player.countCards('he')>0, - content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('olshuangxiong'),'弃置一张牌,然后你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用').set('ai',function(card){ - let player=_status.event.player; - if(!_status.event.goon||player.skipList.includes('phaseUse')) return -get.value(card); - let color=get.color(card),effect=0,cards=player.getCards('hes'),sha=false; - for(var cardx of cards){ - if(cardx==card||get.color(cardx)==color) continue; - var cardy=get.autoViewAs({name:'juedou'},[cardx]),eff1=player.getUseValue(cardy); - if(get.position(cardx)=='e'){ - var eff2=get.value(cardx); - if(eff1>eff2) effect+=(eff1-eff2); - continue; - } - else if(get.name(cardx)=='sha'){ - if(sha){ - effect+=eff1; + olshuangxiong: { + audio: 2, + trigger: { player: "phaseDrawEnd" }, + direct: true, + filter: (event, player) => player.countCards("he") > 0, + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + get.prompt("olshuangxiong"), + "弃置一张牌,然后你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用" + ) + .set("ai", function (card) { + let player = _status.event.player; + if (!_status.event.goon || player.skipList.includes("phaseUse")) + return -get.value(card); + let color = get.color(card), + effect = 0, + cards = player.getCards("hes"), + sha = false; + for (var cardx of cards) { + if (cardx == card || get.color(cardx) == color) continue; + var cardy = get.autoViewAs({ name: "juedou" }, [cardx]), + eff1 = player.getUseValue(cardy); + if (get.position(cardx) == "e") { + var eff2 = get.value(cardx); + if (eff1 > eff2) effect += eff1 - eff2; continue; + } else if (get.name(cardx) == "sha") { + if (sha) { + effect += eff1; + continue; + } else sha = true; } - else sha=true; + var eff2 = player.getUseValue(cardx, null, true); + if (eff1 > eff2) effect += eff1 - eff2; } - var eff2=player.getUseValue(cardx,null,true); - if(eff1>eff2) effect+=(eff1-eff2); - } - return effect-get.value(card); - }).set('goon',player.hasValueTarget({name:'juedou'})&&!player.hasSkill('olshuangxiong_effect')).logSkill='olshuangxiong'; - 'step 1' - if(result.bool){ - var color=get.color(result.cards[0],player); - player.markAuto('olshuangxiong_effect',[color]); - player.addTempSkill('olshuangxiong_effect'); + return effect - get.value(card); + }) + .set( + "goon", + player.hasValueTarget({ name: "juedou" }) && + !player.hasSkill("olshuangxiong_effect") + ).logSkill = "olshuangxiong"; + ("step 1"); + if (result.bool) { + var color = get.color(result.cards[0], player); + player.markAuto("olshuangxiong_effect", [color]); + player.addTempSkill("olshuangxiong_effect"); } }, - group:'olshuangxiong_jianxiong', - subSkill:{ - effect:{ - audio:'olshuangxiong', - enable:'chooseToUse', - viewAs:{name:'juedou'}, - position:'hes', - viewAsFilter:function(player){ - return player.hasCard(card=>lib.skill.olshuangxiong_effect.filterCard(card,player),'hes'); + group: "olshuangxiong_jianxiong", + subSkill: { + effect: { + audio: "olshuangxiong", + enable: "chooseToUse", + viewAs: { name: "juedou" }, + position: "hes", + viewAsFilter: function (player) { + return player.hasCard( + (card) => lib.skill.olshuangxiong_effect.filterCard(card, player), + "hes" + ); }, - filterCard:function(card,player){ - var color=get.color(card),colors=player.getStorage('olshuangxiong_effect'); - for(var i of colors){ - if(color!=i) return true; + filterCard: function (card, player) { + var color = get.color(card), + colors = player.getStorage("olshuangxiong_effect"); + for (var i of colors) { + if (color != i) return true; } return false; }, - prompt:function(){ - var colors=_status.event.player.getStorage('olshuangxiong_effect'); - var str='将一张颜色'; - for(var i=0;i0) str+='或'; - str+='不为'; - str+=get.translation(colors[i]); + prompt: function () { + var colors = _status.event.player.getStorage("olshuangxiong_effect"); + var str = "将一张颜色"; + for (var i = 0; i < colors.length; i++) { + if (i > 0) str += "或"; + str += "不为"; + str += get.translation(colors[i]); } - str+='的牌当做【决斗】使用'; + str += "的牌当做【决斗】使用"; return str; }, - check:function(card){ - var player=_status.event.player; - if(get.position(card)=='e'){ - var raw=get.value(card); - var eff=player.getUseValue(get.autoViewAs({name:'juedou'},[card])); - return eff-raw; + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e") { + var raw = get.value(card); + var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); + return eff - raw; } - var raw=player.getUseValue(card,null,true); - var eff=player.getUseValue(get.autoViewAs({name:'juedou'},[card])); - return eff-raw; + var raw = player.getUseValue(card, null, true); + var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); + return eff - raw; }, - onremove:true, - charlotte:true, - ai:{order:7}, + onremove: true, + charlotte: true, + ai: { order: 7 }, }, - jianxiong:{ - audio:'olshuangxiong', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.hasHistory('damage',function(evt){ + jianxiong: { + audio: "olshuangxiong", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.hasHistory("damage", function (evt) { //Disable Umi Kato's chaofan - return evt.card&&evt.cards&&evt.cards.some(card=>get.position(card,true)); + return ( + evt.card && + evt.cards && + evt.cards.some((card) => get.position(card, true)) + ); }); }, - content:function(){ - var cards=[]; - player.getHistory('damage',function(evt){ - if(evt.card&&evt.cards) cards.addArray(evt.cards.filter(card=>get.position(card,true))); + content: function () { + var cards = []; + player.getHistory("damage", function (evt) { + if (evt.card && evt.cards) + cards.addArray(evt.cards.filter((card) => get.position(card, true))); }); - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); }, }, }, }, //新李典 - xinwangxi:{ - audio:'wangxi', - trigger:{player:'damageEnd',source:'damageSource'}, - filter:function(event){ - if(event._notrigger.includes(event.player)) return false; - return event.num&&event.source&&event.player&& - event.player.isIn()&&event.source.isIn()&&event.source!=event.player; + xinwangxi: { + audio: "wangxi", + trigger: { player: "damageEnd", source: "damageSource" }, + filter: function (event) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.num && + event.source && + event.player && + event.player.isIn() && + event.source.isIn() && + event.source != event.player + ); }, - check:function(event,player){ - if(player.isPhaseUsing()) return true; - if(event.player==player) return get.attitude(player,event.source)>-5; - return get.attitude(player,event.player)>-5; + check: function (event, player) { + if (player.isPhaseUsing()) return true; + if (event.player == player) return get.attitude(player, event.source) > -5; + return get.attitude(player, event.player) > -5; }, - logTarget:function(event,player){ - if(event.player==player) return event.source; + logTarget: function (event, player) { + if (event.player == player) return event.source; return event.player; }, - preHidden:true, - content:function(){ - 'step 0' - event.count=trigger.num; - event.target=lib.skill.xinwangxi.logTarget(trigger,player); - 'step 1' + preHidden: true, + content: function () { + "step 0"; + event.count = trigger.num; + event.target = lib.skill.xinwangxi.logTarget(trigger, player); + ("step 1"); player.draw(2); event.count--; - 'step 2' - var cards=player.getCards('he'); - if(cards.length>0&&target.isIn()){ - if(cards.length==1) event._result={bool:true,cards:cards}; - else player.chooseCard('he','忘隙:交给'+get.translation(target)+'一张牌',true); + ("step 2"); + var cards = player.getCards("he"); + if (cards.length > 0 && target.isIn()) { + if (cards.length == 1) event._result = { bool: true, cards: cards }; + else player.chooseCard("he", "忘隙:交给" + get.translation(target) + "一张牌", true); + } else event.goto(4); + ("step 3"); + if (result.bool) { + player.give(result.cards, target); } - else event.goto(4); - 'step 3' - if(result.bool){ - player.give(result.cards,target); - } - 'step 4' - if(event.count&&target.isIn()&&player.hasSkill('xinwangxi')){ - player.chooseBool(get.prompt2('xinwangxi',target)); - } - else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('xinwangxi',target); + ("step 4"); + if (event.count && target.isIn() && player.hasSkill("xinwangxi")) { + player.chooseBool(get.prompt2("xinwangxi", target)); + } else event.finish(); + ("step 5"); + if (result.bool) { + player.logSkill("xinwangxi", target); event.goto(1); } }, - ai:{ - maixie:true, - maixie_hp:true - } + ai: { + maixie: true, + maixie_hp: true, + }, }, //OL界火诸葛 - olhuoji:{ - audio:'rehuoji', - audioname:['ol_sp_zhugeliang'], - trigger:{player:'huogongBegin'}, - forced:true, - locked:false, - popup:false, - group:'olhuoji_viewAs', - content:function(){ + olhuoji: { + audio: "rehuoji", + audioname: ["ol_sp_zhugeliang"], + trigger: { player: "huogongBegin" }, + forced: true, + locked: false, + popup: false, + group: "olhuoji_viewAs", + content: function () { trigger.setContent(lib.skill.olhuoji.huogongContent); }, - huogongContent:function(){ - "step 0" - if(target.countCards('h')==0){ + huogongContent: function () { + "step 0"; + if (target.countCards("h") == 0) { event.finish(); return; } - event._result={cards:target.getCards('h').randomGets(1)}; - "step 1" - target.showCards(result.cards).setContent(function(){}); - event.dialog=ui.create.dialog(get.translation(target)+'展示的手牌',result.cards); - event.videoId=lib.status.videoId++; + event._result = { cards: target.getCards("h").randomGets(1) }; + ("step 1"); + target.showCards(result.cards).setContent(function () {}); + event.dialog = ui.create.dialog(get.translation(target) + "展示的手牌", result.cards); + event.videoId = lib.status.videoId++; - game.broadcast('createDialog',event.videoId,get.translation(target)+'展示的手牌',result.cards); - game.addVideo('cardDialog',null,[get.translation(target)+'展示的手牌',get.cardsInfo(result.cards),event.videoId]); - event.card2=result.cards[0]; - game.log(target,'展示了',event.card2); - event._result={}; - player.chooseToDiscard({color:get.color(event.card2)},'he',function(card){ - var evt=_status.event.getParent(); - if(get.damageEffect(evt.target,evt.player,evt.player,'fire')>0){ - return 7-get.value(card,evt.player); - } - return -1; - }).set('prompt',false); + game.broadcast( + "createDialog", + event.videoId, + get.translation(target) + "展示的手牌", + result.cards + ); + game.addVideo("cardDialog", null, [ + get.translation(target) + "展示的手牌", + get.cardsInfo(result.cards), + event.videoId, + ]); + event.card2 = result.cards[0]; + game.log(target, "展示了", event.card2); + event._result = {}; + player + .chooseToDiscard({ color: get.color(event.card2) }, "he", function (card) { + var evt = _status.event.getParent(); + if (get.damageEffect(evt.target, evt.player, evt.player, "fire") > 0) { + return 7 - get.value(card, evt.player); + } + return -1; + }) + .set("prompt", false); game.delay(2); - "step 2" - if(result.bool){ - target.damage('fire'); - } - else{ - target.addTempSkill('huogong2'); + ("step 2"); + if (result.bool) { + target.damage("fire"); + } else { + target.addTempSkill("huogong2"); } event.dialog.close(); - game.addVideo('cardDialog',null,event.videoId); - game.broadcast('closeDialog',event.videoId); + game.addVideo("cardDialog", null, event.videoId); + game.broadcast("closeDialog", event.videoId); }, - subSkill:{viewAs:{inherit:'rehuoji',audio:'rehuoji'}} + subSkill: { viewAs: { inherit: "rehuoji", audio: "rehuoji" } }, }, - olkanpo:{ - audio:'rekanpo', - audioname:['ol_sp_zhugeliang','ol_pangtong'], - trigger:{player:'useCard'}, - forced:true, - locked:false, - popup:false, - group:'olkanpo_viewAs', - filter:function(event,player){ - return event.card.name=='wuxie'; + olkanpo: { + audio: "rekanpo", + audioname: ["ol_sp_zhugeliang", "ol_pangtong"], + trigger: { player: "useCard" }, + forced: true, + locked: false, + popup: false, + group: "olkanpo_viewAs", + filter: function (event, player) { + return event.card.name == "wuxie"; }, - content:function(){ + content: function () { trigger.directHit.addArray(game.players); }, - subSkill:{viewAs:{inherit:'rekanpo',audio:'rekanpo'}} + subSkill: { viewAs: { inherit: "rekanpo", audio: "rekanpo" } }, }, //新杀界曹植 - dcjiushi:{ - audio:2, - trigger:{ - player:'useCardAfter', + dcjiushi: { + audio: 2, + trigger: { + player: "useCardAfter", }, - filter:function(event,player){ - return event.card.name=='jiu'; + filter: function (event, player) { + return event.card.name == "jiu"; }, - forced:true, - locked:false, - content:function(){ - player.addTempSkill('dcjiushi_sha',{player:'phaseEnd'}); - player.addMark('dcjiushi_sha',1,false); + forced: true, + locked: false, + content: function () { + player.addTempSkill("dcjiushi_sha", { player: "phaseEnd" }); + player.addMark("dcjiushi_sha", 1, false); }, - group:['dcjiushi_use','dcjiushi_record','dcjiushi_damage'], - subSkill:{ - use:{ - audio:'dcjiushi', - enable:'chooseToUse', - hiddenCard:function(player,name){ - if(name=='jiu') return !player.isTurnedOver(); + group: ["dcjiushi_use", "dcjiushi_record", "dcjiushi_damage"], + subSkill: { + use: { + audio: "dcjiushi", + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (name == "jiu") return !player.isTurnedOver(); return false; }, - filter:function(event,player){ - if(player.isTurnedOver()) return false; - return event.filterCard({name:'jiu',isCard:true},player,event); + filter: function (event, player) { + if (player.isTurnedOver()) return false; + return event.filterCard({ name: "jiu", isCard: true }, player, event); }, - content:function(){ - if(_status.event.getParent(2).type=='dying'){ - event.dying=player; - event.type='dying'; + content: function () { + if (_status.event.getParent(2).type == "dying") { + event.dying = player; + event.type = "dying"; } player.turnOver(); - player.useCard({name:'jiu',isCard:true},player); + player.useCard({ name: "jiu", isCard: true }, player); }, - ai:{ - order:5, - result:{ - player:function(player){ - if(_status.event.parent.name=='phaseUse'){ - if(player.countCards('h','jiu')>0) return 0; - if(player.getEquip('zhuge')&&player.countCards('h','sha')>1) return 0; - if(!player.countCards('h','sha')) return 0; - var targets=[]; + ai: { + order: 5, + result: { + player: function (player) { + if (_status.event.parent.name == "phaseUse") { + if (player.countCards("h", "jiu") > 0) return 0; + if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) + return 0; + if (!player.countCards("h", "sha")) return 0; + var targets = []; var target; - var players=game.filterPlayer(); - for(var i=0;inum){ - target=targets[i]; - num=num2; + var num = get.effect(target, { name: "sha" }, player, player); + for (var i = 1; i < targets.length; i++) { + var num2 = get.effect( + targets[i], + { name: "sha" }, + player, + player + ); + if (num2 > num) { + target = targets[i]; + num = num2; } } - if(num<=0) return 0; - var e2=target.getEquip(2); - if(e2){ - if(e2.name=='tengjia'){ - if(!player.countCards('h',{name:'sha',nature:'fire'})&&!player.getEquip('zhuque')) return 0; + if (num <= 0) return 0; + var e2 = target.getEquip(2); + if (e2) { + if (e2.name == "tengjia") { + if ( + !player.countCards("h", { + name: "sha", + nature: "fire", + }) && + !player.getEquip("zhuque") + ) + return 0; } - if(e2.name=='renwang'){ - if(!player.countCards('h',{name:'sha',color:'red'})) return 0; + if (e2.name == "renwang") { + if (!player.countCards("h", { name: "sha", color: "red" })) + return 0; } - if(e2.name=='baiyin') return 0; + if (e2.name == "baiyin") return 0; } - if(player.getEquip('guanshi')&&player.countCards('he')>2) return 1; - return target.countCards('h')>3?0:1; + if (player.getEquip("guanshi") && player.countCards("he") > 2) + return 1; + return target.countCards("h") > 3 ? 0 : 1; } - if(player==_status.event.dying||player.isTurnedOver()) return 3; - } + if (player == _status.event.dying || player.isTurnedOver()) return 3; + }, }, - effect:{ - target:function(card,player,target){ - if(card.name=='guiyoujie') return [0,0.5]; - if(target.isTurnedOver()){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target.hp==1) return; - return [1,target.countCards('h')/2]; + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 0.5]; + if (target.isTurnedOver()) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return; + return [1, target.countCards("h") / 2]; } } - } - } + }, + }, }, }, - record:{ - trigger:{player:'damageBegin3'}, - silent:true, - firstDo:true, - filter:function(event,player){ + record: { + trigger: { player: "damageBegin3" }, + silent: true, + firstDo: true, + filter: function (event, player) { return player.isTurnedOver(); }, - content:function(){ - trigger.dcjiushi=true; - } + content: function () { + trigger.dcjiushi = true; + }, }, - damage:{ - audio:'dcjiushi', - trigger:{player:'damageEnd'}, - check:function(event,player){ + damage: { + audio: "dcjiushi", + trigger: { player: "damageEnd" }, + check: function (event, player) { return player.isTurnedOver(); }, - prompt:'是否发动【酒诗】,将武将牌翻面?', - filter:function(event,player){ - if(event.dcjiushi){ + prompt: "是否发动【酒诗】,将武将牌翻面?", + filter: function (event, player) { + if (event.dcjiushi) { return true; } return false; }, - content:function(){ + content: function () { delete trigger.dcjiushi; player.turnOver(); - } + }, }, - sha:{ - charlotte:true, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('dcjiushi_sha'); + sha: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dcjiushi_sha"); }, }, }, - } + }, }, //OL界黄忠 - remoshi:{ - audio:2, - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - return event.player.isIn()&&event.card&&event.card.name=='sha'&&event.cards.filterInD('od').length&& - event.notLink()&&[2,3,4].some(i=>event.player.getEquips(i).length>0); + remoshi: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return ( + event.player.isIn() && + event.card && + event.card.name == "sha" && + event.cards.filterInD("od").length && + event.notLink() && + [2, 3, 4].some((i) => event.player.getEquips(i).length > 0) + ); }, - group:'remoshi_retrieve', - content:function(){ - trigger.player.addSkill('remoshi_stuck') - trigger.player.addToExpansion(trigger.cards.filterInD('od'),'gain2').gaintag.add('remoshi_stuck'); + group: "remoshi_retrieve", + content: function () { + trigger.player.addSkill("remoshi_stuck"); + trigger.player + .addToExpansion(trigger.cards.filterInD("od"), "gain2") + .gaintag.add("remoshi_stuck"); }, - subSkill:{ - retrieve:{ - audio:'remoshi', - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + retrieve: { + audio: "remoshi", + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var keys=['equip2','equip3','equip4']; - return game.hasPlayer(current=>{ - if(event.name=='gain'&¤t==player) return false; - var cards=current.getExpansions('remoshi_stuck'); - if(!cards.length) return false; - var evt=event.getl(current); - if(evt&&evt.cards2&&evt.cards2.some(i=>get.subtypes(i).some(slot=>keys.includes(slot)))) return true; + filter: function (event, player) { + var keys = ["equip2", "equip3", "equip4"]; + return game.hasPlayer((current) => { + if (event.name == "gain" && current == player) return false; + var cards = current.getExpansions("remoshi_stuck"); + if (!cards.length) return false; + var evt = event.getl(current); + if ( + evt && + evt.cards2 && + evt.cards2.some((i) => + get.subtypes(i).some((slot) => keys.includes(slot)) + ) + ) + return true; }); }, - direct:true, - forced:true, - content:function(){ - 'step 0' - var keys=['equip2','equip3','equip4']; - var targets=game.filterPlayer(current=>{ - var cards=current.getExpansions('remoshi_stuck'); - if(!cards.length) return false; - var evt=trigger.getl(current); - if(evt&&evt.cards2&&evt.cards2.some(i=>get.subtypes(i).some(slot=>keys.includes(slot)))) return true; + direct: true, + forced: true, + content: function () { + "step 0"; + var keys = ["equip2", "equip3", "equip4"]; + var targets = game.filterPlayer((current) => { + var cards = current.getExpansions("remoshi_stuck"); + if (!cards.length) return false; + var evt = trigger.getl(current); + if ( + evt && + evt.cards2 && + evt.cards2.some((i) => + get.subtypes(i).some((slot) => keys.includes(slot)) + ) + ) + return true; }); - event.targets=targets; - 'step 1' - var target=targets.shift(); - var cards=target.getExpansions('remoshi_stuck'); - if(cards.length){ - player.logSkill('remoshi_retrieve',target); - player.gain(cards,target,'give','bySelf'); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + var cards = target.getExpansions("remoshi_stuck"); + if (cards.length) { + player.logSkill("remoshi_retrieve", target); + player.gain(cards, target, "give", "bySelf"); game.delayx(); } - if(targets.length) event.redo(); + if (targets.length) event.redo(); }, }, - stuck:{ - marktext:'矢', - charlotte:true, - intro:{ - name:'没矢', - name2:'矢', - content:'expansion', - markcount:'expansion', + stuck: { + marktext: "矢", + charlotte: true, + intro: { + name: "没矢", + name2: "矢", + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - } - } + }, + }, }, //界文聘 - rezhenwei:{ - audio:'zhenwei', - inherit:'zhenwei', - filter:function(event,player){ - if(player==event.target) return false; - if(!player.countCards('he')) return false; - if(event.targets.length>1) return false; - if(!event.target) return false; - if(event.target.hp>player.hp) return false; - var card=event.card; - if(card.name=='sha') return true; - if(get.color(card)=='black'&&get.type(card,'trick')=='trick') return true; + rezhenwei: { + audio: "zhenwei", + inherit: "zhenwei", + filter: function (event, player) { + if (player == event.target) return false; + if (!player.countCards("he")) return false; + if (event.targets.length > 1) return false; + if (!event.target) return false; + if (event.target.hp > player.hp) return false; + var card = event.card; + if (card.name == "sha") return true; + if (get.color(card) == "black" && get.type(card, "trick") == "trick") return true; return false; }, }, //界关张…… - retongxin:{ - mod:{ - attackRange:(player,num)=>num+2 - } + retongxin: { + mod: { + attackRange: (player, num) => num + 2, + }, }, //马忠 - refuman:{ - audio:2, - enable:'phaseUse', - filterTarget:function(card,player,target){ - if(target==player) return false; - var stat=player.getStat('skill').refuman_targets; - return !stat||!stat.includes(target); + refuman: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + if (target == player) return false; + var stat = player.getStat("skill").refuman_targets; + return !stat || !stat.includes(target); }, - filter:function(event,player){ - return player.countCards('h')>0&&game.hasPlayer((current)=>lib.skill.refuman.filterTarget(null,player,current)); + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer((current) => lib.skill.refuman.filterTarget(null, player, current)) + ); }, - filterCard:true, - content:function(){ - var card=get.discardPile(card=>card.name=='sha'); - if(card){ - target.gain(card,'gain2').gaintag.add('refuman'); - target.addTempSkill('refuman2',{player:'phaseAfter'}); - player.addSkill('refuman_draw'); + filterCard: true, + content: function () { + var card = get.discardPile((card) => card.name == "sha"); + if (card) { + target.gain(card, "gain2").gaintag.add("refuman"); + target.addTempSkill("refuman2", { player: "phaseAfter" }); + player.addSkill("refuman_draw"); } - var stat=player.getStat('skill'); - if(!stat.refuman_targets) stat.refuman_targets=[]; + var stat = player.getStat("skill"); + if (!stat.refuman_targets) stat.refuman_targets = []; stat.refuman_targets.push(target); }, - check:function(card){ - return get.discardPile(card=>card.name=='sha')?6-get.value(card):0; + check: function (card) { + return get.discardPile((card) => card.name == "sha") ? 6 - get.value(card) : 0; }, - ai:{ - order:2, - result:{ - target:function(player,target){ - if(!target.hasSha()) return 1.2; + ai: { + order: 2, + result: { + target: function (player, target) { + if (!target.hasSha()) return 1.2; return 1; - } - } + }, + }, }, - subSkill:{ - draw:{ - trigger:{global:['useCard','respond']}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.player.hasHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('refuman')) return true; + subSkill: { + draw: { + trigger: { global: ["useCard", "respond"] }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("refuman")) return true; } return false; }); }, - logTarget:'player', - content:function(){ - game.asyncDraw([trigger.player,player]); + logTarget: "player", + content: function () { + game.asyncDraw([trigger.player, player]); }, }, }, }, - refuman2:{ - onremove:function(player){ - player.removeGaintag('refuman'); + refuman2: { + onremove: function (player) { + player.removeGaintag("refuman"); }, - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('refuman')) return num+1; - } + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("refuman")) return num + 1; + }, }, }, //十周年陈群 - repindi:{ - audio:2, - enable:'phaseUse', - filterTarget:function(card,player,target){ - return !player.getStorage('repindi_target').includes(target); + repindi: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return !player.getStorage("repindi_target").includes(target); }, - filterCard:function(card,player){ - return !player.getStorage('repindi_type').includes(get.type2(card)); + filterCard: function (card, player) { + return !player.getStorage("repindi_type").includes(get.type2(card)); }, - check:function(card){ - var num=_status.event.player.getStat('skill').repindi||0; - return 6+num-get.value(card); + check: function (card) { + var num = _status.event.player.getStat("skill").repindi || 0; + return 6 + num - get.value(card); }, - position:'he', - content:function(){ - 'step 0' - player.addTempSkill('repindi_clear',['phaseUseAfter','phaseAfter']); - player.markAuto('repindi_target',[target]); - player.markAuto('repindi_type',[get.type2(cards[0],cards[0].original=='h'?player:false)]); - event.num=player.getStat('skill').repindi; + position: "he", + content: function () { + "step 0"; + player.addTempSkill("repindi_clear", ["phaseUseAfter", "phaseAfter"]); + player.markAuto("repindi_target", [target]); + player.markAuto("repindi_type", [ + get.type2(cards[0], cards[0].original == "h" ? player : false), + ]); + event.num = player.getStat("skill").repindi; player.syncStorage(); - if(target.countCards('he')==0) event._result={index:0}; - else{ - player.chooseControlList([ - '令'+get.translation(target)+'摸'+get.cnNumber(event.num)+'张牌', - '令'+get.translation(target)+'弃置'+get.cnNumber(event.num)+'张牌' - ],function(){ - return _status.event.choice; - }).set('choice',get.attitude(player,target)>0?0:1); + if (target.countCards("he") == 0) event._result = { index: 0 }; + else { + player + .chooseControlList( + [ + "令" + get.translation(target) + "摸" + get.cnNumber(event.num) + "张牌", + "令" + + get.translation(target) + + "弃置" + + get.cnNumber(event.num) + + "张牌", + ], + function () { + return _status.event.choice; + } + ) + .set("choice", get.attitude(player, target) > 0 ? 0 : 1); } - 'step 1' - if(result.index==0){ + ("step 1"); + if (result.index == 0) { target.draw(event.num); + } else { + target.chooseToDiscard(event.num, "he", true); } - else{ - target.chooseToDiscard(event.num,'he',true); - } - 'step 2' - if(target.isDamaged()){ + ("step 2"); + if (target.isDamaged()) { player.link(); } }, - subSkill:{ - clear:{ - trigger:{player:'phaseAfter'}, - charlotte:true, - silent:true, - onremove:function(player){ + subSkill: { + clear: { + trigger: { player: "phaseAfter" }, + charlotte: true, + silent: true, + onremove: function (player) { delete player.storage.repindi_target; delete player.storage.repindi_type; - } - } + }, + }, }, - ai:{ - order:8, - threaten:1.9, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - var num=(player.getStat('skill').repindi||0)+1; - if(att<=0&&target.countCards('he') { - return target.countCards('he')>0&&target!=player; - }).set('ai',target=>{ - var player=_status.event.player; - if(_status.event.goon) return get.attitude(player,target)*Math.sqrt(target.countCards('he')); - return -get.attitude(player,target)/(target.countCards('he')+1)*10; - }).set('goon',player.countCards('hs',card=>player.hasValueTarget(card))>=2); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('rekuangbi',target); - target.chooseCard('匡弼:将至多三张牌置于'+get.translation(player)+'的武将牌上','he',[1,3],true).set('ai',card=>{ - if(get.attitude(_status.event.player,_status.event.getParent().player)>0){ - return 7-get.value(card); - } - return -get.value(card); - }); - }else event.finish(); - 'step 2' - if(result.bool){ - player.addToExpansion(result.cards,target,'give').gaintag.add('rekuangbi_effect'); - player.addTempSkill('rekuangbi_effect','phaseUseEnd'); - player.markAuto('rekuangbi_effect',[target]); + rekuangbi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rekuangbi"), (card, player, target) => { + return target.countCards("he") > 0 && target != player; + }) + .set("ai", (target) => { + var player = _status.event.player; + if (_status.event.goon) + return get.attitude(player, target) * Math.sqrt(target.countCards("he")); + return (-get.attitude(player, target) / (target.countCards("he") + 1)) * 10; + }) + .set("goon", player.countCards("hs", (card) => player.hasValueTarget(card)) >= 2); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rekuangbi", target); + target + .chooseCard( + "匡弼:将至多三张牌置于" + get.translation(player) + "的武将牌上", + "he", + [1, 3], + true + ) + .set("ai", (card) => { + if ( + get.attitude(_status.event.player, _status.event.getParent().player) > 0 + ) { + return 7 - get.value(card); + } + return -get.value(card); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.addToExpansion(result.cards, target, "give").gaintag.add("rekuangbi_effect"); + player.addTempSkill("rekuangbi_effect", "phaseUseEnd"); + player.markAuto("rekuangbi_effect", [target]); } }, - subSkill:{ - effect:{ - trigger:{player:'useCard'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return player.getExpansions('rekuangbi_effect').length>0; + subSkill: { + effect: { + trigger: { player: "useCard" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.getExpansions("rekuangbi_effect").length > 0; }, - content:function(){ - 'step 0' - var cards=player.getExpansions('rekuangbi_effect'); - var suit=get.suit(trigger.card),cardsx=cards.filter(card=>get.suit(card)==suit); - var len=cardsx.length; - if(len>1){ - player.chooseButton(['匡弼:移去一张同花色的“匡弼”牌',cards],true).set('filterButton',button=>{ - return get.suit(button.link)==_status.event.suit; - }).set('suit',suit); + content: function () { + "step 0"; + var cards = player.getExpansions("rekuangbi_effect"); + var suit = get.suit(trigger.card), + cardsx = cards.filter((card) => get.suit(card) == suit); + var len = cardsx.length; + if (len > 1) { + player + .chooseButton(["匡弼:移去一张同花色的“匡弼”牌", cards], true) + .set("filterButton", (button) => { + return get.suit(button.link) == _status.event.suit; + }) + .set("suit", suit); + } else if (len == 1) { + event._result = { bool: true, links: cardsx }; + } else { + event._result = { bool: false, links: [cards.randomGet()] }; } - else if(len==1){ - event._result={bool:true,links:cardsx}; - } - else{ - event._result={bool:false,links:[cards.randomGet()]}; - } - 'step 1' - if(result.links&&result.links.length){ + ("step 1"); + if (result.links && result.links.length) { player.loseToDiscardpile(result.links); game.delayx(); } - if(result.bool){ - player.draw('nodelay'); - var target=player.getStorage('rekuangbi_effect')[0]; - if(target&&target.isIn()) target.draw(); - } - else{ + if (result.bool) { + player.draw("nodelay"); + var target = player.getStorage("rekuangbi_effect")[0]; + if (target && target.isIn()) target.draw(); + } else { player.draw(); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); delete player.storage[skill]; }, - } - } + }, + }, }, //十周年蔡邕 - rebizhuan:{ - audio:2, - trigger:{ - player:'useCard', - target:'useCardToTargeted', + rebizhuan: { + audio: 2, + trigger: { + player: "useCard", + target: "useCardToTargeted", }, - filter:function(event,player){ - if(event.name!='useCard'&&event.player==event.target) return false; - var num=4+Math.min(player.countMark('retongbo'),game.countPlayer()); - if(player.getExpansions('rebizhuan').length>=num) return false; - return get.suit(event.card)=='spade'; + filter: function (event, player) { + if (event.name != "useCard" && event.player == event.target) return false; + var num = 4 + Math.min(player.countMark("retongbo"), game.countPlayer()); + if (player.getExpansions("rebizhuan").length >= num) return false; + return get.suit(event.card) == "spade"; }, - marktext:'书', - intro:{ - name:'辟撰(书)', - name2:'书', - content:'expansion', - markcount:'expansion', + marktext: "书", + intro: { + name: "辟撰(书)", + name2: "书", + content: "expansion", + markcount: "expansion", }, - frequent:true, - locked:false, - content:function(){ - player.addToExpansion(get.cards(),'gain2').gaintag.add('rebizhuan'); + frequent: true, + locked: false, + content: function () { + player.addToExpansion(get.cards(), "gain2").gaintag.add("rebizhuan"); + }, + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("rebizhuan").length; + }, }, - mod:{ - maxHandcard:function(player,num){ - return num+player.getExpansions('rebizhuan').length; - } - } }, - retongbo:{ - audio:2, - trigger:{player:'phaseDrawAfter'}, - direct:true, - filter:function(event,player){ - return player.getExpansions('rebizhuan').length>0&&player.countCards('he')>0; + retongbo: { + audio: 2, + trigger: { player: "phaseDrawAfter" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("rebizhuan").length > 0 && player.countCards("he") > 0; }, - content:function(){ - 'step 0' - var next=player.chooseToMove('通博:是否交换“书”和手牌?'); - next.set('list',[ - [get.translation(player)+'(你)的“书”',player.getExpansions('rebizhuan')], - ['你的牌',player.getCards('he')], + content: function () { + "step 0"; + var next = player.chooseToMove("通博:是否交换“书”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的“书”", player.getExpansions("rebizhuan")], + ["你的牌", player.getCards("he")], ]); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('processAI',function(list){ - var player=_status.event.player,cards=list[0][1].concat(list[1][1]),cards2=[]; - cards.sort((a,b)=>{ - return get.useful(a)-get.useful(b); + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]), + cards2 = []; + cards.sort((a, b) => { + return get.useful(a) - get.useful(b); }); - cards2=cards.splice(0,player.getExpansions('rebizhuan').length); - return [cards2,cards]; + cards2 = cards.splice(0, player.getExpansions("rebizhuan").length); + return [cards2, cards]; }); - 'step 1' - if(result.bool){ - var pushs=result.moved[0],gains=result.moved[1]; - pushs.removeArray(player.getExpansions('rebizhuan')); - gains.removeArray(player.getCards('he')); - if(!pushs.length||pushs.length!=gains.length){ + ("step 1"); + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("rebizhuan")); + gains.removeArray(player.getCards("he")); + if (!pushs.length || pushs.length != gains.length) { event.finish(); return; } - player.logSkill('retongbo'); - player.addToExpansion(pushs,'give',player).gaintag.add('rebizhuan'); - player.gain(gains,'gain2'); + player.logSkill("retongbo"); + player.addToExpansion(pushs, "give", player).gaintag.add("rebizhuan"); + player.gain(gains, "gain2"); } - 'step 2' - event.cards=player.getExpansions('rebizhuan').slice(0); - if(event.cards.length<4) event.finish(); + ("step 2"); + event.cards = player.getExpansions("rebizhuan").slice(0); + if (event.cards.length < 4) event.finish(); else { - event.given=[]; - var list=[]; - event.cards.forEach(i=>list.add(get.suit(i))); - if(list.length>=4&&player.hp<=2) event.four=true; + event.given = []; + var list = []; + event.cards.forEach((i) => list.add(get.suit(i))); + if (list.length >= 4 && player.hp <= 2) event.four = true; } - 'step 3' - if(event.given.length<4){ - player.chooseCardButton('是否将'+get.cnNumber(4-event.given.length)+'张“书”交给任意名其他角色?',event.cards,[1,4-event.given.length],event.given.length>0).set('ai',function(button){ - if(!_status.event.goon) return 0; - var four=_status.event.getParent().four,given=_status.event.getParent().given; - if(four) return get.value(button.link)+(given.map(i=>get.suit(i)).includes(get.suit(button.link))?0:10); - if(ui.selected.buttons.length==0) return get.value(button.link); - return 0; - }).set('goon',game.hasPlayer(current=>current!=player&&get.attitude(player,current)>0)); - } - else{ + ("step 3"); + if (event.given.length < 4) { + player + .chooseCardButton( + "是否将" + + get.cnNumber(4 - event.given.length) + + "张“书”交给任意名其他角色?", + event.cards, + [1, 4 - event.given.length], + event.given.length > 0 + ) + .set("ai", function (button) { + if (!_status.event.goon) return 0; + var four = _status.event.getParent().four, + given = _status.event.getParent().given; + if (four) + return ( + get.value(button.link) + + (given.map((i) => get.suit(i)).includes(get.suit(button.link)) + ? 0 + : 10) + ); + if (ui.selected.buttons.length == 0) return get.value(button.link); + return 0; + }) + .set( + "goon", + game.hasPlayer( + (current) => current != player && get.attitude(player, current) > 0 + ) + ); + } else { event.goto(6); } - 'step 4' - if(result.bool){ - for(var i=0;i0){ - return att/(1+target.countCards('h')); - } - else{ - return att/100; - } - }).set('enemy',get.value(event.togive[0],player,'raw')<0); - } - else{ + player + .chooseTarget( + "将" + get.translation(result.links) + "交给一名其他角色", + true, + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } else { event.finish(); } - 'step 5' - if(result.targets.length){ - result.targets[0].gain(event.togive,'draw').giver=player; - player.line(result.targets[0],'green'); - game.log(result.targets[0],'获得了'+get.cnNumber(event.togive.length)+'张','#g“书”'); - if(event.given.length<4) event.goto(3); + ("step 5"); + if (result.targets.length) { + result.targets[0].gain(event.togive, "draw").giver = player; + player.line(result.targets[0], "green"); + game.log( + result.targets[0], + "获得了" + get.cnNumber(event.togive.length) + "张", + "#g“书”" + ); + if (event.given.length < 4) event.goto(3); } - 'step 6' - if(event.given.length==4){ - var suits=lib.suit.slice(0); - event.given.forEach(i=>suits.remove(get.suit(i,player))); - if(suits.length==0){ + ("step 6"); + if (event.given.length == 4) { + var suits = lib.suit.slice(0); + event.given.forEach((i) => suits.remove(get.suit(i, player))); + if (suits.length == 0) { player.recover(); - player.addMark('retongbo',1,false); + player.addMark("retongbo", 1, false); } } }, - marktext:'博', - intro:{ - content:function(storage,player){ - var num=4+Math.min(storage,game.countPlayer()); - return '“书”的上限+'+num; - } + marktext: "博", + intro: { + content: function (storage, player) { + var num = 4 + Math.min(storage, game.countPlayer()); + return "“书”的上限+" + num; + }, + }, + ai: { + combo: "rebizhuan", }, - ai:{ - combo:'rebizhuan', - } }, //十周年陈宫 - remingce:{ - enable:'phaseUse', - usable:1, - audio:2, - position:'he', - filterCard:function(card){ - return get.name(card)=='sha'||get.type(card)=='equip'; + remingce: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: function (card) { + return get.name(card) == "sha" || get.type(card) == "equip"; }, - filter:function(event,player){ - return player.countCards('h','sha')>0||player.countCards('he',{type:'equip'})>0; + filter: function (event, player) { + return ( + player.countCards("h", "sha") > 0 || player.countCards("he", { type: "equip" }) > 0 + ); }, - check:function(card){return 8-get.value(card)}, - selectTarget:2, - multitarget:true, - discard:false, - lose:false, - targetprompt:['得到牌','出杀目标'], - filterTarget:function(card,player,target){ - if(ui.selected.targets.length==0){ - return player!=target; + check: function (card) { + return 8 - get.value(card); + }, + selectTarget: 2, + multitarget: true, + discard: false, + lose: false, + targetprompt: ["得到牌", "出杀目标"], + filterTarget: function (card, player, target) { + if (ui.selected.targets.length == 0) { + return player != target; } return true; }, - delay:false, - content:function(){ - 'step 0' - player.give(cards,targets[0],'visible'); - 'step 1' - if(!targets[0].canUse({name:'sha',isCard:true},targets[1],false,false)) event._result={control:'选项二'}; - else targets[0].chooseControl().set('ai',function(){ - var player=_status.event.player,target=_status.event.target; - return get.effect(target,{name:'sha',isCard:true},player,player)>0?0:1; - }).set('choiceList',['视为对'+get.translation(targets[1])+'使用一张【杀】,若此杀造成伤害则执行选项二','你与'+get.translation(player)+'各摸一张牌']).set('target',targets[1]).set('prompt','对'+get.translation(targets[1])+'使用一张杀,或摸一张牌'); - 'step 2' - if(result.control=='选项二'){ - game.asyncDraw([player,targets[0]]); + delay: false, + content: function () { + "step 0"; + player.give(cards, targets[0], "visible"); + ("step 1"); + if (!targets[0].canUse({ name: "sha", isCard: true }, targets[1], false, false)) + event._result = { control: "选项二" }; + else + targets[0] + .chooseControl() + .set("ai", function () { + var player = _status.event.player, + target = _status.event.target; + return get.effect(target, { name: "sha", isCard: true }, player, player) > 0 + ? 0 + : 1; + }) + .set("choiceList", [ + "视为对" + + get.translation(targets[1]) + + "使用一张【杀】,若此杀造成伤害则执行选项二", + "你与" + get.translation(player) + "各摸一张牌", + ]) + .set("target", targets[1]) + .set("prompt", "对" + get.translation(targets[1]) + "使用一张杀,或摸一张牌"); + ("step 2"); + if (result.control == "选项二") { + game.asyncDraw([player, targets[0]]); event.finish(); + } else { + targets[0].useCard({ name: "sha", isCard: true }, targets[1]); } - else{ - targets[0].useCard({name:'sha',isCard:true},targets[1]); - } - 'step 3' - if(targets[0].hasHistory('useCard',evt=>{ - return evt.getParent()==event&&targets[0].hasHistory('sourceDamage',evtx=>evt.card==evtx.card); - })){ - game.asyncDraw([player,targets[0]]); + ("step 3"); + if ( + targets[0].hasHistory("useCard", (evt) => { + return ( + evt.getParent() == event && + targets[0].hasHistory("sourceDamage", (evtx) => evt.card == evtx.card) + ); + }) + ) { + game.asyncDraw([player, targets[0]]); } }, - ai:{ - result:{ - player:function(player){ - var players=game.filterPlayer(); - for(var i=0;i1&&get.attitude(players[i],player)>1){ + ai: { + result: { + player: function (player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + get.attitude(player, players[i]) > 1 && + get.attitude(players[i], player) > 1 + ) { return 1; } } return 0; }, - target:function(player,target){ - if(ui.selected.targets.length){ + target: function (player, target) { + if (ui.selected.targets.length) { return -0.1; } return 1; - } - }, - order:8.5, - expose:0.2 - } - }, - // 界荀攸 - reqice:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - const hs=player.getCards('h'); - if(!hs.length) return false; - if((player.getStat('skill').reqice||0)>=player.countMark('reqice_mark')+1) return false; - if(hs.some(card=>{ - const mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - return (mod2===false) - })) return false; - return lib.inpile.some(name=>{ - if(get.type(name)!='trick') return false; - const card=get.autoViewAs({name},hs); - return event.filterCard(card,player,event); - }); - }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i=0; i0) return 0; - if((player.getStat('skill').reqice||0)get.tag(button.link[2],i) >= 1)) return effect*5; - } - if(effect>0) return effect; - return 0; - }, - backup:function(links,player){ - return { - filterCard:true, - selectCard:-1, - position:'h', - audio:'reqice', - popname:true, - viewAs:{name:links[0][2]}, - } - }, - prompt:function(links,player){ - return '将所有手牌当【'+get.translation(links[0][2])+'】使用'; - } - }, - ai:{ - order:1, - result:{ - player:function(player){ - var num=0; - var cards=player.getCards('h'); - if(cards.length >= 3&&player.hp >= 3&&player.countMark('reqice_mark')<2) return 0; - for(var i=0; iget.name(card)!='tao','h'); - }, - threaten:1.7, - }, - subSkill:{ - bakcup:{}, - mark:{ - charlotte:true, - onremove:true, - intro:{ - name2:'奇策', - content:'mark', }, }, - } + order: 8.5, + expose: 0.2, + }, }, - rezhiyu:{ - audio:2, - trigger:{player:'damageEnd'}, - content:function(){ - 'step 0' + // 界荀攸 + reqice: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + const hs = player.getCards("h"); + if (!hs.length) return false; + if ((player.getStat("skill").reqice || 0) >= player.countMark("reqice_mark") + 1) + return false; + if ( + hs.some((card) => { + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + return mod2 === false; + }) + ) + return false; + return lib.inpile.some((name) => { + if (get.type(name) != "trick") return false; + const card = get.autoViewAs({ name }, hs); + return event.filterCard(card, player, event); + }); + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i = 0; i < lib.inpile.length; i++) { + if (get.type(lib.inpile[i]) == "trick") list.push(["锦囊", "", lib.inpile[i]]); + } + return ui.create.dialog(get.translation("reqice"), [list, "vcard"]); + }, + filter: function (button, player) { + const event = _status.event.getParent(), + card = get.autoViewAs( + { + name: button.link[2], + }, + player.getCards("h") + ); + return event.filterCard(card, player, event); + }, + check: function (button) { + var player = _status.event.player; + var effect = player.getUseValue(button.link[2]); + if (player.countCards("hs", button.link[2]) > 0) return 0; + if ((player.getStat("skill").reqice || 0) < player.countMark("reqice_mark") + 1) { + if (["draw", "gain"].some((i) => get.tag(button.link[2], i) >= 1)) + return effect * 5; + } + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + filterCard: true, + selectCard: -1, + position: "h", + audio: "reqice", + popname: true, + viewAs: { name: links[0][2] }, + }; + }, + prompt: function (links, player) { + return "将所有手牌当【" + get.translation(links[0][2]) + "】使用"; + }, + }, + ai: { + order: 1, + result: { + player: function (player) { + var num = 0; + var cards = player.getCards("h"); + if (cards.length >= 3 && player.hp >= 3 && player.countMark("reqice_mark") < 2) + return 0; + for (var i = 0; i < cards.length; i++) { + num += Math.max(0, get.value(cards[i], player, "raw")); + } + num /= cards.length; + num /= (player.countMark("reqice_mark") + 1) * 1.3; + num *= Math.min(cards.length, player.hp); + return 13 - num; + }, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + !player.getStat("skill").reqice && + player.hasCard((card) => get.name(card) != "tao", "h") + ); + }, + threaten: 1.7, + }, + subSkill: { + bakcup: {}, + mark: { + charlotte: true, + onremove: true, + intro: { + name2: "奇策", + content: "mark", + }, + }, + }, + }, + rezhiyu: { + audio: 2, + trigger: { player: "damageEnd" }, + content: function () { + "step 0"; player.draw(); - 'step 1' - if(!player.countCards('h')) event.finish(); + ("step 1"); + if (!player.countCards("h")) event.finish(); else player.showHandcards(); - 'step 2' - if(!trigger.source||!trigger.source.isIn()) event._result={bool:false,cards:[]}; - else trigger.source.chooseToDiscard('智愚:请弃置一张手牌',true); - 'step 3' - var cards=player.getCards('h'); - var color=get.color(cards[0],player); - var bool=true; - for(var i=1; i(card.name=='juedou'||(card.name=='sha'&&get.color(card,false)=='red')); - var cards=event.getd().filter(filter); - if(!cards.filter((card)=>(get.position(card,true)=='d')).length) return false; - var searched=false; - if(game.getGlobalHistory('cardMove',function(evt){ - if(searched||evt.type!='discard'||evt.position!=ui.discardPile) return false; - var evtx=evt; - if(evtx.getlx===false) evtx=evt.getParent(); - var cards=evtx.getd().filter(filter); - if(!cards.length) return false; - searched=true; - return evtx!=event; - }).length>0) return false; + oljiang: { + audio: "jiang", + inherit: "jiang", + group: "oljiang_gain", + subSkill: { + gain: { + audio: "jiang", + audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + usable: 1, + filter: function (event, player) { + if (player.hp < 1 || event.type != "discard" || event.position != ui.discardPile) + return false; + var filter = (card) => + card.name == "juedou" || + (card.name == "sha" && get.color(card, false) == "red"); + var cards = event.getd().filter(filter); + if (!cards.filter((card) => get.position(card, true) == "d").length) return false; + var searched = false; + if ( + game.getGlobalHistory("cardMove", function (evt) { + if (searched || evt.type != "discard" || evt.position != ui.discardPile) + return false; + var evtx = evt; + if (evtx.getlx === false) evtx = evt.getParent(); + var cards = evtx.getd().filter(filter); + if (!cards.length) return false; + searched = true; + return evtx != event; + }).length > 0 + ) + return false; return true; }, - prompt2:function(event,player){ - var cards=event.getd().filter(function(card){ - return (card.name=='juedou'||(card.name=='sha'&&get.color(card,false)=='red'))&&get.position(card,true)=='d'; + prompt2: function (event, player) { + var cards = event.getd().filter(function (card) { + return ( + (card.name == "juedou" || + (card.name == "sha" && get.color(card, false) == "red")) && + get.position(card, true) == "d" + ); }); - return '失去1点体力并获得'+get.translation(cards); + return "失去1点体力并获得" + get.translation(cards); }, - check:function(event,player){ - return player.hp>1&&!player.storage.olhunzi; + check: function (event, player) { + return player.hp > 1 && !player.storage.olhunzi; }, - content:function(){ + content: function () { player.loseHp(); - var cards=trigger.getd().filter(function(card){ - return (card.name=='juedou'||(card.name=='sha'&&get.color(card,false)=='red'))&&get.position(card,true)=='d'; + var cards = trigger.getd().filter(function (card) { + return ( + (card.name == "juedou" || + (card.name == "sha" && get.color(card, false) == "red")) && + get.position(card, true) == "d" + ); }); - if(cards.length>0) player.gain(cards,'gain2'); + if (cards.length > 0) player.gain(cards, "gain2"); }, }, }, }, //李儒 - dcmieji:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hasCard(lib.skill.dcmieji.filterCard,'eh'); + dcmieji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard(lib.skill.dcmieji.filterCard, "eh"); }, - position:'he', - filterCard:function(card){ - if(get.subtype(card)=='equip1') return true; - return get.color(card)=='black'&&get.type(card,'trick')=='trick'; + position: "he", + filterCard: function (card) { + if (get.subtype(card) == "equip1") return true; + return get.color(card) == "black" && get.type(card, "trick") == "trick"; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - discard:false, - delay:false, - check:function(card){ - return 8-get.value(card); + discard: false, + delay: false, + check: function (card) { + return 8 - get.value(card); }, - loseTo:'cardPile', - insert:true, - visible:true, - content:function(){ - 'step 0' + loseTo: "cardPile", + insert: true, + visible: true, + content: function () { + "step 0"; player.showCards(cards); - 'step 1' - target.chooseToDiscard('he',true).set('prompt','请弃置一张锦囊牌,或依次弃置两张非锦囊牌。'); - 'step 2' - if((!result.cards||get.type(result.cards[0],'trick',result.cards[0].original=='h'?target:false)!='trick')&&target.countCards('he',function(card){ - return get.type(card,'trick')!='trick'; - })){ - target.chooseToDiscard('he',true,function(card){ - return get.type(card,'trick')!='trick'; - }).set('prompt','请弃置第二张非锦囊牌'); + ("step 1"); + target + .chooseToDiscard("he", true) + .set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。"); + ("step 2"); + if ( + (!result.cards || + get.type( + result.cards[0], + "trick", + result.cards[0].original == "h" ? target : false + ) != "trick") && + target.countCards("he", function (card) { + return get.type(card, "trick") != "trick"; + }) + ) { + target + .chooseToDiscard("he", true, function (card) { + return get.type(card, "trick") != "trick"; + }) + .set("prompt", "请弃置第二张非锦囊牌"); } }, - ai:{ - order:9, - result:{ - target:-1 - } - } + ai: { + order: 9, + result: { + target: -1, + }, + }, }, - dcfencheng:{ - skillAnimation:'epic', - animationColor:'fire', - audio:2, - enable:'phaseUse', - filterTarget:function(card,player,target){ - return player!=target; + dcfencheng: { + skillAnimation: "epic", + animationColor: "fire", + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return player != target; }, - limited:true, - line:'fire', - content:function(){ - "step 0" - player.awakenSkill('dcfencheng'); - event.num=1; - event.targets=game.filterPlayer((current)=>current!=player); + limited: true, + line: "fire", + content: function () { + "step 0"; + player.awakenSkill("dcfencheng"); + event.num = 1; + event.targets = game.filterPlayer((current) => current != player); event.targets.sortBySeat(target); - "step 1" - if(event.targets.length){ - var target=event.targets.shift(); - if(!target.isIn()){ + ("step 1"); + if (event.targets.length) { + var target = event.targets.shift(); + if (!target.isIn()) { event.redo(); return; } - event.target=target; - player.line(target,'fire'); - var res=get.damageEffect(target,player,target,'fire'); - target.chooseToDiscard('he','弃置至少'+get.cnNumber(event.num)+'张牌或受到2点火焰伤害',[num,Infinity]).set('ai',function(card){ - if(ui.selected.cards.length>=_status.event.getParent().num) return -1; - if(_status.event.player.hasSkillTag('nofire')) return -1; - if(_status.event.res>=0) return 6-get.value(card); - if(get.type(card)!='basic'){ - return 10-get.value(card); - } - return 8-get.value(card); - }).set('res',res); - } - else{ + event.target = target; + player.line(target, "fire"); + var res = get.damageEffect(target, player, target, "fire"); + target + .chooseToDiscard( + "he", + "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害", + [num, Infinity] + ) + .set("ai", function (card) { + if (ui.selected.cards.length >= _status.event.getParent().num) return -1; + if (_status.event.player.hasSkillTag("nofire")) return -1; + if (_status.event.res >= 0) return 6 - get.value(card); + if (get.type(card) != "basic") { + return 10 - get.value(card); + } + return 8 - get.value(card); + }) + .set("res", res); + } else { event.finish(); } - "step 2" - if(!result.bool){ - event.target.damage(2,'fire'); - event.num=1; - } - else{ - event.num=result.cards.length+1; + ("step 2"); + if (!result.bool) { + event.target.damage(2, "fire"); + event.num = 1; + } else { + event.num = result.cards.length + 1; event.goto(1); } - "step 3" + ("step 3"); game.delayx(); event.goto(1); }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(player.hasUnknown(2)) return 0; - var num=0,eff=0,players=game.filterPlayer(function(current){ - return current!=player; - }).sortBySeat(target); - for(var target of players){ - if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue} - var shao=false; - num++; - if(target.countCards('he',function(card){ - if(get.type(card)!='basic'){ - return get.value(card)<10; - } - return get.value(card)<8; - })= 0) { + num = 0; + continue; } - else eff-=num*(get.realAttitude||get.attitude)(player,target)/4; + var shao = false; + num++; + if ( + target.countCards("he", function (card) { + if (get.type(card) != "basic") { + return get.value(card) < 10; + } + return get.value(card) < 8; + }) < num + ) + shao = true; + if (shao) { + eff -= 4 * (get.realAttitude || get.attitude)(player, target); + num = 0; + } else eff -= (num * (get.realAttitude || get.attitude)(player, target)) / 4; } - if(eff<4) return 0; + if (eff < 4) return 0; return eff; - } - } + }, + }, }, }, //朱桓 - refenli:{ - audio:2, - group:['refenli_draw','refenli_use','refenli_discard'], - subfrequent:['discard'], - subSkill:{ - draw:{ - audio:'refenli', - trigger:{player:'phaseJudgeBefore'}, - prompt:'是否发动【奋励】跳过判定和摸牌阶段?', - filter:function(event,player){ + refenli: { + audio: 2, + group: ["refenli_draw", "refenli_use", "refenli_discard"], + subfrequent: ["discard"], + subSkill: { + draw: { + audio: "refenli", + trigger: { player: "phaseJudgeBefore" }, + prompt: "是否发动【奋励】跳过判定和摸牌阶段?", + filter: function (event, player) { return player.isMaxHandcard(); }, - check:function(event,player){ - if(player.hasJudge('lebu')||player.hasJudge('bingliang')) return true; - if(player.getHistory('skipped').length>0) return false; - return game.hasPlayer(function(current){ - return get.attitude(player,current)<0&¤t.hp==1&&get.damageEffect(current,player,player)>0; + check: function (event, player) { + if (player.hasJudge("lebu") || player.hasJudge("bingliang")) return true; + if (player.getHistory("skipped").length > 0) return false; + return game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + current.hp == 1 && + get.damageEffect(current, player, player) > 0 + ); }); }, - content:function(){ + content: function () { trigger.cancel(); - player.skip('phaseDraw'); - } + player.skip("phaseDraw"); + }, }, - use:{ - audio:'refenli', - trigger:{player:'phaseUseBefore'}, - prompt:'是否发动【奋励】跳过出牌阶段?', - filter:function(event,player){ + use: { + audio: "refenli", + trigger: { player: "phaseUseBefore" }, + prompt: "是否发动【奋励】跳过出牌阶段?", + filter: function (event, player) { return player.isMaxHp(); }, - check:function(event,player){ - if(!player.needsToDiscard()||(player.countCards('e')&&player.isMaxEquip())) return true; - if(player.getHistory('skipped').length>0) return false; - return game.hasPlayer(function(current){ - return get.attitude(player,current)<0&¤t.hp==1&&get.damageEffect(current,player,player)>0; + check: function (event, player) { + if (!player.needsToDiscard() || (player.countCards("e") && player.isMaxEquip())) + return true; + if (player.getHistory("skipped").length > 0) return false; + return game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + current.hp == 1 && + get.damageEffect(current, player, player) > 0 + ); }); }, - content:function(){ + content: function () { trigger.cancel(); - } - }, - discard:{ - audio:'refenli', - trigger:{player:'phaseDiscardBefore'}, - prompt:'是否发动【奋励】跳过弃牌阶段?', - frequent:true, - filter:function(event,player){ - return player.isMaxEquip()&&player.countCards('e'); }, - content:function(){ + }, + discard: { + audio: "refenli", + trigger: { player: "phaseDiscardBefore" }, + prompt: "是否发动【奋励】跳过弃牌阶段?", + frequent: true, + filter: function (event, player) { + return player.isMaxEquip() && player.countCards("e"); + }, + content: function () { trigger.cancel(); - } - } + }, + }, + }, + ai: { + combo: "repingkou", }, - ai:{ - combo:'repingkou' - } }, - repingkou:{ - audio:2, - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return player.getHistory('skipped').length>0; + repingkou: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.getHistory("skipped").length > 0; }, - content:function(){ - 'step 0' - player.chooseTarget([1,player.getHistory('skipped').length],get.prompt2('repingkou'),'对至多'+get.cnNumber(num)+'名其他角色各造成1点伤害。若你选择的角色数小于最大角色数,则你可以弃置其中一名目标角色装备区内的一张牌',function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - player.logSkill('repingkou',result.targets); - event.targets=result.targets.slice(0).sortBySeat(); - event.num=0; - } - else{ + content: function () { + "step 0"; + player + .chooseTarget( + [1, player.getHistory("skipped").length], + get.prompt2("repingkou"), + "对至多" + + get.cnNumber(num) + + "名其他角色各造成1点伤害。若你选择的角色数小于最大角色数,则你可以弃置其中一名目标角色装备区内的一张牌", + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("repingkou", result.targets); + event.targets = result.targets.slice(0).sortBySeat(); + event.num = 0; + } else { event.finish(); } - 'step 2' - var target=targets[event.num]; - if(target.isIn()) target.damage(); + ("step 2"); + var target = targets[event.num]; + if (target.isIn()) target.damage(); event.num++; - if(event.num0; + if (event.num < targets.length) event.redo(); + else if (event.num == player.getHistory("skipped").length) event.finish(); + ("step 3"); + var targets2 = targets.filter(function (target) { + return target.countDiscardableCards(player, "e") > 0; }); - if(targets2.length>0){ - player.chooseTarget('是否弃置一名目标角色的一张装备牌?',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('targets',targets2).set('ai',function(target){ - var att=get.attitude(player,target),eff=0; - target.getCards('e',function(card){ - var val=get.value(card,target); - eff=Math.max(eff,-val*att); + if (targets2.length > 0) { + player + .chooseTarget( + "是否弃置一名目标角色的一张装备牌?", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("targets", targets2) + .set("ai", function (target) { + var att = get.attitude(player, target), + eff = 0; + target.getCards("e", function (card) { + var val = get.value(card, target); + eff = Math.max(eff, -val * att); + }); + return eff; }); - return eff; - }); - } - else event.finish(); - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.discardPlayerCard(target,'e',true); + } else event.finish(); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "e", true); } }, - ai:{ - combo:'fenli', - effect:{ - target:function(card){ - if(card.name=='lebu'||card.name=='bingliang') return 0.5; - } - } - } + ai: { + combo: "fenli", + effect: { + target: function (card) { + if (card.name == "lebu" || card.name == "bingliang") return 0.5; + }, + }, + }, }, //典韦 - olqiangxi:{ - audio:'qiangxi', - audioname:['ol_dianwei','boss_lvbu3'], - enable:'phaseUse', - usable:2, - filter:function(event,player){ - if(player.hp<1&&!player.hasCard((card)=>lib.skill.olqiangxi.filterCard(card),'he')) return false; - return game.hasPlayer((current)=>lib.skill.olqiangxi.filterTarget(null,player,current)); + olqiangxi: { + audio: "qiangxi", + audioname: ["ol_dianwei", "boss_lvbu3"], + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if ( + player.hp < 1 && + !player.hasCard((card) => lib.skill.olqiangxi.filterCard(card), "he") + ) + return false; + return game.hasPlayer((current) => + lib.skill.olqiangxi.filterTarget(null, player, current) + ); }, - filterCard:function(card){ - return get.subtype(card)=='equip1'; + filterCard: function (card) { + return get.subtype(card) == "equip1"; }, - position:'he', - filterTarget:function(card,player,target){ - if(target==player) return false; - var stat=player.getStat()._olqiangxi; - return !stat||!stat.includes(target); + position: "he", + filterTarget: function (card, player, target) { + if (target == player) return false; + var stat = player.getStat()._olqiangxi; + return !stat || !stat.includes(target); }, - selectCard:function(){ - if(_status.event.player.hp<1) return 1; - return [0,1]; + selectCard: function () { + if (_status.event.player.hp < 1) return 1; + return [0, 1]; }, - content:function(){ - var stat=player.getStat(); - if(!stat._olqiangxi) stat._olqiangxi=[]; + content: function () { + var stat = player.getStat(); + if (!stat._olqiangxi) stat._olqiangxi = []; stat._olqiangxi.push(target); - if(!cards.length) player.damage('nosource','nocard'); - target.damage('nocard'); + if (!cards.length) player.damage("nosource", "nocard"); + target.damage("nocard"); }, - ai:{ - damage:true, - order:8, - result:{ - player:function(player,target){ - if(ui.selected.cards.length) return 0; - if(player.hp>=target.hp) return -0.9; - if(player.hp<=2) return -10; - return get.damageEffect(player,player,player); + ai: { + damage: true, + order: 8, + result: { + player: function (player, target) { + if (ui.selected.cards.length) return 0; + if (player.hp >= target.hp) return -0.9; + if (player.hp <= 2) return -10; + return get.damageEffect(player, player, player); }, - target:function(player,target){ - if(!ui.selected.cards.length){ - if(player.hp<2) return 0; - if(player.hp==2&&target.hp>=2) return 0; - if(target.hp>player.hp) return 0; + target: function (player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (player.hp == 2 && target.hp >= 2) return 0; + if (target.hp > player.hp) return 0; } - return get.damageEffect(target,player,target); - } + return get.damageEffect(target, player, target); + }, }, - threaten:1.5, + threaten: 1.5, }, }, - olningwu:{ - audio:2, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - if(player!=event.player&&player!=event.source) return false; - return event.player.getHistory('damage').indexOf(event)==1; + olningwu: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (player != event.player && player != event.source) return false; + return event.player.getHistory("damage").indexOf(event) == 1; }, - logTarget:'player', - forced:true, - content:function(){ + logTarget: "player", + forced: true, + content: function () { player.draw(); - player.discardPlayerCard(trigger.player,true,'ej'); + player.discardPlayerCard(trigger.player, true, "ej"); }, }, //群太史慈 - rejixu:{ - audio:2, - enable:"phaseUse", - usable:1, - filter:function(event,player){ - return player.hp>0&&player.countCards('h')>0; + rejixu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hp > 0 && player.countCards("h") > 0; }, - filterTarget:lib.filter.notMe, - selectTarget:function(){ - return [1,_status.event.player.hp]; + filterTarget: lib.filter.notMe, + selectTarget: function () { + return [1, _status.event.player.hp]; }, - multitarget:true, - multiline:true, - content:function(){ - "step 0" + multitarget: true, + multiline: true, + content: function () { + "step 0"; targets.sortBySeat(); - event.num=0; - "step 1" - if(!event.caicuolist) event.caicuolist=[]; - targets[event.num].chooseBool("是否押杀?").ai=function(event,player){ - var evt=_status.event.getParent(); - if(get.attitude(targets[event.num],evt.player)>0) return evt.player.countCards('h','sha')?false:true; - if(evt.player.hasKnownCards(targets[event.num],c=>{return c.name == 'sha';})){ + event.num = 0; + ("step 1"); + if (!event.caicuolist) event.caicuolist = []; + targets[event.num].chooseBool("是否押杀?").ai = function (event, player) { + var evt = _status.event.getParent(); + if (get.attitude(targets[event.num], evt.player) > 0) + return evt.player.countCards("h", "sha") ? false : true; + if ( + evt.player.hasKnownCards(targets[event.num], (c) => { + return c.name == "sha"; + }) + ) { return true; } - return Math.random()<0.5; + return Math.random() < 0.5; }; - "step 2" - if(result.bool){ - targets[event.num].chat('有杀'); - game.log(targets[event.num],'认为',player,'#g有杀'); - if(!player.countCards('h','sha')) event.caicuolist.add(targets[event.num]); - }else{ - targets[event.num].chat('没杀'); - game.log(targets[event.num],'认为',player,'#y没有杀'); - if(player.countCards('h','sha')) event.caicuolist.add(targets[event.num]); + ("step 2"); + if (result.bool) { + targets[event.num].chat("有杀"); + game.log(targets[event.num], "认为", player, "#g有杀"); + if (!player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); + } else { + targets[event.num].chat("没杀"); + game.log(targets[event.num], "认为", player, "#y没有杀"); + if (player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); } event.num++; game.delay(); - if(event.num0){ - if(player.countCards('h','sha')){ - player.markAuto('rejixu_sha',event.caicuolist); - player.addTempSkill('rejixu_sha','phaseUseAfter'); - player.draw(event.caicuolist.length) + if (event.num < targets.length) event.goto(1); + ("step 3"); + player.popup(player.countCards("h", "sha") ? "有杀" : "没杀"); + game.log(player, player.countCards("h", "sha") ? "有杀" : "没杀"); + if (event.caicuolist.length > 0) { + if (player.countCards("h", "sha")) { + player.markAuto("rejixu_sha", event.caicuolist); + player.addTempSkill("rejixu_sha", "phaseUseAfter"); + player.draw(event.caicuolist.length); event.finish(); + } else { + event.num = 0; } - else{ - event.num=0; - } - } - else event.finish(); - "step 4" - var target=event.caicuolist[event.num]; - if(target.countCards('he')>0){ + } else event.finish(); + ("step 4"); + var target = event.caicuolist[event.num]; + if (target.countCards("he") > 0) { player.line(target); - player.discardPlayerCard(true,'he',target); + player.discardPlayerCard(true, "he", target); } event.num++; - if(event.num0; + for (var i of list) eff += get.effect(i, event.card, player, player); + return eff > 0; }, - content:function(){ - var list=player.getStorage('rejixu_sha').filter(function(target){ - if(trigger.targets.includes(target)||!target.isIn()) return false; - return lib.filter.targetEnabled2(trigger.card,player,target) + content: function () { + var list = player.getStorage("rejixu_sha").filter(function (target) { + if (trigger.targets.includes(target) || !target.isIn()) return false; + return lib.filter.targetEnabled2(trigger.card, player, target); }); - if(list.length>0){ + if (list.length > 0) { trigger.targets.addArray(list); - game.log(list,'也成为了',trigger.card,'的目标'); + game.log(list, "也成为了", trigger.card, "的目标"); } }, }, }, }, //界刘封 - rexiansi:{ - inherit:'xiansi', - audio:'xiansi', - audioname:['re_liufeng'], - group:['rexiansi2','xiansix'], + rexiansi: { + inherit: "xiansi", + audio: "xiansi", + audioname: ["re_liufeng"], + group: ["rexiansi2", "xiansix"], }, - rexiansi2:{ - enable:'chooseToUse', - filter:function(event,player){ - return player.getExpansions('xiansi').length>Math.max(0,player.hp)&&event.filterCard({name:'sha',isCard:true},player,event); + rexiansi2: { + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.getExpansions("xiansi").length > Math.max(0, player.hp) && + event.filterCard({ name: "sha", isCard: true }, player, event) + ); }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('陷嗣',player.getExpansions('xiansi'),'hidden'); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("陷嗣", player.getExpansions("xiansi"), "hidden"); }, - backup:function(links,player){ + backup: function (links, player) { return { - viewAs:{name:'sha',isCard:true}, - filterCard:()=>false, - selectCard:-1, - card:links[0], - precontent:function(){ - player.logSkill('rexiansi'); + viewAs: { name: "sha", isCard: true }, + filterCard: () => false, + selectCard: -1, + card: links[0], + precontent: function () { + player.logSkill("rexiansi"); player.loseToDiscardpile(lib.skill.rexiansi2_backup.card); delete event.result.skill; }, }; }, - prompt:()=>'请选择【杀】的目标', + prompt: () => "请选择【杀】的目标", }, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.6; + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.6; }, - result:{player:1}, + result: { player: 1 }, }, }, //界荀彧 - oljieming:{ - audio:2, - trigger:{player:['damageEnd','die']}, - direct:true, - forceDie:true, - filter:function(event,player){ - if(event.name=='die') return true; + oljieming: { + audio: 2, + trigger: { player: ["damageEnd", "die"] }, + direct: true, + forceDie: true, + filter: function (event, player) { + if (event.name == "die") return true; return player.isIn(); }, - content:function(){ - 'step 0' - event.count=trigger.num||1; - 'step 1' + content: function () { + "step 0"; + event.count = trigger.num || 1; + ("step 1"); event.count--; - player.chooseTarget(get.prompt2('oljieming'),function(card,player,target){ - return target.maxHp>0; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - var draw=Math.min(5,target.maxHp)-target.countCards('h'); - if(draw>=0){ - if(target.hasSkillTag('nogain')) att/=6; - if(att>2){ - return Math.sqrt(draw+1)*att; + player + .chooseTarget(get.prompt2("oljieming"), function (card, player, target) { + return target.maxHp > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var draw = Math.min(5, target.maxHp) - target.countCards("h"); + if (draw >= 0) { + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) { + return Math.sqrt(draw + 1) * att; + } + return att / 3; } - return att/3; - } - if(draw<-1){ - if(target.hasSkillTag('nogain')) att*=6; - if(att<-2){ - return -Math.sqrt(1-draw)*att; + if (draw < -1) { + if (target.hasSkillTag("nogain")) att *= 6; + if (att < -2) { + return -Math.sqrt(1 - draw) * att; + } } - } - return 0; - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('oljieming',target); - target.draw(Math.min(5,target.maxHp)); - } - else event.finish(); - 'step 3' - var num=target.countCards('h')-Math.min(5,target.maxHp); - if(num>0) target.chooseToDiscard('h',true,num); - 'step 4' - if(event.count>0&&player.isIn()&&player.hasSkill('oljieming')) event.goto(1); + return 0; + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oljieming", target); + target.draw(Math.min(5, target.maxHp)); + } else event.finish(); + ("step 3"); + var num = target.countCards("h") - Math.min(5, target.maxHp); + if (num > 0) target.chooseToDiscard("h", true, num); + ("step 4"); + if (event.count > 0 && player.isIn() && player.hasSkill("oljieming")) event.goto(1); }, - ai:{ - expose:0.2, - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&target.hp>1){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - var max=0; - var players=game.filterPlayer(); - for(var i=0;i0){ - max=Math.max(Math.min(5,players[i].hp)-players[i].countCards('h'),max); + ai: { + expose: 0.2, + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max( + Math.min(5, players[i].hp) - players[i].countCards("h"), + max + ); } } - switch(max){ - case 0:return 2; - case 1:return 1.5; - case 2:return [1,2]; - default:return [0,max]; + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; } } - if((card.name=='tao'||card.name=='caoyao')&& - target.hp>1&&target.countCards('h')<=target.hp) return [0,0]; - } + if ( + (card.name == "tao" || card.name == "caoyao") && + target.hp > 1 && + target.countCards("h") <= target.hp + ) + return [0, 0]; + }, }, - } + }, }, //OL华雄 - shizhan:{ - audio:2, - enable:'phaseUse', - usable:2, - filterTarget:function(card,player,target){ - return target!=player&&target.canUse('juedou',player); + shizhan: { + audio: 2, + enable: "phaseUse", + usable: 2, + filterTarget: function (card, player, target) { + return target != player && target.canUse("juedou", player); }, - content:function(){ - target.useCard({name:'juedou',isCard:true},player,'noai'); + content: function () { + target.useCard({ name: "juedou", isCard: true }, player, "noai"); }, - ai:{ - order:2, - result:{ - player:function(player,target){ - return get.effect(player,{name:'juedou',isCard:true},target,player); + ai: { + order: 2, + result: { + player: function (player, target) { + return get.effect(player, { name: "juedou", isCard: true }, target, player); }, }, }, }, //刘谌 - rezhanjue:{ - audio:2,enable:'phaseUse', - filterCard:function(card){ - return !card.hasGaintag('reqinwang'); + rezhanjue: { + audio: 2, + enable: "phaseUse", + filterCard: function (card) { + return !card.hasGaintag("reqinwang"); }, - selectCard:-1, - position:'h', - filter:function(event,player){ - var stat=player.getStat().skill; - if(stat.rezhanjue_draw&&stat.rezhanjue_draw>=3) return false; - var hs=player.getCards('h',function(card){ - return !card.hasGaintag('reqinwang'); + selectCard: -1, + position: "h", + filter: function (event, player) { + var stat = player.getStat().skill; + if (stat.rezhanjue_draw && stat.rezhanjue_draw >= 3) return false; + var hs = player.getCards("h", function (card) { + return !card.hasGaintag("reqinwang"); }); - if(!hs.length) return false; - for(var i=0;i0&&get.attitude(player,target)>0&&get.attitude(target,player)>0){ + if ( + get.damageEffect(target, player, target) > 0 && + get.attitude(player, target) > 0 && + get.attitude(target, player) > 0 + ) { return 0; } - var hs1=target.getCards('h','sha'); - var hs2=player.getCards('h',function(card){ - return card.hasGaintag('reqinwang')&&get.name(card)=='sha'; + var hs1 = target.getCards("h", "sha"); + var hs2 = player.getCards("h", function (card) { + return card.hasGaintag("reqinwang") && get.name(card) == "sha"; }); - if(hs1.length>hs2.length+1){ + if (hs1.length > hs2.length + 1) { return -2; } - var hsx=target.getCards('h'); - if(hsx.length>2&&hs2.length==0&&hsx[0].number<6){ + var hsx = target.getCards("h"); + if (hsx.length > 2 && hs2.length == 0 && hsx[0].number < 6) { return -2; } - if(hsx.length>3&&hs2.length==0){ + if (hsx.length > 3 && hs2.length == 0) { return -2; } - if(hs1.length>hs2.length&&(!hs2.length||hs1[0].number>hs2[0].number)){ + if (hs1.length > hs2.length && (!hs2.length || hs1[0].number > hs2[0].number)) { return -2; } return -0.5; - } + }, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + player.countSkill("rezhanjue_draw") < 3 && + player.hasCard((card) => { + return get.name(card) !== "tao" && !card.hasGaintag("reqinwang"); + }, "h") + ); }, - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('rezhanjue_draw')<3&&player.hasCard((card)=>{ - return get.name(card)!=='tao'&&!card.hasGaintag('reqinwang'); - },'h'); - } }, }, - rezhanjue_effect:{ - audio:false, - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - charlotte:true, - onremove:function(player){ + rezhanjue_effect: { + audio: false, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + charlotte: true, + onremove: function (player) { delete player.getStat().skill.rezhanjue_draw; }, - filter:function(event,player){ - return event.skill=='rezhanjue'; + filter: function (event, player) { + return event.skill == "rezhanjue"; }, - content:function(){ - "step 0" - var stat=player.getStat().skill; - if(!stat.rezhanjue_draw) stat.rezhanjue_draw=0; + content: function () { + "step 0"; + var stat = player.getStat().skill; + if (!stat.rezhanjue_draw) stat.rezhanjue_draw = 0; stat.rezhanjue_draw++; - player.draw('nodelay'); - var list=game.filterPlayer(function(current){ - if(current.getHistory('damage',function(evt){ - return evt.card==trigger.card; - }).length>0){ - if(current==player){ + player.draw("nodelay"); + var list = game.filterPlayer(function (current) { + if ( + current.getHistory("damage", function (evt) { + return evt.card == trigger.card; + }).length > 0 + ) { + if (current == player) { stat.rezhanjue_draw++; } return true; } return false; }); - if(list.length){ + if (list.length) { list.sortBySeat(); game.asyncDraw(list); } - "step 1" + ("step 1"); game.delay(); - } + }, }, - reqinwang:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuSkill:true, - filter:function(event,player){ - if(!player.hasZhuSkill('reqinwang')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'&&player.hasZhuSkill('reqinwang',current); + reqinwang: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuSkill: true, + filter: function (event, player) { + if (!player.hasZhuSkill("reqinwang")) return false; + return game.hasPlayer(function (current) { + return ( + current != player && + current.group == "shu" && + player.hasZhuSkill("reqinwang", current) + ); }); }, - selectTarget:-1, - filterTarget:function(card,player,current){ - return current!=player&¤t.group=='shu'&&player.hasZhuSkill('reqinwang',current); + selectTarget: -1, + filterTarget: function (card, player, current) { + return ( + current != player && + current.group == "shu" && + player.hasZhuSkill("reqinwang", current) + ); }, - content:function(){ - 'step 0' - if(target.hasCard(function(card){ - return _status.connectMode||get.name(card,target)=='sha'; - },'h')){ - target.chooseCard('是否交给'+get.translation(player)+'一张【杀】?',function(card,player){ - return get.name(card,player)=='sha'; - },'h').set('goon',get.attitude(target,player)>0).set('ai',function(card){ - return _status.event.goon?1:0; - }); - } - else event.finish(); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - target.give(card,player).gaintag.add('reqinwang'); - player.addTempSkill('reqinwang_clear'); - player.chooseBool('是否令'+get.translation(target)+'摸一张牌?'); - } - else event.finish(); - 'step 2' - if(result.bool) target.draw(); + content: function () { + "step 0"; + if ( + target.hasCard(function (card) { + return _status.connectMode || get.name(card, target) == "sha"; + }, "h") + ) { + target + .chooseCard( + "是否交给" + get.translation(player) + "一张【杀】?", + function (card, player) { + return get.name(card, player) == "sha"; + }, + "h" + ) + .set("goon", get.attitude(target, player) > 0) + .set("ai", function (card) { + return _status.event.goon ? 1 : 0; + }); + } else event.finish(); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + target.give(card, player).gaintag.add("reqinwang"); + player.addTempSkill("reqinwang_clear"); + player.chooseBool("是否令" + get.translation(target) + "摸一张牌?"); + } else event.finish(); + ("step 2"); + if (result.bool) target.draw(); }, - ai:{ - order:5, - result:{player:1}, + ai: { + order: 5, + result: { player: 1 }, }, - subSkill:{ - clear:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('reqinwang'); + subSkill: { + clear: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("reqinwang"); }, }, }, }, //公孙瓒 - dcqiaomeng:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - if(!event.isFirstTarget||get.color(event.card)!='black') return false; - for(var i of event.targets){ - if(i!=player&&i.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,i); - },'he')) return true; + dcqiaomeng: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + if (!event.isFirstTarget || get.color(event.card) != "black") return false; + for (var i of event.targets) { + if ( + i != player && + i.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, i); + }, "he") + ) + return true; } return false; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('dcqiaomeng'),'选择一名不为自己的目标角色,然后弃置其一张牌。若以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令'+get.translation(trigger.card)+'不可被响应。',function(card,player,target){ - return target!=player&&_status.event.getTrigger().targets.includes(target)&&target.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,target); - },'he'); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player) - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcqiaomeng',target); - player.discardPlayerCard(target,true,'he'); - } - else event.finish(); - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("dcqiaomeng"), + "选择一名不为自己的目标角色,然后弃置其一张牌。若以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令" + + get.translation(trigger.card) + + "不可被响应。", + function (card, player, target) { + return ( + target != player && + _status.event.getTrigger().targets.includes(target) && + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcqiaomeng", target); + player.discardPlayerCard(target, true, "he"); + } else event.finish(); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { //为了体现白马义从野性纯真的美 直接获取卡牌原类型 不考虑维系区域 - var card=result.cards[0],type=get.type2(card,false); - if(type=='trick') trigger.directHit.addArray(game.filterPlayer((current)=>current!=player)); - if(type=='equip'&&get.position(card,true)=='d') player.gain(card,'gain2'); + var card = result.cards[0], + type = get.type2(card, false); + if (type == "trick") + trigger.directHit.addArray(game.filterPlayer((current) => current != player)); + if (type == "equip" && get.position(card, true) == "d") player.gain(card, "gain2"); } }, }, //杜畿 - reandong:{ - audio:2, - trigger:{player:'damageBegin2'}, - filter:function(event,player){ - return event.source&&event.source.isIn(); + reandong: { + audio: 2, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return event.source && event.source.isIn(); }, - logTarget:'source', - content:function(){ - 'step 0' - var target=trigger.source,str=get.translation(player); - var bool=player.storage.reandong; - if(bool) str='自己'; - var choiceList=['防止'+str+'即将受到的伤害,且本回合内红桃牌不计入'+(bool?get.translation(target):'自己')+'的手牌上限。']; - if(!target.countCards('h')) choiceList.push('令'+str+'下次发动〖安东〗时改为自行选择'); - else choiceList.push('令'+str+'观看你的手牌并获得所有红桃牌'); - if(bool){ + logTarget: "source", + content: function () { + "step 0"; + var target = trigger.source, + str = get.translation(player); + var bool = player.storage.reandong; + if (bool) str = "自己"; + var choiceList = [ + "防止" + + str + + "即将受到的伤害,且本回合内红桃牌不计入" + + (bool ? get.translation(target) : "自己") + + "的手牌上限。", + ]; + if (!target.countCards("h")) + choiceList.push("令" + str + "下次发动〖安东〗时改为自行选择"); + else choiceList.push("令" + str + "观看你的手牌并获得所有红桃牌"); + if (bool) { delete player.storage.reandong; - player.chooseControl().set('choiceList',choiceList).set('prompt','安东:请选择一项'); + player + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", "安东:请选择一项"); + } else { + target + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", "安东:请选择一项") + .set("ai", function (event, player) { + var target = _status.event.getParent().player; + var player = _status.event.player; + if (get.attitude(player, target) > 0) return 0; + return 1; + }); } - else{ - target.chooseControl().set('choiceList',choiceList).set('prompt','安东:请选择一项').set('ai',function(event,player){ - var target=_status.event.getParent().player; - var player=_status.event.player; - if(get.attitude(player,target)>0) return 0; - return 1; - }); - } - 'step 1' - var target=trigger.source; - if(result.index==0){ - target.addTempSkill('reandong_ignore'); + ("step 1"); + var target = trigger.source; + if (result.index == 0) { + target.addTempSkill("reandong_ignore"); trigger.cancel(); game.delayx(); - } - else{ - if(!target.countCards('h')){ - player.storage.reandong=true; + } else { + if (!target.countCards("h")) { + player.storage.reandong = true; game.delayx(); - } - else{ + } else { player.viewHandcards(target); - var cards=target.getCards('h',function(card){ - return get.suit(card,target)=='heart'; + var cards = target.getCards("h", function (card) { + return get.suit(card, target) == "heart"; }); - if(cards.length>0) player.gain(cards,target,'give','bySelf'); + if (cards.length > 0) player.gain(cards, target, "give", "bySelf"); } } }, - ai:{ - maixie:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')&&player!=target&&get.attitude(player,target)<0){ - var cards=player.getCards('h',function(cardx){ - return card!=cardx&&(!card.cards||!card.cards.includes(cardx))&&get.suit(cardx)=='heart'; + ai: { + maixie: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if ( + get.tag(card, "damage") && + player != target && + get.attitude(player, target) < 0 + ) { + var cards = player.getCards("h", function (cardx) { + return ( + card != cardx && + (!card.cards || !card.cards.includes(cardx)) && + get.suit(cardx) == "heart" + ); }); - if(!cards.length) return; - for(var i of cards){ - if(get.name(i,target)=='tao') return 'zeroplayertarget'; + if (!cards.length) return; + for (var i of cards) { + if (get.name(i, target) == "tao") return "zeroplayertarget"; } - if(get.value(cards,target)>=(6+target.getDamagedHp())) return 'zeroplayertarget'; - return [1,0.6]; + if (get.value(cards, target) >= 6 + target.getDamagedHp()) + return "zeroplayertarget"; + return [1, 0.6]; } }, }, }, - subSkill:{ - ignore:{ - mod:{ - ignoredHandcard:function(card,player){ - if(get.suit(card)=='heart'){ + subSkill: { + ignore: { + mod: { + ignoredHandcard: function (card, player) { + if (get.suit(card) == "heart") { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.suit(card)=='heart') return false; - } + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.suit(card) == "heart") return false; + }, }, - charlotte:true, - marktext:'♥', - intro:'红桃牌于本回合内不计入手牌上限', + charlotte: true, + marktext: "♥", + intro: "红桃牌于本回合内不计入手牌上限", }, }, }, - reyingshi:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0&&game.countPlayer()>1; + reyingshi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0 && game.countPlayer() > 1; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('reyingshi'), - prompt2:'操作提示:选择一张作为赏金的手牌,然后选择作为赏金猎人的角色A和作为出杀目标的其他角色B', - filterCard:true, - selectTarget:2, - position:'h', - filterTarget:function(card,player,target){ - if(!ui.selected.targets.length) return true; - return target!=player; + prompt: get.prompt("reyingshi"), + prompt2: + "操作提示:选择一张作为赏金的手牌,然后选择作为赏金猎人的角色A和作为出杀目标的其他角色B", + filterCard: true, + selectTarget: 2, + position: "h", + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return true; + return target != player; }, - complexTarget:true, - targetprompt:['出杀','被杀'], - complexSelect:true, - ai1:function(card){ - return 1/Math.max(1,get.value(card)); + complexTarget: true, + targetprompt: ["出杀", "被杀"], + complexSelect: true, + ai1: function (card) { + return 1 / Math.max(1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player; - if(!ui.selected.targets.length){ - var att=get.attitude(player,target); - if(att<0) return 0; - if(target.hasSha()) return Math.pow(target.countCards('h')+1,1.1)*(player==target?3:1); - return Math.sqrt(1+target.countCards('h')); + ai2: function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + var att = get.attitude(player, target); + if (att < 0) return 0; + if (target.hasSha()) + return ( + Math.pow(target.countCards("h") + 1, 1.1) * (player == target ? 3 : 1) + ); + return Math.sqrt(1 + target.countCards("h")); } - return get.effect(target,{name:'sha'},ui.selected.targets[0],player); + return get.effect(target, { name: "sha" }, ui.selected.targets[0], player); }, }); - 'step 1' - if(result.bool){ - var targets=result.targets; - event.targets=targets; - player.logSkill('reyingshi',targets[1]); - var card=result.cards[0]; - event.card=card; - player.showCards(card,get.translation(player)+'对'+get.translation(targets[1])+'发动了【应势】'); - player.line(targets[0],'fire'); - } - else event.finish(); - 'step 2' - var next=targets[0].chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.cardEnabled.apply(this,arguments)&&lib.filter.targetEnabled(card,player,(event||_status.event).sourcex); - },'###是否对'+get.translation(targets[1])+'使用一张【杀】?###若选择使用,则获得赏金('+get.translation(card)+')。若造成伤害,则再从牌堆中获得与此牌花色点数相同的牌作为额外赏金。'); - next.set('addCount',false); - next.set('complexSelect',true); - next.set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); + ("step 1"); + if (result.bool) { + var targets = result.targets; + event.targets = targets; + player.logSkill("reyingshi", targets[1]); + var card = result.cards[0]; + event.card = card; + player.showCards( + card, + get.translation(player) + "对" + get.translation(targets[1]) + "发动了【应势】" + ); + player.line(targets[0], "fire"); + } else event.finish(); + ("step 2"); + var next = targets[0].chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return ( + lib.filter.cardEnabled.apply(this, arguments) && + lib.filter.targetEnabled(card, player, (event || _status.event).sourcex) + ); + }, "###是否对" + + get.translation(targets[1]) + + "使用一张【杀】?###若选择使用,则获得赏金(" + + get.translation(card) + + ")。若造成伤害,则再从牌堆中获得与此牌花色点数相同的牌作为额外赏金。"); + next.set("addCount", false); + next.set("complexSelect", true); + next.set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); }); - next.set('sourcex',targets[1]); - 'step 3' - var target=targets[0] - if(result.bool&&target.isIn()){ - var cards=[],slice=0; - if(player!=target&&player.getCards('h').includes(card)){ + next.set("sourcex", targets[1]); + ("step 3"); + var target = targets[0]; + if (result.bool && target.isIn()) { + var cards = [], + slice = 0; + if (player != target && player.getCards("h").includes(card)) { cards.push(card); slice++; } - if(target.hasHistory('useCard',function(evt){ - if(evt.getParent(2)!=event) return false; - return target.hasHistory('sourceDamage',function(evtx){ - return evtx.card==evt.card; - }); - })){ - var suit=get.suit(card),number=get.number(card); - for(var i=0;i0){ - if(!slice) target.gain(cards,'gain2'); - else{ - setTimeout(function(){ - target.$gain2(cards.slice(slice),true); - },get.delayx(200,200)); - target.gain(cards,player,'give'); + if (cards.length > 0) { + if (!slice) target.gain(cards, "gain2"); + else { + setTimeout(function () { + target.$gain2(cards.slice(slice), true); + }, get.delayx(200, 200)); + target.gain(cards, player, "give"); } } - } - else{ - if(cards.length>0) target.gain(cards,player,'give'); + } else { + if (cards.length > 0) target.gain(cards, player, "give"); } } }, }, //十周年沮授 - dcshibei:{ - trigger:{player:'damageEnd'}, - forced:true, - audio:2, - check:function(event,player){ - return player.getHistory('damage').indexOf(event)==0; + dcshibei: { + trigger: { player: "damageEnd" }, + forced: true, + audio: 2, + check: function (event, player) { + return player.getHistory("damage").indexOf(event) == 0; }, - filter:function(event,player){ - var index=player.getHistory('damage').indexOf(event); - return index==0||index==1; + filter: function (event, player) { + var index = player.getHistory("damage").indexOf(event); + return index == 0 || index == 1; }, - content:function(){ - if(player.getHistory('damage').indexOf(trigger)>0){ + content: function () { + if (player.getHistory("damage").indexOf(trigger) > 0) { player.loseHp(); - } - else{ + } else { player.recover(); } }, - subSkill:{ - damaged:{}, - ai:{} + subSkill: { + damaged: {}, + ai: {}, }, - ai:{ - maixie_defend:true, - threaten:0.9, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing')) return; - if(target.hujia) return; - if(player._shibei_tmp) return; - if(target.hasSkill('shibei_ai')) return; - if(_status.event.getParent('useCard',true)||_status.event.getParent('_wuxie',true)) return; - if(get.tag(card,'damage')){ - if(target.getHistory('damage').length>0){ - return [1,-2]; - } - else{ - if(get.attitude(player,target)>0&&target.hp>1){ + ai: { + maixie_defend: true, + threaten: 0.9, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing")) return; + if (target.hujia) return; + if (player._shibei_tmp) return; + if (target.hasSkill("shibei_ai")) return; + if ( + _status.event.getParent("useCard", true) || + _status.event.getParent("_wuxie", true) + ) + return; + if (get.tag(card, "damage")) { + if (target.getHistory("damage").length > 0) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0 && target.hp > 1) { return 0; } - if(get.attitude(player,target)<0&&!player.hasSkillTag('damageBonus','e',{ - target:target, - card:card - })){ - if(card.name=='sha') return; - var sha=false; - player._shibei_tmp=true; - var num=player.countCards('h',function(card){ - if(card.name=='sha'){ - if(sha){ + if ( + get.attitude(player, target) < 0 && + !player.hasSkillTag("damageBonus", "e", { + target: target, + card: card, + }) + ) { + if (card.name == "sha") return; + var sha = false; + player._shibei_tmp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha) { return false; - } - else{ - sha=true; + } else { + sha = true; } } - return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,player)>0; + return ( + get.tag(card, "damage") && + player.canUse(card, target) && + get.effect(target, card, player, player) > 0 + ); }); delete player._shibei_tmp; - if(player.hasSkillTag('damage')){ + if (player.hasSkillTag("damage")) { num++; } - if(num<2){ - var enemies=player.getEnemies(); - if(enemies.length==1&&enemies[0]==target&&player.needsToDiscard()){ + if (num < 2) { + var enemies = player.getEnemies(); + if ( + enemies.length == 1 && + enemies[0] == target && + player.needsToDiscard() + ) { return; } return 0; @@ -3246,91 +3955,120 @@ game.import('character', function () { } } } - } - } - } + }, + }, + }, }, - dcjianying:{ - audio:2, - locked:false, - mod:{ - aiOrder:function(player,card,num){ - if(typeof card=='object'&&player.isPhaseUsing()){ - var evt=lib.skill.dcjianying.getLastUsed(player); - if(evt&&evt.card&&(get.suit(evt.card)&&get.suit(evt.card)==get.suit(card)||evt.card.number&&evt.card.number==get.number(card))){ - return num+10; + dcjianying: { + audio: 2, + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object" && player.isPhaseUsing()) { + var evt = lib.skill.dcjianying.getLastUsed(player); + if ( + evt && + evt.card && + ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || + (evt.card.number && evt.card.number == get.number(card))) + ) { + return num + 10; } } }, }, - trigger:{player:'useCard'}, - frequent:true, - getLastUsed:function(player,event){ - var history=player.getAllHistory('useCard'); + trigger: { player: "useCard" }, + frequent: true, + getLastUsed: function (player, event) { + var history = player.getAllHistory("useCard"); var index; - if(event) index=history.indexOf(event)-1; - else index=history.length-1; - if(index>=0) return history[index]; + if (event) index = history.indexOf(event) - 1; + else index = history.length - 1; + if (index >= 0) return history[index]; return false; }, - filter:function(event,player){ - var evt=lib.skill.dcjianying.getLastUsed(player,event); - if(!evt||!evt.card) return false; - return lib.suit.includes(get.suit(evt.card))&&get.suit(evt.card)==get.suit(event.card)|| - typeof get.number(evt.card,false)=='number'&&get.number(evt.card,false)==get.number(event.card); + filter: function (event, player) { + var evt = lib.skill.dcjianying.getLastUsed(player, event); + if (!evt || !evt.card) return false; + return ( + (lib.suit.includes(get.suit(evt.card)) && + get.suit(evt.card) == get.suit(event.card)) || + (typeof get.number(evt.card, false) == "number" && + get.number(evt.card, false) == get.number(event.card)) + ); }, - content:function(){ + content: function () { player.draw(); }, - group:'dcjianying_mark', - init:function(player){ - var history=player.getAllHistory('useCard'); - if(history.length){ - var trigger=history[history.length-1]; - if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') return; - player.storage.dcjianying_mark=trigger.card; - player.markSkill('dcjianying_mark'); - game.broadcastAll(function(player,suit){ - if(player.marks.dcjianying_mark) player.marks.dcjianying_mark.firstChild.innerHTML=get.translation(suit); - },player,get.suit(trigger.card,player)); + group: "dcjianying_mark", + init: function (player) { + var history = player.getAllHistory("useCard"); + if (history.length) { + var trigger = history[history.length - 1]; + if ( + get.suit(trigger.card, player) == "none" || + typeof get.number(trigger.card, player) != "number" + ) + return; + player.storage.dcjianying_mark = trigger.card; + player.markSkill("dcjianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.dcjianying_mark) + player.marks.dcjianying_mark.firstChild.innerHTML = get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); } }, - onremove:function(player){ - player.unmarkSkill('dcjianying_mark'); + onremove: function (player) { + player.unmarkSkill("dcjianying_mark"); delete player.storage.dcjianying_mark; }, - subSkill:{ - mark:{ - charlotte:true, - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - content:function(){ - if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') player.unmarkSkill('dcjianying_mark'); - else{ - player.storage.dcjianying_mark=trigger.card; - player.markSkill('dcjianying_mark'); - game.broadcastAll(function(player,suit){ - if(player.marks.dcjianying_mark) player.marks.dcjianying_mark.firstChild.innerHTML=get.translation(suit); - },player,get.suit(trigger.card,player)); + subSkill: { + mark: { + charlotte: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + content: function () { + if ( + get.suit(trigger.card, player) == "none" || + typeof get.number(trigger.card, player) != "number" + ) + player.unmarkSkill("dcjianying_mark"); + else { + player.storage.dcjianying_mark = trigger.card; + player.markSkill("dcjianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.dcjianying_mark) + player.marks.dcjianying_mark.firstChild.innerHTML = + get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); } }, - intro:{ - markcount:function(card,player){ - var num=get.number(card,player); - var list=[1,11,12,13]; - if(list.includes(num)) return ['A','J','Q','K'][list.indexOf(num)]; + intro: { + markcount: function (card, player) { + var num = get.number(card, player); + var list = [1, 11, 12, 13]; + if (list.includes(num)) return ["A", "J", "Q", "K"][list.indexOf(num)]; return parseFloat(num); }, - content:function(card,player){ - var suit=get.suit(card,player); - var num=get.number(card,player); - var str='
  • 上一张牌的花色:'+get.translation(suit); - str+='
  • 上一张牌的点数:'; - var list=[1,11,12,13]; - if(list.includes(num)) str+=['A(1)','J(11)','Q(12)','K(13)'][list.indexOf(num)]; - else str+=parseFloat(num); + content: function (card, player) { + var suit = get.suit(card, player); + var num = get.number(card, player); + var str = "
  • 上一张牌的花色:" + get.translation(suit); + str += "
  • 上一张牌的点数:"; + var list = [1, 11, 12, 13]; + if (list.includes(num)) + str += ["A(1)", "J(11)", "Q(12)", "K(13)"][list.indexOf(num)]; + else str += parseFloat(num); return str; }, }, @@ -3338,1192 +4076,1485 @@ game.import('character', function () { }, }, //十周年步练师 - dcanxu:{ - enable:'phaseUse', - usable:1, - multitarget:true, - audio:2, - filterTarget:function(card,player,target){ - if(player==target) return false; - var num=target.countCards('h'); - if(ui.selected.targets.length){ - return numplayers[i].countCards('h')) return true; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; } return false; }, - selectTarget:2, - content:function(){ - 'step 0' - var gainner,giver; - if(targets[0].countCards('h')0) return -1; - var players=game.filterPlayer(); - for(var i=0;i0) return -3; + ai: { + order: 10.5, + threaten: 2.3, + result: { + target: function (player, target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (ui.selected.targets.length == 0) { + if (att > 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (num2 < num) { + if (att2 > 0) return -3; return -1; } } return 0; - } - else{ + } else { return 1; } }, - player:1, - } - } + player: 1, + }, + }, }, - dczhuiyi:{ - audio:2, - trigger:{player:'die'}, - direct:true, - skillAnimation:true, - animationColor:'wood', - forceDie:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('dczhuiyi'),function(card,player,target){ - return player!=target&&_status.event.sourcex!=target; - }).set('forceDie',true).set('ai',function(target){ - var num=get.attitude(_status.event.player,target); - if(num>0){ - if(target.hp==1){ - num+=2; + dczhuiyi: { + audio: 2, + trigger: { player: "die" }, + direct: true, + skillAnimation: true, + animationColor: "wood", + forceDie: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("dczhuiyi"), function (card, player, target) { + return player != target && _status.event.sourcex != target; + }) + .set("forceDie", true) + .set("ai", function (target) { + var num = get.attitude(_status.event.player, target); + if (num > 0) { + if (target.hp == 1) { + num += 2; + } + if (target.hp < target.maxHp) { + num += 2; + } } - if(target.hp0; + olbeige: { + audio: "beige", + audioname: ["ol_caiwenji"], + trigger: { global: "damageEnd" }, + logTarget: "player", + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.player.isIn() && + player.countCards("he") > 0 + ); }, - check:function(event,player){ - let att=get.attitude(player,event.player); - if(event.player.hasSkill('xinleiji')) return att>0; - if(att>0||event.player.isHealthy()) return true; - if(!event.source) return true; - att=get.attitude(player,event.source); - return att<=0||event.source.isTurnedOver(); + check: function (event, player) { + let att = get.attitude(player, event.player); + if (event.player.hasSkill("xinleiji")) return att > 0; + if (att > 0 || event.player.isHealthy()) return true; + if (!event.source) return true; + att = get.attitude(player, event.source); + return att <= 0 || event.source.isTurnedOver(); }, - prompt2:'令其进行判定,然后你可根据判定结果,弃置一张牌并令其执行对应效果。', - content:function(){ - 'step 0' - event.target=trigger.player; - event.source=trigger.source; + prompt2: "令其进行判定,然后你可根据判定结果,弃置一张牌并令其执行对应效果。", + content: function () { + "step 0"; + event.target = trigger.player; + event.source = trigger.source; trigger.player.judge(); - 'step 1' - event.judgeResult=get.copy(result); - var str='是否弃置一张牌',strt=get.translation(target),strs=get.translation(source),goon=0; - switch(result.suit){ - case 'heart': - if(target.isIn()&&target.isDamaged()){ - str+=(',令'+strt+'回复1点体力'); - goon=get.recoverEffect(target,player,player); + ("step 1"); + event.judgeResult = get.copy(result); + var str = "是否弃置一张牌", + strt = get.translation(target), + strs = get.translation(source), + goon = 0; + switch (result.suit) { + case "heart": + if (target.isIn() && target.isDamaged()) { + str += ",令" + strt + "回复1点体力"; + goon = get.recoverEffect(target, player, player); } break; - case 'diamond': - if(target.isIn()){ - str+=(',令'+strt+'摸两张牌'); - goon=2*get.effect(target,{name:'draw'},player,player); + case "diamond": + if (target.isIn()) { + str += ",令" + strt + "摸两张牌"; + goon = 2 * get.effect(target, { name: "draw" }, player, player); } break; - case 'spade': - if(source&&source.isIn()){ - str+=(',令'+strs+'翻'+(source.isTurnedOver()?'回正':'')+'面'); - goon=get.attitude(player,source)*(source.isTurnedOver()?2:-2); + case "spade": + if (source && source.isIn()) { + str += ",令" + strs + "翻" + (source.isTurnedOver() ? "回正" : "") + "面"; + goon = get.attitude(player, source) * (source.isTurnedOver() ? 2 : -2); } break; - case 'club': - if(source&&source.isIn()){ - str+=(',令'+strs+'弃置两张牌'); - var cards=source.getCards('he').sort(function(a,b){ - return get.value(a,source)-get.value(b,source); - }).slice(0,2); - for(var i of cards) goon+=get.value(i,source); - goon*=(-get.sgn(get.attitude(player,source))); + case "club": + if (source && source.isIn()) { + str += ",令" + strs + "弃置两张牌"; + var cards = source + .getCards("he") + .sort(function (a, b) { + return get.value(a, source) - get.value(b, source); + }) + .slice(0, 2); + for (var i of cards) goon += get.value(i, source); + goon *= -get.sgn(get.attitude(player, source)); } break; } - str+='?'; - var str2=('若弃置点数为'+get.strNumber(result.number)+'的牌则收回自己弃置的牌'); - if(get.position(result.card,true)=='d'){ - str2+=(';若弃置花色为'+get.translation(result.suit)+'的牌则获得'+get.translation(result.card)); + str += "?"; + var str2 = "若弃置点数为" + get.strNumber(result.number) + "的牌则收回自己弃置的牌"; + if (get.position(result.card, true) == "d") { + str2 += + ";若弃置花色为" + + get.translation(result.suit) + + "的牌则获得" + + get.translation(result.card); } - player.chooseToDiscard('he',str,str2).set('goon',goon).set('ai',function(card){ - var goon=_status.event.goon; - var player=_status.event.player; - var result=_status.event.getParent().judgeResult; - var eff=Math.min(7,goon); - if(eff<=0) return 0; - if(get.suit(card,player)==result.suit) eff+=get.value(result.card,player); - if(get.number(card,player)==result.number) return eff; - return eff-get.value(card); - }); - 'step 2' - if(result.bool){ - event.card=result.cards[0]; - switch(event.judgeResult.suit){ - case 'heart': - if(target.isIn()&&target.isDamaged()) target.recover(); + player + .chooseToDiscard("he", str, str2) + .set("goon", goon) + .set("ai", function (card) { + var goon = _status.event.goon; + var player = _status.event.player; + var result = _status.event.getParent().judgeResult; + var eff = Math.min(7, goon); + if (eff <= 0) return 0; + if (get.suit(card, player) == result.suit) eff += get.value(result.card, player); + if (get.number(card, player) == result.number) return eff; + return eff - get.value(card); + }); + ("step 2"); + if (result.bool) { + event.card = result.cards[0]; + switch (event.judgeResult.suit) { + case "heart": + if (target.isIn() && target.isDamaged()) target.recover(); break; - case 'diamond': - if(target.isIn()) target.draw(2); + case "diamond": + if (target.isIn()) target.draw(2); break; - case 'spade': - if(source&&source.isIn()) source.turnOver(); + case "spade": + if (source && source.isIn()) source.turnOver(); player.addExpose(0.1); break; - case 'club': - if(source&&source.isIn()&&source.countCards('he')>0) source.chooseToDiscard(2,'he',true); + case "club": + if (source && source.isIn() && source.countCards("he") > 0) + source.chooseToDiscard(2, "he", true); player.addExpose(0.1); break; } - } - else event.finish(); - 'step 3' - var gains=[]; - if(get.position(event.judgeResult.card,true)=='d'&&get.suit(card,player)==event.judgeResult.suit) gains.push(event.judgeResult.card); - if(get.position(card,true)=='d'&&get.number(card,player)==event.judgeResult.number) gains.push(card); - if(gains.length) player.gain(gains,'gain2'); + } else event.finish(); + ("step 3"); + var gains = []; + if ( + get.position(event.judgeResult.card, true) == "d" && + get.suit(card, player) == event.judgeResult.suit + ) + gains.push(event.judgeResult.card); + if ( + get.position(card, true) == "d" && + get.number(card, player) == event.judgeResult.number + ) + gains.push(card); + if (gains.length) player.gain(gains, "gain2"); }, }, //OL界张郃 - reqiaobian:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + reqiaobian: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - player.addMark('reqiaobian',2); + content: function () { + player.addMark("reqiaobian", 2); game.delayx(); }, - marktext:'变', - intro:{ - name2:'变', - content:function(storage,player){ - var str='共有'+(storage||0)+'个标记'; - if(player.storage.reqiaobian_jieshu){ - str=('
  • '+str+'
  • 已记录手牌数:'+get.translation(player.storage.reqiaobian_jieshu)); + marktext: "变", + intro: { + name2: "变", + content: function (storage, player) { + var str = "共有" + (storage || 0) + "个标记"; + if (player.storage.reqiaobian_jieshu) { + str = + "
  • " + + str + + "
  • 已记录手牌数:" + + get.translation(player.storage.reqiaobian_jieshu); } return str; }, }, - group:['reqiaobian_judge','reqiaobian_draw','reqiaobian_use','reqiaobian_discard','reqiaobian_jieshu'], - subSkill:{ - judge:{ - audio:'reqiaobian', - trigger:{player:'phaseJudgeBefore'}, - direct:true, - filter:function(event,player){ - return player.hasMark('reqiaobian')||player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_judge'),'he'); + group: [ + "reqiaobian_judge", + "reqiaobian_draw", + "reqiaobian_use", + "reqiaobian_discard", + "reqiaobian_jieshu", + ], + subSkill: { + judge: { + audio: "reqiaobian", + trigger: { player: "phaseJudgeBefore" }, + direct: true, + filter: function (event, player) { + return ( + player.hasMark("reqiaobian") || + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), + "he" + ) + ); }, - check:function(event,player){ - return player.hasCard(function(card){ - return get.effect(player,{ - name:card.viewAs||card.name, - cards:[card], - },player,player)<0; - },'j'); + check: function (event, player) { + return player.hasCard(function (card) { + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j"); }, - content:function(){ - 'step 0' - var choices=[]; - if(player.hasMark('reqiaobian')) choices.push('弃置标记'); - if(player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_judge'),'he')) choices.push('弃置牌'); - choices.push('cancel2'); - player.chooseControl(choices).set('prompt','巧变:是否跳过判定阶段?').set('ai',function(){ - var evt=_status.event; - if(lib.skill[evt.getParent().name].check(evt.getTrigger(),evt.player)) return 0; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='弃置牌'){ - player.chooseToDiscard('he',true).logSkill=event.name; - } - else{ + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if ( + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), + "he" + ) + ) + choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过判定阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) + return 0; + return "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { player.logSkill(event.name); - player.removeMark('reqiaobian',1); + player.removeMark("reqiaobian", 1); } - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); trigger.cancel(); }, }, - draw:{ - audio:'reqiaobian', - trigger:{player:'phaseDrawBefore'}, - direct:true, - filter:function(event,player){ - return player.hasMark('reqiaobian')||player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_judge'),'he'); + draw: { + audio: "reqiaobian", + trigger: { player: "phaseDrawBefore" }, + direct: true, + filter: function (event, player) { + return ( + player.hasMark("reqiaobian") || + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), + "he" + ) + ); }, - check:function(event,player){ - return game.countPlayer(function(current){ - if(current==player||current.countGainableCards(player,'h')==0) return false; - var att=get.attitude(player,current); - if(current.hasSkill('tuntian')) return att>0; - return att<1; - })>1; + check: function (event, player) { + return ( + game.countPlayer(function (current) { + if (current == player || current.countGainableCards(player, "h") == 0) + return false; + var att = get.attitude(player, current); + if (current.hasSkill("tuntian")) return att > 0; + return att < 1; + }) > 1 + ); }, - content:function(){ - 'step 0' - var choices=[]; - if(player.hasMark('reqiaobian')) choices.push('弃置标记'); - if(player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_draw'),'he')) choices.push('弃置牌'); - choices.push('cancel2'); - player.chooseControl(choices).set('prompt','巧变:是否跳过摸牌阶段?').set('ai',function(){ - var evt=_status.event; - if(lib.skill[evt.getParent().name].check(evt.getTrigger(),evt.player)) return 0; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='弃置牌'){ - player.chooseToDiscard('he',true).logSkill=event.name; - } - else{ - player.logSkill(event.name); - player.removeMark('reqiaobian',1); - } - } - else event.finish(); - 'step 2' - trigger.cancel(); - if(game.hasPlayer((current)=>current.countGainableCards(player,'h')>0)){ - player.chooseTarget('是否获得至多两名其他角色的各一张手牌?',[1,2],function(card,player,target){ - return target!=player&&target.countGainableCards(player,'h')>0; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(target.hasSkill('tuntian')) return att/10; - return 1-att; + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if ( + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_draw"), + "he" + ) + ) + choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过摸牌阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) + return 0; + return "cancel2"; }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.line(targets,'green'); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { + player.logSkill(event.name); + player.removeMark("reqiaobian", 1); + } + } else event.finish(); + ("step 2"); + trigger.cancel(); + if (game.hasPlayer((current) => current.countGainableCards(player, "h") > 0)) { + player + .chooseTarget( + "是否获得至多两名其他角色的各一张手牌?", + [1, 2], + function (card, player, target) { + return ( + target != player && target.countGainableCards(player, "h") > 0 + ); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); player.gainMultiple(targets); } }, }, - use:{ - audio:'reqiaobian', - trigger:{player:'phaseUseBefore'}, - direct:true, - filter:function(event,player){ - return player.hasMark('reqiaobian')||player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_judge'),'he'); + use: { + audio: "reqiaobian", + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return ( + player.hasMark("reqiaobian") || + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), + "he" + ) + ); }, - check:function(event,player){ - if(player.countCards('h',function(card){ - return player.hasValueTarget(card,null,true); - })>1) return false; - return game.hasPlayer(function(current){ - var att=get.sgn(get.attitude(player,current)); - if(att!=0){ - var es=current.getCards('e'); - for(var i=0;i 1 + ) + return false; + return game.hasPlayer(function (current) { + var att = get.sgn(get.attitude(player, current)); + if (att != 0) { + var es = current.getCards("e"); + for (var i = 0; i < es.length; i++) { + if ( + game.hasPlayer(function (current2) { + if ( + get.sgn(get.value(es[i], current)) != -att || + get.value(es[i], current) < 5 + ) + return false; + var att2 = get.sgn(get.attitude(player, current2)); + if ( + att == att2 || + att2 != + get.sgn(get.effect(current2, es[i], player, current2)) + ) + return false; + return ( + current != current2 && + !current2.isMin() && + current2.canEquip(es[i]) + ); + }) + ) { return true; } } } - if(att>0){ - var js=current.getCards('j',function(card){ - return get.effect(current,{ - name:card.viewAs||card.name, - cards:[card], - },current,current)<-2; + if (att > 0) { + var js = current.getCards("j", function (card) { + return ( + get.effect( + current, + { + name: card.viewAs || card.name, + cards: [card], + }, + current, + current + ) < -2 + ); }); - for(var i=0;i=0) return false; - return current!=current2&¤t2.canAddJudge(js[i]); - })){ + for (var i = 0; i < js.length; i++) { + if ( + game.hasPlayer(function (current2) { + var att2 = get.attitude(player, current2); + if (att2 >= 0) return false; + return current != current2 && current2.canAddJudge(js[i]); + }) + ) { return true; } } } }); }, - content:function(){ - 'step 0' - var choices=[]; - if(player.hasMark('reqiaobian')) choices.push('弃置标记'); - if(player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_use'),'he')) choices.push('弃置牌'); - choices.push('cancel2'); - player.chooseControl(choices).set('prompt','巧变:是否跳过出牌阶段?').set('ai',function(){ - var evt=_status.event; - if(lib.skill[evt.getParent().name].check(evt.getTrigger(),evt.player)) return 0; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='弃置牌'){ - player.chooseToDiscard('he',true).logSkill=event.name; - } - else{ + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if ( + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_use"), + "he" + ) + ) + choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过出牌阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) + return 0; + return "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { player.logSkill(event.name); - player.removeMark('reqiaobian',1); + player.removeMark("reqiaobian", 1); } - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); trigger.cancel(); player.moveCard(); }, }, - discard:{ - audio:'reqiaobian', - trigger:{player:'phaseDiscardBefore'}, - direct:true, - filter:function(event,player){ - return player.hasMark('reqiaobian')||player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_judge'),'he'); + discard: { + audio: "reqiaobian", + trigger: { player: "phaseDiscardBefore" }, + direct: true, + filter: function (event, player) { + return ( + player.hasMark("reqiaobian") || + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"), + "he" + ) + ); }, - check:function(event,player){ + check: function (event, player) { return player.needsToDiscard(); }, - content:function(){ - 'step 0' - var choices=[]; - if(player.hasMark('reqiaobian')) choices.push('弃置标记'); - if(player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqiaobian_discard'),'he')) choices.push('弃置牌'); - choices.push('cancel2'); - player.chooseControl(choices).set('prompt','巧变:是否跳过弃牌阶段?').set('ai',function(){ - var evt=_status.event; - if(lib.skill[evt.getParent().name].check(evt.getTrigger(),evt.player)) return 0; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='弃置牌'){ - player.chooseToDiscard('he',true).logSkill=event.name; - } - else{ + content: function () { + "step 0"; + var choices = []; + if (player.hasMark("reqiaobian")) choices.push("弃置标记"); + if ( + player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_discard"), + "he" + ) + ) + choices.push("弃置牌"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "巧变:是否跳过弃牌阶段?") + .set("ai", function () { + var evt = _status.event; + if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player)) + return 0; + return "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "弃置牌") { + player.chooseToDiscard("he", true).logSkill = event.name; + } else { player.logSkill(event.name); - player.removeMark('reqiaobian',1); + player.removeMark("reqiaobian", 1); } - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); trigger.cancel(); }, }, - jieshu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return !player.getStorage('reqiaobian_jieshu').includes(player.countCards('h')); + jieshu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return !player.getStorage("reqiaobian_jieshu").includes(player.countCards("h")); }, - content:function(){ - player.addMark('reqiaobian',1); - player.markAuto('reqiaobian_jieshu',[player.countCards('h')]); + content: function () { + player.addMark("reqiaobian", 1); + player.markAuto("reqiaobian_jieshu", [player.countCards("h")]); player.storage.reqiaobian_jieshu.sort(); }, }, }, }, //十周年徐庶 - rezhuhai:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&event.player.getHistory('sourceDamage').length>0&&event.player.isIn()&&(player.countCards('h')>0||player.canUse('guohe',event.player)); + rezhuhai: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.getHistory("sourceDamage").length > 0 && + event.player.isIn() && + (player.countCards("h") > 0 || player.canUse("guohe", event.player)) + ); }, - content:function(){ - 'step 0' - var target=trigger.player; - var choiceList=['将一张手牌当做【杀】对其使用','视为对其使用一张【过河拆桥】']; - var bool=false,hs=player.getCards('h'); - for(var i of hs){ - if(game.checkMod(i,player,'unchanged','cardEnabled2',player)!==false&&player.canUse(get.autoViewAs({name:'sha'},[i]),target,false)){ - bool=true; + content: function () { + "step 0"; + var target = trigger.player; + var choiceList = ["将一张手牌当做【杀】对其使用", "视为对其使用一张【过河拆桥】"]; + var bool = false, + hs = player.getCards("h"); + for (var i of hs) { + if ( + game.checkMod(i, player, "unchanged", "cardEnabled2", player) !== false && + player.canUse(get.autoViewAs({ name: "sha" }, [i]), target, false) + ) { + bool = true; break; } } - var choices=[]; - if(bool) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(player.canUse('guohe',target)) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - choices.push('cancel2'); - player.chooseControl(choices).set('choiceList',choiceList).set('prompt',get.prompt('rezhuhai',target)).set('ai',function(){ - var choices=_status.event.controls; - var eff1=0,eff2=0; - var player=_status.event.player,target=_status.event.getTrigger().player; - if(choices.includes('选项一')) eff1=get.effect(target,{name:'sha'},player,player); - if(choices.includes('选项二')) eff2=get.effect(target,{name:'guohe'},player,player); - if(eff1>0&&(player.hasSkill('xsqianxin')&&player.isDamaged()||eff1>eff2)) return '选项一'; - if(eff2>0) return '选项二'; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='选项一'){ - player.chooseCard('h',true,function(card,player){ - if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) return false; - return player.canUse(get.autoViewAs({name:'sha'},[card]),_status.event.getTrigger().player,false); - },'选择一张手牌当做【杀】对'+get.translation(trigger.player)+'使用').set('ai',function(card){ - var player=_status.event.player; - return get.effect(_status.event.getTrigger().player,get.autoViewAs({name:'sha'},[card]),player,player)/Math.max(1,get.value(card)); - }); - } - else{ - player.useCard({name:'guohe',isCard:true},trigger.player,'rezhuhai'); + var choices = []; + if (bool) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (player.canUse("guohe", target)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", get.prompt("rezhuhai", target)) + .set("ai", function () { + var choices = _status.event.controls; + var eff1 = 0, + eff2 = 0; + var player = _status.event.player, + target = _status.event.getTrigger().player; + if (choices.includes("选项一")) + eff1 = get.effect(target, { name: "sha" }, player, player); + if (choices.includes("选项二")) + eff2 = get.effect(target, { name: "guohe" }, player, player); + if ( + eff1 > 0 && + ((player.hasSkill("xsqianxin") && player.isDamaged()) || eff1 > eff2) + ) + return "选项一"; + if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "选项一") { + player + .chooseCard( + "h", + true, + function (card, player) { + if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player)) + return false; + return player.canUse( + get.autoViewAs({ name: "sha" }, [card]), + _status.event.getTrigger().player, + false + ); + }, + "选择一张手牌当做【杀】对" + get.translation(trigger.player) + "使用" + ) + .set("ai", function (card) { + var player = _status.event.player; + return ( + get.effect( + _status.event.getTrigger().player, + get.autoViewAs({ name: "sha" }, [card]), + player, + player + ) / Math.max(1, get.value(card)) + ); + }); + } else { + player.useCard({ name: "guohe", isCard: true }, trigger.player, "rezhuhai"); event.finish(); } - } - else event.finish(); - 'step 2' - if(result.bool){ - player.useCard({name:'sha'},result.cards,'rezhuhai',trigger.player,false); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.useCard({ name: "sha" }, result.cards, "rezhuhai", trigger.player, false); } }, }, - xsqianxin:{ - trigger:{source:'damageSource'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'orange', - filter:function(event,player){ + xsqianxin: { + trigger: { source: "damageSource" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { return player.isDamaged(); }, - content:function(){ - player.awakenSkill('xsqianxin'); + content: function () { + player.awakenSkill("xsqianxin"); player.loseMaxHp(); - player.addSkills('rejianyan'); + player.addSkills("rejianyan"); }, - derivation:'rejianyan', + derivation: "rejianyan", }, - rejianyan:{ - audio:2, - enable:'phaseUse', - usable:2, - filter:function(event,player){ - return game.hasPlayer((current)=>current.group=='key'||current.hasSex('male')); + rejianyan: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return game.hasPlayer((current) => current.group == "key" || current.hasSex("male")); }, - chooseButton:{ - dialog:function(){ - return ui.create.dialog('###荐言###'+get.translation('rejianyan_info')); + chooseButton: { + dialog: function () { + return ui.create.dialog("###荐言###" + get.translation("rejianyan_info")); }, - chooseControl:function(event,player){ - var list=[]; - if(!player.hasSkill('rejianyan_color')) list.addArray(['red','black']); - if(!player.hasSkill('rejianyan_type')) list.addArray(['basic','trick','equip']); - list.push('cancel2'); + chooseControl: function (event, player) { + var list = []; + if (!player.hasSkill("rejianyan_color")) list.addArray(["red", "black"]); + if (!player.hasSkill("rejianyan_type")) list.addArray(["basic", "trick", "equip"]); + list.push("cancel2"); return list; }, - check:function(){ - if(!_status.event.player.hasSkill('rejianyan_color')) return 'red'; - return 'trick'; + check: function () { + if (!_status.event.player.hasSkill("rejianyan_color")) return "red"; + return "trick"; }, - backup:function(result,player){ + backup: function (result, player) { return { - audio:'rejianyan', - filterCard:()=>false, - selectCard:-1, - info:result.control, - content:function(){ - 'step 0' - var card=false,info=lib.skill.rejianyan_backup.info; - if(info=='red'||info=='black'){ - player.addTempSkill('rejianyan_color','phaseUseEnd'); - card=get.cardPile2(function(card){ - return get.color(card)==info; + audio: "rejianyan", + filterCard: () => false, + selectCard: -1, + info: result.control, + content: function () { + "step 0"; + var card = false, + info = lib.skill.rejianyan_backup.info; + if (info == "red" || info == "black") { + player.addTempSkill("rejianyan_color", "phaseUseEnd"); + card = get.cardPile2(function (card) { + return get.color(card) == info; + }); + } else { + player.addTempSkill("rejianyan_type", "phaseUseEnd"); + card = get.cardPile2(function (card) { + return get.type(card) == info; }); } - else{ - player.addTempSkill('rejianyan_type','phaseUseEnd'); - card=get.cardPile2(function(card){ - return get.type(card)==info; + if (card) { + event.card = card; + player.showCards(card, get.translation(player) + "发动了【荐言】"); + } else event.finish(); + ("step 1"); + player + .chooseTarget( + true, + "选择一名角色获得" + get.translation(card), + function (card, player, target) { + return target.group == "key" || target.hasSex("male"); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkill("nogain")) att /= 10; + return att / Math.sqrt(get.distance(player, target, "absolute")); }); - } - if(card){ - event.card=card; - player.showCards(card,get.translation(player)+'发动了【荐言】'); - } - else event.finish(); - 'step 1' - player.chooseTarget(true,'选择一名角色获得'+get.translation(card),function(card,player,target){ - return target.group=='key'||target.hasSex('male'); - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkill('nogain')) att/=10; - return att/Math.sqrt(get.distance(player,target,'absolute')) - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(card,'gain2'); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2"); } }, - ai:{result:{player:1}}, - } + ai: { result: { player: 1 } }, + }; }, }, - ai:{ - order:8, - result:{ - player:function(player,target){ - if(game.hasPlayer((current)=>(current.group=='key'||current.hasSex('male'))&&get.attitude(player,current)>0)) return 1; + ai: { + order: 8, + result: { + player: function (player, target) { + if ( + game.hasPlayer( + (current) => + (current.group == "key" || current.hasSex("male")) && + get.attitude(player, current) > 0 + ) + ) + return 1; return 0; }, }, }, - subSkill:{type:{},color:{},backup:{}}, + subSkill: { type: {}, color: {}, backup: {} }, }, //野兽高顺 - decadexianzhen:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + decadexianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasSkill('decadexianzhen2')&&!player.hasSkill('decadexianzhen3'); + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + !player.hasSkill("decadexianzhen2") && + !player.hasSkill("decadexianzhen3") + ); }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseToCompare(target); - "step 1" - if(result.bool){ - player.storage.decadexianzhen2=target; - player.addTempSkill('decadexianzhen2'); - } - else{ - player.addTempSkill('decadexianzhen3'); + ("step 1"); + if (result.bool) { + player.storage.decadexianzhen2 = target; + player.addTempSkill("decadexianzhen2"); + } else { + player.addTempSkill("decadexianzhen3"); } }, - ai:{ - order:function(name,player){ - var cards=player.getCards('h'); - if(player.countCards('h','sha')==0){ + ai: { + order: function (name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { return 1; } - for(var i=0;i11&&get.value(cards[i])<7){ + for (var i = 0; i < cards.length; i++) { + if ( + cards[i].name != "sha" && + get.number(cards[i]) > 11 && + get.value(cards[i]) < 7 + ) { return 9; } } - return get.order({name:'sha'})-1; + return get.order({ name: "sha" }) - 1; }, - result:{ - player:function(player){ - if(player.countCards('h','sha')>0) return 0; - var num=player.countCards('h'); - if(num>player.hp) return 0; - if(num==1) return -2; - if(num==2) return -1; + result: { + player: function (player) { + if (player.countCards("h", "sha") > 0) return 0; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; return -0.7; }, - target:function(player,target){ - var num=target.countCards('h'); - if(num==1) return -1; - if(num==2) return -0.7; - return -0.5 + target: function (player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; }, }, - threaten:1.3 - } + threaten: 1.3, + }, }, - decadexianzhen2:{ - audio:'decadexianzhen', - charlotte:true, - onremove:true, - mod:{ - targetInRange:function(card,player,target){ - if(target==player.storage.decadexianzhen2) return true; + decadexianzhen2: { + audio: "decadexianzhen", + charlotte: true, + onremove: true, + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.decadexianzhen2) return true; }, - cardUsableTarget:function(card,player,target){ - if(target==player.storage.decadexianzhen2) return true; + cardUsableTarget: function (card, player, target) { + if (target == player.storage.decadexianzhen2) return true; }, }, - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(arg.target!=player.storage.decadexianzhen2) return false; + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.decadexianzhen2) return false; }, }, - group:'decadexianzhen2_damage', - subSkill:{ - damage:{ - audio:'decadexianzhen', - trigger:{source:'damageBegin1'}, - forced:true, - filter:function(event,player){ - return event.card&&event.player==player.storage.decadexianzhen2&&!player.hasHistory('custom',function(evt){ - return evt.name=='decadexianzhen'&&evt.cardname==event.card.name; - }) + group: "decadexianzhen2_damage", + subSkill: { + damage: { + audio: "decadexianzhen", + trigger: { source: "damageBegin1" }, + forced: true, + filter: function (event, player) { + return ( + event.card && + event.player == player.storage.decadexianzhen2 && + !player.hasHistory("custom", function (evt) { + return evt.name == "decadexianzhen" && evt.cardname == event.card.name; + }) + ); }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.num++; - player.getHistory('custom').push({ - name:'decadexianzhen', - cardname:trigger.card.name, + player.getHistory("custom").push({ + name: "decadexianzhen", + cardname: trigger.card.name, }); }, }, }, }, - decadexianzhen3:{ - charlotte:true, - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + decadexianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, - ignoredHandcard:function(card,player){ - if(get.name(card)=='sha'){ + ignoredHandcard: function (card, player) { + if (get.name(card) == "sha") { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.name(card)=='sha'){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") { return false; } }, }, }, - decadejinjiu:{ - global:'decadejinjiu_global', - mod:{ - cardname(card){ - if(card.name=='jiu') return 'sha'; + decadejinjiu: { + global: "decadejinjiu_global", + mod: { + cardname(card) { + if (card.name == "jiu") return "sha"; }, - cardnumber(card){ - if(card.name=='jiu') return 13; + cardnumber(card) { + if (card.name == "jiu") return 13; }, }, - audio:2, - audioname2:{ - ol_gaoshun:'rejinjiu', + audio: 2, + audioname2: { + ol_gaoshun: "rejinjiu", }, - trigger:{player:['useCard1','respond']}, - filter(event,player){ - return event.card.name=='sha'&&!event.skill&&event.cards&&event.cards.length==1&&event.cards[0].name=='jiu'; + trigger: { player: ["useCard1", "respond"] }, + filter(event, player) { + return ( + event.card.name == "sha" && + !event.skill && + event.cards && + event.cards.length == 1 && + event.cards[0].name == "jiu" + ); }, - forced:true, - firstDo:true, - content(){}, - subSkill:{ - global:{ - mod:{ - cardEnabled(card,player){ - if(card.name=='jiu'){ - var source=_status.currentPhase; - if(source&&source!=player&&source.hasSkill('decadejinjiu')) return false; + forced: true, + firstDo: true, + content() {}, + subSkill: { + global: { + mod: { + cardEnabled(card, player) { + if (card.name == "jiu") { + var source = _status.currentPhase; + if (source && source != player && source.hasSkill("decadejinjiu")) + return false; } }, - cardSavable(card,player){ - if(card.name=='jiu'){ - var source=_status.currentPhase; - if(source&&source!=player&&source.hasSkill('decadejinjiu')) return false; + cardSavable(card, player) { + if (card.name == "jiu") { + var source = _status.currentPhase; + if (source && source != player && source.hasSkill("decadejinjiu")) + return false; } }, }, }, }, }, - rebotu:{ - audio:'botu', - trigger:{player:'phaseEnd'}, - frequent:true, - filter:function(event,player){ - if(player.countMark('rebotu_count')>=Math.min(3,game.countPlayer())) return false; - var suits=[]; - game.getGlobalHistory('cardMove',function(evt){ - if(suits.length>=4) return; - if(evt.name=='lose'){ - if(evt.position==ui.discardPile){ - for(var i of evt.cards) suits.add(get.suit(i,false)); + rebotu: { + audio: "botu", + trigger: { player: "phaseEnd" }, + frequent: true, + filter: function (event, player) { + if (player.countMark("rebotu_count") >= Math.min(3, game.countPlayer())) return false; + var suits = []; + game.getGlobalHistory("cardMove", function (evt) { + if (suits.length >= 4) return; + if (evt.name == "lose") { + if (evt.position == ui.discardPile) { + for (var i of evt.cards) suits.add(get.suit(i, false)); } - } - else{ - if(evt.name=='cardsDiscard'){ - for(var i of evt.cards) suits.add(get.suit(i,false)); + } else { + if (evt.name == "cardsDiscard") { + for (var i of evt.cards) suits.add(get.suit(i, false)); } } }); - return suits.length>=4; + return suits.length >= 4; }, - content:function(){ - player.addTempSkill('rebotu_count','roundStart'); - player.addMark('rebotu_count',1,false); + content: function () { + player.addTempSkill("rebotu_count", "roundStart"); + player.addMark("rebotu_count", 1, false); player.insertPhase(); }, - group:'rebotu_mark', - subSkill:{ - count:{ - onremove:true, - charlotte:true, + group: "rebotu_mark", + subSkill: { + count: { + onremove: true, + charlotte: true, }, - mark:{ - trigger:{ - global:['loseAfter','cardsDiscardAfter'], - player:'phaseAfter', + mark: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter"], + player: "phaseAfter", }, - forced:true, - firstDo:true, - silent:true, - filter:function(event,player){ - if(event.name=='phase') return true; - if(player!=_status.currentPhase) return false; - if(event.name=='lose') return event.position==ui.discardPile; + forced: true, + firstDo: true, + silent: true, + filter: function (event, player) { + if (event.name == "phase") return true; + if (player != _status.currentPhase) return false; + if (event.name == "lose") return event.position == ui.discardPile; return true; }, - content:function(){ - if(trigger.name=='phase'){ - player.unmarkSkill('rebotu_mark'); + content: function () { + if (trigger.name == "phase") { + player.unmarkSkill("rebotu_mark"); return; } - var suits=[]; - game.getGlobalHistory('cardMove',function(evt){ - if(suits.length>=4) return; - if(evt.name=='lose'){ - if(evt.position==ui.discardPile){ - for(var i of evt.cards) suits.add(get.suit(i,false)); + var suits = []; + game.getGlobalHistory("cardMove", function (evt) { + if (suits.length >= 4) return; + if (evt.name == "lose") { + if (evt.position == ui.discardPile) { + for (var i of evt.cards) suits.add(get.suit(i, false)); } - } - else{ - if(evt.name=='cardsDiscard'){ - for(var i of evt.cards) suits.add(get.suit(i,false)); + } else { + if (evt.name == "cardsDiscard") { + for (var i of evt.cards) suits.add(get.suit(i, false)); } } }); - player.storage.rebotu_mark=suits; - player.markSkill('rebotu_mark'); + player.storage.rebotu_mark = suits; + player.markSkill("rebotu_mark"); }, - intro:{ - onunmark:true, - content:'本回合已有$花色的牌进入过弃牌堆', + intro: { + onunmark: true, + content: "本回合已有$花色的牌进入过弃牌堆", }, }, }, }, - xinganlu:{ - enable:'phaseUse', - usable:1, - audio:2, - selectTarget:2, - delay:0, - filterTarget:function(card,player,target){ - if(target.isMin()) return false; - if(ui.selected.targets.length==0) return true; - if(ui.selected.targets[0].countCards('e')==0&&target.countCards('e')==0) return false; + xinganlu: { + enable: "phaseUse", + usable: 1, + audio: 2, + selectTarget: 2, + delay: 0, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + if (ui.selected.targets.length == 0) return true; + if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) + return false; return true; }, - multitarget:true, - multiline:true, - content:function(){ - 'step 0' + multitarget: true, + multiline: true, + content: function () { + "step 0"; targets[0].swapEquip(targets[1]); - 'step 1' + ("step 1"); game.delayx(); - var num=Math.abs(targets[0].countCards('e')-targets[1].countCards('e')); - if(num>player.getDamagedHp()) player.chooseToDiscard('h',2,true); + var num = Math.abs(targets[0].countCards("e") - targets[1].countCards("e")); + if (num > player.getDamagedHp()) player.chooseToDiscard("h", 2, true); }, - ai:{ - order:10, - expose:0.2, - threaten:function(player,target){ - return 0.8*Math.max(1+target.maxHp-target.hp); + ai: { + order: 10, + expose: 0.2, + threaten: function (player, target) { + return 0.8 * Math.max(1 + target.maxHp - target.hp); }, - result:{ - target:function(player,target){ - if(!ui.selected.targets.length) return -get.value(target.getCards('e'),target); - var target2=ui.selected.targets[0]; - var eff_target=(get.value(target2.getCards('e'),target)-get.value(target.getCards('e'),target)); - if(get.sgn(eff_target)==get.sgn(-get.value(target2.getCards('e'),target2))) return 0; + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -get.value(target.getCards("e"), target); + var target2 = ui.selected.targets[0]; + var eff_target = + get.value(target2.getCards("e"), target) - + get.value(target.getCards("e"), target); + if (get.sgn(eff_target) == get.sgn(-get.value(target2.getCards("e"), target2))) + return 0; return eff_target; - } + }, }, - } + }, }, - xinbuyi:{ - audio:2, - trigger:{global:'dying'}, - filter:function(event,player){ - return event.player.countCards('h')>0; + xinbuyi: { + audio: 2, + trigger: { global: "dying" }, + filter: function (event, player) { + return event.player.countCards("h") > 0; }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ - 'step 0' - if(player==trigger.player) player.chooseCard('h',true).set('ai',function(card){ - if(get.type(card)!='basic') return 100-get.value(card); - return 0; - }); - else player.choosePlayerCard('h',trigger.player,true); - 'step 1' - var card=result.cards[0],target=trigger.player; - player.showCards(card,get.translation(player)+'对'+(player==target?'自己':get.translation(target))+'发动了【补益】'); - if(get.type(card,target)!='basic'){ + content: function () { + "step 0"; + if (player == trigger.player) + player.chooseCard("h", true).set("ai", function (card) { + if (get.type(card) != "basic") return 100 - get.value(card); + return 0; + }); + else player.choosePlayerCard("h", trigger.player, true); + ("step 1"); + var card = result.cards[0], + target = trigger.player; + player.showCards( + card, + get.translation(player) + + "对" + + (player == target ? "自己" : get.translation(target)) + + "发动了【补益】" + ); + if (get.type(card, target) != "basic") { target.discard(card); target.recover(); - if(target.countCards('h')==1) target.draw(); + if (target.countCards("h") == 1) target.draw(); } }, - logTarget:'player', + logTarget: "player", }, - rejiaozhao:{ - audio:2, - enable:'phaseUse', - group:'rejiaozhao_base', - locked:false, - mod:{ - targetEnabled:function(card,player,target){ - if(player==target&&card.storage&&card.storage.rejiaozhao) return false; + rejiaozhao: { + audio: 2, + enable: "phaseUse", + group: "rejiaozhao_base", + locked: false, + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.rejiaozhao) return false; }, }, - filter:function(event,player){ - return (player.hasMark('redanxin')&&player.countCards('h')&&player.getStorage('rejiaozhao_clear').length8-get.value(card), - onuse:function(result,player){ - player.addTempSkill('rejiaozhao_clear','phaseUseAfter'); - player.markAuto('rejiaozhao_clear',[get.type(result.card)]) + backup: function (links, player) { + var next = { + audio: "redanxin", + viewAs: { name: links[0][2], nature: links[0][3] }, + filterCard: true, + position: "h", + popname: true, + ai1: (card) => 8 - get.value(card), + onuse: function (result, player) { + player.addTempSkill("rejiaozhao_clear", "phaseUseAfter"); + player.markAuto("rejiaozhao_clear", [get.type(result.card)]); }, - } - if(player.countMark('redanxin')<2) next.viewAs.storage={rejiaozhao:true}; + }; + if (player.countMark("redanxin") < 2) next.viewAs.storage = { rejiaozhao: true }; return next; }, - prompt:function(links){ - return '将一张手牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; + prompt: function (links) { + return ( + "将一张手牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, }, - ai:{ - order:6, - result:{ - player:1 - } + ai: { + order: 6, + result: { + player: 1, + }, }, - derivation:['rejiaozhao_lv2','rejiaozhao_lv3'], - subSkill:{ - clear:{onremove:true}, - base:{ - audio:'rejiaozhao', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(player.hasMark('redanxin')) return false; - return player.countCards('h')>0&&game.hasPlayer((current)=>current!=player); + derivation: ["rejiaozhao_lv2", "rejiaozhao_lv3"], + subSkill: { + clear: { onremove: true }, + base: { + audio: "rejiaozhao", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.hasMark("redanxin")) return false; + return ( + player.countCards("h") > 0 && game.hasPlayer((current) => current != player) + ); }, - filterCard:true, - position:'h', - discard:false, - lose:false, - check:function(card){ - return 1/Math.max(1,_status.event.player.getUseValue(card)); + filterCard: true, + position: "h", + discard: false, + lose: false, + check: function (card) { + return 1 / Math.max(1, _status.event.player.getUseValue(card)); }, - prompt:'出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。', - content:function(){ - 'step 0' + prompt: "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。", + content: function () { + "step 0"; player.showCards(cards); - 'step 1' - var targets=game.filterPlayer(); + ("step 1"); + var targets = game.filterPlayer(); targets.remove(player); - targets.sort(function(a,b){ - return Math.max(1,get.distance(player,a))-Math.max(1,get.distance(player,b)); + targets.sort(function (a, b) { + return ( + Math.max(1, get.distance(player, a)) - + Math.max(1, get.distance(player, b)) + ); }); - var distance=Math.max(1,get.distance(player,targets[0])); - for(var i=1;idistance){ - targets.splice(i);break; + var distance = Math.max(1, get.distance(player, targets[0])); + for (var i = 1; i < targets.length; i++) { + if (Math.max(1, get.distance(player, targets[i])) > distance) { + targets.splice(i); + break; } } - player.chooseTarget('请选择【矫诏】的目标',true,function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).set('targets',targets); - 'step 2' - if(!result.bool){ + player + .chooseTarget("请选择【矫诏】的目标", true, function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("targets", targets); + ("step 2"); + if (!result.bool) { event.finish(); return; } - var target=result.targets[0]; - event.target=target; - var list=[]; - for(var i=0;i0?1:-1); - 'step 3' - var chosen=result.links[0][2]; - var nature=result.links[0][3]; - var fakecard={ - name:chosen, - storage:{rejiaozhao:true}, + target + .chooseButton(["矫诏", [list, "vcard"]], true) + .set("ai", function (button) { + var player = _status.event.getParent().player, + card = { + name: button.link[2], + nature: button.link[3], + storage: { + rejiaozhao: true, + }, + }; + return player.getUseValue(card, null, true) * _status.event.att; + }) + .set("att", get.attitude(event.target, player) > 0 ? 1 : -1); + ("step 3"); + var chosen = result.links[0][2]; + var nature = result.links[0][3]; + var fakecard = { + name: chosen, + storage: { rejiaozhao: true }, }; - if(nature) fakecard.nature=nature; - event.target.showCards(game.createCard({ - name:chosen, - nature:nature, - suit:cards[0].suit, - number:cards[0].number, - }),get.translation(event.target)+'声明了'+get.translation(chosen)); - game.broadcastAll((player,fakecard)=>{ - player.storage.rejiaozhao_viewas=fakecard; - },player,fakecard); - cards[0].addGaintag('rejiaozhao') - player.addTempSkill('rejiaozhao_viewas','phaseUseEnd'); + if (nature) fakecard.nature = nature; + event.target.showCards( + game.createCard({ + name: chosen, + nature: nature, + suit: cards[0].suit, + number: cards[0].number, + }), + get.translation(event.target) + "声明了" + get.translation(chosen) + ); + game.broadcastAll( + (player, fakecard) => { + player.storage.rejiaozhao_viewas = fakecard; + }, + player, + fakecard + ); + cards[0].addGaintag("rejiaozhao"); + player.addTempSkill("rejiaozhao_viewas", "phaseUseEnd"); }, - ai:{ - order:9, - result:{ - player:1, - } - }, - }, - backup:{audio:'rejiaozhao'}, - viewas:{ - enable:'phaseUse', - mod:{ - targetEnabled:function(card,player,target){ - if(player==target&&card.storage&&card.storage.rejiaozhao) return false; + ai: { + order: 9, + result: { + player: 1, }, }, - filter:function(event,player){ - if(!player.storage.rejiaozhao_viewas) return false; - var cards=player.getCards('h',function(card){ - return card.hasGaintag('rejiaozhao'); - }); - if(!cards.length) return false; - if(!game.checkMod(cards[0],player,'unchanged','cardEnabled2',player)) return false; - var card=get.autoViewAs(player.storage.rejiaozhao_viewas,cards); - return event.filterCard(card,player,event); + }, + backup: { audio: "rejiaozhao" }, + viewas: { + enable: "phaseUse", + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.rejiaozhao) return false; + }, }, - viewAs:function(cards,player){ + filter: function (event, player) { + if (!player.storage.rejiaozhao_viewas) return false; + var cards = player.getCards("h", function (card) { + return card.hasGaintag("rejiaozhao"); + }); + if (!cards.length) return false; + if (!game.checkMod(cards[0], player, "unchanged", "cardEnabled2", player)) + return false; + var card = get.autoViewAs(player.storage.rejiaozhao_viewas, cards); + return event.filterCard(card, player, event); + }, + viewAs: function (cards, player) { return player.storage.rejiaozhao_viewas; }, - filterCard:function(card){ - return card.hasGaintag('rejiaozhao'); + filterCard: function (card) { + return card.hasGaintag("rejiaozhao"); }, - selectCard:-1, - position:'h', - popname:true, - prompt:function(){ - return '将“矫诏”牌当做'+get.translation(_status.event.player.storage.rejiaozhao_viewas)+'使用'; + selectCard: -1, + position: "h", + popname: true, + prompt: function () { + return ( + "将“矫诏”牌当做" + + get.translation(_status.event.player.storage.rejiaozhao_viewas) + + "使用" + ); }, - onremove:function(player){ - player.removeGaintag('rejiaozhao'); + onremove: function (player) { + player.removeGaintag("rejiaozhao"); delete player.storage.rejiaozhao_viewas; }, - ai:{order:8}, + ai: { order: 8 }, }, }, }, - redanxin:{ - audio:2, - trigger:{player:'damageEnd'}, - frequent:true, - content:function(){ + redanxin: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { player.draw(); - if(player.countMark('redanxin')<2) player.addMark('redanxin',1,false); + if (player.countMark("redanxin") < 2) player.addMark("redanxin", 1, false); + }, + intro: { content: "当前升级等级。:Lv#" }, + ai: { + maixie: true, + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage")) return; + if (target.hp + target.hujia < 2 || player.hasSkillTag("jueqing", false, target)) + return 2; + if (target.countMark("redanxin") > 1) return [1, 1]; + return [1, 0.8 * target.hp - 0.4]; + }, + }, }, - intro:{content:'当前升级等级。:Lv#'}, - ai:{ - maixie:true, - effect:{ - target:(card,player,target)=>{ - if(!get.tag(card,'damage')) return; - if(target.hp+target.hujia<2||player.hasSkillTag('jueqing',false,target)) return 2; - if(target.countMark('redanxin')>1) return [1,1]; - return [1,0.8*target.hp-0.4]; - } - } - } }, //马岱 - reqianxi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - frequent:true, - content:function(){ - 'step 0' + reqianxi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'reqianxi'),'he')) player.chooseToDiscard('he',true); + ("step 1"); + if (player.hasCard((card) => lib.filter.cardDiscardable(card, player, "reqianxi"), "he")) + player.chooseToDiscard("he", true); else event.finish(); - 'step 2' - if(result.bool&&game.hasPlayer((current)=>current!=player&&get.distance(player,current)<=1)){ - var color=get.color(result.cards[0],player); - event.color=color; - color=get.translation(color); - player.chooseTarget(true,'选择【潜袭】的目标','令其本回合不能使用或打出'+color+'牌,且'+color+'防具失效,且回复体力时,你摸两张牌',function(card,player,target){ - return target!=player&&get.distance(player,target)<=1; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)*Math.sqrt(1+target.countCards('he')); - }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.storage.reqianxi_effect=[event.color,player]; - target.addTempSkill('reqianxi_effect'); + ("step 2"); + if ( + result.bool && + game.hasPlayer((current) => current != player && get.distance(player, current) <= 1) + ) { + var color = get.color(result.cards[0], player); + event.color = color; + color = get.translation(color); + player + .chooseTarget( + true, + "选择【潜袭】的目标", + "令其本回合不能使用或打出" + + color + + "牌,且" + + color + + "防具失效,且回复体力时,你摸两张牌", + function (card, player, target) { + return target != player && get.distance(player, target) <= 1; + } + ) + .set("ai", function (target) { + return ( + -get.attitude(_status.event.player, target) * + Math.sqrt(1 + target.countCards("he")) + ); + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.storage.reqianxi_effect = [event.color, player]; + target.addTempSkill("reqianxi_effect"); } }, - subSkill:{ - effect:{ - mark:true, - intro:{ - markcount:()=>0, - content:function(storage,player){ - var color=get.translation(storage[0]),source=get.translation(storage[1]); - return '本回合不能使用或打出'+color+'牌,且'+color+'防具失效,且回复体力时,'+source+'摸两张牌'; + subSkill: { + effect: { + mark: true, + intro: { + markcount: () => 0, + content: function (storage, player) { + var color = get.translation(storage[0]), + source = get.translation(storage[1]); + return ( + "本回合不能使用或打出" + + color + + "牌,且" + + color + + "防具失效,且回复体力时," + + source + + "摸两张牌" + ); }, }, - charlotte:true, - onremove:true, - mod:{ - cardEnabled2:function(card,player){ - if(get.itemtype(card)=='card'&&get.color(card)==player.getStorage('reqianxi_effect')[0]) return false; + charlotte: true, + onremove: true, + mod: { + cardEnabled2: function (card, player) { + if ( + get.itemtype(card) == "card" && + get.color(card) == player.getStorage("reqianxi_effect")[0] + ) + return false; }, }, - trigger:{player:'recoverEnd'}, - forced:true, - popup:false, - filter:function(event,player){ - return player.storage.reqianxi_effect&&player.storage.reqianxi_effect[1].isIn(); + trigger: { player: "recoverEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + return player.storage.reqianxi_effect && player.storage.reqianxi_effect[1].isIn(); }, - content:function(){ - var target=player.storage.reqianxi_effect[1]; - target.logSkill('reqianxi',player); + content: function () { + var target = player.storage.reqianxi_effect[1]; + target.logSkill("reqianxi", player); target.draw(2); }, - ai:{ - unequip2:true, - skillTagFilter:function(player){ - var evt=_status.event,color=player.getStorage('reqianxi_effect')[0]; - if(evt.name=='lose'&&evt.loseEquip){ - var card=evt.cards[evt.num]; - if(card&&get.subtype(card,false)=='equip2'&&get.color(card)==color) return true; + ai: { + unequip2: true, + skillTagFilter: function (player) { + var evt = _status.event, + color = player.getStorage("reqianxi_effect")[0]; + if (evt.name == "lose" && evt.loseEquip) { + var card = evt.cards[evt.num]; + if ( + card && + get.subtype(card, false) == "equip2" && + get.color(card) == color + ) + return true; return false; - } - else{ - var equip=player.getEquip(2); - if(equip&&get.color(equip)==color) return true; + } else { + var equip = player.getEquip(2); + if (equip && get.color(equip) == color) return true; return false; } }, @@ -4532,956 +5563,1156 @@ game.import('character', function () { }, }, //徐晃 - olduanliang:{ - audio:2, - locked:false, - enable:'chooseToUse', - filterCard:function(card){ - return (get.type2(card)!='trick'&&get.color(card)=='black'); + olduanliang: { + audio: 2, + locked: false, + enable: "chooseToUse", + filterCard: function (card) { + return get.type2(card) != "trick" && get.color(card) == "black"; }, - filter:function(event,player){ - return player.hasCard((card)=>(get.type2(card)!='trick'&&get.color(card)=='black'),'hes'); + filter: function (event, player) { + return player.hasCard( + (card) => get.type2(card) != "trick" && get.color(card) == "black", + "hes" + ); }, - position:'hes', - viewAs:{name:'bingliang'}, - prompt:'将一张黑色非锦囊牌当做兵粮寸断使用', - check:function(card){return 6-get.value(card)}, - ai:{ - order:9 + position: "hes", + viewAs: { name: "bingliang" }, + prompt: "将一张黑色非锦囊牌当做兵粮寸断使用", + check: function (card) { + return 6 - get.value(card); }, - mod:{ - targetInRange:function(card,player,target){ - if(card.name=='bingliang'&&!player.getStat('damage')) return true; + ai: { + order: 9, + }, + mod: { + targetInRange: function (card, player, target) { + if (card.name == "bingliang" && !player.getStat("damage")) return true; }, }, }, - oljiezi:{ - audio:2, - trigger:{global:['phaseDrawSkipped','phaseDrawCancelled']}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('oljiezi'),'你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。').set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(!target.hasMark('oljiezi')&&target.isMinHandcard()) att*=2; - return att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('oljiezi',target); - if(!target.hasMark('oljiezi')&&target.isMinHandcard()) target.addMark('oljiezi',1); + oljiezi: { + audio: 2, + trigger: { global: ["phaseDrawSkipped", "phaseDrawCancelled"] }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("oljiezi"), + "你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。" + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (!target.hasMark("oljiezi") && target.isMinHandcard()) att *= 2; + return att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("oljiezi", target); + if (!target.hasMark("oljiezi") && target.isMinHandcard()) + target.addMark("oljiezi", 1); else target.draw(); } }, - marktext:'辎', - intro:{ - name2:'辎', - content:'mark', - onunmark:true, + marktext: "辎", + intro: { + name2: "辎", + content: "mark", + onunmark: true, }, - group:'oljiezi_extra', - subSkill:{ - extra:{ - audio:'oljiezi', - trigger:{global:'phaseDrawAfter'}, - forced:true, - filter:function(event,player){ - return event.player.hasMark('oljiezi'); + group: "oljiezi_extra", + subSkill: { + extra: { + audio: "oljiezi", + trigger: { global: "phaseDrawAfter" }, + forced: true, + filter: function (event, player) { + return event.player.hasMark("oljiezi"); }, - logTarget:'player', - content:function(){ - var next=trigger.player.phaseDraw(); + logTarget: "player", + content: function () { + var next = trigger.player.phaseDraw(); event.next.remove(next); trigger.getParent().next.add(next); - trigger.player.removeMark('oljiezi',trigger.player.countMark('oljiezi')); + trigger.player.removeMark("oljiezi", trigger.player.countMark("oljiezi")); }, }, }, }, //界护驾 - rehujia:{ - audio:'hujia', - inherit:'hujia', - filter:function(event,player){ - if(event.responded) return false; - if(player.storage.hujiaing) return false; - if(!player.hasZhuSkill('rehujia')) return false; - if(!event.filterCard({name:'shan'},player,event)) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'; + rehujia: { + audio: "hujia", + inherit: "hujia", + filter: function (event, player) { + if (event.responded) return false; + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("rehujia")) return false; + if (!event.filterCard({ name: "shan" }, player, event)) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; }); }, - ai:{ - respondShan:true, - skillTagFilter:function(player){ - if(player.storage.hujiaing) return false; - if(!player.hasZhuSkill('rehujia')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'; + ai: { + respondShan: true, + skillTagFilter: function (player) { + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("rehujia")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; }); }, }, - group:'rehujia_draw', - subSkill:{ - draw:{ - trigger:{global:['useCard','respond']}, - usable:1, - direct:true, - filter:function(event,player){ - return event.card.name=='shan'&&event.player!=player&&event.player.group=='wei'&&event.player.isIn()&& - event.player!=_status.currentPhase&&player.hasZhuSkill('rehujia'); + group: "rehujia_draw", + subSkill: { + draw: { + trigger: { global: ["useCard", "respond"] }, + usable: 1, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "shan" && + event.player != player && + event.player.group == "wei" && + event.player.isIn() && + event.player != _status.currentPhase && + player.hasZhuSkill("rehujia") + ); }, - content:function(){ - 'step 0' - trigger.player.chooseBool('护驾:是否令'+get.translation(player)+'摸一张牌?').set('ai',function(){ - var evt=_status.event; - return get.attitude(evt.player,evt.getParent().player)>0; - }); - 'step 1' - if(result.bool){ - player.logSkill('rehujia'); - trigger.player.line(player,'fire'); + content: function () { + "step 0"; + trigger.player + .chooseBool("护驾:是否令" + get.translation(player) + "摸一张牌?") + .set("ai", function () { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().player) > 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("rehujia"); + trigger.player.line(player, "fire"); player.draw(); - } - else player.storage.counttrigger.rehujia_draw--; + } else player.storage.counttrigger.rehujia_draw--; }, }, }, }, //夏侯氏 - reqiaoshi:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player!=player&&event.player.countCards('h')==player.countCards('h')&&event.player.isIn(); + reqiaoshi: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player != player && + event.player.countCards("h") == player.countCards("h") && + event.player.isIn() + ); }, - check:function(event,player){ - return get.attitude(player,event.player)>=0; + check: function (event, player) { + return get.attitude(player, event.player) >= 0; }, //priority:-5, - logTarget:'player', - content:function(){ - 'step 0' - game.asyncDraw([trigger.player,player]); - 'step 1' + logTarget: "player", + content: function () { + "step 0"; + game.asyncDraw([trigger.player, player]); + ("step 1"); game.delayx(); - if(player.isIn()&&trigger.player.isIn()){ - var getGainSuit=function(player){ - var last=player.getHistory('gain',function(evt){ - return evt.getParent(2)==event; + if (player.isIn() && trigger.player.isIn()) { + var getGainSuit = function (player) { + var last = player.getHistory("gain", function (evt) { + return evt.getParent(2) == event; }); - if(last.length){ - var evt=last.pop(); - if(evt.cards.length==1&&player.getCards('h').includes(evt.cards[0])) return get.suit(evt.cards[0],player); - } - else return player; - } - if(getGainSuit(player)==getGainSuit(trigger.player)) player.chooseBool('是否继续发动【樵拾】?','和'+get.translation(trigger.player)+'各摸一张牌'); - } - else event.finish(); - 'step 2' - if(result.bool) event.goto(0); + if (last.length) { + var evt = last.pop(); + if (evt.cards.length == 1 && player.getCards("h").includes(evt.cards[0])) + return get.suit(evt.cards[0], player); + } else return player; + }; + if (getGainSuit(player) == getGainSuit(trigger.player)) + player.chooseBool( + "是否继续发动【樵拾】?", + "和" + get.translation(trigger.player) + "各摸一张牌" + ); + } else event.finish(); + ("step 2"); + if (result.bool) event.goto(0); + }, + ai: { + expose: 0.1, }, - ai:{ - expose:0.1 - } }, - reyanyu:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.hasCard(card=>lib.skill.reyanyu.filterCard(card,player),'h'); + reyanyu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.hasCard((card) => lib.skill.reyanyu.filterCard(card, player), "h"); }, - filterCard:(card,player)=>get.name(card)=='sha'&&player.canRecast(card), - discard:false, - lose:false, - delay:false, - content:function(){ + filterCard: (card, player) => get.name(card) == "sha" && player.canRecast(card), + discard: false, + lose: false, + delay: false, + content: function () { player.recast(cards); }, - ai:{ - basic:{ - order:1 + ai: { + basic: { + order: 1, + }, + result: { + player: 1, }, - result:{ - player:1 - } }, - group:'reyanyu2' + group: "reyanyu2", }, - reyanyu2:{ - trigger:{player:'phaseUseEnd'}, - direct:true, - filter:(event,player)=>player.hasHistory('useSkill',evt=>evt.skill=='reyanyu'&&evt.event.getParent(2)==event)&&game.hasPlayer(target=>target.hasSex('male')&&target!=player), - content:function(){ - 'step 0' - event.num=Math.min(3,player.getHistory('useSkill',evt=>evt.skill=='reyanyu'&&evt.event.getParent(2)==trigger).length); - player.chooseTarget(get.prompt('reyanyu'),'令一名男性角色摸'+get.cnNumber(event.num)+'张牌',function(card,player,target){ - return target.hasSex('male')&&target!=player; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - player.logSkill('reyanyu',result.targets); + reyanyu2: { + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: (event, player) => + player.hasHistory( + "useSkill", + (evt) => evt.skill == "reyanyu" && evt.event.getParent(2) == event + ) && game.hasPlayer((target) => target.hasSex("male") && target != player), + content: function () { + "step 0"; + event.num = Math.min( + 3, + player.getHistory( + "useSkill", + (evt) => evt.skill == "reyanyu" && evt.event.getParent(2) == trigger + ).length + ); + player + .chooseTarget( + get.prompt("reyanyu"), + "令一名男性角色摸" + get.cnNumber(event.num) + "张牌", + function (card, player, target) { + return target.hasSex("male") && target != player; + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + player.logSkill("reyanyu", result.targets); result.targets[0].draw(event.num); } - } + }, }, //虞翻 - xinzongxuan:{ - audio:2, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + xinzongxuan: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - if(event.type!='discard') return false; - var evt=event.getl(player); - if(!evt||!evt.cards2) return false; - for(var i=0;i0&&!current.hasSkillTag('nogain'); - })) return false; - var cards=trigger.getl(player).cards2; - for(var i=0;i 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + return false; + var cards = trigger.getl(player).cards2; + for (var i = 0; i < cards.length; i++) { + if (get.position(cards[i], true) == "d" && get.type2(cards[i], false) == "trick") { return true; } } return false; }, - content:function(){ - "step 0" - var cards=[],cards2=trigger.getl(player).cards2; - for(var i=0;i0; + var next = player.chooseToMove("纵玄:将任意张牌置于牌堆顶", true); + next.set("list", [["本次弃置的牌(请将要给出的锦囊牌留在这里)", cards], ["牌堆顶"]]); + next.set("filterOk", function (moved) { + if (moved[0].length == 1 && get.type2(moved[0][0], false) == "trick") return true; + return moved[1].length > 0; }); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0),player=_status.event.player; - var result=[[],[]]; - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); - })){ - var max_val=0; - var max_card=false; - for(var i of cards){ - if(get.type2(i,false)=='trick'){ - var val=get.value(i,'raw'); - if(val>max_val){ - max_card=i; - max_val=val; + next.set("processAI", function (list) { + var cards = list[0][1].slice(0), + player = _status.event.player; + var result = [[], []]; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) { + var max_val = 0; + var max_card = false; + for (var i of cards) { + if (get.type2(i, false) == "trick") { + var val = get.value(i, "raw"); + if (val > max_val) { + max_card = i; + max_val = val; } } } - if(max_card){ + if (max_card) { result[0].push(max_card); cards.remove(max_card); } } - if(cards.length){ - var max_val=0; - var max_card=false; - var equip=game.hasPlayer(function(current){ - return current.isDamaged()&&get.recoverEffect(current,player,player)>0; - }) - for(var i of cards){ - var val=get.value(i); - var type=get.type2(i,false); - if(type=='basic') val+=3; - if(type=='equip'&&equip) val+=9; - if(max_val==0||val>max_val){ - max_card=i; - max_val=val; + if (cards.length) { + var max_val = 0; + var max_card = false; + var equip = game.hasPlayer(function (current) { + return current.isDamaged() && get.recoverEffect(current, player, player) > 0; + }); + for (var i of cards) { + var val = get.value(i); + var type = get.type2(i, false); + if (type == "basic") val += 3; + if (type == "equip" && equip) val += 9; + if (max_val == 0 || val > max_val) { + max_card = i; + max_val = val; } } - if(max_card){ + if (max_card) { result[1].push(max_card); cards.remove(max_card); } result[0].addArray(cards); } return result; - }) - 'step 1' - if(result.bool){ - var cards=result.moved[1].slice(0); - if(cards.length){ - game.log(player,'将',cards,'置于了牌堆顶'); - while(cards.length) ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); + }); + ("step 1"); + if (result.bool) { + var cards = result.moved[1].slice(0); + if (cards.length) { + game.log(player, "将", cards, "置于了牌堆顶"); + while (cards.length) + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); } - var list=result.moved[0].filter(function(i){ - return get.type2(i,false)=='trick'; + var list = result.moved[0].filter(function (i) { + return get.type2(i, false) == "trick"; }); - if(list.length&&game.hasPlayer((current)=>(current!=player))){ - var next=player.chooseButton(['是否将一张锦囊牌交给一名其他角色?',list]).set('ai',function(button){ - if(_status.event.goon) return Math.max(0.1,get.value(button.link,'raw')); - return 0; - }).set('goon',game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); - })); - if(!result.moved[1].length) next.set('forced',true); - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget(lib.filter.notMe,true,'令一名其他角色获得'+get.translation(card)).set('card',card).set('ai',function(target){ - var card=_status.event.card,player=_status.event.player; - var eff=Math.max(0.1,get.value(card,target))*get.attitude(player,target); - if(target.hasSkill('nogain')) eff/=10; - return eff; - }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(card,'gain2'); + if (list.length && game.hasPlayer((current) => current != player)) { + var next = player + .chooseButton(["是否将一张锦囊牌交给一名其他角色?", list]) + .set("ai", function (button) { + if (_status.event.goon) + return Math.max(0.1, get.value(button.link, "raw")); + return 0; + }) + .set( + "goon", + game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ); + if (!result.moved[1].length) next.set("forced", true); + } else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget( + lib.filter.notMe, + true, + "令一名其他角色获得" + get.translation(card) + ) + .set("card", card) + .set("ai", function (target) { + var card = _status.event.card, + player = _status.event.player; + var eff = + Math.max(0.1, get.value(card, target)) * get.attitude(player, target); + if (target.hasSkill("nogain")) eff /= 10; + return eff; + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2"); } }, }, - xinzhiyan:{ - audio:'zhiyan', - audioname:['gexuan','re_yufan','xin_yufan'], - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('zhiyan'),'令一名角色摸一张牌并展示之。若为基本牌则你摸一张牌;若为装备牌,则其回复1点体力').set('ai',function(target){ - return get.attitude(_status.event.player,target)*(target.isDamaged()?2:1); - }); - "step 1" - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('xinzhiyan',result.targets); - event.bool=false; - event.target.draw('visible'); - } - else{ + xinzhiyan: { + audio: "zhiyan", + audioname: ["gexuan", "re_yufan", "xin_yufan"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhiyan"), + "令一名角色摸一张牌并展示之。若为基本牌则你摸一张牌;若为装备牌,则其回复1点体力" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) * (target.isDamaged() ? 2 : 1); + }); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("xinzhiyan", result.targets); + event.bool = false; + event.target.draw("visible"); + } else { event.finish(); } - "step 2" - var card=result[0]; - event.card=card; - if(get.type(card)=='basic') player.draw(); - "step 3" - if(get.type(card)=='equip'){ - if(target.getCards('h').includes(card)&&target.hasUseTarget(card)){ - event.target.chooseUseTarget(card,true,'nopopup'); + ("step 2"); + var card = result[0]; + event.card = card; + if (get.type(card) == "basic") player.draw(); + ("step 3"); + if (get.type(card) == "equip") { + if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { + event.target.chooseUseTarget(card, true, "nopopup"); game.delay(); } - event.bool=true; + event.bool = true; } - "step 4" - if(event.bool) target.recover(); + ("step 4"); + if (event.bool) target.recover(); + }, + ai: { + expose: 0.2, + threaten: 1.2, }, - ai:{ - expose:0.2, - threaten:1.2 - } }, //新主公技 - xinhuangtian:{ - unique:true, - audio:'xinhuangtian2', - audioname:['zhangjiao','re_zhangjiao'], - global:'xinhuangtian2', - zhuSkill:true, + xinhuangtian: { + unique: true, + audio: "xinhuangtian2", + audioname: ["zhangjiao", "re_zhangjiao"], + global: "xinhuangtian2", + zhuSkill: true, }, - xinhuangtian2:{ - audio:2, - enable:'phaseUse', - discard:false, - lose:false, - delay:false, - line:true, - prepare:function(cards,player,targets){ - targets[0].logSkill('xinhuangtian'); + xinhuangtian2: { + audio: 2, + enable: "phaseUse", + discard: false, + lose: false, + delay: false, + line: true, + prepare: function (cards, player, targets) { + targets[0].logSkill("xinhuangtian"); }, - prompt:function(){ - var player=_status.event.player; - var list=game.filterPlayer(function(target){ - return target!=player&&target.hasZhuSkill('xinhuangtian',player); + prompt: function () { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target != player && target.hasZhuSkill("xinhuangtian", player); }); - var str='将一张【闪】或黑桃手牌交给'+get.translation(list); - if(list.length>1) str+='中的一人'; + var str = "将一张【闪】或黑桃手牌交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; return str; }, - filter:function(event,player){ - if(player.group!='qun') return false; - if(!game.hasPlayer(function(target){ - return target!=player&&target.hasZhuSkill('xinhuangtian',player)&&!target.hasSkill('xinhuangtian3'); - })) return false; - return player.hasCard(function(card){ - return lib.skill.xinhuangtian2.filterCard(card,player); - },'h'); + filter: function (event, player) { + if (player.group != "qun") return false; + if ( + !game.hasPlayer(function (target) { + return ( + target != player && + target.hasZhuSkill("xinhuangtian", player) && + !target.hasSkill("xinhuangtian3") + ); + }) + ) + return false; + return player.hasCard(function (card) { + return lib.skill.xinhuangtian2.filterCard(card, player); + }, "h"); }, - filterCard:function(card,player){ - return get.name(card,player)=='shan'||get.suit(card,player)=='spade'; + filterCard: function (card, player) { + return get.name(card, player) == "shan" || get.suit(card, player) == "spade"; }, - log:false, - visible:true, - filterTarget:function(card,player,target){ - return target!=player&&target.hasZhuSkill('xinhuangtian',player)&&!target.hasSkill('xinhuangtian3'); + log: false, + visible: true, + filterTarget: function (card, player, target) { + return ( + target != player && + target.hasZhuSkill("xinhuangtian", player) && + !target.hasSkill("xinhuangtian3") + ); }, //usable:1, //forceaudio:true, - content:function(){ - player.give(cards,target); - target.addTempSkill('xinhuangtian3','phaseUseEnd'); + content: function () { + player.give(cards, target); + target.addTempSkill("xinhuangtian3", "phaseUseEnd"); }, - ai:{ - expose:0.3, - order:10, - result:{ - target:5 - } - } - }, - xinhuangtian3:{}, - rejijiang:{ - audio:'jijiang1', - audioname:['liushan','re_liubei','re_liushan','ol_liushan'], - unique:true, - group:['rejijiang1','rejijiang3'], - zhuSkill:true, - filter:function(event,player){ - if(!player.hasZhuSkill('rejijiang')||!game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'; - })) return false; - return !event.jijiang&&(event.type!='phase'||!player.hasSkill('jijiang3')); - }, - enable:['chooseToUse','chooseToRespond'], - viewAs:{name:'sha'}, - filterCard:function(){return false}, - selectCard:-1, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.3; - }, - respondSha:true, - skillTagFilter:function(player){ - if(!player.hasZhuSkill('rejijiang')||!game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'; - })) return false; + ai: { + expose: 0.3, + order: 10, + result: { + target: 5, }, }, }, - rejijiang1:{ - audio:'jijiang1', - audioname:['liushan','re_liubei','re_liushan','ol_liushan'], - trigger:{player:['useCardBegin','respondBegin']}, - logTarget:'targets', - filter:function(event,player){ - return event.skill=='rejijiang'; + xinhuangtian3: {}, + rejijiang: { + audio: "jijiang1", + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + unique: true, + group: ["rejijiang1", "rejijiang3"], + zhuSkill: true, + filter: function (event, player) { + if ( + !player.hasZhuSkill("rejijiang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) + ) + return false; + return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); }, - forced:true, - content:function(){ - "step 0" + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "sha" }, + filterCard: function () { + return false; + }, + selectCard: -1, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.3; + }, + respondSha: true, + skillTagFilter: function (player) { + if ( + !player.hasZhuSkill("rejijiang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) + ) + return false; + }, + }, + }, + rejijiang1: { + audio: "jijiang1", + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + trigger: { player: ["useCardBegin", "respondBegin"] }, + logTarget: "targets", + filter: function (event, player) { + return event.skill == "rejijiang"; + }, + forced: true, + content: function () { + "step 0"; delete trigger.skill; - trigger.getParent().set('jijiang',true); - "step 1" - if(event.current==undefined) event.current=player.next; - if(event.current==player){ - player.addTempSkill('jijiang3'); + trigger.getParent().set("jijiang", true); + ("step 1"); + if (event.current == undefined) event.current = player.next; + if (event.current == player) { + player.addTempSkill("jijiang3"); event.finish(); trigger.cancel(); trigger.getParent().goto(0); - } - else if(event.current.group=='shu'){ - var next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张杀?',{name:'sha'}); - next.set('ai',function(){ - var event=_status.event; - return (get.attitude(event.player,event.source)-2); + } else if (event.current.group == "shu") { + var next = event.current.chooseToRespond( + "是否替" + get.translation(player) + "打出一张杀?", + { name: "sha" } + ); + next.set("ai", function () { + var event = _status.event; + return get.attitude(event.player, event.source) - 2; }); - next.set('source',player); - next.set('jijiang',true); - next.set('skillwarn','替'+get.translation(player)+'打出一张杀'); - next.noOrdering=true; - next.autochoose=lib.filter.autoRespondSha; - } - else{ - event.current=event.current.next; + next.set("source", player); + next.set("jijiang", true); + next.set("skillwarn", "替" + get.translation(player) + "打出一张杀"); + next.noOrdering = true; + next.autochoose = lib.filter.autoRespondSha; + } else { + event.current = event.current.next; event.redo(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { event.finish(); - trigger.card=result.card; - trigger.cards=result.cards; - trigger.throw=false; - if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ - event.current.ai.shown+=0.3; - if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + trigger.card = result.card; + trigger.cards = result.cards; + trigger.throw = false; + if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; } - } - else{ - event.current=event.current.next; + } else { + event.current = event.current.next; event.goto(1); } - } - }, - rejijiang3:{ - trigger:{global:['useCard','respond']}, - usable:1, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.player!=player&&event.player.group=='shu'&&event.player.isIn()&& - event.player!=_status.currentPhase&&player.hasZhuSkill('rejijiang'); }, - content:function(){ - 'step 0' - trigger.player.chooseBool('激将:是否令'+get.translation(player)+'摸一张牌?').set('ai',function(){ - var evt=_status.event; - return get.attitude(evt.player,evt.getParent().player)>0; - }); - 'step 1' - if(result.bool){ - player.logSkill('rejijiang'); - trigger.player.line(player,'fire'); + }, + rejijiang3: { + trigger: { global: ["useCard", "respond"] }, + usable: 1, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.player != player && + event.player.group == "shu" && + event.player.isIn() && + event.player != _status.currentPhase && + player.hasZhuSkill("rejijiang") + ); + }, + content: function () { + "step 0"; + trigger.player + .chooseBool("激将:是否令" + get.translation(player) + "摸一张牌?") + .set("ai", function () { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().player) > 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("rejijiang"); + trigger.player.line(player, "fire"); player.draw(); - } - else player.storage.counttrigger.rejijiang3--; + } else player.storage.counttrigger.rejijiang3--; }, }, //鲁肃 - olhaoshi:{ - trigger:{player:'phaseDrawBegin2'}, - filter:function(event,player){ + olhaoshi: { + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { return !event.numFixed; }, - check:function(event,player){ - return (player.countCards('h')+2+event.num)<=5||game.hasPlayer(function(target){ - return player!==target&&!game.hasPlayer(function(current){ - return current!==player&¤t!==target&¤t.countCards('h')0; - }); + check: function (event, player) { + return ( + player.countCards("h") + 2 + event.num <= 5 || + game.hasPlayer(function (target) { + return ( + player !== target && + !game.hasPlayer(function (current) { + return ( + current !== player && + current !== target && + current.countCards("h") < target.countCards("h") + ); + }) && + get.attitude(player, target) > 0 + ); + }) + ); }, - content:function(){ - trigger.num+=2; - player.addTempSkill('olhaoshi_give','phaseDrawAfter'); + content: function () { + trigger.num += 2; + player.addTempSkill("olhaoshi_give", "phaseDrawAfter"); }, - subSkill:{ - give:{ - trigger:{player:'phaseDrawEnd'}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - return player.countCards('h')>5; + subSkill: { + give: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return player.countCards("h") > 5; }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(function(target){ - return target!=player&&!game.hasPlayer(function(current){ - return current!=player&¤t!=target&¤t.countCards('h')0&&get.attitude(player,i)>0) goon=true;break; + targets: targets, + selectTarget: targets.length == 1 ? -1 : 1, + selectCard: num, + prompt: "将" + get.cnNumber(num) + "张手牌交给一名手牌数最少的其他角色", + forced: true, + ai1: function (card) { + var goon = false, + player = _status.event.player; + for (var i of _status.event.targets) { + if (get.attitude(i, player) > 0 && get.attitude(player, i) > 0) + goon = true; + break; } - if(goon){ - if(!player.hasValueTarget(card)||card.name=='sha'&&player.countCards('h',function(cardx){ - return cardx.name=='sha'&&!ui.selected.cards.includes(cardx); - })>player.getCardUsable('sha')) return 2; - return Math.max(2,get.value(card)/4); + if (goon) { + if ( + !player.hasValueTarget(card) || + (card.name == "sha" && + player.countCards("h", function (cardx) { + return ( + cardx.name == "sha" && + !ui.selected.cards.includes(cardx) + ); + }) > player.getCardUsable("sha")) + ) + return 2; + return Math.max(2, get.value(card) / 4); } - return 1/Math.max(1,get.value(card)); + return 1 / Math.max(1, get.value(card)); }, - ai2:function(target){ - return get.attitude(_status.event.player,target); + ai2: function (target) { + return get.attitude(_status.event.player, target); }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.give(result.cards,target); - player.markAuto('olhaoshi_help',[target]); - player.addTempSkill('olhaoshi_help',{player:'phaseBeginStart'}); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.give(result.cards, target); + player.markAuto("olhaoshi_help", [target]); + player.addTempSkill("olhaoshi_help", { player: "phaseBeginStart" }); } }, }, - help:{ - trigger:{target:'useCardToTargeted'}, - direct:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - if(!player.storage.olhaoshi_help||!player.storage.olhaoshi_help.length) return false; - if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; - for(var i of player.storage.olhaoshi_help){ - if(i.countCards('h')>0) return true; + help: { + trigger: { target: "useCardToTargeted" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + if (!player.storage.olhaoshi_help || !player.storage.olhaoshi_help.length) + return false; + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + for (var i of player.storage.olhaoshi_help) { + if (i.countCards("h") > 0) return true; } return false; }, - content:function(){ - 'step 0' - if(!event.targets) event.targets=player.storage.olhaoshi_help.slice(0).sortBySeat(); - event.target=event.targets.shift(); - event.target.chooseCard('h','好施:是否将一张手牌交给'+get.translation(player)+'?').set('ai',function(card){ - var player=_status.event.player,target=_status.event.getTrigger().player; - if(!_status.event.goon){ - if(get.value(card,player)<0||get.value(card,target)<0) return 1; + content: function () { + "step 0"; + if (!event.targets) + event.targets = player.storage.olhaoshi_help.slice(0).sortBySeat(); + event.target = event.targets.shift(); + event.target + .chooseCard("h", "好施:是否将一张手牌交给" + get.translation(player) + "?") + .set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getTrigger().player; + if (!_status.event.goon) { + if (get.value(card, player) < 0 || get.value(card, target) < 0) + return 1; + return 0; + } + var cardx = _status.event.getTrigger().card; + if ( + card.name == "shan" && + get.tag(cardx, "respondShan") && + target.countCards("h", "shan") < player.countCards("h", "shan") + ) + return 2; + if ( + card.name == "sha" && + (cardx.name == "juedou" || + (get.tag(card, "respondSha") && + target.countCards("h", "sha") < + player.countCards("h", "sha"))) + ) + return 2; + if ( + get.value(card, target) > get.value(card, player) || + target.getUseValue(card) > player.getUseValue(card) + ) + return 1; + if (player.hasSkillTag("noh")) + return 0.5 / Math.max(1, get.value(card, player)); return 0; - } - var cardx=_status.event.getTrigger().card; - if(card.name=='shan'&&get.tag(cardx,'respondShan')&&target.countCards('h','shan')get.value(card,player)||target.getUseValue(card)>player.getUseValue(card)) return 1; - if(player.hasSkillTag('noh')) return 0.5/Math.max(1,get.value(card,player)); - return 0; - }).set('goon',get.attitude(event.target,player)>0); - 'step 1' - if(result.bool){ - target.logSkill('olhaoshi_help',player); - target.give(result.cards,player); + }) + .set("goon", get.attitude(event.target, player) > 0); + ("step 1"); + if (result.bool) { + target.logSkill("olhaoshi_help", player); + target.give(result.cards, player); } - if(targets.length) event.goto(0); + if (targets.length) event.goto(0); }, }, }, }, - oldimeng:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer((current)=>lib.skill.oldimeng.filterTarget(null,player,current)); + oldimeng: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => + lib.skill.oldimeng.filterTarget(null, player, current) + ); }, - selectTarget:2, - complexTarget:true, - filterTarget:function(card,player,target){ - if(target==player) return false; - var ps=player.countCards('he'); - if(!ui.selected.targets.length){ - var hs=target.countCards('h'); - return game.hasPlayer(function(current){ - if(current==player||current==target) return false; - var cs=current.countCards('h'); - return (hs>0||cs>0)&&Math.abs(hs-cs)<=ps; + selectTarget: 2, + complexTarget: true, + filterTarget: function (card, player, target) { + if (target == player) return false; + var ps = player.countCards("he"); + if (!ui.selected.targets.length) { + var hs = target.countCards("h"); + return game.hasPlayer(function (current) { + if (current == player || current == target) return false; + var cs = current.countCards("h"); + return (hs > 0 || cs > 0) && Math.abs(hs - cs) <= ps; }); } - var current=ui.selected.targets[0],hs=target.countCards('h'),cs=current.countCards('h'); - return (hs>0||cs>0)&&Math.abs(hs-cs)<=ps; + var current = ui.selected.targets[0], + hs = target.countCards("h"), + cs = current.countCards("h"); + return (hs > 0 || cs > 0) && Math.abs(hs - cs) <= ps; }, - multitarget:true, - multiline:true, - content:function(){ + multitarget: true, + multiline: true, + content: function () { targets[0].swapHandcards(targets[1]); - var num=Math.abs(targets[0].countCards('h')-targets[1].countCards('h')); - if(num>0){ - player.addMark('oldimeng_discard',num,false); - player.addTempSkill('oldimeng_discard','phaseUseAfter'); + var num = Math.abs(targets[0].countCards("h") - targets[1].countCards("h")); + if (num > 0) { + player.addMark("oldimeng_discard", num, false); + player.addTempSkill("oldimeng_discard", "phaseUseAfter"); } }, - ai:{ - threaten:4.5, - pretao:true, - nokeep:true, - order:1, - expose:0.2, - result:{ - target:function(player,target){ - if(!ui.selected.targets.length) return -Math.sqrt(target.countCards('h')); - var h1=ui.selected.targets[0].getCards('h'),h2=target.getCards('h'); - if(h2.length>h1.length) return 0; - var delval=get.value(h2,target)-get.value(h1,ui.selected.targets[0]); - if(delval>=0) return 0; - return -delval*(h1.length-h2.length); + ai: { + threaten: 4.5, + pretao: true, + nokeep: true, + order: 1, + expose: 0.2, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -Math.sqrt(target.countCards("h")); + var h1 = ui.selected.targets[0].getCards("h"), + h2 = target.getCards("h"); + if (h2.length > h1.length) return 0; + var delval = get.value(h2, target) - get.value(h1, ui.selected.targets[0]); + if (delval >= 0) return 0; + return -delval * (h1.length - h2.length); }, }, }, - subSkill:{ - discard:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return player.countCards('he')>0; + subSkill: { + discard: { + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - player.chooseToDiscard('he',true,player.countMark('oldimeng_discard')); + content: function () { + player.chooseToDiscard("he", true, player.countMark("oldimeng_discard")); }, }, }, }, //贾诩 - rewansha:{ - audio:'wansha', - audioname:['re_jiaxu','shen_simayi','boss_lvbu3'], - global:'rewansha_global', - trigger:{global:'dyingBegin'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return player==_status.currentPhase; + rewansha: { + audio: "wansha", + audioname: ["re_jiaxu", "shen_simayi", "boss_lvbu3"], + global: "rewansha_global", + trigger: { global: "dyingBegin" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return player == _status.currentPhase; }, - content:function(){ - game.countPlayer(function(current){ - if(current!=player&¤t!=trigger.player) current.addSkillBlocker('rewansha_fengyin'); + content: function () { + game.countPlayer(function (current) { + if (current != player && current != trigger.player) + current.addSkillBlocker("rewansha_fengyin"); }); - player.addTempSkill('rewansha_clear'); + player.addTempSkill("rewansha_clear"); }, - subSkill:{ - global:{ - mod:{ - cardEnabled:function(card,player){ - var source=_status.currentPhase; - if(card.name=='tao'&&source&&source!=player&&source.hasSkill('rewansha')&&!player.isDying()) return false; + subSkill: { + global: { + mod: { + cardEnabled: function (card, player) { + var source = _status.currentPhase; + if ( + card.name == "tao" && + source && + source != player && + source.hasSkill("rewansha") && + !player.isDying() + ) + return false; }, - cardSavable:function(card,player){ - var source=_status.currentPhase; - if(card.name=='tao'&&source&&source!=player&&source.hasSkill('rewansha')&&!player.isDying()) return false; + cardSavable: function (card, player) { + var source = _status.currentPhase; + if ( + card.name == "tao" && + source && + source != player && + source.hasSkill("rewansha") && + !player.isDying() + ) + return false; }, }, }, - fengyin:{ - inherit:'fengyin', + fengyin: { + inherit: "fengyin", }, - clear:{ - trigger:{global:'dyingAfter'}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ + clear: { + trigger: { global: "dyingAfter" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { return !_status.dying.length; }, - content:function(){ - player.removeSkill('rewansha_clear'); + content: function () { + player.removeSkill("rewansha_clear"); }, - onremove:function(){ - game.countPlayer2(function(current){ - current.removeSkillBlocker('rewansha_fengyin'); + onremove: function () { + game.countPlayer2(function (current) { + current.removeSkillBlocker("rewansha_fengyin"); }); }, }, }, }, - reluanwu:{ - audio:'luanwu', - audioname:['re_jiaxu'], - unique:true, - enable:'phaseUse', - limited:true, - skillAnimation:'epic', - animationColor:'thunder', - filterTarget:function(card,player,target){ - return target!=player; + reluanwu: { + audio: "luanwu", + audioname: ["re_jiaxu"], + unique: true, + enable: "phaseUse", + limited: true, + skillAnimation: "epic", + animationColor: "thunder", + filterTarget: function (card, player, target) { + return target != player; }, - selectTarget:-1, - multiline:true, - contentBefore:function(){ - player.awakenSkill('reluanwu'); + selectTarget: -1, + multiline: true, + contentBefore: function () { + player.awakenSkill("reluanwu"); }, - content:function(){ - "step 0" - target.chooseToUse('乱武:使用一张杀或失去1点体力',function(card){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments) - },function(card,player,target){ - if(player==target) return false; - var dist=get.distance(player,target); - if(dist>1){ - if(game.hasPlayer(function(current){ - return current!=player&&get.distance(player,current) 1) { + if ( + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) < dist; + }) + ) { + return false; + } + } + return lib.filter.filterTarget.apply(this, arguments); } - } - return lib.filter.filterTarget.apply(this,arguments) - }).set('ai2',function(){ - return get.effect_use.apply(this,arguments)-_status.event.effect; - }).set('effect',get.effect(target,{name:'losehp'},target,target)); - "step 1" - if(result.bool==false){ + ) + .set("ai2", function () { + return get.effect_use.apply(this, arguments) - _status.event.effect; + }) + .set("effect", get.effect(target, { name: "losehp" }, target, target)); + ("step 1"); + if (result.bool == false) { target.loseHp(); } }, - contentAfter:function(){ - player.chooseUseTarget('sha','是否使用一张【杀】?',false,'nodistance'); + contentAfter: function () { + player.chooseUseTarget("sha", "是否使用一张【杀】?", false, "nodistance"); }, - ai:{ - order:1, - result:{ - player:function(player){ - if(lib.config.mode=='identity'&&game.zhu.isZhu&&player.identity=='fan'){ - if(game.zhu.hp==1&&game.zhu.countCards('h')<=2) return 1; + ai: { + order: 1, + result: { + player: function (player) { + if (lib.config.mode == "identity" && game.zhu.isZhu && player.identity == "fan") { + if (game.zhu.hp == 1 && game.zhu.countCards("h") <= 2) return 1; } - var num=0; - var players=game.filterPlayer(); - for(var i=0;i0) att=1; - if(att<0) att=-1; - if(players[i]!=player&&players[i].hp<=3){ - if(players[i].countCards('h')==0) num+=att/players[i].hp; - else if(players[i].countCards('h')==1) num+=att/2/players[i].hp; - else if(players[i].countCards('h')==2) num+=att/4/players[i].hp; + var num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var att = get.attitude(player, players[i]); + if (att > 0) att = 1; + if (att < 0) att = -1; + if (players[i] != player && players[i].hp <= 3) { + if (players[i].countCards("h") == 0) num += att / players[i].hp; + else if (players[i].countCards("h") == 1) num += att / 2 / players[i].hp; + else if (players[i].countCards("h") == 2) num += att / 4 / players[i].hp; } - if(players[i].hp==1) num+=att*1.5; + if (players[i].hp == 1) num += att * 1.5; } - if(player.hp==1){ + if (player.hp == 1) { return -num; } - if(player.hp==2){ - return -game.players.length/4-num; + if (player.hp == 2) { + return -game.players.length / 4 - num; } - return -game.players.length/3-num; - } - } - } - }, - reweimu:{ - audio:2, - mod:{ - targetEnabled:function(card){ - if(get.type2(card)=='trick'&&get.color(card)=='black') return false; + return -game.players.length / 3 - num; + }, }, }, - trigger:{player:'damageBegin4'}, - forced:true, - filter:function(event,player){ - return player==_status.currentPhase; + }, + reweimu: { + audio: 2, + mod: { + targetEnabled: function (card) { + if (get.type2(card) == "trick" && get.color(card) == "black") return false; + }, }, - content:function(){ + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return player == _status.currentPhase; + }, + content: function () { trigger.cancel(); - var num=trigger.num; - player.draw(2*num); + var num = trigger.num; + player.draw(2 * num); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(target==_status.currentPhase&&get.tag(card,'damage')) return [0,1]; + ai: { + effect: { + target: function (card, player, target) { + if (target == _status.currentPhase && get.tag(card, "damage")) return [0, 1]; }, }, }, }, //顾雍 - reshenxing:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he')>=Math.min(2,(player.getStat('skill').reshenxing||0)); + reshenxing: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") >= Math.min(2, player.getStat("skill").reshenxing || 0); }, - selectCard:function(){ - return Math.min(2,(_status.event.player.getStat('skill').reshenxing||0)); + selectCard: function () { + return Math.min(2, _status.event.player.getStat("skill").reshenxing || 0); }, - prompt:function(){ - return '弃置'+get.cnNumber(Math.min(2,(_status.event.player.getStat('skill').reshenxing||0)))+'张牌并摸一张牌'; + prompt: function () { + return ( + "弃置" + + get.cnNumber(Math.min(2, _status.event.player.getStat("skill").reshenxing || 0)) + + "张牌并摸一张牌" + ); }, - check:function(card){ - var num=_status.event.player.countCards('h',{color:get.color(card)}); - if(get.position(card)=='e') num++; - return (Math.max(4,7.1-num)-get.value(card))/num; + check: function (card) { + var num = _status.event.player.countCards("h", { color: get.color(card) }); + if (get.position(card) == "e") num++; + return (Math.max(4, 7.1 - num) - get.value(card)) / num; }, - filterCard:true, - position:'he', - content:function(){ + filterCard: true, + position: "he", + content: function () { player.draw(); }, - ai:{ - order:function(item,player){ - if(!player.getStat('skill').reshenxing) return 10; + ai: { + order: function (item, player) { + if (!player.getStat("skill").reshenxing) return 10; return 1; }, - result:{player:1}, + result: { player: 1 }, }, }, - rebingyi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('h')>0; + rebingyi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterx:function(player){ - var cards=player.getCards('h'); - if(cards.length==1) return true; - var color=get.color(cards[0],player); - for(var i=1;iget.event().choice) + const num = player.countCards("h"); + const result = await player + .chooseTarget( + get.prompt("xinbingyi"), + `展示所有手牌,并选择至多${get.cnNumber(num)}名角色各摸一张牌${ + selfDraw ? "" : ",然后你摸一张牌" + }`, + [0, num] + ) + .set("ai", function (target) { + return get.attitude(get.player(), target); + }) .forResult(); - event.result.cost_data = {selfDraw}; + if (result.bool) + event.result = { + bool: result.bool, + cost_data: { + asyncDraw, + selfDraw, + targets: result.targets, + }, + }; + } else { + event.result = await player + .chooseBool( + get.prompt("bingyi"), + `展示所有手牌${selfDraw ? "" : ",然后你摸一张牌"}` + ) + .set("choice", selfDraw) + .set("ai", () => get.event().choice) + .forResult(); + event.result.cost_data = { selfDraw }; } }, - async content(event, trigger, player){ - await player.showHandcards(get.translation(player)+'发动了【秉壹】') + async content(event, trigger, player) { + await player.showHandcards(get.translation(player) + "发动了【秉壹】"); const data = event.cost_data; - if (data.asyncDraw && data.targets && data.targets.length){ + if (data.asyncDraw && data.targets && data.targets.length) { const targets = data.targets.sortBySeat(); game.asyncDraw(targets); } @@ -5491,1026 +6722,1196 @@ game.import('character', function () { }, }, //钟会 - xinquanji:{ - audio:2, - trigger:{ - player:['damageEnd'], - global:['gainAfter','loseAsyncAfter'], + xinquanji: { + audio: 2, + trigger: { + player: ["damageEnd"], + global: ["gainAfter", "loseAsyncAfter"], }, - filter:function(event,player){ - if(event.name=='damage') return true; - if(event.name=='loseAsync'){ - if(event.type!='gain'||event.giver) return false; - var cards=event.getl(player).cards2; - return game.hasPlayer(function(current){ - if(current==player) return false; - var cardsx=event.getg(current); - for(var i of cardsx){ - if(cards.includes(i)) return true; + filter: function (event, player) { + if (event.name == "damage") return true; + if (event.name == "loseAsync") { + if (event.type != "gain" || event.giver) return false; + var cards = event.getl(player).cards2; + return game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) return true; } return false; }); } - if(player==event.player) return false; - if(event.giver||event.getParent().name=='gift') return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + if (player == event.player) return false; + if (event.giver || event.getParent().name == "gift") return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; }, - frequent:true, - content:function(){ - 'step 0' - event.count=(trigger.name=='damage'?trigger.num:1); - 'step 1' + frequent: true, + content: function () { + "step 0"; + event.count = trigger.name == "damage" ? trigger.num : 1; + ("step 1"); event.count--; player.draw(); - 'step 2' - var hs=player.getCards('h'); - if(hs.length){ - if(hs.length==1) event._result={bool:true,cards:hs}; - else player.chooseCard('h',true,'选择一张手牌作为“权”'); + ("step 2"); + var hs = player.getCards("h"); + if (hs.length) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard("h", true, "选择一张手牌作为“权”"); + } else event.goto(4); + ("step 3"); + if (result.bool && result.cards && result.cards.length) { + player.addToExpansion(result.cards, "giveAuto", player).gaintag.add("xinquanji"); } - else event.goto(4); - 'step 3' - if(result.bool&&result.cards&&result.cards.length){ - player.addToExpansion(result.cards,'giveAuto',player).gaintag.add('xinquanji'); - } - 'step 4' - if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2('xinquanji')).set('frequentSkill',event.name); - } - else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('xinquanji'); + ("step 4"); + if ( + event.count > 0 && + player.hasSkill(event.name) && + !get.is.blocked(event.name, player) + ) { + player.chooseBool(get.prompt2("xinquanji")).set("frequentSkill", event.name); + } else event.finish(); + ("step 5"); + if (result.bool) { + player.logSkill("xinquanji"); event.goto(1); } }, - locked:false, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + locked: false, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - mod:{ - maxHandcard:function(player,num){ - return num+player.getExpansions('xinquanji').length; + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("xinquanji").length; }, }, - ai:{ - maixie:true, - maixie_hp:true, - threaten:0.8, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')&&!target.storage.xinzili){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(target.hp>=4) return [0.5,get.tag(card,'damage')*2]; - if(!target.hasSkill('xinpaiyi')&&target.hp>1) return [0.5,get.tag(card,'damage')*1.5]; - if(target.hp==3) return [0.5,get.tag(card,'damage')*1.5]; - if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.8, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && !target.storage.xinzili) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("xinpaiyi") && target.hp > 1) + return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; } - } - } - } - }, - xinzili:{ - derivation:'xinpaiyi', - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.getExpansions('xinquanji').length>2; + }, + }, }, - content:function(){ - player.awakenSkill('xinzili'); + }, + xinzili: { + derivation: "xinpaiyi", + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.getExpansions("xinquanji").length > 2; + }, + content: function () { + player.awakenSkill("xinzili"); player.recover(); player.draw(2); player.loseMaxHp(); - player.addSkills('xinpaiyi'); + player.addSkills("xinpaiyi"); + }, + ai: { + combo: "xinquanji", }, - ai:{ - combo:'xinquanji' - } }, - xinpaiyi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.getExpansions('xinquanji').length>0&&(!player.hasSkill('xinpaiyi_0')||!player.hasSkill('xinpaiyi_1')) + xinpaiyi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.getExpansions("xinquanji").length > 0 && + (!player.hasSkill("xinpaiyi_0") || !player.hasSkill("xinpaiyi_1")) + ); }, - chooseButton:{ - check:function(button){ - if(typeof button.link=='object') return 1; - var player=_status.event.player,num=player.getExpansions('xinquanji').length-1; - if(button.link==1){ - if(game.countPlayer(function(current){ - return get.damageEffect(current,player,player)>0; - }) 0; + }) < num + ) + return 0.5; return 2; } - if(num<2) return 0; + if (num < 2) return 0; return 1; }, - dialog:function(event,player){ - var dialog=ui.create.dialog('权计','hidden'); - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; - var list=['摸牌','造成伤害']; - dialog.add([list.map((item,i)=>{ - return [i,item]; - }),'tdnodes']); - dialog.add(player.getExpansions('xinquanji')); + dialog: function (event, player) { + var dialog = ui.create.dialog("权计", "hidden"); + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var list = ["摸牌", "造成伤害"]; + dialog.add([ + list.map((item, i) => { + return [i, item]; + }), + "tdnodes", + ]); + dialog.add(player.getExpansions("xinquanji")); return dialog; }, - select:2, - filter:function(button,player){ - if(typeof button.link=='number'&&player.hasSkill('xinpaiyi_'+button.link)) return false; - if(ui.selected.buttons.length) return (typeof ui.selected.buttons[0].link)!=(typeof button.link); + select: 2, + filter: function (button, player) { + if (typeof button.link == "number" && player.hasSkill("xinpaiyi_" + button.link)) + return false; + if (ui.selected.buttons.length) + return typeof ui.selected.buttons[0].link != typeof button.link; return true; }, - backup:function(links){ - if(typeof links[0]=='object') links.reverse(); - var next=get.copy(lib.skill['xinpaiyi_backup'+links[0]]); - next.card=links[1]; + backup: function (links) { + if (typeof links[0] == "object") links.reverse(); + var next = get.copy(lib.skill["xinpaiyi_backup" + links[0]]); + next.card = links[1]; return next; }, - prompt:function(links,player){ - if(typeof links[0]=='object') links.reverse(); - var num=get.cnNumber(Math.max(1,player.getExpansions('xinquanji').length-1)),card=get.translation(links[1]); - if(links[0]==0) return '移去'+card+'并令一名角色摸'+num+'张牌'; - return '移去'+card+'并对至多'+num+'名角色造成1点伤害'; + prompt: function (links, player) { + if (typeof links[0] == "object") links.reverse(); + var num = get.cnNumber(Math.max(1, player.getExpansions("xinquanji").length - 1)), + card = get.translation(links[1]); + if (links[0] == 0) return "移去" + card + "并令一名角色摸" + num + "张牌"; + return "移去" + card + "并对至多" + num + "名角色造成1点伤害"; }, }, - ai:{ - order:1, - result:{player:1}, - combo:'xinquanji' + ai: { + order: 1, + result: { player: 1 }, + combo: "xinquanji", }, - subSkill:{ - 0:{}, - 1:{}, - backup0:{ - audio:'xinpaiyi', - filterCard:()=>false, - selectCard:-1, - filterTarget:true, - delay:false, - content:function(){ - 'step 0' - player.addTempSkill('xinpaiyi_0','phaseUseEnd'); - var card=lib.skill.xinpaiyi_backup.card; + subSkill: { + 0: {}, + 1: {}, + backup0: { + audio: "xinpaiyi", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + delay: false, + content: function () { + "step 0"; + player.addTempSkill("xinpaiyi_0", "phaseUseEnd"); + var card = lib.skill.xinpaiyi_backup.card; player.loseToDiscardpile(card); - 'step 1' - target.draw(Math.max(1,player.getExpansions('xinquanji').length)); + ("step 1"); + target.draw(Math.max(1, player.getExpansions("xinquanji").length)); }, - ai:{ - result:{ - target:function(player,target){ - if(target.hasSkill('nogain')) return 0; - if(player==target&&!player.needsToDiscard()) return 3; + ai: { + result: { + target: function (player, target) { + if (target.hasSkill("nogain")) return 0; + if (player == target && !player.needsToDiscard()) return 3; return 1; }, }, }, }, - backup1:{ - audio:'xinpaiyi', - filterCard:()=>false, - selectCard:-1, - filterTarget:true, - delay:false, - multitarget:true, - multiline:true, - selectTarget:function(){ - return [1,Math.max(1,_status.event.player.getExpansions('xinquanji').length-1)]; + backup1: { + audio: "xinpaiyi", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + delay: false, + multitarget: true, + multiline: true, + selectTarget: function () { + return [ + 1, + Math.max(1, _status.event.player.getExpansions("xinquanji").length - 1), + ]; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; targets.sortBySeat(); - player.addTempSkill('xinpaiyi_1','phaseUseEnd'); - var card=lib.skill.xinpaiyi_backup.card; + player.addTempSkill("xinpaiyi_1", "phaseUseEnd"); + var card = lib.skill.xinpaiyi_backup.card; player.loseToDiscardpile(card); - 'step 1' - for(var i of targets) i.damage(); + ("step 1"); + for (var i of targets) i.damage(); }, - ai:{ - tag:{ - damage:1, + ai: { + tag: { + damage: 1, }, - result:{ - target:-1.5, + result: { + target: -1.5, }, }, }, }, }, //界蔡夫人 - reqieting:{ - audio:2, - trigger:{global:'phaseEnd'}, - direct:true, - filter:function(event,player){ - var target=event.player; - if(player==target) return false; - if(!target.getHistory('sourceDamage').length){ - var cards=target.getCards('e'); - for(var i of cards){ - if(player.canEquip(i)) return true; + reqieting: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + var target = event.player; + if (player == target) return false; + if (!target.getHistory("sourceDamage").length) { + var cards = target.getCards("e"); + for (var i of cards) { + if (player.canEquip(i)) return true; } } - return target.getHistory('useCard',function(evt){ - return evt.targets&&evt.targets.filter(function(i){ - return i!=target; - }).length>0; - }).length==0; + return ( + target.getHistory("useCard", function (evt) { + return ( + evt.targets && + evt.targets.filter(function (i) { + return i != target; + }).length > 0 + ); + }).length == 0 + ); }, - frequent:true, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - event.logged=false; - var list=[]; - if(!target.getHistory('sourceDamage').length){ - var cards=target.getCards('e'); - for(var i of cards){ - if(player.canEquip(i)) list.push(i); + frequent: true, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + event.logged = false; + var list = []; + if (!target.getHistory("sourceDamage").length) { + var cards = target.getCards("e"); + for (var i of cards) { + if (player.canEquip(i)) list.push(i); } } - if(list.length){ - player.choosePlayerCard(target,'e',get.prompt('reqieting',target)).set('list',list).set('filterButton',function(button){ - return _status.event.list.includes(button.link); - }).set('ai',function(button){ - var evt=_status.event,val=get.value(button.link); - if(evt.target.hasSkillTag('noe')) val-=4; - if((evt.att>0)==(val>0)) return 0; - return get.effect(evt.player,button.link,evt.player,evt.player); - }).set('att',get.attitude(player,target)); - } - else event.goto(2); - 'step 1' - if(result.bool){ - player.logSkill('reqieting',target); - event.logged=true; - var card=result.links[0]; - target.$give(card,player,false); + if (list.length) { + player + .choosePlayerCard(target, "e", get.prompt("reqieting", target)) + .set("list", list) + .set("filterButton", function (button) { + return _status.event.list.includes(button.link); + }) + .set("ai", function (button) { + var evt = _status.event, + val = get.value(button.link); + if (evt.target.hasSkillTag("noe")) val -= 4; + if (evt.att > 0 == val > 0) return 0; + return get.effect(evt.player, button.link, evt.player, evt.player); + }) + .set("att", get.attitude(player, target)); + } else event.goto(2); + ("step 1"); + if (result.bool) { + player.logSkill("reqieting", target); + event.logged = true; + var card = result.links[0]; + target.$give(card, player, false); game.delay(0.5); player.equip(card); } - if(target.getHistory('useCard',function(evt){ - return evt.targets&&evt.targets.filter(function(i){ - return i!=target; - }).length>0; - }).length!=0) event.finish(); - 'step 2' - player.chooseBool('是否发动【窃听】摸一张牌?').set('frequentSkill','reqieting'); - 'step 3' - if(result.bool){ - if(!event.logged) player.logSkill('reqieting',target); + if ( + target.getHistory("useCard", function (evt) { + return ( + evt.targets && + evt.targets.filter(function (i) { + return i != target; + }).length > 0 + ); + }).length != 0 + ) + event.finish(); + ("step 2"); + player.chooseBool("是否发动【窃听】摸一张牌?").set("frequentSkill", "reqieting"); + ("step 3"); + if (result.bool) { + if (!event.logged) player.logSkill("reqieting", target); player.draw(); } }, }, - rexianzhou:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return player.countCards('e')>0; + rexianzhou: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countCards("e") > 0; }, - filterCard:true, - position:'e', - selectCard:-1, - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - player.awakenSkill('rexianzhou'); - player.give(cards,target); - player.recover(cards.length) - 'step 1' - var list=game.filterPlayer(function(current){ + filterCard: true, + position: "e", + selectCard: -1, + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.awakenSkill("rexianzhou"); + player.give(cards, target); + player.recover(cards.length); + ("step 1"); + var list = game.filterPlayer(function (current) { return target.inRange(current); }); - if(list.length){ - var max=Math.min(list.length,cards.length); - target.chooseTarget(true,[1,max],'对至多'+get.cnNumber(max)+'名范围内的角色各造成1点伤害',function(card,player,target){ - return _status.event.list.includes(target); - }).set('list',list).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.line(targets,'green'); - for(var i of targets) i.damage('nocard'); + if (list.length) { + var max = Math.min(list.length, cards.length); + target + .chooseTarget( + true, + [1, max], + "对至多" + get.cnNumber(max) + "名范围内的角色各造成1点伤害", + function (card, player, target) { + return _status.event.list.includes(target); + } + ) + .set("list", list) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var i of targets) i.damage("nocard"); } }, - ai:{ - order:1, - result:{ - target:1, - player:function(player){ - var bool=true,players=game.filterPlayer(); - for(var i=0;i2&&get.attitude(players[i],player)>2){ - bool=false;break; + ai: { + order: 1, + result: { + target: 1, + player: function (player) { + var bool = true, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + get.attitude(player, players[i]) > 2 && + get.attitude(players[i], player) > 2 + ) { + bool = false; + break; } } - if(bool) return -10; - if(player.hp==1) return 1; - if(game.phaseNumber{ - game.addGlobalSkill('relongyin_order'); + relongyin: { + audio: 2, + shaRelated: true, + init: (player) => { + game.addGlobalSkill("relongyin_order"); }, - onremove:(player)=>{ - if(!game.hasPlayer(current=>current.hasSkill('relongyin'),true)) game.removeGlobalSkill('relongyin_order'); + onremove: (player) => { + if (!game.hasPlayer((current) => current.hasSkill("relongyin"), true)) + game.removeGlobalSkill("relongyin_order"); }, - trigger:{global:'useCard'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.countCards('he')>0&&event.player.isPhaseUsing(); + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing() + ); }, - content:function(){ - 'step 0' - var go=false; - if(get.attitude(player,trigger.player)>0){ - if(get.color(trigger.card)=='red'){ - go=true; - } - else if(trigger.addCount===false||!trigger.player.isPhaseUsing()) go=false; - else if(!trigger.player.hasSkill('paoxiao')&& - !trigger.player.hasSkill('tanlin3')&& - !trigger.player.hasSkill('zhaxiang2')&& - !trigger.player.hasSkill('fengnu')&& - !trigger.player.getEquip('zhuge')){ - var nh=trigger.player.countCards('h'); - if(player==trigger.player){ - go=(player.countCards('h','sha')>0); - } - else if(nh>=4){ - go=true; - } - else if(player.countCards('h','sha')){ - if(nh==3){ - go=Math.random()<0.8; + content: function () { + "step 0"; + var go = false; + if (get.attitude(player, trigger.player) > 0) { + if (get.color(trigger.card) == "red") { + go = true; + } else if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false; + else if ( + !trigger.player.hasSkill("paoxiao") && + !trigger.player.hasSkill("tanlin3") && + !trigger.player.hasSkill("zhaxiang2") && + !trigger.player.hasSkill("fengnu") && + !trigger.player.getEquip("zhuge") + ) { + var nh = trigger.player.countCards("h"); + if (player == trigger.player) { + go = player.countCards("h", "sha") > 0; + } else if (nh >= 4) { + go = true; + } else if (player.countCards("h", "sha")) { + if (nh == 3) { + go = Math.random() < 0.8; + } else if (nh == 2) { + go = Math.random() < 0.5; } - else if(nh==2){ - go=Math.random()<0.5; - } - } - else if(nh>=3){ - if(nh==3){ - go=Math.random()<0.5; - } - else if(nh==2){ - go=Math.random()<0.2; + } else if (nh >= 3) { + if (nh == 3) { + go = Math.random() < 0.5; + } else if (nh == 2) { + go = Math.random() < 0.2; } } } } //AI停顿 - if(go&&!event.isMine()&&!event.isOnline()&&player.hasCard(function(card){ - return get.value(card)<6&&lib.filter.cardDiscardable(card,player,event.name); - },'he')){ + if ( + go && + !event.isMine() && + !event.isOnline() && + player.hasCard(function (card) { + return ( + get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name) + ); + }, "he") + ) { game.delayx(); } - var next=player.chooseToDiscard(get.prompt('longyin'),'弃置一张牌'+(get.color(trigger.card)=='red'?'并摸一张牌':'')+',令'+get.translation(trigger.player)+'本次使用的【杀】不计入使用次数','he'); - next.logSkill=['relongyin',trigger.player]; - next.set('ai',function(card){ - if(_status.event.go){ - return 6-get.value(card); + var next = player.chooseToDiscard( + get.prompt("longyin"), + "弃置一张牌" + + (get.color(trigger.card) == "red" ? "并摸一张牌" : "") + + ",令" + + get.translation(trigger.player) + + "本次使用的【杀】不计入使用次数", + "he" + ); + next.logSkill = ["relongyin", trigger.player]; + next.set("ai", function (card) { + if (_status.event.go) { + return 6 - get.value(card); } return 0; }); - next.set('go',go); - 'step 1' - if(result.bool){ - if(trigger.addCount!==false){ - trigger.addCount=false; + next.set("go", go); + ("step 1"); + if (result.bool) { + if (trigger.addCount !== false) { + trigger.addCount = false; trigger.player.getStat().card.sha--; } - if(get.color(trigger.card)=='red'){ + if (get.color(trigger.card) == "red") { player.draw(); } - if(get.number(result.cards[0],player)==get.number(trigger.card)) player.restoreSkill('jiezhong'); + if (get.number(result.cards[0], player) == get.number(trigger.card)) + player.restoreSkill("jiezhong"); } }, - ai:{ - expose:0.2 + ai: { + expose: 0.2, }, - subSkill:{ - order:{ - mod:{ - aiOrder:(player,card,num)=>{ - if(num&&card.name==='sha'&&get.color(card)==='red'){ - let gp=game.findPlayer(current=>{ - return current.hasSkill('relongyin')&¤t.hasCard(i=>true,'he'); + subSkill: { + order: { + mod: { + aiOrder: (player, card, num) => { + if (num && card.name === "sha" && get.color(card) === "red") { + let gp = game.findPlayer((current) => { + return ( + current.hasSkill("relongyin") && + current.hasCard((i) => true, "he") + ); }); - if(gp) return num+0.15*Math.sign(get.attitude(player,gp)); + if (gp) return num + 0.15 * Math.sign(get.attitude(player, gp)); } - } + }, }, - trigger:{player:'dieAfter'}, - filter:(event,player)=>{ - return !game.hasPlayer(current=>current.hasSkill('relongyin'),true); + trigger: { player: "dieAfter" }, + filter: (event, player) => { + return !game.hasPlayer((current) => current.hasSkill("relongyin"), true); }, - silent:true, - forceDie:true, - charlotte:true, - content:()=>{ - game.removeGlobalSkill('relongyin_order'); - } - } - } - }, - jiezhong:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - limited:true, - skillAnimation:true, - animationColor:'orange', - filter:function(event,player){ - return player.countCards('h') { + game.removeGlobalSkill("relongyin_order"); + }, + }, }, - content:function(){ - player.awakenSkill('jiezhong'); - player.draw(Math.min(5,player.maxHp-player.countCards('h'))); + }, + jiezhong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + limited: true, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.countCards("h") < player.maxHp; + }, + content: function () { + player.awakenSkill("jiezhong"); + player.draw(Math.min(5, player.maxHp - player.countCards("h"))); }, }, //新郭淮 - decadejingce:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - filter:function(event,player){ - return player.getHistory('useCard').length>=player.hp; + decadejingce: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.getHistory("useCard").length >= player.hp; }, - content:function(){ - 'step 0' - var list=[],history=player.getHistory('useCard'); - for(var i of history){ + content: function () { + "step 0"; + var list = [], + history = player.getHistory("useCard"); + for (var i of history) { list.add(get.suit(i.card)); - if(list.length>=player.hp) break; + if (list.length >= player.hp) break; } - if(list.length>=player.hp) event.goon=true; - else player.chooseControl('摸牌阶段','出牌阶段').set('prompt','精策:选择要执行的额外阶段'); - 'step 1' - if(event.goon||result.index==0){ - var next=player.phaseDraw(); + if (list.length >= player.hp) event.goon = true; + else + player + .chooseControl("摸牌阶段", "出牌阶段") + .set("prompt", "精策:选择要执行的额外阶段"); + ("step 1"); + if (event.goon || result.index == 0) { + var next = player.phaseDraw(); event.next.remove(next); trigger.getParent().next.push(next); } - if(event.goon||result.index==1){ - var next=player.phaseUse(); + if (event.goon || result.index == 1) { + var next = player.phaseUse(); event.next.remove(next); trigger.getParent().next.push(next); } }, }, //新于禁 - decadezhenjun:{ - audio:2, - trigger:{ - player:['phaseZhunbeiBegin','phaseJieshuBegin'] + decadezhenjun: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], }, - filter:function (event,player){ - return game.hasPlayer(function(current){ - return current.countCards('he')>0; + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("he") > 0; }); }, - direct:true, - content:function (){ - 'step 0' - player.chooseTarget(get.prompt2('decadezhenjun'),function(card,player,target){ - return target.countCards('he')>0; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)*(target.countCards('e')+1); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - var num=Math.max(target.countCards('h')-target.hp,1); - player.logSkill('decadezhenjun',target); - player.discardPlayerCard(num,target,true); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("decadezhenjun"), function (card, player, target) { + return target.countCards("he") > 0; + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var num = Math.max(target.countCards("h") - target.hp, 1); + player.logSkill("decadezhenjun", target); + player.discardPlayerCard(num, target, true); } - 'step 2' - if(result.cards&&result.cards.length){ - for(var i=0;i0){ - var prompt='弃置一张牌,或令'+get.translation(event.target)+'摸'+get.cnNumber(event.num)+'张牌'; - player.chooseToDiscard(prompt,'he').ai=function(card){ - return 7-get.value(card); - } - } - else event.finish(); - } - else event.finish(); - 'step 3' - if(!result.bool){ + event.num = result.cards.length; + if (event.num > 0) { + var prompt = + "弃置一张牌,或令" + + get.translation(event.target) + + "摸" + + get.cnNumber(event.num) + + "张牌"; + player.chooseToDiscard(prompt, "he").ai = function (card) { + return 7 - get.value(card); + }; + } else event.finish(); + } else event.finish(); + ("step 3"); + if (!result.bool) { event.target.draw(event.num); } }, }, //界姜维 - oltiaoxin:{ - audio:'tiaoxin', - audioname:['sp_jiangwei','xiahouba','re_jiangwei','gz_jiangwei','ol_jiangwei'], - enable:'phaseUse', - usable:2, - filter:function(event,player){ - if(player.getStat('skill').oltiaoxin) return !player.hasSkill('oltiaoxin2'); + oltiaoxin: { + audio: "tiaoxin", + audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei", "gz_jiangwei", "ol_jiangwei"], + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if (player.getStat("skill").oltiaoxin) return !player.hasSkill("oltiaoxin2"); return true; }, - filterTarget:function(card,player,target){ - return target!=player&&target.inRange(player)&&target.countCards('he')>0; + filterTarget: function (card, player, target) { + return target != player && target.inRange(player) && target.countCards("he") > 0; }, - content:function(){ - "step 0" - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'挑衅:对'+get.translation(player)+'使用一张杀,或令其弃置你的一张牌').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',player); - "step 1" - if(result.bool&&player.getHistory('damage',function(evt){ - return evt.getParent().type=='card'&&evt.getParent(4)==event; - }).length>0) player.addTempSkill('oltiaoxin2','phaseUseEnd'); - else if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,'he',true).boolline=true; + content: function () { + "step 0"; + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "挑衅:对" + get.translation(player) + "使用一张杀,或令其弃置你的一张牌") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", player); + ("step 1"); + if ( + result.bool && + player.getHistory("damage", function (evt) { + return evt.getParent().type == "card" && evt.getParent(4) == event; + }).length > 0 + ) + player.addTempSkill("oltiaoxin2", "phaseUseEnd"); + else if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true).boolline = true; }, - ai:{ - order:4, - expose:0.2, - result:{ - target:-1, - player:function(player,target){ - if(target.countCards('h')==0) return 0; - if(target.countCards('h')==1) return -0.1; - if(player.hp<=2) return -2; - if(player.countCards('h','shan')==0) return -1; + ai: { + order: 4, + expose: 0.2, + result: { + target: -1, + player: function (player, target) { + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; return -0.5; - } + }, }, - threaten:1.1 - } - }, - oltiaoxin2:{}, - olzhiji:{ - skillAnimation:true, - animationColor:'fire', - audio:2, - unique:true, - juexingji:true, - //priority:-10, - derivation:'reguanxing', - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - forced:true, - filter:function(event,player){ - if(player.storage.zhiji) return false; - return player.countCards('h')==0; + threaten: 1.1, }, - content:function(){ - "step 0" - player.awakenSkill('olzhiji'); - player.chooseDrawRecover(2,true); - "step 1" + }, + oltiaoxin2: {}, + olzhiji: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + unique: true, + juexingji: true, + //priority:-10, + derivation: "reguanxing", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + filter: function (event, player) { + if (player.storage.zhiji) return false; + return player.countCards("h") == 0; + }, + content: function () { + "step 0"; + player.awakenSkill("olzhiji"); + player.chooseDrawRecover(2, true); + ("step 1"); player.loseMaxHp(); - player.addSkills('reguanxing'); - } + player.addSkills("reguanxing"); + }, }, //界郭图张嶷 - rejigong:{ - audio:2, - direct:true, - trigger:{player:'phaseUseBegin'}, - content:function(){ - 'step 0' - player.chooseControl('一张','两张','三张','cancel2').set('prompt',get.prompt2('rejigong')).set('ai',()=>'三张'); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('rejigong'); - player.addTempSkill('rejigong2'); - player.draw(1+result.index); + rejigong: { + audio: 2, + direct: true, + trigger: { player: "phaseUseBegin" }, + content: function () { + "step 0"; + player + .chooseControl("一张", "两张", "三张", "cancel2") + .set("prompt", get.prompt2("rejigong")) + .set("ai", () => "三张"); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("rejigong"); + player.addTempSkill("rejigong2"); + player.draw(1 + result.index); } }, }, - rejigong2:{ - audio:'rejigong', - mod:{ - maxHandcardBase:function(player){ - if(game.online) return (player.getStat('damage')||0); - var num=0; - player.getHistory('sourceDamage',function(evt){ - num+=evt.num; + rejigong2: { + audio: "rejigong", + mod: { + maxHandcardBase: function (player) { + if (game.online) return player.getStat("damage") || 0; + var num = 0; + player.getHistory("sourceDamage", function (evt) { + num += evt.num; }); return num; }, }, - trigger:{player:'phaseDiscardBegin'}, - forced:true, - charlotte:true, - filter:function(event,player){ - if(player.isHealthy()) return false; - var num=0; - player.getHistory('sourceDamage',function(evt){ - num+=evt.num; + trigger: { player: "phaseDiscardBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (player.isHealthy()) return false; + var num = 0; + player.getHistory("sourceDamage", function (evt) { + num += evt.num; }); - if(!num) return false; - var num2=0; - player.getHistory('gain',function(evt){ - var evtx=evt.getParent(2); - if(evtx.name=='rejigong'&&evtx.player==player) num2+=evt.cards.length; + if (!num) return false; + var num2 = 0; + player.getHistory("gain", function (evt) { + var evtx = evt.getParent(2); + if (evtx.name == "rejigong" && evtx.player == player) num2 += evt.cards.length; }); - return num>=num2; + return num >= num2; }, - content:function(){ + content: function () { player.recover(); }, }, - reshizhi:{ - mod:{ - cardname:function(card,player){ - if(card.name=='shan'&&player.hp==1) return 'sha'; + reshizhi: { + mod: { + cardname: function (card, player) { + if (card.name == "shan" && player.hp == 1) return "sha"; }, }, - trigger:{source:'damageEnd'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.hp==1&& - event.cards&&event.cards.length==1&&event.cards[0].name=='shan'; + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + player.hp == 1 && + event.cards && + event.cards.length == 1 && + event.cards[0].name == "shan" + ); }, - content:function(){ + content: function () { player.recover(); }, }, //界陈群 - redingpin:{ - audio:2, - enable:'phaseUse', - onChooseToUse:function(event){ - if(event.type!='phase'||game.online) return; - var list=[],player=event.player; - player.getHistory('useCard',function(evt){ + redingpin: { + audio: 2, + enable: "phaseUse", + onChooseToUse: function (event) { + if (event.type != "phase" || game.online) return; + var list = [], + player = event.player; + player.getHistory("useCard", function (evt) { list.add(get.type2(evt.card)); }); - player.getHistory('lose',function(evt){ - if(evt.type!='discard'||evt.getParent(2).redingpin_ignore) return; - for(var i of evt.cards2){ - list.add(get.type2(i,evt.hs.includes(i)?player:false)); + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(2).redingpin_ignore) return; + for (var i of evt.cards2) { + list.add(get.type2(i, evt.hs.includes(i) ? player : false)); } - }) - event.set('redingpin_types',list); + }); + event.set("redingpin_types", list); }, - filter:function(event,player){ - var list=event.redingpin_types||[]; - return player.countCards('he',function(card){ - return !list.includes(get.type2(card)); - })>0; + filter: function (event, player) { + var list = event.redingpin_types || []; + return ( + player.countCards("he", function (card) { + return !list.includes(get.type2(card)); + }) > 0 + ); }, - filterCard:function(card){ - var list=_status.event.redingpin_types||[]; + filterCard: function (card) { + var list = _status.event.redingpin_types || []; return !list.includes(get.type2(card)); }, - position:'he', - filterTarget:function(card,player,target){ - return !target.hasSkill('redingpin2'); + position: "he", + filterTarget: function (card, player, target) { + return !target.hasSkill("redingpin2"); }, - content:function(){ - 'step 0' - target.judge(function(card){ - var evt=_status.event.getParent('redingpin'),suit=get.suit(card); - switch(suit){ - case 'club':case 'spade':return evt.target.hp; - case 'diamond':return get.sgn(get.attitude(evt.target,evt.player))*-3; + content: function () { + "step 0"; + target.judge(function (card) { + var evt = _status.event.getParent("redingpin"), + suit = get.suit(card); + switch (suit) { + case "club": + case "spade": + return evt.target.hp; + case "diamond": + return get.sgn(get.attitude(evt.target, evt.player)) * -3; } return 0; - }).judge2=function(result){ - if(result.color=='black') return true; + }).judge2 = function (result) { + if (result.color == "black") return true; return false; }; - 'step 1' - switch(result.suit){ - case 'spade':case 'club': - if(target.hp>0) target.draw(Math.min(3,target.hp)); - target.addTempSkill('redingpin2'); + ("step 1"); + switch (result.suit) { + case "spade": + case "club": + if (target.hp > 0) target.draw(Math.min(3, target.hp)); + target.addTempSkill("redingpin2"); break; - case 'heart': - event.getParent().redingpin_ignore=true; + case "heart": + event.getParent().redingpin_ignore = true; break; - case 'diamond': + case "diamond": player.turnOver(); break; } }, - ai:{ - order:9, - result:{ - target:function(player,target){ - if(player.isTurnedOver()) return target.hp; - var card=ui.cardPile.firstChild; - if(!card) return; - if(get.color(card)=='black') return target.hp; + ai: { + order: 9, + result: { + target: function (player, target) { + if (player.isTurnedOver()) return target.hp; + var card = ui.cardPile.firstChild; + if (!card) return; + if (get.color(card) == "black") return target.hp; return 0; }, }, }, }, - redingpin2:{charlotte:true}, - refaen:{ - audio:2, - audioname:['dc_chenqun'], - trigger:{global:['turnOverAfter','linkAfter']}, - logTarget:'player', - filter:function(event,player){ - if(event.name=='link') return event.player.isLinked(); + redingpin2: { charlotte: true }, + refaen: { + audio: 2, + audioname: ["dc_chenqun"], + trigger: { global: ["turnOverAfter", "linkAfter"] }, + logTarget: "player", + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); return true; }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ + content: function () { trigger.player.draw(); }, }, - dcfaen:{ - audio:'refaen', - audioname:['dc_chenqun'], - trigger:{global:['turnOverAfter','linkAfter']}, - logTarget:'player', - filter:function(event,player){ - if(event.name=='link') return event.player.isLinked(); + dcfaen: { + audio: "refaen", + audioname: ["dc_chenqun"], + trigger: { global: ["turnOverAfter", "linkAfter"] }, + logTarget: "player", + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); return !event.player.isTurnedOver(); }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ + content: function () { trigger.player.draw(); }, }, //界曹彰 - xinjiangchi:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - content:function(){ - 'step 0' - var list=[ - '摸一张牌', - '摸两张牌,本回合内不能使用或打出【杀】', - ]; - if(player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'xinjiangchi')>0; - })>0) list.push('弃置一张牌,本回合可以多使用一张【杀】且无距离限制'); - player.chooseControl('cancel2').set('prompt',get.prompt('xinjiangchi')).set('choiceList',list).set('ai',function(){ - var player=_status.event.player; - if(!player.countCards('hs',function(card){ - return get.name(card)=='sha'&&player.hasValueTarget(card,false); - })) return 1; - return 0; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('xinjiangchi'); - switch(result.index){ - case 0:{ + xinjiangchi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + var list = ["摸一张牌", "摸两张牌,本回合内不能使用或打出【杀】"]; + if ( + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "xinjiangchi") > 0; + }) > 0 + ) + list.push("弃置一张牌,本回合可以多使用一张【杀】且无距离限制"); + player + .chooseControl("cancel2") + .set("prompt", get.prompt("xinjiangchi")) + .set("choiceList", list) + .set("ai", function () { + var player = _status.event.player; + if ( + !player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card, false); + }) + ) + return 1; + return 0; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("xinjiangchi"); + switch (result.index) { + case 0: { player.draw(); break; } - case 1:{ + case 1: { player.draw(2); - player.addTempSkill('xinjiangchi_less'); + player.addTempSkill("xinjiangchi_less"); break; } - case 2:{ - player.chooseToDiscard('he',true); - player.addTempSkill('xinjiangchi_more'); + case 2: { + player.chooseToDiscard("he", true); + player.addTempSkill("xinjiangchi_more"); break; } } } }, - subSkill:{ - less:{ - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + subSkill: { + less: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, - cardRespondable:function(card){ - if(card.name=='sha') return false; + cardRespondable: function (card) { + if (card.name == "sha") return false; }, }, - charlotte:true, + charlotte: true, }, - more:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + more: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, - targetInRange:function(card){ - if(card.name=='sha') return true; + targetInRange: function (card) { + if (card.name == "sha") return true; }, }, - charlotte:true, + charlotte: true, }, }, }, //界周仓和程普 - ollihuo:{ - mod:{ - aiOrder:function(player,card,num){ - if(card.name=='sha'&&!player.getHistory('useCard').length) return num+7; + ollihuo: { + mod: { + aiOrder: function (player, card, num) { + if (card.name == "sha" && !player.getHistory("useCard").length) return num + 7; }, }, - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; return false; }, - audio:'lihuo', - locked:false, - prompt2:function(event){ - return '将'+get.translation(event.card)+'改为火属性'; + audio: "lihuo", + locked: false, + prompt2: function (event) { + return "将" + get.translation(event.card) + "改为火属性"; }, - audioname:['re_chengpu'], - check:function(event,player){ - return (event.baseDamage>1||player.getHistory('useCard').indexOf(event)==0)&&(player.hp>1||player.getExpansions('rechunlao').length)&&game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current) - &&get.attitude(player,current)<0&&!current.hasShan() - &&get.effect(current,{name:'sha',nature:'fire'},player,player)>0; - }); + audioname: ["re_chengpu"], + check: function (event, player) { + return ( + (event.baseDamage > 1 || player.getHistory("useCard").indexOf(event) == 0) && + (player.hp > 1 || player.getExpansions("rechunlao").length) && + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + player.canUse(event.card, current) && + get.attitude(player, current) < 0 && + !current.hasShan() && + get.effect(current, { name: "sha", nature: "fire" }, player, player) > 0 + ); + }) + ); }, - content:function(){ - game.setNature(trigger.card,'fire'); - trigger.lihuo_changed=true; + content: function () { + game.setNature(trigger.card, "fire"); + trigger.lihuo_changed = true; }, - group:['ollihuo2','ollihuo3','ollihuo4'], - ai:{ - fireAttack:true, + group: ["ollihuo2", "ollihuo3", "ollihuo4"], + ai: { + fireAttack: true, }, }, - ollihuo2:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); + ollihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('ollihuo'),'为'+get.translation(trigger.card)+'增加一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&lib.filter.targetInRange(_status.event.card,player,target)&&lib.filter.targetEnabled(_status.event.card,player,target); - }).set('sourcex',trigger.targets).set('card',trigger.card).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!_status.connectMode) game.delayx(); - event.target=result.targets[0]; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("ollihuo"), + "为" + get.translation(trigger.card) + "增加一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + lib.filter.targetInRange(_status.event.card, player, target) && + lib.filter.targetEnabled(_status.event.card, player, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { event.finish(); } - 'step 2' - player.logSkill('ollihuo',event.target); + ("step 2"); + player.logSkill("ollihuo", event.target); trigger.targets.push(event.target); }, }, - ollihuo3:{ - trigger:{player:'useCardEnd'}, - filter:function(event,player){ - return event.lihuo_changed==true&&player.getHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }).length>0; + ollihuo3: { + trigger: { player: "useCardEnd" }, + filter: function (event, player) { + return ( + event.lihuo_changed == true && + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length > 0 + ); }, - forced:true, - audio:'lihuo', - audioname:['re_chengpu'], - content:function(){ + forced: true, + audio: "lihuo", + audioname: ["re_chengpu"], + content: function () { player.loseHp(); - } - }, - ollihuo4:{ - trigger:{player:'useCardAfter'}, - frequent:true, - audio:'lihuo', - audioname:['re_chengpu'], - filter:function(event,player){ - return event.card.name=='sha'&&player.getHistory('useCard').indexOf(event)==0&&event.cards.filterInD().length>0; - }, - content:function(){ - var cards=trigger.cards.filterInD(); - player.addToExpansion('gain2',cards).gaintag.add('rechunlao'); }, }, - rezhongyong:{ - trigger:{player:'useCardAfter'}, - audio:2, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'; + ollihuo4: { + trigger: { player: "useCardAfter" }, + frequent: true, + audio: "lihuo", + audioname: ["re_chengpu"], + filter: function (event, player) { + return ( + event.card.name == "sha" && + player.getHistory("useCard").indexOf(event) == 0 && + event.cards.filterInD().length > 0 + ); }, - content:function(){ - "step 0" - event.cards=trigger.cards.filterInD(); - game.countPlayer2(function(current){ - current.getHistory('useCard',function(evt){ - if(evt.card.name=='shan'&&evt.getParent(3)==trigger) event.cards.addArray(evt.cards.filterInD('od')); + content: function () { + var cards = trigger.cards.filterInD(); + player.addToExpansion("gain2", cards).gaintag.add("rechunlao"); + }, + }, + rezhongyong: { + trigger: { player: "useCardAfter" }, + audio: 2, + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD(); + game.countPlayer2(function (current) { + current.getHistory("useCard", function (evt) { + if (evt.card.name == "shan" && evt.getParent(3) == trigger) + event.cards.addArray(evt.cards.filterInD("od")); }); }); - if(!event.cards.length) event.finish(); - player.chooseTarget(get.prompt2('rezhongyong'),'令一名其他角色获得'+get.translation(event.cards),function(card,player,target){ - return !_status.event.source.includes(target)&&target!=player; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).set('source',trigger.targets); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('rezhongyong',target); - target.gain(cards,'gain2'); - var red=false,black=false; - for(var i of cards){ - var color=get.color(i,false); - if(color=='red') red=true; - if(color=='black') black=true; - if(red&&black) break; + if (!event.cards.length) event.finish(); + player + .chooseTarget( + get.prompt2("rezhongyong"), + "令一名其他角色获得" + get.translation(event.cards), + function (card, player, target) { + return !_status.event.source.includes(target) && target != player; + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("source", trigger.targets); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("rezhongyong", target); + target.gain(cards, "gain2"); + var red = false, + black = false; + for (var i of cards) { + var color = get.color(i, false); + if (color == "red") red = true; + if (color == "black") black = true; + if (red && black) break; } - if(red) target.chooseToUse('是否使用一张杀?',{name:'sha'}).set('filterTarget',function(card,player,target){ - return target!=_status.event.sourcex&&_status.event.sourcex.inRange(target)&&lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',player).set('addCount',false); - if(black) target.draw(); + if (red) + target + .chooseToUse("是否使用一张杀?", { name: "sha" }) + .set("filterTarget", function (card, player, target) { + return ( + target != _status.event.sourcex && + _status.event.sourcex.inRange(target) && + lib.filter.targetEnabled.apply(this, arguments) + ); + }) + .set("sourcex", player) + .set("addCount", false); + if (black) target.draw(); } - } + }, }, //长标 - changbiao:{ - audio:2, - mod:{ - targetInRange:function(card,player,target){ - if(card.changbiao) return true; + changbiao: { + audio: 2, + mod: { + targetInRange: function (card, player, target) { + if (card.changbiao) return true; }, }, - enable:'phaseUse', - usable:1, - viewAs:{ - name:'sha', - changbiao:true, + enable: "phaseUse", + usable: 1, + viewAs: { + name: "sha", + changbiao: true, }, - locked:false, - filter:function(event,player){ - return player.countCards('hs')>0; + locked: false, + filter: function (event, player) { + return player.countCards("hs") > 0; }, - filterCard:true, - selectCard:[1,Infinity], - position:'hs', - check:function(card){ + filterCard: true, + selectCard: [1, Infinity], + position: "hs", + check: function (card) { let player = _status.event.player; if (ui.selected.cards.length) { - let list = game.filterPlayer(function (current) { - return current !== player && player.canUse('sha', current, false) && get.effect(current, {name: 'sha'}, player, player) > 0; - }).sort(function (a, b) { - return get.effect(b, {name: 'sha'}, player, player) - get.effect(a, {name: 'sha'}, player, player); - }); + let list = game + .filterPlayer(function (current) { + return ( + current !== player && + player.canUse("sha", current, false) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + .sort(function (a, b) { + return ( + get.effect(b, { name: "sha" }, player, player) - + get.effect(a, { name: "sha" }, player, player) + ); + }); if (!list.length) return 0; let target = list[0], cards = ui.selected.cards.concat([card]), @@ -6518,4226 +7919,5159 @@ game.import('character', function () { for (let i of cards) { if (!color.includes(get.color(i, player))) color.add(get.color(i, player)); } - if (color.length !== 1) color[0] = 'none'; - if (player.hasSkillTag( - 'directHit_ai', - true, - { - target: target, - card: {name: 'sha', suit: 'none', color: color[0], cards: cards, isCard: true} - }, - true - )) return 6.5 - get.value(card, player); - if (Math.random() * target.countCards('hs') < 1 || player.needsToDiscard(0,(i,player)=>{ - return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); - })) return 6 - get.value(card, player); + if (color.length !== 1) color[0] = "none"; + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: { + name: "sha", + suit: "none", + color: color[0], + cards: cards, + isCard: true, + }, + }, + true + ) + ) + return 6.5 - get.value(card, player); + if ( + Math.random() * target.countCards("hs") < 1 || + player.needsToDiscard(0, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 6 - get.value(card, player); return 0; } return 6.3 - get.value(card); }, - onuse:function(result,player){ - player.addTempSkill('changbiao_draw'); + onuse: function (result, player) { + player.addTempSkill("changbiao_draw"); }, - subSkill:{ - draw:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.getHistory('sourceDamage',function(evxt){ - var evt=evxt.getParent(); - return evt&&evt.name=='sha'&&evt.skill=='changbiao'&&evt.getParent('phaseUse')==event; - }).length>0; + subSkill: { + draw: { + trigger: { player: "phaseUseEnd" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getHistory("sourceDamage", function (evxt) { + var evt = evxt.getParent(); + return ( + evt && + evt.name == "sha" && + evt.skill == "changbiao" && + evt.getParent("phaseUse") == event + ); + }).length > 0 + ); }, - content:function(){ - var num=0; - player.getHistory('sourceDamage',function(evxt){ - var evt=evxt.getParent(); - if(evt&&evt.name=='sha'&&evt.skill=='changbiao'&&evt.getParent('phaseUse')==trigger) num+=evt.cards.length; + content: function () { + var num = 0; + player.getHistory("sourceDamage", function (evxt) { + var evt = evxt.getParent(); + if ( + evt && + evt.name == "sha" && + evt.skill == "changbiao" && + evt.getParent("phaseUse") == trigger + ) + num += evt.cards.length; }); player.draw(num); }, }, }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'},player)+0.3*(Math.min(player.getCardUsable('sha'),player.countCards('hs','sha')+player.hasCard(function(card){ - return card.name!='sha'&&get.value(card,player)<6.3; - },'hs')?1:0)>1?-1:1); + ai: { + order: function (item, player) { + return ( + get.order({ name: "sha" }, player) + + 0.3 * + (Math.min( + player.getCardUsable("sha"), + player.countCards("hs", "sha") + + player.hasCard(function (card) { + return card.name != "sha" && get.value(card, player) < 6.3; + }, "hs") + ? 1 + : 0 + ) > 1 + ? -1 + : 1) + ); }, - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep'){ - let num=0; - if(arg&&(!arg.card||get.name(arg.card)!=='tao')) return false; - player.getHistory('sourceDamage',function(evxt){ - let evt=evxt.getParent(); - if(evt&&evt.name=='sha'&&evt.skill=='changbiao') num+=evt.cards.length; + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") { + let num = 0; + if (arg && (!arg.card || get.name(arg.card) !== "tao")) return false; + player.getHistory("sourceDamage", function (evxt) { + let evt = evxt.getParent(); + if (evt && evt.name == "sha" && evt.skill == "changbiao") + num += evt.cards.length; }); - return player.needsToDiscard(num)>0; + return player.needsToDiscard(num) > 0; } - } + }, }, }, //国钟会 - gzquanji:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + gzquanji: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - frequent:true, - preHidden:true, - filter:function(event,player,name){ + frequent: true, + preHidden: true, + filter: function (event, player, name) { //if(name=='damageEnd') return true; //if(!event.card) return false; - if(player.hasHistory('useSkill',function(evt){ - return evt.skill=='gzquanji'&&evt.event.triggername==name; - })) return false; + if ( + player.hasHistory("useSkill", function (evt) { + return evt.skill == "gzquanji" && evt.event.triggername == name; + }) + ) + return false; return true; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - var hs=player.getCards('he'); - if(hs.length>0){ - if(hs.length==1) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,'选择一张牌作为“权”'); - } - else event.finish(); - 'step 2' - if(result.bool){ - var cs=result.cards; - player.addToExpansion(cs,player,'give').gaintag.add('gzquanji'); + ("step 1"); + var hs = player.getCards("he"); + if (hs.length > 0) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, "选择一张牌作为“权”"); + } else event.finish(); + ("step 2"); + if (result.bool) { + var cs = result.cards; + player.addToExpansion(cs, player, "give").gaintag.add("gzquanji"); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - locked:false, - mod:{ - maxHandcard:function(player,num){ - return num+player.getExpansions('gzquanji').length; + locked: false, + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("gzquanji").length; }, }, }, - gzpaiyi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.getExpansions('gzquanji').length>0; + gzpaiyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getExpansions("gzquanji").length > 0; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('排异',player.getExpansions('gzquanji'),'hidden') + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("排异", player.getExpansions("gzquanji"), "hidden"); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'gzpaiyi', - filterTarget:true, - filterCard:function(){return false}, - selectCard:-1, - card:links[0], - delay:false, - content:lib.skill.gzpaiyi.contentx, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(target!=player) return 0; - if(player.getExpansions('gzquanji').length<=1||(player.needsToDiscard()&&!player.getEquip('zhuge')&&!player.hasSkill('new_paoxiao'))) return 0; + audio: "gzpaiyi", + filterTarget: true, + filterCard: function () { + return false; + }, + selectCard: -1, + card: links[0], + delay: false, + content: lib.skill.gzpaiyi.contentx, + ai: { + order: 10, + result: { + target: function (player, target) { + if (target != player) return 0; + if ( + player.getExpansions("gzquanji").length <= 1 || + (player.needsToDiscard() && + !player.getEquip("zhuge") && + !player.hasSkill("new_paoxiao")) + ) + return 0; return 1; - } + }, }, }, - } + }; + }, + prompt: function () { + return "请选择【排异】的目标"; }, - prompt:function(){return '请选择【排异】的目标'}, }, - contentx:function(){ - "step 0" - var card=lib.skill.gzpaiyi_backup.card; + contentx: function () { + "step 0"; + var card = lib.skill.gzpaiyi_backup.card; player.loseToDiscardpile(card); - "step 1" - var num=player.getExpansions('gzquanji').length; - if(num>0) target.draw(Math.min(7,num)); - "step 2" - if(target.countCards('h')>player.countCards('h')){ + ("step 1"); + var num = player.getExpansions("gzquanji").length; + if (num > 0) target.draw(Math.min(7, num)); + ("step 2"); + if (target.countCards("h") > player.countCards("h")) { target.damage(); } }, - ai:{ - order:function(item,player){ - var num=player.getExpansions('gzquanji').length; - if(num==1) return 8; + ai: { + order: function (item, player) { + var num = player.getExpansions("gzquanji").length; + if (num == 1) return 8; return 1; }, - result:{ - player:1, + result: { + player: 1, }, }, }, - gzquanji2:{charlotte:true}, - xingongji:{ - enable:'phaseUse', - usable:1, - audio:2, - position:'he', - filterCard:true, - filter:function(event,player){ - return player.countCards('he')>0; + gzquanji2: { charlotte: true }, + xingongji: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - check:function(card){ - var base=0,player=_status.event.player,suit=get.suit(card,player),added=false,added2=false,added3; - if(get.type(card)=='equip'&&game.hasPlayer(function(target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - if(target.countCards('he',function(card){ - return get.value(card)>5; - })) return -att; - })) base+=6; - var hs=player.getCards('h'); - var muniu=player.getEquip('muniu'); - if(muniu&&card!=muniu&&muniu.cards) hs=hs.concat(muniu.cards); - for(var i of hs){ - if(i!=card&&get.name(i)=='sha'){ - if(get.suit(i,player)==suit){ - if(player.hasValueTarget(i,false)){ - added3=true; - base+=5.5; + check: function (card) { + var base = 0, + player = _status.event.player, + suit = get.suit(card, player), + added = false, + added2 = false, + added3; + if ( + get.type(card) == "equip" && + game.hasPlayer(function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + }) + ) + base += 6; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + if (muniu && card != muniu && muniu.cards) hs = hs.concat(muniu.cards); + for (var i of hs) { + if (i != card && get.name(i) == "sha") { + if (get.suit(i, player) == suit) { + if (player.hasValueTarget(i, false)) { + added3 = true; + base += 5.5; } - } - else{ - if(player.hasValueTarget(i,false)) added2=true; - if(!added&&!player.hasValueTarget(i,null,true)&&player.hasValueTarget(i,false,true)){ - base+=4; - added=true; + } else { + if (player.hasValueTarget(i, false)) added2 = true; + if ( + !added && + !player.hasValueTarget(i, null, true) && + player.hasValueTarget(i, false, true) + ) { + base += 4; + added = true; } } } } - if(added3&&!added2) base-=4.5; - return base-get.value(card); + if (added3 && !added2) base -= 4.5; + return base - get.value(card); }, - content:function(){ - "step 0" - if(!player.storage.xingongji2) player.storage.xingongji2=[]; - player.storage.xingongji2.add(get.suit(cards[0],player)); - player.addTempSkill('xingongji2'); - "step 1" - if(get.type(cards[0],null,cards[0].original=='h'?player:false)=='equip'){ - player.chooseTarget('是否弃置一名角色的一张牌?',function(card,player,target){ - return player!=target&&target.countCards('he')>0; - }).set('ai',function(target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - if(target.countCards('he',function(card){ - return get.value(card)>5; - })) return -att; - return -att*0.8; - }); - } - else{ + content: function () { + "step 0"; + if (!player.storage.xingongji2) player.storage.xingongji2 = []; + player.storage.xingongji2.add(get.suit(cards[0], player)); + player.addTempSkill("xingongji2"); + ("step 1"); + if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { + player + .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { + return player != target && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + return -att * 0.8; + }); + } else { event.finish(); } - "step 2" - if(result.bool){ - player.line(result.targets,'green'); - player.discardPlayerCard(result.targets[0],'he',true); + ("step 2"); + if (result.bool) { + player.line(result.targets, "green"); + player.discardPlayerCard(result.targets[0], "he", true); } }, - ai:{ - order:4.5, - result:{ - player:1 - } - } + ai: { + order: 4.5, + result: { + player: 1, + }, + }, }, - xingongji2:{ - charlotte:true, - onremove:true, - mod:{ - attackRangeBase:function(){ + xingongji2: { + charlotte: true, + onremove: true, + mod: { + attackRangeBase: function () { return Infinity; }, - cardUsable:function(card,player){ - if(card.name=='sha'){ + cardUsable: function (card, player) { + if (card.name == "sha") { const suit = get.suit(card); - return suit === 'unsure' || player.storage.xingongji2.includes(suit); + return suit === "unsure" || player.storage.xingongji2.includes(suit); } }, - aiOrder:function(player,card,num){ - if(get.name(card)=='sha'&&!player.storage.xingongji2.includes(get.suit(card))) return num+1; + aiOrder: function (player, card, num) { + if (get.name(card) == "sha" && !player.storage.xingongji2.includes(get.suit(card))) + return num + 1; }, }, - mark:true, - intro:{ - content:'使用$花色的杀无次数限制', + mark: true, + intro: { + content: "使用$花色的杀无次数限制", }, }, - xinjiefan:{ - skillAnimation:true, - animationColor:'wood', - audio:2, - unique:true, - limited:true, - enable:'phaseUse', - filterTarget:true, - content:function(){ - "step 0" - player.awakenSkill('xinjiefan'); - event.players=game.filterPlayer(function(current){ - return current!=target&¤t.inRange(target); + xinjiefan: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + unique: true, + limited: true, + enable: "phaseUse", + filterTarget: true, + content: function () { + "step 0"; + player.awakenSkill("xinjiefan"); + event.players = game.filterPlayer(function (current) { + return current != target && current.inRange(target); }); event.players.sortBySeat(); - "step 1" - if(event.players.length){ - event.current=event.players.shift(); - event.current.addTempClass('target'); - player.line(event.current,'green'); - if(event.current.countCards('he')&&target.isIn()){ - event.current.chooseToDiscard({subtype:'equip1'},'he','弃置一张武器牌或让'+ - get.translation(target)+'摸一张牌').set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.target)<0) return 7-get.value(card); - return -1; - }).set('target',target); - event.tempbool=false; + ("step 1"); + if (event.players.length) { + event.current = event.players.shift(); + event.current.addTempClass("target"); + player.line(event.current, "green"); + if (event.current.countCards("he") && target.isIn()) { + event.current + .chooseToDiscard( + { subtype: "equip1" }, + "he", + "弃置一张武器牌或让" + get.translation(target) + "摸一张牌" + ) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.target) < 0) + return 7 - get.value(card); + return -1; + }) + .set("target", target); + event.tempbool = false; + } else { + event.tempbool = true; } - else{ - event.tempbool=true; - } - } - else{ - if(game.roundNumber<=1) player.addTempSkill('xinjiefan2'); + } else { + if (game.roundNumber <= 1) player.addTempSkill("xinjiefan2"); event.finish(); } - "step 2" - if(event.tempbool||result.bool==false){ + ("step 2"); + if (event.tempbool || result.bool == false) { target.draw(); } event.goto(1); }, - ai:{ - order:5, - result:{ - target:function(player,target){ - if(player.hp>2&&game.roundNumber>1){ - if(game.phaseNumber 2 && game.roundNumber > 1) { + if (game.phaseNumber < game.players.length * 2) return 0; } - var num=0,players=game.filterPlayer(); - for(var i=0;i0; + xinjiefan2: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + content: function () { + player.restoreSkill("xinjiefan"); }, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('residi'),'将一张非基本牌置于武将牌上作为“司”',function(card,player){ - return get.type(card)!='basic'; - }).set('ai',function(card){ - if(get.position(card)=='e') return 5+player.hp-get.value(card); - return 7-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('residi'); - player.addToExpansion(result.cards,'give',player).gaintag.add('residi'); - } - }, - intro:{ - content:'expansion', - markcount:'expansion', - }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); - }, - group:'residi_push', - ai:{notemp:true}, }, - residi_push:{ - trigger:{global:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&player.getExpansions('residi').length>0; + residi: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + if (_status.connectMode) return true; + return get.type(card) != "basic"; + }) > 0 + ); }, - content:function(){ - 'step 0' - player.chooseButton([get.prompt('residi',trigger.player),player.getExpansions('residi')]).set('ai',function(button){ - var player=_status.event.player; - var target=_status.event.getTrigger().player; - if(get.attitude(player,target)>-1) return 0; - var card=button.link; - var color=get.color(button.link,false); - var eff=target.countCards('h',function(card){ - return get.color(card,target)==color&&target.hasValueTarget(card); + content: function () { + "step 0"; + player + .chooseCard( + "he", + get.prompt("residi"), + "将一张非基本牌置于武将牌上作为“司”", + function (card, player) { + return get.type(card) != "basic"; + } + ) + .set("ai", function (card) { + if (get.position(card) == "e") return 5 + player.hp - get.value(card); + return 7 - get.value(card); }); - if(!target.countCards('h',function(card){ - return get.color(card,target)==color&&get.name(card,target)=='sha'&&target.hasValueTarget(card); - })) eff+=1.5; - if(!target.countCards('h',function(card){ - return get.color(card,target)==color&&get.type2(card,target)=='trick'&&target.hasValueTarget(card); - })) eff+=1.5; - return eff-1; - }); - 'step 1' - if(result.bool){ - if(!trigger.residi) trigger.residi=[]; + ("step 1"); + if (result.bool) { + player.logSkill("residi"); + player.addToExpansion(result.cards, "give", player).gaintag.add("residi"); + } + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "residi_push", + ai: { notemp: true }, + }, + residi_push: { + trigger: { global: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && player.getExpansions("residi").length > 0; + }, + content: function () { + "step 0"; + player + .chooseButton([get.prompt("residi", trigger.player), player.getExpansions("residi")]) + .set("ai", function (button) { + var player = _status.event.player; + var target = _status.event.getTrigger().player; + if (get.attitude(player, target) > -1) return 0; + var card = button.link; + var color = get.color(button.link, false); + var eff = target.countCards("h", function (card) { + return get.color(card, target) == color && target.hasValueTarget(card); + }); + if ( + !target.countCards("h", function (card) { + return ( + get.color(card, target) == color && + get.name(card, target) == "sha" && + target.hasValueTarget(card) + ); + }) + ) + eff += 1.5; + if ( + !target.countCards("h", function (card) { + return ( + get.color(card, target) == color && + get.type2(card, target) == "trick" && + target.hasValueTarget(card) + ); + }) + ) + eff += 1.5; + return eff - 1; + }); + ("step 1"); + if (result.bool) { + if (!trigger.residi) trigger.residi = []; trigger.residi.push(player); - var card=result.links[0]; - var target=trigger.player; - player.logSkill('residi',target); + var card = result.links[0]; + var target = trigger.player; + player.logSkill("residi", target); player.loseToDiscardpile(card); - var color=get.color(card,false); - if(!target.storage.residi2) target.storage.residi2=[]; + var color = get.color(card, false); + if (!target.storage.residi2) target.storage.residi2 = []; target.storage.residi2.add(color); - target.addTempSkill('residi2','phaseUseAfter'); - target.markSkill('residi2'); - player.addTempSkill('residi3','phaseUseAfter'); + target.addTempSkill("residi2", "phaseUseAfter"); + target.markSkill("residi2"); + player.addTempSkill("residi3", "phaseUseAfter"); } }, }, - residi2:{ - onremove:true, - mod:{ - cardEnabled:function(card,player){ - if(player.getStorage('residi2').includes(get.color(card,player))) return false; + residi2: { + onremove: true, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("residi2").includes(get.color(card, player))) return false; }, - cardRespondable:function(card,player){ - if(player.getStorage('residi2').includes(get.color(card,player))) return false; + cardRespondable: function (card, player) { + if (player.getStorage("residi2").includes(get.color(card, player))) return false; }, - cardSavable:function(card,player){ - if(player.getStorage('residi2').includes(get.color(card,player))) return false; + cardSavable: function (card, player) { + if (player.getStorage("residi2").includes(get.color(card, player))) return false; }, }, - intro:{ - content:'不能使用或打出$牌', + intro: { + content: "不能使用或打出$牌", }, - marktext:'敌', + marktext: "敌", }, - residi3:{ - audio:'residi', - trigger:{global:'phaseUseEnd'}, - forced:true, - filter:function(event,player){ - if(!event.residi||!event.residi.includes(player)) return false; - var sha=(player.canUse('sha',event.player,false)),trick=true; - event.player.getHistory('useCard',function(evt){ - if(evt.getParent('phaseUse')!=event) return false; - if(sha&&evt.card.name=='sha') sha=false; - if(trick&&get.type2(evt.card,false)=='trick') trick=false; + residi3: { + audio: "residi", + trigger: { global: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + if (!event.residi || !event.residi.includes(player)) return false; + var sha = player.canUse("sha", event.player, false), + trick = true; + event.player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") != event) return false; + if (sha && evt.card.name == "sha") sha = false; + if (trick && get.type2(evt.card, false) == "trick") trick = false; }); - return sha||trick; + return sha || trick; }, - content:function(){ - var sha=(player.canUse('sha',trigger.player,false)),trick=true; - trigger.player.getHistory('useCard',function(evt){ - if(evt.getParent('phaseUse')!=trigger) return false; - if(sha&&evt.card.name=='sha') sha=false; - if(trick&&get.type2(evt.card,false)=='trick') trick=false; + content: function () { + var sha = player.canUse("sha", trigger.player, false), + trick = true; + trigger.player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") != trigger) return false; + if (sha && evt.card.name == "sha") sha = false; + if (trick && get.type2(evt.card, false) == "trick") trick = false; }); - if(sha) player.useCard({name:'sha',isCard:true},trigger.player); - if(trick) player.draw(2); + if (sha) player.useCard({ name: "sha", isCard: true }, trigger.player); + if (trick) player.draw(2); }, }, - rehuaiyi:{ - audio:2, - enable:'phaseUse', - usable:2, - delay:false, - filter:function(event,player){ - return player.countCards('h')>0&&(!player.getStat('skill').rehuaiyi||player.hasSkill('rehuaiyi2')); + rehuaiyi: { + audio: 2, + enable: "phaseUse", + usable: 2, + delay: false, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + (!player.getStat("skill").rehuaiyi || player.hasSkill("rehuaiyi2")) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - if(get.color(player.getCards('h'))!='none'){ + if (get.color(player.getCards("h")) != "none") { player.draw(); - player.addTempSkill('rehuaiyi2','phaseUseEnd'); + player.addTempSkill("rehuaiyi2", "phaseUseEnd"); event.finish(); } - 'step 1' - player.chooseControl('红色','黑色').set('ai',function(){ - var player=_status.event.player; - if(player.countCards('h',{color:'red'})==1&& - player.countCards('h',{color:'black'})>1) return '红色'; - return '黑色'; + ("step 1"); + player.chooseControl("红色", "黑色").set("ai", function () { + var player = _status.event.player; + if ( + player.countCards("h", { color: "red" }) == 1 && + player.countCards("h", { color: "black" }) > 1 + ) + return "红色"; + return "黑色"; }); - 'step 2' - event.control=result.control; + ("step 2"); + event.control = result.control; var cards; - if(event.control=='红色'){ - cards=player.getCards('h',{color:'red'}); - } - else{ - cards=player.getCards('h',{color:'black'}); + if (event.control == "红色") { + cards = player.getCards("h", { color: "red" }); + } else { + cards = player.getCards("h", { color: "black" }); } player.discard(cards); - event.num=cards.length; - 'step 3' - player.chooseTarget('请选择至多'+get.cnNumber(event.num)+'名有牌的其他角色,获得这些角色的各一张牌。',[1,event.num],function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)+0.5; - }); - 'step 4' - if(result.bool&&result.targets){ - player.line(result.targets,'green'); - event.targets=result.targets; + event.num = cards.length; + ("step 3"); + player + .chooseTarget( + "请选择至多" + + get.cnNumber(event.num) + + "名有牌的其他角色,获得这些角色的各一张牌。", + [1, event.num], + function (card, player, target) { + return target != player && target.countCards("he") > 0; + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) + 0.5; + }); + ("step 4"); + if (result.bool && result.targets) { + player.line(result.targets, "green"); + event.targets = result.targets; event.targets.sort(lib.sort.seat); - event.gained=0; - } - else{ + event.gained = 0; + } else { event.finish(); } - 'step 5' - if(player.isIn()&&event.targets.length){ - player.gainPlayerCard(event.targets.shift(),'he',true); + ("step 5"); + if (player.isIn() && event.targets.length) { + player.gainPlayerCard(event.targets.shift(), "he", true); + } else event.finish(); + ("step 6"); + if (result.bool) { + event.gained += result.cards.length; } - else event.finish(); - 'step 6' - if(result.bool){ - event.gained+=result.cards.length; - } - if(event.targets.length) event.goto(5); - 'step 7' - if(event.gained>1) player.loseHp(); + if (event.targets.length) event.goto(5); + ("step 7"); + if (event.gained > 1) player.loseHp(); }, - ai:{ - order:function(item,player){ - if(player.countCards('h',{color:'red'})==0) return 10; - if(player.countCards('h',{color:'black'})==0) return 10; + ai: { + order: function (item, player) { + if (player.countCards("h", { color: "red" }) == 0) return 10; + if (player.countCards("h", { color: "black" }) == 0) return 10; return 1; }, - result:{ - player:1 - } - } + result: { + player: 1, + }, + }, }, - rehuaiyi2:{}, - rezhuikong:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - check:function(event,player){ - if(get.attitude(player,event.player)<-2){ - var cards=player.getCards('h'); - if(cards.length>player.hp) return true; - for(var i=0;i7&&useful<7) return true; + rehuaiyi2: {}, + rezhuikong: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (get.attitude(player, event.player) < -2) { + var cards = player.getCards("h"); + if (cards.length > player.hp) return true; + for (var i = 0; i < cards.length; i++) { + var useful = get.useful(cards[i]); + if (useful < 5) return true; + if (get.number(cards[i]) > 7 && useful < 7) return true; } } return false; }, - logTarget:'player', - filter:function(event,player){ - return player.hp1&&get.effect(player,{name:'sha'},trigger.player,player)>0&&Math.random()<0.9)); - "step 1" - if(result.bool){ - trigger.player.addTempSkill('zishou2'); + content: function () { + "step 0"; + player + .chooseToCompare(trigger.player) + .set( + "small", + player.hp > 1 && + get.effect(player, { name: "sha" }, trigger.player, player) > 0 && + Math.random() < 0.9 + ); + ("step 1"); + if (result.bool) { + trigger.player.addTempSkill("zishou2"); event.finish(); - } - else if(result.target&&get.position(result.target)=='d') player.gain(result.target,'gain2','log'); - "step 2" - var card={name:'sha',isCard:true}; - if(trigger.player.canUse(card,player,false)) trigger.player.useCard(card,player,false); + } else if (result.target && get.position(result.target) == "d") + player.gain(result.target, "gain2", "log"); + ("step 2"); + var card = { name: "sha", isCard: true }; + if (trigger.player.canUse(card, player, false)) + trigger.player.useCard(card, player, false); }, }, - reqiuyuan:{ - audio:2, - trigger:{target:'useCardToTarget'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&game.hasPlayer(function(current){ - return current!=player&&!event.targets.includes(current)&&lib.filter.targetEnabled(event.card,event.player,current); - }); + reqiuyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return ( + current != player && + !event.targets.includes(current) && + lib.filter.targetEnabled(event.card, event.player, current) + ); + }) + ); }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('reqiuyuan'),function(card,player,target){ - var evt=_status.event.getTrigger(); - return target!=player&&!evt.targets.includes(target)&&lib.filter.targetEnabled(evt.card,evt.player,target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,trigger.player,player)+0.1; - }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('reqiuyuan',target); - event.target=target; - target.chooseCard(function(card,player){ - var name=get.name(card,player); - return name!='sha'&&get.type(name)=='basic'; - },'h','交给'+get.translation(player)+ - '一张不为【杀】的基本牌,或成为此杀的额外目标且不可响应此【杀】').set('ai',function(card){ - return get.attitude(target,_status.event.sourcex)>=0?1:-1; - }).set('sourcex',player); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("reqiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + !evt.targets.includes(target) && + lib.filter.targetEnabled(evt.card, evt.player, target) + ); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("reqiuyuan", target); + event.target = target; + target + .chooseCard( + function (card, player) { + var name = get.name(card, player); + return name != "sha" && get.type(name) == "basic"; + }, + "h", + "交给" + + get.translation(player) + + "一张不为【杀】的基本牌,或成为此杀的额外目标且不可响应此【杀】" + ) + .set("ai", function (card) { + return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; + }) + .set("sourcex", player); game.delay(); - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool){ - target.give(result.cards,player); + ("step 2"); + if (result.bool) { + target.give(result.cards, player); game.delay(); - } - else{ + } else { trigger.getParent().targets.push(event.target); trigger.getParent().triggeredTargets2.push(event.target); trigger.directHit.push(event.target); - game.log(event.target,'成为了',trigger.card,'的额外目标'); + game.log(event.target, "成为了", trigger.card, "的额外目标"); } }, - ai:{ - expose:0.2, - effect:{ - target:function(card,player,target){ - if(card.name!='sha') return; - var players=game.filterPlayer(); - if(get.attitude(player,target)<=0){ - for(var i=0;i0&& - get.effect(target2,{name:'shacopy',nature:card.nature,suit:card.suit},player,player)<0){ - if(target.hp==target.maxHp) return 0.3; + ai: { + expose: 0.2, + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + var players = game.filterPlayer(); + if (get.attitude(player, target) <= 0) { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if ( + player != target2 && + target != target2 && + player.canUse(card, target2, false) && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + target + ) > 0 && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + player + ) < 0 + ) { + if (target.hp == target.maxHp) return 0.3; return 0.6; } } - } - else{ - for(var i=0;i0){ - if(player.canUse(card,target2)) return; - if(target.hp==target.maxHp) return [0,1]; - return [0,0]; + } else { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if ( + player != target2 && + target != target2 && + player.canUse(card, target2, false) && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + player + ) > 0 + ) { + if (player.canUse(card, target2)) return; + if (target.hp == target.maxHp) return [0, 1]; + return [0, 0]; } } } - } - } - } - }, - reenyuan:{ - audio:2, - group:['reenyuan1','reenyuan2'], - }, - reenyuan1:{ - audio:'reenyuan', - trigger:{player:'gainEnd'}, - filter:function(event,player){ - if(!event.source||event.source==player||!event.source.isIn()||event.cards.length<2) return false; - var evt=event.getl(event.source); - return evt&&evt.cards2&&evt.cards2.length>1; + }, + }, }, - check:function(event,player){ - return get.attitude(player,event.source)>0; + }, + reenyuan: { + audio: 2, + group: ["reenyuan1", "reenyuan2"], + }, + reenyuan1: { + audio: "reenyuan", + trigger: { player: "gainEnd" }, + filter: function (event, player) { + if ( + !event.source || + event.source == player || + !event.source.isIn() || + event.cards.length < 2 + ) + return false; + var evt = event.getl(event.source); + return evt && evt.cards2 && evt.cards2.length > 1; }, - logTarget:'source', - prompt2:'令该角色摸一张牌', - content:function(){ + check: function (event, player) { + return get.attitude(player, event.source) > 0; + }, + logTarget: "source", + prompt2: "令该角色摸一张牌", + content: function () { trigger.source.draw(); }, }, - reenyuan2:{ - audio:'reenyuan', - trigger:{player:'damageEnd'}, - logTarget:'source', - filter:function(event,player){ - return event.source&&event.source!=player&&event.source.isIn(); + reenyuan2: { + audio: "reenyuan", + trigger: { player: "damageEnd" }, + logTarget: "source", + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); }, - check:function(event,player){ - var att=get.attitude(player,event.source); - var num=event.source.countCards('h'); - if(att<=0) return true; - if(num>2) return true; - if(num) return att<4; + check: function (event, player) { + var att = get.attitude(player, event.source); + var num = event.source.countCards("h"); + if (att <= 0) return true; + if (num > 2) return true; + if (num) return att < 4; return false; }, - prompt2:'令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。', - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' - var target=trigger.source; + prompt2: "令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。", + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); + var target = trigger.source; event.count--; - if(!target.countCards('h')) event._result={bool:false}; - else target.chooseCard('h','恩怨:将一张手牌交给'+get.translation(player)+',或失去1点体力').set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.getParent().player)>0){ - if(get.suit(card)!='heart') return 15-get.value(card); - return 11-get.value(card); - } - else{ - var num=12-_status.event.player.hp*2; - if(get.suit(card)!='heart') num-=2; - return num-get.value(card); - } - }); - 'step 2' - var target=trigger.source; - if(result.bool){ - var card=result.cards[0]; - event.card=card; - target.give(card,player); - } - else{ + if (!target.countCards("h")) event._result = { bool: false }; + else + target + .chooseCard( + "h", + "恩怨:将一张手牌交给" + get.translation(player) + ",或失去1点体力" + ) + .set("ai", function (card) { + if ( + get.attitude(_status.event.player, _status.event.getParent().player) > 0 + ) { + if (get.suit(card) != "heart") return 15 - get.value(card); + return 11 - get.value(card); + } else { + var num = 12 - _status.event.player.hp * 2; + if (get.suit(card) != "heart") num -= 2; + return num - get.value(card); + } + }); + ("step 2"); + var target = trigger.source; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + target.give(card, player); + } else { target.loseHp(); event.goto(4); } - 'step 3' - if(get.suit(card)!='heart') player.draw(); - 'step 4' - var target=trigger.source; - if(target.isIn()&&event.count>0&&player.hasSkill('reenyuan')) player.chooseBool(get.prompt('reenyuan',target),'令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。').set('ai',function(){ - var evt=_status.event.getTrigger(); - return lib.skill.reenyuan2.check(evt,evt.player); - }); + ("step 3"); + if (get.suit(card) != "heart") player.draw(); + ("step 4"); + var target = trigger.source; + if (target.isIn() && event.count > 0 && player.hasSkill("reenyuan")) + player + .chooseBool( + get.prompt("reenyuan", target), + "令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。" + ) + .set("ai", function () { + var evt = _status.event.getTrigger(); + return lib.skill.reenyuan2.check(evt, evt.player); + }); else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('reenyuan2',trigger.source); + ("step 5"); + if (result.bool) { + player.logSkill("reenyuan2", trigger.source); event.goto(1); } }, }, - rexuanhuo:{ - audio:2, - trigger:{player:'phaseDrawEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>1&&game.countPlayer()>2; + rexuanhuo: { + audio: 2, + trigger: { player: "phaseDrawEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 1 && game.countPlayer() > 2; }, - content:function(){ - 'step 0' - var ai2=function(target){ - var player=_status.event.player; - if(get.attitude(player,target)<=0) return 0; - var list=[null,'juedou'].concat(lib.inpile_nature); - if(target.hasSkill('ayato_zenshen')) list.push('kami'); - var num=Math.max.apply(Math,list.map(function(i){ - if(i=='juedou') return target.getUseValue({name:'juedou',isCard:true},false); - var card={name:'sha',nature:i,isCard:true}; - return target.getUseValue(card,false); - })); - if(target.hasSkillTag('nogain')) num/=4; + content: function () { + "step 0"; + var ai2 = function (target) { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) return 0; + var list = [null, "juedou"].concat(lib.inpile_nature); + if (target.hasSkill("ayato_zenshen")) list.push("kami"); + var num = Math.max.apply( + Math, + list.map(function (i) { + if (i == "juedou") + return target.getUseValue({ name: "juedou", isCard: true }, false); + var card = { name: "sha", nature: i, isCard: true }; + return target.getUseValue(card, false); + }) + ); + if (target.hasSkillTag("nogain")) num /= 4; return num; }; player.chooseCardTarget({ - prompt:get.prompt2('rexuanhuo'), - filterCard:true, - selectCard:2, - position:'h', - filterTarget:lib.filter.notMe, - goon:game.hasPlayer(function(current){ - return current!=player&&ai2(player,current)>0; + prompt: get.prompt2("rexuanhuo"), + filterCard: true, + selectCard: 2, + position: "h", + filterTarget: lib.filter.notMe, + goon: game.hasPlayer(function (current) { + return current != player && ai2(player, current) > 0; }), - ai1:function(card){ - if(!_status.event.goon) return 0; - return 7-get.value(card); + ai1: function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); }, - ai2:ai2, + ai2: ai2, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('rexuanhuo',target); - player.give(result.cards,target); - } + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rexuanhuo", target); + player.give(result.cards, target); + } else event.finish(); + ("step 2"); + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) + player + .chooseTarget( + function (card, player, target) { + return target != player && target != _status.event.target; + }, + "选择" + get.translation(target) + "使用【杀】或【决斗】的目标", + true + ) + .set("target", target) + .set("ai", function (target) { + var evt = _status.event; + var list = [null, "juedou"].concat(lib.inpile_nature); + if (evt.target.hasSkill("ayato_zenshen")) list.push("kami"); + return Math.max.apply( + Math, + list.map(function (i) { + var card = { name: "sha", isCard: true }; + if (i == "juedou") card.name = "juedou"; + else if (i) card.nature = i; + if (!evt.target.canUse(card, target, false)) return 0; + return get.effect(target, card, evt.target, evt.player); + }) + ); + }); else event.finish(); - 'step 2' - if(game.hasPlayer(function(current){ - return current!=player&¤t!=target; - })) player.chooseTarget(function(card,player,target){ - return target!=player&&target!=_status.event.target; - },'选择'+get.translation(target)+'使用【杀】或【决斗】的目标',true).set('target',target).set('ai',function(target){ - var evt=_status.event; - var list=[null,'juedou'].concat(lib.inpile_nature); - if(evt.target.hasSkill('ayato_zenshen')) list.push('kami') - return Math.max.apply(Math,list.map(function(i){ - var card={name:'sha',isCard:true}; - if(i=='juedou') card.name='juedou'; - else if(i) card.nature=i; - if(!evt.target.canUse(card,target,false)) return 0; - return get.effect(target,card,evt.target,evt.player); - })); - }); - else event.finish(); - 'step 3' - var target2=result.targets[0]; - event.target2=target2; + ("step 3"); + var target2 = result.targets[0]; + event.target2 = target2; player.line(target2); - game.log(player,'选择了',target2); - var list=lib.inpile_nature.slice(0); + game.log(player, "选择了", target2); + var list = lib.inpile_nature.slice(0); list.unshift(null); - var vcards=[]; - if(target.hasSkill('ayato_zenshen')) list.add('kami'); - for(var i of list){ - if(target.canUse({name:'sha',isCard:true,nature:i},target2,false)) vcards.push(['基本','','sha',i]); + var vcards = []; + if (target.hasSkill("ayato_zenshen")) list.add("kami"); + for (var i of list) { + if (target.canUse({ name: "sha", isCard: true, nature: i }, target2, false)) + vcards.push(["基本", "", "sha", i]); } - if(target.canUse({name:'juedou',isCard:true},target2,false)) vcards.push(['基本','','juedou']); - if(!vcards.length){ - if(!target.countCards('h')) event.finish(); - else event._result={index:1}; + if (target.canUse({ name: "juedou", isCard: true }, target2, false)) + vcards.push(["基本", "", "juedou"]); + if (!vcards.length) { + if (!target.countCards("h")) event.finish(); + else event._result = { index: 1 }; + } else if (!target.countCards("h")) { + event.vcards = vcards; + event._result = { index: 0 }; + } else { + event.vcards = vcards; + target + .chooseControl() + .set("choiceList", [ + "视为对" + get.translation(target2) + "使用任意一种【杀】或【决斗】", + "将所有手牌交给" + get.translation(player), + ]); } - else if(!target.countCards('h')){ - event.vcards=vcards; - event._result={index:0}; - } - else{ - event.vcards=vcards; - target.chooseControl().set('choiceList',[ - '视为对'+get.translation(target2)+'使用任意一种【杀】或【决斗】', - '将所有手牌交给'+get.translation(player), - ]); - } - 'step 4' - if(result.index==0){ - if(event.vcards.length==1) event._result={links:event.vcards,bool:true}; - else target.chooseButton(['请选择要对'+get.translation(event.target2)+'使用的牌',[event.vcards,'vcard']],true).set('ai',function(button){ - var player=_status.event.player; - return get.effect(_status.event.getParent().target2,{name:button.link[2],isCard:true,nature:button.link[3]},player,player); - }); - } - else{ - target.give(target.getCards('h'),player,'giveAuto'); + ("step 4"); + if (result.index == 0) { + if (event.vcards.length == 1) event._result = { links: event.vcards, bool: true }; + else + target + .chooseButton( + [ + "请选择要对" + get.translation(event.target2) + "使用的牌", + [event.vcards, "vcard"], + ], + true + ) + .set("ai", function (button) { + var player = _status.event.player; + return get.effect( + _status.event.getParent().target2, + { name: button.link[2], isCard: true, nature: button.link[3] }, + player, + player + ); + }); + } else { + target.give(target.getCards("h"), player, "giveAuto"); event.finish(); } - 'step 5' - if(result.bool) target.useCard({name:result.links[0][2],isCard:true,nature:result.links[0][3]},false,event.target2); + ("step 5"); + if (result.bool) + target.useCard( + { name: result.links[0][2], isCard: true, nature: result.links[0][3] }, + false, + event.target2 + ); }, - ai:{ - expose:0.17, - fireAttack:true, - skillTagFilter:function(player){ + ai: { + expose: 0.17, + fireAttack: true, + skillTagFilter: function (player) { return player.hasFriend(); }, }, }, - decadezongshi:{ - audio:2, - mod:{ - maxHandcard:function(player,num){ - return num+game.countGroup(); + decadezongshi: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + game.countGroup(); }, }, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - return player!=_status.currentPhase&&player.countCards('h')>=player.getHandcardLimit()&& - (get.type(event.card)=='delay'||get.color(event.card)=='none'); + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return ( + player != _status.currentPhase && + player.countCards("h") >= player.getHandcardLimit() && + (get.type(event.card) == "delay" || get.color(event.card) == "none") + ); }, - content:function(){ + content: function () { trigger.excluded.add(player); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(target!=_status.currentPhase&&target.countCards('h')>=target.getHandcardLimit()&& - (get.type(card)=='delay'||get.color(card)=='none')) return 'zerotarget'; + ai: { + effect: { + target: function (card, player, target) { + if ( + target != _status.currentPhase && + target.countCards("h") >= target.getHandcardLimit() && + (get.type(card) == "delay" || get.color(card) == "none") + ) + return "zerotarget"; }, }, }, }, - decadezishou:{ - audio:2, - inherit:'rezishou', - group:'decadezishou_zhiheng', - ai:{ - threaten:1.8, + decadezishou: { + audio: 2, + inherit: "rezishou", + group: "decadezishou_zhiheng", + ai: { + threaten: 1.8, }, }, - decadezishou_zhiheng:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0&&!player.getHistory('useCard',function(evt){ - return evt.targets.filter(function(target){ - return target!=player; - }).length>0; - }).length; + decadezishou_zhiheng: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + !player.getHistory("useCard", function (evt) { + return ( + evt.targets.filter(function (target) { + return target != player; + }).length > 0 + ); + }).length + ); }, - content:function(){ - 'step 0' - var list=[]; - var hs=player.getCards('h'); - for(var i of hs){ - list.add(get.suit(i,player)); + content: function () { + "step 0"; + var list = []; + var hs = player.getCards("h"); + for (var i of hs) { + list.add(get.suit(i, player)); } - player.chooseToDiscard('h',get.prompt('decadezishou'),'弃置任意张花色不同的手牌并摸等量的牌',[1,list.length],function(card,player){ - if(ui.selected.cards.length){ - var suit=get.suit(card,player); - for(var i of ui.selected.cards){ - if(get.suit(i,player)==suit) return false; + player + .chooseToDiscard( + "h", + get.prompt("decadezishou"), + "弃置任意张花色不同的手牌并摸等量的牌", + [1, list.length], + function (card, player) { + if (ui.selected.cards.length) { + var suit = get.suit(card, player); + for (var i of ui.selected.cards) { + if (get.suit(i, player) == suit) return false; + } + } + return true; } - } - return true; - }).set('ai',lib.skill.zhiheng.check).set('complexCard',true).logSkill='decadezishou'; - 'step 1' - if(result.bool){ + ) + .set("ai", lib.skill.zhiheng.check) + .set("complexCard", true).logSkill = "decadezishou"; + ("step 1"); + if (result.bool) { player.draw(result.cards.length); } }, }, - yongjin:{ - audio:2, - audioname:['xin_lingtong'], - unique:true, - limited:true, - skillAnimation:true, - animationColor:'wood', - enable:'phaseUse', - filter:function(event,player,cards){ - return game.hasPlayer(function(current){ - var es=current.getCards('e',function(card){ - return !cards||!cards.includes(card); + yongjin: { + audio: 2, + audioname: ["xin_lingtong"], + unique: true, + limited: true, + skillAnimation: true, + animationColor: "wood", + enable: "phaseUse", + filter: function (event, player, cards) { + return game.hasPlayer(function (current) { + var es = current.getCards("e", function (card) { + return !cards || !cards.includes(card); }); - for(var i=0;i0; + } else { + return ( + target.countCards("e", function (card) { + return !_status.event.cards.includes(card); + }) > 0 + ); } }); - next.set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - var sgnatt=get.sgn(att); - if(ui.selected.targets.length==0){ - if(target==player&&player.hasSkill('decadexuanfeng')){ - if(player.countCards('e',function(card){ - return !_status.event.cards.includes(card)&&game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card)&&get.effect(current,card,player,player)<0; - }); - })>0) return 18; + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var sgnatt = get.sgn(att); + if (ui.selected.targets.length == 0) { + if (target == player && player.hasSkill("decadexuanfeng")) { + if ( + player.countCards("e", function (card) { + return ( + !_status.event.cards.includes(card) && + game.hasPlayer(function (current) { + return ( + current != target && + current.canEquip(card) && + get.effect(current, card, player, player) < 0 + ); + }) + ); + }) > 0 + ) + return 18; return 7; - } - else if(att>0){ - if(target.countCards('e',function(card){ - return get.value(card,target)<0&&!_status.event.cards.includes(card)&&game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card)&&get.effect(current,card,player,player)<0; - }); - })>0) return 9; - } - else if(att<0){ - if(game.hasPlayer(function(current){ - if(current!=target&&get.attitude(player,current)>0){ - var es=target.getCards('e',function(card){ - return !_status.event.cards.includes(card); - }); - for(var i=0;i0&¤t.canEquip(card)&&get.effect(current,es[i],player,current)>0) return true; + } else if (att > 0) { + if ( + target.countCards("e", function (card) { + return ( + get.value(card, target) < 0 && + !_status.event.cards.includes(card) && + game.hasPlayer(function (current) { + return ( + current != target && + current.canEquip(card) && + get.effect(current, card, player, player) < 0 + ); + }) + ); + }) > 0 + ) + return 9; + } else if (att < 0) { + if ( + game.hasPlayer(function (current) { + if (current != target && get.attitude(player, current) > 0) { + var es = target.getCards("e", function (card) { + return !_status.event.cards.includes(card); + }); + for (var i = 0; i < es.length; i++) { + if ( + get.value(es[i], target) > 0 && + current.canEquip(card) && + get.effect(current, es[i], player, current) > 0 + ) + return true; + } } - } - })){ + }) + ) { return -att; } } return 0; } - var es=ui.selected.targets[0].getCards('e',function(card){ + var es = ui.selected.targets[0].getCards("e", function (card) { return !_status.event.cards.includes(card); }); var i; - var att2=get.sgn(get.attitude(player,ui.selected.targets[0])); - for(i=0;i0&&get.damageEffect(current,player,player)>0; + var att2 = get.sgn(get.attitude(player, ui.selected.targets[0])); + for (i = 0; i < es.length; i++) { + if (ui.selected.targets[0] == player && player.hasSkill("decadexuanfeng")) { + var bool = game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + current.countDiscardableCards(player, "he") > 0 && + get.damageEffect(current, player, player) > 0 + ); }); - if(bool&&player.countCards('e',function(card){ - return !_status.event.cards.includes(card)&&target.canEquip(card)&&get.effect(target,card,player,player)>0; - })) return 2.5*Math.abs(att); - else if(bool) return 1/Math.max(1,Math.abs(att)); - else return get.damageEffect(target,player,player); + if ( + bool && + player.countCards("e", function (card) { + return ( + !_status.event.cards.includes(card) && + target.canEquip(card) && + get.effect(target, card, player, player) > 0 + ); + }) + ) + return 2.5 * Math.abs(att); + else if (bool) return 1 / Math.max(1, Math.abs(att)); + else return get.damageEffect(target, player, player); } - if(sgnatt!=0&&att2!=0&&sgnatt!=att2&& - get.sgn(get.value(es[i],ui.selected.targets[0]))==-att2&& - get.sgn(get.effect(target,es[i],player,target))==sgnatt&& - target.canEquip(es[i])){ + if ( + sgnatt != 0 && + att2 != 0 && + sgnatt != att2 && + get.sgn(get.value(es[i], ui.selected.targets[0])) == -att2 && + get.sgn(get.effect(target, es[i], player, target)) == sgnatt && + target.canEquip(es[i]) + ) { return Math.abs(att); } } - if(i==es.length){ + if (i == es.length) { return 0; } - return -att*get.attitude(player,ui.selected.targets[0]); + return -att * get.attitude(player, ui.selected.targets[0]); }); - next.set('multitarget',true); - next.set('cards',cards); - next.set('targetprompt',['被移走','移动目标']); - next.set('prompt','移动场上的一张装备牌'); - 'step 2' - if(result.bool){ - player.line2(result.targets,'green'); - event.targets=result.targets; - } - else{ + next.set("multitarget", true); + next.set("cards", cards); + next.set("targetprompt", ["被移走", "移动目标"]); + next.set("prompt", "移动场上的一张装备牌"); + ("step 2"); + if (result.bool) { + player.line2(result.targets, "green"); + event.targets = result.targets; + } else { event.finish(); } - 'step 3' + ("step 3"); game.delay(); - 'step 4' - if(targets.length==2){ - player.choosePlayerCard('e',true,function(button){ - var player=_status.event.player; - var targets0=_status.event.targets0; - var targets1=_status.event.targets1; - if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ - if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; - return 0; - } - else{ - return get.value(button.link)*get.effect(targets1,button.link,player,player); - } - },targets[0]).set('nojudge',event.nojudge||false).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ - if(_status.event.cards.includes(button.link)) return false; - var targets1=_status.event.targets1; - return targets1.canEquip(button.link); - }).set('cards',cards); - } - else{ + ("step 4"); + if (targets.length == 2) { + player + .choosePlayerCard( + "e", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if ( + get.attitude(player, targets0) > 0 && + get.attitude(player, targets1) < 0 + ) { + if ( + get.value(button.link, targets0) < 0 && + get.effect(targets1, button.link, player, targets1) > 0 + ) + return 10; + return 0; + } else { + return ( + get.value(button.link) * + get.effect(targets1, button.link, player, player) + ); + } + }, + targets[0] + ) + .set("nojudge", event.nojudge || false) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + if (_status.event.cards.includes(button.link)) return false; + var targets1 = _status.event.targets1; + return targets1.canEquip(button.link); + }) + .set("cards", cards); + } else { event.finish(); } - 'step 5' - if(result.bool&&result.links.length){ - var link=result.links[0]; + ("step 5"); + if (result.bool && result.links.length) { + var link = result.links[0]; cards.add(link); event.targets[1].equip(link); - event.targets[0].$give(link,event.targets[1]) + event.targets[0].$give(link, event.targets[1]); game.delay(); - } - else event.finish(); - 'step 6' - if(event.count>0) event.goto(1); + } else event.finish(); + ("step 6"); + if (event.count > 0) event.goto(1); }, - ai:{ - order:7, - result:{ - player:function(player){ - var num=0; - var friends=game.filterPlayer(function(current){ - return get.attitude(player,current)>=4; + ai: { + order: 7, + result: { + player: function (player) { + var num = 0; + var friends = game.filterPlayer(function (current) { + return get.attitude(player, current) >= 4; }); - var vacancies={ - equip1:0, - equip2:0, - equip3:0, - equip4:0, - equip5:0 + var vacancies = { + equip1: 0, + equip2: 0, + equip3: 0, + equip4: 0, + equip5: 0, }; - for(var i=0;i0&&get.value(es[j])>0){ + for (var i = 0; i < sources.length; i++) { + var es = sources[i].getCards("e"); + for (var j = 0; j < es.length; j++) { + var type = get.subtype(es[j]); + if ( + sources[i] == player || + (vacancies[type] > 0 && get.value(es[j]) > 0) + ) { num++; - if(sources[i]==player&&vacancies[type]&&game.hasPlayer(function(current){ - return get.attitude(player,current)<0&¤t.countDiscardableCards(player,'he')>0&&get.damageEffect(current,player,player)>0; - })) num+=0.5; - if(num>=3){ + if ( + sources[i] == player && + vacancies[type] && + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + current.countDiscardableCards(player, "he") > 0 && + get.damageEffect(current, player, player) > 0 + ); + }) + ) + num += 0.5; + if (num >= 3) { return 1; } vacancies[type]--; } } } - if(num&&player.hp==1){ + if (num && player.hp == 1) { return 0.5; } return 0; - } - } - } + }, + }, + }, }, - decadexuanfeng:{ - audio:'xuanfeng', - audioname:['boss_lvbu3','re_heqi','xin_lingtong'], - trigger:{ - player:['loseAfter','phaseDiscardEnd'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + decadexuanfeng: { + audio: "xuanfeng", + audioname: ["boss_lvbu3", "re_heqi", "xin_lingtong"], + trigger: { + player: ["loseAfter", "phaseDiscardEnd"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - if(_status.dying.length) return false; - if(event.name=='phaseDiscard'){ - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt&&evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.hs) cards.addArray(evt.hs); + direct: true, + filter: function (event, player) { + if (_status.dying.length) return false; + if (event.name == "phaseDiscard") { + var cards = []; + player.getHistory("lose", function (evt) { + if ( + evt && + evt.type == "discard" && + evt.getParent("phaseDiscard") == event && + evt.hs + ) + cards.addArray(evt.hs); }); - return cards.length>1; - } - else{ - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; + return cards.length > 1; + } else { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; } }, - content:function(){ - "step 0" - event.count=2; - event.targets=[]; - event.logged=false; - "step 1" + content: function () { + "step 0"; + event.count = 2; + event.targets = []; + event.logged = false; + ("step 1"); event.count--; - player.chooseTarget(get.prompt('decadexuanfeng'),'弃置一名其他角色的一张牌',function(card,player,target){ - if(player==target) return false; - return target.countDiscardableCards(player,'he'); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - "step 2" - if(result.bool){ - if(!event.logged){ - player.logSkill('decadexuanfeng',result.targets); - event.logged=true; - } - else player.line(result.targets[0],'green'); - targets.add(result.targets[0]); - player.discardPlayerCard(result.targets[0],'he',true); - } - else if(!targets.length) event.finish(); - "step 3" - if(event.count) event.goto(1); - else if(player==_status.currentPhase){ - player.chooseTarget('是否对一名目标角色造成1点伤害',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('targets',targets).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); + player + .chooseTarget( + get.prompt("decadexuanfeng"), + "弃置一名其他角色的一张牌", + function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); }); - } - else event.finish(); - "step 4" - if(result.bool){ - player.line(result.targets[0],'thunder'); + ("step 2"); + if (result.bool) { + if (!event.logged) { + player.logSkill("decadexuanfeng", result.targets); + event.logged = true; + } else player.line(result.targets[0], "green"); + targets.add(result.targets[0]); + player.discardPlayerCard(result.targets[0], "he", true); + } else if (!targets.length) event.finish(); + ("step 3"); + if (event.count) event.goto(1); + else if (player == _status.currentPhase) { + player + .chooseTarget("是否对一名目标角色造成1点伤害", function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("targets", targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + } else event.finish(); + ("step 4"); + if (result.bool) { + player.line(result.targets[0], "thunder"); result.targets[0].damage(); } }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(player==target&&get.type(card)=='equip'&&player.countCards('hes',function(cardx){ - return card!=cardx&&(!card.cards||!card.cards.includes(cardx))&&(player.hasSkill('yongjin')||get.subtype(card)==get.subtype(cardx))&&(get.position(cardx)=='e'||player.canUse(cardx,player)); - })>0) return; - if(!game.hasPlayer(function(current){ - return get.attitude(player,current)<0&¤t.countDiscardableCards(player,'he')>0&&get.damageEffect(current,player,player)>0; - })) return; - if(typeof card=='object'&&player.isPhaseUsing()&& - player.needsToDiscard()==2&&card.cards&&card.cards.filter(function(i){ - return get.position(i)=='h'; - }).length>0&&!get.tag(card,'draw')&&!get.tag(card,'gain')&&!(get.tag(card,'discard')&&target==player&&player.countCards('e')>0)) return 'zeroplayertarget'; + ai: { + effect: { + player_use: function (card, player, target) { + if ( + player == target && + get.type(card) == "equip" && + player.countCards("hes", function (cardx) { + return ( + card != cardx && + (!card.cards || !card.cards.includes(cardx)) && + (player.hasSkill("yongjin") || + get.subtype(card) == get.subtype(cardx)) && + (get.position(cardx) == "e" || player.canUse(cardx, player)) + ); + }) > 0 + ) + return; + if ( + !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + current.countDiscardableCards(player, "he") > 0 && + get.damageEffect(current, player, player) > 0 + ); + }) + ) + return; + if ( + typeof card == "object" && + player.isPhaseUsing() && + player.needsToDiscard() == 2 && + card.cards && + card.cards.filter(function (i) { + return get.position(i) == "h"; + }).length > 0 && + !get.tag(card, "draw") && + !get.tag(card, "gain") && + !(get.tag(card, "discard") && target == player && player.countCards("e") > 0) + ) + return "zeroplayertarget"; }, - target:function(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; - if(get.tag(card,'damage')&&target.hp>2){ - var num1=target.countCards('h'),num2=target.getHandcardLimit(); - if(num1>num2) return [1,1]; - if(num1==num2) return [1.1,_status.event.player==target?3:0.5]; - if(num1==num2-1) return [0.1,_status.event.player==target?4.5:0.1]; + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + if (get.tag(card, "damage") && target.hp > 2) { + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + if (num1 > num2) return [1, 1]; + if (num1 == num2) return [1.1, _status.event.player == target ? 3 : 0.5]; + if (num1 == num2 - 1) + return [0.1, _status.event.player == target ? 4.5 : 0.1]; } - if(typeof card=='object'&&(card.name=='shunshou'||card.name=='guohe'||card.name=='zhujinqiyuan')&&target.countCards('h')>0&&get.attitude(player,target)<0) return [1,-1]; - } + if ( + typeof card == "object" && + (card.name == "shunshou" || + card.name == "guohe" || + card.name == "zhujinqiyuan") && + target.countCards("h") > 0 && + get.attitude(player, target) < 0 + ) + return [1, -1]; + }, }, - reverseEquip:true, - noe:true, - expose:0.2, - } + reverseEquip: true, + noe: true, + expose: 0.2, + }, }, - oltuntian:{ - inherit:'tuntian', - filter:function(event,player){ - if(player==_status.currentPhase){ - if(event.type!='discard') return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.filter(function(i){ - return get.name(i,evt.hs.includes(i)?player:false)=='sha'; - }).length>0; + oltuntian: { + inherit: "tuntian", + filter: function (event, player) { + if (player == _status.currentPhase) { + if (event.type != "discard") return false; + var evt = event.getl(player); + return ( + evt && + evt.cards2 && + evt.cards2.filter(function (i) { + return get.name(i, evt.hs.includes(i) ? player : false) == "sha"; + }).length > 0 + ); } - if(event.name=='gain'&&event.player==player) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; }, }, - olzaoxian:{ - inherit:'zaoxian', - content:function(){ - player.awakenSkill('olzaoxian'); + olzaoxian: { + inherit: "zaoxian", + content: function () { + player.awakenSkill("olzaoxian"); player.loseMaxHp(); - player.addSkills('jixi'); + player.addSkills("jixi"); player.insertPhase(); - } + }, }, - rejunxing:{ - enable:'phaseUse', - audio:2, - usable:1, - filterCard:true, - selectCard:[1,Infinity], - filter:function(event,player){ - return player.countCards('h')>0; + rejunxing: { + enable: "phaseUse", + audio: 2, + usable: 1, + filterCard: true, + selectCard: [1, Infinity], + filter: function (event, player) { + return player.countCards("h") > 0; }, - check:function(card){ - if(ui.selected.cards.length) return -1; - return 6-get.value(card); + check: function (card) { + if (ui.selected.cards.length) return -1; + return 6 - get.value(card); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - content:function(){ - "step 0" - target.chooseToDiscard(cards.length,'弃置'+get.cnNumber(cards.length)+'张牌并失去1点体力,或点取消将武将牌翻面并摸'+get.cnNumber(cards.length)+'张牌','he').set('ai',function(card){ - if(cards.length>3||target.hasSkillTag('noturn')||target.isTurnedOver()||(get.name(card)=='tao'||get.name(card)=='jiu')&&lib.filter.cardSavable(card,target,target)) return -1; - if(target.hp<=1){ - if(cards.length{ - return (get.name(cardx)=='tao'||get.name(cardx)=='jiu')&&lib.filter.cardSavable(cardx,target,target); - },'hs')) return 7-get.value(card); - return -1; - } - return 24-5*cards.length-2*Math.min(4,target.hp)-get.value(card); - }); - "step 1" - if(!result.bool){ + content: function () { + "step 0"; + target + .chooseToDiscard( + cards.length, + "弃置" + + get.cnNumber(cards.length) + + "张牌并失去1点体力,或点取消将武将牌翻面并摸" + + get.cnNumber(cards.length) + + "张牌", + "he" + ) + .set("ai", function (card) { + if ( + cards.length > 3 || + target.hasSkillTag("noturn") || + target.isTurnedOver() || + ((get.name(card) == "tao" || get.name(card) == "jiu") && + lib.filter.cardSavable(card, target, target)) + ) + return -1; + if (target.hp <= 1) { + if ( + cards.length < target.getEnemies().length && + target.hasCard((cardx) => { + return ( + (get.name(cardx) == "tao" || get.name(cardx) == "jiu") && + lib.filter.cardSavable(cardx, target, target) + ); + }, "hs") + ) + return 7 - get.value(card); + return -1; + } + return 24 - 5 * cards.length - 2 * Math.min(4, target.hp) - get.value(card); + }); + ("step 1"); + if (!result.bool) { target.turnOver(); target.draw(cards.length); - } - else target.loseHp(); + } else target.loseHp(); + }, + ai: { + order: 2, + threaten: 1.8, + result: { + target: function (player, target) { + if (target.hasSkillTag("noturn")) return 0; + if (target.isTurnedOver()) return 2; + return -1 / (target.countCards("h") + 1); + }, + }, }, - ai:{ - order:2, - threaten:1.8, - result:{ - target:function(player,target){ - if(target.hasSkillTag('noturn')) return 0; - if(target.isTurnedOver()) return 2; - return -1/(target.countCards('h')+1); - } - } - } }, - rejuece:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.getHistory('lose',function(evt){ - return evt.cards2&&evt.cards2.length>0; - }).length>0; + rejuece: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && + current.getHistory("lose", function (evt) { + return evt.cards2 && evt.cards2.length > 0; + }).length > 0 + ); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('rejuece'),'对一名本回合失去过牌的其他角色造成1点伤害',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('targets',game.filterPlayer(function(current){ - return current!=player&¤t.getHistory('lose',function(evt){ - return evt.cards2&&evt.cards2.length>0; - }).length>0; - })).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('rejuece',target); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("rejuece"), + "对一名本回合失去过牌的其他角色造成1点伤害", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set( + "targets", + game.filterPlayer(function (current) { + return ( + current != player && + current.getHistory("lose", function (evt) { + return evt.cards2 && evt.cards2.length > 0; + }).length > 0 + ); + }) + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("rejuece", target); target.damage(); } }, }, - remieji:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h',{type:['trick','delay'],color:'black'}); + remieji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", { type: ["trick", "delay"], color: "black" }); }, - filterCard:function(card){ - return get.color(card)=='black'&&get.type(card,'trick')=='trick'; + filterCard: function (card) { + return get.color(card) == "black" && get.type(card, "trick") == "trick"; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; }, - discard:false, - delay:false, - loseTo:'cardPile', - insert:true, - visible:true, - check:function(card){ - return 8-get.value(card); + discard: false, + delay: false, + loseTo: "cardPile", + insert: true, + visible: true, + check: function (card) { + return 8 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showCards(cards); - 'step 1' - if(!target.countCards('he',function(card){ - if(get.type2(card)=='trick') return true; - return lib.filter.cardDiscardable(card,target,'remieji'); - })) event.finish(); - else target.chooseCard('he',true,function(card,player){ - if(get.type2(card)=='trick') return true; - return lib.filter.cardDiscardable(card,player,'remieji'); - }).set('prompt','选择交给'+get.translation(player)+'一张锦囊牌,或依次弃置两张非锦囊牌。'); - 'step 2' - if(result.cards&&result.cards.length){ - if(get.type2(result.cards[0])=='trick'){ - target.give(result.cards,player); + ("step 1"); + if ( + !target.countCards("he", function (card) { + if (get.type2(card) == "trick") return true; + return lib.filter.cardDiscardable(card, target, "remieji"); + }) + ) + event.finish(); + else + target + .chooseCard("he", true, function (card, player) { + if (get.type2(card) == "trick") return true; + return lib.filter.cardDiscardable(card, player, "remieji"); + }) + .set( + "prompt", + "选择交给" + get.translation(player) + "一张锦囊牌,或依次弃置两张非锦囊牌。" + ); + ("step 2"); + if (result.cards && result.cards.length) { + if (get.type2(result.cards[0]) == "trick") { + target.give(result.cards, player); event.finish(); - } - else target.discard(result.cards); - } - else event.finish(); - 'step 3' - if(target.countCards('he',function(card){ - return get.type2(card)!='trick'; - })) target.chooseToDiscard('he',true,function(card){ - return get.type2(card)!='trick'; - }); + } else target.discard(result.cards); + } else event.finish(); + ("step 3"); + if ( + target.countCards("he", function (card) { + return get.type2(card) != "trick"; + }) + ) + target.chooseToDiscard("he", true, function (card) { + return get.type2(card) != "trick"; + }); + }, + ai: { + order: 9, + result: { + target: -1, + }, }, - ai:{ - order:9, - result:{ - target:-1 - } - } }, - decadelihuo:{ - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; + decadelihuo: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; return false; }, - audio:'lihuo', - prompt2:function(event){ - return '将'+get.translation(event.card)+'改为火属性'; + audio: "lihuo", + prompt2: function (event) { + return "将" + get.translation(event.card) + "改为火属性"; }, - audioname:['re_chengpu'], - check:function(event,player){ - return event.baseDamage>1&&game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current) - &&get.attitude(player,current)<0&&!current.hasShan() - &&get.effect(current,{name:'sha',nature:'fire'},player,player)>0; - }); + audioname: ["re_chengpu"], + check: function (event, player) { + return ( + event.baseDamage > 1 && + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + player.canUse(event.card, current) && + get.attitude(player, current) < 0 && + !current.hasShan() && + get.effect(current, { name: "sha", nature: "fire" }, player, player) > 0 + ); + }) + ); }, - content:function(){ - game.setNature(trigger.card,'fire'); + content: function () { + game.setNature(trigger.card, "fire"); }, - group:['decadelihuo2','decadelihuo3'], - ai:{ - fireAttack:true, + group: ["decadelihuo2", "decadelihuo3"], + ai: { + fireAttack: true, }, }, - decadelihuo2:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current); + decadelihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('decadelihuo'),'为'+get.translation(trigger.card)+'增加一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('card',trigger.card).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!_status.connectMode) game.delayx(); - event.target=result.targets[0]; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("decadelihuo"), + "为" + get.translation(trigger.card) + "增加一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { event.finish(); } - 'step 2' - player.logSkill('decadelihuo',event.target); + ("step 2"); + player.logSkill("decadelihuo", event.target); trigger.targets.push(event.target); }, }, - decadelihuo3:{ - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.card.name=='sha'&&game.hasNature(event.card,'fire')&&event.targets.length>1&&player.getHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }).length>0; + decadelihuo3: { + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasNature(event.card, "fire") && + event.targets.length > 1 && + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length > 0 + ); }, - forced:true, - audio:'lihuo', - audioname:['re_chengpu'], - content:function(){ + forced: true, + audio: "lihuo", + audioname: ["re_chengpu"], + content: function () { player.loseHp(); - } + }, }, - decadechunlao:{ - audio:'chunlao', - audioname:['re_chengpu'], - enable:'chooseToUse', - viewAs:{name:'jiu',isCard:true}, - viewAsFilter:function(player){ + decadechunlao: { + audio: "chunlao", + audioname: ["re_chengpu"], + enable: "chooseToUse", + viewAs: { name: "jiu", isCard: true }, + viewAsFilter: function (player) { return !player.isLinked(); }, - filter:function(event,player){ + filter: function (event, player) { return !player.isLinked(); }, - filterCard:function(){return false}, - selectCard:-1, - precontent:function(){ - player.logSkill('decadechunlao'); + filterCard: function () { + return false; + }, + selectCard: -1, + precontent: function () { + player.logSkill("decadechunlao"); player.link(); delete event.result.skill; }, - group:['decadechunlao2','decadechunlaox'], - ai:{ - jiuOther:true, + group: ["decadechunlao2", "decadechunlaox"], + ai: { + jiuOther: true, }, }, - decadechunlaox:{ - trigger:{player:'damageBegin2'}, - silent:true, - lastDo:true, - filter:function(event,player){ + decadechunlaox: { + trigger: { player: "damageBegin2" }, + silent: true, + lastDo: true, + filter: function (event, player) { return !player.isLinked(); }, - content:function(){ - trigger.decadechunlaox=true; + content: function () { + trigger.decadechunlaox = true; }, }, - decadechunlao2:{ - trigger:{ - source:'damageSource', - player:'damageEnd', + decadechunlao2: { + trigger: { + source: "damageSource", + player: "damageEnd", }, - prompt:'是否发动【醇醪】将武将牌重置?', - filter:function(event,player){ - return player.isLinked()&&event.num>1&&!event.decadechunlaox; + prompt: "是否发动【醇醪】将武将牌重置?", + filter: function (event, player) { + return player.isLinked() && event.num > 1 && !event.decadechunlaox; }, - content:function(){ + content: function () { player.link(); }, }, - oltianxiang:{ - audio:'tianxiang', - audioname:['daxiaoqiao','re_xiaoqiao','ol_xiaoqiao'], - trigger:{player:'damageBegin4'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.suit(card,player)=='heart'; - })>0&&event.num>0; + oltianxiang: { + audio: "tianxiang", + audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], + trigger: { player: "damageBegin4" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.suit(card, player) == "heart"; + }) > 0 && event.num > 0 + ); }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:function(card,player){ - return get.suit(card)=='heart'&&lib.filter.cardDiscardable(card,player); + filterCard: function (card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - position:'he', - ai1:function(card){ - return 10-get.value(card); + position: "he", + ai1: function (card) { + return 10 - get.value(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - var trigger=_status.event.getTrigger(); - var da=0; - if(_status.event.player.hp==1){ - da=10; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; } - var eff=get.damageEffect(target,trigger.source,target); - if(att==0) return 0.1+da; - if(eff>=0&&att>0){ - return att+da; + var eff = get.damageEffect(target, trigger.source, target); + if (att == 0) return 0.1 + da; + if (eff >= 0 && att > 0) { + return att + da; } - if(att>0&&target.hp>1){ - if(target.maxHp-target.hp>=3) return att*1.1+da; - if(target.maxHp-target.hp>=2) return att*0.9+da; + if (att > 0 && target.hp > 1) { + if (target.maxHp - target.hp >= 3) return att * 1.1 + da; + if (target.maxHp - target.hp >= 2) return att * 0.9 + da; } - return -att+da; + return -att + da; }, - prompt:get.prompt('oltianxiang'), - prompt2:lib.translate.oltianxiang_info + prompt: get.prompt("oltianxiang"), + prompt2: lib.translate.oltianxiang_info, }); - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.discard(result.cards); - var target=result.targets[0]; - player.chooseControlList(true,function(event,player){ - var target=_status.event.target; - var att=get.attitude(player,target); - if(target.hasSkillTag('maihp')) att=-att; - if(att>0){ - return 0; - } - else{ - return 1; - } - }, - ['令'+get.translation(target)+'受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)', - '令'+get.translation(target)+'失去1点体力,然后获得'+get.translation(result.cards)]).set('target',target); - player.logSkill(event.name,target); + var target = result.targets[0]; + player + .chooseControlList( + true, + function (event, player) { + var target = _status.event.target; + var att = get.attitude(player, target); + if (target.hasSkillTag("maihp")) att = -att; + if (att > 0) { + return 0; + } else { + return 1; + } + }, + [ + "令" + + get.translation(target) + + "受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)", + "令" + + get.translation(target) + + "失去1点体力,然后获得" + + get.translation(result.cards), + ] + ) + .set("target", target); + player.logSkill(event.name, target); trigger.cancel(); - event.target=target; - event.card=result.cards[0]; - } - else{ + event.target = target; + event.card = result.cards[0]; + } else { event.finish(); } - "step 2" - if(typeof result.index=='number'){ - event.index=result.index; - if(result.index){ - event.related=event.target.loseHp(); + ("step 2"); + if (typeof result.index == "number") { + event.index = result.index; + if (result.index) { + event.related = event.target.loseHp(); + } else { + event.related = event.target.damage(trigger.source || "nosource", "nocard"); } - else{ - event.related=event.target.damage(trigger.source||'nosource','nocard'); - } - } - else event.finish(); - "step 3" - if(event.related.cancelled||target.isDead()) return; - if(event.index&&card.isInPile()) target.gain(card,'gain2'); - else if(target.getDamagedHp()) target.draw(Math.min(5,target.getDamagedHp())); + } else event.finish(); + ("step 3"); + if (event.related.cancelled || target.isDead()) return; + if (event.index && card.isInPile()) target.gain(card, "gain2"); + else if (target.getDamagedHp()) target.draw(Math.min(5, target.getDamagedHp())); }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(get.tag(card,'damage')&&target.countCards('he')>1) return 0.7; - } - }, - } - }, - olhongyan:{ - audio:'rehongyan', - mod:{ - suit:function(card,suit){ - if(suit=='spade') return 'heart'; - }, - maxHandcardBase:function(player,num){ - if(player.countCards('e',function(card){ - return get.suit(card,player)=='heart'; - })) return player.maxHp; + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; + }, }, }, }, - piaoling:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - content:function(){ - 'step 0' - player.judge(function(card){ - return get.suit(card)=='heart'?2:0; - }).judge2=function(result){ - return result.bool?true:false; + olhongyan: { + audio: "rehongyan", + mod: { + suit: function (card, suit) { + if (suit == "spade") return "heart"; + }, + maxHandcardBase: function (player, num) { + if ( + player.countCards("e", function (card) { + return get.suit(card, player) == "heart"; + }) + ) + return player.maxHp; + }, + }, + }, + piaoling: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + player.judge(function (card) { + return get.suit(card) == "heart" ? 2 : 0; + }).judge2 = function (result) { + return result.bool ? true : false; }; - 'step 1' - event.card=result.card; - if(result.bool&&get.position(event.card,true)=='d'){ - player.chooseTarget('令一名角色获得'+get.translation(event.card)+',或点【取消】将其置于牌堆顶').set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(player==target) att/=2; - return att; - }); - } - else event.finish(); - 'step 2' - if(result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(card,'gain2','log'); - if(player==target) player.chooseToDiscard('he',true); - } - else{ + ("step 1"); + event.card = result.card; + if (result.bool && get.position(event.card, true) == "d") { + player + .chooseTarget( + "令一名角色获得" + + get.translation(event.card) + + ",或点【取消】将其置于牌堆顶" + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (player == target) att /= 2; + return att; + }); + } else event.finish(); + ("step 2"); + if (result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(card, "gain2", "log"); + if (player == target) player.chooseToDiscard("he", true); + } else { card.fix(); - ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); game.updateRoundNumber(); } }, }, - xinyicong:{ - mod:{ - globalFrom:function(from,to,current){ - return current-Math.max(0,from.hp-1); + xinyicong: { + mod: { + globalFrom: function (from, to, current) { + return current - Math.max(0, from.hp - 1); }, - globalTo:function(from,to,current){ - return current+Math.max(0,to.getDamagedHp()-1); + globalTo: function (from, to, current) { + return current + Math.max(0, to.getDamagedHp() - 1); }, }, - ai:{ - threaten:0.8 - } - }, - rezongshi:{ - audio:2, - mod:{ - maxHandcard:function(player,num){ - return num+game.countGroup(); - }, - }, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.countCards('h')>player.hp; - }, - content:function(){ - player.addTempSkill('rezongshi_paoxiao'); + ai: { + threaten: 0.8, }, }, - rezongshi_paoxiao:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return Infinity; + rezongshi: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + game.countGroup(); + }, + }, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.countCards("h") > player.hp; + }, + content: function () { + player.addTempSkill("rezongshi_paoxiao"); + }, + }, + rezongshi_paoxiao: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return Infinity; }, }, }, - olbaonue:{ - audio:2, - unique:true, - zhuSkill:true, - trigger:{global:'damageSource'}, - filter:function(event,player){ - if(player==event.source||!event.source||event.source.group!='qun') return false; - return player.hasZhuSkill('olbaonue',event.source); + olbaonue: { + audio: 2, + unique: true, + zhuSkill: true, + trigger: { global: "damageSource" }, + filter: function (event, player) { + if (player == event.source || !event.source || event.source.group != "qun") return false; + return player.hasZhuSkill("olbaonue", event.source); }, - direct:true, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - player.chooseBool('是否发动【暴虐】?').set('choice',get.attitude(player,player)>0); - 'step 2' - if(result.bool){ - player.logSkill('olbaonue',trigger.source); - player.judge(function(card){ - if(get.suit(card)=='spade') return 4; - return 0; - }).set('callback',function(){ - if(event.judgeResult.suit=='spade'){ - player.recover(); - if(get.position(event.judgeResult.card,true)=='o') player.gain(event.judgeResult.card,'gain2','log') - } - }).judge2=function(result){ - return result.bool?true:false; + player.chooseBool("是否发动【暴虐】?").set("choice", get.attitude(player, player) > 0); + ("step 2"); + if (result.bool) { + player.logSkill("olbaonue", trigger.source); + player + .judge(function (card) { + if (get.suit(card) == "spade") return 4; + return 0; + }) + .set("callback", function () { + if (event.judgeResult.suit == "spade") { + player.recover(); + if (get.position(event.judgeResult.card, true) == "o") + player.gain(event.judgeResult.card, "gain2", "log"); + } + }).judge2 = function (result) { + return result.bool ? true : false; }; - } - else{ + } else { event.finish(); } - 'step 3' - if(event.count&&lib.skill.olbaonue.filter(trigger,player)) event.goto(1); - } - }, - rezishou:{ - audio:'zishou', - audioname:['re_liubiao'], - trigger:{player:'phaseDrawBegin2'}, - check:function(event,player){ - return player.countCards('h')<=(player.hasSkill('zongshi')?player.maxHp:(player.hp-2))||player.skipList.includes('phaseUse')||!player.countCards('h',function(card){ - return get.tag(card,'damage')&&player.hasUseTarget(card); - }); + ("step 3"); + if (event.count && lib.skill.olbaonue.filter(trigger, player)) event.goto(1); }, - filter:function(event,player){ + }, + rezishou: { + audio: "zishou", + audioname: ["re_liubiao"], + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + return ( + player.countCards("h") <= + (player.hasSkill("zongshi") ? player.maxHp : player.hp - 2) || + player.skipList.includes("phaseUse") || + !player.countCards("h", function (card) { + return get.tag(card, "damage") && player.hasUseTarget(card); + }) + ); + }, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=game.countGroup(); - player.addTempSkill('rezishou2'); + content: function () { + trigger.num += game.countGroup(); + player.addTempSkill("rezishou2"); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5 - } }, - rezishou2:{ - audio:'rezishou', - trigger:{ - source:'damageBegin2', + rezishou2: { + audio: "rezishou", + trigger: { + source: "damageBegin2", //player:'phaseJieshuBegin', }, - forced:true, - filter:function(event,player){ - if(event.name=='damage') return event.player!=player; - if(player.getHistory('skipped').includes('phaseUse')) return false; - return player.getHistory('useCard',function(evt){ - if(evt.targets&&evt.targets.length&&evt.isPhaseUsing()){ - var targets=evt.targets.slice(0); - while(targets.includes(player)) targets.remove(player); - return targets.length>0; - } - return false; - }).length==0; + forced: true, + filter: function (event, player) { + if (event.name == "damage") return event.player != player; + if (player.getHistory("skipped").includes("phaseUse")) return false; + return ( + player.getHistory("useCard", function (evt) { + if (evt.targets && evt.targets.length && evt.isPhaseUsing()) { + var targets = evt.targets.slice(0); + while (targets.includes(player)) targets.remove(player); + return targets.length > 0; + } + return false; + }).length == 0 + ); }, - popup:false, - content:function(){ - 'step 0' - if(trigger.name=='damage'){ - player.logSkill('rezishou',trigger.player); + popup: false, + content: function () { + "step 0"; + if (trigger.name == "damage") { + player.logSkill("rezishou", trigger.player); trigger.cancel(); event.finish(); return; - } - else{ - var filterTarget=function(card,player,target){ - return target!=player&&target.countCards('e',function(card){ - return player.canEquip(card); - }); - } - if(game.hasPlayer(function(current){ - return filterTarget(null,player,current) - })) player.chooseTarget(filterTarget,'是否将一名其他角色装备区内的一张牌移动到自己的装备区?').set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0&&!target.hasSkillTag('noe')) return 0; - var num=0; - target.countCards('e',function(card){ - if(player.canEquip(card)){ - var eff=get.effect(player,card,player,player); - if(eff>num) num=eff; - } - }); - if(num<=0) return 0; - if(att<0) return num*-att; - return 1/num; - }); + } else { + var filterTarget = function (card, player, target) { + return ( + target != player && + target.countCards("e", function (card) { + return player.canEquip(card); + }) + ); + }; + if ( + game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) + player + .chooseTarget( + filterTarget, + "是否将一名其他角色装备区内的一张牌移动到自己的装备区?" + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0 && !target.hasSkillTag("noe")) return 0; + var num = 0; + target.countCards("e", function (card) { + if (player.canEquip(card)) { + var eff = get.effect(player, card, player, player); + if (eff > num) num = eff; + } + }); + if (num <= 0) return 0; + if (att < 0) return num * -att; + return 1 / num; + }); else event.finish(); } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('rezishou',target); - player.choosePlayerCard(target,'e','将一张装备牌移至你的装备区').set('filterButton',function(button){ - return _status.event.player.canEquip(button.link); - }); - } - else event.finish(); - "step 2" - if(result&&result.links&&result.links.length){ + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rezishou", target); + player + .choosePlayerCard(target, "e", "将一张装备牌移至你的装备区") + .set("filterButton", function (button) { + return _status.event.player.canEquip(button.link); + }); + } else event.finish(); + ("step 2"); + if (result && result.links && result.links.length) { game.delay(2); - target.$give(result.links[0],player,false); + target.$give(result.links[0], player, false); player.equip(result.links[0]); player.addExpose(0.2); } }, - ai:{ - effect:{ - player:function(card,player,target){ - if(get.tag(card,'damage')) return 'zeroplayertarget'; + ai: { + effect: { + player: function (card, player, target) { + if (get.tag(card, "damage")) return "zeroplayertarget"; }, }, }, }, - decadepojun:{ - shaRelated:true, - audio:2, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.hp>0&&event.target.countCards('he')>0; + decadepojun: { + shaRelated: true, + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - var next=player.choosePlayerCard(trigger.target,'he',[1,Math.min(trigger.target.hp,trigger.target.countCards('he'))],get.prompt('decadepojun',trigger.target)); - next.set('ai',function(button){ - if(!_status.event.goon) return 0; - var val=get.value(button.link); - if(button.link==_status.event.target.getEquip(2)) return 2*(val+3); + content: function () { + "step 0"; + var next = player.choosePlayerCard( + trigger.target, + "he", + [1, Math.min(trigger.target.hp, trigger.target.countCards("he"))], + get.prompt("decadepojun", trigger.target) + ); + next.set("ai", function (button) { + if (!_status.event.goon) return 0; + var val = get.value(button.link); + if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3); return val; }); - next.set('goon',get.attitude(player,trigger.target)<=0); - next.set('forceAuto',true); - 'step 1' - if(result.bool){ - event.cards=result.cards; - var target=trigger.target; - player.logSkill('decadepojun',trigger.target); - target.addSkill('decadepojun2'); - target.addToExpansion(result.cards,'giveAuto',target).gaintag.add('decadepojun2'); + next.set("goon", get.attitude(player, trigger.target) <= 0); + next.set("forceAuto", true); + ("step 1"); + if (result.bool) { + event.cards = result.cards; + var target = trigger.target; + player.logSkill("decadepojun", trigger.target); + target.addSkill("decadepojun2"); + target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("decadepojun2"); + } else event.finish(); + ("step 2"); + var discard = false, + draw = false; + for (var i of cards) { + var type = get.type2(i); + if (type == "equip") discard = true; + if (type == "trick") draw = true; } - else event.finish(); - 'step 2' - var discard=false,draw=false; - for(var i of cards){ - var type=get.type2(i); - if(type=='equip') discard=true; - if(type=='trick') draw=true; + if (discard) { + event.equip = true; + player + .chooseButton( + [ + "选择一张牌置入弃牌堆", + cards.filter(function (card) { + return get.type(card) == "equip"; + }), + ], + true + ) + .set("ai", function (button) { + return get.value(button.link, _status.event.getTrigger().target); + }); } - if(discard){ - event.equip=true; - player.chooseButton(['选择一张牌置入弃牌堆',cards.filter(function(card){ - return get.type(card)=='equip'; - })],true).set('ai',function(button){ - return get.value(button.link,_status.event.getTrigger().target); - }); - } - if(draw) event.draw=true; - 'step 3' - if(event.equip&&result.links&&result.links.length){ + if (draw) event.draw = true; + ("step 3"); + if (event.equip && result.links && result.links.length) { trigger.target.loseToDiscardpile(result.links); } - if(event.draw) player.draw(); + if (event.draw) player.draw(); }, - ai:{ - unequip_ai:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(get.attitude(player,arg.target)>0) return false; - if(tag=='directHit_ai') return arg.target.hp>=Math.max(1,arg.target.countCards('h')-1); - if(arg&&arg.name=='sha'&&arg.target.getEquip(2)) return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0) return false; + if (tag == "directHit_ai") + return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; return false; - } - }, - }, - decadepojun2:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return player.getExpansions('decadepojun2').length>0; - }, - content:function(){ - 'step 0' - var cards=player.getExpansions('decadepojun2'); - player.gain(cards,'draw'); - game.log(player,'收回了'+get.cnNumber(cards.length)+'张“破军”牌'); - 'step 1' - player.removeSkill('decadepojun2'); - }, - intro:{ - markcount:'expansion', - mark:function(dialog,storage,player){ - var cards=player.getExpansions('decadepojun2'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; }, }, }, - hanzhan:{ - audio:2, - trigger:{ - global:'chooseToCompareBegin', + decadepojun2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("decadepojun2").length > 0; }, - filter:function(event,player){ - if(player==event.player) return true; - if(event.targets) return event.targets.includes(player); - return player==event.target; + content: function () { + "step 0"; + var cards = player.getExpansions("decadepojun2"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌"); + ("step 1"); + player.removeSkill("decadepojun2"); }, - logTarget:function(event,player){ - if(player!=event.player) return event.player; - return event.targets||event.target; + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("decadepojun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, }, - prompt2:function(event,player){ - return '令其改为使用随机的手牌进行拼点' - }, - check:function(trigger,player){ - var num=0; - var targets=player==trigger.player?(trigger.targets?trigger.targets.slice(0):[trigger.target]):[trigger.player]; - while(targets.length){ - var target=targets.shift(); - if(target.getCards('h').length>1) num-=get.attitude(player,target); - } - return num>0; - }, - content:function(){ - var targets=player==trigger.player?(trigger.targets?trigger.targets.slice(0):[trigger.target]):[trigger.player]; - if(!trigger.fixedResult) trigger.fixedResult={}; - while(targets.length){ - var target=targets.shift(); - var hs=target.getCards('h'); - if(hs.length) trigger.fixedResult[target.playerid]=hs.randomGet(); - } - }, - group:'hanzhan_gain', - subfrequent:['gain'], }, - hanzhan_gain:{ - trigger:{ - global:'chooseToCompareAfter', + hanzhan: { + audio: 2, + trigger: { + global: "chooseToCompareBegin", }, - audio:'hanzhan', - filter:function(event,player){ - if(event.preserve) return false; - if(player!=event.player&&player!=event.target&&(!event.targets||!event.targets.includes(player))) return false; - for(var i of event.lose_list){ - if(Array.isArray(i[1])){ - for(var j of i[1]){ - if(get.name(j,i[0])=='sha'&&get.position(j,true)=='o') return true; + filter: function (event, player) { + if (player == event.player) return true; + if (event.targets) return event.targets.includes(player); + return player == event.target; + }, + logTarget: function (event, player) { + if (player != event.player) return event.player; + return event.targets || event.target; + }, + prompt2: function (event, player) { + return "令其改为使用随机的手牌进行拼点"; + }, + check: function (trigger, player) { + var num = 0; + var targets = + player == trigger.player + ? trigger.targets + ? trigger.targets.slice(0) + : [trigger.target] + : [trigger.player]; + while (targets.length) { + var target = targets.shift(); + if (target.getCards("h").length > 1) num -= get.attitude(player, target); + } + return num > 0; + }, + content: function () { + var targets = + player == trigger.player + ? trigger.targets + ? trigger.targets.slice(0) + : [trigger.target] + : [trigger.player]; + if (!trigger.fixedResult) trigger.fixedResult = {}; + while (targets.length) { + var target = targets.shift(); + var hs = target.getCards("h"); + if (hs.length) trigger.fixedResult[target.playerid] = hs.randomGet(); + } + }, + group: "hanzhan_gain", + subfrequent: ["gain"], + }, + hanzhan_gain: { + trigger: { + global: "chooseToCompareAfter", + }, + audio: "hanzhan", + filter: function (event, player) { + if (event.preserve) return false; + if ( + player != event.player && + player != event.target && + (!event.targets || !event.targets.includes(player)) + ) + return false; + for (var i of event.lose_list) { + if (Array.isArray(i[1])) { + for (var j of i[1]) { + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") return true; } - } - else{ - var j=i[1]; - if(get.name(j,i[0])=='sha'&&get.position(j,true)=='o') return true; + } else { + var j = i[1]; + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") return true; } } return false; }, - frequent:true, - prompt2:function(event,player){ - var cards=[],max=0; - for(var i of event.lose_list){ - if(Array.isArray(i[1])){ - for(var j of i[1]){ - if(get.name(j,i[0])=='sha'&&get.position(j,true)=='o'){ - var num=get.number(j,i[0]); - if(num>max){ - cards=[]; - max=num; + frequent: true, + prompt2: function (event, player) { + var cards = [], + max = 0; + for (var i of event.lose_list) { + if (Array.isArray(i[1])) { + for (var j of i[1]) { + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; } - if(num==max) cards.push(j); + if (num == max) cards.push(j); } } - } - else{ - var j=i[1]; - if(get.name(j,i[0])=='sha'&&get.position(j,true)=='o'){ - var num=get.number(j,i[0]); - if(num>max){ - cards=[]; - max=num; + } else { + var j = i[1]; + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; } - if(num==max) cards.push(j); + if (num == max) cards.push(j); } } } - return '获得'+get.translation(cards); + return "获得" + get.translation(cards); }, - content:function(){ - var cards=[],max=0; - for(var i of trigger.lose_list){ - if(Array.isArray(i[1])){ - for(var j of i[1]){ - if(get.name(j,i[0])=='sha'&&get.position(j,true)=='o'){ - var num=get.number(j,i[0]); - if(num>max){ - cards=[]; - max=num; + content: function () { + var cards = [], + max = 0; + for (var i of trigger.lose_list) { + if (Array.isArray(i[1])) { + for (var j of i[1]) { + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; } - if(num==max) cards.push(j); + if (num == max) cards.push(j); } } - } - else{ - var j=i[1]; - if(get.name(j,i[0])=='sha'&&get.position(j,true)=='o'){ - var num=get.number(j,i[0]); - if(num>max){ - cards=[]; - max=num; + } else { + var j = i[1]; + if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") { + var num = get.number(j, i[0]); + if (num > max) { + cards = []; + max = num; } - if(num==max) cards.push(j); + if (num == max) cards.push(j); } } } - player.gain(cards,'gain2'); + player.gain(cards, "gain2"); }, }, - rejianchu:{ - shaRelated:true, - audio:2, - audioname:['re_pangde'], - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.countDiscardableCards(player,'he')>0; + rejianchu: { + shaRelated: true, + audio: 2, + audioname: ["re_pangde"], + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countDiscardableCards(player, "he") > 0; }, - direct:true, - content:function(){ - 'step 0' - player.discardPlayerCard(trigger.target,get.prompt('rejianchu',trigger.target)).set('ai',function(button){ - if(!_status.event.att) return 0; - if(get.position(button.link)=='e'){ - if(get.subtype(button.link)=='equip2') return 2*get.value(button.link); - return get.value(button.link); - } - return 1; - }).set('logSkill',['rejianchu',trigger.target]).set('att',get.attitude(player,trigger.target)<=0); - 'step 1' - if(result.bool&&result.links&&result.links.length){ - if(get.type(result.links[0],null,result.links[0].original=='h'?player:false)!='basic'){ + direct: true, + content: function () { + "step 0"; + player + .discardPlayerCard(trigger.target, get.prompt("rejianchu", trigger.target)) + .set("ai", function (button) { + if (!_status.event.att) return 0; + if (get.position(button.link) == "e") { + if (get.subtype(button.link) == "equip2") return 2 * get.value(button.link); + return get.value(button.link); + } + return 1; + }) + .set("logSkill", ["rejianchu", trigger.target]) + .set("att", get.attitude(player, trigger.target) <= 0); + ("step 1"); + if (result.bool && result.links && result.links.length) { + if ( + get.type( + result.links[0], + null, + result.links[0].original == "h" ? player : false + ) != "basic" + ) { trigger.getParent().directHit.add(trigger.target); - player.addTempSkill('rejianchu2'); - player.addMark('rejianchu2',1,false); - } - else if(trigger.cards){ - var list=[]; - for(var i=0;i1; - })>0; - if(arg&&arg.name=='sha'&&arg.target.getEquip(2)) return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "directHit_ai") + return ( + arg.card.name == "sha" && + arg.target.countCards("e", function (card) { + return get.value(card) > 1; + }) > 0 + ); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; return false; - } - }, - }, - rejianchu2:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('rejianchu2'); }, }, - onremove:true, }, - wulie:{ - trigger:{player:'phaseJieshuBegin'}, - audio:2, - direct:true, - limited:true, - skillAnimation:true, - animationColor:'wood', - unique:true, - filter:function(event,player){ - return player.hp>0; + rejianchu2: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("rejianchu2"); + }, }, - content:function(){ - 'step 0' - player.chooseTarget([1,player.hp],get.prompt2('wulie'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(player.hasUnknown()) return 0; - if(player.hp-ui.selected.targets.length>1+player.countCards('hs',card=>player.canSaveCard(card,player))) return get.attitude(player,target); - return 0; - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('wulie',targets); - player.awakenSkill('wulie'); + onremove: true, + }, + wulie: { + trigger: { player: "phaseJieshuBegin" }, + audio: 2, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "wood", + unique: true, + filter: function (event, player) { + return player.hp > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget([1, player.hp], get.prompt2("wulie"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hasUnknown()) return 0; + if ( + player.hp - ui.selected.targets.length > + 1 + player.countCards("hs", (card) => player.canSaveCard(card, player)) + ) + return get.attitude(player, target); + return 0; + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("wulie", targets); + player.awakenSkill("wulie"); player.loseHp(targets.length); - while(targets.length){ - targets[0].addSkill('wulie2'); - targets.shift().addMark('wulie2'); + while (targets.length) { + targets[0].addSkill("wulie2"); + targets.shift().addMark("wulie2"); } } }, }, - wulie2:{ - marktext:'烈', - intro:{name2:'烈',content:'mark'}, - trigger:{player:'damageBegin3'}, - forced:true, - content:function(){ + wulie2: { + marktext: "烈", + intro: { name2: "烈", content: "mark" }, + trigger: { player: "damageBegin3" }, + forced: true, + content: function () { trigger.cancel(); - player.removeMark('wulie2',1); - if(!player.storage.wulie2) player.removeSkill('wulie2'); + player.removeMark("wulie2", 1); + if (!player.storage.wulie2) player.removeSkill("wulie2"); }, }, - regongji:{ - mod:{ - attackRangeBase:function(player){ - if(player.getEquips(3).length>0||player.getEquips(4).length>0) return Infinity; + regongji: { + mod: { + attackRangeBase: function (player) { + if (player.getEquips(3).length > 0 || player.getEquips(4).length > 0) return Infinity; }, }, - locked:false, - enable:'phaseUse', - usable:1, - position:'he', - filter:function(event,player){ - return player.hasCard(function(card){ + locked: false, + enable: "phaseUse", + usable: 1, + position: "he", + filter: function (event, player) { + return player.hasCard(function (card) { return lib.skill.regongji.filterCard(card); - },'eh'); + }, "eh"); }, - filterCard:function(card,player){ - return get.type(card)!='basic'; + filterCard: function (card, player) { + return get.type(card) != "basic"; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'he')>0; + filterTarget: function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; }, - check:function(card){ - return 4.5-get.value(card); + check: function (card) { + return 4.5 - get.value(card); }, - content:function(){ - if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,'he',true); + content: function () { + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true); }, - ai:{ - order:5, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - var nh=target.countCards('h'); - if(att>0){ - if(target.getEquip('baiyin')&&target.isDamaged()&& - get.recoverEffect(target,player,player)>0){ - if(target.hp==1&&!target.hujia) return 1.6; - if(target.hp==2) return 0.01; + ai: { + order: 5, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var nh = target.countCards("h"); + if (att > 0) { + if ( + target.getEquip("baiyin") && + target.isDamaged() && + get.recoverEffect(target, player, player) > 0 + ) { + if (target.hp == 1 && !target.hujia) return 1.6; + if (target.hp == 2) return 0.01; return 0; } } - var es=target.getCards('e'); - var noe=(es.length==0||target.hasSkillTag('noe')); - var noe2=(es.length==1&&es[0].name!='tengjia'&&get.value(es[0])<=0); - var noh=(nh==0||target.hasSkillTag('noh')); - if(noh&&(noe||noe2)) return 0; - if(att<=0&&!target.countCards('he')) return 1.5; + var es = target.getCards("e"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = es.length == 1 && es[0].name != "tengjia" && get.value(es[0]) <= 0; + var noh = nh == 0 || target.hasSkillTag("noh"); + if (noh && (noe || noe2)) return 0; + if (att <= 0 && !target.countCards("he")) return 1.5; return -1.5; }, }, - tag:{ - loseCard:1, - discard:1 + tag: { + loseCard: 1, + discard: 1, }, }, }, - ollongdan:{ - mod:{ - aiValue:function(player,card,num){ - if(card.name!='sha'&&card.name!='shan') return; - var geti=function(){ - var cards=player.getCards('hs',function(card){ - return card.name=='sha'||card.name=='shan'; + ollongdan: { + mod: { + aiValue: function (player, card, num) { + if (card.name != "sha" && card.name != "shan") return; + var geti = function () { + var cards = player.getCards("hs", function (card) { + return card.name == "sha" || card.name == "shan"; }); - if(cards.includes(card)){ + if (cards.includes(card)) { return cards.indexOf(card); } return cards.length; }; - return Math.max(num,[7,5,5,3][Math.min(geti(),3)]); + return Math.max(num, [7, 5, 5, 3][Math.min(geti(), 3)]); }, - aiUseful:function(){ - return lib.skill.ollongdan.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.ollongdan.mod.aiValue.apply(this, arguments); }, }, - locked:false, - audio:'longdan_sha', - audioname:['re_zhaoyun'], - audioname2:{tongyuan:'longdan_tongyuan'}, - hiddenCard:function(player,name){ - if(name=='tao') return player.countCards('hs','jiu')>0; - if(name=='jiu') return player.countCards('hs','tao')>0; + locked: false, + audio: "longdan_sha", + audioname: ["re_zhaoyun"], + audioname2: { tongyuan: "longdan_tongyuan" }, + hiddenCard: function (player, name) { + if (name == "tao") return player.countCards("hs", "jiu") > 0; + if (name == "jiu") return player.countCards("hs", "tao") > 0; return false; }, - enable:['chooseToUse','chooseToRespond'], - position:'hs', - prompt:'将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出', - viewAs:function(cards,player){ - if(cards.length){ - var name=false; - switch(get.name(cards[0],player)){ - case 'sha':name='shan';break; - case 'shan':name='sha';break; - case 'tao':name='jiu';break; - case 'jiu':name='tao';break; + enable: ["chooseToUse", "chooseToRespond"], + position: "hs", + prompt: "将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出", + viewAs: function (cards, player) { + if (cards.length) { + var name = false; + switch (get.name(cards[0], player)) { + case "sha": + name = "shan"; + break; + case "shan": + name = "sha"; + break; + case "tao": + name = "jiu"; + break; + case "jiu": + name = "tao"; + break; } - if(name) return {name:name}; + if (name) return { name: name }; } return null; }, - check:function(card){ - var player=_status.event.player; - if(_status.event.type=='phase'){ - var max=0; + check: function (card) { + var player = _status.event.player; + if (_status.event.type == "phase") { + var max = 0; var name2; - var list=['sha','tao','jiu']; - var map={sha:'shan',tao:'jiu',jiu:'tao'} - for(var i=0;i(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){ - var temp=get.order({name:name}); - if(temp>max){ - max=temp; - name2=map[name]; + var list = ["sha", "tao", "jiu"]; + var map = { sha: "shan", tao: "jiu", jiu: "tao" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) && + player.getUseValue({ name: name }) > 0 + ) { + var temp = get.order({ name: name }); + if (temp > max) { + max = temp; + name2 = map[name]; } } } - if(name2==get.name(card,player)) return 1; + if (name2 == get.name(card, player)) return 1; return 0; } return 1; }, - filterCard:function(card,player,event){ - event=event||_status.event; - var filter=event._backup.filterCard; - var name=get.name(card,player); - if(name=='sha'&&filter({name:'shan',cards:[card]},player,event)) return true; - if(name=='shan'&&filter({name:'sha',cards:[card]},player,event)) return true; - if(name=='tao'&&filter({name:'jiu',cards:[card]},player,event)) return true; - if(name=='jiu'&&filter({name:'tao',cards:[card]},player,event)) return true; + filterCard: function (card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.name(card, player); + if (name == "sha" && filter({ name: "shan", cards: [card] }, player, event)) return true; + if (name == "shan" && filter({ name: "sha", cards: [card] }, player, event)) return true; + if (name == "tao" && filter({ name: "jiu", cards: [card] }, player, event)) return true; + if (name == "jiu" && filter({ name: "tao", cards: [card] }, player, event)) return true; return false; }, - filter:function(event,player){ - var filter=event.filterCard; - if(filter(get.autoViewAs({name:'sha'},'unsure'),player,event)&&player.countCards('hs','shan')) return true; - if(filter(get.autoViewAs({name:'shan'},'unsure'),player,event)&&player.countCards('hs','sha')) return true; - if(filter(get.autoViewAs({name:'tao'},'unsure'),player,event)&&player.countCards('hs','jiu')) return true; - if(filter(get.autoViewAs({name:'jiu'},'unsure'),player,event)&&player.countCards('hs','tao')) return true; + filter: function (event, player) { + var filter = event.filterCard; + if ( + filter(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && + player.countCards("hs", "shan") + ) + return true; + if ( + filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && + player.countCards("hs", "sha") + ) + return true; + if ( + filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && + player.countCards("hs", "jiu") + ) + return true; + if ( + filter(get.autoViewAs({ name: "jiu" }, "unsure"), player, event) && + player.countCards("hs", "tao") + ) + return true; return false; }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { var name; - switch(tag){ - case 'respondSha':name='shan';break; - case 'respondShan':name='sha';break; + switch (tag) { + case "respondSha": + name = "shan"; + break; + case "respondShan": + name = "sha"; + break; } - if(!player.countCards('hs',name)) return false; + if (!player.countCards("hs", name)) return false; }, - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - var list=['sha','tao','jiu']; - var map={sha:'shan',tao:'jiu',jiu:'tao'} - for(var i=0;i(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){ - var temp=get.order({name:name}); - if(temp>max) max=temp; + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao", "jiu"]; + var map = { sha: "shan", tao: "jiu", jiu: "tao" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) && + player.getUseValue({ name: name }) > 0 + ) { + var temp = get.order({ name: name }); + if (temp > max) max = temp; } } - if(max>0) max+=0.3; + if (max > 0) max += 0.3; return max; } return 4; }, }, }, - olyajiao:{ - audio:'reyajiao', - trigger:{player:'loseAfter'}, - frequent:true, - filter:function(event,player){ - return player!=_status.currentPhase&&event.hs&&event.hs.length>0&&['useCard','respond'].includes(event.getParent().name); + olyajiao: { + audio: "reyajiao", + trigger: { player: "loseAfter" }, + frequent: true, + filter: function (event, player) { + return ( + player != _status.currentPhase && + event.hs && + event.hs.length > 0 && + ["useCard", "respond"].includes(event.getParent().name) + ); }, - content:function(){ - "step 0" - event.card=get.cards()[0]; + content: function () { + "step 0"; + event.card = get.cards()[0]; game.cardsGotoOrdering(event.card); - event.videoId=lib.status.videoId++; - var judgestr=get.translation(player)+'发动了【涯角】'; - game.addVideo('judge1',player,[get.cardInfo(event.card),judgestr,event.videoId]); - game.broadcastAll(function(player,card,str,id,cardid){ - var event; - if(game.online){ - event={}; - } - else{ - event=_status.event; - } - if(game.chess){ - event.node=card.copy('thrown','center',ui.arena).addTempClass('start'); - } - else{ - event.node=player.$throwordered(card.copy(),true); - } - if(lib.cardOL) lib.cardOL[cardid]=event.node; - event.node.cardid=cardid; - event.node.classList.add('thrownhighlight'); - ui.arena.classList.add('thrownhighlight'); - event.dialog=ui.create.dialog(str); - event.dialog.classList.add('center'); - event.dialog.videoId=id; - },player,event.card,judgestr,event.videoId,get.id()); + event.videoId = lib.status.videoId++; + var judgestr = get.translation(player) + "发动了【涯角】"; + game.addVideo("judge1", player, [get.cardInfo(event.card), judgestr, event.videoId]); + game.broadcastAll( + function (player, card, str, id, cardid) { + var event; + if (game.online) { + event = {}; + } else { + event = _status.event; + } + if (game.chess) { + event.node = card.copy("thrown", "center", ui.arena).addTempClass("start"); + } else { + event.node = player.$throwordered(card.copy(), true); + } + if (lib.cardOL) lib.cardOL[cardid] = event.node; + event.node.cardid = cardid; + event.node.classList.add("thrownhighlight"); + ui.arena.classList.add("thrownhighlight"); + event.dialog = ui.create.dialog(str); + event.dialog.classList.add("center"); + event.dialog.videoId = id; + }, + player, + event.card, + judgestr, + event.videoId, + get.id() + ); - game.log(player,'展示了',event.card); + game.log(player, "展示了", event.card); game.delay(2); - if(get.type(event.card,'trick')==get.type(trigger.getParent().card,'trick')){ - player.chooseTarget('选择获得此牌的角色').set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.du){ - if(target.hasSkillTag('nodu')) return 0; - return -att; - } - if(att>0){ - return att+Math.max(0,5-target.countCards('h')); - } - return att; - }).set('du',event.card.name=='du'); + if (get.type(event.card, "trick") == get.type(trigger.getParent().card, "trick")) { + player + .chooseTarget("选择获得此牌的角色") + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.du) { + if (target.hasSkillTag("nodu")) return 0; + return -att; + } + if (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du"); + } else { + event.disbool = true; + player + .chooseTarget( + "是否弃置攻击范围内包含你的一名角色区域内的一张牌?", + function (card, player, target) { + return ( + target.inRange(player) && + target.countDiscardableCards(player, "hej") > 0 + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe" }, player, player); + }); } - else{ - event.disbool=true; - player.chooseTarget('是否弃置攻击范围内包含你的一名角色区域内的一张牌?',function(card,player,target){ - return target.inRange(player)&&target.countDiscardableCards(player,'hej')>0; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe'},player,player); - }); - } - "step 1" - if(event.disbool){ - if(result.bool){ - player.line(result.targets[0],'green'); - player.discardPlayerCard(result.targets[0],'hej',true); + ("step 1"); + if (event.disbool) { + if (result.bool) { + player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "hej", true); } event.dialog.close(); - game.addVideo('judge2',null,event.videoId); - game.addVideo('deletenode',player,[get.cardInfo(event.node)]); + game.addVideo("judge2", null, event.videoId); + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); event.node.delete(); - game.broadcast(function(id,card){ - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - if(card.clone){ - card.clone.delete(); - } - ui.arena.classList.remove('thrownhighlight'); - },event.videoId,event.card); - ui.arena.classList.remove('thrownhighlight'); - } - else if(result.targets){ + game.broadcast( + function (id, card) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + if (card.clone) { + card.clone.delete(); + } + ui.arena.classList.remove("thrownhighlight"); + }, + event.videoId, + event.card + ); + ui.arena.classList.remove("thrownhighlight"); + } else if (result.targets) { event.dialog.close(); - game.addVideo('judge2',null,event.videoId); - player.line(result.targets,'green'); - result.targets[0].gain(event.card,'log'); + game.addVideo("judge2", null, event.videoId); + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "log"); event.node.moveDelete(result.targets[0]); - game.addVideo('gain2',result.targets[0],[get.cardInfo(event.node)]); - ui.arena.classList.remove('thrownhighlight'); - game.broadcast(function(card,target,id){ - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - ui.arena.classList.remove('thrownhighlight'); - if(card.clone){ - card.clone.moveDelete(target); - } - },event.card,result.targets[0],event.videoId); - } - else{ - game.addVideo('deletenode',player,[get.cardInfo(event.node)]); + game.addVideo("gain2", result.targets[0], [get.cardInfo(event.node)]); + ui.arena.classList.remove("thrownhighlight"); + game.broadcast( + function (card, target, id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { + card.clone.moveDelete(target); + } + }, + event.card, + result.targets[0], + event.videoId + ); + } else { + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); event.node.delete(); - game.broadcast(function(id){ - var dialog=get.idDialog(id); - if(dialog){ - dialog.close(); - } - if(card.clone){ - card.clone.delete(); - } - ui.arena.classList.remove('thrownhighlight'); - },event.videoId,event.card); + game.broadcast( + function (id) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.close(); + } + if (card.clone) { + card.clone.delete(); + } + ui.arena.classList.remove("thrownhighlight"); + }, + event.videoId, + event.card + ); event.dialog.close(); - game.addVideo('judge2',null,event.videoId); - ui.arena.classList.remove('thrownhighlight'); + game.addVideo("judge2", null, event.videoId); + ui.arena.classList.remove("thrownhighlight"); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'respond')&&target.countCards('h')>1) return [1,0.2]; - } - } - } - }, - olpaoxiao:{ - audio:"paoxiao", - audioname:['re_zhangfei','guanzhang','xiahouba','re_guanzhang'], - trigger:{player:'shaMiss'}, - forced:true, - content:function(){ - player.addTempSkill('olpaoxiao2'); - player.addMark('olpaoxiao2',1,false); - }, - mod:{ - cardUsable:function (card,player,num){ - if(card.name=='sha') return Infinity; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2]; + }, }, }, }, - olpaoxiao2:{ - trigger:{source:'damageBegin1'}, - forced:true, - audio:'paoxiao', - audioname:['re_zhangfei','guanzhang','xiahouba','re_guanzhang'], - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.countMark('olpaoxiao2')>0; + olpaoxiao: { + audio: "paoxiao", + audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"], + trigger: { player: "shaMiss" }, + forced: true, + content: function () { + player.addTempSkill("olpaoxiao2"); + player.addMark("olpaoxiao2", 1, false); }, - onremove:true, - content:function(){ - trigger.num+=player.countMark('olpaoxiao2'); - player.removeSkill('olpaoxiao2'); + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return Infinity; + }, }, - intro:{content:'本回合内下一次使用【杀】造成伤害时令伤害值+#'}, }, - oltishen:{ - audio:'retishen', - unique:true, - mark:true, - skillAnimation:true, - animationColor:'soil', - limited:true, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - if(player.storage.oltishen) return false; + olpaoxiao2: { + trigger: { source: "damageBegin1" }, + forced: true, + audio: "paoxiao", + audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"], + filter: function (event, player) { + return event.card && event.card.name == "sha" && player.countMark("olpaoxiao2") > 0; + }, + onremove: true, + content: function () { + trigger.num += player.countMark("olpaoxiao2"); + player.removeSkill("olpaoxiao2"); + }, + intro: { content: "本回合内下一次使用【杀】造成伤害时令伤害值+#" }, + }, + oltishen: { + audio: "retishen", + unique: true, + mark: true, + skillAnimation: true, + animationColor: "soil", + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (player.storage.oltishen) return false; return player.isDamaged(); }, - check:function(event,player){ - if(player.hp<=2||player.getDamagedHp()>2) return true; - if(player.getDamagedHp()<=1) return false; - return player.getDamagedHp() 2) return true; + if (player.getDamagedHp() <= 1) return false; + return player.getDamagedHp() < game.roundNumber; }, - content:function(){ - player.awakenSkill('oltishen'); - player.recover(player.maxHp-player.hp); - player.draw(player.maxHp-player.hp); + content: function () { + player.awakenSkill("oltishen"); + player.recover(player.maxHp - player.hp); + player.draw(player.maxHp - player.hp); }, - intro:{ - content:'limited' + intro: { + content: "limited", }, }, - rexuanfeng:{ - audio:'xuanfeng', - audioname:['boss_lvbu3','re_heqi','re_lingtong'], - trigger:{ - player:['loseAfter','phaseDiscardEnd'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + rexuanfeng: { + audio: "xuanfeng", + audioname: ["boss_lvbu3", "re_heqi", "re_lingtong"], + trigger: { + player: ["loseAfter", "phaseDiscardEnd"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - if(!game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he')>0; - })) return false; - if(event.name=='phaseDiscard'){ - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt&&evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.hs) cards.addArray(evt.hs); + direct: true, + filter: function (event, player) { + if ( + !game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }) + ) + return false; + if (event.name == "phaseDiscard") { + var cards = []; + player.getHistory("lose", function (evt) { + if ( + evt && + evt.type == "discard" && + evt.getParent("phaseDiscard") == event && + evt.hs + ) + cards.addArray(evt.hs); }); - return cards.length>1; + return cards.length > 1; } - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; }, - content:function(){ - 'step 0' - var list=['弃置至多两名其他角色的合计两张牌']; - if(lib.skill.rexuanfeng.canMoveCard(player)) list.push('将一名其他角色装备区内的一张牌移动到另一名角色的装备区内'); - player.chooseControl('cancel2').set('choiceList',list).set('prompt',get.prompt('rexuanfeng')).set('ai',function(){ - if(lib.skill.rexuanfeng.canMoveCard(player,true)) return 1; - return 0; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('rexuanfeng'); - if(result.index==1) event.goto(5); - else event.count=2; - } - else event.finish(); - 'step 2' - player.chooseTarget('弃置一名其他角色的一张牌',function(card,player,target){ - if(player==target) return false; - return target.countDiscardableCards(player,'he'); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - 'step 3' - if(result.bool){ - player.line(result.targets[0],'green'); - player.discardPlayerCard(result.targets[0],'he',true); + content: function () { + "step 0"; + var list = ["弃置至多两名其他角色的合计两张牌"]; + if (lib.skill.rexuanfeng.canMoveCard(player)) + list.push("将一名其他角色装备区内的一张牌移动到另一名角色的装备区内"); + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("rexuanfeng")) + .set("ai", function () { + if (lib.skill.rexuanfeng.canMoveCard(player, true)) return 1; + return 0; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("rexuanfeng"); + if (result.index == 1) event.goto(5); + else event.count = 2; + } else event.finish(); + ("step 2"); + player + .chooseTarget("弃置一名其他角色的一张牌", function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + ("step 3"); + if (result.bool) { + player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "he", true); event.count--; - } + } else event.finish(); + ("step 4"); + if (event.count) event.goto(2); else event.finish(); - 'step 4' - if(event.count) event.goto(2); - else event.finish(); - 'step 5' - var next=player.chooseTarget(2,function(card,player,target){ - if(player==target) return false; - if(ui.selected.targets.length){ - var from=ui.selected.targets[0]; - if(target.isMin()) return false; - var es=from.getCards('e'); - for(var i=0;i0; + } else { + return target.countCards("e") > 0; } }); - next.set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - var sgnatt=get.sgn(att); - if(ui.selected.targets.length==0){ - if(att>0){ - if(target.countCards('e',function(card){ - return get.value(card,target)<0&&game.hasPlayer(function(current){ - return current!=player&¤t!=target&&get.attitude(player,current)<0&¤t.canEquip(card)&&get.effect(current,card,player,player)>0; - }); - })>0) return 9; - } - else if(att<0){ - if(game.hasPlayer(function(current){ - if(current!=target&¤t!=player&&get.attitude(player,current)>0){ - var es=target.getCards('e'); - for(var i=0;i0&¤t.canEquip(es[i])&&get.effect(current,es[i],player,player)>0) return true; + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var sgnatt = get.sgn(att); + if (ui.selected.targets.length == 0) { + if (att > 0) { + if ( + target.countCards("e", function (card) { + return ( + get.value(card, target) < 0 && + game.hasPlayer(function (current) { + return ( + current != player && + current != target && + get.attitude(player, current) < 0 && + current.canEquip(card) && + get.effect(current, card, player, player) > 0 + ); + }) + ); + }) > 0 + ) + return 9; + } else if (att < 0) { + if ( + game.hasPlayer(function (current) { + if ( + current != target && + current != player && + get.attitude(player, current) > 0 + ) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if ( + get.value(es[i], target) > 0 && + current.canEquip(es[i]) && + get.effect(current, es[i], player, player) > 0 + ) + return true; + } } - } - })){ + }) + ) { return -att; } } return 0; } - var es=ui.selected.targets[0].getCards('e'); + var es = ui.selected.targets[0].getCards("e"); var i; - var att2=get.sgn(get.attitude(player,ui.selected.targets[0])); - for(i=0;iget.attitude(player,targets1)){ - if(get.value(button.link,targets0)<0) return get.effect(targets1,button.link,player,player); - return 0; - } - else{ - return get.value(button.link,targets0)*get.effect(targets1,button.link,player,player); - } - },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ - var targets1=_status.event.targets1; - return targets1.canEquip(button.link); - }); - } - else{ + ("step 8"); + if (targets.length == 2) { + player + .choosePlayerCard( + "e", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if (get.attitude(player, targets0) > get.attitude(player, targets1)) { + if (get.value(button.link, targets0) < 0) + return get.effect(targets1, button.link, player, player); + return 0; + } else { + return ( + get.value(button.link, targets0) * + get.effect(targets1, button.link, player, player) + ); + } + }, + targets[0] + ) + .set("targets0", targets[0]) + .set("targets1", targets[1]) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + return targets1.canEquip(button.link); + }); + } else { event.finish(); } - 'step 9' - if(result.bool&&result.links.length){ - var link=result.links[0]; + ("step 9"); + if (result.bool && result.links.length) { + var link = result.links[0]; event.targets[1].equip(link); - event.targets[0].$give(link,event.targets[1]) + event.targets[0].$give(link, event.targets[1]); game.delay(); - event.result={bool:true}; + event.result = { bool: true }; } }, - canMoveCard:function(player,withatt){ - return game.hasPlayer(function(current){ - if(player==current) return false; - var att=get.sgn(get.attitude(player,current)); - if(!withatt||att!=0){ - var es=current.getCards('e'); - for(var i=0;i0&&(_status.connectMode||player.countCards('h','sha')>0)&&!player.getExpansions('rechunlao').length; + rechunlao: { + trigger: { player: "phaseUseEnd" }, + direct: true, + audio: 2, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + (_status.connectMode || player.countCards("h", "sha") > 0) && + !player.getExpansions("rechunlao").length + ); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - content:function(){ - 'step 0' - player.chooseCard([1,Math.max(1,player.countCards('h','sha'))],get.prompt('rechunlao'),'将任意张【杀】置于武将牌上作为“醇”',{name:'sha'}).set('ai',function(){ - return 1; - }); - 'step 1' - if(result.bool){ - player.logSkill('rechunlao'); - player.addToExpansion('gain2',result.cards).gaintag.add('rechunlao'); + content: function () { + "step 0"; + player + .chooseCard( + [1, Math.max(1, player.countCards("h", "sha"))], + get.prompt("rechunlao"), + "将任意张【杀】置于武将牌上作为“醇”", + { name: "sha" } + ) + .set("ai", function () { + return 1; + }); + ("step 1"); + if (result.bool) { + player.logSkill("rechunlao"); + player.addToExpansion("gain2", result.cards).gaintag.add("rechunlao"); } }, - ai:{ - threaten:1.4 + ai: { + threaten: 1.4, }, - group:'rechunlao2' + group: "rechunlao2", }, - rechunlao2:{ - enable:'chooseToUse', - filter:function(event,player){ - return event.type=='dying'&&event.dying&&event.dying.hp<=0&&player.getExpansions('rechunlao').length>0; + rechunlao2: { + enable: "chooseToUse", + filter: function (event, player) { + return ( + event.type == "dying" && + event.dying && + event.dying.hp <= 0 && + player.getExpansions("rechunlao").length > 0 + ); }, - filterTarget:function(card,player,target){ - return target==_status.event.dying; + filterTarget: function (card, player, target) { + return target == _status.event.dying; }, - direct:true, - delay:false, - selectTarget:-1, - content:function(){ - "step 0" - player.chooseCardButton(get.translation('rechunlao'),player.getExpansions('rechunlao'),true); - "step 1" - if(result.bool){ - player.logSkill('rechunlao'); - event.type='dying'; + direct: true, + delay: false, + selectTarget: -1, + content: function () { + "step 0"; + player.chooseCardButton( + get.translation("rechunlao"), + player.getExpansions("rechunlao"), + true + ); + ("step 1"); + if (result.bool) { + player.logSkill("rechunlao"); + event.type = "dying"; player.loseToDiscardpile(result.links); - target.useCard({name:'jiu',isCard:true},target); - var natures=get.natureList(result.links[0]); - if(natures.includes('fire')) player.recover(); - if(natures.includes('thunder')) player.draw(2); + target.useCard({ name: "jiu", isCard: true }, target); + var natures = get.natureList(result.links[0]); + if (natures.includes("fire")) player.recover(); + if (natures.includes("thunder")) player.draw(2); } }, - ai:{ - order:6, - skillTagFilter:function(player){ - return player.getExpansions('rechunlao').length>0; + ai: { + order: 6, + skillTagFilter: function (player) { + return player.getExpansions("rechunlao").length > 0; }, - save:true, - result:{ - target:3 + save: true, + result: { + target: 3, }, - threaten:1.6 + threaten: 1.6, }, }, - reluoying:{ - audio:2, - audioname:['dc_caozhi'], - group:['reluoying_discard','reluoying_judge'], - subfrequent:['judge'], - subSkill:{ - discard:{ - audio:'reluoying', - audioname:['dc_caozhi'], - trigger:{global:['loseAfter','loseAsyncAfter']}, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false) return false; - var cards=event.cards.slice(0); - var evt=event.getl(player); - if(evt&&evt.cards) cards.removeArray(evt.cards); - for(var i=0;i=7) return true; - player.getAllHistory('damage',function(evt){ - num+=evt.num; - }); - return num>7; + }, + }, }, - content:function(){ - player.markSkill('rejiushi_mark'); - player.awakenSkill('chengzhang'); - player.storage.chengzhang=true; + }, + chengzhang: { + trigger: { player: "phaseZhunbeiBegin" }, + derivation: "rejiushi_mark", + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + var num = 0; + player.getAllHistory("sourceDamage", function (evt) { + num += evt.num; + }); + if (num >= 7) return true; + player.getAllHistory("damage", function (evt) { + num += evt.num; + }); + return num > 7; + }, + content: function () { + player.markSkill("rejiushi_mark"); + player.awakenSkill("chengzhang"); + player.storage.chengzhang = true; player.recover(); player.draw(); }, }, - rejiushi:{ - audio:2, - audioname:['mb_caomao'], - group:['rejiushi1','rejiushi2','rejiushi3','rejiushi_gain'], - subfrequent:['gain'], - subSkill:{ - gain:{ - audio:'rejiushi', - trigger:{player:'turnOverAfter'}, - frequent:true, - filter:function(event,player){ - return player.storage.chengzhang==true; + rejiushi: { + audio: 2, + audioname: ["mb_caomao"], + group: ["rejiushi1", "rejiushi2", "rejiushi3", "rejiushi_gain"], + subfrequent: ["gain"], + subSkill: { + gain: { + audio: "rejiushi", + trigger: { player: "turnOverAfter" }, + frequent: true, + filter: function (event, player) { + return player.storage.chengzhang == true; }, - prompt:'是否发动【酒诗】,获得牌堆中的一张锦囊牌?', - content:function(){ - var card=get.cardPile2(function(card){ - return get.type2(card)=='trick'; + prompt: "是否发动【酒诗】,获得牌堆中的一张锦囊牌?", + content: function () { + var card = get.cardPile2(function (card) { + return get.type2(card) == "trick"; }); - if(card) player.gain(card,'gain2','log'); + if (card) player.gain(card, "gain2", "log"); }, }, }, }, - rejiushi1:{ - hiddenCard:function(player,name){ - if(name=='jiu') return !player.isTurnedOver(); + rejiushi1: { + hiddenCard: function (player, name) { + if (name == "jiu") return !player.isTurnedOver(); return false; }, - audio:'rejiushi', - audioname:['mb_caomao'], - enable:'chooseToUse', - filter:function(event,player){ - if(player.classList.contains('turnedover')) return false; - return event.filterCard({name:'jiu',isCard:true},player,event); + audio: "rejiushi", + audioname: ["mb_caomao"], + enable: "chooseToUse", + filter: function (event, player) { + if (player.classList.contains("turnedover")) return false; + return event.filterCard({ name: "jiu", isCard: true }, player, event); }, - content:function(){ - if(_status.event.getParent(2).type=='dying'){ - event.dying=player; - event.type='dying'; + content: function () { + if (_status.event.getParent(2).type == "dying") { + event.dying = player; + event.type = "dying"; } player.turnOver(); - player.useCard({name:'jiu',isCard:true},player); + player.useCard({ name: "jiu", isCard: true }, player); }, - ai:{ - order:5, - result:{ - player:function(player){ - if(_status.event.parent.name=='phaseUse'){ - if(player.countCards('h','jiu')>0) return 0; - if(player.getEquip('zhuge')&&player.countCards('h','sha')>1) return 0; - if(!player.countCards('h','sha')) return 0; - var targets=[]; + ai: { + order: 5, + result: { + player: function (player) { + if (_status.event.parent.name == "phaseUse") { + if (player.countCards("h", "jiu") > 0) return 0; + if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0; + if (!player.countCards("h", "sha")) return 0; + var targets = []; var target; - var players=game.filterPlayer(); - for(var i=0;inum){ - target=targets[i]; - num=num2; + var num = get.effect(target, { name: "sha" }, player, player); + for (var i = 1; i < targets.length; i++) { + var num2 = get.effect(targets[i], { name: "sha" }, player, player); + if (num2 > num) { + target = targets[i]; + num = num2; } } - if(num<=0) return 0; - var e2=target.getEquip(2); - if(e2){ - if(e2.name=='tengjia'){ - if(!player.countCards('h',{name:'sha',nature:'fire'})&&!player.getEquip('zhuque')) return 0; + if (num <= 0) return 0; + var e2 = target.getEquip(2); + if (e2) { + if (e2.name == "tengjia") { + if ( + !player.countCards("h", { name: "sha", nature: "fire" }) && + !player.getEquip("zhuque") + ) + return 0; } - if(e2.name=='renwang'){ - if(!player.countCards('h',{name:'sha',color:'red'})) return 0; + if (e2.name == "renwang") { + if (!player.countCards("h", { name: "sha", color: "red" })) return 0; } - if(e2.name=='baiyin') return 0; + if (e2.name == "baiyin") return 0; } - if(player.getEquip('guanshi')&&player.countCards('he')>2) return 1; - return target.countCards('h')>3?0:1; + if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1; + return target.countCards("h") > 3 ? 0 : 1; } - if(player==_status.event.dying||player.isTurnedOver()) return 3; - } + if (player == _status.event.dying || player.isTurnedOver()) return 3; + }, }, - effect:{ - target:function(card,player,target){ - if(card.name=='guiyoujie') return [0,0.5]; - if(target.isTurnedOver()){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target.hp==1) return; - return [1,target.countCards('h')/2]; + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 0.5]; + if (target.isTurnedOver()) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return; + return [1, target.countCards("h") / 2]; } } - } - } + }, + }, }, }, - rejiushi2:{ - trigger:{player:'damageBegin3'}, - silent:true, - firstDo:true, - filter:function(event,player){ - return player.classList.contains('turnedover'); + rejiushi2: { + trigger: { player: "damageBegin3" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.classList.contains("turnedover"); + }, + content: function () { + trigger.rejiushi = true; }, - content:function(){ - trigger.rejiushi=true; - } }, - rejiushi3:{ - audio:'rejiushi', - trigger:{player:'damageEnd'}, - check:function(event,player){ + rejiushi3: { + audio: "rejiushi", + trigger: { player: "damageEnd" }, + check: function (event, player) { return player.isTurnedOver(); }, - filter:function(event,player){ - if(event.rejiushi){ + filter: function (event, player) { + if (event.rejiushi) { return true; } return false; }, - prompt:function(event,player){ - var str='是否发动【酒诗】,将武将牌翻面'; - if(!player.storage.chengzhang) str+=',并获得牌堆中的一张锦囊牌'; - str+='?' + prompt: function (event, player) { + var str = "是否发动【酒诗】,将武将牌翻面"; + if (!player.storage.chengzhang) str += ",并获得牌堆中的一张锦囊牌"; + str += "?"; return str; }, - content:function(){ + content: function () { delete trigger.rejiushi; player.turnOver(); - if(!player.storage.chengzhang){ - var card=get.cardPile2(function(card){ - return get.type2(card)=='trick'; + if (!player.storage.chengzhang) { + var card = get.cardPile2(function (card) { + return get.type2(card) == "trick"; }); - if(card) player.gain(card,'gain2','log'); - } - } - }, - rejiushi_mark:{ - mark:true, - marktext:'改', - intro:{ - content:'当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。', - }, - }, - rehongyan:{ - audio:2, - mod:{ - suit:function(card,suit){ - if(suit=='spade') return 'heart'; + if (card) player.gain(card, "gain2", "log"); } }, - trigger:{player:'loseEnd'}, - filter:function(event,player){ - if(player==_status.currentPhase||!event.visible||player.hp<=player.countCards('h')) return false; - for(var i=0;iplayer.canSaveCard(card,player))) mindist++; - if(game.hasPlayer(function(current){ - return (get.distance(player,current)<=mindist&& - player.canUse('sha',current,false)&& - get.effect(current,{name:'sha'},player,player)>0); - })){ + ai: { + order: 14, + result: { + player: function (player) { + if (player.hp < 3) return false; + var mindist = player.hp; + if (player.countCards("hs", (card) => player.canSaveCard(card, player))) + mindist++; + if ( + game.hasPlayer(function (current) { + return ( + get.distance(player, current) <= mindist && + player.canUse("sha", current, false) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) { return 1; } return 0; - } - } - } + }, + }, + }, }, - reqimou2:{ - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(typeof player.storage.reqimou2=='number'&&card.name=='sha'){ - return num+player.storage.reqimou2; + reqimou2: { + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (typeof player.storage.reqimou2 == "number" && card.name == "sha") { + return num + player.storage.reqimou2; } }, - globalFrom:function(from,to,distance){ - if(typeof from.storage.reqimou2=='number'){ - return distance-from.storage.reqimou2; + globalFrom: function (from, to, distance) { + if (typeof from.storage.reqimou2 == "number") { + return distance - from.storage.reqimou2; } - } - } - }, - olniepan:{ - audio:2, - unique:true, - enable:'chooseToUse', - mark:true, - skillAnimation:true, - limited:true, - animationColor:'orange', - init:function(player){ - player.storage.olniepan=false; + }, }, - filter:function(event,player){ - if(player.storage.olniepan) return false; - if(event.type=='dying'){ - if(player!=event.dying) return false; + }, + olniepan: { + audio: 2, + unique: true, + enable: "chooseToUse", + mark: true, + skillAnimation: true, + limited: true, + animationColor: "orange", + init: function (player) { + player.storage.olniepan = false; + }, + filter: function (event, player) { + if (player.storage.olniepan) return false; + if (event.type == "dying") { + if (player != event.dying) return false; return true; } return false; }, - content:function(){ - 'step 0' - player.awakenSkill('olniepan'); - player.storage.olniepan=true; - player.discard(player.getCards('hej')); - 'step 1' + content: function () { + "step 0"; + player.awakenSkill("olniepan"); + player.storage.olniepan = true; + player.discard(player.getCards("hej")); + ("step 1"); player.link(false); - 'step 2' + ("step 2"); player.turnOver(false); - 'step 3' + ("step 3"); player.draw(3); - 'step 4' - if(player.hp<3){ - player.recover(3-player.hp); + ("step 4"); + if (player.hp < 3) { + player.recover(3 - player.hp); } - 'step 5' - player.chooseControl('bazhen','olhuoji','olkanpo').set('prompt','选择获得一个技能').ai=function(){ - return ['olhuoji','bazhen'].randomGet(); + ("step 5"); + player + .chooseControl("bazhen", "olhuoji", "olkanpo") + .set("prompt", "选择获得一个技能").ai = function () { + return ["olhuoji", "bazhen"].randomGet(); }; - 'step 6' + ("step 6"); player.addSkills(result.control); }, - derivation:['bazhen','olhuoji','olkanpo'], - ai:{ - order:1, - skillTagFilter:function(player,tag,target){ - if(player!=target||player.storage.olniepan) return false; + derivation: ["bazhen", "olhuoji", "olkanpo"], + ai: { + order: 1, + skillTagFilter: function (player, tag, target) { + if (player != target || player.storage.olniepan) return false; }, - save:true, - result:{ - player:function(player){ - if(player.hp<=0) return 10; - if(player.hp<=2&&player.countCards('he')<=1) return 10; + save: true, + result: { + player: function (player) { + if (player.hp <= 0) return 10; + if (player.hp <= 2 && player.countCards("he") <= 1) return 10; return 0; - } + }, + }, + threaten: function (player, target) { + if (!target.storage.olniepan) return 0.6; }, - threaten:function(player,target){ - if(!target.storage.olniepan) return 0.6; - } }, - intro:{ - content:'limited' - } + intro: { + content: "limited", + }, }, - rewurong:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + rewurong: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - "step 0" - if(target.countCards('h')==0||player.countCards('h')==0){ + content: function () { + "step 0"; + if (target.countCards("h") == 0 || player.countCards("h") == 0) { event.finish(); return; } - "step 1" - var sendback=function(){ - if(_status.event!=event){ - return function(){ - event.resultOL=_status.event.resultOL; + ("step 1"); + var sendback = function () { + if (_status.event != event) { + return function () { + event.resultOL = _status.event.resultOL; }; } }; - if(player.isOnline()){ + if (player.isOnline()) { player.wait(sendback); - event.ol=true; - player.send(function(){ - game.me.chooseCard(true).set('glow_result',true).ai=function(){ + event.ol = true; + player.send(function () { + game.me.chooseCard(true).set("glow_result", true).ai = function () { return Math.random(); }; game.resume(); }); - } - else{ - event.localPlayer=true; - var hasShan=!target.countCards('h','shan'); - player.chooseCard(true).set('glow_result',true).ai=function(card){ - if(hasShan&&get.name(card)=='sha') return 1; + } else { + event.localPlayer = true; + var hasShan = !target.countCards("h", "shan"); + player.chooseCard(true).set("glow_result", true).ai = function (card) { + if (hasShan && get.name(card) == "sha") return 1; return Math.random(); - } + }; } - if(target.isOnline()){ + if (target.isOnline()) { target.wait(sendback); - event.ol=true; - target.send(function(){ - var rand=Math.random()<0.4; - game.me.chooseCard(true).set('glow_result',true).ai=function(card){ - if(rand) return card.name=='shan'?1:0; - return card.name=='shan'?0:1; + event.ol = true; + target.send(function () { + var rand = Math.random() < 0.4; + game.me.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; }; game.resume(); }); + } else { + event.localTarget = true; } - else{ - event.localTarget=true; + ("step 2"); + if (event.localPlayer) { + event.card1 = result.cards[0]; } - "step 2" - if(event.localPlayer){ - event.card1=result.cards[0]; - } - if(event.localTarget){ - var rand=Math.random()<0.4; - target.chooseCard(true).set('glow_result',true).ai=function(card){ - if(rand) return card.name=='shan'?1:0; - return card.name=='shan'?0:1; + if (event.localTarget) { + var rand = Math.random() < 0.4; + target.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; }; } - "step 3" - if(event.localTarget){ - event.card2=result.cards[0]; + ("step 3"); + if (event.localTarget) { + event.card2 = result.cards[0]; } - if(!event.resultOL&&event.ol){ + if (!event.resultOL && event.ol) { game.pause(); } - "step 4" - try{ - if(!event.card1) event.card1=event.resultOL[player.playerid].cards[0]; - if(!event.card2) event.card2=event.resultOL[target.playerid].cards[0]; - if(!event.card1||!event.card2){ - throw('err'); + ("step 4"); + try { + if (!event.card1) event.card1 = event.resultOL[player.playerid].cards[0]; + if (!event.card2) event.card2 = event.resultOL[target.playerid].cards[0]; + if (!event.card1 || !event.card2) { + throw "err"; } - } - catch(e){ + } catch (e) { console.log(e); event.finish(); return; } - game.broadcastAll(function(card1,card2){ - card1.classList.remove('glow'); - card2.classList.remove('glow'); - },event.card1,event.card2); - "step 5" - game.broadcastAll(function(){ - ui.arena.classList.add('thrownhighlight'); + game.broadcastAll( + function (card1, card2) { + card1.classList.remove("glow"); + card2.classList.remove("glow"); + }, + event.card1, + event.card2 + ); + ("step 5"); + game.broadcastAll(function () { + ui.arena.classList.add("thrownhighlight"); }); - game.addVideo('thrownhighlight1'); - player.$compare(event.card1,target,event.card2); + game.addVideo("thrownhighlight1"); + player.$compare(event.card1, target, event.card2); game.delay(4); - "step 6" - var next=game.createEvent('showCards'); - next.player=player; - next.cards=[event.card1]; - next.setContent('emptyEvent'); - game.log(player,'展示了',event.card1); - "step 7" - var next=game.createEvent('showCards'); - next.player=target; - next.cards=[event.card2]; - next.setContent('emptyEvent'); - game.log(target,'展示了',event.card2); - "step 8" - var name1=get.name(event.card1); - var name2=get.name(event.card2); - if(name1=='sha'&&name2!='shan'){ + ("step 6"); + var next = game.createEvent("showCards"); + next.player = player; + next.cards = [event.card1]; + next.setContent("emptyEvent"); + game.log(player, "展示了", event.card1); + ("step 7"); + var next = game.createEvent("showCards"); + next.player = target; + next.cards = [event.card2]; + next.setContent("emptyEvent"); + game.log(target, "展示了", event.card2); + ("step 8"); + var name1 = get.name(event.card1); + var name2 = get.name(event.card2); + if (name1 == "sha" && name2 != "shan") { //player.discard(event.card1).set('animate',false); target.$gain2(event.card2); - var clone=event.card1.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); - game.addVideo('deletenode',player,get.cardsInfo([clone])); + game.addVideo("deletenode", player, get.cardsInfo([clone])); } - game.broadcast(function(card){ - var clone=card.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); } - },event.card1); - target.damage('nocard'); - } - else if(name1!='sha'&&name2=='shan'){ + }, event.card1); + target.damage("nocard"); + } else if (name1 != "sha" && name2 == "shan") { //player.discard(event.card1).set('animate',false); target.$gain2(event.card2); - var clone=event.card1.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); - game.addVideo('deletenode',player,get.cardsInfo([clone])); + game.addVideo("deletenode", player, get.cardsInfo([clone])); } - game.broadcast(function(card){ - var clone=card.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); } - },event.card1); - player.gainPlayerCard(target,true,'he'); - } - else{ + }, event.card1); + player.gainPlayerCard(target, true, "he"); + } else { player.$gain2(event.card1); target.$gain2(event.card2); } - game.broadcastAll(function(){ - ui.arena.classList.remove('thrownhighlight'); + game.broadcastAll(function () { + ui.arena.classList.remove("thrownhighlight"); }); - game.addVideo('thrownhighlight2'); + game.addVideo("thrownhighlight2"); }, - ai:{ - order:6, - result:{ - target:-1, - } - } - }, - cangzhuo:{ - trigger:{player:'phaseDiscardBegin'}, - frequent:true, - audio:2, - filter:function(event,player){ - return player.getHistory('useCard',function(card){ - return get.type(card.card,'trick')=='trick'; - }).length==0; - }, - content:function(){ - player.addTempSkill('cangzhuo2'); + ai: { + order: 6, + result: { + target: -1, + }, }, }, - cangzhuo2:{ - mod:{ - ignoredHandcard:function(card,player){ - if(get.type(card,'trick')=='trick'){ + cangzhuo: { + trigger: { player: "phaseDiscardBegin" }, + frequent: true, + audio: 2, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (card) { + return get.type(card.card, "trick") == "trick"; + }).length == 0 + ); + }, + content: function () { + player.addTempSkill("cangzhuo2"); + }, + }, + cangzhuo2: { + mod: { + ignoredHandcard: function (card, player) { + if (get.type(card, "trick") == "trick") { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.type(card,'trick')=='trick') return false; - } + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.type(card, "trick") == "trick") return false; + }, }, }, - shebian:{ - trigger:{player:'turnOverEnd'}, - check:function(event,player){ - return player.canMoveCard(true,true); + shebian: { + trigger: { player: "turnOverEnd" }, + check: function (event, player) { + return player.canMoveCard(true, true); }, - filter:function(event,player){ - return player.canMoveCard(null,true); + filter: function (event, player) { + return player.canMoveCard(null, true); }, - content:function(){ - player.moveCard().nojudge=true; + content: function () { + player.moveCard().nojudge = true; }, }, - rexianzhen:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + rexianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseToCompare(target); - "step 1" - if(result.player&&get.name(result.player,player)=='sha') player.addTempSkill('rexianzhen4'); - if(result.bool){ - player.storage[event.name]=target; - player.addTempSkill(event.name+2); - } - else{ - player.addTempSkill(event.name+3); + ("step 1"); + if (result.player && get.name(result.player, player) == "sha") + player.addTempSkill("rexianzhen4"); + if (result.bool) { + player.storage[event.name] = target; + player.addTempSkill(event.name + 2); + } else { + player.addTempSkill(event.name + 3); } }, - ai:{ - order:function(name,player){ - var cards=player.getCards('h'); - if(player.countCards('h','sha')==0){ + ai: { + order: function (name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { return 1; } - for(var i=0;i11&&get.value(cards[i])<7){ + for (var i = 0; i < cards.length; i++) { + if ( + cards[i].name != "sha" && + get.number(cards[i]) > 11 && + get.value(cards[i]) < 7 + ) { return 9; } } - return get.order({name:'sha'})-1; + return get.order({ name: "sha" }) - 1; }, - result:{ - player:function(player){ - if(player.countCards('h','sha')>0) return 0; - var num=player.countCards('h'); - if(num>player.hp) return 0; - if(num==1) return -2; - if(num==2) return -1; + result: { + player: function (player) { + if (player.countCards("h", "sha") > 0) return 0; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; return -0.7; }, - target:function(player,target){ - var num=target.countCards('h'); - if(num==1) return -1; - if(num==2) return -0.7; - return -0.5 + target: function (player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; }, }, - threaten:1.3 - } - }, - rexianzhen2:{ - charlotte:true, - mod:{ - targetInRange:function(card,player,target){ - if(target==player.storage.rexianzhen) return true; - }, - cardUsableTarget:function(card,player,target){ - if(target==player.storage.rexianzhen) return true; - } + threaten: 1.3, }, - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(arg.target!=player.storage.rexianzhen) return false; + }, + rexianzhen2: { + charlotte: true, + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.rexianzhen) return true; }, - } + cardUsableTarget: function (card, player, target) { + if (target == player.storage.rexianzhen) return true; + }, + }, + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.rexianzhen) return false; + }, + }, }, - rexianzhen3:{ - charlotte:true, - mod:{ - cardEnabled:function(card){if(card.name=='sha') return false} - } + rexianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, }, - rexianzhen4:{ - mod:{ - ignoredHandcard:function(card,player){ - if(get.name(card)=='sha'){ + rexianzhen4: { + mod: { + ignoredHandcard: function (card, player) { + if (get.name(card) == "sha") { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.name(card)=='sha'){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") { return false; } }, }, }, - rejinjiu:{ - mod:{ - cardname:function(card,player){ - if(card.name=='jiu') return 'sha'; + rejinjiu: { + mod: { + cardname: function (card, player) { + if (card.name == "jiu") return "sha"; }, }, - ai:{ - skillTagFilter:function(player){ - if(!player.countCards('h','jiu')) return false; + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", "jiu")) return false; }, - respondSha:true, + respondSha: true, }, - audio:2, - trigger:{player:['useCard1','respond']}, - firstDo:true, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&!event.skill&& - event.cards.length==1&&event.cards[0].name=='jiu'; + audio: 2, + trigger: { player: ["useCard1", "respond"] }, + firstDo: true, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + !event.skill && + event.cards.length == 1 && + event.cards[0].name == "jiu" + ); }, - content:function(){}, - group:'rejinjiu2', - global:'rejinjiu3', + content: function () {}, + group: "rejinjiu2", + global: "rejinjiu3", }, - rejinjiu3:{ - mod:{ - cardEnabled:function(card,player){ - if(card.name=='jiu'&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('rejinjiu')) return false; + rejinjiu3: { + mod: { + cardEnabled: function (card, player) { + if ( + card.name == "jiu" && + _status.currentPhase && + _status.currentPhase != player && + _status.currentPhase.hasSkill("rejinjiu") + ) + return false; }, - cardSavable:function(card,player){ - if(card.name=='jiu'&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('rejinjiu')) return false; + cardSavable: function (card, player) { + if ( + card.name == "jiu" && + _status.currentPhase && + _status.currentPhase != player && + _status.currentPhase.hasSkill("rejinjiu") + ) + return false; }, }, }, - rejinjiu2:{ - audio:'rejinjiu', - forced:true, - trigger:{player:'damageBegin3'}, - filter:function(event,player){ - return event.getParent(2).jiu==true; + rejinjiu2: { + audio: "rejinjiu", + forced: true, + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return event.getParent(2).jiu == true; }, - content:function(){ - trigger.num-=trigger.getParent(2).jiu_add; + content: function () { + trigger.num -= trigger.getParent(2).jiu_add; }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - return arg&&arg.jiu==true; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.jiu == true; }, }, }, - repojun:{ - shaRelated:true, - audio:2, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.hp>0&&event.target.countCards('he')>0; + repojun: { + shaRelated: true, + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - var next=player.choosePlayerCard(trigger.target,'he',[1,Math.min(trigger.target.hp,trigger.target.countCards('he'))],get.prompt('repojun',trigger.target)); - next.set('ai',function(button){ - if(!_status.event.goon) return 0; - var val=get.value(button.link); - if(button.link==_status.event.target.getEquip(2)) return 2*(val+3); + content: function () { + "step 0"; + var next = player.choosePlayerCard( + trigger.target, + "he", + [1, Math.min(trigger.target.hp, trigger.target.countCards("he"))], + get.prompt("repojun", trigger.target) + ); + next.set("ai", function (button) { + if (!_status.event.goon) return 0; + var val = get.value(button.link); + if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3); return val; }); - next.set('goon',get.attitude(player,trigger.target)<=0); - next.set('forceAuto',true); - 'step 1' - if(result.bool){ - var target=trigger.target; - player.logSkill('repojun',target); - target.addSkill('repojun2'); - target.addToExpansion('giveAuto',result.cards,target).gaintag.add('repojun2'); + next.set("goon", get.attitude(player, trigger.target) <= 0); + next.set("forceAuto", true); + ("step 1"); + if (result.bool) { + var target = trigger.target; + player.logSkill("repojun", target); + target.addSkill("repojun2"); + target.addToExpansion("giveAuto", result.cards, target).gaintag.add("repojun2"); } }, - ai:{ - unequip_ai:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(get.attitude(player,arg.target)>0) return false; - if(tag=='directHit_ai') return arg.target.hp>=Math.max(1,arg.target.countCards('h')-1); - if(arg&&arg.name=='sha'&&arg.target.getEquip(2)) return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0) return false; + if (tag == "directHit_ai") + return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; return false; - } + }, }, - group:'repojun3', + group: "repojun3", }, - repojun3:{ - audio:'repojun', - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - var target=event.player; - return event.card&&event.card.name=='sha'&&player.countCards('h')>=target.countCards('h')&&player.countCards('e')>=target.countCards('e'); + repojun3: { + audio: "repojun", + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + var target = event.player; + return ( + event.card && + event.card.name == "sha" && + player.countCards("h") >= target.countCards("h") && + player.countCards("e") >= target.countCards("e") + ); }, - forced:true, - locked:false, - logTarget:'player', - content:function(){ + forced: true, + locked: false, + logTarget: "player", + content: function () { trigger.num++; }, }, - repojun2:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return player.getExpansions('repojun2').length>0; + repojun2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("repojun2").length > 0; }, - content:function(){ - 'step 0' - var cards=player.getExpansions('repojun2'); - player.gain(cards,'draw'); - game.log(player,'收回了'+get.cnNumber(cards.length)+'张“破军”牌'); - 'step 1' - player.removeSkill('repojun2'); + content: function () { + "step 0"; + var cards = player.getExpansions("repojun2"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌"); + ("step 1"); + player.removeSkill("repojun2"); }, - intro:{ - markcount:'expansion', - mark:function(dialog,storage,player){ - var cards=player.getExpansions('repojun2'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("repojun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; }, }, }, - sishu:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('sishu')).ai=function(target){ - var att=get.attitude(_status.event.player,target); - if(target.countMark('sishu2')%2==1) return -att; + sishu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("sishu")).ai = function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countMark("sishu2") % 2 == 1) return -att; return att; - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sishu',target) - target.addSkill('sishu2'); - target.addMark('sishu2',1,false); + }; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sishu", target); + target.addSkill("sishu2"); + target.addMark("sishu2", 1, false); } }, }, - sishu2:{ - charlotte:true, - marktext:'思', - intro:{ - name:'思蜀', - content:'本局游戏内计算【乐不思蜀】的效果时反转#次', + sishu2: { + charlotte: true, + marktext: "思", + intro: { + name: "思蜀", + content: "本局游戏内计算【乐不思蜀】的效果时反转#次", }, - mod:{ - judge:function(player,result){ - if(_status.event.cardname=='lebu'&&player.countMark('sishu2')%2==1){ - if(result.bool==false){ - result.bool=true; - } - else{ - result.bool=false; + mod: { + judge: function (player, result) { + if (_status.event.cardname == "lebu" && player.countMark("sishu2") % 2 == 1) { + if (result.bool == false) { + result.bool = true; + } else { + result.bool = false; } } - } + }, }, }, - olruoyu:{ - skillAnimation:true, - animationColor:'fire', - audio:2, - unique:true, - juexingji:true, - zhuSkill:true, - keepSkill:true, - derivation:['rejijiang','sishu'], - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - if(!player.hasZhuSkill('olruoyu')) return false; + olruoyu: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + unique: true, + juexingji: true, + zhuSkill: true, + keepSkill: true, + derivation: ["rejijiang", "sishu"], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!player.hasZhuSkill("olruoyu")) return false; return player.isMinHp(); }, - content:function(){ - 'step 0' - player.awakenSkill('olruoyu'); + content: function () { + "step 0"; + player.awakenSkill("olruoyu"); player.gainMaxHp(); - 'step 1' - if(player.hp<3) player.recover(3-player.hp); - player.addSkills(['sishu', 'rejijiang']); - } - }, - olfangquan:{ - audio:2, - audioname:['shen_caopi'], - trigger:{player:'phaseUseBefore'}, - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasSkill('olfangquan3'); + ("step 1"); + if (player.hp < 3) player.recover(3 - player.hp); + player.addSkills(["sishu", "rejijiang"]); }, - direct:true, - content:function(){ - "step 0" - var fang=player.countMark('olfangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.hp+2; - player.chooseBool(get.prompt2('olfangquan')).set('ai',function(){ - if(!_status.event.fang) return false; - return game.hasPlayer(function(target){ - if(target.hasJudge('lebu')||target==player) return false; - if(get.attitude(player,target)>4){ - return (get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1)>0); - } - return false; - }); - }).set('fang',fang); - "step 1" - if(result.bool){ - player.logSkill('olfangquan'); + }, + olfangquan: { + audio: 2, + audioname: ["shen_caopi"], + trigger: { player: "phaseUseBefore" }, + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("olfangquan3"); + }, + direct: true, + content: function () { + "step 0"; + var fang = + player.countMark("olfangquan2") == 0 && + player.hp >= 2 && + player.countCards("h") <= player.hp + 2; + player + .chooseBool(get.prompt2("olfangquan")) + .set("ai", function () { + if (!_status.event.fang) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return ( + get.threaten(target) / + Math.sqrt(target.hp + 1) / + Math.sqrt(target.countCards("h") + 1) > + 0 + ); + } + return false; + }); + }) + .set("fang", fang); + ("step 1"); + if (result.bool) { + player.logSkill("olfangquan"); trigger.cancel(); - player.addTempSkill('olfangquan2'); - player.addMark('olfangquan2',1,false); + player.addTempSkill("olfangquan2"); + player.addMark("olfangquan2", 1, false); } - } + }, }, - olfangquan2:{ - trigger:{player:'phaseDiscardBegin'}, - forced:true, - popup:false, - audio:false, - onremove:true, - content:function(){ - "step 0" - event.count=player.countMark(event.name); - player.removeMark(event.name,event.count,false); - "step 1" + olfangquan2: { + trigger: { player: "phaseDiscardBegin" }, + forced: true, + popup: false, + audio: false, + onremove: true, + content: function () { + "step 0"; + event.count = player.countMark(event.name); + player.removeMark(event.name, event.count, false); + ("step 1"); event.count--; - player.chooseToDiscard('是否弃置一张牌并令一名其他角色进行一个额外回合?').set('logSkill','olfangquan').ai=function(card){ - return 20-get.value(card); + player + .chooseToDiscard("是否弃置一张牌并令一名其他角色进行一个额外回合?") + .set("logSkill", "olfangquan").ai = function (card) { + return 20 - get.value(card); }; - "step 2" - if(result.bool){ - player.chooseTarget(true,'请选择进行额外回合的目标角色',lib.filter.notMe).ai=function(target){ - if(target.hasJudge('lebu')) return -1; - if(get.attitude(player,target)>4){ - return get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1); - } - return -1; - }; - } - else event.finish(); - "step 3" - var target=result.targets[0]; - player.line(target,'fire'); - target.markSkillCharacter('olfangquan',player,'放权','进行一个额外回合'); + ("step 2"); + if (result.bool) { + player.chooseTarget(true, "请选择进行额外回合的目标角色", lib.filter.notMe).ai = + function (target) { + if (target.hasJudge("lebu")) return -1; + if (get.attitude(player, target) > 4) { + return ( + get.threaten(target) / + Math.sqrt(target.hp + 1) / + Math.sqrt(target.countCards("h") + 1) + ); + } + return -1; + }; + } else event.finish(); + ("step 3"); + var target = result.targets[0]; + player.line(target, "fire"); + target.markSkillCharacter("olfangquan", player, "放权", "进行一个额外回合"); target.insertPhase(); - target.addSkill('olfangquan3'); - if(event.count>0) event.goto(1); - } - }, - olfangquan3:{ - trigger:{player:['phaseAfter','phaseCancelled']}, - forced:true, - popup:false, - audio:false, - content:function(){ - player.unmarkSkill('olfangquan'); - player.removeSkill('olfangquan3'); - } - }, - olluanji:{ - inherit:'luanji', - audioname:['shen_caopi'], - audio:2, - line:false, - group:'olluanji_remove', - check:function(card){ - return 7-get.value(card); + target.addSkill("olfangquan3"); + if (event.count > 0) event.goto(1); }, }, - olluanji_remove:{ - trigger:{player:'useCard2'}, - direct:true, - filter:function(event,player){ - return event.card.name=='wanjian'&&event.targets.length>0; + olfangquan3: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + audio: false, + content: function () { + player.unmarkSkill("olfangquan"); + player.removeSkill("olfangquan3"); }, - line:false, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('olluanji'),'为'+get.translation(trigger.card)+'减少一个目标',function(card,player,target){ - return _status.event.targets.includes(target) - }).set('targets',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return -get.effect(target,_status.event.getTrigger().card,player,player) - }); - 'step 1' - if(result.bool){ - player.logSkill('olluanji',result.targets); + }, + olluanji: { + inherit: "luanji", + audioname: ["shen_caopi"], + audio: 2, + line: false, + group: "olluanji_remove", + check: function (card) { + return 7 - get.value(card); + }, + }, + olluanji_remove: { + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + return event.card.name == "wanjian" && event.targets.length > 0; + }, + line: false, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("olluanji"), + "为" + get.translation(trigger.card) + "减少一个目标", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("targets", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return -get.effect(target, _status.event.getTrigger().card, player, player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("olluanji", result.targets); trigger.targets.remove(result.targets[0]); } }, }, - olxueyi:{ - audio:2, - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - zhuSkill:true, - unique:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.hasZhuSkill('olxueyi'); + olxueyi: { + audio: 2, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + zhuSkill: true, + unique: true, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.hasZhuSkill("olxueyi"); }, - content:function(){ + content: function () { // player.storage.olxueyi_inited=true; - var num=game.countPlayer(function(current){ - return current.group=='qun'; - }) - if(num) player.addMark('olxueyi',num*2); + var num = game.countPlayer(function (current) { + return current.group == "qun"; + }); + if (num) player.addMark("olxueyi", num * 2); }, - marktext:'裔', - intro:{ - name2:'裔', - content:'mark', + marktext: "裔", + intro: { + name2: "裔", + content: "mark", }, - mod:{ - maxHandcard:function(player,num){ - if(player.hasZhuSkill('olxueyi')) return num+player.countMark('olxueyi'); + mod: { + maxHandcard: function (player, num) { + if (player.hasZhuSkill("olxueyi")) return num + player.countMark("olxueyi"); }, }, - group:'olxueyi_draw', + group: "olxueyi_draw", }, - olxueyi_draw:{ - audio:'olxueyi', - trigger:{player:'phaseUseBegin'}, - prompt2:'弃置一枚「裔」标记,然后摸一张牌', - check:function(event,player){ - return player.getUseValue('wanjian')>0||!player.needsToDiscard(); + olxueyi_draw: { + audio: "olxueyi", + trigger: { player: "phaseUseBegin" }, + prompt2: "弃置一枚「裔」标记,然后摸一张牌", + check: function (event, player) { + return player.getUseValue("wanjian") > 0 || !player.needsToDiscard(); }, - filter:function(event,player){ - return player.hasZhuSkill('olxueyi')&&player.hasMark('olxueyi'); + filter: function (event, player) { + return player.hasZhuSkill("olxueyi") && player.hasMark("olxueyi"); }, - content:function(){ - player.removeMark('olxueyi',1); + content: function () { + player.removeMark("olxueyi", 1); player.draw(); }, }, - olhunzi:{ - audio:2, - audioname:['re_sunyi'], - inherit:'hunzi', - content:function(){ + olhunzi: { + audio: 2, + audioname: ["re_sunyi"], + inherit: "hunzi", + content: function () { player.awakenSkill(event.name); player.loseMaxHp(); //player.recover(); - player.addSkills(['reyingzi','gzyinghun']); - player.addTempSkill('olhunzi_effect'); + player.addSkills(["reyingzi", "gzyinghun"]); + player.addTempSkill("olhunzi_effect"); }, - subSkill:{ - effect:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - player.chooseDrawRecover(2,true); + subSkill: { + effect: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + player.chooseDrawRecover(2, true); }, }, }, }, - olzhiba:{ - audio:2, - unique:true, - zhuSkill:true, - global:'olzhiba2', + olzhiba: { + audio: 2, + unique: true, + zhuSkill: true, + global: "olzhiba2", }, - olzhiba2:{ - ai:{ - order:1, - result:{ - target:function(player,target){ - if(player.hasZhuSkill('olzhiba')&&!player.hasSkill('olzhiba3')&&target.group=='wu'){ - if(player.countCards('h',function(card){ - var val=get.value(card); - if(val<0) return true; - if(val<=5){ - return get.number(card)>=12; - } - if(val<=6){ - return get.number(card)>=13; - } - return false; - })>0) return -1; + olzhiba2: { + ai: { + order: 1, + result: { + target: function (player, target) { + if ( + player.hasZhuSkill("olzhiba") && + !player.hasSkill("olzhiba3") && + target.group == "wu" + ) { + if ( + player.countCards("h", function (card) { + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return get.number(card) >= 12; + } + if (val <= 6) { + return get.number(card) >= 13; + } + return false; + }) > 0 + ) + return -1; return 0; - } - else{ - if(player.countCards('h','du')&&get.attitude(player,target)<0) return -1; - if(player.countCards('h')<=player.hp) return 0; - var maxnum=0; - var cards2=target.getCards('h'); - for(var i=0;imaxnum){ - maxnum=get.number(cards2[i]); + } else { + if (player.countCards("h", "du") && get.attitude(player, target) < 0) + return -1; + if (player.countCards("h") <= player.hp) return 0; + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); } } - if(maxnum>10) maxnum=10; - if(maxnum<5&&cards2.length>1) maxnum=5; - var cards=player.getCards('h'); - for(var i=0;i 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; } return 0; } }, }, }, - enable:'phaseUse', + enable: "phaseUse", //usable:1, - prompt:'请选择〖制霸〗的目标', - filter:function(event,player){ - if(player.hasZhuSkill('olzhiba')&&!player.hasSkill('olzhiba3')&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='wu'&&player.canCompare(current); - })) return true; - return (player.group=='wu'&&game.hasPlayer(function(current){ - return current!=player&¤t.hasZhuSkill('olzhiba',player)&&!current.hasSkill('olzhiba3')&&player.canCompare(current); - })); + prompt: "请选择〖制霸〗的目标", + filter: function (event, player) { + if ( + player.hasZhuSkill("olzhiba") && + !player.hasSkill("olzhiba3") && + game.hasPlayer(function (current) { + return current != player && current.group == "wu" && player.canCompare(current); + }) + ) + return true; + return ( + player.group == "wu" && + game.hasPlayer(function (current) { + return ( + current != player && + current.hasZhuSkill("olzhiba", player) && + !current.hasSkill("olzhiba3") && + player.canCompare(current) + ); + }) + ); }, - filterTarget:function(card,player,target){ - if(player.hasZhuSkill('olzhiba')&&!player.hasSkill('olzhiba3')&&target.group=='wu'&&player.canCompare(target)) return true; - return player.group=='wu'&&target.hasZhuSkill('olzhiba',player)&&!target.hasSkill('olzhiba3')&&player.canCompare(target); + filterTarget: function (card, player, target) { + if ( + player.hasZhuSkill("olzhiba") && + !player.hasSkill("olzhiba3") && + target.group == "wu" && + player.canCompare(target) + ) + return true; + return ( + player.group == "wu" && + target.hasZhuSkill("olzhiba", player) && + !target.hasSkill("olzhiba3") && + player.canCompare(target) + ); }, - prepare:function(cards,player,targets){ - if(player.hasZhuSkill('olzhiba')) player.logSkill('olzhiba') - if(targets[0].hasZhuSkill('olzhiba',player)) targets[0].logSkill('olzhiba'); + prepare: function (cards, player, targets) { + if (player.hasZhuSkill("olzhiba")) player.logSkill("olzhiba"); + if (targets[0].hasZhuSkill("olzhiba", player)) targets[0].logSkill("olzhiba"); }, - direct:true, - clearTime:true, - contentBefore:function(){ - 'step 0' - var list=[]; - if(player.hasZhuSkill('olzhiba')&&targets[0].group=='wu'&&!player.hasSkill('olzhiba3')) list.push(player); - if(player.group=='wu'&&targets[0].hasZhuSkill('olzhiba')&&!targets[0].hasSkill('olzhiba3')) list.push(targets[0]); - if(list.length==1){ - event.target=list[0]; + direct: true, + clearTime: true, + contentBefore: function () { + "step 0"; + var list = []; + if ( + player.hasZhuSkill("olzhiba") && + targets[0].group == "wu" && + !player.hasSkill("olzhiba3") + ) + list.push(player); + if ( + player.group == "wu" && + targets[0].hasZhuSkill("olzhiba") && + !targets[0].hasSkill("olzhiba3") + ) + list.push(targets[0]); + if (list.length == 1) { + event.target = list[0]; event.goto(2); - } - else player.chooseTarget(true,'请选择获得所有拼点牌的角色',function(card,player,target){ - return _status.event.list.includes(target); - }).set('list',list); - 'step 1' - event.target=result.targets[0]; - 'step 2' - target.addTempSkill('olzhiba3','phaseUseEnd') - if(target==targets[0]){ - target.chooseBool('是否接受来自'+get.translation(player)+'的拼点请求?').set('choice',(get.attitude(target,player)>0||target.countCards('h',function(card){ - var val=get.value(card); - if(val<0) return true; - if(val<=5){ - return get.number(card)>=12; - } - if(val<=6){ - return get.number(card)>=13; - } - return false; - })>0)).set('ai',function(){return _status.event.choice}); - } - else event._result={bool:true}; - 'step 3' - if(result.bool) event.getParent().zhiba_target=target; - else{ - game.log(target,'拒绝了',player,'的拼点请求'); - target.chat('拒绝'); + } else + player + .chooseTarget( + true, + "请选择获得所有拼点牌的角色", + function (card, player, target) { + return _status.event.list.includes(target); + } + ) + .set("list", list); + ("step 1"); + event.target = result.targets[0]; + ("step 2"); + target.addTempSkill("olzhiba3", "phaseUseEnd"); + if (target == targets[0]) { + target + .chooseBool("是否接受来自" + get.translation(player) + "的拼点请求?") + .set( + "choice", + get.attitude(target, player) > 0 || + target.countCards("h", function (card) { + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return get.number(card) >= 12; + } + if (val <= 6) { + return get.number(card) >= 13; + } + return false; + }) > 0 + ) + .set("ai", function () { + return _status.event.choice; + }); + } else event._result = { bool: true }; + ("step 3"); + if (result.bool) event.getParent().zhiba_target = target; + else { + game.log(target, "拒绝了", player, "的拼点请求"); + target.chat("拒绝"); } }, - content:function(){ - 'step 0' - event.source=event.getParent().zhiba_target; - if(!event.source){ + content: function () { + "step 0"; + event.source = event.getParent().zhiba_target; + if (!event.source) { event.finish(); } - 'step 1' - player.chooseToCompare(target).set('small',target==source&&get.attitude(player,target)>0).clear=false; - 'step 2' - if(player==source&&result.bool||target==source&&!result.bool){ - event.cards=[result.player,result.target].filterInD('d'); - if(!event.cards.length) event.finish(); - else source.chooseControl('ok','cancel2').set('dialog',['是否获得拼点牌?',event.cards]).set('ai',function(){ - if(get.value(event.cards,source,'raw')<=0) return false; - return true; - }); - } - else event.finish(); - 'step 3' - if(result.control!='cancel2') source.gain(event.cards,'gain2','log'); + ("step 1"); + player + .chooseToCompare(target) + .set("small", target == source && get.attitude(player, target) > 0).clear = false; + ("step 2"); + if ((player == source && result.bool) || (target == source && !result.bool)) { + event.cards = [result.player, result.target].filterInD("d"); + if (!event.cards.length) event.finish(); + else + source + .chooseControl("ok", "cancel2") + .set("dialog", ["是否获得拼点牌?", event.cards]) + .set("ai", function () { + if (get.value(event.cards, source, "raw") <= 0) return false; + return true; + }); + } else event.finish(); + ("step 3"); + if (result.control != "cancel2") source.gain(event.cards, "gain2", "log"); else ui.clear(); }, }, - olzhiba3:{}, - rehuashen:{ - unique:true, - audio:2, - trigger:{ - global:'phaseBefore', - player:['enterGame','phaseBegin','phaseEnd','rehuashen'], + olzhiba3: {}, + rehuashen: { + unique: true, + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseBegin", "phaseEnd", "rehuashen"], }, - filter:function(event,player,name){ - if(event.name!='phase') return true; - if(name=='phaseBefore') return game.phaseNumber==0; - return player.storage.rehuashen&&player.storage.rehuashen.character.length>0; + filter: function (event, player, name) { + if (event.name != "phase") return true; + if (name == "phaseBefore") return game.phaseNumber == 0; + return player.storage.rehuashen && player.storage.rehuashen.character.length > 0; }, - direct:true, - content:function(){ - "step 0" - var name=event.triggername; - if(trigger.name!='phase'||(name=='phaseBefore'&&game.phaseNumber==0)){ - player.logSkill('rehuashen'); - lib.skill.rehuashen.addHuashens(player,3); - event.logged=true; + direct: true, + content: function () { + "step 0"; + var name = event.triggername; + if (trigger.name != "phase" || (name == "phaseBefore" && game.phaseNumber == 0)) { + player.logSkill("rehuashen"); + lib.skill.rehuashen.addHuashens(player, 3); + event.logged = true; } - _status.noclearcountdown=true; - event.videoId=lib.status.videoId++; - var cards=player.storage.rehuashen.character.slice(0); - var skills=[]; - var sto=player.storage.rehuashen; - for(var i in player.storage.rehuashen.map){ + _status.noclearcountdown = true; + event.videoId = lib.status.videoId++; + var cards = player.storage.rehuashen.character.slice(0); + var skills = []; + var sto = player.storage.rehuashen; + for (var i in player.storage.rehuashen.map) { skills.addArray(player.storage.rehuashen.map[i]); } - var cond='out'; - if(event.triggername=='phaseBegin'){ - cond='in'; + var cond = "out"; + if (event.triggername == "phaseBegin") { + cond = "in"; } skills.randomSort(); - skills.sort(function(a,b){ - return get.skillRank(b,cond)-get.skillRank(a,cond); + skills.sort(function (a, b) { + return get.skillRank(b, cond) - get.skillRank(a, cond); }); - event.aiChoice=skills[0]; - var choice='更换技能'; - if(event.aiChoice==player.storage.rehuashen.current2||get.skillRank(event.aiChoice,cond)<1) choice='弃置化身'; - if(player.isOnline2()){ - player.send(function(cards,id){ - var dialog=ui.create.dialog('是否发动【化身】?',[cards,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); - dialog.videoId=id; - },cards,event.videoId); + event.aiChoice = skills[0]; + var choice = "更换技能"; + if ( + event.aiChoice == player.storage.rehuashen.current2 || + get.skillRank(event.aiChoice, cond) < 1 + ) + choice = "弃置化身"; + if (player.isOnline2()) { + player.send( + function (cards, id) { + var dialog = ui.create.dialog("是否发动【化身】?", [ + cards, + (item, type, position, noclick, node) => + lib.skill.rehuashen.$createButton( + item, + type, + position, + noclick, + node + ), + ]); + dialog.videoId = id; + }, + cards, + event.videoId + ); } - event.dialog=ui.create.dialog(get.prompt('rehuashen'),[cards,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); - event.dialog.videoId=event.videoId; - if(!event.isMine()){ - event.dialog.style.display='none'; + event.dialog = ui.create.dialog(get.prompt("rehuashen"), [ + cards, + (item, type, position, noclick, node) => + lib.skill.rehuashen.$createButton(item, type, position, noclick, node), + ]); + event.dialog.videoId = event.videoId; + if (!event.isMine()) { + event.dialog.style.display = "none"; } - if(event.logged) event._result={control:'更换技能'}; - else player.chooseControl('弃置化身','更换技能','cancel2').set('ai',function(){ - return _status.event.choice; - }).set('choice',choice); - "step 1" - event.control=result.control; - if(event.control=='cancel2'){ - if(player.isOnline2()){ - player.send('closeDialog',event.videoId); + if (event.logged) event._result = { control: "更换技能" }; + else + player + .chooseControl("弃置化身", "更换技能", "cancel2") + .set("ai", function () { + return _status.event.choice; + }) + .set("choice", choice); + ("step 1"); + event.control = result.control; + if (event.control == "cancel2") { + if (player.isOnline2()) { + player.send("closeDialog", event.videoId); } delete _status.noclearcountdown; - if(!_status.noclearcountdown){ + if (!_status.noclearcountdown) { game.stopCountChoose(); } event.dialog.close(); - event.finish();return; + event.finish(); + return; } - if(!event.logged){player.logSkill('rehuashen');event.logged=true} - var next=player.chooseButton(true).set('dialog',event.videoId); - if(event.control=='弃置化身'){ - next.set('selectButton',[1,2]); - next.set('filterButton',function(button){ - return button.link!=_status.event.current; + if (!event.logged) { + player.logSkill("rehuashen"); + event.logged = true; + } + var next = player.chooseButton(true).set("dialog", event.videoId); + if (event.control == "弃置化身") { + next.set("selectButton", [1, 2]); + next.set("filterButton", function (button) { + return button.link != _status.event.current; }); - next.set('current',player.storage.rehuashen.current); - } - else{ - next.set('ai',function(button){ - return player.storage.rehuashen.map[button.link].includes(_status.event.choice)?2.5:1+Math.random(); + next.set("current", player.storage.rehuashen.current); + } else { + next.set("ai", function (button) { + return player.storage.rehuashen.map[button.link].includes(_status.event.choice) + ? 2.5 + : 1 + Math.random(); }); - next.set('choice',event.aiChoice); + next.set("choice", event.aiChoice); } - var prompt=event.control=='弃置化身'?'选择制衡至多两张化身':'选择要切换的化身'; - var func=function(id,prompt){ - var dialog=get.idDialog(id); - if(dialog){ - dialog.content.childNodes[0].innerHTML=prompt; + var prompt = event.control == "弃置化身" ? "选择制衡至多两张化身" : "选择要切换的化身"; + var func = function (id, prompt) { + var dialog = get.idDialog(id); + if (dialog) { + dialog.content.childNodes[0].innerHTML = prompt; } + }; + if (player.isOnline2()) { + player.send(func, event.videoId, prompt); + } else if (event.isMine()) { + func(event.videoId, prompt); } - if(player.isOnline2()){ - player.send(func,event.videoId,prompt); - } - else if(event.isMine()){ - func(event.videoId,prompt); - } - "step 2" - if(result.bool&&event.control!='弃置化身'){ - event.card=result.links[0]; - var func=function(card,id){ - var dialog=get.idDialog(id); - if(dialog){ - for(var i=0;i{ - const name=player.name?player.name:player.name1; - if(name){ - const sex=get.character(name,0); - const group=get.character(name,1); - if(player.sex!=sex){ - game.broadcastAll((player,sex)=>{ - player.sex=sex; - },player,sex); - game.log(player,'将性别变为了','#y'+get.translation(sex)+'性'); + init: function (player, skill) { + if (!player.storage[skill]) + player.storage[skill] = { + character: [], + map: {}, + }; + player.when("dieBegin").then(() => { + const name = player.name ? player.name : player.name1; + if (name) { + const sex = get.character(name, 0); + const group = get.character(name, 1); + if (player.sex != sex) { + game.broadcastAll( + (player, sex) => { + player.sex = sex; + }, + player, + sex + ); + game.log(player, "将性别变为了", "#y" + get.translation(sex) + "性"); } - if(player.group!=group) player.changeGroup(group); + if (player.group != group) player.changeGroup(group); } }); }, - banned:['lisu','sp_xiahoudun','xushao','jsrg_xushao','zhoutai','old_zhoutai','shixie','xin_zhoutai','dc_shixie','old_shixie'], - bannedType:['Charlotte','主公技','觉醒技','限定技','隐匿技','使命技'], - addHuashen:function(player){ - if(!player.storage.rehuashen) return; - if(!_status.characterlist){ + banned: [ + "lisu", + "sp_xiahoudun", + "xushao", + "jsrg_xushao", + "zhoutai", + "old_zhoutai", + "shixie", + "xin_zhoutai", + "dc_shixie", + "old_shixie", + ], + bannedType: ["Charlotte", "主公技", "觉醒技", "限定技", "隐匿技", "使命技"], + addHuashen: function (player) { + if (!player.storage.rehuashen) return; + if (!_status.characterlist) { lib.skill.pingjian.initList(); } _status.characterlist.randomSort(); - for(let i=0;i<_status.characterlist.length;i++){ - let name=_status.characterlist[i]; - if(name.indexOf('zuoci')!=-1||name.indexOf('key_')==0||name.indexOf('sp_key_')==0||get.is.double(name)||lib.skill.rehuashen.banned.includes(name)||player.storage.rehuashen.character.includes(name)) continue; - let skills=lib.character[name][3].filter(skill=>{ - const categories=get.skillCategoriesOf(skill); - return !categories.some(type=>lib.skill.rehuashen.bannedType.includes(type)); - }) - if(skills.length){ + for (let i = 0; i < _status.characterlist.length; i++) { + let name = _status.characterlist[i]; + if ( + name.indexOf("zuoci") != -1 || + name.indexOf("key_") == 0 || + name.indexOf("sp_key_") == 0 || + get.is.double(name) || + lib.skill.rehuashen.banned.includes(name) || + player.storage.rehuashen.character.includes(name) + ) + continue; + let skills = lib.character[name][3].filter((skill) => { + const categories = get.skillCategoriesOf(skill); + return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type)); + }); + if (skills.length) { player.storage.rehuashen.character.push(name); - player.storage.rehuashen.map[name]=skills; + player.storage.rehuashen.map[name] = skills; _status.characterlist.remove(name); return name; } } }, - addHuashens:function(player,num){ - var list=[]; - for(var i=0;ilib.skill.rehuashen.bannedType.includes(type)); + $createButton: function (item, type, position, noclick, node) { + node = ui.create.buttonPresets.character(item, "character", position, noclick); + const info = lib.character[item]; + const skills = info[3].filter(function (skill) { + const categories = get.skillCategoriesOf(skill); + return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type)); }); - if(skills.length){ - const skillstr=skills.map(i=>`[${get.translation(i)}]`).join('
    '); - const skillnode=ui.create.caption( - `
    ${skillstr}
    `,node); - skillnode.style.left='2px'; - skillnode.style.bottom='2px'; + if (skills.length) { + const skillstr = skills.map((i) => `[${get.translation(i)}]`).join("
    "); + const skillnode = ui.create.caption( + `
    ${skillstr}
    `, + node + ); + skillnode.style.left = "2px"; + skillnode.style.bottom = "2px"; } - node._customintro=function(uiintro,evt){ - const character=node.link,characterInfo=get.character(node.link); - let capt=get.translation(character); - if(characterInfo){ - capt+=`  ${get.translation(characterInfo[0])}`; + node._customintro = function (uiintro, evt) { + const character = node.link, + characterInfo = get.character(node.link); + let capt = get.translation(character); + if (characterInfo) { + capt += `  ${get.translation(characterInfo[0])}`; let charactergroup; - const charactergroups=get.is.double(character,true); - if(charactergroups) charactergroup=charactergroups.map(i=>get.translation(i)).join('/'); - else charactergroup=get.translation(characterInfo[1]); - capt+=`  ${charactergroup}`; + const charactergroups = get.is.double(character, true); + if (charactergroups) + charactergroup = charactergroups.map((i) => get.translation(i)).join("/"); + else charactergroup = get.translation(characterInfo[1]); + capt += `  ${charactergroup}`; } uiintro.add(capt); - if(lib.characterTitle[node.link]){ + if (lib.characterTitle[node.link]) { uiintro.addText(get.colorspan(lib.characterTitle[node.link])); } - for(let i=0;i
    '+get.translation(skills[i])+'
    '+get.skillInfoTranslation(skills[i])+'
    '); + for (let i = 0; i < skills.length; i++) { + if (lib.translate[skills[i] + "_info"]) { + let translation = + lib.translate[skills[i] + "_ab"] || + get.translation(skills[i]).slice(0, 2); + if (lib.skill[skills[i]] && lib.skill[skills[i]].nobracket) { + uiintro.add( + '
    ' + + get.translation(skills[i]) + + "
    " + + get.skillInfoTranslation(skills[i]) + + "
    " + ); + } else { + uiintro.add( + '
    【' + + translation + + "】
    " + + get.skillInfoTranslation(skills[i]) + + "
    " + ); } - else{ - uiintro.add('
    【'+translation+'】
    '+get.skillInfoTranslation(skills[i])+'
    '); - } - if(lib.translate[skills[i]+'_append']){ - uiintro._place_text=uiintro.add('
    '+lib.translate[skills[i]+'_append']+'
    ') + if (lib.translate[skills[i] + "_append"]) { + uiintro._place_text = uiintro.add( + '
    ' + lib.translate[skills[i] + "_append"] + "
    " + ); } } } - } + }; return node; }, // createAudio:(character,skillx,name)=>{ @@ -10776,2156 +13110,2613 @@ game.import('character', function () { // } // }); // }, - mark:true, - intro:{ - onunmark:function(storage,player){ + mark: true, + intro: { + onunmark: function (storage, player) { _status.characterlist.addArray(storage.character); - storage.character=[]; + storage.character = []; }, - mark:function(dialog,storage,player){ - if(storage&&storage.current) dialog.addSmall([[storage.current],(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); - if(storage&&storage.current2) dialog.add('
    【'+get.translation(lib.translate[storage.current2+'_ab']||get.translation(storage.current2).slice(0,2))+'】
    '+get.skillInfoTranslation(storage.current2,player)+'
    '); - if(storage&&storage.character.length){ - if(player.isUnderControl(true)){ - dialog.addSmall([storage.character,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); + mark: function (dialog, storage, player) { + if (storage && storage.current) + dialog.addSmall([ + [storage.current], + (item, type, position, noclick, node) => + lib.skill.rehuashen.$createButton(item, type, position, noclick, node), + ]); + if (storage && storage.current2) + dialog.add( + '
    【' + + get.translation( + lib.translate[storage.current2 + "_ab"] || + get.translation(storage.current2).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(storage.current2, player) + + "
    " + ); + if (storage && storage.character.length) { + if (player.isUnderControl(true)) { + dialog.addSmall([ + storage.character, + (item, type, position, noclick, node) => + lib.skill.rehuashen.$createButton( + item, + type, + position, + noclick, + node + ), + ]); + } else { + dialog.addText("共有" + get.cnNumber(storage.character.length) + "张“化身”"); } - else{ - dialog.addText('共有'+get.cnNumber(storage.character.length)+'张“化身”'); - } - } - else{ - return '没有化身'; + } else { + return "没有化身"; } }, - content:function(storage,player){ - return '共有'+get.cnNumber(storage.character.length)+'张“化身”' + content: function (storage, player) { + return "共有" + get.cnNumber(storage.character.length) + "张“化身”"; }, - markcount:function(storage,player){ - if(storage&&storage.character) return storage.character.length; + markcount: function (storage, player) { + if (storage && storage.character) return storage.character.length; return 0; }, }, }, - rexinsheng:{ - unique:true, - audio:2, - trigger:{player:'damageEnd'}, - frequent:true, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - lib.skill.rehuashen.addHuashens(player,1); - 'step 2' - if(--event.num>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2('rexinsheng')).set('frequentSkill',event.name); - } - else event.finish(); - 'step 3' - if(result.bool&&player.hasSkill('rexinsheng')){ - player.logSkill('rexinsheng'); + rexinsheng: { + unique: true, + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); + lib.skill.rehuashen.addHuashens(player, 1); + ("step 2"); + if ( + --event.num > 0 && + player.hasSkill(event.name) && + !get.is.blocked(event.name, player) + ) { + player.chooseBool(get.prompt2("rexinsheng")).set("frequentSkill", event.name); + } else event.finish(); + ("step 3"); + if (result.bool && player.hasSkill("rexinsheng")) { + player.logSkill("rexinsheng"); event.goto(1); } }, }, - reguhuo:{ - audio:2, - derivation:'rechanyuan', - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - return lib.inpile.includes(name)&&player.countCards('h')>0&&!player.hasSkill('reguhuo_phase'); + reguhuo: { + audio: 2, + derivation: "rechanyuan", + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return ( + lib.inpile.includes(name) && + player.countCards("h") > 0 && + !player.hasSkill("reguhuo_phase") + ); }, - filter:function(event,player){ - if(!player.countCards('hs')||player.hasSkill('reguhuo_phase')) return false; - for(var i of lib.inpile){ - var type=get.type(i); - if((type=='basic'||type=='trick')&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name:i,nature:j},'unsure'),player,event)) return true; + filter: function (event, player) { + if (!player.countCards("hs") || player.hasSkill("reguhuo_phase")) return false; + for (var i of lib.inpile) { + var type = get.type(i); + if ( + (type == "basic" || type == "trick") && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name: i, nature: j }, "unsure"), + player, + event + ) + ) + return true; } } } return false; }, - chooseButton:{ - dialog:function(){ - var list=[]; - for(var i of lib.inpile){ - var type=get.type(i); - if(type=='basic'||type=='trick') list.push([type,'',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function () { + var list = []; + for (var i of lib.inpile) { + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } } - return ui.create.dialog('蛊惑',[list,'vcard']); + return ui.create.dialog("蛊惑", [list, "vcard"]); }, - filter:function(button,player){ - var evt=_status.event.getParent(); - return evt.filterCard(get.autoViewAs({name:button.link[2],nature:button.link[3]},'unsure'),player,evt); + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard( + get.autoViewAs({ name: button.link[2], nature: button.link[3] }, "unsure"), + player, + evt + ); }, - check:function(button){ - var player=_status.event.player; - var rand=_status.event.getParent().getRand('reguhuo'); - var hasEnemy=game.hasPlayer(function(current){ - return current!=player&&!current.hasSkill('rechanyuan')&&(get.realAttitude||get.attitude)(current,player)<0; + check: function (button) { + var player = _status.event.player; + var rand = _status.event.getParent().getRand("reguhuo"); + var hasEnemy = game.hasPlayer(function (current) { + return ( + current != player && + !current.hasSkill("rechanyuan") && + (get.realAttitude || get.attitude)(current, player) < 0 + ); }); - var card={name:button.link[2],nature:button.link[3]}; - var val=_status.event.getParent().type=='phase'?player.getUseValue(card):1; - if(val<=0) return 0; - if(hasEnemy&&rand>0.3){ - if(!player.countCards('h',function(cardx){ - if(card.name==cardx.name){ - if(card.name!='sha') return true; - return get.is.sameNature(card,cardx); - } - return false; - })) return 0; - return 3*val; + var card = { name: button.link[2], nature: button.link[3] }; + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + if (val <= 0) return 0; + if (hasEnemy && rand > 0.3) { + if ( + !player.countCards("h", function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); + } + return false; + }) + ) + return 0; + return 3 * val; } return val; }, - backup:function(links,player){ + backup: function (links, player) { return { - viewAs:{ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, }, - filterCard:function(card,player,target){ - var result=true; - var suit=card.suit,number=card.number; - card.suit='none';card.number=null; - var mod=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod!='unchanged') result=mod; - card.suit=suit;card.number=number; + filterCard: function (card, player, target) { + var result = true; + var suit = card.suit, + number = card.number; + card.suit = "none"; + card.number = null; + var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod != "unchanged") result = mod; + card.suit = suit; + card.number = number; return result; }, - position:'hs', - ignoreMod:true, - ai1:function(card){ - var player=_status.event.player; - var hasEnemy=game.hasPlayer(function(current){ - return current!=player&&!current.hasSkill('rechanyuan')&&(get.realAttitude||get.attitude)(current,player)<0; + position: "hs", + ignoreMod: true, + ai1: function (card) { + var player = _status.event.player; + var hasEnemy = game.hasPlayer(function (current) { + return ( + current != player && + !current.hasSkill("rechanyuan") && + (get.realAttitude || get.attitude)(current, player) < 0 + ); }); - var rand=_status.event.getRand('reguhuo'); - var cardx=lib.skill.reguhuo_backup.viewAs; - if(hasEnemy&&rand>0.3){ - if(card.name==cardx.name&&(card.name!='sha'||get.is.sameNature(card,cardx))) return 10; + var rand = _status.event.getRand("reguhuo"); + var cardx = lib.skill.reguhuo_backup.viewAs; + if (hasEnemy && rand > 0.3) { + if ( + card.name == cardx.name && + (card.name != "sha" || get.is.sameNature(card, cardx)) + ) + return 10; return 0; } - return 6-get.value(card); + return 6 - get.value(card); }, - precontent:function(){ - player.logSkill('reguhuo'); - player.addTempSkill('reguhuo_guess'); - var card=event.result.cards[0]; - event.result.card.suit=get.suit(card); - event.result.card.number=get.number(card); + precontent: function () { + player.logSkill("reguhuo"); + player.addTempSkill("reguhuo_guess"); + var card = event.result.cards[0]; + event.result.card.suit = get.suit(card); + event.result.card.number = get.number(card); }, - } + }; }, - prompt:function(links){ - return '将一张手牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; + prompt: function (links) { + return ( + "将一张手牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, }, - ai:{ - fireAttack:true, - respondShan:true, - respondSha:true, - skillTagFilter:function(player){ - if(!player.countCards('hs')||player.hasSkill('reguhuo_phase')) return false; + ai: { + fireAttack: true, + respondShan: true, + respondSha: true, + skillTagFilter: function (player) { + if (!player.countCards("hs") || player.hasSkill("reguhuo_phase")) return false; }, - order:10, - result:{ - player:1, + order: 10, + result: { + player: 1, }, - threaten:1.3, + threaten: 1.3, }, }, - reguhuo_guess:{ - trigger:{ - player:['useCardBefore','respondBefore'], + reguhuo_guess: { + trigger: { + player: ["useCardBefore", "respondBefore"], }, - forced:true, - silent:true, - popup:false, - charlotte:true, - firstDo:true, - filter:function(event,player){ - return event.skill&&event.skill.indexOf('reguhuo_')==0; + forced: true, + silent: true, + popup: false, + charlotte: true, + firstDo: true, + filter: function (event, player) { + return event.skill && event.skill.indexOf("reguhuo_") == 0; }, - content:function(){ - 'step 0' - player.addTempSkill('reguhuo_phase'); - event.fake=false; - var card=trigger.cards[0]; - if(card.name!=trigger.card.name||(card.name=='sha'&&!get.is.sameNature(trigger.card,card))) event.fake=true; + content: function () { + "step 0"; + player.addTempSkill("reguhuo_phase"); + event.fake = false; + var card = trigger.cards[0]; + if ( + card.name != trigger.card.name || + (card.name == "sha" && !get.is.sameNature(trigger.card, card)) + ) + event.fake = true; //player.logSkill('reguhuo'); - player.line(trigger.targets,get.nature(trigger.card)); - event.cardTranslate=get.translation(trigger.card.name); - trigger.card.number=get.number(card); - trigger.card.suit=get.suit(card); + player.line(trigger.targets, get.nature(trigger.card)); + event.cardTranslate = get.translation(trigger.card.name); + trigger.card.number = get.number(card); + trigger.card.suit = get.suit(card); //trigger.line=false; - trigger.skill='reguhuo_backup'; - if(trigger.card.name=='sha'&&get.natureList(trigger.card).length) event.cardTranslate=get.translation(trigger.card.nature)+event.cardTranslate; - player.popup(event.cardTranslate,trigger.name=='useCard'?'metal':'wood'); - event.prompt='是否质疑'+get.translation(player)+'声明的'+event.cardTranslate+'?'; - game.log(player,'声明了','#y'+event.cardTranslate); - event.targets=game.filterPlayer(function(current){ - return current!=player&&!current.hasSkill('rechanyuan'); - }).sortBySeat(); - event.targets2=event.targets.slice(0); - player.lose(card,ui.ordering).relatedEvent=trigger; - if(!event.targets.length) event.goto(5); - else if(_status.connectMode) event.goto(3); - event.betrays=[]; - 'step 1' - event.target=targets.shift(); - event.target.chooseButton([event.prompt,[['reguhuo_ally','reguhuo_betray'],'vcard']],true,function(button){ - var player=_status.event.player; - var evt=_status.event.getParent('reguhuo_guess'); - if(!evt) return Math.random(); - var ally=button.link[2]=='reguhuo_ally'; - if(ally&&(player.hp<=1||get.attitude(player,evt.player)>=0)) return 1.1; - return Math.random(); - }); - 'step 2' - if(result.links[0][2]=='reguhuo_betray'){ + trigger.skill = "reguhuo_backup"; + if (trigger.card.name == "sha" && get.natureList(trigger.card).length) + event.cardTranslate = get.translation(trigger.card.nature) + event.cardTranslate; + player.popup(event.cardTranslate, trigger.name == "useCard" ? "metal" : "wood"); + event.prompt = + "是否质疑" + get.translation(player) + "声明的" + event.cardTranslate + "?"; + game.log(player, "声明了", "#y" + event.cardTranslate); + event.targets = game + .filterPlayer(function (current) { + return current != player && !current.hasSkill("rechanyuan"); + }) + .sortBySeat(); + event.targets2 = event.targets.slice(0); + player.lose(card, ui.ordering).relatedEvent = trigger; + if (!event.targets.length) event.goto(5); + else if (_status.connectMode) event.goto(3); + event.betrays = []; + ("step 1"); + event.target = targets.shift(); + event.target.chooseButton( + [event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], + true, + function (button) { + var player = _status.event.player; + var evt = _status.event.getParent("reguhuo_guess"); + if (!evt) return Math.random(); + var ally = button.link[2] == "reguhuo_ally"; + if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; + return Math.random(); + } + ); + ("step 2"); + if (result.links[0][2] == "reguhuo_betray") { event.betrays.push(target); target.addExpose(0.2); } - event.goto(targets.length?1:5); - 'step 3' - var list=event.targets.map(function(target){ - return [target,[event.prompt,[['reguhuo_ally','reguhuo_betray'],'vcard']],true]; + event.goto(targets.length ? 1 : 5); + ("step 3"); + var list = event.targets.map(function (target) { + return [target, [event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true]; }); - player.chooseButtonOL(list).set('switchToAuto',function(){ - _status.event.result='ai'; - }).set('processAI',function(){ - var choice=Math.random()>0.5?'reguhuo_ally':'reguhuo_betray'; - var player=_status.event.player; - var evt=_status.event.getParent('reguhuo_guess'); - if(player.hp<=1||evt&&(get.realAttitude||get.attitude)(player,evt.player)>=0) choice='reguhuo_ally'; - return { - bool:true, - links:[['','',choice]], - } - }); - 'step 4' - for(var i in result){ - if(result[i].links[0][2]=='reguhuo_betray'){ + player + .chooseButtonOL(list) + .set("switchToAuto", function () { + _status.event.result = "ai"; + }) + .set("processAI", function () { + var choice = Math.random() > 0.5 ? "reguhuo_ally" : "reguhuo_betray"; + var player = _status.event.player; + var evt = _status.event.getParent("reguhuo_guess"); + if ( + player.hp <= 1 || + (evt && (get.realAttitude || get.attitude)(player, evt.player) >= 0) + ) + choice = "reguhuo_ally"; + return { + bool: true, + links: [["", "", choice]], + }; + }); + ("step 4"); + for (var i in result) { + if (result[i].links[0][2] == "reguhuo_betray") { event.betrays.push(lib.playerOL[i]); lib.playerOL[i].addExpose(0.2); } } - 'step 5' - for(var i of event.targets2){ - var b=event.betrays.includes(i); - i.popup(b?'质疑':'不质疑',b?'fire':'wood'); - game.log(i,b?'#y质疑':'#g不质疑'); + ("step 5"); + for (var i of event.targets2) { + var b = event.betrays.includes(i); + i.popup(b ? "质疑" : "不质疑", b ? "fire" : "wood"); + game.log(i, b ? "#y质疑" : "#g不质疑"); } game.delay(); - 'step 6' + ("step 6"); player.showCards(trigger.cards); - if(event.betrays.length){ + if (event.betrays.length) { event.betrays.sortBySeat(); - if(event.fake){ + if (event.fake) { game.asyncDraw(event.betrays); trigger.cancel(); trigger.getParent().goto(0); - game.log(player,'声明的','#y'+event.cardTranslate,'作废了') - } - else{ - var next=game.createEvent('reguhuo_final',false); + game.log(player, "声明的", "#y" + event.cardTranslate, "作废了"); + } else { + var next = game.createEvent("reguhuo_final", false); event.next.remove(next); trigger.after.push(next); - next.targets=event.betrays; + next.targets = event.betrays; next.setContent(lib.skill.reguhuo_guess.contentx); event.finish(); } - } - else event.finish(); - 'step 7' + } else event.finish(); + ("step 7"); game.delayx(); }, - contentx:function(){ - 'step 0' - event.target=targets.shift(); - event.target.chooseToDiscard('弃置一张牌或失去1点体力').set('ai',function(card){ - return 9-get.value(card); + contentx: function () { + "step 0"; + event.target = targets.shift(); + event.target.chooseToDiscard("弃置一张牌或失去1点体力").set("ai", function (card) { + return 9 - get.value(card); }); - 'step 1' - if(!result.bool) target.loseHp(); - 'step 2' - target.addSkills('rechanyuan'); - if(targets.length) event.goto(0); + ("step 1"); + if (!result.bool) target.loseHp(); + ("step 2"); + target.addSkills("rechanyuan"); + if (targets.length) event.goto(0); }, }, - reguhuo_backup:{}, - reguhuo_phase:{}, - rechanyuan:{ - init:function(player,skill){ - if(player.hp<=1){ + reguhuo_backup: {}, + reguhuo_phase: {}, + rechanyuan: { + init: function (player, skill) { + if (player.hp <= 1) { player.logSkill(skill); - player.addSkill('rechanyuan_log'); + player.addSkill("rechanyuan_log"); } player.addSkillBlocker(skill); }, - onremove:function(player,skill){ - player.removeSkill('rechanyuan_log'); + onremove: function (player, skill) { + player.removeSkill("rechanyuan_log"); player.removeSkillBlocker(skill); }, - skillBlocker:function(skill,player){ - return skill!='chanyuan'&&skill!='rechanyuan'&&!lib.skill[skill].charlotte&&player.hp<=1; + skillBlocker: function (skill, player) { + return ( + skill != "chanyuan" && + skill != "rechanyuan" && + !lib.skill[skill].charlotte && + player.hp <= 1 + ); }, - mark:true, - intro:{ - content:function(storage,player,skill){ - var str='
  • 锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。'; - var list=player.getSkills(null,false,false).filter(function(i){ - return lib.skill.rechanyuan.skillBlocker(i,player); + mark: true, + intro: { + content: function (storage, player, skill) { + var str = + "
  • 锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。"; + var list = player.getSkills(null, false, false).filter(function (i) { + return lib.skill.rechanyuan.skillBlocker(i, player); }); - if(list.length) str+=('
  • 失效技能:'+get.translation(list)) + if (list.length) str += "
  • 失效技能:" + get.translation(list); return str; }, }, - audio:2, - trigger:{player:'changeHp'}, - filter:function(event,player){ - return (player.hp<=1)!=(player.hasSkill('rechanyuan_log')); + audio: 2, + trigger: { player: "changeHp" }, + filter: function (event, player) { + return player.hp <= 1 != player.hasSkill("rechanyuan_log"); }, - direct:true, - locked:true, - content:function(){ - if(player.hp<=1){ - player.logSkill('rechanyuan'); - player.addSkill('rechanyuan_log'); - } - else player.removeSkill('rechanyuan_log'); + direct: true, + locked: true, + content: function () { + if (player.hp <= 1) { + player.logSkill("rechanyuan"); + player.addSkill("rechanyuan_log"); + } else player.removeSkill("rechanyuan_log"); }, - subSkill:{ - log:{charlotte:true}, + subSkill: { + log: { charlotte: true }, }, }, - botu:{ - audio:2, - trigger:{player:'phaseAfter'}, - frequent:true, - filter:function(event,player){ - var history=player.getHistory('useCard',function(evt){ + botu: { + audio: 2, + trigger: { player: "phaseAfter" }, + frequent: true, + filter: function (event, player) { + var history = player.getHistory("useCard", function (evt) { return evt.isPhaseUsing(); }); - var suits=[]; - for(var i=0;i1&&get.number(card)<10) return 5; + judgeCheck: function (card, bool) { + var suit = get.suit(card); + if (suit == "spade") { + if (bool && get.number(card) > 1 && get.number(card) < 10) return 5; return 4; } - if(suit=='club') return 2; + if (suit == "club") return 2; return 0; }, - content:function(){ - player.judge(lib.skill.xinleiji.judgeCheck).judge2=function(result){ - return result.bool?true:false; + content: function () { + player.judge(lib.skill.xinleiji.judgeCheck).judge2 = function (result) { + return result.bool ? true : false; }; }, - ai:{ - useShan:true, - effect:{ - target:function(card,player,target,current){ + ai: { + useShan: true, + effect: { + target: function (card, player, target, current) { let name; - if(typeof card=='object'){ - if(card.viewAs) name=card.viewAs; - else name=get.name(card); + if (typeof card == "object") { + if (card.viewAs) name = card.viewAs; + else name = get.name(card); } - if(name=='shandian'||get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ - target: target, - card: card - },true)){ - let club=0,spade=0; - if(game.hasPlayer(function(current){ - return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; - })){ - club=2; - spade=4; + if ( + name == "shandian" || + (get.tag(card, "respondShan") && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + )) + ) { + let club = 0, + spade = 0; + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(target, current) < 0 && + get.damageEffect(current, target, target, "thunder") > 0 + ); + }) + ) { + club = 2; + spade = 4; } - if(!target.isHealthy()) club+=2; - if(!club&&!spade) return 1; - if(name==='sha'){ - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) return; - } - else if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); - if(!target.hasSkillTag('rejudge')) return [1,(club+spade)/4]; - let pos=(player==target||player.hasSkillTag('viewHandcard',null,target,true))?'hes':'e',better=club>spade?'club':'spade',max=0; - target.hasCard(function(cardx){ - if(get.suit(cardx)==better){ - max=2; + if (!target.isHealthy()) club += 2; + if (!club && !spade) return 1; + if (name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) + return 1 - 0.1 * Math.min(5, target.countCards("hs")); + if (!target.hasSkillTag("rejudge")) return [1, (club + spade) / 4]; + let pos = + player == target || + player.hasSkillTag("viewHandcard", null, target, true) + ? "hes" + : "e", + better = club > spade ? "club" : "spade", + max = 0; + target.hasCard(function (cardx) { + if (get.suit(cardx) == better) { + max = 2; return true; } - if(spade&&get.color(cardx)=='black') max=1; - },pos); - if(max==2) return [1,Math.max(club,spade)]; - if(max==1) return [1,Math.min(club,spade)]; - if(pos=='e') return [1,Math.min(Math.max(1,target.countCards('hs'))*(club+spade)/4,Math.max(club,spade))]; - return [1,(club+spade)/4]; + if (spade && get.color(cardx) == "black") max = 1; + }, pos); + if (max == 2) return [1, Math.max(club, spade)]; + if (max == 1) return [1, Math.min(club, spade)]; + if (pos == "e") + return [ + 1, + Math.min( + (Math.max(1, target.countCards("hs")) * (club + spade)) / 4, + Math.max(club, spade) + ), + ]; + return [1, (club + spade) / 4]; } - if(name=='lebu'||name=='bingliang') return [target.hasSkillTag('rejudge')?0.4:1,2,target.hasSkillTag('rejudge')?0.4:1,0]; - } - } - } - }, - xinleiji_misa:{ - audio:'xinleiji', - trigger:{player:'judgeEnd'}, - direct:true, - disableReason:['暴虐','助祭','弘仪','孤影'], - filter:function(event,player){ - return !lib.skill.xinleiji_misa.disableReason.includes(event.judgestr)&&['spade','club'].includes(event.result.suit); - }, - content:function(){ - 'step 0' - event.num=1+['club','spade'].indexOf(trigger.result.suit); - event.logged=false; - if(event.num==1&&player.isDamaged()){ - event.logged=true; - player.logSkill('xinleiji'); - player.recover(); - } - player.chooseTarget('雷击:是否对一名角色造成'+event.num+'点雷电伤害?').ai=function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player,'thunder'); - }; - 'step 1' - if(result.bool&&result.targets&&result.targets.length){ - if(!event.logged) player.logSkill('xinleiji',result.targets); - else player.line(result.targets,'thunder'); - result.targets[0].damage(event.num,'thunder'); - } - }, - }, - xinguidao:{ - audio:2, - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&get.itemtype(card)=='card'&&get.color(card)=='black'&&get.type(card)=='equip') num*1.35; - }, - aiValue:function(player,card,num){ - if(num>0&&get.itemtype(card)=='card'&&get.color(card)=='black') return num*1.15; - }, - aiUseful:function(player,card,num){ - if(num>0&&get.itemtype(card)=='card'&&get.color(card)=='black') return num*1.35; - } - }, - locked:false, - trigger:{global:'judge'}, - filter:function(event,player){ - return player.countCards('hes',{color:'black'})>0; - }, - direct:true, - content:function(){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('xinguidao'),'hes',function(card){ - if(get.color(card)!='black') return false; - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0){ - if(trigger.player!=player) return 0; - if(game.hasPlayer(function(current){ - return get.attitude(player,current)<0; - })){ - var checkx=lib.skill.xinleiji.judgeCheck(card,true)-lib.skill.xinleiji.judgeCheck(judging); - if(checkx>0) return checkx; - } - return 0; - } - if(attitude>0){ - return result; - } - else{ - return -result; - } - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight','xinguidao','noOrdering'); - } - else{ - event.finish(); - } - "step 2" - if(result.bool){ - player.$gain2(trigger.player.judging[0]); - player.gain(trigger.player.judging[0]); - var card=result.cards[0]; - if(get.suit(card)=='spade'&&get.number(card)>1&&get.number(card)<10) player.draw('nodelay'); - trigger.player.judging[0]=result.cards[0]; - trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); - } - "step 3" - game.delay(2); - }, - ai:{ - rejudge:true, - tag:{ - rejudge:1 - } - } - }, - reqingguo:{ - mod:{ - aiValue:function(player,card,num){ - if(get.name(card)!='shan'&&get.color(card)!='black') return; - var cards=player.getCards('hs',function(card){ - return get.name(card)=='shan'||get.color(card)=='black'; - }); - cards.sort(function(a,b){ - return (get.name(b)=='shan'?1:2)-(get.name(a)=='shan'?1:2); - }); - var geti=function(){ - if(cards.includes(card)){ - return cards.indexOf(card); - } - return cards.length; - }; - if(get.name(card)=='shan') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6; - return Math.max(num,[6.5,4,3][Math.min(geti(),2)]); - }, - aiUseful:function(){ - return lib.skill.reqingguo.mod.aiValue.apply(this,arguments); - }, - }, - locked:false, - audio:2, - enable:['chooseToRespond','chooseToUse'], - filterCard:function(card){ - return get.color(card)=='black'; - }, - position:'hes', - viewAs:{name:'shan'}, - viewAsFilter:function(player){ - if(!player.countCards('hes',{color:'black'})) return false; - }, - prompt:'将一张黑色牌当闪打出', - check:function(){return 1}, - ai:{ - order:2, - respondShan:true, - skillTagFilter:function(player){ - if(!player.countCards('hes',{color:'black'})) return false; - }, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0) return 0.6 - } - } - } - }, - reqiangxi:{ - subSkill:{ - off:{ - sub:true, - }, - }, - audio:2, - enable:"phaseUse", - filterCard:function (card){ - return get.subtype(card)=='equip1'; - }, - selectCard:function (){ - return [0,1]; - }, - filterTarget:function (card,player,target){ - if(player==target) return false; - if(target.hasSkill('reqiangxi_off')) return false; - return player.inRange(target); - }, - content:function (){ - "step 0" - if(cards.length==0){ - player.loseHp(); - } - "step 1" - target.addTempSkill('reqiangxi_off'); - target.damage('nocard'); - }, - check:function (card){ - return 10-get.value(card); - }, - position:"he", - ai:{ - order:8.5, - result:{ - target:function (player,target){ - if(!ui.selected.cards.length){ - if(player.hp<2) return 0; - if(target.hp>=player.hp) return 0; - } - return get.damageEffect(target,player); + if (name == "lebu" || name == "bingliang") + return [ + target.hasSkillTag("rejudge") ? 0.4 : 1, + 2, + target.hasSkillTag("rejudge") ? 0.4 : 1, + 0, + ]; }, }, }, - threaten:1.5, }, - rehuoji:{ - position:"hes", - audio:2, - audioname:['ol_sp_zhugeliang','ol_pangtong'], - enable:"chooseToUse", - filterCard:function (card){ - return get.color(card)=='red'; + xinleiji_misa: { + audio: "xinleiji", + trigger: { player: "judgeEnd" }, + direct: true, + disableReason: ["暴虐", "助祭", "弘仪", "孤影"], + filter: function (event, player) { + return ( + !lib.skill.xinleiji_misa.disableReason.includes(event.judgestr) && + ["spade", "club"].includes(event.result.suit) + ); }, - viewAs:{ - name:"huogong", - }, - viewAsFilter:function (player){ - if(!player.countCards('hes',{color:'red'})) return false; - }, - prompt:"将一张红色牌当火攻使用", - check:function (card){ - var player=get.player(); - if(player.countCards('h')>player.hp){ - return 6-get.value(card); + content: function () { + "step 0"; + event.num = 1 + ["club", "spade"].indexOf(trigger.result.suit); + event.logged = false; + if (event.num == 1 && player.isDamaged()) { + event.logged = true; + player.logSkill("xinleiji"); + player.recover(); + } + player.chooseTarget("雷击:是否对一名角色造成" + event.num + "点雷电伤害?").ai = + function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player, "thunder"); + }; + ("step 1"); + if (result.bool && result.targets && result.targets.length) { + if (!event.logged) player.logSkill("xinleiji", result.targets); + else player.line(result.targets, "thunder"); + result.targets[0].damage(event.num, "thunder"); } - return 4-get.value(card) - }, - ai:{ - fireAttack:true, }, }, - rekanpo:{ - mod:{ - aiValue:function(player,card,num){ - if(get.name(card)!='wuxie'&&get.color(card)!='black') return; - var cards=player.getCards('hs',function(card){ - return get.name(card)=='wuxie'||get.color(card)=='black'; + xinguidao: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + get.itemtype(card) == "card" && + get.color(card) == "black" && + get.type(card) == "equip" + ) + num * 1.35; + }, + aiValue: function (player, card, num) { + if (num > 0 && get.itemtype(card) == "card" && get.color(card) == "black") + return num * 1.15; + }, + aiUseful: function (player, card, num) { + if (num > 0 && get.itemtype(card) == "card" && get.color(card) == "black") + return num * 1.35; + }, + }, + locked: false, + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("hes", { color: "black" }) > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("xinguidao"), + "hes", + function (card) { + if (get.color(card) != "black") return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) { + if (trigger.player != player) return 0; + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) < 0; + }) + ) { + var checkx = + lib.skill.xinleiji.judgeCheck(card, true) - + lib.skill.xinleiji.judgeCheck(judging); + if (checkx > 0) return checkx; + } + return 0; + } + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "xinguidao", "noOrdering"); + } else { + event.finish(); + } + ("step 2"); + if (result.bool) { + player.$gain2(trigger.player.judging[0]); + player.gain(trigger.player.judging[0]); + var card = result.cards[0]; + if (get.suit(card) == "spade" && get.number(card) > 1 && get.number(card) < 10) + player.draw("nodelay"); + trigger.player.judging[0] = result.cards[0]; + trigger.orderingCards.addArray(result.cards); + game.log(trigger.player, "的判定牌改为", result.cards[0]); + } + ("step 3"); + game.delay(2); + }, + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, + }, + reqingguo: { + mod: { + aiValue: function (player, card, num) { + if (get.name(card) != "shan" && get.color(card) != "black") return; + var cards = player.getCards("hs", function (card) { + return get.name(card) == "shan" || get.color(card) == "black"; }); - cards.sort(function(a,b){ - return (get.name(b)=='wuxie'?1:2)-(get.name(a)=='wuxie'?1:2); + cards.sort(function (a, b) { + return (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2); }); - var geti=function(){ - if(cards.includes(card)){ + var geti = function () { + if (cards.includes(card)) { return cards.indexOf(card); } return cards.length; }; - if(get.name(card)=='wuxie') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6; - return Math.max(num,[6,4,3][Math.min(geti(),2)]); + if (get.name(card) == "shan") + return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); }, - aiUseful:function(){ - return lib.skill.rekanpo.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.reqingguo.mod.aiValue.apply(this, arguments); }, }, - locked:false, - audio:2, - audioname:['ol_sp_zhugeliang','ol_pangtong'], - position:"hes", - enable:"chooseToUse", - filterCard:function (card){ - return get.color(card)=='black'; + locked: false, + audio: 2, + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card) { + return get.color(card) == "black"; }, - viewAsFilter:function (player){ - return player.countCards('hes',{color:'black'})>0; + position: "hes", + viewAs: { name: "shan" }, + viewAsFilter: function (player) { + if (!player.countCards("hes", { color: "black" })) return false; }, - viewAs:{ - name:"wuxie", + prompt: "将一张黑色牌当闪打出", + check: function () { + return 1; + }, + ai: { + order: 2, + respondShan: true, + skillTagFilter: function (player) { + if (!player.countCards("hes", { color: "black" })) return false; + }, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.6; + }, + }, }, - prompt:"将一张黑色牌当无懈可击使用", - check:function (card){return 8-get.value(card)}, }, - reshuangxiong:{ - audio:"shuangxiong", - audioname:['re_yanwen'], - group:['reshuangxiong1',"reshuangxiong2"], - }, - reshuangxiong1:{ - audio:"shuangxiong1", - audioname2:{ - re_yanwen:'shuangxiong_re_yanwen1', + reqiangxi: { + subSkill: { + off: { + sub: true, + }, }, - trigger:{player:"phaseDrawBegin1"}, - check:function (event,player){ - if(player.countCards('h')>player.hp) return true; - if(player.countCards('h')>3) return true; + audio: 2, + enable: "phaseUse", + filterCard: function (card) { + return get.subtype(card) == "equip1"; + }, + selectCard: function () { + return [0, 1]; + }, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (target.hasSkill("reqiangxi_off")) return false; + return player.inRange(target); + }, + content: function () { + "step 0"; + if (cards.length == 0) { + player.loseHp(); + } + ("step 1"); + target.addTempSkill("reqiangxi_off"); + target.damage("nocard"); + }, + check: function (card) { + return 10 - get.value(card); + }, + position: "he", + ai: { + order: 8.5, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (target.hp >= player.hp) return 0; + } + return get.damageEffect(target, player); + }, + }, + }, + threaten: 1.5, + }, + rehuoji: { + position: "hes", + audio: 2, + audioname: ["ol_sp_zhugeliang", "ol_pangtong"], + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "red"; + }, + viewAs: { + name: "huogong", + }, + viewAsFilter: function (player) { + if (!player.countCards("hes", { color: "red" })) return false; + }, + prompt: "将一张红色牌当火攻使用", + check: function (card) { + var player = get.player(); + if (player.countCards("h") > player.hp) { + return 6 - get.value(card); + } + return 4 - get.value(card); + }, + ai: { + fireAttack: true, + }, + }, + rekanpo: { + mod: { + aiValue: function (player, card, num) { + if (get.name(card) != "wuxie" && get.color(card) != "black") return; + var cards = player.getCards("hs", function (card) { + return get.name(card) == "wuxie" || get.color(card) == "black"; + }); + cards.sort(function (a, b) { + return (get.name(b) == "wuxie" ? 1 : 2) - (get.name(a) == "wuxie" ? 1 : 2); + }); + var geti = function () { + if (cards.includes(card)) { + return cards.indexOf(card); + } + return cards.length; + }; + if (get.name(card) == "wuxie") + return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6, 4, 3][Math.min(geti(), 2)]); + }, + aiUseful: function () { + return lib.skill.rekanpo.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + audio: 2, + audioname: ["ol_sp_zhugeliang", "ol_pangtong"], + position: "hes", + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "black"; + }, + viewAsFilter: function (player) { + return player.countCards("hes", { color: "black" }) > 0; + }, + viewAs: { + name: "wuxie", + }, + prompt: "将一张黑色牌当无懈可击使用", + check: function (card) { + return 8 - get.value(card); + }, + }, + reshuangxiong: { + audio: "shuangxiong", + audioname: ["re_yanwen"], + group: ["reshuangxiong1", "reshuangxiong2"], + }, + reshuangxiong1: { + audio: "shuangxiong1", + audioname2: { + re_yanwen: "shuangxiong_re_yanwen1", + }, + trigger: { player: "phaseDrawBegin1" }, + check: function (event, player) { + if (player.countCards("h") > player.hp) return true; + if (player.countCards("h") > 3) return true; return false; }, - filter:function(event,player){ + filter: function (event, player) { return !event.numFixed; }, - prompt2:function(){ - return '放弃摸牌,然后亮出牌堆顶的两张牌并选择获得其中的一张。本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用'; + prompt2: function () { + return "放弃摸牌,然后亮出牌堆顶的两张牌并选择获得其中的一张。本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用"; }, - content:function(){ - "step 0" + content: function () { + "step 0"; trigger.changeToZero(); - event.cards=get.cards(2); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - var str; - if(player==game.me&&!_status.auto){ - str='【双雄】选择获得其中一张牌'; - } - else{ - str='双雄'; - } - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - event.time=get.utc(); - game.addVideo('showCards',player,['双雄',get.cardsInfo(event.cards)]); - game.addVideo('delay',null,2); - "step 1" - var next=player.chooseButton([1,1],true); - next.set('dialog',event.videoId); - next.set('ai',function(button){ - var player=_status.event.player; - var color=get.color(button.link); - var value=get.value(button.link,player); - if(player.countCards('h',{color:color})>player.countCards('h',['red','black'].remove(color)[0])) value+=5; + event.cards = get.cards(2); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) { + str = "【双雄】选择获得其中一张牌"; + } else { + str = "双雄"; + } + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + event.time = get.utc(); + game.addVideo("showCards", player, ["双雄", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + ("step 1"); + var next = player.chooseButton([1, 1], true); + next.set("dialog", event.videoId); + next.set("ai", function (button) { + var player = _status.event.player; + var color = get.color(button.link); + var value = get.value(button.link, player); + if ( + player.countCards("h", { color: color }) > + player.countCards("h", ["red", "black"].remove(color)[0]) + ) + value += 5; return value; }); - "step 2" - if(result.bool&&result.links){ - var cards2=[]; - for(var i=0;i0){ - game.delay(0,time); + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); } - "step 3" - game.broadcastAll('closeDialog',event.videoId); - var card2=event.card2; - player.gain(card2,'gain2'); - player.addTempSkill('shuangxiong2'); - player.markAuto('shuangxiong2',[get.color(card2,false)]); + ("step 3"); + game.broadcastAll("closeDialog", event.videoId); + var card2 = event.card2; + player.gain(card2, "gain2"); + player.addTempSkill("shuangxiong2"); + player.markAuto("shuangxiong2", [get.color(card2, false)]); }, }, - reshuangxiong2:{ - trigger:{ - player:"damageEnd", + reshuangxiong2: { + trigger: { + player: "damageEnd", }, - direct:true, - filter:function (event,player){ - var evt=event.getParent(); - return (evt&&evt.name=='juedou'&&evt[player==evt.player?'targetCards':'playerCards'].length)>0; + direct: true, + filter: function (event, player) { + var evt = event.getParent(); + return ( + (evt && + evt.name == "juedou" && + evt[player == evt.player ? "targetCards" : "playerCards"].length) > 0 + ); }, - content:function (){ - "step 0" - var evt=trigger.getParent(); - var cards=evt[player==evt.player?'targetCards':'playerCards'].slice(0); - for(var i=0;i0&&['useCard','respond'].includes(event.getParent().name); + frequent: true, + filter: function (event, player) { + return ( + player != _status.currentPhase && + event.hs && + event.hs.length > 0 && + ["useCard", "respond"].includes(event.getParent().name) + ); }, - content:function (){ - "step 0" - event.card=get.cards(); + content: function () { + "step 0"; + event.card = get.cards(); player.showCards(event.card); - event.same=false; - if(get.type(event.card[0],'trick')==get.type(trigger.getParent().card,'trick')) event.same=true; - player.chooseTarget('选择获得此牌的角色',true).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.du){ - if(target.hasSkillTag('nodu')) return 0; - return -att; - } - if(!_status.event.same) att+=target==_status.event.player?1:0; - if(att>0){ - return att+Math.max(0,5-target.countCards('h')); - } - return att; - }).set('du',event.card.name=='du').set('same',event.same); - "step 1" - if(result.targets){ - player.line(result.targets,'green'); - result.targets[0].gain(event.card,'gain2'); - if(!event.same) player.chooseToDiscard(true,'he'); + event.same = false; + if (get.type(event.card[0], "trick") == get.type(trigger.getParent().card, "trick")) + event.same = true; + player + .chooseTarget("选择获得此牌的角色", true) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.du) { + if (target.hasSkillTag("nodu")) return 0; + return -att; + } + if (!_status.event.same) att += target == _status.event.player ? 1 : 0; + if (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du") + .set("same", event.same); + ("step 1"); + if (result.targets) { + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "gain2"); + if (!event.same) player.chooseToDiscard(true, "he"); } }, - ai:{ - effect:{ - target:function (card,player,target){ - if(get.tag(card,'respond')&&target.countCards('h')>1) return [1,0.2]; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2]; }, }, }, }, - "new_liyu":{ - audio:"liyu", - trigger:{ - source:"damageSource", + new_liyu: { + audio: "liyu", + trigger: { + source: "damageSource", }, - filter:function (event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&event.card.name=='sha'&&event.player!=player&&event.player.isIn()&&event.player.countGainableCards(player,'hej')>0; + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + event.card.name == "sha" && + event.player != player && + event.player.isIn() && + event.player.countGainableCards(player, "hej") > 0 + ); }, - direct:true, - content:function (){ - 'step 0' - player.gainPlayerCard(get.prompt('new_liyu',trigger.player),trigger.player,'hej','visibleMove').set('ai',function(button){ - var player=_status.event.player,target=_status.event.target; - if(get.attitude(player,target)>0&&get.position(button.link)==='j') return 4+get.value(button.link); - if(get.type(button.link)==='equip') return _status.event.juedou; - return 3; - }).set('juedou',(()=>{ - if(get.attitude(player,trigger.player)>0&&game.hasPlayer(function(current){ - return (player.canUse({name:'juedou'},current)&¤t!=trigger.player&¤t!=player&&get.effect(current,{name:'juedou'},player,_status.event.player)>2); - })) return 5; - if(game.hasPlayer(function(current){ - return (player.canUse({name:'juedou'},current)&¤t!=trigger.player&¤t!=player&&get.effect(current,{name:'juedou'},player,_status.event.player)<0); - })) return 1; - return 4; - })()).set('logSkill',['new_liyu',trigger.player]); - 'step 1' - if(result.bool){ - if(get.type(result.cards[0])!='equip'){ + direct: true, + content: function () { + "step 0"; + player + .gainPlayerCard( + get.prompt("new_liyu", trigger.player), + trigger.player, + "hej", + "visibleMove" + ) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.target; + if (get.attitude(player, target) > 0 && get.position(button.link) === "j") + return 4 + get.value(button.link); + if (get.type(button.link) === "equip") return _status.event.juedou; + return 3; + }) + .set( + "juedou", + (() => { + if ( + get.attitude(player, trigger.player) > 0 && + game.hasPlayer(function (current) { + return ( + player.canUse({ name: "juedou" }, current) && + current != trigger.player && + current != player && + get.effect( + current, + { name: "juedou" }, + player, + _status.event.player + ) > 2 + ); + }) + ) + return 5; + if ( + game.hasPlayer(function (current) { + return ( + player.canUse({ name: "juedou" }, current) && + current != trigger.player && + current != player && + get.effect( + current, + { name: "juedou" }, + player, + _status.event.player + ) < 0 + ); + }) + ) + return 1; + return 4; + })() + ) + .set("logSkill", ["new_liyu", trigger.player]); + ("step 1"); + if (result.bool) { + if (get.type(result.cards[0]) != "equip") { trigger.player.draw(); event.finish(); - } - else{ - if(!game.hasPlayer(function(current){ - return current!=player&¤t!=trigger.player&&player.canUse('juedou',current); - })){ + } else { + if ( + !game.hasPlayer(function (current) { + return ( + current != player && + current != trigger.player && + player.canUse("juedou", current) + ); + }) + ) { event.finish(); return; } - trigger.player.chooseTarget(true,function(card,player,target){ - var evt=_status.event.getParent(); - return evt.player.canUse({name:'juedou'},target)&&target!=_status.event.player; - },'请选择一名角色,视为'+get.translation(player)+'对其使用【决斗】').set('ai',function(target){ - var evt=_status.event.getParent(); - return get.effect(target,{name:'juedou'},evt.player,_status.event.player)-2; - }); + trigger.player + .chooseTarget( + true, + function (card, player, target) { + var evt = _status.event.getParent(); + return ( + evt.player.canUse({ name: "juedou" }, target) && + target != _status.event.player + ); + }, + "请选择一名角色,视为" + get.translation(player) + "对其使用【决斗】" + ) + .set("ai", function (target) { + var evt = _status.event.getParent(); + return ( + get.effect( + target, + { name: "juedou" }, + evt.player, + _status.event.player + ) - 2 + ); + }); } - } - else event.finish(); - 'step 2' - if(result.targets){ - player.useCard({name:'juedou',isCard:true},result.targets[0],'noai'); + } else event.finish(); + ("step 2"); + if (result.targets) { + player.useCard({ name: "juedou", isCard: true }, result.targets[0], "noai"); } }, - ai:{ - halfneg:true, + ai: { + halfneg: true, }, }, - new_retuxi:{ - audio:"retuxi", - trigger:{ - player:"phaseDrawBegin2", + new_retuxi: { + audio: "retuxi", + trigger: { + player: "phaseDrawBegin2", }, - direct:true, - preHidden:true, - filter:function(event,player){ - return event.num>0&&!event.numFixed&&game.hasPlayer(function(target){ - return target.countCards('h')>0&&player!=target; - }); + direct: true, + preHidden: true, + filter: function (event, player) { + return ( + event.num > 0 && + !event.numFixed && + game.hasPlayer(function (target) { + return target.countCards("h") > 0 && player != target; + }) + ); }, - content:function (){ - "step 0" - var num=get.copy(trigger.num); - if(get.mode()=='guozhan'&&num>2) num=2; - player.chooseTarget(get.prompt('new_retuxi'),'获得至多'+get.translation(num)+'名角色的各一张手牌,然后少摸等量的牌',[1,num],function(card,player,target){ - return target.countCards('h')>0&&player!=target; - },function(target){ - var att=get.attitude(_status.event.player,target); - if(target.hasSkill('tuntian')) return att/10; - return 1-att; - }).setHiddenSkill('new_retuxi'); - "step 1" - if(result.bool){ + content: function () { + "step 0"; + var num = get.copy(trigger.num); + if (get.mode() == "guozhan" && num > 2) num = 2; + player + .chooseTarget( + get.prompt("new_retuxi"), + "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌", + [1, num], + function (card, player, target) { + return target.countCards("h") > 0 && player != target; + }, + function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ) + .setHiddenSkill("new_retuxi"); + ("step 1"); + if (result.bool) { result.targets.sortBySeat(); - player.logSkill('new_retuxi',result.targets); + player.logSkill("new_retuxi", result.targets); player.gainMultiple(result.targets); - trigger.num-=result.targets.length; - } - else{ + trigger.num -= result.targets.length; + } else { event.finish(); } - "step 2" - if(trigger.num<=0) game.delay(); + ("step 2"); + if (trigger.num <= 0) game.delay(); }, - ai:{ - threaten:1.6, - expose:0.2, + ai: { + threaten: 1.6, + expose: 0.2, }, }, - "new_reyiji":{ - audio:"reyiji", - trigger:{ - player:"damageEnd", + new_reyiji: { + audio: "reyiji", + trigger: { + player: "damageEnd", }, - frequent:true, - filter:function (event){ - return (event.num>0) + frequent: true, + filter: function (event) { + return event.num > 0; }, - getIndex(event, player, triggername){ + getIndex(event, player, triggername) { return event.num; }, - content:function (){ - 'step 0' + content: function () { + "step 0"; player.draw(2); - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - event.num=2; - 'step 1' + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + event.num = 2; + ("step 1"); player.chooseCardTarget({ - filterCard:function(card){ - return get.itemtype(card)=='card'&&!card.hasGaintag('reyiji_tag'); + filterCard: function (card) { + return get.itemtype(card) == "card" && !card.hasGaintag("reyiji_tag"); }, - filterTarget:lib.filter.notMe, - selectCard:[1,event.num], - prompt:'请选择要分配的卡牌和目标', - ai1:function(card){ - if(!ui.selected.cards.length) return 1; + filterTarget: lib.filter.notMe, + selectCard: [1, event.num], + prompt: "请选择要分配的卡牌和目标", + ai1: function (card) { + if (!ui.selected.cards.length) return 1; return 0; }, - ai2:function(target){ - var player=_status.event.player,card=ui.selected.cards[0]; - var val=target.getUseValue(card); - if(val>0) return val*get.attitude(player,target)*2; - return get.value(card,target)*get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = target.getUseValue(card); + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); }, }); - 'step 2' - if(result.bool){ - var res=result.cards,target=result.targets[0].playerid; - player.addGaintag(res,'reyiji_tag'); - event.num-=res.length - if(!event.given_map[target]) event.given_map[target]=[]; + ("step 2"); + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "reyiji_tag"); + event.num -= res.length; + if (!event.given_map[target]) event.given_map[target] = []; event.given_map[target].addArray(res); - if(event.num>0) event.goto(1); - } - else if(event.num==2){ - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + if (event.num > 0) event.goto(1); + } else if (event.num == 2) { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } event.finish(); } - 'step 3' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + ("step 3"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - var map=[],cards=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - if(player!==source&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.18); - map.push([source,event.given_map[i]]); + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) + player.addExpose(0.18); + map.push([source, event.given_map[i]]); cards.addArray(event.given_map[i]); } game.loseAsync({ - gain_list:map, - player:player, - cards:cards, - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); }, - ai:{ - maixie:true, - "maixie_hp":true, - result:{ - effect:function (card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()) num=0.7; - else num=0.5; + ai: { + maixie: true, + maixie_hp: true, + result: { + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; } - if(player.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (player.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } }, }, - threaten:0.6, + threaten: 0.6, }, }, - "new_rejianxiong":{ - audio:"rejianxiong", - audioname:['shen_caopi'], - trigger:{ - player:"damageEnd", + new_rejianxiong: { + audio: "rejianxiong", + audioname: ["shen_caopi"], + trigger: { + player: "damageEnd", }, - content:function (){ - "step 0" - if(get.itemtype(trigger.cards)=='cards'&&get.position(trigger.cards[0],true)=='o'){ - player.gain(trigger.cards,"gain2"); + content: function () { + "step 0"; + if ( + get.itemtype(trigger.cards) == "cards" && + get.position(trigger.cards[0], true) == "o" + ) { + player.gain(trigger.cards, "gain2"); } - player.draw('nodelay'); + player.draw("nodelay"); }, - ai:{ - maixie:true, - "maixie_hp":true, - effect:{ - target:function (card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')&&player!=target){ - var cards=card.cards,evt=_status.event; - if(evt.player==target&&card.name=='damage'&&evt.getParent().type=='card') cards=evt.getParent().cards.filterInD(); - if(target.hp<=1) return; - if(get.itemtype(cards)!='cards') return; - for(var i of cards){ - if(get.name(i,target)=='tao') return [1,5]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) { + var cards = card.cards, + evt = _status.event; + if ( + evt.player == target && + card.name == "damage" && + evt.getParent().type == "card" + ) + cards = evt.getParent().cards.filterInD(); + if (target.hp <= 1) return; + if (get.itemtype(cards) != "cards") return; + for (var i of cards) { + if (get.name(i, target) == "tao") return [1, 5]; } - if(get.value(cards,target)>=(7+target.getDamagedHp())) return [1,3]; - return [1,0.6]; + if (get.value(cards, target) >= 7 + target.getDamagedHp()) return [1, 3]; + return [1, 0.6]; } }, }, }, }, - "new_reluoyi":{ - audio:"reluoyi", - trigger:{ - player:"phaseDrawBegin1", + new_reluoyi: { + audio: "reluoyi", + trigger: { + player: "phaseDrawBegin1", }, - forced:true, - locked:false, - filter:function(event,player){ + forced: true, + locked: false, + filter: function (event, player) { return !event.numFixed; }, - content:function (){ - "step 0" - var cards=get.cards(3); + content: function () { + "step 0"; + var cards = get.cards(3); game.cardsGotoOrdering(cards); - player.showCards(cards,'裸衣'); - var cardsx=[]; - for(var i=0;i=trigger.num; + event.cards = cardsx; + player.chooseBool( + "是否放弃摸牌" + (cardsx.length ? ",改为获得" + get.translation(cardsx) : "") + "?" + ).ai = function () { + var num = 3; + return cardsx.length >= trigger.num; }; - "step 1" - if(result.bool){ - if(cards.length) player.gain(cards,'gain2'); + ("step 1"); + if (result.bool) { + if (cards.length) player.gain(cards, "gain2"); //game.cardsDiscard(cards2); - player.addTempSkill('reluoyi2',{player:'phaseBefore'}); + player.addTempSkill("reluoyi2", { player: "phaseBefore" }); trigger.changeToZero(); } //else game.cardsDiscard(cards); }, }, - "new_rewusheng":{ - mod:{ - targetInRange:function (card){ - if(get.suit(card)=='diamond'&&card.name=='sha') return true; + new_rewusheng: { + mod: { + targetInRange: function (card) { + if (get.suit(card) == "diamond" && card.name == "sha") return true; }, }, - locked:false, - audio:"wusheng", - audioname:['re_guanyu','guanzhang','jsp_guanyu','guansuo','re_guanzhang','dc_jsp_guanyu'], - audioname2:{ - dc_guansuo:'wusheng_guansuo', + locked: false, + audio: "wusheng", + audioname: [ + "re_guanyu", + "guanzhang", + "jsp_guanyu", + "guansuo", + "re_guanzhang", + "dc_jsp_guanyu", + ], + audioname2: { + dc_guansuo: "wusheng_guansuo", }, - enable:["chooseToRespond","chooseToUse"], - filterCard:function(card,player){ - if(get.zhu(player,'shouyue')) return true; - return get.color(card)=='red'; + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card, player) { + if (get.zhu(player, "shouyue")) return true; + return get.color(card) == "red"; }, - position:"hes", - viewAs:{ - name:"sha", + position: "hes", + viewAs: { + name: "sha", }, - viewAsFilter:function(player){ - if(get.zhu(player,'shouyue')){ - if(!player.countCards('hes')) return false; - } - else{ - if(!player.countCards('hes',{color:'red'})) return false; + viewAsFilter: function (player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; } }, - prompt:"将一张红色牌当杀使用或打出", - check:function(card){ - var val=get.value(card); - if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); - return 5-val; + prompt: "将一张红色牌当杀使用或打出", + check: function (card) { + var val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 5 - val; }, - ai:{ - respondSha:true, - skillTagFilter:function(player){ - if(get.zhu(player,'shouyue')){ - if(!player.countCards('hes')) return false; - } - else{ - if(!player.countCards('hes',{color:'red'})) return false; + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; } }, }, }, - wusheng_guansuo:{audio:2}, - "new_yijue":{ - audio:"yijue", - enable:"phaseUse", - usable:1, - position:"he", - filterTarget:function (card,player,target){ - return player!=target&&target.countCards('h'); + wusheng_guansuo: { audio: 2 }, + new_yijue: { + audio: "yijue", + enable: "phaseUse", + usable: 1, + position: "he", + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); }, - filterCard:true, - check:function (card){ - return 8-get.value(card); + filterCard: true, + check: function (card) { + return 8 - get.value(card); }, - content:function (){ - "step 0" - if(!target.countCards('h')){ + content: function () { + "step 0"; + if (!target.countCards("h")) { event.finish(); return; - } - else target.chooseCard(true,'h').set('ai',function(card){ - var player=_status.event.player; - if((player.hasShan()||player.hp<3)&&get.color(card)=='black') return 0.5; - return Math.max(1,20-get.value(card)); - }); - "step 1" + } else + target.chooseCard(true, "h").set("ai", function (card) { + var player = _status.event.player; + if ((player.hasShan() || player.hp < 3) && get.color(card) == "black") return 0.5; + return Math.max(1, 20 - get.value(card)); + }); + ("step 1"); target.showCards(result.cards); - event.card2=result.cards[0]; - if(get.color(event.card2)=='black'){ - if(!target.hasSkill('fengyin')){ - target.addTempSkill('fengyin'); + event.card2 = result.cards[0]; + if (get.color(event.card2) == "black") { + if (!target.hasSkill("fengyin")) { + target.addTempSkill("fengyin"); } - target.addTempSkill('new_yijue2'); + target.addTempSkill("new_yijue2"); event.finish(); - } - else if(get.color(event.card2)=='red'){ - player.gain(event.card2,target,'give','bySelf'); - if(target.hp0; + } else if (get.color(event.card2) == "red") { + player.gain(event.card2, target, "give", "bySelf"); + if (target.hp < target.maxHp) { + player.chooseBool("是否让目标回复1点体力?").ai = function (event, player) { + return get.recoverEffect(target, player, player) > 0; }; } } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { target.recover(); } }, - ai:{ - result:{ - target:function(player,target){ - var hs=player.getCards('h'); - if(hs.length<3) return 0; - if(target.countCards('h')>target.hp+1&&get.recoverEffect(target)>0){ + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + if (target.countCards("h") > target.hp + 1 && get.recoverEffect(target) > 0) { return 1; } - if(player.canUse('sha',target)&&(player.countCards('h','sha')||player.countCards('he',{color:'red'}))){ + if ( + player.canUse("sha", target) && + (player.countCards("h", "sha") || player.countCards("he", { color: "red" })) + ) { return -2; } return -0.5; }, }, - order:9, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg.target.hasSkillTag('new_yijue2')) return false; + order: 9, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg.target.hasSkillTag("new_yijue2")) return false; }, }, }, - new_yijue2:{ - trigger:{ - player:"damageBegin1", + new_yijue2: { + trigger: { + player: "damageBegin1", }, - filter:function(event){ - return event.source&&event.source==_status.currentPhase&&event.card&&event.card.name=='sha'&&get.suit(event.card)=='heart'&&event.notLink(); + filter: function (event) { + return ( + event.source && + event.source == _status.currentPhase && + event.card && + event.card.name == "sha" && + get.suit(event.card) == "heart" && + event.notLink() + ); }, - popup:false, - forced:true, - charlotte:true, - content:function(){ + popup: false, + forced: true, + charlotte: true, + content: function () { trigger.num++; }, - mark:true, - mod:{ - cardEnabled2:function(card){ - if(get.position(card)=='h') return false; + mark: true, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; }, }, - intro:{ - content:"不能使用或打出手牌", + intro: { + content: "不能使用或打出手牌", }, }, - paoxiao_re_zhangfei:{audio:2}, - "new_repaoxiao":{ - audio:"paoxiao", - firstDo:true, - audioname2:{ - old_guanzhang:'old_fuhun', - xin_zhangfei:'paoxiao_re_zhangfei', - dc_xiahouba:'paoxiao_xiahouba', + paoxiao_re_zhangfei: { audio: 2 }, + new_repaoxiao: { + audio: "paoxiao", + firstDo: true, + audioname2: { + old_guanzhang: "old_fuhun", + xin_zhangfei: "paoxiao_re_zhangfei", + dc_xiahouba: "paoxiao_xiahouba", }, - audioname:['re_zhangfei','guanzhang','xiahouba','re_guanzhang'], - trigger:{player:'useCard1'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&(!event.audioed||!player.hasSkill('new_repaoxiao2')); + audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"], + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && (!event.audioed || !player.hasSkill("new_repaoxiao2")); }, - content:function(){ - trigger.audioed=true; - player.addTempSkill('new_repaoxiao2'); + content: function () { + trigger.audioed = true; + player.addTempSkill("new_repaoxiao2"); }, - mod:{ - cardUsable:function (card,player,num){ - if(card.name=='sha') return Infinity; + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return Infinity; }, }, - ai:{ - unequip:true, - skillTagFilter:function (player,tag,arg){ - if(!get.zhu(player,'shouyue')) return false; - if(arg&&arg.name=='sha') return true; + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (!get.zhu(player, "shouyue")) return false; + if (arg && arg.name == "sha") return true; return false; }, }, }, - new_repaoxiao2:{ - charlotte:true, - mod:{ - targetInRange:function (card,player){ - if(card.name=='sha') return true; + new_repaoxiao2: { + charlotte: true, + mod: { + targetInRange: function (card, player) { + if (card.name == "sha") return true; }, }, }, - "new_tishen":{ - trigger:{ - player:"phaseUseEnd", + new_tishen: { + trigger: { + player: "phaseUseEnd", }, - check:function (event,player){ - var num=0; - var he=player.getCards('he'); - for(var i=0;ievt.card==event.card)&&event.cards.filterInD('od').length; + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.targets && + event.targets.includes(player) && + !player.hasHistory("damage", (evt) => evt.card == event.card) && + event.cards.filterInD("od").length + ); }, - forced:true, - charlotte:true, - content:function (){ - player.gain(trigger.cards.filterInD('od'),'gain2'); + forced: true, + charlotte: true, + content: function () { + player.gain(trigger.cards.filterInD("od"), "gain2"); }, }, - new_qingjian:{ - audio:"qingjian", - trigger:{ - player:"gainAfter", - global:'loseAsyncAfter', + new_qingjian: { + audio: "qingjian", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - direct:true, - usable:1, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - if(evt&&evt.player==player) return false; - return event.getg(player).length>0; + direct: true, + usable: 1, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.player == player) return false; + return event.getg(player).length > 0; }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseCardTarget({ - position:'he', - filterCard:true, - selectCard:[1,Infinity], - filterTarget:function(card,player,target){ - return player!=target; + position: "he", + filterCard: true, + selectCard: [1, Infinity], + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ - if(card.name!='du'&&get.attitude(_status.event.player,_status.currentPhase)<0&&_status.currentPhase.needsToDiscard()) return -1; - for(var i=0;i_status.event.player.countCards('h')) return 0; - return att-4; + if (target.countCards("h") > _status.event.player.countCards("h")) return 0; + return att - 4; }, - prompt:get.prompt2('new_qingjian'), + prompt: get.prompt2("new_qingjian"), }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - var cards=result.cards; - var type=[]; - for(var i=0;i0&&get.attitude(player,current)>2); - })>1&&get.color(card)=='black'&&player.countCards('h',{color:'red'})>0) return 3-get.value(card); - return 9-get.value(card); + audio: 2, + enable: "phaseUse", + filterCard: true, + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return ( + get.recoverEffect(current, player, player) > 0 && + get.attitude(player, current) > 2 + ); + }) > 1 && + get.color(card) == "black" && + player.countCards("h", { color: "red" }) > 0 + ) + return 3 - get.value(card); + return 9 - get.value(card); }, - filter:function (event,player){ - return !player.hasSkill('new_reqingnang_off2'); + filter: function (event, player) { + return !player.hasSkill("new_reqingnang_off2"); }, - filterTarget:function (card,player,target){ - if(target.hp>=target.maxHp||target.hasSkill('new_reqingnang_off')) return false; + filterTarget: function (card, player, target) { + if (target.hp >= target.maxHp || target.hasSkill("new_reqingnang_off")) return false; return true; }, - content:function (){ - target.addTempSkill('new_reqingnang_off'); - if(get.color(cards[0])=='black') player.addTempSkill('new_reqingnang_off2'); + content: function () { + target.addTempSkill("new_reqingnang_off"); + if (get.color(cards[0]) == "black") player.addTempSkill("new_reqingnang_off2"); target.recover(); }, - ai:{ - order:9, - result:{ - target:function (player,target){ - if(target.hp==1) return 5; - if(player==target&&player.countCards('h')>player.hp) return 5; + ai: { + order: 9, + result: { + target: function (player, target) { + if (target.hp == 1) return 5; + if (player == target && player.countCards("h") > player.hp) return 5; return 2; }, }, - threaten:2, + threaten: 2, }, }, - reyaowu:{ - trigger:{player:'damageBegin3'}, - audio:'new_reyaowu', - forced:true, - filter:function(event){ - return event.card&&(get.color(event.card)!='red'||event.source&&event.source.isIn()); + reyaowu: { + trigger: { player: "damageBegin3" }, + audio: "new_reyaowu", + forced: true, + filter: function (event) { + return ( + event.card && + (get.color(event.card) != "red" || (event.source && event.source.isIn())) + ); }, - content:function(){ - trigger[get.color(trigger.card)!='red'?'player':'source'].draw(); + content: function () { + trigger[get.color(trigger.card) != "red" ? "player" : "source"].draw(); + }, + ai: { + effect: { + target: (card, player, target) => { + if ( + typeof card !== "object" || + !get.tag(card, "damage") || + target.hasSkill("gangzhi") + ) + return; + if (player.hasSkillTag("jueqing", null, true)) return; + if (get.color(card) === "red") return [1, 0, 1, 0.6]; + return [1, 0.6]; + }, + }, }, - ai:{ - effect:{ - target:(card,player,target)=>{ - if(typeof card!=='object'||!get.tag(card,'damage')||target.hasSkill('gangzhi')) return; - if(player.hasSkillTag('jueqing',null,true)) return; - if(get.color(card)==='red') return [1,0,1,0.6]; - return [1,0.6]; - } - } - } }, - "new_reyaowu":{ - trigger:{ - player:"damageBegin3", + new_reyaowu: { + trigger: { + player: "damageBegin3", }, //priority:1, - audio:2, - audioname:['sb_huaxiong'], - filter:function(event){ - return event.card&&event.card.name=='sha'&&(get.color(event.card)!='red'||event.source&&event.source.isIn()); + audio: 2, + audioname: ["sb_huaxiong"], + filter: function (event) { + return ( + event.card && + event.card.name == "sha" && + (get.color(event.card) != "red" || (event.source && event.source.isIn())) + ); }, - forced:true, - content:function(){ - if(get.color(trigger.card)!='red') player.draw(); + forced: true, + content: function () { + if (get.color(trigger.card) != "red") player.draw(); else trigger.source.chooseDrawRecover(true); }, - ai:{ - effect:{ - target:(card,player,target,current)=>{ - if(card.name=='sha'){ - if(get.color(card)=='red'){ - let num=player.isDamaged()?1.6:0.7; - if(get.attitude(player,target)>0&&player.hp<3) return [1,0,1,num]; - return [1,0,1,num/2]; + ai: { + effect: { + target: (card, player, target, current) => { + if (card.name == "sha") { + if (get.color(card) == "red") { + let num = player.isDamaged() ? 1.6 : 0.7; + if (get.attitude(player, target) > 0 && player.hp < 3) + return [1, 0, 1, num]; + return [1, 0, 1, num / 2]; } - return [1,0.6]; + return [1, 0.6]; } }, }, }, }, - reguanxing:{ - audio:'guanxing', - audioname:['jiangwei','re_jiangwei','re_zhugeliang','gexuan','ol_jiangwei'], - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - frequent:true, - filter:function(event,player,name){ - if(name=='phaseJieshuBegin'){ - return player.hasSkill('reguanxing_on'); + reguanxing: { + audio: "guanxing", + audioname: ["jiangwei", "re_jiangwei", "re_zhugeliang", "gexuan", "ol_jiangwei"], + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + frequent: true, + filter: function (event, player, name) { + if (name == "phaseJieshuBegin") { + return player.hasSkill("reguanxing_on"); } return true; }, - content:function(){ - "step 0" - var num=game.countPlayer()<4?3:5; - var cards=get.cards(num); + content: function () { + "step 0"; + var num = game.countPlayer() < 4 ? 3 : 5; + var cards = get.cards(num); game.cardsGotoOrdering(cards); - var next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('prompt','观星:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=function(list){ - var cards=list[0][1],player=_status.event.player; - var target=(_status.event.getTrigger().name=='phaseZhunbei')?player:player.next; - var att=get.sgn(get.attitude(player,target)); - var top=[]; - var judges=target.getCards('j'); - var stopped=false; - if(player!=target||!target.hasWuxie()){ - for(var i=0;i0)) break; + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; top.unshift(cards.shift()); } } - bottom=cards; - return [top,bottom]; - } - "step 1" - var top=result.moved[0]; - var bottom=result.moved[1]; + bottom = cards; + return [top, bottom]; + }; + ("step 1"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - game.cardsGotoPile( - top.concat(bottom), - ['top_cards',top], - function(event,card){ - if(event.top_cards.includes(card)) return ui.cardPile.firstChild; - return null; - } - ) - if(event.triggername=='phaseZhunbeiBegin'&&top.length==0){ - player.addTempSkill('reguanxing_on'); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], function (event, card) { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + if (event.triggername == "phaseZhunbeiBegin" && top.length == 0) { + player.addTempSkill("reguanxing_on"); } - player.popup(get.cnNumber(top.length)+'上'+get.cnNumber(bottom.length)+'下'); - game.log(player,'将'+get.cnNumber(top.length)+'张牌置于牌堆顶'); - "step 2" + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + ("step 2"); game.delayx(); }, - subSkill:{ - on:{charlotte:true} - } + subSkill: { + on: { charlotte: true }, + }, }, - reluoshen:{ - audio:2, - locked:false, - trigger:{player:'phaseZhunbeiBegin'}, - frequent:true, - content:function(){ - "step 0" - player.addTempSkill('reluoshen_add'); - event.cards=[]; - "step 1" - var next=player.judge(function(card){ - if(get.color(card)=='black') return 1.5; + reluoshen: { + audio: 2, + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + content: function () { + "step 0"; + player.addTempSkill("reluoshen_add"); + event.cards = []; + ("step 1"); + var next = player.judge(function (card) { + if (get.color(card) == "black") return 1.5; return -1.5; }); - next.judge2=function(result){ + next.judge2 = function (result) { return result.bool; }; - if(get.mode()!='guozhan'&&!player.hasSkillTag('rejudge')) next.set('callback',function(){ - if(event.judgeResult.color=='black'&&get.position(card,true)=='o'){ - player.gain(card,'gain2').gaintag.add('reluoshen'); - } - }); - else next.set('callback',function(){ - if(event.judgeResult.color=='black') event.getParent().orderingCards.remove(card); - }); - "step 2" - if(result.bool){ + if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge")) + next.set("callback", function () { + if (event.judgeResult.color == "black" && get.position(card, true) == "o") { + player.gain(card, "gain2").gaintag.add("reluoshen"); + } + }); + else + next.set("callback", function () { + if (event.judgeResult.color == "black") + event.getParent().orderingCards.remove(card); + }); + ("step 2"); + if (result.bool) { event.cards.push(result.card); - player.chooseBool('是否再次发动【洛神】?').set('frequentSkill','reluoshen'); - } - else{ - for(var i=0;i0; + }, }, - check:function(card){ - var player=_status.event.player; - if(get.position(card)=='e'){ - var subtype=get.subtype(card); - if(!game.hasPlayer(function(current){ - return current!=player&¤t.hp!=player.hp&&get.attitude(player,current)>0&&!current.countCards('e',{subtype:subtype}); - })){ + }, + rejieyin: { + audio: 2, + enable: "phaseUse", + filterCard: true, + usable: 1, + position: "he", + filter: function (event, player) { + return player.countCards("he") > 0; + }, + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e") { + var subtype = get.subtype(card); + if ( + !game.hasPlayer(function (current) { + return ( + current != player && + current.hp != player.hp && + get.attitude(player, current) > 0 && + !current.countCards("e", { subtype: subtype }) + ); + }) + ) { return 0; } - if(player.countCards('h',{subtype:subtype})) return 20-get.value(card); - return 10-get.value(card); - } - else{ - if(player.countCards('e')) return 0; - if(player.countCards('h',{type:'equip'})) return 0; - return 8-get.value(card); + if (player.countCards("h", { subtype: subtype })) return 20 - get.value(card); + return 10 - get.value(card); + } else { + if (player.countCards("e")) return 0; + if (player.countCards("h", { type: "equip" })) return 0; + return 8 - get.value(card); } }, - filterTarget:function(card,player,target){ - if(!target.hasSex('male')) return false; - var card=ui.selected.cards[0]; - if(!card) return false; - if(get.position(card)=='e'&&!target.canEquip(card)) return false; + filterTarget: function (card, player, target) { + if (!target.hasSex("male")) return false; + var card = ui.selected.cards[0]; + if (!card) return false; + if (get.position(card) == "e" && !target.canEquip(card)) return false; return true; }, - discard:false, - delay:false, - lose:false, - content:function(){ - 'step 0' - if(get.position(cards[0])=='e') event._result={index:0}; - else if(get.type(cards[0])!='equip'||!target.canEquip(cards[0])) event._result={index:1}; - else player.chooseControl().set('choiceList',[ - '将'+get.translation(cards[0])+'置入'+get.translation(target)+'的装备区', - '弃置'+get.translation(cards[0]), - ]).ai=function(){return 1}; - 'step 1' - if(result.index==0){ - player.$give(cards,target,false); + discard: false, + delay: false, + lose: false, + content: function () { + "step 0"; + if (get.position(cards[0]) == "e") event._result = { index: 0 }; + else if (get.type(cards[0]) != "equip" || !target.canEquip(cards[0])) + event._result = { index: 1 }; + else + player + .chooseControl() + .set("choiceList", [ + "将" + + get.translation(cards[0]) + + "置入" + + get.translation(target) + + "的装备区", + "弃置" + get.translation(cards[0]), + ]).ai = function () { + return 1; + }; + ("step 1"); + if (result.index == 0) { + player.$give(cards, target, false); target.equip(cards[0]); - } - else{ + } else { player.discard(cards); } - 'step 2' - if(player.hp>target.hp){ + ("step 2"); + if (player.hp > target.hp) { player.draw(); - if(target.isDamaged()) target.recover(); - } - else if(player.hptarget.hp){ - if(target.isHealthy()){ - if(!player.needsToDiscard(1)||goon()) return 0.1; + if (player.hp > target.hp) { + if (target.isHealthy()) { + if (!player.needsToDiscard(1) || goon()) return 0.1; return 0; } return 1; } return 0; - } - } - } - }, - rejiuyuan:{ - audio:2, - zhuSkill:true, - trigger:{global:'recoverBefore'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&event.player.group=='wu'&&player.hp<=event.player.hp&& - event.getParent().name!='rejiuyuan'&&player.hasZhuSkill('rejiuyuan',event.player) + }, + }, }, - content:function(){ - 'step 0' - trigger.player.chooseBool('是否对'+get.translation(player)+'发动【救援】?','改为令其回复1点体力,然后你摸一张牌').set('ai',function(){ - var evt=_status.event; - return get.attitude(evt.player,evt.getParent().player)>0; - }); - 'step 1' - if(result.bool){ - player.logSkill('rejiuyuan'); - trigger.player.line(player,'green'); + }, + rejiuyuan: { + audio: 2, + zhuSkill: true, + trigger: { global: "recoverBefore" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.group == "wu" && + player.hp <= event.player.hp && + event.getParent().name != "rejiuyuan" && + player.hasZhuSkill("rejiuyuan", event.player) + ); + }, + content: function () { + "step 0"; + trigger.player + .chooseBool( + "是否对" + get.translation(player) + "发动【救援】?", + "改为令其回复1点体力,然后你摸一张牌" + ) + .set("ai", function () { + var evt = _status.event; + return get.attitude(evt.player, evt.getParent().player) > 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("rejiuyuan"); + trigger.player.line(player, "green"); trigger.cancel(); player.recover(); trigger.player.draw(); } }, }, - rezhiheng:{ - audio:2, - audioname:['shen_caopi'], - mod:{ - aiOrder:function(player,card,num){ - if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; - let eq=player.getEquip(get.subtype(card)); - if(eq&&get.equipValue(card)-get.equipValue(eq)2||!player.countCards('h',function(card){ - return get.value(card)>=8; - }))){ + locked: false, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + check: function (card) { + var player = _status.event.player; + if ( + get.position(card) == "h" && + !player.countCards("h", "du") && + (player.hp > 2 || + !player.countCards("h", function (card) { + return get.value(card) >= 8; + })) + ) { return 1; } - return 6-get.value(card) + return 6 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.discard(cards); - event.num=1; - var hs=player.getCards('h'); - if(!hs.length) event.num=0; - for(var i=0;iget.value(i)>Math.max(6,9-player.hp),'he')) return 1; + ai: { + order: function (item, player) { + if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; return 10; }, - result:{ - player:1 + result: { + player: 1, }, - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.rezhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + !player.getStat().skill.rezhiheng && + player.hasCard((card) => get.name(card) !== "tao", "h") + ); }, - threaten:1.55 + threaten: 1.55, }, }, - reqicai:{ - mod:{ - targetInRange:function(card,player,target,now){ - var type=get.type(card); - if(type=='trick'||type=='delay') return true; + reqicai: { + mod: { + targetInRange: function (card, player, target, now) { + var type = get.type(card); + if (type == "trick" || type == "delay") return true; }, - canBeDiscarded:function(card){ - if(get.position(card)=='e'&&['equip2','equip5'].includes(get.subtype(card))) return false; + canBeDiscarded: function (card) { + if (get.position(card) == "e" && ["equip2", "equip5"].includes(get.subtype(card))) + return false; }, }, }, - rejizhi:{ - audio:2, - audioname:['lukang'], - locked:false, - trigger:{player:'useCard'}, - frequent:true, - filter:function(event){ - return (get.type(event.card,'trick')=='trick'&&event.card.isCard); + rejizhi: { + audio: 2, + audioname: ["lukang"], + locked: false, + trigger: { player: "useCard" }, + frequent: true, + filter: function (event) { + return get.type(event.card, "trick") == "trick" && event.card.isCard; }, - init:function(player){ - player.storage.rejizhi=0; + init: function (player) { + player.storage.rejizhi = 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - event.card=result[0]; - if(get.type(event.card)=='basic'){ - player.chooseBool('是否弃置'+get.translation(event.card)+'并令本回合手牌上限+1?').set('ai',function(evt,player){ - return _status.currentPhase==player&&player.needsToDiscard(-3)&&_status.event.value<6; - }).set('value',get.value(event.card,player)); + ("step 1"); + event.card = result[0]; + if (get.type(event.card) == "basic") { + player + .chooseBool("是否弃置" + get.translation(event.card) + "并令本回合手牌上限+1?") + .set("ai", function (evt, player) { + return ( + _status.currentPhase == player && + player.needsToDiscard(-3) && + _status.event.value < 6 + ); + }) + .set("value", get.value(event.card, player)); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.discard(event.card); player.storage.rejizhi++; - if(_status.currentPhase==player){ - player.markSkill('rejizhi'); + if (_status.currentPhase == player) { + player.markSkill("rejizhi"); } } }, - ai:{ - threaten:1.4, - noautowuxie:true, + ai: { + threaten: 1.4, + noautowuxie: true, }, - mod:{ - maxHandcard:function(player,num){ - return num+player.storage.rejizhi; - } + mod: { + maxHandcard: function (player, num) { + return num + player.storage.rejizhi; + }, }, - intro:{ - content:'本回合手牌上限+#' + intro: { + content: "本回合手牌上限+#", + }, + group: "rejizhi_clear", + subSkill: { + clear: { + trigger: { global: "phaseAfter" }, + silent: true, + content: function () { + player.storage.rejizhi = 0; + player.unmarkSkill("rejizhi"); + }, + }, }, - group:'rejizhi_clear', - subSkill:{ - clear:{ - trigger:{global:'phaseAfter'}, - silent:true, - content:function(){ - player.storage.rejizhi=0; - player.unmarkSkill('rejizhi'); - } - } - } }, - rebiyue:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - content:function(){ - var num=1; - if(!player.countCards('h')){ - num=2; + rebiyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + var num = 1; + if (!player.countCards("h")) { + num = 2; } player.draw(num); }, }, - rerende:{ - audio:2, - audioname:['gz_jun_liubei','shen_caopi'], - enable:'phaseUse', - filterCard:true, - selectCard:[1,Infinity], - discard:false, - lose:false, - delay:false, - filterTarget:function(card,player,target){ - if(player.storage.rerende2&&player.storage.rerende2.includes(target)) return false; - return player!=target; + rerende: { + audio: 2, + audioname: ["gz_jun_liubei", "shen_caopi"], + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + discard: false, + lose: false, + delay: false, + filterTarget: function (card, player, target) { + if (player.storage.rerende2 && player.storage.rerende2.includes(target)) return false; + return player != target; }, - onremove:['rerende','rerende2'], - check:function(card){ - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - var player=get.owner(card); - if(ui.selected.cards.length>=Math.max(2,player.countCards('h')-player.hp)) return 0; - if(player.hp==player.maxHp||player.storage.rerende<0||player.countCards('h')<=1){ - var players=game.filterPlayer(); - for(var i=0;i=3&& - get.attitude(players[i],player)>=3){ - return 11-get.value(card); + onremove: ["rerende", "rerende2"], + check: function (card) { + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + var player = get.owner(card); + if (ui.selected.cards.length >= Math.max(2, player.countCards("h") - player.hp)) return 0; + if ( + player.hp == player.maxHp || + player.storage.rerende < 0 || + player.countCards("h") <= 1 + ) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].hasSkill("haoshi") && + !players[i].isTurnedOver() && + !players[i].hasJudge("lebu") && + get.attitude(player, players[i]) >= 3 && + get.attitude(players[i], player) >= 3 + ) { + return 11 - get.value(card); } } - if(player.countCards('h')>player.hp) return 10-get.value(card); - if(player.countCards('h')>2) return 6-get.value(card); + if (player.countCards("h") > player.hp) return 10 - get.value(card); + if (player.countCards("h") > 2) return 6 - get.value(card); return -1; } - return 10-get.value(card); + return 10 - get.value(card); }, - content:function(){ - 'step 0' - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'&&!evt.rerende){ - var next=game.createEvent('rerende_clear'); + content: function () { + "step 0"; + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse" && !evt.rerende) { + var next = game.createEvent("rerende_clear"); _status.event.next.remove(next); evt.after.push(next); - evt.rerende=true; - next.player=player; + evt.rerende = true; + next.player = player; next.setContent(lib.skill.rerende1.content); } - if(!Array.isArray(player.storage.rerende2)){ - player.storage.rerende2=[]; + if (!Array.isArray(player.storage.rerende2)) { + player.storage.rerende2 = []; } player.storage.rerende2.push(target); - player.give(cards,target); - 'step 1' - if(typeof player.storage.rerende!='number'){ - player.storage.rerende=0; + player.give(cards, target); + ("step 1"); + if (typeof player.storage.rerende != "number") { + player.storage.rerende = 0; } - if(player.storage.rerende>=0){ - player.storage.rerende+=cards.length; - if(player.storage.rerende>=2){ - var list=[]; - if(lib.filter.cardUsable({name:'sha'},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse('sha',current); - })){ - list.push(['基本','','sha']); + if (player.storage.rerende >= 0) { + player.storage.rerende += cards.length; + if (player.storage.rerende >= 2) { + var list = []; + if ( + lib.filter.cardUsable( + { name: "sha" }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse("sha", current); + }) + ) { + list.push(["基本", "", "sha"]); } - for(var i of lib.inpile_nature){ - if(lib.filter.cardUsable({name:'sha',nature:i},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse({name:'sha',nature:i},current); - })){ - list.push(['基本','','sha',i]); + for (var i of lib.inpile_nature) { + if ( + lib.filter.cardUsable( + { name: "sha", nature: i }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse({ name: "sha", nature: i }, current); + }) + ) { + list.push(["基本", "", "sha", i]); } } - if(lib.filter.cardUsable({name:'tao'},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse('tao',current); - })){ - list.push(['基本','','tao']); + if ( + lib.filter.cardUsable( + { name: "tao" }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse("tao", current); + }) + ) { + list.push(["基本", "", "tao"]); } - if(lib.filter.cardUsable({name:'jiu'},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ - return player.canUse('jiu',current); - })){ - list.push(['基本','','jiu']); + if ( + lib.filter.cardUsable( + { name: "jiu" }, + player, + event.getParent("chooseToUse") + ) && + game.hasPlayer(function (current) { + return player.canUse("jiu", current); + }) + ) { + list.push(["基本", "", "jiu"]); } - if(list.length){ - player.chooseButton(['是否视为使用一张基本牌?',[list,'vcard']]).set('ai',function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3],isCard:true}; - if(card.name=='tao'){ - if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()){ - return 5; + if (list.length) { + player + .chooseButton(["是否视为使用一张基本牌?", [list, "vcard"]]) + .set("ai", function (button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], + isCard: true, + }; + if (card.name == "tao") { + if ( + player.hp == 1 || + (player.hp == 2 && !player.hasShan()) || + player.needsToDiscard() + ) { + return 5; + } + return 1; } - return 1; - } - if(card.name=='sha'){ - if(game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0 - })){ - if(card.nature=='fire') return 2.95; - if(card.nature=='thunder'||card.nature=='ice') return 2.92; - return 2.9; + if (card.name == "sha") { + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + if (card.nature == "fire") return 2.95; + if (card.nature == "thunder" || card.nature == "ice") + return 2.92; + return 2.9; + } + return 0; + } + if (card.name == "jiu") { + return 0.5; } return 0; - } - if(card.name=='jiu'){ - return 0.5; - } - return 0; - }); - } - else{ + }); + } else { event.finish(); } - player.storage.rerende=-1; - } - else{ + player.storage.rerende = -1; + } else { event.finish(); } - } - else{ + } else { event.finish(); } - 'step 2' - if(result&&result.bool&&result.links[0]){ - var card={name:result.links[0][2],nature:result.links[0][3]}; - player.chooseUseTarget(card,true); + ("step 2"); + if (result && result.bool && result.links[0]) { + var card = { name: result.links[0][2], nature: result.links[0][3] }; + player.chooseUseTarget(card, true); } }, - ai:{ - fireAttack:true, - order:function(skill,player){ - if(player.hp1){ + ai: { + fireAttack: true, + order: function (skill, player) { + if ( + player.hp < player.maxHp && + player.storage.rerende < 2 && + player.countCards("h") > 1 + ) { return 10; } return 4; }, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; return -10; } - if(target.hasJudge('lebu')) return 0; - var nh=target.countCards('h'); - var np=player.countCards('h'); - if(player.hp==player.maxHp||player.storage.rerende<0||player.countCards('h')<=1){ - if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; + if (target.hasJudge("lebu")) return 0; + var nh = target.countCards("h"); + var np = player.countCards("h"); + if ( + player.hp == player.maxHp || + player.storage.rerende < 0 || + player.countCards("h") <= 1 + ) { + if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; } - return Math.max(1,5-nh); - } + return Math.max(1, 5 - nh); + }, }, - effect:{ - target:function(card,player,target){ - if(player==target&&get.type(card)=='equip'){ - if(player.countCards('e',{subtype:get.subtype(card)})){ - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })){ + effect: { + target: function (card, player, target) { + if (player == target && get.type(card) == "equip") { + if (player.countCards("e", { subtype: get.subtype(card) })) { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) { return 0; } } } - } + }, }, - threaten:0.8 - } - }, - rerende1:{ - trigger:{player:'phaseUseBegin'}, - silent:true, - content:function(){ - player.storage.rerende=0; - player.storage.rerende2=[]; - } - }, - liyu:{ - audio:2, - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&event.card.name=='sha'&&event.player.isIn()&&event.player.countGainableCards(player,'he')>0; + threaten: 0.8, }, - check:function(){ + }, + rerende1: { + trigger: { player: "phaseUseBegin" }, + silent: true, + content: function () { + player.storage.rerende = 0; + player.storage.rerende2 = []; + }, + }, + liyu: { + audio: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + event.card.name == "sha" && + event.player.isIn() && + event.player.countGainableCards(player, "he") > 0 + ); + }, + check: function () { return false; }, - content:function(){ - 'step 0' - trigger.player.chooseTarget(function(card,player,target){ - var evt=_status.event.getParent(); - return evt.player.canUse({name:'juedou'},target)&&target!=_status.event.player; - },get.prompt('liyu')).set('ai',function(target){ - var evt=_status.event.getParent(); - return get.effect(target,{name:'juedou'},evt.player,_status.event.player)-2; - }); - 'step 1' - if(result.bool){ - player.gainPlayerCard(trigger.player,'he',true); - event.target=result.targets[0]; - trigger.player.line(player,'green'); - } - else{ + content: function () { + "step 0"; + trigger.player + .chooseTarget(function (card, player, target) { + var evt = _status.event.getParent(); + return ( + evt.player.canUse({ name: "juedou" }, target) && + target != _status.event.player + ); + }, get.prompt("liyu")) + .set("ai", function (target) { + var evt = _status.event.getParent(); + return ( + get.effect(target, { name: "juedou" }, evt.player, _status.event.player) - 2 + ); + }); + ("step 1"); + if (result.bool) { + player.gainPlayerCard(trigger.player, "he", true); + event.target = result.targets[0]; + trigger.player.line(player, "green"); + } else { event.finish(); } - 'step 2' - if(event.target){ - player.useCard({name:'juedou',isCard:true},event.target,'noai'); + ("step 2"); + if (event.target) { + player.useCard({ name: "juedou", isCard: true }, event.target, "noai"); } }, - ai:{ - halfneg:true - } + ai: { + halfneg: true, + }, }, /*reqicai:{ trigger:{player:'equipEnd'}, @@ -12940,2672 +15731,3135 @@ game.import('character', function () { } }, },*/ - retuxi:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - direct:true, - filter:function(event){ - return event.num>0; + retuxi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + direct: true, + filter: function (event) { + return event.num > 0; }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('retuxi'),[1,trigger.num],function(card,player,target){ - return target.countCards('h')>0&&player!=target&&target.countCards('h')>=player.countCards('h'); - },function(target){ - var att=get.attitude(_status.event.player,target); - if(target.hasSkill('tuntian')) return att/10; - return 1-att; - }); - "step 1" - if(result.bool){ - player.logSkill('retuxi',result.targets); + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("retuxi"), + [1, trigger.num], + function (card, player, target) { + return ( + target.countCards("h") > 0 && + player != target && + target.countCards("h") >= player.countCards("h") + ); + }, + function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ); + ("step 1"); + if (result.bool) { + player.logSkill("retuxi", result.targets); player.gainMultiple(result.targets); - trigger.num-=result.targets.length; - } - else{ + trigger.num -= result.targets.length; + } else { event.finish(); } - "step 2" - if(trigger.num<=0) game.delay(); + ("step 2"); + if (trigger.num <= 0) game.delay(); + }, + ai: { + threaten: 1.6, + expose: 0.2, }, - ai:{ - threaten:1.6, - expose:0.2 - } }, - reguicai:{ - audio:2, - trigger:{global:'judge'}, - direct:true, - filter:function(event,player){ - return player.countCards('hes')>0; + reguicai: { + audio: 2, + trigger: { global: "judge" }, + direct: true, + filter: function (event, player) { + return player.countCards("hes") > 0; }, - content:function(){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('reguicai'),'hes',function(card){ - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result-get.value(card)/2; - } - else{ - return -result-get.value(card)/2; - } - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.bool){ - player.respond(result.cards,'reguicai','highlight','noOrdering'); - } - else{ + content: function () { + "step 0"; + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("reguicai"), + "hes", + function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; + } + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "reguicai", "highlight", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); game.delay(2); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } - }, - refankui:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return (event.source&&event.source.countGainableCards(player,event.source!=player?'he':'e')&&event.num>0); + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, }, - content:function(){ - "step 0" - event.count=trigger.num; - "step 1" + }, + refankui: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return ( + event.source && + event.source.countGainableCards(player, event.source != player ? "he" : "e") && + event.num > 0 + ); + }, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - player.gainPlayerCard(get.prompt('refankui',trigger.source),trigger.source,get.buttonValue,trigger.source!=player?'he':'e').set('logSkill',[event.name,trigger.source]); - "step 2" - if(result.bool&&event.count>0&&trigger.source.countGainableCards(player,trigger.source!=player?'he':'e')>0&&player.hasSkill(event.name)) event.goto(1); + player + .gainPlayerCard( + get.prompt("refankui", trigger.source), + trigger.source, + get.buttonValue, + trigger.source != player ? "he" : "e" + ) + .set("logSkill", [event.name, trigger.source]); + ("step 2"); + if ( + result.bool && + event.count > 0 && + trigger.source.countGainableCards(player, trigger.source != player ? "he" : "e") > + 0 && + player.hasSkill(event.name) + ) + event.goto(1); }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.countCards('he')>1&&get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; - if(get.attitude(target,player)<0) return [1,1]; + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.countCards("he") > 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (get.attitude(target, player) < 0) return [1, 1]; } - } - } - } - }, - reluoyi:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - check:function(event,player){ - if(player.countCards('h','sha')) return true; - return Math.random()<0.5; + }, + }, }, - content:function(){ - "step 0" - player.addTempSkill('reluoyi2',{player:'phaseBefore'}); - trigger.cancel(null,null,'notrigger'); - "step 1" - event.cards=get.cards(3); - player.showCards(event.cards,'裸衣'); - "step 2" - for(var i=0;i0); + reganglie: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source != undefined && event.num > 0; }, - check:function(event,player){ - return (get.attitude(player,event.source)<=0); + check: function (event, player) { + return get.attitude(player, event.source) <= 0; }, - logTarget:'source', - preHidden:true, - content:function(){ - "step 0" - event.num=trigger.num; - if(get.mode()=='guozhan') event.num=1; - "step 1" - player.judge(function(card){ - if(get.color(card)=='red') return 1; + logTarget: "source", + preHidden: true, + content: function () { + "step 0"; + event.num = trigger.num; + if (get.mode() == "guozhan") event.num = 1; + ("step 1"); + player.judge(function (card) { + if (get.color(card) == "red") return 1; return 0; }); - "step 2" - if(result.color=='black'){ - if(trigger.source.countCards('he')){ - player.discardPlayerCard(trigger.source,'he',true); + ("step 2"); + if (result.color == "black") { + if (trigger.source.countCards("he")) { + player.discardPlayerCard(trigger.source, "he", true); } - } - else if(trigger.source.isIn()){ + } else if (trigger.source.isIn()) { trigger.source.damage(); } event.num--; - if(event.num>0&&player.hasSkill('reganglie')){ - player.chooseBool(get.prompt2('reganglie')); - } - else{ + if (event.num > 0 && player.hasSkill("reganglie")) { + player.chooseBool(get.prompt2("reganglie")); + } else { event.finish(); } - "step 3" - if(result.bool){ - player.logSkill('reganglie',trigger.source); + ("step 3"); + if (result.bool) { + player.logSkill("reganglie", trigger.source); event.goto(1); } }, - ai:{ - maixie_defend:true, - expose:0.4 - } + ai: { + maixie_defend: true, + expose: 0.4, + }, }, - qinxue:{ - skillAnimation:true, - animationColor:'wood', - audio:2, - unique:true, - juexingji:true, - derivation:'gongxin', - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - forced:true, - filter:function(event,player){ - if(player.countCards('h')>=player.hp+2) return true; + qinxue: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + unique: true, + juexingji: true, + derivation: "gongxin", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + filter: function (event, player) { + if (player.countCards("h") >= player.hp + 2) return true; return false; }, - content:function(){ - player.awakenSkill('qinxue'); + content: function () { + player.awakenSkill("qinxue"); player.loseMaxHp(); - player.chooseDrawRecover(2,true); - player.addSkills('gongxin'); - } - }, - qingjian:{ - audio:2, - unique:true, - trigger:{player:'gainAfter'}, - direct:true, - usable:4, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - if(evt&&evt.player==player) return false; - return event.getg(player).length>0; + player.chooseDrawRecover(2, true); + player.addSkills("gongxin"); }, - content:function(){ - "step 0" - event.cards=trigger.getg(player); - "step 1" + }, + qingjian: { + audio: 2, + unique: true, + trigger: { player: "gainAfter" }, + direct: true, + usable: 4, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.player == player) return false; + return event.getg(player).length > 0; + }, + content: function () { + "step 0"; + event.cards = trigger.getg(player); + ("step 1"); player.chooseCardTarget({ - filterCard:function(card){ + filterCard: function (card) { return _status.event.getParent().cards.includes(card); }, - selectCard:[1,event.cards.length], - filterTarget:function(card,player,target){ - return player!=target; + selectCard: [1, event.cards.length], + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ - if(ui.selected.cards.length>0) return -1; - if(card.name=='du') return 20; - return (_status.event.player.countCards('h')-_status.event.player.hp); + ai1: function (card) { + if (ui.selected.cards.length > 0) return -1; + if (card.name == "du") return 20; + return _status.event.player.countCards("h") - _status.event.player.hp; }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; - return 1-att; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; + return 1 - att; } - if(target.countCards('h')>_status.event.player.countCards('h')) return 0; - return att-4; + if (target.countCards("h") > _status.event.player.countCards("h")) return 0; + return att - 4; }, - prompt:'请选择要送人的卡牌' + prompt: "请选择要送人的卡牌", }); - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { player.storage.qingjian++; - player.logSkill('qingjian',result.targets); - result.targets[0].gain(result.cards,player,'give'); - for(var i=0;i0; + refanjian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - filterCard:true, - check:function(card){ - return 8-get.value(card); + filterCard: true, + check: function (card) { + return 8 - get.value(card); }, - discard:false, - lose:false, - delay:false, - content:function(){ - "step 0" - target.storage.refanjian=cards[0]; - player.give(cards[0],target); - "step 1" - var suit=get.suit(target.storage.refanjian); - if(!target.countCards('h')) event._result={control:'refanjian_hp'}; - else target.chooseControl('refanjian_card','refanjian_hp').ai=function(event,player){ - var cards=player.getCards('he',{suit:get.suit(player.storage.refanjian)}); - if(cards.length==1) return 0; - if(cards.length>=2){ - for(var i=0;i= 2) { + for (var i = 0; i < cards.length; i++) { + if (get.tag(cards[i], "save")) return 1; + } } - } - if(player.hp==1) return 0; - for(var i=0;i=8) return 1; - } - if(cards.length>2&&player.hp>2) return 1; - if(cards.length>3) return 1; - return 0; - } - "step 2" - if(result.control=='refanjian_card'){ + if (player.hp == 1) return 0; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) >= 8) return 1; + } + if (cards.length > 2 && player.hp > 2) return 1; + if (cards.length > 3) return 1; + return 0; + }; + ("step 2"); + if (result.control == "refanjian_card") { target.showHandcards(); - } - else{ + } else { target.loseHp(); event.finish(); } - "step 3" - var suit=get.suit(target.storage.refanjian); - target.discard(target.getCards('he',function(i){ - return get.suit(i)==suit&&lib.filter.cardDiscardable(i,target,'refanjian'); - })); + ("step 3"); + var suit = get.suit(target.storage.refanjian); + target.discard( + target.getCards("he", function (i) { + return get.suit(i) == suit && lib.filter.cardDiscardable(i, target, "refanjian"); + }) + ); delete target.storage.refanjian; }, - ai:{ - order:9, - result:{ - target:function(player,target){ - return -target.countCards('he')-(player.countCards('h','du')?1:0); - } + ai: { + order: 9, + result: { + target: function (player, target) { + return -target.countCards("he") - (player.countCards("h", "du") ? 1 : 0); + }, }, - threaten:2, - } - }, - reqianxun:{ - audio:2, - trigger:{ - target:'useCardToBegin', - player:'judgeBefore', + threaten: 2, }, - filter:function(event,player){ - if(player.countCards('h')==0) return false; - if(event.getParent().name=='phaseJudge'){ + }, + reqianxun: { + audio: 2, + trigger: { + target: "useCardToBegin", + player: "judgeBefore", + }, + filter: function (event, player) { + if (player.countCards("h") == 0) return false; + if (event.getParent().name == "phaseJudge") { return true; } - if(event.name=='judge') return false; - if(event.targets&&event.targets.length>1) return false; - if(event.card&&get.type(event.card)=='trick'&&event.player!=player) return true; + if (event.name == "judge") return false; + if (event.targets && event.targets.length > 1) return false; + if (event.card && get.type(event.card) == "trick" && event.player != player) return true; }, - content:function(){ - var cards=player.getCards('h'); - player.addToExpansion(cards,'giveAuto',player).gaintag.add('reqianxun2'); - player.addSkill('reqianxun2'); + content: function () { + var cards = player.getCards("h"); + player.addToExpansion(cards, "giveAuto", player).gaintag.add("reqianxun2"); + player.addSkill("reqianxun2"); }, - ai:{ - effect:function(card,player,target){ - if(player==target||!target.hasFriend()) return; - var type=get.type(card); - var nh=Math.min(target.countCards(),game.countPlayer(i=>get.attitude(target,i)>0)); - if(type=='trick'){ - if(!get.tag(card,'multitarget')||get.info(card).singleCard){ - if(get.tag(card,'damage')) return [1.5,nh-1]; - return [1,nh]; + ai: { + effect: function (card, player, target) { + if (player == target || !target.hasFriend()) return; + var type = get.type(card); + var nh = Math.min( + target.countCards(), + game.countPlayer((i) => get.attitude(target, i) > 0) + ); + if (type == "trick") { + if (!get.tag(card, "multitarget") || get.info(card).singleCard) { + if (get.tag(card, "damage")) return [1.5, nh - 1]; + return [1, nh]; } - } - else if(type=='delay') return [0.5,0.5]; + } else if (type == "delay") return [0.5, 0.5]; }, - } - }, - reqianxun2:{ - trigger:{global:'phaseEnd'}, - forced:true, - audio:false, - content:function(){ - var cards=player.getExpansions('reqianxun2'); - if(cards.length) player.gain(cards,'draw'); - player.removeSkill('reqianxun2'); }, - intro:{ - mark:function(dialog,storage,player){ - var cards=player.getExpansions('reqianxun2'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; + }, + reqianxun2: { + trigger: { global: "phaseEnd" }, + forced: true, + audio: false, + content: function () { + var cards = player.getExpansions("reqianxun2"); + if (cards.length) player.gain(cards, "draw"); + player.removeSkill("reqianxun2"); + }, + intro: { + mark: function (dialog, storage, player) { + var cards = player.getExpansions("reqianxun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; }, - markcount:'expansion', - } + markcount: "expansion", + }, }, - relianying:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + relianying: { + audio: 2, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - if(player.countCards('h')) return false; - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length; + direct: true, + filter: function (event, player) { + if (player.countCards("h")) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; }, - content:function(){ - "step 0" - var num=trigger.getl(player).hs.length; - player.chooseTarget(get.prompt('relianying'),'令至多'+get.cnNumber(num)+'名角色各摸一张牌',[1,num]).ai=function(target){ - var player=_status.event.player; - if(player==target) return get.attitude(player,target)+10; - return get.attitude(player,target); - } - "step 1" - if(result.bool){ - player.logSkill('relianying',result.targets); + content: function () { + "step 0"; + var num = trigger.getl(player).hs.length; + player.chooseTarget( + get.prompt("relianying"), + "令至多" + get.cnNumber(num) + "名角色各摸一张牌", + [1, num] + ).ai = function (target) { + var player = _status.event.player; + if (player == target) return get.attitude(player, target) + 10; + return get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("relianying", result.targets); game.asyncDraw(result.targets); - } - else event.finish(); - "step 2" + } else event.finish(); + ("step 2"); game.delay(); }, - ai:{ - threaten:0.8, - effect:{ - target:function(card){ - if(card.name=='guohe'||card.name=='liuxinghuoyu') return 0.5; - } + ai: { + threaten: 0.8, + effect: { + target: function (card) { + if (card.name == "guohe" || card.name == "liuxinghuoyu") return 0.5; + }, }, - noh:true, - } - }, - retishen:{ - audio:2, - unique:true, - mark:true, - skillAnimation:true, - animationColor:'soil', - limited:true, - trigger:{player:'phaseZhunbeiBegin'}, - init:function(player){ - player.storage.retishen=false; + noh: true, }, - filter:function(event,player){ - if(player.storage.retishen) return false; - if(typeof player.storage.retishen2=='number'){ - return player.hp0){ - return att+Math.max(0,5-target.countCards('h')); - } - return att; - }).set('du',event.card.name=='du'); - } - else{ - player.chooseBool('是否弃置'+get.translation(event.card)+'?'); - event.disbool=true; + content: function () { + "step 0"; + event.card = get.cards()[0]; + game.broadcast(function (card) { + ui.arena.classList.add("thrownhighlight"); + card.copy("thrown", "center", "thrownhighlight", ui.arena).addTempClass("start"); + }, event.card); + event.node = event.card + .copy("thrown", "center", "thrownhighlight", ui.arena) + .addTempClass("start"); + ui.arena.classList.add("thrownhighlight"); + game.addVideo("thrownhighlight1"); + game.addVideo("centernode", null, get.cardInfo(event.card)); + if (get.type(event.card, "trick") == get.type(trigger.card, "trick")) { + player + .chooseTarget("选择获得此牌的角色") + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.du) { + if (target.hasSkillTag("nodu")) return 0; + return -att; + } + if (att > 0) { + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du"); + } else { + player.chooseBool("是否弃置" + get.translation(event.card) + "?"); + event.disbool = true; } game.delay(2); - "step 1" - if(event.disbool){ - if(!result.bool){ - game.log(player,'展示了',event.card); - ui.cardPile.insertBefore(event.card,ui.cardPile.firstChild); - } - else{ - game.log(player,'展示并弃掉了',event.card); + ("step 1"); + if (event.disbool) { + if (!result.bool) { + game.log(player, "展示了", event.card); + ui.cardPile.insertBefore(event.card, ui.cardPile.firstChild); + } else { + game.log(player, "展示并弃掉了", event.card); event.card.discard(); } - game.addVideo('deletenode',player,[get.cardInfo(event.node)]); + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); event.node.delete(); - game.broadcast(function(card){ - ui.arena.classList.remove('thrownhighlight'); - if(card.clone){ + game.broadcast(function (card) { + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { card.clone.delete(); } - },event.card); - } - else if(result.targets){ - player.line(result.targets,'green'); - result.targets[0].gain(event.card,'log'); + }, event.card); + } else if (result.targets) { + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "log"); event.node.moveDelete(result.targets[0]); - game.addVideo('gain2',result.targets[0],[get.cardInfo(event.node)]); - game.broadcast(function(card,target){ - ui.arena.classList.remove('thrownhighlight'); - if(card.clone){ - card.clone.moveDelete(target); - } - },event.card,result.targets[0]); - } - else{ - game.log(player,'展示并弃掉了',event.card); + game.addVideo("gain2", result.targets[0], [get.cardInfo(event.node)]); + game.broadcast( + function (card, target) { + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { + card.clone.moveDelete(target); + } + }, + event.card, + result.targets[0] + ); + } else { + game.log(player, "展示并弃掉了", event.card); event.card.discard(); - game.addVideo('deletenode',player,[get.cardInfo(event.node)]); + game.addVideo("deletenode", player, [get.cardInfo(event.node)]); event.node.delete(); - game.broadcast(function(card){ - ui.arena.classList.remove('thrownhighlight'); - if(card.clone){ + game.broadcast(function (card) { + ui.arena.classList.remove("thrownhighlight"); + if (card.clone) { card.clone.delete(); } - },event.card); + }, event.card); } - game.addVideo('thrownhighlight2'); - ui.arena.classList.remove('thrownhighlight'); + game.addVideo("thrownhighlight2"); + ui.arena.classList.remove("thrownhighlight"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2]; + }, + }, }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'respond')&&target.countCards('h')>1) return [1,0.2]; - } - } - } }, - rejianxiong:{ - audio:2, - audioname:['shen_caopi'], - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return get.itemtype(event.cards)=='cards'&&get.position(event.cards[0],true)=='o'; + rejianxiong: { + audio: 2, + audioname: ["shen_caopi"], + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return get.itemtype(event.cards) == "cards" && get.position(event.cards[0], true) == "o"; }, - content:function(){ + content: function () { player.gain(trigger.cards); player.$gain2(trigger.cards); player.draw(); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')) return [1,0.55]; - } - } - } - }, - rejianxiong_old:{ - audio:'rejianxiong', - audioname2:{ - gz_caocao:'jianxiong', - }, - trigger:{player:'damageEnd'}, - async cost(event,trigger,player){ - let list=['摸牌']; - if(get.itemtype(trigger.cards)=='cards'&&trigger.cards.filterInD().length){ - list.push('拿牌'); - } - list.push('cancel2'); - const {result:{control}}=await player.chooseControl(list).set('prompt',get.prompt2('rejianxiong_old')).set('ai',()=>{ - const player=get.event('player'),trigger=get.event().getTrigger(); - const cards=trigger.cards.filterInD(); - if(get.event().controls.includes('拿牌')){ - if(cards.reduce((sum,card)=>{ - return sum+(card.name=='du'?-1:1); - },0)>1||player.getUseValue(cards[0])>6) return '拿牌'; - } - return '摸牌'; - }); - event.result={bool:(control!='cancel2'),cost_data:control}; - }, - async content(event,trigger,player){ - if(event.cost_data=='摸牌') await player.draw(); - else await player.gain(trigger.cards.filterInD(),'gain2'); - }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')&&player!=target) return [1,0.6]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage")) return [1, 0.55]; }, }, }, }, - reyiji:{ - audio:2, - trigger:{player:'damageEnd'}, - frequent:true, - filter:function(event){ - return (event.num>0) + rejianxiong_old: { + audio: "rejianxiong", + audioname2: { + gz_caocao: "jianxiong", }, - content:function(){ - "step 0" - event.num=1; - event.count=1; - "step 1" + trigger: { player: "damageEnd" }, + async cost(event, trigger, player) { + let list = ["摸牌"]; + if (get.itemtype(trigger.cards) == "cards" && trigger.cards.filterInD().length) { + list.push("拿牌"); + } + list.push("cancel2"); + const { + result: { control }, + } = await player + .chooseControl(list) + .set("prompt", get.prompt2("rejianxiong_old")) + .set("ai", () => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + const cards = trigger.cards.filterInD(); + if (get.event().controls.includes("拿牌")) { + if ( + cards.reduce((sum, card) => { + return sum + (card.name == "du" ? -1 : 1); + }, 0) > 1 || + player.getUseValue(cards[0]) > 6 + ) + return "拿牌"; + } + return "摸牌"; + }); + event.result = { bool: control != "cancel2", cost_data: control }; + }, + async content(event, trigger, player) { + if (event.cost_data == "摸牌") await player.draw(); + else await player.gain(trigger.cards.filterInD(), "gain2"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) return [1, 0.6]; + }, + }, + }, + }, + reyiji: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + filter: function (event) { + return event.num > 0; + }, + content: function () { + "step 0"; + event.num = 1; + event.count = 1; + ("step 1"); player.gain(get.cards(2)); player.$draw(2); - "step 2" + ("step 2"); player.chooseCardTarget({ - filterCard:true, - selectCard:[1,2], - filterTarget:function(card,player,target){ - return player!=target&&target!=event.temp; + filterCard: true, + selectCard: [1, 2], + filterTarget: function (card, player, target) { + return player != target && target != event.temp; }, - ai1:function(card){ - if(ui.selected.cards.length>0) return -1; - if(card.name=='du') return 20; - return (_status.event.player.countCards('h')-_status.event.player.hp); + ai1: function (card) { + if (ui.selected.cards.length > 0) return -1; + if (card.name == "du") return 20; + return _status.event.player.countCards("h") - _status.event.player.hp; }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; - return 1-att; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; + return 1 - att; } - return att-4; + return att - 4; }, - prompt:'请选择要送人的卡牌' + prompt: "请选择要送人的卡牌", }); - "step 3" - if(result.bool){ - player.lose(result.cards,ui.special,'toStorage'); - if(result.targets[0].hasSkill('reyiji2')){ - result.targets[0].storage.reyiji2=result.targets[0].storage.reyiji2.concat(result.cards); + ("step 3"); + if (result.bool) { + player.lose(result.cards, ui.special, "toStorage"); + if (result.targets[0].hasSkill("reyiji2")) { + result.targets[0].storage.reyiji2 = result.targets[0].storage.reyiji2.concat( + result.cards + ); + } else { + result.targets[0].addSkill("reyiji2"); + result.targets[0].storage.reyiji2 = result.cards; } - else{ - result.targets[0].addSkill('reyiji2'); - result.targets[0].storage.reyiji2=result.cards; - } - player.$give(result.cards.length,result.targets[0],false); - player.line(result.targets,'green'); - game.addVideo('storage',result.targets[0],['reyiji2',get.cardsInfo(result.targets[0].storage.reyiji2),'cards']); - if(num==1){ - event.temp=result.targets[0]; + player.$give(result.cards.length, result.targets[0], false); + player.line(result.targets, "green"); + game.addVideo("storage", result.targets[0], [ + "reyiji2", + get.cardsInfo(result.targets[0].storage.reyiji2), + "cards", + ]); + if (num == 1) { + event.temp = result.targets[0]; event.num++; event.goto(2); - } - else if(event.count0){ - if(player.needsToDiscard()) num=0.7; - else num=0.5; + ai: { + maixie: true, + maixie_hp: true, + result: { + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; } - if(player.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (player.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } - } + }, }, - threaten:0.6 - } + threaten: 0.6, + }, }, - reyiji2:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - mark:true, - popup:'遗计拿牌', - audio:false, - content:function(){ + reyiji2: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + mark: true, + popup: "遗计拿牌", + audio: false, + content: function () { player.$draw(player.storage.reyiji2.length); - player.gain(player.storage.reyiji2,'fromStorage'); + player.gain(player.storage.reyiji2, "fromStorage"); delete player.storage.reyiji2; - player.removeSkill('reyiji2'); + player.removeSkill("reyiji2"); game.delay(); }, - intro:{ - content:'cardCount' - } + intro: { + content: "cardCount", + }, }, - yijue:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h'); + yijue: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - "step 0" - player.chooseToCompare(target).set('small',true); - "step 1" - if(result.bool){ - if(!target.hasSkill('fengyin')){ - target.addTempSkill('fengyin'); + content: function () { + "step 0"; + player.chooseToCompare(target).set("small", true); + ("step 1"); + if (result.bool) { + if (!target.hasSkill("fengyin")) { + target.addTempSkill("fengyin"); } - target.addTempSkill('yijue2'); + target.addTempSkill("yijue2"); event.finish(); - } - else if(target.hp0; + } else if (target.hp < target.maxHp) { + player.chooseBool("是否让目标回复1点体力?").ai = function (event, player) { + return get.recoverEffect(target, player, player) > 0; }; - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { target.recover(); } }, - ai:{ - result:{ - target:function(player,target){ - var hs=player.getCards('h'); - if(hs.length<3) return 0; - var bool=false; - for(var i=0;i=9&&get.value(hs[i])<7){ - bool=true; + ai: { + result: { + target: function (player, target) { + var hs = player.getCards("h"); + if (hs.length < 3) return 0; + var bool = false; + for (var i = 0; i < hs.length; i++) { + if (get.number(hs[i]) >= 9 && get.value(hs[i]) < 7) { + bool = true; break; } } - if(!bool) return 0; - if(target.countCards('h')>target.hp+1&&get.recoverEffect(target)>0){ + if (!bool) return 0; + if (target.countCards("h") > target.hp + 1 && get.recoverEffect(target) > 0) { return 1; } - if(player.canUse('sha',target)&&(player.countCards('h','sha')||player.countCards('he',{color:'red'}))){ + if ( + player.canUse("sha", target) && + (player.countCards("h", "sha") || player.countCards("he", { color: "red" })) + ) { return -2; } return -0.5; - } + }, }, - order:9, - } + order: 9, + }, }, - yijue2:{ - mark:true, - mod:{ - cardEnabled:function(){ + yijue2: { + mark: true, + mod: { + cardEnabled: function () { return false; }, - cardRespondable:function(){ + cardRespondable: function () { return false; }, - cardSavable:function(){ + cardSavable: function () { return false; - } + }, + }, + intro: { + content: "不能使用或打出卡牌", }, - intro:{ - content:'不能使用或打出卡牌' - } }, - retieji:{ - shaRelated:true, - audio:2, - audioname:['boss_lvbu3'], - trigger:{player:'useCardToPlayered'}, - check:function(event,player){ - return get.attitude(player,event.target)<=0; + retieji: { + shaRelated: true, + audio: 2, + audioname: ["boss_lvbu3"], + trigger: { player: "useCardToPlayered" }, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; }, - filter:function(event,player){ - return event.card.name=='sha'; + filter: function (event, player) { + return event.card.name == "sha"; }, - logTarget:'target', - content:function(){ - "step 0" - player.judge(function(){return 0}); - if(!trigger.target.hasSkill('fengyin')){ - trigger.target.addTempSkill('fengyin'); + logTarget: "target", + content: function () { + "step 0"; + player.judge(function () { + return 0; + }); + if (!trigger.target.hasSkill("fengyin")) { + trigger.target.addTempSkill("fengyin"); } - "step 1" - var suit=result.suit; - var target=trigger.target; - var num=target.countCards('h','shan'); - target.chooseToDiscard('请弃置一张'+get.translation(suit)+'牌,否则不能使用闪抵消此杀','he',function(card){ - return get.suit(card)==_status.event.suit; - }).set('ai',function(card){ - var num=_status.event.num; - if(num==0) return 0; - if(card.name=='shan') return num>1?2:0; - return 8-get.value(card); - }).set('num',num).set('suit',suit); - "step 2" - if(!result.bool){ + ("step 1"); + var suit = result.suit; + var target = trigger.target; + var num = target.countCards("h", "shan"); + target + .chooseToDiscard( + "请弃置一张" + get.translation(suit) + "牌,否则不能使用闪抵消此杀", + "he", + function (card) { + return get.suit(card) == _status.event.suit; + } + ) + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return 8 - get.value(card); + }) + .set("num", num) + .set("suit", suit); + ("step 2"); + if (!result.bool) { trigger.getParent().directHit.add(trigger.target); } }, - ai:{ - ignoreSkill:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='directHit_ai'){ - return get.attitude(player,arg.target)<=0; + ai: { + ignoreSkill: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "directHit_ai") { + return get.attitude(player, arg.target) <= 0; } - if(!arg||arg.isLink||!arg.card||arg.card.name!='sha') return false; - if(!arg.target||get.attitude(player,arg.target)>=0) return false; - if(!arg.skill||!lib.skill[arg.skill]||lib.skill[arg.skill].charlotte||get.is.locked(arg.skill)||!arg.target.getSkills(true,false).includes(arg.skill)) return false; + if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false; + if (!arg.target || get.attitude(player, arg.target) >= 0) return false; + if ( + !arg.skill || + !lib.skill[arg.skill] || + lib.skill[arg.skill].charlotte || + get.is.locked(arg.skill) || + !arg.target.getSkills(true, false).includes(arg.skill) + ) + return false; }, - directHit_ai:true, - } + directHit_ai: true, + }, }, - reyicong:{ - trigger:{ - player:["changeHp"], + reyicong: { + trigger: { + player: ["changeHp"], }, - audio:2, - audioname2:{gongsunzan:'yicong'}, - forced:true, - filter:function(event,player){ - return get.sgn(player.hp-2.5)!=get.sgn(player.hp-2.5-event.num); + audio: 2, + audioname2: { gongsunzan: "yicong" }, + forced: true, + filter: function (event, player) { + return get.sgn(player.hp - 2.5) != get.sgn(player.hp - 2.5 - event.num); }, - content:function (){}, - mod:{ - globalFrom:function(from,to,current){ - return current-1; + content: function () {}, + mod: { + globalFrom: function (from, to, current) { + return current - 1; }, - globalTo:function(from,to,current){ - if(to.hp<=2) return current+1; + globalTo: function (from, to, current) { + if (to.hp <= 2) return current + 1; }, }, - ai:{ - threaten:0.8 - } + ai: { + threaten: 0.8, + }, }, - reqiaomeng:{ - audio:'qiaomeng', - trigger:{source:'damageSource'}, - direct:true, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&event.card.name=='sha'&&event.player.countDiscardableCards(player,'hej'); + reqiaomeng: { + audio: "qiaomeng", + trigger: { source: "damageSource" }, + direct: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + event.card.name == "sha" && + event.player.countDiscardableCards(player, "hej") + ); }, - content:function(){ - "step 0" - player.discardPlayerCard(get.prompt('reqiaomeng',trigger.player),'hej',trigger.player).set('logSkill',['reqiaomeng',trigger.player]); - "step 1" - if(result.bool){ - var card=result.cards[0]; - if(get.position(card)=='d'){ - if(get.subtype(card)=='equip3'||get.subtype(card)=='equip4'||get.subtype(card)=='equip6'){ - player.gain(card,player,'gain2'); + content: function () { + "step 0"; + player + .discardPlayerCard(get.prompt("reqiaomeng", trigger.player), "hej", trigger.player) + .set("logSkill", ["reqiaomeng", trigger.player]); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + if (get.position(card) == "d") { + if ( + get.subtype(card) == "equip3" || + get.subtype(card) == "equip4" || + get.subtype(card) == "equip6" + ) { + player.gain(card, player, "gain2"); } } } - } - }, - qiaomeng:{ - audio:2, - trigger:{source:'damageSource'}, - direct:true, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&event.card.name=='sha'&&event.cards&& - get.color(event.cards)=='black'&&event.player.countDiscardableCards(player,'hej'); }, - content:function(){ - "step 0" - player.discardPlayerCard(get.prompt('qiaomeng',trigger.player),'e',trigger.player).set('logSkill',['qiaomeng',trigger.player]); - "step 1" - if(result.bool){ - var card=result.cards[0]; - if(get.position(card)=='d'){ - if(get.subtype(card)=='equip3'||get.subtype(card)=='equip4'||get.subtype(card)=='equip6'){ - player.gain(card,player,'gain2'); + }, + qiaomeng: { + audio: 2, + trigger: { source: "damageSource" }, + direct: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + event.card.name == "sha" && + event.cards && + get.color(event.cards) == "black" && + event.player.countDiscardableCards(player, "hej") + ); + }, + content: function () { + "step 0"; + player + .discardPlayerCard(get.prompt("qiaomeng", trigger.player), "e", trigger.player) + .set("logSkill", ["qiaomeng", trigger.player]); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + if (get.position(card) == "d") { + if ( + get.subtype(card) == "equip3" || + get.subtype(card) == "equip4" || + get.subtype(card) == "equip6" + ) { + player.gain(card, player, "gain2"); } } } - } - }, - rekurou:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:true, - check:function(card){ - return 8-get.value(card); }, - position:'he', - content:function(){ + }, + rekurou: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + check: function (card) { + return 8 - get.value(card); + }, + position: "he", + content: function () { player.loseHp(); }, - ai:{ - order:8, - result:{ - player:function(player){ - return get.effect(player,{name:'losehp'},player,player); - } + ai: { + order: 8, + result: { + player: function (player) { + return get.effect(player, { name: "losehp" }, player, player); + }, }, - neg:true - } + neg: true, + }, }, - zhaxiang:{ - audio:2, - audioname:['ol_sb_jiangwei'], - trigger:{player:'loseHpEnd'}, - forced:true, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + zhaxiang: { + audio: 2, + audioname: ["ol_sb_jiangwei"], + trigger: { player: "loseHpEnd" }, + forced: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; player.draw(3); - if(player.isPhaseUsing()){ - player.addTempSkill('zhaxiang2'); - player.addMark('zhaxiang2',1,false); + if (player.isPhaseUsing()) { + player.addTempSkill("zhaxiang2"); + player.addMark("zhaxiang2", 1, false); } - 'step 2' - if(event.count>0&&player.hasSkill('zhaxiang')&&!get.is.blocked('zhaxiang',player)){ - player.logSkill('zhaxiang'); + ("step 2"); + if ( + event.count > 0 && + player.hasSkill("zhaxiang") && + !get.is.blocked("zhaxiang", player) + ) { + player.logSkill("zhaxiang"); event.goto(1); } }, - ai:{ - maihp:true, - effect:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,1]; + ai: { + maihp: true, + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, 1]; return 1.2; } - if(get.tag(card,'loseHp')){ - if(target.hp<=1) return; - var using=target.isPhaseUsing(); - if(target.hp<=2) return [1,player.countCards('h')<=1&&using?3:0]; - if(using&&target.countCards('h',{name:'sha',color:'red'})) return [1,3]; - return [1,(target.countCards('h')<=target.hp||using&&game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)<0&&player.inRange(current); - }))?3:2] + if (get.tag(card, "loseHp")) { + if (target.hp <= 1) return; + var using = target.isPhaseUsing(); + if (target.hp <= 2) return [1, player.countCards("h") <= 1 && using ? 3 : 0]; + if (using && target.countCards("h", { name: "sha", color: "red" })) return [1, 3]; + return [ + 1, + target.countCards("h") <= target.hp || + (using && + game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) < 0 && + player.inRange(current) + ); + })) + ? 3 + : 2, + ]; } - } - } - }, - zhaxiang2:{ - mod:{ - targetInRange:function(card,player,target,now){ - if(card.name=='sha'&&get.color(card)=='red') return true; }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.storage.zhaxiang2; - } }, - charlotte:true, - onremove:true, - audio:'zhaxiang', - audioname:['ol_sb_jiangwei'], - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&get.color(event.card)=='red'; + }, + zhaxiang2: { + mod: { + targetInRange: function (card, player, target, now) { + if (card.name == "sha" && get.color(card) == "red") return true; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.storage.zhaxiang2; + }, }, - forced:true, - content:function(){ + charlotte: true, + onremove: true, + audio: "zhaxiang", + audioname: ["ol_sb_jiangwei"], + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && get.color(event.card) == "red"; + }, + forced: true, + content: function () { trigger.directHit.addArray(game.players); }, - intro:{content:'
  • 使用【杀】的次数上限+#
  • 使用红色【杀】无距离限制且不能被【闪】响应'}, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg.card.name=='sha'&&get.color(arg.card)=='red'; + intro: { + content: "
  • 使用【杀】的次数上限+#
  • 使用红色【杀】无距离限制且不能被【闪】响应", + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.card.name == "sha" && get.color(arg.card) == "red"; }, }, }, - zhuhai:{ - audio:2, - audioname:['gz_re_xushu'], - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return event.player.isIn()&&event.player.getStat('damage')&& - lib.filter.targetEnabled({name:'sha'},player,event.player)&&(player.hasSha()||_status.connectMode&&player.countCards('h')>0); + zhuhai: { + audio: 2, + audioname: ["gz_re_xushu"], + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + event.player.isIn() && + event.player.getStat("damage") && + lib.filter.targetEnabled({ name: "sha" }, player, event.player) && + (player.hasSha() || (_status.connectMode && player.countCards("h") > 0)) + ); + }, + content: function () { + player + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "诛害:是否对" + get.translation(trigger.player) + "使用一张杀?") + .set("logSkill", "zhuhai") + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.player); }, - content:function(){ - player.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'诛害:是否对'+get.translation(trigger.player)+'使用一张杀?').set('logSkill','zhuhai').set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',trigger.player); - } }, - qianxin:{ - skillAnimation:true, - animationColor:'orange', - audio:2, - unique:true, - juexingji:true, - trigger:{source:'damageSource'}, - forced:true, - derivation:'jianyan', - filter:function(event,player){ - return player.hp2) return 'trick'; - return 'red'; + content: function () { + "step 0"; + player.chooseControl(["red", "black", "basic", "trick", "equip"]).set("ai", function () { + var player = _status.event.player; + if (!player.hasShan()) return "basic"; + if (player.countCards("e") <= 1) return "equip"; + if (player.countCards("h") > 2) return "trick"; + return "red"; }); - "step 1" - event.card=get.cardPile(function(card){ - if(get.color(card)==result.control) return true; - if(get.type(card,'trick')==result.control) return true; + ("step 1"); + event.card = get.cardPile(function (card) { + if (get.color(card) == result.control) return true; + if (get.type(card, "trick") == result.control) return true; return false; - },'cardPile'); - if(!event.card){ + }, "cardPile"); + if (!event.card) { event.finish(); return; } player.showCards([event.card]); - "step 2" - player.chooseTarget(true,'选择一名男性角色送出'+get.translation(event.card),function(card,player,target){ - return target.hasSex('male'); - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.neg) return -att; - return att; - }).set('neg',get.value(event.card,player,'raw')<0); - "step 3" - player.line(result.targets,'green'); - result.targets[0].gain(event.card,'gain2'); + ("step 2"); + player + .chooseTarget( + true, + "选择一名男性角色送出" + get.translation(event.card), + function (card, player, target) { + return target.hasSex("male"); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.neg) return -att; + return att; + }) + .set("neg", get.value(event.card, player, "raw") < 0); + ("step 3"); + player.line(result.targets, "green"); + result.targets[0].gain(event.card, "gain2"); }, - ai:{ - order:9, - result:{ - player:function(player){ - if(game.hasPlayer(function(current){ - return current.hasSex('male')&&get.attitude(player,current)>0; - })) return 2; + ai: { + order: 9, + result: { + player: function (player) { + if ( + game.hasPlayer(function (current) { + return current.hasSex("male") && get.attitude(player, current) > 0; + }) + ) + return 2; return 0; }, }, - threaten:1.2 - } + threaten: 1.2, + }, }, - reguose:{ - audio:2, - enable:'phaseUse', - usable:1, - discard:false, - lose:false, - delay:false, - filter:function(event,player){ - return player.countCards('hes',{suit:'diamond'})>0; + reguose: { + audio: 2, + enable: "phaseUse", + usable: 1, + discard: false, + lose: false, + delay: false, + filter: function (event, player) { + return player.countCards("hes", { suit: "diamond" }) > 0; }, - position:'hes', - filterCard:{suit:'diamond'}, - filterTarget:function(card,player,target){ - if(get.position(ui.selected.cards[0])!='s'&&lib.filter.cardDiscardable(ui.selected.cards[0],player,'reguose')&&target.hasJudge('lebu')) return true; - if(player==target) return false; - if(!game.checkMod(ui.selected.cards[0],player,'unchanged','cardEnabled2',player)) return false; - return player.canUse({name:'lebu',cards:ui.selected.cards},target); + position: "hes", + filterCard: { suit: "diamond" }, + filterTarget: function (card, player, target) { + if ( + get.position(ui.selected.cards[0]) != "s" && + lib.filter.cardDiscardable(ui.selected.cards[0], player, "reguose") && + target.hasJudge("lebu") + ) + return true; + if (player == target) return false; + if (!game.checkMod(ui.selected.cards[0], player, "unchanged", "cardEnabled2", player)) + return false; + return player.canUse({ name: "lebu", cards: ui.selected.cards }, target); }, - check:function(card){ - return 7-get.value(card); + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - if(target.hasJudge('lebu')){ + content: function () { + if (target.hasJudge("lebu")) { player.discard(cards); - target.discard(target.getJudge('lebu')); - } - else{ - player.useCard({name:'lebu'},target,cards).audio=false; + target.discard(target.getJudge("lebu")); + } else { + player.useCard({ name: "lebu" }, target, cards).audio = false; } player.draw(); }, - ai:{ - result:{ - target:function(player,target){ - if(target.hasJudge('lebu')) return -get.effect(target,{name:'lebu'},player,target); - return get.effect(target,{name:'lebu'},player,target); - } + ai: { + result: { + target: function (player, target) { + if (target.hasJudge("lebu")) + return -get.effect(target, { name: "lebu" }, player, target); + return get.effect(target, { name: "lebu" }, player, target); + }, }, - order:9, - } + order: 9, + }, }, - fenwei:{ - skillAnimation:true, - animationColor:'wood', - audio:2, - audioname:['heqi'], - unique:true, - mark:true, - limited:true, - trigger:{global:'useCardToPlayered'}, + fenwei: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + audioname: ["heqi"], + unique: true, + mark: true, + limited: true, + trigger: { global: "useCardToPlayered" }, //priority:5, - filter:function(event,player){ - if(event.getParent().triggeredTargets3.length>1) return false; - if(get.type(event.card)!='trick') return false; - if(get.info(event.card).multitarget) return false; - if(event.targets.length<2) return false; - if(player.storage.fenwei) return false; + filter: function (event, player) { + if (event.getParent().triggeredTargets3.length > 1) return false; + if (get.type(event.card) != "trick") return false; + if (get.info(event.card).multitarget) return false; + if (event.targets.length < 2) return false; + if (player.storage.fenwei) return false; return true; }, - init:function(player){ - player.storage.fenwei=false; + init: function (player) { + player.storage.fenwei = false; }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('fenwei'), - [1,trigger.targets.length],function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - if(game.phaseNumber>game.players.length*2&&trigger.targets.length>=game.players.length-1&&!trigger.excluded.includes(target)){ - return -get.effect(target,trigger.card,trigger.player,_status.event.player); - } - return -1; - }).set('targets',trigger.targets); - "step 1" - if(result.bool){ - player.awakenSkill('fenwei'); - player.logSkill('fenwei',result.targets); - player.storage.fenwei=true; + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("fenwei"), + [1, trigger.targets.length], + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + if ( + game.phaseNumber > game.players.length * 2 && + trigger.targets.length >= game.players.length - 1 && + !trigger.excluded.includes(target) + ) { + return -get.effect( + target, + trigger.card, + trigger.player, + _status.event.player + ); + } + return -1; + }) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + player.awakenSkill("fenwei"); + player.logSkill("fenwei", result.targets); + player.storage.fenwei = true; trigger.getParent().excluded.addArray(result.targets); game.delay(); } }, - intro:{ - content:'limited' - } + intro: { + content: "limited", + }, }, - chulao:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - if(player==target) return false; - if(target.group=='unknown') return false; - for(var i=0;i0; + return target.countCards("he") > 0; }, - filter:function(event,player){ - return player.countCards('he')>0; + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - position:'he', - selectTarget:[1,Infinity], - check:function(card){ - if(get.suit(card)=='spade') return 8-get.value(card); - return 5-get.value(card); + filterCard: true, + position: "he", + selectTarget: [1, Infinity], + check: function (card) { + if (get.suit(card) == "spade") return 8 - get.value(card); + return 5 - get.value(card); }, - content:function(){ - "step 0" - if(num==0&&get.suit(cards[0])=='spade') player.draw(); - player.choosePlayerCard(targets[num],'he',true); - "step 1" - if(result.bool){ - if(result.links.length) targets[num].discard(result.links[0]); - if(get.suit(result.links[0])=='spade') targets[num].draw(); + content: function () { + "step 0"; + if (num == 0 && get.suit(cards[0]) == "spade") player.draw(); + player.choosePlayerCard(targets[num], "he", true); + ("step 1"); + if (result.bool) { + if (result.links.length) targets[num].discard(result.links[0]); + if (get.suit(result.links[0]) == "spade") targets[num].draw(); } }, - ai:{ - result:{ - target:-1 + ai: { + result: { + target: -1, }, - threaten:1.2, - order:3 - } + threaten: 1.2, + order: 3, + }, }, - xunxun:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - preHidden:true, - content:function(){ - "step 0" - var cards=get.cards(4); + xunxun: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + preHidden: true, + content: function () { + "step 0"; + var cards = get.cards(4); game.cardsGotoOrdering(cards); - var next=player.chooseToMove('恂恂:将两张牌置于牌堆顶',true); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('filterMove',function(from,to,moved){ - if(to==1&&moved[1].length>=2) return false; + var next = player.chooseToMove("恂恂:将两张牌置于牌堆顶", true); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("filterMove", function (from, to, moved) { + if (to == 1 && moved[1].length >= 2) return false; return true; }); - next.set('filterOk',function(moved){ - return moved[1].length==2; + next.set("filterOk", function (moved) { + return moved[1].length == 2; }); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0).sort(function(a,b){ - return get.value(b)-get.value(a); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.value(a); }); - return [cards,cards.splice(2)]; - }) - 'step 1' - var top=result.moved[0]; - var bottom=result.moved[1]; + return [cards, cards.splice(2)]; + }); + ("step 1"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - for(var i=0;i-3; - return get.attitude(player,event.player)>-3; + check: function (event, player) { + if (player.isPhaseUsing()) return true; + if (event.player == player) return get.attitude(player, event.source) > -3; + return get.attitude(player, event.player) > -3; }, - logTarget:function(event,player){ - if(event.player==player) return event.source; + logTarget: function (event, player) { + if (event.player == player) return event.source; return event.player; }, - preHidden:true, - content:function(){ - "step 0" - event.count=trigger.num; - "step 1" - game.asyncDraw([trigger.player,trigger.source]); + preHidden: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); + game.asyncDraw([trigger.player, trigger.source]); event.count--; - "step 2" + ("step 2"); game.delay(); - "step 3" - if(event.count&&player.hasSkill('wangxi')){ - player.chooseBool(get.prompt2('wangxi',lib.skill.wangxi.logTarget(trigger,player))) - } - else event.finish(); - "step 4" - if(result.bool){ - player.logSkill('wangxi',lib.skill.wangxi.logTarget(trigger,player)); + ("step 3"); + if (event.count && player.hasSkill("wangxi")) { + player.chooseBool(get.prompt2("wangxi", lib.skill.wangxi.logTarget(trigger, player))); + } else event.finish(); + ("step 4"); + if (result.bool) { + player.logSkill("wangxi", lib.skill.wangxi.logTarget(trigger, player)); event.goto(1); } }, - ai:{ - maixie:true, - maixie_hp:true - } - }, - refangquan:{ - audio:2, - trigger:{player:'phaseUseBefore'}, - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasSkill('fangquan3'); + ai: { + maixie: true, + maixie_hp: true, }, - direct:true, - content:function(){ - "step 0" - var fang=player.countMark('fangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.maxHp+1; - player.chooseBool(get.prompt2('refangquan')).set('ai',function(){ - if(!_status.event.fang) return false; - return game.hasPlayer(function(target){ - if(target.hasJudge('lebu')||target==player) return false; - if(get.attitude(player,target)>4){ - return (get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1)>0); - } - return false; - }); - }).set('fang',fang); - "step 1" - if(result.bool){ - player.logSkill('refangquan'); + }, + refangquan: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("fangquan3"); + }, + direct: true, + content: function () { + "step 0"; + var fang = + player.countMark("fangquan2") == 0 && + player.hp >= 2 && + player.countCards("h") <= player.maxHp + 1; + player + .chooseBool(get.prompt2("refangquan")) + .set("ai", function () { + if (!_status.event.fang) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return ( + get.threaten(target) / + Math.sqrt(target.hp + 1) / + Math.sqrt(target.countCards("h") + 1) > + 0 + ); + } + return false; + }); + }) + .set("fang", fang); + ("step 1"); + if (result.bool) { + player.logSkill("refangquan"); trigger.cancel(); - player.addTempSkill('fangquan2','phaseAfter'); - player.addMark('fangquan2',1,false); - player.addTempSkill('refangquan2'); + player.addTempSkill("fangquan2", "phaseAfter"); + player.addMark("fangquan2", 1, false); + player.addTempSkill("refangquan2"); //player.storage.fangquan=result.targets[0]; } - } + }, }, - refangquan2:{ - mod:{ - maxHandcardBase:function(player,num){ + refangquan2: { + mod: { + maxHandcardBase: function (player, num) { return player.maxHp; }, }, }, - rehunzi:{ - inherit:'hunzi', - filter:function(event,player){ - return player.hp<=2&&!player.storage.rehunzi; + rehunzi: { + inherit: "hunzi", + filter: function (event, player) { + return player.hp <= 2 && !player.storage.rehunzi; }, - ai:{ - threaten:function(player,target){ - if(target.hp<=2) return 2; + ai: { + threaten: function (player, target) { + if (target.hp <= 2) return 2; return 0.5; }, - maixie:true, - effect:{ - target:function(card,player,target){ - if(!target.hasFriend()) return; - if(target.hp===3&&get.tag(card,'damage')==1&&!target.isTurnedOver()&& - _status.currentPhase!=target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [0.5,1]; - if(target.hp===1&&get.tag(card,'recover')&&!target.isTurnedOver()&& - _status.currentPhase!==target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [1,-3]; - } - } - } - }, - rezhijian:{ - inherit:'zhijian', - group:['rezhijian_use'], - subfrequent:['use'], - subSkill:{ - use:{ - audio:'rezhijian', - trigger:{player:'useCard'}, - frequent:true, - filter:function(event,player){ - return get.type(event.card)=='equip'; - }, - prompt:'是否发动【直谏】摸一张牌?', - content:function(){ - player.draw('nodelay'); + maixie: true, + effect: { + target: function (card, player, target) { + if (!target.hasFriend()) return; + if ( + target.hp === 3 && + get.tag(card, "damage") == 1 && + !target.isTurnedOver() && + _status.currentPhase != target && + get.distance(_status.currentPhase, target, "absolute") <= 3 + ) + return [0.5, 1]; + if ( + target.hp === 1 && + get.tag(card, "recover") && + !target.isTurnedOver() && + _status.currentPhase !== target && + get.distance(_status.currentPhase, target, "absolute") <= 3 + ) + return [1, -3]; }, }, }, }, - retuntian:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + rezhijian: { + inherit: "zhijian", + group: ["rezhijian_use"], + subfrequent: ["use"], + subSkill: { + use: { + audio: "rezhijian", + trigger: { player: "useCard" }, + frequent: true, + filter: function (event, player) { + return get.type(event.card) == "equip"; + }, + prompt: "是否发动【直谏】摸一张牌?", + content: function () { + player.draw("nodelay"); + }, + }, }, - frequent:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(event.name=='gain'&&event.player==player) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + }, + retuntian: { + audio: 2, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - content:function(){ - player.judge(function(card){ + frequent: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; + }, + content: function () { + player.judge(function (card) { return 1; - }).callback=lib.skill.retuntian.callback; + }).callback = lib.skill.retuntian.callback; }, - callback:function(){ - 'step 0' - if(event.judgeResult.suit=='heart'){ - player.gain(card,'gain2'); + callback: function () { + "step 0"; + if (event.judgeResult.suit == "heart") { + player.gain(card, "gain2"); event.finish(); - } - else if(get.mode()=='guozhan'){ - player.chooseBool('是否将'+get.translation(card)+'作为“田”置于武将牌上?').set('frequentSkill','retuntian').ai=function(){ + } else if (get.mode() == "guozhan") { + player + .chooseBool("是否将" + get.translation(card) + "作为“田”置于武将牌上?") + .set("frequentSkill", "retuntian").ai = function () { return true; }; - } - else event.directbool=true; - 'step 1' - if(!result.bool&&!event.directbool){ + } else event.directbool = true; + ("step 1"); + if (!result.bool && !event.directbool) { //game.cardsDiscard(card); return; } - player.addToExpansion(card,'gain2').gaintag.add('tuntian'); + player.addToExpansion(card, "gain2").gaintag.add("tuntian"); }, - group:'tuntian_dist', - locked:false, - ai:{ - effect:{ - target:function(){ - return lib.skill.tuntian.ai.effect.target.apply(this,arguments); - } + group: "tuntian_dist", + locked: false, + ai: { + effect: { + target: function () { + return lib.skill.tuntian.ai.effect.target.apply(this, arguments); + }, }, - threaten:function(player,target){ - if(target.countCards('h')==0) return 2; + threaten: function (player, target) { + if (target.countCards("h") == 0) return 2; return 0.5; }, - nodiscard:true, - nolose:true - } + nodiscard: true, + nolose: true, + }, }, - rebeige:{ - audio:'beige', - audioname:['re_caiwenji'], - trigger:{global:'damageEnd'}, - filter:function(event,player){ - return (event.card&&event.card.name=='sha'&&event.source&& - event.player.classList.contains('dead')==false&&player.countCards('he')); + rebeige: { + audio: "beige", + audioname: ["re_caiwenji"], + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.source && + event.player.classList.contains("dead") == false && + player.countCards("he") + ); }, - direct:true, - checkx:function(event,player){ - var att1=get.attitude(player,event.player); - var att2=get.attitude(player,event.source); - return att1>0&&att2<=0; + direct: true, + checkx: function (event, player) { + var att1 = get.attitude(player, event.player); + var att2 = get.attitude(player, event.source); + return att1 > 0 && att2 <= 0; }, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he',get.prompt2('rebeige',trigger.player)); - var check=lib.skill.beige.checkx(trigger,player); - next.set('ai',function(card){ - if(_status.event.goon) return 8-get.value(card); + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", get.prompt2("rebeige", trigger.player)); + var check = lib.skill.beige.checkx(trigger, player); + next.set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); return 0; }); - next.set('logSkill','rebeige'); - next.set('goon',check); - "step 1" - if(result.bool){ + next.set("logSkill", "rebeige"); + next.set("goon", check); + ("step 1"); + if (result.bool) { trigger.player.judge(); - } - else{ + } else { event.finish(); } - "step 2" - switch(result.suit){ - case 'heart':trigger.player.recover(trigger.num);break; - case 'diamond':trigger.player.draw(3);break; - case 'club':trigger.source.chooseToDiscard('he',2,true);break; - case 'spade':trigger.source.turnOver();break; + ("step 2"); + switch (result.suit) { + case "heart": + trigger.player.recover(trigger.num); + break; + case "diamond": + trigger.player.draw(3); + break; + case "club": + trigger.source.chooseToDiscard("he", 2, true); + break; + case "spade": + trigger.source.turnOver(); + break; } }, - ai:{ - expose:0.3 - } - }, - rexingshang:{ - audio:2, - trigger:{global:'die'}, - filter:function(event,player){ - return player.isDamaged()||event.player.countCards('he')>0; + ai: { + expose: 0.3, }, - direct:true, - content:function(){ - "step 0" - var choice=[]; - if(player.isDamaged()) choice.push('回复体力'); - if(trigger.player.countCards('he')) choice.push('获得牌'); - choice.push('cancel2'); - player.chooseControl(choice).set('prompt',get.prompt2('rexingshang')).set('ai',function(){ - if(choice.length==2) return 0; - if(get.value(trigger.player.getCards('he'))>8) return 1; - return 0; - }); - "step 1" - if(result.control!='cancel2'){ - player.logSkill(event.name,trigger.player); - if(result.control=='获得牌'){ - event.togain=trigger.player.getCards('he'); - player.gain(event.togain,trigger.player,'giveAuto','bySelf'); - } - else player.recover(); + }, + rexingshang: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return player.isDamaged() || event.player.countCards("he") > 0; + }, + direct: true, + content: function () { + "step 0"; + var choice = []; + if (player.isDamaged()) choice.push("回复体力"); + if (trigger.player.countCards("he")) choice.push("获得牌"); + choice.push("cancel2"); + player + .chooseControl(choice) + .set("prompt", get.prompt2("rexingshang")) + .set("ai", function () { + if (choice.length == 2) return 0; + if (get.value(trigger.player.getCards("he")) > 8) return 1; + return 0; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill(event.name, trigger.player); + if (result.control == "获得牌") { + event.togain = trigger.player.getCards("he"); + player.gain(event.togain, trigger.player, "giveAuto", "bySelf"); + } else player.recover(); } }, }, - refangzhu:{ - audio:2, - trigger:{ - player:"damageEnd", + refangzhu: { + audio: 2, + trigger: { + player: "damageEnd", }, - direct:true, - content:function (){ - "step 0" - player.chooseTarget(get.prompt2('refangzhu'),function(card,player,target){ - return player!=target - }).ai=function(target){ - if(target.hasSkillTag('noturn')) return 0; - var player=_status.event.player; - if(get.attitude(_status.event.player,target)==0) return 0; - if(get.attitude(_status.event.player,target)>0){ - if(target.classList.contains('turnedover')) return 1000-target.countCards('h'); - if(player.getDamagedHp()<3) return -1; - return 100-target.countCards('h'); + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("refangzhu"), function (card, player, target) { + return player != target; + }).ai = function (target) { + if (target.hasSkillTag("noturn")) return 0; + var player = _status.event.player; + if (get.attitude(_status.event.player, target) == 0) return 0; + if (get.attitude(_status.event.player, target) > 0) { + if (target.classList.contains("turnedover")) return 1000 - target.countCards("h"); + if (player.getDamagedHp() < 3) return -1; + return 100 - target.countCards("h"); + } else { + if (target.classList.contains("turnedover")) return -1; + if (player.getDamagedHp() >= 3) return -1; + return 1 + target.countCards("h"); } - else{ - if(target.classList.contains('turnedover')) return -1; - if(player.getDamagedHp()>=3) return -1; - return 1+target.countCards('h'); - } - } - "step 1" - if(result.bool){ - player.logSkill('refangzhu',result.targets); - event.target=result.targets[0]; - if(player.isHealthy()) event._result={bool:false}; - else event.target.chooseToDiscard('he',player.getDamagedHp()).set('ai',function(card){ - var player=_status.event.player; - if(player.isTurnedOver()||_status.event.getTrigger().player.getDamagedHp()>2) return -1; - return (player.hp*player.hp)-get.value(card); - }).set('prompt','弃置'+get.cnNumber(player.getDamagedHp())+'张牌并失去1点体力;或选择不弃置,将武将牌翻面并摸'+get.cnNumber(player.getDamagedHp())+'张牌。'); - } - else event.finish(); - "step 2" - if(result.bool){ + }; + ("step 1"); + if (result.bool) { + player.logSkill("refangzhu", result.targets); + event.target = result.targets[0]; + if (player.isHealthy()) event._result = { bool: false }; + else + event.target + .chooseToDiscard("he", player.getDamagedHp()) + .set("ai", function (card) { + var player = _status.event.player; + if ( + player.isTurnedOver() || + _status.event.getTrigger().player.getDamagedHp() > 2 + ) + return -1; + return player.hp * player.hp - get.value(card); + }) + .set( + "prompt", + "弃置" + + get.cnNumber(player.getDamagedHp()) + + "张牌并失去1点体力;或选择不弃置,将武将牌翻面并摸" + + get.cnNumber(player.getDamagedHp()) + + "张牌。" + ); + } else event.finish(); + ("step 2"); + if (result.bool) { event.target.loseHp(); - } - else{ - if(player.isDamaged()) event.target.draw(player.getDamagedHp()); + } else { + if (player.isDamaged()) event.target.draw(player.getDamagedHp()); event.target.turnOver(); } }, - ai:{ - maixie:true, - "maixie_hp":true, - effect:{ - target:function (card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; - if(target.hp<=1) return; - if(!target.hasFriend()) return; - var hastarget=false; - var turnfriend=false; - var players=game.filterPlayer(); - for(var i=0;i0&&players[i].isTurnedOver()){ - hastarget=true; - turnfriend=true; + if (get.attitude(target, players[i]) > 0 && players[i].isTurnedOver()) { + hastarget = true; + turnfriend = true; } } - if(get.attitude(player,target)>0&&!hastarget) return; - if(turnfriend||target.hp==target.maxHp) return [0.5,1]; - if(target.hp>1) return [1,0.5]; + if (get.attitude(player, target) > 0 && !hastarget) return; + if (turnfriend || target.hp == target.maxHp) return [0.5, 1]; + if (target.hp > 1) return [1, 0.5]; } }, }, }, }, - repolu:{ - audio:1, - trigger:{ - source:'dieAfter', - player:'die', + repolu: { + audio: 1, + trigger: { + source: "dieAfter", + player: "die", }, - forceDie:true, - filter:function(event,player,name){ - return name=='die'||player.isIn(); + forceDie: true, + filter: function (event, player, name) { + return name == "die" || player.isIn(); }, - direct:true, - content:function(){ - 'step 0' - if(!player.storage.repolu) player.storage.repolu=0; - event.num=player.storage.repolu+1; - player.chooseTarget([1,Infinity],get.prompt('repolu'),'令任意名角色摸'+get.cnNumber(event.num)+'张牌').set('forceDie',true).ai=function(target){ - return get.attitude(_status.event.player,target); + direct: true, + content: function () { + "step 0"; + if (!player.storage.repolu) player.storage.repolu = 0; + event.num = player.storage.repolu + 1; + player + .chooseTarget( + [1, Infinity], + get.prompt("repolu"), + "令任意名角色摸" + get.cnNumber(event.num) + "张牌" + ) + .set("forceDie", true).ai = function (target) { + return get.attitude(_status.event.player, target); }; - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { player.storage.repolu++; result.targets.sortBySeat(); - player.logSkill('repolu',result.targets); - game.asyncDraw(result.targets,num); - } - else event.finish(); - 'step 2' + player.logSkill("repolu", result.targets); + game.asyncDraw(result.targets, num); + } else event.finish(); + ("step 2"); game.delay(); }, }, - oljiuchi:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='jiu') return Infinity; + oljiuchi: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "jiu") return Infinity; }, }, - audio:2, - enable:'chooseToUse', - filterCard:function(card){ - return get.suit(card)=='spade'; + audio: 2, + enable: "chooseToUse", + filterCard: function (card) { + return get.suit(card) == "spade"; }, - viewAs:{name:'jiu'}, - position:'hs', - viewAsFilter:function(player){ - return player.hasCard(card=>get.suit(card)=='spade','hs'); + viewAs: { name: "jiu" }, + position: "hs", + viewAsFilter: function (player) { + return player.hasCard((card) => get.suit(card) == "spade", "hs"); }, - prompt:'将一张黑桃手牌当酒使用', - check:function(cardx,player){ - if(player&&player==cardx.player) return true; - if(_status.event.type=='dying') return 1; - var player=_status.event.player; - var shas=player.getCards('hs',function(card){ - return card!=cardx&&get.name(card,player)=='sha'; + prompt: "将一张黑桃手牌当酒使用", + check: function (cardx, player) { + if (player && player == cardx.player) return true; + if (_status.event.type == "dying") return 1; + var player = _status.event.player; + var shas = player.getCards("hs", function (card) { + return card != cardx && get.name(card, player) == "sha"; }); - if(!shas.length) return -1; - if(shas.length>1&&(player.getCardUsable('sha')>1||player.countCards('hs','zhuge'))){ + if (!shas.length) return -1; + if ( + shas.length > 1 && + (player.getCardUsable("sha") > 1 || player.countCards("hs", "zhuge")) + ) { return 0; } - shas.sort(function(a,b){ - return get.order(b)-get.order(a); + shas.sort(function (a, b) { + return get.order(b) - get.order(a); }); - var card=false; - if(shas.length){ - for(var i=0;i1+(player.storage.jiu||0) - &&player.canUse(card,current,true,true)&& - !current.hasSkillTag('filterDamage',null,{ - player:player, - card:card, - jiu:true, - })&& - get.effect(current,card,player)>0); - })){ - return 4-get.value(cardx); + if (card) { + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + !current.hasShan() && + current.hp + current.countCards("h", { name: ["tao", "jiu"] }) > + 1 + (player.storage.jiu || 0) && + player.canUse(card, current, true, true) && + !current.hasSkillTag("filterDamage", null, { + player: player, + card: card, + jiu: true, + }) && + get.effect(current, card, player) > 0 + ); + }) + ) { + return 4 - get.value(cardx); } } return -1; }, - ai:{ - threaten:1.5, + ai: { + threaten: 1.5, }, - trigger:{source:'damageEnd'}, - locked:false, - forced:true, - filter:function(event,player){ - if(event.name=='chooseToUse') return player.hasCard(card=>get.suit(card)=='spade','hs'); - return event.card&&event.card.name=='sha'&&event.getParent(2).jiu==true&&!player.hasSkill('oljiuchi_air'); + trigger: { source: "damageEnd" }, + locked: false, + forced: true, + filter: function (event, player) { + if (event.name == "chooseToUse") + return player.hasCard((card) => get.suit(card) == "spade", "hs"); + return ( + event.card && + event.card.name == "sha" && + event.getParent(2).jiu == true && + !player.hasSkill("oljiuchi_air") + ); }, - content:function(){ - player.logSkill('oljiuchi'); - player.addTempSkill('oljiuchi_air'); + content: function () { + player.logSkill("oljiuchi"); + player.addTempSkill("oljiuchi_air"); }, - subSkill:{ - air:{}, + subSkill: { + air: {}, }, }, - rezaiqi:{ - count:function(){ - var num=0; - game.countPlayer2(function(current){ - current.getHistory('lose',function(evt){ - if(evt.position==ui.discardPile){ - for(var i=0;i0; + audio: 2, + direct: true, + filter: function (event, player) { + return lib.skill.rezaiqi.count() > 0; }, - trigger:{ - player:'phaseJieshuBegin' + trigger: { + player: "phaseJieshuBegin", }, - content:function(){ - 'step 0' - player.chooseTarget([1,lib.skill.rezaiqi.count()],get.prompt2('rezaiqi')).ai=function(target){ - return get.attitude(_status.event.player,target); - }; - 'step 1' - if(result.bool){ - var targets=result.targets; + content: function () { + "step 0"; + player.chooseTarget([1, lib.skill.rezaiqi.count()], get.prompt2("rezaiqi")).ai = + function (target) { + return get.attitude(_status.event.player, target); + }; + ("step 1"); + if (result.bool) { + var targets = result.targets; targets.sortBySeat(); - player.line(targets,'fire'); - player.logSkill('rezaiqi',targets); - event.targets=targets; - } - else event.finish(); - 'step 2' - event.current=targets.shift(); - if(player.isHealthy()) event._result={index:0}; - else event.current.chooseControl().set('choiceList',[ - '摸一张牌', - '令'+get.translation(player)+'回复1点体力', - ]).set('ai',function(){ - if(get.attitude(event.current,player)>0) return 1; - return 0; - }); - 'step 3' - if(result.index==1){ + player.line(targets, "fire"); + player.logSkill("rezaiqi", targets); + event.targets = targets; + } else event.finish(); + ("step 2"); + event.current = targets.shift(); + if (player.isHealthy()) event._result = { index: 0 }; + else + event.current + .chooseControl() + .set("choiceList", ["摸一张牌", "令" + get.translation(player) + "回复1点体力"]) + .set("ai", function () { + if (get.attitude(event.current, player) > 0) return 1; + return 0; + }); + ("step 3"); + if (result.index == 1) { event.current.line(player); player.recover(); - } - else event.current.draw(); + } else event.current.draw(); game.delay(); - if(targets.length) event.goto(2); + if (targets.length) event.goto(2); }, }, }, - dynamicTranslate:{ - rejiushi:function(player){ - if(player.storage.chengzhang) return '当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。'; - return '当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。'; + dynamicTranslate: { + rejiushi: function (player) { + if (player.storage.chengzhang) + return "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。"; + return "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。"; }, - rejiaozhao:function(player){ - return ['出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。','出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。','出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。'][player.countMark('redanxin')]; + rejiaozhao: function (player) { + return [ + "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。", + "出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。", + "出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。", + ][player.countMark("redanxin")]; }, }, - translate:{ - re_zhangliao:'界张辽', - re_zhangliao_prefix:'界', - re_simayi:'界司马懿', - re_simayi_prefix:'界', - re_xuzhu:'界许褚', - re_xuzhu_prefix:'界', - re_xiahoudun:'界夏侯惇', - re_xiahoudun_prefix:'界', - re_lvmeng:'界吕蒙', - re_lvmeng_prefix:'界', - re_zhouyu:'界周瑜', - re_zhouyu_prefix:'界', - re_luxun:'界陆逊', - re_luxun_prefix:'界', - re_zhaoyun:'界赵云', - re_zhaoyun_prefix:'界', - re_guanyu:'界关羽', - re_guanyu_prefix:'界', - re_zhangfei:'界张飞', - re_zhangfei_prefix:'界', - re_machao:'界马超', - re_machao_prefix:'界', - re_caocao:'界曹操', - re_caocao_prefix:'界', - re_guojia:'界郭嘉', - re_guojia_prefix:'界', - re_lvbu:'界吕布', - re_lvbu_prefix:'界', - re_huanggai:'界黄盖', - re_huanggai_prefix:'界', - re_daqiao:'界大乔', - re_daqiao_prefix:'界', - re_ganning:'界甘宁', - re_ganning_prefix:'界', - re_huatuo:'界华佗', - re_huatuo_prefix:'界', - re_liubei:'界刘备', - re_liubei_prefix:'界', + translate: { + re_zhangliao: "界张辽", + re_zhangliao_prefix: "界", + re_simayi: "界司马懿", + re_simayi_prefix: "界", + re_xuzhu: "界许褚", + re_xuzhu_prefix: "界", + re_xiahoudun: "界夏侯惇", + re_xiahoudun_prefix: "界", + re_lvmeng: "界吕蒙", + re_lvmeng_prefix: "界", + re_zhouyu: "界周瑜", + re_zhouyu_prefix: "界", + re_luxun: "界陆逊", + re_luxun_prefix: "界", + re_zhaoyun: "界赵云", + re_zhaoyun_prefix: "界", + re_guanyu: "界关羽", + re_guanyu_prefix: "界", + re_zhangfei: "界张飞", + re_zhangfei_prefix: "界", + re_machao: "界马超", + re_machao_prefix: "界", + re_caocao: "界曹操", + re_caocao_prefix: "界", + re_guojia: "界郭嘉", + re_guojia_prefix: "界", + re_lvbu: "界吕布", + re_lvbu_prefix: "界", + re_huanggai: "界黄盖", + re_huanggai_prefix: "界", + re_daqiao: "界大乔", + re_daqiao_prefix: "界", + re_ganning: "界甘宁", + re_ganning_prefix: "界", + re_huatuo: "界华佗", + re_huatuo_prefix: "界", + re_liubei: "界刘备", + re_liubei_prefix: "界", - re_diaochan:'界貂蝉', - re_diaochan_prefix:'界', - re_huangyueying:'界黄月英', - re_huangyueying_prefix:'界', - re_sunquan:'界孙权', - re_sunquan_prefix:'界', - re_sunshangxiang:'界孙尚香', - re_sunshangxiang_prefix:'界', - re_zhugeliang:'界诸葛亮', - re_zhugeliang_prefix:'界', - re_zhenji:'界甄宓', - re_zhenji_prefix:'界', - re_huaxiong:"界华雄", - re_huaxiong_prefix:'界', + re_diaochan: "界貂蝉", + re_diaochan_prefix: "界", + re_huangyueying: "界黄月英", + re_huangyueying_prefix: "界", + re_sunquan: "界孙权", + re_sunquan_prefix: "界", + re_sunshangxiang: "界孙尚香", + re_sunshangxiang_prefix: "界", + re_zhugeliang: "界诸葛亮", + re_zhugeliang_prefix: "界", + re_zhenji: "界甄宓", + re_zhenji_prefix: "界", + re_huaxiong: "界华雄", + re_huaxiong_prefix: "界", - ol_sp_zhugeliang:"界卧龙", - ol_sp_zhugeliang_prefix:'界', - re_zhangjiao:'界张角', - re_zhangjiao_prefix:'界', - re_sunce:'界孙策', - re_sunce_prefix:'界', - ol_yuanshao:'界袁绍', - ol_yuanshao_prefix:'界', - ol_liushan:'界刘禅', - ol_liushan_prefix:'界', + ol_sp_zhugeliang: "界卧龙", + ol_sp_zhugeliang_prefix: "界", + re_zhangjiao: "界张角", + re_zhangjiao_prefix: "界", + re_sunce: "界孙策", + re_sunce_prefix: "界", + ol_yuanshao: "界袁绍", + ol_yuanshao_prefix: "界", + ol_liushan: "界刘禅", + ol_liushan_prefix: "界", - olfangquan:'放权', - olfangquan_info:'出牌阶段开始前,你可以跳过此阶段。若如此做,弃牌阶段开始时,你可以弃置一张手牌,令一名其他角色进行一个额外回合。', - olruoyu:'若愚', - olruoyu_info:'主公技,觉醒技,准备阶段,若你的体力值为全场最少,则你加1点体力上限,将体力回复至3点,然后获得技能〖思蜀〗和〖激将〗。', - sishu:'思蜀', - sishu_info:'出牌阶段开始时,你可以选择一名角色。该角色本局游戏内【乐不思蜀】的判定效果反转。', - olluanji:'乱击', - olluanji_info:'你可以将两张花色相同的手牌当做【万箭齐发】使用。当你使用【万箭齐发】选择目标后,你可以为此牌减少一个目标。', - olluanji_remove:'乱击', - olxueyi:'血裔', - olxueyi_info:'主公技,锁定技。①游戏开始时,你获得2X个“裔”标记(X为场上群势力角色的数目)。②出牌阶段开始时,你可以移去一个“裔”标记,然后摸一张牌。③你的手牌上限+Y(Y为“裔”标记数)。', - olxueyi_draw:'血裔', - olhunzi:'魂姿', - olhunzi_info:'觉醒技,准备阶段,若你的体力值为1,你减1点体力上限并获得技能〖英姿〗和〖英魂〗;本回合的结束阶段,你摸两张牌或回复1点体力。', - olzhiba:'制霸', - olzhiba_info:'主公技,其他吴势力的角色的出牌阶段限一次,其可以与你拼点(你可拒绝此拼点)。若其没赢,你可以获得两张拼点牌。你的出牌阶段限一次,你可以和一名吴势力角色拼点,若你赢,你获得两张拼点牌。', - olzhiba2:'制霸', - xinleiji:'雷击', - xinleiji_misa:'雷击', - xinguidao:'鬼道', - xinleiji_info:'①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名角色造成2点雷电伤害;梅花:你回复1点体力并可对一名角色造成1点雷电伤害。', - xinleiji_append:'不能触发〖雷击〗的判定:〖暴虐〗、〖助祭〗、
    〖弘仪〗、〖孤影〗。
    ', - xinleiji_faq:'不能触发〖雷击〗的判定', - xinleiji_faq_info:'
    董卓/界董卓〖暴虐〗
    黄巾雷使〖助祭〗
    羊徽瑜〖弘仪〗
    鸣濑白羽〖孤影〗', - xinguidao_info:'一名角色的判定牌生效前,你可以打出一张黑色牌作为判定牌并获得原判定牌。若你以此法打出的牌为黑桃2-9,则你摸一张牌。', - xinhuangtian:'黄天', - xinhuangtian2:'黄天', - xinhuangtian_info:'主公技。其他群势力角色的出牌阶段限一次,该角色可以交给你一张【闪】或黑桃手牌。', - reqiangxi:"强袭", - "reqiangxi_info":"出牌阶段对每名其他角色限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张武器牌并对你攻击范围内的一名其他角色造成1点伤害。", - rehuoji:"火计", - rehuoji_info:"你可一张红色牌当作【火攻】使用。", - rekanpo:"看破", - rekanpo_info:"你可以将一张黑色牌当作【无懈可击】使用。", - reshuangxiong:"双雄", - reshuangxiong1:"双雄", - reshuangxiong2:"双雄", - reshuangxiong_info:"摸牌阶段,你可以放弃摸牌。若如此做,你亮出牌堆顶的两张牌并选择获得其中的一张。然后,你本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用。当你受到【决斗】造成的伤害时,你可以获得对方于此决斗中打出的所有【杀】。", + olfangquan: "放权", + olfangquan_info: + "出牌阶段开始前,你可以跳过此阶段。若如此做,弃牌阶段开始时,你可以弃置一张手牌,令一名其他角色进行一个额外回合。", + olruoyu: "若愚", + olruoyu_info: + "主公技,觉醒技,准备阶段,若你的体力值为全场最少,则你加1点体力上限,将体力回复至3点,然后获得技能〖思蜀〗和〖激将〗。", + sishu: "思蜀", + sishu_info: "出牌阶段开始时,你可以选择一名角色。该角色本局游戏内【乐不思蜀】的判定效果反转。", + olluanji: "乱击", + olluanji_info: + "你可以将两张花色相同的手牌当做【万箭齐发】使用。当你使用【万箭齐发】选择目标后,你可以为此牌减少一个目标。", + olluanji_remove: "乱击", + olxueyi: "血裔", + olxueyi_info: + "主公技,锁定技。①游戏开始时,你获得2X个“裔”标记(X为场上群势力角色的数目)。②出牌阶段开始时,你可以移去一个“裔”标记,然后摸一张牌。③你的手牌上限+Y(Y为“裔”标记数)。", + olxueyi_draw: "血裔", + olhunzi: "魂姿", + olhunzi_info: + "觉醒技,准备阶段,若你的体力值为1,你减1点体力上限并获得技能〖英姿〗和〖英魂〗;本回合的结束阶段,你摸两张牌或回复1点体力。", + olzhiba: "制霸", + olzhiba_info: + "主公技,其他吴势力的角色的出牌阶段限一次,其可以与你拼点(你可拒绝此拼点)。若其没赢,你可以获得两张拼点牌。你的出牌阶段限一次,你可以和一名吴势力角色拼点,若你赢,你获得两张拼点牌。", + olzhiba2: "制霸", + xinleiji: "雷击", + xinleiji_misa: "雷击", + xinguidao: "鬼道", + xinleiji_info: + "①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名角色造成2点雷电伤害;梅花:你回复1点体力并可对一名角色造成1点雷电伤害。", + xinleiji_append: + '不能触发〖雷击〗的判定:〖暴虐〗、〖助祭〗、
    〖弘仪〗、〖孤影〗。
    ', + xinleiji_faq: "不能触发〖雷击〗的判定", + xinleiji_faq_info: + "
    董卓/界董卓〖暴虐〗
    黄巾雷使〖助祭〗
    羊徽瑜〖弘仪〗
    鸣濑白羽〖孤影〗", + xinguidao_info: + "一名角色的判定牌生效前,你可以打出一张黑色牌作为判定牌并获得原判定牌。若你以此法打出的牌为黑桃2-9,则你摸一张牌。", + xinhuangtian: "黄天", + xinhuangtian2: "黄天", + xinhuangtian_info: + "主公技。其他群势力角色的出牌阶段限一次,该角色可以交给你一张【闪】或黑桃手牌。", + reqiangxi: "强袭", + reqiangxi_info: + "出牌阶段对每名其他角色限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张武器牌并对你攻击范围内的一名其他角色造成1点伤害。", + rehuoji: "火计", + rehuoji_info: "你可一张红色牌当作【火攻】使用。", + rekanpo: "看破", + rekanpo_info: "你可以将一张黑色牌当作【无懈可击】使用。", + reshuangxiong: "双雄", + reshuangxiong1: "双雄", + reshuangxiong2: "双雄", + reshuangxiong_info: + "摸牌阶段,你可以放弃摸牌。若如此做,你亮出牌堆顶的两张牌并选择获得其中的一张。然后,你本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用。当你受到【决斗】造成的伤害时,你可以获得对方于此决斗中打出的所有【杀】。", - reguanxing:'观星', - reguanxing_info:'准备阶段,你可以观看牌堆顶的五张牌(存活角色小于4时改为三张),并将其以任意顺序置于牌堆项或牌堆底,若你将〖观星〗的牌都放在了牌堆底,则你可以在结束阶段再次发动〖观星〗。', - reluoshen:'洛神', - reluoshen_info:'准备阶段,你可以进行判定,若结果为黑色则获得此判定牌,且可重复此流程直到出现红色的判定结果。你通过〖洛神〗得到的牌不计入当前回合的手牌上限。', - reluoshen_info_guozhan:'准备阶段,你可以进行判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过〖洛神〗得到的牌不计入当前回合的手牌上限(结果为黑色的判定牌于此过程中不会进入弃牌堆)。', - rejieyin:'结姻', - rejieyin_info:'出牌阶段限一次,你可以选择一名男性角色并弃置一张手牌或将装备区内的一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。', - rebiyue:'闭月', - rebiyue_info:'结束阶段,你可以摸一张牌,若你没有手牌,则改为摸两张牌。', - rejizhi:'集智', - rejizhi_info:'当你使用锦囊牌时,你可以摸一张牌。若此牌为基本牌,则你可以弃置之,然后令本回合手牌上限+1。', - reqicai:'奇才', - reqicai_info:'锁定技,你使用锦囊牌无距离限制,你装备区内的防具牌和宝物牌不能被其他角色弃置。', - rezhiheng:'制衡', - rezhiheng_info:'出牌阶段限一次,你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。', - rejiuyuan:'救援', - rejiuyuan_info:'主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,则其可以选择令你回复1点体力,然后其摸一张牌。', + reguanxing: "观星", + reguanxing_info: + "准备阶段,你可以观看牌堆顶的五张牌(存活角色小于4时改为三张),并将其以任意顺序置于牌堆项或牌堆底,若你将〖观星〗的牌都放在了牌堆底,则你可以在结束阶段再次发动〖观星〗。", + reluoshen: "洛神", + reluoshen_info: + "准备阶段,你可以进行判定,若结果为黑色则获得此判定牌,且可重复此流程直到出现红色的判定结果。你通过〖洛神〗得到的牌不计入当前回合的手牌上限。", + reluoshen_info_guozhan: + "准备阶段,你可以进行判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过〖洛神〗得到的牌不计入当前回合的手牌上限(结果为黑色的判定牌于此过程中不会进入弃牌堆)。", + rejieyin: "结姻", + rejieyin_info: + "出牌阶段限一次,你可以选择一名男性角色并弃置一张手牌或将装备区内的一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", + rebiyue: "闭月", + rebiyue_info: "结束阶段,你可以摸一张牌,若你没有手牌,则改为摸两张牌。", + rejizhi: "集智", + rejizhi_info: + "当你使用锦囊牌时,你可以摸一张牌。若此牌为基本牌,则你可以弃置之,然后令本回合手牌上限+1。", + reqicai: "奇才", + reqicai_info: "锁定技,你使用锦囊牌无距离限制,你装备区内的防具牌和宝物牌不能被其他角色弃置。", + rezhiheng: "制衡", + rezhiheng_info: + "出牌阶段限一次,你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。", + rejiuyuan: "救援", + rejiuyuan_info: + "主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,则其可以选择令你回复1点体力,然后其摸一张牌。", - "new_yajiao":"涯角", - "new_yajiao_info":"每当你于回合外使用或打出牌时,你可以亮出牌堆顶的一张牌,并将其交给一名角色。若此牌与你此次使用或打出的牌类别不同,则你弃置一张牌。", - "new_liyu":"利驭", - "new_liyu_info":"当你使用【杀】对一名其他角色造成伤害后,你可以获得其区域内的一张牌。若此牌不为装备牌,则其摸一张牌。若此牌为装备牌,则视为你对其选择的另一名角色使用一张【决斗】。", - "new_retuxi":"突袭", - "new_retuxi_info":"摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。", - "new_retuxi_info_guozhan":"摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。", - reyiji_tag:'已分配', - "new_reyiji":"遗计", - "new_reyiji_info":"当你受到1点伤害后,你可以摸两张牌,然后可以将至多两张手牌交给其他角色。", - "new_rejianxiong":"奸雄", - "new_rejianxiong_info":"当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", - "new_reluoyi":"裸衣", - "new_reluoyi_info":"摸牌阶段开始时,你亮出牌堆顶的三张牌。然后,你可以放弃摸牌。若如此做,你获得其中的基本牌、武器牌和【决斗】,且直到你的下回合开始,你使用的【杀】或【决斗】造成伤害时,此伤害+1。否则,你将这些牌置入弃牌堆。", - "new_rewusheng":"武圣", - "new_rewusheng_info":"你可以将一张红色牌当做【杀】使用或打出。你使用的方片杀没有距离限制。", - "new_yijue":"义绝", - "new_yijue_info":"出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复1点体力。", - "new_yijue2":"义绝", - "new_yijue2_info":"", - "new_repaoxiao":"咆哮", - "new_repaoxiao_info":"锁定技,出牌阶段,你使用【杀】没有数量限制。若你于此出牌阶段内使用过【杀】,则你本回合内使用【杀】没有距离限制。", - "new_tishen":"替身", - "new_tishen_info":"出牌阶段结束时,你可以弃置你所有的锦囊牌与坐骑牌。若如此做,直到你的下个回合开始,当一张【杀】结算结束后,若你是此牌目标且你未受到此牌伤害,你获得此牌对应的所有实体牌。", - "new_tishen2":"替身", - "new_tishen2_info":"", - "new_qingjian":"清俭", - "new_qingjian_info":"当你于摸牌阶段外得到牌后,你可以展示任意张牌并交给一名其他角色。然后,当前回合角色本回合的手牌上限+X(X为你给出的牌中包含的类别数)。每回合限一次。", - "qingjian_add":"清俭", - "qingjian_add_info":"", - "new_reqingnang":"青囊", - "new_reqingnang_info":"出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复1点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。", - "new_reyaowu":"耀武", - "new_reyaowu_info":"锁定技,当一名角色使用【杀】对你造成伤害时,若此杀为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", - reyaowu:'耀武', - reyaowu_info:'锁定技,当你受到牌造成的伤害时,若此牌为红色,则伤害来源摸一张牌;否则你摸一张牌。', - reqingguo:'倾国', - reqingguo_info:'你可以将一张黑色牌当做【闪】使用或打出。', + new_yajiao: "涯角", + new_yajiao_info: + "每当你于回合外使用或打出牌时,你可以亮出牌堆顶的一张牌,并将其交给一名角色。若此牌与你此次使用或打出的牌类别不同,则你弃置一张牌。", + new_liyu: "利驭", + new_liyu_info: + "当你使用【杀】对一名其他角色造成伤害后,你可以获得其区域内的一张牌。若此牌不为装备牌,则其摸一张牌。若此牌为装备牌,则视为你对其选择的另一名角色使用一张【决斗】。", + new_retuxi: "突袭", + new_retuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。", + new_retuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。", + reyiji_tag: "已分配", + new_reyiji: "遗计", + new_reyiji_info: "当你受到1点伤害后,你可以摸两张牌,然后可以将至多两张手牌交给其他角色。", + new_rejianxiong: "奸雄", + new_rejianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", + new_reluoyi: "裸衣", + new_reluoyi_info: + "摸牌阶段开始时,你亮出牌堆顶的三张牌。然后,你可以放弃摸牌。若如此做,你获得其中的基本牌、武器牌和【决斗】,且直到你的下回合开始,你使用的【杀】或【决斗】造成伤害时,此伤害+1。否则,你将这些牌置入弃牌堆。", + new_rewusheng: "武圣", + new_rewusheng_info: "你可以将一张红色牌当做【杀】使用或打出。你使用的方片杀没有距离限制。", + new_yijue: "义绝", + new_yijue_info: + "出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复1点体力。", + new_yijue2: "义绝", + new_yijue2_info: "", + new_repaoxiao: "咆哮", + new_repaoxiao_info: + "锁定技,出牌阶段,你使用【杀】没有数量限制。若你于此出牌阶段内使用过【杀】,则你本回合内使用【杀】没有距离限制。", + new_tishen: "替身", + new_tishen_info: + "出牌阶段结束时,你可以弃置你所有的锦囊牌与坐骑牌。若如此做,直到你的下个回合开始,当一张【杀】结算结束后,若你是此牌目标且你未受到此牌伤害,你获得此牌对应的所有实体牌。", + new_tishen2: "替身", + new_tishen2_info: "", + new_qingjian: "清俭", + new_qingjian_info: + "当你于摸牌阶段外得到牌后,你可以展示任意张牌并交给一名其他角色。然后,当前回合角色本回合的手牌上限+X(X为你给出的牌中包含的类别数)。每回合限一次。", + qingjian_add: "清俭", + qingjian_add_info: "", + new_reqingnang: "青囊", + new_reqingnang_info: + "出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复1点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。", + new_reyaowu: "耀武", + new_reyaowu_info: + "锁定技,当一名角色使用【杀】对你造成伤害时,若此杀为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", + reyaowu: "耀武", + reyaowu_info: + "锁定技,当你受到牌造成的伤害时,若此牌为红色,则伤害来源摸一张牌;否则你摸一张牌。", + reqingguo: "倾国", + reqingguo_info: "你可以将一张黑色牌当做【闪】使用或打出。", - qinxue:'勤学', - retuxi:'突袭', - reluoyi:'裸衣', - reluoyi2:'裸衣', - reganglie:'刚烈', - qingjian:'清俭', - reyingzi:'英姿', - refanjian:'反间', - refanjian_card:'弃牌', - refanjian_hp:'失去体力', - reqianxun:'谦逊', - reqianxun2:'谦逊', - relianying:'连营', - retishen:'替身', - retishen2:'替身', - reyajiao:'涯角', - rejianxiong:'奸雄', - rejianxiong_mopai:'摸牌', - rejianxiong_napai:'拿牌', - reyiji:'遗计', - reyiji2:'遗计', - yijue:'义绝', - yijue2:'义绝', - retieji:'铁骑', - refankui:'反馈', - reyicong:'义从', - qiaomeng:'趫猛', - rekurou:'苦肉', - zhaxiang:'诈降', - zhaxiang2:'诈降', - zhuhai:'诛害', - qianxin:'潜心', - jianyan:'荐言', - reguicai:'鬼才', - xunxun:'恂恂', - wangxi:'忘隙', - reguose:'国色', - fenwei:'奋威', - chulao:'除疠', - liyu:'利驭', - rerende:'仁德', - rerende_info:'出牌阶段,你可以将至少一张手牌交给其他角色,然后你于此阶段内不能再以此法交给该角色牌;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。', - liyu_info:'当你使用【杀】对一名其他角色造成伤害后,该角色可令你获得其一张牌,若如此做,则视为你对其选择的另一名角色使用一张【决斗】。', - xunxun_info:'摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。', - wangxi_info:'每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。', - reguose_info:'出牌阶段限一次,你可以选择一项:将一张方片花色牌当做【乐不思蜀】使用;或弃置一张方片花色牌并弃置场上的一张【乐不思蜀】。选择完成后,你摸一张牌。', - fenwei_info:'限定技,当一名角色使用的锦囊牌指定了至少两名角色为目标时,你可以令此牌对其中任意名角色无效。', - chulao_info:'出牌阶段限一次,若你有牌,你可以选择任意名势力各不相同的其他角色,你弃置你和这些角色的各一张牌。然后以此法弃置黑桃牌的角色各摸一张牌。', - reguicai_info:'在任意角色的判定牌生效前,你可以打出一张牌代替之。', - zhuhai_info:'一名其他角色的结束阶段开始时,若该角色本回合造成过伤害,你可以对其使用一张【杀】。', - qianxin_info:'觉醒技,当你造成一次伤害后,若你已受伤,你须减1点体力上限,并获得技能“荐言”。', - jianyan_info:'出牌阶段限一次,你可以声明一种牌的类别或颜色,并亮出牌库中第一张符合你声明的牌,然后你令一名男性角色获得此牌。', - rekurou_info:'出牌阶段限一次,你可以弃置一张牌,然后失去1点体力。', - zhaxiang_info:'锁定技。当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则你本回合获得此下效果:使用【杀】的次数上限+1,使用红色【杀】无距离限制且不能被【闪】响应。', - qiaomeng_info:'当你使用黑色【杀】对一名角色造成伤害后,你可以弃置该角色装备区里的一张牌,若此牌是坐骑牌,你于此牌置入弃牌堆后获得之。', - reyicong_info:'锁定技,你计算与其他角色的距离时-1。若你的体力值不大于2,则其他角色计算与你的距离时+1。', - refankui_info:'每当你受到1点伤害后,你可以获得伤害来源的一张牌。', - retieji_info:'当你使用【杀】指定一名角色为目标后,你可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。', - yijue_info:'出牌阶段限一次,你可以与一名其他角色拼点,若你赢,则直到回合结束,该角色不能使用或打出手牌且其非锁定技失效,若你没赢,你可令该角色回复1点体力。', - reyiji_info:'每当你受到1点伤害后,你可以摸两张牌。然后你可以在至多两名角色的武将牌旁边分别扣置至多两张手牌,这些角色的下个摸牌阶段开始时,该角色获得其武将牌旁的这些牌。', - rejianxiong_info:'每当你受到伤害后,你可以获得对你造成伤害的牌,然后摸一张牌。', - reyajiao_info:'每当你于回合外使用或打出一张手牌时,你可以亮出牌堆顶的一张牌,若此牌与你此次使用或打出的牌类别相同,你可以将之交给任意一名角色;若不同则你可以将之置入弃牌堆。', - retishen_info:'限定技,准备阶段开始时,你可以将体力回复至等同于你上回合结束时的体力值,然后你每以此法回复1点体力,便摸一张牌。', - reqianxun_info:'每当一张延时类锦囊牌或其他角色使用的普通锦囊牌生效时,若你是此牌的唯一目标,你可以将所有手牌置于你的武将牌上,若如此做,此回合结束时,你获得你武将牌上的所有牌。', - relianying_info:'当你失去最后的手牌时,你可以令至多X名角色各摸一张牌(X为你此次失去的手牌数)。', - reyingzi_info:'锁定技,摸牌阶段摸牌时,你额外摸一张牌;你的手牌上限为你的体力上限。', - refanjian_info:'出牌阶段限一次,你可以展示一张手牌并将此牌交给一名其他角色。然后该角色选择一项:展示其手牌并弃置所有与此牌花色相同的牌,或失去1点体力。', - qingjian_info:'每当你于摸牌阶段外得到牌时,你可以将其中任意牌以任意顺序交给其他角色,每回合最多发动四次。', - qinxue_info:'觉醒技。准备阶段或结束阶段开始时,若你的手牌数减体力值大于1,则你减1点体力上限,回复1点体力或摸两张牌,获得技能〖攻心〗。', - retuxi_info:'摸牌阶段摸牌时,你可以少摸任意张牌,然后选择等量的手牌数大于或等于你的其他角色,获得这些角色的各一张手牌。', - reluoyi_info:'你可以跳过摸牌阶段,然后亮出牌堆顶的三张牌,获得其中的基本牌、武器牌和【决斗】,若如此做,直到你的下回合开始,你为伤害来源的【杀】或【决斗】造成的伤害+1。', - reganglie_info:'当你受到1点伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害,;黑色,你弃置伤害来源一张牌。', - reganglie_info_guozhan:'当你受到伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害,;黑色,你弃置伤害来源一张牌。', - botu:'博图', - botu_info:'回合结束时,若你本回合出牌阶段内使用的牌包含四种花色,则你可以进行一个额外回合。', - rebotu:'博图', - rebotu_info:'每轮限X次。回合结束时,若本回合内置入弃牌堆的牌中包含至少四种花色,则你可获得一个额外的回合。(X为存活角色数且至多为3)', + qinxue: "勤学", + retuxi: "突袭", + reluoyi: "裸衣", + reluoyi2: "裸衣", + reganglie: "刚烈", + qingjian: "清俭", + reyingzi: "英姿", + refanjian: "反间", + refanjian_card: "弃牌", + refanjian_hp: "失去体力", + reqianxun: "谦逊", + reqianxun2: "谦逊", + relianying: "连营", + retishen: "替身", + retishen2: "替身", + reyajiao: "涯角", + rejianxiong: "奸雄", + rejianxiong_mopai: "摸牌", + rejianxiong_napai: "拿牌", + reyiji: "遗计", + reyiji2: "遗计", + yijue: "义绝", + yijue2: "义绝", + retieji: "铁骑", + refankui: "反馈", + reyicong: "义从", + qiaomeng: "趫猛", + rekurou: "苦肉", + zhaxiang: "诈降", + zhaxiang2: "诈降", + zhuhai: "诛害", + qianxin: "潜心", + jianyan: "荐言", + reguicai: "鬼才", + xunxun: "恂恂", + wangxi: "忘隙", + reguose: "国色", + fenwei: "奋威", + chulao: "除疠", + liyu: "利驭", + rerende: "仁德", + rerende_info: + "出牌阶段,你可以将至少一张手牌交给其他角色,然后你于此阶段内不能再以此法交给该角色牌;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。", + liyu_info: + "当你使用【杀】对一名其他角色造成伤害后,该角色可令你获得其一张牌,若如此做,则视为你对其选择的另一名角色使用一张【决斗】。", + xunxun_info: + "摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", + wangxi_info: + "每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。", + reguose_info: + "出牌阶段限一次,你可以选择一项:将一张方片花色牌当做【乐不思蜀】使用;或弃置一张方片花色牌并弃置场上的一张【乐不思蜀】。选择完成后,你摸一张牌。", + fenwei_info: + "限定技,当一名角色使用的锦囊牌指定了至少两名角色为目标时,你可以令此牌对其中任意名角色无效。", + chulao_info: + "出牌阶段限一次,若你有牌,你可以选择任意名势力各不相同的其他角色,你弃置你和这些角色的各一张牌。然后以此法弃置黑桃牌的角色各摸一张牌。", + reguicai_info: "在任意角色的判定牌生效前,你可以打出一张牌代替之。", + zhuhai_info: "一名其他角色的结束阶段开始时,若该角色本回合造成过伤害,你可以对其使用一张【杀】。", + qianxin_info: "觉醒技,当你造成一次伤害后,若你已受伤,你须减1点体力上限,并获得技能“荐言”。", + jianyan_info: + "出牌阶段限一次,你可以声明一种牌的类别或颜色,并亮出牌库中第一张符合你声明的牌,然后你令一名男性角色获得此牌。", + rekurou_info: "出牌阶段限一次,你可以弃置一张牌,然后失去1点体力。", + zhaxiang_info: + "锁定技。当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则你本回合获得此下效果:使用【杀】的次数上限+1,使用红色【杀】无距离限制且不能被【闪】响应。", + qiaomeng_info: + "当你使用黑色【杀】对一名角色造成伤害后,你可以弃置该角色装备区里的一张牌,若此牌是坐骑牌,你于此牌置入弃牌堆后获得之。", + reyicong_info: + "锁定技,你计算与其他角色的距离时-1。若你的体力值不大于2,则其他角色计算与你的距离时+1。", + refankui_info: "每当你受到1点伤害后,你可以获得伤害来源的一张牌。", + retieji_info: + "当你使用【杀】指定一名角色为目标后,你可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。", + yijue_info: + "出牌阶段限一次,你可以与一名其他角色拼点,若你赢,则直到回合结束,该角色不能使用或打出手牌且其非锁定技失效,若你没赢,你可令该角色回复1点体力。", + reyiji_info: + "每当你受到1点伤害后,你可以摸两张牌。然后你可以在至多两名角色的武将牌旁边分别扣置至多两张手牌,这些角色的下个摸牌阶段开始时,该角色获得其武将牌旁的这些牌。", + rejianxiong_info: "每当你受到伤害后,你可以获得对你造成伤害的牌,然后摸一张牌。", + reyajiao_info: + "每当你于回合外使用或打出一张手牌时,你可以亮出牌堆顶的一张牌,若此牌与你此次使用或打出的牌类别相同,你可以将之交给任意一名角色;若不同则你可以将之置入弃牌堆。", + retishen_info: + "限定技,准备阶段开始时,你可以将体力回复至等同于你上回合结束时的体力值,然后你每以此法回复1点体力,便摸一张牌。", + reqianxun_info: + "每当一张延时类锦囊牌或其他角色使用的普通锦囊牌生效时,若你是此牌的唯一目标,你可以将所有手牌置于你的武将牌上,若如此做,此回合结束时,你获得你武将牌上的所有牌。", + relianying_info: "当你失去最后的手牌时,你可以令至多X名角色各摸一张牌(X为你此次失去的手牌数)。", + reyingzi_info: "锁定技,摸牌阶段摸牌时,你额外摸一张牌;你的手牌上限为你的体力上限。", + refanjian_info: + "出牌阶段限一次,你可以展示一张手牌并将此牌交给一名其他角色。然后该角色选择一项:展示其手牌并弃置所有与此牌花色相同的牌,或失去1点体力。", + qingjian_info: + "每当你于摸牌阶段外得到牌时,你可以将其中任意牌以任意顺序交给其他角色,每回合最多发动四次。", + qinxue_info: + "觉醒技。准备阶段或结束阶段开始时,若你的手牌数减体力值大于1,则你减1点体力上限,回复1点体力或摸两张牌,获得技能〖攻心〗。", + retuxi_info: + "摸牌阶段摸牌时,你可以少摸任意张牌,然后选择等量的手牌数大于或等于你的其他角色,获得这些角色的各一张手牌。", + reluoyi_info: + "你可以跳过摸牌阶段,然后亮出牌堆顶的三张牌,获得其中的基本牌、武器牌和【决斗】,若如此做,直到你的下回合开始,你为伤害来源的【杀】或【决斗】造成的伤害+1。", + reganglie_info: + "当你受到1点伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害,;黑色,你弃置伤害来源一张牌。", + reganglie_info_guozhan: + "当你受到伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害,;黑色,你弃置伤害来源一张牌。", + botu: "博图", + botu_info: "回合结束时,若你本回合出牌阶段内使用的牌包含四种花色,则你可以进行一个额外回合。", + rebotu: "博图", + rebotu_info: + "每轮限X次。回合结束时,若本回合内置入弃牌堆的牌中包含至少四种花色,则你可获得一个额外的回合。(X为存活角色数且至多为3)", - xin_yuji:'界于吉', - xin_yuji_prefix:'界', - re_zuoci:'界左慈', - re_zuoci_prefix:'界', - reguhuo:"蛊惑", - reguhuo_info:"每名角色的回合限一次,你可以扣置一张手牌当作一张基本牌或普通锦囊牌使用或打出。其他角色同时选择是否质疑。然后,你展示此牌。若有质疑的角色:若此牌为假,则此牌作废,且所有质疑者各摸一张牌;为真,则所有质疑角色于此牌结算完成后依次弃置一张牌或失去1点体力,并获得技能〖缠怨〗。", - reguhuo_guess:"蛊惑", - reguhuo_guess_info:"", - rechanyuan:"缠怨", - rechanyuan_info:"锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。", - reguhuo_ally:'信任', - reguhuo_betray:'质疑', - reguhuo_ally_bg:'真', - reguhuo_betray_bg:'假', - rehuashen:'化身', - rehuashen_info:'游戏开始时,你随机获得三张未加入游戏的武将牌,选一张置于你面前并声明该武将牌的一项技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换。回合开始时或回合结束时,你可以选择一项:①弃置至多两张未展示的化身牌并重新获得等量化身牌;②更换所展示的化身牌或技能。(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。', - rexinsheng:'新生', - rexinsheng_info:'当你受到1点伤害后,你可以获得一张新的化身牌。', - re_menghuo:'界孟获', - re_menghuo_prefix:'界', - re_caopi:'界曹丕', - re_caopi_prefix:'界', - oljiuchi:'酒池', - oljiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的〖崩坏〗失效直到回合结束。', - repolu:'破虏', - repolu_info:'当你杀死一名角色/死亡时,你可以令任意名角色摸X+1张牌。(X为你此前发动过〖破虏〗的次数)', - rexingshang:'行殇', - rexingshang_info:'当其他角色死亡后,你可以选择一项:回复1点体力,或获得其所有牌。', - refangzhu:'放逐', - refangzhu_info:'当你受到伤害后,你可以令一名其他角色选择一项:摸X张牌并将武将牌翻面,或弃置X张牌并失去1点体力。(X为你已损失的体力值)', - rezaiqi:'再起', - rezaiqi_info:'结束阶段开始时,你可以令至多X名角色选择一项:1.摸一张牌,2.令你回复1点体力(X为本回合进入弃牌堆的红色牌数)。', - ol_caiwenji:'界蔡琰', - ol_caiwenji_prefix:'界', - retuntian:'屯田', - rebeige:'悲歌', - retuntian_info:'①当你于回合外失去牌后,你可以判定。若判定结果为♥,你获得此判定牌。否则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。', - rebeige_info:'当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复X点体力(X为伤害点数);♦︎该角色摸三张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。', - rehunzi:'魂姿', - rehunzi_info:'觉醒技,准备阶段,若你的体力值不大于2,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。', - rezhijian:'直谏', - rezhijian_info:'出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。当你使用装备牌时,你可以摸一张牌。', - refangquan:'放权', - refangquan_info:'你可跳过你的出牌阶段,若如此做,你本回合的手牌上限为你的体力上限,且回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。', - xin_gaoshun:'界高顺', - xin_gaoshun_prefix:'界', - repojun:'破军', - repojun2:'破军', - repojun3:'破军', - repojun_info:'当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值),然后其于当前回合结束时获得这些牌。当你使用【杀】对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,则此伤害+1。', - rexianzhen:'陷阵', - rexianzhen_info:'出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本回合内对其使用牌没有次数和距离限制且无视其防具。若你没赢,你本回合内不能使用【杀】。若你以此法失去的拼点牌为【杀】,则你的【杀】不计入本回合的手牌上限。', - rejinjiu:'禁酒', - rejinjiu_info:'锁定技,你的【酒】均视为【杀】。其他角色不能于你的回合内使用【酒】。当你受到酒【杀】的伤害时,你令此伤害-X(X为影响过此【杀】的伤害值的【酒】的数量)。', - rejinjiu2:'禁酒', - rejinjiu3:'禁酒', - ol_xiahouyuan:'界夏侯渊', - ol_xiahouyuan_prefix:'界', - shebian:'设变', - shebian_info:'当你的武将牌翻面后,你可以移动场上的一张装备牌。', - cangzhuo:'藏拙', - cangzhuo_info:'弃牌阶段开始时,若你本回合内没有使用过锦囊牌,则你的锦囊牌不计入手牌上限。', - re_zhangyi:'界张嶷', - re_zhangyi_prefix:'界', - rewurong:'怃戎', - rewurong_info:'出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你获得其一张牌。', - ol_pangtong:'界庞统', - ol_pangtong_prefix:'界', - olniepan:'涅槃', - olniepan_info:'限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。然后你选择获得以下技能中的一个:〖八阵〗/〖火计〗/〖看破〗。', - ol_weiyan:'界魏延', - ol_weiyan_prefix:'界', - reqimou:'奇谋', - reqimou_info:'限定技,出牌阶段,你可以失去任意点体力并摸等量的牌,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。', - ol_xiaoqiao:'界小乔', - ol_xiaoqiao_prefix:'界', - rehongyan:'红颜', - rehongyan_info:'锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。当你于回合外正面朝上失去红桃牌后,若你的手牌数小于体力值,你摸一张牌。', - reluoying:'落英', - reluoying_discard:'落英', - reluoying_judge:'落英', - reluoying_info:'当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。', - rejiushi:'酒诗', - rejiushi_info:'当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。', - rejiushi1:'酒诗', - rejiushi3:'酒诗', - rejiushi_mark:'酒诗·改', - rejiushi_mark_info:'当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。', - chengzhang:'成章', - chengzhang_info:'觉醒技,准备阶段开始时,若你造成伤害与受到伤害值之和累计7点或以上,则你回复1点体力并摸一张牌,然后改写〖酒诗〗。', - re_wuyi:'界吴懿', - re_wuyi_prefix:'界', - re_zhuran:'界朱然', - re_zhuran_prefix:'界', - re_quancong:'界全琮', - re_quancong_prefix:'界', - re_liaohua:'界廖化', - re_liaohua_prefix:'界', - re_guohuai:'界郭淮', - re_guohuai_prefix:'界', - re_chengpu:'界程普', - re_chengpu_prefix:'界', - rechunlao:'醇醪', - rechunlao2:'醇醪', - rechunlao_info:'出牌阶段结束时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】,然后若此“醇”的属性为:火,你回复1点体力、雷,你摸两张牌。', - re_caozhang:'界曹彰', - re_caozhang_prefix:'界', - yujin_yujin:'界于禁', - yujin_yujin_prefix:'界', - rexuanfeng:'旋风', - rexuanfeng_info:'当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌,或将一名其他角色装备区内的一张牌移动到另一名其他角色的装备区内。', - olpaoxiao:'咆哮', - olpaoxiao2:'咆哮', - olpaoxiao_info:'①锁定技,你使用【杀】无次数限制。②锁定技,当你使用的【杀】被【闪】抵消时,你获得一枚“咆”(→)当你因【杀】造成伤害时,你弃置所有“咆”并令伤害值+X(X为“咆”数)。回合结束后,你弃置所有“咆”。', - oltishen:'替身', - oltishen_info:'限定技,准备阶段,你可以将体力回复至上限,然后摸X张牌(X为你回复的体力值)。', - ollongdan:'龙胆', - ollongdan_info:'你可以将一张【杀】当做【闪】、【闪】当做【杀】、【酒】当做【桃】、【桃】当做【酒】使用或打出。', - olyajiao:'涯角', - olyajiao_info:'当你于回合外因使用或打出而失去手牌后,你可以亮出牌堆顶的一张牌。若这两张牌的类别相同,你可以将展示的牌交给一名角色;若类别不同,你可弃置攻击范围内包含你的角色区域里的一张牌。', - regongji:'弓骑', - regongji_info:'出牌阶段限一次,你可以弃置一张非基本牌,然后弃置一名其他角色的一张牌。锁定技,当你的装备区内有坐骑牌时,你的攻击范围无限。', - ol_sunjian:'界孙坚', - ol_sunjian_prefix:'界', - wulie:'武烈', - wulie2:'武烈', - wulie_info:'限定技,结束阶段,你可以失去任意点体力并指定等量的其他角色。这些角色各获得一枚「烈」。有「烈」的角色受到伤害时,其移去一枚「烈」,然后防止此伤害。', - re_sunluban:'界孙鲁班', - re_sunluban_prefix:'界', - re_masu:'界马谡', - re_masu_prefix:'界', - ol_pangde:'界庞德', - ol_pangde_prefix:'界', - rejianchu:'鞬出', - rejianchu_info:'当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌不为基本牌,此【杀】不可被【闪】响应且你本回合使用【杀】的次数上限+1,为基本牌,该角色获得此【杀】。', - re_taishici:'界太史慈', - re_taishici_prefix:'界', - hanzhan:'酣战', - hanzhan_gain:'酣战', - hanzhan_info:'①当你发起拼点时,或成为拼点的目标时,你可以令对方选择拼点牌的方式改为随机选择一张手牌。②当你拼点结束后,你可以获得本次拼点的拼点牌中点数最大的【杀】。', - re_jianyong:'界简雍', - re_jianyong_prefix:'界', - xin_xusheng:'界徐盛', - xin_xusheng_prefix:'界', - decadepojun:'破军', - decadepojun2:'破军', - decadepojun_info:'当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值)。若这些牌中:有装备牌,你将这些装备牌中的一张置于弃牌堆;有锦囊牌,你摸一张牌。其于回合结束时获得其武将牌上的这些牌。', - re_wangyi:'界王异', - re_wangyi_prefix:'界', - guanzhang:'关兴张苞', - rezishou:'自守', - rezishou2:'自守', - rezishou_info:'摸牌阶段,你可以多摸X张牌(X为存活势力数)。若如此做,本回合你对其他角色造成伤害时,防止此伤害。', - rezongshi:'宗室', - rezongshi_info:'锁定技,你的手牌上限+X(X为存活势力数)。准备阶段,若你的手牌数大于体力值,则你本回合内使用【杀】无次数限制。', - ol_dongzhuo:'界董卓', - ol_dongzhuo_prefix:'界', - olbaonue:'暴虐', - olbaonue_info:'主公技,其他群雄角色造成1点伤害后,你可进行判定,若为♠,你回复1点体力并获得判定牌。', - re_panzhangmazhong:'界潘璋马忠', - re_panzhangmazhong_prefix:'界', - re_hanhaoshihuan:'界韩浩史涣', - re_hanhaoshihuan_prefix:'界', - xinyicong:'义从', - xinyicong_info:'锁定技,你计算与其他角色的距离时-X,其他角色计算与你的距离时+Y。(X为你的体力值-1,Y为你的已损失体力值-1)', - oltianxiang:'天香', - oltianxiang_info:'当你受到伤害时,你可以弃置一张红桃牌,防止此伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。', - olhongyan:'红颜', - olhongyan_info:'锁定技,你的黑桃牌的花色视为红桃。若你的装备区内有红桃牌,则你的手牌上限基数视为体力上限。', - piaoling:'飘零', - piaoling_info:'结束阶段,你可以进行判定。若判定结果为红桃,则你选择一项:1.将此牌交给一名角色。若你交给了自己,则你弃置一张牌。2.将此牌置于牌堆顶。', - decadelihuo:'疠火', - decadelihuo2:'疠火', - decadelihuo3:'疠火', - decadelihuo_info:'当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。当你使用火【杀】选择目标时,可以选择一个额外目标。你使用的火【杀】结算完成后,若此【杀】的目标数大于1且你因此【杀】造成过伤害,则你失去1点体力。', - decadechunlao:'醇醪', - decadechunlao2:'醇醪', - decadechunlao_info:'你可以对其他角色使用【酒(使用方法②)】。当你需要使用【酒】时,若你的武将牌未横置,则你可以将武将牌横置,然后视为使用【酒】。当你受到或造成伤害后,若伤害值大于1且你的武将牌横置,则你可以重置武将牌。', - rejuece:'绝策', - rejuece_info:'结束阶段,你可以对一名本回合内失去过牌的角色造成1点伤害。', - remieji:'灭计', - remieji_info:'出牌阶段限一次,你可以将一张黑色锦囊牌置于牌堆顶,然后令一名有牌的其他角色选择一项:交给你一张锦囊牌,或依次弃置两张非锦囊牌。', - re_manchong:'界满宠', - re_manchong_prefix:'界', - rejunxing:'峻刑', - rejunxing_info:'出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色。该角色选择一项:1.弃置X张牌并失去1点体力。2.翻面并摸X张牌。(X为你弃置的牌数)', - re_gongsunzan:'界公孙瓒', - re_gongsunzan_prefix:'界', - reqiaomeng:'趫猛', - reqiaomeng_info:'当你使用【杀】对一名角色造成伤害后,你可以弃置该角色区域内的一张牌。若此牌为坐骑牌,则你于此弃置事件结算结束后获得此牌。', - ol_dengai:'界邓艾', - ol_dengai_prefix:'界', - oltuntian:'屯田', - olzaoxian:'凿险', - oltuntian_info:'①当你于回合外失去牌后,或于回合内因弃置而失去【杀】后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。', - olzaoxian_info:'觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。你于当前回合结束后进行一个额外的回合。', - re_sunxiu:'界孙休', - re_sunxiu_prefix:'界', - re_caoxiu:'界曹休', - re_caoxiu_prefix:'界', - xin_lingtong:'界凌统', - xin_lingtong_prefix:'界', - decadexuanfeng:'旋风', - decadexuanfeng_info:'当你于弃牌阶段弃置过至少两张牌,或当你失去装备区里的牌后,若场上没有处于濒死状态的角色,则你可以弃置至多两名其他角色的共计两张牌。若此时处于你的回合内,你可以对其中一名目标角色造成1点伤害。', - yongjin:'勇进', - yongjin_info:'限定技,出牌阶段,你可以依次移动场上的至多三张不同的装备牌。', - xin_liubiao:'界刘表', - xin_liubiao_prefix:'界', - decadezishou:'自守', - decadezishou_zhiheng:'自守', - decadezishou_info:'摸牌阶段,你可以多摸X张牌(X为存活势力数);然后本回合你对其他角色造成伤害时,防止此伤害。结束阶段,若你本回合没有使用牌指定其他角色为目标,你可以弃置任意张花色不同的手牌,然后摸等量的牌。', - decadezongshi:'宗室', - decadezongshi_info:'锁定技,你的手牌上限+X(X为存活势力数)。你的回合外,若你的手牌数大于等于手牌上限,则当你成为延时类锦囊牌或无颜色的牌的目标后,你令此牌对你无效。', - re_fazheng:'界法正', - re_fazheng_prefix:'界', - reenyuan:'恩怨', - reenyuan1:'恩怨', - reenyuan2:'恩怨', - reenyuan_info:'当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌。当你受到1点伤害后,你可令伤害来源选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。', - rexuanhuo:'眩惑', - rexuanhuo_info:'摸牌阶段结束时,你可以交给一名其他角色两张手牌,然后该角色选择一项:1. 视为对你选择的另一名角色使用任意一种【杀】或【决斗】,2. 交给你所有手牌。', - re_fuhuanghou:'界伏寿', - re_fuhuanghou_prefix:'界', - reqiuyuan:'求援', - reqiuyuan_info:'当你成为【杀】的目标时,你可选择另一名其他角色。除非该角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标且该角色不能响应此【杀】。', - rezhuikong:'惴恐', - rezhuikong_info:'其他角色的回合开始时,若你已受伤,你可与其拼点:若你赢,本回合该角色只能对自己使用牌;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。', - re_gongsunyuan:'界公孙渊', - re_gongsunyuan_prefix:'界', - rehuaiyi:'怀异', - rehuaiyi_info:'出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色:全部相同,你摸一张牌,并将此技能于本阶段内改为“限两次”,然后终止此技能的结算流程;不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。', - re_caozhen:'界曹真', - re_caozhen_prefix:'界', - residi:'司敌', - residi_push:'司敌', - residi2:'司敌', - residi3:'司敌', - residi_info:'结束阶段,你可以将一张非基本牌置于武将牌上,称为“司”。其他角色的出牌阶段开始时,你可以移去一张“司”。若如此做,其本阶段内不能使用或打出与“司”颜色相同的牌。此阶段结束时,若其于此阶段内未使用过:【杀】,你视为对其使用一张【杀】。锦囊牌,你摸两张牌。', - gz_re_xushu:'徐庶', - re_zhangchunhua:'界张春华', - re_zhangchunhua_prefix:'界', - xin_handang:'界韩当', - xin_handang_prefix:'界', - xingongji:'弓骑', - xingongji2:'弓骑', - xingongji_info:'出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限且使用与此牌花色相同的【杀】无次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。', - xinjiefan:'解烦', - xinjiefan_info:'限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后若游戏轮数为1,则你于此回合结束时恢复此技能。', - gzquanji:'权计', - gzquanji_info:'每回合每项各限一次。当你受到伤害后或造成伤害后,你可以摸一张牌,然后你将一张牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。', - gzpaiyi:'排异', - gzpaiyi_backup:'排异', - gzpaiyi_info:'出牌阶段限一次。你可以移去一张“权”并选择一名角色。令其摸X张牌(X为你的“权”数且至多为7)。然后若其手牌数大于你,则你对其造成1点伤害。', - ol_zhurong:'界祝融', - ol_zhurong_prefix:'界', - changbiao:'长标', - changbiao_info:'出牌阶段限一次,你可以将任意张手牌当做【杀】使用(无距离限制)。若你因此【杀】对目标角色造成过伤害,则你于出牌阶段结束时摸X张牌(X为此【杀】对应的实体牌数量)。', - re_zhoucang:'界周仓', - re_zhoucang_prefix:'界', - rezhongyong:'忠勇', - rezhongyong_info:'当你使用【杀】后,你可以将此【杀】以及目标角色使用的【闪】交给一名其他角色,若其获得的牌中有红色,则其可以对你攻击范围内的角色使用一张【杀】。若其获得的牌中有黑色,其摸一张牌。', - ollihuo:'疠火', - ollihuo2:'疠火', - ollihuo3:'疠火', - ollihuo4:'疠火', - ollihuo_info:'你使用普通的【杀】可以改为火【杀】,若此【杀】造成过伤害,你失去1点体力;你使用火【杀】可以多选择一个目标。你每回合使用的第一张牌如果是【杀】,则此【杀】结算完毕后可置于你的武将牌上。', - xinjiangchi:'将驰', - xinjiangchi_info:'出牌阶段开始时,你可选择:①摸一张牌。②摸两张牌,然后本回合内不能使用或打出【杀】。③弃置一张牌,然后本回合内可以多使用一张【杀】,且使用【杀】无距离限制。', - redingpin:'定品', - redingpin_info:'出牌阶段,你可以弃置一张本回合未使用过/弃置过的类型的牌并选择一名角色。其进行判定,若结果为:黑色,其摸X张牌(X为其体力值且至多为3)且本回合内不能再成为〖定品〗的目标;红桃,你令此次弃置的牌不计入〖定品〗弃置牌合法性的检测;方片,你将武将牌翻面。', - refaen:'法恩', - refaen_info:'一名角色翻面或横置后,你可令其摸一张牌。', - dcfaen:'法恩', - dcfaen_info:'一名角色翻至正面或横置后,你可令其摸一张牌。', - reshizhi:'矢志', - reshizhi_info:'锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通杀造成伤害后,你回复1点体力。', - re_guotufengji:'界郭图逢纪', - re_guotufengji_prefix:'界', - rejigong:'急攻', - rejigong2:'急攻', - rejigong_info:'出牌阶段开始时,你可以摸至多三张牌。若如此做,你本回合的手牌上限基数改为X,且弃牌阶段结束时,若X不小于Y,则你回复1点体力。(X为你本回合内造成的伤害值之和,Y为你本回合内因〖急攻〗摸牌而得到的牌的数量总和)', - ol_jiangwei:'界姜维', - ol_jiangwei_prefix:'界', - oltiaoxin:'挑衅', - oltiaoxin_info:'出牌阶段限一次,你可以选择一名攻击范围内包含你的角色。然后除非该角色对你使用一张【杀】且此【杀】对你造成伤害,否则你弃置其一张牌,然后将此技能于此出牌阶段内修改为出牌阶段限两次。', - olzhiji:'志继', - olzhiji_info:'觉醒技,准备阶段或结束阶段,若你没有手牌,你回复1点体力或摸两张牌,然后减1点体力上限,获得〖观星〗。', - decadezhenjun:'镇军', - decadezhenjun_info:'准备阶段或结束阶段,你可以弃置一名角色X张牌(X为其手牌数减体力值且至少为1),若其中没有装备牌,你选择一项:1.你弃一张牌;2.该角色摸等量的牌。', - decadejingce:'精策', - decadejingce_info:'结束阶段,若你本回合使用过的牌数不小于你的体力值,则你可执行一个摸牌阶段或出牌阶段;若这些牌包含的花色数也不小于你的体力值,则你将“或”改为“并”。', - re_guanping:'界关平', - re_guanping_prefix:'界', - relongyin:'龙吟', - relongyin_info:'当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数。若此【杀】为红色,则你摸一张牌;若你以此法弃置的牌与此【杀】点数相同,则你重置“竭忠”。', - jiezhong:'竭忠', - jiezhong_info:'限定技,出牌阶段开始时,你可以将手牌补至体力上限(至多摸五张)。', - re_caifuren:'界蔡夫人', - re_caifuren_prefix:'界', - reqieting:'窃听', - reqieting_info:'其他角色的回合结束时,若其本回合内未造成过伤害,则你可将其装备区内的一张牌置于你的装备区内;若其本回合内未对其他角色使用过牌,则你可摸一张牌。', - rexianzhou:'献州', - rexianzhou_info:'限定技。出牌阶段,你可将装备区内的所有牌交给一名其他角色。你回复X点体力,然后对其攻击范围内的至多X名角色各造成1点伤害(X为你以此法给出的牌数)。', - xin_zhonghui:'界钟会', - xin_zhonghui_prefix:'界', - xinquanji:'权计', - xinquanji_info:'①当你受到1点伤害后,或其他角色不因你的赠予或交给而得到你的牌后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”。②你的手牌上限+X(X为“权”的数量)。', - xinzili:'自立', - xinzili_info:'觉醒技。准备阶段,若你的“权”数大于2,则你回复1点体力并摸两张牌,减1点体力上限并获得〖排异〗。', - xinpaiyi:'排异', - xinpaiyi_backup:'排异', - xinpaiyi_info:'出牌阶段每项各限一次,你可移去一张“权”并选择一项:①令一名角色摸X张牌。②对至多X名角色各造成1点伤害。(X为“权”数)', - re_guyong:'界顾雍', - re_guyong_prefix:'界', - reshenxing:'慎行', - reshenxing_info:'出牌阶段,你可以弃置X张牌(X为你本阶段内发动过〖慎行〗的次数且至少为0,至多为2),然后摸一张牌。', - rebingyi:'秉壹', - rebingyi_info:'结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);点数均相同,则你摸一张牌。', - re_jiaxu:'界贾诩', - re_jiaxu_prefix:'界', - rewansha:'完杀', - rewansha_info:'锁定技。①你的回合内,不处于濒死状态的其他角色不能使用【桃】。②当有角色于你的回合内进入濒死状态时,你令其以外的所有其他角色的非锁定技失效直到此濒死状态结算结束。', - reluanwu:'乱武', - reluanwu_info:'限定技,出牌阶段,你可令所有其他角色依次选择一项:①对距离最近(或之一)的角色使用一张【杀】;②失去1点体力。结算完成后,你可视为使用一张【杀】(无距离限制)。', - reweimu:'帷幕', - reweimu_info:'锁定技。①你不能成为黑色锦囊牌的目标。②当你于回合内受到伤害时,你防止此伤害并摸2X张牌(X为伤害值)。', - ol_lusu:'界鲁肃', - ol_lusu_prefix:'界', - olhaoshi:'好施', - olhaoshi_info:'摸牌阶段开始时,你可以多摸两张牌。然后摸牌阶段结束时,若你的手牌数大于5,则你将手牌数的一半(向下取整)交给一名手牌最少其他角色并获得如下效果直到你下回合开始:当你成为【杀】或普通锦囊牌的目标后,其可以交给你一张手牌。', - oldimeng:'缔盟', - oldimeng_info:'出牌阶段限一次,你可令两名满足X≤Y的其他角色交换手牌并获得如下效果:出牌阶段结束时,你弃置X张牌(X为这两名角色手牌数之差的绝对值;Y为你的牌数)。', + xin_yuji: "界于吉", + xin_yuji_prefix: "界", + re_zuoci: "界左慈", + re_zuoci_prefix: "界", + reguhuo: "蛊惑", + reguhuo_info: + "每名角色的回合限一次,你可以扣置一张手牌当作一张基本牌或普通锦囊牌使用或打出。其他角色同时选择是否质疑。然后,你展示此牌。若有质疑的角色:若此牌为假,则此牌作废,且所有质疑者各摸一张牌;为真,则所有质疑角色于此牌结算完成后依次弃置一张牌或失去1点体力,并获得技能〖缠怨〗。", + reguhuo_guess: "蛊惑", + reguhuo_guess_info: "", + rechanyuan: "缠怨", + rechanyuan_info: + "锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。", + reguhuo_ally: "信任", + reguhuo_betray: "质疑", + reguhuo_ally_bg: "真", + reguhuo_betray_bg: "假", + rehuashen: "化身", + rehuashen_info: + "游戏开始时,你随机获得三张未加入游戏的武将牌,选一张置于你面前并声明该武将牌的一项技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换。回合开始时或回合结束时,你可以选择一项:①弃置至多两张未展示的化身牌并重新获得等量化身牌;②更换所展示的化身牌或技能。(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。", + rexinsheng: "新生", + rexinsheng_info: "当你受到1点伤害后,你可以获得一张新的化身牌。", + re_menghuo: "界孟获", + re_menghuo_prefix: "界", + re_caopi: "界曹丕", + re_caopi_prefix: "界", + oljiuchi: "酒池", + oljiuchi_info: + "你可以将一张黑桃手牌当做【酒】使用。你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的〖崩坏〗失效直到回合结束。", + repolu: "破虏", + repolu_info: + "当你杀死一名角色/死亡时,你可以令任意名角色摸X+1张牌。(X为你此前发动过〖破虏〗的次数)", + rexingshang: "行殇", + rexingshang_info: "当其他角色死亡后,你可以选择一项:回复1点体力,或获得其所有牌。", + refangzhu: "放逐", + refangzhu_info: + "当你受到伤害后,你可以令一名其他角色选择一项:摸X张牌并将武将牌翻面,或弃置X张牌并失去1点体力。(X为你已损失的体力值)", + rezaiqi: "再起", + rezaiqi_info: + "结束阶段开始时,你可以令至多X名角色选择一项:1.摸一张牌,2.令你回复1点体力(X为本回合进入弃牌堆的红色牌数)。", + ol_caiwenji: "界蔡琰", + ol_caiwenji_prefix: "界", + retuntian: "屯田", + rebeige: "悲歌", + retuntian_info: + "①当你于回合外失去牌后,你可以判定。若判定结果为♥,你获得此判定牌。否则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。", + rebeige_info: + "当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复X点体力(X为伤害点数);♦︎该角色摸三张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。", + rehunzi: "魂姿", + rehunzi_info: + "觉醒技,准备阶段,若你的体力值不大于2,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。", + rezhijian: "直谏", + rezhijian_info: + "出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。当你使用装备牌时,你可以摸一张牌。", + refangquan: "放权", + refangquan_info: + "你可跳过你的出牌阶段,若如此做,你本回合的手牌上限为你的体力上限,且回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。", + xin_gaoshun: "界高顺", + xin_gaoshun_prefix: "界", + repojun: "破军", + repojun2: "破军", + repojun3: "破军", + repojun_info: + "当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值),然后其于当前回合结束时获得这些牌。当你使用【杀】对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,则此伤害+1。", + rexianzhen: "陷阵", + rexianzhen_info: + "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本回合内对其使用牌没有次数和距离限制且无视其防具。若你没赢,你本回合内不能使用【杀】。若你以此法失去的拼点牌为【杀】,则你的【杀】不计入本回合的手牌上限。", + rejinjiu: "禁酒", + rejinjiu_info: + "锁定技,你的【酒】均视为【杀】。其他角色不能于你的回合内使用【酒】。当你受到酒【杀】的伤害时,你令此伤害-X(X为影响过此【杀】的伤害值的【酒】的数量)。", + rejinjiu2: "禁酒", + rejinjiu3: "禁酒", + ol_xiahouyuan: "界夏侯渊", + ol_xiahouyuan_prefix: "界", + shebian: "设变", + shebian_info: "当你的武将牌翻面后,你可以移动场上的一张装备牌。", + cangzhuo: "藏拙", + cangzhuo_info: "弃牌阶段开始时,若你本回合内没有使用过锦囊牌,则你的锦囊牌不计入手牌上限。", + re_zhangyi: "界张嶷", + re_zhangyi_prefix: "界", + rewurong: "怃戎", + rewurong_info: + "出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你获得其一张牌。", + ol_pangtong: "界庞统", + ol_pangtong_prefix: "界", + olniepan: "涅槃", + olniepan_info: + "限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。然后你选择获得以下技能中的一个:〖八阵〗/〖火计〗/〖看破〗。", + ol_weiyan: "界魏延", + ol_weiyan_prefix: "界", + reqimou: "奇谋", + reqimou_info: + "限定技,出牌阶段,你可以失去任意点体力并摸等量的牌,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。", + ol_xiaoqiao: "界小乔", + ol_xiaoqiao_prefix: "界", + rehongyan: "红颜", + rehongyan_info: + "锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。当你于回合外正面朝上失去红桃牌后,若你的手牌数小于体力值,你摸一张牌。", + reluoying: "落英", + reluoying_discard: "落英", + reluoying_judge: "落英", + reluoying_info: "当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。", + rejiushi: "酒诗", + rejiushi_info: + "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。", + rejiushi1: "酒诗", + rejiushi3: "酒诗", + rejiushi_mark: "酒诗·改", + rejiushi_mark_info: + "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。", + chengzhang: "成章", + chengzhang_info: + "觉醒技,准备阶段开始时,若你造成伤害与受到伤害值之和累计7点或以上,则你回复1点体力并摸一张牌,然后改写〖酒诗〗。", + re_wuyi: "界吴懿", + re_wuyi_prefix: "界", + re_zhuran: "界朱然", + re_zhuran_prefix: "界", + re_quancong: "界全琮", + re_quancong_prefix: "界", + re_liaohua: "界廖化", + re_liaohua_prefix: "界", + re_guohuai: "界郭淮", + re_guohuai_prefix: "界", + re_chengpu: "界程普", + re_chengpu_prefix: "界", + rechunlao: "醇醪", + rechunlao2: "醇醪", + rechunlao_info: + "出牌阶段结束时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】,然后若此“醇”的属性为:火,你回复1点体力、雷,你摸两张牌。", + re_caozhang: "界曹彰", + re_caozhang_prefix: "界", + yujin_yujin: "界于禁", + yujin_yujin_prefix: "界", + rexuanfeng: "旋风", + rexuanfeng_info: + "当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌,或将一名其他角色装备区内的一张牌移动到另一名其他角色的装备区内。", + olpaoxiao: "咆哮", + olpaoxiao2: "咆哮", + olpaoxiao_info: + "①锁定技,你使用【杀】无次数限制。②锁定技,当你使用的【杀】被【闪】抵消时,你获得一枚“咆”(→)当你因【杀】造成伤害时,你弃置所有“咆”并令伤害值+X(X为“咆”数)。回合结束后,你弃置所有“咆”。", + oltishen: "替身", + oltishen_info: "限定技,准备阶段,你可以将体力回复至上限,然后摸X张牌(X为你回复的体力值)。", + ollongdan: "龙胆", + ollongdan_info: + "你可以将一张【杀】当做【闪】、【闪】当做【杀】、【酒】当做【桃】、【桃】当做【酒】使用或打出。", + olyajiao: "涯角", + olyajiao_info: + "当你于回合外因使用或打出而失去手牌后,你可以亮出牌堆顶的一张牌。若这两张牌的类别相同,你可以将展示的牌交给一名角色;若类别不同,你可弃置攻击范围内包含你的角色区域里的一张牌。", + regongji: "弓骑", + regongji_info: + "出牌阶段限一次,你可以弃置一张非基本牌,然后弃置一名其他角色的一张牌。锁定技,当你的装备区内有坐骑牌时,你的攻击范围无限。", + ol_sunjian: "界孙坚", + ol_sunjian_prefix: "界", + wulie: "武烈", + wulie2: "武烈", + wulie_info: + "限定技,结束阶段,你可以失去任意点体力并指定等量的其他角色。这些角色各获得一枚「烈」。有「烈」的角色受到伤害时,其移去一枚「烈」,然后防止此伤害。", + re_sunluban: "界孙鲁班", + re_sunluban_prefix: "界", + re_masu: "界马谡", + re_masu_prefix: "界", + ol_pangde: "界庞德", + ol_pangde_prefix: "界", + rejianchu: "鞬出", + rejianchu_info: + "当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌不为基本牌,此【杀】不可被【闪】响应且你本回合使用【杀】的次数上限+1,为基本牌,该角色获得此【杀】。", + re_taishici: "界太史慈", + re_taishici_prefix: "界", + hanzhan: "酣战", + hanzhan_gain: "酣战", + hanzhan_info: + "①当你发起拼点时,或成为拼点的目标时,你可以令对方选择拼点牌的方式改为随机选择一张手牌。②当你拼点结束后,你可以获得本次拼点的拼点牌中点数最大的【杀】。", + re_jianyong: "界简雍", + re_jianyong_prefix: "界", + xin_xusheng: "界徐盛", + xin_xusheng_prefix: "界", + decadepojun: "破军", + decadepojun2: "破军", + decadepojun_info: + "当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值)。若这些牌中:有装备牌,你将这些装备牌中的一张置于弃牌堆;有锦囊牌,你摸一张牌。其于回合结束时获得其武将牌上的这些牌。", + re_wangyi: "界王异", + re_wangyi_prefix: "界", + guanzhang: "关兴张苞", + rezishou: "自守", + rezishou2: "自守", + rezishou_info: + "摸牌阶段,你可以多摸X张牌(X为存活势力数)。若如此做,本回合你对其他角色造成伤害时,防止此伤害。", + rezongshi: "宗室", + rezongshi_info: + "锁定技,你的手牌上限+X(X为存活势力数)。准备阶段,若你的手牌数大于体力值,则你本回合内使用【杀】无次数限制。", + ol_dongzhuo: "界董卓", + ol_dongzhuo_prefix: "界", + olbaonue: "暴虐", + olbaonue_info: + "主公技,其他群雄角色造成1点伤害后,你可进行判定,若为♠,你回复1点体力并获得判定牌。", + re_panzhangmazhong: "界潘璋马忠", + re_panzhangmazhong_prefix: "界", + re_hanhaoshihuan: "界韩浩史涣", + re_hanhaoshihuan_prefix: "界", + xinyicong: "义从", + xinyicong_info: + "锁定技,你计算与其他角色的距离时-X,其他角色计算与你的距离时+Y。(X为你的体力值-1,Y为你的已损失体力值-1)", + oltianxiang: "天香", + oltianxiang_info: + "当你受到伤害时,你可以弃置一张红桃牌,防止此伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。", + olhongyan: "红颜", + olhongyan_info: + "锁定技,你的黑桃牌的花色视为红桃。若你的装备区内有红桃牌,则你的手牌上限基数视为体力上限。", + piaoling: "飘零", + piaoling_info: + "结束阶段,你可以进行判定。若判定结果为红桃,则你选择一项:1.将此牌交给一名角色。若你交给了自己,则你弃置一张牌。2.将此牌置于牌堆顶。", + decadelihuo: "疠火", + decadelihuo2: "疠火", + decadelihuo3: "疠火", + decadelihuo_info: + "当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。当你使用火【杀】选择目标时,可以选择一个额外目标。你使用的火【杀】结算完成后,若此【杀】的目标数大于1且你因此【杀】造成过伤害,则你失去1点体力。", + decadechunlao: "醇醪", + decadechunlao2: "醇醪", + decadechunlao_info: + "你可以对其他角色使用【酒(使用方法②)】。当你需要使用【酒】时,若你的武将牌未横置,则你可以将武将牌横置,然后视为使用【酒】。当你受到或造成伤害后,若伤害值大于1且你的武将牌横置,则你可以重置武将牌。", + rejuece: "绝策", + rejuece_info: "结束阶段,你可以对一名本回合内失去过牌的角色造成1点伤害。", + remieji: "灭计", + remieji_info: + "出牌阶段限一次,你可以将一张黑色锦囊牌置于牌堆顶,然后令一名有牌的其他角色选择一项:交给你一张锦囊牌,或依次弃置两张非锦囊牌。", + re_manchong: "界满宠", + re_manchong_prefix: "界", + rejunxing: "峻刑", + rejunxing_info: + "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色。该角色选择一项:1.弃置X张牌并失去1点体力。2.翻面并摸X张牌。(X为你弃置的牌数)", + re_gongsunzan: "界公孙瓒", + re_gongsunzan_prefix: "界", + reqiaomeng: "趫猛", + reqiaomeng_info: + "当你使用【杀】对一名角色造成伤害后,你可以弃置该角色区域内的一张牌。若此牌为坐骑牌,则你于此弃置事件结算结束后获得此牌。", + ol_dengai: "界邓艾", + ol_dengai_prefix: "界", + oltuntian: "屯田", + olzaoxian: "凿险", + oltuntian_info: + "①当你于回合外失去牌后,或于回合内因弃置而失去【杀】后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。", + olzaoxian_info: + "觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。你于当前回合结束后进行一个额外的回合。", + re_sunxiu: "界孙休", + re_sunxiu_prefix: "界", + re_caoxiu: "界曹休", + re_caoxiu_prefix: "界", + xin_lingtong: "界凌统", + xin_lingtong_prefix: "界", + decadexuanfeng: "旋风", + decadexuanfeng_info: + "当你于弃牌阶段弃置过至少两张牌,或当你失去装备区里的牌后,若场上没有处于濒死状态的角色,则你可以弃置至多两名其他角色的共计两张牌。若此时处于你的回合内,你可以对其中一名目标角色造成1点伤害。", + yongjin: "勇进", + yongjin_info: "限定技,出牌阶段,你可以依次移动场上的至多三张不同的装备牌。", + xin_liubiao: "界刘表", + xin_liubiao_prefix: "界", + decadezishou: "自守", + decadezishou_zhiheng: "自守", + decadezishou_info: + "摸牌阶段,你可以多摸X张牌(X为存活势力数);然后本回合你对其他角色造成伤害时,防止此伤害。结束阶段,若你本回合没有使用牌指定其他角色为目标,你可以弃置任意张花色不同的手牌,然后摸等量的牌。", + decadezongshi: "宗室", + decadezongshi_info: + "锁定技,你的手牌上限+X(X为存活势力数)。你的回合外,若你的手牌数大于等于手牌上限,则当你成为延时类锦囊牌或无颜色的牌的目标后,你令此牌对你无效。", + re_fazheng: "界法正", + re_fazheng_prefix: "界", + reenyuan: "恩怨", + reenyuan1: "恩怨", + reenyuan2: "恩怨", + reenyuan_info: + "当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌。当你受到1点伤害后,你可令伤害来源选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。", + rexuanhuo: "眩惑", + rexuanhuo_info: + "摸牌阶段结束时,你可以交给一名其他角色两张手牌,然后该角色选择一项:1. 视为对你选择的另一名角色使用任意一种【杀】或【决斗】,2. 交给你所有手牌。", + re_fuhuanghou: "界伏寿", + re_fuhuanghou_prefix: "界", + reqiuyuan: "求援", + reqiuyuan_info: + "当你成为【杀】的目标时,你可选择另一名其他角色。除非该角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标且该角色不能响应此【杀】。", + rezhuikong: "惴恐", + rezhuikong_info: + "其他角色的回合开始时,若你已受伤,你可与其拼点:若你赢,本回合该角色只能对自己使用牌;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。", + re_gongsunyuan: "界公孙渊", + re_gongsunyuan_prefix: "界", + rehuaiyi: "怀异", + rehuaiyi_info: + "出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色:全部相同,你摸一张牌,并将此技能于本阶段内改为“限两次”,然后终止此技能的结算流程;不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。", + re_caozhen: "界曹真", + re_caozhen_prefix: "界", + residi: "司敌", + residi_push: "司敌", + residi2: "司敌", + residi3: "司敌", + residi_info: + "结束阶段,你可以将一张非基本牌置于武将牌上,称为“司”。其他角色的出牌阶段开始时,你可以移去一张“司”。若如此做,其本阶段内不能使用或打出与“司”颜色相同的牌。此阶段结束时,若其于此阶段内未使用过:【杀】,你视为对其使用一张【杀】。锦囊牌,你摸两张牌。", + gz_re_xushu: "徐庶", + re_zhangchunhua: "界张春华", + re_zhangchunhua_prefix: "界", + xin_handang: "界韩当", + xin_handang_prefix: "界", + xingongji: "弓骑", + xingongji2: "弓骑", + xingongji_info: + "出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限且使用与此牌花色相同的【杀】无次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", + xinjiefan: "解烦", + xinjiefan_info: + "限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后若游戏轮数为1,则你于此回合结束时恢复此技能。", + gzquanji: "权计", + gzquanji_info: + "每回合每项各限一次。当你受到伤害后或造成伤害后,你可以摸一张牌,然后你将一张牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", + gzpaiyi: "排异", + gzpaiyi_backup: "排异", + gzpaiyi_info: + "出牌阶段限一次。你可以移去一张“权”并选择一名角色。令其摸X张牌(X为你的“权”数且至多为7)。然后若其手牌数大于你,则你对其造成1点伤害。", + ol_zhurong: "界祝融", + ol_zhurong_prefix: "界", + changbiao: "长标", + changbiao_info: + "出牌阶段限一次,你可以将任意张手牌当做【杀】使用(无距离限制)。若你因此【杀】对目标角色造成过伤害,则你于出牌阶段结束时摸X张牌(X为此【杀】对应的实体牌数量)。", + re_zhoucang: "界周仓", + re_zhoucang_prefix: "界", + rezhongyong: "忠勇", + rezhongyong_info: + "当你使用【杀】后,你可以将此【杀】以及目标角色使用的【闪】交给一名其他角色,若其获得的牌中有红色,则其可以对你攻击范围内的角色使用一张【杀】。若其获得的牌中有黑色,其摸一张牌。", + ollihuo: "疠火", + ollihuo2: "疠火", + ollihuo3: "疠火", + ollihuo4: "疠火", + ollihuo_info: + "你使用普通的【杀】可以改为火【杀】,若此【杀】造成过伤害,你失去1点体力;你使用火【杀】可以多选择一个目标。你每回合使用的第一张牌如果是【杀】,则此【杀】结算完毕后可置于你的武将牌上。", + xinjiangchi: "将驰", + xinjiangchi_info: + "出牌阶段开始时,你可选择:①摸一张牌。②摸两张牌,然后本回合内不能使用或打出【杀】。③弃置一张牌,然后本回合内可以多使用一张【杀】,且使用【杀】无距离限制。", + redingpin: "定品", + redingpin_info: + "出牌阶段,你可以弃置一张本回合未使用过/弃置过的类型的牌并选择一名角色。其进行判定,若结果为:黑色,其摸X张牌(X为其体力值且至多为3)且本回合内不能再成为〖定品〗的目标;红桃,你令此次弃置的牌不计入〖定品〗弃置牌合法性的检测;方片,你将武将牌翻面。", + refaen: "法恩", + refaen_info: "一名角色翻面或横置后,你可令其摸一张牌。", + dcfaen: "法恩", + dcfaen_info: "一名角色翻至正面或横置后,你可令其摸一张牌。", + reshizhi: "矢志", + reshizhi_info: + "锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通杀造成伤害后,你回复1点体力。", + re_guotufengji: "界郭图逢纪", + re_guotufengji_prefix: "界", + rejigong: "急攻", + rejigong2: "急攻", + rejigong_info: + "出牌阶段开始时,你可以摸至多三张牌。若如此做,你本回合的手牌上限基数改为X,且弃牌阶段结束时,若X不小于Y,则你回复1点体力。(X为你本回合内造成的伤害值之和,Y为你本回合内因〖急攻〗摸牌而得到的牌的数量总和)", + ol_jiangwei: "界姜维", + ol_jiangwei_prefix: "界", + oltiaoxin: "挑衅", + oltiaoxin_info: + "出牌阶段限一次,你可以选择一名攻击范围内包含你的角色。然后除非该角色对你使用一张【杀】且此【杀】对你造成伤害,否则你弃置其一张牌,然后将此技能于此出牌阶段内修改为出牌阶段限两次。", + olzhiji: "志继", + olzhiji_info: + "觉醒技,准备阶段或结束阶段,若你没有手牌,你回复1点体力或摸两张牌,然后减1点体力上限,获得〖观星〗。", + decadezhenjun: "镇军", + decadezhenjun_info: + "准备阶段或结束阶段,你可以弃置一名角色X张牌(X为其手牌数减体力值且至少为1),若其中没有装备牌,你选择一项:1.你弃一张牌;2.该角色摸等量的牌。", + decadejingce: "精策", + decadejingce_info: + "结束阶段,若你本回合使用过的牌数不小于你的体力值,则你可执行一个摸牌阶段或出牌阶段;若这些牌包含的花色数也不小于你的体力值,则你将“或”改为“并”。", + re_guanping: "界关平", + re_guanping_prefix: "界", + relongyin: "龙吟", + relongyin_info: + "当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数。若此【杀】为红色,则你摸一张牌;若你以此法弃置的牌与此【杀】点数相同,则你重置“竭忠”。", + jiezhong: "竭忠", + jiezhong_info: "限定技,出牌阶段开始时,你可以将手牌补至体力上限(至多摸五张)。", + re_caifuren: "界蔡夫人", + re_caifuren_prefix: "界", + reqieting: "窃听", + reqieting_info: + "其他角色的回合结束时,若其本回合内未造成过伤害,则你可将其装备区内的一张牌置于你的装备区内;若其本回合内未对其他角色使用过牌,则你可摸一张牌。", + rexianzhou: "献州", + rexianzhou_info: + "限定技。出牌阶段,你可将装备区内的所有牌交给一名其他角色。你回复X点体力,然后对其攻击范围内的至多X名角色各造成1点伤害(X为你以此法给出的牌数)。", + xin_zhonghui: "界钟会", + xin_zhonghui_prefix: "界", + xinquanji: "权计", + xinquanji_info: + "①当你受到1点伤害后,或其他角色不因你的赠予或交给而得到你的牌后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”。②你的手牌上限+X(X为“权”的数量)。", + xinzili: "自立", + xinzili_info: + "觉醒技。准备阶段,若你的“权”数大于2,则你回复1点体力并摸两张牌,减1点体力上限并获得〖排异〗。", + xinpaiyi: "排异", + xinpaiyi_backup: "排异", + xinpaiyi_info: + "出牌阶段每项各限一次,你可移去一张“权”并选择一项:①令一名角色摸X张牌。②对至多X名角色各造成1点伤害。(X为“权”数)", + re_guyong: "界顾雍", + re_guyong_prefix: "界", + reshenxing: "慎行", + reshenxing_info: + "出牌阶段,你可以弃置X张牌(X为你本阶段内发动过〖慎行〗的次数且至少为0,至多为2),然后摸一张牌。", + rebingyi: "秉壹", + rebingyi_info: + "结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);点数均相同,则你摸一张牌。", + re_jiaxu: "界贾诩", + re_jiaxu_prefix: "界", + rewansha: "完杀", + rewansha_info: + "锁定技。①你的回合内,不处于濒死状态的其他角色不能使用【桃】。②当有角色于你的回合内进入濒死状态时,你令其以外的所有其他角色的非锁定技失效直到此濒死状态结算结束。", + reluanwu: "乱武", + reluanwu_info: + "限定技,出牌阶段,你可令所有其他角色依次选择一项:①对距离最近(或之一)的角色使用一张【杀】;②失去1点体力。结算完成后,你可视为使用一张【杀】(无距离限制)。", + reweimu: "帷幕", + reweimu_info: + "锁定技。①你不能成为黑色锦囊牌的目标。②当你于回合内受到伤害时,你防止此伤害并摸2X张牌(X为伤害值)。", + ol_lusu: "界鲁肃", + ol_lusu_prefix: "界", + olhaoshi: "好施", + olhaoshi_info: + "摸牌阶段开始时,你可以多摸两张牌。然后摸牌阶段结束时,若你的手牌数大于5,则你将手牌数的一半(向下取整)交给一名手牌最少其他角色并获得如下效果直到你下回合开始:当你成为【杀】或普通锦囊牌的目标后,其可以交给你一张手牌。", + oldimeng: "缔盟", + oldimeng_info: + "出牌阶段限一次,你可令两名满足X≤Y的其他角色交换手牌并获得如下效果:出牌阶段结束时,你弃置X张牌(X为这两名角色手牌数之差的绝对值;Y为你的牌数)。", - rejijiang:'激将', - rejijiang1:'激将', - rejijiang2:'激将', - rejijiang_info:'主公技。①当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。②每回合限一次。当有蜀势力角色于回合外使用或打出【杀】时,其可以令你摸一张牌。', - xin_yufan:'界虞翻', - xin_yufan_prefix:'界', - xinzongxuan:'纵玄', - xinzongxuan_info:'当你的牌因弃置而进入弃牌堆后,你可将其中的任意张牌置于牌堆顶。若剩余的牌中有锦囊牌,则你可以令一名其他角色获得其中的一张。', - xinzhiyan:'直言', - xinzhiyan_info:'结束阶段开始时,你可令一名角色摸一张牌(正面朝上移动)。若此牌为基本牌,则你摸一张牌。若此牌为装备牌,则其回复1点体力并使用此装备牌。', - re_xiahoushi:'界夏侯氏', - re_xiahoushi_prefix:'界', - reqiaoshi:'樵拾', - reqiaoshi_info:'其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。若这两张牌花色相同,则你可以重复此步骤。', - reyanyu:'燕语', - reyanyu2:'燕语', - reyanyu_info:'①出牌阶段,你可以重铸【杀】。②出牌阶段结束时,你可以令一名其他男性角色摸X张牌(X为你本阶段内发动过〖燕语①〗的次数且至多为3)。', - rehujia:'护驾', - rehujia_info:'主公技。①当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。②每回合限一次。当有魏势力角色于回合外使用或打出【闪】时,其可以令你摸一张牌。', - ol_xuhuang:'界徐晃', - ol_xuhuang_prefix:'界', - olduanliang:'断粮', - olduanliang_info:'你可以将一张黑色非锦囊牌当做【兵粮寸断】使用。若你于当前回合内未造成过伤害,则你使用【兵粮寸断】无距离限制。', - oljiezi:'截辎', - oljiezi_info:'①当有角色跳过摸牌阶段后,你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。②一名角色的摸牌阶段结束时,若其有“辎”,则你移去其“辎”,然后令其获得一个额外的摸牌阶段。', - re_madai:'界马岱', - re_madai_prefix:'界', - reqianxi:'潜袭', - reqianxi_info:'准备阶段开始时,你可摸一张牌,然后弃置一张牌并选择一名距离为1的其他角色。该角色于本回合内:{不能使用或打出与此牌颜色相同的牌,且其装备区内与此牌颜色相同的防具牌无效,且当其回复体力时,你摸两张牌。}', - re_guohuanghou:'界郭皇后', - re_guohuanghou_prefix:'界', - rejiaozhao:'矫诏', - rejiaozhao_info:'出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。', - rejiaozhao_lv2:'矫诏·升级 Lv.1', - rejiaozhao_lv2_info:'出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。', - rejiaozhao_lv3:'矫诏·升级 Lv.2', - rejiaozhao_lv3_info:'出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。', - redanxin:'殚心', - redanxin_info:'当你受到伤害后,你可以摸一张牌并升级〖矫诏〗。', - xin_wuguotai:'界吴国太', - xin_wuguotai_prefix:'界', - xinganlu:'甘露', - xinganlu_info:'出牌阶段限一次。你可以令两名角色交换装备区内的牌,然后若这两名角色装备区内牌数差的绝对值大于你已损失的体力值,则你弃置两张手牌。', - xinbuyi:'补益', - xinbuyi_info:'一名角色进入濒死状态时,你可展示其一张手牌。若此牌不为基本牌,则其弃置此牌并回复1点体力。若其以此法弃置的牌移动前为其的唯一一张手牌,则其摸一张牌。', - decadexianzhen:'陷阵', - decadexianzhen2:'陷阵', - decadexianzhen_info:'每回合限一次。出牌阶段,你可以和一名其他角色拼点。若你赢:本回合你无视该角色的防具,且对其使用牌没有次数和距离限制,且本回合对其使用牌造成伤害时,此伤害+1(每种牌名每回合限一次);若你没赢:你本回合内不能使用【杀】,且【杀】不计入手牌上限。', - decadejinjiu:'禁酒', - decadejinjiu_info:'锁定技。你的【酒】的牌名均视为【杀】且点数视为K;你的回合内,其他角色不能使用【酒】。', - dc_xushu:'新杀徐庶', - dc_xushu_prefix:'新杀', - rezhuhai:'诛害', - rezhuhai_info:'其他角色的回合结束时,若其本回合内造成过伤害,则你可以选择一项:⒈将一张手牌当做【杀】对其使用。⒉视为对其使用一张【过河拆桥】。', - xsqianxin:'潜心', - xsqianxin_info:'觉醒技。当你造成伤害后,若你已受伤,则你减1点体力上限并获得〖荐言〗。', - rejianyan:'荐言', - rejianyan_info:'出牌阶段每项各限一次。你可选择一种颜色或一种牌的类别,然后系统从牌堆中检索出一张满足该条件的牌并展示之。然后你将此牌交给一名男性角色或Key势力角色。', - re_zhanghe:'界张郃', - re_zhanghe_prefix:'界', - reqiaobian:'巧变', - reqiaobian_info:'①游戏开始时,你获得两枚“变”。②判定阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。③摸牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后可以获得至多两名其他角色的各一张手牌。④出牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后你可以移动场上的一张牌。⑤弃牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。⑥结束阶段,若你的〖巧变⑥〗记录中不包含你的手牌数,则你获得一枚“变”并记录你的手牌数。', - olbeige:'悲歌', - olbeige_info:'当有角色受到渠道为【杀】的伤害后,若你有牌,你可令其进行判定。然后你可弃置一张牌,根据判定结果执行以下的一个选项:♥,其回复1点体力;♦,其摸两张牌;♣,伤害来源弃置两张牌️;♠,伤害来源将武将牌翻面。若你弃置的牌与判定结果:点数相同,则你获得你弃置的牌;花色相同,则你获得判定牌。', - dc_bulianshi:'界步练师', - dc_bulianshi_prefix:'界', - dcanxu:'安恤', - dcanxu_info:'出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌;若这两名角色手牌数相等,则你回复1点体力。', - dczhuiyi:'追忆', - dczhuiyi_info:'当你死亡时,你可以令一名不为击杀者的其他角色摸X张牌(X为存活角色数),然后其回复1点体力。', - re_jushou:'界沮授', - re_jushou_prefix:'界', - dcshibei:'矢北', - dcshibei_info:'锁定技,当你于一回合内第一次受到伤害后,你回复1点体力;当你于一回合内第二次受到伤害后,你失去1点体力。', - dcjianying:'渐营', - dcjianying_info:'当你使用与你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。', - re_duji:'界杜畿', - re_duji_prefix:'界', - reandong:'安东', - reandong_info:'当你受到其他角色造成的伤害时,你可以令伤害来源选择一项:⒈防止此伤害。然后其♥牌不计入本回合的手牌上限;⒉你观看其手牌并获得其中的所有♥牌,若其没有手牌,则你下次发动〖安东〗时改为自行选择。', - reyingshi:'应势', - reyingshi_info:'出牌阶段开始时,你可以展示一张手牌,选择一名角色A和一名其他角色B。A可以对B使用一张【杀】,然后获得你展示的牌。若A因此【杀】造成过伤害,则A获得牌堆中与展示牌花色点数相同的其他牌。', - dcqiaomeng:'趫猛', - dcqiaomeng_info:'当你使用黑色牌指定第一个目标后,你可以弃置目标角色中一名其他角色的一张牌。若你以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令此牌不可被响应。', - dc_gongsunzan:'新杀公孙瓒', - dc_gongsunzan_prefix:'新杀', - re_liuchen:'界刘谌', - re_liuchen_prefix:'界', - rezhanjue:'战绝', - rezhanjue_effect:'战绝', - rezhanjue_info:'出牌阶段,若你本阶段内因〖战绝〗得到过的牌数小于3,则你可以将所有不具有“勤王”标记的手牌当做【决斗】使用。此【决斗】使用结算结束后,你摸一张牌。然后所有因此【决斗】受到过伤害的角色也各摸一张牌。', - reqinwang:'勤王', - reqinwang_info:'主公技。出牌阶段限一次,你可以令所有其他蜀势力角色依次选择是否交给你一张【杀】,然后你可以令选择是的角色摸一张牌。', - shizhan:'势斩', - shizhan_info:'出牌阶段限两次,你可以选择一名其他角色。该角色视为对你使用一张【决斗】。', - ol_xunyu:'界荀彧', - ol_xunyu_prefix:'界', - oljieming:'节命', - oljieming_info:'当你受到1点伤害后或死亡时,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。', - re_liufeng:'界刘封', - re_liufeng_prefix:'界', - rexiansi:'陷嗣', - rexiansi2:'陷嗣', - rexiansi_info:'①准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”。②当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用一张【杀】。③若你的“逆”数大于体力值,则你可以移去一张“逆”并视为使用一张【杀】。', - re_sp_taishici:'界SP太史慈', - re_sp_taishici_prefix:'界SP', - rejixu:"击虚", - rejixu_info:"出牌阶段限一次。若你有手牌,则你可以选择至多X名角色,令这些角色猜测你的手牌区中是否有【杀】。若你:有【杀】,则你本阶段使用【杀】的次数上限+Y,且当你于本阶段内使用【杀】指定目标后,你可以令这Y名角色也成为此【杀】的目标;没有【杀】,则你弃置这Y名角色的各一张牌。然后你摸Y张牌(X为你的体力值,Y为这些角色中猜错的角色数)。", - ol_dianwei:'界典韦', - ol_dianwei_prefix:'界', - olqiangxi:'强袭', - olqiangxi_info:'出牌阶段限两次。你可以弃置一张武器牌或受到1点无来源伤害,然后对一名本回合内未成为过〖强袭〗目标的其他角色造成1点伤害。', - olningwu:'狞恶', - olningwu_info:'锁定技。当一名角色A于一回合内第二次受到伤害后,若A或伤害来源为你,则你摸一张牌,然后弃置其装备区或判定区内的一张牌。', - re_zhuhuan:'界朱桓', - re_zhuhuan_prefix:'界', - refenli:'奋励', - refenli_info:'若你的手牌数为全场最多,你可以跳过判定阶段和摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。', + rejijiang: "激将", + rejijiang1: "激将", + rejijiang2: "激将", + rejijiang_info: + "主公技。①当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。②每回合限一次。当有蜀势力角色于回合外使用或打出【杀】时,其可以令你摸一张牌。", + xin_yufan: "界虞翻", + xin_yufan_prefix: "界", + xinzongxuan: "纵玄", + xinzongxuan_info: + "当你的牌因弃置而进入弃牌堆后,你可将其中的任意张牌置于牌堆顶。若剩余的牌中有锦囊牌,则你可以令一名其他角色获得其中的一张。", + xinzhiyan: "直言", + xinzhiyan_info: + "结束阶段开始时,你可令一名角色摸一张牌(正面朝上移动)。若此牌为基本牌,则你摸一张牌。若此牌为装备牌,则其回复1点体力并使用此装备牌。", + re_xiahoushi: "界夏侯氏", + re_xiahoushi_prefix: "界", + reqiaoshi: "樵拾", + reqiaoshi_info: + "其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。若这两张牌花色相同,则你可以重复此步骤。", + reyanyu: "燕语", + reyanyu2: "燕语", + reyanyu_info: + "①出牌阶段,你可以重铸【杀】。②出牌阶段结束时,你可以令一名其他男性角色摸X张牌(X为你本阶段内发动过〖燕语①〗的次数且至多为3)。", + rehujia: "护驾", + rehujia_info: + "主公技。①当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。②每回合限一次。当有魏势力角色于回合外使用或打出【闪】时,其可以令你摸一张牌。", + ol_xuhuang: "界徐晃", + ol_xuhuang_prefix: "界", + olduanliang: "断粮", + olduanliang_info: + "你可以将一张黑色非锦囊牌当做【兵粮寸断】使用。若你于当前回合内未造成过伤害,则你使用【兵粮寸断】无距离限制。", + oljiezi: "截辎", + oljiezi_info: + "①当有角色跳过摸牌阶段后,你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。②一名角色的摸牌阶段结束时,若其有“辎”,则你移去其“辎”,然后令其获得一个额外的摸牌阶段。", + re_madai: "界马岱", + re_madai_prefix: "界", + reqianxi: "潜袭", + reqianxi_info: + "准备阶段开始时,你可摸一张牌,然后弃置一张牌并选择一名距离为1的其他角色。该角色于本回合内:{不能使用或打出与此牌颜色相同的牌,且其装备区内与此牌颜色相同的防具牌无效,且当其回复体力时,你摸两张牌。}", + re_guohuanghou: "界郭皇后", + re_guohuanghou_prefix: "界", + rejiaozhao: "矫诏", + rejiaozhao_info: + "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。", + rejiaozhao_lv2: "矫诏·升级 Lv.1", + rejiaozhao_lv2_info: + "出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。", + rejiaozhao_lv3: "矫诏·升级 Lv.2", + rejiaozhao_lv3_info: "出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。", + redanxin: "殚心", + redanxin_info: "当你受到伤害后,你可以摸一张牌并升级〖矫诏〗。", + xin_wuguotai: "界吴国太", + xin_wuguotai_prefix: "界", + xinganlu: "甘露", + xinganlu_info: + "出牌阶段限一次。你可以令两名角色交换装备区内的牌,然后若这两名角色装备区内牌数差的绝对值大于你已损失的体力值,则你弃置两张手牌。", + xinbuyi: "补益", + xinbuyi_info: + "一名角色进入濒死状态时,你可展示其一张手牌。若此牌不为基本牌,则其弃置此牌并回复1点体力。若其以此法弃置的牌移动前为其的唯一一张手牌,则其摸一张牌。", + decadexianzhen: "陷阵", + decadexianzhen2: "陷阵", + decadexianzhen_info: + "每回合限一次。出牌阶段,你可以和一名其他角色拼点。若你赢:本回合你无视该角色的防具,且对其使用牌没有次数和距离限制,且本回合对其使用牌造成伤害时,此伤害+1(每种牌名每回合限一次);若你没赢:你本回合内不能使用【杀】,且【杀】不计入手牌上限。", + decadejinjiu: "禁酒", + decadejinjiu_info: + "锁定技。你的【酒】的牌名均视为【杀】且点数视为K;你的回合内,其他角色不能使用【酒】。", + dc_xushu: "新杀徐庶", + dc_xushu_prefix: "新杀", + rezhuhai: "诛害", + rezhuhai_info: + "其他角色的回合结束时,若其本回合内造成过伤害,则你可以选择一项:⒈将一张手牌当做【杀】对其使用。⒉视为对其使用一张【过河拆桥】。", + xsqianxin: "潜心", + xsqianxin_info: "觉醒技。当你造成伤害后,若你已受伤,则你减1点体力上限并获得〖荐言〗。", + rejianyan: "荐言", + rejianyan_info: + "出牌阶段每项各限一次。你可选择一种颜色或一种牌的类别,然后系统从牌堆中检索出一张满足该条件的牌并展示之。然后你将此牌交给一名男性角色或Key势力角色。", + re_zhanghe: "界张郃", + re_zhanghe_prefix: "界", + reqiaobian: "巧变", + reqiaobian_info: + "①游戏开始时,你获得两枚“变”。②判定阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。③摸牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后可以获得至多两名其他角色的各一张手牌。④出牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后你可以移动场上的一张牌。⑤弃牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。⑥结束阶段,若你的〖巧变⑥〗记录中不包含你的手牌数,则你获得一枚“变”并记录你的手牌数。", + olbeige: "悲歌", + olbeige_info: + "当有角色受到渠道为【杀】的伤害后,若你有牌,你可令其进行判定。然后你可弃置一张牌,根据判定结果执行以下的一个选项:♥,其回复1点体力;♦,其摸两张牌;♣,伤害来源弃置两张牌️;♠,伤害来源将武将牌翻面。若你弃置的牌与判定结果:点数相同,则你获得你弃置的牌;花色相同,则你获得判定牌。", + dc_bulianshi: "界步练师", + dc_bulianshi_prefix: "界", + dcanxu: "安恤", + dcanxu_info: + "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌;若这两名角色手牌数相等,则你回复1点体力。", + dczhuiyi: "追忆", + dczhuiyi_info: + "当你死亡时,你可以令一名不为击杀者的其他角色摸X张牌(X为存活角色数),然后其回复1点体力。", + re_jushou: "界沮授", + re_jushou_prefix: "界", + dcshibei: "矢北", + dcshibei_info: + "锁定技,当你于一回合内第一次受到伤害后,你回复1点体力;当你于一回合内第二次受到伤害后,你失去1点体力。", + dcjianying: "渐营", + dcjianying_info: "当你使用与你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。", + re_duji: "界杜畿", + re_duji_prefix: "界", + reandong: "安东", + reandong_info: + "当你受到其他角色造成的伤害时,你可以令伤害来源选择一项:⒈防止此伤害。然后其♥牌不计入本回合的手牌上限;⒉你观看其手牌并获得其中的所有♥牌,若其没有手牌,则你下次发动〖安东〗时改为自行选择。", + reyingshi: "应势", + reyingshi_info: + "出牌阶段开始时,你可以展示一张手牌,选择一名角色A和一名其他角色B。A可以对B使用一张【杀】,然后获得你展示的牌。若A因此【杀】造成过伤害,则A获得牌堆中与展示牌花色点数相同的其他牌。", + dcqiaomeng: "趫猛", + dcqiaomeng_info: + "当你使用黑色牌指定第一个目标后,你可以弃置目标角色中一名其他角色的一张牌。若你以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令此牌不可被响应。", + dc_gongsunzan: "新杀公孙瓒", + dc_gongsunzan_prefix: "新杀", + re_liuchen: "界刘谌", + re_liuchen_prefix: "界", + rezhanjue: "战绝", + rezhanjue_effect: "战绝", + rezhanjue_info: + "出牌阶段,若你本阶段内因〖战绝〗得到过的牌数小于3,则你可以将所有不具有“勤王”标记的手牌当做【决斗】使用。此【决斗】使用结算结束后,你摸一张牌。然后所有因此【决斗】受到过伤害的角色也各摸一张牌。", + reqinwang: "勤王", + reqinwang_info: + "主公技。出牌阶段限一次,你可以令所有其他蜀势力角色依次选择是否交给你一张【杀】,然后你可以令选择是的角色摸一张牌。", + shizhan: "势斩", + shizhan_info: "出牌阶段限两次,你可以选择一名其他角色。该角色视为对你使用一张【决斗】。", + ol_xunyu: "界荀彧", + ol_xunyu_prefix: "界", + oljieming: "节命", + oljieming_info: + "当你受到1点伤害后或死亡时,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。", + re_liufeng: "界刘封", + re_liufeng_prefix: "界", + rexiansi: "陷嗣", + rexiansi2: "陷嗣", + rexiansi_info: + "①准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”。②当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用一张【杀】。③若你的“逆”数大于体力值,则你可以移去一张“逆”并视为使用一张【杀】。", + re_sp_taishici: "界SP太史慈", + re_sp_taishici_prefix: "界SP", + rejixu: "击虚", + rejixu_info: + "出牌阶段限一次。若你有手牌,则你可以选择至多X名角色,令这些角色猜测你的手牌区中是否有【杀】。若你:有【杀】,则你本阶段使用【杀】的次数上限+Y,且当你于本阶段内使用【杀】指定目标后,你可以令这Y名角色也成为此【杀】的目标;没有【杀】,则你弃置这Y名角色的各一张牌。然后你摸Y张牌(X为你的体力值,Y为这些角色中猜错的角色数)。", + ol_dianwei: "界典韦", + ol_dianwei_prefix: "界", + olqiangxi: "强袭", + olqiangxi_info: + "出牌阶段限两次。你可以弃置一张武器牌或受到1点无来源伤害,然后对一名本回合内未成为过〖强袭〗目标的其他角色造成1点伤害。", + olningwu: "狞恶", + olningwu_info: + "锁定技。当一名角色A于一回合内第二次受到伤害后,若A或伤害来源为你,则你摸一张牌,然后弃置其装备区或判定区内的一张牌。", + re_zhuhuan: "界朱桓", + re_zhuhuan_prefix: "界", + refenli: "奋励", + refenli_info: + "若你的手牌数为全场最多,你可以跳过判定阶段和摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。", //破界石不值钱了 就逮着免费突破硬削是吧 - repingkou:'平寇', - repingkou_info:'回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌。', - dc_liru:'界李儒', - dc_liru_prefix:'界', - dcmieji:'灭计', - dcmieji_info:'出牌阶段限一次,你可以展示一张武器牌或黑色锦囊牌。你将此牌置于牌堆顶,然后令一名有手牌的其他角色选择一项:⒈弃置一张锦囊牌;⒉依次弃置两张非锦囊牌。', - dcfencheng:'焚城', - dcfencheng_info:'限定技。出牌阶段,你可以指定一名其他角色,令从其开始的其他角色依次选择一项:⒈弃置至少X张牌(X为上一名角色弃置的牌数+1)。⒉你对其造成2点火焰伤害。', - oljiang:'激昂', - oljiang_info:'①当你使用【决斗】或红色【杀】指定第一个目标后,或成为【决斗】或红色【杀】的目标后,你可以摸一张牌。②当有【决斗】或红色【杀】于每回合内首次因弃置而进入弃牌堆后,你可以失去1点体力并获得这些牌。', - re_xunyou:'界荀攸', - re_xunyou_prefix:'界', - reqice:'奇策', - reqice_info:'出牌阶段限X次(X为你的“奇策”数+1),你可以将所有手牌当做任意一张普通锦囊牌使用。', - rezhiyu:'智愚', - rezhiyu_info:'当你受到伤害后,你可以摸一张牌,然后展示所有手牌,令伤害来源弃置一张手牌。若你展示的牌颜色均相同,你获得1枚“奇策”直到下回合结束且获得来源弃置的牌。', - re_caiyong:'界蔡邕', - re_caiyong_prefix:'界', - rebizhuan:'辟撰', - rebizhuan_bg:'书', - rebizhuan_info:'①当你使用♠牌时,或成为其他角色使用♠牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”(你至多拥有四张“书”)。②你的手牌上限+X(X为“书”数)。', - retongbo:'通博', - retongbo_info:'摸牌阶段结束时,你可以用任意手牌交换等量“书”。然后若“书”数至少为4,你可以将四张“书”任意交给其他角色。若你交出的牌花色各不相同,你回复1点体力且“书”的上限+1(至多增加等同存活角色数的上限)。', - re_chengong:'界陈宫', - re_chengong_prefix:'界', - remingce:'明策', - remingce_info:'出牌阶段限一次。你可以将一张【杀】或装备牌交给一名其他角色,其选择一项:1.视为对你选择的另一名角色使用一张【杀】,且若此牌造成伤害,则执行选项2;2.你与其各摸一张牌。', - re_sundeng:'界孙登', - re_sundeng_prefix:'界', - rekuangbi:'匡弼', - rekuangbi_info:'出牌阶段开始时,你可以令一名其他角色将至多三张牌置于你的武将牌上直到此阶段结束。然后当你使用牌时,若你:有与此牌花色相同的“匡弼”牌,你移去其中一张并与其各摸一张牌;没有与此牌花色相同的“匡弼”牌,你随机移去一张“匡弼”牌并摸一张牌。', - dc_chenqun:'界陈群', - dc_chenqun_prefix:'界', - repindi:'品第', - repindi_info:'出牌阶段每名角色限一次。你可以弃置一张本阶段未以此法弃置过的类型的牌并选择一名角色,你选择一项:1.其摸X张牌;2.其弃置X张牌(X为你本回合发动〖品第〗的次数)。然后若其已受伤,你横置或重置。', - re_mazhong:'界马忠', - re_mazhong_prefix:'界', - refuman:'抚蛮', - refuman_info:'出牌阶段每名角色限一次。你可以弃置一张牌,令一名其他角色从弃牌堆中获得一张【杀】。然后其于其下个回合结束前使用或打出此牌时,你与其各摸一张牌。', - re_guanzhang:'界关兴张苞', - re_guanzhang_prefix:'界', - retongxin:'同心', - retongxin_info:'锁定技。你的攻击范围+2。', - re_wenpin:'界文聘', - re_wenpin_prefix:'界', - rezhenwei:'镇卫', - rezhenwei_info:'当一名其他角色成为【杀】或黑色锦囊牌的目标时,若该角色的体力值不大于你且此牌的目标角色数为1,你可以弃置一张牌并选择一项:1.摸一张牌,然后将此【杀】或黑色锦囊牌的目标转移给你;2.令此【杀】或黑色锦囊牌无效且将此【杀】或黑色锦囊牌置于使用者的武将牌上,然后当前回合结束后,使用者获得这些牌。', - ol_huangzhong:'界黄忠', - ol_huangzhong_prefix:'界', - remoshi:'没矢', - remoshi_info:'锁定技。①当你使用【杀】对目标角色造成伤害后,若其装备区里有防具牌或坐骑牌,你将此【杀】对应的实体牌置于其武将牌上。②当有“没矢”牌的角色失去防具牌或坐骑牌后,你获得其“没矢”牌。', - dc_caozhi:'界曹植', - dc_caozhi_prefix:'界', - dcjiushi:'酒诗', - dcjiushi_info:'①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌于受到伤害时背面向上,你可以翻面。③当你使用【酒】后,你使用【杀】的次数上限+1直到你的下个回合结束。', - olhuoji:'火计', - olhuoji_info:'①你可以将一张红色牌当【火攻】使用。②你使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。', - olkanpo:'看破', - olkanpo_info:'①你可以将一张黑色牌当【无懈可击】使用。②你使用的【无懈可击】不可被响应。', - xinwangxi:'忘隙', - xinwangxi_info:'当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其一张牌。', - ol_yanwen:'界颜良文丑', - ol_yanwen_prefix:'界', - olshuangxiong:'双雄', - olshuangxiong_info:'①摸牌阶段结束时,你可以弃置一张牌。若如此做,你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用。②结束阶段,你从弃牌堆中获得本回合内对你造成伤害的所有牌。', - re_zhuzhi:'界朱治', - re_zhuzhi_prefix:'界', - reanguo:'安国', - reanguo_info:'出牌阶段限一次。你可以选择一名其他角色,若其:手牌数为全场最少,其摸一张牌;体力值为全场最低,其回复1点体力;装备区内牌数为全场最少,其随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。若你与其执行了全部分支,你可以重铸任意张牌。', - dcyicong:'义从', - dcyicong_info:'锁定技。①你至其他角色的距离-1。②若你已损失的体力值不小于2,则其他角色至你的距离+1。', - re_zhangsong:'界张松', - re_zhangsong_prefix:'界', - rexiantu:'献图', - rexiantu_info:'其他角色的出牌阶段开始时,你可以摸两张牌,然后将两张牌交给该角色。然后此阶段结束时,若其于此阶段没有造成过伤害,你失去1点体力。', - re_jsp_huangyueying:'界SP黄月英', - re_jsp_huangyueying_prefix:'界SP', - rejiqiao:'机巧', - rejiqiao_info:'出牌阶段开始时,你可以弃置任意张牌,然后亮出牌堆顶X张牌(X为你以此法弃置的牌数与其中装备牌数之和),你获得其中所有非装备牌。', - relinglong:'玲珑', - relinglong_info:'锁定技。若你的装备区:有空置的防具栏,你视为拥有〖八卦阵〗;有空置的两种坐骑栏,你的手牌上限+2;有空置的宝物栏,你视为拥有〖奇才〗;以上均满足:你使用的【杀】或普通锦囊牌不可被响应。', - ol_zhangzhang:'界张昭张纮', - ol_zhangzhang_prefix:'界', - olzhijian:'直谏', - olzhijian_info:'出牌阶段,你可以将一张装备牌置于其他角色的装备区(可替换原装备),然后摸一张牌。', - olguzheng:'固政', - olguzheng_info:'每阶段限一次。当其他角色的至少两张牌因弃置而进入弃牌堆后,你可以令其获得其中一张牌,然后你可以获得剩余的牌。', - re_caochong:'界曹冲', - re_caochong_prefix:'界', - rechengxiang:'称象', - rechengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。若你得到的牌点数之和为13,你复原武将牌。', - re_caorui:'界曹叡', - re_caorui_prefix:'界', - remingjian:'明鉴', - remingjian_info:'出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合获得如下效果:1.手牌上限与使用【杀】的次数上限+1;2.当该角色首次造成伤害后,其可以令你发动一次〖恢拓〗。', - rexingshuai:'兴衰', - rexingshuai_info:'主公技,限定技。当你进入濒死状态时,你可令其他魏势力角色依次选择是否令你回复1点体力。然后这些角色依次受到1点伤害。有〖明鉴〗效果的角色于其回合内杀死角色后,你重置〖兴衰〗。', - xin_zhangliang:'界张梁', - xin_zhangliang_prefix:'界', - rejijun:'集军', - rejijun_info:'当你使用目标角色含有自己的牌结算完毕后,你可以进行一次判定并将判定牌置于武将牌上,称为“方”。', - refangtong:'方统', - refangtong_info:'结束阶段,你可以将一张手牌置于武将牌上,称为“方”。若如此做,你可以移去任意张“方”并对一名其他角色造成1点雷属性伤害(若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害)。', - re_simalang:'界司马朗', - re_simalang_prefix:'界', - requji:'去疾', - requji_info:'出牌阶段限一次,你可以弃置至多X张牌并令等量名角色回复1点体力,然后仍处于受伤状态的目标角色摸一张牌,若你以此法弃置了黑色牌,你失去1点体力(X为你已损失的体力值)。', - rejunbing:'郡兵', - rejunbing_info:'一名角色的结束阶段,若其手牌数小于其体力值,其可以摸一张牌并将所有手牌交给你,然后你可以交给其等量的牌。', - re_zhugedan:'界诸葛诞', - re_zhugedan_prefix:'界', - regongao:'功獒', - regongao_info:'锁定技。一名其他角色首次进入濒死状态时,你增加1点体力上限,然后回复1点体力。', - rejuyi:'举义', - rejuyi_info:'觉醒技。准备阶段,若你已受伤,且你的体力上限大于场上的存活角色数,你将手牌数摸至体力上限,然后获得技能〖崩坏〗和〖威重〗。', - reweizhong:'威重', - reweizhong_info:'锁定技。当你的体力上限增加或减少时,你摸两张牌。', - re_zhongyao:'界钟繇', - re_zhongyao_prefix:'界', - rehuomo:'活墨', - rehuomo_info:'每种牌名每回合限一次。当你需要使用一张基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。', - zhoutai:'界周泰', - zhoutai_prefix:'界', - caoren:'界曹仁', - caoren_prefix:'界', - ollianhuan:'连环', - ollianhuan_info:'你可以将一张♣牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。', - re_lidian:'界李典', - gz_re_lidian:'李典', - re_lidian_prefix:'界', - re_xushu:'界徐庶', - re_xushu_prefix:'界', - rejianxiong_old:'奸雄', - rejianxiong_old_info:'当你受到伤害后,你可以摸一张牌或获得对你造成伤害的牌。', + repingkou: "平寇", + repingkou_info: + "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌。", + dc_liru: "界李儒", + dc_liru_prefix: "界", + dcmieji: "灭计", + dcmieji_info: + "出牌阶段限一次,你可以展示一张武器牌或黑色锦囊牌。你将此牌置于牌堆顶,然后令一名有手牌的其他角色选择一项:⒈弃置一张锦囊牌;⒉依次弃置两张非锦囊牌。", + dcfencheng: "焚城", + dcfencheng_info: + "限定技。出牌阶段,你可以指定一名其他角色,令从其开始的其他角色依次选择一项:⒈弃置至少X张牌(X为上一名角色弃置的牌数+1)。⒉你对其造成2点火焰伤害。", + oljiang: "激昂", + oljiang_info: + "①当你使用【决斗】或红色【杀】指定第一个目标后,或成为【决斗】或红色【杀】的目标后,你可以摸一张牌。②当有【决斗】或红色【杀】于每回合内首次因弃置而进入弃牌堆后,你可以失去1点体力并获得这些牌。", + re_xunyou: "界荀攸", + re_xunyou_prefix: "界", + reqice: "奇策", + reqice_info: "出牌阶段限X次(X为你的“奇策”数+1),你可以将所有手牌当做任意一张普通锦囊牌使用。", + rezhiyu: "智愚", + rezhiyu_info: + "当你受到伤害后,你可以摸一张牌,然后展示所有手牌,令伤害来源弃置一张手牌。若你展示的牌颜色均相同,你获得1枚“奇策”直到下回合结束且获得来源弃置的牌。", + re_caiyong: "界蔡邕", + re_caiyong_prefix: "界", + rebizhuan: "辟撰", + rebizhuan_bg: "书", + rebizhuan_info: + "①当你使用♠牌时,或成为其他角色使用♠牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”(你至多拥有四张“书”)。②你的手牌上限+X(X为“书”数)。", + retongbo: "通博", + retongbo_info: + "摸牌阶段结束时,你可以用任意手牌交换等量“书”。然后若“书”数至少为4,你可以将四张“书”任意交给其他角色。若你交出的牌花色各不相同,你回复1点体力且“书”的上限+1(至多增加等同存活角色数的上限)。", + re_chengong: "界陈宫", + re_chengong_prefix: "界", + remingce: "明策", + remingce_info: + "出牌阶段限一次。你可以将一张【杀】或装备牌交给一名其他角色,其选择一项:1.视为对你选择的另一名角色使用一张【杀】,且若此牌造成伤害,则执行选项2;2.你与其各摸一张牌。", + re_sundeng: "界孙登", + re_sundeng_prefix: "界", + rekuangbi: "匡弼", + rekuangbi_info: + "出牌阶段开始时,你可以令一名其他角色将至多三张牌置于你的武将牌上直到此阶段结束。然后当你使用牌时,若你:有与此牌花色相同的“匡弼”牌,你移去其中一张并与其各摸一张牌;没有与此牌花色相同的“匡弼”牌,你随机移去一张“匡弼”牌并摸一张牌。", + dc_chenqun: "界陈群", + dc_chenqun_prefix: "界", + repindi: "品第", + repindi_info: + "出牌阶段每名角色限一次。你可以弃置一张本阶段未以此法弃置过的类型的牌并选择一名角色,你选择一项:1.其摸X张牌;2.其弃置X张牌(X为你本回合发动〖品第〗的次数)。然后若其已受伤,你横置或重置。", + re_mazhong: "界马忠", + re_mazhong_prefix: "界", + refuman: "抚蛮", + refuman_info: + "出牌阶段每名角色限一次。你可以弃置一张牌,令一名其他角色从弃牌堆中获得一张【杀】。然后其于其下个回合结束前使用或打出此牌时,你与其各摸一张牌。", + re_guanzhang: "界关兴张苞", + re_guanzhang_prefix: "界", + retongxin: "同心", + retongxin_info: "锁定技。你的攻击范围+2。", + re_wenpin: "界文聘", + re_wenpin_prefix: "界", + rezhenwei: "镇卫", + rezhenwei_info: + "当一名其他角色成为【杀】或黑色锦囊牌的目标时,若该角色的体力值不大于你且此牌的目标角色数为1,你可以弃置一张牌并选择一项:1.摸一张牌,然后将此【杀】或黑色锦囊牌的目标转移给你;2.令此【杀】或黑色锦囊牌无效且将此【杀】或黑色锦囊牌置于使用者的武将牌上,然后当前回合结束后,使用者获得这些牌。", + ol_huangzhong: "界黄忠", + ol_huangzhong_prefix: "界", + remoshi: "没矢", + remoshi_info: + "锁定技。①当你使用【杀】对目标角色造成伤害后,若其装备区里有防具牌或坐骑牌,你将此【杀】对应的实体牌置于其武将牌上。②当有“没矢”牌的角色失去防具牌或坐骑牌后,你获得其“没矢”牌。", + dc_caozhi: "界曹植", + dc_caozhi_prefix: "界", + dcjiushi: "酒诗", + dcjiushi_info: + "①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌于受到伤害时背面向上,你可以翻面。③当你使用【酒】后,你使用【杀】的次数上限+1直到你的下个回合结束。", + olhuoji: "火计", + olhuoji_info: + "①你可以将一张红色牌当【火攻】使用。②你使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。", + olkanpo: "看破", + olkanpo_info: "①你可以将一张黑色牌当【无懈可击】使用。②你使用的【无懈可击】不可被响应。", + xinwangxi: "忘隙", + xinwangxi_info: + "当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其一张牌。", + ol_yanwen: "界颜良文丑", + ol_yanwen_prefix: "界", + olshuangxiong: "双雄", + olshuangxiong_info: + "①摸牌阶段结束时,你可以弃置一张牌。若如此做,你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用。②结束阶段,你从弃牌堆中获得本回合内对你造成伤害的所有牌。", + re_zhuzhi: "界朱治", + re_zhuzhi_prefix: "界", + reanguo: "安国", + reanguo_info: + "出牌阶段限一次。你可以选择一名其他角色,若其:手牌数为全场最少,其摸一张牌;体力值为全场最低,其回复1点体力;装备区内牌数为全场最少,其随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。若你与其执行了全部分支,你可以重铸任意张牌。", + dcyicong: "义从", + dcyicong_info: + "锁定技。①你至其他角色的距离-1。②若你已损失的体力值不小于2,则其他角色至你的距离+1。", + re_zhangsong: "界张松", + re_zhangsong_prefix: "界", + rexiantu: "献图", + rexiantu_info: + "其他角色的出牌阶段开始时,你可以摸两张牌,然后将两张牌交给该角色。然后此阶段结束时,若其于此阶段没有造成过伤害,你失去1点体力。", + re_jsp_huangyueying: "界SP黄月英", + re_jsp_huangyueying_prefix: "界SP", + rejiqiao: "机巧", + rejiqiao_info: + "出牌阶段开始时,你可以弃置任意张牌,然后亮出牌堆顶X张牌(X为你以此法弃置的牌数与其中装备牌数之和),你获得其中所有非装备牌。", + relinglong: "玲珑", + relinglong_info: + "锁定技。若你的装备区:有空置的防具栏,你视为拥有〖八卦阵〗;有空置的两种坐骑栏,你的手牌上限+2;有空置的宝物栏,你视为拥有〖奇才〗;以上均满足:你使用的【杀】或普通锦囊牌不可被响应。", + ol_zhangzhang: "界张昭张纮", + ol_zhangzhang_prefix: "界", + olzhijian: "直谏", + olzhijian_info: + "出牌阶段,你可以将一张装备牌置于其他角色的装备区(可替换原装备),然后摸一张牌。", + olguzheng: "固政", + olguzheng_info: + "每阶段限一次。当其他角色的至少两张牌因弃置而进入弃牌堆后,你可以令其获得其中一张牌,然后你可以获得剩余的牌。", + re_caochong: "界曹冲", + re_caochong_prefix: "界", + rechengxiang: "称象", + rechengxiang_info: + "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。若你得到的牌点数之和为13,你复原武将牌。", + re_caorui: "界曹叡", + re_caorui_prefix: "界", + remingjian: "明鉴", + remingjian_info: + "出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合获得如下效果:1.手牌上限与使用【杀】的次数上限+1;2.当该角色首次造成伤害后,其可以令你发动一次〖恢拓〗。", + rexingshuai: "兴衰", + rexingshuai_info: + "主公技,限定技。当你进入濒死状态时,你可令其他魏势力角色依次选择是否令你回复1点体力。然后这些角色依次受到1点伤害。有〖明鉴〗效果的角色于其回合内杀死角色后,你重置〖兴衰〗。", + xin_zhangliang: "界张梁", + xin_zhangliang_prefix: "界", + rejijun: "集军", + rejijun_info: + "当你使用目标角色含有自己的牌结算完毕后,你可以进行一次判定并将判定牌置于武将牌上,称为“方”。", + refangtong: "方统", + refangtong_info: + "结束阶段,你可以将一张手牌置于武将牌上,称为“方”。若如此做,你可以移去任意张“方”并对一名其他角色造成1点雷属性伤害(若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害)。", + re_simalang: "界司马朗", + re_simalang_prefix: "界", + requji: "去疾", + requji_info: + "出牌阶段限一次,你可以弃置至多X张牌并令等量名角色回复1点体力,然后仍处于受伤状态的目标角色摸一张牌,若你以此法弃置了黑色牌,你失去1点体力(X为你已损失的体力值)。", + rejunbing: "郡兵", + rejunbing_info: + "一名角色的结束阶段,若其手牌数小于其体力值,其可以摸一张牌并将所有手牌交给你,然后你可以交给其等量的牌。", + re_zhugedan: "界诸葛诞", + re_zhugedan_prefix: "界", + regongao: "功獒", + regongao_info: "锁定技。一名其他角色首次进入濒死状态时,你增加1点体力上限,然后回复1点体力。", + rejuyi: "举义", + rejuyi_info: + "觉醒技。准备阶段,若你已受伤,且你的体力上限大于场上的存活角色数,你将手牌数摸至体力上限,然后获得技能〖崩坏〗和〖威重〗。", + reweizhong: "威重", + reweizhong_info: "锁定技。当你的体力上限增加或减少时,你摸两张牌。", + re_zhongyao: "界钟繇", + re_zhongyao_prefix: "界", + rehuomo: "活墨", + rehuomo_info: + "每种牌名每回合限一次。当你需要使用一张基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。", + zhoutai: "界周泰", + zhoutai_prefix: "界", + caoren: "界曹仁", + caoren_prefix: "界", + ollianhuan: "连环", + ollianhuan_info: + "你可以将一张♣牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。", + re_lidian: "界李典", + gz_re_lidian: "李典", + re_lidian_prefix: "界", + re_xushu: "界徐庶", + re_xushu_prefix: "界", + rejianxiong_old: "奸雄", + rejianxiong_old_info: "当你受到伤害后,你可以摸一张牌或获得对你造成伤害的牌。", - refresh_standard:'界限突破·标', - refresh_feng:'界限突破·风', - refresh_huo:'界限突破·火', - refresh_lin:'界限突破·林', - refresh_shan:'界限突破·山', - refresh_yijiang1:'界限突破·将1', - refresh_yijiang2:'界限突破·将2', - refresh_yijiang3:'界限突破·将3', - refresh_yijiang4:'界限突破·将4', - refresh_yijiang5:'界限突破·将5', - refresh_yijiang6:'界限突破·原6', - refresh_xinghuo:'界限突破·星火', + refresh_standard: "界限突破·标", + refresh_feng: "界限突破·风", + refresh_huo: "界限突破·火", + refresh_lin: "界限突破·林", + refresh_shan: "界限突破·山", + refresh_yijiang1: "界限突破·将1", + refresh_yijiang2: "界限突破·将2", + refresh_yijiang3: "界限突破·将3", + refresh_yijiang4: "界限突破·将4", + refresh_yijiang5: "界限突破·将5", + refresh_yijiang6: "界限突破·原6", + refresh_xinghuo: "界限突破·星火", }, }; }); diff --git a/character/sb.js b/character/sb.js index e40fc1aff..7c44eed31 100644 --- a/character/sb.js +++ b/character/sb.js @@ -1,136 +1,196 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { //strategy and battle, "sb" in short - name:'sb', - connect:true, - character:{ - sb_gaoshun:['male','qun',4,['sbxianzhen','sbjinjiu']], - sb_xiahoudun:['male','wei',4,['sbganglie','sbqingjian']], - sb_xunyu:['male','wei',3,['sbquhu','sbjieming']], - sb_caopi:['male','wei',3,['sbxingshang','sbfangzhu','sbsongwei'],['zhu']], - sb_guanyu:['male','shu',4,['sbwusheng','sbyijue']], - sb_huangyueying:['female','shu',3,['sbjizhi','sbqicai']], - sb_sp_zhugeliang:['male','shu',3,['sbhuoji','sbkanpo']], - sb_zhanghe:['male','wei',4,['sbqiaobian']], - sb_yujin:['male','wei',4,['sbxiayuan','sbjieyue']], - sb_huaxiong:['male','qun','3/4/1',['new_reyaowu','sbyangwei']], - liucheng:['female','qun',3,['splveying','spyingwu']], - sp_yangwan:['female','qun',3,['spmingxuan','spxianchou']], - sb_huangzhong:['male','shu',4,['sbliegong']], - sb_lvmeng:['male','wu',4,['sbkeji','sbdujiang']], - sb_sunshangxiang:['female','shu',4,['sbjieyin','sbliangzhu','sbxiaoji'],['border:wu']], - sb_sunquan:['male','wu',4,['sbzhiheng','sbtongye','sbjiuyuan'],['zhu']], - sb_huanggai:['male','wu',4,['sbkurou','sbzhaxiang']], - sb_zhouyu:['male','wu',3,['sbyingzi','sbfanjian']], - sb_caoren:['male','wei','4/4/1',['sbjushou','sbjiewei']], - sb_xiahoushi:['female','shu',3,['sbqiaoshi','sbyanyu']], - sb_zhangjiao:['male','qun',3,['sbleiji','sbguidao','sbhuangtian'],['zhu']], - sb_caocao:['male','wei',4,['sbjianxiong','sbqingzheng','sbhujia'],['zhu']], - sb_zhenji:['female','wei',3,['sbluoshen','qingguo']], - sb_ganning:['male','wu',4,['sbqixi','sbfenwei']], - sb_machao:['male','shu',4,['mashu','sbtieji']], - sb_xuhuang:['male','wei',4,['sbduanliang','sbshipo']], - sb_zhangfei:['male','shu',4,['sbpaoxiao','sbxieji']], - sb_zhaoyun:['male','shu',4,['sblongdan','sbjizhu']], - sb_liubei:['male','shu',4,['sbrende','sbzhangwu','sbjijiang'],['zhu']], - sb_jiangwei:['male','shu','4/4/1',['sbtiaoxin','sbzhiji']], - sb_fazheng:['male','shu',3,['sbxuanhuo','sbenyuan']], - sb_chengong:['male','qun',3,['sbmingce','sbzhichi']], - sb_diaochan:['female','qun',3,['sblijian','sbbiyue']], - sb_yuanshao:['male','qun',4,['sbluanji','sbxueyi'],['zhu']], - sb_pangtong:['male','shu',3,['sblianhuan','sbniepan']], - sb_sunce:['male','wu',4,['sbjiang','sbhunzi','sbzhiba'],['zhu']], - sb_daqiao:['female','wu',3,['sbguose','sbliuli']], - sb_liubiao:['male','qun',3,['sbzishou','sbzongshi']], - sb_zhurong:['female','shu',4,['sblieren','sbjuxiang']], - sb_menghuo:['male','shu',4,['sbhuoshou','sbzaiqi']], - sb_yl_luzhi:['male','qun',3,['nzry_mingren','sbzhenliang']], - sb_xiaoqiao:['female','wu',3,['sbtianxiang','xinhongyan']], + name: "sb", + connect: true, + character: { + sb_gaoshun: ["male", "qun", 4, ["sbxianzhen", "sbjinjiu"]], + sb_xiahoudun: ["male", "wei", 4, ["sbganglie", "sbqingjian"]], + sb_xunyu: ["male", "wei", 3, ["sbquhu", "sbjieming"]], + sb_caopi: ["male", "wei", 3, ["sbxingshang", "sbfangzhu", "sbsongwei"], ["zhu"]], + sb_guanyu: ["male", "shu", 4, ["sbwusheng", "sbyijue"]], + sb_huangyueying: ["female", "shu", 3, ["sbjizhi", "sbqicai"]], + sb_sp_zhugeliang: ["male", "shu", 3, ["sbhuoji", "sbkanpo"]], + sb_zhanghe: ["male", "wei", 4, ["sbqiaobian"]], + sb_yujin: ["male", "wei", 4, ["sbxiayuan", "sbjieyue"]], + sb_huaxiong: ["male", "qun", "3/4/1", ["new_reyaowu", "sbyangwei"]], + liucheng: ["female", "qun", 3, ["splveying", "spyingwu"]], + sp_yangwan: ["female", "qun", 3, ["spmingxuan", "spxianchou"]], + sb_huangzhong: ["male", "shu", 4, ["sbliegong"]], + sb_lvmeng: ["male", "wu", 4, ["sbkeji", "sbdujiang"]], + sb_sunshangxiang: ["female", "shu", 4, ["sbjieyin", "sbliangzhu", "sbxiaoji"], ["border:wu"]], + sb_sunquan: ["male", "wu", 4, ["sbzhiheng", "sbtongye", "sbjiuyuan"], ["zhu"]], + sb_huanggai: ["male", "wu", 4, ["sbkurou", "sbzhaxiang"]], + sb_zhouyu: ["male", "wu", 3, ["sbyingzi", "sbfanjian"]], + sb_caoren: ["male", "wei", "4/4/1", ["sbjushou", "sbjiewei"]], + sb_xiahoushi: ["female", "shu", 3, ["sbqiaoshi", "sbyanyu"]], + sb_zhangjiao: ["male", "qun", 3, ["sbleiji", "sbguidao", "sbhuangtian"], ["zhu"]], + sb_caocao: ["male", "wei", 4, ["sbjianxiong", "sbqingzheng", "sbhujia"], ["zhu"]], + sb_zhenji: ["female", "wei", 3, ["sbluoshen", "qingguo"]], + sb_ganning: ["male", "wu", 4, ["sbqixi", "sbfenwei"]], + sb_machao: ["male", "shu", 4, ["mashu", "sbtieji"]], + sb_xuhuang: ["male", "wei", 4, ["sbduanliang", "sbshipo"]], + sb_zhangfei: ["male", "shu", 4, ["sbpaoxiao", "sbxieji"]], + sb_zhaoyun: ["male", "shu", 4, ["sblongdan", "sbjizhu"]], + sb_liubei: ["male", "shu", 4, ["sbrende", "sbzhangwu", "sbjijiang"], ["zhu"]], + sb_jiangwei: ["male", "shu", "4/4/1", ["sbtiaoxin", "sbzhiji"]], + sb_fazheng: ["male", "shu", 3, ["sbxuanhuo", "sbenyuan"]], + sb_chengong: ["male", "qun", 3, ["sbmingce", "sbzhichi"]], + sb_diaochan: ["female", "qun", 3, ["sblijian", "sbbiyue"]], + sb_yuanshao: ["male", "qun", 4, ["sbluanji", "sbxueyi"], ["zhu"]], + sb_pangtong: ["male", "shu", 3, ["sblianhuan", "sbniepan"]], + sb_sunce: ["male", "wu", 4, ["sbjiang", "sbhunzi", "sbzhiba"], ["zhu"]], + sb_daqiao: ["female", "wu", 3, ["sbguose", "sbliuli"]], + sb_liubiao: ["male", "qun", 3, ["sbzishou", "sbzongshi"]], + sb_zhurong: ["female", "shu", 4, ["sblieren", "sbjuxiang"]], + sb_menghuo: ["male", "shu", 4, ["sbhuoshou", "sbzaiqi"]], + sb_yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "sbzhenliang"]], + sb_xiaoqiao: ["female", "wu", 3, ["sbtianxiang", "xinhongyan"]], }, - characterSort:{ - sb:{ - sb_zhi:['sb_sunquan','sb_zhouyu','sb_zhangjiao','sb_caocao','sb_zhenji','sb_liubei','sb_daqiao','sb_liubiao','sb_sp_zhugeliang','sb_xunyu'], - sb_shi:['sb_xuhuang','sb_machao','sb_fazheng','sb_chengong','sb_diaochan','sb_pangtong','sb_zhanghe','sb_caopi'], - sb_tong:['liucheng','sp_yangwan','sb_xiahoushi','sb_zhangfei','sb_zhaoyun','sb_sunce','sb_zhurong','sb_xiaoqiao','sb_xiahoudun'], - sb_yu:['sb_yujin','sb_lvmeng','sb_huangzhong','sb_huanggai','sb_zhouyu','sb_caoren','sb_ganning','sb_yl_luzhi','sb_huangyueying'], - sb_neng:['sb_huaxiong','sb_sunshangxiang','sb_jiangwei','sb_yuanshao','sb_menghuo','sb_guanyu','sb_gaoshun'], + characterSort: { + sb: { + sb_zhi: [ + "sb_sunquan", + "sb_zhouyu", + "sb_zhangjiao", + "sb_caocao", + "sb_zhenji", + "sb_liubei", + "sb_daqiao", + "sb_liubiao", + "sb_sp_zhugeliang", + "sb_xunyu", + ], + sb_shi: [ + "sb_xuhuang", + "sb_machao", + "sb_fazheng", + "sb_chengong", + "sb_diaochan", + "sb_pangtong", + "sb_zhanghe", + "sb_caopi", + ], + sb_tong: [ + "liucheng", + "sp_yangwan", + "sb_xiahoushi", + "sb_zhangfei", + "sb_zhaoyun", + "sb_sunce", + "sb_zhurong", + "sb_xiaoqiao", + "sb_xiahoudun", + ], + sb_yu: [ + "sb_yujin", + "sb_lvmeng", + "sb_huangzhong", + "sb_huanggai", + "sb_zhouyu", + "sb_caoren", + "sb_ganning", + "sb_yl_luzhi", + "sb_huangyueying", + ], + sb_neng: [ + "sb_huaxiong", + "sb_sunshangxiang", + "sb_jiangwei", + "sb_yuanshao", + "sb_menghuo", + "sb_guanyu", + "sb_gaoshun", + ], // sb_waitforsort:[], - } + }, }, - characterSubstitute:{ - sb_sp_zhugeliang:[ - ], + characterSubstitute: { + sb_sp_zhugeliang: [], }, - skill:{ + skill: { //高顺 - sbxianzhen:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget(card,player,target){ - return target!==player; + sbxianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget(card, player, target) { + return target !== player; }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = event.targets[0]; - player.addTempSkill('sbxianzhen_attack', 'phaseUseAfter'); - player.markAuto('sbxianzhen_attack',target); + player.addTempSkill("sbxianzhen_attack", "phaseUseAfter"); + player.markAuto("sbxianzhen_attack", target); }, - ai:{ + ai: { expose: 0.2, - order(item,player){ - return get.order({ name: 'sha' }) + 1; + order(item, player) { + return get.order({ name: "sha" }) + 1; }, - result:{ - target(player,target){ - if (!player.countCards('hs', card => { - return get.name(card) === 'sha' && player.canUse(card, target, false); - })) return -0.1; - if (target.countCards('h') === 1 && player.canCompare(target)) return -2; + result: { + target(player, target) { + if ( + !player.countCards("hs", (card) => { + return get.name(card) === "sha" && player.canUse(card, target, false); + }) + ) + return -0.1; + if (target.countCards("h") === 1 && player.canCompare(target)) return -2; return -1.5; }, - } + }, }, - subSkill:{ - attack:{ - audio:'sbxianzhen', - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if (event.card.name !== 'sha') return false; - return player.getStorage('sbxianzhen_attack').includes(event.target) && event.target.isIn() && player.canCompare(event.target); + subSkill: { + attack: { + audio: "sbxianzhen", + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (event.card.name !== "sha") return false; + return ( + player.getStorage("sbxianzhen_attack").includes(event.target) && + event.target.isIn() && + player.canCompare(event.target) + ); }, - charlotte:true, - onremove:true, - logTarget:'target', - check(event,player){ + charlotte: true, + onremove: true, + logTarget: "target", + check(event, player) { return get.attitude(player, event.target) < 0; }, - prompt(event,player){ - return `陷阵:是否与${get.translation(event.target)}拼点?` + prompt(event, player) { + return `陷阵:是否与${get.translation(event.target)}拼点?`; }, - prompt2(event,player){ - const target = event.target, card = event.card; - return `若你赢,${get.translation(card)}无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;
    若其拼点牌为【杀】,则你获得之;
    若其拼点牌为其最后的手牌,则${get.translation(card)}对其造成伤害时,此伤害+1。` + prompt2(event, player) { + const target = event.target, + card = event.card; + return `若你赢,${get.translation( + card + )}无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;
    若其拼点牌为【杀】,则你获得之;
    若其拼点牌为其最后的手牌,则${get.translation( + card + )}对其造成伤害时,此伤害+1。`; }, - group:'sbxianzhen_record', - async content(event,trigger,player){ - const target = trigger.target, card = trigger.card; + group: "sbxianzhen_record", + async content(event, trigger, player) { + const target = trigger.target, + card = trigger.card; const next = player.chooseToCompare(target); let result = await next.forResult(); if (result.bool) { - target.addTempSkill('qinggang2'); + target.addTempSkill("qinggang2"); target.storage.qinggang2.add(card); if (trigger.addCount !== false) { trigger.addCount = false; - const stat = player.getStat('card'); + const stat = player.getStat("card"); if (stat[card.name] && stat[card.name] > 0) stat[card.name]--; } - game.log(card, '无视防具且不计入次数限制'); + game.log(card, "无视防具且不计入次数限制"); if (!player.storage.sbxianzhen_damaged) { player.storage.sbxianzhen_damaged = true; - player.when('phaseAfter').then(() => { + player.when("phaseAfter").then(() => { delete player.storage.sbxianzhen_damaged; - }) + }); await target.damage(); await game.asyncDelayx(); } @@ -141,227 +201,285 @@ game.import('character', function () { if (!Array.isArray(cards)) cards = [cards]; if (comparer === player) continue; for (const card of cards) { - if (get.name(card, comparer) == 'sha' && get.position(card, true) == 'd') { + if ( + get.name(card, comparer) == "sha" && + get.position(card, true) == "d" + ) { toGain.push(card); } } } - if (toGain.length) await player.gain(toGain, 'gain2'); - if (player.getStorage('sbxianzhen_recorded').includes(target)) { + if (toGain.length) await player.gain(toGain, "gain2"); + if (player.getStorage("sbxianzhen_recorded").includes(target)) { const id = target.playerid; const map = trigger.getParent().customArgs; if (!map[id]) map[id] = {}; - if (typeof map[id].extraDamage != 'number') { + if (typeof map[id].extraDamage != "number") { map[id].extraDamage = 0; } map[id].extraDamage++; - game.log(card, '对', target, '造成的伤害+1'); + game.log(card, "对", target, "造成的伤害+1"); } }, - intro:{ - content:'本阶段对$使用牌无距离限制,且使用杀指定其为目标后可以与其拼点', + intro: { + content: "本阶段对$使用牌无距离限制,且使用杀指定其为目标后可以与其拼点", }, - mod:{ - targetInRange(card,player,target){ - if(player.getStorage('sbxianzhen_attack').includes(target)) return true; + mod: { + targetInRange(card, player, target) { + if (player.getStorage("sbxianzhen_attack").includes(target)) return true; }, - } - }, - record:{ - trigger:{ - global:'loseAsyncEnd', }, - charlotte:true, - silent:true, - filter(event,player){ - if(event.getParent(2).name !== 'sbxianzhen_attack') return false; - return game.hasPlayer(current => { - if (current.countCards('h')) return false; + }, + record: { + trigger: { + global: "loseAsyncEnd", + }, + charlotte: true, + silent: true, + filter(event, player) { + if (event.getParent(2).name !== "sbxianzhen_attack") return false; + return game.hasPlayer((current) => { + if (current.countCards("h")) return false; const evt = event.getl(current); return evt && evt.hs && evt.hs.length; }); }, - async content(event,trigger,player){ + async content(event, trigger, player) { const targets = []; - game.countPlayer(current => { - if (current.countCards('h')) return false; + game.countPlayer((current) => { + if (current.countCards("h")) return false; const evt = trigger.getl(current); - if(evt && evt.hs && evt.hs.length) targets.add(current); + if (evt && evt.hs && evt.hs.length) targets.add(current); }); if (!player.storage.sbxianzhen_recorded) { - player.when('sbxianzhen_attackAfter').then(() => { + player.when("sbxianzhen_attackAfter").then(() => { delete player.storage.sbxianzhen_recorded; - }) + }); } - player.markAuto('sbxianzhen_recorded', targets); + player.markAuto("sbxianzhen_recorded", targets); }, }, - } + }, }, - sbjinjiu:{ - audio:2, - inherit:'rejinjiu', - group:['sbjinjiu_decrease','sbjinjiu_compare'], - global:'sbjinjiu_global', - subSkill:{ - decrease:{ - audio:'sbjinjiu', - forced:true, - trigger:{player:'damageBegin4'}, - filter(event,player){ + sbjinjiu: { + audio: 2, + inherit: "rejinjiu", + group: ["sbjinjiu_decrease", "sbjinjiu_compare"], + global: "sbjinjiu_global", + subSkill: { + decrease: { + audio: "sbjinjiu", + forced: true, + trigger: { player: "damageBegin4" }, + filter(event, player) { return event.getParent(2).jiu; }, - async content(event,trigger){ + async content(event, trigger) { trigger.num = 1; }, - ai:{ - filterDamage:true, - skillTagFilter(player,tag,arg){ - return arg&&arg.jiu; + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + return arg && arg.jiu; }, }, }, - global:{ - mod:{ - cardEnabled(card,player){ - if(card.name=='jiu'&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('sbjinjiu')) return false; + global: { + mod: { + cardEnabled(card, player) { + if ( + card.name == "jiu" && + _status.currentPhase && + _status.currentPhase != player && + _status.currentPhase.hasSkill("sbjinjiu") + ) + return false; }, - cardSavable(card,player){ - if(card.name=='jiu'&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('sbjinjiu')) return false; + cardSavable(card, player) { + if ( + card.name == "jiu" && + _status.currentPhase && + _status.currentPhase != player && + _status.currentPhase.hasSkill("sbjinjiu") + ) + return false; }, }, }, - compare:{ - trigger:{ - global:'compare', + compare: { + trigger: { + global: "compare", }, - filter(event,player){ + filter(event, player) { const participant = [event.player]; - if(event.targets) participant.addArray(event.targets); + if (event.targets) participant.addArray(event.targets); else participant.add(event.target); if (!participant.includes(player)) return false; - if (event.player !== player && event.card1 && event.card1.name === 'jiu') return true; - if (event.target !== player && event.card2 && event.card2.name === 'jiu') return true; + if (event.player !== player && event.card1 && event.card1.name === "jiu") + return true; + if (event.target !== player && event.card2 && event.card2.name === "jiu") + return true; return false; }, - forced:true, - direct:true, - async content(event,trigger,player){ - for (const [role, ind] of [['player',1], ['target',2]]){ - const current = trigger[role], card = trigger[`card${ind}`]; - if (current !== player && card && card.name === 'jiu') { - await player.logSkill('sbjinjiu_compare', current); - game.log(current, '拼点牌点数视为','#yA'); + forced: true, + direct: true, + async content(event, trigger, player) { + for (const [role, ind] of [ + ["player", 1], + ["target", 2], + ]) { + const current = trigger[role], + card = trigger[`card${ind}`]; + if (current !== player && card && card.name === "jiu") { + await player.logSkill("sbjinjiu_compare", current); + game.log(current, "拼点牌点数视为", "#yA"); trigger[`num${ind}`] = 1; } } - } + }, }, }, }, //夏侯惇 - sbganglie:{ - audio:2, - enable:'phaseUse', - filter(event,player){ + sbganglie: { + audio: 2, + enable: "phaseUse", + filter(event, player) { if (!event.sbganglie_enabledTargets) return false; - return game.hasPlayer(current=>{ - return lib.skill.sbganglie.filterTarget(null,player,current); + return game.hasPlayer((current) => { + return lib.skill.sbganglie.filterTarget(null, player, current); }); }, - onChooseToUse(event){ - if (game.online || event.type !== 'phase') return; + onChooseToUse(event) { + if (game.online || event.type !== "phase") return; const player = event.player; - const chosen = player.getAllHistory('useSkill', evt => evt.skill === 'sbganglie').map(evt => { - return evt.targets; - }).flat(); - const targets = player.getAllHistory('damage', evt => evt.source && evt.source.isIn()).map(evt => evt.source).unique(); + const chosen = player + .getAllHistory("useSkill", (evt) => evt.skill === "sbganglie") + .map((evt) => { + return evt.targets; + }) + .flat(); + const targets = player + .getAllHistory("damage", (evt) => evt.source && evt.source.isIn()) + .map((evt) => evt.source) + .unique(); targets.removeArray(chosen); - event.set('sbganglie_enabledTargets',targets); + event.set("sbganglie_enabledTargets", targets); }, - filterTarget(card,player,target){ - return get.event('sbganglie_enabledTargets').includes(target); + filterTarget(card, player, target) { + return get.event("sbganglie_enabledTargets").includes(target); }, - async content(event,trigger,player){ + async content(event, trigger, player) { event.targets[0].damage(2); }, - ai:{ - order:6, - result:{ - target:-2, - } + ai: { + order: 6, + result: { + target: -2, + }, }, }, - sbqingjian:{ - audio:2, - trigger:{ - global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter'], + sbqingjian: { + audio: 2, + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], }, - forced:true, - locked:false, - filter(event,player){ - if (player.getExpansions('sbqingjian').length >= Math.max(1, player.getHp() - 1)) return false; - if (event.name !== 'cardsDiscard') { + forced: true, + locked: false, + filter(event, player) { + if (player.getExpansions("sbqingjian").length >= Math.max(1, player.getHp() - 1)) + return false; + if (event.name !== "cardsDiscard") { if (event.position !== ui.discardPile) return false; - if (!game.hasPlayer(current => { - const evt = event.getl(current); - return evt.cards && evt.cards.length > 0; - })) return false; - } - else{ + if ( + !game.hasPlayer((current) => { + const evt = event.getl(current); + return evt.cards && evt.cards.length > 0; + }) + ) + return false; + } else { const evt = event.getParent(); - if (evt.relatedEvent && evt.relatedEvent.name === 'useCard') return false; + if (evt.relatedEvent && evt.relatedEvent.name === "useCard") return false; } return true; }, - group:'sbqingjian_give', - async content(event,trigger,player){ + group: "sbqingjian_give", + async content(event, trigger, player) { let cards = trigger.cards.slice(); const maxNum = Math.max(1, player.getHp() - 1); - const myLen = player.getExpansions('sbqingjian').length, cardsLen = trigger.cards.length; + const myLen = player.getExpansions("sbqingjian").length, + cardsLen = trigger.cards.length; const overflow = myLen + cardsLen - maxNum; if (overflow > 0) cards.randomRemove(overflow); - const next = player.addToExpansion(cards, 'gain2'); - next.gaintag.add('sbqingjian'); + const next = player.addToExpansion(cards, "gain2"); + next.gaintag.add("sbqingjian"); await next; }, - marktext:'俭', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "俭", + intro: { + content: "expansion", + markcount: "expansion", }, - subSkill:{ - give:{ - audio:'sbqingjian', - trigger:{player:'phaseUseEnd'}, - filter(event,player){ - return player.getExpansions('sbqingjian').length > 0; + subSkill: { + give: { + audio: "sbqingjian", + trigger: { player: "phaseUseEnd" }, + filter(event, player) { + return player.getExpansions("sbqingjian").length > 0; }, - forced:true, - locked:false, - async content(event,trigger,player){ - if (_status.connectMode) game.broadcastAll(() => { _status.noclearcountdown = true }); + forced: true, + locked: false, + async content(event, trigger, player) { + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; + }); const given_map = {}; event.given_map = given_map; - const expansions = player.getExpansions('sbqingjian'); + const expansions = player.getExpansions("sbqingjian"); let result; while (true) { if (expansions.length > 1) { - result = await player.chooseCardButton('清俭:请选择要分配的牌', true, expansions, [1, expansions.length]).set('ai', button => { - if (ui.selected.buttons.length) return 0; - return get.value(button.link, get.player()); - }).forResult(); - } - else if (expansions.length === 1) result = { bool: true, links: expansions.slice(0) }; + result = await player + .chooseCardButton("清俭:请选择要分配的牌", true, expansions, [ + 1, + expansions.length, + ]) + .set("ai", (button) => { + if (ui.selected.buttons.length) return 0; + return get.value(button.link, get.player()); + }) + .forResult(); + } else if (expansions.length === 1) + result = { bool: true, links: expansions.slice(0) }; else return; if (!result.bool) return; const toGive = result.links; - result = await player.chooseTarget(`选择一名角色获得${get.translation(toGive)}`, expansions.length === 1).set('ai', target => { - const att = get.attitude(get.player(), target); - if (get.event('toEnemy')) return Math.max(0.01, 100 - att); - else if (att > 0) return Math.max(0.1, att / Math.sqrt(1 + target.countCards('h') + (get.event().getParent().given_map[target.playerid] || 0))); - else return Math.max(0.01, (100 + att) / 200); - }).set('toEnemy', get.value(toGive[0], player, 'raw') < 0).forResult(); + result = await player + .chooseTarget( + `选择一名角色获得${get.translation(toGive)}`, + expansions.length === 1 + ) + .set("ai", (target) => { + const att = get.attitude(get.player(), target); + if (get.event("toEnemy")) return Math.max(0.01, 100 - att); + else if (att > 0) + return Math.max( + 0.1, + att / + Math.sqrt( + 1 + + target.countCards("h") + + (get.event().getParent().given_map[ + target.playerid + ] || 0) + ) + ); + else return Math.max(0.01, (100 + att) / 200); + }) + .set("toEnemy", get.value(toGive[0], player, "raw") < 0) + .forResult(); if (result.bool) { expansions.removeArray(toGive); if (result.targets.length) { @@ -372,166 +490,197 @@ game.import('character', function () { if (!expansions.length) break; } } - if (_status.connectMode) game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose() }); + if (_status.connectMode) + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); const gain_list = []; for (const i in given_map) { const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; - player.line(source, 'green'); + player.line(source, "green"); gain_list.push([source, given_map[i]]); - game.log(source, '获得了', given_map[i]); + game.log(source, "获得了", given_map[i]); } - await game.loseAsync({ - gain_list, - giver: player, - animate: 'gain2', - }).setContent('gaincardMultiple'); - } + await game + .loseAsync({ + gain_list, + giver: player, + animate: "gain2", + }) + .setContent("gaincardMultiple"); + }, }, }, }, //荀彧 - sbquhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filter(event,player){ - return game.countPlayer(current=>lib.skill.sbquhu.filterTarget(null,player,current))>1; + sbquhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return ( + game.countPlayer((current) => lib.skill.sbquhu.filterTarget(null, player, current)) > + 1 + ); }, - filterTarget(card,player,target){ - return player!=target&&target.countCards('he')>0; + filterTarget(card, player, target) { + return player != target && target.countCards("he") > 0; }, - selectTarget:2, - multitarget:true, - multiline:true, - async content(event,trigger,player){ - const targets=[player].addArray(event.targets); + selectTarget: 2, + multitarget: true, + multiline: true, + async content(event, trigger, player) { + const targets = [player].addArray(event.targets); targets.sortBySeat(); - const {result}=await player.chooseCardOL(targets,'he',[1,Infinity],true,'驱虎:请将任意张牌扣置于武将牌上').set('ai',card=>{ - const player=get.event().getParent(2).player; - let value=5; - if(get.player()==player) value-=0.5; - return value-get.useful(card); - }); - const lose_list=[]; - const map=new Map(); + const { result } = await player + .chooseCardOL(targets, "he", [1, Infinity], true, "驱虎:请将任意张牌扣置于武将牌上") + .set("ai", (card) => { + const player = get.event().getParent(2).player; + let value = 5; + if (get.player() == player) value -= 0.5; + return value - get.useful(card); + }); + const lose_list = []; + const map = new Map(); let myCards; - let minLength=Infinity; - for(let i=0;imyCards.length; - const sortedList=lose_list.filter(list=>list[0]!=player).sort((a,b)=>{ - return 1000*(b[1].length-a[1].length)+(get.distance(player,a[0],'absolute')-get.distance(player,b[0],'absolute')); - }); - const mostPlayer=sortedList[0][0],secondPlayer=sortedList[1][0]; - await new Promise(resolve=>{ - game.broadcastAll(lose_list=>{ - lose_list.forEach(list=>list[0].prompt(`${get.cnNumber(list[1].length)}张`,'wood')); - },lose_list); - setTimeout(()=>{ - game.broadcastAll(lose_list=>{ - lose_list.forEach(list=>list[0].unprompt()); - },lose_list); + const isMin = minLength > myCards.length; + const sortedList = lose_list + .filter((list) => list[0] != player) + .sort((a, b) => { + return ( + 1000 * (b[1].length - a[1].length) + + (get.distance(player, a[0], "absolute") - + get.distance(player, b[0], "absolute")) + ); + }); + const mostPlayer = sortedList[0][0], + secondPlayer = sortedList[1][0]; + await new Promise((resolve) => { + game.broadcastAll((lose_list) => { + lose_list.forEach((list) => + list[0].prompt(`${get.cnNumber(list[1].length)}张`, "wood") + ); + }, lose_list); + setTimeout(() => { + game.broadcastAll((lose_list) => { + lose_list.forEach((list) => list[0].unprompt()); + }, lose_list); resolve(); - },2000/(lib.config.speed=='vvfast'?3:1)); + }, 2000 / (lib.config.speed == "vvfast" ? 3 : 1)); }); - if(isMin){ - await mostPlayer.gain(myCards,'give',player); + if (isMin) { + await mostPlayer.gain(myCards, "give", player); await game.asyncDelay(); - const gain_list=lose_list.filter(list=>list[0]!=player); + const gain_list = lose_list.filter((list) => list[0] != player); game.loseAsync({ gain_list, - animate:'draw', - }).setContent('gaincardMultiple'); - } - else{ - mostPlayer.line(secondPlayer,'thunder'); + animate: "draw", + }).setContent("gaincardMultiple"); + } else { + mostPlayer.line(secondPlayer, "thunder"); await secondPlayer.damage(mostPlayer); await game.asyncDelay(); - await mostPlayer.gain(myCards,'give',player); + await mostPlayer.gain(myCards, "give", player); await game.asyncDelay(); - await game.loseAsync({ - lose_list:sortedList, - }).setContent(()=>{ - for(var i=0;i { + for (var i = 0; i < event.lose_list.length; i++) { + var current = event.lose_list[i][0], + cards = event.lose_list[i][1]; + var next = current.lose(cards, ui.discardPile); + current.$throw(cards); + game.log(current, "将", cards, "置入了弃牌堆"); + next.set("relatedEvent", event.getParent()); + next.set("getlx", false); + } + }); await game.asyncDelayx(); } }, - addToExpansionMultiple(){ - "step 0" - if(event.animate=='give') event.visible=true; - event.type='addToExpansion'; - if(!event.gaintag) event.gaintag=[]; - if(event.lose_list){ - var map={},map2={}; - for(var list of event.lose_list){ - var player=list[0],cards=list[1]; - var myId=player.playerid; - if(!map2[myId]) map2[myId]=[]; - for(var i of cards){ - var owner=get.owner(i,'judge'); - if(owner&&(owner!=player||get.position(i)!='x')){ - var id=owner.playerid; - if(!map[id]) map[id]=[[],[],[]]; + addToExpansionMultiple() { + "step 0"; + if (event.animate == "give") event.visible = true; + event.type = "addToExpansion"; + if (!event.gaintag) event.gaintag = []; + if (event.lose_list) { + var map = {}, + map2 = {}; + for (var list of event.lose_list) { + var player = list[0], + cards = list[1]; + var myId = player.playerid; + if (!map2[myId]) map2[myId] = []; + for (var i of cards) { + var owner = get.owner(i, "judge"); + if (owner && (owner != player || get.position(i) != "x")) { + var id = owner.playerid; + if (!map[id]) map[id] = [[], [], []]; map[id][0].push(i); map2[myId].push(i); - var position=get.position(i); - if(position=='h') map[id][1].push(i); + var position = get.position(i); + if (position == "h") map[id][1].push(i); else map[id][2].push(i); - } - else if(!event.updatePile&&get.position(i)=='c') event.updatePile=true; + } else if (!event.updatePile && get.position(i) == "c") + event.updatePile = true; } } - event.losing_map=map; - event.gaining_map=map2; - for(var i in map){ - var owner=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - var next=owner.lose(map[i][0],ui.special).set('forceDie',true).set('getlx',false); - next.set('relatedEvent',event.getParent()); - next.set('forceDie',true); - next.set('getlx',false); - if(event.visible==true) next.set('visible',true); + event.losing_map = map; + event.gaining_map = map2; + for (var i in map) { + var owner = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + var next = owner + .lose(map[i][0], ui.special) + .set("forceDie", true) + .set("getlx", false); + next.set("relatedEvent", event.getParent()); + next.set("forceDie", true); + next.set("getlx", false); + if (event.visible == true) next.set("visible", true); } - } - else { + } else { event.finish(); } - "step 1"; - if(event.lose_list){ - var map={}; - for(var list of event.lose_list){ - var player=list[0],cards=list[1]; - for(var i=0;i{ - player.$addToExpansion(cards,null,event.gaintag); - for(var i of event.gaintag) player.markSkill(i); - if(resume) game.resume(); - },get.delayx(500,500),player,cards,loopedCount===mapLength); - } - else if(event.animate=='gain'){ - player.$gain(cards,false); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(500, 500), + player, + cards, + loopedCount === mapLength + ); + } else if (event.animate == "gain") { + player.$gain(cards, false); game.pause(); - setTimeout((player,cards,resume)=>{ - player.$addToExpansion(cards,null,event.gaintag); - for(var i of event.gaintag) player.markSkill(i); - if(resume) game.resume(); - },get.delayx(700,700),player,cards,loopedCount===mapLength); - } - else if(event.animate=='gain2'||event.animate=='draw2'){ - var gain2t=300; - if(player.$gain2(cards)&&player==game.me){ - gain2t=500; + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(700, 700), + player, + cards, + loopedCount === mapLength + ); + } else if (event.animate == "gain2" || event.animate == "draw2") { + var gain2t = 300; + if (player.$gain2(cards) && player == game.me) { + gain2t = 500; } game.pause(); - setTimeout((player,cards,resume)=>{ - player.$addToExpansion(cards,null,event.gaintag); - for(var i of event.gaintag) player.markSkill(i); - if(resume) game.resume(); - },get.delayx(gain2t,gain2t),player,cards,loopedCount===mapLength); - } - else if(event.animate=='give'||event.animate=='giveAuto'){ - var evtmap=event.losing_map; - var entries=Object.entries(evtmap).map(entry=>[entry[0],entry[1][0]]); - var getOwner=(card)=>{ - var entry=entries.find(entry=>entry[1].includes(card)); - if(entry) return (_status.connectMode?lib.playerOL:game.playerMap)[entry[0]]; + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(gain2t, gain2t), + player, + cards, + loopedCount === mapLength + ); + } else if (event.animate == "give" || event.animate == "giveAuto") { + var evtmap = event.losing_map; + var entries = Object.entries(evtmap).map((entry) => [entry[0], entry[1][0]]); + var getOwner = (card) => { + var entry = entries.find((entry) => entry[1].includes(card)); + if (entry) + return (_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]]; return null; }; - var gainmap={}; - for(var cardx of cards){ - var owner=getOwner(cardx); - if(owner){ - var id=owner.playerid; - if(!gainmap[id]) gainmap[id]=[]; + var gainmap = {}; + for (var cardx of cards) { + var owner = getOwner(cardx); + if (owner) { + var id = owner.playerid; + if (!gainmap[id]) gainmap[id] = []; gainmap[id].push(cardx); } } - if(event.animate=='give'){ - for(var i in gainmap){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - source.$give(evtmap[i][0],player,false); - if(event.log) game.log(player,'将',evtmap[i][0],'置于了武将牌上'); + if (event.animate == "give") { + for (var i in gainmap) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + source.$give(evtmap[i][0], player, false); + if (event.log) game.log(player, "将", evtmap[i][0], "置于了武将牌上"); } - } - else{ - for(var i in gainmap){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - if(evtmap[i][1].length){ - source.$giveAuto(evtmap[i][1],player,false); - if(event.log) game.log(player,'将',get.cnNumber(evtmap[i][1].length),'张牌置于了武将牌上'); + } else { + for (var i in gainmap) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (evtmap[i][1].length) { + source.$giveAuto(evtmap[i][1], player, false); + if (event.log) + game.log( + player, + "将", + get.cnNumber(evtmap[i][1].length), + "张牌置于了武将牌上" + ); } - if(evtmap[i][2].length){ - source.$give(evtmap[i][2],player,false); - if(event.log) game.log(player,'将',evtmap[i][2],'置于了武将牌上'); + if (evtmap[i][2].length) { + source.$give(evtmap[i][2], player, false); + if (event.log) game.log(player, "将", evtmap[i][2], "置于了武将牌上"); } } } game.pause(); - setTimeout((player,cards,resume)=>{ - player.$addToExpansion(cards,null,event.gaintag); - for(var i of event.gaintag) player.markSkill(i); - if(resume) game.resume(); - },get.delayx(500,500),player,cards,loopedCount===mapLength); - } - else if(typeof event.animate=='function'){ - var time=event.animate(event); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(500, 500), + player, + cards, + loopedCount === mapLength + ); + } else if (typeof event.animate == "function") { + var time = event.animate(event); game.pause(); - setTimeout((player,cards,resume)=>{ - player.$addToExpansion(cards,null,event.gaintag); - for(var i of event.gaintag) player.markSkill(i); - if(resume) game.resume(); - },get.delayx(time,time),player,cards,loopedCount===mapLength); - } - else{ - player.$addToExpansion(cards,null,event.gaintag); - for(var i of event.gaintag) player.markSkill(i); + setTimeout( + (player, cards, resume) => { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); + if (resume) game.resume(); + }, + get.delayx(time, time), + player, + cards, + loopedCount === mapLength + ); + } else { + player.$addToExpansion(cards, null, event.gaintag); + for (var i of event.gaintag) player.markSkill(i); event.finish(); } } - "step 3"; + ("step 3"); game.delayx(); - if(event.updatePile) game.updateRoundNumber(); + if (event.updatePile) game.updateRoundNumber(); }, - intro:{ - markcount:'expansion', - mark(dialog,storage,player){ - const cards=player.getExpansions('sbquhu'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; + intro: { + markcount: "expansion", + mark(dialog, storage, player) { + const cards = player.getExpansions("sbquhu"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; }, }, - ai:{ - order:3.5, - result:{ - target(player,target){ - let sgn=1,preAtt=0; - if(ui.selected.targets.length){ - const selected=ui.selected.targets[0]; - preAtt=get.attitude(player,selected); - if(preAtt>0) sgn=-1; + ai: { + order: 3.5, + result: { + target(player, target) { + let sgn = 1, + preAtt = 0; + if (ui.selected.targets.length) { + const selected = ui.selected.targets[0]; + preAtt = get.attitude(player, selected); + if (preAtt > 0) sgn = -1; } - let eff=0.4*target.countCards('h',card=>{ - return 5-get.useful(card); - })-1; - if(get.attitude(player,target)>0&&sgn<0||get.attitude(player,target)<0&&preAtt<0) eff=-Math.abs(eff); + let eff = + 0.4 * + target.countCards("h", (card) => { + return 5 - get.useful(card); + }) - + 1; + if ( + (get.attitude(player, target) > 0 && sgn < 0) || + (get.attitude(player, target) < 0 && preAtt < 0) + ) + eff = -Math.abs(eff); return eff; }, - } - } + }, + }, }, - sbjieming:{ - audio:2, - trigger:{ - player:'damageEnd', + sbjieming: { + audio: 2, + trigger: { + player: "damageEnd", }, - direct:true, - async content(event,trigger,player){ - let num=Math.max(1,player.getDamagedHp()); - const {result:{bool,targets}}=await player.chooseTarget(get.prompt('sbjieming'),`令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于${get.cnNumber(num)}张,你失去1点体力。`).set('ai',target=>{ - if(get.event('nope')) return 0; - const player=get.player(),att=get.attitude(player,target); - if(att>2){ - const num=Math.sqrt(Math.min(5,Math.max(1,target.countCards('he',card=>get.value(card)<5.5)))); - return num*att; - } - return att/3; - }).set('nope',(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=1)&&num>2); - if(!bool) return; - const target=targets[0]; - player.logSkill('sbjieming',target); + direct: true, + async content(event, trigger, player) { + let num = Math.max(1, player.getDamagedHp()); + const { + result: { bool, targets }, + } = await player + .chooseTarget( + get.prompt("sbjieming"), + `令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于${get.cnNumber( + num + )}张,你失去1点体力。` + ) + .set("ai", (target) => { + if (get.event("nope")) return 0; + const player = get.player(), + att = get.attitude(player, target); + if (att > 2) { + const num = Math.sqrt( + Math.min( + 5, + Math.max( + 1, + target.countCards("he", (card) => get.value(card) < 5.5) + ) + ) + ); + return num * att; + } + return att / 3; + }) + .set( + "nope", + player.getHp() + + player.countCards("hs", (card) => player.canSaveCard(card, player)) <= + 1 && num > 2 + ); + if (!bool) return; + const target = targets[0]; + player.logSkill("sbjieming", target); await target.draw(3); - num=Math.max(1,player.getDamagedHp()); - const {result:{bool:bool2,cards}}=await target.chooseToDiscard('节命:是否弃置任意张牌?',`若你本次弃置的牌数不大于${get.cnNumber(num)}张,${get.translation(player)}失去1点体力。`,[1,Infinity],'he').set('ai',card=>{ - if(get.event('nope')) return 0; - if(ui.selected.cards.length>get.event('num')) return 0; - return 6-get.value(card); - }).set('nope',get.attitude(target,player)*get.effect(player,{name:'losehp'},player,target)>=0).set('num',num); - if(!bool2||cards.length<=num) player.loseHp(); + num = Math.max(1, player.getDamagedHp()); + const { + result: { bool: bool2, cards }, + } = await target + .chooseToDiscard( + "节命:是否弃置任意张牌?", + `若你本次弃置的牌数不大于${get.cnNumber(num)}张,${get.translation( + player + )}失去1点体力。`, + [1, Infinity], + "he" + ) + .set("ai", (card) => { + if (get.event("nope")) return 0; + if (ui.selected.cards.length > get.event("num")) return 0; + return 6 - get.value(card); + }) + .set( + "nope", + get.attitude(target, player) * + get.effect(player, { name: "losehp" }, player, target) >= + 0 + ) + .set("num", num); + if (!bool2 || cards.length <= num) player.loseHp(); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'damage')&&target.hp>1){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - let max=0; - const num=Math.max(1,player.getDamagedHp()); - if(num>2) return [1,-2]; - const players=game.filterPlayer(); - for(const current of players){ - if(get.attitude(target,current)>0){ - max=Math.max(current.countCards('he'),max); + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + let max = 0; + const num = Math.max(1, player.getDamagedHp()); + if (num > 2) return [1, -2]; + const players = game.filterPlayer(); + for (const current of players) { + if (get.attitude(target, current) > 0) { + max = Math.max(current.countCards("he"), max); } } - return [1,Math.max(1,1+Math.min(2,max/3))]; + return [1, Math.max(1, 1 + Math.min(2, max / 3))]; } - if((card.name=='tao'||card.name=='caoyao')&& - target.hp>1&&target.countCards('h')<=target.hp) return [0,0]; + if ( + (card.name == "tao" || card.name == "caoyao") && + target.hp > 1 && + target.countCards("h") <= target.hp + ) + return [0, 0]; }, }, }, }, //曹丕 - sbxingshang:{ - audio:2, - trigger:{global:['die','damageEnd']}, - filter(event,player){ - if(player.countMark('sbxingshang')>=get.info('sbxingshang').getLimit) return false; - return event.name=='die'||!player.getHistory('custom',evt=>evt.sbxingshang).length; + sbxingshang: { + audio: 2, + trigger: { global: ["die", "damageEnd"] }, + filter(event, player) { + if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; + return ( + event.name == "die" || !player.getHistory("custom", (evt) => evt.sbxingshang).length + ); }, - forced:true, - locked:false, - async content(event,trigger,player){ - player.addMark('sbxingshang',Math.min(2,get.info('sbxingshang').getLimit-player.countMark('sbxingshang'))); - if(trigger.name=='damage') player.getHistory('custom').push({sbxingshang:true}); + forced: true, + locked: false, + async content(event, trigger, player) { + player.addMark( + "sbxingshang", + Math.min(2, get.info("sbxingshang").getLimit - player.countMark("sbxingshang")) + ); + if (trigger.name == "damage") player.getHistory("custom").push({ sbxingshang: true }); }, - marktext:'颂', - intro:{ - name:'颂', - content:'mark', + marktext: "颂", + intro: { + name: "颂", + content: "mark", }, - ai:{threaten:2.5}, - getLimit:9, - getNum(num){ - const list=[2,2,5,5,1,2,2,3,3,2]; - if(typeof num!='number'||!Array.from({length:list.length}).map((_,i)=>i+1).includes(num)) return 0; - return list[num-1]; + ai: { threaten: 2.5 }, + getLimit: 9, + getNum(num) { + const list = [2, 2, 5, 5, 1, 2, 2, 3, 3, 2]; + if ( + typeof num != "number" || + !Array.from({ length: list.length }) + .map((_, i) => i + 1) + .includes(num) + ) + return 0; + return list[num - 1]; }, - getEffect(player,num){ - if(!player||typeof num!='number') return 0; - switch(num){ + getEffect(player, num) { + if (!player || typeof num != "number") return 0; + switch (num) { //行殇选项 - case 1://-2,重置武将牌 - if(game.hasPlayer(target=>{ - return get.attitude(player,target)>0&&target.isTurnedOver(); - })) return 10; + case 1: //-2,重置武将牌 + if ( + game.hasPlayer((target) => { + return get.attitude(player, target) > 0 && target.isTurnedOver(); + }) + ) + return 10; return 0; - case 2://-2,摸min(5,max(2,阵亡角色数))的牌 - return Math.min(5,(Math.max(2,game.dead.length))); - case 3://-5,加上限加血+复原装备栏 - if(!game.hasPlayer(target=>{ - return get.attitude(player,target)>0&&target.maxHp<10; - })) return 0; - return 5+(game.hasPlayer(target=>{ - return get.attitude(player,target)>0&&target.hasDisabledSlot(); - })?1:0); - case 4://-5,劝封/化萍 + case 2: //-2,摸min(5,max(2,阵亡角色数))的牌 + return Math.min(5, Math.max(2, game.dead.length)); + case 3: //-5,加上限加血+复原装备栏 + if ( + !game.hasPlayer((target) => { + return get.attitude(player, target) > 0 && target.maxHp < 10; + }) + ) + return 0; + return ( + 5 + + (game.hasPlayer((target) => { + return get.attitude(player, target) > 0 && target.hasDisabledSlot(); + }) + ? 1 + : 0) + ); + case 4: //-5,劝封/化萍 return 0; //放逐选项 - case 5://-1,封印基本牌外的手牌 - if(game.hasPlayer(target=>{ - return get.attitude(player,target)<0; - })) return 1; + case 5: //-1,封印基本牌外的手牌 + if ( + game.hasPlayer((target) => { + return get.attitude(player, target) < 0; + }) + ) + return 1; return 0; - case 6://-2,白板到结束 - if(game.hasPlayer(target=>{ - if(target.hasSkill('sbfangzhu_ban')||target.hasSkill('fengyin')||target.hasSkill('baiban')) return false; - return get.attitude(player,target)<0&&['name','name1','name2'].reduce((sum,name)=>{ - if(target[name]&&(name!='name1'||target.name!=target.name1)){ - if(get.character(target[name])) sum+get.rank(target[name],true); - } - return sum; - },0)>5; - })) return 6; + case 6: //-2,白板到结束 + if ( + game.hasPlayer((target) => { + if ( + target.hasSkill("sbfangzhu_ban") || + target.hasSkill("fengyin") || + target.hasSkill("baiban") + ) + return false; + return ( + get.attitude(player, target) < 0 && + ["name", "name1", "name2"].reduce((sum, name) => { + if ( + target[name] && + (name != "name1" || target.name != target.name1) + ) { + if (get.character(target[name])) + sum + get.rank(target[name], true); + } + return sum; + }, 0) > 5 + ); + }) + ) + return 6; return 0; - case 7://-2,强命到结束 + case 7: //-2,强命到结束 return 0; - case 8://-3,翻面 - if(game.hasPlayer(target=>{ - return get.attitude(player,target)<0&&!target.isTurnedOver(); - })) return 8; + case 8: //-3,翻面 + if ( + game.hasPlayer((target) => { + return get.attitude(player, target) < 0 && !target.isTurnedOver(); + }) + ) + return 8; return 0; - case 9://-3,封印装备牌外的手牌 - if(game.hasPlayer(target=>{ - return get.attitude(player,target)<0; - })) return 2.5; + case 9: //-3,封印装备牌外的手牌 + if ( + game.hasPlayer((target) => { + return get.attitude(player, target) < 0; + }) + ) + return 2.5; return 0; - case 10://-2,封印锦囊牌外的手牌 - if(game.hasPlayer(target=>{ - return get.attitude(player,target)<0; - })) return 1.5; + case 10: //-2,封印锦囊牌外的手牌 + if ( + game.hasPlayer((target) => { + return get.attitude(player, target) < 0; + }) + ) + return 1.5; return 0; - default://其他 + default: //其他 return 0; } }, - group:'sbxingshang_use', - subSkill:{ - use:{ - audio:'sbxingshang', - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(target=>{ - if(player.countMark('sbxingshang')>1) return true; - return player.countMark('sbxingshang')&&(target.isLinked()||target.isTurnedOver()); + group: "sbxingshang_use", + subSkill: { + use: { + audio: "sbxingshang", + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer((target) => { + if (player.countMark("sbxingshang") > 1) return true; + return ( + player.countMark("sbxingshang") && + (target.isLinked() || target.isTurnedOver()) + ); }); }, - usable:2, - chooseButton:{ - dialog(){ - var dialog=ui.create.dialog('行殇:请选择你要执行的一项','hidden'); - dialog.add([[ - [1,'移去2个“颂”标记,复原一名角色的武将牌'], - [2,'移去2个“颂”标记,令一名角色摸'+get.cnNumber(Math.min(5,Math.max(2,game.dead.length)))+'张牌'], - [3,'移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏'], - [4,'移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗'], - ],'textbutton']); + usable: 2, + chooseButton: { + dialog() { + var dialog = ui.create.dialog("行殇:请选择你要执行的一项", "hidden"); + dialog.add([ + [ + [1, "移去2个“颂”标记,复原一名角色的武将牌"], + [ + 2, + "移去2个“颂”标记,令一名角色摸" + + get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + + "张牌", + ], + [ + 3, + "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏", + ], + [ + 4, + "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗", + ], + ], + "textbutton", + ]); return dialog; }, - filter(button,player){ - if(player.countMark('sbxingshang')target.isLinked()||target.isTurnedOver()); + return game.hasPlayer( + (target) => target.isLinked() || target.isTurnedOver() + ); case 2: return true; case 3: - return game.hasPlayer(target=>target.maxHp<10); + return game.hasPlayer((target) => target.maxHp < 10); case 4: return game.dead.length; } }, - check(button){ - const player=get.event('player'),info=get.info('sbxingshang'); - let list=Array.from({length:4}).map((_,i)=>i+1); - list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num)); - const num=list.sort((a,b)=>info.getEffect(player,b)-info.getEffect(player,a))[0]; - return (button.link==num)?10:0; + check(button) { + const player = get.event("player"), + info = get.info("sbxingshang"); + let list = Array.from({ length: 4 }).map((_, i) => i + 1); + list = list.filter( + (num) => player.countMark("sbxingshang") >= info.getNum(num) + ); + const num = list.sort( + (a, b) => info.getEffect(player, b) - info.getEffect(player, a) + )[0]; + return button.link == num ? 10 : 0; }, - backup(links,player){ + backup(links, player) { return { - num:links[0], - audio:'sbxingshang', - filterCard:()=>false, - selectCard:-1, - filterTarget(card,player,target){ - switch(lib.skill.sbxingshang_use_backup.num){ + num: links[0], + audio: "sbxingshang", + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + switch (lib.skill.sbxingshang_use_backup.num) { case 1: - return target=>target.isLinked()||target.isTurnedOver(); + return (target) => target.isLinked() || target.isTurnedOver(); case 2: return true; case 3: - return target.maxHp<10; + return target.maxHp < 10; case 4: - return target==player; + return target == player; } }, - selectTarget:()=>lib.skill.sbxingshang_use_backup.num==4?-1:1, - async content(event,trigger,player){ - const target=event.targets[0]; - const num=lib.skill.sbxingshang_use_backup.num; - player.removeMark('sbxingshang',get.info('sbxingshang').getNum(num)); - switch(num){ + selectTarget: () => (lib.skill.sbxingshang_use_backup.num == 4 ? -1 : 1), + async content(event, trigger, player) { + const target = event.targets[0]; + const num = lib.skill.sbxingshang_use_backup.num; + player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num)); + switch (num) { case 1: - if(target.isLinked()) target.link(false); - if(target.isTurnedOver()) target.turnOver(); + if (target.isLinked()) target.link(false); + if (target.isTurnedOver()) target.turnOver(); break; case 2: - target.draw(Math.min(5,Math.max(2,game.dead.length))); + target.draw(Math.min(5, Math.max(2, game.dead.length))); break; case 3: target.gainMaxHp(); target.recover(); - let list=[]; - for (let i=1;i<=5;i++){ - if(target.hasDisabledSlot(i)) list.push('equip'+i); + let list = []; + for (let i = 1; i <= 5; i++) { + if (target.hasDisabledSlot(i)) list.push("equip" + i); } - if(list.length) target.enableEquip(list.randomGet()); + if (list.length) target.enableEquip(list.randomGet()); break; case 4: - let map={}; - game.dead.forEach(target=>map[target.playerid]=get.translation(target)); - const {result:{control}}=await player.chooseControl(Object.values(map)).set('ai',()=>{ - const getNum=(target)=>{ - let num=0; - if(target.name&&lib.character[target.name]) num+=get.rank(target.name,true); - if(target.name2&&lib.character[target.name2]) num+=get.rank(target.name2,true); - return num; - }; - let controls=_status.event.controls.slice(); - controls=controls.map(name=>[name,game.dead.find(target=>_status.event.map[target.playerid]==name)]); - controls.sort((a,b)=>getNum(b[1])-getNum(a[1])); - return controls[0][0]; - }).set('prompt','获得一名已阵亡角色的所有技能').set('map',map); - if(control){ - const target2=game.dead.find(targetx=>map[targetx.playerid]==control); + let map = {}; + game.dead.forEach( + (target) => + (map[target.playerid] = get.translation(target)) + ); + const { + result: { control }, + } = await player + .chooseControl(Object.values(map)) + .set("ai", () => { + const getNum = (target) => { + let num = 0; + if (target.name && lib.character[target.name]) + num += get.rank(target.name, true); + if (target.name2 && lib.character[target.name2]) + num += get.rank(target.name2, true); + return num; + }; + let controls = _status.event.controls.slice(); + controls = controls.map((name) => [ + name, + game.dead.find( + (target) => + _status.event.map[target.playerid] == name + ), + ]); + controls.sort((a, b) => getNum(b[1]) - getNum(a[1])); + return controls[0][0]; + }) + .set("prompt", "获得一名已阵亡角色的所有技能") + .set("map", map); + if (control) { + const target2 = game.dead.find( + (targetx) => map[targetx.playerid] == control + ); player.line(target2); - game.log(player,'选择了',target2); - const skills=target2.getStockSkills(true,true); - const skills2=['sbxingshang','sbfangzhu','sbsongwei']; - player.changeSkills(skills,skills2); + game.log(player, "选择了", target2); + const skills = target2.getStockSkills(true, true); + const skills2 = ["sbxingshang", "sbfangzhu", "sbsongwei"]; + player.changeSkills(skills, skills2); } } }, - ai:{ - result:{ - target(player,target){ - switch(lib.skill.sbxingshang_use_backup.num){ + ai: { + result: { + target(player, target) { + switch (lib.skill.sbxingshang_use_backup.num) { case 1: - let num=0; - if(target.isLinked()&&!target.hasSkill('nzry_jieying')) num+=0.5; - if(target.isTurnedOver()) num+=10; + let num = 0; + if ( + target.isLinked() && + !target.hasSkill("nzry_jieying") + ) + num += 0.5; + if (target.isTurnedOver()) num += 10; return num; case 2: - return get.effect(target,{name:'draw'},player,player); + return get.effect( + target, + { name: "draw" }, + player, + player + ); case 3: - return Math.max(0,get.recoverEffect(target,player,player))+get.attitude(player,target); + return ( + Math.max( + 0, + get.recoverEffect(target, player, player) + ) + get.attitude(player, target) + ); case 4: return 1; } }, }, }, - } + }; }, - prompt(links,player){ - const str='###行殇###'; - switch(links[0]){ + prompt(links, player) { + const str = "###行殇###"; + switch (links[0]) { case 1: - return str+'移去2个“颂”标记,复原一名角色的武将牌'; + return str + "移去2个“颂”标记,复原一名角色的武将牌"; case 2: - return str+'移去2个“颂”标记,令一名角色摸'+get.cnNumber(Math.min(5,Math.max(2,game.dead.length)))+'张牌'; + return ( + str + + "移去2个“颂”标记,令一名角色摸" + + get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + + "张牌" + ); case 3: - return str+'移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏'; + return ( + str + + "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏" + ); case 4: - return str+'移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去武将牌上的所有技能'; + return ( + str + + "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去武将牌上的所有技能" + ); } - } - }, - ai:{ - order(_,player){ - const info=get.info('sbxingshang'); - const goon=(player.hasSkill('sbfangzhu')&&(player.getStat('skill').sbfangzhu||0)<(get.info('sbfangzhu').usable||Infinity)); - let list=Array.from({length:goon?10:4}).map((_,i)=>i+1); - list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num)); - list.sort((a,b)=>info.getEffect(player,b)-info.getEffect(player,a)); - return (Array.from({length:4}).map((_,i)=>i+1).includes(list[0])&&info.getEffect(player,list[0])>0)?1:0; }, - result:{player:1}, + }, + ai: { + order(_, player) { + const info = get.info("sbxingshang"); + const goon = + player.hasSkill("sbfangzhu") && + (player.getStat("skill").sbfangzhu || 0) < + (get.info("sbfangzhu").usable || Infinity); + let list = Array.from({ length: goon ? 10 : 4 }).map((_, i) => i + 1); + list = list.filter( + (num) => player.countMark("sbxingshang") >= info.getNum(num) + ); + list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); + return Array.from({ length: 4 }) + .map((_, i) => i + 1) + .includes(list[0]) && info.getEffect(player, list[0]) > 0 + ? 1 + : 0; + }, + result: { player: 1 }, }, }, - use_backup:{}, + use_backup: {}, }, }, - sbfangzhu:{ - audio:2, - audioname:['mb_caomao'], - enable:'phaseUse', - filter(event,player){ - return player.hasMark('sbxingshang'); + sbfangzhu: { + audio: 2, + audioname: ["mb_caomao"], + enable: "phaseUse", + filter(event, player) { + return player.hasMark("sbxingshang"); }, - usable:1, - chooseButton:{ - dialog(){ - var dialog=ui.create.dialog('放逐:请选择你要执行的一项','hidden'); - dialog.add([[ - [1,'移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束'], - [2,'移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束'], - [3,'移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束'], - [4,'移去3个“颂”标记,令一名其他角色将武将牌翻面'], - [5,'移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束'], - [6,'移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束'], - ],'textbutton']); + usable: 1, + chooseButton: { + dialog() { + var dialog = ui.create.dialog("放逐:请选择你要执行的一项", "hidden"); + dialog.add([ + [ + [1, "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束"], + [2, "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束"], + [ + 3, + "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束", + ], + [4, "移去3个“颂”标记,令一名其他角色将武将牌翻面"], + [5, "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束"], + [6, "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束"], + ], + "textbutton", + ]); return dialog; }, - filter(button,player){ - if(player.countMark('sbxingshang'){ - if(target==player) return false; - const num=button.link,storage=target.getStorage('sbfangzhu_ban'); - return !((num==1&&storage.includes('basic'))||(num==5&&storage.includes('equip'))||(num==6&&storage.includes('trick'))); + filter(button, player) { + if (player.countMark("sbxingshang") < get.info("sbxingshang").getNum(button.link + 4)) + return false; + return game.hasPlayer((target) => { + if (target == player) return false; + const num = button.link, + storage = target.getStorage("sbfangzhu_ban"); + return !( + (num == 1 && storage.includes("basic")) || + (num == 5 && storage.includes("equip")) || + (num == 6 && storage.includes("trick")) + ); }); }, - check(button){ - const player=get.event('player'),info=get.info('sbxingshang'); - let list=Array.from({length:6}).map((_,i)=>i+1); - list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num+4)); - const num=list.sort((a,b)=>info.getEffect(player,b+4)-info.getEffect(player,a+4))[0]-4; - return (button.link==num)?10:0; + check(button) { + const player = get.event("player"), + info = get.info("sbxingshang"); + let list = Array.from({ length: 6 }).map((_, i) => i + 1); + list = list.filter((num) => player.countMark("sbxingshang") >= info.getNum(num + 4)); + const num = + list.sort( + (a, b) => info.getEffect(player, b + 4) - info.getEffect(player, a + 4) + )[0] - 4; + return button.link == num ? 10 : 0; }, - backup(links,player){ + backup(links, player) { return { - num:links[0], - audio:'sbfangzhu', - audioname:['mb_caomao'], - filterCard:()=>false, - selectCard:-1, - filterTarget(card,player,target){ - if(target==player) return false; - const num=lib.skill.sbfangzhu_backup.num,storage=target.getStorage('sbfangzhu_ban'); - return !((num==1&&storage.includes('basic'))||(num==5&&storage.includes('equip'))||(num==6&&storage.includes('trick'))); + num: links[0], + audio: "sbfangzhu", + audioname: ["mb_caomao"], + filterCard: () => false, + selectCard: -1, + filterTarget(card, player, target) { + if (target == player) return false; + const num = lib.skill.sbfangzhu_backup.num, + storage = target.getStorage("sbfangzhu_ban"); + return !( + (num == 1 && storage.includes("basic")) || + (num == 5 && storage.includes("equip")) || + (num == 6 && storage.includes("trick")) + ); }, - async content(event,trigger,player){ - const target=event.target; - const num=lib.skill.sbfangzhu_backup.num; - player.removeMark('sbxingshang',get.info('sbxingshang').getNum(num+4)); - switch(num){ - case 1: case 2: case 6: - const type=['basic','equip','trick'][[1,2,6].indexOf(num)]; - target.addTempSkill('sbfangzhu_ban',{player:'phaseEnd'}); - target.markAuto('sbfangzhu_ban',[type]); + async content(event, trigger, player) { + const target = event.target; + const num = lib.skill.sbfangzhu_backup.num; + player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num + 4)); + switch (num) { + case 1: + case 2: + case 6: + const type = ["basic", "equip", "trick"][[1, 2, 6].indexOf(num)]; + target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("sbfangzhu_ban", [type]); break; case 3: - target.addTempSkill('sbfangzhu_kill',{player:'phaseEnd'}); + target.addTempSkill("sbfangzhu_kill", { player: "phaseEnd" }); break; case 4: target.turnOver(); break; case 5: - target.addTempSkill('sbfangzhu_ban',{player:'phaseEnd'}); - target.markAuto('sbfangzhu_ban',['equip']); + target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("sbfangzhu_ban", ["equip"]); break; } }, - ai:{ - result:{ - target(player,target){ - switch(lib.skill.sbfangzhu_backup.num){ + ai: { + result: { + target(player, target) { + switch (lib.skill.sbfangzhu_backup.num) { case 1: - return -target.countCards('h',card=>get.type(card)!='basic')-1; + return ( + -target.countCards( + "h", + (card) => get.type(card) != "basic" + ) - 1 + ); case 2: - return -target.getSkills(null,null,false).reduce((sum,skill)=>{ - return sum+Math.max(get.skillRank(skill,'out'),get.skillRank(skill,'in')); - },0); + return -target + .getSkills(null, null, false) + .reduce((sum, skill) => { + return ( + sum + + Math.max( + get.skillRank(skill, "out"), + get.skillRank(skill, "in") + ) + ); + }, 0); case 3: return 0; case 4: - if(get.attitude(player,target)>0&&target.isTurnedOver()) return 10*target.countCards('hs')+1; - if(get.attitude(player,target)<0&&!target.isTurnedOver()) return -5*target.countCards('hs')+1; + if (get.attitude(player, target) > 0 && target.isTurnedOver()) + return 10 * target.countCards("hs") + 1; + if ( + get.attitude(player, target) < 0 && + !target.isTurnedOver() + ) + return -5 * target.countCards("hs") + 1; return 0; case 5: - return -target.countCards('h',card=>get.type(card)!='equip')-3; + return ( + -target.countCards( + "h", + (card) => get.type(card) != "equip" + ) - 3 + ); case 6: - return -target.countCards('h',card=>get.type2(card)!='trick')-2; + return ( + -target.countCards( + "h", + (card) => get.type2(card) != "trick" + ) - 2 + ); } }, }, }, - } + }; }, - prompt(links,player){ - const str='###放逐###'; - switch(links[0]){ + prompt(links, player) { + const str = "###放逐###"; + switch (links[0]) { case 1: - return str+'移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束'; + return ( + str + + "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束" + ); case 2: - return str+'移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束'; + return ( + str + "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束" + ); case 3: - return str+'移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束'; + return ( + str + + "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束" + ); case 4: - return str+'移去3个“颂”标记,令一名其他角色将武将牌翻面'; + return str + "移去3个“颂”标记,令一名其他角色将武将牌翻面"; case 5: - return str+'移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束'; + return ( + str + + "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束" + ); case 6: - return str+'移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束'; + return ( + str + + "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束" + ); } - } - }, - ai:{ - order(_,player){ - const info=get.info('sbxingshang'); - const goon=(player.hasSkill('sbxingshang')&&(player.getStat('skill').sbxingshang_use||0)<(info.subSkill.use.usable||Infinity)); - let list=Array.from({length:goon?10:6}).map((_,i)=>i+(goon?1:5)); - list=list.filter(num=>player.countMark('sbxingshang')>=info.getNum(num)); - list.sort((a,b)=>info.getEffect(player,b)-info.getEffect(player,a)); - return (Array.from({length:6}).map((_,i)=>i+5).includes(list[0])&&info.getEffect(player,list[0])>0)?1:0; }, - result:{player:1}, - combo:'sbxingshang' }, - subSkill:{ - backup:{}, - kill:{ - charlotte:true, - mark:true, - marktext:'禁', - intro:{content:'不能响应其他角色使用的牌'}, - trigger:{global:'useCard1'}, - filter(event,player){ - return event.player!=player; + ai: { + order(_, player) { + const info = get.info("sbxingshang"); + const goon = + player.hasSkill("sbxingshang") && + (player.getStat("skill").sbxingshang_use || 0) < + (info.subSkill.use.usable || Infinity); + let list = Array.from({ length: goon ? 10 : 6 }).map((_, i) => i + (goon ? 1 : 5)); + list = list.filter((num) => player.countMark("sbxingshang") >= info.getNum(num)); + list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); + return Array.from({ length: 6 }) + .map((_, i) => i + 5) + .includes(list[0]) && info.getEffect(player, list[0]) > 0 + ? 1 + : 0; + }, + result: { player: 1 }, + combo: "sbxingshang", + }, + subSkill: { + backup: {}, + kill: { + charlotte: true, + mark: true, + marktext: "禁", + intro: { content: "不能响应其他角色使用的牌" }, + trigger: { global: "useCard1" }, + filter(event, player) { + return event.player != player; }, - forced:true, - popup:false, - async content(event,trigger,player){ + forced: true, + popup: false, + async content(event, trigger, player) { trigger.directHit.add(player); }, }, - ban:{ - charlotte:true, - onremove:true, - mark:true, - marktext:'禁', - intro:{ - markcount:()=>0, - content(storage){ - if(storage.length>1) return '不能使用手牌'; - return '于手牌中只能使用'+get.translation(storage[0])+'牌'; + ban: { + charlotte: true, + onremove: true, + mark: true, + marktext: "禁", + intro: { + markcount: () => 0, + content(storage) { + if (storage.length > 1) return "不能使用手牌"; + return "于手牌中只能使用" + get.translation(storage[0]) + "牌"; }, }, - mod:{ - cardEnabled(card,player){ - const storage=player.getStorage('sbfangzhu_ban'); - if(get.itemtype(card)=='card'&&get.position(card)!='h') return; - if(storage.length>1||!storage.includes(get.type2(card))) return false; + mod: { + cardEnabled(card, player) { + const storage = player.getStorage("sbfangzhu_ban"); + if (get.itemtype(card) == "card" && get.position(card) != "h") return; + if (storage.length > 1 || !storage.includes(get.type2(card))) return false; }, - cardSavable(card,player){ - const storage=player.getStorage('sbfangzhu_ban'); - if(get.itemtype(card)=='card'&&get.position(card)!='h') return; - if(storage.length>1||!storage.includes(get.type2(card))) return false; + cardSavable(card, player) { + const storage = player.getStorage("sbfangzhu_ban"); + if (get.itemtype(card) == "card" && get.position(card) != "h") return; + if (storage.length > 1 || !storage.includes(get.type2(card))) return false; }, }, }, }, }, - sbsongwei:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - if(player.countMark('sbxingshang')>=get.info('sbxingshang').getLimit) return false; - return game.hasPlayer(target=>target.group=='wei'&&target!=player); + sbsongwei: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; + return game.hasPlayer((target) => target.group == "wei" && target != player); }, - zhuSkill:true, - forced:true, - locked:false, - async content(event,trigger,player){ - player.addMark('sbxingshang',Math.min(get.info('sbxingshang').getLimit-player.countMark('sbxingshang'),2*game.countPlayer(target=>target.group=='wei'&&target!=player))); + zhuSkill: true, + forced: true, + locked: false, + async content(event, trigger, player) { + player.addMark( + "sbxingshang", + Math.min( + get.info("sbxingshang").getLimit - player.countMark("sbxingshang"), + 2 * game.countPlayer((target) => target.group == "wei" && target != player) + ) + ); }, - group:'sbsongwei_delete', - subSkill:{ - delete:{ - audio:'sbsongwei', - enable:'phaseUse', - filter(event,player){ - if(player.storage.sbsongwei_delete) return false; - return game.hasPlayer(target=>lib.skill.sbsongwei.subSkill.delete.filterTarget(null,player,target)); + group: "sbsongwei_delete", + subSkill: { + delete: { + audio: "sbsongwei", + enable: "phaseUse", + filter(event, player) { + if (player.storage.sbsongwei_delete) return false; + return game.hasPlayer((target) => + lib.skill.sbsongwei.subSkill.delete.filterTarget(null, player, target) + ); }, - filterTarget(card,player,target){ - return target!=player&&target.group=='wei'&&target.getStockSkills(false,true).length; + filterTarget(card, player, target) { + return ( + target != player && + target.group == "wei" && + target.getStockSkills(false, true).length + ); }, - skillAnimation:true, - animationColor:'thunder', - async content(event,trigger,player){ - player.storage.sbsongwei_delete=true; - player.awakenSkill('sbsongwei_delete'); - event.target.removeSkills(event.target.getStockSkills(false,true)); + skillAnimation: true, + animationColor: "thunder", + async content(event, trigger, player) { + player.storage.sbsongwei_delete = true; + player.awakenSkill("sbsongwei_delete"); + event.target.removeSkills(event.target.getStockSkills(false, true)); }, - ai:{ - order:13, - result:{ - target(player,target){ - return -target.getStockSkills(false,true).length; + ai: { + order: 13, + result: { + target(player, target) { + return -target.getStockSkills(false, true).length; }, }, }, @@ -1197,889 +1648,1107 @@ game.import('character', function () { }, //关羽 //矢 - sbwusheng:{ - audio:3, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return game.hasPlayer(target=>target!=player&&!target.isZhu2()); + sbwusheng: { + audio: 3, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return game.hasPlayer((target) => target != player && !target.isZhu2()); }, - direct:true, - content:function*(event,map){ - var player=map.player; - var result=yield player.chooseTarget(get.prompt('sbwusheng'),'选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸'+(get.mode()==='identity'?'两':'一')+'张牌,对其使用三张【杀】后不能对其使用【杀】',(card,player,target)=>{ - return target!=player&&!target.isZhu2(); - }).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); - }); - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbwusheng',target); - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.25); - player.addTempSkill('sbwusheng_effect',{player:'phaseUseAfter'}); - player.storage.sbwusheng_effect[target.playerid]=0; + direct: true, + content: function* (event, map) { + var player = map.player; + var result = yield player + .chooseTarget( + get.prompt("sbwusheng"), + "选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸" + + (get.mode() === "identity" ? "两" : "一") + + "张牌,对其使用三张【杀】后不能对其使用【杀】", + (card, player, target) => { + return target != player && !target.isZhu2(); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbwusheng", target); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.25); + player.addTempSkill("sbwusheng_effect", { player: "phaseUseAfter" }); + player.storage.sbwusheng_effect[target.playerid] = 0; } }, - group:'sbwusheng_wusheng', - subSkill:{ - wusheng:{ - audio:'sbwusheng', - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - return name=='sha'&&player.countCards('hs'); + group: "sbwusheng_wusheng", + subSkill: { + wusheng: { + audio: "sbwusheng", + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return name == "sha" && player.countCards("hs"); }, - filter:function(event,player){ - return event.filterCard(get.autoViewAs({name:'sha'},'unsure'),player,event)||lib.inpile_nature.some(nature=>event.filterCard(get.autoViewAs({name:'sha',nature},'unsure'),player,event)); + filter: function (event, player) { + return ( + event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) || + lib.inpile_nature.some((nature) => + event.filterCard( + get.autoViewAs({ name: "sha", nature }, "unsure"), + player, + event + ) + ) + ); }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - if(event.filterCard({name:'sha'},player,event)) list.push(['基本','','sha']); - for(var j of lib.inpile_nature){ - if(event.filterCard({name:'sha',nature:j},player,event)) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + if (event.filterCard({ name: "sha" }, player, event)) + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: "sha", nature: j }, player, event)) + list.push(["基本", "", "sha", j]); } - var dialog=ui.create.dialog('武圣',[list,'vcard'],'hidden'); - dialog.direct=true; + var dialog = ui.create.dialog("武圣", [list, "vcard"], "hidden"); + dialog.direct = true; return dialog; }, - check:function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - if(_status.event.getParent().type=='phase'&&game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ - switch (button.link[2]){ - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder'||button.link[3]=='ice') return 2.92; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + _status.event.getParent().type == "phase" && + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") + return 2.92; else return 2.9; } } - return 1+Math.random(); + return 1 + Math.random(); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'sbwusheng', - filterCard:true, - check:function(card){ - return 6-get.value(card); + audio: "sbwusheng", + filterCard: true, + check: function (card) { + return 6 - get.value(card); }, - viewAs:{name:links[0][2],nature:links[0][3]}, - position:'hs', - popname:true, - } + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hs", + popname: true, + }; }, - prompt:function(links,player){ - return '将一张手牌当作'+get.translation(links[0][3]||'')+'【'+get.translation(links[0][2])+'】'+(_status.event.name=='chooseToUse'?'使用':'打出'); + prompt: function (links, player) { + return ( + "将一张手牌当作" + + get.translation(links[0][3] || "") + + "【" + + get.translation(links[0][2]) + + "】" + + (_status.event.name == "chooseToUse" ? "使用" : "打出") + ); }, }, - ai:{ - respondSha:true, - fireAttack:true, - skillTagFilter:function(player,tag){ - if(!player.countCards('hs')) return false; + ai: { + respondSha: true, + fireAttack: true, + skillTagFilter: function (player, tag) { + if (!player.countCards("hs")) return false; }, - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - if(lib.inpile_nature.some(i=>player.getUseValue({name:'sha',nature:i})>0)){ - var temp=get.order({name:'sha'}); - if(temp>max) max=temp; + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + if ( + lib.inpile_nature.some( + (i) => player.getUseValue({ name: "sha", nature: i }) > 0 + ) + ) { + var temp = get.order({ name: "sha" }); + if (temp > max) max = temp; } - if(max>0) max+=0.3; + if (max > 0) max += 0.3; return max; } return 4; }, - result:{player:1}, + result: { player: 1 }, }, }, - effect:{ - charlotte:true, - onremove:true, - init:function(player){ - if(!player.storage.sbwusheng_effect) player.storage.sbwusheng_effect={}; + effect: { + charlotte: true, + onremove: true, + init: function (player) { + if (!player.storage.sbwusheng_effect) player.storage.sbwusheng_effect = {}; }, - mod:{ - targetInRange:function(card,player,target){ - if(card.name=='sha'&&typeof player.storage.sbwusheng_effect[target.playerid]=='number') return true; + mod: { + targetInRange: function (card, player, target) { + if ( + card.name == "sha" && + typeof player.storage.sbwusheng_effect[target.playerid] == "number" + ) + return true; }, - cardUsableTarget:function(card,player,target){ - if(card.name!=='sha'||typeof player.storage.sbwusheng_effect[target.playerid]!=='number') return; - return player.storage.sbwusheng_effect[target.playerid]<3; + cardUsableTarget: function (card, player, target) { + if ( + card.name !== "sha" || + typeof player.storage.sbwusheng_effect[target.playerid] !== "number" + ) + return; + return player.storage.sbwusheng_effect[target.playerid] < 3; }, - playerEnabled:function(card,player,target){ - if(card.name!='sha'||typeof player.storage.sbwusheng_effect[target.playerid]!='number') return; - if(player.storage.sbwusheng_effect[target.playerid]>=3) return false; + playerEnabled: function (card, player, target) { + if ( + card.name != "sha" || + typeof player.storage.sbwusheng_effect[target.playerid] != "number" + ) + return; + if (player.storage.sbwusheng_effect[target.playerid] >= 3) return false; }, }, - audio:'sbwusheng', - trigger:{player:['useCardToPlayered','useCardAfter']}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(event.name=='useCard') return event.targets.some(target=>typeof player.storage.sbwusheng_effect[target.playerid]=='number'); - return typeof player.storage.sbwusheng_effect[event.target.playerid]=='number'; + audio: "sbwusheng", + trigger: { player: ["useCardToPlayered", "useCardAfter"] }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (event.name == "useCard") + return event.targets.some( + (target) => + typeof player.storage.sbwusheng_effect[target.playerid] == "number" + ); + return typeof player.storage.sbwusheng_effect[event.target.playerid] == "number"; }, - direct:true, - content:function(){ - if(trigger.name=='useCard'){ - var targets=trigger.targets.filter(target=>typeof player.storage.sbwusheng_effect[target.playerid]=='number'); - targets.forEach(target=>player.storage.sbwusheng_effect[target.playerid]++); - } - else{ - player.logSkill('sbwusheng_effect',trigger.target); - player.draw(get.mode()==='identity'?2:1); + direct: true, + content: function () { + if (trigger.name == "useCard") { + var targets = trigger.targets.filter( + (target) => + typeof player.storage.sbwusheng_effect[target.playerid] == "number" + ); + targets.forEach( + (target) => player.storage.sbwusheng_effect[target.playerid]++ + ); + } else { + player.logSkill("sbwusheng_effect", trigger.target); + player.draw(get.mode() === "identity" ? 2 : 1); } }, }, }, - ai:{threaten:114514}, + ai: { threaten: 114514 }, }, - sbyijue:{ - audio:2, - trigger:{global:'damageBegin4'}, - filter:function(event,player){ - if(!event.source||event.source!=player||event.player==player) return false; - return event.num>=event.player.hp&&!player.getStorage('sbyijue').includes(event.player); + sbyijue: { + audio: 2, + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + if (!event.source || event.source != player || event.player == player) return false; + return ( + event.num >= event.player.hp && !player.getStorage("sbyijue").includes(event.player) + ); }, - forced:true, - logTarget:'player', - content:function(){ + forced: true, + logTarget: "player", + content: function () { trigger.cancel(); - player.addTempSkill('sbyijue_effect'); - player.markAuto('sbyijue',[trigger.player]); - player.markAuto('sbyijue_effect',[trigger.player]); + player.addTempSkill("sbyijue_effect"); + player.markAuto("sbyijue", [trigger.player]); + player.markAuto("sbyijue_effect", [trigger.player]); }, - marktext:'绝', - intro:{content:'已放$一马'}, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - audio:'sbyijue', - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - return player.getStorage('sbyijue_effect').includes(event.target); + marktext: "绝", + intro: { content: "已放$一马" }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + audio: "sbyijue", + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + return player.getStorage("sbyijue_effect").includes(event.target); }, - forced:true, - logTarget:'target', - content:function(){ + forced: true, + logTarget: "target", + content: function () { trigger.getParent().excluded.add(trigger.target); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(player.getStorage('sbyijue_effect').includes(target)) return 'zeroplayertarget'; + ai: { + effect: { + player: function (card, player, target) { + if (player.getStorage("sbyijue_effect").includes(target)) + return "zeroplayertarget"; }, }, }, - marktext:'义', - intro:{content:'本回合放$一马'}, + marktext: "义", + intro: { content: "本回合放$一马" }, }, }, }, //黄月英 - sbqicai:{ - mod:{ - targetInRange:function(card,player,target){ - if(get.type2(card)=='trick') return true; + sbqicai: { + mod: { + targetInRange: function (card, player, target) { + if (get.type2(card) == "trick") return true; }, }, - locked:false, - getLimit:3, - audio:2, - enable:'phaseUse', - onChooseToUse:function(event){ - if(!event.sbqicai&&!game.online){ - const player=get.player(); - const cards=Array.from(ui.discardPile.childNodes).filter(card=>lib.skill.sbqicai.filterCardx(card,player)); - event.set('sbqicai',cards); + locked: false, + getLimit: 3, + audio: 2, + enable: "phaseUse", + onChooseToUse: function (event) { + if (!event.sbqicai && !game.online) { + const player = get.player(); + const cards = Array.from(ui.discardPile.childNodes).filter((card) => + lib.skill.sbqicai.filterCardx(card, player) + ); + event.set("sbqicai", cards); } }, - filter:function(event,player){ - return player.countCards('h',card=>lib.skill.sbqicai.filterCardx(card,player))||event.sbqicai&&event.sbqicai.length; + filter: function (event, player) { + return ( + player.countCards("h", (card) => lib.skill.sbqicai.filterCardx(card, player)) || + (event.sbqicai && event.sbqicai.length) + ); }, - filterCardx:function(card,player){ - if(player.getStorage('sbqicai').includes(card.name)) return false; - return get.type(card)=='equip'&&game.hasPlayer(target=>target!=player&&target.hasEmptySlot(get.subtype(card))); + filterCardx: function (card, player) { + if (player.getStorage("sbqicai").includes(card.name)) return false; + return ( + get.type(card) == "equip" && + game.hasPlayer((target) => target != player && target.hasEmptySlot(get.subtype(card))) + ); }, - usable:1, - chooseButton:{ - dialog:function(event,player){ - const list1=player.getCards('h',card=>lib.skill.sbqicai.filterCardx(card,player)); - const list2=event.sbqicai; - var dialog=ui.create.dialog('###奇才###
    请选择一张装备牌置入一名其他角色的装备区
    '); - if(list1.length){ + usable: 1, + chooseButton: { + dialog: function (event, player) { + const list1 = player.getCards("h", (card) => + lib.skill.sbqicai.filterCardx(card, player) + ); + const list2 = event.sbqicai; + var dialog = ui.create.dialog( + '###奇才###
    请选择一张装备牌置入一名其他角色的装备区
    ' + ); + if (list1.length) { dialog.add('
    手牌区
    '); dialog.add(list1); } - if(list2.length){ + if (list2.length) { dialog.add('
    弃牌堆
    '); dialog.add(list2); - if(list1.length) dialog.classList.add('fullheight'); + if (list1.length) dialog.classList.add("fullheight"); } return dialog; }, - check:function(button){ - var player=_status.event.player; - var num=get.value(button.link); - if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(get.subtype(button.link))&&get.attitude(player,target)>0)) num=1/(get.value(button.link)||0.5); - if(get.owner(button.link)) return num; - return num*5; + check: function (button) { + var player = _status.event.player; + var num = get.value(button.link); + if ( + !game.hasPlayer( + (target) => + target != player && + target.hasEmptySlot(get.subtype(button.link)) && + get.attitude(player, target) > 0 + ) + ) + num = 1 / (get.value(button.link) || 0.5); + if (get.owner(button.link)) return num; + return num * 5; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'sbqicai', - card:links[0], - filterCard:function(card,player){ - var cardx=lib.skill.sbqicai_backup.card; - if(get.owner(cardx)) return card==cardx; + audio: "sbqicai", + card: links[0], + filterCard: function (card, player) { + var cardx = lib.skill.sbqicai_backup.card; + if (get.owner(cardx)) return card == cardx; return false; }, - selectCard:-1, - filterTarget:function(card,player,target){ - return target!=player&&target.canEquip(lib.skill.sbqicai_backup.card); + selectCard: -1, + filterTarget: function (card, player, target) { + return target != player && target.canEquip(lib.skill.sbqicai_backup.card); }, - check:()=>1, - discard:false, - lose:false, - prepare:function(cards,player,targets){ - if(cards&&cards.length) player.$give(cards,targets[0],false); + check: () => 1, + discard: false, + lose: false, + prepare: function (cards, player, targets) { + if (cards && cards.length) player.$give(cards, targets[0], false); }, - content:function(){ - if(!cards||!cards.length){ - cards=[lib.skill.sbqicai_backup.card]; + content: function () { + if (!cards || !cards.length) { + cards = [lib.skill.sbqicai_backup.card]; target.$gain2(cards); game.delayx(); } - if(get.mode()=='doudizhu') player.markAuto('sbqicai',[cards[0].name]); + if (get.mode() == "doudizhu") player.markAuto("sbqicai", [cards[0].name]); target.equip(cards[0]); - player.addSkill('sbqicai_gain'); - lib.skill.sbqicai.updateCounter(player,target,0); + player.addSkill("sbqicai_gain"); + lib.skill.sbqicai.updateCounter(player, target, 0); }, - ai:{ - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - if(att>0) return 3; - if(att<0) return -1; + ai: { + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if (att > 0) return 3; + if (att < 0) return -1; return 0; }, }, }, - } + }; }, - prompt:function(links,player){ - return '请选择置入'+get.translation(links)+'的角色'; + prompt: function (links, player) { + return "请选择置入" + get.translation(links) + "的角色"; }, }, - updateCounter:function(player,target,num){ - const skill=`sbqicai_${player.playerid}`; - game.broadcastAll(lib.skill.sbqicai.initSkill,skill); - if(!target.hasSkill(skill)) target.addSkill(skill); - if(num==0) target.clearMark(skill,false); - else if(num>0) target.addMark(skill,num,false); - if(target.countMark(skill)>=lib.skill.sbqicai.getLimit) target.removeSkill(skill); - if(!_status.postReconnect.sbqicai){ - _status.postReconnect.sbqicai=[ - lib.skill.sbqicai.initSkill, - [] - ]; + updateCounter: function (player, target, num) { + const skill = `sbqicai_${player.playerid}`; + game.broadcastAll(lib.skill.sbqicai.initSkill, skill); + if (!target.hasSkill(skill)) target.addSkill(skill); + if (num == 0) target.clearMark(skill, false); + else if (num > 0) target.addMark(skill, num, false); + if (target.countMark(skill) >= lib.skill.sbqicai.getLimit) target.removeSkill(skill); + if (!_status.postReconnect.sbqicai) { + _status.postReconnect.sbqicai = [lib.skill.sbqicai.initSkill, []]; } _status.postReconnect.sbqicai[1].add(skill); }, - initSkill:skill=>{ - if(!lib.skill[skill]){ - lib.skill[skill]={ - onremove:true, - mark:true, - marktext:'奇', - intro:{ - markcount:function(storage){ - return (storage||0).toString(); + initSkill: (skill) => { + if (!lib.skill[skill]) { + lib.skill[skill] = { + onremove: true, + mark: true, + marktext: "奇", + intro: { + markcount: function (storage) { + return (storage || 0).toString(); }, - content:function(storage){ - return '已被掠夺'+get.cnNumber(storage||0)+'张普通锦囊牌'; + content: function (storage) { + return "已被掠夺" + get.cnNumber(storage || 0) + "张普通锦囊牌"; }, }, }; - lib.translate[skill]='奇才'; - lib.translate[skill+'_bg']='奇'; + lib.translate[skill] = "奇才"; + lib.translate[skill + "_bg"] = "奇"; } }, - ai:{ - order:7, - result:{ - player:function(player){ - if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(2)&&get.attitude(player,target)!=0)) return 0; + ai: { + order: 7, + result: { + player: function (player) { + if ( + !game.hasPlayer( + (target) => + target != player && + target.hasEmptySlot(2) && + get.attitude(player, target) != 0 + ) + ) + return 0; return 1; }, }, }, - marktext:'才', - intro:{content:'已使用$发动过此技能'}, - subSkill:{ - gain:{ - audio:'sbqicai', - trigger:{global:['gainAfter','loseAsyncAfter']}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - if(!event.getg(current).length||!current.hasSkill('sbqicai_'+player.playerid)) return false; - if(current.countMark('sbqicai_'+player.playerid)>=lib.skill.sbqicai.getLimit) return false; - return event.getg(current).some(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,current,player)); + marktext: "才", + intro: { content: "已使用$发动过此技能" }, + subSkill: { + gain: { + audio: "sbqicai", + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + if ( + !event.getg(current).length || + !current.hasSkill("sbqicai_" + player.playerid) + ) + return false; + if ( + current.countMark("sbqicai_" + player.playerid) >= + lib.skill.sbqicai.getLimit + ) + return false; + return event + .getg(current) + .some( + (card) => + get.type(card) == "trick" && + lib.filter.canBeGained(card, current, player) + ); }); }, - forced:true, - direct:true, - charlotte:true, - content:function(){ - 'step 0' - if(!event.checkedTargets) event.checkedTargets=[]; - var target=game.findPlayer(function(current){ - if(!trigger.getg(current).length||!current.hasSkill('sbqicai_'+player.playerid)) return false; - if(event.checkedTargets.includes(current)) return false; - if(current.countMark('sbqicai_'+player.playerid)>=lib.skill.sbqicai.getLimit) return false; - return trigger.getg(current).some(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,current,player)); + forced: true, + direct: true, + charlotte: true, + content: function () { + "step 0"; + if (!event.checkedTargets) event.checkedTargets = []; + var target = game.findPlayer(function (current) { + if ( + !trigger.getg(current).length || + !current.hasSkill("sbqicai_" + player.playerid) + ) + return false; + if (event.checkedTargets.includes(current)) return false; + if ( + current.countMark("sbqicai_" + player.playerid) >= + lib.skill.sbqicai.getLimit + ) + return false; + return trigger + .getg(current) + .some( + (card) => + get.type(card) == "trick" && + lib.filter.canBeGained(card, current, player) + ); }); - if(!target){ + if (!target) { event.finish(); return; } - event.target=target; - player.logSkill('sbqicai_gain',target); + event.target = target; + player.logSkill("sbqicai_gain", target); event.checkedTargets.add(target); - var cards=trigger.getg(target).filter(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,target,player)); - if(cards.length<=lib.skill.sbqicai.getLimit-target.countMark('sbqicai_'+player.playerid)) event._result={bool:true,links:cards}; - else{ - var num=(lib.skill.sbqicai.getLimit-target.countMark('sbqicai_'+player.playerid)); - target.chooseButton(['奇才:将其中'+get.cnNumber(num)+'张牌交给'+get.translation(player),cards],num,true).set('ai',function(button){ - return get.value(button.link)*get.sgn(_status.event.att); - }).set('att',get.attitude(target,player)); + var cards = trigger + .getg(target) + .filter( + (card) => + get.type(card) == "trick" && + lib.filter.canBeGained(card, target, player) + ); + if ( + cards.length <= + lib.skill.sbqicai.getLimit - target.countMark("sbqicai_" + player.playerid) + ) + event._result = { bool: true, links: cards }; + else { + var num = + lib.skill.sbqicai.getLimit - + target.countMark("sbqicai_" + player.playerid); + target + .chooseButton( + [ + "奇才:将其中" + + get.cnNumber(num) + + "张牌交给" + + get.translation(player), + cards, + ], + num, + true + ) + .set("ai", function (button) { + return get.value(button.link) * get.sgn(_status.event.att); + }) + .set("att", get.attitude(target, player)); } - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { game.delaye(0.5); - target.give(result.links,player); - lib.skill.sbqicai.updateCounter(player,target,result.links.length); + target.give(result.links, player); + lib.skill.sbqicai.updateCounter(player, target, result.links.length); } event.goto(0); }, }, }, }, - sbjizhi:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - return get.type(event.card)=='trick'; + sbjizhi: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return get.type(event.card) == "trick"; }, - forced:true, - content:function(){ - player.draw().gaintag=['sbjizhi']; - player.addTempSkill('sbjizhi_mark') + forced: true, + content: function () { + player.draw().gaintag = ["sbjizhi"]; + player.addTempSkill("sbjizhi_mark"); }, - subSkill:{ - mark:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('sbjizhi'); + subSkill: { + mark: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("sbjizhi"); }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('sbjizhi')) return true; + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("sbjizhi")) return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('sbjizhi')) return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("sbjizhi")) return false; }, }, }, }, }, //诸葛亮 - sbhuoji:{ - audio:3, - dutySkill:true, - derivation:['sbguanxing','sbkongcheng'], - group:['sbhuoji_fire','sbhuoji_achieve','sbhuoji_fail','sbhuoji_mark'], - subSkill:{ - fire:{ - audio:'sbhuoji1.mp3', - enable:'phaseUse', - filterTarget:lib.filter.notMe, - prompt:'选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害', - usable:1, - line:'fire', - content:function(){ - 'step 0' - target.damage('fire'); - 'step 1' - var targets=game.filterPlayer(current=>{ - if(current==player||current==target) return false; - return current.group==target.group; + sbhuoji: { + audio: 3, + dutySkill: true, + derivation: ["sbguanxing", "sbkongcheng"], + group: ["sbhuoji_fire", "sbhuoji_achieve", "sbhuoji_fail", "sbhuoji_mark"], + subSkill: { + fire: { + audio: "sbhuoji1.mp3", + enable: "phaseUse", + filterTarget: lib.filter.notMe, + prompt: "选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害", + usable: 1, + line: "fire", + content: function () { + "step 0"; + target.damage("fire"); + ("step 1"); + var targets = game.filterPlayer((current) => { + if (current == player || current == target) return false; + return current.group == target.group; }); - if(targets.length){ + if (targets.length) { game.delayx(); - player.line(targets,'fire'); - targets.forEach(i=>i.damage('fire')); + player.line(targets, "fire"); + targets.forEach((i) => i.damage("fire")); } }, - ai:{ - order:7, - fireAttack:true, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - return get.sgn(att)*game.filterPlayer(current=>{ - if(current==player) return false; - return current.group==target.group; - }).reduce((num,current)=>num+get.damageEffect(current,player,player,'fire'),0); + ai: { + order: 7, + fireAttack: true, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + return ( + get.sgn(att) * + game + .filterPlayer((current) => { + if (current == player) return false; + return current.group == target.group; + }) + .reduce( + (num, current) => + num + get.damageEffect(current, player, player, "fire"), + 0 + ) + ); }, }, }, }, - achieve:{ - audio:'sbhuoji2.mp3', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.getAllHistory('sourceDamage',evt=>evt.hasNature('fire')).reduce((num,evt)=>num+evt.num,0)>=game.players.length+game.dead.length; + achieve: { + audio: "sbhuoji2.mp3", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return ( + player + .getAllHistory("sourceDamage", (evt) => evt.hasNature("fire")) + .reduce((num, evt) => num + evt.num, 0) >= + game.players.length + game.dead.length + ); }, - forced:true, - locked:false, - skillAnimation:true, - animationColor:'fire', - async content(event,trigger,player){ - player.awakenSkill('sbhuoji'); - game.log(player,'成功完成使命'); - player.changeSkin('sbhuoji','sb_zhugeliang'); - player.changeSkills(['sbguanxing','sbkongcheng'],['sbhuoji','sbkanpo']); + forced: true, + locked: false, + skillAnimation: true, + animationColor: "fire", + async content(event, trigger, player) { + player.awakenSkill("sbhuoji"); + game.log(player, "成功完成使命"); + player.changeSkin("sbhuoji", "sb_zhugeliang"); + player.changeSkills(["sbguanxing", "sbkongcheng"], ["sbhuoji", "sbkanpo"]); }, }, - fail:{ - audio:'sbhuoji3.mp3', - trigger:{player:'dying'}, - forced:true, - locked:false, - content:function(){ - player.awakenSkill('sbhuoji'); - game.log(player,'使命失败'); + fail: { + audio: "sbhuoji3.mp3", + trigger: { player: "dying" }, + forced: true, + locked: false, + content: function () { + player.awakenSkill("sbhuoji"); + game.log(player, "使命失败"); }, }, - mark:{ - charlotte:true, - trigger:{source:'damage'}, - filter:function(event,player){ - return event.hasNature('fire'); + mark: { + charlotte: true, + trigger: { source: "damage" }, + filter: function (event, player) { + return event.hasNature("fire"); }, - firstDo:true, - forced:true, - popup:false, - content:function(){ - player.addTempSkill('sbhuoji_count',{player:['sbhuoji_achieveBegin','sbhuoji_failBegin']}); - player.storage.sbhuoji_count=player.getAllHistory('sourceDamage',evt=>evt.hasNature('fire')).reduce((num,evt)=>num+evt.num,0); - player.markSkill('sbhuoji_count'); + firstDo: true, + forced: true, + popup: false, + content: function () { + player.addTempSkill("sbhuoji_count", { + player: ["sbhuoji_achieveBegin", "sbhuoji_failBegin"], + }); + player.storage.sbhuoji_count = player + .getAllHistory("sourceDamage", (evt) => evt.hasNature("fire")) + .reduce((num, evt) => num + evt.num, 0); + player.markSkill("sbhuoji_count"); }, }, - count:{ - charlotte:true, - intro:{content:'本局游戏已造成过#点火属性伤害'}, + count: { + charlotte: true, + intro: { content: "本局游戏已造成过#点火属性伤害" }, }, }, }, - sbkanpo:{ - init:function(player){ - if(!player.storage.sbkanpo){ - player.storage.sbkanpo=[(get.mode()=='doudizhu'||(get.mode()=='versus'&&_status.mode=='two'))?2:4,[],[]]; - player.markSkill('sbkanpo'); + sbkanpo: { + init: function (player) { + if (!player.storage.sbkanpo) { + player.storage.sbkanpo = [ + get.mode() == "doudizhu" || (get.mode() == "versus" && _status.mode == "two") + ? 2 + : 4, + [], + [], + ]; + player.markSkill("sbkanpo"); } }, - audio:2, - trigger:{global:'roundStart'}, - filter:function(event,player){ - var storage=player.storage.sbkanpo; - return storage[0]||storage[1].length; + audio: 2, + trigger: { global: "roundStart" }, + filter: function (event, player) { + var storage = player.storage.sbkanpo; + return storage[0] || storage[1].length; }, - forced:true, - locked:false, - content:function*(event,map){ - var player=map.player,storage=player.storage.sbkanpo; - var sum=storage[0]; - storage[1]=[]; - player.markSkill('sbkanpo'); - if(!sum) return; - const list=get.inpileVCardList(info=>{ - if(info[2]=='sha'&&info[3]) return false; - return info[0]!='equip'; + forced: true, + locked: false, + content: function* (event, map) { + var player = map.player, + storage = player.storage.sbkanpo; + var sum = storage[0]; + storage[1] = []; + player.markSkill("sbkanpo"); + if (!sum) return; + const list = get.inpileVCardList((info) => { + if (info[2] == "sha" && info[3]) return false; + return info[0] != "equip"; }); - const func=()=>{ - const event=get.event(); - const controls=[link=>{ - const evt=get.event(); - if(evt.dialog&&evt.dialog.buttons){ - for(let i=0;i=Math.max(3,game.countPlayer()/2)) return 0; - switch(button.link[2]){ - case 'wuxie':return 5+Math.random(); - case 'sha':return 5+Math.random(); - case 'tao':return 4+Math.random(); - case 'jiu':return 3+Math.random(); - case 'lebu':return 3+Math.random(); - case 'shan':return 4.5+Math.random(); - case 'wuzhong':return 4+Math.random(); - case 'shunshou':return 2.7+Math.random(); - case 'nanman':return 2+Math.random(); - case 'wanjian':return 1.6+Math.random(); - default:return 1.5+Math.random(); - } - }).set('filterButton',button=>{ - return !_status.event.names.includes(button.link[2]); - }).set('names',storage[2]).set('custom',{ - add:{ - confirm:function(bool){ - if(bool!=true) return; - const event=get.event().parent; - if(event.controls) event.controls.forEach(i=>i.close()); - if(ui.confirm) ui.confirm.close(); - game.uncheck(); - }, - button:function(){ - if(ui.selected.buttons.length) return; - const event=get.event(); - if(event.dialog&&event.dialog.buttons){ - for(let i=0;i { + const event = get.event(); + const controls = [ + (link) => { + const evt = get.event(); + if (evt.dialog && evt.dialog.buttons) { + for (let i = 0; i < evt.dialog.buttons.length; i++) { + const button = evt.dialog.buttons[i]; + button.classList.remove("selectable"); + button.classList.remove("selected"); + const counterNode = button.querySelector(".caption"); + if (counterNode) { + counterNode.childNodes[0].innerHTML = ``; } } + ui.selected.buttons.length = 0; + game.check(); } - if(!ui.selected.buttons.length){ - const evt=event.parent; - if(evt.controls) evt.controls[0].classList.add('disabled'); - } + return; }, - }, - replace:{ - button:function(button){ - const event=get.event(),sum=event.sum; - if(!event.isMine()) return; - if(button.classList.contains('selectable')==false) return; - if(ui.selected.buttons.length>=sum) return false; - button.classList.add('selected'); - ui.selected.buttons.push(button); - let counterNode=button.querySelector('.caption'); - const count=ui.selected.buttons.filter(i=>i==button).length; - if(counterNode){ - counterNode=counterNode.childNodes[0]; - counterNode.innerHTML=`×${count}`; - } - else{ - counterNode=ui.create.caption(`×${count}`,button); - counterNode.style.right='5px'; - counterNode.style.bottom='2px'; - } - const evt=event.parent; - if(evt.controls) evt.controls[0].classList.remove('disabled'); - game.check(); + ]; + event.controls = [ui.create.control(controls.concat(["清除选择", "stayleft"]))]; + }; + if (event.isMine()) func(); + else if (event.isOnline()) event.player.send(func); + var result = yield player + .chooseButton( + ["看破:是否记录至多" + get.cnNumber(sum) + "个牌名?", [list, "vcard"]], + [1, sum], + false + ) + .set("ai", function (button) { + if (ui.selected.buttons.length >= Math.max(3, game.countPlayer() / 2)) return 0; + switch (button.link[2]) { + case "wuxie": + return 5 + Math.random(); + case "sha": + return 5 + Math.random(); + case "tao": + return 4 + Math.random(); + case "jiu": + return 3 + Math.random(); + case "lebu": + return 3 + Math.random(); + case "shan": + return 4.5 + Math.random(); + case "wuzhong": + return 4 + Math.random(); + case "shunshou": + return 2.7 + Math.random(); + case "nanman": + return 2 + Math.random(); + case "wanjian": + return 1.6 + Math.random(); + default: + return 1.5 + Math.random(); + } + }) + .set("filterButton", (button) => { + return !_status.event.names.includes(button.link[2]); + }) + .set("names", storage[2]) + .set("custom", { + add: { + confirm: function (bool) { + if (bool != true) return; + const event = get.event().parent; + if (event.controls) event.controls.forEach((i) => i.close()); + if (ui.confirm) ui.confirm.close(); + game.uncheck(); + }, + button: function () { + if (ui.selected.buttons.length) return; + const event = get.event(); + if (event.dialog && event.dialog.buttons) { + for (let i = 0; i < event.dialog.buttons.length; i++) { + const button = event.dialog.buttons[i]; + const counterNode = button.querySelector(".caption"); + if (counterNode) { + counterNode.childNodes[0].innerHTML = ``; + } + } + } + if (!ui.selected.buttons.length) { + const evt = event.parent; + if (evt.controls) evt.controls[0].classList.add("disabled"); + } + }, }, - } - }).set('sum',sum) - if(result.bool){ - var names=result.links.map(link=>link[2]); - storage[0]-=names.length; - storage[1]=names; - storage[2]=names; - } - else storage[2]=[]; - player.markSkill('sbkanpo'); + replace: { + button: function (button) { + const event = get.event(), + sum = event.sum; + if (!event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + if (ui.selected.buttons.length >= sum) return false; + button.classList.add("selected"); + ui.selected.buttons.push(button); + let counterNode = button.querySelector(".caption"); + const count = ui.selected.buttons.filter((i) => i == button).length; + if (counterNode) { + counterNode = counterNode.childNodes[0]; + counterNode.innerHTML = `×${count}`; + } else { + counterNode = ui.create.caption( + `×${count}`, + button + ); + counterNode.style.right = "5px"; + counterNode.style.bottom = "2px"; + } + const evt = event.parent; + if (evt.controls) evt.controls[0].classList.remove("disabled"); + game.check(); + }, + }, + }) + .set("sum", sum); + if (result.bool) { + var names = result.links.map((link) => link[2]); + storage[0] -= names.length; + storage[1] = names; + storage[2] = names; + } else storage[2] = []; + player.markSkill("sbkanpo"); }, - marktext:'破', - intro:{ - markcount:function(storage){ + marktext: "破", + intro: { + markcount: function (storage) { return storage[1].length; }, - mark:function(dialog,content,player){ - const storage=player.getStorage('sbkanpo'); - const sum=storage[0]; - const names=storage[1]; - dialog.addText('剩余可记录'+sum+'次牌名'); - if(player.isUnderControl(true)&&names.length){ - dialog.addText('当前记录牌名:'); - dialog.addSmall([names,'vcard']); + mark: function (dialog, content, player) { + const storage = player.getStorage("sbkanpo"); + const sum = storage[0]; + const names = storage[1]; + dialog.addText("剩余可记录" + sum + "次牌名"); + if (player.isUnderControl(true) && names.length) { + dialog.addText("当前记录牌名:"); + dialog.addSmall([names, "vcard"]); } }, }, - group:'sbkanpo_kanpo', - subSkill:{ - kanpo:{ - audio:'sbkanpo', - trigger:{global:'useCard'}, - filter:function(event,player){ - return event.player!=player&&player.storage.sbkanpo[1].includes(event.card.name); + group: "sbkanpo_kanpo", + subSkill: { + kanpo: { + audio: "sbkanpo", + trigger: { global: "useCard" }, + filter: function (event, player) { + return ( + event.player != player && player.storage.sbkanpo[1].includes(event.card.name) + ); }, - prompt2:function(event,player){ - return '移除'+get.translation(event.card.name)+'的记录,令'+get.translation(event.card)+'无效'; + prompt2: function (event, player) { + return ( + "移除" + + get.translation(event.card.name) + + "的记录,令" + + get.translation(event.card) + + "无效" + ); }, - check:function(event,player){ - var effect=0; - if(event.card.name=='wuxie'||event.card.name=='shan'){ - if(get.attitude(player,event.player)<-1) effect=-1; - } - else if(event.targets&&event.targets.length){ - for(var i=0;icard.hasGaintag('sbguanxing'),'s'); - if(event.name=='phaseZhunbei'){ - return bool||7-lib.skill.sbguanxing.getNum*player.countMark('sbguanxingx')>0; + sbguanxing: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter: function (event, player) { + var bool = player.hasCard((card) => card.hasGaintag("sbguanxing"), "s"); + if (event.name == "phaseZhunbei") { + return bool || 7 - lib.skill.sbguanxing.getNum * player.countMark("sbguanxingx") > 0; } - return bool&&player.hasSkill('sbguanxing_on'); + return bool && player.hasSkill("sbguanxing_on"); }, - forced:true, - locked:false, - content:function(){ - 'step 0' - if(trigger.name=='phaseJieshu'){ + forced: true, + locked: false, + content: function () { + "step 0"; + if (trigger.name == "phaseJieshu") { event.goto(2); return; } - player.addMark('sbguanxingx',1,false); - var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); - if(cards.length) player.loseToDiscardpile(cards); - var num=player.countMark('sbguanxingx')-1; - event.num=Math.max(0,7-lib.skill.sbguanxing.getNum*num); - 'step 1' - if(num){ - var cards2=get.cards(num); - player.$gain2(cards2,false); - game.log(player,'将',cards2,'置于了武将牌上'); - player.loseToSpecial(cards2,'sbguanxing').visible=true; - player.markSkill('sbguanxing'); + player.addMark("sbguanxingx", 1, false); + var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); + if (cards.length) player.loseToDiscardpile(cards); + var num = player.countMark("sbguanxingx") - 1; + event.num = Math.max(0, 7 - lib.skill.sbguanxing.getNum * num); + ("step 1"); + if (num) { + var cards2 = get.cards(num); + player.$gain2(cards2, false); + game.log(player, "将", cards2, "置于了武将牌上"); + player.loseToSpecial(cards2, "sbguanxing").visible = true; + player.markSkill("sbguanxing"); } - 'step 2' - var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); - if(cards.length){ - player.chooseToMove().set('list',[ - ['你的“星”',cards], - ['牌堆顶'], - ]).set('prompt','观星:点击将牌移动到牌堆顶').set('processAI',function(list){ - var cards=list[0][1].slice(),player=_status.event.player; - var name=_status.event.getTrigger().name; - var target=(name=='phaseZhunbei'?player:player.getNext()); - var judges=target.getCards('j'); - var top=[],att=get.sgn(get.attitude(player,target)); - if(judges.length&&att!=0&&(target!=player||!player.hasWuxie())){ - for(var i=0;iget.judge(card)*num; - cards.sort((a,b)=>judge(b,att)-judge(a,att)); - if(judge(cards[0],att)<0) break; - else top.unshift(cards.shift()); + ("step 2"); + var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); + if (cards.length) { + player + .chooseToMove() + .set("list", [["你的“星”", cards], ["牌堆顶"]]) + .set("prompt", "观星:点击将牌移动到牌堆顶") + .set("processAI", function (list) { + var cards = list[0][1].slice(), + player = _status.event.player; + var name = _status.event.getTrigger().name; + var target = name == "phaseZhunbei" ? player : player.getNext(); + var judges = target.getCards("j"); + var top = [], + att = get.sgn(get.attitude(player, target)); + if (judges.length && att != 0 && (target != player || !player.hasWuxie())) { + for (var i = 0; i < judges.length; i++) { + var judge = (card, num) => get.judge(card) * num; + cards.sort((a, b) => judge(b, att) - judge(a, att)); + if (judge(cards[0], att) < 0) break; + else top.unshift(cards.shift()); + } } - } - return [cards,top]; - }).set('filterOk',function(moved){ - return moved[1].length; - }); - } - else event._result={bool:false}; - 'step 3' - if(result.bool){ - var cards=result.moved[1]; - player.loseToDiscardpile(cards,ui.cardPile,'insert').log=false; - game.log(player,'将',cards,'置于了牌堆顶'); - } - else if(trigger.name=='phaseZhunbei') player.addTempSkill('sbguanxing_on'); + return [cards, top]; + }) + .set("filterOk", function (moved) { + return moved[1].length; + }); + } else event._result = { bool: false }; + ("step 3"); + if (result.bool) { + var cards = result.moved[1]; + player.loseToDiscardpile(cards, ui.cardPile, "insert").log = false; + game.log(player, "将", cards, "置于了牌堆顶"); + } else if (trigger.name == "phaseZhunbei") player.addTempSkill("sbguanxing_on"); }, - getNum:3, - group:'sbguanxing_unmark', - subSkill:{ - on:{charlotte:true}, - unmark:{ - trigger:{player:'loseAfter'}, - filter:function(event,player){ - if(!event.ss||!event.ss.length) return false; - return !player.countCards('s',card=>card.hasGaintag('sbguanxing')); + getNum: 3, + group: "sbguanxing_unmark", + subSkill: { + on: { charlotte: true }, + unmark: { + trigger: { player: "loseAfter" }, + filter: function (event, player) { + if (!event.ss || !event.ss.length) return false; + return !player.countCards("s", (card) => card.hasGaintag("sbguanxing")); }, - charlotte:true, - forced:true, - silent:true, - content:function(){ - player.unmarkSkill('sbguanxing'); + charlotte: true, + forced: true, + silent: true, + content: function () { + player.unmarkSkill("sbguanxing"); }, }, }, - marktext:'星', - intro:{ - mark:function(dialog,storage,player){ - var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); - if(!cards||!cards.length) return; + marktext: "星", + intro: { + mark: function (dialog, storage, player) { + var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); + if (!cards || !cards.length) return; dialog.addAuto(cards); }, - markcount:function(storage,player){ - return player.countCards('s',card=>card.hasGaintag('sbguanxing')); + markcount: function (storage, player) { + return player.countCards("s", (card) => card.hasGaintag("sbguanxing")); }, - onunmark:function(storage,player){ - var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); - if(cards.length) player.loseToDiscardpile(cards); + onunmark: function (storage, player) { + var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); + if (cards.length) player.loseToDiscardpile(cards); }, }, - mod:{ - aiOrder:function(player,card,num){ - var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); - if(get.itemtype(card)=='card'&&card.hasGaintag('sbguanxing')) return num+(cards.length>1?0.5:-0.0001); + mod: { + aiOrder: function (player, card, num) { + var cards = player.getCards("s", (card) => card.hasGaintag("sbguanxing")); + if (get.itemtype(card) == "card" && card.hasGaintag("sbguanxing")) + return num + (cards.length > 1 ? 0.5 : -0.0001); }, }, }, - sbkongcheng:{ - audio:2, - trigger:{player:['damageBegin3','damageBegin4']}, - filter:function(event,player,name){ - if(!player.hasSkill('sbguanxing')) return false; - const num=player.countCards('s',card=>card.hasGaintag('sbguanxing')); - if(name=='damageBegin3'&&!num) return true; - if(name=='damageBegin4'&&num) return true; + sbkongcheng: { + audio: 2, + trigger: { player: ["damageBegin3", "damageBegin4"] }, + filter: function (event, player, name) { + if (!player.hasSkill("sbguanxing")) return false; + const num = player.countCards("s", (card) => card.hasGaintag("sbguanxing")); + if (name == "damageBegin3" && !num) return true; + if (name == "damageBegin4" && num) return true; return false; }, - forced:true, - content:function(){ - 'step 0' - var num=player.countCards('s',card=>card.hasGaintag('sbguanxing')); - if(!num&&event.triggername=='damageBegin3'){ - trigger.increase('num'); - } - else if(num&&event.triggername=='damageBegin4'){ - player.judge(function(result){ - if(get.number(result)<=get.player().countCards('s',card=>card.hasGaintag('sbguanxing'))) return 2; - return -1; - }).set('judge2',result=>result.bool).set('callback',function(){ - if(event.judgeResult.number<=player.countCards('s',card=>card.hasGaintag('sbguanxing'))){ - event.getParent('sbkongcheng').getTrigger().decrease('num'); - } - }); + forced: true, + content: function () { + "step 0"; + var num = player.countCards("s", (card) => card.hasGaintag("sbguanxing")); + if (!num && event.triggername == "damageBegin3") { + trigger.increase("num"); + } else if (num && event.triggername == "damageBegin4") { + player + .judge(function (result) { + if ( + get.number(result) <= + get.player().countCards("s", (card) => card.hasGaintag("sbguanxing")) + ) + return 2; + return -1; + }) + .set("judge2", (result) => result.bool) + .set("callback", function () { + if ( + event.judgeResult.number <= + player.countCards("s", (card) => card.hasGaintag("sbguanxing")) + ) { + event.getParent("sbkongcheng").getTrigger().decrease("num"); + } + }); } }, - ai:{ - combo:'sbguanxing' - } + ai: { + combo: "sbguanxing", + }, }, //卢植 - sbzhenliang:{ - mark:true, - locked:false, - zhuanhuanji:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - if(storage) return '你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。'; - return '出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。'; + sbzhenliang: { + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player) { + if (storage) + return "你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。"; + return "出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。"; }, }, - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(player.storage.sbzhenliang) return false; - var storage=player.getExpansions('nzry_mingren'); - if(!storage.length) return false; - var color=get.color(storage[0]); - return game.hasPlayer(function(current){ - return player.inRange(current)&&player.countCards('he',function(card){ - return get.color(card)==color; - })>=Math.max(1,Math.abs(player.getHp()-current.getHp())); + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.storage.sbzhenliang) return false; + var storage = player.getExpansions("nzry_mingren"); + if (!storage.length) return false; + var color = get.color(storage[0]); + return game.hasPlayer(function (current) { + return ( + player.inRange(current) && + player.countCards("he", function (card) { + return get.color(card) == color; + }) >= Math.max(1, Math.abs(player.getHp() - current.getHp())) + ); }); }, - filterCard:function(card,player){ - return get.color(card)==get.color(player.getExpansions('nzry_mingren')[0]); + filterCard: function (card, player) { + return get.color(card) == get.color(player.getExpansions("nzry_mingren")[0]); }, - selectCard:[1,Infinity], - complexSelect:true, - complexCard:true, - position:'he', - filterTarget:function(card,player,target){ - return player.inRange(target)&&ui.selected.cards.length==Math.max(1,Math.abs(player.getHp()-target.getHp())); + selectCard: [1, Infinity], + complexSelect: true, + complexCard: true, + position: "he", + filterTarget: function (card, player, target) { + return ( + player.inRange(target) && + ui.selected.cards.length == Math.max(1, Math.abs(player.getHp() - target.getHp())) + ); }, - check:function(card){ - return 6.5-get.value(card); + check: function (card) { + return 6.5 - get.value(card); }, - prompt:'弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害', - content:function(){ - player.changeZhuanhuanji('sbzhenliang'); - target.damage('nocard'); + prompt: "弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害", + content: function () { + player.changeZhuanhuanji("sbzhenliang"); + target.damage("nocard"); }, - ai:{ - order:5, - result:{ - player:function(player,target){ - return get.damageEffect(target,player,player); + ai: { + order: 5, + result: { + player: function (player, target) { + return get.damageEffect(target, player, player); }, }, - combo:'nzry_mingren', + combo: "nzry_mingren", }, - group:'sbzhenliang_draw', - subSkill:{ - draw:{ - trigger:{global:['useCardAfter','respondAfter']}, - filter:function(event,player){ - if(_status.currentPhase==player||!player.storage.sbzhenliang) return false; - var card=player.getExpansions('nzry_mingren')[0]; - return card&&get.type2(event.card)==get.type2(card); + group: "sbzhenliang_draw", + subSkill: { + draw: { + trigger: { global: ["useCardAfter", "respondAfter"] }, + filter: function (event, player) { + if (_status.currentPhase == player || !player.storage.sbzhenliang) return false; + var card = player.getExpansions("nzry_mingren")[0]; + return card && get.type2(event.card) == get.type2(card); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('sbzhenliang'),'令一名角色摸两张牌').set('ai',function(target){ - if(target.hasSkillTag('nogain')) return 0.1; - var att=get.attitude(player,target); - return att*(Math.max(5-target.countCards('h'),2)+3); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.changeZhuanhuanji('sbzhenliang'); - player.logSkill('sbzhenliang',target); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("sbzhenliang"), "令一名角色摸两张牌") + .set("ai", function (target) { + if (target.hasSkillTag("nogain")) return 0.1; + var att = get.attitude(player, target); + return att * (Math.max(5 - target.countCards("h"), 2) + 3); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.changeZhuanhuanji("sbzhenliang"); + player.logSkill("sbzhenliang", target); target.draw(2); } }, @@ -2087,194 +2756,279 @@ game.import('character', function () { }, }, //小乔 - sbtianxiang:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he',card=>lib.skill.sbtianxiang.filterCard(card,player))&&game.hasPlayer(target=>lib.skill.sbtianxiang.filterTarget(null,player,target)); + sbtianxiang: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.countCards("he", (card) => lib.skill.sbtianxiang.filterCard(card, player)) && + game.hasPlayer((target) => lib.skill.sbtianxiang.filterTarget(null, player, target)) + ); }, - filterCard:function(card,player){ - return get.color(card,player)=='red'; + filterCard: function (card, player) { + return get.color(card, player) == "red"; }, - filterTarget:function(card,player,target){ - return target!=player&&!target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0); + filterTarget: function (card, player, target) { + return ( + target != player && + !target.getSkills().some((skill) => skill.indexOf("sbtianxiang_") == 0) + ); }, - discard:false, - lose:false, - delay:0, - usable:3, - prompt:'将一张红色牌交给一名角色并令其获得此花色的“天香”标记', - content:function(){ - player.give(cards,target); - var suit=get.suit(cards[0],player); - target.addSkill('sbtianxiang_'+suit); + discard: false, + lose: false, + delay: 0, + usable: 3, + prompt: "将一张红色牌交给一名角色并令其获得此花色的“天香”标记", + content: function () { + player.give(cards, target); + var suit = get.suit(cards[0], player); + target.addSkill("sbtianxiang_" + suit); }, - ai:{ - order:5, - result:{target:-1}, + ai: { + order: 5, + result: { target: -1 }, }, - group:['sbtianxiang_draw','sbtianxiang_effect'], - subSkill:{ - heart:{ - charlotte:true, - mark:true, - marktext:'♥︎', - intro:{content:'伤害转移术'}, + group: ["sbtianxiang_draw", "sbtianxiang_effect"], + subSkill: { + heart: { + charlotte: true, + mark: true, + marktext: "♥︎", + intro: { content: "伤害转移术" }, }, - diamond:{ - charlotte:true, - mark:true, - marktext:'♦︎', - intro:{content:'掳掠大法'}, + diamond: { + charlotte: true, + mark: true, + marktext: "♦︎", + intro: { content: "掳掠大法" }, }, - draw:{ - audio:'sbtianxiang', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.hasPlayer(target=>target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0)); + draw: { + audio: "sbtianxiang", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer((target) => + target.getSkills().some((skill) => skill.indexOf("sbtianxiang_") == 0) + ); }, - forced:true, - locked:false, - content:function(){ - var num=0; - game.countPlayer(target=>{ - var skills=target.getSkills().filter(skill=>skill.indexOf('sbtianxiang_')==0); + forced: true, + locked: false, + content: function () { + var num = 0; + game.countPlayer((target) => { + var skills = target + .getSkills() + .filter((skill) => skill.indexOf("sbtianxiang_") == 0); target.removeSkill(skills); - num+=skills.length; + num += skills.length; }); - if(get.mode()!='identity') num+=2; + if (get.mode() != "identity") num += 2; player.draw(num); }, }, - effect:{ - trigger:{player:'damageBegin3'}, - filter:function(event,player){ - return game.hasPlayer(target=>target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0)); + effect: { + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return game.hasPlayer((target) => + target.getSkills().some((skill) => skill.indexOf("sbtianxiang_") == 0) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('sbtianxiang'),'移去一名角色的“天香”标记并执行相应效果',function(card,player,target){ - return target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0); - }).set('ai',target=>{ - var player=_status.event.player; - return -get.attitude(player,target)*target.getSkills().filter(skill=>skill.indexOf('sbtianxiang_')==0).length; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('sbtianxiang',target); - var skills=target.getSkills().filter(skill=>skill.indexOf('sbtianxiang_')==0); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("sbtianxiang"), + "移去一名角色的“天香”标记并执行相应效果", + function (card, player, target) { + return target + .getSkills() + .some((skill) => skill.indexOf("sbtianxiang_") == 0); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + return ( + -get.attitude(player, target) * + target + .getSkills() + .filter((skill) => skill.indexOf("sbtianxiang_") == 0).length + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbtianxiang", target); + var skills = target + .getSkills() + .filter((skill) => skill.indexOf("sbtianxiang_") == 0); target.removeSkill(skills); - if(skills.includes('sbtianxiang_heart')){ - target.damage(trigger.source?trigger.source:'nosource'); + if (skills.includes("sbtianxiang_heart")) { + target.damage(trigger.source ? trigger.source : "nosource"); trigger.cancel(); } - if(skills.includes('sbtianxiang_diamond')){ - var cards=target.getCards('he'); - if(!cards.length) event.finish(); - else if(cards.length<=2) event._result={bool:true,cards:cards}; - else target.chooseCard('he',2,'天香:交给'+get.translation(player)+'两张牌',true); - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool) player.gain(result.cards,target,'giveAuto'); + if (skills.includes("sbtianxiang_diamond")) { + var cards = target.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { bool: true, cards: cards }; + else + target.chooseCard( + "he", + 2, + "天香:交给" + get.translation(player) + "两张牌", + true + ); + } else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) player.gain(result.cards, target, "giveAuto"); }, }, }, }, //张郃 - sbqiaobian:{ - audio:2, - trigger:{player:['phaseJudgeBefore','phaseDrawBefore','phaseUseBefore']}, - usable:1, - direct:true, - content:function(){ - 'step 0' - switch(trigger.name){ - case 'phaseJudge': - player.chooseTarget(get.prompt('sbqiaobian'),'失去1点体力并跳过判定阶段,将判定区里的牌移动给一名其他角色',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(player.hp+player.countCards('h',function(card){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,player,'unchanged','cardSavable',player); - if(mod!='unchanged') return mod; - var savable=get.info(card).savable; - if(typeof savable=='function') savable=savable(card,player,player); - return savable; - })<=1) return 0; - var eff=0; - for(var card of player.getCards('j')){ - var cardx; - if(card.viewAs) cardx=get.autoViewAs({name:card.viewAs},[card]); - else cardx=card; - if(target.canAddJudge(cardx)) eff+=get.effect(target,cardx,player,player); - else eff-=get.attitude(player,target)/114514; - } - return eff; - }).setHiddenSkill('sbqiaobian'); - break; - case 'phaseDraw': - player.chooseBool(get.prompt('sbqiaobian'),'跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力').setHiddenSkill('sbqiaobian'); - break; - case 'phaseUse': - var num=(player.countCards('h')-6); - if(num<=0) player.chooseBool(get.prompt('sbqiaobian'),'跳过出牌阶段和弃牌阶段,然后移动场上的一张牌').set('choice',player.canMoveCard(true)).setHiddenSkill('sbqiaobian'); - else player.chooseToDiscard(get.prompt('sbqiaobian'),num,'弃置'+get.cnNumber(num)+'张手牌并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌').set('ai',function(card){ - var player=_status.event.player; - if(!player.canMoveCard(true)||player.countCards('hs',card=>player.hasValueTarget(card))>=9) return 0; - return 7-get.value(card); - }).setHiddenSkill('sbqiaobian').logSkill='sbqiaobian'; - break; + sbqiaobian: { + audio: 2, + trigger: { player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore"] }, + usable: 1, + direct: true, + content: function () { + "step 0"; + switch (trigger.name) { + case "phaseJudge": + player + .chooseTarget( + get.prompt("sbqiaobian"), + "失去1点体力并跳过判定阶段,将判定区里的牌移动给一名其他角色", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + if ( + player.hp + + player.countCards("h", function (card) { + var mod2 = game.checkMod( + card, + player, + "unchanged", + "cardEnabled2", + player + ); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod( + card, + player, + player, + "unchanged", + "cardSavable", + player + ); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") + savable = savable(card, player, player); + return savable; + }) <= + 1 + ) + return 0; + var eff = 0; + for (var card of player.getCards("j")) { + var cardx; + if (card.viewAs) + cardx = get.autoViewAs({ name: card.viewAs }, [card]); + else cardx = card; + if (target.canAddJudge(cardx)) + eff += get.effect(target, cardx, player, player); + else eff -= get.attitude(player, target) / 114514; + } + return eff; + }) + .setHiddenSkill("sbqiaobian"); + break; + case "phaseDraw": + player + .chooseBool( + get.prompt("sbqiaobian"), + "跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力" + ) + .setHiddenSkill("sbqiaobian"); + break; + case "phaseUse": + var num = player.countCards("h") - 6; + if (num <= 0) + player + .chooseBool( + get.prompt("sbqiaobian"), + "跳过出牌阶段和弃牌阶段,然后移动场上的一张牌" + ) + .set("choice", player.canMoveCard(true)) + .setHiddenSkill("sbqiaobian"); + else + player + .chooseToDiscard( + get.prompt("sbqiaobian"), + num, + "弃置" + + get.cnNumber(num) + + "张手牌并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌" + ) + .set("ai", function (card) { + var player = _status.event.player; + if ( + !player.canMoveCard(true) || + player.countCards("hs", (card) => player.hasValueTarget(card)) >= + 9 + ) + return 0; + return 7 - get.value(card); + }) + .setHiddenSkill("sbqiaobian").logSkill = "sbqiaobian"; + break; } - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { trigger.cancel(); - switch(trigger.name){ - case 'phaseJudge': - var target=result.targets[0]; - player.logSkill('sbqiaobian',target); - player.loseHp(); - game.log(player,'跳过了判定阶段'); - for(var card of player.getCards('j')){ - if(target.canAddJudge(card)){ - player.$give(card,target,false); - if(card.viewAs) target.addJudge({name:card.viewAs},[card]); - else target.addJudge(card); + switch (trigger.name) { + case "phaseJudge": + var target = result.targets[0]; + player.logSkill("sbqiaobian", target); + player.loseHp(); + game.log(player, "跳过了判定阶段"); + for (var card of player.getCards("j")) { + if (target.canAddJudge(card)) { + player.$give(card, target, false); + if (card.viewAs) target.addJudge({ name: card.viewAs }, [card]); + else target.addJudge(card); + } else player.discard(card); } - else player.discard(card); - } - break; - case 'phaseDraw': - player.logSkill('sbqiaobian'); - game.log(player,'跳过了摸牌阶段'); - player.addSkill('sbqiaobian_draw'); - break; - case 'phaseUse': - if(!result.cards||!result.cards.length) player.logSkill('sbqiaobian',target); - player.skip('phaseDiscard'); - game.log(player,'跳过了出牌阶段'); - game.log(player,'跳过了弃牌阶段'); - player.moveCard(); - break; + break; + case "phaseDraw": + player.logSkill("sbqiaobian"); + game.log(player, "跳过了摸牌阶段"); + player.addSkill("sbqiaobian_draw"); + break; + case "phaseUse": + if (!result.cards || !result.cards.length) + player.logSkill("sbqiaobian", target); + player.skip("phaseDiscard"); + game.log(player, "跳过了出牌阶段"); + game.log(player, "跳过了弃牌阶段"); + player.moveCard(); + break; } - } - else player.storage.counttrigger.sbqiaobian--; + } else player.storage.counttrigger.sbqiaobian--; }, - subSkill:{ - draw:{ - charlotte:true, - mark:true, - intro:{content:'准备阶段摸五张牌并回复1点体力'}, - audio:'sbqiaobian', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - player.removeSkill('sbqiaobian_draw'); + subSkill: { + draw: { + charlotte: true, + mark: true, + intro: { content: "准备阶段摸五张牌并回复1点体力" }, + audio: "sbqiaobian", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + player.removeSkill("sbqiaobian_draw"); player.draw(5); player.recover(); }, @@ -2282,4850 +3036,5975 @@ game.import('character', function () { }, }, //萌货 - sbhuoshou:{ - audio:2, - trigger:{ - player:'phaseUseBegin', + sbhuoshou: { + audio: 2, + trigger: { + player: "phaseUseBegin", }, - filter:function(event,player){ + filter: function (event, player) { return true; }, - forced:true, - onremove:true, - group:['sbhuoshou_cancel','sbhuoshou_source','sbhuoshou_nanmaned'], - content:function(){ - 'step 0' - var card=get.discardPile(card=>{ - return card.name=='nanman'; + forced: true, + onremove: true, + group: ["sbhuoshou_cancel", "sbhuoshou_source", "sbhuoshou_nanmaned"], + content: function () { + "step 0"; + var card = get.discardPile((card) => { + return card.name == "nanman"; }); - if(card){ - player.gain(card,'gain2'); - } - else{ - game.log('但是弃牌堆里并没有','#y南蛮入侵','!'); - player.addMark('sbhuoshou',1,false); - if(player.countMark('sbhuoshou')>=5&&Math.random()<0.25) player.chat('我南蛮呢'); + if (card) { + player.gain(card, "gain2"); + } else { + game.log("但是弃牌堆里并没有", "#y南蛮入侵", "!"); + player.addMark("sbhuoshou", 1, false); + if (player.countMark("sbhuoshou") >= 5 && Math.random() < 0.25) + player.chat("我南蛮呢"); } }, - subSkill:{ - cancel:{ - audio:'sbhuoshou', - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - filter:function(event,player){ - return (event.card.name=='nanman'); + subSkill: { + cancel: { + audio: "sbhuoshou", + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter: function (event, player) { + return event.card.name == "nanman"; }, - content:function(){ + content: function () { trigger.cancel(); }, }, - source:{ - audio:'sbhuoshou', - trigger:{global:'useCardToPlayered'}, - forced:true, - filter:function(event,player){ - return event.isFirstTarget&&event.card&&event.card.name=='nanman'&&event.player!=player; + source: { + audio: "sbhuoshou", + trigger: { global: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return ( + event.isFirstTarget && + event.card && + event.card.name == "nanman" && + event.player != player + ); + }, + content: function () { + trigger.getParent().customArgs.default.customSource = player; }, - content:function(){ - trigger.getParent().customArgs.default.customSource=player; - } }, - nanmaned:{ - trigger:{ - player:'useCard1', + nanmaned: { + trigger: { + player: "useCard1", }, - filter:function(event,player){ - return event.card.name=='nanman'; + filter: function (event, player) { + return event.card.name == "nanman"; + }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + player.addTempSkill("sbhuoshou_ban", "phaseUseAfter"); }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - 'step 0' - player.addTempSkill('sbhuoshou_ban','phaseUseAfter'); - } }, - ban:{ - charlotte:true, - intro:{ - content:'此阶段不能再使用【南蛮入侵】', - } + ban: { + charlotte: true, + intro: { + content: "此阶段不能再使用【南蛮入侵】", + }, }, }, - mod:{ - cardEnabled:function(card,player){ - if(player.hasSkill('sbhuoshou_ban')&&card.name=='nanman') return false; + mod: { + cardEnabled: function (card, player) { + if (player.hasSkill("sbhuoshou_ban") && card.name == "nanman") return false; }, }, - ai:{ - threaten:1.9, - } + ai: { + threaten: 1.9, + }, }, - sbzaiqi:{ - audio:2, - trigger:{ - player:'phaseDiscardEnd', + sbzaiqi: { + audio: 2, + trigger: { + player: "phaseDiscardEnd", }, - chargeSkill:true, - filter:function(event,player){ - return player.hasMark('charge'); + chargeSkill: true, + filter: function (event, player) { + return player.hasMark("charge"); }, - group:'sbzaiqi_backflow', - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('sbzaiqi'),'选择任意名角色并消耗等量蓄力值,令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力',[1,player.countMark('charge')]).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - return 3-get.sgn(att)+Math.abs(att/1000); - }); - 'step 1' - if(result.bool){ - var targets=result.targets; + group: "sbzaiqi_backflow", + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("sbzaiqi"), + "选择任意名角色并消耗等量蓄力值,令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力", + [1, player.countMark("charge")] + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + return 3 - get.sgn(att) + Math.abs(att / 1000); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; targets.sortBySeat(); - event.targets=targets; - player.logSkill('sbzaiqi',targets); - player.removeMark('charge',targets.length); - } - else event.finish(); - 'step 2' - var target=targets.shift(); - event.target=target; - if(!target.countCards('he')) event._result={bool:false}; - else target.chooseToDiscard(get.translation(player)+'对你发动了【再起】','是否弃置一张牌令其回复1点体力?或者点击“取消”,令该角色摸一张牌。','he').set('ai',card=>{ - var eff=_status.event.eff,att=_status.event.att; - if(eff>0&&att>0||eff<=0&&att<0) return 5.5-get.value(card); - return 0; - }).set('eff',get.recoverEffect(player,player,target)).set('att',get.attitude(target,player)); - 'step 3' + event.targets = targets; + player.logSkill("sbzaiqi", targets); + player.removeMark("charge", targets.length); + } else event.finish(); + ("step 2"); + var target = targets.shift(); + event.target = target; + if (!target.countCards("he")) event._result = { bool: false }; + else + target + .chooseToDiscard( + get.translation(player) + "对你发动了【再起】", + "是否弃置一张牌令其回复1点体力?或者点击“取消”,令该角色摸一张牌。", + "he" + ) + .set("ai", (card) => { + var eff = _status.event.eff, + att = _status.event.att; + if ((eff > 0 && att > 0) || (eff <= 0 && att < 0)) + return 5.5 - get.value(card); + return 0; + }) + .set("eff", get.recoverEffect(player, player, target)) + .set("att", get.attitude(target, player)); + ("step 3"); target.line(player); - if(result.bool){ + if (result.bool) { player.recover(); - } - else{ + } else { player.draw(); } game.delayex(); - if(targets.length) event.goto(2); + if (targets.length) event.goto(2); }, - subSkill:{ - backflow:{ - audio:'sbzaiqi', - trigger:{ + subSkill: { + backflow: { + audio: "sbzaiqi", + trigger: { //player:'enterGame', - source:'damageSource', + source: "damageSource", //global:'phaseBefore', }, - usable:1, - filter:function(event,player){ - if(event.name=='damage') return true; - return (event.name!='phase'||game.phaseNumber==0); + usable: 1, + filter: function (event, player) { + if (event.name == "damage") return true; + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - content:function(){ - player.addMark('charge',trigger.name=='damage'?1:3); - } - } - } + forced: true, + locked: false, + content: function () { + player.addMark("charge", trigger.name == "damage" ? 1 : 3); + }, + }, + }, }, //祝融 - sblieren:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.targets.length==1&&event.card.name=='sha'&&player.canCompare(event.target,true); + sblieren: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return ( + event.targets.length == 1 && + event.card.name == "sha" && + player.canCompare(event.target, true) + ); }, - check:function(event,player){ - return get.attitude(player,event.target)<=0||game.hasPlayer(current=>get.damageEffect(current,player,player)>0); + check: function (event, player) { + return ( + get.attitude(player, event.target) <= 0 || + game.hasPlayer((current) => get.damageEffect(current, player, player) > 0) + ); }, - shaRelated:true, - logTarget:'target', - content:function(){ - 'step 0' + shaRelated: true, + logTarget: "target", + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.canCompare(trigger.target)) player.chooseToCompare(trigger.target); + ("step 1"); + if (player.canCompare(trigger.target)) player.chooseToCompare(trigger.target); else event.finish(); - 'step 2' - if(result.bool){ - player.addTempSkill('sblieren_damage'); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.sblieren=[player,trigger.target]; + ("step 2"); + if (result.bool) { + player.addTempSkill("sblieren_damage"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sblieren = [player, trigger.target]; } }, - subSkill:{ - damage:{ - audio:'sblieren', - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.card.storage&&event.card.storage.sblieren&&event.card.storage.sblieren[0]==player&&game.hasPlayer(current=>{ - return !event.card.storage.sblieren.includes(current); - }); + subSkill: { + damage: { + audio: "sblieren", + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.card.storage && + event.card.storage.sblieren && + event.card.storage.sblieren[0] == player && + game.hasPlayer((current) => { + return !event.card.storage.sblieren.includes(current); + }) + ); }, - direct:true, - charlotte:true, - content:function(){ - 'step 0' - var target=trigger.card.storage.sblieren[1]; - player.chooseTarget('烈刃:是否对除'+get.translation(target)+'外的一名其他角色造成1点伤害?',(card,player,target)=>{ - return target!=_status.event.targeted&&target!=player; - }).set('targeted',target).set('ai',targetx=>get.damageEffect(targetx,_status.event.player,_status.event.player)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sblieren_damage',target); + direct: true, + charlotte: true, + content: function () { + "step 0"; + var target = trigger.card.storage.sblieren[1]; + player + .chooseTarget( + "烈刃:是否对除" + + get.translation(target) + + "外的一名其他角色造成1点伤害?", + (card, player, target) => { + return target != _status.event.targeted && target != player; + } + ) + .set("targeted", target) + .set("ai", (targetx) => + get.damageEffect(targetx, _status.event.player, _status.event.player) + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sblieren_damage", target); target.damage(); } - } - } - } + }, + }, + }, }, - sbjuxiang:{ - audio:2, - trigger:{ - player:'phaseJieshuBegin', + sbjuxiang: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", }, - forced:true, - direct:true, - filter:function(event,player){ - return !player.hasHistory('useCard',evt=>evt.card.name=='nanman')&&(!_status.sbjuxiang_nanman||_status.sbjuxiang_nanman.length); + forced: true, + direct: true, + filter: function (event, player) { + return ( + !player.hasHistory("useCard", (evt) => evt.card.name == "nanman") && + (!_status.sbjuxiang_nanman || _status.sbjuxiang_nanman.length) + ); }, - group:['sbjuxiang_cancel','sbjuxiang_gain'], - content:function(){ - 'step 0' - if(!_status.sbjuxiang_nanman){ - _status.sbjuxiang_nanman=[ - {name:'nanman',number:7,suit:'spade'}, - {name:'nanman',number:7,suit:'club'}, + group: ["sbjuxiang_cancel", "sbjuxiang_gain"], + content: function () { + "step 0"; + if (!_status.sbjuxiang_nanman) { + _status.sbjuxiang_nanman = [ + { name: "nanman", number: 7, suit: "spade" }, + { name: "nanman", number: 7, suit: "club" }, ]; - game.broadcastAll(function(){ - if(!lib.inpile.includes('nanman')) lib.inpile.add('nanman'); + game.broadcastAll(function () { + if (!lib.inpile.includes("nanman")) lib.inpile.add("nanman"); }); } - player.chooseTarget(get.prompt('sbjuxiang'),'将游戏外的随机一张【南蛮入侵】交给一名角色(剩余'+get.cnNumber(_status.sbjuxiang_nanman.length)+'张)').set('ai',target=>{ - var player=_status.event.player; - return Math.max(0,target.getUseValue({name:'nanman'}))*get.attitude(player,target)*(target==player?0.5:1); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbjuxiang',target); - if(!_status.sbjuxiang_nanman.length) return; - var info=_status.sbjuxiang_nanman.randomRemove(); - var card=game.createCard2(info); - target.gain(card,'gain2').giver=player; + player + .chooseTarget( + get.prompt("sbjuxiang"), + "将游戏外的随机一张【南蛮入侵】交给一名角色(剩余" + + get.cnNumber(_status.sbjuxiang_nanman.length) + + "张)" + ) + .set("ai", (target) => { + var player = _status.event.player; + return ( + Math.max(0, target.getUseValue({ name: "nanman" })) * + get.attitude(player, target) * + (target == player ? 0.5 : 1) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbjuxiang", target); + if (!_status.sbjuxiang_nanman.length) return; + var info = _status.sbjuxiang_nanman.randomRemove(); + var card = game.createCard2(info); + target.gain(card, "gain2").giver = player; } }, - ai:{ - expose:0.05, - effect:{ - target:function(card){ - if(card.name=='nanman') return [0,1]; - } - } - }, - subSkill:{ - cancel:{ - audio:'sbjuxiang', - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - filter:function(event,player){ - return event.card.name=='nanman'; + ai: { + expose: 0.05, + effect: { + target: function (card) { + if (card.name == "nanman") return [0, 1]; }, - content:function(){ - trigger.cancel(); - } }, - gain:{ - audio:'sbjuxiang', - trigger:{global:'useCardAfter'}, - forced:true, - filter:function(event,player){ - return event.card.name=='nanman'&&event.player!=player&&event.cards.filterInD().length; + }, + subSkill: { + cancel: { + audio: "sbjuxiang", + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter: function (event, player) { + return event.card.name == "nanman"; }, - content:function(){ - player.gain(trigger.cards.filterInD(),'gain2'); - } - } - } + content: function () { + trigger.cancel(); + }, + }, + gain: { + audio: "sbjuxiang", + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "nanman" && + event.player != player && + event.cards.filterInD().length + ); + }, + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + }, }, //阿笨 - sbjiang:{ - audio:2, - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + sbjiang: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - shaRelated:true, - filter:function(event,player){ - if(!(event.card.name=='juedou'||(event.card.name=='sha'&&get.color(event.card)=='red'))) return false; + shaRelated: true, + filter: function (event, player) { + if ( + !( + event.card.name == "juedou" || + (event.card.name == "sha" && get.color(event.card) == "red") + ) + ) + return false; return true; }, - frequent:true, - onremove:true, - group:['sbjiang_add','sbjiang_qiben'], - content:function(){ + frequent: true, + onremove: true, + group: ["sbjiang_add", "sbjiang_qiben"], + content: function () { player.draw(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name=='sha'&&get.color(card)=='red') return [1,0.6]; + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; }, - player:function(card,player,target){ - if(card.name=='sha'&&get.color(card)=='red') return [1,1]; - } - } + player: function (card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 1]; + }, + }, }, - subSkill:{ - add:{ - audio:'sbjiang', - trigger:{player:'useCard2'}, - direct:true, - filter:function(event,player){ - if(event.card.name!='juedou') return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })){ + subSkill: { + add: { + audio: "sbjiang", + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + if (event.card.name != "juedou") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'额外指定一个目标,然后失去1点体力'; - player.chooseTarget(get.prompt('sbjiang_add'),function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var eff=get.effect(target,trigger.card,player,player); - if(player.hasZhuSkill('sbzhiba')&&!player.hasMark('sbjiang')) return eff; - if(eff+get.effect(player,{name:'losehp'},player)/8>0) return eff; - return 0; - }).set('targets',trigger.targets).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = + "为" + get.translation(trigger.card) + "额外指定一个目标,然后失去1点体力"; + player + .chooseTarget(get.prompt("sbjiang_add"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var eff = get.effect(target, trigger.card, player, player); + if (player.hasZhuSkill("sbzhiba") && !player.hasMark("sbjiang")) + return eff; + if (eff + get.effect(player, { name: "losehp" }, player) / 8 > 0) + return eff; + return 0; + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('sbjiang_add',event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("sbjiang_add", event.targets); trigger.targets.addArray(event.targets); player.loseHp(); } - } + }, }, - qiben:{ - audio:'sbjiang', - enable:'phaseUse', - viewAs:{name:'juedou'}, - filterCard:true, - position:'h', - selectCard:-1, - prompt:function(){ - var player=_status.event.player; - var limit=(player.hasMark('sbjiang')?(game.countPlayer(current=>{ - return current.group=='wu'&¤t!=player; - })+1):1); - return '出牌阶段限'+get.cnNumber(limit)+'次。你可以将所有手牌当【决斗】使用'; + qiben: { + audio: "sbjiang", + enable: "phaseUse", + viewAs: { name: "juedou" }, + filterCard: true, + position: "h", + selectCard: -1, + prompt: function () { + var player = _status.event.player; + var limit = player.hasMark("sbjiang") + ? game.countPlayer((current) => { + return current.group == "wu" && current != player; + }) + 1 + : 1; + return "出牌阶段限" + get.cnNumber(limit) + "次。你可以将所有手牌当【决斗】使用"; }, - filter:function(event,player){ - var limit=player.hasMark('sbjiang')?(game.countPlayer(current=>{ - return current.group=='wu'&¤t!=player; - })+1):1; - if((player.getStat('skill').sbjiang_qiben||0)>=limit) return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i=0;i { + return current.group == "wu" && current != player; + }) + 1 + : 1; + if ((player.getStat("skill").sbjiang_qiben || 0) >= limit) return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i = 0; i < hs.length; i++) { + var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; } - return event.filterCard(get.autoViewAs({name:'juedou'},hs)); + return event.filterCard(get.autoViewAs({ name: "juedou" }, hs)); }, - ai:{ - order:0.001, - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep'){ - if(arg&&(!arg.card||get.name(arg.card)!=='tao')) return false; - let limit=player.hasMark('sbjiang')?(game.countPlayer(current=>{ - return current.group=='wu'&¤t!=player; - })+1):1; - return player.isPhaseUsing()&&(player.getStat('skill').sbjiang_qiben||0)get.name(card)!='tao','h'); + ai: { + order: 0.001, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") { + if (arg && (!arg.card || get.name(arg.card) !== "tao")) return false; + let limit = player.hasMark("sbjiang") + ? game.countPlayer((current) => { + return current.group == "wu" && current != player; + }) + 1 + : 1; + return ( + player.isPhaseUsing() && + (player.getStat("skill").sbjiang_qiben || 0) < limit && + player.hasCard((card) => get.name(card) != "tao", "h") + ); } - } + }, }, - } + }, }, }, - sbhunzi:{ - audio:2, - trigger:{player:'dyingAfter'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'wood', - derivation:['sbyingzi','gzyinghun'], - content:function(){ - 'step 0' - player.awakenSkill('sbhunzi'); + sbhunzi: { + audio: 2, + trigger: { player: "dyingAfter" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "wood", + derivation: ["sbyingzi", "gzyinghun"], + content: function () { + "step 0"; + player.awakenSkill("sbhunzi"); player.loseMaxHp(); - 'step 1' - player.changeHujia(1,null,true); - 'step 2' + ("step 1"); + player.changeHujia(1, null, true); + ("step 2"); player.draw(3); - 'step 3' - player.addSkills(['sbyingzi','gzyinghun']); + ("step 3"); + player.addSkills(["sbyingzi", "gzyinghun"]); }, - ai:{ - threaten:function(player,target){ - if(target.hp==1) return 2; + ai: { + threaten: function (player, target) { + if (target.hp == 1) return 2; return 0.5; }, - maixie:true, - effect:{ - target:function(card,player,target){ - if(!target.hasFriend()||target.hp>1) return; - if(get.tag(card,'damage')==1&&((target.hasZhuSkill('sbzhiba')&&game.countPlayer(current=>current!=target&¤t.group=='wu'))||player.countCards('hs',card=>player.canSaveCard(card,target))+target.countCards('hs',card=>target.canSaveCard(card,target))>0)&&!target.isTurnedOver()&&_status.currentPhase!=target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [0.5,1]; - } - } - } - }, - sbzhiba:{ - audio:2, - trigger:{player:'dying'}, - filter:function(event,player){ - if(!player.hasZhuSkill('sbzhiba')) return false; - return player.hp<=0; - }, - zhuSkill:true, - limited:true, - mark:true, - skillAnimation:true, - animationColor:'wood', - content:function(){ - 'step 0' - player.awakenSkill('sbzhiba'); - event.targets=game.filterPlayer(current=>{ - return current.group=='wu'&¤t!=player; - }).sortBySeat(_status.currentPhase); - var num=event.targets.length; - if(num>0) player.recover(num); - player.addMark('sbjiang',1,false); - player.addTempSkill('sbzhiba_draw'); - if(!event.targets.length) event.finish(); - 'step 1' - var target=targets.shift(); - target.damage('nosource'); - if(targets.length) event.redo(); - }, - subSkill:{ - draw:{ - trigger:{global:'dieAfter'}, - filter:function(event,player){ - return event.getParent(3).name=='sbzhiba'; + maixie: true, + effect: { + target: function (card, player, target) { + if (!target.hasFriend() || target.hp > 1) return; + if ( + get.tag(card, "damage") == 1 && + ((target.hasZhuSkill("sbzhiba") && + game.countPlayer( + (current) => current != target && current.group == "wu" + )) || + player.countCards("hs", (card) => player.canSaveCard(card, target)) + + target.countCards("hs", (card) => target.canSaveCard(card, target)) > + 0) && + !target.isTurnedOver() && + _status.currentPhase != target && + get.distance(_status.currentPhase, target, "absolute") <= 3 + ) + return [0.5, 1]; }, - forced:true, - charlotte:true, - content:function(){ + }, + }, + }, + sbzhiba: { + audio: 2, + trigger: { player: "dying" }, + filter: function (event, player) { + if (!player.hasZhuSkill("sbzhiba")) return false; + return player.hp <= 0; + }, + zhuSkill: true, + limited: true, + mark: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.awakenSkill("sbzhiba"); + event.targets = game + .filterPlayer((current) => { + return current.group == "wu" && current != player; + }) + .sortBySeat(_status.currentPhase); + var num = event.targets.length; + if (num > 0) player.recover(num); + player.addMark("sbjiang", 1, false); + player.addTempSkill("sbzhiba_draw"); + if (!event.targets.length) event.finish(); + ("step 1"); + var target = targets.shift(); + target.damage("nosource"); + if (targets.length) event.redo(); + }, + subSkill: { + draw: { + trigger: { global: "dieAfter" }, + filter: function (event, player) { + return event.getParent(3).name == "sbzhiba"; + }, + forced: true, + charlotte: true, + content: function () { player.draw(3); - } - } - } + }, + }, + }, }, //大乔 - sbguose:{ - audio:2, - enable:'phaseUse', - get usable(){ - return get.mode()=='identity'?4:2; + sbguose: { + audio: 2, + enable: "phaseUse", + get usable() { + return get.mode() == "identity" ? 4 : 2; }, - discard:false, - lose:false, - delay:false, - filter:function(event,player){ - return player.hasCard(card=>get.suit(card)=='diamond','hes')||game.hasPlayer(current=>current.hasJudge('lebu')); + discard: false, + lose: false, + delay: false, + filter: function (event, player) { + return ( + player.hasCard((card) => get.suit(card) == "diamond", "hes") || + game.hasPlayer((current) => current.hasJudge("lebu")) + ); }, - position:'hes', - filterCard:function(card,player){ - if(get.suit(card)!='diamond') return false; - var mod=game.checkMod(ui.selected.cards[0],player,'unchanged','cardEnabled2',player); - if(!mod) return false; + position: "hes", + filterCard: function (card, player) { + if (get.suit(card) != "diamond") return false; + var mod = game.checkMod( + ui.selected.cards[0], + player, + "unchanged", + "cardEnabled2", + player + ); + if (!mod) return false; return true; }, - selectCard:[0,1], - filterTarget:function(card,player,target){ - if(!ui.selected.cards.length){ - if(target.hasJudge('lebu')) return true; + selectCard: [0, 1], + filterTarget: function (card, player, target) { + if (!ui.selected.cards.length) { + if (target.hasJudge("lebu")) return true; return false; } - if(player==target) return false; - return player.canUse(get.autoViewAs({name:'lebu'},ui.selected.cards),target); + if (player == target) return false; + return player.canUse(get.autoViewAs({ name: "lebu" }, ui.selected.cards), target); }, - complexSelect:true, - check:function(card){ - return 7-get.value(card); + complexSelect: true, + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - 'step 0' - if(target.hasJudge('lebu')){ - target.discard(target.getJudge('lebu')); + content: function () { + "step 0"; + if (target.hasJudge("lebu")) { + target.discard(target.getJudge("lebu")); + } else { + player.useCard({ name: "lebu" }, target, cards).audio = false; } - else{ - player.useCard({name:'lebu'},target,cards).audio=false; - } - 'step 1' + ("step 1"); player.draw(); }, - ai:{ - result:{ - target:function(player,target){ - if(target.hasJudge('lebu')) return -get.effect(target,{name:'lebu'},player,target); - return get.effect(target,{name:'lebu'},player,target); - } + ai: { + result: { + target: function (player, target) { + if (target.hasJudge("lebu")) + return -get.effect(target, { name: "lebu" }, player, target); + return get.effect(target, { name: "lebu" }, player, target); + }, }, - order:9, - } + order: 9, + }, }, - sbliuli:{ - audio:2, - inherit:'liuli', - group:'sbliuli_heart', - subSkill:{ - heart:{ - trigger:{player:'logSkill'}, - filter:function(event,player){ - if(event.skill!='sbliuli') return false; - if(player.hasSkill('sbliuli_used')) return false; - var evt=event.log_event; - return player.hasHistory('lose',evtx=>{ - return evtx.getParent(2)==evt&&get.suit(evtx.cards[0])=='heart'; + sbliuli: { + audio: 2, + inherit: "liuli", + group: "sbliuli_heart", + subSkill: { + heart: { + trigger: { player: "logSkill" }, + filter: function (event, player) { + if (event.skill != "sbliuli") return false; + if (player.hasSkill("sbliuli_used")) return false; + var evt = event.log_event; + return player.hasHistory("lose", (evtx) => { + return evtx.getParent(2) == evt && get.suit(evtx.cards[0]) == "heart"; }); }, - direct:true, - content:function(){ - 'step 0' - var sourcex=trigger.log_event.getTrigger().player; - player.chooseTarget('流离:是否令一名不为'+get.translation(sourcex)+'的其他角色获得“流离”标记?',(card,player,target)=>{ - return target!=player&&target!=_status.event.sourcex; - }).set('ai',target=>{ - return get.attitude(_status.event.player,target); - }).set('sourcex',sourcex); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - game.countPlayer(i=>i.removeSkill('sbliuli_dangxian')); - target.addSkill('sbliuli_dangxian'); - player.addTempSkill('sbliuli_used'); + direct: true, + content: function () { + "step 0"; + var sourcex = trigger.log_event.getTrigger().player; + player + .chooseTarget( + "流离:是否令一名不为" + + get.translation(sourcex) + + "的其他角色获得“流离”标记?", + (card, player, target) => { + return target != player && target != _status.event.sourcex; + } + ) + .set("ai", (target) => { + return get.attitude(_status.event.player, target); + }) + .set("sourcex", sourcex); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.countPlayer((i) => i.removeSkill("sbliuli_dangxian")); + target.addSkill("sbliuli_dangxian"); + player.addTempSkill("sbliuli_used"); } - } + }, }, - used:{charlotte:true}, - dangxian:{ - trigger:{player:'phaseBegin'}, - forced:true, - charlotte:true, - mark:true, - marktext:'流', - intro:{content:'回合开始时,执行一个额外的出牌阶段'}, - content:function(){ - var next=player.phaseUse(); + used: { charlotte: true }, + dangxian: { + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + mark: true, + marktext: "流", + intro: { content: "回合开始时,执行一个额外的出牌阶段" }, + content: function () { + var next = player.phaseUse(); event.next.remove(next); trigger.next.push(next); - player.removeSkill('sbliuli_dangxian'); - } - } - } + player.removeSkill("sbliuli_dangxian"); + }, + }, + }, }, //刘表 - sbzishou:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - if(player==event.player) return false; - if(!event.player.countCards('he')) return false; - return !event.player.hasAllHistory('sourceDamage',evt=>{ - return evt.player==player; - })&&!event.player.hasAllHistory('damage',evt=>{ - return evt.source==player; - }); + sbzishou: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + if (!event.player.countCards("he")) return false; + return ( + !event.player.hasAllHistory("sourceDamage", (evt) => { + return evt.player == player; + }) && + !event.player.hasAllHistory("damage", (evt) => { + return evt.source == player; + }) + ); }, - forced:true, - logTarget:'player', - content:function(){ - 'step 0' - trigger.player.chooseCard(true,get.translation(player)+'对你发动了【自守】','交给其一张牌','he'); - 'step 1' - if(result.bool){ - trigger.player.give(result.cards,player); + forced: true, + logTarget: "player", + content: function () { + "step 0"; + trigger.player.chooseCard( + true, + get.translation(player) + "对你发动了【自守】", + "交给其一张牌", + "he" + ); + ("step 1"); + if (result.bool) { + trigger.player.give(result.cards, player); } }, - ai:{ - threaten:3, - } + ai: { + threaten: 3, + }, }, - sbzongshi:{ - audio:2, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - return !player.getStorage('sbzongshi').includes(event.source); + sbzongshi: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return !player.getStorage("sbzongshi").includes(event.source); }, - forced:true, - onremove:true, - logTarget:'source', - content:function(){ - trigger.source.chooseToDiscard(true,trigger.source.countCards('h')); - player.markAuto('sbzongshi',[trigger.source]); + forced: true, + onremove: true, + logTarget: "source", + content: function () { + trigger.source.chooseToDiscard(true, trigger.source.countCards("h")); + player.markAuto("sbzongshi", [trigger.source]); }, - intro:{ - content:'已扒过目标:$' + intro: { + content: "已扒过目标:$", }, - ai:{ - threaten:0.5, - effect:{ - target:function(card,player,target,current){ - if(player._sbzongshi_aiChecking) return; - if(!get.tag(card,'damage')) return; - var cards=player.getCards('h'); - if(!target.hasFriend()) return; - player._sbzongshi_aiChecking=true; - var value=cards.reduce((p,c)=>{ - return p+get.value(c); - },0); + ai: { + threaten: 0.5, + effect: { + target: function (card, player, target, current) { + if (player._sbzongshi_aiChecking) return; + if (!get.tag(card, "damage")) return; + var cards = player.getCards("h"); + if (!target.hasFriend()) return; + player._sbzongshi_aiChecking = true; + var value = cards.reduce((p, c) => { + return p + get.value(c); + }, 0); delete player._sbzongshi_aiChecking; - if(cards.length>5||value>5*cards.length) return [1,0,0,-cards.length/2]; - return [1,0,0,-0.5]; - } - } - } + if (cards.length > 5 || value > 5 * cards.length) + return [1, 0, 0, -cards.length / 2]; + return [1, 0, 0, -0.5]; + }, + }, + }, }, //貂蝉 - sblijian:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return !player.getStat('skill').sblijian&&game.countPlayer(current=>{ - return current!=player; - })>1; + sblijian: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + !player.getStat("skill").sblijian && + game.countPlayer((current) => { + return current != player; + }) > 1 + ); }, - filterCard:true, - selectCard:[1,Infinity], - position:'he', - filterTarget:lib.filter.notMe, - selectTarget:function(){ - return ui.selected.cards.length+1; + filterCard: true, + selectCard: [1, Infinity], + position: "he", + filterTarget: lib.filter.notMe, + selectTarget: function () { + return ui.selected.cards.length + 1; }, - filterOk:function(){ - return ui.selected.targets.length==ui.selected.cards.length+1; + filterOk: function () { + return ui.selected.targets.length == ui.selected.cards.length + 1; }, - check:function(card){ - let player=get.owner(card),targets=lib.skill.sblijian.selectTargetAi(_status.event,player); - if(ui.selected.cards.length{ - let cache=_status.event.getTempCache('sblijian','targets'); - if(Array.isArray(cache)) return cache.length; - let targets=[],cards=[0],sbbiyue=player.hasSkill('sbbiyue')?Math.max(0,3-game.countPlayer2(current=>{ - return current.getHistory('damage').length>0; - })):0,alter=[null,1,1],temp; - for(let i of game.players){ - if(player===i) continue; - let vplayer=ui.create.player(i); - temp=get.effect(i,new lib.element.VCard({name:'juedou',isCard:true}),vplayer,i); + selectTargetAi: (event, player) => { + let cache = _status.event.getTempCache("sblijian", "targets"); + if (Array.isArray(cache)) return cache.length; + let targets = [], + cards = [0], + sbbiyue = player.hasSkill("sbbiyue") + ? Math.max( + 0, + 3 - + game.countPlayer2((current) => { + return current.getHistory("damage").length > 0; + }) + ) + : 0, + alter = [null, 1, 1], + temp; + for (let i of game.players) { + if (player === i) continue; + let vplayer = ui.create.player(i); + temp = get.effect( + i, + new lib.element.VCard({ name: "juedou", isCard: true }), + vplayer, + i + ); vplayer.remove(); - if(temp){ - let att=get.attitude(event.player,i); - if(!att&&sbbiyue||att*temp>0) targets.push([i,temp,att]); - else if(!alter[2]) continue; - else if(!att||att>0&&temp>-15&&i.hp>2||att<0&&temp<15) alter=[i,temp,att]; + if (temp) { + let att = get.attitude(event.player, i); + if ((!att && sbbiyue) || att * temp > 0) targets.push([i, temp, att]); + else if (!alter[2]) continue; + else if (!att || (att > 0 && temp > -15 && i.hp > 2) || (att < 0 && temp < 15)) + alter = [i, temp, att]; } } - targets.sort((a,b)=>{ - if(Boolean(a[2])!==Boolean(b[2])) return Math.abs(b[2])-Math.abs(a[2]); - return Math.abs(b[1])-Math.abs(a[1]); + targets.sort((a, b) => { + if (Boolean(a[2]) !== Boolean(b[2])) return Math.abs(b[2]) - Math.abs(a[2]); + return Math.abs(b[1]) - Math.abs(a[1]); }); - if(targets.length<2&&alter[0]) targets.push(alter); - targets=targets.slice(0,1+player.countCards('he',card=>{ - if(lib.filter.cardDiscardable(card,player,'sblijian')){ - cards.push(get.value(card)); - return true; - } - return false; - })); - cards.sort((a,b)=>a-b); - for(let i=0;i { + if (lib.filter.cardDiscardable(card, player, "sblijian")) { + cards.push(get.value(card)); + return true; + } + return false; + }) + ); + cards.sort((a, b) => a - b); + for (let i = 0; i < targets.length; i++) { + if (Math.abs(targets[i][1]) < cards[i] / (1 + sbbiyue)) { + targets.splice(i, targets.length - i); break; } } - if(targets.length<2){ - event.putTempCache('sblijian','targets',[]); + if (targets.length < 2) { + event.putTempCache("sblijian", "targets", []); return 0; } - event.putTempCache('sblijian','targets',targets); + event.putTempCache("sblijian", "targets", targets); return targets.length; }, - multiline:true, - content:function(){ - var targetx=targets.slice().sortBySeat(target)[1]; - var card={name:'juedou',isCard:true}; - if(target.canUse(card,targetx)) target.useCard(card,targetx); + multiline: true, + content: function () { + var targetx = targets.slice().sortBySeat(target)[1]; + var card = { name: "juedou", isCard: true }; + if (target.canUse(card, targetx)) target.useCard(card, targetx); }, - ai:{ - threaten:3, - order:7, - result:{ - player:function(player,target){ - let targets=_status.event.getTempCache('sblijian','targets'); - if(Array.isArray(targets)) for(let arr of targets){ - if(target===arr[0]&&!arr[2]) return 1; - } + ai: { + threaten: 3, + order: 7, + result: { + player: function (player, target) { + let targets = _status.event.getTempCache("sblijian", "targets"); + if (Array.isArray(targets)) + for (let arr of targets) { + if (target === arr[0] && !arr[2]) return 1; + } return 0; }, - target:function(player,target){ - let targets=_status.event.getTempCache('sblijian','targets'); - if(Array.isArray(targets)) for(let arr of targets){ - if(target===arr[0]){ - if(arr[1]*arr[2]<0) return get.sgn(arr[2]); - return arr[1]; + target: function (player, target) { + let targets = _status.event.getTempCache("sblijian", "targets"); + if (Array.isArray(targets)) + for (let arr of targets) { + if (target === arr[0]) { + if (arr[1] * arr[2] < 0) return get.sgn(arr[2]); + return arr[1]; + } } - } return 0; - } - } - } + }, + }, + }, }, - sbbiyue:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - content:function(){ - player.draw(Math.min(4,game.countPlayer2(current=>{ - return current.getHistory('damage').length>0; - })+1)); - } + sbbiyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content: function () { + player.draw( + Math.min( + 4, + game.countPlayer2((current) => { + return current.getHistory("damage").length > 0; + }) + 1 + ) + ); + }, }, //陈宫 - sbmingce:{ - audio:2, - enable:'phaseUse', - usable:1, - position:'he', - filter:function(event,player){ - return player.countCards('he')>0; + sbmingce: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - check:function(card){ - return 8-get.value(card) + filterCard: true, + check: function (card) { + return 8 - get.value(card); }, - filterTarget:lib.filter.notMe, - selectTarget:1, - discard:false, - lose:false, - delay:false, - onremove:true, - group:'sbmingce_hit', - content:function(){ - 'step 0' - player.give(cards,target); - 'step 1' - var choices=['选项二']; - var choiceList=[ - '失去1点体力,令'+get.translation(player)+'摸两张牌并获得1枚“策”', - '摸一张牌' + filterTarget: lib.filter.notMe, + selectTarget: 1, + discard: false, + lose: false, + delay: false, + onremove: true, + group: "sbmingce_hit", + content: function () { + "step 0"; + player.give(cards, target); + ("step 1"); + var choices = ["选项二"]; + var choiceList = [ + "失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", + "摸一张牌", ]; - if(target.hp>0) choices.unshift('选项一'); - else choiceList[0]=''+choiceList[0]+''; - target.chooseControl(choices).set('choiceList', choiceList).set('prompt',get.translation(player)+'对你发动了【明策】,请选择一项').set('ai',()=>{ - return _status.event.choice; - }).set('choice',target.hp<=0||((target.hp+target.countCards('hs','tao')>2&&get.attitude(target,player)>0)||get.effect(target,{name:'losehp'},target,target)>0)&&target.hp>0?0:1); - 'step 2' - if(result.control=='选项一'){ + if (target.hp > 0) choices.unshift("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + target + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", get.translation(player) + "对你发动了【明策】,请选择一项") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + target.hp <= 0 || + (((target.hp + target.countCards("hs", "tao") > 2 && + get.attitude(target, player) > 0) || + get.effect(target, { name: "losehp" }, target, target) > 0) && + target.hp > 0) + ? 0 + : 1 + ); + ("step 2"); + if (result.control == "选项一") { target.loseHp(); player.draw(2); - } - else{ + } else { target.draw(); event.finish(); } - 'step 3' - player.addMark('sbmingce',1); + ("step 3"); + player.addMark("sbmingce", 1); }, - marktext:'笨', - intro:{ - name:'策(明策)', - name2:'策', - content:'mark' + marktext: "笨", + intro: { + name: "策(明策)", + name2: "策", + content: "mark", }, - ai:{ - result:{ - player:0.5, - target:1, + ai: { + result: { + player: 0.5, + target: 1, }, - order:8.5, - expose:0.2 + order: 8.5, + expose: 0.2, }, - subSkill:{ - hit:{ - audio:'sbmingce', - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.hasMark('sbmingce'); + subSkill: { + hit: { + audio: "sbmingce", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.hasMark("sbmingce"); }, - direct:true, - content:function(){ - 'step 0' - var num=player.countMark('sbmingce'); - event.num=num; - player.chooseTarget(get.prompt('sbmingce'),'移去所有“策”,对一名其他角色造成'+num+'点伤害',lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - var eff=get.damageEffect(target,player,player); - var num=player.countMark('sbmingce'); - if(target.hasSkillTag('filterDamage',null,{player:player})) num=1; - return eff*num; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbmingce_hit',target); - player.removeMark('sbmingce',num); + direct: true, + content: function () { + "step 0"; + var num = player.countMark("sbmingce"); + event.num = num; + player + .chooseTarget( + get.prompt("sbmingce"), + "移去所有“策”,对一名其他角色造成" + num + "点伤害", + lib.filter.notMe + ) + .set("ai", (target) => { + var player = _status.event.player; + var eff = get.damageEffect(target, player, player); + var num = player.countMark("sbmingce"); + if (target.hasSkillTag("filterDamage", null, { player: player })) num = 1; + return eff * num; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbmingce_hit", target); + player.removeMark("sbmingce", num); target.damage(num); } - } - } - } - }, - sbzhichi:{ - audio:2, - trigger:{player:'damageEnd'}, - forced:true, - content:function(){ - player.addTempSkill('sbzhichi_muteki'); + }, + }, }, - subSkill:{ - muteki:{ - audio:'sbzhichi', - trigger:{player:'damageBegin4'}, - charlotte:true, - forced:true, - group:'sbzhichi_egg', - content:function(){ + }, + sbzhichi: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + content: function () { + player.addTempSkill("sbzhichi_muteki"); + }, + subSkill: { + muteki: { + audio: "sbzhichi", + trigger: { player: "damageBegin4" }, + charlotte: true, + forced: true, + group: "sbzhichi_egg", + content: function () { trigger.cancel(); }, - mark:true, - intro:{content:'我无敌啦!'}, - ai:{ - maixie:true, - maixie_hp:true, - nofire:true, - nothunder:true, - nodamage:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')) return 'zeroplayertarget'; - } + mark: true, + intro: { content: "我无敌啦!" }, + ai: { + maixie: true, + maixie_hp: true, + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return "zeroplayertarget"; + }, }, - } - }, - egg:{ - trigger:{player:'die'}, - charlotte:true, - forced:true, - silent:true, - forceDie:true, - content:function(){ - player.chat('你是真滴牛批'); - } - } - } - }, - //袁绍 - sbluanji:{ - audio:2, - enable:'phaseUse', - trigger:{global:'respond'}, - viewAs:{name:'wanjian'}, - forced:true, - locked:false, - filter:function(event,player){ - if(event.name=='chooseToUse') return player.countCards('hs')>1&&!player.hasSkill('sbluanji_used'); - var evt=event.getParent(2); - return evt.name=='wanjian'&&evt.getParent().player==player&&event.player!=player&&player.getHistory('gain',function(evt){ - return evt.getParent(2).name=='sbluanji'; - }).length<3; - }, - filterCard:true, - selectCard:2, - position:'hs', - prompt:'将两张手牌当【万箭齐发】使用', - check:function(card){ - var player=_status.event.player; - var targets=game.filterPlayer(function(current){ - return player.canUse('wanjian',current); - }); - var num=0; - for(var i=0;i=7){ - if(num<1) return 0; - } - else if(targets.length>=5){ - if(num<0.5) return 0; - } - } - return 6-get.value(card); - }, - content:function(){ - player.draw(); - }, - precontent:function(){ - player.addTempSkill('sbluanji_used','phaseUseAfter'); - }, - ai:{ - threaten:1.6, - }, - subSkill:{used:{charlotte:true}} - }, - sbxueyi:{ - audio:2, - trigger:{player:'useCardToTargeted'}, - filter:function(event,player){ - return player.hasZhuSkill('sbxueyi')&&event.target!=player&&event.target.group=='qun'; - }, - zhuSkill:true, - forced:true, - usable:2, - logTarget:'target', - content:function(){ - player.draw(); - }, - mod:{ - maxHandcard:function(player,num){ - if(player.hasZhuSkill('sbxueyi')){ - return num+2*game.countPlayer(current=>player!=current&¤t.group=='qun'); - } - } - }, - ai:{ - effect:{ - player:function(card,player,target){ - if(player!=target&&target&&target.group=='qun'&&card.name!='tao') return [1,0.1]; }, }, - } + egg: { + trigger: { player: "die" }, + charlotte: true, + forced: true, + silent: true, + forceDie: true, + content: function () { + player.chat("你是真滴牛批"); + }, + }, + }, + }, + //袁绍 + sbluanji: { + audio: 2, + enable: "phaseUse", + trigger: { global: "respond" }, + viewAs: { name: "wanjian" }, + forced: true, + locked: false, + filter: function (event, player) { + if (event.name == "chooseToUse") + return player.countCards("hs") > 1 && !player.hasSkill("sbluanji_used"); + var evt = event.getParent(2); + return ( + evt.name == "wanjian" && + evt.getParent().player == player && + event.player != player && + player.getHistory("gain", function (evt) { + return evt.getParent(2).name == "sbluanji"; + }).length < 3 + ); + }, + filterCard: true, + selectCard: 2, + position: "hs", + prompt: "将两张手牌当【万箭齐发】使用", + check: function (card) { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return player.canUse("wanjian", current); + }); + var num = 0; + for (var i = 0; i < targets.length; i++) { + var eff = get.sgn(get.effect(targets[i], { name: "wanjian" }, player, player)); + if (targets[i].hp == 1) { + eff *= 1.5; + } + if (get.attitude(player, targets[i]) == 0 || targets[i].group == "qun") { + eff += 0.5; + } + num += eff; + } + if (!player.needsToDiscard(-1)) { + if (targets.length >= 7) { + if (num < 1) return 0; + } else if (targets.length >= 5) { + if (num < 0.5) return 0; + } + } + return 6 - get.value(card); + }, + content: function () { + player.draw(); + }, + precontent: function () { + player.addTempSkill("sbluanji_used", "phaseUseAfter"); + }, + ai: { + threaten: 1.6, + }, + subSkill: { used: { charlotte: true } }, + }, + sbxueyi: { + audio: 2, + trigger: { player: "useCardToTargeted" }, + filter: function (event, player) { + return ( + player.hasZhuSkill("sbxueyi") && event.target != player && event.target.group == "qun" + ); + }, + zhuSkill: true, + forced: true, + usable: 2, + logTarget: "target", + content: function () { + player.draw(); + }, + mod: { + maxHandcard: function (player, num) { + if (player.hasZhuSkill("sbxueyi")) { + return ( + num + + 2 * game.countPlayer((current) => player != current && current.group == "qun") + ); + } + }, + }, + ai: { + effect: { + player: function (card, player, target) { + if (player != target && target && target.group == "qun" && card.name != "tao") + return [1, 0.1]; + }, + }, + }, }, //庞统 - sblianhuan:{ - audio:2, - enable:'phaseUse', - filter:(event,player)=>player.hasCard(card=>lib.skill.sblianhuan.filterCard(card,player),lib.skill.sblianhuan.position), - filterTarget:function(card,player,target){ - if(player.hasSkill('sblianhuan_blocker')) return false; - if(!ui.selected.cards.length) return false; - card=get.autoViewAs({name:'tiesuo'},[ui.selected.cards[0]]); - return player.canUse(card,target); + sblianhuan: { + audio: 2, + enable: "phaseUse", + filter: (event, player) => + player.hasCard( + (card) => lib.skill.sblianhuan.filterCard(card, player), + lib.skill.sblianhuan.position + ), + filterTarget: function (card, player, target) { + if (player.hasSkill("sblianhuan_blocker")) return false; + if (!ui.selected.cards.length) return false; + card = get.autoViewAs({ name: "tiesuo" }, [ui.selected.cards[0]]); + return player.canUse(card, target); }, - filterCard:(card,player)=>get.suit(card)=='club'&&(!player.hasSkill('sblianhuan_blocker')||player.canRecast(card)), - selectCard:1, - position:'hs', - derivation:'sblianhuan_lv2', - selectTarget:function(){ - var card=get.card(),player=get.player(); - if(player.hasSkill('sblianhuan_blocker')) return 0; - if(card==undefined) return; - var range=[0,2]; - game.checkMod(card,player,range,'selectTarget',player); + filterCard: (card, player) => + get.suit(card) == "club" && + (!player.hasSkill("sblianhuan_blocker") || player.canRecast(card)), + selectCard: 1, + position: "hs", + derivation: "sblianhuan_lv2", + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (player.hasSkill("sblianhuan_blocker")) return 0; + if (card == undefined) return; + var range = [0, 2]; + game.checkMod(card, player, range, "selectTarget", player); return range; }, - filterOk:function(){ - var card=ui.selected.cards[0]; - if(!card) return false; - if(get.position(card)=='s'&&!ui.selected.targets.length) return false; + filterOk: function () { + var card = ui.selected.cards[0]; + if (!card) return false; + if (get.position(card) == "s" && !ui.selected.targets.length) return false; return true; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - prompt:function(){ - var player=_status.event.player,use=!player.hasSkill('sblianhuan_blocker'); - return '重铸一张♣手牌'+(use?';或将一张♣手牌当【铁索连环】使用':''); + prompt: function () { + var player = _status.event.player, + use = !player.hasSkill("sblianhuan_blocker"); + return "重铸一张♣手牌" + (use ? ";或将一张♣手牌当【铁索连环】使用" : ""); }, - group:['sblianhuan_use','sblianhuan_add','sblianhuan_discard2'], - multitarget:true, - multiline:true, - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - if(targets.length){ - player.addTempSkill('sblianhuan_blocker','phaseUseAfter'); - var card=get.autoViewAs({name:'tiesuo'},cards); - player.useCard(card,cards,targets); - } - else{ + group: ["sblianhuan_use", "sblianhuan_add", "sblianhuan_discard2"], + multitarget: true, + multiline: true, + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + if (targets.length) { + player.addTempSkill("sblianhuan_blocker", "phaseUseAfter"); + var card = get.autoViewAs({ name: "tiesuo" }, cards); + player.useCard(card, cards, targets); + } else { player.loseToDiscardpile(cards); player.draw(cards.length); } }, - subSkill:{ - blocker:{charlotte:true}, - use:{ - audio:'sblianhuan', - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card.name=='tiesuo'&&!player.storage.sblianhuan; + subSkill: { + blocker: { charlotte: true }, + use: { + audio: "sblianhuan", + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "tiesuo" && !player.storage.sblianhuan; }, - check:function(event,player){ - var eff=0,targets=event.targets.filter(i=>!i.isLinked()); - for(var target of targets){ - eff+=get.attitude(player,target); + check: function (event, player) { + var eff = 0, + targets = event.targets.filter((i) => !i.isLinked()); + for (var target of targets) { + eff += get.attitude(player, target); } - return eff<-1; + return eff < -1; }, - prompt2:'失去1点体力,然后当此牌指定第一个目标后,你随机弃置所有不处于连环状态的目标角色各一张手牌', - content:function(){ - 'step 0' + prompt2: + "失去1点体力,然后当此牌指定第一个目标后,你随机弃置所有不处于连环状态的目标角色各一张手牌", + content: function () { + "step 0"; player.loseHp(); - 'step 1' - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.sblianhuan=true; - trigger._sblianhuan=true; - player.addTempSkill('sblianhuan_discard','phaseUseAfter'); - } - }, - discard:{ - trigger:{global:'useCardToPlayered'}, - forced:true, - locked:false, - popup:false, - charlotte:true, - filter:function(event,player){ - return event.isFirstTarget&&event.card.storage&&event.card.storage.sblianhuan; + ("step 1"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sblianhuan = true; + trigger._sblianhuan = true; + player.addTempSkill("sblianhuan_discard", "phaseUseAfter"); }, - content:function(){ - 'step 0' - event.targets=trigger.targets.filter(i=>!i.isLinked()); - if(!event.targets.length) event.finish(); - else player.logSkill('sblianhuan_discard',event.targets); - 'step 1' - var target=targets.shift(); - var cards=target.getCards('h',card=>{ - return lib.filter.cardDiscardable(card,player,'sblianhuan'); + }, + discard: { + trigger: { global: "useCardToPlayered" }, + forced: true, + locked: false, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.isFirstTarget && event.card.storage && event.card.storage.sblianhuan; + }, + content: function () { + "step 0"; + event.targets = trigger.targets.filter((i) => !i.isLinked()); + if (!event.targets.length) event.finish(); + else player.logSkill("sblianhuan_discard", event.targets); + ("step 1"); + var target = targets.shift(); + var cards = target.getCards("h", (card) => { + return lib.filter.cardDiscardable(card, player, "sblianhuan"); }); - if(cards.length>0){ + if (cards.length > 0) { player.line(target); target.discard(cards.randomGet()); } - if(targets.length) event.redo(); - } - }, - add:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - return event.card.name=='tiesuo'&&player.storage.sblianhuan&&game.hasPlayer(current=>{ - return !event.targets.includes(current)&&player.canUse(event.card,current); - }); + if (targets.length) event.redo(); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('sblianhuan_add'),'为'+get.translation(trigger.card)+'额外指定任意个目标',[1,Infinity],function(card,player,target){ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + }, + add: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + return ( + event.card.name == "tiesuo" && + player.storage.sblianhuan && + game.hasPlayer((current) => { + return ( + !event.targets.includes(current) && player.canUse(event.card, current) + ); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("sblianhuan_add"), + "为" + get.translation(trigger.card) + "额外指定任意个目标", + [1, Infinity], + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - player.logSkill('sblianhuan_add',event.targets); + ("step 2"); + player.logSkill("sblianhuan_add", event.targets); trigger.targets.addArray(event.targets); - } - }, - discard2:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - locked:false, - popup:false, - filter:function(event,player){ - return event.isFirstTarget&&event.card.name=='tiesuo'&&player.storage.sblianhuan&&!event.getParent()._sblianhuan; }, - content:function(){ - 'step 0' - event.targets=trigger.targets.filter(i=>!i.isLinked()); - if(!event.targets.length) event.finish(); - else player.logSkill('sblianhuan_discard2',event.targets); - 'step 1' - var target=targets.shift(); - var cards=target.getCards('h',card=>{ - return lib.filter.cardDiscardable(card,player,'sblianhuan'); + }, + discard2: { + trigger: { player: "useCardToPlayered" }, + forced: true, + locked: false, + popup: false, + filter: function (event, player) { + return ( + event.isFirstTarget && + event.card.name == "tiesuo" && + player.storage.sblianhuan && + !event.getParent()._sblianhuan + ); + }, + content: function () { + "step 0"; + event.targets = trigger.targets.filter((i) => !i.isLinked()); + if (!event.targets.length) event.finish(); + else player.logSkill("sblianhuan_discard2", event.targets); + ("step 1"); + var target = targets.shift(); + var cards = target.getCards("h", (card) => { + return lib.filter.cardDiscardable(card, player, "sblianhuan"); }); - if(cards.length>0){ + if (cards.length > 0) { player.line(target); target.discard(cards.randomGet()); } - if(targets.length) event.redo(); - } + if (targets.length) event.redo(); + }, }, - } + }, }, - sbniepan:{ - audio:2, - enable:'chooseToUse', - mark:true, - skillAnimation:true, - limited:true, - animationColor:'orange', - filter:function(event,player){ - return event.type=='dying'&&player==event.dying; + sbniepan: { + audio: 2, + enable: "chooseToUse", + mark: true, + skillAnimation: true, + limited: true, + animationColor: "orange", + filter: function (event, player) { + return event.type == "dying" && player == event.dying; }, - content:function(){ - 'step 0' - player.awakenSkill('sbniepan'); - player.discard(player.getCards('hej')); - 'step 1' + content: function () { + "step 0"; + player.awakenSkill("sbniepan"); + player.discard(player.getCards("hej")); + ("step 1"); player.draw(2); - 'step 2' - if(player.hp<2) player.recover(2-player.hp); - 'step 3' + ("step 2"); + if (player.hp < 2) player.recover(2 - player.hp); + ("step 3"); player.turnOver(false); - 'step 4' + ("step 4"); player.link(false); - 'step 5' - player.storage.sblianhuan=true; - game.log(player,'修改了','#g【连环】'); + ("step 5"); + player.storage.sblianhuan = true; + game.log(player, "修改了", "#g【连环】"); }, - ai:{ - order:1, - skillTagFilter:function(player,arg,target){ - if(player!=target||player.storage.sbniepan) return false; + ai: { + order: 1, + skillTagFilter: function (player, arg, target) { + if (player != target || player.storage.sbniepan) return false; }, - save:true, - result:{ - player:function(player){ - if(player.hp<=0) return 10; + save: true, + result: { + player: function (player) { + if (player.hp <= 0) return 10; return 0; - } + }, }, - threaten:function(player,target){ - if(!target.storage.sbniepan) return 0.6; - } - } + threaten: function (player, target) { + if (!target.storage.sbniepan) return 0.6; + }, + }, }, //法正 - sbxuanhuo:{ - audio:2, - enable:'phaseUse', - usable:1, - group:'sbxuanhuo_rob', - filterTarget:function(card,player,target){ - return !target.hasMark('sbxuanhuo_mark')&&player!=target; + sbxuanhuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + group: "sbxuanhuo_rob", + filterTarget: function (card, player, target) { + return !target.hasMark("sbxuanhuo_mark") && player != target; }, - filterCard:true, - position:'he', - discard:false, - lose:false, - delay:false, - onremove:function(player){ + filterCard: true, + position: "he", + discard: false, + lose: false, + delay: false, + onremove: function (player) { delete player.storage.sbxuanhuo; - player.unmarkSkill('sbxuanhuo'); + player.unmarkSkill("sbxuanhuo"); }, - check:function(card){ - return 6.5-get.value(card); + check: function (card) { + return 6.5 - get.value(card); }, - content:function(){ - 'step 0' - player.give(cards,target); - if(player.storage.sbxuanhuo&&player.storage.sbxuanhuo[target.playerid]) delete player.storage.sbxuanhuo[target.playerid]; - 'step 1' - target.addMark('sbxuanhuo_mark'); - var history=target.getAllHistory('lose'); - if(history.length){ - history[history.length-1].sbxuanhuo_mark=true; + content: function () { + "step 0"; + player.give(cards, target); + if (player.storage.sbxuanhuo && player.storage.sbxuanhuo[target.playerid]) + delete player.storage.sbxuanhuo[target.playerid]; + ("step 1"); + target.addMark("sbxuanhuo_mark"); + var history = target.getAllHistory("lose"); + if (history.length) { + history[history.length - 1].sbxuanhuo_mark = true; } }, - getNum:function(current,skill){ - var num=0; - var history=current.getAllHistory('lose'); - if(history.length){ - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - if(evt.sbxuanhuo_mark) break; - if(typeof skill=='string'){ - if(evt.getParent(2).name==skill) num+=evt.cards2.length; - } - else{ - var evtx=evt.getParent(),player=skill; - if(evtx.name=='gain'){ - var cards=evtx.cards; - if(evtx.player==player&&cards.length>0) num+=cards.length; - } - else if(evtx.name=='loseAsync'){ - if(evtx.type!='gain'||evtx.giver) return false; - var cards=evtx.getl(current).cards2; - var cardsx=evtx.getg(player); - if(cardsx.length>0) num+=cardsx.length; + getNum: function (current, skill) { + var num = 0; + var history = current.getAllHistory("lose"); + if (history.length) { + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (evt.sbxuanhuo_mark) break; + if (typeof skill == "string") { + if (evt.getParent(2).name == skill) num += evt.cards2.length; + } else { + var evtx = evt.getParent(), + player = skill; + if (evtx.name == "gain") { + var cards = evtx.cards; + if (evtx.player == player && cards.length > 0) num += cards.length; + } else if (evtx.name == "loseAsync") { + if (evtx.type != "gain" || evtx.giver) return false; + var cards = evtx.getl(current).cards2; + var cardsx = evtx.getg(player); + if (cardsx.length > 0) num += cardsx.length; } } } } return num; }, - ai:{ - order:9, - result:{ - target:function(player,target){ - return -Math.sqrt(Math.max(target.hp,1)); - } - } - }, - marktext:'惑', - intro:{ - content:function(storage,player){ - if(!storage||get.is.empty(storage)) return '未得到过牌'; - var map=(_status.connectMode?lib.playerOL:game.playerMap); - var str='已得到'; - for(var i in storage){ - str+=get.translation(map[i])+'的'+get.cnNumber(storage[i])+'张牌、'; - } - return str.slice(0,-1); - } - }, - subSkill:{ - mark:{ - marktext:'眩', - intro:{ - name:'眩惑', - name2:'眩', - markcount:()=>0, - content:'已获得“眩”标记', - } + ai: { + order: 9, + result: { + target: function (player, target) { + return -Math.sqrt(Math.max(target.hp, 1)); + }, }, - rob:{ - audio:'sbxuanhuo', - trigger:{ - global:['gainAfter','loseAsyncAfter'], - }, - forced:true, - locked:false, - direct:true, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - if(evt&&evt.name=='phaseDraw') return false; - return game.hasPlayer(current=>{ - if(!event.getg(current).length||!current.hasMark('sbxuanhuo_mark')) return false; - if(evt&&evt.player==current) return false; - if(lib.skill.sbxuanhuo.getNum(current,'sbxuanhuo_rob')>=5) return false; - return current.hasCard(card=>lib.filter.canBeGained(card,current,player),'he'); - }); - }, - content:function(){ - 'step 0' - var evt=trigger.getParent('phaseDraw'); - var targets=game.filterPlayer(current=>{ - if(!trigger.getg(current).length||!current.hasMark('sbxuanhuo_mark')) return false; - if(evt&&evt.player==current) return false; - if(lib.skill.sbxuanhuo.getNum(current,'sbxuanhuo_rob')>=5) return false; - return current.hasCard(card=>lib.filter.canBeGained(card,current,player),'he'); - }); - event.targets=targets; - 'step 1' - var target=targets.shift(); - player.logSkill('sbxuanhuo',target); - var hs=target.getCards('h',card=>lib.filter.canBeGained(card,target,player)); - if(hs.length){ - player.gain(hs.randomGet(),target,'giveAuto'); - if(!player.storage.sbxuanhuo) player.storage.sbxuanhuo={}; - player.storage.sbxuanhuo[target.playerid]=lib.skill.sbxuanhuo.getNum(target,'sbxuanhuo_rob')+1; - player.markSkill('sbxuanhuo'); - } - if(targets.length>0) event.redo(); - }, - } - } - }, - sbenyuan:{ - audio:2, - forced:true, - direct:true, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.hasPlayer(current=>current.hasMark('sbxuanhuo_mark')); }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>current.hasMark('sbxuanhuo_mark')); - event.targets=targets; - 'step 1' - var target=targets.shift(); - event.target=target; - player.logSkill('sbenyuan',target); - target.removeMark('sbxuanhuo_mark',target.countMark('sbxuanhuo_mark')); - game.players.forEach(current=>{ - var storage=current.storage.sbxuanhuo; - if(storage&&storage[target.playerid]) delete storage[target.playerid]; - if(storage&&get.is.empty(storage)){ + marktext: "惑", + intro: { + content: function (storage, player) { + if (!storage || get.is.empty(storage)) return "未得到过牌"; + var map = _status.connectMode ? lib.playerOL : game.playerMap; + var str = "已得到"; + for (var i in storage) { + str += get.translation(map[i]) + "的" + get.cnNumber(storage[i]) + "张牌、"; + } + return str.slice(0, -1); + }, + }, + subSkill: { + mark: { + marktext: "眩", + intro: { + name: "眩惑", + name2: "眩", + markcount: () => 0, + content: "已获得“眩”标记", + }, + }, + rob: { + audio: "sbxuanhuo", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], + }, + forced: true, + locked: false, + direct: true, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; + return game.hasPlayer((current) => { + if (!event.getg(current).length || !current.hasMark("sbxuanhuo_mark")) + return false; + if (evt && evt.player == current) return false; + if (lib.skill.sbxuanhuo.getNum(current, "sbxuanhuo_rob") >= 5) return false; + return current.hasCard( + (card) => lib.filter.canBeGained(card, current, player), + "he" + ); + }); + }, + content: function () { + "step 0"; + var evt = trigger.getParent("phaseDraw"); + var targets = game.filterPlayer((current) => { + if (!trigger.getg(current).length || !current.hasMark("sbxuanhuo_mark")) + return false; + if (evt && evt.player == current) return false; + if (lib.skill.sbxuanhuo.getNum(current, "sbxuanhuo_rob") >= 5) return false; + return current.hasCard( + (card) => lib.filter.canBeGained(card, current, player), + "he" + ); + }); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + player.logSkill("sbxuanhuo", target); + var hs = target.getCards("h", (card) => + lib.filter.canBeGained(card, target, player) + ); + if (hs.length) { + player.gain(hs.randomGet(), target, "giveAuto"); + if (!player.storage.sbxuanhuo) player.storage.sbxuanhuo = {}; + player.storage.sbxuanhuo[target.playerid] = + lib.skill.sbxuanhuo.getNum(target, "sbxuanhuo_rob") + 1; + player.markSkill("sbxuanhuo"); + } + if (targets.length > 0) event.redo(); + }, + }, + }, + }, + sbenyuan: { + audio: 2, + forced: true, + direct: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer((current) => current.hasMark("sbxuanhuo_mark")); + }, + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => current.hasMark("sbxuanhuo_mark")); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + event.target = target; + player.logSkill("sbenyuan", target); + target.removeMark("sbxuanhuo_mark", target.countMark("sbxuanhuo_mark")); + game.players.forEach((current) => { + var storage = current.storage.sbxuanhuo; + if (storage && storage[target.playerid]) delete storage[target.playerid]; + if (storage && get.is.empty(storage)) { delete current.storage.sbxuanhuo; - current.unmarkSkill('sbxuanhuo'); + current.unmarkSkill("sbxuanhuo"); } }); - var num=lib.skill.sbxuanhuo.getNum(target,player); - if(num>=3){ - var cards=player.getCards('he'); - if(!cards.length) event._result={bool:false}; - else if(cards.length<=3) event._result={bool:true,cards:cards}; - else player.chooseCard('恩怨:交给'+get.translation(target)+'三张牌',true,3,'he'); - } - else{ + var num = lib.skill.sbxuanhuo.getNum(target, player); + if (num >= 3) { + var cards = player.getCards("he"); + if (!cards.length) event._result = { bool: false }; + else if (cards.length <= 3) event._result = { bool: true, cards: cards }; + else + player.chooseCard( + "恩怨:交给" + get.translation(target) + "三张牌", + true, + 3, + "he" + ); + } else { target.loseHp(); player.recover(); event.goto(3); } - 'step 2' - if(result.bool) player.give(result.cards,target); - 'step 3' - if(targets.length) event.goto(1); + ("step 2"); + if (result.bool) player.give(result.cards, target); + ("step 3"); + if (targets.length) event.goto(1); + }, + ai: { + combo: "sbxuanhuo", }, - ai:{ - combo:'sbxuanhuo' - } }, //姜维 - sbtiaoxin:{ - audio:2, - enable:'phaseUse', - usable:1, - chargeSkill:true, - filter:function(event,player){ - return player.hasMark('charge'); + sbtiaoxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + chargeSkill: true, + filter: function (event, player) { + return player.hasMark("charge"); }, - filterTarget:lib.filter.notMe, - selectTarget:function(){ - return [1,_status.event.player.countMark('charge')]; + filterTarget: lib.filter.notMe, + selectTarget: function () { + return [1, _status.event.player.countMark("charge")]; }, - multiline:true, - group:'sbtiaoxin_backflow', - content:function(){ - 'step 0' - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'挑衅:对'+get.translation(player)+'使用一张杀,或交给其一张牌').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',player); - 'step 1' - if(!result.bool&&target.countCards('he')>0){ - target.chooseCard('he','交给'+get.translation(player)+'一张牌',true); - } - else event.finish(); - 'step 2' - if(result.bool){ - target.give(result.cards,player); + multiline: true, + group: "sbtiaoxin_backflow", + content: function () { + "step 0"; + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "挑衅:对" + get.translation(player) + "使用一张杀,或交给其一张牌") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player); + ("step 1"); + if (!result.bool && target.countCards("he") > 0) { + target.chooseCard("he", "交给" + get.translation(player) + "一张牌", true); + } else event.finish(); + ("step 2"); + if (result.bool) { + target.give(result.cards, player); } }, - contentAfter:function(){ - player.removeMark('charge',targets.length); + contentAfter: function () { + player.removeMark("charge", targets.length); }, - ai:{ - threaten:1.2, - order:4, - expose:0.2, - result:{ - target:function(player,target){ - if(target.countGainableCards(player,'he')==0) return 0; + ai: { + threaten: 1.2, + order: 4, + expose: 0.2, + result: { + target: function (player, target) { + if (target.countGainableCards(player, "he") == 0) return 0; return -1; }, - player:function(player,target){ - if(!target.canUse('sha',player)) return 0; - if(target.countCards('h')==0) return 0; - if(target.countCards('h')==1) return -0.1; - if(player.hp<=2) return -2; - if(player.countCards('h','shan')==0) return -1; + player: function (player, target) { + if (!target.canUse("sha", player)) return 0; + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; return -0.5; - } + }, }, }, - subSkill:{ - backflow:{ - audio:'sbtiaoxin', - trigger:{ - player:['loseAfter','enterGame'], - global:['loseAsyncAfter','phaseBefore'] + subSkill: { + backflow: { + audio: "sbtiaoxin", + trigger: { + player: ["loseAfter", "enterGame"], + global: ["loseAsyncAfter", "phaseBefore"], }, - forced:true, - filter:function(event,player){ - if(player.countMark('charge')>=4) return false; - if(event.name.indexOf('lose')==0){ - if(event.type!='discard') return false; - var evt=event.getParent('phaseDiscard'); - return evt&&evt.player==player&&event.getl(player).cards2.length>0; - } - else{ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + if (player.countMark("charge") >= 4) return false; + if (event.name.indexOf("lose") == 0) { + if (event.type != "discard") return false; + var evt = event.getParent("phaseDiscard"); + return evt && evt.player == player && event.getl(player).cards2.length > 0; + } else { + return event.name != "phase" || game.phaseNumber == 0; } }, - content:function(){ - var num=Math.min(4-player.countMark('charge'),trigger.name.indexOf('lose')==0?trigger.getl(player).cards2.length:4); - if(num>0) player.addMark('charge',num); - } - } - } + content: function () { + var num = Math.min( + 4 - player.countMark("charge"), + trigger.name.indexOf("lose") == 0 ? trigger.getl(player).cards2.length : 4 + ); + if (num > 0) player.addMark("charge", num); + }, + }, + }, }, - sbzhiji:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'fire', - filter:function(event,player){ - var len=0; - player.getAllHistory('useSkill',evt=>{ - if(evt.skill!='sbtiaoxin') return false; - len+=evt.targets.length; + sbzhiji: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + var len = 0; + player.getAllHistory("useSkill", (evt) => { + if (evt.skill != "sbtiaoxin") return false; + len += evt.targets.length; }); - return len>=4; + return len >= 4; }, - content:function(){ - 'step 0' - player.awakenSkill('sbzhiji'); + content: function () { + "step 0"; + player.awakenSkill("sbzhiji"); player.loseMaxHp(); - 'step 1' - player.chooseTarget('志继:令至少一名角色获得“北伐”标记',true,[1,Infinity]).set('ai',target=>-get.attitude(player,target)); - 'step 2' - if(result.bool){ - player.line(result.targets,'fire'); - result.targets.forEach(target=>{ - target.addAdditionalSkill('sbzhiji_'+player.playerid,'sbzhiji_beifa'); - target.markAuto('sbzhiji_beifa',[player]); + ("step 1"); + player + .chooseTarget("志继:令至少一名角色获得“北伐”标记", true, [1, Infinity]) + .set("ai", (target) => -get.attitude(player, target)); + ("step 2"); + if (result.bool) { + player.line(result.targets, "fire"); + result.targets.forEach((target) => { + target.addAdditionalSkill("sbzhiji_" + player.playerid, "sbzhiji_beifa"); + target.markAuto("sbzhiji_beifa", [player]); }); - player.addTempSkill('sbzhiji_clear',{player:'phaseBegin'}); - if(!event.isMine()&&!event.isOnline()) game.delayx(); + player.addTempSkill("sbzhiji_clear", { player: "phaseBegin" }); + if (!event.isMine() && !event.isOnline()) game.delayx(); } }, - subSkill:{ - beifa:{ - charlotte:true, - mark:true, - marktext:'伐', - intro:{ - name:'北伐', - name2:'北伐', - content:'使用牌只能指定$和自己为目标', + subSkill: { + beifa: { + charlotte: true, + mark: true, + marktext: "伐", + intro: { + name: "北伐", + name2: "北伐", + content: "使用牌只能指定$和自己为目标", + }, + mod: { + playerEnabled: function (card, player, target) { + if (player != target && !player.getStorage("sbzhiji_beifa").includes(target)) + return false; + }, }, - mod:{ - playerEnabled:function(card,player,target){ - if(player!=target&&!player.getStorage('sbzhiji_beifa').includes(target)) return false; - } - } }, - clear:{ - charlotte:true, - onremove:function(player){ - game.countPlayer(function(current){ - current.removeAdditionalSkill('sbzhiji_'+player.playerid); + clear: { + charlotte: true, + onremove: function (player) { + game.countPlayer(function (current) { + current.removeAdditionalSkill("sbzhiji_" + player.playerid); }); - } - } - } + }, + }, + }, }, //刘备 - sbrende:{ - audio:3, - enable:['chooseToUse','chooseToRespond'], - maxNum:8, - filter:function(event,player){ - if(event.type=='wuxie'||player.hasSkill('sbrende_used')) return false; - if(player.countMark('sbrende')<2) return false; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) return true; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) return true; + sbrende: { + audio: 3, + enable: ["chooseToUse", "chooseToRespond"], + maxNum: 8, + filter: function (event, player) { + if (event.type == "wuxie" || player.hasSkill("sbrende_used")) return false; + if (player.countMark("sbrende") < 2) return false; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; } } } return false; }, - group:['sbrende_give','sbrende_gain'], - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('仁德'); - if(event.type=='phase'){ - dialog._chosenOpt=[]; - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; - var list=['视为使用基本牌','交给其他角色牌']; - for(var i of list){ - var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); - td.innerHTML=''+i+''; - td.link=i; - if(i==list[0]){ - td.classList.add('bluebg'); + group: ["sbrende_give", "sbrende_gain"], + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("仁德"); + if (event.type == "phase") { + dialog._chosenOpt = []; + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var list = ["视为使用基本牌", "交给其他角色牌"]; + for (var i of list) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.innerHTML = "" + i + ""; + td.link = i; + if (i == list[0]) { + td.classList.add("bluebg"); dialog._chosenOpt.add(td); } - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.clicked) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - _status.clicked=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - if(link=='交给其他角色牌') game.uncheck(); - var current=this.parentNode.querySelector('.bluebg'); - if(current){ - current.classList.remove('bluebg'); - dialog._chosenOpt.remove(current); + td.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + function () { + if (_status.dragged) return; + if (_status.clicked) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + _status.clicked = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (link == "交给其他角色牌") game.uncheck(); + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + dialog._chosenOpt.remove(current); + } + dialog._chosenOpt.add(this); + this.classList.add("bluebg"); + game.check(); } - dialog._chosenOpt.add(this); - this.classList.add('bluebg'); - game.check(); - }); + ); table.appendChild(td); dialog.buttons.add(td); } dialog.content.appendChild(table); } - var cards=[]; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) cards.push(['基本','',name]); - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) cards.push(['基本','',name,nature]); + var cards = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) cards.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) + cards.push(["基本", "", name, nature]); } } } - dialog.add([cards,'vcard']) + dialog.add([cards, "vcard"]); return dialog; }, - check:function(button,player){ - if(typeof button.link=='string') return -1; - if(_status.event.getParent().type!='phase') return 1; - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); + check: function (button, player) { + if (typeof button.link == "string") return -1; + if (_status.event.getParent().type != "phase") return 1; + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); }, - select:function(){ - var opts=_status.event.dialog._chosenOpt; - return opts&&opts.length&&opts[0].link=='交给其他角色牌'?0:1; + select: function () { + var opts = _status.event.dialog._chosenOpt; + return opts && opts.length && opts[0].link == "交给其他角色牌" ? 0 : 1; }, - backup:function(links,player){ - var isUse=links.length==1; - var backup=get.copy(lib.skill['sbrende_'+(isUse?'use':'give')]); - if(isUse) backup.viewAs={name:links[0][2],nature:links[0][3],isCard:true}; + backup: function (links, player) { + var isUse = links.length == 1; + var backup = get.copy(lib.skill["sbrende_" + (isUse ? "use" : "give")]); + if (isUse) backup.viewAs = { name: links[0][2], nature: links[0][3], isCard: true }; return backup; }, - prompt:function(links,player){ - var isUse=links.length==1; - return (isUse?('移去2枚“仁望”,视为使用或打出'+(get.translation(links[0][3])||'')+get.translation(links[0][2])) - :'###仁德###出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为'+lib.skill.sbrende.maxNum+')'); - } - }, - hiddenCard:function(player,name){ - return get.type(name)=='basic'&&player.countMark('sbrende')>1&&player.hasSkill('sbrende_used'); - }, - marktext:'仁', - intro:{ - name:'仁望', - name2:'仁望', - content:'mark', - }, - ai:{ - respondSha:true, - respondShan:true, - save:true, - skillTagFilter:function(player){ - return player.countMark('sbrende')>1&&!player.hasSkill('sbrende_used'); + prompt: function (links, player) { + var isUse = links.length == 1; + return isUse + ? "移去2枚“仁望”,视为使用或打出" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + : "###仁德###出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为" + + lib.skill.sbrende.maxNum + + ")"; }, - order:function(item,player){ - if(_status.event.type=='phase'&&lib.skill.sbzhangwu.ai.result.player(player)>0) return 9.1; + }, + hiddenCard: function (player, name) { + return ( + get.type(name) == "basic" && + player.countMark("sbrende") > 1 && + player.hasSkill("sbrende_used") + ); + }, + marktext: "仁", + intro: { + name: "仁望", + name2: "仁望", + content: "mark", + }, + ai: { + respondSha: true, + respondShan: true, + save: true, + skillTagFilter: function (player) { + return player.countMark("sbrende") > 1 && !player.hasSkill("sbrende_used"); + }, + order: function (item, player) { + if (_status.event.type == "phase" && lib.skill.sbzhangwu.ai.result.player(player) > 0) + return 9.1; return 0.5; }, - result:{ - player:function(player){ - if(_status.event.dying){ - return get.attitude(player,_status.event.dying); + result: { + player: function (player) { + if (_status.event.dying) { + return get.attitude(player, _status.event.dying); } - return _status.event.type=='phase'&&player.countMark('sbrende')<=2?0:1; + return _status.event.type == "phase" && player.countMark("sbrende") <= 2 ? 0 : 1; }, }, }, - subSkill:{ - backup:{}, - used:{charlotte:true}, - given:{onremove:true}, - use:{ - audio:'sbrende', - filterCard:()=>false, - selectCard:-1, - popname:true, - precontent:function(){ - player.logSkill('sbrende_use'); + subSkill: { + backup: {}, + used: { charlotte: true }, + given: { onremove: true }, + use: { + audio: "sbrende", + filterCard: () => false, + selectCard: -1, + popname: true, + precontent: function () { + player.logSkill("sbrende_use"); delete event.result.skill; - player.removeMark('sbrende',2); - player.addTempSkill('sbrende_used'); - } + player.removeMark("sbrende", 2); + player.addTempSkill("sbrende_used"); + }, }, - give:{ - audio:'sbrende', - enable:'phaseUse', - filterCard:true, - selectCard:[1,Infinity], - position:'he', - discard:false, - lose:false, - delay:false, - filter:function(event,player){ - if(player.countMark('sbrende')<2||player.hasSkill('sbrende_used')) return true; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) return false; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) return false; + give: { + audio: "sbrende", + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + position: "he", + discard: false, + lose: false, + delay: false, + filter: function (event, player) { + if (player.countMark("sbrende") < 2 || player.hasSkill("sbrende_used")) + return true; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return false; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return false; } } } return true; }, - filterTarget:function(card,player,target){ - if(player.getStorage('sbrende_given').includes(target)) return false; - return player!=target; + filterTarget: function (card, player, target) { + if (player.getStorage("sbrende_given").includes(target)) return false; + return player != target; }, - prompt:function(event){ - return '出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为'+lib.skill.sbrende.maxNum+')'; + prompt: function (event) { + return ( + "出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为" + + lib.skill.sbrende.maxNum + + ")" + ); }, - check:function(card){ - var player=get.owner(card); - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(ui.selected.cards.length+player.countMark('sbrende')>lib.skill.sbrende.maxNum) return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - if(ui.selected.cards.length>=Math.max(2,player.countCards('he')-player.hp)) return 0; - if(player.countCards('he')<=1){ - var players=game.filterPlayer(); - for(var i=0;i=3&& - get.attitude(players[i],player)>=3){ - return 11-get.value(card); + check: function (card) { + var player = get.owner(card); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if ( + ui.selected.cards.length + player.countMark("sbrende") > + lib.skill.sbrende.maxNum + ) + return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + if (ui.selected.cards.length >= Math.max(2, player.countCards("he") - player.hp)) + return 0; + if (player.countCards("he") <= 1) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].hasSkill("haoshi") && + !players[i].isTurnedOver() && + !players[i].hasJudge("lebu") && + get.attitude(player, players[i]) >= 3 && + get.attitude(players[i], player) >= 3 + ) { + return 11 - get.value(card); } } - if(player.countCards('he')>player.hp) return 10-get.value(card); - if(player.countCards('he')>2) return 6-get.value(card); + if (player.countCards("he") > player.hp) return 10 - get.value(card); + if (player.countCards("he") > 2) return 6 - get.value(card); return -1; } - return 18-(ui.selected.cards.length+player.countMark('sbrende'))-get.value(card); + return ( + 18 - + (ui.selected.cards.length + player.countMark("sbrende")) - + get.value(card) + ); }, - content:function(){ - player.addTempSkill('sbrende_given','phaseUseAfter'); - player.markAuto('sbrende_given',[target]); - player.markAuto('sbrende_givenx',[target]); - player.give(cards,target); - var num=Math.min(lib.skill.sbrende.maxNum-player.countMark('sbrende'),cards.length); - if(num>0) player.addMark('sbrende',num); + content: function () { + player.addTempSkill("sbrende_given", "phaseUseAfter"); + player.markAuto("sbrende_given", [target]); + player.markAuto("sbrende_givenx", [target]); + player.give(cards, target); + var num = Math.min( + lib.skill.sbrende.maxNum - player.countMark("sbrende"), + cards.length + ); + if (num > 0) player.addMark("sbrende", num); }, - ai:{ - order:function(skill,player){ - return player.countMark('sbrende')<2?6.8:5.8; + ai: { + order: function (skill, player) { + return player.countMark("sbrende") < 2 ? 6.8 : 5.8; }, - result:{ - target:function(player,target){ - if(!player.hasFriend()&&player.hasSkill('sbzhangwu')&&ui.selected.cards.length&& - get.value(ui.selected.cards[0])>(lib.skill.sbzhangwu.filterTarget(null,player,target)?3:5)) return -0.1; - if(target.hasSkillTag('nogain')) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; + result: { + target: function (player, target) { + if ( + !player.hasFriend() && + player.hasSkill("sbzhangwu") && + ui.selected.cards.length && + get.value(ui.selected.cards[0]) > + (lib.skill.sbzhangwu.filterTarget(null, player, target) ? 3 : 5) + ) + return -0.1; + if (target.hasSkillTag("nogain")) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; return -10; } - if(target.hasJudge('lebu')) return 0; - var nh=target.countCards('h'); - return Math.max(1,5-nh); - } + if (target.hasJudge("lebu")) return 0; + var nh = target.countCards("h"); + return Math.max(1, 5 - nh); + }, }, - threaten:1.1 + threaten: 1.1, }, }, - gain:{ - audio:'sbrende', - trigger:{player:'phaseUseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.countMark('sbrende') 0) player.addMark("sbrende", num); }, - content:function(){ - var num=Math.min(lib.skill.sbrende.maxNum-player.countMark('sbrende'),2); - if(num>0) player.addMark('sbrende',num); - } }, }, }, - sbzhangwu:{ - audio:2, - enable:'phaseUse', - skillAnimation:'epic', - animationColor:'orange', - limited:true, - filter:function(event,player){ - if(game.roundNumber<=1) return false; - if(!game.hasPlayer(current=>lib.skill.sbzhangwu.filterTarget(null,player,current))) return false; + sbzhangwu: { + audio: 2, + enable: "phaseUse", + skillAnimation: "epic", + animationColor: "orange", + limited: true, + filter: function (event, player) { + if (game.roundNumber <= 1) return false; + if (!game.hasPlayer((current) => lib.skill.sbzhangwu.filterTarget(null, player, current))) + return false; return true; }, - filterTarget:function(card,player,target){ - if(target==player) return false; - return player.getStorage('sbrende_givenx').includes(target); + filterTarget: function (card, player, target) { + if (target == player) return false; + return player.getStorage("sbrende_givenx").includes(target); }, - selectTarget:[-1,-2], - multiline:true, - content:function(){ - 'step 0' - player.awakenSkill('sbzhangwu'); - var num=Math.min(game.roundNumber-1,3); - var cards=target.getCards('he'),count=cards.length; - if(count==0) event.finish(); - else if(count<=num) event._result={bool:true,cards:cards}; - else target.chooseCard('章武:交给'+get.translation(player)+get.cnNumber(num)+'张牌',true,'he',num); - 'step 1' - if(result.bool){ - target.give(result.cards,player); + selectTarget: [-1, -2], + multiline: true, + content: function () { + "step 0"; + player.awakenSkill("sbzhangwu"); + var num = Math.min(game.roundNumber - 1, 3); + var cards = target.getCards("he"), + count = cards.length; + if (count == 0) event.finish(); + else if (count <= num) event._result = { bool: true, cards: cards }; + else + target.chooseCard( + "章武:交给" + get.translation(player) + get.cnNumber(num) + "张牌", + true, + "he", + num + ); + ("step 1"); + if (result.bool) { + target.give(result.cards, player); } }, - contentAfter:function(){ - 'step 0' + contentAfter: function () { + "step 0"; player.recover(3); - 'step 1' - player.removeSkills('sbrende'); + ("step 1"); + player.removeSkills("sbrende"); game.delayx(); }, - ai:{ - order:9, - combo:'sbrende', - result:{ - player:function(player,target){ - var targets=game.filterPlayer(current=>lib.skill.sbzhangwu.filterTarget(null,player,current)); - if(!targets.length) return 0; - var eff=0; - for(var target of targets){ - eff+=get.effect(target,{name:'shunshou_copy2'},player,player); + ai: { + order: 9, + combo: "sbrende", + result: { + player: function (player, target) { + var targets = game.filterPlayer((current) => + lib.skill.sbzhangwu.filterTarget(null, player, current) + ); + if (!targets.length) return 0; + var eff = 0; + for (var target of targets) { + eff += get.effect(target, { name: "shunshou_copy2" }, player, player); } - eff+=15-5*Math.max(0,3-player.getDamagedHp()); - return eff>15?1:0; + eff += 15 - 5 * Math.max(0, 3 - player.getDamagedHp()); + return eff > 15 ? 1 : 0; }, - } - } + }, + }, }, - sbjijiang:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - zhuSkill:true, - unique:true, - popup:false, - filter:function(event,player){ - if(!player.hasZhuSkill('sbjijiang')) return false; - return game.hasPlayer(current=>{ - if(current.group!='shu'||player==current||current.hpcurrent.inRange(currentx)); + sbjijiang: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + zhuSkill: true, + unique: true, + popup: false, + filter: function (event, player) { + if (!player.hasZhuSkill("sbjijiang")) return false; + return game.hasPlayer((current) => { + if (current.group != "shu" || player == current || current.hp < player.hp) + return false; + return game.hasPlayer((currentx) => current.inRange(currentx)); }); }, - async cost(event,trigger,player){ - event.result=await player.chooseTarget(get.prompt2('sbjijiang'),2).set('filterTarget',(card,player,target)=>{ - if(!ui.selected.targets.length) return target.group=='shu'&&target.hp>=player.hp&&target!=player; - var current=ui.selected.targets[0]; - return current.inRange(target); - }).set('targetprompt',['进行选择','出杀对象']).set('multitarget',true).set('ai',target=>{ - var player=_status.event.player; - if(ui.selected.targets.length){ - var current=ui.selected.targets[0]; - return get.effect(target,new lib.element.VCard({name:'sha'}),current,player); - } - let curs=game.filterPlayer(current=>{ - return target!==current&&target.inRange(current)&&target.canUse({name:'sha',isCard:true},current,false); - }); - if(!curs.length){ - let att=get.attitude(player,target); - if(att>=0) return 0; - return -att*get.threaten(target,player); - } - return curs.reduce((max,i)=>Math.max(max,get.effect(i,new lib.element.VCard({name:'sha'}),target,player)),-1); - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("sbjijiang"), 2) + .set("filterTarget", (card, player, target) => { + if (!ui.selected.targets.length) + return target.group == "shu" && target.hp >= player.hp && target != player; + var current = ui.selected.targets[0]; + return current.inRange(target); + }) + .set("targetprompt", ["进行选择", "出杀对象"]) + .set("multitarget", true) + .set("ai", (target) => { + var player = _status.event.player; + if (ui.selected.targets.length) { + var current = ui.selected.targets[0]; + return get.effect( + target, + new lib.element.VCard({ name: "sha" }), + current, + player + ); + } + let curs = game.filterPlayer((current) => { + return ( + target !== current && + target.inRange(current) && + target.canUse({ name: "sha", isCard: true }, current, false) + ); + }); + if (!curs.length) { + let att = get.attitude(player, target); + if (att >= 0) return 0; + return -att * get.threaten(target, player); + } + return curs.reduce( + (max, i) => + Math.max( + max, + get.effect(i, new lib.element.VCard({ name: "sha" }), target, player) + ), + -1 + ); + }) + .forResult(); }, - async content(event,trigger,player){ - let targets=event.targets; - player.logSkill('sbjijiang',targets,false); + async content(event, trigger, player) { + let targets = event.targets; + player.logSkill("sbjijiang", targets, false); player.line2(targets); - var choiceList=[ - '视为对'+get.translation(targets[1])+'使用一张【杀】', - '你的下一个出牌阶段开始前,跳过此阶段' - ],result; - if(!targets[0].canUse({name:'sha',isCard:true},targets[1],false)) result={index:1}; - else result=await targets[0].chooseControl().set('choiceList',choiceList).set('ai',()=>{ - return _status.event.choice; - }).set('choice',get.effect(targets[1],{name:'sha'},targets[0],targets[0])>get.effect(targets[0],{name:'lebu'},targets[0],targets[0])?0:1).forResult(); - if(result.index==0){ - targets[0].useCard({name:'sha',isCard:true},targets[1],false); - } - else{ - targets[0].addSkill('sbjijiang_skip'); + var choiceList = [ + "视为对" + get.translation(targets[1]) + "使用一张【杀】", + "你的下一个出牌阶段开始前,跳过此阶段", + ], + result; + if (!targets[0].canUse({ name: "sha", isCard: true }, targets[1], false)) + result = { index: 1 }; + else + result = await targets[0] + .chooseControl() + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + get.effect(targets[1], { name: "sha" }, targets[0], targets[0]) > + get.effect(targets[0], { name: "lebu" }, targets[0], targets[0]) + ? 0 + : 1 + ) + .forResult(); + if (result.index == 0) { + targets[0].useCard({ name: "sha", isCard: true }, targets[1], false); + } else { + targets[0].addSkill("sbjijiang_skip"); } }, - subSkill:{ - skip:{ - trigger:{player:'phaseUseBefore'}, - charlotte:true, - forced:true, - content:function(){ + subSkill: { + skip: { + trigger: { player: "phaseUseBefore" }, + charlotte: true, + forced: true, + content: function () { trigger.cancel(); - player.removeSkill('sbjijiang_skip'); - } + player.removeSkill("sbjijiang_skip"); + }, }, - } + }, }, //赵云 - sblongdan:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - chargeSkill:true, - filter:function(event,player){ - if(event.type=='wuxie'||!player.hasMark('charge')) return false; - var marked=player.hasSkill('sblongdan_mark',null,null,false); - for(var name of lib.inpile){ - if(!marked&&name!='sha'&&name!='shan') continue; - if(get.type(name)!='basic') continue; - if(player.hasCard(lib.skill.sblongdan.getFilter(name,player),'hs')){ - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)) return true; - if(marked&&name=='sha'){ - for(var nature of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name,nature},'unsure'),player,event)) return true; + sblongdan: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + chargeSkill: true, + filter: function (event, player) { + if (event.type == "wuxie" || !player.hasMark("charge")) return false; + var marked = player.hasSkill("sblongdan_mark", null, null, false); + for (var name of lib.inpile) { + if (!marked && name != "sha" && name != "shan") continue; + if (get.type(name) != "basic") continue; + if (player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs")) { + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) + return true; + if (marked && name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name, nature }, "unsure"), + player, + event + ) + ) + return true; } } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - var marked=player.hasSkill('sblongdan_mark',null,null,false); - for(var name of lib.inpile){ - if(!marked&&name!='sha'&&name!='shan') continue; - if(get.type(name)!='basic') continue; - if(player.hasCard(lib.skill.sblongdan.getFilter(name,player),'hs')){ - if(event.filterCard(get.autoViewAs({name},'unsure'),player,event)) list.push(['基本','',name]); - if(marked&&name=='sha'){ - for(var nature of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name,nature},'unsure'),player,event)) list.push(['基本','',name,nature]) + chooseButton: { + dialog: function (event, player) { + var list = []; + var marked = player.hasSkill("sblongdan_mark", null, null, false); + for (var name of lib.inpile) { + if (!marked && name != "sha" && name != "shan") continue; + if (get.type(name) != "basic") continue; + if (player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs")) { + if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) + list.push(["基本", "", name]); + if (marked && name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name, nature }, "unsure"), + player, + event + ) + ) + list.push(["基本", "", name, nature]); } } } } - return ui.create.dialog('龙胆',[list,'vcard'],'hidden'); + return ui.create.dialog("龙胆", [list, "vcard"], "hidden"); }, - check:function(button){ - if(_status.event.getParent().type!='phase') return 1; - var player=_status.event.player,card={name:button.link[2],nature:button.link[3]}; - if(card.name=='jiu'&&Math.min(player.countMark('charge'),player.countCards('h',{type:'basic'}))<2) return 0; - return player.getUseValue(card,null,true); + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player, + card = { name: button.link[2], nature: button.link[3] }; + if ( + card.name == "jiu" && + Math.min(player.countMark("charge"), player.countCards("h", { type: "basic" })) < + 2 + ) + return 0; + return player.getUseValue(card, null, true); }, - backup:function(links,player){ + backup: function (links, player) { return { - viewAs:{ - name:links[0][2], - nature:links[0][3], + viewAs: { + name: links[0][2], + nature: links[0][3], }, - filterCard:lib.skill.sblongdan.getFilter(links[0][2],player), - position:'he', - popname:true, - check:function(card){ - return 6/Math.max(1,get.value(card)); + filterCard: lib.skill.sblongdan.getFilter(links[0][2], player), + position: "he", + popname: true, + check: function (card) { + return 6 / Math.max(1, get.value(card)); }, - precontent:function(){ - player.removeMark('charge',1); - player.addTempSkill('sblongdan_draw'); + precontent: function () { + player.removeMark("charge", 1); + player.addTempSkill("sblongdan_draw"); }, - } - }, - prompt:function(links,player){ - var marked=player.hasSkill('sblongdan_mark',null,null,false); - var card={ - name:links[0][2], - nature:links[0][3], - isCard:true, }; - if(marked) return '将一张基本牌当做'+get.translation(card)+'使用'; - return '将一张'+(card.name=='sha'?'闪':'杀')+'当做'+get.translation(card)+'使用'; + }, + prompt: function (links, player) { + var marked = player.hasSkill("sblongdan_mark", null, null, false); + var card = { + name: links[0][2], + nature: links[0][3], + isCard: true, + }; + if (marked) return "将一张基本牌当做" + get.translation(card) + "使用"; + return ( + "将一张" + + (card.name == "sha" ? "闪" : "杀") + + "当做" + + get.translation(card) + + "使用" + ); }, }, - hiddenCard:function(player,name){ - if(get.type(name)!='basic'||!player.hasMark('charge')) return false; - var marked=player.hasSkill('sblongdan_mark',null,null,false); - if(!marked&&name!='sha'&&name!='shan') return false; - return player.hasCard(lib.skill.sblongdan.getFilter(name,player),'hs'); + hiddenCard: function (player, name) { + if (get.type(name) != "basic" || !player.hasMark("charge")) return false; + var marked = player.hasSkill("sblongdan_mark", null, null, false); + if (!marked && name != "sha" && name != "shan") return false; + return player.hasCard(lib.skill.sblongdan.getFilter(name, player), "hs"); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ - return lib.skill.sblongdan.hiddenCard(player,tag=='respondSha'?'sha':'shan') + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + return lib.skill.sblongdan.hiddenCard(player, tag == "respondSha" ? "sha" : "shan"); }, - order:9, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + order: 9, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, - getFilter:function(name,player){ - if(!player.hasSkill('sblongdan_mark',null,null,false)){ - if(name=='sha') return {name:'shan'}; - if(name=='shan') return {name:'sha'}; - return (()=>false); + getFilter: function (name, player) { + if (!player.hasSkill("sblongdan_mark", null, null, false)) { + if (name == "sha") return { name: "shan" }; + if (name == "shan") return { name: "sha" }; + return () => false; } - return {type:'basic'}; + return { type: "basic" }; }, - group:'sblongdan_charge', - onremove:function(player){ - player.removeSkill('sblongdan_mark'); + group: "sblongdan_charge", + onremove: function (player) { + player.removeSkill("sblongdan_mark"); }, - subSkill:{ - backup:{audio:'sblongdan'}, - mark:{charlotte:true}, - draw:{ - charlotte:true, - trigger:{player:['useCardAfter']}, - forced:true, - popup:false, - filter:function(event,player){ - return event.skill=='sblongdan_backup'; + subSkill: { + backup: { audio: "sblongdan" }, + mark: { charlotte: true }, + draw: { + charlotte: true, + trigger: { player: ["useCardAfter"] }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "sblongdan_backup"; }, - content:function(){ + content: function () { player.draw(); }, }, - charge:{ - audio:'sblongdan', - trigger:{ - global:['phaseBefore','phaseEnd'], - player:'enterGame', + charge: { + audio: "sblongdan", + trigger: { + global: ["phaseBefore", "phaseEnd"], + player: "enterGame", }, - forced:true, - filter:function(event,player,name){ - if(player.countMark('charge')>2) return false; - return (name!='phaseBefore'||game.phaseNumber==0); + forced: true, + filter: function (event, player, name) { + if (player.countMark("charge") > 2) return false; + return name != "phaseBefore" || game.phaseNumber == 0; }, - content:function(){ - player.addMark('charge',1); + content: function () { + player.addMark("charge", 1); }, }, }, }, - sbjizhu:{ - audio:3, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,get.prompt('sbjizhu'),'和一名其他角色进行“协力”').set('ai',function(target){ - return get.threaten(target)*Math.sqrt(1+target.countCards('h'))*((target.isTurnedOver()||target.hasJudge('lebu'))?0.1:1); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbjizhu',target); - player.chooseCooperationFor(target,'sbjizhu').set('ai',function(button){ - var base=0; - switch(button.link){ - case 'cooperation_damage':base=0.1;break; - case 'cooperation_draw':base=0.6;break; - case 'cooperation_discard':base=0.1;break; - case 'cooperation_use':base=0.6;break; - } - return base+Math.random(); + sbjizhu: { + audio: 3, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, get.prompt("sbjizhu"), "和一名其他角色进行“协力”") + .set("ai", function (target) { + return ( + get.threaten(target) * + Math.sqrt(1 + target.countCards("h")) * + (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1) + ); }); - player.addAdditionalSkill('cooperation','sbjizhu_effect'); - } - else event.finish(); - 'step 2' + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbjizhu", target); + player.chooseCooperationFor(target, "sbjizhu").set("ai", function (button) { + var base = 0; + switch (button.link) { + case "cooperation_damage": + base = 0.1; + break; + case "cooperation_draw": + base = 0.6; + break; + case "cooperation_discard": + base = 0.1; + break; + case "cooperation_use": + base = 0.6; + break; + } + return base + Math.random(); + }); + player.addAdditionalSkill("cooperation", "sbjizhu_effect"); + } else event.finish(); + ("step 2"); game.delayx(); }, - subSkill:{ - effect:{ - audio:'sbjizhu', - charlotte:true, - trigger:{global:'phaseJieshuBegin'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return player.checkCooperationStatus(event.player,'sbjizhu')&&player.hasSkill('sblongdan',null,null,false); + subSkill: { + effect: { + audio: "sbjizhu", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return ( + player.checkCooperationStatus(event.player, "sbjizhu") && + player.hasSkill("sblongdan", null, null, false) + ); }, - content:function(){ - game.log(player,'和',trigger.player,'的协力成功'); - player.addTempSkill('sblongdan_mark',{player:'phaseJieshuBegin'}); + content: function () { + game.log(player, "和", trigger.player, "的协力成功"); + player.addTempSkill("sblongdan_mark", { player: "phaseJieshuBegin" }); game.delayx(); }, }, }, - derivation:'sblongdan_shabi', - ai:{ - combo:'sblongdan' - } + derivation: "sblongdan_shabi", + ai: { + combo: "sblongdan", + }, }, //张飞 - sbpaoxiao:{ - audio:2, - mod:{ - cardUsable:function(card){ - if(card.name=='sha') return Infinity; + sbpaoxiao: { + audio: 2, + mod: { + cardUsable: function (card) { + if (card.name == "sha") return Infinity; }, - targetInRange:function(card,player,target){ - if(card.name=='sha'&&player.getEquips(1).length>0) return true; + targetInRange: function (card, player, target) { + if (card.name == "sha" && player.getEquips(1).length > 0) return true; }, }, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - return player.hasHistory('useCard',function(evtx){ - return evtx!=event&&evtx.card.name=='sha'&&evtx.getParent('phaseUse')==evt; - },event); + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + return player.hasHistory( + "useCard", + function (evtx) { + return ( + evtx != event && evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt + ); + }, + event + ); }, - content:function(){ - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.sbpaoxiao=true; + content: function () { + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sbpaoxiao = true; trigger.baseDamage++; trigger.directHit.addArray(game.players); - player.addTempSkill('sbpaoxiao_effect','phaseUseAfter'); + player.addTempSkill("sbpaoxiao_effect", "phaseUseAfter"); }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{player:'useCardToPlayered'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card.storage&&event.card.storage.sbpaoxiao&&event.target.isIn(); + subSkill: { + effect: { + charlotte: true, + trigger: { player: "useCardToPlayered" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card.storage && event.card.storage.sbpaoxiao && event.target.isIn(); }, - content:function(){ - trigger.target.addTempSkill('fengyin'); + content: function () { + trigger.target.addTempSkill("fengyin"); }, - group:'sbpaoxiao_recoil', + group: "sbpaoxiao_recoil", }, - recoil:{ - charlotte:true, - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card.storage&&event.card.storage.sbpaoxiao&&event.player.isIn(); + recoil: { + charlotte: true, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return ( + event.card && + event.card.storage && + event.card.storage.sbpaoxiao && + event.player.isIn() + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseHp(); - 'step 1' - var hs=player.getCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'sbpaoxiao_recoil'); + ("step 1"); + var hs = player.getCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "sbpaoxiao_recoil"); }); - if(hs.length>0) player.discard(hs.randomGet()); + if (hs.length > 0) player.discard(hs.randomGet()); }, }, }, }, - sbxieji:{ - audio:3, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,get.prompt('sbxieji'),'和一名其他角色进行“协力”').set('ai',function(target){ - return get.threaten(target)*Math.sqrt(1+target.countCards('h'))*((target.isTurnedOver()||target.hasJudge('lebu'))?0.1:1); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbxieji',target); + sbxieji: { + audio: 3, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, get.prompt("sbxieji"), "和一名其他角色进行“协力”") + .set("ai", function (target) { + return ( + get.threaten(target) * + Math.sqrt(1 + target.countCards("h")) * + (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbxieji", target); //选择对方的协击条件 - player.chooseCooperationFor(target,'sbxieji').set('ai',function(button){ - var base=0; - switch(button.link){ - case 'cooperation_damage':base=0.8;break; - case 'cooperation_draw':base=0.1;break; - case 'cooperation_discard':base=0.1;break; - case 'cooperation_use':base=0.1;break; + player.chooseCooperationFor(target, "sbxieji").set("ai", function (button) { + var base = 0; + switch (button.link) { + case "cooperation_damage": + base = 0.8; + break; + case "cooperation_draw": + base = 0.1; + break; + case "cooperation_discard": + base = 0.1; + break; + case "cooperation_use": + base = 0.1; + break; } - return base+Math.random(); + return base + Math.random(); }); //保证技能cooperation被移除之后 失去该技能 - player.addAdditionalSkill('cooperation','sbxieji_effect'); - } - else event.finish(); - 'step 2' + player.addAdditionalSkill("cooperation", "sbxieji_effect"); + } else event.finish(); + ("step 2"); game.delayx(); }, - subSkill:{ - effect:{ - audio:'sbxieji', - charlotte:true, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ + subSkill: { + effect: { + audio: "sbxieji", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { //判断自己是否有目标为该角色 且已经完成的协力记录 - return player.checkCooperationStatus(event.player,'sbxieji'); + return player.checkCooperationStatus(event.player, "sbxieji"); }, - content:function(){ - 'step 0' - game.log(player,'和',trigger.player,'的协力成功'); - player.chooseTarget('协击:请选择【杀】的目标','你和'+get.translation(trigger.player)+'协力成功,可以视为对至多三名其他角色使用一张【杀】,且此【杀】造成伤害时,你摸等同于伤害值的牌',[1,3],true,function(card,player,target){ - return player.canUse('sha',target,false); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); - }); - 'step 1' - if(result.bool){ - player.addTempSkill('sbxieji_reward','sbxieji_effectAfter'); - player.useCard({ - name:'sha', - isCard:true, - storage:{sbxieji:true}, - },'sbxieji_effect',result.targets); + content: function () { + "step 0"; + game.log(player, "和", trigger.player, "的协力成功"); + player + .chooseTarget( + "协击:请选择【杀】的目标", + "你和" + + get.translation(trigger.player) + + "协力成功,可以视为对至多三名其他角色使用一张【杀】,且此【杀】造成伤害时,你摸等同于伤害值的牌", + [1, 3], + true, + function (card, player, target) { + return player.canUse("sha", target, false); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + ("step 1"); + if (result.bool) { + player.addTempSkill("sbxieji_reward", "sbxieji_effectAfter"); + player.useCard( + { + name: "sha", + isCard: true, + storage: { sbxieji: true }, + }, + "sbxieji_effect", + result.targets + ); } }, }, - reward:{ - charlotte:true, - trigger:{source:'damageSource'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card&&event.card.storage&&event.card.storage.sbxieji&&event.getParent().type=='card'; + reward: { + charlotte: true, + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.card && + event.card.storage && + event.card.storage.sbxieji && + event.getParent().type == "card" + ); }, - content:function(){ + content: function () { player.draw(trigger.num); }, }, }, }, //徐晃 - sbduanliang:{ - audio:1, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - player.chooseToDuiben(target).set('title','谋弈').set('namelist',[ - '固守城池','突出重围','围城断粮','擂鼓进军' - ]).set('ai',button=>{ - var source=_status.event.getParent().player,target=_status.event.getParent().target; - if(get.effect(target,{name:'juedou'},source,source)>=10&&button.link[2]=='db_def2'&&Math.random()<0.5) return 10; - return 1+Math.random(); - }); - 'step 1' - if(result.bool){ - if(result.player=='db_def1'){ - if(target.hasJudge('bingliang')) player.gainPlayerCard(target,'he',true); - else{ - if(ui.cardPile.childNodes.length>0) { - if(player.canUse(get.autoViewAs({name:'bingliang'},[ui.cardPile.firstChild]),target,false)){ - player.useCard({name:'bingliang'},target,get.cards()); + sbduanliang: { + audio: 1, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + player + .chooseToDuiben(target) + .set("title", "谋弈") + .set("namelist", ["固守城池", "突出重围", "围城断粮", "擂鼓进军"]) + .set("ai", (button) => { + var source = _status.event.getParent().player, + target = _status.event.getParent().target; + if ( + get.effect(target, { name: "juedou" }, source, source) >= 10 && + button.link[2] == "db_def2" && + Math.random() < 0.5 + ) + return 10; + return 1 + Math.random(); + }); + ("step 1"); + if (result.bool) { + if (result.player == "db_def1") { + if (target.hasJudge("bingliang")) player.gainPlayerCard(target, "he", true); + else { + if (ui.cardPile.childNodes.length > 0) { + if ( + player.canUse( + get.autoViewAs({ name: "bingliang" }, [ui.cardPile.firstChild]), + target, + false + ) + ) { + player.useCard({ name: "bingliang" }, target, get.cards()); } } } - } - else{ - var card={name:'juedou',isCard:true}; - if(player.canUse(card,target)) player.useCard(card,target); + } else { + var card = { name: "juedou", isCard: true }; + if (player.canUse(card, target)) player.useCard(card, target); } } }, - ai:{ - threaten:1.2, - order:5.5, - result:{ - player:1, - target:-1 - } + ai: { + threaten: 1.2, + order: 5.5, + result: { + player: 1, + target: -1, + }, + }, + subSkill: { + true1: { audio: true }, + true2: { audio: true }, + false: { audio: true }, }, - subSkill:{ - true1:{audio:true}, - true2:{audio:true}, - false:{audio:true}, - } }, - sbshipo:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current.hp { + return current.hp < player.hp || current.hasJudge("bingliang"); }); }, - content:function(){ - 'step 0' - var list=[]; - var choiceList=['选择一名体力少于你的角色','选择所有判定区有兵粮寸断的其他角色']; - var bool=false,bool2=false; - game.filterPlayer(current=>{ - if(current.hp { + if (current.hp < player.hp) bool = true; + if (current.hasJudge("bingliang")) bool2 = true; }); - if(bool) list.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(bool2) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - player.chooseControl(list,'cancel2').set('prompt',get.prompt2('sbshipo')).set('choiceList',choiceList).set('ai',()=>{ - return _status.event.choice; - }).set('choice',(function(){ - var eff=0,eff2=0; - if(!list.includes('选项一')) eff=Infinity; - if(!list.includes('选项二')) eff2=Infinity; - game.countPlayer(current=>{ - if(current.hp"; + if (bool2) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - if(eff>0&&eff2>0) return 'cancel2'; - return eff { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var eff = 0, + eff2 = 0; + if (!list.includes("选项一")) eff = Infinity; + if (!list.includes("选项二")) eff2 = Infinity; + game.countPlayer((current) => { + if (current.hp < player.hp) { + var effx = + get.attitude(player, current) / + Math.sqrt( + Math.max(0.1, 2 * current.hp + current.countCards("h")) + ); + if (effx < eff) eff = effx; + } + if (current.hasJudge("bingliang")) + eff2 += + get.attitude(player, current) / + Math.sqrt( + Math.max(0.1, 2 * current.hp + current.countCards("h")) + ); + }); + if (eff > 0 && eff2 > 0) return "cancel2"; + return eff < eff2 ? "选项一" : "选项二"; + })() + ); + ("step 1"); + if (result.control == "cancel2") { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + event.finish(); + return; } - if(result.control=='选项一'){ - player.chooseTarget('选择一名体力少于你的角色',(card,player,target)=>target.hp-get.attitude(player,target)/Math.sqrt(Math.max(0.1,2*target.hp+target.countCards('h')))); + if (result.control == "选项一") { + player + .chooseTarget( + "选择一名体力少于你的角色", + (card, player, target) => target.hp < player.hp, + true + ) + .set( + "ai", + (target) => + -get.attitude(player, target) / + Math.sqrt(Math.max(0.1, 2 * target.hp + target.countCards("h"))) + ); + } else { + event._result = { + bool: true, + targets: game.filterPlayer((current) => current.hasJudge("bingliang")), + }; } - else{ - event._result={bool:true,targets:game.filterPlayer(current=>current.hasJudge('bingliang'))}; - } - 'step 2' - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); - if(result.bool){ - var targets=result.targets; - player.logSkill('sbshipo',targets); - event.targets=targets.sortBySeat(); - event.cards=[]; - } - else event.finish(); - 'step 3' - var target=event.targets.shift(); - event.target=target; - target.chooseCard('交给'+get.translation(player)+'一张手牌,或受到1点伤害').set('ai',card=>{ - var player=_status.event.player,source=_status.event.getParent().player; - if(get.damageEffect(player,source,player)>0) return 0; - if(get.attitude(player,source)>0) return 1; - if(get.tag(card,'recover')>0) return 0; - return (player.hp<2?7:5.5)-get.value(card); + ("step 2"); + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); }); - 'step 4' - if(result.bool){ + if (result.bool) { + var targets = result.targets; + player.logSkill("sbshipo", targets); + event.targets = targets.sortBySeat(); + event.cards = []; + } else event.finish(); + ("step 3"); + var target = event.targets.shift(); + event.target = target; + target + .chooseCard("交给" + get.translation(player) + "一张手牌,或受到1点伤害") + .set("ai", (card) => { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.damageEffect(player, source, player) > 0) return 0; + if (get.attitude(player, source) > 0) return 1; + if (get.tag(card, "recover") > 0) return 0; + return (player.hp < 2 ? 7 : 5.5) - get.value(card); + }); + ("step 4"); + if (result.bool) { event.cards.addArray(result.cards); - target.give(result.cards,player); - } - else{ + target.give(result.cards, player); + } else { target.damage(); } - 'step 5' - if(event.targets.length) event.goto(3); - else{ - var cards=event.cards.filter(card=>get.owner(card)==player&&get.position(card)=='h'); - if(!cards.length) event.finish(); - else event.cards=cards; + ("step 5"); + if (event.targets.length) event.goto(3); + else { + var cards = event.cards.filter( + (card) => get.owner(card) == player && get.position(card) == "h" + ); + if (!cards.length) event.finish(); + else event.cards = cards; } - 'step 6' + ("step 6"); player.chooseCardTarget({ - filterCard:function(card,player,target){ + filterCard: function (card, player, target) { return _status.event.getParent().cards.includes(card); }, - filterTarget:lib.filter.notMe, - selectCard:[1,event.cards.length], - prompt:'是否将任意张得到的牌交给一名其他角色?', - ai1:function(card){ - var player=_status.event.player; - var val=player.getUseValue(card); - if(val>0) return 2; - if(player.hp<=2&&val==0&&get.value(card)>5) return 0; - return Math.random()>0.5?1:0; + filterTarget: lib.filter.notMe, + selectCard: [1, event.cards.length], + prompt: "是否将任意张得到的牌交给一名其他角色?", + ai1: function (card) { + var player = _status.event.player; + var val = player.getUseValue(card); + if (val > 0) return 2; + if (player.hp <= 2 && val == 0 && get.value(card) > 5) return 0; + return Math.random() > 0.5 ? 1 : 0; }, - ai2:function(target){ - var player=_status.event.player,cards=ui.selected.cards; - var val=0; - for(var card of cards){ - val+=target.getUseValue(card); + ai2: function (target) { + var player = _status.event.player, + cards = ui.selected.cards; + var val = 0; + for (var card of cards) { + val += target.getUseValue(card); } - if(val>0) return val*get.attitude(player,target)*2; - return get.value(card,target)*get.attitude(player,target); + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); }, }); - 'step 7' - if(result.bool){ - var cards=result.cards,target=result.targets[0]; - player.give(cards,target); + ("step 7"); + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.give(cards, target); } - } + }, }, //马超 - sbtieji:{ - audio:1, - trigger:{player:'useCardToPlayered'}, - logTarget:'target', - filter:function(event,player){ - return player!=event.target&&event.card.name=='sha'&&event.target.isIn(); + sbtieji: { + audio: 1, + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter: function (event, player) { + return player != event.target && event.card.name == "sha" && event.target.isIn(); }, - check:function(event,player){ - return get.attitude(player,event.target)<0; + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - target.addTempSkill('fengyin'); + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + target.addTempSkill("fengyin"); trigger.directHit.add(target); - player.chooseToDuiben(target).set('title','谋弈').set('namelist',[ - '出阵迎战','拱卫中军','直取敌营','扰阵疲敌' - ]).set('ai',button=>{ - var source=get.event().getParent().player,target=get.event().getParent().target; - if(!target.countCards('he')&&button.link[2]=='db_def2') return 10; - if(!target.countCards('he')&&get.attitude(target,source)<=0&&button.link[2]=='db_atk1') return 10; - return 1+Math.random(); - }); - 'step 1' - if(result.bool){ - if(result.player=='db_def1') player.gainPlayerCard(target,'he',true); + player + .chooseToDuiben(target) + .set("title", "谋弈") + .set("namelist", ["出阵迎战", "拱卫中军", "直取敌营", "扰阵疲敌"]) + .set("ai", (button) => { + var source = get.event().getParent().player, + target = get.event().getParent().target; + if (!target.countCards("he") && button.link[2] == "db_def2") return 10; + if ( + !target.countCards("he") && + get.attitude(target, source) <= 0 && + button.link[2] == "db_atk1" + ) + return 10; + return 1 + Math.random(); + }); + ("step 1"); + if (result.bool) { + if (result.player == "db_def1") player.gainPlayerCard(target, "he", true); else player.draw(2); } }, - shaRelated:true, - ai:{ - ignoreSkill:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='directHit_ai'){ - return get.attitude(player,arg.target)<=0; + shaRelated: true, + ai: { + ignoreSkill: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "directHit_ai") { + return get.attitude(player, arg.target) <= 0; } - if(!arg||arg.isLink||!arg.card||arg.card.name!='sha') return false; - if(!arg.target||get.attitude(player,arg.target)>=0) return false; - if(!arg.skill||!lib.skill[arg.skill]||lib.skill[arg.skill].charlotte||get.is.locked(arg.skill)||!arg.target.getSkills(true,false).includes(arg.skill)) return false; + if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false; + if (!arg.target || get.attitude(player, arg.target) >= 0) return false; + if ( + !arg.skill || + !lib.skill[arg.skill] || + lib.skill[arg.skill].charlotte || + get.is.locked(arg.skill) || + !arg.target.getSkills(true, false).includes(arg.skill) + ) + return false; }, - directHit_ai:true, + directHit_ai: true, + }, + subSkill: { + true1: { audio: true }, + true2: { audio: true }, + false: { audio: true }, }, - subSkill:{ - true1:{audio:true}, - true2:{audio:true}, - false:{audio:true}, - } }, //甘宁 - sbqixi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + sbqixi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - event.list=lib.suit.slice(); - event.suits=[]; - event.num=0; - var cards=player.getCards('h'),map={},max=-Infinity; - for(var card of cards){ - var suit=get.suit(card,player); - if(!map[suit]) map[suit]=0; + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + event.list = lib.suit.slice(); + event.suits = []; + event.num = 0; + var cards = player.getCards("h"), + map = {}, + max = -Infinity; + for (var card of cards) { + var suit = get.suit(card, player); + if (!map[suit]) map[suit] = 0; map[suit]++; - if(map[suit]>max) max=map[suit]; + if (map[suit] > max) max = map[suit]; } - for(var i in map){ - if(map[i]==max) event.suits.push(i); + for (var i in map) { + if (map[i] == max) event.suits.push(i); } - 'step 1' - target.chooseControl(event.list).set('prompt','奇袭:猜测'+get.translation(player)+'手牌中最多的花色').set('ai',()=>{ - var player=_status.event.getParent().player,controls=_status.event.controls; - if(player.countCards('h')<=3&&controls.includes('diamond')&&Math.random()<0.3) return 'diamond'; - return controls.randomGet(); - }); - 'step 2' - var control=result.control; - target.chat('我猜是'+get.translation(control)+'!'); - game.log(target,'猜测为','#y'+control); - if(!event.isMine()&&!event.isOnline()) game.delayx(); - 'step 3' - var control=result.control; - if(!event.suits.includes(control)){ - player.chat('猜错了!'); - game.log(target,'猜测','#y错误'); + ("step 1"); + target + .chooseControl(event.list) + .set("prompt", "奇袭:猜测" + get.translation(player) + "手牌中最多的花色") + .set("ai", () => { + var player = _status.event.getParent().player, + controls = _status.event.controls; + if ( + player.countCards("h") <= 3 && + controls.includes("diamond") && + Math.random() < 0.3 + ) + return "diamond"; + return controls.randomGet(); + }); + ("step 2"); + var control = result.control; + target.chat("我猜是" + get.translation(control) + "!"); + game.log(target, "猜测为", "#y" + control); + if (!event.isMine() && !event.isOnline()) game.delayx(); + ("step 3"); + var control = result.control; + if (!event.suits.includes(control)) { + player.chat("猜错了!"); + game.log(target, "猜测", "#y错误"); event.num++; event.list.remove(control); - player.chooseBool('是否令其重新选择一个花色继续猜测?').set('ai',()=>1); - } - else { - player.chat(event.num==0?'这么准?':'猜对了!'); - game.log(target,'猜测','#g正确'); + player.chooseBool("是否令其重新选择一个花色继续猜测?").set("ai", () => 1); + } else { + player.chat(event.num == 0 ? "这么准?" : "猜对了!"); + game.log(target, "猜测", "#g正确"); player.showHandcards(); event.goto(4); } - 'step 4' - if(result.bool){ + ("step 4"); + if (result.bool) { event.goto(1); } - 'step 5' - if(event.num>0&&target.countDiscardableCards(player,'hej')){ + ("step 5"); + if (event.num > 0 && target.countDiscardableCards(player, "hej")) { player.line(target); - player.discardPlayerCard(target,event.num,true,'hej'); + player.discardPlayerCard(target, event.num, true, "hej"); } }, - ai:{ - order:10, - result:{ - player:1, - target:function(player,target){ - return get.effect(target,{name:'guohe'},player,target)*(5-get.attitude(player,target)/2); - } - } - } + ai: { + order: 10, + result: { + player: 1, + target: function (player, target) { + return ( + get.effect(target, { name: "guohe" }, player, target) * + (5 - get.attitude(player, target) / 2) + ); + }, + }, + }, }, - sbfenwei:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he')>0; + sbfenwei: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") > 0; }, - skillAnimation:true, - animationColor:'wood', - limited:true, - position:'he', - filterCard:true, - selectCard:[1,3], - filterTarget:true, - selectTarget:function(){ + skillAnimation: true, + animationColor: "wood", + limited: true, + position: "he", + filterCard: true, + selectCard: [1, 3], + filterTarget: true, + selectTarget: function () { return ui.selected.cards.length; }, - delay:false, - discard:false, - lose:false, - complexSelect:true, - filterOk:function(){ - return ui.selected.targets.length==ui.selected.cards.length; + delay: false, + discard: false, + lose: false, + complexSelect: true, + filterOk: function () { + return ui.selected.targets.length == ui.selected.cards.length; }, - multitarget:true, - multiline:true, - check:function(card){ - return 7-get.value(card); + multitarget: true, + multiline: true, + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - 'step 0' - player.awakenSkill('sbfenwei'); - for(var i=0; i{ - return get.rawAttitude(player,current)>0&¤t!=player&&get.attitude(player,current)<=0; - })&&game.countPlayer(current=>{ - return get.attitude(player,current)>0; - })<=2) return 0; + ai: { + order: 6.9, + result: { + target: function (player, target) { + if ( + game.hasPlayer((current) => { + return ( + get.rawAttitude(player, current) > 0 && + current != player && + get.attitude(player, current) <= 0 + ); + }) && + game.countPlayer((current) => { + return get.attitude(player, current) > 0; + }) <= 2 + ) + return 0; return 1; }, - } + }, }, - subSkill:{ - effect:{ - audio:'sbfenwei', - trigger:{ - global:'useCardToTarget', + subSkill: { + effect: { + audio: "sbfenwei", + trigger: { + global: "useCardToTarget", }, - charlotte:true, - forced:true, - filter:function(event,player){ - return event.target.getExpansions('sbfenwei_effect').length>0&&get.type2(event.card)=='trick'; + charlotte: true, + forced: true, + filter: function (event, player) { + return ( + event.target.getExpansions("sbfenwei_effect").length > 0 && + get.type2(event.card) == "trick" + ); }, - content:function(){ - 'step 0' - var choiceList=['令'+get.translation(trigger.target)+'获得其“威”','移去'+ get.translation(trigger.target) +'的“威”,取消'+get.translation(trigger.card)+'对其的目标']; - player.chooseControl().set('choiceList',choiceList).set('prompt','奋威:请选择一项').set('ai',()=>{ - var player=_status.event.player,evt=_status.event.getTrigger(); - if(get.effect(evt.target,evt.card,evt.player,player)<-10) return 1; - return 0; - }); - 'step 1' - var cards=trigger.target.getExpansions('sbfenwei_effect'); - if(result.index==0){ - trigger.target.gain(cards,'gain2','fromStorage'); - } - else { + content: function () { + "step 0"; + var choiceList = [ + "令" + get.translation(trigger.target) + "获得其“威”", + "移去" + + get.translation(trigger.target) + + "的“威”,取消" + + get.translation(trigger.card) + + "对其的目标", + ]; + player + .chooseControl() + .set("choiceList", choiceList) + .set("prompt", "奋威:请选择一项") + .set("ai", () => { + var player = _status.event.player, + evt = _status.event.getTrigger(); + if (get.effect(evt.target, evt.card, evt.player, player) < -10) return 1; + return 0; + }); + ("step 1"); + var cards = trigger.target.getExpansions("sbfenwei_effect"); + if (result.index == 0) { + trigger.target.gain(cards, "gain2", "fromStorage"); + } else { trigger.target.loseToDiscardpile(cards); trigger.targets.remove(trigger.target); trigger.getParent().triggeredTargets2.remove(trigger.target); trigger.untrigger(); } }, - marktext:'威', - intro:{ - name:'威', - markcount:'expansion', - content:'expansion', + marktext: "威", + intro: { + name: "威", + markcount: "expansion", + content: "expansion", }, - } - } + }, + }, }, //甄宓 - sbluoshen:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('sbluoshen')).set('ai',target=>{ - var eff=0; - var num=Math.ceil(game.countPlayer()/2),players=game.filterPlayer(current=>current!=player).sortBySeat(target).slice(0,num); - for(var targetx of players){ - eff+=get.attitude(player,targetx)*Math.sqrt(targetx.countCards('h')); + sbluoshen: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("sbluoshen")).set("ai", (target) => { + var eff = 0; + var num = Math.ceil(game.countPlayer() / 2), + players = game + .filterPlayer((current) => current != player) + .sortBySeat(target) + .slice(0, num); + for (var targetx of players) { + eff += get.attitude(player, targetx) * Math.sqrt(targetx.countCards("h")); } - return 1-eff; + return 1 - eff; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbluoshen',target); - player.addTempSkill('sbluoshen_add'); - event.targets=game.filterPlayer(current=>current!=player).sortBySeat(target).slice(0,Math.ceil(game.countPlayer()/2)); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbluoshen", target); + player.addTempSkill("sbluoshen_add"); + event.targets = game + .filterPlayer((current) => current != player) + .sortBySeat(target) + .slice(0, Math.ceil(game.countPlayer() / 2)); } else event.finish(); - 'step 2' - var target=event.targets.shift(); - event.target=target; + ("step 2"); + var target = event.targets.shift(); + event.target = target; player.line(target); - if(!target.countCards('h')) event._result={bool:false}; - else target.chooseCard('展示一张手牌',true).set('ai',card=>{ - var val=_status.event.goon?15:5; - if(get.color(card)=='black') return val-get.value(card); - return 7-get.value(card); - }).set('goon',get.attitude(target,player)>0); - 'step 3' - if(result.bool){ - var card=result.cards[0]; - target.showCards(card,get.translation(target)+'【洛神】展示'); - if(get.color(card)=='black'){ - player.gain(card,target,'give','bySelf').gaintag.add('sbluoshen'); - } - else if(get.color(card)=='red'){ + if (!target.countCards("h")) event._result = { bool: false }; + else + target + .chooseCard("展示一张手牌", true) + .set("ai", (card) => { + var val = _status.event.goon ? 15 : 5; + if (get.color(card) == "black") return val - get.value(card); + return 7 - get.value(card); + }) + .set("goon", get.attitude(target, player) > 0); + ("step 3"); + if (result.bool) { + var card = result.cards[0]; + target.showCards(card, get.translation(target) + "【洛神】展示"); + if (get.color(card) == "black") { + player.gain(card, target, "give", "bySelf").gaintag.add("sbluoshen"); + } else if (get.color(card) == "red") { target.discard(card); } } - 'step 4' - if(targets.length) event.goto(2); + ("step 4"); + if (targets.length) event.goto(2); }, - subSkill:{ - add:{ - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('sbluoshen')){ + subSkill: { + add: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("sbluoshen")) { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('sbluoshen')){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("sbluoshen")) { return false; } }, }, - onremove:function(player){ - player.removeGaintag('sbluoshen'); + onremove: function (player) { + player.removeGaintag("sbluoshen"); }, - } - } + }, + }, }, //曹操 - sbjianxiong:{ - audio:2, - trigger:{player:'damageEnd'}, - group:'sbjianxiong_mark', - filter:function(event,player){ - return get.itemtype(event.cards)=='cards'&&event.cards.some(i=>get.position(i,true)=='o')||1-player.countMark('sbjianxiong')>0; + sbjianxiong: { + audio: 2, + trigger: { player: "damageEnd" }, + group: "sbjianxiong_mark", + filter: function (event, player) { + return ( + (get.itemtype(event.cards) == "cards" && + event.cards.some((i) => get.position(i, true) == "o")) || + 1 - player.countMark("sbjianxiong") > 0 + ); }, - prompt2:function(event,player){ - var gain=get.itemtype(event.cards)=='cards'&&event.cards.some(i=>get.position(i,true)=='o'),draw=1-player.countMark('sbjianxiong'); - var str=''; - if(gain) str+='获得'+get.translation(event.cards); - if(gain&&draw>0) str+='并'; - if(draw>0) str+='摸'+get.cnNumber(1-player.countMark('sbjianxiong'))+'张牌'; - if(player.countMark('sbjianxiong')) str+=',然后可以弃1枚“治世”'; + prompt2: function (event, player) { + var gain = + get.itemtype(event.cards) == "cards" && + event.cards.some((i) => get.position(i, true) == "o"), + draw = 1 - player.countMark("sbjianxiong"); + var str = ""; + if (gain) str += "获得" + get.translation(event.cards); + if (gain && draw > 0) str += "并"; + if (draw > 0) str += "摸" + get.cnNumber(1 - player.countMark("sbjianxiong")) + "张牌"; + if (player.countMark("sbjianxiong")) str += ",然后可以弃1枚“治世”"; return str; }, - content:function(){ - 'step 0' - if(get.itemtype(trigger.cards)=='cards'&&trigger.cards.some(i=>get.position(i,true)=='o')){ - player.gain(trigger.cards,'gain2'); + content: function () { + "step 0"; + if ( + get.itemtype(trigger.cards) == "cards" && + trigger.cards.some((i) => get.position(i, true) == "o") + ) { + player.gain(trigger.cards, "gain2"); } - var num=player.countMark('sbjianxiong'); - if(1-num>0){ - player.draw(1-num,'nodelay'); + var num = player.countMark("sbjianxiong"); + if (1 - num > 0) { + player.draw(1 - num, "nodelay"); } - if(!num) event.finish(); - 'step 1' - player.chooseBool('是否弃1枚“治世”?').set('ai',()=>{ - var player=_status.event.player,current=_status.currentPhase; - if(get.distance(current,player,'absolute')>3&&player.hp<=2) return true; + if (!num) event.finish(); + ("step 1"); + player.chooseBool("是否弃1枚“治世”?").set("ai", () => { + var player = _status.event.player, + current = _status.currentPhase; + if (get.distance(current, player, "absolute") > 3 && player.hp <= 2) return true; return false; }); - 'step 2' - if(result.bool){ - player.removeMark('sbjianxiong',1); + ("step 2"); + if (result.bool) { + player.removeMark("sbjianxiong", 1); } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')&&player!=target){ - var cards=card.cards,evt=_status.event; - if(evt.player==target&&card.name=='damage'&&evt.getParent().type=='card') cards=evt.getParent().cards.filterInD(); - if(target.hp<=1) return; - if(get.itemtype(cards)!='cards') return; - for(var i of cards){ - if(get.name(i,target)=='tao') return [1,5]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) { + var cards = card.cards, + evt = _status.event; + if ( + evt.player == target && + card.name == "damage" && + evt.getParent().type == "card" + ) + cards = evt.getParent().cards.filterInD(); + if (target.hp <= 1) return; + if (get.itemtype(cards) != "cards") return; + for (var i of cards) { + if (get.name(i, target) == "tao") return [1, 5]; } - if(get.value(cards,target)>=(7+target.getDamagedHp())) return [1,3]; - return [1,0.55+0.05*Math.max(0,1-target.countMark('sbjianxiong'))]; + if (get.value(cards, target) >= 7 + target.getDamagedHp()) return [1, 3]; + return [1, 0.55 + 0.05 * Math.max(0, 1 - target.countMark("sbjianxiong"))]; } - } - } - }, - marktext:'治', - intro:{ - name:'治世', - name2:'治世', - content:'mark', - }, - subSkill:{ - mark:{ - audio:'sbjianxiong', - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); }, - content:function(){ - 'step 0' - var map={}; - var list=[]; - for(var i=1; i<=2; i++){ - var cn=get.cnNumber(i,true); - map[cn]=i; + }, + }, + marktext: "治", + intro: { + name: "治世", + name2: "治世", + content: "mark", + }, + subSkill: { + mark: { + audio: "sbjianxiong", + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content: function () { + "step 0"; + var map = {}; + var list = []; + for (var i = 1; i <= 2; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; list.push(cn); } - event.map=map; - list.push('cancel2'); - player.chooseControl(list,function(){ - return get.cnNumber(2,true); - }).set('prompt','奸雄:获得任意枚“治世”标记'); - 'step 1' - if(result.control!='cancel2') player.addMark('sbjianxiong',event.map[result.control]); - } - } + event.map = map; + list.push("cancel2"); + player + .chooseControl(list, function () { + return get.cnNumber(2, true); + }) + .set("prompt", "奸雄:获得任意枚“治世”标记"); + ("step 1"); + if (result.control != "cancel2") + player.addMark("sbjianxiong", event.map[result.control]); + }, + }, }, }, - sbqingzheng:{ - audio:2, - audioname:['mb_caomao'], - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.countCards('h')>0; + sbqingzheng: { + audio: 2, + audioname: ["mb_caomao"], + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; }, - direct:true, - content:function(){ - 'step 0' - var num=3-player.countMark('sbjianxiong'); - var prompt='###'+get.prompt('sbqingzheng')+'###弃置'+get.cnNumber(num)+'种花色的所有牌'; - var next=player.chooseButton([prompt,[lib.suit.map(i=>['','','lukai_'+i]),'vcard']],num); - next.set('filterButton',button=>{ - var player=_status.event.player; - var cards=player.getCards('h',{suit:button.link[2].slice(6)}); - return cards.length>0&&cards.filter(card=>lib.filter.cardDiscardable(card,player,'sbqingzheng')).length==cards.length; + direct: true, + content: function () { + "step 0"; + var num = 3 - player.countMark("sbjianxiong"); + var prompt = + "###" + get.prompt("sbqingzheng") + "###弃置" + get.cnNumber(num) + "种花色的所有牌"; + var next = player.chooseButton( + [prompt, [lib.suit.map((i) => ["", "", "lukai_" + i]), "vcard"]], + num + ); + next.set("filterButton", (button) => { + var player = _status.event.player; + var cards = player.getCards("h", { suit: button.link[2].slice(6) }); + return ( + cards.length > 0 && + cards.filter((card) => lib.filter.cardDiscardable(card, player, "sbqingzheng")) + .length == cards.length + ); }); - next.set('ai',button=>{ - var player=_status.event.player; - return player.countMark('sbjianxiong')*15-player.getCards('h',{suit:button.link[2].slice(6)}).map(i=>get.value(i)).reduce((p,c)=>p+c,0); + next.set("ai", (button) => { + var player = _status.event.player; + return ( + player.countMark("sbjianxiong") * 15 - + player + .getCards("h", { suit: button.link[2].slice(6) }) + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0) + ); }); - next.set('custom',{ - replace:{ - button:function(button){ - if(!_status.event.isMine()) return; - if(button.classList.contains('selectable')==false) return; - var cards=_status.event.player.getCards('h',{suit:button.link[2].slice(6)}); - if(cards.length){ - var chosen=cards.filter(i=>ui.selected.cards.includes(i)).length==cards.length; - if(chosen){ + next.set("custom", { + replace: { + button: function (button) { + if (!_status.event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + var cards = _status.event.player.getCards("h", { + suit: button.link[2].slice(6), + }); + if (cards.length) { + var chosen = + cards.filter((i) => ui.selected.cards.includes(i)).length == + cards.length; + if (chosen) { ui.selected.cards.removeArray(cards); - cards.forEach(card=>{ - card.classList.remove('selected'); + cards.forEach((card) => { + card.classList.remove("selected"); card.updateTransform(false); }); - }else{ + } else { ui.selected.cards.addArray(cards); - cards.forEach(card=>{ - card.classList.add('selected'); + cards.forEach((card) => { + card.classList.add("selected"); card.updateTransform(true); }); } } - if(button.classList.contains('selected')){ + if (button.classList.contains("selected")) { ui.selected.buttons.remove(button); - button.classList.remove('selected'); - if(_status.multitarget||_status.event.complexSelect){ + button.classList.remove("selected"); + if (_status.multitarget || _status.event.complexSelect) { game.uncheck(); game.check(); } - } - else{ - button.classList.add('selected'); + } else { + button.classList.add("selected"); ui.selected.buttons.add(button); } - var custom=_status.event.custom; - if(custom&&custom.add&&custom.add.button){ + var custom = _status.event.custom; + if (custom && custom.add && custom.add.button) { custom.add.button(); } game.check(); - } + }, }, - add:next.custom.add + add: next.custom.add, }); - 'step 1' - if(result.bool){ - var cards=result.cards; - if(!cards.length){ - var suits=result.links.map(i=>i[2].slice(6)); - cards=player.getCards('h',card=>suits.includes(get.suit(card,player))); + ("step 1"); + if (result.bool) { + var cards = result.cards; + if (!cards.length) { + var suits = result.links.map((i) => i[2].slice(6)); + cards = player.getCards("h", (card) => suits.includes(get.suit(card, player))); } - event.cards=cards; - if(!cards.length) event.finish(); - else player.chooseTarget('清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌',(card,player,target)=>{ - return target!=player&&target.countCards('h'); - }).set('ai',target=>{ - var player=_status.event.player,att=get.attitude(player,target); - if(att>=0) return 0; - return 1-att/2+Math.sqrt(target.countCards('h')); - }); + event.cards = cards; + if (!cards.length) event.finish(); + else + player + .chooseTarget( + "清正:观看一名其他角色的手牌并弃置其中一种花色的所有牌", + (card, player, target) => { + return target != player && target.countCards("h"); + } + ) + .set("ai", (target) => { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + return 1 - att / 2 + Math.sqrt(target.countCards("h")); + }); } else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('sbqingzheng',target); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbqingzheng", target); player.discard(cards); - var list=[]; - var dialog=['清正:弃置'+get.translation(target)+'一种花色的所有牌']; - for(var suit of lib.suit.concat('none')){ - if(target.countCards('h',{suit:suit})){ - dialog.push('
    '+get.translation(suit+'2')+'牌
    '); - dialog.push(target.getCards('h',{suit:suit})); + var list = []; + var dialog = ["清正:弃置" + get.translation(target) + "一种花色的所有牌"]; + for (var suit of lib.suit.concat("none")) { + if (target.countCards("h", { suit: suit })) { + dialog.push( + '
    ' + get.translation(suit + "2") + "牌
    " + ); + dialog.push(target.getCards("h", { suit: suit })); list.push(suit); } } - if(list.length){ - player.chooseControl(list).set('dialog',dialog).set('ai',()=>{ - return _status.event.control; - }).set('control',(()=>{ - var getv=(cards)=>cards.map(i=>get.value(i)).reduce((p,c)=>p+c,0); - return list.sort((a,b)=>{ - return getv(target.getCards('h',{suit:b}))-getv(target.getCards('h',{suit:a})); - })[0]; - })()); + if (list.length) { + player + .chooseControl(list) + .set("dialog", dialog) + .set("ai", () => { + return _status.event.control; + }) + .set( + "control", + (() => { + var getv = (cards) => + cards.map((i) => get.value(i)).reduce((p, c) => p + c, 0); + return list.sort((a, b) => { + return ( + getv(target.getCards("h", { suit: b })) - + getv(target.getCards("h", { suit: a })) + ); + })[0]; + })() + ); } } else event.finish(); - 'step 3' - var cards2=target.getCards('h',{suit:result.control}); - event.cards2=cards2; - target.discard(cards2,'notBySelf').set('discarder',player); - 'step 4' - if(event.cards2.lengthMath.random()<0.5?0:1); + ("step 3"); + var cards2 = target.getCards("h", { suit: result.control }); + event.cards2 = cards2; + target.discard(cards2, "notBySelf").set("discarder", player); + ("step 4"); + if (event.cards2.length < cards.length) target.damage(); + ("step 5"); + if (player.countMark("sbjianxiong") < 2 && player.hasSkill("sbjianxiong")) { + player + .chooseBool("是否获得1枚“治世”?") + .set("ai", () => (Math.random() < 0.5 ? 0 : 1)); } else event.finish(); - 'step 6' - if(result.bool){ - player.addMark('sbjianxiong',1); + ("step 6"); + if (result.bool) { + player.addMark("sbjianxiong", 1); } }, - ai:{combo:'sbjianxiong'} + ai: { combo: "sbjianxiong" }, }, - sbhujia:{ - audio:2, - trigger:{player:'damageBegin4'}, - zhuSkill:true, - direct:true, - filter:function(event,player){ - return !player.hasSkill('sbhujia_used')&&game.hasPlayer(current=>{ - return current!=player&¤t.group=='wei'&&player.hasZhuSkill('sbhujia',current); - }); + sbhujia: { + audio: 2, + trigger: { player: "damageBegin4" }, + zhuSkill: true, + direct: true, + filter: function (event, player) { + return ( + !player.hasSkill("sbhujia_used") && + game.hasPlayer((current) => { + return ( + current != player && + current.group == "wei" && + player.hasZhuSkill("sbhujia", current) + ); + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('sbhujia'),'将'+get.translation(trigger.source)+'即将对你造成的'+trigger.num+'点伤害转移给一名其他魏势力角色',(card,player,target)=>{ - return target!=player&&target.group=='wei'&&player.hasZhuSkill('sbhujia',target); - }).set('ai',target=>{ - var player=_status.event.player,evt=_status.event.getTrigger(); - return get.damageEffect(target,evt.source,player,evt.nature)-_status.event.eff; - }).set('eff',get.damageEffect(player,trigger.source,player,trigger.nature)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbhujia',target); - player.addTempSkill('sbhujia_used','roundStart'); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("sbhujia"), + "将" + + get.translation(trigger.source) + + "即将对你造成的" + + trigger.num + + "点伤害转移给一名其他魏势力角色", + (card, player, target) => { + return ( + target != player && + target.group == "wei" && + player.hasZhuSkill("sbhujia", target) + ); + } + ) + .set("ai", (target) => { + var player = _status.event.player, + evt = _status.event.getTrigger(); + return ( + get.damageEffect(target, evt.source, player, evt.nature) - _status.event.eff + ); + }) + .set("eff", get.damageEffect(player, trigger.source, player, trigger.nature)); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbhujia", target); + player.addTempSkill("sbhujia_used", "roundStart"); trigger.cancel(); - if(trigger.source) target.damage(trigger.source,trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); - else target.damage('nosource',trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); + if (trigger.source) + target + .damage(trigger.source, trigger.nature, trigger.num) + .set("card", trigger.card) + .set("cards", trigger.cards); + else + target + .damage("nosource", trigger.nature, trigger.num) + .set("card", trigger.card) + .set("cards", trigger.cards); } }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(get.tag(card,'damage')&&!target.hasSkill('sbhujia_used')&&game.hasPlayer(current=>{ - return current!=target&¤t.group=='wei'&&target.hasZhuSkill('sbhujia',current); - })) return 0.8; - } + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if ( + get.tag(card, "damage") && + !target.hasSkill("sbhujia_used") && + game.hasPlayer((current) => { + return ( + current != target && + current.group == "wei" && + target.hasZhuSkill("sbhujia", current) + ); + }) + ) + return 0.8; + }, + }, + threaten: function (player, target) { + if (target.countCards("h") == 0) return 2; }, - threaten:function(player,target){ - if(target.countCards('h')==0) return 2; - } }, - subSkill:{ - used:{charlotte:true}, + subSkill: { + used: { charlotte: true }, }, }, //张角 - sbleiji:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countMark('sbguidao')>=4; + sbleiji: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countMark("sbguidao") >= 4; }, - filterTarget:lib.filter.notMe, - content:function(){ - player.removeMark('sbguidao',4); - target.damage('thunder'); + filterTarget: lib.filter.notMe, + content: function () { + player.removeMark("sbguidao", 4); + target.damage("thunder"); + }, + ai: { + combo: "sbguidao", + order: 9, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target, "thunder"); + }, + }, }, - ai:{ - combo:'sbguidao', - order:9, - result:{ - target:function(player,target){ - return get.damageEffect(target,player,target,'thunder'); - } - } - } }, - sbguidao:{ - audio:2, - trigger:{ - global:['phaseBefore','damageEnd'], - player:'enterGame', + sbguidao: { + audio: 2, + trigger: { + global: ["phaseBefore", "damageEnd"], + player: "enterGame", }, - forced:true, - locked:false, - group:'sbguidao_defend', - filter:function(event,player){ - if(player.countMark('sbguidao')>=8) return false; - if(event.name=='damage') return event.hasNature()&&!player.hasSkill('sbguidao_forbid'); - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + group: "sbguidao_defend", + filter: function (event, player) { + if (player.countMark("sbguidao") >= 8) return false; + if (event.name == "damage") + return event.hasNature() && !player.hasSkill("sbguidao_forbid"); + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - var num=2; - if(trigger.name!='damage') num+=2; - num=Math.min(8-player.countMark('sbguidao'),num); - player.addMark('sbguidao',num); + content: function () { + var num = 2; + if (trigger.name != "damage") num += 2; + num = Math.min(8 - player.countMark("sbguidao"), num); + player.addMark("sbguidao", num); }, - marktext:'兵', - intro:{ - name:'道兵', - name2:'道兵', - content:'共有$枚“道兵”', + marktext: "兵", + intro: { + name: "道兵", + name2: "道兵", + content: "共有$枚“道兵”", }, - subSkill:{ - defend:{ - audio:'sbguidao', - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - return player.countMark('sbguidao')>=2; + subSkill: { + defend: { + audio: "sbguidao", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return player.countMark("sbguidao") >= 2; }, - prompt2:'弃2枚“道兵”,防止伤害', - check:function(event,player){ - return event.num>=2||player.hp<=event.num; + prompt2: "弃2枚“道兵”,防止伤害", + check: function (event, player) { + return event.num >= 2 || player.hp <= event.num; }, - content:function(){ + content: function () { trigger.cancel(); - player.removeMark('sbguidao',2); - if(player!=_status.currentPhase){ - player.addTempSkill('sbguidao_forbid',{player:'phaseBegin'}); + player.removeMark("sbguidao", 2); + if (player != _status.currentPhase) { + player.addTempSkill("sbguidao_forbid", { player: "phaseBegin" }); } }, }, - forbid:{charlotte:true}, - } + forbid: { charlotte: true }, + }, }, - sbhuangtian:{ - audio:2, - trigger:{ - player:'phaseBegin', + sbhuangtian: { + audio: 2, + trigger: { + player: "phaseBegin", }, - forced:true, - zhuSkill:true, - group:'sbhuangtian_mark', - filter:function(event,player){ - if(player.phaseNumber>1||game.phaseNumber>1) return false; - if(!player.hasZhuSkill('sbhuangtian')) return false; - return !game.hasPlayer(function(current){ - return current.countCards('hej','taipingyaoshu'); - })&&!Array.from(ui.cardPile.childNodes).concat(Array.from(ui.discardPile.childNodes)).concat(Array.from(ui.ordering.childNodes)).map(i=>i.name).includes('taipingyaoshu'); + forced: true, + zhuSkill: true, + group: "sbhuangtian_mark", + filter: function (event, player) { + if (player.phaseNumber > 1 || game.phaseNumber > 1) return false; + if (!player.hasZhuSkill("sbhuangtian")) return false; + return ( + !game.hasPlayer(function (current) { + return current.countCards("hej", "taipingyaoshu"); + }) && + !Array.from(ui.cardPile.childNodes) + .concat(Array.from(ui.discardPile.childNodes)) + .concat(Array.from(ui.ordering.childNodes)) + .map((i) => i.name) + .includes("taipingyaoshu") + ); }, - content:function(){ - 'step 0' - if(!lib.inpile.contains('taipingyaoshu')){ - lib.inpile.push('taipingyaoshu'); + content: function () { + "step 0"; + if (!lib.inpile.contains("taipingyaoshu")) { + lib.inpile.push("taipingyaoshu"); } - event.card=game.createCard2('taipingyaoshu','heart',3); - 'step 1' - if(card) player.equip(card); + event.card = game.createCard2("taipingyaoshu", "heart", 3); + ("step 1"); + if (card) player.equip(card); }, - subSkill:{ - mark:{ - audio:'sbhuangtiang', - trigger:{global:'damageSource'}, - forced:true, - zhuSkill:true, - filter:function(event,player){ - if(!player.hasZhuSkill('sbhuangtian')||!player.hasSkill('sbguidao',null,false,false)) return false; - if(!event.source||player==event.source||event.source.group!='qun') return false; - if(player.hasSkill('sbguidao')&&player.countMark('sbguidao')>=8) return false; - if(player.countMark('sbhuangtian_count')>=4) return false; + subSkill: { + mark: { + audio: "sbhuangtiang", + trigger: { global: "damageSource" }, + forced: true, + zhuSkill: true, + filter: function (event, player) { + if ( + !player.hasZhuSkill("sbhuangtian") || + !player.hasSkill("sbguidao", null, false, false) + ) + return false; + if (!event.source || player == event.source || event.source.group != "qun") + return false; + if (player.hasSkill("sbguidao") && player.countMark("sbguidao") >= 8) + return false; + if (player.countMark("sbhuangtian_count") >= 4) return false; return true; }, - content:function(){ - var num=Math.min(8-player.countMark('sbhuangtian_count'),2); - player.addMark('sbguidao',num); - player.addTempSkill('sbhuangtian_count','roundStart'); - player.addMark('sbhuangtian_count',num,false); - } + content: function () { + var num = Math.min(8 - player.countMark("sbhuangtian_count"), 2); + player.addMark("sbguidao", num); + player.addTempSkill("sbhuangtian_count", "roundStart"); + player.addMark("sbhuangtian_count", num, false); + }, }, - count:{onremove:true} - } + count: { onremove: true }, + }, }, //夏侯氏 - sbqiaoshi:{ - audio:2, - trigger:{player:'damageEnd'}, - usable:1, - direct:true, - filter:function(event,player){ - return event.source&&event.source!=player&&event.source.isIn(); + sbqiaoshi: { + audio: 2, + trigger: { player: "damageEnd" }, + usable: 1, + direct: true, + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); }, - content:function(){ - 'step 0' - trigger.source.chooseBool('樵拾:是否令'+get.translation(player)+'回复'+trigger.num+'点体力,然后你摸两张牌?').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.recoverEffect(player,trigger.source,trigger.source)+2*get.effect(trigger.source,{name:'draw'},trigger.source)>5); - 'step 1' - if(result.bool){ - player.logSkill('sbqiaoshi'); - trigger.source.line(player,'green'); + content: function () { + "step 0"; + trigger.source + .chooseBool( + "樵拾:是否令" + + get.translation(player) + + "回复" + + trigger.num + + "点体力,然后你摸两张牌?" + ) + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + get.recoverEffect(player, trigger.source, trigger.source) + + 2 * get.effect(trigger.source, { name: "draw" }, trigger.source) > + 5 + ); + ("step 1"); + if (result.bool) { + player.logSkill("sbqiaoshi"); + trigger.source.line(player, "green"); player.recover(trigger.num); trigger.source.draw(2); - } - else player.storage.counttrigger.sbqiaoshi--; + } else player.storage.counttrigger.sbqiaoshi--; }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(get.attitude(target,player)<=0||target==player) return; - if(target.storage.counttrigger&&target.storage.counttrigger.sbqiaoshi) return; - if(target.hp<=1&&!player.canSave(target)) return; - return [0,0.5,0,0.5]; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (get.attitude(target, player) <= 0 || target == player) return; + if (target.storage.counttrigger && target.storage.counttrigger.sbqiaoshi) + return; + if (target.hp <= 1 && !player.canSave(target)) return; + return [0, 0.5, 0, 0.5]; } }, }, - } + }, }, - sbyanyu:{ - enable:'phaseUse', - usable:2, - filterCard:{name:'sha'}, - selectCard:1, - group:'sbyanyu_draw', - check:()=>1, - content:function(){ + sbyanyu: { + enable: "phaseUse", + usable: 2, + filterCard: { name: "sha" }, + selectCard: 1, + group: "sbyanyu_draw", + check: () => 1, + content: function () { player.draw(); }, - subSkill:{ - draw:{ - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.getHistory('useSkill',evt=>{ - if(evt.skill!='sbyanyu') return false; - var evtx=evt.event.getParent('phaseUse'); - if(!evtx||evtx!=_status.event.getParent('phaseUse')) return; + subSkill: { + draw: { + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return player.getHistory("useSkill", (evt) => { + if (evt.skill != "sbyanyu") return false; + var evtx = evt.event.getParent("phaseUse"); + if (!evtx || evtx != _status.event.getParent("phaseUse")) return; return true; }).length; }, - direct:true, - content:function(){ - 'step 0' - event.num=3*player.getHistory('useSkill',evt=>{ - if(evt.skill!='sbyanyu') return false; - var evtx=evt.event.getParent('phaseUse'); - if(!evtx||evtx!=_status.event.getParent('phaseUse')) return; - return true; - }).length; - player.chooseTarget(get.prompt('sbyanyu'),'令一名其他角色摸'+get.cnNumber(event.num)+'张牌',lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,{name:'draw'},player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbyanyu_draw',target); + direct: true, + content: function () { + "step 0"; + event.num = + 3 * + player.getHistory("useSkill", (evt) => { + if (evt.skill != "sbyanyu") return false; + var evtx = evt.event.getParent("phaseUse"); + if (!evtx || evtx != _status.event.getParent("phaseUse")) return; + return true; + }).length; + player + .chooseTarget( + get.prompt("sbyanyu"), + "令一名其他角色摸" + get.cnNumber(event.num) + "张牌", + lib.filter.notMe + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, { name: "draw" }, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbyanyu_draw", target); target.draw(num); } - } - } + }, + }, }, - ai:{ - order:function(obj,player){ - if(game.hasPlayer(current=>current!=player&&get.attitude(player,current)>0)&&player.getHistory('useSkill',evt=>{ - if(evt.skill!='sbyanyu') return false; - var evtx=evt.event.getParent('phaseUse'); - if(!evtx||evtx!=_status.event.getParent('phaseUse')) return; - return true; - }).length<2) return 9; + ai: { + order: function (obj, player) { + if ( + game.hasPlayer( + (current) => current != player && get.attitude(player, current) > 0 + ) && + player.getHistory("useSkill", (evt) => { + if (evt.skill != "sbyanyu") return false; + var evtx = evt.event.getParent("phaseUse"); + if (!evtx || evtx != _status.event.getParent("phaseUse")) return; + return true; + }).length < 2 + ) + return 9; return 2; }, - result:{ - player:1 + result: { + player: 1, }, - } + }, }, //曹仁 - sbjushou:{ - audio:3, - enable:'phaseUse', - usable:1, - filter:function(event,player){ + sbjushou: { + audio: 3, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { return !player.isTurnedOver(); }, - filterCard:true, - selectCard:[1,2], - check:function(card){ - if(ui.selected.cards.length+_status.event.player.hujia>=5) return 0; - return 6.5-get.value(card); + filterCard: true, + selectCard: [1, 2], + check: function (card) { + if (ui.selected.cards.length + _status.event.player.hujia >= 5) return 0; + return 6.5 - get.value(card); }, - position:'he', - group:['sbjushou_damage','sbjushou_draw'], - content:function(){ + position: "he", + group: ["sbjushou_damage", "sbjushou_draw"], + content: function () { player.turnOver(); - player.changeHujia(cards.length,null,true); + player.changeHujia(cards.length, null, true); }, - ai:{ - order:5, - result:{ - player:1, - } + ai: { + order: 5, + result: { + player: 1, + }, }, - subSkill:{ - damage:{ - audio:'sbjushou', - trigger:{ - player:'damageEnd', + subSkill: { + damage: { + audio: "sbjushou", + trigger: { + player: "damageEnd", }, - filter:function(event,player){ + filter: function (event, player) { return player.isTurnedOver(); }, - direct:true, - content:function(){ - 'step 0' - player.chooseControl('翻面','获得1点护甲','cancel2').set('ai',()=>{ - if(_status.event.player.hujia>=3) return 0; - return 1; - }).set('prompt',get.prompt('sbjushou')).set('prompt2','选择一项'); - 'step 1' - if(result.control=='cancel2'){ + direct: true, + content: function () { + "step 0"; + player + .chooseControl("翻面", "获得1点护甲", "cancel2") + .set("ai", () => { + if (_status.event.player.hujia >= 3) return 0; + return 1; + }) + .set("prompt", get.prompt("sbjushou")) + .set("prompt2", "选择一项"); + ("step 1"); + if (result.control == "cancel2") { event.finish(); return; } - player.logSkill('sbjushou'); - if(result.control=='翻面'){ + player.logSkill("sbjushou"); + if (result.control == "翻面") { player.turnOver(); - } - else { - player.changeHujia(1,null,true); + } else { + player.changeHujia(1, null, true); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(!target.isTurnedOver()) return; - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if((card.name=='sha'&&!player.hasSkill('jiu'))||target.hasSkillTag('filterDamage',null,{ - player:player, - card:card, - })) return 'zerotarget'; + ai: { + effect: { + target: function (card, player, target) { + if (!target.isTurnedOver()) return; + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if ( + (card.name == "sha" && !player.hasSkill("jiu")) || + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + return "zerotarget"; } }, }, }, }, - draw:{ - audio:'sbjushou', - trigger:{player:'turnOverAfter'}, - forced:true, - locked:false, - filter:function(event,player){ - return !player.isTurnedOver()&&player.hujia>0; + draw: { + audio: "sbjushou", + trigger: { player: "turnOverAfter" }, + forced: true, + locked: false, + filter: function (event, player) { + return !player.isTurnedOver() && player.hujia > 0; }, - content:function(){ + content: function () { player.draw(player.hujia); }, - } - } + }, + }, }, - sbjiewei:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hujia>0; + sbjiewei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hujia > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h'); + filterTarget: function (card, player, target) { + return target != player && target.countCards("h"); }, - content:function(){ + content: function () { player.changeHujia(-1); - player.gainPlayerCard(target,'visible',true,'h').set('ai',function(button){ - return get.value(button.link,_status.event.target); + player.gainPlayerCard(target, "visible", true, "h").set("ai", function (button) { + return get.value(button.link, _status.event.target); }); }, - ai:{ - order:8, - result:{ - target:-1, - } - } + ai: { + order: 8, + result: { + target: -1, + }, + }, }, //周瑜 - sbyingzi:{ - audio:2, - audioname:['sb_sunce'], - trigger:{player:'phaseDrawBegin2'}, - forced:true, - getNum:function(player){ - return (player.countCards('h')>=2)+(player.hp>=2)+(player.countCards('e')>=1); + sbyingzi: { + audio: 2, + audioname: ["sb_sunce"], + trigger: { player: "phaseDrawBegin2" }, + forced: true, + getNum: function (player) { + return (player.countCards("h") >= 2) + (player.hp >= 2) + (player.countCards("e") >= 1); }, - filter:function(event,player){ - return !event.numFixed&&lib.skill.sbyingzi.getNum(player)>0; + filter: function (event, player) { + return !event.numFixed && lib.skill.sbyingzi.getNum(player) > 0; }, - content:function(){ - var num=lib.skill.sbyingzi.getNum(player); - trigger.num+=num; - player.addTempSkill('sbyingzi_limit'); - player.addMark('sbyingzi_limit',num,false); + content: function () { + var num = lib.skill.sbyingzi.getNum(player); + trigger.num += num; + player.addTempSkill("sbyingzi_limit"); + player.addMark("sbyingzi_limit", num, false); }, - ai:{ - threaten:2 + ai: { + threaten: 2, }, - subSkill:{ - limit:{ - charlotte:true, - forced:true, - onremove:true, - marktext:'英', - intro:{ - content:'本回合手牌上限+#', + subSkill: { + limit: { + charlotte: true, + forced: true, + onremove: true, + marktext: "英", + intro: { + content: "本回合手牌上限+#", }, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('sbyingzi_limit'); - } + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("sbyingzi_limit"); + }, }, - } - } - }, - sbfanjian:{ - audio:2, - enable:'phaseUse', - usable:5, - filter:function(event,player){ - return !player.hasSkill('sbfanjian_ban'); - }, - chooseButton:{ - dialog:function(){ - return ui.create.dialog('###反间###'+get.translation('sbfanjian_info')); }, - chooseControl:function(event,player){ - var suits=lib.suit.slice(); - suits.push('cancel2'); + }, + }, + sbfanjian: { + audio: 2, + enable: "phaseUse", + usable: 5, + filter: function (event, player) { + return !player.hasSkill("sbfanjian_ban"); + }, + chooseButton: { + dialog: function () { + return ui.create.dialog("###反间###" + get.translation("sbfanjian_info")); + }, + chooseControl: function (event, player) { + var suits = lib.suit.slice(); + suits.push("cancel2"); return suits; }, - check:function(event,player){ - var suits=lib.suit.slice(); - suits=suits.filter(suit=>!player.getStorage('sbfanjian_guessed').includes(suit)); + check: function (event, player) { + var suits = lib.suit.slice(); + suits = suits.filter( + (suit) => !player.getStorage("sbfanjian_guessed").includes(suit) + ); return suits.randomGet(); }, - backup:function(result,player){ + backup: function (result, player) { return { - audio:'sbfanjian', - filterCard:function(card,player){ - return !player.getStorage('sbfanjian_guessed').includes(get.suit(card,player)); + audio: "sbfanjian", + filterCard: function (card, player) { + return !player + .getStorage("sbfanjian_guessed") + .includes(get.suit(card, player)); }, - suit:result.control, - position:'h', - filterTarget:lib.filter.notMe, - check:function(card){ - return 6-get.value(card); + suit: result.control, + position: "h", + filterTarget: lib.filter.notMe, + check: function (card) { + return 6 - get.value(card); }, - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - var suit=get.suit(cards,player); - event.claimSuit=lib.skill.sbfanjian_backup.suit; - event.cardSuit=suit; - player.addTempSkill('sbfanjian_guessed'); - var claim=get.translation(event.claimSuit+'2'); - player.chat('我声明'+claim); - game.log(player,'声明了','#y'+claim); - var choiceList=['猜测此牌花色为'+claim,'猜测此牌花色不为'+claim,'不猜测,你翻面并令其〖反间〗失效']; - target.chooseControl().set('choiceList',choiceList).set('prompt',get.translation(player)+'对你发动了【反间】并选择了一张牌,请选择一项').set('ai',()=>{ - var player=_status.event.player,user=_status.event.getParent().player,claim=_status.event.getParent().claimSuit,suit=_status.event.getParent().cardSuit; - if(player.isTurnedOver()) return 2; - var lose=get.effect(player,{name:'losehp'},user,player); - if(user.getStorage('sbfanjian_guessed').includes(claim)&&claim==suit) return lose<=0?0:1; - if(get.attitude(player,user)>0) return 0; - var list=[0,1]; - if(player.hp<=1&&player.getFriends().length>0) list.push(2); - return list.randomGet(); - }); - 'step 1' - player.markAuto('sbfanjian_guessed',[event.cardSuit]); - if(result.index==2){ - game.log(target,'选择','#y不猜测'); - target.chat('不猜!'); + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + var suit = get.suit(cards, player); + event.claimSuit = lib.skill.sbfanjian_backup.suit; + event.cardSuit = suit; + player.addTempSkill("sbfanjian_guessed"); + var claim = get.translation(event.claimSuit + "2"); + player.chat("我声明" + claim); + game.log(player, "声明了", "#y" + claim); + var choiceList = [ + "猜测此牌花色为" + claim, + "猜测此牌花色不为" + claim, + "不猜测,你翻面并令其〖反间〗失效", + ]; + target + .chooseControl() + .set("choiceList", choiceList) + .set( + "prompt", + get.translation(player) + + "对你发动了【反间】并选择了一张牌,请选择一项" + ) + .set("ai", () => { + var player = _status.event.player, + user = _status.event.getParent().player, + claim = _status.event.getParent().claimSuit, + suit = _status.event.getParent().cardSuit; + if (player.isTurnedOver()) return 2; + var lose = get.effect(player, { name: "losehp" }, user, player); + if ( + user.getStorage("sbfanjian_guessed").includes(claim) && + claim == suit + ) + return lose <= 0 ? 0 : 1; + if (get.attitude(player, user) > 0) return 0; + var list = [0, 1]; + if (player.hp <= 1 && player.getFriends().length > 0) list.push(2); + return list.randomGet(); + }); + ("step 1"); + player.markAuto("sbfanjian_guessed", [event.cardSuit]); + if (result.index == 2) { + game.log(target, "选择", "#y不猜测"); + target.chat("不猜!"); target.turnOver(); + } else { + var claim = get.translation(event.claimSuit + "2"); + target.chat("我猜花色" + (result.index == 1 ? "不" : "") + "为" + claim); + game.log( + target, + "猜测花色", + "#g" + (result.index == 1 ? "不" : "") + "为" + claim + ); } - else { - var claim=get.translation(event.claimSuit+'2'); - target.chat('我猜花色'+(result.index==1?'不':'')+'为'+claim); - game.log(target,'猜测花色','#g'+(result.index==1?'不':'')+'为'+claim); - } - if(event.isMine()&&!event.isOnline()) game.delayx(); - 'step 2' - target.gain(cards,player,'giveAuto','bySelf'); - 'step 3' - if(result.index==0&&event.claimSuit!=event.cardSuit||result.index==1&&event.claimSuit==event.cardSuit){ - game.log(target,'猜测','#y错误'); + if (event.isMine() && !event.isOnline()) game.delayx(); + ("step 2"); + target.gain(cards, player, "giveAuto", "bySelf"); + ("step 3"); + if ( + (result.index == 0 && event.claimSuit != event.cardSuit) || + (result.index == 1 && event.claimSuit == event.cardSuit) + ) { + game.log(target, "猜测", "#y错误"); target.loseHp(); - } - else { - if(result.index!=2) game.log(target,'猜测','#g正确'); - player.addTempSkill('sbfanjian_ban'); + } else { + if (result.index != 2) game.log(target, "猜测", "#g正确"); + player.addTempSkill("sbfanjian_ban"); } }, - ai:{ - result:{ - target:function(player,target){ - if(!ui.selected.cards.length) return 0; - var val=get.value(ui.selected.cards,target); - if(val<0) return val+get.effect(target,{name:'losehp'},player,target); - if(val>5||get.value(ui.selected.cards,player)>5) return target.isTurnedOver()?5:0; - if(target.isTurnedOver()) return 1; - return get.effect(target,{name:'losehp'},player,target); + ai: { + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var val = get.value(ui.selected.cards, target); + if (val < 0) + return ( + val + get.effect(target, { name: "losehp" }, player, target) + ); + if (val > 5 || get.value(ui.selected.cards, player) > 5) + return target.isTurnedOver() ? 5 : 0; + if (target.isTurnedOver()) return 1; + return get.effect(target, { name: "losehp" }, player, target); }, }, }, - } + }; }, - prompt:function(result){ - return '你选择了'+get.translation(result.control)+',请选择一张手牌和【反间】的目标'; + prompt: function (result) { + return ( + "你选择了" + get.translation(result.control) + ",请选择一张手牌和【反间】的目标" + ); }, }, - subSkill:{ - guessed:{onremove:true,charlotte:true}, - ban:{charlotte:true}, - backup:{}, + subSkill: { + guessed: { onremove: true, charlotte: true }, + ban: { charlotte: true }, + backup: {}, + }, + ai: { + order: 4, + result: { player: 1 }, }, - ai:{ - order:4, - result:{player:1} - } }, //黄盖 - sbkurou:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - group:'sbkurou_gain', - content:function(){ - 'step 0' + sbkurou: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + group: "sbkurou_gain", + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('sbkurou'), - prompt2:'交给其他角色一张牌,若此牌为【桃】或【酒】,你失去2点体力,否则你失去1点体力', - filterCard:true, - position:'he', - filterTarget:lib.filter.notMe, - ai1:function(card){ - if(player.hp<=1&&!player.canSave(player)||player.hujia>=5) return 0; - if(get.value(card,player)>6&&!game.hasPlayer(current=>{ - return current!=player&&get.attitude(current,player)>0&&!current.hasSkillTag('nogain'); - })) return 0; - if(player.hp>=2&&(card.name=='tao'||(card.name=='jiu'&&player.countCards('hs',cardx=>{ - return cardx!=card&&get.tag(cardx,'save'); - })))&&player.hujia<=1) return 10; - if(player.hp<=1&&!player.canSave(player)) return 0; - return 1/Math.max(0.1,get.value(card)); + prompt: get.prompt("sbkurou"), + prompt2: + "交给其他角色一张牌,若此牌为【桃】或【酒】,你失去2点体力,否则你失去1点体力", + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + ai1: function (card) { + if ((player.hp <= 1 && !player.canSave(player)) || player.hujia >= 5) return 0; + if ( + get.value(card, player) > 6 && + !game.hasPlayer((current) => { + return ( + current != player && + get.attitude(current, player) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + return 0; + if ( + player.hp >= 2 && + (card.name == "tao" || + (card.name == "jiu" && + player.countCards("hs", (cardx) => { + return cardx != card && get.tag(cardx, "save"); + }))) && + player.hujia <= 1 + ) + return 10; + if (player.hp <= 1 && !player.canSave(player)) return 0; + return 1 / Math.max(0.1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(ui.selected.cards.length){ - var val=get.value(ui.selected.cards[0]); - att*=val>=0?1:-1; + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards.length) { + var val = get.value(ui.selected.cards[0]); + att *= val >= 0 ? 1 : -1; } - if(target.hasSkillTag('nogain')) att/=9; - return 15+att; + if (target.hasSkillTag("nogain")) att /= 9; + return 15 + att; }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0],card=result.cards[0]; - player.logSkill('sbkurou',target); - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.15); - player.give(card,target); - player.loseHp(['tao','jiu'].includes(get.name(card,target))?2:1); + ("step 1"); + if (result.bool) { + var target = result.targets[0], + card = result.cards[0]; + player.logSkill("sbkurou", target); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); + player.give(card, target); + player.loseHp(["tao", "jiu"].includes(get.name(card, target)) ? 2 : 1); } }, - ai:{ - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.hp<=0&&player.isPhaseUsing(); - } + ai: { + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg.card && get.name(arg.card) === "tao")) && + player.hp <= 0 && + player.isPhaseUsing() + ); + }, }, - subSkill:{ - gain:{ - audio:'sbkurou', - trigger:{player:'loseHpEnd'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.isIn()&&player.hujia<5; + subSkill: { + gain: { + audio: "sbkurou", + trigger: { player: "loseHpEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.isIn() && player.hujia < 5; }, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' - player.changeHujia(2,null,true); - 'step 2' - if(--event.count>0){ - player.logSkill('sbkurou_gain'); + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); + player.changeHujia(2, null, true); + ("step 2"); + if (--event.count > 0) { + player.logSkill("sbkurou_gain"); event.goto(1); } }, - ai:{ - maihp:true, - effect:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,1]; + ai: { + maihp: true, + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, 1]; return 1.2; } - if(get.tag(card,'loseHp')){ - if(target.hp<=1||target.hujia>=5) return; - return [1,1]; + if (get.tag(card, "loseHp")) { + if (target.hp <= 1 || target.hujia >= 5) return; + return [1, 1]; } - } - } + }, + }, }, - } - }, - sbzhaxiang:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - group:'sbzhaxiang_draw', - filter:function(event,player){ - return player.getHistory('useCard').length<=player.getDamagedHp(); }, - content:function(){ + }, + sbzhaxiang: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + group: "sbzhaxiang_draw", + filter: function (event, player) { + return player.getHistory("useCard").length <= player.getDamagedHp(); + }, + content: function () { trigger.directHit.addArray(game.filterPlayer()); }, - ai:{ - threaten:1.5, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return player.countUsed()=player.getDamagedHp()) return; - var numx=get.info(card).usable; - if(typeof numx=='function') numx=num(card,player); - if(typeof numx=='number') return num+10; + aiOrder: function (player, card, num) { + if (player.countUsed() >= player.getDamagedHp()) return; + var numx = get.info(card).usable; + if (typeof numx == "function") numx = num(card, player); + if (typeof numx == "number") return num + 10; }, }, - subSkill:{ - draw:{ - audio:'sbzhaxiang', - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&_status.event&&_status.event.type=='phase'&&get.tag(card,'recover')) return num/5; - } + subSkill: { + draw: { + audio: "sbzhaxiang", + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + _status.event && + _status.event.type == "phase" && + get.tag(card, "recover") + ) + return num / 5; + }, }, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:function(event,player){ - return !event.numFixed&&player.getDamagedHp()>0; + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed && player.getDamagedHp() > 0; }, - content:function(){ - trigger.num+=player.getDamagedHp(); + content: function () { + trigger.num += player.getDamagedHp(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'recover')&&target.hp>0&&target.needsToDiscard()<1) return [0,0]; - } - } - } - } - } + ai: { + effect: { + target: function (card, player, target) { + if ( + get.tag(card, "recover") && + target.hp > 0 && + target.needsToDiscard() < 1 + ) + return [0, 0]; + }, + }, + }, + }, + }, }, //孙权 - sbzhiheng:{ - audio:2, - audioname:['shen_caopi'], - locked:false, - mod:{ - aiOrder:function(player,card,num){ - if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; - let eq=player.getEquip(get.subtype(card)); - if(eq&&get.equipValue(card)-get.equipValue(eq)0) str+=',并弃1枚“业”'; - str+='。'; + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: lib.filter.cardDiscardable, + discard: false, + lose: false, + delay: false, + selectCard: [1, Infinity], + prompt: function (event) { + var count = _status.event.player.countMark("sbtongye"); + var str = + "出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你以此法弃置的牌包括你所有手牌,则你多摸" + + get.cnNumber(count + 1) + + "张牌"; + if (count > 0) str += ",并弃1枚“业”"; + str += "。"; return str; }, - check:function(card){ - var player=_status.event.player; - if(get.position(card)=='h'&&!player.countCards('h','du')&&(player.hp>2||!player.countCards('h',function(card){ - return get.value(card)>=8; - }))){ + check: function (card) { + var player = _status.event.player; + if ( + get.position(card) == "h" && + !player.countCards("h", "du") && + (player.hp > 2 || + !player.countCards("h", function (card) { + return get.value(card) >= 8; + })) + ) { return 1; } - return 6-get.value(card); + return 6 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.discard(cards); - event.num=1; - var hs=player.getCards('h'); - if(!hs.length) event.num=0; - for(var i=0; iget.value(i)>Math.max(6,9-player.hp),'he')) return 1; + ai: { + order: function (item, player) { + if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; return 10; }, - result:{ - player:1 + result: { + player: 1, }, - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.sbzhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + !player.getStat().skill.sbzhiheng && + player.hasCard((card) => get.name(card) !== "tao", "h") + ); }, - threaten:1.56 + threaten: 1.56, }, }, - sbtongye:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - onremove:true, - content:function(){ - 'step 0' - player.chooseControl('变化','不变').set('prompt','统业:猜测场上装备数是否于你下回合准备阶段前发生变化').set('ai',()=>{ - let player = _status.event.player; - if(game.countPlayer() > 3) return '变化'; - if(game.countPlayer(function (current){ - return current.hasCard({type: 'equip'}, 'e'); - }) < game.countPlayer()) return '变化'; - if(game.countPlayer() == 2 && game.countPlayer(function (current){ - if (current != player) return current.countCards('e', {type: 'equip'}) + current.countDisabledSlot(); - }) >= 5) return '不变'; - if(Math.random() < 0.3) return '变化'; - return '不变'; - }); - 'step 1' - if(result.control=='变化'){ - player.addSkill('sbtongye_change',1); - player.chat('变!'); - }else{ - player.addSkill('sbtongye_nochange',1); - player.chat('不变!'); + sbtongye: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + onremove: true, + content: function () { + "step 0"; + player + .chooseControl("变化", "不变") + .set("prompt", "统业:猜测场上装备数是否于你下回合准备阶段前发生变化") + .set("ai", () => { + let player = _status.event.player; + if (game.countPlayer() > 3) return "变化"; + if ( + game.countPlayer(function (current) { + return current.hasCard({ type: "equip" }, "e"); + }) < game.countPlayer() + ) + return "变化"; + if ( + game.countPlayer() == 2 && + game.countPlayer(function (current) { + if (current != player) + return ( + current.countCards("e", { type: "equip" }) + + current.countDisabledSlot() + ); + }) >= 5 + ) + return "不变"; + if (Math.random() < 0.3) return "变化"; + return "不变"; + }); + ("step 1"); + if (result.control == "变化") { + player.addSkill("sbtongye_change", 1); + player.chat("变!"); + } else { + player.addSkill("sbtongye_nochange", 1); + player.chat("不变!"); } - var num=game.filterPlayer().map(i=>i.countCards('e')).reduce((p,c)=>p+c,0); - player.removeMark('sbtongye_count',player.countMark('sbtongye_count'),false); - if(num>0) player.addMark('sbtongye_count',num,false); - player.addSkill('sbtongye_settle'); + var num = game + .filterPlayer() + .map((i) => i.countCards("e")) + .reduce((p, c) => p + c, 0); + player.removeMark("sbtongye_count", player.countMark("sbtongye_count"), false); + if (num > 0) player.addMark("sbtongye_count", num, false); + player.addSkill("sbtongye_settle"); }, - marktext:'业', - intro:{ - name:'统业', - name2:'业', - content:'mark', + marktext: "业", + intro: { + name: "统业", + name2: "业", + content: "mark", }, - ai:{ - combo:'sbzhiheng' + ai: { + combo: "sbzhiheng", }, - subSkill:{ - broadcast:{ - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + broadcast: { + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - charlotte:true, - silent:true, - filter:function(event,player){ - var num=0; - game.countPlayer(function(current){ - var evt=event.getl(current); - if(evt&&evt.es) num+=evt.es.length; + charlotte: true, + silent: true, + filter: function (event, player) { + var num = 0; + game.countPlayer(function (current) { + var evt = event.getl(current); + if (evt && evt.es) num += evt.es.length; }); - if(event.name=='equip') num--; - return num!=0; + if (event.name == "equip") num--; + return num != 0; }, - content:function(){ - if(player.hasSkill('sbtongye_change')) player.markSkill('sbtongye_change'); - if(player.hasSkill('sbtongye_nochange')) player.markSkill('sbtongye_nochange'); + content: function () { + if (player.hasSkill("sbtongye_change")) player.markSkill("sbtongye_change"); + if (player.hasSkill("sbtongye_nochange")) player.markSkill("sbtongye_nochange"); }, }, - settle:{ - audio:'sbtongye', - init:function(player){ - player.addSkill('sbtongye_broadcast'); + settle: { + audio: "sbtongye", + init: function (player) { + player.addSkill("sbtongye_broadcast"); }, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.hasSkill('sbtongye_change')||player.hasSkill('sbtongye_nochange'); + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.hasSkill("sbtongye_change") || player.hasSkill("sbtongye_nochange"); }, - content:function(){ - var delta=game.filterPlayer().map(i=>i.countCards('e')).reduce((p,c)=>p+c,0)-player.countMark('sbtongye_count'); - if(player.hasSkill('sbtongye_change')&&delta!=0||player.hasSkill('sbtongye_nochange')&&delta==0){ - game.log(player,'猜测','#g正确'); - if(player.countMark('sbtongye')<2) player.addMark('sbtongye',1); - }else{ - game.log(player,'猜测','#y错误'); - player.removeMark('sbtongye',1); + content: function () { + var delta = + game + .filterPlayer() + .map((i) => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); + if ( + (player.hasSkill("sbtongye_change") && delta != 0) || + (player.hasSkill("sbtongye_nochange") && delta == 0) + ) { + game.log(player, "猜测", "#g正确"); + if (player.countMark("sbtongye") < 2) player.addMark("sbtongye", 1); + } else { + game.log(player, "猜测", "#y错误"); + player.removeMark("sbtongye", 1); } - player.removeSkill('sbtongye_change'); - player.removeSkill('sbtongye_nochange'); - player.removeSkill('sbtongye_settle'); - player.removeSkill('sbtongye_broadcast'); - } + player.removeSkill("sbtongye_change"); + player.removeSkill("sbtongye_nochange"); + player.removeSkill("sbtongye_settle"); + player.removeSkill("sbtongye_broadcast"); + }, }, - change:{ - charlotte:true, - mark:true, - marktext:'变', - intro:{ - markcount:function(storage,player){ - return game.filterPlayer().map(i=>i.countCards('e')).reduce((p,c)=>p+c,0)-player.countMark('sbtongye_count'); + change: { + charlotte: true, + mark: true, + marktext: "变", + intro: { + markcount: function (storage, player) { + return ( + game + .filterPlayer() + .map((i) => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count") + ); }, - mark:function(dialog,storage,player){ - dialog.addText(get.translation(player)+'猜测场上装备数发生变化'); - var delta=game.filterPlayer().map(i=>i.countCards('e')).reduce((p,c)=>p+c,0)-player.countMark('sbtongye_count'); - if(delta==0) dialog.addText('(当前未发生变化)'); - else dialog.addText('(当前已'+(delta>0?'增加':'减少')+get.cnNumber(Math.abs(delta))+'张装备牌)'); - } - } - }, - nochange:{ - charlotte:true, - mark:true, - marktext:'', - intro:{ - markcount:function(storage,player){ - return game.filterPlayer().map(i=>i.countCards('e')).reduce((p,c)=>p+c,0)-player.countMark('sbtongye_count'); + mark: function (dialog, storage, player) { + dialog.addText(get.translation(player) + "猜测场上装备数发生变化"); + var delta = + game + .filterPlayer() + .map((i) => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); + if (delta == 0) dialog.addText("(当前未发生变化)"); + else + dialog.addText( + "(当前已" + + (delta > 0 ? "增加" : "减少") + + get.cnNumber(Math.abs(delta)) + + "张装备牌)" + ); }, - mark:function(dialog,storage,player){ - dialog.addText(get.translation(player)+'猜测场上装备数不发生变化'); - var delta=game.filterPlayer().map(i=>i.countCards('e')).reduce((p,c)=>p+c,0)-player.countMark('sbtongye_count'); - if(delta==0) dialog.addText('(当前未发生变化)'); - else dialog.addText('(当前已'+(delta>0?'增加':'减少')+get.cnNumber(Math.abs(delta))+'张装备牌)'); - } - } + }, + }, + nochange: { + charlotte: true, + mark: true, + marktext: '', + intro: { + markcount: function (storage, player) { + return ( + game + .filterPlayer() + .map((i) => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count") + ); + }, + mark: function (dialog, storage, player) { + dialog.addText(get.translation(player) + "猜测场上装备数不发生变化"); + var delta = + game + .filterPlayer() + .map((i) => i.countCards("e")) + .reduce((p, c) => p + c, 0) - player.countMark("sbtongye_count"); + if (delta == 0) dialog.addText("(当前未发生变化)"); + else + dialog.addText( + "(当前已" + + (delta > 0 ? "增加" : "减少") + + get.cnNumber(Math.abs(delta)) + + "张装备牌)" + ); + }, + }, }, - } - }, - sbjiuyuan:{ - audio:2, - trigger:{global:'useCard'}, - forced:true, - zhuSkill:true, - group:'sbjiuyuan_recover', - filter:function(event,player){ - return event.card.name=='tao'&&player!=event.player&&event.player.group=='wu'&& - event.player.isIn()&&player.hasZhuSkill('sbjiuyuan',event.player); }, - content:function(){ + }, + sbjiuyuan: { + audio: 2, + trigger: { global: "useCard" }, + forced: true, + zhuSkill: true, + group: "sbjiuyuan_recover", + filter: function (event, player) { + return ( + event.card.name == "tao" && + player != event.player && + event.player.group == "wu" && + event.player.isIn() && + player.hasZhuSkill("sbjiuyuan", event.player) + ); + }, + content: function () { player.draw(); }, - subSkill:{ - recover:{ - audio:'sbjiuyuan', - trigger:{target:'taoBegin'}, - zhuSkill:true, - forced:true, - filter:function(event,player){ - if(event.player==player) return false; - if(!player.hasZhuSkill('sbjiuyuan',event.player)) return false; - if(event.player.group!='wu') return false; + subSkill: { + recover: { + audio: "sbjiuyuan", + trigger: { target: "taoBegin" }, + zhuSkill: true, + forced: true, + filter: function (event, player) { + if (event.player == player) return false; + if (!player.hasZhuSkill("sbjiuyuan", event.player)) return false; + if (event.player.group != "wu") return false; return true; }, - content:function(){ + content: function () { trigger.baseDamage++; - } - } + }, + }, }, }, //孙尚香 - sbjieyin:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - locked:false, - dutySkill:true, - group:['sbjieyin_init','sbjieyin_fail'], - filter:function(event,player){ - return game.hasPlayer(current=>current.hasMark('sbjieyin_mark')); + sbjieyin: { + trigger: { player: "phaseUseBegin" }, + forced: true, + locked: false, + dutySkill: true, + group: ["sbjieyin_init", "sbjieyin_fail"], + filter: function (event, player) { + return game.hasPlayer((current) => current.hasMark("sbjieyin_mark")); }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>current.hasMark('sbjieyin_mark')); - event.targets=targets; - 'step 1' - var target=targets.shift(); - event.target=target; - var str=target.hasSkill('sbjieyin_marked')?'移去':'移动或移去'; - var num=Math.min(2,Math.max(1,target.countCards('h'))); - target.chooseCard('交给'+get.translation(player)+get.cnNumber(num)+'张手牌,然后获得1点护甲;或令其'+str+'你的所有“助”标记',num).set('ai',card=>{ - if(_status.event.goon) return 100-get.value(card); - return 0; - }).set('goon',get.attitude(target,player)>1); - 'step 2' - if(result.bool){ - target.give(result.cards,player); - target.changeHujia(1,null,true); + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => current.hasMark("sbjieyin_mark")); + event.targets = targets; + ("step 1"); + var target = targets.shift(); + event.target = target; + var str = target.hasSkill("sbjieyin_marked") ? "移去" : "移动或移去"; + var num = Math.min(2, Math.max(1, target.countCards("h"))); + target + .chooseCard( + "交给" + + get.translation(player) + + get.cnNumber(num) + + "张手牌,然后获得1点护甲;或令其" + + str + + "你的所有“助”标记", + num + ) + .set("ai", (card) => { + if (_status.event.goon) return 100 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) > 1); + ("step 2"); + if (result.bool) { + target.give(result.cards, player); + target.changeHujia(1, null, true); event.goto(4); - }else{ - if(!game.hasPlayer(current=>current!=player&¤t!=target)||target.hasSkill('sbjieyin_marked')) event._result={bool:false}; - else player.chooseTarget('结姻:是否移动'+get.translation(target)+'的“助”?',(card,player,target)=>{ - return target!=player&&target!=_status.event.getParent().target; - }).set('ai',target=>get.attitude(_status.event.player,target)-1); - target.addSkill('sbjieyin_marked'); + } else { + if ( + !game.hasPlayer((current) => current != player && current != target) || + target.hasSkill("sbjieyin_marked") + ) + event._result = { bool: false }; + else + player + .chooseTarget( + "结姻:是否移动" + get.translation(target) + "的“助”?", + (card, player, target) => { + return target != player && target != _status.event.getParent().target; + } + ) + .set("ai", (target) => get.attitude(_status.event.player, target) - 1); + target.addSkill("sbjieyin_marked"); } - 'step 3' - if(result.bool){ - var targetx=result.targets[0]; - var num=target.countMark('sbjieyin_mark'); - target.removeSkill('sbjieyin_mark'); - targetx.addSkill('sbjieyin_mark'); - targetx.addMark('sbjieyin_mark',num,false); - player.line2([target,targetx],'green'); - game.log(player,'将',target,'的'+get.cnNumber(num)+'枚“助”移动至',targetx); - }else{ - target.removeSkill('sbjieyin_mark'); - game.log(player,'移去了',target,'的'+get.cnNumber(num)+'枚“助”'); - game.createEvent('sbjieyin_fail').setContent(lib.skill.sbjieyin_fail.content).player=player; + ("step 3"); + if (result.bool) { + var targetx = result.targets[0]; + var num = target.countMark("sbjieyin_mark"); + target.removeSkill("sbjieyin_mark"); + targetx.addSkill("sbjieyin_mark"); + targetx.addMark("sbjieyin_mark", num, false); + player.line2([target, targetx], "green"); + game.log(player, "将", target, "的" + get.cnNumber(num) + "枚“助”移动至", targetx); + } else { + target.removeSkill("sbjieyin_mark"); + game.log(player, "移去了", target, "的" + get.cnNumber(num) + "枚“助”"); + game.createEvent("sbjieyin_fail").setContent(lib.skill.sbjieyin_fail.content).player = + player; } - 'step 4' - if(targets.length) event.goto(1); + ("step 4"); + if (targets.length) event.goto(1); }, - subSkill:{ - fail:{ - audio:'sbjieyin', - trigger:{global:'dieAfter'}, - dutySkill:true, - forced:true, - locked:false, - direct:true, - filter:function(event,player){ - return event.player.hasMark('sbjieyin_mark'); + subSkill: { + fail: { + audio: "sbjieyin", + trigger: { global: "dieAfter" }, + dutySkill: true, + forced: true, + locked: false, + direct: true, + filter: function (event, player) { + return event.player.hasMark("sbjieyin_mark"); }, - content:function(){ - player.logSkill('sbjieyin_fail'); - player.awakenSkill('sbjieyin'); - game.log(player,'使命失败'); - player.changeGroup('wu'); + content: function () { + player.logSkill("sbjieyin_fail"); + player.awakenSkill("sbjieyin"); + game.log(player, "使命失败"); + player.changeGroup("wu"); player.recover(); - player.gain(player.getExpansions('sbliangzhu'),'gain2'); + player.gain(player.getExpansions("sbliangzhu"), "gain2"); player.loseMaxHp(); - } - }, - mark:{ - charlotte:true, - mark:true, - marktext:'助', - onremove:true, - intro:{ - name:'结姻(助)', - name2:'助', - content:'mark' - } - }, - marked:{charlotte:true}, - init:{ - audio:'sbjieyin', - trigger:{ - global:'phaseBefore', - player:'enterGame', }, - forced:true, - locked:false, - direct:true, - dutySkill:true, - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); + }, + mark: { + charlotte: true, + mark: true, + marktext: "助", + onremove: true, + intro: { + name: "结姻(助)", + name2: "助", + content: "mark", }, - content:function(){ - 'step 0' - player.chooseTarget('结姻:令一名其他角色获得1枚“助”',lib.filter.notMe,true).set('ai',target=>get.attitude(_status.event.player,target)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sbjieyin_init',target); - target.addSkill('sbjieyin_mark'); - target.addMark('sbjieyin_mark',1); + }, + marked: { charlotte: true }, + init: { + audio: "sbjieyin", + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + direct: true, + dutySkill: true, + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget("结姻:令一名其他角色获得1枚“助”", lib.filter.notMe, true) + .set("ai", (target) => get.attitude(_status.event.player, target)); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sbjieyin_init", target); + target.addSkill("sbjieyin_mark"); + target.addMark("sbjieyin_mark", 1); } - 'step 2' + ("step 2"); game.delayx(); - } + }, }, - } + }, }, - sbliangzhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.group=='shu'&&game.hasPlayer(current=>current!=player&¤t.countCards('e')); + sbliangzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.group == "shu" && + game.hasPlayer((current) => current != player && current.countCards("e")) + ); }, - groupSkill:true, - filterTarget:function(card,player,target){ - return target.countCards('e')&&target!=player; + groupSkill: true, + filterTarget: function (card, player, target) { + return target.countCards("e") && target != player; }, - content:function(){ - 'step 0' - player.choosePlayerCard(target,'e',true); - 'step 1' - if(result.bool){ - player.addToExpansion(result.cards,target,'give').gaintag.add('sbliangzhu'); + content: function () { + "step 0"; + player.choosePlayerCard(target, "e", true); + ("step 1"); + if (result.bool) { + player.addToExpansion(result.cards, target, "give").gaintag.add("sbliangzhu"); } else event.finish(); - 'step 2' - for(var target of game.filterPlayer(current=>current.hasMark('sbjieyin_mark'))){ - target.chooseDrawRecover(2,true); + ("step 2"); + for (var target of game.filterPlayer((current) => current.hasMark("sbjieyin_mark"))) { + target.chooseDrawRecover(2, true); } }, - marktext:'妆', - intro:{ - name:'良助(妆)', - name2:'妆', - content:'expansion', - markcount:'expansion', + marktext: "妆", + intro: { + name: "良助(妆)", + name2: "妆", + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{ - order:9, - result:{ - player:function(player){ - var num=0,targets=game.filterPlayer(current=>current.hasMark('sbjieyin_mark')); - for(var current of targets){ - num+=2*get.effect(current,{name:'draw'},player,player); + ai: { + order: 9, + result: { + player: function (player) { + var num = 0, + targets = game.filterPlayer((current) => current.hasMark("sbjieyin_mark")); + for (var current of targets) { + num += 2 * get.effect(current, { name: "draw" }, player, player); } - if(num>0) return 3; + if (num > 0) return 3; return 1; }, - target:-1, - } - } + target: -1, + }, + }, }, - sbxiaoji:{ - audio:2, - audioname:['sp_sunshangxiang','re_sunshangxiang','db_sunshangxiang'], - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + sbxiaoji: { + audio: 2, + audioname: ["sp_sunshangxiang", "re_sunshangxiang", "db_sunshangxiang"], + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - locked:false, - groupSkill:true, - filter:function(event,player){ - if(player.group!='wu') return false; - var evt=event.getl(player); - return evt&&evt.player==player&&evt.es&&evt.es.length>0; + forced: true, + locked: false, + groupSkill: true, + filter: function (event, player) { + if (player.group != "wu") return false; + var evt = event.getl(player); + return evt && evt.player == player && evt.es && evt.es.length > 0; }, - content:function(){ - 'step 0' - event.count=trigger.getl(player).es.length; - 'step 1' + content: function () { + "step 0"; + event.count = trigger.getl(player).es.length; + ("step 1"); event.count--; player.draw(2); - player.chooseTarget('是否弃置场上的一张牌?',(card,player,target)=>{ - return target.countDiscardableCards(player,'ej'); - }).set('ai',target=>{ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0&&(target.countCards('j')>0||target.countCards('e',function(card){ - return get.value(card,target)<0; - }))) return 2; - if(att<0&&target.countCards('e')>0&&!target.hasSkillTag('noe')) return -1; - return 0; - }); - 'step 2' - if(result.bool){ - player.discardPlayerCard(result.targets[0],'ej',true); + player + .chooseTarget("是否弃置场上的一张牌?", (card, player, target) => { + return target.countDiscardableCards(player, "ej"); + }) + .set("ai", (target) => { + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + att > 0 && + (target.countCards("j") > 0 || + target.countCards("e", function (card) { + return get.value(card, target) < 0; + })) + ) + return 2; + if (att < 0 && target.countCards("e") > 0 && !target.hasSkillTag("noe")) + return -1; + return 0; + }); + ("step 2"); + if (result.bool) { + player.discardPlayerCard(result.targets[0], "ej", true); } - 'step 3' - if(event.count>0){ - player.logSkill('sbxiaoji'); + ("step 3"); + if (event.count > 0) { + player.logSkill("sbxiaoji"); event.goto(1); } }, - ai:{ - noe:true, - reverseEquip:true, - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; - } - } + ai: { + noe: true, + reverseEquip: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, + }, }, }, //吕蒙 - sbkeji:{ - audio:2, - enable:'phaseUse', - filterCard:true, - selectCard:function(){ - var player=_status.event.player; - if(player.hasSkill('sbkeji_discard')) return [0,0]; - if(player.hasSkill('sbkeji_losehp')) return [1,1]; - return [0,1]; + sbkeji: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.hasSkill("sbkeji_discard")) return [0, 0]; + if (player.hasSkill("sbkeji_losehp")) return [1, 1]; + return [0, 1]; }, - locked:false, - usable:2, - prompt:function(event){ - var player=_status.event.player,str='出牌阶段'+(player.storage.sbkeji?'':'各')+'限一次。你可以'; - var discard=player.hasSkill('sbkeji_discard'),losehp=player.hasSkill('sbkeji_losehp'); - if(!discard) str+='弃置一张手牌并获得1点护甲'; - if(!losehp) str+=(!discard?',或':'')+'点击“确定”失去1点体力并获得2点护甲'; + locked: false, + usable: 2, + prompt: function (event) { + var player = _status.event.player, + str = "出牌阶段" + (player.storage.sbkeji ? "" : "各") + "限一次。你可以"; + var discard = player.hasSkill("sbkeji_discard"), + losehp = player.hasSkill("sbkeji_losehp"); + if (!discard) str += "弃置一张手牌并获得1点护甲"; + if (!losehp) str += (!discard ? ",或" : "") + "点击“确定”失去1点体力并获得2点护甲"; return str; }, - filter:function(event,player){ - return (player.getStat('skill').sbkeji||0)<(player.storage.sbkeji?1:2); + filter: function (event, player) { + return (player.getStat("skill").sbkeji || 0) < (player.storage.sbkeji ? 1 : 2); }, - check:function(card){ - var player=_status.event.player; - if(_status.event.player.hp==1&&player.canSave(player)&&player.hujia<=3) return 0; - return 6-get.value(card); + check: function (card) { + var player = _status.event.player; + if (_status.event.player.hp == 1 && player.canSave(player) && player.hujia <= 3) return 0; + return 6 - get.value(card); }, - content:function(){ - 'step 0' - if(cards.length){ - player.changeHujia(1,null,true); - player.addTempSkill('sbkeji_discard','phaseUseAfter'); + content: function () { + "step 0"; + if (cards.length) { + player.changeHujia(1, null, true); + player.addTempSkill("sbkeji_discard", "phaseUseAfter"); event.finish(); - } - else{ + } else { player.loseHp(); } - 'step 1' - player.changeHujia(2,null,true); - player.addTempSkill('sbkeji_losehp','phaseUseAfter'); + ("step 1"); + player.changeHujia(2, null, true); + player.addTempSkill("sbkeji_losehp", "phaseUseAfter"); }, - mod:{ - maxHandcard:function(player,num){ - return num+player.hujia; + mod: { + maxHandcard: function (player, num) { + return num + player.hujia; }, - cardEnabled:function(card,player){ - if(player!=_status.event.dying&&card.name=='tao') return false; + cardEnabled: function (card, player) { + if (player != _status.event.dying && card.name == "tao") return false; }, - cardSavable:function(card,player){ - if(player!=_status.event.dying&&card.name=='tao') return false; + cardSavable: function (card, player) { + if (player != _status.event.dying && card.name == "tao") return false; }, }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(player.hujia>=5) return 0; - if(player.hp==1&&!player.canSave(player)&&!player.hasCard(card=>{ - return lib.filter.cardDiscardable(card,player,'sbkeji')&&get.value(card)<6; - },'h')){ + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.hujia >= 5) return 0; + if ( + player.hp == 1 && + !player.canSave(player) && + !player.hasCard((card) => { + return ( + lib.filter.cardDiscardable(card, player, "sbkeji") && + get.value(card) < 6 + ); + }, "h") + ) { return 0; } return 1; - } + }, }, }, - subSkill:{ - discard:{charlotte:true}, - losehp:{charlotte:true}, - } + subSkill: { + discard: { charlotte: true }, + losehp: { charlotte: true }, + }, }, - sbdujiang:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - derivation:'sbduojing', - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'wood', - filter:function(event,player){ - return player.hujia>=3; + sbdujiang: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + derivation: "sbduojing", + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return player.hujia >= 3; + }, + content: function () { + player.awakenSkill("sbdujiang"); + player.addSkills("sbduojing"); + player.storage.sbkeji = true; }, - content:function(){ - player.awakenSkill('sbdujiang'); - player.addSkills('sbduojing'); - player.storage.sbkeji=true; - } }, - sbduojing:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - return player.hujia>0&&event.card.name=='sha'; + sbduojing: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + return player.hujia > 0 && event.card.name == "sha"; }, - check:function(event,player){ - return event.target.countGainableCards(player,'he')>0||player.countCards('hs',{name:'sha'})>0; + check: function (event, player) { + return ( + event.target.countGainableCards(player, "he") > 0 || + player.countCards("hs", { name: "sha" }) > 0 + ); }, - logTarget:'target', - content:function(){ - 'step 0' + logTarget: "target", + content: function () { + "step 0"; player.changeHujia(-1); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.sbduojing=true; - 'step 1' - var target=trigger.target; - if(target.countGainableCards(player,'he')>0) player.gainPlayerCard(target,'he',true); - player.addTempSkill('sbduojing_add','phaseUseAfter'); - player.addMark('sbduojing_add',1,false); - player.markSkill('sbduojing_add'); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sbduojing = true; + ("step 1"); + var target = trigger.target; + if (target.countGainableCards(player, "he") > 0) + player.gainPlayerCard(target, "he", true); + player.addTempSkill("sbduojing_add", "phaseUseAfter"); + player.addMark("sbduojing_add", 1, false); + player.markSkill("sbduojing_add"); }, - subSkill:{ - add:{ - charlotte:true, - marktext:'夺', - onremove:true, - intro:{ - content:'本阶段使用杀次数上限+$' + subSkill: { + add: { + charlotte: true, + marktext: "夺", + onremove: true, + intro: { + content: "本阶段使用杀次数上限+$", }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('sbduojing_add'); + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("sbduojing_add"); }, }, }, }, - ai:{ - unequip:true, - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(player.hujia<=0) return; - if(tag=='unequip'&&(!arg||!arg.card||!arg.card.storage||!arg.card.storage.sbduojing)) return false; - if(tag=='unequip_ai'&&(!arg||arg.name!='sha')) return false; + ai: { + unequip: true, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (player.hujia <= 0) return; + if ( + tag == "unequip" && + (!arg || !arg.card || !arg.card.storage || !arg.card.storage.sbduojing) + ) + return false; + if (tag == "unequip_ai" && (!arg || arg.name != "sha")) return false; }, }, }, //于禁 - sbxiayuan:{ - audio:2, - trigger:{global:'damageEnd'}, - direct:true, - filter:function(event,player){ - return event.hujia&&!event.player.hujia&&event.player.isIn()&&player.countCards('h')>1&&!player.hasSkill('sbxiayuan_round',null,false,false); + sbxiayuan: { + audio: 2, + trigger: { global: "damageEnd" }, + direct: true, + filter: function (event, player) { + return ( + event.hujia && + !event.player.hujia && + event.player.isIn() && + player.countCards("h") > 1 && + !player.hasSkill("sbxiayuan_round", null, false, false) + ); }, - content:function(){ - 'step 0' - player.addTempSkill('sbxiayuan_round','roundStart'); - player.chooseToDiscard(2,'h',get.prompt('sbxiayuan',trigger.player),'弃置两张手牌,令其获得'+get.cnNumber(trigger.hujia)+'点护甲').set('goon',get.attitude(player,trigger.player)>0).set('ai',function(card){ - if(!_status.event.goon) return 0; - return 5-get.value(card); - }).logSkill=['sbxiayuan',trigger.player]; - 'step 1' - if(result.bool){ - var target=trigger.player; - target.changeHujia(trigger.hujia,null,true); + content: function () { + "step 0"; + player.addTempSkill("sbxiayuan_round", "roundStart"); + player + .chooseToDiscard( + 2, + "h", + get.prompt("sbxiayuan", trigger.player), + "弃置两张手牌,令其获得" + get.cnNumber(trigger.hujia) + "点护甲" + ) + .set("goon", get.attitude(player, trigger.player) > 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 5 - get.value(card); + }).logSkill = ["sbxiayuan", trigger.player]; + ("step 1"); + if (result.bool) { + var target = trigger.player; + target.changeHujia(trigger.hujia, null, true); game.delayx(); - } - else player.removeSkill('sbxiayuan_round'); + } else player.removeSkill("sbxiayuan_round"); }, - subSkill:{round:{charlotte:true}}, - ai:{expose:0.2}, + subSkill: { round: { charlotte: true } }, + ai: { expose: 0.2 }, }, - sbjieyue:{ - audio:4, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,get.prompt('sbjieyue'),'令一名其他角色获得1点护甲,然后该角色可以交给你一张牌。').set('ai',function(target){ - return get.attitude(_status.event.player,target)/Math.sqrt(Math.min(1,target.hp+target.hujia)); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('sbjieyue',target); - target.changeHujia(1,null,true); - target.chooseCard('he','是否交给'+get.translation(player)+'一张牌?').set('ai',(card)=>0.1-get.value(card)); - } - else event.finish(); - 'step 2' - if(result.bool){ - target.give(result.cards,player); + sbjieyue: { + audio: 4, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + lib.filter.notMe, + get.prompt("sbjieyue"), + "令一名其他角色获得1点护甲,然后该角色可以交给你一张牌。" + ) + .set("ai", function (target) { + return ( + get.attitude(_status.event.player, target) / + Math.sqrt(Math.min(1, target.hp + target.hujia)) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("sbjieyue", target); + target.changeHujia(1, null, true); + target + .chooseCard("he", "是否交给" + get.translation(player) + "一张牌?") + .set("ai", (card) => 0.1 - get.value(card)); + } else event.finish(); + ("step 2"); + if (result.bool) { + target.give(result.cards, player); } }, - ai:{ - threaten:2.7, - expose:0.2, + ai: { + threaten: 2.7, + expose: 0.2, }, }, //华雄 - sbyangwei:{ - audio:3, - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('sbyangwei_counter',null,null,false); + sbyangwei: { + audio: 3, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("sbyangwei_counter", null, null, false); }, - content:function(){ + content: function () { player.draw(2); - player.addTempSkill('sbyangwei_effect'); - player.addSkill('sbyangwei_counter'); + player.addTempSkill("sbyangwei_effect"); + player.addSkill("sbyangwei_counter"); }, - ai:{ - order:9, - result:{player:1}, + ai: { + order: 9, + result: { player: 1 }, }, - subSkill:{ - effect:{ - audio:'sbyangwei', - equipSkill:false, - inherit:'qinggang_skill', - charlotte:true, - nopop:true, - mod:{ - targetInRange:function(card){ - if(card.name=='sha') return true; + subSkill: { + effect: { + audio: "sbyangwei", + equipSkill: false, + inherit: "qinggang_skill", + charlotte: true, + nopop: true, + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, - mark:true, - marktext:'威', - intro:{content:'使用【杀】的次数上限+1且无距离限制且无视防具'}, + mark: true, + marktext: "威", + intro: { content: "使用【杀】的次数上限+1且无距离限制且无视防具" }, }, - counter:{ - trigger:{player:'phaseJieshu'}, - silent:true, - popup:false, - forced:true, - charlotte:true, - onremove:true, - content:function(){ - if(!player.storage.sbyangwei_counter) player.storage.sbyangwei_counter=true; - else player.removeSkill('sbyangwei_counter'); + counter: { + trigger: { player: "phaseJieshu" }, + silent: true, + popup: false, + forced: true, + charlotte: true, + onremove: true, + content: function () { + if (!player.storage.sbyangwei_counter) player.storage.sbyangwei_counter = true; + else player.removeSkill("sbyangwei_counter"); }, }, }, }, //黄忠 - sbliegong:{ - audio:2, - mod:{ - cardnature:function(card,player){ - if(player.hasEmptySlot(1)&&get.name(card,player)=='sha') return false; + sbliegong: { + audio: 2, + mod: { + cardnature: function (card, player) { + if (player.hasEmptySlot(1) && get.name(card, player) == "sha") return false; }, }, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return !event.getParent()._sbliegong_player&&event.targets.length==1&&event.card.name=='sha'&&player.getStorage('sbliegong').length>0; + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return ( + !event.getParent()._sbliegong_player && + event.targets.length == 1 && + event.card.name == "sha" && + player.getStorage("sbliegong").length > 0 + ); }, - prompt2:function(event,player){ - var str='',storage=player.getStorage('sbliegong'); - if(storage.length>1){ - str+=('亮出牌堆顶的'+get.cnNumber(storage.length-1)+'张牌并增加伤害;且'); + prompt2: function (event, player) { + var str = "", + storage = player.getStorage("sbliegong"); + if (storage.length > 1) { + str += "亮出牌堆顶的" + get.cnNumber(storage.length - 1) + "张牌并增加伤害;且"; } - str+=('令'+get.translation(event.target)+'不能使用花色为'); - for(var i=0;i0) return false; - if(target.hasSkillTag('filterDamage',null,{ - player:player, - card:event.card, - })) return false; - var storage=player.getStorage('sbliegong'); - if(storage.length>=4) return true; - if(storage.length<3) return false; - if(target.hasShan()) return storage.includes('heart')&&storage.includes('diamond'); + logTarget: "target", + locked: false, + check: function (event, player) { + var target = event.target; + if (get.attitude(player, target) > 0) return false; + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) + ) + return false; + var storage = player.getStorage("sbliegong"); + if (storage.length >= 4) return true; + if (storage.length < 3) return false; + if (target.hasShan()) return storage.includes("heart") && storage.includes("diamond"); return true; }, - content:function(){ - var storage=player.getStorage('sbliegong').slice(0); - var num=storage.length-1; - var evt=trigger.getParent(); - if(num>0){ - if(typeof evt.baseDamage!='number') evt.baseDamage=1; - var cards=get.cards(num); - player.showCards(cards.slice(0),get.translation(player)+'发动了【烈弓】'); - while(cards.length>0){ - var card=cards.pop(); - if(storage.includes(get.suit(card,false))) evt.baseDamage++; + content: function () { + var storage = player.getStorage("sbliegong").slice(0); + var num = storage.length - 1; + var evt = trigger.getParent(); + if (num > 0) { + if (typeof evt.baseDamage != "number") evt.baseDamage = 1; + var cards = get.cards(num); + player.showCards(cards.slice(0), get.translation(player) + "发动了【烈弓】"); + while (cards.length > 0) { + var card = cards.pop(); + if (storage.includes(get.suit(card, false))) evt.baseDamage++; //ui.cardPile.insertBefore(card,ui.cardPile.firstChild); } //game.updateRoundNumber(); } - evt._sbliegong_player=player; - player.addTempSkill('sbliegong_clear'); - var target=trigger.target; - target.addTempSkill('sbliegong_block'); - if(!target.storage.sbliegong_block) target.storage.sbliegong_block=[]; - target.storage.sbliegong_block.push([evt.card,storage]); + evt._sbliegong_player = player; + player.addTempSkill("sbliegong_clear"); + var target = trigger.target; + target.addTempSkill("sbliegong_block"); + if (!target.storage.sbliegong_block) target.storage.sbliegong_block = []; + target.storage.sbliegong_block.push([evt.card, storage]); lib.skill.sbliegong.updateBlocker(target); }, - updateBlocker:function(player){ - var list=[],storage=player.storage.sbliegong_block; - if(storage&&storage.length){ - for(var i of storage) list.addArray(i[1]); + updateBlocker: function (player) { + var list = [], + storage = player.storage.sbliegong_block; + if (storage && storage.length) { + for (var i of storage) list.addArray(i[1]); } - player.storage.sbliegong_blocker=list; + player.storage.sbliegong_blocker = list; }, - ai:{ - threaten:3.5, - directHit_ai:true, - halfneg:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.card&&arg.card.name=='sha'){ - var storage=player.getStorage('sbliegong'); - if(storage.length<3||!storage.includes('heart')||!storage.includes('diamond')) return false; - var target=arg.target; - if(target.hasSkill('bagua_skill')||target.hasSkill('bazhen')||target.hasSkill('rw_bagua_skill')) return false; + ai: { + threaten: 3.5, + directHit_ai: true, + halfneg: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") { + var storage = player.getStorage("sbliegong"); + if ( + storage.length < 3 || + !storage.includes("heart") || + !storage.includes("diamond") + ) + return false; + var target = arg.target; + if ( + target.hasSkill("bagua_skill") || + target.hasSkill("bazhen") || + target.hasSkill("rw_bagua_skill") + ) + return false; return true; } return false; }, }, - intro:{ - content:'已记录花色:$', - onunmark:true, + intro: { + content: "已记录花色:$", + onunmark: true, }, - group:'sbliegong_count', - subSkill:{ - clear:{ - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - return event._sbliegong_player==player; + group: "sbliegong_count", + subSkill: { + clear: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return event._sbliegong_player == player; }, - content:function(){ - player.unmarkSkill('sbliegong'); + content: function () { + player.unmarkSkill("sbliegong"); }, }, - block:{ - mod:{ - cardEnabled:function(card,player){ - if(!player.storage.sbliegong_blocker) return; - var suit=get.suit(card); - if(suit=='none') return; - var evt=_status.event; - if(evt.name!='chooseToUse') evt=evt.getParent('chooseToUse'); - if(!evt||!evt.respondTo||evt.respondTo[1].name!='sha') return; - if(player.storage.sbliegong_blocker.includes(suit)) return false; + block: { + mod: { + cardEnabled: function (card, player) { + if (!player.storage.sbliegong_blocker) return; + var suit = get.suit(card); + if (suit == "none") return; + var evt = _status.event; + if (evt.name != "chooseToUse") evt = evt.getParent("chooseToUse"); + if (!evt || !evt.respondTo || evt.respondTo[1].name != "sha") return; + if (player.storage.sbliegong_blocker.includes(suit)) return false; }, }, - trigger:{ - player:['damageBefore','damageCancelled','damageZero'], - target:['shaMiss','useCardToExcluded','useCardToEnd'], - global:['useCardEnd'], + trigger: { + player: ["damageBefore", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded", "useCardToEnd"], + global: ["useCardEnd"], }, - forced:true, - firstDo:true, - charlotte:true, - onremove:function(player){ + forced: true, + firstDo: true, + charlotte: true, + onremove: function (player) { delete player.storage.sbliegong_block; delete player.storage.sbliegong_blocker; }, - filter:function(event,player){ - if(!event.card||!player.storage.sbliegong_block) return false; - for(var i of player.storage.sbliegong_block){ - if(i[0]==event.card) return true; + filter: function (event, player) { + if (!event.card || !player.storage.sbliegong_block) return false; + for (var i of player.storage.sbliegong_block) { + if (i[0] == event.card) return true; } return false; }, - content:function(){ - var storage=player.storage.sbliegong_block; - for(var i=0;i1; + splveying: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && player.countMark("splveying") > 1; }, - content:function(){ - 'step 0' - player.removeMark('splveying',2); + content: function () { + "step 0"; + player.removeMark("splveying", 2); player.draw(); - 'step 1' - player.chooseUseTarget('guohe'); + ("step 1"); + player.chooseUseTarget("guohe"); }, - marktext:'椎', - intro:{ - name:'椎(掠影/莺舞)', - name2:'椎', - content:'mark', + marktext: "椎", + intro: { + name: "椎(掠影/莺舞)", + name2: "椎", + content: "mark", }, - group:'splveying_add', - subSkill:{ - add:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - usable:2, - filter:function(event,player){ - return event.card.name=='sha'&&player.isPhaseUsing(); + group: "splveying_add", + subSkill: { + add: { + trigger: { player: "useCardToPlayered" }, + forced: true, + usable: 2, + filter: function (event, player) { + return event.card.name == "sha" && player.isPhaseUsing(); }, - content:function(){ - player.addMark('splveying',1); + content: function () { + player.addMark("splveying", 1); }, }, }, }, - spyingwu:{ - group:'spyingwu_add', - audio:2, - trigger:{player:'useCardAfter'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.hasSkill('splveying',null,null,false)&&(get.type(event.card)=='trick'&&!get.tag(event.card,'damage'))&&player.countMark('splveying')>1; + spyingwu: { + group: "spyingwu_add", + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player.hasSkill("splveying", null, null, false) && + get.type(event.card) == "trick" && + !get.tag(event.card, "damage") && + player.countMark("splveying") > 1 + ); }, - content:function(){ - player.removeMark('splveying',2); + content: function () { + player.removeMark("splveying", 2); player.draw(); - player.chooseUseTarget('sha',false); + player.chooseUseTarget("sha", false); }, - ai:{combo:'splveying'}, - subSkill:{ - add:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - locked:false, - usable:2, - filter:function(event,player){ - return player.hasSkill('splveying')&&(get.type(event.card)=='trick'&&!get.tag(event.card,'damage'))&&player.isPhaseUsing(); + ai: { combo: "splveying" }, + subSkill: { + add: { + trigger: { player: "useCardToPlayered" }, + forced: true, + locked: false, + usable: 2, + filter: function (event, player) { + return ( + player.hasSkill("splveying") && + get.type(event.card) == "trick" && + !get.tag(event.card, "damage") && + player.isPhaseUsing() + ); }, - content:function(){ - player.addMark('splveying',1); + content: function () { + player.addMark("splveying", 1); }, }, }, }, //手杀杨婉 - spmingxuan:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - forced:true, - filter:function(event,player){ - var list=player.getStorage('spmingxuan'); - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&&!list.includes(current); - }); + spmingxuan: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + var list = player.getStorage("spmingxuan"); + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && !list.includes(current); + }) + ); }, - content:function(){ - 'step 0' - var suits=[],hs=player.getCards('h'); - for(var i of hs) suits.add(get.suit(i,player)); - var list=player.getStorage('spmingxuan'),num=Math.min(suits.length,game.countPlayer(function(current){ - return current!=player&&!list.includes(current); - })); - player.chooseCard('h',true,[1,num],'瞑昡:请选择至多'+get.cnNumber(num)+'张花色各不相同的手牌',function(card,player){ - if(!ui.selected.cards.length) return true; - var suit=get.suit(card); - for(var i of ui.selected.cards){ - if(get.suit(i,player)==suit) return false; - } - return true; - }).set('complexCard',true).set('ai',(card)=>6-get.value(card)); - 'step 1' - if(result.bool){ - var list=player.getStorage('spmingxuan'),cards=result.cards.randomSort(); - var targets=game.filterPlayer((current)=>(current!=player&&!list.includes(current))).randomGets(cards.length).sortBySeat(); - player.line(targets,'green'); - var map=[]; - for(var i=0;i 6 - get.value(card)); + ("step 1"); + if (result.bool) { + var list = player.getStorage("spmingxuan"), + cards = result.cards.randomSort(); + var targets = game + .filterPlayer((current) => current != player && !list.includes(current)) + .randomGets(cards.length) + .sortBySeat(); + player.line(targets, "green"); + var map = []; + for (var i = 0; i < targets.length; i++) { + map.push([targets[i], cards[i]]); } game.loseAsync({ - gain_list:map, - player:player, - cards:cards, - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); - event.targets=targets; - event.num=0; - } - else event.finish(); - 'step 2' + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + event.targets = targets; + event.num = 0; + } else event.finish(); + ("step 2"); game.delayx(); - 'step 3' - if(num0); - } - else event.finish(); - 'step 2' - if(result.bool){ - if(target.canUse('sha',trigger.source,false)) target.useCard({name:'sha',isCard:true},trigger.source,false); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("spxianchou"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().source; + }) + .set("ai", function (target) { + return ( + get.attitude(target, _status.event.player) * + Math.sqrt(target.countCards("he")) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("spxianchou", target); + player.line2([target, trigger.source]); + target + .chooseToDiscard( + "he", + "是否弃置一张牌,视为对" + + get.translation(trigger.source) + + "使用一张【杀】?" + ) + .set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); + return 0; + }) + .set( + "goon", + (target.canUse("sha", trigger.source, false) + ? get.effect( + trigger.source, + { name: "sha", isCard: true }, + target, + target + ) + : 0) + + get.recoverEffect(player, target, target) > + 0 + ); + } else event.finish(); + ("step 2"); + if (result.bool) { + if (target.canUse("sha", trigger.source, false)) + target.useCard({ name: "sha", isCard: true }, trigger.source, false); else event.finish(); - } - else event.finish(); - 'step 3' - if(target.hasHistory('sourceDamage',function(evt){ - var card=evt.card; - if(!card||card.name!='sha') return false; - var evtx=evt.getParent('useCard'); - return evtx.card==card&&evtx.getParent()==event; - })){ + } else event.finish(); + ("step 3"); + if ( + target.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) { target.draw(); player.recover(); } }, }, }, - dynamicTranslate:{ - sbkeji:function(player){ - return '①出牌阶段' + (player.storage.sbkeji ? '' :'各') + '限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。'; + dynamicTranslate: { + sbkeji: function (player) { + return ( + "①出牌阶段" + + (player.storage.sbkeji ? "" : "各") + + "限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。" + ); }, - sblongdan:function(player){ - if(player.hasSkill('sblongdan_mark',null,null,false)) return '蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。'; - return '蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。'; + sblongdan: function (player) { + if (player.hasSkill("sblongdan_mark", null, null, false)) + return "蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。"; + return "蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。"; }, - sblianhuan:function(player){ - var str='①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。'; - if(!player.storage.sblianhuan) str+='③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。'; - else str+='③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。'; + sblianhuan: function (player) { + var str = + "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。"; + if (!player.storage.sblianhuan) + str += + "③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。"; + else + str += + "③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。"; return str; }, - sbjiang:function(player){ - var str='①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限'; - if(player.countMark('sbjiang')) str+='X次。你可以将所有手牌当【决斗】使用(X为场上其他吴势力角色数+1)。'; - else str+='一次。你可以将所有手牌当【决斗】使用。'; + sbjiang: function (player) { + var str = + "①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限"; + if (player.countMark("sbjiang")) + str += "X次。你可以将所有手牌当【决斗】使用(X为场上其他吴势力角色数+1)。"; + else str += "一次。你可以将所有手牌当【决斗】使用。"; return str; }, - sbzhenliang:function(player){ - var storage=player.storage.sbzhenliang; - var str='转换技。'; - if(!storage) str+=''; - str+='阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。'; - if(!storage) str+=''; - if(storage) str+=''; - str+='阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。'; - if(storage) str+=''; + sbzhenliang: function (player) { + var storage = player.storage.sbzhenliang; + var str = "转换技。"; + if (!storage) str += ''; + str += + "阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。"; + if (!storage) str += ""; + if (storage) str += ''; + str += + "阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。"; + if (storage) str += ""; return str; }, }, - translate:{ - sb_zhanghe_prefix:'谋', - sb_yujin_prefix:'谋', - sb_huaxiong_prefix:'谋', - liucheng_prefix:'谋', - sp_yangwan_prefix:'谋', - sb_huangzhong_prefix:'谋', - sb_lvmeng_prefix:'谋', - sb_sunshangxiang_prefix:'谋', - sb_sunquan_prefix:'谋', - sb_huanggai_prefix:'谋', - sb_zhouyu_prefix:'谋', - sb_caoren_prefix:'谋', - sb_xiahoushi_prefix:'谋', - sb_zhangjiao_prefix:'谋', - sb_caocao_prefix:'谋', - sb_zhenji_prefix:'谋', - sb_ganning_prefix:'谋', - sb_machao_prefix:'谋', - sb_xuhuang_prefix:'谋', - sb_zhangfei_prefix:'谋', - sb_zhaoyun_prefix:'谋', - sb_liubei_prefix:'谋', - sb_jiangwei_prefix:'谋', - sb_fazheng_prefix:'谋', - sb_chengong_prefix:'谋', - sb_diaochan_prefix:'谋', - sb_yuanshao_prefix:'谋', - sb_pangtong_prefix:'谋', - sb_sunce_prefix:'谋', - sb_daqiao_prefix:'谋', - sb_liubiao_prefix:'谋', - sb_zhurong_prefix:'谋', - sb_menghuo_prefix:'谋', - sp_yangwan:'谋杨婉', - spmingxuan:'瞑昡', - spmingxuan_info:'锁定技。出牌阶段开始时,你须选择至多X张花色各不相同的手牌(X为未选择过选项一的角色),将这些牌随机交给这些角色中的等量角色。然后这些角色依次选择一项:⒈对你使用一张【杀】。⒉交给你一张牌,然后你摸一张牌。', - spxianchou:'陷仇', - spxianchou_info:'当你受到有来源的伤害后,你可选择一名不为伤害来源的其他角色。该角色可以弃置一张牌,然后视为对伤害来源使用一张【杀】(无距离限制)。若其因此【杀】造成了伤害,则其摸一张牌,你回复1点体力。', - liucheng:'谋刘赪', - splveying:'掠影', - splveying_info:'锁定技。①每回合限两次,当你使用【杀】指定目标后,你获得一个“椎”。②当你使用的【杀】结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【过河拆桥】。', - spyingwu:'莺舞', - spyingwu_info:'若你拥有〖掠影〗,则:①每回合限两次,当你使用非伤害类普通锦囊牌指定目标后,你获得一个“椎”。②当你使用的非伤害类普通锦囊牌结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【杀】。', - sb_huangzhong:'谋黄忠', - sbliegong:'烈弓', - sbliegong_info:'①若你的装备区内没有武器牌,则你手牌区内所有【杀】的属性视为无属性。②当你使用牌时,或成为其他角色使用牌的目标后,你记录此牌的花色。③当你使用【杀】指定唯一目标后,若你〖烈弓②〗的记录不为空,则你可亮出牌堆顶的X张牌(X为你〖烈弓②〗记录过的花色数-1),令此【杀】的伤害值基数+Y(Y为亮出牌中被〖烈弓②〗记录过花色的牌的数量),且目标角色不能使用〖烈弓②〗记录过花色的牌响应此【杀】。此【杀】使用结算结束后,你清除〖烈弓②〗的记录。', - sb_huaxiong:'谋华雄', - sbyangwei:'扬威', - sbyangwei_info:'出牌阶段,你可以摸两张牌,令此技能于你的下下个结束阶段前失效,且你获得如下效果直到回合结束:使用【杀】无距离限制,次数上限+1且无视防具。', - sb_yujin:'谋于禁', - sbxiayuan:'狭援', - sbxiayuan_info:'每轮限一次。其他角色受到伤害后,若其因此伤害触发过护甲效果且其没有护甲,则你可弃置两张手牌,令其获得X点护甲(X为其因此伤害触发护甲效果而失去的护甲数量)。', - sbjieyue:'节钺', - sbjieyue_info:'结束阶段,你可以令一名其他角色获得1点护甲。然后其可以交给你一张牌。', - sb_lvmeng:'谋吕蒙', - sbkeji:'克己', - sbkeji_info:'①出牌阶段各限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。', - sbdujiang:'渡江', - sbdujiang_info:'觉醒技。准备阶段,若你的护甲数不少于3,你获得〖夺荆〗,修改〖克己①〗为“出牌阶段限一次”。', - sbduojing:'夺荆', - sbduojing_info:'当你使用【杀】指定目标时,你可以失去1点护甲。然后令此【杀】无视防具,你获得目标角色一张牌,本回合使用【杀】的次数上限+1。', - sb_sunshangxiang:'谋孙尚香', - sbjieyin:'结姻', - sbjieyin_info:'使命技。①游戏开始时,你令一名其他角色获得1枚“助”。②出牌阶段开始时,有“助”的角色选择一项:1.交给你X张手牌(X=min(2,其手牌数)且至少为1),然后获得1点护甲;2.令你将“助”移动给另一名其他角色,或移去其“助”(若其此前获得过“助”,则只能移去)。③失败:当一名角色死亡后,若其于死亡时有“助”,或当你因〖结姻②〗移去“助”后,你将势力改为吴,回复1点体力,获得所有“妆”并减1点体力上限。', - sbliangzhu:'良助', - sbliangzhu_info:'蜀势力技。出牌阶段限一次,你可以将一名其他角色装备区里的一张牌置于武将牌上,称为“妆”,然后有“助”的角色须选择回复1点体力或摸两张牌。', - sbxiaoji:'枭姬', - sbxiaoji_info:'吴势力技。当你失去装备区里的一张牌后,你摸两张牌,然后可以弃置场上的一张牌。', - sb_sunquan:'谋孙权', - sbzhiheng:'制衡', - sbzhiheng_info:'出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你以此法弃置的牌包括你所有手牌,则你多摸X张牌(X为你的“业”数+1),并弃1枚“业”。', - sbtongye:'统业', - sbtongye_info:'锁定技。结束阶段,你猜测场上装备牌数与你下一个准备阶段的场上装备牌数是否相等,并获得以下效果:你下一个准备阶段,若你猜对且“业”数小于2,你获得1枚“业”;若你猜错,你弃1枚“业”。', - sbjiuyuan:'救援', - sbjiuyuan_info:'主公技,锁定技。①其他吴势力角色使用【桃】时,你摸一张牌。②其他吴势力角色对你使用的【桃】的回复量+1。', - sb_huanggai:'谋黄盖', - sbkurou:'苦肉', - sbkurou_info:'①出牌阶段开始时,你可以交给其他角色一张牌,若此牌于对方手牌区内为【桃】或【酒】,你失去2点体力,否则你失去1点体力。②当你失去1点体力后,你获得2点护甲。', - sbzhaxiang:'诈降', - sbzhaxiang_info:'锁定技。①摸牌阶段,你多摸X张牌。②你每回合使用的前X张牌无距离与次数限制且不能被响应(X为你已损失的体力值)。', - sb_zhouyu:'谋周瑜', - sbyingzi:'英姿', - sbyingzi_info:'锁定技。摸牌阶段,你多摸X张牌,且令你本回合手牌上限+X(X为以下条件中你满足的项数:手牌数不小于2、体力值不小于2、装备区里的牌数不小于1)。', - sbfanjian:'反间', - sbfanjian_info:'出牌阶段,你可以声明一个花色并选择一张牌和一名其他角色(每种花色的牌每回合限一次)。其须选择一项:1.猜测此牌花色与你所声明花色是否相同;2.翻面。然后其正面向上获得此牌。若其选择猜测且猜测错误,其失去1点体力,否则其令你〖反间〗于本回合失效。', - sb_caoren:'谋曹仁', - sbjushou:'据守', - sbjushou_info:'①出牌阶段限一次。若你的武将牌正面朝上,你可以弃置至多两张牌,然后你翻面并获得等量护甲。②当你受到伤害后,若你的武将牌背面朝上,你选择一项:1.翻面;2.获得1点护甲。③当你翻面后,若你的武将牌正面朝上,你摸X张牌(X为你的护甲数)。', - sbjiewei:'解围', - sbjiewei_info:'出牌阶段限一次。你可以失去1点护甲并选择一名其他角色。你观看其手牌并获得其中一张。', - sb_xiahoushi:'谋夏侯氏', - sbqiaoshi:'樵拾', - sbqiaoshi_info:'每回合限一次。当你受到其他角色造成的伤害后,其可以令你回复等同于此次伤害值的体力,然后其摸两张牌。', - sbyanyu:'燕语', - sbyanyu_info:'①出牌阶段限两次。你可以弃置一张【杀】,然后摸一张牌。②出牌阶段结束时,你可以令一名其他角色摸3X张牌(X为你于此阶段发动〖燕语①〗的次数)。', - sb_zhangjiao:'谋张角', - sbleiji:'雷击', - sbleiji_info:'出牌阶段,你可以选择一名其他角色并弃4枚“道兵”,对其造成1点雷电伤害。', - sbguidao:'鬼道', - sbguidao_info:'①游戏开始时/一名角色受到属性伤害后,你获得4/2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。', - sbhuangtian:'黄天', - sbhuangtian_info:'主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得2枚“道兵”(每轮你至多以此法获得4枚“道兵”)。', - sb_caocao:'谋曹操', - sbjianxiong:'奸雄', - sbjianxiong_info:'①游戏开始时,你可获得至多2枚“治世”标记。②当你受到伤害后,你可获得伤害牌,摸1-X张牌(X为“治世”数),然后你可弃1枚“治世”。', - sbqingzheng:'清正', - sbqingzheng_info:'出牌阶段开始时,你可以弃置3-X种花色的所有手牌(X为“治世”数),并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。然后若X小于2且你拥有技能〖奸雄〗,你可以获得1枚“治世”。', - sbhujia:'护驾', - sbhujia_info:'主公技,每轮限一次。当你受到伤害时,你可以将此伤害转移给一名其他魏势力角色。', - sb_zhenji:'谋甄宓', - sbluoshen:'洛神', - sbluoshen_info:'准备阶段,你可以选择一名角色。从其开始按逆时针方向的X名其他角色依次执行(X为角色数的一半,向上取整):展示一张手牌,若此牌为黑色,你获得之且此牌不计入本回合手牌上限;若此牌为红色,其弃置之。', - sb_ganning:'谋甘宁', - sbqixi:'奇袭', - sbqixi_info:'出牌阶段限一次。若你有手牌,你可以令一名其他角色猜测你手牌中最多的花色。若其猜对,你展示所有手牌;若其猜错,你可令其从其未选择过的花色中再次猜测,重复此流程。然后你弃置其区域内的X张牌(X为其于本次〖奇袭〗中猜错的次数)。', - sbfenwei:'奋威', - sbfenwei_info:'限定技。①出牌阶段,你可以将至多三张牌分别置于等量名角色的武将牌上,称为“威”,然后你摸等量牌。②当一名角色成为锦囊牌的目标时,若其有“威”,你须选择:1.令其获得其“威”;2.令其移去“威”,并取消此目标。', - sb_machao:'谋马超', - sbtieji:'铁骑', - sbtieji_info:'当你使用【杀】指定其他角色为目标后,你可以令目标角色不能响应此【杀】,且其所有非锁定技失效直到回合结束。然后你与其进行谋弈。若你赢,且你选择的选项为:“直取敌营”,则你获得其一张牌;“扰阵疲敌”,你摸两张牌。', - sb_xuhuang:'谋徐晃', - sbduanliang:'断粮', - sbduanliang_info:'出牌阶段限一次。你可以与一名其他角色进行谋弈。若你赢,且你选择的选项为:“围城断粮”,若其判定区没有【兵粮寸断】,你将牌堆顶牌当【兵粮寸断】对其使用,否则你获得其一张牌;“擂鼓进军”,你视为对其使用一张【决斗】。', - sbshipo:'势迫', - sbshipo_info:'结束阶段,你可以令一名体力少于你的角色或所有判定区有【兵粮寸断】的其他角色选择一项:1.交给你一张手牌;2.受到1点伤害。所有目标角色选择完成后,你可以将任意张你以此法得到的牌交给一名其他角色。', - sb_zhangfei:'谋张飞', - sbpaoxiao:'咆哮', - sbpaoxiao_info:'锁定技。①你使用【杀】无次数限制。②若你的装备区内有武器牌,则你使用【杀】无距离限制。③当你于出牌阶段内使用第二张及以后【杀】时,你获得如下效果:{此【杀】不可被响应且伤害值基数+1;此【杀】指定目标后,目标角色的非锁定技于本回合内失效;此【杀】造成伤害后,若目标角色存活,则你失去1点体力并随机弃置一张手牌。}', - sbxieji:'协击', - sbxieji_info:'准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你可以选择至多三名其他角色。你对这些角色视为使用一张【杀】,且当此【杀】因执行牌面效果造成伤害后,你摸X张牌(X为伤害值)。', - sb_zhaoyun:'谋赵云', - sblongdan:'龙胆', - sblongdan_info:'蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。', - sbjizhu:'积著', - sbjizhu_info:'准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你修改〖龙胆〗直到你的下个结束阶段开始。', - sblongdan_shabi:'龙胆', - sblongdan_shabi_info:'蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。', - sb_liubei:'谋刘备', - sbrende:'仁德', - sbrende_info:'①出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为8)。②每回合限一次。你可以移去2枚“仁望”,视为使用或打出一张基本牌。③出牌阶段开始时,你获得2枚“仁望”。', - sbzhangwu:'章武', - sbzhangwu_info:'限定技。出牌阶段,你可以令所有于本局游戏成为过〖仁德①〗目标的其他角色依次交给你X张牌,然后你回复3点体力并失去〖仁德〗(X为游戏轮数-1,且至多为3)。', - sbjijiang:'激将', - sbjijiang_info:'主公技。出牌阶段结束时,你可以选择一名体力值不小于你的其他蜀势力角色A和一名在A攻击范围内的角色B。A选择一项:1.视为对B使用一张【杀】;2.下一个出牌阶段开始前,跳过此阶段。', - sb_jiangwei:'谋姜维', - sbtiaoxin:'挑衅', - sbtiaoxin_info:'蓄力技(4/4)。①出牌阶段限一次。你可以选择至多X名角色(X为你的蓄力值),令这些角色选择一项:1.对你使用一张【杀】(无距离限制);2.交给你一张牌。然后你消耗等同于你选择的目标数的蓄力值。②当你于弃牌阶段弃置牌后,你获得等量蓄力值。', - sbzhiji:'志继', - sbzhiji_info:'觉醒技。准备阶段,若你因〖挑衅①〗消耗过至少4点蓄力值,你减1点体力上限,令至少一名角色获得“北伐”标记并获得如下效果直到你的下回合开始:其使用牌只能指定你或其为目标。', - sb_fazheng:'谋法正', - sbxuanhuo:'眩惑', - sbxuanhuo_info:'①出牌阶段限一次。你可以将一张牌交给一名没有“眩”标记的其他角色,然后令其获得“眩”标记。②当有“眩”的其他角色于摸牌阶段外得到牌后,若你以此法于其本次获得“眩”的期间内得到其的牌数小于5,你随机获得其一张手牌。', - sbenyuan:'恩怨', - sbenyuan_info:'锁定技。准备阶段,若场上存在有“眩”的角色,你移去该角色的“眩”,且你于其本次获得“眩”的期间内得到其的牌数:不小于3,你交给其三张牌;小于3,其失去1点体力,你回复1点体力。', - sb_chengong:'谋陈宫', - sbmingce:'明策', - sbmingce_info:'①出牌阶段限一次。你可以将一张牌交给一名其他角色,其选择一项:1.失去1点体力,令你摸两张牌并获得1枚“策”;2.摸一张牌。②出牌阶段开始时,你可以移去所有“策”并对一名其他角色造成等量伤害。', - sbzhichi:'智迟', - sbzhichi_info:'锁定技。当你受到伤害后,防止你本回合受到的伤害。', - sb_yuanshao:'谋袁绍', - sbluanji:'乱击', - sbluanji_info:'①出牌阶段限一次。你可以将两张手牌当【万箭齐发】使用。②每回合限三次,当其他角色因响应你使用的【万箭齐发】而打出【闪】时,你摸一张牌。', - sbxueyi:'血裔', - sbxueyi_info:'主公技,锁定技。①你的手牌上限+2X(X为场上其他群势力角色数)。②每回合限两次,当你使用牌指定其他群势力角色为目标后,你摸一张牌。', - sb_diaochan:'谋貂蝉', - sblijian:'离间', - sblijian_info:'出牌阶段限一次。你可以选择至少两名其他角色并弃置X张牌(X为你选择的角色数-1)。然后每名你选择的角色依次视为对这些角色中与其逆时针座次最近的另一名角色使用一张【决斗】。', - sbbiyue:'闭月', - sbbiyue_info:'锁定技。结束阶段,你摸Y张牌(Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为4)。', - sb_pangtong:'谋庞统', - sblianhuan:'连环', - sblianhuan_info:'①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。', - sblianhuan_lv2:'连环·改', - sblianhuan_lv2_info:'①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。', - sbniepan:'涅槃', - sbniepan_info:'限定技。当你处于濒死状态时,你可以弃置区域里的所有牌,摸两张牌,将体力回复至2点,复原武将牌,然后修改〖连环〗。', - sb_sunce:'谋孙策', - sbjiang:'激昂', - sbjiang_info:'①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限一次。你可以将所有手牌当【决斗】使用。', - sbhunzi:'魂姿', - sbhunzi_info:'觉醒技。当你脱离濒死状态后,你减1点体力上限,获得1点护甲,摸三张牌。然后你获得〖英姿〗和〖英魂〗。', - sbzhiba:'制霸', - sbzhiba_info:'主公技,限定技。当你进入濒死状态时,你可以回复X-1点体力并修改〖激昂③〗为“出牌阶段限X次”(X为场上其他吴势力角色数+1)。然后其他吴势力角色依次受到1点无来源伤害,且当有角色因此死亡后,你摸三张牌。', - sb_daqiao:'谋大乔', - sbguose:'国色', - sbguose_info:'出牌阶段限两次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。', - sbguose_info_identity:'出牌阶段限四次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。', - sbliuli:'流离', - sbliuli_info:'当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内的一名不为此【杀】使用者的角色,将此【杀】转移给该角色。若你以此法弃置了♥牌,则你可以令一名不为此【杀】使用者的其他角色获得“流离”标记,且移去场上所有其他的“流离”(每回合限一次)。有“流离”的角色回合开始时,其移去其“流离”并执行一个额外的出牌阶段。', - sb_liubiao:'谋刘表', - sbzishou:'自守', - sbzishou_info:'锁定技。其他角色的结束阶段,若其与你于本局游戏内均未对对方造成过伤害,其须交给你一张牌。', - sbzongshi:'宗室', - sbzongshi_info:'锁定技。每名角色限一次。当你受到伤害后,你令伤害来源弃置所有手牌。', - sb_zhurong:'谋祝融', - sblieren:'烈刃', - sblieren_info:'当你使用【杀】指定唯一目标后,你可以摸一张牌,然后与其拼点。若你赢,此【杀】结算结束后,你可以对另一名其他角色造成1点伤害。', - sbjuxiang:'巨象', - sbjuxiang_info:'锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。③结束阶段,若你未于本回合使用过【南蛮入侵】,你可以将一张游戏外的随机【南蛮入侵】(共2张)交给一名角色。', - sb_menghuo:'谋孟获', - sbhuoshou:'祸首', - sbhuoshou_info:'锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】指定第一个目标后,你代替其成为此牌的伤害来源。③出牌阶段开始时,你随机获得弃牌堆中的一张【南蛮入侵】。④出牌阶段,若你于此阶段使用过【南蛮入侵】,你不能使用【南蛮入侵】。', - sbzaiqi:'再起', - sbzaiqi_info:'蓄力技(0/7)。①弃牌阶段结束时,你可以消耗任意点蓄力值并选择等量名角色,然后令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力。②每回合限一次。当你造成伤害后,你获得1点蓄力值。', - sb_zhanghe:'谋张郃', - sbqiaobian:'巧变', - sbqiaobian_info:'每回合限一次。①你可以失去1点体力并跳过判定阶段,将判定区的所有牌移动给一名其他角色(无法置入其判定区的牌改为弃置之)。②你可以跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力。③你可以将手牌数弃置至六张(若手牌数少于六张则跳过之)并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。', - sb_yl_luzhi:'谋卢植', - sb_yl_luzhi_prefix:'谋', - sbzhenliang:'贞良', - sbzhenliang_info:'转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。', - sb_xiaoqiao:'谋小乔', - sb_xiaoqiao_prefix:'谋', - sbtianxiang:'天香', - sbtianxiang_info_identity:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。', - sbtianxiang_info:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸X张牌(X为移去的“天香”标记数+2)。', - sb_sp_zhugeliang:'谋诸葛亮', - sb_sp_zhugeliang_prefix:'谋', - sbhuoji:'火计', - sbhuoji_info:'使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。', - sbkanpo:'看破', - sbkanpo_info:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录4个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。', - sbkanpo_info_doudizhu:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。', - sbkanpo_info_versus_two:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。', - sbguanxing:'观星', - sbguanxing_info:'①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”(X为7-此前发动〖观星①〗次数的三倍,且X至少为0)。然后你可以将任意张“星”置于牌堆顶。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。', - sbkongcheng:'空城', - sbkongcheng_info:'锁定技。当你受到伤害时,若你拥有技能〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。', - sb_huangyueying:'谋黄月英', - sb_huangyueying_prefix:'谋', - sbqicai:'奇才', - sbqicai_backup:'奇才', - sbqicai_info:'①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。', - sbqicai_info_doudizhu:'①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。', - sbjizhi:'集智', - sbjizhi_info:'锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。', - sb_guanyu:'谋关羽', - sb_guanyu_prefix:'谋', - sbwusheng:'武圣', - sbwusheng_wusheng_backup:'武圣', - sbwusheng_info:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用三张【杀】后不能对其使用【杀】。', - sbwusheng_info_identity:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸两张牌,对其使用三张【杀】后不能对其使用【杀】。', - sbyijue:'义绝', - sbyijue_info:'锁定技,每名角色每局游戏限一次,一名其他角色受到你对其造成的大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标时,此牌对其无效。', - sb_caopi:'谋曹丕', - sb_caopi_prefix:'谋', - sbxingshang:'行殇', - sbxingshang_info:'①当一名角色受到伤害后(每回合限一次)或死亡时,你获得2个“颂”标记(你至多拥有9个“颂”标记)。②出牌阶段限两次,你可以:1.移去2个“颂”标记,令一名角色复原武将牌;2.移去2个“颂”标记,令一名角色摸X张牌(X为场上阵亡角色数,且X至少为2,至多为5);3.移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限,回复1点体力,随机恢复一个已废除的装备栏;4.移去5个“颂”标记,获得一名阵亡角色武将牌上的所有技能,然后你失去〖行殇〗〖放逐〗〖颂威〗。', - sbfangzhu:'放逐', - sbfangzhu_info:'出牌阶段限一次,你可以:1.移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束;2.移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束;3.移去2个“颂”标记,令一名其他角色不能响应除其以外的角色使用的牌直到其回合结束;4.移去3个“颂”标记,令一名其他角色将武将牌翻面;5.移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束;6.移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束。', - sbsongwei:'颂威', - sbsongwei_info:'主公技。①出牌阶段开始时,你获得Y个“颂”标记(Y为场上其他魏势力角色数的两倍)。②每局游戏限一次,出牌阶段,你可以令一名其他魏势力角色失去所有武将牌的技能。', - sb_xunyu:'谋荀彧', - sb_xunyu_prefix:'谋', - sbquhu:'驱虎', - sbquhu_info:'出牌阶段限一次。你可以选择两名有牌的其他角色,你与这些角色同时将任意张牌扣置于武将牌上。若你以此法扣置的牌唯一最少,则扣置牌最多的其他角色获得你扣置的牌,且这些角色获得各自扣置的牌;否则这两名角色中扣置牌较多的角色对较少的角色造成1点伤害,获得你扣置的牌,然后这些角色将各自扣置的牌置入弃牌堆(若这两名角色扣置的牌数相同,视为与你逆时针最近座次的角色扣置牌较多)。', - sbjieming:'节命', - sbjieming_info:'当你受到伤害后,你可以令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于X,你失去1点体力(X为你已损失的体力值,至少为1)。', - sb_xiahoudun:'谋夏侯惇', - sb_xiahoudun_prefix:'谋', - sbganglie:'刚烈', - sbganglie_info:'出牌阶段,你可以选择一名本局游戏对你造成过伤害且未以此法选择过的角色,你对其造成2点伤害。', - sbqingjian:'清俭', - sbqingjian_info:'①当有一张牌不因使用而进入弃牌堆后,若你的“清俭”数小于X,你将此牌置于你的武将牌上,称为“清俭”(X为你的体力值-1,且至少为1)。②出牌阶段结束时,你将所有“清俭”分配给任意角色。', - sb_gaoshun:'谋高顺', - sb_gaoshun_prefix:'谋', - sbxianzhen:'陷阵', - sbxianzhen_info:'出牌阶段限一次。你可以选择一名其他角色,你于本阶段获得如下效果:⒈你对其使用牌无距离限制;⒉当你使用【杀】指定其为目标后,你可以与其拼点:若你赢,此【杀】无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;若其拼点牌为【杀】,则你获得之;若其拼点牌为其最后的手牌,则此【杀】对其造成伤害时,此伤害+1。', - sbjinjiu:'禁酒', - sbjinjiu_info:'锁定技。①你的【酒】均视为【杀】。②当你受到酒【杀】的伤害时,你令此伤害减至1。③其他角色不能于你的回合内使用【酒】。④当一名其他角色的拼点牌亮出后,若你为发起者或参与者且此牌为【酒】,则此牌的点数视为A。', + translate: { + sb_zhanghe_prefix: "谋", + sb_yujin_prefix: "谋", + sb_huaxiong_prefix: "谋", + liucheng_prefix: "谋", + sp_yangwan_prefix: "谋", + sb_huangzhong_prefix: "谋", + sb_lvmeng_prefix: "谋", + sb_sunshangxiang_prefix: "谋", + sb_sunquan_prefix: "谋", + sb_huanggai_prefix: "谋", + sb_zhouyu_prefix: "谋", + sb_caoren_prefix: "谋", + sb_xiahoushi_prefix: "谋", + sb_zhangjiao_prefix: "谋", + sb_caocao_prefix: "谋", + sb_zhenji_prefix: "谋", + sb_ganning_prefix: "谋", + sb_machao_prefix: "谋", + sb_xuhuang_prefix: "谋", + sb_zhangfei_prefix: "谋", + sb_zhaoyun_prefix: "谋", + sb_liubei_prefix: "谋", + sb_jiangwei_prefix: "谋", + sb_fazheng_prefix: "谋", + sb_chengong_prefix: "谋", + sb_diaochan_prefix: "谋", + sb_yuanshao_prefix: "谋", + sb_pangtong_prefix: "谋", + sb_sunce_prefix: "谋", + sb_daqiao_prefix: "谋", + sb_liubiao_prefix: "谋", + sb_zhurong_prefix: "谋", + sb_menghuo_prefix: "谋", + sp_yangwan: "谋杨婉", + spmingxuan: "瞑昡", + spmingxuan_info: + "锁定技。出牌阶段开始时,你须选择至多X张花色各不相同的手牌(X为未选择过选项一的角色),将这些牌随机交给这些角色中的等量角色。然后这些角色依次选择一项:⒈对你使用一张【杀】。⒉交给你一张牌,然后你摸一张牌。", + spxianchou: "陷仇", + spxianchou_info: + "当你受到有来源的伤害后,你可选择一名不为伤害来源的其他角色。该角色可以弃置一张牌,然后视为对伤害来源使用一张【杀】(无距离限制)。若其因此【杀】造成了伤害,则其摸一张牌,你回复1点体力。", + liucheng: "谋刘赪", + splveying: "掠影", + splveying_info: + "锁定技。①每回合限两次,当你使用【杀】指定目标后,你获得一个“椎”。②当你使用的【杀】结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【过河拆桥】。", + spyingwu: "莺舞", + spyingwu_info: + "若你拥有〖掠影〗,则:①每回合限两次,当你使用非伤害类普通锦囊牌指定目标后,你获得一个“椎”。②当你使用的非伤害类普通锦囊牌结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【杀】。", + sb_huangzhong: "谋黄忠", + sbliegong: "烈弓", + sbliegong_info: + "①若你的装备区内没有武器牌,则你手牌区内所有【杀】的属性视为无属性。②当你使用牌时,或成为其他角色使用牌的目标后,你记录此牌的花色。③当你使用【杀】指定唯一目标后,若你〖烈弓②〗的记录不为空,则你可亮出牌堆顶的X张牌(X为你〖烈弓②〗记录过的花色数-1),令此【杀】的伤害值基数+Y(Y为亮出牌中被〖烈弓②〗记录过花色的牌的数量),且目标角色不能使用〖烈弓②〗记录过花色的牌响应此【杀】。此【杀】使用结算结束后,你清除〖烈弓②〗的记录。", + sb_huaxiong: "谋华雄", + sbyangwei: "扬威", + sbyangwei_info: + "出牌阶段,你可以摸两张牌,令此技能于你的下下个结束阶段前失效,且你获得如下效果直到回合结束:使用【杀】无距离限制,次数上限+1且无视防具。", + sb_yujin: "谋于禁", + sbxiayuan: "狭援", + sbxiayuan_info: + "每轮限一次。其他角色受到伤害后,若其因此伤害触发过护甲效果且其没有护甲,则你可弃置两张手牌,令其获得X点护甲(X为其因此伤害触发护甲效果而失去的护甲数量)。", + sbjieyue: "节钺", + sbjieyue_info: "结束阶段,你可以令一名其他角色获得1点护甲。然后其可以交给你一张牌。", + sb_lvmeng: "谋吕蒙", + sbkeji: "克己", + sbkeji_info: + "①出牌阶段各限一次。你可以选择一项:1.弃置一张手牌,然后获得1点护甲;2.失去1点体力,然后获得2点护甲。②你的手牌上限+X(X为你的护甲数)。③若你不为正在结算濒死流程的角色,你不能使用【桃】。", + sbdujiang: "渡江", + sbdujiang_info: + "觉醒技。准备阶段,若你的护甲数不少于3,你获得〖夺荆〗,修改〖克己①〗为“出牌阶段限一次”。", + sbduojing: "夺荆", + sbduojing_info: + "当你使用【杀】指定目标时,你可以失去1点护甲。然后令此【杀】无视防具,你获得目标角色一张牌,本回合使用【杀】的次数上限+1。", + sb_sunshangxiang: "谋孙尚香", + sbjieyin: "结姻", + sbjieyin_info: + "使命技。①游戏开始时,你令一名其他角色获得1枚“助”。②出牌阶段开始时,有“助”的角色选择一项:1.交给你X张手牌(X=min(2,其手牌数)且至少为1),然后获得1点护甲;2.令你将“助”移动给另一名其他角色,或移去其“助”(若其此前获得过“助”,则只能移去)。③失败:当一名角色死亡后,若其于死亡时有“助”,或当你因〖结姻②〗移去“助”后,你将势力改为吴,回复1点体力,获得所有“妆”并减1点体力上限。", + sbliangzhu: "良助", + sbliangzhu_info: + "蜀势力技。出牌阶段限一次,你可以将一名其他角色装备区里的一张牌置于武将牌上,称为“妆”,然后有“助”的角色须选择回复1点体力或摸两张牌。", + sbxiaoji: "枭姬", + sbxiaoji_info: "吴势力技。当你失去装备区里的一张牌后,你摸两张牌,然后可以弃置场上的一张牌。", + sb_sunquan: "谋孙权", + sbzhiheng: "制衡", + sbzhiheng_info: + "出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你以此法弃置的牌包括你所有手牌,则你多摸X张牌(X为你的“业”数+1),并弃1枚“业”。", + sbtongye: "统业", + sbtongye_info: + "锁定技。结束阶段,你猜测场上装备牌数与你下一个准备阶段的场上装备牌数是否相等,并获得以下效果:你下一个准备阶段,若你猜对且“业”数小于2,你获得1枚“业”;若你猜错,你弃1枚“业”。", + sbjiuyuan: "救援", + sbjiuyuan_info: + "主公技,锁定技。①其他吴势力角色使用【桃】时,你摸一张牌。②其他吴势力角色对你使用的【桃】的回复量+1。", + sb_huanggai: "谋黄盖", + sbkurou: "苦肉", + sbkurou_info: + "①出牌阶段开始时,你可以交给其他角色一张牌,若此牌于对方手牌区内为【桃】或【酒】,你失去2点体力,否则你失去1点体力。②当你失去1点体力后,你获得2点护甲。", + sbzhaxiang: "诈降", + sbzhaxiang_info: + "锁定技。①摸牌阶段,你多摸X张牌。②你每回合使用的前X张牌无距离与次数限制且不能被响应(X为你已损失的体力值)。", + sb_zhouyu: "谋周瑜", + sbyingzi: "英姿", + sbyingzi_info: + "锁定技。摸牌阶段,你多摸X张牌,且令你本回合手牌上限+X(X为以下条件中你满足的项数:手牌数不小于2、体力值不小于2、装备区里的牌数不小于1)。", + sbfanjian: "反间", + sbfanjian_info: + "出牌阶段,你可以声明一个花色并选择一张牌和一名其他角色(每种花色的牌每回合限一次)。其须选择一项:1.猜测此牌花色与你所声明花色是否相同;2.翻面。然后其正面向上获得此牌。若其选择猜测且猜测错误,其失去1点体力,否则其令你〖反间〗于本回合失效。", + sb_caoren: "谋曹仁", + sbjushou: "据守", + sbjushou_info: + "①出牌阶段限一次。若你的武将牌正面朝上,你可以弃置至多两张牌,然后你翻面并获得等量护甲。②当你受到伤害后,若你的武将牌背面朝上,你选择一项:1.翻面;2.获得1点护甲。③当你翻面后,若你的武将牌正面朝上,你摸X张牌(X为你的护甲数)。", + sbjiewei: "解围", + sbjiewei_info: + "出牌阶段限一次。你可以失去1点护甲并选择一名其他角色。你观看其手牌并获得其中一张。", + sb_xiahoushi: "谋夏侯氏", + sbqiaoshi: "樵拾", + sbqiaoshi_info: + "每回合限一次。当你受到其他角色造成的伤害后,其可以令你回复等同于此次伤害值的体力,然后其摸两张牌。", + sbyanyu: "燕语", + sbyanyu_info: + "①出牌阶段限两次。你可以弃置一张【杀】,然后摸一张牌。②出牌阶段结束时,你可以令一名其他角色摸3X张牌(X为你于此阶段发动〖燕语①〗的次数)。", + sb_zhangjiao: "谋张角", + sbleiji: "雷击", + sbleiji_info: "出牌阶段,你可以选择一名其他角色并弃4枚“道兵”,对其造成1点雷电伤害。", + sbguidao: "鬼道", + sbguidao_info: + "①游戏开始时/一名角色受到属性伤害后,你获得4/2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。", + sbhuangtian: "黄天", + sbhuangtian_info: + "主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得2枚“道兵”(每轮你至多以此法获得4枚“道兵”)。", + sb_caocao: "谋曹操", + sbjianxiong: "奸雄", + sbjianxiong_info: + "①游戏开始时,你可获得至多2枚“治世”标记。②当你受到伤害后,你可获得伤害牌,摸1-X张牌(X为“治世”数),然后你可弃1枚“治世”。", + sbqingzheng: "清正", + sbqingzheng_info: + "出牌阶段开始时,你可以弃置3-X种花色的所有手牌(X为“治世”数),并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。然后若X小于2且你拥有技能〖奸雄〗,你可以获得1枚“治世”。", + sbhujia: "护驾", + sbhujia_info: "主公技,每轮限一次。当你受到伤害时,你可以将此伤害转移给一名其他魏势力角色。", + sb_zhenji: "谋甄宓", + sbluoshen: "洛神", + sbluoshen_info: + "准备阶段,你可以选择一名角色。从其开始按逆时针方向的X名其他角色依次执行(X为角色数的一半,向上取整):展示一张手牌,若此牌为黑色,你获得之且此牌不计入本回合手牌上限;若此牌为红色,其弃置之。", + sb_ganning: "谋甘宁", + sbqixi: "奇袭", + sbqixi_info: + "出牌阶段限一次。若你有手牌,你可以令一名其他角色猜测你手牌中最多的花色。若其猜对,你展示所有手牌;若其猜错,你可令其从其未选择过的花色中再次猜测,重复此流程。然后你弃置其区域内的X张牌(X为其于本次〖奇袭〗中猜错的次数)。", + sbfenwei: "奋威", + sbfenwei_info: + "限定技。①出牌阶段,你可以将至多三张牌分别置于等量名角色的武将牌上,称为“威”,然后你摸等量牌。②当一名角色成为锦囊牌的目标时,若其有“威”,你须选择:1.令其获得其“威”;2.令其移去“威”,并取消此目标。", + sb_machao: "谋马超", + sbtieji: "铁骑", + sbtieji_info: + "当你使用【杀】指定其他角色为目标后,你可以令目标角色不能响应此【杀】,且其所有非锁定技失效直到回合结束。然后你与其进行谋弈。若你赢,且你选择的选项为:“直取敌营”,则你获得其一张牌;“扰阵疲敌”,你摸两张牌。", + sb_xuhuang: "谋徐晃", + sbduanliang: "断粮", + sbduanliang_info: + "出牌阶段限一次。你可以与一名其他角色进行谋弈。若你赢,且你选择的选项为:“围城断粮”,若其判定区没有【兵粮寸断】,你将牌堆顶牌当【兵粮寸断】对其使用,否则你获得其一张牌;“擂鼓进军”,你视为对其使用一张【决斗】。", + sbshipo: "势迫", + sbshipo_info: + "结束阶段,你可以令一名体力少于你的角色或所有判定区有【兵粮寸断】的其他角色选择一项:1.交给你一张手牌;2.受到1点伤害。所有目标角色选择完成后,你可以将任意张你以此法得到的牌交给一名其他角色。", + sb_zhangfei: "谋张飞", + sbpaoxiao: "咆哮", + sbpaoxiao_info: + "锁定技。①你使用【杀】无次数限制。②若你的装备区内有武器牌,则你使用【杀】无距离限制。③当你于出牌阶段内使用第二张及以后【杀】时,你获得如下效果:{此【杀】不可被响应且伤害值基数+1;此【杀】指定目标后,目标角色的非锁定技于本回合内失效;此【杀】造成伤害后,若目标角色存活,则你失去1点体力并随机弃置一张手牌。}", + sbxieji: "协击", + sbxieji_info: + "准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你可以选择至多三名其他角色。你对这些角色视为使用一张【杀】,且当此【杀】因执行牌面效果造成伤害后,你摸X张牌(X为伤害值)。", + sb_zhaoyun: "谋赵云", + sblongdan: "龙胆", + sblongdan_info: + "蓄力技(1/3)。①你可以消耗1点蓄力值,将【杀】当做【闪】或将【闪】当做【杀】使用或打出,然后若你以此法使用牌,你摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。", + sbjizhu: "积著", + sbjizhu_info: + "准备阶段开始时,你可以和一名其他角色进行协力。其的下个结束阶段开始时,若你与其协力成功,则你修改〖龙胆〗直到你的下个结束阶段开始。", + sblongdan_shabi: "龙胆", + sblongdan_shabi_info: + "蓄力技(1/3)。①你可以消耗1点蓄力值,将一张基本牌当做任意基本牌使用或打出,然后摸一张牌。②一名角色的回合结束时,你获得1点蓄力值。", + sb_liubei: "谋刘备", + sbrende: "仁德", + sbrende_info: + "①出牌阶段每名角色限一次。你可以将任意张牌交给一名其他角色,然后你获得等量“仁望”标记(至多为8)。②每回合限一次。你可以移去2枚“仁望”,视为使用或打出一张基本牌。③出牌阶段开始时,你获得2枚“仁望”。", + sbzhangwu: "章武", + sbzhangwu_info: + "限定技。出牌阶段,你可以令所有于本局游戏成为过〖仁德①〗目标的其他角色依次交给你X张牌,然后你回复3点体力并失去〖仁德〗(X为游戏轮数-1,且至多为3)。", + sbjijiang: "激将", + sbjijiang_info: + "主公技。出牌阶段结束时,你可以选择一名体力值不小于你的其他蜀势力角色A和一名在A攻击范围内的角色B。A选择一项:1.视为对B使用一张【杀】;2.下一个出牌阶段开始前,跳过此阶段。", + sb_jiangwei: "谋姜维", + sbtiaoxin: "挑衅", + sbtiaoxin_info: + "蓄力技(4/4)。①出牌阶段限一次。你可以选择至多X名角色(X为你的蓄力值),令这些角色选择一项:1.对你使用一张【杀】(无距离限制);2.交给你一张牌。然后你消耗等同于你选择的目标数的蓄力值。②当你于弃牌阶段弃置牌后,你获得等量蓄力值。", + sbzhiji: "志继", + sbzhiji_info: + "觉醒技。准备阶段,若你因〖挑衅①〗消耗过至少4点蓄力值,你减1点体力上限,令至少一名角色获得“北伐”标记并获得如下效果直到你的下回合开始:其使用牌只能指定你或其为目标。", + sb_fazheng: "谋法正", + sbxuanhuo: "眩惑", + sbxuanhuo_info: + "①出牌阶段限一次。你可以将一张牌交给一名没有“眩”标记的其他角色,然后令其获得“眩”标记。②当有“眩”的其他角色于摸牌阶段外得到牌后,若你以此法于其本次获得“眩”的期间内得到其的牌数小于5,你随机获得其一张手牌。", + sbenyuan: "恩怨", + sbenyuan_info: + "锁定技。准备阶段,若场上存在有“眩”的角色,你移去该角色的“眩”,且你于其本次获得“眩”的期间内得到其的牌数:不小于3,你交给其三张牌;小于3,其失去1点体力,你回复1点体力。", + sb_chengong: "谋陈宫", + sbmingce: "明策", + sbmingce_info: + "①出牌阶段限一次。你可以将一张牌交给一名其他角色,其选择一项:1.失去1点体力,令你摸两张牌并获得1枚“策”;2.摸一张牌。②出牌阶段开始时,你可以移去所有“策”并对一名其他角色造成等量伤害。", + sbzhichi: "智迟", + sbzhichi_info: "锁定技。当你受到伤害后,防止你本回合受到的伤害。", + sb_yuanshao: "谋袁绍", + sbluanji: "乱击", + sbluanji_info: + "①出牌阶段限一次。你可以将两张手牌当【万箭齐发】使用。②每回合限三次,当其他角色因响应你使用的【万箭齐发】而打出【闪】时,你摸一张牌。", + sbxueyi: "血裔", + sbxueyi_info: + "主公技,锁定技。①你的手牌上限+2X(X为场上其他群势力角色数)。②每回合限两次,当你使用牌指定其他群势力角色为目标后,你摸一张牌。", + sb_diaochan: "谋貂蝉", + sblijian: "离间", + sblijian_info: + "出牌阶段限一次。你可以选择至少两名其他角色并弃置X张牌(X为你选择的角色数-1)。然后每名你选择的角色依次视为对这些角色中与其逆时针座次最近的另一名角色使用一张【决斗】。", + sbbiyue: "闭月", + sbbiyue_info: + "锁定技。结束阶段,你摸Y张牌(Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为4)。", + sb_pangtong: "谋庞统", + sblianhuan: "连环", + sblianhuan_info: + "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。", + sblianhuan_lv2: "连环·改", + sblianhuan_lv2_info: + "①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以额外指定任意名角色为目标。④当你使用【铁索连环】指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。", + sbniepan: "涅槃", + sbniepan_info: + "限定技。当你处于濒死状态时,你可以弃置区域里的所有牌,摸两张牌,将体力回复至2点,复原武将牌,然后修改〖连环〗。", + sb_sunce: "谋孙策", + sbjiang: "激昂", + sbjiang_info: + "①当你使用【决斗】或红色【杀】指定目标后,或当你成为【决斗】或红色【杀】的目标后,你摸一张牌。②当你使用【决斗】时,你可以额外指定一名目标,然后你失去1点体力。③出牌阶段限一次。你可以将所有手牌当【决斗】使用。", + sbhunzi: "魂姿", + sbhunzi_info: + "觉醒技。当你脱离濒死状态后,你减1点体力上限,获得1点护甲,摸三张牌。然后你获得〖英姿〗和〖英魂〗。", + sbzhiba: "制霸", + sbzhiba_info: + "主公技,限定技。当你进入濒死状态时,你可以回复X-1点体力并修改〖激昂③〗为“出牌阶段限X次”(X为场上其他吴势力角色数+1)。然后其他吴势力角色依次受到1点无来源伤害,且当有角色因此死亡后,你摸三张牌。", + sb_daqiao: "谋大乔", + sbguose: "国色", + sbguose_info: + "出牌阶段限两次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。", + sbguose_info_identity: + "出牌阶段限四次,你可以将一张♦牌当【乐不思蜀】使用或弃置场上一张【乐不思蜀】,然后你摸一张牌。", + sbliuli: "流离", + sbliuli_info: + "当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内的一名不为此【杀】使用者的角色,将此【杀】转移给该角色。若你以此法弃置了♥牌,则你可以令一名不为此【杀】使用者的其他角色获得“流离”标记,且移去场上所有其他的“流离”(每回合限一次)。有“流离”的角色回合开始时,其移去其“流离”并执行一个额外的出牌阶段。", + sb_liubiao: "谋刘表", + sbzishou: "自守", + sbzishou_info: + "锁定技。其他角色的结束阶段,若其与你于本局游戏内均未对对方造成过伤害,其须交给你一张牌。", + sbzongshi: "宗室", + sbzongshi_info: "锁定技。每名角色限一次。当你受到伤害后,你令伤害来源弃置所有手牌。", + sb_zhurong: "谋祝融", + sblieren: "烈刃", + sblieren_info: + "当你使用【杀】指定唯一目标后,你可以摸一张牌,然后与其拼点。若你赢,此【杀】结算结束后,你可以对另一名其他角色造成1点伤害。", + sbjuxiang: "巨象", + sbjuxiang_info: + "锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。③结束阶段,若你未于本回合使用过【南蛮入侵】,你可以将一张游戏外的随机【南蛮入侵】(共2张)交给一名角色。", + sb_menghuo: "谋孟获", + sbhuoshou: "祸首", + sbhuoshou_info: + "锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】指定第一个目标后,你代替其成为此牌的伤害来源。③出牌阶段开始时,你随机获得弃牌堆中的一张【南蛮入侵】。④出牌阶段,若你于此阶段使用过【南蛮入侵】,你不能使用【南蛮入侵】。", + sbzaiqi: "再起", + sbzaiqi_info: + "蓄力技(0/7)。①弃牌阶段结束时,你可以消耗任意点蓄力值并选择等量名角色,然后令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力。②每回合限一次。当你造成伤害后,你获得1点蓄力值。", + sb_zhanghe: "谋张郃", + sbqiaobian: "巧变", + sbqiaobian_info: + "每回合限一次。①你可以失去1点体力并跳过判定阶段,将判定区的所有牌移动给一名其他角色(无法置入其判定区的牌改为弃置之)。②你可以跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力。③你可以将手牌数弃置至六张(若手牌数少于六张则跳过之)并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。", + sb_yl_luzhi: "谋卢植", + sb_yl_luzhi_prefix: "谋", + sbzhenliang: "贞良", + sbzhenliang_info: + "转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸两张牌。", + sb_xiaoqiao: "谋小乔", + sb_xiaoqiao_prefix: "谋", + sbtianxiang: "天香", + sbtianxiang_info_identity: + "①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。", + sbtianxiang_info: + "①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸X张牌(X为移去的“天香”标记数+2)。", + sb_sp_zhugeliang: "谋诸葛亮", + sb_sp_zhugeliang_prefix: "谋", + sbhuoji: "火计", + sbhuoji_info: + "使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。", + sbkanpo: "看破", + sbkanpo_info: + "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录4个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", + sbkanpo_info_doudizhu: + "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", + sbkanpo_info_versus_two: + "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", + sbguanxing: "观星", + sbguanxing_info: + "①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”(X为7-此前发动〖观星①〗次数的三倍,且X至少为0)。然后你可以将任意张“星”置于牌堆顶。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。", + sbkongcheng: "空城", + sbkongcheng_info: + "锁定技。当你受到伤害时,若你拥有技能〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。", + sb_huangyueying: "谋黄月英", + sb_huangyueying_prefix: "谋", + sbqicai: "奇才", + sbqicai_backup: "奇才", + sbqicai_info: + "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", + sbqicai_info_doudizhu: + "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", + sbjizhi: "集智", + sbjizhi_info: "锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。", + sb_guanyu: "谋关羽", + sb_guanyu_prefix: "谋", + sbwusheng: "武圣", + sbwusheng_wusheng_backup: "武圣", + sbwusheng_info: + "你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用三张【杀】后不能对其使用【杀】。", + sbwusheng_info_identity: + "你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸两张牌,对其使用三张【杀】后不能对其使用【杀】。", + sbyijue: "义绝", + sbyijue_info: + "锁定技,每名角色每局游戏限一次,一名其他角色受到你对其造成的大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标时,此牌对其无效。", + sb_caopi: "谋曹丕", + sb_caopi_prefix: "谋", + sbxingshang: "行殇", + sbxingshang_info: + "①当一名角色受到伤害后(每回合限一次)或死亡时,你获得2个“颂”标记(你至多拥有9个“颂”标记)。②出牌阶段限两次,你可以:1.移去2个“颂”标记,令一名角色复原武将牌;2.移去2个“颂”标记,令一名角色摸X张牌(X为场上阵亡角色数,且X至少为2,至多为5);3.移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限,回复1点体力,随机恢复一个已废除的装备栏;4.移去5个“颂”标记,获得一名阵亡角色武将牌上的所有技能,然后你失去〖行殇〗〖放逐〗〖颂威〗。", + sbfangzhu: "放逐", + sbfangzhu_info: + "出牌阶段限一次,你可以:1.移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束;2.移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束;3.移去2个“颂”标记,令一名其他角色不能响应除其以外的角色使用的牌直到其回合结束;4.移去3个“颂”标记,令一名其他角色将武将牌翻面;5.移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束;6.移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束。", + sbsongwei: "颂威", + sbsongwei_info: + "主公技。①出牌阶段开始时,你获得Y个“颂”标记(Y为场上其他魏势力角色数的两倍)。②每局游戏限一次,出牌阶段,你可以令一名其他魏势力角色失去所有武将牌的技能。", + sb_xunyu: "谋荀彧", + sb_xunyu_prefix: "谋", + sbquhu: "驱虎", + sbquhu_info: + "出牌阶段限一次。你可以选择两名有牌的其他角色,你与这些角色同时将任意张牌扣置于武将牌上。若你以此法扣置的牌唯一最少,则扣置牌最多的其他角色获得你扣置的牌,且这些角色获得各自扣置的牌;否则这两名角色中扣置牌较多的角色对较少的角色造成1点伤害,获得你扣置的牌,然后这些角色将各自扣置的牌置入弃牌堆(若这两名角色扣置的牌数相同,视为与你逆时针最近座次的角色扣置牌较多)。", + sbjieming: "节命", + sbjieming_info: + "当你受到伤害后,你可以令一名角色摸三张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于X,你失去1点体力(X为你已损失的体力值,至少为1)。", + sb_xiahoudun: "谋夏侯惇", + sb_xiahoudun_prefix: "谋", + sbganglie: "刚烈", + sbganglie_info: + "出牌阶段,你可以选择一名本局游戏对你造成过伤害且未以此法选择过的角色,你对其造成2点伤害。", + sbqingjian: "清俭", + sbqingjian_info: + "①当有一张牌不因使用而进入弃牌堆后,若你的“清俭”数小于X,你将此牌置于你的武将牌上,称为“清俭”(X为你的体力值-1,且至少为1)。②出牌阶段结束时,你将所有“清俭”分配给任意角色。", + sb_gaoshun: "谋高顺", + sb_gaoshun_prefix: "谋", + sbxianzhen: "陷阵", + sbxianzhen_info: + "出牌阶段限一次。你可以选择一名其他角色,你于本阶段获得如下效果:⒈你对其使用牌无距离限制;⒉当你使用【杀】指定其为目标后,你可以与其拼点:若你赢,此【杀】无视防具且不计入次数,且若你本回合未以此法造成过伤害,你对其造成1点伤害;若其拼点牌为【杀】,则你获得之;若其拼点牌为其最后的手牌,则此【杀】对其造成伤害时,此伤害+1。", + sbjinjiu: "禁酒", + sbjinjiu_info: + "锁定技。①你的【酒】均视为【杀】。②当你受到酒【杀】的伤害时,你令此伤害减至1。③其他角色不能于你的回合内使用【酒】。④当一名其他角色的拼点牌亮出后,若你为发起者或参与者且此牌为【酒】,则此牌的点数视为A。", - sb_zhi:'谋攻篇·知', - sb_shi:'谋攻篇·识', - sb_tong:'谋攻篇·同', - sb_yu:'谋攻篇·虞', - sb_neng:'谋攻篇·能', - sb_waitforsort:'等待分包', + sb_zhi: "谋攻篇·知", + sb_shi: "谋攻篇·识", + sb_tong: "谋攻篇·同", + sb_yu: "谋攻篇·虞", + sb_neng: "谋攻篇·能", + sb_waitforsort: "等待分包", }, }; }); diff --git a/character/shenhua.js b/character/shenhua.js index 985ba3893..147788eaf 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -1,2082 +1,2544 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'shenhua', - connect:true, - characterSort:{ - shenhua:{ - shenhua_feng:["sp_zhangjiao","re_yuji","old_zhoutai","old_caoren","re_xiahouyuan","xiaoqiao","re_huangzhong","re_weiyan"], - shenhua_huo:['dianwei','xunyu','pangtong','sp_zhugeliang','taishici','yanwen','re_yuanshao','re_pangde'], - shenhua_lin:['caopi','re_xuhuang','menghuo','zhurong','re_lusu','sunjian','dongzhuo','jiaxu'], - shenhua_shan:['dengai','zhanghe','liushan','jiangwei','zhangzhang','sunce','caiwenji','zuoci'], - shenhua_yin:['wangji','kuailiangkuaiyue','yanyan','wangping','sunliang','luji','xuyou','yl_luzhi'], - shenhua_lei:['haozhao','guanqiujian','chendao','zhugezhan','lukang','zhoufei','zhangxiu','yl_yuanshu'], + name: "shenhua", + connect: true, + characterSort: { + shenhua: { + shenhua_feng: [ + "sp_zhangjiao", + "re_yuji", + "old_zhoutai", + "old_caoren", + "re_xiahouyuan", + "xiaoqiao", + "re_huangzhong", + "re_weiyan", + ], + shenhua_huo: [ + "dianwei", + "xunyu", + "pangtong", + "sp_zhugeliang", + "taishici", + "yanwen", + "re_yuanshao", + "re_pangde", + ], + shenhua_lin: [ + "caopi", + "re_xuhuang", + "menghuo", + "zhurong", + "re_lusu", + "sunjian", + "dongzhuo", + "jiaxu", + ], + shenhua_shan: [ + "dengai", + "zhanghe", + "liushan", + "jiangwei", + "zhangzhang", + "sunce", + "caiwenji", + "zuoci", + ], + shenhua_yin: [ + "wangji", + "kuailiangkuaiyue", + "yanyan", + "wangping", + "sunliang", + "luji", + "xuyou", + "yl_luzhi", + ], + shenhua_lei: [ + "haozhao", + "guanqiujian", + "chendao", + "zhugezhan", + "lukang", + "zhoufei", + "zhangxiu", + "yl_yuanshu", + ], }, }, - character:{ - re_huangzhong:['male','shu',4,['xinliegong']], - old_zhoutai:['male','wu',4,['gzbuqu']], - old_caoren:['male','wei',4,['jushou']], - re_xuhuang:['male','wei',4,['duanliang','jiezi']], - re_pangde:['male','qun',4,['mashu','jianchu']], - re_xiahouyuan:['male','wei',4,['xinshensu']], - re_weiyan:['male','shu',4,['xinkuanggu','qimou']], - xiaoqiao:['female','wu',3,['retianxiang','hongyan']], - sp_zhangjiao:['male','qun',3,['releiji','guidao','huangtian'],['zhu']], - re_yuji:["male","qun",3,["xinfu_guhuo"]], + character: { + re_huangzhong: ["male", "shu", 4, ["xinliegong"]], + old_zhoutai: ["male", "wu", 4, ["gzbuqu"]], + old_caoren: ["male", "wei", 4, ["jushou"]], + re_xuhuang: ["male", "wei", 4, ["duanliang", "jiezi"]], + re_pangde: ["male", "qun", 4, ["mashu", "jianchu"]], + re_xiahouyuan: ["male", "wei", 4, ["xinshensu"]], + re_weiyan: ["male", "shu", 4, ["xinkuanggu", "qimou"]], + xiaoqiao: ["female", "wu", 3, ["retianxiang", "hongyan"]], + sp_zhangjiao: ["male", "qun", 3, ["releiji", "guidao", "huangtian"], ["zhu"]], + re_yuji: ["male", "qun", 3, ["xinfu_guhuo"]], // yuji:['male','qun',3,['guhuo']], // xin_yuji:['male','qun',3,['guhuo']], - sp_zhugeliang:['male','shu',3,['bazhen','huoji','kanpo']], - pangtong:['male','shu',3,['lianhuan','oldniepan']], - xunyu:['male','wei',3,['quhu','jieming'],['clan:颍川荀氏']], - dianwei:['male','wei',4,['qiangxix']], - taishici:['male','wu',4,['tianyi']], - yanwen:['male','qun',4,['shuangxiong']], - re_yuanshao:['male','qun',4,['luanji','xueyi'],['zhu']], + sp_zhugeliang: ["male", "shu", 3, ["bazhen", "huoji", "kanpo"]], + pangtong: ["male", "shu", 3, ["lianhuan", "oldniepan"]], + xunyu: ["male", "wei", 3, ["quhu", "jieming"], ["clan:颍川荀氏"]], + dianwei: ["male", "wei", 4, ["qiangxix"]], + taishici: ["male", "wu", 4, ["tianyi"]], + yanwen: ["male", "qun", 4, ["shuangxiong"]], + re_yuanshao: ["male", "qun", 4, ["luanji", "xueyi"], ["zhu"]], - menghuo:['male','shu',4,['huoshou','zaiqixx']], - zhurong:['female','shu',4,['juxiang','lieren']], - caopi:['male','wei',3,['xingshang','fangzhu','songwei'],['zhu']], - re_lusu:['male','wu',3,['haoshi','dimeng']], - sunjian:['male','wu',4,['gzyinghun']], - dongzhuo:['male','qun',8,['jiuchi','roulin','benghuai','baonue'],['zhu']], - jiaxu:['male','qun',3,['luanwu','wansha','weimu']], + menghuo: ["male", "shu", 4, ["huoshou", "zaiqixx"]], + zhurong: ["female", "shu", 4, ["juxiang", "lieren"]], + caopi: ["male", "wei", 3, ["xingshang", "fangzhu", "songwei"], ["zhu"]], + re_lusu: ["male", "wu", 3, ["haoshi", "dimeng"]], + sunjian: ["male", "wu", 4, ["gzyinghun"]], + dongzhuo: ["male", "qun", 8, ["jiuchi", "roulin", "benghuai", "baonue"], ["zhu"]], + jiaxu: ["male", "qun", 3, ["luanwu", "wansha", "weimu"]], - jiangwei:['male','shu',4,['tiaoxin','zhiji']], - liushan:['male','shu',3,['xiangle','fangquan','ruoyu'],['zhu']], - zhanghe:['male','wei',4,['qiaobian']], - dengai:['male','wei',4,['tuntian','zaoxian']], - sunce:['male','wu',4,['jiang','hunzi','zhiba'],['zhu']], - zhangzhang:['male','wu',3,['zhijian','guzheng']], - caiwenji:['female','qun',3,['beige','duanchang']], - zuoci:['male','qun',3,['huashen','xinsheng']], + jiangwei: ["male", "shu", 4, ["tiaoxin", "zhiji"]], + liushan: ["male", "shu", 3, ["xiangle", "fangquan", "ruoyu"], ["zhu"]], + zhanghe: ["male", "wei", 4, ["qiaobian"]], + dengai: ["male", "wei", 4, ["tuntian", "zaoxian"]], + sunce: ["male", "wu", 4, ["jiang", "hunzi", "zhiba"], ["zhu"]], + zhangzhang: ["male", "wu", 3, ["zhijian", "guzheng"]], + caiwenji: ["female", "qun", 3, ["beige", "duanchang"]], + zuoci: ["male", "qun", 3, ["huashen", "xinsheng"]], - wangji:['male','wei',3,['qizhi','jinqu']], - "yanyan":["male","shu",4,["nzry_juzhan"],[]], - "wangping":["male","shu",4,["nzry_feijun","nzry_binglve"],[]], - "luji":["male","wu",3,["nzry_huaiju","nzry_yili","nzry_zhenglun"],[]], - "sunliang":["male","wu",3,["nzry_kuizhu","nzry_zhizheng","nzry_lijun"],['zhu']], - xuyou:["male","qun",3,["nzry_chenglve","nzry_shicai","nzry_cunmu"]], - "yl_luzhi":["male","qun",3,["nzry_mingren","nzry_zhenliang"],["die_audio"]], - "kuailiangkuaiyue":["male","wei",3,["nzry_jianxiang","nzry_shenshi"],[]], + wangji: ["male", "wei", 3, ["qizhi", "jinqu"]], + yanyan: ["male", "shu", 4, ["nzry_juzhan"], []], + wangping: ["male", "shu", 4, ["nzry_feijun", "nzry_binglve"], []], + luji: ["male", "wu", 3, ["nzry_huaiju", "nzry_yili", "nzry_zhenglun"], []], + sunliang: ["male", "wu", 3, ["nzry_kuizhu", "nzry_zhizheng", "nzry_lijun"], ["zhu"]], + xuyou: ["male", "qun", 3, ["nzry_chenglve", "nzry_shicai", "nzry_cunmu"]], + yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "nzry_zhenliang"], ["die_audio"]], + kuailiangkuaiyue: ["male", "wei", 3, ["nzry_jianxiang", "nzry_shenshi"], []], - guanqiujian:['male','wei',4,['zhengrong','hongju']], - "haozhao":["male","wei",4,["drlt_zhenggu"],[]], - "zhugezhan":["male","shu",3,["xinfu_zuilun","xinfu_fuyin"],[]], - "lukang":["male","wu",4,["drlt_qianjie","drlt_jueyan","drlt_poshi"],[]], - "yl_yuanshu":["male","qun",4,["drlt_yongsi","drlt_weidi"],["zhu"]], - "zhangxiu":["male","qun",4,["drlt_xiongluan","drlt_congjian",'twjuxiang'],['zhu']], - "chendao":["male","shu",4,["dcwanglie"],[]], - zhoufei:["female","wu",3,["olliangyin","olkongsheng"]], + guanqiujian: ["male", "wei", 4, ["zhengrong", "hongju"]], + haozhao: ["male", "wei", 4, ["drlt_zhenggu"], []], + zhugezhan: ["male", "shu", 3, ["xinfu_zuilun", "xinfu_fuyin"], []], + lukang: ["male", "wu", 4, ["drlt_qianjie", "drlt_jueyan", "drlt_poshi"], []], + yl_yuanshu: ["male", "qun", 4, ["drlt_yongsi", "drlt_weidi"], ["zhu"]], + zhangxiu: ["male", "qun", 4, ["drlt_xiongluan", "drlt_congjian", "twjuxiang"], ["zhu"]], + chendao: ["male", "shu", 4, ["dcwanglie"], []], + zhoufei: ["female", "wu", 3, ["olliangyin", "olkongsheng"]], }, - perfectPair:{ - jiaxu:['liqueguosi'], - re_yuanshao:['yanwen','tianfeng'], - menghuo:['zhurong'], - sp_zhugeliang:['pangtong','huangyueying'], - sunce:['zhouyu','taishici','daqiao'], - zuoci:['yuji'], - xunyu:['xunyou'], - lukang:['luxun'], - yuanshu:['jiling'], - zhangxiu:['jiaxu'], - wangping:['jiangfei'], - jiangwei:['xiahouba'], - guanqiujian:['wenqin'], + perfectPair: { + jiaxu: ["liqueguosi"], + re_yuanshao: ["yanwen", "tianfeng"], + menghuo: ["zhurong"], + sp_zhugeliang: ["pangtong", "huangyueying"], + sunce: ["zhouyu", "taishici", "daqiao"], + zuoci: ["yuji"], + xunyu: ["xunyou"], + lukang: ["luxun"], + yuanshu: ["jiling"], + zhangxiu: ["jiaxu"], + wangping: ["jiangfei"], + jiangwei: ["xiahouba"], + guanqiujian: ["wenqin"], }, - characterFilter:{ - zuoci:function(mode){ - return mode!='guozhan'; - } + characterFilter: { + zuoci: function (mode) { + return mode != "guozhan"; + }, }, - characterIntro:{ - huangzhong:'字汉升,今河南南阳人。汉末三国时期蜀汉名将。本为刘表部下中郎将,后归刘备,并助刘备攻益州刘璋,在定军山一战中阵斩曹操部下名将夏侯渊。备称汉中王后改封后将军,赐关内侯。', - weiyan:'字文长,义阳人。三国时期蜀汉名将,诸葛亮死后,魏延因被陷害谋反而遭杨仪一党所杀。', - xiahouyuan:'字妙才,沛国谯人。东汉末年曹操部下名将,夏侯惇之族弟,八虎骑之一。群雄征讨董卓时随曹操一同起兵,后征战四方,屡立功勋。在平定马超叛乱后负责西北防线的镇守。公元219年刘备攻打汉中,被刘备部将黄忠所杀。', - caoren:'字子孝,沛国谯人,曹操的从弟。三国时期曹魏名将,官至大司马。谥曰忠侯。', - xiaoqiao:'庐江皖县人也。父桥国老德尊于时。小乔国色流离,资貌绝伦。建安三年,周瑜协策攻皖,拔之。娶小乔为妻。后人谓英雄美女,天作之合。', - zhoutai:'字幼平,九江下蔡人,三国时期吴国武将。早年与蒋钦随孙策左右,立过数次战功。孙策讨伐六县山贼时,周泰胆气绝伦,保卫孙权,勇战退敌,身受十二处伤。有诗云:三番救主出重围,忠勇如公世所稀。遍体疮痍犹痛饮,血痕残酒满征衣。', - yuji:'自号太平道人,琅琊人,在吴郡、会稽一带为百姓治病,甚得人心。孙策怒之,以惑人心为由斩之,后策常受吉咒而亡。', - zhangjiao:'乱世的开始,黄巾起义军首领,太平道创始人。张角早年信奉黄老学说,对在汉代十分流行的谶纬之学也深有研究,对民间医术 、巫术也很熟悉。', - dianwei:'己吾城村人。东汉末年曹魏猛将。擅使大双戟,为人壮猛任侠,曾为乡人刘氏报仇,杀人出市,人莫敢近。相貌魁梧,膂力过人。建安二年(197),张绣背叛曹操,典韦为保护曹操而独挡叛军,击杀多人,但最终因寡不敌众而战死。', - xunyu:'荀彧,字文若,颍川颍阴(今河南许昌)人。东汉末年曹操帐下首席谋臣,杰出的战略家。自小被世人称作“王佐之才”。', - pangtong:'庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。', - sp_zhugeliang:'字孔明,号卧龙居士,琅琊阳都人。刘备曾“三顾茅庐”得见卧龙。卧龙以一篇《隆中对》分析天下形势,提出先取荆州,再取益州成鼎足之势的说法。《三国演义》中的诸葛亮善用“火攻”,曾用火攻战术赢得多场战役,如“火烧赤壁”、“火烧博望坡”、“火烧藤甲兵”等。', - taishici:'太史慈,字子义,东莱黄县(今山东龙口东黄城集)人。东汉末年武将,守言应诺,恪遵信义,始终如一,弭息诽论。官至建昌都尉。弓马熟练,箭法精良。原为刘繇部下,后被孙策收降,于赤壁之战前病逝,死时才四十一岁。', - pangde:'字令明,东汉末年雍州南安郡狟道县(今甘肃天水市武山县四门镇)人。曹操部下重要将领。官至立义将军,拜关门亭侯。谥曰壮侯。有一子庞会。', - yanwen:'东汉末年河北袁绍部下武将,素有威名。颜良与文丑一起作为袁绍军队的勇将而闻名。建安四年(199),袁绍以颜良、文丑为将,率精卒十万,准备攻许都;次年,兵进黎阳,遣颜良攻白马。终均亡于关羽刀下。', - yuanshao:'字本初,汉族,汝南汝阳人,出身名门望族,自曾祖父起四代有五人位居三公,自己也居三公之上,其家族也因此有“四世三公”之称。曾于初平元年被推举为反董卓联合军的盟主,联军瓦解后,在汉末群雄割据的过程中,袁绍先占据冀州,又先后夺青、并二州,并于建安四年击败了割据幽州的军阀公孙瓒,势力达到顶点;但在建安五年的官渡之战中败于曹操。在平定冀州叛乱之后,于建安七年病死。', - xuhuang:'字公明,河东杨人。三国时期曹魏名将,本为杨奉帐下骑都尉,杨奉被曹操击败后转投曹操,在曹操手下多立功勋,参与官渡、赤壁、关中征伐、汉中征伐等几次重大战役。', - caopi:'字子桓,三国时期著名的政治家、文学家,曹魏的开国皇帝,公元220-226年在位。沛国谯人,魏武帝曹操与武宣卞皇后的长子。去世后庙号高祖,谥为文皇帝,葬于首阳陵。', - sunjian:'字文台,汉族,吴郡富春人。东汉末期地方军阀,著名将领。史书说他“容貌不凡,性阔达,好奇节”,是大军事家孙武的后裔。汉末群雄之一,三国中吴国的奠基人。孙权建国后,追谥孙坚为武烈皇帝。', - dongzhuo:'字仲颖,陇西临洮人。东汉末年少帝、献帝时权臣,西凉军阀。官至太师、郿侯。其为人残忍嗜杀,倒行逆施,招致群雄联合讨伐,但联合军在董卓迁都长安不久后瓦解。后被其亲信吕布所杀。', - zhurong:'据传为火神祝融氏后裔,南蛮王孟获之妻。武艺超群,善使飞刀,是《三国演义》中写到的唯一真正上过战场的女性。曾与孟获一起抵抗蜀军,在诸葛亮七擒七纵孟获之后,随孟获投降蜀汉。', - menghuo:'中国三国时期南中少数族首领。系东汉末益州建宁郡( 今云南晋宁东 )大姓,身材肥硕。生卒年不详。官至御史中丞。曾被诸葛亮七擒七纵,传为佳话。', - jiaxu:'字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。', - lusu:'字子敬,汉族,临淮东城人,中国东汉末年东吴的著名军事统帅。他曾为孙权提出鼎足江东的战略规划,因此得到孙权的赏识,于周瑜死后代替周瑜领兵,守陆口。曾单刀赴会关羽于荆州。', - zhanghe:'字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。', - dengai:'字士载,义阳棘阳人。三国时期魏国杰出的军事家、将领。公元263年他与钟会分别率军攻打蜀汉,最后他率先进入成都,使得蜀汉灭亡。后因遭到钟会的污蔑和陷害,被司马昭猜忌而被收押,最后与其子邓忠一起被卫瓘派遣的武将田续所杀害。', - jiangwei:'字伯约,天水冀人。三国时期蜀汉著名将领、军事统帅。原为曹魏天水郡的中郎将,后降蜀汉,官至凉州刺史、大将军。诸葛亮去世后继承诸葛亮的遗志,继续率领蜀汉军队北伐曹魏,与曹魏名将陈泰、郭淮、邓艾等多次交手。', - liushan:'蜀汉后主,字公嗣。小名阿斗。刘备之子,母亲是昭烈皇后甘氏。三国时期蜀汉第二位皇帝,公元223-263年在位。公元263年蜀汉被曹魏所灭,刘禅投降曹魏,被封为安乐公。', - sunce:'字伯符,吴郡富春人。孙坚长子,孙权长兄。东汉末年割据江东一带的军阀,汉末群雄之一,三国时期吴国的奠基者。三国演义中绰号“小霸王”,统一江东。在一次狩猎中为刺客所伤,不久后身亡,年仅二十六岁。其弟孙权接掌孙策势力,并于称帝后,追谥孙策为长沙桓王。', - zhangzhang:'张昭,字子布,彭城人,三国时期吴国重臣,善丹青。拜辅吴将军,班亚三司,改封娄侯。年八十一卒,谥曰文侯。张纮,字子纲,广陵人。东吴谋士,和张昭一起合称“二张”。孙策平定江东时亲自登门邀请,张纮遂出仕为官。张纮后来建议孙权迁都秣陵,孙权正在准备时张纮病逝,其年六十岁。孙权为之流涕。', - zuoci:'左慈,字元放,东汉末方士,汉族,庐江(今安徽庐江西南)人。在道教历史上,东汉时期的丹鼎派道术是从他一脉相传。', - caiwenji:'名琰,原字昭姬,晋时避司马昭讳,改字文姬,东汉末年陈留圉(今河南开封杞县)人,东汉大文学家蔡邕的女儿,是中国历史上著名的才女和文学家,精于天文数理,既博学能文,又善诗赋,兼长辩才与音律。代表作有《胡笳十八拍》、《悲愤诗》等 。', + characterIntro: { + huangzhong: + "字汉升,今河南南阳人。汉末三国时期蜀汉名将。本为刘表部下中郎将,后归刘备,并助刘备攻益州刘璋,在定军山一战中阵斩曹操部下名将夏侯渊。备称汉中王后改封后将军,赐关内侯。", + weiyan: "字文长,义阳人。三国时期蜀汉名将,诸葛亮死后,魏延因被陷害谋反而遭杨仪一党所杀。", + xiahouyuan: + "字妙才,沛国谯人。东汉末年曹操部下名将,夏侯惇之族弟,八虎骑之一。群雄征讨董卓时随曹操一同起兵,后征战四方,屡立功勋。在平定马超叛乱后负责西北防线的镇守。公元219年刘备攻打汉中,被刘备部将黄忠所杀。", + caoren: "字子孝,沛国谯人,曹操的从弟。三国时期曹魏名将,官至大司马。谥曰忠侯。", + xiaoqiao: + "庐江皖县人也。父桥国老德尊于时。小乔国色流离,资貌绝伦。建安三年,周瑜协策攻皖,拔之。娶小乔为妻。后人谓英雄美女,天作之合。", + zhoutai: + "字幼平,九江下蔡人,三国时期吴国武将。早年与蒋钦随孙策左右,立过数次战功。孙策讨伐六县山贼时,周泰胆气绝伦,保卫孙权,勇战退敌,身受十二处伤。有诗云:三番救主出重围,忠勇如公世所稀。遍体疮痍犹痛饮,血痕残酒满征衣。", + yuji: "自号太平道人,琅琊人,在吴郡、会稽一带为百姓治病,甚得人心。孙策怒之,以惑人心为由斩之,后策常受吉咒而亡。", + zhangjiao: + "乱世的开始,黄巾起义军首领,太平道创始人。张角早年信奉黄老学说,对在汉代十分流行的谶纬之学也深有研究,对民间医术 、巫术也很熟悉。", + dianwei: + "己吾城村人。东汉末年曹魏猛将。擅使大双戟,为人壮猛任侠,曾为乡人刘氏报仇,杀人出市,人莫敢近。相貌魁梧,膂力过人。建安二年(197),张绣背叛曹操,典韦为保护曹操而独挡叛军,击杀多人,但最终因寡不敌众而战死。", + xunyu: "荀彧,字文若,颍川颍阴(今河南许昌)人。东汉末年曹操帐下首席谋臣,杰出的战略家。自小被世人称作“王佐之才”。", + pangtong: + "庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。", + sp_zhugeliang: + "字孔明,号卧龙居士,琅琊阳都人。刘备曾“三顾茅庐”得见卧龙。卧龙以一篇《隆中对》分析天下形势,提出先取荆州,再取益州成鼎足之势的说法。《三国演义》中的诸葛亮善用“火攻”,曾用火攻战术赢得多场战役,如“火烧赤壁”、“火烧博望坡”、“火烧藤甲兵”等。", + taishici: + "太史慈,字子义,东莱黄县(今山东龙口东黄城集)人。东汉末年武将,守言应诺,恪遵信义,始终如一,弭息诽论。官至建昌都尉。弓马熟练,箭法精良。原为刘繇部下,后被孙策收降,于赤壁之战前病逝,死时才四十一岁。", + pangde: "字令明,东汉末年雍州南安郡狟道县(今甘肃天水市武山县四门镇)人。曹操部下重要将领。官至立义将军,拜关门亭侯。谥曰壮侯。有一子庞会。", + yanwen: "东汉末年河北袁绍部下武将,素有威名。颜良与文丑一起作为袁绍军队的勇将而闻名。建安四年(199),袁绍以颜良、文丑为将,率精卒十万,准备攻许都;次年,兵进黎阳,遣颜良攻白马。终均亡于关羽刀下。", + yuanshao: + "字本初,汉族,汝南汝阳人,出身名门望族,自曾祖父起四代有五人位居三公,自己也居三公之上,其家族也因此有“四世三公”之称。曾于初平元年被推举为反董卓联合军的盟主,联军瓦解后,在汉末群雄割据的过程中,袁绍先占据冀州,又先后夺青、并二州,并于建安四年击败了割据幽州的军阀公孙瓒,势力达到顶点;但在建安五年的官渡之战中败于曹操。在平定冀州叛乱之后,于建安七年病死。", + xuhuang: + "字公明,河东杨人。三国时期曹魏名将,本为杨奉帐下骑都尉,杨奉被曹操击败后转投曹操,在曹操手下多立功勋,参与官渡、赤壁、关中征伐、汉中征伐等几次重大战役。", + caopi: "字子桓,三国时期著名的政治家、文学家,曹魏的开国皇帝,公元220-226年在位。沛国谯人,魏武帝曹操与武宣卞皇后的长子。去世后庙号高祖,谥为文皇帝,葬于首阳陵。", + sunjian: + "字文台,汉族,吴郡富春人。东汉末期地方军阀,著名将领。史书说他“容貌不凡,性阔达,好奇节”,是大军事家孙武的后裔。汉末群雄之一,三国中吴国的奠基人。孙权建国后,追谥孙坚为武烈皇帝。", + dongzhuo: + "字仲颖,陇西临洮人。东汉末年少帝、献帝时权臣,西凉军阀。官至太师、郿侯。其为人残忍嗜杀,倒行逆施,招致群雄联合讨伐,但联合军在董卓迁都长安不久后瓦解。后被其亲信吕布所杀。", + zhurong: + "据传为火神祝融氏后裔,南蛮王孟获之妻。武艺超群,善使飞刀,是《三国演义》中写到的唯一真正上过战场的女性。曾与孟获一起抵抗蜀军,在诸葛亮七擒七纵孟获之后,随孟获投降蜀汉。", + menghuo: + "中国三国时期南中少数族首领。系东汉末益州建宁郡( 今云南晋宁东 )大姓,身材肥硕。生卒年不详。官至御史中丞。曾被诸葛亮七擒七纵,传为佳话。", + jiaxu: "字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。", + lusu: "字子敬,汉族,临淮东城人,中国东汉末年东吴的著名军事统帅。他曾为孙权提出鼎足江东的战略规划,因此得到孙权的赏识,于周瑜死后代替周瑜领兵,守陆口。曾单刀赴会关羽于荆州。", + zhanghe: + "字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。", + dengai: "字士载,义阳棘阳人。三国时期魏国杰出的军事家、将领。公元263年他与钟会分别率军攻打蜀汉,最后他率先进入成都,使得蜀汉灭亡。后因遭到钟会的污蔑和陷害,被司马昭猜忌而被收押,最后与其子邓忠一起被卫瓘派遣的武将田续所杀害。", + jiangwei: + "字伯约,天水冀人。三国时期蜀汉著名将领、军事统帅。原为曹魏天水郡的中郎将,后降蜀汉,官至凉州刺史、大将军。诸葛亮去世后继承诸葛亮的遗志,继续率领蜀汉军队北伐曹魏,与曹魏名将陈泰、郭淮、邓艾等多次交手。", + liushan: + "蜀汉后主,字公嗣。小名阿斗。刘备之子,母亲是昭烈皇后甘氏。三国时期蜀汉第二位皇帝,公元223-263年在位。公元263年蜀汉被曹魏所灭,刘禅投降曹魏,被封为安乐公。", + sunce: "字伯符,吴郡富春人。孙坚长子,孙权长兄。东汉末年割据江东一带的军阀,汉末群雄之一,三国时期吴国的奠基者。三国演义中绰号“小霸王”,统一江东。在一次狩猎中为刺客所伤,不久后身亡,年仅二十六岁。其弟孙权接掌孙策势力,并于称帝后,追谥孙策为长沙桓王。", + zhangzhang: + "张昭,字子布,彭城人,三国时期吴国重臣,善丹青。拜辅吴将军,班亚三司,改封娄侯。年八十一卒,谥曰文侯。张纮,字子纲,广陵人。东吴谋士,和张昭一起合称“二张”。孙策平定江东时亲自登门邀请,张纮遂出仕为官。张纮后来建议孙权迁都秣陵,孙权正在准备时张纮病逝,其年六十岁。孙权为之流涕。", + zuoci: "左慈,字元放,东汉末方士,汉族,庐江(今安徽庐江西南)人。在道教历史上,东汉时期的丹鼎派道术是从他一脉相传。", + caiwenji: + "名琰,原字昭姬,晋时避司马昭讳,改字文姬,东汉末年陈留圉(今河南开封杞县)人,东汉大文学家蔡邕的女儿,是中国历史上著名的才女和文学家,精于天文数理,既博学能文,又善诗赋,兼长辩才与音律。代表作有《胡笳十八拍》、《悲愤诗》等 。", - "yanyan":"严颜,东汉末年武将,初为刘璋部下,担任巴郡太守。建安十九年,刘备进攻江州,严颜战败被俘,张飞对严颜说:“大军至,何以不降而敢拒战?”,严颜回答说:“卿等无状,侵夺我州,我州但有断头将军,无降将军也!”,张飞生气,命左右将严颜牵去砍头,严颜表情不变地说:“砍头便砍头,何为怒邪!”张飞敬佩严颜的勇气,遂释放严颜并以严颜为宾客,之后的事迹不在正史中出现。", - "wangping":"王平,字子均,巴西宕渠(今四川省渠县东北)人,籍贯益州。三国时蜀汉后期大将。原属曹操,曹操与刘备争汉中,得以投降刘备。诸葛亮第一次北伐时与马谡一同守街亭,之后深受诸葛亮的器重,率领蜀汉的王牌军队无当飞军,多次随诸葛亮北伐。诸葛亮死后,拜前监军、镇北大将军,镇守汉中,曹爽率领十万大军攻汉中时,被王平所击退,累封安汉侯。延熙十一年,王平去世,其子王训继承了爵位。", - "luji":"陆绩(公元188年-公元219年),字公纪,吴郡吴县(今苏州)人,汉末庐江太守陆康之子。陆绩成年后,博学多识,通晓天文、历算,星历算数无不涉览。孙权征其为奏曹掾,常以直道见惮。后出为郁林太守,加偏将军。在军中不废著作,曾作《浑天图》,注《易经》,撰写《太玄经注》。", - "sunliang":"孙亮(243-260年),字子明,吴郡富春(今浙江杭州富阳区)人。三国时期吴国的第二位皇帝,公元252-258年在位。吴大帝孙权第七子,母潘皇后。史称吴少帝、吴废帝、会稽王。建兴元年(252年),十岁登基为帝,太平二年(257年),十五岁亲政,但一年后(258年)就被权臣孙綝废为会稽王。永安三年(260年),孙亮再被贬为候官侯,在前往封地途中自杀(一说被毒杀),终年18岁。西晋太康年间,原先任职吴国的官员戴显将孙亮的遗骨葬在赖乡。", - "xuyou":"许攸(?-204年),字子远,南阳(治今河南南阳)人。本为袁绍帐下谋士,官渡之战时其家人因犯法而被收捕,许攸因此背袁投曹,并为曹操设下偷袭袁绍军屯粮之所乌巢的计策,袁绍因此而大败于官渡。后许攸随曹操平定冀州,因自恃其功而屡屡口出狂言,终因触怒曹操而被杀。", - "yl_luzhi":"卢植(139年—192年),字子干。涿郡涿县(今河北涿州)人。东汉末年经学家、将领。卢植性格刚毅,师从太尉陈球、大儒马融等,为郑玄、管宁、华歆的同门师兄。曾先后担任九江、庐江太守,平定蛮族叛乱。后与马日磾、蔡邕等一起在东观校勘儒学经典书籍,并参与续写《汉记》。黄巾起义时为北中郎将,率军与张角交战,后被诬陷下狱,皇甫嵩平定黄巾后力救卢植,于是复任为尚书。后因上谏激怒董卓被免官,隐居在上谷军都山,被袁绍请为军师。初平三年(192年)去世。著有《尚书章句》、《三礼解诂》等,今皆失佚。唐代时配享孔子,北宋时被追封为良乡伯。白马将军公孙瓒以及后来的蜀汉昭烈帝刘备皆为卢植门下弟子。范阳卢氏后来也成为著名的家族。", - "kuailiangkuaiyue":"蒯良,字子柔,襄阳中庐人。归刘表。蒯良为刘表定下安抚荆楚的政治方向,佐其成业,被刘表誉为“雍季之论”。之后,蒯良就被刘表擢升为主簿(bù)。其后蒯良的生平,就不得而知了,《三国志》亦没有记载其卒年。与蒯越、以及同样活跃于襄阳的蒯祺(诸葛亮姐夫)或为同族兄弟。蒯越(?-214年),字异度,襄阳中庐(今湖北襄阳西南)人。东汉末期人物,演义中为蒯良之弟。原本是荆州牧刘表的部下,曾经在刘表初上任时帮助刘表铲除荆州一带的宗贼(以宗族、乡里关系组成的武装集团)。刘表病逝后与刘琮一同投降曹操,后来官至光禄勋。", + yanyan: "严颜,东汉末年武将,初为刘璋部下,担任巴郡太守。建安十九年,刘备进攻江州,严颜战败被俘,张飞对严颜说:“大军至,何以不降而敢拒战?”,严颜回答说:“卿等无状,侵夺我州,我州但有断头将军,无降将军也!”,张飞生气,命左右将严颜牵去砍头,严颜表情不变地说:“砍头便砍头,何为怒邪!”张飞敬佩严颜的勇气,遂释放严颜并以严颜为宾客,之后的事迹不在正史中出现。", + wangping: + "王平,字子均,巴西宕渠(今四川省渠县东北)人,籍贯益州。三国时蜀汉后期大将。原属曹操,曹操与刘备争汉中,得以投降刘备。诸葛亮第一次北伐时与马谡一同守街亭,之后深受诸葛亮的器重,率领蜀汉的王牌军队无当飞军,多次随诸葛亮北伐。诸葛亮死后,拜前监军、镇北大将军,镇守汉中,曹爽率领十万大军攻汉中时,被王平所击退,累封安汉侯。延熙十一年,王平去世,其子王训继承了爵位。", + luji: "陆绩(公元188年-公元219年),字公纪,吴郡吴县(今苏州)人,汉末庐江太守陆康之子。陆绩成年后,博学多识,通晓天文、历算,星历算数无不涉览。孙权征其为奏曹掾,常以直道见惮。后出为郁林太守,加偏将军。在军中不废著作,曾作《浑天图》,注《易经》,撰写《太玄经注》。", + sunliang: + "孙亮(243-260年),字子明,吴郡富春(今浙江杭州富阳区)人。三国时期吴国的第二位皇帝,公元252-258年在位。吴大帝孙权第七子,母潘皇后。史称吴少帝、吴废帝、会稽王。建兴元年(252年),十岁登基为帝,太平二年(257年),十五岁亲政,但一年后(258年)就被权臣孙綝废为会稽王。永安三年(260年),孙亮再被贬为候官侯,在前往封地途中自杀(一说被毒杀),终年18岁。西晋太康年间,原先任职吴国的官员戴显将孙亮的遗骨葬在赖乡。", + xuyou: "许攸(?-204年),字子远,南阳(治今河南南阳)人。本为袁绍帐下谋士,官渡之战时其家人因犯法而被收捕,许攸因此背袁投曹,并为曹操设下偷袭袁绍军屯粮之所乌巢的计策,袁绍因此而大败于官渡。后许攸随曹操平定冀州,因自恃其功而屡屡口出狂言,终因触怒曹操而被杀。", + yl_luzhi: + "卢植(139年—192年),字子干。涿郡涿县(今河北涿州)人。东汉末年经学家、将领。卢植性格刚毅,师从太尉陈球、大儒马融等,为郑玄、管宁、华歆的同门师兄。曾先后担任九江、庐江太守,平定蛮族叛乱。后与马日磾、蔡邕等一起在东观校勘儒学经典书籍,并参与续写《汉记》。黄巾起义时为北中郎将,率军与张角交战,后被诬陷下狱,皇甫嵩平定黄巾后力救卢植,于是复任为尚书。后因上谏激怒董卓被免官,隐居在上谷军都山,被袁绍请为军师。初平三年(192年)去世。著有《尚书章句》、《三礼解诂》等,今皆失佚。唐代时配享孔子,北宋时被追封为良乡伯。白马将军公孙瓒以及后来的蜀汉昭烈帝刘备皆为卢植门下弟子。范阳卢氏后来也成为著名的家族。", + kuailiangkuaiyue: + "蒯良,字子柔,襄阳中庐人。归刘表。蒯良为刘表定下安抚荆楚的政治方向,佐其成业,被刘表誉为“雍季之论”。之后,蒯良就被刘表擢升为主簿(bù)。其后蒯良的生平,就不得而知了,《三国志》亦没有记载其卒年。与蒯越、以及同样活跃于襄阳的蒯祺(诸葛亮姐夫)或为同族兄弟。蒯越(?-214年),字异度,襄阳中庐(今湖北襄阳西南)人。东汉末期人物,演义中为蒯良之弟。原本是荆州牧刘表的部下,曾经在刘表初上任时帮助刘表铲除荆州一带的宗贼(以宗族、乡里关系组成的武装集团)。刘表病逝后与刘琮一同投降曹操,后来官至光禄勋。", - "guanqiujian":"毌丘俭,字仲恭,河东闻喜(今山西闻喜县)人。三国时期曹魏后期的重要将领。继承父毌丘兴爵位高阳乡侯,任平原侯文学。魏明帝即位后,上疏劝魏明帝停止加建皇宫的工程,升为荆州刺史。景初二年(238年)从司马懿攻灭公孙渊;正始五年(244年)至正始六年(245年)两次率兵征讨高句丽,攻破丸都,几亡其国,刻石纪功而还;253年击退吴国诸葛恪的大举进犯,战功累累。司马师废帝,毌丘俭感昔日魏明帝之恩,为曹魏政权做拼死一搏,于正元二年(255年)发动兵变,即后人所谓“淮南三叛”(王淩、毌丘俭、诸葛诞)之一,惜准备不足,兵败身亡。", - "haozhao":"郝昭(生卒年不详),字伯道,太原人,中国东汉末年至曹魏初年著名将领。郝昭少年从军,屡立战功,逐渐晋升为杂号将军,后受曹真的推荐镇守陈仓(在小说三国演义中是司马懿推荐),防御蜀汉。太和二年(228年),诸葛亮率军北伐,为郝昭所阻,劝降不成,昼夜相攻二十余日后被迫退军。魏明帝因此封其为关内侯。不久因染疾而病死。", - "zhugezhan":"诸葛瞻,字思远,琅邪阳都(今山东沂南县)人。三国时期蜀汉大臣,蜀汉丞相诸葛亮之子。邓艾伐蜀时,他与长子诸葛尚及蜀将张遵、李球、黄崇等人防御绵竹(今四川德阳),因不听黄崇速占险要的建议而坐失良机,后来出城与邓艾决战,在交战时阵亡,绵竹也随后失守。", - "zhoufei":"周妃(210年?—?),一说本名周彻。周瑜独女,生母无载,疑为汉末美女小乔,因嫁孙登为太子妃,故称周妃。周瑜英年早逝,其遗孤都得到孙权厚遇,除却她本人在黄武四年(225年)嫁予太子外,兄长周循亦娶孙权长女孙鲁班为妻。", - "lukang":"陆抗,字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。陆抗袭父爵为江陵侯,为建武校尉,领其父众五千人。后迁立节中郎将、镇军将军等。孙皓为帝,任镇军大将军、都督西陵、信陵、夷道、乐乡、公安诸军事,驻乐乡(今湖北江陵西南)。凤凰元年(272年),击退晋将羊祜进攻,并攻杀叛将西陵督步阐。后拜大司马、荆州牧,卒于官,终年49岁。与陆逊皆是吴国的中流砥柱,并称“逊抗 ”,被誉为吴国最后的名将。", - "zhangxiu":"张绣,武威祖厉(今甘肃靖远)人。骠骑将军张济的从子。东汉末年割据宛城的军阀,汉末群雄之一。初随张济征伐,张济死后与刘表联合。后降曹操,因曹操调戏其嫂而突袭曹操,复与刘表连和。官渡之战前夕,听从贾诩的建议再次投降曹操,参加官渡之战,官至破羌将军,封宣威侯。在北征乌桓(207年)途中去世(一说为曹丕逼死),谥定侯。", - "chendao":"陈到,字叔至,生卒年不详,豫州汝南(今河南驻马店平舆县)人。三国时期蜀汉将领,刘备帐下白毦兵统领,名位常亚于赵云,以忠勇著称。蜀汉建兴年间,任征西将军、永安都督,封亭侯。在任期间去世。", + guanqiujian: + "毌丘俭,字仲恭,河东闻喜(今山西闻喜县)人。三国时期曹魏后期的重要将领。继承父毌丘兴爵位高阳乡侯,任平原侯文学。魏明帝即位后,上疏劝魏明帝停止加建皇宫的工程,升为荆州刺史。景初二年(238年)从司马懿攻灭公孙渊;正始五年(244年)至正始六年(245年)两次率兵征讨高句丽,攻破丸都,几亡其国,刻石纪功而还;253年击退吴国诸葛恪的大举进犯,战功累累。司马师废帝,毌丘俭感昔日魏明帝之恩,为曹魏政权做拼死一搏,于正元二年(255年)发动兵变,即后人所谓“淮南三叛”(王淩、毌丘俭、诸葛诞)之一,惜准备不足,兵败身亡。", + haozhao: + "郝昭(生卒年不详),字伯道,太原人,中国东汉末年至曹魏初年著名将领。郝昭少年从军,屡立战功,逐渐晋升为杂号将军,后受曹真的推荐镇守陈仓(在小说三国演义中是司马懿推荐),防御蜀汉。太和二年(228年),诸葛亮率军北伐,为郝昭所阻,劝降不成,昼夜相攻二十余日后被迫退军。魏明帝因此封其为关内侯。不久因染疾而病死。", + zhugezhan: + "诸葛瞻,字思远,琅邪阳都(今山东沂南县)人。三国时期蜀汉大臣,蜀汉丞相诸葛亮之子。邓艾伐蜀时,他与长子诸葛尚及蜀将张遵、李球、黄崇等人防御绵竹(今四川德阳),因不听黄崇速占险要的建议而坐失良机,后来出城与邓艾决战,在交战时阵亡,绵竹也随后失守。", + zhoufei: + "周妃(210年?—?),一说本名周彻。周瑜独女,生母无载,疑为汉末美女小乔,因嫁孙登为太子妃,故称周妃。周瑜英年早逝,其遗孤都得到孙权厚遇,除却她本人在黄武四年(225年)嫁予太子外,兄长周循亦娶孙权长女孙鲁班为妻。", + lukang: "陆抗,字幼节,吴郡吴县(今江苏苏州)人。三国时期吴国名将,丞相陆逊次子。陆抗袭父爵为江陵侯,为建武校尉,领其父众五千人。后迁立节中郎将、镇军将军等。孙皓为帝,任镇军大将军、都督西陵、信陵、夷道、乐乡、公安诸军事,驻乐乡(今湖北江陵西南)。凤凰元年(272年),击退晋将羊祜进攻,并攻杀叛将西陵督步阐。后拜大司马、荆州牧,卒于官,终年49岁。与陆逊皆是吴国的中流砥柱,并称“逊抗 ”,被誉为吴国最后的名将。", + zhangxiu: + "张绣,武威祖厉(今甘肃靖远)人。骠骑将军张济的从子。东汉末年割据宛城的军阀,汉末群雄之一。初随张济征伐,张济死后与刘表联合。后降曹操,因曹操调戏其嫂而突袭曹操,复与刘表连和。官渡之战前夕,听从贾诩的建议再次投降曹操,参加官渡之战,官至破羌将军,封宣威侯。在北征乌桓(207年)途中去世(一说为曹丕逼死),谥定侯。", + chendao: + "陈到,字叔至,生卒年不详,豫州汝南(今河南驻马店平舆县)人。三国时期蜀汉将领,刘备帐下白毦兵统领,名位常亚于赵云,以忠勇著称。蜀汉建兴年间,任征西将军、永安都督,封亭侯。在任期间去世。", }, - skill:{ + skill: { //庞统写法修改 - lianhuan:{ - audio:2, - hiddenCard:(player,name)=>{ - return name=='tiesuo'&&player.hasCard(card=>get.suit(card)=='club','sh'); + lianhuan: { + audio: 2, + hiddenCard: (player, name) => { + return name == "tiesuo" && player.hasCard((card) => get.suit(card) == "club", "sh"); }, - enable:'chooseToUse', - filter:function(event,player){ - if(!player.hasCard(card=>get.suit(card)=='club','sh')) return false; - return (event.type=='phase'||event.filterCard(get.autoViewAs({name:'tiesuo'},'unsure'),player,event)); + enable: "chooseToUse", + filter: function (event, player) { + if (!player.hasCard((card) => get.suit(card) == "club", "sh")) return false; + return ( + event.type == "phase" || + event.filterCard(get.autoViewAs({ name: "tiesuo" }, "unsure"), player, event) + ); }, - position:'hs', - filterCard:function(card,player,event){ - if(!event) event=_status.event; - if(get.suit(card)!='club') return false; - if(event.type=='phase'&&get.position(card)!='s'&&player.canRecast(card)){ + position: "hs", + filterCard: function (card, player, event) { + if (!event) event = _status.event; + if (get.suit(card) != "club") return false; + if (event.type == "phase" && get.position(card) != "s" && player.canRecast(card)) { return true; - } - else{ - if(game.checkMod(card,player,'unchanged','cardEnabled2',player)===false) return false; - const cardx=get.autoViewAs({name:'tiesuo'},[card]); - return event._backup.filterCard(cardx,player,event); + } else { + if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false) + return false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + return event._backup.filterCard(cardx, player, event); } }, - filterTarget:function(fuck,player,target){ - const card=ui.selected.cards[0],event=_status.event,backup=event._backup; - if(!card||game.checkMod(card,player,'unchanged','cardEnabled2',player)===false) return false; - const cardx=get.autoViewAs({name:'tiesuo'},[card]); - return (backup.filterCard(cardx,player,event)&&backup.filterTarget(cardx,player,target)); + filterTarget: function (fuck, player, target) { + const card = ui.selected.cards[0], + event = _status.event, + backup = event._backup; + if (!card || game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false) + return false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + return ( + backup.filterCard(cardx, player, event) && backup.filterTarget(cardx, player, target) + ); }, - selectTarget:function(){ - const card=ui.selected.cards[0],event=_status.event,player=event.player,backup=event._backup; - let recast=false,use=false; - const cardx=get.autoViewAs({name:'tiesuo'},[card]); - if(event.type=='phase'&&player.canRecast(card)) recast=true; - if(game.checkMod(card,player,'unchanged','cardEnabled2',player)!==false){ - if(backup.filterCard(cardx,player,event)) use=true; + selectTarget: function () { + const card = ui.selected.cards[0], + event = _status.event, + player = event.player, + backup = event._backup; + let recast = false, + use = false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + if (event.type == "phase" && player.canRecast(card)) recast = true; + if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false) { + if (backup.filterCard(cardx, player, event)) use = true; } - if(!use) return [0,0]; - else{ - const select=backup.selectTarget(cardx,player); - if(recast&&select[0]>0) select[0]=0; + if (!use) return [0, 0]; + else { + const select = backup.selectTarget(cardx, player); + if (recast && select[0] > 0) select[0] = 0; return select; } }, - filterOk:function(){ - const card=ui.selected.cards[0],event=_status.event,player=event.player,backup=event._backup; - const selected=ui.selected.targets.length; - let recast=false,use=false; - const cardx=get.autoViewAs({name:'tiesuo'},[card]); - if(event.type=='phase'&&player.canRecast(card)) recast=true; - if(game.checkMod(card,player,'unchanged','cardEnabled2',player)!==false){ - if(backup.filterCard(cardx,player,event)) use=true; + filterOk: function () { + const card = ui.selected.cards[0], + event = _status.event, + player = event.player, + backup = event._backup; + const selected = ui.selected.targets.length; + let recast = false, + use = false; + const cardx = get.autoViewAs({ name: "tiesuo" }, [card]); + if (event.type == "phase" && player.canRecast(card)) recast = true; + if (game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false) { + if (backup.filterCard(cardx, player, event)) use = true; } - if(recast&&selected==0){ + if (recast && selected == 0) { return true; - } - else if(use){ - const select=backup.selectTarget(cardx,player); - if(select[0]<=-1) return true; - return selected>=select[0]&&selected<=select[1]; + } else if (use) { + const select = backup.selectTarget(cardx, player); + if (select[0] <= -1) return true; + return selected >= select[0] && selected <= select[1]; } }, - discard:false, - lose:false, - delay:false, - precontent:function(){ - var result=event.result; - if(result.targets.length>0) result.card=get.autoViewAs({name:'tiesuo'},result.cards); + discard: false, + lose: false, + delay: false, + precontent: function () { + var result = event.result; + if (result.targets.length > 0) + result.card = get.autoViewAs({ name: "tiesuo" }, result.cards); }, - content:function(){ + content: function () { player.recast(cards); }, }, //新杀小加强 陈到 - dcwanglie:{ - audio:'drlt_wanglie', - locked:false, - mod:{ - targetInRange:function(card,player,target){ - if(player.hasSkill('dcwanglie_effect',null,null,false)) return true; + dcwanglie: { + audio: "drlt_wanglie", + locked: false, + mod: { + targetInRange: function (card, player, target) { + if (player.hasSkill("dcwanglie_effect", null, null, false)) return true; }, }, - trigger:{ - player:"useCard", + trigger: { + player: "useCard", }, - filter:function(event,player){ - return player.isPhaseUsing()&&(event.card.name=='sha'||get.type(event.card)=='trick'); + filter: function (event, player) { + return ( + player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick") + ); }, - preHidden:true, - check:function(event,player){ - if(player.hasSkill('dcwanglie2',null,null,false)) return true; - if(['wuzhong','kaihua','dongzhuxianji'].includes(event.card.name)) return false; - player._wanglie_temp=true; - var eff=0; - for(var i of event.targets){ - eff+=get.effect(i,event.card,player,player); + preHidden: true, + check: function (event, player) { + if (player.hasSkill("dcwanglie2", null, null, false)) return true; + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; + player._wanglie_temp = true; + var eff = 0; + for (var i of event.targets) { + eff += get.effect(i, event.card, player, player); } delete player._wanglie_temp; - if(eff<0) return true; - if(!player.countCards('h',function(card){ - return player.hasValueTarget(card,null,true); - })) return true; - if(get.tag(event.card,'damage')&&!player.needsToDiscard()&&!player.countCards('h',function(card){ - return get.tag(card,'damage')&&player.hasValueTarget(card,null,true); - })) return true; + if (eff < 0) return true; + if ( + !player.countCards("h", function (card) { + return player.hasValueTarget(card, null, true); + }) + ) + return true; + if ( + get.tag(event.card, "damage") && + !player.needsToDiscard() && + !player.countCards("h", function (card) { + return get.tag(card, "damage") && player.hasValueTarget(card, null, true); + }) + ) + return true; return false; }, - prompt2:function(event){ - return '令'+get.translation(event.card)+'不能被响应,然后本阶段你使用牌只能指定自己为目标' + prompt2: function (event) { + return ( + "令" + + get.translation(event.card) + + "不能被响应,然后本阶段你使用牌只能指定自己为目标" + ); }, - group:'dcwanglie_startup', - content:function(){ - trigger.nowuxie=true; + group: "dcwanglie_startup", + content: function () { + trigger.nowuxie = true; trigger.directHit.addArray(game.players); - player.addTempSkill('dcwanglie2','phaseUseAfter'); + player.addTempSkill("dcwanglie2", "phaseUseAfter"); }, - subSkill:{ - startup:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - popup:false, - content:function(){ - player.addTempSkill('dcwanglie_effect','phaseUseAfter'); + subSkill: { + startup: { + trigger: { player: "phaseUseBegin" }, + forced: true, + popup: false, + content: function () { + player.addTempSkill("dcwanglie_effect", "phaseUseAfter"); }, }, - effect:{ - forced:true, - charlotte:true, - firstDo:true, - popup:false, - trigger:{player:'useCard1'}, - filter:function(event,player){ - return event.targets.some(target=>target!=player); + effect: { + forced: true, + charlotte: true, + firstDo: true, + popup: false, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return event.targets.some((target) => target != player); }, - content:function(){ - player.addMark('dcwanglie_effect',1,false); - if(player.countMark('dcwanglie_effect')>=2) player.removeSkill('dcwanglie_effect'); + content: function () { + player.addMark("dcwanglie_effect", 1, false); + if (player.countMark("dcwanglie_effect") >= 2) + player.removeSkill("dcwanglie_effect"); }, - onremove:true, + onremove: true, }, }, - ai:{ + ai: { //pretao:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { //if(tag=='pretao') return true; - if(player._wanglie_temp) return false; - player._wanglie_temp=true; - var bool=function(){ - if(['wuzhong','kaihua','dongzhuxianji'].includes(arg.card.name)) return false; - if(get.attitude(player,arg.target)>0||!player.isPhaseUsing()) return false; - var cards=player.getCards('h',function(card){ - return card!=arg.card&&(!arg.card.cards||!arg.card.cards.includes(card)); + if (player._wanglie_temp) return false; + player._wanglie_temp = true; + var bool = (function () { + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(arg.card.name)) return false; + if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; + var cards = player.getCards("h", function (card) { + return ( + card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) + ); }); - var sha=player.getCardUsable('sha'); - if(arg.card.name=='sha') sha--; - cards=cards.filter(function(card){ - if(card.name=='sha'&&sha<=0) return false; - return player.hasValueTarget(card,null,true); + var sha = player.getCardUsable("sha"); + if (arg.card.name == "sha") sha--; + cards = cards.filter(function (card) { + if (card.name == "sha" && sha <= 0) return false; + return player.hasValueTarget(card, null, true); }); - if(!cards.length) return true; - if(!get.tag(arg.card,'damage')) return false; - if(!player.needsToDiscard()&&!cards.filter(function(card){ - return get.tag(card,'damage'); - }).length) return true; + if (!cards.length) return true; + if (!get.tag(arg.card, "damage")) return false; + if ( + !player.needsToDiscard() && + !cards.filter(function (card) { + return get.tag(card, "damage"); + }).length + ) + return true; return false; - }(); + })(); delete player._wanglie_temp; return bool; }, }, }, - dcwanglie2:{ - charlotte:true, - mod:{ - playerEnabled:function(card,player,target){ - if(player!=target) return false; - } + dcwanglie2: { + charlotte: true, + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, }, }, //周妃 - olliangyin:{ - audio:'liangyin', - trigger:{ - global:["loseAfter","addToExpansionAfter","cardsGotoSpecialAfter",'loseAsyncAfter'], + olliangyin: { + audio: "liangyin", + trigger: { + global: ["loseAfter", "addToExpansionAfter", "cardsGotoSpecialAfter", "loseAsyncAfter"], }, - filter:function(event,player,name){ - if(event.name=='lose'||event.name=='loseAsync') return event.getlx!==false&&event.toStorage==true; - if(event.name=='cardsGotoSpecial') return !event.notrigger; + filter: function (event, player, name) { + if (event.name == "lose" || event.name == "loseAsync") + return event.getlx !== false && event.toStorage == true; + if (event.name == "cardsGotoSpecial") return !event.notrigger; return true; }, - direct:true, - usable:1, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('olliangyin'),'选择一名其他角色,你与其各摸一张牌',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,num=player.getExpansions('olkongsheng').length-1; - var att=get.attitude(player,target); - if(att<=0) return 0; - if(target.countCards('h')==num&&target.isDamaged()&&get.recoverEffect(target,player,player)>0) return 3*att; - return att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('olliangyin',target); - game.asyncDraw([player,target].sortBySeat()); - } - else event.finish(); - 'step 2' - game.delayx(); - var num=player.getExpansions('olkongsheng').length; - var check=function(player){ - if(!player.isIn()||player.isHealthy()) return false; - return player.countCards('h')==num; - } - if(check(player)||check(target)){ - var choiceList=[ - '令自己回复1点体力', - '令'+get.translation(target)+'回复1点体力', - ]; - var choices=[]; - if(check(player)) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(check(target)) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - choices.push('cancel2'); - player.chooseControl(choices).set('choiceList',choiceList).set('prompt','良姻:是否令一名角色回复体力?').set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target; - var list=_status.event.controls.slice(0),eff1=0,eff2=0; - if(list.includes('选项一')) eff1=get.recoverEffect(player,player,player); - if(list.includes('选项二')) eff2=get.recoverEffect(target,player,player); - if(eff1>Math.max(0,eff2)) return '选项一'; - if(eff2>0) return '选项二'; - return 'cancel2'; + direct: true, + usable: 1, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("olliangyin"), + "选择一名其他角色,你与其各摸一张牌", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player, + num = player.getExpansions("olkongsheng").length - 1; + var att = get.attitude(player, target); + if (att <= 0) return 0; + if ( + target.countCards("h") == num && + target.isDamaged() && + get.recoverEffect(target, player, player) > 0 + ) + return 3 * att; + return att; }); - } - else event.finish(); - 'step 3' - if(result.control=='选项一') player.recover(); - else if(result.control=='选项二') target.recover(); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olliangyin", target); + game.asyncDraw([player, target].sortBySeat()); + } else event.finish(); + ("step 2"); + game.delayx(); + var num = player.getExpansions("olkongsheng").length; + var check = function (player) { + if (!player.isIn() || player.isHealthy()) return false; + return player.countCards("h") == num; + }; + if (check(player) || check(target)) { + var choiceList = [ + "令自己回复1点体力", + "令" + get.translation(target) + "回复1点体力", + ]; + var choices = []; + if (check(player)) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (check(target)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "良姻:是否令一名角色回复体力?") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var list = _status.event.controls.slice(0), + eff1 = 0, + eff2 = 0; + if (list.includes("选项一")) eff1 = get.recoverEffect(player, player, player); + if (list.includes("选项二")) eff2 = get.recoverEffect(target, player, player); + if (eff1 > Math.max(0, eff2)) return "选项一"; + if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + } else event.finish(); + ("step 3"); + if (result.control == "选项一") player.recover(); + else if (result.control == "选项二") target.recover(); }, - group:'olliangyin_gain', - subSkill:{ - gain:{ - audio:'liangyin', - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + group: "olliangyin_gain", + subSkill: { + gain: { + audio: "liangyin", + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - var evt=event.getl(current); - return evt&&(evt.xs.length>0||evt.ss.length>0); + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + var evt = event.getl(current); + return evt && (evt.xs.length > 0 || evt.ss.length > 0); }); }, - usable:1, - content:function(){ - 'step 0' - if(!player.countCards('he')||!game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he')>0; - })) event.finish(); - else player.chooseCardTarget({ - prompt:get.prompt('olliangyin'), - prompt2:'弃置一张牌,并令一名其他角色也弃置一张牌', - position:'he', - filterCard:lib.filter.cardDiscardable, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }, - ai1:function(card){ - let player=_status.event.player; - if(_status.event.me){ - if(get.position(card)===_status.event.me) return 12-player.hp-get.value(card); - return 0; - } - return 5-get.value(card); - }, - ai2:function(target){ - let player=_status.event.player,att=get.attitude(player,target); - if(att>0&&(_status.event.me||target.isHealthy())) return -att; - if(att>0&&(target.countCards('he')>target.hp||target.hasCard(function(card){ - return get.value(card,target)<=0; - },'e'))) return att; - return -att; - }, - me:function(){ - if(player.isHealthy()||get.recoverEffect(player,player,_status.event.player)<=0) return false; - let ph=player.countCards('h'),num=player.getExpansions('olkongsheng').length; - if(ph===num){ - if(player.hasSkillTag('noh')) return 'h'; - return 'e'; - } - if(ph-1===num) return 'h'; - return false; - }() - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('olliangyin_gain',target); - player.discard(result.cards); - target.chooseToDiscard('he',true); - } - else event.finish(); - 'step 2' - game.delayx(); - var num=player.getExpansions('olkongsheng').length; - var check=function(player){ - if(!player.isIn()||player.isHealthy()) return false; - return player.countCards('h')==num; - } - if(check(player)||check(target)){ - var choiceList=[ - '令自己回复1点体力', - '令'+get.translation(target)+'回复1点体力', - ]; - var choices=[]; - if(check(player)) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(check(target)) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - choices.push('cancel2'); - player.chooseControl(choices).set('choiceList',choiceList).set('prompt','良姻:是否令一名角色回复体力?').set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target; - var list=_status.event.controls.slice(0),eff1=0,eff2=0; - if(list.includes('选项一')) eff1=get.recoverEffect(player,player,player); - if(list.includes('选项二')) eff2=get.recoverEffect(target,player,player); - if(eff1>Math.max(0,eff2)) return '选项一'; - if(eff2>0) return '选项二'; - return 'cancel2'; + usable: 1, + content: function () { + "step 0"; + if ( + !player.countCards("he") || + !game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; + }) + ) + event.finish(); + else + player.chooseCardTarget({ + prompt: get.prompt("olliangyin"), + prompt2: "弃置一张牌,并令一名其他角色也弃置一张牌", + position: "he", + filterCard: lib.filter.cardDiscardable, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + ai1: function (card) { + let player = _status.event.player; + if (_status.event.me) { + if (get.position(card) === _status.event.me) + return 12 - player.hp - get.value(card); + return 0; + } + return 5 - get.value(card); + }, + ai2: function (target) { + let player = _status.event.player, + att = get.attitude(player, target); + if (att > 0 && (_status.event.me || target.isHealthy())) return -att; + if ( + att > 0 && + (target.countCards("he") > target.hp || + target.hasCard(function (card) { + return get.value(card, target) <= 0; + }, "e")) + ) + return att; + return -att; + }, + me: (function () { + if ( + player.isHealthy() || + get.recoverEffect(player, player, _status.event.player) <= 0 + ) + return false; + let ph = player.countCards("h"), + num = player.getExpansions("olkongsheng").length; + if (ph === num) { + if (player.hasSkillTag("noh")) return "h"; + return "e"; + } + if (ph - 1 === num) return "h"; + return false; + })(), }); - } - else event.finish(); - 'step 3' - if(result.control=='选项一') player.recover(); - else if(result.control=='选项二') target.recover(); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olliangyin_gain", target); + player.discard(result.cards); + target.chooseToDiscard("he", true); + } else event.finish(); + ("step 2"); + game.delayx(); + var num = player.getExpansions("olkongsheng").length; + var check = function (player) { + if (!player.isIn() || player.isHealthy()) return false; + return player.countCards("h") == num; + }; + if (check(player) || check(target)) { + var choiceList = [ + "令自己回复1点体力", + "令" + get.translation(target) + "回复1点体力", + ]; + var choices = []; + if (check(player)) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (check(target)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "良姻:是否令一名角色回复体力?") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var list = _status.event.controls.slice(0), + eff1 = 0, + eff2 = 0; + if (list.includes("选项一")) + eff1 = get.recoverEffect(player, player, player); + if (list.includes("选项二")) + eff2 = get.recoverEffect(target, player, player); + if (eff1 > Math.max(0, eff2)) return "选项一"; + if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + } else event.finish(); + ("step 3"); + if (result.control == "选项一") player.recover(); + else if (result.control == "选项二") target.recover(); }, }, }, }, - olkongsheng:{ - audio:'kongsheng', - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + olkongsheng: { + audio: "kongsheng", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseCard('he',[1,player.countCards('he')],get.prompt('olkongsheng'),'将任意张牌作为“箜”置于武将牌上').set('ai',function(card){ - var player=_status.event.player,num=player.getExpansions('olkongsheng')+ui.selected.cards.length; - if(ui.selected.cards.length>0&&game.hasPlayer(function(current){ - if(current.isHealthy()||get.recoverEffect(current,player,player)<=0) return false; - var num2=current.countCards('h',function(card){ - if(current!=player) return true; - return !ui.selected.cards.includes(card); - })+1; - return num==num2; - })) return 0; - if(get.type(card,null,false)=='equip'){ - for(var i of ui.selected.cards){ - if(get.type(i,null,false)=='equip') return 0; + content: function () { + "step 0"; + player + .chooseCard( + "he", + [1, player.countCards("he")], + get.prompt("olkongsheng"), + "将任意张牌作为“箜”置于武将牌上" + ) + .set("ai", function (card) { + var player = _status.event.player, + num = player.getExpansions("olkongsheng") + ui.selected.cards.length; + if ( + ui.selected.cards.length > 0 && + game.hasPlayer(function (current) { + if ( + current.isHealthy() || + get.recoverEffect(current, player, player) <= 0 + ) + return false; + var num2 = + current.countCards("h", function (card) { + if (current != player) return true; + return !ui.selected.cards.includes(card); + }) + 1; + return num == num2; + }) + ) + return 0; + if (get.type(card, null, false) == "equip") { + for (var i of ui.selected.cards) { + if (get.type(i, null, false) == "equip") return 0; + } + return 5 - get.value(card); } - return 5-get.value(card); - } - if(!player.hasValueTarget(card)) return 1; - return 0; - }); - 'step 1' - if(result.bool){ - player.logSkill('olkongsheng'); - player.addToExpansion(result.cards,player,'give').gaintag.add('olkongsheng'); + if (!player.hasValueTarget(card)) return 1; + return 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("olkongsheng"); + player.addToExpansion(result.cards, player, "give").gaintag.add("olkongsheng"); } }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - group:'olkongsheng_kessoku', - subSkill:{ - kessoku:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.getExpansions('olkongsheng').filter(function(card){ - return get.type(card,false)!='equip'; - }).length>0; + group: "olkongsheng_kessoku", + subSkill: { + kessoku: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player.getExpansions("olkongsheng").filter(function (card) { + return get.type(card, false) != "equip"; + }).length > 0 + ); }, - content:function(){ - 'step 0' - var cards=player.getExpansions('olkongsheng').filter(function(card){ - return get.type(card,false)!='equip'; + content: function () { + "step 0"; + var cards = player.getExpansions("olkongsheng").filter(function (card) { + return get.type(card, false) != "equip"; }); - if(cards.length) player.gain(cards,'gain2'); - 'step 1' - var cards=player.getExpansions('olkongsheng'); - if(cards.length>0){ - player.chooseTarget(true,'令一名角色使用以下装备牌',get.translation(cards)).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'losehp'},player,player); - }); - } - else event.finish(); - 'step 2' - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - 'step 3' - var cards=player.getExpansions('olkongsheng').filter(function(i){ + if (cards.length) player.gain(cards, "gain2"); + ("step 1"); + var cards = player.getExpansions("olkongsheng"); + if (cards.length > 0) { + player + .chooseTarget(true, "令一名角色使用以下装备牌", get.translation(cards)) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "losehp" }, player, player); + }); + } else event.finish(); + ("step 2"); + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + ("step 3"); + var cards = player.getExpansions("olkongsheng").filter(function (i) { return target.hasUseTarget(i); }); - if(cards.length==1){ - event._result={bool:true,links:cards} - } - else if(cards.length) target.chooseButton(true,['选择要使用的装备牌',cards]).set('ai',function(button){ - return get.order(button.link); - }); + if (cards.length == 1) { + event._result = { bool: true, links: cards }; + } else if (cards.length) + target + .chooseButton(true, ["选择要使用的装备牌", cards]) + .set("ai", function (button) { + return get.order(button.link); + }); else event.goto(5); - 'step 4' - if(result.bool){ - target.chooseUseTarget(result.links[0],true); + ("step 4"); + if (result.bool) { + target.chooseUseTarget(result.links[0], true); event.goto(3); } - 'step 5' + ("step 5"); target.loseHp(); }, }, }, }, //新毌丘俭 - zhengrong:{ - trigger:{player:'useCardToPlayered'}, - direct:true, - audio:'drlt_zhenrong', - filter:function(event,player){ - if(!event.isFirstTarget) return false; - if(!['basic','trick'].includes(get.type(event.card))) return false; - if(get.tag(event.card,'damage')) return game.hasPlayer(function(current){ - return event.targets.includes(current)&¤t.countCards('h')>=player.countCards('h')&¤t.countCards('he')>0; - }); + zhengrong: { + trigger: { player: "useCardToPlayered" }, + direct: true, + audio: "drlt_zhenrong", + filter: function (event, player) { + if (!event.isFirstTarget) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + if (get.tag(event.card, "damage")) + return game.hasPlayer(function (current) { + return ( + event.targets.includes(current) && + current.countCards("h") >= player.countCards("h") && + current.countCards("he") > 0 + ); + }); return false; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhengrong'),'将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,成为「荣」',function(card,player,target){ - return _status.event.targets.includes(target)&&target.countCards('h')>=player.countCards('h')&&target.countCards('he')>0; - }).set('ai',function(target){ - return (1-get.attitude(_status.event.player,target))/target.countCards('he'); - }).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=result.targets[0]; - player.logSkill('zhengrong',target); - player.choosePlayerCard(target,'he',true).ai=get.buttonValue; - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.links[0]; - player.addToExpansion(card,'give','log',target).gaintag.add('zhengrong'); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhengrong"), + "将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,成为「荣」", + function (card, player, target) { + return ( + _status.event.targets.includes(target) && + target.countCards("h") >= player.countCards("h") && + target.countCards("he") > 0 + ); + } + ) + .set("ai", function (target) { + return (1 - get.attitude(_status.event.player, target)) / target.countCards("he"); + }) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = result.targets[0]; + player.logSkill("zhengrong", target); + player.choosePlayerCard(target, "he", true).ai = get.buttonValue; + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.links[0]; + player.addToExpansion(card, "give", "log", target).gaintag.add("zhengrong"); } }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - marktext:'荣', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "荣", + intro: { + content: "expansion", + markcount: "expansion", }, }, - hongju:{ - trigger:{player:'phaseZhunbeiBegin'}, - audio:'drlt_hongju', - forced:true, - unique:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - derivation:'qingce', - filter:function(event,player){ - return player.getExpansions('zhengrong').length>=3; + hongju: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "drlt_hongju", + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + derivation: "qingce", + filter: function (event, player) { + return player.getExpansions("zhengrong").length >= 3; }, - content:function(){ - 'step 0' - player.awakenSkill('hongju'); - var cards=player.getExpansions('zhengrong'); - if(!cards.length||!player.countCards('h')){ + content: function () { + "step 0"; + player.awakenSkill("hongju"); + var cards = player.getExpansions("zhengrong"); + if (!cards.length || !player.countCards("h")) { event.goto(2); return; } - var next=player.chooseToMove('征荣:是否交换“荣”和手牌?'); - next.set('list',[ - [get.translation(player)+'(你)的“荣”',cards], - ['手牌区',player.getCards('h')], + var next = player.chooseToMove("征荣:是否交换“荣”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的“荣”", cards], + ["手牌区", player.getCards("h")], ]); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('processAI',function(list){ - var player=_status.event.player,cards=list[0][1].concat(list[1][1]).sort(function(a,b){ - return get.value(a)-get.value(b); - }),cards2=cards.splice(0,player.getExpansions('zhengrong').length); - return [cards2,cards]; + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.value(a) - get.value(b); + }), + cards2 = cards.splice(0, player.getExpansions("zhengrong").length); + return [cards2, cards]; }); - 'step 1' - if(result.bool){ - var pushs=result.moved[0],gains=result.moved[1]; - pushs.removeArray(player.getExpansions('zhengrong')); - gains.removeArray(player.getCards('h')); - if(!pushs.length||pushs.length!=gains.length) return; - player.addToExpansion(pushs).gaintag.add('zhengrong'); - player.gain(gains,'gain2','log'); + ("step 1"); + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("zhengrong")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs).gaintag.add("zhengrong"); + player.gain(gains, "gain2", "log"); } - 'step 2' - player.addSkills('qingce'); - game.log(player,'获得了技能','#g【清侧】'); + ("step 2"); + player.addSkills("qingce"); + game.log(player, "获得了技能", "#g【清侧】"); player.loseMaxHp(); }, }, - qingce:{ - enable:'phaseUse', - audio:'drlt_qingce', - filter:function(event,player){ - return player.getExpansions('zhengrong').length>0&&player.countCards('h')>0; + qingce: { + enable: "phaseUse", + audio: "drlt_qingce", + filter: function (event, player) { + return player.getExpansions("zhengrong").length > 0 && player.countCards("h") > 0; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('请选择要获得的「荣」',player.getExpansions('zhengrong'),'hidden'); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog( + "请选择要获得的「荣」", + player.getExpansions("zhengrong"), + "hidden" + ); }, - backup:function(links,player){ + backup: function (links, player) { return { - card:links[0], - filterCard:true, - position:'h', - filterTarget:function(card,player,target){ - return target.countDiscardableCards(player,'ej')>0; + card: links[0], + filterCard: true, + position: "h", + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; }, - delay:false, - audio:'drlt_qingce', - content:lib.skill.qingce.contentx, - ai:{ - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - if(att>0&&(target.countCards('j')>0||target.countCards('e',function(card){ - return get.value(card,target)<0; - }))) return 2; - if(att<0&&target.countCards('e')>0&&!target.hasSkillTag('noe')) return -1; + delay: false, + audio: "drlt_qingce", + content: lib.skill.qingce.contentx, + ai: { + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if ( + att > 0 && + (target.countCards("j") > 0 || + target.countCards("e", function (card) { + return get.value(card, target) < 0; + })) + ) + return 2; + if ( + att < 0 && + target.countCards("e") > 0 && + !target.hasSkillTag("noe") + ) + return -1; return 0; }, }, }, - } + }; }, - prompt:function(links,player){ - return '选择弃置一张手牌,获得'+get.translation(links[0])+'并弃置一名角色装备区或判定区内的一张牌'; + prompt: function (links, player) { + return ( + "选择弃置一张手牌,获得" + + get.translation(links[0]) + + "并弃置一名角色装备区或判定区内的一张牌" + ); }, }, - contentx:function(){ - 'step 0' - var card=lib.skill.qingce_backup.card; - player.gain(card,'gain2','log'); - 'step 1' - if(target.countDiscardableCards(player,'ej')>0){ - player.discardPlayerCard('ej',true,target); + contentx: function () { + "step 0"; + var card = lib.skill.qingce_backup.card; + player.gain(card, "gain2", "log"); + ("step 1"); + if (target.countDiscardableCards(player, "ej") > 0) { + player.discardPlayerCard("ej", true, target); } }, - ai:{ - order:8, - result:{ - player:function(player){ - if(game.hasPlayer(function(current){ - var att=get.attitude(player,current); - if((att>0&¤t.countCards('j')>0)||(att<0&¤t.countCards('e')>0)) return true; - return false; - })) return 1; + ai: { + order: 8, + result: { + player: function (player) { + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + if ( + (att > 0 && current.countCards("j") > 0) || + (att < 0 && current.countCards("e") > 0) + ) + return true; + return false; + }) + ) + return 1; return 0; }, }, - combo:'qingce' + combo: "qingce", }, }, //阴雷 - "drlt_zhenrong":{ - marktext:"荣", - intro:{ - content:'expansion', - markcount:'expansion', + drlt_zhenrong: { + marktext: "荣", + intro: { + content: "expansion", + markcount: "expansion", }, - audio:2, - trigger:{ - source:'damageSource', + audio: 2, + trigger: { + source: "damageSource", }, - filter:function(event,player){ - return event.player!=player&&event.player.countCards('h')>player.countCards('h'); + filter: function (event, player) { + return event.player != player && event.player.countCards("h") > player.countCards("h"); }, - direct:true, - content:function(){ - 'step 0' - player.choosePlayerCard('hej',get.prompt('drlt_zhenrong'),trigger.player).set('ai',function(button){ - return -get.attitude(player,trigger.player)+1; - }); - 'step 1' - if(result&&result.links&&result.links.length){ - player.line(player,trigger.player); - player.logSkill('drlt_zhenrong'); - player.addToExpansion(result.links,trigger.player,'give','log').gaintag.add('drlt_zhenrong'); + direct: true, + content: function () { + "step 0"; + player + .choosePlayerCard("hej", get.prompt("drlt_zhenrong"), trigger.player) + .set("ai", function (button) { + return -get.attitude(player, trigger.player) + 1; + }); + ("step 1"); + if (result && result.links && result.links.length) { + player.line(player, trigger.player); + player.logSkill("drlt_zhenrong"); + player + .addToExpansion(result.links, trigger.player, "give", "log") + .gaintag.add("drlt_zhenrong"); } }, }, - "drlt_hongju":{ - skillAnimation:true, - animationColor:'thunder', - audio:2, - trigger:{ - player:'phaseZhunbeiBegin', + drlt_hongju: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", }, - forced:true, - unique:true, - juexingji:true, - derivation:['drlt_qingce'], - filter:function(event,player){ - return player.getExpansions('drlt_zhenrong').length>=3&&game.dead.length>0; + forced: true, + unique: true, + juexingji: true, + derivation: ["drlt_qingce"], + filter: function (event, player) { + return player.getExpansions("drlt_zhenrong").length >= 3 && game.dead.length > 0; }, - content:function(){ - 'step 0' - player.awakenSkill('drlt_hongju'); - var cards=player.getExpansions('drlt_zhenrong'); - if(!cards.length||!player.countCards('h')){ + content: function () { + "step 0"; + player.awakenSkill("drlt_hongju"); + var cards = player.getExpansions("drlt_zhenrong"); + if (!cards.length || !player.countCards("h")) { event.goto(2); return; } - var next=player.chooseToMove('征荣:是否交换“荣”和手牌?'); - next.set('list',[ - [get.translation(player)+'(你)的“荣”',cards], - ['手牌区',player.getCards('h')], + var next = player.chooseToMove("征荣:是否交换“荣”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的“荣”", cards], + ["手牌区", player.getCards("h")], ]); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('processAI',function(list){ - var player=_status.event.player,cards=list[0][1].concat(list[1][1]).sort(function(a,b){ - return get.value(a)-get.value(b); - }),cards2=cards.splice(0,player.getExpansions('drlt_zhenrong').length); - return [cards2,cards]; + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.value(a) - get.value(b); + }), + cards2 = cards.splice(0, player.getExpansions("drlt_zhenrong").length); + return [cards2, cards]; }); - 'step 1' - if(result.bool){ - var pushs=result.moved[0],gains=result.moved[1]; - pushs.removeArray(player.getExpansions('drlt_zhenrong')); - gains.removeArray(player.getCards('h')); - if(!pushs.length||pushs.length!=gains.length) return; - player.addToExpansion(pushs).gaintag.add('drlt_zhenrong'); - player.gain(gains,'gain2','log'); + ("step 1"); + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("drlt_zhenrong")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs).gaintag.add("drlt_zhenrong"); + player.gain(gains, "gain2", "log"); } - 'step 2' - player.addSkills('drlt_qingce'); + ("step 2"); + player.addSkills("drlt_qingce"); player.loseMaxHp(); }, }, - 'drlt_qingce':{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.getExpansions('drlt_zhenrong').length>0; + drlt_qingce: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.getExpansions("drlt_zhenrong").length > 0; }, - filterTarget:function(card,player,target){ - return target.countDiscardableCards(player,'ej')>0; + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "ej") > 0; }, - content:function(){ - 'step 0' - player.chooseCardButton(player.getExpansions('drlt_zhenrong'),1,'请选择需要弃置的“荣”',true).ai=function(button){ - return 6-get.value(button.link); + content: function () { + "step 0"; + player.chooseCardButton( + player.getExpansions("drlt_zhenrong"), + 1, + "请选择需要弃置的“荣”", + true + ).ai = function (button) { + return 6 - get.value(button.link); }; - 'step 1' - if(result.bool){ - var cards=result.links; + ("step 1"); + if (result.bool) { + var cards = result.links; player.loseToDiscardpile(cards); - player.discardPlayerCard(target,'ej',1,true); + player.discardPlayerCard(target, "ej", 1, true); } }, - ai:{ - order:13, - result:{ - target:function(player,target){ - if(get.attitude(player,target)>0&&target.countCards('j')>0) return 1; + ai: { + order: 13, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0 && target.countCards("j") > 0) return 1; return -1; }, }, }, }, - "drlt_zhenggu":{ - audio:2, - trigger:{ - player:"phaseJieshuBegin", + drlt_zhenggu: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('drlt_zhenggu'),function(card,player,target){ - //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return false; - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return 0; - var num=(Math.min(5,player.countCards('h'))-target.countCards('h')); - var att=get.attitude(player,target); - return num*att; - }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('drlt_zhenggu',target); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("drlt_zhenggu"), function (card, player, target) { + //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return false; + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + //if(target.storage.drlt_zhenggu_mark&&target.storage.drlt_zhenggu_mark.includes(player)) return 0; + var num = Math.min(5, player.countCards("h")) - target.countCards("h"); + var att = get.attitude(player, target); + return num * att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("drlt_zhenggu", target); player.addSkill("drlt_zhenggu2"); target.addSkill("drlt_zhenggu_mark"); target.storage.drlt_zhenggu_mark.push(player); target.markSkill("drlt_zhenggu_mark"); - lib.skill.drlt_zhenggu.sync(player,target); + lib.skill.drlt_zhenggu.sync(player, target); } }, - sync:function(player,target){ - var num=player.countCards('h'); - var num2=target.countCards('h'); - if(num=2; + check: function (event, player) { + var num = 0; + if ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard"; + }) + ) + num++; + if (!player.isMinHandcard()) num++; + if (!player.getStat("damage")) num++; + if (num == 3) return player.hp >= 2; return true; }, - prompt:function(event,player){ - var num=3; - if(player.hasHistory('lose',function(evt){ - return evt.type=='discard'; - })) num--; - if(!player.isMinHandcard()) num--; - if(!player.getStat('damage')) num--; - return get.prompt('xinfu_zuilun')+'(可获得'+get.cnNumber(num)+'张牌)' + prompt: function (event, player) { + var num = 3; + if ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard"; + }) + ) + num--; + if (!player.isMinHandcard()) num--; + if (!player.getStat("damage")) num--; + return get.prompt("xinfu_zuilun") + "(可获得" + get.cnNumber(num) + "张牌)"; }, - content:function(){ - 'step 0' - event.num=0; - event.cards=get.cards(3); + content: function () { + "step 0"; + event.num = 0; + event.cards = get.cards(3); game.cardsGotoOrdering(cards); - if(player.hasHistory('lose',function(evt){ - return evt.type=='discard'; - })) event.num++; - if(!player.isMinHandcard()) event.num++; - if(!player.getStat('damage')) event.num++; - 'step 1' - if(event.num==0){ - player.gain(event.cards,'draw'); + if ( + player.hasHistory("lose", function (evt) { + return evt.type == "discard"; + }) + ) + event.num++; + if (!player.isMinHandcard()) event.num++; + if (!player.getStat("damage")) event.num++; + ("step 1"); + if (event.num == 0) { + player.gain(event.cards, "draw"); event.finish(); - } - else{ - var prompt='罪论:将'+get.cnNumber(num)+'张牌置于牌堆顶'; - if(num<3) prompt+='并获得其余的牌'; - var next=player.chooseToMove(prompt,true); - if(num<3){ - next.set('list',[ - ['牌堆顶',cards], - ['获得'], - ]); - next.set('filterMove',function(from,to,moved){ - if(to==1&&moved[0].length<=_status.event.num) return false; + } else { + var prompt = "罪论:将" + get.cnNumber(num) + "张牌置于牌堆顶"; + if (num < 3) prompt += "并获得其余的牌"; + var next = player.chooseToMove(prompt, true); + if (num < 3) { + next.set("list", [["牌堆顶", cards], ["获得"]]); + next.set("filterMove", function (from, to, moved) { + if (to == 1 && moved[0].length <= _status.event.num) return false; return true; }); - next.set('filterOk',function(moved){ - return moved[0].length==_status.event.num; + next.set("filterOk", function (moved) { + return moved[0].length == _status.event.num; }); + } else { + next.set("list", [["牌堆顶", cards]]); } - else{ - next.set('list',[ - ['牌堆顶',cards], - ]); - } - next.set('num',num); - next.set('processAI',function(list){ - var check=function(card){ - var player=_status.event.player; - var next=player.next; - var att=get.attitude(player,next); - var judge=next.getCards('j')[tops.length]; - if(judge){ - return get.judge(judge)(card)*att; + next.set("num", num); + next.set("processAI", function (list) { + var check = function (card) { + var player = _status.event.player; + var next = player.next; + var att = get.attitude(player, next); + var judge = next.getCards("j")[tops.length]; + if (judge) { + return get.judge(judge)(card) * att; } - return next.getUseValue(card)*att; - } - var cards=list[0][1].slice(0),tops=[]; - while(tops.length<_status.event.num){ - list.sort(function(a,b){ - return check(b)-check(a); + return next.getUseValue(card) * att; + }; + var cards = list[0][1].slice(0), + tops = []; + while (tops.length < _status.event.num) { + list.sort(function (a, b) { + return check(b) - check(a); }); tops.push(cards.shift()); } - return [tops,cards]; + return [tops, cards]; }); } - 'step 2' - if(result.bool){ - var list=result.moved[0]; - var num=list.length-1; - for(var i=0;i0; + forced: true, + audio: 2, + filter: function (event, player) { + if (event.player.countCards("h") < player.countCards("h")) return false; + if (event.card.name != "sha" && event.card.name != "juedou") return false; + return !game.hasPlayer2(function (current) { + return ( + current.getHistory("useCard", function (evt) { + return ( + evt != event.getParent() && + evt.card && + ["sha", "juedou"].includes(evt.card.name) && + evt.targets.includes(player) + ); + }).length > 0 + ); }); }, - content:function(){ + content: function () { trigger.getParent().excluded.add(player); }, - ai:{ - effect:{ - target:function(card,player,target){ - let hs=player.getCards('h',i=>i!==card&&(!card.cards||!card.cards.includes(i))),num=player.getCardUsable('sha'); - if(card.name!=='sha'&&card.name!=='juedou'||hs.length0; - })) return 1; - if(card.name==='sha') num--; - hs=hs.filter(i=>{ - if(!player.canUse(i,target)) return false; - if(i.name==='juedou') return true; - if(num&&i.name==='sha'){ + ai: { + effect: { + target: function (card, player, target) { + let hs = player.getCards( + "h", + (i) => i !== card && (!card.cards || !card.cards.includes(i)) + ), + num = player.getCardUsable("sha"); + if ( + (card.name !== "sha" && card.name !== "juedou") || + hs.length < target.countCards("h") + ) + return 1; + if ( + game.hasPlayer2(function (current) { + return ( + current.getHistory("useCard", function (evt) { + return ( + evt.card && + ["sha", "juedou"].includes(evt.card.name) && + evt.targets.includes(player) + ); + }).length > 0 + ); + }) + ) + return 1; + if (card.name === "sha") num--; + hs = hs.filter((i) => { + if (!player.canUse(i, target)) return false; + if (i.name === "juedou") return true; + if (num && i.name === "sha") { num--; return true; } return false; }); - if(!hs.length) return 'zeroplayertarget'; - num=1-2/3/hs.length; - return [num,0,num,0]; - } - } - } - }, - "drlt_qianjie":{ - group:["drlt_qianjie_1","drlt_qianjie_2","drlt_qianjie_3"], - locked:true, - ai:{ - effect:{ - target:function(card){ - if(card.name=='tiesuo') return 'zeroplayertarget'; + if (!hs.length) return "zeroplayertarget"; + num = 1 - 2 / 3 / hs.length; + return [num, 0, num, 0]; }, }, }, - subSkill:{ - '1':{ - audio:'drlt_qianjie', - trigger:{ - player:'linkBegin' + }, + drlt_qianjie: { + group: ["drlt_qianjie_1", "drlt_qianjie_2", "drlt_qianjie_3"], + locked: true, + ai: { + effect: { + target: function (card) { + if (card.name == "tiesuo") return "zeroplayertarget"; }, - forced:true, - filter:function(event,player){ + }, + }, + subSkill: { + 1: { + audio: "drlt_qianjie", + trigger: { + player: "linkBegin", + }, + forced: true, + filter: function (event, player) { return !player.isLinked(); }, - content:function(){ + content: function () { trigger.cancel(); }, }, - '2':{ - mod:{ - targetEnabled:function(card,player,target){ - if(get.type(card)=='delay') return false; + 2: { + mod: { + targetEnabled: function (card, player, target) { + if (get.type(card) == "delay") return false; }, }, }, - '3':{ - ai:{noCompareTarget:true,}, + 3: { + ai: { noCompareTarget: true }, }, }, }, - 'drlt_jueyan':{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hasEnabledSlot(1)||player.hasEnabledSlot(2)||player.hasEnabledSlot(5)||player.hasEnabledSlot('horse'); + drlt_jueyan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.hasEnabledSlot(1) || + player.hasEnabledSlot(2) || + player.hasEnabledSlot(5) || + player.hasEnabledSlot("horse") + ); }, - content:function(){ - 'step 0' - player.chooseToDisable(true).set('ai',function(event,player,list){ - if(list.includes('equip2')) return 'equip2'; - if(list.includes('equip1')&&(player.countCards('h',function(card){ - return get.name(card,player)=='sha'&&player.hasUseTarget(card); - })-player.getCardUsable('sha'))>1) return 'equip1'; - if(list.includes('equip5')&&player.countCards('h',function(card){ - return get.type2(card,player)=='trick'&&player.hasUseTarget(card); - })>1) return 'equip5'; + content: function () { + "step 0"; + player.chooseToDisable(true).set("ai", function (event, player, list) { + if (list.includes("equip2")) return "equip2"; + if ( + list.includes("equip1") && + player.countCards("h", function (card) { + return get.name(card, player) == "sha" && player.hasUseTarget(card); + }) - + player.getCardUsable("sha") > + 1 + ) + return "equip1"; + if ( + list.includes("equip5") && + player.countCards("h", function (card) { + return get.type2(card, player) == "trick" && player.hasUseTarget(card); + }) > 1 + ) + return "equip5"; }); - 'step 1' - switch(result.control){ - case 'equip1': - player.addTempSkill('drlt_jueyan1'); + ("step 1"); + switch (result.control) { + case "equip1": + player.addTempSkill("drlt_jueyan1"); break; - case 'equip2': + case "equip2": player.draw(3); - player.addTempSkill('drlt_jueyan3'); + player.addTempSkill("drlt_jueyan3"); break; - case 'equip3_4': - player.addTempSkill('drlt_jueyan2'); + case "equip3_4": + player.addTempSkill("drlt_jueyan2"); break; - case 'equip5': - player.addTempSkills('rejizhi'); + case "equip5": + player.addTempSkills("rejizhi"); break; } }, - ai:{ - order:13, - result:{ - player:function(player){ - if(player.hasEnabledSlot('equip2')) return 1; - if(player.hasEnabledSlot('equip1')&&(player.countCards('h',function(card){ - return get.name(card,player)=='sha'&&player.hasValueTarget(card); - })-player.getCardUsable('sha'))>1) return 1; - if(player.hasEnabledSlot('equip5')&&player.countCards('h',function(card){ - return get.type2(card,player)=='trick'&&player.hasUseTarget(card); - })>1) return 1; + ai: { + order: 13, + result: { + player: function (player) { + if (player.hasEnabledSlot("equip2")) return 1; + if ( + player.hasEnabledSlot("equip1") && + player.countCards("h", function (card) { + return get.name(card, player) == "sha" && player.hasValueTarget(card); + }) - + player.getCardUsable("sha") > + 1 + ) + return 1; + if ( + player.hasEnabledSlot("equip5") && + player.countCards("h", function (card) { + return get.type2(card, player) == "trick" && player.hasUseTarget(card); + }) > 1 + ) + return 1; return -1; }, }, }, - derivation:'rejizhi', + derivation: "rejizhi", }, - 'drlt_jueyan1':{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+3; + drlt_jueyan1: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 3; }, }, - mark:true, - marktext:'决', - intro:{name:'决堰 - 武器',content:'本回合内可以多使用三张【杀】'}, + mark: true, + marktext: "决", + intro: { name: "决堰 - 武器", content: "本回合内可以多使用三张【杀】" }, }, - 'drlt_jueyan2':{ - mod:{ - targetInRange:function(card,player,target,now){ + drlt_jueyan2: { + mod: { + targetInRange: function (card, player, target, now) { return true; }, }, - mark:true, - marktext:'决', - intro:{name:'决堰 - 坐骑',content:'本回合内使用牌没有距离限制'}, + mark: true, + marktext: "决", + intro: { name: "决堰 - 坐骑", content: "本回合内使用牌没有距离限制" }, }, - 'drlt_jueyan3':{ - mod:{ - maxHandcard:function(player,num){ - return num+3; + drlt_jueyan3: { + mod: { + maxHandcard: function (player, num) { + return num + 3; }, }, - mark:true, - marktext:'决', - intro:{name:'决堰 - 防具',content:'本回合内手牌上限+3'}, + mark: true, + marktext: "决", + intro: { name: "决堰 - 防具", content: "本回合内手牌上限+3" }, }, - "drlt_poshi":{ - audio:2, - skillAnimation:true, - animationColor:'wood', - trigger:{ - player:'phaseZhunbeiBegin', + drlt_poshi: { + audio: 2, + skillAnimation: true, + animationColor: "wood", + trigger: { + player: "phaseZhunbeiBegin", }, - forced:true, - unique:true, - juexingji:true, - derivation:['drlt_huairou'], - filter:function(event,player){ - return !player.hasEnabledSlot()||player.hp==1; + forced: true, + unique: true, + juexingji: true, + derivation: ["drlt_huairou"], + filter: function (event, player) { + return !player.hasEnabledSlot() || player.hp == 1; }, - content:function(){ - "step 0" - player.awakenSkill('drlt_poshi'); + content: function () { + "step 0"; + player.awakenSkill("drlt_poshi"); player.loseMaxHp(); - "step 1" - var num=player.maxHp-player.countCards('h'); - if(num>0) player.draw(num); - player.changeSkills(['drlt_huairou'],['drlt_jueyan']); + ("step 1"); + var num = player.maxHp - player.countCards("h"); + if (num > 0) player.draw(num); + player.changeSkills(["drlt_huairou"], ["drlt_jueyan"]); }, }, - "drlt_huairou":{ - audio:2, - enable:"phaseUse", - position:'he', - filter:(event,player)=>player.hasCard(card=>lib.skill.drlt_huairou.filterCard(card,player),lib.skill.drlt_huairou.position), - filterCard:(card,player)=>get.type(card)=='equip'&&player.canRecast(card), - check:function(card){ - if(!_status.event.player.canEquip(card)) return 5; - return 3-get.value(card); + drlt_huairou: { + audio: 2, + enable: "phaseUse", + position: "he", + filter: (event, player) => + player.hasCard( + (card) => lib.skill.drlt_huairou.filterCard(card, player), + lib.skill.drlt_huairou.position + ), + filterCard: (card, player) => get.type(card) == "equip" && player.canRecast(card), + check: function (card) { + if (!_status.event.player.canEquip(card)) return 5; + return 3 - get.value(card); }, - content:function(){ + content: function () { player.recast(cards); }, - discard:false, - lose:false, - delay:false, - prompt:"将一张装备牌置入弃牌堆并摸一张牌", - ai:{ - order:10, - result:{ - player:1 - } - } + discard: false, + lose: false, + delay: false, + prompt: "将一张装备牌置入弃牌堆并摸一张牌", + ai: { + order: 10, + result: { + player: 1, + }, + }, }, - "drlt_yongsi":{ - audio:2, - group:["drlt_yongsi_1","drlt_yongsi_2"], - locked:true, - subSkill:{ - '1':{ - audio:"drlt_yongsi", - trigger:{ - player:'phaseDrawBegin2' + drlt_yongsi: { + audio: 2, + group: ["drlt_yongsi_1", "drlt_yongsi_2"], + locked: true, + subSkill: { + 1: { + audio: "drlt_yongsi", + trigger: { + player: "phaseDrawBegin2", }, - forced:true, - filter:function(event,player){ + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num=game.countGroup(); + content: function () { + trigger.num = game.countGroup(); }, }, - '2':{ - audio:"drlt_yongsi", - trigger:{ - player:'phaseUseEnd' + 2: { + audio: "drlt_yongsi", + trigger: { + player: "phaseUseEnd", }, - forced:true, - filter:function(event,player){ - var num=0; - player.getHistory('sourceDamage',function(evt){ - if(evt.getParent('phaseUse')==event) num+=evt.num; + forced: true, + filter: function (event, player) { + var num = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.getParent("phaseUse") == event) num += evt.num; }); - return !num||num>1; + return !num || num > 1; }, - content:function(){ - var numx=0; - player.getHistory('sourceDamage',function(evt){ - if(evt.getParent('phaseUse')==trigger) numx+=evt.num; + content: function () { + var numx = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.getParent("phaseUse") == trigger) numx += evt.num; }); - if(!numx){ - var num=player.hp-player.countCards('h'); - if(num>0) player.draw(num); - } - else{ - player.addTempSkill('drlt_yongsi1',{player:'phaseDiscardAfter'}); + if (!numx) { + var num = player.hp - player.countCards("h"); + if (num > 0) player.draw(num); + } else { + player.addTempSkill("drlt_yongsi1", { player: "phaseDiscardAfter" }); } }, }, }, }, - 'drlt_yongsi1':{ - mod:{ - maxHandcard:function(player,num){ - return num+player.maxHp-2*Math.max(0,player.hp); + drlt_yongsi1: { + mod: { + maxHandcard: function (player, num) { + return num + player.maxHp - 2 * Math.max(0, player.hp); }, }, }, - drlt_weidi:{ - audio:2, - forceaudio:true, - unique:true, - zhuSkill:true, - trigger:{ - player:"phaseDiscardBegin", + drlt_weidi: { + audio: 2, + forceaudio: true, + unique: true, + zhuSkill: true, + trigger: { + player: "phaseDiscardBegin", }, - direct:true, - filter:function(event,player){ - if(!player.hasZhuSkill('drlt_weidi')) return false; - return player.needsToDiscard()>0&&game.countPlayer(function(current){return current!=player&¤t.group=='qun'})>0; + direct: true, + filter: function (event, player) { + if (!player.hasZhuSkill("drlt_weidi")) return false; + return ( + player.needsToDiscard() > 0 && + game.countPlayer(function (current) { + return current != player && current.group == "qun"; + }) > 0 + ); }, - content:function(){ - 'step 0' - var num=Math.min(player.needsToDiscard(),game.countPlayer(function(target){ - return target!=player&&target.group=='qun'; - })); - if(num){ + content: function () { + "step 0"; + var num = Math.min( + player.needsToDiscard(), + game.countPlayer(function (target) { + return target != player && target.group == "qun"; + }) + ); + if (num) { player.chooseCardTarget({ - prompt:get.prompt('drlt_weidi'), - prompt2:'你可以将'+(num>1?'至多':'')+get.cnNumber(num)+'张手牌交给等量的其他群势力角色。先按顺序选中所有要给出的手牌,然后再按顺序选择等量的目标角色', - selectCard:[1,num], - selectTarget:function(){ + prompt: get.prompt("drlt_weidi"), + prompt2: + "你可以将" + + (num > 1 ? "至多" : "") + + get.cnNumber(num) + + "张手牌交给等量的其他群势力角色。先按顺序选中所有要给出的手牌,然后再按顺序选择等量的目标角色", + selectCard: [1, num], + selectTarget: function () { return ui.selected.cards.length; }, - filterTarget:function(card,player,target){ - return target!=player&&target.group=='qun'; + filterTarget: function (card, player, target) { + return target != player && target.group == "qun"; }, - complexSelect:true, - filterOk:function(){ - return ui.selected.cards.length==ui.selected.targets.length; + complexSelect: true, + filterOk: function () { + return ui.selected.cards.length == ui.selected.targets.length; }, - ai1:function(card){ - var player=_status.event.player; - var value=get.value(card,player,'raw'); - if(game.hasPlayer(function(target){ - return (target!=player&&target.group=='qun'&&!ui.selected.targets.includes(target))&&(get.sgn(value)==get.sgn(get.attitude(player,target))) - })) return 1/Math.max(1,get.useful(card)); + ai1: function (card) { + var player = _status.event.player; + var value = get.value(card, player, "raw"); + if ( + game.hasPlayer(function (target) { + return ( + target != player && + target.group == "qun" && + !ui.selected.targets.includes(target) && + get.sgn(value) == get.sgn(get.attitude(player, target)) + ); + }) + ) + return 1 / Math.max(1, get.useful(card)); return -1; }, - ai2:function(target){ - var player=_status.event.player; - var card=ui.selected.cards[ui.selected.targets.length]; - if(card&&get.value(card,player,'raw')<0) return -get.attitude(player,target); - return get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[ui.selected.targets.length]; + if (card && get.value(card, player, "raw") < 0) + return -get.attitude(player, target); + return get.attitude(player, target); }, }); - } - else event.finish(); - 'step 1' - if(result.bool&&result.cards.length>0){ - var list=[]; - for(var i=0;i 0) { + var list = []; + for (var i = 0; i < result.targets.length; i++) { + var target = result.targets[i]; + var card = result.cards[i]; + list.push([target, card]); } - player.logSkill('drlt_weidi',result.targets); + player.logSkill("drlt_weidi", result.targets); game.loseAsync({ - gain_list:list, - player:player, - cards:result.cards, - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); - } - else event.finish(); + gain_list: list, + player: player, + cards: result.cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + } else event.finish(); }, }, - "drlt_xiongluan":{ - audio:2, - unique:true, - enable:'phaseUse', - mark:true, - skillAnimation:true, - animationColor:'gray', - limited:true, - filter:function(event,player){ - return !player.isDisabledJudge()||player.hasEnabledSlot(); + drlt_xiongluan: { + audio: 2, + unique: true, + enable: "phaseUse", + mark: true, + skillAnimation: true, + animationColor: "gray", + limited: true, + filter: function (event, player) { + return !player.isDisabledJudge() || player.hasEnabledSlot(); }, - filterTarget:function(card,player,target){ - return target!=player; + filterTarget: function (card, player, target) { + return target != player; }, - content:function(){ - player.awakenSkill('drlt_xiongluan'); - var disables=[]; - for(var i=1;i<=5;i++){ - for(var j=0;j0) player.disableEquip(disables); + if (disables.length > 0) player.disableEquip(disables); player.disableJudge(); - player.addTempSkill('drlt_xiongluan1'); - player.storage.drlt_xiongluan1=target; - target.addSkill('drlt_xiongluan2'); - target.markSkillCharacter('drlt_xiongluan1',player,'雄乱','无法使用或打出任何手牌'); + player.addTempSkill("drlt_xiongluan1"); + player.storage.drlt_xiongluan1 = target; + target.addSkill("drlt_xiongluan2"); + target.markSkillCharacter("drlt_xiongluan1", player, "雄乱", "无法使用或打出任何手牌"); }, - ai:{ - order:13, - result:{ - target:(player,target)=>{ - let hs=player.countCards('h',card=>{ - if(!get.tag(card,'damage')||get.effect(target,card,player,player)<=0) return 0; - if(get.name(card,player)==='sha'){ - if(target.getEquip('bagua')) return 0.5; - if(target.getEquip('rewrite_bagua')) return 0.25; - } - return 1; - }),ts=target.hp+target.hujia+game.countPlayer(current=>{ - if(get.attitude(current,target)>0) return current.countCards('hs')/8; - return 0; - }); - if(hs>=ts) return -hs; + ai: { + order: 13, + result: { + target: (player, target) => { + let hs = player.countCards("h", (card) => { + if ( + !get.tag(card, "damage") || + get.effect(target, card, player, player) <= 0 + ) + return 0; + if (get.name(card, player) === "sha") { + if (target.getEquip("bagua")) return 0.5; + if (target.getEquip("rewrite_bagua")) return 0.25; + } + return 1; + }), + ts = + target.hp + + target.hujia + + game.countPlayer((current) => { + if (get.attitude(current, target) > 0) + return current.countCards("hs") / 8; + return 0; + }); + if (hs >= ts) return -hs; return 0; }, }, }, - intro:{ - content:'limited' + intro: { + content: "limited", }, }, - 'drlt_xiongluan1':{ - onremove:function(player){ - player.storage.drlt_xiongluan1.removeSkill('drlt_xiongluan2'); - player.storage.drlt_xiongluan1.unmarkSkill('drlt_xiongluan1'); + drlt_xiongluan1: { + onremove: function (player) { + player.storage.drlt_xiongluan1.removeSkill("drlt_xiongluan2"); + player.storage.drlt_xiongluan1.unmarkSkill("drlt_xiongluan1"); delete player.storage.drlt_xiongluan1; }, - mod:{ - targetInRange:function(card,player,target){ - if(target.hasSkill('drlt_xiongluan2')){ + mod: { + targetInRange: function (card, player, target) { + if (target.hasSkill("drlt_xiongluan2")) { return true; } }, - cardUsableTarget:function(card,player,target){ - if(target.hasSkill('drlt_xiongluan2')) return true; + cardUsableTarget: function (card, player, target) { + if (target.hasSkill("drlt_xiongluan2")) return true; }, }, - charlotte:true, + charlotte: true, }, - 'drlt_xiongluan2':{ - mod:{ - cardEnabled2:function(card,player){ - if(get.position(card)=='h') return false; + drlt_xiongluan2: { + mod: { + cardEnabled2: function (card, player) { + if (get.position(card) == "h") return false; }, }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')) return [0,-999999]; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) return [0, -999999]; }, }, }, - charlotte:true, + charlotte: true, }, - "drlt_congjian":{ - audio:2, - audioname2:{tongyuan:'ocongjian_tongyuan'}, - trigger:{ - target:"useCardToTargeted", + drlt_congjian: { + audio: 2, + audioname2: { tongyuan: "ocongjian_tongyuan" }, + trigger: { + target: "useCardToTargeted", }, - direct:true, - filter:function(event,player){ - return get.type(event.card)=='trick'&&event.targets.length>1&&player.countCards('he')>0; + direct: true, + filter: function (event, player) { + return ( + get.type(event.card) == "trick" && + event.targets.length > 1 && + player.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:true, - selectCard:1, - position:'he', - filterTarget:function(card,player,target){ - return player!=target&&_status.event.targets.includes(target); + filterCard: true, + selectCard: 1, + position: "he", + filterTarget: function (card, player, target) { + return player != target && _status.event.targets.includes(target); }, - ai1:function(card){ - if(card.name=='du') return 20; - if(_status.event.player.storage.drlt_xiongluan&&get.type(card)=="equip") return 15; - return 6-get.value(card); + ai1: function (card) { + if (card.name == "du") return 20; + if (_status.event.player.storage.drlt_xiongluan && get.type(card) == "equip") + return 15; + return 6 - get.value(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0.1; - return 1-att; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0.1; + return 1 - att; } - return att-3; + return att - 3; }, - prompt:get.prompt2('drlt_congjian'), - targets:trigger.targets, + prompt: get.prompt2("drlt_congjian"), + targets: trigger.targets, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('drlt_congjian',target); - player.give(result.cards,target,'give'); - var num=1; - if(get.type(result.cards[0])=='equip') num=2; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("drlt_congjian", target); + player.give(result.cards, target, "give"); + var num = 1; + if (get.type(result.cards[0]) == "equip") num = 2; player.draw(num); } }, }, - drlt_wanglie:{ - locked:false, - mod:{ - targetInRange:function(card,player,target,now){ - if(game.online){ - if(!player.countUsed()) return true; - } - else{ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'&&player.getHistory('useCard',function(evt2){ - return evt2.getParent('phaseUse')==evt - }).length==0) return true; + drlt_wanglie: { + locked: false, + mod: { + targetInRange: function (card, player, target, now) { + if (game.online) { + if (!player.countUsed()) return true; + } else { + var evt = _status.event.getParent("phaseUse"); + if ( + evt && + evt.name == "phaseUse" && + player.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == evt; + }).length == 0 + ) + return true; } }, }, - audio:2, - trigger:{ - player:"useCard", + audio: 2, + trigger: { + player: "useCard", }, - filter:function(event,player){ - return player.isPhaseUsing()&&(event.card.name=='sha'||get.type(event.card)=='trick'); + filter: function (event, player) { + return ( + player.isPhaseUsing() && (event.card.name == "sha" || get.type(event.card) == "trick") + ); }, - preHidden:true, - check:function(event,player){ - if(['wuzhong','kaihua','dongzhuxianji'].includes(event.card.name)) return false; - player._wanglie_temp=true; - var eff=0; - for(var i of event.targets){ - eff+=get.effect(i,event.card,player,player); + preHidden: true, + check: function (event, player) { + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(event.card.name)) return false; + player._wanglie_temp = true; + var eff = 0; + for (var i of event.targets) { + eff += get.effect(i, event.card, player, player); } delete player._wanglie_temp; - if(eff<0) return true; - if(!player.countCards('h',function(card){ - return player.hasValueTarget(card,null,true); - })) return true; - if(get.tag(event.card,'damage')&&!player.needsToDiscard()&&!player.countCards('h',function(card){ - return get.tag(card,'damage')&&player.hasValueTarget(card,null,true); - })) return true; + if (eff < 0) return true; + if ( + !player.countCards("h", function (card) { + return player.hasValueTarget(card, null, true); + }) + ) + return true; + if ( + get.tag(event.card, "damage") && + !player.needsToDiscard() && + !player.countCards("h", function (card) { + return get.tag(card, "damage") && player.hasValueTarget(card, null, true); + }) + ) + return true; return false; }, - prompt2:function(event){ - return '令'+get.translation(event.card)+'不能被响应,然后本阶段不能再使用牌' + prompt2: function (event) { + return "令" + get.translation(event.card) + "不能被响应,然后本阶段不能再使用牌"; }, - content:function(){ - trigger.nowuxie=true; + content: function () { + trigger.nowuxie = true; trigger.directHit.addArray(game.players); - player.addTempSkill('drlt_wanglie2','phaseUseAfter'); + player.addTempSkill("drlt_wanglie2", "phaseUseAfter"); }, - ai:{ - pretao:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='pretao') return true; - if(player._wanglie_temp) return false; - player._wanglie_temp=true; - var bool=function(){ - if(['wuzhong','kaihua','dongzhuxianji'].includes(arg.card.name)) return false; - if(get.attitude(player,arg.target)>0||!player.isPhaseUsing()) return false; - var cards=player.getCards('h',function(card){ - return card!=arg.card&&(!arg.card.cards||!arg.card.cards.includes(card)); + ai: { + pretao: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "pretao") return true; + if (player._wanglie_temp) return false; + player._wanglie_temp = true; + var bool = (function () { + if (["wuzhong", "kaihua", "dongzhuxianji"].includes(arg.card.name)) return false; + if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; + var cards = player.getCards("h", function (card) { + return ( + card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) + ); }); - var sha=player.getCardUsable('sha'); - if(arg.card.name=='sha') sha--; - cards=cards.filter(function(card){ - if(card.name=='sha'&&sha<=0) return false; - return player.hasValueTarget(card,null,true); + var sha = player.getCardUsable("sha"); + if (arg.card.name == "sha") sha--; + cards = cards.filter(function (card) { + if (card.name == "sha" && sha <= 0) return false; + return player.hasValueTarget(card, null, true); }); - if(!cards.length) return true; - if(!get.tag(arg.card,'damage')) return false; - if(!player.needsToDiscard()&&!cards.filter(function(card){ - return get.tag(card,'damage'); - }).length) return true; + if (!cards.length) return true; + if (!get.tag(arg.card, "damage")) return false; + if ( + !player.needsToDiscard() && + !cards.filter(function (card) { + return get.tag(card, "damage"); + }).length + ) + return true; return false; - }(); + })(); delete player._wanglie_temp; return bool; }, }, }, - "drlt_wanglie2":{ - mod:{ - cardEnabled:function(card,player){ + drlt_wanglie2: { + mod: { + cardEnabled: function (card, player) { return false; }, }, }, - liangyin:{ - audio:2, - group:["liangyin_1","liangyin_2"], - subSkill:{ - "1":{ - trigger:{ - global:["loseAfter","addToExpansionAfter","cardsGotoSpecialAfter",'loseAsyncAfter'], + liangyin: { + audio: 2, + group: ["liangyin_1", "liangyin_2"], + subSkill: { + 1: { + trigger: { + global: [ + "loseAfter", + "addToExpansionAfter", + "cardsGotoSpecialAfter", + "loseAsyncAfter", + ], }, - filter:function(event,player,name){ - if(event.name=='lose'||event.name=='loseAsync') return event.getlx!==false&&event.toStorage==true; - if(event.name=='cardsGotoSpecial') return !event.notrigger; + filter: function (event, player, name) { + if (event.name == "lose" || event.name == "loseAsync") + return event.getlx !== false && event.toStorage == true; + if (event.name == "cardsGotoSpecial") return !event.notrigger; return true; }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget('是否发动【良姻】令手牌数大于你的一名角色摸一张牌?',function(card,player,target){ - return target!=player&&target.countCards('h')>player.countCards('h'); - }).ai=function(target){ - return get.attitude(player,target); + direct: true, + content: function () { + "step 0"; + player.chooseTarget( + "是否发动【良姻】令手牌数大于你的一名角色摸一张牌?", + function (card, player, target) { + return ( + target != player && target.countCards("h") > player.countCards("h") + ); + } + ).ai = function (target) { + return get.attitude(player, target); }; - "step 1" - if(result.bool){ - player.logSkill('liangyin',result.targets); + ("step 1"); + if (result.bool) { + player.logSkill("liangyin", result.targets); result.targets[0].draw(); } }, - sub:true, + sub: true, }, - "2":{ - trigger:{ - global:"gainAfter", + 2: { + trigger: { + global: "gainAfter", }, - filter:function(event,player){ - return event.fromStorage==true||game.hasPlayer2(function(current){ - var evt=event.getl(current); - return evt&&evt.xs&&evt.xs.length>0; - }); + filter: function (event, player) { + return ( + event.fromStorage == true || + game.hasPlayer2(function (current) { + var evt = event.getl(current); + return evt && evt.xs && evt.xs.length > 0; + }) + ); }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget('是否发动【良姻】令手牌数小于你的一名角色弃置一张牌?',function(card,player,target){ - return target!=player&&target.countCards('h')0; - }).ai=function(target){ - return -get.attitude(player,target); + direct: true, + content: function () { + "step 0"; + player.chooseTarget( + "是否发动【良姻】令手牌数小于你的一名角色弃置一张牌?", + function (card, player, target) { + return ( + target != player && + target.countCards("h") < player.countCards("h") && + target.countCards("he") > 0 + ); + } + ).ai = function (target) { + return -get.attitude(player, target); }; - "step 1" - if(result.bool){ - player.logSkill('liangyin',result.targets); - result.targets[0].chooseToDiscard('he',1,true); + ("step 1"); + if (result.bool) { + player.logSkill("liangyin", result.targets); + result.targets[0].chooseToDiscard("he", 1, true); } }, - sub:true, + sub: true, }, }, }, - kongsheng:{ - audio:2, - trigger:{ - player:"phaseZhunbeiBegin", + kongsheng: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", }, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt('kongsheng'),'将任意张牌置于武将牌上','he',[1,player.countCards('he')]).set('ai',function(card){ - if(get.position(card)=='e') return 1-get.value(card); - if(card.name=='shan'||card.name=='du'||!player.hasValueTarget(card)) return 1; - return 4-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('kongsheng'); - player.addSkill('kongsheng2'); - player.addToExpansion(result.cards,'log','give',player).gaintag.add('kongsheng2'); + content: function () { + "step 0"; + player + .chooseCard(get.prompt("kongsheng"), "将任意张牌置于武将牌上", "he", [ + 1, + player.countCards("he"), + ]) + .set("ai", function (card) { + if (get.position(card) == "e") return 1 - get.value(card); + if (card.name == "shan" || card.name == "du" || !player.hasValueTarget(card)) + return 1; + return 4 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("kongsheng"); + player.addSkill("kongsheng2"); + player.addToExpansion(result.cards, "log", "give", player).gaintag.add("kongsheng2"); } }, }, - kongsheng_ai:{ai:{reverseOrder:true}}, - kongsheng2:{ - audio:'kongsheng', - marktext:"箜", - intro:{ - content:"expansion", - markcount:'expansion', + kongsheng_ai: { ai: { reverseOrder: true } }, + kongsheng2: { + audio: "kongsheng", + marktext: "箜", + intro: { + content: "expansion", + markcount: "expansion", }, - trigger:{ - player:"phaseJieshuBegin", + trigger: { + player: "phaseJieshuBegin", }, - filter:function(event,player){ - return player.getExpansions('kongsheng2').length>0; + filter: function (event, player) { + return player.getExpansions("kongsheng2").length > 0; }, - forced:true, - charlotte:true, - content:function(){ - 'step 0' - player.addTempSkill('kongsheng_ai','kongsheng2After'); - 'step 1' - var cards=player.getExpansions('kongsheng2').filter(function(i){ - return get.type(i,false)=='equip'&&player.hasUseTarget(i); - }); - if(cards.length==1){ - event._result={bool:true,links:cards} - } - else if(cards.length) player.chooseButton(true,['选择要使用的装备牌',cards]).set('ai',function(button){ - return get.order(button.link); + forced: true, + charlotte: true, + content: function () { + "step 0"; + player.addTempSkill("kongsheng_ai", "kongsheng2After"); + ("step 1"); + var cards = player.getExpansions("kongsheng2").filter(function (i) { + return get.type(i, false) == "equip" && player.hasUseTarget(i); }); + if (cards.length == 1) { + event._result = { bool: true, links: cards }; + } else if (cards.length) + player.chooseButton(true, ["选择要使用的装备牌", cards]).set("ai", function (button) { + return get.order(button.link); + }); else event.goto(3); - 'step 2' - if(result.bool){ - player.chooseUseTarget(result.links[0],true); + ("step 2"); + if (result.bool) { + player.chooseUseTarget(result.links[0], true); event.goto(1); } - 'step 3' - var cards=player.getExpansions('kongsheng2'); - if(cards.length) player.gain(cards,'gain2'); + ("step 3"); + var cards = player.getExpansions("kongsheng2"); + if (cards.length) player.gain(cards, "gain2"); }, }, - nzry_juzhan:{ - audio:"nzry_juzhan_1", - mark:true, - locked:false, - zhuanhuanji:true, - marktext:'☯', - intro:{ - content:function(storage,player,skill){ - if(player.storage.nzry_juzhan==true) return '当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌'; - return '当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌'; + nzry_juzhan: { + audio: "nzry_juzhan_1", + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player, skill) { + if (player.storage.nzry_juzhan == true) + return "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌"; + return "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌"; }, }, - group:["nzry_juzhan_1","nzry_juzhan_2"], - subSkill:{ - '1':{ - audio:2, - trigger:{ - target:'useCardToTargeted' + group: ["nzry_juzhan_1", "nzry_juzhan_2"], + subSkill: { + 1: { + audio: 2, + trigger: { + target: "useCardToTargeted", }, - prompt2:'当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。', - filter:function(event,player){ - return event.card.name=='sha'&&!player.storage.nzry_juzhan; + prompt2: + "当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。", + filter: function (event, player) { + return event.card.name == "sha" && !player.storage.nzry_juzhan; }, - logTarget:'player', - content:function(){ - 'step 0' - game.asyncDraw([player,trigger.player]); - trigger.player.addTempSkill('nzry_juzhany'); - player.changeZhuanhuanji('nzry_juzhan'); - player.addTempSkill('nzry_juzhanx'); - 'step 1' + logTarget: "player", + content: function () { + "step 0"; + game.asyncDraw([player, trigger.player]); + trigger.player.addTempSkill("nzry_juzhany"); + player.changeZhuanhuanji("nzry_juzhan"); + player.addTempSkill("nzry_juzhanx"); + ("step 1"); game.delayx(); }, }, - '2':{ - audio:"nzry_juzhan_1", - trigger:{ - player:'useCardToPlayered' + 2: { + audio: "nzry_juzhan_1", + trigger: { + player: "useCardToPlayered", }, - prompt2:'当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌', - filter:function(event,player){ - return event.card.name=='sha'&&player.storage.nzry_juzhan==true&&event.target.countGainableCards(player,'he')>0; + prompt2: + "当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌", + filter: function (event, player) { + return ( + event.card.name == "sha" && + player.storage.nzry_juzhan == true && + event.target.countGainableCards(player, "he") > 0 + ); }, - check:function(event,player){ - return event.player.countCards('he')>0&&event.targets&&event.targets.length==1; + check: function (event, player) { + return ( + event.player.countCards("he") > 0 && + event.targets && + event.targets.length == 1 + ); }, - logTarget:'target', - content:function(){ - player.gainPlayerCard(trigger.targets[0],'he',true); - player.changeZhuanhuanji('nzry_juzhan'); - trigger.target.addTempSkill('nzry_juzhanx'); - player.addTempSkill('nzry_juzhany'); + logTarget: "target", + content: function () { + player.gainPlayerCard(trigger.targets[0], "he", true); + player.changeZhuanhuanji("nzry_juzhan"); + trigger.target.addTempSkill("nzry_juzhanx"); + player.addTempSkill("nzry_juzhany"); }, }, }, }, - nzry_juzhanx:{ - mod:{ - targetEnabled:function(card,player,target){ - if(player.hasSkill('nzry_juzhany')) return false; + nzry_juzhanx: { + mod: { + targetEnabled: function (card, player, target) { + if (player.hasSkill("nzry_juzhany")) return false; }, }, }, - nzry_juzhany:{}, - nzry_feijun:{ - init:(player)=>{ - if(!Array.isArray(player.storage.nzry_feijun)) player.storage.nzry_feijun=[]; + nzry_juzhany: {}, + nzry_feijun: { + init: (player) => { + if (!Array.isArray(player.storage.nzry_feijun)) player.storage.nzry_feijun = []; }, - intro:{ - content:function(storage){ - if(!storage||!storage.length) return '尚未发动'; - var str=get.translation(storage); - return '已对'+str+'发动过〖飞军〗'; + intro: { + content: function (storage) { + if (!storage || !storage.length) return "尚未发动"; + var str = get.translation(storage); + return "已对" + str + "发动过〖飞军〗"; }, }, - mark:true, - enable:"phaseUse", - usable:1, - position:"he", - audio:2, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('h')>=player.countCards('h'); - })||game.hasPlayer(function(current){ - return current.countCards('e')>=player.countCards('e'); - })>0; + mark: true, + enable: "phaseUse", + usable: 1, + position: "he", + audio: 2, + filter: function (event, player) { + return ( + game.hasPlayer(function (current) { + return current.countCards("h") >= player.countCards("h"); + }) || + game.hasPlayer(function (current) { + return current.countCards("e") >= player.countCards("e"); + }) > 0 + ); }, - filterCard:true, - check:function(card){ - return 5-get.value(card); + filterCard: true, + check: function (card) { + return 5 - get.value(card); }, - content:function(){ - 'step 0' - var list=[]; - if(game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h'); - })) list.push('令一名手牌数大于你的角色交给你一张牌'); - if(game.hasPlayer(function(current){ - return current.countCards('e')>player.countCards('e'); - })>0) list.push('令一名装备区内牌数大于你的角色弃置一张装备牌'); - if(list.length==0) event.finish(); - else if(list.length<2){ - if(game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h'); - })) event._result={index:0}; - else event._result={index:1}; + content: function () { + "step 0"; + var list = []; + if ( + game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h"); + }) + ) + list.push("令一名手牌数大于你的角色交给你一张牌"); + if ( + game.hasPlayer(function (current) { + return current.countCards("e") > player.countCards("e"); + }) > 0 + ) + list.push("令一名装备区内牌数大于你的角色弃置一张装备牌"); + if (list.length == 0) event.finish(); + else if (list.length < 2) { + if ( + game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h"); + }) + ) + event._result = { index: 0 }; + else event._result = { index: 1 }; + } else { + player + .chooseControl() + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return ( + current.countCards("h") > player.countCards("h") && + get.attitude(player, current) < 0 + ); + }) + ) + return 0; + return 1; + }) + .set("choiceList", list); } - else{ - player.chooseControl().set('ai',function(){ - if(game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h')&&get.attitude(player,current)<0 - })) return 0; - return 1; - }).set('choiceList',list); - } - 'step 1' - event.index=result.index; - if(result.index==0){ - player.chooseTarget(function(card,player,target){ - return target!=player&&target.countCards('h')>player.countCards('h'); - },'选择一名手牌数大于你的角色').set('ai',function(target){ - return -get.attitude(player,target) - }); - } - else{ - player.chooseTarget(function(card,player,target){ - return target.countCards('e')>player.countCards('e')&&target!=player; - },'选择一名装备区里牌数大于你的角色').ai=function(target){ - return -get.attitude(player,target) + ("step 1"); + event.index = result.index; + if (result.index == 0) { + player + .chooseTarget(function (card, player, target) { + return target != player && target.countCards("h") > player.countCards("h"); + }, "选择一名手牌数大于你的角色") + .set("ai", function (target) { + return -get.attitude(player, target); + }); + } else { + player.chooseTarget(function (card, player, target) { + return target.countCards("e") > player.countCards("e") && target != player; + }, "选择一名装备区里牌数大于你的角色").ai = function (target) { + return -get.attitude(player, target); }; } - 'step 2' - if(result.bool){ - event.target=result.targets[0]; - var list=player.getStorage('nzry_feijun'); - if(!list.includes(event.target)){ - event._nzry_binglve=true; - player.markAuto('nzry_feijun',[event.target]); + ("step 2"); + if (result.bool) { + event.target = result.targets[0]; + var list = player.getStorage("nzry_feijun"); + if (!list.includes(event.target)) { + event._nzry_binglve = true; + player.markAuto("nzry_feijun", [event.target]); } - player.line(event.target,'green'); - if(event.index==0){ - event.target.chooseCard('he',true,'选择一张牌交给'+get.translation(player)).set('ai',function(card){ - return 6-get.value(card); - }); - } - else{ - event.target.chooseToDiscard('he',true,{type:'equip'},'请弃置一张装备牌'); + player.line(event.target, "green"); + if (event.index == 0) { + event.target + .chooseCard("he", true, "选择一张牌交给" + get.translation(player)) + .set("ai", function (card) { + return 6 - get.value(card); + }); + } else { + event.target.chooseToDiscard("he", true, { type: "equip" }, "请弃置一张装备牌"); event.finish(); } - } - else{ + } else { event.finish(); } - 'step 3' - if(result.bool){ - target.give(result.cards,player); + ("step 3"); + if (result.bool) { + target.give(result.cards, player); } }, - ai:{ - order:11, - result:{ - player:function(player){ - if(game.hasPlayer(function(current){ - return (current.countCards('h')>player.countCards('h')||current.countCards('e')>player.countCards('e'))&&get.attitude(player,current)<0&&player.getStorage('nzry_feijun').includes(current); - })||game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h')&&get.attitude(player,current)<0; - })||(player.countCards('h')>=2&&game.hasPlayer(function(current){ - return current.countCards('e')>player.countCards('e')&&get.attitude(player,current)<0; - }))) return 1; + ai: { + order: 11, + result: { + player: function (player) { + if ( + game.hasPlayer(function (current) { + return ( + (current.countCards("h") > player.countCards("h") || + current.countCards("e") > player.countCards("e")) && + get.attitude(player, current) < 0 && + player.getStorage("nzry_feijun").includes(current) + ); + }) || + game.hasPlayer(function (current) { + return ( + current.countCards("h") > player.countCards("h") && + get.attitude(player, current) < 0 + ); + }) || + (player.countCards("h") >= 2 && + game.hasPlayer(function (current) { + return ( + current.countCards("e") > player.countCards("e") && + get.attitude(player, current) < 0 + ); + })) + ) + return 1; }, }, }, }, - nzry_binglve:{ - audio:2, - trigger:{player:'nzry_feijunAfter'}, - forced:true, - filter:function(event,player){ - return event._nzry_binglve==true; + nzry_binglve: { + audio: 2, + trigger: { player: "nzry_feijunAfter" }, + forced: true, + filter: function (event, player) { + return event._nzry_binglve == true; }, - content:function(){ - player.draw(2) + content: function () { + player.draw(2); }, - ai:{combo:'nzry_feijun'}, + ai: { combo: "nzry_feijun" }, }, - nzry_huaiju_ai:{ - charlotte:true, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(!player.hasMark('nzry_huaiju')) return false; - if(!game.hasPlayer(function(current){ - return current.hasSkill('tachibana_effect'); - })) return false; - if(arg&&arg.player){ - if(arg.player.hasSkillTag('jueqing',false,player)) return false; + nzry_huaiju_ai: { + charlotte: true, + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (!player.hasMark("nzry_huaiju")) return false; + if ( + !game.hasPlayer(function (current) { + return current.hasSkill("tachibana_effect"); + }) + ) + return false; + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; } }, }, }, - "nzry_huaiju":{ - marktext:"橘", - intro:{ - name:'怀橘', - name2:'橘', - content:'当前有#个“橘”', + nzry_huaiju: { + marktext: "橘", + intro: { + name: "怀橘", + name2: "橘", + content: "当前有#个“橘”", }, - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - player.addMark('nzry_huaiju',3); - player.addSkill('nzry_huaiju_ai'); + content: function () { + player.addMark("nzry_huaiju", 3); + player.addSkill("nzry_huaiju_ai"); }, - group:['tachibana_effect'], + group: ["tachibana_effect"], }, //没错 这是个橘 - tachibana_effect:{ - audio:'nzry_huaiju', - trigger:{ - global:['damageBegin4','phaseDrawBegin2'], + tachibana_effect: { + audio: "nzry_huaiju", + trigger: { + global: ["damageBegin4", "phaseDrawBegin2"], }, - forced:true, - filter:function(event,player){ - return event.player.hasMark('nzry_huaiju')&&(event.name=='damage'||!event.numFixed); + forced: true, + filter: function (event, player) { + return event.player.hasMark("nzry_huaiju") && (event.name == "damage" || !event.numFixed); }, - content:function(){ - player.line(trigger.player,'green'); - if(trigger.name=='damage'){ + content: function () { + player.line(trigger.player, "green"); + if (trigger.name == "damage") { trigger.cancel(); - trigger.player.removeMark('nzry_huaiju',1); - } - else trigger.num++; + trigger.player.removeMark("nzry_huaiju", 1); + } else trigger.num++; }, }, - "nzry_yili":{ - audio:2, - trigger:{ - player:"phaseUseBegin", + nzry_yili: { + audio: 2, + trigger: { + player: "phaseUseBegin", }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('nzry_yili'),"移去一个【橘】或失去1点体力,然后令一名其他角色获得一个【橘】",function(card,player,target){ - return target!=player - }).ai=function(target){ - var player=_status.event.player; - if(player.storage.nzry_huaiju>2||player.hp>2) return get.attitude(player,target); + direct: true, + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("nzry_yili"), + "移去一个【橘】或失去1点体力,然后令一名其他角色获得一个【橘】", + function (card, player, target) { + return target != player; + } + ).ai = function (target) { + var player = _status.event.player; + if (player.storage.nzry_huaiju > 2 || player.hp > 2) + return get.attitude(player, target); return -1; }; - 'step 1' - if(result.bool){ - event.target=result.targets[0]; - if(player.hasMark('nzry_huaiju')){ - player.chooseControl().set('choiceList',['失去1点体力','移去一个“橘”']).set('ai',function(){ - if(player.hp>2) return 0; - return 1; - }); - } - else event._result={index:0}; - }else{ + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + if (player.hasMark("nzry_huaiju")) { + player + .chooseControl() + .set("choiceList", ["失去1点体力", "移去一个“橘”"]) + .set("ai", function () { + if (player.hp > 2) return 0; + return 1; + }); + } else event._result = { index: 0 }; + } else { event.finish(); } - 'step 2' - player.logSkill('nzry_yili',target); - if(result.index==1){ - player.removeMark('nzry_huaiju',1); - }else{ + ("step 2"); + player.logSkill("nzry_yili", target); + if (result.index == 1) { + player.removeMark("nzry_huaiju", 1); + } else { player.loseHp(); } - target.addMark('nzry_huaiju',1); - target.addSkill('nzry_huaiju_ai'); + target.addMark("nzry_huaiju", 1); + target.addSkill("nzry_huaiju_ai"); + }, + ai: { + combo: "nzry_huaiju", }, - ai:{ - combo:'nzry_huaiju' - } }, - "nzry_zhenglun":{ - audio:2, - trigger:{ - player:'phaseDrawBefore' + nzry_zhenglun: { + audio: 2, + trigger: { + player: "phaseDrawBefore", }, - filter:function(event,player){ - return !player.hasMark('nzry_huaiju'); + filter: function (event, player) { + return !player.hasMark("nzry_huaiju"); }, - check:function(event,player){ - return player.countCards('h')>=2||player.skipList.includes('phaseUse'); + check: function (event, player) { + return player.countCards("h") >= 2 || player.skipList.includes("phaseUse"); }, - content:function(){ + content: function () { trigger.cancel(); - player.addMark('nzry_huaiju',1); + player.addMark("nzry_huaiju", 1); + }, + ai: { + combo: "nzry_huaiju", }, - ai:{ - combo:'nzry_huaiju' - } }, - "nzry_kuizhu":{ - audio:2, - trigger:{ - player:"phaseDiscardAfter", + nzry_kuizhu: { + audio: 2, + trigger: { + player: "phaseDiscardAfter", }, - direct:true, - filter:function(event,player){ - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2); + direct: true, + filter: function (event, player) { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) + cards.addArray(evt.cards2); }); - return cards.length>0; + return cards.length > 0; }, - content:function(){ - 'step 0' - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2); + content: function () { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) + cards.addArray(evt.cards2); }); - event.num=cards.length; - event.str1='令至多'+event.num+'名角色摸一张牌'; - event.str2='对任意名体力值之和为'+event.num+'的角色造成1点伤害'; - player.chooseControl('cancel2').set('ai',function(){ - if(game.countPlayer(function(current){return get.attitude(player,current)<0&¤t.hp==event.num})>0&&event.num<=3) return 1; - return 0; - }).set('choiceList',[event.str1,event.str2]).set('prompt','是否发动【溃诛】?'); - 'step 1' - if(result.control=='cancel2') event.finish(); - event.control=[event.str1,event.str2][result.index]; - 'step 2' - var str='请选择〖溃诛〗的目标'; - if(event.bool==false) str='
    所选目标体力之和不足'+event.num+',请重选'; - if(event.control==event.str2){ - player.chooseTarget(str,function(card,player,target){ - var targets=ui.selected.targets; - var num=0; - for(var i=0;i 0 && + event.num <= 3 + ) + return 1; + return 0; + }) + .set("choiceList", [event.str1, event.str2]) + .set("prompt", "是否发动【溃诛】?"); + ("step 1"); + if (result.control == "cancel2") event.finish(); + event.control = [event.str1, event.str2][result.index]; + ("step 2"); + var str = "请选择〖溃诛〗的目标"; + if (event.bool == false) str = "
    所选目标体力之和不足" + event.num + ",请重选"; + if (event.control == event.str2) { + player + .chooseTarget(str, function (card, player, target) { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) { + num += targets[i].hp; + } + return num + target.hp <= _status.event.num; + }) + .set("ai", function (target) { + if (ui.selected.targets[0] != undefined) return -1; + return get.attitude(player, target) < 0; + }) + .set("promptbar", "none") + .set("num", event.num) + .set("selectTarget", function () { + var targets = ui.selected.targets; + var num = 0; + for (var i = 0; i < targets.length; i++) { + num += targets[i].hp; + } + if (num == _status.event.num) return ui.selected.targets.length; + return ui.selected.targets.length + 1; + }); + } else { + player.chooseTarget("请选择〖溃诛〗的目标", [1, event.num]).ai = function (target) { + return get.attitude(player, target); }; } - 'step 3' - if(result.bool){ - var targets=result.targets.sortBySeat(); - if(event.control==event.str1){ + ("step 3"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + if (event.control == event.str1) { //player.line(targets); - player.logSkill('nzry_kuizhu',targets); + player.logSkill("nzry_kuizhu", targets); game.asyncDraw(targets); - } - else{ - var num=0; - for(var i=0;i=2) player.loseHp(); @@ -2085,5222 +2547,5918 @@ game.import('character', function () { } }, }, - rechezheng:{ - audio:'nzry_zhizheng', - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - return player.isPhaseUsing()&&!player.inRangeOf(event.player); + rechezheng: { + audio: "nzry_zhizheng", + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return player.isPhaseUsing() && !player.inRangeOf(event.player); }, - forced:true, - logTarget:'player', - content:function(){ + forced: true, + logTarget: "player", + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(get.tag(card,'damage')&&!player.inRangeOf(target)) return 'zerotarget'; + ai: { + effect: { + player: function (card, player, target) { + if (get.tag(card, "damage") && !player.inRangeOf(target)) return "zerotarget"; }, }, }, }, - nzry_zhizheng:{ - audio:2, + nzry_zhizheng: { + audio: 2, //mod:{ // playerEnabled:function(card,player,target){ // var info=get.info(card); // if(target!=player&&(!info||!info.singleCard||!ui.selected.targets.length)&&player.isPhaseUsing()&&!target.inRange(player)) return false; // }, //}, - trigger:{ - player:'phaseUseEnd' + trigger: { + player: "phaseUseEnd", }, - forced:true, - filter:function(event,player){ - return (player.getHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==event; - }).length1?'中的一人':''),function(card,player,target){ - return player!=target&&target.hasZhuSkill('nzry_lijun',player); - }).ai=function(target){ - return get.attitude(_status.event.player,target); + player.chooseTarget( + get.prompt("nzry_lijun"), + "将" + + get.translation(trigger.cards) + + "交给" + + get.translation(list) + + (list.length > 1 ? "中的一人" : ""), + function (card, player, target) { + return player != target && target.hasZhuSkill("nzry_lijun", player); + } + ).ai = function (target) { + return get.attitude(_status.event.player, target); }; - 'step 1' - if(!result.bool) event.finish(); - else{ - player.addTempSkill('nzry_lijun2','phaseUseEnd'); - var zhu=result.targets[0]; - player.line(zhu,'green'); - zhu.logSkill('nzry_lijun'); - var list=[]; - for(var i=0;i0) return true; - return false; - }).set('prompt','是否令'+get.translation(player)+'摸一张牌?'); + zhu.gain(list, "gain2").giver = player; + zhu.chooseBool() + .set("ai", function () { + if (get.attitude(zhu, player) > 0) return true; + return false; + }) + .set("prompt", "是否令" + get.translation(player) + "摸一张牌?"); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.draw(); - player.addMark('nzry_lijun2',1,false); + player.addMark("nzry_lijun2", 1, false); } }, }, - nzry_chenglve:{ - mark:true, - locked:false, - zhuanhuanji:true, - marktext:'☯', - intro:{ - content:function(storage,player,skill){ - var str=player.storage.nzry_chenglve?'出牌阶段限一次,你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制':'出牌阶段限一次,你可以摸一张牌,然后弃置两张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制'; - if(player.storage.nzry_chenglve1){ - str+='
  • 当前花色:'; - str+=get.translation(player.storage.nzry_chenglve1); + nzry_chenglve: { + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player, skill) { + var str = player.storage.nzry_chenglve + ? "出牌阶段限一次,你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制" + : "出牌阶段限一次,你可以摸一张牌,然后弃置两张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制"; + if (player.storage.nzry_chenglve1) { + str += "
  • 当前花色:"; + str += get.translation(player.storage.nzry_chenglve1); } return str; }, }, - enable:"phaseUse", - usable:1, - audio:2, - content:function(){ - 'step 0' - if(player.storage.nzry_chenglve==true){ + enable: "phaseUse", + usable: 1, + audio: 2, + content: function () { + "step 0"; + if (player.storage.nzry_chenglve == true) { player.draw(2); - player.chooseToDiscard('h',true); - } - else{ + player.chooseToDiscard("h", true); + } else { player.draw(); - player.chooseToDiscard('h',2,true); + player.chooseToDiscard("h", 2, true); } - player.changeZhuanhuanji('nzry_chenglve') - 'step 1' - if(result.bool){ - player.storage.nzry_chenglve1=[]; - for(var i=0;i1?'以任意顺序':'')+'置于牌堆顶,然后摸一张牌'; + nzry_shicai: { + audio: "nzry_shicai_2", + trigger: { player: ["useCardAfter", "useCardToTargeted"] }, + prompt2: function (event, player) { + const cards = event.cards.filterInD("oe"); + return ( + "你可以将" + + get.translation(cards) + + (cards.length > 1 ? "以任意顺序" : "") + + "置于牌堆顶,然后摸一张牌" + ); }, - filter:function(event,player){ - if(!event.cards.someInD()) return false; - let evt=event,type=get.type2(evt.card,false); - if(event.name=='useCardToTargeted'){ - if(type!='equip'||player!=event.target) return false; - evt=evt.getParent(); + filter: function (event, player) { + if (!event.cards.someInD()) return false; + let evt = event, + type = get.type2(evt.card, false); + if (event.name == "useCardToTargeted") { + if (type != "equip" || player != event.target) return false; + evt = evt.getParent(); + } else { + if (type == "equip") return false; } - else{ - if(type=='equip') return false; - } - return !player.hasHistory('useCard',evtx=>{ - return evtx!=evt&&get.type2(evtx.card,false)==type; - },evt); + return !player.hasHistory( + "useCard", + (evtx) => { + return evtx != evt && get.type2(evtx.card, false) == type; + }, + evt + ); }, - check:function(event,player){ - if(get.type(event.card)=='equip'){ - if(get.subtype(event.card)=='equip6') return true; - if(get.equipResult(player,player,event.card.name)<=0) return true; - var eff1=player.getUseValue(event.card); - var subtype=get.subtype(event.card); - return player.countCards('h',function(card){ - return get.subtype(card)==subtype&&player.getUseValue(card)>=eff1; - })>0; + check: function (event, player) { + if (get.type(event.card) == "equip") { + if (get.subtype(event.card) == "equip6") return true; + if (get.equipResult(player, player, event.card.name) <= 0) return true; + var eff1 = player.getUseValue(event.card); + var subtype = get.subtype(event.card); + return ( + player.countCards("h", function (card) { + return get.subtype(card) == subtype && player.getUseValue(card) >= eff1; + }) > 0 + ); } return true; }, - content:function(){ - 'step 0' - var cards=trigger.cards.filterInD(); - if(cards.length==1){ - event._result={bool:true,moved:[cards]}; - } - else{ - var next=player.chooseToMove('恃才:将牌按顺序置于牌堆顶',true); - next.set('list',[['牌堆顶',cards]]); - next.set('reverse',((_status.currentPhase&&_status.currentPhase.next)?get.attitude(player,_status.currentPhase.next)>0:false)); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0); - cards.sort(function(a,b){ - return (_status.event.reverse?1:-1)*(get.value(b)-get.value(a)); + content: function () { + "step 0"; + var cards = trigger.cards.filterInD(); + if (cards.length == 1) { + event._result = { bool: true, moved: [cards] }; + } else { + var next = player.chooseToMove("恃才:将牌按顺序置于牌堆顶", true); + next.set("list", [["牌堆顶", cards]]); + next.set( + "reverse", + _status.currentPhase && _status.currentPhase.next + ? get.attitude(player, _status.currentPhase.next) > 0 + : false + ); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0); + cards.sort(function (a, b) { + return (_status.event.reverse ? 1 : -1) * (get.value(b) - get.value(a)); }); return [cards]; }); } - 'step 1' - if(result.bool){ - var cards=result.moved[0]; + ("step 1"); + if (result.bool) { + var cards = result.moved[0]; cards.reverse(); - game.cardsGotoPile(cards,'insert'); - game.log(player,'将',cards,'置于了牌堆顶'); + game.cardsGotoPile(cards, "insert"); + game.log(player, "将", cards, "置于了牌堆顶"); } player.draw(); }, - subSkill:{'2':{audio:2}}, - ai:{ - reverseOrder:true, - skillTagFilter:function(player){ - if(player.getHistory('useCard',function(evt){ - return get.type(evt.card)=='equip'; - }).length>0) return false; + subSkill: { 2: { audio: 2 } }, + ai: { + reverseOrder: true, + skillTagFilter: function (player) { + if ( + player.getHistory("useCard", function (evt) { + return get.type(evt.card) == "equip"; + }).length > 0 + ) + return false; }, - effect:{ - target:function(card,player,target){ - if(player==target&&get.type(card)=='equip'&&!player.getHistory('useCard',function(evt){ - return get.type(evt.card)=='equip'; - }).length) return [1,3]; + effect: { + target: function (card, player, target) { + if ( + player == target && + get.type(card) == "equip" && + !player.getHistory("useCard", function (evt) { + return get.type(evt.card) == "equip"; + }).length + ) + return [1, 3]; }, }, }, }, - "nzry_cunmu":{ - audio:2, - audioname:['ol_pengyang'], - trigger:{ - player:'drawBegin' + nzry_cunmu: { + audio: 2, + audioname: ["ol_pengyang"], + trigger: { + player: "drawBegin", }, - forced:true, - content:function(){ - trigger.bottom=true; + forced: true, + content: function () { + trigger.bottom = true; }, }, - nzry_mingren:{ - audio:"nzry_mingren_1", - audioname:['sb_yl_luzhi'], - marktext:"任", - intro:{ - content:'expansion', - markcount:'expansion', + nzry_mingren: { + audio: "nzry_mingren_1", + audioname: ["sb_yl_luzhi"], + marktext: "任", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:["nzry_mingren_1","nzry_mingren_2"], - subSkill:{ - 1:{ - audio:2, - audioname:['sb_yl_luzhi'], - trigger:{ - global:'phaseBefore', - player:'enterGame', + group: ["nzry_mingren_1", "nzry_mingren_2"], + subSkill: { + 1: { + audio: 2, + audioname: ["sb_yl_luzhi"], + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&!player.getExpansions('nzry_mingren').length; + forced: true, + locked: false, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + !player.getExpansions("nzry_mingren").length + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(2); - 'step 1' - if(!player.countCards('h')) event.finish(); - else player.chooseCard('h','将一张手牌置于武将牌上,称为“任”',true).set('ai',function(card){ - return 6-get.value(card); - }); - 'step 2' - if(result.bool){ - player.addToExpansion(result.cards[0],player,'give','log').gaintag.add('nzry_mingren'); + ("step 1"); + if (!player.countCards("h")) event.finish(); + else + player + .chooseCard("h", "将一张手牌置于武将牌上,称为“任”", true) + .set("ai", function (card) { + return 6 - get.value(card); + }); + ("step 2"); + if (result.bool) { + player + .addToExpansion(result.cards[0], player, "give", "log") + .gaintag.add("nzry_mingren"); } }, }, - 2:{ - trigger:{ - player:'phaseJieshuBegin', + 2: { + trigger: { + player: "phaseJieshuBegin", }, - filter:function(event,player){ - return player.countCards('h')>0&&player.getExpansions('nzry_mingren').length>0; + filter: function (event, player) { + return ( + player.countCards("h") > 0 && player.getExpansions("nzry_mingren").length > 0 + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('nzry_mingren'),'选择一张手牌替换“任”('+get.translation(player.getExpansions('nzry_mingren')[0])+')').set('ai',function(card){ - var player=_status.event.player; - var color=get.color(card); - if(color==get.color(player.getExpansions('nzry_mingren')[0])) return false; - var num=0; - var list=[]; - player.countCards('h',function(cardx){ - if(cardx!=card||get.color(cardx)!=color) return false; - if(list.includes(cardx.name)) return false; - list.push(cardx.name); - switch(cardx.name){ - case 'wuxie':num+=(game.countPlayer()/2.2);break; - case 'caochuan':num+=1.1;break; - case 'shan':num+=1;break; - } + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + "h", + get.prompt("nzry_mingren"), + "选择一张手牌替换“任”(" + + get.translation(player.getExpansions("nzry_mingren")[0]) + + ")" + ) + .set("ai", function (card) { + var player = _status.event.player; + var color = get.color(card); + if (color == get.color(player.getExpansions("nzry_mingren")[0])) + return false; + var num = 0; + var list = []; + player.countCards("h", function (cardx) { + if (cardx != card || get.color(cardx) != color) return false; + if (list.includes(cardx.name)) return false; + list.push(cardx.name); + switch (cardx.name) { + case "wuxie": + num += game.countPlayer() / 2.2; + break; + case "caochuan": + num += 1.1; + break; + case "shan": + num += 1; + break; + } + }); + return num * (30 - get.value(card)); }); - return num*(30-get.value(card)); - }); - 'step 1' - if(result.bool){ - player.logSkill('nzry_mingren'); - player.addToExpansion(result.cards[0],'log','give',player).gaintag.add('nzry_mingren'); - var card=player.getExpansions('nzry_mingren')[0]; - if(card) player.gain(card,'gain2'); + ("step 1"); + if (result.bool) { + player.logSkill("nzry_mingren"); + player + .addToExpansion(result.cards[0], "log", "give", player) + .gaintag.add("nzry_mingren"); + var card = player.getExpansions("nzry_mingren")[0]; + if (card) player.gain(card, "gain2"); } }, }, }, - ai:{ - combo:'nzry_zhenliang', + ai: { + combo: "nzry_zhenliang", }, }, - "nzry_zhenliang":{ - audio:"nzry_zhenliang_1", - mark:true, - locked:false, - zhuanhuanji:true, - marktext:'☯', - intro:{ - content:function(storage,player,skill){ - if(player.storage.nzry_zhenliang==true) return '当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; - return '出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。'; + nzry_zhenliang: { + audio: "nzry_zhenliang_1", + mark: true, + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player, skill) { + if (player.storage.nzry_zhenliang == true) + return "当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。"; + return "出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。"; }, }, - group:["nzry_zhenliang_1","nzry_zhenliang_2"], - subSkill:{ - 1:{ - prompt:'弃置一张与“任”颜色相同的牌,并对攻击范围内的一名角色造成1点伤害。', - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(player.storage.nzry_zhenliang) return false; - var storage=player.getExpansions('nzry_mingren'); - if(!storage.length) return false; - var color=get.color(storage[0]); - if(player.countCards('he',function(card){ - return get.color(card)==color; - })==0) return false; - return game.hasPlayer(function(current){ + group: ["nzry_zhenliang_1", "nzry_zhenliang_2"], + subSkill: { + 1: { + prompt: "弃置一张与“任”颜色相同的牌,并对攻击范围内的一名角色造成1点伤害。", + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (player.storage.nzry_zhenliang) return false; + var storage = player.getExpansions("nzry_mingren"); + if (!storage.length) return false; + var color = get.color(storage[0]); + if ( + player.countCards("he", function (card) { + return get.color(card) == color; + }) == 0 + ) + return false; + return game.hasPlayer(function (current) { return player.inRange(current); }); }, - position:'he', - filterCard:function(card,player){ - return get.color(card)==get.color(player.getExpansions('nzry_mingren')[0]); + position: "he", + filterCard: function (card, player) { + return get.color(card) == get.color(player.getExpansions("nzry_mingren")[0]); }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return player.inRange(target); }, - check:function(card){ - return 6.5-get.value(card); + check: function (card) { + return 6.5 - get.value(card); }, - content:function(){ - player.changeZhuanhuanji('nzry_zhenliang'); - target.damage('nocard'); + content: function () { + player.changeZhuanhuanji("nzry_zhenliang"); + target.damage("nocard"); }, - ai:{ - order:5, - result:{ - player:function(player,target){ - return get.damageEffect(target,player,player); + ai: { + order: 5, + result: { + player: function (player, target) { + return get.damageEffect(target, player, player); }, }, }, }, - 2:{ - trigger:{ - player:['useCardAfter','respondAfter'], + 2: { + trigger: { + player: ["useCardAfter", "respondAfter"], }, - filter:function(event,player){ - if(_status.currentPhase==player||!player.storage.nzry_zhenliang) return false; - var card=player.getExpansions('nzry_mingren')[0]; - return card&&get.color(event.card)==get.color(card); + filter: function (event, player) { + if (_status.currentPhase == player || !player.storage.nzry_zhenliang) + return false; + var card = player.getExpansions("nzry_mingren")[0]; + return card && get.color(event.card) == get.color(card); }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('nzry_zhenliang'),'令一名角色摸一张牌').ai=function(target){ - if(target.hasSkillTag('nogain')) return 0.1; - var att=get.attitude(player,target); - return att*(Math.max(5-target.countCards('h'),2)+3); - }; - "step 1" - if(result.bool){ - player.changeZhuanhuanji('nzry_zhenliang'); - player.logSkill('nzry_zhenliang',result.targets); + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("nzry_zhenliang"), "令一名角色摸一张牌").ai = + function (target) { + if (target.hasSkillTag("nogain")) return 0.1; + var att = get.attitude(player, target); + return att * (Math.max(5 - target.countCards("h"), 2) + 3); + }; + ("step 1"); + if (result.bool) { + player.changeZhuanhuanji("nzry_zhenliang"); + player.logSkill("nzry_zhenliang", result.targets); result.targets[0].draw(); } }, }, }, - ai:{ - combo:'nzry_mingren', + ai: { + combo: "nzry_mingren", }, }, - 'nzry_jianxiang':{ - audio:2, - trigger:{ - target:'useCardToTargeted', + nzry_jianxiang: { + audio: 2, + trigger: { + target: "useCardToTargeted", }, - filter:function(event,player){ - return event.player!=player; + filter: function (event, player) { + return event.player != player; }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('nzry_jianxiang'),'令场上手牌数最少的一名角色摸一张牌',function(card,player,target){ - return target.isMinHandcard(); - }).ai=function(target){ - return get.attitude(player,target) + direct: true, + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("nzry_jianxiang"), + "令场上手牌数最少的一名角色摸一张牌", + function (card, player, target) { + return target.isMinHandcard(); + } + ).ai = function (target) { + return get.attitude(player, target); }; - "step 1" - if(result.bool){ - player.logSkill('nzry_jianxiang',result.targets); + ("step 1"); + if (result.bool) { + player.logSkill("nzry_jianxiang", result.targets); result.targets[0].draw(); } }, }, - "nzry_shenshi":{ - mark:true, - audio:'nzry_shenshi_1', - locked:false, - zhuanhuanji:true, - marktext:'☯', - intro:{ - content:function(storage,player,skill){ - if(player.storage.nzry_shenshi==true) return '其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张'; - return '出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张'; + nzry_shenshi: { + mark: true, + audio: "nzry_shenshi_1", + locked: false, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player, skill) { + if (player.storage.nzry_shenshi == true) + return "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张"; + return "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张"; }, }, - group:["nzry_shenshi_1","nzry_shenshi_2"], - subSkill:{ - '1':{ - audio:2, - prompt:'出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0&&player.storage.nzry_shenshi!=true; + group: ["nzry_shenshi_1", "nzry_shenshi_2"], + subSkill: { + 1: { + audio: 2, + prompt: "出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0 && player.storage.nzry_shenshi != true; }, - discard:false, - line:true, - lose:false, - delay:false, - position:'he', - filterCard:true, - filterTarget:function(card,player,target){ - return target!=player&&!game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>target.countCards('h'); - }); + discard: false, + line: true, + lose: false, + delay: false, + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return ( + current != player && current.countCards("h") > target.countCards("h") + ); + }) + ); }, - check:function(card){ - return 5-get.value(card); + check: function (card) { + return 5 - get.value(card); }, - content:function(){ - 'step 0' - player.changeZhuanhuanji('nzry_shenshi'); - player.give(cards,target); - target.damage('nocard'); - 'step 1' - if(!target.isIn()){ - player.chooseTarget('令一名角色将手牌摸至四张',function(card,player,target){ - return target.countCards('h')<4; - }).set('ai',function(target){ - return get.attitude(player,target) - }); - } - else{ + content: function () { + "step 0"; + player.changeZhuanhuanji("nzry_shenshi"); + player.give(cards, target); + target.damage("nocard"); + ("step 1"); + if (!target.isIn()) { + player + .chooseTarget( + "令一名角色将手牌摸至四张", + function (card, player, target) { + return target.countCards("h") < 4; + } + ) + .set("ai", function (target) { + return get.attitude(player, target); + }); + } else { event.finish(); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.line(result.targets); - result.targets[0].draw(4-result.targets[0].countCards('h')) + result.targets[0].draw(4 - result.targets[0].countCards("h")); } }, - ai:{ - order:1, - result:{ - target:function(player,target){ + ai: { + order: 1, + result: { + target: function (player, target) { return -1; }, }, }, }, - '2':{ - audio:'nzry_shenshi_1', - trigger:{ - player:'damageEnd', + 2: { + audio: "nzry_shenshi_1", + trigger: { + player: "damageEnd", }, - filter:function(event,player){ - return player.countCards('he')>0&&event.source&&event.source!=player&&player.storage.nzry_shenshi==true; + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + event.source && + event.source != player && + player.storage.nzry_shenshi == true + ); }, - check:function(event,player){ - return event.source&&event.source.countCards('h')<=2&&player.countCards('h')<4; + check: function (event, player) { + return ( + event.source && + event.source.countCards("h") <= 2 && + player.countCards("h") < 4 + ); }, - logTarget:'source', - prompt2:'其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张', - content:function(){ - "step 0" - player.changeZhuanhuanji('nzry_shenshi'); + logTarget: "source", + prompt2: + "其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张", + content: function () { + "step 0"; + player.changeZhuanhuanji("nzry_shenshi"); player.viewHandcards(trigger.source); - player.chooseCard('he',true,'交给'+get.translation(trigger.source)+'一张牌').set('ai',function(card){ - return 5-get.value(card); - }); - "step 1" - if(result.bool){ - player.give(result.cards,trigger.source); - trigger.source.storage.nzry_shenshi1=result.cards[0]; - trigger.source.storage.nzry_shenshi2=player; - trigger.source.addSkill('nzry_shenshi1'); + player + .chooseCard("he", true, "交给" + get.translation(trigger.source) + "一张牌") + .set("ai", function (card) { + return 5 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.give(result.cards, trigger.source); + trigger.source.storage.nzry_shenshi1 = result.cards[0]; + trigger.source.storage.nzry_shenshi2 = player; + trigger.source.addSkill("nzry_shenshi1"); } }, }, }, }, - nzry_shenshi1:{ - audio:2, - trigger:{ - global:'phaseJieshuBegin', + nzry_shenshi1: { + audio: 2, + trigger: { + global: "phaseJieshuBegin", }, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return player.storage.nzry_shenshi1!=undefined&&player.storage.nzry_shenshi2!=undefined; + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return ( + player.storage.nzry_shenshi1 != undefined && player.storage.nzry_shenshi2 != undefined + ); }, - content:function(){ - var pl=player.storage.nzry_shenshi2; - var card=player.storage.nzry_shenshi1; - if(player.getCards('he').includes(card)&&4-pl.countCards('h')>0){ - pl.draw(4-pl.countCards('h')); - pl.logSkill('nzry_shenshi'); + content: function () { + var pl = player.storage.nzry_shenshi2; + var card = player.storage.nzry_shenshi1; + if (player.getCards("he").includes(card) && 4 - pl.countCards("h") > 0) { + pl.draw(4 - pl.countCards("h")); + pl.logSkill("nzry_shenshi"); } - player.removeSkill('nzry_shenshi1'); + player.removeSkill("nzry_shenshi1"); delete player.storage.nzry_shenshi1; delete player.storage.nzry_shenshi2; }, }, - xinjushou:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - content:function(){ - 'step 0' + xinjushou: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + content: function () { + "step 0"; player.draw(4); player.turnOver(); - 'step 1' - player.chooseCard('h',true,'弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之').set('ai',function(card){ - if(get.type(card)=='equip'){ - return 5-get.value(card); - } - return -get.value(card); - }).set('filterCard',lib.filter.cardDiscardable); - 'step 2' - if(result.bool&&result.cards.length){ - var card=result.cards[0]; - if(get.type(card)=='equip'&&player.hasUseTarget(card)){ - player.chooseUseTarget(card,true,'nopopup'); - } - else{ + ("step 1"); + player + .chooseCard("h", true, "弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之") + .set("ai", function (card) { + if (get.type(card) == "equip") { + return 5 - get.value(card); + } + return -get.value(card); + }) + .set("filterCard", lib.filter.cardDiscardable); + ("step 2"); + if (result.bool && result.cards.length) { + var card = result.cards[0]; + if (get.type(card) == "equip" && player.hasUseTarget(card)) { + player.chooseUseTarget(card, true, "nopopup"); + } else { player.discard(card); } } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name=='guiyoujie') return [0,1]; - } - } + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 1]; + }, + }, }, }, - xinjiewei:{ - audio:2, - enable:'chooseToUse', - filterCard:true, - position:'e', - viewAs:{name:'wuxie'}, - filter:function(event,player){ - return player.countCards('e')>0; + xinjiewei: { + audio: 2, + enable: "chooseToUse", + filterCard: true, + position: "e", + viewAs: { name: "wuxie" }, + filter: function (event, player) { + return player.countCards("e") > 0; }, - viewAsFilter:function(player){ - return player.countCards('e')>0; + viewAsFilter: function (player) { + return player.countCards("e") > 0; }, - prompt:'将一张装备区内的牌当无懈可击使用', - check:function(card){return 8-get.equipValue(card)}, - threaten:1.2, - group:'xinjiewei_move', - subSkill:{ - move:{ - trigger:{player:'turnOverEnd'}, - direct:true, - audio:'jiewei', - filter:function(event,player){ - return !player.isTurnedOver()&&player.canMoveCard(); + prompt: "将一张装备区内的牌当无懈可击使用", + check: function (card) { + return 8 - get.equipValue(card); + }, + threaten: 1.2, + group: "xinjiewei_move", + subSkill: { + move: { + trigger: { player: "turnOverEnd" }, + direct: true, + audio: "jiewei", + filter: function (event, player) { + return !player.isTurnedOver() && player.canMoveCard(); }, - content:function(){ - "step 0" - player.chooseToDiscard('he',get.prompt('xinjiewei'),'弃置一张牌并移动场上的一张牌',lib.filter.cardDiscardable).set('ai',function(card){ - if(!_status.event.check) return 0; - return 7-get.value(card); - }).set('check',player.canMoveCard(true)).set('logSkill','xinjiewei'); - "step 1" - if(result.bool){ + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + get.prompt("xinjiewei"), + "弃置一张牌并移动场上的一张牌", + lib.filter.cardDiscardable + ) + .set("ai", function (card) { + if (!_status.event.check) return 0; + return 7 - get.value(card); + }) + .set("check", player.canMoveCard(true)) + .set("logSkill", "xinjiewei"); + ("step 1"); + if (result.bool) { player.moveCard(true); - } - else{ + } else { event.finish(); } - } - } - } + }, + }, + }, }, - jianchu:{ - shaRelated:true, - audio:2, - audioname:['re_pangde'], - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.countDiscardableCards(player,'he')>0; + jianchu: { + shaRelated: true, + audio: 2, + audioname: ["re_pangde"], + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countDiscardableCards(player, "he") > 0; }, - preHidden:true, - check:function(event,player){ - return get.attitude(player,event.target)<=0; + preHidden: true, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; }, - logTarget:'target', - content:function(){ - 'step 0' - player.discardPlayerCard(trigger.target,get.prompt('jianchu',trigger.target),true).set('ai',function(button){ - if(!_status.event.att) return 0; - if(get.position(button.link)=='e'){ - if(get.subtype(button.link)=='equip2') return 2*get.value(button.link); - return get.value(button.link); - } - return 1; - }).set('att',get.attitude(player,trigger.target)<=0); - 'step 1' - if(result.bool&&result.links&&result.links.length){ - if(get.type(result.links[0],null,result.links[0].original=='h'?player:false)=='equip'){ - trigger.getParent().directHit.add(trigger.target); - } - else if(trigger.cards){ - var list=[]; - for(var i=0;i1; - })>0; - if(arg&&arg.name=='sha'&&arg.target.getEquip(2)) return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "directHit_ai") + return ( + arg.card.name == "sha" && + arg.target.countCards("e", function (card) { + return get.value(card) > 1; + }) > 0 + ); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; return false; - } + }, }, }, - redimeng:{ - audio:'dimeng', - enable:'phaseUse', - usable:1, - position:'he', - filterCard:function(){ - if(ui.selected.targets.length==2) return false; + redimeng: { + audio: "dimeng", + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: function () { + if (ui.selected.targets.length == 2) return false; return true; }, - selectCard:[0,Infinity], - selectTarget:2, - complexCard:true, - complexSelect:true, - filterTarget:function(card,player,target){ - if(player==target) return false; - if(ui.selected.targets.length==0) return true; - return (Math.abs(ui.selected.targets[0].countCards('h')-target.countCards('h'))== - ui.selected.cards.length); + selectCard: [0, Infinity], + selectTarget: 2, + complexCard: true, + complexSelect: true, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (ui.selected.targets.length == 0) return true; + return ( + Math.abs(ui.selected.targets[0].countCards("h") - target.countCards("h")) == + ui.selected.cards.length + ); }, - multitarget:true, - multiline:true, - content:function(){ - 'step 0' - var cards=targets[0].getCards('h').concat(targets[1].getCards('h')); - var dialog=ui.create.dialog('缔盟',true); - if(player.isUnderControl(true)||targets[0].isUnderControl(true)||targets[1].isUnderControl(true)){ + multitarget: true, + multiline: true, + content: function () { + "step 0"; + var cards = targets[0].getCards("h").concat(targets[1].getCards("h")); + var dialog = ui.create.dialog("缔盟", true); + if ( + player.isUnderControl(true) || + targets[0].isUnderControl(true) || + targets[1].isUnderControl(true) + ) { dialog.add(cards); - dialog.seeing=true; - } - else{ - dialog.add([cards,'blank']); + dialog.seeing = true; + } else { + dialog.add([cards, "blank"]); } _status.dieClose.push(dialog); - dialog.videoId=lib.status.videoId++; - game.addVideo('cardDialog',null,['缔盟',get.cardsInfo(cards),dialog.videoId]); - game.broadcast(function(cards,id,player,targets){ - var dialog=ui.create.dialog('缔盟',true); - if(player.isUnderControl(true)||targets[0].isUnderControl(true)||targets[1].isUnderControl(true)){ - dialog.add(cards); - dialog.seeing=true; - } - else{ - dialog.add([cards,'blank']); - } - _status.dieClose.push(dialog); - dialog.videoId=id; - },cards,dialog.videoId,player,targets); + dialog.videoId = lib.status.videoId++; + game.addVideo("cardDialog", null, ["缔盟", get.cardsInfo(cards), dialog.videoId]); + game.broadcast( + function (cards, id, player, targets) { + var dialog = ui.create.dialog("缔盟", true); + if ( + player.isUnderControl(true) || + targets[0].isUnderControl(true) || + targets[1].isUnderControl(true) + ) { + dialog.add(cards); + dialog.seeing = true; + } else { + dialog.add([cards, "blank"]); + } + _status.dieClose.push(dialog); + dialog.videoId = id; + }, + cards, + dialog.videoId, + player, + targets + ); - event.current=targets[0]; - event.dialog=dialog; - event.num1=0; - event.num2=0; + event.current = targets[0]; + event.dialog = dialog; + event.num1 = 0; + event.num2 = 0; game.delay(); - 'step 1' - if(event.dialog.buttons.length>1){ - var next=event.current.chooseButton(true,function(button){ - return get.value(button.link,_status.event.player); + ("step 1"); + if (event.dialog.buttons.length > 1) { + var next = event.current.chooseButton(true, function (button) { + return get.value(button.link, _status.event.player); }); - next.set('dialog',event.dialog.videoId); - next.set('closeDialog',false); - next.set('dialogdisplay',true); + next.set("dialog", event.dialog.videoId); + next.set("closeDialog", false); + next.set("dialogdisplay", true); + } else { + event.directButton = event.dialog.buttons[0]; } - else{ - event.directButton=event.dialog.buttons[0]; - } - 'step 2' - var dialog=event.dialog; + ("step 2"); + var dialog = event.dialog; var card; - if(event.directButton){ - card=event.directButton.link; + if (event.directButton) { + card = event.directButton.link; + } else { + card = result.links[0]; } - else{ - card=result.links[0]; - } - for(var i=0;i3; + targetprompt: ["先拿牌", "后拿牌"], + find: function (type) { + var list = game.filterPlayer(function (current) { + return current != player && get.attitude(player, current) > 3; }); - var player=_status.event.player; - var num=player.countCards('he',function(card){ - return get.value(card)<7; + var player = _status.event.player; + var num = player.countCards("he", function (card) { + return get.value(card) < 7; }); - var count=null; - var from,nh; - if(list.length==0) return null; - list.sort(function(a,b){ - return a.countCards('h')-b.countCards('h'); + var count = null; + var from, nh; + if (list.length == 0) return null; + list.sort(function (a, b) { + return a.countCards("h") - b.countCards("h"); }); - if(type==1) return list[0]; - from=list[0]; - nh=from.countCards('h'); + if (type == 1) return list[0]; + from = list[0]; + nh = from.countCards("h"); - list=game.filterPlayer(function(current){ - return current!=player&&get.attitude(player,current)<1; + list = game.filterPlayer(function (current) { + return current != player && get.attitude(player, current) < 1; }); - if(list.length==0) return null; - list.sort(function(a,b){ - return b.countCards('h')-a.countCards('h'); + if (list.length == 0) return null; + list.sort(function (a, b) { + return b.countCards("h") - a.countCards("h"); }); - for(var i=0;i=7){ - if(num<2) return 0; - } - else if(targets.length>=5){ - if(num<1.5) return 0; + if (!player.needsToDiscard(-1)) { + if (targets.length >= 7) { + if (num < 2) return 0; + } else if (targets.length >= 5) { + if (num < 1.5) return 0; } } - return 6-get.value(card); + return 6 - get.value(card); }, - ai:{ - basic:{ - order:8.9 - } + ai: { + basic: { + order: 8.9, + }, }, - group:['reluanji_count','reluanji_reset','reluanji_respond','reluanji_damage','reluanji_draw'], - subSkill:{ - reset:{ - trigger:{player:'phaseAfter'}, - silent:true, - content:function(){ + group: [ + "reluanji_count", + "reluanji_reset", + "reluanji_respond", + "reluanji_damage", + "reluanji_draw", + ], + subSkill: { + reset: { + trigger: { player: "phaseAfter" }, + silent: true, + content: function () { delete player.storage.reluanji; delete player.storage.reluanji2; - } - }, - count:{ - trigger:{player:'useCard'}, - silent:true, - filter:function(event){ - return event.skill=='reluanji'; }, - content:function(){ - player.storage.reluanji2=trigger.card; - if(!player.storage.reluanji){ - player.storage.reluanji=[]; + }, + count: { + trigger: { player: "useCard" }, + silent: true, + filter: function (event) { + return event.skill == "reluanji"; + }, + content: function () { + player.storage.reluanji2 = trigger.card; + if (!player.storage.reluanji) { + player.storage.reluanji = []; } - for(var i=0;i=4&&shas.length>=3){ - num=3; + if (player.hp >= 4 && shas.length >= 3) { + num = 3; + } else if (player.hp >= 3 && shas.length >= 2) { + num = 2; + } else { + num = 1; } - else if(player.hp>=3&&shas.length>=2){ - num=2; - } - else{ - num=1 - } - var map={}; - var list=[]; - for(var i=1;i<=player.hp;i++){ - var cn=get.cnNumber(i,true); - map[cn]=i; + var map = {}; + var list = []; + for (var i = 1; i <= player.hp; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; list.push(cn); } - event.map=map; - player.awakenSkill('qimou'); - player.storage.qimou=true; - player.chooseControl(list,function(){ - return get.cnNumber(_status.event.goon,true); - }).set('prompt','失去任意点体力').set('goon',num); - 'step 1' - var num=event.map[result.control]||1; - player.storage.qimou2=num; + event.map = map; + player.awakenSkill("qimou"); + player.storage.qimou = true; + player + .chooseControl(list, function () { + return get.cnNumber(_status.event.goon, true); + }) + .set("prompt", "失去任意点体力") + .set("goon", num); + ("step 1"); + var num = event.map[result.control] || 1; + player.storage.qimou2 = num; player.loseHp(num); - player.addTempSkill('qimou2'); + player.addTempSkill("qimou2"); }, - ai:{ - order:2, - result:{ - player:function(player){ - if(player.hp==1) return 0; - var shas=player.getCards('h','sha'); - if(!shas.length) return 0; - var card=shas[0]; - if(!lib.filter.cardEnabled(card,player)) return 0; - if(lib.filter.cardUsable(card,player)) return 0; + ai: { + order: 2, + result: { + player: function (player) { + if (player.hp == 1) return 0; + var shas = player.getCards("h", "sha"); + if (!shas.length) return 0; + var card = shas[0]; + if (!lib.filter.cardEnabled(card, player)) return 0; + if (lib.filter.cardUsable(card, player)) return 0; var mindist; - if(player.hp>=4&&shas.length>=3){ - mindist=4; + if (player.hp >= 4 && shas.length >= 3) { + mindist = 4; + } else if (player.hp >= 3 && shas.length >= 2) { + mindist = 3; + } else { + mindist = 2; } - else if(player.hp>=3&&shas.length>=2){ - mindist=3; - } - else{ - mindist=2; - } - if(game.hasPlayer(function(current){ - return (current.hp<=mindist-1&& - get.distance(player,current,'attack')<=mindist&& - player.canUse(card,current,false)&& - get.effect(current,card,player,player)>0); - })){ + if ( + game.hasPlayer(function (current) { + return ( + current.hp <= mindist - 1 && + get.distance(player, current, "attack") <= mindist && + player.canUse(card, current, false) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { return 1; } return 0; - } - } - } + }, + }, + }, }, - qimou2:{ - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(typeof player.storage.qimou2=='number'&&card.name=='sha'){ - return num+player.storage.qimou2; + qimou2: { + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (typeof player.storage.qimou2 == "number" && card.name == "sha") { + return num + player.storage.qimou2; } }, - globalFrom:function(from,to,distance){ - if(typeof from.storage.qimou2=='number'){ - return distance-from.storage.qimou2; + globalFrom: function (from, to, distance) { + if (typeof from.storage.qimou2 == "number") { + return distance - from.storage.qimou2; } - } - } - }, - xinkuanggu:{ - audio:'kuanggu', - audioname:['re_weiyan','ol_weiyan'], - trigger:{source:'damageSource'}, - filter:function(event,player){ - return event.kuangguCheck&&event.num>0; + }, }, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' + }, + xinkuanggu: { + audio: "kuanggu", + audioname: ["re_weiyan", "ol_weiyan"], + trigger: { source: "damageSource" }, + filter: function (event, player) { + return event.kuangguCheck && event.num > 0; + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); var choice; - if(player.isDamaged()&&get.recoverEffect(player)>0&&(player.countCards('hs',function(card){ - return card.name=='sha'&&player.hasValueTarget(card); - })>=player.getCardUsable('sha'))){ - choice='recover_hp'; + if ( + player.isDamaged() && + get.recoverEffect(player) > 0 && + player.countCards("hs", function (card) { + return card.name == "sha" && player.hasValueTarget(card); + }) >= player.getCardUsable("sha") + ) { + choice = "recover_hp"; + } else { + choice = "draw_card"; } - else{ - choice='draw_card'; - } - var next=player.chooseDrawRecover('###'+get.prompt(event.name)+'###摸一张牌或回复1点体力').set('logSkill',event.name); - next.set('choice',choice); - next.set('ai',function(){ + var next = player + .chooseDrawRecover("###" + get.prompt(event.name) + "###摸一张牌或回复1点体力") + .set("logSkill", event.name); + next.set("choice", choice); + next.set("ai", function () { return _status.event.getParent().choice; }); - next.setHiddenSkill('xinkuanggu'); - 'step 2' - if(result.control!='cancel2'){ + next.setHiddenSkill("xinkuanggu"); + ("step 2"); + if (result.control != "cancel2") { event.num--; - if(event.num>0&&player.hasSkill('xinkuanggu')){ + if (event.num > 0 && player.hasSkill("xinkuanggu")) { event.goto(1); } } }, - group:'kuanggu_check', + group: "kuanggu_check", }, - xinliegong:{ - shaRelated:true, - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&(card.name==='sha'||get.tag(card,'draw'))) return num+6; + xinliegong: { + shaRelated: true, + mod: { + aiOrder: function (player, card, num) { + if (num > 0 && (card.name === "sha" || get.tag(card, "draw"))) return num + 6; }, - targetInRange:function(card,player,target){ - if(card.name=='sha'&&typeof get.number(card)=='number'){ - if(get.distance(player,target)<=get.number(card)) return true; + targetInRange: function (card, player, target) { + if (card.name == "sha" && typeof get.number(card) == "number") { + if (get.distance(player, target) <= get.number(card)) return true; } - } + }, }, - audio:'liegong', - audioname:['re_huangzhong','ol_huangzhong'], - trigger:{player:'useCardToTargeted'}, - logTarget:'target', - locked:false, - check:function(event,player){ - return get.attitude(player,event.target)<=0; + audio: "liegong", + audioname: ["re_huangzhong", "ol_huangzhong"], + trigger: { player: "useCardToTargeted" }, + logTarget: "target", + locked: false, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; }, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(event.target.countCards('h')<=player.countCards('h')) return true; - if(event.target.hp>=player.hp) return true; + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (event.target.countCards("h") <= player.countCards("h")) return true; + if (event.target.hp >= player.hp) return true; return false; }, - content:function(){ - if(trigger.target.countCards('h')<=player.countCards('h')) trigger.getParent().directHit.push(trigger.target); - if(trigger.target.hp>=player.hp){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].extraDamage!='number'){ - map[id].extraDamage=0; + content: function () { + if (trigger.target.countCards("h") <= player.countCards("h")) + trigger.getParent().directHit.push(trigger.target); + if (trigger.target.hp >= player.hp) { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") { + map[id].extraDamage = 0; } map[id].extraDamage++; } }, - ai:{ - threaten:0.5, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(get.attitude(player,arg.target)<=0&&arg.card.name=='sha'&&player.countCards('h',function(card){ - return card!=arg.card&&(!arg.card.cards||!arg.card.cards.includes(card)); - })>=arg.target.countCards('h')) return true; + ai: { + threaten: 0.5, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + get.attitude(player, arg.target) <= 0 && + arg.card.name == "sha" && + player.countCards("h", function (card) { + return ( + card != arg.card && (!arg.card.cards || !arg.card.cards.includes(card)) + ); + }) >= arg.target.countCards("h") + ) + return true; return false; }, - } + }, }, - tiaoxin:{ - audio:2, - audioname:['sp_jiangwei','xiahouba','re_jiangwei','gz_jiangwei','ol_jiangwei'], - audioname2:{ - dc_xiahouba:'tiaoxin_xiahouba', + tiaoxin: { + audio: 2, + audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei", "gz_jiangwei", "ol_jiangwei"], + audioname2: { + dc_xiahouba: "tiaoxin_xiahouba", }, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.inRange(player)&&target.countCards('he')>0; + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.inRange(player) && target.countCards("he") > 0; }, - content:function(){ - "step 0" - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'挑衅:对'+get.translation(player)+'使用一张杀,或令其弃置你的一张牌').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',player); - "step 1" - if(result.bool==false&&target.countCards('he')>0){ - player.discardPlayerCard(target,'he',true); - } - else{ + content: function () { + "step 0"; + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "挑衅:对" + get.translation(player) + "使用一张杀,或令其弃置你的一张牌") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", player); + ("step 1"); + if (result.bool == false && target.countCards("he") > 0) { + player.discardPlayerCard(target, "he", true); + } else { event.finish(); } }, - ai:{ - order:4, - expose:0.2, - result:{ - target:-1, - player:function(player,target){ - if(target.countCards('h')==0) return 0; - if(target.countCards('h')==1) return -0.1; - if(player.hp<=2) return -2; - if(player.countCards('h','shan')==0) return -1; + ai: { + order: 4, + expose: 0.2, + result: { + target: -1, + player: function (player, target) { + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; return -0.5; - } + }, }, - threaten:1.1 - } + threaten: 1.1, + }, }, - tiaoxin_xiahouba:{audio:2}, - zhiji:{ - skillAnimation:true, - animationColor:'fire', - audio:2, - audioname:['re_jiangwei'], - unique:true, - juexingji:true, + tiaoxin_xiahouba: { audio: 2 }, + zhiji: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + audioname: ["re_jiangwei"], + unique: true, + juexingji: true, //priority:-10, - derivation:'reguanxing', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - if(player.storage.zhiji) return false; - return player.countCards('h')==0; + derivation: "reguanxing", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (player.storage.zhiji) return false; + return player.countCards("h") == 0; }, - content:function(){ - "step 0" - player.awakenSkill('zhiji'); - player.chooseDrawRecover(2,true); - "step 1" + content: function () { + "step 0"; + player.awakenSkill("zhiji"); + player.chooseDrawRecover(2, true); + ("step 1"); player.loseMaxHp(); - player.addSkills('reguanxing'); - } - }, - xiangle:{ - audio:2, - audioname:['re_liushan','ol_liushan'], - trigger:{target:'useCardToTargeted'}, - forced:true, - preHidden:true, - filter:function(event,player){ - return event.card.name=='sha'; + player.addSkills("reguanxing"); }, - content:function(){ - "step 0" - var eff=get.effect(player,trigger.card,trigger.player,trigger.player); - trigger.player.chooseToDiscard('享乐:弃置一张基本牌,否则杀对'+get.translation(player)+'无效',function(card){ - return get.type(card)=='basic'; - }).set('ai',function(card){ - if(_status.event.eff>0){ - return 10-get.value(card); - } - return 0; - }).set('eff',eff); - "step 1" - if(result.bool==false){ + }, + xiangle: { + audio: 2, + audioname: ["re_liushan", "ol_liushan"], + trigger: { target: "useCardToTargeted" }, + forced: true, + preHidden: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + var eff = get.effect(player, trigger.card, trigger.player, trigger.player); + trigger.player + .chooseToDiscard( + "享乐:弃置一张基本牌,否则杀对" + get.translation(player) + "无效", + function (card) { + return get.type(card) == "basic"; + } + ) + .set("ai", function (card) { + if (_status.event.eff > 0) { + return 10 - get.value(card); + } + return 0; + }) + .set("eff", eff); + ("step 1"); + if (result.bool == false) { trigger.getParent().excluded.add(player); } }, - ai:{ - effect:{ - target_use:function(card,player,target,current){ - if(card.name=='sha'&&get.attitude(player,target)<0){ - if(_status.event.name=='xiangle') return; - if(get.attitude(player,target)>0&¤t<0) return 'zerotarget'; - var bs=player.getCards('h',{type:'basic'}); + ai: { + effect: { + target_use: function (card, player, target, current) { + if (card.name == "sha" && get.attitude(player, target) < 0) { + if (_status.event.name == "xiangle") return; + if (get.attitude(player, target) > 0 && current < 0) return "zerotarget"; + var bs = player.getCards("h", { type: "basic" }); bs.remove(card); - if(card.cards) bs.removeArray(card.cards); + if (card.cards) bs.removeArray(card.cards); else bs.removeArray(ui.selected.cards); - if(!bs.length) return 'zerotarget'; - if(player.hasSkill('jiu')||player.hasSkill('tianxianjiu')) return; - if(bs.length<=2){ - for(var i=0;i0&&!player.hasSkill('fangquan3'); + }, + }, }, - direct:true, - preHidden:true, - content:function(){ - "step 0" - var fang=player.countMark('fangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.hp+1; - player.chooseBool(get.prompt2('fangquan')).set('ai',function(){ - if(!_status.event.fang) return false; - return game.hasPlayer(function(target){ - if(target.hasJudge('lebu')||target==player) return false; - if(get.attitude(player,target)>4){ - return (get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1)>0); - } - return false; - }); - }).set('fang',fang).setHiddenSkill(event.name); - "step 1" - if(result.bool){ - player.logSkill('fangquan'); + }, + fangquan: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("fangquan3"); + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var fang = + player.countMark("fangquan2") == 0 && + player.hp >= 2 && + player.countCards("h") <= player.hp + 1; + player + .chooseBool(get.prompt2("fangquan")) + .set("ai", function () { + if (!_status.event.fang) return false; + return game.hasPlayer(function (target) { + if (target.hasJudge("lebu") || target == player) return false; + if (get.attitude(player, target) > 4) { + return ( + get.threaten(target) / + Math.sqrt(target.hp + 1) / + Math.sqrt(target.countCards("h") + 1) > + 0 + ); + } + return false; + }); + }) + .set("fang", fang) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + player.logSkill("fangquan"); trigger.cancel(); - player.addTempSkill('fangquan2'); - player.addMark('fangquan2',1,false); + player.addTempSkill("fangquan2"); + player.addMark("fangquan2", 1, false); //player.storage.fangquan=result.targets[0]; } - } + }, }, - fangquan2:{ - trigger:{player:'phaseEnd'}, - forced:true, - popup:false, - audio:false, + fangquan2: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + audio: false, //priority:-50, - onremove:true, - content:function(){ - "step 0" - event.count=player.countMark(event.name); - player.removeMark(event.name,event.count); - "step 1" + onremove: true, + content: function () { + "step 0"; + event.count = player.countMark(event.name); + player.removeMark(event.name, event.count); + ("step 1"); event.count--; - player.chooseToDiscard('是否弃置一张牌并令一名其他角色进行一个额外回合?').set('logSkill',player.name=='re_liushan'?'refangquan':'fangquan').ai=function(card){ - return 20-get.value(card); - }; - "step 2" - if(result.bool){ - player.chooseTarget(true,'请选择进行额外回合的目标角色',lib.filter.notMe).ai=function(target){ - if(target.hasJudge('lebu')||get.attitude(player,target)<=0) return -1; - if(target.isTurnedOver()) return 0.18; - return get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1); + player + .chooseToDiscard("是否弃置一张牌并令一名其他角色进行一个额外回合?") + .set("logSkill", player.name == "re_liushan" ? "refangquan" : "fangquan").ai = + function (card) { + return 20 - get.value(card); }; - } - else event.finish(); - "step 3" - var target=result.targets[0]; - player.line(target,'fire'); - target.markSkillCharacter('fangquan',player,'放权','进行一个额外回合'); + ("step 2"); + if (result.bool) { + player.chooseTarget(true, "请选择进行额外回合的目标角色", lib.filter.notMe).ai = + function (target) { + if (target.hasJudge("lebu") || get.attitude(player, target) <= 0) return -1; + if (target.isTurnedOver()) return 0.18; + return ( + get.threaten(target) / + Math.sqrt(target.hp + 1) / + Math.sqrt(target.countCards("h") + 1) + ); + }; + } else event.finish(); + ("step 3"); + var target = result.targets[0]; + player.line(target, "fire"); + target.markSkillCharacter("fangquan", player, "放权", "进行一个额外回合"); target.insertPhase(); - target.addSkill('fangquan3'); - if(event.count>0) event.goto(1); - } + target.addSkill("fangquan3"); + if (event.count > 0) event.goto(1); + }, }, - fangquan3:{ - trigger:{player:['phaseAfter','phaseCancelled']}, - forced:true, - popup:false, - audio:false, - content:function(){ - player.unmarkSkill('fangquan'); - player.removeSkill('fangquan3'); - } + fangquan3: { + trigger: { player: ["phaseAfter", "phaseCancelled"] }, + forced: true, + popup: false, + audio: false, + content: function () { + player.unmarkSkill("fangquan"); + player.removeSkill("fangquan3"); + }, }, - ruoyu:{ - skillAnimation:true, - animationColor:'fire', - audio:2, - audioname:['re_liushan'], - unique:true, - juexingji:true, - zhuSkill:true, - keepSkill:true, - derivation:'rejijiang', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ + ruoyu: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + audioname: ["re_liushan"], + unique: true, + juexingji: true, + zhuSkill: true, + keepSkill: true, + derivation: "rejijiang", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { return player.isMinHp(); }, - content:function(){ - 'step 0' - player.awakenSkill('ruoyu'); + content: function () { + "step 0"; + player.awakenSkill("ruoyu"); player.gainMaxHp(); player.recover(); - 'step 1' - player.addSkills('rejijiang'); - } - }, - qiaobian:{ - audio:2, - trigger:{player:['phaseJudgeBefore','phaseDrawBefore','phaseUseBefore','phaseDiscardBefore']}, - filter:function(event,player){ - return player.countCards('h')>0; + ("step 1"); + player.addSkills("rejijiang"); }, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - var check,str='弃置一张手牌并跳过'; - str+=['判定','摸牌','出牌','弃牌'][lib.skill.qiaobian.trigger.player.indexOf(event.triggername)]; - str+='阶段'; - if(trigger.name=='phaseDraw') str+=',然后可以获得至多两名角色各一张手牌'; - if(trigger.name=='phaseUse') str+=',然后可以移动场上的一张牌'; - switch(trigger.name){ - case 'phaseJudge': - check=player.countCards('j'); + }, + qiaobian: { + audio: 2, + trigger: { + player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore"], + }, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var check, + str = "弃置一张手牌并跳过"; + str += ["判定", "摸牌", "出牌", "弃牌"][ + lib.skill.qiaobian.trigger.player.indexOf(event.triggername) + ]; + str += "阶段"; + if (trigger.name == "phaseDraw") str += ",然后可以获得至多两名角色各一张手牌"; + if (trigger.name == "phaseUse") str += ",然后可以移动场上的一张牌"; + switch (trigger.name) { + case "phaseJudge": + check = player.countCards("j"); break; - case 'phaseDraw': - var i,num=0,num2=0,players=game.filterPlayer(); - for(i=0;i=2&&num2>0); + check = num >= 2 && num2 > 0; break; - case 'phaseUse': - if(!player.canMoveCard(true)){ - check=false; - } - else{ - check=game.hasPlayer(function(current){ - return get.attitude(player,current)>0&¤t.countCards('j'); + case "phaseUse": + if (!player.canMoveCard(true)) { + check = false; + } else { + check = game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 && current.countCards("j"); }); - if(!check){ - if(player.countCards('h')>player.hp+1){ - check=false; - } - else if(player.countCards('h',{name:'wuzhong'})){ - check=false; - } - else{ - check=true; + if (!check) { + if (player.countCards("h") > player.hp + 1) { + check = false; + } else if (player.countCards("h", { name: "wuzhong" })) { + check = false; + } else { + check = true; } } } break; - case 'phaseDiscard': - check=player.needsToDiscard(); + case "phaseDiscard": + check = player.needsToDiscard(); break; } - player.chooseToDiscard(get.prompt('qiaobian'),str,lib.filter.cardDiscardable).set('ai',card=>{ - if(!_status.event.check) return -1; - return 7-get.value(card); - }).set('check',check).set('logSkill','qiaobian').setHiddenSkill('qiaobian'); - 'step 1' - if(result.bool){ + player + .chooseToDiscard(get.prompt("qiaobian"), str, lib.filter.cardDiscardable) + .set("ai", (card) => { + if (!_status.event.check) return -1; + return 7 - get.value(card); + }) + .set("check", check) + .set("logSkill", "qiaobian") + .setHiddenSkill("qiaobian"); + ("step 1"); + if (result.bool) { trigger.cancel(); - game.log(player,'跳过了','#y'+['判定','摸牌','出牌','弃牌'][lib.skill.qiaobian.trigger.player.indexOf(event.triggername)]+'阶段'); - if(trigger.name=='phaseUse'){ - if(player.canMoveCard()) player.moveCard(); + game.log( + player, + "跳过了", + "#y" + + ["判定", "摸牌", "出牌", "弃牌"][ + lib.skill.qiaobian.trigger.player.indexOf(event.triggername) + ] + + "阶段" + ); + if (trigger.name == "phaseUse") { + if (player.canMoveCard()) player.moveCard(); event.finish(); - } - else if(trigger.name=='phaseDraw'){ - player.chooseTarget([1,2],'获得至多两名角色各一张手牌',function(card,player,target){ - return target!=player&&target.countCards('h'); - }).set('ai',function(target){ - return 1-get.attitude(_status.event.player,target); - }); - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ + } else if (trigger.name == "phaseDraw") { + player + .chooseTarget( + [1, 2], + "获得至多两名角色各一张手牌", + function (card, player, target) { + return target != player && target.countCards("h"); + } + ) + .set("ai", function (target) { + return 1 - get.attitude(_status.event.player, target); + }); + } else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) { result.targets.sortBySeat(); - player.line(result.targets,'green'); - event.targets=result.targets; - if(!event.targets.length) event.finish(); - } - else event.finish(); - 'step 3' + player.line(result.targets, "green"); + event.targets = result.targets; + if (!event.targets.length) event.finish(); + } else event.finish(); + ("step 3"); player.gainMultiple(event.targets); - 'step 4' + ("step 4"); game.delay(); }, - ai:{threaten:3}, + ai: { threaten: 3 }, }, - tuntian:{ - audio:2, - audioname:['gz_dengai'], - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + tuntian: { + audio: 2, + audioname: ["gz_dengai"], + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - frequent:true, - preHidden:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(event.name=='gain'&&event.player==player) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + frequent: true, + preHidden: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; }, - content:function(){ - 'step 0' - var next=player.judge(function(card){ - if(get.suit(card)=='heart') return -1; + content: function () { + "step 0"; + var next = player.judge(function (card) { + if (get.suit(card) == "heart") return -1; return 1; }); - next.judge2=function(result){ + next.judge2 = function (result) { return result.bool; }; - if(get.mode()!='guozhan'){ - next.callback=lib.skill.tuntian.callback; + if (get.mode() != "guozhan") { + next.callback = lib.skill.tuntian.callback; event.finish(); } - 'step 1' - if(!result.bool||get.position(result.card)!='d'){ + ("step 1"); + if (!result.bool || get.position(result.card) != "d") { //game.cardsDiscard(card); event.finish(); return; } - event.card=result.card; - player.chooseBool('是否将'+get.translation(event.card)+'作为“田”置于武将牌上?').ai=function(){ - return true; - }; - 'step 2' - if(!result.bool&&!event.directbool){ + event.card = result.card; + player.chooseBool("是否将" + get.translation(event.card) + "作为“田”置于武将牌上?").ai = + function () { + return true; + }; + ("step 2"); + if (!result.bool && !event.directbool) { return; } - player.addToExpansion(event.card,'gain2').gaintag.add('tuntian'); + player.addToExpansion(event.card, "gain2").gaintag.add("tuntian"); }, - callback:function(){ - if(!event.judgeResult.bool){ + callback: function () { + if (!event.judgeResult.bool) { event.finish(); return; } - player.addToExpansion(event.judgeResult.card,'gain2').gaintag.add('tuntian'); + player.addToExpansion(event.judgeResult.card, "gain2").gaintag.add("tuntian"); }, - marktext:'田', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "田", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'tuntian_dist', - locked:false, - subSkill:{ - dist:{ - locked:false, - mod:{ - globalFrom:function(from,to,distance){ - var num=distance-from.getExpansions('tuntian').length; - if(_status.event.skill=='jixi_backup'||_status.event.skill=='gzjixi_backup') num++; + group: "tuntian_dist", + locked: false, + subSkill: { + dist: { + locked: false, + mod: { + globalFrom: function (from, to, distance) { + var num = distance - from.getExpansions("tuntian").length; + if ( + _status.event.skill == "jixi_backup" || + _status.event.skill == "gzjixi_backup" + ) + num++; return num; - } - } - } - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(typeof card==='object'&&get.name(card)==='sha'&&target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) return [0.6,0.75]; - if(!target.hasFriend()&&!player.hasUnknown()) return; - if(_status.currentPhase==target||get.type(card)==='delay') return; - if(card.name!='shuiyanqijunx'&&get.tag(card,'loseCard')&&target.countCards('he')){ - if(target.hasSkill('ziliang')) return 0.7; - return [0.5,Math.max(2,target.countCards('h'))]; - } - if(target.isUnderControl(true,player)){ - if((get.tag(card,'respondSha')&&target.countCards('h','sha'))|| - (get.tag(card,'respondShan')&&target.countCards('h','shan'))){ - if(target.hasSkill('ziliang')) return 0.7; - return [0.5,1]; - } - } - else if(get.tag(card,'respondSha')||get.tag(card,'respondShan')){ - if(get.attitude(player,target)>0&&card.name=='juedou') return; - if(get.tag(card,'damage')&&target.hasSkillTag('maixie')) return; - if(target.countCards('h')==0) return 2; - if(target.hasSkill('ziliang')) return 0.7; - if(get.mode()=='guozhan') return 0.5; - return [0.5,Math.max(target.countCards('h')/4,target.countCards('h','sha')+target.countCards('h','shan'))]; - } - } + }, + }, }, - threaten:function(player,target){ - if(target.countCards('h')==0) return 2; + }, + ai: { + effect: { + target: function (card, player, target, current) { + if ( + typeof card === "object" && + get.name(card) === "sha" && + target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return [0.6, 0.75]; + if (!target.hasFriend() && !player.hasUnknown()) return; + if (_status.currentPhase == target || get.type(card) === "delay") return; + if ( + card.name != "shuiyanqijunx" && + get.tag(card, "loseCard") && + target.countCards("he") + ) { + if (target.hasSkill("ziliang")) return 0.7; + return [0.5, Math.max(2, target.countCards("h"))]; + } + if (target.isUnderControl(true, player)) { + if ( + (get.tag(card, "respondSha") && target.countCards("h", "sha")) || + (get.tag(card, "respondShan") && target.countCards("h", "shan")) + ) { + if (target.hasSkill("ziliang")) return 0.7; + return [0.5, 1]; + } + } else if (get.tag(card, "respondSha") || get.tag(card, "respondShan")) { + if (get.attitude(player, target) > 0 && card.name == "juedou") return; + if (get.tag(card, "damage") && target.hasSkillTag("maixie")) return; + if (target.countCards("h") == 0) return 2; + if (target.hasSkill("ziliang")) return 0.7; + if (get.mode() == "guozhan") return 0.5; + return [ + 0.5, + Math.max( + target.countCards("h") / 4, + target.countCards("h", "sha") + target.countCards("h", "shan") + ), + ]; + } + }, + }, + threaten: function (player, target) { + if (target.countCards("h") == 0) return 2; return 0.5; }, - nodiscard:true, - nolose:true - } - }, - zaoxian:{ - skillAnimation:true, - animationColor:'thunder', - audio:2, - audioname:['re_dengai'], - unique:true, - juexingji:true, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.getExpansions('tuntian').length>=3; + nodiscard: true, + nolose: true, }, - derivation:'jixi', - content:function(){ - player.awakenSkill('zaoxian'); + }, + zaoxian: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + audioname: ["re_dengai"], + unique: true, + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.getExpansions("tuntian").length >= 3; + }, + derivation: "jixi", + content: function () { + player.awakenSkill("zaoxian"); player.loseMaxHp(); - player.addSkills('jixi'); - } - }, - jixi:{ - audio:2, - audioname:['re_dengai','gz_dengai','ol_dengai'], - enable:'phaseUse', - filter:function(event,player){ - return player.getExpansions('tuntian').length>0&&event.filterCard({name:'shunshou'},player,event); + player.addSkills("jixi"); }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('急袭',player.getExpansions('tuntian'),'hidden'); + }, + jixi: { + audio: 2, + audioname: ["re_dengai", "gz_dengai", "ol_dengai"], + enable: "phaseUse", + filter: function (event, player) { + return ( + player.getExpansions("tuntian").length > 0 && + event.filterCard({ name: "shunshou" }, player, event) + ); + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("急袭", player.getExpansions("tuntian"), "hidden"); }, - filter:function(button,player){ - var card=button.link; - if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) return false; - var evt=_status.event.getParent(); - return evt.filterCard(get.autoViewAs({name:'shunshou'},[card]),player,evt) + filter: function (button, player) { + var card = button.link; + if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player)) return false; + var evt = _status.event.getParent(); + return evt.filterCard(get.autoViewAs({ name: "shunshou" }, [card]), player, evt); }, - backup:function(links,player){ - var skill=_status.event.buttoned; + backup: function (links, player) { + var skill = _status.event.buttoned; return { - audio:'jixi', - audioname:['re_dengai','gz_dengai','ol_dengai'], - selectCard:-1, - position:'x', - filterCard:skill=='jixi'?(card)=>card==lib.skill.jixi_backup.card:(card)=>card==lib.skill.gzjixi_backup.card, - viewAs:{name:'shunshou'}, - card:links[0], - } + audio: "jixi", + audioname: ["re_dengai", "gz_dengai", "ol_dengai"], + selectCard: -1, + position: "x", + filterCard: + skill == "jixi" + ? (card) => card == lib.skill.jixi_backup.card + : (card) => card == lib.skill.gzjixi_backup.card, + viewAs: { name: "shunshou" }, + card: links[0], + }; + }, + prompt: function (links, player) { + return "选择 顺手牵羊(" + get.translation(links[0]) + ")的目标"; }, - prompt:function(links,player){ - return '选择 顺手牵羊('+get.translation(links[0])+')的目标'; - } }, - ai:{ - order:10, - result:{ - player:function(player){ - return player.getExpansions('tuntian').length-1; - } + ai: { + order: 10, + result: { + player: function (player) { + return player.getExpansions("tuntian").length - 1; + }, }, - combo:'tuntian' - } + combo: "tuntian", + }, }, - jiang:{ - shaRelated:true, - audio:2, - preHidden:true, - audioname:['sp_lvmeng','re_sunben','re_sunce'], - mod:{ - aiOrder:function(player,card,num){ - if(get.color(card)==='red'&&get.name(card)==='sha') return get.order({name: 'sha'})+0.15; - } + jiang: { + shaRelated: true, + audio: 2, + preHidden: true, + audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], + mod: { + aiOrder: function (player, card, num) { + if (get.color(card) === "red" && get.name(card) === "sha") + return get.order({ name: "sha" }) + 0.15; + }, }, - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - filter:function(event,player){ - if(!(event.card.name=='juedou'||(event.card.name=='sha'&&get.color(event.card)=='red'))) return false; - return player==event.target||event.getParent().triggeredTargets3.length==1; + filter: function (event, player) { + if ( + !( + event.card.name == "juedou" || + (event.card.name == "sha" && get.color(event.card) == "red") + ) + ) + return false; + return player == event.target || event.getParent().triggeredTargets3.length == 1; }, - locked:false, - frequent:true, - content:function(){ + locked: false, + frequent: true, + content: function () { player.draw(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name=='sha'&&get.color(card)=='red') return [1,0.6]; + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 0.6]; }, - player:function(card,player,target){ - if(card.name=='sha'&&get.color(card)=='red') return [1,1]; - } - } - } - }, - hunzi:{ - //audioname:['re_sunben'], - skillAnimation:true, - animationColor:'wood', - audio:2, - juexingji:true, - derivation:['reyingzi','gzyinghun'], - unique:true, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.hp<=1&&!player.storage.hunzi; + player: function (card, player, target) { + if (card.name == "sha" && get.color(card) == "red") return [1, 1]; + }, + }, }, - forced:true, + }, + hunzi: { + //audioname:['re_sunben'], + skillAnimation: true, + animationColor: "wood", + audio: 2, + juexingji: true, + derivation: ["reyingzi", "gzyinghun"], + unique: true, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.hp <= 1 && !player.storage.hunzi; + }, + forced: true, //priority:3, - content:function(){ + content: function () { player.awakenSkill(event.name); player.loseMaxHp(); - player.addSkills(['reyingzi','gzyinghun']); + player.addSkills(["reyingzi", "gzyinghun"]); }, - ai:{ - threaten:function(player,target){ - if(target.hp==1) return 2; + ai: { + threaten: function (player, target) { + if (target.hp == 1) return 2; return 0.5; }, - maixie:true, - effect:{ - target:function(card,player,target){ - if(!target.hasFriend()) return; - if(target.hp===2&&get.tag(card,'damage')==1&&!target.isTurnedOver()&& - _status.currentPhase!==target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [0.5,1]; - if(target.hp===1&&get.tag(card,'recover')&&!target.isTurnedOver()&& - _status.currentPhase!==target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [1,-3]; - } - } - } + maixie: true, + effect: { + target: function (card, player, target) { + if (!target.hasFriend()) return; + if ( + target.hp === 2 && + get.tag(card, "damage") == 1 && + !target.isTurnedOver() && + _status.currentPhase !== target && + get.distance(_status.currentPhase, target, "absolute") <= 3 + ) + return [0.5, 1]; + if ( + target.hp === 1 && + get.tag(card, "recover") && + !target.isTurnedOver() && + _status.currentPhase !== target && + get.distance(_status.currentPhase, target, "absolute") <= 3 + ) + return [1, -3]; + }, + }, + }, }, - zhiba:{ - unique:true, - global:'zhiba2', - audioname:['re_sunben'], - audio:'zhiba2', - zhuSkill:true, + zhiba: { + unique: true, + global: "zhiba2", + audioname: ["re_sunben"], + audio: "zhiba2", + zhuSkill: true, }, - zhiba2:{ - audio:2, - audioname:['re_sunben'], + zhiba2: { + audio: 2, + audioname: ["re_sunben"], //forceaudio:true, - enable:'phaseUse', - prompt:function(){ - var player=_status.event.player; - var list=game.filterPlayer(function(target){ - return target.hasZhuSkill('zhiba',player)&&player.canCompare(target); + enable: "phaseUse", + prompt: function () { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target.hasZhuSkill("zhiba", player) && player.canCompare(target); }); - var str='和'+get.translation(list); - if(list.length>1) str+='中的一人'; - str+='进行拼点。若你没赢,其可以获得两张拼点牌。'; + var str = "和" + get.translation(list); + if (list.length > 1) str += "中的一人"; + str += "进行拼点。若你没赢,其可以获得两张拼点牌。"; return str; }, - filter:function(event,player){ - if(player.group!='wu'||player.countCards('h')==0) return false; - return game.hasPlayer(function(target){ - return target.hasZhuSkill('zhiba',player)&&player.canCompare(target); + filter: function (event, player) { + if (player.group != "wu" || player.countCards("h") == 0) return false; + return game.hasPlayer(function (target) { + return target.hasZhuSkill("zhiba", player) && player.canCompare(target); }); }, - filterTarget:function(card,player,target){ - return target.hasZhuSkill('zhiba',player)&&player.canCompare(target); + filterTarget: function (card, player, target) { + return target.hasZhuSkill("zhiba", player) && player.canCompare(target); }, - log:false, - prepare:function(cards,player,targets){ - targets[0].logSkill('zhiba'); + log: false, + prepare: function (cards, player, targets) { + targets[0].logSkill("zhiba"); }, - usable:1, - content:function(){ - "step 0" - if(target.storage.hunzi||target.storage.rehunzi){ - target.chooseControl('拒绝','不拒绝').set('prompt','是否拒绝制霸拼点?').set('choice',get.attitude(target,player)<=0); + usable: 1, + content: function () { + "step 0"; + if (target.storage.hunzi || target.storage.rehunzi) { + target + .chooseControl("拒绝", "不拒绝") + .set("prompt", "是否拒绝制霸拼点?") + .set("choice", get.attitude(target, player) <= 0); + } else { + event.forced = true; } - else{ - event.forced=true; - } - "step 1" - if(!event.forced&&result.control=='拒绝'){ - game.log(target,'拒绝了拼点'); - target.chat('拒绝'); + ("step 1"); + if (!event.forced && result.control == "拒绝") { + game.log(target, "拒绝了拼点"); + target.chat("拒绝"); event.finish(); return; } - player.chooseToCompare(target,function(card){ - if(card.name=='du') return 20; - var player=get.owner(card); - var target=_status.event.getParent().target; - if(player!=target&&get.attitude(player,target)>0){ - return -get.number(card); - } - return get.number(card); - }).set('preserve','lose'); - "step 2" - if(result.bool==false){ - var list=[]; - if(get.position(result.player)=='d') list.push(result.player); - if(get.position(result.target)=='d') list.push(result.target); - if(!list.length) event.finish(); - else{ - event.list=list; - target.chooseBool('是否获得'+get.translation(list)+'?').ai=function(){ - return get.value(list)>0; + player + .chooseToCompare(target, function (card) { + if (card.name == "du") return 20; + var player = get.owner(card); + var target = _status.event.getParent().target; + if (player != target && get.attitude(player, target) > 0) { + return -get.number(card); + } + return get.number(card); + }) + .set("preserve", "lose"); + ("step 2"); + if (result.bool == false) { + var list = []; + if (get.position(result.player) == "d") list.push(result.player); + if (get.position(result.target) == "d") list.push(result.target); + if (!list.length) event.finish(); + else { + event.list = list; + target.chooseBool("是否获得" + get.translation(list) + "?").ai = function () { + return get.value(list) > 0; }; } - } - else event.finish(); - "step 3" - if(result.bool) target.gain(event.list,'gain2'); + } else event.finish(); + ("step 3"); + if (result.bool) target.gain(event.list, "gain2"); }, - ai:{ - basic:{ - order:1 + ai: { + basic: { + order: 1, }, - expose:0.2, - result:{ - target:function(player,target){ - if(player.countCards('h','du')&&get.attitude(player,target)<0) return -1; - if(player.countCards('h')<=player.hp) return 0; - var maxnum=0; - var cards2=target.getCards('h'); - for(var i=0;imaxnum){ - maxnum=get.number(cards2[i]); + expose: 0.2, + result: { + target: function (player, target) { + if (player.countCards("h", "du") && get.attitude(player, target) < 0) return -1; + if (player.countCards("h") <= player.hp) return 0; + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); } } - if(maxnum>10) maxnum=10; - if(maxnum<5&&cards2.length>1) maxnum=5; - var cards=player.getCards('h'); - for(var i=0;i 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; } return 0; - } - } - } + }, + }, + }, }, - zhijian:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h',{type:'equip'})>0; + zhijian: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", { type: "equip" }) > 0; }, - filterCard:function(card){ - return get.type(card)=='equip'; + filterCard: function (card) { + return get.type(card) == "equip"; }, - check:function(card){ - var player=_status.currentPhase; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); + check: function (card) { + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); } - return 6-get.value(card); + return 6 - get.value(card); }, - filterTarget:function(card,player,target){ - if(target.isMin()) return false; - return player!=target&&target.canEquip(card); + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + return player != target && target.canEquip(card); }, - async content(event, trigger, player){ + async content(event, trigger, player) { event.target.equip(event.cards[0]); player.draw(); }, - discard:false, - lose:false, - prepare:function(cards,player,targets){ - player.$give(cards,targets[0],false); + discard: false, + lose: false, + prepare: function (cards, player, targets) { + player.$give(cards, targets[0], false); }, - ai:{ - basic:{ - order:10 + ai: { + basic: { + order: 10, }, - result:{ - target:function(player,target){ - var card=ui.selected.cards[0]; - if(card) return get.effect(target,card,target,target); + result: { + target: function (player, target) { + var card = ui.selected.cards[0]; + if (card) return get.effect(target, card, target, target); return 0; }, }, - threaten:1.3 - } + threaten: 1.3, + }, }, - guzheng:{ - audio:2, - audioname:['re_zhangzhang'], - trigger:{global:'phaseDiscardAfter'}, - filter:function(event,player){ - if(event.player!=player&&event.player.isIn()){ - return event.player.getHistory('lose',function(evt){ - return evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.hs.someInD('d'); - }).length>0; + guzheng: { + audio: 2, + audioname: ["re_zhangzhang"], + trigger: { global: "phaseDiscardAfter" }, + filter: function (event, player) { + if (event.player != player && event.player.isIn()) { + return ( + event.player.getHistory("lose", function (evt) { + return ( + evt.type == "discard" && + evt.getParent("phaseDiscard") == event && + evt.hs.someInD("d") + ); + }).length > 0 + ); } return false; }, - checkx:function(event,player,cards,cards2){ - if(cards.length>2||get.attitude(player,event.player)>0) return true; - for(var i=0;i 2 || get.attitude(player, event.player) > 0) return true; + for (var i = 0; i < cards2.length; i++) { + if (get.value(cards2[i], event.player, "raw") < 0) return true; } return false; }, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - var cards=[],cards2=[]; - var target=trigger.player; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name=='cardsDiscard'){ - if(evt.getParent('phaseDiscard')==trigger){ - var moves=evt.cards.filterInD('d'); + direct: true, + preHidden: true, + content: function () { + "step 0"; + var cards = [], + cards2 = []; + var target = trigger.player; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard") { + if (evt.getParent("phaseDiscard") == trigger) { + var moves = evt.cards.filterInD("d"); cards.addArray(moves); cards2.removeArray(moves); } } - if(evt.name=='lose'){ - if(evt.type!='discard'||evt.position!=ui.discardPile||evt.getParent('phaseDiscard')!=trigger) return; - var moves=evt.cards.filterInD('d'); + if (evt.name == "lose") { + if ( + evt.type != "discard" || + evt.position != ui.discardPile || + evt.getParent("phaseDiscard") != trigger + ) + return; + var moves = evt.cards.filterInD("d"); cards.addArray(moves); - if(evt.player==target) cards2.addArray(moves); + if (evt.player == target) cards2.addArray(moves); else cards2.removeArray(moves); } }); - if(!cards2.length) event.finish(); - else if(cards.length==1){ - event.card=cards[0]; - player.chooseBool().set('createDialog',[ - get.prompt('guzheng',target), - '点击“确认”以令其收回此牌', - cards, - ]).set('choice',lib.skill.guzheng.checkx(trigger,player,cards,cards2)).set('ai',function(){ - return _status.event.choice; - }).setHiddenSkill('guzheng'); + if (!cards2.length) event.finish(); + else if (cards.length == 1) { + event.card = cards[0]; + player + .chooseBool() + .set("createDialog", [ + get.prompt("guzheng", target), + '点击“确认”以令其收回此牌', + cards, + ]) + .set("choice", lib.skill.guzheng.checkx(trigger, player, cards, cards2)) + .set("ai", function () { + return _status.event.choice; + }) + .setHiddenSkill("guzheng"); + } else { + player + .chooseButton(2, [ + get.prompt("guzheng", target), + '被选择的牌将成为对方收回的牌', + cards, + [["获得剩余的牌", "放弃剩余的牌"], "tdnodes"], + ]) + .set("filterButton", function (button) { + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) + return false; + return type == "string" || _status.event.allowed.includes(button.link); + }) + .set("allowed", cards2) + .set("check", lib.skill.guzheng.checkx(trigger, player, cards, cards2)) + .set("ai", function (button) { + if (typeof button.link == "string") { + return button.link == "获得剩余的牌" ? 1 : 0; + } + if (_status.event.check) { + return 20 - get.value(button.link, _status.event.getTrigger().player); + } + return 0; + }) + .setHiddenSkill("guzheng"); } - else{ - player.chooseButton(2,[ - get.prompt('guzheng',target), - '被选择的牌将成为对方收回的牌', - cards, - [['获得剩余的牌','放弃剩余的牌'],'tdnodes'], - ]).set('filterButton',function(button){ - var type=typeof button.link; - if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; - return type=='string'||_status.event.allowed.includes(button.link); - }).set('allowed',cards2).set('check',lib.skill.guzheng.checkx(trigger,player,cards,cards2)).set('ai',function(button){ - if(typeof button.link=='string'){ - return button.link=='获得剩余的牌'?1:0; - } - if(_status.event.check){ - return 20-get.value(button.link,_status.event.getTrigger().player); - } - return 0; - }).setHiddenSkill('guzheng'); - } - 'step 1' - if(result.bool){ - var target=trigger.player; - player.logSkill('guzheng',target); - if(!result.links||!result.links.length){ - target.gain(card,'gain2').giver=player; + ("step 1"); + if (result.bool) { + var target = trigger.player; + player.logSkill("guzheng", target); + if (!result.links || !result.links.length) { + target.gain(card, "gain2").giver = player; + } else { + if (typeof result.links[0] != "string") result.links.reverse(); + var card = result.links[1]; + target.gain(card, "gain2").giver = player; + if (result.links[0] != "获得剩余的牌") event.finish(); } - else{ - if(typeof result.links[0]!='string') result.links.reverse(); - var card=result.links[1]; - target.gain(card,'gain2').giver=player; - if(result.links[0]!='获得剩余的牌') event.finish(); - } - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); //避免插入结算改变弃牌堆 重新判断一次 - var cards=[]; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name=='cardsDiscard'){ - if(evt.getParent('phaseDiscard')==trigger){ - var moves=evt.cards.filterInD('d'); + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard") { + if (evt.getParent("phaseDiscard") == trigger) { + var moves = evt.cards.filterInD("d"); cards.addArray(moves); } } - if(evt.name=='lose'){ - if(evt.type!='discard'||evt.position!=ui.discardPile||evt.getParent('phaseDiscard')!=trigger) return; - var moves=evt.cards.filterInD('d'); + if (evt.name == "lose") { + if ( + evt.type != "discard" || + evt.position != ui.discardPile || + evt.getParent("phaseDiscard") != trigger + ) + return; + var moves = evt.cards.filterInD("d"); cards.addArray(moves); } }); - if(cards.length>0) player.gain(cards,'gain2'); + if (cards.length > 0) player.gain(cards, "gain2"); + }, + ai: { + threaten: 1.3, + expose: 0.2, }, - ai:{ - threaten:1.3, - expose:0.2 - } }, - beige:{ - audio:2, - audioname:['re_caiwenji','ol_caiwenji'], - trigger:{global:'damageEnd'}, - filter:function(event,player){ - return (event.card&&event.card.name=='sha'&&event.source&& - event.player.isIn()&&player.countCards('he')); + beige: { + audio: 2, + audioname: ["re_caiwenji", "ol_caiwenji"], + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.source && + event.player.isIn() && + player.countCards("he") + ); }, - direct:true, - checkx:function(event,player){ - var att1=get.attitude(player,event.player); - var att2=get.attitude(player,event.source); - return att1>0&&att2<=0; + direct: true, + checkx: function (event, player) { + var att1 = get.attitude(player, event.player); + var att2 = get.attitude(player, event.source); + return att1 > 0 && att2 <= 0; }, - preHidden:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he',get.prompt2('beige',trigger.player)); - var check=lib.skill.beige.checkx(trigger,player); - next.set('ai',function(card){ - if(_status.event.goon) return 8-get.value(card); + preHidden: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", get.prompt2("beige", trigger.player)); + var check = lib.skill.beige.checkx(trigger, player); + next.set("ai", function (card) { + if (_status.event.goon) return 8 - get.value(card); return 0; }); - next.set('logSkill','beige'); - next.set('goon',check); - next.setHiddenSkill('beige'); - "step 1" - if(result.bool){ + next.set("logSkill", "beige"); + next.set("goon", check); + next.setHiddenSkill("beige"); + ("step 1"); + if (result.bool) { trigger.player.judge(); - } - else{ + } else { event.finish(); } - "step 2" - switch(result.suit){ - case 'heart':trigger.player.recover();break; - case 'diamond':trigger.player.draw(2);break; - case 'club':trigger.source.chooseToDiscard('he',2,true);break; - case 'spade':trigger.source.turnOver();break; + ("step 2"); + switch (result.suit) { + case "heart": + trigger.player.recover(); + break; + case "diamond": + trigger.player.draw(2); + break; + case "club": + trigger.source.chooseToDiscard("he", 2, true); + break; + case "spade": + trigger.source.turnOver(); + break; } }, - ai:{ - expose:0.3 - } - }, - duanchang:{ - audio:2, - audioname:['re_caiwenji','ol_caiwenji'], - forbid:['boss'], - trigger:{player:'die'}, - forced:true, - forceDie:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event){ - return event.source&&event.source.isIn(); + ai: { + expose: 0.3, }, - content:function(){ + }, + duanchang: { + audio: 2, + audioname: ["re_caiwenji", "ol_caiwenji"], + forbid: ["boss"], + trigger: { player: "die" }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event) { + return event.source && event.source.isIn(); + }, + content: function () { trigger.source.clearSkills(); }, - logTarget:'source', - ai:{ - maixie_defend:true, - threaten:function(player,target){ - if(target.hp==1) return 0.2; + logTarget: "source", + ai: { + maixie_defend: true, + threaten: function (player, target) { + if (target.hp == 1) return 0.2; return 1.5; }, - effect:{ - target:function(card,player,target,current){ - if(!target.hasFriend()) return; - if(target.hp<=1&&get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return 3; - return [1,0,0,-3*get.threaten(player)]; + effect: { + target: function (card, player, target, current) { + if (!target.hasFriend()) return; + if (target.hp <= 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return 3; + return [1, 0, 0, -3 * get.threaten(player)]; } - } - } - } + }, + }, + }, }, - huashen:{ - audio:'huashen2', - unique:true, - init:function(player){ - if(!player.storage.huashen){ - player.storage.huashen={ - owned:{} + huashen: { + audio: "huashen2", + unique: true, + init: function (player) { + if (!player.storage.huashen) { + player.storage.huashen = { + owned: {}, }; } - player.when('dieBegin').then(()=>{ - const name=player.name?player.name:player.name1; - if(name){ - const sex=get.character(name,0); - const group=get.character(name,1); - if(player.sex!=sex){ - game.broadcastAll((player,sex)=>{ - player.sex=sex; - },player,sex); - game.log(player,'将性别变为了','#y'+get.translation(sex)+'性'); + player.when("dieBegin").then(() => { + const name = player.name ? player.name : player.name1; + if (name) { + const sex = get.character(name, 0); + const group = get.character(name, 1); + if (player.sex != sex) { + game.broadcastAll( + (player, sex) => { + player.sex = sex; + }, + player, + sex + ); + game.log(player, "将性别变为了", "#y" + get.translation(sex) + "性"); } - if(player.group!=group) player.changeGroup(group); + if (player.group != group) player.changeGroup(group); } }); }, - intro:{ - content:function(storage,player){ - var str=''; - var list=Object.keys(storage.owned); - if(list.length){ - str+=get.translation(list[0]); - for(var i=1;ilib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); - dialog.add('
    【'+get.translation(lib.translate[skill+'_ab']||get.translation(skill).slice(0,2))+'】
    '+ - '
    '+get.skillInfoTranslation(skill,player)+'
    '); + mark: function (dialog, content, player) { + var list = Object.keys(content.owned); + if (list.length) { + var skill = player.storage.huashen.current2; + var character = player.storage.huashen.current; + if (skill && character) { + dialog.addSmall([ + [character], + (item, type, position, noclick, node) => + lib.skill.rehuashen.$createButton( + item, + type, + position, + noclick, + node + ), + ]); + dialog.add( + '
    【' + + get.translation( + lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2) + ) + + "】
    " + + "
    " + + get.skillInfoTranslation(skill, player) + + "
    " + ); } - if(player.isUnderControl(true)){ - dialog.addSmall([list,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); - } - else{ - dialog.addText('共有'+get.cnNumber(list.length)+'张“化身”'); + if (player.isUnderControl(true)) { + dialog.addSmall([ + list, + (item, type, position, noclick, node) => + lib.skill.rehuashen.$createButton( + item, + type, + position, + noclick, + node + ), + ]); + } else { + dialog.addText("共有" + get.cnNumber(list.length) + "张“化身”"); } + } else { + return "没有化身"; } - else{ - return '没有化身'; - } - } + }, }, - addHuashen:function(player){ - if(!player.storage.huashen) return; - if(!_status.characterlist){ + addHuashen: function (player) { + if (!player.storage.huashen) return; + if (!_status.characterlist) { lib.skill.pingjian.initList(); } _status.characterlist.randomSort(); - for(var i=0;i<_status.characterlist.length;i++){ - let name=_status.characterlist[i]; - if(name.indexOf('zuoci')!=-1||name.indexOf('key_')==0||name.indexOf('sp_key_')==0||lib.skill.rehuashen.banned.includes(name)||player.storage.huashen.owned[name]) continue; - let skills=lib.character[name][3].filter(skill=>{ - const categories=get.skillCategoriesOf(skill); - return !categories.some(type=>lib.skill.rehuashen.bannedType.includes(type)); - }) - if(skills.length){ - player.storage.huashen.owned[name]=skills; + for (var i = 0; i < _status.characterlist.length; i++) { + let name = _status.characterlist[i]; + if ( + name.indexOf("zuoci") != -1 || + name.indexOf("key_") == 0 || + name.indexOf("sp_key_") == 0 || + lib.skill.rehuashen.banned.includes(name) || + player.storage.huashen.owned[name] + ) + continue; + let skills = lib.character[name][3].filter((skill) => { + const categories = get.skillCategoriesOf(skill); + return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type)); + }); + if (skills.length) { + player.storage.huashen.owned[name] = skills; _status.characterlist.remove(name); return name; } } }, - addHuashens:function(player,num){ - var list=[]; - for(var i=0;ilib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); - event.dialog=dialog; - event.forceMine=true; - event.button=null; - for(var i=0;i + lib.skill.rehuashen.$createButton(item, type, position, noclick, node), + ]); + event.dialog = dialog; + event.forceMine = true; + event.button = null; + for (var i = 0; i < event.dialog.buttons.length; i++) { + event.dialog.buttons[i].classList.add("pointerdiv"); + event.dialog.buttons[i].classList.add("selectable"); } event.dialog.open(); - event.custom.replace.button=function(button){ - if(!event.dialog.contains(button.parentNode)) return; - if(event.control) event.control.style.opacity=1; - if(button.classList.contains('selectedx')){ - event.button=null; - button.classList.remove('selectedx'); - if(event.control){ - event.control.replacex(['cancel2']); + event.custom.replace.button = function (button) { + if (!event.dialog.contains(button.parentNode)) return; + if (event.control) event.control.style.opacity = 1; + if (button.classList.contains("selectedx")) { + event.button = null; + button.classList.remove("selectedx"); + if (event.control) { + event.control.replacex(["cancel2"]); } - } - else{ - if(event.button){ - event.button.classList.remove('selectedx'); + } else { + if (event.button) { + event.button.classList.remove("selectedx"); } - button.classList.add('selectedx'); - event.button=button; - if(event.control&&button.link){ + button.classList.add("selectedx"); + event.button = button; + if (event.control && button.link) { event.control.replacex(player.storage.huashen.owned[button.link]); } } game.check(); - } - event.custom.replace.window=function(){ - if(event.button){ - event.button.classList.remove('selectedx'); - event.button=null; + }; + event.custom.replace.window = function () { + if (event.button) { + event.button.classList.remove("selectedx"); + event.button = null; } - event.control.replacex(['cancel2']); - } + event.control.replacex(["cancel2"]); + }; - event.switchToAuto=function(){ - var cards=[]; - var skills=[]; - for(var i in player.storage.huashen.owned){ + event.switchToAuto = function () { + var cards = []; + var skills = []; + for (var i in player.storage.huashen.owned) { cards.push(i); skills.addArray(player.storage.huashen.owned[i]); } - var cond=event.triggername=='phaseBegin'?'in':'out'; + var cond = event.triggername == "phaseBegin" ? "in" : "out"; skills.randomSort(); - skills.sort(function(a,b){ - return get.skillRank(b,cond)-get.skillRank(a,cond); + skills.sort(function (a, b) { + return get.skillRank(b, cond) - get.skillRank(a, cond); }); - _status.imchoosing=false; - var skill=skills[0],character; - for(var i in player.storage.huashen.owned){ - if(player.storage.huashen.owned[i].includes(skill)){ - character=i; break; + _status.imchoosing = false; + var skill = skills[0], + character; + for (var i in player.storage.huashen.owned) { + if (player.storage.huashen.owned[i].includes(skill)) { + character = i; + break; } } - event._result={ - bool:true, - skill:skill, - character:character + event._result = { + bool: true, + skill: skill, + character: character, }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); - } - var controls=[]; - event.control=ui.create.control(); - event.control.replacex=function(){ - var args=Array.from(arguments)[0]; - if(args.includes('cancel2')&&forced){ - args.remove('cancel2'); - this.style.opacity=''; + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); + }; + var controls = []; + event.control = ui.create.control(); + event.control.replacex = function () { + var args = Array.from(arguments)[0]; + if (args.includes("cancel2") && forced) { + args.remove("cancel2"); + this.style.opacity = ""; } - args.push(function(link){ - var result=event._result; - if(link=='cancel2') result.bool=false; - else{ - if(!event.button) return; - result.bool=true; - result.skill=link; - result.character=event.button.link; + args.push(function (link) { + var result = event._result; + if (link == "cancel2") result.bool = false; + else { + if (!event.button) return; + result.bool = true; + result.skill = link; + result.character = event.button.link; } event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }); - return this.replace.apply(this,args); - } - if(!forced){ - controls.push('cancel2'); - event.control.style.opacity=1; + return this.replace.apply(this, args); + }; + if (!forced) { + controls.push("cancel2"); + event.control.style.opacity = 1; } event.control.replacex(controls); game.pause(); game.countChoose(); }; - if(event.isMine()){ - chooseButton(player,cards,event.logged); - } - else if(event.isOnline()){ - event.player.send(chooseButton,event.player,cards,event.logged); + if (event.isMine()) { + chooseButton(player, cards, event.logged); + } else if (event.isOnline()) { + event.player.send(chooseButton, event.player, cards, event.logged); event.player.wait(); game.pause(); - } - else{ + } else { switchToAuto(); } - 'step 1' - var map=event.result||result; - if(map.bool){ - if(!event.logged) player.logSkill('huashen'); - var skill=map.skill,character=map.character; - if(character!=player.storage.huashen.current){ - const old=player.storage.huashen.current; - player.storage.huashen.current=character; - player.markSkill('huashen'); - game.broadcastAll(function(player,character,old){ - player.tempname.remove(old); - player.tempname.add(character); - player.sex=lib.character[character][0]; - //player.group=lib.character[character][1]; - //player.node.name.dataset.nature=get.groupnature(player.group); - var mark=player.marks.huashen; - if(mark){ - mark.style.transition='all 0.3s'; - setTimeout(function(){ - mark.style.transition='all 0s'; - ui.refresh(mark); - mark.setBackground(character,'character'); - if(mark.firstChild){ - mark.firstChild.remove(); - } - setTimeout(function(){ - mark.style.transition=''; - mark.show(); - },50); - },200); - } - },player,character,old); - game.log(player,'将性别变为了','#y'+get.translation(lib.character[character][0])+'性'); + ("step 1"); + var map = event.result || result; + if (map.bool) { + if (!event.logged) player.logSkill("huashen"); + var skill = map.skill, + character = map.character; + if (character != player.storage.huashen.current) { + const old = player.storage.huashen.current; + player.storage.huashen.current = character; + player.markSkill("huashen"); + game.broadcastAll( + function (player, character, old) { + player.tempname.remove(old); + player.tempname.add(character); + player.sex = lib.character[character][0]; + //player.group=lib.character[character][1]; + //player.node.name.dataset.nature=get.groupnature(player.group); + var mark = player.marks.huashen; + if (mark) { + mark.style.transition = "all 0.3s"; + setTimeout(function () { + mark.style.transition = "all 0s"; + ui.refresh(mark); + mark.setBackground(character, "character"); + if (mark.firstChild) { + mark.firstChild.remove(); + } + setTimeout(function () { + mark.style.transition = ""; + mark.show(); + }, 50); + }, 200); + } + }, + player, + character, + old + ); + game.log( + player, + "将性别变为了", + "#y" + get.translation(lib.character[character][0]) + "性" + ); player.changeGroup(lib.character[character][1]); } - player.storage.huashen.current2=skill; - if(!player.additionalSkills.huashen||!player.additionalSkills.huashen.includes(skill)){ - player.addAdditionalSkills('huashen',skill); - player.flashAvatar('huashen',character); - player.syncStorage('huashen'); - player.updateMarks('huashen'); + player.storage.huashen.current2 = skill; + if ( + !player.additionalSkills.huashen || + !player.additionalSkills.huashen.includes(skill) + ) { + player.addAdditionalSkills("huashen", skill); + player.flashAvatar("huashen", character); + player.syncStorage("huashen"); + player.updateMarks("huashen"); // lib.skill.rehuashen.createAudio(character,skill,'zuoci'); } } - } + }, }, - huashen2:{audio:2}, - xinsheng:{ - audio:2, - unique:true, - trigger:{player:'damageEnd'}, - frequent:true, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - lib.skill.huashen.addHuashens(player,1); - 'step 2' - if(--event.num>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2('xinsheng')).set('frequentSkill',event.name); - } - else event.finish(); - 'step 3' - if(result.bool&&player.hasSkill('xinsheng')){ - player.logSkill('xinsheng'); + huashen2: { audio: 2 }, + xinsheng: { + audio: 2, + unique: true, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); + lib.skill.huashen.addHuashens(player, 1); + ("step 2"); + if ( + --event.num > 0 && + player.hasSkill(event.name) && + !get.is.blocked(event.name, player) + ) { + player.chooseBool(get.prompt2("xinsheng")).set("frequentSkill", event.name); + } else event.finish(); + ("step 3"); + if (result.bool && player.hasSkill("xinsheng")) { + player.logSkill("xinsheng"); event.goto(1); } }, }, - huoshou:{ - audio:"huoshou1", - audioname:['re_menghuo'], - locked:true, - group:['huoshou1','huoshou2'], - preHidden:['huoshou1','huoshou2'], - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name=='nanman') return 0; - } - } - } - }, - huoshou1:{ - audio:2, - audioname:['re_menghuo'], - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - filter:function(event,player){ - return (event.card.name=='nanman'); + huoshou: { + audio: "huoshou1", + audioname: ["re_menghuo"], + locked: true, + group: ["huoshou1", "huoshou2"], + preHidden: ["huoshou1", "huoshou2"], + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "nanman") return 0; + }, + }, }, - content:function(){ + }, + huoshou1: { + audio: 2, + audioname: ["re_menghuo"], + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + filter: function (event, player) { + return event.card.name == "nanman"; + }, + content: function () { trigger.cancel(); }, }, - huoshou2:{ - audio:"huoshou1", - audioname:['re_menghuo'], - trigger:{global:'useCard'}, - forced:true, - filter:function(event,player){ - return (event.card&&event.card.name=='nanman'&&event.player!=player); + huoshou2: { + audio: "huoshou1", + audioname: ["re_menghuo"], + trigger: { global: "useCard" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "nanman" && event.player != player; }, - content:function(){ - trigger.customArgs.default.customSource=player; - } - }, - zaiqixx:{ - audio:'zaiqi', - inherit:'zaiqi', - }, - zaiqi:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ - return !event.numFixed&&player.hp=2; + } else if (player.getDamagedHp() == 2) { + return player.countCards("h") >= 2; } return true; }, - content:function(){ - "step 0" + content: function () { + "step 0"; trigger.changeToZero(); - event.cards=get.cards(player.getDamagedHp()+(event.name=='zaiqi'?0:1)); + event.cards = get.cards(player.getDamagedHp() + (event.name == "zaiqi" ? 0 : 1)); game.cardsGotoOrdering(event.cards); player.showCards(event.cards); - "step 1" - var num=0; - for(var i=0;i1; + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); + }, + }, + lieren: { + shaRelated: true, + audio: 2, + audioname: ["boss_lvbu3", "ol_zhurong"], + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return ( + event.card && + event.card.name == "sha" && + event.getParent().name == "sha" && + event.player.isIn() && + player.canCompare(event.player) + ); + }, + check: function (event, player) { + return get.attitude(player, event.player) < 0 && player.countCards("h") > 1; }, //priority:5, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseToCompare(trigger.player); - "step 1" - if(result.bool&&trigger.player.countGainableCards(player,'he')){ - player.gainPlayerCard(trigger.player,true,'he'); + ("step 1"); + if (result.bool && trigger.player.countGainableCards(player, "he")) { + player.gainPlayerCard(trigger.player, true, "he"); } - } - }, - xingshang:{ - audio:2, - trigger:{global:'die'}, - preHidden:true, - filter:function(event){ - return event.player.countCards('he')>0; - }, - content:function(){ - "step 0" - event.togain=trigger.player.getCards('he'); - player.gain(event.togain,trigger.player,'giveAuto','bySelf'); }, }, - fangzhu:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - preHidden:true, - content:function(){ - "step 0" - var draw=player.getDamagedHp(); - player.chooseTarget(get.prompt('fangzhu'),'令一名其他角色翻面'+(draw>0?'并摸'+get.cnNumber(draw)+'张牌':''),function(card,player,target){ - return player!=target - }).setHiddenSkill('fangzhu').set('ai',target=>{ - if(target.hasSkillTag('noturn')) return 0; - var player=_status.event.player; - var current=_status.currentPhase; - var dis=current?get.distance(current,target,'absolute'):1; - var draw=player.getDamagedHp(); - var att=get.attitude(player,target); - if(att==0) return target.hasJudge('lebu')?Math.random()/3:Math.sqrt(get.threaten(target))/5+Math.random()/2; - if(att>0){ - if(target.isTurnedOver()) return att+draw; - if(draw<4) return -1; - if(current&&target.getSeatNum()>current.getSeatNum()) return att+draw/3; - return 10*Math.sqrt(Math.max(0.01,get.threaten(target)))/(3.5-draw)+dis/(2*game.countPlayer()); - } - else{ - if(target.isTurnedOver()) return att-draw; - if(draw>=5) return -1; - if(current&&target.getSeatNum()<=current.getSeatNum()) return -att+draw/3; - return (4.25-draw)*10*Math.sqrt(Math.max(0.01,get.threaten(target)))+2*game.countPlayer()/dis; - } - }); - "step 1" - if(result.bool){ - player.logSkill('fangzhu',result.targets); - var draw=player.getDamagedHp(); - if(draw>0) result.targets[0].draw(draw); + xingshang: { + audio: 2, + trigger: { global: "die" }, + preHidden: true, + filter: function (event) { + return event.player.countCards("he") > 0; + }, + content: function () { + "step 0"; + event.togain = trigger.player.getCards("he"); + player.gain(event.togain, trigger.player, "giveAuto", "bySelf"); + }, + }, + fangzhu: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + var draw = player.getDamagedHp(); + player + .chooseTarget( + get.prompt("fangzhu"), + "令一名其他角色翻面" + (draw > 0 ? "并摸" + get.cnNumber(draw) + "张牌" : ""), + function (card, player, target) { + return player != target; + } + ) + .setHiddenSkill("fangzhu") + .set("ai", (target) => { + if (target.hasSkillTag("noturn")) return 0; + var player = _status.event.player; + var current = _status.currentPhase; + var dis = current ? get.distance(current, target, "absolute") : 1; + var draw = player.getDamagedHp(); + var att = get.attitude(player, target); + if (att == 0) + return target.hasJudge("lebu") + ? Math.random() / 3 + : Math.sqrt(get.threaten(target)) / 5 + Math.random() / 2; + if (att > 0) { + if (target.isTurnedOver()) return att + draw; + if (draw < 4) return -1; + if (current && target.getSeatNum() > current.getSeatNum()) + return att + draw / 3; + return ( + (10 * Math.sqrt(Math.max(0.01, get.threaten(target)))) / (3.5 - draw) + + dis / (2 * game.countPlayer()) + ); + } else { + if (target.isTurnedOver()) return att - draw; + if (draw >= 5) return -1; + if (current && target.getSeatNum() <= current.getSeatNum()) + return -att + draw / 3; + return ( + (4.25 - draw) * 10 * Math.sqrt(Math.max(0.01, get.threaten(target))) + + (2 * game.countPlayer()) / dis + ); + } + }); + ("step 1"); + if (result.bool) { + player.logSkill("fangzhu", result.targets); + var draw = player.getDamagedHp(); + if (draw > 0) result.targets[0].draw(draw); result.targets[0].turnOver(); } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target.hp<=1) return; - if(!target.hasFriend()) return; - var hastarget=false; - var turnfriend=false; - var players=game.filterPlayer(); - for(var i=0;i0&&players[i].isTurnedOver()){ - hastarget=true; - turnfriend=true; + if (get.attitude(target, players[i]) > 0 && players[i].isTurnedOver()) { + hastarget = true; + turnfriend = true; } } - if(get.attitude(player,target)>0&&!hastarget) return; - if(turnfriend||target.hp==target.maxHp) return [0.5,1]; - if(target.hp>1) return [1,0.5]; + if (get.attitude(player, target) > 0 && !hastarget) return; + if (turnfriend || target.hp == target.maxHp) return [0.5, 1]; + if (target.hp > 1) return [1, 0.5]; } - } - } - } - }, - songwei:{ - unique:true, - group:'songwei2', - audioname:['re_caopi'], - audio:"songwei2", - zhuSkill:true, - }, - songwei2:{ - audio:2, - audioname:['re_caopi'], - forceaudio:true, - trigger:{global:'judgeEnd'}, - filter:function(event,player){ - if(event.player==player||event.player.group!='wei') return false; - if(event.result.color!='black') return false; - return player.hasZhuSkill('songwei',event.player); + }, + }, }, - direct:true, - content:function(){ - 'step 0' - trigger.player.chooseBool('是否发动【颂威】,令'+get.translation(player)+'摸一张牌?').set('choice',get.attitude(trigger.player,player)>0); - 'step 1' - if(result.bool){ - player.logSkill('songwei2'); - trigger.player.line(player,'green'); + }, + songwei: { + unique: true, + group: "songwei2", + audioname: ["re_caopi"], + audio: "songwei2", + zhuSkill: true, + }, + songwei2: { + audio: 2, + audioname: ["re_caopi"], + forceaudio: true, + trigger: { global: "judgeEnd" }, + filter: function (event, player) { + if (event.player == player || event.player.group != "wei") return false; + if (event.result.color != "black") return false; + return player.hasZhuSkill("songwei", event.player); + }, + direct: true, + content: function () { + "step 0"; + trigger.player + .chooseBool("是否发动【颂威】,令" + get.translation(player) + "摸一张牌?") + .set("choice", get.attitude(trigger.player, player) > 0); + ("step 1"); + if (result.bool) { + player.logSkill("songwei2"); + trigger.player.line(player, "green"); player.draw(); } - } - }, - jiezi:{ - trigger:{global:['phaseDrawSkipped','phaseDrawCancelled']}, - audio:2, - forced:true, - filter:function(event,player){ - return event.player!=player; }, - content:function(){ + }, + jiezi: { + trigger: { global: ["phaseDrawSkipped", "phaseDrawCancelled"] }, + audio: 2, + forced: true, + filter: function (event, player) { + return event.player != player; + }, + content: function () { player.draw(); - } - }, - gzduanliang:{ - audio:'duanliang1', - audioname:['re_xuhuang'], - group:['duanliang1','duanliang2'], - ai:{ - threaten:1.2 - } - }, - duanliang:{ - audio:'duanliang1', - audioname:['re_xuhuang'], - group:['duanliang1','duanliang3'], - ai:{ - threaten:1.2 - } - }, - duanliang1:{ - audio:2, - audioname:['re_xuhuang'], - enable:'chooseToUse', - filterCard:function(card){ - if(get.type(card)!='basic'&&get.type(card)!='equip') return false; - return get.color(card)=='black'; }, - filter:function(event,player){ - return player.countCards('hes',{type:['basic','equip'],color:'black'}) + }, + gzduanliang: { + audio: "duanliang1", + audioname: ["re_xuhuang"], + group: ["duanliang1", "duanliang2"], + ai: { + threaten: 1.2, }, - position:'hes', - viewAs:{name:'bingliang'}, - prompt:'将一黑色的基本牌或装备牌当兵粮寸断使用', - check:function(card){return 6-get.value(card)}, - ai:{ - order:9 - } }, - duanliang2:{ - mod:{ - targetInRange:function(card,player,target){ - if(card.name=='bingliang'){ - if(get.distance(player,target)<=2) return true; + duanliang: { + audio: "duanliang1", + audioname: ["re_xuhuang"], + group: ["duanliang1", "duanliang3"], + ai: { + threaten: 1.2, + }, + }, + duanliang1: { + audio: 2, + audioname: ["re_xuhuang"], + enable: "chooseToUse", + filterCard: function (card) { + if (get.type(card) != "basic" && get.type(card) != "equip") return false; + return get.color(card) == "black"; + }, + filter: function (event, player) { + return player.countCards("hes", { type: ["basic", "equip"], color: "black" }); + }, + position: "hes", + viewAs: { name: "bingliang" }, + prompt: "将一黑色的基本牌或装备牌当兵粮寸断使用", + check: function (card) { + return 6 - get.value(card); + }, + ai: { + order: 9, + }, + }, + duanliang2: { + mod: { + targetInRange: function (card, player, target) { + if (card.name == "bingliang") { + if (get.distance(player, target) <= 2) return true; } - } - } + }, + }, }, - duanliang3:{ - mod:{ - targetInRange:function(card,player,target){ - if(card.name=='bingliang'){ - if(target.countCards('h')>=player.countCards('h')) return true; + duanliang3: { + mod: { + targetInRange: function (card, player, target) { + if (card.name == "bingliang") { + if (target.countCards("h") >= player.countCards("h")) return true; } - } - } + }, + }, }, - haoshi:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - filter:function(event,player){ + haoshi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { return !event.numFixed; }, - preHidden:true, - check:function(event,player){ - return (player.countCards('h')+2+event.num)<=5||game.hasPlayer(function(target){ - return player!==target&&!game.hasPlayer(function(current){ - return current!==player&¤t!==target&¤t.countCards('h')0; - }); + preHidden: true, + check: function (event, player) { + return ( + player.countCards("h") + 2 + event.num <= 5 || + game.hasPlayer(function (target) { + return ( + player !== target && + !game.hasPlayer(function (current) { + return ( + current !== player && + current !== target && + current.countCards("h") < target.countCards("h") + ); + }) && + get.attitude(player, target) > 0 + ); + }) + ); }, - content:function(){ - trigger.num+=2; - player.addSkill('haoshi2'); + content: function () { + trigger.num += 2; + player.addSkill("haoshi2"); }, - ai:{ - threaten:2, - noh:true, - skillTagFilter:function(player,tag){ - if(tag=='noh'){ - if(player.countCards('h')!=2) return false; + ai: { + threaten: 2, + noh: true, + skillTagFilter: function (player, tag) { + if (tag == "noh") { + if (player.countCards("h") != 2) return false; } - } - } + }, + }, }, - haoshi2:{ - trigger:{player:'phaseDrawEnd'}, - forced:true, - popup:false, - audio:false, - content:function(){ - "step 0" - player.removeSkill('haoshi2'); - if(player.countCards('h')<=5){ + haoshi2: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + popup: false, + audio: false, + content: function () { + "step 0"; + player.removeSkill("haoshi2"); + if (player.countCards("h") <= 5) { event.finish(); return; } player.chooseCardTarget({ - selectCard:Math.floor(player.countCards('h')/2), - filterTarget:function(card,player,target){ + selectCard: Math.floor(player.countCards("h") / 2), + filterTarget: function (card, player, target) { return target.isMinHandcard(); }, - prompt:'将一半的手牌交给场上手牌数最少的一名角色', - forced:true, - ai2:function(target){ - return get.attitude(_status.event.player,target); - } + prompt: "将一半的手牌交给场上手牌数最少的一名角色", + forced: true, + ai2: function (target) { + return get.attitude(_status.event.player, target); + }, }); - "step 1" - if(result.targets&&result.targets[0]){ - player.give(result.cards,result.targets[0]); + ("step 1"); + if (result.targets && result.targets[0]) { + player.give(result.cards, result.targets[0]); } - } + }, }, - dimeng:{ - audio:2, - enable:'phaseUse', - usable:1, - position:'he', - filterCard:function(){ - var targets=ui.selected.targets; - if(targets.length==2){ - if(Math.abs(targets[0].countCards('h')-targets[1].countCards('h'))<=ui.selected.cards.length) return false; + dimeng: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: function () { + var targets = ui.selected.targets; + if (targets.length == 2) { + if ( + Math.abs(targets[0].countCards("h") - targets[1].countCards("h")) <= + ui.selected.cards.length + ) + return false; } return true; }, - selectCard:[0,Infinity], - selectTarget:2, - complexCard:true, - filterTarget:function(card,player,target){ - if(player==target) return false; + selectCard: [0, Infinity], + selectTarget: 2, + complexCard: true, + filterTarget: function (card, player, target) { + if (player == target) return false; return true; }, - filterOk:function(){ - var targets=ui.selected.targets; - if(targets.length!=2) return false; - return (Math.abs(targets[0].countCards('h')-targets[1].countCards('h'))==ui.selected.cards.length); + filterOk: function () { + var targets = ui.selected.targets; + if (targets.length != 2) return false; + return ( + Math.abs(targets[0].countCards("h") - targets[1].countCards("h")) == + ui.selected.cards.length + ); }, - multitarget:true, - multiline:true, - content:function(){ + multitarget: true, + multiline: true, + content: function () { targets[0].swapHandcards(targets[1]); }, - check:function(card){ - var list=[],player=_status.event.player; - var num=player.countCards('he'); + check: function (card) { + var list = [], + player = _status.event.player; + var num = player.countCards("he"); var count; - var players=game.filterPlayer(); - for(var i=0;i3) list.push(players[i]); + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 3) + list.push(players[i]); } - list.sort(function(a,b){ - return a.countCards('h')-b.countCards('h'); + list.sort(function (a, b) { + return a.countCards("h") - b.countCards("h"); }); - if(list.length==0) return -1; - var from=list[0]; - list.length=0; + if (list.length == 0) return -1; + var from = list[0]; + list.length = 0; - for(var i=0;i=list[0].countCards('h')) return -1; - for(var i=0;i= list[0].countCards("h")) return -1; + for (var i = 0; i < list.length && from.countCards("h") < list[i].countCards("h"); i++) { + if (list[i].countCards("h") - from.countCards("h") <= num) { + count = list[i].countCards("h") - from.countCards("h"); + break; } } - if(count<2&&from.countCards('h')>=2) return -1; - if(ui.selected.cards.length= 2) return -1; + if (ui.selected.cards.length < count) return 11 - get.value(card); return -1; }, - ai:{ - order:6, - threaten:3, - expose:0.9, - result:{ - target:function(player,target){ - var list=[]; - var num=player.countCards('he'); - var players=game.filterPlayer(); - if(ui.selected.targets.length==0){ - for(var i=0;i3) list.push(players[i]); + ai: { + order: 6, + threaten: 3, + expose: 0.9, + result: { + target: function (player, target) { + var list = []; + var num = player.countCards("he"); + var players = game.filterPlayer(); + if (ui.selected.targets.length == 0) { + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 3) + list.push(players[i]); } - list.sort(function(a,b){ - return a.countCards('h')-b.countCards('h'); + list.sort(function (a, b) { + return a.countCards("h") - b.countCards("h"); }); - if(target==list[0]) return get.attitude(player,target); - return -get.attitude(player,target); - } - else{ - var from=ui.selected.targets[0]; - for(var i=0;i=list[0].countCards('h')) return -get.attitude(player,target); - for(var i=0;i=2) return -get.attitude(player,target); - if(target==list[i]) return get.attitude(player,target); - return -get.attitude(player,target); + if (from.countCards("h") >= list[0].countCards("h")) + return -get.attitude(player, target); + for ( + var i = 0; + i < list.length && from.countCards("h") < list[i].countCards("h"); + i++ + ) { + if (list[i].countCards("h") - from.countCards("h") <= num) { + var count = list[i].countCards("h") - from.countCards("h"); + if (count < 2 && from.countCards("h") >= 2) + return -get.attitude(player, target); + if (target == list[i]) return get.attitude(player, target); + return -get.attitude(player, target); } } } - } - } - } + }, + }, + }, }, - yinghun:{ - audio:2, - audioname:['re_sunjian','sunce','re_sunben','re_sunce','ol_sunjian'], - audioname2:{ - re_sunyi:'gzyinghun_re_sunyi', - tw_ol_sunjian:'yinghun_ol_sunjian', + yinghun: { + audio: 2, + audioname: ["re_sunjian", "sunce", "re_sunben", "re_sunce", "ol_sunjian"], + audioname2: { + re_sunyi: "gzyinghun_re_sunyi", + tw_ol_sunjian: "yinghun_ol_sunjian", }, - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&_status.event&&_status.event.type=='phase'&&get.tag(card,'recover')){ - if(player.needsToDiscard()) return num/3; + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + _status.event && + _status.event.type == "phase" && + get.tag(card, "recover") + ) { + if (player.needsToDiscard()) return num / 3; return 0; } - } + }, }, - locked:false, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - preHidden:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('yinghun'),function(card,player,target){ - return player!=target; - }).set('ai',function(target){ - var player=_status.event.player; - if(player.getDamagedHp()==1&&target.countCards('he')==0){ - return 0; + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yinghun"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.getDamagedHp() == 1 && target.countCards("he") == 0) { + return 0; + } + if (get.attitude(_status.event.player, target) > 0) { + return 10 + get.attitude(_status.event.player, target); + } + if (player.getDamagedHp() == 1) { + return -1; + } + return 1; + }) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + event.num = player.getDamagedHp(); + player.logSkill(event.name, result.targets); + event.target = result.targets[0]; + if (event.num == 1) { + event.directcontrol = true; + } else { + var str1 = "摸" + get.cnNumber(event.num, true) + "弃一"; + var str2 = "摸一弃" + get.cnNumber(event.num, true); + player + .chooseControl(str1, str2, function (event, player) { + if (player.isHealthy()) return 1 - _status.event.choice; + return _status.event.choice; + }) + .set("choice", get.attitude(player, event.target) > 0 ? 0 : 1); + event.str = str1; } - if(get.attitude(_status.event.player,target)>0){ - return 10+get.attitude(_status.event.player,target); - } - if(player.getDamagedHp()==1){ - return -1; - } - return 1; - }).setHiddenSkill(event.name); - "step 1" - if(result.bool){ - event.num=player.getDamagedHp(); - player.logSkill(event.name,result.targets); - event.target=result.targets[0]; - if(event.num==1){ - event.directcontrol=true; - } - else{ - var str1='摸'+get.cnNumber(event.num,true)+'弃一'; - var str2='摸一弃'+get.cnNumber(event.num,true); - player.chooseControl(str1,str2,function(event,player){ - if(player.isHealthy()) return 1-_status.event.choice; - return _status.event.choice; - }).set('choice',(get.attitude(player,event.target)>0)?0:1); - event.str=str1; - } - } - else{ + } else { event.finish(); } - "step 2" - if(event.directcontrol||result.control==event.str){ - if(event.num>0) event.target.draw(event.num); - event.target.chooseToDiscard(true,'he'); - } - else{ + ("step 2"); + if (event.directcontrol || result.control == event.str) { + if (event.num > 0) event.target.draw(event.num); + event.target.chooseToDiscard(true, "he"); + } else { event.target.draw(); - if(event.num>0) event.target.chooseToDiscard(event.num,true,'he'); + if (event.num > 0) event.target.chooseToDiscard(event.num, true, "he"); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')&&get.itemtype(player)==='player'&&target.hp>(player.hasSkillTag('damageBonus',true,{ - target:target, - card:card - })?2:1)) return [1,1]; - } + ai: { + effect: { + target: function (card, player, target) { + if ( + get.tag(card, "damage") && + get.itemtype(player) === "player" && + target.hp > + (player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ? 2 + : 1) + ) + return [1, 1]; + }, }, - threaten:function(player,target){ - return Math.max(0.5,target.getDamagedHp()/2); + threaten: function (player, target) { + return Math.max(0.5, target.getDamagedHp() / 2); }, - maixie:true - } + maixie: true, + }, }, - gzyinghun:{ - audio:'yinghun', - audioname:['re_sunjian','sunce','re_sunben','re_sunce','ol_sunjian','sb_sunce'], - audioname2:{ - re_sunyi:'gzyinghun_re_sunyi', - tw_ol_sunjian:'yinghun_ol_sunjian', + gzyinghun: { + audio: "yinghun", + audioname: ["re_sunjian", "sunce", "re_sunben", "re_sunce", "ol_sunjian", "sb_sunce"], + audioname2: { + re_sunyi: "gzyinghun_re_sunyi", + tw_ol_sunjian: "yinghun_ol_sunjian", }, - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&_status.event&&_status.event.type=='phase'&&get.tag(card,'recover')){ - if(player.needsToDiscard()) return num/3; + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + _status.event && + _status.event.type == "phase" && + get.tag(card, "recover") + ) { + if (player.needsToDiscard()) return num / 3; return 0; } - } + }, }, - locked:false, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.getDamagedHp()>0; + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getDamagedHp() > 0; }, - direct:true, - preHidden:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('gzyinghun'),function(card,player,target){ - return player!=target; - }).set('ai',function(target){ - var player=_status.event.player; - if(player.getDamagedHp()==1&&target.countCards('he')==0){ - return 0; + direct: true, + preHidden: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("gzyinghun"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (player.getDamagedHp() == 1 && target.countCards("he") == 0) { + return 0; + } + if (get.attitude(_status.event.player, target) > 0) { + return 10 + get.attitude(_status.event.player, target); + } + if (player.getDamagedHp() == 1) { + return -1; + } + return 1; + }) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + event.num = player.getDamagedHp(); + player.logSkill(event.name, result.targets); + event.target = result.targets[0]; + if (event.num == 1) { + event.directcontrol = true; + } else { + var str1 = "摸" + get.cnNumber(event.num, true) + "弃一"; + var str2 = "摸一弃" + get.cnNumber(event.num, true); + player + .chooseControl(str1, str2, function (event, player) { + return _status.event.choice; + }) + .set("choice", get.attitude(player, event.target) > 0 ? str1 : str2); + event.str = str1; } - if(get.attitude(_status.event.player,target)>0){ - return 10+get.attitude(_status.event.player,target); - } - if(player.getDamagedHp()==1){ - return -1; - } - return 1; - }).setHiddenSkill(event.name); - "step 1" - if(result.bool){ - event.num=player.getDamagedHp(); - player.logSkill(event.name,result.targets); - event.target=result.targets[0]; - if(event.num==1){ - event.directcontrol=true; - } - else{ - var str1='摸'+get.cnNumber(event.num,true)+'弃一'; - var str2='摸一弃'+get.cnNumber(event.num,true); - player.chooseControl(str1,str2,function(event,player){ - return _status.event.choice; - }).set('choice',get.attitude(player,event.target)>0?str1:str2); - event.str=str1; - } - } - else{ + } else { event.finish(); } - "step 2" - if(event.directcontrol||result.control==event.str){ + ("step 2"); + if (event.directcontrol || result.control == event.str) { event.target.draw(event.num); - event.target.chooseToDiscard(true,'he'); - } - else{ + event.target.chooseToDiscard(true, "he"); + } else { event.target.draw(); - event.target.chooseToDiscard(event.num,true,'he'); + event.target.chooseToDiscard(event.num, true, "he"); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')&&get.itemtype(player)==='player'&&target.hp>(player.hasSkillTag('damageBonus',true,{ - target:target, - card:card - })?2:1)) return [1,1]; - } + ai: { + effect: { + target: function (card, player, target) { + if ( + get.tag(card, "damage") && + get.itemtype(player) === "player" && + target.hp > + (player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ? 2 + : 1) + ) + return [1, 1]; + }, }, - threaten:function(player,target){ - return Math.max(0.5,target.getDamagedHp()/2); + threaten: function (player, target) { + return Math.max(0.5, target.getDamagedHp() / 2); }, - maixie:true - } - }, - yinghun_ol_sunjian:{audio:2}, - jiuchi:{ - audio:2, - audioname:['re_dongzhuo'], - enable:'chooseToUse', - filterCard:function(card){ - return get.suit(card)=='spade'; + maixie: true, }, - viewAs:{name:'jiu'}, - viewAsFilter:function(player){ - if(!player.countCards('hs',{suit:'spade'})) return false; + }, + yinghun_ol_sunjian: { audio: 2 }, + jiuchi: { + audio: 2, + audioname: ["re_dongzhuo"], + enable: "chooseToUse", + filterCard: function (card) { + return get.suit(card) == "spade"; + }, + viewAs: { name: "jiu" }, + viewAsFilter: function (player) { + if (!player.countCards("hs", { suit: "spade" })) return false; return true; }, - prompt:'将一张黑桃手牌当酒使用', - check:function(card){ - if(_status.event.type=='dying') return 1/Math.max(0.1,get.value(card)); - return 4-get.value(card); + prompt: "将一张黑桃手牌当酒使用", + check: function (card) { + if (_status.event.type == "dying") return 1 / Math.max(0.1, get.value(card)); + return 4 - get.value(card); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5, - } }, - roulin:{ - audio:2, - audioname:['re_dongzhuo','ol_dongzhuo'], - trigger:{player:'useCardToPlayered',target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(player==event.player){ - return event.target.hasSex('female'); + roulin: { + audio: 2, + audioname: ["re_dongzhuo", "ol_dongzhuo"], + trigger: { player: "useCardToPlayered", target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (player == event.player) { + return event.target.hasSex("female"); } - return event.player.hasSex('female'); + return event.player.hasSex("female"); }, - check:function(event,player){ - return player==event.player; + check: function (event, player) { + return player == event.player; }, - content:function(){ - var id=(player==trigger.player?trigger.target:player).playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number'){ + content: function () { + var id = (player == trigger.player ? trigger.target : player).playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { map[id].shanRequired++; - } - else{ - map[id].shanRequired=2; + } else { + map[id].shanRequired = 2; } }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg.card.name!='sha'||!arg.target.hasSex('female')||arg.target.countCards('h','shan')>1) return false; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + arg.card.name != "sha" || + !arg.target.hasSex("female") || + arg.target.countCards("h", "shan") > 1 + ) + return false; }, }, }, - benghuai:{ - audio:2, - audioname:['zhugedan','re_dongzhuo','ol_dongzhuo','re_zhugedan'], - trigger:{player:'phaseJieshuBegin'}, - forced:true, - check:function(){ + benghuai: { + audio: 2, + audioname: ["zhugedan", "re_dongzhuo", "ol_dongzhuo", "re_zhugedan"], + trigger: { player: "phaseJieshuBegin" }, + forced: true, + check: function () { return false; }, - filter:function(event,player){ - return !player.isMinHp()&&!player.hasSkill('rejiuchi_air')&&!player.hasSkill('oljiuchi_air'); + filter: function (event, player) { + return ( + !player.isMinHp() && + !player.hasSkill("rejiuchi_air") && + !player.hasSkill("oljiuchi_air") + ); }, - content:function(){ - "step 0" - player.chooseControl('baonue_hp','baonue_maxHp',function(event,player){ - if(player.hp==player.maxHp) return 'baonue_hp'; - if(player.hp0); - 'step 1' - if(result.bool){ - player.logSkill('baonue'); - trigger.source.line(player,'green') - trigger.source.judge(function(card){ - if(get.suit(card)=='spade') return 4; + }, + baonue: { + unique: true, + group: "baonue2", + audioname: ["re_dongzhuo"], + audio: "baonue2", + zhuSkill: true, + }, + baonue2: { + audio: 2, + audioname: ["re_dongzhuo"], + //forceaudio:true, + trigger: { global: "damageSource" }, + filter: function (event, player) { + if (player == event.source || !event.source || event.source.group != "qun") return false; + return player.hasZhuSkill("baonue", event.source); + }, + direct: true, + content: function () { + "step 0"; + trigger.source + .chooseBool("是否对" + get.translation(player) + "发动【暴虐】?") + .set("choice", get.attitude(trigger.source, player) > 0); + ("step 1"); + if (result.bool) { + player.logSkill("baonue"); + trigger.source.line(player, "green"); + trigger.source.judge(function (card) { + if (get.suit(card) == "spade") return 4; return 0; - }).judge2=function(result){ - return result.bool?true:false; + }).judge2 = function (result) { + return result.bool ? true : false; }; - } - else{ + } else { event.finish(); } - 'step 2' - if(result.suit=='spade'){ + ("step 2"); + if (result.suit == "spade") { player.recover(); } - } - }, - luanwu:{ - audio:2, - audioname:['re_jiaxu'], - unique:true, - enable:'phaseUse', - limited:true, - skillAnimation:'epic', - animationColor:'thunder', - filterTarget:function(card,player,target){ - return target!=player; }, - selectTarget:-1, - multitarget:true, - multiline:true, - content:function(){ - "step 0" - player.awakenSkill('luanwu'); - event.current=player.next; - event.currented=[]; - "step 1" + }, + luanwu: { + audio: 2, + audioname: ["re_jiaxu"], + unique: true, + enable: "phaseUse", + limited: true, + skillAnimation: "epic", + animationColor: "thunder", + filterTarget: function (card, player, target) { + return target != player; + }, + selectTarget: -1, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + player.awakenSkill("luanwu"); + event.current = player.next; + event.currented = []; + ("step 1"); event.currented.push(event.current); - event.current.addTempClass('target'); - event.current.chooseToUse('乱武:使用一张杀或失去1点体力',function(card){ - if(get.name(card)!='sha') return false; - return lib.filter.cardEnabled.apply(this,arguments) - },function(card,player,target){ - if(player==target) return false; - var dist=get.distance(player,target); - if(dist>1){ - if(game.hasPlayer(function(current){ - return current!=player&&get.distance(player,current) 1) { + if ( + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) < dist; + }) + ) { + return false; + } + } + return lib.filter.filterTarget.apply(this, arguments); } - } - return lib.filter.filterTarget.apply(this,arguments); - }).set('ai2',function(){ - return get.effect_use.apply(this,arguments)+0.01; - }).set('addCount',false); - "step 2" - if(result.bool==false) event.current.loseHp(); - event.current=event.current.next; - if(event.current!=player&&!event.currented.includes(event.current)){ + ) + .set("ai2", function () { + return get.effect_use.apply(this, arguments) + 0.01; + }) + .set("addCount", false); + ("step 2"); + if (result.bool == false) event.current.loseHp(); + event.current = event.current.next; + if (event.current != player && !event.currented.includes(event.current)) { game.delay(0.5); event.goto(1); } }, - ai:{ - order:1, - result:{ - player:function(player){ - if(lib.config.mode=='identity'&&game.zhu.isZhu&&player.identity=='fan'){ - if(game.zhu.hp==1&&game.zhu.countCards('h')<=2) return 1; + ai: { + order: 1, + result: { + player: function (player) { + if (lib.config.mode == "identity" && game.zhu.isZhu && player.identity == "fan") { + if (game.zhu.hp == 1 && game.zhu.countCards("h") <= 2) return 1; } - var num=0; - var players=game.filterPlayer(); - for(var i=0;i0) att=1; - if(att<0) att=-1; - if(players[i]!=player&&players[i].hp<=3){ - if(players[i].countCards('h')==0) num+=att/players[i].hp; - else if(players[i].countCards('h')==1) num+=att/2/players[i].hp; - else if(players[i].countCards('h')==2) num+=att/4/players[i].hp; + var num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var att = get.attitude(player, players[i]); + if (att > 0) att = 1; + if (att < 0) att = -1; + if (players[i] != player && players[i].hp <= 3) { + if (players[i].countCards("h") == 0) num += att / players[i].hp; + else if (players[i].countCards("h") == 1) num += att / 2 / players[i].hp; + else if (players[i].countCards("h") == 2) num += att / 4 / players[i].hp; } - if(players[i].hp==1) num+=att*1.5; + if (players[i].hp == 1) num += att * 1.5; } - if(player.hp==1){ + if (player.hp == 1) { return -num; } - if(player.hp==2){ - return -game.players.length/4-num; + if (player.hp == 2) { + return -game.players.length / 4 - num; } - return -game.players.length/3-num; - } - } - } - }, - wansha:{ - locked:true, - audio:2, - audioname:['boss_lvbu3','shen_simayi'], - global:'wansha2', - trigger:{global:'dying'}, - priority:15, - forced:true, - preHidden:true, - filter:function(event,player,name){ - return _status.currentPhase==player&&event.player!=player; + return -game.players.length / 3 - num; + }, + }, }, - content:function(){} }, - wansha2:{ - mod:{ - cardSavable:function(card,player){ - if(card.name=='tao'&&_status.currentPhase&&_status.currentPhase.isIn()&&_status.currentPhase.hasSkill('wansha')&&_status.currentPhase!=player){ - if(!player.isDying()) return false; + wansha: { + locked: true, + audio: 2, + audioname: ["boss_lvbu3", "shen_simayi"], + global: "wansha2", + trigger: { global: "dying" }, + priority: 15, + forced: true, + preHidden: true, + filter: function (event, player, name) { + return _status.currentPhase == player && event.player != player; + }, + content: function () {}, + }, + wansha2: { + mod: { + cardSavable: function (card, player) { + if ( + card.name == "tao" && + _status.currentPhase && + _status.currentPhase.isIn() && + _status.currentPhase.hasSkill("wansha") && + _status.currentPhase != player + ) { + if (!player.isDying()) return false; } }, - cardEnabled:function(card,player){ - if(card.name=='tao'&&_status.currentPhase&&_status.currentPhase.isIn()&&_status.currentPhase.hasSkill('wansha')&&_status.currentPhase!=player){ - if(!player.isDying()) return false; + cardEnabled: function (card, player) { + if ( + card.name == "tao" && + _status.currentPhase && + _status.currentPhase.isIn() && + _status.currentPhase.hasSkill("wansha") && + _status.currentPhase != player + ) { + if (!player.isDying()) return false; } + }, + }, + }, + weimu: { + trigger: { global: "useCard1" }, + audio: 2, + forced: true, + firstDo: true, + filter: function (event, player, card) { + if (get.color(event.card) != "black") return false; + return ( + (event.card.name == "nanman" && player != event.player) || + (event.card.name == "wanjian" && player != event.player) || + (event.card.name == "taoyuan" && player.hp < player.maxHp) || + event.card.name == "wugu" + ); + }, + content: function () {}, + mod: { + targetEnabled: function (card) { + if ( + (get.type(card) == "trick" || get.type(card) == "delay") && + get.color(card) == "black" + ) + return false; + }, + }, + }, + huoji: { + audio: 2, + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "red"; + }, + viewAs: { name: "huogong" }, + viewAsFilter: function (player) { + if (!player.countCards("hs", { color: "red" })) return false; + }, + position: "hs", + prompt: "将一张红色牌当火攻使用", + check: function (card) { + var player = get.player(); + if (player.countCards("h") > player.hp) { + return 6 - get.value(card); } - } - }, - weimu:{ - trigger:{global:'useCard1'}, - audio:2, - forced:true, - firstDo:true, - filter:function(event,player,card){ - if(get.color(event.card)!='black') return false; - return event.card.name=='nanman'&&player!=event.player||event.card.name=='wanjian'&&player!=event.player||event.card.name=='taoyuan'&&player.hpplayer.hp){ - return 6-get.value(card); - } - return 3-get.value(card) - }, - ai:{ - fireAttack:true, + ai: { + fireAttack: true, }, }, - bazhen:{ - audio:2, - audioname:['re_sp_zhugeliang','ol_sp_zhugeliang','ol_pangtong'], - group:'bazhen_bagua', - locked:true, + bazhen: { + audio: 2, + audioname: ["re_sp_zhugeliang", "ol_sp_zhugeliang", "ol_pangtong"], + group: "bazhen_bagua", + locked: true, }, - bazhen_bagua:{ - audio:'bazhen', - audioname:['re_sp_zhugeliang','ol_sp_zhugeliang','ol_pangtong'], - equipSkill:true, - noHidden:true, - inherit:'bagua_skill', - filter:function(event,player){ - if(!lib.skill.bagua_skill.filter(event,player)) return false; - if(!player.hasEmptySlot(2)) return false; + bazhen_bagua: { + audio: "bazhen", + audioname: ["re_sp_zhugeliang", "ol_sp_zhugeliang", "ol_pangtong"], + equipSkill: true, + noHidden: true, + inherit: "bagua_skill", + filter: function (event, player) { + if (!lib.skill.bagua_skill.filter(event, player)) return false; + if (!player.hasEmptySlot(2)) return false; return true; }, - ai:{ - respondShan:true, - freeShan:true, - skillTagFilter(player,tag,arg){ - if(tag!=='respondShan'&&tag!=='freeShan') return; - if(!player.hasEmptySlot(2)||player.hasSkillTag('unequip2')) return false; - if(!arg||!arg.player) return true; - if(arg.player.hasSkillTag('unequip',false,{ - target:player - })) return false; + ai: { + respondShan: true, + freeShan: true, + skillTagFilter(player, tag, arg) { + if (tag !== "respondShan" && tag !== "freeShan") return; + if (!player.hasEmptySlot(2) || player.hasSkillTag("unequip2")) return false; + if (!arg || !arg.player) return true; + if ( + arg.player.hasSkillTag("unequip", false, { + target: player, + }) + ) + return false; return true; }, - effect:{ - target:function(card,player,target){ - if(player==target&&get.subtype(card)=='equip2'){ - if(get.equipValue(card)<=7.5) return 0; + effect: { + target: function (card, player, target) { + if (player == target && get.subtype(card) == "equip2") { + if (get.equipValue(card) <= 7.5) return 0; } - if(!target.hasEmptySlot(2)) return; - return lib.skill.bagua_skill.ai.effect.target.apply(this,arguments); - } - } - } + if (!target.hasEmptySlot(2)) return; + return lib.skill.bagua_skill.ai.effect.target.apply(this, arguments); + }, + }, + }, }, - kanpo:{ - mod:{ - aiValue:function(player,card,num){ - if(get.name(card)!='wuxie'&&get.color(card)!='black') return; - var cards=player.getCards('hs',function(card){ - return get.name(card)=='wuxie'||get.color(card)=='black'; + kanpo: { + mod: { + aiValue: function (player, card, num) { + if (get.name(card) != "wuxie" && get.color(card) != "black") return; + var cards = player.getCards("hs", function (card) { + return get.name(card) == "wuxie" || get.color(card) == "black"; }); - cards.sort(function(a,b){ - return (get.name(b)=='wuxie'?1:2)-(get.name(a)=='wuxie'?1:2); + cards.sort(function (a, b) { + return (get.name(b) == "wuxie" ? 1 : 2) - (get.name(a) == "wuxie" ? 1 : 2); }); - var geti=function(){ - if(cards.includes(card)){ + var geti = function () { + if (cards.includes(card)) { return cards.indexOf(card); } return cards.length; }; - if(get.name(card)=='wuxie') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6; - return Math.max(num,[6,4,3][Math.min(geti(),2)]); + if (get.name(card) == "wuxie") + return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6, 4, 3][Math.min(geti(), 2)]); }, - aiUseful:function(){ - return lib.skill.kanpo.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.kanpo.mod.aiValue.apply(this, arguments); }, }, - locked:false, - audio:2, - enable:'chooseToUse', - filterCard:function(card){ - return get.color(card)=='black'; + locked: false, + audio: 2, + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "black"; }, - viewAsFilter:function(player){ - return player.countCards('hs',{color:'black'})>0; + viewAsFilter: function (player) { + return player.countCards("hs", { color: "black" }) > 0; }, - viewAs:{name:'wuxie'}, - position:'hs', - prompt:'将一张黑色手牌当无懈可击使用', - check:function(card){ - var tri=_status.event.getTrigger(); - if(tri&&tri.card&&tri.card.name=='chiling') return -1; - return 8-get.value(card) + viewAs: { name: "wuxie" }, + position: "hs", + prompt: "将一张黑色手牌当无懈可击使用", + check: function (card) { + var tri = _status.event.getTrigger(); + if (tri && tri.card && tri.card.name == "chiling") return -1; + return 8 - get.value(card); }, - threaten:1.2 + threaten: 1.2, }, - niepan:{ - audio:2, - audioname:['re_pangtong'], - unique:true, - enable:'chooseToUse', - mark:true, - limited:true, - skillAnimation:true, - animationColor:'fire', - init:function(player){ - player.storage.niepan=false; + niepan: { + audio: 2, + audioname: ["re_pangtong"], + unique: true, + enable: "chooseToUse", + mark: true, + limited: true, + skillAnimation: true, + animationColor: "fire", + init: function (player) { + player.storage.niepan = false; }, - filter:function(event,player){ - if(player.storage.niepan) return false; - if(event.type=='dying'){ - if(player!=event.dying) return false; + filter: function (event, player) { + if (player.storage.niepan) return false; + if (event.type == "dying") { + if (player != event.dying) return false; return true; - } - else if(event.parent.name=='phaseUse'){ + } else if (event.parent.name == "phaseUse") { return true; } return false; }, - content:function(){ - 'step 0' - player.awakenSkill('niepan'); - player.storage.niepan=true; - player.discard(player.getCards('hej')); - 'step 1' + content: function () { + "step 0"; + player.awakenSkill("niepan"); + player.storage.niepan = true; + player.discard(player.getCards("hej")); + ("step 1"); player.link(false); - 'step 2' + ("step 2"); player.turnOver(false); - 'step 3' + ("step 3"); player.draw(3); - 'step 4' - if(player.hp<3){ - player.recover(3-player.hp); + ("step 4"); + if (player.hp < 3) { + player.recover(3 - player.hp); } }, - ai:{ - order:0.5, - skillTagFilter:function(player,tag,target){ - if(player!=target||player.storage.niepan) return false; + ai: { + order: 0.5, + skillTagFilter: function (player, tag, target) { + if (player != target || player.storage.niepan) return false; }, - save:true, - result:{ - player:function(player){ - if(player.hp<=0) return 10; - if(player.hp<=1&&player.countCards('he')<=1) return 10; + save: true, + result: { + player: function (player) { + if (player.hp <= 0) return 10; + if (player.hp <= 1 && player.countCards("he") <= 1) return 10; return 0; - } + }, + }, + threaten: function (player, target) { + if (!target.storage.niepan) return 0.6; }, - threaten:function(player,target){ - if(!target.storage.niepan) return 0.6; - } }, - intro:{ - content:'limited' - } + intro: { + content: "limited", + }, }, - oldniepan:{ - audio:'niepan', - unique:true, - enable:'chooseToUse', - mark:true, - skillAnimation:true, - limited:true, - animationColor:'orange', - init:function(player){ - player.storage.oldniepan=false; + oldniepan: { + audio: "niepan", + unique: true, + enable: "chooseToUse", + mark: true, + skillAnimation: true, + limited: true, + animationColor: "orange", + init: function (player) { + player.storage.oldniepan = false; }, - filter:function(event,player){ - if(player.storage.oldniepan) return false; - if(event.type=='dying'){ - if(player!=event.dying) return false; + filter: function (event, player) { + if (player.storage.oldniepan) return false; + if (event.type == "dying") { + if (player != event.dying) return false; return true; } return false; }, - content:function(){ - 'step 0' - player.awakenSkill('oldniepan'); - player.storage.oldniepan=true; - player.discard(player.getCards('hej')); - 'step 1' + content: function () { + "step 0"; + player.awakenSkill("oldniepan"); + player.storage.oldniepan = true; + player.discard(player.getCards("hej")); + ("step 1"); player.link(false); - 'step 2' + ("step 2"); player.turnOver(false); - 'step 3' + ("step 3"); player.draw(3); - 'step 4' - if(player.hp<3){ - player.recover(3-player.hp); + ("step 4"); + if (player.hp < 3) { + player.recover(3 - player.hp); } }, - ai:{ - order:1, - skillTagFilter:function(player,arg,target){ - if(player!=target||player.storage.oldniepan) return false; + ai: { + order: 1, + skillTagFilter: function (player, arg, target) { + if (player != target || player.storage.oldniepan) return false; }, - save:true, - result:{ - player:function(player){ - if(player.hp<=0) return 10; - if(player.hp<=2&&player.countCards('he')<=1) return 10; + save: true, + result: { + player: function (player) { + if (player.hp <= 0) return 10; + if (player.hp <= 2 && player.countCards("he") <= 1) return 10; return 0; - } + }, + }, + threaten: function (player, target) { + if (!target.storage.oldniepan) return 0.6; }, - threaten:function(player,target){ - if(!target.storage.oldniepan) return 0.6; - } }, - intro:{ - content:'limited' - } + intro: { + content: "limited", + }, }, - quhu:{ - audio:2, - audioname:['re_xunyu','ol_xunyu'], - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(player.countCards('h')==0) return false; - return game.hasPlayer(function(current){ - return current.hp>player.hp&&player.canCompare(current); + quhu: { + audio: 2, + audioname: ["re_xunyu", "ol_xunyu"], + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.countCards("h") == 0) return false; + return game.hasPlayer(function (current) { + return current.hp > player.hp && player.canCompare(current); }); }, - filterTarget:function(card,player,target){ - return target.hp>player.hp&&player.canCompare(target); + filterTarget: function (card, player, target) { + return target.hp > player.hp && player.canCompare(target); }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseToCompare(target); - "step 1" - if(result.bool){ - if(game.hasPlayer(function(player){ - return player!=target&&target.inRange(player); - })){ - player.chooseTarget(function(card,player,target){ - var source=_status.event.source; - return target!=source&&source.inRange(target); - },true).set('ai',function(target){ - return get.damageEffect(target,_status.event.source,player); - }).set('source',target); - } - else{ + ("step 1"); + if (result.bool) { + if ( + game.hasPlayer(function (player) { + return player != target && target.inRange(player); + }) + ) { + player + .chooseTarget(function (card, player, target) { + var source = _status.event.source; + return target != source && source.inRange(target); + }, true) + .set("ai", function (target) { + return get.damageEffect(target, _status.event.source, player); + }) + .set("source", target); + } else { event.finish(); } - } - else{ + } else { player.damage(target); event.finish(); } - "step 2" - if(result.bool&&result.targets&&result.targets.length){ - target.line(result.targets[0],'green'); + ("step 2"); + if (result.bool && result.targets && result.targets.length) { + target.line(result.targets[0], "green"); result.targets[0].damage(target); } }, - ai:{ - order:0.5, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - var oc=(target.countCards('h')==1); - if(att>0&&oc) return 0; - var players=game.filterPlayer(); - for(var i=0;i0){ - return att>0?att/2:att-(oc?5:0); + ai: { + order: 0.5, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var oc = target.countCards("h") == 1; + if (att > 0 && oc) return 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != target && + players[i] != player && + target.inRange(players[i]) + ) { + if (get.damageEffect(players[i], target, player) > 0) { + return att > 0 ? att / 2 : att - (oc ? 5 : 0); } } } return 0; }, - player:function(player,target){ - if(target.hasSkillTag('jueqing',false,target)) return -10; - var mn=1; - var hs=player.getCards('h'); - for(var i=0;i2){ - max=Math.max(Math.min(5,players[i].hp)-players[i].countCards('h'),max); + if (mn <= 11 && player.hp < 2) return -20; + var max = player.maxHp - hs.length; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 2) { + max = Math.max( + Math.min(5, players[i].hp) - players[i].countCards("h"), + max + ); } } - switch(max){ - case 0:return mn==13?0:-20; - case 1:return mn>=12?0:-15; - case 2:return 0; - case 3:return 1; - default:return max; + switch (max) { + case 0: + return mn == 13 ? 0 : -20; + case 1: + return mn >= 12 ? 0 : -15; + case 2: + return 0; + case 3: + return 1; + default: + return max; } - } + }, }, - expose:0.2 - } + expose: 0.2, + }, }, - jieming:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - content:function(){ - "step 0" - event.count=trigger.num; - "step 1" + jieming: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - player.chooseTarget(get.prompt2('jieming'),function(card,player,target){ - return true;//target.countCards('h')2){ - return Math.max(0,Math.min(5,target.maxHp)-target.countCards('h')); + player + .chooseTarget(get.prompt2("jieming"), function (card, player, target) { + return true; //target.countCards('h') 2) { + return Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")); + } + return att / 3; + }); + ("step 2"); + if (result.bool) { + player.logSkill("jieming", result.targets); + for (var i = 0; i < result.targets.length; i++) { + result.targets[i].drawTo(Math.min(5, result.targets[i].maxHp)); } - return att/3; - }); - "step 2" - if(result.bool){ - player.logSkill('jieming',result.targets); - for(var i=0;i1){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - var max=0; - var players=game.filterPlayer(); - for(var i=0;i0){ - max=Math.max(Math.min(5,players[i].hp)-players[i].countCards('h'),max); + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max( + Math.min(5, players[i].hp) - players[i].countCards("h"), + max + ); } } - switch(max){ - case 0:return 2; - case 1:return 1.5; - case 2:return [1,2]; - default:return [0,max]; + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; } } - if((card.name=='tao'||card.name=='caoyao')&& - target.hp>1&&target.countCards('h')<=target.hp) return [0,0]; - } + if ( + (card.name == "tao" || card.name == "caoyao") && + target.hp > 1 && + target.countCards("h") <= target.hp + ) + return [0, 0]; + }, }, - } + }, }, - qiangxix:{ - inherit:'reqiangxi', - audioname:['boss_lvbu3'], - audio:'qiangxi', - usable:2, - filterTarget:function(card,player,target){ - if(player==target) return false; - if(target.hasSkill('reqiangxi_off')) return false; + qiangxix: { + inherit: "reqiangxi", + audioname: ["boss_lvbu3"], + audio: "qiangxi", + usable: 2, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (target.hasSkill("reqiangxi_off")) return false; return true; }, }, - qiangxi:{ - audio:2, - enable:'phaseUse', - usable:1, - audioname:['boss_lvbu3'], - filterCard:function(card){ - return get.subtype(card)=='equip1'; + qiangxi: { + audio: 2, + enable: "phaseUse", + usable: 1, + audioname: ["boss_lvbu3"], + filterCard: function (card) { + return get.subtype(card) == "equip1"; }, - selectCard:[0,1], - filterTarget:function(card,player,target){ - if(player==target) return false; + selectCard: [0, 1], + filterTarget: function (card, player, target) { + if (player == target) return false; return player.inRange(target); }, - content:function(){ - "step 0" - if(cards.length==0){ + content: function () { + "step 0"; + if (cards.length == 0) { player.loseHp(); } - "step 1" - target.damage('nocard'); + ("step 1"); + target.damage("nocard"); }, - check:function(card){ - return 10-get.value(card); + check: function (card) { + return 10 - get.value(card); }, - position:'he', - ai:{ - damage:true, - order:8, - result:{ - player:function(player,target){ - if(ui.selected.cards.length) return 0; - if(player.hp>=target.hp) return -0.9; - if(player.hp<=2) return -10; + position: "he", + ai: { + damage: true, + order: 8, + result: { + player: function (player, target) { + if (ui.selected.cards.length) return 0; + if (player.hp >= target.hp) return -0.9; + if (player.hp <= 2) return -10; return -2; }, - target:function(player,target){ - if(!ui.selected.cards.length){ - if(player.hp<2) return 0; - if(player.hp==2&&target.hp>=2) return 0; - if(target.hp>player.hp) return 0; + target: function (player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (player.hp == 2 && target.hp >= 2) return 0; + if (target.hp > player.hp) return 0; } - return get.damageEffect(target,player); - } + return get.damageEffect(target, player); + }, }, - threaten:1.3, + threaten: 1.3, }, }, - xinqiangxi:{ - audio:'qiangxi', - enable:'phaseUse', - filter:function(event,player){ - if(player.hasSkill('xinqiangxi2')){ - return !player.hasSkill('xinqiangxi3'); - } - else if(player.hasSkill('xinqiangxi3')){ - return !player.hasSkill('xinqiangxi2')&&player.countCards('he',{type:'equip'})>0; - } - else{ + xinqiangxi: { + audio: "qiangxi", + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("xinqiangxi2")) { + return !player.hasSkill("xinqiangxi3"); + } else if (player.hasSkill("xinqiangxi3")) { + return ( + !player.hasSkill("xinqiangxi2") && player.countCards("he", { type: "equip" }) > 0 + ); + } else { return true; } }, - filterCard:function(card){ - var player=_status.event.player; - if(player.hasSkill('xinqiangxi2')) return false; - return get.type(card)=='equip'; + filterCard: function (card) { + var player = _status.event.player; + if (player.hasSkill("xinqiangxi2")) return false; + return get.type(card) == "equip"; }, - selectCard:function(){ - var player=_status.event.player; - if(player.hasSkill('xinqiangxi2')) return -1; - if(player.hasSkill('xinqiangxi3')) return [1,1]; - return [0,1]; + selectCard: function () { + var player = _status.event.player; + if (player.hasSkill("xinqiangxi2")) return -1; + if (player.hasSkill("xinqiangxi3")) return [1, 1]; + return [0, 1]; }, - filterTarget:function(card,player,target){ - if(player==target) return false; + filterTarget: function (card, player, target) { + if (player == target) return false; return player.inRange(target); }, - content:function(){ - "step 0" - if(cards.length==0){ + content: function () { + "step 0"; + if (cards.length == 0) { player.loseHp(); - player.addTempSkill('xinqiangxi3'); + player.addTempSkill("xinqiangxi3"); + } else { + player.addTempSkill("xinqiangxi2"); } - else{ - player.addTempSkill('xinqiangxi2'); - } - "step 1" - target.damage('nocard'); + ("step 1"); + target.damage("nocard"); }, - check:function(card){ - return 10-get.value(card); + check: function (card) { + return 10 - get.value(card); }, - position:'he', - ai:{ - order:8.5, - result:{ - target:function(player,target){ - if(!ui.selected.cards.length){ - if(player.hp<2) return 0; - if(target.hp>=player.hp) return 0; + position: "he", + ai: { + order: 8.5, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) { + if (player.hp < 2) return 0; + if (target.hp >= player.hp) return 0; } - return get.damageEffect(target,player); - } - } + return get.damageEffect(target, player); + }, + }, }, - threaten:1.5 + threaten: 1.5, }, - xinqiangxi2:{}, - xinqiangxi3:{}, - tianyi:{ - audio:2, - audioname:['re_taishici'], - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + xinqiangxi2: {}, + xinqiangxi3: {}, + tianyi: { + audio: 2, + audioname: ["re_taishici"], + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseToCompare(target); - "step 1" - if(result.bool){ - player.addTempSkill('tianyi2'); - } - else{ - player.addTempSkill('tianyi3'); + ("step 1"); + if (result.bool) { + player.addTempSkill("tianyi2"); + } else { + player.addTempSkill("tianyi3"); } }, - ai:{ - order:function(name,player){ - var cards=player.getCards('h'); - if(player.countCards('h','sha')==0){ + ai: { + order: function (name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { return 1; } - for(var i=0;i11&&get.value(cards[i])<7){ + for (var i = 0; i < cards.length; i++) { + if ( + cards[i].name != "sha" && + get.number(cards[i]) > 11 && + get.value(cards[i]) < 7 + ) { return 9; } } - return get.order({name:'sha'})-1; + return get.order({ name: "sha" }) - 1; }, - result:{ - player:function(player){ - if(player.countCards('h','sha')>0) return 0.6; - var num=player.countCards('h'); - if(num>player.hp) return 0; - if(num==1) return -2; - if(num==2) return -1; + result: { + player: function (player) { + if (player.countCards("h", "sha") > 0) return 0.6; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; return -0.7; }, - target:function(player,target){ - var num=target.countCards('h'); - if(num==1) return -1; - if(num==2) return -0.7; - return -0.5 + target: function (player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; }, }, - threaten:1.3 - } + threaten: 1.3, + }, }, - tianyi2:{ - mod:{ - targetInRange:function(card,player,target,now){ - if(card.name=='sha') return true; + tianyi2: { + 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]++; + selectTarget: function (card, player, range) { + if (card.name == "sha" && range[1] != -1) range[1]++; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; - } }, - charlotte:true, + charlotte: true, }, - tianyi3:{ - mod:{ - cardEnabled:function(card){if(card.name=='sha') return false} + tianyi3: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, }, - charlotte:true, + charlotte: true, }, - shuangxiong:{ - audio:2, - audioname:['re_yanwen'], - group:'shuangxiong1', - subSkill:{ - re_yanwen1:{audio:true}, - re_yanwen2:{audio:true}, + shuangxiong: { + audio: 2, + audioname: ["re_yanwen"], + group: "shuangxiong1", + subSkill: { + re_yanwen1: { audio: true }, + re_yanwen2: { audio: true }, }, }, - shuangxiong1:{ - audio:true, - trigger:{player:'phaseDrawBegin1'}, - check:function(event,player){ - if(player.countCards('h')>player.hp) return true; - if(player.countCards('h')>3) return true; + shuangxiong1: { + audio: true, + trigger: { player: "phaseDrawBegin1" }, + check: function (event, player) { + if (player.countCards("h") > player.hp) return true; + if (player.countCards("h") > 3) return true; return false; }, - filter:function(event,player){ + filter: function (event, player) { return !event.numFixed; }, - preHidden:true, - prompt2:()=>'进行一次判定,本回合可以将一张与此牌颜色不同的手牌当作【决斗】使用', - content:function(){ - player.judge().set('callback',lib.skill.shuangxiong1.callback); + preHidden: true, + prompt2: () => "进行一次判定,本回合可以将一张与此牌颜色不同的手牌当作【决斗】使用", + content: function () { + player.judge().set("callback", lib.skill.shuangxiong1.callback); trigger.changeToZero(); }, - callback:function(){ - player.gain(card,'gain2'); - player.addTempSkill('shuangxiong2'); - player.markAuto('shuangxiong2',[event.judgeResult.color]); + callback: function () { + player.gain(card, "gain2"); + player.addTempSkill("shuangxiong2"); + player.markAuto("shuangxiong2", [event.judgeResult.color]); }, }, - shuangxiong2:{ - charlotte:true, - onremove:true, - audio:true, - audioname2:{ - re_yanwen:'shuangxiong_re_yanwen2', + shuangxiong2: { + charlotte: true, + onremove: true, + audio: true, + audioname2: { + re_yanwen: "shuangxiong_re_yanwen2", }, - enable:'chooseToUse', - viewAs:{name:'juedou'}, - position:'hs', - viewAsFilter:function(player){ - return player.hasCard(card=>lib.skill.shuangxiong2.filterCard(card,player),'hs'); + enable: "chooseToUse", + viewAs: { name: "juedou" }, + position: "hs", + viewAsFilter: function (player) { + return player.hasCard((card) => lib.skill.shuangxiong2.filterCard(card, player), "hs"); }, - filterCard:function(card,player){ - var color=get.color(card),colors=player.getStorage('shuangxiong2'); - for(var i of colors){ - if(color!=i) return true; + filterCard: function (card, player) { + var color = get.color(card), + colors = player.getStorage("shuangxiong2"); + for (var i of colors) { + if (color != i) return true; } return false; }, - prompt:function(){ - var colors=_status.event.player.getStorage('shuangxiong2'); - var str='将一张颜色'; - for(var i=0;i0) str+='或'; - str+='不为'; - str+=get.translation(colors[i]); + prompt: function () { + var colors = _status.event.player.getStorage("shuangxiong2"); + var str = "将一张颜色"; + for (var i = 0; i < colors.length; i++) { + if (i > 0) str += "或"; + str += "不为"; + str += get.translation(colors[i]); } - str+='的牌当做【决斗】使用'; + str += "的牌当做【决斗】使用"; return str; }, - check:function(card){ - var player=_status.event.player; - var raw=player.getUseValue(card,null,true); - var eff=player.getUseValue(get.autoViewAs({name:'juedou'},[card])); - return eff-raw; + check: function (card) { + var player = _status.event.player; + var raw = player.getUseValue(card, null, true); + var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card])); + return eff - raw; }, - ai:{order:7}, + ai: { order: 7 }, }, - luanji:{ - audio:2, - enable:'phaseUse', - position:'hs', - viewAs:{name:'wanjian'}, - filterCard:function(card,player){ - if(ui.selected.cards.length){ - return get.suit(card)==get.suit(ui.selected.cards[0]); + luanji: { + audio: 2, + enable: "phaseUse", + position: "hs", + viewAs: { name: "wanjian" }, + filterCard: function (card, player) { + if (ui.selected.cards.length) { + return get.suit(card) == get.suit(ui.selected.cards[0]); } - var cards=player.getCards('hs'); - for(var i=0;i=7){ - if(num<2) return 0; - } - else if(targets.length>=5){ - if(num<1.5) return 0; + if (!player.needsToDiscard(-1)) { + if (targets.length >= 7) { + if (num < 2) return 0; + } else if (targets.length >= 5) { + if (num < 1.5) return 0; } } - return 6-get.value(card); + return 6 - get.value(card); + }, + ai: { + basic: { + order: 8.5, + }, }, - ai:{ - basic:{ - order:8.5 - } - } }, - xueyi:{ - trigger:{player:'phaseDiscardBefore'}, - audio:2, - audioname:['re_yuanshao'], - forced:true, - firstDo:true, - filter:function(event,player){ - return player.hasZhuSkill('xueyi')&&game.hasPlayer(function(current){ - return current!=player&¤t.group=='qun'; - })&&player.countCards('h')>player.hp; + xueyi: { + trigger: { player: "phaseDiscardBefore" }, + audio: 2, + audioname: ["re_yuanshao"], + forced: true, + firstDo: true, + filter: function (event, player) { + return ( + player.hasZhuSkill("xueyi") && + game.hasPlayer(function (current) { + return current != player && current.group == "qun"; + }) && + player.countCards("h") > player.hp + ); }, - content:function(){}, - mod:{ - maxHandcard:function(player,num){ - if(player.hasZhuSkill('xueyi')){ - return num+game.countPlayer(function(current){ - if(player!=current&¤t.group=='qun') return 2; - }); + content: function () {}, + mod: { + maxHandcard: function (player, num) { + if (player.hasZhuSkill("xueyi")) { + return ( + num + + game.countPlayer(function (current) { + if (player != current && current.group == "qun") return 2; + }) + ); } return num; - } + }, }, - zhuSkill:true, + zhuSkill: true, }, - mengjin:{ - shaRelated:true, - audio:2, - trigger:{player:'shaMiss'}, + mengjin: { + shaRelated: true, + audio: 2, + trigger: { player: "shaMiss" }, //priority:-1, - filter:function(event){ - return event.target.countCards('he')>0; + filter: function (event) { + return event.target.countCards("he") > 0; }, - check:function(event,player){ - return get.attitude(player,event.target)<0; + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + logTarget: "target", + content: function () { + player.discardPlayerCard("he", trigger.target, true); }, - logTarget:'target', - content:function(){ - player.discardPlayerCard('he',trigger.target,true); - } }, - jiewei:{ - trigger:{player:'turnOverEnd'}, + jiewei: { + trigger: { player: "turnOverEnd" }, //direct:true, - frequent:true, - audio:'xinjiewei', - content:function(){ - 'step 0' + frequent: true, + audio: "xinjiewei", + content: function () { + "step 0"; player.draw(); - player.chooseToUse(function(card){ - if(!lib.filter.cardEnabled(card,_status.event.player,_status.event)){ + player.chooseToUse(function (card) { + if (!lib.filter.cardEnabled(card, _status.event.player, _status.event)) { return false; } - var type=get.type(card,'trick'); - return type=='trick'||type=='equip'; - },'是否使用一张锦囊牌或装备牌?'); - 'step 1' - if(result.bool){ - var type=get.type(result.card||result.cards[0]); - if(game.hasPlayer(function(current){ - if(type=='equip'){ - return current.countCards('e'); - } - else{ - return current.countCards('j'); - } - })){ - var next=player.chooseTarget('是否弃置场上的一张'+get.translation(type)+'牌?',function(card,player,target){ - if(_status.event.type=='equip'){ - return target.countCards('e')>0; + var type = get.type(card, "trick"); + return type == "trick" || type == "equip"; + }, "是否使用一张锦囊牌或装备牌?"); + ("step 1"); + if (result.bool) { + var type = get.type(result.card || result.cards[0]); + if ( + game.hasPlayer(function (current) { + if (type == "equip") { + return current.countCards("e"); + } else { + return current.countCards("j"); } - else{ - return target.countCards('j')>0; + }) + ) { + var next = player.chooseTarget( + "是否弃置场上的一张" + get.translation(type) + "牌?", + function (card, player, target) { + if (_status.event.type == "equip") { + return target.countCards("e") > 0; + } else { + return target.countCards("j") > 0; + } + } + ); + next.set("ai", function (target) { + if (type == "equip") { + return -get.attitude(player, target); + } else { + return get.attitude(player, target); } }); - next.set('ai',function(target){ - if(type=='equip'){ - return -get.attitude(player,target); - } - else{ - return get.attitude(player,target); - } - }); - next.set('type',type); - event.type=type; - } - else{ + next.set("type", type); + event.type = type; + } else { event.finish(); } - } - else{ + } else { event.finish(); } - 'step 2' - if(event.type&&result.bool&&result.targets&&result.targets.length){ - player.line(result.targets,'green'); - if(event.type=='equip'){ - player.discardPlayerCard(result.targets[0],'e',true); - } - else{ - player.discardPlayerCard(result.targets[0],'j',true); + ("step 2"); + if (event.type && result.bool && result.targets && result.targets.length) { + player.line(result.targets, "green"); + if (event.type == "equip") { + player.discardPlayerCard(result.targets[0], "e", true); + } else { + player.discardPlayerCard(result.targets[0], "j", true); } } - } + }, }, - releiji:{ - audio:2, - audioname:['boss_qinglong'], - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - return event.card.name=='shan'; + releiji: { + audio: 2, + audioname: ["boss_qinglong"], + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + return event.card.name == "shan"; }, - direct:true, - content:function(){ + direct: true, + content: function () { "step 0"; - player.chooseTarget(get.prompt2('releiji'),function(card,player,target){ - return target!=player; - }).ai=function(target){ - if(target.hasSkill('hongyan')) return 0; - return get.damageEffect(target,_status.event.player,_status.event.player,'thunder'); + player.chooseTarget(get.prompt2("releiji"), function (card, player, target) { + return target != player; + }).ai = function (target) { + if (target.hasSkill("hongyan")) return 0; + return get.damageEffect( + target, + _status.event.player, + _status.event.player, + "thunder" + ); }; - "step 1" - if(result.bool){ - player.logSkill('releiji',result.targets,'thunder'); - event.target=result.targets[0]; - event.target.judge(function(card){ - var suit=get.suit(card); - if(suit=='spade') return -4; - if(suit=='club') return -2; + ("step 1"); + if (result.bool) { + player.logSkill("releiji", result.targets, "thunder"); + event.target = result.targets[0]; + event.target.judge(function (card) { + var suit = get.suit(card); + if (suit == "spade") return -4; + if (suit == "club") return -2; return 0; - }).judge2=function(result){ - return result.bool==false?true:false; + }).judge2 = function (result) { + return result.bool == false ? true : false; }; - } - else{ + } else { event.finish(); } - "step 2" - if(result.suit=='club'){ + ("step 2"); + if (result.suit == "club") { player.recover(); - event.target.damage('thunder'); - } - else if(result.suit=='spade'){ - event.target.damage(2,'thunder'); + event.target.damage("thunder"); + } else if (result.suit == "spade") { + event.target.damage(2, "thunder"); } }, - ai:{ - useShan:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ - target: target, - card: card - },true)){ - let club=0,spade=0; - if(game.hasPlayer(function(current){ - return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; - })){ - club=2; - spade=4; + ai: { + useShan: true, + effect: { + target: function (card, player, target, current) { + if ( + get.tag(card, "respondShan") && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) { + let club = 0, + spade = 0; + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(target, current) < 0 && + get.damageEffect(current, target, target, "thunder") > 0 + ); + }) + ) { + club = 2; + spade = 4; } - if(!target.isHealthy()) club+=2; - if(!club&&!spade) return 1; - if(card.name==='sha'){ - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) return; - } - else if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); - if(!target.hasSkillTag('rejudge')) return [1,(club+spade)/4]; - let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e',better=club>spade?'club':'spade',max=0; - target.hasCard(function(cardx){ - if(get.suit(cardx)===better){ - max=2; + if (!target.isHealthy()) club += 2; + if (!club && !spade) return 1; + if (card.name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) + return 1 - 0.1 * Math.min(5, target.countCards("hs")); + if (!target.hasSkillTag("rejudge")) return [1, (club + spade) / 4]; + let pos = player.hasSkillTag("viewHandcard", null, target, true) + ? "hes" + : "e", + better = club > spade ? "club" : "spade", + max = 0; + target.hasCard(function (cardx) { + if (get.suit(cardx) === better) { + max = 2; return true; } - if(spade&&get.color(cardx)==='black') max=1; - },pos); - if(max===2) return [1,Math.max(club,spade)]; - if(max===1) return [1,Math.min(club,spade)]; - if(pos==='e') return [1,Math.min(Math.max(1,target.countCards('hs'))*(club+spade)/4,Math.max(club,spade))]; - return [1,(club+spade)/4]; + if (spade && get.color(cardx) === "black") max = 1; + }, pos); + if (max === 2) return [1, Math.max(club, spade)]; + if (max === 1) return [1, Math.min(club, spade)]; + if (pos === "e") + return [ + 1, + Math.min( + (Math.max(1, target.countCards("hs")) * (club + spade)) / 4, + Math.max(club, spade) + ), + ]; + return [1, (club + spade) / 4]; } - } - } - } - }, - shensu:{ - audio:'shensu1', - audioname:['xiahouba','re_xiahouyuan','ol_xiahouyuan'], - group:['shensu1','shensu2'], - preHidden:['shensu1','shensu2'], - }, - xinshensu:{ - audio:'shensu1', - audioname:['xiahouba','re_xiahouyuan','ol_xiahouyuan'], - audioname2:{ - dc_xiahouba:'shensu1_xiahouba', + }, + }, }, - group:['shensu1','shensu2','shensu4'] }, - shensu1_xiahouba:{audio:2}, - shensu1:{ - audio:2, - audioname:['xiahouba','re_xiahouyuan','ol_xiahouyuan'], - audioname2:{ - dc_xiahouba:'shensu1_xiahouba', + shensu: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + group: ["shensu1", "shensu2"], + preHidden: ["shensu1", "shensu2"], + }, + xinshensu: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", }, - trigger:{player:'phaseJudgeBefore'}, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt("shensu"),"跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】",function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }).set('check',player.countCards('h')>2).set('ai',function(target){ - if(!_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); - }).setHiddenSkill('shensu1'); - "step 1" - if(result.bool){ - player.logSkill('shensu1',result.targets); - player.useCard({name:'sha',isCard:true},result.targets[0],false); + group: ["shensu1", "shensu2", "shensu4"], + }, + shensu1_xiahouba: { audio: 2 }, + shensu1: { + audio: 2, + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", + }, + trigger: { player: "phaseJudgeBefore" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("shensu"), + "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + } + ) + .set("check", player.countCards("h") > 2) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }) + .setHiddenSkill("shensu1"); + ("step 1"); + if (result.bool) { + player.logSkill("shensu1", result.targets); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); trigger.cancel(); - player.skip('phaseDraw'); + player.skip("phaseDraw"); } - } + }, }, - shensu2:{ - audio:'shensu1', - audioname:['xiahouba','re_xiahouyuan','ol_xiahouyuan'], - audioname2:{ - dc_xiahouba:'shensu1_xiahouba', + shensu2: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", }, - trigger:{player:'phaseUseBefore'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',function(card){ - if(_status.connectMode) return true; - return get.type(card)=='equip'; - })>0; + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + if (_status.connectMode) return true; + return get.type(card) == "equip"; + }) > 0 + ); }, - content:function(){ - "step 0" - player.chooseCardTarget({ - prompt:get.prompt('shensu'), - prompt2:"弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", - filterCard:function(card,player){ - return get.type(card)=='equip'&&lib.filter.cardDiscardable(card,player) - }, - position:'he', - filterTarget:function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }, - ai1:function(card){ - if(_status.event.check) return 0; - return 6-get.value(card); - }, - ai2:function(target){ - if(_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); - }, - check:player.countCards('hs',i=>{ - return player.hasValueTarget(i,null,true); - })>player.hp-1 - }).setHiddenSkill('shensu2'); - "step 1" - if(result.bool){ - player.logSkill('shensu2',result.targets); + content: function () { + "step 0"; + player + .chooseCardTarget({ + prompt: get.prompt("shensu"), + prompt2: "弃置一张装备牌并跳过出牌阶段,视为对一名其他角色使用一张【杀】", + filterCard: function (card, player) { + return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); + }, + position: "he", + filterTarget: function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + }, + ai1: function (card) { + if (_status.event.check) return 0; + return 6 - get.value(card); + }, + ai2: function (target) { + if (_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }, + check: + player.countCards("hs", (i) => { + return player.hasValueTarget(i, null, true); + }) > + player.hp - 1, + }) + .setHiddenSkill("shensu2"); + ("step 1"); + if (result.bool) { + player.logSkill("shensu2", result.targets); player.discard(result.cards[0]); - player.useCard({name:'sha',isCard:true},result.targets[0],false); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); trigger.cancel(); } - } - }, - shensu4:{ - audio:'shensu1', - audioname:['xiahouba','re_xiahouyuan','ol_xiahouyuan'], - audioname2:{ - dc_xiahouba:'shensu1_xiahouba', }, - trigger:{player:'phaseDiscardBefore'}, - direct:true, - content:function(){ - "step 0" - var check=player.needsToDiscard()||player.isTurnedOver()||(player.hasSkill('shebian')&&player.canMoveCard(true,true)); - player.chooseTarget(get.prompt('shensu'),"跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】",function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }).set('check',check).set('ai',function(target){ - if(!_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player,_status.event.player); - }); - "step 1" - if(result.bool){ - player.logSkill('shensu4',result.targets); + }, + shensu4: { + audio: "shensu1", + audioname: ["xiahouba", "re_xiahouyuan", "ol_xiahouyuan"], + audioname2: { + dc_xiahouba: "shensu1_xiahouba", + }, + trigger: { player: "phaseDiscardBefore" }, + direct: true, + content: function () { + "step 0"; + var check = + player.needsToDiscard() || + player.isTurnedOver() || + (player.hasSkill("shebian") && player.canMoveCard(true, true)); + player + .chooseTarget( + get.prompt("shensu"), + "跳过弃牌阶段并将武将牌翻面,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + } + ) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect( + target, + { name: "sha" }, + _status.event.player, + _status.event.player + ); + }); + ("step 1"); + if (result.bool) { + player.logSkill("shensu4", result.targets); player.turnOver(); - player.useCard({name:'sha',isCard:true},result.targets[0],false); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); trigger.cancel(); } - } - }, - jushou:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - check:function(event,player){ - return event.player.hp+player.countCards('h')<4; }, - content:function(){ + }, + jushou: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + return event.player.hp + player.countCards("h") < 4; + }, + content: function () { player.draw(3); player.turnOver(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name=='guiyoujie') return [0,1]; - } - } + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 1]; + }, + }, }, }, - moon_jushou:{ - audio:'xinjushou', - trigger:{player:'phaseJieshuBegin'}, - check:function(event,player){ - return event.player.hp+player.countCards('h')<4; + moon_jushou: { + audio: "xinjushou", + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + return event.player.hp + player.countCards("h") < 4; }, - content:function(){ + content: function () { player.draw(); player.turnOver(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name=='guiyoujie') return [0,1]; - } - } + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 1]; + }, + }, }, }, - liegong:{ - shaRelated:true, - audio:2, - audioname:['re_huangzhong'], - trigger:{player:'useCardToPlayered'}, - check:function(event,player){ - return get.attitude(player,event.target)<=0; + liegong: { + shaRelated: true, + audio: 2, + audioname: ["re_huangzhong"], + trigger: { player: "useCardToPlayered" }, + check: function (event, player) { + return get.attitude(player, event.target) <= 0; }, - logTarget:'target', - filter:function(event,player){ - if(event.card.name!='sha') return false; - var length=event.target.countCards('h'); - return (length>=player.hp||length<=player.getAttackRange()); + logTarget: "target", + filter: function (event, player) { + if (event.card.name != "sha") return false; + var length = event.target.countCards("h"); + return length >= player.hp || length <= player.getAttackRange(); }, - preHidden:true, - content:function(){ + preHidden: true, + content: function () { trigger.getParent().directHit.push(trigger.target); }, - locked:false, - mod:{ - attackRange:function(player,distance){ - if(get.zhu(player,'shouyue')) return distance+1; - } + locked: false, + mod: { + attackRange: function (player, distance) { + if (get.zhu(player, "shouyue")) return distance + 1; + }, }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(get.attitude(player,arg.target)>0||arg.card.name!='sha') return false; - var length=arg.target.countCards('h'); - return (length>=player.hp||length<=player.getAttackRange()); + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0 || arg.card.name != "sha") return false; + var length = arg.target.countCards("h"); + return length >= player.hp || length <= player.getAttackRange(); }, }, }, - kuanggu:{ - audio:2, - audioname:['re_weiyan','ol_weiyan'], - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - return event.kuangguCheck&&player.isDamaged(); + kuanggu: { + audio: 2, + audioname: ["re_weiyan", "ol_weiyan"], + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.kuangguCheck && player.isDamaged(); }, - content:function(){ + content: function () { player.recover(trigger.num); }, - group:'kuanggu_check', - subSkill:{ - check:{ - charlotte:true, - trigger:{source:'damage'}, - filter:function(event,player){ - return get.distance(player,event.player)<=1; + group: "kuanggu_check", + subSkill: { + check: { + charlotte: true, + trigger: { source: "damage" }, + filter: function (event, player) { + return get.distance(player, event.player) <= 1; }, - firstDo:true, - silent:true, - content:function(){ - trigger.kuangguCheck=true; + firstDo: true, + silent: true, + content: function () { + trigger.kuangguCheck = true; }, }, }, }, - tianxiang:{ - audio:2, - audioname:['daxiaoqiao','re_xiaoqiao','ol_xiaoqiao'], - trigger:{player:'damageBegin3'}, - direct:true, - filter:function(event,player){ - return player.countCards('h',{suit:'heart'})>0&&event.num>0; + tianxiang: { + audio: 2, + audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], + trigger: { player: "damageBegin3" }, + direct: true, + filter: function (event, player) { + return player.countCards("h", { suit: "heart" }) > 0 && event.num > 0; }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:function(card,player){ - return get.suit(card)=='heart'&&lib.filter.cardDiscardable(card,player); + filterCard: function (card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ - return 10-get.value(card); + ai1: function (card) { + return 10 - get.value(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - var trigger=_status.event.getTrigger(); - var da=0; - if(_status.event.player.hp==1){ - da=10; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; } - if(trigger.num>1){ - if(target.maxHp>5&&target.hp>1) return -att/10+da; - return -att+da; + if (trigger.num > 1) { + if (target.maxHp > 5 && target.hp > 1) return -att / 10 + da; + return -att + da; } - var eff=get.damageEffect(target,trigger.source,target,trigger.nature); - if(att==0) return 0.1+da; - if(eff>=0&&trigger.num==1){ - return att+da; + var eff = get.damageEffect(target, trigger.source, target, trigger.nature); + if (att == 0) return 0.1 + da; + if (eff >= 0 && trigger.num == 1) { + return att + da; } - if(target.hp==target.maxHp) return -att+da; - if(target.hp==1){ - if(target.maxHp<=4&&!target.hasSkillTag('maixie')){ - if(target.maxHp<=3){ - return -att+da; + if (target.hp == target.maxHp) return -att + da; + if (target.hp == 1) { + if (target.maxHp <= 4 && !target.hasSkillTag("maixie")) { + if (target.maxHp <= 3) { + return -att + da; } - return -att/2+da; + return -att / 2 + da; } return da; } - if(target.hp==target.maxHp-1){ - if(target.hp>2||target.hasSkillTag('maixie')) return att/5+da; - if(att>0) return 0.02+da; - return 0.05+da; + if (target.hp == target.maxHp - 1) { + if (target.hp > 2 || target.hasSkillTag("maixie")) return att / 5 + da; + if (att > 0) return 0.02 + da; + return 0.05 + da; } - return att/2+da; + return att / 2 + da; }, - prompt:get.prompt2('tianxiang') + prompt: get.prompt2("tianxiang"), }); - "step 1" - if(result.bool){ - player.logSkill(event.name,result.targets); - trigger.player=result.targets[0]; - trigger.player.addSkill('tianxiang2'); + ("step 1"); + if (result.bool) { + player.logSkill(event.name, result.targets); + trigger.player = result.targets[0]; + trigger.player.addSkill("tianxiang2"); player.discard(result.cards[0]); } }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(get.tag(card,'damage')&&target.countCards('h')>1) return 0.7; - } + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("h") > 1) return 0.7; + }, + }, + threaten: function (player, target) { + if (target.countCards("h") == 0) return 2; }, - threaten:function(player,target){ - if(target.countCards('h')==0) return 2; - } - } - }, - tianxiang2:{ - trigger:{player:['damageAfter','damageCancelled','damageZero']}, - forced:true, - popup:false, - audio:false, - vanish:true, - charlotte:true, - content:function(){ - if(player.getDamagedHp()) player.draw(player.getDamagedHp()); - player.removeSkill('tianxiang2'); - player.popup('tianxiang'); - } - }, - retianxiang:{ - audio:'tianxiang', - audioname:['daxiaoqiao','re_xiaoqiao','ol_xiaoqiao'], - trigger:{player:'damageBegin4'}, - direct:true, - preHidden:true, - filter:function(event,player){ - return player.countCards('h',function(card){ - return _status.connectMode||get.suit(card,player)=='heart'; - })>0&&event.num>0; }, - content:function(){ - "step 0" - player.chooseCardTarget({ - filterCard:function(card,player){ - return get.suit(card)=='heart'&&lib.filter.cardDiscardable(card,player); - }, - filterTarget:function(card,player,target){ - return player!=target; - }, - ai1:function(card){ - return 10-get.value(card); - }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - var trigger=_status.event.getTrigger(); - var da=0; - if(_status.event.player.hp==1){ - da=10; - } - var eff=get.damageEffect(target,trigger.source,target); - if(att==0) return 0.1+da; - if(eff>=0&&att>0){ - return att+da; - } - if(att>0&&target.hp>1){ - if(target.maxHp-target.hp>=3) return att*1.1+da; - if(target.maxHp-target.hp>=2) return att*0.9+da; - } - return -att+da; - }, - prompt:get.prompt('retianxiang'), - prompt2:lib.translate.retianxiang_info - }).setHiddenSkill(event.name); - "step 1" - if(result.bool){ + }, + tianxiang2: { + trigger: { player: ["damageAfter", "damageCancelled", "damageZero"] }, + forced: true, + popup: false, + audio: false, + vanish: true, + charlotte: true, + content: function () { + if (player.getDamagedHp()) player.draw(player.getDamagedHp()); + player.removeSkill("tianxiang2"); + player.popup("tianxiang"); + }, + }, + retianxiang: { + audio: "tianxiang", + audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"], + trigger: { player: "damageBegin4" }, + direct: true, + preHidden: true, + filter: function (event, player) { + return ( + player.countCards("h", function (card) { + return _status.connectMode || get.suit(card, player) == "heart"; + }) > 0 && event.num > 0 + ); + }, + content: function () { + "step 0"; + player + .chooseCardTarget({ + filterCard: function (card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); + }, + filterTarget: function (card, player, target) { + return player != target; + }, + ai1: function (card) { + return 10 - get.value(card); + }, + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; + } + var eff = get.damageEffect(target, trigger.source, target); + if (att == 0) return 0.1 + da; + if (eff >= 0 && att > 0) { + return att + da; + } + if (att > 0 && target.hp > 1) { + if (target.maxHp - target.hp >= 3) return att * 1.1 + da; + if (target.maxHp - target.hp >= 2) return att * 0.9 + da; + } + return -att + da; + }, + prompt: get.prompt("retianxiang"), + prompt2: lib.translate.retianxiang_info, + }) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { player.discard(result.cards); - var target=result.targets[0]; - player.chooseControlList(true,function(event,player){ - var target=_status.event.target; - var att=get.attitude(player,target); - if(target.hasSkillTag('maihp')) att=-att; - if(att>0){ - return 0; - } - else{ - return 1; - } - }, - ['令'+get.translation(target)+'受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)', - '令'+get.translation(target)+'失去1点体力,然后获得'+get.translation(result.cards)]).set('target',target); - player.logSkill(event.name,target); + var target = result.targets[0]; + player + .chooseControlList( + true, + function (event, player) { + var target = _status.event.target; + var att = get.attitude(player, target); + if (target.hasSkillTag("maihp")) att = -att; + if (att > 0) { + return 0; + } else { + return 1; + } + }, + [ + "令" + + get.translation(target) + + "受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)", + "令" + + get.translation(target) + + "失去1点体力,然后获得" + + get.translation(result.cards), + ] + ) + .set("target", target); + player.logSkill(event.name, target); trigger.cancel(); - event.target=target; - event.card=result.cards[0]; - } - else{ + event.target = target; + event.card = result.cards[0]; + } else { event.finish(); } - "step 2" - if(typeof result.index=='number'){ - event.index=result.index; - if(result.index){ - event.related=event.target.loseHp(); + ("step 2"); + if (typeof result.index == "number") { + event.index = result.index; + if (result.index) { + event.related = event.target.loseHp(); + } else { + event.related = event.target.damage(trigger.source || "nosource", "nocard"); } - else{ - event.related=event.target.damage(trigger.source||'nosource','nocard'); - } - } - else event.finish(); - "step 3" + } else event.finish(); + ("step 3"); //if(event.related.cancelled||target.isDead()) return; - if(event.index&&card.isInPile()) target.gain(card,'gain2'); - else if(target.getDamagedHp()) target.draw(Math.min(5,target.getDamagedHp())); + if (event.index && card.isInPile()) target.gain(card, "gain2"); + else if (target.getDamagedHp()) target.draw(Math.min(5, target.getDamagedHp())); }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(get.tag(card,'damage')&&target.countCards('he')>1) return 0.7; - } + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; + }, }, - } + }, }, - retianxiang3:{ - trigger:{player:'loseHpAfter'}, - forced:true, - popup:false, - filter:function(event){ - return event.type=='retianxiang'; + retianxiang3: { + trigger: { player: "loseHpAfter" }, + forced: true, + popup: false, + filter: function (event) { + return event.type == "retianxiang"; }, - vanish:true, - content:function(){ - 'step 0' - player.gain(player.storage.retianxiang3,'gain2'); - 'step 1' - player.removeSkill('retianxiang3'); + vanish: true, + content: function () { + "step 0"; + player.gain(player.storage.retianxiang3, "gain2"); + ("step 1"); + player.removeSkill("retianxiang3"); }, - onremove:function(player){ - var card=player.storage.retianxiang3; - if(get.position(card)=='s'){ + onremove: function (player) { + var card = player.storage.retianxiang3; + if (get.position(card) == "s") { game.cardsDiscard(card); } delete player.storage.retianxiang3; - } - }, - retianxiang2:{ - trigger:{player:'damageAfter'}, - forced:true, - popup:false, - filter:function(event){ - return event.type=='retianxiang'; }, - vanish:true, - content:function(){ - if(player.isDamaged()){ + }, + retianxiang2: { + trigger: { player: "damageAfter" }, + forced: true, + popup: false, + filter: function (event) { + return event.type == "retianxiang"; + }, + vanish: true, + content: function () { + if (player.isDamaged()) { player.draw(player.getDamagedHp()); } - player.removeSkill('retianxiang2'); + player.removeSkill("retianxiang2"); }, }, - xintianxiang:{ - audio:'tianxiang', - trigger:{player:'damageBefore'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',{suit:'heart'})>0&&event.num>0&&!player.hasSkill('xintianxiang3'); + xintianxiang: { + audio: "tianxiang", + trigger: { player: "damageBefore" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he", { suit: "heart" }) > 0 && + event.num > 0 && + !player.hasSkill("xintianxiang3") + ); }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:function(card,player){ - return get.suit(card)=='heart'&&lib.filter.cardDiscardable(card,player); + filterCard: function (card, player) { + return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - position:'he', - ai1:function(card){ - return 10-get.value(card); + position: "he", + ai1: function (card) { + return 10 - get.value(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - var trigger=_status.event.getTrigger(); - var da=0; - if(_status.event.player.hp==1){ - da=10; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + var trigger = _status.event.getTrigger(); + var da = 0; + if (_status.event.player.hp == 1) { + da = 10; } - if(trigger.num>1){ - if(target.maxHp>5&&target.hp>1) return -att/10+da; - return -att+da; + if (trigger.num > 1) { + if (target.maxHp > 5 && target.hp > 1) return -att / 10 + da; + return -att + da; } - var eff=get.damageEffect(target,trigger.source,target,trigger.nature); - if(att==0) return 0.1+da; - if(eff>=0&&trigger.num==1){ - return att+da; + var eff = get.damageEffect(target, trigger.source, target, trigger.nature); + if (att == 0) return 0.1 + da; + if (eff >= 0 && trigger.num == 1) { + return att + da; } - if(target.hp==target.maxHp) return -att+da; - if(target.hp==1){ - if(target.maxHp<=4&&!target.hasSkillTag('maixie')){ - if(target.maxHp<=3){ - return -att+da; + if (target.hp == target.maxHp) return -att + da; + if (target.hp == 1) { + if (target.maxHp <= 4 && !target.hasSkillTag("maixie")) { + if (target.maxHp <= 3) { + return -att + da; } - return -att/2+da; + return -att / 2 + da; } return da; } - if(target.hp==target.maxHp-1){ - if(target.hp>2||target.hasSkillTag('maixie')) return att/5+da; - if(att>0) return 0.02+da; - return 0.05+da; + if (target.hp == target.maxHp - 1) { + if (target.hp > 2 || target.hasSkillTag("maixie")) return att / 5 + da; + if (att > 0) return 0.02 + da; + return 0.05 + da; } - return att/2+da; + return att / 2 + da; }, - prompt:get.prompt2('xintianxiang') + prompt: get.prompt2("xintianxiang"), }); - "step 1" - if(result.bool){ - player.logSkill(event.name,result.targets); - trigger.player=result.targets[0]; - trigger.player.addSkill('xintianxiang2'); - trigger.player.storage.xintianxiang=player; + ("step 1"); + if (result.bool) { + player.logSkill(event.name, result.targets); + trigger.player = result.targets[0]; + trigger.player.addSkill("xintianxiang2"); + trigger.player.storage.xintianxiang = player; player.discard(result.cards[0]); - } - else{ + } else { event.finish(); } }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(get.tag(card,'damage')&&target.countCards('he')>1) return 0.7; - } + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7; + }, }, - } + }, }, - xintianxiang2:{ - trigger:{player:['damageAfter','damageCancelled','damageZero']}, - forced:true, - popup:false, - audio:false, - vanish:true, - content:function(){ - 'step 0' - var source=player.storage.xintianxiang; - if(source.isDead()){ + xintianxiang2: { + trigger: { player: ["damageAfter", "damageCancelled", "damageZero"] }, + forced: true, + popup: false, + audio: false, + vanish: true, + content: function () { + "step 0"; + var source = player.storage.xintianxiang; + if (source.isDead()) { event.finish(); return; } - var num=player.maxHp-player.hp||0; - var str1='令'+get.translation(player)+'摸'+get.cnNumber(num)+'张牌'; - var str2='令'+get.translation(player)+'防止造成和受到的所有伤害且天香失效直到你下一回合开始'; - var att=get.attitude(source,player); - var choice='选项一'; - if(att<0){ - if(num>=2){ - choice='选项二'; + var num = player.maxHp - player.hp || 0; + var str1 = "令" + get.translation(player) + "摸" + get.cnNumber(num) + "张牌"; + var str2 = + "令" + + get.translation(player) + + "防止造成和受到的所有伤害且天香失效直到你下一回合开始"; + var att = get.attitude(source, player); + var choice = "选项一"; + if (att < 0) { + if (num >= 2) { + choice = "选项二"; + } + } else if (att > 0) { + if (num < 2 && !player.hasSkillTag("maixie")) { + choice = "选项二"; } } - else if(att>0){ - if(num<2&&!player.hasSkillTag('maixie')){ - choice='选项二'; + source + .chooseControl(function () { + return _status.event.choice; + }) + .set("choiceList", [str1, str2]) + .set("choice", choice); + ("step 1"); + if (result.control == "选项一") { + if (player.isDamaged()) { + player.draw(player.maxHp - player.hp); } + } else { + player.storage.xintianxiang.addSkill("xintianxiang3"); + player.storage.xintianxiang.storage.xintianxiang3 = player; + player.addSkill("xintianxiang4"); } - source.chooseControl(function(){ - return _status.event.choice; - }).set('choiceList',[str1,str2]).set('choice',choice); - 'step 1' - if(result.control=='选项一'){ - if(player.isDamaged()){ - player.draw(player.maxHp-player.hp); - } - } - else{ - player.storage.xintianxiang.addSkill('xintianxiang3'); - player.storage.xintianxiang.storage.xintianxiang3=player; - player.addSkill('xintianxiang4'); - } - player.removeSkill('xintianxiang2'); + player.removeSkill("xintianxiang2"); delete player.storage.xintianxiang; - } + }, }, - xintianxiang3:{ - trigger:{player:['phaseZhunbeiBegin','dieBegin']}, - silent:true, - content:function(){ - if(player.storage.xintianxiang3){ - player.storage.xintianxiang3.removeSkill('xintianxiang4'); + xintianxiang3: { + trigger: { player: ["phaseZhunbeiBegin", "dieBegin"] }, + silent: true, + content: function () { + if (player.storage.xintianxiang3) { + player.storage.xintianxiang3.removeSkill("xintianxiang4"); delete player.storage.xintianxiang3; } - player.removeSkill('xintianxiang3'); - } - }, - xintianxiang4:{ - trigger:{source:'damageBefore',player:'damageBefore'}, - forced:true, - mark:true, - intro:{ - content:'防止造成和受到的一切伤害' + player.removeSkill("xintianxiang3"); }, - priority:15, - content:function(){ + }, + xintianxiang4: { + trigger: { source: "damageBefore", player: "damageBefore" }, + forced: true, + mark: true, + intro: { + content: "防止造成和受到的一切伤害", + }, + priority: 15, + content: function () { trigger.cancel(); }, - ai:{ - nofire:true, - nothunder:true, - nodamage:true, - notrick:true, - notricksource:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')){ - return 'zeroplayertarget'; + ai: { + nofire: true, + nothunder: true, + nodamage: true, + notrick: true, + notricksource: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) { + return "zeroplayertarget"; } }, - player:function(card,player,target,current){ - if(get.tag(card,'damage')){ - return 'zeroplayertarget'; + player: function (card, player, target, current) { + if (get.tag(card, "damage")) { + return "zeroplayertarget"; } - } - } - } - }, - hongyan:{ - mod:{ - suit:function(card,suit){ - if(suit=='spade') return 'heart'; - } - } - }, - xinhongyan:{ - audio:2, - audioname:['sb_xiaoqiao'], - mod:{ - suit:function(card,suit){ - if(suit=='spade') return 'heart'; - } + }, + }, }, - trigger:{global:'judge'}, - direct:true, - filter:function(event,player){ - if(event.fixedResult&&event.fixedResult.suit) return event.fixedResult.suit=='heart'; - return get.suit(event.player.judging[0],event.player)=='heart'; + }, + hongyan: { + mod: { + suit: function (card, suit) { + if (suit == "spade") return "heart"; + }, }, - content:function(){ - "step 0" - var str='红颜:'+get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+',请将其改为一种花色'; - player.chooseControl('spade','heart','diamond','club').set('prompt',str).set('ai',function(){ - var judging=_status.event.judging; - var trigger=_status.event.getTrigger(); - var res1=trigger.judge(judging); - var list=lib.suit.slice(0); - var attitude=get.attitude(player,trigger.player); - if(attitude==0) return 0; - var getj=function(suit){ - return trigger.judge({ - name:get.name(judging), - nature:get.nature(judging), - suit:suit, - number:get.number(judging), - }) - }; - list.sort(function(a,b){ - return (getj(b)-getj(a))*get.sgn(attitude); - }); - return list[0]; - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.control!='cancel2'){ + }, + xinhongyan: { + audio: 2, + audioname: ["sb_xiaoqiao"], + mod: { + suit: function (card, suit) { + if (suit == "spade") return "heart"; + }, + }, + trigger: { global: "judge" }, + direct: true, + filter: function (event, player) { + if (event.fixedResult && event.fixedResult.suit) return event.fixedResult.suit == "heart"; + return get.suit(event.player.judging[0], event.player) == "heart"; + }, + content: function () { + "step 0"; + var str = + "红颜:" + + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + ",请将其改为一种花色"; + player + .chooseControl("spade", "heart", "diamond", "club") + .set("prompt", str) + .set("ai", function () { + var judging = _status.event.judging; + var trigger = _status.event.getTrigger(); + var res1 = trigger.judge(judging); + var list = lib.suit.slice(0); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0) return 0; + var getj = function (suit) { + return trigger.judge({ + name: get.name(judging), + nature: get.nature(judging), + suit: suit, + number: get.number(judging), + }); + }; + list.sort(function (a, b) { + return (getj(b) - getj(a)) * get.sgn(attitude); + }); + return list[0]; + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.control != "cancel2") { player.addExpose(0.25); player.popup(result.control); - game.log(player,'将判定结果改为了','#y'+get.translation(result.control+2)); - if(!trigger.fixedResult) trigger.fixedResult={}; - trigger.fixedResult.suit=result.control; - trigger.fixedResult.color=get.color({suit:result.control}); + game.log(player, "将判定结果改为了", "#y" + get.translation(result.control + 2)); + if (!trigger.fixedResult) trigger.fixedResult = {}; + trigger.fixedResult.suit = result.control; + trigger.fixedResult.color = get.color({ suit: result.control }); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:0.4, + ai: { + rejudge: true, + tag: { + rejudge: 0.4, }, - expose:0.5, + expose: 0.5, }, }, - gzbuqu:{ - audio:2, - trigger:{player:'changeHp'}, - filter:function(event,player){ - return player.hp<=0&&event.num<0; + gzbuqu: { + audio: 2, + trigger: { player: "changeHp" }, + filter: function (event, player) { + return player.hp <= 0 && event.num < 0; }, - marktext:'创', - intro:{ - markcount:'expansion', - content:'expansion', + marktext: "创", + intro: { + markcount: "expansion", + content: "expansion", }, - group:'gzbuqu_recover', - frequent:true, - ondisable:true, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length){ + group: "gzbuqu_recover", + frequent: true, + ondisable: true, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) { //delete player.nodying; player.loseToDiscardpile(cards); - if(player.hp<=0) player.dying({}); + if (player.hp <= 0) player.dying({}); } }, - process:function(player){ + process: function (player) { //delete player.nodying; - var nums=[]; - var cards=player.getExpansions('gzbuqu'); - for(var i=0;i0&&event.num>0; + subSkill: { + recover: { + trigger: { player: "recoverAfter" }, + filter: function (event, player) { + return player.getExpansions("gzbuqu").length > 0 && event.num > 0; }, - forced:true, - popup:false, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + forced: true, + popup: false, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - var cards=player.getExpansions('gzbuqu'),count=cards.length; - if(count>0&&(player.hp+count)>1){ - if(count==1) event._result={links:cards}; - else player.chooseCardButton('不屈:移去一张“创”',true,cards).set('ai',function(button){ - var buttons=get.selectableButtons(); - for(var i=0;i 0 && player.hp + count > 1) { + if (count == 1) event._result = { links: cards }; + else + player + .chooseCardButton("不屈:移去一张“创”", true, cards) + .set("ai", function (button) { + var buttons = get.selectableButtons(); + for (var i = 0; i < buttons.length; i++) { + if ( + buttons[i] != button && + get.number(buttons[i].link) == get.number(button.link) && + !ui.selected.buttons.includes(buttons[i]) + ) { + return 1; + } + } + return 0; + }); + } else event.finish(); + ("step 2"); + var cards = result.links; player.loseToDiscardpile(cards); - if(event.count) event.goto(1); - 'step 3' - if(lib.skill.gzbuqu.process(player)){ - if(player.isDying()){ - var evt=event,histories=[evt]; - while(true){ - evt=event.getParent('dying'); - if(!evt||evt.name!='dying'||histories.includes(evt)) break; + if (event.count) event.goto(1); + ("step 3"); + if (lib.skill.gzbuqu.process(player)) { + if (player.isDying()) { + var evt = event, + histories = [evt]; + while (true) { + evt = event.getParent("dying"); + if (!evt || evt.name != "dying" || histories.includes(evt)) break; histories.push(evt); - if(evt.player==player) evt.nodying=true; + if (evt.player == player) evt.nodying = true; } } } - } + }, + }, + }, + content: function () { + "step 0"; + var num = -trigger.num - Math.max(player.hp - trigger.num, 1) + 1; + player.addToExpansion(get.cards(num), "gain2").gaintag.add("gzbuqu"); + ("step 1"); + player.showCards(get.translation(player) + "的不屈牌", player.getExpansions("gzbuqu")); + ("step 2"); + if (lib.skill.gzbuqu.process(player)) { + var evt = trigger.getParent(); + if (evt.name == "damage" || evt.name == "loseHp") evt.nodying = true; } }, - content:function(){ - 'step 0' - var num=(-trigger.num-Math.max(player.hp-trigger.num,1)+1); - player.addToExpansion(get.cards(num),'gain2').gaintag.add('gzbuqu'); - 'step 1' - player.showCards(get.translation(player)+'的不屈牌',player.getExpansions('gzbuqu')); - 'step 2' - if(lib.skill.gzbuqu.process(player)){ - var evt=trigger.getParent(); - if(evt.name=='damage'||evt.name=='loseHp') evt.nodying=true; - } + ai: { + mingzhi: true, }, - ai:{ - mingzhi:true - } }, - buqu:{ - audio:2, - audioname:['key_yuri'], - trigger:{player:'chooseToUseBefore'}, - forced:true, - preHidden:true, - filter:function(event,player){ - return event.type=='dying'&&player.isDying()&&event.dying==player&&!event.getParent()._buqu; + buqu: { + audio: 2, + audioname: ["key_yuri"], + trigger: { player: "chooseToUseBefore" }, + forced: true, + preHidden: true, + filter: function (event, player) { + return ( + event.type == "dying" && + player.isDying() && + event.dying == player && + !event.getParent()._buqu + ); }, - content:function(){ - "step 0" - trigger.getParent()._buqu=true; - var card=get.cards()[0]; - event.card=card; - player.addToExpansion(card,'gain2').gaintag.add('buqu'); - "step 1" - var cards=player.getExpansions('buqu'),num=get.number(card); - player.showCards(cards,'不屈') - for(var i=0;i0; + } else if (event.type == "discard") { + if (!event.discarder) return false; + return game.hasPlayer(function (current) { + return current != event.discarder && event.getl(current).hs.length > 0; }); } return false; }, - content:function(){ - 'step 0' - var targets=[]; - if(trigger.name=='gain'){ - var cards=trigger.getg(trigger.player); - targets.addArray(game.filterPlayer(function(current){ - if(current==trigger.player) return false; - var hs=trigger.getl(current).hs; - for(var i of hs){ - if(cards.includes(i)) return true; - } - return false; - })); - } - else if(trigger.name=='loseAsync'&&trigger.type=='discard'){ - targets.addArray(game.filterPlayer(function(current){ - return current!=trigger.discarder&&trigger.getl(current).hs.length>0; - })); - } - else targets.push(trigger.player); - event.targets=targets.sortBySeat(); - if(!event.targets.length) event.finish(); - 'step 1' - var target=targets.shift(); - event.target=target; - if(target.isIn()) player.chooseBool(get.prompt('fenji',target),'失去1点体力,令该角色摸两张牌').set('ai',function(){ - var evt=_status.event.getParent(); - return get.attitude(evt.player,evt.target)>4; - }); - else{ - if(targets.length>0) event.goto(1); + content: function () { + "step 0"; + var targets = []; + if (trigger.name == "gain") { + var cards = trigger.getg(trigger.player); + targets.addArray( + game.filterPlayer(function (current) { + if (current == trigger.player) return false; + var hs = trigger.getl(current).hs; + for (var i of hs) { + if (cards.includes(i)) return true; + } + return false; + }) + ); + } else if (trigger.name == "loseAsync" && trigger.type == "discard") { + targets.addArray( + game.filterPlayer(function (current) { + return current != trigger.discarder && trigger.getl(current).hs.length > 0; + }) + ); + } else targets.push(trigger.player); + event.targets = targets.sortBySeat(); + if (!event.targets.length) event.finish(); + ("step 1"); + var target = targets.shift(); + event.target = target; + if (target.isIn()) + player + .chooseBool(get.prompt("fenji", target), "失去1点体力,令该角色摸两张牌") + .set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target) > 4; + }); + else { + if (targets.length > 0) event.goto(1); else event.finish(); } - 'step 2' - if(result.bool){ - player.logSkill('fenji',target); + ("step 2"); + if (result.bool) { + player.logSkill("fenji", target); player.loseHp(); - } - else{ - if(targets.length>0) event.goto(1); + } else { + if (targets.length > 0) event.goto(1); else event.finish(); } - 'step 3' + ("step 3"); target.draw(2); - if(targets.length>0) event.goto(1); + if (targets.length > 0) event.goto(1); }, }, - new_fenji:{ - audio:"fenji", - trigger:{ - global:"phaseJieshuBegin", + new_fenji: { + audio: "fenji", + trigger: { + global: "phaseJieshuBegin", }, - filter:function(event,player){ - if(event.player.countCards('h')==0&&event.player.isIn()) return true; + filter: function (event, player) { + if (event.player.countCards("h") == 0 && event.player.isIn()) return true; return false; }, - preHidden:true, - check:function(event,player){ - return get.attitude(player,event.player)>2; + preHidden: true, + check: function (event, player) { + return get.attitude(player, event.player) > 2; }, - content:function(){ - player.line(trigger.player,'green'); + content: function () { + player.line(trigger.player, "green"); trigger.player.draw(2); player.loseHp(); }, }, - leiji:{ - audio:2, - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - return event.card.name=='shan'; + leiji: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + return event.card.name == "shan"; }, - direct:true, - preHidden:true, - content:function(){ + direct: true, + preHidden: true, + content: function () { "step 0"; - player.chooseTarget(get.prompt2('leiji')).setHiddenSkill(event.name).ai=function(target){ - if(target.hasSkill('hongyan')) return 0; - return get.damageEffect(target,_status.event.player,_status.event.player,'thunder'); + player.chooseTarget(get.prompt2("leiji")).setHiddenSkill(event.name).ai = function ( + target + ) { + if (target.hasSkill("hongyan")) return 0; + return get.damageEffect( + target, + _status.event.player, + _status.event.player, + "thunder" + ); }; - "step 1" - if(result.bool){ - player.logSkill('leiji',result.targets,'thunder'); - event.target=result.targets[0]; - event.target.judge(function(card){ - if(get.suit(card)=='spade') return -4; + ("step 1"); + if (result.bool) { + player.logSkill("leiji", result.targets, "thunder"); + event.target = result.targets[0]; + event.target.judge(function (card) { + if (get.suit(card) == "spade") return -4; return 0; - }).judge2=function(result){ - return result.bool==false?true:false; + }).judge2 = function (result) { + return result.bool == false ? true : false; }; - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool==false){ - event.target.damage(2,'thunder'); + ("step 2"); + if (result.bool == false) { + event.target.damage(2, "thunder"); } }, - ai:{ - mingzhi:false, - useShan:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ - target: target, - card: card - },true)&&game.hasPlayer(function(current){ - return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; - })){ - if(card.name==='sha'){ - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) return; - } - else if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); - if(!target.hasSkillTag('rejudge')) return [1,1]; - let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e'; - if(target.hasCard(function(cardx){ - return get.suit(cardx)==='spade'; - },pos)) return [1,4]; - if(pos==='e') return [1,Math.min(4,1+0.75*Math.max(1,target.countCards('hs')))]; - return [1,1]; + ai: { + mingzhi: false, + useShan: true, + effect: { + target: function (card, player, target, current) { + if ( + get.tag(card, "respondShan") && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) && + game.hasPlayer(function (current) { + return ( + get.attitude(target, current) < 0 && + get.damageEffect(current, target, target, "thunder") > 0 + ); + }) + ) { + if (card.name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) + return 1 - 0.1 * Math.min(5, target.countCards("hs")); + if (!target.hasSkillTag("rejudge")) return [1, 1]; + let pos = player.hasSkillTag("viewHandcard", null, target, true) + ? "hes" + : "e"; + if ( + target.hasCard(function (cardx) { + return get.suit(cardx) === "spade"; + }, pos) + ) + return [1, 4]; + if (pos === "e") + return [1, Math.min(4, 1 + 0.75 * Math.max(1, target.countCards("hs")))]; + return [1, 1]; } - } - } - } - }, - guidao:{ - audio:2, - audioname:['sp_zhangjiao'], - trigger:{global:'judge'}, - filter:function(event,player){ - return player.countCards('hes',{color:'black'})>0; + }, + }, }, - direct:true, - content:function(){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('guidao'),'hes',function(card){ - if(get.color(card)!='black') return false; - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result; - } - else{ - return -result; - } - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight','guidao','noOrdering'); - } - else{ + }, + guidao: { + audio: 2, + audioname: ["sp_zhangjiao"], + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("hes", { color: "black" }) > 0; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("guidao"), + "hes", + function (card) { + if (get.color(card) != "black") return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "guidao", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { player.$gain2(trigger.player.judging[0]); player.gain(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); } - "step 3" + ("step 3"); game.delay(2); }, - ai:{ - rejudge:true, - tag:{ - rejudge:1 - } - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, }, // 蛊惑(guhuo)技能错误,请勿引用 /* @@ -7373,804 +8531,1022 @@ game.import('character', function () { } }, */ - huangtian:{ - unique:true, - audio:'huangtian2', - audioname:['zhangjiao','re_zhangjiao'], - global:'huangtian2', - zhuSkill:true, + huangtian: { + unique: true, + audio: "huangtian2", + audioname: ["zhangjiao", "re_zhangjiao"], + global: "huangtian2", + zhuSkill: true, }, - huangtian2:{ - audio:2, - enable:'phaseUse', - discard:false, - lose:false, - delay:false, - line:true, - prepare:function(cards,player,targets){ - targets[0].logSkill('huangtian'); + huangtian2: { + audio: 2, + enable: "phaseUse", + discard: false, + lose: false, + delay: false, + line: true, + prepare: function (cards, player, targets) { + targets[0].logSkill("huangtian"); }, - prompt:function(){ - var player=_status.event.player; - var list=game.filterPlayer(function(target){ - return target!=player&&target.hasZhuSkill('huangtian',player); + prompt: function () { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target != player && target.hasZhuSkill("huangtian", player); }); - var str='将一张【闪】或【闪电】交给'+get.translation(list); - if(list.length>1) str+='中的一人'; + var str = "将一张【闪】或【闪电】交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; return str; }, - filter:function(event,player){ - if(player.group!='qun') return false; - if(player.countCards('h','shan')+player.countCards('h','shandian')==0) return 0; - return game.hasPlayer(function(target){ - return target!=player&&target.hasZhuSkill('huangtian',player)&&!target.hasSkill('huangtian3'); + filter: function (event, player) { + if (player.group != "qun") return false; + if (player.countCards("h", "shan") + player.countCards("h", "shandian") == 0) return 0; + return game.hasPlayer(function (target) { + return ( + target != player && + target.hasZhuSkill("huangtian", player) && + !target.hasSkill("huangtian3") + ); }); }, - filterCard:function(card){ - return (card.name=='shan'||card.name=='shandian') + filterCard: function (card) { + return card.name == "shan" || card.name == "shandian"; }, - log:false, - visible:true, - filterTarget:function(card,player,target){ - return target!=player&&target.hasZhuSkill('huangtian',player)&&!target.hasSkill('huangtian3'); + log: false, + visible: true, + filterTarget: function (card, player, target) { + return ( + target != player && + target.hasZhuSkill("huangtian", player) && + !target.hasSkill("huangtian3") + ); }, //usable:1, //forceaudio:true, - content:function(){ - player.give(cards,target); - target.addTempSkill('huangtian3','phaseUseEnd'); + content: function () { + player.give(cards, target); + target.addTempSkill("huangtian3", "phaseUseEnd"); + }, + ai: { + expose: 0.3, + order: 10, + result: { + target: 5, + }, }, - ai:{ - expose:0.3, - order:10, - result:{ - target:5 - } - } }, - huangtian3:{}, - xinfu_guhuo:{ - audio:'guhuo_guess', - derivation:['chanyuan'], - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - return (lib.inpile.includes(name)&&player.countCards('hs')>0&&!player.hasSkill('guhuo_phase')); + huangtian3: {}, + xinfu_guhuo: { + audio: "guhuo_guess", + derivation: ["chanyuan"], + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return ( + lib.inpile.includes(name) && + player.countCards("hs") > 0 && + !player.hasSkill("guhuo_phase") + ); }, - filter:function(event,player){ - if(player.hasSkill('guhuo_phase')) return false; - if(!player.countCards('hs')) return false; - for(var i of lib.inpile){ - var type=get.type(i); - if((type=='basic'||type=='trick')&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard(get.autoViewAs({name:i,nature:j},'unsure'),player,event)) return true; + filter: function (event, player) { + if (player.hasSkill("guhuo_phase")) return false; + if (!player.countCards("hs")) return false; + for (var i of lib.inpile) { + var type = get.type(i); + if ( + (type == "basic" || type == "trick") && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if ( + event.filterCard( + get.autoViewAs({ name: i, nature: j }, "unsure"), + player, + event + ) + ) + return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i of lib.inpile){ - if(event.type!='phase') if(!event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) continue; - var type=get.type(i); - if(type=='basic'||type=='trick') list.push([type,'',i]); - if(i=='sha'){ - if(event.type!='phase') if(!event.filterCard(get.autoViewAs({name:i,nature:j},'unsure'),player,event)) continue; - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if (event.type != "phase") + if (!event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) + continue; + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); + if (i == "sha") { + if (event.type != "phase") + if ( + !event.filterCard( + get.autoViewAs({ name: i, nature: j }, "unsure"), + player, + event + ) + ) + continue; + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } } - return ui.create.dialog('蛊惑',[list,'vcard']); + return ui.create.dialog("蛊惑", [list, "vcard"]); }, - filter:function(button,player){ - var evt=_status.event.getParent(); - return evt.filterCard({name:button.link[2],nature:button.link[3]},player,evt); + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard({ name: button.link[2], nature: button.link[3] }, player, evt); }, - check:function(button){ - var player=_status.event.player; - var enemyNum=game.countPlayer(function(current){ - return current!=player&&!current.hasSkill('chanyuan')&&(get.realAttitude||get.attitude)(current,player)<0; + check: function (button) { + var player = _status.event.player; + var enemyNum = game.countPlayer(function (current) { + return ( + current != player && + !current.hasSkill("chanyuan") && + (get.realAttitude || get.attitude)(current, player) < 0 + ); }); - var card={name:button.link[2],nature:button.link[3]}; - var val=_status.event.getParent().type=='phase'?player.getUseValue(card):1; - if(val<=0) return 0; - if(enemyNum){ - if(!player.hasCard(function(cardx){ - if(card.name==cardx.name){ - if(card.name!='sha') return true; - return get.is.sameNature(card,cardx); - } - return false; - },'hs')){ - if(get.value(card,player,'raw')<6) return Math.sqrt(val)*(0.25+Math.random()/1.5); - if(enemyNum<=2) return Math.sqrt(val)/1.5; + var card = { name: button.link[2], nature: button.link[3] }; + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; + if (val <= 0) return 0; + if (enemyNum) { + if ( + !player.hasCard(function (cardx) { + if (card.name == cardx.name) { + if (card.name != "sha") return true; + return get.is.sameNature(card, cardx); + } + return false; + }, "hs") + ) { + if (get.value(card, player, "raw") < 6) + return Math.sqrt(val) * (0.25 + Math.random() / 1.5); + if (enemyNum <= 2) return Math.sqrt(val) / 1.5; return 0; } - return 3*val; + return 3 * val; } return val; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:function(card,player,target){ - var result=true; - var suit=card.suit,number=card.number; - card.suit='none';card.number=null; - var mod=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod!='unchanged') result=mod; - card.suit=suit;card.number=number; + filterCard: function (card, player, target) { + var result = true; + var suit = card.suit, + number = card.number; + card.suit = "none"; + card.number = null; + var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod != "unchanged") result = mod; + card.suit = suit; + card.number = number; return result; }, - selectCard:1, - position:'hs', - ignoreMod:true, - aiUse:Math.random(), - viewAs:{ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null + selectCard: 1, + position: "hs", + ignoreMod: true, + aiUse: Math.random(), + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, }, - ai1:function(card){ - var player=_status.event.player; - var enemyNum=game.countPlayer(function(current){ - return current!=player&&!current.hasSkill('chanyuan')&&(get.realAttitude||get.attitude)(current,player)<0; + ai1: function (card) { + var player = _status.event.player; + var enemyNum = game.countPlayer(function (current) { + return ( + current != player && + !current.hasSkill("chanyuan") && + (get.realAttitude || get.attitude)(current, player) < 0 + ); }); - var cardx=lib.skill.xinfu_guhuo_backup.viewAs; - if(enemyNum){ - if(card.name==cardx.name&&(card.name!='sha'||get.is.sameNature(card,cardx))) return 2+Math.random()*3; - else if(lib.skill.xinfu_guhuo_backup.aiUse<0.5&&!player.isDying()) return 0; + var cardx = lib.skill.xinfu_guhuo_backup.viewAs; + if (enemyNum) { + if ( + card.name == cardx.name && + (card.name != "sha" || get.is.sameNature(card, cardx)) + ) + return 2 + Math.random() * 3; + else if (lib.skill.xinfu_guhuo_backup.aiUse < 0.5 && !player.isDying()) + return 0; } - return 6-get.value(card); + return 6 - get.value(card); }, - precontent:function(){ - player.logSkill('xinfu_guhuo'); - player.addTempSkill('guhuo_guess'); - var card=event.result.cards[0]; - event.result.card.suit=get.suit(card); - event.result.card.number=get.number(card); + precontent: function () { + player.logSkill("xinfu_guhuo"); + player.addTempSkill("guhuo_guess"); + var card = event.result.cards[0]; + event.result.card.suit = get.suit(card); + event.result.card.number = get.number(card); }, - } + }; }, - prompt:function(links,player){ - return '将一张手牌当做'+get.translation(links[0][2])+(_status.event.name=='chooseToRespond'?'打出':'使用'); + prompt: function (links, player) { + return ( + "将一张手牌当做" + + get.translation(links[0][2]) + + (_status.event.name == "chooseToRespond" ? "打出" : "使用") + ); }, }, - ai:{ - save:true, - respondSha:true, - respondShan:true, - fireAttack:true, - skillTagFilter:function(player){ - if(!player.countCards('hs')||player.hasSkill('guhuo_phase')) return false; + ai: { + save: true, + respondSha: true, + respondShan: true, + fireAttack: true, + skillTagFilter: function (player) { + if (!player.countCards("hs") || player.hasSkill("guhuo_phase")) return false; }, - threaten:1.2, - order:8.1, - result:{player:1}, + threaten: 1.2, + order: 8.1, + result: { player: 1 }, }, }, - guhuo_guess:{ - audio:2, - trigger:{ - player:['useCardBefore','respondBefore'], + guhuo_guess: { + audio: 2, + trigger: { + player: ["useCardBefore", "respondBefore"], }, - forced:true, - silent:true, - popup:false, - firstDo:true, - charlotte:true, - filter:function(event,player){ - return event.skill&&(event.skill.indexOf('guhuo_')==0||event.skill.indexOf('xinfu_guhuo_')==0); + forced: true, + silent: true, + popup: false, + firstDo: true, + charlotte: true, + filter: function (event, player) { + return ( + event.skill && + (event.skill.indexOf("guhuo_") == 0 || event.skill.indexOf("xinfu_guhuo_") == 0) + ); }, - content:function(){ - 'step 0' - player.addTempSkill('guhuo_phase'); - event.fake=false; - event.betrayer=null; - var card=trigger.cards[0]; - if(card.name!=trigger.card.name||(card.name=='sha'&&!get.is.sameNature(trigger.card,card))) event.fake=true; - player.popup(trigger.card.name,'metal'); - player.lose(card,ui.ordering).relatedEvent=trigger; + content: function () { + "step 0"; + player.addTempSkill("guhuo_phase"); + event.fake = false; + event.betrayer = null; + var card = trigger.cards[0]; + if ( + card.name != trigger.card.name || + (card.name == "sha" && !get.is.sameNature(trigger.card, card)) + ) + event.fake = true; + player.popup(trigger.card.name, "metal"); + player.lose(card, ui.ordering).relatedEvent = trigger; // player.line(trigger.targets,trigger.card.nature); - trigger.throw=false; - trigger.skill='xinfu_guhuo_backup'; - game.log(player,'声明',trigger.targets&&trigger.targets.length?'对':'',trigger.targets||'',trigger.name=='useCard'?'使用':'打出',trigger.card); - event.prompt=get.translation(player)+'声明'+(trigger.targets&&trigger.targets.length?'对'+get.translation(trigger.targets):'')+ - (trigger.name=='useCard'?'使用':'打出')+(get.translation(trigger.card.nature)||'')+get.translation(trigger.card.name)+',是否质疑?'; - event.targets=game.filterPlayer(function(current){ - return current!=player&&!current.hasSkill('chanyuan'); - }).sortBySeat(_status.currentPhase); + trigger.throw = false; + trigger.skill = "xinfu_guhuo_backup"; + game.log( + player, + "声明", + trigger.targets && trigger.targets.length ? "对" : "", + trigger.targets || "", + trigger.name == "useCard" ? "使用" : "打出", + trigger.card + ); + event.prompt = + get.translation(player) + + "声明" + + (trigger.targets && trigger.targets.length + ? "对" + get.translation(trigger.targets) + : "") + + (trigger.name == "useCard" ? "使用" : "打出") + + (get.translation(trigger.card.nature) || "") + + get.translation(trigger.card.name) + + ",是否质疑?"; + event.targets = game + .filterPlayer(function (current) { + return current != player && !current.hasSkill("chanyuan"); + }) + .sortBySeat(_status.currentPhase); - game.broadcastAll(function(card,player){ - _status.guhuoNode=card.copy('thrown'); - if(lib.config.cardback_style!='default'){ - _status.guhuoNode.style.transitionProperty='none'; - ui.refresh(_status.guhuoNode); - _status.guhuoNode.classList.add('infohidden'); - ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transitionProperty=''; - } - else{ - _status.guhuoNode.classList.add('infohidden'); - } - _status.guhuoNode.style.transform='perspective(600px) rotateY(180deg) translateX(0)'; - player.$throwordered2(_status.guhuoNode); - },trigger.cards[0],player); - event.onEnd01=function(){ - _status.guhuoNode.removeEventListener('webkitTransitionEnd',_status.event.onEnd01); - setTimeout(function(){ - _status.guhuoNode.style.transition='all ease-in 0.3s'; - _status.guhuoNode.style.transform='perspective(600px) rotateY(270deg)'; - var onEnd=function(){ - _status.guhuoNode.classList.remove('infohidden'); - _status.guhuoNode.style.transition='all 0s'; + game.broadcastAll( + function (card, player) { + _status.guhuoNode = card.copy("thrown"); + if (lib.config.cardback_style != "default") { + _status.guhuoNode.style.transitionProperty = "none"; ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transform='perspective(600px) rotateY(-90deg)'; + _status.guhuoNode.classList.add("infohidden"); ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transition=''; - ui.refresh(_status.guhuoNode); - _status.guhuoNode.style.transform=''; - _status.guhuoNode.removeEventListener('webkitTransitionEnd',onEnd); + _status.guhuoNode.style.transitionProperty = ""; + } else { + _status.guhuoNode.classList.add("infohidden"); } + _status.guhuoNode.style.transform = + "perspective(600px) rotateY(180deg) translateX(0)"; + player.$throwordered2(_status.guhuoNode); + }, + trigger.cards[0], + player + ); + event.onEnd01 = function () { + _status.guhuoNode.removeEventListener("webkitTransitionEnd", _status.event.onEnd01); + setTimeout(function () { + _status.guhuoNode.style.transition = "all ease-in 0.3s"; + _status.guhuoNode.style.transform = "perspective(600px) rotateY(270deg)"; + var onEnd = function () { + _status.guhuoNode.classList.remove("infohidden"); + _status.guhuoNode.style.transition = "all 0s"; + ui.refresh(_status.guhuoNode); + _status.guhuoNode.style.transform = "perspective(600px) rotateY(-90deg)"; + ui.refresh(_status.guhuoNode); + _status.guhuoNode.style.transition = ""; + ui.refresh(_status.guhuoNode); + _status.guhuoNode.style.transform = ""; + _status.guhuoNode.removeEventListener("webkitTransitionEnd", onEnd); + }; _status.guhuoNode.listenTransition(onEnd); - },300); + }, 300); }; - if(!event.targets.length) event.goto(3); - 'step 1' - event.target=event.targets.shift(); - event.target.chooseButton([event.prompt,[['reguhuo_ally','reguhuo_betray'],'vcard']],true).set('ai',function(button){ - var player=_status.event.player; - var evt=_status.event.getParent('guhuo_guess'),evtx=evt.getTrigger(); - if(!evt) return Math.random(); - var card={name:evtx.card.name,nature:evtx.card.nature,isCard:true}; - var ally=button.link[2]=='reguhuo_ally'; - if(ally&&(player.hp<=1||get.attitude(player,evt.player)>=0)) return 1.1; - if(!ally&&get.attitude(player,evt.player)<0&&evtx.name=='useCard'){ - var eff=0; - var targetsx=evtx.targets||[]; - for(var target of targetsx){ - var isMe=target==evt.player; - eff+=get.effect(target,card,evt.player,player)/(isMe?1.5:1); + if (!event.targets.length) event.goto(3); + ("step 1"); + event.target = event.targets.shift(); + event.target + .chooseButton([event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true) + .set("ai", function (button) { + var player = _status.event.player; + var evt = _status.event.getParent("guhuo_guess"), + evtx = evt.getTrigger(); + if (!evt) return Math.random(); + var card = { name: evtx.card.name, nature: evtx.card.nature, isCard: true }; + var ally = button.link[2] == "reguhuo_ally"; + if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1; + if (!ally && get.attitude(player, evt.player) < 0 && evtx.name == "useCard") { + var eff = 0; + var targetsx = evtx.targets || []; + for (var target of targetsx) { + var isMe = target == evt.player; + eff += get.effect(target, card, evt.player, player) / (isMe ? 1.5 : 1); + } + eff /= 1.5 * targetsx.length || 1; + if (eff > 0) return 0; + if (eff < -7) return Math.random() + Math.pow(-(eff + 7) / 8, 2); + return Math.pow( + (get.value(card, evt.player, "raw") - 4) / (eff == 0 ? 5 : 10), + 2 + ); } - eff/=(1.5*targetsx.length)||1; - if(eff>0) return 0; - if(eff<-7) return Math.random()+Math.pow(-(eff+7)/8,2); - return Math.pow((get.value(card,evt.player,'raw')-4)/(eff==0?5:10),2); - } - return Math.random(); - }); - 'step 2' - if(result.links[0][2]=='reguhuo_betray'){ + return Math.random(); + }); + ("step 2"); + if (result.links[0][2] == "reguhuo_betray") { target.addExpose(0.2); - game.log(target,'#y质疑'); - target.popup('质疑!','fire'); - event.betrayer=target; + game.log(target, "#y质疑"); + target.popup("质疑!", "fire"); + event.betrayer = target; + } else { + game.log(target, "#g不质疑"); + target.popup("不质疑", "wood"); + if (targets.length) event.goto(1); } - else{ - game.log(target,'#g不质疑'); - target.popup('不质疑','wood'); - if(targets.length) event.goto(1); - } - 'step 3' + ("step 3"); game.delayx(); - game.broadcastAll(function(onEnd){ - _status.event.onEnd01=onEnd; - if(_status.guhuoNode) _status.guhuoNode.listenTransition(onEnd,300); - },event.onEnd01); - 'step 4' + game.broadcastAll(function (onEnd) { + _status.event.onEnd01 = onEnd; + if (_status.guhuoNode) _status.guhuoNode.listenTransition(onEnd, 300); + }, event.onEnd01); + ("step 4"); game.delay(2); - 'step 5' - if(!event.betrayer) event.finish(); - 'step 6' - if(event.fake){ - event.betrayer.popup('质疑正确','wood'); - game.log(player,'声明的',trigger.card,'作废了'); + ("step 5"); + if (!event.betrayer) event.finish(); + ("step 6"); + if (event.fake) { + event.betrayer.popup("质疑正确", "wood"); + game.log(player, "声明的", trigger.card, "作废了"); trigger.cancel(); trigger.getParent().goto(0); - trigger.line=false; + trigger.line = false; + } else { + event.betrayer.popup("质疑错误", "fire"); + event.betrayer.addSkills("chanyuan"); } - else{ - event.betrayer.popup('质疑错误','fire'); - event.betrayer.addSkills('chanyuan'); - } - 'step 7' + ("step 7"); game.delay(2); - 'step 8' - if(event.fake) game.broadcastAll(ui.clear); + ("step 8"); + if (event.fake) game.broadcastAll(ui.clear); }, }, - chanyuan:{ - init:function(player,skill){ - if(player.hp==1) player.logSkill(skill); + chanyuan: { + init: function (player, skill) { + if (player.hp == 1) player.logSkill(skill); player.addSkillBlocker(skill); }, - onremove:function(player,skill){ + onremove: function (player, skill) { player.removeSkillBlocker(skill); }, - skillBlocker:function(skill,player){ - return skill!='chanyuan'&&skill!='rechanyuan'&&!lib.skill[skill].charlotte&&player.hp==1; + skillBlocker: function (skill, player) { + return ( + skill != "chanyuan" && + skill != "rechanyuan" && + !lib.skill[skill].charlotte && + player.hp == 1 + ); }, - mark:true, - intro:{ - content:function(storage,player,skill){ - var str='
  • 锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。'; - var list=player.getSkills(null,false,false).filter(function(i){ - return lib.skill.rechanyuan.skillBlocker(i,player); + mark: true, + intro: { + content: function (storage, player, skill) { + var str = + "
  • 锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。"; + var list = player.getSkills(null, false, false).filter(function (i) { + return lib.skill.rechanyuan.skillBlocker(i, player); }); - if(list.length) str+=('
  • 失效技能:'+get.translation(list)) + if (list.length) str += "
  • 失效技能:" + get.translation(list); return str; }, }, - audio:2, - trigger:{player:'changeHp'}, - filter:function(event,player){ - return player.hp==1; + audio: 2, + trigger: { player: "changeHp" }, + filter: function (event, player) { + return player.hp == 1; }, - forced:true, - content:function(){}, + forced: true, + content: function () {}, }, - guhuo_phase:{}, + guhuo_phase: {}, }, - card:{}, - dynamicTranslate:{ - nzry_juzhan:function(player){ - if(player.storage.nzry_juzhan==true) return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; + card: {}, + dynamicTranslate: { + nzry_juzhan: function (player) { + if (player.storage.nzry_juzhan == true) + return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; return '转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。'; }, - nzry_zhenliang:function(player){ - if(player.storage.nzry_zhenliang==true) return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; + nzry_zhenliang: function (player) { + if (player.storage.nzry_zhenliang == true) + return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; return '转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。'; }, - nzry_chenglve:function(player){ - if(player.storage.nzry_chenglve==true) return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; + nzry_chenglve: function (player) { + if (player.storage.nzry_chenglve == true) + return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; }, - nzry_shenshi:function(player){ - if(player.storage.nzry_shenshi==true) return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; + nzry_shenshi: function (player) { + if (player.storage.nzry_shenshi == true) + return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; }, }, - characterReplace:{ - caoren:['caoren','old_caoren','sb_caoren','new_caoren','star_caoren'], - sp_caoren:['sp_caoren','jsp_caoren'], - xiahouyuan:['re_xiahouyuan','ol_xiahouyuan','xiahouyuan'], - huangzhong:['re_huangzhong','ol_huangzhong','sb_huangzhong','huangzhong','jsrg_huangzhong'], - weiyan:['re_weiyan','ol_weiyan','weiyan'], - zhoutai:['zhoutai','xin_zhoutai','old_zhoutai'], - xiaoqiao:['xiaoqiao','ol_xiaoqiao','re_xiaoqiao','sb_xiaoqiao','old_xiaoqiao'], - yuji:['xin_yuji','re_yuji','yuji'], - zhangjiao:['sp_zhangjiao','re_zhangjiao','sb_zhangjiao','zhangjiao'], - dianwei:['dianwei','ol_dianwei','re_dianwei'], - xunyu:['xunyu','ol_xunyu','re_xunyu','sb_xunyu'], - sp_zhugeliang:['sp_zhugeliang','ol_sp_zhugeliang','re_sp_zhugeliang','sb_sp_zhugeliang'], - pangtong:['pangtong','ol_pangtong','re_pangtong','sb_pangtong'], - re_jsp_pangtong:['re_jsp_pangtong','jsrg_pangtong','sp_pangtong'], - taishici:['taishici','re_taishici','ol_sb_taishici'], - re_yuanshao:['re_yuanshao','ol_yuanshao','xin_yuanshao','ol_sb_yuanshao','star_yuanshao','sb_yuanshao'], - pangde:['re_pangde','ol_pangde','pangde'], - yanwen:['yanwen','ol_yanwen','re_yanwen'], - caopi:['caopi','re_caopi','ps_caopi','sb_caopi'], - xuhuang:['re_xuhuang','ol_xuhuang','sb_xuhuang','xuhuang'], - menghuo:['menghuo','re_menghuo','sb_menghuo','tw_menghuo'], - zhurong:['zhurong','ol_zhurong','re_zhurong','sb_zhurong'], - sunjian:['sunjian','ol_sunjian','re_sunjian','tw_ol_sunjian'], - jiaxu:['jiaxu','re_jiaxu','ns_jiaxu','ps_jiaxu'], - dongzhuo:['dongzhuo','ol_dongzhuo','re_dongzhuo','star_dongzhuo','sp_dongzhuo','yj_dongzhuo'], - dengai:['dengai','ol_dengai','re_dengai'], - sp_ol_zhanghe:['sp_ol_zhanghe','yj_zhanghe','sp_zhanghe','jsrg_zhanghe'], - jiangwei:['jiangwei','ol_jiangwei','re_jiangwei','ol_sb_jiangwei','sb_jiangwei','jsrg_jiangwei'], - liushan:['liushan','ol_liushan','re_liushan'], - sunce:['sunce','re_sunce','re_sunben','sb_sunce','dc_sunce'], - zhangzhang:['zhangzhang','ol_zhangzhang','re_zhangzhang'], - zuoci:['zuoci','re_zuoci'], - caiwenji:['caiwenji','ol_caiwenji','re_caiwenji'], - xuyou:['xuyou','sp_xuyou','jsrg_xuyou','yj_xuyou','junk_xuyou'], - guanqiujian:['guanqiujian','re_guanqiujian','tw_guanqiujian','mb_sp_guanqiujian','old_guanqiujian'], - chendao:['chendao','ns_chendao','old_chendao'], - zhugezhan:['zhugezhan','old_zhugezhan'], - ol_lusu:['re_lusu','ol_lusu','dc_sb_lusu'], - zhanghe:['zhanghe','re_zhanghe','sb_zhanghe'], - yl_luzhi:['yl_luzhi','sb_yl_luzhi','tw_yl_luzhi'], - sunliang:['sunliang','xin_sunliang'], + characterReplace: { + caoren: ["caoren", "old_caoren", "sb_caoren", "new_caoren", "star_caoren"], + sp_caoren: ["sp_caoren", "jsp_caoren"], + xiahouyuan: ["re_xiahouyuan", "ol_xiahouyuan", "xiahouyuan"], + huangzhong: ["re_huangzhong", "ol_huangzhong", "sb_huangzhong", "huangzhong", "jsrg_huangzhong"], + weiyan: ["re_weiyan", "ol_weiyan", "weiyan"], + zhoutai: ["zhoutai", "xin_zhoutai", "old_zhoutai"], + xiaoqiao: ["xiaoqiao", "ol_xiaoqiao", "re_xiaoqiao", "sb_xiaoqiao", "old_xiaoqiao"], + yuji: ["xin_yuji", "re_yuji", "yuji"], + zhangjiao: ["sp_zhangjiao", "re_zhangjiao", "sb_zhangjiao", "zhangjiao"], + dianwei: ["dianwei", "ol_dianwei", "re_dianwei"], + xunyu: ["xunyu", "ol_xunyu", "re_xunyu", "sb_xunyu"], + sp_zhugeliang: ["sp_zhugeliang", "ol_sp_zhugeliang", "re_sp_zhugeliang", "sb_sp_zhugeliang"], + pangtong: ["pangtong", "ol_pangtong", "re_pangtong", "sb_pangtong"], + re_jsp_pangtong: ["re_jsp_pangtong", "jsrg_pangtong", "sp_pangtong"], + taishici: ["taishici", "re_taishici", "ol_sb_taishici"], + re_yuanshao: [ + "re_yuanshao", + "ol_yuanshao", + "xin_yuanshao", + "ol_sb_yuanshao", + "star_yuanshao", + "sb_yuanshao", + ], + pangde: ["re_pangde", "ol_pangde", "pangde"], + yanwen: ["yanwen", "ol_yanwen", "re_yanwen"], + caopi: ["caopi", "re_caopi", "ps_caopi", "sb_caopi"], + xuhuang: ["re_xuhuang", "ol_xuhuang", "sb_xuhuang", "xuhuang"], + menghuo: ["menghuo", "re_menghuo", "sb_menghuo", "tw_menghuo"], + zhurong: ["zhurong", "ol_zhurong", "re_zhurong", "sb_zhurong"], + sunjian: ["sunjian", "ol_sunjian", "re_sunjian", "tw_ol_sunjian"], + jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_jiaxu"], + dongzhuo: [ + "dongzhuo", + "ol_dongzhuo", + "re_dongzhuo", + "star_dongzhuo", + "sp_dongzhuo", + "yj_dongzhuo", + ], + dengai: ["dengai", "ol_dengai", "re_dengai"], + sp_ol_zhanghe: ["sp_ol_zhanghe", "yj_zhanghe", "sp_zhanghe", "jsrg_zhanghe"], + jiangwei: [ + "jiangwei", + "ol_jiangwei", + "re_jiangwei", + "ol_sb_jiangwei", + "sb_jiangwei", + "jsrg_jiangwei", + ], + liushan: ["liushan", "ol_liushan", "re_liushan"], + sunce: ["sunce", "re_sunce", "re_sunben", "sb_sunce", "dc_sunce"], + zhangzhang: ["zhangzhang", "ol_zhangzhang", "re_zhangzhang"], + zuoci: ["zuoci", "re_zuoci"], + caiwenji: ["caiwenji", "ol_caiwenji", "re_caiwenji"], + xuyou: ["xuyou", "sp_xuyou", "jsrg_xuyou", "yj_xuyou", "junk_xuyou"], + guanqiujian: [ + "guanqiujian", + "re_guanqiujian", + "tw_guanqiujian", + "mb_sp_guanqiujian", + "old_guanqiujian", + ], + chendao: ["chendao", "ns_chendao", "old_chendao"], + zhugezhan: ["zhugezhan", "old_zhugezhan"], + ol_lusu: ["re_lusu", "ol_lusu", "dc_sb_lusu"], + zhanghe: ["zhanghe", "re_zhanghe", "sb_zhanghe"], + yl_luzhi: ["yl_luzhi", "sb_yl_luzhi", "tw_yl_luzhi"], + sunliang: ["sunliang", "xin_sunliang"], }, - translate:{ - re_yuanshao:'袁绍', - re_lusu:'鲁肃', - re_yuji:"于吉", - wangji:'王基', - "kuailiangkuaiyue":"蒯良蒯越", - "sunliang":"孙亮", - "yl_luzhi":"卢植", - "xuyou":"许攸", - "luji":"陆绩", - "wangping":"王平", - "yanyan":"严颜", + translate: { + re_yuanshao: "袁绍", + re_lusu: "鲁肃", + re_yuji: "于吉", + wangji: "王基", + kuailiangkuaiyue: "蒯良蒯越", + sunliang: "孙亮", + yl_luzhi: "卢植", + xuyou: "许攸", + luji: "陆绩", + wangping: "王平", + yanyan: "严颜", - "zhugezhan":"诸葛瞻", - "lukang":"陆抗", - "haozhao":"郝昭", - yl_yuanshu:"新杀袁术", - yl_yuanshu_prefix:"新杀", - "zhangxiu":"张绣", - "chendao":"陈到", - "guanqiujian":"毌丘俭", - zhoufei:"周妃", + zhugezhan: "诸葛瞻", + lukang: "陆抗", + haozhao: "郝昭", + yl_yuanshu: "新杀袁术", + yl_yuanshu_prefix: "新杀", + zhangxiu: "张绣", + chendao: "陈到", + guanqiujian: "毌丘俭", + zhoufei: "周妃", - "nzry_jianxiang":"荐降", - "nzry_jianxiang_info":"当你成为其他角色使用牌的目标时,你可令手牌数最少的一名角色摸一张牌。", - "nzry_shenshi1":"审时", - "nzry_shenshi":"审时", - "nzry_shenshi_info":"转换技,阴:出牌阶段限一次,你可以将一张牌交给一名除你外手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。", - "nzry_mingren":"明任", - "nzry_mingren_info":"游戏开始时,你摸两张牌,然后将一张手牌置于你的武将牌上,称为“任”。结束阶段,你可以用一张手牌替换“任”。", - "nzry_zhenliang":"贞良", - "nzry_zhenliang_info":"转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。", - "nzry_chenglve1":"成略", - "nzry_chenglve":"成略", - "nzry_chenglve_info":"转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。", - "nzry_cunmu":"寸目", - "nzry_cunmu_info":"锁定技,当你摸牌时,改为从牌堆底摸牌。", - "nzry_kuizhu":"溃诛", - "nzry_kuizhu_info":"弃牌阶段结束后,你可以选择一项:①令至多X名角色各摸一张牌。②对任意名体力值之和为X的角色造成1点伤害。(X为你此阶段弃置的牌数)", - "nzry_zhizheng":"掣政", - rechezheng:'掣政', - "nzry_zhizheng_info":"锁定技,你的出牌阶段内,当你对攻击范围内不包含你的其他角色造成伤害时,防止此伤害。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", - "nzry_lijun1":"立军", - "nzry_lijun":"立军", - "nzry_lijun_info":"主公技,其他吴势力角色的出牌阶段限一次,其使用【杀】结算后,可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌且本阶段内使用【杀】的次数上限+1。", - "nzry_huaiju":"怀橘", - "nzry_huaiju_info":"锁定技,游戏开始时,你获得3个“橘”标记。(有“橘”的角色受到伤害时,防止此伤害,然后移去一个“橘”;有“橘”的角色摸牌阶段额外摸一张牌)", - "tachibana_effect":"怀橘", - "nzry_yili":"遗礼", - "nzry_yili_info":"出牌阶段开始时,你可以失去1点体力或移去一个“橘”,然后令一名其他角色获得一个“橘”。", - "nzry_zhenglun":"整论", - "nzry_zhenglun_info":"若你没有“橘”,你可以跳过摸牌阶段然后获得一个“橘”。", - "nzry_feijun":"飞军", - "nzry_feijun_info":"出牌阶段限一次。你可以弃置一张牌,然后选择一项:⒈令一名手牌数大于你的角色交给你一张牌;⒉令一名装备区里牌数大于你的角色弃置一张装备牌。", - "nzry_binglve":"兵略", - "nzry_binglve_info":"锁定技,当你发动“飞军”时,若目标与你之前指定的目标均不相同,则你摸两张牌。", - "nzry_juzhan1":"拒战", - "nzry_juzhan":"拒战", - "nzry_juzhan_info":"转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。", + nzry_jianxiang: "荐降", + nzry_jianxiang_info: "当你成为其他角色使用牌的目标时,你可令手牌数最少的一名角色摸一张牌。", + nzry_shenshi1: "审时", + nzry_shenshi: "审时", + nzry_shenshi_info: + "转换技,阴:出牌阶段限一次,你可以将一张牌交给一名除你外手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。", + nzry_mingren: "明任", + nzry_mingren_info: + "游戏开始时,你摸两张牌,然后将一张手牌置于你的武将牌上,称为“任”。结束阶段,你可以用一张手牌替换“任”。", + nzry_zhenliang: "贞良", + nzry_zhenliang_info: + "转换技,阴:出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。阳:当你于回合外使用或打出的牌结算完成后,若此牌与“任”颜色相同,则你可以令一名角色摸一张牌。", + nzry_chenglve1: "成略", + nzry_chenglve: "成略", + nzry_chenglve_info: + "转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。", + nzry_cunmu: "寸目", + nzry_cunmu_info: "锁定技,当你摸牌时,改为从牌堆底摸牌。", + nzry_kuizhu: "溃诛", + nzry_kuizhu_info: + "弃牌阶段结束后,你可以选择一项:①令至多X名角色各摸一张牌。②对任意名体力值之和为X的角色造成1点伤害。(X为你此阶段弃置的牌数)", + nzry_zhizheng: "掣政", + rechezheng: "掣政", + nzry_zhizheng_info: + "锁定技,你的出牌阶段内,当你对攻击范围内不包含你的其他角色造成伤害时,防止此伤害。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", + nzry_lijun1: "立军", + nzry_lijun: "立军", + nzry_lijun_info: + "主公技,其他吴势力角色的出牌阶段限一次,其使用【杀】结算后,可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌且本阶段内使用【杀】的次数上限+1。", + nzry_huaiju: "怀橘", + nzry_huaiju_info: + "锁定技,游戏开始时,你获得3个“橘”标记。(有“橘”的角色受到伤害时,防止此伤害,然后移去一个“橘”;有“橘”的角色摸牌阶段额外摸一张牌)", + tachibana_effect: "怀橘", + nzry_yili: "遗礼", + nzry_yili_info: + "出牌阶段开始时,你可以失去1点体力或移去一个“橘”,然后令一名其他角色获得一个“橘”。", + nzry_zhenglun: "整论", + nzry_zhenglun_info: "若你没有“橘”,你可以跳过摸牌阶段然后获得一个“橘”。", + nzry_feijun: "飞军", + nzry_feijun_info: + "出牌阶段限一次。你可以弃置一张牌,然后选择一项:⒈令一名手牌数大于你的角色交给你一张牌;⒉令一名装备区里牌数大于你的角色弃置一张装备牌。", + nzry_binglve: "兵略", + nzry_binglve_info: "锁定技,当你发动“飞军”时,若目标与你之前指定的目标均不相同,则你摸两张牌。", + nzry_juzhan1: "拒战", + nzry_juzhan: "拒战", + nzry_juzhan_info: + "转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。", - liangyin:"良姻", - "liangyin_info":"当有牌移至游戏外时,你可以令手牌数大于你的一名角色摸一张牌;当有牌从游戏外加入任意角色的手牌时,你可以令手牌数小于你的一名角色弃置一张牌。", - kongsheng:"箜声", - "kongsheng_info":"准备阶段,你可以将任意张牌置于你的武将牌上;结束阶段,你使用武将牌上的装备牌,并获得武将牌上的其他牌。", - "kongsheng2":"箜声", - "kongsheng2_info":"", - "xinfu_zuilun":"罪论", - "xinfu_zuilun_info":"结束阶段,你可以观看牌堆顶三张牌,你每满足以下一项便保留一张,然后以任意顺序放回其余的牌:1.你于此回合内造成过伤害;2.你于此回合内未弃置过牌;3.手牌数为全场最少。若均不满足,你与一名其他角色失去1点体力。", - "xinfu_fuyin":"父荫", - "xinfu_fuyin_info":"锁定技,你每回合第一次成为【杀】或【决斗】的目标后,若你的手牌数小于等于该角色,此牌对你无效。", - drlt_wanglie:"往烈", - drlt_wanglie_info:"①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌。", - "drlt_xiongluan":"雄乱", - drlt_xiongluan1:'雄乱', - "drlt_xiongluan_info":"限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌。", - "drlt_congjian":"从谏", - "drlt_congjian_info":"当你成为锦囊牌的目标时,若此牌的目标数大于1,则你可以交给其中一名其他目标角色一张牌,然后摸一张牌,若你给出的是装备牌,改为摸两张牌。", - "drlt_yongsi":"庸肆", - "drlt_yongsi_info":"锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);出牌阶段结束时,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成的伤害超过1点,本回合手牌上限改为已损失体力值。", - "drlt_weidi":"伪帝", - weidi_tag:'伪帝', - "drlt_weidi_info":"主公技,弃牌阶段开始时,若你的手牌数大于手牌上限,则你可以将至多X张手牌分别交给等量的其他群雄角色(X为你的手牌数与手牌上限之差)。", - "drlt_qianjie":"谦节", - "drlt_qianjie_info":"锁定技,当你横置时,取消之。你不能成为延时类锦囊的目标。你不能成为其他角色拼点的目标。", - "drlt_jueyan":"决堰", - "drlt_jueyan_info":"出牌阶段限一次,你可以废除一种装备栏,然后执行对应一项:武器栏,你本回合内使用【杀】的次数上限+3;防具栏,你摸三张牌,且本回合手牌上限+3;坐骑栏,你本回合内使用牌无距离限制;宝物栏,你获得〖集智〗直到回合结束。", - "drlt_poshi":"破势", - "drlt_poshi_info":"觉醒技,准备阶段开始时,若你的装备栏均已被废除或体力值为1,则你减1点体力上限,将手牌摸至体力上限,失去〖决堰〗并获得〖怀柔〗。", - "drlt_huairou":"怀柔", - "drlt_huairou_info":"出牌阶段,你可以重铸装备牌。", - "drlt_zhenggu":"镇骨", - drlt_zhenggu2:"镇骨", - "drlt_zhenggu_info":"结束阶段,你可以选择一名其他角色,你的回合结束后和该角色的下个回合结束时,其将手牌摸至或弃至X张。(X为你的手牌数且至多为5)", - "drlt_zhenrong":"征荣", - "drlt_zhenrong_info":"当你对其他角色造成伤害后,若其手牌比你多,你可以将其一张牌置于你的武将牌上,称为“荣”。", - "drlt_hongju":"鸿举", - "drlt_hongju_info":"觉醒技,准备阶段,若“荣”的数量大于或等于3且场上有角色死亡,则你可以用任意张手牌替换等量的“荣”,然后减1点体力上限并获得〖清侧〗。", - "drlt_qingce":"清侧", - "drlt_qingce_info":"出牌阶段,你可以移去一张“荣”,然后弃置一名角色装备区或判定区内的一张牌。", + liangyin: "良姻", + liangyin_info: + "当有牌移至游戏外时,你可以令手牌数大于你的一名角色摸一张牌;当有牌从游戏外加入任意角色的手牌时,你可以令手牌数小于你的一名角色弃置一张牌。", + kongsheng: "箜声", + kongsheng_info: + "准备阶段,你可以将任意张牌置于你的武将牌上;结束阶段,你使用武将牌上的装备牌,并获得武将牌上的其他牌。", + kongsheng2: "箜声", + kongsheng2_info: "", + xinfu_zuilun: "罪论", + xinfu_zuilun_info: + "结束阶段,你可以观看牌堆顶三张牌,你每满足以下一项便保留一张,然后以任意顺序放回其余的牌:1.你于此回合内造成过伤害;2.你于此回合内未弃置过牌;3.手牌数为全场最少。若均不满足,你与一名其他角色失去1点体力。", + xinfu_fuyin: "父荫", + xinfu_fuyin_info: + "锁定技,你每回合第一次成为【杀】或【决斗】的目标后,若你的手牌数小于等于该角色,此牌对你无效。", + drlt_wanglie: "往烈", + drlt_wanglie_info: + "①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌。", + drlt_xiongluan: "雄乱", + drlt_xiongluan1: "雄乱", + drlt_xiongluan_info: + "限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌。", + drlt_congjian: "从谏", + drlt_congjian_info: + "当你成为锦囊牌的目标时,若此牌的目标数大于1,则你可以交给其中一名其他目标角色一张牌,然后摸一张牌,若你给出的是装备牌,改为摸两张牌。", + drlt_yongsi: "庸肆", + drlt_yongsi_info: + "锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);出牌阶段结束时,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成的伤害超过1点,本回合手牌上限改为已损失体力值。", + drlt_weidi: "伪帝", + weidi_tag: "伪帝", + drlt_weidi_info: + "主公技,弃牌阶段开始时,若你的手牌数大于手牌上限,则你可以将至多X张手牌分别交给等量的其他群雄角色(X为你的手牌数与手牌上限之差)。", + drlt_qianjie: "谦节", + drlt_qianjie_info: + "锁定技,当你横置时,取消之。你不能成为延时类锦囊的目标。你不能成为其他角色拼点的目标。", + drlt_jueyan: "决堰", + drlt_jueyan_info: + "出牌阶段限一次,你可以废除一种装备栏,然后执行对应一项:武器栏,你本回合内使用【杀】的次数上限+3;防具栏,你摸三张牌,且本回合手牌上限+3;坐骑栏,你本回合内使用牌无距离限制;宝物栏,你获得〖集智〗直到回合结束。", + drlt_poshi: "破势", + drlt_poshi_info: + "觉醒技,准备阶段开始时,若你的装备栏均已被废除或体力值为1,则你减1点体力上限,将手牌摸至体力上限,失去〖决堰〗并获得〖怀柔〗。", + drlt_huairou: "怀柔", + drlt_huairou_info: "出牌阶段,你可以重铸装备牌。", + drlt_zhenggu: "镇骨", + drlt_zhenggu2: "镇骨", + drlt_zhenggu_info: + "结束阶段,你可以选择一名其他角色,你的回合结束后和该角色的下个回合结束时,其将手牌摸至或弃至X张。(X为你的手牌数且至多为5)", + drlt_zhenrong: "征荣", + drlt_zhenrong_info: + "当你对其他角色造成伤害后,若其手牌比你多,你可以将其一张牌置于你的武将牌上,称为“荣”。", + drlt_hongju: "鸿举", + drlt_hongju_info: + "觉醒技,准备阶段,若“荣”的数量大于或等于3且场上有角色死亡,则你可以用任意张手牌替换等量的“荣”,然后减1点体力上限并获得〖清侧〗。", + drlt_qingce: "清侧", + drlt_qingce_info: "出牌阶段,你可以移去一张“荣”,然后弃置一名角色装备区或判定区内的一张牌。", - zhengrong:'征荣', - hongju:'鸿举', - qingce:'清侧', - qingce_backup:'清侧', - zhengrong_info:'当你使用带有「伤害」标签的基本牌或锦囊牌指定目标后,你可以将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,称为「荣」。', - hongju_info:'觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3,则你触发此技能。你可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。', - qingce_info:'出牌阶段,你可以获得一张「荣」并弃置一张手牌,然后弃置场上的一张牌。', + zhengrong: "征荣", + hongju: "鸿举", + qingce: "清侧", + qingce_backup: "清侧", + zhengrong_info: + "当你使用带有「伤害」标签的基本牌或锦囊牌指定目标后,你可以将一名手牌数不小于你的目标角色的一张牌置于你的武将牌上,称为「荣」。", + hongju_info: + "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3,则你触发此技能。你可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", + qingce_info: "出牌阶段,你可以获得一张「荣」并弃置一张手牌,然后弃置场上的一张牌。", - jianchu:'鞬出', - jianchu_info:'当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌为装备牌,此【杀】不可被【闪】响应,若不为装备牌,该角色获得此【杀】。', - redimeng:'缔盟', - redimeng_info:'出牌阶段限一次,你可以弃置X张牌选择两名其他角色(X为这两名角色的手牌差),你混合他们的手牌,然后令其中一名角色获得其中的一张牌,并令另一名角色获得其中的一张牌,然后重复此流程,直到这些牌均被获得为止。', - reluanji:'乱击', - reluanji_info:'你可以将两张与你本回合以此法转化的花色均不相同的手牌当【万箭齐发】使用,然后当一名角色因响应此牌而打出【闪】时,该角色摸一张牌。若你以此法使用的【万箭齐发】未造成伤害,则你可以在此牌结算完成后摸X张牌。(X为此牌的目标数)', - xintianxiang:'天香', - xintianxiang2:'天香', - xintianxiang3:'天香', - xintianxiang4:'天香', - xintianxiang_bg:'香', - xintianxiang_info:'当你受到伤害时,你可以弃置一张♥牌,将此伤害转移给一名其他角色,然后你选择一项:令该角色摸X张牌(X为其已损失的体力值);或防止其造成与受到的所有伤害,且此技能失效直到你的下回合开始。', - xinshensu:'神速', - xinshensu_info:'你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。', - yinghun:'英魂', - yinghun_info:'准备阶段开始时,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。', - gzyinghun:'英魂', - gzyinghun_info:'准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。', + jianchu: "鞬出", + jianchu_info: + "当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌为装备牌,此【杀】不可被【闪】响应,若不为装备牌,该角色获得此【杀】。", + redimeng: "缔盟", + redimeng_info: + "出牌阶段限一次,你可以弃置X张牌选择两名其他角色(X为这两名角色的手牌差),你混合他们的手牌,然后令其中一名角色获得其中的一张牌,并令另一名角色获得其中的一张牌,然后重复此流程,直到这些牌均被获得为止。", + reluanji: "乱击", + reluanji_info: + "你可以将两张与你本回合以此法转化的花色均不相同的手牌当【万箭齐发】使用,然后当一名角色因响应此牌而打出【闪】时,该角色摸一张牌。若你以此法使用的【万箭齐发】未造成伤害,则你可以在此牌结算完成后摸X张牌。(X为此牌的目标数)", + xintianxiang: "天香", + xintianxiang2: "天香", + xintianxiang3: "天香", + xintianxiang4: "天香", + xintianxiang_bg: "香", + xintianxiang_info: + "当你受到伤害时,你可以弃置一张♥牌,将此伤害转移给一名其他角色,然后你选择一项:令该角色摸X张牌(X为其已损失的体力值);或防止其造成与受到的所有伤害,且此技能失效直到你的下回合开始。", + xinshensu: "神速", + xinshensu_info: + "你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。", + yinghun: "英魂", + yinghun_info: + "准备阶段开始时,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。", + gzyinghun: "英魂", + gzyinghun_info: + "准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。", - tiaoxin:'挑衅', - zhiji:'志继', - zhiji_draw:'摸牌', - zhiji_recover:'回血', - xiangle:'享乐', - fangquan:'放权', - ruoyu:'若愚', - qiaobian:'巧变', - tuntian:'屯田', - tuntian_bg:'田', - zaoxian:'凿险', - jixi:'急袭', - jiang:'激昂', - hunzi:'魂姿', - zhiba:'制霸', - zhiba2:'制霸', - zhijian:'直谏', - guzheng:'固政', - beige:'悲歌', - duanchang:'断肠', + tiaoxin: "挑衅", + zhiji: "志继", + zhiji_draw: "摸牌", + zhiji_recover: "回血", + xiangle: "享乐", + fangquan: "放权", + ruoyu: "若愚", + qiaobian: "巧变", + tuntian: "屯田", + tuntian_bg: "田", + zaoxian: "凿险", + jixi: "急袭", + jiang: "激昂", + hunzi: "魂姿", + zhiba: "制霸", + zhiba2: "制霸", + zhijian: "直谏", + guzheng: "固政", + beige: "悲歌", + duanchang: "断肠", // fushen:'附身', - huashen:'化身', - xinsheng:'新生', - qimou:'奇谋', - xinqiangxi:'强袭', - xinjushou:'据守', - xinjiewei:'解围', - retianxiang:'天香', - retianxiang_info:'当你受到伤害时,你可以弃置一张红桃手牌,防止此次伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。', - xinjiewei_info:'你可以将装备区里的牌当【无懈可击】使用;当你的武将牌从背面翻至正面时,你可以弃置一张牌,然后移动场上的一张牌。', - xinjushou_info:'结束阶段,你可以翻面并摸四张牌,然后弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之。', - jixi_info:'出牌阶段,你可以将任意一张“田”当作【顺手牵羊】使用。', - xinqiangxi_info:'出牌阶段各限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张装备牌并对你攻击范围内的一名其他角色造成1点伤害。', - qimou_info:'限定技,出牌阶段,你可以失去任意点体力,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。', - tiaoxin_info:'出牌阶段限一次,你可以指定一名攻击范围内包含你的角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。', - zhiji_info:'觉醒技,准备阶段,若你没有手牌,你须回复1点体力或摸两张牌,然后减1点体力上限,并获得技能〖观星〗。', - xiangle_info:'锁定技,当其他角色使用【杀】指定你为目标时,其需弃置一张基本牌,否则此【杀】对你无效。', - fangquan_info:'你可跳过你的出牌阶段,若如此做,回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。', - ruoyu_info:'主公技,觉醒技,准备阶段,若你的体力是全场最少的(或之一),你须增加1点体力上限并回复1点体力,然后获得技能〖激将〗。', - qiaobian_info:'你可以弃置一张手牌并跳过自己的一个阶段(准备阶段和结束阶段除外)。若你以此法跳过了摸牌阶段,则你可以获得至多两名其他角色的各一张手牌;若你以此法跳过了出牌阶段,则你可以移动场上的一张牌。', - tuntian_info:'①当你于回合外失去牌后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。', - zaoxian_info:'觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。', - jiang_info:'每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。', - hunzi_info:'觉醒技,准备阶段,若你的体力值为1,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。', - zhiba_info:'主公技,其他吴势力角色的出牌阶段限一次,其可与你进行一次拼点。若该角色没赢,你可以获得双方拼点的牌。若你已发动过〖魂姿〗,你可以拒绝此拼点。', - zhijian_info:'出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。', - guzheng_info:'其他角色的弃牌阶段结束时,你可以令其获得本阶段内进入弃牌堆的牌中的一张,然后你获得其余的牌。', - beige_info:'当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复1点体力;♦︎该角色摸两张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。', - duanchang_info:'锁定技,杀死你的角色失去当前的所有技能。', + huashen: "化身", + xinsheng: "新生", + qimou: "奇谋", + xinqiangxi: "强袭", + xinjushou: "据守", + xinjiewei: "解围", + retianxiang: "天香", + retianxiang_info: + "当你受到伤害时,你可以弃置一张红桃手牌,防止此次伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。", + xinjiewei_info: + "你可以将装备区里的牌当【无懈可击】使用;当你的武将牌从背面翻至正面时,你可以弃置一张牌,然后移动场上的一张牌。", + xinjushou_info: + "结束阶段,你可以翻面并摸四张牌,然后弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之。", + jixi_info: "出牌阶段,你可以将任意一张“田”当作【顺手牵羊】使用。", + xinqiangxi_info: + "出牌阶段各限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张装备牌并对你攻击范围内的一名其他角色造成1点伤害。", + qimou_info: + "限定技,出牌阶段,你可以失去任意点体力,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。", + tiaoxin_info: + "出牌阶段限一次,你可以指定一名攻击范围内包含你的角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。", + zhiji_info: + "觉醒技,准备阶段,若你没有手牌,你须回复1点体力或摸两张牌,然后减1点体力上限,并获得技能〖观星〗。", + xiangle_info: + "锁定技,当其他角色使用【杀】指定你为目标时,其需弃置一张基本牌,否则此【杀】对你无效。", + fangquan_info: + "你可跳过你的出牌阶段,若如此做,回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。", + ruoyu_info: + "主公技,觉醒技,准备阶段,若你的体力是全场最少的(或之一),你须增加1点体力上限并回复1点体力,然后获得技能〖激将〗。", + qiaobian_info: + "你可以弃置一张手牌并跳过自己的一个阶段(准备阶段和结束阶段除外)。若你以此法跳过了摸牌阶段,则你可以获得至多两名其他角色的各一张手牌;若你以此法跳过了出牌阶段,则你可以移动场上的一张牌。", + tuntian_info: + "①当你于回合外失去牌后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。", + zaoxian_info: + "觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。", + jiang_info: + "每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。", + hunzi_info: "觉醒技,准备阶段,若你的体力值为1,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。", + zhiba_info: + "主公技,其他吴势力角色的出牌阶段限一次,其可与你进行一次拼点。若该角色没赢,你可以获得双方拼点的牌。若你已发动过〖魂姿〗,你可以拒绝此拼点。", + zhijian_info: + "出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。", + guzheng_info: + "其他角色的弃牌阶段结束时,你可以令其获得本阶段内进入弃牌堆的牌中的一张,然后你获得其余的牌。", + beige_info: + "当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复1点体力;♦︎该角色摸两张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。", + duanchang_info: "锁定技,杀死你的角色失去当前的所有技能。", // fushen_info:'回合开始前,你可以选择与任意一名角色交换控制权,该角色可选择在下一个回合开始前与你换回。', - huashen_info:'①游戏开始时,你随机将武将牌堆中的两张牌扣置于武将牌上(均称为“化身牌”),选择并亮出一张“化身牌”并声明该武将牌上的一个技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。②回合开始时或回合结束时,你重新可以选择一张“化身牌”并声明该武将牌上的一个技能。', - xinsheng_info:'当你受到1点伤害后,你可以获得一张“化身牌”。', - jiangwei:'姜维', - liushan:'刘禅', - zhanghe:'张郃', - dengai:'邓艾', - sunce:'孙策', - zhangzhang:'张昭张纮', - caiwenji:'蔡琰', - zuoci:'左慈', + huashen_info: + "①游戏开始时,你随机将武将牌堆中的两张牌扣置于武将牌上(均称为“化身牌”),选择并亮出一张“化身牌”并声明该武将牌上的一个技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。②回合开始时或回合结束时,你重新可以选择一张“化身牌”并声明该武将牌上的一个技能。", + xinsheng_info: "当你受到1点伤害后,你可以获得一张“化身牌”。", + jiangwei: "姜维", + liushan: "刘禅", + zhanghe: "张郃", + dengai: "邓艾", + sunce: "孙策", + zhangzhang: "张昭张纮", + caiwenji: "蔡琰", + zuoci: "左慈", - zhurong:'祝融', - menghuo:'孟获', - caopi:'曹丕', - re_xuhuang:'徐晃', - lusu:'旧鲁肃', - lusu_prefix:'旧', - sunjian:'孙坚', - dongzhuo:'董卓', - jiaxu:'贾诩', - huoshou:'祸首', - huoshou1:'祸首', - huoshou2:'祸首', - zaiqi:'再起', - zaiqixx:'再起', - juxiang:'巨象', - juxiang1:'巨象', - juxiang2:'巨象', - lieren:'烈刃', - xingshang:'行殇', - fangzhu:'放逐', - songwei:'颂威', - songwei2:'颂威', - duanliang:'断粮', - duanliang1:'断粮', - haoshi:'好施', - dimeng:'缔盟', - jiuchi:'酒池', - roulin:'肉林', - benghuai:'崩坏', - baonue:'暴虐', - baonue2:'暴虐', - baonue_hp:'体力', - baonue_maxHp:'体力上限', - luanwu:'乱武', - wansha:'完杀', - weimu:'帷幕', - jiezi:'截辎', - jiezi_info:'锁定技,其他角色跳过摸牌阶段后,你摸一张牌。', - huoshou_info:'锁定技,【南蛮入侵】对你无效;你视为所有【南蛮入侵】的伤害来源。', - zaiqi_info:'摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。', - zaiqixx_info:'摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值+1),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。', - juxiang_info:'锁定技。①【南蛮入侵】对你无效。②其他角色使用的【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。', - lieren_info:'当你使用【杀】造成伤害后,可与受到该伤害的角色进行拼点;若你赢,你获得对方的一张牌。', - xingshang_info:'当有角色死亡后,你可以获得该角色的所有牌。', - fangzhu_info:'当你受到伤害后,你可令一名其他角色摸X张牌(X为你已损失的体力值),然后该角色将武将牌翻面。', - songwei_info:'主公技,其他魏势力的角色的判定牌结果为黑色且生效后,其可以令你摸一张牌。', - duanliang_info:'你可以将一张黑色基本牌或装备牌当做【兵粮寸断】使用;若一名角色的手牌数大于或等于你的手牌数,则你对其使用【兵粮寸断】没有距离限制。', - haoshi_info:'摸牌阶段,你可以额外摸两张牌。若此时你的手牌数多于五张,你须将一半(向下取整)的手牌交给场上除你外手牌数最少的一名角色。', - dimeng_info:'出牌阶段限一次,你可以选择其他两名角色,你弃置等同于这两名角色手牌数量之差的牌,然后交换他们的手牌。', - yinghun_old_info:'准备阶段,若你已受伤,则你可以令一名其他角色执行下列两项中的一项: 1.摸X张牌,然后弃一张牌。 2.摸一张牌,然后弃X张牌。 (X为你已损失的体力值)', - jiuchi_info:'你可以将一张♠手牌当作【酒】使用。', - roulin_info:'锁定技。你对女性角色、女性角色对你使用【杀】时,都需连续使用两张【闪】才能抵消。', - benghuai_info:'锁定技。结束阶段,若你的体力不为全场最少,你失去1点体力或减1点体力上限。', - baonue_info:'主公技,其他群雄角色造成伤害后,可进行一次判定,若为♠,你回复1点体力。', - luanwu_info:'限定技,出牌阶段,你可令除你外的所有角色依次对与其距离最近的另一名角色使用一张【杀】,否则失去1点体力。', - wansha_info:'锁定技,你的回合内,除你以外,不处于濒死状态的角色不能使用【桃】。', - weimu_info:'锁定技,你不能成为黑色锦囊牌的目标。', + zhurong: "祝融", + menghuo: "孟获", + caopi: "曹丕", + re_xuhuang: "徐晃", + lusu: "旧鲁肃", + lusu_prefix: "旧", + sunjian: "孙坚", + dongzhuo: "董卓", + jiaxu: "贾诩", + huoshou: "祸首", + huoshou1: "祸首", + huoshou2: "祸首", + zaiqi: "再起", + zaiqixx: "再起", + juxiang: "巨象", + juxiang1: "巨象", + juxiang2: "巨象", + lieren: "烈刃", + xingshang: "行殇", + fangzhu: "放逐", + songwei: "颂威", + songwei2: "颂威", + duanliang: "断粮", + duanliang1: "断粮", + haoshi: "好施", + dimeng: "缔盟", + jiuchi: "酒池", + roulin: "肉林", + benghuai: "崩坏", + baonue: "暴虐", + baonue2: "暴虐", + baonue_hp: "体力", + baonue_maxHp: "体力上限", + luanwu: "乱武", + wansha: "完杀", + weimu: "帷幕", + jiezi: "截辎", + jiezi_info: "锁定技,其他角色跳过摸牌阶段后,你摸一张牌。", + huoshou_info: "锁定技,【南蛮入侵】对你无效;你视为所有【南蛮入侵】的伤害来源。", + zaiqi_info: + "摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。", + zaiqixx_info: + "摸牌阶段,若你已受伤,则你可以改为亮出牌堆顶的X张牌(X为你已损失的体力值+1),并回复X点体力(X为其中♥牌的数目)。然后你将这些♥牌置入弃牌堆,并获得其余的牌。", + juxiang_info: + "锁定技。①【南蛮入侵】对你无效。②其他角色使用的【南蛮入侵】结算结束后,你获得此牌对应的所有实体牌。", + lieren_info: + "当你使用【杀】造成伤害后,可与受到该伤害的角色进行拼点;若你赢,你获得对方的一张牌。", + xingshang_info: "当有角色死亡后,你可以获得该角色的所有牌。", + fangzhu_info: + "当你受到伤害后,你可令一名其他角色摸X张牌(X为你已损失的体力值),然后该角色将武将牌翻面。", + songwei_info: "主公技,其他魏势力的角色的判定牌结果为黑色且生效后,其可以令你摸一张牌。", + duanliang_info: + "你可以将一张黑色基本牌或装备牌当做【兵粮寸断】使用;若一名角色的手牌数大于或等于你的手牌数,则你对其使用【兵粮寸断】没有距离限制。", + haoshi_info: + "摸牌阶段,你可以额外摸两张牌。若此时你的手牌数多于五张,你须将一半(向下取整)的手牌交给场上除你外手牌数最少的一名角色。", + dimeng_info: + "出牌阶段限一次,你可以选择其他两名角色,你弃置等同于这两名角色手牌数量之差的牌,然后交换他们的手牌。", + yinghun_old_info: + "准备阶段,若你已受伤,则你可以令一名其他角色执行下列两项中的一项: 1.摸X张牌,然后弃一张牌。 2.摸一张牌,然后弃X张牌。 (X为你已损失的体力值)", + jiuchi_info: "你可以将一张♠手牌当作【酒】使用。", + roulin_info: "锁定技。你对女性角色、女性角色对你使用【杀】时,都需连续使用两张【闪】才能抵消。", + benghuai_info: "锁定技。结束阶段,若你的体力不为全场最少,你失去1点体力或减1点体力上限。", + baonue_info: "主公技,其他群雄角色造成伤害后,可进行一次判定,若为♠,你回复1点体力。", + luanwu_info: + "限定技,出牌阶段,你可令除你外的所有角色依次对与其距离最近的另一名角色使用一张【杀】,否则失去1点体力。", + wansha_info: "锁定技,你的回合内,除你以外,不处于濒死状态的角色不能使用【桃】。", + weimu_info: "锁定技,你不能成为黑色锦囊牌的目标。", - sp_zhugeliang:'卧龙', - pangtong:'庞统', - xunyu:'荀彧', - dianwei:'典韦', - taishici:'太史慈', - yanwen:'颜良文丑', - yuanshao:'旧袁绍', - yuanshao_prefix:'旧', - re_pangde:'庞德', - huoji:'火计', - bazhen:'八阵', - kanpo:'看破', - niepan:'涅槃', - oldniepan:'涅槃', - quhu:'驱虎', - jieming:'节命', - qiangxix:'强袭', - qiangxi:'强袭', - tianyi:'天义', - shuangxiong:'双雄', - shuangxiong1:'双雄', - shuangxiong2:'双雄', - luanji:'乱击', - xueyi:'血裔', - mengjin:'猛进', - huoji_info:'你可以将一张红色手牌当作【火攻】使用。', - bazhen_info:'锁定技,若你的防具栏内没有牌且没有被废除,则你视为装备着【八卦阵】。', - kanpo_info:'你可以将你的任意一张黑色手牌当做【无懈可击】使用。', - niepan_info:'限定技,出牌阶段或当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。', - oldniepan_info:'限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。', - quhu_info:'出牌阶段限一次,你可以与一名体力值大于你的角色拼点,若你赢,则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢,该角色对你造成1点伤害。', - jieming_info:'当你受到1点伤害后,你可令一名角色将手牌摸至X张(X为其体力上限且至多为5)。', - qiangxi_info:'出牌阶段限一次,你可以失去1点体力或弃置一张武器牌,然后对你攻击范围内的一名其他角色造成1点伤害。', - qiangxix_info:'出牌阶段限两次,你可以失去1点体力或弃置一张武器牌,然后对一名本阶段内未成为过〖强袭〗的目标的其他角色造成1点伤害。', - tianyi_info:'出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你获得以下技能效果直到回合结束:你使用【杀】没有距离限制;可额外使用一张【杀】;使用【杀】时可额外指定一个目标。若你没赢,你不能使用【杀】直到回合结束。', - shuangxiong_info:'摸牌阶段,你可以改为进行一次判定:你获得此判定牌,且你可以于此回合内将任意一张与此判定牌不同颜色的手牌当做【决斗】使用。', - luanji_info:'出牌阶段,你可以将任意两张相同花色的手牌当做【万箭齐发】使用。', - xueyi_info:'主公技,锁定技,场上每有一名其他群雄角色存活,你的手牌上限便+2。', - mengjin_info:'当你使用的【杀】被【闪】抵消时,你可以弃置目标角色的一张牌。', + sp_zhugeliang: "卧龙", + pangtong: "庞统", + xunyu: "荀彧", + dianwei: "典韦", + taishici: "太史慈", + yanwen: "颜良文丑", + yuanshao: "旧袁绍", + yuanshao_prefix: "旧", + re_pangde: "庞德", + huoji: "火计", + bazhen: "八阵", + kanpo: "看破", + niepan: "涅槃", + oldniepan: "涅槃", + quhu: "驱虎", + jieming: "节命", + qiangxix: "强袭", + qiangxi: "强袭", + tianyi: "天义", + shuangxiong: "双雄", + shuangxiong1: "双雄", + shuangxiong2: "双雄", + luanji: "乱击", + xueyi: "血裔", + mengjin: "猛进", + huoji_info: "你可以将一张红色手牌当作【火攻】使用。", + bazhen_info: "锁定技,若你的防具栏内没有牌且没有被废除,则你视为装备着【八卦阵】。", + kanpo_info: "你可以将你的任意一张黑色手牌当做【无懈可击】使用。", + niepan_info: + "限定技,出牌阶段或当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。", + oldniepan_info: + "限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。", + quhu_info: + "出牌阶段限一次,你可以与一名体力值大于你的角色拼点,若你赢,则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢,该角色对你造成1点伤害。", + jieming_info: "当你受到1点伤害后,你可令一名角色将手牌摸至X张(X为其体力上限且至多为5)。", + qiangxi_info: + "出牌阶段限一次,你可以失去1点体力或弃置一张武器牌,然后对你攻击范围内的一名其他角色造成1点伤害。", + qiangxix_info: + "出牌阶段限两次,你可以失去1点体力或弃置一张武器牌,然后对一名本阶段内未成为过〖强袭〗的目标的其他角色造成1点伤害。", + tianyi_info: + "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你获得以下技能效果直到回合结束:你使用【杀】没有距离限制;可额外使用一张【杀】;使用【杀】时可额外指定一个目标。若你没赢,你不能使用【杀】直到回合结束。", + shuangxiong_info: + "摸牌阶段,你可以改为进行一次判定:你获得此判定牌,且你可以于此回合内将任意一张与此判定牌不同颜色的手牌当做【决斗】使用。", + luanji_info: "出牌阶段,你可以将任意两张相同花色的手牌当做【万箭齐发】使用。", + xueyi_info: "主公技,锁定技,场上每有一名其他群雄角色存活,你的手牌上限便+2。", + mengjin_info: "当你使用的【杀】被【闪】抵消时,你可以弃置目标角色的一张牌。", - re_xiahouyuan:'夏侯渊', - re_huangzhong:'黄忠', - re_weiyan:'魏延', + re_xiahouyuan: "夏侯渊", + re_huangzhong: "黄忠", + re_weiyan: "魏延", - gz_xiahouyuan:'夏侯渊', - gz_huangzhong:'黄忠', - gz_weiyan:'魏延', - gz_xuhuang:'徐晃', - gz_pangde:'庞德', - gz_caoren:'曹仁', - gz_zhoutai:'周泰', + gz_xiahouyuan: "夏侯渊", + gz_huangzhong: "黄忠", + gz_weiyan: "魏延", + gz_xuhuang: "徐晃", + gz_pangde: "庞德", + gz_caoren: "曹仁", + gz_zhoutai: "周泰", - old_zhoutai:'周泰', - old_caoren:'曹仁', - xuhuang:'旧徐晃', - xuhuang_prefix:'旧', - pangde:'旧庞德', - pangde_prefix:'旧', - xiahouyuan:'旧夏侯渊', - xiahouyuan_prefix:'旧', - huangzhong:'旧黄忠', - huangzhong_prefix:'旧', - sp_zhangjiao:'张角', - weiyan:'旧魏延', - weiyan_prefix:'旧', - xiaoqiao:'小乔', - zhangjiao:'旧张角', - zhangjiao_prefix:'旧', + old_zhoutai: "周泰", + old_caoren: "曹仁", + xuhuang: "旧徐晃", + xuhuang_prefix: "旧", + pangde: "旧庞德", + pangde_prefix: "旧", + xiahouyuan: "旧夏侯渊", + xiahouyuan_prefix: "旧", + huangzhong: "旧黄忠", + huangzhong_prefix: "旧", + sp_zhangjiao: "张角", + weiyan: "旧魏延", + weiyan_prefix: "旧", + xiaoqiao: "小乔", + zhangjiao: "旧张角", + zhangjiao_prefix: "旧", //yuji:'于吉', - shensu:'神速', - shensu1:'神速', - shensu2:'神速', - shensu4:'神速', - jushou:'据守', - moon_jushou:'据守', - liegong:'烈弓', - kuanggu:'狂骨', - tianxiang:'天香', - hongyan:'红颜', - buqu:'不屈', - buqu_bg:'创', - leiji:'雷击', - guidao:'鬼道', - huangtian:'黄天', - huangtian2:'黄天', - guhuo:'蛊惑', - fenji:'奋激', - releiji:'雷击', - jiewei:'解围', - tiangong:'天公', - tiangong2:'天公', - xinliegong:'烈弓', - xinkuanggu:'狂骨', - gzbuqu:'不屈', - gzbuqu_info:'①当你扣减1点体力时,若你的体力值小于1,你可以将牌堆顶的一张牌置于你的武将牌上,称为“创”。②当你回复1点体力时,你移去一张“创”。③若你有“创”且点数均不相同,则你不结算濒死流程。', - xinkuanggu_info:'当你造成1点伤害后,若受伤角色受到此伤害时你与其的距离不大于1,则你可以回复1点体力或摸一张牌。', - xinliegong_info:'①你使用【杀】可以选择你距离不大于此【杀】点数的角色为目标。②当你使用【杀】指定一个目标后,你可以根据下列条件执行相应的效果:1.其手牌数小于等于你的手牌数,此【杀】不可被响应,2.其体力值大于等于你的体力值,此【杀】伤害+1。', - jiewei_info:'当你的武将牌翻面后,你可以摸一张牌。然后你可以使用一张锦囊牌或装备牌,并可以在此牌结算后弃置场上一张同类型的牌。', - releiji_info:'当你使用或打出一张【闪】时,你可令一名其他角色进行一次判定:若结果为梅花,你回复1点体力,并对其造成1点雷电伤害;若结果为黑桃,你对其造成2点雷电伤害。', - tiangong_info:'锁定技,你防止即将受到的雷电伤害。每当你造成雷电伤害时,你摸一张牌。', - shensu_info:'你可以跳过判定阶段和摸牌阶段,或跳过出牌阶段并弃置一张装备牌。若如此做,则你可以视为对任意一名角色使用一张无距离限制的【杀】。', - jushou_info:'结束阶段,你可以摸三张牌并翻面。', - moon_jushou_info:'结束阶段,你可以摸一张牌并翻面。', - liegong_info:'当你使用【杀】时,若目标的手牌数大于等于你的体力值,或小于等于你的攻击范围,你可令此【杀】不能被响应。', - kuanggu_info:'锁定技,当你造成伤害后,若受伤角色受到此伤害时你与其的距离不大于1,你回复X点体力(X为伤害值)。', - tianxiang_info:'当你即将受到伤害时,你可以弃置一张♥手牌,将伤害转移给一名其他角色,然后该角色摸X张牌(X为其已损失的体力值)。', - hongyan_info:'锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。', - buqu_info:'锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。只要你的武将牌上有“创”,你的手牌上限便与“创”的数量相等。', - buqu_info_guozhan:'锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。', - leiji_info:'当你使用或打出一张【闪】时,你可令任意一名角色进行一次判定。若结果为黑桃,其受到2点雷电伤害。', - guidao_info:'一名角色的判定牌生效前,你可以打出一张黑色牌替换之。', - huangtian_info:'主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张【闪】或【闪电】。', - guhuo_info:'每名角色的回合限一次,你可以扣置一张手牌当一张基本牌或普通锦囊牌使用或打出。其他角色依次选择是否质疑。一旦有其他角色质疑则翻开此牌:若为假则此牌作废,若为真,则质疑角色获得技能“缠怨”(锁定技,你不能质疑于吉,只要你的体力值为1,你失去你的武将技能)。', - fenji_info:'当一名角色的手牌不因赠予或交给而被另一名角色得到后,或一名角色的手牌被另一名角色弃置后,你可以失去1点体力,令其摸两张牌。', + shensu: "神速", + shensu1: "神速", + shensu2: "神速", + shensu4: "神速", + jushou: "据守", + moon_jushou: "据守", + liegong: "烈弓", + kuanggu: "狂骨", + tianxiang: "天香", + hongyan: "红颜", + buqu: "不屈", + buqu_bg: "创", + leiji: "雷击", + guidao: "鬼道", + huangtian: "黄天", + huangtian2: "黄天", + guhuo: "蛊惑", + fenji: "奋激", + releiji: "雷击", + jiewei: "解围", + tiangong: "天公", + tiangong2: "天公", + xinliegong: "烈弓", + xinkuanggu: "狂骨", + gzbuqu: "不屈", + gzbuqu_info: + "①当你扣减1点体力时,若你的体力值小于1,你可以将牌堆顶的一张牌置于你的武将牌上,称为“创”。②当你回复1点体力时,你移去一张“创”。③若你有“创”且点数均不相同,则你不结算濒死流程。", + xinkuanggu_info: + "当你造成1点伤害后,若受伤角色受到此伤害时你与其的距离不大于1,则你可以回复1点体力或摸一张牌。", + xinliegong_info: + "①你使用【杀】可以选择你距离不大于此【杀】点数的角色为目标。②当你使用【杀】指定一个目标后,你可以根据下列条件执行相应的效果:1.其手牌数小于等于你的手牌数,此【杀】不可被响应,2.其体力值大于等于你的体力值,此【杀】伤害+1。", + jiewei_info: + "当你的武将牌翻面后,你可以摸一张牌。然后你可以使用一张锦囊牌或装备牌,并可以在此牌结算后弃置场上一张同类型的牌。", + releiji_info: + "当你使用或打出一张【闪】时,你可令一名其他角色进行一次判定:若结果为梅花,你回复1点体力,并对其造成1点雷电伤害;若结果为黑桃,你对其造成2点雷电伤害。", + tiangong_info: "锁定技,你防止即将受到的雷电伤害。每当你造成雷电伤害时,你摸一张牌。", + shensu_info: + "你可以跳过判定阶段和摸牌阶段,或跳过出牌阶段并弃置一张装备牌。若如此做,则你可以视为对任意一名角色使用一张无距离限制的【杀】。", + jushou_info: "结束阶段,你可以摸三张牌并翻面。", + moon_jushou_info: "结束阶段,你可以摸一张牌并翻面。", + liegong_info: + "当你使用【杀】时,若目标的手牌数大于等于你的体力值,或小于等于你的攻击范围,你可令此【杀】不能被响应。", + kuanggu_info: + "锁定技,当你造成伤害后,若受伤角色受到此伤害时你与其的距离不大于1,你回复X点体力(X为伤害值)。", + tianxiang_info: + "当你即将受到伤害时,你可以弃置一张♥手牌,将伤害转移给一名其他角色,然后该角色摸X张牌(X为其已损失的体力值)。", + hongyan_info: "锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。", + buqu_info: + "锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。只要你的武将牌上有“创”,你的手牌上限便与“创”的数量相等。", + buqu_info_guozhan: + "锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。", + leiji_info: + "当你使用或打出一张【闪】时,你可令任意一名角色进行一次判定。若结果为黑桃,其受到2点雷电伤害。", + guidao_info: "一名角色的判定牌生效前,你可以打出一张黑色牌替换之。", + huangtian_info: "主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张【闪】或【闪电】。", + guhuo_info: + "每名角色的回合限一次,你可以扣置一张手牌当一张基本牌或普通锦囊牌使用或打出。其他角色依次选择是否质疑。一旦有其他角色质疑则翻开此牌:若为假则此牌作废,若为真,则质疑角色获得技能“缠怨”(锁定技,你不能质疑于吉,只要你的体力值为1,你失去你的武将技能)。", + fenji_info: + "当一名角色的手牌不因赠予或交给而被另一名角色得到后,或一名角色的手牌被另一名角色弃置后,你可以失去1点体力,令其摸两张牌。", - new_fenji:"奋激", - new_fenji_info:"一名角色的结束阶段开始时,若其没有手牌,你可以令其摸两张牌,然后你失去1点体力。", - gzduanliang:'断粮', - gzduanliang_info:'你可以将一张黑色基本牌或黑色装备牌当【兵粮寸断】使用;你可以对距离为2的角色使用【兵粮寸断】。', - xinfu_guhuo:"蛊惑", - xinfu_guhuo_info:"每回合限一次。你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,其他角色依次选择是否质疑。当有角色质疑时,你终止质疑流程并展示此牌:若为假,此牌作废;若为真,该角色获得〖缠怨〗。", - guhuo_guess:"蛊惑", - guhuo_guess_info:"", - chanyuan:"缠怨", - chanyuan_info:"锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。", - "guhuo_respond":"蛊惑", - "guhuo_respond_info":"", - "guhuo_wuxie":"蛊惑", - "guhuo_wuxie_info":"", - "guhuo_phase":"蛊惑", - "guhuo_phase_info":"", - xinhongyan:'红颜', - xinhongyan_info:'锁定技,你的♠牌和♠判定牌的花色视为♥。一名角色的判定结果生效前,若判定结果为♥,则你将其改为一种花色。', - olliangyin:'良姻', - olliangyin_info:'当有牌发生移动后,若此移动事件是本回合内你拥有〖良姻〗期间的首个有牌移出游戏/移入游戏的事件,则你可以选择一名其他角色。你与其各摸一张牌/弃置一张牌,然后你可以选择你或其中的一名手牌数为X的角色,该角色回复1点体力(X为你的“箜”数)。', - olkongsheng:'箜声', - olkongsheng_info:'①准备阶段开始时,你可以将任意张牌置于你的武将牌上,称为“箜”。②结束阶段开始时,若你有不为装备牌的“箜”,则你获得“箜”中的非装备牌,然后令一名角色依次使用“箜”中的装备牌并失去1点体力。', - dcwanglie:"往烈", - dcwanglie_info:"①出牌阶段,你对其他角色使用的前两张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能使用牌指定其他角色为目标。", - nzry_shicai:"恃才", - nzry_shicai_info:"当你使用非装备牌结算结束后,或成为自己使用装备牌的目标后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", - lianhuan:'连环', - lianhuan_info:'你可以将♣手牌当作【铁索连环】使用或重铸。', + new_fenji: "奋激", + new_fenji_info: "一名角色的结束阶段开始时,若其没有手牌,你可以令其摸两张牌,然后你失去1点体力。", + gzduanliang: "断粮", + gzduanliang_info: + "你可以将一张黑色基本牌或黑色装备牌当【兵粮寸断】使用;你可以对距离为2的角色使用【兵粮寸断】。", + xinfu_guhuo: "蛊惑", + xinfu_guhuo_info: + "每回合限一次。你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,其他角色依次选择是否质疑。当有角色质疑时,你终止质疑流程并展示此牌:若为假,此牌作废;若为真,该角色获得〖缠怨〗。", + guhuo_guess: "蛊惑", + guhuo_guess_info: "", + chanyuan: "缠怨", + chanyuan_info: + "锁定技。你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值为1时,你的其他技能失效。", + guhuo_respond: "蛊惑", + guhuo_respond_info: "", + guhuo_wuxie: "蛊惑", + guhuo_wuxie_info: "", + guhuo_phase: "蛊惑", + guhuo_phase_info: "", + xinhongyan: "红颜", + xinhongyan_info: + "锁定技,你的♠牌和♠判定牌的花色视为♥。一名角色的判定结果生效前,若判定结果为♥,则你将其改为一种花色。", + olliangyin: "良姻", + olliangyin_info: + "当有牌发生移动后,若此移动事件是本回合内你拥有〖良姻〗期间的首个有牌移出游戏/移入游戏的事件,则你可以选择一名其他角色。你与其各摸一张牌/弃置一张牌,然后你可以选择你或其中的一名手牌数为X的角色,该角色回复1点体力(X为你的“箜”数)。", + olkongsheng: "箜声", + olkongsheng_info: + "①准备阶段开始时,你可以将任意张牌置于你的武将牌上,称为“箜”。②结束阶段开始时,若你有不为装备牌的“箜”,则你获得“箜”中的非装备牌,然后令一名角色依次使用“箜”中的装备牌并失去1点体力。", + dcwanglie: "往烈", + dcwanglie_info: + "①出牌阶段,你对其他角色使用的前两张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能使用牌指定其他角色为目标。", + nzry_shicai: "恃才", + nzry_shicai_info: + "当你使用非装备牌结算结束后,或成为自己使用装备牌的目标后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", + lianhuan: "连环", + lianhuan_info: "你可以将♣手牌当作【铁索连环】使用或重铸。", - shenhua_feng:'神话再临·风', - shenhua_huo:'神话再临·火', - shenhua_lin:'神话再临·林', - shenhua_shan:'神话再临·山', - shenhua_yin:'神话再临·阴', - shenhua_lei:'神话再临·雷', + shenhua_feng: "神话再临·风", + shenhua_huo: "神话再临·火", + shenhua_lin: "神话再临·林", + shenhua_shan: "神话再临·山", + shenhua_yin: "神话再临·阴", + shenhua_lei: "神话再临·雷", }, }; }); diff --git a/character/shiji.js b/character/shiji.js index ad582ec47..dce453bad 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -1,251 +1,357 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'shiji', - connect:true, - characterSort:{ - shiji:{ - mobile_shijizhi:["sp_wangcan","sp_chenzhen","sp_sunshao","sp_xunchen","luotong","sp_duyu","sp_bianfuren","feiyi"], - mobile_shijixin:['wujing','sp_mifuren','sp_xinpi','wangling','wangfuzhaolei','zhouchu','sp_kongrong','sp_yanghu'], - mobile_shijiren:['caizhenji','xiangchong','sp_huaxin','sp_xujing','zhangzhongjing','sp_zhangwen','liuzhang','qiaogong'], - mobile_shijiyong:['db_wenyang','sp_chendong','yuanhuan','sp_zongyu','sp_wangshuang','sunyi','sp_gaolan','sp_huaman'], - mobile_shijiyan:['sp_cuiyan','sp_zhangchangpu','sp_jiangwan','sp_jiangqing','sp_lvfan','sp_huangfusong','sp_zhujun','liuba'], + name: "shiji", + connect: true, + characterSort: { + shiji: { + mobile_shijizhi: [ + "sp_wangcan", + "sp_chenzhen", + "sp_sunshao", + "sp_xunchen", + "luotong", + "sp_duyu", + "sp_bianfuren", + "feiyi", + ], + mobile_shijixin: [ + "wujing", + "sp_mifuren", + "sp_xinpi", + "wangling", + "wangfuzhaolei", + "zhouchu", + "sp_kongrong", + "sp_yanghu", + ], + mobile_shijiren: [ + "caizhenji", + "xiangchong", + "sp_huaxin", + "sp_xujing", + "zhangzhongjing", + "sp_zhangwen", + "liuzhang", + "qiaogong", + ], + mobile_shijiyong: [ + "db_wenyang", + "sp_chendong", + "yuanhuan", + "sp_zongyu", + "sp_wangshuang", + "sunyi", + "sp_gaolan", + "sp_huaman", + ], + mobile_shijiyan: [ + "sp_cuiyan", + "sp_zhangchangpu", + "sp_jiangwan", + "sp_jiangqing", + "sp_lvfan", + "sp_huangfusong", + "sp_zhujun", + "liuba", + ], }, }, - character:{ - liuba:['male','shu',3,['duanbi','tongduo']], - sp_zhujun:['male','qun',4,['xinyangjie','xinjuxiang','houfeng']], - sp_huangfusong:['male','qun',4,['spzhengjun','spshiji','sptaoluan']], - sp_lvfan:['male','wu',3,['mbdiaodu','mbdiancai','spyanji']], - sp_jiangqing:['male','wu',4,['spjianyi','spshangyi']], - sp_jiangwan:['male','shu',3,['spzhenting','spjincui']], - sp_zhangchangpu:['female','wei',3,['spdifei','spyanjiao']], - sp_cuiyan:['male','wei',3,['spyajun','spzundi']], - sp_huaman:['female','shu',4,['spxiangzhen','spfangzong','spxizhan']], - sp_gaolan:['male','qun',4,['spjungong','spdengli']], - sunyi:['male','wu',4,['zaoli']], - sp_wangshuang:['male','wei',4,['yiyong','shanxie']], - sp_zongyu:['male','shu',3,['zhibian','yuyan']], - yuanhuan:['male','wei',3,['qingjue','fengjie']], - sp_chendong:['male','wu',4,['spyilie','spfenming']], - db_wenyang:['male','wei',4,['dbquedi','dbzhuifeng','dbchongjian','dbchoujue'],['doublegroup:wei:wu']], - sp_yanghu:['male','qun',3,['mingfa','rongbei']], - qiaogong:['male','wu',3,['yizhu','luanchou']], - liuzhang:['male','qun',3,['jutu','yaohu','rehuaibi'],['zhu']], - sp_zhangwen:['male','wu',3,['gebo','spsongshu']], - zhangzhongjing:['male','qun',3,['jishi','xinliaoyi','binglun']], - sp_xujing:['male','shu',3,['boming','ejian']], - sp_huaxin:['male','wei',3,['yuanqing','shuchen']], - xiangchong:['male','shu',4,['guying','muzhen']], - caizhenji:['female','wei',3,['sheyi','tianyin']], - sp_kongrong:['male','qun',3,['xinlirang','xinmingshi']], - zhouchu:['male','wu',4,['xianghai','rechuhai']], - wangfuzhaolei:['male','shu',4,['xunyi']], - wangling:['male','wei',4,['xingqi','xinzifu','mibei'],['clan:太原王氏']], - wujing:['male','wu',4,['heji','liubing']], - sp_mifuren:['female','shu',3,['xinguixiu','qingyu']], - sp_xinpi:['male','wei',3,['spyinju','spchijie']], - feiyi:['male','shu',3,['mjshengxi','fyjianyu']], - sp_bianfuren:['female','wei',3,['spwanwei','spyuejian']], - sp_duyu:['male','qun',4,['spwuku','spsanchen']], - luotong:['male','wu',4,['qinzheng']], - sp_wangcan:['male','wei',3,['spqiai','spshanxi']], - sp_chenzhen:['male','shu',3,['shameng']], - sp_sunshao:['male','wu',3,['mjdingyi','mjzuici','mjfubi']], - sp_xunchen:['male','qun',3,['mjweipo','mjchenshi','mjmouzhi'],['clan:颍川荀氏']], + character: { + liuba: ["male", "shu", 3, ["duanbi", "tongduo"]], + sp_zhujun: ["male", "qun", 4, ["xinyangjie", "xinjuxiang", "houfeng"]], + sp_huangfusong: ["male", "qun", 4, ["spzhengjun", "spshiji", "sptaoluan"]], + sp_lvfan: ["male", "wu", 3, ["mbdiaodu", "mbdiancai", "spyanji"]], + sp_jiangqing: ["male", "wu", 4, ["spjianyi", "spshangyi"]], + sp_jiangwan: ["male", "shu", 3, ["spzhenting", "spjincui"]], + sp_zhangchangpu: ["female", "wei", 3, ["spdifei", "spyanjiao"]], + sp_cuiyan: ["male", "wei", 3, ["spyajun", "spzundi"]], + sp_huaman: ["female", "shu", 4, ["spxiangzhen", "spfangzong", "spxizhan"]], + sp_gaolan: ["male", "qun", 4, ["spjungong", "spdengli"]], + sunyi: ["male", "wu", 4, ["zaoli"]], + sp_wangshuang: ["male", "wei", 4, ["yiyong", "shanxie"]], + sp_zongyu: ["male", "shu", 3, ["zhibian", "yuyan"]], + yuanhuan: ["male", "wei", 3, ["qingjue", "fengjie"]], + sp_chendong: ["male", "wu", 4, ["spyilie", "spfenming"]], + db_wenyang: [ + "male", + "wei", + 4, + ["dbquedi", "dbzhuifeng", "dbchongjian", "dbchoujue"], + ["doublegroup:wei:wu"], + ], + sp_yanghu: ["male", "qun", 3, ["mingfa", "rongbei"]], + qiaogong: ["male", "wu", 3, ["yizhu", "luanchou"]], + liuzhang: ["male", "qun", 3, ["jutu", "yaohu", "rehuaibi"], ["zhu"]], + sp_zhangwen: ["male", "wu", 3, ["gebo", "spsongshu"]], + zhangzhongjing: ["male", "qun", 3, ["jishi", "xinliaoyi", "binglun"]], + sp_xujing: ["male", "shu", 3, ["boming", "ejian"]], + sp_huaxin: ["male", "wei", 3, ["yuanqing", "shuchen"]], + xiangchong: ["male", "shu", 4, ["guying", "muzhen"]], + caizhenji: ["female", "wei", 3, ["sheyi", "tianyin"]], + sp_kongrong: ["male", "qun", 3, ["xinlirang", "xinmingshi"]], + zhouchu: ["male", "wu", 4, ["xianghai", "rechuhai"]], + wangfuzhaolei: ["male", "shu", 4, ["xunyi"]], + wangling: ["male", "wei", 4, ["xingqi", "xinzifu", "mibei"], ["clan:太原王氏"]], + wujing: ["male", "wu", 4, ["heji", "liubing"]], + sp_mifuren: ["female", "shu", 3, ["xinguixiu", "qingyu"]], + sp_xinpi: ["male", "wei", 3, ["spyinju", "spchijie"]], + feiyi: ["male", "shu", 3, ["mjshengxi", "fyjianyu"]], + sp_bianfuren: ["female", "wei", 3, ["spwanwei", "spyuejian"]], + sp_duyu: ["male", "qun", 4, ["spwuku", "spsanchen"]], + luotong: ["male", "wu", 4, ["qinzheng"]], + sp_wangcan: ["male", "wei", 3, ["spqiai", "spshanxi"]], + sp_chenzhen: ["male", "shu", 3, ["shameng"]], + sp_sunshao: ["male", "wu", 3, ["mjdingyi", "mjzuici", "mjfubi"]], + sp_xunchen: ["male", "qun", 3, ["mjweipo", "mjchenshi", "mjmouzhi"], ["clan:颍川荀氏"]], }, - skill:{ + skill: { //刘巴 - duanbi:{ - unique:true, - mark:true, - limited:true, - audio:2, - enable:'phaseUse', - filter:function(event,player){ - var num1=0,num2=0; - var count=game.countPlayer(function(current){ - num1+=current.countCards('h'); + duanbi: { + unique: true, + mark: true, + limited: true, + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + var num1 = 0, + num2 = 0; + var count = game.countPlayer(function (current) { + num1 += current.countCards("h"); num2++; - return current!=player; + return current != player; }); - return count>0&&num1>num2*2; + return count > 0 && num1 > num2 * 2; }, - filterTarget:true, - selectTarget:-1, - multitarget:true, - multiline:true, - skillAnimation:true, - animationColor:'orange', - content:function(){ - 'step 0' - player.awakenSkill('duanbi'); - event.num=0; - event.cards=[]; + filterTarget: true, + selectTarget: -1, + multitarget: true, + multiline: true, + skillAnimation: true, + animationColor: "orange", + content: function () { + "step 0"; + player.awakenSkill("duanbi"); + event.num = 0; + event.cards = []; event.targets.sortBySeat(); event.targets.remove(player); - 'step 1' - var target=targets[num]; - var num=Math.min(3,Math.floor(target.countCards('h')/2)); - if(num>0) target.chooseToDiscard('h',true,num); - else event._result={bool:false}; - 'step 2' - if(result.bool&&Array.isArray(result.cards)) event.cards.addArray(result.cards); + ("step 1"); + var target = targets[num]; + var num = Math.min(3, Math.floor(target.countCards("h") / 2)); + if (num > 0) target.chooseToDiscard("h", true, num); + else event._result = { bool: false }; + ("step 2"); + if (result.bool && Array.isArray(result.cards)) event.cards.addArray(result.cards); event.num++; - if(event.num3?'随机获得三':('获得'+get.cnNumber(event.cards.length)))+'张被弃置的牌?').set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) att/=10; - if(target.hasJudge('lebu')) att/=4; - return att*Math.sqrt(Math.max(1,5-target.countCards('h'))); - }); - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - target.gain(cards.randomGets(3),'gain2'); + if (!event.cards.length) event.finish(); + else + player + .chooseTarget( + "是否令一名角色" + + (event.cards.length > 3 + ? "随机获得三" + : "获得" + get.cnNumber(event.cards.length)) + + "张被弃置的牌?" + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 4; + return att * Math.sqrt(Math.max(1, 5 - target.countCards("h"))); + }); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + target.gain(cards.randomGets(3), "gain2"); } }, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(player==target) return 3; - return -Math.min(3,Math.floor(target.countCards('h')/2)); + ai: { + order: 10, + result: { + target: function (player, target) { + if (player == target) return 3; + return -Math.min(3, Math.floor(target.countCards("h") / 2)); }, }, }, }, - tongduo:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - direct:true, - usable:1, - filter:function(event,player){ - return player!=event.player&&event.targets.length==1&&game.hasPlayer(function(current){ - return current.countCards('he')>0; - }); + tongduo: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + direct: true, + usable: 1, + filter: function (event, player) { + return ( + player != event.player && + event.targets.length == 1 && + game.hasPlayer(function (current) { + return current.countCards("he") > 0; + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('tongduo'),'令一名角色重铸一张牌',function(card,player,target){ - return target.hasCard(lib.filter.cardRecastable,'he'); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target)*Math.min(3,Math.floor(target.countCards('h',lib.filter.cardRecastable)/2)); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('tongduo',target); - } - else event.finish(); - 'step 2' - if(!target.hasCard(lib.filter.cardRecastable,'he')) event.finish(); - else target.chooseCard('he',true,'请重铸一张牌',lib.filter.cardRecastable); - 'step 3' + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("tongduo"), + "令一名角色重铸一张牌", + function (card, player, target) { + return target.hasCard(lib.filter.cardRecastable, "he"); + } + ) + .set("ai", function (target) { + return ( + get.attitude(_status.event.player, target) * + Math.min(3, Math.floor(target.countCards("h", lib.filter.cardRecastable) / 2)) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("tongduo", target); + } else event.finish(); + ("step 2"); + if (!target.hasCard(lib.filter.cardRecastable, "he")) event.finish(); + else target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable); + ("step 3"); target.recast(result.cards); }, }, //朱儁 - yangjie:{ - audio:2, - group:['yangjie_add'], - enable:'phaseUse', - prompt:'摸一张牌并与一名其他角色进行拼点', - usable:1, - filter:function(event,player){ - return !player.hasSkillTag('noCompareSource'); + yangjie: { + audio: 2, + group: ["yangjie_add"], + enable: "phaseUse", + prompt: "摸一张牌并与一名其他角色进行拼点", + usable: 1, + filter: function (event, player) { + return !player.hasSkillTag("noCompareSource"); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0&& - !target.hasSkillTag('noCompareTarget'); + filterTarget: function (card, player, target) { + return ( + target != player && + target.countCards("h") > 0 && + !target.hasSkillTag("noCompareTarget") + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.canCompare(target)) player.chooseToCompare(target).set('small',true); + ("step 1"); + if (player.canCompare(target)) player.chooseToCompare(target).set("small", true); else event.finish(); - 'step 2' - if(!result.bool){ - var cards=[result.player,result.target].filterInD('d'); - if(!cards.length||!game.hasPlayer((current)=>current!=player&¤t!=target)) event.finish(); - else{ - event.cards=cards; - player.chooseTarget('请选择一名角色','令其获得'+get.translation(cards)+',且视为对'+get.translation(target)+'使用一张火【杀】',function(card,player,target){ - return target!=player&&target!=_status.event.getParent().target; - }).set('ai',function(target){ - var player=_status.event.player,cards=_status.event.getParent().cards,target2=_status.event.getParent().target; - var val=get.value(cards,target)*get.attitude(player,target); - if(val<=0) return 0; - return val+target.canUse({name:'sha',nature:'fire',isCard:true},target2,false)?get.effect(target2,{name:'sha',nature:'fire',isCard:true},target,player):0; - }); + ("step 2"); + if (!result.bool) { + var cards = [result.player, result.target].filterInD("d"); + if ( + !cards.length || + !game.hasPlayer((current) => current != player && current != target) + ) + event.finish(); + else { + event.cards = cards; + player + .chooseTarget( + "请选择一名角色", + "令其获得" + + get.translation(cards) + + ",且视为对" + + get.translation(target) + + "使用一张火【杀】", + function (card, player, target) { + return target != player && target != _status.event.getParent().target; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.getParent().cards, + target2 = _status.event.getParent().target; + var val = get.value(cards, target) * get.attitude(player, target); + if (val <= 0) return 0; + return val + + target.canUse( + { name: "sha", nature: "fire", isCard: true }, + target2, + false + ) + ? get.effect( + target2, + { name: "sha", nature: "fire", isCard: true }, + target, + player + ) + : 0; + }); } - } - else event.finish(); - 'step 3' - if(result.bool){ - var source=result.targets[0]; - event.source=source; + } else event.finish(); + ("step 3"); + if (result.bool) { + var source = result.targets[0]; + event.source = source; player.line(source); - source.gain(cards,'gain2'); - } - else event.finish(); - 'step 4' - var card={name:'sha',nature:'fire',isCard:true}; - if(target.isIn()&&source.isIn()&&source.canUse(card,target,false)) source.useCard(card,target,false); + source.gain(cards, "gain2"); + } else event.finish(); + ("step 4"); + var card = { name: "sha", nature: "fire", isCard: true }; + if (target.isIn() && source.isIn() && source.canUse(card, target, false)) + source.useCard(card, target, false); }, - subSkill:{ - add:{ - trigger:{player:'compare'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.getParent().name=='yangjie'&&event.num1>1&&player.isDamaged(); + subSkill: { + add: { + trigger: { player: "compare" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.getParent().name == "yangjie" && event.num1 > 1 && player.isDamaged() + ); + }, + content: function () { + var num = player.getDamagedHp(); + game.log(player, "的拼点牌点数-", num); + trigger.num1 = Math.max(1, trigger.num1 - num); }, - content:function(){ - var num=player.getDamagedHp(); - game.log(player,'的拼点牌点数-',num); - trigger.num1=Math.max(1,trigger.num1-num); - } }, }, - ai:{ - order:3, - result:{target:-1.5}, + ai: { + order: 3, + result: { target: -1.5 }, }, }, - zjjuxiang:{ - audio:2, - trigger:{global:'dyingAfter'}, - logTarget:'player', - limited:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return event.player!=player&&event.player.isIn(); + zjjuxiang: { + audio: 2, + trigger: { global: "dyingAfter" }, + logTarget: "player", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return event.player != player && event.player.isIn(); }, - check:function(event,player){ - return get.damageEffect(event.player,player,player)>0; + check: function (event, player) { + return get.damageEffect(event.player, player, player) > 0; }, - content:function(){ - 'step 0' - player.awakenSkill('zjjuxiang'); + content: function () { + "step 0"; + player.awakenSkill("zjjuxiang"); trigger.player.damage(); - 'step 1' - if(trigger.player.maxHp>0) player.draw(trigger.player.maxHp); + ("step 1"); + if (trigger.player.maxHp > 0) player.draw(trigger.player.maxHp); }, - ai:{expose:10}, + ai: { expose: 10 }, }, xinyangjie: { - audio: 'yangjie', - enable: 'phaseUse', + audio: "yangjie", + enable: "phaseUse", filter: function (event, player) { return game.hasPlayer(function (target) { return player.canCompare(target); @@ -256,399 +362,549 @@ game.import('character', function () { }, usable: 1, content: function () { - 'step 0' - player.chooseToCompare(target).set('small', true); - 'step 1' - if (!result.bool && game.hasPlayer(function (current) { - return current != player && current != target && current.canUse({ name: 'sha', nature: 'fire', isCard: true }, target, false); - })) { - player.chooseTarget('佯解:是否选择另一名其他角色?', '令其视为对' + get.translation(target) + '使用一张火【杀】', function (card, player, target) { - return target != player && target != _status.event.getParent().target; - }).set('ai', function (target) { - var player = _status.event.player, target2 = _status.event.getParent().target; - return get.effect(target2, { name: 'sha', nature: 'fire', isCard: true }, target, player); - }); - } - else event.finish(); - 'step 2' + "step 0"; + player.chooseToCompare(target).set("small", true); + ("step 1"); + if ( + !result.bool && + game.hasPlayer(function (current) { + return ( + current != player && + current != target && + current.canUse({ name: "sha", nature: "fire", isCard: true }, target, false) + ); + }) + ) { + player + .chooseTarget( + "佯解:是否选择另一名其他角色?", + "令其视为对" + get.translation(target) + "使用一张火【杀】", + function (card, player, target) { + return target != player && target != _status.event.getParent().target; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + target2 = _status.event.getParent().target; + return get.effect( + target2, + { name: "sha", nature: "fire", isCard: true }, + target, + player + ); + }); + } else event.finish(); + ("step 2"); if (result.bool) { var source = result.targets[0]; player.line(source); - game.log(player, '选择了', source); - var card = { name: 'sha', nature: 'fire', isCard: true }; - if (target.isIn() && source.isIn() && source.canUse(card, target, false)) source.useCard(card, target, false, 'noai'); + game.log(player, "选择了", source); + var card = { name: "sha", nature: "fire", isCard: true }; + if (target.isIn() && source.isIn() && source.canUse(card, target, false)) + source.useCard(card, target, false, "noai"); } }, ai: { order: 3, result: { target: function (player, target) { - var hs = player.getCards('h').sort(function (a, b) { + var hs = player.getCards("h").sort(function (a, b) { return a.number - b.number; }); - var ts = target.getCards('h').sort(function (a, b) { + var ts = target.getCards("h").sort(function (a, b) { return a.number - b.number; }); if (!hs.length || !ts.length) return 0; if (hs[0].number <= ts[0].number) return -3; - if (player.countCards('h') >= target.countCards('h')) return -10; + if (player.countCards("h") >= target.countCards("h")) return -10; return -1; }, }, }, }, xinjuxiang: { - audio: 'zjjuxiang', - inherit: 'zjjuxiang', + audio: "zjjuxiang", + inherit: "zjjuxiang", content: function () { - player.awakenSkill('xinjuxiang'); + player.awakenSkill("xinjuxiang"); trigger.player.damage(); }, }, - houfeng:{ - audio:3, - group:'houfeng_zhengsu', - subSkill:{ - zhengsu:{ - audio:'houfeng1', - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - if(!['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'].some(i=>!event.player.hasSkill(i))) return false; + houfeng: { + audio: 3, + group: "houfeng_zhengsu", + subSkill: { + zhengsu: { + audio: "houfeng1", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + if ( + !["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some( + (i) => !event.player.hasSkill(i) + ) + ) + return false; return player.inRange(event.player); }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - prompt2:()=>lib.translate.houfeng_info, - round:1, - logTarget:'player', - content:function(){ - 'step 0' - player.chooseButton(['选择'+get.translation(trigger.player)+'要进行的整肃类型',[['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'].filter(i=>!trigger.player.hasSkill(i)),'vcard']],true).set('ai',()=>Math.random()); - 'step 1' - if(result.bool){ - var name=result.links[0][2],target=trigger.player; - target.addTempSkill('houfeng_share',{player:['phaseDiscardAfter','phaseAfter']}); - target.markAuto('houfeng_share',[player]); - target.addTempSkill(name,{player:['phaseDiscardAfter','phaseAfter']}); - target.popup(name,'thunder'); + prompt2: () => lib.translate.houfeng_info, + round: 1, + logTarget: "player", + content: function () { + "step 0"; + player + .chooseButton( + [ + "选择" + get.translation(trigger.player) + "要进行的整肃类型", + [ + ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter( + (i) => !trigger.player.hasSkill(i) + ), + "vcard", + ], + ], + true + ) + .set("ai", () => Math.random()); + ("step 1"); + if (result.bool) { + var name = result.links[0][2], + target = trigger.player; + target.addTempSkill("houfeng_share", { + player: ["phaseDiscardAfter", "phaseAfter"], + }); + target.markAuto("houfeng_share", [player]); + target.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); + target.popup(name, "thunder"); game.delayx(); } }, }, - share:{ - charlotte:true, - onremove:true, - trigger:{player:'phaseDiscardEnd'}, - forced:true, - popup:false, - content:function(){ - 'step 0' - if(!lib.skill.zhengsu.filter(trigger,player)){ - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','houfeng3'); + share: { + charlotte: true, + onremove: true, + trigger: { player: "phaseDiscardEnd" }, + forced: true, + popup: false, + content: function () { + "step 0"; + if (!lib.skill.zhengsu.filter(trigger, player)) { + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "houfeng3"); }); - player.popup('整肃失败','fire'); - game.log(player,'整肃失败'); + player.popup("整肃失败", "fire"); + game.log(player, "整肃失败"); event.finish(); return; } - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','houfeng2'); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "houfeng2"); }); - player.popup('整肃成功','wood'); - game.log(player,'整肃成功'); - var list=player.getStorage('houfeng_share').filter(i=>i.isIn()); + player.popup("整肃成功", "wood"); + game.log(player, "整肃成功"); + var list = player.getStorage("houfeng_share").filter((i) => i.isIn()); list.unshift(player); - event.list=list; - var num1=0,num2=0,num3=0; - for(var target of list){ - num1+=2*get.effect(target,{name:'draw'},player,player); - num2+=get.recoverEffect(target,player,player); + event.list = list; + var num1 = 0, + num2 = 0, + num3 = 0; + for (var target of list) { + num1 += 2 * get.effect(target, { name: "draw" }, player, player); + num2 += get.recoverEffect(target, player, player); } - trigger.player.chooseControl('摸两张牌','回复体力','cancel2').set('prompt','整肃奖励:请选择'+get.translation(list)+'的整肃奖励').set('ai',function(){ - return ['摸两张牌','回复体力','cancel2'][_status.event.goon.indexOf(Math.max.apply(Math,_status.event.goon))]; - }).set('goon',[num1,num2,num3]); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='摸两张牌') game.asyncDraw(event.list,2); - else{ - for(var i of event.list) i.recover(); + trigger.player + .chooseControl("摸两张牌", "回复体力", "cancel2") + .set("prompt", "整肃奖励:请选择" + get.translation(list) + "的整肃奖励") + .set("ai", function () { + return [ + "摸两张牌", + "回复体力", + "cancel2", + ][_status.event.goon.indexOf(Math.max.apply(Math, _status.event.goon))]; + }) + .set("goon", [num1, num2, num3]); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "摸两张牌") game.asyncDraw(event.list, 2); + else { + for (var i of event.list) i.recover(); } - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); game.delayx(); }, }, }, }, - houfeng1:{audio:true}, + houfeng1: { audio: true }, //手杀皇甫嵩 - spzhengjun:{ - audio:3, - group:'spzhengjun_zhengsu', - subSkill:{ - zhengsu:{ - audio:'spzhengjun1', - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return ['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'].some(i=>!player.hasSkill(i)); + spzhengjun: { + audio: 3, + group: "spzhengjun_zhengsu", + subSkill: { + zhengsu: { + audio: "spzhengjun1", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some( + (i) => !player.hasSkill(i) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseButton([get.prompt('spzhengjun'),[['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'].filter(i=>!player.hasSkill(i)),'vcard']]).set('ai',()=>Math.random()); - 'step 1' - if(result.bool){ - player.logSkill('spzhengjun_zhengsu',player); - var name=result.links[0][2]; - player.addTempSkill('spzhengjun_share',{player:['phaseDiscardAfter','phaseAfter']}); - player.addTempSkill(name,{player:['phaseDiscardAfter','phaseAfter']}); - player.popup(name,'thunder'); + direct: true, + content: function () { + "step 0"; + player + .chooseButton([ + get.prompt("spzhengjun"), + [ + ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter( + (i) => !player.hasSkill(i) + ), + "vcard", + ], + ]) + .set("ai", () => Math.random()); + ("step 1"); + if (result.bool) { + player.logSkill("spzhengjun_zhengsu", player); + var name = result.links[0][2]; + player.addTempSkill("spzhengjun_share", { + player: ["phaseDiscardAfter", "phaseAfter"], + }); + player.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); + player.popup(name, "thunder"); game.delayx(); } }, }, - share:{ - charlotte:true, - trigger:{player:'phaseDiscardEnd'}, - forced:true, - popup:false, - content:function(){ - 'step 0' - if(!lib.skill.zhengsu.filter(trigger,player)){ - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','spzhengjun3'); + share: { + charlotte: true, + trigger: { player: "phaseDiscardEnd" }, + forced: true, + popup: false, + content: function () { + "step 0"; + if (!lib.skill.zhengsu.filter(trigger, player)) { + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spzhengjun3"); }); - player.popup('整肃失败','fire'); - game.log(player,'整肃失败'); + player.popup("整肃失败", "fire"); + game.log(player, "整肃失败"); event.finish(); return; } - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','spzhengjun2'); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spzhengjun2"); }); - player.popup('整肃成功','wood'); - game.log(player,'整肃成功'); - player.chooseDrawRecover(2,'整肃奖励:摸两张牌或回复1点体力'); - 'step 1' - if(result.control=='cancel2'){event.finish();return;} - player.chooseTarget('整军:是否令一名其他角色也回复1点体力或摸两张牌?',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return Math.max(2*get.effect(target,{name:'draw'},target,player),get.recoverEffect(target,target,player)); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - var num1=2*get.effect(target,{name:'draw'},target,player); - var num2=get.recoverEffect(target,target,player); - player.line(target); - if(target.isHealthy()) result.index=0; - else player.chooseControl('摸牌','回血').set('prompt','整肃奖励:令'+get.translation(target)+'摸两张牌或回复1点体力').set('ai',function(){ - return _status.event.goon?0:1; - }).set('goon',num1>=num2); + player.popup("整肃成功", "wood"); + game.log(player, "整肃成功"); + player.chooseDrawRecover(2, "整肃奖励:摸两张牌或回复1点体力"); + ("step 1"); + if (result.control == "cancel2") { + event.finish(); + return; } - else event.finish(); - 'step 3' - if(result.index==0) target.draw(2); + player + .chooseTarget( + "整军:是否令一名其他角色也回复1点体力或摸两张牌?", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + return Math.max( + 2 * get.effect(target, { name: "draw" }, target, player), + get.recoverEffect(target, target, player) + ); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var num1 = 2 * get.effect(target, { name: "draw" }, target, player); + var num2 = get.recoverEffect(target, target, player); + player.line(target); + if (target.isHealthy()) result.index = 0; + else + player + .chooseControl("摸牌", "回血") + .set( + "prompt", + "整肃奖励:令" + get.translation(target) + "摸两张牌或回复1点体力" + ) + .set("ai", function () { + return _status.event.goon ? 0 : 1; + }) + .set("goon", num1 >= num2); + } else event.finish(); + ("step 3"); + if (result.index == 0) target.draw(2); else target.recover(); }, }, }, }, - spzhengjun1:{audio:true}, - spshiji:{ - audio:2, - trigger:{source:'damageBegin2'}, - logTarget:'player', - filter:function(event,player){ - return player!=event.player&&event.hasNature('linked')&&event.player.countCards('h')>0&&!player.isMaxHandcard(true); + spzhengjun1: { audio: true }, + spshiji: { + audio: 2, + trigger: { source: "damageBegin2" }, + logTarget: "player", + filter: function (event, player) { + return ( + player != event.player && + event.hasNature("linked") && + event.player.countCards("h") > 0 && + !player.isMaxHandcard(true) + ); }, - check:function(event,player){ - return get.attitude(player,event.player)<=0; + check: function (event, player) { + return get.attitude(player, event.player) <= 0; }, - content:function(){ - var target=trigger.player; + content: function () { + var target = trigger.player; player.viewHandcards(target); - var hs=target.getCards('h',{color:'red'}); - if(hs.length){ + var hs = target.getCards("h", { color: "red" }); + if (hs.length) { target.discard(hs); player.draw(hs.length); } }, }, - sptaoluan:{ - audio:2, - trigger:{global:'judgeFixing'}, - usable:1, - filter:function(event,player){ - return event.result&&event.result.suit=='spade'; + sptaoluan: { + audio: 2, + trigger: { global: "judgeFixing" }, + usable: 1, + filter: function (event, player) { + return event.result && event.result.suit == "spade"; }, - check:function(event,player){ - return event.result.judge*get.attitude(player,event.player)<=0; + check: function (event, player) { + return event.result.judge * get.attitude(player, event.player) <= 0; }, - content:function(){ - 'step 0' - var evt=trigger.getParent(); - if(evt.name=='phaseJudge') evt.excluded=true; - else{ + content: function () { + "step 0"; + var evt = trigger.getParent(); + if (evt.name == "phaseJudge") evt.excluded = true; + else { evt.finish(); - evt._triggered=null; - if(evt.name.startsWith('pre_')){ - var evtx=evt.getParent(); + evt._triggered = null; + if (evt.name.startsWith("pre_")) { + var evtx = evt.getParent(); evtx.finish(); - evtx._triggered=null; + evtx._triggered = null; } - var nexts=trigger.next.slice(); - for(var next of nexts){ - if(next.name=='judgeCallback') trigger.next.remove(next); + var nexts = trigger.next.slice(); + for (var next of nexts) { + if (next.name == "judgeCallback") trigger.next.remove(next); } - var evts=game.getGlobalHistory('cardMove',function(evt){ - return evt.getParent(2)==trigger.getParent(); + var evts = game.getGlobalHistory("cardMove", function (evt) { + return evt.getParent(2) == trigger.getParent(); }); - var cards=[]; - for(var i=evts.length-1;i>=0;i--){ - var evt=evts[i]; - for(var card of evt.cards){ - if(get.position(card,true)=='o') cards.push(card); + var cards = []; + for (var i = evts.length - 1; i >= 0; i--) { + var evt = evts[i]; + for (var card of evt.cards) { + if (get.position(card, true) == "o") cards.push(card); } } trigger.orderingCards.addArray(cards); } - var list=[]; - if(get.position(trigger.result.card)=='d') list.push(0); - if(trigger.player.isIn()&&player.canUse({name:'sha',nature:'fire',isCard:true},trigger.player,false)) list.push(1); - if(list.length==2) player.chooseControl().set('choiceList',[ - '获得'+get.translation(trigger.result.card), - '视为对'+get.translation(trigger.player)+'使用一张火【杀】', - ]).set('choice',(get.effect(trigger.player,{name:'sha'},player,player)>0)?1:0); - else if(list.length==1) event._result={index:list[0]}; + var list = []; + if (get.position(trigger.result.card) == "d") list.push(0); + if ( + trigger.player.isIn() && + player.canUse({ name: "sha", nature: "fire", isCard: true }, trigger.player, false) + ) + list.push(1); + if (list.length == 2) + player + .chooseControl() + .set("choiceList", [ + "获得" + get.translation(trigger.result.card), + "视为对" + get.translation(trigger.player) + "使用一张火【杀】", + ]) + .set( + "choice", + get.effect(trigger.player, { name: "sha" }, player, player) > 0 ? 1 : 0 + ); + else if (list.length == 1) event._result = { index: list[0] }; else event.finish(); - 'step 1' - if(result.index==0) player.gain(trigger.result.card,'gain2'); - else player.useCard({name:'sha',nature:'fire',isCard:true},trigger.player,false) + ("step 1"); + if (result.index == 0) player.gain(trigger.result.card, "gain2"); + else player.useCard({ name: "sha", nature: "fire", isCard: true }, trigger.player, false); }, }, //吕范 - spdiaodu:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('spdiaodu'),'令一名角色摸一张牌,然后移动其装备区内的一张牌').set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att>0){ - if(target.hasCard(function(card){ - if(get.value(card,target)<=0&&game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card,false)&&get.effect(current,card,player,player)>0; - })) return true; - return false; - },'e')) return 2*att; - if(!target.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card); - }) - },'e')) return 1; - } - else if(att<0){ - if(target.hasCard(function(card){ - if(get.value(card,target)>=4.5&&game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card)&&get.effect(current,card,player,player)>0; - })) return true; - return false; - },'e')) return -att; - } - return 0; - }) - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('spdiaodu',target); - target.draw(); - } - else event.finish(); - 'step 2' - var es=target.getCards('e',function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card); - }) - }); - if(es.length){ - if(es.length==1) event._result={bool:true,links:es}; - else player.chooseButton(['移动'+get.translation(target)+'的一张装备牌',es],true).set('ai',function(button){ - var player=_status.event.player,target=_status.event.getParent().target,card=button.link; - if(game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card)&&get.effect(current,card,player,player)>0; - })) return -get.value(card,target)*get.attitude(player,target); + spdiaodu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("spdiaodu"), + "令一名角色摸一张牌,然后移动其装备区内的一张牌" + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) <= 0 && + game.hasPlayer(function (current) { + return ( + current != target && + current.canEquip(card, false) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return true; + return false; + }, "e") + ) + return 2 * att; + if ( + !target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }, "e") + ) + return 1; + } else if (att < 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) >= 4.5 && + game.hasPlayer(function (current) { + return ( + current != target && + current.canEquip(card) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return true; + return false; + }, "e") + ) + return -att; + } return 0; }); - } - else event.finish(); - 'step 3' - if(result.bool){ - event.card=result.links[0]; - player.chooseTarget(true,'选择'+get.translation(event.card)+'的移动目标',function(card,player,target){ - return target.canEquip(_status.event.card); - }).set('card',event.card).set('ai',function(target){ - var evt=_status.event; - return get.effect(target,evt.getParent().card,evt.player,evt.player); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("spdiaodu", target); + target.draw(); + } else event.finish(); + ("step 2"); + var es = target.getCards("e", function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); }); - } - else event.finish(); - 'step 4' - if(result.bool){ - var target2=result.targets[0]; + }); + if (es.length) { + if (es.length == 1) event._result = { bool: true, links: es }; + else + player + .chooseButton(["移动" + get.translation(target) + "的一张装备牌", es], true) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target, + card = button.link; + if ( + game.hasPlayer(function (current) { + return ( + current != target && + current.canEquip(card) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return -get.value(card, target) * get.attitude(player, target); + return 0; + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + event.card = result.links[0]; + player + .chooseTarget( + true, + "选择" + get.translation(event.card) + "的移动目标", + function (card, player, target) { + return target.canEquip(_status.event.card); + } + ) + .set("card", event.card) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt.getParent().card, evt.player, evt.player); + }); + } else event.finish(); + ("step 4"); + if (result.bool) { + var target2 = result.targets[0]; target.line(target2); - target.$give(card,target2); + target.$give(card, target2); game.delay(0.5); target2.equip(card); } }, }, - spdiancai:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&player.hasHistory('lose',function(evt){ - return evt.hs&&evt.hs.length>0; - }); + spdiancai: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + player.hasHistory("lose", function (evt) { + return evt.hs && evt.hs.length > 0; + }) + ); }, - content:function(){ - 'step 0' - var num=0; - player.getHistory('lose',function(evt){ - if(evt.hs) num+=evt.hs.length; + content: function () { + "step 0"; + var num = 0; + player.getHistory("lose", function (evt) { + if (evt.hs) num += evt.hs.length; }); - num=Math.min(num,game.countPlayer()); - player.chooseTarget(get.prompt('spdiancai'),[1,num],'令至多'+get.cnNumber(num)+'名角色各摸一张牌').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(trigger.player); - player.logSkill('spdiancai',targets); - if(targets.length==1){ + num = Math.min(num, game.countPlayer()); + player + .chooseTarget( + get.prompt("spdiancai"), + [1, num], + "令至多" + get.cnNumber(num) + "名角色各摸一张牌" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(trigger.player); + player.logSkill("spdiancai", targets); + if (targets.length == 1) { targets[0].draw(); event.finish(); - } - else game.asyncDraw(targets); - } - else event.finish(); - 'step 2' + } else game.asyncDraw(targets); + } else event.finish(); + ("step 2"); game.delayx(); }, }, mbdiaodu: { - audio: 'spdiaodu', - trigger: { player: 'phaseZhunbeiBegin' }, + audio: "spdiaodu", + trigger: { player: "phaseZhunbeiBegin" }, filter: function (event, player) { return game.hasPlayer(function (target) { - return target.countCards('e', function (card) { + return target.countCards("e", function (card) { return game.hasPlayer(function (current) { return current != player && current != target && current.canEquip(card); }); @@ -657,1590 +913,1983 @@ game.import('character', function () { }, direct: true, content: function () { - 'step 0' - player.chooseTarget(get.prompt2('mbdiaodu'), function (card, player, target) { - return target.countCards('e', function (card) { - return game.hasPlayer(function (current) { - return current != player && current != target && current.canEquip(card); + "step 0"; + player + .chooseTarget(get.prompt2("mbdiaodu"), function (card, player, target) { + return target.countCards("e", function (card) { + return game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card); + }); }); + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att > 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) <= 0 && + game.hasPlayer(function (current) { + return ( + current != player && + current != target && + current.canEquip(card, false) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return true; + return false; + }, "e") + ) + return 2 * att; + } else if (att < 0) { + if ( + target.hasCard(function (card) { + if ( + get.value(card, target) >= 4.5 && + game.hasPlayer(function (current) { + return ( + current != player && + current != target && + current.canEquip(card) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return true; + return false; + }, "e") + ) + return -att; + } + return 0; }); - }).set('ai', function (target) { - var player = _status.event.player, att = get.attitude(player, target); - if (att > 0) { - if (target.hasCard(function (card) { - if (get.value(card, target) <= 0 && game.hasPlayer(function (current) { - return current != player && current != target && current.canEquip(card, false) && get.effect(current, card, player, player) > 0; - })) return true; - return false; - }, 'e')) return 2 * att; - } - else if (att < 0) { - if (target.hasCard(function (card) { - if (get.value(card, target) >= 4.5 && game.hasPlayer(function (current) { - return current != player && current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; - })) return true; - return false; - }, 'e')) return -att; - } - return 0; - }) - 'step 1' + ("step 1"); if (result.bool) { var target = result.targets[0]; event.target = target; - player.logSkill('mbdiaodu', target); - } - else event.finish(); - 'step 2' - var es = target.getCards('e', function (card) { + player.logSkill("mbdiaodu", target); + } else event.finish(); + ("step 2"); + var es = target.getCards("e", function (card) { return game.hasPlayer(function (current) { return current != target && current.canEquip(card); - }) + }); }); if (es.length == 1) event._result = { bool: true, links: es }; - else player.chooseButton(['移动' + get.translation(target) + '的一张装备牌', es], true).set('ai', function (button) { - var player = _status.event.player, target = _status.event.getParent().target, card = button.link; - if (game.hasPlayer(function (current) { - return current != player && current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; - })) return -get.value(card, target) * get.attitude(player, target); - return 0; - }); - 'step 3' + else + player + .chooseButton(["移动" + get.translation(target) + "的一张装备牌", es], true) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target, + card = button.link; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current != target && + current.canEquip(card) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return -get.value(card, target) * get.attitude(player, target); + return 0; + }); + ("step 3"); if (result.bool) { event.card = result.links[0]; - player.chooseTarget('请选择' + get.translation(event.card) + '的移动目标', true, function (card, player, target) { - return target != player && target.canEquip(_status.event.card); - }).set('card', event.card).set('ai', function (target) { - var evt = _status.event; - return get.effect(target, evt.getParent().card, evt.player, evt.player); - }); - } - else event.finish(); - 'step 4' + player + .chooseTarget( + "请选择" + get.translation(event.card) + "的移动目标", + true, + function (card, player, target) { + return target != player && target.canEquip(_status.event.card); + } + ) + .set("card", event.card) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, evt.getParent().card, evt.player, evt.player); + }); + } else event.finish(); + ("step 4"); if (result.bool) { var target2 = result.targets[0]; target.line(target2); target.$give(card, target2); game.delay(0.5); target2.equip(card); - } - else event.finish(); - 'step 5' + } else event.finish(); + ("step 5"); target.draw(); }, }, mbdiancai: { - audio: 'spdiancai', - trigger: { global: 'phaseUseEnd' }, + audio: "spdiancai", + trigger: { global: "phaseUseEnd" }, filter: function (event, player) { if (_status.currentPhase == player) return false; var num = 0; - player.getHistory('lose', function (evt) { - if (evt.cards2 && evt.getParent('phaseUse') == event) num += evt.cards2.length; + player.getHistory("lose", function (evt) { + if (evt.cards2 && evt.getParent("phaseUse") == event) num += evt.cards2.length; }); - return num >= player.hp && player.countCards('h') < player.maxHp; + return num >= player.hp && player.countCards("h") < player.maxHp; }, frequent: true, content: function () { - var num = player.maxHp - player.countCards('h'); + var num = player.maxHp - player.countCards("h"); if (num > 0) player.draw(num); }, }, - spyanji:{ - audio:3, - group:'spyanji_zhengsu', - subSkill:{ - zhengsu:{ - audio:'spyanji', - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return ['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'].some(i=>!player.hasSkill(i)); + spyanji: { + audio: 3, + group: "spyanji_zhengsu", + subSkill: { + zhengsu: { + audio: "spyanji", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].some( + (i) => !player.hasSkill(i) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseButton([get.prompt('spyanji'),[['zhengsu_leijin','zhengsu_bianzhen','zhengsu_mingzhi'].filter(i=>!player.hasSkill(i)),'vcard']]).set('ai',()=>Math.random()); - 'step 1' - if(result.bool){ - player.logSkill('spyanji_zhengsu',player); - var name=result.links[0][2]; - player.addTempSkill('spyanji_share',{player:['phaseDiscardAfter','phaseAfter']}); - player.addTempSkill(name,{player:['phaseDiscardAfter','phaseAfter']}); - player.popup(name,'thunder'); + direct: true, + content: function () { + "step 0"; + player + .chooseButton([ + get.prompt("spyanji"), + [ + ["zhengsu_leijin", "zhengsu_bianzhen", "zhengsu_mingzhi"].filter( + (i) => !player.hasSkill(i) + ), + "vcard", + ], + ]) + .set("ai", () => Math.random()); + ("step 1"); + if (result.bool) { + player.logSkill("spyanji_zhengsu", player); + var name = result.links[0][2]; + player.addTempSkill("spyanji_share", { + player: ["phaseDiscardAfter", "phaseAfter"], + }); + player.addTempSkill(name, { player: ["phaseDiscardAfter", "phaseAfter"] }); + player.popup(name, "thunder"); game.delayx(); } }, }, - share:{ - charlotte:true, - trigger:{player:'phaseDiscardEnd'}, - forced:true, - popup:false, - content:function(){ - if(!lib.skill.zhengsu.filter(trigger,player)){ - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','spyanji3'); + share: { + charlotte: true, + trigger: { player: "phaseDiscardEnd" }, + forced: true, + popup: false, + content: function () { + if (!lib.skill.zhengsu.filter(trigger, player)) { + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spyanji3"); }); - player.popup('整肃失败','fire'); - game.log(player,'整肃失败'); + player.popup("整肃失败", "fire"); + game.log(player, "整肃失败"); event.finish(); return; } - game.broadcastAll(function(){ - if(lib.config.background_speak) game.playAudio('skill','spyanji2'); + game.broadcastAll(function () { + if (lib.config.background_speak) game.playAudio("skill", "spyanji2"); }); - player.popup('整肃成功','wood'); - game.log(player,'整肃成功'); - player.chooseDrawRecover(2,'整肃奖励:摸两张牌或回复1点体力'); + player.popup("整肃成功", "wood"); + game.log(player, "整肃成功"); + player.chooseDrawRecover(2, "整肃奖励:摸两张牌或回复1点体力"); }, }, }, }, - spyanji1:{audio:true}, + spyanji1: { audio: true }, //蒋钦 - spjianyi:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return player!=event.player&&game.getGlobalHistory('cardMove',function(evt){ - if(evt.name!='lose'||evt.type!='discard') return false; - for(var i of evt.cards){ - if(get.subtype(i,false)=='equip2'&&get.position(i,true)=='d') return true; - } - return false; - }).length>0; + spjianyi: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return ( + player != event.player && + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || evt.type != "discard") return false; + for (var i of evt.cards) { + if (get.subtype(i, false) == "equip2" && get.position(i, true) == "d") + return true; + } + return false; + }).length > 0 + ); }, - content:function(){ - 'step 0' - var cards=[]; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name!='lose'||evt.type!='discard') return false; - for(var i of evt.cards){ - if(get.subtype(i,false)=='equip2'&&get.position(i,true)=='d') cards.push(i); + content: function () { + "step 0"; + var cards = []; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || evt.type != "discard") return false; + for (var i of evt.cards) { + if (get.subtype(i, false) == "equip2" && get.position(i, true) == "d") + cards.push(i); } }); - player.chooseButton(['俭衣:获得一张防具牌',cards],true).set('ai',function(button){ - return get.value(button.link,_status.event.player); + player.chooseButton(["俭衣:获得一张防具牌", cards], true).set("ai", function (button) { + return get.value(button.link, _status.event.player); }); - 'step 1' - if(result.bool) player.gain(result.links,'gain2'); + ("step 1"); + if (result.bool) player.gain(result.links, "gain2"); }, }, - spshangyi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0&&game.hasPlayer((current)=>lib.skill.spshangyi.filterTarget(null,player,current)); + spshangyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer((current) => lib.skill.spshangyi.filterTarget(null, player, current)) + ); }, - filterCard:true, - position:'he', - check:function(card){ - return 6-get.value(card); + filterCard: true, + position: "he", + check: function (card) { + return 6 - get.value(card); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ + content: function () { target.viewHandcards(player); - player.gainPlayerCard(target,'h',true,'visible'); + player.gainPlayerCard(target, "h", true, "visible"); }, - ai:{ - order:6, - result:{ - player:0.5, - target:function(player,target){ - if(target.hasSkillTag('noh')) return 0; + ai: { + order: 6, + result: { + player: 0.5, + target: function (player, target) { + if (target.hasSkillTag("noh")) return 0; return -1; }, }, }, }, //蒋琬 - spzhenting:{ - audio:2, - trigger:{global:'useCardToTarget'}, - usable:1, - filter:function(event,player){ - return (event.card.name=='sha'||get.type(event.card,false)=='delay')&& - event.player!=player&&!event.targets.includes(player)&&player.inRange(event.target); + spzhenting: { + audio: 2, + trigger: { global: "useCardToTarget" }, + usable: 1, + filter: function (event, player) { + return ( + (event.card.name == "sha" || get.type(event.card, false) == "delay") && + event.player != player && + !event.targets.includes(player) && + player.inRange(event.target) + ); }, - logTarget:'target', - check:function(event,player){ - var target=event.target,source=event.player; - var eff1=get.effect(target,event.card,source,player); - if(eff1>=0) return false; - var eff2=get.effect(player,event.card,source,player); - if(eff2>=0) return true; - if(eff1) - if(event.card.name=='sha'){ - if(player.hasShan()) return true; - if(eff1>eff2) return false; - if(player.hp>2) return true; - if(player.hp==2) return eff2>eff1/3; - return false; - } - if(event.card.name=='shandian'||event.card.name=='bingliang') return true; - if(event.card.name=='lebu') return !player.needsToDiscard()&&target.needsToDiscard(); + logTarget: "target", + check: function (event, player) { + var target = event.target, + source = event.player; + var eff1 = get.effect(target, event.card, source, player); + if (eff1 >= 0) return false; + var eff2 = get.effect(player, event.card, source, player); + if (eff2 >= 0) return true; + if (eff1) + if (event.card.name == "sha") { + if (player.hasShan()) return true; + if (eff1 > eff2) return false; + if (player.hp > 2) return true; + if (player.hp == 2) return eff2 > eff1 / 3; + return false; + } + if (event.card.name == "shandian" || event.card.name == "bingliang") return true; + if (event.card.name == "lebu") return !player.needsToDiscard() && target.needsToDiscard(); return false; }, - content:function(){ - 'step 0' - var target=trigger.target,evt=trigger.getParent(); + content: function () { + "step 0"; + var target = trigger.target, + evt = trigger.getParent(); evt.triggeredTargets2.remove(target); evt.targets.remove(target); evt.triggeredTargets2.add(player); evt.targets.add(player); - game.log(trigger.card,'的目标被改为了',player); + game.log(trigger.card, "的目标被改为了", player); trigger.untrigger(); - 'step 1' - if(!trigger.player.countDiscardableCards(player,'h')) event._result={index:0}; - else player.chooseControl().set('choiceList',[ - '摸一张牌', - '弃置'+get.translation(trigger.player)+'的一张手牌', - ]); - 'step 2' - if(result.index==0) player.draw(); - else{ - player.line(trigger.player,'fire'); - player.discardPlayerCard(trigger.player,true,'h'); + ("step 1"); + if (!trigger.player.countDiscardableCards(player, "h")) event._result = { index: 0 }; + else + player + .chooseControl() + .set("choiceList", [ + "摸一张牌", + "弃置" + get.translation(trigger.player) + "的一张手牌", + ]); + ("step 2"); + if (result.index == 0) player.draw(); + else { + player.line(trigger.player, "fire"); + player.discardPlayerCard(trigger.player, true, "h"); } }, - ai:{ - threaten:1.4, + ai: { + threaten: 1.4, }, }, - spjincui:{ - audio:2, - enable:'phaseUse', - usable:1, - limited:true, - skillAnimation:true, - animationColor:'orange', - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - player.awakenSkill('spjincui'); - game.broadcastAll(function(target1,target2){ - game.swapSeat(target1,target2); - },player,target); - 'step 1' - if(player.hp>0) player.loseHp(player.hp); + spjincui: { + audio: 2, + enable: "phaseUse", + usable: 1, + limited: true, + skillAnimation: true, + animationColor: "orange", + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + player.awakenSkill("spjincui"); + game.broadcastAll( + function (target1, target2) { + game.swapSeat(target1, target2); + }, + player, + target + ); + ("step 1"); + if (player.hp > 0) player.loseHp(player.hp); }, - ai:{ - order:5, - result:{ - player:function(player,target){ - if(player.hasUnknown()) return 0; - if(!player.countCards('h',{name:['tao','jiu']})) return 0; - var num=0,current=player.next; - while(true){ - num-=get.sgn(get.attitude(player,current)); - if(current==target) break; - current=current.next; + ai: { + order: 5, + result: { + player: function (player, target) { + if (player.hasUnknown()) return 0; + if (!player.countCards("h", { name: ["tao", "jiu"] })) return 0; + var num = 0, + current = player.next; + while (true) { + num -= get.sgn(get.attitude(player, current)); + if (current == target) break; + current = current.next; } - while(true){ - if(current==player) break; - num+=get.sgn(get.attitude(player,current))*1.1; - current=current.next; + while (true) { + if (current == player) break; + num += get.sgn(get.attitude(player, current)) * 1.1; + current = current.next; } - if(nummap[i]); - list.push('cancel2'); + chooseControl: function (event, player) { + var map = {}, + hs = player.getCards("h"); + for (var i of hs) map[get.suit(i, player)] = true; + var list = lib.suit.filter((i) => map[i]); + list.push("cancel2"); return list; }, - check:function(event,player){ - var map={},hs=player.getCards('h'),min=Infinity,min_suit=null; - for(var i of hs){ - var suit=get.suit(i,player); - if(!map[suit]) map[suit]=0; - map[suit]+=get.value(i); + check: function (event, player) { + var map = {}, + hs = player.getCards("h"), + min = Infinity, + min_suit = null; + for (var i of hs) { + var suit = get.suit(i, player); + if (!map[suit]) map[suit] = 0; + map[suit] += get.value(i); } - for(var i in map){ - if(map[i]5||get.value(ui.selected.cards,player)>5) return 0; - return get.damageEffect(target,player,target); + ai: { + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var val = get.value(ui.selected.cards, target); + if (val < 0) return val + get.damageEffect(target, player, target); + if (val > 5 || get.value(ui.selected.cards, player) > 5) return 0; + return get.damageEffect(target, player, target); }, }, }, - } + }; }, - prompt:()=>'请选择【严教】的目标', + prompt: () => "请选择【严教】的目标", }, - subSkill:{ - draw:{ - onremove:true, - trigger:{player:'phaseBegin'}, - forced:true, - charlotte:true, - content:function(){ - player.draw(player.countMark('spyanjiao_draw')); - player.removeSkill('spyanjiao_draw'); + subSkill: { + draw: { + onremove: true, + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + content: function () { + player.draw(player.countMark("spyanjiao_draw")); + player.removeSkill("spyanjiao_draw"); }, - mark:true, - intro:{content:'下回合开始时摸#张牌'}, + mark: true, + intro: { content: "下回合开始时摸#张牌" }, }, - backup:{audio:'spyanjiao'}, + backup: { audio: "spyanjiao" }, }, - ai:{ - order:1, - result:{player:1}, + ai: { + order: 1, + result: { player: 1 }, }, }, //崔琰 - spyajun:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - var hs=player.getCards('h'); - return hs.length>0&&!player.hasSkillTag('noCompareSource')&&player.hasHistory('gain',function(evt){ - for(var i of evt.cards){ - if(hs.includes(i)) return true; - } - return false; - })&&game.hasPlayer(function(current){ - return current!=player&&player.canCompare(current); - }); + spyajun: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + var hs = player.getCards("h"); + return ( + hs.length > 0 && + !player.hasSkillTag("noCompareSource") && + player.hasHistory("gain", function (evt) { + for (var i of evt.cards) { + if (hs.includes(i)) return true; + } + return false; + }) && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); }, - content:function(){ - 'step 0' - var cards=[],hs=player.getCards('h'); - player.getHistory('gain',function(evt){ + content: function () { + "step 0"; + var cards = [], + hs = player.getCards("h"); + player.getHistory("gain", function (evt) { cards.addArray(evt.cards); }); - cards=cards.filter(function(i){ + cards = cards.filter(function (i) { return hs.includes(i); }); player.chooseCardTarget({ - prompt:get.prompt('spyajun'), - prompt2:'操作提示:选择一张本回合新得到的牌作为拼点牌,然后选择一名拼点目标', - cards:cards, - filterCard:function(card){ + prompt: get.prompt("spyajun"), + prompt2: "操作提示:选择一张本回合新得到的牌作为拼点牌,然后选择一名拼点目标", + cards: cards, + filterCard: function (card) { return _status.event.cards.includes(card); }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return player.canCompare(target); }, - ai1:function(card){ - return get.number(card)-get.value(card); + ai1: function (card) { + return get.number(card) - get.value(card); }, - ai2:function(target){ - return -get.attitude(_status.event.player,target)*Math.sqrt(5-Math.min(4,target.countCards('h')))*(target.hasSkillTag('noh')?0.5:1); + ai2: function (target) { + return ( + -get.attitude(_status.event.player, target) * + Math.sqrt(5 - Math.min(4, target.countCards("h"))) * + (target.hasSkillTag("noh") ? 0.5 : 1) + ); }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('spyajun',target); - var next=player.chooseToCompare(target); - if(!next.fixedResult) next.fixedResult={}; - next.fixedResult[player.playerid]=result.cards[0]; - } - else event.finish(); - 'step 2' - if(result.bool){ - var cards=[result.player,result.target].filterInD('d'); - if(cards.length){ - player.chooseButton(['是否将一张牌置于牌堆顶?',cards]).set('ai',function(button){ - if(get.color(button.link)=='black') return 1; - return 0; - }); - } - else event.finish(); - } - else{ - player.addMark('spyajun_less',1,false); - player.addTempSkill('spyajun_less'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("spyajun", target); + var next = player.chooseToCompare(target); + if (!next.fixedResult) next.fixedResult = {}; + next.fixedResult[player.playerid] = result.cards[0]; + } else event.finish(); + ("step 2"); + if (result.bool) { + var cards = [result.player, result.target].filterInD("d"); + if (cards.length) { + player + .chooseButton(["是否将一张牌置于牌堆顶?", cards]) + .set("ai", function (button) { + if (get.color(button.link) == "black") return 1; + return 0; + }); + } else event.finish(); + } else { + player.addMark("spyajun_less", 1, false); + player.addTempSkill("spyajun_less"); event.finish(); } - 'step 3' - if(result.bool){ - var card=result.links[0]; + ("step 3"); + if (result.bool) { + var card = result.links[0]; card.fix(); - ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); game.updateRoundNumber(); - game.log(player,'将',card,'置于牌堆顶'); + game.log(player, "将", card, "置于牌堆顶"); } }, - group:'spyajun_draw', - subSkill:{ - draw:{ - audio:'spyajun', - trigger:{player:'phaseDrawBegin2'}, - forced:true, - locked:false, - filter:function(event,player){ + group: "spyajun_draw", + subSkill: { + draw: { + audio: "spyajun", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + locked: false, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ + content: function () { trigger.num++; }, }, - less:{ - onremove:true, - charlotte:true, - intro:{content:'手牌上限-#'}, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('spyajun_less'); - } + less: { + onremove: true, + charlotte: true, + intro: { content: "手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("spyajun_less"); + }, }, }, }, }, - spzundi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + spzundi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - filterTarget:true, - check:function(card){ - return 7-get.value(card); + filterCard: true, + filterTarget: true, + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.judge(); - 'step 1' - if(result.color=='black') target.draw(3); + ("step 1"); + if (result.color == "black") target.draw(3); else target.moveCard(); }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(target.canMoveCard(true)) return 3; + ai: { + order: 8, + result: { + target: function (player, target) { + if (target.canMoveCard(true)) return 3; return 1; }, }, }, }, //花蔓 - spxiangzhen:{ - trigger:{target:'useCardToBefore'}, - forced:true, - audio:2, - filter:function(event,player){ - return event.card.name=='nanman'; + spxiangzhen: { + trigger: { target: "useCardToBefore" }, + forced: true, + audio: 2, + filter: function (event, player) { + return event.card.name == "nanman"; }, - content:function(){ + content: function () { trigger.cancel(); }, - group:'spxiangzhen_draw', - subSkill:{ - draw:{ - audio:'spxiangzhen', - trigger:{global:'useCardAfter'}, - forced:true, - filter:function(event,player){ - return event.card.name=='nanman'&&game.hasPlayer2(function(current){ - return current.hasHistory('damage',function(evt){ - return evt.card==event.card; - }); - }); + group: "spxiangzhen_draw", + subSkill: { + draw: { + audio: "spxiangzhen", + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "nanman" && + game.hasPlayer2(function (current) { + return current.hasHistory("damage", function (evt) { + return evt.card == event.card; + }); + }) + ); }, - content:function(){ - 'step 0' - if(player!=trigger.player&&trigger.player.isIn()) game.asyncDraw([player,trigger.player].sortBySeat()); - else{ + content: function () { + "step 0"; + if (player != trigger.player && trigger.player.isIn()) + game.asyncDraw([player, trigger.player].sortBySeat()); + else { player.draw(); event.finish(); } - 'step 1' + ("step 1"); game.delayx(); }, }, }, }, - spfangzong:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return !player.hasSkill('spxizhan_spfangzong')&&player.countCards('h')0&&!player.hasSkill('spxizhan_spfangzong')&&player.inRange(target)) return false; + mod: { + playerEnabled: function (card, player, target) { + if ( + player == _status.currentPhase && + get.tag(card, "damage") > 0 && + !player.hasSkill("spxizhan_spfangzong") && + player.inRange(target) + ) + return false; }, - targetEnabled:function(card,player,target){ - if(get.tag(card,'damage')>0&&!target.hasSkill('spxizhan_spfangzong')&&player.inRange(target)) return false; + targetEnabled: function (card, player, target) { + if ( + get.tag(card, "damage") > 0 && + !target.hasSkill("spxizhan_spfangzong") && + player.inRange(target) + ) + return false; }, }, }, - spxizhan:{ - audio:4, - group:'spxizhan_effect', - locked:false, - subSkill:{ - spfangzong:{charlotte:true}, - effect:{ - trigger:{global:'phaseBegin'}, - filter:function(event,player){ - return player!=event.player; + spxizhan: { + audio: 4, + group: "spxizhan_effect", + locked: false, + subSkill: { + spfangzong: { charlotte: true }, + effect: { + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + return player != event.player; }, - forced:true, - logTarget:'player', - content:function(){ - 'step 0' - player.chooseToDiscard('he','嬉战:弃置一张牌或失去1点体力','根据弃置的牌对'+get.translation(trigger.player)+'视为使用如下牌:
    ♠,其使用【酒】;♥,你使用【无中生有】
    ♣,对其使用【铁索连环】;♦:对其使用火【杀】').set('ai',function(card){ - var player=_status.event.player,target=_status.event.getTrigger().player; - var suit=get.suit(card,player),list; - switch(suit){ - case 'spade':list=[{name:'jiu'},target,target];break; - case 'heart':list=[{name:'wuzhong'},player,player];break; - case 'club':list=[{name:'tiesuo'},player,target];break; - case 'diamond':list=[{name:'sha',nature:'fire'},player,target];break; - } - list[0].isCard=true; - var eff=0; - if(list[1].canUse(list[0],list[2],false)) eff=get.effect(list[2],list[0],list[1],player); - if(eff>=0||suit=='club') eff=Math.max(eff,5); - return eff*1.5-get.value(card); - }); - 'step 1' - if(result.bool){ - player.addTempSkill('spxizhan_spfangzong'); - var target=trigger.player,card=result.cards[0],suit=get.suit(card,player); - if(!lib.suit.includes(suit)||(!target||!target.isIn())&&suit!='heart') return; - game.broadcastAll(function(suit){ - if(lib.config.background_speak) game.playAudio('skill','spxizhan'+(4-lib.suit.indexOf(suit))); - },suit); - switch(suit){ - case 'spade': - target.chooseUseTarget('jiu',true); + forced: true, + logTarget: "player", + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + "嬉战:弃置一张牌或失去1点体力", + "根据弃置的牌对" + + get.translation(trigger.player) + + "视为使用如下牌:
    ♠,其使用【酒】;♥,你使用【无中生有】
    ♣,对其使用【铁索连环】;♦:对其使用火【杀】" + ) + .set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var suit = get.suit(card, player), + list; + switch (suit) { + case "spade": + list = [{ name: "jiu" }, target, target]; + break; + case "heart": + list = [{ name: "wuzhong" }, player, player]; + break; + case "club": + list = [{ name: "tiesuo" }, player, target]; + break; + case "diamond": + list = [{ name: "sha", nature: "fire" }, player, target]; + break; + } + list[0].isCard = true; + var eff = 0; + if (list[1].canUse(list[0], list[2], false)) + eff = get.effect(list[2], list[0], list[1], player); + if (eff >= 0 || suit == "club") eff = Math.max(eff, 5); + return eff * 1.5 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.addTempSkill("spxizhan_spfangzong"); + var target = trigger.player, + card = result.cards[0], + suit = get.suit(card, player); + if ( + !lib.suit.includes(suit) || + ((!target || !target.isIn()) && suit != "heart") + ) + return; + game.broadcastAll(function (suit) { + if (lib.config.background_speak) + game.playAudio("skill", "spxizhan" + (4 - lib.suit.indexOf(suit))); + }, suit); + switch (suit) { + case "spade": + target.chooseUseTarget("jiu", true); break; - case 'heart': - player.chooseUseTarget('wuzhong',true); + case "heart": + player.chooseUseTarget("wuzhong", true); break; - case 'club': - if(player.canUse('tiesuo',target)) player.useCard({ - name:'tiesuo', - isCard:true, - },target); + case "club": + if (player.canUse("tiesuo", target)) + player.useCard( + { + name: "tiesuo", + isCard: true, + }, + target + ); break; - case 'diamond': - if(player.canUse({ - name:'sha', - isCard:true, - nature:'fire', - },target,false)) player.useCard({ - name:'sha', - isCard:true, - nature:'fire', - },target,false); + case "diamond": + if ( + player.canUse( + { + name: "sha", + isCard: true, + nature: "fire", + }, + target, + false + ) + ) + player.useCard( + { + name: "sha", + isCard: true, + nature: "fire", + }, + target, + false + ); break; } - } - else player.loseHp(); + } else player.loseHp(); }, }, }, }, //高览 - spjungong:{ - enable:'phaseUse', - filter:function(event,player){ - var num=(player.getStat('skill').spjungong||0); - return (numplayer.hp) return num; - return [0,num]; + filterCard: true, + position: "he", + selectCard: function () { + var player = _status.event.player, + num = (player.getStat("skill").spjungong || 0) + 1; + if (ui.selected.cards.length || num > player.hp) return num; + return [0, num]; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - prompt:function(){ - var player=_status.event.player,num=get.cnNumber((player.getStat('skill').spjungong||0)+1); - return '弃置'+num+'张牌或失去'+num+'点体力,视为使用杀'; + prompt: function () { + var player = _status.event.player, + num = get.cnNumber((player.getStat("skill").spjungong || 0) + 1); + return "弃置" + num + "张牌或失去" + num + "点体力,视为使用杀"; }, - content:function(){ - 'step 0' - if(!cards.length) player.loseHp(player.getStat('skill').spjungong||1); - player.useCard({name:'sha',isCard:true},target,false); - 'step 1' - if(player.hasHistory('sourceDamage',function(evt){ - var card=evt.card; - if(!card||card.name!='sha') return false; - var evtx=evt.getParent('useCard'); - return evtx.card==card&&evtx.getParent()==event; - })) player.addTempSkill('spjungong_block'); + content: function () { + "step 0"; + if (!cards.length) player.loseHp(player.getStat("skill").spjungong || 1); + player.useCard({ name: "sha", isCard: true }, target, false); + ("step 1"); + if ( + player.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) + player.addTempSkill("spjungong_block"); }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'},player)+1; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) + 1; }, - result:{ - target:function(player,target){ - if(!ui.selected.cards.length) return 0; - return get.effect(target,{name:'sha'},player,target); + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + return get.effect(target, { name: "sha" }, player, target); }, }, }, - subSkill:{block:{charlotte:true}}, + subSkill: { block: { charlotte: true } }, }, - spdengli:{ - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + spdengli: { + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - frequent:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.player.hp==event.target.hp; + frequent: true, + filter: function (event, player) { + return event.card.name == "sha" && event.player.hp == event.target.hp; }, - content:function(){ + content: function () { player.draw(); }, - ai:{ - effect:{ - player:function(card,player,target){ - var hp=player.hp,evt=_status.event; - if(evt.name=='chooseToUse'&&evt.player==player&&evt.skill=='spjungong'&&!ui.selected.cards.length) hp-=((player.getStat('skill').spjungong||0)+1); - if(card&&card.name=='sha'&&hp==target.hp) return [1,0.3]; + ai: { + effect: { + player: function (card, player, target) { + var hp = player.hp, + evt = _status.event; + if ( + evt.name == "chooseToUse" && + evt.player == player && + evt.skill == "spjungong" && + !ui.selected.cards.length + ) + hp -= (player.getStat("skill").spjungong || 0) + 1; + if (card && card.name == "sha" && hp == target.hp) return [1, 0.3]; }, - target:function(card,player,target){ - if(card&&card.name=='sha'&&player.hp==target.hp) return [1,0.3]; + target: function (card, player, target) { + if (card && card.name == "sha" && player.hp == target.hp) return [1, 0.3]; }, }, }, }, //孙翊 - zaoli:{ - trigger:{player:'phaseBegin'}, - audio:2, - forced:true, - filter:function(event,player){ - return player.countMark('zaoli')>0; + zaoli: { + trigger: { player: "phaseBegin" }, + audio: 2, + forced: true, + filter: function (event, player) { + return player.countMark("zaoli") > 0; }, - content:function(){ - 'step 0' - event.num=player.storage.zaoli; - player.removeMark('zaoli',event.num); - if(player.countCards('he')>0){ - player.chooseToDiscard(true,'he',[1,Infinity],'躁厉:弃置至少一张牌').set('ai',function(card){ - if(card.hasGaintag('zaoli')) return 1; - return 5-get.value(card); - }); + content: function () { + "step 0"; + event.num = player.storage.zaoli; + player.removeMark("zaoli", event.num); + if (player.countCards("he") > 0) { + player + .chooseToDiscard(true, "he", [1, Infinity], "躁厉:弃置至少一张牌") + .set("ai", function (card) { + if (card.hasGaintag("zaoli")) return 1; + return 5 - get.value(card); + }); } - 'step 1' - if(result.bool) num+=result.cards.length; - if(event.num>2) player.loseHp(); + ("step 1"); + if (result.bool) num += result.cards.length; + if (event.num > 2) player.loseHp(); player.draw(num); }, - mod:{ - cardEnabled2:function(card,player){ - if(player==_status.currentPhase&&get.itemtype(card)=='card'&&card.hasGaintag('zaoli')) return false; + mod: { + cardEnabled2: function (card, player) { + if ( + player == _status.currentPhase && + get.itemtype(card) == "card" && + card.hasGaintag("zaoli") + ) + return false; }, }, - group:['zaoli_add','zaoli_count'], - init:function(player){ - if(player==_status.currentPhase){ - var hs=player.getCards('h'); - player.getHistory('gain',function(evt){ + group: ["zaoli_add", "zaoli_count"], + init: function (player) { + if (player == _status.currentPhase) { + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { hs.removeArray(evt.cards); }); - if(hs.length) player.addGaintag(hs,'zaoli'); + if (hs.length) player.addGaintag(hs, "zaoli"); } }, - onremove:function(player){ - player.removeGaintag('zaoli'); + onremove: function (player) { + player.removeGaintag("zaoli"); delete player.storage.zaoli; }, - intro:{content:'mark'}, - subSkill:{ - add:{ - audio:'zaoli', - trigger:{player:['useCard','respond']}, - forced:true, - filter:function(event,player){ - return player.countMark('zaoli')<4&&player.hasHistory('lose',function(evt){ - return evt.hs&&evt.hs.length>0&&evt.getParent()==event; - }); + intro: { content: "mark" }, + subSkill: { + add: { + audio: "zaoli", + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + return ( + player.countMark("zaoli") < 4 && + player.hasHistory("lose", function (evt) { + return evt.hs && evt.hs.length > 0 && evt.getParent() == event; + }) + ); }, - content:function(){ - player.addMark('zaoli',1); + content: function () { + player.addMark("zaoli", 1); }, }, - count:{ - trigger:{global:'phaseBeginStart'}, - forced:true, - firstDo:true, - silent:true, - filter:function(event,player){ - if(player==event.player) return player.countCards('h')>0; - return player.hasCard(function(card){ - return card.hasGaintag('zaoli'); - },'h'); + count: { + trigger: { global: "phaseBeginStart" }, + forced: true, + firstDo: true, + silent: true, + filter: function (event, player) { + if (player == event.player) return player.countCards("h") > 0; + return player.hasCard(function (card) { + return card.hasGaintag("zaoli"); + }, "h"); }, - content:function(){ - if(player==trigger.player){ - player.addGaintag(player.getCards('h'),'zaoli'); - } - else player.removeGaintag('zaoli'); + content: function () { + if (player == trigger.player) { + player.addGaintag(player.getCards("h"), "zaoli"); + } else player.removeGaintag("zaoli"); }, }, }, }, //王双 - yiyong:{ - audio:2, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&& - event.source&&event.source.isIn()&&player!=event.source - &&event.cards.filterInD().length>0&&player.getEquips(1).length>0; + yiyong: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.source && + event.source.isIn() && + player != event.source && + event.cards.filterInD().length > 0 && + player.getEquips(1).length > 0 + ); }, - check:function(event,player){ - var card={ - name:'sha', - cards:event.cards.filterInD(), - },target=event.source; - return !player.canUse(card,target,false)||get.effect(target,card,player,player)>0; + check: function (event, player) { + var card = { + name: "sha", + cards: event.cards.filterInD(), + }, + target = event.source; + return ( + !player.canUse(card, target, false) || get.effect(target, card, player, player) > 0 + ); }, - content:function(){ - 'step 0' - event.cards=trigger.cards.filterInD(); - player.gain(event.cards,'gain2'); - 'step 1' - var target=trigger.source,hs=player.getCards('h'); - if(target&&target.isIn()&&hs.length>=cards.length&&cards.filter(function(i){ - return hs.includes(i); - }).length==cards.length&&player.canUse({name:'sha',cards:cards},target,false)){ - var next=player.useCard({name:'sha'},cards,target,false); - if(!target.getEquips(1).length) next.baseDamage=2; + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD(); + player.gain(event.cards, "gain2"); + ("step 1"); + var target = trigger.source, + hs = player.getCards("h"); + if ( + target && + target.isIn() && + hs.length >= cards.length && + cards.filter(function (i) { + return hs.includes(i); + }).length == cards.length && + player.canUse({ name: "sha", cards: cards }, target, false) + ) { + var next = player.useCard({ name: "sha" }, cards, target, false); + if (!target.getEquips(1).length) next.baseDamage = 2; } }, }, - shanxie:{ - audio:2, - enable:'phaseUse', - usable:1, + shanxie: { + audio: 2, + enable: "phaseUse", + usable: 1, //filterTarget:function(card,player,target){ // return target!=player&&target.getEquip(1); //}, //selectTarget:[0,1], - content:function(){ - var card=get.cardPile2(function(card){ - return get.subtype(card)=='equip1'; + content: function () { + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1"; }); - if(card) player.gain(card,'gain2'); - else{ - var targets=game.filterPlayer(function(current){ - return current.getEquips(1).length>0; + if (card) player.gain(card, "gain2"); + else { + var targets = game.filterPlayer(function (current) { + return current.getEquips(1).length > 0; }); - if(targets.length){ - var target=targets.randomGet(); - player.gain(target.getEquips(1),target,'give','bySelf'); + if (targets.length) { + var target = targets.randomGet(); + player.gain(target.getEquips(1), target, "give", "bySelf"); } } }, - content_old:function(){ - 'step 0' - if(!target){ - var card=get.cardPile2(function(card){ - return get.subtype(card)=='equip1'; + content_old: function () { + "step 0"; + if (!target) { + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1"; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); event.finish(); + } else { + var card = target.getEquip(1); + if (card) { + event.card = card; + player.gain(card, target, "give"); + } else event.finish(); } - else{ - var card=target.getEquip(1); - if(card){ - event.card=card; - player.gain(card,target,'give'); - } - else event.finish(); - } - 'step 1' - if(player.getCards('h').includes(card)&&get.type(card,player)=='equip'&&player.hasUseTarget(card)) player.chooseUseTarget(card,true,'nopopup'); - 'step 2' - var hs=target.getCards('h',function(card){ - return target.canUse(get.autoViewAs({name:'sha'},[card]),player,false); + ("step 1"); + if ( + player.getCards("h").includes(card) && + get.type(card, player) == "equip" && + player.hasUseTarget(card) + ) + player.chooseUseTarget(card, true, "nopopup"); + ("step 2"); + var hs = target.getCards("h", function (card) { + return target.canUse(get.autoViewAs({ name: "sha" }, [card]), player, false); }); - if(hs.length){ - if(hs.length==1) event._result={bool:true,cards:hs}; - else target.chooseCard('h',true,'将一张牌当做【杀】对'+get.translation(player)+'使用',function(card){ - return _status.event.cards.includes(card); - }).set('cards',hs).set('ai',function(card){ - return get.effect(_status.event.getParent().player,get.autoViewAs({name:'sha',},[card]),_status.event.player) - }) - } - else event.finish(); - 'step 3' - if(result.bool) target.useCard({name:'sha'},result.cards,player,false); + if (hs.length) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else + target + .chooseCard( + "h", + true, + "将一张牌当做【杀】对" + get.translation(player) + "使用", + function (card) { + return _status.event.cards.includes(card); + } + ) + .set("cards", hs) + .set("ai", function (card) { + return get.effect( + _status.event.getParent().player, + get.autoViewAs({ name: "sha" }, [card]), + _status.event.player + ); + }); + } else event.finish(); + ("step 3"); + if (result.bool) target.useCard({ name: "sha" }, result.cards, player, false); }, - ai:{ - order:9, - result:{player:1}, + ai: { + order: 9, + result: { player: 1 }, }, - group:['shanxie_exclude','shanxie_shan'], - subSkill:{ - exclude:{ - trigger:{global:'useCard'}, - forced:true, - locked:false, - filter:function(event,player){ - if(event.card.name!='shan'||event.getParent(2).player!=player) return false; - var num=get.number(event.card); - return !num||num<=player.getAttackRange()*2; + group: ["shanxie_exclude", "shanxie_shan"], + subSkill: { + exclude: { + trigger: { global: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if (event.card.name != "shan" || event.getParent(2).player != player) + return false; + var num = get.number(event.card); + return !num || num <= player.getAttackRange() * 2; }, - logTarget:'player', - content:function(){ - trigger.all_excluded=true; + logTarget: "player", + content: function () { + trigger.all_excluded = true; }, - sub:true + sub: true, }, - shan:{ - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.target.isAlive()&&event.card.name=='sha'; + shan: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.target.isAlive() && event.card.name == "sha"; }, - silent:true, - content:function(){ - trigger.target.addTempSkill('shanxie_banned'); - trigger.target.storage.shanxie_banned={ - card:trigger.card, - num:player.getAttackRange()*2 + silent: true, + content: function () { + trigger.target.addTempSkill("shanxie_banned"); + trigger.target.storage.shanxie_banned = { + card: trigger.card, + num: player.getAttackRange() * 2, }; }, - sub:true + sub: true, }, - banned:{ - init:function(player){ - player.storage.shanxie_banned={}; + banned: { + init: function (player) { + player.storage.shanxie_banned = {}; }, - onremove:function(player){ + onremove: function (player) { delete player.storage.shanxie_banned; }, - trigger:{global:'useCardEnd'}, - filter:function(event,player){ - return event.card==player.storage.shanxie_banned.card; + trigger: { global: "useCardEnd" }, + filter: function (event, player) { + return event.card == player.storage.shanxie_banned.card; }, - silent:true, - content:function(){ - player.removeSkill('shanxie_banned'); + silent: true, + content: function () { + player.removeSkill("shanxie_banned"); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(get.name(card)=='shan'){ - let num=get.number(card); - if(!num||num<=player.storage.shanxie_banned.num) return 'zeroplayertarget'; + ai: { + effect: { + player: function (card, player, target) { + if (get.name(card) == "shan") { + let num = get.number(card); + if (!num || num <= player.storage.shanxie_banned.num) + return "zeroplayertarget"; } - } - } - } + }, + }, + }, }, }, }, //吴景流兵 - liubing:{ - trigger:{player:'useCard1'}, - forced:true, - filter:function(event,player){ - if(event.card.name!='sha'||!event.cards||!event.cards.length) return false; - var evt=event.getParent('phaseUse'); - return evt&&evt.player==player&&player.getHistory('useCard',function(evt2){ - return evt2.card.name=='sha'&&evt2.cards&&evt2.cards.length&&evt2.getParent('phaseUse')==evt; - }).indexOf(event)==0; + liubing: { + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha" || !event.cards || !event.cards.length) return false; + var evt = event.getParent("phaseUse"); + return ( + evt && + evt.player == player && + player + .getHistory("useCard", function (evt2) { + return ( + evt2.card.name == "sha" && + evt2.cards && + evt2.cards.length && + evt2.getParent("phaseUse") == evt + ); + }) + .indexOf(event) == 0 + ); }, - content:function(){ - game.log(player,'将',trigger.card,'的花色改为','#y♦'); - trigger.card.suit='diamond'; - trigger.card.color='red'; + content: function () { + game.log(player, "将", trigger.card, "的花色改为", "#y♦"); + trigger.card.suit = "diamond"; + trigger.card.color = "red"; }, - group:'liubing_gain', - subSkill:{ - gain:{ - trigger:{global:'useCardAfter'}, - forced:true, - audio:'liubing', - filter:function(event,player){ - return event.player!=player&&event.card.isCard&&event.card.name=='sha'&& - get.color(event.card)=='black'&&event.cards.filterInD().length>0&& - event.player.isPhaseUsing()&&!event.player.hasHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }); + group: "liubing_gain", + subSkill: { + gain: { + trigger: { global: "useCardAfter" }, + forced: true, + audio: "liubing", + filter: function (event, player) { + return ( + event.player != player && + event.card.isCard && + event.card.name == "sha" && + get.color(event.card) == "black" && + event.cards.filterInD().length > 0 && + event.player.isPhaseUsing() && + !event.player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) + ); }, - logTarget:'player', - content:function(){ - player.gain(trigger.cards.filterInD(),'gain2'); + logTarget: "player", + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); }, }, }, }, //新刘璋 - jutu:{ - audio:'xiusheng', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.storage.yaohu&&game.hasPlayer(function(current){ - return current.group==player.storage.yaohu; - }); + jutu: { + audio: "xiusheng", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.storage.yaohu && + game.hasPlayer(function (current) { + return current.group == player.storage.yaohu; + }) + ); }, - content:function(){ - 'step 0' - var cards=player.getExpansions('jutu'); - if(cards.length>0){ - player.gain(cards,'gain2'); + content: function () { + "step 0"; + var cards = player.getExpansions("jutu"); + if (cards.length > 0) { + player.gain(cards, "gain2"); } - 'step 1' - event.num=game.countPlayer(function(current){ - return current.group==player.storage.yaohu; + ("step 1"); + event.num = game.countPlayer(function (current) { + return current.group == player.storage.yaohu; }); - player.draw(event.num+1); - if(!event.num) event.finish(); - 'step 2' - var he=player.getCards('he'); - if(!he.length) event.finish(); - else if(he.length0) return 1; - return 1.3; - }); - } - list.sort(function(a,b){ - return getn(b)-getn(a); - }); - return list[0]; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('yaohu',game.filterPlayer(function(current){ - return current.group==result.control; - })); - game.log(player,'选择了','#y'+get.translation(result.control+2)) - player.storage.yaohu=result.control; - player.markSkill('yaohu'); + if (!player.hasSkill("yaohu")) list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "邀虎:请选择一个势力") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var getn = function (group) { + return game.countPlayer(function (current) { + if (current.group != group) return false; + if (player == current) return 2; + if (get.attitude(current, player) > 0) return 1; + return 1.3; + }); + }; + list.sort(function (a, b) { + return getn(b) - getn(a); + }); + return list[0]; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill( + "yaohu", + game.filterPlayer(function (current) { + return current.group == result.control; + }) + ); + game.log(player, "选择了", "#y" + get.translation(result.control + 2)); + player.storage.yaohu = result.control; + player.markSkill("yaohu"); } }, - ai:{combo:'jutu'}, - intro:{content:'已选择了$势力'}, - group:'yaohu_gain', - subSkill:{ - round:{}, - gain:{ - audio:'yinlang', - trigger:{global:'phaseUseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return event.player!=player&&event.player.group==player.storage.yaohu&&event.player.isIn()&&player.getExpansions('jutu').length>0; + ai: { combo: "jutu" }, + intro: { content: "已选择了$势力" }, + group: "yaohu_gain", + subSkill: { + round: {}, + gain: { + audio: "yinlang", + trigger: { global: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + event.player != player && + event.player.group == player.storage.yaohu && + event.player.isIn() && + player.getExpansions("jutu").length > 0 + ); }, - logTarget:'player', - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - target.chooseButton(['选择获得一张“生”',player.getExpansions('jutu')],true).set('ai',function(button){ - return get.value(button.link,player); - }); - 'step 1' - if(result.bool){ - target.gain(result.links,'give',player,'bySelf'); - } - 'step 2' - if(game.hasPlayer(function(current){ - return current!=player&¤t!=target; - })){ - player.chooseTarget(true,'选择'+get.translation(target)+'使用【杀】的目标',function(card,player,target){ - return target!=player&&target!=_status.event.source; - }).set('source',target).set('ai',function(target){ - var evt=_status.event; - return get.effect(target,{name:'sha'},evt.source,evt.player); + logTarget: "player", + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target + .chooseButton(["选择获得一张“生”", player.getExpansions("jutu")], true) + .set("ai", function (button) { + return get.value(button.link, player); }); + ("step 1"); + if (result.bool) { + target.gain(result.links, "give", player, "bySelf"); } - else{ - event._result={bool:false}; + ("step 2"); + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) { + player + .chooseTarget( + true, + "选择" + get.translation(target) + "使用【杀】的目标", + function (card, player, target) { + return target != player && target != _status.event.source; + } + ) + .set("source", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + } else { + event._result = { bool: false }; event.goto(4); } - 'step 3' - var target2=result.targets[0]; - player.line(target2,'green'); - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'对'+get.translation(target2)+'使用一张杀,否则交给其两张牌').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',target2).set('addCount',false); - 'step 4' - if(!result.bool){ - var hs=target.getCards('he'); - if(!hs.length) event.finish(); - else if(hs.length<=2) event._result={bool:true,cards:hs}; - else target.chooseCard(2,true,'交给'+get.translation(player)+'两张牌','he'); - } - else event.finish(); - 'step 5' - if(result.bool) target.give(result.cards,player); + ("step 3"); + var target2 = result.targets[0]; + player.line(target2, "green"); + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "对" + get.translation(target2) + "使用一张杀,否则交给其两张牌") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target2) + .set("addCount", false); + ("step 4"); + if (!result.bool) { + var hs = target.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else + target.chooseCard( + 2, + true, + "交给" + get.translation(player) + "两张牌", + "he" + ); + } else event.finish(); + ("step 5"); + if (result.bool) target.give(result.cards, player); }, }, }, }, - rehuaibi:{ - audio:'huaibi', - zhuSkill:true, - mod:{ - maxHandcard:function(player,num){ - if(player.storage.yaohu&&player.hasZhuSkill('rehuaibi')) return num+game.countPlayer(function(current){ - return current.group==player.storage.yaohu; - }); + rehuaibi: { + audio: "huaibi", + zhuSkill: true, + mod: { + maxHandcard: function (player, num) { + if (player.storage.yaohu && player.hasZhuSkill("rehuaibi")) + return ( + num + + game.countPlayer(function (current) { + return current.group == player.storage.yaohu; + }) + ); }, }, - ai:{combo:'yaohu'}, + ai: { combo: "yaohu" }, }, //宗预 - zhibian:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer((current)=>(current!=player&&player.canCompare(current))); + zhibian: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer((current) => current != player && player.canCompare(current)); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhibian'),'与一名其他角色进行拼点',function(card,player,target){ - return target!=player&&player.canCompare(target); - }).set('ai',function(target){ - if(!_status.event.goon) return false; - var att=get.attitude(player,target); - if(att<0&&target.countCards('e',function(card){ - return player.canEquip(card)&&get.effect(player,card,target,player)>0; - })) return -att/Math.sqrt(target.countCards('h')); - if(!player.isDamaged()) return false; - if(att<=0) return (1-att)/Math.sqrt(target.countCards('h')); - return Math.sqrt(2/att*Math.sqrt(target.countCards('h'))); - }).set('goon',function(){ - if(!player.hasCard(function(card){ - return (card.number>=14-player.hp&&get.value(card)<=5); - })) return false; - return true; - }()); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('zhibian',target); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhibian"), + "与一名其他角色进行拼点", + function (card, player, target) { + return target != player && player.canCompare(target); + } + ) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(player, target); + if ( + att < 0 && + target.countCards("e", function (card) { + return ( + player.canEquip(card) && get.effect(player, card, target, player) > 0 + ); + }) + ) + return -att / Math.sqrt(target.countCards("h")); + if (!player.isDamaged()) return false; + if (att <= 0) return (1 - att) / Math.sqrt(target.countCards("h")); + return Math.sqrt((2 / att) * Math.sqrt(target.countCards("h"))); + }) + .set( + "goon", + (function () { + if ( + !player.hasCard(function (card) { + return card.number >= 14 - player.hp && get.value(card) <= 5; + }) + ) + return false; + return true; + })() + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhibian", target); player.chooseToCompare(target); - } - else event.finish(); - 'step 2' - if(result.bool){ - var list=[],list2=[ - '将'+get.translation(target)+'装备区/判定区中的一张牌移动到你的区域内', - '回复1点体力', - '背水!跳过摸牌阶段,并依次执行上述所有选项', - ]; - if(target.hasCard(function(card){ - return player.canEquip(card); - },'e')||target.hasCard(function(card){ - return player.canAddJudge(card); - },'j')){ - list.push('选项一'); + } else event.finish(); + ("step 2"); + if (result.bool) { + var list = [], + list2 = [ + "将" + get.translation(target) + "装备区/判定区中的一张牌移动到你的区域内", + "回复1点体力", + "背水!跳过摸牌阶段,并依次执行上述所有选项", + ]; + if ( + target.hasCard(function (card) { + return player.canEquip(card); + }, "e") || + target.hasCard(function (card) { + return player.canAddJudge(card); + }, "j"); + ) { + list.push("选项一"); } - if(player.isDamaged()){ - list.push('选项二'); + if (player.isDamaged()) { + list.push("选项二"); } - if(list.includes('选项一')) list.push('背水!') - list.push('cancel2'); - player.chooseControl(list).set('choiceList',list2).set('ai',function(target){ - if(player.isDamaged()&&(player.hp<=2||!target.countCards('e',function(card){ - return player.canEquip(card)&&get.value(card,target)>=4+player.getDamagedHp(); - }))) return 1; - return 0; - }); - } - else{ + if (list.includes("选项一")) list.push("背水!"); + list.push("cancel2"); + player + .chooseControl(list) + .set("choiceList", list2) + .set("ai", function (target) { + if ( + player.isDamaged() && + (player.hp <= 2 || + !target.countCards("e", function (card) { + return ( + player.canEquip(card) && + get.value(card, target) >= 4 + player.getDamagedHp() + ); + })) + ) + return 1; + return 0; + }); + } else { player.loseHp(); event.finish(); } - 'step 3' - if(result.control!='cancel2'){ - event.control=result.control; - if(result.control=='选项一'||result.control=='背水!'){ - player.choosePlayerCard(target,'ej',true).set('ai',get.buttonValue); - } - else event.goto(5); - } - else event.finish(); - 'step 4' - if(result.bool){ - var card=result.cards[0]; - target.$give(card,player,false); + ("step 3"); + if (result.control != "cancel2") { + event.control = result.control; + if (result.control == "选项一" || result.control == "背水!") { + player.choosePlayerCard(target, "ej", true).set("ai", get.buttonValue); + } else event.goto(5); + } else event.finish(); + ("step 4"); + if (result.bool) { + var card = result.cards[0]; + target.$give(card, player, false); game.delayx(); - if(get.position(card)=='e') player.equip(card); + if (get.position(card) == "e") player.equip(card); else player.addJudge(card); } - 'step 5' - if(event.control=='选项二'||event.control=='背水!'){ + ("step 5"); + if (event.control == "选项二" || event.control == "背水!") { player.recover(); } - if(event.control=='背水!') player.skip('phaseDraw'); + if (event.control == "背水!") player.skip("phaseDraw"); }, }, - yuyan:{ - audio:2, - trigger:{target:'useCardToTarget'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return event.card.name=='sha'&&event.card.isCard&&typeof get.number(event.card)=='number'&&player.hp=13||!trigger.player.hasCard(function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.number(card)>num; - },'he')) event._result={bool:false}; - else trigger.player.chooseCard('he',function(card){ - return get.number(card)>_status.event.number; - },'交给'+get.translation(player)+'一张点数大于'+get.cnNumber(num)+'的牌,或令'+get.translation(trigger.card)+'对其无效').set('number',num).set('',function(card){ - if(card.name=='shan'||card.name=='tao'||card.name=='jiu') return false; - return 6-get.value(card); - }); - 'step 1' - if(result.bool){ - trigger.player.give(result.cards,player); - } - else{ + content: function () { + "step 0"; + var num = get.number(trigger.card); + if ( + num >= 13 || + !trigger.player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.number(card) > num; + }, "he") + ) + event._result = { bool: false }; + else + trigger.player + .chooseCard( + "he", + function (card) { + return get.number(card) > _status.event.number; + }, + "交给" + + get.translation(player) + + "一张点数大于" + + get.cnNumber(num) + + "的牌,或令" + + get.translation(trigger.card) + + "对其无效" + ) + .set("number", num) + .set("", function (card) { + if (card.name == "shan" || card.name == "tao" || card.name == "jiu") + return false; + return 6 - get.value(card); + }); + ("step 1"); + if (result.bool) { + trigger.player.give(result.cards, player); + } else { trigger.targets.remove(player); trigger.getParent().triggeredTargets2.remove(player); trigger.untrigger(); } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'&&player.hp>target.hp&&get.attitude(player,target)<0){ - var num=get.number(card); - if(typeof num!='number') return false; - var bs=player.getCards('h',function(cardx){ - return (get.number(cardx)>num&&!['','',''].includes(cardx.name)); + ai: { + effect: { + target: function (card, player, target, current) { + if ( + card.name == "sha" && + player.hp > target.hp && + get.attitude(player, target) < 0 + ) { + var num = get.number(card); + if (typeof num != "number") return false; + var bs = player.getCards("h", function (cardx) { + return get.number(cardx) > num && !["", "", ""].includes(cardx.name); }); - if(bs.length<2) return 0; - if(player.hasSkill('jiu')||player.hasSkill('tianxianjiu')) return; - if(bs.length<=2){ - for(var i=0;ievent.target.hp&&event.targets.length==1&&event.player.countCards('h')>0&&!event.target.isDying()&& - !event.player.hasSkillTag('noCompareTarget')&&!player.hasSkillTag('noCompareSource')); + qingjue: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + logTarget: "player", + round: 1, + filter: function (event, player) { + return ( + event.player != player && + event.target != player && + event.player != event.target && + event.player.hp > event.target.hp && + event.targets.length == 1 && + event.player.countCards("h") > 0 && + !event.target.isDying() && + !event.player.hasSkillTag("noCompareTarget") && + !player.hasSkillTag("noCompareSource") + ); }, - check:function(event,player){ - var target=event.target,source=event.player; - var eff1=get.effect(target,event.card,source,player); - if(eff1>=0) return false; - var eff2=get.effect(player,event.card,source,player); - if(eff2>=0) return true; - if(eff2>eff1/3) return player.hasCard(function(card){ - return (card.number>=9&&get.value(card)<=5)||get.value(card)<=3; - }); - if(eff2>eff1/2) return player.hasCard(function(card){ - return card.number>10&&get.value(card)<=5; - }); - return player.hasCard(function(card){ - return card.number>11&&get.value(card)<=5; + check: function (event, player) { + var target = event.target, + source = event.player; + var eff1 = get.effect(target, event.card, source, player); + if (eff1 >= 0) return false; + var eff2 = get.effect(player, event.card, source, player); + if (eff2 >= 0) return true; + if (eff2 > eff1 / 3) + return player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }); + if (eff2 > eff1 / 2) + return player.hasCard(function (card) { + return card.number > 10 && get.value(card) <= 5; + }); + return player.hasCard(function (card) { + return card.number > 11 && get.value(card) <= 5; }); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.canCompare(trigger.player)) player.chooseToCompare(trigger.player); + ("step 1"); + if (player.canCompare(trigger.player)) player.chooseToCompare(trigger.player); else event.finish(); - 'step 2' + ("step 2"); trigger.targets.remove(trigger.target); trigger.getParent().triggeredTargets1.remove(trigger.target); trigger.untrigger(); - if(!result.bool) trigger.targets.push(player); + if (!result.bool) trigger.targets.push(player); }, }, - fengjie:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return game.hasPlayer((current)=>(current!=player)); + fengjie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return game.hasPlayer((current) => current != player); }, - content:function(){ - 'step 0' - player.chooseTarget('请选择【奉节】的目标','选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸至四张)或弃置至与其体力值相等。',lib.filter.notMe,true).set('ai',function(target){ - return (target.hp-player.countCards('h'))/get.threaten(target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - game.log(player,'选择了',target); - player.storage.fengjie2=target; - player.addTempSkill('fengjie2',{player:'phaseBegin'}); + content: function () { + "step 0"; + player + .chooseTarget( + "请选择【奉节】的目标", + "选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸至四张)或弃置至与其体力值相等。", + lib.filter.notMe, + true + ) + .set("ai", function (target) { + return (target.hp - player.countCards("h")) / get.threaten(target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(player, "选择了", target); + player.storage.fengjie2 = target; + player.addTempSkill("fengjie2", { player: "phaseBegin" }); game.delayx(); } }, }, - fengjie2:{ - audio:'fengjie', - trigger:{global:'phaseJieshuBegin'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - if(!player.storage.fengjie2||!player.storage.fengjie2.isIn()) return false; - var num1=player.countCards('h'),num2=player.storage.fengjie2.hp; - return num1!=num2; + fengjie2: { + audio: "fengjie", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + if (!player.storage.fengjie2 || !player.storage.fengjie2.isIn()) return false; + var num1 = player.countCards("h"), + num2 = player.storage.fengjie2.hp; + return num1 != num2; }, - logTarget:(event,player)=>player.storage.fengjie2, - content:function(){ - var num1=player.countCards('h'),num2=player.storage.fengjie2.hp; - if(num1>num2) player.chooseToDiscard('h',true,num1-num2); - else player.drawTo(Math.min(num1+4,num2)); + logTarget: (event, player) => player.storage.fengjie2, + content: function () { + var num1 = player.countCards("h"), + num2 = player.storage.fengjie2.hp; + if (num1 > num2) player.chooseToDiscard("h", true, num1 - num2); + else player.drawTo(Math.min(num1 + 4, num2)); }, }, //陈武董袭 - spyilie:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseControl('选项一','选项二','背水!','cancel2').set('choiceList',[ - '本阶段内使用【杀】的次数上限+1', - '本回合内使用【杀】被【闪】抵消时摸一张牌', - '背水!失去1点体力并依次执行上述所有选项', - ]).set('ai',function(){ - if(player.countCards('hs',function(card){ - return get.name(card)=='sha'&&player.hasValueTarget(card); - })>player.getCardUsable({name:'sha'})) return 0; - return 1; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('spyilie'); - game.log(player,'选择了','#g【毅烈】','的','#y'+result.control); - if(result.index%2==0) player.addTempSkill('spyilie_add','phaseUseEnd'); - if(result.index>0) player.addTempSkill('spyilie_miss'); - if(result.index==2) player.loseHp(); + spyilie: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("选项一", "选项二", "背水!", "cancel2") + .set("choiceList", [ + "本阶段内使用【杀】的次数上限+1", + "本回合内使用【杀】被【闪】抵消时摸一张牌", + "背水!失去1点体力并依次执行上述所有选项", + ]) + .set("ai", function () { + if ( + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) > player.getCardUsable({ name: "sha" }) + ) + return 0; + return 1; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("spyilie"); + game.log(player, "选择了", "#g【毅烈】", "的", "#y" + result.control); + if (result.index % 2 == 0) player.addTempSkill("spyilie_add", "phaseUseEnd"); + if (result.index > 0) player.addTempSkill("spyilie_miss"); + if (result.index == 2) player.loseHp(); } }, - subSkill:{ - add:{ - charlotte:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + subSkill: { + add: { + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, }, - miss:{ - charlotte:true, - audio:'spyilie', - trigger:{player:'shaMiss'}, - forced:true, - content:function(){ + miss: { + charlotte: true, + audio: "spyilie", + trigger: { player: "shaMiss" }, + forced: true, + content: function () { player.draw(); }, }, }, }, - spfenming:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:(event,player)=>game.hasPlayer((current)=>lib.skill.spfenming.filterTarget(null,player,current)), - filterTarget:function(card,player,target){ - if(target.hp>player.hp) return false; - return !target.isLinked()||target.hasCard(function(card){ - return lib.filter.canBeGained(card,player,target); - },target==player?'e':'he'); + spfenming: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: (event, player) => + game.hasPlayer((current) => lib.skill.spfenming.filterTarget(null, player, current)), + filterTarget: function (card, player, target) { + if (target.hp > player.hp) return false; + return ( + !target.isLinked() || + target.hasCard( + function (card) { + return lib.filter.canBeGained(card, player, target); + }, + target == player ? "e" : "he" + ) + ); }, - content:function(){ - if(!target.isLinked()) target.link(); - else player.gainPlayerCard(target,target==player?'e':'he',true); + content: function () { + if (!target.isLinked()) target.link(); + else player.gainPlayerCard(target, target == player ? "e" : "he", true); }, - ai:{ - order:7, - result:{ - player:function(player,target){ - if(!target.isLinked()) return get.effect(target,{name:'tiesuo'},player,player); - return get.effect(target,{name:'shunshou_copy2'},player,player); + ai: { + order: 7, + result: { + player: function (player, target) { + if (!target.isLinked()) + return get.effect(target, { name: "tiesuo" }, player, player); + return get.effect(target, { name: "shunshou_copy2" }, player, player); }, }, }, }, //周处 - rechuhai:{ - audio:'chuhai', - dutySkill:true, - locked:false, - group:['rechuhai_add','rechuhai_achieve','rechuhai_fail','rechuhai_chuhai'], - derivation:'zhangming', - subSkill:{ - chuhai:{ - audio:['chuhai',2], - inherit:'chuhai', - prompt:'与一名其他角色进行拼点', + rechuhai: { + audio: "chuhai", + dutySkill: true, + locked: false, + group: ["rechuhai_add", "rechuhai_achieve", "rechuhai_fail", "rechuhai_chuhai"], + derivation: "zhangming", + subSkill: { + chuhai: { + audio: ["chuhai", 2], + inherit: "chuhai", + prompt: "与一名其他角色进行拼点", }, - add:{ - trigger:{player:'compare'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.getParent().name=='rechuhai_chuhai'&&event.num1<13&&player.countCards('e')<4; + add: { + trigger: { player: "compare" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.getParent().name == "rechuhai_chuhai" && + event.num1 < 13 && + player.countCards("e") < 4 + ); }, - content:function(){ - var num=4-player.countCards('e'); - game.log(player,'的拼点牌点数+',num); - trigger.num1=Math.min(13,trigger.num1+num); + content: function () { + var num = 4 - player.countCards("e"); + game.log(player, "的拼点牌点数+", num); + trigger.num1 = Math.min(13, trigger.num1 + num); }, }, - achieve:{ - audio:['chuhai',2], - trigger:{player:'equipAfter'}, - forced:true, - skillAnimation:true, - animationColor:'wood', - filter:function(event,player){ - return player.countCards('e')>2; + achieve: { + audio: ["chuhai", 2], + trigger: { player: "equipAfter" }, + forced: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return player.countCards("e") > 2; }, - content:function(){ - player.awakenSkill('rechuhai'); - game.log(player,'成功完成使命'); - if(player.isDamaged()) player.recover(player.maxHp-player.hp); - player.changeSkills(['zhangming'],['xianghai']); + content: function () { + player.awakenSkill("rechuhai"); + game.log(player, "成功完成使命"); + if (player.isDamaged()) player.recover(player.maxHp - player.hp); + player.changeSkills(["zhangming"], ["xianghai"]); }, }, - fail:{ - audio:'chuhai3', - trigger:{player:'chooseToCompareAfter'}, - forced:true, - filter:function(event,player){ - return event.getParent().name=='rechuhai_chuhai'&&event.num1<7&&!event.result.bool; + fail: { + audio: "chuhai3", + trigger: { player: "chooseToCompareAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.getParent().name == "rechuhai_chuhai" && + event.num1 < 7 && + !event.result.bool + ); }, - content:function(){ - player.awakenSkill('rechuhai'); - game.log(player,'使命失败'); + content: function () { + player.awakenSkill("rechuhai"); + game.log(player, "使命失败"); }, }, }, }, - chuhai3:{audio:true}, - zhangming:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return get.suit(event.card)=='club'; + chuhai3: { audio: true }, + zhangming: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.suit(event.card) == "club"; }, - content:function(){ - trigger.directHit.addArray(game.filterPlayer(function(current){ - return current!=player; - })); + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); }, - group:'zhangming_damage', - subSkill:{ - damage:{ - audio:'zhangming', - trigger:{source:'damageEnd'}, - forced:true, - usable:1, - filter:function(event,player){ - return player!=event.player; + group: "zhangming_damage", + subSkill: { + damage: { + audio: "zhangming", + trigger: { source: "damageEnd" }, + forced: true, + usable: 1, + filter: function (event, player) { + return player != event.player; }, - logTarget:'player', - content:function(){ - var list=[],cards=[],target=trigger.player,hs=target.getCards('h'); - if(hs.length>0){ - var card=hs.randomGet(); - list.push(get.type2(card,target)); - player.showCards(card,get.translation(player)+'对'+get.translation(target)+'发动了【彰名】'); + logTarget: "player", + content: function () { + var list = [], + cards = [], + target = trigger.player, + hs = target.getCards("h"); + if (hs.length > 0) { + var card = hs.randomGet(); + list.push(get.type2(card, target)); + player.showCards( + card, + get.translation(player) + + "对" + + get.translation(target) + + "发动了【彰名】" + ); } target.discard(card); - for(var i=0;iplayer.canCompare(target,true)); + chuhai: { + audio: 3, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((target) => player.canCompare(target, true)); }, - filterTarget:function(card,player,target){ - return player.canCompare(target,true); + filterTarget: function (card, player, target) { + return player.canCompare(target, true); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.canCompare(target)) player.chooseToCompare(target); + ("step 1"); + if (player.canCompare(target)) player.chooseToCompare(target); else event.finish(); - 'step 2' - if(result.bool){ - player.storage.chuhai2=target; - player.addTempSkill('chuhai2','phaseUseEnd'); - if(target.countCards('h')>0){ + ("step 2"); + if (result.bool) { + player.storage.chuhai2 = target; + player.addTempSkill("chuhai2", "phaseUseEnd"); + if (target.countCards("h") > 0) { player.viewHandcards(target); - var types=[],cards=[],hs=target.getCards('h'); - for(var i of hs){ - types.add(get.type2(i,target)); + var types = [], + cards = [], + hs = target.getCards("h"); + for (var i of hs) { + types.add(get.type2(i, target)); } - for(var i of types){ - var card=get.cardPile(function(card){ - return get.type2(card,false)==i; + for (var i of types) { + var card = get.cardPile(function (card) { + return get.type2(card, false) == i; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2','log'); + if (cards.length) player.gain(cards, "gain2", "log"); } } }, - ai:{ - order:9, - result:{ - target:function(player,target){ - if(player.countCards('hs',function(card){ - return get.tag(card,'damage')>0&&player.canUse(card,target,null,true)&& - get.effect(target,card,player,player)>0&&player.hasValueTarget(card,null,true); - })>0) return -3; + ai: { + order: 9, + result: { + target: function (player, target) { + if ( + player.countCards("hs", function (card) { + return ( + get.tag(card, "damage") > 0 && + player.canUse(card, target, null, true) && + get.effect(target, card, player, player) > 0 && + player.hasValueTarget(card, null, true) + ); + }) > 0 + ) + return -3; return -1; }, }, }, }, - chuhai2:{ - trigger:{source:'damageSource'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - if(event.player!=player.storage.chuhai2) return false; - for(var i=1;i<6;i++){ - if(player.hasEmptySlot(i)) return true; + chuhai2: { + trigger: { source: "damageSource" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + if (event.player != player.storage.chuhai2) return false; + for (var i = 1; i < 6; i++) { + if (player.hasEmptySlot(i)) return true; } return false; }, - content:function(){ - for(var i=1;i<7;i++){ - if(player.hasEmptySlot(i)){ - var sub='equip'+i,card=get.cardPile(function(card){ - return get.subtype(card,false)==sub&&!get.cardtag(card,'gifts')&&player.canEquip(card); - }); - if(card){ + content: function () { + for (var i = 1; i < 7; i++) { + if (player.hasEmptySlot(i)) { + var sub = "equip" + i, + card = get.cardPile(function (card) { + return ( + get.subtype(card, false) == sub && + !get.cardtag(card, "gifts") && + player.canEquip(card) + ); + }); + if (card) { player.$gain2(card); game.delayx(); player.equip(card); @@ -2347,2955 +3013,3509 @@ game.import('character', function () { }, }, //文鸯 - dbquedi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - direct:true, - usable:1, - filter:function(event,player){ - return (event.card.name=='sha'||event.card.name=='juedou')&&event.targets.length==1&& - (event.target.countGainableCards(player,'h')>0||player.hasCard(function(i){ - return _status.connectMode||get.type(i,player)=='basic'&&lib.filter.cardDiscardable(i,player,'dbquedi'); - },'h')); + dbquedi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + usable: 1, + filter: function (event, player) { + return ( + (event.card.name == "sha" || event.card.name == "juedou") && + event.targets.length == 1 && + (event.target.countGainableCards(player, "h") > 0 || + player.hasCard(function (i) { + return ( + _status.connectMode || + (get.type(i, player) == "basic" && + lib.filter.cardDiscardable(i, player, "dbquedi")) + ); + }, "h")) + ); }, - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - var list=[]; - if(target.countGainableCards(player,'h')>0) list.push('选项一'); - if(player.hasCard(function(i){ - return get.type(i,player)=='basic'&&lib.filter.cardDiscardable(i,player,'dbquedi'); - },'h')) list.push('选项二'); - list.push('背水!'); - list.push('cancel2'); - player.chooseControl(list).set('choiceList',[ - '获得'+get.translation(target)+'的一张手牌', - '弃置一张基本牌并令'+get.translation(trigger.card)+'伤害+1', - '背水!减1点体力上限并执行所有选项', - ]).set('prompt',get.prompt('dbquedi',target)).set('ai',function(){ - var evt=_status.event.getTrigger(),player=evt.player,target=evt.target,card=evt.card; - if(get.attitude(player,target)>0) return 'cancel2'; - var bool1=target.countGainableCards(player,'h')>0; - var bool2=player.hasCard(function(i){ - return get.type(i,player)=='basic'&&lib.filter.cardDiscardable(i,player,'dbquedi')&&get.value(card,player)<5; - },'h')&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var list = []; + if (target.countGainableCards(player, "h") > 0) list.push("选项一"); + if ( + player.hasCard(function (i) { + return ( + get.type(i, player) == "basic" && + lib.filter.cardDiscardable(i, player, "dbquedi") + ); + }, "h") + ) + list.push("选项二"); + list.push("背水!"); + list.push("cancel2"); + player + .chooseControl(list) + .set("choiceList", [ + "获得" + get.translation(target) + "的一张手牌", + "弃置一张基本牌并令" + get.translation(trigger.card) + "伤害+1", + "背水!减1点体力上限并执行所有选项", + ]) + .set("prompt", get.prompt("dbquedi", target)) + .set("ai", function () { + var evt = _status.event.getTrigger(), + player = evt.player, + target = evt.target, + card = evt.card; + if (get.attitude(player, target) > 0) return "cancel2"; + var bool1 = target.countGainableCards(player, "h") > 0; + var bool2 = + player.hasCard(function (i) { + return ( + get.type(i, player) == "basic" && + lib.filter.cardDiscardable(i, player, "dbquedi") && + get.value(card, player) < 5 + ); + }, "h") && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }); + if ( + bool1 && + bool2 && + (target.hp <= 2 || (player.isDamaged() && player.maxHp > 3)) + ) + return "背水!"; + if (bool1) return "选项一"; + if (bool2) return "选项二"; + return "cancel2"; }); - if(bool1&&bool2&&(target.hp<=2||(player.isDamaged()&&player.maxHp>3))) return '背水!'; - if(bool1) return '选项一'; - if(bool2) return '选项二'; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('dbquedi',target); - event.control=result.control; - if(event.control=='背水!') player.loseMaxHp(); - } - else{ + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("dbquedi", target); + event.control = result.control; + if (event.control == "背水!") player.loseMaxHp(); + } else { player.storage.counttrigger.dbquedi--; event.finish(); } - 'step 2' - if((event.control=='选项一'||event.control=='背水!')&&target.countGainableCards(player,'h')>0) player.gainPlayerCard(target,true,'h'); - 'step 3' - if((event.control=='选项二'||event.control=='背水!')&&player.hasCard(function(i){ - return get.type(i,player)=='basic'&&lib.filter.cardDiscardable(i,player,'dbquedi'); - },'h')){ - player.chooseToDiscard('h','弃置一张基本牌',{type:'basic'},true); - } - else event.finish(); - 'step 4' - if(result.bool) trigger.getParent().baseDamage++; + ("step 2"); + if ( + (event.control == "选项一" || event.control == "背水!") && + target.countGainableCards(player, "h") > 0 + ) + player.gainPlayerCard(target, true, "h"); + ("step 3"); + if ( + (event.control == "选项二" || event.control == "背水!") && + player.hasCard(function (i) { + return ( + get.type(i, player) == "basic" && + lib.filter.cardDiscardable(i, player, "dbquedi") + ); + }, "h") + ) { + player.chooseToDiscard("h", "弃置一张基本牌", { type: "basic" }, true); + } else event.finish(); + ("step 4"); + if (result.bool) trigger.getParent().baseDamage++; }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(tag!=='directHit_ai'||!arg||!arg.card||!arg.target||(arg.card.name!='sha'&&arg.card.name!='juedou')) return false; - if(player.storage.counttrigger&&player.storage.counttrigger.dbquedi&&player.storage.counttrigger.dbquedi>0) return false; - if(arg.target.countCards('h')==1&&(arg.card.name!='sha'||!arg.target.hasSkillTag('freeShan',false,{ - player:player, - card:arg.card - })||player.hasSkillTag('unequip',false,{ - name:arg.card?arg.card.name:null, - target:arg.target, - card:arg.card - })||player.hasSkillTag('unequip_ai',false,{ - name:arg.card?arg.card.name:null, - target:arg.target, - card:arg.card - }))) return true; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + tag !== "directHit_ai" || + !arg || + !arg.card || + !arg.target || + (arg.card.name != "sha" && arg.card.name != "juedou") + ) + return false; + if ( + player.storage.counttrigger && + player.storage.counttrigger.dbquedi && + player.storage.counttrigger.dbquedi > 0 + ) + return false; + if ( + arg.target.countCards("h") == 1 && + (arg.card.name != "sha" || + !arg.target.hasSkillTag("freeShan", false, { + player: player, + card: arg.card, + }) || + player.hasSkillTag("unequip", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: arg.card ? arg.card.name : null, + target: arg.target, + card: arg.card, + })) + ) + return true; return false; }, }, }, - dbzhuifeng:{ - audio:2, - groupSkill:true, - enable:'chooseToUse', - usable:2, - viewAsFilter:function(player){ - return player.group=='wei'&&player.hp>0; + dbzhuifeng: { + audio: 2, + groupSkill: true, + enable: "chooseToUse", + usable: 2, + viewAsFilter: function (player) { + return player.group == "wei" && player.hp > 0; }, - viewAs:{name:'juedou',isCard:true}, - filterCard:()=>false, - selectCard:-1, - log:false, - precontent:function(){ - 'step 0' - player.logSkill('dbzhuifeng'); + viewAs: { name: "juedou", isCard: true }, + filterCard: () => false, + selectCard: -1, + log: false, + precontent: function () { + "step 0"; + player.logSkill("dbzhuifeng"); player.loseHp(); - event.forceDie=true; - 'step 1' + event.forceDie = true; + ("step 1"); //特殊处理 - if(player.isDead()){ - player.useResult(event.result,event.getParent()).forceDie=true; + if (player.isDead()) { + player.useResult(event.result, event.getParent()).forceDie = true; } }, - ai:{ - order:function(){ - return get.order({name:'juedou'})-0.5; + ai: { + order: function () { + return get.order({ name: "juedou" }) - 0.5; }, }, - group:'dbzhuifeng_self', - subSkill:{ - self:{ - trigger:{player:'damageBegin2'}, - forced:true, - filter:function(event,player){ - var evt=event.getParent(); - return evt.skill=='dbzhuifeng'&&evt.player==player; + group: "dbzhuifeng_self", + subSkill: { + self: { + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent(); + return evt.skill == "dbzhuifeng" && evt.player == player; }, - content:function(){ + content: function () { trigger.cancel(); - player.getStat().skill.dbzhuifeng=2; + player.getStat().skill.dbzhuifeng = 2; }, }, }, }, - dbchongjian:{ - audio:2, - groupSkill:true, - hiddenCard:function(player,name){ - if(player.group=='wu'&&(name=='sha'||name=='jiu')&&player.hasCard(function(card){ - return get.type(card)=='equip'; - },'hes')) return true; + dbchongjian: { + audio: 2, + groupSkill: true, + hiddenCard: function (player, name) { + if ( + player.group == "wu" && + (name == "sha" || name == "jiu") && + player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "hes") + ) + return true; return false; }, - enable:'chooseToUse', - filter:function(event,player){ - return player.group=='wu'&&player.hasCard(function(card){ - return get.type(card)=='equip'; - },'hes')&&(event.filterCard({name:'sha'},player,event)||event.filterCard({name:'jiu'},player,event)); + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.group == "wu" && + player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "hes") && + (event.filterCard({ name: "sha" }, player, event) || + event.filterCard({ name: "jiu" }, player, event)) + ); }, - locked:false, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.dbchongjian) return true; + locked: false, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dbchongjian) return true; }, }, - chooseButton:{ - dialog:function(){ - var list=[]; - list.push(['基本','','sha']); - for(var i of lib.inpile_nature) list.push(['基本','','sha',i]); - list.push(['基本','','jiu']); - return ui.create.dialog('冲坚',[list,'vcard']); + chooseButton: { + dialog: function () { + var list = []; + list.push(["基本", "", "sha"]); + for (var i of lib.inpile_nature) list.push(["基本", "", "sha", i]); + list.push(["基本", "", "jiu"]); + return ui.create.dialog("冲坚", [list, "vcard"]); }, - filter:function(button,player){ - var evt=_status.event.getParent(); - return evt.filterCard({name:button.link[2],nature:button.link[3],isCard:true},player,evt); + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard( + { name: button.link[2], nature: button.link[3], isCard: true }, + player, + evt + ); }, - check:function(button){ - if(_status.event.getParent().type!='phase') return 1; - var player=_status.event.player; - if(button.link[2]=='jiu'&&(player.hasCard(function(card){ - return get.name(card)=='sha'; - },'hs')||player.countCards('hes',function(card){ - if(get.type(card)!='equip') return false; - if(get.position(card)=='e'){ - if(player.hasSkillTag('noe')) return (10-get.value(card))>0; - var sub=get.subtype(card); - if(player.hasCard(function(card){ - return get.subtype(card)==sub&&player.canUse(card,player)&&get.effect(player,card,player,player)>0; - },'hs')) return (10-get.value(card))>0; - } - return (5-get.value(card))>0; - })>1)) return player.getUseValue({name:'jiu'})*4; - return player.getUseValue({name:button.link[2],nature:button.link[3]},false); + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + if ( + button.link[2] == "jiu" && + (player.hasCard(function (card) { + return get.name(card) == "sha"; + }, "hs") || + player.countCards("hes", function (card) { + if (get.type(card) != "equip") return false; + if (get.position(card) == "e") { + if (player.hasSkillTag("noe")) return 10 - get.value(card) > 0; + var sub = get.subtype(card); + if ( + player.hasCard(function (card) { + return ( + get.subtype(card) == sub && + player.canUse(card, player) && + get.effect(player, card, player, player) > 0 + ); + }, "hs") + ) + return 10 - get.value(card) > 0; + } + return 5 - get.value(card) > 0; + }) > 1) + ) + return player.getUseValue({ name: "jiu" }) * 4; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }, false); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'dbchongjian', - viewAs:{ - name:links[0][2], - nature:links[0][3], + audio: "dbchongjian", + viewAs: { + name: links[0][2], + nature: links[0][3], //isCard:true, - storage:{dbchongjian:true}, + storage: { dbchongjian: true }, }, - filterCard:{type:'equip'}, - position:'hes', - popname:true, - precontent:function(){ - player.addTempSkill('dbchongjian_effect'); + filterCard: { type: "equip" }, + position: "hes", + popname: true, + precontent: function () { + player.addTempSkill("dbchongjian_effect"); }, - check:function(card){ - var player=_status.event.player; - if(get.position(card)=='e'){ - if(player.hasSkillTag('noe')) return 10-get.value(card); - var sub=get.subtype(card); - if(player.hasCard(function(card){ - return get.subtype(card)==sub&&player.canUse(card,player)&&get.effect(player,card,player,player)>0; - },'hs')) return 10-get.value(card); + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e") { + if (player.hasSkillTag("noe")) return 10 - get.value(card); + var sub = get.subtype(card); + if ( + player.hasCard(function (card) { + return ( + get.subtype(card) == sub && + player.canUse(card, player) && + get.effect(player, card, player, player) > 0 + ); + }, "hs") + ) + return 10 - get.value(card); } - return 5-get.value(card); + return 5 - get.value(card); }, - } + }; }, - prompt:function(links){ - return '将一张装备牌当做'+(links[0][3]?get.translation(links[0][3]):'')+'【'+get.translation(links[0][2])+'】使用'; + prompt: function (links) { + return ( + "将一张装备牌当做" + + (links[0][3] ? get.translation(links[0][3]) : "") + + "【" + + get.translation(links[0][2]) + + "】使用" + ); }, }, - ai:{ - unequip:true, - respondSha:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='unequip'){ - if(player.group!='wu'||!arg||!arg.card||!arg.card.storage||!arg.card.storage.dbchongjian) return false; - return true + ai: { + unequip: true, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "unequip") { + if ( + player.group != "wu" || + !arg || + !arg.card || + !arg.card.storage || + !arg.card.storage.dbchongjian + ) + return false; + return true; } - return player.group=='wu'&&arg=='use'&&player.hasCard(function(card){ - return get.type(card)=='equip'; - },'hes'); + return ( + player.group == "wu" && + arg == "use" && + player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "hes") + ); }, - order:function(item,player){ - if(_status.event.type!='phase') return 1; - var player=_status.event.player; - if(player.hasCard(function(card){ - if(get.value(card,player)<0) return true; - var sub=get.subtype(card); - return player.hasCard(function(card){ - return get.subtype(card)==sub&&player.canUse(card,player)&&get.effect(player,card,player,player)>0; - },'hs')>0; - },'e')) return 10; - if(player.countCards('hs','sha')||player.countCards('he',function(card){ - return get.type(card)=='equip'&&get.value(card,player)<5; - })>1) return get.order({name:'jiu'})-0.1; - return get.order({name:'sha'})-0.1; + order: function (item, player) { + if (_status.event.type != "phase") return 1; + var player = _status.event.player; + if ( + player.hasCard(function (card) { + if (get.value(card, player) < 0) return true; + var sub = get.subtype(card); + return ( + player.hasCard(function (card) { + return ( + get.subtype(card) == sub && + player.canUse(card, player) && + get.effect(player, card, player, player) > 0 + ); + }, "hs") > 0 + ); + }, "e") + ) + return 10; + if ( + player.countCards("hs", "sha") || + player.countCards("he", function (card) { + return get.type(card) == "equip" && get.value(card, player) < 5; + }) > 1 + ) + return get.order({ name: "jiu" }) - 0.1; + return get.order({ name: "sha" }) - 0.1; }, - result:{player:1}, + result: { player: 1 }, }, - subSkill:{ - effect:{ - charlotte:true, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.dbchongjian) return true; + subSkill: { + effect: { + charlotte: true, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dbchongjian) return true; }, }, - trigger:{source:'damageSource'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return event.parent.skill=='dbchongjian_backup'&&event.card.name=='sha'&&event.getParent().name=='sha'&&event.player.countGainableCards(player,'e')>0; + trigger: { source: "damageSource" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return ( + event.parent.skill == "dbchongjian_backup" && + event.card.name == "sha" && + event.getParent().name == "sha" && + event.player.countGainableCards(player, "e") > 0 + ); }, - content:function(){ - player.gainPlayerCard(trigger.player,'e',true,trigger.num); + content: function () { + player.gainPlayerCard(trigger.player, "e", true, trigger.num); }, }, }, }, - dbchoujue:{ - audio:2, - trigger:{source:'dieAfter'}, - forced:true, - content:function(){ + dbchoujue: { + audio: 2, + trigger: { source: "dieAfter" }, + forced: true, + content: function () { player.gainMaxHp(); player.draw(2); - player.addSkill('counttrigger'); - if(!player.storage.counttrigger) player.storage.counttrigger={}; - if(!player.storage.counttrigger.dbquedi) player.storage.counttrigger.dbquedi=0; + player.addSkill("counttrigger"); + if (!player.storage.counttrigger) player.storage.counttrigger = {}; + if (!player.storage.counttrigger.dbquedi) player.storage.counttrigger.dbquedi = 0; player.storage.counttrigger.dbquedi--; }, }, //王淩 - xingqi:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - locked:false, - filter:function(event,player){ - return get.type(event.card,false)!='delay'&&!player.getStorage('xingqi').includes(event.card.name); + xingqi: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + get.type(event.card, false) != "delay" && + !player.getStorage("xingqi").includes(event.card.name) + ); }, - content:function(){ - player.markAuto('xingqi',[trigger.card.name]); - game.log(player,'获得了一个','#g【备('+get.translation(trigger.card.name)+')】'); + content: function () { + player.markAuto("xingqi", [trigger.card.name]); + game.log(player, "获得了一个", "#g【备(" + get.translation(trigger.card.name) + ")】"); }, - marktext:'备', - intro:{ - content:'$', - onunmark:function(storage,player){ + marktext: "备", + intro: { + content: "$", + onunmark: function (storage, player) { delete player.storage.xingqi; }, }, - group:'xingqi_gain', - subSkill:{ - gain:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.getStorage('xingqi').length>0; + group: "xingqi_gain", + subSkill: { + gain: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.getStorage("xingqi").length > 0; }, - content:function(){ - 'step 0' - player.removeSkill('mibei_mark'); - player.chooseButton(['星启:是否获得一张牌?',[player.getStorage('xingqi'),'vcard']]).set('ai',function(button){ - var card={name:button.link[2]},player=_status.event.player; - if(!get.cardPile2(function(cardx){ - return cardx.name==card.name; - })) return 0; - return get.value(card,player)*player.getUseValue(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('xingqi'); - var name=result.links[0][2]; - game.log(player,'移去了一个','#g【备('+get.translation(name)+')】'); - player.unmarkAuto('xingqi',[name]); - var card=get.cardPile2(function(card){ - return card.name==name; + content: function () { + "step 0"; + player.removeSkill("mibei_mark"); + player + .chooseButton([ + "星启:是否获得一张牌?", + [player.getStorage("xingqi"), "vcard"], + ]) + .set("ai", function (button) { + var card = { name: button.link[2] }, + player = _status.event.player; + if ( + !get.cardPile2(function (cardx) { + return cardx.name == card.name; + }) + ) + return 0; + return get.value(card, player) * player.getUseValue(card); }); - if(card) player.gain(card,'gain2'); + ("step 1"); + if (result.bool) { + player.logSkill("xingqi"); + var name = result.links[0][2]; + game.log(player, "移去了一个", "#g【备(" + get.translation(name) + ")】"); + player.unmarkAuto("xingqi", [name]); + var card = get.cardPile2(function (card) { + return card.name == name; + }); + if (card) player.gain(card, "gain2"); } }, }, }, }, - xinzifu:{ - audio:'zifu', - trigger:{player:'phaseUseEnd'}, - forced:true, - filter:function(event,player){ - return player.getStorage('xingqi').length>0&&!player.hasHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==event; - }); + xinzifu: { + audio: "zifu", + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return ( + player.getStorage("xingqi").length > 0 && + !player.hasHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }) + ); }, - content:function(){ - game.log(player,'移去了所有','#g【备】'); - player.unmarkSkill('xingqi'); - player.addTempSkill('xinzifu_limit'); - player.addMark('xinzifu_limit',1,false); + content: function () { + game.log(player, "移去了所有", "#g【备】"); + player.unmarkSkill("xingqi"); + player.addTempSkill("xinzifu_limit"); + player.addMark("xinzifu_limit", 1, false); }, - ai:{ - neg:true, - combo:'xingqi', + ai: { + neg: true, + combo: "xingqi", }, - subSkill:{ - limit:{ - charlotte:true, - markimage:'image/card/handcard.png', - intro:{ - content:function(storage,player){ - var num=-player.countMark('xinzifu_limit'); - return '手牌上限'+num; - } + subSkill: { + limit: { + charlotte: true, + markimage: "image/card/handcard.png", + intro: { + content: function (storage, player) { + var num = -player.countMark("xinzifu_limit"); + return "手牌上限" + num; + }, }, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('xinzifu_limit'); - } + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("xinzifu_limit"); + }, }, - } - } + }, + }, }, - mibei:{ - audio:2, - trigger:{player:'useCardAfter'}, - dutySkill:true, - forced:true, - locked:false, - direct:true, - filter:function(event,player){ - if(!player.storage.xingqi||!player.storage.xingqi.length) return false; - var map={basic:0,trick:0,equip:0}; - for(var i of player.storage.xingqi){ - var type=get.type(i); - if(typeof map[type]=='number') map[type]++; + mibei: { + audio: 2, + trigger: { player: "useCardAfter" }, + dutySkill: true, + forced: true, + locked: false, + direct: true, + filter: function (event, player) { + if (!player.storage.xingqi || !player.storage.xingqi.length) return false; + var map = { basic: 0, trick: 0, equip: 0 }; + for (var i of player.storage.xingqi) { + var type = get.type(i); + if (typeof map[type] == "number") map[type]++; } - for(var i in map){ - if(map[i]<2) return false; + for (var i in map) { + if (map[i] < 2) return false; } return true; }, - content:function(){ - 'step 0' - player.logSkill('twmibei_achieve'); - game.log(player,'成功完成使命'); - player.awakenSkill('mibei'); - var list=['basic','equip','trick'],cards=[]; - for(var i of list){ - var card=get.cardPile2(function(card){ - return get.type(card)==i; + content: function () { + "step 0"; + player.logSkill("twmibei_achieve"); + game.log(player, "成功完成使命"); + player.awakenSkill("mibei"); + var list = ["basic", "equip", "trick"], + cards = []; + for (var i of list) { + var card = get.cardPile2(function (card) { + return get.type(card) == i; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); - 'step 1' - player.addSkills('xinmouli'); + if (cards.length) player.gain(cards, "gain2"); + ("step 1"); + player.addSkills("xinmouli"); }, - group:['mibei_fail','mibei_silent'], - derivation:'xinmouli', - subSkill:{ - silent:{ - charlotte:true, - trigger:{player:'phaseZhunbeiBegin'}, - silent:true, - lastDo:true, - filter:function(event,player){ - return !player.getStorage('xingqi').length; + group: ["mibei_fail", "mibei_silent"], + derivation: "xinmouli", + subSkill: { + silent: { + charlotte: true, + trigger: { player: "phaseZhunbeiBegin" }, + silent: true, + lastDo: true, + filter: function (event, player) { + return !player.getStorage("xingqi").length; }, - content:function(){ - player.addTempSkill('mibei_mark'); + content: function () { + player.addTempSkill("mibei_mark"); }, }, - mark:{charlotte:true}, - fail:{ - audio:'mibei2', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return !player.getStorage('xingqi').length&&player.hasSkill('mibei_mark'); + mark: { charlotte: true }, + fail: { + audio: "mibei2", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return !player.getStorage("xingqi").length && player.hasSkill("mibei_mark"); }, - forced:true, - content:function(){ - game.log(player,'使命失败'); - player.awakenSkill('mibei'); + forced: true, + content: function () { + game.log(player, "使命失败"); + player.awakenSkill("mibei"); player.loseMaxHp(); }, }, }, }, - mibei1:{audio:true}, - mibei2:{audio:true}, - xinmouli:{ - audio:'mouli', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.getStorage('xingqi').length>0; + mibei1: { audio: true }, + mibei2: { audio: true }, + xinmouli: { + audio: "mouli", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getStorage("xingqi").length > 0; }, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - target.chooseButton(['谋立:是否获得一张牌?',[player.getStorage('xingqi'),'vcard']],true).set('ai',function(button){ - var card={name:button.link[2]},player=_status.event.player; - return get.value(card,player); - }); - 'step 1' - if(result.bool){ - var name=result.links[0][2]; - game.log(player,'移去了一个','#g【备('+get.translation(name)+')】'); - player.unmarkAuto('xingqi',[name]); - var card=get.cardPile2(function(card){ - return card.name==name; + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + target + .chooseButton( + ["谋立:是否获得一张牌?", [player.getStorage("xingqi"), "vcard"]], + true + ) + .set("ai", function (button) { + var card = { name: button.link[2] }, + player = _status.event.player; + return get.value(card, player); }); - if(card) target.gain(card,'gain2'); + ("step 1"); + if (result.bool) { + var name = result.links[0][2]; + game.log(player, "移去了一个", "#g【备(" + get.translation(name) + ")】"); + player.unmarkAuto("xingqi", [name]); + var card = get.cardPile2(function (card) { + return card.name == name; + }); + if (card) target.gain(card, "gain2"); } }, - ai:{ - combo:'xingqi', - order:1, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; + ai: { + combo: "xingqi", + order: 1, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; return 1; }, }, }, }, - mouli:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + mouli: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - position:'h', - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - check:function(card){ - return 8-get.value(card); + filterCard: true, + position: "h", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + check: function (card) { + return 8 - get.value(card); }, - content:function(){ - player.give(cards,target); - if(!target.storage.mouli2) target.storage.mouli2=[]; - if(!target.storage.mouli3) target.storage.mouli3=[]; + content: function () { + player.give(cards, target); + if (!target.storage.mouli2) target.storage.mouli2 = []; + if (!target.storage.mouli3) target.storage.mouli3 = []; target.storage.mouli2.add(player); target.storage.mouli3.push(player); - target.addSkill('mouli_effect'); + target.addSkill("mouli_effect"); }, - ai:{ - threaten:1.2, - order:4, - result:{ - target:1, + ai: { + threaten: 1.2, + order: 4, + result: { + target: 1, }, }, - subSkill:{ - effect:{ - trigger:{player:'useCard'}, - forced:true, - charlotte:true, - filter:function(event,player){ - if(event.card.name!='sha'&&event.card.name!='shan') return false; - for(var i of player.storage.mouli3){ - if(i.isIn()) return true; + subSkill: { + effect: { + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if (event.card.name != "sha" && event.card.name != "shan") return false; + for (var i of player.storage.mouli3) { + if (i.isIn()) return true; } return false; }, - logTarget:function(event,player){ + logTarget: function (event, player) { return player.storage.mouli3; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; game.delayx(); player.storage.mouli3.sortBySeat(); - if(player.storage.mouli3.length==1){ + if (player.storage.mouli3.length == 1) { player.storage.mouli3[0].draw(3); - player.storage.mouli3.length=0; + player.storage.mouli3.length = 0; event.finish(); - } - else game.asyncDraw(player.storage.mouli3,3); - 'step 1' - player.storage.mouli3.length=0; + } else game.asyncDraw(player.storage.mouli3, 3); + ("step 1"); + player.storage.mouli3.length = 0; game.delayx(); }, - group:['mouli_sha','mouli_shan','mouli_clear'], - mark:true, - intro:{ - content:'已因$获得“谋立”效果', + group: ["mouli_sha", "mouli_shan", "mouli_clear"], + mark: true, + intro: { + content: "已因$获得“谋立”效果", }, }, - sha:{ - enable:'chooseToUse', - viewAs:{name:'sha'}, - filterCard:{color:'black'}, - position:'he', - prompt:'将一张黑色牌当做杀使用', - check:function(card){ - return 6-get.value(card); + sha: { + enable: "chooseToUse", + viewAs: { name: "sha" }, + filterCard: { color: "black" }, + position: "he", + prompt: "将一张黑色牌当做杀使用", + check: function (card) { + return 6 - get.value(card); }, - viewAsFilter:function(player){ - return player.countCards('he',{color:'black'})>0; + viewAsFilter: function (player) { + return player.countCards("he", { color: "black" }) > 0; }, - ai:{ - respondSha:true, - skillTagFilter:function(player){ - return player.countCards('he',{color:'black'})>0; + ai: { + respondSha: true, + skillTagFilter: function (player) { + return player.countCards("he", { color: "black" }) > 0; }, }, }, - shan:{ - enable:'chooseToUse', - viewAs:{name:'shan'}, - filterCard:{color:'red'}, - position:'he', - prompt:'将一张红色牌当做闪使用', - check:function(card){ - return 7-get.value(card); + shan: { + enable: "chooseToUse", + viewAs: { name: "shan" }, + filterCard: { color: "red" }, + position: "he", + prompt: "将一张红色牌当做闪使用", + check: function (card) { + return 7 - get.value(card); }, - viewAsFilter:function(player){ - return player.countCards('he',{color:'red'})>0; + viewAsFilter: function (player) { + return player.countCards("he", { color: "red" }) > 0; }, - ai:{ - respondShan:true, - skillTagFilter:function(player){ - return player.countCards('he',{color:'red'})>0; + ai: { + respondShan: true, + skillTagFilter: function (player) { + return player.countCards("he", { color: "red" }) > 0; }, }, }, - clear:{ - trigger:{global:['phaseBegin','dieAfter']}, - forced:true, - silent:true, - popup:false, - lastDo:true, - forceDie:true, - filter:function(event,player){ - if(event.name=='die'&&player==event.player) return true; + clear: { + trigger: { global: ["phaseBegin", "dieAfter"] }, + forced: true, + silent: true, + popup: false, + lastDo: true, + forceDie: true, + filter: function (event, player) { + if (event.name == "die" && player == event.player) return true; return player.storage.mouli2.includes(event.player); }, - content:function(){ - if(trigger.name=='die'&&player==trigger.player){ - player.removeSkill('mouli_effect'); + content: function () { + if (trigger.name == "die" && player == trigger.player) { + player.removeSkill("mouli_effect"); delete player.storage.mouli2; delete player.storage.mouli3; return; } player.storage.mouli2.remove(trigger.player); - while(player.storage.mouli3.includes(trigger.player)) player.storage.mouli3.remove(trigger.player); - if(!player.storage.mouli2.length) player.removeSkill('mouli_effect'); + while (player.storage.mouli3.includes(trigger.player)) + player.storage.mouli3.remove(trigger.player); + if (!player.storage.mouli2.length) player.removeSkill("mouli_effect"); }, }, }, }, - zifu:{ - audio:2, - trigger:{global:'dieAfter'}, - forced:true, - filter:function(event,player){ - return event.player.storage.mouli2&&event.player.storage.mouli2.includes(player); + zifu: { + audio: 2, + trigger: { global: "dieAfter" }, + forced: true, + filter: function (event, player) { + return event.player.storage.mouli2 && event.player.storage.mouli2.includes(player); }, - content:function(){ + content: function () { player.loseMaxHp(2); }, - ai:{ - combo:'mouli', - neg:true, + ai: { + combo: "mouli", + neg: true, }, }, //孔融 - xinlirang:{ - audio:'splirang', - trigger:{global:'phaseDrawBegin2'}, - logTarget:'player', - filter:function(event,player){ - return !event.numFixed&&event.player!=player&&player.countMark('xinlirang')==0; + xinlirang: { + audio: "splirang", + trigger: { global: "phaseDrawBegin2" }, + logTarget: "player", + filter: function (event, player) { + return !event.numFixed && event.player != player && player.countMark("xinlirang") == 0; }, - prompt2:'获得一枚“谦”并令其多摸两张牌', - check:function(event,player){ - return get.attitude(player,event.player)>0; + prompt2: "获得一枚“谦”并令其多摸两张牌", + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ - trigger.num+=2; - player.addMark('xinlirang',1); - player.addTempSkill('xinlirang_gain'); + content: function () { + trigger.num += 2; + player.addMark("xinlirang", 1); + player.addTempSkill("xinlirang_gain"); }, - marktext:'谦', - intro:{ - name:'谦', - content:'mark', + marktext: "谦", + intro: { + name: "谦", + content: "mark", }, - group:'xinlirang_skip', - subSkill:{ - gain:{ - audio:'splirang', - trigger:{global:'phaseDiscardEnd'}, - direct:true, - filter:function(event,player){ - return event.player.hasHistory('lose',function(evt){ - return evt.type=='discard'&&evt.cards2.filterInD('d').length>0&&evt.getParent('phaseDiscard')==event; + group: "xinlirang_skip", + subSkill: { + gain: { + audio: "splirang", + trigger: { global: "phaseDiscardEnd" }, + direct: true, + filter: function (event, player) { + return event.player.hasHistory("lose", function (evt) { + return ( + evt.type == "discard" && + evt.cards2.filterInD("d").length > 0 && + evt.getParent("phaseDiscard") == event + ); }); }, - content:function(){ - 'step 0' - var cards=[]; - trigger.player.getHistory('lose',function(evt){ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2.filterInD('d')); + content: function () { + "step 0"; + var cards = []; + trigger.player.getHistory("lose", function (evt) { + if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) + cards.addArray(evt.cards2.filterInD("d")); }); - player.chooseButton(['礼让:是否获得其中至多两张牌?',cards],[1,2]); - 'step 1' - if(result.bool){ - player.logSkill('xinlirang_gain',trigger.player); - player.gain(result.links,'gain2'); + player.chooseButton(["礼让:是否获得其中至多两张牌?", cards], [1, 2]); + ("step 1"); + if (result.bool) { + player.logSkill("xinlirang_gain", trigger.player); + player.gain(result.links, "gain2"); } }, }, - skip:{ - audio:'splirang', - trigger:{player:'phaseDrawBefore'}, - forced:true, - filter:function(event,player){ - return player.hasMark('xinlirang'); + skip: { + audio: "splirang", + trigger: { player: "phaseDrawBefore" }, + forced: true, + filter: function (event, player) { + return player.hasMark("xinlirang"); }, - content:function(){ + content: function () { trigger.cancel(); - player.removeMark('xinlirang',player.countMark('xinlirang')); + player.removeMark("xinlirang", player.countMark("xinlirang")); }, }, }, }, - xinmingshi:{ - audio:'spmingshi', - trigger:{player:'damageEnd'}, - forced:true, - logTarget:'source', - filter:function(event,player){ - return event.source&&event.source.isIn()&&player.hasMark('xinlirang')&&event.source.countCards('he')>0; + xinmingshi: { + audio: "spmingshi", + trigger: { player: "damageEnd" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + player.hasMark("xinlirang") && + event.source.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - trigger.source.chooseToDiscard('he',true).set('color',get.attitude(trigger.source,player)>0?'red':'black').set('ai',function(card){ - return (get.color(card)==_status.event.color?4:0)-get.value(card); - }); - 'step 1' - if(result.bool&&result.cards&&result.cards.length){ - var card=result.cards[0]; - if(get.color(card,trigger.source)=='red') player.recover(); - else if(get.position(card,true)=='d') player.gain(card,'gain2'); + content: function () { + "step 0"; + trigger.source + .chooseToDiscard("he", true) + .set("color", get.attitude(trigger.source, player) > 0 ? "red" : "black") + .set("ai", function (card) { + return (get.color(card) == _status.event.color ? 4 : 0) - get.value(card); + }); + ("step 1"); + if (result.bool && result.cards && result.cards.length) { + var card = result.cards[0]; + if (get.color(card, trigger.source) == "red") player.recover(); + else if (get.position(card, true) == "d") player.gain(card, "gain2"); } }, - ai:{ - combo:'xinlirang', - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')&&target.hasMark('xinlirang')){ - var cards=[card]; - if(card.cards&&card.cards.length) cards.addArray(card.cards); - if(ui.selected.cards.length) cards.addArray(ui.selected.cards); - if(!player.countCards('he',function(card){ - return !cards.includes(card); - })) return; - if(!player.countCards('h',function(card){ - return !cards.includes(card)&&get.color(card)=='black'&&get.value(card,player)<6; - })) return 'zerotarget'; + ai: { + combo: "xinlirang", + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && target.hasMark("xinlirang")) { + var cards = [card]; + if (card.cards && card.cards.length) cards.addArray(card.cards); + if (ui.selected.cards.length) cards.addArray(ui.selected.cards); + if ( + !player.countCards("he", function (card) { + return !cards.includes(card); + }) + ) + return; + if ( + !player.countCards("h", function (card) { + return ( + !cards.includes(card) && + get.color(card) == "black" && + get.value(card, player) < 6 + ); + }) + ) + return "zerotarget"; return 0.5; } }, }, }, }, - spmingshi:{ - audio:2, - trigger:{player:'damageEnd'}, - forced:true, - logTarget:'source', - filter:function(event,player){ - return event.source&&player!=event.source&&event.source.countCards('he')>0; + spmingshi: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return event.source && player != event.source && event.source.countCards("he") > 0; }, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - trigger.source.chooseToDiscard('he',true); - 'step 2' - if(event.count>0&&result.bool&&lib.skill.spmingshi.filter(trigger,player)&&player.hasSkill('spmingshi')) event.goto(1); + trigger.source.chooseToDiscard("he", true); + ("step 2"); + if ( + event.count > 0 && + result.bool && + lib.skill.spmingshi.filter(trigger, player) && + player.hasSkill("spmingshi") + ) + event.goto(1); }, - ai:{ - threaten:0.8, - maixie:true, - maixie_defend:true, + ai: { + threaten: 0.8, + maixie: true, + maixie_defend: true, }, }, - splirang:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'splirang')) return false; + splirang: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "splirang")) return false; } return true; }, - filterCard:true, - selectCard:-1, - content:function(){ - 'step 0' - cards=cards.filterInD('d'); - if(!cards.length||player.hp<1) event.goto(3); - else player.chooseButton(['将任意张牌交给一名其他角色',cards],[1,Math.min(cards.length,player.hp)]).set('ai',function(button){ - return get.value(button.link); - }); - 'step 1' - if(result.bool){ - event.cards=result.links; - player.chooseTarget(true,'令一名角色获得'+get.translation(event.cards),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) att/=10; - if(target.hasJudge('lebu')) att/=5; - return att; - }); + filterCard: true, + selectCard: -1, + content: function () { + "step 0"; + cards = cards.filterInD("d"); + if (!cards.length || player.hp < 1) event.goto(3); + else + player + .chooseButton( + ["将任意张牌交给一名其他角色", cards], + [1, Math.min(cards.length, player.hp)] + ) + .set("ai", function (button) { + return get.value(button.link); + }); + ("step 1"); + if (result.bool) { + event.cards = result.links; + player + .chooseTarget( + true, + "令一名角色获得" + get.translation(event.cards), + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 5; + return att; + }); + } else event.goto(3); + ("step 2"); + if (result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + target.gain(cards, "gain2"); } - else event.goto(3); - 'step 2' - if(result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'green'); - target.gain(cards,'gain2'); - } - 'step 3' + ("step 3"); player.draw(); }, - ai:{ - order:0.1, - result:{ - player:function(player){ - var hs=player.getCards('h'); - if(hs.length<=player.hp&&game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0&&!current.hasJudge('lebu')&&!current.hasSkillTag('nogain'); - })) return 1; - if(get.value(hs,player)<6) return 1; + ai: { + order: 0.1, + result: { + player: function (player) { + var hs = player.getCards("h"); + if ( + hs.length <= player.hp && + game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) > 0 && + !current.hasJudge("lebu") && + !current.hasSkillTag("nogain") + ); + }) + ) + return 1; + if (get.value(hs, player) < 6) return 1; return 0; }, }, }, }, //糜夫人 - xinguixiu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player.hp%2==1||player.isDamaged(); + xinguixiu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.hp % 2 == 1 || player.isDamaged(); }, - content:function(){ - if(player.hp%2==1) player.draw(); + content: function () { + if (player.hp % 2 == 1) player.draw(); else player.recover(); }, }, - qingyu:{ - audio:3, - dutySkill:true, - locked:false, - group:['qingyu_achieve','qingyu_fail','qingyu_defend'], - subSkill:{ - defend:{ - audio:'qingyu1', - trigger:{player:'damageBegin2'}, - filter:function(event,player){ - return player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'qingyu_defend'); - })>1; + qingyu: { + audio: 3, + dutySkill: true, + locked: false, + group: ["qingyu_achieve", "qingyu_fail", "qingyu_defend"], + subSkill: { + defend: { + audio: "qingyu1", + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "qingyu_defend"); + }) > 1 + ); }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.cancel(); - player.chooseToDiscard(2,'he',true); + player.chooseToDiscard(2, "he", true); }, }, - achieve:{ - audio:'qingyu3', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - skillAnimation:true, - animationColor:'fire', - filter:function(event,player){ - return player.isHealthy()&&player.countCards('h')==0; + achieve: { + audio: "qingyu3", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + return player.isHealthy() && player.countCards("h") == 0; }, - content:function(){ - game.log(player,'成功完成使命'); - player.awakenSkill('qingyu'); - player.addSkills('xuancun'); + content: function () { + game.log(player, "成功完成使命"); + player.awakenSkill("qingyu"); + player.addSkills("xuancun"); }, }, - fail:{ - audio:'qingyu2', - trigger:{player:'dying'}, - forced:true, - content:function(){ - game.log(player,'使命失败'); - player.awakenSkill('qingyu'); + fail: { + audio: "qingyu2", + trigger: { player: "dying" }, + forced: true, + content: function () { + game.log(player, "使命失败"); + player.awakenSkill("qingyu"); player.loseMaxHp(); }, }, }, - derivation:'xuancun', + derivation: "xuancun", }, - qingyu1:{audio:true}, - qingyu2:{audio:true}, - qingyu3:{audio:true}, - xuancun:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return player!=event.player&&player.countCards('h')0; + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - prompt2:function(event,player){ - return '令其摸'+get.cnNumber(Math.min(2,player.hp-player.countCards('h')))+'张牌'; + prompt2: function (event, player) { + return "令其摸" + get.cnNumber(Math.min(2, player.hp - player.countCards("h"))) + "张牌"; }, - content:function(){ - trigger.player.draw(Math.min(2,player.hp-player.countCards('h'))); + content: function () { + trigger.player.draw(Math.min(2, player.hp - player.countCards("h"))); }, }, //羊祜 - mingfa:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.storage.mingfa&&player.countCards('h')>0&&player.getCards('he').includes(player.storage.mingfa) - &&!player.hasSkillTag('noCompareSource')&&game.hasPlayer(function(current){ - return current!=player&&player.canCompare(current); - }); + mingfa: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.storage.mingfa && + player.countCards("h") > 0 && + player.getCards("he").includes(player.storage.mingfa) && + !player.hasSkillTag("noCompareSource") && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); }, - content:function(){ - 'step 0' - event.card=player.storage.mingfa; + content: function () { + "step 0"; + event.card = player.storage.mingfa; delete player.storage.mingfa; - player.chooseTarget(get.prompt('mingfa'),'用'+get.translation(event.card)+'和一名其他角色拼点',function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - var player=_status.event.player,card=_status.event.getParent().card; - if(card.number>9||!target.countCards('h',function(cardx){ - return cardx.number>=card.number+2; - })) return -get.attitude(player,target)/Math.sqrt(target.countCards('h')); - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('mingfa',target); - var next=player.chooseToCompare(target); - if(!next.fixedResult) next.fixedResult={}; - next.fixedResult[player.playerid]=event.card; - } - else{ - player.removeGaintag('mingfa'); + player + .chooseTarget( + get.prompt("mingfa"), + "用" + get.translation(event.card) + "和一名其他角色拼点", + function (card, player, target) { + return player.canCompare(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + card = _status.event.getParent().card; + if ( + card.number > 9 || + !target.countCards("h", function (cardx) { + return cardx.number >= card.number + 2; + }) + ) + return -get.attitude(player, target) / Math.sqrt(target.countCards("h")); + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("mingfa", target); + var next = player.chooseToCompare(target); + if (!next.fixedResult) next.fixedResult = {}; + next.fixedResult[player.playerid] = event.card; + } else { + player.removeGaintag("mingfa"); event.finish(); } - 'step 2' - if(result.bool){ - player.gainPlayerCard(target,true,'he'); - if(event.card.number==1) event.finish(); - } - else{ - player.addTempSkill('mingfa_block'); + ("step 2"); + if (result.bool) { + player.gainPlayerCard(target, true, "he"); + if (event.card.number == 1) event.finish(); + } else { + player.addTempSkill("mingfa_block"); event.finish(); } - 'step 3' - var card=get.cardPile2(function(card){ - return card.number==event.card.number-1; + ("step 3"); + var card = get.cardPile2(function (card) { + return card.number == event.card.number - 1; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); }, - group:['mingfa_choose','mingfa_add','mingfa_mark'], - subSkill:{ - block:{ - mod:{ - playerEnabled:function(card,player,target){ - if(player!=target) return false; + group: ["mingfa_choose", "mingfa_add", "mingfa_mark"], + subSkill: { + block: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; }, }, }, - choose:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + choose: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('mingfa'),'选择展示自己的一张牌').set('ai',function(card){ - return Math.min(13,get.number(card)+2)/Math.pow(Math.min(2,get.value(card)),0.25); - }); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - player.logSkill('mingfa'); - player.removeGaintag('mingfa'); - player.addGaintag(card,'mingfa'); - player.storage.mingfa=card; - player.showCards(card,get.translation(player)+'发动了【明伐】'); + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("mingfa"), "选择展示自己的一张牌") + .set("ai", function (card) { + return ( + Math.min(13, get.number(card) + 2) / + Math.pow(Math.min(2, get.value(card)), 0.25) + ); + }); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + player.logSkill("mingfa"); + player.removeGaintag("mingfa"); + player.addGaintag(card, "mingfa"); + player.storage.mingfa = card; + player.showCards(card, get.translation(player) + "发动了【明伐】"); } }, }, - add:{ - trigger:{player:'compare',target:'compare'}, - filter:function(event,player){ - if(event.player==player) return !event.iwhile; + add: { + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (event.player == player) return !event.iwhile; return true; }, - forced:true, - locked:false, - content:function(){ - if(player==trigger.player){ - trigger.num1+=2; - if(trigger.num1>13) trigger.num1=13; + forced: true, + locked: false, + content: function () { + if (player == trigger.player) { + trigger.num1 += 2; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += 2; + if (trigger.num2 > 13) trigger.num2 = 13; } - else{ - trigger.num2+=2; - if(trigger.num2>13) trigger.num2=13; - } - game.log(player,'的拼点牌点数+2') + game.log(player, "的拼点牌点数+2"); }, }, - mark:{ - trigger:{player:'gainEnd'}, - silent:true, - firstDo:true, - filter:function(event,player){ - return player.storage.mingfa&&event.cards.includes(player.storage.mingfa)&&player.getCards('h').includes(player.storage.mingfa); + mark: { + trigger: { player: "gainEnd" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return ( + player.storage.mingfa && + event.cards.includes(player.storage.mingfa) && + player.getCards("h").includes(player.storage.mingfa) + ); }, - content:function(){ - player.addGaintag(player.storage.mingfa,'mingfa'); + content: function () { + player.addGaintag(player.storage.mingfa, "mingfa"); }, }, }, }, - rongbei:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return game.hasPlayer((current)=>lib.skill.rongbei.filterTarget(null,player,current)); + rongbei: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return game.hasPlayer((current) => lib.skill.rongbei.filterTarget(null, player, current)); }, - filterTarget:function(card,player,target){ - for(var i=1;i<6;i++){ - if(target.hasEmptySlot(i)) return true; + filterTarget: function (card, player, target) { + for (var i = 1; i < 6; i++) { + if (target.hasEmptySlot(i)) return true; } return false; }, - content:function(){ - 'step 0' - event.num=1; - player.awakenSkill('rongbei'); - 'step 1' - while(!target.hasEmptySlot(event.num)){ + content: function () { + "step 0"; + event.num = 1; + player.awakenSkill("rongbei"); + ("step 1"); + while (!target.hasEmptySlot(event.num)) { event.num++; - if(event.num>5){ + if (event.num > 5) { event.finish(); return; } } - var card=get.cardPile2(function(card){ - return get.subtype(card)=='equip'+event.num&&target.canUse(card,target); + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip" + event.num && target.canUse(card, target); }); - if(card){ - target.chooseUseTarget(card,true,'nopopup'); + if (card) { + target.chooseUseTarget(card, true, "nopopup"); } event.num++; - if(event.num<=5) event.redo(); + if (event.num <= 5) event.redo(); }, - ai:{ - order:5, - result:{ - target:function(player,target){ - return (target.hasSkillTag('noe')?2:1)*(5-target.countCards('e')-target.countDisabled()); + ai: { + order: 5, + result: { + target: function (player, target) { + return ( + (target.hasSkillTag("noe") ? 2 : 1) * + (5 - target.countCards("e") - target.countDisabled()) + ); }, }, }, }, //桥公 - yizhu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - content:function(){ - 'step 0' + yizhu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + content: function () { + "step 0"; player.draw(2); - 'step 1' - var hs=player.getCards('he'); - if(!hs.length) event.finish(); - else if(hs.length<=2) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,2,'选择两张牌洗入牌堆'); - 'step 2' - if(result.bool){ - player.$throw(result.cards.length,1000); - player.lose(result.cards,ui.cardPile).insert_index=function(){ - return ui.cardPile.childNodes[get.rand(0,game.players.length*2-2)]; - } - player.markAuto('yizhu',result.cards); - } - else event.finish(); - 'step 3' + ("step 1"); + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, 2, "选择两张牌洗入牌堆"); + ("step 2"); + if (result.bool) { + player.$throw(result.cards.length, 1000); + player.lose(result.cards, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[get.rand(0, game.players.length * 2 - 2)]; + }; + player.markAuto("yizhu", result.cards); + } else event.finish(); + ("step 3"); game.updateRoundNumber(); game.delayx(); }, - intro:{ - mark:function(dialog,content,player){ - if(player==game.me||player.isUnderControl()) dialog.addAuto(content); - else{ - var names=[]; - for(var i of content) names.add(i.name); + intro: { + mark: function (dialog, content, player) { + if (player == game.me || player.isUnderControl()) dialog.addAuto(content); + else { + var names = []; + for (var i of content) names.add(i.name); return get.translation(names); } }, }, - group:'yizhu_use', - subSkill:{ - use:{ - audio:'yizhu', - trigger:{global:'useCardToPlayer'}, - filter:function(event,player){ - return player.storage.yizhu&&player.storage.yizhu.length&& - event.player!=player&&event.targets.length==1&& - event.cards.filter(function(i){ - return player.storage.yizhu.includes(i); - }).length>0; + group: "yizhu_use", + subSkill: { + use: { + audio: "yizhu", + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return ( + player.storage.yizhu && + player.storage.yizhu.length && + event.player != player && + event.targets.length == 1 && + event.cards.filter(function (i) { + return player.storage.yizhu.includes(i); + }).length > 0 + ); }, - logTarget:'player', - check:function(event,player){ - return get.effect(event.targets[0],event.card,event.player,player)<0; + logTarget: "player", + check: function (event, player) { + return get.effect(event.targets[0], event.card, event.player, player) < 0; }, - prompt2:function(event,player){ - return '令'+get.translation(event.card)+'无效'; + prompt2: function (event, player) { + return "令" + get.translation(event.card) + "无效"; }, - content:function(){ + content: function () { trigger.cancel(); - trigger.targets.length=0; - trigger.getParent().triggeredTargets1.length=0; - var list=trigger.cards.filter(function(i){ + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + var list = trigger.cards.filter(function (i) { return player.storage.yizhu.includes(i); }); - player.unmarkAuto('yizhu',list); + player.unmarkAuto("yizhu", list); game.delayx(); }, }, }, }, - luanchou:{ - audio:2, - enable:'phaseUse', - usable:1, - selectTarget:2, - filterTarget:true, - multitarget:true, - multiline:true, - content:function(){ - game.countPlayer(function(current){ - var num=current.countMark('luanchou'); - if(num) current.removeMark('luanchou',num); + luanchou: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectTarget: 2, + filterTarget: true, + multitarget: true, + multiline: true, + content: function () { + game.countPlayer(function (current) { + var num = current.countMark("luanchou"); + if (num) current.removeMark("luanchou", num); }); targets.sortBySeat(); - for(var i of targets) i.addMark('luanchou',1); + for (var i of targets) i.addMark("luanchou", 1); }, - global:['gonghuan','gonghuan_clear'], - derivation:'gonghuan', - marktext:'姻', - intro:{ - name:'共患', - content:()=>lib.translate.gonghuan_info, - onunmark:true, + global: ["gonghuan", "gonghuan_clear"], + derivation: "gonghuan", + marktext: "姻", + intro: { + name: "共患", + content: () => lib.translate.gonghuan_info, + onunmark: true, }, - ai:{ - order:10, - expose:0.2, - result:{ - target:function(player,target){ - if(!ui.selected.targets.length) return -Math.pow(target.hp,3); - if(target.hp>=ui.selected.targets[0].hp) return 0; - return Math.pow(ui.selected.targets[0].hp-target.hp,3); + ai: { + order: 10, + expose: 0.2, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -Math.pow(target.hp, 3); + if (target.hp >= ui.selected.targets[0].hp) return 0; + return Math.pow(ui.selected.targets[0].hp - target.hp, 3); }, }, }, }, - gonghuan:{ - audio:2, - forceaudio:true, - trigger:{global:'damageBegin4'}, - usable:1, - forced:true, - logTarget:'player', - filter:function(event,player){ - return event.player.hptarget.hp&&(!current.storage.counttrigger||!current.storage.counttrigger.gonghuan); + ai: { + effect: { + target: function (card, player, target) { + if (_status.luanchou_judging) return; + if (get.tag(card, "damage") && target.hasMark("luanchou")) { + var other = game.findPlayer(function (current) { + return ( + current != target && + current.hasMark("luanchou") && + current.hp > target.hp && + (!current.storage.counttrigger || + !current.storage.counttrigger.gonghuan) + ); }); - if(!other) return; - _status.luanchou_judging=true; - var eff=[0,0,0,get.damageEffect(other,player,player,get.nature(card))/get.attitude(player,player)]; + if (!other) return; + _status.luanchou_judging = true; + var eff = [ + 0, + 0, + 0, + get.damageEffect(other, player, player, get.nature(card)) / + get.attitude(player, player), + ]; delete _status.luanchou_judging; return eff; } }, }, }, - subSkill:{ - clear:{ - trigger:{player:'damageEnd'}, - forced:true, - popup:false, - filter:function(event,player){ + subSkill: { + clear: { + trigger: { player: "damageEnd" }, + forced: true, + popup: false, + filter: function (event, player) { return event._gonghuan_player; }, - content:function(){ - player.removeMark('luanchou',player.countMark('luanchou')); - trigger._gonghuan_player.removeMark('luanchou',trigger._gonghuan_player.countMark('luanchou')); + content: function () { + player.removeMark("luanchou", player.countMark("luanchou")); + trigger._gonghuan_player.removeMark( + "luanchou", + trigger._gonghuan_player.countMark("luanchou") + ); }, }, }, }, //刘璋 - xiusheng:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.storage.yinlang&&game.hasPlayer(function(current){ - return current.group==player.storage.yinlang; - }); + xiusheng: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.storage.yinlang && + game.hasPlayer(function (current) { + return current.group == player.storage.yinlang; + }) + ); }, - content:function(){ - 'step 0' - if(player.storage.xiusheng&&player.storage.xiusheng.length>0) player.unmarkSkill('xiusheng'); - 'step 1' - event.num=game.countPlayer(function(current){ - return current.group==player.storage.yinlang; + content: function () { + "step 0"; + if (player.storage.xiusheng && player.storage.xiusheng.length > 0) + player.unmarkSkill("xiusheng"); + ("step 1"); + event.num = game.countPlayer(function (current) { + return current.group == player.storage.yinlang; }); - if(event.num>0) player.draw(event.num); + if (event.num > 0) player.draw(event.num); else event.finish(); - 'step 2' - var he=player.getCards('he'); - if(!he.length) event.finish(); - else if(he.length0) return 1.5; - if(!current.inRange(player)) return 1; - return 0.6; - }); - } - list.sort(function(a,b){ - return getn(b)-getn(a); - }); - return list[0]; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('yinlang',game.filterPlayer(function(current){ - return current.group==result.control; - })); - game.log(player,'选择了','#y'+get.translation(result.control+2)) - player.storage.yinlang=result.control; - player.markSkill('yinlang'); + if (!player.hasSkill("yinlang")) list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "引狼:请选择一个势力") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var getn = function (group) { + return game.countPlayer(function (current) { + if (current.group != group) return false; + if (get.attitude(current, player) > 0) return 1.5; + if (!current.inRange(player)) return 1; + return 0.6; + }); + }; + list.sort(function (a, b) { + return getn(b) - getn(a); + }); + return list[0]; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill( + "yinlang", + game.filterPlayer(function (current) { + return current.group == result.control; + }) + ); + game.log(player, "选择了", "#y" + get.translation(result.control + 2)); + player.storage.yinlang = result.control; + player.markSkill("yinlang"); } }, - ai:{combo:'xiusheng'}, - intro:{content:'已选择了$势力'}, - group:'yinlang_gain', - subSkill:{ - round:{}, - gain:{ - audio:'yinlang', - trigger:{global:'phaseUseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return event.player.group==player.storage.yinlang&&event.player.isIn()&&player.getStorage('xiusheng').length>0; + ai: { combo: "xiusheng" }, + intro: { content: "已选择了$势力" }, + group: "yinlang_gain", + subSkill: { + round: {}, + gain: { + audio: "yinlang", + trigger: { global: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + event.player.group == player.storage.yinlang && + event.player.isIn() && + player.getStorage("xiusheng").length > 0 + ); }, - logTarget:'player', - content:function(){ - 'step 0' - var str=get.translation(player); - event.target=trigger.player; - event.target.chooseControl().set('choiceList',[ - '获得'+str+'的一张“生”,然后本阶段使用牌时只能指定其为目标', - '令'+str+'获得一张“生”', - ]).set('ai',function(){ - var evt=_status.event.getParent(),player=evt.target,target=evt.player; - if(get.attitude(player,target)>0) return 1; - if(!player.countCards('hs',function(card){ - return player.hasValueTarget(card,null,true)&&(!player.canUse(card,target,null,true)||get.effect(target,card,player,player)<0) - })) return 0; - return 1; - }); - 'step 1' - event.gainner=(result.index==0)?target:player; - if(result.index==0) event.block=true; - event.gainner.chooseButton(['选择获得一张“生”',player.storage.xiusheng],true); - 'step 2' - player.unmarkAuto('xiusheng',result.links); - event.gainner.gain(result.links,'gain2'); - if(event.block){ - target.markAuto('yinlang_block',[player]); - target.addTempSkill('yinlang_block','phaseUseAfter'); + logTarget: "player", + content: function () { + "step 0"; + var str = get.translation(player); + event.target = trigger.player; + event.target + .chooseControl() + .set("choiceList", [ + "获得" + str + "的一张“生”,然后本阶段使用牌时只能指定其为目标", + "令" + str + "获得一张“生”", + ]) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.target, + target = evt.player; + if (get.attitude(player, target) > 0) return 1; + if ( + !player.countCards("hs", function (card) { + return ( + player.hasValueTarget(card, null, true) && + (!player.canUse(card, target, null, true) || + get.effect(target, card, player, player) < 0) + ); + }) + ) + return 0; + return 1; + }); + ("step 1"); + event.gainner = result.index == 0 ? target : player; + if (result.index == 0) event.block = true; + event.gainner.chooseButton(["选择获得一张“生”", player.storage.xiusheng], true); + ("step 2"); + player.unmarkAuto("xiusheng", result.links); + event.gainner.gain(result.links, "gain2"); + if (event.block) { + target.markAuto("yinlang_block", [player]); + target.addTempSkill("yinlang_block", "phaseUseAfter"); } }, }, - block:{ - mod:{ - playerEnabled:function(card,player,target){ - var info=get.info(card); - if(info&&info.singleCard&&ui.selected.cards.length) return; - if(!player.getStorage('yinlang_block').includes(target)) return false; + block: { + mod: { + playerEnabled: function (card, player, target) { + var info = get.info(card); + if (info && info.singleCard && ui.selected.cards.length) return; + if (!player.getStorage("yinlang_block").includes(target)) return false; }, }, - onremove:true, + onremove: true, }, }, }, - huaibi:{ - audio:2, - zhuSkill:true, - mod:{ - maxHandcard:function(player,num){ - if(player.storage.yinlang&&player.hasZhuSkill('huaibi')) return num+game.countPlayer(function(current){ - return current.group==player.storage.yinlang; - }); + huaibi: { + audio: 2, + zhuSkill: true, + mod: { + maxHandcard: function (player, num) { + if (player.storage.yinlang && player.hasZhuSkill("huaibi")) + return ( + num + + game.countPlayer(function (current) { + return current.group == player.storage.yinlang; + }) + ); }, }, - ai:{combo:'yinlang'}, + ai: { combo: "yinlang" }, }, //张温 - gebo:{ - audio:2, - trigger:{global:'recoverAfter'}, - forced:true, - content:function(){ - game.cardsGotoSpecial(get.cards(),'toRenku'); + gebo: { + audio: 2, + trigger: { global: "recoverAfter" }, + forced: true, + content: function () { + game.cardsGotoSpecial(get.cards(), "toRenku"); }, }, - spsongshu:{ - audio:2, - trigger:{global:'phaseDrawBegin1'}, - logTarget:'player', - filter:function(event,player){ - return event.player.hp>player.hp&&player.hp>0&&!event.numFixed&&_status.renku.length>0; + spsongshu: { + audio: 2, + trigger: { global: "phaseDrawBegin1" }, + logTarget: "player", + filter: function (event, player) { + return ( + event.player.hp > player.hp && + player.hp > 0 && + !event.numFixed && + _status.renku.length > 0 + ); }, - check:function(event,player){ - var num=Math.min(5,player.hp,_status.renku.length); - if(num<=event.num) return get.attitude(player,event.player)<0; + check: function (event, player) { + var num = Math.min(5, player.hp, _status.renku.length); + if (num <= event.num) return get.attitude(player, event.player) < 0; return false; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.changeToZero(); - var num=Math.min(5,player.hp,_status.renku.length); - trigger.player.chooseButton(['选择获得'+get.cnNumber(num)+'张牌',_status.renku],true,num); - 'step 1' - if(result.bool){ - var cards=result.links; + var num = Math.min(5, player.hp, _status.renku.length); + trigger.player.chooseButton( + ["选择获得" + get.cnNumber(num) + "张牌", _status.renku], + true, + num + ); + ("step 1"); + if (result.bool) { + var cards = result.links; _status.renku.removeArray(cards); game.updateRenku(); - trigger.player.gain(cards,'gain2','fromRenku'); - trigger.player.addTempSkill('spsongshu_block'); + trigger.player.gain(cards, "gain2", "fromRenku"); + trigger.player.addTempSkill("spsongshu_block"); } }, - init:function(player){ - player.storage.renku=true; + init: function (player) { + player.storage.renku = true; }, - subSkill:{ - block:{ - mod:{ - playerEnabled:function(card,player,target){ - if(player!=target) return false; + subSkill: { + block: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; }, }, - mark:true, - intro:{content:'不能对其他角色使用牌'}, + mark: true, + intro: { content: "不能对其他角色使用牌" }, }, }, }, //张机 - jishi:{ - audio:2, - trigger:{player:'useCardAfter'}, - forced:true, - filter:function(event,player){ - return event.cards.filterInD().length>0&&!player.getHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }).length; + jishi: { + audio: 2, + trigger: { player: "useCardAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.cards.filterInD().length > 0 && + !player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length + ); }, - content:function(){ - var cards=trigger.cards.filterInD(); - game.log(player,'将',cards,'置于了仁库'); - game.cardsGotoSpecial(cards,'toRenku'); + content: function () { + var cards = trigger.cards.filterInD(); + game.log(player, "将", cards, "置于了仁库"); + game.cardsGotoSpecial(cards, "toRenku"); }, - init:function(player){ - player.storage.renku=true; + init: function (player) { + player.storage.renku = true; }, - group:'jishi_draw', - subSkill:{ - draw:{ - trigger:{ - global:['gainAfter','cardsDiscardAfter'], + group: "jishi_draw", + subSkill: { + draw: { + trigger: { + global: ["gainAfter", "cardsDiscardAfter"], }, - forced:true, - filter:function(event,player){ - return event.fromRenku==true&&!event.outRange; + forced: true, + filter: function (event, player) { + return event.fromRenku == true && !event.outRange; }, - content:function(){ + content: function () { player.draw(); }, }, }, }, - xinliaoyi:{ - audio:'liaoyi', - trigger:{global:'phaseBegin'}, - filter:function(event,player){ - if(player==event.player) return false; - if(_status.renku.length) return true; - return event.player.countCards('h')>event.player.hp; + xinliaoyi: { + audio: "liaoyi", + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + if (_status.renku.length) return true; + return event.player.countCards("h") > event.player.hp; }, - direct:true, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - var num=Math.max(0,target.countCards('h')-target.hp); - var choiceList=['令其从仁库中获得一张牌','令其将'+get.cnNumber(num)+'张手牌置入仁库']; - var choices=[]; - if(_status.renku.length) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(target.countCards('h')>target.hp){ - event.num=num; - choices.push('选项二'); - } - else choiceList[1]=''+choiceList[1]+''; - if(!choices.length) event.finish(); - else player.chooseControl(choices,'cancel2').set('prompt',get.prompt('xinliaoyi',target)).set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player,target=_status.event.getTrigger().player; - var att=get.attitude(player,target); - if(att>0){ - if(_status.renku.length>0) return '选项一'; - return 0; - } - if(target.countCards('h')>target.hp) return '选项二'; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('xinliaoyi',target); - if(result.control=='选项一'){ - target.chooseButton(true,['选择获得一张牌',_status.renku]).set('ai',function(button){ - return get.value(button.link,_status.event.player); + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var num = Math.max(0, target.countCards("h") - target.hp); + var choiceList = [ + "令其从仁库中获得一张牌", + "令其将" + get.cnNumber(num) + "张手牌置入仁库", + ]; + var choices = []; + if (_status.renku.length) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (target.countCards("h") > target.hp) { + event.num = num; + choices.push("选项二"); + } else choiceList[1] = '' + choiceList[1] + ""; + if (!choices.length) event.finish(); + else + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("xinliaoyi", target)) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var att = get.attitude(player, target); + if (att > 0) { + if (_status.renku.length > 0) return "选项一"; + return 0; + } + if (target.countCards("h") > target.hp) return "选项二"; + return "cancel2"; }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("xinliaoyi", target); + if (result.control == "选项一") { + target + .chooseButton(true, ["选择获得一张牌", _status.renku]) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); event.goto(4); + } else { + var hs = target.getCards("h"); + if (hs.length <= num) event._result = { bool: true, cards: hs }; + else + target.chooseCard( + "h", + true, + "将" + get.cnNumber(num) + "张手牌置于仁库中", + num + ); } - else{ - var hs=target.getCards('h'); - if(hs.length<=num) event._result={bool:true,cards:hs}; - else target.chooseCard('h',true,'将'+get.cnNumber(num)+'张手牌置于仁库中',num); - } - } - else event.finish(); - 'step 2' - if(result.bool){ - target.$throw(result.cards,1000); - game.log(target,'将',result.cards,'置入了仁库'); - target.lose(result.cards,ui.special,'toRenku'); - } - else event.finish(); - 'step 3' + } else event.finish(); + ("step 2"); + if (result.bool) { + target.$throw(result.cards, 1000); + game.log(target, "将", result.cards, "置入了仁库"); + target.lose(result.cards, ui.special, "toRenku"); + } else event.finish(); + ("step 3"); game.delayx(); event.finish(); - 'step 4' - var cards=result.links; + ("step 4"); + var cards = result.links; _status.renku.removeArray(cards); game.updateRenku(); - target.gain(cards,'gain2','fromRenku'); + target.gain(cards, "gain2", "fromRenku"); }, - init:function(player){ - player.storage.renku=true; + init: function (player) { + player.storage.renku = true; }, - ai:{threaten:3.4}, + ai: { threaten: 3.4 }, }, - liaoyi:{ - audio:2, - trigger:{global:'phaseBegin'}, - filter:function(event,player){ - if(player==event.player) return false; - var num=event.player.hp-event.player.countCards('h'); - if(num<0) return true; - return num>0&&_status.renku.length>=Math.min(4,num); + liaoyi: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + if (player == event.player) return false; + var num = event.player.hp - event.player.countCards("h"); + if (num < 0) return true; + return num > 0 && _status.renku.length >= Math.min(4, num); }, - logTarget:'player', - prompt2:function(event,player){ - var target=event.player,num=target.hp-target.countCards('h'); - if(num<0) return '令'+get.translation(target)+'将'+get.cnNumber(Math.min(4,-num))+'张牌置入仁库'; - return '令'+get.translation(target)+'从仁库中获得'+get.cnNumber(Math.min(4,num))+'张牌'; + logTarget: "player", + prompt2: function (event, player) { + var target = event.player, + num = target.hp - target.countCards("h"); + if (num < 0) + return ( + "令" + + get.translation(target) + + "将" + + get.cnNumber(Math.min(4, -num)) + + "张牌置入仁库" + ); + return ( + "令" + + get.translation(target) + + "从仁库中获得" + + get.cnNumber(Math.min(4, num)) + + "张牌" + ); }, - check:function(event,player){ - var target=event.player,num=target.hp-target.countCards('h'),att=get.attitude(player,target); - if(num<0){ - if(target.countCards('e',function(card){ - return get.value(card,target)<=0; - })>=(-num/2)) return att>0; - return att<=0; + check: function (event, player) { + var target = event.player, + num = target.hp - target.countCards("h"), + att = get.attitude(player, target); + if (num < 0) { + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) >= + -num / 2 + ) + return att > 0; + return att <= 0; } - return att>0; + return att > 0; }, - content:function(){ - 'step 0' - var target=trigger.player,num=target.hp-target.countCards('h'); - event.target=target; - if(num<0){ - num=Math.min(4,-num); - target.chooseCard('he',true,'将'+get.cnNumber(num)+'张牌置于仁库中',num); - } - else{ - num=Math.min(4,num); - target.chooseButton(['选择获得'+get.cnNumber(num)+'张牌',_status.renku],num,true).set('ai',function(button){ - return get.value(button.link,_status.event.player); - }); + content: function () { + "step 0"; + var target = trigger.player, + num = target.hp - target.countCards("h"); + event.target = target; + if (num < 0) { + num = Math.min(4, -num); + target.chooseCard("he", true, "将" + get.cnNumber(num) + "张牌置于仁库中", num); + } else { + num = Math.min(4, num); + target + .chooseButton(["选择获得" + get.cnNumber(num) + "张牌", _status.renku], num, true) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); event.goto(3); } - 'step 1' - if(result.bool){ - target.$throw(result.cards,1000); - game.log(target,'将',result.cards,'置入了仁库'); - target.lose(result.cards,ui.special,'toRenku'); - } - else event.finish(); - 'step 2' + ("step 1"); + if (result.bool) { + target.$throw(result.cards, 1000); + game.log(target, "将", result.cards, "置入了仁库"); + target.lose(result.cards, ui.special, "toRenku"); + } else event.finish(); + ("step 2"); game.delayx(); event.finish(); - 'step 3' - var cards=result.links; + ("step 3"); + var cards = result.links; _status.renku.removeArray(cards); game.updateRenku(); - target.gain(cards,'gain2','fromRenku'); + target.gain(cards, "gain2", "fromRenku"); }, }, - binglun:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return _status.renku.length>0; + binglun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return _status.renku.length > 0; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('病论',_status.renku); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("病论", _status.renku); }, - backup:function(links,player){ - var obj=lib.skill.binglun_backup; - obj.card=links[0]; + backup: function (links, player) { + var obj = lib.skill.binglun_backup; + obj.card = links[0]; return obj; }, - prompt:()=>'请选择【病论】的目标', + prompt: () => "请选择【病论】的目标", }, - subSkill:{ - backup:{ - audio:'binglun', - filterCard:()=>false, - selectCard:-1, - filterTarget:true, - delay:false, - content:function(){ - 'step 0' - var card=lib.skill.binglun_backup.card; - game.log(card,'从仁库进入了弃牌堆'); - player.$throw(card,1000); + subSkill: { + backup: { + audio: "binglun", + filterCard: () => false, + selectCard: -1, + filterTarget: true, + delay: false, + content: function () { + "step 0"; + var card = lib.skill.binglun_backup.card; + game.log(card, "从仁库进入了弃牌堆"); + player.$throw(card, 1000); game.delayx(); - game.cardsDiscard(card).fromRenku=true; + game.cardsDiscard(card).fromRenku = true; _status.renku.remove(card); game.updateRenku(); - 'step 1' - target.chooseControl().set('choiceList',[ - '摸一张牌', - '于自己的下回合结束后回复1点体力', - ]).set('ai',function(){ - if(_status.event.player.isHealthy()) return 0; - return 1; - }); - 'step 2' - if(result.index==0) target.draw(); - else{ - target.addSkill('binglun_recover'); - target.addMark('binglun_recover',1,false); + ("step 1"); + target + .chooseControl() + .set("choiceList", ["摸一张牌", "于自己的下回合结束后回复1点体力"]) + .set("ai", function () { + if (_status.event.player.isHealthy()) return 0; + return 1; + }); + ("step 2"); + if (result.index == 0) target.draw(); + else { + target.addSkill("binglun_recover"); + target.addMark("binglun_recover", 1, false); } }, - ai:{ - result:{ - target:function(player,target){ - if(target.isDamaged()) return 1.5; + ai: { + result: { + target: function (player, target) { + if (target.isDamaged()) return 1.5; return 1; }, }, }, }, - recover:{ - trigger:{player:'phaseEnd'}, - forced:true, - popup:false, - onremove:true, - charlotte:true, - content:function(){ - if(player.isDamaged()){ - player.logSkill('binglun_recover'); - player.recover(player.countMark('binglun_recover')); + recover: { + trigger: { player: "phaseEnd" }, + forced: true, + popup: false, + onremove: true, + charlotte: true, + content: function () { + if (player.isDamaged()) { + player.logSkill("binglun_recover"); + player.recover(player.countMark("binglun_recover")); } - player.removeSkill('binglun_recover'); + player.removeSkill("binglun_recover"); }, - intro:{ - content:'下回合结束时回复#点体力', + intro: { + content: "下回合结束时回复#点体力", }, - ai:{threaten:1.7}, + ai: { threaten: 1.7 }, }, }, - ai:{ - order:2, - result:{ - player:1, + ai: { + order: 2, + result: { + player: 1, }, }, }, - mjweipo:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return !current.hasSkill('mjweipo_effect'); + mjweipo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return !current.hasSkill("mjweipo_effect"); }); }, - filterTarget:function(card,player,target){ - return !target.hasSkill('mjweipo_effect'); + filterTarget: function (card, player, target) { + return !target.hasSkill("mjweipo_effect"); }, - content:function(){ - 'step 0' - var list=['binglinchengxiax']; + content: function () { + "step 0"; + var list = ["binglinchengxiax"]; list.addArray(get.zhinangs()); - player.chooseButton(['危迫:选择一个智囊',[list,'vcard']],true).set('ai',function(button){ - return _status.event.getParent().target.getUseValue({name:button.link[2]}); - }); - 'step 1' - if(result.bool){ - var name=result.links[0][2]; - game.log(player,'选择了','#y'+get.translation(name)); - target.storage.mjweipo_effect=name; - target.storage.mjweipo_source=player; - target.addSkill('mjweipo_effect'); + player + .chooseButton(["危迫:选择一个智囊", [list, "vcard"]], true) + .set("ai", function (button) { + return _status.event.getParent().target.getUseValue({ name: button.link[2] }); + }); + ("step 1"); + if (result.bool) { + var name = result.links[0][2]; + game.log(player, "选择了", "#y" + get.translation(name)); + target.storage.mjweipo_effect = name; + target.storage.mjweipo_source = player; + target.addSkill("mjweipo_effect"); game.delayx(); } }, - ai:{ - order:7.1, - result:{ - target:function(player,target){ - if(target==player) return player.countCards('hs','sha')>0?10:0.01; - return (target.countCards('hs','sha')+0.5)*Math.sqrt(Math.max(1,target.hp)); + ai: { + order: 7.1, + result: { + target: function (player, target) { + if (target == player) return player.countCards("hs", "sha") > 0 ? 10 : 0.01; + return (target.countCards("hs", "sha") + 0.5) * Math.sqrt(Math.max(1, target.hp)); }, }, }, }, - mjweipo_effect:{ - audio:'mjweipo', - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h','sha')>0; + mjweipo_effect: { + audio: "mjweipo", + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", "sha") > 0; }, - prompt:function(){ - return '弃置一张【杀】并获得一张'+get.translation(_status.event.player.storage.mjweipo_effect); + prompt: function () { + return ( + "弃置一张【杀】并获得一张" + + get.translation(_status.event.player.storage.mjweipo_effect) + ); }, - filterCard:{name:'sha'}, - check:function(card){ - return 6-get.value(card); + filterCard: { name: "sha" }, + check: function (card) { + return 6 - get.value(card); }, - position:'h', - popname:true, - content:function(){ - var name=player.storage.mjweipo_effect,card=false; - if(name=='binglinchengxiax'){ - if(!_status.binglinchengxiax){ - _status.binglinchengxiax=[ - ['spade',7], - ['club',7], - ['club',13], + position: "h", + popname: true, + content: function () { + var name = player.storage.mjweipo_effect, + card = false; + if (name == "binglinchengxiax") { + if (!_status.binglinchengxiax) { + _status.binglinchengxiax = [ + ["spade", 7], + ["club", 7], + ["club", 13], ]; - game.broadcastAll(function(){lib.inpile.add('binglinchengxiax')}); + game.broadcastAll(function () { + lib.inpile.add("binglinchengxiax"); + }); } - if(_status.binglinchengxiax.length){ - var info=_status.binglinchengxiax.randomRemove(); - card=game.createCard2('binglinchengxiax',info[0],info[1]); + if (_status.binglinchengxiax.length) { + var info = _status.binglinchengxiax.randomRemove(); + card = game.createCard2("binglinchengxiax", info[0], info[1]); } } - if(!card) card=get.cardPile2(name); - if(card) player.gain(card,'gain2'); - player.removeSkill('mjweipo_effect'); + if (!card) card = get.cardPile2(name); + if (card) player.gain(card, "gain2"); + player.removeSkill("mjweipo_effect"); }, - ai:{ - order:7, - result:{player:1}, + ai: { + order: 7, + result: { player: 1 }, }, - mark:true, - marktext:'迫', - intro:{content:'可弃置一张【杀】并获得【$】'}, - group:'mjweipo_remove', + mark: true, + marktext: "迫", + intro: { content: "可弃置一张【杀】并获得【$】" }, + group: "mjweipo_remove", }, - mjweipo_remove:{ - trigger:{global:['phaseBegin','die']}, - forced:true, - firstDo:true, - popup:false, - filter:function(event,player){ - return event.player==player.storage.mjweipo_source; + mjweipo_remove: { + trigger: { global: ["phaseBegin", "die"] }, + forced: true, + firstDo: true, + popup: false, + filter: function (event, player) { + return event.player == player.storage.mjweipo_source; }, - content:function(){ - player.removeSkill('mjweipo_effect'); + content: function () { + player.removeSkill("mjweipo_effect"); }, }, - mjchenshi:{ - audio:2, - global:['mjchenshi_player','mjchenshi_target'], - ai:{combo:'mjweipo'}, + mjchenshi: { + audio: 2, + global: ["mjchenshi_player", "mjchenshi_target"], + ai: { combo: "mjweipo" }, }, - mjchenshi_player:{ - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - if(!event.card||event.card.name!='binglinchengxiax'||!event.isFirstTarget) return false; - return player.countCards('he')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.hasSkill('mjchenshi'); - }); + mjchenshi_player: { + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + if (!event.card || event.card.name != "binglinchengxiax" || !event.isFirstTarget) + return false; + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); + }) + ); }, - content:function(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('mjchenshi'); + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); }); player.chooseCardTarget({ - prompt:'是否交给'+get.translation(list)+'一张牌,将牌堆顶三张牌中不为【杀】的牌置于弃牌堆?', - filterCard:true, - position:'he', - filterTarget:function(card,player,target){ + prompt: + "是否交给" + + get.translation(list) + + "一张牌,将牌堆顶三张牌中不为【杀】的牌置于弃牌堆?", + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { return _status.event.list.includes(target); }, - list:list, - selectTarget:list.length>1?1:-1, - goon:function(){ - for(var i of list){ - if(get.attitude(player,i)>0) return 1; + list: list, + selectTarget: list.length > 1 ? 1 : -1, + goon: (function () { + for (var i of list) { + if (get.attitude(player, i) > 0) return 1; return -1; } - }(), - ai1:function(card){ - if(_status.event.goon>0) return 7-get.value(card); - return 0.01-get.value(card); + })(), + ai1: function (card) { + if (_status.event.goon > 0) return 7 - get.value(card); + return 0.01 - get.value(card); }, - ai2:function(target){ - var card=ui.selected.cards[0]; - return get.value(card,target)*get.attitude(_status.event.player,target); + ai2: function (target) { + var card = ui.selected.cards[0]; + return get.value(card, target) * get.attitude(_status.event.player, target); }, }); - 'step 1' - if(result.bool&&result.cards.length&&result.targets.length){ - var target=result.targets[0]; - target.logSkill('mjchenshi'); - player.line(target,'green'); - player.give(result.cards,target); - trigger.getParent().mjchenshi_ai=true; - } - else event.finish(); - 'step 2' - var cards=get.cards(3); - for(var i=cards.length-1;i>=0;i--){ - if(cards[i].name=='sha'){ + ("step 1"); + if (result.bool && result.cards.length && result.targets.length) { + var target = result.targets[0]; + target.logSkill("mjchenshi"); + player.line(target, "green"); + player.give(result.cards, target); + trigger.getParent().mjchenshi_ai = true; + } else event.finish(); + ("step 2"); + var cards = get.cards(3); + for (var i = cards.length - 1; i >= 0; i--) { + if (cards[i].name == "sha") { cards[i].fix(); - ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); - cards.splice(i,1); + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + cards.splice(i, 1); } } - if(cards.length){ - player.$throw(cards,1000); + if (cards.length) { + player.$throw(cards, 1000); game.delayx(); game.cardsDiscard(cards); - game.log(cards,'进入了弃牌堆'); + game.log(cards, "进入了弃牌堆"); } }, }, - mjchenshi_target:{ - trigger:{target:'useCardToTargeted'}, - direct:true, - filter:function(event,player){ - if(!event.card||event.card.name!='binglinchengxiax') return false; - return player.countCards('he')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.hasSkill('mjchenshi'); - }); + mjchenshi_target: { + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + if (!event.card || event.card.name != "binglinchengxiax") return false; + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); + }) + ); }, - content:function(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('mjchenshi'); + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player && current.hasSkill("mjchenshi"); }); player.chooseCardTarget({ - prompt:'是否交给'+get.translation(list)+'一张牌,将牌堆顶三张牌中的【杀】置于弃牌堆?', - filterCard:true, - position:'he', - filterTarget:function(card,player,target){ + prompt: + "是否交给" + + get.translation(list) + + "一张牌,将牌堆顶三张牌中的【杀】置于弃牌堆?", + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { return _status.event.list.includes(target); }, - list:list, - selectTarget:list.length>1?1:-1, - goon:function(){ - if(trigger.getParent().chenshi_ai) return 1; - for(var i of list){ - if(get.attitude(player,i)>0) return 1; + list: list, + selectTarget: list.length > 1 ? 1 : -1, + goon: (function () { + if (trigger.getParent().chenshi_ai) return 1; + for (var i of list) { + if (get.attitude(player, i) > 0) return 1; return -1; } - }(), - ai1:function(card){ - if(_status.event.goon>0) return 7-get.value(card); - return 3-get.value(card); + })(), + ai1: function (card) { + if (_status.event.goon > 0) return 7 - get.value(card); + return 3 - get.value(card); }, - ai2:function(target){ - var card=ui.selected.cards[0]; - return Math.max(0.1,get.value(card,target)*get.attitude(_status.event.player,target)); + ai2: function (target) { + var card = ui.selected.cards[0]; + return Math.max( + 0.1, + get.value(card, target) * get.attitude(_status.event.player, target) + ); }, }); - 'step 1' - if(result.bool&&result.cards.length&&result.targets.length){ - var target=result.targets[0]; - target.logSkill('mjchenshi'); - player.line(target,'green'); - player.give(result.cards,target); - } - else event.finish(); - 'step 2' - var cards=get.cards(3); - for(var i=cards.length-1;i>=0;i--){ - if(cards[i].name!='sha'){ + ("step 1"); + if (result.bool && result.cards.length && result.targets.length) { + var target = result.targets[0]; + target.logSkill("mjchenshi"); + player.line(target, "green"); + player.give(result.cards, target); + } else event.finish(); + ("step 2"); + var cards = get.cards(3); + for (var i = cards.length - 1; i >= 0; i--) { + if (cards[i].name != "sha") { cards[i].fix(); - ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); - cards.splice(i,1); + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + cards.splice(i, 1); } } - if(cards.length){ - player.$throw(cards,1000); + if (cards.length) { + player.$throw(cards, 1000); game.delayx(); game.cardsDiscard(cards); - game.log(cards,'进入了弃牌堆'); + game.log(cards, "进入了弃牌堆"); } }, }, - mjmouzhi:{ - audio:2, - trigger:{player:'damageBegin2'}, - forced:true, - filter:function(event,player){ - if(!event.card||get.suit(event.card)=='none') return false; - var all=player.getAllHistory('damage'); - if(!all.length) return false; - return all[all.length-1].card&&get.suit(all[all.length-1].card)==get.suit(event.card); + mjmouzhi: { + audio: 2, + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + if (!event.card || get.suit(event.card) == "none") return false; + var all = player.getAllHistory("damage"); + if (!all.length) return false; + return ( + all[all.length - 1].card && get.suit(all[all.length - 1].card) == get.suit(event.card) + ); }, - content:function(){ + content: function () { trigger.cancel(); }, - group:'mjmouzhi_mark', - intro:{content:'上次受到伤害的花色:$'}, - ai:{ - effect:{ - target:(card,player,target)=>{ - if(typeof card==='object'&&get.tag(card,'damage')){ - let suit=get.suit(card); - if(suit==='none') return; - let all=target.getAllHistory('damage'); - if(!all.length||!all[all.length-1].card) return; - if(get.suit(all[all.length-1].card)===suit) return 'zeroplayertarget'; + group: "mjmouzhi_mark", + intro: { content: "上次受到伤害的花色:$" }, + ai: { + effect: { + target: (card, player, target) => { + if (typeof card === "object" && get.tag(card, "damage")) { + let suit = get.suit(card); + if (suit === "none") return; + let all = target.getAllHistory("damage"); + if (!all.length || !all[all.length - 1].card) return; + if (get.suit(all[all.length - 1].card) === suit) return "zeroplayertarget"; } }, }, }, - subSkill:{ - mark:{ - trigger:{player:'damage'}, - silent:true, - firstDo:true, - content:function(){ - if(!trigger.card||get.suit(trigger.card)=='none') player.unmarkSkill('mjmouzhi'); - else{ - player.markSkill('mjmouzhi'); - game.broadcastAll(function(player,suit){ - if(player.marks.mjmouzhi) player.marks.mjmouzhi.firstChild.innerHTML=get.translation(suit); - player.storage.mjmouzhi=suit; - },player,get.suit(trigger.card)) + subSkill: { + mark: { + trigger: { player: "damage" }, + silent: true, + firstDo: true, + content: function () { + if (!trigger.card || get.suit(trigger.card) == "none") + player.unmarkSkill("mjmouzhi"); + else { + player.markSkill("mjmouzhi"); + game.broadcastAll( + function (player, suit) { + if (player.marks.mjmouzhi) + player.marks.mjmouzhi.firstChild.innerHTML = + get.translation(suit); + player.storage.mjmouzhi = suit; + }, + player, + get.suit(trigger.card) + ); } }, }, }, }, - mjshengxi:{ - audio:'shengxi', - audioname:['feiyi'], - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.getHistory('useCard').length>0&&player.getHistory('sourceDamage').length==0; + mjshengxi: { + audio: "shengxi", + audioname: ["feiyi"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.getHistory("useCard").length > 0 && + player.getHistory("sourceDamage").length == 0 + ); }, - content:function(){ - 'step 0' - var list=get.zhinangs(); - player.chooseButton([ - '###'+get.prompt('mjshengxi')+'###获得一张智囊或摸一张牌', - [list,'vcard'], - [['摸一张牌','取消'],'tdnodes'], - ],true).set('ai',function(card){ - if(card.link[2]){ - if(!get.cardPile2(function(cardx){ - return cardx.name==card.link[2]; - })) return 0; - return (Math.random()+1.5)*get.value({name:card.link[2]},_status.event.player); - } - if(card.link=='摸一张牌') return 1; - return 0; - }); - 'step 1' - if(result.bool&&result.links[0]!='取消'){ - player.logSkill('mjshengxi'); - if(result.links[0]=='摸一张牌') player.draw(); - else{ - var card=get.cardPile2(function(card){ - return card.name==result.links[0][2]; - }); - if(card) player.gain(card,'gain2'); - } - } - }, - group:'mjshengxi_zhunbei', - subfrequent:['zhunbei'], - subSkill:{ - zhunbei:{ - audio:'shengxi', - audioname:['feiyi'], - trigger:{player:'phaseZhunbeiBegin'}, - frequent:true, - prompt2:'从游戏外或牌堆中获得一张【调剂盐梅】', - content:function(){ - if(!_status.tiaojiyanmei_suits||_status.tiaojiyanmei_suits.length>0){ - if(!lib.inpile.includes('tiaojiyanmei')) lib.inpile.add('tiaojiyanmei'); - if(!_status.tiaojiyanmei_suits) _status.tiaojiyanmei_suits=lib.suit.slice(0); - player.gain(game.createCard2('tiaojiyanmei',_status.tiaojiyanmei_suits.randomRemove(),6),'gain2'); + content: function () { + "step 0"; + var list = get.zhinangs(); + player + .chooseButton( + [ + "###" + get.prompt("mjshengxi") + "###获得一张智囊或摸一张牌", + [list, "vcard"], + [["摸一张牌", "取消"], "tdnodes"], + ], + true + ) + .set("ai", function (card) { + if (card.link[2]) { + if ( + !get.cardPile2(function (cardx) { + return cardx.name == card.link[2]; + }) + ) + return 0; + return ( + (Math.random() + 1.5) * + get.value({ name: card.link[2] }, _status.event.player) + ); } - else{ - var card=get.cardPile2(function(card){ - return card.name=='tiaojiyanmei'; - }); - if(card) player.gain(card,'gain2'); - } - }, - } - }, - }, - mjkuanji:{ - audio:'fyjianyu', - usable:1, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', - }, - direct:true, - filter:function(event,player){ - if(event.type!='discard') return false; - var evt=event.getl(player); - return evt.cards2.filterInD('d').length>0; - }, - content:function(){ - 'step 0' - var cards=trigger.getl(player).cards2; - player.chooseButton(['宽济:是否将一张牌交给一名其他角色?',cards.filterInD('d')]).set('ai',function(button){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })) return Math.abs(get.value(button.link,'raw'))+1; - return -get.value(button.link,'raw'); - }); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget('将'+get.translation(card)+'交给一名其他角色并摸一张牌',lib.filter.notMe,true).set('ai',function(target){ - var evt=_status.event.getParent(); - return get.attitude(evt.player,target)*get.value(evt.card,target)*(target.hasSkillTag('nogain')?0.1:1); + if (card.link == "摸一张牌") return 1; + return 0; }); + ("step 1"); + if (result.bool && result.links[0] != "取消") { + player.logSkill("mjshengxi"); + if (result.links[0] == "摸一张牌") player.draw(); + else { + var card = get.cardPile2(function (card) { + return card.name == result.links[0][2]; + }); + if (card) player.gain(card, "gain2"); + } } - else{ + }, + group: "mjshengxi_zhunbei", + subfrequent: ["zhunbei"], + subSkill: { + zhunbei: { + audio: "shengxi", + audioname: ["feiyi"], + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + prompt2: "从游戏外或牌堆中获得一张【调剂盐梅】", + content: function () { + if (!_status.tiaojiyanmei_suits || _status.tiaojiyanmei_suits.length > 0) { + if (!lib.inpile.includes("tiaojiyanmei")) lib.inpile.add("tiaojiyanmei"); + if (!_status.tiaojiyanmei_suits) + _status.tiaojiyanmei_suits = lib.suit.slice(0); + player.gain( + game.createCard2( + "tiaojiyanmei", + _status.tiaojiyanmei_suits.randomRemove(), + 6 + ), + "gain2" + ); + } else { + var card = get.cardPile2(function (card) { + return card.name == "tiaojiyanmei"; + }); + if (card) player.gain(card, "gain2"); + } + }, + }, + }, + }, + mjkuanji: { + audio: "fyjianyu", + usable: 1, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", + }, + direct: true, + filter: function (event, player) { + if (event.type != "discard") return false; + var evt = event.getl(player); + return evt.cards2.filterInD("d").length > 0; + }, + content: function () { + "step 0"; + var cards = trigger.getl(player).cards2; + player + .chooseButton(["宽济:是否将一张牌交给一名其他角色?", cards.filterInD("d")]) + .set("ai", function (button) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + return Math.abs(get.value(button.link, "raw")) + 1; + return -get.value(button.link, "raw"); + }); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget( + "将" + get.translation(card) + "交给一名其他角色并摸一张牌", + lib.filter.notMe, + true + ) + .set("ai", function (target) { + var evt = _status.event.getParent(); + return ( + get.attitude(evt.player, target) * + get.value(evt.card, target) * + (target.hasSkillTag("nogain") ? 0.1 : 1) + ); + }); + } else { player.storage.counttrigger.mjkuanji--; event.finish(); } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('mjkuanji',target); - target.gain(card,'gain2'); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("mjkuanji", target); + target.gain(card, "gain2"); player.draw(); } }, }, - mjdingyi:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + mjdingyi: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - logTarget:function(){ + logTarget: function () { return game.players; }, - content:function(){ - 'step 0' - var list=[]; - for(var i=0;i<4;i++) list.push(lib.skill['mjdingyi_'+i].title); - player.chooseControl().set('choiceList',list).set('prompt','定仪:请选择一个全局效果').set('ai',function(target){ - var list1=player.getEnemies().length; - var list2=game.players.length-list1; - if(list2-list1>1) return 0; - if(game.players.length<6) return 2; - return 3; - }); - 'step 1' - if(typeof result.index=='number'){ - var skill='mjdingyi_'+result.index; - game.log(player,'选择了','#g'+lib.skill[skill].title); - for(var i of game.players) i.addSkill(skill); + content: function () { + "step 0"; + var list = []; + for (var i = 0; i < 4; i++) list.push(lib.skill["mjdingyi_" + i].title); + player + .chooseControl() + .set("choiceList", list) + .set("prompt", "定仪:请选择一个全局效果") + .set("ai", function (target) { + var list1 = player.getEnemies().length; + var list2 = game.players.length - list1; + if (list2 - list1 > 1) return 0; + if (game.players.length < 6) return 2; + return 3; + }); + ("step 1"); + if (typeof result.index == "number") { + var skill = "mjdingyi_" + result.index; + game.log(player, "选择了", "#g" + lib.skill[skill].title); + for (var i of game.players) i.addSkill(skill); game.delayx(); } }, - subSkill:{ - 0:{ - title:'摸牌阶段的额定摸牌数+1', - charlotte:true, - mark:true, - marktext:'仪', - trigger:{player:'phaseDrawBegin'}, - forced:true, - filter:function(event,player){ + subSkill: { + 0: { + title: "摸牌阶段的额定摸牌数+1", + charlotte: true, + mark: true, + marktext: "仪", + trigger: { player: "phaseDrawBegin" }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=((player.storage.mjdingyi_plus||0)+1); + content: function () { + trigger.num += (player.storage.mjdingyi_plus || 0) + 1; }, - intro:{ - content:function(storage,player){ - return '摸牌阶段的额定摸牌数+'+(1*((player.storage.mjdingyi_plus||0)+1)); + intro: { + content: function (storage, player) { + return ( + "摸牌阶段的额定摸牌数+" + 1 * ((player.storage.mjdingyi_plus || 0) + 1) + ); }, }, }, - 1:{ - title:'手牌上限+2', - charlotte:true, - mark:true, - marktext:'仪', - mod:{ - maxHandcard:function(player,num){ - return num+2*((player.storage.mjdingyi_plus||0)+1); + 1: { + title: "手牌上限+2", + charlotte: true, + mark: true, + marktext: "仪", + mod: { + maxHandcard: function (player, num) { + return num + 2 * ((player.storage.mjdingyi_plus || 0) + 1); }, }, - intro:{ - content:function(storage,player){ - return '手牌上限+'+(2*((player.storage.mjdingyi_plus||0)+1)); + intro: { + content: function (storage, player) { + return "手牌上限+" + 2 * ((player.storage.mjdingyi_plus || 0) + 1); }, }, }, - 2:{ - title:'攻击范围+1', - charlotte:true, - mark:true, - marktext:'仪', - mod:{ - attackRange:function(player,num){ - return num+((player.storage.mjdingyi_plus||0)+1); + 2: { + title: "攻击范围+1", + charlotte: true, + mark: true, + marktext: "仪", + mod: { + attackRange: function (player, num) { + return num + ((player.storage.mjdingyi_plus || 0) + 1); }, }, - intro:{ - content:function(storage,player){ - return '攻击范围+'+((player.storage.mjdingyi_plus||0)+1); + intro: { + content: function (storage, player) { + return "攻击范围+" + ((player.storage.mjdingyi_plus || 0) + 1); }, }, }, - 3:{ - title:'脱离濒死状态后回复1点体力', - charlotte:true, - mark:true, - marktext:'仪', - trigger:{player:'dyingAfter'}, - forced:true, - filter:function(event,player){ + 3: { + title: "脱离濒死状态后回复1点体力", + charlotte: true, + mark: true, + marktext: "仪", + trigger: { player: "dyingAfter" }, + forced: true, + filter: function (event, player) { return player.isDamaged(); }, - content:function(){ - player.recover((player.storage.mjdingyi_plus||0)+1); + content: function () { + player.recover((player.storage.mjdingyi_plus || 0) + 1); }, - intro:{ - content:function(storage,player){ - return '脱离濒死状态后回复'+((player.storage.mjdingyi_plus||0)+1)+'点体力'; + intro: { + content: function (storage, player) { + return ( + "脱离濒死状态后回复" + + ((player.storage.mjdingyi_plus || 0) + 1) + + "点体力" + ); }, }, }, }, }, - mjzuici:{ - audio:'zuici', - trigger:{player:'damageEnd'}, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - for(var i=0;i<4;i++){ - if(event.source.hasSkill('mjdingyi_'+i)) return true; + mjzuici: { + audio: "zuici", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + for (var i = 0; i < 4; i++) { + if (event.source.hasSkill("mjdingyi_" + i)) return true; } return false; }, - logTarget:'source', - check:()=>false, - content:function(){ - 'step 0' - var target=trigger.source; - event.target=target; - for(var i=0;i<4;i++){ - if(target.hasSkill('mjdingyi_'+i)) target.removeSkill('mjdingyi_'+i); + logTarget: "source", + check: () => false, + content: function () { + "step 0"; + var target = trigger.source; + event.target = target; + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) target.removeSkill("mjdingyi_" + i); } - 'step 1' - var list=get.zhinangs(); - if(list.length){ - player.chooseButton(['选择要令'+get.translation(target)+'获得的智囊',[list,'vcard']],true); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=get.cardPile2(function(card){ - return card.name==result.links[0][2]; - }) - if(card) target.gain(card,'gain2'); + ("step 1"); + var list = get.zhinangs(); + if (list.length) { + player.chooseButton( + ["选择要令" + get.translation(target) + "获得的智囊", [list, "vcard"]], + true + ); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = get.cardPile2(function (card) { + return card.name == result.links[0][2]; + }); + if (card) target.gain(card, "gain2"); } }, - ai:{ - combo:'mjdingyi' - } + ai: { + combo: "mjdingyi", + }, }, - mjfubi:{ - audio:'fubi', - enable:'phaseUse', - filter:function(event,player){ - if(player.hasSkill('mjfubi_round')) return false; - return game.hasPlayer(function(current){ - for(var i=0;i<4;i++){ - if(current.hasSkill('mjdingyi_'+i)) return true; + mjfubi: { + audio: "fubi", + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("mjfubi_round")) return false; + return game.hasPlayer(function (current) { + for (var i = 0; i < 4; i++) { + if (current.hasSkill("mjdingyi_" + i)) return true; } }); }, - filterCard:true, - selectCard:[0,1], - filterTarget:function(card,player,target){ - if(ui.selected.cards.length){ - for(var i=0;i<4;i++){ - if(target.hasSkill('mjdingyi_'+i)) return true; + filterCard: true, + selectCard: [0, 1], + filterTarget: function (card, player, target) { + if (ui.selected.cards.length) { + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) return true; } } - var num=0; - for(var i=0;i<4;i++){ - if(target.hasSkill('mjdingyi_'+i)) return true; + var num = 0; + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) return true; } - return num>1&&num<4; + return num > 1 && num < 4; }, - check:()=>false, - position:'he', - content:function(){ - 'step 0' - player.addTempSkill('mjfubi_round','roundStart'); - if(cards.length){ - player.addSkill('mjfubi_clear'); - player.markAuto('mjfubi_clear',[target]); - target.addMark('mjdingyi_plus',1,false); - game.log(target,'的','#g【定仪】','效果增加一倍'); + check: () => false, + position: "he", + content: function () { + "step 0"; + player.addTempSkill("mjfubi_round", "roundStart"); + if (cards.length) { + player.addSkill("mjfubi_clear"); + player.markAuto("mjfubi_clear", [target]); + target.addMark("mjdingyi_plus", 1, false); + game.log(target, "的", "#g【定仪】", "效果增加一倍"); event.finish(); return; } - var list=[],nums=[]; - for(var i=0;i<4;i++){ - if(!target.hasSkill('mjdingyi_'+i)){ - list.push(lib.skill['mjdingyi_'+i].title); + var list = [], + nums = []; + for (var i = 0; i < 4; i++) { + if (!target.hasSkill("mjdingyi_" + i)) { + list.push(lib.skill["mjdingyi_" + i].title); nums.push(i); } } - if(list.length){ - event.nums=nums; - player.chooseControl().set('choiceList',list).set('prompt','辅弼:请选择为'+get.translation(target)+'更换的〖定仪〗效果').set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target; - if(get.attitude(player,target)>0&&!target.hasSkill('mjdingyi_0')) return 0; - return _status.event.getParent().nums.length-1; - }); + if (list.length) { + event.nums = nums; + player + .chooseControl() + .set("choiceList", list) + .set("prompt", "辅弼:请选择为" + get.translation(target) + "更换的〖定仪〗效果") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + if (get.attitude(player, target) > 0 && !target.hasSkill("mjdingyi_0")) + return 0; + return _status.event.getParent().nums.length - 1; + }); + } else event.finish(); + ("step 1"); + for (var i = 0; i < 4; i++) { + if (target.hasSkill("mjdingyi_" + i)) target.removeSkill("mjdingyi_" + i); } - else event.finish(); - 'step 1' - for(var i=0;i<4;i++){ - if(target.hasSkill('mjdingyi_'+i)) target.removeSkill('mjdingyi_'+i); - } - target.addSkill('mjdingyi_'+event.nums[result.index]); - game.log(target,'的效果被改为','#g'+lib.skill['mjdingyi_'+event.nums[result.index]].title); + target.addSkill("mjdingyi_" + event.nums[result.index]); + game.log( + target, + "的效果被改为", + "#g" + lib.skill["mjdingyi_" + event.nums[result.index]].title + ); }, - ai:{ - order:10, - expose:0, - result:{ - target:function(player,target){ - if(target.hasSkill('mjdingyi_0')) return -1; + ai: { + order: 10, + expose: 0, + result: { + target: function (player, target) { + if (target.hasSkill("mjdingyi_0")) return -1; return 2; }, }, - combo:'mjdingyi' + combo: "mjdingyi", }, - subSkill:{ - round:{}, - clear:{ - trigger:{player:['phaseBegin','dieBegin']}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - while(player.storage.mjfubi_clear&&player.storage.mjfubi_clear.length){ - var target=player.storage.mjfubi_clear.shift(); - if(target.hasMark('mjdingyi_plus')) target.removeMark('mjdingyi_plus',1,false); + subSkill: { + round: {}, + clear: { + trigger: { player: ["phaseBegin", "dieBegin"] }, + forced: true, + popup: false, + charlotte: true, + content: function () { + while (player.storage.mjfubi_clear && player.storage.mjfubi_clear.length) { + var target = player.storage.mjfubi_clear.shift(); + if (target.hasMark("mjdingyi_plus")) + target.removeMark("mjdingyi_plus", 1, false); } delete player.storage.mjfubi_clear; - player.removeSkill('mjfubi_clear'); + player.removeSkill("mjfubi_clear"); }, }, }, }, - boming:{ - audio:2, - enable:'phaseUse', - usable:2, - filter:function(event,player){ - return player.countCards('he')>0; + boming: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - position:'he', - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - content:function(){ - player.give(cards,target); + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); }, - check:function(card){ - return 5-get.value(card); + check: function (card) { + return 5 - get.value(card); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(!ui.selected.cards.length) return 0; - var card=ui.selected.cards[0]; - if(player.hasSkill('ejian')&&!player.getStorage('ejian').includes(target)){ - var dam=get.damageEffect(target,player,target); - if(dam>0) return dam; - var type=get.type(card,target),ts=target.getCards('he',function(card){ - return get.type(card)==type; - }); - if(ts.length){ - var val=get.value(ts,target); - if(val>get.value(card)) return -Math.max(1,val); + ai: { + order: 10, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var card = ui.selected.cards[0]; + if (player.hasSkill("ejian") && !player.getStorage("ejian").includes(target)) { + var dam = get.damageEffect(target, player, target); + if (dam > 0) return dam; + var type = get.type(card, target), + ts = target.getCards("he", function (card) { + return get.type(card) == type; + }); + if (ts.length) { + var val = get.value(ts, target); + if (val > get.value(card)) return -Math.max(1, val); return 0; } } - return get.value(card,target)/1.5; + return get.value(card, target) / 1.5; }, }, }, - group:'boming_draw', - subSkill:{ - draw:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.getHistory('lose',function(evt){ - return evt.getParent(2).name=='boming'; - }).length>1; + group: "boming_draw", + subSkill: { + draw: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player.getHistory("lose", function (evt) { + return evt.getParent(2).name == "boming"; + }).length > 1 + ); }, - content:function(){ + content: function () { player.draw(); }, }, }, }, - ejian:{ - audio:2, - trigger:{global:'gainAfter'}, - forced:true, - filter:function(event,player){ - var evt=event.getParent(),target=event.player; - if(evt.name!='boming'||evt.player!=player||player.getStorage('ejian').includes(target)||!target.isIn()) return false; - var he=target.getCards('he'),card=event.cards[0]; - if(!he.includes(card)) return false; - var type=get.type2(card); - for(var i of he){ - if(i!=card&&get.type2(i)==type) return true; + ejian: { + audio: 2, + trigger: { global: "gainAfter" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent(), + target = event.player; + if ( + evt.name != "boming" || + evt.player != player || + player.getStorage("ejian").includes(target) || + !target.isIn() + ) + return false; + var he = target.getCards("he"), + card = event.cards[0]; + if (!he.includes(card)) return false; + var type = get.type2(card); + for (var i of he) { + if (i != card && get.type2(i) == type) return true; } return false; }, - logTarget:'player', - content:function(){ - 'step 0' - event.cardType=get.type2(trigger.cards[0]); - event.target=trigger.player; - player.markAuto('ejian',[event.target]); - event.target.chooseControl().set('choiceList',[ - '受到1点伤害', - '展示手牌并弃置所有'+get.translation(event.cardType)+'牌', - ]).set('ai',function(event,player){ - if(get.damageEffect(player,_status.event.getParent().player,player)>=0) return 0; - var type=_status.event.cardType,cards=player.getCards('he',function(card){ - return get.type2(card)==type; - }); - if(cards.length==1) return 1; - if(cards.length>=2){ - for(var i=0;i= 0) + return 0; + var type = _status.event.cardType, + cards = player.getCards("he", function (card) { + return get.type2(card) == type; + }); + if (cards.length == 1) return 1; + if (cards.length >= 2) { + for (var i = 0; i < cards.length; i++) { + if (get.tag(cards[i], "save")) return 0; + } } - } - if(player.hp==1) return 1; - for(var i=0;i=8) return 0; - } - if(cards.length>2&&player.hp>2) return 0; - if(cards.length>3) return 0; - return 1; - }).set('cardType',event.cardType); - 'step 1' - if(result.index==1){ - if(target.countCards('h')>0) target.showHandcards(); - } - else{ + if (player.hp == 1) return 1; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) >= 8) return 0; + } + if (cards.length > 2 && player.hp > 2) return 0; + if (cards.length > 3) return 0; + return 1; + }) + .set("cardType", event.cardType); + ("step 1"); + if (result.index == 1) { + if (target.countCards("h") > 0) target.showHandcards(); + } else { target.damage(); event.finish(); } - 'step 2' - target.discard(target.getCards('he',function(card){ - return get.type2(card)==event.cardType; - })); + ("step 2"); + target.discard( + target.getCards("he", function (card) { + return get.type2(card) == event.cardType; + }) + ); }, - ai:{combo:'boming',halfneg:true}, - onremove:true, - intro:{content:'已对$发动过此技能'}, + ai: { combo: "boming", halfneg: true }, + onremove: true, + intro: { content: "已对$发动过此技能" }, }, - hxrenshi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h')>0&&(!player.storage.hxrenshi2||game.hasPlayer(function(current){ - return !player.storage.hxrenshi2.includes(current); - })) + hxrenshi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + (!player.storage.hxrenshi2 || + game.hasPlayer(function (current) { + return !player.storage.hxrenshi2.includes(current); + })) + ); }, - filterCard:true, - filterTarget:function(card,player,target){ - return !player.storage.hxrenshi2||!player.storage.hxrenshi2.includes(target); + filterCard: true, + filterTarget: function (card, player, target) { + return !player.storage.hxrenshi2 || !player.storage.hxrenshi2.includes(target); }, - position:'h', - discard:false, - lose:false, - delay:false, - check:function(cardx){ - var player=_status.event.player; - if(player.getStorage('debao').length==1&&(!game.hasPlayer(function(current){ - return get.attitude(player,current)>0&¤t.hp*1.5+current.countCards('h')<4; - })||game.hasPlayer(function(current){ - return get.attitude(player,current)<=0&¤t.hp*1.5+current.countCards('h')<4; - }))) return 0; - return 5-get.value(cardx); + position: "h", + discard: false, + lose: false, + delay: false, + check: function (cardx) { + var player = _status.event.player; + if ( + player.getStorage("debao").length == 1 && + (!game.hasPlayer(function (current) { + return ( + get.attitude(player, current) > 0 && + current.hp * 1.5 + current.countCards("h") < 4 + ); + }) || + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) <= 0 && + current.hp * 1.5 + current.countCards("h") < 4 + ); + })) + ) + return 0; + return 5 - get.value(cardx); }, - content:function(){ - player.addTempSkill('hxrenshi2','phaseUseEnd'); - player.markAuto('hxrenshi2',targets); - player.give(cards,target); + content: function () { + player.addTempSkill("hxrenshi2", "phaseUseEnd"); + player.markAuto("hxrenshi2", targets); + player.give(cards, target); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(ui.selected.cards.length) return get.value(ui.selected.cards[0],target)+0.1; + ai: { + order: 1, + result: { + target: function (player, target) { + if (ui.selected.cards.length) + return get.value(ui.selected.cards[0], target) + 0.1; return 0; }, }, }, }, - hxrenshi2:{ - onremove:true, + hxrenshi2: { + onremove: true, }, - debao:{ - audio:2, - trigger:{global:'gainAfter'}, - forced:true, - filter:function(event,player){ - if(player==event.player||player.getStorage('debao').length>=player.maxHp) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + debao: { + audio: 2, + trigger: { global: "gainAfter" }, + forced: true, + filter: function (event, player) { + if (player == event.player || player.getStorage("debao").length >= player.maxHp) + return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; }, - content:function(){ - var cards=get.cards(); - player.markAuto('debao',cards); - player.$gain2(cards[0],false); + content: function () { + var cards = get.cards(); + player.markAuto("debao", cards); + player.$gain2(cards[0], false); game.cardsGotoSpecial(cards); - game.log(player,'将',cards[0],'放在了武将牌上'); + game.log(player, "将", cards[0], "放在了武将牌上"); game.delayx(); }, - marktext:'仁', - intro:{content:'cards',onunmark:'throw'}, - group:'debao_gain', - subSkill:{ - gain:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.getStorage('debao').length>0; + marktext: "仁", + intro: { content: "cards", onunmark: "throw" }, + group: "debao_gain", + subSkill: { + gain: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.getStorage("debao").length > 0; }, - content:function(){ - var cards=player.storage.debao; - player.gain(cards,'gain2','fromStorage'); - cards.length=0; - player.unmarkSkill('debao'); + content: function () { + var cards = player.storage.debao; + player.gain(cards, "gain2", "fromStorage"); + cards.length = 0; + player.unmarkSkill("debao"); }, }, }, }, - buqi:{ - audio:2, - trigger:{global:'dying'}, - forced:true, - filter:function(event,player){ - return player.getStorage('debao').length>1; + buqi: { + audio: 2, + trigger: { global: "dying" }, + forced: true, + filter: function (event, player) { + return player.getStorage("debao").length > 1; }, - logTarget:'player', - content:function(){ - 'step 0' - var cards=player.getStorage('debao'); - if(cards.length==2) event._result={bool:true,links:cards.slice(0)}; - else player.chooseButton(['不弃:请选择移去两张“仁”',cards],2,true); - 'step 1' - if(result.bool){ - var cards=result.links; - player.unmarkAuto('debao',cards); - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); + logTarget: "player", + content: function () { + "step 0"; + var cards = player.getStorage("debao"); + if (cards.length == 2) event._result = { bool: true, links: cards.slice(0) }; + else player.chooseButton(["不弃:请选择移去两张“仁”", cards], 2, true); + ("step 1"); + if (result.bool) { + var cards = result.links; + player.unmarkAuto("debao", cards); + player.$throw(cards, 1000); + game.log(player, "将", cards, "置入了弃牌堆"); game.delayx(); game.cardsDiscard(cards); - } - else event.finish(); - 'step 2' - if(trigger.player.isIn()&&trigger.player.isDamaged()) trigger.player.recover(); + } else event.finish(); + ("step 2"); + if (trigger.player.isIn() && trigger.player.isDamaged()) trigger.player.recover(); }, - group:'buqi_die', - subSkill:{ - die:{ - trigger:{global:'dieAfter'}, - forced:true, - filter:function(event,player){ - return player.getStorage('debao').length>0; + group: "buqi_die", + subSkill: { + die: { + trigger: { global: "dieAfter" }, + forced: true, + filter: function (event, player) { + return player.getStorage("debao").length > 0; }, - content:function(){ - player.unmarkSkill('debao'); + content: function () { + player.unmarkSkill("debao"); }, }, }, - ai:{ - neg:true, - combo:'debao', + ai: { + neg: true, + combo: "debao", }, }, - guying:{ - audio:2, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + guying: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - forced:true, - usable:1, - filter:function(event,player){ - if(event.type!='discard'){ - var evt=event.getParent(); - if(evt.name!='useCard'&&evt.name!='respond') return false; + forced: true, + usable: 1, + filter: function (event, player) { + if (event.type != "discard") { + var evt = event.getParent(); + if (evt.name != "useCard" && evt.name != "respond") return false; } - var target=_status.currentPhase,evt=event.getl(player); - if(!evt.cards2||evt.cards2.length!=1||!target||target==player||!target.isIn()) return false; - return get.position(evt.cards2[0])=='d'||target.countCards('he')<0; + var target = _status.currentPhase, + evt = event.getl(player); + if ( + !evt.cards2 || + evt.cards2.length != 1 || + !target || + target == player || + !target.isIn() + ) + return false; + return get.position(evt.cards2[0]) == "d" || target.countCards("he") < 0; }, - logTarget:function(){ + logTarget: function () { return _status.currentPhase; }, - content:function(){ - 'step 0' - if(trigger.delay===false) game.delayx(); - event.target=_status.currentPhase; - event.card=trigger.getl(player).cards2[0]; - 'step 1' - player.addMark('guying',1,false); - event.addIndex=0; - var choiceList=[],str=get.translation(player); - if(target.countCards('he')>0) choiceList.push('随机交给'+str+'一张牌'); + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + event.target = _status.currentPhase; + event.card = trigger.getl(player).cards2[0]; + ("step 1"); + player.addMark("guying", 1, false); + event.addIndex = 0; + var choiceList = [], + str = get.translation(player); + if (target.countCards("he") > 0) choiceList.push("随机交给" + str + "一张牌"); else event.addIndex++; - if(get.position(card)=='d') choiceList.push('令'+str+'收回'+get.translation(card)); - if(choiceList.length==1) event._result={index:0}; - target.chooseControl().set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player,evt=_status.event.getParent(); - if(get.value(evt.card,evt.player)*get.attitude(player,evt.player)>0) return 0; - return Math.random()>(get.value(evt.card,evt.player)/6)?1:0; - //return 1; - }); - 'step 2' - if(result.index+event.addIndex==0){ - target.give(target.getCards('he').randomGet(),player); + if (get.position(card) == "d") + choiceList.push("令" + str + "收回" + get.translation(card)); + if (choiceList.length == 1) event._result = { index: 0 }; + target + .chooseControl() + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + evt = _status.event.getParent(); + if (get.value(evt.card, evt.player) * get.attitude(player, evt.player) > 0) + return 0; + return Math.random() > get.value(evt.card, evt.player) / 6 ? 1 : 0; + //return 1; + }); + ("step 2"); + if (result.index + event.addIndex == 0) { + target.give(target.getCards("he").randomGet(), player); event.finish(); - } - else player.gain(card,'gain2'); - 'step 3' - if(player.isIn()&&player.getCards('h').includes(card)&&get.type(card,player)=='equip') player.chooseUseTarget(card,true,'nopopup'); + } else player.gain(card, "gain2"); + ("step 3"); + if ( + player.isIn() && + player.getCards("h").includes(card) && + get.type(card, player) == "equip" + ) + player.chooseUseTarget(card, true, "nopopup"); }, - onremove:true, - intro:{content:'已发动过#次'}, - group:'guying_discard', - subSkill:{ - discard:{ - audio:'guying', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.countMark('guying')>0; + onremove: true, + intro: { content: "已发动过#次" }, + group: "guying_discard", + subSkill: { + discard: { + audio: "guying", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("guying") > 0; }, - content:function(){ - var num=player.countMark('guying'); - player.removeMark('guying',num,false); - player.chooseToDiscard('he',num,true); + content: function () { + var num = player.countMark("guying"); + player.removeMark("guying", num, false); + player.chooseToDiscard("he", num, true); }, }, }, }, - muzhen:{ - audio:2, - enable:'phaseUse', - usable:2, - filter:function(event,player){ - if(!player.hasSkill('muzhen1')&&player.countCards('e')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - })) return true; - if(!player.hasSkill('muzhen2')&&player.countCards('he')>1&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('e')>0; - })) return true; + muzhen: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + if ( + !player.hasSkill("muzhen1") && + player.countCards("e") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ) + return true; + if ( + !player.hasSkill("muzhen2") && + player.countCards("he") > 1 && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") > 0; + }) + ) + return true; return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[ - '将一张装备牌置于其他角色的装备区内并获得其一张手牌', - '将两张牌交给一名其他角色并获得其装备区内的一张牌', + chooseButton: { + dialog: function (event, player) { + var list = [ + "将一张装备牌置于其他角色的装备区内并获得其一张手牌", + "将两张牌交给一名其他角色并获得其装备区内的一张牌", ]; - var choiceList=ui.create.dialog('睦阵:请选择一项','hidden'); - choiceList.add([list.map((item,i)=>{ - return [i,item]; - }),'textbutton']); + var choiceList = ui.create.dialog("睦阵:请选择一项", "hidden"); + choiceList.add([ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ]); return choiceList; }, - filter:function(button,player){ - if(button.link==0) return !player.hasSkill('muzhen1')&&player.countCards('e')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - }) - return !player.hasSkill('muzhen2')&&player.countCards('he')>1&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('e')>0; - }); + filter: function (button, player) { + if (button.link == 0) + return ( + !player.hasSkill("muzhen1") && + player.countCards("e") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); + return ( + !player.hasSkill("muzhen2") && + player.countCards("he") > 1 && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") > 0; + }) + ); }, - backup:function(links){ + backup: function (links) { return { - audio:'muzhen', - filterTarget:[ - function(card,player,target){ - return target.countCards('h')>0&&target.canEquip(ui.selected.cards[0]); + audio: "muzhen", + filterTarget: [ + function (card, player, target) { + return ( + target.countCards("h") > 0 && target.canEquip(ui.selected.cards[0]) + ); + }, + function (card, player, target) { + return target.countCards("e") > 0; }, - function(card,player,target){ - return target.countCards('e')>0; - } ][links[0]], - filterCard:[ - function(card,player){ - if(ui.selected.targets.length) return ui.selected.targets[0].canEquip(card); - return game.hasPlayer(function(current){ - return current.countCards('h')>0&¤t.canEquip(card); - }) + filterCard: [ + function (card, player) { + if (ui.selected.targets.length) + return ui.selected.targets[0].canEquip(card); + return game.hasPlayer(function (current) { + return current.countCards("h") > 0 && current.canEquip(card); + }); }, true, ], - selectCard:1+links[0], - position:('eh')[links[0]], - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - player.addTempSkill('muzhen'+cards.length,'phaseUseEnd'); - if(cards.length==1){ - player.$giveAuto(cards[0],target); + selectCard: 1 + links[0], + position: "eh"[links[0]], + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.addTempSkill("muzhen" + cards.length, "phaseUseEnd"); + if (cards.length == 1) { + player.$giveAuto(cards[0], target); game.delayx(); target.equip(cards[0]); + } else { + player.give(cards, target); } - else{ - player.give(cards,target); - } - player.gainPlayerCard(target,cards.length==2?'e':'h',true); + player.gainPlayerCard(target, cards.length == 2 ? "e" : "h", true); }, - } + }; }, - prompt:function(){ - return '请选择【睦阵】的牌和目标' + prompt: function () { + return "请选择【睦阵】的牌和目标"; }, }, }, - muzhen1:{}, - muzhen2:{}, - sheyi2:{charlotte:true}, - sheyi:{ - audio:2, - trigger:{global:'damageBegin4'}, - direct:true, - filter:function(event,player){ - return !player.hasSkill('sheyi2')&&player!=event.player&&event.player.hp=Math.max(1,player.hp); + muzhen1: {}, + muzhen2: {}, + sheyi2: { charlotte: true }, + sheyi: { + audio: 2, + trigger: { global: "damageBegin4" }, + direct: true, + filter: function (event, player) { + return ( + !player.hasSkill("sheyi2") && + player != event.player && + event.player.hp < player.hp && + player.countCards("he") >= Math.max(1, player.hp) + ); }, - content:function(){ - 'step 0' - var num=Math.max(1,player.hp),target=trigger.player; - player.chooseCard('he',get.prompt('sheyi',target),'交给其至少'+get.cnNumber(num)+'张牌,防止即将受到的伤害('+trigger.num+'点)',[num,player.countCards('he')]).set('goon',function(){ - if(get.attitude(player,target)<0) return false; - if(trigger.num=0) return false; - if(trigger.num<2&&target.hp>trigger.num) return 6/Math.sqrt(num); - if(target==get.zhu(player)) return 9; - return 8/Math.sqrt(num); - }()).set('ai',function(card){ - if(ui.selected.cards.length>=Math.max(1,_status.event.player.hp)) return 0; - if(typeof _status.event.goon=='number') return _status.event.goon-get.value(card); - return 0; - }); - 'step 1' - if(result.bool){ - var target=trigger.player; - player.logSkill('sheyi',target); - player.addTempSkill('sheyi2','roundStart'); - player.give(result.cards,target); + content: function () { + "step 0"; + var num = Math.max(1, player.hp), + target = trigger.player; + player + .chooseCard( + "he", + get.prompt("sheyi", target), + "交给其至少" + + get.cnNumber(num) + + "张牌,防止即将受到的伤害(" + + trigger.num + + "点)", + [num, player.countCards("he")] + ) + .set( + "goon", + (function () { + if (get.attitude(player, target) < 0) return false; + if ( + trigger.num < target.hp && + get.damageEffect(target, trigger.source, player, trigger.nature) >= 0 + ) + return false; + if (trigger.num < 2 && target.hp > trigger.num) return 6 / Math.sqrt(num); + if (target == get.zhu(player)) return 9; + return 8 / Math.sqrt(num); + })() + ) + .set("ai", function (card) { + if (ui.selected.cards.length >= Math.max(1, _status.event.player.hp)) return 0; + if (typeof _status.event.goon == "number") + return _status.event.goon - get.value(card); + return 0; + }); + ("step 1"); + if (result.bool) { + var target = trigger.player; + player.logSkill("sheyi", target); + player.addTempSkill("sheyi2", "roundStart"); + player.give(result.cards, target); trigger.cancel(); } }, }, - tianyin:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - var list=[]; - player.getHistory('useCard',function(evt){ - list.add(get.type2(evt.card,false)); + tianyin: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + var list = []; + player.getHistory("useCard", function (evt) { + list.add(get.type2(evt.card, false)); }); - for(var i=0;i0; + xunyi3: { + audio: "xunyi", + trigger: { global: "damageEnd" }, + forced: true, + charlotte: true, + filter: function (event, player) { + var list = [player, player.storage.xunyi2]; + return ( + list.includes(event.player) && + !list.includes(event.source) && + (player == event.player ? player.storage.xunyi2 : player).countCards("he") > 0 + ); }, - logTarget:function(event,player){ + logTarget: function (event, player) { return player.storage.xunyi2; }, - content:function(){ - (player==trigger.player?player.storage.xunyi2:player).chooseToDiscard('he',true); + content: function () { + (player == trigger.player ? player.storage.xunyi2 : player).chooseToDiscard("he", true); }, }, //狗剩 - reduoji:{ - audio:'duoji', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0; + reduoji: { + audio: "duoji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - position:'he', - filterTarget:lib.filter.notMe, - discard:false, - toStorage:true, - delay:false, - check:function(card){ - return 3-get.value(card); + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + toStorage: true, + delay: false, + check: function (card) { + return 3 - get.value(card); }, - content:function(){ - 'step 0' - player.$give(cards[0],target,false); - target.markAuto('reduoji',cards); - game.log(player,'将',cards[0],'放在了',target,'的武将牌上'); - 'step 1' + content: function () { + "step 0"; + player.$give(cards[0], target, false); + target.markAuto("reduoji", cards); + game.log(player, "将", cards[0], "放在了", target, "的武将牌上"); + ("step 1"); game.delay(); }, - group:['reduoji_equip','reduoji_gain'], - intro:{ - content:'cards', - onunmark:'throw', + group: ["reduoji_equip", "reduoji_gain"], + intro: { + content: "cards", + onunmark: "throw", }, - ai:{ - order:1, - result:{target:-1}, + ai: { + order: 1, + result: { target: -1 }, }, - subSkill:{ - equip:{ - audio:'duoji', - trigger:{global:'equipAfter'}, - forced:true, - filter:function(event,player){ - if(player==event.player||!event.player.getStorage('reduoji').length||!event.player.getCards('e').includes(event.card)) return false; - var evt=event.getParent(2); - return evt.name=='useCard'&&evt.player==event.player; + subSkill: { + equip: { + audio: "duoji", + trigger: { global: "equipAfter" }, + forced: true, + filter: function (event, player) { + if ( + player == event.player || + !event.player.getStorage("reduoji").length || + !event.player.getCards("e").includes(event.card) + ) + return false; + var evt = event.getParent(2); + return evt.name == "useCard" && evt.player == event.player; }, - logTarget:'player', - content:function(){ - 'step 0' - player.gain(trigger.card,trigger.player,'give','bySelf'); - 'step 1' - var target=trigger.player,storage=target.getStorage('reduoji'); - if(storage.length){ - var card=storage[0]; - target.$throw(card,1000); - target.unmarkAuto('reduoji',[card]); - game.log(target,'移去了',card); + logTarget: "player", + content: function () { + "step 0"; + player.gain(trigger.card, trigger.player, "give", "bySelf"); + ("step 1"); + var target = trigger.player, + storage = target.getStorage("reduoji"); + if (storage.length) { + var card = storage[0]; + target.$throw(card, 1000); + target.unmarkAuto("reduoji", [card]); + game.log(target, "移去了", card); game.cardsDiscard(card); target.draw(); } }, }, - gain:{ - audio:'duoji', - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return event.player.getStorage('reduoji').length>0; + gain: { + audio: "duoji", + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return event.player.getStorage("reduoji").length > 0; }, - logTarget:'player', - content:function(){ - var target=trigger.player,cards=target.storage.reduoji; - target.$give(cards,player); - player.gain(cards,'fromStorage'); - cards.length=0; - target.unmarkSkill('reduoji'); + logTarget: "player", + content: function () { + var target = trigger.player, + cards = target.storage.reduoji; + target.$give(cards, player); + player.gain(cards, "fromStorage"); + cards.length = 0; + target.unmarkSkill("reduoji"); game.delay(); }, }, }, }, //SP辛毗 - spyinju:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - "step 0" - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'引裾:对'+get.translation(player)+'使用一张杀,或跳过下回合的出牌阶段和弃牌阶段').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',player); - "step 1" - if(!result.bool) target.addSkill('spyinju2'); + spyinju: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "引裾:对" + + get.translation(player) + + "使用一张杀,或跳过下回合的出牌阶段和弃牌阶段") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player); + ("step 1"); + if (!result.bool) target.addSkill("spyinju2"); }, - ai:{ - order:1, - expose:0.2, - result:{ - target:-1.5, - player:function(player,target){ - if(!target.canUse('sha',player)) return 0; - if(target.countCards('h')==0) return 0; - if(target.countCards('h')==1) return -0.1; - if(player.countCards('h','shan')==0) return -1; - if(player.hp<2) return -2; + ai: { + order: 1, + expose: 0.2, + result: { + target: -1.5, + player: function (player, target) { + if (!target.canUse("sha", player)) return 0; + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.countCards("h", "shan") == 0) return -1; + if (player.hp < 2) return -2; return -0.5; - } + }, }, - threaten:1.1 - } + threaten: 1.1, + }, }, - spyinju2:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - charlotte:true, - content:function(){ - player.skip('phaseUse'); - player.skip('phaseDiscard'); - player.removeSkill('spyinju2'); - game.log(player,'跳过了出牌阶段'); - game.log(player,'跳过了弃牌阶段'); + spyinju2: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + content: function () { + player.skip("phaseUse"); + player.skip("phaseDiscard"); + player.removeSkill("spyinju2"); + game.log(player, "跳过了出牌阶段"); + game.log(player, "跳过了弃牌阶段"); }, - mark:true, - intro:{content:'衣襟被拽住了,下个准备阶段开始时跳过出牌阶段和弃牌阶段'}, + mark: true, + intro: { content: "衣襟被拽住了,下个准备阶段开始时跳过出牌阶段和弃牌阶段" }, }, - spchijie:{ - audio:2, - trigger:{target:'useCardToTarget'}, - usable:1, - filter:function(event,player){ - return event.player!=player&&event.targets.length==1; + spchijie: { + audio: 2, + trigger: { target: "useCardToTarget" }, + usable: 1, + filter: function (event, player) { + return event.player != player && event.targets.length == 1; }, - check:function(event,player){ - return get.effect(player,event.card,event.player,player)<0; + check: function (event, player) { + return get.effect(player, event.card, event.player, player) < 0; }, - content:function(){ - 'step 0' - player.judge(function(card){ - if(get.number(card)>6) return 2; + content: function () { + "step 0"; + player.judge(function (card) { + if (get.number(card) > 6) return 2; return 0; - }).judge2=function(result){ - return result.bool?true:false; + }).judge2 = function (result) { + return result.bool ? true : false; }; - 'step 1' - if(result.bool){ - trigger.targets.length=0; - trigger.getParent().triggeredTargets2.length=0; + ("step 1"); + if (result.bool) { + trigger.targets.length = 0; + trigger.getParent().triggeredTargets2.length = 0; trigger.cancel(); } }, }, //糜夫人 - spcunsi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ + spcunsi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { return !player.isTurnedOver(); }, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; player.turnOver(); - 'step 1' - var card=get.cardPile(function(card){ - return card.name=='sha'; + ("step 1"); + var card = get.cardPile(function (card) { + return card.name == "sha"; }); - if(card) target.gain(card,'gain2'); - 'step 2' - target.addSkill('spcunsi2'); - target.addMark('spcunsi2',1,false); + if (card) target.gain(card, "gain2"); + ("step 2"); + target.addSkill("spcunsi2"); + target.addMark("spcunsi2", 1, false); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var card={name:'sha',isCard:true}; - if(!target.hasSkillTag('nogain')&&game.hasPlayer(function(current){ - return (get.attitude(target,current)<0&& - !current.hasShan() - &&target.canUse(card,current)&& - !current.hasSkillTag('filterDamage',null,{ - player:target, - card:card, - jiu:true, - })&& - get.effect(current,card,target)>0); - })){ + ai: { + order: 1, + result: { + target: function (player, target) { + var card = { name: "sha", isCard: true }; + if ( + !target.hasSkillTag("nogain") && + game.hasPlayer(function (current) { + return ( + get.attitude(target, current) < 0 && + !current.hasShan() && + target.canUse(card, current) && + !current.hasSkillTag("filterDamage", null, { + player: target, + card: card, + jiu: true, + }) && + get.effect(current, card, target) > 0 + ); + }) + ) { return 4; } return 0; @@ -5303,686 +6523,815 @@ game.import('character', function () { }, }, }, - spcunsi2:{ - charlotte:true, - trigger:{player:'useCard1'}, - firstDo:true, - forced:true, - popup:false, - onremove:true, - filter:function(event,player){ - return event.card.name=='sha'; + spcunsi2: { + charlotte: true, + trigger: { player: "useCard1" }, + firstDo: true, + forced: true, + popup: false, + onremove: true, + filter: function (event, player) { + return event.card.name == "sha"; }, - content:function(){ - trigger.baseDamage+=player.countMark('spcunsi2'); - player.removeSkill('spcunsi2'); + content: function () { + trigger.baseDamage += player.countMark("spcunsi2"); + player.removeSkill("spcunsi2"); }, - marktext:'嗣', - intro:{ - content:'下一张【杀】的伤害+#', + marktext: "嗣", + intro: { + content: "下一张【杀】的伤害+#", }, }, - spguixiu:{ - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - if(typeof event.spguixiu=='boolean'&&!event.spguixiu) return false; + spguixiu: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + if (typeof event.spguixiu == "boolean" && !event.spguixiu) return false; return player.isTurnedOver(); }, - content:function(){ + content: function () { player.turnOver(); }, - group:['spguixiu_draw','spguixiu_count'], - subSkill:{ - count:{ - trigger:{player:'damageBegin2'}, - lastDo:true, - silent:true, - content:function(){ - event.spguixiu=player.isTurnedOver(); + group: ["spguixiu_draw", "spguixiu_count"], + subSkill: { + count: { + trigger: { player: "damageBegin2" }, + lastDo: true, + silent: true, + content: function () { + event.spguixiu = player.isTurnedOver(); }, }, - draw:{ - trigger:{player:'turnOverAfter'}, - forced:true, - filter:function(event,player){ + draw: { + trigger: { player: "turnOverAfter" }, + forced: true, + filter: function (event, player) { return !player.isTurnedOver(); }, - content:function(){ + content: function () { player.draw(); }, }, }, }, //那个男人的舅舅 - heji:{ - audio:2, - trigger:{global:'useCardAfter'}, - direct:true, - locked:false, - filter:function(event,player){ - if(event.targets.length!=1||event.targets[0]==player||event.targets[0].isDead()) return false; - if(event.card.name!='juedou'&&(event.card.name!='sha'||get.color(event.card)!='red')) return false; - if(_status.connectMode&&player.countCards('h')>0) return true; - return player.hasSha()||player.hasUsableCard('juedou'); + heji: { + audio: 2, + trigger: { global: "useCardAfter" }, + direct: true, + locked: false, + filter: function (event, player) { + if (event.targets.length != 1 || event.targets[0] == player || event.targets[0].isDead()) + return false; + if ( + event.card.name != "juedou" && + (event.card.name != "sha" || get.color(event.card) != "red") + ) + return false; + if (_status.connectMode && player.countCards("h") > 0) return true; + return player.hasSha() || player.hasUsableCard("juedou"); }, - content:function(){ - player.chooseToUse(function(card,player,event){ - var name=get.name(card); - if(name!='sha'&&name!='juedou') return false; - return lib.filter.cardEnabled.apply(this,arguments); - },'合击:是否对'+get.translation(trigger.targets[0])+'使用一张【杀】或【决斗】?').set('logSkill','heji').set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',trigger.targets[0]).set('addCount',false); + content: function () { + player + .chooseToUse(function (card, player, event) { + var name = get.name(card); + if (name != "sha" && name != "juedou") return false; + return lib.filter.cardEnabled.apply(this, arguments); + }, "合击:是否对" + + get.translation(trigger.targets[0]) + + "使用一张【杀】或【决斗】?") + .set("logSkill", "heji") + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", trigger.targets[0]) + .set("addCount", false); }, - group:'heji_gain', - subSkill:{ - gain:{ - trigger:{player:'useCard'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card.isCard&&event.getParent(2).name=='heji'; + group: "heji_gain", + subSkill: { + gain: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card.isCard && event.getParent(2).name == "heji"; }, - content:function(){ - var card=get.cardPile2(function(card){ - return get.color(card,false)=='red'; + content: function () { + var card = get.cardPile2(function (card) { + return get.color(card, false) == "red"; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); }, }, }, - mod:{ - aiOrder:function(player,card,num){ - if(get.name(card,player)=='sha'&&get.color(card,player)=='red') return num+0.6*(_status.event.name=='chooseToUse'&&player.hasHistory('useCard',function(evt){ - return evt.card.name=='sha'&&evt.cards.length==1; - })?1:-1); + mod: { + aiOrder: function (player, card, num) { + if (get.name(card, player) == "sha" && get.color(card, player) == "red") + return ( + num + + 0.6 * + (_status.event.name == "chooseToUse" && + player.hasHistory("useCard", function (evt) { + return evt.card.name == "sha" && evt.cards.length == 1; + }) + ? 1 + : -1) + ); }, }, }, //始计篇·智 - refubi:{ - audio:'fubi', - trigger:{ - global:'phaseBefore', - player:'enterGame', + refubi: { + audio: "fubi", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - direct:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + direct: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('refubi'),lib.filter.notMe).set('ai',function(target){ - return 1+get.attitude(_status.event.player,target); + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("refubi"), lib.filter.notMe).set("ai", function (target) { + return 1 + get.attitude(_status.event.player, target); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('refubi',target); - target.addMark('refubi',1); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("refubi", target); + target.addMark("refubi", 1); } }, - intro:{ - content:function(info,player){ - var str='已获得“辅弼”标记' - if(player.storage.refubi_effect0){ - str+=';本回合使用【杀】的次数上限+'; - str+=player.storage.refubi_effect0; + intro: { + content: function (info, player) { + var str = "已获得“辅弼”标记"; + if (player.storage.refubi_effect0) { + str += ";本回合使用【杀】的次数上限+"; + str += player.storage.refubi_effect0; } - if(player.storage.refubi_effect1){ - str+=';本回合的手牌上限+'; - str+=(player.storage.refubi_effect1*3); + if (player.storage.refubi_effect1) { + str += ";本回合的手牌上限+"; + str += player.storage.refubi_effect1 * 3; } return str; }, }, - marktext:'弼', - group:'refubi_buff', - subSkill:{ - buff:{ - trigger:{global:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&event.player.hasMark('refubi'); + marktext: "弼", + group: "refubi_buff", + subSkill: { + buff: { + trigger: { global: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return event.player != player && event.player.hasMark("refubi"); }, - content:function(){ - 'step 0' - var str=get.translation(trigger.player); - player.chooseControl('cancel2').set('choiceList',[ - '令'+str+'本回合使用【杀】的次数上限+1', - '令'+str+'本回合的手牌上限+3', - ]).set('ai',function(){ - var player=_status.event.player,target=_status.event.getTrigger().player; - if(get.attitude(player,target)<=0) return 'cancel2'; - if(!target.hasJudge('lebu')&&target.countCards('h',function(card){ - return get.name(card,target)=='sha'&&target.hasValueTarget(card); - })>target.getCardUsable('sha')) return 0; - return 1; - }); - 'step 1' - if(result.control!='cancel2'){ - var target=trigger.player; - player.logSkill('refubi',target); - var str='refubi_effect'+result.index; + content: function () { + "step 0"; + var str = get.translation(trigger.player); + player + .chooseControl("cancel2") + .set("choiceList", [ + "令" + str + "本回合使用【杀】的次数上限+1", + "令" + str + "本回合的手牌上限+3", + ]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + if (get.attitude(player, target) <= 0) return "cancel2"; + if ( + !target.hasJudge("lebu") && + target.countCards("h", function (card) { + return ( + get.name(card, target) == "sha" && target.hasValueTarget(card) + ); + }) > target.getCardUsable("sha") + ) + return 0; + return 1; + }); + ("step 1"); + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("refubi", target); + var str = "refubi_effect" + result.index; target.addTempSkill(str); - target.addMark(str,1,false); - game.log(target,[ - '本回合使用【杀】的次数上限+1', - '本回合的手牌上限+3', - ][result.index]); + target.addMark(str, 1, false); + game.log( + target, + ["本回合使用【杀】的次数上限+1", "本回合的手牌上限+3"][result.index] + ); } }, }, - effect0:{ - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('refubi_effect0'); + effect0: { + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("refubi_effect0"); }, }, }, - effect1:{ - onremove:true, - mod:{ - maxHandcard:function(player,num){ - return num+3*player.countMark('refubi_effect1'); + effect1: { + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + 3 * player.countMark("refubi_effect1"); }, }, }, }, }, - rezuici:{ - audio:'zuici', - enable:'chooseToUse', - filter:function(event,player){ - if(event.type=='phase'||event.type=='dying'&&player==event.dying) return (player.isDamaged()&&player.countCards('e')>0); + rezuici: { + audio: "zuici", + enable: "chooseToUse", + filter: function (event, player) { + if (event.type == "phase" || (event.type == "dying" && player == event.dying)) + return player.isDamaged() && player.countCards("e") > 0; return false; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('###罪辞###选择废除一个有牌的装备栏,然后回复2点体力,并可移动“辅弼”标记。'); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog( + "###罪辞###选择废除一个有牌的装备栏,然后回复2点体力,并可移动“辅弼”标记。" + ); }, - chooseControl:function(event,player){ - var list=[]; - for(var i=1;i<6;i++){ - if(player.getEquips(i).length>0) list.push('equip'+i); + chooseControl: function (event, player) { + var list = []; + for (var i = 1; i < 6; i++) { + if (player.getEquips(i).length > 0) list.push("equip" + i); } - list.push('cancel2'); + list.push("cancel2"); return list; }, - check:function(event,player){ - if(player.hp>1&&player.getDamagedHp()<2) return 'cancel2'; - var cards=player.getCards('e').sort(function(a,b){ - return get.value(a)-get.value(b); + check: function (event, player) { + if (player.hp > 1 && player.getDamagedHp() < 2) return "cancel2"; + var cards = player.getCards("e").sort(function (a, b) { + return get.value(a) - get.value(b); }); - var sub=get.subtype(cards[0],false); - if(player.hp<1) return sub; - var val=get.value(cards[0]); - if(val<0) return sub; - return val<4?sub:'cancel2'; + var sub = get.subtype(cards[0], false); + if (player.hp < 1) return sub; + var val = get.value(cards[0]); + if (val < 0) return sub; + return val < 4 ? sub : "cancel2"; }, - backup:function(result){ - var next=get.copy(lib.skill.rezuicix); - next.position=result.control; + backup: function (result) { + var next = get.copy(lib.skill.rezuicix); + next.position = result.control; return next; }, }, - ai:{ - order:2.7, - result:{ - player:1, + ai: { + order: 2.7, + result: { + player: 1, }, - save:true, - skillTagFilter:function(player,tag,arg){ - return player==arg; + save: true, + skillTagFilter: function (player, tag, arg) { + return player == arg; }, }, }, - rezuicix:{ - audio:'zuici', - content:function(){ - 'step 0' + rezuicix: { + audio: "zuici", + content: function () { + "step 0"; player.disableEquip(lib.skill.rezuici_backup.position); player.recover(2); - 'step 1' - var b1=false,b2=false; - for(var i of game.players){ - if(i.hasMark('refubi')) b1=true; - else if(i!=player) b2=true; - if(b1&&b2) break; + ("step 1"); + var b1 = false, + b2 = false; + for (var i of game.players) { + if (i.hasMark("refubi")) b1 = true; + else if (i != player) b2 = true; + if (b1 && b2) break; } - if(b1&&b2){ - player.chooseTarget('是否转移“辅弼”标记?',function(card,player,target){ - return target!=player&&!target.hasMark('refubi'); - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - return Math.min(att,att-_status.event.preatt); - }).set('preatt',get.attitude(player,game.findPlayer(function(current){ - return current.hasMark('refubi'); - }))); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'group'); - game.countPlayer(function(current){ - var num=current.countMark('refubi'); - if(num) current.removeMark('refubi',1,false); + if (b1 && b2) { + player + .chooseTarget("是否转移“辅弼”标记?", function (card, player, target) { + return target != player && !target.hasMark("refubi"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + return Math.min(att, att - _status.event.preatt); + }) + .set( + "preatt", + get.attitude( + player, + game.findPlayer(function (current) { + return current.hasMark("refubi"); + }) + ) + ); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "group"); + game.countPlayer(function (current) { + var num = current.countMark("refubi"); + if (num) current.removeMark("refubi", 1, false); }); - target.addMark('refubi',1); + target.addMark("refubi", 1); } }, - ai:{ - result:{ - player:1, + ai: { + result: { + player: 1, }, }, }, - reshengxi:{ - audio:'shengxi', - audioname:['feiyi'], - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - preHidden:true, - filter:function(event,player){ - return !player.getHistory('sourceDamage').length; + reshengxi: { + audio: "shengxi", + audioname: ["feiyi"], + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + preHidden: true, + filter: function (event, player) { + return !player.getHistory("sourceDamage").length; }, - content:function(){ + content: function () { player.draw(2); }, }, - fyjianyu:{ - initSkill:function(skill){ - if(!lib.skill[skill]){ - lib.skill[skill]={ - marktext:'喻', - intro:{ - markcount:()=>1, - content:'指定另一名有“喻”的角色为目标时,其摸一张牌', + fyjianyu: { + initSkill: function (skill) { + if (!lib.skill[skill]) { + lib.skill[skill] = { + marktext: "喻", + intro: { + markcount: () => 1, + content: "指定另一名有“喻”的角色为目标时,其摸一张牌", }, }; - lib.translate[skill]='谏喻'; - lib.translate[skill+'_bg']='喻'; + lib.translate[skill] = "谏喻"; + lib.translate[skill + "_bg"] = "喻"; } }, - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return game.countPlayer(function(current){ - return !current.hasMark('fyjianyu_'+player.playerid); - })>1; + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + game.countPlayer(function (current) { + return !current.hasMark("fyjianyu_" + player.playerid); + }) > 1 + ); }, - round:1, - filterTarget:function(card,player,target){ - return !target.hasMark('fyjianyu_'+player.playerid); + round: 1, + filterTarget: function (card, player, target) { + return !target.hasMark("fyjianyu_" + player.playerid); }, - selectTarget:2, - content:function(){ - var skill='fyjianyu_'+player.playerid; - game.broadcastAll(lib.skill.fyjianyu.initSkill,skill); - player.addTempSkill('fyjianyu_draw',{player:'phaseBegin'}); - target.addMark(skill,1); + selectTarget: 2, + content: function () { + var skill = "fyjianyu_" + player.playerid; + game.broadcastAll(lib.skill.fyjianyu.initSkill, skill); + player.addTempSkill("fyjianyu_draw", { player: "phaseBegin" }); + target.addMark(skill, 1); }, - ai:{ - order:0.1, - result:{ - target:function(player,target){ - if(!ui.selected.targets.length) return target==player?1:0; - if(get.attitude(player,target)<0) return -1.6*(1+(target.countCards('h',function(card){ - return target.hasValueTarget(card)&&get.effect(player,card,target,target)>0; - }))*Math.sqrt(target.countCards('h'))); - return 0.3*(1+(target.countCards('h',function(card){ - return target.hasValueTarget(card)&&get.effect(player,card,target,target)>0; - }))*Math.sqrt(target.countCards('h'))); + ai: { + order: 0.1, + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return target == player ? 1 : 0; + if (get.attitude(player, target) < 0) + return ( + -1.6 * + (1 + + target.countCards("h", function (card) { + return ( + target.hasValueTarget(card) && + get.effect(player, card, target, target) > 0 + ); + }) * + Math.sqrt(target.countCards("h"))) + ); + return ( + 0.3 * + (1 + + target.countCards("h", function (card) { + return ( + target.hasValueTarget(card) && + get.effect(player, card, target, target) > 0 + ); + }) * + Math.sqrt(target.countCards("h"))) + ); }, }, }, - subSkill:{ - draw:{ - charlotte:true, - trigger:{global:'useCardToPlayer'}, - filter:function(event,player){ - return event.player!=event.target&&event.player.hasMark('fyjianyu_'+player.playerid)&&event.target.hasMark('fyjianyu_'+player.playerid)&&event.target.isIn(); + subSkill: { + draw: { + charlotte: true, + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return ( + event.player != event.target && + event.player.hasMark("fyjianyu_" + player.playerid) && + event.target.hasMark("fyjianyu_" + player.playerid) && + event.target.isIn() + ); }, - forced:true, - logTarget:'target', - content:function(){ + forced: true, + logTarget: "target", + content: function () { trigger.target.draw(); }, - onremove:function(player){ - game.countPlayer(function(current){ - var num=current.countMark('fyjianyu_'+player.playerid); - if(num) current.removeMark('fyjianyu_'+player.playerid); + onremove: function (player) { + game.countPlayer(function (current) { + var num = current.countMark("fyjianyu_" + player.playerid); + if (num) current.removeMark("fyjianyu_" + player.playerid); }); }, }, }, }, - spwanwei:{ - audio:2, - enable:'chooseToUse', - filter:function(event,player){ - if(player.hasSkill('spwanwei2')||player.hp<1) return false; - if(event.type=='dying') return event.dying!=player; - if(event.type!='phase') return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.isDamaged(); + spwanwei: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + if (player.hasSkill("spwanwei2") || player.hp < 1) return false; + if (event.type == "dying") return event.dying != player; + if (event.type != "phase") return false; + return game.hasPlayer(function (current) { + return current != player && current.isDamaged(); }); }, - filterTarget:function(card,player,target){ - if(_status.event.type=='dying') return target==_status.event.dying; - return player!=target&&target.isDamaged(); + filterTarget: function (card, player, target) { + if (_status.event.type == "dying") return target == _status.event.dying; + return player != target && target.isDamaged(); }, - selectTarget:function(){ - if(_status.event.type=='dying') return -1; + selectTarget: function () { + if (_status.event.type == "dying") return -1; return 1; }, - content:function(){ - player.addTempSkill('spwanwei2','roundStart'); - var num=player.hp; - target.recover(Math.max(num+1,1-target.hp)); + content: function () { + player.addTempSkill("spwanwei2", "roundStart"); + var num = player.hp; + target.recover(Math.max(num + 1, 1 - target.hp)); player.loseHp(num); }, - ai:{ - save:true, - skillTagFilter:function(player,tag,target){ - return player!=target; + ai: { + save: true, + skillTagFilter: function (player, tag, target) { + return player != target; }, - expose:0.5, - order:6, - result:{ - target:function(player,target){ - if(_status.event.type!='dying') return 0; - if(get.attitude(player,target)<4) return 0; - if(player.countCards('he')<2&&target!=get.zhu(player)) return 0; + expose: 0.5, + order: 6, + result: { + target: function (player, target) { + if (_status.event.type != "dying") return 0; + if (get.attitude(player, target) < 4) return 0; + if (player.countCards("he") < 2 && target != get.zhu(player)) return 0; return 1; }, }, }, }, - spwanwei2:{}, - spyuejian:{ - mod:{ - maxHandcardBase:function(player){ + spwanwei2: {}, + spyuejian: { + mod: { + maxHandcardBase: function (player) { return player.maxHp; }, }, - audio:2, - enable:'chooseToUse', - filter:function(event,player){ - return event.type=='dying'&&player==event.dying&&player.countCards('he')>1; + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + return event.type == "dying" && player == event.dying && player.countCards("he") > 1; }, - selectCard:2, - filterCard:true, - position:'he', - check:function(card){ - return 1/Math.max(0.1,get.value(card)); + selectCard: 2, + filterCard: true, + position: "he", + check: function (card) { + return 1 / Math.max(0.1, get.value(card)); }, - content:function(){ + content: function () { player.recover(); }, - ai:{ - save:true, - skillTagFilter:function(player,tag,target){ - return player==target; + ai: { + save: true, + skillTagFilter: function (player, tag, target) { + return player == target; }, - order:1.4, - result:{ - player:1, + order: 1.4, + result: { + player: 1, }, }, }, - spwuku:{ - audio:2, - trigger:{global:'useCard'}, - forced:true, - preHidden:true, - filter:function(event,player){ - if(get.type(event.card)!='equip') return false; - var gz=get.mode()=='guozhan'; - if(gz&&event.player.isFriendOf(player)) return false; - return player.countMark('spwuku')<(gz?2:3); + spwuku: { + audio: 2, + trigger: { global: "useCard" }, + forced: true, + preHidden: true, + filter: function (event, player) { + if (get.type(event.card) != "equip") return false; + var gz = get.mode() == "guozhan"; + if (gz && event.player.isFriendOf(player)) return false; + return player.countMark("spwuku") < (gz ? 2 : 3); }, - content:function(){ - player.addMark('spwuku',1); + content: function () { + player.addMark("spwuku", 1); }, - marktext:'库', - intro:{ - content:'mark', + marktext: "库", + intro: { + content: "mark", }, - ai:{ - combo:'spsanchen', - threaten:3.6, + ai: { + combo: "spsanchen", + threaten: 3.6, }, }, - spsanchen:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return player.countMark('spwuku')>2; + spsanchen: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countMark("spwuku") > 2; }, - content:function(){ - player.awakenSkill('spsanchen'); + content: function () { + player.awakenSkill("spsanchen"); player.gainMaxHp(); player.recover(); - player.addSkills('spmiewu'); + player.addSkills("spmiewu"); }, - ai:{ - combo:'wuku', + ai: { + combo: "wuku", }, - derivation:'spmiewu', + derivation: "spmiewu", }, - spmiewu:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - filter:function(event,player){ - if(!player.countMark('spwuku')||!player.countCards('hse')||player.hasSkill('spmiewu2')) return false; - for(var i of lib.inpile){ - var type=get.type2(i); - if((type=='basic'||type=='trick')&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; + spmiewu: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if ( + !player.countMark("spwuku") || + !player.countCards("hse") || + player.hasSkill("spmiewu2") + ) + return false; + for (var i of lib.inpile) { + var type = get.type2(i); + if ( + (type == "basic" || type == "trick") && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i=0;i0&&player.countCards('she')>0&&!player.hasSkill('spmiewu2'); - }, - ai:{ - combo:'spwuku', - fireAttack:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player){ - if(!player.countMark('spwuku')||!player.countCards('hse')||player.hasSkill('spmiewu2')) return false; + prompt: function (links, player) { + return ( + "将一张牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - order:1, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + }, + hiddenCard: function (player, name) { + if (!lib.inpile.includes(name)) return false; + var type = get.type2(name); + return ( + (type == "basic" || type == "trick") && + player.countMark("spwuku") > 0 && + player.countCards("she") > 0 && + !player.hasSkill("spmiewu2") + ); + }, + ai: { + combo: "spwuku", + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + if ( + !player.countMark("spwuku") || + !player.countCards("hse") || + player.hasSkill("spmiewu2") + ) + return false; + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, }, - spmiewu2:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - return event.skill=='spmiewu_backup'; + spmiewu2: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + return event.skill == "spmiewu_backup"; }, - content:function(){ + content: function () { player.draw(); }, }, - spmiewu_backup:{audio:'spmiewu'}, - qinzheng:{ - audio:2, - trigger:{player:['useCard','respond']}, - forced:true, - filter:function(event,player){ - var num=player.getAllHistory('useCard').length+player.getAllHistory('respond').length; - return num%3==0||num%5==0||num%8==0; + spmiewu_backup: { audio: "spmiewu" }, + qinzheng: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + var num = player.getAllHistory("useCard").length + player.getAllHistory("respond").length; + return num % 3 == 0 || num % 5 == 0 || num % 8 == 0; }, - content:function(){ - var num=player.getAllHistory('useCard').length+player.getAllHistory('respond').length; - var cards=[]; - if(num%3==0){ - var card=get.cardPile2(function(card){ - return card.name=='sha'||card.name=='shan'; + content: function () { + var num = player.getAllHistory("useCard").length + player.getAllHistory("respond").length; + var cards = []; + if (num % 3 == 0) { + var card = get.cardPile2(function (card) { + return card.name == "sha" || card.name == "shan"; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(num%5==0){ - var card=get.cardPile2(function(card){ - return ['tao','jiu','zong','xionghuangjiu'].includes(card.name); + if (num % 5 == 0) { + var card = get.cardPile2(function (card) { + return ["tao", "jiu", "zong", "xionghuangjiu"].includes(card.name); }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(num%8==0){ - var card=get.cardPile2(function(card){ - return ['juedou','wuzhong','zengbin','sadouchengbing','dongzhuxianji','tongzhougongji'].includes(card.name); + if (num % 8 == 0) { + var card = get.cardPile2(function (card) { + return [ + "juedou", + "wuzhong", + "zengbin", + "sadouchengbing", + "dongzhuxianji", + "tongzhougongji", + ].includes(card.name); }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); }, - group:'qinzheng_count', - intro:{ - content:function(num){ - var str='
  • 总次数:'; - str+=num; - str+='
  • 杀/闪:'; - str+=num%3; - str+='/3
  • 桃/酒:'; - str+=num%5; - str+='/5
  • 决斗/无中生有:'; - str+=num%8; - str+='/8'; + group: "qinzheng_count", + intro: { + content: function (num) { + var str = "
  • 总次数:"; + str += num; + str += "
  • 杀/闪:"; + str += num % 3; + str += "/3
  • 桃/酒:"; + str += num % 5; + str += "/5
  • 决斗/无中生有:"; + str += num % 8; + str += "/8"; return str; }, }, }, - qinzheng_count:{ - trigger:{player:['useCard1','respond']}, - silent:true, - firstDo:true, - noHidden:true, - content:function(){ - player.storage.qinzheng=player.getAllHistory('useCard').length+player.getAllHistory('respond').length; - player.markSkill('qinzheng'); + qinzheng_count: { + trigger: { player: ["useCard1", "respond"] }, + silent: true, + firstDo: true, + noHidden: true, + content: function () { + player.storage.qinzheng = + player.getAllHistory("useCard").length + player.getAllHistory("respond").length; + player.markSkill("qinzheng"); }, }, - spqiai:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',function(card){ - return get.type(card)!='basic'; - })>0; + spqiai: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) > 0 + ); }, - filterCard:function(card){ - return get.type(card)!='basic'; + filterCard: function (card) { + return get.type(card) != "basic"; }, - position:'he', - filterTarget:lib.filter.notMe, - delay:false, - discard:false, - lose:false, - check:function(card){ - var player=_status.event.player; - if(get.position(card)=='e'&&card.name=='jinhe') return 10; - if(player.isHealthy()) return 7-get.value(card); - return 9-get.value(card); + position: "he", + filterTarget: lib.filter.notMe, + delay: false, + discard: false, + lose: false, + check: function (card) { + var player = _status.event.player; + if (get.position(card) == "e" && card.name == "jinhe") return 10; + if (player.isHealthy()) return 7 - get.value(card); + return 9 - get.value(card); }, - content:function(){ - 'step 0' - player.give(cards,target,true); - 'step 1' - if(!target.isIn()){ + content: function () { + "step 0"; + player.give(cards, target, true); + ("step 1"); + if (!target.isIn()) { event.finish(); return; } - if(player.isHealthy()) event._result={index:1}; - else{ - var str=get.translation(player); - target.chooseControl().set('choiceList',[ - '令'+str+'回复1点体力', - '令'+str+'摸两张牌', - ]); + if (player.isHealthy()) event._result = { index: 1 }; + else { + var str = get.translation(player); + target + .chooseControl() + .set("choiceList", ["令" + str + "回复1点体力", "令" + str + "摸两张牌"]); } - 'step 2' - if(result.index==0) player.recover(); + ("step 2"); + if (result.index == 0) player.recover(); else player.draw(2); }, - ai:{ - order:8, - result:{ - player:1, - target:function(player,target){ - if(ui.selected.cards.length){ - var card=ui.selected.cards[0]; - var val=get.value(card,target); - if(val<0) return -1; - if(target.hasSkillTag('nogain')) return 0; - var useval=target.getUseValue(card); - if(val<1||useval<=0) return 0.1; + ai: { + order: 8, + result: { + player: 1, + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + var val = get.value(card, target); + if (val < 0) return -1; + if (target.hasSkillTag("nogain")) return 0; + var useval = target.getUseValue(card); + if (val < 1 || useval <= 0) return 0.1; return Math.sqrt(useval); } return 0; @@ -5990,515 +7339,613 @@ game.import('character', function () { }, }, }, - spshanxi:{ - audio:2, - init:function(player){ - game.addGlobalSkill('spshanxi_bj'); + spshanxi: { + audio: 2, + init: function (player) { + game.addGlobalSkill("spshanxi_bj"); }, - onremove:function(player){ - if(!game.hasPlayer(current=>current.hasSkill('spshanxi'),true)) game.removeGlobalSkill('spshanxi_bj'); + onremove: function (player) { + if (!game.hasPlayer((current) => current.hasSkill("spshanxi"), true)) + game.removeGlobalSkill("spshanxi_bj"); }, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&!current.hasMark('spshanxi'); + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && !current.hasMark("spshanxi"); }); }, - content:function(){ - 'step 0' - var eff=0; - var target=game.findPlayer(function(current){ - return current!=player&¤t.hasMark('spshanxi'); + content: function () { + "step 0"; + var eff = 0; + var target = game.findPlayer(function (current) { + return current != player && current.hasMark("spshanxi"); }); - if(target) eff=(-get.attitude(player,target)/Math.sqrt(Math.max(1,target.hp))); - player.chooseTarget(get.prompt('spshanxi'),'令一名其他角色获得“檄”',function(card,player,target){ - return target!=player&&!target.hasMark('spshanxi'); - }).set('ai',function(target){ - return (-get.attitude(_status.event.player,target)/Math.sqrt(Math.max(1,target.hp)))-_status.event.eff; - }).set('eff',eff); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('spshanxi',target); - game.countPlayer(function(current){ - if(current==target) current.addMark('spshanxi',1); - else{ - var num=current.countMark('spshanxi'); - if(num>0) current.removeMark('spshanxi',num); + if (target) eff = -get.attitude(player, target) / Math.sqrt(Math.max(1, target.hp)); + player + .chooseTarget( + get.prompt("spshanxi"), + "令一名其他角色获得“檄”", + function (card, player, target) { + return target != player && !target.hasMark("spshanxi"); + } + ) + .set("ai", function (target) { + return ( + -get.attitude(_status.event.player, target) / + Math.sqrt(Math.max(1, target.hp)) - + _status.event.eff + ); + }) + .set("eff", eff); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("spshanxi", target); + game.countPlayer(function (current) { + if (current == target) current.addMark("spshanxi", 1); + else { + var num = current.countMark("spshanxi"); + if (num > 0) current.removeMark("spshanxi", num); } }); } }, - marktext:'檄', - intro:{ - name2:'檄', - content:'已被设下索命檄文', + marktext: "檄", + intro: { + name2: "檄", + content: "已被设下索命檄文", }, - group:'spshanxi_suoming', - ai:{threaten:3.3}, + group: "spshanxi_suoming", + ai: { threaten: 3.3 }, }, - spshanxi_suoming:{ - audio:'spshanxi', - trigger:{global:'recoverAfter'}, - forced:true, - filter:function(event,player){ - return event.player.hasMark('spshanxi')&&event.player.hp>0; + spshanxi_suoming: { + audio: "spshanxi", + trigger: { global: "recoverAfter" }, + forced: true, + filter: function (event, player) { + return event.player.hasMark("spshanxi") && event.player.hp > 0; }, - logTarget:'player', - content:function(){ - 'step 0' - if(trigger.player.countCards('he')<2) event._result={bool:false}; - else trigger.player.chooseCard('he',2,'交给'+get.translation(player)+'两张牌,或失去1点体力').set('ai',function(card){ - return 9-get.value(card); - }); - 'step 1' - if(!result.bool) trigger.player.loseHp(); - else trigger.player.give(result.cards,player); + logTarget: "player", + content: function () { + "step 0"; + if (trigger.player.countCards("he") < 2) event._result = { bool: false }; + else + trigger.player + .chooseCard("he", 2, "交给" + get.translation(player) + "两张牌,或失去1点体力") + .set("ai", function (card) { + return 9 - get.value(card); + }); + ("step 1"); + if (!result.bool) trigger.player.loseHp(); + else trigger.player.give(result.cards, player); }, }, - spshanxi_bj:{ - trigger:{player:'dieAfter'}, - filter:function(event,player){ - for(let i of game.players){ - if(i.hasSkill('spshanxi_suoming')) return false; + spshanxi_bj: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + for (let i of game.players) { + if (i.hasSkill("spshanxi_suoming")) return false; } return true; }, - silent:true, - forceDie:true, - charlotte:true, - content:function(){ - game.removeGlobalSkill('spshanxi_bj'); + silent: true, + forceDie: true, + charlotte: true, + content: function () { + game.removeGlobalSkill("spshanxi_bj"); }, - ai:{ - effect:{ - target:function(card,player,target){ - let suoming=game.findPlayer(current=>current.hasSkill('spshanxi_suoming')); - if(suoming&&_status.event&&target===_status.event.dying&&target.hasMark('spshanxi')){ - if(target.countCards('he')<2) return 'zerotarget'; - return [1,get.attitude(target,suoming)>0?0:-1.2]; + ai: { + effect: { + target: function (card, player, target) { + let suoming = game.findPlayer((current) => current.hasSkill("spshanxi_suoming")); + if ( + suoming && + _status.event && + target === _status.event.dying && + target.hasMark("spshanxi") + ) { + if (target.countCards("he") < 2) return "zerotarget"; + return [1, get.attitude(target, suoming) > 0 ? 0 : -1.2]; } - } - } - } + }, + }, + }, }, - shameng:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var hs=player.getCards('h'); - if(hs.length<2) return false; - var red=0,black=0; - for(var i of hs){ - if(get.color(i,player)=='red') red++; + shameng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var hs = player.getCards("h"); + if (hs.length < 2) return false; + var red = 0, + black = 0; + for (var i of hs) { + if (get.color(i, player) == "red") red++; else black++; - if(red>1||black>1) return true; + if (red > 1 || black > 1) return true; } return false; }, - complexCard:true, - selectCard:2, - filterCard:function(card,player){ - if(ui.selected.cards.length) return get.color(card,player)==get.color(ui.selected.cards[0],player); - var color=get.color(card,player); - return player.countCards('h',function(cardx){ - return cardx!=card&&color==get.color(cardx,player); - })>0; + complexCard: true, + selectCard: 2, + filterCard: function (card, player) { + if (ui.selected.cards.length) + return get.color(card, player) == get.color(ui.selected.cards[0], player); + var color = get.color(card, player); + return ( + player.countCards("h", function (cardx) { + return cardx != card && color == get.color(cardx, player); + }) > 0 + ); }, - filterTarget:lib.filter.notMe, - check:function(card){return 7-get.value(card)}, - position:'h', - content:function(){ + filterTarget: lib.filter.notMe, + check: function (card) { + return 7 - get.value(card); + }, + position: "h", + content: function () { target.draw(2); player.draw(3); }, - ai:{ - order:6, - result:{target:2}, + ai: { + order: 6, + result: { target: 2 }, }, }, - fubi:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + fubi: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - direct:true, - skillAnimation:true, - animationColor:'wood', - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + direct: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('fubi'),lib.filter.notMe).set('ai',function(target){ - return get.attitude(_status.event.player,target); + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("fubi"), lib.filter.notMe).set("ai", function (target) { + return get.attitude(_status.event.player, target); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('fubi',target); - target.addSkill('fubi2'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("fubi", target); + target.addSkill("fubi2"); target.storage.fubi2.push(player); } }, }, - fubi2:{ - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + fubi2: { + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - mod:{ - maxHandcard:function(player,num){ - var list=player.getStorage('fubi2'); - for(var i of list){ - if(i.isIn()) num+=3; + mod: { + maxHandcard: function (player, num) { + var list = player.getStorage("fubi2"); + for (var i of list) { + if (i.isIn()) num += 3; } return num; }, }, - mark:true, - intro:{content:'若$存活,则手牌上限+3'}, + mark: true, + intro: { content: "若$存活,则手牌上限+3" }, }, - zuici:{ - trigger:{player:'dying'}, - direct:true, - filter:function(event,player){ - return player.countCards('e')>0; + zuici: { + trigger: { player: "dying" }, + direct: true, + filter: function (event, player) { + return player.countCards("e") > 0; }, - content:function(){ - 'step 0' - var list=[]; - var cards=player.getCards('e'); - for(var i of cards) list.push(get.subtype(i)); - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt2('zuici')); - 'step 1' - if(result.control!='cancel2'){ + content: function () { + "step 0"; + var list = []; + var cards = player.getCards("e"); + for (var i of cards) list.push(get.subtype(i)); + list.push("cancel2"); + player.chooseControl(list).set("prompt", get.prompt2("zuici")); + ("step 1"); + if (result.control != "cancel2") { player.disableEquip(result.control); - } - else event.finish(); - 'step 2' - if(player.hp<1) player.recover(1-player.hp); + } else event.finish(); + ("step 2"); + if (player.hp < 1) player.recover(1 - player.hp); }, }, - jianzhan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return lib.skill.jianzhan.filterTarget(null,player,current); + jianzhan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return lib.skill.jianzhan.filterTarget(null, player, current); }); }, - filterTarget:function(card,player,target){ - if(target==player) return false; - if(ui.selected.targets.length){ - var targetx=ui.selected.targets[0]; - return targetx!=target&&targetx.countCards('h')>target.countCards('h')&&targetx.inRange(target); + filterTarget: function (card, player, target) { + if (target == player) return false; + if (ui.selected.targets.length) { + var targetx = ui.selected.targets[0]; + return ( + targetx != target && + targetx.countCards("h") > target.countCards("h") && + targetx.inRange(target) + ); } - var num=target.countCards('h'); - return game.hasPlayer(function(current){ - return current!=target&¤t!=player&¤t.countCards('h')0) return 0; - if(eff<0||get.attitude(evt.targets[0],evt.player)>1) return 1; - return 0; - }); - 'step 1' - if(result.index==0) targets[0].useCard({name:'sha',isCard:true},targets[1],false); + selectTarget: 2, + complexTarget: true, + targetprompt: ["出杀", "被出杀"], + multitarget: true, + content: function () { + "step 0"; + if (!targets[0].canUse("sha", targets[1])) event._result = { index: 1 }; + else + targets[0] + .chooseControl() + .set("choiceList", [ + "视为对" + get.translation(targets[1]) + "使用一张【杀】", + "令" + get.translation(player) + "摸一张牌", + ]) + .set("ai", function () { + var evt = _status.event.getParent(); + var eff = get.effect( + evt.targets[1], + { name: "sha", isCard: true }, + evt.targets[0], + evt.targets[0] + ); + if (eff > 0) return 0; + if (eff < 0 || get.attitude(evt.targets[0], evt.player) > 1) return 1; + return 0; + }); + ("step 1"); + if (result.index == 0) + targets[0].useCard({ name: "sha", isCard: true }, targets[1], false); else player.draw(); }, - ai:{ - result:{ - target:function(player,target){ - if(ui.selected.targets.length){ - var from=ui.selected.targets[0]; - return get.effect(target,{name:'sha'},from,target); + ai: { + result: { + target: function (player, target) { + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + return get.effect(target, { name: "sha" }, from, target); } - var effs=[0,0]; - game.countPlayer(function(current){ - if(current!=target&&target.canUse('sha',current)){ - var eff=get.effect(current,{name:'sha'},target,target); - if(eff>effs[0]) effs[0]=eff; - if(eff effs[0]) effs[0] = eff; + if (eff < effs[1]) effs[1] = eff; } }); - return effs[get.attitude(player,target)>0?0:1]; - } + return effs[get.attitude(player, target) > 0 ? 0 : 1]; + }, }, - order:8.5, - expose:0.2 + order: 8.5, + expose: 0.2, }, }, - duoji:{ - audio:2, - enable:'phaseUse', - limited:true, - filter:function(event,player){ - return player.countCards('h')>1&&game.hasPlayer(function(current){ - return current!=player&¤t.countGainableCards(player,'e')>0; - }); + duoji: { + audio: 2, + enable: "phaseUse", + limited: true, + filter: function (event, player) { + return ( + player.countCards("h") > 1 && + game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "e") > 0; + }) + ); }, - filterCard:true, - selectCard:2, - filterTarget:function(card,player,target){ - return target!=player&&target.countGainableCards(player,'e')>0; + filterCard: true, + selectCard: 2, + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "e") > 0; }, - check:function(card){ - return 8-get.value(card); + check: function (card) { + return 8 - get.value(card); }, - position:'h', - skillAnimation:true, - animationColor:'metal', - content:function(){ - player.awakenSkill('duoji'); - var cards=target.getGainableCards(player,'e'); - player.gain(cards,target,'give','bySelf'); + position: "h", + skillAnimation: true, + animationColor: "metal", + content: function () { + player.awakenSkill("duoji"); + var cards = target.getGainableCards(player, "e"); + player.gain(cards, target, "give", "bySelf"); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var num=0,es=target.getCards('e'),val=0; - for(var i of es){ - num+=get.value(i,target); + ai: { + order: 1, + result: { + target: function (player, target) { + var num = 0, + es = target.getCards("e"), + val = 0; + for (var i of es) { + num += get.value(i, target); } - for(var i of ui.selected.cards){ - val+=get.value(i,player); + for (var i of ui.selected.cards) { + val += get.value(i, player); } - if(Math.abs(num)>val) return -num; + if (Math.abs(num) > val) return -num; return 0; }, }, }, }, }, - characterIntro:{ - yuanhuan:'袁涣,字曜卿,陈郡扶乐(今河南省周口市太康县)人。东汉末年官员,出身陈郡袁氏,为东汉司徒袁滂之子。袁涣早年曾任郡功曹,后被公府征辟,相继被举为高第、秀才。汉末战乱时,袁涣流寓江淮一带,初为袁术所用,后投吕布。建安三年(198年),曹操率兵剿灭了吕布,袁涣又转投曹操,拜沛南部都尉,后又任谏议大夫、郎中令等职,在任上尽心尽责,以敢谏直言称名。袁涣恕思而后行,外表温柔而内心能断,处危难则勇气极大。汉末三国时期,唯有程昱、曹仁、袁涣三人被评价为勇冠贲育。', - qiaogong:'桥公,亦作“乔公”,名字不详,是中国汉末三国时期的长者,江东二乔的父亲,三国时期庐江郡皖县(今安徽潜山)人,中国长篇古典名著《三国演义》中称之为“乔国老”。', - liuzhang:'刘璋(生卒年不详),字季玉,江夏竟陵(今湖北省天门市)人。东汉末年宗室、军阀,益州牧刘焉幼子,在父亲刘焉死后继任益州牧。刘璋为人懦弱多疑。汉中张鲁骄纵,不听刘璋号令,于是刘璋杀张鲁母弟,双方成为仇敌,刘璋派庞羲攻击张鲁,战败。后益州内乱,平定后,又有曹操将前来袭击的消息。在内外交逼之下,刘璋听信手下张松、法正之言,迎接刘备入益州,想借刘备之力,抵抗曹操。不料此举乃引狼入室,刘备反手攻击刘璋,又有法正为内应,进至成都。成都吏民都想抵抗刘备,但刘璋为百姓计而开城出降,群下莫不流涕。刘备占据成都后,刘璋以振威将军的身份被迁往荆州居住,关羽失荆州后,刘璋归属东吴,被孙权任命为益州牧,不久后去世,卒年不详。', - zhangzhongjing:'张仲景(约公元150~154年—约公元215~219年),名机,字仲景,南阳涅阳县(今河南省邓州市穰东镇张寨村)人。东汉末年著名医学家,被后人尊称为“医圣”。张仲景广泛收集医方,写出了传世巨著《伤寒杂病论》。它确立的“辨证论治”原则,是中医临床的基本原则,是中医的灵魂所在。在方剂学方面,《伤寒杂病论》也做出了巨大贡献,创造了很多剂型,记载了大量有效的方剂。其所确立的六经辨证的治疗原则,受到历代医学家的推崇。这是中国第一部从理论到实践、确立辨证论治法则的医学专著,是中国医学史上影响最大的著作之一,是后学者研习中医必备的经典著作,广泛受到医学生和临床大夫的重视。', - xiangchong:'向宠(?~240年),左将军向朗之侄,蜀汉重要将领。具有谦和公允的性格品行,对军事通晓畅达,被汉昭烈帝刘备称赞。刘备时,历任牙门将(类似于主将帐下的偏将),诸葛亮北伐时,以向宠为中领军,封都亭侯。诸葛亮北行汉中前,特意在《出师表》中向刘禅推荐向宠。延熙三年(公元240年),南征汉嘉(今四川省雅安市)蛮夷时,遇害,尸体被其部下夺回,送回成都安葬。', - caizhenji:'蔡贞姬,生卒年不详,汉末大儒蔡邕之女。其父蔡邕精于天文数理,妙解音律,是曹操的挚友和老师。生在书香门第的家庭的蔡贞姬,自小耳濡目染,精通书法与音律。后来,其父为避宦竖迫害,便随父亲来泰山依付羊衜一族,在羊衜的元配孔氏死后,便在父亲的做主下与之成亲。夫妻二人婚后生有两子一女:羊承、羊徽瑜、羊祜。在与羊衜成亲之前,羊衜和孔氏生有一子羊发。后来羊发、羊承同时生病,蔡贞姬知道不能两全,就专心照顾羊发,最后羊发痊愈,羊承病死。', - zhouchu:'周处(236—297年),字子隐,吴郡阳羡(今江苏宜兴)人。西晋大臣、将领,东吴鄱阳太守周鲂之子。少时纵情肆欲,为祸乡里。后来改过自新,拜访名人陆机和陆云,浪子回头,发奋读书,留下“周处除三害”的传说,拜东观左丞,迁无难都督,功业胜过父亲。吴国灭亡后,出仕西晋,拜新平太守,转广汉太守,治境有方。入为散骑常侍,迁御史中丞,刚正不阿。得罪梁孝王司马肜。元康七年,出任建威将军,前往关中,讨伐氐羌齐万年叛乱,遇害于沙场。追赠平西将军,谥号为孝。', - wangfuzhaolei:'王甫(?—222年),字国山,广汉郪(今四川三台县)人,三国时期蜀汉重臣。刘璋时,为益州书佐,之后归降刘备,先后担任绵竹令、荆州议曹从事,并在夷陵之战中阵亡。其子王祐,官至尚书右选郎。赵累,蜀汉大将关羽部下都督。后来吴将吕蒙袭取荆州,赵累被吴将潘璋等在临沮擒获。', - wangling:'王淩(172年~251年6月15日),字彦云,太原郡祁县(今山西省祁县)人,三国时期曹魏将领,东汉司徒王允之侄。王淩出身太原王氏祁县房。举孝廉出身,授发干县令,迁中山太守。颇有政绩,迁司空(曹操)掾属。魏文帝曹丕即位,拜散骑常侍、兖州刺史。参加洞口之战,跟从张辽击败吴将吕范,加号建武将军,封宜城亭侯。太和二年(228年),王淩参与石亭之战,跟从曹休征伐东吴,力挽狂澜,历任扬豫二州刺史,治境有方。齐王曹芳继位,拜征东将军,联合孙礼击败吴将全琮,进封南乡侯,授车骑将军、仪同三司,正始九年(248年),代高柔为司空。嘉平元年(249年),代蒋济为太尉。嘉平三年(251年),不满太傅司马懿专擅朝政,联合兖州刺史令狐愚谋立楚王曹彪为帝,事泄自尽,时年八十岁,夷灭三族。', - wujing:'吴景,本吴郡吴县(今江苏苏州)人,后迁居吴郡钱塘(今浙江杭州),孙坚妻子吴夫人(武烈皇后)之弟,孙策和孙权的舅舅,东汉末年将领。吴景因追随孙坚征伐有功,被任命为骑都尉。袁术上表举荐吴景兼任丹杨太守,讨伐前任太守周昕,占据丹杨。后遭扬州刺史刘繇逼迫,再度依附袁术,袁术任用他为督军中郎将,与孙贲共同进击樊能等人。又在秣陵攻打笮融、薛礼。袁术与刘备争夺徐州时,任吴景为广陵太守。建安二年(197年),吴景放弃广陵东归孙策,孙策任他为丹杨太守。朝廷使者吴景为扬武将军,郡守之职照旧。建安八年(203年),吴景死于任上。', - feiyi:'费祎(?~253年2月),字文伟,江夏鄳县(今河南省罗山县)人,三国时期蜀汉名臣,与诸葛亮、蒋琬、董允并称为蜀汉四相。深得诸葛亮器重,屡次出使东吴,孙权、诸葛恪、羊茞等人以辞锋刁难,而费祎据理以答,辞义兼备,始终不为所屈。孙权非常惊异于他的才能,加以礼遇。北伐时为中护军,又转为司马。当时魏延与杨仪不和,经常争论,费祎常为二人谏喻,两相匡护,以尽其用。诸葛亮死后,初为后军师,再为尚书令,官至大将军,封成乡侯。费祎主政时,与姜维北伐的主张相左,执行休养生息的政策,为蜀汉的发展尽心竭力。费祎性格谦恭真诚,颇为廉洁,家无余财。后为魏降将郭循(一作郭脩)行刺身死。葬于今广元市昭化古城城西。', - luotong:'骆统(193年-228年),字公绪。会稽郡乌伤县(今浙江义乌)人。东汉末年至三国时期吴国将领、学者,陈国相骆俊之子。骆统二十岁时已任乌程国相,任内有政绩,使得国中民户过万。又迁为功曹,行骑都尉。曾劝孙权尊贤纳士,省役息民。后出任为建忠中郎将。将军凌统逝世后,统领其部曲。因战功迁偏将军,封新阳亭侯,任濡须督。黄武七年(228年),骆统去世,年仅三十六岁。有集十卷,今已佚。', + characterIntro: { + yuanhuan: + "袁涣,字曜卿,陈郡扶乐(今河南省周口市太康县)人。东汉末年官员,出身陈郡袁氏,为东汉司徒袁滂之子。袁涣早年曾任郡功曹,后被公府征辟,相继被举为高第、秀才。汉末战乱时,袁涣流寓江淮一带,初为袁术所用,后投吕布。建安三年(198年),曹操率兵剿灭了吕布,袁涣又转投曹操,拜沛南部都尉,后又任谏议大夫、郎中令等职,在任上尽心尽责,以敢谏直言称名。袁涣恕思而后行,外表温柔而内心能断,处危难则勇气极大。汉末三国时期,唯有程昱、曹仁、袁涣三人被评价为勇冠贲育。", + qiaogong: + "桥公,亦作“乔公”,名字不详,是中国汉末三国时期的长者,江东二乔的父亲,三国时期庐江郡皖县(今安徽潜山)人,中国长篇古典名著《三国演义》中称之为“乔国老”。", + liuzhang: + "刘璋(生卒年不详),字季玉,江夏竟陵(今湖北省天门市)人。东汉末年宗室、军阀,益州牧刘焉幼子,在父亲刘焉死后继任益州牧。刘璋为人懦弱多疑。汉中张鲁骄纵,不听刘璋号令,于是刘璋杀张鲁母弟,双方成为仇敌,刘璋派庞羲攻击张鲁,战败。后益州内乱,平定后,又有曹操将前来袭击的消息。在内外交逼之下,刘璋听信手下张松、法正之言,迎接刘备入益州,想借刘备之力,抵抗曹操。不料此举乃引狼入室,刘备反手攻击刘璋,又有法正为内应,进至成都。成都吏民都想抵抗刘备,但刘璋为百姓计而开城出降,群下莫不流涕。刘备占据成都后,刘璋以振威将军的身份被迁往荆州居住,关羽失荆州后,刘璋归属东吴,被孙权任命为益州牧,不久后去世,卒年不详。", + zhangzhongjing: + "张仲景(约公元150~154年—约公元215~219年),名机,字仲景,南阳涅阳县(今河南省邓州市穰东镇张寨村)人。东汉末年著名医学家,被后人尊称为“医圣”。张仲景广泛收集医方,写出了传世巨著《伤寒杂病论》。它确立的“辨证论治”原则,是中医临床的基本原则,是中医的灵魂所在。在方剂学方面,《伤寒杂病论》也做出了巨大贡献,创造了很多剂型,记载了大量有效的方剂。其所确立的六经辨证的治疗原则,受到历代医学家的推崇。这是中国第一部从理论到实践、确立辨证论治法则的医学专著,是中国医学史上影响最大的著作之一,是后学者研习中医必备的经典著作,广泛受到医学生和临床大夫的重视。", + xiangchong: + "向宠(?~240年),左将军向朗之侄,蜀汉重要将领。具有谦和公允的性格品行,对军事通晓畅达,被汉昭烈帝刘备称赞。刘备时,历任牙门将(类似于主将帐下的偏将),诸葛亮北伐时,以向宠为中领军,封都亭侯。诸葛亮北行汉中前,特意在《出师表》中向刘禅推荐向宠。延熙三年(公元240年),南征汉嘉(今四川省雅安市)蛮夷时,遇害,尸体被其部下夺回,送回成都安葬。", + caizhenji: + "蔡贞姬,生卒年不详,汉末大儒蔡邕之女。其父蔡邕精于天文数理,妙解音律,是曹操的挚友和老师。生在书香门第的家庭的蔡贞姬,自小耳濡目染,精通书法与音律。后来,其父为避宦竖迫害,便随父亲来泰山依付羊衜一族,在羊衜的元配孔氏死后,便在父亲的做主下与之成亲。夫妻二人婚后生有两子一女:羊承、羊徽瑜、羊祜。在与羊衜成亲之前,羊衜和孔氏生有一子羊发。后来羊发、羊承同时生病,蔡贞姬知道不能两全,就专心照顾羊发,最后羊发痊愈,羊承病死。", + zhouchu: + "周处(236—297年),字子隐,吴郡阳羡(今江苏宜兴)人。西晋大臣、将领,东吴鄱阳太守周鲂之子。少时纵情肆欲,为祸乡里。后来改过自新,拜访名人陆机和陆云,浪子回头,发奋读书,留下“周处除三害”的传说,拜东观左丞,迁无难都督,功业胜过父亲。吴国灭亡后,出仕西晋,拜新平太守,转广汉太守,治境有方。入为散骑常侍,迁御史中丞,刚正不阿。得罪梁孝王司马肜。元康七年,出任建威将军,前往关中,讨伐氐羌齐万年叛乱,遇害于沙场。追赠平西将军,谥号为孝。", + wangfuzhaolei: + "王甫(?—222年),字国山,广汉郪(今四川三台县)人,三国时期蜀汉重臣。刘璋时,为益州书佐,之后归降刘备,先后担任绵竹令、荆州议曹从事,并在夷陵之战中阵亡。其子王祐,官至尚书右选郎。赵累,蜀汉大将关羽部下都督。后来吴将吕蒙袭取荆州,赵累被吴将潘璋等在临沮擒获。", + wangling: + "王淩(172年~251年6月15日),字彦云,太原郡祁县(今山西省祁县)人,三国时期曹魏将领,东汉司徒王允之侄。王淩出身太原王氏祁县房。举孝廉出身,授发干县令,迁中山太守。颇有政绩,迁司空(曹操)掾属。魏文帝曹丕即位,拜散骑常侍、兖州刺史。参加洞口之战,跟从张辽击败吴将吕范,加号建武将军,封宜城亭侯。太和二年(228年),王淩参与石亭之战,跟从曹休征伐东吴,力挽狂澜,历任扬豫二州刺史,治境有方。齐王曹芳继位,拜征东将军,联合孙礼击败吴将全琮,进封南乡侯,授车骑将军、仪同三司,正始九年(248年),代高柔为司空。嘉平元年(249年),代蒋济为太尉。嘉平三年(251年),不满太傅司马懿专擅朝政,联合兖州刺史令狐愚谋立楚王曹彪为帝,事泄自尽,时年八十岁,夷灭三族。", + wujing: "吴景,本吴郡吴县(今江苏苏州)人,后迁居吴郡钱塘(今浙江杭州),孙坚妻子吴夫人(武烈皇后)之弟,孙策和孙权的舅舅,东汉末年将领。吴景因追随孙坚征伐有功,被任命为骑都尉。袁术上表举荐吴景兼任丹杨太守,讨伐前任太守周昕,占据丹杨。后遭扬州刺史刘繇逼迫,再度依附袁术,袁术任用他为督军中郎将,与孙贲共同进击樊能等人。又在秣陵攻打笮融、薛礼。袁术与刘备争夺徐州时,任吴景为广陵太守。建安二年(197年),吴景放弃广陵东归孙策,孙策任他为丹杨太守。朝廷使者吴景为扬武将军,郡守之职照旧。建安八年(203年),吴景死于任上。", + feiyi: "费祎(?~253年2月),字文伟,江夏鄳县(今河南省罗山县)人,三国时期蜀汉名臣,与诸葛亮、蒋琬、董允并称为蜀汉四相。深得诸葛亮器重,屡次出使东吴,孙权、诸葛恪、羊茞等人以辞锋刁难,而费祎据理以答,辞义兼备,始终不为所屈。孙权非常惊异于他的才能,加以礼遇。北伐时为中护军,又转为司马。当时魏延与杨仪不和,经常争论,费祎常为二人谏喻,两相匡护,以尽其用。诸葛亮死后,初为后军师,再为尚书令,官至大将军,封成乡侯。费祎主政时,与姜维北伐的主张相左,执行休养生息的政策,为蜀汉的发展尽心竭力。费祎性格谦恭真诚,颇为廉洁,家无余财。后为魏降将郭循(一作郭脩)行刺身死。葬于今广元市昭化古城城西。", + luotong: + "骆统(193年-228年),字公绪。会稽郡乌伤县(今浙江义乌)人。东汉末年至三国时期吴国将领、学者,陈国相骆俊之子。骆统二十岁时已任乌程国相,任内有政绩,使得国中民户过万。又迁为功曹,行骑都尉。曾劝孙权尊贤纳士,省役息民。后出任为建忠中郎将。将军凌统逝世后,统领其部曲。因战功迁偏将军,封新阳亭侯,任濡须督。黄武七年(228年),骆统去世,年仅三十六岁。有集十卷,今已佚。", }, - characterTitle:{ - }, - card:{ - binglinchengxiax:{ - enable:true, - type:'trick', - derivation:'sp_xunchen', - fullskin:true, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - if(!player.isIn()||!target.isIn()){ + characterTitle: {}, + card: { + binglinchengxiax: { + enable: true, + type: "trick", + derivation: "sp_xunchen", + fullskin: true, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + if (!player.isIn() || !target.isIn()) { event.finish(); return; } - event.showCards=get.cards(4); + event.showCards = get.cards(4); game.cardsGotoOrdering(event.showCards); player.showCards(event.showCards); - 'step 1' - if(player.isIn()&&target.isIn()&&event.showCards.length){ - for(var i of event.showCards){ - if(i.name=='sha'&&player.canUse(i,target,false)){ - player.useCard(i,target,false); + ("step 1"); + if (player.isIn() && target.isIn() && event.showCards.length) { + for (var i of event.showCards) { + if (i.name == "sha" && player.canUse(i, target, false)) { + player.useCard(i, target, false); event.showCards.remove(i); event.redo(); break; } } } - 'step 2' - if(event.showCards.length){ - while(event.showCards.length) ui.cardPile.insertBefore(event.showCards.pop().fix(),ui.cardPile.firstChild); + ("step 2"); + if (event.showCards.length) { + while (event.showCards.length) + ui.cardPile.insertBefore(event.showCards.pop().fix(), ui.cardPile.firstChild); game.updateRoundNumber(); } }, - ai:{ - basic:{ - useful:4, - value:3, + ai: { + basic: { + useful: 4, + value: 3, }, - order:4, - result:{ - target:function(player,target,card,isLink){ - if(get.effect(target,{name:'sha'},player,target)==0) return 0; + order: 4, + result: { + target: function (player, target, card, isLink) { + if (get.effect(target, { name: "sha" }, player, target) == 0) return 0; return -2.5; }, }, - tag:{ - respond:1, - respondShan:1, - damage:1, - } - } + tag: { + respond: 1, + respondShan: 1, + damage: 1, + }, + }, }, - tiaojiyanmei:{ - enable:true, - type:'trick', - derivation:'feiyi', - fullskin:true, - filterTarget:function(card,player,target){ - var targets=[]; - if(ui.selected.targets.length) targets.addArray(ui.selected.targets); - var evt=_status.event.getParent('useCard'); - if(evt&&evt.card==card) targets.addArray(evt.targets); - if(targets.length){ - var hs=target.countCards('h'); - for(var i of targets){ - if(i.countCards('h')!=hs) return true; + tiaojiyanmei: { + enable: true, + type: "trick", + derivation: "feiyi", + fullskin: true, + filterTarget: function (card, player, target) { + var targets = []; + if (ui.selected.targets.length) targets.addArray(ui.selected.targets); + var evt = _status.event.getParent("useCard"); + if (evt && evt.card == card) targets.addArray(evt.targets); + if (targets.length) { + var hs = target.countCards("h"); + for (var i of targets) { + if (i.countCards("h") != hs) return true; } return false; } return true; }, - recastable:true, - selectTarget:2, - postAi:()=>true, - contentBefore:function(){ - if(!targets.length) return; - var map={}; - event.getParent().customArgs.default.tiaojiyanmei_map=map; - var average=0; - for(var target of targets){ - var hs=target.countCards('h'); - map[target.playerid]=hs; - average+=hs; + recastable: true, + selectTarget: 2, + postAi: () => true, + contentBefore: function () { + if (!targets.length) return; + var map = {}; + event.getParent().customArgs.default.tiaojiyanmei_map = map; + var average = 0; + for (var target of targets) { + var hs = target.countCards("h"); + map[target.playerid] = hs; + average += hs; } - map.average=(average/targets.length); + map.average = average / targets.length; }, - content:function(){ - var map=event.tiaojiyanmei_map,num1=map.average,num2=map[target.playerid]; - if(typeof num2!='number') num2=target.countCards('h'); - if(num2>num1) target.chooseToDiscard('he',true); - else if(num2 num1) target.chooseToDiscard("he", true); + else if (num2 < num1) target.draw(); }, - contentAfter:function(){ - 'step 0' - if(!player.isIn()||targets.length<2){ + contentAfter: function () { + "step 0"; + if (!player.isIn() || targets.length < 2) { event.finish(); return; } - var num=targets[0].countCards('h'); - for(var i=1;inum1){ - if(target.countCards('e',function(card){ - return get.value(card)<=0; - })) return 1; + result: { + target: function (player, target, card, isLink) { + var targets = []; + if (ui.selected.targets.length) targets.addArray(ui.selected.targets); + var evt = _status.event.getParent("useCard"); + if (evt && evt.card == card) targets.addArray(evt.targets); + if ( + evt && + evt.card == card && + evt.customArgs && + evt.customArgs.tiaojiyanmei_map + ) { + var map = evt.customArgs.tiaojiyanmei_map, + num1 = map.average, + num2 = map[target.playerid]; + if (typeof num2 != "number") num2 = target.countCards("h"); + if (num2 > num1) { + if ( + target.countCards("e", function (card) { + return get.value(card) <= 0; + }) + ) + return 1; return -1; } - if(num2average){ - if(target.countCards('e',function(card){ - return get.value(card)<=0; - })) return 1; + var average = 0; + for (var i of targets) average += i.countCards("h", fh); + if (!targets.includes(target)) { + var th = target.countCards("h", fh); + average += th; + average /= targets.length + 1; + if (th == average) return 0; + if (th < average) return th == average - 1 ? 2 : 1; + if (th > average) { + if ( + target.countCards("e", function (card) { + return get.value(card) <= 0; + }) + ) + return 1; return -0.5; } return 0; } - average/=targets.length; - if(thaverage){ - if(target.countCards('e',function(card){ - return get.value(card)<=0; - })) return 1; + average /= targets.length; + if (th < average) return 1; + if (th > average) { + if ( + target.countCards("e", function (card) { + return get.value(card) <= 0; + }) + ) + return 1; return -1; } return 0; @@ -6507,372 +7954,475 @@ game.import('character', function () { }, }, }, - characterFilter:{ + characterFilter: {}, + dynamicTranslate: {}, + perfectPair: { + wujing: ["sunce", "sunben", "wuguotai"], }, - dynamicTranslate:{ + characterReplace: { + wangcan: ["wangcan", "sp_wangcan", "tw_wangcan"], + sunshao: ["sunshao", "sp_sunshao"], + xunchen: ["xunchen", "re_xunchen", "sp_xunchen", "tw_xunchen", "clan_xunchen"], + xinpi: ["xinpi", "sp_xinpi"], + duyu: ["duyu", "dc_duyu", "sp_duyu", "pk_sp_duyu"], + zhangwen: ["zhangwen", "sp_zhangwen"], + ol_bianfuren: ["ol_bianfuren", "sp_bianfuren", "tw_bianfuren"], + wangshuang: ["wangshuang", "sp_wangshuang"], + huaman: ["huaman", "sp_huaman"], + gaolan: ["gaolan", "dc_gaolan", "sp_gaolan"], + cuiyan: ["cuiyan", "sp_cuiyan"], + wujing: ["wujing", "tw_wujing"], + zhouchu: ["jin_zhouchu", "zhouchu", "tw_zhouchu"], + liuzhang: ["liuzhang", "tw_liuzhang"], + chenzhen: ["sp_chenzhen", "tw_chenzhen"], + feiyi: ["ol_feiyi", "feiyi", "tw_feiyi"], + wangling: ["dc_wangling", "wangling", "tw_wangling", "clan_wangling"], + qiaogong: ["qiaogong", "tw_qiaogong"], + sp_chendong: ["sp_chendong", "tw_chendong", "chendong"], + sp_jiangqing: ["sp_jiangqing", "tw_jiangqing", "jiangqing"], + kongrong: ["dc_kongrong", "sp_kongrong", "jsrg_kongrong", "kongrong"], + dc_mifuren: ["dc_mifuren", "sp_mifuren"], }, - perfectPair:{ - wujing:['sunce','sunben','wuguotai'], - }, - characterReplace:{ - wangcan:['wangcan','sp_wangcan','tw_wangcan'], - sunshao:['sunshao','sp_sunshao'], - xunchen:['xunchen','re_xunchen','sp_xunchen','tw_xunchen','clan_xunchen'], - xinpi:['xinpi','sp_xinpi'], - duyu:['duyu','dc_duyu','sp_duyu','pk_sp_duyu'], - zhangwen:['zhangwen','sp_zhangwen'], - ol_bianfuren:['ol_bianfuren','sp_bianfuren','tw_bianfuren'], - wangshuang:['wangshuang','sp_wangshuang'], - huaman:['huaman','sp_huaman'], - gaolan:['gaolan','dc_gaolan','sp_gaolan'], - cuiyan:['cuiyan','sp_cuiyan'], - wujing:['wujing','tw_wujing'], - zhouchu:['jin_zhouchu','zhouchu','tw_zhouchu'], - liuzhang:['liuzhang','tw_liuzhang'], - chenzhen:['sp_chenzhen','tw_chenzhen'], - feiyi:['ol_feiyi','feiyi','tw_feiyi'], - wangling:['dc_wangling','wangling','tw_wangling','clan_wangling'], - qiaogong:['qiaogong','tw_qiaogong'], - sp_chendong:['sp_chendong','tw_chendong','chendong'], - sp_jiangqing:['sp_jiangqing','tw_jiangqing','jiangqing'], - kongrong:['dc_kongrong','sp_kongrong','jsrg_kongrong','kongrong'], - dc_mifuren:['dc_mifuren','sp_mifuren'], - }, - translate:{ - liuba_prefix:'手杀', - sp_zhujun_prefix:'手杀', - sp_huangfusong_prefix:'手杀', - sp_zhangchangpu_prefix:'手杀', - sp_cuiyan_prefix:'手杀', - sp_huaman_prefix:'手杀', - sp_gaolan_prefix:'手杀', - sunyi_prefix:'手杀', - sp_wangshuang_prefix:'手杀', - sp_zongyu_prefix:'手杀', - db_wenyang_prefix:'手杀', - sp_yanghu_prefix:'手杀', - sp_zhangwen_prefix:'手杀', - sp_xujing_prefix:'手杀', - sp_huaxin_prefix:'手杀', - zhouchu_prefix:'手杀', - sp_mifuren_prefix:'手杀', - sp_xinpi_prefix:'手杀', - sp_bianfuren_prefix:'手杀', - sp_duyu_prefix:'手杀', - luotong_prefix:'手杀', - sp_wangcan_prefix:'手杀', - sp_sunshao_prefix:'手杀', - sp_xunchen_prefix:'手杀', - sp_kongrong_prefix:'手杀', + translate: { + liuba_prefix: "手杀", + sp_zhujun_prefix: "手杀", + sp_huangfusong_prefix: "手杀", + sp_zhangchangpu_prefix: "手杀", + sp_cuiyan_prefix: "手杀", + sp_huaman_prefix: "手杀", + sp_gaolan_prefix: "手杀", + sunyi_prefix: "手杀", + sp_wangshuang_prefix: "手杀", + sp_zongyu_prefix: "手杀", + db_wenyang_prefix: "手杀", + sp_yanghu_prefix: "手杀", + sp_zhangwen_prefix: "手杀", + sp_xujing_prefix: "手杀", + sp_huaxin_prefix: "手杀", + zhouchu_prefix: "手杀", + sp_mifuren_prefix: "手杀", + sp_xinpi_prefix: "手杀", + sp_bianfuren_prefix: "手杀", + sp_duyu_prefix: "手杀", + luotong_prefix: "手杀", + sp_wangcan_prefix: "手杀", + sp_sunshao_prefix: "手杀", + sp_xunchen_prefix: "手杀", + sp_kongrong_prefix: "手杀", - sp_wangcan:'手杀王粲', - spqiai:'七哀', - spqiai_info:'出牌阶段限一次,你可以将一张非基本牌交给一名其他角色。然后其选择一项:①你回复1点体力。②你摸两张牌。', - spshanxi:'善檄', - spshanxi_suoming:'善檄', - spshanxi_info:'出牌阶段开始时,你可令一名其他角色获得“檄”标记并清除场上已有的其他“檄”标记(若有)。有“檄”标记的角色回复体力时,若其体力值大于0,则其需选择一项:①交给你两张牌。②失去1点体力。', - sp_chenzhen:'陈震', - shameng:'歃盟', - shameng_info:'出牌阶段限一次,你可弃置两张颜色相同的手牌并选择一名其他角色。其摸两张牌,然后你摸三张牌。', - sp_sunshao:'手杀孙邵', - fubi:'辅弼', - fubi2:'辅弼', - fubi_info:'游戏开始时,你可选择一名其他角色。该角色的手牌上限于你死亡前+3。', - zuici:'罪辞', - zuici_info:'当你进入濒死状态时,你可废除你的一个不为空的装备栏,然后将体力值回复至1点。', - sp_xunchen:'手杀荀谌', - jianzhan:'谏战', - jianzhan_info:'出牌阶段限一次,你可选择一名其他角色A和其攻击范围内的另一名手牌数小于其的角色B。A选择一项:①视为对B使用一张【杀】。②令你摸一张牌。', - duoji:'夺冀', - duoji_info:'限定技,出牌阶段,你可弃置两张手牌并选择一名装备区有牌的其他角色。你获得其装备区里的所有牌。', - binglinchengxiax:'兵临城下', - binglinchengxiax_info:'出牌阶段,对一名其他角色使用。你亮出牌堆顶的四张牌,依次对其使用其中所有的【杀】,然后将剩余的牌置于牌堆顶。', - mjweipo:'危迫', - mjweipo_effect:'危迫', - mjweipo_remove:'危迫', - mjweipo_info:'出牌阶段限一次。你可以选择一个智囊或【兵临城下】,令一名没有〖危迫〗效果的角色获得如下一次性效果直到你下回合开始:其可于出牌阶段弃置一张【杀】,并获得一张你选择的牌。', - mjchenshi:'陈势', - mjchenshi_player:'陈势', - mjchenshi_target:'陈势', - mjchenshi_info:'当有角色使用【兵临城下】指定第一个目标后,其可交给你一张牌,并将牌堆的顶三张牌中所有不为【杀】的牌置入弃牌堆;当有角色成为【兵临城下】的目标后,其可交给你一张牌,然后将牌堆顶三张牌中所有的【杀】置入弃牌堆。', - mjmouzhi:'谋识', - mjmouzhi_info:'锁定技,当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害花色相同,则你防止此伤害。', - luotong:'手杀骆统', - qinzheng:'勤政', - qinzheng_info:'锁定技,当你使用或打出牌时,若你本局游戏内使用或打出过的牌数和:为3的倍数,你从牌堆中获得一张【杀】或【闪】;为5的倍数,你从牌堆中获得一张【桃】或【酒】;为8的倍数,你从牌堆中获得一张【决斗】或【无中生有】(可获得对应的衍生替换牌)。', - sp_duyu:'手杀杜预', - spwuku:'武库', - spwuku_info:'锁定技,当有角色使用装备牌时,若你的“武库”数小于3,则你获得一个“武库”。', - spwuku_info_guozhan:'锁定技,当有其他势力的角色使用装备牌时,若你的“武库”数小于2,则你获得一个“武库”。', - spsanchen:'三陈', - spsanchen_info:'觉醒技,结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。', - spmiewu:'灭吴', - spmiewu2:'灭吴', - spmiewu_backup:'灭吴', - spmiewu_info:'每回合限一次。你可弃置一枚“武库”并将一张牌当做任意基本牌或锦囊牌使用,然后摸一张牌。', - sp_bianfuren:'手杀卞夫人', - spwanwei:'挽危', - spwanwei_info:'每轮累计限一次。①出牌阶段,你可选择一名其他角色。②当有其他角色处于濒死状态时。你可令该角色回复X+1点体力(至少回复至1),然后你失去X点体力。(X为你的体力值)', - spyuejian:'约俭', - spyuejian_info:'锁定技,你的手牌上限基数等于你的体力上限。当你处于濒死状态时,你可弃置两张牌,然后回复1点体力。', - feiyi:'手杀费祎', - feiyi_prefix:'手杀', - reshengxi:'生息', - reshengxi_info:'结束阶段,若你于本回合内未造成过伤害,则你可摸两张牌。', - fyjianyu:'谏喻', - fyjianyu_info:'每轮限一次。出牌阶段,你可选择两名角色,令这些角色获得“喻”直到你的下回合开始。当一名有“喻”的角色A使用牌指定另一名有“喻”的角色B为目标时,你令B摸一张牌。', - mjshengxi:'生息', - mjshengxi_info:'准备阶段,你可以获得一张【调剂盐梅】;结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊或摸一张牌。', - mjkuanji:'宽济', - mjkuanji_info:'每回合限一次。当你因弃置而失去牌后,你可令一名其他角色获得其中的一张牌,然后你摸一张牌。', - tiaojiyanmei:'调剂盐梅', - tiaojiyanmei_info:'出牌阶段,对两名手牌数不均相同的其他角色使用。若目标角色于此牌使用准备工作结束时的手牌数大于此时所有目标的平均手牌数,其弃置一张牌。若小于则其摸一张牌。此牌使用结束后,若所有目标角色的手牌数均相等,则你可令一名角色获得所有因执行此牌效果而弃置的牌。', - refubi:'辅弼', - refubi_info:'游戏开始时,你可令一名其他角色获得“辅弼”标记。有“辅弼”标记的角色的准备阶段开始时,你可选择一项:①令其本回合使用【杀】的次数上限+1。②令其本回合的手牌上限+3。', - rezuici:'罪辞', - rezuici_backup:'罪辞', - rezuici_info:'出牌阶段,或当你处于濒死状态时,你可以废除一个有牌的装备栏并回复2点体力,然后可以移动“辅弼”标记。', - mjdingyi:'定仪', - mjdingyi_info:'游戏开始时,你选择一个效果(相同效果不可叠加)并令全场角色获得之:①摸牌阶段额定摸牌数+1。②手牌上限+2。③攻击范围+1。④脱离濒死状态时回复1点体力。', - mjzuici:'罪辞', - mjzuici_info:'当你受到伤害后,你可令伤害来源失去〖定仪〗效果,然后令其从牌堆中获得一张由你选择的智囊。', - mjfubi:'辅弼', - mjfubi_info:'每轮限一次。出牌阶段,你可选择一项:①更换一名角色的〖定仪〗效果。②弃置一张牌并令一名角色的〖定仪〗效果翻倍直到你的下回合开始。', - wujing:'吴景', - heji:'合击', - heji_info:'当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。', - liubing:'流兵', - liubing_info:'锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。', - sp_mifuren:'手杀糜夫人', - spcunsi:'存嗣', - spcunsi2:'存嗣', - spcunsi_info:'出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张杀的伤害值基数+1。', - spguixiu:'闺秀', - spguixiu_info:'锁定技,当你受到伤害后,若你的武将牌背面朝上,则你将武将牌翻至正面。当你的武将牌从背面翻至正面时,你摸一张牌。', - qingyu:'清玉', - qingyu_info:'使命技。①当你受到伤害时,你弃置两张牌,然后防止此伤害。②使命:准备阶段,若你的体力值等于体力上限且你没有手牌,则你获得〖悬存〗。③失败:当你进入濒死状态时,你减1点体力上限。', - xuancun:'悬存', - xuancun_info:'其他角色的回合结束时,若你的手牌数小于体力值,则你可以令其摸X张牌(X为你的体力值与手牌数之差且至多为2)。', - xinlirang:'礼让', - xinlirang_info:'①其他角色的摸牌阶段开始时,若你没有“谦”标记,则你可以获得一枚“谦”标记。若如此做,其额定摸牌数+2,且本回合的弃牌阶段开始时,你可以获得其弃置的至多两张牌。②摸牌阶段开始时,若你有“谦”标记,则你跳过此摸牌阶段并移除“谦”标记。', - xinmingshi:'名仕', - xinmingshi_info:'锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。', - sp_xinpi:'手杀辛毗', - spyinju:'引裾', - spyinju2:'引裾', - spyinju_info:'出牌阶段限一次,你可令一名其他角色选择一项:①对你使用一张【杀】(无距离限制)。②其下个回合的准备阶段开始时,跳过出牌阶段和弃牌阶段。', - spchijie:'持节', - spchijie_info:'每回合限一次。当你成为其他角色使用牌的唯一目标时,你可判定。若结果大于6,则你取消此牌的所有目标。', - reduoji:'夺冀', - reduoji_info:'出牌阶段限一次,你可将一张牌置于其他角色的武将牌上,称为“冀”。当有装备牌因使用而进入一名角色的装备区后,若该角色有“冀”且其为使用者,则你获得此装备牌,其移去一个“冀”并摸一张牌。一名其他角色的回合结束后,若其有“冀”,则你获得其的所有“冀”。', - wangling:'手杀王淩', - wangling_prefix:'手杀', - mouli:'谋立', - mouli_info:'出牌阶段限一次,你可以将一张手牌交给一名其他角色,其获得如下效果直到你的下回合开始:其可以将黑色牌当做【杀】,红色牌当做【闪】使用。其第一次触发“使用【杀】/【闪】结算完成后”的时机时,你摸三张牌。', - zifu:'自缚', - zifu_info:'锁定技,当有角色死亡时,若其因你获得的“谋立”效果未过期,则你减2点体力上限。', - xingqi:'星启', - xingqi_info:'①当你使用牌时,若此牌不为延时锦囊牌且你没有同名的“备”,则你获得一枚与此牌名称相同的“备”。②结束阶段,你可移去一枚“备”,然后从牌堆中获得一张与此“备”名称相同的牌。', - xinzifu:'自缚', - xinzifu_info:'锁定技。出牌阶段结束时,若你本阶段内未使用牌,则你移去所有“备”且本回合的手牌上限-1。', - mibei:'秘备', - mibei_info:'使命技。①使命:当你使用的牌结算完成后,若你的“备”中包含的基本牌,锦囊牌,装备牌数量均大于1,则你从牌堆中获得这三种类型的牌各一张并获得技能“谋立”。②失败:结束阶段开始时,若你没有“备”,且你于本回合的准备阶段开始时也没有“备”,则你减1点体力上限。', - xinmouli:'谋立', - xinmouli_info:'出牌阶段限一次,你可以指定一名其他角色。其移去你的一个“备”,然后从牌堆中获得一张与此“备”名称相同的牌。', - wangfuzhaolei:'王甫赵累', - xunyi:'殉义', - xunyi2:'殉义', - xunyi3:'殉义', - xunyi_info:'游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的伤害后,你/其弃置一张牌。', - zhouchu:'手杀周处', - xianghai:'乡害', - xianghai_info:'锁定技,其他角色的手牌上限-1。你手牌区的装备牌均视为【酒】。', - chuhai:'除害', - chuhai_info:'出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。', - rechuhai:'除害', - rechuhai_info:'使命技。①出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。②当你因发动〖除害①〗而展示拼点牌时,你令此牌的点数+X(X=(4-你装备区的牌数))。③使命:当有装备牌进入你的装备区后,若你的装备区内有至少三张牌,则你将体力值回复至上限,失去〖乡害〗并获得〖彰名〗。④失败:当你因发动〖除害①〗发起的拼点没赢时,若你的最终点数不大于6,则你触发使命失败分支。', - zhangming:'彰名', - zhangming_info:'锁定技。①你使用的♣牌不能被其他角色响应。②每回合限一次,当你对其他角色造成伤害后,你随机弃置其一张手牌,然后你从牌堆或弃牌堆中获得与其展示牌类型不同类型的牌各一张(若其没有手牌,则你改为从牌堆或弃牌堆中获得所有类型牌各一张),且以此法得到的牌不计入本回合的手牌上限。', - sp_kongrong:'手杀孔融', - spmingshi:'名士', - spmingshi_info:'锁定技,当你受到1点伤害后,伤害来源弃置一张牌。', - splirang:'礼让', - splirang_info:'出牌阶段限一次,你可以弃置所有手牌,然后将其中的至多X张牌交给一名其他角色(X为你的体力值),之后摸一张牌。', - caizhenji:'蔡贞姬', - sheyi:'舍裔', - sheyi_info:'每轮限一次。当有体力值小于你的其他角色受到伤害时,你可以交给其至少X张牌并防止此伤害(X为你的体力值)。', - tianyin:'天音', - tianyin_info:'锁定技,结束阶段开始时,你从牌堆中获得每种本回合未使用过的类型的牌各一张。', - xiangchong:'向宠', - guying:'固营', - guying_info:'锁定技。每回合限一次,当你于回合外因使用/打出/弃置而失去牌后,若牌数为1,则你获得一枚“固”并令当前回合角色选择一项:①随机交给你一张牌。②令你获得本次失去的牌,若为装备牌,则你使用之。准备阶段开始时,你移去所有“固”并弃置等量的牌。', - muzhen:'睦阵', - muzhen_backup:'睦阵', - muzhen_info:'出牌阶段各限一次。①你可以将两张牌交给一名装备区内有牌的其他角色,然后获得其装备区内的一张牌。②你可以将装备区内的一张牌置于其他角色的装备区内,然后获得其一张手牌。', - sp_huaxin:'手杀华歆', - hxrenshi:'仁仕', - hxrenshi_info:'出牌阶段每名角色限一次。你可以将一张手牌交给一名其他角色。', - debao:'德保', - debao_info:'锁定技,当其他角色获得你的牌后,若你的“仁”数小于你的体力上限,则你将牌堆顶的一张牌置于你的武将牌上,称为“仁”。准备阶段,你获得所有“仁”。', - buqi:'不弃', - buqi_info:'锁定技,当有角色进入濒死状态时,若你的“仁”数大于1,则你移去两张“仁”并令其回复1点体力。一名角色死亡后,你将所有“仁”置入弃牌堆。', - yuanqing:'渊清', - yuanqing_info:'锁定技,出牌阶段结束时,你随机将弃牌堆中你本阶段使用过的牌类型的各一张牌置于仁库中。', - shuchen:'疏陈', - shuchen_info:'锁定技,当有角色进入濒死状态时,若仁库中的牌数大于三,则你获得仁库中的所有牌,然后其回复1点体力。', - sp_xujing:'手杀许靖', - boming:'博名', - boming_info:'出牌阶段限两次,你可以将一张牌交给一名其他角色。结束阶段,若你本回合以此法失去了两张以上的牌,则你摸一张牌。', - ejian:'恶荐', - ejian_info:'锁定技,每名角色限一次。当有其他角色因〖博名〗而得到了你的牌后,若其拥有与此牌类型相同的其他牌,则你令其选择一项:①受到1点伤害。②展示所有手牌,并弃置所有与此牌类别相同的牌。', - zhangzhongjing:'张机', - jishi:'济世', - jishi_info:'锁定技。①当你使用的牌结算完成后,若你未因此牌造成过伤害,则你将此牌对应的所有实体牌置于仁库中。②当有牌不因溢出而离开仁库时,你摸一张牌。', - liaoyi:'疗疫', - liaoyi_info:'其他角色的回合开始时,若其:①手牌数小于体力值且仁库内牌数大于等于X,则你可令其从仁库中获得X张牌;②手牌数大于体力值,则你可以令其将X张牌置于仁库中(X为其手牌数与体力值之差且至多为4)。', - xinliaoyi:'疗疫', - xinliaoyi_info:'其他角色的回合开始时,你可选择一项:①令其从仁库中获得一张牌。②若其手牌数大于体力值,则令其将X张手牌置入仁库(X为其手牌数与体力值之差)。', - binglun:'病论', - binglun_info:'出牌阶段限一次,你可以将仁库中的一张牌置于弃牌堆并选择一名角色。该角色选择一项:①摸一张牌。②于其下回合结束时回复1点体力。', - sp_zhangwen:'手杀张温', - gebo:'戈帛', - gebo_info:'锁定技,当有角色回复体力后,你将牌堆顶的一张牌置入仁库。', - spsongshu:'颂蜀', - spsongshu_info:'其他角色的摸牌阶段开始时,若其体力值大于你且仁库内有牌,则你可以令其放弃摸牌。其改为获得X张仁(X为你的体力值且至多为5),且本回合内不能使用牌指定其他角色为目标。', - liuzhang:'刘璋', - xiusheng:'休生', - xiusheng_info:'锁定技。准备阶段,你将所有“生”置入弃牌堆,然后摸X张牌,并将等量的牌置于武将牌上,称为“生”(X为你因〖引狼〗而选择的势力的存活角色数)。', - yinlang:'引狼', - yinlang_info:'①每轮限一次。回合开始时,你选择场上的一个势力。②一名角色的出牌阶段开始时,若其势力与你选择的势力相同,则其选择一项:1.获得你的一张“生”,然后其本回合使用牌时不能指定你以外的角色为目标。2.你获得一张“生”。', - huaibi:'怀璧', - huaibi_info:'主公技,锁定技。你的手牌上限+X(X为你因〖引狼〗而选择的势力的存活角色数)。', - jutu:'据土', - jutu_info:'锁定技,准备阶段,你获得所有你武将牌上的“生”,然后摸X+1张牌,然后将X张牌置于你的武将牌上,称为“生”(X为你因〖邀虎〗选择势力的角色数量)。', - yaohu:'邀虎', - yaohu_info:'每轮限一次,你的回合开始时,你须选择场上一个势力。该势力其他角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:①对你指定的另一名的其他角色使用一张【杀】(无距离和次数限制);②交给你两张牌。', - rehuaibi:'怀璧', - rehuaibi_info:'主公技,锁定技,你的手牌上限+X(X为你因〖邀虎〗选择势力的角色数量)。', - qiaogong:'桥公', - yizhu:'遗珠', - yizhu_info:'①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中(X为角色数,选择牌的牌名对其他角色可见)。②其他角色使用“遗珠”牌指定唯一目标时,你可以取消此目标,然后你清除对应的“遗珠”标记。', - luanchou:'鸾俦', - luanchou_info:'出牌阶段限一次,你可令两名角色获得“姻”标记并清除原有标记。拥有“姻”标记的角色视为拥有技能〖共患〗。', - gonghuan:'共患', - gonghuan_info:'锁定技。每回合限一次,一名其他角色受到伤害时,若其拥有“姻”标记且其体力值小于你,则你将伤害转移给自己。此伤害结算结束后,你与其移去“姻”标记。', - sp_yanghu:'手杀羊祜', - mingfa:'明伐', - mingfa_info:'①结束阶段,你可展示一张牌并记录为“明伐”。②出牌阶段开始时,若“明伐”牌在你的手牌区或装备区,则你可以使用“明伐”牌与一名其他角色拼点。若你赢:你获得对方一张牌并从牌堆中获得一张点数等于“明伐”牌牌面点数-1的牌。若你没赢:你本回合不能使用牌指定其他角色为目标。③你的拼点牌亮出后,你令此牌的点数+2。', - rongbei:'戎备', - rongbei_info:'限定技。出牌阶段,你可选择一名有空装备栏的角色。系统为该角色的每个空装备栏选择一张装备牌,然后该角色使用之。', - db_wenyang:'手杀文鸯', - dbquedi:'却敌', - dbquedi_info:'每回合限一次。当你使用【杀】或【决斗】指定唯一目标后,你可选择:①获得目标角色的一张手牌。②弃置一张基本牌,并令此牌的伤害值基数+1。③背水:减1点体力上限,然后依次执行上述所有选项。', - dbzhuifeng:'椎锋', - dbzhuifeng_info:'魏势力技。每回合限两次,你可以失去1点体力并视为使用一张【决斗】(你死亡后仍然结算)。当你因此【决斗】而受到伤害时,你防止此伤害并令此技能失效直到出牌阶段结束。', - dbchongjian:'冲坚', - dbchongjian_backup:'冲坚', - dbchongjian_info:'吴势力技。你可以将一张装备牌当做一种【杀】(无距离限制且无视防具)或【酒】使用。当你以此法使用【杀】造成伤害后,你获得目标角色装备区内的X张牌(X为伤害值)。', - dbchoujue:'仇决', - dbchoujue_info:'锁定技。当你杀死其他角色后,你加1点体力上限并摸两张牌,然后本回合发动【却敌】的次数上限+1。', - sp_chendong:'手杀陈武董袭', - sp_chendong_prefix:'手杀', - spyilie:'毅烈', - spyilie_info:'出牌阶段开始时,你可选择:①本阶段内使用【杀】的次数上限+1。②本回合内使用【杀】被【闪】抵消时,摸一张牌。③背水:失去1点体力,然后依次执行上述所有选项。', - spfenming:'奋命', - spfenming_info:'出牌阶段限一次,你可以选择一名体力值不大于你的角色。若其:未横置,其横置;已横置,你获得其一张牌。', - yuanhuan:'袁涣', - qingjue:'请决', - qingjue_info:'每轮限一次。当有其他角色A使用牌指定另一名体力值小于A且不处于濒死状态的其他角色B为目标时,你可以摸一张牌,然后与A拼点。若你赢,你取消此目标。若你没赢,你将此牌的目标改为自己。', - fengjie:'奉节', - fengjie2:'奉节', - fengjie_info:'锁定技,准备阶段开始时,你选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸四张)或弃置至与其体力值相等。', - sp_zongyu:'手杀宗预', - zhibian:'直辩', - zhibian_info:'准备阶段,你可以和一名其他角色拼点。若你赢,你可选择:①将其装备区/判定区内的一张牌移动到你的对应区域。②回复1点体力。③背水:跳过下个摸牌阶段,然后依次执行上述所有选项;若你没赢,你失去1点体力。', - yuyan:'御严', - yuyan_info:'锁定技。当你成为非转换的【杀】的目标时,若使用者的体力值大于你且此【杀】有点数,则你令使用者选择一项:①交给你一张点数大于此【杀】的牌。②取消此目标。', - sp_wangshuang:'手杀王双', - yiyong:'异勇', - yiyong_info:'当你受到其他角色造成的渠道为【杀】的伤害后,若你的装备区内有武器牌,则你可以获得此【杀】对应的所有实体牌,然后将这些牌当做【杀】对伤害来源使用(无距离限制)。若其装备区内没有武器牌,则此伤害+1。', - shanxie:'擅械', - shanxie_info:'①出牌阶段限一次,你可从牌堆中获得一张武器牌。若牌堆中没有武器牌,则你改为随机获得一名角色装备区内的一张武器牌。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。', - shanxie_info_old:'①出牌阶段限一次,你可选择一项:⒈从牌堆中获得一张武器牌。⒉获得一名其他角色装备区内的一张武器牌并使用,然后其将一张手牌当做【杀】对你使用。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。', - sunyi:'手杀孙翊', - zaoli:'躁厉', - zaoli_info:'锁定技。①你不能于回合内使用你手牌中不为本回合得到的牌。②当你使用或打出手牌时,你获得一个“厉”(至多4个)。③回合开始时,若你有“厉”,则你移去所有“厉”并弃置任意张牌,然后摸X+Y张牌。若X大于2,你失去1点体力(X为你移去的标记数,Y为你弃置的牌数)。', - sp_gaolan:'手杀高览', - spjungong:'峻攻', - spjungong_info:'出牌阶段,你可失去X+1点体力或弃置X+1张牌,视为对一名其他角色使用【杀】(不计入次数和距离限制,X为你本回合内发动过〖峻攻〗的次数)。若你因此【杀】造成了伤害,则你令此技能失效直到回合结束。', - spdengli:'等力', - spdengli_info:'当你使用【杀】指定目标后,或成为【杀】的目标后,若使用者和目标的体力值相等,则你摸一张牌。', - sp_huaman:'手杀花鬘', - spxiangzhen:'象阵', - spxiangzhen_info:'锁定技。①【南蛮入侵】对你无效。②当有角色使用的【南蛮入侵】结算结束后,若有角色因此牌受到过伤害,则你和使用者各摸一张牌。', - spfangzong:'芳踪', - spfangzong_info:'锁定技。①你不能于回合内使用具有伤害标签的牌指定攻击范围内的角色为目标。②攻击范围内包含你的角色不能使用具有伤害标签的牌指定你为目标。③结束阶段,你将手牌摸至X张(X为场上存活人数且至多为8)。', - spxizhan:'嬉战', - spxizhan_info:'其他角色的回合开始时,你须选择一项:①失去1点体力。②弃置一张牌并令〖芳踪〗于本回合失效,然后若此牌的花色为:♠,其视为使用一张【酒】;♥,你视为使用一张【无中生有】;♣,你视为对其使用【铁索连环】;♦:你视为对其使用火【杀】(无距离限制)。', - sp_cuiyan:'手杀崔琰', - spyajun:'雅俊', - spyajun_info:'①摸牌阶段,你令额定摸牌数+1。②出牌阶段开始时,你可以用一张本回合得到的牌与其他角色拼点。若你赢,则你可将其中一张拼点牌置于牌堆顶。若你没赢,你本回合的手牌上限-1。', - spzundi:'尊嫡', - spzundi_info:'出牌阶段限一次,你可以弃置一张手牌并选择一名角色,然后你进行判定。若结果为:黑色,其摸三张牌;红色,其可以移动场上的一张牌。', - sp_zhangchangpu:'手杀张昌蒲', - spdifei:'抵诽', - spdifei_info:'锁定技。每回合限一次,当你受到伤害后,你摸一张牌或弃置一张手牌,然后展示所有手牌。若此伤害的渠道为没有花色的牌或你的手牌中没有与此牌花色相同的牌,则你回复1点体力。', - spyanjiao:'严教', - spyanjiao_info:'出牌阶段限一次。你可以将手牌中一种花色的所有牌交给一名其他角色,对其造成1点伤害。然后你于自己的下回合开始时摸等量的牌。', - sp_jiangwan:'蒋琬', - spzhenting:'镇庭', - spzhenting_info:'每回合限一次。当你攻击范围内的角色成为【杀】或延时锦囊的目标时,若你不是此牌的使用者且不是此牌的目标,则你可以将此目标改为自己。然后你选择一项:①弃置使用者的一张手牌。②摸一张牌。', - spjincui:'尽瘁', - spjincui_info:'限定技。出牌阶段,你可以和一名其他角色交换位置,然后失去X点体力(X为你的体力值)。', - sp_jiangqing:'蒋钦', - spjianyi:'俭衣', - spjianyi_info:'锁定技。其他角色的回合结束时,若弃牌堆中有于本回合内因弃置而进入弃牌堆的防具牌,则你获得其中一张。', - spshangyi:'尚义', - spshangyi_info:'出牌阶段限一次。你可以弃置一张牌并选择一名其他角色。其观看你的手牌,然后你观看其手牌并获得其中的一张。', - sp_lvfan:'手杀吕范', - sp_lvfan_prefix:'手杀', - spdiaodu:'调度', - spdiaodu_info:'准备阶段,你可令一名角色摸一张牌,然后移动其装备区内的一张牌。', - spdiancai:'典财', - spdiancai_info:'其他角色的结束阶段开始时,你可以令至多X名角色各摸一张牌(X为你本回合失去的手牌数)。', - mbdiaodu:'调度', - mbdiaodu_info:'准备阶段,你可以移动一名角色装备区内的一张牌(不能移动给自己),然后其摸一张牌。', - mbdiancai:'典财', - mbdiancai_info:'其他角色的出牌阶段阶段结束后,若你本阶段失去的牌数不小于你的体力值,则你可将手牌数补至体力上限。', - spyanji:'严纪', - spyanji_info:'出牌阶段开始时,你可以进行“整肃”。', - sp_huangfusong:'手杀皇甫嵩', - spzhengjun:'整军', - spzhengjun_info:'①出牌阶段开始时,你可进行“整肃”。②当你因整肃而摸牌或回复体力后,你可令一名其他角色摸两张牌或回复1点体力。', - spshiji:'势击', - spshiji_info:'当你对其他角色造成属性伤害时,若你的手牌数不为全场唯一最多,则你可以观看其手牌。你令其弃置其中的所有红色牌,然后摸等量的牌。', - sptaoluan:'讨乱', - sptaoluan_info:'每回合限一次。一名角色的判定结果确定时,若结果的花色为♠,则你可以终止导致此判定发生的上级事件。然后选择一项:①获得判定牌对应的实体牌。②视为对判定角色使用一张火【杀】(无距离和次数限制)。', - sp_zhujun:'手杀朱儁', - yangjie:'佯解', - yangjie_info:'出牌阶段限一次,你可以摸一张牌并和一名其他角色A拼点。当你以此法展示你的拼点牌时,你令此牌点数-X(X为你已损失的体力值)。若你没赢,则你可以令另一名其他角色B获得两张拼点牌,然后其视为对A使用一张火【杀】。', - zjjuxiang:'拒降', - zjjuxiang_info:'限定技。一名其他角色脱离濒死状态时,你可以对其造成1点伤害,然后摸X张牌(X为其体力上限且至多为5)。', - xinyangjie:'佯解', - xinyangjie_info:'出牌阶段限一次,你可以与一名其他角色A拼点。若你没赢,则你可以令另一名其他角色B视为对A使用一张火【杀】。', - xinjuxiang:'拒降', - xinjuxiang_info:'限定技,一名其他角色脱离濒死状态时,你可以对其造成1点伤害。', - houfeng:'厚俸', - houfeng_info:'每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。', - liuba:'手杀刘巴', - duanbi:'锻币', - duanbi_info:'限定技。出牌阶段,若场上所有角色的手牌数之和大于角色数之和的二倍,则你可以令所有其他角色各弃置X张手牌(X为该角色手牌数的一半且向下取整且至多为3)。然后你可选择一名角色,令其随机获得三张以此法被弃置的牌。', - tongduo:'统度', - tongduo_info:'每回合限一次。当你成为其他角色使用牌的唯一目标后,你可令一名角色重铸一张牌。', + sp_wangcan: "手杀王粲", + spqiai: "七哀", + spqiai_info: + "出牌阶段限一次,你可以将一张非基本牌交给一名其他角色。然后其选择一项:①你回复1点体力。②你摸两张牌。", + spshanxi: "善檄", + spshanxi_suoming: "善檄", + spshanxi_info: + "出牌阶段开始时,你可令一名其他角色获得“檄”标记并清除场上已有的其他“檄”标记(若有)。有“檄”标记的角色回复体力时,若其体力值大于0,则其需选择一项:①交给你两张牌。②失去1点体力。", + sp_chenzhen: "陈震", + shameng: "歃盟", + shameng_info: + "出牌阶段限一次,你可弃置两张颜色相同的手牌并选择一名其他角色。其摸两张牌,然后你摸三张牌。", + sp_sunshao: "手杀孙邵", + fubi: "辅弼", + fubi2: "辅弼", + fubi_info: "游戏开始时,你可选择一名其他角色。该角色的手牌上限于你死亡前+3。", + zuici: "罪辞", + zuici_info: "当你进入濒死状态时,你可废除你的一个不为空的装备栏,然后将体力值回复至1点。", + sp_xunchen: "手杀荀谌", + jianzhan: "谏战", + jianzhan_info: + "出牌阶段限一次,你可选择一名其他角色A和其攻击范围内的另一名手牌数小于其的角色B。A选择一项:①视为对B使用一张【杀】。②令你摸一张牌。", + duoji: "夺冀", + duoji_info: + "限定技,出牌阶段,你可弃置两张手牌并选择一名装备区有牌的其他角色。你获得其装备区里的所有牌。", + binglinchengxiax: "兵临城下", + binglinchengxiax_info: + "出牌阶段,对一名其他角色使用。你亮出牌堆顶的四张牌,依次对其使用其中所有的【杀】,然后将剩余的牌置于牌堆顶。", + mjweipo: "危迫", + mjweipo_effect: "危迫", + mjweipo_remove: "危迫", + mjweipo_info: + "出牌阶段限一次。你可以选择一个智囊或【兵临城下】,令一名没有〖危迫〗效果的角色获得如下一次性效果直到你下回合开始:其可于出牌阶段弃置一张【杀】,并获得一张你选择的牌。", + mjchenshi: "陈势", + mjchenshi_player: "陈势", + mjchenshi_target: "陈势", + mjchenshi_info: + "当有角色使用【兵临城下】指定第一个目标后,其可交给你一张牌,并将牌堆的顶三张牌中所有不为【杀】的牌置入弃牌堆;当有角色成为【兵临城下】的目标后,其可交给你一张牌,然后将牌堆顶三张牌中所有的【杀】置入弃牌堆。", + mjmouzhi: "谋识", + mjmouzhi_info: + "锁定技,当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害花色相同,则你防止此伤害。", + luotong: "手杀骆统", + qinzheng: "勤政", + qinzheng_info: + "锁定技,当你使用或打出牌时,若你本局游戏内使用或打出过的牌数和:为3的倍数,你从牌堆中获得一张【杀】或【闪】;为5的倍数,你从牌堆中获得一张【桃】或【酒】;为8的倍数,你从牌堆中获得一张【决斗】或【无中生有】(可获得对应的衍生替换牌)。", + sp_duyu: "手杀杜预", + spwuku: "武库", + spwuku_info: "锁定技,当有角色使用装备牌时,若你的“武库”数小于3,则你获得一个“武库”。", + spwuku_info_guozhan: + "锁定技,当有其他势力的角色使用装备牌时,若你的“武库”数小于2,则你获得一个“武库”。", + spsanchen: "三陈", + spsanchen_info: + "觉醒技,结束阶段,若你的“武库”数大于2,则你加1点体力上限并回复1点体力,然后获得〖灭吴〗。", + spmiewu: "灭吴", + spmiewu2: "灭吴", + spmiewu_backup: "灭吴", + spmiewu_info: + "每回合限一次。你可弃置一枚“武库”并将一张牌当做任意基本牌或锦囊牌使用,然后摸一张牌。", + sp_bianfuren: "手杀卞夫人", + spwanwei: "挽危", + spwanwei_info: + "每轮累计限一次。①出牌阶段,你可选择一名其他角色。②当有其他角色处于濒死状态时。你可令该角色回复X+1点体力(至少回复至1),然后你失去X点体力。(X为你的体力值)", + spyuejian: "约俭", + spyuejian_info: + "锁定技,你的手牌上限基数等于你的体力上限。当你处于濒死状态时,你可弃置两张牌,然后回复1点体力。", + feiyi: "手杀费祎", + feiyi_prefix: "手杀", + reshengxi: "生息", + reshengxi_info: "结束阶段,若你于本回合内未造成过伤害,则你可摸两张牌。", + fyjianyu: "谏喻", + fyjianyu_info: + "每轮限一次。出牌阶段,你可选择两名角色,令这些角色获得“喻”直到你的下回合开始。当一名有“喻”的角色A使用牌指定另一名有“喻”的角色B为目标时,你令B摸一张牌。", + mjshengxi: "生息", + mjshengxi_info: + "准备阶段,你可以获得一张【调剂盐梅】;结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊或摸一张牌。", + mjkuanji: "宽济", + mjkuanji_info: + "每回合限一次。当你因弃置而失去牌后,你可令一名其他角色获得其中的一张牌,然后你摸一张牌。", + tiaojiyanmei: "调剂盐梅", + tiaojiyanmei_info: + "出牌阶段,对两名手牌数不均相同的其他角色使用。若目标角色于此牌使用准备工作结束时的手牌数大于此时所有目标的平均手牌数,其弃置一张牌。若小于则其摸一张牌。此牌使用结束后,若所有目标角色的手牌数均相等,则你可令一名角色获得所有因执行此牌效果而弃置的牌。", + refubi: "辅弼", + refubi_info: + "游戏开始时,你可令一名其他角色获得“辅弼”标记。有“辅弼”标记的角色的准备阶段开始时,你可选择一项:①令其本回合使用【杀】的次数上限+1。②令其本回合的手牌上限+3。", + rezuici: "罪辞", + rezuici_backup: "罪辞", + rezuici_info: + "出牌阶段,或当你处于濒死状态时,你可以废除一个有牌的装备栏并回复2点体力,然后可以移动“辅弼”标记。", + mjdingyi: "定仪", + mjdingyi_info: + "游戏开始时,你选择一个效果(相同效果不可叠加)并令全场角色获得之:①摸牌阶段额定摸牌数+1。②手牌上限+2。③攻击范围+1。④脱离濒死状态时回复1点体力。", + mjzuici: "罪辞", + mjzuici_info: + "当你受到伤害后,你可令伤害来源失去〖定仪〗效果,然后令其从牌堆中获得一张由你选择的智囊。", + mjfubi: "辅弼", + mjfubi_info: + "每轮限一次。出牌阶段,你可选择一项:①更换一名角色的〖定仪〗效果。②弃置一张牌并令一名角色的〖定仪〗效果翻倍直到你的下回合开始。", + wujing: "吴景", + heji: "合击", + heji_info: + "当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。", + liubing: "流兵", + liubing_info: + "锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。", + sp_mifuren: "手杀糜夫人", + spcunsi: "存嗣", + spcunsi2: "存嗣", + spcunsi_info: + "出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张杀的伤害值基数+1。", + spguixiu: "闺秀", + spguixiu_info: + "锁定技,当你受到伤害后,若你的武将牌背面朝上,则你将武将牌翻至正面。当你的武将牌从背面翻至正面时,你摸一张牌。", + qingyu: "清玉", + qingyu_info: + "使命技。①当你受到伤害时,你弃置两张牌,然后防止此伤害。②使命:准备阶段,若你的体力值等于体力上限且你没有手牌,则你获得〖悬存〗。③失败:当你进入濒死状态时,你减1点体力上限。", + xuancun: "悬存", + xuancun_info: + "其他角色的回合结束时,若你的手牌数小于体力值,则你可以令其摸X张牌(X为你的体力值与手牌数之差且至多为2)。", + xinlirang: "礼让", + xinlirang_info: + "①其他角色的摸牌阶段开始时,若你没有“谦”标记,则你可以获得一枚“谦”标记。若如此做,其额定摸牌数+2,且本回合的弃牌阶段开始时,你可以获得其弃置的至多两张牌。②摸牌阶段开始时,若你有“谦”标记,则你跳过此摸牌阶段并移除“谦”标记。", + xinmingshi: "名仕", + xinmingshi_info: + "锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。", + sp_xinpi: "手杀辛毗", + spyinju: "引裾", + spyinju2: "引裾", + spyinju_info: + "出牌阶段限一次,你可令一名其他角色选择一项:①对你使用一张【杀】(无距离限制)。②其下个回合的准备阶段开始时,跳过出牌阶段和弃牌阶段。", + spchijie: "持节", + spchijie_info: + "每回合限一次。当你成为其他角色使用牌的唯一目标时,你可判定。若结果大于6,则你取消此牌的所有目标。", + reduoji: "夺冀", + reduoji_info: + "出牌阶段限一次,你可将一张牌置于其他角色的武将牌上,称为“冀”。当有装备牌因使用而进入一名角色的装备区后,若该角色有“冀”且其为使用者,则你获得此装备牌,其移去一个“冀”并摸一张牌。一名其他角色的回合结束后,若其有“冀”,则你获得其的所有“冀”。", + wangling: "手杀王淩", + wangling_prefix: "手杀", + mouli: "谋立", + mouli_info: + "出牌阶段限一次,你可以将一张手牌交给一名其他角色,其获得如下效果直到你的下回合开始:其可以将黑色牌当做【杀】,红色牌当做【闪】使用。其第一次触发“使用【杀】/【闪】结算完成后”的时机时,你摸三张牌。", + zifu: "自缚", + zifu_info: "锁定技,当有角色死亡时,若其因你获得的“谋立”效果未过期,则你减2点体力上限。", + xingqi: "星启", + xingqi_info: + "①当你使用牌时,若此牌不为延时锦囊牌且你没有同名的“备”,则你获得一枚与此牌名称相同的“备”。②结束阶段,你可移去一枚“备”,然后从牌堆中获得一张与此“备”名称相同的牌。", + xinzifu: "自缚", + xinzifu_info: + "锁定技。出牌阶段结束时,若你本阶段内未使用牌,则你移去所有“备”且本回合的手牌上限-1。", + mibei: "秘备", + mibei_info: + "使命技。①使命:当你使用的牌结算完成后,若你的“备”中包含的基本牌,锦囊牌,装备牌数量均大于1,则你从牌堆中获得这三种类型的牌各一张并获得技能“谋立”。②失败:结束阶段开始时,若你没有“备”,且你于本回合的准备阶段开始时也没有“备”,则你减1点体力上限。", + xinmouli: "谋立", + xinmouli_info: + "出牌阶段限一次,你可以指定一名其他角色。其移去你的一个“备”,然后从牌堆中获得一张与此“备”名称相同的牌。", + wangfuzhaolei: "王甫赵累", + xunyi: "殉义", + xunyi2: "殉义", + xunyi3: "殉义", + xunyi_info: + "游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的伤害后,你/其弃置一张牌。", + zhouchu: "手杀周处", + xianghai: "乡害", + xianghai_info: "锁定技,其他角色的手牌上限-1。你手牌区的装备牌均视为【酒】。", + chuhai: "除害", + chuhai_info: + "出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。", + rechuhai: "除害", + rechuhai_info: + "使命技。①出牌阶段限一次,你可以摸一张牌,然后和一名其他角色拼点。若你赢,则你观看其手牌,并从牌堆/弃牌堆中获得其手牌中包含的类型的牌各一张,且当你于此阶段内对其造成伤害后,你将牌堆/弃牌堆中的一张装备牌置于你的一个空置装备栏内。②当你因发动〖除害①〗而展示拼点牌时,你令此牌的点数+X(X=(4-你装备区的牌数))。③使命:当有装备牌进入你的装备区后,若你的装备区内有至少三张牌,则你将体力值回复至上限,失去〖乡害〗并获得〖彰名〗。④失败:当你因发动〖除害①〗发起的拼点没赢时,若你的最终点数不大于6,则你触发使命失败分支。", + zhangming: "彰名", + zhangming_info: + "锁定技。①你使用的♣牌不能被其他角色响应。②每回合限一次,当你对其他角色造成伤害后,你随机弃置其一张手牌,然后你从牌堆或弃牌堆中获得与其展示牌类型不同类型的牌各一张(若其没有手牌,则你改为从牌堆或弃牌堆中获得所有类型牌各一张),且以此法得到的牌不计入本回合的手牌上限。", + sp_kongrong: "手杀孔融", + spmingshi: "名士", + spmingshi_info: "锁定技,当你受到1点伤害后,伤害来源弃置一张牌。", + splirang: "礼让", + splirang_info: + "出牌阶段限一次,你可以弃置所有手牌,然后将其中的至多X张牌交给一名其他角色(X为你的体力值),之后摸一张牌。", + caizhenji: "蔡贞姬", + sheyi: "舍裔", + sheyi_info: + "每轮限一次。当有体力值小于你的其他角色受到伤害时,你可以交给其至少X张牌并防止此伤害(X为你的体力值)。", + tianyin: "天音", + tianyin_info: "锁定技,结束阶段开始时,你从牌堆中获得每种本回合未使用过的类型的牌各一张。", + xiangchong: "向宠", + guying: "固营", + guying_info: + "锁定技。每回合限一次,当你于回合外因使用/打出/弃置而失去牌后,若牌数为1,则你获得一枚“固”并令当前回合角色选择一项:①随机交给你一张牌。②令你获得本次失去的牌,若为装备牌,则你使用之。准备阶段开始时,你移去所有“固”并弃置等量的牌。", + muzhen: "睦阵", + muzhen_backup: "睦阵", + muzhen_info: + "出牌阶段各限一次。①你可以将两张牌交给一名装备区内有牌的其他角色,然后获得其装备区内的一张牌。②你可以将装备区内的一张牌置于其他角色的装备区内,然后获得其一张手牌。", + sp_huaxin: "手杀华歆", + hxrenshi: "仁仕", + hxrenshi_info: "出牌阶段每名角色限一次。你可以将一张手牌交给一名其他角色。", + debao: "德保", + debao_info: + "锁定技,当其他角色获得你的牌后,若你的“仁”数小于你的体力上限,则你将牌堆顶的一张牌置于你的武将牌上,称为“仁”。准备阶段,你获得所有“仁”。", + buqi: "不弃", + buqi_info: + "锁定技,当有角色进入濒死状态时,若你的“仁”数大于1,则你移去两张“仁”并令其回复1点体力。一名角色死亡后,你将所有“仁”置入弃牌堆。", + yuanqing: "渊清", + yuanqing_info: + "锁定技,出牌阶段结束时,你随机将弃牌堆中你本阶段使用过的牌类型的各一张牌置于仁库中。", + shuchen: "疏陈", + shuchen_info: + "锁定技,当有角色进入濒死状态时,若仁库中的牌数大于三,则你获得仁库中的所有牌,然后其回复1点体力。", + sp_xujing: "手杀许靖", + boming: "博名", + boming_info: + "出牌阶段限两次,你可以将一张牌交给一名其他角色。结束阶段,若你本回合以此法失去了两张以上的牌,则你摸一张牌。", + ejian: "恶荐", + ejian_info: + "锁定技,每名角色限一次。当有其他角色因〖博名〗而得到了你的牌后,若其拥有与此牌类型相同的其他牌,则你令其选择一项:①受到1点伤害。②展示所有手牌,并弃置所有与此牌类别相同的牌。", + zhangzhongjing: "张机", + jishi: "济世", + jishi_info: + "锁定技。①当你使用的牌结算完成后,若你未因此牌造成过伤害,则你将此牌对应的所有实体牌置于仁库中。②当有牌不因溢出而离开仁库时,你摸一张牌。", + liaoyi: "疗疫", + liaoyi_info: + "其他角色的回合开始时,若其:①手牌数小于体力值且仁库内牌数大于等于X,则你可令其从仁库中获得X张牌;②手牌数大于体力值,则你可以令其将X张牌置于仁库中(X为其手牌数与体力值之差且至多为4)。", + xinliaoyi: "疗疫", + xinliaoyi_info: + "其他角色的回合开始时,你可选择一项:①令其从仁库中获得一张牌。②若其手牌数大于体力值,则令其将X张手牌置入仁库(X为其手牌数与体力值之差)。", + binglun: "病论", + binglun_info: + "出牌阶段限一次,你可以将仁库中的一张牌置于弃牌堆并选择一名角色。该角色选择一项:①摸一张牌。②于其下回合结束时回复1点体力。", + sp_zhangwen: "手杀张温", + gebo: "戈帛", + gebo_info: "锁定技,当有角色回复体力后,你将牌堆顶的一张牌置入仁库。", + spsongshu: "颂蜀", + spsongshu_info: + "其他角色的摸牌阶段开始时,若其体力值大于你且仁库内有牌,则你可以令其放弃摸牌。其改为获得X张仁(X为你的体力值且至多为5),且本回合内不能使用牌指定其他角色为目标。", + liuzhang: "刘璋", + xiusheng: "休生", + xiusheng_info: + "锁定技。准备阶段,你将所有“生”置入弃牌堆,然后摸X张牌,并将等量的牌置于武将牌上,称为“生”(X为你因〖引狼〗而选择的势力的存活角色数)。", + yinlang: "引狼", + yinlang_info: + "①每轮限一次。回合开始时,你选择场上的一个势力。②一名角色的出牌阶段开始时,若其势力与你选择的势力相同,则其选择一项:1.获得你的一张“生”,然后其本回合使用牌时不能指定你以外的角色为目标。2.你获得一张“生”。", + huaibi: "怀璧", + huaibi_info: "主公技,锁定技。你的手牌上限+X(X为你因〖引狼〗而选择的势力的存活角色数)。", + jutu: "据土", + jutu_info: + "锁定技,准备阶段,你获得所有你武将牌上的“生”,然后摸X+1张牌,然后将X张牌置于你的武将牌上,称为“生”(X为你因〖邀虎〗选择势力的角色数量)。", + yaohu: "邀虎", + yaohu_info: + "每轮限一次,你的回合开始时,你须选择场上一个势力。该势力其他角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:①对你指定的另一名的其他角色使用一张【杀】(无距离和次数限制);②交给你两张牌。", + rehuaibi: "怀璧", + rehuaibi_info: "主公技,锁定技,你的手牌上限+X(X为你因〖邀虎〗选择势力的角色数量)。", + qiaogong: "桥公", + yizhu: "遗珠", + yizhu_info: + "①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中(X为角色数,选择牌的牌名对其他角色可见)。②其他角色使用“遗珠”牌指定唯一目标时,你可以取消此目标,然后你清除对应的“遗珠”标记。", + luanchou: "鸾俦", + luanchou_info: + "出牌阶段限一次,你可令两名角色获得“姻”标记并清除原有标记。拥有“姻”标记的角色视为拥有技能〖共患〗。", + gonghuan: "共患", + gonghuan_info: + "锁定技。每回合限一次,一名其他角色受到伤害时,若其拥有“姻”标记且其体力值小于你,则你将伤害转移给自己。此伤害结算结束后,你与其移去“姻”标记。", + sp_yanghu: "手杀羊祜", + mingfa: "明伐", + mingfa_info: + "①结束阶段,你可展示一张牌并记录为“明伐”。②出牌阶段开始时,若“明伐”牌在你的手牌区或装备区,则你可以使用“明伐”牌与一名其他角色拼点。若你赢:你获得对方一张牌并从牌堆中获得一张点数等于“明伐”牌牌面点数-1的牌。若你没赢:你本回合不能使用牌指定其他角色为目标。③你的拼点牌亮出后,你令此牌的点数+2。", + rongbei: "戎备", + rongbei_info: + "限定技。出牌阶段,你可选择一名有空装备栏的角色。系统为该角色的每个空装备栏选择一张装备牌,然后该角色使用之。", + db_wenyang: "手杀文鸯", + dbquedi: "却敌", + dbquedi_info: + "每回合限一次。当你使用【杀】或【决斗】指定唯一目标后,你可选择:①获得目标角色的一张手牌。②弃置一张基本牌,并令此牌的伤害值基数+1。③背水:减1点体力上限,然后依次执行上述所有选项。", + dbzhuifeng: "椎锋", + dbzhuifeng_info: + "魏势力技。每回合限两次,你可以失去1点体力并视为使用一张【决斗】(你死亡后仍然结算)。当你因此【决斗】而受到伤害时,你防止此伤害并令此技能失效直到出牌阶段结束。", + dbchongjian: "冲坚", + dbchongjian_backup: "冲坚", + dbchongjian_info: + "吴势力技。你可以将一张装备牌当做一种【杀】(无距离限制且无视防具)或【酒】使用。当你以此法使用【杀】造成伤害后,你获得目标角色装备区内的X张牌(X为伤害值)。", + dbchoujue: "仇决", + dbchoujue_info: + "锁定技。当你杀死其他角色后,你加1点体力上限并摸两张牌,然后本回合发动【却敌】的次数上限+1。", + sp_chendong: "手杀陈武董袭", + sp_chendong_prefix: "手杀", + spyilie: "毅烈", + spyilie_info: + "出牌阶段开始时,你可选择:①本阶段内使用【杀】的次数上限+1。②本回合内使用【杀】被【闪】抵消时,摸一张牌。③背水:失去1点体力,然后依次执行上述所有选项。", + spfenming: "奋命", + spfenming_info: + "出牌阶段限一次,你可以选择一名体力值不大于你的角色。若其:未横置,其横置;已横置,你获得其一张牌。", + yuanhuan: "袁涣", + qingjue: "请决", + qingjue_info: + "每轮限一次。当有其他角色A使用牌指定另一名体力值小于A且不处于濒死状态的其他角色B为目标时,你可以摸一张牌,然后与A拼点。若你赢,你取消此目标。若你没赢,你将此牌的目标改为自己。", + fengjie: "奉节", + fengjie2: "奉节", + fengjie_info: + "锁定技,准备阶段开始时,你选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸四张)或弃置至与其体力值相等。", + sp_zongyu: "手杀宗预", + zhibian: "直辩", + zhibian_info: + "准备阶段,你可以和一名其他角色拼点。若你赢,你可选择:①将其装备区/判定区内的一张牌移动到你的对应区域。②回复1点体力。③背水:跳过下个摸牌阶段,然后依次执行上述所有选项;若你没赢,你失去1点体力。", + yuyan: "御严", + yuyan_info: + "锁定技。当你成为非转换的【杀】的目标时,若使用者的体力值大于你且此【杀】有点数,则你令使用者选择一项:①交给你一张点数大于此【杀】的牌。②取消此目标。", + sp_wangshuang: "手杀王双", + yiyong: "异勇", + yiyong_info: + "当你受到其他角色造成的渠道为【杀】的伤害后,若你的装备区内有武器牌,则你可以获得此【杀】对应的所有实体牌,然后将这些牌当做【杀】对伤害来源使用(无距离限制)。若其装备区内没有武器牌,则此伤害+1。", + shanxie: "擅械", + shanxie_info: + "①出牌阶段限一次,你可从牌堆中获得一张武器牌。若牌堆中没有武器牌,则你改为随机获得一名角色装备区内的一张武器牌。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。", + shanxie_info_old: + "①出牌阶段限一次,你可选择一项:⒈从牌堆中获得一张武器牌。⒉获得一名其他角色装备区内的一张武器牌并使用,然后其将一张手牌当做【杀】对你使用。②当其他角色使用【闪】响应你使用的【杀】时,若此【闪】没有点数或点数不大于你攻击范围的二倍,则你令此【闪】无效。", + sunyi: "手杀孙翊", + zaoli: "躁厉", + zaoli_info: + "锁定技。①你不能于回合内使用你手牌中不为本回合得到的牌。②当你使用或打出手牌时,你获得一个“厉”(至多4个)。③回合开始时,若你有“厉”,则你移去所有“厉”并弃置任意张牌,然后摸X+Y张牌。若X大于2,你失去1点体力(X为你移去的标记数,Y为你弃置的牌数)。", + sp_gaolan: "手杀高览", + spjungong: "峻攻", + spjungong_info: + "出牌阶段,你可失去X+1点体力或弃置X+1张牌,视为对一名其他角色使用【杀】(不计入次数和距离限制,X为你本回合内发动过〖峻攻〗的次数)。若你因此【杀】造成了伤害,则你令此技能失效直到回合结束。", + spdengli: "等力", + spdengli_info: + "当你使用【杀】指定目标后,或成为【杀】的目标后,若使用者和目标的体力值相等,则你摸一张牌。", + sp_huaman: "手杀花鬘", + spxiangzhen: "象阵", + spxiangzhen_info: + "锁定技。①【南蛮入侵】对你无效。②当有角色使用的【南蛮入侵】结算结束后,若有角色因此牌受到过伤害,则你和使用者各摸一张牌。", + spfangzong: "芳踪", + spfangzong_info: + "锁定技。①你不能于回合内使用具有伤害标签的牌指定攻击范围内的角色为目标。②攻击范围内包含你的角色不能使用具有伤害标签的牌指定你为目标。③结束阶段,你将手牌摸至X张(X为场上存活人数且至多为8)。", + spxizhan: "嬉战", + spxizhan_info: + "其他角色的回合开始时,你须选择一项:①失去1点体力。②弃置一张牌并令〖芳踪〗于本回合失效,然后若此牌的花色为:♠,其视为使用一张【酒】;♥,你视为使用一张【无中生有】;♣,你视为对其使用【铁索连环】;♦:你视为对其使用火【杀】(无距离限制)。", + sp_cuiyan: "手杀崔琰", + spyajun: "雅俊", + spyajun_info: + "①摸牌阶段,你令额定摸牌数+1。②出牌阶段开始时,你可以用一张本回合得到的牌与其他角色拼点。若你赢,则你可将其中一张拼点牌置于牌堆顶。若你没赢,你本回合的手牌上限-1。", + spzundi: "尊嫡", + spzundi_info: + "出牌阶段限一次,你可以弃置一张手牌并选择一名角色,然后你进行判定。若结果为:黑色,其摸三张牌;红色,其可以移动场上的一张牌。", + sp_zhangchangpu: "手杀张昌蒲", + spdifei: "抵诽", + spdifei_info: + "锁定技。每回合限一次,当你受到伤害后,你摸一张牌或弃置一张手牌,然后展示所有手牌。若此伤害的渠道为没有花色的牌或你的手牌中没有与此牌花色相同的牌,则你回复1点体力。", + spyanjiao: "严教", + spyanjiao_info: + "出牌阶段限一次。你可以将手牌中一种花色的所有牌交给一名其他角色,对其造成1点伤害。然后你于自己的下回合开始时摸等量的牌。", + sp_jiangwan: "蒋琬", + spzhenting: "镇庭", + spzhenting_info: + "每回合限一次。当你攻击范围内的角色成为【杀】或延时锦囊的目标时,若你不是此牌的使用者且不是此牌的目标,则你可以将此目标改为自己。然后你选择一项:①弃置使用者的一张手牌。②摸一张牌。", + spjincui: "尽瘁", + spjincui_info: + "限定技。出牌阶段,你可以和一名其他角色交换位置,然后失去X点体力(X为你的体力值)。", + sp_jiangqing: "蒋钦", + spjianyi: "俭衣", + spjianyi_info: + "锁定技。其他角色的回合结束时,若弃牌堆中有于本回合内因弃置而进入弃牌堆的防具牌,则你获得其中一张。", + spshangyi: "尚义", + spshangyi_info: + "出牌阶段限一次。你可以弃置一张牌并选择一名其他角色。其观看你的手牌,然后你观看其手牌并获得其中的一张。", + sp_lvfan: "手杀吕范", + sp_lvfan_prefix: "手杀", + spdiaodu: "调度", + spdiaodu_info: "准备阶段,你可令一名角色摸一张牌,然后移动其装备区内的一张牌。", + spdiancai: "典财", + spdiancai_info: + "其他角色的结束阶段开始时,你可以令至多X名角色各摸一张牌(X为你本回合失去的手牌数)。", + mbdiaodu: "调度", + mbdiaodu_info: "准备阶段,你可以移动一名角色装备区内的一张牌(不能移动给自己),然后其摸一张牌。", + mbdiancai: "典财", + mbdiancai_info: + "其他角色的出牌阶段阶段结束后,若你本阶段失去的牌数不小于你的体力值,则你可将手牌数补至体力上限。", + spyanji: "严纪", + spyanji_info: "出牌阶段开始时,你可以进行“整肃”。", + sp_huangfusong: "手杀皇甫嵩", + spzhengjun: "整军", + spzhengjun_info: + "①出牌阶段开始时,你可进行“整肃”。②当你因整肃而摸牌或回复体力后,你可令一名其他角色摸两张牌或回复1点体力。", + spshiji: "势击", + spshiji_info: + "当你对其他角色造成属性伤害时,若你的手牌数不为全场唯一最多,则你可以观看其手牌。你令其弃置其中的所有红色牌,然后摸等量的牌。", + sptaoluan: "讨乱", + sptaoluan_info: + "每回合限一次。一名角色的判定结果确定时,若结果的花色为♠,则你可以终止导致此判定发生的上级事件。然后选择一项:①获得判定牌对应的实体牌。②视为对判定角色使用一张火【杀】(无距离和次数限制)。", + sp_zhujun: "手杀朱儁", + yangjie: "佯解", + yangjie_info: + "出牌阶段限一次,你可以摸一张牌并和一名其他角色A拼点。当你以此法展示你的拼点牌时,你令此牌点数-X(X为你已损失的体力值)。若你没赢,则你可以令另一名其他角色B获得两张拼点牌,然后其视为对A使用一张火【杀】。", + zjjuxiang: "拒降", + zjjuxiang_info: + "限定技。一名其他角色脱离濒死状态时,你可以对其造成1点伤害,然后摸X张牌(X为其体力上限且至多为5)。", + xinyangjie: "佯解", + xinyangjie_info: + "出牌阶段限一次,你可以与一名其他角色A拼点。若你没赢,则你可以令另一名其他角色B视为对A使用一张火【杀】。", + xinjuxiang: "拒降", + xinjuxiang_info: "限定技,一名其他角色脱离濒死状态时,你可以对其造成1点伤害。", + houfeng: "厚俸", + houfeng_info: + "每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。", + liuba: "手杀刘巴", + duanbi: "锻币", + duanbi_info: + "限定技。出牌阶段,若场上所有角色的手牌数之和大于角色数之和的二倍,则你可以令所有其他角色各弃置X张手牌(X为该角色手牌数的一半且向下取整且至多为3)。然后你可选择一名角色,令其随机获得三张以此法被弃置的牌。", + tongduo: "统度", + tongduo_info: "每回合限一次。当你成为其他角色使用牌的唯一目标后,你可令一名角色重铸一张牌。", - mobile_shijiren:'始计篇·仁', - mobile_shijizhi:'始计篇·智', - mobile_shijixin:'始计篇·信', - mobile_shijiyong:'始计篇·勇', - mobile_shijiyan:'始计篇·严', - } + mobile_shijiren: "始计篇·仁", + mobile_shijizhi: "始计篇·智", + mobile_shijixin: "始计篇·信", + mobile_shijiyong: "始计篇·勇", + mobile_shijiyan: "始计篇·严", + }, }; }); diff --git a/character/sp.js b/character/sp.js index 47e683453..70aebbd91 100755 --- a/character/sp.js +++ b/character/sp.js @@ -1,1370 +1,1957 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'sp', - connect:true, - characterSort:{ - sp:{ - sp_tianji:["sunhao","liuxie","caoang","hetaihou","sunluyu",'ol_wangrong',"zuofen","ol_bianfuren","qinghegongzhu","tengfanglan","ruiji",'caoxiancaohua'], - sp_sibi:['ol_lukai',"yangxiu",'guotu',"chenlin","chengyu","shixie","fuwan","wangyun","zhugejin","simalang","maliang","buzhi","dongyun","kanze","sunqian","xizhicai","sunshao",'duxi',"jianggan",'ol_dengzhi','ol_yangyi','ol_dongzhao','ol_chendeng','jin_yanghu','wangyan','xiahouxuan','quhuang','zhanghua','wangguan','sunhong','caoxi','tianchou'], - sp_tianzhu:['liyi','zhangyan','niujin','hejin','hansui',"wutugu","yanbaihu","shamoke","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda","ahuinan","dongtuna",'ol_wenqin'], - sp_nvshi:['ol_dingshangwan',"lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu',"daxiaoqiao","jin_guohuai",'ol_hujinding'], - sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','zhangzhi','lushi'], - sp_huben:['duanjiong','ol_mengda',"caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","huojun",'zhaoyǎn','dengzhong','ol_furong','macheng','ol_zhangyì','ol_zhujun','maxiumatie','luoxian','ol_huban','haopu','ol_qianzhao'], - sp_liesi:['lvboshe','mizhu','weizi','ol_liuba','zhangshiping'], - sp_default:["sp_diaochan","sp_zhaoyun","sp_sunshangxiang","sp_caoren","sp_jiangwei","sp_machao","sp_caiwenji","jsp_guanyu","jsp_huangyueying","sp_pangde","sp_jiaxu","yuanshu",'sp_zhangliao','sp_ol_zhanghe','sp_menghuo'], - sp_qifu:['ol_feiyi',"caoying",'panshu',"caochun","yuantanyuanshang",'caoshuang','wolongfengchu','guansuo','baosanniang','fengfangnv','jin_zhouchu'], - sp_wanglang:['ol_wanglang','ol_puyuan','ol_zhouqun'], - sp_zhongdan:["cuiyan","huangfusong"], - sp_guozhan2:["sp_dongzhuo","liqueguosi","zhangren"], - sp_others:["hanba","caiyang"], - sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_liwan','ol_liuyan','caoyu','liupan','ol_liupi'], + name: "sp", + connect: true, + characterSort: { + sp: { + sp_tianji: [ + "sunhao", + "liuxie", + "caoang", + "hetaihou", + "sunluyu", + "ol_wangrong", + "zuofen", + "ol_bianfuren", + "qinghegongzhu", + "tengfanglan", + "ruiji", + "caoxiancaohua", + ], + sp_sibi: [ + "ol_lukai", + "yangxiu", + "guotu", + "chenlin", + "chengyu", + "shixie", + "fuwan", + "wangyun", + "zhugejin", + "simalang", + "maliang", + "buzhi", + "dongyun", + "kanze", + "sunqian", + "xizhicai", + "sunshao", + "duxi", + "jianggan", + "ol_dengzhi", + "ol_yangyi", + "ol_dongzhao", + "ol_chendeng", + "jin_yanghu", + "wangyan", + "xiahouxuan", + "quhuang", + "zhanghua", + "wangguan", + "sunhong", + "caoxi", + "tianchou", + ], + sp_tianzhu: [ + "liyi", + "zhangyan", + "niujin", + "hejin", + "hansui", + "wutugu", + "yanbaihu", + "shamoke", + "zhugedan", + "huangzu", + "gaogan", + "tadun", + "fanjiangzhangda", + "ahuinan", + "dongtuna", + "ol_wenqin", + ], + sp_nvshi: [ + "ol_dingshangwan", + "lingju", + "guanyinping", + "zhangxingcai", + "mayunlu", + "dongbai", + "zhaoxiang", + "ol_zhangchangpu", + "daxiaoqiao", + "jin_guohuai", + "ol_hujinding", + ], + sp_shaowei: [ + "simahui", + "zhangbao", + "zhanglu", + "zhugeguo", + "xujing", + "zhangling", + "huangchengyan", + "zhangzhi", + "lushi", + ], + sp_huben: [ + "duanjiong", + "ol_mengda", + "caohong", + "xiahouba", + "zhugeke", + "zumao", + "wenpin", + "litong", + "mazhong", + "heqi", + "quyi", + "luzhi", + "yuejin", + "dingfeng", + "wuyan", + "ol_zhuling", + "tianyu", + "huojun", + "zhaoyǎn", + "dengzhong", + "ol_furong", + "macheng", + "ol_zhangyì", + "ol_zhujun", + "maxiumatie", + "luoxian", + "ol_huban", + "haopu", + "ol_qianzhao", + ], + sp_liesi: ["lvboshe", "mizhu", "weizi", "ol_liuba", "zhangshiping"], + sp_default: [ + "sp_diaochan", + "sp_zhaoyun", + "sp_sunshangxiang", + "sp_caoren", + "sp_jiangwei", + "sp_machao", + "sp_caiwenji", + "jsp_guanyu", + "jsp_huangyueying", + "sp_pangde", + "sp_jiaxu", + "yuanshu", + "sp_zhangliao", + "sp_ol_zhanghe", + "sp_menghuo", + ], + sp_qifu: [ + "ol_feiyi", + "caoying", + "panshu", + "caochun", + "yuantanyuanshang", + "caoshuang", + "wolongfengchu", + "guansuo", + "baosanniang", + "fengfangnv", + "jin_zhouchu", + ], + sp_wanglang: ["ol_wanglang", "ol_puyuan", "ol_zhouqun"], + sp_zhongdan: ["cuiyan", "huangfusong"], + sp_guozhan2: ["sp_dongzhuo", "liqueguosi", "zhangren"], + sp_others: ["hanba", "caiyang"], + sp_waitforsort: [ + "ol_luyusheng", + "ol_pengyang", + "ol_tw_zhangji", + "ol_liwan", + "ol_liuyan", + "caoyu", + "liupan", + "ol_liupi", + ], }, }, - characterFilter:{ - tianyu:function(mode){ - return mode!='chess'&&mode!='tafang'&&mode!='stone'; + characterFilter: { + tianyu: function (mode) { + return mode != "chess" && mode != "tafang" && mode != "stone"; }, - ol_dongzhao:function(mode){ - return mode=='identity'&&['normal','zhong'].includes(_status.mode); + ol_dongzhao: function (mode) { + return mode == "identity" && ["normal", "zhong"].includes(_status.mode); }, }, - character:{ - ol_liupi:['male','qun',4,['olyicheng']], - ol_lukai:['male','wu',3,['olxuanzhu','oljiane']], - liupan:['male','qun',4,['olpijing']], - guotu:['male','qun',3,['olqushi','olweijie']], - ol_hujinding:['female','shu',3,['olqingyuan','olchongshen']], - tianchou:['male','qun',4,['olshandao']], - liyi:['male','wu',4,['olchanshuang','olzhanjin']], - caoyu:['male','wei',3,['olgongjie','olxiangxv','olxiangzuo']], - ol_liwan:['female','wei',3,['ollianju','olsilv']], - ol_dingshangwan:['female','wei',3,['olfudao','olfengyan']], - zhangyan:['male','qun',4,['olsuji','ollangdao']], - ol_tw_zhangji:['male','wei',3,['skill_zhangji_A','skill_zhangji_B'],['unseen']], - ol_feiyi:['male','shu',3,['yanru','hezhong']], - lvboshe:['male','qun',4,['olfushi','oldongdao']], - ol_luyusheng:['female','wu',3,['olcangxin','olrunwei']], - caoxi:['male','wei',3,['olgangshu','oljianxuan']], - ol_pengyang:['male','shu',3,['olxiaofan','oltuishi','nzry_cunmu']], - ol_qianzhao:['male','wei',4,['olweifu','olkuansai']], - niujin:['male','wei',4,['olcuorui','liewei']], - hejin:['male','qun',4,['mouzhu','olyanhuo']], - hansui:['male','qun',4,['olniluan','olxiaoxi']], - duanjiong:['male','qun',4,['olsaogu']], - ol_zhouqun:['male','shu',4,['oltianhou','olchenshuo']], - ol_wenqin:['male','wei',4,['olguangao','olhuiqi']], - haopu:['male','shu',4,['olzhenying']], - ol_mengda:['male','shu',4,['olgoude']], - ol_wanglang:['male','wei',3,['gushe','oljici']], - ol_liuyan:['male','qun','4/6',['olpianan','olyinji','olkuisi']], - lushi:['female','qun',3,['olzhuyan','releijie']], - zhangshiping:['male','shu',3,['olhongji','olxinggu']], - sunhong:['male','wu',3,['olxianbi','olzenrun']], - luoxian:['male','shu',4,['oldaili']], - ol_huban:['male','wei',4,['olhuiyun']], - wangguan:['male','wei',3,['olmiuyan','olshilu']], - ol_zhangyì:['male','shu',4,['oldianjun','olkangrui']], - ol_zhujun:['male','qun',4,['olcuipo']], - maxiumatie:['male','qun',4,['mashu','rekenshang']], - dongtuna:['male','qun',4,['oljianman']], - zhanghua:['male','jin',3,['olbihun','oljianhe','olchuanwu']], - quhuang:['male','wu',3,['olqiejian','olnishou']], - macheng:['male','shu',4,['mashu','olchenglie']], - zhangzhi:['male','qun',3,['olbixin','olximo']], - ol_liuba:['male','shu',3,['oltongduo','olzhubi']], - ol_furong:['male','shu',4,['olxiaosi']], - ahuinan:['male','qun',4,['jueman']], - jin_guohuai:['female','jin',3,['zhefu','yidu']], - xiahouxuan:['male','wei',3,['olhuanfu','olqingyi','olzeyue']], - dengzhong:['male','wei',4,['dzkanpo','dzgengzhan']], - wangyan:['male','jin',3,['yangkuang','cihuang','sanku']], - huojun:['male','shu',4,['qiongshou','fenrui']], - caoxiancaohua:['female','qun',3,['huamu','qianmeng','liangyuan','jisi']], - jin_zhouchu:['male','jin',4,['shanduan','yilie']], - zhaoyǎn:['male','wei',4,['tongxie']], - ol_puyuan:['male','shu',4,['olshengong','olqisi']], - ruiji:['female','wu',3,['qiaoli','qingliang']], - weizi:['male','qun',3,['yuanzi','liejie']], - tengfanglan:['female','wu',3,['luochong','aichen']], - sp_menghuo:['male','qun',4,['spmanwang']], - jin_yanghu:['male','jin',4,['huaiyuan','chongxin','dezhang']], - qinghegongzhu:['female','wei',3,['zengou','qhzhangji']], - fanjiangzhangda:['male','wu',4,['yuanchou','juesheng']], - tianyu:['male','wei',4,['saodi','zhuitao']], - ol_chendeng:['male','qun',4,['olfengji']], - ol_zhuling:['male','wei',4,['jixian']], - wuyan:['male','wu',4,['lanjiang']], - sp_ol_zhanghe:['male','qun',4,['spolzhouxuan']], - ol_dongzhao:['male','wei',3,['olxianlve','olzaowang']], - fengfangnv:['female','qun',3,['zhuangshu','chuiti']], - ol_yangyi:['male','shu',3,['oljuanxia','oldingcuo']], - zuofen:['female','jin',3,['zhaosong','lisi']], - ol_wangrong:['female','qun',3,['olfengzi','oljizhan','olfusong']], - ol_dengzhi:['male','shu',3,['olxiuhao','olsujian']], - ol_bianfuren:['female','wei',3,['fuwei','yuejian']], - duxi:['male','wei',3,['quxi','bixiong']], - gaogan:['male','qun',4,['juguan']], - huangchengyan:['male','qun',3,['guanxu','yashi']], - huangzu:['male','qun',4,['wangong']], - panshu:['female','wu',3,['weiyi','jinzhi']], - wolongfengchu:['male','shu',4,['youlong','luanfeng']], - sp_zhangliao:['male','qun',4,['mubing','ziqu','diaoling']], - caoshuang:['male','wei',4,['retuogu','shanzhuan']], - ol_zhangchangpu:['female','wei',3,['yanjiao','olxingshen']], - zhangling:['male','qun',3,['zlhuji','zlshoufu']], - caiyang:['male','qun',1,['yinka','zhuixi'],['forbidai','unseen']], - sunshao:['male','wu',3,['bizheng','yidian']], + character: { + ol_liupi: ["male", "qun", 4, ["olyicheng"]], + ol_lukai: ["male", "wu", 3, ["olxuanzhu", "oljiane"]], + liupan: ["male", "qun", 4, ["olpijing"]], + guotu: ["male", "qun", 3, ["olqushi", "olweijie"]], + ol_hujinding: ["female", "shu", 3, ["olqingyuan", "olchongshen"]], + tianchou: ["male", "qun", 4, ["olshandao"]], + liyi: ["male", "wu", 4, ["olchanshuang", "olzhanjin"]], + caoyu: ["male", "wei", 3, ["olgongjie", "olxiangxv", "olxiangzuo"]], + ol_liwan: ["female", "wei", 3, ["ollianju", "olsilv"]], + ol_dingshangwan: ["female", "wei", 3, ["olfudao", "olfengyan"]], + zhangyan: ["male", "qun", 4, ["olsuji", "ollangdao"]], + ol_tw_zhangji: ["male", "wei", 3, ["skill_zhangji_A", "skill_zhangji_B"], ["unseen"]], + ol_feiyi: ["male", "shu", 3, ["yanru", "hezhong"]], + lvboshe: ["male", "qun", 4, ["olfushi", "oldongdao"]], + ol_luyusheng: ["female", "wu", 3, ["olcangxin", "olrunwei"]], + caoxi: ["male", "wei", 3, ["olgangshu", "oljianxuan"]], + ol_pengyang: ["male", "shu", 3, ["olxiaofan", "oltuishi", "nzry_cunmu"]], + ol_qianzhao: ["male", "wei", 4, ["olweifu", "olkuansai"]], + niujin: ["male", "wei", 4, ["olcuorui", "liewei"]], + hejin: ["male", "qun", 4, ["mouzhu", "olyanhuo"]], + hansui: ["male", "qun", 4, ["olniluan", "olxiaoxi"]], + duanjiong: ["male", "qun", 4, ["olsaogu"]], + ol_zhouqun: ["male", "shu", 4, ["oltianhou", "olchenshuo"]], + ol_wenqin: ["male", "wei", 4, ["olguangao", "olhuiqi"]], + haopu: ["male", "shu", 4, ["olzhenying"]], + ol_mengda: ["male", "shu", 4, ["olgoude"]], + ol_wanglang: ["male", "wei", 3, ["gushe", "oljici"]], + ol_liuyan: ["male", "qun", "4/6", ["olpianan", "olyinji", "olkuisi"]], + lushi: ["female", "qun", 3, ["olzhuyan", "releijie"]], + zhangshiping: ["male", "shu", 3, ["olhongji", "olxinggu"]], + sunhong: ["male", "wu", 3, ["olxianbi", "olzenrun"]], + luoxian: ["male", "shu", 4, ["oldaili"]], + ol_huban: ["male", "wei", 4, ["olhuiyun"]], + wangguan: ["male", "wei", 3, ["olmiuyan", "olshilu"]], + ol_zhangyì: ["male", "shu", 4, ["oldianjun", "olkangrui"]], + ol_zhujun: ["male", "qun", 4, ["olcuipo"]], + maxiumatie: ["male", "qun", 4, ["mashu", "rekenshang"]], + dongtuna: ["male", "qun", 4, ["oljianman"]], + zhanghua: ["male", "jin", 3, ["olbihun", "oljianhe", "olchuanwu"]], + quhuang: ["male", "wu", 3, ["olqiejian", "olnishou"]], + macheng: ["male", "shu", 4, ["mashu", "olchenglie"]], + zhangzhi: ["male", "qun", 3, ["olbixin", "olximo"]], + ol_liuba: ["male", "shu", 3, ["oltongduo", "olzhubi"]], + ol_furong: ["male", "shu", 4, ["olxiaosi"]], + ahuinan: ["male", "qun", 4, ["jueman"]], + jin_guohuai: ["female", "jin", 3, ["zhefu", "yidu"]], + xiahouxuan: ["male", "wei", 3, ["olhuanfu", "olqingyi", "olzeyue"]], + dengzhong: ["male", "wei", 4, ["dzkanpo", "dzgengzhan"]], + wangyan: ["male", "jin", 3, ["yangkuang", "cihuang", "sanku"]], + huojun: ["male", "shu", 4, ["qiongshou", "fenrui"]], + caoxiancaohua: ["female", "qun", 3, ["huamu", "qianmeng", "liangyuan", "jisi"]], + jin_zhouchu: ["male", "jin", 4, ["shanduan", "yilie"]], + zhaoyǎn: ["male", "wei", 4, ["tongxie"]], + ol_puyuan: ["male", "shu", 4, ["olshengong", "olqisi"]], + ruiji: ["female", "wu", 3, ["qiaoli", "qingliang"]], + weizi: ["male", "qun", 3, ["yuanzi", "liejie"]], + tengfanglan: ["female", "wu", 3, ["luochong", "aichen"]], + sp_menghuo: ["male", "qun", 4, ["spmanwang"]], + jin_yanghu: ["male", "jin", 4, ["huaiyuan", "chongxin", "dezhang"]], + qinghegongzhu: ["female", "wei", 3, ["zengou", "qhzhangji"]], + fanjiangzhangda: ["male", "wu", 4, ["yuanchou", "juesheng"]], + tianyu: ["male", "wei", 4, ["saodi", "zhuitao"]], + ol_chendeng: ["male", "qun", 4, ["olfengji"]], + ol_zhuling: ["male", "wei", 4, ["jixian"]], + wuyan: ["male", "wu", 4, ["lanjiang"]], + sp_ol_zhanghe: ["male", "qun", 4, ["spolzhouxuan"]], + ol_dongzhao: ["male", "wei", 3, ["olxianlve", "olzaowang"]], + fengfangnv: ["female", "qun", 3, ["zhuangshu", "chuiti"]], + ol_yangyi: ["male", "shu", 3, ["oljuanxia", "oldingcuo"]], + zuofen: ["female", "jin", 3, ["zhaosong", "lisi"]], + ol_wangrong: ["female", "qun", 3, ["olfengzi", "oljizhan", "olfusong"]], + ol_dengzhi: ["male", "shu", 3, ["olxiuhao", "olsujian"]], + ol_bianfuren: ["female", "wei", 3, ["fuwei", "yuejian"]], + duxi: ["male", "wei", 3, ["quxi", "bixiong"]], + gaogan: ["male", "qun", 4, ["juguan"]], + huangchengyan: ["male", "qun", 3, ["guanxu", "yashi"]], + huangzu: ["male", "qun", 4, ["wangong"]], + panshu: ["female", "wu", 3, ["weiyi", "jinzhi"]], + wolongfengchu: ["male", "shu", 4, ["youlong", "luanfeng"]], + sp_zhangliao: ["male", "qun", 4, ["mubing", "ziqu", "diaoling"]], + caoshuang: ["male", "wei", 4, ["retuogu", "shanzhuan"]], + ol_zhangchangpu: ["female", "wei", 3, ["yanjiao", "olxingshen"]], + zhangling: ["male", "qun", 3, ["zlhuji", "zlshoufu"]], + caiyang: ["male", "qun", 1, ["yinka", "zhuixi"], ["forbidai", "unseen"]], + sunshao: ["male", "wu", 3, ["bizheng", "yidian"]], - huangfusong:['male','qun',4,['fenyue']], - yuantanyuanshang:['male','qun',4,['neifa']], - xujing:['male','shu',3,['yuxu','xjshijian']], + huangfusong: ["male", "qun", 4, ["fenyue"]], + yuantanyuanshang: ["male", "qun", 4, ["neifa"]], + xujing: ["male", "shu", 3, ["yuxu", "xjshijian"]], - jianggan:["male","wei",3,["weicheng","daoshu"]], + jianggan: ["male", "wei", 3, ["weicheng", "daoshu"]], - caoying:["female","wei",4,["xinfu_lingren","fujian"],[]], - simahui:["male","qun",3,["jianjie","xinfu_chenghao","xinfu_yinshi"],[]], - baosanniang:["female","shu",4,["olwuniang","olxushen"],[]], + caoying: ["female", "wei", 4, ["xinfu_lingren", "fujian"], []], + simahui: ["male", "qun", 3, ["jianjie", "xinfu_chenghao", "xinfu_yinshi"], []], + baosanniang: ["female", "shu", 4, ["olwuniang", "olxushen"], []], - yangxiu:['male','wei',3,['jilei','danlao']], - chenlin:['male','wei',3,['bifa','songci']], - caohong:['male','wei',4,['yuanhu']], - xiahouba:['male','shu',4,['baobian']], - yuanshu:['male','qun',4,['yongsi','weidi']], - sp_diaochan:['female','qun',3,['lihun','rebiyue']], - sp_zhaoyun:['male','qun',3,['ollongdan','chongzhen']], - liuxie:['male','qun',3,['tianming','mizhao','twzhuiting'],['zhu']], - zhugejin:['male','wu',3,['olhuanshi','olhongyuan','olmingzhe']], - zhugeke:['male','wu',3,['aocai','duwu']], - guanyinping:['female','shu',3,['huxiao','xueji','wuji']], - simalang:['male','wei',3,['junbing','quji']], - zhangxingcai:['female','shu',3,['shenxian','qiangwu']], - fuwan:['male','qun',4,['dcmoukui']], - sp_sunshangxiang:['female','shu',3,['liangzhu','fanxiang']], - caoang:['male','wei',4,['kaikang']], - sp_caoren:['male','wei',4,['weikui','lizhan']], - zhangbao:['male','qun',3,['rezhoufu','reyingbing']], - maliang:['male','shu',3,['zishu','yingyuan']], - zhugedan:['male','wei',4,['gongao','juyi']], - sp_jiangwei:['male','wei',4,['kunfen','fengliang']], - sp_machao:['male','qun',4,['olzhuiji','ol_shichou']], - sunhao:['male','wu',5,['recanshi','rechouhai','guiming'],['zhu']], - shixie:['male','qun',3,['olbiluan','relixia']], - mayunlu:['female','shu',4,['fengpo','mashu']], - zhanglu:['male','qun',3,['yishe','bushi','midao','twshijun'],['zhu']], - wutugu:['male','qun',15,['ranshang','hanyong']], - sp_caiwenji:['female','wei',3,['chenqing','mozhi']], - zhugeguo:['female','shu',3,['qirang','yuhua']], + yangxiu: ["male", "wei", 3, ["jilei", "danlao"]], + chenlin: ["male", "wei", 3, ["bifa", "songci"]], + caohong: ["male", "wei", 4, ["yuanhu"]], + xiahouba: ["male", "shu", 4, ["baobian"]], + yuanshu: ["male", "qun", 4, ["yongsi", "weidi"]], + sp_diaochan: ["female", "qun", 3, ["lihun", "rebiyue"]], + sp_zhaoyun: ["male", "qun", 3, ["ollongdan", "chongzhen"]], + liuxie: ["male", "qun", 3, ["tianming", "mizhao", "twzhuiting"], ["zhu"]], + zhugejin: ["male", "wu", 3, ["olhuanshi", "olhongyuan", "olmingzhe"]], + zhugeke: ["male", "wu", 3, ["aocai", "duwu"]], + guanyinping: ["female", "shu", 3, ["huxiao", "xueji", "wuji"]], + simalang: ["male", "wei", 3, ["junbing", "quji"]], + zhangxingcai: ["female", "shu", 3, ["shenxian", "qiangwu"]], + fuwan: ["male", "qun", 4, ["dcmoukui"]], + sp_sunshangxiang: ["female", "shu", 3, ["liangzhu", "fanxiang"]], + caoang: ["male", "wei", 4, ["kaikang"]], + sp_caoren: ["male", "wei", 4, ["weikui", "lizhan"]], + zhangbao: ["male", "qun", 3, ["rezhoufu", "reyingbing"]], + maliang: ["male", "shu", 3, ["zishu", "yingyuan"]], + zhugedan: ["male", "wei", 4, ["gongao", "juyi"]], + sp_jiangwei: ["male", "wei", 4, ["kunfen", "fengliang"]], + sp_machao: ["male", "qun", 4, ["olzhuiji", "ol_shichou"]], + sunhao: ["male", "wu", 5, ["recanshi", "rechouhai", "guiming"], ["zhu"]], + shixie: ["male", "qun", 3, ["olbiluan", "relixia"]], + mayunlu: ["female", "shu", 4, ["fengpo", "mashu"]], + zhanglu: ["male", "qun", 3, ["yishe", "bushi", "midao", "twshijun"], ["zhu"]], + wutugu: ["male", "qun", 15, ["ranshang", "hanyong"]], + sp_caiwenji: ["female", "wei", 3, ["chenqing", "mozhi"]], + zhugeguo: ["female", "shu", 3, ["qirang", "yuhua"]], - lingju:['female','qun',3,['jieyuan','fenxin']], + lingju: ["female", "qun", 3, ["jieyuan", "fenxin"]], - cuiyan:['male','wei',3,['yawang','xunzhi']], - jsp_guanyu:['male','wei',4,['new_rewusheng','danji']], - jsp_huangyueying:['female','qun',3,['jiqiao','linglong']], - sunluyu:['female','wu',3,['new_meibu','new_mumu']], - hanba:['female','qun',4,['fentian','zhiri']], - zumao:['male','wu',4,['yinbing','juedi']], - wenpin:['male','wei',4,['zhenwei']], - daxiaoqiao:['female','wu',3,['new_xingwu','new_luoyan']], + cuiyan: ["male", "wei", 3, ["yawang", "xunzhi"]], + jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "danji"]], + jsp_huangyueying: ["female", "qun", 3, ["jiqiao", "linglong"]], + sunluyu: ["female", "wu", 3, ["new_meibu", "new_mumu"]], + hanba: ["female", "qun", 4, ["fentian", "zhiri"]], + zumao: ["male", "wu", 4, ["yinbing", "juedi"]], + wenpin: ["male", "wei", 4, ["zhenwei"]], + daxiaoqiao: ["female", "wu", 3, ["new_xingwu", "new_luoyan"]], - guansuo:['male','shu',4,['zhengnan','xiefang']], - tadun:['male','qun',4,['reluanzhan']], - yanbaihu:['male','qun',4,['zhidao','jili']], - chengyu:['male','wei',3,['shefu','benyu']], + guansuo: ["male", "shu", 4, ["zhengnan", "xiefang"]], + tadun: ["male", "qun", 4, ["reluanzhan"]], + yanbaihu: ["male", "qun", 4, ["zhidao", "jili"]], + chengyu: ["male", "wei", 3, ["shefu", "benyu"]], - sp_pangde:['male','wei',4,['mashu','juesi']], - sp_jiaxu:['male','wei',3,['zhenlue','jianshu','yongdi']], + sp_pangde: ["male", "wei", 4, ["mashu", "juesi"]], + sp_jiaxu: ["male", "wei", 3, ["zhenlue", "jianshu", "yongdi"]], - litong:['male','wei',4,['tuifeng']], - mizhu:['male','shu',3,['ziyuan','jugu']], - buzhi:['male','wu',3,['hongde','dingpan']], + litong: ["male", "wei", 4, ["tuifeng"]], + mizhu: ["male", "shu", 3, ["ziyuan", "jugu"]], + buzhi: ["male", "wu", 3, ["hongde", "dingpan"]], - caochun:['male','wei',4,['xinshanjia']], + caochun: ["male", "wei", 4, ["xinshanjia"]], - dongbai:['female','qun',3,['lianzhu','xiehui']], + dongbai: ["female", "qun", 3, ["lianzhu", "xiehui"]], - zhaoxiang:['female','shu',4,['fanghun','fuhan']], - mazhong:['male','shu',4,['fuman']], - dongyun:['male','shu',3,['bingzheng','sheyan']], - kanze:['male','wu',3,['xiashu','kuanshi']], - heqi:['male','wu',4,['olqizhou','olshanxi']], + zhaoxiang: ["female", "shu", 4, ["fanghun", "fuhan"]], + mazhong: ["male", "shu", 4, ["fuman"]], + dongyun: ["male", "shu", 3, ["bingzheng", "sheyan"]], + kanze: ["male", "wu", 3, ["xiashu", "kuanshi"]], + heqi: ["male", "wu", 4, ["olqizhou", "olshanxi"]], - yuejin:['male','wei',4,['xiaoguo']], - sp_dongzhuo:['male','qun',5,['hengzheng']], - hetaihou:['female','qun',3,['zhendu','qiluan']], - dingfeng:['male','wu',4,['reduanbing','refenxun']], - shamoke:['male','shu',4,['gzjili']], + yuejin: ["male", "wei", 4, ["xiaoguo"]], + sp_dongzhuo: ["male", "qun", 5, ["hengzheng"]], + hetaihou: ["female", "qun", 3, ["zhendu", "qiluan"]], + dingfeng: ["male", "wu", 4, ["reduanbing", "refenxun"]], + shamoke: ["male", "shu", 4, ["gzjili"]], - zhangren:['male','qun',4,['chuanxin','zfengshi']], + zhangren: ["male", "qun", 4, ["chuanxin", "zfengshi"]], - wangyun:['male','qun',4,['xinlianji','xinmoucheng'],['clan:太原王氏']], - sunqian:['male','shu',3,['qianya','shuimeng']], - xizhicai:['male','wei',3,['tiandu','xianfu','chouce']], - quyi:['male','qun',4,['fuqi','jiaozi']], + wangyun: ["male", "qun", 4, ["xinlianji", "xinmoucheng"], ["clan:太原王氏"]], + sunqian: ["male", "shu", 3, ["qianya", "shuimeng"]], + xizhicai: ["male", "wei", 3, ["tiandu", "xianfu", "chouce"]], + quyi: ["male", "qun", 4, ["fuqi", "jiaozi"]], - luzhi:['male','wei',3,['qingzhong','weijing']] + luzhi: ["male", "wei", 3, ["qingzhong", "weijing"]], }, - characterIntro:{ - liupan:'刘磐(生卒年不详),山阳高平人,荆州牧刘表从子。与南阳人黄忠共守长沙攸县。为人骁勇,数次为寇于艾、西安诸县。江东孙策于是分海昏、建昌为左右六县,以东莱太史慈为建昌都尉,治海昏,并督诸将共拒刘磐。于是刘磐绝迹不复为寇。', - guotu:'郭图(?-205年),字公则,颍川(治今河南省禹州市)人。东汉末年袁绍帐下谋士。韩馥统冀州时,郭图与荀谌等人奉袁绍之命,说服韩馥让位。袁绍统一河北后,郭图与审配等人力劝袁绍统率大军攻打曹操。袁绍死后,袁尚继位。郭图与辛评为袁谭效力,挑唆袁谭攻击袁尚。建安十年(205年),郭图和袁谭一同被曹操所杀。', - tianchou:'田畴(169年或170年-214年或216年),字子泰,东汉右北平郡无终人,东汉末年隐士。田畴好文习武。汉初平年间,其受刘虞派遣去长安,呈送指控公孙赞奏章,献帝大悦,封为骑都尉,田畴不受。携诏返回时,刘虞已被公孙所杀,田畴到刘墓祭拜,被公孙所提,不久释放。田畴回故乡后率家族及随从数百人隐居徐无山,致力农桑,数年间增至5000家。制定法条,兴建学校,一时民风良好,乌桓、鲜卑纷纷与其结交。汉建安二十年(207年),曹操北征乌桓,田畴请为向导。上徐无山、出卢龙、过平冈、登白狼堆、至柳城,曹军大胜,封田畴为亭侯,坚辞不受。曹念田功,四次封赏,终不受,乃拜为议郎。建安二十一年(216年),田畴去世。', - liyi:'李异(生卒年不详),三国时期东吴将领。建安末,与谢旌率水陆三千,击破刘备军将领詹晏、陈凤。刘备领兵攻孙权时,李异与陆逊等人屯巫、秭归,为蜀将所破。黄武元年(222年),陆逊破刘备于猇亭,李异追踪蜀军,屯驻南山。清代学者赵一清认为此李异与刘璋部将李异为同一人。', - caoyu:'曹宇(?-278年),字彭祖,沛国谯县(今安徽亳州)人。三国时期魏国宗室,魏武帝曹操与环夫人之子,邓哀王曹冲同母兄弟。太和六年,封为燕王。魏明帝病危,欲以大将军辅政,不果。其子常道乡公曹奂,是魏国末代皇帝,史称魏元帝。晋朝建立后,降封燕公。咸宁四年(278年),曹宇去世。', - zhangyan:'张燕,本姓褚,生卒年不详,常山真定(今河北正定南)人,东汉末年黑山军首领。张燕剽捍,敏捷过人,军中称为“飞燕”。官渡之战时投降曹操,被任命为平北将军,封安国亭侯。死后其子张方袭爵。', - lushi:'卢氏,五斗米教主张衡妻,张鲁母,擅长驻颜之术,常年令自己保持少女的容颜。常拜访刘焉,与其交好。', - lvboshe:'吕伯奢,东汉成皋(今河南荥阳)人,曹操父亲曹嵩的故友。曹操与陈宫在逃离董卓避祸,返回乡里的途中借宿于吕伯奢家,未伤其人,有贼八人欲捉曹操,曹操杀之,明罗贯中在历史小说《三国演义》中将这段历史进行了丑化加工,也成为小说中曹操名言“宁教我负天下人,休教天下人负我”的出处。', - caoxi:'曹羲(?-249年),字昭叔。曹真之子,曹爽之弟。为人有学识,明律法。司马懿曾组织朝议改革九品中正制废除九品而留中正,曹羲认为此举并无区别,最终都是决定于人的人治。曹爽掌权后,受封中领军,掌握禁兵,封安乡侯。曹爽及诸兄弟轻视司马懿,恣意妄为,经常外出狩猎,曹羲屡次劝谏,不被采纳。249年,司马懿发动高平陵政变,被夷三族。', - duanjiong:'段颎(?-179年),字纪明,武威姑臧(今甘肃省武威市)人。东汉名将,西域都护段会宗从曾孙,与皇甫规(字威明)、张奂(字然明)并称“凉州三明”。段颎少时学习骑射,有文武智略,最初被举为孝廉,为宪陵园丞、阳陵令,有治理之才。汉桓帝时入军旅,先破鲜卑,后讨平东郭窦、公孙举起事,以功封列侯。延熹二年(159年)起戍边征战十余年,百战羌人,至永康元年(167年)平定西羌,建宁二年(169年)平定东羌,前后斩东西羌六万余级。累功封新丰县侯。建宁三年(170年),段颎被征入朝,历任侍中、执金吾、河南尹、司隶校尉等职,他党附宦官、捕杀太学生,因而得保富贵,两度出任太尉。光和二年(179年),权宦王甫罪行被揭发,段颎受牵连下狱,其后在狱中饮鸩而死。', - haopu:'郝普,字子太,义阳(治所在今湖北枣阳东南)人。刘备入川后,郝普为零陵太守。建安二十年(215年),吴将吕蒙进攻荆州三郡,唯有郝普坚守待援。但援兵久久不至,其挚友邓玄之又被吕蒙所骗,郝普也因此上当,投降吴国。湘水划界后,郝普回归刘备。建安二十四年(219年),吕蒙再次袭击荆州,击败关羽,郝普再次投降,最终归顺吴国并官至廷尉。郝普与隐蕃亲善,隐蕃蓄谋叛变事情败露,他受到牵连,因此自杀。在刘备集团的5个荆州郡守中,郝普是唯一一个抵抗过东吴的荆州郡守。', - ol_zhanghe:'字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。', - zhangshiping:'张世平是东汉末期的中山商人,曾与苏双同路,资助刘备组织武装、建立政权。于《三国演义》第一回出场,刘关张桃园三结义时资助刘备良马五十匹,金银五百两,镔铁一千斤。刘备所使用的“双股剑”、关羽所使用的“青龙偃月刀(又名‘冷艳锯’)”、张飞所使用的“丈八点钢矛(又名‘丈八蛇矛’)”皆由这一千斤上好镔铁打造而成。', - luoxian:'罗宪(218年—270年),字令则,荆州襄阳(今湖北襄阳)人。西晋开国将领,巴东太守(郡府在永安白帝城)。于蜀汉灭亡后降魏,成功抵御孙吴的入侵,守住入魏国的要冲永安。后仕晋官至冠军将军、假节,封西鄂县侯。泰始六年(270年)去世,谥烈侯。', - sunhong:'孙弘(?—252年),三国时期吴国大臣,扬州会稽(今浙江省绍兴市)人。官至吴国中书令、少傅。鲁王孙霸与太子孙和各植党羽,孙弘即依附孙霸。孙权病笃,而太子年少,于是以孙弘领少傅。孙权临终,召他与诸葛恪、孙峻等嘱以后事,孙弘与诸葛恪同为顾命大臣。孙权死后,孙弘因素来与诸葛恪不和,怕为所治,故而隐瞒了孙权的死讯,欲矫诏除掉诸葛恪,被孙峻告发。后诸葛恪请孙弘议事,于座中将其诛杀。', - wangguan:'《三国演义》中虚构人物,历史上不曾记载。在114回出场,曾为邓艾手下参谋,献反间计与邓艾,被姜维识破,兵败自投江而死。', - maxiumatie:'马休(?-212年),马铁(?-212年)。两人均为扶风茂陵(今陕西兴平)人,马腾之子,马超之弟。马腾遭韩遂进攻,乃携马休、马铁等入京受职。马休被封为奉车都尉,马铁被封为骑都尉。后在邺城居住。因兄马超反,两人被曹操夷灭。', - dongtuna:'董荼那,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第二洞元帅;与阿会喃等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同阿会喃共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。', - zhanghua:'张华(232年-300年),字茂先。范阳郡方城县(今河北固安)人。西晋时期政治家、文学家、藏书家,西汉留侯张良的十六世孙。张华出身范阳张氏,自少贫苦,因才学过人而受同乡名臣卢钦、刘放、阮籍等人的赞赏。在曹魏时,他历任太常博士、河南尹丞、佐著作郎、中书郎等职。西晋建立后,拜黄门侍郎,封关内侯,逐渐受到晋武帝的重用。后拜中书令,加散骑常侍,与大将杜预坚决支持武帝伐吴,于战时任度支尚书。吴国灭亡后,以功进封广武县侯。其后遭到排挤,出镇幽州,政绩卓然。之后返朝任太常,终武帝之世未得参与政事。晋惠帝继位后,累官至司空,封壮武郡公,被皇后贾南风委以朝政。张华尽忠辅佐,使天下仍然保持相对安宁。永康元年(300年),♯♯司马伦发动政变,张华惨遭杀害,年六十九。太安二年(303年),获得♯♯,追复官爵。张华工于诗赋,词藻华丽,又雅爱书籍,精于目录学,编纂有中国第一部博物学著作《博物志》;还曾与荀勖等人依照刘向《别录》整理典籍。《宣和书谱》载有其草书《得书帖》及行书《闻时帖》。《隋书·经籍志》有《张华集》十卷,今已佚。明人张溥辑有《张茂先集》。', - quhuang:'屈晃(?—251),祖籍汝南(今河南省汝南县),汉末避乱南下,三国吴时居章安(今属椒江区)。初为郡吏,在职清廉,颇有政声。赤乌初年,擢为尚书仆射。', - macheng:'马承,蜀汉骠骑将军马超之子。仕蜀汉,马超死后继承其斄乡侯爵位。', - zhangzhi:'张芝(?—192年),字伯英,敦煌郡渊泉县(今甘肃省瓜州县)人。东汉书法家、“草书之祖”,大司农张奂的儿子。出身名门,拒绝朝廷征召,潜心研习书法。擅长草书中的章草,将古代当时字字区别、笔画分离的草法,改为上下牵连富于变化的新写法,富有独创性,在当时影响很大。李志敏评价:“张芝创造了草书问世以来的第一座高峰,精熟神妙,兼善章今”。 没有真迹传世,仅存《八月帖》等刻帖。汉献帝初平三年,去世于家中,著有《笔心论》,与钟繇、王羲之和王献之并称“书中四贤”。', - ahuinan:'阿会喃,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第三洞元帅;与董荼那等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同董荼那共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。', - xiahouxuan:'夏侯玄(209年~254年),字泰初(《三国志》等作太初),沛国谯县(今安徽省亳州市)人。三国时期曹魏大臣、思想家、文学家,征南大将军夏侯尚之子,大将军曹爽的表弟。夏侯玄少年有名望,仪表出众,时人称为“朗朗如日月之入怀”。魏文帝黄初六年(225年),袭封昌陵乡侯。魏明帝时,历任散骑黄门侍郎、羽林监。少帝曹芳继位后,拜散骑常侍、中护军,保卫皇宫。后任征西将军,任内与曹爽策划骆谷之役,大失人心。高平陵政变后,被夺去兵权,改任大鸿胪、太常卿。嘉平六年(254年),中书令李丰与外戚张缉密谋杀死大将军司马师,改以夏侯玄执政。事泄被杀,夷灭三族,夏侯玄死时年仅四十六岁。著有文集三卷,如今已佚。政治上,提出了“审官择人”、“除重官”、“改服制”等制度,被太傅司马懿评价“皆大善”。博学多识,才华出众,精通玄学,成为“四聪”之一,与何晏等人开创了魏晋玄学的先河,是早期的玄学领袖人物。', - dengzhong:'邓忠(不详-264年),三国时期曹魏名将邓艾之子。景元五年(264年),钟会谋反事败,士兵哗变,钟会被杀,邓艾部将想追还邓艾父子,但卫瓘却派田续追邓艾,于绵竹西相遇,将邓艾和邓忠等人杀死。直至泰始九年(273年)才恢复名节。', - wangyan:'王衍(256年~311年),字夷甫,琅邪郡临沂县(今山东省临沂市)人。西晋末年重臣,玄学清谈领袖,曹魏幽州刺史王雄之孙、平北将军王乂之子、司徒王戎堂弟。王衍出身琅琊王氏。外表清明俊秀,风姿安详文雅,笃好老庄学说,颇有时名。步入仕途后,历任黄门侍郎、中领军、尚书令、尚书仆射等职。光熙元年(307年),升任司空。次年,又任司徒。王衍位高权重,却不思为国,为保全自己,还让弟弟王澄、族弟王敦分任荆州、青州刺史,遭时人鄙夷。王弥进攻洛阳时,王衍率军抵抗。其后转任太尉兼尚书令,又兼领太傅军司。永嘉五年(311年),东海王司马越去世,王衍奉其灵柩返回东海,途中为羯人石勒所俘获。王衍在与石勒交谈时,仍推脱责任,并劝其称帝,石勒大怒,将其与西晋旧臣一同活埋,时年五十六岁。王衍工书法,尤擅行书,《宣和书谱》有其作品《尊夫人帖》。', - caoxiancaohua:'请分别查看「曹宪」和「曹华」的武将介绍。', - zhaoyǎn:'赵俨(171~245年),字伯然,颍川阳翟(今河南禹州市)。东汉末年颍川“四大名士”之一,三国时期魏国名臣。熟读经史,精明强干。建安二年,投靠大将军曹操之后,起家朗陵县令,历任司空府掾、司空主薄、都督护军、扶风太守等职。魏文帝曹丕继位后,历任魏国侍中、驸马都尉、河东太守、典农中郎将、度支尚书,封宜土亭侯。魏明帝曹睿时期,历任大司农、骠骑将军、大司空等职。正始六年,去世,时年七十五,谥号为穆。', - ruiji:'芮姬,芮玄之女,太子孙登妃,黄武五年卒。', - weizi:'卫兹(?-190年),字子许,(《三国演义》中其名为卫弘,当为误记),陈留襄邑(今河南睢县)人。曾举孝廉,先后被车骑将军何苗、司徒杨赐等召辟。中平六年(189年)十二月,曹操在陈留己吾募兵,而卫兹以家财资助曹操,使曹操顺利募得五千士兵。此后,卫兹与曹操共同讨伐董卓。初平元年(190年),卫兹在跟随曹操讨伐董卓途中,于荥阳汴水遭遇董卓军徐荣,力战终日,失利身亡。', - tengfanglan:'滕芳兰,生卒年不详,北海剧县(今山东省寿光市)人,太常滕胤的族女,滕牧的女儿,吴末帝孙皓的皇后。永安元年(258年),孙皓为乌程侯时被聘为妃。元兴元年(264年),孙皓登基后被立为皇后。孙吴灭亡后,随孙皓迁居洛阳。', - qinghegongzhu:'清河长公主,沛国谯县人,曹操长女(按其与曹操长子曹昂同出于刘夫人,而刘夫人又早死,故其年龄应长于曹丕等其他曹操诸子女,又按长公主亦有年最长之意,故应为曹操之长女)。母刘夫人,得到曹操喜爱。清河公主后来下嫁夏侯楙。曹操初欲嫁丁仪,曹丕劝其嫁与夏侯楙。后与小叔子设计欲谋害丈夫,未果。', - fanjiangzhangda:'范强,在明朝小说《三国演义》里叫做范疆。二人均为张飞手下部将。蜀汉章武元年,刘备伐吴,张飞率军从阆中前往江州,出发前,范强和张达杀死张飞,带着张飞的首级投奔了东吴。', - tianyu:'田豫(171年~252年),字国让,渔阳雍奴(今天津市武清区)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。后来田豫常年镇守曹魏北疆,从征代郡乌桓、斩骨进、破轲比能,多有功勋;也曾参与对孙吴的作战,在成山斩杀周贺,于新城击败孙权。官至太中大夫,封长乐亭侯。有一子田彭祖。', - wuyan:'吴国及西晋初年将领。初任通江县吏,后得到大司马陆抗的提拔重用,逐渐升至建平太守。', - fengfangnv:'冯方之女,司隶人,袁术妻妾。在史书中被记载为天姿国色的美人。钱大昭在《三国志辨疑》中认为冯方当为冯芳误字,冯方女实为是西园八校尉之一的冯芳的女儿。然而,在曹丕《典论》、《九州春秋》等书籍都有提及她,皆作冯方女字样,并无一书写作冯芳女或是明提是冯芳之女。最关键的一点是,冯芳是荆州西陵县人,她女儿不可能是司隶籍,冯芳也没担任过任何与司隶有关的官职。同时期名字为“○女”的并不少见,如施绩女儿施淑女,曹植女儿曹行女,夏侯令女等。', - zuofen:'左芬(约253年-300年4月23日),出土墓志作左棻,字兰芝,齐国临淄(今山东临淄)人,西晋诗人。少好学,善属文。为晋武帝贵人。今存诗、赋、颂、赞、诔等20余篇,大都为应诏而作,《离思赋》最著名。原有集,已失传。', - duxi:'杜袭(生卒年不详),字子绪,颍川郡定陵县(今河南省襄城县)人。三国时期魏国重臣,东汉末年颍川“四大名士”之一,济阴太守杜根的孙子。建安初年,投奔司空曹操,历任西鄂县令、议郎、丞相军咨祭酒、魏王侍中、丞相长史、驸马都尉。魏文帝时期,出任督军粮御史、尚书,累封武平亭侯。魏明帝时期,担任大将军曹真和司马懿的军师,抵御蜀国进攻,拜太中大夫,受封平阳乡侯。卒于任上,获赠少府,谥号为定。', - gaogan:'高干(?~206年),字元才,陈留郡圉县(今河南杞县圉镇)人。东汉末年并州割据将领,蜀郡太守高躬之子、大将军袁绍外甥。出身陈留高氏,才志弘邈,文武秀出。早年联合荀谌游说韩馥让出冀州牧。袁绍平定河北后,以为并州牧。官渡之战时,在西线配合作战。因曹操早有准备,没有实质进展。袁绍死后,袁谭、袁尚与曹操大战于黎阳郡时,联合郭援攻打平阳郡,为马腾为首关中将领所败,郭援为庞德所斩。袁尚败走中山郡后,出降于曹操,仍为并州刺史。建安十年,兴兵反曹,固守壶关,成功抵挡乐进进攻。得知曹操亲征后,留下别将守城,亲往匈奴呼厨泉求救,没有成功。引兵攻略河东郡,屡为钟繇、张既所败。建安十一年,投奔荆州刘表。途经上洛时,为上洛都尉捕斩之。', - huangchengyan:'黄承彦,生卒年不详,汉末三国时期沔阳名士,诸葛亮岳父,黄月英之父。南郡大士蔡讽的女婿,与襄阳名士上层社会圈子:庞统(凤雏)、庞德公、司马徽、徐庶等人交好。《襄阳记》:黄承彦者,高爽开列,为沔阳名士,谓诸葛孔明曰:“闻君择妇,身有丑女,黄头黑色,而才堪配。”孔明许,即载送之。时人以为笑乐,乡里为之谚曰:“莫作孔明择妇,正得阿承丑女。”', - panshu:'潘淑(?-252年),会稽句章(今浙江省宁波市)人,是吴大帝孙权的皇后,吴少帝孙亮的母亲。和孙权是中国历代帝后中年龄差距较大的一对。潘淑少时与姐姐俱没入织室,容媚有宠,拜为夫人,生有一子孙亮。赤乌十三年(250年),孙权立孙亮为皇太子,翌年(251年)立潘淑为皇后。神凤元年(252年)暴崩,合葬蒋陵。世称潘淑为江东绝色,有神女之称。', - zongyu:'宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。', - mengda:'孟达(?-228),字子度,本字子敬,因刘备的叔父名叫刘子敬,为避讳而改字。扶风郡郿人,三国时期人物。本为刘璋属下,后降刘备。关羽围樊城、襄阳时因不发兵救关羽而触怒刘备,于是投奔曹魏。此后,劝降刘封,未果。在魏官至散骑常侍、建武将军,封平阳亭侯。此后又欲反曹魏而归蜀汉,事败而死。', - wolongfengchu:'沙比武将,懒得复制粘贴,自己去看「诸葛亮」和「庞统」的介绍吧。', - caoshuang:'曹爽(?-249年2月9日),字昭伯,沛国谯县(今安徽亳州市)人。三国时期魏国权臣,大司马曹真长子。曹爽体态肥胖,凭借宗室身份,出入宫廷,交好太子曹叡。魏明帝即位,起家员外散骑侍郎,累迁城门校尉、散骑常侍,转武卫将军。太和五年(231年),袭封邵陵侯。景初三年(239年),魏明帝曹叡病危,拜大将军、假黄钺,与司马懿并为托孤大臣。少帝曹芳即位,加侍中,改封武安侯。势倾四海,声震天下。任用私人,专权乱政,侵吞公产。伐蜀失败,虚耗国力。起居逾制,软禁郭太后。正始十年,太傅司马懿发动高平陵政变,掌握魏国大权。曹爽失去大将军职务,以谋反之罪处死,夷灭三族。', - zhangling:'张道陵(34年2月22日—156年),字辅汉,原名陵,道教正一道实际创立者,汉朝东汉时期丰邑(今江苏徐州丰县)人。太上老君降临蜀地,“授以三天正法,命为天师”,张道陵整合当时的:黄老派、方仙道、文始派等先秦修道团体,创立道教称正一盟威之道。后世尊称为“老祖天师”、“正一真人”、“三天扶教大法师”、高明上帝、张天师。著作《老子想尔注》,弟子有3000多人,设立24治,奠基天师道。张道陵、葛玄、许逊、萨守坚合称四大天师。张道陵创建道教的背景:当时在巴蜀一带,原有巴人信奉原始巫教,大规模的淫祀而害民。而这些祀奉鬼妖(学名为:妖邪)的法教巫师聚众敛财,无恶不作。张天师携王长、赵升二位弟子和黄帝九鼎丹经,来到北邙山修行,平定了那些祸害百姓的巫妖之教。川渝一带流传的张天师以太上老君剑印符箓大破鬼兵的故事就是以此为原型的。', - caiyang:'蔡阳(?-201年),又作蔡扬,东汉丞相曹操部下武将,汝南太守。于建安六年(201)奉曹操之命攻击与刘备联合的汝南贼龚都等人,兵败被刘备所杀。明代小说《三国演义》改编为“云长擂鼓斩蔡阳”。', - pujing:'湖北省当阳境内有一座山,名叫玉泉山。东汉建安末年,山上住着一个老和尚,法名普净,普净原来是沂水关镇国寺方丈,后因云游天下,来到此处,风这地方山明水秀,就于山中结草为庵,每天坐禅参道,身边只有一个小和尚,外出化一些斋饭,供养师父。在《三国演义》中,当关羽通过汜水关时,正是由于普净提醒,关羽才揭穿了卞喜的阴谋,并杀死了卞喜。关羽死后,其怨魂亦在普净的指点下醒悟,放下了心中的仇恨,专心致力于造福一方百姓。', - huban:'为《三国演义》所杜撰的人物,正史无记载,荥阳太守王植麾下从事、桓帝时议郎胡华之子。关羽过五关斩六将时其中一关就是王植所镇守,胡班奉命放火夜袭关公,因敬服公之气概,并得其父托公所带家书,班看毕,叹曰:“险些误杀忠良!”故将之放走。胡班到荆州来投降关公,公念其旧日相救之情,甚爱之;令随费诗入川,见汉中王受爵。费诗辞别关公,带了胡班,自回蜀中去了。', - chunyuqiong:'淳于琼(?-200年),字仲简,颍川(治今河南禹州)人。东汉时期官吏,于汉灵帝中平五年(188)被任命为西园八校尉之一的右校尉,与蹇硕、袁绍、鲍鸿、曹操、赵融、冯芳、夏牟同列。为袁绍大将,与张郃、高览等人齐名。在官渡之战时镇守乌巢,遭到曹操的偷袭而惨败,自己也被曹操处斩。', - lvkuanglvxiang:'吕旷(生卒年不详),与吕翔同是袁绍属下,袁绍去世后,为袁尚守东平,后来投降曹操,并被封为列侯。在《三国演义》中,在曹操准备往南准备攻击前,两人跟著大将曹仁和将军李典准备要攻击刘备。但吕旷被赵云刺下马身亡,而吕翔也死于张飞矛下,可以算是出师未捷身先死', - caobuxing:'曹不兴,亦名弗兴,三国时著名画家。孙吴吴兴(今浙江湖州)人,生卒年不详。他在黄武年间(222—229年)享有很大的声誉。被称为“佛画之祖”。与东晋顾恺之、南朝宋陆探微、南朝梁张僧繇并称“六朝四大家”。又与赵达的算术、严武的弈棋、皇象的草书等号称“吴中八绝”。曹不兴善画龙、虎、马及人物,有“落墨为蝇”等传奇故事,其佛画成就对后世影响很大,相传其所画龙头令谢赫叹服不已。画迹今已不存,据《贞观公私画史》载,作品有《青溪龙》、《赤盘龙》、《南海监牧进十种马图》、《夷事夷兽样》、《桃源图》等,惜早已散佚。但之后的著名画家卫协直接师承其法。', - gaolan:'高览,生卒年不详,一名高奂,本属袁绍部将,后官渡之战淳于琼被曹操击破,与张郃一同投降曹操,被封为偏将军,东莱侯。《三国演义》里,曾与许褚、徐晃大战不分胜负。201年刘备败走荆州时,高览奉命追杀,三合斩刘辟,而后被冲阵而来的赵云刺死。', - xunchen:'荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。', - sunshao:'孙邵(163年-225年),字长绪,青州北海国人(今山东潍坊市昌乐县西)。原为北海相孔融的功曹,被孔融称赞为可任朝廷要职的人才,后随刘繇到达江东,继而辅佐孙权。孙权称吴王后,孙邵成为吴国首任丞相,数年后病逝。由于孙邵和当时吴国史官的关系并不是很好,因此在史书中并没有详细的记载。', - yuantanyuanshang:'袁谭、袁尚分别是袁绍的长子和第三子。袁绍坐拥青州、冀州、幽州、并州,本是北方最强诸侯,却于官渡大败,惭恨而终。虽然袁绍生前偏爱小儿子袁尚,却并未在继承人上有明确表态,这也导致本应以嫡长子身份继承的袁谭因郭图、审配伪立遗令未能如愿。曹操击败袁绍后,进而渡过黄河追击袁家残余势力,袁谭告急,但袁尚仅给他少量兵力。曹操得郭嘉之计退兵坐观其变,恰使两人此前的种种矛盾彻底爆发,袁谭不敌便引狼入室,派辛毗作为使者向曹操求援,让袁尚不得不北逃投奔乌桓。但袁谭也在之后背叛曹操兵败被杀。没多久,乌桓也被平定,袁熙、袁尚二人投奔公孙康后被斩首送还曹操。', - xujing:'许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。', - hejin:'何进(?~189年),字遂高,南阳郡宛县(今河南南阳市宛城区)人。东汉时期外戚大臣,灵思皇后之兄。初以妹妹有宠,拜为郎中,出任虎贲中郎将、颍川太守,迁侍中、将作大匠、河南尹。黄巾起义时,拜为大将军,总镇京师,发现并镇压马元义的密谋,封为慎侯。为张大威望,在京师讲武结营,置西园八校尉。汉灵帝驾崩后,粉碎了中常侍蹇硕拥立皇子刘协的图谋,听从袁绍之言,博征智谋之士,内借元舅之资,外据辅政之权,独揽朝中大权。中平六年(189),不纳陈琳和曹操劝谏,阴结军阀董卓,联合袁绍谋诛宦竖。事情败露后,为中常侍张让等人损害,其后代是魏晋高门士族南阳何氏。', - hansui:'韩遂(?-215年),字文约。凉州金城郡人。东汉末年军阀、将领,汉末群雄之一。原名韩约,后改名遂。韩遂最初闻名于西州,被羌胡叛军劫持并推举为首领,以诛宦官为名举兵造反,聚众十万,先后败皇甫嵩、张温、董卓、孙坚等名将,使得天下骚动。后受朝廷招安,拥兵割据一方长达三十余年。韩遂曾与马腾结为异姓兄弟,后二人关系破裂。袁绍、曹操相争之际,马腾、韩遂被钟繇说服,依附于曹操。马腾入京后,留其子马超统领部队。马超推举韩遂为都督起兵反叛曹操,为曹操所败,韩遂逃奔凉州,后又为夏侯渊所败,病死(一说被杀),享年七十余岁。', - niujin:'牛金(生卒年不详),初为曹仁部曲将,周瑜军数万人来攻,前锋数千人始至,曹仁登城望,乃募得三百人,遣牛金迎战。但对方兵力较多,牛金遂被围困。曹仁亲自杀入阵中救出牛金。司马懿使牛金轻骑饵诱蜀军,刚交战诸葛亮就退兵,追至祁山。蜀将马岱入寇,司马懿遣将军牛金击退,斩千余级。公孙渊反,司马懿帅牛金、胡遵等步骑四万发自洛阳,后平定辽东。牛金官至后将军。', - jianggan:"蒋干,字子翼,汉末三国时期的人物,九江(治今安徽寿县)人。历史上的蒋干是当时的名士、辩论家。而罗贯中在历史小说《三国演义》中则将蒋干刻画成了被周瑜所愚弄的小丑形象。", + characterIntro: { + liupan: "刘磐(生卒年不详),山阳高平人,荆州牧刘表从子。与南阳人黄忠共守长沙攸县。为人骁勇,数次为寇于艾、西安诸县。江东孙策于是分海昏、建昌为左右六县,以东莱太史慈为建昌都尉,治海昏,并督诸将共拒刘磐。于是刘磐绝迹不复为寇。", + guotu: "郭图(?-205年),字公则,颍川(治今河南省禹州市)人。东汉末年袁绍帐下谋士。韩馥统冀州时,郭图与荀谌等人奉袁绍之命,说服韩馥让位。袁绍统一河北后,郭图与审配等人力劝袁绍统率大军攻打曹操。袁绍死后,袁尚继位。郭图与辛评为袁谭效力,挑唆袁谭攻击袁尚。建安十年(205年),郭图和袁谭一同被曹操所杀。", + tianchou: + "田畴(169年或170年-214年或216年),字子泰,东汉右北平郡无终人,东汉末年隐士。田畴好文习武。汉初平年间,其受刘虞派遣去长安,呈送指控公孙赞奏章,献帝大悦,封为骑都尉,田畴不受。携诏返回时,刘虞已被公孙所杀,田畴到刘墓祭拜,被公孙所提,不久释放。田畴回故乡后率家族及随从数百人隐居徐无山,致力农桑,数年间增至5000家。制定法条,兴建学校,一时民风良好,乌桓、鲜卑纷纷与其结交。汉建安二十年(207年),曹操北征乌桓,田畴请为向导。上徐无山、出卢龙、过平冈、登白狼堆、至柳城,曹军大胜,封田畴为亭侯,坚辞不受。曹念田功,四次封赏,终不受,乃拜为议郎。建安二十一年(216年),田畴去世。", + liyi: "李异(生卒年不详),三国时期东吴将领。建安末,与谢旌率水陆三千,击破刘备军将领詹晏、陈凤。刘备领兵攻孙权时,李异与陆逊等人屯巫、秭归,为蜀将所破。黄武元年(222年),陆逊破刘备于猇亭,李异追踪蜀军,屯驻南山。清代学者赵一清认为此李异与刘璋部将李异为同一人。", + caoyu: "曹宇(?-278年),字彭祖,沛国谯县(今安徽亳州)人。三国时期魏国宗室,魏武帝曹操与环夫人之子,邓哀王曹冲同母兄弟。太和六年,封为燕王。魏明帝病危,欲以大将军辅政,不果。其子常道乡公曹奂,是魏国末代皇帝,史称魏元帝。晋朝建立后,降封燕公。咸宁四年(278年),曹宇去世。", + zhangyan: + "张燕,本姓褚,生卒年不详,常山真定(今河北正定南)人,东汉末年黑山军首领。张燕剽捍,敏捷过人,军中称为“飞燕”。官渡之战时投降曹操,被任命为平北将军,封安国亭侯。死后其子张方袭爵。", + lushi: "卢氏,五斗米教主张衡妻,张鲁母,擅长驻颜之术,常年令自己保持少女的容颜。常拜访刘焉,与其交好。", + lvboshe: + "吕伯奢,东汉成皋(今河南荥阳)人,曹操父亲曹嵩的故友。曹操与陈宫在逃离董卓避祸,返回乡里的途中借宿于吕伯奢家,未伤其人,有贼八人欲捉曹操,曹操杀之,明罗贯中在历史小说《三国演义》中将这段历史进行了丑化加工,也成为小说中曹操名言“宁教我负天下人,休教天下人负我”的出处。", + caoxi: "曹羲(?-249年),字昭叔。曹真之子,曹爽之弟。为人有学识,明律法。司马懿曾组织朝议改革九品中正制废除九品而留中正,曹羲认为此举并无区别,最终都是决定于人的人治。曹爽掌权后,受封中领军,掌握禁兵,封安乡侯。曹爽及诸兄弟轻视司马懿,恣意妄为,经常外出狩猎,曹羲屡次劝谏,不被采纳。249年,司马懿发动高平陵政变,被夷三族。", + duanjiong: + "段颎(?-179年),字纪明,武威姑臧(今甘肃省武威市)人。东汉名将,西域都护段会宗从曾孙,与皇甫规(字威明)、张奂(字然明)并称“凉州三明”。段颎少时学习骑射,有文武智略,最初被举为孝廉,为宪陵园丞、阳陵令,有治理之才。汉桓帝时入军旅,先破鲜卑,后讨平东郭窦、公孙举起事,以功封列侯。延熹二年(159年)起戍边征战十余年,百战羌人,至永康元年(167年)平定西羌,建宁二年(169年)平定东羌,前后斩东西羌六万余级。累功封新丰县侯。建宁三年(170年),段颎被征入朝,历任侍中、执金吾、河南尹、司隶校尉等职,他党附宦官、捕杀太学生,因而得保富贵,两度出任太尉。光和二年(179年),权宦王甫罪行被揭发,段颎受牵连下狱,其后在狱中饮鸩而死。", + haopu: "郝普,字子太,义阳(治所在今湖北枣阳东南)人。刘备入川后,郝普为零陵太守。建安二十年(215年),吴将吕蒙进攻荆州三郡,唯有郝普坚守待援。但援兵久久不至,其挚友邓玄之又被吕蒙所骗,郝普也因此上当,投降吴国。湘水划界后,郝普回归刘备。建安二十四年(219年),吕蒙再次袭击荆州,击败关羽,郝普再次投降,最终归顺吴国并官至廷尉。郝普与隐蕃亲善,隐蕃蓄谋叛变事情败露,他受到牵连,因此自杀。在刘备集团的5个荆州郡守中,郝普是唯一一个抵抗过东吴的荆州郡守。", + ol_zhanghe: + "字儁乂,河间鄚人。三国时期魏国名将。官渡之战时,本为袁绍部将的张郃投降了曹操,并在曹操帐下多立功勋,于曹魏建立后加封为征西车骑将军。诸葛亮六出祁山之间,张郃多次抵御蜀军的进攻,于公元231年在木门道被诸葛亮设伏射死。后谥曰壮侯。为曹魏“五子良将”之一。", + zhangshiping: + "张世平是东汉末期的中山商人,曾与苏双同路,资助刘备组织武装、建立政权。于《三国演义》第一回出场,刘关张桃园三结义时资助刘备良马五十匹,金银五百两,镔铁一千斤。刘备所使用的“双股剑”、关羽所使用的“青龙偃月刀(又名‘冷艳锯’)”、张飞所使用的“丈八点钢矛(又名‘丈八蛇矛’)”皆由这一千斤上好镔铁打造而成。", + luoxian: + "罗宪(218年—270年),字令则,荆州襄阳(今湖北襄阳)人。西晋开国将领,巴东太守(郡府在永安白帝城)。于蜀汉灭亡后降魏,成功抵御孙吴的入侵,守住入魏国的要冲永安。后仕晋官至冠军将军、假节,封西鄂县侯。泰始六年(270年)去世,谥烈侯。", + sunhong: + "孙弘(?—252年),三国时期吴国大臣,扬州会稽(今浙江省绍兴市)人。官至吴国中书令、少傅。鲁王孙霸与太子孙和各植党羽,孙弘即依附孙霸。孙权病笃,而太子年少,于是以孙弘领少傅。孙权临终,召他与诸葛恪、孙峻等嘱以后事,孙弘与诸葛恪同为顾命大臣。孙权死后,孙弘因素来与诸葛恪不和,怕为所治,故而隐瞒了孙权的死讯,欲矫诏除掉诸葛恪,被孙峻告发。后诸葛恪请孙弘议事,于座中将其诛杀。", + wangguan: + "《三国演义》中虚构人物,历史上不曾记载。在114回出场,曾为邓艾手下参谋,献反间计与邓艾,被姜维识破,兵败自投江而死。", + maxiumatie: + "马休(?-212年),马铁(?-212年)。两人均为扶风茂陵(今陕西兴平)人,马腾之子,马超之弟。马腾遭韩遂进攻,乃携马休、马铁等入京受职。马休被封为奉车都尉,马铁被封为骑都尉。后在邺城居住。因兄马超反,两人被曹操夷灭。", + dongtuna: + "董荼那,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第二洞元帅;与阿会喃等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同阿会喃共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。", + zhanghua: + "张华(232年-300年),字茂先。范阳郡方城县(今河北固安)人。西晋时期政治家、文学家、藏书家,西汉留侯张良的十六世孙。张华出身范阳张氏,自少贫苦,因才学过人而受同乡名臣卢钦、刘放、阮籍等人的赞赏。在曹魏时,他历任太常博士、河南尹丞、佐著作郎、中书郎等职。西晋建立后,拜黄门侍郎,封关内侯,逐渐受到晋武帝的重用。后拜中书令,加散骑常侍,与大将杜预坚决支持武帝伐吴,于战时任度支尚书。吴国灭亡后,以功进封广武县侯。其后遭到排挤,出镇幽州,政绩卓然。之后返朝任太常,终武帝之世未得参与政事。晋惠帝继位后,累官至司空,封壮武郡公,被皇后贾南风委以朝政。张华尽忠辅佐,使天下仍然保持相对安宁。永康元年(300年),♯♯司马伦发动政变,张华惨遭杀害,年六十九。太安二年(303年),获得♯♯,追复官爵。张华工于诗赋,词藻华丽,又雅爱书籍,精于目录学,编纂有中国第一部博物学著作《博物志》;还曾与荀勖等人依照刘向《别录》整理典籍。《宣和书谱》载有其草书《得书帖》及行书《闻时帖》。《隋书·经籍志》有《张华集》十卷,今已佚。明人张溥辑有《张茂先集》。", + quhuang: + "屈晃(?—251),祖籍汝南(今河南省汝南县),汉末避乱南下,三国吴时居章安(今属椒江区)。初为郡吏,在职清廉,颇有政声。赤乌初年,擢为尚书仆射。", + macheng: "马承,蜀汉骠骑将军马超之子。仕蜀汉,马超死后继承其斄乡侯爵位。", + zhangzhi: + "张芝(?—192年),字伯英,敦煌郡渊泉县(今甘肃省瓜州县)人。东汉书法家、“草书之祖”,大司农张奂的儿子。出身名门,拒绝朝廷征召,潜心研习书法。擅长草书中的章草,将古代当时字字区别、笔画分离的草法,改为上下牵连富于变化的新写法,富有独创性,在当时影响很大。李志敏评价:“张芝创造了草书问世以来的第一座高峰,精熟神妙,兼善章今”。 没有真迹传世,仅存《八月帖》等刻帖。汉献帝初平三年,去世于家中,著有《笔心论》,与钟繇、王羲之和王献之并称“书中四贤”。", + ahuinan: + "阿会喃,小说《三国演义》及其衍生作品中的角色,南蛮王孟获属下大将,第三洞元帅;与董荼那等人一起担任孟获的援军出征,但是被俘虏,又被诸葛亮释放,再次出战时,被唾骂不知羞耻,面红耳赤的退军。后同董荼那共同绑架孟获献于蜀军,却被诸葛亮在其二人与孟获的重要性间权衡后出卖了他们,放走了孟获,使其为孟获所杀。", + xiahouxuan: + "夏侯玄(209年~254年),字泰初(《三国志》等作太初),沛国谯县(今安徽省亳州市)人。三国时期曹魏大臣、思想家、文学家,征南大将军夏侯尚之子,大将军曹爽的表弟。夏侯玄少年有名望,仪表出众,时人称为“朗朗如日月之入怀”。魏文帝黄初六年(225年),袭封昌陵乡侯。魏明帝时,历任散骑黄门侍郎、羽林监。少帝曹芳继位后,拜散骑常侍、中护军,保卫皇宫。后任征西将军,任内与曹爽策划骆谷之役,大失人心。高平陵政变后,被夺去兵权,改任大鸿胪、太常卿。嘉平六年(254年),中书令李丰与外戚张缉密谋杀死大将军司马师,改以夏侯玄执政。事泄被杀,夷灭三族,夏侯玄死时年仅四十六岁。著有文集三卷,如今已佚。政治上,提出了“审官择人”、“除重官”、“改服制”等制度,被太傅司马懿评价“皆大善”。博学多识,才华出众,精通玄学,成为“四聪”之一,与何晏等人开创了魏晋玄学的先河,是早期的玄学领袖人物。", + dengzhong: + "邓忠(不详-264年),三国时期曹魏名将邓艾之子。景元五年(264年),钟会谋反事败,士兵哗变,钟会被杀,邓艾部将想追还邓艾父子,但卫瓘却派田续追邓艾,于绵竹西相遇,将邓艾和邓忠等人杀死。直至泰始九年(273年)才恢复名节。", + wangyan: + "王衍(256年~311年),字夷甫,琅邪郡临沂县(今山东省临沂市)人。西晋末年重臣,玄学清谈领袖,曹魏幽州刺史王雄之孙、平北将军王乂之子、司徒王戎堂弟。王衍出身琅琊王氏。外表清明俊秀,风姿安详文雅,笃好老庄学说,颇有时名。步入仕途后,历任黄门侍郎、中领军、尚书令、尚书仆射等职。光熙元年(307年),升任司空。次年,又任司徒。王衍位高权重,却不思为国,为保全自己,还让弟弟王澄、族弟王敦分任荆州、青州刺史,遭时人鄙夷。王弥进攻洛阳时,王衍率军抵抗。其后转任太尉兼尚书令,又兼领太傅军司。永嘉五年(311年),东海王司马越去世,王衍奉其灵柩返回东海,途中为羯人石勒所俘获。王衍在与石勒交谈时,仍推脱责任,并劝其称帝,石勒大怒,将其与西晋旧臣一同活埋,时年五十六岁。王衍工书法,尤擅行书,《宣和书谱》有其作品《尊夫人帖》。", + caoxiancaohua: "请分别查看「曹宪」和「曹华」的武将介绍。", + zhaoyǎn: + "赵俨(171~245年),字伯然,颍川阳翟(今河南禹州市)。东汉末年颍川“四大名士”之一,三国时期魏国名臣。熟读经史,精明强干。建安二年,投靠大将军曹操之后,起家朗陵县令,历任司空府掾、司空主薄、都督护军、扶风太守等职。魏文帝曹丕继位后,历任魏国侍中、驸马都尉、河东太守、典农中郎将、度支尚书,封宜土亭侯。魏明帝曹睿时期,历任大司农、骠骑将军、大司空等职。正始六年,去世,时年七十五,谥号为穆。", + ruiji: "芮姬,芮玄之女,太子孙登妃,黄武五年卒。", + weizi: "卫兹(?-190年),字子许,(《三国演义》中其名为卫弘,当为误记),陈留襄邑(今河南睢县)人。曾举孝廉,先后被车骑将军何苗、司徒杨赐等召辟。中平六年(189年)十二月,曹操在陈留己吾募兵,而卫兹以家财资助曹操,使曹操顺利募得五千士兵。此后,卫兹与曹操共同讨伐董卓。初平元年(190年),卫兹在跟随曹操讨伐董卓途中,于荥阳汴水遭遇董卓军徐荣,力战终日,失利身亡。", + tengfanglan: + "滕芳兰,生卒年不详,北海剧县(今山东省寿光市)人,太常滕胤的族女,滕牧的女儿,吴末帝孙皓的皇后。永安元年(258年),孙皓为乌程侯时被聘为妃。元兴元年(264年),孙皓登基后被立为皇后。孙吴灭亡后,随孙皓迁居洛阳。", + qinghegongzhu: + "清河长公主,沛国谯县人,曹操长女(按其与曹操长子曹昂同出于刘夫人,而刘夫人又早死,故其年龄应长于曹丕等其他曹操诸子女,又按长公主亦有年最长之意,故应为曹操之长女)。母刘夫人,得到曹操喜爱。清河公主后来下嫁夏侯楙。曹操初欲嫁丁仪,曹丕劝其嫁与夏侯楙。后与小叔子设计欲谋害丈夫,未果。", + fanjiangzhangda: + "范强,在明朝小说《三国演义》里叫做范疆。二人均为张飞手下部将。蜀汉章武元年,刘备伐吴,张飞率军从阆中前往江州,出发前,范强和张达杀死张飞,带着张飞的首级投奔了东吴。", + tianyu: "田豫(171年~252年),字国让,渔阳雍奴(今天津市武清区)人。三国时期曹魏将领。初从刘备,因母亲年老回乡,后跟随公孙瓒,公孙瓒败亡,劝说鲜于辅加入曹操。曹操攻略河北时,田豫正式得到曹操任用,历任颖阴、郎陵令、弋阳太守等。后来田豫常年镇守曹魏北疆,从征代郡乌桓、斩骨进、破轲比能,多有功勋;也曾参与对孙吴的作战,在成山斩杀周贺,于新城击败孙权。官至太中大夫,封长乐亭侯。有一子田彭祖。", + wuyan: "吴国及西晋初年将领。初任通江县吏,后得到大司马陆抗的提拔重用,逐渐升至建平太守。", + fengfangnv: + "冯方之女,司隶人,袁术妻妾。在史书中被记载为天姿国色的美人。钱大昭在《三国志辨疑》中认为冯方当为冯芳误字,冯方女实为是西园八校尉之一的冯芳的女儿。然而,在曹丕《典论》、《九州春秋》等书籍都有提及她,皆作冯方女字样,并无一书写作冯芳女或是明提是冯芳之女。最关键的一点是,冯芳是荆州西陵县人,她女儿不可能是司隶籍,冯芳也没担任过任何与司隶有关的官职。同时期名字为“○女”的并不少见,如施绩女儿施淑女,曹植女儿曹行女,夏侯令女等。", + zuofen: "左芬(约253年-300年4月23日),出土墓志作左棻,字兰芝,齐国临淄(今山东临淄)人,西晋诗人。少好学,善属文。为晋武帝贵人。今存诗、赋、颂、赞、诔等20余篇,大都为应诏而作,《离思赋》最著名。原有集,已失传。", + duxi: "杜袭(生卒年不详),字子绪,颍川郡定陵县(今河南省襄城县)人。三国时期魏国重臣,东汉末年颍川“四大名士”之一,济阴太守杜根的孙子。建安初年,投奔司空曹操,历任西鄂县令、议郎、丞相军咨祭酒、魏王侍中、丞相长史、驸马都尉。魏文帝时期,出任督军粮御史、尚书,累封武平亭侯。魏明帝时期,担任大将军曹真和司马懿的军师,抵御蜀国进攻,拜太中大夫,受封平阳乡侯。卒于任上,获赠少府,谥号为定。", + gaogan: "高干(?~206年),字元才,陈留郡圉县(今河南杞县圉镇)人。东汉末年并州割据将领,蜀郡太守高躬之子、大将军袁绍外甥。出身陈留高氏,才志弘邈,文武秀出。早年联合荀谌游说韩馥让出冀州牧。袁绍平定河北后,以为并州牧。官渡之战时,在西线配合作战。因曹操早有准备,没有实质进展。袁绍死后,袁谭、袁尚与曹操大战于黎阳郡时,联合郭援攻打平阳郡,为马腾为首关中将领所败,郭援为庞德所斩。袁尚败走中山郡后,出降于曹操,仍为并州刺史。建安十年,兴兵反曹,固守壶关,成功抵挡乐进进攻。得知曹操亲征后,留下别将守城,亲往匈奴呼厨泉求救,没有成功。引兵攻略河东郡,屡为钟繇、张既所败。建安十一年,投奔荆州刘表。途经上洛时,为上洛都尉捕斩之。", + huangchengyan: + "黄承彦,生卒年不详,汉末三国时期沔阳名士,诸葛亮岳父,黄月英之父。南郡大士蔡讽的女婿,与襄阳名士上层社会圈子:庞统(凤雏)、庞德公、司马徽、徐庶等人交好。《襄阳记》:黄承彦者,高爽开列,为沔阳名士,谓诸葛孔明曰:“闻君择妇,身有丑女,黄头黑色,而才堪配。”孔明许,即载送之。时人以为笑乐,乡里为之谚曰:“莫作孔明择妇,正得阿承丑女。”", + panshu: "潘淑(?-252年),会稽句章(今浙江省宁波市)人,是吴大帝孙权的皇后,吴少帝孙亮的母亲。和孙权是中国历代帝后中年龄差距较大的一对。潘淑少时与姐姐俱没入织室,容媚有宠,拜为夫人,生有一子孙亮。赤乌十三年(250年),孙权立孙亮为皇太子,翌年(251年)立潘淑为皇后。神凤元年(252年)暴崩,合葬蒋陵。世称潘淑为江东绝色,有神女之称。", + zongyu: "宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。", + mengda: "孟达(?-228),字子度,本字子敬,因刘备的叔父名叫刘子敬,为避讳而改字。扶风郡郿人,三国时期人物。本为刘璋属下,后降刘备。关羽围樊城、襄阳时因不发兵救关羽而触怒刘备,于是投奔曹魏。此后,劝降刘封,未果。在魏官至散骑常侍、建武将军,封平阳亭侯。此后又欲反曹魏而归蜀汉,事败而死。", + wolongfengchu: "沙比武将,懒得复制粘贴,自己去看「诸葛亮」和「庞统」的介绍吧。", + caoshuang: + "曹爽(?-249年2月9日),字昭伯,沛国谯县(今安徽亳州市)人。三国时期魏国权臣,大司马曹真长子。曹爽体态肥胖,凭借宗室身份,出入宫廷,交好太子曹叡。魏明帝即位,起家员外散骑侍郎,累迁城门校尉、散骑常侍,转武卫将军。太和五年(231年),袭封邵陵侯。景初三年(239年),魏明帝曹叡病危,拜大将军、假黄钺,与司马懿并为托孤大臣。少帝曹芳即位,加侍中,改封武安侯。势倾四海,声震天下。任用私人,专权乱政,侵吞公产。伐蜀失败,虚耗国力。起居逾制,软禁郭太后。正始十年,太傅司马懿发动高平陵政变,掌握魏国大权。曹爽失去大将军职务,以谋反之罪处死,夷灭三族。", + zhangling: + "张道陵(34年2月22日—156年),字辅汉,原名陵,道教正一道实际创立者,汉朝东汉时期丰邑(今江苏徐州丰县)人。太上老君降临蜀地,“授以三天正法,命为天师”,张道陵整合当时的:黄老派、方仙道、文始派等先秦修道团体,创立道教称正一盟威之道。后世尊称为“老祖天师”、“正一真人”、“三天扶教大法师”、高明上帝、张天师。著作《老子想尔注》,弟子有3000多人,设立24治,奠基天师道。张道陵、葛玄、许逊、萨守坚合称四大天师。张道陵创建道教的背景:当时在巴蜀一带,原有巴人信奉原始巫教,大规模的淫祀而害民。而这些祀奉鬼妖(学名为:妖邪)的法教巫师聚众敛财,无恶不作。张天师携王长、赵升二位弟子和黄帝九鼎丹经,来到北邙山修行,平定了那些祸害百姓的巫妖之教。川渝一带流传的张天师以太上老君剑印符箓大破鬼兵的故事就是以此为原型的。", + caiyang: + "蔡阳(?-201年),又作蔡扬,东汉丞相曹操部下武将,汝南太守。于建安六年(201)奉曹操之命攻击与刘备联合的汝南贼龚都等人,兵败被刘备所杀。明代小说《三国演义》改编为“云长擂鼓斩蔡阳”。", + pujing: "湖北省当阳境内有一座山,名叫玉泉山。东汉建安末年,山上住着一个老和尚,法名普净,普净原来是沂水关镇国寺方丈,后因云游天下,来到此处,风这地方山明水秀,就于山中结草为庵,每天坐禅参道,身边只有一个小和尚,外出化一些斋饭,供养师父。在《三国演义》中,当关羽通过汜水关时,正是由于普净提醒,关羽才揭穿了卞喜的阴谋,并杀死了卞喜。关羽死后,其怨魂亦在普净的指点下醒悟,放下了心中的仇恨,专心致力于造福一方百姓。", + huban: "为《三国演义》所杜撰的人物,正史无记载,荥阳太守王植麾下从事、桓帝时议郎胡华之子。关羽过五关斩六将时其中一关就是王植所镇守,胡班奉命放火夜袭关公,因敬服公之气概,并得其父托公所带家书,班看毕,叹曰:“险些误杀忠良!”故将之放走。胡班到荆州来投降关公,公念其旧日相救之情,甚爱之;令随费诗入川,见汉中王受爵。费诗辞别关公,带了胡班,自回蜀中去了。", + chunyuqiong: + "淳于琼(?-200年),字仲简,颍川(治今河南禹州)人。东汉时期官吏,于汉灵帝中平五年(188)被任命为西园八校尉之一的右校尉,与蹇硕、袁绍、鲍鸿、曹操、赵融、冯芳、夏牟同列。为袁绍大将,与张郃、高览等人齐名。在官渡之战时镇守乌巢,遭到曹操的偷袭而惨败,自己也被曹操处斩。", + lvkuanglvxiang: + "吕旷(生卒年不详),与吕翔同是袁绍属下,袁绍去世后,为袁尚守东平,后来投降曹操,并被封为列侯。在《三国演义》中,在曹操准备往南准备攻击前,两人跟著大将曹仁和将军李典准备要攻击刘备。但吕旷被赵云刺下马身亡,而吕翔也死于张飞矛下,可以算是出师未捷身先死", + caobuxing: + "曹不兴,亦名弗兴,三国时著名画家。孙吴吴兴(今浙江湖州)人,生卒年不详。他在黄武年间(222—229年)享有很大的声誉。被称为“佛画之祖”。与东晋顾恺之、南朝宋陆探微、南朝梁张僧繇并称“六朝四大家”。又与赵达的算术、严武的弈棋、皇象的草书等号称“吴中八绝”。曹不兴善画龙、虎、马及人物,有“落墨为蝇”等传奇故事,其佛画成就对后世影响很大,相传其所画龙头令谢赫叹服不已。画迹今已不存,据《贞观公私画史》载,作品有《青溪龙》、《赤盘龙》、《南海监牧进十种马图》、《夷事夷兽样》、《桃源图》等,惜早已散佚。但之后的著名画家卫协直接师承其法。", + gaolan: "高览,生卒年不详,一名高奂,本属袁绍部将,后官渡之战淳于琼被曹操击破,与张郃一同投降曹操,被封为偏将军,东莱侯。《三国演义》里,曾与许褚、徐晃大战不分胜负。201年刘备败走荆州时,高览奉命追杀,三合斩刘辟,而后被冲阵而来的赵云刺死。", + xunchen: + "荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。", + sunshao: + "孙邵(163年-225年),字长绪,青州北海国人(今山东潍坊市昌乐县西)。原为北海相孔融的功曹,被孔融称赞为可任朝廷要职的人才,后随刘繇到达江东,继而辅佐孙权。孙权称吴王后,孙邵成为吴国首任丞相,数年后病逝。由于孙邵和当时吴国史官的关系并不是很好,因此在史书中并没有详细的记载。", + yuantanyuanshang: + "袁谭、袁尚分别是袁绍的长子和第三子。袁绍坐拥青州、冀州、幽州、并州,本是北方最强诸侯,却于官渡大败,惭恨而终。虽然袁绍生前偏爱小儿子袁尚,却并未在继承人上有明确表态,这也导致本应以嫡长子身份继承的袁谭因郭图、审配伪立遗令未能如愿。曹操击败袁绍后,进而渡过黄河追击袁家残余势力,袁谭告急,但袁尚仅给他少量兵力。曹操得郭嘉之计退兵坐观其变,恰使两人此前的种种矛盾彻底爆发,袁谭不敌便引狼入室,派辛毗作为使者向曹操求援,让袁尚不得不北逃投奔乌桓。但袁谭也在之后背叛曹操兵败被杀。没多久,乌桓也被平定,袁熙、袁尚二人投奔公孙康后被斩首送还曹操。", + xujing: "许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。", + hejin: "何进(?~189年),字遂高,南阳郡宛县(今河南南阳市宛城区)人。东汉时期外戚大臣,灵思皇后之兄。初以妹妹有宠,拜为郎中,出任虎贲中郎将、颍川太守,迁侍中、将作大匠、河南尹。黄巾起义时,拜为大将军,总镇京师,发现并镇压马元义的密谋,封为慎侯。为张大威望,在京师讲武结营,置西园八校尉。汉灵帝驾崩后,粉碎了中常侍蹇硕拥立皇子刘协的图谋,听从袁绍之言,博征智谋之士,内借元舅之资,外据辅政之权,独揽朝中大权。中平六年(189),不纳陈琳和曹操劝谏,阴结军阀董卓,联合袁绍谋诛宦竖。事情败露后,为中常侍张让等人损害,其后代是魏晋高门士族南阳何氏。", + hansui: "韩遂(?-215年),字文约。凉州金城郡人。东汉末年军阀、将领,汉末群雄之一。原名韩约,后改名遂。韩遂最初闻名于西州,被羌胡叛军劫持并推举为首领,以诛宦官为名举兵造反,聚众十万,先后败皇甫嵩、张温、董卓、孙坚等名将,使得天下骚动。后受朝廷招安,拥兵割据一方长达三十余年。韩遂曾与马腾结为异姓兄弟,后二人关系破裂。袁绍、曹操相争之际,马腾、韩遂被钟繇说服,依附于曹操。马腾入京后,留其子马超统领部队。马超推举韩遂为都督起兵反叛曹操,为曹操所败,韩遂逃奔凉州,后又为夏侯渊所败,病死(一说被杀),享年七十余岁。", + niujin: "牛金(生卒年不详),初为曹仁部曲将,周瑜军数万人来攻,前锋数千人始至,曹仁登城望,乃募得三百人,遣牛金迎战。但对方兵力较多,牛金遂被围困。曹仁亲自杀入阵中救出牛金。司马懿使牛金轻骑饵诱蜀军,刚交战诸葛亮就退兵,追至祁山。蜀将马岱入寇,司马懿遣将军牛金击退,斩千余级。公孙渊反,司马懿帅牛金、胡遵等步骑四万发自洛阳,后平定辽东。牛金官至后将军。", + jianggan: + "蒋干,字子翼,汉末三国时期的人物,九江(治今安徽寿县)人。历史上的蒋干是当时的名士、辩论家。而罗贯中在历史小说《三国演义》中则将蒋干刻画成了被周瑜所愚弄的小丑形象。", - caoying:"曹婴是在电影《三国志之见龙卸甲》中登场的虚拟人物,由李美琪饰演。曹婴是曹操的孙女,弓马娴熟,文武双全,深得曹操的用兵之道及心术。于凤鸣山一战中担任魏军大都督阻止诸葛亮北伐并因罗平安的告密而全歼关兴、张苞、赵云率领的蜀军部队。", - simahui:"司马徽(约145—208年),字德操,颍川阳翟(今河南禹州)人。东汉末年名士,精通道学、奇门、兵法、经学。有“水镜先生”之称。 司马徽为人清雅,学识广博,有知人之明,并向刘备推荐了诸葛亮、庞统等人,受到世人的敬重。", - baosanniang:"鲍三娘是中国民间传说中的人物,事迹多见于《花关索传》。相传她是鲍家庄鲍员外的小女儿。后来与关索成亲,关羽自传授其武艺,因此也造就了鲍三娘的文武双全。荆州失守之后鲍三娘就跟随关索一同投奔蜀汉,并随诸葛亮征讨南蛮。平定了南蛮之后,夫妻二人就此一直替诸葛亮镇守着南中,他们也的确留下了许多脍炙人口的行侠仗义故事,在民间广为流传。", + caoying: + "曹婴是在电影《三国志之见龙卸甲》中登场的虚拟人物,由李美琪饰演。曹婴是曹操的孙女,弓马娴熟,文武双全,深得曹操的用兵之道及心术。于凤鸣山一战中担任魏军大都督阻止诸葛亮北伐并因罗平安的告密而全歼关兴、张苞、赵云率领的蜀军部队。", + simahui: + "司马徽(约145—208年),字德操,颍川阳翟(今河南禹州)人。东汉末年名士,精通道学、奇门、兵法、经学。有“水镜先生”之称。 司马徽为人清雅,学识广博,有知人之明,并向刘备推荐了诸葛亮、庞统等人,受到世人的敬重。", + baosanniang: + "鲍三娘是中国民间传说中的人物,事迹多见于《花关索传》。相传她是鲍家庄鲍员外的小女儿。后来与关索成亲,关羽自传授其武艺,因此也造就了鲍三娘的文武双全。荆州失守之后鲍三娘就跟随关索一同投奔蜀汉,并随诸葛亮征讨南蛮。平定了南蛮之后,夫妻二人就此一直替诸葛亮镇守着南中,他们也的确留下了许多脍炙人口的行侠仗义故事,在民间广为流传。", - pangdegong:"庞德公,字尚长,荆州襄阳人,东汉末年名士、隐士。 庞德公与当时徐庶、司马徽、诸葛亮、庞统等人交往密切。庞德公曾称诸葛亮为\"卧龙\",庞统为\"凤雏\",司马徽为\"水镜\",被誉为知人。对诸葛亮、庞统等人早年影响较大,并得到诸葛亮的敬重。庞德公最后隐居于鹿门山,采药而终。", - zhaotongzhaoguang:"赵统,赵云长子,生卒年不详。常山真定(今为河北正定)人,陈寿在正史《三国志》中记载赵云去世后,赵统袭爵永昌亭侯,官至蜀汉虎贲中郎督,加行领军。赵广(?—263年),三国时期蜀汉牙门将,赵云的次子,赵统之弟。随姜维前往沓中,官拜牙门将。曹魏司马氏派五路大军伐蜀时,随大将军姜维与魏兵战于疆川口,姜维败绩还守剑阁,赵广于沓中战死。", - majun:"马钧,字德衡,扶风(今陕西扶风)人,生活在汉朝末期,是中国古代科技史上最负盛名的机械发明家之一。马钧年幼时家境贫寒,自己又有口吃的毛病,所以不擅言谈却精于巧思,后来在魏国担任给事中的官职。马钧最突出的表现有还原指南车;改进当时操作笨重的织绫机;发明一种由低处向高地引水的龙骨水车;制作出一种轮转式发石机,能连续发射石块,远至数百步;把木制原动轮装于木偶下面,叫做“水转百戏”。此后,马钧还改制了诸葛连弩,对科学发展和技术进步做出了贡献。", - simazhao:"司马昭(211年—265年9月6日),字子上(小说《三国演义》为子尚),河内温县(今属河南)人。三国时期曹魏权臣,西晋王朝的奠基人之一。为晋宣帝司马懿与宣穆皇后张春华次子、晋景帝司马师之弟、晋武帝司马炎之父。 司马昭早年随父抗击蜀汉,多有战功。累官洛阳典农中郎将,封新城乡侯。正元二年(255年),继兄司马师为大将军,专揽国政。甘露五年(260年),魏帝曹髦被弑杀,司马昭立曹奂为帝。景元四年(263年),分兵遣钟会、邓艾、诸葛绪三路灭亡蜀汉,受封晋公。次年,进爵晋王。 咸熙二年(265年),司马昭病逝,年五十四,葬于崇阳陵。数月后,其子司马炎代魏称帝,建立晋朝,追尊司马昭为文帝,庙号太祖。", - wangyuanji:"王元姬(217年—268年4月20日),东海郯县(今山东郯城西北)人。三国时期曹魏经学家王朗之孙女、王肃之女,晋文帝司马昭妻子,晋武帝司马炎与齐王司马攸的生母。 王元姬幼时便通《诗经》、《论语》,嫁司马昭后竭尽妇道、谦虚谨慎。其人颇有远见,曾预言钟会谋反之事。泰始元年(265年),司马炎建立西晋,尊王元姬为皇太后,宫号曰崇化宫。王元姬身处太后之位,提倡节俭,身体力行,作为众妃子的表率。在其治理之下,后宫井井有条,众人和睦相处。 泰始四年(268年),王元姬崩逝,终年五十二岁。谥号文明皇后,与司马昭合葬于崇阳陵。", + pangdegong: + '庞德公,字尚长,荆州襄阳人,东汉末年名士、隐士。 庞德公与当时徐庶、司马徽、诸葛亮、庞统等人交往密切。庞德公曾称诸葛亮为"卧龙",庞统为"凤雏",司马徽为"水镜",被誉为知人。对诸葛亮、庞统等人早年影响较大,并得到诸葛亮的敬重。庞德公最后隐居于鹿门山,采药而终。', + zhaotongzhaoguang: + "赵统,赵云长子,生卒年不详。常山真定(今为河北正定)人,陈寿在正史《三国志》中记载赵云去世后,赵统袭爵永昌亭侯,官至蜀汉虎贲中郎督,加行领军。赵广(?—263年),三国时期蜀汉牙门将,赵云的次子,赵统之弟。随姜维前往沓中,官拜牙门将。曹魏司马氏派五路大军伐蜀时,随大将军姜维与魏兵战于疆川口,姜维败绩还守剑阁,赵广于沓中战死。", + majun: "马钧,字德衡,扶风(今陕西扶风)人,生活在汉朝末期,是中国古代科技史上最负盛名的机械发明家之一。马钧年幼时家境贫寒,自己又有口吃的毛病,所以不擅言谈却精于巧思,后来在魏国担任给事中的官职。马钧最突出的表现有还原指南车;改进当时操作笨重的织绫机;发明一种由低处向高地引水的龙骨水车;制作出一种轮转式发石机,能连续发射石块,远至数百步;把木制原动轮装于木偶下面,叫做“水转百戏”。此后,马钧还改制了诸葛连弩,对科学发展和技术进步做出了贡献。", + simazhao: + "司马昭(211年—265年9月6日),字子上(小说《三国演义》为子尚),河内温县(今属河南)人。三国时期曹魏权臣,西晋王朝的奠基人之一。为晋宣帝司马懿与宣穆皇后张春华次子、晋景帝司马师之弟、晋武帝司马炎之父。 司马昭早年随父抗击蜀汉,多有战功。累官洛阳典农中郎将,封新城乡侯。正元二年(255年),继兄司马师为大将军,专揽国政。甘露五年(260年),魏帝曹髦被弑杀,司马昭立曹奂为帝。景元四年(263年),分兵遣钟会、邓艾、诸葛绪三路灭亡蜀汉,受封晋公。次年,进爵晋王。 咸熙二年(265年),司马昭病逝,年五十四,葬于崇阳陵。数月后,其子司马炎代魏称帝,建立晋朝,追尊司马昭为文帝,庙号太祖。", + wangyuanji: + "王元姬(217年—268年4月20日),东海郯县(今山东郯城西北)人。三国时期曹魏经学家王朗之孙女、王肃之女,晋文帝司马昭妻子,晋武帝司马炎与齐王司马攸的生母。 王元姬幼时便通《诗经》、《论语》,嫁司马昭后竭尽妇道、谦虚谨慎。其人颇有远见,曾预言钟会谋反之事。泰始元年(265年),司马炎建立西晋,尊王元姬为皇太后,宫号曰崇化宫。王元姬身处太后之位,提倡节俭,身体力行,作为众妃子的表率。在其治理之下,后宫井井有条,众人和睦相处。 泰始四年(268年),王元姬崩逝,终年五十二岁。谥号文明皇后,与司马昭合葬于崇阳陵。", - liuye:'刘晔(?-234年),字子扬,淮南成德人,是光武帝刘秀之子阜陵王刘延的后代,三国时期魏国著名的战略家。刘晔年少知名,人称有佐世之才,是曹操手下举足轻重的谋士,他屡献妙计,对天下形势的发展往往一语中的。刘晔历仕数朝,是曹魏的三朝元老。', - luzhi:'鲁芝(190年—273年),字世英。扶风郡郿县(今陕西眉县)人。魏晋时期名臣。官至光禄大夫,位特进,封阴平侯。泰始九年(273年)卒,时年八十四。谥号“贞”。', - xizhicai:'戏志才(生卒年不详),或志才为字,名不详(一说名忠),东汉颍川郡(今河南禹州)人。经张邈推荐,成为曹操手下谋士。为人多谋略,曹操十分器重,不幸早卒。三国演义中并无此人,三国志中只有寥寥数语。由荀彧推荐给曹操,被称为有“负俗之讥”。死后,荀彧又举荐了郭嘉。
    陈寿《三国志》记载:太祖与荀彧书曰:自志才亡后,莫可与计事者。汝、颍固多奇士,谁可以继之?彧荐嘉。', - sunqian:'孙乾(?—约215年),字公祐。北海郡(治今山东昌乐西)人。东汉末年刘备的幕僚。最初被大儒郑玄推荐于州里。刘备领徐州,以孙乾为从事。自徐州跟随刘备,多次作为刘备的使臣。刘备定益州后,拜孙乾为秉忠将军,其待遇仅次于麋竺,与简雍相同。不久后便病逝。', - miheng:'祢衡(173年-198年),字正平,平原郡(今山东德州临邑德平镇)人。个性恃才傲物.和孔融交好。孔融著有《荐祢衡表》,向曹操推荐祢衡,但是祢衡称病不肯去,曹操封他为鼓手,想要羞辱祢衡,却反而被祢衡裸身击鼓而羞辱。后来祢衡骂曹操,曹操就把他遣送给刘表,祢衡对刘表也很轻慢,刘表又把他送去给江夏太守黄祖,最后因为和黄祖言语冲突而被杀,时年二十六岁。黄祖对杀害祢衡一事感到十分后悔,便将其加以厚葬。', - quyi:'麴义(又作曲义、鞠义),生卒年不详,是东汉末年军阀袁绍部下的将领,能征善战,屡建战功,早年在凉州,精通羌人战法,率领着袁绍的精锐部队。后来由于自恃功高而骄纵不轨,被袁绍所杀。', - taoqian:'陶谦(132年-194年),字恭祖。丹阳郡(治今安徽宣城)人。汉末群雄之一。陶谦最初为诸生,在州郡任职,被举茂才,历任舒、卢二县令、幽州刺史、议郎,性格刚直,有大志。后随左车骑将军皇甫嵩对抗北宫伯玉,任扬武校尉,之后又随张温征韩遂、边章。中平五年(188年),徐州黄巾起,陶谦被朝廷任为徐州刺史,击破徐州黄巾,并推行屯田,恢复生产。尔后听从王朗、赵昱建议遣使进京朝贡,获拜安东将军、徐州牧,封溧阳侯。晚年因战事上为曹操大败,徐州大半几乎遭兵祸所害,以致过度忧劳而逝,终年六十三岁。', - wangyun:'王允(137~192年),字子师,太原郡祁县(今山西祁县)人。东汉末年时期大臣。出身太原王氏,世代官宦。举孝廉出身,司徒高第征为侍御史。出任豫州刺史,勤政爱民。斗争中常侍张让失败后,去官隐居。中平六年,大将军何进掌权之后,辟为从事中郎,迁河南尹。董卓拥立汉献帝即位后,代替杨彪,拜太仆、尚书令、司徒,密谋刺死董卓,联合吕布共同执政,日益骄傲自满。初平三年(192年),董卓余党李傕、郭汜、樊稠等攻破长安。王允兵败处死,时年五十六岁。', - bianfuren:'武宣皇后卞氏(159年12月30日-230年7月9日),琅邪开阳(今山东临沂)人,魏武帝曹操的正妻(继室),魏文帝曹丕、任城威王曹彰、陈思王曹植、萧怀王曹熊的母亲。原本是倡家,即汉代专门从事音乐歌舞的乐人家庭,后来与曹操成婚,建安初年,原配丁夫人被废,卞夫人成为曹操的正妻。曹丕继位后尊其为皇太后,曹叡继位后尊其为太皇太后。卞后在太和四年去世,与魏武帝曹操合葬高陵。', - shamoke:'沙摩柯(?-222年),东汉末三国时期五溪蛮首领。汉章武元年(221年)初,为报关羽被东吴杀害之仇,刘备亲自领兵攻孙权,以金锦爵赏诱沙摩柯助战。章武二年(222年),吴大都督陆逊以火攻破刘备,率诸军齐击,汉军四十多个营寨被攻破,沙摩柯在大乱中匹马奔逃,被乱军杀死。', - lvfan:'吕范(?-228年),字子衡。汝南郡细阳县(今安徽太和)人。汉末至三国时期吴国重臣。吕范年轻为汝南县吏,后避难寿春,结识孙策。此后随孙策、孙权征伐四方,对稳固孙氏在江东的统治做出了杰出的贡献,孙权将其比之于东汉开国元勋吴汉。吴国建立后,吕范累官至前将军、假节、扬州牧,封南昌侯。黄武七年(228年),吕范被拜为大司马,未得授官,便已病逝。孙权悲痛不已,遣使赠其大司马印绶。孙权还都建业后,以太牢礼祭祀吕范。', - liqueguosi:"请分别查看「李傕」和「郭汜」的武将介绍。", - maojie:"毛玠(?—216年),字孝先,陈留平丘(今河南封丘)人。东汉末年大臣。年少时为县吏,以清廉公正著称。因战乱而打算到荆州避乱,但中途知道刘表政令不严明,因而改往鲁阳。后来投靠曹操,提出“奉天子以令不臣,脩耕植,畜军资”的战略规划,得到曹操的欣赏。
    毛玠与崔琰主持选举,所举用的都是清廉正直之士。而毛玠为人廉洁,激起天下廉洁之风,一改朝中奢华风气。曹操大为赞赏,曹丕也亲自去拜访他。
    曹操获封魏公后,毛玠改任尚书仆射,再典选举。又密谏曹操应该立嫡长子曹丕为魏国太子。崔琰被杀后,毛玠十分不快。后来有人诬告毛玠,曹操大怒,将毛玠收于狱中。及后在桓阶、和洽营救下,只被免职,不久逝世于家中。曹操在他死后赐他棺材和钱帛。", + liuye: "刘晔(?-234年),字子扬,淮南成德人,是光武帝刘秀之子阜陵王刘延的后代,三国时期魏国著名的战略家。刘晔年少知名,人称有佐世之才,是曹操手下举足轻重的谋士,他屡献妙计,对天下形势的发展往往一语中的。刘晔历仕数朝,是曹魏的三朝元老。", + luzhi: "鲁芝(190年—273年),字世英。扶风郡郿县(今陕西眉县)人。魏晋时期名臣。官至光禄大夫,位特进,封阴平侯。泰始九年(273年)卒,时年八十四。谥号“贞”。", + xizhicai: + "戏志才(生卒年不详),或志才为字,名不详(一说名忠),东汉颍川郡(今河南禹州)人。经张邈推荐,成为曹操手下谋士。为人多谋略,曹操十分器重,不幸早卒。三国演义中并无此人,三国志中只有寥寥数语。由荀彧推荐给曹操,被称为有“负俗之讥”。死后,荀彧又举荐了郭嘉。
    陈寿《三国志》记载:太祖与荀彧书曰:自志才亡后,莫可与计事者。汝、颍固多奇士,谁可以继之?彧荐嘉。", + sunqian: + "孙乾(?—约215年),字公祐。北海郡(治今山东昌乐西)人。东汉末年刘备的幕僚。最初被大儒郑玄推荐于州里。刘备领徐州,以孙乾为从事。自徐州跟随刘备,多次作为刘备的使臣。刘备定益州后,拜孙乾为秉忠将军,其待遇仅次于麋竺,与简雍相同。不久后便病逝。", + miheng: "祢衡(173年-198年),字正平,平原郡(今山东德州临邑德平镇)人。个性恃才傲物.和孔融交好。孔融著有《荐祢衡表》,向曹操推荐祢衡,但是祢衡称病不肯去,曹操封他为鼓手,想要羞辱祢衡,却反而被祢衡裸身击鼓而羞辱。后来祢衡骂曹操,曹操就把他遣送给刘表,祢衡对刘表也很轻慢,刘表又把他送去给江夏太守黄祖,最后因为和黄祖言语冲突而被杀,时年二十六岁。黄祖对杀害祢衡一事感到十分后悔,便将其加以厚葬。", + quyi: "麴义(又作曲义、鞠义),生卒年不详,是东汉末年军阀袁绍部下的将领,能征善战,屡建战功,早年在凉州,精通羌人战法,率领着袁绍的精锐部队。后来由于自恃功高而骄纵不轨,被袁绍所杀。", + taoqian: + "陶谦(132年-194年),字恭祖。丹阳郡(治今安徽宣城)人。汉末群雄之一。陶谦最初为诸生,在州郡任职,被举茂才,历任舒、卢二县令、幽州刺史、议郎,性格刚直,有大志。后随左车骑将军皇甫嵩对抗北宫伯玉,任扬武校尉,之后又随张温征韩遂、边章。中平五年(188年),徐州黄巾起,陶谦被朝廷任为徐州刺史,击破徐州黄巾,并推行屯田,恢复生产。尔后听从王朗、赵昱建议遣使进京朝贡,获拜安东将军、徐州牧,封溧阳侯。晚年因战事上为曹操大败,徐州大半几乎遭兵祸所害,以致过度忧劳而逝,终年六十三岁。", + wangyun: + "王允(137~192年),字子师,太原郡祁县(今山西祁县)人。东汉末年时期大臣。出身太原王氏,世代官宦。举孝廉出身,司徒高第征为侍御史。出任豫州刺史,勤政爱民。斗争中常侍张让失败后,去官隐居。中平六年,大将军何进掌权之后,辟为从事中郎,迁河南尹。董卓拥立汉献帝即位后,代替杨彪,拜太仆、尚书令、司徒,密谋刺死董卓,联合吕布共同执政,日益骄傲自满。初平三年(192年),董卓余党李傕、郭汜、樊稠等攻破长安。王允兵败处死,时年五十六岁。", + bianfuren: + "武宣皇后卞氏(159年12月30日-230年7月9日),琅邪开阳(今山东临沂)人,魏武帝曹操的正妻(继室),魏文帝曹丕、任城威王曹彰、陈思王曹植、萧怀王曹熊的母亲。原本是倡家,即汉代专门从事音乐歌舞的乐人家庭,后来与曹操成婚,建安初年,原配丁夫人被废,卞夫人成为曹操的正妻。曹丕继位后尊其为皇太后,曹叡继位后尊其为太皇太后。卞后在太和四年去世,与魏武帝曹操合葬高陵。", + shamoke: + "沙摩柯(?-222年),东汉末三国时期五溪蛮首领。汉章武元年(221年)初,为报关羽被东吴杀害之仇,刘备亲自领兵攻孙权,以金锦爵赏诱沙摩柯助战。章武二年(222年),吴大都督陆逊以火攻破刘备,率诸军齐击,汉军四十多个营寨被攻破,沙摩柯在大乱中匹马奔逃,被乱军杀死。", + lvfan: "吕范(?-228年),字子衡。汝南郡细阳县(今安徽太和)人。汉末至三国时期吴国重臣。吕范年轻为汝南县吏,后避难寿春,结识孙策。此后随孙策、孙权征伐四方,对稳固孙氏在江东的统治做出了杰出的贡献,孙权将其比之于东汉开国元勋吴汉。吴国建立后,吕范累官至前将军、假节、扬州牧,封南昌侯。黄武七年(228年),吕范被拜为大司马,未得授官,便已病逝。孙权悲痛不已,遣使赠其大司马印绶。孙权还都建业后,以太牢礼祭祀吕范。", + liqueguosi: "请分别查看「李傕」和「郭汜」的武将介绍。", + maojie: "毛玠(?—216年),字孝先,陈留平丘(今河南封丘)人。东汉末年大臣。年少时为县吏,以清廉公正著称。因战乱而打算到荆州避乱,但中途知道刘表政令不严明,因而改往鲁阳。后来投靠曹操,提出“奉天子以令不臣,脩耕植,畜军资”的战略规划,得到曹操的欣赏。
    毛玠与崔琰主持选举,所举用的都是清廉正直之士。而毛玠为人廉洁,激起天下廉洁之风,一改朝中奢华风气。曹操大为赞赏,曹丕也亲自去拜访他。
    曹操获封魏公后,毛玠改任尚书仆射,再典选举。又密谏曹操应该立嫡长子曹丕为魏国太子。崔琰被杀后,毛玠十分不快。后来有人诬告毛玠,曹操大怒,将毛玠收于狱中。及后在桓阶、和洽营救下,只被免职,不久逝世于家中。曹操在他死后赐他棺材和钱帛。", - huangfusong:'字义真。安定郡朝那县(今宁夏彭阳)人。于黄巾起义时,以中郎将身份讨伐黄巾,用火攻大破张梁、张宝。后接替董卓进攻张梁,连胜七阵。掘张角墓,拜左车骑将军、冀州牧,因拒绝贿赂宦官而被免职。 董卓死,王允命其与吕布等共至郿坞抄籍董卓家产、人口,皇甫嵩将坞中所藏良家子女,尽行释放。', - zangba:'其父臧戒,有二子臧艾与臧舜。年少时曾召集数人将获罪的父亲救出,此后四处流亡。后来成为陶谦麾下的骑都尉,负责募兵抵抗黄巾军。与孙观、尹礼等人拥兵驻屯于开阳,自成一股独立势力,后跟随吕布。吕布战败后,投降了曹操。后与袁绍、孙权等的战役里战功赫赫,官至镇东将军。', - zhangren:'刘璋的属下,以忠勇著称。刘备入蜀时,张任曾劝刘璋提防刘备,但刘璋没有听从。魏延舞剑想趁机除掉刘璋时,张任出面对舞,解救刘璋。后在刘备进攻时于落凤坡射死了庞统。', - jiling:'东汉末年袁术帐下将领,勇猛非常,曾奉命率军攻打小沛的刘备,在吕布辕门射戟的调停下撤兵。', - zoushi:'军阀张济之妻,张绣之婶。张绣降曹后,邹氏遂被曹操霸占。贾诩献计趁机诛杀曹操,险些得手。曹操在损失爱将典韦、侄子曹安民和长子曹昂后方才逃出生天。', - ganfuren:'刘备起兵后,于沛城娶甘氏为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。', - jiangfei:'请分别查看「蒋琬」和「费袆」的武将介绍。', - mifuren:'刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。', - chendong:'陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。', - jiangqing:'擅长弓术。与周泰原为活跃于长江一带的江贼,孙策脱离袁术下江东自立门户时,和周泰一起率众投靠。 孙策攻刘繇,并引出城中麾下的陈横、薛礼、张英三名将领,陈横后被蒋钦一箭射杀,后与韩当等将乘舟过江,乱箭射杀敌军。曾在赤壁之战与周泰,还有擅使长枪的韩当率领水军在三江口踏江破敌。', - kongrong:'字文举,鲁国人,东汉文学家,“建安七子”之首。献帝即位后任北军中侯、虎贲中郎将、北海相,时称孔北海后因触怒曹操,为曹操所杀。能诗善文。', - mateng:'字寿成,扶风茂陵人,东汉末年征西将军,割据西凉一带的军阀,伏波将军马援的后代,官至卫尉,封爵槐里乡侯。因其子马超谋反,而被杀,夷灭三族。', - tianfeng:'字元皓。东汉末年大军阀袁绍部下重要谋士。为人刚直不阿,曾多次向袁绍进言而不被采纳。后因谏阻袁绍征伐曹操而被袁绍下令监禁,并于官渡之战后,被袁绍杀害。', - caochun:'字子和,沛国谯(今安徽亳州)人。东汉末年曹操麾下将领,曹仁之弟。曹纯是曹操部下精锐部队“虎豹骑”的统领者之一,因在平定北方的战役中颇有功绩,被加封为高陵亭侯。死后谥曰威侯。曹纯擅战,甚得人心,为人重纲纪,不失理智,好学问,敬爱学士,闻名天下。', - hanba:'中国古代神话传说中引起旱灾的怪物。《诗·大雅·云汉》:“旱魃为虐,如惔如焚。”', - cuiyan:'字季珪,清河东武城(今河北省清河县)人。东汉末年名士,司空崔林的从兄,曹操帐下谋士。崔琰相貌俊美,很有威望,曹操对他也很敬畏。建安二十一年(216年),崔琰在给杨训的书信中写道“时乎时乎,会当有变时”,曹操认为此句有不逊之意,因而将崔琰下狱,不久崔琰即被曹操赐死。', - lifeng:'南阳(治今河南南阳)人,三国时期蜀汉大臣李严之子。230年,李严迁为骠骑将军,率军前往汉中,诸葛亮上表推举李丰为江州都督督军,以代替李严管理后方事务。李严去世后,李丰在蜀汉官至朱提太守。', - sunru:'孙茹,孙坚之妹,其名载于《江浙通志》中。儿子徐琨亦为孙吴早期名将,当初母子二人随军跟从孙策渡长江时,因为暂时没足够的船,孙策感到苦恼打算暂时驻军江边。孙茹夫人献计以芦苇为筏,孙策大喜。吴军遂以神不知鬼不觉的速度过长江击破刘繇部将张英,立下平江东第一功。', - lingcao:'东汉末年将领,吴郡余杭(今浙江余杭)人,凌统之父。早年跟随孙策转战江东。孙权统军后,凌操随其征伐黄祖,被甘宁射杀。《吴书》载:甘宁以善射,将兵在后,射杀校尉凌操', - zhugeguo:'诸葛果,为《历代神仙通鉴》中诸葛亮女儿的名字,《历代神仙通鉴》记录从上古到明代的神仙历史,因此诸葛果不见于任何史书。成都西南有朝真观,即乘烟观。相传,诸葛果在这里修行后成仙升天。', - zhuling:'朱灵(生卒年不详),字文博,冀州清河国人,三国时期曹魏名将。官至后将军,封为高唐侯,谥号威侯。初为袁绍部将,后归顺曹操,随曹操征伐四方,屡建战功。', - re_yuanshu:'字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。', - fuwan:'伏完(?-209),琅邪东武(今属山东)人,东汉末大臣,汉献帝伏皇后之父。历官辅国将军、中散大夫、屯骑校尉。', - liuxie:'字伯和,又字合。汉族,祖籍沛县,生于洛阳。汉灵帝第三子,被董卓迎立为帝。董卓被王允和吕布诛杀后,董卓部将李傕等攻入长安,再次挟持了他,后来逃出长安。公元196年,曹操控制了刘协,并迁都许昌,“挟天子以令诸侯”。公元220年,曹操病死,刘协被曹丕控制,随后被迫禅让于曹丕。', - yuanshu:'字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。', - gongsunzan:'字伯珪,汉族,号“白马义从”。辽西令支人。东汉末年献帝年间占据幽州一带的军阀,汉末群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。', - caohong:'字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。', - guanyinping:'河东解县(今山西运城)人,美髯公关羽之女。因在关羽的四个子女中排行第三,故又被称作“关三小姐”、“关氏三姐”或“关羽三小姐”。传说她是赵云的弟子、并随同诸葛亮平定南蛮。', - xiahouba:'夏侯渊次子。本为曹魏武将,后因司马懿诛曹爽一族,夏侯霸身为曹氏宗室而心怀不安,遂投降蜀汉。后随蜀将姜维北伐,官至车骑将军。', - daxiaoqiao:'大乔,庐江皖县人,为乔公长女,孙策之妻,容貌国色流离。小乔为大乔之妹,周瑜之妻,资貌绝伦。两人合称“二乔”。', - yuejin:'字文谦,魏“五子良将”之一。容貌短小,以胆烈跟从曹操,南征北讨,战功无数。从击袁绍于官渡,奋勇力战,斩袁绍部将淳于琼。又从击袁绍子谭、尚于黎阳,斩其大将严敬。从平荆州,留屯襄阳,进击关羽、苏非等人,击退其众,南郡诸郡的山谷蛮夷都前往乐进处投降。后来从曹操征孙权,假进节。曹操回师后,留乐进与张辽、李典屯于合肥。又以乐进数有军功,迁右将军。建安二十三年逝世,谥曰威侯。', - caoang:'字子修,曹操的长子,由于性情谦和且聪慧所以深得曹操喜爱。曹操征讨张绣时,羞辱张绣之婶邹氏,被张绣突然袭击。曹昂为保护曹操撤退,与典韦一起战死在宛城。', - zhugejin:'字子瑜,吴国大臣,诸葛亮之兄,诸葛恪之父。经鲁肃推荐,为东吴效力。胸怀宽广,温厚诚信,得到孙权的深深信赖,努力缓和蜀汉与东吴的关系。建安二十五年(220年)吕蒙病逝,诸葛瑾代吕蒙领南郡太守,驻守公安。孙权称帝后,诸葛瑾官至大将军,领豫州牧。', - zhangxingcai:'蜀名将张飞与夏侯氏所生之女,刘禅的妻子,史上称为“敬哀皇后”。', - zumao:'字大荣,吴郡富春人,使用双刀。孙坚在汜水关被华雄击败,祖茂为保护主公而主动提出与孙坚交换头盔,孙坚因此得脱。祖茂将孙坚的赤帻挂在柱子上,准备以此引诱华雄,趁机偷袭,却反被华雄所杀。', - dingfeng:'吴国将领。年少时以骁勇为小将,经常奋勇杀敌,屡立功勋,此后又于东兴之战中“雪中奋短兵”,大破侵犯东吴的魏军。吴景帝孙休在位时,丁奉设计除掉了东吴的权臣孙綝,被拜为大将军,后为右大司马、左军师。', - panfeng:'冀州牧韩馥部下的上将。当十八路诸侯讨伐董卓之时,他奉韩馥之命前往汜水关前挑战董卓部下大将华雄,不敌被斩。', - maliang:'字季常,因眉毛中有白毛,人称白眉马良,马谡的兄长。马良在兄弟五人中名声最佳,因此有“马氏五常,白眉最良”的说法。', - zhugedan:'字公休,曹魏后期的重要将领,诸葛亮的族弟。曾与司马师一同平定毌丘俭、文钦的叛乱。之后因与被诛的夏侯玄、邓飏交厚,且见到王淩、毌丘俭等人的覆灭而心不自安,于甘露二年起兵,并得到东吴的支援,但于次年被镇压,被大将军司马胡奋所斩。', - hetaihou:'大将军何进的妹妹,汉灵帝刘宏第二任皇后,汉少帝刘辩的生母。何氏出身于屠户家庭,后选入掖庭,得到汉灵帝临幸,生下皇子刘辩,并受封贵人。光和三年(180年),立为皇后。中平六年(189年),汉灵帝去世,刘辩继位,尊何氏为皇太后。董卓进京,废黜刘辩,不久毒杀刘辩及何氏。', - sunluyu:'又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。', - wenpin:'本为刘表大将,刘表死后,跟随刘琮投降曹操。后曹操令其镇守江夏,多次阻止了关羽和孙权的进攻,为曹操倚为屏障的大将之一。', - zhanglu:'汉宁太守,继父祖之后传播五斗米教。刘璋杀张鲁之母,二人因此结仇,多次交战。刘备攻益州时,刘璋向张鲁求援。张鲁派马超前往,但马超投降刘备。张鲁后见曹操自封魏王,想要自立为汉宁王,为谋士阎圃劝免。后曹操讨汉中,张鲁败,众人劝其烧粮仓,张鲁认为这是国家之物,未听从,为曹操所称赞。后投降曹操,任镇南将军。', - mayunlu:'马腾之女,马超之妹,赵云之妻。父亲令其自幼习武,枪术非凡,寻常男子也是难以匹敌。', - tadun:'东汉末年辽西乌桓(亦称乌丸)的首领,乌桓大人丘力居的从子,总摄三王部。曾出兵协助袁绍,击破公孙瓒。此后受袁绍假传朝廷诏命,与三王难楼、苏仆延、乌延等人同受单于称号及印绶。后难楼、苏仆延率其部众奉立楼班为单于,蹋顿于是退位为王。袁绍死后,收到被曹操击败的袁尚的求助,纠集逃亡至乌桓的幽州、冀州官吏百姓,企图夺回河北。东汉建安十二年,曹操亲征乌桓。八月,乌桓、袁氏部队于柳城白狼山为曹军所败,蹋顿在此战中被曹操的先锋张辽所斩杀。 ', - yanbaihu:'吴郡乌程县人,原名“严虎”,别号“白虎”,东汉末年盘据吴郡一带山贼出身的地方豪帅。献帝初拥兵万人自固。孙策受袁术使渡江,攻破白虎等。白虎奔余杭,投靠许昭。建安二年,再度被孙策击败,至此不知亡佚何处。', - simalang:'字伯达,“司马八达”之一。曹操任司空后,司马朗被辟为司空属官,又历任成皋令、堂阳长、元城令、丞相主簿、兖州刺史等职,所在皆有政绩,深受百姓爱戴。后司马朗与夏侯惇、臧霸等征讨吴国,到达居巢。军队中流行瘟疫,司马朗亲自去视察,派送医药,因此染病去世。', - wangji:'字伯舆,东莱曲城人。三国时期魏国将领。王基文武兼备,才高于世,德溥于时,深得司马懿、司马师、司马昭的器重,尤其在南征毋丘俭,文钦之乱,东征诸葛诞之叛大规模军事活动中,王基与司马师、司马昭结下了深厚的军友情谊。魏景元二年王基去世,追赠司空,谥号为景侯。', - buzhi:'吴重臣,最初避难江东,于孙权统事后,被召为主记。后游历吴地,又任海盐县长,还任东曹掾,出领鄱阳太守。建安十五年,转交州刺史、立武中郎将,率军接管往交州,追拜使持节、征南中郎将。次年,以平定交州功,加平戎将军,封广信侯。后迁右将军、左护军,改封临湘侯。孙权称帝后,拜骠骑将军,领冀州牧,后因冀州分与蜀汉而解牧职。又都督西陵。赤乌九年,代陆逊为丞相。', - litong:'字文达,小字万亿。江夏平春(今河南信阳)人,汝南太守。早年以游侠闻名于江汝,在率众补充曹操兵源有功拜为阳安都尉,其间不因私而忘公,不因其妻子的求请而过问执法者。后来在曹操讨伐马超时出阵挑战,死于马超枪下。', - mizhu:'原为徐州富商,后被徐州牧陶谦辟为别驾从事。陶谦病死后,奉其遗命迎接刘备。与其弟麋芳拒绝曹操的任命而跟随刘备,在刘备最潦倒之时给予刘备很大的帮助,使他重新振作。214年(建安十九年),刘备入主益州后,拜麋竺为安汉将军,地位在诸葛亮之上,为刘备手下众臣之最。吕蒙袭取荆州,麋芳举城投降,导致关羽兵败身亡,麋竺面缚请罪,刘备劝慰麋竺,对他待遇如初。', - dongbai:'东汉末年县君,陇西临洮(今甘肃省岷县)人,董卓之孙女。董卓当权时,遍封其宗族,其中孙女董白尚未及笄,被封为渭阳君。', - zhaoxiang:'赵云与马云騄之女,赵统赵广之妹,关平之妻。', - heqi:'早年在平定山越的战争中立有大功,又讨平叛乱无数,身经百战,所向披靡,深受孙权器重。后来在与魏国的多次边境争斗中也屡立战功,官至后将军,并领徐州牧。', - dongyun:'大汉重臣,掌军中郎将董和之子。东汉末年,其父董和事刘璋为益州太守,刘备立太子时,允被选为洗马,后为黄门侍郎,延熙六年(公元243年)加辅国将军,延熙七年(公元244年)以侍中守尚书令,任大将军费祎的副手。', - mazhong:'本名狐笃,字德信,巴西阆中人,初次出场时随丞相诸葛亮南征孟获,诸葛亮遣马忠与赵云两路夹攻,大败蛮将阿会喃。孟获派弟孟优赴汉军处假投降,欲内应外合,诸葛亮将计就计,埋伏擒获孟获和诸洞酋长,马忠亦于此战立下战功。后诸葛亮北伐时亦数次出阵,立下汗马功劳。', - kanze:'孙权谋士,在孙权广纳贤才之时与严畯等来到江东,甚为孙权礼遇。第一个识破周瑜打黄盖是苦肉计,后欣然向曹操献诈降书,被曹操识破后面不改色,哈哈大笑,一番妙言让曹操相信了诈降书,是苦肉计中的关键人物。后劝孙权不要设局请关羽。在刘备御驾亲征东吴时,向孙权举荐陆逊为都督,间接上挽救了东吴的命运。', - lingju:'相传为吕布与貂蝉的女儿,被汉献帝掳走并训练为死士,被秘密送入宫中接近曹操,成为其“忘年红颜知己”。外表是柔弱的女子,实际上身怀致命的杀人绝技,等待时机给予曹操致命一击。', - yangxiu:'字德祖,今陕西华阴人,是东汉末年的文学家。杨修学问渊博,极聪慧,任丞相府主簿。史载,“是时,军国多事,修总知外内,事皆称意”。', - chenlin:'陈琳(?-217年),字孔璋,广陵射阳(今江苏宝应)人。东汉末年著名文学家,“建安七子”之一。', - zhugeke:'字元逊,琅邪阳都(今山东沂南)人。三国时期吴臣,蜀丞相诸葛亮之侄,吴大将军诸葛瑾长子,从小就以神童著称,深受孙权赏识。', - zhangbao:'东汉末年黄巾起义的首领之一,张角之弟,张梁之兄。中平元年(184)随兄张角起义,号称“地公将军”。', - chengyu:'字仲德,本名程立,因梦中於泰山捧日,更名程昱。荀彧投曹操时向其举荐程昱。他参与了攻打吕布、袁绍、刘备、孙权的大部份战事,一直出谋献策,表现出众。', - sunhao:'孙权之孙,孙和之子,东吴的末代君主。在位初期虽施行过明政,但不久即沉溺酒色,专于杀戮,变得昏庸暴虐,嗜用挖眼、剥皮等酷刑。280年,吴国被西晋所灭,孙皓投降西晋,被封为归命侯。', - wutugu:'南蛮乌戈国主,身长丈二(约合现在2.77米),不食五谷,以生蛇恶兽为饭。身有鳞甲,刀箭不能侵。兀突骨乘骑巨象,头戴日月狼须帽,身披金珠缨络,两肋下露出生鳞甲,眼目中微有光芒。', - shixie:'割据交州(今越南)一带的军阀,年少时师事刘陶,经逐渐升迁任交趾太守。后被朝廷加职绥南中郎将,迁安远将军,封龙度亭侯。在步骘接管交州时积极配合,归附孙权,被孙权加为左将军;此后又因诱降益州豪族雍闿而迁任卫将军,进封龙编侯。任交趾太守四十年。', - guansuo:'关羽的三子。自荆州失陷后,逃难在鲍家庄养病,伤势痊愈之后入蜀,逢丞相诸葛亮南征,拜之为前部先锋,一同南征。', - wanglang:'字景兴,汉末三国经学家,曹魏初期重臣。曾任会稽太守举兵抵抗孙策,后为曹操所征,被拜为谏议大夫等职。曹丕建立魏国后任命为司空。小说《三国演义》中他在阵前与诸葛亮饶舌比拼,最终被诸葛亮言词所驳倒,一时气愤坠马身亡。', - zhangliang:'东汉末年黄巾起义首领之一,张角的三弟。中平元年(184)随兄起义,号称“人公将军”。遭到朝廷所派左中郎将皇甫嵩进攻时,他率军在广宗(今河北威县)进行反击。后因警戒疏忽,遭到汉军夜袭,兵败身亡。', + huangfusong: + "字义真。安定郡朝那县(今宁夏彭阳)人。于黄巾起义时,以中郎将身份讨伐黄巾,用火攻大破张梁、张宝。后接替董卓进攻张梁,连胜七阵。掘张角墓,拜左车骑将军、冀州牧,因拒绝贿赂宦官而被免职。 董卓死,王允命其与吕布等共至郿坞抄籍董卓家产、人口,皇甫嵩将坞中所藏良家子女,尽行释放。", + zangba: "其父臧戒,有二子臧艾与臧舜。年少时曾召集数人将获罪的父亲救出,此后四处流亡。后来成为陶谦麾下的骑都尉,负责募兵抵抗黄巾军。与孙观、尹礼等人拥兵驻屯于开阳,自成一股独立势力,后跟随吕布。吕布战败后,投降了曹操。后与袁绍、孙权等的战役里战功赫赫,官至镇东将军。", + zhangren: + "刘璋的属下,以忠勇著称。刘备入蜀时,张任曾劝刘璋提防刘备,但刘璋没有听从。魏延舞剑想趁机除掉刘璋时,张任出面对舞,解救刘璋。后在刘备进攻时于落凤坡射死了庞统。", + jiling: "东汉末年袁术帐下将领,勇猛非常,曾奉命率军攻打小沛的刘备,在吕布辕门射戟的调停下撤兵。", + zoushi: "军阀张济之妻,张绣之婶。张绣降曹后,邹氏遂被曹操霸占。贾诩献计趁机诛杀曹操,险些得手。曹操在损失爱将典韦、侄子曹安民和长子曹昂后方才逃出生天。", + ganfuren: + "刘备起兵后,于沛城娶甘氏为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。", + jiangfei: "请分别查看「蒋琬」和「费袆」的武将介绍。", + mifuren: + "刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。", + chendong: + "陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。", + jiangqing: + "擅长弓术。与周泰原为活跃于长江一带的江贼,孙策脱离袁术下江东自立门户时,和周泰一起率众投靠。 孙策攻刘繇,并引出城中麾下的陈横、薛礼、张英三名将领,陈横后被蒋钦一箭射杀,后与韩当等将乘舟过江,乱箭射杀敌军。曾在赤壁之战与周泰,还有擅使长枪的韩当率领水军在三江口踏江破敌。", + kongrong: + "字文举,鲁国人,东汉文学家,“建安七子”之首。献帝即位后任北军中侯、虎贲中郎将、北海相,时称孔北海后因触怒曹操,为曹操所杀。能诗善文。", + mateng: "字寿成,扶风茂陵人,东汉末年征西将军,割据西凉一带的军阀,伏波将军马援的后代,官至卫尉,封爵槐里乡侯。因其子马超谋反,而被杀,夷灭三族。", + tianfeng: + "字元皓。东汉末年大军阀袁绍部下重要谋士。为人刚直不阿,曾多次向袁绍进言而不被采纳。后因谏阻袁绍征伐曹操而被袁绍下令监禁,并于官渡之战后,被袁绍杀害。", + caochun: + "字子和,沛国谯(今安徽亳州)人。东汉末年曹操麾下将领,曹仁之弟。曹纯是曹操部下精锐部队“虎豹骑”的统领者之一,因在平定北方的战役中颇有功绩,被加封为高陵亭侯。死后谥曰威侯。曹纯擅战,甚得人心,为人重纲纪,不失理智,好学问,敬爱学士,闻名天下。", + hanba: "中国古代神话传说中引起旱灾的怪物。《诗·大雅·云汉》:“旱魃为虐,如惔如焚。”", + cuiyan: "字季珪,清河东武城(今河北省清河县)人。东汉末年名士,司空崔林的从兄,曹操帐下谋士。崔琰相貌俊美,很有威望,曹操对他也很敬畏。建安二十一年(216年),崔琰在给杨训的书信中写道“时乎时乎,会当有变时”,曹操认为此句有不逊之意,因而将崔琰下狱,不久崔琰即被曹操赐死。", + lifeng: "南阳(治今河南南阳)人,三国时期蜀汉大臣李严之子。230年,李严迁为骠骑将军,率军前往汉中,诸葛亮上表推举李丰为江州都督督军,以代替李严管理后方事务。李严去世后,李丰在蜀汉官至朱提太守。", + sunru: "孙茹,孙坚之妹,其名载于《江浙通志》中。儿子徐琨亦为孙吴早期名将,当初母子二人随军跟从孙策渡长江时,因为暂时没足够的船,孙策感到苦恼打算暂时驻军江边。孙茹夫人献计以芦苇为筏,孙策大喜。吴军遂以神不知鬼不觉的速度过长江击破刘繇部将张英,立下平江东第一功。", + lingcao: + "东汉末年将领,吴郡余杭(今浙江余杭)人,凌统之父。早年跟随孙策转战江东。孙权统军后,凌操随其征伐黄祖,被甘宁射杀。《吴书》载:甘宁以善射,将兵在后,射杀校尉凌操", + zhugeguo: + "诸葛果,为《历代神仙通鉴》中诸葛亮女儿的名字,《历代神仙通鉴》记录从上古到明代的神仙历史,因此诸葛果不见于任何史书。成都西南有朝真观,即乘烟观。相传,诸葛果在这里修行后成仙升天。", + zhuling: + "朱灵(生卒年不详),字文博,冀州清河国人,三国时期曹魏名将。官至后将军,封为高唐侯,谥号威侯。初为袁绍部将,后归顺曹操,随曹操征伐四方,屡建战功。", + re_yuanshu: + "字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。", + fuwan: "伏完(?-209),琅邪东武(今属山东)人,东汉末大臣,汉献帝伏皇后之父。历官辅国将军、中散大夫、屯骑校尉。", + liuxie: "字伯和,又字合。汉族,祖籍沛县,生于洛阳。汉灵帝第三子,被董卓迎立为帝。董卓被王允和吕布诛杀后,董卓部将李傕等攻入长安,再次挟持了他,后来逃出长安。公元196年,曹操控制了刘协,并迁都许昌,“挟天子以令诸侯”。公元220年,曹操病死,刘协被曹丕控制,随后被迫禅让于曹丕。", + yuanshu: + "字公路,汝南汝阳人,袁绍之弟。初为虎贲中郎将。董卓进京后以袁术为后将军,袁术因畏祸而出奔南阳。初平元年与袁绍、曹操等同时起兵,共讨董卓。后与袁绍对立,被袁绍、曹操击败,率馀众奔九江,割据扬州。建安二年称帝,建号仲氏。", + gongsunzan: + "字伯珪,汉族,号“白马义从”。辽西令支人。东汉末年献帝年间占据幽州一带的军阀,汉末群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。", + caohong: + "字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。", + guanyinping: + "河东解县(今山西运城)人,美髯公关羽之女。因在关羽的四个子女中排行第三,故又被称作“关三小姐”、“关氏三姐”或“关羽三小姐”。传说她是赵云的弟子、并随同诸葛亮平定南蛮。", + xiahouba: + "夏侯渊次子。本为曹魏武将,后因司马懿诛曹爽一族,夏侯霸身为曹氏宗室而心怀不安,遂投降蜀汉。后随蜀将姜维北伐,官至车骑将军。", + daxiaoqiao: + "大乔,庐江皖县人,为乔公长女,孙策之妻,容貌国色流离。小乔为大乔之妹,周瑜之妻,资貌绝伦。两人合称“二乔”。", + yuejin: "字文谦,魏“五子良将”之一。容貌短小,以胆烈跟从曹操,南征北讨,战功无数。从击袁绍于官渡,奋勇力战,斩袁绍部将淳于琼。又从击袁绍子谭、尚于黎阳,斩其大将严敬。从平荆州,留屯襄阳,进击关羽、苏非等人,击退其众,南郡诸郡的山谷蛮夷都前往乐进处投降。后来从曹操征孙权,假进节。曹操回师后,留乐进与张辽、李典屯于合肥。又以乐进数有军功,迁右将军。建安二十三年逝世,谥曰威侯。", + caoang: "字子修,曹操的长子,由于性情谦和且聪慧所以深得曹操喜爱。曹操征讨张绣时,羞辱张绣之婶邹氏,被张绣突然袭击。曹昂为保护曹操撤退,与典韦一起战死在宛城。", + zhugejin: + "字子瑜,吴国大臣,诸葛亮之兄,诸葛恪之父。经鲁肃推荐,为东吴效力。胸怀宽广,温厚诚信,得到孙权的深深信赖,努力缓和蜀汉与东吴的关系。建安二十五年(220年)吕蒙病逝,诸葛瑾代吕蒙领南郡太守,驻守公安。孙权称帝后,诸葛瑾官至大将军,领豫州牧。", + zhangxingcai: "蜀名将张飞与夏侯氏所生之女,刘禅的妻子,史上称为“敬哀皇后”。", + zumao: "字大荣,吴郡富春人,使用双刀。孙坚在汜水关被华雄击败,祖茂为保护主公而主动提出与孙坚交换头盔,孙坚因此得脱。祖茂将孙坚的赤帻挂在柱子上,准备以此引诱华雄,趁机偷袭,却反被华雄所杀。", + dingfeng: + "吴国将领。年少时以骁勇为小将,经常奋勇杀敌,屡立功勋,此后又于东兴之战中“雪中奋短兵”,大破侵犯东吴的魏军。吴景帝孙休在位时,丁奉设计除掉了东吴的权臣孙綝,被拜为大将军,后为右大司马、左军师。", + panfeng: + "冀州牧韩馥部下的上将。当十八路诸侯讨伐董卓之时,他奉韩馥之命前往汜水关前挑战董卓部下大将华雄,不敌被斩。", + maliang: + "字季常,因眉毛中有白毛,人称白眉马良,马谡的兄长。马良在兄弟五人中名声最佳,因此有“马氏五常,白眉最良”的说法。", + zhugedan: + "字公休,曹魏后期的重要将领,诸葛亮的族弟。曾与司马师一同平定毌丘俭、文钦的叛乱。之后因与被诛的夏侯玄、邓飏交厚,且见到王淩、毌丘俭等人的覆灭而心不自安,于甘露二年起兵,并得到东吴的支援,但于次年被镇压,被大将军司马胡奋所斩。", + hetaihou: + "大将军何进的妹妹,汉灵帝刘宏第二任皇后,汉少帝刘辩的生母。何氏出身于屠户家庭,后选入掖庭,得到汉灵帝临幸,生下皇子刘辩,并受封贵人。光和三年(180年),立为皇后。中平六年(189年),汉灵帝去世,刘辩继位,尊何氏为皇太后。董卓进京,废黜刘辩,不久毒杀刘辩及何氏。", + sunluyu: "又名小虎,孙权与步练师之女。吴后期,孙鲁班诬陷孙鲁育参与谋反,于是孙峻杀害了孙鲁育。", + wenpin: "本为刘表大将,刘表死后,跟随刘琮投降曹操。后曹操令其镇守江夏,多次阻止了关羽和孙权的进攻,为曹操倚为屏障的大将之一。", + zhanglu: + "汉宁太守,继父祖之后传播五斗米教。刘璋杀张鲁之母,二人因此结仇,多次交战。刘备攻益州时,刘璋向张鲁求援。张鲁派马超前往,但马超投降刘备。张鲁后见曹操自封魏王,想要自立为汉宁王,为谋士阎圃劝免。后曹操讨汉中,张鲁败,众人劝其烧粮仓,张鲁认为这是国家之物,未听从,为曹操所称赞。后投降曹操,任镇南将军。", + mayunlu: "马腾之女,马超之妹,赵云之妻。父亲令其自幼习武,枪术非凡,寻常男子也是难以匹敌。", + tadun: "东汉末年辽西乌桓(亦称乌丸)的首领,乌桓大人丘力居的从子,总摄三王部。曾出兵协助袁绍,击破公孙瓒。此后受袁绍假传朝廷诏命,与三王难楼、苏仆延、乌延等人同受单于称号及印绶。后难楼、苏仆延率其部众奉立楼班为单于,蹋顿于是退位为王。袁绍死后,收到被曹操击败的袁尚的求助,纠集逃亡至乌桓的幽州、冀州官吏百姓,企图夺回河北。东汉建安十二年,曹操亲征乌桓。八月,乌桓、袁氏部队于柳城白狼山为曹军所败,蹋顿在此战中被曹操的先锋张辽所斩杀。 ", + yanbaihu: + "吴郡乌程县人,原名“严虎”,别号“白虎”,东汉末年盘据吴郡一带山贼出身的地方豪帅。献帝初拥兵万人自固。孙策受袁术使渡江,攻破白虎等。白虎奔余杭,投靠许昭。建安二年,再度被孙策击败,至此不知亡佚何处。", + simalang: + "字伯达,“司马八达”之一。曹操任司空后,司马朗被辟为司空属官,又历任成皋令、堂阳长、元城令、丞相主簿、兖州刺史等职,所在皆有政绩,深受百姓爱戴。后司马朗与夏侯惇、臧霸等征讨吴国,到达居巢。军队中流行瘟疫,司马朗亲自去视察,派送医药,因此染病去世。", + wangji: "字伯舆,东莱曲城人。三国时期魏国将领。王基文武兼备,才高于世,德溥于时,深得司马懿、司马师、司马昭的器重,尤其在南征毋丘俭,文钦之乱,东征诸葛诞之叛大规模军事活动中,王基与司马师、司马昭结下了深厚的军友情谊。魏景元二年王基去世,追赠司空,谥号为景侯。", + buzhi: "吴重臣,最初避难江东,于孙权统事后,被召为主记。后游历吴地,又任海盐县长,还任东曹掾,出领鄱阳太守。建安十五年,转交州刺史、立武中郎将,率军接管往交州,追拜使持节、征南中郎将。次年,以平定交州功,加平戎将军,封广信侯。后迁右将军、左护军,改封临湘侯。孙权称帝后,拜骠骑将军,领冀州牧,后因冀州分与蜀汉而解牧职。又都督西陵。赤乌九年,代陆逊为丞相。", + litong: "字文达,小字万亿。江夏平春(今河南信阳)人,汝南太守。早年以游侠闻名于江汝,在率众补充曹操兵源有功拜为阳安都尉,其间不因私而忘公,不因其妻子的求请而过问执法者。后来在曹操讨伐马超时出阵挑战,死于马超枪下。", + mizhu: "原为徐州富商,后被徐州牧陶谦辟为别驾从事。陶谦病死后,奉其遗命迎接刘备。与其弟麋芳拒绝曹操的任命而跟随刘备,在刘备最潦倒之时给予刘备很大的帮助,使他重新振作。214年(建安十九年),刘备入主益州后,拜麋竺为安汉将军,地位在诸葛亮之上,为刘备手下众臣之最。吕蒙袭取荆州,麋芳举城投降,导致关羽兵败身亡,麋竺面缚请罪,刘备劝慰麋竺,对他待遇如初。", + dongbai: + "东汉末年县君,陇西临洮(今甘肃省岷县)人,董卓之孙女。董卓当权时,遍封其宗族,其中孙女董白尚未及笄,被封为渭阳君。", + zhaoxiang: "赵云与马云騄之女,赵统赵广之妹,关平之妻。", + heqi: "早年在平定山越的战争中立有大功,又讨平叛乱无数,身经百战,所向披靡,深受孙权器重。后来在与魏国的多次边境争斗中也屡立战功,官至后将军,并领徐州牧。", + dongyun: + "大汉重臣,掌军中郎将董和之子。东汉末年,其父董和事刘璋为益州太守,刘备立太子时,允被选为洗马,后为黄门侍郎,延熙六年(公元243年)加辅国将军,延熙七年(公元244年)以侍中守尚书令,任大将军费祎的副手。", + mazhong: + "本名狐笃,字德信,巴西阆中人,初次出场时随丞相诸葛亮南征孟获,诸葛亮遣马忠与赵云两路夹攻,大败蛮将阿会喃。孟获派弟孟优赴汉军处假投降,欲内应外合,诸葛亮将计就计,埋伏擒获孟获和诸洞酋长,马忠亦于此战立下战功。后诸葛亮北伐时亦数次出阵,立下汗马功劳。", + kanze: "孙权谋士,在孙权广纳贤才之时与严畯等来到江东,甚为孙权礼遇。第一个识破周瑜打黄盖是苦肉计,后欣然向曹操献诈降书,被曹操识破后面不改色,哈哈大笑,一番妙言让曹操相信了诈降书,是苦肉计中的关键人物。后劝孙权不要设局请关羽。在刘备御驾亲征东吴时,向孙权举荐陆逊为都督,间接上挽救了东吴的命运。", + lingju: "相传为吕布与貂蝉的女儿,被汉献帝掳走并训练为死士,被秘密送入宫中接近曹操,成为其“忘年红颜知己”。外表是柔弱的女子,实际上身怀致命的杀人绝技,等待时机给予曹操致命一击。", + yangxiu: + "字德祖,今陕西华阴人,是东汉末年的文学家。杨修学问渊博,极聪慧,任丞相府主簿。史载,“是时,军国多事,修总知外内,事皆称意”。", + chenlin: + "陈琳(?-217年),字孔璋,广陵射阳(今江苏宝应)人。东汉末年著名文学家,“建安七子”之一。", + zhugeke: + "字元逊,琅邪阳都(今山东沂南)人。三国时期吴臣,蜀丞相诸葛亮之侄,吴大将军诸葛瑾长子,从小就以神童著称,深受孙权赏识。", + zhangbao: + "东汉末年黄巾起义的首领之一,张角之弟,张梁之兄。中平元年(184)随兄张角起义,号称“地公将军”。", + chengyu: + "字仲德,本名程立,因梦中於泰山捧日,更名程昱。荀彧投曹操时向其举荐程昱。他参与了攻打吕布、袁绍、刘备、孙权的大部份战事,一直出谋献策,表现出众。", + sunhao: "孙权之孙,孙和之子,东吴的末代君主。在位初期虽施行过明政,但不久即沉溺酒色,专于杀戮,变得昏庸暴虐,嗜用挖眼、剥皮等酷刑。280年,吴国被西晋所灭,孙皓投降西晋,被封为归命侯。", + wutugu: "南蛮乌戈国主,身长丈二(约合现在2.77米),不食五谷,以生蛇恶兽为饭。身有鳞甲,刀箭不能侵。兀突骨乘骑巨象,头戴日月狼须帽,身披金珠缨络,两肋下露出生鳞甲,眼目中微有光芒。", + shixie: "割据交州(今越南)一带的军阀,年少时师事刘陶,经逐渐升迁任交趾太守。后被朝廷加职绥南中郎将,迁安远将军,封龙度亭侯。在步骘接管交州时积极配合,归附孙权,被孙权加为左将军;此后又因诱降益州豪族雍闿而迁任卫将军,进封龙编侯。任交趾太守四十年。", + guansuo: + "关羽的三子。自荆州失陷后,逃难在鲍家庄养病,伤势痊愈之后入蜀,逢丞相诸葛亮南征,拜之为前部先锋,一同南征。", + wanglang: + "字景兴,汉末三国经学家,曹魏初期重臣。曾任会稽太守举兵抵抗孙策,后为曹操所征,被拜为谏议大夫等职。曹丕建立魏国后任命为司空。小说《三国演义》中他在阵前与诸葛亮饶舌比拼,最终被诸葛亮言词所驳倒,一时气愤坠马身亡。", + zhangliang: + "东汉末年黄巾起义首领之一,张角的三弟。中平元年(184)随兄起义,号称“人公将军”。遭到朝廷所派左中郎将皇甫嵩进攻时,他率军在广宗(今河北威县)进行反击。后因警戒疏忽,遭到汉军夜袭,兵败身亡。", }, - characterTitle:{}, - perfectPair:{ - yuejin:['re_lidian'], - zhugejin:['zhugeke','sunquan'], - guanyinping:['guanyu'], - zhangxingcai:['liushan'], - fuwan:['fuhuanghou'], - sunshangxiang:['liubei'], - caoang:['caocao'], - zhangbao:['zhangliang','zhangjiao'], - zhangliang:['zhangjiao'], - maliang:['masu'], - lingcao:['lingtong'], - lingju:['diaochan','lvbu'], - jiangqing:['zhoutai'], - dingfeng:['xusheng','zhugeke'], - caohong:['caoren'], - daxiaoqiao:['zhouyu','sunce'], - cuiyan:['caocao'], - guansuo:['guanyu'], - mateng:['machao','madai','mayunlu'], - chengpu:['zhouyu'], - hanba:['swd_muyun'], - dongbai:['dongzhuo'], - cuimao:['caopi'], - simazhao:['wangyuanji'], + characterTitle: {}, + perfectPair: { + yuejin: ["re_lidian"], + zhugejin: ["zhugeke", "sunquan"], + guanyinping: ["guanyu"], + zhangxingcai: ["liushan"], + fuwan: ["fuhuanghou"], + sunshangxiang: ["liubei"], + caoang: ["caocao"], + zhangbao: ["zhangliang", "zhangjiao"], + zhangliang: ["zhangjiao"], + maliang: ["masu"], + lingcao: ["lingtong"], + lingju: ["diaochan", "lvbu"], + jiangqing: ["zhoutai"], + dingfeng: ["xusheng", "zhugeke"], + caohong: ["caoren"], + daxiaoqiao: ["zhouyu", "sunce"], + cuiyan: ["caocao"], + guansuo: ["guanyu"], + mateng: ["machao", "madai", "mayunlu"], + chengpu: ["zhouyu"], + hanba: ["swd_muyun"], + dongbai: ["dongzhuo"], + cuimao: ["caopi"], + simazhao: ["wangyuanji"], }, - card:{ + card: { //蒲元衍生 - sanlve:{ - derivation:'ol_puyuan', - type:"equip", - subtype:"equip5", - ai:{ - basic:{ - equipValue:5, + sanlve: { + derivation: "ol_puyuan", + type: "equip", + subtype: "equip5", + ai: { + basic: { + equipValue: 5, }, }, - skills:["sanlve_skill"], - fullskin:true, + skills: ["sanlve_skill"], + fullskin: true, }, - zhaogujing:{ - derivation:'ol_puyuan', - type:"equip", - subtype:"equip5", - ai:{ - basic:{ - equipValue:6.5, + zhaogujing: { + derivation: "ol_puyuan", + type: "equip", + subtype: "equip5", + ai: { + basic: { + equipValue: 6.5, }, }, - skills:["zhaogujing_skill"], - fullskin:true, + skills: ["zhaogujing_skill"], + fullskin: true, }, - shufazijinguan:{ - derivation:'ol_puyuan', - type:"equip", - subtype:"equip5", - modeimage:'boss', - ai:{ - basic:{ - equipValue:8, + shufazijinguan: { + derivation: "ol_puyuan", + type: "equip", + subtype: "equip5", + modeimage: "boss", + ai: { + basic: { + equipValue: 8, }, }, - skills:["shufazijinguan_skill"], - fullskin:true, + skills: ["shufazijinguan_skill"], + fullskin: true, }, - xuwangzhimian:{ - derivation:'ol_puyuan', - type:'equip', - fullskin:true, - subtype:'equip5', - modeimage:'boss', - skills:['xuwangzhimian'], - ai:{ - equipValue:7, - } + xuwangzhimian: { + derivation: "ol_puyuan", + type: "equip", + fullskin: true, + subtype: "equip5", + modeimage: "boss", + skills: ["xuwangzhimian"], + ai: { + equipValue: 7, + }, }, - hongmianbaihuapao:{ - derivation:'ol_puyuan', - type:"equip", - subtype:"equip2", - modeimage:'boss', - ai:{ - basic:{ - equipValue:4, + hongmianbaihuapao: { + derivation: "ol_puyuan", + type: "equip", + subtype: "equip2", + modeimage: "boss", + ai: { + basic: { + equipValue: 4, }, }, - skills:["hongmianbaihuapao_skill"], - fullskin:true, + skills: ["hongmianbaihuapao_skill"], + fullskin: true, }, - guofengyupao:{ - derivation:'ol_puyuan', - type:'equip', - fullskin:true, - modeimage:'boss', - subtype:'equip2', - skills:['guofengyupao'], - ai:{ - equipValue:7 - } + guofengyupao: { + derivation: "ol_puyuan", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip2", + skills: ["guofengyupao"], + ai: { + equipValue: 7, + }, }, - qimenbagua:{ - derivation:'ol_puyuan', - type:'equip', - fullskin:true, - modeimage:'boss', - subtype:'equip2', - skills:['qimenbagua'], - ai:{ - equipValue:7.5 - } + qimenbagua: { + derivation: "ol_puyuan", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip2", + skills: ["qimenbagua"], + ai: { + equipValue: 7.5, + }, }, - linglongshimandai:{ - derivation:'ol_puyuan', - type:"equip", - subtype:"equip2", - modeimage:'boss', - ai:{ - basic:{ - equipValue:5, + linglongshimandai: { + derivation: "ol_puyuan", + type: "equip", + subtype: "equip2", + modeimage: "boss", + ai: { + basic: { + equipValue: 5, }, }, - skills:["linglongshimandai_skill"], - fullskin:true, + skills: ["linglongshimandai_skill"], + fullskin: true, }, - chixueqingfeng:{ - derivation:'ol_puyuan', - type:'equip', - fullskin:true, - modeimage:'boss', - subtype:'equip1', - distance:{attackFrom:-1}, - skills:['chixueqingfeng'], - ai:{ - equipValue:6.7 - } - }, - guilongzhanyuedao:{ - derivation:'ol_puyuan', - type:'equip', - fullskin:true, - modeimage:'boss', - subtype:'equip1', - distance:{attackFrom:-2}, - skills:['guilongzhanyuedao'], - nomod:true, - nopower:true, - unique:true, - ai:{ - equipValue:4 - } - }, - wushuangfangtianji:{ - derivation:'ol_puyuan', - type:"equip", - modeimage:'boss', - subtype:"equip1", - distance:{ - attackFrom:-3, + chixueqingfeng: { + derivation: "ol_puyuan", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip1", + distance: { attackFrom: -1 }, + skills: ["chixueqingfeng"], + ai: { + equipValue: 6.7, }, - ai:{ - basic:{ - equipValue:3, + }, + guilongzhanyuedao: { + derivation: "ol_puyuan", + type: "equip", + fullskin: true, + modeimage: "boss", + subtype: "equip1", + distance: { attackFrom: -2 }, + skills: ["guilongzhanyuedao"], + nomod: true, + nopower: true, + unique: true, + ai: { + equipValue: 4, + }, + }, + wushuangfangtianji: { + derivation: "ol_puyuan", + type: "equip", + modeimage: "boss", + subtype: "equip1", + distance: { + attackFrom: -3, + }, + ai: { + basic: { + equipValue: 3, }, }, - skills:["wushuangfangtianji_skill"], - fullskin:true, + skills: ["wushuangfangtianji_skill"], + fullskin: true, }, - bintieshuangji:{ - derivation:'ol_puyuan', - type:"equip", - subtype:"equip1", - distance:{ - attackFrom:-2, + bintieshuangji: { + derivation: "ol_puyuan", + type: "equip", + subtype: "equip1", + distance: { + attackFrom: -2, }, - ai:{ - basic:{ - equipValue:4.5, + ai: { + basic: { + equipValue: 4.5, }, }, - skills:["bintieshuangji_skill"], - fullskin:true, + skills: ["bintieshuangji_skill"], + fullskin: true, }, //王允 - wy_meirenji:{ - fullskin:true, - vanish:true, - derivation:'wangyun', - type:'trick', - enable:true, - filterTarget:function(card,player,target){ - return target.countCards('h')&&target!=player&&target.hasSex('male'); + wy_meirenji: { + fullskin: true, + vanish: true, + derivation: "wangyun", + type: "trick", + enable: true, + filterTarget: function (card, player, target) { + return target.countCards("h") && target != player && target.hasSex("male"); }, - content:function(){ - 'step 0' - event.list=game.filterPlayer(function(current){ - return current!=player&¤t!=target&¤t.hasSex('female'); - }).sortBySeat(); - 'step 1' - if(target.countCards('h')&&event.list.length){ - event.current=event.list.shift(); - event.current.gainPlayerCard(target,true,'h'); - target.line2([event.current,player]); - } - else{ + content: function () { + "step 0"; + event.list = game + .filterPlayer(function (current) { + return current != player && current != target && current.hasSex("female"); + }) + .sortBySeat(); + ("step 1"); + if (target.countCards("h") && event.list.length) { + event.current = event.list.shift(); + event.current.gainPlayerCard(target, true, "h"); + target.line2([event.current, player]); + } else { event.goto(4); } - 'step 2' - event.current.chooseCard('h',true,'将一张手牌交给'+get.translation(player)); - 'step 3' - if(result.bool){ - event.current.give(result.cards,player); + ("step 2"); + event.current.chooseCard("h", true, "将一张手牌交给" + get.translation(player)); + ("step 3"); + if (result.bool) { + event.current.give(result.cards, player); } event.goto(1); - 'step 4' - var n1=target.countCards('h'); - var n2=player.countCards('h'); - if(n1>n2){ + ("step 4"); + var n1 = target.countCards("h"); + var n2 = player.countCards("h"); + if (n1 > n2) { target.damage(player); player.line(target); - } - else if(n1=3) return 0; - if(!target.hasSkillTag('maixie_hp')){ + result: { + target: function (player, target) { + var num = Math.min(5, target.maxHp - target.hp); + if (target.hp == 1) { + if (num >= 3) return 0; + if (!target.hasSkillTag("maixie_hp")) { return -3; } return -1; } - if(num==2) return 0; - return -2+num+(Math.pow(target.hp,0.2)-1); - } - } - } + if (num == 2) return 0; + return -2 + num + (Math.pow(target.hp, 0.2) - 1); + }, + }, + }, }, - zhuangshu_basic:{ - fullskin:true, - vanish:true, - derivation:'fengfangnv', - type:'equip', - suit:'spade', - subtype:'equip5', - skills:['zhuangshu_basic'], - forceDie:true, - onLose:function(){ - if((!event.getParent(2)||event.getParent(2).name!='swapEquip')&&(event.getParent().type!='equip'||event.getParent().swapEquip)){ + zhuangshu_basic: { + fullskin: true, + vanish: true, + derivation: "fengfangnv", + type: "equip", + suit: "spade", + subtype: "equip5", + skills: ["zhuangshu_basic"], + forceDie: true, + onLose: function () { + if ( + (!event.getParent(2) || event.getParent(2).name != "swapEquip") && + (event.getParent().type != "equip" || event.getParent().swapEquip) + ) { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); + card.destroyed = true; + game.log(card, "被销毁了"); } }, - equipDelay:false, - loseDelay:false, - ai:{ - equipValue:5, - basic:{ - equipValue:5 - } - } + equipDelay: false, + loseDelay: false, + ai: { + equipValue: 5, + basic: { + equipValue: 5, + }, + }, }, - zhuangshu_trick:{ - fullskin:true, - vanish:true, - derivation:'fengfangnv', - type:'equip', - suit:'club', - subtype:'equip5', - forceDie:true, - skills:['zhuangshu_trick'], - onLose:function(){ - if((!event.getParent(2)||event.getParent(2).name!='swapEquip')&&(event.getParent().type!='equip'||event.getParent().swapEquip)){ + zhuangshu_trick: { + fullskin: true, + vanish: true, + derivation: "fengfangnv", + type: "equip", + suit: "club", + subtype: "equip5", + forceDie: true, + skills: ["zhuangshu_trick"], + onLose: function () { + if ( + (!event.getParent(2) || event.getParent(2).name != "swapEquip") && + (event.getParent().type != "equip" || event.getParent().swapEquip) + ) { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); + card.destroyed = true; + game.log(card, "被销毁了"); } }, - equipDelay:false, - loseDelay:false, + equipDelay: false, + loseDelay: false, }, - zhuangshu_equip:{ - fullskin:true, - vanish:true, - derivation:'fengfangnv', - type:'equip', - suit:'heart', - subtype:'equip5', - skills:['zhuangshu_equip'], - forceDie:true, - inherit:'zhuangshu_basic', - onLose:function(){ - if((!event.getParent(2)||event.getParent(2).name!='swapEquip')&&(event.getParent().type!='equip'||event.getParent().swapEquip)){ + zhuangshu_equip: { + fullskin: true, + vanish: true, + derivation: "fengfangnv", + type: "equip", + suit: "heart", + subtype: "equip5", + skills: ["zhuangshu_equip"], + forceDie: true, + inherit: "zhuangshu_basic", + onLose: function () { + if ( + (!event.getParent(2) || event.getParent(2).name != "swapEquip") && + (event.getParent().type != "equip" || event.getParent().swapEquip) + ) { card.fix(); card.remove(); - card.destroyed=true; - game.log(card,'被销毁了'); + card.destroyed = true; + game.log(card, "被销毁了"); } }, - equipDelay:false, - loseDelay:false, + equipDelay: false, + loseDelay: false, }, }, - skill:{ + skill: { //刘辟 - olyicheng:{ - audio:2, - enable:'phaseUse', - usable:1, - async content(event,trigger,player){ - let cards=get.cards(3); + olyicheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + async content(event, trigger, player) { + let cards = get.cards(3); await game.cardsGotoOrdering(cards); - await player.showCards(cards,get.translation(player)+'发动了【易城】'); - if(player.countCards('h')){ - const sum=cards.reduce((num,card)=>num+get.number(card),0); - const {result:{bool,moved}}=await player.chooseToMove('易城:请选择你要交换的牌').set('list',[ - ['牌堆顶',cards,list=>{ - const sum2=list.reduce((num,card)=>num+get.number(card,false),0); - return '牌堆顶(现'+sum2+{'0':'=','-1':'<','1':'>'}[get.sgn(sum2-sum).toString()]+'原'+sum+')'; - }], - ['手牌',player.getCards('h')], - ]).set('filterOk',moved=>moved[1].some(i=>!get.owner(i))).set('processAI',list=>{ - const player=get.event('player'),limit=Math.min(3,player.countCards('h')); - let cards=list[0][1].slice(),hs=player.getCards('h'); - if(cards.reduce((num,card)=>num+get.value(card),0)>player.getCards('h').reduce((num,card)=>num+get.value(card),0)){ - cards.sort((a,b)=>get.number(a)-get.number(b)); - hs.sort((a,b)=>get.number(b)-get.number(a)); - let cards2=cards.slice(0,limit),hs2=hs.slice(0,limit); - if(hs2.reduce((num,card)=>num+get.number(card),0)>cards2.reduce((num,card)=>num+get.number(card),0)){ - cards.removeArray(cards2);hs.removeArray(hs2); - return [cards.concat(hs2),hs.concat(cards2)]; - } - return [cards,hs]; - } - else{ - cards.sort((a,b)=>get.value(b)-get.value(a)); - hs.sort((a,b)=>get.value(a)-get.value(b)); - let cards2=cards.slice(0,limit),hs2=hs.slice(0,limit),list=[cards,hs]; - for(let i=0;iget.value(hs2[i])){ - const change=[cards2[i],hs2[i]]; - cards[i]=change[1];hs[i]=change[0]; + await player.showCards(cards, get.translation(player) + "发动了【易城】"); + if (player.countCards("h")) { + const sum = cards.reduce((num, card) => num + get.number(card), 0); + const { + result: { bool, moved }, + } = await player + .chooseToMove("易城:请选择你要交换的牌") + .set("list", [ + [ + "牌堆顶", + cards, + (list) => { + const sum2 = list.reduce( + (num, card) => num + get.number(card, false), + 0 + ); + return ( + "牌堆顶(现" + + sum2 + + { 0: "=", "-1": "<", 1: ">" }[get.sgn(sum2 - sum).toString()] + + "原" + + sum + + ")" + ); + }, + ], + ["手牌", player.getCards("h")], + ]) + .set("filterOk", (moved) => moved[1].some((i) => !get.owner(i))) + .set("processAI", (list) => { + const player = get.event("player"), + limit = Math.min(3, player.countCards("h")); + let cards = list[0][1].slice(), + hs = player.getCards("h"); + if ( + cards.reduce((num, card) => num + get.value(card), 0) > + player.getCards("h").reduce((num, card) => num + get.value(card), 0) + ) { + cards.sort((a, b) => get.number(a) - get.number(b)); + hs.sort((a, b) => get.number(b) - get.number(a)); + let cards2 = cards.slice(0, limit), + hs2 = hs.slice(0, limit); + if ( + hs2.reduce((num, card) => num + get.number(card), 0) > + cards2.reduce((num, card) => num + get.number(card), 0) + ) { + cards.removeArray(cards2); + hs.removeArray(hs2); + return [cards.concat(hs2), hs.concat(cards2)]; } - else break; + return [cards, hs]; + } else { + cards.sort((a, b) => get.value(b) - get.value(a)); + hs.sort((a, b) => get.value(a) - get.value(b)); + let cards2 = cards.slice(0, limit), + hs2 = hs.slice(0, limit), + list = [cards, hs]; + for (let i = 0; i < limit; i++) { + if (get.value(cards2[i]) > get.value(hs2[i])) { + const change = [cards2[i], hs2[i]]; + cards[i] = change[1]; + hs[i] = change[0]; + } else break; + } + return list; } - return list; - } - }); - if(bool){ - const puts=player.getCards('h',i=>moved[0].includes(i)); - const gains=cards.filter(i=>moved[1].includes(i)); - if(puts.length&&gains.length){ - player.$throw(puts,1000); - await player.lose(puts,ui.special); - await player.gain(gains,'gain2'); - cards=moved[0].slice(); - await player.showCards(cards,get.translation(player)+'【易城】第一次交换后'); - if(cards.reduce((num,card)=>num+get.number(card),0)>sum&&player.countCards('h')){ - const {result:{bool}}=await player.chooseBool('易城:是否使用全部手牌交换'+get.translation(cards)+'?').set('choice',(()=>{ - return cards.reduce((num,card)=>num+get.value(card),0)>player.getCards('h').reduce((num,card)=>num+get.value(card),0); - })()); - if(bool){ - const hs=player.getCards('h'); - player.$throw(hs,1000); - await player.lose(hs,ui.special); - await player.gain(cards,'gain2'); - cards=hs.slice(); - await player.showCards(cards,get.translation(player)+'【易城】第二次交换后'); + }); + if (bool) { + const puts = player.getCards("h", (i) => moved[0].includes(i)); + const gains = cards.filter((i) => moved[1].includes(i)); + if (puts.length && gains.length) { + player.$throw(puts, 1000); + await player.lose(puts, ui.special); + await player.gain(gains, "gain2"); + cards = moved[0].slice(); + await player.showCards( + cards, + get.translation(player) + "【易城】第一次交换后" + ); + if ( + cards.reduce((num, card) => num + get.number(card), 0) > sum && + player.countCards("h") + ) { + const { + result: { bool }, + } = await player + .chooseBool( + "易城:是否使用全部手牌交换" + get.translation(cards) + "?" + ) + .set( + "choice", + (() => { + return ( + cards.reduce((num, card) => num + get.value(card), 0) > + player + .getCards("h") + .reduce((num, card) => num + get.value(card), 0) + ); + })() + ); + if (bool) { + const hs = player.getCards("h"); + player.$throw(hs, 1000); + await player.lose(hs, ui.special); + await player.gain(cards, "gain2"); + cards = hs.slice(); + await player.showCards( + cards, + get.translation(player) + "【易城】第二次交换后" + ); } } } } - if(cards.length){ - for(let i=cards.length-1;i--;i>=0){ - ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); + if (cards.length) { + for (let i = cards.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); } - game.log(cards,'被放回了牌堆顶'); + game.log(cards, "被放回了牌堆顶"); game.updateRoundNumber(); } } }, - ai:{ - order:9, - result:{player:1}, + ai: { + order: 9, + result: { player: 1 }, }, }, //陆凯 - olxuanzhu:{ - mark:true, - marktext:'☯', - zhuanhuanji:true, - audio:2, - enable:'chooseToUse', - filter(event,player){ - if(!player.countCards('he')||event.type=='wuxie') return false; - return get.inpileVCardList(info=>{ - const name=info[2],type=get.type(name),infox=get.info({name:name}); - if(type!='basic'&&type!='trick') return false; - if(type=='trick'&&(!infox||!infox.filterTarget)) return false; - return (type!='basic')==(player.storage.olxuanzhu||false); - }).some(card=>event.filterCard({name:card[2],nature:card[3]},player,event)); + olxuanzhu: { + mark: true, + marktext: "☯", + zhuanhuanji: true, + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if (!player.countCards("he") || event.type == "wuxie") return false; + return get + .inpileVCardList((info) => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .some((card) => event.filterCard({ name: card[2], nature: card[3] }, player, event)); }, - usable:1, - chooseButton:{ - dialog(event,player){ - const list=get.inpileVCardList(info=>{ - const name=info[2],type=get.type(name),infox=get.info({name:name}); - if(type!='basic'&&type!='trick') return false; - if(type=='trick'&&(!infox||!infox.filterTarget)) return false; - return (type!='basic')==(player.storage.olxuanzhu||false); - }).filter(card=>event.filterCard({name:card[2],nature:card[3]},player,event)); - return ui.create.dialog('玄注',[list,'vcard']); + usable: 1, + chooseButton: { + dialog(event, player) { + const list = get + .inpileVCardList((info) => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .filter((card) => + event.filterCard({ name: card[2], nature: card[3] }, player, event) + ); + return ui.create.dialog("玄注", [list, "vcard"]); }, - check(button){ - if(get.event().getParent().type!='phase') return 1; - return get.event('player').getUseValue({name:button.link[2],nature:button.link[3]}); + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get + .event("player") + .getUseValue({ name: button.link[2], nature: button.link[3] }); }, - backup(links,player){ - let next={ - audio:'olxuanzhu', - filterCard:true, - popname:true, - check(card){ - return 1/(get.value(card)||0.5); + backup(links, player) { + let next = { + audio: "olxuanzhu", + filterCard: true, + popname: true, + check(card) { + return 1 / (get.value(card) || 0.5); }, - position:'he', - ignoreMod:true, - precontent(){ - const cards=event.result.cards.slice(); - player.addToExpansion(cards,player,'give').gaintag.add('olxuanzhu'); - const viewAs={name:event.result.card.name,nature:event.result.card.nature}; - event.result.card=viewAs;event.result.cards=[]; - player.when('useCardAfter').filter(evt=>evt.skill=='olxuanzhu_backup').then(()=>{ - const card=cards[0]; - if(get.type(card)!='equip') player.chooseToDiscard('he',true); - else{ - const cardx=player.getExpansions('olxuanzhu'); - if(cardx.length){ - player.loseToDiscardpile(cardx); - player.draw(cardx.length); + position: "he", + ignoreMod: true, + precontent() { + const cards = event.result.cards.slice(); + player.addToExpansion(cards, player, "give").gaintag.add("olxuanzhu"); + const viewAs = { + name: event.result.card.name, + nature: event.result.card.nature, + }; + event.result.card = viewAs; + event.result.cards = []; + player + .when("useCardAfter") + .filter((evt) => evt.skill == "olxuanzhu_backup") + .then(() => { + const card = cards[0]; + if (get.type(card) != "equip") player.chooseToDiscard("he", true); + else { + const cardx = player.getExpansions("olxuanzhu"); + if (cardx.length) { + player.loseToDiscardpile(cardx); + player.draw(cardx.length); + } } - } - }).vars({cards:cards}); + }) + .vars({ cards: cards }); }, - onuse(result,player){ - player.changeZhuanhuanji('olxuanzhu'); + onuse(result, player) { + player.changeZhuanhuanji("olxuanzhu"); }, }; - const viewAs={ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null, - isCard:true, + const viewAs = { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, }; - next.viewAs=viewAs; - if(get.info('xunshi').isXunshi(viewAs)){ - next.filterTarget=function(card,player,target){ - const info=get.info(card); - if(info.changeTarget){ - let targets=[target]; - info.changeTarget(player,targets); - if(targets.length>1) return false; + next.viewAs = viewAs; + if (get.info("xunshi").isXunshi(viewAs)) { + next.filterTarget = function (card, player, target) { + const info = get.info(card); + if (info.changeTarget) { + let targets = [target]; + info.changeTarget(player, targets); + if (targets.length > 1) return false; } - return lib.filter.filterTarget(card,player,target); + return lib.filter.filterTarget(card, player, target); }; - next.selectTarget=1; + next.selectTarget = 1; } return next; }, - prompt(links,player){ - const viewAs={ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null, - isCard:true, + prompt(links, player) { + const viewAs = { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, }; - const str='将一张牌称为“玄”置于武将牌上,然后视为使用'+(get.translation(links[0][3])||'')+'【'+get.translation(links[0][2])+'】'; - return str+(get.info('xunshi').isXunshi(viewAs)?'(仅能指定一个目标)':''); + const str = + "将一张牌称为“玄”置于武将牌上,然后视为使用" + + (get.translation(links[0][3]) || "") + + "【" + + get.translation(links[0][2]) + + "】"; + return str + (get.info("xunshi").isXunshi(viewAs) ? "(仅能指定一个目标)" : ""); }, }, - hiddenCard(player,name){ - if(!lib.inpile.includes(name)||player.getStat('skill').olxuanzhu||!player.countCards('he')) return false; - return get.inpileVCardList(info=>{ - const name=info[2],type=get.type(name),infox=get.info({name:name}); - if(type!='basic'&&type!='trick') return false; - if(type=='trick'&&(!infox||!infox.filterTarget)) return false; - return (type!='basic')==(player.storage.olxuanzhu||false); - }).map(card=>card[2]).includes(name); + hiddenCard(player, name) { + if ( + !lib.inpile.includes(name) || + player.getStat("skill").olxuanzhu || + !player.countCards("he") + ) + return false; + return get + .inpileVCardList((info) => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .map((card) => card[2]) + .includes(name); }, - ai:{ - order(item,player){ - if(player&&get.event().type=='phase'){ - let list=get.inpileVCardList(info=>{ - const name=info[2],type=get.type(name),infox=get.info({name:name}); - if(type!='basic'&&type!='trick') return false; - if(type=='trick'&&(!infox||!infox.filterTarget)) return false; - return (type!='basic')==(player.storage.olxuanzhu||false); - }).map(card=>{return {name:card[2],nature:card[3]}}).filter(card=>player.getUseValue(card,true,true)>0); - if(!list.length) return 0; - list.sort((a,b)=>{ - const getNum=function(card){ - if(get.info('xunshi').isXunshi(card)) return get.effect(game.filterPlayer(target=>{ - return player.canUse(card,target,true,true); - }).sort((a,b)=>get.effect(b,card,player,player)-get.effect(a,card,player,player))[0],card,player,player); - return player.getUseValue(card,true,true); + ai: { + order(item, player) { + if (player && get.event().type == "phase") { + let list = get + .inpileVCardList((info) => { + const name = info[2], + type = get.type(name), + infox = get.info({ name: name }); + if (type != "basic" && type != "trick") return false; + if (type == "trick" && (!infox || !infox.filterTarget)) return false; + return (type != "basic") == (player.storage.olxuanzhu || false); + }) + .map((card) => { + return { name: card[2], nature: card[3] }; + }) + .filter((card) => player.getUseValue(card, true, true) > 0); + if (!list.length) return 0; + list.sort((a, b) => { + const getNum = function (card) { + if (get.info("xunshi").isXunshi(card)) + return get.effect( + game + .filterPlayer((target) => { + return player.canUse(card, target, true, true); + }) + .sort( + (a, b) => + get.effect(b, card, player, player) - + get.effect(a, card, player, player) + )[0], + card, + player, + player + ); + return player.getUseValue(card, true, true); }; - return (getNum(b)||0)-(getNum(a)||0); + return (getNum(b) || 0) - (getNum(a) || 0); }); - return get.order(list[0],player)*0.99; + return get.order(list[0], player) * 0.99; } return 0.001; }, - respondSha:true, - respondShan:true, - skillTagFilter(player,tag,arg){ - if(arg=='respond') return false; - const name=(tag=='respondSha'?'sha':'shan'); - return get.info('olxuanzhu').hiddenCard(player,name); + respondSha: true, + respondShan: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + const name = tag == "respondSha" ? "sha" : "shan"; + return get.info("olxuanzhu").hiddenCard(player, name); }, - result:{player:1}, + result: { player: 1 }, }, - intro:{ - markcount:'expansion', - mark(dialog,storage,player){ - const cards=player.getExpansions('olxuanzhu'); - if(cards.length) dialog.addSmall(player.getExpansions('olxuanzhu')); - dialog.addText((()=>{ - if(storage) return '每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; - return '每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意基本牌。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; - })(storage)); + intro: { + markcount: "expansion", + mark(dialog, storage, player) { + const cards = player.getExpansions("olxuanzhu"); + if (cards.length) dialog.addSmall(player.getExpansions("olxuanzhu")); + dialog.addText( + (() => { + if (storage) + return "每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。"; + return "每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用任意基本牌。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。"; + })(storage) + ); }, }, - onremove(player,skill){ - const cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - subSkill:{backup:{}}, + subSkill: { backup: {} }, }, - oljiane:{ - audio:2, - trigger:{player:['shaDamage','useCardToEnd']}, - filter(event,player,name){ - if(event.type!='card'||!event.target||!event.target.isIn()||event.target==player) return false; - if(name=='shaDamage') return true; - return event.card.name!='sha'&&!event.getParent()._neutralized; + oljiane: { + audio: 2, + trigger: { player: ["shaDamage", "useCardToEnd"] }, + filter(event, player, name) { + if ( + event.type != "card" || + !event.target || + !event.target.isIn() || + event.target == player + ) + return false; + if (name == "shaDamage") return true; + return event.card.name != "sha" && !event.getParent()._neutralized; }, - logTarget:'target', - forced:true, - async content(event,trigger,player){ - trigger.target.addTempSkill('oljiane_neutralized'); + logTarget: "target", + forced: true, + async content(event, trigger, player) { + trigger.target.addTempSkill("oljiane_neutralized"); }, - group:'oljiane_neutralize', - global:'oljiane_ai', - subSkill:{ - neutralize:{ - audio:'oljiane', - trigger:{ - target:'shaMiss', - global:'eventNeutralized', + group: "oljiane_neutralize", + global: "oljiane_ai", + subSkill: { + neutralize: { + audio: "oljiane", + trigger: { + target: "shaMiss", + global: "eventNeutralized", }, - filter(event,player,name){ - if(event.type!='card') return false; - return name=='shaMiss'||event._neutralize_event.player==player; + filter(event, player, name) { + if (event.type != "card") return false; + return name == "shaMiss" || event._neutralize_event.player == player; }, - forced:true, - async content(event,trigger,player){ - player.addTempSkill('oljiane_nouse'); + forced: true, + async content(event, trigger, player) { + player.addTempSkill("oljiane_nouse"); }, }, - ai:{ - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(!arg||!arg.target||!arg.target.hasSkill('oljiane_neutralized')) return false; + ai: { + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (!arg || !arg.target || !arg.target.hasSkill("oljiane_neutralized")) + return false; }, }, }, - neutralized:{ - charlotte:true, - mark:true, - marktext:'牌', - intro:{content:'本回合无法抵消牌'}, - trigger:{global:'useCard'}, - forced:true, - popup:false, - async content(event,trigger,player){ - const id=player.playerid; - const map=trigger.customArgs; - if(!map[id]) map[id]={}; - map[id].directHit2=true; + neutralized: { + charlotte: true, + mark: true, + marktext: "牌", + intro: { content: "本回合无法抵消牌" }, + trigger: { global: "useCard" }, + forced: true, + popup: false, + async content(event, trigger, player) { + const id = player.playerid; + const map = trigger.customArgs; + if (!map[id]) map[id] = {}; + map[id].directHit2 = true; }, - mod:{ - wuxieJudgeEnabled:()=>false, - wuxieEnabled:()=>false, + mod: { + wuxieJudgeEnabled: () => false, + wuxieEnabled: () => false, }, }, - nouse:{ - charlotte:true, - mark:true, - marktext:'', - intro:{content:'本回合无法成为牌的目标'}, - mod:{targetEnabled:()=>false}, + nouse: { + charlotte: true, + mark: true, + marktext: '', + intro: { content: "本回合无法成为牌的目标" }, + mod: { targetEnabled: () => false }, }, }, }, //刘磐 - olpijing:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(!game.hasPlayer(target=>target!=player&&!event.targets.includes(target)&&lib.filter.targetEnabled2(event.card,player,target)&&lib.filter.targetInRange(event.card,player,target))) return false; - return get.color(event.card)=='black'&&(event.card.name=='sha'||get.type(event.card)=='trick')&&event.targets.length==1; + olpijing: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if ( + !game.hasPlayer( + (target) => + target != player && + !event.targets.includes(target) && + lib.filter.targetEnabled2(event.card, player, target) && + lib.filter.targetInRange(event.card, player, target) + ) + ) + return false; + return ( + get.color(event.card) == "black" && + (event.card.name == "sha" || get.type(event.card) == "trick") && + event.targets.length == 1 + ); }, - usable:1, - direct:true, - locked:false, - async content(event,trigger,player){ - const num=Math.max(1,player.getDamagedHp()); - const {result:{bool,targets}}=await player.chooseTarget(get.prompt('olpijing'),[1,num],(card,player,target)=>{ - const trigger=get.event().getTrigger(); - return target!=player&&!trigger.targets.includes(target)&&lib.filter.targetEnabled2(trigger.card,player,target)&&lib.filter.targetInRange(trigger.card,player,target); - }).set('ai',target=>{ - const player=get.event('player'),trigger=get.event().getTrigger(); - return get.effect(target,trigger.card,player,player)*(target.getStorage('olpijing_effect').includes(player)?2:1)+get.effect(target,{name:'shunshou_copy2'},player,player); - }).set('prompt2','令至多'+get.cnNumber(num)+'名角色成为'+get.translation(trigger.card)+'的目标并交给你一张牌'); - if(bool){ - player.logSkill('olpijing',targets); + usable: 1, + direct: true, + locked: false, + async content(event, trigger, player) { + const num = Math.max(1, player.getDamagedHp()); + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt("olpijing"), [1, num], (card, player, target) => { + const trigger = get.event().getTrigger(); + return ( + target != player && + !trigger.targets.includes(target) && + lib.filter.targetEnabled2(trigger.card, player, target) && + lib.filter.targetInRange(trigger.card, player, target) + ); + }) + .set("ai", (target) => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + return ( + get.effect(target, trigger.card, player, player) * + (target.getStorage("olpijing_effect").includes(player) ? 2 : 1) + + get.effect(target, { name: "shunshou_copy2" }, player, player) + ); + }) + .set( + "prompt2", + "令至多" + + get.cnNumber(num) + + "名角色成为" + + get.translation(trigger.card) + + "的目标并交给你一张牌" + ); + if (bool) { + player.logSkill("olpijing", targets); trigger.targets.addArray(targets); - for(const target of targets){ - target.addSkill('olpijing_effect'); - target.markAuto('olpijing_effect',[player]); - await target.chooseToGive(player,'he',true,'披荆:交给'+get.translation(player)+'一张牌'); + for (const target of targets) { + target.addSkill("olpijing_effect"); + target.markAuto("olpijing_effect", [player]); + await target.chooseToGive( + player, + "he", + true, + "披荆:交给" + get.translation(player) + "一张牌" + ); } - } - else player.storage.counttrigger.olpijing--; + } else player.storage.counttrigger.olpijing--; }, - mod:{ - aiOrder(player,card,num){ - if(!(card.name=='sha'||get.type(card)=='trick')||get.color(card)!='black') return; - const info=get.info(card); - if(info&&!info.notarget&&(info.toself||info.singleCard||!info.selectTarget||info.selectTarget==1)&&game.countPlayer(target=>{ - if(get.effect(target,card,player,player)<=0) return false; - return lib.filter.targetEnabled2(card,player,target)&&lib.filter.targetInRange(card,player,target); - })>1) return num+0.01; + mod: { + aiOrder(player, card, num) { + if (!(card.name == "sha" || get.type(card) == "trick") || get.color(card) != "black") + return; + const info = get.info(card); + if ( + info && + !info.notarget && + (info.toself || + info.singleCard || + !info.selectTarget || + info.selectTarget == 1) && + game.countPlayer((target) => { + if (get.effect(target, card, player, player) <= 0) return false; + return ( + lib.filter.targetEnabled2(card, player, target) && + lib.filter.targetInRange(card, player, target) + ); + }) > 1 + ) + return num + 0.01; }, }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - intro:{content:'使用的下一张基本牌或普通锦囊牌指定唯一目标时,可指定$为额外目标或摸一张牌'}, - trigger:{player:'useCardToPlayer'}, - filter(event,player){ - return (get.type(event.card)=='basic'||get.type(event.card)=='trick')&&event.targets.length==1; + subSkill: { + effect: { + charlotte: true, + onremove: true, + intro: { + content: + "使用的下一张基本牌或普通锦囊牌指定唯一目标时,可指定$为额外目标或摸一张牌", }, - forced:true, - popup:false, - async content(event,trigger,player){ - const storage=player.getStorage('olpijing_effect'); - player.removeSkill('olpijing_effect'); - const {result:{bool,targets}}=await player.chooseTarget('披荆:请选择此牌的额外目标',[1,storage.length],(card,player,target)=>{ - const trigger=get.event().getTrigger(); - return !trigger.targets.includes(target)&&get.event('storage').includes(target)&&lib.filter.targetEnabled2(trigger.card,player,target)&&lib.filter.targetInRange(trigger.card,player,target); - }).set('prompt2','不选择的角色视为你选择摸牌项').set('ai',target=>{ - const player=get.event('player'),trigger=get.event().getTrigger(); - return get.effect(target,trigger.card,player,player)-get.effect(player,{name:'draw'},player,player); - }).set('storage',storage); - if(bool){ + trigger: { player: "useCardToPlayer" }, + filter(event, player) { + return ( + (get.type(event.card) == "basic" || get.type(event.card) == "trick") && + event.targets.length == 1 + ); + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const storage = player.getStorage("olpijing_effect"); + player.removeSkill("olpijing_effect"); + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "披荆:请选择此牌的额外目标", + [1, storage.length], + (card, player, target) => { + const trigger = get.event().getTrigger(); + return ( + !trigger.targets.includes(target) && + get.event("storage").includes(target) && + lib.filter.targetEnabled2(trigger.card, player, target) && + lib.filter.targetInRange(trigger.card, player, target) + ); + } + ) + .set("prompt2", "不选择的角色视为你选择摸牌项") + .set("ai", (target) => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + return ( + get.effect(target, trigger.card, player, player) - + get.effect(player, { name: "draw" }, player, player) + ); + }) + .set("storage", storage); + if (bool) { player.line(targets); trigger.targets.addArray(targets); - if(storage.length-targets.length>0){ - player.draw(storage.length-targets.length); + if (storage.length - targets.length > 0) { + player.draw(storage.length - targets.length); } - } - else player.draw(storage.length); + } else player.draw(storage.length); }, }, }, }, //郭图 - olqushi:{ - audio:2, - enable:'phaseUse', - usable:1, - delay:false, - async content(event,trigger,player){ + olqushi: { + audio: 2, + enable: "phaseUse", + usable: 1, + delay: false, + async content(event, trigger, player) { await player.draw(); - if(player.countCards('h')&&game.hasPlayer(target=>target!=player)){ - const {result:{bool,targets,cards}}=await player.chooseCardTarget({ - forced:true, - prompt:'将一张手牌作为“趋”扣置于其他角色的武将牌上', - filterTarget:lib.filter.notMe, - filterCard:true, - position:'h', - ai1(card){ - if(get.type(card,false)=='equip') return 1-get.value(card); - return 7-get.value(card); + if (player.countCards("h") && game.hasPlayer((target) => target != player)) { + const { + result: { bool, targets, cards }, + } = await player.chooseCardTarget({ + forced: true, + prompt: "将一张手牌作为“趋”扣置于其他角色的武将牌上", + filterTarget: lib.filter.notMe, + filterCard: true, + position: "h", + ai1(card) { + if (get.type(card, false) == "equip") return 1 - get.value(card); + return 7 - get.value(card); }, - ai2(target){ - const att=get.sgn(get.sgn(get.attitude(get.event('player'),target))+0.5); - return (target.countCards('h')+1)*att; + ai2(target) { + const att = get.sgn(get.sgn(get.attitude(get.event("player"), target)) + 0.5); + return (target.countCards("h") + 1) * att; }, }); - if(bool){ - const target=targets[0]; - target.addSkill('olqushi_effect'); - target.markAuto('olqushi_effect',[player]); - game.log(player,'将一张牌扣置于',target,'的武将牌上'); - target.addToExpansion(cards,player,'giveAuto').gaintag.add('olqushi_effect'); + if (bool) { + const target = targets[0]; + target.addSkill("olqushi_effect"); + target.markAuto("olqushi_effect", [player]); + game.log(player, "将一张牌扣置于", target, "的武将牌上"); + target.addToExpansion(cards, player, "giveAuto").gaintag.add("olqushi_effect"); } } }, - ai:{ - order:1, - result:{player:1}, + ai: { + order: 1, + result: { player: 1 }, }, - subSkill:{ - effect:{ - charlotte:true, - onremove(player,skill){ + subSkill: { + effect: { + charlotte: true, + onremove(player, skill) { delete player.storage[skill]; - const cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - marktext:'趋', - intro:{ - content:'expansion', - markcount:'expansion', - mark(dialog,storage,player){ - return '共扣置'+get.cnNumber(player.getExpansions('olqushi_effect').length)+'张“趋”'; + marktext: "趋", + intro: { + content: "expansion", + markcount: "expansion", + mark(dialog, storage, player) { + return ( + "共扣置" + + get.cnNumber(player.getExpansions("olqushi_effect").length) + + "张“趋”" + ); }, }, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - popup:false, - async content(event,trigger,player){ - const cards=player.getExpansions('olqushi_effect'); - if(cards.length){ + trigger: { player: "phaseJieshuBegin" }, + forced: true, + popup: false, + async content(event, trigger, player) { + const cards = player.getExpansions("olqushi_effect"); + if (cards.length) { await player.loseToDiscardpile(cards); - const targets=player.getStorage('olqushi_effect').filter(i=>{ - return i.isIn(); - }).sortBySeat(); - const num=Math.min(player.getHistory('useCard',evt=>{ - return evt.targets&&evt.targets.length; - }).reduce((sum,evt)=>{ - return sum+evt.targets.length - },0),5); - if(targets.length&&player.getHistory('useCard',evt=>{ - return cards.some(card=>get.type2(card)==get.type2(evt.card)); - }).length&&num){ - for(const target of targets) await target.draw(num); + const targets = player + .getStorage("olqushi_effect") + .filter((i) => { + return i.isIn(); + }) + .sortBySeat(); + const num = Math.min( + player + .getHistory("useCard", (evt) => { + return evt.targets && evt.targets.length; + }) + .reduce((sum, evt) => { + return sum + evt.targets.length; + }, 0), + 5 + ); + if ( + targets.length && + player.getHistory("useCard", (evt) => { + return cards.some((card) => get.type2(card) == get.type2(evt.card)); + }).length && + num + ) { + for (const target of targets) await target.draw(num); } } - player.removeSkill('olqushi_effect'); + player.removeSkill("olqushi_effect"); }, }, }, }, - olweijie:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - filter(event,player){ - if(!game.hasPlayer(target=>{ - return get.distance(player,target)==1&&target.countCards('h'); - })||_status.currentPhase===player||event.olweijie) return false; - return get.inpileVCardList(info=>{ - const name=info[2]; - return get.type(name)=='basic'; - }).some(card=>event.filterCard({name:card[2],nature:card[3],isCard:true},player,event)); + olweijie: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + if ( + !game.hasPlayer((target) => { + return get.distance(player, target) == 1 && target.countCards("h"); + }) || + _status.currentPhase === player || + event.olweijie + ) + return false; + return get + .inpileVCardList((info) => { + const name = info[2]; + return get.type(name) == "basic"; + }) + .some((card) => + event.filterCard({ name: card[2], nature: card[3], isCard: true }, player, event) + ); }, - chooseButton:{ - dialog(event,player){ - const list=get.inpileVCardList(info=>{ - const name=info[2]; - return get.type(name)=='basic'; - }).filter(card=>event.filterCard({name:card[2],nature:card[3],isCard:true},player,event)); - return ui.create.dialog('诿解',[list,'vcard']); + chooseButton: { + dialog(event, player) { + const list = get + .inpileVCardList((info) => { + const name = info[2]; + return get.type(name) == "basic"; + }) + .filter((card) => + event.filterCard( + { name: card[2], nature: card[3], isCard: true }, + player, + event + ) + ); + return ui.create.dialog("诿解", [list, "vcard"]); }, - filter(button,player){ - return get.event().getParent().filterCard({name:button.link[2],nature:button.link[3],isCard:true},player,_status.event.getParent()); + filter(button, player) { + return get + .event() + .getParent() + .filterCard( + { name: button.link[2], nature: button.link[3], isCard: true }, + player, + _status.event.getParent() + ); }, - check(button){ - if(get.event().getParent().type!='phase') return 1; - return get.event('player').getUseValue({name:button.link[2],nature:button.link[3],isCard:true}); + check(button) { + if (get.event().getParent().type != "phase") return 1; + return get + .event("player") + .getUseValue({ name: button.link[2], nature: button.link[3], isCard: true }); }, - backup(links,player){ + backup(links, player) { return { - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, }, - filterCard:()=>false, - selectCard:-1, - *precontent(event,map){ + filterCard: () => false, + selectCard: -1, + *precontent(event, map) { delete event.result.skill; - const player=map.player; - let stop=false; - const result=yield player.chooseTarget('请选择一名距离为1的角色','弃置其一张手牌,若此牌牌名为【'+get.translation(event.result.card.name)+'】,则视为你使用/打出之',(card,player,target)=>{ - return get.distance(player,target)==1&&target.countCards('h'); - }).set('ai',target=>1-get.sgn(get.attitude(get.event('player'),target))); - if(result.bool){ - const target=result.targets[0]; - player.logSkill('olweijie',target); - player.tempBanSkill('olweijie',null,false); - const result2=yield player.discardPlayerCard(target,'h',true).set('prompt2','若弃置的牌名为【'+get.translation(event.result.card.name)+'】,则视为你使用/打出之').set('ai',button=>{ - if(button.link.isKnownBy(get.event('player'))&&button.link.name==get.event('namex')) return 114514; - return 1+Math.random(); - }).set('namex',event.result.card.name); - if(result2.bool){ - const card=result2.cards[0]; - if(get.name(card,target)==event.result.card.name){ - player.popup('洗具'); - stop=true; + const player = map.player; + let stop = false; + const result = yield player + .chooseTarget( + "请选择一名距离为1的角色", + "弃置其一张手牌,若此牌牌名为【" + + get.translation(event.result.card.name) + + "】,则视为你使用/打出之", + (card, player, target) => { + return ( + get.distance(player, target) == 1 && target.countCards("h") + ); } - else player.popup('杯具'); + ) + .set( + "ai", + (target) => 1 - get.sgn(get.attitude(get.event("player"), target)) + ); + if (result.bool) { + const target = result.targets[0]; + player.logSkill("olweijie", target); + player.tempBanSkill("olweijie", null, false); + const result2 = yield player + .discardPlayerCard(target, "h", true) + .set( + "prompt2", + "若弃置的牌名为【" + + get.translation(event.result.card.name) + + "】,则视为你使用/打出之" + ) + .set("ai", (button) => { + if ( + button.link.isKnownBy(get.event("player")) && + button.link.name == get.event("namex") + ) + return 114514; + return 1 + Math.random(); + }) + .set("namex", event.result.card.name); + if (result2.bool) { + const card = result2.cards[0]; + if (get.name(card, target) == event.result.card.name) { + player.popup("洗具"); + stop = true; + } else player.popup("杯具"); } } - if(!stop){ - const evt=event.getParent(); - evt.set('olweijie',true); + if (!stop) { + const evt = event.getParent(); + evt.set("olweijie", true); evt.goto(0); delete evt.openskilldialog; return; } }, - } + }; }, - prompt(links,player){ - const nature=(get.translation(links[0][3])||''); - const name='【'+get.translation(links[0][2])+'】'; - return '弃置距离为1的一名角色的一张手牌,若此牌牌名为'+name+',则你视为使用'+nature+name; + prompt(links, player) { + const nature = get.translation(links[0][3]) || ""; + const name = "【" + get.translation(links[0][2]) + "】"; + return ( + "弃置距离为1的一名角色的一张手牌,若此牌牌名为" + + name + + ",则你视为使用" + + nature + + name + ); }, }, - ai:{ - order:10, - respondSha:true, - respondShan:true, - skillTagFilter(player,tag){ - const name=(tag=='respondSha'?'sha':'shan'); - return lib.skill.olweijie.hiddenCard(player,name); + ai: { + order: 10, + respondSha: true, + respondShan: true, + skillTagFilter(player, tag) { + const name = tag == "respondSha" ? "sha" : "shan"; + return lib.skill.olweijie.hiddenCard(player, name); }, - result:{ - player(player){ - if(_status.event.dying&&get.attitude(player,_status.event.dying)<=0) return 0; - return game.hasPlayer(target=>{ - if(get.attitude(player,target)>0) return false; - return get.distance(player,target)==1&&target.countCards('h'); - })?1:0; + result: { + player(player) { + if (_status.event.dying && get.attitude(player, _status.event.dying) <= 0) + return 0; + return game.hasPlayer((target) => { + if (get.attitude(player, target) > 0) return false; + return get.distance(player, target) == 1 && target.countCards("h"); + }) + ? 1 + : 0; }, }, }, - hiddenCard(player,name){ - if(!lib.inpile.includes(name)||_status.currentPhase===player||player.isTempBanned('olweijie')) return false; - return get.type(name)=='basic'&&game.hasPlayer(target=>{ - return get.distance(player,target)==1&&target.countCards('h'); - }); + hiddenCard(player, name) { + if ( + !lib.inpile.includes(name) || + _status.currentPhase === player || + player.isTempBanned("olweijie") + ) + return false; + return ( + get.type(name) == "basic" && + game.hasPlayer((target) => { + return get.distance(player, target) == 1 && target.countCards("h"); + }) + ); }, }, //胡金定 - olqingyuan:{ - audio:2, - trigger:{ - global:['phaseBefore','gainAfter','loseAsyncAfter'], - player:['enterGame','damageEnd'], + olqingyuan: { + audio: 2, + trigger: { + global: ["phaseBefore", "gainAfter", "loseAsyncAfter"], + player: ["enterGame", "damageEnd"], }, - filter(event,player){ - const storage=player.getStorage('olqingyuan'); - if(event.name=='gain'||event.name=='loseAsync'){ - if(player.hasSkill('olqingyuan_used')) return false; - return storage.some(target=>event.getg(target).length)&&storage.some(target=>target.hasCard(card=>lib.filter.canBeGained(card,target,player),'h')); + filter(event, player) { + const storage = player.getStorage("olqingyuan"); + if (event.name == "gain" || event.name == "loseAsync") { + if (player.hasSkill("olqingyuan_used")) return false; + return ( + storage.some((target) => event.getg(target).length) && + storage.some((target) => + target.hasCard((card) => lib.filter.canBeGained(card, target, player), "h") + ) + ); } - if(!game.hasPlayer(target=>!storage.includes(target)&&target!=player)) return false; - if(event.name=='damage'&&player.getAllHistory('damage').indexOf(event)!=0) return false; - return event.name!='phase'||game.phaseNumber==0; + if (!game.hasPlayer((target) => !storage.includes(target) && target != player)) + return false; + if (event.name == "damage" && player.getAllHistory("damage").indexOf(event) != 0) + return false; + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - async content(event,trigger,player){ - if(trigger.name=='gain'||trigger.name=='loseAsync'){ - const target=player.getStorage('olqingyuan').filter(target=>target.hasCard(card=>lib.filter.canBeGained(card,target,player),'h')).randomGet(); + forced: true, + async content(event, trigger, player) { + if (trigger.name == "gain" || trigger.name == "loseAsync") { + const target = player + .getStorage("olqingyuan") + .filter((target) => + target.hasCard((card) => lib.filter.canBeGained(card, target, player), "h") + ) + .randomGet(); player.line(target); - player.addTempSkill('olqingyuan_used'); - player.gain(target.getCards('h',card=>{ - return lib.filter.canBeGained(card,target,player); - }).randomGet(),target,'giveAuto'); - } - else{ - const filterTarget=(card,player,target)=>{ - return target!=player&&!player.getStorage('olqingyuan').includes(target); - },targetsx=game.filterPlayer(current=>filterTarget(null,player,current)); + player.addTempSkill("olqingyuan_used"); + player.gain( + target + .getCards("h", (card) => { + return lib.filter.canBeGained(card, target, player); + }) + .randomGet(), + target, + "giveAuto" + ); + } else { + const filterTarget = (card, player, target) => { + return target != player && !player.getStorage("olqingyuan").includes(target); + }, + targetsx = game.filterPlayer((current) => filterTarget(null, player, current)); let result; - if(targetsx.length==1) result={bool:true,targets:targetsx}; - else result=await player.chooseTarget(filterTarget,true).set('prompt2','每回合限一次,当你以此法选择的角色获得牌后,你随机获得其中一名角色的一张手牌') - .set('prompt','请选择【轻缘】的目标').set('ai',target=>{ - const player=get.event('player'); - return get.effect(target,new lib.element.VCard({name:'shunshou_copy2'}),player,player); - }) - .forResult(); - if(result.bool){ - const target=result.targets[0]; + if (targetsx.length == 1) result = { bool: true, targets: targetsx }; + else + result = await player + .chooseTarget(filterTarget, true) + .set( + "prompt2", + "每回合限一次,当你以此法选择的角色获得牌后,你随机获得其中一名角色的一张手牌" + ) + .set("prompt", "请选择【轻缘】的目标") + .set("ai", (target) => { + const player = get.event("player"); + return get.effect( + target, + new lib.element.VCard({ name: "shunshou_copy2" }), + player, + player + ); + }) + .forResult(); + if (result.bool) { + const target = result.targets[0]; player.line(target); - game.log(player,'选择了',target); - player.markAuto('olqingyuan',[target]); + game.log(player, "选择了", target); + player.markAuto("olqingyuan", [target]); } } }, - subSkill:{used:{charlotte:true}}, - intro:{content:'已选择$为目标'}, - ai:{ - expose:0.3, + subSkill: { used: { charlotte: true } }, + intro: { content: "已选择$为目标" }, + ai: { + expose: 0.3, }, }, - olchongshen:{ - audio:2, - locked:false, - enable:'chooseToUse', - filterCard(card){ - return get.itemtype(card)=='card'&&card.hasGaintag('olchongshen')&&get.color(card)=='red'; + olchongshen: { + audio: 2, + locked: false, + enable: "chooseToUse", + filterCard(card) { + return ( + get.itemtype(card) == "card" && + card.hasGaintag("olchongshen") && + get.color(card) == "red" + ); }, - position:'h', - viewAs:{name:'shan'}, - viewAsFilter(player){ - if(!player.countCards('h',card=>card.hasGaintag('olchongshen')&&get.color(card)=='red')) return false; + position: "h", + viewAs: { name: "shan" }, + viewAsFilter(player) { + if ( + !player.countCards( + "h", + (card) => card.hasGaintag("olchongshen") && get.color(card) == "red" + ) + ) + return false; }, - prompt:'将本轮得到的红色牌当作【闪】使用', - check(card){ - return 7-get.value(card); + prompt: "将本轮得到的红色牌当作【闪】使用", + check(card) { + return 7 - get.value(card); }, - ai:{ - order:2, - respondShan:true, - skillTagFilter(player,tag,arg){ - if(arg=='respond'||!player.countCards('h',card=>_status.connectMode||card.hasGaintag('olchongshen')&&get.color(card)=='red')) return false; + ai: { + order: 2, + respondShan: true, + skillTagFilter(player, tag, arg) { + if ( + arg == "respond" || + !player.countCards( + "h", + (card) => + _status.connectMode || + (card.hasGaintag("olchongshen") && get.color(card) == "red") + ) + ) + return false; }, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0) return 0.6; + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.6; }, }, }, - group:'olchongshen_mark', - mod:{ - aiValue(player,card,num){ - if(get.name(card)!='shan'&&(get.itemtype(card)=='card'&&(!card.hasGaintag('olchongshen')||get.color(card)!='red'))) return; - let cards=player.getCards('hs',card=>get.name(card)=='shan'||card.hasGaintag('olchongshen')); - cards.sort((a,b)=>(get.name(b)=='shan'?1:2)-(get.name(a)=='shan'?1:2)); - const geti=()=>{ - if(cards.includes(card)) return cards.indexOf(card); + group: "olchongshen_mark", + mod: { + aiValue(player, card, num) { + if ( + get.name(card) != "shan" && + get.itemtype(card) == "card" && + (!card.hasGaintag("olchongshen") || get.color(card) != "red") + ) + return; + let cards = player.getCards( + "hs", + (card) => get.name(card) == "shan" || card.hasGaintag("olchongshen") + ); + cards.sort( + (a, b) => (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2) + ); + const geti = () => { + if (cards.includes(card)) return cards.indexOf(card); return cards.length; }; - if(get.name(card)=='shan') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6; - return Math.max(num,[6.5,4,3][Math.min(geti(),2)]); + if (get.name(card) == "shan") + return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); }, - aiUseful(){ - return lib.skill.olchongshen.mod.aiValue.apply(this,arguments); + aiUseful() { + return lib.skill.olchongshen.mod.aiValue.apply(this, arguments); }, // ignoredHandcard(card,player){ // if(card.hasGaintag('olchongshen')) return true; @@ -1373,285 +1960,397 @@ game.import('character', function () { // if(name=='phaseDiscard'&&card.hasGaintag('olchongshen')) return false; // }, }, - init(player){ - if(game.phaseNumber>0){ - const hs=player.getCards('h'),history=player.getAllHistory(); - let cards=[]; - for(let i=history.length-1;i>=0;i--){ - for(const evt of history[i].gain){ + init(player) { + if (game.phaseNumber > 0) { + const hs = player.getCards("h"), + history = player.getAllHistory(); + let cards = []; + for (let i = history.length - 1; i >= 0; i--) { + for (const evt of history[i].gain) { cards.addArray(evt.cards); } - if(history[i].isRound) break; + if (history[i].isRound) break; } - cards=cards.filter(i=>hs.includes(i)); - if(cards.length) player.addGaintag(cards,'olchongshen'); + cards = cards.filter((i) => hs.includes(i)); + if (cards.length) player.addGaintag(cards, "olchongshen"); } }, - onremove(player){ - player.removeGaintag('olchongshen'); + onremove(player) { + player.removeGaintag("olchongshen"); }, - subSkill:{ - mark:{ - charlotte:true, - trigger:{player:'gainBegin',global:'roundStart'}, - filter(event,player){ - return event.name=='gain'||game.roundNumber>1; + subSkill: { + mark: { + charlotte: true, + trigger: { player: "gainBegin", global: "roundStart" }, + filter(event, player) { + return event.name == "gain" || game.roundNumber > 1; }, - forced:true, - popup:false, - content(){ - if(trigger.name=='gain') trigger.gaintag.add('olchongshen'); - else player.removeGaintag('olchongshen'); + forced: true, + popup: false, + content() { + if (trigger.name == "gain") trigger.gaintag.add("olchongshen"); + else player.removeGaintag("olchongshen"); }, }, }, }, //田畴 - olshandao:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(target=>lib.skill.olshandao.filterTarget(null,player,target)); + olshandao: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer((target) => lib.skill.olshandao.filterTarget(null, player, target)); }, - filterTarget(card,player,target){ - return target.countCards('he'); + filterTarget(card, player, target) { + return target.countCards("he"); }, - usable:1, - selectTarget:[1,Infinity], - multitarget:true, - multiline:true, - async content(event,trigger,player){ - const wugu=new lib.element.VCard({name:'wugu'}); - const wanjian=new lib.element.VCard({name:'wanjian'}); - const targets=game.filterPlayer(target=>{ - if(target==player) return false; - return !event.targets.includes(target)&&player.canUse(wanjian,target,false); - }),targetx=event.targets.sortBySeat(); - let dialog=['将这些角色的各一张牌置于牌堆顶,然后视为对这些角色使用【五谷丰登】']; - for(const target of targetx){ - const name=(target==player?'你':get.translation(target)); - if(target.countCards('h')){ - dialog.add('
    '+name+'的手牌区
    '); - if(player.hasSkillTag('viewHandcard',null,target,true)||player==target) dialog.push(target.getCards('h')); - else dialog.push([target.getCards('h'),'blank']); + usable: 1, + selectTarget: [1, Infinity], + multitarget: true, + multiline: true, + async content(event, trigger, player) { + const wugu = new lib.element.VCard({ name: "wugu" }); + const wanjian = new lib.element.VCard({ name: "wanjian" }); + const targets = game.filterPlayer((target) => { + if (target == player) return false; + return !event.targets.includes(target) && player.canUse(wanjian, target, false); + }), + targetx = event.targets.sortBySeat(); + let dialog = ["将这些角色的各一张牌置于牌堆顶,然后视为对这些角色使用【五谷丰登】"]; + for (const target of targetx) { + const name = target == player ? "你" : get.translation(target); + if (target.countCards("h")) { + dialog.add('
    ' + name + "的手牌区
    "); + if (player.hasSkillTag("viewHandcard", null, target, true) || player == target) + dialog.push(target.getCards("h")); + else dialog.push([target.getCards("h"), "blank"]); } - if(target.countCards('e')) dialog.addArray(['
    '+name+'的装备区
    ',target.getCards('e')]); + if (target.countCards("e")) + dialog.addArray([ + '
    ' + name + "的装备区
    ", + target.getCards("e"), + ]); } - const {result:{bool,links}}=await player.chooseButton(dialog,event.targets.length,true).set('filterButton',button=>{ - return !ui.selected.buttons.some(but=>get.owner(but.link)==get.owner(button.link)); - }).set('ai',button=>1/(get.value(button.link,get.owner(button.link))||0.5)); - if(bool){ - const cards=links.sort((a,b)=>targetx.indexOf(get.owner(a))-targetx.indexOf(get.owner(b))); - for(const card of cards){ - const target=get.owner(card); - target.$throw(1,1000); - await target.lose([card],ui.cardPile,'insert'); + const { + result: { bool, links }, + } = await player + .chooseButton(dialog, event.targets.length, true) + .set("filterButton", (button) => { + return !ui.selected.buttons.some( + (but) => get.owner(but.link) == get.owner(button.link) + ); + }) + .set("ai", (button) => 1 / (get.value(button.link, get.owner(button.link)) || 0.5)); + if (bool) { + const cards = links.sort( + (a, b) => targetx.indexOf(get.owner(a)) - targetx.indexOf(get.owner(b)) + ); + for (const card of cards) { + const target = get.owner(card); + target.$throw(1, 1000); + await target.lose([card], ui.cardPile, "insert"); } - const targety=targetx.filter(target=>player.canUse(wugu,target,false)); - if(targety.length) await player.useCard(wugu,targety,false); - if(targets.length) await player.useCard(wanjian,targets,false); + const targety = targetx.filter((target) => player.canUse(wugu, target, false)); + if (targety.length) await player.useCard(wugu, targety, false); + if (targets.length) await player.useCard(wanjian, targets, false); } }, - ai:{ - order:9, - result:{target:1}, + ai: { + order: 9, + result: { target: 1 }, }, }, //李异 - olchanshuang:{ - audio:2, - enable:'phaseUse', - filterTarget:lib.filter.notMe, - usable:1, - content:function*(event,map){ - const player=map.player,target=event.target; - const choiceList=[ - '重铸一张牌', - '使用一张【杀】', - '弃置两张牌', - ],list=['重铸','出杀','弃牌','无法选择']; - let result=[]; - for(let current of [player,target]){ - let list1=list.slice(),choiceList1=choiceList.slice(); - list1=list1.filter(control=>{ - if(control=='无法选择') return false; - if(control=='重铸') return current.countCards('he',card=>current.canRecast(card)); - if(control=='出杀') return current.countCards('he',card=>card.name=='sha'&¤t.hasUseTarget(card)); - if(control=='弃牌') return current.countCards('he',card=>lib.filter.cardDiscardable(card,current))>1; + olchanshuang: { + audio: 2, + enable: "phaseUse", + filterTarget: lib.filter.notMe, + usable: 1, + content: function* (event, map) { + const player = map.player, + target = event.target; + const choiceList = ["重铸一张牌", "使用一张【杀】", "弃置两张牌"], + list = ["重铸", "出杀", "弃牌", "无法选择"]; + let result = []; + for (let current of [player, target]) { + let list1 = list.slice(), + choiceList1 = choiceList.slice(); + list1 = list1.filter((control) => { + if (control == "无法选择") return false; + if (control == "重铸") + return current.countCards("he", (card) => current.canRecast(card)); + if (control == "出杀") + return current.countCards( + "he", + (card) => card.name == "sha" && current.hasUseTarget(card) + ); + if (control == "弃牌") + return ( + current.countCards("he", (card) => + lib.filter.cardDiscardable(card, current) + ) > 1 + ); }); - choiceList1=choiceList.filter(control=>{ - if(choiceList.indexOf(control)==0) return current.countCards('he',card=>current.canRecast(card)); - if(choiceList.indexOf(control)==1) return current.countCards('he',card=>card.name=='sha'&¤t.hasUseTarget(card)); - if(choiceList.indexOf(control)==2) return current.countCards('he',card=>lib.filter.cardDiscardable(card,current))>1; + choiceList1 = choiceList.filter((control) => { + if (choiceList.indexOf(control) == 0) + return current.countCards("he", (card) => current.canRecast(card)); + if (choiceList.indexOf(control) == 1) + return current.countCards( + "he", + (card) => card.name == "sha" && current.hasUseTarget(card) + ); + if (choiceList.indexOf(control) == 2) + return ( + current.countCards("he", (card) => + lib.filter.cardDiscardable(card, current) + ) > 1 + ); }); - if(list1.length){ - if(list1.length==1) result.push(list.indexOf(list1[0])); - else{ - let result1=yield current.chooseControl(list1).set('ai',()=>{ - const current=_status.event.player; - const controls=_status.event.controls.slice(); - if(controls.includes('出杀')&¤t.countCards('hs',card=>card.name=='sha'&¤t.hasValueTarget(card))) return '出杀'; - if(controls.includes('重铸')) return '重铸'; - return '弃牌'; - }).set('choiceList',choiceList1); - if(result1.control) result.push(list.indexOf(result1.control)); + if (list1.length) { + if (list1.length == 1) result.push(list.indexOf(list1[0])); + else { + let result1 = yield current + .chooseControl(list1) + .set("ai", () => { + const current = _status.event.player; + const controls = _status.event.controls.slice(); + if ( + controls.includes("出杀") && + current.countCards( + "hs", + (card) => card.name == "sha" && current.hasValueTarget(card) + ) + ) + return "出杀"; + if (controls.includes("重铸")) return "重铸"; + return "弃牌"; + }) + .set("choiceList", choiceList1); + if (result1.control) result.push(list.indexOf(result1.control)); } - } - else result.push(3); + } else result.push(3); } player.popup(list[result[0]]); target.popup(list[result[1]]); - for(let current of [player,target]){ - switch(list[result[current==player?0:1]]){ - case '重铸': - let result2=yield current.chooseCard('he','请重铸一张牌',(card,player)=>player.canRecast(card),true); - if(result2.bool) current.recast(result2.cards); + for (let current of [player, target]) { + switch (list[result[current == player ? 0 : 1]]) { + case "重铸": + let result2 = yield current.chooseCard( + "he", + "请重铸一张牌", + (card, player) => player.canRecast(card), + true + ); + if (result2.bool) current.recast(result2.cards); break; - case '出杀': + case "出杀": current.chooseToUse({ - prompt:'请使用一张【杀】', - filterCard:function(card,player){ - if(card.name!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); + prompt: "请使用一张【杀】", + filterCard: function (card, player) { + if (card.name != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); }, - forced:true, - ai1:function(card){ + forced: true, + ai1: function (card) { return _status.event.player.getUseValue(card); }, }); break; - case '弃牌': - current.chooseToDiscard('he',2,true); + case "弃牌": + current.chooseToDiscard("he", 2, true); break; } } }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'},player)-0.1; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) - 0.1; }, - result:{ - target:function(player,target){ - const att=get.attitude(player,target); - if(target.countCards('hs',card=>{ - return card.name=='sha'&&game.hasPlayer(current=>{ - return target.canUse(card,current)&&get.effect(current,card,target,target)>0&&get.effect(current,card,target,player)>0; - }); - })) return 3; - if(att>0) return 2; - if(!target.countCards('h')) return get.sgn(att)+(att==0?1:0); + result: { + target: function (player, target) { + const att = get.attitude(player, target); + if ( + target.countCards("hs", (card) => { + return ( + card.name == "sha" && + game.hasPlayer((current) => { + return ( + target.canUse(card, current) && + get.effect(current, card, target, target) > 0 && + get.effect(current, card, target, player) > 0 + ); + }) + ); + }) + ) + return 3; + if (att > 0) return 2; + if (!target.countCards("h")) return get.sgn(att) + (att == 0 ? 1 : 0); return 0; }, }, }, - group:'olchanshuang_end', - subSkill:{ - end:{ - audio:'olchanshuang', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.getHistory('lose',evt=>{ - if(evt.type=='discard'){ - var evtx=evt.getl(player); - return evtx&&evtx.cards2.length==2; - } - return evt.getParent(2).name=='recast'; - }).length||player.getHistory('useCard',evt=>evt.card.name=='sha').length; + group: "olchanshuang_end", + subSkill: { + end: { + audio: "olchanshuang", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.getHistory("lose", (evt) => { + if (evt.type == "discard") { + var evtx = evt.getl(player); + return evtx && evtx.cards2.length == 2; + } + return evt.getParent(2).name == "recast"; + }).length || + player.getHistory("useCard", (evt) => evt.card.name == "sha").length + ); }, - forced:true, - locked:false, - content:function*(event,map){ - let num=0,player=map.player; - if(player.getHistory('lose',evt=>evt.getParent(2).name=='recast').length) num++; - if(player.getHistory('useCard',evt=>evt.card.name=='sha').length) num++; - if(player.getHistory('lose',evt=>{ - if(evt.type=='discard'){ - var evtx=evt.getl(player); - return evtx&&evtx.cards2.length==2; - } - }).length) num++; - if(num&&player.countCards('he',card=>player.canRecast(card))){ - let result=yield player.chooseCard('he','请重铸一张牌',(card,player)=>player.canRecast(card),true); - if(result.bool) yield player.recast(result.cards); + forced: true, + locked: false, + content: function* (event, map) { + let num = 0, + player = map.player; + if (player.getHistory("lose", (evt) => evt.getParent(2).name == "recast").length) + num++; + if (player.getHistory("useCard", (evt) => evt.card.name == "sha").length) num++; + if ( + player.getHistory("lose", (evt) => { + if (evt.type == "discard") { + var evtx = evt.getl(player); + return evtx && evtx.cards2.length == 2; + } + }).length + ) + num++; + if (num && player.countCards("he", (card) => player.canRecast(card))) { + let result = yield player.chooseCard( + "he", + "请重铸一张牌", + (card, player) => player.canRecast(card), + true + ); + if (result.bool) yield player.recast(result.cards); } - if(num>1&&player.countCards('he',card=>card.name=='sha'&&player.hasUseTarget(card))){ + if ( + num > 1 && + player.countCards( + "he", + (card) => card.name == "sha" && player.hasUseTarget(card) + ) + ) { yield player.chooseToUse({ - prompt:'请使用一张【杀】', - filterCard:function(card,player){ - if(card.name!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); + prompt: "请使用一张【杀】", + filterCard: function (card, player) { + if (card.name != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); }, - forced:true, - ai1:function(card){ + forced: true, + ai1: function (card) { return _status.event.player.getUseValue(card); }, }); } - if(num>2&&player.countCards('he',card=>lib.filter.cardDiscardable(card,player))) yield player.chooseToDiscard('he',2,true); + if ( + num > 2 && + player.countCards("he", (card) => lib.filter.cardDiscardable(card, player)) + ) + yield player.chooseToDiscard("he", 2, true); }, }, }, }, - olzhanjin:{ - audio:2, - locked:true, - group:'olzhanjin_guanshi', - subSkill:{ - guanshi:{ - audio:'olzhanjin', - nobracket:true, - equipSkill:true, - trigger:{player:['shaMiss','eventNeutralized']}, - filter:function(event,player){ - if(!player.hasEmptySlot(1)||!lib.card.guanshi||player.hasSkillTag('unequip_equip1')) return false; - if(event.type!='card'||event.card.name!='sha'||!event.target.isIn()) return false; - return player.countCards('he')>=2; + olzhanjin: { + audio: 2, + locked: true, + group: "olzhanjin_guanshi", + subSkill: { + guanshi: { + audio: "olzhanjin", + nobracket: true, + equipSkill: true, + trigger: { player: ["shaMiss", "eventNeutralized"] }, + filter: function (event, player) { + if ( + !player.hasEmptySlot(1) || + !lib.card.guanshi || + player.hasSkillTag("unequip_equip1") + ) + return false; + if (event.type != "card" || event.card.name != "sha" || !event.target.isIn()) + return false; + return player.countCards("he") >= 2; }, - direct:true, - locked:false, - content:function(){ - "step 0" - player.chooseToDiscard(get.prompt('olzhanjin_guanshi'),'弃置两张牌,令'+get.translation(trigger.card)+'强制命中',2,'he').set('ai',function(card){ - var evt=_status.event.getTrigger(); - if(get.attitude(evt.player,evt.target)<0){ - if(player.needsToDiscard()) return 15-get.value(card); - if(evt.baseDamage+evt.extraDamage>=Math.min(2,evt.target.hp)) return 8-get.value(card); - return 5-get.value(card); - } - return -1; - }).set('complexCard',true).logSkill='olzhanjin_guanshi'; - 'step 1' - if(result.bool){ - if(event.triggername=='shaMiss'){ + direct: true, + locked: false, + content: function () { + "step 0"; + player + .chooseToDiscard( + get.prompt("olzhanjin_guanshi"), + "弃置两张牌,令" + get.translation(trigger.card) + "强制命中", + 2, + "he" + ) + .set("ai", function (card) { + var evt = _status.event.getTrigger(); + if (get.attitude(evt.player, evt.target) < 0) { + if (player.needsToDiscard()) return 15 - get.value(card); + if (evt.baseDamage + evt.extraDamage >= Math.min(2, evt.target.hp)) + return 8 - get.value(card); + return 5 - get.value(card); + } + return -1; + }) + .set("complexCard", true).logSkill = "olzhanjin_guanshi"; + ("step 1"); + if (result.bool) { + if (event.triggername == "shaMiss") { trigger.untrigger(); - trigger.trigger('shaHit'); - trigger._result.bool=false; - trigger._result.result=null; - } - else trigger.unneutralize(); + trigger.trigger("shaHit"); + trigger._result.bool = false; + trigger._result.result = null; + } else trigger.unneutralize(); } }, - mod:{ - attackRange:function(player,num){ - if(lib.card.guanshi&&player.hasEmptySlot(1)) return num-lib.card.guanshi.distance.attackFrom; + mod: { + attackRange: function (player, num) { + if (lib.card.guanshi && player.hasEmptySlot(1)) + return num - lib.card.guanshi.distance.attackFrom; }, }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(player._olzhanjin_guanshi_temp||!player.hasEmptySlot(1)||!lib.card.guanshi||player.hasSkillTag('unequip_equip1')) return; - player._olzhanjin_guanshi_temp=true; - var bool=(get.attitude(player,arg.target)<0&&arg.card&&arg.card.name=='sha'&&player.countCards('he',card=>{ - return card!=arg.card&&(!arg.card.cards||!arg.card.cards.includes(card))&&get.value(card)<5; - })>1); + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + player._olzhanjin_guanshi_temp || + !player.hasEmptySlot(1) || + !lib.card.guanshi || + player.hasSkillTag("unequip_equip1") + ) + return; + player._olzhanjin_guanshi_temp = true; + var bool = + get.attitude(player, arg.target) < 0 && + arg.card && + arg.card.name == "sha" && + player.countCards("he", (card) => { + return ( + card != arg.card && + (!arg.card.cards || !arg.card.cards.includes(card)) && + get.value(card) < 5 + ); + }) > 1; delete player._olzhanjin_guanshi_temp; return bool; }, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('unequip_equip1')) return; - if(player==target&&get.subtype(card)=='equip1'){ - if(get.equipValue(card)<=get.equipValue({name:'guanshi'})) return 0; + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("unequip_equip1")) return; + if (player == target && get.subtype(card) == "equip1") { + if (get.equipValue(card) <= get.equipValue({ name: "guanshi" })) + return 0; } }, }, @@ -1660,1080 +2359,1450 @@ game.import('character', function () { }, }, //曹宇 - olgongjie:{ - audio:2, - trigger:{global:'phaseBegin'}, - filter(event,player){ - if(!player.countCards('he')) return false; - return !game.hasPlayer(current=>{ - var history=current.actionHistory; - for(var num=history.length-1;num>=0;num--){ - if(history[num].isRound) break; - if(history[num].isSkipped) continue; + olgongjie: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter(event, player) { + if (!player.countCards("he")) return false; + return !game.hasPlayer((current) => { + var history = current.actionHistory; + for (var num = history.length - 1; num >= 0; num--) { + if (history[num].isRound) break; + if (history[num].isSkipped) continue; return true; } return false; }); }, - direct:true, - async content(event,trigger,player){ - var num=player.countCards('he'),draws=[]; - var {result:{bool,targets}}=await player.chooseTarget(get.prompt2('olgongjie'),[1,num],lib.filter.notMe).set('ai',target=>get.attitude(_status.event.player,target)); - if(!bool) return; - targets=targets.sortBySeat(); - player.logSkill('olgongjie',targets); - for(var target of targets){ - var {result:{bool,cards}}=await target.gainPlayerCard(player,true,'he'); - if(bool) draws.add(get.suit(cards[0],player)); + direct: true, + async content(event, trigger, player) { + var num = player.countCards("he"), + draws = []; + var { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt2("olgongjie"), [1, num], lib.filter.notMe) + .set("ai", (target) => get.attitude(_status.event.player, target)); + if (!bool) return; + targets = targets.sortBySeat(); + player.logSkill("olgongjie", targets); + for (var target of targets) { + var { + result: { bool, cards }, + } = await target.gainPlayerCard(player, true, "he"); + if (bool) draws.add(get.suit(cards[0], player)); } player.draw(draws.length); }, }, - olxiangxv:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['gainAfter','equipAfter','addJudgeAfter','loseAsyncAfter','addToExpansionAfter'], + olxiangxv: { + audio: 2, + trigger: { + player: "loseAfter", + global: [ + "gainAfter", + "equipAfter", + "addJudgeAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter(event,player){ - if(!_status.currentPhase||!_status.currentPhase.isIn()) return false; - if(!player.isMinHandcard()) return false; - var evt=event.getl(player); - if(evt&&evt.player==player&&evt.hs&&evt.hs.length>0) return true; - if(event.getg) return game.hasPlayer(current=>{ - var cards=event.getg(current); - if(!cards.length) return false; - return current.countCards('h')>=player.countCards('h')&¤t.countCards('h')-cards.length 0) return true; + if (event.getg) + return game.hasPlayer((current) => { + var cards = event.getg(current); + if (!cards.length) return false; + return ( + current.countCards("h") >= player.countCards("h") && + current.countCards("h") - cards.length < player.countCards("h") + ); + }); return false; }, - check(event,player){ - var target=_status.currentPhase; - var cards=target.getCards('h'); - if(target.isPhaseUsing()){ - var cardx=cards.filter(card=>get.name(card)=='sha'); - cardx.sort((a,b)=>target.getUseValue(b)-target.getUseValue(a)); - cardx=cardx.slice(Math.min(cardx.length,target.getCardUsable('sha')),cardx.length); + check(event, player) { + var target = _status.currentPhase; + var cards = target.getCards("h"); + if (target.isPhaseUsing()) { + var cardx = cards.filter((card) => get.name(card) == "sha"); + cardx.sort((a, b) => target.getUseValue(b) - target.getUseValue(a)); + cardx = cardx.slice( + Math.min(cardx.length, target.getCardUsable("sha")), + cardx.length + ); cards.removeArray(cardx); } - return cards.length-player.countCards('h')>0; + return cards.length - player.countCards("h") > 0; }, - usable:1, - logTarget:()=>_status.currentPhase, - async content(event,trigger,player){ - player.when({global:'phaseEnd'}) - .then(()=>{ - if(target&&target.isIn()){ - var num=target.countCards('h')-player.countCards('h'); - if(num){ - if(num>0){ - if(player.countCards('h')<5) player.draw(Math.min(5-player.countCards('h'),num)); - event.finish(); - } - else player.chooseToDiscard(-num,'h',true); + usable: 1, + logTarget: () => _status.currentPhase, + async content(event, trigger, player) { + player + .when({ global: "phaseEnd" }) + .then(() => { + if (target && target.isIn()) { + var num = target.countCards("h") - player.countCards("h"); + if (num) { + if (num > 0) { + if (player.countCards("h") < 5) + player.draw(Math.min(5 - player.countCards("h"), num)); + event.finish(); + } else player.chooseToDiscard(-num, "h", true); + } else event.finish(); + } else event.finish(); + }) + .then(() => { + if (result.bool && result.cards.length > 1) { + if (player.isDamaged()) player.recover(); } - else event.finish(); - } - else event.finish(); - }) - .then(()=>{ - if(result.bool&&result.cards.length>1){ - if(player.isDamaged()) player.recover(); - } - }) - .vars({target:_status.currentPhase}); + }) + .vars({ target: _status.currentPhase }); }, }, - olxiangzuo:{ - audio:2, - trigger:{player:'dying'}, - filter(event,player){ - return player.countCards('he')&&game.hasPlayer(target=>target!=player); + olxiangzuo: { + audio: 2, + trigger: { player: "dying" }, + filter(event, player) { + return player.countCards("he") && game.hasPlayer((target) => target != player); }, - async cost(event,trigger,player){ - event.result=await player.chooseCardTarget({ - prompt:get.prompt2('olxiangzuo'), - filterCard:true, - selectCard:[1,Infinity], - filterTarget:lib.filter.notMe, - complexCard:true, - complexTarget:true, - complexSelect:true, - ai1(card){ - const player=get.event('player'); - if(!ui.selected.targets.length) return 0; - const target=ui.selected.targets[0]; - if(player.getHistory('useSkill',evt=>{ - return evt.skill=='olgongjie'&&(evt.targets||[evt.target]).includes(target); - }).length&&player.getHistory('useSkill',evt=>{ - return evt.skill=='olxiangxv'&&(evt.targets||[evt.target]).includes(target); - }).length){ - if(get.attitude(player,target)>0) return 1; - if(player.canSaveCard(card,player)) return 0; - if(ui.selected.cards.length+player.hp>=player.maxHp) return 0; - return 20-get.value(card); - } - if(get.attitude(player,target)>0&&!player.countCards('he',cardx=>player.canSaveCard(cardx,player))) return 1; - return 0; - }, - ai2(target){ - const player=get.event('player'); - const goon=(player.getHistory('useSkill',evt=>{ - return evt.skill=='olgongjie'&&(evt.targets||[evt.target]).includes(target); - }).length&&player.getHistory('useSkill',evt=>{ - return evt.skill=='olxiangxv'&&(evt.targets||[evt.target]).includes(target); - }).length),att=get.attitude(player,target); - if(goon) return 5*att; - if(!!player.countCards('he',cardx=>player.canSaveCard(cardx,player))) return att; - return 0; - }, - }).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + prompt: get.prompt2("olxiangzuo"), + filterCard: true, + selectCard: [1, Infinity], + filterTarget: lib.filter.notMe, + complexCard: true, + complexTarget: true, + complexSelect: true, + ai1(card) { + const player = get.event("player"); + if (!ui.selected.targets.length) return 0; + const target = ui.selected.targets[0]; + if ( + player.getHistory("useSkill", (evt) => { + return ( + evt.skill == "olgongjie" && + (evt.targets || [evt.target]).includes(target) + ); + }).length && + player.getHistory("useSkill", (evt) => { + return ( + evt.skill == "olxiangxv" && + (evt.targets || [evt.target]).includes(target) + ); + }).length + ) { + if (get.attitude(player, target) > 0) return 1; + if (player.canSaveCard(card, player)) return 0; + if (ui.selected.cards.length + player.hp >= player.maxHp) return 0; + return 20 - get.value(card); + } + if ( + get.attitude(player, target) > 0 && + !player.countCards("he", (cardx) => player.canSaveCard(cardx, player)) + ) + return 1; + return 0; + }, + ai2(target) { + const player = get.event("player"); + const goon = + player.getHistory("useSkill", (evt) => { + return ( + evt.skill == "olgongjie" && + (evt.targets || [evt.target]).includes(target) + ); + }).length && + player.getHistory("useSkill", (evt) => { + return ( + evt.skill == "olxiangxv" && + (evt.targets || [evt.target]).includes(target) + ); + }).length, + att = get.attitude(player, target); + if (goon) return 5 * att; + if (!!player.countCards("he", (cardx) => player.canSaveCard(cardx, player))) + return att; + return 0; + }, + }) + .forResult(); }, - limited:true, - skillAnimation:true, - animationColor:'water', - async content(event,trigger,player){ - const target=event.targets[0],cards=event.cards; - player.awakenSkill('olxiangzuo'); - await player.give(cards,target); - if(player.getHistory('useSkill',evt=>{ - return evt.skill=='olgongjie'&&evt.targets.includes(target); - }).length&&player.getHistory('useSkill',evt=>{ - return evt.skill=='olxiangxv'&&evt.targets.includes(target); - }).length) await player.recover(cards.length); + limited: true, + skillAnimation: true, + animationColor: "water", + async content(event, trigger, player) { + const target = event.targets[0], + cards = event.cards; + player.awakenSkill("olxiangzuo"); + await player.give(cards, target); + if ( + player.getHistory("useSkill", (evt) => { + return evt.skill == "olgongjie" && evt.targets.includes(target); + }).length && + player.getHistory("useSkill", (evt) => { + return evt.skill == "olxiangxv" && evt.targets.includes(target); + }).length + ) + await player.recover(cards.length); }, }, //OL飞扬 - olfeiyang:{ - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.countCards('he',card=>{ - if(_status.connectMode&&get.position(card)=='h') return true; - return lib.filter.cardDiscardable(card,player); - })>=3&&player.countCards('j'); + olfeiyang: { + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return ( + player.countCards("he", (card) => { + if (_status.connectMode && get.position(card) == "h") return true; + return lib.filter.cardDiscardable(card, player); + }) >= 3 && player.countCards("j") + ); }, - direct:true, + direct: true, //limited:true, //skillAnimation:true, //animationColor:'orange', - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('olfeiyang'),'he',3).set('ai',function(card){ - var player=_status.event.player; - if(player.hasCard(function(card){ - return get.effect(player,{ - name:card.viewAs||card.name, - cards:[card], - },player,player)<0; - },'j')) return 6-get.value(card); - return 0; - }).set('logSkill','olfeiyang'); - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt2("olfeiyang"), "he", 3) + .set("ai", function (card) { + var player = _status.event.player; + if ( + player.hasCard(function (card) { + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j") + ) + return 6 - get.value(card); + return 0; + }) + .set("logSkill", "olfeiyang"); + ("step 1"); + if (result.bool) { //player.awakenSkill('olfeiyang'); - player.discardPlayerCard(player,'j',true); + player.discardPlayerCard(player, "j", true); } }, }, //李婉 - ollianju:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - var history=player.getHistory('useCard'); - if(!history.length) return false; - var evt=history[history.length-1]; - return evt.cards&&evt.cards.filterInD('d').length; + ollianju: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + var history = player.getHistory("useCard"); + if (!history.length) return false; + var evt = history[history.length - 1]; + return evt.cards && evt.cards.filterInD("d").length; }, - direct:true, - content:function(){ - 'step 0' - var history=player.getHistory('useCard'); - var evt=history[history.length-1]; - event.evt=evt; - player.chooseTarget(get.prompt('ollianju'),'令一名角色获得'+get.translation(evt.cards.filterInD('d'))+'并记录'+get.translation(evt.card.name),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player,att=get.attitude(player,target); - var cards=_status.event.cards; - if(cards.filter(card=>get.name(card,false)=='du').length>=Math.ceil(cards.length/2)) att*=-1; - if(target.skipList.includes('phaseUse')||target.hasJudge('lebu')) return att/20; - return att; - }).set('cards',evt.cards.filterInD('d')); - 'step 1' - if(result.bool){ - var evt=event.evt; - var target=result.targets[0]; - player.logSkill('oliandui',target); - target.gain(evt.cards.filterInD('d'),'gain2'); - player.addSkill('ollianju_effect'); - player.storage.ollianju=evt.card.name; - player.markSkill('ollianju'); - if(!player.storage.ollianju_effect[target.playerid]) player.storage.ollianju_effect[target.playerid]=[]; + direct: true, + content: function () { + "step 0"; + var history = player.getHistory("useCard"); + var evt = history[history.length - 1]; + event.evt = evt; + player + .chooseTarget( + get.prompt("ollianju"), + "令一名角色获得" + + get.translation(evt.cards.filterInD("d")) + + "并记录" + + get.translation(evt.card.name), + lib.filter.notMe + ) + .set("ai", (target) => { + var player = _status.event.player, + att = get.attitude(player, target); + var cards = _status.event.cards; + if ( + cards.filter((card) => get.name(card, false) == "du").length >= + Math.ceil(cards.length / 2) + ) + att *= -1; + if (target.skipList.includes("phaseUse") || target.hasJudge("lebu")) + return att / 20; + return att; + }) + .set("cards", evt.cards.filterInD("d")); + ("step 1"); + if (result.bool) { + var evt = event.evt; + var target = result.targets[0]; + player.logSkill("oliandui", target); + target.gain(evt.cards.filterInD("d"), "gain2"); + player.addSkill("ollianju_effect"); + player.storage.ollianju = evt.card.name; + player.markSkill("ollianju"); + if (!player.storage.ollianju_effect[target.playerid]) + player.storage.ollianju_effect[target.playerid] = []; player.storage.ollianju_effect[target.playerid].add(evt.card.name); } }, - onunmark:true, - intro:{ - content:function(storage,player){ - var str='当前最后一次记录牌名:'+get.translation(storage); - if(player.storage.ollianju_effect){ - for(var i in player.storage.ollianju_effect){ - var target=game.findPlayer(target=>target.playerid==i); - if(!i) continue; - str+='
    '; - str+=get.translation(target)+'的下个结束阶段,其可令你获得其本回合使用的最后一张牌对应的所有位于弃牌堆的实体牌'; - str+=',然后若此牌名为'+get.translation(player.storage.ollianju_effect[i])+',则你失去1点体力,否则你可以视为使用'+get.translation(player.storage.ollianju_effect[i]); + onunmark: true, + intro: { + content: function (storage, player) { + var str = "当前最后一次记录牌名:" + get.translation(storage); + if (player.storage.ollianju_effect) { + for (var i in player.storage.ollianju_effect) { + var target = game.findPlayer((target) => target.playerid == i); + if (!i) continue; + str += "
    "; + str += + get.translation(target) + + "的下个结束阶段,其可令你获得其本回合使用的最后一张牌对应的所有位于弃牌堆的实体牌"; + str += + ",然后若此牌名为" + + get.translation(player.storage.ollianju_effect[i]) + + ",则你失去1点体力,否则你可以视为使用" + + get.translation(player.storage.ollianju_effect[i]); } } return str; }, }, - subSkill:{ - effect:{ - init:function(player){ - if(!player.storage.ollianju_effect) player.storage.ollianju_effect={}; + subSkill: { + effect: { + init: function (player) { + if (!player.storage.ollianju_effect) player.storage.ollianju_effect = {}; }, - charlotte:true, - trigger:{global:['phaseJieshuBegin','die']}, - filter:function(event,player){ + charlotte: true, + trigger: { global: ["phaseJieshuBegin", "die"] }, + filter: function (event, player) { return player.storage.ollianju_effect[event.player.playerid]; }, - direct:true, - content:function(){ - 'step 0' - if(trigger.name=='phaseJieshu') event.list=player.storage.ollianju_effect[trigger.player.playerid]; + direct: true, + content: function () { + "step 0"; + if (trigger.name == "phaseJieshu") + event.list = player.storage.ollianju_effect[trigger.player.playerid]; delete player.storage.ollianju_effect[trigger.player.playerid]; - var history=trigger.player.getHistory('useCard'); - var evt=history[history.length-1]; - event.evt=evt; - if(trigger.name=='die'||!history.length||!evt.cards||!evt.cards.filterInD('d').length) event.finish(); - 'step 1' - var evt=event.evt; - trigger.player.chooseBool(get.prompt('ollianju',player),'令'+get.translation(player)+'获得'+get.translation(evt.cards.filterInD('d'))+(event.list.includes(evt.card.name)?',然后'+get.translation(player)+'失去1点体力':'')).set('choice',get.attitude(trigger.player,player)>0&&(!event.list.includes(evt.card.name)||player.getHp()>1)); - 'step 2' - if(result.bool){ - var evt=event.evt,cards=evt.cards.filterInD('d'); + var history = trigger.player.getHistory("useCard"); + var evt = history[history.length - 1]; + event.evt = evt; + if ( + trigger.name == "die" || + !history.length || + !evt.cards || + !evt.cards.filterInD("d").length + ) + event.finish(); + ("step 1"); + var evt = event.evt; + trigger.player + .chooseBool( + get.prompt("ollianju", player), + "令" + + get.translation(player) + + "获得" + + get.translation(evt.cards.filterInD("d")) + + (event.list.includes(evt.card.name) + ? ",然后" + get.translation(player) + "失去1点体力" + : "") + ) + .set( + "choice", + get.attitude(trigger.player, player) > 0 && + (!event.list.includes(evt.card.name) || player.getHp() > 1) + ); + ("step 2"); + if (result.bool) { + var evt = event.evt, + cards = evt.cards.filterInD("d"); trigger.player.line(player); - player.gain(cards,'gain2'); - if(event.list.includes(evt.card.name)) player.loseHp(); - else{ - var card={ - name:evt.card.name, - isCard:true, + player.gain(cards, "gain2"); + if (event.list.includes(evt.card.name)) player.loseHp(); + else { + var card = { + name: evt.card.name, + isCard: true, }; - if(player.hasUseTarget(card)) player.chooseUseTarget(card,false); + if (player.hasUseTarget(card)) player.chooseUseTarget(card, false); } } }, }, }, }, - olsilv:{ - audio:2, - trigger:{ - player:['loseAfter','gainAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + olsilv: { + audio: 2, + trigger: { + player: ["loseAfter", "gainAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var name=player.storage.ollianju; - if(!name) return false; - if(event.getg) return event.getg(player).some(card=>card.name==name)&&!player.hasSkill('olsilv_gain'); - return event.getl(player).cards2.some(card=>card.name==name)&&!player.hasSkill('olsilv_lose'); + filter: function (event, player) { + var name = player.storage.ollianju; + if (!name) return false; + if (event.getg) + return ( + event.getg(player).some((card) => card.name == name) && + !player.hasSkill("olsilv_gain") + ); + return ( + event.getl(player).cards2.some((card) => card.name == name) && + !player.hasSkill("olsilv_lose") + ); }, - forced:true, - content:function(){ - 'step 0' - player.addTempSkill('olsilv_'+(trigger.getg?'gain':'lose')); - if(!trigger.visible){ - var cards,name=player.storage.ollianju; - if(trigger.getg) cards=trigger.getg(player).filter(card=>card.name==name); - else cards=trigger.getl(player).cards2.filter(card=>card.name==name); - if(cards.length) player.showCards(cards,get.translation(player)+'发动了【思闾】'); + forced: true, + content: function () { + "step 0"; + player.addTempSkill("olsilv_" + (trigger.getg ? "gain" : "lose")); + if (!trigger.visible) { + var cards, + name = player.storage.ollianju; + if (trigger.getg) cards = trigger.getg(player).filter((card) => card.name == name); + else cards = trigger.getl(player).cards2.filter((card) => card.name == name); + if (cards.length) player.showCards(cards, get.translation(player) + "发动了【思闾】"); } - 'step 1' + ("step 1"); player.draw(); }, - ai:{combo:'ollianju'}, - subSkill:{ - gain:{charlotte:true}, - lose:{charlotte:true}, + ai: { combo: "ollianju" }, + subSkill: { + gain: { charlotte: true }, + lose: { charlotte: true }, }, }, //丁尚涴 - olfudao:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + olfudao: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - content:function(){ - 'step 0' + forced: true, + locked: false, + content: function () { + "step 0"; player.draw(3); - 'step 1' - var num=player.countCards('h'); - if(num>0){ + ("step 1"); + var num = player.countCards("h"); + if (num > 0) { player.chooseCardTarget({ - prompt:'抚悼:将至多三张手张牌交给一名其他角色', - selectCard:[1,3], - filterCard:true, - filterTarget:lib.filter.notMe, - position:'h', - ai1:function(card){ - if(card.name=='du') return 10; - else if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - var player=_status.event.player; - if(ui.selected.cards.length>4||!game.hasPlayer(function(current){ - return get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); - })) return 0; - return 1/Math.max(0.1,get.value(card)); + prompt: "抚悼:将至多三张手张牌交给一名其他角色", + selectCard: [1, 3], + filterCard: true, + filterTarget: lib.filter.notMe, + position: "h", + ai1: function (card) { + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") + return 0; + var player = _status.event.player; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(ui.selected.cards[0].name=='du') return -att; - if(target.hasSkillTag('nogain')) att/=6; + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; return att; }, }); + } else event.goto(3); + ("step 2"); + if (result.bool) { + player.give(result.cards, result.targets[0]); } - else event.goto(3); - 'step 2' - if(result.bool){ - player.give(result.cards,result.targets[0]); - } - 'step 3' - var num=player.countCards('h'); - if(num>0) player.chooseToDiscard('h',[1,num],'抚悼:弃置任意张手牌,然后记录手牌数'); - 'step 4' - player.storage.olfudao=player.countCards('h'); - player.markSkill('olfudao'); + ("step 3"); + var num = player.countCards("h"); + if (num > 0) + player.chooseToDiscard("h", [1, num], "抚悼:弃置任意张手牌,然后记录手牌数"); + ("step 4"); + player.storage.olfudao = player.countCards("h"); + player.markSkill("olfudao"); }, - intro:{ - content:'一名角色的回合结束时,若其手牌数等于#,你可以与其各摸一张牌。', + intro: { + content: "一名角色的回合结束时,若其手牌数等于#,你可以与其各摸一张牌。", }, - group:'olfudao_qiaoshi', - subSkill:{ - qiaoshi:{ - audio:'olfudao', - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - if(typeof player.storage.olfudao!='number') return false; - return event.player.countCards('h')==player.storage.olfudao&&event.player.isIn(); + group: "olfudao_qiaoshi", + subSkill: { + qiaoshi: { + audio: "olfudao", + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + if (typeof player.storage.olfudao != "number") return false; + return ( + event.player.countCards("h") == player.storage.olfudao && event.player.isIn() + ); }, - check:function(event,player){ - return get.attitude(player,event.player)>=0; + check: function (event, player) { + return get.attitude(player, event.player) >= 0; }, - logTarget:'player', - prompt2:function(event,player){ - return '与'+get.translation(event.player)+'各摸一张牌'; + logTarget: "player", + prompt2: function (event, player) { + return "与" + get.translation(event.player) + "各摸一张牌"; }, - content:function(){ - game.asyncDraw([trigger.player,player]); + content: function () { + game.asyncDraw([trigger.player, player]); }, }, }, }, - olfengyan:{ - audio:2, - trigger:{player:['damageEnd','useCard','respond']}, - filter:function(event,player){ - if(event.name=='damage') return event.source&&event.source.isIn()&&event.source!=player; - return Array.isArray(event.respondTo)&&event.respondTo[0]!=player; + olfengyan: { + audio: 2, + trigger: { player: ["damageEnd", "useCard", "respond"] }, + filter: function (event, player) { + if (event.name == "damage") + return event.source && event.source.isIn() && event.source != player; + return Array.isArray(event.respondTo) && event.respondTo[0] != player; }, - logTarget:function(event,player){ - if(event.name=='damage') return event.source; + logTarget: function (event, player) { + if (event.name == "damage") return event.source; return event.respondTo[0]; }, - forced:true, - content:function(){ - 'step 0' - var target=lib.skill.olfengyan.logTarget(trigger,player); - var str=get.translation(target);event.target=target; - player.chooseControl().set('choiceList',[ - '摸一张牌,然后交给'+str+'一张牌', - '令'+str+'摸一张牌,然后'+str+'弃置两张牌', - ]).set('ai',()=>_status.event.att>0?0:1).set('att',get.attitude(player,target)); - 'step 1' - if(result.index==0){ + forced: true, + content: function () { + "step 0"; + var target = lib.skill.olfengyan.logTarget(trigger, player); + var str = get.translation(target); + event.target = target; + player + .chooseControl() + .set("choiceList", [ + "摸一张牌,然后交给" + str + "一张牌", + "令" + str + "摸一张牌,然后" + str + "弃置两张牌", + ]) + .set("ai", () => (_status.event.att > 0 ? 0 : 1)) + .set("att", get.attitude(player, target)); + ("step 1"); + if (result.index == 0) { player.draw(); - player.chooseToGive(target,'he',true); - } - else{ + player.chooseToGive(target, "he", true); + } else { target.draw(); - target.chooseToDiscard(2,'he',true); + target.chooseToDiscard(2, "he", true); } }, }, //张燕 - olsuji:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - if(!event.player.isDamaged()) return false; - return _status.connectMode&&player.countCards('hes')||!_status.connectMode&&player.hasCard(card=>{ - return get.color(card)=='black'; - },'hes'); + olsuji: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + if (!event.player.isDamaged()) return false; + return ( + (_status.connectMode && player.countCards("hes")) || + (!_status.connectMode && + player.hasCard((card) => { + return get.color(card) == "black"; + }, "hes")) + ); }, - direct:true, - content:[ - (event,map)=>{ - var player=map.player,trigger=map.trigger; - var next=player.chooseToUse(); - next.set('openskilldialog',`###${get.prompt('olsuji')}###将一张黑色牌当【杀】使用${ - player==trigger.player?'':`。若${get.translation(trigger.player)}受到了此【杀】的伤害,你获得其一张牌。` - }`); - next.set('norestore',true); - next.set('_backupevent','olsuji_backup'); - next.set('addCount',false); - next.set('logSkill','olsuji'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + direct: true, + content: [ + (event, map) => { + var player = map.player, + trigger = map.trigger; + var next = player.chooseToUse(); + next.set( + "openskilldialog", + `###${get.prompt("olsuji")}###将一张黑色牌当【杀】使用${ + player == trigger.player + ? "" + : `。若${get.translation( + trigger.player + )}受到了此【杀】的伤害,你获得其一张牌。` + }` + ); + next.set("norestore", true); + next.set("_backupevent", "olsuji_backup"); + next.set("addCount", false); + next.set("logSkill", "olsuji"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('olsuji_backup'); + next.backup("olsuji_backup"); }, - (event,map)=>{ - if(map.result.bool){ - var player=map.player,trigger=map.trigger; - if(trigger.player.isIn()&&trigger.player.hasHistory('damage',evt=>{ - return evt.card&&evt.card.storage&&evt.card.storage.olsuji; - })&&trigger.player.countGainableCards(player,'he')) player.gainPlayerCard(trigger.player,'he',true); + (event, map) => { + if (map.result.bool) { + var player = map.player, + trigger = map.trigger; + if ( + trigger.player.isIn() && + trigger.player.hasHistory("damage", (evt) => { + return evt.card && evt.card.storage && evt.card.storage.olsuji; + }) && + trigger.player.countGainableCards(player, "he") + ) + player.gainPlayerCard(trigger.player, "he", true); } }, ], - subSkill:{ - backup:{ - filterCard:function(card){ - return get.itemtype(card)=='card'&&get.color(card)=='black'; + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card" && get.color(card) == "black"; }, - viewAs:{ - name:'sha', - storage:{olsuji:true}, + viewAs: { + name: "sha", + storage: { olsuji: true }, }, - selectCard:1, - position:'hes', - ai1:function(card){ - return 5-get.value(card); + selectCard: 1, + position: "hes", + ai1: function (card) { + return 5 - get.value(card); }, - precontent:function(){ + precontent: function () { delete event.result.skill; }, }, }, }, - ollangdao:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return event.isFirstTarget&&event.targets.length==1&&player.getStorage('ollangdao').length<3; + ollangdao: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return ( + event.isFirstTarget && + event.targets.length == 1 && + player.getStorage("ollangdao").length < 3 + ); }, - logTarget:'target', - onremove:true, - check:function(event,player){ - if(get.attitude(player,event.target)>0){ - if(player.getStorage('ollangdao').includes(1)&&game.hasPlayer(current=>{ - return player.canUse(event.card,current)&&get.effect(current,event.card,player,player)>0; - })) return event.getRand()<0.5; + logTarget: "target", + onremove: true, + check: function (event, player) { + if (get.attitude(player, event.target) > 0) { + if ( + player.getStorage("ollangdao").includes(1) && + game.hasPlayer((current) => { + return ( + player.canUse(event.card, current) && + get.effect(current, event.card, player, player) > 0 + ); + }) + ) + return event.getRand() < 0.5; return false; } - return event.target.getHp()<=2||player.getDamagedHp()>1||!player.hasCard({color:'black'},'hes'); + return ( + event.target.getHp() <= 2 || + player.getDamagedHp() > 1 || + !player.hasCard({ color: "black" }, "hes") + ); }, - content:function*(event,map){ - var player=map.player,trigger=map.trigger,result=map.result; - var target=trigger.target; - var send=function(card,list){ - var next=game.createEvent('ollangdao_choose',false); + content: function* (event, map) { + var player = map.player, + trigger = map.trigger, + result = map.result; + var target = trigger.target; + var send = function (card, list) { + var next = game.createEvent("ollangdao_choose", false); next.setContent(lib.skill.ollangdao.contentx); - next.set('card',card); - next.set('list',list); + next.set("card", card); + next.set("list", list); game.resume(); }; - var sendback=function(result,player){ - if(!result) result={}; - if(typeof result.index!=='number'||result.index<0){ - result.index=[0,1,2].find(i=>!event.player.getStorage('ollangdao').includes(i)); + var sendback = function (result, player) { + if (!result) result = {}; + if (typeof result.index !== "number" || result.index < 0) { + result.index = [0, 1, 2].find( + (i) => !event.player.getStorage("ollangdao").includes(i) + ); } - results.push([player,result]); + results.push([player, result]); }; - var ai_targets=[]; - var results=[]; - var players=[player,target]; - var withme=false,withol=false,withai=false; - for(var i=0;i{ - return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)<0; - })) list.removeArray([0,2]); - if(player.getStorage('ollangdao').includes(2)) list.remove(0); + if (ai_targets.length) { + for (var i = 0; i < ai_targets.length; i++) { + if (players.includes(ai_targets[i])) { + var target = ai_targets[i]; + var list = [0, 1, 2].removeArray(player.getStorage("ollangdao")); + var index = list[0]; + if (get.attitude(target, player) < 0) { + if ( + !game.hasPlayer((current) => { + return ( + !trigger.targets.includes(current) && + player.canUse(trigger.card, current) && + get.effect(current, trigger.card, player, target) < 0 + ); + }) + ) + list.removeArray([0, 2]); + if (player.getStorage("ollangdao").includes(2)) list.remove(0); + } else { + if ( + !game.hasPlayer((current) => { + return ( + !trigger.targets.includes(current) && + player.canUse(trigger.card, current) && + get.effect(current, trigger.card, player, target) > 0 + ); + }) + ) + list.remove(1); + if (!list.includes(1)) list.remove(0); } - else{ - if(!game.hasPlayer(current=>{ - return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)>0; - })) list.remove(1); - if(!list.includes(1)) list.remove(0); - } - if(list.length) index=list.randomGet(); - sendback({index:index},target); - ai_targets.splice(i--,1); + if (list.length) index = list.randomGet(); + sendback({ index: index }, target); + ai_targets.splice(i--, 1); } } - if(ai_targets.length){ + if (ai_targets.length) { ai_targets.randomSort(); - setTimeout(function(){ - event.interval=setInterval(function(){ - var target=ai_targets.shift(); - var list=[0,1,2].removeArray(player.getStorage('ollangdao')); - var index=list[0]; - if(get.attitude(target,player)<0){ - if(!game.hasPlayer(current=>{ - return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)<0; - })) list.removeArray([0,2]); - if(player.getStorage('ollangdao').includes(2)) list.remove(0); - } - else{ - if(!game.hasPlayer(current=>{ - return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)>0; - })) list.remove(1); - if(!list.includes(1)) list.remove(0); - } - if(list.length) index=list.randomGet(); - sendback({index:index},target); - if(!ai_targets.length){ - clearInterval(event.interval); - if(withai) game.resume(); - } - },_status.connectMode?750:75); - },500); + setTimeout(function () { + event.interval = setInterval( + function () { + var target = ai_targets.shift(); + var list = [0, 1, 2].removeArray(player.getStorage("ollangdao")); + var index = list[0]; + if (get.attitude(target, player) < 0) { + if ( + !game.hasPlayer((current) => { + return ( + !trigger.targets.includes(current) && + player.canUse(trigger.card, current) && + get.effect(current, trigger.card, player, target) < 0 + ); + }) + ) + list.removeArray([0, 2]); + if (player.getStorage("ollangdao").includes(2)) list.remove(0); + } else { + if ( + !game.hasPlayer((current) => { + return ( + !trigger.targets.includes(current) && + player.canUse(trigger.card, current) && + get.effect(current, trigger.card, player, target) > 0 + ); + }) + ) + list.remove(1); + if (!list.includes(1)) list.remove(0); + } + if (list.length) index = list.randomGet(); + sendback({ index: index }, target); + if (!ai_targets.length) { + clearInterval(event.interval); + if (withai) game.resume(); + } + }, + _status.connectMode ? 750 : 75 + ); + }, 500); } } - if(withme){ - result=yield next; - if(_status.connectMode){ - game.me.unwait(result,game.me); - } - else{ - if(!result) result={}; - if(typeof result.index!=='number'||result.index<0){ - result.index=[0,1,2].find(i=>!event.player.getStorage('ollangdao').includes(i)); + if (withme) { + result = yield next; + if (_status.connectMode) { + game.me.unwait(result, game.me); + } else { + if (!result) result = {}; + if (typeof result.index !== "number" || result.index < 0) { + result.index = [0, 1, 2].find( + (i) => !event.player.getStorage("ollangdao").includes(i) + ); } - results.push([player,result]); + results.push([player, result]); } } - if(withol&&!event.resultOL){ + if (withol && !event.resultOL) { game.pause(); yield null; } - if(ai_targets.length>0){ - withai=true; + if (ai_targets.length > 0) { + withai = true; game.pause(); yield null; } - if(_status.connectMode){ - for(var i of [player,target]) i.hideTimer(); + if (_status.connectMode) { + for (var i of [player, target]) i.hideTimer(); } - var chosenCount=[0,0,0]; - results.sort((a,b)=>lib.sort.seat(a[0],b[0])); - player.when('useCardAfter') + var chosenCount = [0, 0, 0]; + results.sort((a, b) => lib.sort.seat(a[0], b[0])); + player + .when("useCardAfter") .assign({ - card:trigger.card + card: trigger.card, }) - .then(()=>{ - var card=get.info(event.name).card; - var dieEvts=game.getGlobalHistory('everything',evt=>evt.name=='die'); - if(trigger.card==card&&!game.hasPlayer2(current=>{ - for(var evt of dieEvts){ - if(evt.player!=current) continue; - var evtx=evt.getParent(2); - if(evtx.name!='damage') continue; - if(evtx.card&&evtx.card==card) return true; - } - return false; - },true)){ - var toRemove=card.storage.ollangdao_remove; - var list=[0,1,2].filter(i=>(toRemove>>i)&1); - if(!list.length) return; - player.markAuto('ollangdao',list); - game.log(player,'移去了','#g【狼蹈】','的','#y选项'+list.map(i=>{ - return get.cnNumber(i+1,true); - }).join('、')); + .then(() => { + var card = get.info(event.name).card; + var dieEvts = game.getGlobalHistory("everything", (evt) => evt.name == "die"); + if ( + trigger.card == card && + !game.hasPlayer2((current) => { + for (var evt of dieEvts) { + if (evt.player != current) continue; + var evtx = evt.getParent(2); + if (evtx.name != "damage") continue; + if (evtx.card && evtx.card == card) return true; + } + return false; + }, true) + ) { + var toRemove = card.storage.ollangdao_remove; + var list = [0, 1, 2].filter((i) => (toRemove >> i) & 1); + if (!list.length) return; + player.markAuto("ollangdao", list); + game.log( + player, + "移去了", + "#g【狼蹈】", + "的", + "#y选项" + + list + .map((i) => { + return get.cnNumber(i + 1, true); + }) + .join("、") + ); } }); - if(!trigger.card.storage) trigger.card.storage={}; - if(!trigger.card.storage.ollangdao_remove) trigger.card.storage.ollangdao_remove=0; - var config=[['伤害+1','fire'],['目标+1','wood'],['不能响应','water']]; - for(var res of results){ - var target=res[0],result=res[1]; - if(!target||!result) continue; - var ind=result.index; - var conf=config[ind]; - trigger.card.storage.ollangdao_remove|=1<{ - return !_status.event.targets.includes(target)&&player.canUse(_status.event.card,target); - }).set('targets',trigger.targets).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayex(); - var targets=result.targets; + result = yield player + .chooseTarget( + `狼蹈:为${get.translation(trigger.card)}额外指定至多${get.cnNumber( + extraTargetNum + )}个目标`, + (card, player, target) => { + return ( + !_status.event.targets.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("targets", trigger.targets) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayex(); + var targets = result.targets; player.line(targets); trigger.targets.addArray(targets); - game.log(targets,'也成为了',trigger.card,'的目标'); + game.log(targets, "也成为了", trigger.card, "的目标"); } }, - contentx:function(){ - 'step 0' - var name=get.translation(card); - var choices=[],choiceList=[ - `令${name}伤害基数+1`, - `令${name}可以多选择一个目标`, - `令${name}不可被响应` - ]; - [0,1,2].forEach((item,index)=>{ - if(event.list.includes(item)){ - choiceList[index]=`${choiceList[index]}` - } - else choices.push(`选项${get.cnNumber(index+1,true)}`); + contentx: function () { + "step 0"; + var name = get.translation(card); + var choices = [], + choiceList = [ + `令${name}伤害基数+1`, + `令${name}可以多选择一个目标`, + `令${name}不可被响应`, + ]; + [0, 1, 2].forEach((item, index) => { + if (event.list.includes(item)) { + choiceList[ + index + ] = `${choiceList[index]}`; + } else choices.push(`选项${get.cnNumber(index + 1, true)}`); }); - game.me.chooseControl(choices).set('prompt','狼蹈:请选择一项').set('choiceList',choiceList).set('ai',()=>{ - return _status.event.controls.randomGet(); - }); - 'step 1' - event.result={index:['选项一','选项二','选项三'].indexOf(result.control)}; + game.me + .chooseControl(choices) + .set("prompt", "狼蹈:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.controls.randomGet(); + }); + ("step 1"); + event.result = { index: ["选项一", "选项二", "选项三"].indexOf(result.control) }; }, - intro:{ - content:(storage,player)=>`已移除选项${storage.map(i=>get.cnNumber(i+1,true)).join('、')}`, + intro: { + content: (storage, player) => + `已移除选项${storage.map((i) => get.cnNumber(i + 1, true)).join("、")}`, }, }, //张既 - skill_zhangji_A:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - if(player.countMark('skill_zhangji_A_count')>=player.hp) return false; - return event.target!=player&&event.target.countCards('h')&&player.isPhaseUsing(); + skill_zhangji_A: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (player.countMark("skill_zhangji_A_count") >= player.hp) return false; + return event.target != player && event.target.countCards("h") && player.isPhaseUsing(); }, - check:function(event,player){ - return get.attitude(player,event.target)<0; + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - logTarget:'target', - content:function(){ - 'step 0' - player.addTempSkill('skill_zhangji_A_count','phaseUseAfter'); - player.addMark('skill_zhangji_A_count',1,false); + logTarget: "target", + content: function () { + "step 0"; + player.addTempSkill("skill_zhangji_A_count", "phaseUseAfter"); + player.addMark("skill_zhangji_A_count", 1, false); player.viewHandcards(trigger.target); - var list=[],choiceList=[ - '弃置'+get.translation(trigger.target)+'的一张牌,然后若弃置的牌的是能造成火焰伤害的牌,你摸一张牌', - '重铸'+get.translation(trigger.target)+'手牌中的所有【杀】和【决斗】', - '你与'+get.translation(trigger.target)+'互相对对方造成1点伤害', - ]; - list.push('选项一'); - if(trigger.target.countCards('h',{name:['sha','juedou']})) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(!trigger.target.countCards('h',{name:'shan'})) list.push('选项三'); - else choiceList[2]=''+choiceList[2]+''; - player.chooseControl(list).set('prompt',get.prompt('tspowei',target)).set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player,target=_status.event.target; - if(list.includes('选项三')&&player.hp+player.countCards('hs',{name:'tao'})>2) return '选项三'; - if(list.includes('选项二')&&target.countCards('h',{name:['sha','juedou']})>1) return'选项二'; - return '选项一'; - }).set('target',trigger.target); - 'step 1' - game.log(player,'选择了','#y'+result.control); - switch(result.control){ - case '选项一': - player.discardPlayerCard('he',trigger.target,'visible',true); + var list = [], + choiceList = [ + "弃置" + + get.translation(trigger.target) + + "的一张牌,然后若弃置的牌的是能造成火焰伤害的牌,你摸一张牌", + "重铸" + get.translation(trigger.target) + "手牌中的所有【杀】和【决斗】", + "你与" + get.translation(trigger.target) + "互相对对方造成1点伤害", + ]; + list.push("选项一"); + if (trigger.target.countCards("h", { name: ["sha", "juedou"] })) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (!trigger.target.countCards("h", { name: "shan" })) list.push("选项三"); + else choiceList[2] = '' + choiceList[2] + ""; + player + .chooseControl(list) + .set("prompt", get.prompt("tspowei", target)) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.target; + if ( + list.includes("选项三") && + player.hp + player.countCards("hs", { name: "tao" }) > 2 + ) + return "选项三"; + if ( + list.includes("选项二") && + target.countCards("h", { name: ["sha", "juedou"] }) > 1 + ) + return "选项二"; + return "选项一"; + }) + .set("target", trigger.target); + ("step 1"); + game.log(player, "选择了", "#y" + result.control); + switch (result.control) { + case "选项一": + player.discardPlayerCard("he", trigger.target, "visible", true); break; - case '选项二': - var cards=trigger.target.getCards('h',{name:['sha','juedou']}).filter(card=>trigger.target.canRecast(card)); + case "选项二": + var cards = trigger.target + .getCards("h", { name: ["sha", "juedou"] }) + .filter((card) => trigger.target.canRecast(card)); trigger.target.recast(cards); event.finish(); break; - case '选项三': + case "选项三": trigger.target.damage(player); player.damage(trigger.target); event.finish(); break; } - 'step 2' - if(result.bool&&get.tag(result.cards[0],'fireDamage')) player.draw(); + ("step 2"); + if (result.bool && get.tag(result.cards[0], "fireDamage")) player.draw(); }, - subSkill:{ - count:{ - charlotte:true, - onremove:true, + subSkill: { + count: { + charlotte: true, + onremove: true, }, }, }, - skill_zhangji_B:{ - getNum:function(name){ - var num=0; - if(name=='litong') num=1; - else switch(game.getRarity(name)){ - case 'junk':num=1;break; - case 'rare':num=2;break; - case 'epic':num=3;break; - case 'legend':num=4;break; - } + skill_zhangji_B: { + getNum: function (name) { + var num = 0; + if (name == "litong") num = 1; + else + switch (game.getRarity(name)) { + case "junk": + num = 1; + break; + case "rare": + num = 2; + break; + case "epic": + num = 3; + break; + case "legend": + num = 4; + break; + } return num; }, - getCharacter:function(list){ - var listx=[],num=0; - for(var name of list){ - var numx=lib.skill.skill_zhangji_B.getNum(name); - if(numx>num){ - num=numx; - listx=[name]; - } - else if(numx==num) listx.push(name); + getCharacter: function (list) { + var listx = [], + num = 0; + for (var name of list) { + var numx = lib.skill.skill_zhangji_B.getNum(name); + if (numx > num) { + num = numx; + listx = [name]; + } else if (numx == num) listx.push(name); } return listx; }, - group:'skill_zhangji_B_jieming', - audio:2, - trigger:{player:'dying'}, - skillAnimation:true, - animationColor:'water', - direct:true, - content:function(){ - 'step 0' - if(!_status.characterlist) lib.skill.pingjian.initList(); - player.chooseTarget(get.prompt('skill_zhangji_B'),'令一名其他角色选择是否更换武将牌',lib.filter.notMe).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - var num=lib.skill.skill_zhangji_B.getNum(target.name); - if(target.name2!=undefined) num=Math.min(num,lib.skill.skill_zhangji_B.getNum(target.name2)); - return att*(4-num); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('skill_zhangji_B',target); - var list=[]; - for(var i=0;i<_status.characterlist.length;i++){ - if(lib.character[_status.characterlist[i]][1]=='wei') list.push(_status.characterlist[i]); + group: "skill_zhangji_B_jieming", + audio: 2, + trigger: { player: "dying" }, + skillAnimation: true, + animationColor: "water", + direct: true, + content: function () { + "step 0"; + if (!_status.characterlist) lib.skill.pingjian.initList(); + player + .chooseTarget( + get.prompt("skill_zhangji_B"), + "令一名其他角色选择是否更换武将牌", + lib.filter.notMe + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var num = lib.skill.skill_zhangji_B.getNum(target.name); + if (target.name2 != undefined) + num = Math.min(num, lib.skill.skill_zhangji_B.getNum(target.name2)); + return att * (4 - num); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("skill_zhangji_B", target); + var list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + if (lib.character[_status.characterlist[i]][1] == "wei") + list.push(_status.characterlist[i]); } - list=list.randomGets(5); - var bolDialog=['请选择替换的武将',[list,'character']]; - target.chooseButton(bolDialog).set('ai',function(button){ - var target=_status.event.player; - var num=lib.skill.skill_zhangji_B.getNum(target.name); - if(target.name2!=undefined) num=Math.min(num,lib.skill.skill_zhangji_B.getNum(target.name2)); - return lib.skill.skill_zhangji_B.getNum(button.link)-num; + list = list.randomGets(5); + var bolDialog = ["请选择替换的武将", [list, "character"]]; + target.chooseButton(bolDialog).set("ai", function (button) { + var target = _status.event.player; + var num = lib.skill.skill_zhangji_B.getNum(target.name); + if (target.name2 != undefined) + num = Math.min(num, lib.skill.skill_zhangji_B.getNum(target.name2)); + return lib.skill.skill_zhangji_B.getNum(button.link) - num; }); - } - else event.finish(); - 'step 2' - if(result.bool){ - event.character=result.links[0]; - if(target.name2!=undefined) target.chooseControl(target.name1,target.name2).set('prompt','请选择要更换的武将牌').set('ai',function(){ - return lib.skill.skill_zhangji_B.getNum(target.name)2) return Math.min(5,target.maxHp)-target.countCards('h'); - return att/3; - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('skill_zhangji_B_jieming',target); + player + .chooseTarget( + get.prompt("skill_zhangji_B"), + "令一名手牌数小于其体力上限的角色摸三张牌,然后其将手牌数调整至其体力上限值", + function (card, player, target) { + return target.countCards("h") < target.maxHp; + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) return Math.min(5, target.maxHp) - target.countCards("h"); + return att / 3; + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("skill_zhangji_B_jieming", target); target.draw(3); - } - else event.finish(); - 'step 3' - if(target.countCards('h')>target.maxHp) target.chooseToDiscard('h',target.countCards('h')-target.maxHp,true); - if(event.count>0&&game.hasPlayer(function(current){ - return current.countCards('h') target.maxHp) + target.chooseToDiscard("h", target.countCards("h") - target.maxHp, true); + if ( + event.count > 0 && + game.hasPlayer(function (current) { + return current.countCards("h") < current.maxHp; + }) && + player.hasSkill("skill_zhangji_B") + ) + event.goto(1); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&target.hp>1){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - var max=0; - var players=game.filterPlayer(); - for(var i=0;i0){ - max=Math.max(Math.min(5,players[i].hp)-players[i].countCards('h'),max); + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.hp > 1) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + var max = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(target, players[i]) > 0) { + max = Math.max( + Math.min(5, players[i].hp) - players[i].countCards("h"), + max + ); } } - switch(max){ - case 0:return 2; - case 1:return 1.5; - case 2:return [1,2]; - default:return [0,max]; + switch (max) { + case 0: + return 2; + case 1: + return 1.5; + case 2: + return [1, 2]; + default: + return [0, max]; } } - if((card.name=='tao'||card.name=='caoyao')&& - target.hp>1&&target.countCards('h')<=target.hp) return [0,0]; - } + if ( + (card.name == "tao" || card.name == "caoyao") && + target.hp > 1 && + target.countCards("h") <= target.hp + ) + return [0, 0]; + }, }, }, }, }, }, //费祎 - yanru:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(!player.countCards('h')) return false; - var num=player.countCards('h')%2; - return !player.hasSkill('yanru_'+num); + yanru: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("h")) return false; + var num = player.countCards("h") % 2; + return !player.hasSkill("yanru_" + num); }, - filterCard:function(card,player){ - if(player.countCards('h')&&player.countCards('h')%2==0) return lib.filter.cardDiscardable(card,player); + filterCard: function (card, player) { + if (player.countCards("h") && player.countCards("h") % 2 == 0) + return lib.filter.cardDiscardable(card, player); return false; }, - selectCard:function(){ - var player=_status.event.player; - if(player.countCards('h')&&player.countCards('h')%2==0) return [player.countCards('h')/2,Infinity]; + selectCard: function () { + var player = _status.event.player; + if (player.countCards("h") && player.countCards("h") % 2 == 0) + return [player.countCards("h") / 2, Infinity]; return -1; }, - prompt:function(){ - var player=_status.event.player; + prompt: function () { + var player = _status.event.player; return [ - (player.countCards('h')?'弃置至少一半的手牌,然后':'')+'摸三张牌', - '摸三张牌,然后弃置至少一半的手牌', - ][player.countCards('h')%2]; + (player.countCards("h") ? "弃置至少一半的手牌,然后" : "") + "摸三张牌", + "摸三张牌,然后弃置至少一半的手牌", + ][player.countCards("h") % 2]; }, - check:function(card){ - var player=_status.event.player; - if(player.hasSkill('hezhong')&&(!(player.hasSkill('hezhong_0')&&player.hasSkill('hezhong_1')))){ - if(player.countCards('h')-ui.selected.cards.length>2) return 1/(get.value(card)||0.5); + check: function (card) { + var player = _status.event.player; + if ( + player.hasSkill("hezhong") && + !(player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1")) + ) { + if (player.countCards("h") - ui.selected.cards.length > 2) + return 1 / (get.value(card) || 0.5); return 0; } - if(ui.selected.cards.length{ - var player=_status.event.player; - if(player.hasSkill('hezhong')&&(!(player.hasSkill('hezhong_0')&&player.hasSkill('hezhong_1')))&&player.countCards('h')-ui.selected.cards.length>2) return 1/(get.value(card)||0.5); - if(!player.hasSkill('hezhong')&&ui.selected.cards.length { + var player = _status.event.player; + if ( + player.hasSkill("hezhong") && + !(player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1")) && + player.countCards("h") - ui.selected.cards.length > 2 + ) + return 1 / (get.value(card) || 0.5); + if ( + !player.hasSkill("hezhong") && + ui.selected.cards.length < Math.floor(player.countCards("h") / 2) + ) + return 1 / (get.value(card) || 0.5); + return 0; + }); }, - subSkill:{ - '0':{charlotte:true}, - '1':{charlotte:true}, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, }, - ai:{ - order:3, - result:{player:1}, + ai: { + order: 3, + result: { player: 1 }, }, }, - hezhong:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + hezhong: { + audio: 2, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - if(player.countCards('h')!=1||typeof get.number(player.getCards('h')[0],player)!='number') return false; - if(player.hasSkill('hezhong_0')&&player.hasSkill('hezhong_1')) return false; - let gain=0,lose=0; - if(event.getg) gain=event.getg(player).length; - if(event.getl) lose=event.getl(player).hs.length; - return gain!=lose; + filter: function (event, player) { + if ( + player.countCards("h") != 1 || + typeof get.number(player.getCards("h")[0], player) != "number" + ) + return false; + if (player.hasSkill("hezhong_0") && player.hasSkill("hezhong_1")) return false; + let gain = 0, + lose = 0; + if (event.getg) gain = event.getg(player).length; + if (event.getl) lose = event.getl(player).hs.length; + return gain != lose; }, - prompt2:function(event,player){ - var str='展示最后一张手牌并摸一张牌'; - if(!player.hasSkill('hezhong_0')||!player.hasSkill('hezhong_0')){ - str+=',然后令本回合使用点数'; - if(!player.hasSkill('hezhong_0')) str+='大于'; - if(!player.hasSkill('hezhong_0')&&!player.hasSkill('hezhong_0')) str+='或'; - if(!player.hasSkill('hezhong_1')) str+='小于'; - str+=get.number(player.getCards('h')[0],player); - str+='的普通锦囊牌额外结算一次'; + prompt2: function (event, player) { + var str = "展示最后一张手牌并摸一张牌"; + if (!player.hasSkill("hezhong_0") || !player.hasSkill("hezhong_0")) { + str += ",然后令本回合使用点数"; + if (!player.hasSkill("hezhong_0")) str += "大于"; + if (!player.hasSkill("hezhong_0") && !player.hasSkill("hezhong_0")) str += "或"; + if (!player.hasSkill("hezhong_1")) str += "小于"; + str += get.number(player.getCards("h")[0], player); + str += "的普通锦囊牌额外结算一次"; } return str; }, - frequent:true, - content:function(){ - 'step 0' - player.showHandcards(get.translation(player)+'发动了【技能】'); - event.num=get.number(player.getCards('h')[0],player); - 'step 1' + frequent: true, + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【技能】"); + event.num = get.number(player.getCards("h")[0], player); + ("step 1"); player.draw(); - 'step 2' - if(player.hasSkill('hezhong_0')) event._result={index:1}; - else if(player.hasSkill('hezhong_1')) event._result={index:0}; - else{ - player.chooseControl().set('choiceList',[ - '本回合使用点数大于'+num+'的普通锦囊牌额外结算一次', - '本回合使用点数小于'+num+'的普通锦囊牌额外结算一次', - ]).set('ai',()=>{ - var player=_status.event.player; - var num=_status.event.player; - if(player.getCards('h').reduce(function(num,card){ - return num+(get.number(card,player)||0); - },0)>num*2) return 0; - return 1; - }).set('num',num); + ("step 2"); + if (player.hasSkill("hezhong_0")) event._result = { index: 1 }; + else if (player.hasSkill("hezhong_1")) event._result = { index: 0 }; + else { + player + .chooseControl() + .set("choiceList", [ + "本回合使用点数大于" + num + "的普通锦囊牌额外结算一次", + "本回合使用点数小于" + num + "的普通锦囊牌额外结算一次", + ]) + .set("ai", () => { + var player = _status.event.player; + var num = _status.event.player; + if ( + player.getCards("h").reduce(function (num, card) { + return num + (get.number(card, player) || 0); + }, 0) > + num * 2 + ) + return 0; + return 1; + }) + .set("num", num); } - 'step 3' - var skill='hezhong_'+result.index; + ("step 3"); + var skill = "hezhong_" + result.index; player.addTempSkill(skill); - player.markAuto(skill,[num]); + player.markAuto(skill, [num]); }, - subSkill:{ - '0':{ - charlotte:true, - onremove:true, - marktext:'>', - intro:{ - markcount:(list)=>{ - var list2=[1,11,12,13]; - return list.reduce((str,num)=>{ - if(list2.includes(num)) return str+['A','J','Q','K'][list2.indexOf(num)]; - return str+parseFloat(num); - },''); + subSkill: { + 0: { + charlotte: true, + onremove: true, + marktext: ">", + intro: { + markcount: (list) => { + var list2 = [1, 11, 12, 13]; + return list.reduce((str, num) => { + if (list2.includes(num)) + return str + ["A", "J", "Q", "K"][list2.indexOf(num)]; + return str + parseFloat(num); + }, ""); }, - content:'使用的下一张点数大于$的普通锦囊牌额外结算一次', + content: "使用的下一张点数大于$的普通锦囊牌额外结算一次", }, - audio:'hezhong', - trigger:{player:'useCard'}, - filter:function(event,player){ - if(get.type(event.card)!='trick') return false; - if(!event.targets.length) return false; - var num=get.number(event.card,player); - return typeof num=='number'&&player.getStorage('hezhong_0').some(numx=>num>numx); + audio: "hezhong", + trigger: { player: "useCard" }, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (!event.targets.length) return false; + var num = get.number(event.card, player); + return ( + typeof num == "number" && + player.getStorage("hezhong_0").some((numx) => num > numx) + ); }, - forced:true, - usable:1, - content:function(){ - player.unmarkSkill('hezhong_0'); + forced: true, + usable: 1, + content: function () { + player.unmarkSkill("hezhong_0"); trigger.effectCount++; - game.log(trigger.card,'额外结算一次'); + game.log(trigger.card, "额外结算一次"); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(card.name=='tiesuo'&&(!player.storage.counttrigger||!player.storage.counttrigger.hezhong_0)) return 'zerotarget'; + ai: { + effect: { + player: function (card, player, target) { + if ( + card.name == "tiesuo" && + (!player.storage.counttrigger || + !player.storage.counttrigger.hezhong_0) + ) + return "zerotarget"; }, }, }, }, - '1':{ - charlotte:true, - onremove:true, - marktext:'<', - intro:{ - markcount:(list)=>{ - var list2=[1,11,12,13]; - return list.reduce((str,num)=>{ - if(list2.includes(num)) return str+['A','J','Q','K'][list2.indexOf(num)]; - return str+parseFloat(num); - },''); + 1: { + charlotte: true, + onremove: true, + marktext: "<", + intro: { + markcount: (list) => { + var list2 = [1, 11, 12, 13]; + return list.reduce((str, num) => { + if (list2.includes(num)) + return str + ["A", "J", "Q", "K"][list2.indexOf(num)]; + return str + parseFloat(num); + }, ""); }, - content:'使用的下一张点数小于$的普通锦囊牌额外结算一次', + content: "使用的下一张点数小于$的普通锦囊牌额外结算一次", }, - audio:'hezhong', - trigger:{player:'useCard'}, - filter:function(event,player){ - if(get.type(event.card)!='trick') return false; - if(!event.targets.length) return false; - var num=get.number(event.card,player); - return typeof num=='number'&&player.getStorage('hezhong_1').some(numx=>num num < numx) + ); }, - forced:true, - usable:1, - content:function(){ - player.unmarkSkill('hezhong_1'); + forced: true, + usable: 1, + content: function () { + player.unmarkSkill("hezhong_1"); trigger.effectCount++; - game.log(trigger.card,'额外结算一次'); + game.log(trigger.card, "额外结算一次"); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(card.name=='tiesuo'&&(!player.storage.counttrigger||!player.storage.counttrigger.hezhong_1)) return 'zerotarget'; + ai: { + effect: { + player: function (card, player, target) { + if ( + card.name == "tiesuo" && + (!player.storage.counttrigger || + !player.storage.counttrigger.hezhong_1) + ) + return "zerotarget"; }, }, }, @@ -2741,3518 +3810,4530 @@ game.import('character', function () { }, }, //吕伯奢 - olfushi:{ - audio:2, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.player.isIn()&&event.card.name=='sha'&&event.cards&&event.cards.filterInD().length&&get.distance(player,event.player)<=1; + olfushi: { + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + event.player.isIn() && + event.card.name == "sha" && + event.cards && + event.cards.filterInD().length && + get.distance(player, event.player) <= 1 + ); }, - forced:true, - locked:false, - logTarget:'player', - content:function(){ - player.addToExpansion(trigger.cards.filterInD(),'gain2').gaintag.add('olfushi'); + forced: true, + locked: false, + logTarget: "player", + content: function () { + player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("olfushi"); }, - marktext:'豕', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "豕", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'olfushi_wusheng', - subSkill:{ - wusheng:{ - enable:'chooseToUse', - filter:function(event,player){ - return player.getExpansions('olfushi').length&&event.filterCard({name:'sha',isCard:true},player,event); + group: "olfushi_wusheng", + subSkill: { + wusheng: { + enable: "chooseToUse", + filter: function (event, player) { + return ( + player.getExpansions("olfushi").length && + event.filterCard({ name: "sha", isCard: true }, player, event) + ); }, - chooseButton:{ - dialog:function(event,player){ + chooseButton: { + dialog: function (event, player) { return ui.create.dialog( '###缚豕###
    将任意“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并执行等量项
    ', - player.getExpansions('olfushi'), - [['额外目标','伤害-1','伤害+1'],'tdnodes'], - 'hidden' + player.getExpansions("olfushi"), + [["额外目标", "伤害-1", "伤害+1"], "tdnodes"], + "hidden" ); }, - filter:function(button){ - const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); - if(cards.length>=3&&typeof button.link=='string') return false; + filter: function (button) { + const cards = ui.selected.buttons.filter( + (button) => typeof button.link == "object" + ); + if (cards.length >= 3 && typeof button.link == "string") return false; return true; }, - select:[2,Infinity], - filterOk:()=>{ - if(!ui.selected.buttons.length) return false; - const controls=ui.selected.buttons.filter(button=>typeof button.link=='string'); - const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); - if(cards.length>=3){ - const dialog=get.event().dialog; - if(dialog&&dialog.buttons){ - dialog.buttons.forEach(button=>{ - if(typeof button.link!='string') return; - button.classList.remove('selectable'); - button.classList.remove('selected'); + select: [2, Infinity], + filterOk: () => { + if (!ui.selected.buttons.length) return false; + const controls = ui.selected.buttons.filter( + (button) => typeof button.link == "string" + ); + const cards = ui.selected.buttons.filter( + (button) => typeof button.link == "object" + ); + if (cards.length >= 3) { + const dialog = get.event().dialog; + if (dialog && dialog.buttons) { + dialog.buttons.forEach((button) => { + if (typeof button.link != "string") return; + button.classList.remove("selectable"); + button.classList.remove("selected"); ui.selected.buttons.remove(button); }); } return true; } - return cards.length==controls.length; + return cards.length == controls.length; }, - check:function(button){ - const player=get.player(); - const card=new lib.element.VCard({name:'sha',isCard:true}); - const targets=game.filterPlayer(target=>{ - return player.canUse(card,target); + check: function (button) { + const player = get.player(); + const card = new lib.element.VCard({ name: "sha", isCard: true }); + const targets = game.filterPlayer((target) => { + return player.canUse(card, target); }); - const num0=targets.filter(target=>get.effect(target,card,player,player)>0).length; - if(num0<=0) return 0; - const num1=Math.max(0,num0-1); - const num2=targets.length-num1; - const num3=player.getExpansions('olfushi').length; + const num0 = targets.filter( + (target) => get.effect(target, card, player, player) > 0 + ).length; + if (num0 <= 0) return 0; + const num1 = Math.max(0, num0 - 1); + const num2 = targets.length - num1; + const num3 = player.getExpansions("olfushi").length; let list; - if((num1>0&&num2>0)||(num1==0&&num2==0)){ - switch(num3){ + if ((num1 > 0 && num2 > 0) || (num1 == 0 && num2 == 0)) { + switch (num3) { case 1: - list=[['额外目标','伤害+1'].randomGet()]; + list = [["额外目标", "伤害+1"].randomGet()]; break; case 2: - list=[['额外目标','伤害+1'].randomGet(),'伤害-1']; + list = [["额外目标", "伤害+1"].randomGet(), "伤害-1"]; break; default: - list=['额外目标','伤害-1','伤害+1']; + list = ["额外目标", "伤害-1", "伤害+1"]; break; } - } - else if(num2==0){ - switch(num3){ + } else if (num2 == 0) { + switch (num3) { case 1: - list=['伤害+1']; + list = ["伤害+1"]; break; case 2: - list=['额外目标','伤害+1']; + list = ["额外目标", "伤害+1"]; break; default: - list=['额外目标','伤害-1','伤害+1']; + list = ["额外目标", "伤害-1", "伤害+1"]; break; } - } - else if(num1==0){ - switch(num3){ + } else if (num1 == 0) { + switch (num3) { case 1: - list=['伤害+1']; + list = ["伤害+1"]; break; default: - list=['伤害-1','伤害+1']; + list = ["伤害-1", "伤害+1"]; break; } } - if(typeof button.link=='string'){ - if(list.includes(button.link)) return 114514; + if (typeof button.link == "string") { + if (list.includes(button.link)) return 114514; return -1; - } - else{ - const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); - if(list.length==3&&(player.getHp()<=2||cards.length typeof button.link == "object" + ); + if ( + (list.length == 3 && + (player.getHp() <= 2 || cards.length < num3 - 1)) || + cards.length < list.length + ) + return 1 / (get.value(button.link) || 0.5); return -1; } }, - backup:function(links,player){ - var cards=links.filter(button=>typeof button=='object'); - var controls=links.filter(button=>typeof button=='string'); - if(!controls.length) controls=['额外目标','伤害-1','伤害+1']; + backup: function (links, player) { + var cards = links.filter((button) => typeof button == "object"); + var controls = links.filter((button) => typeof button == "string"); + if (!controls.length) controls = ["额外目标", "伤害-1", "伤害+1"]; return { - audio:'olfushi', - selectCard:-1, - position:'x', - cards:cards, - controls:controls, - filterCard:function(card){ + audio: "olfushi", + selectCard: -1, + position: "x", + cards: cards, + controls: controls, + filterCard: function (card) { return lib.skill.olfushi_wusheng_backup.cards.includes(card); }, - viewAs:{ - name:'sha', - isCard:true, + viewAs: { + name: "sha", + isCard: true, }, - precontent:function(){ - var cards=lib.skill.olfushi_wusheng_backup.cards.slice(); - var controls=lib.skill.olfushi_wusheng_backup.controls.slice(); - player.logSkill('olfushi'); + precontent: function () { + var cards = lib.skill.olfushi_wusheng_backup.cards.slice(); + var controls = lib.skill.olfushi_wusheng_backup.controls.slice(); + player.logSkill("olfushi"); delete event.result.skill; - event.result.card=new lib.element.VCard(lib.skill.olfushi_wusheng_backup.viewAs); - event.result.cards=[]; + event.result.card = new lib.element.VCard( + lib.skill.olfushi_wusheng_backup.viewAs + ); + event.result.cards = []; player.loseToDiscardpile(cards); player.draw(cards.length); - event.result.card.storage.olfushi_buff=controls; - player.addTempSkill('olfushi_buff'); - } - } + event.result.card.storage.olfushi_buff = controls; + player.addTempSkill("olfushi_buff"); + }, + }; + }, + prompt: function (links, player) { + let controls = links.filter((button) => typeof button == "string"); + if (!controls.length) controls = ["额外目标", "伤害-1", "伤害+1"]; + return `请选择【杀】的目标(${controls.join("、")})`; }, - prompt:function(links,player){ - let controls=links.filter(button=>typeof button=='string'); - if(!controls.length) controls=['额外目标','伤害-1','伤害+1']; - return `请选择【杀】的目标(${controls.join('、')})`; - } }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'})+0.1; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; }, - result:{player:1}, - respondSha:true, - skillTagFilter:function(player,tag,arg){ - if(arg=='respond') return false; - if(!player.getExpansions('olfushi').length) return false; + result: { player: 1 }, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + if (!player.getExpansions("olfushi").length) return false; }, }, }, - buff:{ - charlotte:true, - trigger:{player:['useCard2','useCardToPlayered']}, - filter:function(event,player,name){ - if(!event.card.storage||!event.card.storage.olfushi_buff) return false; - if(name=='useCard2') return true; - return event.getParent().triggeredTargets3.length==event.targets.length&&event.card.storage.olfushi_buff.length>1&&event.card.storage.olfushi_buff.includes('伤害-1')&&!event.targets.some(target=>!event.targets.includes(target.getPrevious())&&!event.targets.includes(target.getNext())); + buff: { + charlotte: true, + trigger: { player: ["useCard2", "useCardToPlayered"] }, + filter: function (event, player, name) { + if (!event.card.storage || !event.card.storage.olfushi_buff) return false; + if (name == "useCard2") return true; + return ( + event.getParent().triggeredTargets3.length == event.targets.length && + event.card.storage.olfushi_buff.length > 1 && + event.card.storage.olfushi_buff.includes("伤害-1") && + !event.targets.some( + (target) => + !event.targets.includes(target.getPrevious()) && + !event.targets.includes(target.getNext()) + ) + ); }, - forced:true, - popup:false, - content:function(){ - 'step 0' - if(event.triggername=='useCardToPlayered'){ - if(trigger.getParent().addCount!==false){ - trigger.getParent().addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + forced: true, + popup: false, + content: function () { + "step 0"; + if (event.triggername == "useCardToPlayered") { + if (trigger.getParent().addCount !== false) { + trigger.getParent().addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } } - game.log(trigger.card,'不计入次数'); + game.log(trigger.card, "不计入次数"); event.finish(); return; } - var list=trigger.card.storage.olfushi_buff; - event.list=list; - var canBeAddedTargets=game.filterPlayer(target=>{ - return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); + var list = trigger.card.storage.olfushi_buff; + event.list = list; + var canBeAddedTargets = game.filterPlayer((target) => { + return ( + !trigger.targets.includes(target) && player.canUse(trigger.card, target) + ); }); - if(!list.includes('额外目标')||!canBeAddedTargets.length) event._result={bool:false}; - else if(canBeAddedTargets.length==1) event._result={bool:true,targets:canBeAddedTargets}; - else player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); - },true).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); + if (!list.includes("额外目标") || !canBeAddedTargets.length) + event._result = { bool: false }; + else if (canBeAddedTargets.length == 1) + event._result = { bool: true, targets: canBeAddedTargets }; + else + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "的额外目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return ( + !trigger.targets.includes(target) && + player.canUse(trigger.card, target) + ); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); player.line(targets); trigger.targets.addArray(targets); - game.log(targets,'成为了',trigger.card,'的额外目标'); + game.log(targets, "成为了", trigger.card, "的额外目标"); } - 'step 2' - if(!event.list.includes('伤害-1')) event._result={bool:false}; - else if(trigger.targets.length==1) event._result={bool:true,targets:trigger.targets.slice()}; - else player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害-1的目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return trigger.targets.includes(target); - },true).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target); - }); - 'step 3' - if(result.bool){ - var target=result.targets[0]; + ("step 2"); + if (!event.list.includes("伤害-1")) event._result = { bool: false }; + else if (trigger.targets.length == 1) + event._result = { bool: true, targets: trigger.targets.slice() }; + else + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "伤害-1的目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return trigger.targets.includes(target); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - game.log(trigger.card,'对',target,'的伤害-1'); - player.addTempSkill('olfushi_buff2'); - player.initStorage('olfushi_buff2',[]); - player.getStorage('olfushi_buff2').push([target,trigger.card]); + game.log(trigger.card, "对", target, "的伤害-1"); + player.addTempSkill("olfushi_buff2"); + player.initStorage("olfushi_buff2", []); + player.getStorage("olfushi_buff2").push([target, trigger.card]); } - 'step 4' - if(!event.list.includes('伤害+1')) event.finish(); - else if(trigger.targets.length==1) event._result={bool:true,targets:trigger.targets.slice()}; - else player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害+1的目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return trigger.targets.includes(target); - },true).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 5' - if(result.bool){ - var target=result.targets[0]; + ("step 4"); + if (!event.list.includes("伤害+1")) event.finish(); + else if (trigger.targets.length == 1) + event._result = { bool: true, targets: trigger.targets.slice() }; + else + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "伤害+1的目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return trigger.targets.includes(target); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 5"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - game.log(trigger.card,'对',target,'的伤害+1'); - player.addTempSkill('olfushi_buff3'); - player.initStorage('olfushi_buff3',[]); - player.getStorage('olfushi_buff3').push([target,trigger.card]); + game.log(trigger.card, "对", target, "的伤害+1"); + player.addTempSkill("olfushi_buff3"); + player.initStorage("olfushi_buff3", []); + player.getStorage("olfushi_buff3").push([target, trigger.card]); } }, }, - buff2:{ - charlotte:true, - onremove:true, - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - return event.card&&player.getStorage('olfushi_buff2').some(info=>info[0]==event.player&&info[1]==event.card); + buff2: { + charlotte: true, + onremove: true, + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return ( + event.card && + player + .getStorage("olfushi_buff2") + .some((info) => info[0] == event.player && info[1] == event.card) + ); }, - forced:true, - popup:false, - content:function(){ + forced: true, + popup: false, + content: function () { trigger.num--; }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(!card||!player.getStorage('olfushi_buff2').includes(card)) return; - var num=get.tag(card,'damage'); - if(num){ - if(num>1) return 0.5; + ai: { + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (!card || !player.getStorage("olfushi_buff2").includes(card)) return; + var num = get.tag(card, "damage"); + if (num) { + if (num > 1) return 0.5; return 0; } }, }, }, }, - buff3:{ - charlotte:true, - onremove:true, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return event.card&&player.getStorage('olfushi_buff3').some(info=>info[0]==event.player&&info[1]==event.card); + buff3: { + charlotte: true, + onremove: true, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return ( + event.card && + player + .getStorage("olfushi_buff3") + .some((info) => info[0] == event.player && info[1] == event.card) + ); }, - forced:true, - popup:false, - content:function(){ + forced: true, + popup: false, + content: function () { trigger.num++; }, }, - wusheng_backup:{}, + wusheng_backup: {}, }, }, - oldongdao:{ - mode:['doudizhu'], - zhuanhuanji:true, - mark:true, - marktext:'☯', - intro:{ - content:function(storage){ - if(storage) return '农民的回合结束时,其可以进行一个额外回合'; - return '农民的回合结束时,你可以令地主进行一个额外回合'; + oldongdao: { + mode: ["doudizhu"], + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) return "农民的回合结束时,其可以进行一个额外回合"; + return "农民的回合结束时,你可以令地主进行一个额外回合"; }, }, - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return event.player.identity=='fan'; + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return event.player.identity == "fan"; }, - direct:true, - content:function(){ - 'step 0' - var target=(player.storage.oldongdao?trigger.player:game.zhu); - event.target=target; - var target2=(player.storage.oldongdao?trigger.player:player); - event.target2=target2; - target2.chooseBool(get.prompt('oldongdao'),'令'+get.translation(target)+'进行一个额外回合').set('ai',()=>{ - var event=_status.event.getParent(); - return get.attitude(event.target2,event.target)>0; - }) - 'step 1' - if(result.bool){ - player.logSkill('oldongdao'); + direct: true, + content: function () { + "step 0"; + var target = player.storage.oldongdao ? trigger.player : game.zhu; + event.target = target; + var target2 = player.storage.oldongdao ? trigger.player : player; + event.target2 = target2; + target2 + .chooseBool( + get.prompt("oldongdao"), + "令" + get.translation(target) + "进行一个额外回合" + ) + .set("ai", () => { + var event = _status.event.getParent(); + return get.attitude(event.target2, event.target) > 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("oldongdao"); event.target2.line(target); - player.changeZhuanhuanji('oldongdao'); + player.changeZhuanhuanji("oldongdao"); target.insertPhase(); } }, }, //OL陆郁生 - olcangxin:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter(event,player){ - return game.getGlobalHistory('everything',evt=>{ - return evt.name=='damage'&&evt.player==player; - },event).indexOf(event)==0; + olcangxin: { + audio: 2, + trigger: { player: "damageBegin4" }, + filter(event, player) { + return ( + game + .getGlobalHistory( + "everything", + (evt) => { + return evt.name == "damage" && evt.player == player; + }, + event + ) + .indexOf(event) == 0 + ); }, - checkx:function(event,player){ - var target=event.source; - return get.damageEffect(player,target,target)<=0; + checkx: function (event, player) { + var target = event.source; + return get.damageEffect(player, target, target) <= 0; }, - forced:true, - content:function(){ - 'step 0' - var cards=get.bottomCards(3,true); - player.chooseButton(['###藏心:请选择要弃置的牌###若以此法弃置了红桃牌,则减少弃置红桃牌数的伤害',cards],[1,cards.length],true).set('ai',function(button){ - if(!_status.event.bool&&get.suit(button.link,false)=='heart') return 0; - if(get.suit(button.link,false)!='heart') return 1; - const num=get.event().getTrigger().num; - if(num>ui.selected.buttons.filter(but=>get.suit(but.link,false)=='heart').length) return 1; - return 0; - }).set('bool',lib.skill.olcangxin.checkx(trigger,player)); - 'step 1' - if(result.bool){ - player.$throw(result.links,1000); + forced: true, + content: function () { + "step 0"; + var cards = get.bottomCards(3, true); + player + .chooseButton( + [ + "###藏心:请选择要弃置的牌###若以此法弃置了红桃牌,则减少弃置红桃牌数的伤害", + cards, + ], + [1, cards.length], + true + ) + .set("ai", function (button) { + if (!_status.event.bool && get.suit(button.link, false) == "heart") return 0; + if (get.suit(button.link, false) != "heart") return 1; + const num = get.event().getTrigger().num; + if ( + num > + ui.selected.buttons.filter((but) => get.suit(but.link, false) == "heart") + .length + ) + return 1; + return 0; + }) + .set("bool", lib.skill.olcangxin.checkx(trigger, player)); + ("step 1"); + if (result.bool) { + player.$throw(result.links, 1000); game.cardsDiscard(result.links); - const num=result.links.filter(card=>get.suit(card,false)=='heart').length; - if(num) trigger.num-=Math.min(trigger.num,num); - } - else event.finish(); - 'step 2' + const num = result.links.filter((card) => get.suit(card, false) == "heart").length; + if (num) trigger.num -= Math.min(trigger.num, num); + } else event.finish(); + ("step 2"); game.delayx(); }, - group:'olcangxin_yingzi', - subSkill:{ - yingzi:{ - audio:'olcangxin', - trigger:{player:'phaseDrawBegin'}, - forced:true, - content:function(){ - var cards=get.bottomCards(3,true); - player.showCards(cards,get.translation(player)+'发动了【藏心】'); - var num=cards.filter(card=>get.suit(card,false)=='heart').length; - if(num) player.draw(num); + group: "olcangxin_yingzi", + subSkill: { + yingzi: { + audio: "olcangxin", + trigger: { player: "phaseDrawBegin" }, + forced: true, + content: function () { + var cards = get.bottomCards(3, true); + player.showCards(cards, get.translation(player) + "发动了【藏心】"); + var num = cards.filter((card) => get.suit(card, false) == "heart").length; + if (num) player.draw(num); }, }, }, }, - olrunwei:{ - audio:2, - trigger:{global:'phaseDiscardBegin'}, - filter:function(event,player){ - if(event.player==player) return false; + olrunwei: { + audio: 2, + trigger: { global: "phaseDiscardBegin" }, + filter: function (event, player) { + if (event.player == player) return false; return event.player.isDamaged(); }, - direct:true, - content:function(){ - 'step 0' - var str=get.translation(trigger.player); - player.chooseControl('弃牌,+1','摸牌,-1','cancel2').set('choiceList',[ - '令'+str+'弃置一张牌,且其本回合手牌上限+1', - '令'+str+'摸一张牌,且其本回合手牌上限-1', - ]).set('ai',function(){ - var player=_status.event.player; - var trigger=_status.event.getTrigger(); - var target=trigger.player; - var num1=target.countCards('h'),num2=target.getHandcardLimit(); - switch(get.sgn(get.attitude(player,target))){ - case 0: - return 2; - case 1: - if(num1-1>=num2) return 0; - if(num1+1<=num2) return 1; - return 2; - case -1: - if(num1-2<=num2) return 0; - if(num1+3>=num2) return 1; - return 2; - } - }).set('prompt',get.prompt('olrunwei',trigger.player)); - 'step 1' - if(result.index!=2){ - player.logSkill('olrunwei',trigger.player); - if(result.index==0){ - trigger.player.chooseToDiscard('he',true).set('ai',card=>{ - if(get.position(card)=='e') return -get.value(card); - return 1/(get.value(card)||0.5); + direct: true, + content: function () { + "step 0"; + var str = get.translation(trigger.player); + player + .chooseControl("弃牌,+1", "摸牌,-1", "cancel2") + .set("choiceList", [ + "令" + str + "弃置一张牌,且其本回合手牌上限+1", + "令" + str + "摸一张牌,且其本回合手牌上限-1", + ]) + .set("ai", function () { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + var target = trigger.player; + var num1 = target.countCards("h"), + num2 = target.getHandcardLimit(); + switch (get.sgn(get.attitude(player, target))) { + case 0: + return 2; + case 1: + if (num1 - 1 >= num2) return 0; + if (num1 + 1 <= num2) return 1; + return 2; + case -1: + if (num1 - 2 <= num2) return 0; + if (num1 + 3 >= num2) return 1; + return 2; + } + }) + .set("prompt", get.prompt("olrunwei", trigger.player)); + ("step 1"); + if (result.index != 2) { + player.logSkill("olrunwei", trigger.player); + if (result.index == 0) { + trigger.player.chooseToDiscard("he", true).set("ai", (card) => { + if (get.position(card) == "e") return -get.value(card); + return 1 / (get.value(card) || 0.5); }); - trigger.player.addTempSkill('olrunwei_+'); - trigger.player.addMark('olrunwei_+',1,false); + trigger.player.addTempSkill("olrunwei_+"); + trigger.player.addMark("olrunwei_+", 1, false); } - if(result.index==1){ + if (result.index == 1) { trigger.player.draw(); - trigger.player.addTempSkill('olrunwei_-'); - trigger.player.addMark('olrunwei_-',1,false); + trigger.player.addTempSkill("olrunwei_-"); + trigger.player.addMark("olrunwei_-", 1, false); } } }, - subSkill:{ - '+':{ - charlotte:true, - onremove:true, - marktext:'+', - intro:{content:'手牌上限+#'}, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('olrunwei_+'); + subSkill: { + "+": { + charlotte: true, + onremove: true, + marktext: "+", + intro: { content: "手牌上限+#" }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("olrunwei_+"); }, }, }, - '-':{ - charlotte:true, - onremove:true, - marktext:'-', - intro:{content:'手牌上限-#'}, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('olrunwei_-'); + "-": { + charlotte: true, + onremove: true, + marktext: "-", + intro: { content: "手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("olrunwei_-"); }, }, }, }, }, //曹羲 - olgangshu:{ - audio:2, - trigger:{ - player:'useCardAfter', + olgangshu: { + audio: 2, + trigger: { + player: "useCardAfter", }, - filter:function(event,player){ - return get.type2(event.card,false)!='basic'; + filter: function (event, player) { + return get.type2(event.card, false) != "basic"; }, - getInfo:(player)=>{ - if(!player.storage.olgangshu_buff) player.storage.olgangshu_buff=[0,0,0]; + getInfo: (player) => { + if (!player.storage.olgangshu_buff) player.storage.olgangshu_buff = [0, 0, 0]; return player.storage.olgangshu_buff; }, - direct:true, - group:'olgangshu_reset', - content:function(){ - 'step 0' - var info=lib.skill.olgangshu.getInfo(player); - player.chooseControl('攻击范围('+info[0]+')','摸牌数('+info[1]+')','使用杀的上限('+info[2]+')','cancel2').set('prompt',get.prompt('olgangshu')).set('prompt2','
    令以下一个数值+1(每项至多+5):
    1.攻击范围;
    2.下个摸牌阶段的摸牌数;
    3.使用【杀】的次数上限。
    ').set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - var info=lib.skill.olgangshu.getInfo(player); - if(info[1]==0) return 1; - if(info[2]<5&&player.hasCard(card=>{ - return get.name(card)=='sha'&&player.hasValueTarget(card); - },'hs')&&!player.getCardUsable('sha')) return 2; - if(info[0]<5&&!game.hasPlayer(current=>{ - return player.inRange(current)&&get.effect(current,{name:'sha'},player,player)>0; - })) return 0; - var rand=Math.random(); - var list=[0,1,2].filter(i=>info[i]<5); - if(!list.length) return 'cancel2'; - if(rand<0.2&&list.includes(0)) return 0; - if(rand<0.7&&list.includes(1)) return 1; - if(rand<1.0&&list.includes(2)) return 2; - return list.randomGet(); - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('olgangshu'); - player.addSkill('olgangshu_buff'); - var info=lib.skill.olgangshu.getInfo(player); - info[result.index]=Math.min(5,info[result.index]+1); - game.log(player,'的',result.control.slice(0,result.control.indexOf('(')),'#y+1'); - player.markSkill('olgangshu_buff'); + direct: true, + group: "olgangshu_reset", + content: function () { + "step 0"; + var info = lib.skill.olgangshu.getInfo(player); + player + .chooseControl( + "攻击范围(" + info[0] + ")", + "摸牌数(" + info[1] + ")", + "使用杀的上限(" + info[2] + ")", + "cancel2" + ) + .set("prompt", get.prompt("olgangshu")) + .set( + "prompt2", + '
    令以下一个数值+1(每项至多+5):
    1.攻击范围;
    2.下个摸牌阶段的摸牌数;
    3.使用【杀】的次数上限。
    ' + ) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var info = lib.skill.olgangshu.getInfo(player); + if (info[1] == 0) return 1; + if ( + info[2] < 5 && + player.hasCard((card) => { + return get.name(card) == "sha" && player.hasValueTarget(card); + }, "hs") && + !player.getCardUsable("sha") + ) + return 2; + if ( + info[0] < 5 && + !game.hasPlayer((current) => { + return ( + player.inRange(current) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) + return 0; + var rand = Math.random(); + var list = [0, 1, 2].filter((i) => info[i] < 5); + if (!list.length) return "cancel2"; + if (rand < 0.2 && list.includes(0)) return 0; + if (rand < 0.7 && list.includes(1)) return 1; + if (rand < 1.0 && list.includes(2)) return 2; + return list.randomGet(); + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("olgangshu"); + player.addSkill("olgangshu_buff"); + var info = lib.skill.olgangshu.getInfo(player); + info[result.index] = Math.min(5, info[result.index] + 1); + game.log(player, "的", result.control.slice(0, result.control.indexOf("(")), "#y+1"); + player.markSkill("olgangshu_buff"); } }, - ai:{ - threaten:3, + ai: { + threaten: 3, }, - subSkill:{ - buff:{ - trigger:{player:'phaseDrawBegin2'}, - charlotte:true, - onremove:true, - forced:true, - filter:function(event,player){ - var info=lib.skill.olgangshu.getInfo(player); - if(!info[1]) return false; + subSkill: { + buff: { + trigger: { player: "phaseDrawBegin2" }, + charlotte: true, + onremove: true, + forced: true, + filter: function (event, player) { + var info = lib.skill.olgangshu.getInfo(player); + if (!info[1]) return false; return !event.numFixed; }, - content:function(){ - var info=lib.skill.olgangshu.getInfo(player); - trigger.num+=info[1]; - info[1]=0; - player.markSkill('olgangshu_buff'); + content: function () { + var info = lib.skill.olgangshu.getInfo(player); + trigger.num += info[1]; + info[1] = 0; + player.markSkill("olgangshu_buff"); }, - mod:{ - attackRange:function(player,range){ - var info=lib.skill.olgangshu.getInfo(player); - if(info) return range+info[0]; + mod: { + attackRange: function (player, range) { + var info = lib.skill.olgangshu.getInfo(player); + if (info) return range + info[0]; }, - cardUsable:function(card,player,num){ - if(card.name!='sha') return; - var info=lib.skill.olgangshu.getInfo(player); - if(info) return num+info[2]; + cardUsable: function (card, player, num) { + if (card.name != "sha") return; + var info = lib.skill.olgangshu.getInfo(player); + if (info) return num + info[2]; }, }, - mark:true, - intro:{ - markcount:function(storage,player){ - var info=lib.skill.olgangshu.getInfo(player); - var str=''; - info.forEach(num=>str+=parseFloat(num)); + mark: true, + intro: { + markcount: function (storage, player) { + var info = lib.skill.olgangshu.getInfo(player); + var str = ""; + info.forEach((num) => (str += parseFloat(num))); return str; }, - content:function(storage,player){ - var info=lib.skill.olgangshu.getInfo(player); - var str=''; - if(info[0]>0) str+='
  • 攻击范围+'+info[0]; - if(info[1]>0) str+='
  • 下个摸牌阶段摸牌数+'+info[1]; - if(info[2]>0) str+='
  • 使用【杀】的次数上限+'+info[2]; + content: function (storage, player) { + var info = lib.skill.olgangshu.getInfo(player); + var str = ""; + if (info[0] > 0) str += "
  • 攻击范围+" + info[0]; + if (info[1] > 0) str += "
  • 下个摸牌阶段摸牌数+" + info[1]; + if (info[2] > 0) str += "
  • 使用【杀】的次数上限+" + info[2]; return str; }, }, }, - reset:{ - audio:'olgangshu', - trigger:{ - global:['shaMiss','eventNeutralized'], + reset: { + audio: "olgangshu", + trigger: { + global: ["shaMiss", "eventNeutralized"], }, - filter:function(event,player){ - if(event.type!='card') return false; + filter: function (event, player) { + if (event.type != "card") return false; var responder; - if(event.name=='sha'){ - responder=event.target; + if (event.name == "sha") { + responder = event.target; + } else { + responder = event._neutralize_event.player; } - else{ - responder=event._neutralize_event.player; - } - return player==responder; + return player == responder; }, - forced:true, - locked:false, - content:function(){ - player.removeSkill('olgangshu_buff'); - game.log(player,'重置了','#g【刚述】','的数值'); - } - } - } + forced: true, + locked: false, + content: function () { + player.removeSkill("olgangshu_buff"); + game.log(player, "重置了", "#g【刚述】", "的数值"); + }, + }, + }, }, - oljianxuan:{ - audio:2, - trigger:{ - player:'damageEnd', + oljianxuan: { + audio: 2, + trigger: { + player: "damageEnd", }, - direct:true, - content:function(){ - 'step 0' - var info=lib.skill.olgangshu.getInfo(player); - var list=[]; + direct: true, + content: function () { + "step 0"; + var info = lib.skill.olgangshu.getInfo(player); + var list = []; list.add(player.getAttackRange()); - list.add(2+info[1]); - list.add(player.getCardUsable('sha',true)); + list.add(2 + info[1]); + list.add(player.getCardUsable("sha", true)); list.sort(); - var str=list.join('、').replace(/(.*)、/, '$1或'); - event.list=list; - player.chooseTarget(get.prompt('oljianxuan'),'令一名角色摸一张牌,然后若其手牌数为'+str+',其重复此流程').set('ai',target=>{ - var list=_status.event.list; - var player=_status.event.player; - var att=get.attitude(player,target); - if(att<=0) return 0; - var num=target.countCards('h')+1; - var value=1; - while(true){ - if(list.includes(num)){ - value++; - num++; + var str = list.join("、").replace(/(.*)、/, "$1或"); + event.list = list; + player + .chooseTarget( + get.prompt("oljianxuan"), + "令一名角色摸一张牌,然后若其手牌数为" + str + ",其重复此流程" + ) + .set("ai", (target) => { + var list = _status.event.list; + var player = _status.event.player; + var att = get.attitude(player, target); + if (att <= 0) return 0; + var num = target.countCards("h") + 1; + var value = 1; + while (true) { + if (list.includes(num)) { + value++; + num++; + } else break; } - else break; - } - return value+att/10; - }).set('list',list); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('oljianxuan',target); - if(player!=target) player.addExpose(0.15); - } - else event.finish(); - 'step 2' + return value + att / 10; + }) + .set("list", list); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oljianxuan", target); + if (player != target) player.addExpose(0.15); + } else event.finish(); + ("step 2"); target.draw(); - 'step 3' - if(event.list.includes(target.countCards('h'))) event.goto(2); + ("step 3"); + if (event.list.includes(target.countCards("h"))) event.goto(2); }, - ai:{ - combo:'olgangshu', - maixie:true, + ai: { + combo: "olgangshu", + maixie: true, }, }, //OL彭羕 - olxiaofan:{ - audio:2, - enable:'chooseToUse', - hiddenCard:function(player,name){ - if(name!='wuxie'&&lib.inpile.includes(name)) return true; + olxiaofan: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (name != "wuxie" && lib.inpile.includes(name)) return true; }, - getNum:(player)=>player.getHistory('useCard').reduce((list,evt)=>list.add(get.type2(evt.card)),[]).length, - filter:function(event,player){ - if(event.responded||event.type=='wuxie'||event.olxiaofan) return false; - for(var i of lib.inpile){ - if(i!='wuxie'&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; + getNum: (player) => + player.getHistory("useCard").reduce((list, evt) => list.add(get.type2(evt.card)), []) + .length, + filter: function (event, player) { + if (event.responded || event.type == "wuxie" || event.olxiaofan) return false; + for (var i of lib.inpile) { + if ( + i != "wuxie" && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; } return false; }, - delay:false, - content:function(){ - 'step 0' - var evt=event.getParent(2); - evt.set('olxiaofan',true); - var cards=get.bottomCards(lib.skill.olxiaofan.getNum(player)+1,true); - var aozhan=player.hasSkill('aozhan'); - player.chooseButton(['嚣翻:选择要使用的牌',cards]).set('filterButton',function(button){ - return _status.event.cards.includes(button.link); - }).set('cards',cards.filter(function(card){ - if(aozhan&&card.name=='tao'){ - return evt.filterCard({ - name:'sha',isCard:true,cards:[card], - },evt.player,evt)||evt.filterCard({ - name:'shan',isCard:true,cards:[card], - },evt.player,evt); + delay: false, + content: function () { + "step 0"; + var evt = event.getParent(2); + evt.set("olxiaofan", true); + var cards = get.bottomCards(lib.skill.olxiaofan.getNum(player) + 1, true); + var aozhan = player.hasSkill("aozhan"); + player + .chooseButton(["嚣翻:选择要使用的牌", cards]) + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set( + "cards", + cards.filter(function (card) { + if (aozhan && card.name == "tao") { + return ( + evt.filterCard( + { + name: "sha", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) || + evt.filterCard( + { + name: "shan", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) + ); + } + return evt.filterCard(card, evt.player, evt); + }) + ) + .set("ai", function (button) { + if (get.type(button.link) == "equip") return 0; + var evt = _status.event.getParent(3), + player = _status.event.player; + if (evt.type == "phase" && !player.hasValueTarget(button.link, null, true)) + return 0; + if (evt && evt.ai) { + var tmp = _status.event; + _status.event = evt; + var result = (evt.ai || event.ai1)(button.link, _status.event.player, evt); + _status.event = tmp; + return result; + } + return 1; + }); + ("step 1"); + var evt = event.getParent(2); + if (result.bool && result.links && result.links.length) { + var card = result.links[0]; + var name = card.name, + aozhan = player.hasSkill("aozhan") && name == "tao"; + if (aozhan) { + name = evt.filterCard( + { + name: "sha", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) + ? "sha" + : "shan"; } - return evt.filterCard(card,evt.player,evt); - })).set('ai',function(button){ - if(get.type(button.link)=='equip') return 0; - var evt=_status.event.getParent(3),player=_status.event.player; - if(evt.type=='phase'&&!player.hasValueTarget(button.link,null,true)) return 0; - if(evt&&evt.ai){ - var tmp=_status.event; - _status.event=evt; - var result=(evt.ai||event.ai1)(button.link,_status.event.player,evt); - _status.event=tmp; - return result; - } - return 1; - }); - 'step 1' - var evt=event.getParent(2); - if(result.bool&&result.links&&result.links.length){ - var card=result.links[0]; - var name=card.name,aozhan=(player.hasSkill('aozhan')&&name=='tao'); - if(aozhan){ - name=evt.filterCard({ - name:'sha',isCard:true,cards:[card], - },evt.player,evt)?'sha':'shan'; - } - game.broadcastAll(function(result,name){ - lib.skill.olxiaofan_backup.viewAs={name:name,cards:[result],isCard:true}; - },card,name); - evt.set('_backupevent','olxiaofan_backup'); - evt.set('openskilldialog',('请选择'+get.translation(card)+'的目标')) - evt.backup('olxiaofan_backup'); + game.broadcastAll( + function (result, name) { + lib.skill.olxiaofan_backup.viewAs = { + name: name, + cards: [result], + isCard: true, + }; + }, + card, + name + ); + evt.set("_backupevent", "olxiaofan_backup"); + evt.set("openskilldialog", "请选择" + get.translation(card) + "的目标"); + evt.backup("olxiaofan_backup"); } evt.goto(0); }, - ai:{ - effect:{ - target:function(card,player,target,effect){ - if(get.tag(card,'respondShan')) return 0.7; - if(get.tag(card,'respondSha')) return 0.7; - } + ai: { + effect: { + target: function (card, player, target, effect) { + if (get.tag(card, "respondShan")) return 0.7; + if (get.tag(card, "respondSha")) return 0.7; + }, }, - order:12, - respondShan:true, - respondSha:true, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + order: 12, + respondShan: true, + respondSha: true, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; - } - } + }, + }, }, }, - olxiaofan_backup:{ - sourceSkill:'olxiaofan', - precontent:function(){ + olxiaofan_backup: { + sourceSkill: "olxiaofan", + precontent: function () { delete event.result.skill; - var name=event.result.card.name,cards=event.result.card.cards.slice(0); - event.result.cards=cards; - var rcard=cards[0],card; - if(rcard.name==name) card=get.autoViewAs(rcard); - else card=get.autoViewAs({name,isCard:true}); - event.result.card=card; - var id=get.id(); - player.when('chooseToUseAfter').filter((evt)=>evt==event.getParent()).then(()=>{ - var num=lib.skill.olxiaofan.getNum(player),pos=('jeh').slice(0,num); - if(num>0&&player.countCards(pos)>0){ - event.maxNum=Math.min(3,num); - event.num=0; - } - else event.finish(); - }).then(()=>{ - var pos=('jeh')[event.num],hs=player.countCards(pos); - if(hs>0) player.chooseToDiscard(hs,pos,true); - event.num++; - if(event.num evt == event.getParent()) + .then(() => { + var num = lib.skill.olxiaofan.getNum(player), + pos = "jeh".slice(0, num); + if (num > 0 && player.countCards(pos) > 0) { + event.maxNum = Math.min(3, num); + event.num = 0; + } else event.finish(); + }) + .then(() => { + var pos = "jeh"[event.num], + hs = player.countCards(pos); + if (hs > 0) player.chooseToDiscard(hs, pos, true); + event.num++; + if (event.num < event.maxNum) event.redo(); + }) + .translation("嚣翻"); }, - filterCard:function(){return false}, - selectCard:-1, + filterCard: function () { + return false; + }, + selectCard: -1, }, - oltuishi:{ - audio:2, - mod:{ - wuxieJudgeEnabled:()=>false, - wuxieEnabled:()=>false, - cardEnabled:(card)=>{ - if(card.name=='wuxie') return false; + oltuishi: { + audio: 2, + mod: { + wuxieJudgeEnabled: () => false, + wuxieEnabled: () => false, + cardEnabled: (card) => { + if (card.name == "wuxie") return false; }, - targetInRange:(card)=>{ - if(card.storage&&card.storage.oltuishi) return true; + targetInRange: (card) => { + if (card.storage && card.storage.oltuishi) return true; }, - aiValue:(player,card,val)=>{ - if(card.name=='wuxie') return 0; - var num=get.number(card); - if([1,11,12,13].includes(num)) return val*1.1; + aiValue: (player, card, val) => { + if (card.name == "wuxie") return 0; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) return val * 1.1; }, - aiUseful:(player,card,val)=>{ - if(card.name=='wuxie') return 0; - var num=get.number(card); - if([1,11,12,13].includes(num)) return val*1.1; + aiUseful: (player, card, val) => { + if (card.name == "wuxie") return 0; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) return val * 1.1; }, - aiOrder:(player,card,order)=>{ - if(get.name(card)=='sha'&&player.hasSkill('oltuishi_unlimit')) order+=9; - var num=get.number(card); - if([1,11,12,13].includes(num)) order+=3; + aiOrder: (player, card, order) => { + if (get.name(card) == "sha" && player.hasSkill("oltuishi_unlimit")) order += 9; + var num = get.number(card); + if ([1, 11, 12, 13].includes(num)) order += 3; return order; }, }, - trigger:{player:['useCard','useCardAfter']}, - filter:function(event,player,name){ - if(name=='useCardAfter'){ - if(player.isTempBanned('olxiaofan')) return false; - return player.getHistory('useCard',evt=>{ - return !player.getHistory('sourceDamage',evt2=>{ - return evt2.card&&evt2.card==evt.card; - }).length&&get.tag(evt.card,'damage'); - }).indexOf(event)>=2; + trigger: { player: ["useCard", "useCardAfter"] }, + filter: function (event, player, name) { + if (name == "useCardAfter") { + if (player.isTempBanned("olxiaofan")) return false; + return ( + player + .getHistory("useCard", (evt) => { + return ( + !player.getHistory("sourceDamage", (evt2) => { + return evt2.card && evt2.card == evt.card; + }).length && get.tag(evt.card, "damage") + ); + }) + .indexOf(event) >= 2 + ); } - return [1,11,12,13].includes(get.number(event.card)); + return [1, 11, 12, 13].includes(get.number(event.card)); }, - forced:true, - content:function(){ - 'step 0' - if(event.triggername=='useCardAfter'){ - player.tempBanSkill('olxiaofan'); + forced: true, + content: function () { + "step 0"; + if (event.triggername == "useCardAfter") { + player.tempBanSkill("olxiaofan"); event.finish(); return; } - trigger.targets.length=0; - trigger.all_excluded=true; - game.log(trigger.card,'被无效了'); - 'step 1' + trigger.targets.length = 0; + trigger.all_excluded = true; + game.log(trigger.card, "被无效了"); + ("step 1"); player.draw(); - player.addSkill('oltuishi_unlimit'); + player.addSkill("oltuishi_unlimit"); }, - subSkill:{ - unlimit:{ - charlotte:true, - mod:{ - cardUsableTarget:(card,player,target)=>{ - if(target.countCards('h') { + if (target.countCards("h") < player.countCards("h")) return true; }, - targetInRange:(card,player,target)=>{ - if(target.countCards('h') { + if (target.countCards("h") < player.countCards("h")) return true; }, }, - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(!event.targets||!event.targets.length) return false; - let num=0; - if(event.cards&&event.cards.length){ - const history=player.getHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - return event.cards.some(card=>evt.hs.includes(card)); + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (!event.targets || !event.targets.length) return false; + let num = 0; + if (event.cards && event.cards.length) { + const history = player.getHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + return event.cards.some((card) => evt.hs.includes(card)); }); - if(history.length) num+=event.cards.filter(card=>history[0].hs.includes(card)).length; + if (history.length) + num += event.cards.filter((card) => history[0].hs.includes(card)).length; } - return event.targets.some(target=>player.countCards('h')+num>target.countCards('h')+(target==player?num:0)); + return event.targets.some( + (target) => + player.countCards("h") + num > + target.countCards("h") + (target == player ? num : 0) + ); }, - forced:true, - popup:false, - silent:true, - firstDo:true, - content:function(){ - player.removeSkill('oltuishi_unlimit') - var card=trigger.card; - if(!card.storage) card.storage={}; - card.storage.oltuishi=true; - if(trigger.addCount!==false){ - trigger.addCount=false; - player.getStat('card')[card.name]--; + forced: true, + popup: false, + silent: true, + firstDo: true, + content: function () { + player.removeSkill("oltuishi_unlimit"); + var card = trigger.card; + if (!card.storage) card.storage = {}; + card.storage.oltuishi = true; + if (trigger.addCount !== false) { + trigger.addCount = false; + player.getStat("card")[card.name]--; } }, - mark:true, - intro:{content:'对手牌数小于你的角色使用的下一张牌无距离次数限制'}, + mark: true, + intro: { content: "对手牌数小于你的角色使用的下一张牌无距离次数限制" }, }, }, }, //OL牵招 - olweifu:{ - audio:2, - enable:'phaseUse', - filterCard:lib.filter.cardDiscardable, - position:'he', - filter:function(event,player){ - return player.hasCard(card=>lib.filter.cardDiscardable(card,player),'he'); + olweifu: { + audio: 2, + enable: "phaseUse", + filterCard: lib.filter.cardDiscardable, + position: "he", + filter: function (event, player) { + return player.hasCard((card) => lib.filter.cardDiscardable(card, player), "he"); }, - check:function(card){ - var player=_status.event.player; - return (5-get.value(card))/Math.pow(Math.max(0.1,player.getUseValue(card)),0.33); + check: function (card) { + var player = _status.event.player; + return (5 - get.value(card)) / Math.pow(Math.max(0.1, player.getUseValue(card)), 0.33); }, - content:function(){ - 'step 0' - player.judge(card=>{ - var evt=_status.event.getParent(); - var cardx=evt.cards[0]; - if(get.type2(card)==get.type2(cardx)) return 0.5; - return 0.1; - }).set('callback',function(){ - var card=event.judgeResult.card; - player.addTempSkill('olweifu_clear'); - player.addTempSkill('olweifu_add'); - if(!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add={}; - var type=get.type2(card,player); - if(typeof player.storage.olweifu_add[type]!='number') player.storage.olweifu_add[type]=0; - player.storage.olweifu_add[type]++; - player.markSkill('olweifu_add'); - if(type==get.type2(event.getParent(2).cards[0],player)) player.draw(); - }).set('judge2',result=>result.bool); + content: function () { + "step 0"; + player + .judge((card) => { + var evt = _status.event.getParent(); + var cardx = evt.cards[0]; + if (get.type2(card) == get.type2(cardx)) return 0.5; + return 0.1; + }) + .set("callback", function () { + var card = event.judgeResult.card; + player.addTempSkill("olweifu_clear"); + player.addTempSkill("olweifu_add"); + if (!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add = {}; + var type = get.type2(card, player); + if (typeof player.storage.olweifu_add[type] != "number") + player.storage.olweifu_add[type] = 0; + player.storage.olweifu_add[type]++; + player.markSkill("olweifu_add"); + if (type == get.type2(event.getParent(2).cards[0], player)) player.draw(); + }) + .set("judge2", (result) => result.bool); }, - ai:{ - order:7, - result:{ - player:function(player){ - return player.hasCard(card=>{ - var type=get.type2(card); - if(type=='equip') return false; - return player.hasUseTarget(card)&&player.getUseValue(card)>5&&game.countPlayer(current=>{ - return lib.filter.targetEnabled2(card,player,current)&&get.effect(current,card,player,player)>0; - })+1>(get.is.object(player.storage.olweifu_add)?(player.storage.olweifu_add[type]||0):0); - },'hs')?1:0; + ai: { + order: 7, + result: { + player: function (player) { + return player.hasCard((card) => { + var type = get.type2(card); + if (type == "equip") return false; + return ( + player.hasUseTarget(card) && + player.getUseValue(card) > 5 && + game.countPlayer((current) => { + return ( + lib.filter.targetEnabled2(card, player, current) && + get.effect(current, card, player, player) > 0 + ); + }) + + 1 > + (get.is.object(player.storage.olweifu_add) + ? player.storage.olweifu_add[type] || 0 + : 0) + ); + }, "hs") + ? 1 + : 0; }, }, }, - subSkill:{ - clear:{ - trigger:{player:'useCard1'}, - filter:function(event,player){ - var type=get.type2(event.card); - if(get.is.object(player.storage.olweifu_add)&&typeof player.storage.olweifu_add[type]=='number') return true; + subSkill: { + clear: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + var type = get.type2(event.card); + if ( + get.is.object(player.storage.olweifu_add) && + typeof player.storage.olweifu_add[type] == "number" + ) + return true; return false; }, - silent:true, - firstDo:true, - charlotte:true, - content:function(){ - var type=get.type2(trigger.card); - var num=player.storage.olweifu_add[type]; + silent: true, + firstDo: true, + charlotte: true, + content: function () { + var type = get.type2(trigger.card); + var num = player.storage.olweifu_add[type]; delete player.storage.olweifu_add[type]; - if(get.is.empty(player.storage.olweifu_add)){ + if (get.is.empty(player.storage.olweifu_add)) { delete player.storage.olweifu_add; - player.unmarkSkill('olweifu_add'); + player.unmarkSkill("olweifu_add"); } - trigger._olweifu_clear=num; - } + trigger._olweifu_clear = num; + }, }, - add:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(!event._olweifu_clear) return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(current=>{ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current); - })) return true; + add: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (!event._olweifu_clear) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer((current) => { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) + ); + }) + ) + return true; } return false; }, - onremove:true, - charlotte:true, - direct:true, - content:function(){ - 'step 0' - var num=trigger._olweifu_clear; - player.chooseTarget(get.prompt('olweifu'),'为'+get.translation(trigger.card)+'额外指定'+get.cnNumber(num)+'个目标。',[1,num],(card,player,target)=>{ - return !_status.event.sourcex.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - var targets=result.targets; - player.logSkill('olweifu_add',targets); + onremove: true, + charlotte: true, + direct: true, + content: function () { + "step 0"; + var num = trigger._olweifu_clear; + player + .chooseTarget( + get.prompt("olweifu"), + "为" + + get.translation(trigger.card) + + "额外指定" + + get.cnNumber(num) + + "个目标。", + [1, num], + (card, player, target) => { + return ( + !_status.event.sourcex.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + var targets = result.targets; + player.logSkill("olweifu_add", targets); trigger.targets.addArray(targets); - game.log(targets,'也成为了',trigger.card,'的目标'); - if(!event.isMine()&&!event.isOnline()) game.delayex(); + game.log(targets, "也成为了", trigger.card, "的目标"); + if (!event.isMine() && !event.isOnline()) game.delayex(); } }, - intro:{ - markcount:()=>0, - content:(storage,player)=>{ - if(!get.is.object(storage)) return; - var str='使用下一张以下类型的牌无距离限制,且可以额外指定对应数量个目标:'; - for(var type in storage){ - str+='
  • '+get.translation(type)+'牌:+'+storage[type]; + intro: { + markcount: () => 0, + content: (storage, player) => { + if (!get.is.object(storage)) return; + var str = "使用下一张以下类型的牌无距离限制,且可以额外指定对应数量个目标:"; + for (var type in storage) { + str += "
  • " + get.translation(type) + "牌:+" + storage[type]; } return str; - } - }, - mod:{ - targetInRange:(card,player)=>{ - var type=get.type2(card); - if(get.is.object(player.storage.olweifu_add)&&typeof player.storage.olweifu_add[type]=='number') return true; }, - } - } + }, + mod: { + targetInRange: (card, player) => { + var type = get.type2(card); + if ( + get.is.object(player.storage.olweifu_add) && + typeof player.storage.olweifu_add[type] == "number" + ) + return true; + }, + }, + }, }, }, - olkuansai:{ - audio:2, - trigger:{ - global:'useCardToPlayered', + olkuansai: { + audio: 2, + trigger: { + global: "useCardToPlayered", }, - filter:function(event,player){ - return event.isFirstTarget&&event.targets.length>=player.getHp(); + filter: function (event, player) { + return event.isFirstTarget && event.targets.length >= player.getHp(); }, - direct:true, - usable:1, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('olkuansai'),'令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。',(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('targets',trigger.targets).set('ai',target=>{ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0) return 1; - return (1-att)/Math.sqrt(1+target.countCards('he')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('olkuansai',target); - var position='e'; - if(player!=target) position+='h'; - var forced=player.isHealthy(); - var str='请交给其一张牌'+(forced?'':'或点击“取消”令其回复1点体力')+'。'; - if(!target.countCards(position)) event._result={bool:false}; - else target.chooseCard(get.translation(player)+'对你发动了【款塞】',str,position,forced).set('ai',card=>{ - if(_status.event.recover) return 0; - var target=_status.event.player,player=_status.event.getParent().player; - if(get.attitude(target,player)>0){ - return get.value(card,target)-get.value(card,player); + direct: true, + usable: 1, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("olkuansai"), + "令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。", + (card, player, target) => { + return _status.event.targets.includes(target); } - if(get.tag(card,'recover')) return -1; - return 6.5-get.value(card); - }).set('recover',function(){ - if(forced) return false; - var recoverEff=get.recoverEffect(player,target,target); - var att=get.attitude(target,player); - if(att<0){ - if(recoverEff>=0) return true; - if(target.hasCard(card=>{ - return get.value(card)<6.5&&!get.tag(card,'recover')||get.value(card)<=0.05; - },position)) return false; - } - else{ - if(recoverEff>0) return true; - if(target.hasCard(card=>{ - return get.value(card,target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return 1; + return (1 - att) / Math.sqrt(1 + target.countCards("he")); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olkuansai", target); + var position = "e"; + if (player != target) position += "h"; + var forced = player.isHealthy(); + var str = "请交给其一张牌" + (forced ? "" : "或点击“取消”令其回复1点体力") + "。"; + if (!target.countCards(position)) event._result = { bool: false }; + else + target + .chooseCard( + get.translation(player) + "对你发动了【款塞】", + str, + position, + forced + ) + .set("ai", (card) => { + if (_status.event.recover) return 0; + var target = _status.event.player, + player = _status.event.getParent().player; + if (get.attitude(target, player) > 0) { + return get.value(card, target) - get.value(card, player); + } + if (get.tag(card, "recover")) return -1; + return 6.5 - get.value(card); + }) + .set( + "recover", + (function () { + if (forced) return false; + var recoverEff = get.recoverEffect(player, target, target); + var att = get.attitude(target, player); + if (att < 0) { + if (recoverEff >= 0) return true; + if ( + target.hasCard((card) => { + return ( + (get.value(card) < 6.5 && + !get.tag(card, "recover")) || + get.value(card) <= 0.05 + ); + }, position) + ) + return false; + } else { + if (recoverEff > 0) return true; + if ( + target.hasCard((card) => { + return get.value(card, target) < get.value(card, player); + }, position) + ) + return false; + } + return true; + })() + ); + } else { player.storage.counttrigger.olkuansai--; event.finish(); } - 'step 2' - if(result.bool){ - target.give(result.cards,player); - } - else player.recover(target); + ("step 2"); + if (result.bool) { + target.give(result.cards, player); + } else player.recover(target); }, }, //牛金 - olcuorui:{ - audio:'cuorui', - trigger:{ - global:'phaseBefore', - player:'enterGame', - target:'useCardToTargeted', + olcuorui: { + audio: "cuorui", + trigger: { + global: "phaseBefore", + player: "enterGame", + target: "useCardToTargeted", }, - filter:function(event,player){ - if(event.name=='useCardToTargeted') return get.type(event.card)=='delay'&&!player.hasSkill('olcuorui_skip'); - return (event.name!='phase'||game.phaseNumber==0)&&player.countCards('h')player.getUseValue({name:'juedou'})?'sha':'juedou'; - }); - 'step 3' - if(result.control) target.chooseUseTarget({name:result.control},true); + var list = []; + if (target.hasUseTarget({ name: "sha" })) list.push("sha"); + if (target.hasUseTarget({ name: "sha" })) list.push("juedou"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else + target + .chooseControl(list) + .set("prompt", "谋诛:视为使用一张【杀】或【决斗】") + .set("ai", function () { + var player = _status.event.player; + return player.getUseValue({ name: "sha" }) > + player.getUseValue({ name: "juedou" }) + ? "sha" + : "juedou"; + }); + ("step 3"); + if (result.control) target.chooseUseTarget({ name: result.control }, true); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(get.attitude(target,player)>0&&game.hasPlayer(function(current){ - if(current==target) return false; - for(var card of [{name:'sha'},{name:'juedou'}]){ - if(target.canUse(card,current)&&get.effect(current,card,target,player)>0&&get.effect(current,card,target,target)>0) return true; - } - return false; - })&&target.countCards('h')player.countCards('h')) return -2; - var canSave=function(player,target){ - return target.hp+player.countCards('hs',card=>player.canSaveCard(card,target))>1+((get.mode()=='identity'&&target.identity=='zhu')||(get.mode()=='guozhan'&&get.is.jun(target))); + ai: { + order: 7, + result: { + target: function (player, target) { + if ( + get.attitude(target, player) > 0 && + game.hasPlayer(function (current) { + if (current == target) return false; + for (var card of [{ name: "sha" }, { name: "juedou" }]) { + if ( + target.canUse(card, current) && + get.effect(current, card, target, player) > 0 && + get.effect(current, card, target, target) > 0 + ) + return true; + } + return false; + }) && + target.countCards("h") < player.countCards("h") + 2 + ) + return 3; + if ( + !target.hasValueTarget({ name: "sha" }) && + !target.hasValueTarget({ name: "juedou" }) + ) + return -2; + if (target.countCards("h") + 1 > player.countCards("h")) return -2; + var canSave = function (player, target) { + return ( + target.hp + + player.countCards("hs", (card) => player.canSaveCard(card, target)) > + 1 + + ((get.mode() == "identity" && target.identity == "zhu") || + (get.mode() == "guozhan" && get.is.jun(target))) + ); }; - if(target.hasValueTarget({name:'sha'})){ - var aimx=game.filterPlayer(current=>{ - return target.canUse({name:'sha'},current)&&get.effect(current,{name:'sha'},target,target)>0; - }).sort((a,b)=>get.effect(b,{name:'sha'},target,target)-get.effect(a,{name:'sha'},target,target))[0]; - if(aimx&&get.effect(aimx,{name:'sha'},target,player)<0&&get.effect(aimx,{name:'sha'},target,aimx)<0&&!canSave(player,aimx)) return 0; + if (target.hasValueTarget({ name: "sha" })) { + var aimx = game + .filterPlayer((current) => { + return ( + target.canUse({ name: "sha" }, current) && + get.effect(current, { name: "sha" }, target, target) > 0 + ); + }) + .sort( + (a, b) => + get.effect(b, { name: "sha" }, target, target) - + get.effect(a, { name: "sha" }, target, target) + )[0]; + if ( + aimx && + get.effect(aimx, { name: "sha" }, target, player) < 0 && + get.effect(aimx, { name: "sha" }, target, aimx) < 0 && + !canSave(player, aimx) + ) + return 0; } - if(target.hasValueTarget({name:'juedou'})){ - var aimy=game.filterPlayer(current=>{ - return target.canUse({name:'juedou'},current)&&get.effect(current,{name:'juedou'},target,target)>0; - }).sort((a,b)=>get.effect(b,{name:'juedou'},target,target)-get.effect(a,{name:'juedou'},target,target))[0]; - if(aimy&&get.effect(aimy,{name:'juedou'},target,player)<0&&get.effect(aimy,{name:'sha'},target,aimy)<0&&!canSave(player,aimy)) return 0; + if (target.hasValueTarget({ name: "juedou" })) { + var aimy = game + .filterPlayer((current) => { + return ( + target.canUse({ name: "juedou" }, current) && + get.effect(current, { name: "juedou" }, target, target) > 0 + ); + }) + .sort( + (a, b) => + get.effect(b, { name: "juedou" }, target, target) - + get.effect(a, { name: "juedou" }, target, target) + )[0]; + if ( + aimy && + get.effect(aimy, { name: "juedou" }, target, player) < 0 && + get.effect(aimy, { name: "sha" }, target, aimy) < 0 && + !canSave(player, aimy) + ) + return 0; } return -1; }, }, }, }, - olyanhuo:{ - audio:'yanhuo', - trigger:{player:'die'}, - forceDie:true, - filter:function(event,player){ - if(!event.source||!event.source.isIn()||!event.source.countCards('he')) return false; - return player.countCards('he')>0; + olyanhuo: { + audio: "yanhuo", + trigger: { player: "die" }, + forceDie: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn() || !event.source.countCards("he")) return false; + return player.countCards("he") > 0; }, - check:function(event,player){ - return get.effect(event.source,{name:'guohe_copy2'},player,player)>0; + check: function (event, player) { + return get.effect(event.source, { name: "guohe_copy2" }, player, player) > 0; }, - logTarget:'source', - skillAnimation:true, - animationColor:'thunder', - content:function(){ - player.discardPlayerCard(trigger.source,'he',[1,player.countCards('he')],true).set('forceDie',true); + logTarget: "source", + skillAnimation: true, + animationColor: "thunder", + content: function () { + player + .discardPlayerCard(trigger.source, "he", [1, player.countCards("he")], true) + .set("forceDie", true); }, }, //韩遂 - olniluan:{ - audio:'niluan', - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player.getHp()>player.getHp()&&event.player.getHistory('useCard',function(card){ - return card.card.name=='sha'; - }).length&&player.countCards('hes',card=>get.color(card,player)=='black'&&player.canUse(get.autoViewAs({name:'sha'},[card]),event.player,false)); + olniluan: { + audio: "niluan", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player.getHp() > player.getHp() && + event.player.getHistory("useCard", function (card) { + return card.card.name == "sha"; + }).length && + player.countCards( + "hes", + (card) => + get.color(card, player) == "black" && + player.canUse(get.autoViewAs({ name: "sha" }, [card]), event.player, false) + ) + ); }, - direct:true, - content:function(){ - var next=player.chooseToUse(); - next.set('openskilldialog','逆乱:是否将一张黑色牌当作【杀】对'+get.translation(trigger.player)+'使用?'); - next.set('norestore',true); - next.set('_backupevent','niluanx'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + direct: true, + content: function () { + var next = player.chooseToUse(); + next.set( + "openskilldialog", + "逆乱:是否将一张黑色牌当作【杀】对" + get.translation(trigger.player) + "使用?" + ); + next.set("norestore", true); + next.set("_backupevent", "niluanx"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('niluanx'); - next.set('targetRequired',true); - next.set('complexSelect',true); - next.set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); + next.backup("niluanx"); + next.set("targetRequired", true); + next.set("complexSelect", true); + next.set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); }); - next.set('sourcex',trigger.player); - next.set('addCount',false); - next.logSkill='olniluan'; + next.set("sourcex", trigger.player); + next.set("addCount", false); + next.logSkill = "olniluan"; }, }, - olxiaoxi:{ - audio:'xiaoxi', - audioname:['machao','hansui','pangde'], - trigger:{global:'roundStart'}, - filter:function(event,player){ - return player.hasUseTarget({name:'sha'},false); + olxiaoxi: { + audio: "xiaoxi", + audioname: ["machao", "hansui", "pangde"], + trigger: { global: "roundStart" }, + filter: function (event, player) { + return player.hasUseTarget({ name: "sha" }, false); }, - direct:true, - content:function(){ - player.chooseUseTarget({name:'sha'},get.prompt('olxiaoxi'),'视为使用一张无距离限制的【杀】',false,'nodistance').logSkill='olxiaoxi'; + direct: true, + content: function () { + player.chooseUseTarget( + { name: "sha" }, + get.prompt("olxiaoxi"), + "视为使用一张无距离限制的【杀】", + false, + "nodistance" + ).logSkill = "olxiaoxi"; }, }, //段颎 - olsaogu:{ - audio:2, - zhuanhuanji:true, - mark:true, - marktext:'☯', - intro:{ - content:function(storage){ - if(storage) return '转换技。①出牌阶段,你可以摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色摸一张牌。'; - return '转换技。①出牌阶段,你可以弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】。②结束阶段,你可以弃置一张牌,令一名其他角色弃置两张牌,然后其使用弃置的【杀】。'; + olsaogu: { + audio: 2, + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) + return "转换技。①出牌阶段,你可以摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色摸一张牌。"; + return "转换技。①出牌阶段,你可以弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】。②结束阶段,你可以弃置一张牌,令一名其他角色弃置两张牌,然后其使用弃置的【杀】。"; }, }, - onChooseToUse:function(event){ - if(!game.online&&!event.olsaogu){ - var list=[],player=event.player; - var evtx=event.getParent('phaseUse'); - player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseUse')==evtx) list.addArray(evt.cards2); + onChooseToUse: function (event) { + if (!game.online && !event.olsaogu) { + var list = [], + player = event.player; + var evtx = event.getParent("phaseUse"); + player.getHistory("lose", (evt) => { + if (evt.type == "discard" && evt.getParent("phaseUse") == evtx) + list.addArray(evt.cards2); }); - event.set('olsaogu',list); + event.set("olsaogu", list); } }, - enable:'phaseUse', - filter:function(event,player){ - var storage=player.storage.olsaogu; - if(storage) return true; - return player.getDiscardableCards(player,'he').filter(card=>{ - if(event.olsaogu&&event.olsaogu.some(cardx=>get.suit(cardx,false)==get.suit(card,player))) return false; - return true; - }).length>1; + enable: "phaseUse", + filter: function (event, player) { + var storage = player.storage.olsaogu; + if (storage) return true; + return ( + player.getDiscardableCards(player, "he").filter((card) => { + if ( + event.olsaogu && + event.olsaogu.some( + (cardx) => get.suit(cardx, false) == get.suit(card, player) + ) + ) + return false; + return true; + }).length > 1 + ); }, - filterCard:function(card,player){ - if(player.storage.olsaogu) return false; - if(_status.event.olsaogu&&_status.event.olsaogu.some(cardx=>get.suit(cardx,false)==get.suit(card,player))) return false; + filterCard: function (card, player) { + if (player.storage.olsaogu) return false; + if ( + _status.event.olsaogu && + _status.event.olsaogu.some( + (cardx) => get.suit(cardx, false) == get.suit(card, player) + ) + ) + return false; return true; }, - selectCard:function(){ - var player=_status.event.player; - return player.storage.olsaogu?-1:2; + selectCard: function () { + var player = _status.event.player; + return player.storage.olsaogu ? -1 : 2; }, - position:'he', - check:function(card){ - var player=_status.event.player; - if(card.name=='sha') return player.hasValueTarget(card)?10:0.001; - return 6-get.value(card); + position: "he", + check: function (card) { + var player = _status.event.player; + if (card.name == "sha") return player.hasValueTarget(card) ? 10 : 0.001; + return 6 - get.value(card); }, - prompt:function(){ - var player=_status.event.player; - var storage=player.storage.olsaogu; - if(storage) return '摸一张牌'; - var list=_status.event.olsaogu,str=''; - if(list&&list.length){ - var text='',suits=list.reduce(function(list,card){ - return list.add(get.suit(card,false)),list; - },[]).sort((a,b)=>lib.suit.indexOf(b)-lib.suit.indexOf(a)); - for(var i=0;i lib.suit.indexOf(b) - lib.suit.indexOf(a)); + for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); + str += "(不能弃置" + text + "花色的牌)"; } - return '弃置两张牌'+str+',然后使用其中的【杀】'; + return "弃置两张牌" + str + ",然后使用其中的【杀】"; }, - content:function(){ - player.changeZhuanhuanji('olsaogu'); - if(!cards.length) player.draw(); - else{ - var cardx=cards.filter(card=>card.name=='sha'); - if(cardx.length){ - var next=game.createEvent('olsaogu_chooseToUseSha'); - next.player=player; - next.cards=cardx; + content: function () { + player.changeZhuanhuanji("olsaogu"); + if (!cards.length) player.draw(); + else { + var cardx = cards.filter((card) => card.name == "sha"); + if (cardx.length) { + var next = game.createEvent("olsaogu_chooseToUseSha"); + next.player = player; + next.cards = cardx; next.setContent(lib.skill.olsaogu.chooseToUseSha); } } }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'},player)-0.2; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }, player) - 0.2; }, - result:{ - player:function(player){ - var storage=player.storage.olsaogu; - if(storage) return 1; - if(player.getDiscardableCards(player,'he').filter(card=>{ - if(card.name!='sha') return false; - if(_status.event.olsaogu&&_status.event.olsaogu.some(cardx=>get.suit(cardx,false)==get.suit(card,player))) return false; - return true; - }).length) return 1; + result: { + player: function (player) { + var storage = player.storage.olsaogu; + if (storage) return 1; + if ( + player.getDiscardableCards(player, "he").filter((card) => { + if (card.name != "sha") return false; + if ( + _status.event.olsaogu && + _status.event.olsaogu.some( + (cardx) => get.suit(cardx, false) == get.suit(card, player) + ) + ) + return false; + return true; + }).length + ) + return 1; return 0; }, }, }, - group:'olsaogu_effect', - subSkill:{ - effect:{ - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - if(_status.connectMode) return player.countCards('he'); - return player.countDiscardableCards(player,'he'); + group: "olsaogu_effect", + subSkill: { + effect: { + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + if (_status.connectMode) return player.countCards("he"); + return player.countDiscardableCards(player, "he"); }, - direct:true, - content:function(){ - 'step 0' - var list=[]; - player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseJieshu').name=='phaseJieshu') list.addArray(evt.cards2); + direct: true, + content: function () { + "step 0"; + var list = []; + player.getHistory("lose", (evt) => { + if ( + evt.type == "discard" && + evt.getParent("phaseJieshu").name == "phaseJieshu" + ) + list.addArray(evt.cards2); }); - event.list=list; - var str,storage=player.storage.olsaogu; - if(storage) str='弃置一张牌,令一名其他角色摸一张牌。'; - else{ - str='弃置一张牌,令一名其他角色弃置两张牌(不能包含你本阶段弃置过的花色),然后其使用弃置的【杀】。'; - if(list.length){ - var text='',suits=list.reduce(function(list,card){ - return list.add(get.suit(card,false)),list; - },[]).sort((a,b)=>lib.suit.indexOf(b)-lib.suit.indexOf(a)); - for(var i=0;i lib.suit.indexOf(b) - lib.suit.indexOf(a)); + for (var i = 0; i < suits.length; i++) text += get.translation(suits[i]); + str += "
    本阶段已弃置过" + text + "花色的牌。"; } } - player.chooseCardTarget({ - prompt:get.prompt('olsaogu'), - prompt2:str, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('he')>1; - }, - filterCard:lib.filter.cardDiscardable, - position:'he', - complexCard:true, - complexSelect:true, - ai1:function(card){ - var player=_status.event.player; - if(!player.storage.olsaogu&&_status.event.list.some(cardx=>get.suit(cardx,false)==get.suit(card,player))) return 7-get.value(card); - return 5-get.value(card); - }, - ai2:function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(player.storage.olsaogu) return att; - var list=_status.event.list.slice(); - if(ui.selected.cards.length) list.addArray(ui.selected.cards); - var cards=target.getCards('he',card=>{ - if(card.name!='sha'||list.some(cardx=>get.suit(cardx,false)==get.suit(card,target))) return false; - return lib.filter.cardDiscardable(card,target)&&game.hasPlayer(function(current){ - if(!current.canUse(card,target,false)) return false; - return get.effect(current,card,target,target)>0&&get.effect(current,card,target,player)>0; + player + .chooseCardTarget({ + prompt: get.prompt("olsaogu"), + prompt2: str, + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 1; + }, + filterCard: lib.filter.cardDiscardable, + position: "he", + complexCard: true, + complexSelect: true, + ai1: function (card) { + var player = _status.event.player; + if ( + !player.storage.olsaogu && + _status.event.list.some( + (cardx) => get.suit(cardx, false) == get.suit(card, player) + ) + ) + return 7 - get.value(card); + return 5 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (player.storage.olsaogu) return att; + var list = _status.event.list.slice(); + if (ui.selected.cards.length) list.addArray(ui.selected.cards); + var cards = target.getCards("he", (card) => { + if ( + card.name != "sha" || + list.some( + (cardx) => + get.suit(cardx, false) == get.suit(card, target) + ) + ) + return false; + return ( + lib.filter.cardDiscardable(card, target) && + game.hasPlayer(function (current) { + if (!current.canUse(card, target, false)) return false; + return ( + get.effect(current, card, target, target) > 0 && + get.effect(current, card, target, player) > 0 + ); + }) + ); }); - }); - if(cards.length&&att>0) return Math.sqrt(Math.min(2,cards.length))*cards.reduce(function(num,card){ - var players=game.filterPlayer(current=>target.canUse(card,current,false)); - players.sort((a,b)=>get.effect(b,card,target,target)*get.effect(b,card,target,player)-get.effect(a,card,target,target)*get.effect(a,card,target,player)); - return num=(get.effect(players[0],card,target,target)*get.effect(players[0],card,target,player)); - },0); - return get.effect(target,{name:'guohe_copy2'},player,player)*Math.sqrt(Math.min(2,target.getDiscardableCards(player,'he').filter(card=>{ - return !list.some(cardx=>get.suit(cardx,false)==get.suit(card,target)); - }).length)); - }, - }).set('list',list); - 'step 1' - if(result.bool){ - var cards=result.cards,target=result.targets[0]; - player.logSkill('olsaogu',target); + if (cards.length && att > 0) + return ( + Math.sqrt(Math.min(2, cards.length)) * + cards.reduce(function (num, card) { + var players = game.filterPlayer((current) => + target.canUse(card, current, false) + ); + players.sort( + (a, b) => + get.effect(b, card, target, target) * + get.effect(b, card, target, player) - + get.effect(a, card, target, target) * + get.effect(a, card, target, player) + ); + return (num = + get.effect(players[0], card, target, target) * + get.effect(players[0], card, target, player)); + }, 0) + ); + return ( + get.effect(target, { name: "guohe_copy2" }, player, player) * + Math.sqrt( + Math.min( + 2, + target + .getDiscardableCards(player, "he") + .filter((card) => { + return !list.some( + (cardx) => + get.suit(cardx, false) == + get.suit(card, target) + ); + }).length + ) + ) + ); + }, + }) + .set("list", list); + ("step 1"); + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.logSkill("olsaogu", target); player.discard(cards); - if(player.storage.olsaogu){ + if (player.storage.olsaogu) { target.draw(); event.finish(); - } - else{ - event.target=target; - var list=result.cards.slice(); - player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseJieshu').name=='phaseJieshu') list.addArray(evt.cards2); + } else { + event.target = target; + var list = result.cards.slice(); + player.getHistory("lose", (evt) => { + if ( + evt.type == "discard" && + evt.getParent("phaseJieshu").name == "phaseJieshu" + ) + list.addArray(evt.cards2); }); - var cards=target.getCards('he',card=>{ - return lib.filter.cardDiscardable(card,target)&&!list.some(cardx=>get.suit(cardx,false)==get.suit(card,target)); + var cards = target.getCards("he", (card) => { + return ( + lib.filter.cardDiscardable(card, target) && + !list.some( + (cardx) => get.suit(cardx, false) == get.suit(card, target) + ) + ); }); - if(cards.length){ - var text='',suits=list.reduce(function(list,card){ - return list.add(get.suit(card,false)),list; - },[]).sort((a,b)=>lib.suit.indexOf(b)-lib.suit.indexOf(a)); - for(var i=0;iget.suit(cardx,false)==get.suit(card,player)); - },Math.min(cards.length,2),true).set('ai',function(card){ - var player=_status.event.player; - if(card.name=='sha'&&player.hasValueTarget(card)) return 10; - return -get.value(card); - }).set('list',list); - } - else event.finish(); + if (cards.length) { + var text = "", + suits = list + .reduce(function (list, card) { + return list.add(get.suit(card, false)), list; + }, []) + .sort((a, b) => lib.suit.indexOf(b) - lib.suit.indexOf(a)); + for (var i = 0; i < suits.length; i++) + text += get.translation(suits[i]); + target + .chooseToDiscard( + "he", + "扫谷:弃置两张牌(不能弃置" + + text + + "花色的牌),然后使用其中的【杀】", + function (card, player) { + var list = _status.event.list; + return !list.some( + (cardx) => + get.suit(cardx, false) == get.suit(card, player) + ); + }, + Math.min(cards.length, 2), + true + ) + .set("ai", function (card) { + var player = _status.event.player; + if (card.name == "sha" && player.hasValueTarget(card)) + return 10; + return -get.value(card); + }) + .set("list", list); + } else event.finish(); } - } - else event.finish(); - 'step 2' - if(result.bool){ - var cards=result.cards.filter(card=>card.name=='sha'); - if(cards.length){ - var next=game.createEvent('olsaogu_chooseToUseSha'); - next.player=target; - next.cards=cards; + } else event.finish(); + ("step 2"); + if (result.bool) { + var cards = result.cards.filter((card) => card.name == "sha"); + if (cards.length) { + var next = game.createEvent("olsaogu_chooseToUseSha"); + next.player = target; + next.cards = cards; next.setContent(lib.skill.olsaogu.chooseToUseSha); } } }, }, }, - chooseToUseSha:function(){ - 'step 0' - event.cards2=cards.filter(i=>get.position(i,true)=='d'&&player.hasUseTarget(i)); - if(!event.cards2.length) event.finish(); - 'step 1' - if(event.cards2.length==1) event._result={bool:true,links:event.cards2}; - else player.chooseButton(['扫谷:请使用其中的【杀】',event.cards2],true).set('filterButton',button=>{ - return _status.event.player.hasUseTarget(button.link,false); - }).set('ai',button=>{ - return _status.event.player.getUseValue(button.link); - }); - 'step 2' - if(result.bool){ - var card=result.links[0]; + chooseToUseSha: function () { + "step 0"; + event.cards2 = cards.filter( + (i) => get.position(i, true) == "d" && player.hasUseTarget(i) + ); + if (!event.cards2.length) event.finish(); + ("step 1"); + if (event.cards2.length == 1) event._result = { bool: true, links: event.cards2 }; + else + player + .chooseButton(["扫谷:请使用其中的【杀】", event.cards2], true) + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget(button.link, false); + }) + .set("ai", (button) => { + return _status.event.player.getUseValue(button.link); + }); + ("step 2"); + if (result.bool) { + var card = result.links[0]; event.cards2.remove(card); - player.$gain2(card,false); + player.$gain2(card, false); game.delayx(); - player.chooseUseTarget(true,card,false); - } - else event.finish(); - 'step 3' - if(event.cards2.length) event.goto(1); + player.chooseUseTarget(true, card, false); + } else event.finish(); + ("step 3"); + if (event.cards2.length) event.goto(1); }, }, //OL周群 - oltianhou:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - 'step 0' - var card=get.cards()[0]; - event.card=card; + oltianhou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; + var card = get.cards()[0]; + event.card = card; game.cardsGotoOrdering(card); - 'step 1' - if(player.countCards('he')>0){ - player.chooseCard('he','天候:是否用一张牌交换牌堆顶的'+get.translation(card)+'?').set('promptx',[[card]]).set('card',card).set('ai',cardx=>{ - let card=_status.event.card,val=get.value(card,player)-get.value(cardx,player); - if(val<0) return -val; - let suit=get.suit(card); - if(suit==='heart') return val+game.countPlayer((current)=>{ - if(player!==current&&!game.hasPlayer((tar)=>tar.hp-current.hp>1)) return get.sgn(get.attitude(player,current)); - return 0; + ("step 1"); + if (player.countCards("he") > 0) { + player + .chooseCard("he", "天候:是否用一张牌交换牌堆顶的" + get.translation(card) + "?") + .set("promptx", [[card]]) + .set("card", card) + .set("ai", (cardx) => { + let card = _status.event.card, + val = get.value(card, player) - get.value(cardx, player); + if (val < 0) return -val; + let suit = get.suit(card); + if (suit === "heart") + return ( + val + + game.countPlayer((current) => { + if ( + player !== current && + !game.hasPlayer((tar) => tar.hp - current.hp > 1) + ) + return get.sgn(get.attitude(player, current)); + return 0; + }) + ); + if (suit == "club") + return ( + val + + game.countPlayer((current) => { + if ( + player !== current && + (current.hp < 2 || + !game.hasPlayer((tar) => current.hp - tar.hp > 1)) + ) + return get.sgn(get.attitude(player, current)); + return 0; + }) + ); + return val + 0.1; }); - if(suit=='club') return val+game.countPlayer((current)=>{ - if(player!==current&&(current.hp<2||!game.hasPlayer((tar)=>current.hp-tar.hp>1))) return get.sgn(get.attitude(player,current)); - return 0; + } else { + event._result = { bool: false }; + } + ("step 2"); + if (result.bool) { + player.lose(result.cards, ui.cardPile, "insert"); + player.gain(event.card, "draw"); + } else { + ui.cardPile.insertBefore(event.card, ui.cardPile.firstChild); + } + ("step 3"); + var card = get.cards()[0]; + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + player.showCards(card, get.translation(player) + "发动了【天候】"); + var suit = get.suit(card, false), + skill = "oltianhou_" + suit; + if (!lib.skill.oltianhou.derivation.includes(skill)) event.finish(); + else { + event.weather_skill = skill; + player + .chooseTarget( + true, + "令一名角色获得技能【" + get.translation(skill) + "】", + get.translation(skill + "_info") + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); }); - return val+0.1; - }); } - else{ - event._result={bool:false}; - } - 'step 2' - if(result.bool){ - player.lose(result.cards,ui.cardPile,'insert'); - player.gain(event.card,'draw'); - } - else{ - ui.cardPile.insertBefore(event.card,ui.cardPile.firstChild); - } - 'step 3' - var card=get.cards()[0]; - ui.cardPile.insertBefore(card,ui.cardPile.firstChild); - player.showCards(card,get.translation(player)+'发动了【天候】'); - var suit=get.suit(card,false),skill='oltianhou_'+suit; - if(!lib.skill.oltianhou.derivation.includes(skill)) event.finish(); - else{ - event.weather_skill=skill; - player.chooseTarget(true,'令一名角色获得技能【'+get.translation(skill)+'】',get.translation(skill+'_info')).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - } - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.addAdditionalSkill('oltianhou_'+player.playerid,event.weather_skill); - player.addTempSkill('oltianhou_expire',{player:'phaseZhunbeiBegin'}); - game.log(target,'获得了天气技能','#g【'+get.translation(event.weather_skill)+'】'); - game.broadcastAll(function(bg){ - _status.tempBackground=bg; + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.addAdditionalSkill("oltianhou_" + player.playerid, event.weather_skill); + player.addTempSkill("oltianhou_expire", { player: "phaseZhunbeiBegin" }); + game.log( + target, + "获得了天气技能", + "#g【" + get.translation(event.weather_skill) + "】" + ); + game.broadcastAll(function (bg) { + _status.tempBackground = bg; game.updateBackground(); - },event.weather_skill+'_bg'); - game.addVideo('skill',player,['oltianhou',[true,event.weather_skill+'_bg']]) + }, event.weather_skill + "_bg"); + game.addVideo("skill", player, ["oltianhou", [true, event.weather_skill + "_bg"]]); } }, - video:function(player,info){ - if(info[0]){ - _status.tempBackground=info[1]; - } - else{ + video: function (player, info) { + if (info[0]) { + _status.tempBackground = info[1]; + } else { delete _status.tempBackground; } game.updateBackground(); }, - derivation:['oltianhou_spade','oltianhou_heart','oltianhou_club','oltianhou_diamond'], - subSkill:{ - expire:{ - charlotte:true, - onremove:function(player){ - var key='oltianhou_'+player.playerid,players=game.players.concat(game.dead); - for(var current of players){ + derivation: ["oltianhou_spade", "oltianhou_heart", "oltianhou_club", "oltianhou_diamond"], + subSkill: { + expire: { + charlotte: true, + onremove: function (player) { + var key = "oltianhou_" + player.playerid, + players = game.players.concat(game.dead); + for (var current of players) { current.removeAdditionalSkill(key); } - game.removeGlobalSkill('oltianhou_'+player.playerid+'_ai'); - game.broadcastAll(function(){ + game.removeGlobalSkill("oltianhou_" + player.playerid + "_ai"); + game.broadcastAll(function () { delete _status.tempBackground; game.updateBackground(); }); - game.addVideo('skill',player,['oltianhou',[false]]) + game.addVideo("skill", player, ["oltianhou", [false]]); }, }, - spade:{ - audio:true, - mark:true, - marktext:'雨', - intro:{ - content:'锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。', + spade: { + audio: true, + mark: true, + marktext: "雨", + intro: { + content: + "锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。", }, - trigger:{global:'damageEnd'}, - forced:true, - filter:function(event){ - return event.hasNature('thunder')&&lib.skill.oltianhou_spade.logTarget(event).length>0; + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event) { + return ( + event.hasNature("thunder") && + lib.skill.oltianhou_spade.logTarget(event).length > 0 + ); }, - logTarget:function(event){ - var list=[]; - if(!event.player.isIn()) return []; - if(event.player.getNext().isIn()) list.push(event.player.getNext()); - if(event.player.getPrevious().isIn()) list.push(event.player.getPrevious()); + logTarget: function (event) { + var list = []; + if (!event.player.isIn()) return []; + if (event.player.getNext().isIn()) list.push(event.player.getNext()); + if (event.player.getPrevious().isIn()) list.push(event.player.getPrevious()); return list.sortBySeat(_status.currentPhase); }, - content:function(){ - var targets=lib.skill.oltianhou_spade.logTarget(trigger); - for(var i of targets) i.loseHp(); + content: function () { + var targets = lib.skill.oltianhou_spade.logTarget(trigger); + for (var i of targets) i.loseHp(); game.delayex(); }, - group:'oltianhou_miehuo', - global:'oltianhou_spade_ai', + group: "oltianhou_miehuo", + global: "oltianhou_spade_ai", }, - spade_ai:{ - ai:{ - effect:{ - player:function(card,player,target,current){ - if((typeof card=='object'&&game.hasNature(card,'fire')||get.tag(card,'fireDamage'))&&!player.hasSkill('oltianhou_spade')) return 'zeroplayertarget'; - if((typeof card=='object'&&game.hasNature(card,'thunder')||get.tag(card,'thunderDamage'))){ - var list=lib.skill.oltianhou_spade.logTarget({player:target}); - var eff=list.reduce(function(eff,current){ - eff+=get.effect(current,{name:'losehp'},player,player)/get.attitude(player,player); - },0); - return [1,eff]; + spade_ai: { + ai: { + effect: { + player: function (card, player, target, current) { + if ( + ((typeof card == "object" && game.hasNature(card, "fire")) || + get.tag(card, "fireDamage")) && + !player.hasSkill("oltianhou_spade") + ) + return "zeroplayertarget"; + if ( + (typeof card == "object" && game.hasNature(card, "thunder")) || + get.tag(card, "thunderDamage") + ) { + var list = lib.skill.oltianhou_spade.logTarget({ player: target }); + var eff = list.reduce(function (eff, current) { + eff += + get.effect(current, { name: "losehp" }, player, player) / + get.attitude(player, player); + }, 0); + return [1, eff]; } - } - } - } - }, - miehuo:{ - audio:'oltianhou_spade', - trigger:{global:'damageBegin2'}, - forced:true, - logTarget:'source', - filter:function(event,player){ - return event.hasNature('fire')&&event.source&&event.source.isIn()&&event.source!=player; + }, + }, }, - content:function(){ + }, + miehuo: { + audio: "oltianhou_spade", + trigger: { global: "damageBegin2" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return ( + event.hasNature("fire") && + event.source && + event.source.isIn() && + event.source != player + ); + }, + content: function () { trigger.cancel(); - } + }, }, - heart:{ - audio:true, - mark:true, - marktext:'暑', - intro:{ - content:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。', + heart: { + audio: true, + mark: true, + marktext: "暑", + intro: { + content: + "锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。", }, - trigger:{global:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player!=event.player&&event.player.isIn()&&event.player.isMaxHp(); + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player != event.player && event.player.isIn() && event.player.isMaxHp(); }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.player.loseHp(); }, - global:'oltianhou_heart_ai' + global: "oltianhou_heart_ai", }, - heart_ai:{ - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&_status.event&&_status.event.type=='phase'&&!player.hasSkill('oltianhou_heart')&&get.tag(card,'recover')&&!player.isMaxHp()&&player.needsToDiscard()<=1&&!game.hasPlayer(function(current){ - return current.hp-player.hp>1; - })&&get.effect(player,{name:'losehp'},player,player)<0) return 0; - } - } + heart_ai: { + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + _status.event && + _status.event.type == "phase" && + !player.hasSkill("oltianhou_heart") && + get.tag(card, "recover") && + !player.isMaxHp() && + player.needsToDiscard() <= 1 && + !game.hasPlayer(function (current) { + return current.hp - player.hp > 1; + }) && + get.effect(player, { name: "losehp" }, player, player) < 0 + ) + return 0; + }, + }, }, - club:{ - audio:true, - mark:true, - marktext:'霜', - intro:{ - content:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。', + club: { + audio: true, + mark: true, + marktext: "霜", + intro: { + content: + "锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。", }, - trigger:{global:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player!=event.player&&event.player.isIn()&&event.player.isMinHp(); + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player != event.player && event.player.isIn() && event.player.isMinHp(); }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.player.loseHp(); }, - global:'oltianhou_club_ai' + global: "oltianhou_club_ai", }, - club_ai:{ - ai:{ - nokeep:true, - skillTagFilter:function(player,tag,arg){ - return _status.event&&_status.event.type=='phase'&&(!arg||arg.card&&get.name(arg.card)==='tao')&&!player.hasSkill('oltianhou_club')&&player.isMinHp()&&get.effect(player,{name:'losehp'},player,player)<0; - } - } + club_ai: { + ai: { + nokeep: true, + skillTagFilter: function (player, tag, arg) { + return ( + _status.event && + _status.event.type == "phase" && + (!arg || (arg.card && get.name(arg.card) === "tao")) && + !player.hasSkill("oltianhou_club") && + player.isMinHp() && + get.effect(player, { name: "losehp" }, player, player) < 0 + ); + }, + }, }, - diamond:{ - audio:true, - mark:true, - marktext:'雾', - intro:{ - content:'锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。', + diamond: { + audio: true, + mark: true, + marktext: "雾", + intro: { + content: + "锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。", }, - trigger:{global:'useCardToPlayer'}, - forced:true, - filter:function(event,player){ - if(event.card.name!='sha'||event.player==player||event.targets.length!=1||!event.player.isIn()) return false; - return event.target!=event.player.getNext()&&event.target!=event.player.getPrevious(); - }, - logTarget:'player', - content:function(){ - 'step 0' - var num=get.number(trigger.card); - event.num=num; - trigger.player.judge(card=>{ - var num=get.number(card),num2=_status.event.getParent('oltianhou_diamond').num; - return num>num2?-4:4; - }).set('judge2',result=>{ - if(result.bool==false) return true; + trigger: { global: "useCardToPlayer" }, + forced: true, + filter: function (event, player) { + if ( + event.card.name != "sha" || + event.player == player || + event.targets.length != 1 || + !event.player.isIn() + ) return false; - }) - 'step 1' - if(!result.bool){ - trigger.getParent().all_excluded=true; + return ( + event.target != event.player.getNext() && + event.target != event.player.getPrevious() + ); + }, + logTarget: "player", + content: function () { + "step 0"; + var num = get.number(trigger.card); + event.num = num; + trigger.player + .judge((card) => { + var num = get.number(card), + num2 = _status.event.getParent("oltianhou_diamond").num; + return num > num2 ? -4 : 4; + }) + .set("judge2", (result) => { + if (result.bool == false) return true; + return false; + }); + ("step 1"); + if (!result.bool) { + trigger.getParent().all_excluded = true; trigger.untrigger(); } }, - global:'oltianhou_diamond_ai', + global: "oltianhou_diamond_ai", }, - diamond_ai:{ - ai:{ - effect:{ - player:function(card,player,target){ - if(get.name(card)=='sha'&&!player.hasSkill('oltianhou_diamond')&&target!=player.getNext()&&target!=player.getPrevious()){ - let num=get.number(card),max=_status.aiyh_MAXNUM||13; - return [num/max,0,num/max,0]; + diamond_ai: { + ai: { + effect: { + player: function (card, player, target) { + if ( + get.name(card) == "sha" && + !player.hasSkill("oltianhou_diamond") && + target != player.getNext() && + target != player.getPrevious() + ) { + let num = get.number(card), + max = _status.aiyh_MAXNUM || 13; + return [num / max, 0, num / max, 0]; } - } - } - } + }, + }, + }, }, - } + }, }, - olchenshuo:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + olchenshuo: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - hasSame:function(info,card){ - if(info.type==get.type2(card,false)) return true; - if(info.suit!='none'&&info.suit==get.suit(card,false)) return true; - if(typeof info.number=='number'&&info.number>0&&info.number==get.number(card,false)) return true; - return info.length==get.cardNameLength(card) + hasSame: function (info, card) { + if (info.type == get.type2(card, false)) return true; + if (info.suit != "none" && info.suit == get.suit(card, false)) return true; + if ( + typeof info.number == "number" && + info.number > 0 && + info.number == get.number(card, false) + ) + return true; + return info.length == get.cardNameLength(card); }, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('olchenshuo'),'展示一张手牌,然后展示并获得牌堆顶的牌').set('ai',function(card){ - if(get.type(card)=='basic') return 1+Math.random(); - return Math.random(); - }) - 'step 1' - if(result.bool){ - player.logSkill('olchenshuo'); - player.showCards(result.cards,get.translation(player)+'发动了【谶说】'); - var card=result.cards[0]; - event.cardInfo={ - type:get.type2(card,player), - suit:get.suit(card,player), - number:get.number(card,player), - length:get.cardNameLength(card), - } - event.cards=[]; - event.forceDie=true; - event.includeOut=true; - } - else event.finish(); - 'step 2' - var judgestr=get.translation(player)+'展示的第'+get.cnNumber(cards.length+1,true)+'张【谶说】牌'; - event.videoId=lib.status.videoId++; - var card=get.cards()[0]; - event.card=card; + content: function () { + "step 0"; + player + .chooseCard("h", get.prompt("olchenshuo"), "展示一张手牌,然后展示并获得牌堆顶的牌") + .set("ai", function (card) { + if (get.type(card) == "basic") return 1 + Math.random(); + return Math.random(); + }); + ("step 1"); + if (result.bool) { + player.logSkill("olchenshuo"); + player.showCards(result.cards, get.translation(player) + "发动了【谶说】"); + var card = result.cards[0]; + event.cardInfo = { + type: get.type2(card, player), + suit: get.suit(card, player), + number: get.number(card, player), + length: get.cardNameLength(card), + }; + event.cards = []; + event.forceDie = true; + event.includeOut = true; + } else event.finish(); + ("step 2"); + var judgestr = + get.translation(player) + + "展示的第" + + get.cnNumber(cards.length + 1, true) + + "张【谶说】牌"; + event.videoId = lib.status.videoId++; + var card = get.cards()[0]; + event.card = card; cards.add(card); game.cardsGotoOrdering(card); - game.addVideo('judge1',player,[get.cardInfo(card),judgestr,event.videoId]); - game.broadcastAll(function(player,card,str,id,cardid){ - var event; - if(game.online){ - event={}; - } - else{ - event=_status.event; - } - if(game.chess){ - event.node=card.copy('thrown','center',ui.arena).addTempClass('start'); - } - else{ - event.node=player.$throwordered(card.copy(),true); - } - if(lib.cardOL) lib.cardOL[cardid]=event.node; - event.node.cardid=cardid; - event.node.classList.add('thrownhighlight'); - ui.arena.classList.add('thrownhighlight'); - event.dialog=ui.create.dialog(str); - event.dialog.classList.add('center'); - event.dialog.videoId=id; - },player,card,judgestr,event.videoId,get.id()); - game.log(player,'展示了牌堆顶的',card); + game.addVideo("judge1", player, [get.cardInfo(card), judgestr, event.videoId]); + game.broadcastAll( + function (player, card, str, id, cardid) { + var event; + if (game.online) { + event = {}; + } else { + event = _status.event; + } + if (game.chess) { + event.node = card.copy("thrown", "center", ui.arena).addTempClass("start"); + } else { + event.node = player.$throwordered(card.copy(), true); + } + if (lib.cardOL) lib.cardOL[cardid] = event.node; + event.node.cardid = cardid; + event.node.classList.add("thrownhighlight"); + ui.arena.classList.add("thrownhighlight"); + event.dialog = ui.create.dialog(str); + event.dialog.classList.add("center"); + event.dialog.videoId = id; + }, + player, + card, + judgestr, + event.videoId, + get.id() + ); + game.log(player, "展示了牌堆顶的", card); game.delay(2); - 'step 3' - game.broadcastAll(function(id){ - var dialog=get.idDialog(id); - if(dialog){ + ("step 3"); + game.broadcastAll(function (id) { + var dialog = get.idDialog(id); + if (dialog) { dialog.close(); } - ui.arena.classList.remove('thrownhighlight'); - },event.videoId); - game.addVideo('judge2',null,event.videoId); - if(cards.length<3&&player.isIn()&&lib.skill.olchenshuo.hasSame(event.cardInfo,card)) event.goto(2); - else{ - game.broadcastAll(function(){ui.clear()}); - player.gain(cards,'gain2'); + ui.arena.classList.remove("thrownhighlight"); + }, event.videoId); + game.addVideo("judge2", null, event.videoId); + if ( + cards.length < 3 && + player.isIn() && + lib.skill.olchenshuo.hasSame(event.cardInfo, card) + ) + event.goto(2); + else { + game.broadcastAll(function () { + ui.clear(); + }); + player.gain(cards, "gain2"); } }, }, //OL文钦 - olguangao:{ - audio:2, - trigger:{ - global:'useCard2', + olguangao: { + audio: 2, + trigger: { + global: "useCard2", }, - filter:function(event,player){ - var card=event.card; - if(card.name!='sha') return false; - if(event.player==player){ - return game.hasPlayer(current=>{ - return current.isIn()&&!event.targets.includes(current)&&player.canUse(card,current); + filter: function (event, player) { + var card = event.card; + if (card.name != "sha") return false; + if (event.player == player) { + return game.hasPlayer((current) => { + return ( + current.isIn() && + !event.targets.includes(current) && + player.canUse(card, current) + ); }); } - return event.player.isIn()&&!event.targets.includes(player)&&event.player.canUse(card,player); + return ( + event.player.isIn() && + !event.targets.includes(player) && + event.player.canUse(card, player) + ); }, - direct:true, - content:function(){ - 'step 0' - if(trigger.player==player){ - player.chooseTarget(get.prompt('olguangao'),'为'+get.translation(trigger.card)+'额外指定一个目标。然后若你手牌数为偶数,你摸一张牌并令此牌对任意目标无效。',(card,player,target)=>{ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - if(player.countCards('h')%2==0) return true; - var eff=get.effect(target,_status.event.card,player,player); - if(player.hasSkill('olxieju')&&player.isPhaseUsing()&&!player.getStat().skill.olxieju&&get.attitude(player,target)>0&&!game.hasGlobalHistory('useCard',evt=>{ - return evt.targets&&evt.targets.includes(target); - })) return 6+eff; - return eff; - }).set('card',trigger.card); + direct: true, + content: function () { + "step 0"; + if (trigger.player == player) { + player + .chooseTarget( + get.prompt("olguangao"), + "为" + + get.translation(trigger.card) + + "额外指定一个目标。然后若你手牌数为偶数,你摸一张牌并令此牌对任意目标无效。", + (card, player, target) => { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + if (player.countCards("h") % 2 == 0) return true; + var eff = get.effect(target, _status.event.card, player, player); + if ( + player.hasSkill("olxieju") && + player.isPhaseUsing() && + !player.getStat().skill.olxieju && + get.attitude(player, target) > 0 && + !game.hasGlobalHistory("useCard", (evt) => { + return evt.targets && evt.targets.includes(target); + }) + ) + return 6 + eff; + return eff; + }) + .set("card", trigger.card); + } else { + trigger.player + .chooseBool( + "是否发动" + get.translation(player) + "的【犷骜】?", + "令其成为" + + get.translation(trigger.card) + + "的额外目标。然后若其手牌数为偶数,其摸一张牌并令此牌对任意目标无效。" + ) + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + (function () { + var att = get.attitude(trigger.player, player); + if (player.countCards("h") % 2 == 0) { + if (att > 0) return true; + return false; + } + if (get.effect(player, trigger.card, trigger.player, trigger.player) > 0) + return true; + return false; + })() + ); } - else{ - trigger.player.chooseBool('是否发动'+get.translation(player)+'的【犷骜】?','令其成为'+get.translation(trigger.card)+'的额外目标。然后若其手牌数为偶数,其摸一张牌并令此牌对任意目标无效。').set('ai',()=>{ - return _status.event.bool; - }).set('bool',function(){ - var att=get.attitude(trigger.player,player); - if(player.countCards('h')%2==0){ - if(att>0) return true; - return false; - } - if(get.effect(player,trigger.card,trigger.player,trigger.player)>0) return true; - return false; - }()); - } - 'step 1' - if(result.bool){ - var target=result.targets&&result.targets[0]; - if(!target){ - target=player; - trigger.player.logSkill('olguangao',player); - } - else{ - player.logSkill('olguangao',target); + ("step 1"); + if (result.bool) { + var target = result.targets && result.targets[0]; + if (!target) { + target = player; + trigger.player.logSkill("olguangao", player); + } else { + player.logSkill("olguangao", target); } trigger.targets.add(target); game.delayex(); - } - else event.finish(); - 'step 2' - if(player.countCards('h')%2==0){ + } else event.finish(); + ("step 2"); + if (player.countCards("h") % 2 == 0) { player.draw(); - player.chooseTarget('犷骜:令此杀对其任意个目标无效',[1,Infinity],(card,player,target)=>{ - return _status.event.targetsx.includes(target); - }).set('ai',target=>{ - return 1-get.effect(target,_status.event.getTrigger().card,_status.event.player,_status.event.player); - }).set('targetsx',trigger.targets); - } - else event.finish(); - 'step 3' - if(result.bool){ + player + .chooseTarget( + "犷骜:令此杀对其任意个目标无效", + [1, Infinity], + (card, player, target) => { + return _status.event.targetsx.includes(target); + } + ) + .set("ai", (target) => { + return ( + 1 - + get.effect( + target, + _status.event.getTrigger().card, + _status.event.player, + _status.event.player + ) + ); + }) + .set("targetsx", trigger.targets); + } else event.finish(); + ("step 3"); + if (result.bool) { player.line(result.targets); trigger.excluded.addArray(result.targets); } - } - }, - olhuiqi:{ - audio:2, - trigger:{ - global:'phaseEnd', }, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'thunder', - derivation:'olxieju', - filter:function(event,player){ - var targets=[]; - game.getGlobalHistory('useCard',evt=>{ - if(evt.targets&&evt.targets.length){ + }, + olhuiqi: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + derivation: "olxieju", + filter: function (event, player) { + var targets = []; + game.getGlobalHistory("useCard", (evt) => { + if (evt.targets && evt.targets.length) { targets.addArray(evt.targets); } }); - return targets.length==3&&targets.includes(player); + return targets.length == 3 && targets.includes(player); }, - content:function(){ - 'step 0' - player.awakenSkill('olhuiqi'); - player.addSkills('olxieju'); + content: function () { + "step 0"; + player.awakenSkill("olhuiqi"); + player.addSkills("olxieju"); player.insertPhase(); - } - }, - olxieju:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return event.olxieju&&event.olxieju.length; }, - onChooseToUse:function(event){ - if(!event.olxieju&&!game.online){ - var targets=[]; - game.getGlobalHistory('useCard',evt=>{ - if(evt.targets&&evt.targets.length){ + }, + olxieju: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return event.olxieju && event.olxieju.length; + }, + onChooseToUse: function (event) { + if (!event.olxieju && !game.online) { + var targets = []; + game.getGlobalHistory("useCard", (evt) => { + if (evt.targets && evt.targets.length) { targets.addArray(evt.targets); } - }) - event.set('olxieju',targets); + }); + event.set("olxieju", targets); } }, - filterTarget:function(card,player,target){ - var event=_status.event; - if(event.olxieju.includes(target)) return true; + filterTarget: function (card, player, target) { + var event = _status.event; + if (event.olxieju.includes(target)) return true; return false; }, - selectTarget:[1,Infinity], - content:function(){ - var card={ - name:'sha', - isCard:true, + selectTarget: [1, Infinity], + content: function () { + var card = { + name: "sha", + isCard: true, }; - if(target.hasUseTarget(card,true)){ - target.chooseUseTarget(card,true,false); + if (target.hasUseTarget(card, true)) { + target.chooseUseTarget(card, true, false); } }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var val=target.getUseValue({name:'sha'},true); + ai: { + order: 1, + result: { + target: function (player, target) { + var val = target.getUseValue({ name: "sha" }, true); return Math.sign(val); - } - } - } + }, + }, + }, }, //郝普 - olzhenying:{ - audio:2, - enable:'phaseUse', - usable:2, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return lib.skill.olzhenying.filterTarget(null,player,current); + olzhenying: { + audio: 2, + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return game.hasPlayer((current) => { + return lib.skill.olzhenying.filterTarget(null, player, current); }); }, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h')<=player.countCards('h'); + filterTarget: function (card, player, target) { + return player != target && target.countCards("h") <= player.countCards("h"); }, - content:function(){ - 'step 0' - var send=function(){ - var next=game.createEvent('olzhenying_adjust',false); + content: function () { + "step 0"; + var send = function () { + var next = game.createEvent("olzhenying_adjust", false); next.setContent(lib.skill.olzhenying.contentx); game.resume(); }; - var sendback=function(result,player){ - if(!result&&typeof result!=='number'){ - result=player.getCards('h'); - if(!result.length) result=0; + var sendback = function (result, player) { + if (!result && typeof result !== "number") { + result = player.getCards("h"); + if (!result.length) result = 0; } - event.results.push([player,result]); + event.results.push([player, result]); }; - event.ai_targets=[]; - event.results=[]; - var players=[player,target]; - for(var i=0;i{ - return get.value(b)-get.value(a); + if (event.ai_targets.length) { + for (var i = 0; i < event.ai_targets.length; i++) { + if (players.includes(event.ai_targets[i])) { + var target = event.ai_targets[i]; + var cards = target.getCards("h"); + cards = cards.sort((a, b) => { + return get.value(b) - get.value(a); }); - var beginInd=1; - var endInd=2; - var eff=get.effect(player,{name:'juedou'},target,target),eff2=get.effect(target,{name:'juedou'},player,target); - var att=get.attitude(player,target); - if(att>0||eff2>0){ - if(cards.length<=2){ - cards=2-cards.length; + var beginInd = 1; + var endInd = 2; + var eff = get.effect(player, { name: "juedou" }, target, target), + eff2 = get.effect(target, { name: "juedou" }, player, target); + var att = get.attitude(player, target); + if (att > 0 || eff2 > 0) { + if (cards.length <= 2) { + cards = 2 - cards.length; + } else { + beginInd = 2; + endInd = 2; } - else{ - beginInd=2; endInd=2; - } - } - else{ - if(get.value(cards,target)<=5&&!target.isZhu){ - if(eff>0&&Math.random()<0.65){ - beginInd=0; endInd=1; + } else { + if (get.value(cards, target) <= 5 && !target.isZhu) { + if (eff > 0 && Math.random() < 0.65) { + beginInd = 0; + endInd = 1; } } } - if(typeof cards!='number'){ - cards=cards.slice([beginInd,endInd].randomGet(),cards.length); + if (typeof cards != "number") { + cards = cards.slice([beginInd, endInd].randomGet(), cards.length); } - sendback(cards,target); - event.ai_targets.splice(i--,1); + sendback(cards, target); + event.ai_targets.splice(i--, 1); } } - if(event.ai_targets.length){ + if (event.ai_targets.length) { event.ai_targets.randomSort(); - setTimeout(function(){ - event.interval=setInterval(function(){ - var target=event.ai_targets.shift(); - var cards=target.getCards('h'); - cards=cards.sort((a,b)=>{ - return get.value(b)-get.value(a); - }); - var beginInd=1; - var endInd=2; - var eff=get.effect(player,{name:'juedou'},target,target),eff2=get.effect(target,{name:'juedou'},player,target); - var att=get.attitude(player,target); - if(att>0||eff2>0){ - if(cards.length<=2){ - cards=2-cards.length; - } - else{ - beginInd=2; endInd=2; - } - } - else{ - if(get.value(cards,target)<=5&&!target.isZhu){ - if(eff>0&&Math.random()<0.65){ - beginInd=0; endInd=1; + setTimeout(function () { + event.interval = setInterval( + function () { + var target = event.ai_targets.shift(); + var cards = target.getCards("h"); + cards = cards.sort((a, b) => { + return get.value(b) - get.value(a); + }); + var beginInd = 1; + var endInd = 2; + var eff = get.effect(player, { name: "juedou" }, target, target), + eff2 = get.effect(target, { name: "juedou" }, player, target); + var att = get.attitude(player, target); + if (att > 0 || eff2 > 0) { + if (cards.length <= 2) { + cards = 2 - cards.length; + } else { + beginInd = 2; + endInd = 2; + } + } else { + if (get.value(cards, target) <= 5 && !target.isZhu) { + if (eff > 0 && Math.random() < 0.65) { + beginInd = 0; + endInd = 1; + } } } - } - if(typeof cards!='number'){ - cards=cards.slice([beginInd,endInd].randomGet(),cards.length); - } - sendback(cards,target); - if(!event.ai_targets.length){ - clearInterval(event.interval); - if(event.withai) game.resume(); - } - },_status.connectMode?750:75); - },500); + if (typeof cards != "number") { + cards = cards.slice([beginInd, endInd].randomGet(), cards.length); + } + sendback(cards, target); + if (!event.ai_targets.length) { + clearInterval(event.interval); + if (event.withai) game.resume(); + } + }, + _status.connectMode ? 750 : 75 + ); + }, 500); } } - 'step 1' - if(event.withme){ - if(_status.connectMode) game.me.unwait(result,game.me); - else{ - if(!result&&typeof result!=='number'){ - result=game.me.getCards('h'); - if(!result.length) result=0; + ("step 1"); + if (event.withme) { + if (_status.connectMode) game.me.unwait(result, game.me); + else { + if (!result && typeof result !== "number") { + result = game.me.getCards("h"); + if (!result.length) result = 0; } - event.results.push([game.me,result]); + event.results.push([game.me, result]); } } - 'step 2' - if(event.withol&&!event.resultOL){ + ("step 2"); + if (event.withol && !event.resultOL) { game.pause(); } - 'step 3' - if(event.ai_targets.length>0){ - event.withai=true; + ("step 3"); + if (event.ai_targets.length > 0) { + event.withai = true; game.pause(); } - 'step 4' - if(_status.connectMode){ - for(var i of [player,target]) i.hideTimer(); + ("step 4"); + if (_status.connectMode) { + for (var i of [player, target]) i.hideTimer(); } - var lose_list=[]; - var draw_list=[]; - event.results.sort((a,b)=>lib.sort.seat(a[0],b[0])); - for(var res of event.results){ - var target=res[0],cardsx=res[1]; - if(!target||!cardsx) continue; - if(typeof cardsx==='number') draw_list.push([target,cardsx]); - else if(cardsx.length) lose_list.push([target,cardsx]); + var lose_list = []; + var draw_list = []; + event.results.sort((a, b) => lib.sort.seat(a[0], b[0])); + for (var res of event.results) { + var target = res[0], + cardsx = res[1]; + if (!target || !cardsx) continue; + if (typeof cardsx === "number") draw_list.push([target, cardsx]); + else if (cardsx.length) lose_list.push([target, cardsx]); } - if(lose_list.length){ + if (lose_list.length) { game.loseAsync({ - lose_list:lose_list, - }).setContent('discardMultiple'); + lose_list: lose_list, + }).setContent("discardMultiple"); } - if(draw_list.length){ - for(var list of draw_list){ - var target=list[0],num=list[1]; - target.draw(num,'nodelay'); + if (draw_list.length) { + for (var list of draw_list) { + var target = list[0], + num = list[1]; + target.draw(num, "nodelay"); } } - 'step 5' + ("step 5"); game.delay(); - var num1=player.countCards('h'),num2=target.countCards('h'); - if(num1==num2){ + var num1 = player.countCards("h"), + num2 = target.countCards("h"); + if (num1 == num2) { event.finish(); return; } - var players=[player,target]; - if(num2=2){ - var cards=player.getCards('h',card=>{ - return lib.filter.cardDiscardable(card,player,'olzhenying'); - }); - if(cards.length{ - return lib.filter.cardDiscardable(card,player,'olzhenying'); + contentx: function () { + "step 0"; + var player = game.me; + event.player = player; + var num = player.countCards("h"); + if (num >= 2) { + var cards = player.getCards("h", (card) => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); }); + if (cards.length < num - 2) event._result = { cards: cards }; + else + player.chooseCard( + "镇荧:请将手牌弃置至至多两张", + [num - 2, num], + true, + (card, player, target) => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); + } + ); event.goto(2); + } else { + var choices = ["零", "一", "二"]; + player + .chooseControl(choices) + .set("prompt", "镇荧:请选择要将手牌调整至的张数") + .set("ai", () => { + return [0, 1, 2].randomGet(); + }); } - else{ - var choices=['零','一','二']; - player.chooseControl(choices).set('prompt','镇荧:请选择要将手牌调整至的张数').set('ai',()=>{ - return [0,1,2].randomGet(); + ("step 1"); + var num = result.index; + var len = player.countCards("h"); + if (len > num) { + var cards = player.getCards("h", (card) => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); }); + if (num == 0 || cards.length < len - num) { + event._result = { cards: cards }; + } else + player.chooseCard( + "镇荧:请将手牌弃置至" + get.cnNumber(num) + "张", + len - num, + true, + (card, player, target) => { + return lib.filter.cardDiscardable(card, player, "olzhenying"); + } + ); + } else event._result = { cards: num - len }; + ("step 2"); + if (result && result.cards) { + var cards = result.cards; } - 'step 1' - var num=result.index; - var len=player.countCards('h'); - if(len>num){ - var cards=player.getCards('h',card=>{ - return lib.filter.cardDiscardable(card,player,'olzhenying'); - }); - if(num==0||cards.length{ - return lib.filter.cardDiscardable(card,player,'olzhenying'); - }); - } - else event._result={cards:num-len}; - 'step 2' - if(result&&result.cards){ - var cards=result.cards; - } - event.result=cards; + event.result = cards; }, - ai:{ - order:function(item,player){ - if(game.hasPlayer(current=>{ - return current.countCards('h') { + return current.countCards("h") < player.countCards("h"); + }) + ) + return 3; return 7; }, - result:{ - player:function(player,target){ - var delt=2-player.countCards('h'); - return Math.sqrt(Math.abs(delt))*Math.sign(delt)+0.1; + result: { + player: function (player, target) { + var delt = 2 - player.countCards("h"); + return Math.sqrt(Math.abs(delt)) * Math.sign(delt) + 0.1; }, - target:function(player,target){ - if(get.attitude(player,target)>0&&target.countCards('h')+player.countCards('h')<=3) return 1; - return get.sgn(get.effect(target,{name:'juedou'},player,target))*1.2; - } - } + target: function (player, target) { + if ( + get.attitude(player, target) > 0 && + target.countCards("h") + player.countCards("h") <= 3 + ) + return 1; + return get.sgn(get.effect(target, { name: "juedou" }, player, target)) * 1.2; + }, + }, }, }, //OL孟达 - olgoude:{ - audio:2, - trigger:{ - global:'phaseEnd', + olgoude: { + audio: 2, + trigger: { + global: "phaseEnd", }, - filter:function(event,player){ - var list=[]; - game.countPlayer(current=>{ - if(current.group!=player.group) return false; - var listx=lib.skill.olgoude.getActed(current); + filter: function (event, player) { + var list = []; + game.countPlayer((current) => { + if (current.group != player.group) return false; + var listx = lib.skill.olgoude.getActed(current); list.addArray(listx); }); - return list.length&&list.length<4; + return list.length && list.length < 4; }, - getActed:function(target){ - var list=[]; - if(target.hasHistory('gain',evt=>{ - return evt.getParent().name=='draw'&&evt.cards.length==1; - })){ + getActed: function (target) { + var list = []; + if ( + target.hasHistory("gain", (evt) => { + return evt.getParent().name == "draw" && evt.cards.length == 1; + }) + ) { list.push(1); } - if(game.hasPlayer2(current=>{ - return current.hasHistory('lose',evt=>{ - if(evt.type!='discard') return false; - if((evt.discarder||evt.getParent(2).player)!=target) return false; - var evtx=evt.getl(current); - if(!evtx||evtx.hs.length!=1) return false; - return true; - }); - })){ + if ( + game.hasPlayer2((current) => { + return current.hasHistory("lose", (evt) => { + if (evt.type != "discard") return false; + if ((evt.discarder || evt.getParent(2).player) != target) return false; + var evtx = evt.getl(current); + if (!evtx || evtx.hs.length != 1) return false; + return true; + }); + }) + ) { list.push(2); } - if(target.hasHistory('useCard',evt=>{ - if(evt.card.name=='sha'&&evt.cards&&!evt.cards.length) return true; - return false; - })){ + if ( + target.hasHistory("useCard", (evt) => { + if (evt.card.name == "sha" && evt.cards && !evt.cards.length) return true; + return false; + }) + ) { list.push(3); } - if(target.hasHistory('custom',evt=>{ - return evt.name=='changeGroup'; - })){ + if ( + target.hasHistory("custom", (evt) => { + return evt.name == "changeGroup"; + }) + ) { list.push(4); } return list; }, - direct:true, - content:function(){ - 'step 0' - var list=[1,2,3,4]; - game.countPlayer(current=>{ - if(current.group!=player.group) return false; - var listx=lib.skill.olgoude.getActed(current); + direct: true, + content: function () { + "step 0"; + var list = [1, 2, 3, 4]; + game.countPlayer((current) => { + if (current.group != player.group) return false; + var listx = lib.skill.olgoude.getActed(current); list.removeArray(listx); }); - var list2=list.slice(); - var nochai=false,nosha=false; - if(!game.hasPlayer(current=>{ - return current.countDiscardableCards(player,'h'); - })){ - nochai=true; + var list2 = list.slice(); + var nochai = false, + nosha = false; + if ( + !game.hasPlayer((current) => { + return current.countDiscardableCards(player, "h"); + }) + ) { + nochai = true; list2.remove(2); } - if(!game.hasPlayer(current=>{ - return player.canUse({name:'sha',isCard:true},current,true,false); - })){ - nosha=true; + if ( + !game.hasPlayer((current) => { + return player.canUse({ name: "sha", isCard: true }, current, true, false); + }) + ) { + nosha = true; list2.remove(3); } - var choices=list2.map(i=>{ - return '选项'+get.cnNumber(i,true); + var choices = list2.map((i) => { + return "选项" + get.cnNumber(i, true); }); - var choiceList=[ - '摸一张牌', - '弃置一名角色的一张手牌', - '视为使用一张【杀】', - '将势力改为任意一个势力' - ].map((text,ind)=>{ - var hint=''; - if(list2.includes(ind+1)){ + var choiceList = [ + "摸一张牌", + "弃置一名角色的一张手牌", + "视为使用一张【杀】", + "将势力改为任意一个势力", + ].map((text, ind) => { + var hint = ""; + if (list2.includes(ind + 1)) { return text; + } else if (!list.includes(ind + 1)) { + hint += "已被执行过且"; } - else if(!list.includes(ind+1)){ - hint+='已被执行过且'; - } - if(ind==1&&nochai&&!list2.includes(ind+1)) hint+='无有手牌角色且'; - if(ind==2&&nosha&&!list2.includes(ind+1)) hint+='无可选目标且'; - hint=hint.slice(0,-1); - return ''+text+'('+hint+')'; + if (ind == 1 && nochai && !list2.includes(ind + 1)) hint += "无有手牌角色且"; + if (ind == 2 && nosha && !list2.includes(ind + 1)) hint += "无可选目标且"; + hint = hint.slice(0, -1); + return '' + text + "(" + hint + ")"; }); - choices.push('cancel2'); - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - player.chooseControl(choices).set('choiceList',choiceList).set('prompt',get.prompt('olgoude')).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - var fn=function(control){ - switch(control){ - case '选项一': - return player.getUseValue({name:'draw'}); - case '选项二': - return Math.max.apply(Math,game.filterPlayer().map(current=>{ - if(current.hasSkillTag('noh')) return -1; - return -1.5*get.attitude(player,current)-Math.max(0,current.countCards('h')-2)/3; - })); - case '选项三': - return player.getUseValue({name:'sha'}); - case '选项四': - var myPopulation=game.countPlayer(current=>{ - return current.group==player.group; - })-1; - var value=Math.max.apply(Math,lib.group.map(group=>{ - return game.countPlayer(current=>{ - return current.group==group&¤t!=player; - })-myPopulation; - })); - return 10*value+0.1*(Math.random()-0.5); - case 'cancel2': - return 0; - } - } - var choicesx=choices.map(choice=>{ - return [choice,fn(choice)]; + choices.push("cancel2"); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - choicesx=choicesx.sort((a,b)=>{ - return b[1]-a[1]; - }); - var choice=choicesx[0]; - if(choice[1]<0) return 'cancel2'; - return choice[0]; - }()); - 'step 1' - if(result.control=='cancel2'){ + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", get.prompt("olgoude")) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var fn = function (control) { + switch (control) { + case "选项一": + return player.getUseValue({ name: "draw" }); + case "选项二": + return Math.max.apply( + Math, + game.filterPlayer().map((current) => { + if (current.hasSkillTag("noh")) return -1; + return ( + -1.5 * get.attitude(player, current) - + Math.max(0, current.countCards("h") - 2) / 3 + ); + }) + ); + case "选项三": + return player.getUseValue({ name: "sha" }); + case "选项四": + var myPopulation = + game.countPlayer((current) => { + return current.group == player.group; + }) - 1; + var value = Math.max.apply( + Math, + lib.group.map((group) => { + return ( + game.countPlayer((current) => { + return ( + current.group == group && current != player + ); + }) - myPopulation + ); + }) + ); + return 10 * value + 0.1 * (Math.random() - 0.5); + case "cancel2": + return 0; + } + }; + var choicesx = choices.map((choice) => { + return [choice, fn(choice)]; + }); + choicesx = choicesx.sort((a, b) => { + return b[1] - a[1]; + }); + var choice = choicesx[0]; + if (choice[1] < 0) return "cancel2"; + return choice[0]; + })() + ); + ("step 1"); + if (result.control == "cancel2") { event.finish(); return; } - var contents={ - 选项一:function(){ - player.logSkill('olgoude'); + var contents = { + 选项一: function () { + player.logSkill("olgoude"); player.draw(); }, - 选项二:function(){ - 'step 0' - player.chooseTarget('苟得:弃置一名角色的一张手牌',true,(card,player,target)=>{ - return target.countDiscardableCards(player,'h'); - }).set('ai',target=>{ - if(target.hasSkillTag('noh')) return 0; - return -get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} - player.logSkill('olgoude',target); - player.discardPlayerCard(target,true,'h'); + 选项二: function () { + "step 0"; + player + .chooseTarget( + "苟得:弃置一名角色的一张手牌", + true, + (card, player, target) => { + return target.countDiscardableCards(player, "h"); + } + ) + .set("ai", (target) => { + if (target.hasSkillTag("noh")) return 0; + return -get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + player.logSkill("olgoude", target); + player.discardPlayerCard(target, true, "h"); } }, - 选项三:function(){ - player.chooseUseTarget('sha',true,false).set('logSkill','olgoude').set('prompt','苟得:选择【杀】的目标'); + 选项三: function () { + player + .chooseUseTarget("sha", true, false) + .set("logSkill", "olgoude") + .set("prompt", "苟得:选择【杀】的目标"); }, - 选项四:function(){ - 'step 0' - var list=lib.group.slice(); - var maxGroup=list.slice().sort((a,b)=>{ - return game.countPlayer(current=>{ - return current.group==b&¤t!=player; - })-game.countPlayer(current=>{ - return current.group==a&¤t!=player; - }); + 选项四: function () { + "step 0"; + var list = lib.group.slice(); + var maxGroup = list.slice().sort((a, b) => { + return ( + game.countPlayer((current) => { + return current.group == b && current != player; + }) - + game.countPlayer((current) => { + return current.group == a && current != player; + }) + ); })[0]; - player.chooseControl(list).set('prompt','苟得:请选择要变更为的势力').set('ai',()=>{ - return _status.event.choice; - }).set('choice',maxGroup); - 'step 1' - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} - var group=result.control; - player.logSkill('olgoude'); + player + .chooseControl(list) + .set("prompt", "苟得:请选择要变更为的势力") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", maxGroup); + ("step 1"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var group = result.control; + player.logSkill("olgoude"); player.changeGroup(group); - player.popup(group+'2',get.groupnature(group,'raw')); + player.popup(group + "2", get.groupnature(group, "raw")); }, - } - var next=game.createEvent('olgoude_'+result.control); - next.player=player; + }; + var next = game.createEvent("olgoude_" + result.control); + next.player = player; next.setContent(contents[result.control]); }, - ai:{ - threaten:3, - effect:{ - player_use:function(card,player,target){ - if(typeof card=='object'&&card.cards&&card.cards.some(card=>{ - return get.position(card)=='h'; - })&&!get.tag(card,'draw')&&!get.tag(card,'gain')&&!get.tag(card,'discard')&& - player==_status.currentPhase&&player.needsToDiscard()==1&&game.countPlayer(current=>{ - return current.group==player.group&¤t!=player; - })<=1&&lib.group.some(group=>{ - return game.countPlayer(current=>{ - return current.group==group&¤t!=player; - })>2; - })) return 'zeroplayertarget'; + ai: { + threaten: 3, + effect: { + player_use: function (card, player, target) { + if ( + typeof card == "object" && + card.cards && + card.cards.some((card) => { + return get.position(card) == "h"; + }) && + !get.tag(card, "draw") && + !get.tag(card, "gain") && + !get.tag(card, "discard") && + player == _status.currentPhase && + player.needsToDiscard() == 1 && + game.countPlayer((current) => { + return current.group == player.group && current != player; + }) <= 1 && + lib.group.some((group) => { + return ( + game.countPlayer((current) => { + return current.group == group && current != player; + }) > 2 + ); + }) + ) + return "zeroplayertarget"; }, }, }, }, //OL新改王朗 - oljici:{ - audio:'jici', - trigger:{ - player:'compare', - target:'compare', + oljici: { + audio: "jici", + trigger: { + player: "compare", + target: "compare", }, - filter:function(event,player){ - if(event.player==player){ - if(event.iwhile) return false; - return event.num1<=player.countMark('gushe'); + filter: function (event, player) { + if (event.player == player) { + if (event.iwhile) return false; + return event.num1 <= player.countMark("gushe"); } - return event.num2<=player.countMark('gushe'); + return event.num2 <= player.countMark("gushe"); }, - content:function(){ - var num=player.countMark('gushe'); - if(player==trigger.player){ - trigger.num1+=num; - if(trigger.num1>13) trigger.num1=13; + content: function () { + var num = player.countMark("gushe"); + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; } - else{ - trigger.num2+=num; - if(trigger.num2>13) trigger.num2=13; - } - game.log(player,'的拼点牌点数+'+num); - var stat=player.getStat().skill; + game.log(player, "的拼点牌点数+" + num); + var stat = player.getStat().skill; delete stat.gushe; - } + }, }, //OL刘老板 - olpianan:{ - audio:2, - trigger:{ - player:['enterGame','phaseDiscardEnd'], - global:'phaseBefore', + olpianan: { + audio: 2, + trigger: { + player: ["enterGame", "phaseDiscardEnd"], + global: "phaseBefore", }, - forced:true, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - var hs=player.getCards('h',card=>{ - return get.name(card)!='shan'&&lib.filter.cardDiscardable(card,player,'olpianan'); + content: function () { + "step 0"; + var hs = player.getCards("h", (card) => { + return ( + get.name(card) != "shan" && lib.filter.cardDiscardable(card, player, "olpianan") + ); }); - if(hs.length) player.discard(hs); - 'step 1' - var num=player.hp-player.countCards('h'); - if(num>0){ - var cards=[]; - for(var i=0;i 0) { + var cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.name == "shan") { cards.add(card); num--; } - if(num==0) break; + if (num == 0) break; } - if(num>0){ - for(var i=0;i 0) { + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i]; + if (card.name == "shan") { cards.add(card); num--; } - if(num==0) break; + if (num == 0) break; } } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); } }, - mod:{ - aiValue:function(player,card,num){ - if(card.name!='shan') return; - if(player==_status.currentPhase) return 0; + mod: { + aiValue: function (player, card, num) { + if (card.name != "shan") return; + if (player == _status.currentPhase) return 0; }, - aiUseful:function(){ - return lib.skill.olpianan.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.olpianan.mod.aiValue.apply(this, arguments); }, }, }, - olyinji:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ + olyinji: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { return !player.isMaxHp(true); }, - content:function(){ - 'step 0' - player.chooseControl('体力','体力上限').set('prompt','殷积:回复1点体力或加1点体力上限').set('ai',()=>{ - var player=_status.event.player; - if(!player.isDamaged()||player.hp>3&&player.getDamagedHp()==1||player.maxHp<3) return 1; - return 0; - }); - 'step 1' - player[result.index==0?'recover':'gainMaxHp'](); - } + content: function () { + "step 0"; + player + .chooseControl("体力", "体力上限") + .set("prompt", "殷积:回复1点体力或加1点体力上限") + .set("ai", () => { + var player = _status.event.player; + if ( + !player.isDamaged() || + (player.hp > 3 && player.getDamagedHp() == 1) || + player.maxHp < 3 + ) + return 1; + return 0; + }); + ("step 1"); + player[result.index == 0 ? "recover" : "gainMaxHp"](); + }, }, - olkuisi:{ - audio:2, - trigger:{player:'phaseDrawBefore'}, - forced:true, - content:function(){ - 'step 0' + olkuisi: { + audio: 2, + trigger: { player: "phaseDrawBefore" }, + forced: true, + content: function () { + "step 0"; trigger.cancel(); - var cards=game.cardsGotoOrdering(get.cards(4)).cards; - event.cards=cards.slice(); - 'step 1' - player.chooseButton(['窥伺:是否使用其中的一张牌?',cards]).set('filterButton',button=>{ - return _status.event.player.hasUseTarget(button.link); - }).set('ai',button=>{ - var player=_status.event.player,card=button.link,cards=_status.event.getParent().cards; - var val=player.getUseValue(card)+0.01; - if(val>0&&cards.length>1||val>4&&cards.length==1&&(player.maxHp>3||player.isDamaged())) return get.order(card)+val/5; - return 0; - }); - 'step 2' - if(result.bool){ - var card=result.links[0]; + var cards = game.cardsGotoOrdering(get.cards(4)).cards; + event.cards = cards.slice(); + ("step 1"); + player + .chooseButton(["窥伺:是否使用其中的一张牌?", cards]) + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget(button.link); + }) + .set("ai", (button) => { + var player = _status.event.player, + card = button.link, + cards = _status.event.getParent().cards; + var val = player.getUseValue(card) + 0.01; + if ( + (val > 0 && cards.length > 1) || + (val > 4 && cards.length == 1 && (player.maxHp > 3 || player.isDamaged())) + ) + return get.order(card) + val / 5; + return 0; + }); + ("step 2"); + if (result.bool) { + var card = result.links[0]; event.cards.remove(card); - player.$gain2(card,false); + player.$gain2(card, false); game.delayx(); - player.chooseUseTarget(true,card,false); - } - else event.goto(4); - 'step 3' - if(cards.some(i=>get.position(i,true)=='o'&&player.hasUseTarget(i))) event.goto(1); - 'step 4' - if(cards.length!=1&&cards.length!=2){ + player.chooseUseTarget(true, card, false); + } else event.goto(4); + ("step 3"); + if (cards.some((i) => get.position(i, true) == "o" && player.hasUseTarget(i))) + event.goto(1); + ("step 4"); + if (cards.length != 1 && cards.length != 2) { player.loseMaxHp(); } - } + }, }, //卢氏 - olzhuyan:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - init:function(player){ - player.addSkill('olzhuyan_record'); + olzhuyan: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + init: function (player) { + player.addSkill("olzhuyan_record"); }, - onremove:['olzhuyan_true','olzhuyan_false'], - direct:true, - filter:function(event,player){ - for(var bool of [true,false]){ - var targeted=player.getStorage('olzhuyan_'+bool); - if(game.hasPlayer(current=>{ - return !targeted.includes(current)&&lib.skill.olzhuyan.getNum(current,bool); - })) return true; + onremove: ["olzhuyan_true", "olzhuyan_false"], + direct: true, + filter: function (event, player) { + for (var bool of [true, false]) { + var targeted = player.getStorage("olzhuyan_" + bool); + if ( + game.hasPlayer((current) => { + return ( + !targeted.includes(current) && lib.skill.olzhuyan.getNum(current, bool) + ); + }) + ) + return true; } return false; }, - getNum:function(player,status){ - if(!_status.olzhuyan||!_status.olzhuyan[player.playerid]) return 0; - var num=_status.olzhuyan[player.playerid][status?1:0]; - if(status){ - num-=player.countCards('h'); - if(num+player.countCards('h')>5) num=5-player.countCards('h'); - } - else{ - num-=player.hp; - if(num+player.hp<1) num=1-player.hp; + getNum: function (player, status) { + if (!_status.olzhuyan || !_status.olzhuyan[player.playerid]) return 0; + var num = _status.olzhuyan[player.playerid][status ? 1 : 0]; + if (status) { + num -= player.countCards("h"); + if (num + player.countCards("h") > 5) num = 5 - player.countCards("h"); + } else { + num -= player.hp; + if (num + player.hp < 1) num = 1 - player.hp; } return num; }, - content:function(){ - 'step 0' - var map={}; - for(var bool of [true,false]){ - var targeted=player.getStorage('olzhuyan_'+bool); - game.countPlayer(current=>{ - if(targeted.includes(current)) return false; - if(!map[current.playerid]) map[current.playerid]=[]; - map[current.playerid][bool?1:0]=lib.skill.olzhuyan.getNum(current,bool); + content: function () { + "step 0"; + var map = {}; + for (var bool of [true, false]) { + var targeted = player.getStorage("olzhuyan_" + bool); + game.countPlayer((current) => { + if (targeted.includes(current)) return false; + if (!map[current.playerid]) map[current.playerid] = []; + map[current.playerid][bool ? 1 : 0] = lib.skill.olzhuyan.getNum(current, bool); }); } - event.map=map; - player.chooseTarget(get.prompt('olzhuyan'),'令一名角色将{体力值/手牌数}调整至与其上个准备阶段相同(“--”表示已对其发动过该分支)',(card,player,target)=>{ - var list=_status.event.map[target.playerid]; - return list&&(list[0]||list[1]); - }).set('map',map).set('targetprompt',target=>{ - var list=_status.event.map[target.playerid]; - var str=''; - for(var i=0;i<2;i++){ - if(list[i]===undefined) str+='--'; - else{ - str+=(list[i]>0?'+':'')+list[i]; + event.map = map; + player + .chooseTarget( + get.prompt("olzhuyan"), + "令一名角色将{体力值/手牌数}调整至与其上个准备阶段相同(“--”表示已对其发动过该分支)", + (card, player, target) => { + var list = _status.event.map[target.playerid]; + return list && (list[0] || list[1]); } - str+='/'; - } - return str.slice(0,-1); - }).set('ai',target=>{ - var list=_status.event.map[target.playerid]; - var att=get.attitude(_status.event.player,target); - var v1=list[0],v2=get.sgn(list[1])*Math.sqrt(Math.abs(list[1])); - return Math[att>0?'max':'min'](v1,v2)*att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('olzhuyan',target); - event.target=target; - var list=event.map[target.playerid]; - var choices=['体力值','手牌数']; - if(list[0]&&list[1]){ - player.chooseControl(choices).set('choiceList',[ - '令'+get.translation(target)+(list[0]>0?'回复':'失去')+Math.abs(list[0])+'点体力'+(list[0]<0?'(至多失去至1)':''), - '令'+get.translation(target)+(list[1]>0?'摸':'弃置')+get.cnNumber(Math.abs(list[1]))+'张'+(list[1]>0?'':'手')+'牌'+(list[1]>0?'(至多摸至5)':''), - ]).set('prompt','驻颜:请选择一项').set('ai',()=>_status.event.choice).set('choice',function(){ - var v1=list[0],v2=get.sgn(list[1])*Math.sqrt(Math.abs(list[1])); - if(get.attitude(player,target)>0){ - return v1>v2?0:1; + ) + .set("map", map) + .set("targetprompt", (target) => { + var list = _status.event.map[target.playerid]; + var str = ""; + for (var i = 0; i < 2; i++) { + if (list[i] === undefined) str += "--"; + else { + str += (list[i] > 0 ? "+" : "") + list[i]; } - return v1>v2?1:0; - }()); + str += "/"; + } + return str.slice(0, -1); + }) + .set("ai", (target) => { + var list = _status.event.map[target.playerid]; + var att = get.attitude(_status.event.player, target); + var v1 = list[0], + v2 = get.sgn(list[1]) * Math.sqrt(Math.abs(list[1])); + return Math[att > 0 ? "max" : "min"](v1, v2) * att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olzhuyan", target); + event.target = target; + var list = event.map[target.playerid]; + var choices = ["体力值", "手牌数"]; + if (list[0] && list[1]) { + player + .chooseControl(choices) + .set("choiceList", [ + "令" + + get.translation(target) + + (list[0] > 0 ? "回复" : "失去") + + Math.abs(list[0]) + + "点体力" + + (list[0] < 0 ? "(至多失去至1)" : ""), + "令" + + get.translation(target) + + (list[1] > 0 ? "摸" : "弃置") + + get.cnNumber(Math.abs(list[1])) + + "张" + + (list[1] > 0 ? "" : "手") + + "牌" + + (list[1] > 0 ? "(至多摸至5)" : ""), + ]) + .set("prompt", "驻颜:请选择一项") + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var v1 = list[0], + v2 = get.sgn(list[1]) * Math.sqrt(Math.abs(list[1])); + if (get.attitude(player, target) > 0) { + return v1 > v2 ? 0 : 1; + } + return v1 > v2 ? 1 : 0; + })() + ); + } else { + event._result = { index: list[0] ? 0 : 1 }; } - else{ - event._result={index:list[0]?0:1}; - } - } - else event.finish(); - 'step 2' - var ind=result.index; - player.markAuto('olzhuyan_'+Boolean(ind),[target]); - var num=event.map[target.playerid][ind]; - if(ind==0){ - if(num>0){ + } else event.finish(); + ("step 2"); + var ind = result.index; + player.markAuto("olzhuyan_" + Boolean(ind), [target]); + var num = event.map[target.playerid][ind]; + if (ind == 0) { + if (num > 0) { target.recover(num); - } - else{ - num=Math.min(target.hp-1,-num); + } else { + num = Math.min(target.hp - 1, -num); target.loseHp(num); } - } - else{ - if(num>0){ - num=Math.min(5-target.countCards('h'),num); - if(num>0) target.draw(num); - } - else{ - num=-num; - target.chooseToDiscard(num,true).set('prompt','驻颜:请弃置'+get.cnNumber(Math.abs(num))+'张手牌'); + } else { + if (num > 0) { + num = Math.min(5 - target.countCards("h"), num); + if (num > 0) target.draw(num); + } else { + num = -num; + target + .chooseToDiscard(num, true) + .set("prompt", "驻颜:请弃置" + get.cnNumber(Math.abs(num)) + "张手牌"); } } }, - subSkill:{ - record:{ - trigger:{ - global:['phaseJieshuAfter','phaseBefore','enterGame'], + subSkill: { + record: { + trigger: { + global: ["phaseJieshuAfter", "phaseBefore", "enterGame"], }, - lastDo:true, - charlotte:true, - forced:true, - popup:false, - forceDie:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + lastDo: true, + charlotte: true, + forced: true, + popup: false, + forceDie: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - if(!_status.olzhuyan) _status.olzhuyan={}; - if(event.triggername=='phaseBefore'){ - game.countPlayer(current=>{ - _status.olzhuyan[current.playerid]=[current.hp,current.countCards('h')]; - }) - } - else{ - _status.olzhuyan[trigger.player.playerid]=[trigger.player.hp,trigger.player.countCards('h')]; + content: function () { + if (!_status.olzhuyan) _status.olzhuyan = {}; + if (event.triggername == "phaseBefore") { + game.countPlayer((current) => { + _status.olzhuyan[current.playerid] = [ + current.hp, + current.countCards("h"), + ]; + }); + } else { + _status.olzhuyan[trigger.player.playerid] = [ + trigger.player.hp, + trigger.player.countCards("h"), + ]; } }, - } - } - }, - olleijie:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('olleijie'),'令一名角色判定。若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。').set('ai',target=>{ - var player=_status.event.player,sgn=_status.event.sgn; - if(sgn>0){ - return get.damageEffect(target,target,player,'thunder'); - } - else if(sgn==0){ - return get.attitude(player,target); - } - return 0; - }).set('sgn',function(){ - var sgn=0; - game.countPlayer(current=>{ - if(!current.hasSkillTag('rejudge')) return; - sgn=get.sgnAttitude(player,current); - }); - return sgn; - }()) - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('olleijie',target); - target.judge(card=>{ - var number=get.number(card); - if(get.suit(card)=='spade'&&number>=2&&number<=9) return -4; - return 2; - }).set('judge2',result=>{ - return result.bool===false?true:false; - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - target.draw(2); - } - else{ - target.damage(2,'thunder'); - } - } - }, - releijie:{ - audio:'olleijie', - enable:'phaseUse', - filterTarget:true, - usable:1, - async content(event,trigger,player){ - const target=event.target,result=await target.judge(card=>{ - var number=get.number(card); - if(get.suit(card)=='spade'&&number>=2&&number<=9) return -4; - return 2; - }).set('judge2',result=>{ - return result.bool===false?true:false; - }).forResult(); - if(result.bool) await target.draw(2); - else{ - const card=new lib.element.VCard({name:'sha',nature:'thunder'}); - if(player.canUse(card,target,false)){ - for(let i=1;i<=2;i++){ - await player.useCard(card,target,false); - } - } - } + }, }, - ai:{ - order:1, - result:{ - target(player,target){ - let sgn=0,eff=0,num=get.attitude(player,target); - const card=new lib.element.VCard({name:'sha',nature:'thunder'}); - game.countPlayer(current=>{ - if(!current.hasSkillTag('rejudge')) return; - sgn=get.sgnAttitude(player,current); + }, + olleijie: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("olleijie"), + "令一名角色判定。若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。" + ) + .set("ai", (target) => { + var player = _status.event.player, + sgn = _status.event.sgn; + if (sgn > 0) { + return get.damageEffect(target, target, player, "thunder"); + } else if (sgn == 0) { + return get.attitude(player, target); + } + return 0; + }) + .set( + "sgn", + (function () { + var sgn = 0; + game.countPlayer((current) => { + if (!current.hasSkillTag("rejudge")) return; + sgn = get.sgnAttitude(player, current); + }); + return sgn; + })() + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olleijie", target); + target + .judge((card) => { + var number = get.number(card); + if (get.suit(card) == "spade" && number >= 2 && number <= 9) return -4; + return 2; + }) + .set("judge2", (result) => { + return result.bool === false ? true : false; }); - if(sgn>0&&player.canUse(card,target,false)){ - eff+=get.effect(target,card,player,player)*2; - return eff*get.sgn(num); + } else event.finish(); + ("step 2"); + if (result.bool) { + target.draw(2); + } else { + target.damage(2, "thunder"); + } + }, + }, + releijie: { + audio: "olleijie", + enable: "phaseUse", + filterTarget: true, + usable: 1, + async content(event, trigger, player) { + const target = event.target, + result = await target + .judge((card) => { + var number = get.number(card); + if (get.suit(card) == "spade" && number >= 2 && number <= 9) return -4; + return 2; + }) + .set("judge2", (result) => { + return result.bool === false ? true : false; + }) + .forResult(); + if (result.bool) await target.draw(2); + else { + const card = new lib.element.VCard({ name: "sha", nature: "thunder" }); + if (player.canUse(card, target, false)) { + for (let i = 1; i <= 2; i++) { + await player.useCard(card, target, false); } - else if(sgn==0) return num*get.sgn(num); + } + } + }, + ai: { + order: 1, + result: { + target(player, target) { + let sgn = 0, + eff = 0, + num = get.attitude(player, target); + const card = new lib.element.VCard({ name: "sha", nature: "thunder" }); + game.countPlayer((current) => { + if (!current.hasSkillTag("rejudge")) return; + sgn = get.sgnAttitude(player, current); + }); + if (sgn > 0 && player.canUse(card, target, false)) { + eff += get.effect(target, card, player, player) * 2; + return eff * get.sgn(num); + } else if (sgn == 0) return num * get.sgn(num); return 0; }, }, }, }, //张世平 - olhongji:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - filter:function(event,player){ - if(event.player.isMinHandcard()&&!player.hasSkill('olhongji_min')) return true; - if(event.player.isMaxHandcard()&&!player.hasSkill('olhongji_max')) return true; + olhongji: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (event.player.isMinHandcard() && !player.hasSkill("olhongji_min")) return true; + if (event.player.isMaxHandcard() && !player.hasSkill("olhongji_max")) return true; return false; }, - direct:true, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - var bool1=target.isMinHandcard()&&!player.hasSkill('olhongji_min'),str1='其手牌数为全场最少。你可以令其于本回合摸牌阶段结束后执行一个额外的摸牌阶段,然后本轮你不能再发动该分支。'; - var bool2=target.isMaxHandcard()&&!player.hasSkill('olhongji_max'),str2='其手牌数为全场最多。你可以令其于本回合出牌阶段结束后执行一个额外的出牌阶段,然后本轮你不能再发动该分支。'; - if(bool1&&!bool2){ - event.branch=0; - player.chooseBool(get.prompt('olhongji',target),str1).set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.attitude(player,trigger.player)>1); + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var bool1 = target.isMinHandcard() && !player.hasSkill("olhongji_min"), + str1 = + "其手牌数为全场最少。你可以令其于本回合摸牌阶段结束后执行一个额外的摸牌阶段,然后本轮你不能再发动该分支。"; + var bool2 = target.isMaxHandcard() && !player.hasSkill("olhongji_max"), + str2 = + "其手牌数为全场最多。你可以令其于本回合出牌阶段结束后执行一个额外的出牌阶段,然后本轮你不能再发动该分支。"; + if (bool1 && !bool2) { + event.branch = 0; + player + .chooseBool(get.prompt("olhongji", target), str1) + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.attitude(player, trigger.player) > 1); + } else if (!bool1 && bool2) { + event.branch = 1; + player + .chooseBool(get.prompt("olhongji", target), str2) + .set("ai", () => { + return _status.event.bool; + }) + .set("bool", get.attitude(player, trigger.player) > 1); + } else if (bool1 && bool2) { + player + .chooseControl("摸牌阶段", "出牌阶段", "cancel2") + .set("prompt", get.prompt("olhongji", target)) + .set("choiceList", [str1.slice(13), str2.slice(13)]) + .set("ai", () => _status.event.bool) + .set("bool", () => + get.attitude(player, trigger.player) > 1 ? [0, 1].randomGet() : "cancel2" + ); } - else if(!bool1&&bool2){ - event.branch=1; - player.chooseBool(get.prompt('olhongji',target),str2).set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.attitude(player,trigger.player)>1); - } - else if(bool1&&bool2){ - player.chooseControl('摸牌阶段','出牌阶段','cancel2').set('prompt',get.prompt('olhongji',target)).set('choiceList',[ - str1.slice(13), - str2.slice(13) - ]).set('ai',()=>_status.event.bool).set('bool',()=>get.attitude(player,trigger.player)>1?[0,1].randomGet():'cancel2'); - } - 'step 1' - var choice=-1; - if(event.branch==0&&result.bool||result.control=='摸牌阶段') choice=0; - if(event.branch==1&&result.bool||result.control=='出牌阶段') choice=1; - if(choice==0){ - player.logSkill('olhongji',target); - player.addTempSkill('olhongji_min','roundStart'); - target.addTempSkill('olhongji_draw'); - } - else if(choice==1){ - player.logSkill('olhongji',target); - player.addTempSkill('olhongji_max','roundStart'); - target.addTempSkill('olhongji_use'); + ("step 1"); + var choice = -1; + if ((event.branch == 0 && result.bool) || result.control == "摸牌阶段") choice = 0; + if ((event.branch == 1 && result.bool) || result.control == "出牌阶段") choice = 1; + if (choice == 0) { + player.logSkill("olhongji", target); + player.addTempSkill("olhongji_min", "roundStart"); + target.addTempSkill("olhongji_draw"); + } else if (choice == 1) { + player.logSkill("olhongji", target); + player.addTempSkill("olhongji_max", "roundStart"); + target.addTempSkill("olhongji_use"); } }, - ai:{expose:0.25}, - subSkill:{ - min:{charlotte:true}, - max:{charlotte:true}, - draw:{ - trigger:{player:'phaseDrawAfter'}, - charlotte:true, - forced:true, - popup:false, - content:function(){ - var next=trigger.player.phaseDraw(); + ai: { expose: 0.25 }, + subSkill: { + min: { charlotte: true }, + max: { charlotte: true }, + draw: { + trigger: { player: "phaseDrawAfter" }, + charlotte: true, + forced: true, + popup: false, + content: function () { + var next = trigger.player.phaseDraw(); event.next.remove(next); - trigger.getParent('phase').next.push(next); - player.removeSkill('olhongji_draw'); - } + trigger.getParent("phase").next.push(next); + player.removeSkill("olhongji_draw"); + }, }, - use:{ - trigger:{player:'phaseUseAfter'}, - charlotte:true, - forced:true, - popup:false, - content:function(){ - var next=trigger.player.phaseUse(); + use: { + trigger: { player: "phaseUseAfter" }, + charlotte: true, + forced: true, + popup: false, + content: function () { + var next = trigger.player.phaseUse(); event.next.remove(next); - trigger.getParent('phase').next.push(next); - player.removeSkill('olhongji_use'); - } - } - } + trigger.getParent("phase").next.push(next); + player.removeSkill("olhongji_use"); + }, + }, + }, }, - olxinggu:{ - audio:2, - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + olxinggu: { + audio: 2, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'olxinggu_trade', - content:function(){ - 'step 0' - var cards=[]; - for(var i=0;i<3;i++){ - var card=get.cardPile2(function(card){ - if(cards.includes(card)) return false; - var type=get.subtype(card); - return type=='equip3'||type=='equip4'||type=='equip6'; + group: "olxinggu_trade", + content: function () { + "step 0"; + var cards = []; + for (var i = 0; i < 3; i++) { + var card = get.cardPile2(function (card) { + if (cards.includes(card)) return false; + var type = get.subtype(card); + return type == "equip3" || type == "equip4" || type == "equip6"; }); - if(card) cards.add(card); + if (card) cards.add(card); else break; } - if(cards.length) player.addToExpansion(cards,'draw').gaintag.add('olxinggu'); + if (cards.length) player.addToExpansion(cards, "draw").gaintag.add("olxinggu"); }, - marktext:'贾', - intro:{ - markcount:'expansion', - mark:function(dialog,content,player){ - var content=player.getExpansions('olxinggu'); - if(content&&content.length){ - if(player==game.me||player.isUnderControl()){ + marktext: "贾", + intro: { + markcount: "expansion", + mark: function (dialog, content, player) { + var content = player.getExpansions("olxinggu"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { dialog.addAuto(content); - } - else{ - return '剩余'+get.cnNumber(content.length)+'匹马'; + } else { + return "剩余" + get.cnNumber(content.length) + "匹马"; } } - } + }, }, - subSkill:{ - trade:{ - audio:'olxinggu', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.getExpansions('olxinggu').length; + subSkill: { + trade: { + audio: "olxinggu", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getExpansions("olxinggu").length; }, - direct:true, - content:function(){ - 'step 0' - var cards=player.getExpansions('olxinggu'); - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - player.chooseButton([get.prompt('olxinggu'),cards]).set('ai',button=>{ - if(_status.event.toChoose==button.link) return 1; - return 0; - }).set('toChoose',!event.aiCancel&&cards.find(card=>{ - return game.hasPlayer(current=>{ - if(!lib.skill.zhijian.filterTarget(card,player,current)) return false; - return get.effect(current,card,player,player)>0; + direct: true, + content: function () { + "step 0"; + var cards = player.getExpansions("olxinggu"); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - })); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget('将'+get.translation(card)+'置入一名其他角色的装备区',lib.skill.zhijian.filterTarget).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',card); - } - else{ - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} + player + .chooseButton([get.prompt("olxinggu"), cards]) + .set("ai", (button) => { + if (_status.event.toChoose == button.link) return 1; + return 0; + }) + .set( + "toChoose", + !event.aiCancel && + cards.find((card) => { + return game.hasPlayer((current) => { + if (!lib.skill.zhijian.filterTarget(card, player, current)) + return false; + return get.effect(current, card, player, player) > 0; + }); + }) + ); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget( + "将" + get.translation(card) + "置入一名其他角色的装备区", + lib.skill.zhijian.filterTarget + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", card); + } else { + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } event.finish(); } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} - player.logSkill('olxinggu',target); - player.$give(card,target,false); - } - else{ - if(!event.isMine()&&!event.isOnline()) event.aiCancel=true; + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + player.logSkill("olxinggu", target); + player.$give(card, target, false); + } else { + if (!event.isMine() && !event.isOnline()) event.aiCancel = true; event.goto(0); } - 'step 3' + ("step 3"); target.equip(card); - 'step 4' - var card=get.cardPile2(cardx=>{ - return get.suit(cardx)=='diamond'; + ("step 4"); + var card = get.cardPile2((cardx) => { + return get.suit(cardx) == "diamond"; }); - if(card) player.gain(card,'gain2'); - else{ - game.log('但是牌堆中并没有♦牌了!'); - player.chat('做了个亏本买卖…'); + if (card) player.gain(card, "gain2"); + else { + game.log("但是牌堆中并没有♦牌了!"); + player.chat("做了个亏本买卖…"); } - } - } - } + }, + }, + }, }, //孙弘 - olxianbi:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return !player.getStorage('olzenrun').includes(target)&&target.countCards('e')!=player.countCards('h'); + olxianbi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return ( + !player.getStorage("olzenrun").includes(target) && + target.countCards("e") != player.countCards("h") + ); }, - content:function(){ - 'step 0' - var del=target.countCards('e')-player.countCards('h'); - if(del==0) event.finish(); - else if(del>0){ - player.draw(Math.min(5,del)); - } - else{ - player.chooseToDiscard('险诐:弃置'+get.cnNumber(-del)+'张手牌',-del,'h',true); - player.addTempSkill('olxianbi_gain'); + content: function () { + "step 0"; + var del = target.countCards("e") - player.countCards("h"); + if (del == 0) event.finish(); + else if (del > 0) { + player.draw(Math.min(5, del)); + } else { + player.chooseToDiscard("险诐:弃置" + get.cnNumber(-del) + "张手牌", -del, "h", true); + player.addTempSkill("olxianbi_gain"); } }, - ai:{ - order:5, - result:{ - player:function(player,target){ - return player.countCards('h',card=>{ - return get.value(card)>6; - })>=target.countCards('e')?0:1; - } - } - }, - subSkill:{ - gain:{ - trigger:{ - player:'loseAfter', + ai: { + order: 5, + result: { + player: function (player, target) { + return player.countCards("h", (card) => { + return get.value(card) > 6; + }) >= target.countCards("e") + ? 0 + : 1; }, - filter:function(event,player){ - return event.getParent(3).name=='olxianbi'; + }, + }, + subSkill: { + gain: { + trigger: { + player: "loseAfter", }, - forced:true, - charlotte:true, - popup:false, - content:function(){ - var cards=[],cards2=trigger.cards; - for(var cardx of cards2){ - var type=get.type2(cardx,player); - var card=get.discardPile(function(card){ - return get.type(card,false)==type&&!cards2.includes(card)&&!cards.includes(card); + filter: function (event, player) { + return event.getParent(3).name == "olxianbi"; + }, + forced: true, + charlotte: true, + popup: false, + content: function () { + var cards = [], + cards2 = trigger.cards; + for (var cardx of cards2) { + var type = get.type2(cardx, player); + var card = get.discardPile(function (card) { + return ( + get.type(card, false) == type && + !cards2.includes(card) && + !cards.includes(card) + ); }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); - } - } - } - }, - olzenrun:{ - audio:2, - trigger:{player:'drawBefore'}, - filter:function(event,player){ - return !player.hasSkill('olzenrun_used')&&game.hasPlayer(current=>{ - return !player.getStorage('olzenrun').includes(current)&¤t!=player&¤t.hasCard(function(card){ - return lib.filter.canBeGained(card,player,current); - },'he') - }); + if (cards.length) player.gain(cards, "gain2"); + }, + }, }, - direct:true, - check:function(event,player){ + }, + olzenrun: { + audio: 2, + trigger: { player: "drawBefore" }, + filter: function (event, player) { + return ( + !player.hasSkill("olzenrun_used") && + game.hasPlayer((current) => { + return ( + !player.getStorage("olzenrun").includes(current) && + current != player && + current.hasCard(function (card) { + return lib.filter.canBeGained(card, player, current); + }, "he") + ); + }) + ); + }, + direct: true, + check: function (event, player) { return true; }, - content:function(){ - 'step 0' - var num=trigger.num; - player.chooseTarget(get.prompt('olzenrun'),'改为获得一名其他角色'+get.cnNumber(num)+'张牌',(card,player,target)=>{ - return !player.getStorage('olzenrun').includes(target)&&target!=player&&target.hasCard(function(card){ - return lib.filter.canBeGained(card,player,target); - },'he') - }).set('ai',target=>{ - return get.attitude(_status.event.player,target)/5+Math.random()+2.5; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('olzenrun',target); - player.addTempSkill('olzenrun_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); + content: function () { + "step 0"; + var num = trigger.num; + player + .chooseTarget( + get.prompt("olzenrun"), + "改为获得一名其他角色" + get.cnNumber(num) + "张牌", + (card, player, target) => { + return ( + !player.getStorage("olzenrun").includes(target) && + target != player && + target.hasCard(function (card) { + return lib.filter.canBeGained(card, player, target); + }, "he") + ); + } + ) + .set("ai", (target) => { + return get.attitude(_status.event.player, target) / 5 + Math.random() + 2.5; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olzenrun", target); + player.addTempSkill("olzenrun_used", [ + "phaseZhunbeiAfter", + "phaseJudgeAfter", + "phaseDrawAfter", + "phaseUseAfter", + "phaseDiscardAfter", + "phaseJieshuAfter", + ]); trigger.cancel(); - player.gainPlayerCard(target,trigger.num,'he',true); + player.gainPlayerCard(target, trigger.num, "he", true); } - 'step 2' - if(result.bool){ - var cards=result.cards; - var num=cards.length; - event.num=num; - target.chooseControl().set('choiceList',[ - '摸'+get.cnNumber(num)+'张牌', - '令其不能再对你发动〖险诐〗和〖谮润〗' - ]).set('prompt',get.translation(player)+'对你发动了【谮润】,请选择一项').set('ai',()=>{ - if(_status.event.bool) return 0; - return 1; - }).set('bool',get.attitude(target,player)>0||num==1&&Math.random()<0.5||num>=2); - } - else event.finish(); - 'step 3' - game.log(target,'选择了','#y'+result.control); - if(result.index==0){ + ("step 2"); + if (result.bool) { + var cards = result.cards; + var num = cards.length; + event.num = num; + target + .chooseControl() + .set("choiceList", [ + "摸" + get.cnNumber(num) + "张牌", + "令其不能再对你发动〖险诐〗和〖谮润〗", + ]) + .set("prompt", get.translation(player) + "对你发动了【谮润】,请选择一项") + .set("ai", () => { + if (_status.event.bool) return 0; + return 1; + }) + .set( + "bool", + get.attitude(target, player) > 0 || + (num == 1 && Math.random() < 0.5) || + num >= 2 + ); + } else event.finish(); + ("step 3"); + game.log(target, "选择了", "#y" + result.control); + if (result.index == 0) { target.draw(num); - } - else{ - player.markAuto('olzenrun',[target]); + } else { + player.markAuto("olzenrun", [target]); } }, - subSkill:{ - used:{ - charlotte:true, - } - } + subSkill: { + used: { + charlotte: true, + }, + }, }, //罗宪 - oldaili:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return player.countCards('h',card=>{ - return card.hasGaintag('oldaili_tag'); - })%2==0; + oldaili: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return ( + player.countCards("h", (card) => { + return card.hasGaintag("oldaili_tag"); + }) % + 2 == + 0 + ); }, - group:'oldaili_record', - locked:false, - check:function(event,player){ - if(get.distance(event.player,player,'absolute')==1&&!player.isTurnedOver()) return false; + group: "oldaili_record", + locked: false, + check: function (event, player) { + if (get.distance(event.player, player, "absolute") == 1 && !player.isTurnedOver()) + return false; return true; }, - content:function(){ + content: function () { player.turnOver(); - player.draw(3,'visible').gaintag=['oldaili_tag']; + player.draw(3, "visible").gaintag = ["oldaili_tag"]; }, - mod:{ - aiValue:function(player,card,num){ - if(num < 0 ||get.itemtype(card) != 'card' || !card.hasGaintag('oldaili_tag')) return; - if(get.distance(_status.currentPhase, player, 'absolute') == 1 && !player.isTurnedOver()) return; - let dai = player.countCards('h', (card) => { - return card.hasGaintag('oldaili_tag'); + mod: { + aiValue: function (player, card, num) { + if (num < 0 || get.itemtype(card) != "card" || !card.hasGaintag("oldaili_tag")) + return; + if ( + get.distance(_status.currentPhase, player, "absolute") == 1 && + !player.isTurnedOver() + ) + return; + let dai = player.countCards("h", (card) => { + return card.hasGaintag("oldaili_tag"); }); - if(ui.selected.cards && ui.selected.cards.length) dai += ui.selected.cards.filter((card) => { - return card.hasGaintag('oldaili_tag'); - }).length; - if(dai % 2) return Math.sqrt(num); + if (ui.selected.cards && ui.selected.cards.length) + dai += ui.selected.cards.filter((card) => { + return card.hasGaintag("oldaili_tag"); + }).length; + if (dai % 2) return Math.sqrt(num); return num + 6; }, - aiUseful:function(){ - return lib.skill.oldaili.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.oldaili.mod.aiValue.apply(this, arguments); }, }, - mark:true, - marktext:'砺', - intro:{ - markcount:function(storage,player){ - return player.countCards('h',card=>card.hasGaintag('oldaili_tag')); + mark: true, + marktext: "砺", + intro: { + markcount: function (storage, player) { + return player.countCards("h", (card) => card.hasGaintag("oldaili_tag")); }, - mark:function(dialog,content,player){ - var cards=player.getCards('h',card=>card.hasGaintag('oldaili_tag')); - if(cards.length){ + mark: function (dialog, content, player) { + var cards = player.getCards("h", (card) => card.hasGaintag("oldaili_tag")); + if (cards.length) { dialog.addAuto(cards); - } - else return '无展示牌'; + } else return "无展示牌"; }, }, - subSkill:{ - record:{ - trigger:{global:'showCardsEnd'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - filter:function(event,player){ - return event.cards.some(i=>get.owner(i)==player); + subSkill: { + record: { + trigger: { global: "showCardsEnd" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.cards.some((i) => get.owner(i) == player); + }, + content: function () { + game.broadcastAll( + function (cards) { + cards.forEach((card) => card.addGaintag("oldaili_tag")); + }, + trigger.cards.filter((i) => get.owner(i) == player) + ); + player.markSkill("oldaili"); }, - content:function(){ - game.broadcastAll(function(cards){ - cards.forEach(card=>card.addGaintag('oldaili_tag')); - },trigger.cards.filter(i=>get.owner(i)==player)); - player.markSkill('oldaili'); - } }, - } + }, }, //胡班 - olhuiyun:{ - audio:2, - enable:'phaseUse', - viewAs:{ - name:'huogong', - storage:{olhuiyun:true}, + olhuiyun: { + audio: 2, + enable: "phaseUse", + viewAs: { + name: "huogong", + storage: { olhuiyun: true }, }, - filterCard:true, - position:'hes', - onuse:function(links,player){ - player.addTempSkill('olhuiyun_after'); - player.addTempSkill('olhuiyun_record'); + filterCard: true, + position: "hes", + onuse: function (links, player) { + player.addTempSkill("olhuiyun_after"); + player.addTempSkill("olhuiyun_record"); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(get.attitude(player,target)>0&&card&&card.name=='huogong'&&card.storage&&card.storage.olhuiyun&&!player.hasSkill('olhuiyun_3')) return [0,0.5,0,0.5]; - } - } - }, - subSkill:{ - after:{ - audio:'olhuiyun', - trigger:{global:'useCardAfter'}, - charlotte:true, - forced:true, - direct:true, - filter:function(event,player){ - return event.card.name=='huogong'&&event.card.storage&&event.card.storage.olhuiyun&&event.targets.some(i=>i.isIn()); + ai: { + effect: { + player: function (card, player, target) { + if ( + get.attitude(player, target) > 0 && + card && + card.name == "huogong" && + card.storage && + card.storage.olhuiyun && + !player.hasSkill("olhuiyun_3") + ) + return [0, 0.5, 0, 0.5]; }, - content:function(){ - 'step 0' - var choices=[]; - var choiceList=[ - '使用展示牌,然后重铸所有手牌', - '使用一张手牌,然后重铸展示牌', - '摸一张牌' + }, + }, + subSkill: { + after: { + audio: "olhuiyun", + trigger: { global: "useCardAfter" }, + charlotte: true, + forced: true, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "huogong" && + event.card.storage && + event.card.storage.olhuiyun && + event.targets.some((i) => i.isIn()) + ); + }, + content: function () { + "step 0"; + var choices = []; + var choiceList = [ + "使用展示牌,然后重铸所有手牌", + "使用一张手牌,然后重铸展示牌", + "摸一张牌", ]; - for(var i=1;i<=3;i++){ - if(!player.hasSkill('olhuiyun_'+i)) choices.push('选项'+get.cnNumber(i,true)); - else choiceList[i-1]=''+choiceList[i-1]+''; + for (var i = 1; i <= 3; i++) { + if (!player.hasSkill("olhuiyun_" + i)) + choices.push("选项" + get.cnNumber(i, true)); + else + choiceList[i - 1] = + '' + choiceList[i - 1] + ""; } - if(!choices.length) event.finish(); - else{ - player.logSkill('olhuiyun_after'); - player.chooseControl(choices).set('choiceList',choiceList).set('prompt','晖云:选择一项,令'+get.translation(trigger.targets)+'可以选择执行').set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(choices.length==1) return choices[0]; - var choicesx=choices.slice(); - if(get.attitude(player,trigger.targets[0])>0&&choices.includes('选项三')) return '选项三'; - choicesx.remove('选项三'); - return choicesx.randomGet(); - }()); + if (!choices.length) event.finish(); + else { + player.logSkill("olhuiyun_after"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set( + "prompt", + "晖云:选择一项,令" + + get.translation(trigger.targets) + + "可以选择执行" + ) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (choices.length == 1) return choices[0]; + var choicesx = choices.slice(); + if ( + get.attitude(player, trigger.targets[0]) > 0 && + choices.includes("选项三") + ) + return "选项三"; + choicesx.remove("选项三"); + return choicesx.randomGet(); + })() + ); } - 'step 1' - if(result.control!='cancel2'){ - var index=['选项一','选项二','选项三'].indexOf(result.control)+1; - event.index=index; - game.log(player,'选择了','#y'+result.control); - player.addTempSkill('olhuiyun_'+index,'roundStart'); - event.targets=trigger.targets.slice(0); - } - else event.finish(); - 'step 2' - var target=targets.shift(); - event.target=target; - if(target.isIn()){ - var cards=target.getCards('h',card=>card.hasGaintag('olhuiyun_tag')); - if(event.index==3){ - target.chooseBool('是否摸一张牌?').set('ai',()=>true); + ("step 1"); + if (result.control != "cancel2") { + var index = ["选项一", "选项二", "选项三"].indexOf(result.control) + 1; + event.index = index; + game.log(player, "选择了", "#y" + result.control); + player.addTempSkill("olhuiyun_" + index, "roundStart"); + event.targets = trigger.targets.slice(0); + } else event.finish(); + ("step 2"); + var target = targets.shift(); + event.target = target; + if (target.isIn()) { + var cards = target.getCards("h", (card) => card.hasGaintag("olhuiyun_tag")); + if (event.index == 3) { + target.chooseBool("是否摸一张牌?").set("ai", () => true); event.goto(5); - } - else if(event.index==1&&cards.length){ + } else if (event.index == 1 && cards.length) { target.chooseToUse({ - filterCard:function(card){ - if(get.itemtype(card)!='card'||!card.hasGaintag('olhuiyun_tag')) return false; - return lib.filter.filterCard.apply(this,arguments); + filterCard: function (card) { + if ( + get.itemtype(card) != "card" || + !card.hasGaintag("olhuiyun_tag") + ) + return false; + return lib.filter.filterCard.apply(this, arguments); }, - prompt:'是否使用一张展示牌,然后重铸所有手牌?' + prompt: "是否使用一张展示牌,然后重铸所有手牌?", }); - } - else if(event.index==2){ + } else if (event.index == 2) { target.chooseToUse({ - filterCard:function(card){ - if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; - return lib.filter.filterCard.apply(this,arguments); + filterCard: function (card) { + if ( + get.itemtype(card) != "card" || + (get.position(card) != "h" && get.position(card) != "s") + ) + return false; + return lib.filter.filterCard.apply(this, arguments); }, - prompt:'是否使用一张手牌,然后重铸展示牌?' + prompt: "是否使用一张手牌,然后重铸展示牌?", }); event.goto(4); - } - else event.goto(6); - } - else event.goto(6); - 'step 3' - if(result.bool){ - var hs=target.getCards('h',lib.filter.cardRecastable); - if(hs.length){ + } else event.goto(6); + } else event.goto(6); + ("step 3"); + if (result.bool) { + var hs = target.getCards("h", lib.filter.cardRecastable); + if (hs.length) { target.recast(hs); } } event.goto(6); - 'step 4' - if(result.bool){ - var hs=target.getCards('h',card=>{ - if(!card.hasGaintag('olhuiyun_tag')) return false; + ("step 4"); + if (result.bool) { + var hs = target.getCards("h", (card) => { + if (!card.hasGaintag("olhuiyun_tag")) return false; return target.canRecast(card); }); - if(hs.length){ + if (hs.length) { target.recast(hs); } } event.goto(6); - 'step 5' - if(result.bool){ + ("step 5"); + if (result.bool) { target.draw(); } - 'step 6' - if(targets.length) event.goto(2); - } + ("step 6"); + if (targets.length) event.goto(2); + }, }, - record:{ - trigger:{global:'showCardsEnd'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - filter:function(event,player){ - if(event.getParent().name!='huogong') return false; - var card=event.getParent(2).card; - if(card&&card.storage&&card.storage.olhuiyun) return true; + record: { + trigger: { global: "showCardsEnd" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.getParent().name != "huogong") return false; + var card = event.getParent(2).card; + if (card && card.storage && card.storage.olhuiyun) return true; return false; }, - content:function(){ - game.broadcastAll(function(cards){ - cards.forEach(card=>card.addGaintag('olhuiyun_tag')); - },trigger.cards); - } + content: function () { + game.broadcastAll(function (cards) { + cards.forEach((card) => card.addGaintag("olhuiyun_tag")); + }, trigger.cards); + }, }, - 1:{charlotte:true}, - 2:{charlotte:true}, - 3:{charlotte:true}, - } + 1: { charlotte: true }, + 2: { charlotte: true }, + 3: { charlotte: true }, + }, }, //王瓘 - olmiuyan:{ - audio:2, - enable:'chooseToUse', - viewAsFilter:function(player){ - return !player.hasSkill('olmiuyan_blocker')&&player.hasCard(card=>get.color(card)=='black','hes') + olmiuyan: { + audio: 2, + enable: "chooseToUse", + viewAsFilter: function (player) { + return ( + !player.hasSkill("olmiuyan_blocker") && + player.hasCard((card) => get.color(card) == "black", "hes") + ); }, - viewAs:{name:'huogong'}, - filterCard:{color:'black'}, - position:'hes', - check:function(card){ - var player=_status.event.player,suits=lib.suit.slice(0); - if(player.countCards('h')>4&&player.hasCard(function(card){ - suits.remove(get.suit(card)); - return suits.length==0; - },'h')) return 8-get.value(card); - return 4-get.value(card); + viewAs: { name: "huogong" }, + filterCard: { color: "black" }, + position: "hes", + check: function (card) { + var player = _status.event.player, + suits = lib.suit.slice(0); + if ( + player.countCards("h") > 4 && + player.hasCard(function (card) { + suits.remove(get.suit(card)); + return suits.length == 0; + }, "h") + ) + return 8 - get.value(card); + return 4 - get.value(card); }, - promptfunc:function(){ - if(_status.event.player.storage.olmiuyan) return '转换技。你可以将一张黑色牌当做【火攻】使用。若此牌未造成伤害,则你令此技能失效直到本轮结束。'; - return '转换技。你可以将一张黑色牌当做【火攻】使用。若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。'; + promptfunc: function () { + if (_status.event.player.storage.olmiuyan) + return "转换技。你可以将一张黑色牌当做【火攻】使用。若此牌未造成伤害,则你令此技能失效直到本轮结束。"; + return "转换技。你可以将一张黑色牌当做【火攻】使用。若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。"; }, - precontent:function(){ - player.changeZhuanhuanji('olmiuyan'); - var card=event.result.card; - if(!card.storage) card.storage={}; - if(player.storage.olmiuyan){ - card.storage.olmiuyan_gain=true; - player.addTempSkill('olmiuyan_gain'); - } - else{ - card.storage.olmiuyan_remove=true; - player.addTempSkill('olmiuyan_remove'); + precontent: function () { + player.changeZhuanhuanji("olmiuyan"); + var card = event.result.card; + if (!card.storage) card.storage = {}; + if (player.storage.olmiuyan) { + card.storage.olmiuyan_gain = true; + player.addTempSkill("olmiuyan_gain"); + } else { + card.storage.olmiuyan_remove = true; + player.addTempSkill("olmiuyan_remove"); } }, - init:function(player){ - player.addSkill('olmiuyan_counter'); + init: function (player) { + player.addSkill("olmiuyan_counter"); }, - onremove:function(player){ - player.removeSkill('olmiuyan_counter'); + onremove: function (player) { + player.removeSkill("olmiuyan_counter"); }, - zhuanhuanji:true, - mark:true, - marktext:'☯', - ai:{ - order:function(item,player){ - if(player.storage.olmiuyan) return 1; + zhuanhuanji: true, + mark: true, + marktext: "☯", + ai: { + order: function (item, player) { + if (player.storage.olmiuyan) return 1; return 8; }, }, - intro:{ - content:function(storage){ - if(storage) return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌未造成伤害,则你令此技能失效直到本轮结束。'; - return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。'; + intro: { + content: function (storage) { + if (storage) + return "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌未造成伤害,则你令此技能失效直到本轮结束。"; + return "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此牌造成了伤害,则你获得此阶段内所有被展示过的牌。"; }, }, - subSkill:{ - counter:{ - trigger:{global:['showCardsEnd','phaseZhunbeiBefore','phaseJudgeBefore','phaseDrawBefore','phaseUseBefore','phaseDiscardBefore','phaseJieshuBefore']}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - filter:function(event,player){ - if(event.name=='showCards') return get.itemtype(event.cards)=='cards'; + subSkill: { + counter: { + trigger: { + global: [ + "showCardsEnd", + "phaseZhunbeiBefore", + "phaseJudgeBefore", + "phaseDrawBefore", + "phaseUseBefore", + "phaseDiscardBefore", + "phaseJieshuBefore", + ], + }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.name == "showCards") return get.itemtype(event.cards) == "cards"; return true; }, - content:function(){ - if(trigger.name=='showCards'){ - game.broadcastAll(function(cards){ - cards.forEach(card=>card.addGaintag('olmiuyan_tag')); - },trigger.cards); - } - else game.players.forEach(current=>current.removeGaintag('olmiuyan_tag')); + content: function () { + if (trigger.name == "showCards") { + game.broadcastAll(function (cards) { + cards.forEach((card) => card.addGaintag("olmiuyan_tag")); + }, trigger.cards); + } else game.players.forEach((current) => current.removeGaintag("olmiuyan_tag")); }, }, - gain:{ - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.card.storage&&event.card.storage.olmiuyan_gain&&player.hasHistory('sourceDamage',function(evt){ - return evt.card==event.card; - })&&game.hasPlayer(function(current){ - return current!=player&¤t.hasCard(card=>card.hasGaintag('olmiuyan_tag')) + gain: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.olmiuyan_gain && + player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) && + game.hasPlayer(function (current) { + return ( + current != player && + current.hasCard((card) => card.hasGaintag("olmiuyan_tag")) + ); + }) + ); + }, + logTarget: function (event, player) { + return game.filterPlayer(function (current) { + return ( + current != player && + current.hasCard((card) => card.hasGaintag("olmiuyan_tag")) + ); }); }, - logTarget:function(event,player){ - return game.filterPlayer(function(current){ - return current!=player&¤t.hasCard(card=>card.hasGaintag('olmiuyan_tag')) - }); - }, - content:function(){ - var cards=[],players=game.filterPlayer(current=>current!=player).sortBySeat(); - players.forEach(current=>{ - var cardsx=current.getCards('h',function(card){ - return card.hasGaintag('olmiuyan_tag'); + content: function () { + var cards = [], + players = game.filterPlayer((current) => current != player).sortBySeat(); + players.forEach((current) => { + var cardsx = current.getCards("h", function (card) { + return card.hasGaintag("olmiuyan_tag"); }); - if(cardsx.length) cards.addArray(cardsx); + if (cardsx.length) cards.addArray(cardsx); }); - player.gain(cards,'give'); + player.gain(cards, "give"); }, }, - remove:{ - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.card.storage&&event.card.storage.olmiuyan_remove&&!player.hasHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }); + remove: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.olmiuyan_remove && + !player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) + ); }, - content:function(){ - player.addTempSkill('olmiuyan_blocker','roundStart'); - game.log(player,'的','#g【谬焰】','失效了'); + content: function () { + player.addTempSkill("olmiuyan_blocker", "roundStart"); + game.log(player, "的", "#g【谬焰】", "失效了"); }, }, - blocker:{charlotte:true}, + blocker: { charlotte: true }, }, }, - olshilu:{ - audio:2, - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - return player.hp>0; + olshilu: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player.hp > 0; }, - content:function(){ - 'step 0' - player.draw(Math.min(5,player.hp)); - 'step 1' - var targets=game.filterPlayer(current=>current!=player&¤t.countCards('h')>0&&player.inRange(current)); - if(targets.length>0){ - if(targets.length==1) event._result={bool:true,targets:targets} - else player.chooseTarget(true,'请选择一名攻击范围内的角色','然后你选择该角色的一张手牌,令此牌视为【杀】',function(card,player,target){ - return target!=player&&target.countCards('h')>0&&player.inRange(target); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); + content: function () { + "step 0"; + player.draw(Math.min(5, player.hp)); + ("step 1"); + var targets = game.filterPlayer( + (current) => + current != player && current.countCards("h") > 0 && player.inRange(current) + ); + if (targets.length > 0) { + if (targets.length == 1) event._result = { bool: true, targets: targets }; + else + player + .chooseTarget( + true, + "请选择一名攻击范围内的角色", + "然后你选择该角色的一张手牌,令此牌视为【杀】", + function (card, player, target) { + return ( + target != player && + target.countCards("h") > 0 && + player.inRange(target) + ); + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + player.choosePlayerCard(target, true, "h"); } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - player.choosePlayerCard(target,true,'h'); - } - 'step 3' - if(result.bool){ - target.addSkill('olshilu_viewas'); + ("step 3"); + if (result.bool) { + target.addSkill("olshilu_viewas"); target.showCards(result.cards); - target.addGaintag(result.cards,'olshilu'); + target.addGaintag(result.cards, "olshilu"); } }, - ai:{ - maixie:true, + ai: { + maixie: true, }, - subSkill:{ - viewas:{ - mod:{ - cardname:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('olshilu')) return 'sha'; + subSkill: { + viewas: { + mod: { + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("olshilu")) return "sha"; }, }, - charlotte:true, + charlotte: true, }, }, }, //张翼 - oldianjun:{ - audio:2, - trigger:{player:'phaseEnd'}, - forced:true, - content:function(){ - 'step 0' - player.damage('nosource'); - 'step 1' - trigger.phaseList.splice(trigger.num,0,'phaseUse|oldianjun'); + oldianjun: { + audio: 2, + trigger: { player: "phaseEnd" }, + forced: true, + content: function () { + "step 0"; + player.damage("nosource"); + ("step 1"); + trigger.phaseList.splice(trigger.num, 0, "phaseUse|oldianjun"); }, }, - olkangrui:{ - audio:2, - init:()=>{ - game.addGlobalSkill('olkangrui_ai'); + olkangrui: { + audio: 2, + init: () => { + game.addGlobalSkill("olkangrui_ai"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('olkangrui'),true)) game.removeGlobalSkill('olkangrui_ai'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("olkangrui"), true)) + game.removeGlobalSkill("olkangrui_ai"); }, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - return event.player==_status.currentPhase&&event.player.getHistory('damage').indexOf(event)==0; + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return ( + event.player == _status.currentPhase && + event.player.getHistory("damage").indexOf(event) == 0 + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseControl('cancel2').set('choiceList',[ - '令'+get.translation(trigger.player)+'回复1点体力,且造成伤害时本回合手牌上限为0', - '令'+get.translation(trigger.player)+'于本回合下次造成的伤害+1,且造成伤害时本回合手牌上限为0', - ]).set('prompt',get.prompt('olkangrui',trigger.player)).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(get.attitude(player,trigger.player)<=0) return 'cancel2'; - if(!trigger.player.isDamaged()) return '选项二'; - var list=[]; - if(trigger.player.hp+trigger.player.countCards('hs','tao')<=2) list.push('选项一'); - if(trigger.player.hasCard(card=>{ - if(!get.tag(card,'damage')) return false; - if(game.hasPlayer(current=>{ - return get.effect(current,card,trigger.player,player)>0&&trigger.player.canUse(card,current)&& - !current.hasSkillTag('filterDamage',null,{ - player:trigger.player, - card:card - }); - },'hs')){ - return true; - } - })) list.push('选项二'); - if(list.length) return list.randomGet(); - return '选项一'; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('olkangrui',trigger.player); + direct: true, + content: function () { + "step 0"; + player + .chooseControl("cancel2") + .set("choiceList", [ + "令" + + get.translation(trigger.player) + + "回复1点体力,且造成伤害时本回合手牌上限为0", + "令" + + get.translation(trigger.player) + + "于本回合下次造成的伤害+1,且造成伤害时本回合手牌上限为0", + ]) + .set("prompt", get.prompt("olkangrui", trigger.player)) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (get.attitude(player, trigger.player) <= 0) return "cancel2"; + if (!trigger.player.isDamaged()) return "选项二"; + var list = []; + if (trigger.player.hp + trigger.player.countCards("hs", "tao") <= 2) + list.push("选项一"); + if ( + trigger.player.hasCard((card) => { + if (!get.tag(card, "damage")) return false; + if ( + game.hasPlayer((current) => { + return ( + get.effect(current, card, trigger.player, player) > 0 && + trigger.player.canUse(card, current) && + !current.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: card, + }) + ); + }, "hs") + ) { + return true; + } + }) + ) + list.push("选项二"); + if (list.length) return list.randomGet(); + return "选项一"; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("olkangrui", trigger.player); player.draw(); - if(result.index==0){ + if (result.index == 0) { trigger.player.recover(); - trigger.player.addTempSkill('olkangrui_nil'); - } - else{ - trigger.player.addTempSkill('olkangrui_add'); - trigger.player.addMark('olkangrui_add',1,false); + trigger.player.addTempSkill("olkangrui_nil"); + } else { + trigger.player.addTempSkill("olkangrui_add"); + trigger.player.addMark("olkangrui_add", 1, false); } } }, - ai:{ - expose:0.2, - threaten:1.5, + ai: { + expose: 0.2, + threaten: 1.5, }, - subSkill:{ - add:{ - trigger:{source:'damageBegin1'}, - charlotte:true, - forced:true, - onremove:['olkangrui_add','olkangrui_nil'], - filter:function(event,player){ - return player.hasMark('olkangrui_add'); + subSkill: { + add: { + trigger: { source: "damageBegin1" }, + charlotte: true, + forced: true, + onremove: ["olkangrui_add", "olkangrui_nil"], + filter: function (event, player) { + return player.hasMark("olkangrui_add"); }, - content:function(){ - trigger.num+=player.countMark('olkangrui_add'); - player.removeMark('olkangrui_add',player.countMark('olkangrui_add'),false); - player.storage.olkangrui_nil=true; - game.log(player,'本回合手牌上限基数为','#g0'); + content: function () { + trigger.num += player.countMark("olkangrui_add"); + player.removeMark("olkangrui_add", player.countMark("olkangrui_add"), false); + player.storage.olkangrui_nil = true; + game.log(player, "本回合手牌上限基数为", "#g0"); }, - mod:{ - maxHandcardBase:function(player,num){ - if(player.storage.olkangrui_nil) return 0; + mod: { + maxHandcardBase: function (player, num) { + if (player.storage.olkangrui_nil) return 0; }, - } + }, }, - nil:{ - trigger:{source:'damageBegin1'}, - charlotte:true, - forced:true, - onremove:true, - filter:function(event,player){ + nil: { + trigger: { source: "damageBegin1" }, + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { return !player.storage.olkangrui_nil; }, - content:function(){ - player.storage.olkangrui_nil=true; - game.log(player,'本回合手牌上限基数为','#g0'); + content: function () { + player.storage.olkangrui_nil = true; + game.log(player, "本回合手牌上限基数为", "#g0"); }, - mod:{ - maxHandcardBase:function(player,num){ - if(player.storage.olkangrui_nil) return 0; + mod: { + maxHandcardBase: function (player, num) { + if (player.storage.olkangrui_nil) return 0; }, - } + }, }, - ai:{ - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('olkangrui'),true); + ai: { + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("olkangrui"), true); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('olkangrui_ai'); + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("olkangrui_ai"); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(target!=player||!get.tag(card,'damage')) return; - var list=game.filterPlayer(current=>current.hasSkill('olkangrui')&&get.attitude(current,player)>0); - var history=player.getHistory('damage'); - if(!list.length||history.length!=0) return; - return [1,2]; - } - } - } - } - } + ai: { + effect: { + target: function (card, player, target) { + if (target != player || !get.tag(card, "damage")) return; + var list = game.filterPlayer( + (current) => + current.hasSkill("olkangrui") && get.attitude(current, player) > 0 + ); + var history = player.getHistory("damage"); + if (!list.length || history.length != 0) return; + return [1, 2]; + }, + }, + }, + }, + }, }, //朱儁 - olcuipo:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return get.cardNameLength(event.card)==player.getHistory('useCard').indexOf(event)+1; + olcuipo: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.cardNameLength(event.card) == player.getHistory("useCard").indexOf(event) + 1; }, - content:function(){ - var card=trigger.card; - if(card.name=='sha'||get.type(card)=='trick'&&get.tag(card,'damage')>0) trigger.baseDamage++; + content: function () { + var card = trigger.card; + if (card.name == "sha" || (get.type(card) == "trick" && get.tag(card, "damage") > 0)) + trigger.baseDamage++; else player.draw(); }, /* @@ -6266,386 +8347,533 @@ game.import('character', function () { content:function(){ trigger.num++; },*/ - mod:{ - aiOrder:function(player,card,num){ - if(typeof card=='object'&&get.cardNameLength(card)==player.getHistory('useCard').length+1) return num+10; + mod: { + aiOrder: function (player, card, num) { + if ( + typeof card == "object" && + get.cardNameLength(card) == player.getHistory("useCard").length + 1 + ) + return num + 10; }, - } + }, }, //马休马铁 - rekenshang:{ - audio:'olkenshang', - enable:'chooseToUse', - filterCard:true, - selectCard:[2,Infinity], - viewAsFilter:function(player){ - return player.countCards('hes')>1; + rekenshang: { + audio: "olkenshang", + enable: "chooseToUse", + filterCard: true, + selectCard: [2, Infinity], + viewAsFilter: function (player) { + return player.countCards("hes") > 1; }, - check:function(card){ + check: function (card) { var player = _status.event.player; - if(game.countPlayer(function (current) { - return current != player && player.canUse('sha', current) && get.effect(current, {name: 'sha'}, player, player) > 0; - }) <= ui.selected.cards.length) return 0; - if(_status.event.player.countCards('hes') >= 3) return 8 - ui.selected.cards.length - get.value(card); + if ( + game.countPlayer(function (current) { + return ( + current != player && + player.canUse("sha", current) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) <= ui.selected.cards.length + ) + return 0; + if (_status.event.player.countCards("hes") >= 3) + return 8 - ui.selected.cards.length - get.value(card); return 6 - ui.selected.cards.length - get.value(card); }, - position:'hes', - viewAs:{ - name:'sha', - storage:{olkenshang:true} + position: "hes", + viewAs: { + name: "sha", + storage: { olkenshang: true }, }, - onuse:function(links,player){ - player.addTempSkill('rekenshang_effect'); + onuse: function (links, player) { + player.addTempSkill("rekenshang_effect"); }, - ai:{ - order:function(item,player){ - if(player.countCards('hes') >= 3) return 6; + ai: { + order: function (item, player) { + if (player.countCards("hes") >= 3) return 6; return 4; }, - result:{ - target:function(player,target,card,isLink){ - let eff=-1.5,odds=1.35,num=1; - if(isLink){ - let cache=_status.event.getTempCache('sha_result','eff'); - if(typeof cache!=='object'||cache.card!==get.translation(card)) return eff; - if(cache.odds<1.35&&cache.bool) return 1.35*cache.eff; - return cache.odds*cache.eff; + result: { + target: function (player, target, card, isLink) { + let eff = -1.5, + odds = 1.35, + num = 1; + if (isLink) { + let cache = _status.event.getTempCache("sha_result", "eff"); + if (typeof cache !== "object" || cache.card !== get.translation(card)) + return eff; + if (cache.odds < 1.35 && cache.bool) return 1.35 * cache.eff; + return cache.odds * cache.eff; } - if(player.hasSkill('jiu')||player.hasSkillTag('damageBonus',true,{ - target:target, - card:card - })){ - if(target.hasSkillTag('filterDamage',null,{ - player:player, - card:card, - jiu:true, - })) eff=-0.5; - else{ - num=2; - if(get.attitude(player,target)>0) eff=-7; - else eff=-4; + if ( + player.hasSkill("jiu") || + player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ) { + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + jiu: true, + }) + ) + eff = -0.5; + else { + num = 2; + if (get.attitude(player, target) > 0) eff = -7; + else eff = -4; } } - if(!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card, - },true)) odds-=0.7*target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }),'odds'); - _status.event.putTempCache('sha_result','eff',{ - bool:target.hp>num&&get.attitude(player,target)>0, - card:get.translation(card), - eff:eff, - odds:odds + if ( + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) + odds -= + 0.7 * + target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }), + "odds" + ); + _status.event.putTempCache("sha_result", "eff", { + bool: target.hp > num && get.attitude(player, target) > 0, + card: get.translation(card), + eff: eff, + odds: odds, }); - return odds*eff; - } + return odds * eff; + }, }, - respondSha:true, - skillTagFilter:player=>player.countCards('hes')>1, + respondSha: true, + skillTagFilter: (player) => player.countCards("hes") > 1, }, - subSkill:{ - effect:{ - audio:'olkenshang', - trigger:{player:'useCard2'}, - charlotte:true, - group:'rekenshang_after', - direct:true, - filter:function(event,player){ - return event.card.storage&&event.card.storage.olkenshang&&game.countPlayer(function(current){ - return current!=player&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })>=event.cards.length; + subSkill: { + effect: { + audio: "olkenshang", + trigger: { player: "useCard2" }, + charlotte: true, + group: "rekenshang_after", + direct: true, + filter: function (event, player) { + return ( + event.card.storage && + event.card.storage.olkenshang && + game.countPlayer(function (current) { + return ( + current != player && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) >= event.cards.length + ); }, - content:function(){ - 'step 0' - player.chooseTarget( - trigger.cards.length, - '是否更改'+get.translation(trigger.card)+'的目标?', - '选择'+get.cnNumber(trigger.cards.length)+'名角色作为'+get.translation(trigger.card)+'的目标,覆盖原先存在的目标', - function(card,player,target){ - var evt=_status.event.getTrigger(); - return target!=player&&lib.filter.targetEnabled2(evt.card,player,target)&&lib.filter.targetInRange(evt.card,player,target); - }).set('ai',function(target){ - var evt=_status.event.getTrigger(); - return get.effect(target,evt.card,evt.player,evt.player); - }); - 'step 1' - if(result.bool){ - if(player!=event.player&&!player.isOnline()) game.delayx(); - } - else event.finish(); - 'step 2' - var targets=result.targets; - player.logSkill('rekenshang_effect',targets); - trigger.targets.length=0; + content: function () { + "step 0"; + player + .chooseTarget( + trigger.cards.length, + "是否更改" + get.translation(trigger.card) + "的目标?", + "选择" + + get.cnNumber(trigger.cards.length) + + "名角色作为" + + get.translation(trigger.card) + + "的目标,覆盖原先存在的目标", + function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + lib.filter.targetEnabled2(evt.card, player, target) && + lib.filter.targetInRange(evt.card, player, target) + ); + } + ) + .set("ai", function (target) { + var evt = _status.event.getTrigger(); + return get.effect(target, evt.card, evt.player, evt.player); + }); + ("step 1"); + if (result.bool) { + if (player != event.player && !player.isOnline()) game.delayx(); + } else event.finish(); + ("step 2"); + var targets = result.targets; + player.logSkill("rekenshang_effect", targets); + trigger.targets.length = 0; trigger.targets.addArray(targets); - game.log(targets,'成为了',trigger.card,'的新目标'); + game.log(targets, "成为了", trigger.card, "的新目标"); }, }, - after:{ - audio:'olkenshang', - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - if(event.card.name!='sha'||!event.card.storage||!event.card.storage.olkenshang) return false; - var num=0; - game.countPlayer2(current=>{ - current.getHistory('damage',evt=>{ - if(evt.card==event.card) num+=evt.num; - }) + after: { + audio: "olkenshang", + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if ( + event.card.name != "sha" || + !event.card.storage || + !event.card.storage.olkenshang + ) + return false; + var num = 0; + game.countPlayer2((current) => { + current.getHistory("damage", (evt) => { + if (evt.card == event.card) num += evt.num; + }); }); - return numcurrent!=player&&player.canUse(card,current,false)&&!player.inRange(current)); - for(var target of targets){ - eff+=get.effect(target,card,player,player); + ai: { + order: 1, + threaten: 1.1, + effect: { + player_use: function (card, player, target) { + if (_status._olkenshang_aiChecking || ui.selected.targets.length) return; + if (typeof card != "object" || !card.storage || !card.storage.olkenshang) + return false; + _status._olkenshang_aiChecking = true; + var eff = 0; + var targets = game.filterPlayer( + (current) => + current != player && + player.canUse(card, current, false) && + !player.inRange(current) + ); + for (var target of targets) { + eff += get.effect(target, card, player, player); } delete _status._olkenshang_aiChecking; - if(eff>0) return [0,eff/Math.max(0.01,get.attitude(player,player))]; + if (eff > 0) return [0, eff / Math.max(0.01, get.attitude(player, player))]; }, }, }, - subSkill:{ - effect:{ - audio:'olkenshang', - trigger:{player:'useCard2'}, - charlotte:true, - logTarget:function(event,player){ - return game.filterPlayer(current=>current!=player&&player.canUse(event.card,current,false)&&!player.inRange(current)); + subSkill: { + effect: { + audio: "olkenshang", + trigger: { player: "useCard2" }, + charlotte: true, + logTarget: function (event, player) { + return game.filterPlayer( + (current) => + current != player && + player.canUse(event.card, current, false) && + !player.inRange(current) + ); }, - prompt2:'将此牌目标改为攻击范围外的所有其他角色', - group:'olkenshang_after', - check:function(event,player){ - var eff1=0,eff2=0; - for(var target of event.targets){ - eff1+=get.effect(target,event.card,event.player,player); + prompt2: "将此牌目标改为攻击范围外的所有其他角色", + group: "olkenshang_after", + check: function (event, player) { + var eff1 = 0, + eff2 = 0; + for (var target of event.targets) { + eff1 += get.effect(target, event.card, event.player, player); } - var targets=game.filterPlayer(current=>current!=player&&player.canUse(event.card,current,false)&&!player.inRange(current)); - for(var target of targets){ - eff2+=get.effect(target,event.card,event.player,player); + var targets = game.filterPlayer( + (current) => + current != player && + player.canUse(event.card, current, false) && + !player.inRange(current) + ); + for (var target of targets) { + eff2 += get.effect(target, event.card, event.player, player); } - return eff2>eff1; + return eff2 > eff1; }, - filter:function(event,player){ - return event.card.name=='sha'&&event.card.storage&&event.card.storage.olkenshang&&event.targets.length&&game.filterPlayer(current=>current!=player&&player.canUse(event.card,current,false)&&!player.inRange(current)).length; + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.card.storage && + event.card.storage.olkenshang && + event.targets.length && + game.filterPlayer( + (current) => + current != player && + player.canUse(event.card, current, false) && + !player.inRange(current) + ).length + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.targets.removeArray(trigger.targets); - var targets=game.filterPlayer(current=>current!=player&&player.canUse(trigger.card,current,false)&&!player.inRange(current)); - if(targets.length) trigger.targets.addArray(targets); - } - }, - after:{ - audio:'olkenshang', - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - if(event.card.name!='sha'||!event.card.storage||!event.card.storage.olkenshang) return false; - var num=0; - game.countPlayer2(current=>{ - current.getHistory('damage',evt=>{ - if(evt.card==event.card) num+=evt.num; - }) - }); - return num>0; + var targets = game.filterPlayer( + (current) => + current != player && + player.canUse(trigger.card, current, false) && + !player.inRange(current) + ); + if (targets.length) trigger.targets.addArray(targets); }, - content:function(){ - 'step 0' - var num=0,len=trigger.cards.length; - game.countPlayer2(current=>{ - current.getHistory('damage',evt=>{ - if(evt.card==trigger.card) num+=evt.num; - }) + }, + after: { + audio: "olkenshang", + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + if ( + event.card.name != "sha" || + !event.card.storage || + !event.card.storage.olkenshang + ) + return false; + var num = 0; + game.countPlayer2((current) => { + current.getHistory("damage", (evt) => { + if (evt.card == event.card) num += evt.num; + }); }); - if(len>num){ + return num > 0; + }, + content: function () { + "step 0"; + var num = 0, + len = trigger.cards.length; + game.countPlayer2((current) => { + current.getHistory("damage", (evt) => { + if (evt.card == trigger.card) num += evt.num; + }); + }); + if (len > num) { player.draw(num); event.finish(); - } - else{ - var skills=player.getSkills(null,false,false).filter(skill=>{ - var info=get.info(skill); - if(!info||info.charlotte||get.skillInfoTranslation(skill,player).length==0) return false; + } else { + var skills = player.getSkills(null, false, false).filter((skill) => { + var info = get.info(skill); + if ( + !info || + info.charlotte || + get.skillInfoTranslation(skill, player).length == 0 + ) + return false; return true; }); - if(skills.length==1) event._result={control:skills[0]}; - else player.chooseControl(skills).set('choiceList',skills.map(i=>{ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; - })).set('displayIndex',false).set('prompt','垦伤:选择失去一个技能').set('ai',()=>{ - var choices=_status.event.controls.slice(); - var negs=choices.filter(i=>{ - var info=get.info(i); - if(!info||!info.ai) return false; - return info.ai.neg||info.ai.halfneg; - }); - if(negs.length) return negs.randomGet(); - if(choices.includes('mashu')) return 'mashu'; - return choices.randomGet(); - }); + if (skills.length == 1) event._result = { control: skills[0] }; + else + player + .chooseControl(skills) + .set( + "choiceList", + skills.map((i) => { + return ( + '
    【' + + get.translation( + lib.translate[i + "_ab"] || + get.translation(i).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set("prompt", "垦伤:选择失去一个技能") + .set("ai", () => { + var choices = _status.event.controls.slice(); + var negs = choices.filter((i) => { + var info = get.info(i); + if (!info || !info.ai) return false; + return info.ai.neg || info.ai.halfneg; + }); + if (negs.length) return negs.randomGet(); + if (choices.includes("mashu")) return "mashu"; + return choices.randomGet(); + }); } - 'step 1' + ("step 1"); player.removeSkills(result.control); - } - } + }, + }, }, }, //董荼那 - oljianman:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - direct:true, - filter:function(event,player){ - var history=game.getGlobalHistory('useCard',evt=>{ - return get.type(evt.card)=='basic'; + oljianman: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + direct: true, + filter: function (event, player) { + var history = game.getGlobalHistory("useCard", (evt) => { + return get.type(evt.card) == "basic"; }); - if(history.length<2) return false; - var users=history.slice(0,2).map(i=>i.player); - var list=users.filter(user=>user==player); - if(list.length==1){ - var target=users.filter(user=>user!=player)[0]; - return target&&target.isIn()&&target.countDiscardableCards(player,'he'); + if (history.length < 2) return false; + var users = history.slice(0, 2).map((i) => i.player); + var list = users.filter((user) => user == player); + if (list.length == 1) { + var target = users.filter((user) => user != player)[0]; + return target && target.isIn() && target.countDiscardableCards(player, "he"); } - if(list.length==2){ - return history.slice(0,2).some(evt=>{ - var card=evt.card; - return player.hasUseTarget({name:card.name,nature:card.nature,isCard:true}); + if (list.length == 2) { + return history.slice(0, 2).some((evt) => { + var card = evt.card; + return player.hasUseTarget({ + name: card.name, + nature: card.nature, + isCard: true, + }); }); } return false; }, - content:function(){ - 'step 0' - var history=game.getGlobalHistory('useCard',evt=>{ - return get.type(evt.card)=='basic'; + content: function () { + "step 0"; + var history = game.getGlobalHistory("useCard", (evt) => { + return get.type(evt.card) == "basic"; }); - var list=history.slice(0,2).map(i=>i.player).filter(user=>user==player); - if(list.length==1) { - var users=history.slice(0,2).map(i=>i.player); - var target=users.filter(user=>user!=player)[0]; - player.logSkill('oljianman',target); - player.discardPlayerCard(target,'he',true); + var list = history + .slice(0, 2) + .map((i) => i.player) + .filter((user) => user == player); + if (list.length == 1) { + var users = history.slice(0, 2).map((i) => i.player); + var target = users.filter((user) => user != player)[0]; + player.logSkill("oljianman", target); + player.discardPlayerCard(target, "he", true); event.finish(); - } - else if(list.length==2){ - var evts=history.slice(0,2); - var vcard=[]; - for(var evt of evts){ - var card=evt.card; - if(vcard.length&&vcard[0][2]==card.name&&vcard[0][3]==card.nature) continue; - if(player.hasUseTarget({name:card.name,nature:card.nature,isCard:true})){ - vcard.push(['基本','',card.name,card.nature]); + } else if (list.length == 2) { + var evts = history.slice(0, 2); + var vcard = []; + for (var evt of evts) { + var card = evt.card; + if (vcard.length && vcard[0][2] == card.name && vcard[0][3] == card.nature) + continue; + if (player.hasUseTarget({ name: card.name, nature: card.nature, isCard: true })) { + vcard.push(["基本", "", card.name, card.nature]); } } - if(vcard.length==1) event._result={bool:true,links:[vcard[0]]}; - else{ - player.chooseButton(['鹣蛮:视为使用其中一张牌',[vcard,'vcard']]).set('ai',function(button){ - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); - }); + if (vcard.length == 1) event._result = { bool: true, links: [vcard[0]] }; + else { + player + .chooseButton(["鹣蛮:视为使用其中一张牌", [vcard, "vcard"]]) + .set("ai", function (button) { + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }); } + } else event.finish(); + ("step 1"); + if (result.bool) { + var card = { name: result.links[0][2], nature: result.links[0][3], isCard: true }; + player + .chooseUseTarget(card, true) + .set("logSkill", "oljianman") + .set("prompt", "鹣蛮:选择" + get.translation(card) + "的目标"); } - else event.finish(); - 'step 1' - if(result.bool){ - var card={name:result.links[0][2],nature:result.links[0][3],isCard:true}; - player.chooseUseTarget(card,true).set('logSkill','oljianman').set('prompt','鹣蛮:选择'+get.translation(card)+'的目标'); - } - } + }, }, //张华 - olbihun:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - forced:true, - filter:function(event,player){ - return event.isFirstTarget&&player.countCards('h')>player.getHandcardLimit()&&event.targets.some(target=>target!=player); + olbihun: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + forced: true, + filter: function (event, player) { + return ( + event.isFirstTarget && + player.countCards("h") > player.getHandcardLimit() && + event.targets.some((target) => target != player) + ); }, //group:'olbihun_give', - content:function(){ - if(trigger.targets.length==1){ - var cards=trigger.cards.filterInD(); - if(cards.length){ + content: function () { + if (trigger.targets.length == 1) { + var cards = trigger.cards.filterInD(); + if (cards.length) { game.delayx(); - trigger.targets[0].gain(cards,'gain2'); + trigger.targets[0].gain(cards, "gain2"); } } - var targets=trigger.targets.filter(target=>target!=player); + var targets = trigger.targets.filter((target) => target != player); trigger.targets.removeArray(targets); trigger.getParent().triggeredTargets1.removeArray(targets); }, - ai:{ - threaten:0.8, - halfneg:true, - effect:{ - player:function(card,player,target){ - if((!card.isCard||!card.cards)&&get.itemtype(card)!='card') return; - let cs=0; - if(target&&player!=target&&player.countCards('h',i=>{ - if(card===i||card.cards&&card.cards.includes(i)){ - cs++; - return false; - } - return true; - })>player.getHandcardLimit()){ - let targets=[],evt=_status.event.getParent('useCard'); + ai: { + threaten: 0.8, + halfneg: true, + effect: { + player: function (card, player, target) { + if ((!card.isCard || !card.cards) && get.itemtype(card) != "card") return; + let cs = 0; + if ( + target && + player != target && + player.countCards("h", (i) => { + if (card === i || (card.cards && card.cards.includes(i))) { + cs++; + return false; + } + return true; + }) > player.getHandcardLimit() + ) { + let targets = [], + evt = _status.event.getParent("useCard"); targets.addArray(ui.selected.targets); - if(evt&&evt.card==card) targets.addArray(evt.targets); - if(targets.length){ - if(targets.length>1||!targets.includes(target)) return 'zeroplayertarget'; + if (evt && evt.card == card) targets.addArray(evt.targets); + if (targets.length) { + if (targets.length > 1 || !targets.includes(target)) + return "zeroplayertarget"; return; } - let info=get.info(card); - if(!info||info.notarget||!info.filterTarget) return; - let range,select=get.copy(info.selectTarget),filter; - if(select===undefined) range=[1,1]; - else if(typeof select==='number') range=[select,select]; - else if(get.itemtype(select)==='select') range=select; - else if(typeof select==='function') range=select(card,player); - if(info.singleCard) range=[1,1]; - game.checkMod(card,player,range,'selectTarget',player); - if(range[1]<-1) range=[1, 1]; - else if(range[0]<0){ - if(info.filterTarget===true) filter=game.players.length; - else filter=game.countPlayer(current=>{ - return info.filterTarget(card,player,current); - }); - range=[filter,filter]; + let info = get.info(card); + if (!info || info.notarget || !info.filterTarget) return; + let range, + select = get.copy(info.selectTarget), + filter; + if (select === undefined) range = [1, 1]; + else if (typeof select === "number") range = [select, select]; + else if (get.itemtype(select) === "select") range = select; + else if (typeof select === "function") range = select(card, player); + if (info.singleCard) range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); + if (range[1] < -1) range = [1, 1]; + else if (range[0] < 0) { + if (info.filterTarget === true) filter = game.players.length; + else + filter = game.countPlayer((current) => { + return info.filterTarget(card, player, current); + }); + range = [filter, filter]; } - if(range&&range[0]>1&&range[1]>1) return 'zeroplayertarget'; - return [0,0,0,1]; + if (range && range[0] > 1 && range[1] > 1) return "zeroplayertarget"; + return [0, 0, 0, 1]; } }, }, @@ -6664,1763 +8892,2274 @@ game.import('character', function () { } }*/ }, - olchuanwu:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + olchuanwu: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - forced:true, - filter:function(event,player){ - return player.getAttackRange()>0; + forced: true, + filter: function (event, player) { + return player.getAttackRange() > 0; }, - content:function(){ - var skills=game.filterSkills(player.getStockSkills(true,true),player); - var num=Math.min(player.getAttackRange(),skills.length); - skills=skills.slice(0,num); - player.disableSkill('olchuanwu',skills); - player.addTempSkill('olchuanwu_restore'); - var str=''; - for(var i of skills){ - str+='【'+get.translation(i)+'】、'; + content: function () { + var skills = game.filterSkills(player.getStockSkills(true, true), player); + var num = Math.min(player.getAttackRange(), skills.length); + skills = skills.slice(0, num); + player.disableSkill("olchuanwu", skills); + player.addTempSkill("olchuanwu_restore"); + var str = ""; + for (var i of skills) { + str += "【" + get.translation(i) + "】、"; player.popup(i); } - str=str.slice(0,-1); - game.log(player,'的技能','#g'+str,'失效了'); + str = str.slice(0, -1); + game.log(player, "的技能", "#g" + str, "失效了"); player.draw(num); }, - subSkill:{ - restore:{ - charlotte:true, - forced:true, - popup:false, - onremove:function(player){ - player.enableSkill('olchuanwu'); - game.log(player,'恢复了技能'); - } - } - } - }, - oljianhe:{ - audio:2, - enable:'phaseUse', - filterTarget:function(card,player,target){ - return !player.getStorage('oljianhe_chosen').includes(target); + subSkill: { + restore: { + charlotte: true, + forced: true, + popup: false, + onremove: function (player) { + player.enableSkill("olchuanwu"); + game.log(player, "恢复了技能"); + }, + }, }, - filterCard:function(card,player){ - if(ui.selected.cards.length){ - var cardx=ui.selected.cards[0]; - if(get.type(cardx)=='equip') return get.type(card)=='equip'; - return get.name(card)==get.name(cardx); + }, + oljianhe: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + return !player.getStorage("oljianhe_chosen").includes(target); + }, + filterCard: function (card, player) { + if (ui.selected.cards.length) { + var cardx = ui.selected.cards[0]; + if (get.type(cardx) == "equip") return get.type(card) == "equip"; + return get.name(card) == get.name(cardx); } - var cards=player.getCards('he'); - for(var cardx of cards){ - if(card!=cardx){ - if(get.type(cardx)=='equip'&&get.type(card)=='equip') return true; - if(get.name(card)==get.name(cardx)) return true; + var cards = player.getCards("he"); + for (var cardx of cards) { + if (card != cardx) { + if (get.type(cardx) == "equip" && get.type(card) == "equip") return true; + if (get.name(card) == get.name(cardx)) return true; } } return false; }, - selectCard:[2,Infinity], - position:'he', - complexCard:true, - discard:false, - visible:true, - prepare:'throw', - loseTo:'discardPile', - delay:0.5, - check:function(card){ - if(get.type(card)=='equip') return 15-get.value(card); - return 7-get.value(card); + selectCard: [2, Infinity], + position: "he", + complexCard: true, + discard: false, + visible: true, + prepare: "throw", + loseTo: "discardPile", + delay: 0.5, + check: function (card) { + if (get.type(card) == "equip") return 15 - get.value(card); + return 7 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(cards.length); - player.addTempSkill('oljianhe_chosen','phaseUseAfter'); - player.markAuto('oljianhe_chosen',[target]); - 'step 1' - var type=get.type2(cards[0]); - target.chooseCard(get.translation(player)+'对你发动了【剑合】','请重铸'+get.cnNumber(cards.length)+'张'+get.translation(type)+'牌,或点“取消”受到1点雷电伤害',cards.length,'he',(card,player)=>{ - return get.type2(card)==_status.event.type&&player.canRecast(card); - }).set('ai',card=>{ - if(_status.event.goon) return (get.type(card)=='equip'?15:7)-get.value(card); - return 0; - }).set('type',type).set('goon',get.damageEffect(target,player,target,'thunder')<0); - 'step 2' - if(result.bool){ + player.addTempSkill("oljianhe_chosen", "phaseUseAfter"); + player.markAuto("oljianhe_chosen", [target]); + ("step 1"); + var type = get.type2(cards[0]); + target + .chooseCard( + get.translation(player) + "对你发动了【剑合】", + "请重铸" + + get.cnNumber(cards.length) + + "张" + + get.translation(type) + + "牌,或点“取消”受到1点雷电伤害", + cards.length, + "he", + (card, player) => { + return get.type2(card) == _status.event.type && player.canRecast(card); + } + ) + .set("ai", (card) => { + if (_status.event.goon) + return (get.type(card) == "equip" ? 15 : 7) - get.value(card); + return 0; + }) + .set("type", type) + .set("goon", get.damageEffect(target, player, target, "thunder") < 0); + ("step 2"); + if (result.bool) { target.recast(result.cards); + } else { + target.damage(player, "thunder"); } - else{ - target.damage(player,'thunder'); - } - 'step 3' + ("step 3"); game.delayx(); }, - ai:{ - order:function(item,player){ - if(player.hasSkill('olbihun')&&player.countCards('h')>player.getHandcardLimit()) return 11; + ai: { + order: function (item, player) { + if (player.hasSkill("olbihun") && player.countCards("h") > player.getHandcardLimit()) + return 11; return 4; }, - threaten:2.4, - expose:0.1, - result:{ - target:function(player,target){ - var cards=ui.selected.cards,type=get.type2(cards[0]); - if(target.countCards('he',card=>{ - return get.type(card)==type&&get.value(card)<=5; - })>=cards.length) return 1; + threaten: 2.4, + expose: 0.1, + result: { + target: function (player, target) { + var cards = ui.selected.cards, + type = get.type2(cards[0]); + if ( + target.countCards("he", (card) => { + return get.type(card) == type && get.value(card) <= 5; + }) >= cards.length + ) + return 1; return -1; - } - } + }, + }, + }, + subSkill: { + chosen: { + charlotte: true, + onremove: true, + intro: { content: "本阶段已对$发动过技能" }, + }, }, - subSkill:{ - chosen:{ - charlotte:true, - onremove:true, - intro:{content:'本阶段已对$发动过技能'}, - } - } }, //屈晃 - olqiejian:{ - audio:2, - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + olqiejian: { + audio: 2, + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - if(current.countCards('h')) return false; - var evt=event.getl(current); - return evt&&evt.hs&&evt.hs.length&&!player.getStorage('olqiejian_ban').includes(current); + direct: true, + filter: function (event, player) { + return game.hasPlayer((current) => { + if (current.countCards("h")) return false; + var evt = event.getl(current); + return ( + evt && + evt.hs && + evt.hs.length && + !player.getStorage("olqiejian_ban").includes(current) + ); }); }, - content:function(){ - 'step 0' - event.targets=game.filterPlayer(current=>{ - if(current.countCards('h')) return false; - var evt=trigger.getl(current); - return evt&&evt.hs&&evt.hs.length&&!player.getStorage('olqiejian_ban').includes(current); - }).sortBySeat(_status.currentPhase); - 'step 1' - var target=targets.shift(); - event.target=target; - if(target.isIn()){ - player.chooseBool(get.prompt2('olqiejian',target)).set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.attitude(player,target)>0||target.hasCard(card=>{ - return get.value(card,target)*get.sgnAttitude(player,target)<-6; - },'ej')); - } - else event.goto(5); - 'step 2' - if(result.bool){ - player.logSkill('olqiejian',target); - player.draw('nodelay'); + content: function () { + "step 0"; + event.targets = game + .filterPlayer((current) => { + if (current.countCards("h")) return false; + var evt = trigger.getl(current); + return ( + evt && + evt.hs && + evt.hs.length && + !player.getStorage("olqiejian_ban").includes(current) + ); + }) + .sortBySeat(_status.currentPhase); + ("step 1"); + var target = targets.shift(); + event.target = target; + if (target.isIn()) { + player + .chooseBool(get.prompt2("olqiejian", target)) + .set("ai", () => { + return _status.event.bool; + }) + .set( + "bool", + get.attitude(player, target) > 0 || + target.hasCard((card) => { + return get.value(card, target) * get.sgnAttitude(player, target) < -6; + }, "ej") + ); + } else event.goto(5); + ("step 2"); + if (result.bool) { + player.logSkill("olqiejian", target); + player.draw("nodelay"); target.draw(); - } - else event.goto(5); - 'step 3' - player.chooseTarget('切谏:选择一名角色','弃置你或其场上的一张牌;或点击“取消”令你于本轮不能再对其发动此技能',(card,player,target)=>{ - return (target==player||target==_status.event.getParent().target)&&target.countDiscardableCards(player,'ej')>0; - }).set('ai',target=>{ - var sign=get.sgnAttitude(_status.event.player,target); - return 6-target.getCards('ej').map(i=>{ - var val=0; - if(get.position(i)=='e') val=get.value(i,target); - else{ - val=get.effect(player,{ - name:i.viewAs||i.name, - cards:[i], - },target,target); + } else event.goto(5); + ("step 3"); + player + .chooseTarget( + "切谏:选择一名角色", + "弃置你或其场上的一张牌;或点击“取消”令你于本轮不能再对其发动此技能", + (card, player, target) => { + return ( + (target == player || target == _status.event.getParent().target) && + target.countDiscardableCards(player, "ej") > 0 + ); } - return sign*val; - }).sort((a,b)=>a-b)[0]; - }); - 'step 4' - if(result.bool){ - var targetx=result.targets[0]; - player.discardPlayerCard(targetx,'ej',true); + ) + .set("ai", (target) => { + var sign = get.sgnAttitude(_status.event.player, target); + return ( + 6 - + target + .getCards("ej") + .map((i) => { + var val = 0; + if (get.position(i) == "e") val = get.value(i, target); + else { + val = get.effect( + player, + { + name: i.viewAs || i.name, + cards: [i], + }, + target, + target + ); + } + return sign * val; + }) + .sort((a, b) => a - b)[0] + ); + }); + ("step 4"); + if (result.bool) { + var targetx = result.targets[0]; + player.discardPlayerCard(targetx, "ej", true); + } else { + player.addTempSkill("olqiejian_ban", "roundStart"); + player.markAuto("olqiejian_ban", [target]); } - else{ - player.addTempSkill('olqiejian_ban','roundStart'); - player.markAuto('olqiejian_ban',[target]); - } - 'step 5' - if(targets.length) event.goto(1); + ("step 5"); + if (targets.length) event.goto(1); + }, + subSkill: { + ban: { + onremove: true, + charlotte: true, + intro: { + content: "本轮不能再对$发动〖切谏〗", + }, + }, }, - subSkill:{ - ban:{ - onremove:true, - charlotte:true, - intro:{ - content:'本轮不能再对$发动〖切谏〗' - } - } - } }, - olnishou:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['loseAsyncAfter','equipAfter'], + olnishou: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["loseAsyncAfter", "equipAfter"], }, - forced:true, - filter:function(event,player){ + forced: true, + filter: function (event, player) { var phaseName; - for(var name of lib.phaseName){ - var evt=event.getParent(name); - if(!evt||evt.name!=name) continue; - phaseName=name; + for (var name of lib.phaseName) { + var evt = event.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; } - var cards=event.getd(player,'es'); - return cards.length&&(cards.some(card=>{ - if(get.position(card,true)!='d') return false; - return player.hasUseTarget(get.autoViewAs({name:'shandian'},[card])); - })||phaseName&&!player.hasSkill('olnishou_swap')); + var cards = event.getd(player, "es"); + return ( + cards.length && + (cards.some((card) => { + if (get.position(card, true) != "d") return false; + return player.hasUseTarget(get.autoViewAs({ name: "shandian" }, [card])); + }) || + (phaseName && !player.hasSkill("olnishou_swap"))) + ); }, - direct:true, - content:function(){ - 'step 0' - var cards=trigger.getd(player,'es'); - var choices=[]; - var choiceList=[ - '将'+(cards.length?get.translation(cards[0]):'这些牌中第一张能当【闪电】对你使用的牌')+'当【闪电】使用', - '本阶段结束时,你与一名手牌数最少的角色交换手牌' + direct: true, + content: function () { + "step 0"; + var cards = trigger.getd(player, "es"); + var choices = []; + var choiceList = [ + "将" + + (cards.length + ? get.translation(cards[0]) + : "这些牌中第一张能当【闪电】对你使用的牌") + + "当【闪电】使用", + "本阶段结束时,你与一名手牌数最少的角色交换手牌", ]; - cards=cards.filter(card=>{ - if(get.position(card,true)!='d') return false; - return player.hasUseTarget(get.autoViewAs({name:'shandian'},[card])); + cards = cards.filter((card) => { + if (get.position(card, true) != "d") return false; + return player.hasUseTarget(get.autoViewAs({ name: "shandian" }, [card])); }); - event.cards=cards; + event.cards = cards; var phaseName; - for(var name of lib.phaseName){ - var evt=trigger.getParent(name); - if(!evt||evt.name!=name) continue; - phaseName=name; + for (var name of lib.phaseName) { + var evt = trigger.getParent(name); + if (!evt || evt.name != name) continue; + phaseName = name; } - if(cards.length) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(phaseName&&!player.hasSkill('olnishou_swap')) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - event.phaseName=phaseName; - if(!choices.length) event.finish(); - else player.chooseControl(choices).set('choiceList',choiceList).set('prompt','泥首:选择一项').set('ai',()=>0); - 'step 1' - player.logSkill('olnishou'); - game.log(player,'选择了','#y'+result.control); - if(result.control=='选项一'){ - var card=cards[0]; - player.chooseUseTarget({name:'shandian'},[card],true); - } - else{ - var name=event.phaseName; - player.storage.olnishou_swap=name; - player.addTempSkill('olnishou_swap',name+'After'); + if (cards.length) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (phaseName && !player.hasSkill("olnishou_swap")) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + event.phaseName = phaseName; + if (!choices.length) event.finish(); + else + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "泥首:选择一项") + .set("ai", () => 0); + ("step 1"); + player.logSkill("olnishou"); + game.log(player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + var card = cards[0]; + player.chooseUseTarget({ name: "shandian" }, [card], true); + } else { + var name = event.phaseName; + player.storage.olnishou_swap = name; + player.addTempSkill("olnishou_swap", name + "After"); } }, - subSkill:{ - swap:{ - audio:'olnishou', - charlotte:true, - forced:true, - direct:true, - onremove:true, - trigger:{global:['phaseZhunbeiEnd','phaseJudgeEnd','phaseDrawEnd','phaseUseEnd','phaseDiscardEnd','phaseJieshuEnd']}, - content:function(){ - 'step 0' - if(trigger.name!=player.storage.olnishou_swap||!event.player.isIn()){ - player.removeSkill('olnishou_swap'); - event.finish(); return; + subSkill: { + swap: { + audio: "olnishou", + charlotte: true, + forced: true, + direct: true, + onremove: true, + trigger: { + global: [ + "phaseZhunbeiEnd", + "phaseJudgeEnd", + "phaseDrawEnd", + "phaseUseEnd", + "phaseDiscardEnd", + "phaseJieshuEnd", + ], + }, + content: function () { + "step 0"; + if (trigger.name != player.storage.olnishou_swap || !event.player.isIn()) { + player.removeSkill("olnishou_swap"); + event.finish(); + return; } - player.chooseTarget('泥首:与一名手牌数最少的角色交换手牌',true,(card,player,target)=>{ - return target.isMinHandcard(); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('olnishou_swap',target); - if(target!=player){ + player.chooseTarget( + "泥首:与一名手牌数最少的角色交换手牌", + true, + (card, player, target) => { + return target.isMinHandcard(); + } + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olnishou_swap", target); + if (target != player) { player.swapHandcards(target); } } - 'step 2' - player.removeSkill('olnishou_swap'); - } - } - } + ("step 2"); + player.removeSkill("olnishou_swap"); + }, + }, + }, }, //马承 - olchenglie:{ - audio:2, - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current); + olchenglie: { + audio: 2, + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); }); }, - direct:true, - shaRelated:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('olchenglie'),'为'+get.translation(trigger.card)+'多指定至多两个目标,并发动后续效果',[1,2],(card,player,target)=>{ - var evt=_status.event.getTrigger(); - return !evt.targets.includes(target)&&player.canUse(evt.card,target); - }).set('ai',function(target){ - var player=_status.event.player,evt=_status.event.getTrigger(); - return get.effect(target,evt.card,player,player); - }); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else event.finish(); - 'step 2' - player.logSkill('olchenglie',targets); + direct: true, + shaRelated: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("olchenglie"), + "为" + get.translation(trigger.card) + "多指定至多两个目标,并发动后续效果", + [1, 2], + (card, player, target) => { + var evt = _status.event.getTrigger(); + return !evt.targets.includes(target) && player.canUse(evt.card, target); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + evt = _status.event.getTrigger(); + return get.effect(target, evt.card, player, player); + }); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else event.finish(); + ("step 2"); + player.logSkill("olchenglie", targets); trigger.targets.addArray(targets); - var targets=trigger.targets; - event.targets=targets; - event.given=[]; - var cards=get.cards(targets.length); - event.cards=cards.slice(); - player.showCards(event.cards,get.translation(player)+'发动了【骋烈】'); - while(cards.length) ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); - 'step 3' + var targets = trigger.targets; + event.targets = targets; + event.given = []; + var cards = get.cards(targets.length); + event.cards = cards.slice(); + player.showCards(event.cards, get.translation(player) + "发动了【骋烈】"); + while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); + ("step 3"); game.updateRoundNumber(); - var hs=player.getCards('h'); - var next=player.chooseToMove('骋烈:是否交换一张牌?'); - next.set('list',[ - ['〖骋烈〗展示',event.cards,'olchenglie'], - ['你的手牌',hs], + var hs = player.getCards("h"); + var next = player.chooseToMove("骋烈:是否交换一张牌?"); + next.set("list", [ + ["〖骋烈〗展示", event.cards, "olchenglie"], + ["你的手牌", hs], ]); - next.set('filterMove',function(from,to,moved){ - if(typeof to=='number') return false; - var player=_status.event.player; - var hs=player.getCards('h'); - var changed=hs.filter(function(card){ + next.set("filterMove", function (from, to, moved) { + if (typeof to == "number") return false; + var player = _status.event.player; + var hs = player.getCards("h"); + var changed = hs.filter(function (card) { return !moved[1].includes(card); }); - var changed2=moved[1].filter(function(card){ + var changed2 = moved[1].filter(function (card) { return !hs.includes(card); }); - if(changed.length<1) return true; - var pos1=(moved[0].includes(from.link)?0:1),pos2=(moved[0].includes(to.link)?0:1); - if(pos1==pos2) return true; - if(pos1==0){ - if(changed.includes(from.link)) return true; + if (changed.length < 1) return true; + var pos1 = moved[0].includes(from.link) ? 0 : 1, + pos2 = moved[0].includes(to.link) ? 0 : 1; + if (pos1 == pos2) return true; + if (pos1 == 0) { + if (changed.includes(from.link)) return true; return changed2.includes(to.link); } - if(changed2.includes(from.link)) return true; + if (changed2.includes(from.link)) return true; return changed.includes(to.link); }); - next.set('processAI',function(list){ - var cards1=list[0][1].slice(),cards2=list[1][1].slice(); - var card1=cards1.sort((a,b)=>get.value(b)-get.value(a))[0]; - var card2=cards2.sort((a,b)=>get.value(a)-get.value(b))[0]; - if(card1&&card2&&get.value(card1)>get.value(card2)){ + next.set("processAI", function (list) { + var cards1 = list[0][1].slice(), + cards2 = list[1][1].slice(); + var card1 = cards1.sort((a, b) => get.value(b) - get.value(a))[0]; + var card2 = cards2.sort((a, b) => get.value(a) - get.value(b))[0]; + if (card1 && card2 && get.value(card1) > get.value(card2)) { cards1.remove(card1); cards2.remove(card2); cards1.push(card2); cards2.push(card1); } - return [cards1,cards2]; + return [cards1, cards2]; }); - 'step 4' - var moved=result.moved; - var hs=player.getCards('h'),ts=event.cards; - var card1,card2; - for(var i of moved[0]){ - if(!ts.includes(i)) card1=i; + ("step 4"); + var moved = result.moved; + var hs = player.getCards("h"), + ts = event.cards; + var card1, card2; + for (var i of moved[0]) { + if (!ts.includes(i)) card1 = i; } - for(var i of moved[1]){ - if(!hs.includes(i)) card2=i; + for (var i of moved[1]) { + if (!hs.includes(i)) card2 = i; } - if(card1&&card2){ - player.$throw(1,1000); - event.cards.forEach((i,ind,arr)=>{ - if(i==card2) arr[ind]=card1; - }) - player.lose(card1,ui.cardPile).set('insert_index',event=>event.cardx).set('cardx',card2); - player.gain(card2,'draw'); - game.log(player,'交换了一张牌'); + if (card1 && card2) { + player.$throw(1, 1000); + event.cards.forEach((i, ind, arr) => { + if (i == card2) arr[ind] = card1; + }); + player + .lose(card1, ui.cardPile) + .set("insert_index", (event) => event.cardx) + .set("cardx", card2); + player.gain(card2, "draw"); + game.log(player, "交换了一张牌"); } - 'step 5' + ("step 5"); game.cardsGotoOrdering(event.cards); - 'step 6' - if(event.cards.length==1) event._result={bool:true,links:event.cards}; - else player.chooseButton(['骋烈:将这些牌置于目标角色的武将牌上',event.cards],true); + ("step 6"); + if (event.cards.length == 1) event._result = { bool: true, links: event.cards }; + else player.chooseButton(["骋烈:将这些牌置于目标角色的武将牌上", event.cards], true); game.updateRoundNumber(); - 'step 7' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget('将'+get.translation(card)+'置于一名目标角色的武将牌上',true,(card,player,target)=>{ - return _status.event.getTrigger().targets.includes(target)&&!_status.event.getParent().given.includes(target); - }).set('ai',target=>{ - var color=_status.event.color,player=_status.event.player; - var evt=_status.event.getTrigger(); - if(color=='red'){ - var eff=get.effect(target,evt.card,player,target),att=get.attitude(player,target); - if(eff>=0&&att<0) return -1; - if(eff<0&&att<0&&target.hasCard(card=>['shan','caochuan'].includes(get.name(card)),'hs')) return 10; - } - return 1; - }).set('color',get.color(card)); - } - else event.finish(); - 'step 8' - if(result.bool){ - var target=result.targets[0]; + ("step 7"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget( + "将" + get.translation(card) + "置于一名目标角色的武将牌上", + true, + (card, player, target) => { + return ( + _status.event.getTrigger().targets.includes(target) && + !_status.event.getParent().given.includes(target) + ); + } + ) + .set("ai", (target) => { + var color = _status.event.color, + player = _status.event.player; + var evt = _status.event.getTrigger(); + if (color == "red") { + var eff = get.effect(target, evt.card, player, target), + att = get.attitude(player, target); + if (eff >= 0 && att < 0) return -1; + if ( + eff < 0 && + att < 0 && + target.hasCard( + (card) => ["shan", "caochuan"].includes(get.name(card)), + "hs" + ) + ) + return 10; + } + return 1; + }) + .set("color", get.color(card)); + } else event.finish(); + ("step 8"); + if (result.bool) { + var target = result.targets[0]; player.line(target); event.given.push(target); - target.addToExpansion(card).gaintag.add('olchenglie'); - player.addTempSkill('olchenglie_effect','phaseUseAfter'); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.olchenglie=player; - target.storage.olchenglie_viewer=player; + target.addToExpansion(card).gaintag.add("olchenglie"); + player.addTempSkill("olchenglie_effect", "phaseUseAfter"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.olchenglie = player; + target.storage.olchenglie_viewer = player; event.cards.remove(card); - var cardx=player==game.me||player.isUnderControl()?card:1; - player.$give(cardx,target,false); - } - else event.finish(); - 'step 9' - if(event.cards.length) event.goto(6); - else if(!event.isMine()&&!event.isOnline()) game.delayx(); + var cardx = player == game.me || player.isUnderControl() ? card : 1; + player.$give(cardx, target, false); + } else event.finish(); + ("step 9"); + if (event.cards.length) event.goto(6); + else if (!event.isMine() && !event.isOnline()) game.delayx(); }, - marktext:'骋', - intro:{ - markcount:'expansion', - mark:function(dialog,content,player){ - var content=player.getExpansions('olchenglie'); - if(content&&content.length){ - if(game.me==player.storage.olchenglie_viewer){ + marktext: "骋", + intro: { + markcount: "expansion", + mark: function (dialog, content, player) { + var content = player.getExpansions("olchenglie"); + if (content && content.length) { + if (game.me == player.storage.olchenglie_viewer) { dialog.addAuto(content); - } - else{ - return '有'+get.cnNumber(content.length)+'张扣置的“骋烈”牌'; + } else { + return "有" + get.cnNumber(content.length) + "张扣置的“骋烈”牌"; } } }, - content:function(content,player){ - var content=player.getExpansions('olchenglie'); - if(content&&content.length){ - if(game.me==player.storage.olchenglie_viewer){ + content: function (content, player) { + var content = player.getExpansions("olchenglie"); + if (content && content.length) { + if (game.me == player.storage.olchenglie_viewer) { return get.translation(content); } - return '有'+get.cnNumber(content.length)+'张扣置的“骋烈”牌'; + return "有" + get.cnNumber(content.length) + "张扣置的“骋烈”牌"; } - } + }, }, - subSkill:{ - effect:{ - trigger:{global:'useCardAfter'}, - forced:true, - charlotte:true, - forceDie:true, - popup:false, - filter:function(event,player){ - return event.card.storage&&event.card.storage.olchenglie; + subSkill: { + effect: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + forceDie: true, + popup: false, + filter: function (event, player) { + return event.card.storage && event.card.storage.olchenglie; }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>{ - var cards=current.getExpansions('olchenglie'); - return cards.some(i=>get.color(i,false)=='red'); - }).sortBySeat(); - event.targets=targets; - var togive=trigger.card.storage.olchenglie; - event.togive=togive; - if(!targets.length||!togive.isIn()) event.goto(3); - 'step 1' - var target=event.targets.shift(); - event.target=target; + content: function () { + "step 0"; + var targets = game + .filterPlayer((current) => { + var cards = current.getExpansions("olchenglie"); + return cards.some((i) => get.color(i, false) == "red"); + }) + .sortBySeat(); + event.targets = targets; + var togive = trigger.card.storage.olchenglie; + event.togive = togive; + if (!targets.length || !togive.isIn()) event.goto(3); + ("step 1"); + var target = event.targets.shift(); + event.target = target; player.line(target); - if(target.hasHistory('useCard',evt=>{ - return evt.respondTo&&evt.respondTo[1]==trigger.card; - })){ - if(target.countCards('he')) target.chooseCard('骋烈:交给'+get.translation(event.togive)+'一张牌',true,'he'); - } - else{ + if ( + target.hasHistory("useCard", (evt) => { + return evt.respondTo && evt.respondTo[1] == trigger.card; + }) + ) { + if (target.countCards("he")) + target.chooseCard( + "骋烈:交给" + get.translation(event.togive) + "一张牌", + true, + "he" + ); + } else { target.recover(); } - 'step 2' - if(result.bool){ - target.give(result.cards,event.togive); + ("step 2"); + if (result.bool) { + target.give(result.cards, event.togive); } - if(targets.length) event.goto(1); - 'step 3' - game.filterPlayer(current=>{ - var cards=current.getExpansions('olchenglie'); + if (targets.length) event.goto(1); + ("step 3"); + game.filterPlayer((current) => { + var cards = current.getExpansions("olchenglie"); return cards.length; - }).forEach(i=>{ - i.loseToDiscardpile(i.getExpansions('olchenglie')); + }).forEach((i) => { + i.loseToDiscardpile(i.getExpansions("olchenglie")); delete i.storage.olchenglie_viewer; }); - } - } + }, + }, }, }, //新贺齐 - olqizhou:{ - audio:'qizhou', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter','phaseBefore'], + olqizhou: { + audio: "qizhou", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + "phaseBefore", + ], }, - forced:true, - onremove:true, - filter:function(event,player){ - if(event.name!='phase'&&(event.name!='equip'||event.player!=player)){ - var evt=event.getl(player); - if(!evt||!evt.es||!evt.es.length) return false; + forced: true, + onremove: true, + filter: function (event, player) { + if (event.name != "phase" && (event.name != "equip" || event.player != player)) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.length) return false; } - var num=player.countMark('olqizhou'); - return lib.skill.olqizhou.getSuitNum(player)!=num; + var num = player.countMark("olqizhou"); + return lib.skill.olqizhou.getSuitNum(player) != num; }, - content:function(){ + content: function () { lib.skill.olqizhou.applyChange(player); }, - getSuitNum:function(player){ - var suits=[],es=player.getCards('e'); - for(var i of es) suits.add(get.suit(i,player)); - return Math.min(4,suits.length); + getSuitNum: function (player) { + var suits = [], + es = player.getCards("e"); + for (var i of es) suits.add(get.suit(i, player)); + return Math.min(4, suits.length); }, - applyChange:function(player){ - player.removeAdditionalSkill('olqizhou'); - var num=lib.skill.olqizhou.getSuitNum(player); - player.storage.olqizhou=num; - if(num>0) player.addAdditionalSkill('olqizhou',lib.skill.olqizhou.derivation.slice(0,num)); + applyChange: function (player) { + player.removeAdditionalSkill("olqizhou"); + var num = lib.skill.olqizhou.getSuitNum(player); + player.storage.olqizhou = num; + if (num > 0) + player.addAdditionalSkill("olqizhou", lib.skill.olqizhou.derivation.slice(0, num)); }, - derivation:['reduanbing','reyingzi','fenwei','lanjiang'], + derivation: ["reduanbing", "reyingzi", "fenwei", "lanjiang"], }, - olshanxi:{ - audio:'shanxi', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('e')<5&&game.hasPlayer((current)=>lib.skill.olshanxi.filterTarget(null,player,current)); + olshanxi: { + audio: "shanxi", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("e") < 5 && + game.hasPlayer((current) => lib.skill.olshanxi.filterTarget(null, player, current)) + ); }, - filterTarget:function(card,player,target){ - return (target!=player&&player.countCards('h')+target.countCards('h')>0&&!player.inRangeOf(target)); + filterTarget: function (card, player, target) { + return ( + target != player && + player.countCards("h") + target.countCards("h") > 0 && + !player.inRangeOf(target) + ); }, - content:function(){ - 'step 0' - var cards1=player.getCards('h'),cards2=target.getCards('h'); - var num=5-player.countCards('e'); - var dialog=['闪袭:选择展示至多'+get.cnNumber(num)+'张牌']; - if(cards1.length>0){ + content: function () { + "step 0"; + var cards1 = player.getCards("h"), + cards2 = target.getCards("h"); + var num = 5 - player.countCards("e"); + var dialog = ["闪袭:选择展示至多" + get.cnNumber(num) + "张牌"]; + if (cards1.length > 0) { dialog.push('
    你的手牌
    '); dialog.push(cards1); } - if(cards2.length>0){ - dialog.push('
    '+get.translation(target)+'的手牌
    '); - if(player.hasSkillTag('viewHandcard',null,target,true)) dialog.push(cards2); - else dialog.push([cards2.randomSort(),'blank']); + if (cards2.length > 0) { + dialog.push('
    ' + get.translation(target) + "的手牌
    "); + if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(cards2); + else dialog.push([cards2.randomSort(), "blank"]); } - player.chooseButton(dialog,[1,num],true).set('ai',function(button){ - var player=_status.event.player,target=_status.event.getParent().target; - var card=button.link,cards=ui.selected.buttons.map(button=>button.link); - var hs=player.getCards('h'),discard=false; - for(var i of cards){ - if(hs.includes(i)){ - discard=true; + player.chooseButton(dialog, [1, num], true).set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getParent().target; + var card = button.link, + cards = ui.selected.buttons.map((button) => button.link); + var hs = player.getCards("h"), + discard = false; + for (var i of cards) { + if (hs.includes(i)) { + discard = true; break; } } - if(hs.includes(card)){ - if(discard||get.name(card)!='shan') return 0; - if(target.hasCard(card=>get.value(card,target)>5,'e')) return 2; + if (hs.includes(card)) { + if (discard || get.name(card) != "shan") return 0; + if (target.hasCard((card) => get.value(card, target) > 5, "e")) return 2; return 0; } - if(discard&&!target.hasCard(function(cardx){ - return cardx!=card&&!cards.includes(cardx)&&get.value(cardx,target)>0; - },'he')) return 0; - return 1+Math.random(); + if ( + discard && + !target.hasCard(function (cardx) { + return ( + cardx != card && !cards.includes(cardx) && get.value(cardx, target) > 0 + ); + }, "he") + ) + return 0; + return 1 + Math.random(); }); - 'step 1' - if(result.bool){ - event.cards=result.links; - var list1=[],list2=[]; - var hs=player.getCards('h'); - for(var card of result.links){ - if(hs.includes(card)){ + ("step 1"); + if (result.bool) { + event.cards = result.links; + var list1 = [], + list2 = []; + var hs = player.getCards("h"); + for (var card of result.links) { + if (hs.includes(card)) { list1.push(card); - } - else{ + } else { list2.push(card); } } - event.list1=list1; - event.list2=list2; - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,target,list1,list2,id){ - var dialog=ui.create.dialog(player+'对'+target+'发动了【闪袭】'); - dialog.videoId=id; - if(list1.length>0){ - dialog.add('
    '+player+'展示的牌
    '); - dialog.add(list1); - } - if(list2.length>0){ - dialog.add('
    '+target+'被展示的牌
    '); - dialog.add(list2); - } - },get.translation(player),get.translation(target),list1,list2,event.videoId) + event.list1 = list1; + event.list2 = list2; + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, target, list1, list2, id) { + var dialog = ui.create.dialog(player + "对" + target + "发动了【闪袭】"); + dialog.videoId = id; + if (list1.length > 0) { + dialog.add('
    ' + player + "展示的牌
    "); + dialog.add(list1); + } + if (list2.length > 0) { + dialog.add('
    ' + target + "被展示的牌
    "); + dialog.add(list2); + } + }, + get.translation(player), + get.translation(target), + list1, + list2, + event.videoId + ); game.delay(4); - } - else event.finish(); - 'step 2' - game.broadcastAll('closeDialog',event.videoId); - var list1=event.list1.filter((card)=>get.name(card,player)=='shan'); - var list2=event.list2.filter((card)=>get.name(card,target)=='shan'); - if(list1.length&&list2.length){ + } else event.finish(); + ("step 2"); + game.broadcastAll("closeDialog", event.videoId); + var list1 = event.list1.filter((card) => get.name(card, player) == "shan"); + var list2 = event.list2.filter((card) => get.name(card, target) == "shan"); + if (list1.length && list2.length) { game.loseAsync({ - lose_list:[ - [player,list1], - [target,list2] + lose_list: [ + [player, list1], + [target, list2], ], - discarder:player, - }).setContent('discardMultiple'); - } - else if(list2.length){ + discarder: player, + }).setContent("discardMultiple"); + } else if (list2.length) { target.discard(list2); - } - else if(list1.length) player.discard(list1); + } else if (list1.length) player.discard(list1); else event.finish(); - 'step 3' - if(target.hasCard(function(card){ - return !cards.includes(card)&&lib.filter.canBeGained(card,player,target); - },'he')) player.gainPlayerCard(target,true,'he').set('filterButton',function(button){ - return !_status.event.cards.includes(button.link); - }).set('cards',cards); + ("step 3"); + if ( + target.hasCard(function (card) { + return !cards.includes(card) && lib.filter.canBeGained(card, player, target); + }, "he") + ) + player + .gainPlayerCard(target, true, "he") + .set("filterButton", function (button) { + return !_status.event.cards.includes(button.link); + }) + .set("cards", cards); }, - ai:{ - order:14, - result:{ - target:function(player,target){ - return -target.countCards('h'); + ai: { + order: 14, + result: { + target: function (player, target) { + return -target.countCards("h"); }, }, }, }, //刘巴 - oltongduo:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('oltongduo'),function(card,player,target){ - return target!=player&&target.countCards('h')>0; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0) return Math.sqrt(att)/10; - return 5-att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('oltongduo',target); - target.chooseCard('h',true,'统度:将一张手牌交给'+get.translation(player)+',然后其于此阶段结束时将此牌置于牌堆顶'); - } - else{ + oltongduo: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("oltongduo"), function (card, player, target) { + return target != player && target.countCards("h") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oltongduo", target); + target.chooseCard( + "h", + true, + "统度:将一张手牌交给" + + get.translation(player) + + ",然后其于此阶段结束时将此牌置于牌堆顶" + ); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.addTempSkill('oltongduo_put'); - event.target.give(result.cards,player,true).gaintag.add('oltongduo'); + ("step 2"); + if (result.bool) { + player.addTempSkill("oltongduo_put"); + event.target.give(result.cards, player, true).gaintag.add("oltongduo"); } }, - subSkill:{ - put:{ - trigger:{player:'phaseUseEnd'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return player.hasCard(card=>card.hasGaintag('oltongduo'),'h'); + subSkill: { + put: { + trigger: { player: "phaseUseEnd" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.hasCard((card) => card.hasGaintag("oltongduo"), "h"); }, - content:function(){ - var cards=player.getCards('h',card=>card.hasGaintag('oltongduo')); - player.lose(cards,ui.cardPile,'insert'); - game.log(player,'将',get.cnNumber(cards.length)+'张牌','置于牌堆顶'); - game.broadcastAll(function(player){ - var cardx=ui.create.card(); - cardx.classList.add('infohidden'); - cardx.classList.add('infoflip'); - player.$throw(cardx,1000,'nobroadcast'); - },player); + content: function () { + var cards = player.getCards("h", (card) => card.hasGaintag("oltongduo")); + player.lose(cards, ui.cardPile, "insert"); + game.log(player, "将", get.cnNumber(cards.length) + "张牌", "置于牌堆顶"); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, player); }, - onremove:function(player){ - player.removeGaintag('oltongduo'); + onremove: function (player) { + player.removeGaintag("oltongduo"); }, - } - } + }, + }, }, - olzhubi:{ - audio:2, - enable:'phaseUse', - group:'olzhubi_replace', - filter:function(event,player){ - return (player.getStat('skill').olzhubi||0)0; + filterTarget: function (card, player, target) { + return target.countCards("he") > 0; }, - content:function(){ - 'step 0' - target.chooseCard('he',true,'铸币:请重铸一张牌',lib.filter.cardRecastable); - 'step 1' - if(result.bool){ - target.recast(result.cards,null,player=>player.draw().set('log',false).gaintag=['olzhubi_tag']); + content: function () { + "step 0"; + target.chooseCard("he", true, "铸币:请重铸一张牌", lib.filter.cardRecastable); + ("step 1"); + if (result.bool) { + target.recast( + result.cards, + null, + (player) => (player.draw().set("log", false).gaintag = ["olzhubi_tag"]) + ); } }, - ai:{ - order:6, - result:{ - target:function(player,target){ - if(target.hasCard(card=>card.hasGaintag('olzhubi_tag'),'h')) return 0.5; + ai: { + order: 6, + result: { + target: function (player, target) { + if (target.hasCard((card) => card.hasGaintag("olzhubi_tag"), "h")) return 0.5; return 1; - } - } - }, - subSkill:{ - replace:{ - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player.hasCard(card=>card.hasGaintag('olzhubi_tag'),'h'); }, - forced:true, - locked:false, - logTarget:'player', - content:function(){ - 'step 0' - var cards=get.bottomCards(5); - event.cards2=cards; + }, + }, + subSkill: { + replace: { + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.hasCard((card) => card.hasGaintag("olzhubi_tag"), "h"); + }, + forced: true, + locked: false, + logTarget: "player", + content: function () { + "step 0"; + var cards = get.bottomCards(5); + event.cards2 = cards; game.cardsGotoOrdering(cards); - var player=trigger.player; - var next=player.chooseToMove('铸币:用任意“币”交换牌堆底等量张牌'); - var hs=player.getCards('h',card=>card.hasGaintag('olzhubi_tag')); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + var player = trigger.player; + var next = player.chooseToMove("铸币:用任意“币”交换牌堆底等量张牌"); + var hs = player.getCards("h", (card) => card.hasGaintag("olzhubi_tag")); + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('list',[ - ['牌堆底',cards], - ['你的手牌',hs,'olzhubi_tag'] + next.set("list", [ + ["牌堆底", cards], + ["你的手牌", hs, "olzhubi_tag"], ]); - next.set('processAI',function(list){ - var all=list[0][1].concat(list[1][1]),cards=all.slice(0); - var num=_status.event.num; - cards.sort(function(a,b){ - return get.value(b)-get.value(a); + next.set("processAI", function (list) { + var all = list[0][1].concat(list[1][1]), + cards = all.slice(0); + var num = _status.event.num; + cards.sort(function (a, b) { + return get.value(b) - get.value(a); }); - return [cards.slice(num),cards.slice(0,num)]; + return [cards.slice(num), cards.slice(0, num)]; }); - next.set('num',hs.length); - 'step 1' - if(result.bool){ - event.forceDie=true; - var cards=result.moved[0]; - event.cards=cards; - var player=trigger.player; - var hs=player.getCards('h'); - var lose=[],gain=event.cards2; - for(var i of cards){ - if(hs.includes(i)) lose.push(i); + next.set("num", hs.length); + ("step 1"); + if (result.bool) { + event.forceDie = true; + var cards = result.moved[0]; + event.cards = cards; + var player = trigger.player; + var hs = player.getCards("h"); + var lose = [], + gain = event.cards2; + for (var i of cards) { + if (hs.includes(i)) lose.push(i); else gain.remove(i); } - if(lose.length) player.lose(lose,ui.cardPile); - if(gain.length) player.gain(gain,'draw'); - } - else event.finish(); - 'step 2' - for(var i of cards){ - if(!(('hejsdx').includes(get.position(i,true)))){ + if (lose.length) player.lose(lose, ui.cardPile); + if (gain.length) player.gain(gain, "draw"); + } else event.finish(); + ("step 2"); + for (var i of cards) { + if (!"hejsdx".includes(get.position(i, true))) { i.fix(); ui.cardPile.appendChild(i); } } game.updateRoundNumber(); - } + }, }, - } + }, }, //傅肜 - olxiaosi:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.countCards('h')>0&&player!=target; + olxiaosi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h") > 0 && player != target; }, - filterCard:function(card,player,target){ - return get.type(card)=='basic'; + filterCard: function (card, player, target) { + return get.type(card) == "basic"; }, - check:function(card){ - var player=_status.event.player; - if(player.hasValueTarget(card)) return 10-get.value(card); + check: function (card) { + var player = _status.event.player; + if (player.hasValueTarget(card)) return 10 - get.value(card); return 0.1; }, - content:function(){ - 'step 0' - if(target.countCards('h',card=>{ - return get.type(card)=='basic'&&lib.filter.cardDiscardable(card,target,'olxiaosi'); - })==0) event.draw=true; - else{ - target.chooseToDiscard('h',true,'效死:弃置一张基本牌',{type:'basic'}); + content: function () { + "step 0"; + if ( + target.countCards("h", (card) => { + return ( + get.type(card) == "basic" && + lib.filter.cardDiscardable(card, target, "olxiaosi") + ); + }) == 0 + ) + event.draw = true; + else { + target.chooseToDiscard("h", true, "效死:弃置一张基本牌", { type: "basic" }); } - 'step 1' - var cards2=cards.slice(0); - if(result.bool){ - cards2=cards2.addArray(result.cards); + ("step 1"); + var cards2 = cards.slice(0); + if (result.bool) { + cards2 = cards2.addArray(result.cards); } - event.cards2=cards2; - 'step 2' - var cardsx=event.cards2.filter(i=>get.position(i,true)=='d'&&player.hasUseTarget(i,false)); - if(!cardsx.length) event.goto(5); - else player.chooseButton(['效死:是否使用其中的一张牌?',cardsx]).set('filterButton',button=>{ - return _status.event.player.hasUseTarget(button.link,false); - }).set('ai',button=>{ - if(button.link.name=='jiu') return 10; - return _status.event.player.getUseValue(button.link); - }); - 'step 3' - if(result.bool){ - var card=result.links[0]; + event.cards2 = cards2; + ("step 2"); + var cardsx = event.cards2.filter( + (i) => get.position(i, true) == "d" && player.hasUseTarget(i, false) + ); + if (!cardsx.length) event.goto(5); + else + player + .chooseButton(["效死:是否使用其中的一张牌?", cardsx]) + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget(button.link, false); + }) + .set("ai", (button) => { + if (button.link.name == "jiu") return 10; + return _status.event.player.getUseValue(button.link); + }); + ("step 3"); + if (result.bool) { + var card = result.links[0]; event.cards2.remove(card); - player.$gain2(card,false); + player.$gain2(card, false); game.delayx(); - player.chooseUseTarget(true,card,false,'nodistance'); - } - else event.goto(5); - 'step 4' - if(event.cards2.filter(i=>get.position(i,true)=='d'&&player.hasUseTarget(i,false)).length) event.goto(2); - 'step 5' - if(event.draw) player.draw(); + player.chooseUseTarget(true, card, false, "nodistance"); + } else event.goto(5); + ("step 4"); + if ( + event.cards2.filter( + (i) => get.position(i, true) == "d" && player.hasUseTarget(i, false) + ).length + ) + event.goto(2); + ("step 5"); + if (event.draw) player.draw(); + }, + ai: { + order: 4.5, + result: { + player: 1, + target: -1, + }, }, - ai:{ - order:4.5, - result:{ - player:1, - target:-1 - } - } }, //阿会喃 - jueman:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - direct:true, - filter:function(event,player){ - var history=game.getGlobalHistory('useCard',evt=>{ - return get.type(evt.card)=='basic'; + jueman: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + direct: true, + filter: function (event, player) { + var history = game.getGlobalHistory("useCard", (evt) => { + return get.type(evt.card) == "basic"; }); - if(history.length<2) return false; - var users=history.slice(0,2).map(i=>i.player); - var list=users.filter(user=>user==player); - if(list.length==1) return true; - if(list.length==0){ - var evtx=history[2]; - if(evtx){ - var name=evtx.card.name,nature=evtx.card.nature; - if(evtx&&player.hasUseTarget({name:name,nature:nature,isCard:true})) return true; + if (history.length < 2) return false; + var users = history.slice(0, 2).map((i) => i.player); + var list = users.filter((user) => user == player); + if (list.length == 1) return true; + if (list.length == 0) { + var evtx = history[2]; + if (evtx) { + var name = evtx.card.name, + nature = evtx.card.nature; + if (evtx && player.hasUseTarget({ name: name, nature: nature, isCard: true })) + return true; } } return false; }, - content:function(){ - 'step 0' - var history=game.getGlobalHistory('useCard',evt=>{ - return get.type(evt.card)=='basic'; + content: function () { + "step 0"; + var history = game.getGlobalHistory("useCard", (evt) => { + return get.type(evt.card) == "basic"; }); - var list=history.slice(0,2).map(i=>i.player).filter(user=>user==player); - if(list.length==1) { - player.logSkill('jueman'); + var list = history + .slice(0, 2) + .map((i) => i.player) + .filter((user) => user == player); + if (list.length == 1) { + player.logSkill("jueman"); player.draw(); + } else if (list.length == 0) { + var evtx = history[2], + name = evtx.card.name, + nature = evtx.card.nature; + player + .chooseUseTarget({ name: name, nature: nature, isCard: true }, true) + .set("logSkill", "jueman"); } - else if(list.length==0){ - var evtx=history[2],name=evtx.card.name,nature=evtx.card.nature; - player.chooseUseTarget({name:name,nature:nature,isCard:true},true).set('logSkill','jueman'); - } - } + }, }, //张芝 - olbixin:{ - audio:2, - trigger:{ - global:['phaseZhunbeiBegin','phaseJieshuBegin'], + olbixin: { + audio: 2, + trigger: { + global: ["phaseZhunbeiBegin", "phaseJieshuBegin"], }, - direct:true, - onremove:['olbixin','olbixin_basic','olbixin_trick','olbixin_equip'], - group:'olbixin_full', - map:{基本:'basic',锦囊:'trick',装备:'equip'}, - filter:function(event,player){ - var count=player.countMark('olbixin'); - if(count>0&&event.player!=player) return false; - if(count>1&&event.name=='phaseZhunbei') return false; - if(count>2) return false; - var num=count>=3?3:1; - var types=['basic','trick','equip'].filter(type=>{ - return player.countMark('olbixin_'+type) 0 && event.player != player) return false; + if (count > 1 && event.name == "phaseZhunbei") return false; + if (count > 2) return false; + var num = count >= 3 ? 3 : 1; + var types = ["basic", "trick", "equip"].filter((type) => { + return player.countMark("olbixin_" + type) < num; }); - if(!types.length) return false; - return lib.skill.olbixin.getList(player).length>0; + if (!types.length) return false; + return lib.skill.olbixin.getList(player).length > 0; }, - getList:function(player,event){ - var natures=lib.inpile_nature.slice(0),used=[]; - var history=player.actionHistory; - for(var i=history.length-1;i>=0;i--){ - var info=history[i]; - for(var evt of info.useCard){ - var name=evt.card.name; - if(get.type(name)!='basic') continue; - if(name=='sha'){ - if(evt.card.nature) natures.remove(evt.card.nature); + getList: function (player, event) { + var natures = lib.inpile_nature.slice(0), + used = []; + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + var info = history[i]; + for (var evt of info.useCard) { + var name = evt.card.name; + if (get.type(name) != "basic") continue; + if (name == "sha") { + if (evt.card.nature) natures.remove(evt.card.nature); else used.push(name); - } - else used.push(name); + } else used.push(name); } - if(info.isRound) break; + if (info.isRound) break; } - var vcards=[]; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - if(!event){ - if(name=='sha'){ - if(!used.includes('sha')&&player.hasUseTarget({name:'sha'})) vcards.push(['基本','','sha']); - for(var nature of natures) { - if(player.hasUseTarget({name:'sha',nature:nature})) vcards.push(['基本','','sha',nature]); + var vcards = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (!event) { + if (name == "sha") { + if (!used.includes("sha") && player.hasUseTarget({ name: "sha" })) + vcards.push(["基本", "", "sha"]); + for (var nature of natures) { + if (player.hasUseTarget({ name: "sha", nature: nature })) + vcards.push(["基本", "", "sha", nature]); } - } - else if(!used.includes(name)&&player.hasUseTarget({name:name})) vcards.push(['基本','',name]); - } - else{ - if(name=='sha'){ - if(!used.includes('sha')&&event.filterCard({name:'sha'},player,event)) vcards.push(['基本','','sha']); - for(var nature of natures) { - if(event.filterCard({name:'sha',nature:nature},player,event)) vcards.push(['基本','','sha',nature]); + } else if (!used.includes(name) && player.hasUseTarget({ name: name })) + vcards.push(["基本", "", name]); + } else { + if (name == "sha") { + if (!used.includes("sha") && event.filterCard({ name: "sha" }, player, event)) + vcards.push(["基本", "", "sha"]); + for (var nature of natures) { + if (event.filterCard({ name: "sha", nature: nature }, player, event)) + vcards.push(["基本", "", "sha", nature]); } - } - else if(!used.includes(name)&&event.filterCard({name:name},player,event)) vcards.push(['基本','',name]); + } else if ( + !used.includes(name) && + event.filterCard({ name: name }, player, event) + ) + vcards.push(["基本", "", name]); } } return vcards; }, - content:function(){ - 'step 0' - var types=['basic','trick','equip']; - var list=lib.skill.olbixin.getList(player); - if(list.length){ - var dialog=['###'+get.prompt('olbixin')+'###
    摸'+get.cnNumber(player.countMark('olbixin')>=3?1:3)+'张牌,然后将所有指定类型的手牌当一张基本牌使用
    ']; - dialog.push([types.map(i=>get.translation(i)),'tdnodes']); - dialog.push([list,'vcard']); - player.chooseButton(dialog,2).set('filterButton',button=>{ - var player=_status.event.player,count=player.countMark('olbixin'),num=count>=3?3:1; - var type=typeof button.link; - if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; - if(type=='string'&&player.countMark('olbixin_'+lib.skill.olbixin.map[button.link])>=num) return false; - if(type!='string'&&!player.hasUseTarget({name:button.link[2],nature:button.link[3]})) return false; - return true; - }).set('ai',button=>{ - var list=_status.event.list; - var type=typeof button.link; - if(type=='string') return (1.2-list.indexOf(lib.skill.olbixin.map[button.link]))*10; - return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); - }).set('list',types.map(i=>[i,player.getCards('h',{type:i}).map(i=>get.value(i)).reduce((p,c)=>p+c,0)]).sort((a,b)=>a[1]-b[1]).map(i=>i[0])); - }else event.finish(); - 'step 1' - if(result.bool){ - if(typeof result.links[0]!='string') result.links.reverse(); - var type=result.links[0],name=result.links[1][2],nature=result.links[1][3]; - player.logSkill('olbixin'); - game.log(player,'声明了',type+'牌'); - type=lib.skill.olbixin.map[type]; - event.type=type; - event.card={name:name,nature:nature}; - player.addMark('olbixin_'+type,1,false); - player.draw(player.countMark('olbixin')>=3?1:3); + content: function () { + "step 0"; + var types = ["basic", "trick", "equip"]; + var list = lib.skill.olbixin.getList(player); + if (list.length) { + var dialog = [ + "###" + + get.prompt("olbixin") + + '###
    摸' + + get.cnNumber(player.countMark("olbixin") >= 3 ? 1 : 3) + + "张牌,然后将所有指定类型的手牌当一张基本牌使用
    ", + ]; + dialog.push([types.map((i) => get.translation(i)), "tdnodes"]); + dialog.push([list, "vcard"]); + player + .chooseButton(dialog, 2) + .set("filterButton", (button) => { + var player = _status.event.player, + count = player.countMark("olbixin"), + num = count >= 3 ? 3 : 1; + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) + return false; + if ( + type == "string" && + player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]) >= num + ) + return false; + if ( + type != "string" && + !player.hasUseTarget({ name: button.link[2], nature: button.link[3] }) + ) + return false; + return true; + }) + .set("ai", (button) => { + var list = _status.event.list; + var type = typeof button.link; + if (type == "string") + return (1.2 - list.indexOf(lib.skill.olbixin.map[button.link])) * 10; + return _status.event.player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }) + .set( + "list", + types + .map((i) => [ + i, + player + .getCards("h", { type: i }) + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0), + ]) + .sort((a, b) => a[1] - b[1]) + .map((i) => i[0]) + ); + } else event.finish(); + ("step 1"); + if (result.bool) { + if (typeof result.links[0] != "string") result.links.reverse(); + var type = result.links[0], + name = result.links[1][2], + nature = result.links[1][3]; + player.logSkill("olbixin"); + game.log(player, "声明了", type + "牌"); + type = lib.skill.olbixin.map[type]; + event.type = type; + event.card = { name: name, nature: nature }; + player.addMark("olbixin_" + type, 1, false); + player.draw(player.countMark("olbixin") >= 3 ? 1 : 3); game.delayx(); - }else event.finish(); - 'step 2' - if(player.hasCard(card=>get.type2(card)==event.type,'h')){ - var cards=player.getCards('h',card=>get.type2(card)==event.type); - var cardx=get.autoViewAs(card,cards); - if(player.hasUseTarget(cardx,true,false)){ - player.chooseUseTarget(cardx,cards,true,false).set('prompt','选择'+get.translation(cardx)+'('+get.translation(cards)+')的目标'); + } else event.finish(); + ("step 2"); + if (player.hasCard((card) => get.type2(card) == event.type, "h")) { + var cards = player.getCards("h", (card) => get.type2(card) == event.type); + var cardx = get.autoViewAs(card, cards); + if (player.hasUseTarget(cardx, true, false)) { + player + .chooseUseTarget(cardx, cards, true, false) + .set( + "prompt", + "选择" + + get.translation(cardx) + + "(" + + get.translation(cards) + + ")的目标" + ); } } }, - subSkill:{ - full:{ - enable:'chooseToUse', - filter:function(event,player){ - if(event.olbixin) return false; - var count=player.countMark('olbixin'); - if(count<=2) return false; - var num=count>=3?3:1; - var types=['basic','trick','equip'].filter(type=>{ - return player.countMark('olbixin_'+type)= 3 ? 3 : 1; + var types = ["basic", "trick", "equip"].filter((type) => { + return player.countMark("olbixin_" + type) < num; }); - if(!types.length) return false; - return lib.skill.olbixin.getList(player,event).length>0; + if (!types.length) return false; + return lib.skill.olbixin.getList(player, event).length > 0; }, - prompt:'你可以声明一种牌的类型(每种类型限三次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸一张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。', - chooseButton:{ - dialog:function(event,player){ - var list=lib.skill.olbixin.getList(player,event); - var types=['basic','trick','equip']; + prompt: "你可以声明一种牌的类型(每种类型限三次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸一张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。", + chooseButton: { + dialog: function (event, player) { + var list = lib.skill.olbixin.getList(player, event); + var types = ["basic", "trick", "equip"]; return ui.create.dialog( '###笔心###
    摸一张牌,然后将所有指定类型的手牌当一张基本牌使用
    ', - [types.map(i=>get.translation(i)),'tdnodes'], - [list,'vcard'] + [types.map((i) => get.translation(i)), "tdnodes"], + [list, "vcard"] ); }, - filter:function(button,player){ - var player=_status.event.player,count=player.countMark('olbixin'),num=count>=3?3:1; - var type=typeof button.link; - if(ui.selected.buttons.length&&type==typeof ui.selected.buttons[0].link) return false; - if(type=='string'&&player.countMark('olbixin_'+lib.skill.olbixin.map[button.link])>=num) return false; - if(type!='string'&&!_status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent())) return false; + filter: function (button, player) { + var player = _status.event.player, + count = player.countMark("olbixin"), + num = count >= 3 ? 3 : 1; + var type = typeof button.link; + if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link) + return false; + if ( + type == "string" && + player.countMark("olbixin_" + lib.skill.olbixin.map[button.link]) >= num + ) + return false; + if ( + type != "string" && + !_status.event + .getParent() + .filterCard( + { name: button.link[2], nature: button.link[3] }, + player, + _status.event.getParent() + ) + ) + return false; return true; }, - select:2, - check:function(button){ - var types=['basic','trick','equip']; - var type=typeof button.link; - var player=_status.event.player; - var list=types.map(i=>[i,player.getCards('h',{type:i}).map(i=>get.value(i)).reduce((p,c)=>p+c,0)]).sort((a,b)=>a[1]-b[1]).map(i=>i[0]); - if(type=='string') return (1.2-list.indexOf(button.link)+Math.sqrt(3-player.countMark('olbixin_'+lib.skill.olbixin.map[button.link])))*10; - if(_status.event.getParent().type!='phase') return 1; - return player.getUseValue({name:button.link[2],nature:button.link[3]}); + select: 2, + check: function (button) { + var types = ["basic", "trick", "equip"]; + var type = typeof button.link; + var player = _status.event.player; + var list = types + .map((i) => [ + i, + player + .getCards("h", { type: i }) + .map((i) => get.value(i)) + .reduce((p, c) => p + c, 0), + ]) + .sort((a, b) => a[1] - b[1]) + .map((i) => i[0]); + if (type == "string") + return ( + (1.2 - + list.indexOf(button.link) + + Math.sqrt( + 3 - + player.countMark( + "olbixin_" + lib.skill.olbixin.map[button.link] + ) + )) * + 10 + ); + if (_status.event.getParent().type != "phase") return 1; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }); }, - backup:function(links,player){ - if(typeof links[0]!='string') links.reverse(); + backup: function (links, player) { + if (typeof links[0] != "string") links.reverse(); return { - popname:true, - position:'h', - filterCard:()=>false, - selectCard:-1, - type:lib.skill.olbixin.map[links[0]], - viewAs:{name:links[1][2],nature:links[1][3]}, - precontent:function(){ - 'step 0' - player.logSkill('olbixin'); - var type=lib.skill.olbixin_full_backup.type; - game.log(player,'声明了',type,'牌'); + popname: true, + position: "h", + filterCard: () => false, + selectCard: -1, + type: lib.skill.olbixin.map[links[0]], + viewAs: { name: links[1][2], nature: links[1][3] }, + precontent: function () { + "step 0"; + player.logSkill("olbixin"); + var type = lib.skill.olbixin_full_backup.type; + game.log(player, "声明了", type, "牌"); delete event.result.skill; - player.addMark('olbixin_'+type,1,false); - player.draw(player.countMark('olbixin')>=3?1:3); - 'step 1' - var cards=player.getCards('h',card=>get.type2(card)==lib.skill.olbixin_full_backup.type); - var cardsx=cards.filter(i=>game.checkMod(i,player,'unchanged','cardEnabled2',player)!==false); - if(cardsx.length&&cardsx.length==cards.length){ - event.result.cards=cards; + player.addMark("olbixin_" + type, 1, false); + player.draw(player.countMark("olbixin") >= 3 ? 1 : 3); + ("step 1"); + var cards = player.getCards( + "h", + (card) => get.type2(card) == lib.skill.olbixin_full_backup.type + ); + var cardsx = cards.filter( + (i) => + game.checkMod( + i, + player, + "unchanged", + "cardEnabled2", + player + ) !== false + ); + if (cardsx.length && cardsx.length == cards.length) { + event.result.cards = cards; game.delayx(); - } - else{ + } else { event.cancel(); // event.getParent().set('olbixin',true); event.getParent().goto(0); delete event.getParent().openskilldialog; } }, - } + }; + }, + prompt: function (links, player) { + return ( + "摸一张牌,然后将所有" + + get.translation(links[0]) + + "牌当做" + + (get.translation(links[1][3]) || "") + + get.translation(links[1][2]) + + "使用" + ); }, - prompt:function(links,player){ - return '摸一张牌,然后将所有'+get.translation(links[0])+'牌当做'+(get.translation(links[1][3])||'')+get.translation(links[1][2])+'使用'; - } }, - hiddenCard:function(player,name){ - var count=player.countMark('olbixin'); - if(!lib.inpile.includes(name)||get.type(name)!='basic'||count<3) return false; - var types=['basic','trick','equip'].filter(type=>{ - return player.countMark('olbixin_'+type)<3; + hiddenCard: function (player, name) { + var count = player.countMark("olbixin"); + if (!lib.inpile.includes(name) || get.type(name) != "basic" || count < 3) + return false; + var types = ["basic", "trick", "equip"].filter((type) => { + return player.countMark("olbixin_" + type) < 3; }); return types.length; }, - ai:{ - fireAttack:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player){ - var count=player.countMark('olbixin'); - if(count<3) return; - var types=['basic','trick','equip'].filter(type=>{ - return player.countMark('olbixin_'+type)<3; + ai: { + fireAttack: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player) { + var count = player.countMark("olbixin"); + if (count < 3) return; + var types = ["basic", "trick", "equip"].filter((type) => { + return player.countMark("olbixin_" + type) < 3; }); - if(types.length) return true; + if (types.length) return true; }, - order:1, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, }, - full_backup:{}, - } - }, - olximo:{ - audio:3, - trigger:{player:'logSkill'}, - derivation:'olfeibai', - filter:function(event,player){ - return event.skill=='olbixin'&&player.countMark('olbixin')<3; + full_backup: {}, }, - forced:true, - content:function(){ - player.addMark('olbixin',1,false); - game.log(player,'删除了','#g【笔心】','描述的前五个字符'); - if(player.countMark('olbixin')==3){ - game.log(player,'交换了','#g【笔心】','方括号中的两个数字'); + }, + olximo: { + audio: 3, + trigger: { player: "logSkill" }, + derivation: "olfeibai", + filter: function (event, player) { + return event.skill == "olbixin" && player.countMark("olbixin") < 3; + }, + forced: true, + content: function () { + player.addMark("olbixin", 1, false); + game.log(player, "删除了", "#g【笔心】", "描述的前五个字符"); + if (player.countMark("olbixin") == 3) { + game.log(player, "交换了", "#g【笔心】", "方括号中的两个数字"); //player.removeSkill('olximo'); //game.log(player,'失去了技能','#g【洗墨】'); - player.changeSkills(['olfeibai'],['olximo']); + player.changeSkills(["olfeibai"], ["olximo"]); } }, - ai:{ - combo:'olbixin', - } + ai: { + combo: "olbixin", + }, }, - olfeibai:{ - audio:2, - trigger:{ - source:'damageBegin1', - player:'recoverBegin', + olfeibai: { + audio: 2, + trigger: { + source: "damageBegin1", + player: "recoverBegin", }, - filter:function(event,player){ - var storage=player.storage.olfeibai; - var evt=event.getParent(),card=event.card; - if(evt.player!=player||!card) return false; - if(storage&&event.name=='recover'){ - return get.color(card)!='red'; + filter: function (event, player) { + var storage = player.storage.olfeibai; + var evt = event.getParent(), + card = event.card; + if (evt.player != player || !card) return false; + if (storage && event.name == "recover") { + return get.color(card) != "red"; } - if(!storage&&event.name=='damage'){ - return get.color(card)!='black'; + if (!storage && event.name == "damage") { + return get.color(card) != "black"; } return false; }, - content:function(){ - player.changeZhuanhuanji('olfeibai'); + content: function () { + player.changeZhuanhuanji("olfeibai"); trigger.num++; }, - zhuanhuanji:true, - forced:true, - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - if(storage) return '转换技。当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; - return '转换技。当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1。'; + zhuanhuanji: true, + forced: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + if (storage) + return "转换技。当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。"; + return "转换技。当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1。"; }, }, }, //新诸葛瑾 - olhuanshi:{ - audio:'huanshi', - trigger:{global:'judge'}, - filter:function(event,player){ - return player.countCards('h')>0; + olhuanshi: { + audio: "huanshi", + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("h") > 0; }, - logTarget:'player', - prompt2:function(event,player){ - var str=(get.translation(event.player)+'的'+event.judgestr+'判定为'+get.translation(event.player.judging[0])+'。你可以令其观看你的牌,其选择一张牌进行改判。'); - if(!player.hasSkill('olhuanshi_mark',null,null,false)) str+='然后你可以重铸任意张牌。'; + logTarget: "player", + prompt2: function (event, player) { + var str = + get.translation(event.player) + + "的" + + event.judgestr + + "判定为" + + get.translation(event.player.judging[0]) + + "。你可以令其观看你的牌,其选择一张牌进行改判。"; + if (!player.hasSkill("olhuanshi_mark", null, null, false)) + str += "然后你可以重铸任意张牌。"; return str; }, - check:function(event,player){ - if(get.attitude(player,event.player)<=0) return false; - var cards=player.getCards('he'); - var judge=event.judge(event.player.judging[0]); - for(var i=0;ijudge) return true; - if(_status.currentPhase!=player&&judge2==judge&&get.color(cards[i])=='red'&&get.useful(cards[i])<5) return true; + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return false; + var cards = player.getCards("he"); + var judge = event.judge(event.player.judging[0]); + for (var i = 0; i < cards.length; i++) { + var judge2 = event.judge(cards[i]); + if (judge2 > judge) return true; + if ( + _status.currentPhase != player && + judge2 == judge && + get.color(cards[i]) == "red" && + get.useful(cards[i]) < 5 + ) + return true; } return false; }, - content:function(){ - 'step 0' - var target=trigger.player; - var judge=trigger.judge(target.judging[0]); - var attitude=get.attitude(target,player); - target.choosePlayerCard('请选择代替判定的牌','he','visible',true,player).set('ai',function(button){ - var card=button.link; - var judge=_status.event.judge; - var attitude=_status.event.attitude; - var result=trigger.judge(card)-judge; - var player=_status.event.player; - if(result>0){ - return 20+result; - } - if(result==0){ - if(_status.currentPhase==player) return 0; - if(attitude>=0){ - return get.color(card)=='red'?7:0-get.value(card); + content: function () { + "step 0"; + var target = trigger.player; + var judge = trigger.judge(target.judging[0]); + var attitude = get.attitude(target, player); + target + .choosePlayerCard("请选择代替判定的牌", "he", "visible", true, player) + .set("ai", function (button) { + var card = button.link; + var judge = _status.event.judge; + var attitude = _status.event.attitude; + var result = trigger.judge(card) - judge; + var player = _status.event.player; + if (result > 0) { + return 20 + result; } - else{ - return get.color(card)=='black'?10:0+get.value(card); + if (result == 0) { + if (_status.currentPhase == player) return 0; + if (attitude >= 0) { + return get.color(card) == "red" ? 7 : 0 - get.value(card); + } else { + return get.color(card) == "black" ? 10 : 0 + get.value(card); + } } - } - if(attitude>=0){ - return get.color(card)=='red'?0:-10+result; - } - else{ - return get.color(card)=='black'?0:-10+result; - } - }).set('filterButton',function(button){ - var player=_status.event.target; - var card=button.link; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('judge',judge).set('attitude',attitude); - 'step 1' - if(result.bool){ - event.card=result.links[0]; - player.respond(event.card,'highlight','noOrdering').nopopup=true; - } - else{ + if (attitude >= 0) { + return get.color(card) == "red" ? 0 : -10 + result; + } else { + return get.color(card) == "black" ? 0 : -10 + result; + } + }) + .set("filterButton", function (button) { + var player = _status.event.target; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("judge", judge) + .set("attitude", attitude); + ("step 1"); + if (result.bool) { + event.card = result.links[0]; + player.respond(event.card, "highlight", "noOrdering").nopopup = true; + } else { event.finish(); } - 'step 2' - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=event.card; + trigger.player.judging[0] = event.card; trigger.orderingCards.add(event.card); - game.log(trigger.player,'的判定牌改为',event.card); + game.log(trigger.player, "的判定牌改为", event.card); game.delay(2); } - if(!player.countCards('h')||player.hasSkill('olhuanshi_mark',null,null,false)) event.finish(); - 'step 3' - player.chooseCard('是否重铸任意张手牌?','操作提示:选择要重铸的牌并点击“确定”',[1,player.countCards('h')],lib.filter.cardRecastable).set('ai',function(card){ - var player=_status.event.player,cards=ui.selected.cards; - if(!player.hasSkill('olmingzhe')) return 5-get.value(card); - for(var i of cards){ - if(get.color(i,player)=='red') return 5-get.value(card); - } - return 7.5-get.value(card); - }); - 'step 4' - if(result.bool){ - player.addTempSkill('olhuanshi_mark'); + if (!player.countCards("h") || player.hasSkill("olhuanshi_mark", null, null, false)) + event.finish(); + ("step 3"); + player + .chooseCard( + "是否重铸任意张手牌?", + "操作提示:选择要重铸的牌并点击“确定”", + [1, player.countCards("h")], + lib.filter.cardRecastable + ) + .set("ai", function (card) { + var player = _status.event.player, + cards = ui.selected.cards; + if (!player.hasSkill("olmingzhe")) return 5 - get.value(card); + for (var i of cards) { + if (get.color(i, player) == "red") return 5 - get.value(card); + } + return 7.5 - get.value(card); + }); + ("step 4"); + if (result.bool) { + player.addTempSkill("olhuanshi_mark"); player.recast(result.cards); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, }, - subSkill:{mark:{charlotte:true}}, + subSkill: { mark: { charlotte: true } }, }, - olhongyuan:{ - audio:'hongyuan', - trigger:{player:'gainAfter',global:'loseAsyncAfter'}, - filter(event,player){ - if(!player.countCards('he')||player.hasSkill('olhongyuan_blocker',null,null,false)) return false; - return event.getg(player).length>=2; + olhongyuan: { + audio: "hongyuan", + trigger: { player: "gainAfter", global: "loseAsyncAfter" }, + filter(event, player) { + if (!player.countCards("he") || player.hasSkill("olhongyuan_blocker", null, null, false)) + return false; + return event.getg(player).length >= 2; }, - async content(event,trigger,player){ - player.addTempSkill('olhongyuan_blocker',['phaseZhunbeiBefore','phaseJudgeBefore','phaseDrawBefore','phaseUseBefore','phaseDiscardBefore','phaseJieshuBefore','phaseBefore']); - let selectedTargets=[]; - while(selectedTargets.length<2&&player.countCards('he')&&game.hasPlayer(target=>{ - return target!=player&&!selectedTargets.includes(target); - })){ - const {result:{bool,targets,cards}}=await player.chooseCardTarget({ - prompt:'弘援:将一张牌交给一名其他角色', - filterCard:true, - position:'he', - filterTarget(card,player,target){ - return target!=player&&!get.event('selectedTargets').includes(target); - }, - complexCard:true, - complexTarget:true, - complexSelect:true, - ai1(card){ - const player=get.event('player'); - if(!game.hasPlayer(current=>{ - if(get.event('selectedTargets').includes(current)) return false; - return current!=player&&get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); - })) return -get.value(card); - return 4+((player.hasSkill('olmingzhe')&&get.color(card)=='red')?2:0)-Math.max(player.getUseValue(card),get.value(card,player)); - }, - ai2(target){ - const player=_status.event.player,att=get.attitude(player,target); - if(!ui.selected.cards.length) return att; - const card=ui.selected.cards[0],val=get.value(card,target); - if(val<0) return -att*Math.sqrt(-val); - return att*Math.sqrt(val+2); - }, - }).set('selectedTargets',selectedTargets); - if(bool){ - const target=targets[0]; + async content(event, trigger, player) { + player.addTempSkill("olhongyuan_blocker", [ + "phaseZhunbeiBefore", + "phaseJudgeBefore", + "phaseDrawBefore", + "phaseUseBefore", + "phaseDiscardBefore", + "phaseJieshuBefore", + "phaseBefore", + ]); + let selectedTargets = []; + while ( + selectedTargets.length < 2 && + player.countCards("he") && + game.hasPlayer((target) => { + return target != player && !selectedTargets.includes(target); + }) + ) { + const { + result: { bool, targets, cards }, + } = await player + .chooseCardTarget({ + prompt: "弘援:将一张牌交给一名其他角色", + filterCard: true, + position: "he", + filterTarget(card, player, target) { + return target != player && !get.event("selectedTargets").includes(target); + }, + complexCard: true, + complexTarget: true, + complexSelect: true, + ai1(card) { + const player = get.event("player"); + if ( + !game.hasPlayer((current) => { + if (get.event("selectedTargets").includes(current)) return false; + return ( + current != player && + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + return -get.value(card); + return ( + 4 + + (player.hasSkill("olmingzhe") && get.color(card) == "red" ? 2 : 0) - + Math.max(player.getUseValue(card), get.value(card, player)) + ); + }, + ai2(target) { + const player = _status.event.player, + att = get.attitude(player, target); + if (!ui.selected.cards.length) return att; + const card = ui.selected.cards[0], + val = get.value(card, target); + if (val < 0) return -att * Math.sqrt(-val); + return att * Math.sqrt(val + 2); + }, + }) + .set("selectedTargets", selectedTargets); + if (bool) { + const target = targets[0]; selectedTargets.push(target); player.line(target); - await player.give(cards,target); - } - else break; + await player.give(cards, target); + } else break; } }, - ai:{threaten:0.8}, - subSkill:{blocker:{charlotte:true}}, + ai: { threaten: 0.8 }, + subSkill: { blocker: { charlotte: true } }, }, - olmingzhe:{ - audio:'mingzhe', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + olmingzhe: { + audio: "mingzhe", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter:function(event,player){ - if(player.isPhaseUsing()) return false; - var evt=event.getl(player); - for(var i of evt.cards2){ - if(get.color(i,player)=='red') return true; + forced: true, + filter: function (event, player) { + if (player.isPhaseUsing()) return false; + var evt = event.getl(player); + for (var i of evt.cards2) { + if (get.color(i, player) == "red") return true; } return false; }, - content:function(){ - if(!trigger.visible){ - var cards=trigger.getl(player).hs.filter(function(i){ - return get.color(i,player)=='red'; + content: function () { + if (!trigger.visible) { + var cards = trigger.getl(player).hs.filter(function (i) { + return get.color(i, player) == "red"; }); - if(cards.length>0) player.showCards(cards,get.translation(player)+'发动了【明哲】'); + if (cards.length > 0) + player.showCards(cards, get.translation(player) + "发动了【明哲】"); } player.draw(); }, }, //吕范 - xindiaodu:{ - audio:"diaodu", - group:'xindiaodu_use', - frequent:true, - preHidden:true, - isFriendOf:function(player,target){ - if(get.mode()=='guozhan') return player.isFriendOf(target); - return player.group==target.group; + xindiaodu: { + audio: "diaodu", + group: "xindiaodu_use", + frequent: true, + preHidden: true, + isFriendOf: function (player, target) { + if (get.mode() == "guozhan") return player.isFriendOf(target); + return player.group == target.group; }, - subSkill:{ - temp:{charlotte:true}, - use:{ - trigger:{ - global:"useCard", + subSkill: { + temp: { charlotte: true }, + use: { + trigger: { + global: "useCard", }, - filter:function(event,player){ - return get.type(event.card)=='equip'&&event.player.isIn()&& - lib.skill.xindiaodu.isFriendOf(player,event.player)&&(player==event.player||player.hasSkill('xindiaodu'))&&!event.player.hasSkill('xindiaodu_temp'); + filter: function (event, player) { + return ( + get.type(event.card) == "equip" && + event.player.isIn() && + lib.skill.xindiaodu.isFriendOf(player, event.player) && + (player == event.player || player.hasSkill("xindiaodu")) && + !event.player.hasSkill("xindiaodu_temp") + ); }, - direct:true, - content:function(){ - 'step 0' - var next=trigger.player.chooseBool('是否发动【调度】摸一张牌?'); - if(player.hasSkill('xindiaodu')) next.set('frequentSkill','xindiaodu'); - if(player==trigger.player) next.setHiddenSkill('xindiaodu'); - 'step 1' - if(result.bool){ - player.logSkill('xindiaodu',trigger.player); - trigger.player.draw('nodelay'); - trigger.player.addTempSkill('xindiaodu_temp'); + direct: true, + content: function () { + "step 0"; + var next = trigger.player.chooseBool("是否发动【调度】摸一张牌?"); + if (player.hasSkill("xindiaodu")) next.set("frequentSkill", "xindiaodu"); + if (player == trigger.player) next.setHiddenSkill("xindiaodu"); + ("step 1"); + if (result.bool) { + player.logSkill("xindiaodu", trigger.player); + trigger.player.draw("nodelay"); + trigger.player.addTempSkill("xindiaodu_temp"); } }, }, }, - trigger:{ - player:"phaseUseBegin", + trigger: { + player: "phaseUseBegin", }, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return lib.skill.xindiaodu.isFriendOf(current,player)&¤t.countGainableCards(player,'e')>0; + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + lib.skill.xindiaodu.isFriendOf(current, player) && + current.countGainableCards(player, "e") > 0 + ); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('xindiaodu'),function(card,player,current){ - return lib.skill.xindiaodu.isFriendOf(current,player)&¤t.countGainableCards(player,'e')>0; - }).setHiddenSkill(event.name).ai=function(target){ - var num=1; - if(target.hasSkill('gzxiaoji')) num+=2.5; - if(target.isDamaged()&&target.getEquip('baiyin')) num+=2.5; - if(target.hasSkill('xuanlve')) num+=2; + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xindiaodu"), function (card, player, current) { + return ( + lib.skill.xindiaodu.isFriendOf(current, player) && + current.countGainableCards(player, "e") > 0 + ); + }) + .setHiddenSkill(event.name).ai = function (target) { + var num = 1; + if (target.hasSkill("gzxiaoji")) num += 2.5; + if (target.isDamaged() && target.getEquip("baiyin")) num += 2.5; + if (target.hasSkill("xuanlve")) num += 2; return num; }; - 'step 1' - if(result.bool){ - event.target1=result.targets[0]; - player.logSkill('xindiaodu',event.target1); - player.line(event.target1,'xindiaodu'); - player.gainPlayerCard(event.target1,'e',true); - } - else event.finish(); - 'step 2' - if(result.bool&&player.getCards('h').includes(result.cards[0])){ - event.card=result.cards[0]; - player.chooseTarget('是否将'+get.translation(event.card)+'交给一名其他角色?',function(card,player,current){ - return current!=player&¤t!=_status.event.target1&&lib.skill.xindiaodu.isFriendOf(current,player) - }).set('target1',event.target1); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.give(card,target); + ("step 1"); + if (result.bool) { + event.target1 = result.targets[0]; + player.logSkill("xindiaodu", event.target1); + player.line(event.target1, "xindiaodu"); + player.gainPlayerCard(event.target1, "e", true); + } else event.finish(); + ("step 2"); + if (result.bool && player.getCards("h").includes(result.cards[0])) { + event.card = result.cards[0]; + player + .chooseTarget( + "是否将" + get.translation(event.card) + "交给一名其他角色?", + function (card, player, current) { + return ( + current != player && + current != _status.event.target1 && + lib.skill.xindiaodu.isFriendOf(current, player) + ); + } + ) + .set("target1", event.target1); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.give(card, target); } }, }, //夏侯玄 - olhuanfu:{ - audio:2, - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + olhuanfu: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(player==event.player&&!event.isFirstTarget) return false; - if(event.olhuanfu_map&&event.olhuanfu_map[player.playerid]) return false; - return player.maxHp>0&&player.countCards('he')>0; + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (player == event.player && !event.isFirstTarget) return false; + if (event.olhuanfu_map && event.olhuanfu_map[player.playerid]) return false; + return player.maxHp > 0 && player.countCards("he") > 0; }, - shaRelated:true, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard('he',[1,player.maxHp],get.prompt('olhuanfu'),'通过弃牌,预测'+(player==trigger.player?'你':get.translation(trigger.player))+'使用的'+get.translation(trigger.card)+'能造成多少伤害。如果弃置的牌数等于总伤害,则你摸两倍的牌。').set('predict',function(){ - var target=trigger.target; - if(player==target){ - if(trigger.targets.length>1||player.hasShan()||get.effect(player,trigger.card,trigger.player,player)==0) return 0; - } - else{ - var target=trigger.target; - if(trigger.targets.length>1||target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) return 0; - } - var num=trigger.getParent().baseDamage; - var map=trigger.getParent().customArgs,id=target.playerid; - if(map[id]){ - if(typeof map[id].baseDamage=='number') num=map[id].baseDamage; - if(typeof map[id].extraDamage=='number') num+=map[id].extraDamage; - } - if(target.hasSkillTag('filterDamage',null,{ - player:trigger.player, - card:trigger.card, - })) num=1; - return num; - }()).set('ai',function(card){ - var num=_status.event.predict,player=_status.event.player; - if(ui.selected.cards.length>=num) return 0; - if(player.countCards('he',function(card){ - return get.value(card)<6+num; - }) 1 || + player.hasShan() || + get.effect(player, trigger.card, trigger.player, player) == 0 + ) + return 0; + } else { + var target = trigger.target; + if ( + trigger.targets.length > 1 || + target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return 0; + } + var num = trigger.getParent().baseDamage; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (map[id]) { + if (typeof map[id].baseDamage == "number") num = map[id].baseDamage; + if (typeof map[id].extraDamage == "number") num += map[id].extraDamage; + } + if ( + target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) + ) + num = 1; + return num; + })() + ) + .set("ai", function (card) { + var num = _status.event.predict, + player = _status.event.player; + if (ui.selected.cards.length >= num) return 0; + if ( + player.countCards("he", function (card) { + return get.value(card) < 6 + num; + }) < num + ) + return 0; + return 6 + num - get.value(card); + }).logSkill = "olhuanfu"; + ("step 1"); + if (result.bool) { + player.addTempSkill("olhuanfu_lottery"); + var evt = trigger.getParent(); + if (!evt.olhuanfu_map) evt.olhuanfu_map = {}; + evt.olhuanfu_map[player.playerid] = result.cards.length; } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'&&target.hp>0&¤t<0&&target.countCards('he')>0) return 0.7; + ai: { + effect: { + target: function (card, player, target, current) { + if ( + card.name == "sha" && + target.hp > 0 && + current < 0 && + target.countCards("he") > 0 + ) + return 0.7; }, }, }, - subSkill:{ - lottery:{ - trigger:{global:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - var map=event.olhuanfu_map; - if(!map||!map[player.playerid]) return false; - var num=0; - event.player.getHistory('sourceDamage',function(evt){ - if(evt.card==event.card&&evt.getParent().type=='card') num+=evt.num; + subSkill: { + lottery: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + var map = event.olhuanfu_map; + if (!map || !map[player.playerid]) return false; + var num = 0; + event.player.getHistory("sourceDamage", function (evt) { + if (evt.card == event.card && evt.getParent().type == "card") num += evt.num; }); - return num==map[player.playerid]; + return num == map[player.playerid]; }, - content:function(){ - player.draw(2*trigger.olhuanfu_map[player.playerid]); + content: function () { + player.draw(2 * trigger.olhuanfu_map[player.playerid]); }, }, }, }, - olqingyi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'olqingyi'); - },'he')&&game.hasPlayer(current=>lib.skill.olqingyi.filterTarget(null,player,current)); + olqingyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "olqingyi"); + }, "he") && + game.hasPlayer((current) => lib.skill.olqingyi.filterTarget(null, player, current)) + ); }, - selectTarget:[1,2], - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; + selectTarget: [1, 2], + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; }, - multitarget:true, - multiline:true, - content:function(){ - 'step 0' - var list=[player]; + multitarget: true, + multiline: true, + content: function () { + "step 0"; + var list = [player]; list.addArray(targets); list.sortBySeat(); - event.list=list; - for(var target of event.list){ - if(!target.hasCard(function(card){ - return lib.filter.cardDiscardable(card,target,'olqingyi'); - },'he')){ + event.list = list; + for (var target of event.list) { + if ( + !target.hasCard(function (card) { + return lib.filter.cardDiscardable(card, target, "olqingyi"); + }, "he") + ) { event.finish(); break; } } - 'step 1' - player.chooseCardOL(event.list,'he',true,'清议:选择弃置一张牌',function(card,player){ - return lib.filter.cardDiscardable(card,player,'olqingyi'); - }).set('ai',get.unuseful); - 'step 2' - var lose_list=[],cards=[]; - for(var i=0;ievt.skill=='olqingyi'); - if(!history.length) return false; - var color=false; - for(var evt of history){ - var list=[player]; + group: "olqingyi_gain", + subSkill: { + gain: { + audio: "olqingyi", + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + var history = player.getHistory("useSkill", (evt) => evt.skill == "olqingyi"); + if (!history.length) return false; + var color = false; + for (var evt of history) { + var list = [player]; list.addArray(evt.targets); - for(var target of list){ - target.getHistory('lose',function(evtx){ - if(color===true||evtx.getParent(2).name!='olqingyi') return false; - for(var card of evtx.cards){ - if(color===true||get.position(card,true)!='d') continue; - var color2=get.color(card,false); - if(!color) color=color2; - else if(color!=color2) color=true; + for (var target of list) { + target.getHistory("lose", function (evtx) { + if (color === true || evtx.getParent(2).name != "olqingyi") + return false; + for (var card of evtx.cards) { + if (color === true || get.position(card, true) != "d") continue; + var color2 = get.color(card, false); + if (!color) color = color2; + else if (color != color2) color = true; } }); - if(color===true) return true; + if (color === true) return true; } } return false; }, - content:function(){ - 'step 0' - var history=player.getHistory('useSkill',(evt)=>evt.skill=='olqingyi'),cards=[]; - for(var evt of history){ - var list=[player]; + content: function () { + "step 0"; + var history = player.getHistory("useSkill", (evt) => evt.skill == "olqingyi"), + cards = []; + for (var evt of history) { + var list = [player]; list.addArray(evt.targets); - for(var target of list){ - target.getHistory('lose',function(evtx){ - if(evtx.getParent(2).name!='olqingyi') return false; - for(var card of evtx.cards){ - if(get.position(card,true)=='d') cards.add(card); + for (var target of list) { + target.getHistory("lose", function (evtx) { + if (evtx.getParent(2).name != "olqingyi") return false; + for (var card of evtx.cards) { + if (get.position(card, true) == "d") cards.add(card); } }); } } - player.chooseButton(['清议:选择获得两张异色牌',cards],2).set('filterButton',function(button){ - if(!ui.selected.buttons.length) return true; - return get.color(button.link,false)!=get.color(ui.selected.buttons[0].link,false); - }).set('ai',function(button){ - return get.value(button.link,_status.event.player); - }); - 'step 1' - if(result.bool){ - player.logSkill('olqingyi_gain'); - player.gain(result.links,'gain2'); + player + .chooseButton(["清议:选择获得两张异色牌", cards], 2) + .set("filterButton", function (button) { + if (!ui.selected.buttons.length) return true; + return ( + get.color(button.link, false) != + get.color(ui.selected.buttons[0].link, false) + ); + }) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("olqingyi_gain"); + player.gain(result.links, "gain2"); } }, }, }, }, - olzeyue:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - limited:true, - skillAnimation:true, - animationColor:'water', - direct:true, - filter:function(event,player){ - var sources=[],history=player.actionHistory; - for(var i=history.length-1;i>=0;i--){ - if(i= 0; i--) { + if (i < history.length - 1 && history[i].isMe) break; + for (var evt of history[i].damage) { + if (evt.source && evt.source != player && evt.source.isIn()) + sources.add(evt.source); } } - for(var source of sources){ - var skills=source.getStockSkills('一!','五!'); - for(var skill of skills){ - var info=get.info(skill); - if(info&&!info.charlotte&&!get.is.locked(skill,source)&&source.hasSkill(skill,null,null,false)) return true; + for (var source of sources) { + var skills = source.getStockSkills("一!", "五!"); + for (var skill of skills) { + var info = get.info(skill); + if ( + info && + !info.charlotte && + !get.is.locked(skill, source) && + source.hasSkill(skill, null, null, false) + ) + return true; } } return false; }, - content:function(){ - 'step 0' - var sources=[],history=player.actionHistory; - for(var i=history.length-1;i>=0;i--){ - if(i= 0; i--) { + if (i < history.length - 1 && history[i].isMe) break; + for (var evt of history[i].damage) { + if (evt.source && evt.source != player && evt.source.isIn()) + sources.add(evt.source); } } - sources=sources.filter(function(source){ - var skills=source.getStockSkills('一!','五!'); - for(var skill of skills){ - var info=get.info(skill); - if(info&&!info.charlotte&&!get.is.locked(skill,source)&&source.hasSkill(skill,null,null,false)) return true; + sources = sources.filter(function (source) { + var skills = source.getStockSkills("一!", "五!"); + for (var skill of skills) { + var info = get.info(skill); + if ( + info && + !info.charlotte && + !get.is.locked(skill, source) && + source.hasSkill(skill, null, null, false) + ) + return true; } return false; }); - player.chooseTarget(get.prompt('olzeyue'),'令一名可选角色的一个非锁定技失效',function(card,player,target){ - return _status.event.sources.includes(target); - }).set('sources',sources).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att>=0) return 0; - return get.threaten(target,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('olzeyue',target); - player.awakenSkill('olzeyue'); - event.target=target; - var skills=target.getStockSkills('一!','五!'); - skills=skills.filter(function(skill){ - var info=get.info(skill); - if(info&&!info.charlotte&&!get.is.locked(skill,target)&&target.hasSkill(skill,null,null,false)) return true; + player + .chooseTarget( + get.prompt("olzeyue"), + "令一名可选角色的一个非锁定技失效", + function (card, player, target) { + return _status.event.sources.includes(target); + } + ) + .set("sources", sources) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + return get.threaten(target, player); }); - if(skills.length==1) event._result={control:skills[0]}; - else player.chooseControl(skills).set('prompt','令'+get.translation(target)+'的一个技能失效'); - } - else event.finish(); - 'step 2' - var skill=result.control; - target.disableSkill('olzeyue_'+player.playerid,skill); - target.storage['olzeyue_'+player.playerid]=true; - player.addSkill('olzeyue_round'); - player.markAuto('olzeyue_round',[target]); - if(!player.storage.olzeyue_map) player.storage.olzeyue_map={}; - player.storage.olzeyue_map[target.playerid]=0; - game.log(target,'的技能','#g【'+get.translation(skill)+'】','被失效了'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("olzeyue", target); + player.awakenSkill("olzeyue"); + event.target = target; + var skills = target.getStockSkills("一!", "五!"); + skills = skills.filter(function (skill) { + var info = get.info(skill); + if ( + info && + !info.charlotte && + !get.is.locked(skill, target) && + target.hasSkill(skill, null, null, false) + ) + return true; + }); + if (skills.length == 1) event._result = { control: skills[0] }; + else + player + .chooseControl(skills) + .set("prompt", "令" + get.translation(target) + "的一个技能失效"); + } else event.finish(); + ("step 2"); + var skill = result.control; + target.disableSkill("olzeyue_" + player.playerid, skill); + target.storage["olzeyue_" + player.playerid] = true; + player.addSkill("olzeyue_round"); + player.markAuto("olzeyue_round", [target]); + if (!player.storage.olzeyue_map) player.storage.olzeyue_map = {}; + player.storage.olzeyue_map[target.playerid] = 0; + game.log(target, "的技能", "#g【" + get.translation(skill) + "】", "被失效了"); }, - ai:{threaten:3}, - subSkill:{ - round:{ - trigger:{global:'roundStart'}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ - var storage=player.getStorage('olzeyue_round'); - for(var source of storage){ - if(source.isIn()&&source.canUse('sha',player,false)) return true; + ai: { threaten: 3 }, + subSkill: { + round: { + trigger: { global: "roundStart" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { + var storage = player.getStorage("olzeyue_round"); + for (var source of storage) { + if (source.isIn() && source.canUse("sha", player, false)) return true; } return false; }, - content:function(){ - 'step 0' - event.targets=player.storage.olzeyue_round.slice(0).sortBySeat(); - event.target=event.targets.shift(); - event.forceDie=true; - 'step 1' - var map=player.storage.olzeyue_map; - if(target.storage['olzeyue_'+player.playerid]) map[target.playerid]++; - event.num=map[target.playerid]-1; - if(event.num<=0) event.finish(); - 'step 2' + content: function () { + "step 0"; + event.targets = player.storage.olzeyue_round.slice(0).sortBySeat(); + event.target = event.targets.shift(); + event.forceDie = true; + ("step 1"); + var map = player.storage.olzeyue_map; + if (target.storage["olzeyue_" + player.playerid]) map[target.playerid]++; + event.num = map[target.playerid] - 1; + if (event.num <= 0) event.finish(); + ("step 2"); event.num--; - target.useCard(player,{name:'sha',isCard:true},false,'olzeyue_round'); - 'step 3' - var key='olzeyue_'+player.playerid; - if(target.storage[key]&&player.hasHistory('damage',function(evt){ - return evt.card.name=='sha'&&evt.getParent().type=='card'&&evt.getParent(3)==event; - })){ - for(var skill in target.disabledSkills){ - if(target.disabledSkills[skill].includes(key)) game.log(target,'恢复了技能','#g【'+get.translation(skill)+'】'); + target.useCard(player, { name: "sha", isCard: true }, false, "olzeyue_round"); + ("step 3"); + var key = "olzeyue_" + player.playerid; + if ( + target.storage[key] && + player.hasHistory("damage", function (evt) { + return ( + evt.card.name == "sha" && + evt.getParent().type == "card" && + evt.getParent(3) == event + ); + }) + ) { + for (var skill in target.disabledSkills) { + if (target.disabledSkills[skill].includes(key)) + game.log( + target, + "恢复了技能", + "#g【" + get.translation(skill) + "】" + ); } delete target.storage[key]; target.enableSkill(key); } - if(event.num>0&&player.isIn()&&target.isIn()&&target.canUse('sha',player,false)){ + if ( + event.num > 0 && + player.isIn() && + target.isIn() && + target.canUse("sha", player, false) + ) { event.goto(2); - } - else if(event.targets.length>0){ - event.target=event.targets.shift(); + } else if (event.targets.length > 0) { + event.target = event.targets.shift(); event.goto(1); } }, @@ -8428,2447 +11167,3061 @@ game.import('character', function () { }, }, //邓忠 - dzkanpo:{ - audio:2, - trigger:{source:'damageSource'}, - filter:function(event,player){ - return event.getParent().type=='card'&&event.card&&event.card.name=='sha'&&event.player.countCards('he')>0; + dzkanpo: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return ( + event.getParent().type == "card" && + event.card && + event.card.name == "sha" && + event.player.countCards("he") > 0 + ); }, - logTarget:'player', - content:function(){ - var suit=get.suit(trigger.card); - var next=player.gainPlayerCard(trigger.player,'h','visible'); - next.set('suit',suit); - next.set('filterButton',function(button){ - var evt=_status.event; - return get.suit(button.link,evt.target)==evt.suit; + logTarget: "player", + content: function () { + var suit = get.suit(trigger.card); + var next = player.gainPlayerCard(trigger.player, "h", "visible"); + next.set("suit", suit); + next.set("filterButton", function (button) { + var evt = _status.event; + return get.suit(button.link, evt.target) == evt.suit; }); }, - group:'dzkanpo_sha', - subSkill:{ - sha:{ - enable:'chooseToUse', - usable:1, - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - return player.countCards('hs')>0; + group: "dzkanpo_sha", + subSkill: { + sha: { + enable: "chooseToUse", + usable: 1, + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + return player.countCards("hs") > 0; }, - filterCard:true, - position:'hs', - prompt:'将一张手牌当做【杀】使用', - check:function(card){ - return 6-get.value(card); + filterCard: true, + position: "hs", + prompt: "将一张手牌当做【杀】使用", + check: function (card) { + return 6 - get.value(card); }, - ai:{ - respondSha:true, - skillTagFilter:function(player){ - if(player.getStat('skill').dzkanpo_sha) return false; - if(!player.countCards('hs')) return false; + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (player.getStat("skill").dzkanpo_sha) return false; + if (!player.countCards("hs")) return false; }, }, }, }, }, - dzgengzhan:{ - audio:2, - trigger:{ - global:['loseAfter','loseAsyncAfter'], + dzgengzhan: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], }, - usable:1, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false||player==_status.currentPhase||!event.isPhaseUsing()) return false; - for(var card of event.cards){ - if(get.position(card,true)=='d'&&get.name(card,event.hs&&event.hs.includes(card)?event.player:false)=='sha') return true; + usable: 1, + filter: function (event, player) { + if ( + event.type != "discard" || + event.getlx === false || + player == _status.currentPhase || + !event.isPhaseUsing() + ) + return false; + for (var card of event.cards) { + if ( + get.position(card, true) == "d" && + get.name(card, event.hs && event.hs.includes(card) ? event.player : false) == + "sha" + ) + return true; } }, - direct:true, - content:function(){ - 'step 0' - var cards=trigger.cards.filter(function(card){ - return (get.position(card,true)=='d'&&get.name(card,trigger.hs&&trigger.hs.includes(card)?trigger.player:false)=='sha') + direct: true, + content: function () { + "step 0"; + var cards = trigger.cards.filter(function (card) { + return ( + get.position(card, true) == "d" && + get.name( + card, + trigger.hs && trigger.hs.includes(card) ? trigger.player : false + ) == "sha" + ); }); - player.chooseButton(['是否发动【更战】获得一张杀?',cards]).set('ai',function(button){ - return get.value(button.link,_status.event.player); + player.chooseButton(["是否发动【更战】获得一张杀?", cards]).set("ai", function (button) { + return get.value(button.link, _status.event.player); }); - 'step 1' - if(result.bool){ - player.logSkill('dzgengzhan'); - player.gain(result.links,'gain2'); - } - else player.storage.counttrigger.dzgengzhan--; + ("step 1"); + if (result.bool) { + player.logSkill("dzgengzhan"); + player.gain(result.links, "gain2"); + } else player.storage.counttrigger.dzgengzhan--; }, - group:'dzgengzhan_add', - subSkill:{ - add:{ - audio:'dzgengzhan', - trigger:{global:'phaseJieshuBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player!=event.player&&!event.player.hasHistory('useCard',function(evt){ - return evt.card.name=='sha'; - }); + group: "dzgengzhan_add", + subSkill: { + add: { + audio: "dzgengzhan", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player != event.player && + !event.player.hasHistory("useCard", function (evt) { + return evt.card.name == "sha"; + }) + ); }, - logTarget:'player', - content:function(){ - player.addTempSkill('dzgengzhan_effect',{player:'phaseUseAfter'}); - player.addMark('dzgengzhan_effect',1,false); + logTarget: "player", + content: function () { + player.addTempSkill("dzgengzhan_effect", { player: "phaseUseAfter" }); + player.addMark("dzgengzhan_effect", 1, false); game.delayx(); }, }, - effect:{ - onremove:true, - charlotte:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('dzgengzhan_effect'); + effect: { + onremove: true, + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dzgengzhan_effect"); }, }, - intro:{content:'使用杀的次数上限+#'}, + intro: { content: "使用杀的次数上限+#" }, }, }, }, //王衍 - yangkuang:{ - audio:2, - trigger:{player:'recoverEnd'}, - filter:function(event,player){ + yangkuang: { + audio: 2, + trigger: { player: "recoverEnd" }, + filter: function (event, player) { return player.isHealthy(); }, - logTarget:function(event,player){ - return _status.currentPhase||player; + logTarget: function (event, player) { + return _status.currentPhase || player; }, - check:function(event,player){ - var target=(_status.currentPhase||player); - if(get.attitude(player,target)>0) return true; - if(player.countCards('h')>target.countCards('h')) return true; - if(!target.getCardUsable('sha')) return true; + check: function (event, player) { + var target = _status.currentPhase || player; + if (get.attitude(player, target) > 0) return true; + if (player.countCards("h") > target.countCards("h")) return true; + if (!target.getCardUsable("sha")) return true; return false; }, - content:function(){ - 'step 0' - player.chooseUseTarget('jiu',true); - 'step 1' - var target=_status.currentPhase; - if(target) target.draw('nodelay'); + content: function () { + "step 0"; + player.chooseUseTarget("jiu", true); + ("step 1"); + var target = _status.currentPhase; + if (target) target.draw("nodelay"); player.draw(); }, }, - cihuang:{ - audio:2, - trigger:{ - global:['eventNeutralized','shaMiss'], + cihuang: { + audio: 2, + trigger: { + global: ["eventNeutralized", "shaMiss"], }, - direct:true, - filter:function(event,player){ - if(event.player!=_status.currentPhase||!event.targets||event.targets.length!=1||event.type!='card'||!player.countCards('he')) return false; - return lib.skill.cihuang.getList(player,event.player,true); + direct: true, + filter: function (event, player) { + if ( + event.player != _status.currentPhase || + !event.targets || + event.targets.length != 1 || + event.type != "card" || + !player.countCards("he") + ) + return false; + return lib.skill.cihuang.getList(player, event.player, true); }, - getList:function(player,target,bool){ - var natures=lib.inpile_nature.slice(0); - var tricks=[]; - for(var name of lib.inpile){ - var info=lib.card[name]; - if(!info||info.type!='trick'||info.notarget||((info.selectTarget&&info.selectTarget!=1)&&(info.selectTarget!=-1||!info.toself))) continue; + getList: function (player, target, bool) { + var natures = lib.inpile_nature.slice(0); + var tricks = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if ( + !info || + info.type != "trick" || + info.notarget || + (info.selectTarget && + info.selectTarget != 1 && + (info.selectTarget != -1 || !info.toself)) + ) + continue; tricks.push(name); } - var history=player.actionHistory; - for(var i=history.length-1;i>=0;i--){ - var info=history[i]; - for(var evt of info.useCard){ - var name=evt.card.name; - if(name=='sha'){ - if(evt.card.nature) natures.remove(evt.card.nature); - } - else tricks.remove(name); + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + var info = history[i]; + for (var evt of info.useCard) { + var name = evt.card.name; + if (name == "sha") { + if (evt.card.nature) natures.remove(evt.card.nature); + } else tricks.remove(name); } - if(info.isRound) break; + if (info.isRound) break; } - var vcards=[]; - for(var i of natures){ - if(player.canUse({ - name:'sha', - nature:i, - isCard:true, - },target)){ - if(bool) return true; - else vcards.push(['基本','','sha',i]); + var vcards = []; + for (var i of natures) { + if ( + player.canUse( + { + name: "sha", + nature: i, + isCard: true, + }, + target + ) + ) { + if (bool) return true; + else vcards.push(["基本", "", "sha", i]); } } - for(var i of tricks){ - if(player.canUse({ - name:i, - isCard:true, - },target)){ - if(bool) return true; - else vcards.push(['锦囊','',i]); + for (var i of tricks) { + if ( + player.canUse( + { + name: i, + isCard: true, + }, + target + ) + ) { + if (bool) return true; + else vcards.push(["锦囊", "", i]); } } - if(bool) return false; + if (bool) return false; return vcards; }, - content:function(){ - 'step 0' - var target=trigger.player; - var list=lib.skill.cihuang.getList(player,target); - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - player.chooseButton([get.prompt('cihuang',target),'
    将一张牌当以下的一张牌对'+get.translation(target)+'使用
    ',[list,'vcard']]).set('ai',function(button){ - var card={ - name:button.link[2], - nature:button.link[3], - storage:{cihuang:true}, - },player=_status.event.player,target=_status.event.getTrigger().player; - return get.effect(target,card,player,player); - }); - 'step 1' - if(result.bool){ - var card={ - name:result.links[0][2], - nature:result.links[0][3], - storage:{cihuang:true}, + content: function () { + "step 0"; + var target = trigger.player; + var list = lib.skill.cihuang.getList(player, target); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + player + .chooseButton([ + get.prompt("cihuang", target), + '
    将一张牌当以下的一张牌对' + + get.translation(target) + + "使用
    ", + [list, "vcard"], + ]) + .set("ai", function (button) { + var card = { + name: button.link[2], + nature: button.link[3], + storage: { cihuang: true }, + }, + player = _status.event.player, + target = _status.event.getTrigger().player; + return get.effect(target, card, player, player); + }); + ("step 1"); + if (result.bool) { + var card = { + name: result.links[0][2], + nature: result.links[0][3], + storage: { cihuang: true }, }; - event.card=card; - player.chooseCard('hes','雌黄:将一张牌当'+get.translation(card)+'对'+get.translation(trigger.player)+'使用',function(card,player){ - return player.canUse(get.autoViewAs(_status.event.getParent().card,[card]),_status.event.target,false); - }).set('target',trigger.player).set('ai',function(card){ - if(get.effect(_status.event.target,get.autoViewAs(_status.event.getParent().card,[card]),player)<=0) return false; - return 6-get.value(card); + event.card = card; + player + .chooseCard( + "hes", + "雌黄:将一张牌当" + + get.translation(card) + + "对" + + get.translation(trigger.player) + + "使用", + function (card, player) { + return player.canUse( + get.autoViewAs(_status.event.getParent().card, [card]), + _status.event.target, + false + ); + } + ) + .set("target", trigger.player) + .set("ai", function (card) { + if ( + get.effect( + _status.event.target, + get.autoViewAs(_status.event.getParent().card, [card]), + player + ) <= 0 + ) + return false; + return 6 - get.value(card); + }); + } else event._result = { bool: false }; + ("step 2"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); }); } - else event._result={bool:false}; - 'step 2' - if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} - if(result.bool){ - player.useCard(get.autoViewAs(event.card,result.cards),result.cards,false,trigger.player,'cihuang').oncard=function(card,player){ + if (result.bool) { + player.useCard( + get.autoViewAs(event.card, result.cards), + result.cards, + false, + trigger.player, + "cihuang" + ).oncard = function (card, player) { _status.event.directHit.addArray(game.filterPlayer()); }; } }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg&&arg.card&&arg.card.storage&&arg.card.storage.cihuang; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.card && arg.card.storage && arg.card.storage.cihuang; }, }, }, - sanku:{ - audio:2, - trigger:{player:'dying'}, - forced:true, - group:'sanku_nogain', - content:function(){ - 'step 0' + sanku: { + audio: 2, + trigger: { player: "dying" }, + forced: true, + group: "sanku_nogain", + content: function () { + "step 0"; player.loseMaxHp(); - 'step 1' - var num=player.maxHp-player.hp; - if(num>0) player.recover(num); + ("step 1"); + var num = player.maxHp - player.hp; + if (num > 0) player.recover(num); }, - ai:{halfneg:true}, - subSkill:{ - nogain:{ - audio:'sanku', - trigger:{player:'gainMaxHpBegin'}, - forced:true, - content:function(){ + ai: { halfneg: true }, + subSkill: { + nogain: { + audio: "sanku", + trigger: { player: "gainMaxHpBegin" }, + forced: true, + content: function () { trigger.cancel(); - } - } - } + }, + }, + }, }, //霍峻 - qiongshou:{ - audio:2, - trigger:{ - player:'enterGame', - global:'phaseBefore', + qiongshou: { + audio: 2, + trigger: { + player: "enterGame", + global: "phaseBefore", }, - forced:true, - filter:function(event,player){ - if(event.name=='phase'&&game.phaseNumber!=0) return false; + forced: true, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber != 0) return false; return player.hasEnabledSlot(); }, - content:function(){ - var list=[]; - for(var i=1;i<6;i++){ - for(var j=0;j0)||(!player.storage.fenrui&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('e') 0) || + (!player.storage.fenrui && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") < es; + })) + ); }, - content:function(){ - 'step 0' - if(player.hasDisabledSlot()&&player.countCards('he')>0){ - var str='弃置一张牌,恢复一个装备栏并使用一张对应装备牌'; - player.chooseToDiscard('he',get.prompt('fenrui'),str).set('ai',function(card){ - return 7-get.value(card); - }).logSkill='fenrui'; - } - else event.goto(3); - 'step 1' - if(result.bool){ - player.chooseToEnable().set('ai',function(){ - var player=_status.event.player; - var list=[2,5,1,3,4]; - for(var i of list){ - if(player.hasDisabledSlot(i)) return 'equip'+i; + content: function () { + "step 0"; + if (player.hasDisabledSlot() && player.countCards("he") > 0) { + var str = "弃置一张牌,恢复一个装备栏并使用一张对应装备牌"; + player.chooseToDiscard("he", get.prompt("fenrui"), str).set("ai", function (card) { + return 7 - get.value(card); + }).logSkill = "fenrui"; + } else event.goto(3); + ("step 1"); + if (result.bool) { + player.chooseToEnable().set("ai", function () { + var player = _status.event.player; + var list = [2, 5, 1, 3, 4]; + for (var i of list) { + if (player.hasDisabledSlot(i)) return "equip" + i; } }); - } - else{ - var es=player.countCards('e'); - if(player.storage.fenrui||!game.hasPlayer(function(current){ - return current!=player&¤t.countCards('e')0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('e')target.countCards('e'); - }).set('ai',function(target){ - var player=_status.event.player; - var num=player.countCards('e')-target.countCards('e'); - if(get.attitude(player,target)>=0) return 0; - if(num>=Math.min(2,player.hp,target.hp)) return get.damageEffect(target,player,player); - return 0; - }); - } - else event.finish(); - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('fenrui_animate',target); - player.storage.fenrui=true; - player.unmarkSkill('fenrui'); + if (player.storage.fenrui) event.finish(); + ("step 3"); + var es = player.countCards("e"); + if ( + es > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("e") < es; + }) + ) { + player + .chooseTarget( + "是否对一名装备数小于你的角色造成伤害?", + "你可以选择一名装备区内牌数小于你的角色,并对其造成X点伤害(X为你与其装备区牌数之差),但此效果每局游戏内仅限一次。", + function (card, player, target) { + return ( + player != target && player.countCards("e") > target.countCards("e") + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var num = player.countCards("e") - target.countCards("e"); + if (get.attitude(player, target) >= 0) return 0; + if (num >= Math.min(2, player.hp, target.hp)) + return get.damageEffect(target, player, player); + return 0; + }); + } else event.finish(); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("fenrui_animate", target); + player.storage.fenrui = true; + player.unmarkSkill("fenrui"); game.delayx(); - target.damage(player.countCards('e')-target.countCards('e')); + target.damage(player.countCards("e") - target.countCards("e")); } }, - group:'fenrui_animate', - mark:true, - intro:{content:'王炸尚未使用'}, - subSkill:{ - animate:{ - skillAnimation:true, - animationColor:'fire', + group: "fenrui_animate", + mark: true, + intro: { content: "王炸尚未使用" }, + subSkill: { + animate: { + skillAnimation: true, + animationColor: "fire", }, }, }, //曹宪曹华 - huamu:{ - audio:6, - trigger:{player:'useCardAfter'}, - locked:false, - filter:function(event,player){ - var color=get.color(event.card); - if(color=='none') return false; - if(!player.hasHistory('lose',function(evt){ - return evt.hs.length>0&&evt.getParent()==event; - })||!event.cards.filterInD('oe').length) return false; - var history=game.getGlobalHistory('useCard'); - var index=history.indexOf(event); - if(index<1) return false; - var evt=history[index-1],color2=get.color(evt.card); - return color!=color2&&color2!='none'; + huamu: { + audio: 6, + trigger: { player: "useCardAfter" }, + locked: false, + filter: function (event, player) { + var color = get.color(event.card); + if (color == "none") return false; + if ( + !player.hasHistory("lose", function (evt) { + return evt.hs.length > 0 && evt.getParent() == event; + }) || + !event.cards.filterInD("oe").length + ) + return false; + var history = game.getGlobalHistory("useCard"); + var index = history.indexOf(event); + if (index < 1) return false; + var evt = history[index - 1], + color2 = get.color(evt.card); + return color != color2 && color2 != "none"; }, - prompt2:(event)=>'将'+get.translation(event.cards.filterInD('oe'))+'置于武将牌上', - check:function(event,player){ - if(!game.hasPlayer(function(current){ - return current.hasSkill('qianmeng',null,null,false)&&get.attitude(player,current)>0; - })) return false; - var cards=event.cards.filterInD('e'); - if(!cards.length) return true; - var card=cards[0]; - if(get.owner(card)==player){ - if(get.value(card,player)<=0) return true; - var subtype=get.subtype(card); - if(player.hasCard('hs',function(card){ - return get.subtype(card)==subtype&&player.canUse(card,player)&&get.effect(player,card,player,player)>0; - })) return true; + prompt2: (event) => "将" + get.translation(event.cards.filterInD("oe")) + "置于武将牌上", + check: function (event, player) { + if ( + !game.hasPlayer(function (current) { + return ( + current.hasSkill("qianmeng", null, null, false) && + get.attitude(player, current) > 0 + ); + }) + ) + return false; + var cards = event.cards.filterInD("e"); + if (!cards.length) return true; + var card = cards[0]; + if (get.owner(card) == player) { + if (get.value(card, player) <= 0) return true; + var subtype = get.subtype(card); + if ( + player.hasCard("hs", function (card) { + return ( + get.subtype(card) == subtype && + player.canUse(card, player) && + get.effect(player, card, player, player) > 0 + ); + }) + ) + return true; } return false; }, - content:function(){ - var cards=trigger.cards.filterInD('oe'); - player.addToExpansion(cards,'gain2').gaintag.add('huamu'); + content: function () { + var cards = trigger.cards.filterInD("oe"); + player.addToExpansion(cards, "gain2").gaintag.add("huamu"); }, - ai:{ - reverseOrder:true, - combo:'qianmeng', + ai: { + reverseOrder: true, + combo: "qianmeng", }, - mod:{ - aiOrder:function(player,card,num){ - if(typeof card=='object'){ - var history=game.getGlobalHistory('useCard'); - if(!history.length) return; - var evt=history[history.length-1]; - if(evt&&evt.card&&get.color(evt.card)!='none'&&get.color(card)!='none'&&get.color(evt.card)!=get.color(card)){ - return num+4; + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object") { + var history = game.getGlobalHistory("useCard"); + if (!history.length) return; + var evt = history[history.length - 1]; + if ( + evt && + evt.card && + get.color(evt.card) != "none" && + get.color(card) != "none" && + get.color(evt.card) != get.color(card) + ) { + return num + 4; } } }, }, - marktext:'木', - intro:{ - name:'灵杉&玉树', - markcount:function(storage,player){ - var red=[],black=[]; - var cards=player.getExpansions('huamu'); - for(var i of cards){ - var color=get.color(i,false); - (color=='red'?red:black).push(i); + marktext: "木", + intro: { + name: "灵杉&玉树", + markcount: function (storage, player) { + var red = [], + black = []; + var cards = player.getExpansions("huamu"); + for (var i of cards) { + var color = get.color(i, false); + (color == "red" ? red : black).push(i); } - return (''+black.length+'/'+red.length); + return "" + black.length + "/" + red.length; }, - content:'expansion', - mark:function(dialog,storage,player){ - var red=[],black=[]; - var cards=player.getExpansions('huamu'); - for(var i of cards){ - var color=get.color(i,false); - (color=='red'?red:black).push(i); + content: "expansion", + mark: function (dialog, storage, player) { + var red = [], + black = []; + var cards = player.getExpansions("huamu"); + for (var i of cards) { + var color = get.color(i, false); + (color == "red" ? red : black).push(i); } - if(black.length){ - dialog.addText('灵杉'); + if (black.length) { + dialog.addText("灵杉"); dialog.addSmall(black); } - if(red.length){ - dialog.addText('玉树'); + if (red.length) { + dialog.addText("玉树"); dialog.addSmall(red); } }, }, }, - qianmeng:{ - audio:2, - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + qianmeng: { + audio: 2, + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - if(event.name=='addToExpansion'){ - if(event.gaintag.includes('huamu')){ - var cards=event.player.getExpansions('huamu'),red=cards.filter(function(i){ - return get.color(i,false)=='red'; - }); - if(cards.length==red.length||red.length==0||cards.length==red.length*2) return true; + filter: function (event, player) { + if (event.name == "addToExpansion") { + if (event.gaintag.includes("huamu")) { + var cards = event.player.getExpansions("huamu"), + red = cards.filter(function (i) { + return get.color(i, false) == "red"; + }); + if ( + cards.length == red.length || + red.length == 0 || + cards.length == red.length * 2 + ) + return true; } } - if(event.name=='lose'&&event.getlx!==false){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('huamu')){ - var cards=event.player.getExpansions('huamu'),red=cards.filter(function(i){ - return get.color(i,false)=='red'; - }); - return (cards.length==red.length||red.length==0||cards.length==red.length/2); + if (event.name == "lose" && event.getlx !== false) { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("huamu")) { + var cards = event.player.getExpansions("huamu"), + red = cards.filter(function (i) { + return get.color(i, false) == "red"; + }); + return ( + cards.length == red.length || + red.length == 0 || + cards.length == red.length / 2 + ); } } return false; } - return game.getGlobalHistory('cardMove',function(evt){ - if(evt.name!='lose'||event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('huamu')){ - var cards=evt.player.getExpansions('huamu'),red=cards.filter(function(i){ - return get.color(i,false)=='red'; - }); - return (cards.length==red.length||red.length==0||cards.length==red.length/2); + return ( + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("huamu")) { + var cards = evt.player.getExpansions("huamu"), + red = cards.filter(function (i) { + return get.color(i, false) == "red"; + }); + return ( + cards.length == red.length || + red.length == 0 || + cards.length == red.length / 2 + ); + } } - } - return false; - }).length>0; + return false; + }).length > 0 + ); }, - forced:true, - content:function(){ + forced: true, + content: function () { player.draw(); }, - ai:{combo:'huamu'}, + ai: { combo: "huamu" }, }, - liangyuan:{ - enable:'chooseToUse', - hiddenCard:function(player,name){ - if(name=='tao'){ - return !player.hasSkill('liangyuan_tao',null,null,false)&&game.hasPlayer(function(current){ - var storage=current.getExpansions('huamu'); - return storage.length>0&&storage.filter(function(i){ - return get.color(i,false)=='red'; - }).length>0; - }); + liangyuan: { + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (name == "tao") { + return ( + !player.hasSkill("liangyuan_tao", null, null, false) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "red"; + }).length > 0 + ); + }) + ); + } else if (name == "jiu") { + return ( + !player.hasSkill("liangyuan_jiu", null, null, false) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "black"; + }).length > 0 + ); + }) + ); } - else if(name=='jiu'){ - return !player.hasSkill('liangyuan_jiu',null,null,false)&&game.hasPlayer(function(current){ - var storage=current.getExpansions('huamu'); - return storage.length>0&&storage.filter(function(i){ - return get.color(i,false)=='black'; - }).length>0; + return false; + }, + filter: function (event, player) { + if (event.type == "wuxie") return false; + if ( + !player.hasSkill("liangyuan_tao", null, null, false) && + event.filterCard(get.autoViewAs({ name: "tao" }, "unsure"), player, event) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "red"; + }).length > 0 + ); }) - } + ) + return true; + if ( + !player.hasSkill("liangyuan_jiu", null, null, false) && + event.filterCard(get.autoViewAs({ name: "jiu" }, "unsure"), player, event) && + game.hasPlayer(function (current) { + var storage = current.getExpansions("huamu"); + return ( + storage.length > 0 && + storage.filter(function (i) { + return get.color(i, false) == "black"; + }).length > 0 + ); + }) + ) + return true; return false; }, - filter:function(event,player){ - if(event.type=='wuxie') return false; - if(!player.hasSkill('liangyuan_tao',null,null,false)&&event.filterCard(get.autoViewAs({name:'tao'},'unsure'),player,event)&&game.hasPlayer(function(current){ - var storage=current.getExpansions('huamu'); - return storage.length>0&&storage.filter(function(i){ - return get.color(i,false)=='red'; - }).length>0; - })) return true; - if(!player.hasSkill('liangyuan_jiu',null,null,false)&&event.filterCard(get.autoViewAs({name:'jiu'},'unsure'),player,event)&&game.hasPlayer(function(current){ - var storage=current.getExpansions('huamu'); - return storage.length>0&&storage.filter(function(i){ - return get.color(i,false)=='black'; - }).length>0; - })) return true; - return false; - }, - chooseButton:{ - dialog:function(){ - return ui.create.dialog('良缘',[['tao','jiu'],'vcard'],'hidden'); + chooseButton: { + dialog: function () { + return ui.create.dialog("良缘", [["tao", "jiu"], "vcard"], "hidden"); }, - filter:function(button,player){ - var evt=_status.event.getParent(); - var name=button.link[2],color=(name=='tao')?'red':'black'; - if(player.hasSkill('liangyuan_'+name,null,null,false)) return false; - var cards=[]; - game.countPlayer(function(current){ - cards.addArray(current.getExpansions('huamu').filter(function(i){ - return get.color(i,false)==color; - })); + filter: function (button, player) { + var evt = _status.event.getParent(); + var name = button.link[2], + color = name == "tao" ? "red" : "black"; + if (player.hasSkill("liangyuan_" + name, null, null, false)) return false; + var cards = []; + game.countPlayer(function (current) { + cards.addArray( + current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; + }) + ); }); - if(!cards.length) return false; - var card=get.autoViewAs({name:name},cards); - return evt.filterCard(card,player,evt); + if (!cards.length) return false; + var card = get.autoViewAs({ name: name }, cards); + return evt.filterCard(card, player, evt); }, - check:function(button){ - if(_status.event.getParent().type!='phase') return 1; - var player=_status.event.player; - var name=button.link[2],color=(name=='tao')?'red':'black'; - var cards=[]; - game.countPlayer(function(current){ - cards.addArray(current.getExpansions('huamu').filter(function(i){ - return get.color(i,false)==color; - })); + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + var name = button.link[2], + color = name == "tao" ? "red" : "black"; + var cards = []; + game.countPlayer(function (current) { + cards.addArray( + current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; + }) + ); }); - var card=get.autoViewAs({name:name},cards); - return player.getUseValue(card,null,true); + var card = get.autoViewAs({ name: name }, cards); + return player.getUseValue(card, null, true); }, - backup:function(links,player){ - var name=links[0][2],color=(name=='tao')?'red':'black'; - var cards=[]; - game.countPlayer(function(current){ - cards.addArray(current.getExpansions('huamu').filter(function(i){ - return get.color(i,false)==color; - })); + backup: function (links, player) { + var name = links[0][2], + color = name == "tao" ? "red" : "black"; + var cards = []; + game.countPlayer(function (current) { + cards.addArray( + current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; + }) + ); }); - if(!cards.length) return false; - var card=get.autoViewAs({name:name},cards); + if (!cards.length) return false; + var card = get.autoViewAs({ name: name }, cards); return { - viewAs:card, - color:color, - selectCard:-1, - filterCard:()=>false, - precontent:function(){ - player.addTempSkill('liangyuan_'+event.result.card.name,'roundStart'); - player.logSkill('liangyuan'); - var list=[],color=lib.skill.liangyuan_backup.color; - var cards=[]; - game.countPlayer(function(current){ - var cardsx=current.getExpansions('huamu').filter(function(i){ - return get.color(i,false)==color; + viewAs: card, + color: color, + selectCard: -1, + filterCard: () => false, + precontent: function () { + player.addTempSkill("liangyuan_" + event.result.card.name, "roundStart"); + player.logSkill("liangyuan"); + var list = [], + color = lib.skill.liangyuan_backup.color; + var cards = []; + game.countPlayer(function (current) { + var cardsx = current.getExpansions("huamu").filter(function (i) { + return get.color(i, false) == color; }); - if(cardsx.length){ + if (cardsx.length) { cards.addArray(cardsx); - list.push([current,cardsx]); + list.push([current, cardsx]); current.$throw(cardsx); - game.log(current,'将',cardsx,'化作“'+(color=='black'?'灵杉':'玉树')+'”良缘') + game.log( + current, + "将", + cardsx, + "化作“" + (color == "black" ? "灵杉" : "玉树") + "”良缘" + ); } }); - event.result.cards=cards; + event.result.cards = cards; delete event.result.skill; - event.result._apply_args={'throw':false}; + event.result._apply_args = { throw: false }; game.loseAsync({ - lose_list:list, - }).setContent('chooseToCompareLose'); + lose_list: list, + }).setContent("chooseToCompareLose"); }, - } + }; }, - prompt:function(links,player){ - var name=links[0][2],color=(name=='tao')?'玉树':'灵杉'; - return '将场上所有的“'+color+'”当做【'+get.translation(name)+'】使用'; + prompt: function (links, player) { + var name = links[0][2], + color = name == "tao" ? "玉树" : "灵杉"; + return "将场上所有的“" + color + "”当做【" + get.translation(name) + "】使用"; }, }, - subSkill:{ - tao:{charlotte:true}, - jiu:{charlotte:true}, + subSkill: { + tao: { charlotte: true }, + jiu: { charlotte: true }, }, - ai:{ - order:function(item,player){ - if(!player) player=_status.event.player; - return get.order({name:lib.skill.liangyuan.hiddenCard(player,'jiu')?'jiu':'tao'})+4; + ai: { + order: function (item, player) { + if (!player) player = _status.event.player; + return ( + get.order({ + name: lib.skill.liangyuan.hiddenCard(player, "jiu") ? "jiu" : "tao", + }) + 4 + ); }, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, - combo:'huamu', - threaten:3, + combo: "huamu", + threaten: 3, }, }, - jisi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - limited:true, - skillAnimation:true, - animationColor:'metal', - filter:function(event,player){ - var skills=player.getStockSkills('一!','五!').filter(function(skill){ - if(skill=='jisi') return false; - var info=get.info(skill); - return info&&!info.charlotte; + jisi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + var skills = player.getStockSkills("一!", "五!").filter(function (skill) { + if (skill == "jisi") return false; + var info = get.info(skill); + return info && !info.charlotte; }); - var history=player.getAllHistory('useSkill'); - for(var i of history){ - if(skills.includes(i.sourceSkill)||skills.includes(i.skill)) return true; + var history = player.getAllHistory("useSkill"); + for (var i of history) { + if (skills.includes(i.sourceSkill) || skills.includes(i.skill)) return true; } return false; }, - content:function(){ - 'step 0' - var skills2=[]; - var skills=player.getStockSkills('只!','因!').filter(function(skill){ - if(skill=='jisi') return false; - var info=get.info(skill); - return info&&!info.charlotte; + content: function () { + "step 0"; + var skills2 = []; + var skills = player.getStockSkills("只!", "因!").filter(function (skill) { + if (skill == "jisi") return false; + var info = get.info(skill); + return info && !info.charlotte; }); - var history=player.getAllHistory('useSkill'); - for(var i of history){ - if(skills.includes(i.sourceSkill)) skills2.add(i.sourceSkill); - if(skills.includes(i.skill)) skills2.add(i.skill); - if(skills.length==skills2.length) break; + var history = player.getAllHistory("useSkill"); + for (var i of history) { + if (skills.includes(i.sourceSkill)) skills2.add(i.sourceSkill); + if (skills.includes(i.skill)) skills2.add(i.skill); + if (skills.length == skills2.length) break; } - event.skills2=skills2; - var str='令一名其他角色获得'; - for(var i=0;i1) str+='中的一个技能'; - str+='然后你'; - if(player.countCards('h')>0) str+='弃置所有手牌,并'; - str+='视为对其使用一张【杀】'; - player.chooseTarget(get.prompt('jisi'),str,lib.filter.notMe).set('ai',function(target){ - if(!_status.event.goon) return false; - var att=get.attitude(player,target); - if(att<4) return false; - var eff=get.effect(target,{name:'sha',isCard:true},player,player); - if(eff>=0) return att+eff; - if(target.hp<=2) return false; - return att/Math.max(1,-eff); - }).set('goon',function(){ - if(player.hasUnknown()||player.identity=='nei') return false; - var hs=player.getCards('h'); - if(!hs.length||get.value(hs,player)<=9-player.hp) return true; - return false; - }()); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jisi',target); - player.awakenSkill('jisi'); - var list=event.skills2; - if(list.length==0) event._result={control:list[0]}; - player.chooseControl(list).set('prompt','令'+get.translation(target)+'获得一个技能').set( - 'ai',()=>_status.event.choice - ).set('choice',list.includes('qianmeng')?'qianmeng':list.randomGet()); - } - else event.finish(); - 'step 2' + if (skills2.length > 1) str += "中的一个技能"; + str += "然后你"; + if (player.countCards("h") > 0) str += "弃置所有手牌,并"; + str += "视为对其使用一张【杀】"; + player + .chooseTarget(get.prompt("jisi"), str, lib.filter.notMe) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(player, target); + if (att < 4) return false; + var eff = get.effect(target, { name: "sha", isCard: true }, player, player); + if (eff >= 0) return att + eff; + if (target.hp <= 2) return false; + return att / Math.max(1, -eff); + }) + .set( + "goon", + (function () { + if (player.hasUnknown() || player.identity == "nei") return false; + var hs = player.getCards("h"); + if (!hs.length || get.value(hs, player) <= 9 - player.hp) return true; + return false; + })() + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("jisi", target); + player.awakenSkill("jisi"); + var list = event.skills2; + if (list.length == 0) event._result = { control: list[0] }; + player + .chooseControl(list) + .set("prompt", "令" + get.translation(target) + "获得一个技能") + .set("ai", () => _status.event.choice) + .set("choice", list.includes("qianmeng") ? "qianmeng" : list.randomGet()); + } else event.finish(); + ("step 2"); target.addSkills(result.control); - 'step 3' - var num=player.countCards('h'); - if(num>0) player.chooseToDiscard('h',num,true); - 'step 4' - if(player.canUse('sha',target,false)) player.useCard(false,target,{ - name:'sha', - isCard:true, - },'noai') + ("step 3"); + var num = player.countCards("h"); + if (num > 0) player.chooseToDiscard("h", num, true); + ("step 4"); + if (player.canUse("sha", target, false)) + player.useCard( + false, + target, + { + name: "sha", + isCard: true, + }, + "noai" + ); }, }, //周处 - shanduan:{ - audio:2, - init:function(player,name){ - player.storage[name]=[1,2,3,4]; + shanduan: { + audio: 2, + init: function (player, name) { + player.storage[name] = [1, 2, 3, 4]; }, - trigger:{player:'damageEnd'}, - filter:(event,player)=>player!=_status.currentPhase, - forced:true, - locked:false, - content:function(){ - if(!player.storage.shanduan) player.storage.shanduan=[1,2,3,4]; - var list=player.storage.shanduan; - for(var i=0;i player != _status.currentPhase, + forced: true, + locked: false, + content: function () { + if (!player.storage.shanduan) player.storage.shanduan = [1, 2, 3, 4]; + var list = player.storage.shanduan; + for (var i = 0; i < list.length; i++) { + var num = list[i], + add = true; + for (var j = 0; j < list.length; j++) { + if (list[j] < num) { + add = false; break; } } - if(add){ + if (add) { list[i]++; break; } } game.delayx(); }, - group:['shanduan_draw','shanduan_use','shanduan_discard'], - ai:{ - notemp:true, - threaten:3.6, + group: ["shanduan_draw", "shanduan_use", "shanduan_discard"], + ai: { + notemp: true, + threaten: 3.6, }, - subSkill:{ - draw:{ - audio:'shanduan', - trigger:{player:'phaseDrawBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - var list=event.getParent()._shanduan; - return !list||list.length>0; + subSkill: { + draw: { + audio: "shanduan", + trigger: { player: "phaseDrawBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var list = event.getParent()._shanduan; + return !list || list.length > 0; }, - content:function(){ - 'step 0' - var list=trigger.getParent()._shanduan; - if(!list){ - trigger.getParent()._shanduan=(player.storage.shanduan||[1,2,3,4]).slice(0); - player.storage.shanduan=[1,2,3,4]; + content: function () { + "step 0"; + var list = trigger.getParent()._shanduan; + if (!list) { + trigger.getParent()._shanduan = ( + player.storage.shanduan || [1, 2, 3, 4] + ).slice(0); + player.storage.shanduan = [1, 2, 3, 4]; } - 'step 1' - var list=trigger.getParent()._shanduan; - if(list.length==1) event._result={index:0}; - else player.chooseControl(list).set('prompt','善断:为摸牌阶段的摸牌数分配一个数值').set('choice',list.indexOf(Math.max.apply(Math,list))).set('ai',()=>_status.event.choice); - 'step 2' - var list=trigger.getParent()._shanduan; - var num=list[result.index]; - trigger.num=num; + ("step 1"); + var list = trigger.getParent()._shanduan; + if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl(list) + .set("prompt", "善断:为摸牌阶段的摸牌数分配一个数值") + .set("choice", list.indexOf(Math.max.apply(Math, list))) + .set("ai", () => _status.event.choice); + ("step 2"); + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + trigger.num = num; list.remove(num); - game.log(player,'给','#g摸牌阶段的摸牌数','分配的数值是','#y'+num); + game.log(player, "给", "#g摸牌阶段的摸牌数", "分配的数值是", "#y" + num); }, }, - use:{ - audio:'shanduan', - trigger:{player:'phaseUseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - var list=event.getParent()._shanduan; - return !list||list.length>0; + use: { + audio: "shanduan", + trigger: { player: "phaseUseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var list = event.getParent()._shanduan; + return !list || list.length > 0; }, - content:function(){ - 'step 0' - var list=trigger.getParent()._shanduan; - if(!list){ - trigger.getParent()._shanduan=(player.storage.shanduan||[1,2,3,4]).slice(0); - player.storage.shanduan=[1,2,3,4]; + content: function () { + "step 0"; + var list = trigger.getParent()._shanduan; + if (!list) { + trigger.getParent()._shanduan = ( + player.storage.shanduan || [1, 2, 3, 4] + ).slice(0); + player.storage.shanduan = [1, 2, 3, 4]; } - 'step 1' - var list=trigger.getParent()._shanduan; - if(list.length==1) event._result={index:0}; - else player.chooseControl(list).set('prompt','善断:为攻击范围基数分配一个数值').set('list',list).set('ai',function(){ - var player=_status.event.player,list=_status.event.list,card={name:'sha'}; - if(player.hasSha()&&(player.hasValueTarget(card,false,true)&&!player.hasValueTarget(card,null,true))){ - var range=1; - var equips=player.getCards('e'); - for(var i=0;i 1 && distance <= i - range) + return true; + return false; + }) + ) + return list.indexOf(i); + } } - } - var listx=list.slice(0).sort(); - for(var i of listx){ - if(i<=range) continue; - if(game.hasPlayer(function(current){ - var distance=get.distance(player,current,'attack'); - if(distance>1&&distance<=(i-range)) return true; - return false; - })) return list.indexOf(i); - } - } - return list.indexOf(Math.min.apply(Math,list)); - }); - 'step 2' - var list=trigger.getParent()._shanduan; - var num=list[result.index]; - if(!player.storage.shanduan_effect) player.storage.shanduan_effect={}; - player.storage.shanduan_effect.range=num; - player.addTempSkill('shanduan_effect'); + return list.indexOf(Math.min.apply(Math, list)); + }); + ("step 2"); + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; + player.storage.shanduan_effect.range = num; + player.addTempSkill("shanduan_effect"); list.remove(num); - game.log(player,'给','#g攻击范围的基数','分配的数值是','#y'+num); - if(list.length==0) event.finish(); - else if(list.length==1) event._result={index:0}; - else player.chooseControl(list).set('prompt','为使用【杀】的次数上限分配一个数值').set('list',list).set('ai',function(){ - var player=_status.event.player,list=_status.event.list; - var sha=player.countCards('hs',function(card){ - return get.name(card)=='sha'&&player.hasValueTarget(card,null,true); - }); - var max=player.getCardUsable('sha'); - if(sha<=max){ - var listx=list.slice(0).sort(); - for(var i of listx){ - if(max+i>=sha) return list.indexOf(i); - } - return list.indexOf(Math.max.apply(Math,list)) - } - return list.indexOf(Math.min.apply(Math,list)); - }); - 'step 3' - var list=trigger.getParent()._shanduan; - var num=list[result.index]; - if(!player.storage.shanduan_effect) player.storage.shanduan_effect={}; - player.storage.shanduan_effect.sha=num; - game.log(player,'给','#g使用【杀】的次数上限','分配的数值是','#y'+num); + game.log(player, "给", "#g攻击范围的基数", "分配的数值是", "#y" + num); + if (list.length == 0) event.finish(); + else if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl(list) + .set("prompt", "为使用【杀】的次数上限分配一个数值") + .set("list", list) + .set("ai", function () { + var player = _status.event.player, + list = _status.event.list; + var sha = player.countCards("hs", function (card) { + return ( + get.name(card) == "sha" && + player.hasValueTarget(card, null, true) + ); + }); + var max = player.getCardUsable("sha"); + if (sha <= max) { + var listx = list.slice(0).sort(); + for (var i of listx) { + if (max + i >= sha) return list.indexOf(i); + } + return list.indexOf(Math.max.apply(Math, list)); + } + return list.indexOf(Math.min.apply(Math, list)); + }); + ("step 3"); + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; + player.storage.shanduan_effect.sha = num; + game.log(player, "给", "#g使用【杀】的次数上限", "分配的数值是", "#y" + num); list.remove(num); }, }, - discard:{ - audio:'shanduan', - trigger:{player:'phaseDiscardBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - var list=event.getParent()._shanduan; - return !list||list.length>0; + discard: { + audio: "shanduan", + trigger: { player: "phaseDiscardBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var list = event.getParent()._shanduan; + return !list || list.length > 0; }, - content:function(){ - 'step 0' - var list=trigger.getParent()._shanduan; - if(!list){ - trigger.getParent()._shanduan=(player.storage.shanduan||[1,2,3,4]).slice(0); - player.storage.shanduan=[1,2,3,4]; + content: function () { + "step 0"; + var list = trigger.getParent()._shanduan; + if (!list) { + trigger.getParent()._shanduan = ( + player.storage.shanduan || [1, 2, 3, 4] + ).slice(0); + player.storage.shanduan = [1, 2, 3, 4]; } - 'step 1' - var list=trigger.getParent()._shanduan; - if(list.length==1) event._result={index:0}; - else player.chooseControl(list).set('prompt','善断:为手牌上限基数分配一个数值').set('choice',list.indexOf(Math.max.apply(Math,list))).set('ai',()=>_status.event.choice); - 'step 2' - var list=trigger.getParent()._shanduan; - var num=list[result.index]; - if(!player.storage.shanduan_effect) player.storage.shanduan_effect={}; - player.storage.shanduan_effect.limit=num; - player.addTempSkill('shanduan_effect'); + ("step 1"); + var list = trigger.getParent()._shanduan; + if (list.length == 1) event._result = { index: 0 }; + else + player + .chooseControl(list) + .set("prompt", "善断:为手牌上限基数分配一个数值") + .set("choice", list.indexOf(Math.max.apply(Math, list))) + .set("ai", () => _status.event.choice); + ("step 2"); + var list = trigger.getParent()._shanduan; + var num = list[result.index]; + if (!player.storage.shanduan_effect) player.storage.shanduan_effect = {}; + player.storage.shanduan_effect.limit = num; + player.addTempSkill("shanduan_effect"); list.remove(num); - game.log(player,'给','#g手牌上限的基数','分配的数值是','#y'+num); + game.log(player, "给", "#g手牌上限的基数", "分配的数值是", "#y" + num); }, }, - effect:{ - charlotte:true, - onremove:true, - mod:{ - attackRangeBase:function(player){ - var map=player.storage.shanduan_effect; - if(typeof map.range!='number') return; - var range=1; - var equips=player.getCards('e',function(card){ - return !ui.selected.cards||!ui.selected.cards.includes(card); + effect: { + charlotte: true, + onremove: true, + mod: { + attackRangeBase: function (player) { + var map = player.storage.shanduan_effect; + if (typeof map.range != "number") return; + var range = 1; + var equips = player.getCards("e", function (card) { + return !ui.selected.cards || !ui.selected.cards.includes(card); }); - for(var i=0;iget.value(cardx)<8); - cards.sort((a,b)=>get.value(a)-get.value(b)); - if(cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) return player.getUseValue({name:'jiu'}); + if (evt.type == "phase") { + if (button.link[2] == "jiu") { + if (player.getUseValue({ name: "jiu" }) <= 0) return 0; + var cards = player.getCards("hs", (cardx) => get.value(cardx) < 8); + cards.sort((a, b) => get.value(a) - get.value(b)); + if ( + cards.some( + (cardx) => + get.name(cardx) == "sha" && !cards.slice(0, 2).includes(cardx) + ) + ) + return player.getUseValue({ name: "jiu" }); return 0; } - return player.getUseValue(card)/4; + return player.getUseValue(card) / 4; } return 1; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'yilie', - selectCard:2, - filterCard:function(card,player){ - var color=get.color(card); - if(ui.selected.cards.length) return color==get.color(ui.selected.cards[0]); - return player.hasCard(function(cardx){ - return card!=cardx&&get.color(cardx)==color; - },'hs') + audio: "yilie", + selectCard: 2, + filterCard: function (card, player) { + var color = get.color(card); + if (ui.selected.cards.length) return color == get.color(ui.selected.cards[0]); + return player.hasCard(function (cardx) { + return card != cardx && get.color(cardx) == color; + }, "hs"); }, - position:'hs', - complexCard:true, - check:(card)=>8-get.value(card), - popname:true, - viewAs:{ - name:links[0][2], - nature:links[0][3], + position: "hs", + complexCard: true, + check: (card) => 8 - get.value(card), + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], }, - precontent:function(){ - var name=event.result.card.name; - player.addTempSkill('yilie_count','roundStart'); - player.markAuto('yilie_count',[name]); + precontent: function () { + var name = event.result.card.name; + player.addTempSkill("yilie_count", "roundStart"); + player.markAuto("yilie_count", [name]); }, - } + }; }, - prompt:function(links,player){ - var name=links[0][2]; - var nature=links[0][3]; - return '将两张颜色相同的手牌当做'+(get.translation(nature)||'')+get.translation(name)+'使用'; + prompt: function (links, player) { + var name = links[0][2]; + var nature = links[0][3]; + return ( + "将两张颜色相同的手牌当做" + + (get.translation(nature) || "") + + get.translation(name) + + "使用" + ); }, }, - ai:{ - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var add=false,max=0; - var names=lib.inpile.filter(name=>get.type(name)=='basic'&&!player.getStorage('yilie_count').includes(name)); - if(names.includes('sha')) add=true; - names=names.map(namex=>{return {name:namex}}); - if(add) lib.inpile_nature.forEach(nature=>names.push({name:'sha',nature:nature})); - names.forEach(card=>{ - if(player.getUseValue(card)>0){ - var temp=get.order(card); - if(card.name=='jiu'){ - var cards=player.getCards('hs',cardx=>get.value(cardx)<8); - cards.sort((a,b)=>get.value(a)-get.value(b)); - if(!cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) temp=0; + ai: { + order: function (item, player) { + if (player && _status.event.type == "phase") { + var add = false, + max = 0; + var names = lib.inpile.filter( + (name) => + get.type(name) == "basic" && + !player.getStorage("yilie_count").includes(name) + ); + if (names.includes("sha")) add = true; + names = names.map((namex) => { + return { name: namex }; + }); + if (add) + lib.inpile_nature.forEach((nature) => + names.push({ name: "sha", nature: nature }) + ); + names.forEach((card) => { + if (player.getUseValue(card) > 0) { + var temp = get.order(card); + if (card.name == "jiu") { + var cards = player.getCards("hs", (cardx) => get.value(cardx) < 8); + cards.sort((a, b) => get.value(a) - get.value(b)); + if ( + !cards.some( + (cardx) => + get.name(cardx) == "sha" && + !cards.slice(0, 2).includes(cardx) + ) + ) + temp = 0; } - if(temp>max) max=temp; + if (temp > max) max = temp; } }); - if(max>0) max-=0.001; + if (max > 0) max -= 0.001; return max; } return 0.5; }, - respondShan:true, - respondSha:true, - fireAttack:true, - skillTagFilter:function(player,tag,arg){ - if(arg=='respond') return false; - var hs=player.getCards('hs'); - if(hs.length<2) return false; - var bool=false,map={}; - for(var card of hs){ - var color=get.color(card); - if(!map[color]) map[color]=true; - else{ - bool=true; + respondShan: true, + respondSha: true, + fireAttack: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + var hs = player.getCards("hs"); + if (hs.length < 2) return false; + var bool = false, + map = {}; + for (var card of hs) { + var color = get.color(card); + if (!map[color]) map[color] = true; + else { + bool = true; break; } } - if(!bool) return false; - var storage=player.storage.yilie_count; + if (!bool) return false; + var storage = player.storage.yilie_count; var name; - switch(tag){ - case 'respondShan':name='shan';break; - default:name='sha';break; + switch (tag) { + case "respondShan": + name = "shan"; + break; + default: + name = "sha"; + break; } - if(storage&&storage.includes(name)) return false; + if (storage && storage.includes(name)) return false; }, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; - } - } + }, + }, }, - subSkill:{ - count:{charlotte:true,onremove:true}, - backup:{audio:'yilie'}, + subSkill: { + count: { charlotte: true, onremove: true }, + backup: { audio: "yilie" }, }, }, //赵俨 - tongxie:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('tongxie'),'选择至多两名其他角色作为“同协角色”',lib.filter.notMe,[0,2]).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets; + tongxie: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("tongxie"), + "选择至多两名其他角色作为“同协角色”", + lib.filter.notMe, + [0, 2] + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; targets.add(player); - player.logSkill('tongxie',targets); - player.addTempSkill('tongxie_effect',{player:'phaseBegin'}); - player.markAuto('tongxie_effect',targets); - var min=player.countCards('h'),min_player=player; - for(var i of targets){ - if(i==player) continue; - var num=i.countCards('h'); - if(num0) return true; - if(i.hasSha()) return true; + subSkill: { + effect: { + audio: "tongxie", + charlotte: true, + trigger: { global: "useCardAfter" }, + onremove: true, + forced: true, + popup: false, + filter: function (event, player) { + if ( + event.card.name != "sha" || + event.targets.length != 1 || + !event.targets[0].isIn() + ) + return false; + if (event.getParent(2).name == "tongxie_effect") return false; + var list = player.getStorage("tongxie_effect"), + target = event.targets[0]; + if (!list.includes(event.player)) return false; + for (var i of list) { + if (i == event.player || !i.isIn()) continue; + if (!i.canUse("sha", target, false)) continue; + if (_status.connectMode && i.countCards("hs") > 0) return true; + if (i.hasSha()) return true; } return false; }, - content:function(){ - 'step 0' - event.targets=player.getStorage('tongxie_effect').filter(function(i){ - return i!==trigger.player; - }).sortBySeat(); - event.target=trigger.targets[0]; - 'step 1' - var current=targets.shift(); - if(current.isIn()&&target.isIn()&¤t.canUse('sha',target,false)&&(_status.connectMode||current.hasSha())){ - current.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'同协:是否对'+get.translation(target)+'使用一张杀?').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',target).set('logSkill','tongxie_effect').set('addCount',false); - if(targets.length>0) event.redo(); + content: function () { + "step 0"; + event.targets = player + .getStorage("tongxie_effect") + .filter(function (i) { + return i !== trigger.player; + }) + .sortBySeat(); + event.target = trigger.targets[0]; + ("step 1"); + var current = targets.shift(); + if ( + current.isIn() && + target.isIn() && + current.canUse("sha", target, false) && + (_status.connectMode || current.hasSha()) + ) { + current + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "同协:是否对" + get.translation(target) + "使用一张杀?") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target) + .set("logSkill", "tongxie_effect") + .set("addCount", false); + if (targets.length > 0) event.redo(); } }, - group:['tongxie_damage','tongxie_count'], + group: ["tongxie_damage", "tongxie_count"], }, - damage:{ - audio:'tongxie', - charlotte:true, - trigger:{global:'damageBegin4'}, - filter:function(event,player){ - var list=player.getStorage('tongxie_effect'); - if(!list.includes(event.player)) return false; - for(var i of list){ - if(i!=event.player&&i.isIn()&&!i.hasSkill('tongxie_count2',null,null,false)) return true; + damage: { + audio: "tongxie", + charlotte: true, + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + var list = player.getStorage("tongxie_effect"); + if (!list.includes(event.player)) return false; + for (var i of list) { + if ( + i != event.player && + i.isIn() && + !i.hasSkill("tongxie_count2", null, null, false) + ) + return true; } return false; }, - forced:true, - popup:false, - content:function(){ - 'step 0' - event.targets=player.getStorage('tongxie_effect').filter(function(i){ - return i!=trigger.player&&i.isIn()&&!i.hasSkill('tongxie_count2',null,null,false); - }).sortBySeat(); - event.num=0; - 'step 1' - var target=targets[num]; + forced: true, + popup: false, + content: function () { + "step 0"; + event.targets = player + .getStorage("tongxie_effect") + .filter(function (i) { + return ( + i != trigger.player && + i.isIn() && + !i.hasSkill("tongxie_count2", null, null, false) + ); + }) + .sortBySeat(); + event.num = 0; + ("step 1"); + var target = targets[num]; event.num++; - event.target=target; - target.chooseBool('同协:是否为'+get.translation(trigger.player)+'阻挡伤害?','失去1点体力,防止'+get.translation(trigger.player)+'即将受到的'+get.cnNumber(trigger.num)+'点伤害').set('ai',function(){ - var player=_status.event.player,target=_status.event.getTrigger().player; - var trigger=_status.event.getTrigger(); - var eff1=get.damageEffect(target,trigger.source,player,trigger.nature); - if(trigger.num>1) eff1=Math.min(-1,eff1)*trigger.num; - var eff2=get.effect(player,{name:'losehp'},player,player); - return eff2>eff1; - }); - 'step 2' - if(result.bool){ - target.logSkill('tongxie_damage',trigger.player); + event.target = target; + target + .chooseBool( + "同协:是否为" + get.translation(trigger.player) + "阻挡伤害?", + "失去1点体力,防止" + + get.translation(trigger.player) + + "即将受到的" + + get.cnNumber(trigger.num) + + "点伤害" + ) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var trigger = _status.event.getTrigger(); + var eff1 = get.damageEffect( + target, + trigger.source, + player, + trigger.nature + ); + if (trigger.num > 1) eff1 = Math.min(-1, eff1) * trigger.num; + var eff2 = get.effect(player, { name: "losehp" }, player, player); + return eff2 > eff1; + }); + ("step 2"); + if (result.bool) { + target.logSkill("tongxie_damage", trigger.player); trigger.cancel(); target.loseHp(); - } - else if(num=to.hp) return -Infinity; + olzhuiji: { + mod: { + globalFrom: function (from, to) { + if (from.hp >= to.hp) return -Infinity; }, }, - trigger:{player:'useCardToPlayered'}, - shaRelated:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.countCards('he')>0&&get.distance(player,event.target)==1; + trigger: { player: "useCardToPlayered" }, + shaRelated: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.target.countCards("he") > 0 && + get.distance(player, event.target) == 1 + ); }, - forced:true, - logTarget:'target', - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - if(target.countCards('e')==0) event._result={index:0}; - else target.chooseControl().set('choiceList',[ - '弃置一张牌', - '重铸装备区的所有牌', - ]).set('ai',function(card){ - var min=Infinity,equ=0,es=player.getCards('e'),hs=player.getCards('he'); - for(var i of hs){ - var val=get.value(i); - min=Math.min(min,val); - if(es.includes(i)) equ+=val; - } - equ/=es.length; - if(min1) return; - var card=get.cards()[0]; - if(!card) return; - game.log(player,'展示了',card); + var sendback = function (result, player) { + if (result) { + var index = result.index; + game.log(player, "选择了", ["#b助力锻造", "#g妨碍锻造", "#b什么都不做"][index]); + if (index > 1) return; + var card = get.cards()[0]; + if (!card) return; + game.log(player, "展示了", card); event.cardsx.push(card); event.cards2[index].push(card); - game.broadcastAll(function(id,card,name,index){ - var dialog=get.idDialog(id); - if(!dialog) return; - var button=ui.create.button(card,'card',dialog.buttonss[index]); - button.querySelector('.info').innerHTML=(name+'|'+get.strNumber(card.number)); - },event.videoId,card,function(target){ - if(target._tempTranslate) return target._tempTranslate; - var name=target.name; - if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; - return get.translation(name); - }(player),index); + game.broadcastAll( + function (id, card, name, index) { + var dialog = get.idDialog(id); + if (!dialog) return; + var button = ui.create.button(card, "card", dialog.buttonss[index]); + button.querySelector(".info").innerHTML = + name + "|" + get.strNumber(card.number); + }, + event.videoId, + card, + (function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + })(player), + index + ); } }; - event.players=game.filterPlayer(); - event.cardsx=[]; - event.cards2=[[],[]]; - event.videoId=lib.status.videoId++; - event.ai_targets=[]; - game.broadcastAll(function(name,id){ - var dialog=ui.create.dialog(name+'发起了“锻造”','hidden','forcebutton'); - dialog.videoId=id; - dialog.classList.add('scroll1'); - dialog.classList.add('scroll2'); - dialog.classList.add('fullwidth'); - dialog.classList.add('fullheight'); - ui.arena.classList.add('choose-to-move'); - dialog.buttonss=[]; + event.players = game.filterPlayer(); + event.cardsx = []; + event.cards2 = [[], []]; + event.videoId = lib.status.videoId++; + event.ai_targets = []; + game.broadcastAll( + function (name, id) { + var dialog = ui.create.dialog(name + "发起了“锻造”", "hidden", "forcebutton"); + dialog.videoId = id; + dialog.classList.add("scroll1"); + dialog.classList.add("scroll2"); + dialog.classList.add("fullwidth"); + dialog.classList.add("fullheight"); + ui.arena.classList.add("choose-to-move"); + dialog.buttonss = []; - var list=['协力锻造的玩家','妨碍锻造的玩家'] - for(var i=0;i'+list[i]+''); - var buttons=ui.create.div('.buttons',dialog.content); - dialog.buttonss.push(buttons); - buttons.classList.add('popup'); - buttons.classList.add('guanxing'); - } - dialog.open(); - },get.translation(player),event.videoId) - for(var i=0;i' + list[i] + ""); + var buttons = ui.create.div(".buttons", dialog.content); + dialog.buttonss.push(buttons); + buttons.classList.add("popup"); + buttons.classList.add("guanxing"); + } + dialog.open(); + }, + get.translation(player), + event.videoId + ); + for (var i = 0; i < event.players.length; i++) { + if (event.players[i] == player) { + sendback({ index: 0 }, player); + } else if (event.players[i].isOnline()) { + event.withol = true; event.players[i].send(send); event.players[i].wait(sendback); - } - else if(event.players[i]==game.me){ - event.withme=true; - game.me.chooseControl('助力锻造!','妨碍锻造!','什么都不做'); - if(_status.connectMode) game.me.wait(sendback); - } - else{ + } else if (event.players[i] == game.me) { + event.withme = true; + game.me.chooseControl("助力锻造!", "妨碍锻造!", "什么都不做"); + if (_status.connectMode) game.me.wait(sendback); + } else { event.ai_targets.push(event.players[i]); - if(_status.connectMode) event.players[i].showTimer(); + if (_status.connectMode) event.players[i].showTimer(); } } - if(event.ai_targets.length){ + if (event.ai_targets.length) { event.ai_targets.randomSort(); - setTimeout(function(){ - event.interval=setInterval(function(){ - var target=event.ai_targets.shift(); - var att=get.attitude(target,player); - var num=2; - if(att>0) num=0; - else if(att<0) num=1; - sendback({index:num},target); - if(_status.connectMode) target.hideTimer(); - if(!event.ai_targets.length){ + setTimeout(function () { + event.interval = setInterval(function () { + var target = event.ai_targets.shift(); + var att = get.attitude(target, player); + var num = 2; + if (att > 0) num = 0; + else if (att < 0) num = 1; + sendback({ index: num }, target); + if (_status.connectMode) target.hideTimer(); + if (!event.ai_targets.length) { clearInterval(event.interval); - if(event.withai) game.resume(); + if (event.withai) game.resume(); } - },750); - },500) + }, 750); + }, 500); } - 'step 1' - if(event.withme){ - if(_status.connectMode) game.me.unwait(result); - else{ - var index=result.index; - game.log(game.me,'选择了',['#b助力锻造','#g妨碍锻造','#b什么都不做'][index]) - if(index>1) return; - var card=get.cards()[0]; - if(!card) return; - game.log(game.me,'展示了',card); + ("step 1"); + if (event.withme) { + if (_status.connectMode) game.me.unwait(result); + else { + var index = result.index; + game.log(game.me, "选择了", ["#b助力锻造", "#g妨碍锻造", "#b什么都不做"][index]); + if (index > 1) return; + var card = get.cards()[0]; + if (!card) return; + game.log(game.me, "展示了", card); event.cardsx.push(card); event.cards2[index].push(card); - game.broadcastAll(function(id,card,name,index){ - var dialog=get.idDialog(id); - if(!dialog) return; - var button=ui.create.button(card,'card',dialog.buttonss[index]); - button.querySelector('.info').innerHTML=(name+'|'+get.strNumber(card.number)); - },event.videoId,card,function(target){ - if(target._tempTranslate) return target._tempTranslate; - var name=target.name; - if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; - return get.translation(name); - }(game.me),index); + game.broadcastAll( + function (id, card, name, index) { + var dialog = get.idDialog(id); + if (!dialog) return; + var button = ui.create.button(card, "card", dialog.buttonss[index]); + button.querySelector(".info").innerHTML = + name + "|" + get.strNumber(card.number); + }, + event.videoId, + card, + (function (target) { + if (target._tempTranslate) return target._tempTranslate; + var name = target.name; + if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"]; + return get.translation(name); + })(game.me), + index + ); } } - 'step 2' - if(event.withol&&!event.resultOL){ + ("step 2"); + if (event.withol && !event.resultOL) { game.pause(); } - 'step 3' - if(event.ai_targets.length>0){ - event.withai=true; + ("step 3"); + if (event.ai_targets.length > 0) { + event.withai = true; game.pause(); } - 'step 4' - game.broadcastAll(function(){ - setTimeout(function(){ - ui.arena.classList.remove('choose-to-move'); - },500); - }) + ("step 4"); + game.broadcastAll(function () { + setTimeout(function () { + ui.arena.classList.remove("choose-to-move"); + }, 500); + }); game.delay(2); - var num1=0,num2=0; - for(var i of event.cards2[0]) num1+=get.number(i,false); - for(var i of event.cards2[1]) num2+=get.number(i,false); - var result=2; - if(num10) result=1; - event.duanzao_result=result; - game.broadcastAll(function(id,result){ - var dialog=get.idDialog(id); - if(dialog) dialog.content.firstChild.innerHTML=['锻造失败…','锻造成功','完美锻造!'][result]; - },event.videoId,result) - 'step 5' + var num1 = 0, + num2 = 0; + for (var i of event.cards2[0]) num1 += get.number(i, false); + for (var i of event.cards2[1]) num2 += get.number(i, false); + var result = 2; + if (num1 < num2) result = 0; + else if (num2 > 0) result = 1; + event.duanzao_result = result; + game.broadcastAll( + function (id, result) { + var dialog = get.idDialog(id); + if (dialog) + dialog.content.firstChild.innerHTML = ["锻造失败…", "锻造成功", "完美锻造!"][ + result + ]; + }, + event.videoId, + result + ); + ("step 5"); game.cardsGotoOrdering(event.cardsx); - game.broadcastAll('closeDialog',event.videoId); - 'step 6' - var subtype=get.subtype(cards[0]); - if(subtype!='equip1'&&subtype!='equip2') subtype='others'; - var card_map={ - equip1:[ - ['diamond',13,'bintieshuangji'], - ['diamond',1,'wuxinghelingshan'], - ['spade',13,'wutiesuolian'], - ['diamond',12,'wushuangfangtianji'], - ['spade',6,'chixueqingfeng'], - ['spade',5,'guilongzhanyuedao'], + game.broadcastAll("closeDialog", event.videoId); + ("step 6"); + var subtype = get.subtype(cards[0]); + if (subtype != "equip1" && subtype != "equip2") subtype = "others"; + var card_map = { + equip1: [ + ["diamond", 13, "bintieshuangji"], + ["diamond", 1, "wuxinghelingshan"], + ["spade", 13, "wutiesuolian"], + ["diamond", 12, "wushuangfangtianji"], + ["spade", 6, "chixueqingfeng"], + ["spade", 5, "guilongzhanyuedao"], ], - equip2:[ - ['club',1,'huxinjing'], - ['club',2,'heiguangkai'], - ['spade',2,'linglongshimandai'], - ['club',1,'hongmianbaihuapao'], - ['spade',2,'qimenbagua'], - ['spade',9,'guofengyupao'], + equip2: [ + ["club", 1, "huxinjing"], + ["club", 2, "heiguangkai"], + ["spade", 2, "linglongshimandai"], + ["club", 1, "hongmianbaihuapao"], + ["spade", 2, "qimenbagua"], + ["spade", 9, "guofengyupao"], ], - others:[ - ['diamond',1,'zhaogujing'], - ['spade',5,'sanlve'], - ['club',12,'tianjitu'], - ['spade',2,'taigongyinfu'], - ['diamond',1,'shufazijinguan'], - ['club',4,'xuwangzhimian'], + others: [ + ["diamond", 1, "zhaogujing"], + ["spade", 5, "sanlve"], + ["club", 12, "tianjitu"], + ["spade", 2, "taigongyinfu"], + ["diamond", 1, "shufazijinguan"], + ["club", 4, "xuwangzhimian"], ], }; - if(!_status.olshengong_map) _status.olshengong_map={}; - if(!_status.olshengong_maken) _status.olshengong_maken={}; - var list=card_map[subtype]; - for(var i=0;i0; + draw: { + audio: "olshengong", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.countMark("olshengong_draw") > 0; }, - content:function(){ - player.draw(player.countMark('olshengong_draw')); + content: function () { + player.draw(player.countMark("olshengong_draw")); }, }, }, }, - olqisi:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - filter:function(event,player){ - return !event.numFixed&&event.num>0; + olqisi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { + return !event.numFixed && event.num > 0; }, - check:function(event,player){ - if(player.hasEmptySlot(2)||player.hasEmptySlot(5)||player.hasEmptySlot(1)) return true; + check: function (event, player) { + if (player.hasEmptySlot(2) || player.hasEmptySlot(5) || player.hasEmptySlot(1)) + return true; return false; }, - prompt2:'摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。', - content:function(){ - 'step 0' - player.chooseControl('equip1','equip2','equip6','equip5').set('prompt','选择获得一种副类别的装备牌').set('ai',function(card){ - if(player.hasEmptySlot(2)) return 'equip2'; - if(player.hasEmptySlot(5)) return 'equip5'; - if(player.hasEmptySlot(1)) return 'equip1'; - return 'equip6'; + prompt2: + "摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。", + content: function () { + "step 0"; + player + .chooseControl("equip1", "equip2", "equip6", "equip5") + .set("prompt", "选择获得一种副类别的装备牌") + .set("ai", function (card) { + if (player.hasEmptySlot(2)) return "equip2"; + if (player.hasEmptySlot(5)) return "equip5"; + if (player.hasEmptySlot(1)) return "equip1"; + return "equip6"; + }); + ("step 1"); + var card = get.cardPile(function (card) { + var type = get.subtype(card); + if (result.control == "equip6") return type == "equip3" || type == "equip4"; + return type == result.control; }); - 'step 1' - var card=get.cardPile(function(card){ - var type=get.subtype(card); - if(result.control=='equip6') return (type=='equip3'||type=='equip4'); - return type==result.control; - }); - if(card){ + if (card) { trigger.num--; - player.gain(card,'gain2'); + player.gain(card, "gain2"); } }, - group:'olqisi_init', - subSkill:{ - init:{ - audio:'olqisi', - trigger:{ - global:'phaseBefore', - player:'enterGame', + group: "olqisi_init", + subSkill: { + init: { + audio: "olqisi", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - var i=0; - var list=[]; - while(i++<2){ - var card=get.cardPile(function(card){ - if(get.type(card)!='equip') return false; - return list.length==0||get.subtype(card)!=get.subtype(list[0]); + content: function () { + "step 0"; + var i = 0; + var list = []; + while (i++ < 2) { + var card = get.cardPile(function (card) { + if (get.type(card) != "equip") return false; + return list.length == 0 || get.subtype(card) != get.subtype(list[0]); }); - if(card) list.push(card); + if (card) list.push(card); } - if(!list.length){event.finish();return;} - event.list=list; - player.gain(event.list,'gain2'); - 'step 1' + if (!list.length) { + event.finish(); + return; + } + event.list = list; + player.gain(event.list, "gain2"); + ("step 1"); game.delay(1); - var card=event.list.shift(); - if(player.getCards('h').includes(card)){ - player.$give(card,player,false) + var card = event.list.shift(); + if (player.getCards("h").includes(card)) { + player.$give(card, player, false); player.equip(card); } - if(event.list.length) event.redo(); + if (event.list.length) event.redo(); }, }, }, }, //蒲元衍生 - zhaogujing_skill:{ - equipSkill:true, - trigger:{player:'phaseUseEnd'}, - direct:true, - filter:function(event,player){ - return player.hasCard(function(card){ - if(_status.connectMode) return true; - var type=get.type(card,player); - return type=='basic'||type=='trick'; - },'h'); + zhaogujing_skill: { + equipSkill: true, + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return player.hasCard(function (card) { + if (_status.connectMode) return true; + var type = get.type(card, player); + return type == "basic" || type == "trick"; + }, "h"); }, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('zhaogujing_skill'),'展示并视为使用一张基本牌或普通锦囊牌',function(card,player){ - var type=get.type(card,player); - return type=='basic'||type=='trick'; - }).set('ai',function(card){ - var player=_status.event.player,name=get.name(card,player); - if(name=='jiu') return 0; - return player.getUseValue({ - name:name, - nature:get.nature(card,player), - isCard:true, - }) - }); - 'step 1' - if(result.bool){ - player.logSkill('zhaogujing_skill'); - player.showCards(result.cards,get.translation(player)+'发动了【照骨镜】'); - var card={ - name:get.name(result.cards[0],player), - nature:get.nature(result.cards[0],player), - isCard:true, - } - player.chooseUseTarget(card,true,false); + content: function () { + "step 0"; + player + .chooseCard( + "h", + get.prompt("zhaogujing_skill"), + "展示并视为使用一张基本牌或普通锦囊牌", + function (card, player) { + var type = get.type(card, player); + return type == "basic" || type == "trick"; + } + ) + .set("ai", function (card) { + var player = _status.event.player, + name = get.name(card, player); + if (name == "jiu") return 0; + return player.getUseValue({ + name: name, + nature: get.nature(card, player), + isCard: true, + }); + }); + ("step 1"); + if (result.bool) { + player.logSkill("zhaogujing_skill"); + player.showCards(result.cards, get.translation(player) + "发动了【照骨镜】"); + var card = { + name: get.name(result.cards[0], player), + nature: get.nature(result.cards[0], player), + isCard: true, + }; + player.chooseUseTarget(card, true, false); } }, }, - sanlve_skill:{ - equipSkill:true, - mod:{ - maxHandcard:function(player,num){ - return num+1; + sanlve_skill: { + equipSkill: true, + mod: { + maxHandcard: function (player, num) { + return num + 1; }, - attackRange:function(player,num){ - return num+1; + attackRange: function (player, num) { + return num + 1; }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, }, - xuwangzhimian:{ - equipSkill:true, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:function(event,player){ + xuwangzhimian: { + equipSkill: true, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=2; + content: function () { + trigger.num += 2; + }, + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, }, - mod:{ - maxHandcard:function(player,num){ - return num-1; - } - } }, - shufazijinguan_skill:{ - equipSkill:true, - trigger:{ - player:"phaseZhunbeiBegin", + shufazijinguan_skill: { + equipSkill: true, + trigger: { + player: "phaseZhunbeiBegin", }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('shufazijinguan'),'对一名其他角色造成1点伤害',function(card,player,target){ - return player!=target; - }).set('ai',function(target){ - return get.damageEffect(target,player,player); - }); - "step 1" - if(result.bool){ - player.logSkill('shufazijinguan_skill',result.targets[0]); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("shufazijinguan"), + "对一名其他角色造成1点伤害", + function (card, player, target) { + return player != target; + } + ) + .set("ai", function (target) { + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("shufazijinguan_skill", result.targets[0]); result.targets[0].damage(); } }, }, - qimenbagua:{ - equipSkill:true, - trigger:{target:'useCardToBefore'}, - forced:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(player.hasSkillTag('unequip2')) return false; - if(event.player.hasSkillTag('unequip',false,{ - name:event.card?event.card.name:null, - target:player, - card:event.card - })) return false; - return true; - }, - content:function(){ - trigger.cancel(); - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name!='sha') return; - if(target.hasSkillTag('unequip2')||player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:player, - card:card - })||player.hasSkillTag('unequip_ai',false,{ - name:card?card.name:null, - target:player, - card:card - })) return; - return 'zerotarget'; - } - } - } - }, - guofengyupao:{ - equipSkill:true, - mod:{ - targetEnabled:function(card,player,target){ - if(player==target||get.type(card)!='trick') return; - if(target.hasSkillTag('unequip2')) return; - if(player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:player, - card:card - })) return; + qimenbagua: { + equipSkill: true, + trigger: { target: "useCardToBefore" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.player.hasSkillTag("unequip", false, { + name: event.card ? event.card.name : null, + target: player, + card: event.card, + }) + ) return false; - } - } - }, - hongmianbaihuapao_skill:{ - equipSkill:true, - trigger:{ - player:"damageBegin4", - }, - filter:function(event,player){ - if(!event.hasNature('linked')) return false; - if(player.hasSkillTag('unequip2')) return false; - if(event.source&&event.source.hasSkillTag('unequip',false,{ - name:event.card?event.card.name:null, - target:player, - card:event.card - })) return false; return true; }, - forced:true, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - nofire:true, - nothunder:true, - effect:{ - target:function(card,player,target,current){ - if(!get.tag(card,'natureDamage')) return; - if(!target.hasSkillTag('unequip2')&&!player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:player, - card:card - })&&!player.hasSkillTag('unequip_ai',false,{ - name:card?card.name:null, - target:player, - card:card - })) return 'zerotarget'; + ai: { + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + if ( + target.hasSkillTag("unequip2") || + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; + return "zerotarget"; }, }, }, }, - linglongshimandai_skill:{ - equipSkill:true, - trigger:{ - target:"useCardToTargeted", + guofengyupao: { + equipSkill: true, + mod: { + targetEnabled: function (card, player, target) { + if (player == target || get.type(card) != "trick") return; + if (target.hasSkillTag("unequip2")) return; + if ( + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; + return false; + }, }, - filter:function(event,player){ - if(event.targets&&event.targets.length>1||event.player==player) return false; - if(player.hasSkillTag('unequip2')) return false; - var evt=event.getParent(); - if(evt.player&&evt.player.hasSkillTag('unequip',false,{ - name:evt.card?evt.card.name:null, - target:player, - card:evt.card - })) return false; + }, + hongmianbaihuapao_skill: { + equipSkill: true, + trigger: { + player: "damageBegin4", + }, + filter: function (event, player) { + if (!event.hasNature("linked")) return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.source && + event.source.hasSkillTag("unequip", false, { + name: event.card ? event.card.name : null, + target: player, + card: event.card, + }) + ) + return false; return true; }, - audio:true, - check:function(event,player){ - return get.effect(player,event.card,event.player,player)<=0; + forced: true, + content: function () { + trigger.cancel(); }, - prompt2:(event)=>('进行一次判定。若结果为♥,则'+get.translation(event.card)+'对你无效'), - content:function(){ - "step 0" - player.judge('linglongshimandai',function(card){return (get.suit(card)=='heart')?1.5:-0.5}).judge2=function(result){ - return result.bool?true:false; + ai: { + nofire: true, + nothunder: true, + effect: { + target: function (card, player, target, current) { + if (!get.tag(card, "natureDamage")) return; + if ( + !target.hasSkillTag("unequip2") && + !player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) && + !player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return "zerotarget"; + }, + }, + }, + }, + linglongshimandai_skill: { + equipSkill: true, + trigger: { + target: "useCardToTargeted", + }, + filter: function (event, player) { + if ((event.targets && event.targets.length > 1) || event.player == player) return false; + if (player.hasSkillTag("unequip2")) return false; + var evt = event.getParent(); + if ( + evt.player && + evt.player.hasSkillTag("unequip", false, { + name: evt.card ? evt.card.name : null, + target: player, + card: evt.card, + }) + ) + return false; + return true; + }, + audio: true, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) <= 0; + }, + prompt2: (event) => "进行一次判定。若结果为♥,则" + get.translation(event.card) + "对你无效", + content: function () { + "step 0"; + player.judge("linglongshimandai", function (card) { + return get.suit(card) == "heart" ? 1.5 : -0.5; + }).judge2 = function (result) { + return result.bool ? true : false; }; - "step 1" - if(result.judge>0){ + ("step 1"); + if (result.judge > 0) { trigger.getParent().excluded.add(player); } }, - ai:{ - effect:{ - target:function(card,player,target,effect){ - if(effect>0||player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:player, - card:card - })||player.hasSkillTag('unequip_ai',false,{ - name:card?card.name:null, - target:player, - card:card - })) return; + ai: { + effect: { + target: function (card, player, target, effect) { + if ( + effect > 0 || + player.hasSkillTag("unequip", false, { + name: card ? card.name : null, + target: player, + card: card, + }) || + player.hasSkillTag("unequip_ai", false, { + name: card ? card.name : null, + target: player, + card: card, + }) + ) + return; return 0.75; }, }, }, }, - bintieshuangji_skill:{ - trigger:{player:'shaMiss'}, - filter:function(event,player){ - return player.hp>0; + bintieshuangji_skill: { + trigger: { player: "shaMiss" }, + filter: function (event, player) { + return player.hp > 0; }, - prompt2:function(event,player){ - var prompt='失去1点体力,然后'; - var cards=event.cards.filterInD(); - if(cards.length) prompt+=('获得'+get.translation(cards)+'、'); - prompt+='摸一张牌、本回合使用【杀】的次数上限+1'; + prompt2: function (event, player) { + var prompt = "失去1点体力,然后"; + var cards = event.cards.filterInD(); + if (cards.length) prompt += "获得" + get.translation(cards) + "、"; + prompt += "摸一张牌、本回合使用【杀】的次数上限+1"; return prompt; }, - check:function(event,player){ - if(get.effect(player,{name:'losehp'},player,player)>0) return true; - return player.hp>event.target.hp&&event.cards.filterInD().length>0; + check: function (event, player) { + if (get.effect(player, { name: "losehp" }, player, player) > 0) return true; + return player.hp > event.target.hp && event.cards.filterInD().length > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseHp(); - 'step 1' - var cards=trigger.cards.filterInD(); - if(cards.length) player.gain(cards,'gain2'); + ("step 1"); + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); player.draw(); - 'step 2' - player.addTempSkill('bintieshuangji_skill_effect'); - player.addMark('bintieshuangji_skill_effect',1,false); + ("step 2"); + player.addTempSkill("bintieshuangji_skill_effect"); + player.addMark("bintieshuangji_skill_effect", 1, false); }, - subSkill:{ - effect:{ - charlotte:true, - intro:{content:'使用【杀】的次数上限+#'}, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('bintieshuangji_skill_effect'); + subSkill: { + effect: { + charlotte: true, + intro: { content: "使用【杀】的次数上限+#" }, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") + return num + player.countMark("bintieshuangji_skill_effect"); }, }, }, }, }, - chixueqingfeng:{ - equipSkill:true, - trigger:{player:'useCardToPlayered'}, - filter:function(event){ - return event.card.name=='sha'; + chixueqingfeng: { + equipSkill: true, + trigger: { player: "useCardToPlayered" }, + filter: function (event) { + return event.card.name == "sha"; }, - logTarget:'target', - forced:true, - content:function(){ - var target=trigger.target; - target.addTempSkill('chixueqingfeng2'); - target.markAuto('chixueqingfeng2',[trigger.card]) + logTarget: "target", + forced: true, + content: function () { + var target = trigger.target; + target.addTempSkill("chixueqingfeng2"); + target.markAuto("chixueqingfeng2", [trigger.card]); }, - ai:{ - unequip_ai:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.card&&arg.card.name=='sha') return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") return true; return false; - } - } - }, - chixueqingfeng2:{ - equipSkill:true, - trigger:{global:'useCardAfter'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - onremove:true, - filter:function(event,player){ - return player.storage.chixueqingfeng2&&player.storage.chixueqingfeng2.includes(event.card); - }, - content:function(){ - player.storage.chixueqingfeng2.remove(trigger.card); - if(!player.storage.chixueqingfeng2.length) player.removeSkill('chixueqingfeng2'); - }, - mark:true, - marktext:'※', - intro:{ - content:'防具技能无效,且不能使用或打出手牌', - }, - mod:{ - cardEnabled2:function(card){ - if(get.position(card)=='h') return false; }, }, - ai:{ - unequip2:true, + }, + chixueqingfeng2: { + equipSkill: true, + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + popup: false, + firstDo: true, + onremove: true, + filter: function (event, player) { + return ( + player.storage.chixueqingfeng2 && player.storage.chixueqingfeng2.includes(event.card) + ); + }, + content: function () { + player.storage.chixueqingfeng2.remove(trigger.card); + if (!player.storage.chixueqingfeng2.length) player.removeSkill("chixueqingfeng2"); + }, + mark: true, + marktext: "※", + intro: { + content: "防具技能无效,且不能使用或打出手牌", + }, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; + }, + }, + ai: { + unequip2: true, }, }, - guilongzhanyuedao:{ - equipSkill:true, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&get.color(event.card)=='red'; + guilongzhanyuedao: { + equipSkill: true, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && get.color(event.card) == "red"; }, - content:function(){ + content: function () { trigger.directHit.addArray(game.players); }, - ai:{ - unequip_ai:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.card&&arg.card.name=='sha'&&get.color(arg.card)=='red') return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha" && get.color(arg.card) == "red") + return true; return false; - } - } + }, + }, }, - wushuangfangtianji_skill:{ - equipSkill:true, - trigger:{ - source:"damageSource", + wushuangfangtianji_skill: { + equipSkill: true, + trigger: { + source: "damageSource", }, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.getParent().type=='card'; + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.getParent().type == "card"; }, - direct:true, - content:function(){ - 'step 0' - var target=trigger.player; - var choices=['摸一张牌']; - if(target.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,target); - },'he')) choices.push('弃置'+get.translation(target)+'的一张牌'); - player.chooseControl('cancel2').set('choiceList',choices).set('prompt',get.prompt('wushuangfangtianji_skill')).set('ai',function(){ - var player=_status.event.player,target=_status.event.getTrigger().player; - if(target.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,target); - },'he')&&get.effect(target,{name:'guohe_copy2'},player,player)>get.effect(player,{name:'draw'},player,player)) return 1; - return 0; - }); - 'step 1' - if(result.control=='cancel2') return; - if(result.index==0){ - player.logSkill('wushuangfangtianji_skill'); + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + var choices = ["摸一张牌"]; + if ( + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ) + choices.push("弃置" + get.translation(target) + "的一张牌"); + player + .chooseControl("cancel2") + .set("choiceList", choices) + .set("prompt", get.prompt("wushuangfangtianji_skill")) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + if ( + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") && + get.effect(target, { name: "guohe_copy2" }, player, player) > + get.effect(player, { name: "draw" }, player, player) + ) + return 1; + return 0; + }); + ("step 1"); + if (result.control == "cancel2") return; + if (result.index == 0) { + player.logSkill("wushuangfangtianji_skill"); player.draw(); - } - else{ - var target=trigger.player; - player.logSkill('wushuangfangtianji_skill',target); - player.discardPlayerCard(target,'he',true); + } else { + var target = trigger.player; + player.logSkill("wushuangfangtianji_skill", target); + player.discardPlayerCard(target, "he", true); } }, }, //芮姬 - qiaoli:{ - onChooseToUse:function(event){ - if(event.type=='phase'&&!game.online&&!(event.qiaoli_equip1&&event.qiaoli_noequip1)){ - var player=event.player; - var evt=event.getParent('phaseUse'); - if(player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt&&evtx.skill=='qiaoli'&&get.subtype(evtx.cards[0])=='equip1'; - }).length) event.set('qiaoli_equip1',true); - if(player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt&&evtx.skill=='qiaoli'&&get.subtype(evtx.cards[0])!='equip1'; - }).length) event.set('qiaoli_noequip1',true); + qiaoli: { + onChooseToUse: function (event) { + if ( + event.type == "phase" && + !game.online && + !(event.qiaoli_equip1 && event.qiaoli_noequip1) + ) { + var player = event.player; + var evt = event.getParent("phaseUse"); + if ( + player.getHistory("useCard", function (evtx) { + return ( + evtx.getParent("phaseUse") == evt && + evtx.skill == "qiaoli" && + get.subtype(evtx.cards[0]) == "equip1" + ); + }).length + ) + event.set("qiaoli_equip1", true); + if ( + player.getHistory("useCard", function (evtx) { + return ( + evtx.getParent("phaseUse") == evt && + evtx.skill == "qiaoli" && + get.subtype(evtx.cards[0]) != "equip1" + ); + }).length + ) + event.set("qiaoli_noequip1", true); } }, - audio:2, - enable:'phaseUse', - viewAs:{ - name:'juedou', - qiaoli:true, + audio: 2, + enable: "phaseUse", + viewAs: { + name: "juedou", + qiaoli: true, }, - filterCard:function(card,player){ - if(get.type(card)!='equip') return false; - var event=_status.event; - if(get.subtype(card)=='equip1'&&event.qiaoli_equip1) return false; - if(get.subtype(card)!='equip1'&&event.qiaoli_noequip1) return false; + filterCard: function (card, player) { + if (get.type(card) != "equip") return false; + var event = _status.event; + if (get.subtype(card) == "equip1" && event.qiaoli_equip1) return false; + if (get.subtype(card) != "equip1" && event.qiaoli_noequip1) return false; return true; }, - viewAsFilter:function(player){ - return player.isPhaseUsing()&&player.hasCard(function(card){ - return lib.skill.qiaoli.filterCard(card,player); - },'hes'); + viewAsFilter: function (player) { + return ( + player.isPhaseUsing() && + player.hasCard(function (card) { + return lib.skill.qiaoli.filterCard(card, player); + }, "hes") + ); }, - check:function(card){ - if(get.position(card)=='e') return 7.5-get.value(card); - return 12-_status.event.player.getUseValue(card); + check: function (card) { + if (get.position(card) == "e") return 7.5 - get.value(card); + return 12 - _status.event.player.getUseValue(card); }, - position:'hes', - precontent:function(){ - player.addTempSkill('qiaoli_norespond'); - player.addTempSkill('qiaoli_effect'); + position: "hes", + precontent: function () { + player.addTempSkill("qiaoli_norespond"); + player.addTempSkill("qiaoli_effect"); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg&&arg.card&&arg.card.name=='juedou'&&_status.event.skill=='qiaoli'; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return ( + arg && arg.card && arg.card.name == "juedou" && _status.event.skill == "qiaoli" + ); }, }, - subSkill:{ - norespond:{ - charlotte:true, - trigger:{player:'useCard1'}, - filter:function(event,player){ - return event.card.qiaoli&&get.subtype(event.cards[0])!='equip1'; + subSkill: { + norespond: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return event.card.qiaoli && get.subtype(event.cards[0]) != "equip1"; }, - forced:true, - popup:false, - content:function(){ - player.addTempSkill('qiaoli_gain'); + forced: true, + popup: false, + content: function () { + player.addTempSkill("qiaoli_gain"); trigger.directHit.addArray(game.players); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); }, }, - effect:{ - charlotte:true, - trigger:{source:'damageSource'}, - filter:function(event,player){ - return event.card&&event.cards&&event.card.qiaoli&&get.subtype(event.cards[0])=='equip1'; + effect: { + charlotte: true, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return ( + event.card && + event.cards && + event.card.qiaoli && + get.subtype(event.cards[0]) == "equip1" + ); }, - forced:true, - popup:false, - content:function(){ - 'step 0' - var card=trigger.cards[0]; - var num=1; - var info=get.info(card,false); - if(info&&info.distance&&typeof info.distance.attackFrom=='number') num-=info.distance.attackFrom; + forced: true, + popup: false, + content: function () { + "step 0"; + var card = trigger.cards[0]; + var num = 1; + var info = get.info(card, false); + if (info && info.distance && typeof info.distance.attackFrom == "number") + num -= info.distance.attackFrom; player.draw(num); - 'step 1' - var cards=result; - if(get.itemtype(cards)!='cards'){ + ("step 1"); + var cards = result; + if (get.itemtype(cards) != "cards") { event.finish(5); return; } - var hs=player.getCards('h'); - cards=cards.filter(function(card){ + var hs = player.getCards("h"); + cards = cards.filter(function (card) { return hs.includes(card); }); - if(!cards.length){ + if (!cards.length) { event.finish(5); return; } - event.cards=cards; - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - 'step 2' + event.cards = cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + ("step 2"); player.chooseCardTarget({ - filterCard:function(card){ - return _status.event.cards.includes(card)&&!card.hasGaintag('qiaoli_given'); + filterCard: function (card) { + return ( + _status.event.cards.includes(card) && !card.hasGaintag("qiaoli_given") + ); }, - cards:cards, - filterTarget:lib.filter.notMe, - selectCard:[1,cards.length], - prompt:'是否将获得的牌分配给其他角色?', - ai1:function(card){ + cards: cards, + filterTarget: lib.filter.notMe, + selectCard: [1, cards.length], + prompt: "是否将获得的牌分配给其他角色?", + ai1: function (card) { return -1; }, - ai2:function(target){ + ai2: function (target) { return -1; }, }); - 'step 3' - if(result.bool){ - var res=result.cards,target=result.targets[0].playerid; - player.addGaintag(res,'qiaoli_given'); + ("step 3"); + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "qiaoli_given"); cards.removeArray(res); - if(!event.given_map[target]) event.given_map[target]=[]; + if (!event.given_map[target]) event.given_map[target] = []; event.given_map[target].addArray(res); - if(cards.length) event.goto(2); + if (cards.length) event.goto(2); } - 'step 4' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown}); + ("step 4"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + }); game.stopCountChoose(); } - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - source.gain(event.given_map[i],player,'giveAuto'); + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + source.gain(event.given_map[i], player, "giveAuto"); } - event.next.sort(function(a,b){ - return lib.sort.seat(a.player,b.player); + event.next.sort(function (a, b) { + return lib.sort.seat(a.player, b.player); }); }, }, - gain:{ - charlotte:true, - audio:'qiaoli', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - content:function(){ - var card=get.cardPile2(function(card){ - return get.type(card)=='equip'; + gain: { + charlotte: true, + audio: "qiaoli", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + content: function () { + var card = get.cardPile2(function (card) { + return get.type(card) == "equip"; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); }, }, }, }, - qingliang:{ - audio:2, - trigger:{target:'useCardToTarget'}, - filter:function(event,player){ - if(event.targets.length!=1) return false; - var bool1=(event.card.name=='sha'); - var bool2=(get.type2(event.card)=='trick'&&get.tag(event.card,'damage')); - if(!bool1&&!bool2) return false; - return player!=event.player&&player.countCards('h')>0; + qingliang: { + audio: 2, + trigger: { target: "useCardToTarget" }, + filter: function (event, player) { + if (event.targets.length != 1) return false; + var bool1 = event.card.name == "sha"; + var bool2 = get.type2(event.card) == "trick" && get.tag(event.card, "damage"); + if (!bool1 && !bool2) return false; + return player != event.player && player.countCards("h") > 0; }, - usable:1, - logTarget:'player', - check:function(event,player){ - if(get.attitude(player,event.player)>0||event.player.hasSkillTag('nogain')) return true; - var eff=get.effect(player,event.card,event.player,player); - if(eff>=0) return false; - var suits=[],banned=[],hs=player.getCards('h'); - for(var i of hs){ - var suit=get.suit(i,player); + usable: 1, + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) > 0 || event.player.hasSkillTag("nogain")) + return true; + var eff = get.effect(player, event.card, event.player, player); + if (eff >= 0) return false; + var suits = [], + banned = [], + hs = player.getCards("h"); + for (var i of hs) { + var suit = get.suit(i, player); suits.add(suit); - if(!lib.filter.cardDiscardable(i,player,'qingliang')) banned.add(suit); + if (!lib.filter.cardDiscardable(i, player, "qingliang")) banned.add(suit); } suits.removeArray(banned); - for(var i of suits){ - var cards=player.getCards('h',function(card){ - return get.suit(card,player)==i; + for (var i of suits) { + var cards = player.getCards("h", function (card) { + return get.suit(card, player) == i; }); - if((-eff/2-get.value(cards,player))>0) return true; + if (-eff / 2 - get.value(cards, player) > 0) return true; } return false; }, - content:function(){ - 'step 0' - player.showHandcards(get.translation(player)+'发动了【清靓】'); - 'step 1' - var suits=[],banned=[],hs=player.getCards('h'); - for(var i of hs){ - var suit=get.suit(i,player); + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【清靓】"); + ("step 1"); + var suits = [], + banned = [], + hs = player.getCards("h"); + for (var i of hs) { + var suit = get.suit(i, player); suits.add(suit); - if(!lib.filter.cardDiscardable(i,player,'qingliang')) banned.add(suit); + if (!lib.filter.cardDiscardable(i, player, "qingliang")) banned.add(suit); } - if(suits.length>banned.length){ - player.chooseControl().set('choiceList',[ - '和'+get.translation(trigger.player)+'各摸一张牌', - '弃置一种花色的所有手牌,令'+get.translation(trigger.card)+'对自己无效', - ]).set('ai',function(){ - var player=_status.event.player,event=_status.event.getTrigger(); - if(get.attitude(player,event.player)>0||event.player.hasSkillTag('nogain')) return 0; - return 1; - }); - event.suits=suits; + if (suits.length > banned.length) { + player + .chooseControl() + .set("choiceList", [ + "和" + get.translation(trigger.player) + "各摸一张牌", + "弃置一种花色的所有手牌,令" + get.translation(trigger.card) + "对自己无效", + ]) + .set("ai", function () { + var player = _status.event.player, + event = _status.event.getTrigger(); + if ( + get.attitude(player, event.player) > 0 || + event.player.hasSkillTag("nogain") + ) + return 0; + return 1; + }); + event.suits = suits; suits.removeArray(banned); suits.sort(); + } else { + event._result = { index: 0 }; } - else{ - event._result={index:0}; - } - 'step 2' - if(result.index==0){ - var list=[player,trigger.player].sortBySeat(); - list[0].draw('nodelay'); + ("step 2"); + if (result.index == 0) { + var list = [player, trigger.player].sortBySeat(); + list[0].draw("nodelay"); list[1].draw(); event.finish(); - } - else{ - if(event.suits.length==1) event._result={control:event.suits[0]}; - else player.chooseControl(event.suits).set('prompt','选择弃置一种花色的所有牌').set('ai',function(){ - var player=_status.event.player,list=_status.event.controls.slice(0); - var gett=function(suit){ - var cards=player.getCards('h',function(card){ - return get.suit(card,player)==suit; + } else { + if (event.suits.length == 1) event._result = { control: event.suits[0] }; + else + player + .chooseControl(event.suits) + .set("prompt", "选择弃置一种花色的所有牌") + .set("ai", function () { + var player = _status.event.player, + list = _status.event.controls.slice(0); + var gett = function (suit) { + var cards = player.getCards("h", function (card) { + return get.suit(card, player) == suit; + }); + return get.value(cards); + }; + return list.sort(function (b, a) { + return gett(b) - gett(a); + })[0]; }); - return get.value(cards); - } - return list.sort(function(b,a){ - return gett(b)-gett(a); - })[0]; - }); } - 'step 3' - var cards=player.getCards('h',function(card){ - return get.suit(card)==result.control; + ("step 3"); + var cards = player.getCards("h", function (card) { + return get.suit(card) == result.control; }); - if(cards.length) player.discard(cards); + if (cards.length) player.discard(cards); trigger.targets.remove(player); trigger.getParent().triggeredTargets2.remove(player); trigger.untrigger(); }, }, //卫兹 - yuanzi:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - logTarget:'player', - filter:function(event,player){ - return player!=event.player&&event.player.isIn()&&player.countCards('h')>0&&!player.hasSkill('yuanzi_round',null,null,false); + yuanzi: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + logTarget: "player", + filter: function (event, player) { + return ( + player != event.player && + event.player.isIn() && + player.countCards("h") > 0 && + !player.hasSkill("yuanzi_round", null, null, false) + ); }, - check:function(event,player){ - if(event.player.hasJudge('lebu')||get.attitude(player,event.player)<2) return false; - return game.hasPlayer(function(current){ - return current!==player&¤t!==event.player&&event.player.inRange(current)&&get.attitude(event.player,current)<0; + check: function (event, player) { + if (event.player.hasJudge("lebu") || get.attitude(player, event.player) < 2) return false; + return game.hasPlayer(function (current) { + return ( + current !== player && + current !== event.player && + event.player.inRange(current) && + get.attitude(event.player, current) < 0 + ); }); }, - content:function(){ - var cards=player.getCards('h'); - player.give(cards,trigger.player); - player.addTempSkill('yuanzi_effect'); - player.addTempSkill('yuanzi_round','roundStart'); + content: function () { + var cards = player.getCards("h"); + player.give(cards, trigger.player); + player.addTempSkill("yuanzi_effect"); + player.addTempSkill("yuanzi_round", "roundStart"); }, - subSkill:{ - effect:{ - charlotte:true, - audio:'yuanzi', - trigger:{global:'damageSource'}, - forced:true, - filter:function(event,player){ - var source=event.source; - return source&&source==_status.currentPhase&&player.countCards('h')<=source.countCards('h'); + subSkill: { + effect: { + charlotte: true, + audio: "yuanzi", + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + var source = event.source; + return ( + source && + source == _status.currentPhase && + player.countCards("h") <= source.countCards("h") + ); }, - content:function(){ + content: function () { player.draw(2); }, }, - round:{charlotte:true}, + round: { charlotte: true }, }, }, - liejie:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + liejie: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - var source=trigger.source; - var prompt2='弃置至多三张牌并摸等量的牌'; - if(source) prompt2+=(',若弃置的牌中有红色牌,则弃置'+get.translation(source)+'至多等量的牌'); - var next=player.chooseToDiscard('he',[1,3],get.prompt('liejie'),prompt2); - next.set('ai',function(card){ - return 6-get.value(card); - }) - if(source) next.logSkill=['liejie',source]; - else next.logSkill='liejie'; - 'step 1' - if(result.bool){ - var cards=result.cards; + content: function () { + "step 0"; + var source = trigger.source; + var prompt2 = "弃置至多三张牌并摸等量的牌"; + if (source) + prompt2 += + ",若弃置的牌中有红色牌,则弃置" + get.translation(source) + "至多等量的牌"; + var next = player.chooseToDiscard("he", [1, 3], get.prompt("liejie"), prompt2); + next.set("ai", function (card) { + return 6 - get.value(card); + }); + if (source) next.logSkill = ["liejie", source]; + else next.logSkill = "liejie"; + ("step 1"); + if (result.bool) { + var cards = result.cards; player.draw(cards.length); - if(trigger.source){ - var num=cards.filter(function(i){ - return get.color(i,player)=='red'; + if (trigger.source) { + var num = cards.filter(function (i) { + return get.color(i, player) == "red"; }).length; - if(num>0) player.discardPlayerCard(trigger.source,'he',[1,num]).set('forceAuto',true); + if (num > 0) + player + .discardPlayerCard(trigger.source, "he", [1, num]) + .set("forceAuto", true); } } }, }, //滕芳兰 - luochong:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','damageEnd']}, - direct:true, - filter:function(event,player){ - if(event.name=='damage'){ - var history=player.getHistory('damage'); - if(history.indexOf(event)!=0) return false; + luochong: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "damageEnd"] }, + direct: true, + filter: function (event, player) { + if (event.name == "damage") { + var history = player.getHistory("damage"); + if (history.indexOf(event) != 0) return false; } - var storage1=player.storage.luochong_round,storage2=player.getStorage('luochong'); - if(!storage1) storage1=[[],[]]; - for(var i=0;i<4;i++){ - if(!storage1[0].includes(i)&&!storage2.includes(i)&&game.hasPlayer(function(current){ - return !storage1[1].includes(current)&&lib.skill.luochong.filterx[i](current); - })) return true; + var storage1 = player.storage.luochong_round, + storage2 = player.getStorage("luochong"); + if (!storage1) storage1 = [[], []]; + for (var i = 0; i < 4; i++) { + if ( + !storage1[0].includes(i) && + !storage2.includes(i) && + game.hasPlayer(function (current) { + return ( + !storage1[1].includes(current) && lib.skill.luochong.filterx[i](current) + ); + }) + ) + return true; } return false; }, - filterx:[ - (target)=>target.isDamaged(), - ()=>true, - (target)=>target.countCards('he')>0, - ()=>true, + filterx: [ + (target) => target.isDamaged(), + () => true, + (target) => target.countCards("he") > 0, + () => true, ], - onremove:true, - content:function(){ - 'step 0' - var list=[]; - var choiceList=[ - '令一名角色回复1点体力。', - '令一名角色失去1点体力。', - '令一名角色弃置两张牌。', - '令一名角色摸两张牌。', + onremove: true, + content: function () { + "step 0"; + var list = []; + var choiceList = [ + "令一名角色回复1点体力。", + "令一名角色失去1点体力。", + "令一名角色弃置两张牌。", + "令一名角色摸两张牌。", ]; - var storage1=player.storage.luochong_round,storage2=player.getStorage('luochong'); - if(!storage1) storage1=[[],[]]; - for(var i=0;i<4;i++){ - if(storage2.includes(i)){ - choiceList[i]=(''+choiceList[i]+''); - } - else if(storage1[0].includes(i)||!game.hasPlayer(function(current){ - return !storage1[1].includes(current)&&lib.skill.luochong.filterx[i](current); - })){ - choiceList[i]=(''+choiceList[i]+''); - } - else list.push('选项'+get.cnNumber(i+1,true)) + var storage1 = player.storage.luochong_round, + storage2 = player.getStorage("luochong"); + if (!storage1) storage1 = [[], []]; + for (var i = 0; i < 4; i++) { + if (storage2.includes(i)) { + choiceList[i] = + '' + + choiceList[i] + + ""; + } else if ( + storage1[0].includes(i) || + !game.hasPlayer(function (current) { + return ( + !storage1[1].includes(current) && lib.skill.luochong.filterx[i](current) + ); + }) + ) { + choiceList[i] = '' + choiceList[i] + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); } - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt('luochong')).set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player; - var list=_status.event.controls.slice(0); - var listx=(player.storage.luochong_round||[[],[]])[1]; - var gett=function(choice){ - if(choice=='cancel2') return 0.1; - var max=0,func={ - 选项一:function(current){ - if(current.isDamaged()) max=Math.max(max,get.recoverEffect(current,player,player)); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("luochong")) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player; + var list = _status.event.controls.slice(0); + var listx = (player.storage.luochong_round || [[], []])[1]; + var gett = function (choice) { + if (choice == "cancel2") return 0.1; + var max = 0, + func = { + 选项一: function (current) { + if (current.isDamaged()) + max = Math.max( + max, + get.recoverEffect(current, player, player) + ); + }, + 选项二: function (target) { + max = Math.max( + max, + get.effect(target, { name: "losehp" }, player, player) + ); + }, + 选项三: function (target) { + var num = target.countDiscardableCards(player, "he"); + if (num > 0) + max = Math.max( + max, + Math.sqrt(Math.min(2, num)) * + get.effect( + target, + { name: "guohe_copy2" }, + player, + player + ) + ); + }, + 选项四: function (target) { + max = Math.max( + max, + 2 * get.effect(target, { name: "draw" }, player, player) + ); + }, + }[choice]; + game.countPlayer(function (current) { + if (!listx.includes(current)) func(current); + }); + return max; + }; + return list.sort(function (a, b) { + return gett(b) - gett(a); + })[0]; + }); + ("step 1"); + if (result.control != "cancel2") { + var index = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + event.index = index; + var listx = (player.storage.luochong_round || [[], []])[1]; + var list = [ + [ + "选择一名角色,令其回复1点体力", + function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); }, - 选项二:function(target){ - max=Math.max(max,get.effect(target,{name:'losehp'},player,player)); + ], + [ + "选择一名角色,令其失去1点体力", + function (target) { + return get.effect(target, { name: "losehp" }, player, player); }, - 选项三:function(target){ - var num=target.countDiscardableCards(player,'he'); - if(num>0) max=Math.max(max,Math.sqrt(Math.min(2,num))*get.effect(target,{name:'guohe_copy2'},player,player)); + ], + [ + "选择一名角色,令其弃置两张牌", + function (target) { + var player = _status.event.player; + return ( + get.effect(target, { name: "guohe_copy2" }, player, player) * + Math.sqrt(Math.min(2, target.countCards("he"))) + ); }, - 选项四:function(target){ - max=Math.max(max,2*get.effect(target,{name:'draw'},player,player)); + ], + [ + "选择一名角色,令其摸两张牌", + function (target) { + var player = _status.event.player; + return 2 * get.effect(target, { name: "draw" }, player, player); }, - }[choice]; - game.countPlayer(function(current){ - if(!listx.includes(current)) func(current); - }); - return max; - }; - return list.sort(function(a,b){ - return gett(b)-gett(a); - })[0]; - }); - 'step 1' - if(result.control!='cancel2'){ - var index=['选项一','选项二','选项三','选项四'].indexOf(result.control); - event.index=index; - var listx=(player.storage.luochong_round||[[],[]])[1]; - var list=[ - ['选择一名角色,令其回复1点体力',function(target){ - var player=_status.event.player; - return get.recoverEffect(target,player,player); - }], - ['选择一名角色,令其失去1点体力',function(target){ - return get.effect(target,{name:'losehp'},player,player); - }], - ['选择一名角色,令其弃置两张牌',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player)*Math.sqrt(Math.min(2,target.countCards('he'))); - }], - ['选择一名角色,令其摸两张牌',function(target){ - var player=_status.event.player; - return 2*get.effect(target,{name:'draw'},player,player); - }] + ], ][index]; - var targets=game.filterPlayer(function(current){ - return !listx.includes(current)&&lib.skill.luochong.filterx[event.index](current); - }) - var next=player.chooseTarget(list[0],true,function(card,player,target){ + var targets = game.filterPlayer(function (current) { + return ( + !listx.includes(current) && lib.skill.luochong.filterx[event.index](current) + ); + }); + var next = player.chooseTarget(list[0], true, function (card, player, target) { return _status.event.targets.includes(target); }); - next.set('targets',targets); - next.set('ai',list[1]); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('luochong',target); - if(player!=target) player.addExpose(0.2); - player.addTempSkill('luochong_round','roundStart'); - if(!player.storage.luochong_round) player.storage.luochong_round=[[],[]]; + next.set("targets", targets); + next.set("ai", list[1]); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("luochong", target); + if (player != target) player.addExpose(0.2); + player.addTempSkill("luochong_round", "roundStart"); + if (!player.storage.luochong_round) player.storage.luochong_round = [[], []]; player.storage.luochong_round[0].push(event.index); player.storage.luochong_round[1].push(target); - switch(event.index){ + switch (event.index) { case 0: target.recover(); break; @@ -10876,7 +14229,7 @@ game.import('character', function () { target.loseHp(); break; case 2: - target.chooseToDiscard(true,'he',2); + target.chooseToDiscard(true, "he", 2); break; case 3: target.draw(2); @@ -10884,169 +14237,204 @@ game.import('character', function () { } } }, - subSkill:{ - round:{ - charlotte:true, - onremove:true, + subSkill: { + round: { + charlotte: true, + onremove: true, }, }, }, - aichen:{ - audio:2, - trigger:{player:'dying'}, - forced:true, - filter:function(event,player){ - return player.hasSkill('luochong',null,null,false)&&player.getStorage('luochong').length<3; + aichen: { + audio: 2, + trigger: { player: "dying" }, + forced: true, + filter: function (event, player) { + return ( + player.hasSkill("luochong", null, null, false) && + player.getStorage("luochong").length < 3 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; //var num=1-player.hp; //if(num>0) player.recover(num); - var list=[]; - var choiceList=[ - '令一名角色回复1点体力。', - '令一名角色失去1点体力。', - '令一名角色弃置两张牌。', - '令一名角色摸两张牌。', + var list = []; + var choiceList = [ + "令一名角色回复1点体力。", + "令一名角色失去1点体力。", + "令一名角色弃置两张牌。", + "令一名角色摸两张牌。", ]; - var storage2=player.getStorage('luochong'); - for(var i=0;i<4;i++){ - if(storage2.includes(i)){ - choiceList[i]=(''+choiceList[i]+''); - } - else list.push('选项'+get.cnNumber(i+1,true)) + var storage2 = player.getStorage("luochong"); + for (var i = 0; i < 4; i++) { + if (storage2.includes(i)) { + choiceList[i] = + '' + + choiceList[i] + + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); } - player.chooseControl(list).set('prompt','哀尘:选择移去一个〖落宠〗的选项').set('choiceList',choiceList).set('ai',function(){ - var controls=_status.event.controls.slice(0); - var list=['选项三','选项四','选项二','选项一']; - for(var i of list){ - if(controls.includes(i)) return i; - } - return 0; - }); - 'step 1' - var index=['选项一','选项二','选项三','选项四'].indexOf(result.control); - player.markAuto('luochong',[index]); - game.log(player,'移去了','#g【落宠】','的','#y'+[ - '令一名角色回复1点体力', - '令一名角色失去1点体力', - '令一名角色弃置两张牌', - '令一名角色摸两张牌', - ][index],'的选项'); + player + .chooseControl(list) + .set("prompt", "哀尘:选择移去一个〖落宠〗的选项") + .set("choiceList", choiceList) + .set("ai", function () { + var controls = _status.event.controls.slice(0); + var list = ["选项三", "选项四", "选项二", "选项一"]; + for (var i of list) { + if (controls.includes(i)) return i; + } + return 0; + }); + ("step 1"); + var index = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + player.markAuto("luochong", [index]); + game.log( + player, + "移去了", + "#g【落宠】", + "的", + "#y" + + [ + "令一名角色回复1点体力", + "令一名角色失去1点体力", + "令一名角色弃置两张牌", + "令一名角色摸两张牌", + ][index], + "的选项" + ); }, }, //SP孟获 - spmanwang:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he')>0; + spmanwang: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - position:'he', - selectCard:[1,Infinity], - check:function(card){ - var player=_status.event.player; - var max=Math.min(player.isDamaged()?3:2,4-player.countMark('spmanwang')); - if(!max&&!player.hasSkill('sppanqin')) return 0; - if(max==0&&ui.selected.length>0) return 0; - return 7-ui.selected.cards.length-get.value(card); + filterCard: true, + position: "he", + selectCard: [1, Infinity], + check: function (card) { + var player = _status.event.player; + var max = Math.min(player.isDamaged() ? 3 : 2, 4 - player.countMark("spmanwang")); + if (!max && !player.hasSkill("sppanqin")) return 0; + if (max == 0 && ui.selected.length > 0) return 0; + return 7 - ui.selected.cards.length - get.value(card); }, - content:function(){ - var num=Math.min(cards.length,4-player.countMark('spmanwang')); - if(num>=1) player.addSkills('sppanqin'); - if(num>=2) player.draw(); - if(num>=3) player.recover(); - if(num>=4){ + content: function () { + var num = Math.min(cards.length, 4 - player.countMark("spmanwang")); + if (num >= 1) player.addSkills("sppanqin"); + if (num >= 2) player.draw(); + if (num >= 3) player.recover(); + if (num >= 4) { player.draw(2); - player.removeSkills('sppanqin'); + player.removeSkills("sppanqin"); } }, - intro:{content:'已经移去过#个选项'}, - ai:{ - order:2, - result:{ - player:function(player,target){ - if(player.getUseValue({name:'nanman'})<=0) return 0; - if(player.getStat('skill').spmanwang&&player.hasSkill('sppanqin')) return 0; + intro: { content: "已经移去过#个选项" }, + ai: { + order: 2, + result: { + player: function (player, target) { + if (player.getUseValue({ name: "nanman" }) <= 0) return 0; + if (player.getStat("skill").spmanwang && player.hasSkill("sppanqin")) return 0; return 1; }, }, }, - derivation:'sppanqin', + derivation: "sppanqin", }, - sppanqin:{ - audio:2, - trigger:{player:['phaseUseEnd','phaseDiscardEnd']}, - filter:function(event,player){ - var cards=[],bool=true; - player.getHistory('lose',function(evt){ - if(!bool||evt.type!='discard'||evt.getParent(event.name)!=event) return false; - for(var i of evt.cards2){ - if(get.position(i,true)=='d'){ + sppanqin: { + audio: 2, + trigger: { player: ["phaseUseEnd", "phaseDiscardEnd"] }, + filter: function (event, player) { + var cards = [], + bool = true; + player.getHistory("lose", function (evt) { + if (!bool || evt.type != "discard" || evt.getParent(event.name) != event) + return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { cards.add(i); - if(!game.checkMod(i,player,'unchanged','cardEnabled2',player)) bool=false; + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) + bool = false; } } }); - if(!bool||!cards.length) return false; - return player.hasUseTarget(get.autoViewAs({name:'nanman'},cards)); + if (!bool || !cards.length) return false; + return player.hasUseTarget(get.autoViewAs({ name: "nanman" }, cards)); }, - prompt2:function(event,player){ - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type!='discard'||evt.getParent(event.name)!=event) return false; - for(var i of evt.cards2){ - if(get.position(i,true)=='d'){ + prompt2: function (event, player) { + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(event.name) != event) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { cards.add(i); } } }); - return '将'+get.translation(cards)+'(共计'+get.cnNumber(cards.length)+'张牌)当做【南蛮入侵】使用' + return ( + "将" + + get.translation(cards) + + "(共计" + + get.cnNumber(cards.length) + + "张牌)当做【南蛮入侵】使用" + ); }, - check:function(event,player){ - var cards=[],bool=true; - player.getHistory('lose',function(evt){ - if(!bool||evt.type!='discard'||evt.getParent(event.name)!=event) return false; - for(var i of evt.cards2){ - if(get.position(i,true)=='d'){ + check: function (event, player) { + var cards = [], + bool = true; + player.getHistory("lose", function (evt) { + if (!bool || evt.type != "discard" || evt.getParent(event.name) != event) + return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { cards.add(i); - if(!game.checkMod(i,player,'unchanged','cardEnabled2',player)) bool=false; + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) + bool = false; } } }); - if(!bool||!cards.length) return false; - return player.hasValueTarget(get.autoViewAs({name:'nanman'},cards)); + if (!bool || !cards.length) return false; + return player.hasValueTarget(get.autoViewAs({ name: "nanman" }, cards)); }, - content:function(){ - 'step 0' - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.type!='discard'||evt.getParent(trigger.name)!=trigger) return false; - for(var i of evt.cards2){ - if(get.position(i,true)=='d'){ + content: function () { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.type != "discard" || evt.getParent(trigger.name) != trigger) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d") { cards.add(i); } } }); - player.chooseUseTarget(true,{name:'nanman'},cards); - player.addTempSkill('sppanqin_eff'); + player.chooseUseTarget(true, { name: "nanman" }, cards); + player.addTempSkill("sppanqin_eff"); }, - subSkill:{ - eff:{ - trigger:{player:'useCard'}, - charlotte:true, - forced:true, - popup:false, - filter:function(event,player){ - return event.card.name=='nanman'&&event.getParent(2).name=='sppanqin'&&player.countMark('spmanwang')<4&&player.hasSkill('spmanwang',null,null,false)&&event.cards.length<=event.targets.length; + subSkill: { + eff: { + trigger: { player: "useCard" }, + charlotte: true, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.card.name == "nanman" && + event.getParent(2).name == "sppanqin" && + player.countMark("spmanwang") < 4 && + player.hasSkill("spmanwang", null, null, false) && + event.cards.length <= event.targets.length + ); }, - content:function(){ - player.addMark('spmanwang',1,false); - switch(player.countMark('spmanwang')){ + content: function () { + player.addMark("spmanwang", 1, false); + switch (player.countMark("spmanwang")) { case 1: player.draw(2); - player.removeSkills('sppanqin'); + player.removeSkills("sppanqin"); break; case 2: player.recover(); @@ -11055,961 +14443,1218 @@ game.import('character', function () { player.draw(); break; case 4: - player.addSkills('sppanqin'); + player.addSkills("sppanqin"); break; } }, - } - } + }, + }, }, //清河公主 - zengou:{ - audio:2, - trigger:{global:'useCard'}, - filter:function(event,player){ - return event.card.name=='shan'&&player.inRange(event.player)&&(player.hp>0||player.hasCard(function(card){ - return get.type(card)!='basic'&&lib.filter.cardDiscardable(card,player,'zengou'); - },'eh')) + zengou: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + return ( + event.card.name == "shan" && + player.inRange(event.player) && + (player.hp > 0 || + player.hasCard(function (card) { + return ( + get.type(card) != "basic" && + lib.filter.cardDiscardable(card, player, "zengou") + ); + }, "eh")) + ); }, - logTarget:'player', - check:function(event,player){ - if(get.attitude(player,event.player)>=0) return false; - if(get.damageEffect(event.player,event.getParent(3).player,player,get.nature(event.card))<=0) return false; - if(player.hasCard(function(card){ - return get.type(card)!='basic'&&get.value(card)<7&&lib.filter.cardDiscardable(card,player,'zengou'); - },'eh')) return true; - return player.hp>Math.max(1,event.player.hp); + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if ( + get.damageEffect( + event.player, + event.getParent(3).player, + player, + get.nature(event.card) + ) <= 0 + ) + return false; + if ( + player.hasCard(function (card) { + return ( + get.type(card) != "basic" && + get.value(card) < 7 && + lib.filter.cardDiscardable(card, player, "zengou") + ); + }, "eh") + ) + return true; + return player.hp > Math.max(1, event.player.hp); }, - content:function(){ - 'step 0' - trigger.all_excluded=true; - var str='弃置一张非基本牌'; - if(player.hp>0) str+=',或点「取消」失去1点体力'; - var next=player.chooseToDiscard(str,function(card){ - return get.type(card)!='basic'; - },'he').set('ai',function(card){ - return 7-get.value(card); - }); - if(player.hp<=0) next.set('forced',true); - 'step 1' - if(!result.bool) player.loseHp(); - 'step 2' - var cards=trigger.cards.filterInD(); - if(cards.length) player.gain(cards,'gain2'); + content: function () { + "step 0"; + trigger.all_excluded = true; + var str = "弃置一张非基本牌"; + if (player.hp > 0) str += ",或点「取消」失去1点体力"; + var next = player + .chooseToDiscard( + str, + function (card) { + return get.type(card) != "basic"; + }, + "he" + ) + .set("ai", function (card) { + return 7 - get.value(card); + }); + if (player.hp <= 0) next.set("forced", true); + ("step 1"); + if (!result.bool) player.loseHp(); + ("step 2"); + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); }, }, - qhzhangji:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - if(!event.player.isIn()) return false; - if(player.getHistory('sourceDamage').length>0) return true; - if(player.getHistory('damage').length>0) return event.player.countCards('he')>0; + qhzhangji: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + if (!event.player.isIn()) return false; + if (player.getHistory("sourceDamage").length > 0) return true; + if (player.getHistory("damage").length > 0) return event.player.countCards("he") > 0; return false; }, - content:function(){ - 'step 0' - event.target=trigger.player; - if(player.getHistory('sourceDamage').length) player.chooseBool(get.prompt('qhzhangji',event.target),'令'+get.translation(event.target)+'摸两张牌').set('choice',get.attitude(player,event.target)>0).set('ai',()=>_status.event.choice); + content: function () { + "step 0"; + event.target = trigger.player; + if (player.getHistory("sourceDamage").length) + player + .chooseBool( + get.prompt("qhzhangji", event.target), + "令" + get.translation(event.target) + "摸两张牌" + ) + .set("choice", get.attitude(player, event.target) > 0) + .set("ai", () => _status.event.choice); else event.goto(2); - 'step 1' - if(result.bool){ - player.logSkill('qhzhangji',target); - event.logged=true; + ("step 1"); + if (result.bool) { + player.logSkill("qhzhangji", target); + event.logged = true; target.draw(2); } - 'step 2' - if(target.isIn()&&target.countCards('he')>0&&player.getHistory('damage').length>0) player.chooseBool(get.prompt('qhzhangji',event.target),'令'+get.translation(event.target)+'弃置两张牌').set('choice',get.attitude(player,event.target)<0).set('ai',()=>_status.event.choice); + ("step 2"); + if ( + target.isIn() && + target.countCards("he") > 0 && + player.getHistory("damage").length > 0 + ) + player + .chooseBool( + get.prompt("qhzhangji", event.target), + "令" + get.translation(event.target) + "弃置两张牌" + ) + .set("choice", get.attitude(player, event.target) < 0) + .set("ai", () => _status.event.choice); else event.finish(); - 'step 3' - if(result.bool){ - if(!event.logged) player.logSkill('qhzhangji',target); - target.chooseToDiscard('he',true,2); + ("step 3"); + if (result.bool) { + if (!event.logged) player.logSkill("qhzhangji", target); + target.chooseToDiscard("he", true, 2); } }, }, //十周年夏侯霸 - rebaobian:{ - audio:2, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - for(var i of lib.skill.rebaobian.derivation){ - if(!player.hasSkill(i,null,null,false)) return true; + rebaobian: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + for (var i of lib.skill.rebaobian.derivation) { + if (!player.hasSkill(i, null, null, false)) return true; } return false; }, - forced:true, - content:function(){ - for(var i of lib.skill.rebaobian.derivation){ - if(!player.hasSkill(i,null,null,false)){ + forced: true, + content: function () { + for (var i of lib.skill.rebaobian.derivation) { + if (!player.hasSkill(i, null, null, false)) { player.addSkills(i); break; } } }, - ai:{ - maixie:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')&&!target.hasSkill('oltiaoxin',null,null,false)){ - if(!target.hasFriend()) return; - if(target.hp>=4) return [0,1]; + ai: { + maixie: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && !target.hasSkill("oltiaoxin", null, null, false)) { + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0, 1]; } - } - } + }, + }, }, - derivation:['tiaoxin','new_repaoxiao','xinshensu'], + derivation: ["tiaoxin", "new_repaoxiao", "xinshensu"], }, //范强张达 - yuanchou:{ - audio:2, - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + yuanchou: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - filter:function(event){ - return event.card.name=='sha'&&get.color(event.card)=='black'; + filter: function (event) { + return event.card.name == "sha" && get.color(event.card) == "black"; }, - forced:true, - logTarget:'target', - content:function(){ - trigger.target.addTempSkill('qinggang2'); + forced: true, + logTarget: "target", + content: function () { + trigger.target.addTempSkill("qinggang2"); trigger.target.storage.qinggang2.add(trigger.card); }, - ai:{ - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.name=='sha'&&get.color(arg.card)=='black') return true; + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.name == "sha" && get.color(arg.card) == "black") return true; return false; - } + }, }, - global:'yuanchou_ai', - subSkill:{ - ai:{ - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.name=='sha'&&get.color(arg.card)=='black'&&arg.target&&arg.target.hasSkill('yuanchou')) return true; + global: "yuanchou_ai", + subSkill: { + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + arg && + arg.name == "sha" && + get.color(arg.card) == "black" && + arg.target && + arg.target.hasSkill("yuanchou") + ) + return true; return false; - } + }, }, }, }, - juesheng:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'orange', - viewAs:{name:'juedou',isCard:true}, - filterCard:()=>false, - selectCard:-1, - precontent:function(){ - player.awakenSkill('juesheng'); - player.addTempSkill('juesheng_counter'); + juesheng: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + viewAs: { name: "juedou", isCard: true }, + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.awakenSkill("juesheng"); + player.addTempSkill("juesheng_counter"); }, - ai:{ - result:{ - player:function(player,target){ - return target.getAllHistory('useCard',(evt)=>evt.card.name=='sha').length*lib.card.juedou.ai.result.player.apply(this,arguments); + ai: { + result: { + player: function (player, target) { + return ( + target.getAllHistory("useCard", (evt) => evt.card.name == "sha").length * + lib.card.juedou.ai.result.player.apply(this, arguments) + ); }, - target:function(player,target){ - var num=target.getAllHistory('useCard',(evt)=>evt.card.name=='sha').length; - if(num evt.card.name == "sha").length; + if (num < target.hp) return 0; + return num * lib.card.juedou.ai.result.target; }, }, }, - subSkill:{ - counter:{ - trigger:{global:'damageBegin1'}, - forced:true, - charlotte:true, - filter:function(event,player){ - var evt=event.getParent(); - return evt.skill=='juesheng'&&evt.player==player; + subSkill: { + counter: { + trigger: { global: "damageBegin1" }, + forced: true, + charlotte: true, + filter: function (event, player) { + var evt = event.getParent(); + return evt.skill == "juesheng" && evt.player == player; }, - content:function(){ - var target=trigger.getParent().target; - trigger.num=Math.max(1,target.getAllHistory('useCard',(evt)=>evt.card.name=='sha').length); - target.addTempSkills('juesheng',{player:'phaseAfter'}); + content: function () { + var target = trigger.getParent().target; + trigger.num = Math.max( + 1, + target.getAllHistory("useCard", (evt) => evt.card.name == "sha").length + ); + target.addTempSkills("juesheng", { player: "phaseAfter" }); }, }, }, }, //田之间 - saodi:{ - audio:2, - trigger:{ - player:'useCardToPlayer', + saodi: { + audio: 2, + trigger: { + player: "useCardToPlayer", }, - direct:true, - filter:function(event,player){ - if(event.targets.length!=1||event.target==player||event.target.hasSkill('nodis')) return false; - if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; - var target=event.target; - var left=[],right=[],left2=player,right2=player; - while(left2!=target&&right2!=target){ - left2=left2.getPrevious(); - right2=right2.getNext(); - if(left2!=target) left.push(left2); - if(right2!=target) right.push(right2); + direct: true, + filter: function (event, player) { + if (event.targets.length != 1 || event.target == player || event.target.hasSkill("nodis")) + return false; + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + var target = event.target; + var left = [], + right = [], + left2 = player, + right2 = player; + while (left2 != target && right2 != target) { + left2 = left2.getPrevious(); + right2 = right2.getNext(); + if (left2 != target) left.push(left2); + if (right2 != target) right.push(right2); } - if(target==left2){ - for(var i of left){ - if(lib.filter.targetEnabled2(event.card,player,i)) return true; + if (target == left2) { + for (var i of left) { + if (lib.filter.targetEnabled2(event.card, player, i)) return true; } } - if(target==right2){ - for(var i of right){ - if(lib.filter.targetEnabled2(event.card,player,i)) return true; + if (target == right2) { + for (var i of right) { + if (lib.filter.targetEnabled2(event.card, player, i)) return true; } } return false; }, - aiJudge:function(card,player,target,bool){ - var left=[],right=[],left2=player,right2=player,left3=false,right3=false; - var eff_left=0,eff_right=0; - while(left2!=target&&right2!=target){ - left2=left2.getPrevious(); - right2=right2.getNext(); - if(left2!=target) left.push(left2); - if(right2!=target) right.push(right2); + aiJudge: function (card, player, target, bool) { + var left = [], + right = [], + left2 = player, + right2 = player, + left3 = false, + right3 = false; + var eff_left = 0, + eff_right = 0; + while (left2 != target && right2 != target) { + left2 = left2.getPrevious(); + right2 = right2.getNext(); + if (left2 != target) left.push(left2); + if (right2 != target) right.push(right2); } - if(target==left2){ - for(var i of left){ - if(lib.filter.targetEnabled2(card,player,i)){ - left3=true; - eff_left+=get.effect(i,card,player,player); + if (target == left2) { + for (var i of left) { + if (lib.filter.targetEnabled2(card, player, i)) { + left3 = true; + eff_left += get.effect(i, card, player, player); } } } - if(target==right2){ - for(var i of right){ - if(lib.filter.targetEnabled2(card,player,i)){ - right3=true; - eff_right+=get.effect(i,card,player,player); + if (target == right2) { + for (var i of right) { + if (lib.filter.targetEnabled2(card, player, i)) { + right3 = true; + eff_right += get.effect(i, card, player, player); } } } - if(left3&&right3){ - if(!bool) return Math.max(eff_left,eff_right); - if(eff_left>Math.max(0,eff_right)) return '↖顺时针'; - if(eff_right>Math.max(0,eff_left)) return '逆时针↗'; - return 'cancel2'; - } - else if(left3){ - if(bool) return eff_left>0?'↖顺时针':'cancel2'; + if (left3 && right3) { + if (!bool) return Math.max(eff_left, eff_right); + if (eff_left > Math.max(0, eff_right)) return "↖顺时针"; + if (eff_right > Math.max(0, eff_left)) return "逆时针↗"; + return "cancel2"; + } else if (left3) { + if (bool) return eff_left > 0 ? "↖顺时针" : "cancel2"; return eff_left; - } - else if(right3){ - if(bool) return eff_right>0?'逆时针↗':'cancel2'; + } else if (right3) { + if (bool) return eff_right > 0 ? "逆时针↗" : "cancel2"; return eff_right; - } - else return bool?'cancel2':0; + } else return bool ? "cancel2" : 0; }, - content:function(){ - 'step 0' - var choices=[]; - var target=trigger.target; - var left=[],right=[],left2=player,right2=player; - while(left2!=target&&right2!=target){ - left2=left2.getPrevious(); - right2=right2.getNext(); - if(left2!=target) left.push(left2); - if(right2!=target) right.push(right2); + content: function () { + "step 0"; + var choices = []; + var target = trigger.target; + var left = [], + right = [], + left2 = player, + right2 = player; + while (left2 != target && right2 != target) { + left2 = left2.getPrevious(); + right2 = right2.getNext(); + if (left2 != target) left.push(left2); + if (right2 != target) right.push(right2); } - if(target==left2){ - for(var i of left){ - if(lib.filter.targetEnabled2(trigger.card,player,i)){ - choices.push('↖顺时针'); + if (target == left2) { + for (var i of left) { + if (lib.filter.targetEnabled2(trigger.card, player, i)) { + choices.push("↖顺时针"); break; } } } - if(target==right2){ - for(var i of right){ - if(lib.filter.targetEnabled2(trigger.card,player,i)){ - choices.push('逆时针↗'); + if (target == right2) { + for (var i of right) { + if (lib.filter.targetEnabled2(trigger.card, player, i)) { + choices.push("逆时针↗"); break; } } } - choices.push('cancel2'); - player.chooseControl(choices).set('prompt',get.prompt('saodi')).set('prompt2','令自己和'+get.translation(trigger.target)+'某个方向之间的所有角色均成为'+get.translation(trigger.card)+'的目标').set('choices',choices).set('ai',function(){ - var evt=_status.event.getTrigger(); - return lib.skill.saodi.aiJudge(evt.card,evt.player,evt.target,true); - }); - 'step 1' - if(result.control!='cancel2'){ - var targets=[]; - if(result.control=='↖顺时针'){ - var current=player.getPrevious(); - while(current!=trigger.target){ - if(lib.filter.targetEnabled2(trigger.card,player,current)) targets.push(current); - current=current.getPrevious(); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", get.prompt("saodi")) + .set( + "prompt2", + "令自己和" + + get.translation(trigger.target) + + "某个方向之间的所有角色均成为" + + get.translation(trigger.card) + + "的目标" + ) + .set("choices", choices) + .set("ai", function () { + var evt = _status.event.getTrigger(); + return lib.skill.saodi.aiJudge(evt.card, evt.player, evt.target, true); + }); + ("step 1"); + if (result.control != "cancel2") { + var targets = []; + if (result.control == "↖顺时针") { + var current = player.getPrevious(); + while (current != trigger.target) { + if (lib.filter.targetEnabled2(trigger.card, player, current)) + targets.push(current); + current = current.getPrevious(); + } + } else { + var current = player.getNext(); + while (current != trigger.target) { + if (lib.filter.targetEnabled2(trigger.card, player, current)) + targets.push(current); + current = current.getNext(); } } - else{ - var current=player.getNext(); - while(current!=trigger.target){ - if(lib.filter.targetEnabled2(trigger.card,player,current)) targets.push(current); - current=current.getNext(); - } - } - event.targets=targets; - if(!event.isMine()&&!event.isOnline()) game.delayx(); - } - else event.finish(); - 'step 2' - player.logSkill('saodi',targets); + event.targets = targets; + if (!event.isMine() && !event.isOnline()) game.delayx(); + } else event.finish(); + ("step 2"); + player.logSkill("saodi", targets); trigger.targets.addArray(targets); }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(!target||player._saodi_judging||ui.selected.targets.length||player==target||target.hasSkill('nodis')) return; - if(typeof card!='object'||card.name!='sha'&&get.type(card)!='trick') return false; - player._saodi_judging=true; - var effect=lib.skill.saodi.aiJudge(card,player,target); + ai: { + effect: { + player_use: function (card, player, target) { + if ( + !target || + player._saodi_judging || + ui.selected.targets.length || + player == target || + target.hasSkill("nodis") + ) + return; + if (typeof card != "object" || (card.name != "sha" && get.type(card) != "trick")) + return false; + player._saodi_judging = true; + var effect = lib.skill.saodi.aiJudge(card, player, target); delete player._saodi_judging; - if(effect>0) return [1,effect/Math.max(0.01,get.attitude(player,player))]; + if (effect > 0) return [1, effect / Math.max(0.01, get.attitude(player, player))]; }, }, }, }, - zhuitao:{ - audio:2, - direct:true, - locked:false, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - var storage=player.getStorage('zhuitao'); - return game.hasPlayer(function(current){ - return current!=player&&!storage.includes(current); + zhuitao: { + audio: 2, + direct: true, + locked: false, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var storage = player.getStorage("zhuitao"); + return game.hasPlayer(function (current) { + return current != player && !storage.includes(current); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhuitao'),'令自己至一名其他角色的距离-1',function(card,player,target){ - return target!=player&&!player.getStorage('zhuitao').includes(target); - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att<0&&get.distance(player,target)==2) return 100; - return get.distance(player,target)*(1-get.sgn(att)/3); - }); - 'step 1' - if(result.bool){ - player.logSkill('zhuitao',result.targets[0]); - player.markAuto('zhuitao',result.targets); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhuitao"), + "令自己至一名其他角色的距离-1", + function (card, player, target) { + return target != player && !player.getStorage("zhuitao").includes(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att < 0 && get.distance(player, target) == 2) return 100; + return get.distance(player, target) * (1 - get.sgn(att) / 3); + }); + ("step 1"); + if (result.bool) { + player.logSkill("zhuitao", result.targets[0]); + player.markAuto("zhuitao", result.targets); game.delayx(); } }, - intro:{ - content:'至$的距离-1', - onunmark:true, + intro: { + content: "至$的距离-1", + onunmark: true, }, - onremove:true, - mod:{ - globalFrom:function(player,target,distance){ - if(player.getStorage('zhuitao').includes(target)) return distance-1; + onremove: true, + mod: { + globalFrom: function (player, target, distance) { + if (player.getStorage("zhuitao").includes(target)) return distance - 1; }, }, - group:'zhuitao_remove', - subSkill:{ - remove:{ - audio:'zhuitao', - trigger:{ - source:'damageSource', + group: "zhuitao_remove", + subSkill: { + remove: { + audio: "zhuitao", + trigger: { + source: "damageSource", }, - forced:true, - filter:function(event,player){ - return player.getStorage('zhuitao').includes(event.player); + forced: true, + filter: function (event, player) { + return player.getStorage("zhuitao").includes(event.player); }, - logTarget:'player', - content:function(){ - player.unmarkAuto('zhuitao',[trigger.player]); + logTarget: "player", + content: function () { + player.unmarkAuto("zhuitao", [trigger.player]); }, }, }, }, //生鱼片 - olfengji:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - locked:false, - filter:function(event,player){ + olfengji: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + locked: false, + filter: function (event, player) { return !player.numFixed; }, - content:function(){ - 'step 0' - player.chooseTarget('丰积:请选择增加摸牌的目标','令自己本回合的额定摸牌数-1,且目标下回合的额定摸牌数+2。或者点击「取消」,令自己的额定摸牌数+1',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(target.hasJudge('lebu')||target.hasJudge('bingliang')) return 0; - var att=get.attitude(player,target),dist=get.distance(player,target,'absolute'); - if(_status.event.goon){ - return att/dist; - } - if(game.countPlayer(function(current){ - return current!=player&¤t!=target&&get.attitude(player,current)<0&&get.distance(player,current,'absolute')=target.hp) return 0; - return att/dist; - }).set('goon',player.skipList.includes('lebu')); - 'step 1' - if(!player.storage.olfengji_draw) player.storage.olfengji_draw=0; - if(result.bool){ - var target=result.targets[0]; - player.line(target,'thunder'); + content: function () { + "step 0"; + player + .chooseTarget( + "丰积:请选择增加摸牌的目标", + "令自己本回合的额定摸牌数-1,且目标下回合的额定摸牌数+2。或者点击「取消」,令自己的额定摸牌数+1", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + if (target.hasJudge("lebu") || target.hasJudge("bingliang")) return 0; + var att = get.attitude(player, target), + dist = get.distance(player, target, "absolute"); + if (_status.event.goon) { + return att / dist; + } + if ( + game.countPlayer(function (current) { + return ( + current != player && + current != target && + get.attitude(player, current) < 0 && + get.distance(player, current, "absolute") < dist + ); + }) >= target.hp + ) + return 0; + return att / dist; + }) + .set("goon", player.skipList.includes("lebu")); + ("step 1"); + if (!player.storage.olfengji_draw) player.storage.olfengji_draw = 0; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); player.storage.olfengji_draw--; - if(!target.storage.olfengji_draw) target.storage.olfengji_draw=0; - target.storage.olfengji_draw+=2; - target.addTempSkill('olfengji_draw',{player:'phaseAfter'}); - target.markSkill('olfengji_draw'); - } - else{ + if (!target.storage.olfengji_draw) target.storage.olfengji_draw = 0; + target.storage.olfengji_draw += 2; + target.addTempSkill("olfengji_draw", { player: "phaseAfter" }); + target.markSkill("olfengji_draw"); + } else { player.storage.olfengji_draw++; } - player.addTempSkill('olfengji_draw'); - player.markSkill('olfengji_draw'); - 'step 2' - player.chooseTarget('丰积:请选择增加使用杀次数的目标','令自己本回合使用杀的次数上限-1,且目标下回合使用杀的次数上限+2。或者点击「取消」,令自己使用杀的次数上限+1',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(target.countMark('olfengji_draw')>0&&target.getCardUsable('sha')<2) return get.attitude(player,target); - return 0; - }); - 'step 3' - if(!player.storage.olfengji_sha) player.storage.olfengji_sha=0; - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); + player.addTempSkill("olfengji_draw"); + player.markSkill("olfengji_draw"); + ("step 2"); + player + .chooseTarget( + "丰积:请选择增加使用杀次数的目标", + "令自己本回合使用杀的次数上限-1,且目标下回合使用杀的次数上限+2。或者点击「取消」,令自己使用杀的次数上限+1", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + if (target.countMark("olfengji_draw") > 0 && target.getCardUsable("sha") < 2) + return get.attitude(player, target); + return 0; + }); + ("step 3"); + if (!player.storage.olfengji_sha) player.storage.olfengji_sha = 0; + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); player.storage.olfengji_sha--; - if(!target.storage.olfengji_sha) target.storage.olfengji_sha=0; - target.storage.olfengji_sha+=2; - target.addTempSkill('olfengji_sha',{player:'phaseAfter'}); - target.markSkill('olfengji_sha'); - } - else{ + if (!target.storage.olfengji_sha) target.storage.olfengji_sha = 0; + target.storage.olfengji_sha += 2; + target.addTempSkill("olfengji_sha", { player: "phaseAfter" }); + target.markSkill("olfengji_sha"); + } else { player.storage.olfengji_sha++; } - player.addTempSkill('olfengji_sha'); - player.markSkill('olfengji_sha'); + player.addTempSkill("olfengji_sha"); + player.markSkill("olfengji_sha"); }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - intro:{ - content:function(storage){ - return '使用【杀】的次数上限'+(storage>=0?'+':'')+storage; + subSkill: { + sha: { + charlotte: true, + onremove: true, + intro: { + content: function (storage) { + return "使用【杀】的次数上限" + (storage >= 0 ? "+" : "") + storage; }, }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.storage.olfengji_sha; + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.storage.olfengji_sha; }, }, }, - draw:{ - charlotte:true, - onremove:true, - intro:{ - content:function(storage){ - return '额定摸牌数'+(storage>=0?'+':'')+storage; + draw: { + charlotte: true, + onremove: true, + intro: { + content: function (storage) { + return "额定摸牌数" + (storage >= 0 ? "+" : "") + storage; }, }, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:function(event,player){ + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=player.storage.olfengji_draw; + content: function () { + trigger.num += player.storage.olfengji_draw; }, }, }, }, //朱灵 - jixian:{ - audio:2, - trigger:{player:'phaseDrawAfter'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&lib.skill.jixian.getNum(player,current)>0&&player.canUse('sha',current,false); - }) - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jixian'),'视为对一名满足条件的角色使用一张【杀】',function(card,player,target){ - return target!=player&&lib.skill.jixian.getNum(player,target)>0&&player.canUse('sha',target,false); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player)*Math.sqrt(lib.skill.jixian.getNum(player,target)); + jixian: { + audio: 2, + trigger: { player: "phaseDrawAfter" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current != player && + lib.skill.jixian.getNum(player, current) > 0 && + player.canUse("sha", current, false) + ); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jixian',target); - var num=lib.skill.jixian.getNum(player,target); - player.useCard({name:'sha',isCard:true},target,false); - if(num>0) player.draw(num); - } - else event.finish(); - 'step 2' - if(!player.hasHistory('sourceDamage',function(evt){ - var card=evt.card; - if(!card||card.name!='sha') return false; - var evtx=evt.getParent('useCard'); - return evtx.card==card&&evtx.getParent()==event; - })) player.loseHp(); }, - getNum:function(player,target){ - var num=0; - if(target.isHealthy()) num++; - if(target.getEquips(2).length) num++; - var countSkill=function(player){ - return player.getSkills(null,false,false).filter(function(skill){ - var info=get.info(skill); - if(!info||info.charlotte) return false; - if(info.zhuSkill) return player.hasZhuSkill(skill); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("jixian"), + "视为对一名满足条件的角色使用一张【杀】", + function (card, player, target) { + return ( + target != player && + lib.skill.jixian.getNum(player, target) > 0 && + player.canUse("sha", target, false) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return ( + get.effect(target, { name: "sha" }, player, player) * + Math.sqrt(lib.skill.jixian.getNum(player, target)) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("jixian", target); + var num = lib.skill.jixian.getNum(player, target); + player.useCard({ name: "sha", isCard: true }, target, false); + if (num > 0) player.draw(num); + } else event.finish(); + ("step 2"); + if ( + !player.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) + player.loseHp(); + }, + getNum: function (player, target) { + var num = 0; + if (target.isHealthy()) num++; + if (target.getEquips(2).length) num++; + var countSkill = function (player) { + return player.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + if (!info || info.charlotte) return false; + if (info.zhuSkill) return player.hasZhuSkill(skill); return true; }).length; - } - if(countSkill(player)(current==player||current.countCards('h')>=ph)).sortBySeat(); - player.line(targets,'green'); - event.targets=targets; - event.num=0; - 'step 1' - var target=targets[num]; + lanjiang: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + audioname: ["heqi"], + content: function () { + "step 0"; + var ph = player.countCards("h"); + var targets = game + .filterPlayer((current) => current == player || current.countCards("h") >= ph) + .sortBySeat(); + player.line(targets, "green"); + event.targets = targets; + event.num = 0; + ("step 1"); + var target = targets[num]; event.num++; - if(target.isIn()){ - event.target=target; - target.chooseBool('是否令'+(player==target?'自己':get.translation(player))+'摸一张牌?').set('ai',()=>get.attitude(_status.event.player,_status.event.getParent().player)>0); + if (target.isIn()) { + event.target = target; + target + .chooseBool( + "是否令" + + (player == target ? "自己" : get.translation(player)) + + "摸一张牌?" + ) + .set( + "ai", + () => get.attitude(_status.event.player, _status.event.getParent().player) > 0 + ); + } else { + event.goto(event.num < targets.length ? 1 : 3); } - else{ - event.goto(event.num0&&targets.some(target=>target.isIn()&&target.countCards('h') 0 && targets.some((target) => target.isIn() && target.countCards("h") < ph)) { + player + .chooseTarget( + "请选择一名手牌数小于自己的目标角色,令其摸一张牌", + function (card, player, target) { + return ( + _status.event.getParent().targets.includes(target) && + target.countCards("h") < player.countCards("h") + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); } - 'step 6' - if(result.bool){ - var target=result.targets[0]; + ("step 6"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - if(player!==target&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.1); + if (player !== target && (get.mode() !== "identity" || player.identity !== "nei")) + player.addExpose(0.1); target.draw(); } }, }, //新SP张郃 - spolzhouxuan:{ - audio:2, - trigger:{player:'phaseDiscardBegin'}, - filter:function(event,player){ - return player.countCards('h')>0&&player.getExpansions('spolzhouxuan').length<5; + spolzhouxuan: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0 && player.getExpansions("spolzhouxuan").length < 5; }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('spolzhouxuan'),[1,5-player.getExpansions('spolzhouxuan').length],'将至多'+get.cnNumber(5-player.getExpansions('spolzhouxuan').length)+'张手牌置于武将牌上').set('ai',function(card){ - if(ui.selected.cards.length>=player.needsToDiscard()) return 6-get.value(card); - return 100-get.useful(card); - }); - 'step 1' - if(result.bool){ - var cards=result.cards; - player.logSkill('spolzhouxuan'); - player.addToExpansion(cards,player,'give').gaintag.add('spolzhouxuan'); + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + "h", + get.prompt("spolzhouxuan"), + [1, 5 - player.getExpansions("spolzhouxuan").length], + "将至多" + + get.cnNumber(5 - player.getExpansions("spolzhouxuan").length) + + "张手牌置于武将牌上" + ) + .set("ai", function (card) { + if (ui.selected.cards.length >= player.needsToDiscard()) + return 6 - get.value(card); + return 100 - get.useful(card); + }); + ("step 1"); + if (result.bool) { + var cards = result.cards; + player.logSkill("spolzhouxuan"); + player.addToExpansion(cards, player, "give").gaintag.add("spolzhouxuan"); } }, - marktext:'旋', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "旋", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:['spolzhouxuan_use','spolzhouxuan_discard'], - subSkill:{ - use:{ - audio:'spolzhouxuan', - trigger:{player:'useCard'}, - filter:function(event,player){ - return player.getExpansions('spolzhouxuan').length>0; + group: ["spolzhouxuan_use", "spolzhouxuan_discard"], + subSkill: { + use: { + audio: "spolzhouxuan", + trigger: { player: "useCard" }, + filter: function (event, player) { + return player.getExpansions("spolzhouxuan").length > 0; }, - forced:true, - locked:false, - content:function(){ - 'step 0' - player.loseToDiscardpile(player.getExpansions('spolzhouxuan').randomGet()); - 'step 1' - var num=1; - if(!player.isMaxHandcard(true)) num+=player.getExpansions('spolzhouxuan').length; + forced: true, + locked: false, + content: function () { + "step 0"; + player.loseToDiscardpile(player.getExpansions("spolzhouxuan").randomGet()); + ("step 1"); + var num = 1; + if (!player.isMaxHandcard(true)) + num += player.getExpansions("spolzhouxuan").length; player.draw(num); }, }, - discard:{ - audio:'spolzhouxuan', - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.getExpansions('spolzhouxuan').length>0; + discard: { + audio: "spolzhouxuan", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return player.getExpansions("spolzhouxuan").length > 0; }, - forced:true, - locked:false, - content:function(){ - player.loseToDiscardpile(player.getExpansions('spolzhouxuan')); + forced: true, + locked: false, + content: function () { + player.loseToDiscardpile(player.getExpansions("spolzhouxuan")); }, }, }, }, //董昭 - olxianlve:{ - audio:2, - mode:['identity'], - trigger:{ - global:'phaseZhunbeiBegin', + olxianlve: { + audio: 2, + mode: ["identity"], + trigger: { + global: "phaseZhunbeiBegin", }, - direct:true, - filter:function(event,player){ - return event.player==game.zhu&&event.player.isZhu; + direct: true, + filter: function (event, player) { + return event.player == game.zhu && event.player.isZhu; }, - content:function(){ - 'step 0' - var list=lib.inpile.filter(function(i){ - return get.type2(i)=='trick'; - }).map(function(i){ - return ['锦囊','',i]; - }); - if(!list.length) event.finish(); - else player.chooseButton([get.prompt('olxianlve'),[list,'vcard']]).set('ai',function(button){ - switch(button.link[2]){ - case 'wuxie': return 0.6+Math.random(); - case 'wuzhong': case 'dongzhuxianji':return 0.5+Math.random(); - case 'guohe': case 'zhujinqiyuan': return 0.4+Math.random(); - default: return Math.random(); - } - }); - 'step 1' - if(result.bool){ - var name=result.links[0][2]; - player.logSkill('olxianlve'); - player.storage.olxianlve=name; - player.markSkill('olxianlve'); - } - }, - intro:{ - content:function(name,player){ - return '已声明'+(player.isUnderControl(true)?'【'+get.translation(name)+'】':'一个牌名'); - }, - }, - group:['olxianlve_use','olxianlve_count'], - subSkill:{ - count:{ - trigger:{global:'useCard1'}, - silent:true, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - return event.player!=player&&event.card.name==player.storage.olxianlve; - }, - content:function(){ - if(!trigger.olxianlve_map) trigger.olxianlve_map={}; - trigger.olxianlve_map[player.playerid]=true; - }, - }, - use:{ - audio:'olxianlve', - trigger:{global:'useCardAfter'}, - forced:true, - locked:false, - usable:1, - filter:function(event,player){ - return event.player!=player&&event.olxianlve_map&&event.olxianlve_map[player.playerid]&&event.card.name==player.storage.olxianlve; - }, - content:function(){ - 'step 0' - player.draw(2); - 'step 1' - var cards=result; - if(get.itemtype(cards)!='cards'){ - event.goto(5); - return; - } - var hs=player.getCards('h'); - cards=cards.filter(function(card){ - return hs.includes(card); - }); - if(!cards.length){ - event.goto(5); - return; - } - event.cards=cards; - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - event.ai_list=[]; - 'step 2' - player.chooseCardTarget({ - filterCard:function(card){ - return _status.event.cards.includes(card)&&!card.hasGaintag('olxianlve'); - }, - cards:cards, - filterTarget:lib.filter.notMe, - selectCard:[1,cards.length], - prompt:'是否将得到的牌分配给其他角色?', - ai1:function(card){ - if(!ui.selected.cards.length) return 1; - return 0; - }, - ai2:function(target){ - var player=_status.event.player,card=ui.selected.cards[0]; - var val=target.getUseValue(card); - if(target.isPhaseUsing()&&get.type2(card)=='trick') val*=3; - if(val>0) return val*get.attitude(player,target)*2; - return get.value(card,target)*get.attitude(player,target); - }, - }); - 'step 3' - if(result.bool){ - var res=result.cards,target=result.targets[0].playerid; - player.addGaintag(res,'olxianlve'); - cards.removeArray(res); - if(!event.given_map[target]) event.given_map[target]=[]; - event.given_map[target].addArray(res); - if(result.targets[0].isPhaseUsing()&&get.type2(res[0])=='trick') event.ai_list.push(res[0].name); - if(cards.length) event.goto(2); - } - 'step 4' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); - } - var map=[],cards=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - map.push([source,event.given_map[i]]); - cards.addArray(event.given_map[i]); - } - if(map.length) game.loseAsync({ - gain_list:map, - player:player, - cards:cards, - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple') - 'step 5' - var list=lib.inpile.filter(function(i){ - return get.type2(i)=='trick'; - }).map(function(i){ - return ['锦囊','',i]; - }); - if(!list.length) event.finish(); - else player.chooseButton([get.prompt('olxianlve'),[list,'vcard']]).set('list',event.ai_list).set('ai',function(button){ - if(_status.event.list.includes(button.link[2])) return 2+Math.random(); - switch(button.link[2]){ - case 'wuxie': return 0.6+Math.random(); - case 'wuzhong': case 'dongzhuxianji':return 0.5+Math.random(); - case 'guohe': case 'zhujinqiyuan': return 0.4+Math.random(); - default: return Math.random(); + content: function () { + "step 0"; + var list = lib.inpile + .filter(function (i) { + return get.type2(i) == "trick"; + }) + .map(function (i) { + return ["锦囊", "", i]; + }); + if (!list.length) event.finish(); + else + player + .chooseButton([get.prompt("olxianlve"), [list, "vcard"]]) + .set("ai", function (button) { + switch (button.link[2]) { + case "wuxie": + return 0.6 + Math.random(); + case "wuzhong": + case "dongzhuxianji": + return 0.5 + Math.random(); + case "guohe": + case "zhujinqiyuan": + return 0.4 + Math.random(); + default: + return Math.random(); } }); - 'step 6' - if(result.bool){ - var name=result.links[0][2]; - player.storage.olxianlve=name; - player.markSkill('olxianlve'); + ("step 1"); + if (result.bool) { + var name = result.links[0][2]; + player.logSkill("olxianlve"); + player.storage.olxianlve = name; + player.markSkill("olxianlve"); + } + }, + intro: { + content: function (name, player) { + return ( + "已声明" + + (player.isUnderControl(true) ? "【" + get.translation(name) + "】" : "一个牌名") + ); + }, + }, + group: ["olxianlve_use", "olxianlve_count"], + subSkill: { + count: { + trigger: { global: "useCard1" }, + silent: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.player != player && event.card.name == player.storage.olxianlve; + }, + content: function () { + if (!trigger.olxianlve_map) trigger.olxianlve_map = {}; + trigger.olxianlve_map[player.playerid] = true; + }, + }, + use: { + audio: "olxianlve", + trigger: { global: "useCardAfter" }, + forced: true, + locked: false, + usable: 1, + filter: function (event, player) { + return ( + event.player != player && + event.olxianlve_map && + event.olxianlve_map[player.playerid] && + event.card.name == player.storage.olxianlve + ); + }, + content: function () { + "step 0"; + player.draw(2); + ("step 1"); + var cards = result; + if (get.itemtype(cards) != "cards") { + event.goto(5); + return; + } + var hs = player.getCards("h"); + cards = cards.filter(function (card) { + return hs.includes(card); + }); + if (!cards.length) { + event.goto(5); + return; + } + event.cards = cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + event.ai_list = []; + ("step 2"); + player.chooseCardTarget({ + filterCard: function (card) { + return ( + _status.event.cards.includes(card) && !card.hasGaintag("olxianlve") + ); + }, + cards: cards, + filterTarget: lib.filter.notMe, + selectCard: [1, cards.length], + prompt: "是否将得到的牌分配给其他角色?", + ai1: function (card) { + if (!ui.selected.cards.length) return 1; + return 0; + }, + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = target.getUseValue(card); + if (target.isPhaseUsing() && get.type2(card) == "trick") val *= 3; + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); + }, + }); + ("step 3"); + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "olxianlve"); + cards.removeArray(res); + if (!event.given_map[target]) event.given_map[target] = []; + event.given_map[target].addArray(res); + if (result.targets[0].isPhaseUsing() && get.type2(res[0]) == "trick") + event.ai_list.push(res[0].name); + if (cards.length) event.goto(2); + } + ("step 4"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + map.push([source, event.given_map[i]]); + cards.addArray(event.given_map[i]); + } + if (map.length) + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + ("step 5"); + var list = lib.inpile + .filter(function (i) { + return get.type2(i) == "trick"; + }) + .map(function (i) { + return ["锦囊", "", i]; + }); + if (!list.length) event.finish(); + else + player + .chooseButton([get.prompt("olxianlve"), [list, "vcard"]]) + .set("list", event.ai_list) + .set("ai", function (button) { + if (_status.event.list.includes(button.link[2])) + return 2 + Math.random(); + switch (button.link[2]) { + case "wuxie": + return 0.6 + Math.random(); + case "wuzhong": + case "dongzhuxianji": + return 0.5 + Math.random(); + case "guohe": + case "zhujinqiyuan": + return 0.4 + Math.random(); + default: + return Math.random(); + } + }); + ("step 6"); + if (result.bool) { + var name = result.links[0][2]; + player.storage.olxianlve = name; + player.markSkill("olxianlve"); } }, }, }, }, - olzaowang:{ - mode:['identity'], - available:function(mode){ - if(mode=='identity'&&_status.mode=='purple') return false; + olzaowang: { + mode: ["identity"], + available: function (mode) { + if (mode == "identity" && _status.mode == "purple") return false; }, - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'water', - filterTarget:true, - content:function(){ - player.awakenSkill('olzaowang'); + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "water", + filterTarget: true, + content: function () { + player.awakenSkill("olzaowang"); target.gainMaxHp(); target.recover(); target.draw(3); - target.addSkills('olzaowang2'); + target.addSkills("olzaowang2"); }, - ai:{ - order:2, - result:{ - target:function(player,target){ - if(player.hasUnknown(2)) return 0; - if(target.identity=='zhong') return 20; - if(target.identity=='zhu') return 10; - if(target.identity=='nei') return 5; - if(!target.hasFriend()) return 5; + ai: { + order: 2, + result: { + target: function (player, target) { + if (player.hasUnknown(2)) return 0; + if (target.identity == "zhong") return 20; + if (target.identity == "zhu") return 10; + if (target.identity == "nei") return 5; + if (!target.hasFriend()) return 5; return 0; }, }, }, }, - olzaowang2:{ - charlotte:true, - trigger:{global:'dieBegin'}, - forced:true, - filter:function(event,player){ - return event.player.identity=='zhu'&&(player.identity=='zhong'||player.identity=='mingzhong'); + olzaowang2: { + charlotte: true, + trigger: { global: "dieBegin" }, + forced: true, + filter: function (event, player) { + return ( + event.player.identity == "zhu" && + (player.identity == "zhong" || player.identity == "mingzhong") + ); }, - logTarget:'player', - skillAnimation:true, - animationColor:'orange', - content:function(){ - game.broadcastAll(function(player,target){ - target.identity=player.identity; - if(player.identity=='mingzhong') game.zhong=target; - delete target.isZhu; - player.identity='zhu'; - game.zhu=player; - player.showIdentity(); - target.showIdentity(); - },player,trigger.player); - event.trigger('zhuUpdate'); - }, - mark:true, - marktext:'王', - intro:{content:'造了个王'}, - group:'olzaowang2_kill', - subSkill:{ - kill:{ - trigger:{player:'die'}, - forced:true, - forceDie:true, - skillAnimation:true, - animationColor:'wood', - filter:function(event,player){ - return player.identity=='fan'&&event.source&&(event.source.identity=='zhu'||event.source.identity=='zhong'||event.source.identity=='mingzhong'); + logTarget: "player", + skillAnimation: true, + animationColor: "orange", + content: function () { + game.broadcastAll( + function (player, target) { + target.identity = player.identity; + if (player.identity == "mingzhong") game.zhong = target; + delete target.isZhu; + player.identity = "zhu"; + game.zhu = player; + player.showIdentity(); + target.showIdentity(); }, - content:function(){ - game.over((game.me.identity=='zhu'||game.me.identity=='zhong'||game.me.identity=='mingzhong')); + player, + trigger.player + ); + event.trigger("zhuUpdate"); + }, + mark: true, + marktext: "王", + intro: { content: "造了个王" }, + group: "olzaowang2_kill", + subSkill: { + kill: { + trigger: { player: "die" }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + return ( + player.identity == "fan" && + event.source && + (event.source.identity == "zhu" || + event.source.identity == "zhong" || + event.source.identity == "mingzhong") + ); + }, + content: function () { + game.over( + game.me.identity == "zhu" || + game.me.identity == "zhong" || + game.me.identity == "mingzhong" + ); }, }, }, }, //冯方女 - zhuangshu:{ - audio:2, - trigger:{global:'phaseBegin'}, - direct:true, - filter:function(event,player){ - return event.player.isIn()&&event.player.hasEmptySlot(5)&&player.hasCard(lib.skill.zhuangshu.filterCard,'he'); + zhuangshu: { + audio: 2, + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return ( + event.player.isIn() && + event.player.hasEmptySlot(5) && + player.hasCard(lib.skill.zhuangshu.filterCard, "he") + ); }, - filterCard:function(card){ - if(_status.connectMode) return true; - var type=get.type2(card); - return type=='basic'||type=='trick'||type=='equip'; + filterCard: function (card) { + if (_status.connectMode) return true; + var type = get.type2(card); + return type == "basic" || type == "trick" || type == "equip"; }, - content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('zhuangshu',trigger.player),'弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。',function(card){ - var type=get.type2(card); - return type=='basic'||type=='trick'||type=='equip'; - }).set('ai',function(card){ - var player=_status.event.player; - if(get.attitude(player,_status.event.getTrigger().player)<4) return 0; - var name='zhuangshu_'+get.type2(card,player); - if(game.hasPlayer(function(current){ - return current.getEquip(name)&&get.attitude(player,current)>0; - })) return 0; - return 7-get.value(card); - }).logSkill=['zhuangshu',trigger.player]; - 'step 1' - if(result.bool){ - var name='zhuangshu_'+get.type2(result.cards[0],result.cards[0].original=='h'?player:false); - if(lib.card[name]&&trigger.player.isIn&&trigger.player.hasEmptySlot(5)){ - var target=game.findPlayer(function(current){ - var equip=current.getEquip(name); - return equip&&equip.name==name; - }); - if(target){ - var card=target.getEquip(name); - target.$give(card,trigger.player,false); + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + get.prompt("zhuangshu", trigger.player), + "弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。", + function (card) { + var type = get.type2(card); + return type == "basic" || type == "trick" || type == "equip"; } - else{ - var card=game.createCard(name,lib.card[name].suit,12); - trigger.player.$gain2(card,false); + ) + .set("ai", function (card) { + var player = _status.event.player; + if (get.attitude(player, _status.event.getTrigger().player) < 4) return 0; + var name = "zhuangshu_" + get.type2(card, player); + if ( + game.hasPlayer(function (current) { + return current.getEquip(name) && get.attitude(player, current) > 0; + }) + ) + return 0; + return 7 - get.value(card); + }).logSkill = ["zhuangshu", trigger.player]; + ("step 1"); + if (result.bool) { + var name = + "zhuangshu_" + + get.type2(result.cards[0], result.cards[0].original == "h" ? player : false); + if (lib.card[name] && trigger.player.isIn && trigger.player.hasEmptySlot(5)) { + var target = game.findPlayer(function (current) { + var equip = current.getEquip(name); + return equip && equip.name == name; + }); + if (target) { + var card = target.getEquip(name); + target.$give(card, trigger.player, false); + } else { + var card = game.createCard(name, lib.card[name].suit, 12); + trigger.player.$gain2(card, false); } game.delayx(); trigger.player.equip(card); } } }, - group:'zhuangshu_gameStart', - subSkill:{ - gameStart:{ - trigger:{global:'phaseBefore'}, - direct:true, - filter:function(event,player){ - return game.phaseNumber==0; + group: "zhuangshu_gameStart", + subSkill: { + gameStart: { + trigger: { global: "phaseBefore" }, + direct: true, + filter: function (event, player) { + return game.phaseNumber == 0; }, - content:function(){ - 'step 0' - player.chooseButton([get.prompt('zhuangshu'),[['zhuangshu_basic','zhuangshu_trick','zhuangshu_equip'],'vcard']]).set('filterButton',function(button){ - return !game.hasPlayer(function(current){ - return current.getEquip(button.link[2]); - }) - }); - 'step 1' - if(result.bool){ - player.logSkill('zhuangshu'); - var name=result.links[0][2],card=game.createCard(name,lib.card[name].suit,12); - player.$gain2(card,false); + content: function () { + "step 0"; + player + .chooseButton([ + get.prompt("zhuangshu"), + [["zhuangshu_basic", "zhuangshu_trick", "zhuangshu_equip"], "vcard"], + ]) + .set("filterButton", function (button) { + return !game.hasPlayer(function (current) { + return current.getEquip(button.link[2]); + }); + }); + ("step 1"); + if (result.bool) { + player.logSkill("zhuangshu"); + var name = result.links[0][2], + card = game.createCard(name, lib.card[name].suit, 12); + player.$gain2(card, false); game.delayx(); player.equip(card); } @@ -12017,74 +15662,84 @@ game.import('character', function () { }, }, }, - chuiti:{ - audio:2, - usable:1, - trigger:{ - global:['loseAfter','loseAsyncAfter'], + chuiti: { + audio: 2, + usable: 1, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], }, - direct:true, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false) return false; - return game.hasPlayer(function(current){ - if(player!=current){ - var cards=current.getEquips(5); - if(!cards.some(card=>card.name.indexOf('zhuangshu_')==0)) return false; + direct: true, + filter: function (event, player) { + if (event.type != "discard" || event.getlx === false) return false; + return game.hasPlayer(function (current) { + if (player != current) { + var cards = current.getEquips(5); + if (!cards.some((card) => card.name.indexOf("zhuangshu_") == 0)) return false; } - var evt=event.getl(current); - if(!evt||!evt.cards2) return false; - for(var i of evt.cards2){ - if(get.position(i,true)=='d'&&player.hasUseTarget(i)) return true; + var evt = event.getl(current); + if (!evt || !evt.cards2) return false; + for (var i of evt.cards2) { + if (get.position(i, true) == "d" && player.hasUseTarget(i)) return true; } return false; }); }, - content:function(){ - 'step 0' - var cards=[]; - game.countPlayer(function(current){ - if(player!=current){ - var cards2=current.getEquips(5); - if(!cards2.some(card=>card.name.indexOf('zhuangshu_')==0)) return false; + content: function () { + "step 0"; + var cards = []; + game.countPlayer(function (current) { + if (player != current) { + var cards2 = current.getEquips(5); + if (!cards2.some((card) => card.name.indexOf("zhuangshu_") == 0)) return false; } - var evt=trigger.getl(current); - for(var i of evt.cards2){ - if(get.position(i,true)=='d'&&player.hasUseTarget(i)) cards.push(i); + var evt = trigger.getl(current); + for (var i of evt.cards2) { + if (get.position(i, true) == "d" && player.hasUseTarget(i)) cards.push(i); } return false; }); - player.chooseButton(['垂涕:是否使用其中的一张牌?',cards]).set('ai',function(button){ + player.chooseButton(["垂涕:是否使用其中的一张牌?", cards]).set("ai", function (button) { return _status.event.player.getUseValue(button.link); }); - 'step 1' - if(result.bool){ - player.$gain2(result.links[0],false); + ("step 1"); + if (result.bool) { + player.$gain2(result.links[0], false); game.delayx(); - player.chooseUseTarget(true,result.links[0],false).logSkill='chuiti'; - } - else player.storage.counttrigger.chuiti--; + player.chooseUseTarget(true, result.links[0], false).logSkill = "chuiti"; + } else player.storage.counttrigger.chuiti--; }, }, - zhuangshu_basic:{ - equipSkill:true, - trigger:{player:'damageBegin2'}, - direct:true, - filter:function(event,player){ - var equip=player.getEquip('zhuangshu_basic'); - return event.num<=player.countCards('he',function(card){ - return card!=equip; - }) + zhuangshu_basic: { + equipSkill: true, + trigger: { player: "damageBegin2" }, + direct: true, + filter: function (event, player) { + var equip = player.getEquip("zhuangshu_basic"); + return ( + event.num <= + player.countCards("he", function (card) { + return card != equip; + }) + ); }, - content:function(){ - 'step 0' - player.chooseToDiscard('he',trigger.num,get.prompt('zhuangshu_basic'),'弃置'+get.cnNumber(trigger.num)+'张牌并防止伤害',function(card,player){ - return card!=player.getEquip('zhuangshu_basic'); - }).set('ai',function(card){ - var player=_status.event.player; - return 4+player.getUseValue(card)-get.value(card,player); - }); - 'step 1' - if(result.bool) trigger.cancel(); + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + trigger.num, + get.prompt("zhuangshu_basic"), + "弃置" + get.cnNumber(trigger.num) + "张牌并防止伤害", + function (card, player) { + return card != player.getEquip("zhuangshu_basic"); + } + ) + .set("ai", function (card) { + var player = _status.event.player; + return 4 + player.getUseValue(card) - get.value(card, player); + }); + ("step 1"); + if (result.bool) trigger.cancel(); }, /*usable:1, trigger:{player:'useCard2'}, @@ -12126,186 +15781,237 @@ game.import('character', function () { trigger.directHit.addArray(targets); },*/ }, - zhuangshu_trick:{ - trigger:{player:['phaseJudgeBefore']}, - equipSkill:true, - direct:true, - content:function(){ - 'step 0' - player.chooseControl('判定阶段','弃牌阶段','cancel2').set('prompt',get.prompt('zhuangshu_trick')).set('prompt2','跳过本回合的判定阶段或弃牌阶段').set('ai',function(){ - var player=_status.event.player; - if(player.hasCard(function(card){ - return get.effect(player,{ - name:card.viewAs||card.name, - cards:[card], - },player,player)<0; - },'j')) return '判定阶段'; - return '弃牌阶段'; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('zhuangshu_trick'); - if(result.control=='判定阶段'){ + zhuangshu_trick: { + trigger: { player: ["phaseJudgeBefore"] }, + equipSkill: true, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("判定阶段", "弃牌阶段", "cancel2") + .set("prompt", get.prompt("zhuangshu_trick")) + .set("prompt2", "跳过本回合的判定阶段或弃牌阶段") + .set("ai", function () { + var player = _status.event.player; + if ( + player.hasCard(function (card) { + return ( + get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) < 0 + ); + }, "j") + ) + return "判定阶段"; + return "弃牌阶段"; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("zhuangshu_trick"); + if (result.control == "判定阶段") { trigger.cancel(); - game.log(player,'跳过了','#y判定阶段'); - } - else{ - player.skip('phaseDiscard'); - game.log(player,'跳过了','#g弃牌阶段'); + game.log(player, "跳过了", "#y判定阶段"); + } else { + player.skip("phaseDiscard"); + game.log(player, "跳过了", "#g弃牌阶段"); } } }, }, - zhuangshu_equip:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - equipSkill:true, - filter:function(event,player){ - return player.countCards('h')0) list.push(eff); - } - list.sort().reverse(); - if(!list.length) return 0; - return list[0]+(list[1]||0)+(list[2]||0); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('oljuanxia',target); - } - else event.finish(); - 'step 2' - var list=[]; - for(var name of lib.inpile){ - var info=lib.card[name]; - if(!info||info.type!='trick'||info.notarget||(info.selectTarget&&info.selectTarget!=1)) continue; + oljuanxia: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("oljuanxia"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player, + list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if ( + !info || + info.type != "trick" || + info.notarget || + (info.selectTarget && info.selectTarget != 1) + ) + continue; + if (!player.canUse(name, target, false)) continue; + var eff = get.effect(target, { name: name }, player, player); + if (eff > 0) list.push(eff); + } + list.sort().reverse(); + if (!list.length) return 0; + return list[0] + (list[1] || 0) + (list[2] || 0); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("oljuanxia", target); + } else event.finish(); + ("step 2"); + var list = []; + for (var name of lib.inpile) { + var info = lib.card[name]; + if ( + !info || + info.type != "trick" || + info.notarget || + (info.selectTarget && info.selectTarget != 1) + ) + continue; list.push(name); } - if(!list.length) event.finish(); - else{ - event.list=list; - event.count=0; + if (!list.length) event.finish(); + else { + event.list = list; + event.count = 0; } - 'step 3' - var list=event.list.filter(function(name){ - return player.canUse(name,target,false); + ("step 3"); + var list = event.list.filter(function (name) { + return player.canUse(name, target, false); }); - if(list.length){ - var next=player.chooseButton(['视为对'+get.translation(target)+'使用一张牌',[list,'vcard']]).set('ai',function(button){ - var evt=_status.event.getParent(); - return get.effect(evt.target,{name:button.link[2]},evt.player,evt.player); - }); - if(event.count==0) next.set('forced',true); - } - else{ - event.stopped=true; + if (list.length) { + var next = player + .chooseButton([ + "视为对" + get.translation(target) + "使用一张牌", + [list, "vcard"], + ]) + .set("ai", function (button) { + var evt = _status.event.getParent(); + return get.effect( + evt.target, + { name: button.link[2] }, + evt.player, + evt.player + ); + }); + if (event.count == 0) next.set("forced", true); + } else { + event.stopped = true; event.goto(5); } - 'step 4' - if(result.bool){ + ("step 4"); + if (result.bool) { event.count++; - var name=result.links[0][2]; + var name = result.links[0][2]; event.list.remove(name); - player.useCard({name:name,isCard:true},target,false); - } - else event.stopped=true; - 'step 5' - if(target.isIn()&&event.count>0){ - if(event.count<3&&!event.stopped&&event.list.length>0) event.goto(3); - else{ - target.addTempSkill('oljuanxia_counter',{player:'phaseAfter'}); - if(!target.storage.oljuanxia_counter) target.storage.oljuanxia_counter={}; - if(!target.storage.oljuanxia_counter[player.playerid]) target.storage.oljuanxia_counter[player.playerid]=0; - target.storage.oljuanxia_counter[player.playerid]+=event.count; + player.useCard({ name: name, isCard: true }, target, false); + } else event.stopped = true; + ("step 5"); + if (target.isIn() && event.count > 0) { + if (event.count < 3 && !event.stopped && event.list.length > 0) event.goto(3); + else { + target.addTempSkill("oljuanxia_counter", { player: "phaseAfter" }); + if (!target.storage.oljuanxia_counter) target.storage.oljuanxia_counter = {}; + if (!target.storage.oljuanxia_counter[player.playerid]) + target.storage.oljuanxia_counter[player.playerid] = 0; + target.storage.oljuanxia_counter[player.playerid] += event.count; } } }, - subSkill:{ - counter:{ - trigger:{player:'phaseEnd'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - var map1=(_status.connectMode?lib.playerOL:game.playerMap),map2=player.storage.oljuanxia_counter; - if(!map2) return false; - for(var i in map2){ - if(map1[i]&&map1[i].isIn()&&player.canUse('sha',map1[i],false)) return true; + subSkill: { + counter: { + trigger: { player: "phaseEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + var map1 = _status.connectMode ? lib.playerOL : game.playerMap, + map2 = player.storage.oljuanxia_counter; + if (!map2) return false; + for (var i in map2) { + if (map1[i] && map1[i].isIn() && player.canUse("sha", map1[i], false)) + return true; } return false; }, - logTarget:function(event,player){ - var list=[]; - var map1=(_status.connectMode?lib.playerOL:game.playerMap),map2=player.storage.oljuanxia_counter; - if(!map2) return false; - for(var i in map2){ - if(map1[i]&&map1[i].isIn()) list.push(map1[i]); + logTarget: function (event, player) { + var list = []; + var map1 = _status.connectMode ? lib.playerOL : game.playerMap, + map2 = player.storage.oljuanxia_counter; + if (!map2) return false; + for (var i in map2) { + if (map1[i] && map1[i].isIn()) list.push(map1[i]); } return list; }, - content:function(){ - 'step 0' - var list=[]; - var map1=(_status.connectMode?lib.playerOL:game.playerMap),map2=player.storage.oljuanxia_counter; - if(!map2) return false; - for(var i in map2){ - if(map1[i]&&map1[i].isIn()) list.push(map1[i]); + content: function () { + "step 0"; + var list = []; + var map1 = _status.connectMode ? lib.playerOL : game.playerMap, + map2 = player.storage.oljuanxia_counter; + if (!map2) return false; + for (var i in map2) { + if (map1[i] && map1[i].isIn()) list.push(map1[i]); } list.sortBySeat(); - event.num=0; - event.targets=list; - 'step 1' - var target=targets[num]; - event.target=target; - if(target.isIn()&&player.canUse('sha',target,false)) player.chooseBool('狷狭:是否视为对'+get.translation(target)+'依次使用'+get.cnNumber(player.storage.oljuanxia_counter[target.playerid])+'张【杀】?').set('goon',get.effect(target,{name:'sha'},player,player)>0).set('ai',()=>_status.event.goon); - 'step 2' + event.num = 0; + event.targets = list; + ("step 1"); + var target = targets[num]; + event.target = target; + if (target.isIn() && player.canUse("sha", target, false)) + player + .chooseBool( + "狷狭:是否视为对" + + get.translation(target) + + "依次使用" + + get.cnNumber(player.storage.oljuanxia_counter[target.playerid]) + + "张【杀】?" + ) + .set("goon", get.effect(target, { name: "sha" }, player, player) > 0) + .set("ai", () => _status.event.goon); + ("step 2"); event.num++; - if(result.bool) event.count=player.storage.oljuanxia_counter[target.playerid]; - else if(event.num0) event.redo(); - else if(event.num 0) event.redo(); + else if (event.num < targets.length) event.goto(1); }, }, }, }, - oldingcuo:{ - trigger:{ - player:'damageEnd', - source:'damageSource', + oldingcuo: { + trigger: { + player: "damageEnd", + source: "damageSource", }, - usable:1, - content:function(){ - 'step 0' + usable: 1, + content: function () { + "step 0"; player.draw(2); - 'step 1' - if(Array.isArray(result)&&result.length>1){ - var color=get.color(result[0],player); - for(var i=1;i 1) { + var color = get.color(result[0], player); + for (var i = 1; i < result.length; i++) { + if (get.color(result[i], player) != color) { + if (player.countCards("h")) player.chooseToDiscard("h", true); break; } } @@ -12313,78 +16019,101 @@ game.import('character', function () { }, }, //左棻 - zhaosong:{ - trigger:{global:'phaseDrawAfter'}, - logTarget:'player', - filter:function(event,player){ - if(player==event.player||!event.player.countCards('h')) return false; - var types=['basic','trick','equip']; - for(var i of types){ - if(event.player.hasMark('zhaosong_'+i)) return false; + zhaosong: { + trigger: { global: "phaseDrawAfter" }, + logTarget: "player", + filter: function (event, player) { + if (player == event.player || !event.player.countCards("h")) return false; + var types = ["basic", "trick", "equip"]; + for (var i of types) { + if (event.player.hasMark("zhaosong_" + i)) return false; } return true; }, - prompt2:'令其交给你一张手牌,并根据类型获得对应的标记', - check:function(event,player){ - return get.attitude(_status.event.player,event.player)>0; + prompt2: "令其交给你一张手牌,并根据类型获得对应的标记", + check: function (event, player) { + return get.attitude(_status.event.player, event.player) > 0; }, - content:function(){ - 'step 0' - event.target=trigger.player; - event.target.chooseCard('h',true,get.translation(player)+'发动了【诏颂】;请交给其一张手牌'); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - target.give(card,player,'give'); - var type=get.type2(card,target); - if(lib.skill['zhaosong_'+type]){ - target.addSkill('zhaosong_'+type); - target.addMark('zhaosong_'+type); + content: function () { + "step 0"; + event.target = trigger.player; + event.target.chooseCard( + "h", + true, + get.translation(player) + "发动了【诏颂】;请交给其一张手牌" + ); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + target.give(card, player, "give"); + var type = get.type2(card, target); + if (lib.skill["zhaosong_" + type]) { + target.addSkill("zhaosong_" + type); + target.addMark("zhaosong_" + type); } } }, - subSkill:{ - basic:{ - marktext:'颂', - intro:{ - name:'诏颂(颂)', - name2:'颂', - content:'当你使用【杀】选择唯一目标时,你可移去“颂”,并为此【杀】增加至多两个目标。', + subSkill: { + basic: { + marktext: "颂", + intro: { + name: "诏颂(颂)", + name2: "颂", + content: + "当你使用【杀】选择唯一目标时,你可移去“颂”,并为此【杀】增加至多两个目标。", }, - trigger:{player:'useCard2'}, - direct:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return player.hasMark('zhaosong_basic')&&event.card.name=='sha'&& - event.targets.length==1&&game.hasPlayer(function(current){ - return current!=player&¤t!=event.targets[0]&&lib.filter.targetEnabled2(event.card,player,current); - }); + trigger: { player: "useCard2" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + player.hasMark("zhaosong_basic") && + event.card.name == "sha" && + event.targets.length == 1 && + game.hasPlayer(function (current) { + return ( + current != player && + current != event.targets[0] && + lib.filter.targetEnabled2(event.card, player, current) + ); + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget([1,2],'是否弃置“颂”标记?','为'+get.translation(trigger.card)+'增加至多两个目标',function(card,player,target){ - var evt=_status.event.getTrigger(); - return target!=player&&target!=evt.targets[0]&&lib.filter.targetEnabled2(evt.card,player,target); - }).set('ai',function(target){ - var evt=_status.event.getTrigger(); - return get.effect(target,evt.card,evt.player,evt.player); - }); - 'step 1' - if(result.bool){ - if(player!=event.player&&!player.isOnline()) game.delayx(); + content: function () { + "step 0"; + player + .chooseTarget( + [1, 2], + "是否弃置“颂”标记?", + "为" + get.translation(trigger.card) + "增加至多两个目标", + function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + target != evt.targets[0] && + lib.filter.targetEnabled2(evt.card, player, target) + ); + } + ) + .set("ai", function (target) { + var evt = _status.event.getTrigger(); + return get.effect(target, evt.card, evt.player, evt.player); + }); + ("step 1"); + if (result.bool) { + if (player != event.player && !player.isOnline()) game.delayx(); //player.addTempSkill('zhaosong_shaloss'); - } - else event.finish(); - 'step 2' - var targets=result.targets; - player.logSkill('zhaosong_basic',targets); - player.removeMark('zhaosong_basic',1); - player.removeSkill('zhaosong_basic'); + } else event.finish(); + ("step 2"); + var targets = result.targets; + player.logSkill("zhaosong_basic", targets); + player.removeMark("zhaosong_basic", 1); + player.removeSkill("zhaosong_basic"); trigger.targets.addArray(targets); - trigger.zhaosong_basic=true; + trigger.zhaosong_basic = true; }, - },/* + } /* shaloss:{ trigger:{player:'useCardAfter'}, forced:true, @@ -12400,142 +16129,194 @@ game.import('character', function () { content:function(){ player.loseHp(); }, - },*/ - trick:{ - marktext:'诔', - intro:{ - name:'诏颂(诔)', - name2:'诔', - content:'当你进入濒死状态时,你可移去“诔”,然后将体力回复至1点并摸一张牌。', + },*/, + trick: { + marktext: "诔", + intro: { + name: "诏颂(诔)", + name2: "诔", + content: "当你进入濒死状态时,你可移去“诔”,然后将体力回复至1点并摸一张牌。", }, - trigger:{player:'dying'}, - prompt:'是否弃置“诔”标记?', - prompt2:'回复体力至1点并摸一张牌。', - charlotte:true, - onremove:true, - filter:function(event,player){ - return player.hasMark('zhaosong_trick')&&player.hp<1; + trigger: { player: "dying" }, + prompt: "是否弃置“诔”标记?", + prompt2: "回复体力至1点并摸一张牌。", + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.hasMark("zhaosong_trick") && player.hp < 1; }, - check:function(event,player){ - if(player.maxHp<2||player.countCards('h',function(card){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,event.player,'unchanged','cardSavable',player); - if(mod!='unchanged') return mod; - var savable=get.info(card).savable; - if(typeof savable=='function') savable=savable(card,player,event.player); - return savable; - })>=1+event.num-event.player.hp) return false; + check: function (event, player) { + if ( + player.maxHp < 2 || + player.countCards("h", function (card) { + var mod2 = game.checkMod( + card, + player, + "unchanged", + "cardEnabled2", + player + ); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod( + card, + player, + event.player, + "unchanged", + "cardSavable", + player + ); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") + savable = savable(card, player, event.player); + return savable; + }) >= + 1 + event.num - event.player.hp + ) + return false; return true; }, - content:function(){ - player.removeMark('zhaosong_trick',1); - player.removeSkill('zhaosong_trick'); + content: function () { + player.removeMark("zhaosong_trick", 1); + player.removeSkill("zhaosong_trick"); //player.loseMaxHp(); - if(player.hp<1) player.recover(1-player.hp); + if (player.hp < 1) player.recover(1 - player.hp); player.draw(); }, }, - equip:{ - marktext:'赋', - intro:{ - name:'诏颂(赋)', - name2:'赋', - content:'出牌阶段开始时,你可移去“赋”并弃置一名角色区域内的至多两张牌。', + equip: { + marktext: "赋", + intro: { + name: "诏颂(赋)", + name2: "赋", + content: "出牌阶段开始时,你可移去“赋”并弃置一名角色区域内的至多两张牌。", }, - trigger:{player:'phaseUseBegin'}, - direct:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return player.hasMark('zhaosong_equip')&&game.hasPlayer(function(current){ - return current.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,current); - },'hej'); - }); + trigger: { player: "phaseUseBegin" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + player.hasMark("zhaosong_equip") && + game.hasPlayer(function (current) { + return current.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, current); + }, "hej"); + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget('是否弃置“赋”标记?','弃置一名角色区域内的至多两张牌',function(card,player,current){ - return current.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,current); - },'hej'); - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target)>0?2:1; - return get.effect(target,{name:'guohe_copy'},player,player)*att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('zhaosong_equip',target); - player.removeMark('zhaosong_equip',1); - player.removeSkill('zhaosong_equip'); - player.discardPlayerCard(target,true,'hej',[1,2]); + content: function () { + "step 0"; + player + .chooseTarget( + "是否弃置“赋”标记?", + "弃置一名角色区域内的至多两张牌", + function (card, player, current) { + return current.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, current); + }, "hej"); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target) > 0 ? 2 : 1; + return get.effect(target, { name: "guohe_copy" }, player, player) * att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhaosong_equip", target); + player.removeMark("zhaosong_equip", 1); + player.removeSkill("zhaosong_equip"); + player.discardPlayerCard(target, true, "hej", [1, 2]); } }, }, }, }, - lisi:{ - audio:2, - trigger:{player:'useCardAfter'}, - direct:true, - filter:function(event,player){ - if(player==_status.currentPhase||!event.cards.filterInD().length) return false; - var hs=player.countCards('h'); - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')<=hs; + lisi: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (player == _status.currentPhase || !event.cards.filterInD().length) return false; + var hs = player.countCards("h"); + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") <= hs; }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('lisi'),'将'+get.translation(trigger.cards.filterInD())+'交给一名手牌数不大于你的其他角色',function(card,player,target){ - return target!=player&&target.countCards('h')<=player.countCards('h'); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('lisi',target); - target.gain(trigger.cards.filterInD(),'gain2'); + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("lisi"), + "将" + + get.translation(trigger.cards.filterInD()) + + "交给一名手牌数不大于你的其他角色", + function (card, player, target) { + return target != player && target.countCards("h") <= player.countCards("h"); + } + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("lisi", target); + target.gain(trigger.cards.filterInD(), "gain2"); } }, }, //王荣 - olfengzi:{ - audio:2, - trigger:{player:'useCard'}, - direct:true, - usable:1, - filter:function(event,player){ - if(event.olfengzi_buff||!event.targets.length||!player.isPhaseUsing()||player.hasSkill('olfengzi_buff')) return false; - var type=get.type(event.card,false); - if(type!='basic'&&type!='trick') return false; - return player.hasCard(function(i){ - if(_status.connectMode) return true; - return get.type2(i,player)==type; - },'h'); + olfengzi: { + audio: 2, + trigger: { player: "useCard" }, + direct: true, + usable: 1, + filter: function (event, player) { + if ( + event.olfengzi_buff || + !event.targets.length || + !player.isPhaseUsing() || + player.hasSkill("olfengzi_buff") + ) + return false; + var type = get.type(event.card, false); + if (type != "basic" && type != "trick") return false; + return player.hasCard(function (i) { + if (_status.connectMode) return true; + return get.type2(i, player) == type; + }, "h"); }, - content:function(){ - 'step 0' - if(player!=game.me&&!player.isUnderControl()&&!player.isOnline()) game.delayx(); - var type=get.type(trigger.card,false); - player.chooseToDiscard('h',get.prompt('olfengzi'),'弃置一张'+get.translation(type)+'牌,令'+get.translation(trigger.card)+'结算两次',function(card,player){ - return get.type2(card,player)==_status.event.type; - }).set('type',type).set('ai',function(card){ - var player=_status.event.player; - var trigger=_status.event.getTrigger(); - if(trigger.card.name=='tiesuo') return 0; - var num=0; - for(var i of trigger.targets) num+=get.effect(i,trigger.card,player,player); - if(num<=0) return 0; - return 7-get.value(card); - }).logSkill='olfengzi'; - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + if (player != game.me && !player.isUnderControl() && !player.isOnline()) game.delayx(); + var type = get.type(trigger.card, false); + player + .chooseToDiscard( + "h", + get.prompt("olfengzi"), + "弃置一张" + + get.translation(type) + + "牌,令" + + get.translation(trigger.card) + + "结算两次", + function (card, player) { + return get.type2(card, player) == _status.event.type; + } + ) + .set("type", type) + .set("ai", function (card) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (trigger.card.name == "tiesuo") return 0; + var num = 0; + for (var i of trigger.targets) num += get.effect(i, trigger.card, player, player); + if (num <= 0) return 0; + return 7 - get.value(card); + }).logSkill = "olfengzi"; + ("step 1"); + if (result.bool) { trigger.effectCount++; - } - else player.storage.counttrigger.olfengzi--; + } else player.storage.counttrigger.olfengzi--; }, /*subSkill:{ buff:{ @@ -12557,3685 +16338,4686 @@ game.import('character', function () { }, },*/ }, - oljizhan:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ + oljizhan: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.changeToZero(); - var card=get.cards()[0]; + var card = get.cards()[0]; game.cardsGotoOrdering(card); - event.cards=[card]; - event.num=get.number(card,false); - player.showCards(card,get.translation(player)+'发动了【吉占】'); - 'step 1' - var str=get.strNumber(num); - player.chooseControl('大于'+str,'小于'+str,'cancel2').set('prompt','吉占:猜测下一张牌的点数').set('choice',num<7?0:1).set('ai',()=>_status.event.choice); - 'step 2' - var card=get.cards()[0]; + event.cards = [card]; + event.num = get.number(card, false); + player.showCards(card, get.translation(player) + "发动了【吉占】"); + ("step 1"); + var str = get.strNumber(num); + player + .chooseControl("大于" + str, "小于" + str, "cancel2") + .set("prompt", "吉占:猜测下一张牌的点数") + .set("choice", num < 7 ? 0 : 1) + .set("ai", () => _status.event.choice); + ("step 2"); + var card = get.cards()[0]; game.cardsGotoOrdering(card); event.cards.push(card); - var num=get.number(card,false); - if(num>event.num&&result.index==0||num event.num && result.index == 0) || (num < event.num && result.index == 1)) { + event.num = num; event.goto(1); } player.showCards(card); - 'step 3' - player.gain(cards,'gain2'); + ("step 3"); + player.gain(cards, "gain2"); }, }, - olfusong:{ - audio:2, - forceDie:true, - trigger:{player:'die'}, - skillAnimation:true, - animationColor:'gray', - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.maxHp>player.maxHp; + olfusong: { + audio: 2, + forceDie: true, + trigger: { player: "die" }, + skillAnimation: true, + animationColor: "gray", + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.maxHp > player.maxHp; }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('olfusong'),'令一名体力上限大于你的其他角色获得〖丰姿〗或〖吉占〗',function(card,player,target){ - return target.maxHp>player.maxHp; - }).set('forceDie',true).set('ai',(target)=>get.attitude(_status.event.player,target)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('olfusong',target); - target.chooseControl('olfengzi','oljizhan').set('prompt','令'+get.translation(target)+'获得其中一个技能').set('ai',()=>(Math.random()>0.5?0:1)); - } - else event.finish(); - 'step 2' + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("olfusong"), + "令一名体力上限大于你的其他角色获得〖丰姿〗或〖吉占〗", + function (card, player, target) { + return target.maxHp > player.maxHp; + } + ) + .set("forceDie", true) + .set("ai", (target) => get.attitude(_status.event.player, target)); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("olfusong", target); + target + .chooseControl("olfengzi", "oljizhan") + .set("prompt", "令" + get.translation(target) + "获得其中一个技能") + .set("ai", () => (Math.random() > 0.5 ? 0 : 1)); + } else event.finish(); + ("step 2"); target.addSkills(result.control); }, }, //邓芝 - olxiuhao:{ - audio:2, - trigger:{global:'damageBegin4'}, - usable:1, - filter:function(event,player){ - return event.source&&event.source.isIn()&&[event.source,event.player].includes(player)&&event.source!=event.player; + olxiuhao: { + audio: 2, + trigger: { global: "damageBegin4" }, + usable: 1, + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + [event.source, event.player].includes(player) && + event.source != event.player + ); }, - logTarget:function(event,player){ - return player==event.player?event.source:event.player; + logTarget: function (event, player) { + return player == event.player ? event.source : event.player; }, - check:function(event,player){ - _status.olxiuhao_judging=true; - var bool=false; - if(get.attitude(player,event.player)>0) bool=true; - else if(2*get.effect(event.source,{name:'draw'},player,_status.event.player)+event.num*get.damageEffect(player,event.source,_status.event.player,event.nature)>0) bool=true; - else if(event.source.hasSkillTag('nogain')) bool=true; + check: function (event, player) { + _status.olxiuhao_judging = true; + var bool = false; + if (get.attitude(player, event.player) > 0) bool = true; + else if ( + 2 * get.effect(event.source, { name: "draw" }, player, _status.event.player) + + event.num * + get.damageEffect(player, event.source, _status.event.player, event.nature) > + 0 + ) + bool = true; + else if (event.source.hasSkillTag("nogain")) bool = true; delete _status.olxiuhao_judging; return bool; }, - content:function(){ + content: function () { trigger.cancel(); trigger.source.draw(2); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(!_status.olxiuhao_judging&&get.tag(card,'damage')&&get.attitude(target,player)>0&&player!=target&&(!target.storage.counttrigger||!target.storage.counttrigger.olxiuhao)) return [0,0.5,0,0.5]; + ai: { + effect: { + target: function (card, player, target) { + if ( + !_status.olxiuhao_judging && + get.tag(card, "damage") && + get.attitude(target, player) > 0 && + player != target && + (!target.storage.counttrigger || !target.storage.counttrigger.olxiuhao) + ) + return [0, 0.5, 0, 0.5]; }, - player:function(card,player,target){ - if(!_status.olxiuhao_judging&&get.tag(card,'damage')&&get.attitude(player,target)>0&&player!=target&&(!player.storage.counttrigger||!player.storage.counttrigger.olxiuhao)) return [0,0.5,0,0.5]; + player: function (card, player, target) { + if ( + !_status.olxiuhao_judging && + get.tag(card, "damage") && + get.attitude(player, target) > 0 && + player != target && + (!player.storage.counttrigger || !player.storage.counttrigger.olxiuhao) + ) + return [0, 0.5, 0, 0.5]; }, }, }, }, - olsujian:{ - trigger:{player:'phaseDiscardBefore'}, - forced:true, - content:function(){ + olsujian: { + trigger: { player: "phaseDiscardBefore" }, + forced: true, + content: function () { trigger.setContent(lib.skill.olsujian.phaseDiscard); }, - phaseDiscard:function(){ - 'step 0' - game.log(player,'进入了弃牌阶段'); - game.broadcastAll(function(player){ - if(lib.config.show_phase_prompt){ - player.popup('弃牌阶段',null,false); + phaseDiscard: function () { + "step 0"; + game.log(player, "进入了弃牌阶段"); + game.broadcastAll(function (player) { + if (lib.config.show_phase_prompt) { + player.popup("弃牌阶段", null, false); } - },player); - event.trigger('phaseDiscard'); - 'step 1' - var cards=lib.skill.olsujian.update(player); - if(!cards.length) event.finish(); - else{ - event.cards=cards; - var str=get.translation(cards); - player.chooseControl().set('choiceList',[ - '将'+str+'分配给任意名其他角色', - '弃置'+str+'并弃置一名其他角色至多等量的牌', - ]).set('ai',function(){ - var cards=_status.event.getParent().cards,player=_status.event.player; - if(!game.hasPlayer(function(current){ - return player!==current&&get.attitude(player,current)>0; - })) return 1; - if(game.hasPlayer(function(current){ - var att=get.attitude(player,current); - return att&¤t.countDiscardableCards(player,'he',function(i){ - if(att>0) return get.value(i,current)<0; - return get.value(i,current)>=4; - })>=cards.length&&get.effect(current,{name:'guohe_copy2'},player,player)>0; - })) return 1; - return 0; - }); + }, player); + event.trigger("phaseDiscard"); + ("step 1"); + var cards = lib.skill.olsujian.update(player); + if (!cards.length) event.finish(); + else { + event.cards = cards; + var str = get.translation(cards); + player + .chooseControl() + .set("choiceList", [ + "将" + str + "分配给任意名其他角色", + "弃置" + str + "并弃置一名其他角色至多等量的牌", + ]) + .set("ai", function () { + var cards = _status.event.getParent().cards, + player = _status.event.player; + if ( + !game.hasPlayer(function (current) { + return player !== current && get.attitude(player, current) > 0; + }) + ) + return 1; + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + return ( + att && + current.countDiscardableCards(player, "he", function (i) { + if (att > 0) return get.value(i, current) < 0; + return get.value(i, current) >= 4; + }) >= cards.length && + get.effect(current, { name: "guohe_copy2" }, player, player) > 0 + ); + }) + ) + return 1; + return 0; + }); } - 'step 2' - if(result.index==1){ - cards=event.cards.filter(function(i){ - return lib.filter.cardDiscardable(i,player,'olsujian'); + ("step 2"); + if (result.index == 1) { + cards = event.cards.filter(function (i) { + return lib.filter.cardDiscardable(i, player, "olsujian"); }); - if(cards.length){ - event.num=cards.length; + if (cards.length) { + event.num = cards.length; player.discard(cards); - event.cards=cards; - } - else event.finish(); - } - else event.goto(5); - 'step 3' - if(game.hasPlayer(function(current){ - return current!=player&¤t.countDiscardableCards(player,'he')>0; - })){ - player.chooseTarget(true,'弃置一名其他角色的至多'+get.cnNumber(num)+'张牌',function(card,player,current){ - return current!=player&¤t.countDiscardableCards(player,'he')>0; - }).set('ai',function(current){ - var att=get.attitude(player,current); - if(current.countDiscardableCards(player,'he',function(i){ - if(att>0) return get.value(i,current)>=4; - return get.value(i,current)<=0; - })>=num) return 4*get.effect(current,{name:'guohe_copy2'},player,player); - return get.effect(current,{name:'guohe_copy2'},player,player); - }); - } - else event.finish(); - 'step 4' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.discardPlayerCard(target,true,[1,num]); + event.cards = cards; + } else event.finish(); + } else event.goto(5); + ("step 3"); + if ( + game.hasPlayer(function (current) { + return current != player && current.countDiscardableCards(player, "he") > 0; + }) + ) { + player + .chooseTarget( + true, + "弃置一名其他角色的至多" + get.cnNumber(num) + "张牌", + function (card, player, current) { + return ( + current != player && current.countDiscardableCards(player, "he") > 0 + ); + } + ) + .set("ai", function (current) { + var att = get.attitude(player, current); + if ( + current.countDiscardableCards(player, "he", function (i) { + if (att > 0) return get.value(i, current) >= 4; + return get.value(i, current) <= 0; + }) >= num + ) + return 4 * get.effect(current, { name: "guohe_copy2" }, player, player); + return get.effect(current, { name: "guohe_copy2" }, player, player); + }); + } else event.finish(); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, true, [1, num]); } event.finish(); - 'step 5' - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - 'step 6' + ("step 5"); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + ("step 6"); player.chooseCardTarget({ - filterCard:function(card){ - return card.hasGaintag('olsujian'); + filterCard: function (card) { + return card.hasGaintag("olsujian"); }, - filterTarget:lib.filter.notMe, - selectCard:[1,cards.length], - forced:true, - prompt:'请选择要分配的卡牌和目标', - ai1:function(card){ - if(!ui.selected.cards.length) return 1; + filterTarget: lib.filter.notMe, + selectCard: [1, cards.length], + forced: true, + prompt: "请选择要分配的卡牌和目标", + ai1: function (card) { + if (!ui.selected.cards.length) return 1; return 0; }, - ai2:function(target){ - var player=_status.event.player,card=ui.selected.cards[0]; - var val=target.getUseValue(card); - if(val>0) return val*get.attitude(player,target)*2; - return get.value(card,target)*get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = target.getUseValue(card); + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); }, }); - 'step 7' - if(result.bool){ - var res=result.cards,target=result.targets[0].playerid; - player.removeGaintag('olsujian',res); - player.addGaintag(res,'olsujian_given'); + ("step 7"); + if (result.bool) { + var res = result.cards, + target = result.targets[0].playerid; + player.removeGaintag("olsujian", res); + player.addGaintag(res, "olsujian_given"); cards.removeArray(res); - if(!event.given_map[target]) event.given_map[target]=[]; + if (!event.given_map[target]) event.given_map[target] = []; event.given_map[target].addArray(res); - if(cards.length) event.goto(6); + if (cards.length) event.goto(6); + } else event.finish(); + ("step 8"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - else event.finish(); - 'step 8' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); - } - var map=[],cards=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - map.push([source,event.given_map[i]]); + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + map.push([source, event.given_map[i]]); cards.addArray(event.given_map[i]); } - if(map.length) game.loseAsync({ - gain_list:map, - player:player, - cards:cards, - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); - 'step 9' - event.cards=[]; + if (map.length) + game.loseAsync({ + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + ("step 9"); + event.cards = []; }, - update:function(player){ - player.removeGaintag('olsujian'); - var hs=player.getCards('h'); - player.getHistory('gain',function(evt){ + update: function (player) { + player.removeGaintag("olsujian"); + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { hs.removeArray(evt.cards); }); - if(hs.length) player.addGaintag(hs,'olsujian'); + if (hs.length) player.addGaintag(hs, "olsujian"); return hs; }, - group:'olsujian_sync', - subSkill:{ - sync:{ - trigger:{player:['phaseBeginStart','gainBegin']}, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - if(event.name=='gain') return (player==_status.currentPhase)&&(event.getParent('olsujian').player!=player); + group: "olsujian_sync", + subSkill: { + sync: { + trigger: { player: ["phaseBeginStart", "gainBegin"] }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (event.name == "gain") + return ( + player == _status.currentPhase && + event.getParent("olsujian").player != player + ); return true; }, - content:function(){ + content: function () { lib.skill.olsujian.update(player); }, }, }, }, //卞夫人 - fuwei:{ - audio:'wanwei', - trigger:{ - player:'loseAfter', - global:'gainAfter', + fuwei: { + audio: "wanwei", + trigger: { + player: "loseAfter", + global: "gainAfter", }, - filter:function(event,player){ - var evt=event; - if(event.name=='lose'){ - if(event.type!='discard') return false; - evt=event.getParent(); + filter: function (event, player) { + var evt = event; + if (event.name == "lose") { + if (event.type != "discard") return false; + evt = event.getParent(); } - if(evt[event.name=='gain'?'bySelf':'notBySelf']!=true) return false; - var evtx=event.getl(player); - return evtx&&evtx.cards2&&evtx.cards2.length>0; + if (evt[event.name == "gain" ? "bySelf" : "notBySelf"] != true) return false; + var evtx = event.getl(player); + return evtx && evtx.cards2 && evtx.cards2.length > 0; }, - prompt2:function(event,player){ - var evt=event.getl(player),origins=evt.cards2.map(function(i){ - return get.name(i,evt.hs.includes(i)?player:false); - }); - return '从牌堆中获得'+get.translation(origins)+';若没有则改为摸一张牌'; - }, - usable:1, - content:function(){ - var num=0,cards=[],evt=trigger.getl(player),origins=evt.cards2.map(function(i){ - return get.name(i,evt.hs.includes(i)?player:false); - }); - for(var i of origins){ - var card=get.cardPile2(function(card){ - return card.name==i&&!cards.includes(card); + prompt2: function (event, player) { + var evt = event.getl(player), + origins = evt.cards2.map(function (i) { + return get.name(i, evt.hs.includes(i) ? player : false); }); - if(card) cards.push(card); + return "从牌堆中获得" + get.translation(origins) + ";若没有则改为摸一张牌"; + }, + usable: 1, + content: function () { + var num = 0, + cards = [], + evt = trigger.getl(player), + origins = evt.cards2.map(function (i) { + return get.name(i, evt.hs.includes(i) ? player : false); + }); + for (var i of origins) { + var card = get.cardPile2(function (card) { + return card.name == i && !cards.includes(card); + }); + if (card) cards.push(card); else num++; } - if(cards.length) player.gain(cards,'gain2'); - if(num) player.draw(num); + if (cards.length) player.gain(cards, "gain2"); + if (num) player.draw(num); }, }, - yuejian:{ - audio:2, - usable:2, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return player!=event.player&&event.targets&&event.targets.includes(player)&&player.countCards('h')>0; + yuejian: { + audio: 2, + usable: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + player != event.player && + event.targets && + event.targets.includes(player) && + player.countCards("h") > 0 + ); }, - prompt2:function(event,player){ - var suit=get.suit(event.card),hs=player.getCards('h'),cards=event.cards.filterInD(); - if(!lib.suit.includes(suit)||!cards.length){ - return '展示所有手牌,然后无事发生'; + prompt2: function (event, player) { + var suit = get.suit(event.card), + hs = player.getCards("h"), + cards = event.cards.filterInD(); + if (!lib.suit.includes(suit) || !cards.length) { + return "展示所有手牌,然后无事发生"; } - for(var i of hs){ - if(get.suit(i)==suit){ - return '展示所有手牌,然后无事发生'; + for (var i of hs) { + if (get.suit(i) == suit) { + return "展示所有手牌,然后无事发生"; } } - return '展示所有手牌,然后获得'+get.translation(cards)+''; + return ( + '展示所有手牌,然后获得' + get.translation(cards) + "" + ); }, - check:function(event,player){ - var suit=get.suit(event.card),hs=player.getCards('h'),cards=event.cards.filterInD(); - if(!lib.suit.includes(suit)||!cards.length){ + check: function (event, player) { + var suit = get.suit(event.card), + hs = player.getCards("h"), + cards = event.cards.filterInD(); + if (!lib.suit.includes(suit) || !cards.length) { return false; } - for(var i of hs){ - if(get.suit(i)==suit){ + for (var i of hs) { + if (get.suit(i) == suit) { return false; } } return true; }, - content:function(){ - 'step 0' - player.showHandcards(get.translation(player)+'发动了【约俭】'); - var suit=get.suit(trigger.card),hs=player.getCards('h'); - if(!lib.suit.includes(suit)){event.finish();return;} - for(var i of hs){ - if(get.suit(i)==suit){ + content: function () { + "step 0"; + player.showHandcards(get.translation(player) + "发动了【约俭】"); + var suit = get.suit(trigger.card), + hs = player.getCards("h"); + if (!lib.suit.includes(suit)) { + event.finish(); + return; + } + for (var i of hs) { + if (get.suit(i) == suit) { event.finish(); return; } } - 'step 1' - var cards=trigger.cards.filterInD(); - if(cards.length) player.gain(cards,'gain2'); + ("step 1"); + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); }, }, //杜袭 - quxi:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - direct:true, - limited:true, - skillAnimation:true, - animationColor:'water', - filter:function(event,player){ - if(player.isTurnedOver()) return false; - var list=game.filterPlayer((target)=>target!=player&&!target.hasMark('quxi_gain')&&!target.hasMark('quxi_lose')); - if(list.length<2) return false; - var nf=list[0].countCards('h'); - for(var i=1;i + target != player && !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose") + ); + if (list.length < 2) return false; + var nf = list[0].countCards("h"); + for (var i = 1; i < list.length; i++) { + if (list[i].countCards("h") != nf) return true; } return false; }, - content:function(){ - 'step 0' - player.chooseTarget(2,get.prompt('quxi'),'选择两名手牌数不同的其他角色。你将翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。',function(card,player,target){ - if(player==target||target.hasMark('quxi_gain')||target.hasMark('quxi_lose')) return false; - if(!ui.selected.targets.length) return true; - return target.countCards('h')!=ui.selected.targets[0].countCards('h'); - }).set('complexTarget',true).set('ai',function(target){ - if(!ui.selected.targets.length){ - var player=_status.event.player,hs=target.countCards('h'); - if(game.hasPlayer(function(current){ - return current!=player&¤t!=target&¤t.countCards('h')>hs&&!current.hasMark('quxi_gain')&&!current.hasMark('quxi_lose'); - })) return get.attitude(player,target)/(Math.sqrt(1+target.countCards('h'))); + content: function () { + "step 0"; + player + .chooseTarget( + 2, + get.prompt("quxi"), + "选择两名手牌数不同的其他角色。你将翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。", + function (card, player, target) { + if ( + player == target || + target.hasMark("quxi_gain") || + target.hasMark("quxi_lose") + ) + return false; + if (!ui.selected.targets.length) return true; + return target.countCards("h") != ui.selected.targets[0].countCards("h"); + } + ) + .set("complexTarget", true) + .set("ai", function (target) { + if (!ui.selected.targets.length) { + var player = _status.event.player, + hs = target.countCards("h"); + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current != target && + current.countCards("h") > hs && + !current.hasMark("quxi_gain") && + !current.hasMark("quxi_lose") + ); + }) + ) + return ( + get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")) + ); + return 0; + } + if (target.countCards("h") > ui.selected.targets[0].countCards("h")) + return -get.attitude(_status.event.player, target); return 0; - } - if(target.countCards('h')>ui.selected.targets[0].countCards('h')) return -get.attitude(_status.event.player,target); - return 0; - }); - 'step 1' - if(result.bool){ - player.logSkill('quxi',result.targets); - player.awakenSkill('quxi'); - player.skip('phaseDiscard'); - if(result.targets[0].countCards('h')>result.targets[1].countCards('h')) result.targets.reverse(); - event.gainner=result.targets[0]; - event.giver=result.targets[1]; + }); + ("step 1"); + if (result.bool) { + player.logSkill("quxi", result.targets); + player.awakenSkill("quxi"); + player.skip("phaseDiscard"); + if (result.targets[0].countCards("h") > result.targets[1].countCards("h")) + result.targets.reverse(); + event.gainner = result.targets[0]; + event.giver = result.targets[1]; player.turnOver(); - } - else event.finish(); - 'step 2' - event.gainner.gainPlayerCard(event.giver,true,'he'); - 'step 3' - player.addSkill('quxi_effect'); - event.gainner.addMark('quxi_gain',1); - event.giver.addMark('quxi_lose',1); + } else event.finish(); + ("step 2"); + event.gainner.gainPlayerCard(event.giver, true, "he"); + ("step 3"); + player.addSkill("quxi_effect"); + event.gainner.addMark("quxi_gain", 1); + event.giver.addMark("quxi_lose", 1); }, - subSkill:{ - effect:{ - global:'quxi_gainlose', - trigger:{global:['roundStart','die']}, - charlotte:true, - direct:true, - filter:function(event,player){ - if(event.name=='die') return event.player.countMark('quxi_gain')>0||event.player.countMark('quxi_lose')>0; - return game.hasPlayer(function(target){ - return target!=player&&(target.countMark('quxi_gain')>0||target.countMark('quxi_lose')>0) + subSkill: { + effect: { + global: "quxi_gainlose", + trigger: { global: ["roundStart", "die"] }, + charlotte: true, + direct: true, + filter: function (event, player) { + if (event.name == "die") + return ( + event.player.countMark("quxi_gain") > 0 || + event.player.countMark("quxi_lose") > 0 + ); + return game.hasPlayer(function (target) { + return ( + target != player && + (target.countMark("quxi_gain") > 0 || target.countMark("quxi_lose") > 0) + ); }); }, - content:function(){ - 'step 0' - if(trigger.name=='die'){ - var gain=trigger.player.countMark('quxi_gain'),lose=trigger.player.countMark('quxi_lose'); - player.chooseTarget('是否令一名角色获得'+get.translation(trigger.player)+'的“'+(gain&&lose?'丰”和“歉':(gain?'丰':'歉'))+'”标记?',function(card,player,target){ - return !target.hasMark('quxi_gain')&&!target.hasMark('quxi_lose'); - }).set('goon',gain-lose).set('ai',function(target){ - var evt=_status.event; - return evt.goon*get.attitude(evt.player,target); - }); - } - else event.goto(2); - 'step 1' - if(result.bool){ - var targets=result.targets; - if(targets.length<2) targets.unshift(trigger.player); - player.logSkill('quxi_effect',targets,false); + content: function () { + "step 0"; + if (trigger.name == "die") { + var gain = trigger.player.countMark("quxi_gain"), + lose = trigger.player.countMark("quxi_lose"); + player + .chooseTarget( + "是否令一名角色获得" + + get.translation(trigger.player) + + "的“" + + (gain && lose ? "丰”和“歉" : gain ? "丰" : "歉") + + "”标记?", + function (card, player, target) { + return ( + !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose") + ); + } + ) + .set("goon", gain - lose) + .set("ai", function (target) { + var evt = _status.event; + return evt.goon * get.attitude(evt.player, target); + }); + } else event.goto(2); + ("step 1"); + if (result.bool) { + var targets = result.targets; + if (targets.length < 2) targets.unshift(trigger.player); + player.logSkill("quxi_effect", targets, false); player.line2(targets); - var gain=targets[0].countMark('quxi_gain'),lose=targets[0].countMark('quxi_lose'); - if(gain){ - targets[0].removeMark('quxi_gain',gain); - targets[1].addMark('quxi_gain',gain); + var gain = targets[0].countMark("quxi_gain"), + lose = targets[0].countMark("quxi_lose"); + if (gain) { + targets[0].removeMark("quxi_gain", gain); + targets[1].addMark("quxi_gain", gain); } - if(lose){ - targets[0].removeMark('quxi_lose',lose); - targets[1].addMark('quxi_lose',lose); + if (lose) { + targets[0].removeMark("quxi_lose", lose); + targets[1].addMark("quxi_lose", lose); } game.delayx(); event.finish(); } - 'step 2' - if(game.hasPlayer(function(target){ - return target.countMark('quxi_gain')>0; - })) player.chooseTarget(2,'是否转移“丰”标记?',function(card,player,target){ - if(ui.selected.targets.length) return (!target.hasMark('quxi_gain')&&!target.hasMark('quxi_lose')); - return target.countMark('quxi_gain')>0; - }).set('complexTarget',true).set('complexSelect',true).set('targetprompt',['移走标记','获得标记']).set('ai',function(target){ - var player=_status.event.player; - if(!ui.selected.targets.length){ - return -get.attitude(player,target); - } - return get.attitude(player,target); - }); + ("step 2"); + if ( + game.hasPlayer(function (target) { + return target.countMark("quxi_gain") > 0; + }) + ) + player + .chooseTarget(2, "是否转移“丰”标记?", function (card, player, target) { + if (ui.selected.targets.length) + return ( + !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose") + ); + return target.countMark("quxi_gain") > 0; + }) + .set("complexTarget", true) + .set("complexSelect", true) + .set("targetprompt", ["移走标记", "获得标记"]) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + return -get.attitude(player, target); + } + return get.attitude(player, target); + }); else event.goto(4); - 'step 3' - if(result.bool){ - var targets=result.targets; - player.logSkill('quxi_effect',targets,false); + ("step 3"); + if (result.bool) { + var targets = result.targets; + player.logSkill("quxi_effect", targets, false); player.line2(targets); - var gain=targets[0].countMark('quxi_gain'); - if(gain){ - targets[0].removeMark('quxi_gain',gain); - targets[1].addMark('quxi_gain',gain); + var gain = targets[0].countMark("quxi_gain"); + if (gain) { + targets[0].removeMark("quxi_gain", gain); + targets[1].addMark("quxi_gain", gain); } game.delayx(); } - 'step 4' - if(game.hasPlayer(function(target){ - return target.countMark('quxi_lose')>0; - })) player.chooseTarget(2,'是否转移“歉”标记?',function(card,player,target){ - if(ui.selected.targets.length) return (!target.hasMark('quxi_gain')&&!target.hasMark('quxi_lose')); - return target.countMark('quxi_lose')>0; - }).set('complexTarget',true).set('complexSelect',true).set('targetprompt',['移走标记','获得标记']).set('ai',function(target){ - var player=_status.event.player; - if(!ui.selected.targets.length){ - return get.attitude(player,target); - } - return -get.attitude(player,target); - }); + ("step 4"); + if ( + game.hasPlayer(function (target) { + return target.countMark("quxi_lose") > 0; + }) + ) + player + .chooseTarget(2, "是否转移“歉”标记?", function (card, player, target) { + if (ui.selected.targets.length) + return ( + !target.hasMark("quxi_gain") && !target.hasMark("quxi_lose") + ); + return target.countMark("quxi_lose") > 0; + }) + .set("complexTarget", true) + .set("complexSelect", true) + .set("targetprompt", ["移走标记", "获得标记"]) + .set("ai", function (target) { + var player = _status.event.player; + if (!ui.selected.targets.length) { + return get.attitude(player, target); + } + return -get.attitude(player, target); + }); else event.finish(); - 'step 5' - if(result.bool){ - var targets=result.targets; - player.logSkill('quxi_effect',targets,false); + ("step 5"); + if (result.bool) { + var targets = result.targets; + player.logSkill("quxi_effect", targets, false); player.line2(targets); - var gain=targets[0].countMark('quxi_lose'); - if(gain){ - targets[0].removeMark('quxi_lose',gain); - targets[1].addMark('quxi_lose',gain); + var gain = targets[0].countMark("quxi_lose"); + if (gain) { + targets[0].removeMark("quxi_lose", gain); + targets[1].addMark("quxi_lose", gain); } game.delayx(); } }, }, - gainlose:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - filter:function(event,player){ - if(event.numFixed) return false; - return player.countMark('quxi_gain')-player.countMark('quxi_lose')!=0; + gainlose: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + filter: function (event, player) { + if (event.numFixed) return false; + return player.countMark("quxi_gain") - player.countMark("quxi_lose") != 0; }, - content:function(){ - trigger.num+=(player.countMark('quxi_gain')-player.countMark('quxi_lose')); + content: function () { + trigger.num += player.countMark("quxi_gain") - player.countMark("quxi_lose"); }, }, - gain:{ - marktext:'丰', - intro:{ - name:'驱徙(丰)', - name2:'丰', - content:'mark', + gain: { + marktext: "丰", + intro: { + name: "驱徙(丰)", + name2: "丰", + content: "mark", }, }, - lose:{ - marktext:'歉', - intro:{ - name:'驱徙(歉)', - name2:'歉', - content:'mark', + lose: { + marktext: "歉", + intro: { + name: "驱徙(歉)", + name2: "歉", + content: "mark", }, }, }, }, - bixiong:{ - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + bixiong: { + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - forced:true, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false||event.getParent('phaseDiscard').player!=player) return false; - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length>0; + forced: true, + filter: function (event, player) { + if ( + event.type != "discard" || + event.getlx === false || + event.getParent("phaseDiscard").player != player + ) + return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; }, - content:function(){ - var cards=[],hs=trigger.getl(player).hs; - for(var i of hs) cards.add(get.suit(i,player)); - player.addTempSkill('bixiong2',{player:'phaseBegin'}); - player.markAuto('bixiong2',cards); + content: function () { + var cards = [], + hs = trigger.getl(player).hs; + for (var i of hs) cards.add(get.suit(i, player)); + player.addTempSkill("bixiong2", { player: "phaseBegin" }); + player.markAuto("bixiong2", cards); }, }, - bixiong2:{ - onremove:true, - mod:{ - targetEnabled:function(card,player,target){ - if(player!==target&&target.getStorage('bixiong2').includes(get.suit(card))) return false; + bixiong2: { + onremove: true, + mod: { + targetEnabled: function (card, player, target) { + if (player !== target && target.getStorage("bixiong2").includes(get.suit(card))) + return false; }, }, - intro:{content:'不能成为其他角色$牌的目标'}, + intro: { content: "不能成为其他角色$牌的目标" }, }, //高干 - juguan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return event.filterCard({ - name:'sha', - },player,event)||event.filterCard({ - name:'juedou', - },player,event); + juguan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + event.filterCard( + { + name: "sha", + }, + player, + event + ) || + event.filterCard( + { + name: "juedou", + }, + player, + event + ) + ); }, - chooseButton:{ - dialog:function(){ - return ui.create.dialog('拒关',[['sha','juedou'],'vcard']); + chooseButton: { + dialog: function () { + return ui.create.dialog("拒关", [["sha", "juedou"], "vcard"]); }, - filter:function(button,player){ - var evt=_status.event.getParent(); - return evt.filterCard({ - name:button.link[2], - },player,evt); + filter: function (button, player) { + var evt = _status.event.getParent(); + return evt.filterCard( + { + name: button.link[2], + }, + player, + evt + ); }, - check:function(button){ - return _status.event.player.getUseValue({ - name:button.link[2], - })*(button.link[2]=='juedou'?3:1); + check: function (button) { + return ( + _status.event.player.getUseValue({ + name: button.link[2], + }) * (button.link[2] == "juedou" ? 3 : 1) + ); }, - backup:function(links){ + backup: function (links) { return { - audio:'juguan', - viewAs:{name:links[0][2]}, - filterCard:true, - check:function(card){ - return 6-get.value(card); + audio: "juguan", + viewAs: { name: links[0][2] }, + filterCard: true, + check: function (card) { + return 6 - get.value(card); }, - position:'hs', - onuse:function(result,player){ - player.addTempSkill('juguan_effect'); + position: "hs", + onuse: function (result, player) { + player.addTempSkill("juguan_effect"); }, - } + }; }, - prompt:function(links){ - return '将一张手牌当做'+get.translation(links[0][2])+'使用'; + prompt: function (links) { + return "将一张手牌当做" + get.translation(links[0][2]) + "使用"; }, }, - ai:{ - order:function(item,player){ - return Math.max(get.order({name:'sha'}),get.order({name:'juedou'}))+0.2; + ai: { + order: function (item, player) { + return Math.max(get.order({ name: "sha" }), get.order({ name: "juedou" })) + 0.2; }, - result:{player:1}, + result: { player: 1 }, }, - subSkill:{ - effect:{ - trigger:{global:'damage'}, - forced:true, - charlotte:true, - firstDo:true, - silent:true, - popup:false, - filter:function(event,player){ - var evt=event.getParent('useCard'); - return event.card&&evt&&event.card==evt.card&&evt.skill=='juguan_backup'&&evt.player==player; + subSkill: { + effect: { + trigger: { global: "damage" }, + forced: true, + charlotte: true, + firstDo: true, + silent: true, + popup: false, + filter: function (event, player) { + var evt = event.getParent("useCard"); + return ( + event.card && + evt && + event.card == evt.card && + evt.skill == "juguan_backup" && + evt.player == player + ); }, - content:function(){ - player.addSkill('juguan_draw'); - player.markAuto('juguan_draw',[trigger.player]); + content: function () { + player.addSkill("juguan_draw"); + player.markAuto("juguan_draw", [trigger.player]); }, }, - draw:{ - audio:'juguan', - trigger:{player:'phaseDrawBegin'}, - forced:true, - charlotte:true, - onremove:true, - content:function(){ - player.removeSkill('juguan_draw'); - if(!trigger.numFixed) trigger.num+=2; + draw: { + audio: "juguan", + trigger: { player: "phaseDrawBegin" }, + forced: true, + charlotte: true, + onremove: true, + content: function () { + player.removeSkill("juguan_draw"); + if (!trigger.numFixed) trigger.num += 2; }, - group:'juguan_clear', - intro:{ - content:'若没有受到$的伤害,则下个摸牌阶段多摸两张牌', + group: "juguan_clear", + intro: { + content: "若没有受到$的伤害,则下个摸牌阶段多摸两张牌", }, }, - clear:{ - trigger:{player:'damage'}, - forced:true, - charlotte:true, - firstDo:true, - silent:true, - popup:false, - filter:function(event,player){ - return player.storage.juguan_draw&&player.storage.juguan_draw.includes(event.source); + clear: { + trigger: { player: "damage" }, + forced: true, + charlotte: true, + firstDo: true, + silent: true, + popup: false, + filter: function (event, player) { + return ( + player.storage.juguan_draw && + player.storage.juguan_draw.includes(event.source) + ); }, - content:function(){ - player.unmarkAuto('juguan_draw',[trigger.source]); - if(!player.storage.juguan_draw||!player.storage.juguan_draw.length) player.removeSkill('juguan_draw'); + content: function () { + player.unmarkAuto("juguan_draw", [trigger.source]); + if (!player.storage.juguan_draw || !player.storage.juguan_draw.length) + player.removeSkill("juguan_draw"); }, }, }, }, //OL鲍三娘 - olwuniang:{ - audio:'xinfu_wuniang', - trigger:{player:'useCardAfter'}, - usable:1, - filter:function(event,player){ - return event.card.name=='sha'&&event.targets.length==1&&event.targets[0].isIn(); + olwuniang: { + audio: "xinfu_wuniang", + trigger: { player: "useCardAfter" }, + usable: 1, + filter: function (event, player) { + return event.card.name == "sha" && event.targets.length == 1 && event.targets[0].isIn(); }, - logTarget:'targets', - content:function(){ - 'step 0' - var target=trigger.targets[0]; - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'武娘:是否对'+get.translation(player)+'使用一张杀?').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',player); - 'step 1' - player.addTempSkill('olwuniang2'); - player.addMark('olwuniang2',1,false); + logTarget: "targets", + content: function () { + "step 0"; + var target = trigger.targets[0]; + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "武娘:是否对" + get.translation(player) + "使用一张杀?") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", player); + ("step 1"); + player.addTempSkill("olwuniang2"); + player.addMark("olwuniang2", 1, false); player.draw(); }, }, - olwuniang2:{ - onremove:true, - charlotte:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('olwuniang2'); + olwuniang2: { + onremove: true, + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("olwuniang2"); }, }, }, - olxushen:{ - derivation:'olzhennan', - audio:'xinfu_xushen', - trigger:{player:'dying'}, - limited:true, - skillAnimation:true, - animationColor:'fire', - filter:function(event,player){ - return player.hp<1; + olxushen: { + derivation: "olzhennan", + audio: "xinfu_xushen", + trigger: { player: "dying" }, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + return player.hp < 1; }, - content:function(){ - 'step 0' - player.awakenSkill('olxushen'); - player.addSkills('olzhennan'); - player.recover(1-player.hp); - 'step 1' - if(!player.isDying()&&!game.hasPlayer(function(current){ - return current.name1=='guansuo'||current.name2=='guansuo'; - })){ - player.chooseTarget(function(card,player,current){ - return current!=player&¤t.hasSex('male'); - },'许身:是否令一名其他男性角色选择是否将其武将牌替换为“关索”?').set('ai',function(target){ - return get.attitude(_status.event.player,target)-4; - }); - } - else event.finish(); - 'step 2' - if(!result.bool){ + content: function () { + "step 0"; + player.awakenSkill("olxushen"); + player.addSkills("olzhennan"); + player.recover(1 - player.hp); + ("step 1"); + if ( + !player.isDying() && + !game.hasPlayer(function (current) { + return current.name1 == "guansuo" || current.name2 == "guansuo"; + }) + ) { + player + .chooseTarget(function (card, player, current) { + return current != player && current.hasSex("male"); + }, "许身:是否令一名其他男性角色选择是否将其武将牌替换为“关索”?") + .set("ai", function (target) { + return get.attitude(_status.event.player, target) - 4; + }); + } else event.finish(); + ("step 2"); + if (!result.bool) { event.finish(); return; } - var target=result.targets[0]; - event.target=target; - player.line(target,'fire'); - target.chooseBool('许身:是否将自己的一张武将牌替换为“关索”?'); - 'step 3' - if(result.bool){ - if(target.name2!=undefined){ - target.chooseControl(target.name1,target.name2).set('prompt','请选择要更换的武将牌'); - } - else event._result={control:target.name1}; - } - else event.finish(); - 'step 4' - target.reinitCharacter(result.control,'guansuo'); + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); + target.chooseBool("许身:是否将自己的一张武将牌替换为“关索”?"); + ("step 3"); + if (result.bool) { + if (target.name2 != undefined) { + target + .chooseControl(target.name1, target.name2) + .set("prompt", "请选择要更换的武将牌"); + } else event._result = { control: target.name1 }; + } else event.finish(); + ("step 4"); + target.reinitCharacter(result.control, "guansuo"); }, }, - olzhennan:{ - audio:'xinfu_zhennan', - enable:'phaseUse', - usable:1, - viewAs:{name:'nanman'}, - filterCard:true, - selectCard:function(){ - if(ui.selected.targets.length) return [ui.selected.targets.length,Math.min(ui.selected.targets.length+1,game.players.length-1)]; - return [1,Infinity]; + olzhennan: { + audio: "xinfu_zhennan", + enable: "phaseUse", + usable: 1, + viewAs: { name: "nanman" }, + filterCard: true, + selectCard: function () { + if (ui.selected.targets.length) + return [ + ui.selected.targets.length, + Math.min(ui.selected.targets.length + 1, game.players.length - 1), + ]; + return [1, Infinity]; }, - check:function(card){ - var player=_status.event.player; - if(game.countPlayer(function(current){ - return current!=player&&player.canUse('nanman',current)&&get.effect(current,{name:'nanman'},player,player)>0; - })<=ui.selected.cards.length) return 0; - return 6-get.value(card); + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return ( + current != player && + player.canUse("nanman", current) && + get.effect(current, { name: "nanman" }, player, player) > 0 + ); + }) <= ui.selected.cards.length + ) + return 0; + return 6 - get.value(card); }, - selectTarget:function(){ + selectTarget: function () { return ui.selected.cards.length; }, - ai:{ - order:2, + ai: { + order: 2, }, - group:'olzhennan2', + group: "olzhennan2", }, - olzhennan2:{ - trigger:{target:'useCardToBefore'}, - forced:true, - locked:false, - audio:'olzhennan', - filter:function(event,player){ - return event.card.name=='nanman'; + olzhennan2: { + trigger: { target: "useCardToBefore" }, + forced: true, + locked: false, + audio: "olzhennan", + filter: function (event, player) { + return event.card.name == "nanman"; }, - content:function(){ + content: function () { trigger.cancel(); }, }, //黄承彦 - guanxu:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer((current)=>lib.skill.guanxu.filterTarget(null,player,current)); + guanxu: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => lib.skill.guanxu.filterTarget(null, player, current)); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - var cards=get.cards(5); - for(var i=cards.length-1;i>=0;i--){ - ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); + content: function () { + "step 0"; + var cards = get.cards(5); + for (var i = cards.length - 1; i >= 0; i--) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); } game.updateRoundNumber(); - var hs=target.getCards('h'); - var dialog=['观虚:选择要操作的牌','
    '+get.translation(target)+'的手牌
    ',hs,'
    牌堆顶
    ',cards]; - player.chooseButton(dialog,2).set('filterButton',function(button){ - if(ui.selected.buttons.length) return get.position(button.link)!=get.position(ui.selected.buttons[0].link); - return true; - }).set('cards1',hs).set('cards2',cards).set('ai',function(button){ - var card=button.link,cards1=_status.event.cards1.slice(0); - var cards2=_status.event.cards2.slice(0),target=_status.event.getParent().target; - if(!ui.selected.buttons.length){ - if(!cards1.includes(card)) return 0; - cards1.remove(card); - var suits=cards2.map(function(i){ - return get.suit(i,target); - }); - for(var i of lib.suit){ - var num=cards1.filter(function(c){ - return get.suit(c,target)==i; - }).length; - if(num>2||(num>1&&suits.includes(i))) return 20+get.value(card); + var hs = target.getCards("h"); + var dialog = [ + "观虚:选择要操作的牌", + '
    ' + get.translation(target) + "的手牌
    ", + hs, + '
    牌堆顶
    ', + cards, + ]; + player + .chooseButton(dialog, 2) + .set("filterButton", function (button) { + if (ui.selected.buttons.length) + return get.position(button.link) != get.position(ui.selected.buttons[0].link); + return true; + }) + .set("cards1", hs) + .set("cards2", cards) + .set("ai", function (button) { + var card = button.link, + cards1 = _status.event.cards1.slice(0); + var cards2 = _status.event.cards2.slice(0), + target = _status.event.getParent().target; + if (!ui.selected.buttons.length) { + if (!cards1.includes(card)) return 0; + cards1.remove(card); + var suits = cards2.map(function (i) { + return get.suit(i, target); + }); + for (var i of lib.suit) { + var num = cards1.filter(function (c) { + return get.suit(c, target) == i; + }).length; + if (num > 2 || (num > 1 && suits.includes(i))) + return 20 + get.value(card); + } + return get.value(card); + } + cards1.remove(ui.selected.buttons[0].link); + cards1.push(card); + for (var i of lib.suit) { + if ( + cards1.filter(function (c) { + return get.suit(c, target) == i; + }).length > 2 + ) + return 20 - get.value(card); + return get.value(ui.selected.buttons[0].link) - get.value(card); } - return get.value(card); - } - cards1.remove(ui.selected.buttons[0].link); - cards1.push(card); - for(var i of lib.suit){ - if(cards1.filter(function(c){ - return get.suit(c,target)==i; - }).length>2) return 20-get.value(card); - return get.value(ui.selected.buttons[0].link)-get.value(card); - } - }); - 'step 1' - if(result.bool){ - var cards=result.links; - if(get.position(cards[0])!='h') cards.reverse(); - var next=target.lose(cards[0],ui.cardPile); - next.insert_index_card=cards[1]; - next.insert_index=function(event){ - return event.insert_index_card; - } - target.gain(cards[1],'draw'); - } - else event.finish(); - 'step 2' - game.updateRoundNumber(); - var suits=[],map={},hs=target.getCards('h'); - if(hs.length){ - for(var i of hs){ - if(!lib.filter.canBeDiscarded(i,player,target,'guanxu')) continue; - var suit=get.suit(i,target); - if(!map[suit]) map[suit]=1; - else map[suit]++; - if(map[suit]>2) suits.add(suit); - } - var next=player.discardPlayerCard(target,3,'visible','h'); - next.set('suits',suits); - next.set('filterButton',function(button){ - var suit=get.suit(button.link); - if(!ui.selected.buttons.length) return _status.event.suits.includes(suit); - return suit==get.suit(ui.selected.buttons[0].link) }); - if(suits.length) next.set('forced',true); + ("step 1"); + if (result.bool) { + var cards = result.links; + if (get.position(cards[0]) != "h") cards.reverse(); + var next = target.lose(cards[0], ui.cardPile); + next.insert_index_card = cards[1]; + next.insert_index = function (event) { + return event.insert_index_card; + }; + target.gain(cards[1], "draw"); + } else event.finish(); + ("step 2"); + game.updateRoundNumber(); + var suits = [], + map = {}, + hs = target.getCards("h"); + if (hs.length) { + for (var i of hs) { + if (!lib.filter.canBeDiscarded(i, player, target, "guanxu")) continue; + var suit = get.suit(i, target); + if (!map[suit]) map[suit] = 1; + else map[suit]++; + if (map[suit] > 2) suits.add(suit); + } + var next = player.discardPlayerCard(target, 3, "visible", "h"); + next.set("suits", suits); + next.set("filterButton", function (button) { + var suit = get.suit(button.link); + if (!ui.selected.buttons.length) return _status.event.suits.includes(suit); + return suit == get.suit(ui.selected.buttons[0].link); + }); + if (suits.length) next.set("forced", true); } }, - ai:{ - order:9, - result:{ - target:function(player,target){ - if(target.countCards('h')>3) return -5; - if(target.countCards('h')==3) return -3; + ai: { + order: 9, + result: { + target: function (player, target) { + if (target.countCards("h") > 3) return -5; + if (target.countCards("h") == 3) return -3; return -0.5; }, }, }, }, - yashi:{ - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - if(event.source&&event.source.isIn()) return true; - return game.hasPlayer((current)=>lib.skill.guanxu.filterTarget(null,player,current)); + yashi: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + if (event.source && event.source.isIn()) return true; + return game.hasPlayer((current) => lib.skill.guanxu.filterTarget(null, player, current)); }, - content:function(){ - 'step 0' - event.addIndex=0; - var choiceList=[]; - if(trigger.source&&trigger.source.isIn()){ - choiceList.push('令'+get.translation(trigger.source)+'的所有非锁定技失效'); - } - else event.addIndex++; - if(game.hasPlayer((current)=>lib.skill.guanxu.filterTarget(null,player,current))) choiceList.push('发动一次〖观虚〗'); - player.chooseControl('cancel2').set('prompt',get.prompt('yashi')).set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player,source=_status.event.getTrigger().source,index=_status.event.getParent().addIndex; - if(game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>3&&get.attitude(player,current)<0; - })) return 1-index; - if(source&&source.isIn()&&get.attitude(player,source)<0&&!source.hasSkill('fengyin')) return 0; - if(game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0&&get.attitude(player,current)<0; - })) return 1-index; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.index+event.addIndex==0){ - var target=trigger.source; - player.logSkill('yashi',target); - //target.removeSkill('fengyin'); - target.addTempSkill('fengyin',{player:'phaseBegin'}); - event.finish(); - } - else player.chooseTarget(true,'请选择〖观虚〗的目标',lib.skill.guanxu.filterTarget).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,'guanxu',player,player); + content: function () { + "step 0"; + event.addIndex = 0; + var choiceList = []; + if (trigger.source && trigger.source.isIn()) { + choiceList.push("令" + get.translation(trigger.source) + "的所有非锁定技失效"); + } else event.addIndex++; + if (game.hasPlayer((current) => lib.skill.guanxu.filterTarget(null, player, current))) + choiceList.push("发动一次〖观虚〗"); + player + .chooseControl("cancel2") + .set("prompt", get.prompt("yashi")) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + source = _status.event.getTrigger().source, + index = _status.event.getParent().addIndex; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current.countCards("h") > 3 && + get.attitude(player, current) < 0 + ); + }) + ) + return 1 - index; + if ( + source && + source.isIn() && + get.attitude(player, source) < 0 && + !source.hasSkill("fengyin") + ) + return 0; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current.countCards("h") > 0 && + get.attitude(player, current) < 0 + ); + }) + ) + return 1 - index; + return "cancel2"; }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('yashi',target); - var next=game.createEvent('yashi_guanxu'); - next.player=player; - next.target=target; + ("step 1"); + if (result.control != "cancel2") { + if (result.index + event.addIndex == 0) { + var target = trigger.source; + player.logSkill("yashi", target); + //target.removeSkill('fengyin'); + target.addTempSkill("fengyin", { player: "phaseBegin" }); + event.finish(); + } else + player + .chooseTarget(true, "请选择〖观虚〗的目标", lib.skill.guanxu.filterTarget) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, "guanxu", player, player); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yashi", target); + var next = game.createEvent("yashi_guanxu"); + next.player = player; + next.target = target; next.setContent(lib.skill.guanxu.content); } }, }, //黄祖 - wangong:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return get.type(event.card,false)=='basic'; + wangong: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.type(event.card, false) == "basic"; }, - content:function(){ - player.addSkill('wangong2'); + content: function () { + player.addSkill("wangong2"); }, }, - wangong2:{ - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - charlotte:true, - content:function(){ - player.removeSkill('wangong2'); - if(trigger.card.name=='sha') trigger.baseDamage++; + wangong2: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + charlotte: true, + content: function () { + player.removeSkill("wangong2"); + if (trigger.card.name == "sha") trigger.baseDamage++; }, - mod:{ - cardUsable:function(card){ - if(card.name=='sha') return Infinity; + mod: { + cardUsable: function (card) { + if (card.name == "sha") return Infinity; }, - targetInRange:function(card){ - if(card.name=='sha') return true; + targetInRange: function (card) { + if (card.name == "sha") return true; }, }, - mark:true, - intro:{ - content:'使用【杀】无距离和次数限制且伤害+1', + mark: true, + intro: { + content: "使用【杀】无距离和次数限制且伤害+1", }, }, //潘淑 - weiyi:{ - trigger:{global:'damageEnd'}, - filter:function(event,player){ - if(player.getStorage('weiyi').includes(event.player)||!event.player.isIn()) return false; - return event.player.hp>=player.hp||event.player.isDamaged(); + weiyi: { + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (player.getStorage("weiyi").includes(event.player) || !event.player.isIn()) + return false; + return event.player.hp >= player.hp || event.player.isDamaged(); }, - direct:true, - content:function(){ - 'step 0' - var list=[]; - if(trigger.player.hp>=player.hp) list.push('失去体力'); - if(trigger.player.hp<=player.hp&&trigger.player.isDamaged()) list.push('回复体力'); - list.push('cancel2') - player.chooseControl(list).set('prompt',get.prompt2('weiyi',trigger.player)).set('ai',function(){ - var player=_status.event.player,target=_status.event.getTrigger().player; - var att=get.attitude(player,target),eff=get.recoverEffect(target,player,player); - if(target.hp<=player.hp&&target.isDamaged()&&att>2&&eff>0){ - if(player==target){ - var storage=player.getStorage('weiyi'); - if(player.hp>=2&&game.hasPlayer(function(current){ - return current.hp==player.hp+1&&!storage.includes(current)&&get.attitude(player,current)<0; - })) return 'cancel2'; + direct: true, + content: function () { + "step 0"; + var list = []; + if (trigger.player.hp >= player.hp) list.push("失去体力"); + if (trigger.player.hp <= player.hp && trigger.player.isDamaged()) list.push("回复体力"); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt2("weiyi", trigger.player)) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().player; + var att = get.attitude(player, target), + eff = get.recoverEffect(target, player, player); + if (target.hp <= player.hp && target.isDamaged() && att > 2 && eff > 0) { + if (player == target) { + var storage = player.getStorage("weiyi"); + if ( + player.hp >= 2 && + game.hasPlayer(function (current) { + return ( + current.hp == player.hp + 1 && + !storage.includes(current) && + get.attitude(player, current) < 0 + ); + }) + ) + return "cancel2"; + } + return "回复体力"; } - return '回复体力'; - } - if(target.hp>=player.hp&&att<-2&&eff<0) return '失去体力'; - return 'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - var target=trigger.player; - player.logSkill('weiyi',target); - player.markAuto('weiyi',[target]); - target[result.control=='失去体力'?'loseHp':'recover'](); + if (target.hp >= player.hp && att < -2 && eff < 0) return "失去体力"; + return "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("weiyi", target); + player.markAuto("weiyi", [target]); + target[result.control == "失去体力" ? "loseHp" : "recover"](); } }, - onremove:true, - intro:{ - content:'已令$对汝威服', + onremove: true, + intro: { + content: "已令$对汝威服", }, }, - jinzhi:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - if(get.type(name)=='basic'&&lib.inpile.includes(name)&&player.countMark('jinzhi2')=player.countCards('he')) return false; - for(var i of lib.inpile){ - if(get.type(i)=='basic'&&event.filterCard({name:i,isCard:true},player,event)) return true; + filter: function (event, player) { + if ( + event.responded || + event.jinzhi || + player.countMark("jinzhi2") >= player.countCards("he") + ) + return false; + for (var i of lib.inpile) { + if ( + get.type(i) == "basic" && + event.filterCard({ name: i, isCard: true }, player, event) + ) + return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i of lib.inpile){ - if(get.type(i)=='basic'&&event.filterCard({name:i,isCard:true},player,event)){ - list.push(['基本','',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if ( + get.type(i) == "basic" && + event.filterCard({ name: i, isCard: true }, player, event) + ) { + list.push(["基本", "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } } } - return ui.create.dialog('锦织',[list,'vcard'],'hidden') + return ui.create.dialog("锦织", [list, "vcard"], "hidden"); }, - check:function(button){ - if(button.link[2]=='shan') return 3; - var player=_status.event.player; - if(button.link[2]=='jiu'){ - if(player.getUseValue({name:'jiu'})<=0) return 0; - if(player.countCards('h','sha')) return player.getUseValue({name:'jiu'}); + check: function (button) { + if (button.link[2] == "shan") return 3; + var player = _status.event.player; + if (button.link[2] == "jiu") { + if (player.getUseValue({ name: "jiu" }) <= 0) return 0; + if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" }); } - return player.getUseValue({name:button.link[2],nature:button.link[3]})/4; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4; }, - backup:function(links,player){ + backup: function (links, player) { return { - selectCard:player.countMark('jinzhi2')+1, - filterCard:function(card,player){ - if(ui.selected.cards.length){ - if(get.color(card)!=get.color(ui.selected.cards[0])) return false; + selectCard: player.countMark("jinzhi2") + 1, + filterCard: function (card, player) { + if (ui.selected.cards.length) { + if (get.color(card) != get.color(ui.selected.cards[0])) return false; } - return lib.filter.cardDiscardable.apply(this,arguments); + return lib.filter.cardDiscardable.apply(this, arguments); }, - complexCard:true, - viewAs:{ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null, - isCard:true, + complexCard: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, }, - position:'he', - ignoreMod:true, - check:function(card){ - var player=_status.event.player,color=get.color(card,player); - if(player.countCards('he',{color:color})<=player.countMark('jinzhi2')||(ui.selected.cards.length&&get.color(ui.selected.cards[0],player)!=color)) return -1; - if(lib.skill.jinzhi_backup.viewAs.name=='jiu'&&!player.countCards('h',function(cardx){ - return card!=cardx&&!ui.selected.cards.includes(cardx)&&get.name(cardx,player)=='sha'; - })) return 0; - return Math.min(0.01,6-get.value(card)); + position: "he", + ignoreMod: true, + check: function (card) { + var player = _status.event.player, + color = get.color(card, player); + if ( + player.countCards("he", { color: color }) <= + player.countMark("jinzhi2") || + (ui.selected.cards.length && + get.color(ui.selected.cards[0], player) != color) + ) + return -1; + if ( + lib.skill.jinzhi_backup.viewAs.name == "jiu" && + !player.countCards("h", function (cardx) { + return ( + card != cardx && + !ui.selected.cards.includes(cardx) && + get.name(cardx, player) == "sha" + ); + }) + ) + return 0; + return Math.min(0.01, 6 - get.value(card)); }, - precontent:function(){ - player.logSkill('jinzhi'); - player.addTempSkill('jinzhi2','roundStart'); - player.addMark('jinzhi2',1,false); - var cards=event.result.cards; + precontent: function () { + player.logSkill("jinzhi"); + player.addTempSkill("jinzhi2", "roundStart"); + player.addMark("jinzhi2", 1, false); + var cards = event.result.cards; player.discard(cards); player.draw(); - event.result.card={ - name:event.result.card.name, - nature:event.result.card.nature, - isCard:true, + event.result.card = { + name: event.result.card.name, + nature: event.result.card.nature, + isCard: true, }; - event.result.cards=[]; + event.result.cards = []; delete event.result.skill; - if(cards.length>1){ - var color=get.color(cards[0],player); - for(var i=1;i 1) { + var color = get.color(cards[0], player); + for (var i = 1; i < cards.length; i++) { + if (get.color(cards[i], player) != color) { + var evt = event.getParent(); + evt.set("jinzhi", true); evt.goto(0); return; } } } }, - } + }; }, - prompt:function(links,player){ - var name=links[0][2]; - var nature=links[0][3]; - return '弃置'+get.cnNumber(player.countMark('jinzhi2')+1)+'张颜色相同的牌并摸一张牌,然后视为使用'+(get.translation(nature)||'')+get.translation(name); + prompt: function (links, player) { + var name = links[0][2]; + var nature = links[0][3]; + return ( + "弃置" + + get.cnNumber(player.countMark("jinzhi2") + 1) + + "张颜色相同的牌并摸一张牌,然后视为使用" + + (get.translation(nature) || "") + + get.translation(name) + ); }, }, - ai:{ - order:function(item,player){ - if(_status.event.type=='phase'&&!player.countMark('jinzhi2')&&player.getUseValue({name:'jiu'},null,true)>0&&player.countCards('h','sha')) return get.order({name:'jiu'})+1; + ai: { + order: function (item, player) { + if ( + _status.event.type == "phase" && + !player.countMark("jinzhi2") && + player.getUseValue({ name: "jiu" }, null, true) > 0 && + player.countCards("h", "sha") + ) + return get.order({ name: "jiu" }) + 1; return 1; }, - respondShan:true, - respondSha:true, - skillTagFilter:function(player){ - if(player.countMark('jinzhi2')>=player.countCards('he')) return false; + respondShan: true, + respondSha: true, + skillTagFilter: function (player) { + if (player.countMark("jinzhi2") >= player.countCards("he")) return false; }, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; - } - } - } + }, + }, + }, }, - jinzhi2:{ - onremove:true, - intro:{ - content:'本轮已发动过#次', + jinzhi2: { + onremove: true, + intro: { + content: "本轮已发动过#次", }, }, //宗预 - zyqiao:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - logTarget:'player', - usable:2, - preHidden:true, - filter:function(event,player){ - var source=event.player; - if(source==player) return false; - if(get.mode()=='guozhan'&&source.isFriendOf(player)) return false; - return source.countDiscardableCards(player,'he')>0; + zyqiao: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + usable: 2, + preHidden: true, + filter: function (event, player) { + var source = event.player; + if (source == player) return false; + if (get.mode() == "guozhan" && source.isFriendOf(player)) return false; + return source.countDiscardableCards(player, "he") > 0; }, - check:function(event,player){ - var target=event.player; - if(get.attitude(player,target)>=0) return false; - if(!player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'zyqiao'); - })) return true; - if(player.countCards('he',(card)=>get.value(card,player)<5)) return true; - if(target.countCards('he',(card)=>get.value(card,target)>6)&&player.countCards('he',(card)=>get.value(card,player)<7)) return true; + check: function (event, player) { + var target = event.player; + if (get.attitude(player, target) >= 0) return false; + if ( + !player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "zyqiao"); + }) + ) + return true; + if (player.countCards("he", (card) => get.value(card, player) < 5)) return true; + if ( + target.countCards("he", (card) => get.value(card, target) > 6) && + player.countCards("he", (card) => get.value(card, player) < 7) + ) + return true; return false; }, - content:function(){ - 'step 0' - player.discardPlayerCard(trigger.player,true,'he'); - 'step 1' - if(player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'zyqiao'); - })) player.chooseToDiscard('he',true); + content: function () { + "step 0"; + player.discardPlayerCard(trigger.player, true, "he"); + ("step 1"); + if ( + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "zyqiao"); + }) + ) + player.chooseToDiscard("he", true); }, }, - chengshang:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - if(!lib.suit.includes(get.suit(event.card,false))||typeof get.number(event.card)!='number') return false; - if(player.getHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }).length) return false; - var phsu=event.getParent('phaseUse'); - if(!phsu||phsu.player!=player) return false; - if(player.getHistory('gain',function(evt){ - return evt.getParent().name=='chengshang'; - }).length) return false; - for(var i of event.targets){ - if(i!=player&&(get.mode()!='guozhan'||i.isEnemyOf(player))) return true; + chengshang: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if ( + !lib.suit.includes(get.suit(event.card, false)) || + typeof get.number(event.card) != "number" + ) + return false; + if ( + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length + ) + return false; + var phsu = event.getParent("phaseUse"); + if (!phsu || phsu.player != player) return false; + if ( + player.getHistory("gain", function (evt) { + return evt.getParent().name == "chengshang"; + }).length + ) + return false; + for (var i of event.targets) { + if (i != player && (get.mode() != "guozhan" || i.isEnemyOf(player))) return true; } return false; }, - preHidden:true, - content:function(){ - var suit=get.suit(trigger.card); - var number=get.number(trigger.card); - var cards=[]; - for(var i=0;i0; - })){ + if ( + game.hasPlayer(function (current) { + return ( + current != target && + get.distance(player, current) <= 1 && + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { delete player._reduanbingtmp; - return [1,1]; + return [1, 1]; } delete player._reduanbingtmp; } - } - } + }, + }, }, - group:'reduanbing_sha', - subSkill:{ - sha:{ - audio:'duanbing', - audioname:['heqi'], - trigger:{player:'useCardToPlayered'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&!event.getParent().directHit.includes(event.target)&&get.distance(player,event.target)<=1; + group: "reduanbing_sha", + subSkill: { + sha: { + audio: "duanbing", + audioname: ["heqi"], + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + !event.getParent().directHit.includes(event.target) && + get.distance(player, event.target) <= 1 + ); }, - logTarget:'target', - content:function(){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number'){ + logTarget: "target", + content: function () { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { map[id].shanRequired++; - } - else{ - map[id].shanRequired=2; + } else { + map[id].shanRequired = 2; } }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg.card.name!='sha'||arg.target.countCards('h','shan')>1||get.distance(player,arg.target)>1) return false; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if ( + arg.card.name != "sha" || + arg.target.countCards("h", "shan") > 1 || + get.distance(player, arg.target) > 1 + ) + return false; }, }, }, }, }, - refenxun:{ - audio:'fenxun', - enable:'phaseUse', - usable:1, - position:'he', - filterTarget:function(card,player,target){ - return target!=player; + refenxun: { + audio: "fenxun", + enable: "phaseUse", + usable: 1, + position: "he", + filterTarget: function (card, player, target) { + return target != player; }, - content:function(){ - player.markAuto('refenxun2',targets); - player.addTempSkill('refenxun2'); + content: function () { + player.markAuto("refenxun2", targets); + player.addTempSkill("refenxun2"); }, - ai:{ - order:6.5, - result:{ - player:function(player,target){ - if(get.distance(player,target)<=1) return 0; - var hs=player.getCards('h','shunshou'); - if(hs.length&&player.canUse(hs[0],target,false)){ + ai: { + order: 6.5, + result: { + player: function (player, target) { + if (get.distance(player, target) <= 1) return 0; + var hs = player.getCards("h", "shunshou"); + if (hs.length && player.canUse(hs[0], target, false)) { return 1; } - var geteff=function(current){ - return player.canUse('sha',current,false,true)&&get.effect(current,{name:'sha'},player,player)>0; - } - if(player.hasSha()&&geteff(target)){ - var num=game.countPlayer(function(current){ - return current!=player&&get.distance(player,current)<=1&&geteff(current); + var geteff = function (current) { + return ( + player.canUse("sha", current, false, true) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }; + if (player.hasSha() && geteff(target)) { + var num = game.countPlayer(function (current) { + return ( + current != player && + get.distance(player, current) <= 1 && + geteff(current) + ); }); - if(num==0){ - if(game.hasPlayer(function(current){ - return player.canUse('sha',current)&&geteff(current)&¤t!=target; - })){ + if (num == 0) { + if ( + game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + geteff(current) && + current != target + ); + }) + ) { return 1; } - } - else if(num==1){ + } else if (num == 1) { return 1; } } return 0; - } - } - } + }, + }, + }, }, - refenxun2:{ - audio:'fenxun', - trigger:{ - player:'phaseJieshuBegin', + refenxun2: { + audio: "fenxun", + trigger: { + player: "phaseJieshuBegin", }, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.getHistory('sourceDamage',function(evt){ - return player.storage.refenxun2.includes(evt.player); - }).length==0&&player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'refenxun2'); - })>0; + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getHistory("sourceDamage", function (evt) { + return player.storage.refenxun2.includes(evt.player); + }).length == 0 && + player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "refenxun2"); + }) > 0 + ); }, - content:function(){ - player.chooseToDiscard('he',true); + content: function () { + player.chooseToDiscard("he", true); }, - onremove:true, - intro:{ - content:'到$的距离视为1' + onremove: true, + intro: { + content: "到$的距离视为1", }, - mod:{ - globalFrom:function(from,to){ - if(from.storage.refenxun2.includes(to)){ + mod: { + globalFrom: function (from, to) { + if (from.storage.refenxun2.includes(to)) { return -Infinity; } - } + }, }, }, //蔡阳新技能 - zhuixi:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + zhuixi: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, }, //新塌顿 - reluanzhan:{ - audio:'luanzhan', - trigger:{ - player:'damageEnd', - source:'damageSource', + reluanzhan: { + audio: "luanzhan", + trigger: { + player: "damageEnd", + source: "damageSource", }, - forced:true, - locked:false, - content:function(){ - player.addMark('reluanzhan',1,false); + forced: true, + locked: false, + content: function () { + player.addMark("reluanzhan", 1, false); }, - intro:{content:'mark'}, - ai:{notemp:true}, - group:['reluanzhan_add','reluanzhan_remove'], + intro: { content: "mark" }, + ai: { notemp: true }, + group: ["reluanzhan_add", "reluanzhan_remove"], }, - reluanzhan_add:{ - trigger:{player:'useCard2'}, - direct:true, - filter:function(event,player){ - if(event.card.name!='sha'&&(get.color(event.card)!='black'||get.type(event.card)!='trick')||!player.countMark('reluanzhan')) return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })){ + reluanzhan_add: { + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + if ( + (event.card.name != "sha" && + (get.color(event.card) != "black" || get.type(event.card) != "trick")) || + !player.countMark("reluanzhan") + ) + return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var num=player.countMark('reluanzhan'); - var prompt2='为'+get.translation(trigger.card)+'增加至多'+get.cnNumber(num)+'个目标' - player.chooseTarget(get.prompt('reluanzhan'),function(card,player,target){ - if(_status.event.targets.includes(target)) return false; - var player=_status.event.player; - return lib.filter.targetEnabled2(_status.event.card,player,target)&&lib.filter.targetInRange(_status.event.card,player,target); - },[1,num]).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var num = player.countMark("reluanzhan"); + var prompt2 = + "为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个目标"; + player + .chooseTarget( + get.prompt("reluanzhan"), + function (card, player, target) { + if (_status.event.targets.includes(target)) return false; + var player = _status.event.player; + return ( + lib.filter.targetEnabled2(_status.event.card, player, target) && + lib.filter.targetInRange(_status.event.card, player, target) + ); + }, + [1, num] + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('reluanzhan',event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("reluanzhan", event.targets); trigger.targets.addArray(event.targets); } }, }, - reluanzhan_remove:{ - audio:'luanzhan', - trigger:{player:'useCardToPlayered'}, - forced:true, - locked:false, - filter:function(event,player){ - if(!event.isFirstTarget||(event.card.name!='sha'&&(get.color(event.card)!='black'||get.type(event.card)!='trick'))||!player.countMark('reluanzhan')) return false; - var info=get.info(event.card); - if(info.allowMultiple==false||info.multitarget) return false; - return event.targets.length0) dialog.add([equips,'tdnodes']) - var type=player.storage.youlong?'basic':'trick'; - var list=[]; - for(var name of lib.inpile){ - if(player.storage.youlong2.includes(name)) continue; - if(get.type(name)!=type) continue; - if(event.filterCard({name:name,isCard:true},player,event)){ - list.push([type,'',name]); - if(name=='sha'){ - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + if (equips.length > 0) dialog.add([equips, "tdnodes"]); + var type = player.storage.youlong ? "basic" : "trick"; + var list = []; + for (var name of lib.inpile) { + if (player.storage.youlong2.includes(name)) continue; + if (get.type(name) != type) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) { + list.push([type, "", name]); + if (name == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } } } - dialog.add([list,'vcard']); + dialog.add([list, "vcard"]); return dialog; }, - filter:function(button){ - if(ui.selected.buttons.length&&typeof button.link==typeof ui.selected.buttons[0].link) return false; + filter: function (button) { + if ( + ui.selected.buttons.length && + typeof button.link == typeof ui.selected.buttons[0].link + ) + return false; return true; }, - select:2, - check:function(button){ - var player=_status.event.player; - if(typeof button.link=='number'){ - var card=player.getEquip(button.link); - if(card){ - var val=get.value(card); - if(val>0) return 0; - return 5-val; + select: 2, + check: function (button) { + var player = _status.event.player; + if (typeof button.link == "number") { + var card = player.getEquip(button.link); + if (card) { + var val = get.value(card); + if (val > 0) return 0; + return 5 - val; } - switch(button.link){ - case 3:return 4.5; - case 4:return 4.4; - case 5:return 4.3; - case 2:return (3-player.hp)*1.5; - case 1:{ - if(game.hasPlayer(function(current){ - return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1; - })) return 0; + switch (button.link) { + case 3: + return 4.5; + case 4: + return 4.4; + case 5: + return 4.3; + case 2: + return (3 - player.hp) * 1.5; + case 1: { + if ( + game.hasPlayer(function (current) { + return ( + (get.realAttitude || get.attitude)(player, current) < 0 && + get.distance(player, current) > 1 + ); + }) + ) + return 0; return 3.2; } } } - var name=button.link[2]; - var evt=_status.event.getParent(); - if(evt.type=='phase'){ - var card={name:name,nature:button.link[3],isCard:true}; - if(name=='shan') return 2; - if(evt.type=='dying'){ - if(get.attitude(player,evt.dying)<2) return false; - if(name=='jiu') return 2.1; + var name = button.link[2]; + var evt = _status.event.getParent(); + if (evt.type == "phase") { + var card = { name: name, nature: button.link[3], isCard: true }; + if (name == "shan") return 2; + if (evt.type == "dying") { + if (get.attitude(player, evt.dying) < 2) return false; + if (name == "jiu") return 2.1; return 1.9; } return player.getUseValue(card); } return 1; }, - backup:function(links,player){ - if(typeof links[1]=='number') links.reverse(); - var equip=links[0]; - var name=links[1][2]; - var nature=links[1][3]; + backup: function (links, player) { + if (typeof links[1] == "number") links.reverse(); + var equip = links[0]; + var name = links[1][2]; + var nature = links[1][3]; return { - filterCard:function(){return false}, - selectCard:-1, - equip:equip, - viewAs:{ - name:name, - nature:nature, - isCard:true, + filterCard: function () { + return false; }, - popname:true, - precontent:function(){ - player.logSkill('youlong'); + selectCard: -1, + equip: equip, + viewAs: { + name: name, + nature: nature, + isCard: true, + }, + popname: true, + precontent: function () { + player.logSkill("youlong"); player.disableEquip(lib.skill.youlong_backup.equip); delete event.result.skill; - player.addTempSkill('youlong_'+(player.storage.youlong||false),'roundStart'); - player.changeZhuanhuanji('youlong'); + player.addTempSkill( + "youlong_" + (player.storage.youlong || false), + "roundStart" + ); + player.changeZhuanhuanji("youlong"); player.storage.youlong2.add(event.result.card.name); }, - } + }; }, - prompt:function(links,player){ - if(typeof links[1]=='number') links.reverse(); - var equip='equip'+links[0]; - var name=links[1][2]; - var nature=links[1][3]; - return '废除自己的'+get.translation(equip)+'栏,视为使用'+(get.translation(nature)||'')+get.translation(name); + prompt: function (links, player) { + if (typeof links[1] == "number") links.reverse(); + var equip = "equip" + links[0]; + var name = links[1][2]; + var nature = links[1][3]; + return ( + "废除自己的" + + get.translation(equip) + + "栏,视为使用" + + (get.translation(nature) || "") + + get.translation(name) + ); }, }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(arg=='respond') return false; - if(!player.storage.youlong||player.hasSkill('youlong_true')) return false; - var name=(tag=='respondSha'?'sha':'shan'); + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + if (!player.storage.youlong || player.hasSkill("youlong_true")) return false; + var name = tag == "respondSha" ? "sha" : "shan"; return !player.storage.youlong2.includes(name); }, - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0,add=false; - var type=player.storage.youlong?'basic':'trick'; - var list=lib.inpile.filter(name=>get.type(name)==type&&!player.storage.youlong2.includes(name)); - if(list.includes('sha')) add=true; - list=list.map(namex=>{return {name:namex,isCard:true}}); - if(add) lib.inpile_nature.forEach(naturex=>list.push({name:'sha',nature:naturex,isCard:true})); - for(var card of list){ - if(player.getUseValue(card)>0){ - var temp=get.order(card); - if(temp>max) max=temp; + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0, + add = false; + var type = player.storage.youlong ? "basic" : "trick"; + var list = lib.inpile.filter( + (name) => get.type(name) == type && !player.storage.youlong2.includes(name) + ); + if (list.includes("sha")) add = true; + list = list.map((namex) => { + return { name: namex, isCard: true }; + }); + if (add) + lib.inpile_nature.forEach((naturex) => + list.push({ name: "sha", nature: naturex, isCard: true }) + ); + for (var card of list) { + if (player.getUseValue(card) > 0) { + var temp = get.order(card); + if (temp > max) max = temp; } } - if(max>0) max+=0.3; + if (max > 0) max += 0.3; return max; } return 1; }, - result:{player:1}, + result: { player: 1 }, }, }, - youlong_true:{charlotte:true}, - youlong_false:{charlotte:true}, - luanfeng:{ - audio:2, - audioname:['key_sakuya'], - trigger:{global:'dying'}, - filter:function(event,player){ - return event.player.maxHp>=player.maxHp&&event.player.hp<1; + youlong_true: { charlotte: true }, + youlong_false: { charlotte: true }, + luanfeng: { + audio: 2, + audioname: ["key_sakuya"], + trigger: { global: "dying" }, + filter: function (event, player) { + return event.player.maxHp >= player.maxHp && event.player.hp < 1; }, - limited:true, - skillAnimation:true, - animationColor:'soil', - logTarget:'player', - check:function(event,player){ - if(get.attitude(player,event.player)<4) return false; - if(player.countCards('h',function(card){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,event.player,'unchanged','cardSavable',player); - if(mod!='unchanged') return mod; - var savable=get.info(card).savable; - if(typeof savable=='function') savable=savable(card,player,event.player); - return savable; - })>=1-event.player.hp) return false; - if(event.player==player||event.player==get.zhu(player)) return true; + limited: true, + skillAnimation: true, + animationColor: "soil", + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) < 4) return false; + if ( + player.countCards("h", function (card) { + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod( + card, + player, + event.player, + "unchanged", + "cardSavable", + player + ); + if (mod != "unchanged") return mod; + var savable = get.info(card).savable; + if (typeof savable == "function") savable = savable(card, player, event.player); + return savable; + }) >= + 1 - event.player.hp + ) + return false; + if (event.player == player || event.player == get.zhu(player)) return true; return !player.hasUnknown(); }, - content:function(){ - 'step 0' - player.awakenSkill('luanfeng'); - trigger.player.recover(3-trigger.player.hp); - 'step 1' - var list=[],target=trigger.player; - for(var i=1;i<6;i++){ - for(var j=0;j0) target.enableEquip(list); - if(list.length<6) target.drawTo(6-list.length); - if(target.storage.kotarou_rewrite) target.storage.kotarou_rewrite=[]; - if(player==target) player.storage.youlong2=[]; + if (list.length > 0) target.enableEquip(list); + if (list.length < 6) target.drawTo(6 - list.length); + if (target.storage.kotarou_rewrite) target.storage.kotarou_rewrite = []; + if (player == target) player.storage.youlong2 = []; }, }, //曹爽,韩遂,何进 - xiaoxi:{ - audio:2, - audioname:['machao','hansui','pangde'], - trigger:{ - player:'enterGame', - global:'phaseBefore', + xiaoxi: { + audio: 2, + audioname: ["machao", "hansui", "pangde"], + trigger: { + player: "enterGame", + global: "phaseBefore", }, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - direct:true, - content:function(){ - player.chooseUseTarget('sha',get.prompt('xiaoxi'),'视为使用一张【杀】').logSkill='xiaoxi'; + direct: true, + content: function () { + player.chooseUseTarget("sha", get.prompt("xiaoxi"), "视为使用一张【杀】").logSkill = + "xiaoxi"; }, }, - spmouzhu:{ - enable:'phaseUse', - audio:'mouzhu', - usable:1, - filter:function(event,player){ - return game.hasPlayer((current)=>lib.skill.spmouzhu.filterTarget(null,player,current)); + spmouzhu: { + enable: "phaseUse", + audio: "mouzhu", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => + lib.skill.spmouzhu.filterTarget(null, player, current) + ); }, - filterTarget:function(card,player,target){ - if(!target.countCards('h')) return false; - return player!=target&&(target.hp==player.hp||get.distance(player,target)==1); + filterTarget: function (card, player, target) { + if (!target.countCards("h")) return false; + return player != target && (target.hp == player.hp || get.distance(player, target) == 1); }, - selectTarget:[1,Infinity], - content:function(){ - 'step 0' - target.chooseCard('h','交给'+get.translation(player)+'一张牌',true); - 'step 1' - if(result.bool) target.give(result.cards,player); - 'step 2' - if(player.countCards('h')<=target.countCards('h')){ + selectTarget: [1, Infinity], + content: function () { + "step 0"; + target.chooseCard("h", "交给" + get.translation(player) + "一张牌", true); + ("step 1"); + if (result.bool) target.give(result.cards, player); + ("step 2"); + if (player.countCards("h") <= target.countCards("h")) { event.finish(); return; } - var list=[]; - if(target.canUse('sha',player,false)) list.push('sha'); - if(target.canUse('juedou',player,false)) list.push('juedou'); - if(!list.length) event.finish(); - else if(list.length==1) event._result={control:list[0]}; - else target.chooseControl(list).set('prompt','对'+get.translation(player)+'使用一张【杀】或【决斗】。').ai=function(){ - return get.effect(player,{name:'sha'},target,target)>=get.effect(player,{name:'juedou'},target,target)?'sha':'juedou'; - }; - 'step 3' - target.useCard({name:result.control,isCard:true},player,'noai'); + var list = []; + if (target.canUse("sha", player, false)) list.push("sha"); + if (target.canUse("juedou", player, false)) list.push("juedou"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else + target + .chooseControl(list) + .set("prompt", "对" + get.translation(player) + "使用一张【杀】或【决斗】。").ai = + function () { + return get.effect(player, { name: "sha" }, target, target) >= + get.effect(player, { name: "juedou" }, target, target) + ? "sha" + : "juedou"; + }; + ("step 3"); + target.useCard({ name: result.control, isCard: true }, player, "noai"); }, - ai:{ - order:7, - result:{ - target:-1.2, - player:function(player,target){ - if(ui.selected.targets.length) return 0; - if(target.countCards('h')-player.countCards('h')>1) return 1; - if(get.damageEffect(target,player,player,player)>0) return 1; - if(player.hp>3||player.countCards('h','sha')&&player.countCards('h','shan')) return 0; - if(player.hp>2) return -1.1; + ai: { + order: 7, + result: { + target: -1.2, + player: function (player, target) { + if (ui.selected.targets.length) return 0; + if (target.countCards("h") - player.countCards("h") > 1) return 1; + if (get.damageEffect(target, player, player, player) > 0) return 1; + if ( + player.hp > 3 || + (player.countCards("h", "sha") && player.countCards("h", "shan")) + ) + return 0; + if (player.hp > 2) return -1.1; return -2; }, }, }, }, - spyanhuo:{ - audio:'yanhuo', - trigger:{player:'die'}, - forceDie:true, - skillAnimation:true, - animationColor:'soil', - content:function(){ - player.line(game.players,'green'); - game.addGlobalSkill('spyanhuo_damage'); - if(!_status.yanhuo) _status.yanhuo=0; + spyanhuo: { + audio: "yanhuo", + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "soil", + content: function () { + player.line(game.players, "green"); + game.addGlobalSkill("spyanhuo_damage"); + if (!_status.yanhuo) _status.yanhuo = 0; _status.yanhuo++; }, - subSkill:{ - damage:{ - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'; + subSkill: { + damage: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha"; }, - content:function(){ - trigger.baseDamage+=(_status.yanhuo||0); + content: function () { + trigger.baseDamage += _status.yanhuo || 0; }, }, }, }, - spniluan:{ - enable:'phaseUse', - audio:'niluan', - viewAs:{name:'sha'}, - check:function(card){ - return 5.1-get.value(card); + spniluan: { + enable: "phaseUse", + audio: "niluan", + viewAs: { name: "sha" }, + check: function (card) { + return 5.1 - get.value(card); }, - filterCard:{color:'black'}, - position:'hes', - viewAsFilter:function(player){ - return player.countCards('hes',lib.skill.spniluan.filterCard)>0; + filterCard: { color: "black" }, + position: "hes", + viewAsFilter: function (player) { + return player.countCards("hes", lib.skill.spniluan.filterCard) > 0; }, - group:'spniluan_clear', + group: "spniluan_clear", }, - spniluan_clear:{ - trigger:{player:'useCardAfter'}, - forced:true, - silent:true, - charlotte:true, - filter:function(event,player){ - return event.skill=='spniluan'&&event.addCount!==false&&player.getHistory('sourceDamage',function(card){ - return card.card==event.card; - }).length==0; + spniluan_clear: { + trigger: { player: "useCardAfter" }, + forced: true, + silent: true, + charlotte: true, + filter: function (event, player) { + return ( + event.skill == "spniluan" && + event.addCount !== false && + player.getHistory("sourceDamage", function (card) { + return card.card == event.card; + }).length == 0 + ); }, - content:function(){ - trigger.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } }, }, - spweiwu:{ - audio:2, - locked:false, - enable:'phaseUse', - usable:1, - viewAs:{ - name:'shunshou', - storage:{spweiwu:true}, + spweiwu: { + audio: 2, + locked: false, + enable: "phaseUse", + usable: 1, + viewAs: { + name: "shunshou", + storage: { spweiwu: true }, }, - filterCard:{color:'red'}, - position:'hes', - check:function(card){ - return 7-get.value(card); + filterCard: { color: "red" }, + position: "hes", + check: function (card) { + return 7 - get.value(card); }, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.spweiwu) return true; + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.spweiwu) return true; }, }, }, - tuogu:{ - audio:2, - trigger:{global:'die'}, - filter:function(event,player){ - return event.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; - }).length>0; + tuogu: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return ( + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return ( + info && + !info.juexingji && + !info.hiddenSkill && + !info.zhuSkill && + !info.charlotte && + !info.limited && + !info.dutySkill + ); + }).length > 0 + ); }, - logTarget:'player', - skillAnimation:true, - limited:true, - animationColor:'thunder', - content:function(){ - 'step 0' - player.awakenSkill('tuogu'); - var list=trigger.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; + logTarget: "player", + skillAnimation: true, + limited: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("tuogu"); + var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return ( + info && + !info.juexingji && + !info.hiddenSkill && + !info.zhuSkill && + !info.charlotte && + !info.limited && + !info.dutySkill + ); }); - if(list.length==1) event._result={control:list[0]}; - else trigger.player.chooseControl(list).set('prompt','选择令'+get.translation(player)+'获得一个技能').set('forceDie',true).set('ai',function(){ - return list.randomGet(); - }); - 'step 1' + if (list.length == 1) event._result = { control: list[0] }; + else + trigger.player + .chooseControl(list) + .set("prompt", "选择令" + get.translation(player) + "获得一个技能") + .set("forceDie", true) + .set("ai", function () { + return list.randomGet(); + }); + ("step 1"); player.addSkills(result.control); - game.broadcastAll(function(skill){ - var list=[skill];game.expandSkills(list); - for(var i of list){ - var info=lib.skill[i]; - if(!info) continue; - if(!info.audioname2) info.audioname2={}; - info.audioname2.caoshuang='tuogu'; + game.broadcastAll(function (skill) { + var list = [skill]; + game.expandSkills(list); + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.caoshuang = "tuogu"; } - },result.control); + }, result.control); }, }, - retuogu:{ - audio:'tuogu', - trigger:{global:'die'}, - filter:function(event,player){ - return event.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; - }).length>0; + retuogu: { + audio: "tuogu", + trigger: { global: "die" }, + filter: function (event, player) { + return ( + event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return ( + info && + !info.juexingji && + !info.hiddenSkill && + !info.zhuSkill && + !info.charlotte && + !info.limited && + !info.dutySkill + ); + }).length > 0 + ); }, - logTarget:'player', - check:function(event,player){ - var list=event.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; + logTarget: "player", + check: function (event, player) { + var list = event.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return ( + info && + !info.juexingji && + !info.hiddenSkill && + !info.zhuSkill && + !info.charlotte && + !info.limited && + !info.dutySkill + ); }); - var negSkill=list.some(function(skill){ - return get.skillRank(skill,'inout')<=0; + var negSkill = list.some(function (skill) { + return get.skillRank(skill, "inout") <= 0; }); - var att=get.sgnAttitude(event.player,player); - if(!player.storage.retuogu){ - if(negSkill&&att<0) return false; + var att = get.sgnAttitude(event.player, player); + if (!player.storage.retuogu) { + if (negSkill && att < 0) return false; return true; } - list.sort(function(a,b){ - return att*(get.skillRank(b,'inout')-get.skillRank(a,'inout')); + list.sort(function (a, b) { + return att * (get.skillRank(b, "inout") - get.skillRank(a, "inout")); })[0]; - return get.skillRank(list[0],'inout')>=get.skillRank(player.storage.retuogu,'inout'); + return get.skillRank(list[0], "inout") >= get.skillRank(player.storage.retuogu, "inout"); }, - content:function(){ - 'step 0' - var list=trigger.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ - var info=get.info(skill); - return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; + content: function () { + "step 0"; + var list = trigger.player.getStockSkills("仲村由理", "天下第一").filter(function (skill) { + var info = get.info(skill); + return ( + info && + !info.juexingji && + !info.hiddenSkill && + !info.zhuSkill && + !info.charlotte && + !info.limited && + !info.dutySkill + ); }); - if(list.length==1) event._result={control:list[0]}; - else trigger.player.chooseControl(list).set('prompt','选择令'+get.translation(player)+'获得一个技能').set('forceDie',true).set('ai',function(){ - var att=get.sgnAttitude(_status.event.getTrigger().player,player); - if(att==0) return list.randomGet(); - var listx=list.map(function(skill){ - return [skill,get.skillRank(skill,'inout')]; - }).sort(function(a,b){ - return att*(b[1]-a[1]); - }).slice(0,2); - var listx2=[0]; - if(Math.abs(listx[0][1]-listx[1][1])<=0.5&&Math.sign(listx[0][1])==Math.sign(listx[1][1])) listx2.push(1); - return listx[listx2.randomGet()][0]; - }); - 'step 1' - if(player.storage.retuogu) player.removeSkill(player.storage.retuogu); - player.storage.retuogu=result.control; - player.markSkill('retuogu'); + if (list.length == 1) event._result = { control: list[0] }; + else + trigger.player + .chooseControl(list) + .set("prompt", "选择令" + get.translation(player) + "获得一个技能") + .set("forceDie", true) + .set("ai", function () { + var att = get.sgnAttitude(_status.event.getTrigger().player, player); + if (att == 0) return list.randomGet(); + var listx = list + .map(function (skill) { + return [skill, get.skillRank(skill, "inout")]; + }) + .sort(function (a, b) { + return att * (b[1] - a[1]); + }) + .slice(0, 2); + var listx2 = [0]; + if ( + Math.abs(listx[0][1] - listx[1][1]) <= 0.5 && + Math.sign(listx[0][1]) == Math.sign(listx[1][1]) + ) + listx2.push(1); + return listx[listx2.randomGet()][0]; + }); + ("step 1"); + if (player.storage.retuogu) player.removeSkill(player.storage.retuogu); + player.storage.retuogu = result.control; + player.markSkill("retuogu"); player.addSkills(result.control); - game.broadcastAll(function(skill){ - var list=[skill]; + game.broadcastAll(function (skill) { + var list = [skill]; game.expandSkills(list); - for(var i of list){ - var info=lib.skill[i]; - if(!info) continue; - if(!info.audioname2) info.audioname2={}; - info.audioname2.caoshuang='tuogu'; + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.caoshuang = "tuogu"; } - },result.control); + }, result.control); }, - mark:true, - intro:{content:'当前托孤技能:$'}, + mark: true, + intro: { content: "当前托孤技能:$" }, }, - shanzhuan:{ - trigger:{source:'damageSource'}, - audio:2, - direct:true, - filter:function(event,player){ - return player!=event.player&&!event.player.isDisabledJudge()&&event.player.countCards('he')&&!event.player.countCards('j',card=>get.type(card.viewAs||card.name)=='delay'); + shanzhuan: { + trigger: { source: "damageSource" }, + audio: 2, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + !event.player.isDisabledJudge() && + event.player.countCards("he") && + !event.player.countCards("j", (card) => get.type(card.viewAs || card.name) == "delay") + ); }, - content:function(){ - 'step 0' - player.choosePlayerCard(trigger.player,'he',get.prompt('shanzhuan',trigger.player)).set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.target)>=0) return 0; - return get.buttonValue(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('shanzhuan',trigger.player); - var card=result.cards[0]; + content: function () { + "step 0"; + player + .choosePlayerCard(trigger.player, "he", get.prompt("shanzhuan", trigger.player)) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.target) >= 0) return 0; + return get.buttonValue(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("shanzhuan", trigger.player); + var card = result.cards[0]; trigger.player.$throw(card); game.delayx(); - if(get.type(card,false)=='delay') trigger.player.addJudge(card); - else trigger.player.addJudge({name:get.color(card,false)=='red'?'lebu':'bingliang'},result.cards); + if (get.type(card, false) == "delay") trigger.player.addJudge(card); + else + trigger.player.addJudge( + { name: get.color(card, false) == "red" ? "lebu" : "bingliang" }, + result.cards + ); } }, - group:'shanzhuan_draw', - subfrequent:['draw'], - subSkill:{ - draw:{ - audio:'shanzhuan', - trigger:{player:'phaseEnd'}, - frequent:true, - prompt:'是否发动【擅专】摸一张牌?', - filter:function(event,player){ - return !player.getHistory('sourceDamage').length; + group: "shanzhuan_draw", + subfrequent: ["draw"], + subSkill: { + draw: { + audio: "shanzhuan", + trigger: { player: "phaseEnd" }, + frequent: true, + prompt: "是否发动【擅专】摸一张牌?", + filter: function (event, player) { + return !player.getHistory("sourceDamage").length; }, - content:function(){ + content: function () { player.draw(); }, }, }, }, - olxingshen:{ - trigger:{player:'damageEnd'}, - frequent:true, - audio:'xingshen', - content:function(){ - 'step 0' - var next=player.draw(); - if(get.isLuckyStar(player)||Math.random()<0.5) next.num=2; - var num=player.countMark('olxingshen'); - if(num<6) player.addMark('olxingshen',Math.min(6-num,player.getDamagedHp()),false) + olxingshen: { + trigger: { player: "damageEnd" }, + frequent: true, + audio: "xingshen", + content: function () { + "step 0"; + var next = player.draw(); + if (get.isLuckyStar(player) || Math.random() < 0.5) next.num = 2; + var num = player.countMark("olxingshen"); + if (num < 6) + player.addMark("olxingshen", Math.min(6 - num, player.getDamagedHp()), false); }, - intro:{ - content:'下一次发动〖严教〗时多展示X张牌', + intro: { + content: "下一次发动〖严教〗时多展示X张牌", }, }, //张道陵 - zlhuji:{ - mod:{ - globalFrom:function(player,target,distance){ - return distance-1; + zlhuji: { + mod: { + globalFrom: function (player, target, distance) { + return distance - 1; }, }, - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - return player!=_status.currentPhase; + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player != _status.currentPhase; }, - content:function(){ - 'step 0' - var func=function(result){ - if(get.color(result)=='red') return 1; + content: function () { + "step 0"; + var func = function (result) { + if (get.color(result) == "red") return 1; return 0; }; - if(get.itemtype(trigger.source)!='player'||!player.canUse('sha',trigger.source,false)) func=function(result){ - return 0; + if ( + get.itemtype(trigger.source) != "player" || + !player.canUse("sha", trigger.source, false) + ) + func = function (result) { + return 0; + }; + else if (get.effect(trigger.source, { name: "sha" }, player, player) < 0) + func = function (result) { + if (get.color(result) == "red") return -1; + return 0; + }; + player.judge(func).judge2 = function (result) { + return result.color == "red" ? true : false; }; - else if(get.effect(trigger.source,{name:'sha'},player,player)<0) func=function(result){ - if(get.color(result)=='red') return -1; - return 0; - }; - player.judge(func).judge2=function(result){ - return result.color=='red'?true:false; - }; - 'step 1' - if(result.color=='red'&&get.itemtype(trigger.source)=='player'&&player.canUse('sha',trigger.source,false)){ - player.useCard({name:'sha',isCard:true},trigger.source,false,'noai'); + ("step 1"); + if ( + result.color == "red" && + get.itemtype(trigger.source) == "player" && + player.canUse("sha", trigger.source, false) + ) { + player.useCard({ name: "sha", isCard: true }, trigger.source, false, "noai"); } }, }, - zlshoufu:{ - enable:'phaseUse', - usable:1, - delay:false, - content:function(){ - 'step 0' + zlshoufu: { + enable: "phaseUse", + usable: 1, + delay: false, + content: function () { + "step 0"; player.draw(); - 'step 1' - var filterTarget=function(card,player,target){ - return target!=player&&!target.hasSkill('zlshoufu2'); + ("step 1"); + var filterTarget = function (card, player, target) { + return target != player && !target.hasSkill("zlshoufu2"); }; - if(!player.countCards('h')||!game.hasPlayer(function(current){ - return filterTarget(null,player,current); - })) event.finish(); - else player.chooseCardTarget({ - forced:true, - prompt:'将一张手牌作为“箓”置于其他角色的武将牌上', - filterTarget:filterTarget, - filterCard:true, - position:'h', - ai1:function(card){ - if(get.type(card,false)=='equip') return 1-get.value(card); - return 7-get.value(card); - }, - ai2:function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0) return -att; - return -att/get.distance(player,target,'absolute'); - }, - }); - 'step 2' - var target=result.targets[0]; - var cards=result.cards; - target.addToExpansion(cards,player,'give').gaintag.add('zlshoufu2'); - player.line(target,'green'); - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.12); - target.addSkill('zlshoufu2'); - 'step 3' + if ( + !player.countCards("h") || + !game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) + event.finish(); + else + player.chooseCardTarget({ + forced: true, + prompt: "将一张手牌作为“箓”置于其他角色的武将牌上", + filterTarget: filterTarget, + filterCard: true, + position: "h", + ai1: function (card) { + if (get.type(card, false) == "equip") return 1 - get.value(card); + return 7 - get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0) return -att; + return -att / get.distance(player, target, "absolute"); + }, + }); + ("step 2"); + var target = result.targets[0]; + var cards = result.cards; + target.addToExpansion(cards, player, "give").gaintag.add("zlshoufu2"); + player.line(target, "green"); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.12); + target.addSkill("zlshoufu2"); + ("step 3"); game.delayx(); }, - ai:{ - notemp:true, - order:1, - result:{ - player:function(player){ - if(game.hasPlayer(function(target){ - return target!=player&&!target.hasSkill('zlshoufu2')&&get.attitude(player,target)<0; - })||!game.hasPlayer(function(target){ - return target!=player&&!target.hasSkill('zlshoufu2')&&get.attitude(player,target)>0; - })) return 1; + ai: { + notemp: true, + order: 1, + result: { + player: function (player) { + if ( + game.hasPlayer(function (target) { + return ( + target != player && + !target.hasSkill("zlshoufu2") && + get.attitude(player, target) < 0 + ); + }) || + !game.hasPlayer(function (target) { + return ( + target != player && + !target.hasSkill("zlshoufu2") && + get.attitude(player, target) > 0 + ); + }) + ) + return 1; return 0; }, }, }, }, - zlshoufu2:{ - marktext:'箓', - intro:{ - content:'expansion', - markcount:'expansion', + zlshoufu2: { + marktext: "箓", + intro: { + content: "expansion", + markcount: "expansion", }, - charlotte:true, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + charlotte: true, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - mod:{ - cardEnabled:function(card,player){ - if(player.getExpansions('zlshoufu2').filter(function(magic){ - return get.type2(magic)==get.type2(card); - }).length) return false; + mod: { + cardEnabled: function (card, player) { + if ( + player.getExpansions("zlshoufu2").filter(function (magic) { + return get.type2(magic) == get.type2(card); + }).length + ) + return false; }, - cardRespondable:function(card,player){ - if(player.getExpansions('zlshoufu2').filter(function(magic){ - return get.type2(magic)==get.type2(card); - }).length) return false; + cardRespondable: function (card, player) { + if ( + player.getExpansions("zlshoufu2").filter(function (magic) { + return get.type2(magic) == get.type2(card); + }).length + ) + return false; }, - cardSavable:function(card,player){ - if(player.getExpansions('zlshoufu2').filter(function(magic){ - return get.type2(magic)==get.type2(card); - }).length) return false; + cardSavable: function (card, player) { + if ( + player.getExpansions("zlshoufu2").filter(function (magic) { + return get.type2(magic) == get.type2(card); + }).length + ) + return false; }, }, - trigger:{ - player:['damageEnd','loseAfter'], - global:'loseAsyncAfter', + trigger: { + player: ["damageEnd", "loseAfter"], + global: "loseAsyncAfter", }, - forced:true, - filter:function(event,player){ - var storage=player.getExpansions('zlshoufu2'); - if(!storage.length) return false; - if(event.name=='damage') return true; - if(event.type!='discard'||event.getlx===false||event.getParent('phaseDiscard').player!=player) return false; - var num=0,evt=event.getl(player); - if(!evt||!evt.cards2) return false; - for(var i of evt.cards2){ - if(storage.filter(function(magic){ - return get.type2(magic)==get.type2(i,event.hs.includes(i)?player:false); - }).length) num++; + forced: true, + filter: function (event, player) { + var storage = player.getExpansions("zlshoufu2"); + if (!storage.length) return false; + if (event.name == "damage") return true; + if ( + event.type != "discard" || + event.getlx === false || + event.getParent("phaseDiscard").player != player + ) + return false; + var num = 0, + evt = event.getl(player); + if (!evt || !evt.cards2) return false; + for (var i of evt.cards2) { + if ( + storage.filter(function (magic) { + return ( + get.type2(magic) == get.type2(i, event.hs.includes(i) ? player : false) + ); + }).length + ) + num++; } - return num>1; + return num > 1; }, - content:function(){ - player.removeSkill('zlshoufu2'); + content: function () { + player.removeSkill("zlshoufu2"); }, }, //蔡阳 - yinka:{ - trigger:{player:['drawBegin','judgeBegin']}, - direct:true, - filter:function(){ - return ui.cardPile.childNodes.length>0; + yinka: { + trigger: { player: ["drawBegin", "judgeBegin"] }, + direct: true, + filter: function () { + return ui.cardPile.childNodes.length > 0; }, - content:function(){ - 'step 0' - player.chooseButton(['印卡:请选择要置于牌堆'+(trigger.bottom?'底':'顶')+'的牌(先选择的在上)',Array.from(ui.cardPile.childNodes)],[1,trigger.num||1]); - 'step 1' - if(result.bool){ - while(result.links.length){ - if(trigger.bottom){ - var card=result.links.shift(); + content: function () { + "step 0"; + player.chooseButton( + [ + "印卡:请选择要置于牌堆" + + (trigger.bottom ? "底" : "顶") + + "的牌(先选择的在上)", + Array.from(ui.cardPile.childNodes), + ], + [1, trigger.num || 1] + ); + ("step 1"); + if (result.bool) { + while (result.links.length) { + if (trigger.bottom) { + var card = result.links.shift(); ui.cardPile.removeChild(card); ui.cardPile.appendChild(card); - } - else{ - var card=result.links.pop(); + } else { + var card = result.links.pop(); ui.cardPile.removeChild(card); - ui.cardPile.insertBefore(card,ui.cardPile.firstChild) + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); } } } }, - ai:{isLuckyStar:true}, + ai: { isLuckyStar: true }, }, //新王允 - xinlianji:{ - enable:'phaseUse', - audio:'wylianji', - usable:1, - check:function(card){ - return 5-get.value(card); + xinlianji: { + enable: "phaseUse", + audio: "wylianji", + usable: 1, + check: function (card) { + return 5 - get.value(card); }, - filterTarget:function(card,player,target){ - if(ui.selected.targets.length) return true; - return target!=player; + filterTarget: function (card, player, target) { + if (ui.selected.targets.length) return true; + return target != player; }, - filterCard:true, - selectTarget:2, - multitarget:true, - targetprompt:['打人','被打'], - content:function(){ - 'step 0' + filterCard: true, + selectTarget: 2, + multitarget: true, + targetprompt: ["打人", "被打"], + content: function () { + "step 0"; //player.addMark('xinlianji',1,false); - var card=get.cardPile2(function(card){ - return get.subtype(card)=='equip1'&&targets[0].hasUseTarget(card); + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1" && targets[0].hasUseTarget(card); }); - if(card){ - if(card.name=='qinggang'&&!lib.inpile.includes('qibaodao')){ + if (card) { + if (card.name == "qinggang" && !lib.inpile.includes("qibaodao")) { card.remove(); - card=game.createCard('qibaodao',card.suit,card.number); + card = game.createCard("qibaodao", card.suit, card.number); } - targets[0].chooseUseTarget(card,true,'nopopup','nothrow'); + targets[0].chooseUseTarget(card, true, "nopopup", "nothrow"); + } else { + player.chat("没有装备牌了吗"); + game.log("但是牌堆里已经没有装备牌了!"); } - else{ - player.chat('没有装备牌了吗'); - game.log('但是牌堆里已经没有装备牌了!'); - } - 'step 1' + ("step 1"); game.updateRoundNumber(); - targets[0].chooseToUse('对'+get.translation(targets[1])+'使用一张杀,或将装备区里的武器牌交给一名其他角色', - {name:'sha'}).set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',targets[1]).set('addCount',false); - 'step 2' - var cards=targets[0].getEquips(1); - if(!result.bool&&cards.length){ - event.cards=cards; - player.chooseTarget(true,'将'+get.translation(cards)+'交给一名其他角色').set('ai',function(target){ - var card=_status.event.getParent().cards; - return (target.hasSkillTag('nogain')?0:get.attitude(_status.event.player,target))*Math.max(0.1,target.getUseValue(cards[0])); - }); - } - else event.finish(); - 'step 3' - result.targets[0].gain(cards,result.targets[0],'give').giver=player; + targets[0] + .chooseToUse( + "对" + + get.translation(targets[1]) + + "使用一张杀,或将装备区里的武器牌交给一名其他角色", + { name: "sha" } + ) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", targets[1]) + .set("addCount", false); + ("step 2"); + var cards = targets[0].getEquips(1); + if (!result.bool && cards.length) { + event.cards = cards; + player + .chooseTarget(true, "将" + get.translation(cards) + "交给一名其他角色") + .set("ai", function (target) { + var card = _status.event.getParent().cards; + return ( + (target.hasSkillTag("nogain") + ? 0 + : get.attitude(_status.event.player, target)) * + Math.max(0.1, target.getUseValue(cards[0])) + ); + }); + } else event.finish(); + ("step 3"); + result.targets[0].gain(cards, result.targets[0], "give").giver = player; }, - ai:{ - order:4, - result:{ - target:function(player,target){ - if(ui.selected.targets.length){ - var pretarget=ui.selected.targets[0]; - if(pretarget.hasSha()&&pretarget.canUse({name:'sha'},target)) return get.effect(target,{name:'sha'},pretarget,target); + ai: { + order: 4, + result: { + target: function (player, target) { + if (ui.selected.targets.length) { + var pretarget = ui.selected.targets[0]; + if (pretarget.hasSha() && pretarget.canUse({ name: "sha" }, target)) + return get.effect(target, { name: "sha" }, pretarget, target); return Math.random(); } - if(!target.getEquip(1)){ - if(game.hasPlayer(function(current){ - return current!=target&&!current.hasSkillTag('nogain')&&get.attitude(current,target)>0; - })) return 3; + if (!target.getEquip(1)) { + if ( + game.hasPlayer(function (current) { + return ( + current != target && + !current.hasSkillTag("nogain") && + get.attitude(current, target) > 0 + ); + }) + ) + return 3; return -3; } - if(!game.hasPlayer(function(current){ - return current!=target&&!current.hasSkillTag('nogain')&&get.attitude(current,target)>0; - })) return -6; - return 4-get.value(target.getEquip(1)); + if ( + !game.hasPlayer(function (current) { + return ( + current != target && + !current.hasSkillTag("nogain") && + get.attitude(current, target) > 0 + ); + }) + ) + return -6; + return 4 - get.value(target.getEquip(1)); }, }, }, }, - xinmoucheng:{ - trigger:{player:'phaseZhunbeiBegin'}, - audio:'moucheng', - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'gray', - derivation:'xinjingong', - unique:true, - filter:function(event,player){ - return game.hasPlayer2(function(current){ - return current.getAllHistory('sourceDamage',function(evt){ - if(!evt.card||evt.card.name!='sha'||evt.getParent().type!='card') return false; - var evt2=evt.getParent(4); - return evt2&&evt2.name=='xinlianji'&&evt2.player==player; - }).length>0; + xinmoucheng: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "moucheng", + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + derivation: "xinjingong", + unique: true, + filter: function (event, player) { + return game.hasPlayer2(function (current) { + return ( + current.getAllHistory("sourceDamage", function (evt) { + if (!evt.card || evt.card.name != "sha" || evt.getParent().type != "card") + return false; + var evt2 = evt.getParent(4); + return evt2 && evt2.name == "xinlianji" && evt2.player == player; + }).length > 0 + ); }); }, - content:function(){ - player.awakenSkill('xinmoucheng'); - player.changeSkills(['xinjingong'],['xinlianji']); + content: function () { + player.awakenSkill("xinmoucheng"); + player.changeSkills(["xinjingong"], ["xinlianji"]); }, }, - xinjingong:{ - audio:'jingong', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return event.xinjingong_list&&player.countCards('hes',function(card){ - return card.name=='sha'||get.type(card)=='equip'; - }); + xinjingong: { + audio: "jingong", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + event.xinjingong_list && + player.countCards("hes", function (card) { + return card.name == "sha" || get.type(card) == "equip"; + }) + ); }, - onChooseToUse:function(event){ - if(!game.online){ - var evt=event.getParent(); - if(evt.name!='phaseUse') return; - if(!evt.xinjingong_list){ - var list=get.inpile('trick').randomGets(2); - if(Math.random()<0.5){ - list.push('wy_meirenji'); + onChooseToUse: function (event) { + if (!game.online) { + var evt = event.getParent(); + if (evt.name != "phaseUse") return; + if (!evt.xinjingong_list) { + var list = get.inpile("trick").randomGets(2); + if (Math.random() < 0.5) { + list.push("wy_meirenji"); + } else { + list.push("wy_xiaolicangdao"); } - else{ - list.push('wy_xiaolicangdao'); - } - evt.xinjingong_list=list; + evt.xinjingong_list = list; } - if(!event.xinjingong_list) event.set('xinjingong_list',evt.xinjingong_list); + if (!event.xinjingong_list) event.set("xinjingong_list", evt.xinjingong_list); } }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i of event.xinjingong_list) list.push(['锦囊','',i]); - return ui.create.dialog('矜功',[list,'vcard']); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of event.xinjingong_list) list.push(["锦囊", "", i]); + return ui.create.dialog("矜功", [list, "vcard"]); }, - filter:function(button,player){ - return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); + filter: function (button, player) { + return lib.filter.filterCard( + { name: button.link[2] }, + player, + _status.event.getParent() + ); }, - check:function(button){ - return _status.event.player.getUseValue({name:button.link[2]}); + check: function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'jingong', - popname:true, - position:'hes', - viewAs:{name:links[0][2]}, - check:function(card){ - return 6-get.value(card); + audio: "jingong", + popname: true, + position: "hes", + viewAs: { name: links[0][2] }, + check: function (card) { + return 6 - get.value(card); }, - filterCard:function(card){ - return card.name=='sha'||get.type(card)=='equip'; + filterCard: function (card) { + return card.name == "sha" || get.type(card) == "equip"; }, }; }, - prompt:function(links,player){ - return '将一张【杀】或装备牌当做'+get.translation(links[0][2])+'使用'; - } + prompt: function (links, player) { + return "将一张【杀】或装备牌当做" + get.translation(links[0][2]) + "使用"; + }, + }, + ai: { + order: 2, + result: { + player: 1, + }, }, - ai:{ - order:2, - result:{ - player:1 - } - } }, //孙邵 - bizheng:{ - trigger:{player:'phaseDrawEnd'}, - direct:true, - audio:2, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('bizheng'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(player.countCards('h')>player.maxHp) return 0; - var att=get.attitude(player,target); - if(att<=0||target.hasSkillTag('nogain')) return 0; - if(target.maxHp-target.countCards('h')>=2) return att; - return att/2; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('bizheng',target); + bizheng: { + trigger: { player: "phaseDrawEnd" }, + direct: true, + audio: 2, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("bizheng"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + if (player.countCards("h") > player.maxHp) return 0; + var att = get.attitude(player, target); + if (att <= 0 || target.hasSkillTag("nogain")) return 0; + if (target.maxHp - target.countCards("h") >= 2) return att; + return att / 2; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("bizheng", target); target.draw(2); - } - else event.finish(); - 'step 2' - if(player.countCards('h')>player.maxHp) player.chooseToDiscard(2,'he',true); - 'step 3' - if(target.countCards('h')>target.maxHp) target.chooseToDiscard(2,'he',true); + } else event.finish(); + ("step 2"); + if (player.countCards("h") > player.maxHp) player.chooseToDiscard(2, "he", true); + ("step 3"); + if (target.countCards("h") > target.maxHp) target.chooseToDiscard(2, "he", true); }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, - yidian:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - for(var i=0;i0; - })){ - player.chooseControl('cancel2').set('choiceList',[ - '摸两张牌,然后弃置一张牌', - '获得场上的一张牌,然后弃置一张牌', - ]).set('prompt',get.prompt('neifa')).set('ai',function(){ - if(game.hasPlayer(function(current){ - var att=get.attitude(player,current); - if(att==0) return false; - if(att<0) return current.countCards('e',function(card){ - return get.value(card,current)>5; - })>0; - return current.countCards('ej',function(card){ - return get.position(card)=='j'||get.value(card,current)<=0; - })>0; - })) return 1; - return 0; - }); + neifa: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + _status.noclearcountdown = true; + if ( + game.hasPlayer(function (current) { + return current.countGainableCards(player, "ej") > 0; + }) + ) { + player + .chooseControl("cancel2") + .set("choiceList", [ + "摸两张牌,然后弃置一张牌", + "获得场上的一张牌,然后弃置一张牌", + ]) + .set("prompt", get.prompt("neifa")) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + var att = get.attitude(player, current); + if (att == 0) return false; + if (att < 0) + return ( + current.countCards("e", function (card) { + return get.value(card, current) > 5; + }) > 0 + ); + return ( + current.countCards("ej", function (card) { + return ( + get.position(card) == "j" || get.value(card, current) <= 0 + ); + }) > 0 + ); + }) + ) + return 1; + return 0; + }); + } else { + player.chooseControl("ok", "cancel2").set("prompt", get.prompt2("neifa")); } - else{ - player.chooseControl('ok','cancel2').set('prompt',get.prompt2('neifa')); - } - 'step 1' - if(result.control=='cancel2'){ + ("step 1"); + if (result.control == "cancel2") { delete _status.noclearcountdown; - if(!_status.noclearcountdown){ + if (!_status.noclearcountdown) { game.stopCountChoose(); } event.finish(); return; - } - else if(result.index==1){ - player.chooseTarget('请选择一名角色,获得其装备区或判定区内的一张牌',true,function(card,player,target){ - return target.countGainableCards(player,'ej')>0; - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att>0&&target.countCards('ej',function(card){ - return get.position(card)=='j'||get.value(card,target)<=0; - })) return 2*att; - else if(att<0&&target.countCards('e',function(card){ - return get.value(card,target)>5; - })) return -att; - return -1; - }); - } - else{ + } else if (result.index == 1) { + player + .chooseTarget( + "请选择一名角色,获得其装备区或判定区内的一张牌", + true, + function (card, player, target) { + return target.countGainableCards(player, "ej") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + att > 0 && + target.countCards("ej", function (card) { + return get.position(card) == "j" || get.value(card, target) <= 0; + }) + ) + return 2 * att; + else if ( + att < 0 && + target.countCards("e", function (card) { + return get.value(card, target) > 5; + }) + ) + return -att; + return -1; + }); + } else { delete _status.noclearcountdown; - if(!_status.noclearcountdown){ + if (!_status.noclearcountdown) { game.stopCountChoose(); } - player.logSkill('neifa'); + player.logSkill("neifa"); player.draw(2); - event.goto(3) + event.goto(3); } - 'step 2' + ("step 2"); delete _status.noclearcountdown; - if(!_status.noclearcountdown){ + if (!_status.noclearcountdown) { game.stopCountChoose(); } - if(result.bool){ - var target=result.targets[0]; - player.logSkill('neifa',target); - player.gainPlayerCard(target,'ej',true); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("neifa", target); + player.gainPlayerCard(target, "ej", true); } - 'step 3' - player.chooseToDiscard(true,'he').set('ai',function(cardx){ - var player=_status.event.player; - var num=0; - var hs=player.getCards('h'); - var muniu=player.getEquip('muniu'); - var subs=[]; - if(muniu&&muniu.cards) hs=hs.concat(muniu.cards); - if(get.type(cardx)=='basic'){ - var shas=hs.filter(function(card){ - return card!=cardx&&get.name(card,player)=='sha'&&player.hasValueTarget(card); + ("step 3"); + player.chooseToDiscard(true, "he").set("ai", function (cardx) { + var player = _status.event.player; + var num = 0; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + var subs = []; + if (muniu && muniu.cards) hs = hs.concat(muniu.cards); + if (get.type(cardx) == "basic") { + var shas = hs.filter(function (card) { + return ( + card != cardx && + get.name(card, player) == "sha" && + player.hasValueTarget(card) + ); }); - var numx=player.countCards('h',function(card){ - return get.type(card,player)!='basic'; + var numx = player.countCards("h", function (card) { + return get.type(card, player) != "basic"; }); - num+=Math.min(numx,Math.max(0,shas.length-player.getCardUsable('sha')))*0.7; - num+=Math.min(player.getCardUsable('sha')+numx,shas.filter(function(card){ - return game.countPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })>1; - }).length)*1.1; - var taos=Math.min(player.maxHp-player.hp,hs.filter(function(card){ - return cardx!=card&&get.name(card,player)=='tao'; - }).length); - num+=taos*player.getDamagedHp()*1.2; + num += + Math.min(numx, Math.max(0, shas.length - player.getCardUsable("sha"))) * 0.7; + num += + Math.min( + player.getCardUsable("sha") + numx, + shas.filter(function (card) { + return ( + game.countPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) > 1 + ); + }).length + ) * 1.1; + var taos = Math.min( + player.maxHp - player.hp, + hs.filter(function (card) { + return cardx != card && get.name(card, player) == "tao"; + }).length + ); + num += taos * player.getDamagedHp() * 1.2; + } else { + var numx = Math.sqrt( + Math.min( + 5, + player.countCards("h", function (card) { + return get.type(card, player) == "basic"; + }) + ) + ); + if (numx) + num += + (numx * + Math.min( + 2, + hs.filter(function (card) { + if ( + card == cardx || + get.type(card) != "equip" || + !player.hasUseTarget(card) + ) + return false; + subs.add(get.subtype(card)); + return true; + }).length + ) * + (2.5 + player.countCards("e"))) / + 2.5; + num += + hs.filter(function (card) { + return ( + card != cardx && + get.type2(card) == "trick" && + player.hasValueTarget(card) + ); + }).length * 0.65; } - else{ - var numx=Math.sqrt(Math.min(5,player.countCards('h',function(card){ - return get.type(card,player)=='basic'; - }))); - if(numx) num+=numx*Math.min(2,hs.filter(function(card){ - if(card==cardx||get.type(card)!='equip'||!player.hasUseTarget(card)) return false; - subs.add(get.subtype(card)); - return true; - }).length)*(2.5+player.countCards('e'))/2.5; - num+=hs.filter(function(card){ - return card!=cardx&&get.type2(card)=='trick'&&player.hasValueTarget(card); - }).length*0.65; - } - if(get.position(cardx)=='e'&&cardx.name!='muniu'&&subs.includes(get.subtype(card))) num+=3; - return num*1.5-get.value(cardx); + if ( + get.position(cardx) == "e" && + cardx.name != "muniu" && + subs.includes(get.subtype(card)) + ) + num += 3; + return num * 1.5 - get.value(cardx); }); - 'step 4' - if(result.bool&&result.cards&&result.cards.length){ - var name=get.type(result.cards[0])=='basic'?'neifa_basic':'neifa_nobasic'; + ("step 4"); + if (result.bool && result.cards && result.cards.length) { + var name = get.type(result.cards[0]) == "basic" ? "neifa_basic" : "neifa_nobasic"; player.addTempSkill(name); - var num=Math.min(5,player.countCards('h',function(cardx){ - return (name=='neifa_basic')!=(get.type(cardx,player)=='basic') - })); - if(num>0) player.addMark(name,num,false); - else player.storage[name]=0; + var num = Math.min( + 5, + player.countCards("h", function (cardx) { + return (name == "neifa_basic") != (get.type(cardx, player) == "basic"); + }) + ); + if (num > 0) player.addMark(name, num, false); + else player.storage[name] = 0; } }, - ai:{ - threaten:3, + ai: { + threaten: 3, }, }, - neifa_basic:{ - mark:true, - marktext:'伐', - onremove:true, - intro:{ - name:'内伐 - 基本牌', - content:'本回合内不能使用锦囊牌和装备牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。', + neifa_basic: { + mark: true, + marktext: "伐", + onremove: true, + intro: { + name: "内伐 - 基本牌", + content: + "本回合内不能使用锦囊牌和装备牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。", }, - mod:{ - cardEnabled:function(card,player){ - if(['trick','equip'].includes(get.type(card,'trick'))) return false; + mod: { + cardEnabled: function (card, player) { + if (["trick", "equip"].includes(get.type(card, "trick"))) return false; }, - cardSavable:function(card,player){ - if(['trick','equip'].includes(get.type(card,'trick'))) return false; + cardSavable: function (card, player) { + if (["trick", "equip"].includes(get.type(card, "trick"))) return false; }, - cardUsable:function(card,player,num){ - if(card.name=='sha'){ - return num+player.countMark('neifa_basic'); + cardUsable: function (card, player, num) { + if (card.name == "sha") { + return num + player.countMark("neifa_basic"); } }, }, - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current); + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('neifa'),'为'+get.translation(trigger.card)+'额外指定一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("neifa"), + "为" + get.translation(trigger.card) + "额外指定一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - player.logSkill('neifa',event.targets); + ("step 2"); + player.logSkill("neifa", event.targets); trigger.targets.addArray(event.targets); }, }, - neifa_nobasic:{ - trigger:{player:'useCard2'}, - direct:true, - mark:true, - marktext:'伐', - onremove:true, - mod:{ - cardEnabled:function(card,player){ - if(get.type(card)=='basic') return false; + neifa_nobasic: { + trigger: { player: "useCard2" }, + direct: true, + mark: true, + marktext: "伐", + onremove: true, + mod: { + cardEnabled: function (card, player) { + if (get.type(card) == "basic") return false; }, - cardSavable:function(card,player){ - if(get.type(card)=='basic') return false; + cardSavable: function (card, player) { + if (get.type(card) == "basic") return false; }, }, - intro:{ - name:'内伐 - 非基本牌', - content:'本回合内不能使用基本牌,使用普通锦囊牌选择目标时可以增加或减少一个目标,且本回合的出牌阶段内前两次使用装备牌时摸#张牌。' + intro: { + name: "内伐 - 非基本牌", + content: + "本回合内不能使用基本牌,使用普通锦囊牌选择目标时可以增加或减少一个目标,且本回合的出牌阶段内前两次使用装备牌时摸#张牌。", }, - filter:function(event,player){ - if(get.type(event.card)!='trick') return false; - if(event.targets&&event.targets.length>0) return true; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })){ + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (event.targets && event.targets.length > 0) return true; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加或减少一个目标' - player.chooseTarget(get.prompt('neifa'),function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return true; - return lib.filter.targetEnabled2(_status.event.card,player,target)&&lib.filter.targetInRange(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player)*(_status.event.targets.includes(target)?-1:1); - }).set('targets',trigger.targets).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; + player + .chooseTarget(get.prompt("neifa"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return true; + return ( + lib.filter.targetEnabled2(_status.event.card, player, target) && + lib.filter.targetInRange(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return ( + get.effect(target, trigger.card, player, player) * + (_status.event.targets.includes(target) ? -1 : 1) + ); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('neifa',event.targets); - if(trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("neifa", event.targets); + if (trigger.targets.includes(event.targets[0])) + trigger.targets.removeArray(event.targets); else trigger.targets.addArray(event.targets); } }, - group:'neifa_use', - ai:{ - reverseOrder:true, - skillTagFilter:function(player){ - if(player.storage.counttrigger&&player.storage.counttrigger.neifa_use>=2) return false; + group: "neifa_use", + ai: { + reverseOrder: true, + skillTagFilter: function (player) { + if (player.storage.counttrigger && player.storage.counttrigger.neifa_use >= 2) + return false; }, - effect:{ - target:function(card,player,target){ - if((!player.storage.counttrigger||!player.storage.counttrigger.neifa_use||player.storage.counttrigger.neifa_use<2)&&player==target&&get.type(card)=='equip') return [1,3]; + effect: { + target: function (card, player, target) { + if ( + (!player.storage.counttrigger || + !player.storage.counttrigger.neifa_use || + player.storage.counttrigger.neifa_use < 2) && + player == target && + get.type(card) == "equip" + ) + return [1, 3]; }, }, }, }, - neifa_use:{ - audio:'neifa', - usable:2, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - return get.type(event.card)=='equip'&&player.countMark('neifa_nobasic')>0; + neifa_use: { + audio: "neifa", + usable: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + return get.type(event.card) == "equip" && player.countMark("neifa_nobasic") > 0; }, - content:function(){ - player.draw(player.countMark('neifa_nobasic')); + content: function () { + player.draw(player.countMark("neifa_nobasic")); }, }, //许靖 - yuxu:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; + yuxu: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; return true; }, - direct:true, - content:function(){ - 'step 0' - var draw=!player.hasMark('yuxu_used'); - if(draw) player.chooseBool(get.prompt2('yuxu')).set('ai',()=>1); + direct: true, + content: function () { + "step 0"; + var draw = !player.hasMark("yuxu_used"); + if (draw) player.chooseBool(get.prompt2("yuxu")).set("ai", () => 1); else event.goto(2); - 'step 1' - if(result.bool){ - player.logSkill('yuxu'); + ("step 1"); + if (result.bool) { + player.logSkill("yuxu"); player.draw(); - player.addMark('yuxu_used',1,false); - player.addTempSkill('yuxu_used','phaseUseAfter'); + player.addMark("yuxu_used", 1, false); + player.addTempSkill("yuxu_used", "phaseUseAfter"); } event.finish(); - 'step 2' - player.logSkill('yuxu'); - player.removeMark('yuxu_used',player.countMark('yuxu_used'),false); - player.chooseToDiscard('he',true); + ("step 2"); + player.logSkill("yuxu"); + player.removeMark("yuxu_used", player.countMark("yuxu_used"), false); + player.chooseToDiscard("he", true); + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + }, }, - subSkill:{ - used:{ - charlotte:true, - onremove:true - } - } }, - xjshijian:{ - audio:2, - trigger:{global:'useCardAfter'}, - direct:true, - filter:function(event,player){ - if(event.player==player) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=event.player) return false; - return event.player.getHistory('useCard',function(evtt){ - return evtt.getParent('phaseUse')==evt; - }).indexOf(event)==1&&player.countCards('he')>0; + xjshijian: { + audio: 2, + trigger: { global: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (event.player == player) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + return ( + event.player + .getHistory("useCard", function (evtt) { + return evtt.getParent("phaseUse") == evt; + }) + .indexOf(event) == 1 && player.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - var next=player.chooseToDiscard('he',get.prompt('xjshijian',trigger.player),'弃置一张牌并令其获得技能〖誉虚〗至回合结束'); - next.set('logSkill',['xjshijian',trigger.player]); - next.set('check',get.attitude(player,trigger.player)>0&&trigger.player.countCards('h')>2); - next.ai=function(card){ - if(_status.event.check) return 5-get.value(card); + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + get.prompt("xjshijian", trigger.player), + "弃置一张牌并令其获得技能〖誉虚〗至回合结束" + ); + next.set("logSkill", ["xjshijian", trigger.player]); + next.set( + "check", + get.attitude(player, trigger.player) > 0 && trigger.player.countCards("h") > 2 + ); + next.ai = function (card) { + if (_status.event.check) return 5 - get.value(card); return -1; }; - 'step 1' - if(result.bool) trigger.player.addTempSkills('yuxu'); + ("step 1"); + if (result.bool) trigger.player.addTempSkills("yuxu"); }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, //新1v1 - yanhuo:{ - audio:2, - trigger:{player:'die'}, - forceDie:true, - filter:function(event,player){ - return player.countCards('he')>0; + yanhuo: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - direct:true, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('yanhuo'),function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'he')>0 - }).set('forceDie',true).ai=function(target){ - return -target.countCards('he')*get.attitude(player,target); + direct: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yanhuo"), function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }) + .set("forceDie", true).ai = function (target) { + return -target.countCards("he") * get.attitude(player, target); }; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('yanhuo',target); - event.count=player.countCards('he'); - } - else event.finish() - 'step 2' - if(target.countDiscardableCards(player,'he')){ + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("yanhuo", target); + event.count = player.countCards("he"); + } else event.finish(); + ("step 2"); + if (target.countDiscardableCards(player, "he")) { player.line(target); - player.discardPlayerCard(target,'he',true).set('forceDie',true); + player.discardPlayerCard(target, "he", true).set("forceDie", true); event.count--; - if(event.count) event.redo(); + if (event.count) event.redo(); } }, }, - mouzhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + mouzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - target.chooseCard('h','交给'+get.translation(player)+'一张手牌',true); - 'step 1' - if(result.bool) target.give(result.cards,player); - 'step 2' - if(player.countCards('h')<=target.countCards('h')){ + content: function () { + "step 0"; + target.chooseCard("h", "交给" + get.translation(player) + "一张手牌", true); + ("step 1"); + if (result.bool) target.give(result.cards, player); + ("step 2"); + if (player.countCards("h") <= target.countCards("h")) { event.finish(); return; } - var list=[]; - if(target.canUse('sha',player,false)) list.push('sha'); - if(target.canUse('juedou',player,false)) list.push('juedou'); - if(!list.length) event.finish(); - else if(list.length==1) event._result={control:list[0]}; - else target.chooseControl(list).set('prompt','对'+get.translation(player)+'使用一张【杀】或【决斗】。').ai=function(){ - return get.effect(player,{name:'sha'},target,target)>=get.effect(player,{name:'juedou'},target,target)?'sha':'juedou'; - }; - 'step 3' - target.useCard({name:result.control,isCard:true},player,'noai'); + var list = []; + if (target.canUse("sha", player, false)) list.push("sha"); + if (target.canUse("juedou", player, false)) list.push("juedou"); + if (!list.length) event.finish(); + else if (list.length == 1) event._result = { control: list[0] }; + else + target + .chooseControl(list) + .set("prompt", "对" + get.translation(player) + "使用一张【杀】或【决斗】。").ai = + function () { + return get.effect(player, { name: "sha" }, target, target) >= + get.effect(player, { name: "juedou" }, target, target) + ? "sha" + : "juedou"; + }; + ("step 3"); + target.useCard({ name: result.control, isCard: true }, player, "noai"); }, - ai:{ - order:7, - result:{ - target:-1.2, - player:function(player,target){ - if(target.countCards('h')-player.countCards('h')>1) return 1; - if(get.damageEffect(target,player,player,player)>0) return 1; - if(player.hp>3||player.countCards('h','sha')&&player.countCards('h','shan')) return 0; - if(player.hp>2) return -1.1; + ai: { + order: 7, + result: { + target: -1.2, + player: function (player, target) { + if (target.countCards("h") - player.countCards("h") > 1) return 1; + if (get.damageEffect(target, player, player, player) > 0) return 1; + if ( + player.hp > 3 || + (player.countCards("h", "sha") && player.countCards("h", "shan")) + ) + return 0; + if (player.hp > 2) return -1.1; return -2; }, }, }, }, - niluan:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player!=player&&(event.player.hp>player.hp||event.player.getHistory('useCard',function(card){ - return card.card.name=='sha'; - }).length>0); + niluan: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player != player && + (event.player.hp > player.hp || + event.player.getHistory("useCard", function (card) { + return card.card.name == "sha"; + }).length > 0) + ); }, - direct:true, - content:function(){ - var next=player.chooseToUse(); - next.logSkill='niluan'; - next.set('openskilldialog',get.prompt2('niluan')); - next.set('norestore',true); - next.set('_backupevent','niluanx'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + direct: true, + content: function () { + var next = player.chooseToUse(); + next.logSkill = "niluan"; + next.set("openskilldialog", get.prompt2("niluan")); + next.set("norestore", true); + next.set("_backupevent", "niluanx"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('niluanx'); + next.backup("niluanx"); }, }, - niluanx:{ - viewAs:{name:'sha'}, - filterCard:{color:'black'}, - position:'hes', - selectCard:1, - check:function(card){return 5-get.value(card)}, + niluanx: { + viewAs: { name: "sha" }, + filterCard: { color: "black" }, + position: "hes", + selectCard: 1, + check: function (card) { + return 5 - get.value(card); + }, }, - cuorui:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + cuorui: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return player.maxHp>0&&!get.is.single()&&(event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return ( + player.maxHp > 0 && + !get.is.single() && + (event.name != "phase" || game.phaseNumber == 0) + ); }, - content:function(){ - player.draw(Math.min(5,player.maxHp),false); + content: function () { + player.draw(Math.min(5, player.maxHp), false); }, - group:'cuorui_nojudge', - subSkill:{ - nojudge:{ - trigger:{ - player:'phaseJudgeBefore', + group: "cuorui_nojudge", + subSkill: { + nojudge: { + trigger: { + player: "phaseJudgeBefore", }, - forced:true, - audio:'cuorui', - filter:function(event,player){ - return !player.storage.cuorui&&(get.is.single()||player.countCards('j')); + forced: true, + audio: "cuorui", + filter: function (event, player) { + return !player.storage.cuorui && (get.is.single() || player.countCards("j")); }, - content:function(){ - player.storage.cuorui=true; + content: function () { + player.storage.cuorui = true; trigger.cancel(); - game.log(player,'跳过了','#g判定阶段'); + game.log(player, "跳过了", "#g判定阶段"); }, }, }, }, - liewei:{ - audio:2, - trigger:{source:'dieAfter'}, - frequent:true, - content:function(){ + liewei: { + audio: 2, + trigger: { source: "dieAfter" }, + frequent: true, + content: function () { player.draw(3); }, }, //蒋干 - weicheng:{ - audio:2, - trigger:{ - global:'gainAfter', - player:'loseAsyncAfter', + weicheng: { + audio: 2, + trigger: { + global: "gainAfter", + player: "loseAsyncAfter", }, //forced:true, - frequent:true, - filter:function(event,player){ - if(player.getHp()<=player.countCards('h')) return false; - if(event.name=='loseAsync'){ - if(event.type!='gain') return false; - var cards=event.getl(player).hs; - return game.hasPlayer(function(current){ - if(current==player) return false; - var cardsx=event.getg(current); - for(var i of cardsx){ - if(cards.includes(i)) return true; + frequent: true, + filter: function (event, player) { + if (player.getHp() <= player.countCards("h")) return false; + if (event.name == "loseAsync") { + if (event.type != "gain") return false; + var cards = event.getl(player).hs; + return game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) return true; } return false; }); } - if(event.player==player) return false; - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length>0; + if (event.player == player) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; }, - preHidden:true, - content:function(){ + preHidden: true, + content: function () { player.draw(); }, }, - daoshu:{ - audio:2, - enable:'phaseUse', - filterTarget:function(c,p,t){ - return t!=p&&t.countGainableCards(p,'h')>0; + daoshu: { + audio: 2, + enable: "phaseUse", + filterTarget: function (c, p, t) { + return t != p && t.countGainableCards(p, "h") > 0; }, - filter:function(e,p){ - return !p.hasSkill('daoshu_used') + filter: function (e, p) { + return !p.hasSkill("daoshu_used"); }, - content:function(){ - 'step 0' - player.chooseControl(lib.suit).set('prompt','请选择一个花色').ai=function(){return lib.suit.randomGet()}; - 'step 1' - event.suit=result.control; - player.popup(event.suit+2); - game.log(player,'选择了',event.suit+2); - player.gainPlayerCard(target,true,'h','visibleMove'); - 'step 2' - if(result.bool){ - var suit2=get.suit(result.cards[0]); - if(suit2==event.suit){ + content: function () { + "step 0"; + player.chooseControl(lib.suit).set("prompt", "请选择一个花色").ai = function () { + return lib.suit.randomGet(); + }; + ("step 1"); + event.suit = result.control; + player.popup(event.suit + 2); + game.log(player, "选择了", event.suit + 2); + player.gainPlayerCard(target, true, "h", "visibleMove"); + ("step 2"); + if (result.bool) { + var suit2 = get.suit(result.cards[0]); + if (suit2 == event.suit) { target.damage(); event.finish(); - } - else{ - player.addTempSkill('daoshu_used','phaseUseEnd'); - if(player.countCards('h',function(card){return get.suit(card)!=suit2})==0){ + } else { + player.addTempSkill("daoshu_used", "phaseUseEnd"); + if ( + player.countCards("h", function (card) { + return get.suit(card) != suit2; + }) == 0 + ) { player.showHandcards(); event.finish(); - } - else player.chooseCard('h',true,function(card){ - return get.suit(card)!=_status.event.suit2 - },'交给'+get.translation(target)+'一张不为'+get.translation(suit2)+'花色的牌').set('suit2',suit2); + } else + player + .chooseCard( + "h", + true, + function (card) { + return get.suit(card) != _status.event.suit2; + }, + "交给" + + get.translation(target) + + "一张不为" + + get.translation(suit2) + + "花色的牌" + ) + .set("suit2", suit2); } - } - else event.finish(); - 'step 3' - player.give(result.cards,target,true); + } else event.finish(); + ("step 3"); + player.give(result.cards, target, true); }, - ai:{ - order:1, - result:{ - target:-1, + ai: { + order: 1, + result: { + target: -1, }, }, - subSkill:{ - used:{sub:true}, + subSkill: { + used: { sub: true }, }, }, //统率三军诸葛瑾和文聘 - "zhenwei_three":{ - global:"zhenwei_three_others", - subSkill:{ - others:{ - mod:{ - globalTo:function (from,to,distance){ - if(from.side!=to.side&&game.hasPlayer(function(current){ - return current!=to&¤t.side==to.side&¤t.hasSkill('zhenwei_three'); - }))return distance+1; + zhenwei_three: { + global: "zhenwei_three_others", + subSkill: { + others: { + mod: { + globalTo: function (from, to, distance) { + if ( + from.side != to.side && + game.hasPlayer(function (current) { + return ( + current != to && + current.side == to.side && + current.hasSkill("zhenwei_three") + ); + }) + ) + return distance + 1; }, }, - sub:true, + sub: true, }, }, }, - "huanshi_three":{ - audio:"huanshi", - trigger:{ - global:"judge", + huanshi_three: { + audio: "huanshi", + trigger: { + global: "judge", }, - filter:function (event,player){ - return player.countCards('hes')>0&&player.side==event.player.side; + filter: function (event, player) { + return player.countCards("hes") > 0 && player.side == event.player.side; }, - direct:true, - content:function (){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('huanshi_three'),'hes',function(card){ - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result-get.value(card)/2; - } - else{ - return -result-get.value(card)/2; - } - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight','huanshi_three','noOrdering'); - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("huanshi_three"), + "hes", + function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; + } + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "huanshi_three", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); game.delay(2); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, + ai: { + rejudge: true, + tag: { + rejudge: 1, }, }, }, //变权移植 - wanwei:{ - trigger:{target:['rewriteGainResult','rewriteDiscardResult']}, - direct:true, - preHidden:true, - filter:function(event,player){ - return event.player!=player; + wanwei: { + trigger: { target: ["rewriteGainResult", "rewriteDiscardResult"] }, + direct: true, + preHidden: true, + filter: function (event, player) { + return event.player != player; }, - audio:2, - content:function(){ - 'step 0' - var prompt='即将失去'+get.translation(trigger.result.cards)+',是否发动【挽危】?'; - var next=player.choosePlayerCard(player,prompt,trigger.position); - next.set('ai',function(button){ - return 20-get.value(button.link); + audio: 2, + content: function () { + "step 0"; + var prompt = "即将失去" + get.translation(trigger.result.cards) + ",是否发动【挽危】?"; + var next = player.choosePlayerCard(player, prompt, trigger.position); + next.set("ai", function (button) { + return 20 - get.value(button.link); }); - next.filterButton=trigger.filterButton; - next.selectButton=trigger.result.cards.length; - next.setHiddenSkill('wanwei'); - 'step 1' - if(result.bool){ - player.logSkill('wanwei'); - trigger.result.cards=result.links.slice(0); - trigger.result.links=result.links.slice(0); - trigger.cards=result.links.slice(0); + next.filterButton = trigger.filterButton; + next.selectButton = trigger.result.cards.length; + next.setHiddenSkill("wanwei"); + ("step 1"); + if (result.bool) { + player.logSkill("wanwei"); + trigger.result.cards = result.links.slice(0); + trigger.result.links = result.links.slice(0); + trigger.cards = result.links.slice(0); trigger.untrigger(); } - } + }, }, - gzjili:{ - mod:{ - aiOrder:function(player,card,num){ - if(player.isPhaseUsing()&&get.subtype(card)=='equip1'&&!get.cardtag(card,'gifts')){ - var range0=player.getAttackRange(); - var range=0; - var info=get.info(card); - if(info&&info.distance&&info.distance.attackFrom){ - range-=info.distance.attackFrom; + gzjili: { + mod: { + aiOrder: function (player, card, num) { + if ( + player.isPhaseUsing() && + get.subtype(card) == "equip1" && + !get.cardtag(card, "gifts") + ) { + var range0 = player.getAttackRange(); + var range = 0; + var info = get.info(card); + if (info && info.distance && info.distance.attackFrom) { + range -= info.distance.attackFrom; } - if(player.getEquip(1)){ - var num=0; - var info=get.info(player.getEquip(1)); - if(info&&info.distance&&info.distance.attackFrom){ - num-=info.distance.attackFrom; + if (player.getEquip(1)) { + var num = 0; + var info = get.info(player.getEquip(1)); + if (info && info.distance && info.distance.attackFrom) { + num -= info.distance.attackFrom; } - range0-=num; + range0 -= num; } - range0+=range; - if(range0==(player.getHistory('useCard').length+player.getHistory('respond').length+2)&&player.countCards('h',function(cardx){ - return get.subtype(cardx)!='equip1'&&player.getUseValue(cardx)>0; - })) return num+10; + range0 += range; + if ( + range0 == + player.getHistory("useCard").length + + player.getHistory("respond").length + + 2 && + player.countCards("h", function (cardx) { + return get.subtype(cardx) != "equip1" && player.getUseValue(cardx) > 0; + }) + ) + return num + 10; } }, }, - trigger:{player:['useCard','respond']}, - frequent:true, - locked:false, - preHidden:true, - filter:function(event,player){ - return player.getHistory('useCard').length+player.getHistory('respond').length==player.getAttackRange(); + trigger: { player: ["useCard", "respond"] }, + frequent: true, + locked: false, + preHidden: true, + filter: function (event, player) { + return ( + player.getHistory("useCard").length + player.getHistory("respond").length == + player.getAttackRange() + ); }, - audio:2, - content:function(){ - player.draw(player.getHistory('useCard').length+player.getHistory('respond').length); + audio: 2, + content: function () { + player.draw(player.getHistory("useCard").length + player.getHistory("respond").length); }, - ai:{ - threaten:1.8, - effect:{ - target:function(card,player,target,current){ - let used=(target.getHistory('useCard').length+target.getHistory('respond').length); - if(get.subtype(card)=='equip1'&&!get.cardtag(card,'gifts')){ - if(player!=target||!player.isPhaseUsing()) return; - let range0=player.getAttackRange(); - let range=0; - let info=get.info(card); - if(info&&info.distance&&info.distance.attackFrom){ - range-=info.distance.attackFrom; + ai: { + threaten: 1.8, + effect: { + target: function (card, player, target, current) { + let used = + target.getHistory("useCard").length + target.getHistory("respond").length; + if (get.subtype(card) == "equip1" && !get.cardtag(card, "gifts")) { + if (player != target || !player.isPhaseUsing()) return; + let range0 = player.getAttackRange(); + let range = 0; + let info = get.info(card); + if (info && info.distance && info.distance.attackFrom) { + range -= info.distance.attackFrom; } - if(player.getEquip(1)){ - let num=0; - let info=get.info(player.getEquip(1)); - if(info&&info.distance&&info.distance.attackFrom){ - num-=info.distance.attackFrom; + if (player.getEquip(1)) { + let num = 0; + let info = get.info(player.getEquip(1)); + if (info && info.distance && info.distance.attackFrom) { + num -= info.distance.attackFrom; } - range0-=num; + range0 -= num; } - range0+=range; - let delta=range0-used; - if(delta<0) return; - let num=player.countCards('h',function(card){ - return (get.cardtag(card,'gifts')||get.subtype(card)!='equip1')&&player.getUseValue(card)>0; + range0 += range; + let delta = range0 - used; + if (delta < 0) return; + let num = player.countCards("h", function (card) { + return ( + (get.cardtag(card, "gifts") || get.subtype(card) != "equip1") && + player.getUseValue(card) > 0 + ); }); - if(delta==2&&num>0) return [1,3]; - if(num>=delta) return 'zeroplayertarget'; - } - else if(get.tag(card,'respondShan')>0){ - if(current<0&&used==target.getAttackRange()-1){ - if(card.name==='sha'){ - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))) return; - } - else if(!target.mayHaveShan(player)) return 0.9; - return [1,(used+1)/2]; + if (delta == 2 && num > 0) return [1, 3]; + if (num >= delta) return "zeroplayertarget"; + } else if (get.tag(card, "respondShan") > 0) { + if (current < 0 && used == target.getAttackRange() - 1) { + if (card.name === "sha") { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) + ) + return; + } else if (!target.mayHaveShan(player)) return 0.9; + return [1, (used + 1) / 2]; } - } - else if(get.tag(card,'respondSha')>0){ - if(current<0&&used==target.getAttackRange()-1&&target.mayHaveSha(player)) return [1,(used+1)/2]; + } else if (get.tag(card, "respondSha") > 0) { + if ( + current < 0 && + used == target.getAttackRange() - 1 && + target.mayHaveSha(player) + ) + return [1, (used + 1) / 2]; } }, }, - } + }, }, //新服曹笨 - xinshanjia:{ - group:["xinshanjia_count"], - locked:false, - mod:{ - aiValue:function(player,card,num){ - if((player.storage.xinshanjia||0)<3&&get.type(card)=='equip'&&!get.cardtag(card,'gifts')){ - return num/player.hp; + xinshanjia: { + group: ["xinshanjia_count"], + locked: false, + mod: { + aiValue: function (player, card, num) { + if ( + (player.storage.xinshanjia || 0) < 3 && + get.type(card) == "equip" && + !get.cardtag(card, "gifts") + ) { + return num / player.hp; } }, }, - audio:"shanjia", - trigger:{ - player:"phaseUseBegin", + audio: "shanjia", + trigger: { + player: "phaseUseBegin", }, - intro:{ - content:"本局游戏内已失去过#张装备牌", + intro: { + content: "本局游戏内已失去过#张装备牌", }, - frequent:true, - sync:function(player){ - var history=player.actionHistory; - var num=0; - for(var i=0;i0) player.markSkill('xinshanjia'); + player.storage.xinshanjia = num; + if (num > 0) player.markSkill("xinshanjia"); }, - content:function (){ - 'step 0' + content: function () { + "step 0"; player.draw(3); - 'step 1' + ("step 1"); lib.skill.xinshanjia.sync(player); - var num=3-player.storage.xinshanjia; - if(num>0){ - player.chooseToDiscard('he',true,num).ai=get.disvalue; + var num = 3 - player.storage.xinshanjia; + if (num > 0) { + player.chooseToDiscard("he", true, num).ai = get.disvalue; } - 'step 2' - var bool1=true,bool2=true; - if(result.cards){ - var cards=result.cards; - for(var i=0;i2) return false; + ai: { + threaten: 3, + noe: true, + reverseOrder: true, + skillTagFilter: function (player) { + if (player.storage.xinshanjia > 2) return false; }, - effect:{ - target:function(card,player,target){ - if(player.storage.xinshanjia<3&&get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; + effect: { + target: function (card, player, target) { + if ( + player.storage.xinshanjia < 3 && + get.type(card) == "equip" && + !get.cardtag(card, "gifts") + ) + return [1, 3]; }, }, }, - subSkill:{ - count:{ - forced:true, - silent:true, - popup:false, - trigger:{ - player:"loseEnd", + subSkill: { + count: { + forced: true, + silent: true, + popup: false, + trigger: { + player: "loseEnd", }, - filter:function(event,player){ - return event.cards2&&event.cards2.length>0; + filter: function (event, player) { + return event.cards2 && event.cards2.length > 0; }, - content:function (){ + content: function () { lib.skill.xinshanjia.sync(player); }, }, - sha:{ - mark:true, - charlotte:true, - intro:{content:'使用【杀】的次数上限+1'}, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; - } - } + sha: { + mark: true, + charlotte: true, + intro: { content: "使用【杀】的次数上限+1" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, }, - nodis:{ - mark:true, - charlotte:true, - intro:{content:'使用牌无距离限制'}, - mod:{ - targetInRange:()=>true - } - } - } + nodis: { + mark: true, + charlotte: true, + intro: { content: "使用牌无距离限制" }, + mod: { + targetInRange: () => true, + }, + }, + }, }, //OL马超 - ol_shichou:{ - audio:2, - trigger:{player:'useCard2'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'; + ol_shichou: { + audio: 2, + trigger: { player: "useCard2" }, + filter: function (event, player) { + return event.card && event.card.name == "sha"; }, - direct:true, - content:function(){ - 'step 0' - var num=player.getDamagedHp()+1; - player.chooseTarget('是否发动【誓仇】?','为'+get.translation(trigger.card)+'添加至多'+get.cnNumber(num)+'个目标',[1,num],function(card,player,target){ - var evt=_status.event.getTrigger(); - return target!=player&&!evt.targets.includes(target)&&lib.filter.targetEnabled2(evt.card,player,target)&&lib.filter.targetInRange(evt.card,player,target); - }).set('ai',function(target){ - return get.effect(target,_status.event.getTrigger().card,_status.event.player); - }); - 'step 1' - if(result.bool&&result.targets&&result.targets.length){ - var targets=result.targets; - player.logSkill('ol_shichou',targets); - player.line(targets,trigger.card.nature); + direct: true, + content: function () { + "step 0"; + var num = player.getDamagedHp() + 1; + player + .chooseTarget( + "是否发动【誓仇】?", + "为" + get.translation(trigger.card) + "添加至多" + get.cnNumber(num) + "个目标", + [1, num], + function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + !evt.targets.includes(target) && + lib.filter.targetEnabled2(evt.card, player, target) && + lib.filter.targetInRange(evt.card, player, target) + ); + } + ) + .set("ai", function (target) { + return get.effect(target, _status.event.getTrigger().card, _status.event.player); + }); + ("step 1"); + if (result.bool && result.targets && result.targets.length) { + var targets = result.targets; + player.logSkill("ol_shichou", targets); + player.line(targets, trigger.card.nature); trigger.targets.addArray(targets); } }, }, dc_olshichou: { - audio: 'ol_shichou', - trigger: { player: 'useCard2' }, + audio: "ol_shichou", + trigger: { player: "useCard2" }, filter: function (event, player) { - return event.card && event.card.name == 'sha' && player.isDamaged() && game.hasPlayer(function (current) { - return !event.targets.includes(current) && lib.filter.filterTarget(event.card, player, current); - }); + return ( + event.card && + event.card.name == "sha" && + player.isDamaged() && + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.filterTarget(event.card, player, current) + ); + }) + ); }, direct: true, content: function () { - 'step 0' - var num = Math.min(player.getDamagedHp(), game.countPlayer(function (current) { - return !trigger.targets.includes(current) && lib.filter.filterTarget(trigger.card, player, current); - })); - player.chooseTarget('是否发动【誓仇】,令至多' + get.cnNumber(num) + '名其他角色也成为此【杀】的目标?', [1, num], function (card, player, target) { - var evt = _status.event.getTrigger(); - return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); - }).ai = function (target) { - return get.effect(target, { name: 'sha' }, _status.event.player); + "step 0"; + var num = Math.min( + player.getDamagedHp(), + game.countPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.filterTarget(trigger.card, player, current) + ); + }) + ); + player.chooseTarget( + "是否发动【誓仇】,令至多" + get.cnNumber(num) + "名其他角色也成为此【杀】的目标?", + [1, num], + function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + !evt.targets.includes(target) && + lib.filter.targetEnabled2(evt.card, player, target) && + lib.filter.targetInRange(evt.card, player, target) + ); + } + ).ai = function (target) { + return get.effect(target, { name: "sha" }, _status.event.player); }; - 'step 1' + ("step 1"); if (result.bool && result.targets && result.targets.length) { var targets = result.targets; - player.logSkill('dc_olshichou', targets); + player.logSkill("dc_olshichou", targets); player.line(targets, trigger.card.nature); trigger.targets.addArray(targets); trigger.ol_shichou = true; - player.addTempSkill('ol_shichou2'); + player.addTempSkill("ol_shichou2"); } }, }, - ol_shichou2:{ - charlotte:true, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.ol_shichou&&!player.getHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }).length&&event.cards.filterInD().length>0; + ol_shichou2: { + charlotte: true, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.ol_shichou && + !player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length && + event.cards.filterInD().length > 0 + ); }, - forced:true, - popup:false, - content:function(){ - player.gain(trigger.cards.filterInD(),'gain2'); + forced: true, + popup: false, + content: function () { + player.gain(trigger.cards.filterInD(), "gain2"); }, }, //新大小乔 - new_xingwu:{ - audio:"xingwu", - trigger:{ - player:"phaseDiscardBegin", + new_xingwu: { + audio: "xingwu", + trigger: { + player: "phaseDiscardBegin", }, - direct:true, - intro:{ - content:"expansion", - markcount:'expansion', - onunmark:function(storage,player){ - player.removeAdditionalSkill('new_luoyan'); + direct: true, + intro: { + content: "expansion", + markcount: "expansion", + onunmark: function (storage, player) { + player.removeAdditionalSkill("new_luoyan"); }, }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - filter:function(event,player){ - return player.countCards('he')>0; + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('new_xingwu'),'将一张牌置于武将牌上作为“舞”').set('ai',function(card){ - if(_status.event.goon) return 20-get.value(card); - return 7-get.value(card); - }).set('goon',player.needsToDiscard()||player.getExpansions('new_xingwu').length>1); - 'step 1' - if(result.bool){ - player.logSkill('new_xingwu'); - var cards=result.cards; - player.addToExpansion(cards,player,'give').gaintag.add('new_xingwu'); - if(player.hasSkill('new_luoyan')) player.addAdditionalSkill('new_luoyan',['oltianxiang','liuli']); - } - else event.finish(); - 'step 2' + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("new_xingwu"), "将一张牌置于武将牌上作为“舞”") + .set("ai", function (card) { + if (_status.event.goon) return 20 - get.value(card); + return 7 - get.value(card); + }) + .set( + "goon", + player.needsToDiscard() || player.getExpansions("new_xingwu").length > 1 + ); + ("step 1"); + if (result.bool) { + player.logSkill("new_xingwu"); + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("new_xingwu"); + if (player.hasSkill("new_luoyan")) + player.addAdditionalSkill("new_luoyan", ["oltianxiang", "liuli"]); + } else event.finish(); + ("step 2"); game.delayx(); - var choices=[]; - event.addIndex=0; - if(player.getExpansions('new_xingwu').length>2){ - choices.push('将三张“星舞”牌置入弃牌堆'); - } - else event.addIndex++; - if(player.countCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'new_xingwu'); - })>1) choices.push('弃置两张手牌并将武将牌翻面'); - if(choices.length){ - player.chooseControl('cancel2').set('prompt','星舞:是否发射核弹?').set('choiceList',choices).set('ai',function(){ - var player=_status.event.player; - if(player.getExpansions('new_xingwu').length>2) return 0; - if(player.isTurnedOver()||player.identity=='fan'||player.getEnemies().length==1) return 0; - return 'cancel2'; - }); - } - else event.finish(); - 'step 3' - if(result.control!='cancel2'){ - var num=result.index+event.addIndex; - if(num==1){ + var choices = []; + event.addIndex = 0; + if (player.getExpansions("new_xingwu").length > 2) { + choices.push("将三张“星舞”牌置入弃牌堆"); + } else event.addIndex++; + if ( + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "new_xingwu"); + }) > 1 + ) + choices.push("弃置两张手牌并将武将牌翻面"); + if (choices.length) { + player + .chooseControl("cancel2") + .set("prompt", "星舞:是否发射核弹?") + .set("choiceList", choices) + .set("ai", function () { + var player = _status.event.player; + if (player.getExpansions("new_xingwu").length > 2) return 0; + if ( + player.isTurnedOver() || + player.identity == "fan" || + player.getEnemies().length == 1 + ) + return 0; + return "cancel2"; + }); + } else event.finish(); + ("step 3"); + if (result.control != "cancel2") { + var num = result.index + event.addIndex; + if (num == 1) { event.goto(5); return; } - if(player.getExpansions('new_xingwu').length>3) player.chooseButton(['请选择要移去的“星舞”牌',player.getExpansions('new_xingwu')],3,true); - else event._result={ - bool:true, - links:player.getExpansions('new_xingwu').slice(0), - } - } - else event.finish(); - 'step 4' - if(result.bool&&result.links&&result.links.length==3){ - var cards=result.links; + if (player.getExpansions("new_xingwu").length > 3) + player.chooseButton( + ["请选择要移去的“星舞”牌", player.getExpansions("new_xingwu")], + 3, + true + ); + else + event._result = { + bool: true, + links: player.getExpansions("new_xingwu").slice(0), + }; + } else event.finish(); + ("step 4"); + if (result.bool && result.links && result.links.length == 3) { + var cards = result.links; player.loseToDiscardpile(cards); event.goto(6); - } - else event.finish(); - 'step 5' - player.chooseToDiscard(true,'h',2); + } else event.finish(); + ("step 5"); + player.chooseToDiscard(true, "h", 2); player.turnOver(); - 'step 6' - player.chooseTarget('请选择【星舞】的目标','弃置其装备区内的所有牌。然后对其造成2点伤害(目标为女性角色则改为1点)',true,lib.filter.notMe).set('ai',function(target){ - return -get.attitude(_status.event.player,target)*Math.sqrt(4+target.countCards('e',function(card){ - return get.value(card,target)>0; - }))*(target.hasSex('female')?1:2); - }); - 'step 7' - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'green'); - var num=target.countCards('e'); - if(num) player.discardPlayerCard(target,'e',num,true); - target.damage(target.hasSex('female')?1:2); + ("step 6"); + player + .chooseTarget( + "请选择【星舞】的目标", + "弃置其装备区内的所有牌。然后对其造成2点伤害(目标为女性角色则改为1点)", + true, + lib.filter.notMe + ) + .set("ai", function (target) { + return ( + -get.attitude(_status.event.player, target) * + Math.sqrt( + 4 + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) + ) * + (target.hasSex("female") ? 1 : 2) + ); + }); + ("step 7"); + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + var num = target.countCards("e"); + if (num) player.discardPlayerCard(target, "e", num, true); + target.damage(target.hasSex("female") ? 1 : 2); } }, - ai:{ - threaten:1.5, + ai: { + threaten: 1.5, }, }, - new_luoyan:{ - init:function(player){ - if(player.getExpansions('new_xingwu').length) player.addAdditionalSkill('new_luoyan',['oltianxiang','liuli']); + new_luoyan: { + init: function (player) { + if (player.getExpansions("new_xingwu").length) + player.addAdditionalSkill("new_luoyan", ["oltianxiang", "liuli"]); }, - onremove:function(player){ - player.removeAdditionalSkill('new_luoyan'); + onremove: function (player) { + player.removeAdditionalSkill("new_luoyan"); + }, + derivation: ["oltianxiang", "liuli"], + locked: true, + ai: { + combo: "new_xingwu", }, - derivation:['oltianxiang','liuli'], - locked:true, - ai:{ - combo:'new_xingwu' - } }, //新孙鲁育 - "new_meibu":{ - audio:"meibu", - trigger:{ - global:"phaseUseBegin", + new_meibu: { + audio: "meibu", + trigger: { + global: "phaseUseBegin", }, - filter:function (event,player){ - return event.player!=player&&event.player.isIn()&&player.countCards('he')>0&&event.player.inRange(player); + filter: function (event, player) { + return ( + event.player != player && + event.player.isIn() && + player.countCards("he") > 0 && + event.player.inRange(player) + ); }, - direct:true, - derivation:["new_zhixi"], - checkx:function (event,player){ - if(get.attitude(player,event.player)>=0) return false; - var e2=player.getEquip(2); - if(e2){ - if(e2.name=='tengjia'||e2.name=='rewrite_tengjia') return true; - if(e2.name=='bagua'||e2.name=='rewrite_bagua') return true; + direct: true, + derivation: ["new_zhixi"], + checkx: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + var e2 = player.getEquip(2); + if (e2) { + if (e2.name == "tengjia" || e2.name == "rewrite_tengjia") return true; + if (e2.name == "bagua" || e2.name == "rewrite_bagua") return true; } - return event.player.countCards('h')>event.player.hp; + return event.player.countCards("h") > event.player.hp; }, - content:function (){ - "step 0" - var check=lib.skill.new_meibu.checkx(trigger,player); - player.chooseToDiscard(get.prompt2('new_meibu',trigger.player),'he').set('ai',function(card){ - if(_status.event.check) return 6-get.value(card); - return 0; - }).set('check',check).set('logSkill',['new_meibu',trigger.player]); - "step 1" - if(result.bool){ - var target=trigger.player; - var card=result.cards[0]; - player.line(target,'green'); - target.addTempSkills('new_zhixi','phaseUseAfter'); - if(card.name!='sha'&&get.type(card)!='trick'&&get.color(card)!='black'){ - target.addTempSkill('new_meibu_range','phaseUseAfter'); - target.markAuto('new_meibu_range',player); + content: function () { + "step 0"; + var check = lib.skill.new_meibu.checkx(trigger, player); + player + .chooseToDiscard(get.prompt2("new_meibu", trigger.player), "he") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", check) + .set("logSkill", ["new_meibu", trigger.player]); + ("step 1"); + if (result.bool) { + var target = trigger.player; + var card = result.cards[0]; + player.line(target, "green"); + target.addTempSkills("new_zhixi", "phaseUseAfter"); + if (card.name != "sha" && get.type(card) != "trick" && get.color(card) != "black") { + target.addTempSkill("new_meibu_range", "phaseUseAfter"); + target.markAuto("new_meibu_range", player); } - target.markSkillCharacter('new_meibu',player,'魅步','锁定技,出牌阶段,你至多可使用X张牌,你使用了锦囊牌后不能再使用牌(X为你的体力值)。'); + target.markSkillCharacter( + "new_meibu", + player, + "魅步", + "锁定技,出牌阶段,你至多可使用X张牌,你使用了锦囊牌后不能再使用牌(X为你的体力值)。" + ); } }, - ai:{ - expose:0.2, + ai: { + expose: 0.2, }, - subSkill:{ - range:{ - onremove:true, - charlotte:true, - mod:{ - globalFrom:function (from,to,num){ - if(from.getStorage('new_meibu_range').includes(to)){ + subSkill: { + range: { + onremove: true, + charlotte: true, + mod: { + globalFrom: function (from, to, num) { + if (from.getStorage("new_meibu_range").includes(to)) { return -Infinity; } }, }, - sub:true, + sub: true, }, }, }, - "new_mumu":{ - audio:"mumu", - trigger:{ - player:"phaseUseBegin", + new_mumu: { + audio: "mumu", + trigger: { + player: "phaseUseBegin", }, - filter:function(event,player){ - return game.hasPlayer(current=>{ - if(current==player) return current.getEquips(2).length>0; - return current.countCards('e')>0; + filter: function (event, player) { + return game.hasPlayer((current) => { + if (current == player) return current.getEquips(2).length > 0; + return current.countCards("e") > 0; }); }, - direct:true, - content:function (){ - 'step 0' - player.chooseTarget(get.prompt('new_mumu'),'弃置一名其他角色装备区内的一张牌,或者获得一名角色装备区内的防具牌',function(card,player,target){ - if(target==player) return target.getEquips(2).length>0; - return target.countCards('e')>0; - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target) - if(target.getEquip(2)&&player.hasEmptySlot(2)){ - return -2*att; - } - return -att; - }); - 'step 1' - if(result.bool&&result.targets&&result.targets.length){ - event.target=result.targets[0]; - player.logSkill('new_mumu',event.target); - player.line(event.target,'green'); - var e=event.target.getEquips(2); - event.e=e; - if(target==player) event.choice='获得一张防具牌'; - else if(e.length>0){ - player.chooseControl('弃置一张装备牌','获得一张防具牌').set('ai',function(){ - if(_status.event.player.getEquips(2).length>0){ - return '弃置一张装备牌'; + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("new_mumu"), + "弃置一名其他角色装备区内的一张牌,或者获得一名角色装备区内的防具牌", + function (card, player, target) { + if (target == player) return target.getEquips(2).length > 0; + return target.countCards("e") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.getEquip(2) && player.hasEmptySlot(2)) { + return -2 * att; + } + return -att; + }); + ("step 1"); + if (result.bool && result.targets && result.targets.length) { + event.target = result.targets[0]; + player.logSkill("new_mumu", event.target); + player.line(event.target, "green"); + var e = event.target.getEquips(2); + event.e = e; + if (target == player) event.choice = "获得一张防具牌"; + else if (e.length > 0) { + player.chooseControl("弃置一张装备牌", "获得一张防具牌").set("ai", function () { + if (_status.event.player.getEquips(2).length > 0) { + return "弃置一张装备牌"; } - return '获得一张防具牌'; + return "获得一张防具牌"; }); + } else { + event.choice = "弃置一张装备牌"; } - else{ - event.choice='弃置一张装备牌'; - } - } - else event.finish(); - 'step 2' - var choice=event.choice||result.control; - if(choice=='弃置一张装备牌'){ - player.discardPlayerCard(event.target,'e',true); - } - else{ - if(event.e){ - player.gain(event.e,event.target,'give','bySelf'); - player.addTempSkill('new_mumu2') + } else event.finish(); + ("step 2"); + var choice = event.choice || result.control; + if (choice == "弃置一张装备牌") { + player.discardPlayerCard(event.target, "e", true); + } else { + if (event.e) { + player.gain(event.e, event.target, "give", "bySelf"); + player.addTempSkill("new_mumu2"); } } }, }, - "new_zhixi":{ - mod:{ - cardEnabled:function(card,player){ - if(player.storage.new_zhixi2||player.countMark('new_zhixi')>=player.hp) return false; + new_zhixi: { + mod: { + cardEnabled: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) + return false; }, - cardUsable:function(card,player){ - if(player.storage.new_zhixi2||player.countMark('new_zhixi')>=player.hp) return false; + cardUsable: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) + return false; }, - cardRespondable:function(card,player){ - if(player.storage.new_zhixi2||player.countMark('new_zhixi')>=player.hp) return false; + cardRespondable: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) + return false; }, - cardSavable:function(card,player){ - if(player.storage.new_zhixi2||player.countMark('new_zhixi')>=player.hp) return false; + cardSavable: function (card, player) { + if (player.storage.new_zhixi2 || player.countMark("new_zhixi") >= player.hp) + return false; }, }, - trigger:{ - player:"useCard1", + trigger: { + player: "useCard1", }, - forced:true, - popup:false, - firstDo:true, - init:function(player,skill){ - player.storage[skill]=0; - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.player==player){ - player.getHistory('useCard',function(evtx){ - if(evtx.getParent('phaseUse')==evt){ + forced: true, + popup: false, + firstDo: true, + init: function (player, skill) { + player.storage[skill] = 0; + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.player == player) { + player.getHistory("useCard", function (evtx) { + if (evtx.getParent("phaseUse") == evt) { player.storage[skill]++; - if(get.type2(evtx.card)=='trick') player.storage.new_zhixi2=true; + if (get.type2(evtx.card) == "trick") player.storage.new_zhixi2 = true; } }); } }, - onremove:function(player){ - player.unmarkSkill('new_meibu'); + onremove: function (player) { + player.unmarkSkill("new_meibu"); delete player.storage.new_zhixi; delete player.storage.new_zhixi2; }, - content:function(){ - player.addMark('new_zhixi',1,false); - if(get.type2(trigger.card)=='trick') player.storage.new_zhixi2=true; + content: function () { + player.addMark("new_zhixi", 1, false); + if (get.type2(trigger.card) == "trick") player.storage.new_zhixi2 = true; }, - ai:{presha:true,pretao:true,nokeep:true}, + ai: { presha: true, pretao: true, nokeep: true }, }, - "new_mumu2":{ - charlotte:true, - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + new_mumu2: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, }, }, - qingzhong:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - check:function(event,player){ - if(game.hasPlayer(function(current){ - return current!=player&¤t.isMinHandcard()&&get.attitude(player,current)>0; - })){ + qingzhong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + check: function (event, player) { + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current.isMinHandcard() && + get.attitude(player, current) > 0 + ); + }) + ) { return true; } - if(player.countCards('h')<=2) return true; + if (player.countCards("h") <= 2) return true; // if(player.countCards('h')<=3&&!player.countCards('h','shan')) return true; //if(player.countCards('h',{type:'basic'})<=1) return true; return false; }, - content:function(){ + content: function () { player.draw(2); - player.addTempSkill('qingzhong_give'); + player.addTempSkill("qingzhong_give"); }, - subSkill:{ - give:{ - audio:'qingzhong', - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ + subSkill: { + give: { + audio: "qingzhong", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { return !player.isMinHandcard(true); }, - forced:true, - content:function(){ - 'step 0' - var list=game.filterPlayer(function(current){ + forced: true, + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { return current.isMinHandcard(); }); - if(list.length==1){ - if(list[0]!=player){ - player.line(list[0],'green'); + if (list.length == 1) { + if (list[0] != player) { + player.line(list[0], "green"); player.swapHandcards(list[0]); } event.finish(); + } else { + player + .chooseTarget( + true, + "清忠:选择一名手牌最少的角色与其交换手牌", + function (card, player, target) { + return target.isMinHandcard(); + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); } - else{ - player.chooseTarget(true,'清忠:选择一名手牌最少的角色与其交换手牌',function(card,player,target){ - return target.isMinHandcard(); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - if(target!=player){ - player.line(target,'green'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + if (target != player) { + player.line(target, "green"); player.swapHandcards(target); } } - } - } - } + }, + }, + }, }, - weijing:{ - audio:2, - enable:'chooseToUse', - filter:function(event,player){ - if(event.type=='wuxie'||player.hasSkill('weijing_used')) return false; - for(var name of ['sha','shan']){ - if(event.filterCard({name:name,isCard:true},player,event)) return true; + weijing: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + if (event.type == "wuxie" || player.hasSkill("weijing_used")) return false; + for (var name of ["sha", "shan"]) { + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var vcards=[]; - for(var name of ['sha','shan']){ - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); + chooseButton: { + dialog: function (event, player) { + var vcards = []; + for (var name of ["sha", "shan"]) { + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); } - var dialog=ui.create.dialog('卫境',[vcards,'vcard'],'hidden'); - dialog.direct=true; + var dialog = ui.create.dialog("卫境", [vcards, "vcard"], "hidden"); + dialog.direct = true; return dialog; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:()=>false, - selectCard:-1, - viewAs:{ - name:links[0][2], - isCard:true, + filterCard: () => false, + selectCard: -1, + viewAs: { + name: links[0][2], + isCard: true, }, - popname:true, - precontent:function(){ - player.logSkill('weijing'); - player.addTempSkill('weijing_used','roundStart'); + popname: true, + precontent: function () { + player.logSkill("weijing"); + player.addTempSkill("weijing_used", "roundStart"); }, - } + }; + }, + prompt: function (links, player) { + return "卫境:视为使用一张【" + get.translation(links[0][2]) + "】"; }, - prompt:function(links,player){ - return '卫境:视为使用一张【'+get.translation(links[0][2])+'】'; - } }, - ai:{ - order:function(item,player){ - var player=_status.event.player; - var event=_status.event; - if(event.filterCard({name:'sha'},player,event)){ - if(!player.hasShan()&&!game.hasPlayer(function(current){ - return player.canUse('sha',current)&¤t.hp==1&&get.effect(current,{name:'sha'},player,player)>0; - })){ + ai: { + order: function (item, player) { + var player = _status.event.player; + var event = _status.event; + if (event.filterCard({ name: "sha" }, player, event)) { + if ( + !player.hasShan() && + !game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + current.hp == 1 && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) { return 0; } return 2.95; - } - else{ - var player=_status.event.player; - if(player.hasSkill('qingzhong_give')) return 2.95; + } else { + var player = _status.event.player; + if (player.hasSkill("qingzhong_give")) return 2.95; return 3.15; } }, - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(player.hasSkill('weijing_used')) return false; - if(arg!='use') return false; + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (player.hasSkill("weijing_used")) return false; + if (arg != "use") return false; + }, + result: { + player: 1, + }, + }, + subSkill: { + used: { + mark: true, + intro: { + content: "本轮已发动", + }, }, - result:{ - player:1 - } }, - subSkill:{ - used:{ - mark:true, - intro:{ - content:'本轮已发动' - } - } - } }, - zishu:{ - audio:2, - locked:true, - subSkill:{ - discard:{ - trigger:{global:'phaseEnd'}, - audio:"zishu", - forced:true, - filter:function(event,player){ - if(_status.currentPhase!=player){ - var he=player.getCards('h'); - var bool=false; - player.getHistory('gain',function(evt){ - if(!bool&&evt&&evt.cards){ - for(var i=0;i0) return false; - return event.cards.filterInD().length>0 - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('yingyuan'),'将'+get.translation(trigger.cards)+'交给一名其他角色',function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - if(target.hasJudge('lebu')) return 0; - let att=get.attitude(_status.event.player,target),name=_status.event.cards[0].name; - if(att<3) return 0; - if(target.hasSkillTag('nogain')) att/=10; - if(name==='sha'&&target.hasSha()) att/=5; - if(name==='wuxie'&&target.needsToDiscard(_status.event.cards)) att/=5; - return att/(1+get.distance(player,target,'absolute')); - }).set('cards',trigger.cards); - 'step 1' - if(result.bool){ - player.logSkill('yingyuan',result.targets[0]); - result.targets[0].gain(trigger.cards.filterInD(),'gain2'); - player.getHistory('custom').push({yingyuan_name:trigger.card.name}); - } - }, - }, - shuimeng:{ - audio:2, - trigger:{player:'phaseUseAfter'}, - direct:true, - filter:function(event,player){ - return player.countCards('h'); - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('shuimeng'),function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - if(!_status.event.goon) return 0; - return -get.attitude(_status.event.player,target); - }).set('goon',player.needsToDiscard()||player.hasCard(function(card){ - var val=get.value(card); - if(val<0) return true; - if(val<=5){ - return card.number>=11; - } - if(val<=6){ - return card.number>=12; - } + yingyuan: { + audio: 2, + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + if ( + player.getHistory("custom", function (evt) { + return evt.yingyuan_name == event.card.name; + }).length > 0 + ) return false; - })); - 'step 1' - if(result.bool){ - player.logSkill('shuimeng',result.targets); - event.target=result.targets[0]; - player.chooseToCompare(event.target); + return event.cards.filterInD().length > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("yingyuan"), + "将" + get.translation(trigger.cards) + "交给一名其他角色", + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + if (target.hasJudge("lebu")) return 0; + let att = get.attitude(_status.event.player, target), + name = _status.event.cards[0].name; + if (att < 3) return 0; + if (target.hasSkillTag("nogain")) att /= 10; + if (name === "sha" && target.hasSha()) att /= 5; + if (name === "wuxie" && target.needsToDiscard(_status.event.cards)) att /= 5; + return att / (1 + get.distance(player, target, "absolute")); + }) + .set("cards", trigger.cards); + ("step 1"); + if (result.bool) { + player.logSkill("yingyuan", result.targets[0]); + result.targets[0].gain(trigger.cards.filterInD(), "gain2"); + player.getHistory("custom").push({ yingyuan_name: trigger.card.name }); } - else{ + }, + }, + shuimeng: { + audio: 2, + trigger: { player: "phaseUseAfter" }, + direct: true, + filter: function (event, player) { + return player.countCards("h"); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("shuimeng"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + return -get.attitude(_status.event.player, target); + }) + .set( + "goon", + player.needsToDiscard() || + player.hasCard(function (card) { + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 11; + } + if (val <= 6) { + return card.number >= 12; + } + return false; + }) + ); + ("step 1"); + if (result.bool) { + player.logSkill("shuimeng", result.targets); + event.target = result.targets[0]; + player.chooseToCompare(event.target); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.chooseUseTarget({name:'wuzhong',isCard:true},true); + ("step 2"); + if (result.bool) { + player.chooseUseTarget({ name: "wuzhong", isCard: true }, true); + } else { + event.target.useCard({ name: "guohe", isCard: true }, player); } - else{ - event.target.useCard({name:'guohe',isCard:true},player); - } - } - }, - qianya:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - direct:true, - filter:function(event,player){ - return get.type(event.card,'trick')=='trick'&&player.countCards('h'); }, - content:function(){ - 'step 0' - var nh=player.countCards('h'); + }, + qianya: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + return get.type(event.card, "trick") == "trick" && player.countCards("h"); + }, + content: function () { + "step 0"; + var nh = player.countCards("h"); player.chooseCardTarget({ - filterCard:true, - filterTarget:function(card,player,target){ - return target!=player; + filterCard: true, + filterTarget: function (card, player, target) { + return target != player; }, - selectCard:[1,nh], - ai1:function(card){ - var player=_status.event.player; - var cardname=_status.event.cardname; - if(_status.event.du) return -get.value(card,player,'raw'); - else if(_status.event.shuimeng){ - if(cardname=='wuzhong'){ - if(player.needsToDiscard(2,(i,player)=>{ - return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); - })) return 10-get.value(card,player,'raw'); - } - else if(cardname=='guohe'){ - if(player.needsToDiscard(-1,(i,player)=>{ - return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); - })) return 10-get.value(card,player,'raw'); + selectCard: [1, nh], + ai1: function (card) { + var player = _status.event.player; + var cardname = _status.event.cardname; + if (_status.event.du) return -get.value(card, player, "raw"); + else if (_status.event.shuimeng) { + if (cardname == "wuzhong") { + if ( + player.needsToDiscard(2, (i, player) => { + return ( + !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i) + ); + }) + ) + return 10 - get.value(card, player, "raw"); + } else if (cardname == "guohe") { + if ( + player.needsToDiscard(-1, (i, player) => { + return ( + !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i) + ); + }) + ) + return 10 - get.value(card, player, "raw"); } return 0; - } - else if(cardname=='lebu'){ - if(player.needsToDiscard(1,(i,player)=>{ - return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); - })){ - return 8-get.value(card,player,'raw'); - } - else{ - if(!ui.selected.cards.length){ - return 6-get.value(card,player,'raw'); + } else if (cardname == "lebu") { + if ( + player.needsToDiscard(1, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) { + return 8 - get.value(card, player, "raw"); + } else { + if (!ui.selected.cards.length) { + return 6 - get.value(card, player, "raw"); } return 0; } + } else if (cardname == "shunshou") { + if (_status.event.nh <= 2) return get.value(card, player, "raw"); + } else if (cardname == "huogong") { + if (player.hp == 1) return get.value(card, player, "raw"); } - else if(cardname=='shunshou'){ - if(_status.event.nh<=2) return get.value(card,player,'raw'); - } - else if(cardname=='huogong'){ - if(player.hp==1) return get.value(card,player,'raw'); - } - if(ui.selected.cards.length) return 0; - return 7-get.value(card,player,'raw'); + if (ui.selected.cards.length) return 0; + return 7 - get.value(card, player, "raw"); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - var nh2=target.countCards('h'); - var num=Math.sqrt(1+nh2); - var cardname=_status.event.cardname; - if(_status.event.du) return 0.5-att; - else if(_status.event.shuimeng){ - return att/num; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + var nh2 = target.countCards("h"); + var num = Math.sqrt(1 + nh2); + var cardname = _status.event.cardname; + if (_status.event.du) return 0.5 - att; + else if (_status.event.shuimeng) { + return att / num; + } else if (cardname == "lebu") { + return att / num; + } else if (cardname == "shunshou") { + if (_status.event.nh <= 2) return att / num; + } else if (cardname == "huogong") { + if (_status.event.player.hp == 1) return att / num; } - else if(cardname=='lebu'){ - return att/num; - } - else if(cardname=='shunshou'){ - if(_status.event.nh<=2) return att/num; - } - else if(cardname=='huogong'){ - if(_status.event.player.hp==1) return att/num; - } - if(_status.event.nh>nh2+1){ - return att/num; + if (_status.event.nh > nh2 + 1) { + return att / num; } return 0; }, - du:player.hasCard(function(card){ - return get.value(card,player,'raw')<0; + du: player.hasCard(function (card) { + return get.value(card, player, "raw") < 0; }), - shuimeng:trigger.getParent(2).name=='shuimeng', - nh:nh, - cardname:trigger.card.name, - prompt:get.prompt2('qianya') + shuimeng: trigger.getParent(2).name == "shuimeng", + nh: nh, + cardname: trigger.card.name, + prompt: get.prompt2("qianya"), }); - 'step 1' - if(result.bool){ - player.logSkill('qianya',result.targets); - player.give(result.cards,result.targets[0]); + ("step 1"); + if (result.bool) { + player.logSkill("qianya", result.targets); + player.give(result.cards, result.targets[0]); } - } + }, }, - xianfu:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + xianfu: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); }, - audio:6, - content:function(){ - 'step 0' - player.chooseTarget('请选择【先辅】的目标',lib.translate.xianfu_info,true,function(card,player,target){ - return target!=player&&(!player.storage.xianfu2||!player.storage.xianfu2.includes(target)); - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0) return att+1; - if(att==0) return Math.random(); - return att; - }).animate=false; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - if(!player.storage.xianfu2) player.storage.xianfu2=[]; + audio: 6, + content: function () { + "step 0"; + player + .chooseTarget( + "请选择【先辅】的目标", + lib.translate.xianfu_info, + true, + function (card, player, target) { + return ( + target != player && + (!player.storage.xianfu2 || !player.storage.xianfu2.includes(target)) + ); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return att + 1; + if (att == 0) return Math.random(); + return att; + }).animate = false; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + if (!player.storage.xianfu2) player.storage.xianfu2 = []; player.storage.xianfu2.push(target); - player.addSkill('xianfu2'); + player.addSkill("xianfu2"); } - } - }, - xianfu_mark:{ - marktext:'辅', - intro:{ - name:'先辅', - content:'当你受到伤害后,$受到等量的伤害,当你回复体力后,$回复等量的体力' }, }, - xianfu2:{ - audio:'xianfu', - charlotte:true, - trigger:{global:['damageEnd','recoverEnd']}, - forced:true, - filter:function(event,player){ - if(event.player.isDead()||!player.storage.xianfu2||!player.storage.xianfu2.includes(event.player)||event.num<=0) return false; - if(event.name=='damage') return true; + xianfu_mark: { + marktext: "辅", + intro: { + name: "先辅", + content: "当你受到伤害后,$受到等量的伤害,当你回复体力后,$回复等量的体力", + }, + }, + xianfu2: { + audio: "xianfu", + charlotte: true, + trigger: { global: ["damageEnd", "recoverEnd"] }, + forced: true, + filter: function (event, player) { + if ( + event.player.isDead() || + !player.storage.xianfu2 || + !player.storage.xianfu2.includes(event.player) || + event.num <= 0 + ) + return false; + if (event.name == "damage") return true; return player.isDamaged(); }, - logTarget:'player', - content:function(){ - 'step 0' - var target=trigger.player; - if(!target.storage.xianfu_mark) target.storage.xianfu_mark=[]; + logTarget: "player", + content: function () { + "step 0"; + var target = trigger.player; + if (!target.storage.xianfu_mark) target.storage.xianfu_mark = []; target.storage.xianfu_mark.add(player); target.storage.xianfu_mark.sortBySeat(); - target.markSkill('xianfu_mark'); + target.markSkill("xianfu_mark"); game.delayx(); - 'step 1' - player[trigger.name](trigger.num,'nosource'); + ("step 1"); + player[trigger.name](trigger.num, "nosource"); }, - onremove:function(player){ - if(!player.storage.xianfu2) return; - game.countPlayer(function(current){ - if(player.storage.xianfu2.includes(current)&¤t.storage.xianfu_mark){ + onremove: function (player) { + if (!player.storage.xianfu2) return; + game.countPlayer(function (current) { + if (player.storage.xianfu2.includes(current) && current.storage.xianfu_mark) { current.storage.xianfu_mark.remove(player); - if(!current.storage.xianfu_mark.length) current.unmarkSkill('xianfu_mark'); - else current.markSkill('xianfu_mark'); + if (!current.storage.xianfu_mark.length) current.unmarkSkill("xianfu_mark"); + else current.markSkill("xianfu_mark"); } }); delete player.storage.xianfu2; }, - group:'xianfu3', + group: "xianfu3", }, - xianfu3:{ - trigger:{global:'dieBegin'}, - silent:true, - filter:function(event,player){ - return event.player==player||player.storage.xianfu2&&player.storage.xianfu2.includes(player); + xianfu3: { + trigger: { global: "dieBegin" }, + silent: true, + filter: function (event, player) { + return ( + event.player == player || + (player.storage.xianfu2 && player.storage.xianfu2.includes(player)) + ); }, - content:function(){ - if(player==trigger.player) lib.skill.xianfu2.onremove(player); + content: function () { + if (player == trigger.player) lib.skill.xianfu2.onremove(player); else player.storage.xianfu2.remove(event.player); - } + }, }, - chouce:{ - trigger:{player:'damageEnd'}, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' + chouce: { + trigger: { player: "damageEnd" }, + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); player.judge(); - 'step 2' - event.color=result.color; - if(event.color=='black'){ - if(game.hasPlayer(function(current){ - return current.countDiscardableCards(player,'hej')>0; - })) player.chooseTarget('弃置一名角色区域内的一张牌',function(card,player,target){ - return target.countDiscardableCards(player,'hej'); - },true).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att<0){ - att=-Math.sqrt(-att); - } - else{ - att=Math.sqrt(att); - } - return att*lib.card.guohe.ai.result.target(player,target); - }); + ("step 2"); + event.color = result.color; + if (event.color == "black") { + if ( + game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "hej") > 0; + }) + ) + player + .chooseTarget( + "弃置一名角色区域内的一张牌", + function (card, player, target) { + return target.countDiscardableCards(player, "hej"); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att < 0) { + att = -Math.sqrt(-att); + } else { + att = Math.sqrt(att); + } + return att * lib.card.guohe.ai.result.target(player, target); + }); else event.finish(); - } - else{ - var next=player.chooseTarget('令一名角色摸一张牌'); - if(player.storage.xianfu2&&player.storage.xianfu2.length){ - next.set('prompt2','(若目标为'+get.translation(player.storage.xianfu2)+'则改为摸两张牌)'); + } else { + var next = player.chooseTarget("令一名角色摸一张牌"); + if (player.storage.xianfu2 && player.storage.xianfu2.length) { + next.set( + "prompt2", + "(若目标为" + get.translation(player.storage.xianfu2) + "则改为摸两张牌)" + ); } - next.set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target)/Math.sqrt(1+target.countCards('h')); - if(target.hasSkillTag('nogain')) att/=10; - if(player.storage.xianfu2&&player.storage.xianfu2.includes(target)) return att*2; + next.set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + if (player.storage.xianfu2 && player.storage.xianfu2.includes(target)) + return att * 2; return att; - }) + }); } - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - if(event.color=='black'){ - player.discardPlayerCard(target,'hej',true); - } - else{ - if(player.storage.xianfu2&&player.storage.xianfu2.includes(target)){ - if(!target.storage.xianfu_mark) target.storage.xianfu_mark=[]; + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + if (event.color == "black") { + player.discardPlayerCard(target, "hej", true); + } else { + if (player.storage.xianfu2 && player.storage.xianfu2.includes(target)) { + if (!target.storage.xianfu_mark) target.storage.xianfu_mark = []; target.storage.xianfu_mark.add(player); target.storage.xianfu_mark.sortBySeat(); - target.markSkill('xianfu_mark'); + target.markSkill("xianfu_mark"); target.draw(2); - } - else{ + } else { target.draw(); } } } - 'step 4' - if(--event.num>0&&player.hasSkill('chouce')){ - player.chooseBool(get.prompt2('chouce')); - } - else{ + ("step 4"); + if (--event.num > 0 && player.hasSkill("chouce")) { + player.chooseBool(get.prompt2("chouce")); + } else { event.finish(); } - 'step 5' - if(result.bool){ - player.logSkill('chouce'); + ("step 5"); + if (result.bool) { + player.logSkill("chouce"); event.goto(1); } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(target.hp>=4) return [1,get.tag(card,'damage')*1.5]; - if(target.hp==3) return [1,get.tag(card,'damage')*1]; - if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [1, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [1, get.tag(card, "damage") * 1]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; } - } - } - } - }, - fuqi:{ - audio:2, - forced:true, - trigger:{ - player:"useCard", - }, - filter:function(event,player){ - return event.card&&(get.type(event.card)=='trick'||get.type(event.card)=='basic'&&!['shan','tao','jiu','du'].includes(event.card.name))&&game.hasPlayer(function(current){ - return current!=player&&get.distance(current,player)<=1; - }); - }, - content:function(){ - trigger.directHit.addArray(game.filterPlayer(function(current){ - return current!=player&&get.distance(current,player)<=1; - })); - }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return get.distance(arg.target,player)<=1; + }, }, }, }, - wylianji:{ - enable:'phaseUse', - audio:2, - usable:1, - filter:function(event,player){ + fuqi: { + audio: 2, + forced: true, + trigger: { + player: "useCard", + }, + filter: function (event, player) { + return ( + event.card && + (get.type(event.card) == "trick" || + (get.type(event.card) == "basic" && + !["shan", "tao", "jiu", "du"].includes(event.card.name))) && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); + }, + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); + }, + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return get.distance(arg.target, player) <= 1; + }, + }, + }, + wylianji: { + enable: "phaseUse", + audio: 2, + usable: 1, + filter: function (event, player) { return player.hasCard(lib.skill.wylianji.filterCard); }, - check:function(card){ - if(card.name=='sha') return 1; - else{ - if(get.tag(card,'damage')){ - if(get.tag(card,'multineg')) return 5; + check: function (card) { + if (card.name == "sha") return 1; + else { + if (get.tag(card, "damage")) { + if (get.tag(card, "multineg")) return 5; return 2; } } return 0; }, - filterCard:function(card){ - return get.name(card)=='sha'||(get.type(card,'trick')=='trick'&&get.color(card)=='black'&&!get.info(card).multitarget)&&get.info(card).enable; + filterCard: function (card) { + return ( + get.name(card) == "sha" || + (get.type(card, "trick") == "trick" && + get.color(card) == "black" && + !get.info(card).multitarget && + get.info(card).enable) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&!target.isMin()&& - (player.canUse(card,target,false)||game.hasPlayer(function(current){ - return current!=player&&target.canUse(card,current); - })); + filterTarget: function (card, player, target) { + return ( + target != player && + !target.isMin() && + (player.canUse(card, target, false) || + game.hasPlayer(function (current) { + return current != player && target.canUse(card, current); + })) + ); }, - discard:false, - lose:true, - delay:false, - content:function(){ - 'step 0' - player.showCards(get.translation(player)+'对'+get.translation(target)+'发动了【连计】',cards); - 'step 1' - var equip1=get.cardPile2(function(card){ - return get.subtype(card)=='equip1'; + discard: false, + lose: true, + delay: false, + content: function () { + "step 0"; + player.showCards( + get.translation(player) + "对" + get.translation(target) + "发动了【连计】", + cards + ); + ("step 1"); + var equip1 = get.cardPile2(function (card) { + return get.subtype(card) == "equip1"; }); - if(!equip1){ - player.popup('杯具'); - game.log('牌堆中无装备'); + if (!equip1) { + player.popup("杯具"); + game.log("牌堆中无装备"); event.finish(); return; } - if(equip1.name=='qinggang'&&!lib.inpile.includes('qibaodao')){ + if (equip1.name == "qinggang" && !lib.inpile.includes("qibaodao")) { equip1.remove(); - equip1=game.createCard2('qibaodao',equip1.suit,equip1.number); + equip1 = game.createCard2("qibaodao", equip1.suit, equip1.number); } target.$draw(equip1); - target.chooseUseTarget(true,equip1,'nothrow','nopopup'); + target.chooseUseTarget(true, equip1, "nothrow", "nopopup"); game.delay(); - 'step 2' + ("step 2"); game.updateRoundNumber(); - var card=cards[0]; - var bool1=game.hasPlayer(function(current){ - return current!=player&&target.canUse(card,current); + var card = cards[0]; + var bool1 = game.hasPlayer(function (current) { + return current != player && target.canUse(card, current); }); - var bool2=player.canUse(card,target,false); - if(bool1&&bool2){ - target.chooseControl(function(){ - return 0; - }).set('choiceList',[ - '对除'+get.translation(player)+'以外的角色使用'+get.translation(cards)+',并将装备区里的武器牌交给该牌的一个目标角色', - '视为'+get.translation(player)+'对你使用'+get.translation(cards)+',并将装备区内的武器牌交给'+get.translation(player) - ]); - } - else if(bool1){ - event.directindex=0; - } - else if(bool2){ - event.directindex=1; - } - else{ + var bool2 = player.canUse(card, target, false); + if (bool1 && bool2) { + target + .chooseControl(function () { + return 0; + }) + .set("choiceList", [ + "对除" + + get.translation(player) + + "以外的角色使用" + + get.translation(cards) + + ",并将装备区里的武器牌交给该牌的一个目标角色", + "视为" + + get.translation(player) + + "对你使用" + + get.translation(cards) + + ",并将装备区内的武器牌交给" + + get.translation(player), + ]); + } else if (bool1) { + event.directindex = 0; + } else if (bool2) { + event.directindex = 1; + } else { event.finish(); } - 'step 3' - var card=cards[0]; - if(result&&typeof event.directindex!='number'){ - event.directindex=result.index; + ("step 3"); + var card = cards[0]; + if (result && typeof event.directindex != "number") { + event.directindex = result.index; } - if(event.directindex==1){ - event.insert(lib.skill.wylianji.content_use,{ - player:player, - target:target, - card:card - }) - } - else{ - event.insert(lib.skill.wylianji.content_give,{ - player:target, - card:card, - targets:game.filterPlayer(function(current){ - return current!=player; - }) + if (event.directindex == 1) { + event.insert(lib.skill.wylianji.content_use, { + player: player, + target: target, + card: card, + }); + } else { + event.insert(lib.skill.wylianji.content_give, { + player: target, + card: card, + targets: game.filterPlayer(function (current) { + return current != player; + }), }); } }, - content_use:function(){ - 'step 0' - player.useCard(card,target); - 'step 1' - if(!get.owner(card)){ - target.gain(card,'gain2'); + content_use: function () { + "step 0"; + player.useCard(card, target); + ("step 1"); + if (!get.owner(card)) { + target.gain(card, "gain2"); } - 'step 2' - var equip1=target.getEquips(1); - if(equip1.length){ + ("step 2"); + var equip1 = target.getEquips(1); + if (equip1.length) { game.delay(); - target.give(equip1,player); + target.give(equip1, player); target.line(player); } }, - content_give:function(){ - 'step 0' - var select=get.select(get.info(card).selectTarget); - if(select[1]==-1){ - for(var i=0;i1){ - player.chooseTarget(true,'将'+get.translation(equip1)+'交给一名角色',function(card,player,target){ - return _status.event.list.includes(target); - }).set('ai',function(target){ - return get.attitude(player,target); - }).set('list',_status.event.list); - event.equip1=equip1; - } - else{ - if(event.list.length==1){ - player.give(equip1,event.list[0]); + if (event.list.length > 1) { + player + .chooseTarget( + true, + "将" + get.translation(equip1) + "交给一名角色", + function (card, player, target) { + return _status.event.list.includes(target); + } + ) + .set("ai", function (target) { + return get.attitude(player, target); + }) + .set("list", _status.event.list); + event.equip1 = equip1; + } else { + if (event.list.length == 1) { + player.give(equip1, event.list[0]); player.line(event.list); } event.finish(); } - } - else{ + } else { event.finish(); } - 'step 3' - if(result.bool&&result.targets.length&&event.equip1){ - player.give(event.equip1,result.targets[0]); + ("step 3"); + if (result.bool && result.targets.length && event.equip1) { + player.give(event.equip1, result.targets[0]); player.line(result.targets); } }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(ui.selected.cards.length){ - var card=ui.selected.cards[0]; - var bool=(card.name!='sha'); - if(game.hasPlayer(function(current){ - return target.canUse(card,current,bool)&&get.effect(current,card,target,player)>0; - })){ - var num=1; - if(target.getEquip(1)){ - num=0.6; + ai: { + order: 7, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + var bool = card.name != "sha"; + if ( + game.hasPlayer(function (current) { + return ( + target.canUse(card, current, bool) && + get.effect(current, card, target, player) > 0 + ); + }) + ) { + var num = 1; + if (target.getEquip(1)) { + num = 0.6; } - if(target.hasSkillTag('noe')) 2*num; + if (target.hasSkillTag("noe")) 2 * num; return num; } } return 0; - } - } - } + }, + }, + }, }, - moucheng:{ - audio:2, - derivation:['jingong','wy_meirenji','wy_xiaolicangdao'], - trigger:{global:'damageEnd'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.source!=player&&event.getParent(2).name=='useCard'&&event.getParent(3).name=='wylianjiInserted'; + moucheng: { + audio: 2, + derivation: ["jingong", "wy_meirenji", "wy_xiaolicangdao"], + trigger: { global: "damageEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.source != player && + event.getParent(2).name == "useCard" && + event.getParent(3).name == "wylianjiInserted" + ); }, - init:function(player){ - player.storage.moucheng=0; + init: function (player) { + player.storage.moucheng = 0; }, - intro:{ - content:'已造成#点伤害' + intro: { + content: "已造成#点伤害", }, - unique:true, - juexingji:true, - content:function(){ - player.storage.moucheng+=trigger.num; - if(player.hasSkill('moucheng')){ - player.markSkill('moucheng'); - player.syncStorage('moucheng'); + unique: true, + juexingji: true, + content: function () { + player.storage.moucheng += trigger.num; + if (player.hasSkill("moucheng")) { + player.markSkill("moucheng"); + player.syncStorage("moucheng"); } - if(player.storage.moucheng>=3){ - event.trigger('mouchengAwaken'); + if (player.storage.moucheng >= 3) { + event.trigger("mouchengAwaken"); } }, - group:'moucheng_awaken', - subSkill:{ - awaken:{ - trigger:{player:'mouchengAwaken'}, - forced:true, - skillAnimation:true, - animationColor:'gray', - content:function(){ - player.awakenSkill('moucheng'); - game.log(player,'失去了技能','#g【连计】'); - player.changeSkills(['jingong'],['wylianji']); - } - } - } + group: "moucheng_awaken", + subSkill: { + awaken: { + trigger: { player: "mouchengAwaken" }, + forced: true, + skillAnimation: true, + animationColor: "gray", + content: function () { + player.awakenSkill("moucheng"); + game.log(player, "失去了技能", "#g【连计】"); + player.changeSkills(["jingong"], ["wylianji"]); + }, + }, + }, }, - jingong:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return event.xinjingong_list&&player.countCards('hes',function(card){ - return card.name=='sha'||get.type(card)=='equip'; - }); + jingong: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + event.xinjingong_list && + player.countCards("hes", function (card) { + return card.name == "sha" || get.type(card) == "equip"; + }) + ); }, - onChooseToUse:function(event){ - if(!game.online){ - var evt=event.getParent(); - if(evt.name!='phaseUse') return; - if(!evt.xinjingong_list){ - var list=get.inpile('trick').randomGets(2); - if(Math.random()<0.5){ - list.push('wy_meirenji'); + onChooseToUse: function (event) { + if (!game.online) { + var evt = event.getParent(); + if (evt.name != "phaseUse") return; + if (!evt.xinjingong_list) { + var list = get.inpile("trick").randomGets(2); + if (Math.random() < 0.5) { + list.push("wy_meirenji"); + } else { + list.push("wy_xiaolicangdao"); } - else{ - list.push('wy_xiaolicangdao'); - } - evt.xinjingong_list=list; + evt.xinjingong_list = list; } - if(!event.xinjingong_list) event.set('xinjingong_list',evt.xinjingong_list); + if (!event.xinjingong_list) event.set("xinjingong_list", evt.xinjingong_list); } }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i of event.xinjingong_list) list.push(['锦囊','',i]); - return ui.create.dialog('矜功',[list,'vcard']); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of event.xinjingong_list) list.push(["锦囊", "", i]); + return ui.create.dialog("矜功", [list, "vcard"]); }, - filter:function(button,player){ - return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); + filter: function (button, player) { + return lib.filter.filterCard( + { name: button.link[2] }, + player, + _status.event.getParent() + ); }, - check:function(button){ - return _status.event.player.getUseValue({name:button.link[2]}); + check: function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'jingong', - popname:true, - position:'hes', - viewAs:{name:links[0][2]}, - check:function(card){ - return 6-get.value(card); + audio: "jingong", + popname: true, + position: "hes", + viewAs: { name: links[0][2] }, + check: function (card) { + return 6 - get.value(card); }, - filterCard:function(card){ - return card.name=='sha'||get.type(card)=='equip'; + filterCard: function (card) { + return card.name == "sha" || get.type(card) == "equip"; }, - precontent:function(){ - player.addTempSkill('jingong2'); + precontent: function () { + player.addTempSkill("jingong2"); }, }; }, - prompt:function(links,player){ - return '将一张【杀】或装备牌当做'+get.translation(links[0][2])+'使用'; - } + prompt: function (links, player) { + return "将一张【杀】或装备牌当做" + get.translation(links[0][2]) + "使用"; + }, }, - ai:{ - order:2, - result:{ - player:function(player){ - if((player.hp<=2||player.needsToDiscard())&&!player.getStat('damage')) return 0; + ai: { + order: 2, + result: { + player: function (player) { + if ((player.hp <= 2 || player.needsToDiscard()) && !player.getStat("damage")) + return 0; return 1; - } - } - } - }, - jingong2:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return !player.getStat('damage'); + }, + }, }, - content:function(){ - player.loseHp(); - } }, - jingong3:{charlotte:true}, - weikui:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h'); + jingong2: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return !player.getStat("damage"); }, - content:function(){ - 'step 0' + content: function () { player.loseHp(); - 'step 1' - if(target.countCards('h','shan')){ + }, + }, + jingong3: { charlotte: true }, + weikui: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h"); + }, + content: function () { + "step 0"; + player.loseHp(); + ("step 1"); + if (target.countCards("h", "shan")) { player.viewHandcards(target); - if(player.canUse({name:'sha',isCard:true},target,false)) player.useCard({name:'sha',isCard:true},target,false); - player.storage.weikui2=target; - player.addTempSkill('weikui2'); - } - else{ - player.discardPlayerCard(target,'visible',true,'h').set('ai',function(button){ - return get.value(button.link,_status.event.target); + if (player.canUse({ name: "sha", isCard: true }, target, false)) + player.useCard({ name: "sha", isCard: true }, target, false); + player.storage.weikui2 = target; + player.addTempSkill("weikui2"); + } else { + player.discardPlayerCard(target, "visible", true, "h").set("ai", function (button) { + return get.value(button.link, _status.event.target); }); } }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(player.hp<=2) return 0; - if(player.hp==3) return target.hp<=2?-1:0; + ai: { + order: 8, + result: { + target: function (player, target) { + if (player.hp <= 2) return 0; + if (player.hp == 3) return target.hp <= 2 ? -1 : 0; return -1; - } - } - } - }, - weikui2:{ - onremove:true, - mod:{ - globalFrom:function(from,to){ - if(to==from.storage.weikui2) return -Infinity; - } - }, - mark:'character', - intro:{ - content:'与$的距离视为1直到回合结束' + }, + }, }, }, - lizhan:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - for(var i=0;i=num) return false; - return player.countCards('h')>0; + ai: { + expose: 0.3, + threaten: 1.3, }, - filterTarget:function(event,player,target){ + }, + xinfenyue: { + enable: "phaseUse", + audio: "fenyue", + filter: function (event, player) { + var num = game.players.length - player.getFriends(true).length; + if ((player.getStat().skill.xinfenyue || 0) >= num) return false; + return player.countCards("h") > 0; + }, + filterTarget: function (event, player, target) { return player.canCompare(target); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(!result.bool) event.finish(); - event.num=result.num1; - 'step 2' - if(num<=5&&target.countGainableCards(player,'he')>0) player.gainPlayerCard(target,'he',true); - 'step 3' - if(num<=9){ - var card=get.cardPile2(function(x){ - return x.name=='sha'; + ("step 1"); + if (!result.bool) event.finish(); + event.num = result.num1; + ("step 2"); + if (num <= 5 && target.countGainableCards(player, "he") > 0) + player.gainPlayerCard(target, "he", true); + ("step 3"); + if (num <= 9) { + var card = get.cardPile2(function (x) { + return x.name == "sha"; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); } - 'step 4' - if(num<=13){ - var card={name:'sha',nature:'thunder'}; - if(player.canUse(card,target,false)) player.useCard(card,target,false); + ("step 4"); + if (num <= 13) { + var card = { name: "sha", nature: "thunder" }; + if (player.canUse(card, target, false)) player.useCard(card, target, false); } }, - ai:{ - order:4, - result:{ - target:function(player,target){ - var sort=function(a,b){ - return b.number-a.number; + ai: { + order: 4, + result: { + target: function (player, target) { + var sort = function (a, b) { + return b.number - a.number; }; - var ps=player.getCards('h').sort(sort); - var ts=target.getCards('h').sort(sort); - if(ps[0].number>ts[0].number){ - var effect=get.effect(target,{name:'sha',nature:'thunder'},player,player) - if(ps[0].number<6&&target.countCards('he')>1) effect-=2; - if(ps[0].number<10) effect-=1; + var ps = player.getCards("h").sort(sort); + var ts = target.getCards("h").sort(sort); + if (ps[0].number > ts[0].number) { + var effect = get.effect( + target, + { name: "sha", nature: "thunder" }, + player, + player + ); + if (ps[0].number < 6 && target.countCards("he") > 1) effect -= 2; + if (ps[0].number < 10) effect -= 1; return effect; } - return ps.length>=ts.length?-0.5:0; + return ps.length >= ts.length ? -0.5 : 0; }, }, }, }, - fenyue:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(!player.countCards('h')) return false; + fenyue: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("h")) return false; var num; - if(get.mode()=='identity'){ - num=game.countPlayer(function(current){ - return current.identity=='zhong'||current.identity=='mingzhong'; + if (get.mode() == "identity") { + num = game.countPlayer(function (current) { + return current.identity == "zhong" || current.identity == "mingzhong"; }); + } else { + num = 1; } - else{ - num=1; - } - if(player.getStat().skill.fenyue>=num) return false; + if (player.getStat().skill.fenyue >= num) return false; return true; }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return player.canCompare(target); }, - ai:{ - order:2.8, - result:{ - target:function(player,target){ - if(get.attitude(player,target)<0&&player.hasCard(function(card){ - return (card.number>=9&&get.value(card)<=5)||get.value(card)<=3; - })){ - return get.effect(target,{name:'sha'},player,target); - } - else{ + ai: { + order: 2.8, + result: { + target: function (player, target) { + if ( + get.attitude(player, target) < 0 && + player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; + }) + ) { + return get.effect(target, { name: "sha" }, player, target); + } else { return 0; } - } - } + }, + }, }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - player.chooseControl(function(){ - return 1; - }).set('choiceList',[ - '令'+get.translation(target)+'不能使用或打出手牌直到回合结束', - '视为对'+get.translation(target)+'使用一张杀(不计入次数限制)' - ]); - } - else{ - var evt=_status.event.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'){ - evt.skipped=true; + ("step 1"); + if (result.bool) { + player + .chooseControl(function () { + return 1; + }) + .set("choiceList", [ + "令" + get.translation(target) + "不能使用或打出手牌直到回合结束", + "视为对" + get.translation(target) + "使用一张杀(不计入次数限制)", + ]); + } else { + var evt = _status.event.getParent("phaseUse"); + if (evt && evt.name == "phaseUse") { + evt.skipped = true; } event.finish(); } - 'step 2' - if(result.control=='选项一'){ - target.addTempSkill('fenyue2'); + ("step 2"); + if (result.control == "选项一") { + target.addTempSkill("fenyue2"); + } else { + player.useCard({ name: "sha", isCard: true }, target, false); } - else{ - player.useCard({name:'sha',isCard:true},target,false); - } - } + }, }, - fenyue2:{ - mark:true, - mod:{ - cardEnabled2:function (card){ - if(get.position(card)=='h') return false; + fenyue2: { + mark: true, + mod: { + cardEnabled2: function (card) { + if (get.position(card) == "h") return false; }, }, - intro:{ - content:'不能使用或打出手牌' - } + intro: { + content: "不能使用或打出手牌", + }, }, - zfengshi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.countCards('e'); + zfengshi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("e"); }, - logTarget:'target', - check:function(event,player){ - if(event.target.hasSkillTag('noe')) return false; - return get.attitude(player,event.target)<0; + logTarget: "target", + check: function (event, player) { + if (event.target.hasSkillTag("noe")) return false; + return get.attitude(player, event.target) < 0; + }, + content: function () { + trigger.target.chooseToDiscard("e", true); }, - content:function(){ - trigger.target.chooseToDiscard('e',true); - } }, - chuanxin:{ - audio:2, - trigger:{source:'damageBegin2'}, - preHidden:true, - filter:function(event,player){ - if(_status.currentPhase!=player) return false; - if(!_status.event.getParent('phaseUse')) return false; - if(event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.getParent().name==event.card.name){ - if(get.mode()=='guozhan'){ - return (event.player.identity!='qun'||player.identity=='ye')&& - !event.player.isUnseen()&&event.player.hasViceCharacter(); - } - else{ - var info=lib.character[event.player.name]; - if(!info) return false; - var skills=event.player.getSkills(); - for(var i=0;i=2) return 1; - return 0; - }).set('choiceList',['弃置装备区内的所有牌并失去1点体力',get.mode()=='guozhan'?'移除副将牌':'随机移除武将牌上的一个技能']); + if (trigger.player.countCards("e")) { + trigger.player + .chooseControl(function (event, player) { + if (get.mode() == "guozhan" && get.guozhanRank(player.name2, player) < 4) + return 1; + if (player.hp == 1) return 1; + if (player.hp == 2 && player.countCards("e") >= 2) return 1; + return 0; + }) + .set("choiceList", [ + "弃置装备区内的所有牌并失去1点体力", + get.mode() == "guozhan" ? "移除副将牌" : "随机移除武将牌上的一个技能", + ]); + } else { + event._result = { index: 1 }; } - else{ - event._result={index:1}; - } - 'step 1' - if(result.index==1){ - if(get.mode()!='guozhan'){ - var info=lib.character[trigger.player.name]; - var skills=trigger.player.getSkills(); - var list=[]; - for(var i=0;i0; + filter: function (event) { + return _status.currentPhase && _status.currentPhase.isIn() && event.num > 0; }, - logTarget:function(){ + logTarget: function () { return _status.currentPhase; }, - content:function(){ - var source=_status.currentPhase; - if(source.hasSkill('hengjiang2')){ - source.storage.hengjiang2+=trigger.num; + content: function () { + var source = _status.currentPhase; + if (source.hasSkill("hengjiang2")) { + source.storage.hengjiang2 += trigger.num; source.storage.hengjiang3.add(player); source.updateMarks(); - } - else{ - source.storage.hengjiang3=[player]; - source.storage.hengjiang2=trigger.num; - source.addTempSkill('hengjiang2'); + } else { + source.storage.hengjiang3 = [player]; + source.storage.hengjiang2 = trigger.num; + source.addTempSkill("hengjiang2"); } }, - ai:{ - maixie_defend:true, - } + ai: { + maixie_defend: true, + }, }, - hengjiang2:{ - mark:true, - charlotte:true, - intro:{ - content:'手牌上限-#' + hengjiang2: { + mark: true, + charlotte: true, + intro: { + content: "手牌上限-#", }, - mod:{ - maxHandcard:function(player,num){ - return num-player.storage.hengjiang2; - } + mod: { + maxHandcard: function (player, num) { + return num - player.storage.hengjiang2; + }, }, - onremove:function(player){ + onremove: function (player) { delete player.storage.hengjiang2; delete player.storage.hengjiang3; }, - trigger:{player:'phaseDiscardEnd'}, - filter:function(event,player){ - if(event.cards&&event.cards.length) return false; - var players=player.storage.hengjiang3; - for(var i=0;i0; + filter: function (event) { + return _status.currentPhase && _status.currentPhase.isIn() && event.num > 0; }, - logTarget:function(){ + logTarget: function () { return _status.currentPhase; }, - preHidden:true, - content:function(){ - "step 0" - event.count=trigger.num; - "step 1" + preHidden: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - var source=_status.currentPhase; - source.addTempSkill('rehengjiang2'); - source.addMark('rehengjiang2',1,false); - player.addTempSkill('rehengjiang3'); - "step 2" - if(event.count&&player.hasSkill('rehengjiang')){ - player.chooseBool(get.prompt2('rehengjiang',_status.currentPhase)).set('ai',function(){ - return lib.skill.rehengjiang.check(_status.event.getTrigger(),_status.event.player); - }) - } - else event.finish(); - "step 3" - if(result.bool){ - player.logSkill('rehengjiang',_status.currentPhase); + var source = _status.currentPhase; + source.addTempSkill("rehengjiang2"); + source.addMark("rehengjiang2", 1, false); + player.addTempSkill("rehengjiang3"); + ("step 2"); + if (event.count && player.hasSkill("rehengjiang")) { + player + .chooseBool(get.prompt2("rehengjiang", _status.currentPhase)) + .set("ai", function () { + return lib.skill.rehengjiang.check( + _status.event.getTrigger(), + _status.event.player + ); + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + player.logSkill("rehengjiang", _status.currentPhase); event.goto(1); } }, - ai:{ - maixie_defend:true, - notemp:true, - } - }, - rehengjiang2:{ - mark:true, - charlotte:true, - onremove:true, - intro:{ - content:'手牌上限-#' - }, - mod:{ - maxHandcard:function(player,num){ - return num-player.storage.rehengjiang2; - } + ai: { + maixie_defend: true, + notemp: true, }, }, - rehengjiang3:{ - audio:'hengjiang', - trigger:{global:'phaseEnd'}, - forced:true, - charlotte:true, - filterx:function(event,player){ - if(!event.player.countMark('rehengjiang2')) return false; - if(event.player.hasHistory('lose',function(evt){ - return evt.type=='discard'&&evt.cards2.length>0&&evt.getParent('phaseDiscard').player==event.player; - })) return false; + rehengjiang2: { + mark: true, + charlotte: true, + onremove: true, + intro: { + content: "手牌上限-#", + }, + mod: { + maxHandcard: function (player, num) { + return num - player.storage.rehengjiang2; + }, + }, + }, + rehengjiang3: { + audio: "hengjiang", + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + filterx: function (event, player) { + if (!event.player.countMark("rehengjiang2")) return false; + if ( + event.player.hasHistory("lose", function (evt) { + return ( + evt.type == "discard" && + evt.cards2.length > 0 && + evt.getParent("phaseDiscard").player == event.player + ); + }) + ) + return false; return true; }, - logTarget:'player', - content:function(){ - if(lib.skill.rehengjiang3.filterx(trigger,player)){ - var num=player.getHistory('useSkill',function(evt){ - return evt.skill=='rehengjiang'&&evt.targets.includes(trigger.player); + logTarget: "player", + content: function () { + if (lib.skill.rehengjiang3.filterx(trigger, player)) { + var num = player.getHistory("useSkill", function (evt) { + return evt.skill == "rehengjiang" && evt.targets.includes(trigger.player); }).length; - if(num>0) player.draw(num); - } - else player.draw(); + if (num > 0) player.draw(num); + } else player.draw(); }, }, - shuangren:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - preHidden:true, - filter:function(event,player){ - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&&player.canCompare(current); - }) + shuangren: { + trigger: { player: "phaseUseBegin" }, + direct: true, + preHidden: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && player.canCompare(current); + }) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; var goon; - if(player.needsToDiscard()>1){ - goon=player.hasCard(function(card){ - return card.number>10&&get.value(card)<=5; + if (player.needsToDiscard() > 1) { + goon = player.hasCard(function (card) { + return card.number > 10 && get.value(card) <= 5; + }); + } else { + goon = player.hasCard(function (card) { + return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3; }); } - else{ - goon=player.hasCard(function(card){ - return (card.number>=9&&get.value(card)<=5)||get.value(card)<=3; - }); - } - player.chooseTarget(get.prompt2('shuangren'),function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - var player=_status.event.player; - if(_status.event.goon&&get.attitude(player,target)<0){ - return get.effect(target,{name:'sha'},player,player); - } - return 0; - }).set('goon',goon).setHiddenSkill(event.name); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('shuangren',target); + player + .chooseTarget(get.prompt2("shuangren"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + if (_status.event.goon && get.attitude(player, target) < 0) { + return get.effect(target, { name: "sha" }, player, player); + } + return 0; + }) + .set("goon", goon) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("shuangren", target); player.chooseToCompare(target); - } - else{ + } else { event.finish(); } - 'step 2' - if(result.bool){ - var target=event.target; - if(game.hasPlayer(function(current){ - if(target==current) return false; - if(!player.canUse('sha',current,false)) return false; - return target.isFriendOf(current); - })){ - var str='对一名与'+get.translation(target)+'势力相同的'; - player.chooseTarget(str+'角色使用一张杀',true,function(card,player,target){ - if(!player.canUse('sha',target,false)) return false; - if(get.mode()=='guozhan'){ - return target.isFriendOf(_status.event.identity); - } - return true; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); - }).set('identity',target); - } - else{ - player.useCard({name:'sha',isCard:true},target,false); + ("step 2"); + if (result.bool) { + var target = event.target; + if ( + game.hasPlayer(function (current) { + if (target == current) return false; + if (!player.canUse("sha", current, false)) return false; + return target.isFriendOf(current); + }) + ) { + var str = "对一名与" + get.translation(target) + "势力相同的"; + player + .chooseTarget(str + "角色使用一张杀", true, function (card, player, target) { + if (!player.canUse("sha", target, false)) return false; + if (get.mode() == "guozhan") { + return target.isFriendOf(_status.event.identity); + } + return true; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("identity", target); + } else { + player.useCard({ name: "sha", isCard: true }, target, false); event.finish(); } - } - else{ - player.addTempSkill('zishou2'); + } else { + player.addTempSkill("zishou2"); event.finish(); } - 'step 3' - if(result.bool&&result.targets&&result.targets.length){ - player.useCard({name:'sha',isCard:true},result.targets[0],false); + ("step 3"); + if (result.bool && result.targets && result.targets.length) { + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); } - } + }, }, - kuanshi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('kuanshi')).set('ai',function(target){ - if(get.attitude(_status.event.player,target)>0){ - return 1/Math.sqrt(target.hp+1); + kuanshi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("kuanshi")).set("ai", function (target) { + if (get.attitude(_status.event.player, target) > 0) { + return 1 / Math.sqrt(target.hp + 1); } return 0; - }).animate=false; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('kuanshi'); - target.storage.kuanshi2=player; - target.addSkill('kuanshi2'); + }).animate = false; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("kuanshi"); + target.storage.kuanshi2 = player; + target.addSkill("kuanshi2"); } - } + }, }, - kuanshi2:{ + kuanshi2: { /*mark:'character', intro:{ content:'下一次受到超过1点的伤害时,防止此伤害,然后$跳过下个回合的摸牌阶段' },*/ - trigger:{player:'damageBegin4'}, - forced:true, - filter:function(event,player){ - return event.num>1; + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return event.num > 1; }, //priority:-11, - content:function(){ + content: function () { trigger.cancel(); - player.storage.kuanshi2.skip('phaseDraw'); - player.removeSkill('kuanshi2'); + player.storage.kuanshi2.skip("phaseDraw"); + player.removeSkill("kuanshi2"); }, - group:'kuanshi2_remove', - onremove:true, - subSkill:{ - remove:{ - trigger:{global:['phaseZhunbeiBegin','dieAfter']}, - forced:true, - popup:false, - filter:function(event,player){ - return event.player==player.storage.kuanshi2; + group: "kuanshi2_remove", + onremove: true, + subSkill: { + remove: { + trigger: { global: ["phaseZhunbeiBegin", "dieAfter"] }, + forced: true, + popup: false, + filter: function (event, player) { + return event.player == player.storage.kuanshi2; }, - content:function(){ - player.removeSkill('kuanshi2'); - } - } - } - }, - xiashu:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + content: function () { + player.removeSkill("kuanshi2"); + }, + }, }, - content:function(){ - 'step 0' - var maxval=0; - var hs=player.getCards('h'); - for(var i=0;i 0; + }, + content: function () { + "step 0"; + var maxval = 0; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + maxval = Math.max(maxval, get.value(hs[i])); } - player.chooseTarget(get.prompt2('xiashu'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - var maxval=_status.event.maxval; - var dh=target.countCards('h')-player.countCards('h'); - var att=get.attitude(player,target); - if(target.hasSkill('qingjian')) return false; - if(dh<=0) return 0; - if(att>0) return 0.1; - if(maxval>=8) return 0; - if(att==0) return 0.2; - if(dh>=3) return dh; - if(dh==2){ - if(maxval<=7) return dh; - } - if(maxval<=6) return dh; - return 0; - }).set('maxval',maxval); - 'step 1' - if(result.bool){ - player.logSkill('xiashu',result.targets); - event.target=result.targets[0]; - var hs=player.getCards('h'); - player.give(hs,event.target); - } - else{ + player + .chooseTarget(get.prompt2("xiashu"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + var maxval = _status.event.maxval; + var dh = target.countCards("h") - player.countCards("h"); + var att = get.attitude(player, target); + if (target.hasSkill("qingjian")) return false; + if (dh <= 0) return 0; + if (att > 0) return 0.1; + if (maxval >= 8) return 0; + if (att == 0) return 0.2; + if (dh >= 3) return dh; + if (dh == 2) { + if (maxval <= 7) return dh; + } + if (maxval <= 6) return dh; + return 0; + }) + .set("maxval", maxval); + ("step 1"); + if (result.bool) { + player.logSkill("xiashu", result.targets); + event.target = result.targets[0]; + var hs = player.getCards("h"); + player.give(hs, event.target); + } else { event.finish(); } - 'step 2' - var hs=event.target.getCards('h'); - if(!hs.length){ + ("step 2"); + var hs = event.target.getCards("h"); + if (!hs.length) { event.finish(); return; } - hs.sort(function(a,b){ - return get.value(b,player,'raw')-get.value(a,player,'raw'); + hs.sort(function (a, b) { + return get.value(b, player, "raw") - get.value(a, player, "raw"); }); - event.target.chooseCard([1,hs.length],'展示至少一张手牌',true).set('ai',function(card){ - var rand=_status.event.rand; - var list=_status.event.list; - if(_status.event.att){ - if(ui.selected.cards.length>=Math.ceil(list.length/2)) return 0; - var value=get.value(card); - if(_status.event.getParent().player.isHealthy()){ - value+=(get.tag(card,'damage')?1.5:0)+(get.tag(card,'draw')?2:0); + event.target + .chooseCard([1, hs.length], "展示至少一张手牌", true) + .set("ai", function (card) { + var rand = _status.event.rand; + var list = _status.event.list; + if (_status.event.att) { + if (ui.selected.cards.length >= Math.ceil(list.length / 2)) return 0; + var value = get.value(card); + if (_status.event.getParent().player.isHealthy()) { + value += + (get.tag(card, "damage") ? 1.5 : 0) + (get.tag(card, "draw") ? 2 : 0); + } + return value; } - return value; - } - if(ui.selected.cards.length>=Math.floor(list.length/2)) return 0; - return (list.indexOf(card)%2==rand)?1:0; - }).set('rand',(Math.random()<0.6)?1:0).set('list',hs).set('att',get.attitude(event.target,player)>0); - 'step 3' + if (ui.selected.cards.length >= Math.floor(list.length / 2)) return 0; + return list.indexOf(card) % 2 == rand ? 1 : 0; + }) + .set("rand", Math.random() < 0.6 ? 1 : 0) + .set("list", hs) + .set("att", get.attitude(event.target, player) > 0); + ("step 3"); event.target.showCards(result.cards); - event.cards1=result.cards; - event.cards2=event.target.getCards('h',function(card){ + event.cards1 = result.cards; + event.cards2 = event.target.getCards("h", function (card) { return !event.cards1.includes(card); }); - 'step 4' + ("step 4"); var choice; - var num1=event.cards1.length; - var num2=event.cards2.length; - if(get.attitude(event.target,player)>0&&num1>=num2){ - choice=0; - } - else if(num1==num2){ - choice=(Math.random()<0.45)?0:1; - } - else if(num1>num2){ - if(num1-num2==1){ - choice=(Math.random()<0.6)?0:1; + var num1 = event.cards1.length; + var num2 = event.cards2.length; + if (get.attitude(event.target, player) > 0 && num1 >= num2) { + choice = 0; + } else if (num1 == num2) { + choice = Math.random() < 0.45 ? 0 : 1; + } else if (num1 > num2) { + if (num1 - num2 == 1) { + choice = Math.random() < 0.6 ? 0 : 1; + } else { + choice = 0; } - else{ - choice=0; + } else { + if (num2 - num1 == 1) { + choice = Math.random() < 0.6 ? 1 : 0; + } else { + choice = 1; } } - else{ - if(num2-num1==1){ - choice=(Math.random()<0.6)?1:0; - } - else{ - choice=1; - } - } - player.chooseControl(function(event,player){ - return _status.event.choice; - }).set('choiceList',['获得'+get.translation(event.target)+'展示的牌', - '获得'+get.translation(event.target)+'未展示的牌']).set('choice',choice); - 'step 5' - if(result.index==0){ - player.gain(event.cards1,target,'give','bySelf'); - } - else{ - player.gain(event.cards2,target,'giveAuto','bySelf'); + player + .chooseControl(function (event, player) { + return _status.event.choice; + }) + .set("choiceList", [ + "获得" + get.translation(event.target) + "展示的牌", + "获得" + get.translation(event.target) + "未展示的牌", + ]) + .set("choice", choice); + ("step 5"); + if (result.index == 0) { + player.gain(event.cards1, target, "give", "bySelf"); + } else { + player.gain(event.cards2, target, "giveAuto", "bySelf"); } }, - ai:{ - expose:0.1 - } + ai: { + expose: 0.1, + }, }, - sheyan:{ - audio:2, - trigger:{target:'useCardToTarget'}, - filter:function(event,player){ - if(!event.targets||!event.targets.includes(player)) return false; - var info=get.info(event.card); - if(info.type!='trick') return false; - if(info.multitarget) return false; - if(event.targets.length>1) return true; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,event.player,current); + sheyan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + filter: function (event, player) { + if (!event.targets || !event.targets.includes(player)) return false; + var info = get.info(event.card); + if (info.type != "trick") return false; + if (info.multitarget) return false; + if (event.targets.length > 1) return true; + return game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, event.player, current) + ); }); }, - direct:true, - content:function(){ - 'step 0' - var bool1=(trigger.targets.length>1); - var bool2=game.hasPlayer(function(current){ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,trigger.player,current); + direct: true, + content: function () { + "step 0"; + var bool1 = trigger.targets.length > 1; + var bool2 = game.hasPlayer(function (current) { + return ( + !trigger.targets.includes(current) && + lib.filter.targetEnabled2(trigger.card, trigger.player, current) + ); }); - if(bool1&&bool2){ - player.chooseControlList(get.prompt('sheyan'),['为'+get.translation(trigger.card)+'增加一个目标','为'+get.translation(trigger.card)+'减少一个目标'],function(event,player){ - if(_status.event.add) return 0; - return 1; - }).set('add',get.effect(player,trigger.card,trigger.player,player)>=0); - } - else if(bool2){ - event.type='add'; + if (bool1 && bool2) { + player + .chooseControlList( + get.prompt("sheyan"), + [ + "为" + get.translation(trigger.card) + "增加一个目标", + "为" + get.translation(trigger.card) + "减少一个目标", + ], + function (event, player) { + if (_status.event.add) return 0; + return 1; + } + ) + .set("add", get.effect(player, trigger.card, trigger.player, player) >= 0); + } else if (bool2) { + event.type = "add"; event.goto(2); - event.unchosen=true; - } - else{ - event.type='remove'; + event.unchosen = true; + } else { + event.type = "remove"; event.goto(2); - event.unchosen=true; + event.unchosen = true; } - 'step 1' - if(result.control=='cancel2'){ + ("step 1"); + if (result.control == "cancel2") { + event.finish(); + } else if (result.index == 1) { + event.type = "remove"; + } else { + event.type = "add"; + } + ("step 2"); + if (event.type == "add") { + player + .chooseTarget( + event.unchosen ? get.prompt("sheyan") : null, + "为" + get.translation(trigger.card) + "增加一个目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return ( + !trigger.targets.includes(target) && + lib.filter.targetEnabled2(trigger.card, trigger.player, target) + ); + } + ) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, trigger.player, _status.event.player); + }); + } else { + player + .chooseTarget( + event.unchosen ? get.prompt("sheyan") : null, + "为" + get.translation(trigger.card) + "减少一个目标", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + return -get.effect( + target, + trigger.card, + trigger.player, + _status.event.player + ); + }) + .set("targets", trigger.targets); + } + ("step 3"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.target = result.targets[0]; + } else { event.finish(); } - else if(result.index==1){ - event.type='remove'; - } - else{ - event.type='add'; - } - 'step 2' - if(event.type=='add'){ - player.chooseTarget(event.unchosen?get.prompt('sheyan'):null,'为'+get.translation(trigger.card)+'增加一个目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return !trigger.targets.includes(target)&&lib.filter.targetEnabled2(trigger.card,trigger.player,target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - return get.effect(target,trigger.card,trigger.player,_status.event.player); - }); - } - else{ - player.chooseTarget(event.unchosen?get.prompt('sheyan'):null,'为'+get.translation(trigger.card)+'减少一个目标',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - return -get.effect(target,trigger.card,trigger.player,_status.event.player); - }).set('targets',trigger.targets); - } - 'step 3' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.target=result.targets[0]; - } - else{ - event.finish(); - } - 'step 4' - player.logSkill('sheyan',event.target); - if(event.type=='add'){ + ("step 4"); + player.logSkill("sheyan", event.target); + if (event.type == "add") { trigger.targets.push(event.target); - } - else{ + } else { trigger.getParent().excluded.add(event.target); } }, - ai:{ - expose:0.2 - } + ai: { + expose: 0.2, + }, }, - bingzheng:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('bingzheng'),function(card,player,target){ - return target.countCards('h')!=target.hp; - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - var nh=target.countCards('h'); - if(att>0){ - if(nh==target.hp-1){ - if(player==target) return att+1; - return att+2; + bingzheng: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("bingzheng"), function (card, player, target) { + return target.countCards("h") != target.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var nh = target.countCards("h"); + if (att > 0) { + if (nh == target.hp - 1) { + if (player == target) return att + 1; + return att + 2; + } + if (player == target && player.needsToDiscard()) return att / 3; + return att; + } else { + if (nh == target.hp + 1) return -att; + if (nh == 0) return 0; + return -att / 2; } - if(player==target&&player.needsToDiscard()) return att/3; - return att; + }); + ("step 1"); + if (result.bool) { + player.logSkill("bingzheng", result.targets); + event.target = result.targets[0]; + if (event.target.countCards("h")) { + player + .chooseControl(function (event, player) { + var target = event.target; + if (get.attitude(player, target) < 0) return 1; + return 0; + }) + .set("choiceList", [ + "令" + get.translation(event.target) + "摸一张牌", + "令" + get.translation(event.target) + "弃置一张手牌", + ]); + } else { + event.directfalse = true; } - else{ - if(nh==target.hp+1) return -att; - if(nh==0) return 0; - return -att/2; - } - }); - 'step 1' - if(result.bool){ - player.logSkill('bingzheng',result.targets); - event.target=result.targets[0]; - if(event.target.countCards('h')){ - player.chooseControl(function(event,player){ - var target=event.target; - if(get.attitude(player,target)<0) return 1; - return 0; - }).set('choiceList',['令'+get.translation(event.target)+'摸一张牌', - '令'+get.translation(event.target)+'弃置一张手牌']); - } - else{ - event.directfalse=true; - } - } - else{ + } else { event.finish(); } - 'step 2' - if(event.directfalse||result.index==0){ + ("step 2"); + if (event.directfalse || result.index == 0) { event.target.draw(); + } else { + event.target.chooseToDiscard("h", true); } - else{ - event.target.chooseToDiscard('h',true); - } - 'step 3' - if(event.target.countCards('h')==event.target.hp){ + ("step 3"); + if (event.target.countCards("h") == event.target.hp) { player.draw(); - if(event.target==player){ + if (event.target == player) { event.finish(); return; } - var next=player.chooseCard('是否交给'+get.translation(event.target)+'一张牌?','he'); - next.set('ai',function(card){ - if(get.position(card)!='h') return 0; - if(_status.event.shan&&card.name=='shan'){ + var next = player.chooseCard( + "是否交给" + get.translation(event.target) + "一张牌?", + "he" + ); + next.set("ai", function (card) { + if (get.position(card) != "h") return 0; + if (_status.event.shan && card.name == "shan") { return 11; } - if(_status.event.goon){ - return 10-get.value(card); + if (_status.event.goon) { + return 10 - get.value(card); } - return -get.value(card,_status.event.player,'raw'); + return -get.value(card, _status.event.player, "raw"); }); - if(get.attitude(player,event.target)>1&& - player.countCards('h','shan')>1&&player.countCards('h')>event.target.countCards('h')){ - next.set('shan',true); + if ( + get.attitude(player, event.target) > 1 && + player.countCards("h", "shan") > 1 && + player.countCards("h") > event.target.countCards("h") + ) { + next.set("shan", true); } - if(get.attitude(player,event.target)>0&&player.needsToDiscard()){ - next.set('goon',true); + if (get.attitude(player, event.target) > 0 && player.needsToDiscard()) { + next.set("goon", true); } - } - else{ + } else { event.finish(); } - 'step 4' - if(result.bool){ - player.give(result.cards,target); + ("step 4"); + if (result.bool) { + player.give(result.cards, target); } }, - ai:{ - expose:0.2, - threaten:1.4 - } + ai: { + expose: 0.2, + threaten: 1.4, + }, }, - fuman:{ - audio:2, - enable:'phaseUse', - filterTarget:function(card,player,target){ - if(target==player) return false; - var stat=player.getStat('skill').fuman_targets; - return !stat||!stat.includes(target); + fuman: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { + if (target == player) return false; + var stat = player.getStat("skill").fuman_targets; + return !stat || !stat.includes(target); }, - filter:function(event,player){ - return player.countCards('h')>0&&game.hasPlayer((current)=>lib.skill.fuman.filterTarget(null,player,current)); + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer((current) => lib.skill.fuman.filterTarget(null, player, current)) + ); }, - discard:false, - lose:false, - delay:false, - filterCard:true, - content:function(){ - player.give(cards,target).gaintag.add('fuman'); - target.addSkill('fuman2'); - player.addSkill('fuman_draw'); - var stat=player.getStat('skill'); - if(!stat.fuman_targets) stat.fuman_targets=[]; + discard: false, + lose: false, + delay: false, + filterCard: true, + content: function () { + player.give(cards, target).gaintag.add("fuman"); + target.addSkill("fuman2"); + player.addSkill("fuman_draw"); + var stat = player.getStat("skill"); + if (!stat.fuman_targets) stat.fuman_targets = []; stat.fuman_targets.push(target); }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - ai:{ - order:2, - result:{ - target:function(player,target){ - if(!target.hasSha()) return 1.2; + ai: { + order: 2, + result: { + target: function (player, target) { + if (!target.hasSha()) return 1.2; return 1; - } - } + }, + }, }, - subSkill:{ - draw:{ - trigger:{global:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.player.hasHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('fuman')) return true; + subSkill: { + draw: { + trigger: { global: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("fuman")) return true; } return false; }); }, - logTarget:'player', - content:function(){ - player.draw(trigger.player.hasHistory('sourceDamage',function(evt){ - return evt.card==trigger.card; - })?2:1); + logTarget: "player", + content: function () { + player.draw( + trigger.player.hasHistory("sourceDamage", function (evt) { + return evt.card == trigger.card; + }) + ? 2 + : 1 + ); }, }, }, }, - fuman2:{ - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('fuman')) return num+1; + fuman2: { + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("fuman")) return num + 1; }, - cardname:function(card,player){ - if(get.itemtype(card)=='card'&&card.hasGaintag('fuman')) return 'sha'; + cardname: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("fuman")) return "sha"; }, }, }, - qizhou:{ - trigger:{player:['phaseBefore','equipEnd','loseEnd']}, - forced:true, - popup:false, - derivation:['mashu','reyingzi','reduanbing','fenwei'], - filter:function(event,player){ - if(player.equiping) return false; - var suits=[]; - var es=player.getCards('e'); - for(var i=0;i0; + if (player.additionalSkills.qizhou) { + return player.additionalSkills.qizhou.length != suits.length; + } else { + return suits.length > 0; } }, - content:function(){ - var suits=[]; - var es=player.getCards('e'); - for(var i=0;i0; - } - if(player.hasSha()&&geteff(target)){ - var num=game.countPlayer(function(current){ - return current!=player&&get.distance(player,current)<=1&&geteff(current); + var geteff = function (current) { + return ( + player.canUse("sha", current, false, true) && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }; + if (player.hasSha() && geteff(target)) { + var num = game.countPlayer(function (current) { + return ( + current != player && + get.distance(player, current) <= 1 && + geteff(current) + ); }); - if(num==0){ - if(game.hasPlayer(function(current){ - return player.canUse('sha',current)&&geteff(current)&¤t!=target; - })){ + if (num == 0) { + if ( + game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + geteff(current) && + current != target + ); + }) + ) { return 1; } - } - else if(num==1){ + } else if (num == 1) { return 1; } } return 0; - } - } - } - }, - fenxun2:{ - mark:'character', - onremove:true, - intro:{ - content:'到$的距离视为1' + }, + }, }, - mod:{ - globalFrom:function(from,to){ - if(from.getStorage('fenxun2').includes(to)){ + }, + fenxun2: { + mark: "character", + onremove: true, + intro: { + content: "到$的距离视为1", + }, + mod: { + globalFrom: function (from, to) { + if (from.getStorage("fenxun2").includes(to)) { return -Infinity; } - } - } + }, + }, }, - duanbing:{ - audio:2, - audioname:['heqi'], - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&get.distance(player,current)<=1&&player.canUse(event.card,current); + duanbing: { + audio: 2, + audioname: ["heqi"], + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + get.distance(player, current) <= 1 && + player.canUse(event.card, current) + ); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('duanbing'),'为'+get.translation(trigger.card)+'增加一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&get.distance(player,target)<=1&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.target=result.targets[0]; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("duanbing"), + "为" + get.translation(trigger.card) + "增加一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + get.distance(player, target) <= 1 && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.target = result.targets[0]; + } else { event.finish(); } - 'step 2' - player.logSkill('duanbing',event.target); + ("step 2"); + player.logSkill("duanbing", event.target); trigger.targets.push(event.target); }, - ai:{ - effect:{ - player:function(card,player,target,current,isLink){ - if(!isLink&&card.name=='sha'){ - if(player._duanbingtmp) return; - player._duanbingtmp=true; - if(get.effect(target,card,player,player)<=0){ + ai: { + effect: { + player: function (card, player, target, current, isLink) { + if (!isLink && card.name == "sha") { + if (player._duanbingtmp) return; + player._duanbingtmp = true; + if (get.effect(target, card, player, player) <= 0) { delete player._duanbingtmp; return; } - if(game.hasPlayer(function(current){ - return current!=target&&get.distance(player,current)<=1&& - player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ + if ( + game.hasPlayer(function (current) { + return ( + current != target && + get.distance(player, current) <= 1 && + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { delete player._duanbingtmp; - return [1,1]; + return [1, 1]; } delete player._duanbingtmp; } - } - } - } + }, + }, + }, }, - fuhan:{ - audio:2, - trigger:{player:'phaseBegin'}, - unique:true, - limited:true, - skillAnimation:true, - animationColor:'orange', - forceunique:true, - filter:function(event,player){ - return player.storage.fanghun2>0; + fuhan: { + audio: 2, + trigger: { player: "phaseBegin" }, + unique: true, + limited: true, + skillAnimation: true, + animationColor: "orange", + forceunique: true, + filter: function (event, player) { + return player.storage.fanghun2 > 0; }, - prompt:function(event,player){ - var num=Math.max(2,player.storage.fanghun2||0); - num=Math.min(num,8); - return get.prompt('fuhan')+'(体力上限:'+num+')'; + prompt: function (event, player) { + var num = Math.max(2, player.storage.fanghun2 || 0); + num = Math.min(num, 8); + return get.prompt("fuhan") + "(体力上限:" + num + ")"; }, - check:function(event,player){ - var num=Math.max(2,player.storage.fanghun2||0); - if(num==1) return false; - if(player.hp<=1) return true; - if(num==2) return false; - if(num==3) return player.hp<3&&player.isMinHp(); + check: function (event, player) { + var num = Math.max(2, player.storage.fanghun2 || 0); + if (num == 1) return false; + if (player.hp <= 1) return true; + if (num == 2) return false; + if (num == 3) return player.hp < 3 && player.isMinHp(); return true; }, - content:function(){ - 'step 0' - if(player.storage.fanghun) player.draw(player.storage.fanghun); - player.removeMark('fanghun',player.storage.fanghun); - event.num=Math.max(2,player.storage.fanghun2||0); + content: function () { + "step 0"; + if (player.storage.fanghun) player.draw(player.storage.fanghun); + player.removeMark("fanghun", player.storage.fanghun); + event.num = Math.max(2, player.storage.fanghun2 || 0); var list; - if(_status.characterlist){ - list=[]; - for(var i=0;i<_status.characterlist.length;i++){ - var name=_status.characterlist[i]; - if(lib.character[name][1]=='shu') list.push(name); + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if (lib.character[name][1] == "shu") list.push(name); } - } - else if(_status.connectMode){ - list=get.charactersOL(function(i){ - return lib.character[i][1]!='shu'; + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][1] != "shu"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "shu"; }); } - else{ - list=get.gainableCharacters(function(info){ - return info[1]=='shu'; - }); - } - var players=game.players.concat(game.dead); - for(var i=0;i0) player.gainMaxHp(num); + player + .chooseButton(true) + .set("ai", function (button) { + return get.rank(button.link, true) - lib.character[button.link][2]; + }) + .set("createDialog", ["将武将牌替换为一名角色", [list.randomGets(5), "character"]]); + player.awakenSkill("fuhan"); + ("step 1"); + event.num = Math.min(event.num, 8); + player.reinitCharacter("zhaoxiang", result.links[0]); + ("step 2"); + var num = event.num - player.maxHp; + if (num > 0) player.gainMaxHp(num); else player.loseMaxHp(-num); player.recover(); }, - ai:{ - combo:'fanghun' - } - }, - refuhan:{ - audio:'fuhan', - trigger:{player:'phaseZhunbeiBegin'}, - unique:true, - limited:true, - skillAnimation:true, - animationColor:'orange', - forceunique:true, - filter:function(event,player){ - return player.countMark('fanghun')>0; + ai: { + combo: "fanghun", }, - content:function(){ - 'step 0' - if(player.storage.fanghun) player.draw(player.storage.fanghun); - player.removeMark('fanghun',player.storage.fanghun); - player.awakenSkill('refuhan'); - 'step 1' + }, + refuhan: { + audio: "fuhan", + trigger: { player: "phaseZhunbeiBegin" }, + unique: true, + limited: true, + skillAnimation: true, + animationColor: "orange", + forceunique: true, + filter: function (event, player) { + return player.countMark("fanghun") > 0; + }, + content: function () { + "step 0"; + if (player.storage.fanghun) player.draw(player.storage.fanghun); + player.removeMark("fanghun", player.storage.fanghun); + player.awakenSkill("refuhan"); + ("step 1"); var list; - if(_status.characterlist){ - list=[]; - for(var i=0;i<_status.characterlist.length;i++){ - var name=_status.characterlist[i]; - if(lib.character[name][1]=='shu') list.push(name); + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if (lib.character[name][1] == "shu") list.push(name); } - } - else if(_status.connectMode){ - list=get.charactersOL(function(i){ - return lib.character[i][1]!='shu'; + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][1] != "shu"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "shu"; }); } - else{ - list=get.gainableCharacters(function(info){ - return info[1]=='shu'; - }); - } - var players=game.players.concat(game.dead); - for(var i=0;i'; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - if(!this.classList.contains('bluebg')){ - if(rSkill.length>=2) return; + td.innerHTML = "" + get.translation(skills[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (!this.classList.contains("bluebg")) { + if (rSkill.length >= 2) return; rSkill.add(link); - this.classList.add('bluebg'); - } - else{ - this.classList.remove('bluebg'); + this.classList.add("bluebg"); + } else { + this.classList.remove("bluebg"); rSkill.remove(link); } }); } dialog.content.appendChild(table); - dialog.add('  '); + dialog.add("  "); dialog.open(); - event.switchToAuto=function(){ + event.switchToAuto = function () { event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }; - event.control=ui.create.control('ok',function(link){ + event.control = ui.create.control("ok", function (link) { event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }); - for(var i=0;i0; - if(name=='jiu') return player.countCards('hs','tao')>0; + fanghun: { + hiddenCard: function (player, name) { + if (!player.storage.fanghun || player.storage.fanghun <= 0) return false; + if (name == "tao") return player.countCards("hs", "jiu") > 0; + if (name == "jiu") return player.countCards("hs", "tao") > 0; return false; }, - audio:2, - marktext:'影', - intro:{ - content:'mark', - name:'梅影', + audio: 2, + marktext: "影", + intro: { + content: "mark", + name: "梅影", }, - trigger:{ - source:'damageSource', - player:'damageEnd', + trigger: { + source: "damageSource", + player: "damageEnd", }, - forced:true, - locked:false, - filter:function(event){ - return event.card&&event.card.name=='sha'; + forced: true, + locked: false, + filter: function (event) { + return event.card && event.card.name == "sha"; }, - content:function(){ - player.addMark('fanghun',trigger.num||1); - player.addMark('fanghun2',trigger.num||1,false); + content: function () { + player.addMark("fanghun", trigger.num || 1); + player.addMark("fanghun2", trigger.num || 1, false); }, - group:['fanghun_sha','fanghun_draw'], - subSkill:{ - draw:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - popup:false, - filter:function(event){ - return event.skill=='fanghun_sha'||event.skill=='fanghun_shan'; + group: ["fanghun_sha", "fanghun_draw"], + subSkill: { + draw: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + filter: function (event) { + return event.skill == "fanghun_sha" || event.skill == "fanghun_shan"; }, - content:function(){ + content: function () { player.draw(); - } + }, }, - sha:{ - audio:'fanghun', - inherit:'ollongdan', - enable:['chooseToUse','chooseToRespond'], - prompt:'弃置一枚【梅影】标记,将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出', - filter:function(event,player){ - return player.hasMark('fanghun')&&get.info('ollongdan').filter(event,player); + sha: { + audio: "fanghun", + inherit: "ollongdan", + enable: ["chooseToUse", "chooseToRespond"], + prompt: "弃置一枚【梅影】标记,将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出", + filter: function (event, player) { + return player.hasMark("fanghun") && get.info("ollongdan").filter(event, player); }, - onrespond:function(){return this.onuse.apply(this,arguments)}, - onuse:function(result,player){ - player.removeMark('fanghun',1); + onrespond: function () { + return this.onuse.apply(this, arguments); }, - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ - if(!player.hasMark('fanghun')) return false; - return get.info('ollongdan').ai.skillTagFilter(player,tag); + onuse: function (result, player) { + player.removeMark("fanghun", 1); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + if (!player.hasMark("fanghun")) return false; + return get.info("ollongdan").ai.skillTagFilter(player, tag); }, - order:function(item,player){ - if(!player||!player.storage){ - player=_status.event.player; - if(!player||!player.storage) return 0; - if(Object.keys(player.storage).some(i=>{ - return typeof i=='string'&&i.indexOf('fuhan')!=-1; - })) return 4; + order: function (item, player) { + if (!player || !player.storage) { + player = _status.event.player; + if (!player || !player.storage) return 0; + if ( + Object.keys(player.storage).some((i) => { + return typeof i == "string" && i.indexOf("fuhan") != -1; + }) + ) + return 4; return 1; } - const awakened=Object.keys(player.storage).some(i=>typeof i=='string'&&i.indexOf('fuhan')!=-1); - if(_status.event.type=='phase'){ - var max=0; - var list=['sha','tao','jiu']; - var map={sha:'shan',tao:'jiu',jiu:'tao'} - for(var i=0;i(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){ - var temp=get.order({name:name}); - if(temp>max) max=temp; + const awakened = Object.keys(player.storage).some( + (i) => typeof i == "string" && i.indexOf("fuhan") != -1 + ); + if (_status.event.type == "phase") { + var max = 0; + var list = ["sha", "tao", "jiu"]; + var map = { sha: "shan", tao: "jiu", jiu: "tao" }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if ( + player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) && + player.getUseValue({ name: name }) > 0 + ) { + var temp = get.order({ name: name }); + if (temp > max) max = temp; } } - if(max>0) max+=(awakened?0.3:-0.3); + if (max > 0) max += awakened ? 0.3 : -0.3; return max; } - return awakened?4:1; + return awakened ? 4 : 1; }, }, }, - } + }, }, - yjixi:{ - derivation:'rewangzun', - audio:'weidi', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - if(player.phaseNumber<3) return false; - var num=0; - for(var i=player.actionHistory.length-1;i>=0;i--){ - if(!player.actionHistory[i].isMe) continue; - if(_status.globalHistory[i].changeHp.some(evt=>evt.player==player&&evt.getParent().name=='loseHp')) return false; - else{ + yjixi: { + derivation: "rewangzun", + audio: "weidi", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + if (player.phaseNumber < 3) return false; + var num = 0; + for (var i = player.actionHistory.length - 1; i >= 0; i--) { + if (!player.actionHistory[i].isMe) continue; + if ( + _status.globalHistory[i].changeHp.some( + (evt) => evt.player == player && evt.getParent().name == "loseHp" + ) + ) + return false; + else { num++; - if(num>=3) break; + if (num >= 3) break; } } return true; }, - skillAnimation:true, - animationColor:'gray', - unique:true, - juexingji:true, - content:function(){ - 'step 0' - player.awakenSkill('yjixi'); + skillAnimation: true, + animationColor: "gray", + unique: true, + juexingji: true, + content: function () { + "step 0"; + player.awakenSkill("yjixi"); player.gainMaxHp(); player.recover(); - 'step 1' - var str='摸两张牌'; - var mode=get.mode(); - var choice='选项一'; - if(mode=='identity'||(mode=='versus'&&_status.mode=='four')){ - var list=[]; - var zhu=get.zhu(player); - if(zhu&&zhu!=player&&zhu.skills){ - for(var i=0;i=6) return 0; - return 20-num; - } - else{ - if(_status.event.player.needsToDiscard()) return 7-num; + check: function (card) { + var num = get.value(card); + if (get.color(card) == "black") { + if (num >= 6) return 0; + return 20 - num; + } else { + if (_status.event.player.needsToDiscard()) return 7 - num; } return 0; }, - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - player.give(cards,target); - if(get.color(cards[0])=='black'){ - target.chooseToDiscard(2,'he','弃置两张牌,或令'+get.translation(player)+'摸两张牌').set('ai',function(card){ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).set('goon',get.attitude(target,player)<0); - } - else{ + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target); + if (get.color(cards[0]) == "black") { + target + .chooseToDiscard( + 2, + "he", + "弃置两张牌,或令" + get.translation(player) + "摸两张牌" + ) + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) < 0); + } else { event.finish(); } - 'step 1' - if(!result.bool){ + ("step 1"); + if (!result.bool) { player.draw(2); } }, - ai:{ - order:8, - expose:0.2, - result:{ - target:function(player,target){ - if(ui.selected.cards.length&&get.color(ui.selected.cards[0])=='red'){ - if(target.countCards('h')0; + if (event.player != player) { + var hs = event.player.getCards("h"); + var evt = event.getl(player); + return ( + evt && + evt.cards2 && + evt.cards2.filter(function (card) { + return hs.includes(card) && get.color(card, player) == "black"; + }).length > 0 + ); } return false; }, - content:function(){ - var cards=trigger.getl(player).cards2; - game.countPlayer(function(current){ - if(current==player) return; - var hs=current.getCards('h'),cardsx=trigger.getg(current).filter(function(card){ - return hs.includes(card)&&cards.includes(card)&&get.color(card,player)=='black'; - }); - if(cardsx.length>0){ - current.addSkill('xiehui2'); - current.addGaintag(cards,'xiehui'); + content: function () { + var cards = trigger.getl(player).cards2; + game.countPlayer(function (current) { + if (current == player) return; + var hs = current.getCards("h"), + cardsx = trigger.getg(current).filter(function (card) { + return ( + hs.includes(card) && + cards.includes(card) && + get.color(card, player) == "black" + ); + }); + if (cardsx.length > 0) { + current.addSkill("xiehui2"); + current.addGaintag(cards, "xiehui"); } }); - } - }, - xiehui2:{ - mark:true, - intro:{ - content:'不能使用、打出或弃置得到的黑色牌', - }, - mod:{ - cardDiscardable:function(card,player){ - if(card.hasGaintag('xiehui')) return false; - }, - cardEnabled2:function(card,player){ - if(get.itemtype(card)=='card'&&card.hasGaintag('xiehui')) return false; - }, - }, - trigger:{player:'changeHp'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event){ - return event.num<0; - }, - content:function(){ - player.removeSkill('xiehui2'); - }, - onremove:function(player){ - player.removeGaintag('xiehui'); }, }, - shanjia:{ - sync:function(player){ - if(game.online) return; - var history=player.actionHistory; - var num=0; - for(var i=0;i0) player.markSkill('shanjia'); + player.storage.shanjia = num; + if (num > 0) player.markSkill("shanjia"); }, - audio:2, - intro:{ - content:function(storage){ - if(storage==0) return '未使用过装备牌'; - return '已使用过'+storage+'张装备牌'; - } + audio: 2, + intro: { + content: function (storage) { + if (storage == 0) return "未使用过装备牌"; + return "已使用过" + storage + "张装备牌"; + }, }, - group:'shanjia2', - trigger:{player:'phaseUseBegin'}, - frequent:true, - filter:function(event,player){ + group: "shanjia2", + trigger: { player: "phaseUseBegin" }, + frequent: true, + filter: function (event, player) { lib.skill.shanjia.sync(player); - return player.storage.shanjia>0; + return player.storage.shanjia > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; lib.skill.shanjia.sync(player); - player.draw(Math.min(7,player.storage.shanjia)); - 'step 1' - player.chooseToDiscard('he',Math.min(7,player.storage.shanjia),true); - 'step 2' - var useCard=false; - if(result.bool&&result.cards){ - for(var i=0;i0) - })){ - return 6-get.value(card); + shanjia2: { + trigger: { player: "useCard" }, + silent: true, + filter: function (event, player) { + return get.type(event.card) == "equip"; + }, + content: function () { + lib.skill.shanjia.sync(player); + }, + }, + zhanyi: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterCard: true, + position: "he", + check: function (card) { + var player = _status.event.player; + if (player.hp < 3) return 0; + var type = get.type(card, "trick"); + if (type == "trick") { + return 6 - get.value(card); + } else if (type == "equip") { + if ( + player.hasSha() && + game.hasPlayer(function (current) { + return ( + player.canUse("sha", current) && + get.attitude(player, current) < 0 && + get.effect(current, { name: "sha" }, player, player) > 0 + ); + }) + ) { + return 6 - get.value(card); } } return 0; }, - content:function(){ + content: function () { player.loseHp(); - switch(get.type(cards[0],'trick')){ - case 'basic':player.addTempSkill('zhanyi_basic');break; - case 'equip':player.addTempSkill('zhanyi_equip');break; - case 'trick':player.addTempSkill('zhanyi_trick');player.draw(2);break; + switch (get.type(cards[0], "trick")) { + case "basic": + player.addTempSkill("zhanyi_basic"); + break; + case "equip": + player.addTempSkill("zhanyi_equip"); + break; + case "trick": + player.addTempSkill("zhanyi_trick"); + player.draw(2); + break; } }, - ai:{ - order:9.1, - result:{ - player:1 - } - } - }, - zhanyi_basic:{ - group:['zhanyi_basic_sha','zhanyi_basic_jiu','zhanyi_basic_tao'] - }, - zhanyi_basic_tao:{ - enable:'chooseToUse', - filterCard:{type:'basic'}, - viewAs:{name:'tao'}, - viewAsFilter:function(player){ - if(!player.countCards('h',{type:'basic'})) return false; - }, - prompt:'将一张基本牌当桃使用', - check:function(card){ - return 8-get.value(card); - }, - ai:{ - skillTagFilter:function(player){ - if(!player.countCards('h',{type:'basic'})) return false; + ai: { + order: 9.1, + result: { + player: 1, }, - save:true, - } - }, - zhanyi_basic_sha:{ - enable:'chooseToUse', - filterCard:{type:'basic'}, - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - if(!player.countCards('h',{type:'basic'})) return false; }, - prompt:'将一张基本牌当杀使用', - check:function(card){return 4-get.value(card)}, - ai:{ - skillTagFilter:function(player){ - if(!player.countCards('h',{type:'basic'})) return false; + }, + zhanyi_basic: { + group: ["zhanyi_basic_sha", "zhanyi_basic_jiu", "zhanyi_basic_tao"], + }, + zhanyi_basic_tao: { + enable: "chooseToUse", + filterCard: { type: "basic" }, + viewAs: { name: "tao" }, + viewAsFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; + }, + prompt: "将一张基本牌当桃使用", + check: function (card) { + return 8 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; }, - respondSha:true, - } + save: true, + }, }, - zhanyi_basic_jiu:{ - enable:'chooseToUse', - filterCard:{type:'basic'}, - viewAs:{name:'jiu'}, - viewAsFilter:function(player){ - if(!player.countCards('h',{type:'basic'})) return false; + zhanyi_basic_sha: { + enable: "chooseToUse", + filterCard: { type: "basic" }, + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; }, - prompt:'将一张基本牌当酒使用', - check:function(card){ - if(_status.event.type=='dying') return 1; - return 4-get.value(card); + prompt: "将一张基本牌当杀使用", + check: function (card) { + return 4 - get.value(card); }, - ai:{ - skillTagFilter:function(player){ - return player.countCards('h',{type:'basic'})>0&&player.hp<=0; + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; }, - save:true, - } - }, - zhanyi_equip:{ - trigger:{player:'shaBegin'}, - forced:true, - filter:function(event,player){ - return event.target.countCards('he')>0; + respondSha: true, }, - check:function(event,player){ - return get.attitude(player,event.target)<0; - }, - content:function(){ - trigger.target.chooseToDiscard('he',true,2); - } }, - zhanyi_trick:{ - mod:{ - targetInRange:function(){ + zhanyi_basic_jiu: { + enable: "chooseToUse", + filterCard: { type: "basic" }, + viewAs: { name: "jiu" }, + viewAsFilter: function (player) { + if (!player.countCards("h", { type: "basic" })) return false; + }, + prompt: "将一张基本牌当酒使用", + check: function (card) { + if (_status.event.type == "dying") return 1; + return 4 - get.value(card); + }, + ai: { + skillTagFilter: function (player) { + return player.countCards("h", { type: "basic" }) > 0 && player.hp <= 0; + }, + save: true, + }, + }, + zhanyi_equip: { + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event, player) { + return event.target.countCards("he") > 0; + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + content: function () { + trigger.target.chooseToDiscard("he", true, 2); + }, + }, + zhanyi_trick: { + mod: { + targetInRange: function () { return true; - } - } + }, + }, }, - dingpan:{ - enable:'phaseUse', - filter:function(event,player){ + dingpan: { + enable: "phaseUse", + filter: function (event, player) { var num; - var mode=get.mode(); - if(mode=='identity'||mode=='doudizhu'){ - if(mode=='identity'&&_status.mode=='purple') num=player.getEnemies().length; - else num=get.population('fan'); - } - else if(mode=='versus'){ - if(!_status.mode||_status.mode!='two') num=player.getEnemies().length; - else{ - var target=game.findPlayer(x=>{ - var num=x.getFriends().length; - return !game.hasPlayer(y=>{ - return x!=y&&y.getFriends().length>num; + var mode = get.mode(); + if (mode == "identity" || mode == "doudizhu") { + if (mode == "identity" && _status.mode == "purple") num = player.getEnemies().length; + else num = get.population("fan"); + } else if (mode == "versus") { + if (!_status.mode || _status.mode != "two") num = player.getEnemies().length; + else { + var target = game.findPlayer((x) => { + var num = x.getFriends().length; + return !game.hasPlayer((y) => { + return x != y && y.getFriends().length > num; }); }); - num=(target?target.getFriends(true).length:1); + num = target ? target.getFriends(true).length : 1; } + } else { + num = 1; } - else{ - num=1; - } - if((player.getStat().skill.dingpan||0)>=num) return false; + if ((player.getStat().skill.dingpan || 0) >= num) return false; return true; }, - filterTarget:function(card,player,target){ - return target.countCards('e')>0; + filterTarget: function (card, player, target) { + return target.countCards("e") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; target.draw(); - 'step 1' - var goon=get.damageEffect(target,player,target)>=0; - if(!goon&&target.hp>=4&&get.attitude(player,target)<0){ - var es=target.getCards('e'); - for(var i=0;i=8){ - goon=true;break; + ("step 1"); + var goon = get.damageEffect(target, player, target) >= 0; + if (!goon && target.hp >= 4 && get.attitude(player, target) < 0) { + var es = target.getCards("e"); + for (var i = 0; i < es.length; i++) { + if (get.equipValue(es[i], target) >= 8) { + goon = true; + break; } } } - target.chooseControl(function(){ - if(_status.event.goon) return '选项二'; - return '选项一'; - }).set('goon',goon).set('prompt','定叛').set('choiceList',['令'+get.translation(player)+'弃置你装备区里的一张牌','获得你装备区内的所有牌并受到1点伤害']); - 'step 2' - if(result.control=='选项一'){ - player.discardPlayerCard(target,true,'e'); + target + .chooseControl(function () { + if (_status.event.goon) return "选项二"; + return "选项一"; + }) + .set("goon", goon) + .set("prompt", "定叛") + .set("choiceList", [ + "令" + get.translation(player) + "弃置你装备区里的一张牌", + "获得你装备区内的所有牌并受到1点伤害", + ]); + ("step 2"); + if (result.control == "选项一") { + player.discardPlayerCard(target, true, "e"); event.finish(); + } else { + target.gain(target.getCards("e"), "gain2"); } - else{ - target.gain(target.getCards('e'),'gain2'); - } - 'step 3' + ("step 3"); game.delay(0.5); target.damage(); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(get.damageEffect(target,player,target)>=0) return 2; - var att=get.attitude(player,target); - if(att==0) return 0; - var es=target.getCards('e'); - if(att>0&&(target.countCards('h')>2||target.needsToDiscard(1))) return 0; - if(es.length==1&&att>0) return 0; - for(var i=0;i0){ + ai: { + order: 7, + result: { + target: function (player, target) { + if (get.damageEffect(target, player, target) >= 0) return 2; + var att = get.attitude(player, target); + if (att == 0) return 0; + var es = target.getCards("e"); + if (att > 0 && (target.countCards("h") > 2 || target.needsToDiscard(1))) return 0; + if (es.length == 1 && att > 0) return 0; + for (var i = 0; i < es.length; i++) { + var val = get.equipValue(es[i], target); + if (val <= 4) { + if (att > 0) { return 1; } - } - else if(val>=7){ - if(att<0){ + } else if (val >= 7) { + if (att < 0) { return -1; } } } return 0; - } - } - } + }, + }, + }, }, - hongde:{ - audio:2, - trigger:{ - player:['loseAfter','gainAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + hongde: { + audio: 2, + trigger: { + player: ["loseAfter", "gainAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - filter:function(event,player){ - var num=event.getl(player).cards2.length; - if(event.getg) num=Math.max(num,event.getg(player).length) - return num>1; + direct: true, + filter: function (event, player) { + var num = event.getl(player).cards2.length; + if (event.getg) num = Math.max(num, event.getg(player).length); + return num > 1; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('hongde'),'令一名其他角色摸一张牌',function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - return get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - player.logSkill('hongde',result.targets); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("hongde"), + "令一名其他角色摸一张牌", + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + return get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + player.logSkill("hongde", result.targets); result.targets[0].draw(); } - } + }, }, - ziyuan:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:function(card){ - var num=0; - for(var i=0;i0); - })){ + ai: { + order: function (skill, player) { + if ( + game.hasPlayer(function (current) { + return ( + current.hp < current.maxHp && + current != player && + get.recoverEffect(current, player, player) > 0 + ); + }) + ) { return 10; } return 1; }, - result:{ - player:function(player,target){ - if(get.attitude(player,target)<0) return -1; - var eff=get.recoverEffect(target,player,player); - if(eff<0) return 0; - if(eff>0){ - if(target.hp==1) return 3; + result: { + player: function (player, target) { + if (get.attitude(player, target) < 0) return -1; + var eff = get.recoverEffect(target, player, player); + if (eff < 0) return 0; + if (eff > 0) { + if (target.hp == 1) return 3; return 2; } - if(player.needsToDiscard()) return 1; + if (player.needsToDiscard()) return 1; return 0; - } + }, }, - threaten:1.3 - } + threaten: 1.3, + }, }, - jugu:{ - audio:2, - mod:{ - maxHandcard:function(player,num){ - return num+player.maxHp; - } + jugu: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + player.maxHp; + }, }, - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ + content: function () { player.draw(player.maxHp); - } - }, - tuifeng:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - notemp:true, - filter:function(event,player){ - return player.countCards('he')>0; }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt2('tuifeng'),'he',[1,trigger.num]).set('ai',function(card){ - if(card.name=='du') return 20; - return 7-get.useful(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('tuifeng'); - player.addToExpansion(result.cards,player,'give').gaintag.add('tuifeng'); + }, + tuifeng: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + notemp: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseCard(get.prompt2("tuifeng"), "he", [1, trigger.num]) + .set("ai", function (card) { + if (card.name == "du") return 20; + return 7 - get.useful(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("tuifeng"); + player.addToExpansion(result.cards, player, "give").gaintag.add("tuifeng"); } }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - marktext:'锋', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "锋", + intro: { + content: "expansion", + markcount: "expansion", + }, + group: "tuifeng2", + ai: { + threaten: 0.8, + maixie: true, + maixie_hp: true, }, - group:'tuifeng2', - ai:{ - threaten:0.8, - maixie:true, - maixie_hp:true - } }, - tuifeng2:{ - audio:'tuifeng', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.getExpansions('tuifeng').length>0; + tuifeng2: { + audio: "tuifeng", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.getExpansions("tuifeng").length > 0; }, - content:function(){ - var cards=player.getExpansions('tuifeng'); - player.draw(2*cards.length); - player.addTempSkill('tuifeng3'); - player.addMark('tuifeng3',cards.length,false); + content: function () { + var cards = player.getExpansions("tuifeng"); + player.draw(2 * cards.length); + player.addTempSkill("tuifeng3"); + player.addMark("tuifeng3", cards.length, false); player.loseToDiscardpile(cards); - } - }, - tuifeng3:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('tuifeng3'); - } }, - onremove:true, - charlotte:true, }, - weidi:{ - init(player){ - const list=[]; - const zhu=get.zhu(player); - if(zhu&&zhu!=player&&zhu.skills){ - for(var i=0;i { - return lib.skill[skill] && lib.skill[skill].zhuSkill; - }) || event.addSkill.some(skill => { - return lib.skill[skill] && lib.skill[skill].zhuSkill; - })); + if (event.name == "gameStart") return true; + return ( + event.player == zhu && + (event.addSkill.some((skill) => { + return lib.skill[skill] && lib.skill[skill].zhuSkill; + }) || + event.addSkill.some((skill) => { + return lib.skill[skill] && lib.skill[skill].zhuSkill; + })) + ); }, - async content (event, trigger, player) { + async content(event, trigger, player) { lib.skill.weidi.init(player); }, }, - zhenlue:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter:function(event){ - return get.type(event.card)=='trick'; + zhenlue: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event) { + return get.type(event.card) == "trick"; }, - content:function(){ - trigger.nowuxie=true; + content: function () { + trigger.nowuxie = true; }, - mod:{ - targetEnabled:function(card,player,target){ - if(get.type(card)=='delay'){ + mod: { + targetEnabled: function (card, player, target) { + if (get.type(card) == "delay") { return false; } }, - } + }, }, - jianshu:{ - audio:2, - unique:true, - limited:true, - enable:'phaseUse', - animationColor:'thunder', - skillAnimation:'epic', - filter:function(event,player){ - return !player.storage.jianshu&&player.countCards('h',{color:'black'})>0; + jianshu: { + audio: 2, + unique: true, + limited: true, + enable: "phaseUse", + animationColor: "thunder", + skillAnimation: "epic", + filter: function (event, player) { + return !player.storage.jianshu && player.countCards("h", { color: "black" }) > 0; }, - init:function(player){ - player.storage.jianshu=false; + init: function (player) { + player.storage.jianshu = false; }, - filterTarget:function(card,player,target){ - if(target==player) return false; - if(ui.selected.targets.length){ - return ui.selected.targets[0]!=target&&!ui.selected.targets[0].hasSkillTag('noCompareSource')&&target.countCards('h') - &&!target.hasSkillTag('noCompareTarget'); + filterTarget: function (card, player, target) { + if (target == player) return false; + if (ui.selected.targets.length) { + return ( + ui.selected.targets[0] != target && + !ui.selected.targets[0].hasSkillTag("noCompareSource") && + target.countCards("h") && + !target.hasSkillTag("noCompareTarget") + ); } return true; }, - filterCard:{color:'black'}, - mark:true, - discard:false, - lose:false, - delay:false, - check:function(card){ - if(_status.event.player.hp==1) return 8-get.value(card); - return 6-get.value(card); + filterCard: { color: "black" }, + mark: true, + discard: false, + lose: false, + delay: false, + check: function (card) { + if (_status.event.player.hp == 1) return 8 - get.value(card); + return 6 - get.value(card); }, - selectTarget:2, - multitarget:true, - content:function(){ - 'step 0' - player.awakenSkill('jianshu'); - player.storage.jianshu=true; - player.give(cards,targets[0],'give'); - 'step 1' + selectTarget: 2, + multitarget: true, + content: function () { + "step 0"; + player.awakenSkill("jianshu"); + player.storage.jianshu = true; + player.give(cards, targets[0], "give"); + ("step 1"); targets[0].chooseToCompare(targets[1]); - 'step 2' - if(result.bool){ - targets[0].chooseToDiscard('he',2,true); + ("step 2"); + if (result.bool) { + targets[0].chooseToDiscard("he", 2, true); targets[1].loseHp(); - } - else if(result.tie){ - targets[0].loseHp() - targets[1].loseHp() - } - else{ - targets[1].chooseToDiscard('he',2,true); + } else if (result.tie) { + targets[0].loseHp(); + targets[1].loseHp(); + } else { + targets[1].chooseToDiscard("he", 2, true); targets[0].loseHp(); } }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - ai:{ - expose:0.4, - order:4, - result:{ - target:function(player,target){ - if(player.hasUnknown()) return 0; - if(ui.selected.targets.length) return -1; + ai: { + expose: 0.4, + order: 4, + result: { + target: function (player, target) { + if (player.hasUnknown()) return 0; + if (ui.selected.targets.length) return -1; return -0.5; - } - } - } + }, + }, + }, }, - yongdi:{ - audio:2, - audioname:['xinping'], - unique:true, - limited:true, - trigger:{player:'phaseZhunbeiBegin'}, - animationColor:'thunder', - skillAnimation:'legend', - mark:true, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('yongdi'),function(card,player,target){ - return (target.hasSex('male')||target.name=='key_yuri')&&target!=player; - }).set('ai',function(target){ - if(!_status.event.goon) return 0; - var player=_status.event.player; - var att=get.attitude(player,target); - if(att<=1) return 0; - var mode=get.mode(); - if(mode=='identity'||(mode=='versus'&&(_status.mode=='four'||_status.mode=='guandu'))){ - if(target.name&&lib.character[target.name]){ - for(var i=0;i{ - if(target.hasSkill(skill)) return false; - var info=get.info(skill); - return info&&info.zhuSkill; + var skills = target.getStockSkills(true, true).filter((skill) => { + if (target.hasSkill(skill)) return false; + var info = get.info(skill); + return info && info.zhuSkill; }); - if(skills.length){ + if (skills.length) { target.addSkills(skills); } } }, - ai:{expose:0.2}, + ai: { expose: 0.2 }, }, - regushe:{ - audio:'gushe', - enable:'phaseUse', - filterTarget:function(card,player,target){ + regushe: { + audio: "gushe", + enable: "phaseUse", + filterTarget: function (card, player, target) { return player.canCompare(target); }, - selectTarget:[1,3], - filter:function(event,player){ - return (player.countMark('regushe')+player.countMark('regushe2')<7)&&player.countCards('h')>0; + selectTarget: [1, 3], + filter: function (event, player) { + return ( + player.countMark("regushe") + player.countMark("regushe2") < 7 && + player.countCards("h") > 0 + ); }, - multitarget:true, - multiline:true, - content:function(){ - player.addTempSkill('regushe2'); - player.chooseToCompare(targets).callback=lib.skill.regushe.callback; + multitarget: true, + multiline: true, + content: function () { + player.addTempSkill("regushe2"); + player.chooseToCompare(targets).callback = lib.skill.regushe.callback; }, - intro:{ - name:'饶舌', - content:'mark' + intro: { + name: "饶舌", + content: "mark", }, - callback:function(){ - 'step 0' - if(event.num1<=event.num2){ - target.chat(lib.skill.gushe.chat[player.countMark('regushe')]); + callback: function () { + "step 0"; + if (event.num1 <= event.num2) { + target.chat(lib.skill.gushe.chat[player.countMark("regushe")]); game.delay(); - player.addMark('regushe',1); - if(player.countMark('regushe')>=7){ + player.addMark("regushe", 1); + if (player.countMark("regushe") >= 7) { player.die(); } - } - else player.addMark('regushe2',1,false); - 'step 1' - if(event.num1<=event.num2){ - player.chooseToDiscard('he','弃置一张牌,或摸一张牌').set('ai',function(){return -1;}); - } - else event.goto(3); - 'step 2' - if(!result.bool){ + } else player.addMark("regushe2", 1, false); + ("step 1"); + if (event.num1 <= event.num2) { + player.chooseToDiscard("he", "弃置一张牌,或摸一张牌").set("ai", function () { + return -1; + }); + } else event.goto(3); + ("step 2"); + if (!result.bool) { player.draw(); } - 'step 3' - if(event.num1>=event.num2){ - target.chooseToDiscard('he','弃置一张牌,或令'+get.translation(player)+'摸一张牌').set('ai',function(card){ - if(_status.event.goon) return 6-get.value(card); - return 0; - }).set('goon',get.attitude(target,player)<0); - } - else event.finish(); - 'step 4' - if(!result.bool) player.draw(); + ("step 3"); + if (event.num1 >= event.num2) { + target + .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) < 0); + } else event.finish(); + ("step 4"); + if (!result.bool) player.draw(); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - var num=ui.selected.targets.length+1; - if(num+player.countMark('regushe')<=6) return -1; - var hs=player.getCards('h'); - for(var i=0;i5&&player.countMark('regushe')+num<=6) return -1; + ai: { + order: 7, + result: { + target: function (player, target) { + var num = ui.selected.targets.length + 1; + if (num + player.countMark("regushe") <= 6) return -1; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + if (get.value(hs[i]) <= 6) { + switch (hs[i].number) { + case 13: + return -1; + case 12: + if (player.countMark("regushe") + num <= 8) return -1; + break; + case 11: + if (player.countMark("regushe") + num <= 7) return -1; + break; + default: + if (hs[i].number > 5 && player.countMark("regushe") + num <= 6) + return -1; } } } return 0; }, - } + }, }, - marktext:'饶', + marktext: "饶", }, - regushe2:{ - charlotte:true, - onremove:true, + regushe2: { + charlotte: true, + onremove: true, }, - rejici:{ - audio:'jici', - trigger:{ - player:'compare', - target:'compare', + rejici: { + audio: "jici", + trigger: { + player: "compare", + target: "compare", }, - forced:true, - filter:function(event,player){ + forced: true, + filter: function (event, player) { // if(player!=event.target&&event.iwhile) return false; - return (player==event.player?event.num1:event.num2)<=player.countMark('regushe'); + return (player == event.player ? event.num1 : event.num2) <= player.countMark("regushe"); }, - content:function(){ - if(player==trigger.target||!trigger.iwhile){ - trigger[player==trigger.player?'num1':'num2']+=player.countMark('regushe'); - game.log(player,'的拼点牌点数+'+player.countMark('regushe')); + content: function () { + if (player == trigger.target || !trigger.iwhile) { + trigger[player == trigger.player ? "num1" : "num2"] += player.countMark("regushe"); + game.log(player, "的拼点牌点数+" + player.countMark("regushe")); } game.delayx(); // var cards=[trigger.card1]; @@ -19421,902 +24592,1015 @@ game.import('character', function () { // } // } // cards=cards.filterInD(); - var cards=[]; - if(trigger.num1>trigger.num2) cards.push(trigger.card1); - if(trigger.num1 trigger.num2) cards.push(trigger.card1); + if (trigger.num1 < trigger.num2) cards.push(trigger.card2); + cards = cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); + }, + group: "rejici2", + ai: { + combo: "regushe", }, - group:'rejici2', - ai:{ - combo:'regushe' - } }, - rejici2:{ - audio:'jici', - trigger:{player:'die'}, - forced:true, - forceDie:true, - skillAnimation:true, - animationColor:'water', - filter:function(event,player){ - return event.source&&event.source.isIn(); + rejici2: { + audio: "jici", + trigger: { player: "die" }, + forced: true, + forceDie: true, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + return event.source && event.source.isIn(); }, - logTarget:'source', - content:function(){ - var num=7-player.countMark('regushe'); - if(num>0) trigger.source.chooseToDiscard(num,true,'he'); + logTarget: "source", + content: function () { + var num = 7 - player.countMark("regushe"); + if (num > 0) trigger.source.chooseToDiscard(num, true, "he"); trigger.source.loseHp(); }, }, - gushe:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + gushe: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - selectTarget:[1,3], - filter:function(event,player){ - return player.countCards('h')>0; + selectTarget: [1, 3], + filter: function (event, player) { + return player.countCards("h") > 0; }, - multitarget:true, - multiline:true, - content:function(){ - player.chooseToCompare(targets).callback=lib.skill.gushe.callback; + multitarget: true, + multiline: true, + content: function () { + player.chooseToCompare(targets).callback = lib.skill.gushe.callback; }, - intro:{ - name:'饶舌', - content:'mark' + intro: { + name: "饶舌", + content: "mark", }, - chat:['粗鄙之语','天地不容','谄谀之臣','皓首匹夫,苍髯老贼','二臣贼子','断脊之犬','我从未见过有如此厚颜无耻之人!'], - callback:function(){ - 'step 0' - if(event.num1<=event.num2){ - target.chat(lib.skill.gushe.chat[player.countMark('gushe')]); + chat: [ + "粗鄙之语", + "天地不容", + "谄谀之臣", + "皓首匹夫,苍髯老贼", + "二臣贼子", + "断脊之犬", + "我从未见过有如此厚颜无耻之人!", + ], + callback: function () { + "step 0"; + if (event.num1 <= event.num2) { + target.chat(lib.skill.gushe.chat[player.countMark("gushe")]); game.delay(); - player.addMark('gushe',1); - if(player.countMark('gushe')>=7){ + player.addMark("gushe", 1); + if (player.countMark("gushe") >= 7) { player.die(); } } - 'step 1' - if(event.num1<=event.num2){ - player.chooseToDiscard('he','弃置一张牌,或摸一张牌').set('ai',function(){return -1;}); - } - else event.goto(3); - 'step 2' - if(!result.bool){ + ("step 1"); + if (event.num1 <= event.num2) { + player.chooseToDiscard("he", "弃置一张牌,或摸一张牌").set("ai", function () { + return -1; + }); + } else event.goto(3); + ("step 2"); + if (!result.bool) { player.draw(); } - 'step 3' - if(event.num1>=event.num2){ - target.chooseToDiscard('he','弃置一张牌,或令'+get.translation(player)+'摸一张牌').set('ai',function(card){ - if(_status.event.goon) return 6-get.value(card); - return 0; - }).set('goon',get.attitude(target,player)<0); - } - else event.finish(); - 'step 4' - if(!result.bool) player.draw(); + ("step 3"); + if (event.num1 >= event.num2) { + target + .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") + .set("ai", function (card) { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) < 0); + } else event.finish(); + ("step 4"); + if (!result.bool) player.draw(); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - var num=ui.selected.targets.length+1; - if(num>3) num=3; - var hs=player.getCards('h'); - for(var i=0;i5&&player.countMark('gushe')+num<=6) return -1; + ai: { + order: 7, + result: { + target: function (player, target) { + var num = ui.selected.targets.length + 1; + if (num > 3) num = 3; + var hs = player.getCards("h"); + for (var i = 0; i < hs.length; i++) { + if (get.value(hs[i]) <= 6) { + switch (hs[i].number) { + case 13: + return -1; + case 12: + if (player.countMark("gushe") + num <= 8) return -1; + break; + case 11: + if (player.countMark("gushe") + num <= 7) return -1; + break; + default: + if (hs[i].number > 5 && player.countMark("gushe") + num <= 6) + return -1; } } } return 0; }, - } - } - }, - jici:{ - audio:2, - trigger:{player:'compare'}, - filter:function(event,player){ - return event.getParent().name=='gushe'&&!event.iwhile&&event.num1<=player.countMark('gushe'); + }, }, - content:function(){ - if(trigger.num10; + juesi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", "sha") > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0&&player.inRange(target); + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0 && player.inRange(target); }, - filterCard:{name:'sha'}, - content:function(){ - 'step 0' - target.chooseToDiscard('he',true); - 'step 1' - if(target.hp>=player.hp&&result.bool&&result.cards[0].name!='sha'){ - player.useCard({name:'juedou',isCard:true},target); + filterCard: { name: "sha" }, + content: function () { + "step 0"; + target.chooseToDiscard("he", true); + ("step 1"); + if (target.hp >= player.hp && result.bool && result.cards[0].name != "sha") { + player.useCard({ name: "juedou", isCard: true }, target); } }, - ai:{ - order:2, - result:{ - target:function(player,target){ - if(get.effect(target,{name:'juedou'},player,player)<=0){ + ai: { + order: 2, + result: { + target: function (player, target) { + if (get.effect(target, { name: "juedou" }, player, player) <= 0) { return 0; } - if(target.hpplayer.hp) return -0.1; + if (target.hp < player.hp) { + if (player.countCards("h") > player.hp) return -0.1; return 0; } - var hs1=target.getCards('h','sha'); - var hs2=player.getCards('h','sha'); - if(hs1.length>hs2.length){ + var hs1 = target.getCards("h", "sha"); + var hs2 = player.getCards("h", "sha"); + if (hs1.length > hs2.length) { return 0; } - var hsx=target.getCards('h'); - if(hsx.length>2&&hs2.length<=1&&hsx[0].number<6){ + var hsx = target.getCards("h"); + if (hsx.length > 2 && hs2.length <= 1 && hsx[0].number < 6) { return 0; } - if(hsx.length>3&&hs2.length<=1){ + if (hsx.length > 3 && hs2.length <= 1) { return 0; } - if(hs1.length>hs2.length-1&&hs1.length>0&&(hs2.length<=1||hs1[0].number>hs2[0].number)){ + if ( + hs1.length > hs2.length - 1 && + hs1.length > 0 && + (hs2.length <= 1 || hs1[0].number > hs2[0].number) + ) { return 0; } return -1; - } - } - } - }, - shefu:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - audio:2, - init:function(player){ - if(!player.storage.shefu) player.storage.shefu=[]; - if(!player.storage.shefu2) player.storage.shefu2=[]; - }, - filter:function(event,player){ - return player.countCards('he')>0; - }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); - }, - intro:{ - content:'cards', - onunmark:function(storage,player){ - player.storage.shefu=[]; - player.storage.shefu2=[]; + }, }, - mark:function(dialog,content,player){ - if(content&&content.length){ + }, + }, + shefu: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + init: function (player) { + if (!player.storage.shefu) player.storage.shefu = []; + if (!player.storage.shefu2) player.storage.shefu2 = []; + }, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "cards", + onunmark: function (storage, player) { + player.storage.shefu = []; + player.storage.shefu2 = []; + }, + mark: function (dialog, content, player) { + if (content && content.length) { dialog.addAuto(content); - if(player.isUnderControl(true)){ - var str=''; - for(var i=0;i'+str+'') + dialog.add('
    ' + str + "
    "); } } }, }, - content:function(){ - 'step 0' - var list1=[],list2=[],list3=[]; - for(var i=0;inh2&&event.source.isIn()) return true; - if(nh1 nh2 && event.source.isIn()) return true; + if (nh1 < Math.min(5, nh2)) return true; }, - direct:true, - content:function(){ - "step 0" - var num1=player.countCards('h'); - var num2=trigger.source.countCards('h'); - var eh=player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'benyu'); + direct: true, + content: function () { + "step 0"; + var num1 = player.countCards("h"); + var num2 = trigger.source.countCards("h"); + var eh = player.countCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "benyu"); }); - var bool1=false,bool2=false; - if(num1num2&&trigger.source.isIn()) bool2=true; - if(bool1&&bool2){ - event.chosen=true; - player.chooseControl('cancel2').set('prompt',get.prompt('benyu',trigger.source)).set('choiceList',[ - '将手牌摸至'+get.cnNumber(Math.min(num2,5))+'张', - '弃置至少'+get.cnNumber(num2+1)+'张牌并对其造成1点伤害', - ]) - } - else if(bool2) event.goto(3); - "step 1" - if(event.chosen){ - if(result.control=='cancel2') event.finish(); - else if(result.index==1) event.goto(3); - else event._result={bool:true}; - } - else player.chooseBool(get.prompt('benyu',trigger.source),'将手牌摸至'+get.cnNumber(Math.min(trigger.source.countCards('h'),5))+'张'); - "step 2" - if(result.bool){ - player.logSkill('benyu',trigger.source); - player.drawTo(Math.min(trigger.source.countCards('h'),5)); + var bool1 = false, + bool2 = false; + if (num1 < Math.min(num2, 5)) bool1 = true; + if (eh > num2 && trigger.source.isIn()) bool2 = true; + if (bool1 && bool2) { + event.chosen = true; + player + .chooseControl("cancel2") + .set("prompt", get.prompt("benyu", trigger.source)) + .set("choiceList", [ + "将手牌摸至" + get.cnNumber(Math.min(num2, 5)) + "张", + "弃置至少" + get.cnNumber(num2 + 1) + "张牌并对其造成1点伤害", + ]); + } else if (bool2) event.goto(3); + ("step 1"); + if (event.chosen) { + if (result.control == "cancel2") event.finish(); + else if (result.index == 1) event.goto(3); + else event._result = { bool: true }; + } else + player.chooseBool( + get.prompt("benyu", trigger.source), + "将手牌摸至" + get.cnNumber(Math.min(trigger.source.countCards("h"), 5)) + "张" + ); + ("step 2"); + if (result.bool) { + player.logSkill("benyu", trigger.source); + player.drawTo(Math.min(trigger.source.countCards("h"), 5)); } event.finish(); - "step 3" - var num=trigger.source.countCards('h')+1; - var args=[[num,player.countCards('he')],'he']; - if(event.chosen){ - player.logSkill('benyu',trigger.source); + ("step 3"); + var num = trigger.source.countCards("h") + 1; + var args = [[num, player.countCards("he")], "he"]; + if (event.chosen) { + player.logSkill("benyu", trigger.source); args.push(true); + } else { + args.push(get.prompt("benyu", trigger.source)); + args.push("弃置" + get.cnNumber(num) + "张牌并对其造成1点伤害"); } - else{ - args.push(get.prompt('benyu',trigger.source)); - args.push('弃置'+get.cnNumber(num)+'张牌并对其造成1点伤害'); - } - var next=player.chooseToDiscard.apply(player,args); - if(!event.chosen) next.logSkill=['benyu',trigger.source]; - next.set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - if(ui.selected.cards.length>=_status.event.num){ + var next = player.chooseToDiscard.apply(player, args); + if (!event.chosen) next.logSkill = ["benyu", trigger.source]; + next.set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + if (ui.selected.cards.length >= _status.event.num) { return -1; } - if(get.damageEffect(trigger.source,player,player)>0&&(get.value(card,player)<0||_status.event.num<=2)){ - return 8-get.value(card); + if ( + get.damageEffect(trigger.source, player, player) > 0 && + (get.value(card, player) < 0 || _status.event.num <= 2) + ) { + return 8 - get.value(card); } return -1; }); - next.set('num',num); - "step 4" - if(result.bool) trigger.source.damage(); + next.set("num", num); + ("step 4"); + if (result.bool) trigger.source.damage(); }, }, - jili:{ - audio:2, - trigger:{ - global:'useCardToTarget' + jili: { + audio: 2, + trigger: { + global: "useCardToTarget", }, - forced:true, - check:function(event,player){ - return get.effect(player,event.card,event.player,player)>0; + forced: true, + check: function (event, player) { + return get.effect(player, event.card, event.player, player) > 0; }, - filter:function(event,player){ - if(get.color(event.card)!='red') return false; - if(!event.targets) return false; - if(event.player==player) return false; - if(event.targets.includes(player)) return false; - if(get.info(event.card).multitarget) return false; - var type=get.type(event.card); - if(type!='basic'&&type!='trick') return false; - if(lib.filter.targetEnabled2(event.card,event.player,player)){ - for(var i=0;i0&&!player.hasSkill('zhidao2')&&!get.tag(card,'damage')&&(!lib.filter.targetEnabled(card,player,player)||get.effect(player,card,player)<=0)) return num+10; - } + trigger.player.line(player, "green"); }, - trigger:{source:'damageSource'}, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return _status.currentPhase==player&&event.player.isIn()&& - event.player.countCards('hej')>0&&event.player!=player&&!player.hasSkill('zhidao2'); + }, + zhidao: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + !player.hasSkill("zhidao2") && + !get.tag(card, "damage") && + (!lib.filter.targetEnabled(card, player, player) || + get.effect(player, card, player) <= 0) + ) + return num + 10; + }, }, - forced:true, - content:function(){ - var num=0; - if(trigger.player.countCards('h')) num++; - if(trigger.player.countCards('e')) num++; - if(trigger.player.countCards('j')) num++; - if(num){ - player.gainPlayerCard(trigger.player,num,'hej',true).set('filterButton',function(button){ - for(var i=0;i 0 && + event.player != player && + !player.hasSkill("zhidao2") + ); + }, + forced: true, + content: function () { + var num = 0; + if (trigger.player.countCards("h")) num++; + if (trigger.player.countCards("e")) num++; + if (trigger.player.countCards("j")) num++; + if (num) { + player + .gainPlayerCard(trigger.player, num, "hej", true) + .set("filterButton", function (button) { + for (var i = 0; i < ui.selected.buttons.length; i++) { + if ( + get.position(button.link) == get.position(ui.selected.buttons[i].link) + ) + return false; + } + return true; + }); } - player.addTempSkill('zhidao2'); - } + player.addTempSkill("zhidao2"); + }, }, - zhidao2:{ - mod:{ - playerEnabled:function(card,player,target){ - if(player!=target) return false; - } - } + zhidao2: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, }, - luanzhan:{ - mod:{ - selectTarget:function(card,player,range){ - if(!player.storage.luanzhan) return; - if(range[1]==-1) return; - if(card.name=='sha') range[1]+=player.storage.luanzhan; - if(get.color(card)=='black'&&get.type(card)=='trick'){ - var info=get.info(card); - if(info.multitarget) return false; - range[1]+=player.storage.luanzhan; + luanzhan: { + mod: { + selectTarget: function (card, player, range) { + if (!player.storage.luanzhan) return; + if (range[1] == -1) return; + if (card.name == "sha") range[1] += player.storage.luanzhan; + if (get.color(card) == "black" && get.type(card) == "trick") { + var info = get.info(card); + if (info.multitarget) return false; + range[1] += player.storage.luanzhan; } }, }, - trigger:{source:'damageSource'}, - audio:2, - forced:true, - mark:true, - intro:{ - content:function(storage){ - return '可以额外指定'+storage+'个目标'; + trigger: { source: "damageSource" }, + audio: 2, + forced: true, + mark: true, + intro: { + content: function (storage) { + return "可以额外指定" + storage + "个目标"; + }, + }, + init: function (player) { + player.storage.luanzhan = 0; + }, + init2: function (player) { + player.markSkill("luanzhan"); + }, + content: function () { + if (typeof player.storage.luanzhan == "number") { + player.storage.luanzhan += trigger.num; + } else { + player.storage.luanzhan = trigger.num; + } + if (player.hasSkill("luanzhan")) { + player.markSkill("luanzhan"); } }, - init:function(player){ - player.storage.luanzhan=0; - }, - init2:function(player){ - player.markSkill('luanzhan'); - }, - content:function(){ - if(typeof player.storage.luanzhan=='number'){ - player.storage.luanzhan+=trigger.num; - } - else{ - player.storage.luanzhan=trigger.num; - } - if(player.hasSkill('luanzhan')){ - player.markSkill('luanzhan'); - } - }, - group:'luanzhan_cancel', - subSkill:{ - cancel:{ - audio:'luanzhan', - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(!player.storage.luanzhan) return false; - var check=false; - var card=event.card; - if(card.name=='sha'){ - check=true; - } - else if(get.color(card)=='black'&&get.type(card)=='trick'){ - var info=get.info(card); - if(!info.multitarget){ - check=true; - if(info.selectTarget==-1){ - check=false; - } - else if(Array.isArray(info.selectTarget)&&info.selectTarget[1]==-1){ - check=false; + group: "luanzhan_cancel", + subSkill: { + cancel: { + audio: "luanzhan", + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (!player.storage.luanzhan) return false; + var check = false; + var card = event.card; + if (card.name == "sha") { + check = true; + } else if (get.color(card) == "black" && get.type(card) == "trick") { + var info = get.info(card); + if (!info.multitarget) { + check = true; + if (info.selectTarget == -1) { + check = false; + } else if ( + Array.isArray(info.selectTarget) && + info.selectTarget[1] == -1 + ) { + check = false; } } } - if(check&&event.targets&&event.targets.length!player.hasSkill(skill)); - if(list.length==1) event._result={control:list[0]}; - else if(list.length>0){ - player.chooseControl(list).set('prompt','选择获得一项技能').set('ai',function(){ - if(_status.event.controls.includes('dangxian')) return 'dangxian'; - return _status.event.controls[0]; - }); - } - else event.finish(); - 'step 2' - if(result.control){ + ("step 1"); + var list = lib.skill.zhengnan.derivation.filter((skill) => !player.hasSkill(skill)); + if (list.length == 1) event._result = { control: list[0] }; + else if (list.length > 0) { + player + .chooseControl(list) + .set("prompt", "选择获得一项技能") + .set("ai", function () { + if (_status.event.controls.includes("dangxian")) return "dangxian"; + return _status.event.controls[0]; + }); + } else event.finish(); + ("step 2"); + if (result.control) { player.addSkills(result.control); } }, - ai:{threaten:2}, + ai: { threaten: 2 }, }, - xiefang:{ - mod:{ - globalFrom:function(from,to,distance){ - return distance-game.countPlayer(function(current){ - return current.hasSex('female'); - }); - } - } - }, - qizhi:{ - audio:2, - trigger:{ - player:'useCardToPlayered' + xiefang: { + mod: { + globalFrom: function (from, to, distance) { + return ( + distance - + game.countPlayer(function (current) { + return current.hasSex("female"); + }) + ); + }, }, - direct:true, - filter:function(event,player){ - if(!event.targets) return false; - if(!event.isFirstTarget) return false; - if(_status.currentPhase!=player) return false; - var type=get.type(event.card,'trick'); - if(type!='basic'&&type!='trick') return false; - if(event.noai) return false; - return game.hasPlayer(function(target){ - return !event.targets.includes(target)&&target.countCards('he')>0; + }, + qizhi: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + direct: true, + filter: function (event, player) { + if (!event.targets) return false; + if (!event.isFirstTarget) return false; + if (_status.currentPhase != player) return false; + var type = get.type(event.card, "trick"); + if (type != "basic" && type != "trick") return false; + if (event.noai) return false; + return game.hasPlayer(function (target) { + return !event.targets.includes(target) && target.countCards("he") > 0; }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('qizhi'),'弃置一名角色的一张牌,然后其摸一张牌',function(card,player,target){ - return !_status.event.targets.includes(target)&&target.countCards('he')>0; - }).set('ai',function(target){ - var player=_status.event.player; - if(target==player) return 2; - if(get.attitude(player,target)<=0){ - return 1 - } - return 0.5; - }).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - player.getHistory('custom').push({qizhi:true}); - player.logSkill('qizhi',result.targets); - player.discardPlayerCard(result.targets[0],true,'he'); - event.target=result.targets[0]; - } - else{ + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("qizhi"), + "弃置一名角色的一张牌,然后其摸一张牌", + function (card, player, target) { + return !_status.event.targets.includes(target) && target.countCards("he") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + if (target == player) return 2; + if (get.attitude(player, target) <= 0) { + return 1; + } + return 0.5; + }) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + player.getHistory("custom").push({ qizhi: true }); + player.logSkill("qizhi", result.targets); + player.discardPlayerCard(result.targets[0], true, "he"); + event.target = result.targets[0]; + } else { event.finish(); } - 'step 2' + ("step 2"); event.target.draw(); }, }, - jinqu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - check:function(event,player){ - return player.getHistory('custom',function(evt){ - return evt.qizhi==true; - }).length>=player.countCards('h'); + jinqu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + return ( + player.getHistory("custom", function (evt) { + return evt.qizhi == true; + }).length >= player.countCards("h") + ); }, - prompt:function(event,player){ - var num=player.getHistory('custom',function(evt){ - return evt.qizhi==true; + prompt: function (event, player) { + var num = player.getHistory("custom", function (evt) { + return evt.qizhi == true; }).length; - return '进趋:是否摸两张牌并将手牌弃置至'+get.cnNumber(num)+'张?'; + return "进趋:是否摸两张牌并将手牌弃置至" + get.cnNumber(num) + "张?"; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(2); - 'step 1' - var dh=player.countCards('h')-player.getHistory('custom',function(evt){ - return evt.qizhi==true; - }).length; - if(dh>0){ - player.chooseToDiscard(dh,true); + ("step 1"); + var dh = + player.countCards("h") - + player.getHistory("custom", function (evt) { + return evt.qizhi == true; + }).length; + if (dh > 0) { + player.chooseToDiscard(dh, true); } }, - ai:{combo:'qizhi'}, + ai: { combo: "qizhi" }, }, - jiaozi:{ - audio:2, - trigger:{player:'damageBegin3',source:'damageBegin1'}, - forced:true, - filter:function(event,player){ + jiaozi: { + audio: 2, + trigger: { player: "damageBegin3", source: "damageBegin1" }, + forced: true, + filter: function (event, player) { return player.isMaxHandcard(true); }, - content:function(){ + content: function () { trigger.num++; }, - ai:{presha:true}, + ai: { presha: true }, }, - jiqiao:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0; + jiqiao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; }, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('jiqiao'),[1,player.countCards('he',{type:'equip'})],'he',function(card){ - return get.type(card)=='equip'; - }).set('ai',function(card){ - if(card.name=='bagua') return 10; - return 7-get.value(card); - }).logSkill='jiqiao'; - 'step 1' - if(result.bool){ - event.cards=get.cards(2*result.cards.length); + content: function () { + "step 0"; + player + .chooseToDiscard( + get.prompt2("jiqiao"), + [1, player.countCards("he", { type: "equip" })], + "he", + function (card) { + return get.type(card) == "equip"; + } + ) + .set("ai", function (card) { + if (card.name == "bagua") return 10; + return 7 - get.value(card); + }).logSkill = "jiqiao"; + ("step 1"); + if (result.bool) { + event.cards = get.cards(2 * result.cards.length); player.showCards(event.cards); - } - else{ + } else { event.finish(); } - 'step 2' - var gained=[]; - var tothrow=[]; - for(var i=0;islot=='equip2'||slot=='equip5')) return false; + canBeDiscarded: function (card, source, player) { + if (!player.hasEmptySlot(5)) return; + if ( + get.position(card) == "e" && + get.subtypes(card).some((slot) => slot == "equip2" || slot == "equip5") + ) + return false; }, /*cardDiscardable:function (card,player){ if(player.getEquip(5)) return; if(get.position(card)=='e') return false; },*/ - } + }, }, - linglong_bagua:{ - audio:'linglong', - audioname2:{re_jsp_huangyueying:'relinglong'}, - inherit:'bagua_skill', - filter:function(event,player){ - if(!lib.skill.bagua_skill.filter(event,player)) return false; - if(!player.hasEmptySlot(2)) return false; + linglong_bagua: { + audio: "linglong", + audioname2: { re_jsp_huangyueying: "relinglong" }, + inherit: "bagua_skill", + filter: function (event, player) { + if (!lib.skill.bagua_skill.filter(event, player)) return false; + if (!player.hasEmptySlot(2)) return false; return true; }, - ai:{ - respondShan:true, - freeShan:true, - skillTagFilter(player,tag,arg){ - if(tag!=='respondShan'&&tag!=='freeShan') return; - if(!player.hasEmptySlot(2)||player.hasSkillTag('unequip2')) return false; - if(!arg||!arg.player) return true; - if(arg.player.hasSkillTag('unequip',false,{ - target:player - })) return false; + ai: { + respondShan: true, + freeShan: true, + skillTagFilter(player, tag, arg) { + if (tag !== "respondShan" && tag !== "freeShan") return; + if (!player.hasEmptySlot(2) || player.hasSkillTag("unequip2")) return false; + if (!arg || !arg.player) return true; + if ( + arg.player.hasSkillTag("unequip", false, { + target: player, + }) + ) + return false; return true; }, - effect:{ - target:function(card,player,target){ - if(player==target&&get.subtype(card)=='equip2'){ - if(get.equipValue(card)<=7.5) return 0; + effect: { + target: function (card, player, target) { + if (player == target && get.subtype(card) == "equip2") { + if (get.equipValue(card) <= 7.5) return 0; } - if(target.getEquip(2)) return; - return lib.skill.bagua_skill.ai.effect.target.apply(this,arguments); - } - } + if (target.getEquip(2)) return; + return lib.skill.bagua_skill.ai.effect.target.apply(this, arguments); + }, + }, }, }, - zhenwei:{ - audio:2, - audioname:['re_wenpin'], - trigger:{ - global:'useCardToTarget' + zhenwei: { + audio: 2, + audioname: ["re_wenpin"], + trigger: { + global: "useCardToTarget", }, - direct:true, - filter:function(event,player){ - if(player==event.target||player==event.player) return false; - if(!player.countCards('he')) return false; - if(event.targets.length>1) return false; - if(!event.target) return false; - if(event.target.hp>=player.hp) return false; + direct: true, + filter: function (event, player) { + if (player == event.target || player == event.player) return false; + if (!player.countCards("he")) return false; + if (event.targets.length > 1) return false; + if (!event.target) return false; + if (event.target.hp >= player.hp) return false; - var card=event.card; - if(card.name=='sha') return true; - if(get.color(card)=='black'&&get.type(card,'trick')=='trick') return true; + var card = event.card; + if (card.name == "sha") return true; + if (get.color(card) == "black" && get.type(card, "trick") == "trick") return true; return false; }, - content:function(){ - "step 0" - var save=false; - if(get.attitude(player,trigger.target)>2){ - if(trigger.card.name=='sha'){ - if(player.countCards('h','shan')||player.getEquip(2)|| - trigger.target.hp==1||player.hp>trigger.target.hp+1){ - if(!trigger.target.countCards('h','shan')||trigger.target.countCards('h') 2) { + if (trigger.card.name == "sha") { + if ( + player.countCards("h", "shan") || + player.getEquip(2) || + trigger.target.hp == 1 || + player.hp > trigger.target.hp + 1 + ) { + if ( + !trigger.target.countCards("h", "shan") || + trigger.target.countCards("h") < player.countCards("h") + ) { + save = true; } } - } - else if(trigger.card.name=='juedou'&&trigger.target.hp==1){ - save=true; - } - else if(trigger.card.name=='shunshou'&& - get.attitude(player,trigger.player)<0&& - get.attitude(trigger.player,trigger.target)<0){ - save=true; + } else if (trigger.card.name == "juedou" && trigger.target.hp == 1) { + save = true; + } else if ( + trigger.card.name == "shunshou" && + get.attitude(player, trigger.player) < 0 && + get.attitude(trigger.player, trigger.target) < 0 + ) { + save = true; } } - var next=player.chooseToDiscard('he',get.prompt(event.name,trigger.target),'弃置一张牌,将'+get.translation(trigger.card)+'转移给自己,或令此牌对其无效'); - next.logSkill=[event.name,trigger.target]; - next.set('ai',function(card){ - if(_status.event.aisave){ - return 7-get.value(card); + var next = player.chooseToDiscard( + "he", + get.prompt(event.name, trigger.target), + "弃置一张牌,将" + get.translation(trigger.card) + "转移给自己,或令此牌对其无效" + ); + next.logSkill = [event.name, trigger.target]; + next.set("ai", function (card) { + if (_status.event.aisave) { + return 7 - get.value(card); } return 0; }); - next.set('aisave',save); - "step 1" - if(result.bool){ - player.chooseControl('转移','失效',function(){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - if(trigger.card.name=='sha'){ - if(player.countCards('h','shan')) return '转移'; - } - else if(trigger.card.name=='juedou'){ - if(player.countCards('h','sha')) return '转移'; - } - return '失效'; - }).set('prompt','将'+get.translation(trigger.card)+'转移给你,或令其失效'); - } - else{ + next.set("aisave", save); + ("step 1"); + if (result.bool) { + player + .chooseControl("转移", "失效", function () { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + if (trigger.card.name == "sha") { + if (player.countCards("h", "shan")) return "转移"; + } else if (trigger.card.name == "juedou") { + if (player.countCards("h", "sha")) return "转移"; + } + return "失效"; + }) + .set("prompt", "将" + get.translation(trigger.card) + "转移给你,或令其失效"); + } else { event.finish(); } - "step 2" - if(result.control=='转移'){ + ("step 2"); + if (result.control == "转移") { player.draw(); trigger.getParent().targets.remove(trigger.target); trigger.getParent().triggeredTargets2.remove(trigger.target); @@ -20324,1576 +25608,1791 @@ game.import('character', function () { trigger.untrigger(); trigger.player.line(player); game.delayx(); - } - else{ - var cards=trigger.cards.filterInD(); - if(cards.length>0){ - trigger.player.addSkill('zhenwei2'); - trigger.player.addToExpansion(cards,'gain2').gaintag.add('zhenwei2'); + } else { + var cards = trigger.cards.filterInD(); + if (cards.length > 0) { + trigger.player.addSkill("zhenwei2"); + trigger.player.addToExpansion(cards, "gain2").gaintag.add("zhenwei2"); } - trigger.targets.length=0; - trigger.getParent().triggeredTargets2.length=0; + trigger.targets.length = 0; + trigger.getParent().triggeredTargets2.length = 0; } }, - ai:{ - threaten:1.1 - } + ai: { + threaten: 1.1, + }, }, - zhenwei2:{ - audio:false, - intro:{ - content:'expansion', - markcount:'expansion', + zhenwei2: { + audio: false, + intro: { + content: "expansion", + markcount: "expansion", }, - trigger:{global:'phaseEnd'}, - forced:true, - charlotte:true, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + trigger: { global: "phaseEnd" }, + forced: true, + charlotte: true, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + content: function () { + "step 0"; + var cards = player.getExpansions("zhenwei2"); + if (cards.length) player.gain(cards, "gain2"); + ("step 1"); + player.removeSkill("zhenwei2"); }, - content:function(){ - 'step 0' - var cards=player.getExpansions('zhenwei2'); - if(cards.length) player.gain(cards,'gain2'); - 'step 1' - player.removeSkill('zhenwei2'); - } }, - xunzhi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - locked:false, - init:function(player){ - player.storage.xunzhi=0; + xunzhi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + locked: false, + init: function (player) { + player.storage.xunzhi = 0; }, - filter:function(event,player){ - var previous=player.getPrevious(); - var next=player.getNext(); - if(previous&&next){ - return player.hp!=previous.hp&&player.hp!=next.hp; + filter: function (event, player) { + var previous = player.getPrevious(); + var next = player.getNext(); + if (previous && next) { + return player.hp != previous.hp && player.hp != next.hp; } return false; }, - check:function(event,player){ - return player.hp>=3&&player.countCards('h')>player.hp+1+player.storage.xunzhi; + check: function (event, player) { + return player.hp >= 3 && player.countCards("h") > player.hp + 1 + player.storage.xunzhi; }, - content:function(){ + content: function () { player.loseHp(); - player.storage.xunzhi+=2; + player.storage.xunzhi += 2; }, - mark:true, - intro:{ - content:function(storage,player){ - return '手牌上限+'+player.storage.xunzhi; - } + mark: true, + intro: { + content: function (storage, player) { + return "手牌上限+" + player.storage.xunzhi; + }, }, - mod:{ - maxHandcard:function(player,num){ - if(typeof player.storage.xunzhi=='number'){ - return num+player.storage.xunzhi; + mod: { + maxHandcard: function (player, num) { + if (typeof player.storage.xunzhi == "number") { + return num + player.storage.xunzhi; } - } - } + }, + }, }, - yawang:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - forced:true, - filter:function(event,player){ + yawang: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - check:function(event,player){ - var num=game.countPlayer(function(target){ - return target.hp==player.hp; + check: function (event, player) { + var num = game.countPlayer(function (target) { + return target.hp == player.hp; }); - if(!player.hasSkill('xunzhi2')){ - var nh=player.countCards('h'); - if(nh>5) return false; - if(num==3&&nh>3) return false; + if (!player.hasSkill("xunzhi2")) { + var nh = player.countCards("h"); + if (nh > 5) return false; + if (num == 3 && nh > 3) return false; } - return num>=3; + return num >= 3; }, - content:function(){ + content: function () { trigger.changeToZero(); - var num=game.countPlayer(function(target){ - return target.hp==player.hp; + var num = game.countPlayer(function (target) { + return target.hp == player.hp; }); - if(num){ + if (num) { player.draw(num); } - player.storage.yawang=num; - player.addTempSkill('yawang2'); - } - }, - yawang2:{ - mod:{ - cardEnabled:function(card,player){ - if(_status.currentPhase!=player) return; - if(player.countUsed()>=player.storage.yawang) return false; - }, - cardSavable:function(card,player){ - if(_status.currentPhase!=player) return; - if(player.countUsed()>=player.storage.yawang) return false; - } - } - }, - luoyan_tianxiang:{ - inherit:'tianxiang', - filter:function(event,player){ - if(!player.storage.xingwu||!player.storage.xingwu.length) return false; - if(player.hasSkill('tianxiang')) return false; - return lib.skill.tianxiang.filter(event,player); + player.storage.yawang = num; + player.addTempSkill("yawang2"); }, }, - luoyan_liuli:{ - inherit:'liuli', - filter:function(event,player){ - if(!player.storage.xingwu||!player.storage.xingwu.length) return false; - if(player.hasSkill('liuli')) return false; - return lib.skill.liuli.filter(event,player); + yawang2: { + mod: { + cardEnabled: function (card, player) { + if (_status.currentPhase != player) return; + if (player.countUsed() >= player.storage.yawang) return false; + }, + cardSavable: function (card, player) { + if (_status.currentPhase != player) return; + if (player.countUsed() >= player.storage.yawang) return false; + }, }, }, - luoyan:{ - group:['luoyan_tianxiang','luoyan_liuli'], - ai:{ - combo:'xingwu' - } + luoyan_tianxiang: { + inherit: "tianxiang", + filter: function (event, player) { + if (!player.storage.xingwu || !player.storage.xingwu.length) return false; + if (player.hasSkill("tianxiang")) return false; + return lib.skill.tianxiang.filter(event, player); + }, }, - xingwu:{ - audio:2, - group:['xingwu_color','xingwu_color2'], - subSkill:{ - color:{ - trigger:{player:'phaseZhunbeiBegin'}, - silent:true, - content:function(){ - player.storage.xingwu_color=['black','red']; - } - }, - color2:{ - trigger:{player:'useCard'}, - silent:true, - filter:function(event,player){ - return Array.isArray(player.storage.xingwu_color)&&_status.currentPhase==player; + luoyan_liuli: { + inherit: "liuli", + filter: function (event, player) { + if (!player.storage.xingwu || !player.storage.xingwu.length) return false; + if (player.hasSkill("liuli")) return false; + return lib.skill.liuli.filter(event, player); + }, + }, + luoyan: { + group: ["luoyan_tianxiang", "luoyan_liuli"], + ai: { + combo: "xingwu", + }, + }, + xingwu: { + audio: 2, + group: ["xingwu_color", "xingwu_color2"], + subSkill: { + color: { + trigger: { player: "phaseZhunbeiBegin" }, + silent: true, + content: function () { + player.storage.xingwu_color = ["black", "red"]; }, - content:function(){ + }, + color2: { + trigger: { player: "useCard" }, + silent: true, + filter: function (event, player) { + return ( + Array.isArray(player.storage.xingwu_color) && _status.currentPhase == player + ); + }, + content: function () { player.storage.xingwu_color.remove(get.color(trigger.card)); - } - } + }, + }, }, - trigger:{player:'phaseDiscardBegin'}, - direct:true, - filter:function(event,player){ - if(!player.storage.xingwu_color) return false; - var length=player.storage.xingwu_color.length; - if(length==0) return false; - var hs=player.getCards('h'); - if(hs.length==0) return false; - if(length==2) return true; - var color=player.storage.xingwu_color[0]; - for(var i=0;i0&& - get.attitude(player,current)<0) - })) return 0; + content: function () { + "step 0"; + player + .chooseCard(get.prompt("xingwu"), function (card) { + return _status.event.player.storage.xingwu_color.includes(get.color(card)); + }) + .set("ai", function (card) { + var player = _status.event.player; + if (player.storage.xingwu.length == 2) { + if ( + !game.hasPlayer(function (current) { + return ( + current != player && + current.hasSex("male") && + get.damageEffect(current, player, player) > 0 && + get.attitude(player, current) < 0 + ); + }) + ) + return 0; + } + return 7 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("xingwu"); + if (player.storage.xingwu.length < 2) { + player.$give(result.cards, player); } - return 7-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('xingwu'); - if(player.storage.xingwu.length<2){ - player.$give(result.cards,player); - } - player.lose(result.cards,ui.special); - player.storage.xingwu=player.storage.xingwu.concat(result.cards); - player.markSkill('xingwu'); - player.syncStorage('xingwu'); - } - else{ + player.lose(result.cards, ui.special); + player.storage.xingwu = player.storage.xingwu.concat(result.cards); + player.markSkill("xingwu"); + player.syncStorage("xingwu"); + } else { event.finish(); } - 'step 2' - if(player.storage.xingwu.length==3){ + ("step 2"); + if (player.storage.xingwu.length == 3) { player.$throw(player.storage.xingwu); - while(player.storage.xingwu.length){ + while (player.storage.xingwu.length) { player.storage.xingwu.shift().discard(); } - player.unmarkSkill('xingwu'); - player.chooseTarget(function(card,player,target){ - return target!=player&&target.hasSex('male'); - },'对一名男性角色造成2点伤害并弃置其装备区内的牌').set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>0) return -1; - return get.damageEffect(target,player,player)+target.countCards('e')/2; - }); - } - else{ + player.unmarkSkill("xingwu"); + player + .chooseTarget(function (card, player, target) { + return target != player && target.hasSex("male"); + }, "对一名男性角色造成2点伤害并弃置其装备区内的牌") + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) return -1; + return get.damageEffect(target, player, player) + target.countCards("e") / 2; + }); + } else { event.finish(); } - 'step 3' - if(result.bool){ - var target=result.targets[0]; + ("step 3"); + if (result.bool) { + var target = result.targets[0]; target.damage(2); - event.target=target; - player.line(target,'green'); - } - else{ + event.target = target; + player.line(target, "green"); + } else { event.finish(); } - 'step 4' - if(event.target&&event.target.isIn()){ - var es=event.target.getCards('e'); - if(es.length){ + ("step 4"); + if (event.target && event.target.isIn()) { + var es = event.target.getCards("e"); + if (es.length) { event.target.discard(es); } } }, - ai:{ - threaten:1.5 - } - }, - yinbing:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - audio:2, - preHidden:true, - filter:function(event,player){ - return player.countCards('he',{type:'basic'})0&& - (event.card.name=='sha'||event.card.name=='juedou'); + subSkill: { + discard: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.card && + player.getExpansions("yinbing").length > 0 && + (event.card.name == "sha" || event.card.name == "juedou") + ); }, - content:function(){ - 'step 0' - player.chooseCardButton('移去一张引兵牌',true,player.getExpansions('yinbing')); - 'step 1' - if(result.bool) player.loseToDiscardpile(result.links); - } - } + content: function () { + "step 0"; + player.chooseCardButton("移去一张引兵牌", true, player.getExpansions("yinbing")); + ("step 1"); + if (result.bool) player.loseToDiscardpile(result.links); + }, + }, }, - group:'yinbing_discard' + group: "yinbing_discard", }, - juedi:{ - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.getExpansions('yinbing').length>0; + juedi: { + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("yinbing").length > 0; }, - forced:true, - audio:2, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('juedi'),true,function(card,player,target){ - return player.hp>=target.hp; - }).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(att<2) return att-10; - var num=att/10; - if(target==player){ - num+=player.maxHp-player.countCards('h')+0.5; - } - else{ - num+=_status.event.n2*2; - if(target.isDamaged()){ - if(target.hp==1){ - num+=3; - } - else if(target.hp==2){ - num+=2; - } - else{ - num+=0.5; + forced: true, + audio: 2, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("juedi"), true, function (card, player, target) { + return player.hp >= target.hp; + }) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (att < 2) return att - 10; + var num = att / 10; + if (target == player) { + num += player.maxHp - player.countCards("h") + 0.5; + } else { + num += _status.event.n2 * 2; + if (target.isDamaged()) { + if (target.hp == 1) { + num += 3; + } else if (target.hp == 2) { + num += 2; + } else { + num += 0.5; + } } } - } - if(target.hasJudge('lebu')){ - num/=2; - } - return num; - }).set('n2',player.getExpansions('yinbing').length); - 'step 1' - if(result.bool){ - player.line(result.targets[0],'green'); - var cards=player.getExpansions('yinbing'); - if(result.targets[0]==player){ + if (target.hasJudge("lebu")) { + num /= 2; + } + return num; + }) + .set("n2", player.getExpansions("yinbing").length); + ("step 1"); + if (result.bool) { + player.line(result.targets[0], "green"); + var cards = player.getExpansions("yinbing"); + if (result.targets[0] == player) { player.loseToDiscardpile(cards); - var num=player.maxHp-player.countCards('h'); - if(num>0) player.draw(num); - } - else{ - var target=result.targets[0]; + var num = player.maxHp - player.countCards("h"); + if (num > 0) player.draw(num); + } else { + var target = result.targets[0]; target.recover(); - player.give(cards,target,'give'); + player.give(cards, target, "give"); target.draw(cards.length); } } }, - ai:{ - combo:'yinbing' - } + ai: { + combo: "yinbing", + }, }, - meibu:{ - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return event.player!=player&&get.distance(event.player,player,'attack')>1; + meibu: { + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player != player && get.distance(event.player, player, "attack") > 1; }, - logTarget:'player', - check:function(event,player){ - if(get.attitude(player,event.player)>=0) return false; - var e2=player.getEquip(2); - if(e2){ - if(e2.name=='tengjia'||e2.name=='rewrite_tengjia') return true; - if(e2.name=='bagua'||e2.name=='rewrite_bagua') return true; + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + var e2 = player.getEquip(2); + if (e2) { + if (e2.name == "tengjia" || e2.name == "rewrite_tengjia") return true; + if (e2.name == "bagua" || e2.name == "rewrite_bagua") return true; } - return player.countCards('h','shan')>0; + return player.countCards("h", "shan") > 0; }, - content:function(){ - var target=trigger.player; - target.addTempSkill('meibu_viewas'); - target.addTempSkill('meibu_range'); - target.storage.meibu=player; - target.markSkillCharacter('meibu',player,'魅步','锦囊牌均视为杀且'+get.translation(player)+'视为在攻击范围内'); + content: function () { + var target = trigger.player; + target.addTempSkill("meibu_viewas"); + target.addTempSkill("meibu_range"); + target.storage.meibu = player; + target.markSkillCharacter( + "meibu", + player, + "魅步", + "锦囊牌均视为杀且" + get.translation(player) + "视为在攻击范围内" + ); }, - ai:{ - expose:0.2 + ai: { + expose: 0.2, }, - subSkill:{ - range:{ - mod:{ - targetInRange:function(card,player,target){ - if(card.name=='sha'&&target==player.storage.meibu){ + subSkill: { + range: { + mod: { + targetInRange: function (card, player, target) { + if (card.name == "sha" && target == player.storage.meibu) { return true; } - } + }, }, - onremove:function(player){ - game.broadcast(function(player){ - if(player.marks.meibu){ + onremove: function (player) { + game.broadcast(function (player) { + if (player.marks.meibu) { player.marks.meibu.delete(); delete player.marks.meibu; } - },player); - if(player.marks.meibu){ + }, player); + if (player.marks.meibu) { player.marks.meibu.delete(); delete player.marks.meibu; - game.addVideo('unmark',player,'meibu'); + game.addVideo("unmark", player, "meibu"); } }, - trigger:{player:'useCard'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.skill=='meibu_viewas' + trigger: { player: "useCard" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "meibu_viewas"; }, - content:function(){ - player.removeSkill('meibu_viewas'); - game.broadcastAll(function(player){ - if(player.marks.meibu&&player.marks.meibu.info){ - player.marks.meibu.info.content=player.marks.meibu.info.content.slice(8); + content: function () { + player.removeSkill("meibu_viewas"); + game.broadcastAll(function (player) { + if (player.marks.meibu && player.marks.meibu.info) { + player.marks.meibu.info.content = + player.marks.meibu.info.content.slice(8); } - },player); - } + }, player); + }, }, - viewas:{ - mod:{ - cardEnabled:function(card,player){ - if(card.name!='sha'&&get.type(card,'trick')=='trick') return false; + viewas: { + mod: { + cardEnabled: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; }, - cardUsable:function(card,player){ - if(card.name!='sha'&&get.type(card,'trick')=='trick') return false; + cardUsable: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; }, - cardRespondable:function(card,player){ - if(card.name!='sha'&&get.type(card,'trick')=='trick') return false; + cardRespondable: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; }, - cardSavable:function(card,player){ - if(card.name!='sha'&&get.type(card,'trick')=='trick') return false; + cardSavable: function (card, player) { + if (card.name != "sha" && get.type(card, "trick") == "trick") return false; }, }, - enable:['chooseToUse','chooseToRespond'], - filterCard:function(card){ - return get.type(card,'trick')=='trick'; + enable: ["chooseToUse", "chooseToRespond"], + filterCard: function (card) { + return get.type(card, "trick") == "trick"; }, - viewAs:{name:'sha'}, - check:function(){return 1}, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondSha')&¤t<0) return 0.8 - } + viewAs: { name: "sha" }, + check: function () { + return 1; + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondSha") && current < 0) return 0.8; + }, }, - respondSha:true, - order:4, - useful:-1, - value:-1 - } - } - } + respondSha: true, + order: 4, + useful: -1, + value: -1, + }, + }, + }, }, - mumu:{ - enable:'phaseUse', - usable:1, - filterCard:function(card,player,target){ - return card.name=='sha'||(get.type(card,'trick')=='trick'&&get.color(card)=='black'); + mumu: { + enable: "phaseUse", + usable: 1, + filterCard: function (card, player, target) { + return ( + card.name == "sha" || + (get.type(card, "trick") == "trick" && get.color(card) == "black") + ); }, - check:function(card){ - return 7-get.value(card); + check: function (card) { + return 7 - get.value(card); }, - filterTarget:function(card,player,target){ - if(target==player) return false; - return target.getEquips(1).length>0||target.getEquips(2).length>0; + filterTarget: function (card, player, target) { + if (target == player) return false; + return target.getEquips(1).length > 0 || target.getEquips(2).length > 0; }, - content:function(){ - 'step 0' - var e1=target.getEquips(1); - var e2=target.getEquips(2); - event.e1=e1; - event.e2=e2; - if(e1.length&&e2.length){ - player.chooseControl('武器牌','防具牌').set('ai',function(){ - if(_status.event.player.getEquip(2)){ - return '武器牌'; + content: function () { + "step 0"; + var e1 = target.getEquips(1); + var e2 = target.getEquips(2); + event.e1 = e1; + event.e2 = e2; + if (e1.length && e2.length) { + player.chooseControl("武器牌", "防具牌").set("ai", function () { + if (_status.event.player.getEquip(2)) { + return "武器牌"; } - return '防具牌'; + return "防具牌"; }); + } else if (e1.length) { + event.choice = "武器牌"; + } else { + event.choice = "防具牌"; } - else if(e1.length){ - event.choice='武器牌'; - } - else{ - event.choice='防具牌'; - } - 'step 1' - var choice=event.choice||result.control; - if(choice=='武器牌'){ - if(event.e1){ + ("step 1"); + var choice = event.choice || result.control; + if (choice == "武器牌") { + if (event.e1) { target.discard(event.e1); } player.draw(); - } - else{ - if(event.e2){ + } else { + if (event.e2) { player.equip(event.e2); - target.$give(event.e2,player); + target.$give(event.e2, player); } } }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(target.getEquip(2)&&!player.getEquip(2)){ + ai: { + order: 8, + result: { + target: function (player, target) { + if (target.getEquip(2) && !player.getEquip(2)) { return -2; } return -1; - } - } - } + }, + }, + }, }, - fentian:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - if(player.countCards('h')>=player.hp) return false; - return game.hasPlayer(function(current){ - return player!=current&&player.inRange(current)&¤t.countCards('he'); + fentian: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + if (player.countCards("h") >= player.hp) return false; + return game.hasPlayer(function (current) { + return player != current && player.inRange(current) && current.countCards("he"); }); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - content:function(){ - 'step 0' - player.chooseTarget('焚天:选择一名攻击范围内的角色,将其一张牌置于你的武将牌上',true,function(card,player,target){ - return player!=target&&player.inRange(target)&&target.countCards('he')>0; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target) - }); - 'step 1' - if(result.bool){ - player.logSkill('fentian',result.targets); - event.target=result.targets[0]; - player.choosePlayerCard(result.targets[0],'he',true); - } - else{ + content: function () { + "step 0"; + player + .chooseTarget( + "焚天:选择一名攻击范围内的角色,将其一张牌置于你的武将牌上", + true, + function (card, player, target) { + return ( + player != target && player.inRange(target) && target.countCards("he") > 0 + ); + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + player.logSkill("fentian", result.targets); + event.target = result.targets[0]; + player.choosePlayerCard(result.targets[0], "he", true); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.addToExpansion(result.links,target,'give').gaintag.add('fentian'); + ("step 2"); + if (result.bool) { + player.addToExpansion(result.links, target, "give").gaintag.add("fentian"); } }, - mod:{ - attackRange:function(from,distance){ - return distance+from.getExpansions('fentian').length; - } - } + mod: { + attackRange: function (from, distance) { + return distance + from.getExpansions("fentian").length; + }, + }, }, - zhiri:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - unique:true, - juexingji:true, - audio:2, - skillAnimation:true, - animationColor:'fire', - derivation:'xintan', - filter:function(event,player){ - return player.getExpansions('fentian').length>=3; + zhiri: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + audio: 2, + skillAnimation: true, + animationColor: "fire", + derivation: "xintan", + filter: function (event, player) { + return player.getExpansions("fentian").length >= 3; }, - content:function(){ - player.awakenSkill('zhiri'); + content: function () { + player.awakenSkill("zhiri"); player.loseMaxHp(); - player.storage.zhiri=true; + player.storage.zhiri = true; + }, + ai: { + combo: "fentian", }, - ai:{ - combo:'fentian' - } }, - xintan:{ - enable:'phaseUse', - usable:1, - audio:2, - unique:true, - filter:function(event,player){ - return player.getExpansions('fentian').length>=2; + xintan: { + enable: "phaseUse", + usable: 1, + audio: 2, + unique: true, + filter: function (event, player) { + return player.getExpansions("fentian").length >= 2; }, - filterTarget:true, - prompt:'移去两张“焚”并令一名角色失去1点体力', - content:function(){ - 'step 0' - player.chooseCardButton(2,'移去两张“焚”并令'+get.translation(target)+'失去1点体力',player.getExpansions('fentian'),true); - 'step 1' - if(result.bool){ + filterTarget: true, + prompt: "移去两张“焚”并令一名角色失去1点体力", + content: function () { + "step 0"; + player.chooseCardButton( + 2, + "移去两张“焚”并令" + get.translation(target) + "失去1点体力", + player.getExpansions("fentian"), + true + ); + ("step 1"); + if (result.bool) { player.loseToDiscardpile(result.links); target.loseHp(); } }, - ai:{ - order:8, - result:{ - target:-1 + ai: { + order: 8, + result: { + target: -1, }, - combo:'fentian' - } + combo: "fentian", + }, }, - danji:{ - skillAnimation:true, - animationColor:'water', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - unique:true, - juexingji:true, - derivation:['mashu','nuzhan'], - filter:function(event,player){ - var zhu=get.zhu(player); - if(zhu&&zhu.isZhu){ - var name=zhu.name - while(name.indexOf('_')!=-1){ - name=name.slice(name.indexOf('_')+1); + danji: { + skillAnimation: true, + animationColor: "water", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + juexingji: true, + derivation: ["mashu", "nuzhan"], + filter: function (event, player) { + var zhu = get.zhu(player); + if (zhu && zhu.isZhu) { + var name = zhu.name; + while (name.indexOf("_") != -1) { + name = name.slice(name.indexOf("_") + 1); } - if(name.indexOf('liubei')==0) return false; + if (name.indexOf("liubei") == 0) return false; } - return !player.storage.danji&&player.countCards('h')>player.hp; + return !player.storage.danji && player.countCards("h") > player.hp; }, - content:function(){ - player.awakenSkill('danji'); + content: function () { + player.awakenSkill("danji"); player.loseMaxHp(); - player.addSkills(['mashu','nuzhan']); + player.addSkills(["mashu", "nuzhan"]); }, - ai:{ - maixie:true, - skillTagFilter:(player,tag,arg)=>{ - if(tag==='maixie'){ - if(player.hp<2||player.storage.danji||player.hasSkill('nuzhan')||player.countCards('h')!==player.hp) return false; - let zhu=get.zhu(player); - if(zhu&&zhu.isZhu){ - let name=zhu.name; - while(name.indexOf('_')!==-1){ - name=name.slice(name.indexOf('_')+1); + ai: { + maixie: true, + skillTagFilter: (player, tag, arg) => { + if (tag === "maixie") { + if ( + player.hp < 2 || + player.storage.danji || + player.hasSkill("nuzhan") || + player.countCards("h") !== player.hp + ) + return false; + let zhu = get.zhu(player); + if (zhu && zhu.isZhu) { + let name = zhu.name; + while (name.indexOf("_") !== -1) { + name = name.slice(name.indexOf("_") + 1); } - if(name.indexOf('liubei')==0) return false; + if (name.indexOf("liubei") == 0) return false; } return true; } }, - effect:{ - target:(card,player,target)=>{ - let hs=target.countCards('h'); - if(target.hp<3||target.storage.danji||target.hasSkill('nuzhan')||hs>target.hp+1) return; - let zhu=get.zhu(target); - if(zhu&&zhu.isZhu){ - let name=zhu.name; - while(name.indexOf('_')!==-1){ - name=name.slice(name.indexOf('_')+1); + effect: { + target: (card, player, target) => { + let hs = target.countCards("h"); + if ( + target.hp < 3 || + target.storage.danji || + target.hasSkill("nuzhan") || + hs > target.hp + 1 + ) + return; + let zhu = get.zhu(target); + if (zhu && zhu.isZhu) { + let name = zhu.name; + while (name.indexOf("_") !== -1) { + name = name.slice(name.indexOf("_") + 1); } - if(name.indexOf('liubei')==0) return; + if (name.indexOf("liubei") == 0) return; } - if(get.tag(card,'draw')) return 1.6; - if(get.tag(card,'lose')||get.tag(card,'discard')) return [1,-0.8]; - if(hs===target.hp&&get.tag(card,'damage')) return [1,target.hp/3]; - if(hs>target.hp&&target.hp>3&&(card.name==='shan'||card.name==='wuxie')) return 'zeroplayertarget'; - } - } - } - }, - nuzhan:{ - audio:2, - popup:false, - silent:true, - firstDo:true, - trigger:{player:'useCard1'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.addCount!==false&&event.cards&& - event.cards.length==1&&get.type(event.cards[0],'trick')=='trick'; - }, - forced:true, - content:function(){ - trigger.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; - } - }, - group:'nuzhan2' - }, - nuzhan2:{ - audio:'nuzhan', - trigger:{player:'useCard1'}, - forced:true, - popup:false, - silent:true, - firstDo:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.cards&& - event.cards.length==1&&get.type(event.cards[0])=='equip'; - }, - content:function(){ - trigger.baseDamage++; - } - }, - jieyuan:{ - group:['jieyuan_more','jieyuan_less'], - subSkill:{ - more:{ - audio:true, - trigger:{source:'damageBegin1'}, - direct:true, - filter:function(event,player){ - if(!player.countCards(player.hasSkill('fenxin_nei')?'he':'h',function(card){ - if(player.hasSkill('fenxin_nei')||(_status.connectMode&&get.position(card)=='h')) return true; - return get.color(card)=='black'; - })) return false; - return (event.player.hp>=player.hp||player.hasSkill('fenxin_fan'))&&player!=event.player; + if (get.tag(card, "draw")) return 1.6; + if (get.tag(card, "lose") || get.tag(card, "discard")) return [1, -0.8]; + if (hs === target.hp && get.tag(card, "damage")) return [1, target.hp / 3]; + if ( + hs > target.hp && + target.hp > 3 && + (card.name === "shan" || card.name === "wuxie") + ) + return "zeroplayertarget"; }, - content:function(){ - 'step 0' - var goon=(get.attitude(player,trigger.player)<0); - var next=player.chooseToDiscard(get.prompt('jieyuan',trigger.player),player.hasSkill('fenxin_nei')?'he':'h'); - if(!player.hasSkill('fenxin_nei')){ - next.set('filterCard',function(card){ - return get.color(card)=='black'; + }, + }, + }, + nuzhan: { + audio: 2, + popup: false, + silent: true, + firstDo: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.addCount !== false && + event.cards && + event.cards.length == 1 && + get.type(event.cards[0], "trick") == "trick" + ); + }, + forced: true, + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; + } + }, + group: "nuzhan2", + }, + nuzhan2: { + audio: "nuzhan", + trigger: { player: "useCard1" }, + forced: true, + popup: false, + silent: true, + firstDo: true, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.cards && + event.cards.length == 1 && + get.type(event.cards[0]) == "equip" + ); + }, + content: function () { + trigger.baseDamage++; + }, + }, + jieyuan: { + group: ["jieyuan_more", "jieyuan_less"], + subSkill: { + more: { + audio: true, + trigger: { source: "damageBegin1" }, + direct: true, + filter: function (event, player) { + if ( + !player.countCards( + player.hasSkill("fenxin_nei") ? "he" : "h", + function (card) { + if ( + player.hasSkill("fenxin_nei") || + (_status.connectMode && get.position(card) == "h") + ) + return true; + return get.color(card) == "black"; + } + ) + ) + return false; + return ( + (event.player.hp >= player.hp || player.hasSkill("fenxin_fan")) && + player != event.player + ); + }, + content: function () { + "step 0"; + var goon = get.attitude(player, trigger.player) < 0; + var next = player.chooseToDiscard( + get.prompt("jieyuan", trigger.player), + player.hasSkill("fenxin_nei") ? "he" : "h" + ); + if (!player.hasSkill("fenxin_nei")) { + next.set("filterCard", function (card) { + return get.color(card) == "black"; }); - next.set('prompt2','弃置一张黑色手牌令伤害+1'); + next.set("prompt2", "弃置一张黑色手牌令伤害+1"); + } else { + next.set("prompt2", "弃置一张手牌令伤害+1"); } - else{ - next.set('prompt2','弃置一张手牌令伤害+1'); - } - next.set('ai',function(card){ - if(_status.event.goon){ - return 8-get.value(card); + next.set("ai", function (card) { + if (_status.event.goon) { + return 8 - get.value(card); } return 0; }); - next.set('goon',goon); - next.logSkill=['jieyuan_more',trigger.player]; - 'step 1' - if(result.bool){ + next.set("goon", goon); + next.logSkill = ["jieyuan_more", trigger.player]; + ("step 1"); + if (result.bool) { trigger.num++; } - } - }, - less:{ - audio:true, - trigger:{player:'damageBegin2'}, - filter:function(event,player){ - if(!player.countCards(player.hasSkill('fenxin_nei')?'he':'h',function(card){ - if(player.hasSkill('fenxin_nei')||(_status.connectMode&&get.position(card)=='h')) return true; - return get.color(card)=='red'; - })) return false; - return event.source&&(event.source.hp>=player.hp||player.hasSkill('fenxin_zhong'))&&player!=event.source; }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('jieyuan'),player.hasSkill('fenxin_nei')?'he':'h'); - if(!player.hasSkill('fenxin_nei')){ - next.set('filterCard',function(card){ - return get.color(card)=='red'; + }, + less: { + audio: true, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + if ( + !player.countCards( + player.hasSkill("fenxin_nei") ? "he" : "h", + function (card) { + if ( + player.hasSkill("fenxin_nei") || + (_status.connectMode && get.position(card) == "h") + ) + return true; + return get.color(card) == "red"; + } + ) + ) + return false; + return ( + event.source && + (event.source.hp >= player.hp || player.hasSkill("fenxin_zhong")) && + player != event.source + ); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + get.prompt("jieyuan"), + player.hasSkill("fenxin_nei") ? "he" : "h" + ); + if (!player.hasSkill("fenxin_nei")) { + next.set("filterCard", function (card) { + return get.color(card) == "red"; }); - next.set('prompt2','弃置一张红色手牌令伤害-1'); + next.set("prompt2", "弃置一张红色手牌令伤害-1"); + } else { + next.set("prompt2", "弃置一张手牌令伤害-1"); } - else{ - next.set('prompt2','弃置一张手牌令伤害-1'); - } - next.set('ai',function(card){ - var player=_status.event.player; - if(player.hp==1||_status.event.getTrigger().num>1){ - return 9-get.value(card); + next.set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1 || _status.event.getTrigger().num > 1) { + return 9 - get.value(card); } - if(player.hp==2){ - return 8-get.value(card); + if (player.hp == 2) { + return 8 - get.value(card); } - return 7-get.value(card); + return 7 - get.value(card); }); - next.logSkill='jieyuan_less'; - "step 1" - if(result.bool){ + next.logSkill = "jieyuan_less"; + ("step 1"); + if (result.bool) { trigger.num--; } - } - } + }, + }, + }, + ai: { + expose: 0.2, + threaten: 1.5, }, - ai:{ - expose:0.2, - threaten:1.5 - } }, - fenxin:{ - mode:['identity','versus'], - available:function(mode){ - if(mode=='identity'&&_status.mode=='purple') return false; - if(mode=='versus'&&_status.mode!='two') return false; + fenxin: { + mode: ["identity", "versus"], + available: function (mode) { + if (mode == "identity" && _status.mode == "purple") return false; + if (mode == "versus" && _status.mode != "two") return false; }, - trigger:{global:['dieAfter','damageEnd']}, - filter:function(event,player){ - var list=['fan','zhong','nei']; - if(get.mode()=='identity') return event.name=='die'&&list.includes(event.player.identity)&&!player.hasSkill('fenxin_'+event.player.identity); - return event.name=='damage'&&event.player!=player&&list.some(identity=>!player.hasSkill('fenxin_'+identity))&&event.player.getHistory('damage').indexOf(event)==0; + trigger: { global: ["dieAfter", "damageEnd"] }, + filter: function (event, player) { + var list = ["fan", "zhong", "nei"]; + if (get.mode() == "identity") + return ( + event.name == "die" && + list.includes(event.player.identity) && + !player.hasSkill("fenxin_" + event.player.identity) + ); + return ( + event.name == "damage" && + event.player != player && + list.some((identity) => !player.hasSkill("fenxin_" + identity)) && + event.player.getHistory("damage").indexOf(event) == 0 + ); }, - forced:true, - logTarget:'player', - content:function(){ - 'step 0' - if(get.mode()=='identity'){ - event._result={ - bool:true, - links:['fenxin_'+trigger.player.identity], + forced: true, + logTarget: "player", + content: function () { + "step 0"; + if (get.mode() == "identity") { + event._result = { + bool: true, + links: ["fenxin_" + trigger.player.identity], }; + } else { + player + .chooseButton( + [ + "焚心:请选择〖竭缘〗的升级方式", + [ + [ + ["fenxin_fan", "发动〖竭缘〗增加伤害无体力值限制"], + ["fenxin_zhong", "发动〖竭缘〗减少伤害无体力值限制"], + ["fenxin_nei", "将〖竭缘〗中的黑色手牌和红色手牌改为一张牌"], + ].filter((list) => !player.hasSkill(list[0])), + "textbutton", + ], + ], + true + ) + .set("ai", function (button) { + return ["fenxin_fan", "fenxin_zhong", "fenxin_nei"].indexOf(button.link) + 1; + }); } - else{ - player.chooseButton([ - '焚心:请选择〖竭缘〗的升级方式', - [[ - ['fenxin_fan','发动〖竭缘〗增加伤害无体力值限制'], - ['fenxin_zhong','发动〖竭缘〗减少伤害无体力值限制'], - ['fenxin_nei','将〖竭缘〗中的黑色手牌和红色手牌改为一张牌'], - ].filter(list=>!player.hasSkill(list[0])),'textbutton'] - ],true).set('ai',function(button){ - return ['fenxin_fan','fenxin_zhong','fenxin_nei'].indexOf(button.link)+1; - }); - } - 'step 1' - if(result.bool){ - var identity=result.links[0]; + ("step 1"); + if (result.bool) { + var identity = result.links[0]; player.addSkill(identity); - player.markSkill('fenxin'); + player.markSkill("fenxin"); } }, - intro:{ - mark:function(dialog,content,player){ - if(player.hasSkill('fenxin_zhong')){ - dialog.addText('你发动“竭缘”减少伤害无体力值限制'); + intro: { + mark: function (dialog, content, player) { + if (player.hasSkill("fenxin_zhong")) { + dialog.addText("你发动“竭缘”减少伤害无体力值限制"); } - if(player.hasSkill('fenxin_fan')){ - dialog.addText('你发动“竭缘”增加伤害无体力值限制'); + if (player.hasSkill("fenxin_fan")) { + dialog.addText("你发动“竭缘”增加伤害无体力值限制"); } - if(player.hasSkill('fenxin_nei')){ - dialog.addText('将“竭缘”中的黑色手牌和红色手牌改为一张牌'); + if (player.hasSkill("fenxin_nei")) { + dialog.addText("将“竭缘”中的黑色手牌和红色手牌改为一张牌"); } - } - }, - subSkill:{ - fan:{charlotte:true}, - zhong:{charlotte:true}, - nei:{charlotte:true} - }, - ai:{combo:'jieyuan'}, - }, - xisheng:{ - enable:'chooseToUse', - usable:1, - viewAs:{name:'tao'}, - viewAsFilter:function(player){ - return player!=_status.currentPhase&&player.countCards('hes')>1; - }, - selectCard:2, - filterCard:true, - position:'hes', - }, - shulv:{ - inherit:'zhiheng', - prompt:'弃置一张牌并摸一张牌', - selectCard:1, - filter:function(event,player){ - return player.countCards('hs')>player.hp; - }, - }, - xiandeng:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; }, - targetInRange:function(card,player){ - if(card.name=='sha'&&player.countUsed('sha',true)==0) return true; + }, + subSkill: { + fan: { charlotte: true }, + zhong: { charlotte: true }, + nei: { charlotte: true }, + }, + ai: { combo: "jieyuan" }, + }, + xisheng: { + enable: "chooseToUse", + usable: 1, + viewAs: { name: "tao" }, + viewAsFilter: function (player) { + return player != _status.currentPhase && player.countCards("hes") > 1; + }, + selectCard: 2, + filterCard: true, + position: "hes", + }, + shulv: { + inherit: "zhiheng", + prompt: "弃置一张牌并摸一张牌", + selectCard: 1, + filter: function (event, player) { + return player.countCards("hs") > player.hp; + }, + }, + xiandeng: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + targetInRange: function (card, player) { + if (card.name == "sha" && player.countUsed("sha", true) == 0) return true; }, }, }, - qingyi:{ - audio:2, - trigger:{player:'phaseJudgeBefore'}, - direct:true, - content:function(){ - "step 0" - var check= player.countCards('h')>2; - player.chooseTarget(get.prompt("qingyi"),"跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】",function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); - }).set('check',check).set('ai',function(target){ - if(!_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); - }); - "step 1" - if(result.bool){ - player.logSkill('qingyi',result.targets); - player.useCard({name:'sha',isCard:true},result.targets[0],false); + qingyi: { + audio: 2, + trigger: { player: "phaseJudgeBefore" }, + direct: true, + content: function () { + "step 0"; + var check = player.countCards("h") > 2; + player + .chooseTarget( + get.prompt("qingyi"), + "跳过判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】", + function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); + } + ) + .set("check", check) + .set("ai", function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("qingyi", result.targets); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); trigger.cancel(); - player.skip('phaseDraw'); + player.skip("phaseDraw"); } }, }, - qingyi1:{ - audio:true, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - "step 0" - player.addSkill('qingyi3'); - var check= player.countCards('h')>2; - player.chooseTarget(get.prompt2('qingyi'),function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target); - }).ai=function(target){ - if(!check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); + qingyi1: { + audio: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.addSkill("qingyi3"); + var check = player.countCards("h") > 2; + player.chooseTarget(get.prompt2("qingyi"), function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target); + }).ai = function (target) { + if (!check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); + }; + ("step 1"); + if (result.bool) { + player.logSkill("qingyi1", result.targets); + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); + player.skip("phaseJudge"); + player.skip("phaseDraw"); } - "step 1" - if(result.bool){ - player.logSkill('qingyi1',result.targets); - player.useCard({name:'sha',isCard:true},result.targets[0],false); - player.skip('phaseJudge'); - player.skip('phaseDraw'); - } - player.removeSkill('qingyi3'); - } - }, - qingyi2:{ - audio:true, - trigger:{player:'phaseUseBefore'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0; + player.removeSkill("qingyi3"); }, - content:function(){ - "step 0" - player.addSkill('qingyi3'); - var check=player.countCards('h')<=player.hp; + }, + qingyi2: { + audio: true, + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + content: function () { + "step 0"; + player.addSkill("qingyi3"); + var check = player.countCards("h") <= player.hp; player.chooseCardTarget({ - prompt:get.prompt2('qingyi'), - filterCard:function(card,player){ - return get.type(card)=='equip'&&lib.filter.cardDiscardable(card,player); + prompt: get.prompt2("qingyi"), + filterCard: function (card, player) { + return get.type(card) == "equip" && lib.filter.cardDiscardable(card, player); }, - position:'he', - filterTarget:function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target); + position: "he", + filterTarget: function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target); }, - ai1:function(card){ - if(!_status.event.check) return 0; - return 6-get.value(card); + ai1: function (card) { + if (!_status.event.check) return 0; + return 6 - get.value(card); }, - ai2:function(target){ - if(!_status.event.check) return 0; - return get.effect(target,{name:'sha'},_status.event.player); + ai2: function (target) { + if (!_status.event.check) return 0; + return get.effect(target, { name: "sha" }, _status.event.player); }, - check:check + check: check, }); - "step 1" - if(result.bool){ - player.logSkill('qingyi2',result.targets); + ("step 1"); + if (result.bool) { + player.logSkill("qingyi2", result.targets); player.discard(result.cards[0]); - player.useCard({name:'sha',isCard:true},result.targets[0]); + player.useCard({ name: "sha", isCard: true }, result.targets[0]); trigger.cancel(); } - player.removeSkill('qingyi3'); - } + player.removeSkill("qingyi3"); + }, }, - qingyi3:{ - mod:{ - targetInRange:function(card,player,target,now){ + qingyi3: { + mod: { + targetInRange: function (card, player, target, now) { return true; - } + }, }, }, - qirang:{ - audio:2, - trigger:{player:'equipEnd'}, - frequent:true, - content:function(){ - var card=get.cardPile(function(card){ - return get.type(card,'trick')=='trick'; + qirang: { + audio: 2, + trigger: { player: "equipEnd" }, + frequent: true, + content: function () { + var card = get.cardPile(function (card) { + return get.type(card, "trick") == "trick"; }); - if(card){ - var next=player.gain(card,'gain2'); - if(get.type(card)=='trick') next.gaintag.add('qirang'); - else{ - player.addMark('qirang_mark',1,false); - player.addTempSkill('qirang_mark',{player:'phaseBegin'}); + if (card) { + var next = player.gain(card, "gain2"); + if (get.type(card) == "trick") next.gaintag.add("qirang"); + else { + player.addMark("qirang_mark", 1, false); + player.addTempSkill("qirang_mark", { player: "phaseBegin" }); } } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; - } + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, }, - threaten:1.3 + threaten: 1.3, }, - group:'qirang_use', - subSkill:{ - mark:{ - charlotte:true, - onremove:function(player){ - var evt=_status.event; - if(evt.name!='phase') evt=evt.getParent('phase'); - if(evt&&evt.player==player){ - if(!evt.qirang_num) evt.qirang_num=0; - evt.qirang_num+=player.storage.qirang_mark; + group: "qirang_use", + subSkill: { + mark: { + charlotte: true, + onremove: function (player) { + var evt = _status.event; + if (evt.name != "phase") evt = evt.getParent("phase"); + if (evt && evt.player == player) { + if (!evt.qirang_num) evt.qirang_num = 0; + evt.qirang_num += player.storage.qirang_mark; } delete player.storage.qirang_mark; }, - intro:{ - content:'下回合发动〖羽化〗时卜算量+#', + intro: { + content: "下回合发动〖羽化〗时卜算量+#", }, }, - use:{ - audio:'qirang', - trigger:{player:'useCard2'}, - direct:true, - filter:function(event,player){ - if(get.type(event.card)!='trick') return false; - if(!event.targets||event.targets.length!=1) return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(!player.hasHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('qirang')) return true; - } + use: { + audio: "qirang", + trigger: { player: "useCard2" }, + direct: true, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + if (!event.targets || event.targets.length != 1) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if ( + !player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("qirang")) return true; + } + return false; + }) + ) return false; - })) return false; - if(!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })){ + if (!info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加一个目标' - player.chooseTarget(get.prompt('qirang'),function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card,player,target)&&lib.filter.targetInRange(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player)*(_status.event.targets.includes(target)?-1:1); - }).set('targets',trigger.targets).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("qirang"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return ( + lib.filter.targetEnabled2(_status.event.card, player, target) && + lib.filter.targetInRange(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return ( + get.effect(target, trigger.card, player, player) * + (_status.event.targets.includes(target) ? -1 : 1) + ); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('qirang_use',event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("qirang_use", event.targets); trigger.targets.addArray(event.targets); } }, }, }, }, - yuhua:{ - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - forced:true, - audio:2, - content:function(){ - "step 0" - var num=1,evt=trigger.getParent(); - if(evt.qirang_num) num+=evt.qirang_num; - var cards=get.cards(Math.min(5,num)); + yuhua: { + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + forced: true, + audio: 2, + content: function () { + "step 0"; + var num = 1, + evt = trigger.getParent(); + if (evt.qirang_num) num += evt.qirang_num; + var cards = get.cards(Math.min(5, num)); game.cardsGotoOrdering(cards); - var next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('prompt','羽化:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=function(list){ - var cards=list[0][1],player=_status.event.player; - var target=(_status.event.getTrigger().name=='phaseZhunbei')?player:player.next; - var att=get.sgn(get.attitude(player,target)); - var top=[]; - var judges=target.getCards('j'); - var stopped=false; - if(player!=target||!target.hasWuxie()){ - for(var i=0;i0)) break; + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; top.unshift(cards.shift()); } } - bottom=cards; - return [top,bottom]; - } - "step 1" - var top=result.moved[0]; - var bottom=result.moved[1]; + bottom = cards; + return [top, bottom]; + }; + ("step 1"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - for(var i=0;i0){ - var att1=get.attitude(target,player); - var att2=get.attitude(target,trigger.player); - var att3=get.attitude(player,target); - if(att3<0) return 0; - return att1/2+att2+att3; - } - else{ - return 0; - // return get.attitude(player,target); - } - }); - 'step 1' - if(result.bool){ - player.addTempSkill('chenqing2','roundStart'); - event.target=result.targets[0]; + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("chenqing"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().player; + }) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + if (get.attitude(player, trigger.player) > 0) { + var att1 = get.attitude(target, player); + var att2 = get.attitude(target, trigger.player); + var att3 = get.attitude(player, target); + if (att3 < 0) return 0; + return att1 / 2 + att2 + att3; + } else { + return 0; + // return get.attitude(player,target); + } + }); + ("step 1"); + if (result.bool) { + player.addTempSkill("chenqing2", "roundStart"); + event.target = result.targets[0]; event.target.draw(4); - player.logSkill('chenqing',event.target); - } - else{ + player.logSkill("chenqing", event.target); + } else { event.finish(); } - 'step 2' - var target=event.target; - var tosave=trigger.player; - var att=get.attitude(target,tosave); - var hastao=target.countCards('h','tao'); - target.chooseToDiscard(4,true,'he').set('ai',function(card){ - var hastao=_status.event.hastao; - var att=_status.event.att; - if(!hastao&&att>0){ - var suit=get.suit(card); - for(var i=0;i 0) { + var suit = get.suit(card); + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.suit(ui.selected.cards[i]) == suit) { + return -4 - get.value(card); + } } } - } - if(att<0&&ui.selected.cards.length==3){ - var suit=get.suit(card); - for(var i=0;i0&&player.countCards('hs')>0; + ai: { + expose: 0.2, + threaten: 1.5, }, - content:function(){ - "step 0" - event.count=2; - event.history=player.getHistory('useCard',function(evt){ - return evt.isPhaseUsing()&&['basic','trick'].includes(get.type(evt.card)); - }) - "step 1" - event._result={}; - if(event.count&&event.history.length&&player.countCards('hs')){ + }, + mozhi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing() && ["basic", "trick"].includes(get.type(evt.card)); + }).length > 0 && player.countCards("hs") > 0 + ); + }, + content: function () { + "step 0"; + event.count = 2; + event.history = player.getHistory("useCard", function (evt) { + return evt.isPhaseUsing() && ["basic", "trick"].includes(get.type(evt.card)); + }); + ("step 1"); + event._result = {}; + if (event.count && event.history.length && player.countCards("hs")) { event.count--; - var card=event.history.shift().card; - card={name:card.name,nature:card.nature}; - if(card.name!='jiu'&&lib.filter.cardEnabled(card)){ - if(game.hasPlayer(function(current){ - return player.canUse(card,current); - })){ - lib.skill.mozhix.viewAs=card; - var next=player.chooseToUse(); - if(next.isOnline()){ - player.send(function(card){ - lib.skill.mozhix.viewAs=card; - },card) + var card = event.history.shift().card; + card = { name: card.name, nature: card.nature }; + if (card.name != "jiu" && lib.filter.cardEnabled(card)) { + if ( + game.hasPlayer(function (current) { + return player.canUse(card, current); + }) + ) { + lib.skill.mozhix.viewAs = card; + var next = player.chooseToUse(); + if (next.isOnline()) { + player.send(function (card) { + lib.skill.mozhix.viewAs = card; + }, card); } - next.logSkill='mozhi'; - next.set('openskilldialog','默识:将一张手牌当'+get.translation(card)+'使用'); - next.set('norestore',true); - next.set('_backupevent','mozhix'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + next.logSkill = "mozhi"; + next.set( + "openskilldialog", + "默识:将一张手牌当" + get.translation(card) + "使用" + ); + next.set("norestore", true); + next.set("_backupevent", "mozhix"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('mozhix'); + next.backup("mozhix"); } } } - "step 2" - if(result&&result.bool) event.goto(1); + ("step 2"); + if (result && result.bool) event.goto(1); }, }, - mozhix:{ - filterCard:function(card){ - return get.itemtype(card)=='card'; + mozhix: { + filterCard: function (card) { + return get.itemtype(card) == "card"; }, - selectCard:1, - position:'hs', - popname:true, + selectCard: 1, + position: "hs", + popname: true, }, - chenqing2:{charlotte:true}, - ranshang:{ - audio:2, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.hasNature('fire'); + chenqing2: { charlotte: true }, + ranshang: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.hasNature("fire"); }, - forced:true, - check:function(){ + forced: true, + check: function () { return false; }, - content:function(){ - player.addMark('ranshang',trigger.num); + content: function () { + player.addMark("ranshang", trigger.num); }, - intro:{ - name2:'燃', - content:'mark' + intro: { + name2: "燃", + content: "mark", }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'){ - if(game.hasNature(card,'fire')||player.hasSkill('zhuque_skill')) return 2; + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha") { + if (game.hasNature(card, "fire") || player.hasSkill("zhuque_skill")) return 2; } - if(get.tag(card,'fireDamage')&¤t<0) return 2; - } - } + if (get.tag(card, "fireDamage") && current < 0) return 2; + }, + }, }, - group:'ranshang2' + group: "ranshang2", }, - ranshang2:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player.countMark('ranshang')>0; + ranshang2: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("ranshang") > 0; }, - content:function(){ - player.loseHp(player.countMark('ranshang')); - if(player.countMark('ranshang')>2){ + content: function () { + player.loseHp(player.countMark("ranshang")); + if (player.countMark("ranshang") > 2) { player.loseMaxHp(2); player.draw(2); } - } - }, - hanyong:{ - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card&&(event.card.name=='nanman'||event.card.name=='wanjian'||(event.card.name=='sha'&&!game.hasNature(event.card)&&get.suit(event.card)=='spade'))&&player.isDamaged(); }, - content:function(){ + }, + hanyong: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return ( + event.card && + (event.card.name == "nanman" || + event.card.name == "wanjian" || + (event.card.name == "sha" && + !game.hasNature(event.card) && + get.suit(event.card) == "spade")) && + player.isDamaged() + ); + }, + content: function () { trigger.baseDamage++; - if(game.roundNumber<=player.hp) player.addMark('ranshang',1); + if (game.roundNumber <= player.hp) player.addMark("ranshang", 1); }, }, - hanyong3:{ - audio:false, - trigger:{source:'damageBegin1'}, - forced:true, - onremove:true, - filter:function(event,player){ - return event.card==player.storage.hanyong3; + hanyong3: { + audio: false, + trigger: { source: "damageBegin1" }, + forced: true, + onremove: true, + filter: function (event, player) { + return event.card == player.storage.hanyong3; }, - content:function(){ + content: function () { trigger.num++; - } + }, }, - yishe:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return !player.getExpansions('yishe').length; + yishe: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return !player.getExpansions("yishe").length; }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(2); - 'step 1' - var cards=player.getCards('he'); - if(!cards.length) event.finish(); - else if(cards.length<=2) event._result={bool:true,cards:cards}; - else player.chooseCard(2,'he',true,'选择两张牌作为“米”'); - 'step 2' - if(result.bool) player.addToExpansion(result.cards,player,'give').gaintag.add('yishe'); + ("step 1"); + var cards = player.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length <= 2) event._result = { bool: true, cards: cards }; + else player.chooseCard(2, "he", true, "选择两张牌作为“米”"); + ("step 2"); + if (result.bool) player.addToExpansion(result.cards, player, "give").gaintag.add("yishe"); }, - group:'yishe_recover', - ai:{combo:'bushi'}, - subSkill:{ - recover:{ - audio:'yishe', - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + group: "yishe_recover", + ai: { combo: "bushi" }, + subSkill: { + recover: { + audio: "yishe", + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - if(player.isHealthy()) return false; - var evt=event.getl(player); - if(!evt||!evt.xs||!evt.xs.length||player.getExpansions('yishe').length>0) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('yishe')) return true; + filter: function (event, player) { + if (player.isHealthy()) return false; + var evt = event.getl(player); + if (!evt || !evt.xs || !evt.xs.length || player.getExpansions("yishe").length > 0) + return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("yishe")) return true; } return false; } - return player.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('yishe')) return true; + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("yishe")) return true; } return false; }); }, - forced:true, - content:function(){ + forced: true, + content: function () { player.recover(); }, }, }, }, - bushi:{ - audio:2, - trigger:{player:'damageEnd',source:'damageEnd'}, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.player.isIn()&&player.getExpansions('yishe').length>0; + bushi: { + audio: 2, + trigger: { player: "damageEnd", source: "damageEnd" }, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.player.isIn() && player.getExpansions("yishe").length > 0; }, - direct:true, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' - trigger.player.chooseCardButton('选择获得一张“米”',player.getExpansions('yishe')); - 'step 2' - if(result.bool){ + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); + trigger.player.chooseCardButton("选择获得一张“米”", player.getExpansions("yishe")); + ("step 2"); + if (result.bool) { event.count--; - player.logSkill('bushi',trigger.player); - trigger.player.gain(result.links[0],'give',player,'bySelf'); - } - else event.finish(); - 'step 3' - if(event.count>0&&player.getExpansions('yishe').length&&player.hasSkill('bushi')){ + player.logSkill("bushi", trigger.player); + trigger.player.gain(result.links[0], "give", player, "bySelf"); + } else event.finish(); + ("step 3"); + if (event.count > 0 && player.getExpansions("yishe").length && player.hasSkill("bushi")) { event.goto(1); } }, - ai:{combo:'yishe'}, + ai: { combo: "yishe" }, }, - midao:{ - audio:2, - trigger:{global:'judge'}, - direct:true, - filter:function(event,player){ - return player.getExpansions('yishe').length&&event.player.isIn(); + midao: { + audio: 2, + trigger: { global: "judge" }, + direct: true, + filter: function (event, player) { + return player.getExpansions("yishe").length && event.player.isIn(); }, - content:function(){ - "step 0" - var list=player.getExpansions('yishe'); - player.chooseButton([get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+get.translation(trigger.player.judging[0])+ - ','+get.prompt('midao'),list,'hidden'],function(button){ - var card=button.link; - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - return result*attitude; - }).set('judging',trigger.player.judging[0]).set('filterButton',function(button){ - var player=_status.event.player; - var card=button.link; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }); - "step 1" - if(result.bool){ - event.forceDie=true; - player.respond(result.links,'midao','highlight','noOrdering'); - result.cards=result.links; - var card=result.cards[0]; - event.card=card; - } - else{ + content: function () { + "step 0"; + var list = player.getExpansions("yishe"); + player + .chooseButton( + [ + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("midao"), + list, + "hidden", + ], + function (button) { + var card = button.link; + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + return result * attitude; + } + ) + .set("judging", trigger.player.judging[0]) + .set("filterButton", function (button) { + var player = _status.event.player; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }); + ("step 1"); + if (result.bool) { + event.forceDie = true; + player.respond(result.links, "midao", "highlight", "noOrdering"); + result.cards = result.links; + var card = result.cards[0]; + event.card = card; + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',card); + game.log(trigger.player, "的判定牌改为", card); game.delay(2); } }, - ai:{ - combo:'yishe', - rejudge:true, - tag:{ - rejudge:0.6 - } - } + ai: { + combo: "yishe", + rejudge: true, + tag: { + rejudge: 0.6, + }, + }, }, - fengpo:{ - shaRelated:true, - audio:2, - trigger:{ - player:'useCardToPlayered', + fengpo: { + shaRelated: true, + audio: 2, + trigger: { + player: "useCardToPlayered", }, - filter:function(event,player){ - if(event.targets.length!=1||!['sha','juedou'].includes(event.card.name)) return false; - var evtx=event.getParent(); - return !player.hasHistory('useCard',function(evt){ - return evt!=evtx&&evt.card.name==event.card.name; - },evtx) + filter: function (event, player) { + if (event.targets.length != 1 || !["sha", "juedou"].includes(event.card.name)) + return false; + var evtx = event.getParent(); + return !player.hasHistory( + "useCard", + function (evt) { + return evt != evtx && evt.card.name == event.card.name; + }, + evtx + ); }, - direct:true, - content:function(){ - 'step 0' - var str1=get.translation(trigger.card),str2=get.translation(trigger.target); - player.chooseControl('摸X加1伤','摸1加X伤','cancel2').set('prompt',get.prompt('fengpo',trigger.target)).set('prompt2','你可以选择一项:1.摸X张牌,令'+str1+'的伤害+1;2.摸一张牌,令'+str1+'的伤害+X(X为'+str2+'的♦牌的数量)。'); - 'step 1' - if(result.control&&result.control!='cancel2'){ - player.logSkill('fengpo',trigger.target); - var nd=trigger.target.countCards('he',{suit:'diamond'}); - var draw=1,damage=1; - if(result.control=='摸X加1伤') draw=nd; - else damage=nd; + direct: true, + content: function () { + "step 0"; + var str1 = get.translation(trigger.card), + str2 = get.translation(trigger.target); + player + .chooseControl("摸X加1伤", "摸1加X伤", "cancel2") + .set("prompt", get.prompt("fengpo", trigger.target)) + .set( + "prompt2", + "你可以选择一项:1.摸X张牌,令" + + str1 + + "的伤害+1;2.摸一张牌,令" + + str1 + + "的伤害+X(X为" + + str2 + + "的♦牌的数量)。" + ); + ("step 1"); + if (result.control && result.control != "cancel2") { + player.logSkill("fengpo", trigger.target); + var nd = trigger.target.countCards("he", { suit: "diamond" }); + var draw = 1, + damage = 1; + if (result.control == "摸X加1伤") draw = nd; + else damage = nd; player.draw(draw); - var trigger2=trigger.getParent(); - if(typeof trigger2.baseDamage!='number'){ - trigger2.baseDamage=1; + var trigger2 = trigger.getParent(); + if (typeof trigger2.baseDamage != "number") { + trigger2.baseDamage = 1; } - trigger2.baseDamage+=damage; + trigger2.baseDamage += damage; } - } - }, - fengpo2:{ - trigger:{source:'damageBegin1'}, - filter:function(event){ - return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.notLink(); }, - forced:true, - audio:false, - content:function(){ - if(typeof player.storage.fengpo=='number'){ - trigger.num+=player.storage.fengpo; - } - } }, - fengpo3:{charlotte:true}, + fengpo2: { + trigger: { source: "damageBegin1" }, + filter: function (event) { + return ( + event.card && + (event.card.name == "sha" || event.card.name == "juedou") && + event.notLink() + ); + }, + forced: true, + audio: false, + content: function () { + if (typeof player.storage.fengpo == "number") { + trigger.num += player.storage.fengpo; + } + }, + }, + fengpo3: { charlotte: true }, //士燮 biluan: { audio: 2, - trigger: { player: 'phaseDrawBegin1' }, + trigger: { player: "phaseDrawBegin1" }, check: function (event, player) { - if (player.countCards('h') > player.hp) return true; - if (player.hasJudge('lebu')) return true; + if (player.countCards("h") > player.hp) return true; + if (player.hasJudge("lebu")) return true; var ng = []; var players = game.filterPlayer(); for (var i = 0; i < players.length; i++) { - if (players[i].group != 'unknown') { + if (players[i].group != "unknown") { ng.add(players[i].group); } } @@ -21902,7 +27401,7 @@ game.import('character', function () { var nai = 0; for (var i = 0; i < players.length; i++) { if (players[i] != player) { - var dist = get.distance(players[i], player, 'attack'); + var dist = get.distance(players[i], player, "attack"); if (dist <= 1 && dist + ng > 1) { nai++; } @@ -21911,3747 +27410,4206 @@ game.import('character', function () { return nai >= 2; }, filter: function (event, player) { - return !event.numFixed && game.hasPlayer(function (current) { - return current != player && get.distance(current, player) <= 1; - }); + return ( + !event.numFixed && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); }, content: function () { - if (!player.hasSkill('rebiluan2')) player.addSkill('rebiluan2'); + if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); var ng = []; var players = game.filterPlayer(); for (var i = 0; i < players.length; i++) { - if (players[i].group != 'unknown') { + if (players[i].group != "unknown") { ng.add(players[i].group); } } - player.$damagepop(ng.length, 'unknownx'); + player.$damagepop(ng.length, "unknownx"); player.storage.rebiluan2 += ng.length; - player.markSkill('rebiluan2'); - game.addVideo('storage', player, ['biluan', player.storage.rebiluan2]); + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["biluan", player.storage.rebiluan2]); trigger.changeToZero(); }, }, lixia: { audio: 2, - trigger: { global: 'phaseJieshuBegin' }, + trigger: { global: "phaseJieshuBegin" }, filter: function (event, player) { - return event.player.isIn() && event.player != player && get.distance(event.player, player, 'attack') > 1; + return ( + event.player.isIn() && + event.player != player && + get.distance(event.player, player, "attack") > 1 + ); }, forced: true, content: function () { - 'step 0' - player.chooseTarget(function (card, player, target) { - return target == player || target == _status.event.source; - }, true, '礼下:选择一个目标摸一张牌').set('ai', function (target) { - if (get.attitude(player, trigger.player) > 2) return 114514 - target.countCards(); - return player == target ? 1 : 0; - }).set('source', trigger.player); - 'step 1' + "step 0"; + player + .chooseTarget( + function (card, player, target) { + return target == player || target == _status.event.source; + }, + true, + "礼下:选择一个目标摸一张牌" + ) + .set("ai", function (target) { + if (get.attitude(player, trigger.player) > 2) return 114514 - target.countCards(); + return player == target ? 1 : 0; + }) + .set("source", trigger.player); + ("step 1"); if (result.targets.length) { result.targets[0].draw(); - player.line(result.targets[0], 'green'); + player.line(result.targets[0], "green"); } - if (!player.hasSkill('rebiluan2')) player.addSkill('rebiluan2'); + if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); player.storage.rebiluan2--; - player.markSkill('rebiluan2'); - game.addVideo('storage', player, ['biluan', player.storage.rebiluan2]); - } + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["biluan", player.storage.rebiluan2]); + }, }, olbiluan: { - audio: 'biluan', - trigger: { player: 'phaseJieshuBegin' }, + audio: "biluan", + trigger: { player: "phaseJieshuBegin" }, checkx: function (player) { var ng = Math.min(4, game.countPlayer()); var nai = 0; for (var i = 0; i < game.players.length; i++) { if (game.players[i] != player) { - var dist = get.distance(game.players[i], player, 'attack'); + var dist = get.distance(game.players[i], player, "attack"); if (dist <= 1 && dist + ng > 1) nai++; } } return nai >= 2; }, filter: function (event, player) { - return player.countCards('he') && game.hasPlayer(function (current) { - return current != player && get.distance(current, player) <= 1; - }); + return ( + player.countCards("he") && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); }, direct: true, content: function () { - 'step 0' - player.chooseToDiscard('he', get.prompt2('olbiluan')).set('logSkill', 'olbiluan').set('ai', function (card) { - if (_status.event.check) return 6 - get.value(card); - return 0; - }).set('check', lib.skill.olbiluan.checkx(player)); - 'step 1' + "step 0"; + player + .chooseToDiscard("he", get.prompt2("olbiluan")) + .set("logSkill", "olbiluan") + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }) + .set("check", lib.skill.olbiluan.checkx(player)); + ("step 1"); if (result.bool) { - player.addSkill('rebiluan2'); + player.addSkill("rebiluan2"); var num = game.countGroup(); - player.$damagepop(num, 'unknownx'); + player.$damagepop(num, "unknownx"); player.storage.rebiluan2 += num; - player.markSkill('rebiluan2'); - game.addVideo('storage', player, ['rebiluan2', player.storage.rebiluan2]); + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); } }, }, ollixia: { - audio: 'lixia', - trigger: { global: 'phaseJieshuBegin' }, + audio: "lixia", + trigger: { global: "phaseJieshuBegin" }, filter: function (event, player) { - return event.player.isIn() && event.player != player && get.distance(event.player, player, 'attack') > 1; + return ( + event.player.isIn() && + event.player != player && + get.distance(event.player, player, "attack") > 1 + ); }, forced: true, content: function () { - 'step 0' - player.chooseTarget(function (card, player, target) { - return target == player || target == _status.event.source; - }, true, '礼下:请选择一个目标令其摸牌并减少你与其他角色的距离').set('ai', function (target) { - return player == target ? 1 : 0; - }).set('source', trigger.player); - 'step 1' + "step 0"; + player + .chooseTarget( + function (card, player, target) { + return target == player || target == _status.event.source; + }, + true, + "礼下:请选择一个目标令其摸牌并减少你与其他角色的距离" + ) + .set("ai", function (target) { + return player == target ? 1 : 0; + }) + .set("source", trigger.player); + ("step 1"); if (result.targets.length) { - var num = (result.targets[0] == player ? 1 : 2); + var num = result.targets[0] == player ? 1 : 2; result.targets[0].draw(num); - player.line(result.targets[0], 'green'); + player.line(result.targets[0], "green"); } - if (!player.hasSkill('rebiluan2')) player.addSkill('rebiluan2'); + if (!player.hasSkill("rebiluan2")) player.addSkill("rebiluan2"); player.storage.rebiluan2--; - player.markSkill('rebiluan2'); - game.addVideo('storage', player, ['rebiluan2', player.storage.rebiluan]); + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan]); }, }, - rebiluan2:{ - mark:true, - charlotte:true, - intro:{ - content:function(storage){ - if(storage>0){ - return '其他角色计算与你的距离时+'+storage; + rebiluan2: { + mark: true, + charlotte: true, + intro: { + content: function (storage) { + if (storage > 0) { + return "其他角色计算与你的距离时+" + storage; + } else if (storage < 0) { + return "其他角色计算与你的距离时" + storage; + } else { + return "无距离变化"; } - else if(storage<0){ - return '其他角色计算与你的距离时'+storage; - } - else{ - return '无距离变化'; - } - } + }, }, - init:function(player){ - if(typeof player.storage.rebiluan2!='number') player.storage.rebiluan2=0; + init: function (player) { + if (typeof player.storage.rebiluan2 != "number") player.storage.rebiluan2 = 0; }, - mod:{ - globalTo:function(from,to,distance){ - if(typeof to.storage.rebiluan2=='number'){ - return distance+to.storage.rebiluan2; + mod: { + globalTo: function (from, to, distance) { + if (typeof to.storage.rebiluan2 == "number") { + return distance + to.storage.rebiluan2; } - } - } + }, + }, }, - rebiluan:{ - audio:'biluan', - trigger:{player:'phaseJieshuBegin'}, - checkx:function(player){ - var ng=Math.min(4,game.countPlayer()); - var nai=0; - for(var i=0;i1){ + rebiluan: { + audio: "biluan", + trigger: { player: "phaseJieshuBegin" }, + checkx: function (player) { + var ng = Math.min(4, game.countPlayer()); + var nai = 0; + for (var i = 0; i < game.players.length; i++) { + if (game.players[i] != player) { + var dist = get.distance(game.players[i], player, "attack"); + if (dist <= 1 && dist + ng > 1) { nai++; } } } - return nai>=2; + return nai >= 2; }, - filter:function(event,player){ - return player.countCards('he')&&game.hasPlayer(function(current){ - return current!=player&&get.distance(current,player)<=1; - }); + filter: function (event, player) { + return ( + player.countCards("he") && + game.hasPlayer(function (current) { + return current != player && get.distance(current, player) <= 1; + }) + ); }, - direct:true, - content:function(){ - "step 0" - player.chooseToDiscard('he',get.prompt2('rebiluan')).set('logSkill','rebiluan').set('check',lib.skill.rebiluan.checkx(player)).set('ai',function(card){ - if(_status.event.check) return 6-get.value(card); - return 0; - }); - "step 1" - if(result.bool){ - player.addSkill('rebiluan2'); - var ng=Math.min(4,game.countPlayer()); - player.$damagepop(ng,'unknownx'); - player.storage.rebiluan2+=ng; - player.markSkill('rebiluan2'); - game.addVideo('storage',player,['rebiluan2',player.storage.rebiluan2]); + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard("he", get.prompt2("rebiluan")) + .set("logSkill", "rebiluan") + .set("check", lib.skill.rebiluan.checkx(player)) + .set("ai", function (card) { + if (_status.event.check) return 6 - get.value(card); + return 0; + }); + ("step 1"); + if (result.bool) { + player.addSkill("rebiluan2"); + var ng = Math.min(4, game.countPlayer()); + player.$damagepop(ng, "unknownx"); + player.storage.rebiluan2 += ng; + player.markSkill("rebiluan2"); + game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); } }, }, - relixia:{ - audio:'lixia', - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player.isIn()&&event.player!=player&&!player.inRangeOf(event.player); + relixia: { + audio: "lixia", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return event.player.isIn() && event.player != player && !player.inRangeOf(event.player); }, - forced:true, - content:function(){ - 'step 0' - if(trigger.player.isDead()){ - event._result={bool:true,links:[0]}; + forced: true, + content: function () { + "step 0"; + if (trigger.player.isDead()) { + event._result = { bool: true, links: [0] }; return; } - var list=[ - '令自己摸一张牌', - '令XXX摸两张牌', - '令XXX回复1点体力', - ]; - var card=get.translation(trigger.player); - var next=player.chooseButton([ - '【礼下】:请选择一至两项', - [list.map((item,index)=>{ - return [index,item.replace(/XXX/g,card)] - }),'textbutton'] - ],true,[1,2]); - next.set('dialog',event.videoId); - next.set('filterButton',function(button){ - if(button.link==2){ + var list = ["令自己摸一张牌", "令XXX摸两张牌", "令XXX回复1点体力"]; + var card = get.translation(trigger.player); + var next = player.chooseButton( + [ + "【礼下】:请选择一至两项", + [ + list.map((item, index) => { + return [index, item.replace(/XXX/g, card)]; + }), + "textbutton", + ], + ], + true, + [1, 2] + ); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + if (button.link == 2) { return _status.event.bool1; } return true; }); - next.set('bool1',trigger.player.isDamaged()); - next.set('ai',function(button){ - var player=_status.event.player; - var event=_status.event.getTrigger(); - if(button.link&&get.attitude(player,event.player)<=0) return 0; - return button.link*Math.random(); + next.set("bool1", trigger.player.isDamaged()); + next.set("ai", function (button) { + var player = _status.event.player; + var event = _status.event.getTrigger(); + if (button.link && get.attitude(player, event.player) <= 0) return 0; + return button.link * Math.random(); }); - "step 1" - var map=[ - function(trigger,player,event){ + ("step 1"); + var map = [ + function (trigger, player, event) { player.draw(); }, - function(trigger,player,event){ - if(!result.links.includes(2)) player.line(trigger.player); + function (trigger, player, event) { + if (!result.links.includes(2)) player.line(trigger.player); trigger.player.draw(2); }, - function(trigger,player,event){ + function (trigger, player, event) { player.line(trigger.player); trigger.player.recover(); - } + }, ]; result.links.sort(); - for(var i=0;i3; + return num > 3; }, - prompt:function(event,player){ - var num=game.countPlayer(function(current){ - if(player.hasZhuSkill('guiming')&¤t.group=='wu'&¤t!=player) return true; + prompt: function (event, player) { + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) + return true; return current.isDamaged(); }); - return '残蚀:是否改为摸'+get.cnNumber(num)+'张牌?'; + return "残蚀:是否改为摸" + get.cnNumber(num) + "张牌?"; }, - filter:function(event,player){ + filter: function (event, player) { return !event.numFixed; }, - content:function(){ + content: function () { trigger.changeToZero(); - var num=game.countPlayer(function(current){ - if(player.hasZhuSkill('guiming')&¤t.group=='wu'&¤t!=player) return true; + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) + return true; return current.isDamaged(); }); - if(num>0){ + if (num > 0) { player.draw(num); } - player.addTempSkill('canshi2'); - } - }, - canshi2:{ - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(player.countCards('he')==0) return false; - var type=get.type(event.card,'trick'); - return type=='basic'||type=='trick'; + player.addTempSkill("canshi2"); }, - autodelay:true, - content:function(){ - player.chooseToDiscard(true,'he'); - } }, - chouhai:{ - audio:2, - trigger:{player:'damageBegin3'}, - forced:true, - check:function(){ + canshi2: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (player.countCards("he") == 0) return false; + var type = get.type(event.card, "trick"); + return type == "basic" || type == "trick"; + }, + autodelay: true, + content: function () { + player.chooseToDiscard(true, "he"); + }, + }, + chouhai: { + audio: 2, + trigger: { player: "damageBegin3" }, + forced: true, + check: function () { return false; }, - filter:function(event,player){ - return player.countCards('h')==0; + filter: function (event, player) { + return player.countCards("h") == 0; }, - content:function(){ + content: function () { trigger.num++; }, - ai:{ - neg:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&target.countCards('h')==0) return [1,-2]; - } + ai: { + neg: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && target.countCards("h") == 0) return [1, -2]; + }, + }, + }, + }, + recanshi: { + audio: "canshi", + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + if ( + player.skipList.includes("phaseUse") || + !player.countCards("h", function (card) { + return get.type(card, "trick") == "trick" && player.hasUseTarget(card); + }) + ) + return true; + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu") return true; + return current.isDamaged(); + }); + return num > 1; + }, + prompt: function (event, player) { + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) + return true; + return current.isDamaged(); + }); + return "残蚀:是否多摸" + get.cnNumber(num) + "张牌?"; + }, + filter: function (event, player) { + return ( + !event.numFixed && + game.hasPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) + return true; + return current.isDamaged(); + }) + ); + }, + content: function () { + var num = game.countPlayer(function (current) { + if (player.hasZhuSkill("guiming") && current.group == "wu" && current != player) + return true; + return current.isDamaged(); + }); + if (num > 0) { + trigger.num += num; } - } + player.addTempSkill("recanshi2"); + }, }, - recanshi:{ - audio:'canshi', - trigger:{player:'phaseDrawBegin2'}, - check:function(event,player){ - if(player.skipList.includes('phaseUse')||!player.countCards('h',function(card){ - return get.type(card,'trick')=='trick'&&player.hasUseTarget(card); - })) return true; - var num=game.countPlayer(function(current){ - if(player.hasZhuSkill('guiming')&¤t.group=='wu') return true; - return current.isDamaged(); - }); - return num>1; + recanshi2: { + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (player.countCards("he") == 0) return false; + if (event.card.name == "sha") return true; + return get.type(event.card) == "trick"; }, - prompt:function(event,player){ - var num=game.countPlayer(function(current){ - if(player.hasZhuSkill('guiming')&¤t.group=='wu'&¤t!=player) return true; - return current.isDamaged(); - }); - return '残蚀:是否多摸'+get.cnNumber(num)+'张牌?'; + autodelay: true, + content: function () { + player.chooseToDiscard(true, "he"); }, - filter:function(event,player){ - return !event.numFixed&&game.hasPlayer(function(current){ - if(player.hasZhuSkill('guiming')&¤t.group=='wu'&¤t!=player) return true; - return current.isDamaged(); - }); - }, - content:function(){ - var num=game.countPlayer(function(current){ - if(player.hasZhuSkill('guiming')&¤t.group=='wu'&¤t!=player) return true; - return current.isDamaged(); - }); - if(num>0){ - trigger.num+=num; - } - player.addTempSkill('recanshi2'); - } }, - recanshi2:{ - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(player.countCards('he')==0) return false; - if(event.card.name=='sha') return true; - return get.type(event.card)=='trick'; - }, - autodelay:true, - content:function(){ - player.chooseToDiscard(true,'he'); - } - }, - rechouhai:{ - audio:'chouhai', - trigger:{player:'damageBegin3'}, - forced:true, - check:function(){ + rechouhai: { + audio: "chouhai", + trigger: { player: "damageBegin3" }, + forced: true, + check: function () { return false; }, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.countCards('h')==0; + filter: function (event, player) { + return event.card && event.card.name == "sha" && player.countCards("h") == 0; }, - content:function(){ + content: function () { trigger.num++; }, - ai:{ - neg:true, - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'&&target.countCards('h')==0) return [1,-2]; - } - } - } + ai: { + neg: true, + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && target.countCards("h") == 0) return [1, -2]; + }, + }, + }, }, - kunfen:{ - audio:2, - audioname:['ol_sb_jiangwei'], - trigger:{player:'phaseJieshuBegin'}, - locked:function(skill,player){ - if(!player||!player.storage.kunfen) return true; + kunfen: { + audio: 2, + audioname: ["ol_sb_jiangwei"], + trigger: { player: "phaseJieshuBegin" }, + locked: function (skill, player) { + if (!player || !player.storage.kunfen) return true; return false; }, - direct:true, - content:function(){ - 'step 0' - if(player.storage.kunfen||(get.mode()=='guozhan'&&player.hiddenSkills.includes('kunfen'))){ - if(!player.storage.kunfen) event.skillHidden=true; - player.chooseBool(get.prompt('kunfen'),'失去1点体力,然后摸两张牌').set('ai',function(){ - var player=_status.event.player; - if(player.hp>3) return true; - if(player.hp==3&&player.countCards('h')<3) return true; - if(player.hp==2&&player.countCards('h')==0) return true; - return false; - }); - } - else event._result={bool:true}; - 'step 1' - if(result.bool){ - player.logSkill('kunfen'); + direct: true, + content: function () { + "step 0"; + if ( + player.storage.kunfen || + (get.mode() == "guozhan" && player.hiddenSkills.includes("kunfen")) + ) { + if (!player.storage.kunfen) event.skillHidden = true; + player + .chooseBool(get.prompt("kunfen"), "失去1点体力,然后摸两张牌") + .set("ai", function () { + var player = _status.event.player; + if (player.hp > 3) return true; + if (player.hp == 3 && player.countCards("h") < 3) return true; + if (player.hp == 2 && player.countCards("h") == 0) return true; + return false; + }); + } else event._result = { bool: true }; + ("step 1"); + if (result.bool) { + player.logSkill("kunfen"); player.loseHp(); - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); player.draw(2); }, - ai:{threaten:1.5}, + ai: { threaten: 1.5 }, }, - fengliang:{ - skillAnimation:true, - animationColor:'thunder', - unique:true, - juexingji:true, - audio:2, - derivation:'oltiaoxin', - trigger:{player:'dying'}, + fengliang: { + skillAnimation: true, + animationColor: "thunder", + unique: true, + juexingji: true, + audio: 2, + derivation: "oltiaoxin", + trigger: { player: "dying" }, //priority:10, - forced:true, - filter:function(event,player){ + forced: true, + filter: function (event, player) { return !player.storage.kunfen; }, - content:function(){ - "step 0" - player.awakenSkill('fengliang'); + content: function () { + "step 0"; + player.awakenSkill("fengliang"); player.loseMaxHp(); - "step 1" - if(player.hp<2){ - player.recover(2-player.hp); + ("step 1"); + if (player.hp < 2) { + player.recover(2 - player.hp); } - "step 2" - player.storage.kunfen=true; - player.addSkills('oltiaoxin'); + ("step 2"); + player.storage.kunfen = true; + player.addSkills("oltiaoxin"); }, }, - zhuiji:{ - mod:{ - globalFrom:function(from,to){ - if(from.hp>=to.hp) return -Infinity; - } - } + zhuiji: { + mod: { + globalFrom: function (from, to) { + if (from.hp >= to.hp) return -Infinity; + }, + }, }, - oldcihuai:{ - audio:'cihuai', - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.countCards('h')>0; + oldcihuai: { + audio: "cihuai", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; }, - check:function(event,player){ - return !player.countCards('h','sha'); + check: function (event, player) { + return !player.countCards("h", "sha"); }, - content:function(){ + content: function () { player.showHandcards(); - if(!player.countCards('h','sha')) player.addTempSkill('oldcihuai2'); + if (!player.countCards("h", "sha")) player.addTempSkill("oldcihuai2"); }, }, - oldcihuai2:{ - group:'oldcihuai3', - prompt:'视为使用一张杀', - enable:'chooseToUse', - viewAs:{name:'sha',isCard:true}, - filterCard:function(){return false}, - selectCard:-1, - ai:{ - presha:true, - respondSha:true, + oldcihuai2: { + group: "oldcihuai3", + prompt: "视为使用一张杀", + enable: "chooseToUse", + viewAs: { name: "sha", isCard: true }, + filterCard: function () { + return false; + }, + selectCard: -1, + ai: { + presha: true, + respondSha: true, }, }, - oldcihuai3:{ - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter','die'], + oldcihuai3: { + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + "die", + ], }, - silent:true, - firstDo:true, - filter:function(event,player){ - if(event.name=='die') return true; - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length>0; + silent: true, + firstDo: true, + filter: function (event, player) { + if (event.name == "die") return true; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; }, - content:function(){ - player.removeSkill('oldcihuai2'); + content: function () { + player.removeSkill("oldcihuai2"); }, }, - cihuai:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h','sha')==0; + cihuai: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h", "sha") == 0; }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('cihuai'),function(card,player,target){ - return player.canUse({name:'sha',isCard:true},target); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha',isCard:true},player,player); - }); - "step 1" - if(result.bool){ - player.logSkill('cihuai'); - player.showHandcards(); - player.useCard({name:'sha',isCard:true},result.targets); - } - }, - ai:{ - expose:0.2, - } - }, - jilei:{ - trigger:{player:'damageEnd'}, - audio:2, - direct:true, - filter:function(event){ - return event.source&&event.source.isIn(); - }, - content:function(){ - 'step 0' - player.chooseControl('basic','trick','equip','cancel2',function(){ - var source=_status.event.source; - if(get.attitude(_status.event.player,source)>0) return 'cancel2'; - var list=['basic','trick','equip'].filter(function(name){ - return (!source.storage.jilei2||!source.storage.jilei2.includes(name)); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("cihuai"), function (card, player, target) { + return player.canUse({ name: "sha", isCard: true }, target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha", isCard: true }, player, player); }); - if(!list.length) return 'cancel2'; - if(list.includes('trick')&&source.countCards('h',function(card){ - return get.type(card,source)=='trick'&&source.hasValueTarget(card); - })>1) return 'trick'; - return list[0]; - }).set('prompt',get.prompt2('jilei',trigger.source)).set('source',trigger.source); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('jilei',trigger.source); - player.popup(get.translation(result.control)+'牌'); - trigger.source.addTempSkill('jilei2',{player:'phaseBegin'}); + ("step 1"); + if (result.bool) { + player.logSkill("cihuai"); + player.showHandcards(); + player.useCard({ name: "sha", isCard: true }, result.targets); + } + }, + ai: { + expose: 0.2, + }, + }, + jilei: { + trigger: { player: "damageEnd" }, + audio: 2, + direct: true, + filter: function (event) { + return event.source && event.source.isIn(); + }, + content: function () { + "step 0"; + player + .chooseControl("basic", "trick", "equip", "cancel2", function () { + var source = _status.event.source; + if (get.attitude(_status.event.player, source) > 0) return "cancel2"; + var list = ["basic", "trick", "equip"].filter(function (name) { + return !source.storage.jilei2 || !source.storage.jilei2.includes(name); + }); + if (!list.length) return "cancel2"; + if ( + list.includes("trick") && + source.countCards("h", function (card) { + return get.type(card, source) == "trick" && source.hasValueTarget(card); + }) > 1 + ) + return "trick"; + return list[0]; + }) + .set("prompt", get.prompt2("jilei", trigger.source)) + .set("source", trigger.source); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("jilei", trigger.source); + player.popup(get.translation(result.control) + "牌"); + trigger.source.addTempSkill("jilei2", { player: "phaseBegin" }); trigger.source.storage.jilei2.add(result.control); - trigger.source.updateMarks('jilei2'); + trigger.source.updateMarks("jilei2"); } }, - ai:{ - maixie_defend:true, - threaten:0.7 - } + ai: { + maixie_defend: true, + threaten: 0.7, + }, }, - jilei2:{ - unique:true, - charlotte:true, - intro:{ - content:function(storage){ - return '不能使用、打出或弃置'+get.translation(storage)+'牌'; - } - }, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; - }, - mark:true, - onremove:true, - mod:{ - cardDiscardable:function(card,player){ - if(player.storage.jilei2.includes(get.type(card,'trick'))) return false; + jilei2: { + unique: true, + charlotte: true, + intro: { + content: function (storage) { + return "不能使用、打出或弃置" + get.translation(storage) + "牌"; }, - cardEnabled:function(card,player){ - if(player.storage.jilei2.includes(get.type(card,'trick'))){ - var hs=player.getCards('h'),cards=[card]; - if(Array.isArray(card.cards)) cards.addArray(card.cards); - for(var i of cards){ - if(hs.includes(i)) return false; + }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + mark: true, + onremove: true, + mod: { + cardDiscardable: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) return false; + }, + cardEnabled: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) { + var hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (var i of cards) { + if (hs.includes(i)) return false; } } }, - cardRespondable:function(card,player){ - if(player.storage.jilei2.includes(get.type(card,'trick'))){ - var hs=player.getCards('h'),cards=[card]; - if(Array.isArray(card.cards)) cards.addArray(card.cards); - for(var i of cards){ - if(hs.includes(i)) return false; + cardRespondable: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) { + var hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (var i of cards) { + if (hs.includes(i)) return false; } } }, - cardSavable:function(card,player){ - if(player.storage.jilei2.includes(get.type(card,'trick'))){ - var hs=player.getCards('h'),cards=[card]; - if(Array.isArray(card.cards)) cards.addArray(card.cards); - for(var i of cards){ - if(hs.includes(i)) return false; + cardSavable: function (card, player) { + if (player.storage.jilei2.includes(get.type(card, "trick"))) { + var hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + for (var i of cards) { + if (hs.includes(i)) return false; } } }, }, }, - danlao:{ - audio:2, - filter:function(event,player){ - return (event.card.name=='sha'||get.type(event.card)=='trick')&&event.targets&&event.targets.length>1; + danlao: { + audio: 2, + filter: function (event, player) { + return ( + (event.card.name == "sha" || get.type(event.card) == "trick") && + event.targets && + event.targets.length > 1 + ); }, - check:function(event,player){ - return event.getParent().excluded.includes(player)||get.tag(event.card,'multineg')||get.effect(player,event.card,event.player,player)<=0; + check: function (event, player) { + return ( + event.getParent().excluded.includes(player) || + get.tag(event.card, "multineg") || + get.effect(player, event.card, event.player, player) <= 0 + ); }, - trigger:{target:'useCardToTargeted'}, - content:function(){ + trigger: { target: "useCardToTargeted" }, + content: function () { trigger.getParent().excluded.add(player); player.draw(); }, - ai:{ - effect:{ - target:function(card){ - if(get.type(card)!='trick') return; - if(card.name=='tiesuo') return [0,0]; - if(card.name=='yihuajiemu') return [0,1]; - if(get.tag(card,'multineg')) return [0,2]; - } - } - } + ai: { + effect: { + target: function (card) { + if (get.type(card) != "trick") return; + if (card.name == "tiesuo") return [0, 0]; + if (card.name == "yihuajiemu") return [0, 1]; + if (get.tag(card, "multineg")) return [0, 2]; + }, + }, + }, }, - taichen:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player.canUse('sha',target); + taichen: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player.canUse("sha", target); }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.loseHp(); - "step 1" - player.useCard({name:'sha',isCard:true},target,false); + ("step 1"); + player.useCard({ name: "sha", isCard: true }, target, false); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(player.hp>2&&player.hp>target.hp&&target.countCards('he')<4){ - return get.effect(target,{name:'sha'},player,target); + ai: { + order: 1, + result: { + target: function (player, target) { + if (player.hp > 2 && player.hp > target.hp && target.countCards("he") < 4) { + return get.effect(target, { name: "sha" }, player, target); } return 0; - } - } - } + }, + }, + }, }, - naman:{ - audio:2, - trigger:{global:'respondAfter'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(event.player==player) return false; - if(event.cards){ - for(var i=0;i0; + xiemu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; }, - filterCard:{name:'sha'}, - check:function(card){return 6-get.value(card)}, - content:function(){ - 'step 0' - var list=lib.group.filter(function(group){ - return ['wei','shu','wu','qun'].includes(group)||game.hasPlayer(function(current){ - return current.group==group; + filterCard: { name: "sha" }, + check: function (card) { + return 6 - get.value(card); + }, + content: function () { + "step 0"; + var list = lib.group.filter(function (group) { + return ( + ["wei", "shu", "wu", "qun"].includes(group) || + game.hasPlayer(function (current) { + return current.group == group; + }) + ); + }); + if (player.storage.xiemu2) list.removeArray(player.storage.xiemu2); + var list2 = list.slice(0); + list2.sort(function (a, b) { + return lib.skill.xiemu.count(b) - lib.skill.xiemu.count(a); + }); + player + .chooseControl(list) + .set("prompt", "请选择一个势力") + .set("ai", function () { + return _status.event.group; }) - }); - if(player.storage.xiemu2) list.removeArray(player.storage.xiemu2); - var list2=list.slice(0); - list2.sort(function(a,b){ - return lib.skill.xiemu.count(b)-lib.skill.xiemu.count(a); - }); - player.chooseControl(list).set('prompt','请选择一个势力').set('ai',function(){return _status.event.group}).set('group',list2[0]); - 'step 1' - player.popup(result.control+2,get.groupnature(result.control)); - game.log(player,'选择了','#g'+get.translation(result.control+2)); - player.addTempSkill('xiemu2',{player:'phaseBegin'}); + .set("group", list2[0]); + ("step 1"); + player.popup(result.control + 2, get.groupnature(result.control)); + game.log(player, "选择了", "#g" + get.translation(result.control + 2)); + player.addTempSkill("xiemu2", { player: "phaseBegin" }); player.storage.xiemu2.add(result.control); - player.updateMarks('xiemu2'); + player.updateMarks("xiemu2"); }, - ai:{ - order:1, - result:{player:1}, + ai: { + order: 1, + result: { player: 1 }, }, - count:function(group){ - var player=_status.event.player; - return game.countPlayer(function(current){ - return current!=player&¤t.group==group&&get.attitude(current,player)<0; + count: function (group) { + var player = _status.event.player; + return game.countPlayer(function (current) { + return ( + current != player && current.group == group && get.attitude(current, player) < 0 + ); }); }, }, - xiemu2:{ - onremove:true, - mark:true, - forced:true, - audio:'xiemu', - intro:{ - content:function(storage){ - return '已指定'+get.translation(storage)+'势力'; + xiemu2: { + onremove: true, + mark: true, + forced: true, + audio: "xiemu", + intro: { + content: function (storage) { + return "已指定" + get.translation(storage) + "势力"; }, }, - trigger:{ - target:'useCardToTargeted' + trigger: { + target: "useCardToTargeted", }, - init:function(player){ - if(!player.storage.xiemu2) player.storage.xiemu2=[]; + init: function (player) { + if (!player.storage.xiemu2) player.storage.xiemu2 = []; }, - filter:function(event,player){ - if(!player.storage.xiemu2) return false; - if(get.color(event.card)!='black') return false; - if(!event.player) return false; - if(event.player==player||!player.storage.xiemu2.includes(event.player.group)) return false; + filter: function (event, player) { + if (!player.storage.xiemu2) return false; + if (get.color(event.card) != "black") return false; + if (!event.player) return false; + if (event.player == player || !player.storage.xiemu2.includes(event.player.group)) + return false; return true; }, - content:function(){ + content: function () { player.draw(2); }, }, - oldxiemu:{ - audio:'xiemu', - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - if(get.color(event.card)!='black') return false; - if(!event.player) return false; - if(event.player==player) return false; - if(get.mode()!='guozhan') return false; - return player.countCards('h','sha')>0; + oldxiemu: { + audio: "xiemu", + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + if (get.color(event.card) != "black") return false; + if (!event.player) return false; + if (event.player == player) return false; + if (get.mode() != "guozhan") return false; + return player.countCards("h", "sha") > 0; }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('协穆:是否弃置一张杀并摸两张牌?',{name:'sha'}); - next.set('ai',function(card){ - return 9-get.value(card); + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard("协穆:是否弃置一张杀并摸两张牌?", { name: "sha" }); + next.set("ai", function (card) { + return 9 - get.value(card); }); - next.logSkill='xiemu'; - "step 1" - if(result.bool){ + next.logSkill = "xiemu"; + ("step 1"); + if (result.bool) { player.draw(2); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.color(card)=='black'&&target.countCards('h')>0){ - return [1,0.5]; + ai: { + effect: { + target: function (card, player, target) { + if (get.color(card) == "black" && target.countCards("h") > 0) { + return [1, 0.5]; } - } - } - } - }, - spmengjin:{ - trigger:{player:'shaBegin'}, - filter:function(event,player){ - return event.target.countCards('he')>0; + }, + }, }, - direct:true, - content:function(){ - "step 0" - var att=get.attitude(player,trigger.target); - player.choosePlayerCard(get.prompt('spmengjin',trigger.target),'he',trigger.target).ai=function(button){ - var val=get.buttonValue(button); - if(att>0) return -val; + }, + spmengjin: { + trigger: { player: "shaBegin" }, + filter: function (event, player) { + return event.target.countCards("he") > 0; + }, + direct: true, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.target); + player.choosePlayerCard( + get.prompt("spmengjin", trigger.target), + "he", + trigger.target + ).ai = function (button) { + var val = get.buttonValue(button); + if (att > 0) return -val; return val; }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { trigger.target.discard(result.links); - player.logSkill('spmengjin',trigger.target); - trigger.target.addTempSkill('mengjin2','shaAfter'); + player.logSkill("spmengjin", trigger.target); + trigger.target.addTempSkill("mengjin2", "shaAfter"); } }, - ai:{ - expose:0.2 - } - }, - fenxun_old:{ - audio:2, - trigger:{player:'shaBefore'}, - direct:true, - filter:function(event,player){ - return event.targets.length==1; + ai: { + expose: 0.2, }, - position:'he', - content:function(){ - "step 0" + }, + fenxun_old: { + audio: 2, + trigger: { player: "shaBefore" }, + direct: true, + filter: function (event, player) { + return event.targets.length == 1; + }, + position: "he", + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:lib.filter.cardDiscardable, - filterTarget:function(card,player,target){ - var trigger=_status.event.getTrigger(); - return lib.filter.targetEnabled(trigger.card,player,target)&&target!=trigger.targets[0]; + filterCard: lib.filter.cardDiscardable, + filterTarget: function (card, player, target) { + var trigger = _status.event.getTrigger(); + return ( + lib.filter.targetEnabled(trigger.card, player, target) && + target != trigger.targets[0] + ); }, - ai1:function(card){ - return 6-get.value(card); + ai1: function (card) { + return 6 - get.value(card); }, - ai2:function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); + ai2: function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); }, - prompt:get.prompt2('fenxun') + prompt: get.prompt2("fenxun"), }); - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.discard(result.cards); trigger.targets.push(result.targets[0]); - player.logSkill('fenxun',result.targets); + player.logSkill("fenxun", result.targets); } - } + }, }, - rezhoufu:{ - audio:'zhoufu', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0; + rezhoufu: { + audio: "zhoufu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - filterTarget:function(card,player,target){ - return target!=player&&!target.getExpansions('rezhoufu2').length; + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && !target.getExpansions("rezhoufu2").length; }, - check:function(card){ - return 6-get.value(card) + check: function (card) { + return 6 - get.value(card); }, - position:'he', - discard:false, - lose:false, - delay:false, - content:function(){ - if(!target.storage.rezhoufu2_markcount) target.storage.rezhoufu2_markcount=0; - target.addToExpansion(cards,player,'give').gaintag.add('rezhoufu2'); - target.addSkill('rezhoufu_judge'); + position: "he", + discard: false, + lose: false, + delay: false, + content: function () { + if (!target.storage.rezhoufu2_markcount) target.storage.rezhoufu2_markcount = 0; + target.addToExpansion(cards, player, "give").gaintag.add("rezhoufu2"); + target.addSkill("rezhoufu_judge"); }, - ai:{ - order:1, - result:{ - target:-1, + ai: { + order: 1, + result: { + target: -1, }, }, - group:['rezhoufu_losehp'], - subSkill:{ - judge:{ - audio:'zhoufu', - trigger:{player:'judgeBefore'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return !event.directresult&&player.getExpansions('rezhoufu2').length; + group: ["rezhoufu_losehp"], + subSkill: { + judge: { + audio: "zhoufu", + trigger: { player: "judgeBefore" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.directresult && player.getExpansions("rezhoufu2").length; }, - content:function(){ - var cards=[player.getExpansions('rezhoufu2')[0]]; - trigger.directresult=cards[0]; + content: function () { + var cards = [player.getExpansions("rezhoufu2")[0]]; + trigger.directresult = cards[0]; }, }, - losehp:{ - audio:'zhoufu', - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.hasHistory('lose',function(evt){ - if(!evt||!evt.xs||!evt.xs.length) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('rezhoufu2')) return true; + losehp: { + audio: "zhoufu", + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hasHistory("lose", function (evt) { + if (!evt || !evt.xs || !evt.xs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rezhoufu2")) return true; } return false; }); }); }, - logTarget:function(current){ - return game.filterPlayer(function(current){ - return current.hasHistory('lose',function(evt){ - if(!evt||!evt.xs||!evt.xs.length) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('rezhoufu2')) return true; - } - return false; - }); - }).sortBySeat(); + logTarget: function (current) { + return game + .filterPlayer(function (current) { + return current.hasHistory("lose", function (evt) { + if (!evt || !evt.xs || !evt.xs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + } + return false; + }); + }) + .sortBySeat(); }, - content:function(){ - var targets=game.filterPlayer(function(current){ - return current.hasHistory('lose',function(evt){ - if(!evt||!evt.xs||!evt.xs.length) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('rezhoufu2')) return true; - } - return false; - }); - }).sortBySeat(); - while(targets.length){ + content: function () { + var targets = game + .filterPlayer(function (current) { + return current.hasHistory("lose", function (evt) { + if (!evt || !evt.xs || !evt.xs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + } + return false; + }); + }) + .sortBySeat(); + while (targets.length) { targets.shift().loseHp(); } }, }, }, }, - rezhoufu2:{ - intro:{ - content:'expansion', + rezhoufu2: { + intro: { + content: "expansion", }, }, - rezhoufu3:{}, - reyingbing:{ - audio:'yingbin', - trigger:{global:'useCard'}, - forced:true, - filter:function(event,player){ - var cards=event.player.getExpansions('rezhoufu2'); - return cards.length&&get.color(cards[0])==get.color(event.card); + rezhoufu3: {}, + reyingbing: { + audio: "yingbin", + trigger: { global: "useCard" }, + forced: true, + filter: function (event, player) { + var cards = event.player.getExpansions("rezhoufu2"); + return cards.length && get.color(cards[0]) == get.color(event.card); }, - logTarget:'player', - content:function(){ - 'step 0' + logTarget: "player", + content: function () { + "step 0"; player.draw(); - 'step 1' + ("step 1"); trigger.player.storage.rezhoufu2_markcount++; - if(trigger.player.storage.rezhoufu2_markcount>=2){ + if (trigger.player.storage.rezhoufu2_markcount >= 2) { delete trigger.player.storage.rezhoufu2_markcount; - var cards=trigger.player.getExpansions('rezhoufu2'); - player.gain(cards,trigger.player,'give','bySelf'); - } - else trigger.player.markSkill('rezhoufu2'); + var cards = trigger.player.getExpansions("rezhoufu2"); + player.gain(cards, trigger.player, "give", "bySelf"); + } else trigger.player.markSkill("rezhoufu2"); + }, + ai: { + combo: "rezhoufu", }, - ai:{ - combo:'rezhoufu' - } }, - zhoufu:{ - audio:2, + zhoufu: { + audio: 2, }, - yingbin:{ - audio:2, + yingbin: { + audio: 2, }, - kuiwei:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - check:function(event,player){ - if(player.isTurnedOver()) return true; - var num=game.countPlayer(function(current){ + kuiwei: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + if (player.isTurnedOver()) return true; + var num = game.countPlayer(function (current) { return current.getEquip(1); }); - return num>1; + return num > 1; }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.turnOver(); - "step 1" - var num=game.countPlayer(function(current){ + ("step 1"); + var num = game.countPlayer(function (current) { return current.getEquips(1).length; }); - player.draw(2+num); - player.addSkill('kuiwei2'); + player.draw(2 + num); + player.addSkill("kuiwei2"); + }, + ai: { + effect: { + target: function (card) { + if (card.name == "guiyoujie") return [0, 2]; + }, + }, }, - ai:{ - effect:{ - target:function(card){ - if(card.name=='guiyoujie') return [0,2]; - } - } - } }, - kuiwei2:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - audio:false, - content:function(){ - var num=game.countPlayer(function(current){ + kuiwei2: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + audio: false, + content: function () { + var num = game.countPlayer(function (current) { return current.getEquips(1).length; }); - if(num>=player.countCards('he')){ - player.discard(player.getCards('he')); + if (num >= player.countCards("he")) { + player.discard(player.getCards("he")); + } else if (num) { + player.chooseToDiscard("he", num, true); } - else if(num){ - player.chooseToDiscard('he',num,true); - } - player.removeSkill('kuiwei2'); - } + player.removeSkill("kuiwei2"); + }, }, - yanzheng:{ - enable:'chooseToUse', - audio:2, - filter:function(event,player){ - return player.hp0; + yanzheng: { + enable: "chooseToUse", + audio: 2, + filter: function (event, player) { + return player.hp < player.countCards("h") && player.countCards("e") > 0; }, - viewAsFilter:function(player){ - return player.hp0; + viewAsFilter: function (player) { + return player.hp < player.countCards("h") && player.countCards("e") > 0; }, - filterCard:true, - position:'e', - viewAs:{name:'wuxie'}, - prompt:'将一张装备区内的牌当无懈可击使用', - check:function(card){return 8-get.equipValue(card)}, - threaten:1.2 + filterCard: true, + position: "e", + viewAs: { name: "wuxie" }, + prompt: "将一张装备区内的牌当无懈可击使用", + check: function (card) { + return 8 - get.equipValue(card); + }, + threaten: 1.2, }, - tongji:{ - global:'tongji_disable', - audio:2, - trigger:{global:"useCard1"}, - forced:true, - filter:function (event,player){ - return event.targets.includes(player)&&player!=event.player&&event.card.name=='sha'&&player.hp=0; + }, + wangzun3: { + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, }, - logTarget:'target', - content:function(){ - "step 0" + }, + kaikang: { + audio: 2, + trigger: { global: "useCardToTargeted" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + get.distance(player, event.target) <= 1 && + event.target.isIn() + ); + }, + check: function (event, player) { + return get.attitude(player, event.target) >= 0; + }, + logTarget: "target", + content: function () { + "step 0"; player.draw(); - if(trigger.target!=player){ - player.chooseCard(true,'he','交给'+get.translation(trigger.target)+'一张牌').set('ai',function(card){ - if(get.position(card)=='e') return -1; - if(card.name=='shan') return 1; - if(get.type(card)=='equip') return 0.5; - return 0; - }); - } - else{ + if (trigger.target != player) { + player + .chooseCard(true, "he", "交给" + get.translation(trigger.target) + "一张牌") + .set("ai", function (card) { + if (get.position(card) == "e") return -1; + if (card.name == "shan") return 1; + if (get.type(card) == "equip") return 0.5; + return 0; + }); + } else { event.finish(); } - "step 1" - player.give(result.cards,trigger.target,'give'); + ("step 1"); + player.give(result.cards, trigger.target, "give"); game.delay(); - event.card=result.cards[0]; - "step 2" - if(trigger.target.getCards('h').includes(card)&&get.type(card)=='equip'){ + event.card = result.cards[0]; + ("step 2"); + if (trigger.target.getCards("h").includes(card) && get.type(card) == "equip") { trigger.target.chooseUseTarget(card); } }, - ai:{ - threaten:1.1 - } + ai: { + threaten: 1.1, + }, }, - liangzhu:{ - audio:2, - trigger:{global:'recoverAfter'}, - direct:true, - filter:function(event,player){ + liangzhu: { + audio: 2, + trigger: { global: "recoverAfter" }, + direct: true, + filter: function (event, player) { return event.player.isPhaseUsing(); }, - content:function(){ - 'step 0' - if(player==trigger.player){ - player.chooseControl('摸一张','摸两张','cancel2',function(){ - return '摸两张'; - }).set('prompt',get.prompt2('liangzhu')); - event.single=true; + content: function () { + "step 0"; + if (player == trigger.player) { + player + .chooseControl("摸一张", "摸两张", "cancel2", function () { + return "摸两张"; + }) + .set("prompt", get.prompt2("liangzhu")); + event.single = true; + } else { + player + .chooseTarget(get.prompt2("liangzhu"), function (card, player, target) { + return target == _status.event.player || target == _status.event.target; + }) + .set("target", trigger.player) + .set("ai", function (target) { + var player = _status.event.player; + if (player == target) return 1; + return get.attitude(player, target) - 1.5; + }); } - else{ - player.chooseTarget(get.prompt2('liangzhu'),function(card,player,target){ - return target==_status.event.player||target==_status.event.target; - }).set('target',trigger.player).set('ai',function(target){ - var player=_status.event.player; - if(player==target) return 1; - return get.attitude(player,target)-1.5; - }); - } - 'step 1' - if(event.single){ - if(result.control!='cancel2'){ - player.logSkill('liangzhu',player); - if(result.control=='摸一张'){ + ("step 1"); + if (event.single) { + if (result.control != "cancel2") { + player.logSkill("liangzhu", player); + if (result.control == "摸一张") { player.draw(); - } - else{ + } else { player.draw(2); - if(!player.storage.liangzhu) player.storage.liangzhu=[]; + if (!player.storage.liangzhu) player.storage.liangzhu = []; player.storage.liangzhu.add(player); } } - } - else if(result.bool){ - var target=result.targets[0]; - player.logSkill('liangzhu',target); - if(target==player){ + } else if (result.bool) { + var target = result.targets[0]; + player.logSkill("liangzhu", target); + if (target == player) { target.draw(); - } - else{ + } else { target.draw(2); - if(target.storage.liangzhu){ + if (target.storage.liangzhu) { target.storage.liangzhu.add(player); - } - else{ - target.storage.liangzhu=[player]; + } else { + target.storage.liangzhu = [player]; } } } }, - ai:{ - expose:0.1 - } + ai: { + expose: 0.1, + }, }, - fanxiang:{ - skillAnimation:true, - animationColor:'fire', - audio:2, - unique:true, - juexingji:true, - forceunique:true, - derivation:'xiaoji', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - if(player.storage.fanxiang) return false; - return game.hasPlayer(function(current){ - return current.storage.liangzhu&¤t.storage.liangzhu.includes(player)&¤t.isDamaged(); + fanxiang: { + skillAnimation: true, + animationColor: "fire", + audio: 2, + unique: true, + juexingji: true, + forceunique: true, + derivation: "xiaoji", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (player.storage.fanxiang) return false; + return game.hasPlayer(function (current) { + return ( + current.storage.liangzhu && + current.storage.liangzhu.includes(player) && + current.isDamaged() + ); }); }, - forced:true, - content:function(){ - player.awakenSkill('fanxiang'); + forced: true, + content: function () { + player.awakenSkill("fanxiang"); player.gainMaxHp(); player.recover(); - player.changeSkills(['xiaoji'],['liangzhu']); + player.changeSkills(["xiaoji"], ["liangzhu"]); }, }, - mingshi:{ - audio:2, - trigger:{player:'damageBegin3'}, - direct:true, - filter:function(event,player){ - return event.source&&event.source.hp>player.hp; + mingshi: { + audio: 2, + trigger: { player: "damageBegin3" }, + direct: true, + filter: function (event, player) { + return event.source && event.source.hp > player.hp; }, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt2('mingshi'),{color:'black'}); - next.set('ai',function(card){ - return 9-get.value(card); + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt2("mingshi"), { color: "black" }); + next.set("ai", function (card) { + return 9 - get.value(card); }); - next.set('logSkill','mingshi'); - "step 1" - if(result.bool){ + next.set("logSkill", "mingshi"); + ("step 1"); + if (result.bool) { trigger.num--; } }, - ai:{ - threaten:0.8 - } - }, - lirang:{ - audio:2, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + ai: { + threaten: 0.8, }, - filter:function(event,player){ - if(!game.hasPlayer(current=>current!=player)) return false; - if(event.type!='discard'||event.getlx===false) return false; - var evt=event.getl(player); - if(!evt||!evt.cards2) return false; - for(var i=0;i current != player)) return false; + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2) return false; + for (var i = 0; i < evt.cards2.length; i++) { + if (get.position(evt.cards2[i]) == "d") { return true; } } return false; }, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - if(trigger.delay==false) game.delay(); - event.cards=[]; - var cards2=trigger.getl(player).cards2; - for(var i=0;i1; + if (!goon) { + goon = game.hasPlayer(function (current) { + return player != current && get.attitude(player, current) > 1; }); } - player.chooseButton(['礼让:是否分配本次弃置的牌?',event.cards], - [1,event.cards.length]).set('ai',function(button){ - if(_status.event.goon&&ui.selected.buttons.length==0) return 1+Math.abs(get.value(button.link)); - return 0; - }).set('goon',goon).setHiddenSkill('lirang'); - 'step 2' - if(result.bool){ + player + .chooseButton(["礼让:是否分配本次弃置的牌?", event.cards], [1, event.cards.length]) + .set("ai", function (button) { + if (_status.event.goon && ui.selected.buttons.length == 0) + return 1 + Math.abs(get.value(button.link)); + return 0; + }) + .set("goon", goon) + .setHiddenSkill("lirang"); + ("step 2"); + if (result.bool) { event.cards.removeArray(result.links); - event.togive=result.links.slice(0); - player.chooseTarget('选择一名其他角色获得'+get.translation(result.links),true,lib.filter.notMe).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.enemy){ - return -att; - } - else if(att>0){ - return att/(1+target.countCards('h')); - } - else{ - return att/100; - } - }).set('enemy',get.value(event.togive[0],player,'raw')<0); - } - else event.goto(4); - 'step 3' - if(result.targets.length){ - var id=result.targets[0].playerid,map=event.given_map; - if(!map[id]) map[id]=[]; + event.togive = result.links.slice(0); + player + .chooseTarget( + "选择一名其他角色获得" + get.translation(result.links), + true, + lib.filter.notMe + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + } else event.goto(4); + ("step 3"); + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; map[id].addArray(event.togive); } - if(cards.length>0) event.goto(1); - 'step 4' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + if (cards.length > 0) event.goto(1); + ("step 4"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - var list=[],targets=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - list.push([source,event.given_map[i]]); + var list = [], + targets = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + list.push([source, event.given_map[i]]); targets.push(source); } - if(targets.length){ - player.logSkill('lirang',targets); + if (targets.length) { + player.logSkill("lirang", targets); game.loseAsync({ - gain_list:list, - giver:player, - animate:'gain2', - }).setContent('gaincardMultiple'); + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); } }, - ai:{ - expose:0.1, - effect:{ - target:function(card,player,target,current){ - if(target.hasFriend()&&get.tag(card,'discard')){ - if(current<0) return 0; - return [1,1]; + ai: { + expose: 0.1, + effect: { + target: function (card, player, target, current) { + if (target.hasFriend() && get.tag(card, "discard")) { + if (current < 0) return 0; + return [1, 1]; } - } - } - } - }, - moukui:{ - audio:2, - audioname:['sp_mushun'], - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'; + }, + }, }, - content:function(){ - "step 0" - var controls=['draw_card']; - if(trigger.target.countCards('he')){ - controls.push('discard_card'); + }, + moukui: { + audio: 2, + audioname: ["sp_mushun"], + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + var controls = ["draw_card"]; + if (trigger.target.countCards("he")) { + controls.push("discard_card"); } - controls.push('cancel'); - player.chooseControl(controls).set('ai',function(){ - var trigger=_status.event.getTrigger(); - if(trigger.target.countCards('he')&&get.attitude(_status.event.player,trigger.target)<0){ - return 'discard_card'; - } - else{ - return 'draw_card'; - } - }).set('prompt',get.prompt2('moukui')); - "step 1" - if(result.control=='draw_card'){ + controls.push("cancel"); + player + .chooseControl(controls) + .set("ai", function () { + var trigger = _status.event.getTrigger(); + if ( + trigger.target.countCards("he") && + get.attitude(_status.event.player, trigger.target) < 0 + ) { + return "discard_card"; + } else { + return "draw_card"; + } + }) + .set("prompt", get.prompt2("moukui")); + ("step 1"); + if (result.control == "draw_card") { player.draw(); - player.logSkill('moukui'); - } - else if(result.control=='discard_card'&&trigger.target.countCards('he')){ - player.discardPlayerCard(trigger.target,'he',true).logSkill=['moukui',trigger.target]; - } - else event.finish(); - "step 2" - player.addTempSkill('moukui2','shaEnd'); + player.logSkill("moukui"); + } else if (result.control == "discard_card" && trigger.target.countCards("he")) { + player.discardPlayerCard(trigger.target, "he", true).logSkill = [ + "moukui", + trigger.target, + ]; + } else event.finish(); + ("step 2"); + player.addTempSkill("moukui2", "shaEnd"); }, - ai:{ - expose:0.1 - } - }, - moukui2:{ - audio:false, - trigger:{player:'shaMiss'}, - forced:true, - filter:function(event,player){ - return player.countCards('he')>0; + ai: { + expose: 0.1, }, - content:function(){ - trigger.target.discardPlayerCard(player,true); - } }, - shenxian:{ - audio:2, - trigger:{global:['loseAfter','loseAsyncAfter']}, - filter:function(event,player){ - if(event.type!='discard'||_status.currentPhase==player||event.getlx===false) return false; - if(event.name=='lose'&&event.player==player) return false; - if(player.hasSkill('shenxian2')) return false; - var cards=event.cards.slice(0); - var evt=event.getl(player); - if(evt&&evt.cards) cards.removeArray(evt.cards); - for(var i=0;i 0; + }, + content: function () { + trigger.target.discardPlayerCard(player, true); + }, + }, + shenxian: { + audio: 2, + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + if (event.type != "discard" || _status.currentPhase == player || event.getlx === false) + return false; + if (event.name == "lose" && event.player == player) return false; + if (player.hasSkill("shenxian2")) return false; + var cards = event.cards.slice(0); + var evt = event.getl(player); + if (evt && evt.cards) cards.removeArray(evt.cards); + for (var i = 0; i < cards.length; i++) { + if ( + get.type( + cards[i], + null, + event.hs && event.hs.includes(cards[i]) ? event.player : false + ) == "basic" && + cards[i].original != "j" + ) { return true; } } return false; }, - frequent:true, - content:function(){ - "step 0" - if(trigger.delay==false) game.delay(); - "step 1" + frequent: true, + content: function () { + "step 0"; + if (trigger.delay == false) game.delay(); + ("step 1"); player.draw(); - if(event.name=='shenxian') player.addTempSkill('shenxian2'); + if (event.name == "shenxian") player.addTempSkill("shenxian2"); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5 - } }, - shenxian2:{charlotte:true}, - qiangwu:{ - audio:2, - enable:'phaseUse', - usable:1, - content:function(){ - "step 0" + shenxian2: { charlotte: true }, + qiangwu: { + audio: 2, + enable: "phaseUse", + usable: 1, + content: function () { + "step 0"; player.judge(); - "step 1" - player.storage.qiangwu=result.number; - player.addTempSkill('qiangwu3','phaseUseEnd'); + ("step 1"); + player.storage.qiangwu = result.number; + player.addTempSkill("qiangwu3", "phaseUseEnd"); }, - ai:{ - result:{ - player:1 + ai: { + result: { + player: 1, }, - order:11 + order: 11, }, }, - qiangwu3:{ - mod:{ - targetInRange:function(card,player){ - if (card.name == 'sha') { + qiangwu3: { + mod: { + targetInRange: function (card, player) { + if (card.name == "sha") { const num = get.number(card); - if (num == 'unsure' || num < player.storage.qiangwu) return true; + if (num == "unsure" || num < player.storage.qiangwu) return true; } }, - cardUsable:function(card,player){ - if (card.name == 'sha') { + cardUsable: function (card, player) { + if (card.name == "sha") { const num = get.number(card); - if (num == 'unsure' || num > player.storage.qiangwu) return true; + if (num == "unsure" || num > player.storage.qiangwu) return true; } - } + }, }, - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(_status.currentPhase==player&&event.card.name=='sha'&& - get.number(event.card)>player.storage.qiangwu&&event.addCount!==false) return true; + trigger: { player: "useCard1" }, + filter: function (event, player) { + if ( + _status.currentPhase == player && + event.card.name == "sha" && + get.number(event.card) > player.storage.qiangwu && + event.addCount !== false + ) + return true; return false; }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - trigger.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + forced: true, + popup: false, + firstDo: true, + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } }, }, - zhendu:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return /*(get.mode()!='guozhan'||event.player!=player)&&*/event.player.isIn()&&player.countCards('h')>0&&event.player.hasUseTarget({name:'jiu'},null,true); + zhendu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return ( + /*(get.mode()!='guozhan'||event.player!=player)&&*/ event.player.isIn() && + player.countCards("h") > 0 && + event.player.hasUseTarget({ name: "jiu" }, null, true) + ); }, - direct:true, - preHidden:true, - content:function(){ - "step 0" - var nono=(Math.abs(get.attitude(player,trigger.player))<3); - if(player==trigger.player||get.damageEffect(trigger.player,player,player)<=0||!trigger.player.hasUseTarget({name:'jiu'},null,true)){ - nono=true + direct: true, + preHidden: true, + content: function () { + "step 0"; + var nono = Math.abs(get.attitude(player, trigger.player)) < 3; + if ( + player == trigger.player || + get.damageEffect(trigger.player, player, player) <= 0 || + !trigger.player.hasUseTarget({ name: "jiu" }, null, true) + ) { + nono = true; + } else if (trigger.player.hp > 2) { + nono = true; + } else if ( + trigger.player.hp > 1 && + player.countCards("h") < 3 && + trigger.player.canUse("sha", player) && + !player.countCards("h", "shan") && + trigger.player.countCards("h") >= 3 + ) { + nono = true; } - else if(trigger.player.hp>2){ - nono=true; - } - else if(trigger.player.hp>1&&player.countCards('h')<3&&(trigger.player.canUse('sha',player)&&!player.countCards('h','shan')&&trigger.player.countCards('h')>=3)){ - nono=true; - } - var next=player.chooseToDiscard(get.prompt2('zhendu',trigger.player)); - next.set('ai',function(card){ - if(_status.event.nono) return -1; - return 7-get.useful(card); + var next = player.chooseToDiscard(get.prompt2("zhendu", trigger.player)); + next.set("ai", function (card) { + if (_status.event.nono) return -1; + return 7 - get.useful(card); }); - next.set('logSkill',['zhendu',trigger.player]); - next.set('nono',nono); - next.setHiddenSkill('zhendu'); - "step 1" - if(result.bool){ - trigger.player.chooseUseTarget({name:'jiu'},true,'noTargetDelay','nodelayx'); - } - else{ + next.set("logSkill", ["zhendu", trigger.player]); + next.set("nono", nono); + next.setHiddenSkill("zhendu"); + ("step 1"); + if (result.bool) { + trigger.player.chooseUseTarget({ name: "jiu" }, true, "noTargetDelay", "nodelayx"); + } else { event.finish(); } - "step 2" - if(result.bool&&trigger.player!=player) trigger.player.damage(); + ("step 2"); + if (result.bool && trigger.player != player) trigger.player.damage(); + }, + ai: { + threaten: 2, + expose: 0.3, }, - ai:{ - threaten:2, - expose:0.3 - } }, - qiluan:{ - audio:'qiluan2', - preHidden:true, - trigger:{global:'phaseEnd'}, - frequent:true, - filter:function(event,player){ - return game.hasPlayer2(function(current){ - return current.getStat('kill')>0 + qiluan: { + audio: "qiluan2", + preHidden: true, + trigger: { global: "phaseEnd" }, + frequent: true, + filter: function (event, player) { + return game.hasPlayer2(function (current) { + return current.getStat("kill") > 0; }); }, - prompt:function(event,player){ - var num=game.countPlayer2(function(current){ - return (current.getStat('kill')||0)*(current==player?3:1); + prompt: function (event, player) { + var num = game.countPlayer2(function (current) { + return (current.getStat("kill") || 0) * (current == player ? 3 : 1); }); - return get.prompt('qiluan')+'(可摸'+get.cnNumber(num)+'张牌)'; + return get.prompt("qiluan") + "(可摸" + get.cnNumber(num) + "张牌)"; }, - content:function(){ + content: function () { //if(get.mode()=='guozhan'){ // player.draw(3); //} //else{ - player.draw(game.countPlayer2(function(current){ - return (current.getStat('kill')||0)*(current==player?3:1); - })); + player.draw( + game.countPlayer2(function (current) { + return (current.getStat("kill") || 0) * (current == player ? 3 : 1); + }) + ); //} }, - subSkill:{ - draw:{ - trigger:{global:'dieAfter'}, - frequent:true, - filter:function(event,player){ - return /*get.mode()!='guozhan'&&*/player!=event.source; + subSkill: { + draw: { + trigger: { global: "dieAfter" }, + frequent: true, + filter: function (event, player) { + return /*get.mode()!='guozhan'&&*/ player != event.source; + }, + content: function () { + player.draw(); }, - content:function(){player.draw()}, }, }, }, - qiluan2:{ - audio:2, + qiluan2: { + audio: 2, }, - zniaoxiang:{ - shaRelated:true, - audio:2, - trigger:{player:'useCardToPlayered'}, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&!event.getParent().directHit.includes(event.target); + zniaoxiang: { + shaRelated: true, + audio: 2, + trigger: { player: "useCardToPlayered" }, + forced: true, + filter: function (event, player) { + return event.card.name == "sha" && !event.getParent().directHit.includes(event.target); }, //priority:-1, - logTarget:'target', - content:function(){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number'){ + logTarget: "target", + content: function () { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { map[id].shanRequired++; + } else { + map[id].shanRequired = 2; } - else{ - map[id].shanRequired=2; - } - } - }, - shangyi:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h'); }, - content:function(){ - "step 0" - player.chooseCardButton(target,target.getCards('h')).set('filterButton',function(button){ - return get.color(button.link)=='black'; - }); - "step 1" - if(result.bool){ + }, + shangyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); + }, + content: function () { + "step 0"; + player + .chooseCardButton(target, target.getCards("h")) + .set("filterButton", function (button) { + return get.color(button.link) == "black"; + }); + ("step 1"); + if (result.bool) { target.discard(result.links[0]); } }, - ai:{ - order:11, - result:{ - target:function(player,target){ - return -target.countCards('h'); - } + ai: { + order: 11, + result: { + target: function (player, target) { + return -target.countCards("h"); + }, }, - threaten:1.1 + threaten: 1.1, }, }, - shengxi:{ - trigger:{player:'phaseDiscardBegin'}, - frequent:true, - filter:function(event,player){ - return !player.getStat('damage'); + shengxi: { + trigger: { player: "phaseDiscardBegin" }, + frequent: true, + filter: function (event, player) { + return !player.getStat("damage"); }, - content:function(){ + content: function () { player.draw(2); }, - audio:2, - audioname:['liushan'] + audio: 2, + audioname: ["liushan"], }, - shoucheng:{ - init(player){ - game.addGlobalSkill('shoucheng_draw',player); + shoucheng: { + init(player) { + game.addGlobalSkill("shoucheng_draw", player); }, - trigger:{ - global:['equipAfter','addJudgeAfter','loseAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + trigger: { + global: [ + "equipAfter", + "addJudgeAfter", + "loseAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - audio:2, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - if(current==_status.currentPhase) return false; - var evt=event.getl(current); - return evt&&evt.hs&&evt.hs.length&¤t.countCards('h')==0; + audio: 2, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + if (current == _status.currentPhase) return false; + var evt = event.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; }); }, - content:function(){ - "step 0" - event.list=game.filterPlayer(function(current){ - if(current==_status.currentPhase) return false; - var evt=trigger.getl(current); - return evt&&evt.hs&&evt.hs.length; - }).sortBySeat(_status.currentPhase); - "step 1" - var target=event.list.shift(); - event.target=target; - if(target.isIn()&&target.countCards('h')==0){ - player.chooseBool(get.prompt2('shoucheng',target)).set('ai',function(){ - return get.attitude(_status.event.player,_status.event.getParent().target)>0; + content: function () { + "step 0"; + event.list = game + .filterPlayer(function (current) { + if (current == _status.currentPhase) return false; + var evt = trigger.getl(current); + return evt && evt.hs && evt.hs.length; + }) + .sortBySeat(_status.currentPhase); + ("step 1"); + var target = event.list.shift(); + event.target = target; + if (target.isIn() && target.countCards("h") == 0) { + player.chooseBool(get.prompt2("shoucheng", target)).set("ai", function () { + return get.attitude(_status.event.player, _status.event.getParent().target) > 0; }); - } - else event.goto(3); - "step 2" - if(result.bool){ - player.logSkill(event.name,target); - if(player!==target&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.15); + } else event.goto(3); + ("step 2"); + if (result.bool) { + player.logSkill(event.name, target); + if (player !== target && (get.mode() !== "identity" || player.identity !== "nei")) + player.addExpose(0.15); target.draw(); } - "step 3" - if(event.list.length) event.goto(1); + ("step 3"); + if (event.list.length) event.goto(1); }, - ai:{ - threaten:1.3, + ai: { + threaten: 1.3, }, - subSkill:{ - draw:{ - trigger:{player:'dieAfter'}, - filter(event,player){ - return !game.hasPlayer(current=>{ - return current.hasSkill('shoucheng'); - },true); + subSkill: { + draw: { + trigger: { player: "dieAfter" }, + filter(event, player) { + return !game.hasPlayer((current) => { + return current.hasSkill("shoucheng"); + }, true); }, - content(){ - game.removeGlobalSkill('shoucheng_draw'); + content() { + game.removeGlobalSkill("shoucheng_draw"); }, - ai:{ - noh:true, - skillTagFilter(player,tag,arg){ - if(player===_status.currentPhase||player.countCards('h')!==1) return false; - return game.hasPlayer(current=>{ - return current.hasSkill('shoucheng')&&player.isFriendOf(current); + ai: { + noh: true, + skillTagFilter(player, tag, arg) { + if (player === _status.currentPhase || player.countCards("h") !== 1) + return false; + return game.hasPlayer((current) => { + return current.hasSkill("shoucheng") && player.isFriendOf(current); }); - } - } - } - } - }, - hengzheng:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - preHidden:true, - filter:function(event,player){ - return !event.numFixed&&(player.hp==1||player.countCards('h')==0); + }, + }, + }, }, - check:function(event,player){ - var num=game.countPlayer(function(current){ - if(current.countCards('he')&¤t!=player&&get.attitude(player,current)<=0){ + }, + hengzheng: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + preHidden: true, + filter: function (event, player) { + return !event.numFixed && (player.hp == 1 || player.countCards("h") == 0); + }, + check: function (event, player) { + var num = game.countPlayer(function (current) { + if ( + current.countCards("he") && + current != player && + get.attitude(player, current) <= 0 + ) { return true; } - if(current.countCards('j')&¤t!=player&&get.attitude(player,current)>0){ + if ( + current.countCards("j") && + current != player && + get.attitude(player, current) > 0 + ) { return true; } }); - return num>=2; + return num >= 2; }, - content:function(){ - "step 0" - var targets=game.filterPlayer(); + content: function () { + "step 0"; + var targets = game.filterPlayer(); targets.remove(player); targets.sort(lib.sort.seat); - event.targets=targets; - event.num=0; + event.targets = targets; + event.num = 0; trigger.changeToZero(); - player.line(targets,'green'); - "step 1" - if(num【勇决】
    每当其他角色于回合内使用一张杀,若目标不是你,你可以获得之,每回合限一次
    '); + content: function () { + "step 0"; + player.awakenSkill("cunsi"); + var cards = player.getCards("h"); + player.give(cards, target); + ("step 1"); + target.addSkills("yongjue"); + ("step 2"); + target.markSkillCharacter( + "yongjue", + player, + "存嗣", + '
    【勇决】
    每当其他角色于回合内使用一张杀,若目标不是你,你可以获得之,每回合限一次
    ' + ); player.turnOver(); }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - ai:{ - order:4, - result:{ - target:function(player,target){ - if(target.isMin()) return 0; - if(player.hp>1){ - if(game.phaseNumber2) return 0; - if(get.attitude(player,target)<5) return 0; + ai: { + order: 4, + result: { + target: function (player, target) { + if (target.isMin()) return 0; + if (player.hp > 1) { + if (game.phaseNumber < game.players.length) return 0; + if (target.hp == 1 && target.maxHp > 2) return 0; + if (get.attitude(player, target) < 5) return 0; } - if(get.attitude(player,target)<5) return 0; - if(target.hp==1&&target.maxHp>2) return 0.2; - if(target==game.me) return 1.2; + if (get.attitude(player, target) < 5) return 0; + if (target.hp == 1 && target.maxHp > 2) return 0.2; + if (target == game.me) return 1.2; return 1; - } + }, }, - expose:0.5, - threaten:1.5 - } + expose: 0.5, + threaten: 1.5, + }, }, - fenming:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - check:function(event,player){ - var num=game.countPlayer(function(current){ - if(current.isLinked()&¤t.countCards('he')){ - return get.effect(current,{name:'guohe_copy2'},player,player); + fenming: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + check: function (event, player) { + var num = game.countPlayer(function (current) { + if (current.isLinked() && current.countCards("he")) { + return get.effect(current, { name: "guohe_copy2" }, player, player); } }); - return num<0; + return num < 0; }, - filter:function(event,player){ + filter: function (event, player) { return player.isLinked(); }, - preHidden:true, - prompt:'是否发动【奋命】?', - logTarget:function(event,player){ - return game.filterPlayer(function(current){ - if(current.isLinked()&¤t.countCards('he')){ + preHidden: true, + prompt: "是否发动【奋命】?", + logTarget: function (event, player) { + return game.filterPlayer(function (current) { + if (current.isLinked() && current.countCards("he")) { return true; } }); }, - content:function(){ - "step 0" - event.targets=game.filterPlayer(function(current){ - if(current.isLinked()&¤t.countCards('he')){ + content: function () { + "step 0"; + event.targets = game.filterPlayer(function (current) { + if (current.isLinked() && current.countCards("he")) { return true; } }); - event.num=0; + event.num = 0; event.targets.sort(lib.sort.seat); - "step 1" - if(event.num0) return 0; - if(_status.event.noe) return 12-get.value(card); - return 2*_status.event.damage-get.value(card); - }).set('damage',get.damageEffect(trigger.player,player,trigger.player)).set('noe',trigger.player.hasSkillTag('noe')); - } - else{ + next.set("logSkill", ["xiaoguo", trigger.player]); + next.set( + "eff", + (function () { + if (trigger.player.hasSkillTag("noe")) + return get.attitude(_status.event.player, trigger.player); + return get.damageEffect(trigger.player, player, _status.event.player); + })() + ); + ("step 1"); + if (result.bool) { + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15); + trigger.player + .chooseToDiscard( + "he", + "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", + { type: "equip" } + ) + .set("ai", function (card) { + if (_status.event.damage > 0) return 0; + if (_status.event.noe) return 12 - get.value(card); + return 2 * _status.event.damage - get.value(card); + }) + .set("damage", get.damageEffect(trigger.player, player, trigger.player)) + .set("noe", trigger.player.hasSkillTag("noe")); + } else { event.finish(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { player.draw(); - } - else{ + } else { trigger.player.damage(); } - } + }, }, - suishi:{ - audio:2, - trigger:{global:'dying'}, - forced:true, - popup:false, + suishi: { + audio: 2, + trigger: { global: "dying" }, + forced: true, + popup: false, //priority:12, - check:function(){ + check: function () { return false; }, - filter:function(event,player){ - return event.player!=player&&event.parent.name=='damage'&&event.parent.source&&event.parent.source!=event.player; + filter: function (event, player) { + return ( + event.player != player && + event.parent.name == "damage" && + event.parent.source && + event.parent.source != event.player + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; var str; - if(trigger.parent.source==player){ - str='随势:是否摸一张牌?'; + if (trigger.parent.source == player) { + str = "随势:是否摸一张牌?"; + } else { + str = "随势:是否令" + get.translation(player) + "摸一张牌?"; } - else{ - str='随势:是否令'+get.translation(player)+'摸一张牌?' - } - trigger.parent.source.chooseBool(str).set('ai',function(){ - return get.attitude(_status.event.player,_status.event.target)>0; - }).set('target',player); - 'step 1' - if(result.bool){ - player.logSkill('suishi'); - trigger.parent.source.line(player,'green'); + trigger.parent.source + .chooseBool(str) + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) > 0; + }) + .set("target", player); + ("step 1"); + if (result.bool) { + player.logSkill("suishi"); + trigger.parent.source.line(player, "green"); player.draw(); } }, - group:'suishi2' + group: "suishi2", }, - suishi2:{ - trigger:{global:'dieAfter'}, - forced:true, - popup:false, - check:function(){ + suishi2: { + trigger: { global: "dieAfter" }, + forced: true, + popup: false, + check: function () { return false; }, - filter:function(event,player){ - return event.player!=player&&event.source&&event.source!=player&&event.source!=event.player; + filter: function (event, player) { + return ( + event.player != player && + event.source && + event.source != player && + event.source != event.player + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; var str; - if(trigger.source==player){ - str='随势:是否失去1点体力?'; + if (trigger.source == player) { + str = "随势:是否失去1点体力?"; + } else { + str = "随势:是否令" + get.translation(player) + "失去1点体力?"; } - else{ - str='随势:是否令'+get.translation(player)+'失去1点体力?' - } - trigger.source.chooseBool(str).set('ai',function(){ - return get.attitude(_status.event.player,_status.event.target)<0; - }).set('target',player); - 'step 1' - if(result.bool){ - player.logSkill('suishi'); - trigger.source.line(player,'green'); + trigger.source + .chooseBool(str) + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) < 0; + }) + .set("target", player); + ("step 1"); + if (result.bool) { + player.logSkill("suishi"); + trigger.source.line(player, "green"); player.loseHp(); } }, }, - sijian:{ - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + sijian: { + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - direct:true, - audio:2, - preHidden:true, - filter:function(event,player){ - if(player.countCards('h')) return false; - if(event.name=='gain'&&event.player==player) return false; - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length>0; + direct: true, + audio: 2, + preHidden: true, + filter: function (event, player) { + if (player.countCards("h")) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length > 0; }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('sijian'),'弃置一名其他角色的一张牌',function(card,player,target){ - return player!=target&&target.countCards('he')>0; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }).setHiddenSkill(event.name); - "step 1" - if(result.bool){ - player.logSkill('sijian',result.targets); - event.target=result.targets[0]; - player.discardPlayerCard(event.target,true); - } - else{ + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("sijian"), + "弃置一名其他角色的一张牌", + function (card, player, target) { + return player != target && target.countCards("he") > 0; + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + player.logSkill("sijian", result.targets); + event.target = result.targets[0]; + player.discardPlayerCard(event.target, true); + } else { event.finish(); } }, - ai:{ - expose:0.2, - } + ai: { + expose: 0.2, + }, }, - quji:{ - audio:2, - enable:'phaseUse', - usable:1, - position:'he', - filterCard:true, - selectCard:function(){ - var player=_status.event.player; + quji: { + audio: 2, + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + selectCard: function () { + var player = _status.event.player; return player.getDamagedHp(); }, - filterTarget:function(card,player,target){ - return target.hp-1; - if(num==2) return att>0; - return att>1; + }, + junbing: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player.countCards("h") <= 1 && + (player == event.player || player.hasSkill("junbing")) + ); + }, + direct: true, + checkx: function (target, player) { + if (target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (num == 0) return true; + if (num == 1) return att > -1; + if (num == 2) return att > 0; + return att > 1; } return false; }, - content:function(){ - "step 0" - event.target=player; - event.player=trigger.player; + content: function () { + "step 0"; + event.target = player; + event.player = trigger.player; var prompt; - if(player==event.player) prompt='是否发动【郡兵】摸一张牌?'; - else prompt=('###是否对'+get.translation(event.target)+'发动【郡兵】?###'+(event.player==event.target?'摸一张牌':'摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌')); - event.player.chooseBool(prompt).set('choice',lib.skill.junbing.checkx(event.target,event.player)); - "step 1" - if(!result.bool){event.finish();return} - target.logSkill('junbing',player); - if(player==target) event.finish(); + if (player == event.player) prompt = "是否发动【郡兵】摸一张牌?"; + else + prompt = + "###是否对" + + get.translation(event.target) + + "发动【郡兵】?###" + + (event.player == event.target + ? "摸一张牌" + : "摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌"); + event.player + .chooseBool(prompt) + .set("choice", lib.skill.junbing.checkx(event.target, event.player)); + ("step 1"); + if (!result.bool) { + event.finish(); + return; + } + target.logSkill("junbing", player); + if (player == target) event.finish(); player.draw(); - "step 2" - var cards=player.getCards('h'); - player.give(cards,target); - event.num=cards.length; - "step 3" - var he=target.getCards('he'); - if(!he.length) event.finish(); - else if(he.length<=num) event._result={cards:he}; - else target.chooseCard('选择还给'+get.translation(player)+'的牌',true,event.num,'he'); - "step 4" - target.give(result.cards,player); + ("step 2"); + var cards = player.getCards("h"); + player.give(cards, target); + event.num = cards.length; + ("step 3"); + var he = target.getCards("he"); + if (!he.length) event.finish(); + else if (he.length <= num) event._result = { cards: he }; + else + target.chooseCard( + "选择还给" + get.translation(player) + "的牌", + true, + event.num, + "he" + ); + ("step 4"); + target.give(result.cards, player); }, }, - xiongyi:{ - skillAnimation:true, - animationColor:'gray', - unique:true, - enable:'phaseUse', - audio:2, - limited:true, - filterTarget:function(card,player,target){ - if(get.mode()=='guozhan'){ - if(player==target) return true; - if(player.identity=='unknown'){ - if(!player.wontYe('qun')) return false; - return target.identity=='qun'; + xiongyi: { + skillAnimation: true, + animationColor: "gray", + unique: true, + enable: "phaseUse", + audio: 2, + limited: true, + filterTarget: function (card, player, target) { + if (get.mode() == "guozhan") { + if (player == target) return true; + if (player.identity == "unknown") { + if (!player.wontYe("qun")) return false; + return target.identity == "qun"; } return target.isFriendOf(player); - } - else{ + } else { return true; } }, - multitarget:true, - multiline:true, - selectTarget:function(){ - if(get.mode()=='guozhan') return -1; - return [1,Infinity]; + multitarget: true, + multiline: true, + selectTarget: function () { + if (get.mode() == "guozhan") return -1; + return [1, Infinity]; }, - content:function(){ - "step 0" - player.awakenSkill('xiongyi'); - game.asyncDraw(targets,3); - "step 1" - if(player.isDamaged()){ - if(get.mode()=='guozhan'){ - if(player.isMinor(true)){ + content: function () { + "step 0"; + player.awakenSkill("xiongyi"); + game.asyncDraw(targets, 3); + ("step 1"); + if (player.isDamaged()) { + if (get.mode() == "guozhan") { + if (player.isMinor(true)) { player.recover(); } - } - else if(player.isMinHp()){ + } else if (player.isMinHp()) { player.recover(); } } }, - ai:{ - order:1, - result:{ - target:function(player){ - var num=player.countCards('h'); - if(player.hp==1) return 1; - if(player.hp==2&&num<=2) return 1; - if(player.hp==3&&num<=1) return 1; - if(game.phaseNumber1){ + if (event.num > 1) { event.num--; event.goto(1); } } }, - ai:{ - threaten:0.8, - expose:0.1 - } + ai: { + threaten: 0.8, + expose: 0.1, + }, }, - shushen:{ - audio:2, - trigger:{player:'recoverAfter'}, - direct:true, - content:function(){ - "step 0" - event.count=trigger.num; - "step 1" - player.chooseTarget(get.prompt('shushen'),'令一名其他角色选择摸两张牌或回复1点体力',function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - "step 2" - if(result.bool){ + shushen: { + audio: 2, + trigger: { player: "recoverAfter" }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); + player + .chooseTarget( + get.prompt("shushen"), + "令一名其他角色选择摸两张牌或回复1点体力", + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 2"); + if (result.bool) { event.count--; - player.logSkill('shushen',result.targets); - result.targets[0].chooseDrawRecover(2,true); - if(event.count) event.goto(1); + player.logSkill("shushen", result.targets); + result.targets[0].chooseDrawRecover(2, true); + if (event.count) event.goto(1); } }, - ai:{ - threaten:0.8, - expose:0.1 - } + ai: { + threaten: 0.8, + expose: 0.1, + }, }, - shenzhi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - check:function(event,player){ - if(player.hp>2) return false; - var cards=player.getCards('h'); - if(cards.length3) return false; - for(var i=0;i7||get.tag(cards[i],'recover')>=1) return false; + shenzhi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (player.hp > 2) return false; + var cards = player.getCards("h"); + if (cards.length < player.hp) return false; + if (cards.length > 3) return false; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) > 7 || get.tag(cards[i], "recover") >= 1) return false; } return true; }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - preHidden:true, - content:function(){ - "step 0" - var cards=player.getCards('h'); - event.bool=cards.length>=player.hp; + preHidden: true, + content: function () { + "step 0"; + var cards = player.getCards("h"); + event.bool = cards.length >= player.hp; player.discard(cards); - "step 1" - if(event.bool){ + ("step 1"); + if (event.bool) { player.recover(); } - } - }, - wuji:{ - skillAnimation:true, - animationColor:'orange', - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - unique:true, - juexingji:true, - filter:function(event,player){ - return player.getStat('damage')>=3&&!player.storage.wuji; }, - content:function(){ - "step 0" - player.removeSkills('huxiao'); + }, + wuji: { + skillAnimation: true, + animationColor: "orange", + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + unique: true, + juexingji: true, + filter: function (event, player) { + return player.getStat("damage") >= 3 && !player.storage.wuji; + }, + content: function () { + "step 0"; + player.removeSkills("huxiao"); player.gainMaxHp(); - "step 1" + ("step 1"); player.recover(); - player.awakenSkill('wuji'); - player.storage.wuji=true; + player.awakenSkill("wuji"); + player.storage.wuji = true; - var card=get.cardPile('qinglong','field'); - if(card){ - player.gain(card,'gain2','log'); + var card = get.cardPile("qinglong", "field"); + if (card) { + player.gain(card, "gain2", "log"); } - } + }, }, - xueji_old:{ - audio:'xueji', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hp0; + xueji_old: { + audio: "xueji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hp < player.maxHp && player.countCards("he", { color: "red" }) > 0; }, - filterTarget:function(card,player,target){ - return player!=target&&get.distance(player,target,'attack')<=1; + filterTarget: function (card, player, target) { + return player != target && get.distance(player, target, "attack") <= 1; }, - selectTarget:function(){ - return [1,_status.event.player.maxHp-_status.event.player.hp]; + selectTarget: function () { + return [1, _status.event.player.maxHp - _status.event.player.hp]; }, - position:'he', - filterCard:function(card){ - return get.color(card)=='red'; + position: "he", + filterCard: function (card) { + return get.color(card) == "red"; }, - check:function(card){ - return 8-get.useful(card); + check: function (card) { + return 8 - get.useful(card); }, - content:function(){ - "step 0" + content: function () { + "step 0"; target.damage(); - "step 1" + ("step 1"); target.draw(); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - return get.damageEffect(target,player); - } + ai: { + order: 7, + result: { + target: function (player, target) { + return get.damageEffect(target, player); + }, }, - threaten:function(player,target){ - if(target.hp==1) return 2; - if(target.hp==2) return 1.5; + threaten: function (player, target) { + if (target.hp == 1) return 2; + if (target.hp == 2) return 1.5; return 0.5; }, - maixie:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(target.hp==target.maxHp&&target.hasFriend()) return [0,1]; + maixie: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp && target.hasFriend()) return [0, 1]; } - if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0]; - } - } - } + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, + }, }, //FW关银屏 - oldhuxiao:{ - shaRelated:true, - audio:'huxiao', - trigger:{player:'shaMiss'}, - forced:true, - content:function(){ - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + oldhuxiao: { + shaRelated: true, + audio: "huxiao", + trigger: { player: "shaMiss" }, + forced: true, + content: function () { + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } }, }, - oldwuji:{ - unique:true, - audio:'wuji', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.getStat('damage')>=3&&!player.storage.oldwuji; + oldwuji: { + unique: true, + audio: "wuji", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getStat("damage") >= 3 && !player.storage.oldwuji; }, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'orange', - content:function(){ - 'step 0' - player.removeSkills('oldhuxiao'); + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "orange", + content: function () { + "step 0"; + player.removeSkills("oldhuxiao"); player.gainMaxHp(); - 'step 1' + ("step 1"); player.recover(); - player.awakenSkill('oldwuji'); + player.awakenSkill("oldwuji"); }, }, - xueji:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',{color:'red'})>0; + xueji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he", { color: "red" }) > 0; }, - filterTarget:true, - selectTarget:function(){ - var player=_status.event.player - return [1,Math.max(1,player.getDamagedHp())]; + filterTarget: true, + selectTarget: function () { + var player = _status.event.player; + return [1, Math.max(1, player.getDamagedHp())]; }, - position:'he', - filterCard:{color:'red'}, - check:function(card){ - return 8-get.value(card); + position: "he", + filterCard: { color: "red" }, + check: function (card) { + return 8 - get.value(card); }, - multitarget:true, - multiline:true, - line:'fire', - content:function(){ - 'step 0' - event.delay=false; - for(var i=0;i=0;i--){ - ui.cardPile.insertBefore(cards[i].fix(),ui.cardPile.firstChild); + delay: false, + content: function () { + "step 0"; + var evt = event.getParent(2); + evt.set("aocai", true); + var cards = get.cards(get.mode() != "guozhan" && player.countCards("h") == 0 ? 4 : 2); + for (var i = cards.length - 1; i >= 0; i--) { + ui.cardPile.insertBefore(cards[i].fix(), ui.cardPile.firstChild); } - var aozhan=player.hasSkill('aozhan'); - player.chooseButton(['傲才:选择要'+(evt.name=='chooseToUse'?'使用':'打出')+'的牌',cards]).set('filterButton',function(button){ - return _status.event.cards.includes(button.link); - }).set('cards',cards.filter(function(card){ - if(aozhan&&card.name=='tao'){ - return evt.filterCard({ - name:'sha',isCard:true,cards:[card], - },evt.player,evt)||evt.filterCard({ - name:'shan',isCard:true,cards:[card], - },evt.player,evt); + var aozhan = player.hasSkill("aozhan"); + player + .chooseButton([ + "傲才:选择要" + (evt.name == "chooseToUse" ? "使用" : "打出") + "的牌", + cards, + ]) + .set("filterButton", function (button) { + return _status.event.cards.includes(button.link); + }) + .set( + "cards", + cards.filter(function (card) { + if (aozhan && card.name == "tao") { + return ( + evt.filterCard( + { + name: "sha", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) || + evt.filterCard( + { + name: "shan", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) + ); + } + return evt.filterCard(card, evt.player, evt); + }) + ) + .set("ai", function (button) { + var evt = _status.event.getParent(3); + if (evt && evt.ai) { + var tmp = _status.event; + _status.event = evt; + var result = (evt.ai || event.ai1)(button.link, _status.event.player, evt); + _status.event = tmp; + return result; + } + return 1; + }); + ("step 1"); + var evt = event.getParent(2); + if (result.bool && result.links && result.links.length) { + var card = result.links[0]; + var name = card.name, + aozhan = player.hasSkill("aozhan") && name == "tao"; + if (aozhan) { + name = evt.filterCard( + { + name: "sha", + isCard: true, + cards: [card], + }, + evt.player, + evt + ) + ? "sha" + : "shan"; } - return evt.filterCard(card,evt.player,evt); - })).set('ai',function(button){ - var evt=_status.event.getParent(3); - if(evt&&evt.ai){ - var tmp=_status.event; - _status.event=evt; - var result=(evt.ai||event.ai1)(button.link,_status.event.player,evt); - _status.event=tmp; - return result; - } - return 1; - }); - 'step 1' - var evt=event.getParent(2); - if(result.bool&&result.links&&result.links.length){ - var card=result.links[0]; - var name=card.name,aozhan=(player.hasSkill('aozhan')&&name=='tao'); - if(aozhan){ - name=evt.filterCard({ - name:'sha',isCard:true,cards:[card], - },evt.player,evt)?'sha':'shan'; - } - if(evt.name=='chooseToUse'){ - game.broadcastAll(function(result,name){ - lib.skill.aocai_backup.viewAs={name:name,cards:[result],isCard:true}; - },card,name); - evt.set('_backupevent','aocai_backup'); - evt.set('openskilldialog',('请选择'+get.translation(card)+'的目标')) - evt.backup('aocai_backup'); - } - else{ + if (evt.name == "chooseToUse") { + game.broadcastAll( + function (result, name) { + lib.skill.aocai_backup.viewAs = { + name: name, + cards: [result], + isCard: true, + }; + }, + card, + name + ); + evt.set("_backupevent", "aocai_backup"); + evt.set("openskilldialog", "请选择" + get.translation(card) + "的目标"); + evt.backup("aocai_backup"); + } else { delete evt.result.skill; delete evt.result.used; - evt.result.card=get.autoViewAs(result.links[0]); - if(aozhan) evt.result.card.name=name; - evt.result.cards=[result.links[0]]; + evt.result.card = get.autoViewAs(result.links[0]); + if (aozhan) evt.result.card.name = name; + evt.result.cards = [result.links[0]]; evt.redo(); return; } } evt.goto(0); }, - ai:{ - effect:{ - target:function(card,player,target,effect){ - if(get.tag(card,'respondShan')) return 0.7; - if(get.tag(card,'respondSha')) return 0.7; - } + ai: { + effect: { + target: function (card, player, target, effect) { + if (get.tag(card, "respondShan")) return 0.7; + if (get.tag(card, "respondSha")) return 0.7; + }, }, - order:11, - respondShan:true, - respondSha:true, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + order: 11, + respondShan: true, + respondSha: true, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; - } - } - } + }, + }, + }, }, - aocai_backup:{ - sourceSkill:'aocai', - precontent:function(){ + aocai_backup: { + sourceSkill: "aocai", + precontent: function () { delete event.result.skill; - var name=event.result.card.name,cards=event.result.card.cards.slice(0); - event.result.cards=cards; - var rcard=cards[0],card; - if(rcard.name==name) card=get.autoViewAs(rcard); - else card=get.autoViewAs({name,isCard:true}); - event.result.card=card; + var name = event.result.card.name, + cards = event.result.card.cards.slice(0); + event.result.cards = cards; + var rcard = cards[0], + card; + if (rcard.name == name) card = get.autoViewAs(rcard); + else card = get.autoViewAs({ name, isCard: true }); + event.result.card = card; }, - filterCard:function(){return false}, - selectCard:-1, + filterCard: function () { + return false; + }, + selectCard: -1, }, - hongyuan:{ - trigger:{player:'phaseDrawBegin2'}, - direct:true, - audio:2, - filter:function(event,player){ - return !event.numFixed&&event.num>0; + hongyuan: { + trigger: { player: "phaseDrawBegin2" }, + direct: true, + audio: 2, + filter: function (event, player) { + return !event.numFixed && event.num > 0; }, - content:function(){ - "step 0" + content: function () { + "step 0"; var check; - if(player.countCards('h')==0){ - check=false; + if (player.countCards("h") == 0) { + check = false; + } else { + check = + game.countPlayer(function (current) { + return player != current && get.attitude(player, current) > 1; + }) >= 2; } - else{ - check=(game.countPlayer(function(current){ - return player!=current&&get.attitude(player,current)>1; - })>=2); - } - if(get.is.versus()){ - event.versus=true; - player.chooseBool(get.prompt2('hongyuan')).ai=function(){ - return game.countPlayer(function(current){ - return player.side==current.side; - })>2; + if (get.is.versus()) { + event.versus = true; + player.chooseBool(get.prompt2("hongyuan")).ai = function () { + return ( + game.countPlayer(function (current) { + return player.side == current.side; + }) > 2 + ); }; + } else { + player + .chooseTarget( + get.prompt2("hongyuan"), + [1, 2], + function (card, player, target) { + return player != target; + }, + function (target) { + if (!_status.event.check) return 0; + return get.attitude(_status.event.player, target); + } + ) + .set("check", check); } - else{ - player.chooseTarget(get.prompt2('hongyuan'),[1,2],function(card,player,target){ - return player!=target; - },function(target){ - if(!_status.event.check) return 0; - return get.attitude(_status.event.player,target); - }).set('check',check); - } - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { var targets; - if(event.versus){ - targets=game.filterPlayer(function(current){ - return current!=player&¤t.side==player.side; + if (event.versus) { + targets = game.filterPlayer(function (current) { + return current != player && current.side == player.side; }); + } else { + targets = result.targets; } - else{ - targets=result.targets; - } - player.logSkill('hongyuan',targets); + player.logSkill("hongyuan", targets); game.asyncDraw(targets); trigger.num--; } }, }, - huanshi:{ - audio:2, - trigger:{global:'judge'}, - filter:function(event,player){ - return player.countCards('he')>0; + huanshi: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("he") > 0; }, - logTarget:'player', - check:function(event,player){ - if(get.attitude(player,event.player)<=0) return false; - var cards=player.getCards('he'); - var judge=event.judge(event.player.judging[0]); - for(var i=0;ijudge) return true; - if(_status.currentPhase!=player&&judge2==judge&&get.color(cards[i])=='red'&&get.useful(cards[i])<5) return true; + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return false; + var cards = player.getCards("he"); + var judge = event.judge(event.player.judging[0]); + for (var i = 0; i < cards.length; i++) { + var judge2 = event.judge(cards[i]); + if (judge2 > judge) return true; + if ( + _status.currentPhase != player && + judge2 == judge && + get.color(cards[i]) == "red" && + get.useful(cards[i]) < 5 + ) + return true; } return false; }, - content:function(){ - "step 0" - var target=trigger.player; - var judge=trigger.judge(target.judging[0]); - var attitude=get.attitude(target,player); - target.choosePlayerCard('请选择代替判定的牌','he','visible',true,player).set('ai',function(button){ - var card=button.link; - var judge=_status.event.judge; - var attitude=_status.event.attitude; - var result=trigger.judge(card)-judge; - var player=_status.event.player; - if(result>0){ - return 20+result; - } - if(result==0){ - if(_status.currentPhase==player) return 0; - if(attitude>=0){ - return get.color(card)=='red'?7:0-get.value(card); + content: function () { + "step 0"; + var target = trigger.player; + var judge = trigger.judge(target.judging[0]); + var attitude = get.attitude(target, player); + target + .choosePlayerCard("请选择代替判定的牌", "he", "visible", true, player) + .set("ai", function (button) { + var card = button.link; + var judge = _status.event.judge; + var attitude = _status.event.attitude; + var result = trigger.judge(card) - judge; + var player = _status.event.player; + if (result > 0) { + return 20 + result; } - else{ - return get.color(card)=='black'?10:0+get.value(card); + if (result == 0) { + if (_status.currentPhase == player) return 0; + if (attitude >= 0) { + return get.color(card) == "red" ? 7 : 0 - get.value(card); + } else { + return get.color(card) == "black" ? 10 : 0 + get.value(card); + } } - } - if(attitude>=0){ - return get.color(card)=='red'?0:-10+result; - } - else{ - return get.color(card)=='black'?0:-10+result; - } - }).set('filterButton',function(button){ - var player=_status.event.target; - var card=button.link; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('judge',judge).set('attitude',attitude); - "step 1" - if(result.bool){ - event.card=result.links[0]; - player.respond(event.card,'highlight','noOrdering').nopopup=true; - } - else{ + if (attitude >= 0) { + return get.color(card) == "red" ? 0 : -10 + result; + } else { + return get.color(card) == "black" ? 0 : -10 + result; + } + }) + .set("filterButton", function (button) { + var player = _status.event.target; + var card = button.link; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("judge", judge) + .set("attitude", attitude); + ("step 1"); + if (result.bool) { + event.card = result.links[0]; + player.respond(event.card, "highlight", "noOrdering").nopopup = true; + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=event.card; + trigger.player.judging[0] = event.card; trigger.orderingCards.add(event.card); - game.log(trigger.player,'的判定牌改为',event.card); + game.log(trigger.player, "的判定牌改为", event.card); game.delay(2); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } - }, - mingzhe:{ - audio:2, - trigger:{ - player:['useCard','respond','loseAfter'], - global:'loseAsyncAfter', + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, }, - frequent:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(event.name.indexOf('lose')!=0) return get.color(event.card)=='red'; - if(event.type!='discard') return false; - var evt=event.getl(player); - if(evt&&evt.cards2){ - for(var i=0;i0&¤t.hp<=player.countCards('he')&&player.inRange(current); - }); + duwu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.hasSkill("duwu2") == false && + game.hasPlayer(function (current) { + return ( + current.hp > 0 && + current.hp <= player.countCards("he") && + player.inRange(current) + ); + }) + ); }, - filterCard:function(){ - if(ui.selected.targets.length) return false; + filterCard: function () { + if (ui.selected.targets.length) return false; return true; }, - position:'he', - selectCard:[1,Infinity], - complexSelect:true, - complexCard:true, - filterTarget:function(card,player,target){ - return target!=player&&target.hp>0&&player.inRange(target)&&ui.selected.cards.length==target.hp; + position: "he", + selectCard: [1, Infinity], + complexSelect: true, + complexCard: true, + filterTarget: function (card, player, target) { + return ( + target != player && + target.hp > 0 && + player.inRange(target) && + ui.selected.cards.length == target.hp + ); }, - check:function(card){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current!=player&¤t.hp>0&&player.inRange(current)&&ui.selected.cards.length==current.hp&&get.damageEffect(current,player,player)>0; - })) return 0; - switch(ui.selected.cards.length){ - case 0:return 8-get.value(card); - case 1:return 6-get.value(card); - case 2:return 3-get.value(card); - default:return 0; + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return ( + current != player && + current.hp > 0 && + player.inRange(current) && + ui.selected.cards.length == current.hp && + get.damageEffect(current, player, player) > 0 + ); + }) + ) + return 0; + switch (ui.selected.cards.length) { + case 0: + return 8 - get.value(card); + case 1: + return 6 - get.value(card); + case 2: + return 3 - get.value(card); + default: + return 0; } }, - content:function(){ - player.addTempSkill('duwu3'); - target.damage('nocard'); + content: function () { + player.addTempSkill("duwu3"); + target.damage("nocard"); }, - ai:{ - damage:true, - order:2, - result:{ - target:function(player,target){ - return get.damageEffect(target,player); - } + ai: { + damage: true, + order: 2, + result: { + target: function (player, target) { + return get.damageEffect(target, player); + }, }, - threaten:1.5, - expose:0.3 - } - }, - duwu2:{charlotte:true}, - duwu3:{ - trigger:{global:'dyingAfter'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return event.player.isIn()&&event.reason&&event.reason.getParent().name=='duwu'; + threaten: 1.5, + expose: 0.3, }, - content:function(){ + }, + duwu2: { charlotte: true }, + duwu3: { + trigger: { global: "dyingAfter" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.player.isIn() && event.reason && event.reason.getParent().name == "duwu"; + }, + content: function () { player.loseHp(); - player.addTempSkill('duwu2'); - } + player.addTempSkill("duwu2"); + }, }, - yicong:{ - trigger:{ - player:["changeHp"], + yicong: { + trigger: { + player: ["changeHp"], }, - audio:2, - audioname:['re_gongsunzan'], - forced:true, - filter:function(event,player){ - return get.sgn(player.hp-2.5)!=get.sgn(player.hp-2.5-event.num); + audio: 2, + audioname: ["re_gongsunzan"], + forced: true, + filter: function (event, player) { + return get.sgn(player.hp - 2.5) != get.sgn(player.hp - 2.5 - event.num); }, - content:function (){}, - mod:{ - globalFrom:function(from,to,current){ - if(from.hp>2) return current-1; + content: function () {}, + mod: { + globalFrom: function (from, to, current) { + if (from.hp > 2) return current - 1; }, - globalTo:function(from,to,current){ - if(to.hp<=2) return current+1; + globalTo: function (from, to, current) { + if (to.hp <= 2) return current + 1; }, }, - ai:{ - threaten:0.8 - } + ai: { + threaten: 0.8, + }, }, - yongsi:{ - audio:2, - group:['yongsi1','yongsi2'], - locked:true, - ai:{ - threaten:3.2 - } + yongsi: { + audio: 2, + group: ["yongsi1", "yongsi2"], + locked: true, + ai: { + threaten: 3.2, + }, }, - yongsi1:{ - audio:true, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:function(event,player){ + yongsi1: { + audio: true, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=game.countGroup(); - } - }, - yongsi2:{ - audio:true, - trigger:{player:'phaseDiscardBegin'}, - forced:true, - content:function(){ - player.chooseToDiscard(game.countGroup(),'he',true); - } - }, - bifa:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - audio:2, - filter:function(event,player){ - return player.countCards('h')>0; + content: function () { + trigger.num += game.countGroup(); }, - content:function(){ - "step 0" + }, + yongsi2: { + audio: true, + trigger: { player: "phaseDiscardBegin" }, + forced: true, + content: function () { + player.chooseToDiscard(game.countGroup(), "he", true); + }, + }, + bifa: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:true, - filterTarget:function(card,player,target){ - return player!=target&&!target.getExpansions('bifa2').length; + filterCard: true, + filterTarget: function (card, player, target) { + return player != target && !target.getExpansions("bifa2").length; }, - ai1:function(card){ - return 7-get.value(card); + ai1: function (card) { + return 7 - get.value(card); }, - ai2:function(target){ - var num=target.hasSkillTag('maixie')?2:0; - return -get.attitude(_status.event.player,target)-num; + ai2: function (target) { + var num = target.hasSkillTag("maixie") ? 2 : 0; + return -get.attitude(_status.event.player, target) - num; }, - prompt:get.prompt2('bifa'), + prompt: get.prompt2("bifa"), }); - "step 1" - if(result.bool){ - event.forceDie=true; - var target=result.targets[0]; - event.target=target; - player.logSkill('bifa',result.targets[0]); - event.card=result.cards[0]; - target.storage.bifa2=[result.cards[0],player]; - if(!_status.connectMode&&player.isUnderControl(true)) player.$giveAuto(result.cards[0],target,false); - else player.$give(1,target,false); - target.addToExpansion(result.cards[0]).gaintag.add('bifa2'); - } - else event.finish(); - "step 2" - if(target.getExpansions('bifa2').includes(card)){ - target.addSkill('bifa2'); - } - else delete target.storage.bifa2; + ("step 1"); + if (result.bool) { + event.forceDie = true; + var target = result.targets[0]; + event.target = target; + player.logSkill("bifa", result.targets[0]); + event.card = result.cards[0]; + target.storage.bifa2 = [result.cards[0], player]; + if (!_status.connectMode && player.isUnderControl(true)) + player.$giveAuto(result.cards[0], target, false); + else player.$give(1, target, false); + target.addToExpansion(result.cards[0]).gaintag.add("bifa2"); + } else event.finish(); + ("step 2"); + if (target.getExpansions("bifa2").includes(card)) { + target.addSkill("bifa2"); + } else delete target.storage.bifa2; + }, + ai: { + threaten: 1.7, + expose: 0.3, }, - ai:{ - threaten:1.7, - expose:0.3 - } }, - bifa2:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - charlotte:true, - audio:false, - filter:function(event,player){ - return player.storage.bifa2&&player.getExpansions('bifa2').includes(player.storage.bifa2[0]); + bifa2: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + charlotte: true, + audio: false, + filter: function (event, player) { + return ( + player.storage.bifa2 && + player.getExpansions("bifa2").includes(player.storage.bifa2[0]) + ); }, - content:function(){ - "step 0" - if(player.storage.bifa2[1].isIn()&&player.countCards('h')){ - player.chooseCard(get.translation(player.storage.bifa2[1])+'的笔伐牌为:',function(card){ - return get.type(card,'trick')==_status.event.type; - }).set('ai',function(card){ - return 8-get.value(card); - }).set('type',get.type(player.storage.bifa2[0],'trick')).set('promptx',[[player.storage.bifa2[0]],'请交给其一张与此牌类别相同的手牌,否则失去1点体力' ]); + content: function () { + "step 0"; + if (player.storage.bifa2[1].isIn() && player.countCards("h")) { + player + .chooseCard( + get.translation(player.storage.bifa2[1]) + "的笔伐牌为:", + function (card) { + return get.type(card, "trick") == _status.event.type; + } + ) + .set("ai", function (card) { + return 8 - get.value(card); + }) + .set("type", get.type(player.storage.bifa2[0], "trick")) + .set("promptx", [ + [player.storage.bifa2[0]], + "请交给其一张与此牌类别相同的手牌,否则失去1点体力", + ]); + } else { + event.directfalse = true; } - else{ - event.directfalse=true; - } - "step 1" - if(result.bool&&!event.directfalse){ - player.give(result.cards,player.storage.bifa2[1]); - player.gain(player.storage.bifa2[0],'draw'); - } - else{ + ("step 1"); + if (result.bool && !event.directfalse) { + player.give(result.cards, player.storage.bifa2[1]); + player.gain(player.storage.bifa2[0], "draw"); + } else { player.loseHp(); } - "step 2" - player.removeSkill('bifa2'); + ("step 2"); + player.removeSkill("bifa2"); }, - marktext:'檄', - intro:{ - markcount:()=>1, - name:'笔伐', - content:'已成为〖笔伐〗的目标', + marktext: "檄", + intro: { + markcount: () => 1, + name: "笔伐", + content: "已成为〖笔伐〗的目标", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); delete player.storage[skill]; }, }, - songci:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(!player.storage.songci) return true; - return game.hasPlayer(function(current){ + songci: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.storage.songci) return true; + return game.hasPlayer(function (current) { return !player.storage.songci.includes(current); }); }, - init:function(player){ - if(!player.storage.songci) player.storage.songci=[]; + init: function (player) { + if (!player.storage.songci) player.storage.songci = []; }, - filterTarget:function(card,player,target){ - return (!player.storage.songci||!player.storage.songci.includes(target)); + filterTarget: function (card, player, target) { + return !player.storage.songci || !player.storage.songci.includes(target); }, - content:function(){ - if(target.countCards('h')>target.hp){ - target.chooseToDiscard(2,'he',true); - } - else{ + content: function () { + if (target.countCards("h") > target.hp) { + target.chooseToDiscard(2, "he", true); + } else { target.draw(2); } - if(!player.storage.songci) player.storage.songci=[]; + if (!player.storage.songci) player.storage.songci = []; player.storage.songci.push(target); player.storage.songci.sortBySeat(); - player.markSkill('songci'); + player.markSkill("songci"); }, - intro:{ - content:'已对$发动过〖颂词〗' + intro: { + content: "已对$发动过〖颂词〗", }, - ai:{ - order:7, - threaten:1.6, - expose:0.2, - result:{ - target:function(player,target){ - if(target.countCards('h')<=target.hp){ + ai: { + order: 7, + threaten: 1.6, + expose: 0.2, + result: { + target: function (player, target) { + if (target.countCards("h") <= target.hp) { return 1; - } - else if(target.countCards('h')>target.hp){ + } else if (target.countCards("h") > target.hp) { return -1; } - } - } + }, + }, }, - group:'songci_draw', + group: "songci_draw", }, - songci_draw:{ - audio:'songci', - trigger:{player:'phaseDiscardEnd'}, - forced:true, - filter:function(event,player){ - if(!player.storage.songci) return false; - return !game.hasPlayer(function(current){ + songci_draw: { + audio: "songci", + trigger: { player: "phaseDiscardEnd" }, + forced: true, + filter: function (event, player) { + if (!player.storage.songci) return false; + return !game.hasPlayer(function (current) { return !player.storage.songci.includes(current); }); }, - content:function(){ + content: function () { player.draw(); }, }, - baobian:{ - audio:2, - trigger:{player:['phaseBefore','changeHp']}, - forced:true, - popup:false, - init:function(player){ - if(game.online) return; - player.removeAdditionalSkill('baobian'); - var list=[]; - if(player.hp<=3){ + baobian: { + audio: 2, + trigger: { player: ["phaseBefore", "changeHp"] }, + forced: true, + popup: false, + init: function (player) { + if (game.online) return; + player.removeAdditionalSkill("baobian"); + var list = []; + if (player.hp <= 3) { //if(trigger.num!=undefined&&trigger.num<0&&player.hp-trigger.num>1) player.logSkill('baobian'); - list.push('oltiaoxin'); + list.push("oltiaoxin"); } - if(player.hp<=2){ - list.push('olpaoxiao'); + if (player.hp <= 2) { + list.push("olpaoxiao"); } - if(player.hp<=1){ - list.push('xinshensu'); + if (player.hp <= 1) { + list.push("xinshensu"); } - if(list.length){ - player.addAdditionalSkill('baobian',list); + if (list.length) { + player.addAdditionalSkill("baobian", list); } }, - derivation:['oltiaoxin','olpaoxiao','xinshensu'], - content:function(){ - player.removeAdditionalSkill('baobian'); - var list=[]; - if(player.hp<=3){ - if(trigger.num!=undefined&&trigger.num<0&&player.hp-trigger.num>1) player.logSkill('baobian'); - list.push('oltiaoxin'); + derivation: ["oltiaoxin", "olpaoxiao", "xinshensu"], + content: function () { + player.removeAdditionalSkill("baobian"); + var list = []; + if (player.hp <= 3) { + if (trigger.num != undefined && trigger.num < 0 && player.hp - trigger.num > 1) + player.logSkill("baobian"); + list.push("oltiaoxin"); } - if(player.hp<=2){ - list.push('olpaoxiao'); + if (player.hp <= 2) { + list.push("olpaoxiao"); } - if(player.hp<=1){ - list.push('xinshensu'); + if (player.hp <= 1) { + list.push("xinshensu"); } - if(list.length){ - player.addAdditionalSkill('baobian',list); + if (list.length) { + player.addAdditionalSkill("baobian", list); } }, - ai:{ - maixie:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(!target.hasFriend()) return; - if(target.hp>=4) return [0,1]; + ai: { + maixie: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0, 1]; } - if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0]; - } - } - } - }, - chongzhen:{ - audio:2, - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - if(event.card.name!='sha'&&event.card.name!='shan') return false; - if(!event.skill||event.skill.indexOf('fanghun')+event.skill.indexOf('longdan')==-2) return false; - var target=lib.skill.chongzhen.logTarget(event,player); - return target&&target.countGainableCards(player,'h')>0; + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, }, - logTarget:function(event,player){ - if(event.name=='respond') return event.source; - if(event.card.name=='sha') return event.targets[0]; + }, + chongzhen: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + if (event.card.name != "sha" && event.card.name != "shan") return false; + if (!event.skill || event.skill.indexOf("fanghun") + event.skill.indexOf("longdan") == -2) + return false; + var target = lib.skill.chongzhen.logTarget(event, player); + return target && target.countGainableCards(player, "h") > 0; + }, + logTarget: function (event, player) { + if (event.name == "respond") return event.source; + if (event.card.name == "sha") return event.targets[0]; return event.respondTo[0]; }, - prompt2:function(event,player){ - var target=lib.skill.chongzhen.logTarget(event,player); - return '获得'+get.translation(target)+'的一张手牌'; + prompt2: function (event, player) { + var target = lib.skill.chongzhen.logTarget(event, player); + return "获得" + get.translation(target) + "的一张手牌"; }, - content:function(){ - var target=lib.skill.chongzhen.logTarget(trigger,player); - player.gainPlayerCard(target,'h',true); + content: function () { + var target = lib.skill.chongzhen.logTarget(trigger, player); + player.gainPlayerCard(target, "h", true); }, - ai:{ - combo:'ollongdan', - mingzhi:false, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')||get.tag(card,'respondSha')){ - if(get.attitude(target,player)<=0){ - if(current>0) return; - if(target.countCards('h')==0) return 1.6; - if(target.countCards('h')==1) return 1.2; - if(target.countCards('h')==2) return [0.8,0.2,0,-0.2]; - return [0.4,0.7,0,-0.7]; + ai: { + combo: "ollongdan", + mingzhi: false, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") || get.tag(card, "respondSha")) { + if (get.attitude(target, player) <= 0) { + if (current > 0) return; + if (target.countCards("h") == 0) return 1.6; + if (target.countCards("h") == 1) return 1.2; + if (target.countCards("h") == 2) return [0.8, 0.2, 0, -0.2]; + return [0.4, 0.7, 0, -0.7]; } } }, }, }, }, - lihun:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.hasSex('male'); + lihun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.hasSex("male"); }, - filterCard:true, - position:'he', - content:function(){ - player.gainPlayerCard(target,true,'h',target.countCards('h')); + filterCard: true, + position: "he", + content: function () { + player.gainPlayerCard(target, true, "h", target.countCards("h")); player.turnOver(); - player.addSkill('lihun2'); - player.storage.lihun=target; + player.addSkill("lihun2"); + player.storage.lihun = target; }, - check:function(card){return 8-get.value(card)}, - ai:{ - order:10, - result:{ - player:function(player){ - if(player.classList.contains('turnedover')) return 10; + check: function (card) { + return 8 - get.value(card); + }, + ai: { + order: 10, + result: { + player: function (player) { + if (player.classList.contains("turnedover")) return 10; return 0; }, - target:function(player,target){ - if(target.countCards('h')>target.hp) return target.hp-target.countCards('h'); + target: function (player, target) { + if (target.countCards("h") > target.hp) return target.hp - target.countCards("h"); return 0; - } + }, }, - threaten:1.5, - effect:{ - target:function(card){ - if(card.name=='guiyoujie') return [0,2]; - } - } - }, - }, - lihun2:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - popup:false, - audio:false, - content:function(){ - "step 0" - var cards=player.getCards('he'); - player.removeSkill('lihun2'); - if(player.storage.lihun.classList.contains('dead')||player.storage.lihun.hp<=0||cards.length==0){ - event.finish(); - } - else{ - if(cards.length0; - }, - content:function(){ - "step 0" - player.chooseCardTarget({ - filterCard:function(card){ - return get.type(card)=='equip'; + threaten: 1.5, + effect: { + target: function (card) { + if (card.name == "guiyoujie") return [0, 2]; }, - position:'he', - filterTarget:function(card,player,target){ + }, + }, + }, + lihun2: { + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + audio: false, + content: function () { + "step 0"; + var cards = player.getCards("he"); + player.removeSkill("lihun2"); + if ( + player.storage.lihun.classList.contains("dead") || + player.storage.lihun.hp <= 0 || + cards.length == 0 + ) { + event.finish(); + } else { + if (cards.length < player.storage.lihun.hp) + event._result = { bool: true, cards: cards }; + else + player.chooseCard( + "he", + true, + player.storage.lihun.hp, + "离魂:选择要交给" + get.translation(player.storage.lihun) + "的牌" + ); + } + ("step 1"); + player.give(result.cards, player.storage.lihun); + }, + }, + yuanhu: { + audio: 3, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + content: function () { + "step 0"; + player.chooseCardTarget({ + filterCard: function (card) { + return get.type(card) == "equip"; + }, + position: "he", + filterTarget: function (card, player, target) { return target.canEquip(card); }, - ai1:function(card){ - return 6-get.value(card); + ai1: function (card) { + return 6 - get.value(card); }, - ai2:function(target){ - return get.attitude(_status.event.player,target)-3; + ai2: function (target) { + return get.attitude(_status.event.player, target) - 3; }, - prompt:get.prompt2('yuanhu') + prompt: get.prompt2("yuanhu"), }); - "step 1" - if(result.bool){ - player.logSkill('yuanhu',result.targets); - var thisTarget=result.targets[0]; - var thisCard=result.cards[0]; + ("step 1"); + if (result.bool) { + player.logSkill("yuanhu", result.targets); + var thisTarget = result.targets[0]; + var thisCard = result.cards[0]; thisTarget.equip(thisCard); - event.target=thisTarget; - if(thisTarget!=player){ - player.$give(thisCard,thisTarget,false); + event.target = thisTarget; + if (thisTarget != player) { + player.$give(thisCard, thisTarget, false); } - switch(get.subtype(thisCard)){ - case 'equip1':{ - if(!game.hasPlayer(function(current){ - return get.distance(thisTarget,current)<=1; - })){ + switch (get.subtype(thisCard)) { + case "equip1": { + if ( + !game.hasPlayer(function (current) { + return get.distance(thisTarget, current) <= 1; + }) + ) { event.finish(); return; } game.delay(); - player.chooseTarget(true,function(card,player,target){ - return get.distance(_status.event.thisTarget,target)<=1&&target.countCards('hej'); - }).set('ai',function(target){ - var attitude=get.attitude(_status.event.player,target); - if(attitude>0&&target.countCards('j')){ - return attitude*1.5; - } - return -attitude; - }).set('thisTarget',thisTarget); + player + .chooseTarget(true, function (card, player, target) { + return ( + get.distance(_status.event.thisTarget, target) <= 1 && + target.countCards("hej") + ); + }) + .set("ai", function (target) { + var attitude = get.attitude(_status.event.player, target); + if (attitude > 0 && target.countCards("j")) { + return attitude * 1.5; + } + return -attitude; + }) + .set("thisTarget", thisTarget); return; } - case 'equip2':{ - thisTarget.draw();event.finish(); - return; - } - case 'equip5':{ + case "equip2": { + thisTarget.draw(); event.finish(); return; } - default:{ + case "equip5": { + event.finish(); + return; + } + default: { thisTarget.recover(); event.finish(); return; } } - } - else{ + } else { event.finish(); } - "step 2" - if(result.targets.length){ - player.discardPlayerCard(true,result.targets[0],'hej'); + ("step 2"); + if (result.targets.length) { + player.discardPlayerCard(true, result.targets[0], "hej"); } }, }, - tianming:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - check:function(event,player){ - var cards=player.getCards('h'); - if(cards.length<=2){ - for(var i=0;iplayers[1].hp&&players[0]!=player){ - players[0].chooseBool(get.prompt2('tianming')); - event.player=players[0]; - } - else{ + if (players[0].hp > players[1].hp && players[0] != player) { + players[0].chooseBool(get.prompt2("tianming")); + event.player = players[0]; + } else { event.finish(); } - "step 1" - if(result.bool){ - player.chooseToDiscard(2,true,'he'); + ("step 1"); + if (result.bool) { + player.chooseToDiscard(2, true, "he"); player.draw(2); } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha') return [1,0.5]; - } - } - } - }, - mizhao:{ - enable:'phaseUse', - usable:1, - audio:2, - filter:function(event,player){ - return player.countCards('h')>0; - }, - filterCard:true, - selectCard:-1, - filterTarget:function(card,player,target){ - return player!=target; - }, - discard:false, - lose:false, - delay:false, - ai:{ - order:1, - result:{ - player:0, - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(player.countCards('h')>1){ - return 1; - } - var players=game.filterPlayer(); - for(var i=0;i0){ - return eff-10; - } - return eff; - }).set('target1',event.target1).set('forceDie',true); - "step 3" - if(result.targets.length){ - event.target2=result.targets[0]; - event.target1.line(event.target2); - event.target1.chooseToCompare(event.target2); - } - else{ - event.finish(); - } - "step 4" - if(!result.tie){ - if(result.bool){ - if(event.target1.canUse({name:'sha',isCard:true},event.target2,false)) event.target1.useCard({name:'sha',isCard:true},event.target2); - } - else if(event.target2.canUse({name:'sha',isCard:true},event.target1,false)){ - event.target2.useCard({name:'sha',isCard:true},event.target1); - } - } - } - }, - gongao:{ - audio:2, - trigger:{global:'dieAfter'}, - forced:true, - content:function(){ - player.gainMaxHp(); - player.recover(); - }, - ai:{ - threaten:1.5 - }, - }, - juyi:{ - skillAnimation:true, - animationColor:'thunder', - audio:2, - derivation:['benghuai','weizhong'], - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.maxHp>game.countPlayer()&&!player.storage.juyi; - }, - forced:true, - unique:true, - juexingji:true, - content:function(){ - player.awakenSkill('juyi'); - player.draw(player.maxHp); - player.addSkills(['benghuai','weizhong']); - } - }, - weizhong:{ - audio:2, - trigger:{player:['gainMaxHpEnd','loseMaxHpEnd']}, - forced:true, - content:function(){ - player.draw(player.isMinHandcard()?2:1); - }, - }, - kuangfu:{ - trigger:{source:'damageSource'}, - audio:2, - filter:function(event){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&event.card.name=='sha'&&event.player.countCards('e'); - }, - logTarget:'player', - preHidden:true, - check:function(event,player){ - return get.attitude(player,event.player)<=0; - }, - content:function(){ - "step 0" - var neg=get.attitude(player,trigger.player)<=0; - player.choosePlayerCard('e',trigger.player).set('ai',function(button){ - if(_status.event.neg){ - return get.buttonValue(button); - } - return 0; - }).set('neg',neg); - "step 1" - if(result.bool){ - event.card=result.links[0]; - if(player.canEquip(event.card)){ - player.chooseBool('是否将'+get.translation(event.card)+'置入自己的装备区?').ai=function(){ - return true; - }; - } - else event._result={bool:false}; - } - else event.finish(); - "step 2" - if(result.bool){ - trigger.player.$give(event.card,player,false); - player.equip(event.card); - } - else trigger.player.discard(event.card); - } - }, - xinfu_lingren:{ - audio:2, - trigger:{ - player:"useCardToPlayered", - }, - filter:function(event,player){ - if(event.getParent().triggeredTargets3.length>1) return false; - if(!['basic','trick'].includes(get.type(event.card))) return false; - if(get.tag(event.card,'damage')) return true; - return false; - }, - usable:1, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('xinfu_lingren'),'选择一名目标角色并猜测其手牌构成',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - return 2-get.attitude(_status.event.player,target); - }).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - player.logSkill('xinfu_lingren',result.targets); - var target=result.targets[0]; - event.target=target; - event.choice={ - basic:false, - trick:false, - equip:false, - } - player.chooseButton(['凌人:猜测其有哪些类别的手牌',[['basic','trick','equip'],'vcard']],[0,3],true).set('ai',function(button){ - switch(button.link[2]){ - case 'basic': - var rand=0.95; - if(!target.countCards('h',{type:['basic']})) rand=0.05; - if(!target.countCards('h')) rand=0; - return Math.random()i[2]); - if(!event.isMine()&&!event.isOnline()) game.delayx(); - var list=[]; - event.num=0; - ['basic','trick','equip'].forEach(type=>{ - if(choices.includes(type)==target.hasCard({type:type},'h')) event.num++; - }) - } - 'step 3' - player.popup('猜对'+get.cnNumber(event.num)+'项'); - game.log(player,'猜对了'+get.cnNumber(event.num)+'项'); - if(event.num>0){ - target.addTempSkill('lingren_adddamage'); - target.storage.lingren={ - card:trigger.card, - //player:event.targett, - } - } - if(event.num>1) player.draw(2); - if(event.num>2){ - player.addTempSkills(['lingren_jianxiong','lingren_xingshang'],{player:'phaseBegin'}); - } - }, - ai:{ - threaten:2.4, - }, - }, - "lingren_adddamage":{ - onremove:function (player){ - delete player.storage.lingren; - }, - trigger:{ - player:"damageBegin3", - }, - filter:function (event,player){ - var info=player.storage.lingren; - return event.card&&event.card==info.card; - }, - silent:true, - popup:false, - forced:true, - charlotte:true, - content:function (){ - trigger.num++; - }, - }, - "lingren_jianxiong":{ - audio:1, - trigger:{ - player:"damageEnd", - }, - content:function (){ - "step 0" - if(get.itemtype(trigger.cards)=='cards'&&get.position(trigger.cards[0],true)=='o'){ - player.gain(trigger.cards,"gain2"); - } - player.draw("nodelay"); - }, - ai:{ - maixie:true, - "maixie_hp":true, - effect:{ - target:function (card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')&&player!=target) return [1,0.6]; + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha") return [1, 0.5]; }, }, }, }, - "lingren_xingshang":{ - audio:1, - inherit:'rexingshang', - }, - "xinfu_fujian":{ - audio:2, - trigger:{ - player:"phaseJieshuBegin", + mizhao: { + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filter:function (event,player){ - return !game.hasPlayer(function(current){ - return current.countCards('h')==0; - }); + filterCard: true, + selectCard: -1, + filterTarget: function (card, player, target) { + return player != target; }, - forced:true, - content:function (){ - event.num=0; - var list=game.filterPlayer(function(target){ - if(target.isMinHandcard()) event.num=target.countCards('h'); - return player!=target; - }); - if(event.num<1){ + discard: false, + lose: false, + delay: false, + ai: { + order: 1, + result: { + player: 0, + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (player.countCards("h") > 1) { + return 1; + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].countCards("h") && + players[i] != target && + players[i] != player && + get.attitude(player, players[i]) < 0 + ) { + break; + } + } + if (i == players.length) { + return 1; + } + return -2 / (target.countCards("h") + 1); + }, + }, + }, + content: function () { + "step 0"; + event.target1 = targets[0]; + player.give(cards, targets[0], "giveAuto"); + ("step 1"); + if (!targets[0].countCards("h")) { + event.finish(); + return; + } + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != event.target1 && + players[i] != player && + event.target1.canCompare(players[i]) + ) { + break; + } + } + if (i == players.length) { event.finish(); } - else{ - var target=list.randomGet(); - var cards=target.getCards('h').randomGets(event.num); - player.line(target); - var content=[get.translation(target)+'的部分手牌',cards]; - game.log(player,'观看了',target,'的部分手牌'); - player.chooseControl('ok').set('dialog',content); + ("step 2"); + player + .chooseTarget(true, "选择拼点目标", function (card, player, target) { + return _status.event.target1.canCompare(target) && target != player; + }) + .set("ai", function (target) { + var player = _status.event.player; + var eff = get.effect(target, { name: "sha" }, _status.event.target1, player); + var att = get.attitude(player, target); + if (att > 0) { + return eff - 10; + } + return eff; + }) + .set("target1", event.target1) + .set("forceDie", true); + ("step 3"); + if (result.targets.length) { + event.target2 = result.targets[0]; + event.target1.line(event.target2); + event.target1.chooseToCompare(event.target2); + } else { + event.finish(); + } + ("step 4"); + if (!result.tie) { + if (result.bool) { + if (event.target1.canUse({ name: "sha", isCard: true }, event.target2, false)) + event.target1.useCard({ name: "sha", isCard: true }, event.target2); + } else if ( + event.target2.canUse({ name: "sha", isCard: true }, event.target1, false) + ) { + event.target2.useCard({ name: "sha", isCard: true }, event.target1); + } } }, }, - fujian:{ - audio:'xinfu_fujian', - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - filter(event,player){ - return game.hasPlayer(target=>target!=player&&target.countCards('h')&&!target.isMaxHandcard()); + gongao: { + audio: 2, + trigger: { global: "dieAfter" }, + forced: true, + content: function () { + player.gainMaxHp(); + player.recover(); }, - forced:true, - async content(event,trigger,player){ - const target=game.filterPlayer(target=>{ - return target!=player&&target.countCards('h')&&!target.isMaxHandcard(); - }).randomGet(); + ai: { + threaten: 1.5, + }, + }, + juyi: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + derivation: ["benghuai", "weizhong"], + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.maxHp > game.countPlayer() && !player.storage.juyi; + }, + forced: true, + unique: true, + juexingji: true, + content: function () { + player.awakenSkill("juyi"); + player.draw(player.maxHp); + player.addSkills(["benghuai", "weizhong"]); + }, + }, + weizhong: { + audio: 2, + trigger: { player: ["gainMaxHpEnd", "loseMaxHpEnd"] }, + forced: true, + content: function () { + player.draw(player.isMinHandcard() ? 2 : 1); + }, + }, + kuangfu: { + trigger: { source: "damageSource" }, + audio: 2, + filter: function (event) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player.countCards("e"); + }, + logTarget: "player", + preHidden: true, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; + }, + content: function () { + "step 0"; + var neg = get.attitude(player, trigger.player) <= 0; + player + .choosePlayerCard("e", trigger.player) + .set("ai", function (button) { + if (_status.event.neg) { + return get.buttonValue(button); + } + return 0; + }) + .set("neg", neg); + ("step 1"); + if (result.bool) { + event.card = result.links[0]; + if (player.canEquip(event.card)) { + player.chooseBool( + "是否将" + get.translation(event.card) + "置入自己的装备区?" + ).ai = function () { + return true; + }; + } else event._result = { bool: false }; + } else event.finish(); + ("step 2"); + if (result.bool) { + trigger.player.$give(event.card, player, false); + player.equip(event.card); + } else trigger.player.discard(event.card); + }, + }, + xinfu_lingren: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter: function (event, player) { + if (event.getParent().triggeredTargets3.length > 1) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + if (get.tag(event.card, "damage")) return true; + return false; + }, + usable: 1, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("xinfu_lingren"), + "选择一名目标角色并猜测其手牌构成", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("ai", function (target) { + return 2 - get.attitude(_status.event.player, target); + }) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + player.logSkill("xinfu_lingren", result.targets); + var target = result.targets[0]; + event.target = target; + event.choice = { + basic: false, + trick: false, + equip: false, + }; + player + .chooseButton( + ["凌人:猜测其有哪些类别的手牌", [["basic", "trick", "equip"], "vcard"]], + [0, 3], + true + ) + .set("ai", function (button) { + switch (button.link[2]) { + case "basic": + var rand = 0.95; + if (!target.countCards("h", { type: ["basic"] })) rand = 0.05; + if (!target.countCards("h")) rand = 0; + return Math.random() < rand ? true : false; + case "trick": + var rand = 0.9; + if (!target.countCards("h", { type: ["trick", "delay"] })) rand = 0.1; + if (!target.countCards("h")) rand = 0; + return Math.random() < rand ? true : false; + case "equip": + var rand = 0.75; + if (!target.countCards("h", { type: ["equip"] })) rand = 0.25; + if (!target.countCards("h")) rand = 0; + return Math.random() < rand ? true : false; + } + }); + } else { + player.storage.counttrigger.xinfu_lingren--; + event.finish(); + } + ("step 2"); + if (result.bool) { + var choices = result.links.map((i) => i[2]); + if (!event.isMine() && !event.isOnline()) game.delayx(); + var list = []; + event.num = 0; + ["basic", "trick", "equip"].forEach((type) => { + if (choices.includes(type) == target.hasCard({ type: type }, "h")) event.num++; + }); + } + ("step 3"); + player.popup("猜对" + get.cnNumber(event.num) + "项"); + game.log(player, "猜对了" + get.cnNumber(event.num) + "项"); + if (event.num > 0) { + target.addTempSkill("lingren_adddamage"); + target.storage.lingren = { + card: trigger.card, + //player:event.targett, + }; + } + if (event.num > 1) player.draw(2); + if (event.num > 2) { + player.addTempSkills(["lingren_jianxiong", "lingren_xingshang"], { + player: "phaseBegin", + }); + } + }, + ai: { + threaten: 2.4, + }, + }, + lingren_adddamage: { + onremove: function (player) { + delete player.storage.lingren; + }, + trigger: { + player: "damageBegin3", + }, + filter: function (event, player) { + var info = player.storage.lingren; + return event.card && event.card == info.card; + }, + silent: true, + popup: false, + forced: true, + charlotte: true, + content: function () { + trigger.num++; + }, + }, + lingren_jianxiong: { + audio: 1, + trigger: { + player: "damageEnd", + }, + content: function () { + "step 0"; + if ( + get.itemtype(trigger.cards) == "cards" && + get.position(trigger.cards[0], true) == "o" + ) { + player.gain(trigger.cards, "gain2"); + } + player.draw("nodelay"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage") && player != target) return [1, 0.6]; + }, + }, + }, + }, + lingren_xingshang: { + audio: 1, + inherit: "rexingshang", + }, + xinfu_fujian: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + filter: function (event, player) { + return !game.hasPlayer(function (current) { + return current.countCards("h") == 0; + }); + }, + forced: true, + content: function () { + event.num = 0; + var list = game.filterPlayer(function (target) { + if (target.isMinHandcard()) event.num = target.countCards("h"); + return player != target; + }); + if (event.num < 1) { + event.finish(); + } else { + var target = list.randomGet(); + var cards = target.getCards("h").randomGets(event.num); + player.line(target); + var content = [get.translation(target) + "的部分手牌", cards]; + game.log(player, "观看了", target, "的部分手牌"); + player.chooseControl("ok").set("dialog", content); + } + }, + }, + fujian: { + audio: "xinfu_fujian", + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter(event, player) { + return game.hasPlayer( + (target) => target != player && target.countCards("h") && !target.isMaxHandcard() + ); + }, + forced: true, + async content(event, trigger, player) { + const target = game + .filterPlayer((target) => { + return target != player && target.countCards("h") && !target.isMaxHandcard(); + }) + .randomGet(); player.line(target); - game.log(player,'观看了',target,'的手牌'); + game.log(player, "观看了", target, "的手牌"); player.viewHandcards(target); }, }, - xinfu_xionghuo:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countMark('xinfu_xionghuo')>0; + xinfu_xionghuo: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countMark("xinfu_xionghuo") > 0; }, - filterTarget:function(card,player,target){ - return player!=target&&!target.hasMark('xinfu_xionghuo'); + filterTarget: function (card, player, target) { + return player != target && !target.hasMark("xinfu_xionghuo"); }, - content:function(){ - player.removeMark('xinfu_xionghuo',1); - target.addMark('xinfu_xionghuo',1); + content: function () { + player.removeMark("xinfu_xionghuo", 1); + target.addMark("xinfu_xionghuo", 1); }, - ai:{ - order:11, - result:{ - target:function(player,target){ - if((player.countMark('xinfu_xionghuo')>=2||!game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)<0&¤t.hasMark('xinfu_xionghuo'); - }))&&player.countCards('h',function(card){ - return get.tag(card,'damage')&&player.canUse(card,target,null,true) - &&player.getUseValue(card)>0&&get.effect_use(target,card,player)>0 - &&target.hasSkillTag('filterDamage',null,{ - player:player, - card:card, - }); - })) return 3/Math.max(1,target.hp); - if((!player.hasUnknown()&&game.countPlayer(function(current){ - return get.attitude(player,current)<0; - })<=1)||player.countMark('xinfu_xionghuo')>=2){ + ai: { + order: 11, + result: { + target: function (player, target) { + if ( + (player.countMark("xinfu_xionghuo") >= 2 || + !game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) < 0 && + current.hasMark("xinfu_xionghuo") + ); + })) && + player.countCards("h", function (card) { + return ( + get.tag(card, "damage") && + player.canUse(card, target, null, true) && + player.getUseValue(card) > 0 && + get.effect_use(target, card, player) > 0 && + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ); + }) + ) + return 3 / Math.max(1, target.hp); + if ( + (!player.hasUnknown() && + game.countPlayer(function (current) { + return get.attitude(player, current) < 0; + }) <= 1) || + player.countMark("xinfu_xionghuo") >= 2 + ) { return -1; } return 0; }, }, - effect:{ - player:function(card,player,target){ - if(player!=target&&get.tag(card,'damage')&&target&&target.hasMark('xinfu_xionghuo')&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card, - })) return [1,0,1,-2]; + effect: { + player: function (card, player, target) { + if ( + player != target && + get.tag(card, "damage") && + target && + target.hasMark("xinfu_xionghuo") && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + return [1, 0, 1, -2]; }, }, - threaten:1.6, + threaten: 1.6, }, - marktext:'戾', - intro:{ - name:'暴戾', - content:'mark', + marktext: "戾", + intro: { + name: "暴戾", + content: "mark", }, - group:['xinfu_xionghuo_init','xinfu_xionghuo_damage','xinfu_xionghuo_effect'], - subSkill:{ - init:{ - audio:'xinfu_xionghuo', - trigger:{ - global:"phaseBefore", - player:'enterGame', + group: ["xinfu_xionghuo_init", "xinfu_xionghuo_damage", "xinfu_xionghuo_effect"], + subSkill: { + init: { + audio: "xinfu_xionghuo", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter:function(event,player){ - if(player.countMark('xinfu_xionghuo')>=3) return false; - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player) { + if (player.countMark("xinfu_xionghuo") >= 3) return false; + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - content:function(){ - player.addMark('xinfu_xionghuo',3-player.countMark('xinfu_xionghuo')); + forced: true, + locked: false, + content: function () { + player.addMark("xinfu_xionghuo", 3 - player.countMark("xinfu_xionghuo")); }, }, - damage:{ - audio:"xinfu_xionghuo", - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return event.player.countMark('xinfu_xionghuo')>0&&event.player!=player; + damage: { + audio: "xinfu_xionghuo", + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return event.player.countMark("xinfu_xionghuo") > 0 && event.player != player; }, - forced:true, - locked:false, - logTarget:'player', - content:function(){ + forced: true, + locked: false, + logTarget: "player", + content: function () { trigger.num++; }, }, - effect:{ - audio:'xinfu_xionghuo', - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return event.player.countMark('xinfu_xionghuo')>0&&event.player!=player; + effect: { + audio: "xinfu_xionghuo", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return event.player.countMark("xinfu_xionghuo") > 0 && event.player != player; }, - line:false, - forced:true, - locked:false, - logTarget:'player', - content:function(){ - 'step 0' - trigger.player.removeMark('xinfu_xionghuo',trigger.player.countMark('xinfu_xionghuo')); - 'step 1' - var num=get.rand(0,2); - switch(num){ + line: false, + forced: true, + locked: false, + logTarget: "player", + content: function () { + "step 0"; + trigger.player.removeMark( + "xinfu_xionghuo", + trigger.player.countMark("xinfu_xionghuo") + ); + ("step 1"); + var num = get.rand(0, 2); + switch (num) { case 0: - player.line(trigger.player,'fire'); - trigger.player.damage('fire'); - trigger.player.addTempSkill('xinfu_xionghuo_disable'); - trigger.player.markAuto('xinfu_xionghuo_disable',[player]); + player.line(trigger.player, "fire"); + trigger.player.damage("fire"); + trigger.player.addTempSkill("xinfu_xionghuo_disable"); + trigger.player.markAuto("xinfu_xionghuo_disable", [player]); break; case 1: - player.line(trigger.player,'water'); + player.line(trigger.player, "water"); trigger.player.loseHp(); - trigger.player.addMark('xinfu_xionghuo_low',1,false); - trigger.player.addTempSkill('xinfu_xionghuo_low'); + trigger.player.addMark("xinfu_xionghuo_low", 1, false); + trigger.player.addTempSkill("xinfu_xionghuo_low"); break; case 2: - player.line(trigger.player,'green'); + player.line(trigger.player, "green"); /* var card1=trigger.player.getCards('h').randomGet(); var card2=trigger.player.getCards('e').randomGet(); @@ -25660,2266 +31618,2776 @@ game.import('character', function () { if(card2) list.push(card2); if(list.length) player.gain(list,trigger.player,'giveAuto','bySelf'); */ - const cards=trigger.player.getGainableCards(player,'he'); - if(cards.length) player.gain(cards.randomGets(2),trigger.player,'giveAuto','bySelf'); + const cards = trigger.player.getGainableCards(player, "he"); + if (cards.length) + player.gain( + cards.randomGets(2), + trigger.player, + "giveAuto", + "bySelf" + ); break; } - 'step 2' + ("step 2"); game.delay(); }, }, - disable:{ - mod:{ - playerEnabled:function (card,player,target){ - if(card.name=='sha'&&player.getStorage('xinfu_xionghuo_disable').includes(target)) return false; + disable: { + mod: { + playerEnabled: function (card, player, target) { + if ( + card.name == "sha" && + player.getStorage("xinfu_xionghuo_disable").includes(target) + ) + return false; }, }, - charlotte:true, - onremove:true, - mark:true, - marktext:'禁', - intro:{content:'不能对$使用【杀】'}, + charlotte: true, + onremove: true, + mark: true, + marktext: "禁", + intro: { content: "不能对$使用【杀】" }, }, - low:{ - mod:{ - maxHandcard:function (player,num){ - return num-player.countMark('xinfu_xionghuo_low'); + low: { + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("xinfu_xionghuo_low"); }, }, - charlotte:true, - onremove:true, - mark:true, - marktext:'减', - intro:{content:'手牌上限-#'}, + charlotte: true, + onremove: true, + mark: true, + marktext: "减", + intro: { content: "手牌上限-#" }, }, }, }, - xinfu_shajue:{ - audio:2, - trigger:{global:'dying'}, - filter:function(event,player){ - if(event.player==player) return false; - const bool1=(!player.hasSkill('xinfu_xionghuo')||player.countMark('xinfu_xionghuo')<3); - const bool2=(event.player.hp<0&&get.itemtype(event.parent.cards)=='cards'&&event.parent.cards.some(card=>get.position(card,true)=='o')); - return bool1||bool2; + xinfu_shajue: { + audio: 2, + trigger: { global: "dying" }, + filter: function (event, player) { + if (event.player == player) return false; + const bool1 = + !player.hasSkill("xinfu_xionghuo") || player.countMark("xinfu_xionghuo") < 3; + const bool2 = + event.player.hp < 0 && + get.itemtype(event.parent.cards) == "cards" && + event.parent.cards.some((card) => get.position(card, true) == "o"); + return bool1 || bool2; }, - forced:true, - content:function(){ - if(!player.hasSkill('xinfu_xionghuo')||player.countMark('xinfu_xionghuo')<3) player.addMark('xinfu_xionghuo',1); - if(trigger.player.hp<0&&get.itemtype(trigger.parent.cards)=='cards'&&trigger.parent.cards.some(card=>get.position(card,true)=='o')){ - player.gain(trigger.parent.cards.filter(card=>get.position(card,true)=='o'),'gain2'); + forced: true, + content: function () { + if (!player.hasSkill("xinfu_xionghuo") || player.countMark("xinfu_xionghuo") < 3) + player.addMark("xinfu_xionghuo", 1); + if ( + trigger.player.hp < 0 && + get.itemtype(trigger.parent.cards) == "cards" && + trigger.parent.cards.some((card) => get.position(card, true) == "o") + ) { + player.gain( + trigger.parent.cards.filter((card) => get.position(card, true) == "o"), + "gain2" + ); } }, }, - xinfu_jianjie:{audio:3}, - jianjie:{ - group:["jianjie_use","jianjie_die"], - derivation:['jianjie_huoji','jianjie_lianhuan','jianjie_yeyan'], - audio:'xinfu_jianjie', - trigger:{ - player:"phaseZhunbeiBegin", + xinfu_jianjie: { audio: 3 }, + jianjie: { + group: ["jianjie_use", "jianjie_die"], + derivation: ["jianjie_huoji", "jianjie_lianhuan", "jianjie_yeyan"], + audio: "xinfu_jianjie", + trigger: { + player: "phaseZhunbeiBegin", }, - forced:true, - locked:false, - filter:function(event,player){ - return player.phaseNumber<=1&&game.hasPlayer(current=>current!=player); + forced: true, + locked: false, + filter: function (event, player) { + return player.phaseNumber <= 1 && game.hasPlayer((current) => current != player); }, - content:function(){ - 'step 0' - player.chooseTarget('荐杰:选择一名其他角色获得“龙印”',lib.filter.notMe,true).set('ai',(target)=>{ - return get.attitude(get.player(),target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - lib.skill.jianjie.addMark('huoji',player,target); - event.target=target; - game.delayx(); - } - else event.finish(); - 'step 2' - if(game.hasPlayer((current)=>{ - return current!=player&¤t!=target; - })){ - player.chooseTarget('荐杰:选择一名其他角色获得“凤印”',function(card,player,target){ - return target!=player&&target!=_status.event.getParent().target; - },true).set('ai',(target)=>{ - return get.attitude(get.player(),target); + content: function () { + "step 0"; + player + .chooseTarget("荐杰:选择一名其他角色获得“龙印”", lib.filter.notMe, true) + .set("ai", (target) => { + return get.attitude(get.player(), target); }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'thunder'); - lib.skill.jianjie.addMark('lianhuan',player,target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + lib.skill.jianjie.addMark("huoji", player, target); + event.target = target; + game.delayx(); + } else event.finish(); + ("step 2"); + if ( + game.hasPlayer((current) => { + return current != player && current != target; + }) + ) { + player + .chooseTarget( + "荐杰:选择一名其他角色获得“凤印”", + function (card, player, target) { + return target != player && target != _status.event.getParent().target; + }, + true + ) + .set("ai", (target) => { + return get.attitude(get.player(), target); + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + lib.skill.jianjie.addMark("lianhuan", player, target); game.delayx(); } }, - ai:{ - threaten:3, + ai: { + threaten: 3, }, - hasMark:(mark,player,target)=>{ - if(!target) return player.getStorage('jianjie_'+mark).length>0; - return target.getStorage('jianjie_'+mark).includes(player); + hasMark: (mark, player, target) => { + if (!target) return player.getStorage("jianjie_" + mark).length > 0; + return target.getStorage("jianjie_" + mark).includes(player); }, - addMark:(mark,player,target)=>{ - mark='jianjie_'+mark; - target.addAdditionalSkill(`${mark}_${player.playerid}`,mark); - target.markAuto(mark,[player]); - game.log(player,'令',target,'获得了',`#g“${mark=='jianjie_huoji'?'龙印':'凤印'}”`); + addMark: (mark, player, target) => { + mark = "jianjie_" + mark; + target.addAdditionalSkill(`${mark}_${player.playerid}`, mark); + target.markAuto(mark, [player]); + game.log( + player, + "令", + target, + "获得了", + `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”` + ); }, - removeMark:(mark,player,target,log)=>{ - if(lib.skill.jianjie.hasMark(mark,player,target,log)){ - mark='jianjie_'+mark; + removeMark: (mark, player, target, log) => { + if (lib.skill.jianjie.hasMark(mark, player, target, log)) { + mark = "jianjie_" + mark; target.removeAdditionalSkill(`${mark}_${player.playerid}`); - target.unmarkAuto(mark,[player]); - if(log) game.log(target,'移去了',player,'给予的',`#g“${mark=='jianjie_huoji'?'龙印':'凤印'}”`); - else game.log(player,'移去了',target,'的',`#g“${mark=='jianjie_huoji'?'龙印':'凤印'}”`); + target.unmarkAuto(mark, [player]); + if (log) + game.log( + target, + "移去了", + player, + "给予的", + `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”` + ); + else + game.log( + player, + "移去了", + target, + "的", + `#g“${mark == "jianjie_huoji" ? "龙印" : "凤印"}”` + ); } }, - subSkill:{ - use:{ - audio:'xinfu_jianjie', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(player.phaseNumber<=1) return false; - const skill=lib.skill.jianjie; - return game.hasPlayer(function(current){ - return skill.hasMark('huoji',player,current)||skill.hasMark('lianhuan',player,current); + subSkill: { + use: { + audio: "xinfu_jianjie", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.phaseNumber <= 1) return false; + const skill = lib.skill.jianjie; + return game.hasPlayer(function (current) { + return ( + skill.hasMark("huoji", player, current) || + skill.hasMark("lianhuan", player, current) + ); }); }, - filterTarget:function(card,player,target){ - if(ui.selected.targets.length==0){ - const skill=lib.skill.jianjie; - return skill.hasMark('huoji',player,target)||skill.hasMark('lianhuan',player,target); + filterTarget: function (card, player, target) { + if (ui.selected.targets.length == 0) { + const skill = lib.skill.jianjie; + return ( + skill.hasMark("huoji", player, target) || + skill.hasMark("lianhuan", player, target) + ); } return true; }, - selectTarget:2, - complexSelect:true, - complexTarget:true, - multitarget:true, - prompt:'移动场上的“龙印”或“凤印”', - targetprompt:['失去印','获得印'], - content:function(){ - 'step 0' - var skill=lib.skill.jianjie; - var bool1=skill.hasMark('huoji',player,targets[0]),bool2=skill.hasMark('lianhuan',player,targets[0]); - if(bool1&&bool2){ - player.chooseControl('龙印','凤印').set('prompt','选择要移动的“印”'); + selectTarget: 2, + complexSelect: true, + complexTarget: true, + multitarget: true, + prompt: "移动场上的“龙印”或“凤印”", + targetprompt: ["失去印", "获得印"], + content: function () { + "step 0"; + var skill = lib.skill.jianjie; + var bool1 = skill.hasMark("huoji", player, targets[0]), + bool2 = skill.hasMark("lianhuan", player, targets[0]); + if (bool1 && bool2) { + player.chooseControl("龙印", "凤印").set("prompt", "选择要移动的“印”"); + } else { + event._result = { control: bool1 ? "龙印" : "凤印" }; } - else{ - event._result={control:(bool1?'龙印':'凤印')} - } - 'step 1' - var skill=lib.skill.jianjie,mark=(result.control=='龙印'?'huoji':'lianhuan'); - skill.removeMark(mark,player,targets[0]); - skill.addMark(mark,player,targets[1]); + ("step 1"); + var skill = lib.skill.jianjie, + mark = result.control == "龙印" ? "huoji" : "lianhuan"; + skill.removeMark(mark, player, targets[0]); + skill.addMark(mark, player, targets[1]); game.delayx(); }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(ui.selected.targets.length==0){ - return get.attitude(player,target)<0?-999:-3; - } - else{ - return target.countCards('h')+1; + ai: { + order: 8, + result: { + target: function (player, target) { + if (ui.selected.targets.length == 0) { + return get.attitude(player, target) < 0 ? -999 : -3; + } else { + return target.countCards("h") + 1; } }, }, - expose:0.4, + expose: 0.4, }, }, - die:{ - audio:'xinfu_jianjie', - trigger:{global:'die'}, - filter:function(event,player){ - const skill=lib.skill.jianjie; - return skill.hasMark('huoji',player,event.player)||skill.hasMark('lianhuan',player,event.player); + die: { + audio: "xinfu_jianjie", + trigger: { global: "die" }, + filter: function (event, player) { + const skill = lib.skill.jianjie; + return ( + skill.hasMark("huoji", player, event.player) || + skill.hasMark("lianhuan", player, event.player) + ); }, - forced:true, - logTarget:'player', - content:function(){ - 'step 0' - if(lib.skill.jianjie.hasMark('huoji',player,trigger.player)){ - player.chooseTarget('荐杰:选择一名角色获得“龙印”',true).set('ai',(target)=>{ - return get.attitude(get.player(),target); - }); - } - else event.goto(2); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - lib.skill.jianjie.addMark('huoji',player,target); - event.target=target; + forced: true, + logTarget: "player", + content: function () { + "step 0"; + if (lib.skill.jianjie.hasMark("huoji", player, trigger.player)) { + player + .chooseTarget("荐杰:选择一名角色获得“龙印”", true) + .set("ai", (target) => { + return get.attitude(get.player(), target); + }); + } else event.goto(2); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + lib.skill.jianjie.addMark("huoji", player, target); + event.target = target; game.delayx(); - } - else event.finish(); - 'step 2' - if(lib.skill.jianjie.hasMark('lianhuan',player,trigger.player)){ - player.chooseTarget('荐杰:选择一名角色获得“凤印”',true).set('ai',(target)=>{ - return get.attitude(get.player(),target); - }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'thunder'); - lib.skill.jianjie.addMark('lianhuan',player,target); + } else event.finish(); + ("step 2"); + if (lib.skill.jianjie.hasMark("lianhuan", player, trigger.player)) { + player + .chooseTarget("荐杰:选择一名角色获得“凤印”", true) + .set("ai", (target) => { + return get.attitude(get.player(), target); + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "thunder"); + lib.skill.jianjie.addMark("lianhuan", player, target); game.delayx(); } }, }, - huoji:{ - marktext:'龙', - intro:{ - name:"龙印", - content:"
  • 出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。
  • 若你同时拥有“凤印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", + huoji: { + marktext: "龙", + intro: { + name: "龙印", + content: + "
  • 出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。
  • 若你同时拥有“凤印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", }, - inherit:'rehuoji', - usable:3, - charlotte:true, - viewAsFilter:function(player){ - const storage=player.getStorage('jianjie_huoji'); - if(!storage.some(source=>{ - return source.isIn()&&source.hasSkill('jianjie'); - })) return false; - return player.hasCard(card=>get.color(card)=='red','she'); + inherit: "rehuoji", + usable: 3, + charlotte: true, + viewAsFilter: function (player) { + const storage = player.getStorage("jianjie_huoji"); + if ( + !storage.some((source) => { + return source.isIn() && source.hasSkill("jianjie"); + }) + ) + return false; + return player.hasCard((card) => get.color(card) == "red", "she"); }, - group:['jianjie_yeyan','jianjie_huoji_effect'], + group: ["jianjie_yeyan", "jianjie_huoji_effect"], }, - huoji_effect:{ - trigger:{player:'huogongBegin'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return event.skill=='jianjie_huoji' + huoji_effect: { + trigger: { player: "huogongBegin" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.skill == "jianjie_huoji"; }, - content:function(){ + content: function () { trigger.setContent(lib.skill.olhuoji.huogongContent); }, }, - lianhuan:{ - marktext:'凤', - intro:{ - name:"凤印", - content:"
  • 出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。
  • 若你同时拥有“龙印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", + lianhuan: { + marktext: "凤", + intro: { + name: "凤印", + content: + "
  • 出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。
  • 若你同时拥有“龙印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", }, - charlotte:true, - usable:3, - filter:function(event,player){ - const storage=player.getStorage('jianjie_lianhuan'); - if(!storage.some(source=>{ - return source.isIn()&&source.hasSkill('jianjie'); - })) return false; - if(!player.hasCard(card=>get.suit(card)=='club','she')) return false; - return (event.type=='phase'||event.filterCard({name:'tiesuo'},player,event)); + charlotte: true, + usable: 3, + filter: function (event, player) { + const storage = player.getStorage("jianjie_lianhuan"); + if ( + !storage.some((source) => { + return source.isIn() && source.hasSkill("jianjie"); + }) + ) + return false; + if (!player.hasCard((card) => get.suit(card) == "club", "she")) return false; + return ( + event.type == "phase" || event.filterCard({ name: "tiesuo" }, player, event) + ); }, - inherit:'ollianhuan', - group:['jianjie_yeyan','jianjie_lianhuan_effect'], + inherit: "ollianhuan", + group: ["jianjie_yeyan", "jianjie_lianhuan_effect"], }, - lianhuan_effect:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.skill!='jianjie_lianhuan') return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(current=>{ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current); - })) return true; + lianhuan_effect: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.skill != "jianjie_lianhuan") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer((current) => { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) + ); + }) + ) + return true; } return false; }, - charlotte:true, - forced:true, - popup:false, - content:function(){ - 'step 0' - player.chooseTarget('是否为'+get.translation(trigger.card)+'额外指定一个目标?',(card,player,target)=>{ - return !_status.event.sourcex.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('sourcex',trigger.targets).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayex(); - } - else event.finish(); - 'step 2' - if(result.bool){ - var targets=result.targets; - player.line(targets,'thunder'); + charlotte: true, + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget( + "是否为" + get.translation(trigger.card) + "额外指定一个目标?", + (card, player, target) => { + return ( + !_status.event.sourcex.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayex(); + } else event.finish(); + ("step 2"); + if (result.bool) { + var targets = result.targets; + player.line(targets, "thunder"); trigger.targets.addArray(targets); - game.log(targets,'也成为了',trigger.card,'的目标'); + game.log(targets, "也成为了", trigger.card, "的目标"); } }, }, - yeyan:{ - inherit:'yeyan', - filter:function(event,player){ - const huoji=player.getStorage('jianjie_huoji'),lianhuan=player.getStorage('jianjie_lianhuan'); - return huoji.length>0&&lianhuan.some(source=>{ - return huoji.includes(source)&&source.isIn()&&source.hasSkill('jianjie'); - }) + yeyan: { + inherit: "yeyan", + filter: function (event, player) { + const huoji = player.getStorage("jianjie_huoji"), + lianhuan = player.getStorage("jianjie_lianhuan"); + return ( + huoji.length > 0 && + lianhuan.some((source) => { + return ( + huoji.includes(source) && source.isIn() && source.hasSkill("jianjie") + ); + }) + ); }, - contentBefore:function(){ - player.awakenSkill('jianjie_yeyan'); - var skill=lib.skill.jianjie; - var huoji=player.getStorage('jianjie_huoji').slice(0),lianhuan=player.getStorage('jianjie_lianhuan').slice(0); - huoji.forEach(source=>{ - skill.removeMark('huoji',source,player,true); + contentBefore: function () { + player.awakenSkill("jianjie_yeyan"); + var skill = lib.skill.jianjie; + var huoji = player.getStorage("jianjie_huoji").slice(0), + lianhuan = player.getStorage("jianjie_lianhuan").slice(0); + huoji.forEach((source) => { + skill.removeMark("huoji", source, player, true); }); - lianhuan.forEach(source=>{ - skill.removeMark('lianhuan',source,player,true); + lianhuan.forEach((source) => { + skill.removeMark("lianhuan", source, player, true); }); }, }, }, }, - xinfu_yinshi:{ - audio:2, - trigger:{player:'damageBegin4'}, - forced:true, - filter:function (event,player){ - const skill=lib.skill.jianjie; - if(skill.hasMark('huoji',player)||skill.hasMark('lianhuan',player)) return false; - if(!player.hasEmptySlot(2)) return false; - if(event.hasNature()) return true; - return get.type(event.card,'trick')=='trick'; + xinfu_yinshi: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + const skill = lib.skill.jianjie; + if (skill.hasMark("huoji", player) || skill.hasMark("lianhuan", player)) return false; + if (!player.hasEmptySlot(2)) return false; + if (event.hasNature()) return true; + return get.type(event.card, "trick") == "trick"; }, - content:function (){ + content: function () { trigger.cancel(); }, - ai:{ - notrick:true, - nofire:true, - nothunder:true, - effect:{ - target:function (card,player,target,current){ - const skill=lib.skill.jianjie; - if(skill.hasMark('huoji',target)||skill.hasMark('lianhuan',target)) return false; - if(player==target&&get.subtype(card)=='equip2'){ - if(get.equipValue(card)<=8) return 0; + ai: { + notrick: true, + nofire: true, + nothunder: true, + effect: { + target: function (card, player, target, current) { + const skill = lib.skill.jianjie; + if (skill.hasMark("huoji", target) || skill.hasMark("lianhuan", target)) + return false; + if (player == target && get.subtype(card) == "equip2") { + if (get.equipValue(card) <= 8) return 0; } - if(!target.hasEmptySlot(2)) return; - if(get.tag(card,'natureDamage')) return 'zerotarget'; - if(get.type(card)=='trick'&&get.tag(card,'damage')){ - return 'zeroplayertarget'; + if (!target.hasEmptySlot(2)) return; + if (get.tag(card, "natureDamage")) return "zerotarget"; + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; } }, }, }, }, - "xinfu_chenghao":{ - audio:2, - trigger:{ - global:"damageEnd", + xinfu_chenghao: { + audio: 2, + trigger: { + global: "damageEnd", }, - filter:function (event,player){ - return event.lianhuanable==true&&event.player.isIn(); + filter: function (event, player) { + return event.lianhuanable == true && event.player.isIn(); }, - frequent:true, - content:function(){ - 'step 0' - event.cards=game.cardsGotoOrdering(get.cards(game.countPlayer(function(current){ - return current.isLinked(); - })+1)).cards; - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - 'step 1' - if(event.cards.length>1){ - player.chooseCardButton('称好:请选择要分配的牌',true,event.cards,[1,event.cards.length]).set('ai',function(button){ - if(ui.selected.buttons.length==0) return 1; - return 0; + frequent: true, + content: function () { + "step 0"; + event.cards = game.cardsGotoOrdering( + get.cards( + game.countPlayer(function (current) { + return current.isLinked(); + }) + 1 + ) + ).cards; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - } - else if(event.cards.length==1){ - event._result={links:event.cards.slice(0),bool:true}; - } - else{ + event.given_map = {}; + ("step 1"); + if (event.cards.length > 1) { + player + .chooseCardButton("称好:请选择要分配的牌", true, event.cards, [ + 1, + event.cards.length, + ]) + .set("ai", function (button) { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + } else if (event.cards.length == 1) { + event._result = { links: event.cards.slice(0), bool: true }; + } else { event.finish(); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { event.cards.removeArray(result.links); - event.togive=result.links.slice(0); - player.chooseTarget('选择一名角色获得'+get.translation(result.links),true).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.enemy){ - return -att; - } - else if(att>0){ - return att/(1+target.countCards('h')); - } - else{ - return att/100; - } - }).set('enemy',get.value(event.togive[0],player,'raw')<0); + event.togive = result.links.slice(0); + player + .chooseTarget("选择一名角色获得" + get.translation(result.links), true) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(event.togive[0], player, "raw") < 0); } - 'step 3' - if(result.targets.length){ - var id=result.targets[0].playerid,map=event.given_map; - if(!map[id]) map[id]=[]; + ("step 3"); + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; map[id].addArray(event.togive); } - if(cards.length>0) event.goto(1); - 'step 4' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + if (cards.length > 0) event.goto(1); + ("step 4"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - var list=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - list.push([source,event.given_map[i]]); + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); } game.loseAsync({ - gain_list:list, - giver:player, - animate:'draw', - }).setContent('gaincardMultiple'); + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); }, }, - "xinfu_wuniang":{ - trigger:{ - player:["useCard","respond"], + xinfu_wuniang: { + trigger: { + player: ["useCard", "respond"], }, - audio:2, - direct:true, - filter:function (event,player){ - return event.card.name=='sha'; + audio: 2, + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; }, - content:function (){ - 'step 0' - player.chooseTarget(get.prompt('xinfu_wuniang'),'获得一名其他角色的一张牌,然后其和场上所有的“关索”摸一张牌。',function(card,player,target){ - if(player==target) return false; - return target.countGainableCards(player,'he')>0; - }).set('ai',function(target){ - return 10-get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('xinfu_wuniang',target); - player.line(target,'fire'); - event.draws=game.filterPlayer(function(current){ - if(current==target) return true; - return current.name=='guansuo'||current.name2=='guansuo'; + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("xinfu_wuniang"), + "获得一名其他角色的一张牌,然后其和场上所有的“关索”摸一张牌。", + function (card, player, target) { + if (player == target) return false; + return target.countGainableCards(player, "he") > 0; + } + ) + .set("ai", function (target) { + return 10 - get.attitude(_status.event.player, target); }); - player.gainPlayerCard(target,'he',true); - } - else event.finish(); - 'step 2' - game.asyncDraw(event.draws,1); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xinfu_wuniang", target); + player.line(target, "fire"); + event.draws = game.filterPlayer(function (current) { + if (current == target) return true; + return current.name == "guansuo" || current.name2 == "guansuo"; + }); + player.gainPlayerCard(target, "he", true); + } else event.finish(); + ("step 2"); + game.asyncDraw(event.draws, 1); game.delay(); }, }, - "xinfu_xushen":{ - derivation:["xinfu_zhennan"], - audio:2, - subSkill:{ - count:{ - trigger:{ - player:"recoverBegin", + xinfu_xushen: { + derivation: ["xinfu_zhennan"], + audio: 2, + subSkill: { + count: { + trigger: { + player: "recoverBegin", }, - forced:true, - silent:true, - popup:false, - filter:function (event,player){ - if(!event.card||event.card.name!='tao') return false; - if(!event.source||!event.source.hasSex('male')) return false; - if(!player.isDying()) return false; - if(game.hasPlayer(function(current){ - return current.name=='guansuo'||current.name2=='guansuo'; - })) return false; + forced: true, + silent: true, + popup: false, + filter: function (event, player) { + if (!event.card || event.card.name != "tao") return false; + if (!event.source || !event.source.hasSex("male")) return false; + if (!player.isDying()) return false; + if ( + game.hasPlayer(function (current) { + return current.name == "guansuo" || current.name2 == "guansuo"; + }) + ) + return false; return true; }, - content:function (){ - trigger.xinfu_xushen=true; + content: function () { + trigger.xinfu_xushen = true; }, - sub:true, + sub: true, }, }, - group:["xinfu_xushen_count"], - trigger:{ - player:"recoverAfter", + group: ["xinfu_xushen_count"], + trigger: { + player: "recoverAfter", }, - limited:true, - init:function (player){ - player.storage.xinfu_xushen=false; + limited: true, + init: function (player) { + player.storage.xinfu_xushen = false; }, - filter:function (event,player){ - if(player.storage.xinfu_xushen) return false; - if(player.isDying()) return false; - return event.xinfu_xushen==true; + filter: function (event, player) { + if (player.storage.xinfu_xushen) return false; + if (player.isDying()) return false; + return event.xinfu_xushen == true; }, - direct:true, - skillAnimation:true, - animationColor:'fire', - content:function (){ - "step 0" - trigger.source.chooseBool('【许身】:是否将自己的一张武将牌替换为“关索”?').set('ai',function(){ - return false; - }); - "step 1" - if(result.bool){ - player.awakenSkill('xinfu_xushen'); - player.logSkill('xinfu_xushen',trigger.source); - if(trigger.source.name2!=undefined){ - trigger.source.chooseControl(trigger.source.name1,trigger.source.name2).set('prompt','请选择要更换的武将牌'); - }else event._result={control:trigger.source.name1}; - } - else event.finish(); - "step 2" - trigger.source.reinitCharacter(result.control,'guansuo'); + direct: true, + skillAnimation: true, + animationColor: "fire", + content: function () { + "step 0"; + trigger.source + .chooseBool("【许身】:是否将自己的一张武将牌替换为“关索”?") + .set("ai", function () { + return false; + }); + ("step 1"); + if (result.bool) { + player.awakenSkill("xinfu_xushen"); + player.logSkill("xinfu_xushen", trigger.source); + if (trigger.source.name2 != undefined) { + trigger.source + .chooseControl(trigger.source.name1, trigger.source.name2) + .set("prompt", "请选择要更换的武将牌"); + } else event._result = { control: trigger.source.name1 }; + } else event.finish(); + ("step 2"); + trigger.source.reinitCharacter(result.control, "guansuo"); player.recover(); - player.addSkills('xinfu_zhennan'); + player.addSkills("xinfu_zhennan"); }, - mark:true, - intro:{ - content:"limited", + mark: true, + intro: { + content: "limited", }, }, - "xinfu_falu":{ - subSkill:{ - spade:{ - marktext:'♠︎️', - intro:{ - name:'紫薇', - content:'mark', + xinfu_falu: { + subSkill: { + spade: { + marktext: "♠︎️", + intro: { + name: "紫薇", + content: "mark", }, }, - heart:{ - marktext:'♥︎️', - intro:{ - name:'玉清', - content:'mark', + heart: { + marktext: "♥︎️", + intro: { + name: "玉清", + content: "mark", }, }, - club:{ - marktext:'♣︎️', - intro:{ - name:'后土', - content:'mark', + club: { + marktext: "♣︎️", + intro: { + name: "后土", + content: "mark", }, }, - diamond:{ - marktext:'♦︎', - intro:{ - name:'勾陈', - content:'mark', + diamond: { + marktext: "♦︎", + intro: { + name: "勾陈", + content: "mark", }, }, }, - forced:true, - audio:2, - trigger:{ - player:["loseAfter","enterGame"], - global:['loseAsyncAfter',"phaseBefore"], + forced: true, + audio: 2, + trigger: { + player: ["loseAfter", "enterGame"], + global: ["loseAsyncAfter", "phaseBefore"], }, - filter:function (event,player){ - if(event.name.indexOf('lose')!=0) return (event.name!='phase'||game.phaseNumber==0); - if(event.type!='discard'||event.getlx===false) return false; - var evt=event.getl(player); - for(var i=0;i0)) break; + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; top.unshift(cards.shift()); } } - bottom=cards; - return [top,bottom]; - } - "step 1" - var top=result.moved[0]; - var bottom=result.moved[1]; + bottom = cards; + return [top, bottom]; + }; + ("step 1"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - for(var i=0;i0) return list[0]; - return 'cancel2'; - }).set('judging',trigger.player.judging[0]); - "step 1" - if(result.control!='cancel2'){ + content: function () { + "step 0"; + var str = + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + ",是否发动【真仪】,弃置「紫薇♠」标记并修改判定结果?"; + player + .chooseControl("spade", "heart", "diamond", "club", "cancel2") + .set("prompt", str) + .set("ai", function () { + //return '取消'; + var judging = _status.event.judging; + var trigger = _status.event.getTrigger(); + var res1 = trigger.judge(judging); + var list = lib.suit.slice(0); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0) return 0; + var getj = function (suit) { + return trigger.judge({ + name: get.name(judging), + nature: get.nature(judging), + suit: suit, + number: 5, + }); + }; + list.sort(function (a, b) { + return (getj(b) - getj(a)) * get.sgn(attitude); + }); + if ((getj(list[0]) - res1) * attitude > 0) return list[0]; + return "cancel2"; + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.control != "cancel2") { player.addExpose(0.25); - player.removeMark('xinfu_falu_spade'); - player.logSkill('xinfu_zhenyi',trigger.player); + player.removeMark("xinfu_falu_spade"); + player.logSkill("xinfu_zhenyi", trigger.player); //player.line(trigger.player); player.popup(result.control); - game.log(player,'将判定结果改为了','#y'+get.translation(result.control+2)+5); - trigger.fixedResult={ - suit:result.control, - color:get.color({suit:result.control}), - number:5, + game.log(player, "将判定结果改为了", "#y" + get.translation(result.control + 2) + 5); + trigger.fixedResult = { + suit: result.control, + color: get.color({ suit: result.control }), + number: 5, }; } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, + ai: { + rejudge: true, + tag: { + rejudge: 1, }, - expose:0.5, + expose: 0.5, }, }, - "zhenyi_club":{ - audio:'xinfu_zhenyi', - enable:"chooseToUse", - viewAsFilter:function(player){ - if(player==_status.currentPhase) return false; - return player.hasMark('xinfu_falu_club')&&player.countCards('hs')>0; + zhenyi_club: { + audio: "xinfu_zhenyi", + enable: "chooseToUse", + viewAsFilter: function (player) { + if (player == _status.currentPhase) return false; + return player.hasMark("xinfu_falu_club") && player.countCards("hs") > 0; }, - filterCard:true, - position:"hs", - viewAs:{ - name:"tao", + filterCard: true, + position: "hs", + viewAs: { + name: "tao", }, - prompt:"弃置「后土♣」标记,将一张手牌当桃使用", - check:function(card){return 15-get.value(card)}, - precontent:function(){ - player.removeMark('xinfu_falu_club'); + prompt: "弃置「后土♣」标记,将一张手牌当桃使用", + check: function (card) { + return 15 - get.value(card); + }, + precontent: function () { + player.removeMark("xinfu_falu_club"); }, }, - zhenyi_heart:{ - trigger:{ - source:"damageBegin1", + zhenyi_heart: { + trigger: { + source: "damageBegin1", }, - audio:'xinfu_zhenyi', - filter:function (event,player){ - return player.hasMark('xinfu_falu_heart'); + audio: "xinfu_zhenyi", + filter: function (event, player) { + return player.hasMark("xinfu_falu_heart"); }, - check:function (event,player){ - if(get.attitude(player,event.player)>=0) return false; - if(event.player.hasSkillTag('filterDamage',null,{ - player:player, - card:event.card, - })) return false; + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if ( + event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) + ) + return false; return true; //return player.hasMark('xinfu_falu_spade')||get.color(ui.cardPile.firstChild)=='black'; }, - prompt2:function(event){ - return '弃置「玉清♥」标记,令对'+get.translation(event.player)+'即将造成的伤害+1。'; + prompt2: function (event) { + return "弃置「玉清♥」标记,令对" + get.translation(event.player) + "即将造成的伤害+1。"; }, - logTarget:"player", - content:function(){ - player.removeMark('xinfu_falu_heart'); + logTarget: "player", + content: function () { + player.removeMark("xinfu_falu_heart"); trigger.num++; }, }, - "xinfu_zhennan":{ - audio:2, - trigger:{ - target:"useCardToTargeted", + xinfu_zhennan: { + audio: 2, + trigger: { + target: "useCardToTargeted", }, - filter:function (event,player){ - return event.card.name=='nanman'; + filter: function (event, player) { + return event.card.name == "nanman"; }, - direct:true, - content:function (){ - "step 0" - player.chooseTarget(get.prompt('xinfu_zhennan'),'对一名其他角色造成1-3点随机伤害',function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - "step 1" - if(result.bool&&result.targets&&result.targets.length){ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("xinfu_zhennan"), + "对一名其他角色造成1-3点随机伤害", + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool && result.targets && result.targets.length) { game.delay(); - player.logSkill('xinfu_zhennan',result.targets); - var num=[1,2,3,1,1,2].randomGet(); - if(get.isLuckyStar(player)) num=3; + player.logSkill("xinfu_zhennan", result.targets); + var num = [1, 2, 3, 1, 1, 2].randomGet(); + if (get.isLuckyStar(player)) num = 3; //player.line(result.targets[0],'fire'); result.targets[0].damage(num); } }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, }, - dynamicTranslate:{ - shanduan:function(player){ - if(player.storage.shanduan) return '锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=['+get.translation(player.storage.shanduan)+']中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。'; - return '锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。'; + dynamicTranslate: { + shanduan: function (player) { + if (player.storage.shanduan) + return ( + "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[" + + get.translation(player.storage.shanduan) + + "]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。" + ); + return "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。"; }, - kunfen:function(player){ - if(player.storage.kunfen) return '结束阶段开始时,你可以失去1点体力,然后摸两张牌。'; - return '锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。'; + kunfen: function (player) { + if (player.storage.kunfen) return "结束阶段开始时,你可以失去1点体力,然后摸两张牌。"; + return "锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。"; }, - jieyuan:function(player){ - var str='当你对一名其他角色造成伤害时,' - if(!player.hasSkill('fenxin_fan')) str+='若其体力值大于或等于你的体力值,'; - str+='你可弃置一张'; - if(!player.hasSkill('fenxin_nei')) str+='黑色手'; - str+='牌,令此伤害+1;当你受到一名其他角色造成的伤害时,'; - if(!player.hasSkill('fenxin_zhong')) str+='若其体力值大于或等于你的体力值,'; - str+='你可弃置一张' - if(!player.hasSkill('fenxin_nei')) str+='红色手'; - str+='牌,令此伤害-1。'; + jieyuan: function (player) { + var str = "当你对一名其他角色造成伤害时,"; + if (!player.hasSkill("fenxin_fan")) str += "若其体力值大于或等于你的体力值,"; + str += "你可弃置一张"; + if (!player.hasSkill("fenxin_nei")) str += "黑色手"; + str += "牌,令此伤害+1;当你受到一名其他角色造成的伤害时,"; + if (!player.hasSkill("fenxin_zhong")) str += "若其体力值大于或等于你的体力值,"; + str += "你可弃置一张"; + if (!player.hasSkill("fenxin_nei")) str += "红色手"; + str += "牌,令此伤害-1。"; return str; }, - youlong:function(player){ - if(player.storage.youlong) return '转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。'; + youlong: function (player) { + if (player.storage.youlong) + return '转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。'; return '转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。'; }, - luochong:function(player){ - var storage=player.getStorage('luochong'); - var str='准备阶段开始时/当你于一回合首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):' - var choiceList=[ - '⒈令一名角色回复1点体力。', - '⒉令一名角色失去1点体力。', - '⒊令一名角色弃置两张牌。', - '⒋令一名角色摸两张牌。' + luochong: function (player) { + var storage = player.getStorage("luochong"); + var str = + "准备阶段开始时/当你于一回合首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):"; + var choiceList = [ + "⒈令一名角色回复1点体力。", + "⒉令一名角色失去1点体力。", + "⒊令一名角色弃置两张牌。", + "⒋令一名角色摸两张牌。", ]; - for(var i=0;i<4;i++){ - if(storage.includes(i)){ - choiceList[i]=(''+choiceList[i]+''); + for (var i = 0; i < 4; i++) { + if (storage.includes(i)) { + choiceList[i] = + '' + choiceList[i] + ""; } - str+=choiceList[i]; + str += choiceList[i]; } return str; }, - spmanwang:function(player){ - var num=4-player.countMark('spmanwang'); - var str='出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:'; - var list=[ - '⒈获得〖叛侵〗。', - '⒉摸一张牌。', - '⒊回复1点体力。', - '⒋摸两张牌并失去〖叛侵〗。', - ]; - for(var i=0;i<4;i++){ - if(i==num){ - str+=''; + spmanwang: function (player) { + var num = 4 - player.countMark("spmanwang"); + var str = "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:"; + var list = ["⒈获得〖叛侵〗。", "⒉摸一张牌。", "⒊回复1点体力。", "⒋摸两张牌并失去〖叛侵〗。"]; + for (var i = 0; i < 4; i++) { + if (i == num) { + str += ''; } - str+=list[i]; + str += list[i]; } - if(num<4) str+=''; + if (num < 4) str += ""; return str; }, - olbixin:function(player){ - var count=player.countMark('olbixin'); - if(count<3) return lib.translate.olbixin_info.slice(count*5); - return '你可以声明一种牌的类型(每种类型限[3]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[1]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。'; + olbixin: function (player) { + var count = player.countMark("olbixin"); + if (count < 3) return lib.translate.olbixin_info.slice(count * 5); + return "你可以声明一种牌的类型(每种类型限[3]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[1]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。"; }, - olfeibai:function(player){ - if(player.storage.olfeibai) return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; - return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。' + olfeibai: function (player) { + if (player.storage.olfeibai) + return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; + return '转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。'; }, - olmiuyan:function(player){ - if(player.storage.olmiuyan) return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。'; + olmiuyan: function (player) { + if (player.storage.olmiuyan) + return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。'; return '转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。'; }, - olsaogu:function(player){ - if(player.storage.olsaogu) return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; + olsaogu: function (player) { + if (player.storage.olsaogu) + return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; }, - oldongdao:function(player){ - if(player.storage.oldongdao) return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; + oldongdao: function (player) { + if (player.storage.oldongdao) + return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; }, - ollangdao:function(player){ - var str='当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:'; - var list=[ - '1.令此【杀】伤害基数+1;', - '2.令你可以为此【杀】多选择一个目标;', - '3.令此【杀】不可被响应。' + ollangdao: function (player) { + var str = "当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:"; + var list = [ + "1.令此【杀】伤害基数+1;", + "2.令你可以为此【杀】多选择一个目标;", + "3.令此【杀】不可被响应。", ]; - var storage=player.getStorage('ollangdao'); - list.forEach((item,index)=>{ - if(storage.includes(index)){ - str+=`${item}`; - } - else str+=item; - }) - str+='然后若没有角色因此【杀】死亡,你移除本次被选择的项。'; + var storage = player.getStorage("ollangdao"); + list.forEach((item, index) => { + if (storage.includes(index)) { + str += `${item}`; + } else str += item; + }); + str += "然后若没有角色因此【杀】死亡,你移除本次被选择的项。"; return str; }, - olxuanzhu(player){ - if(player.storage.olxuanzhu) return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; + olxuanzhu(player) { + if (player.storage.olxuanzhu) + return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; }, }, - characterReplace:{ - guanyinping:['guanyinping','old_guanyinping'], - shixie:['shixie','dc_shixie','old_shixie'], - caoshuang:['caoshuang','dc_caoshuang','ns_caoshuang'], - caoang:['caoang','yj_caoang','tw_caoang'], - caohong:['caohong','tw_re_caohong','tw_caohong','yj_caohong'], - xiahouba:['xiahouba','dc_xiahouba','tw_xiahouba'], - maliang:['maliang','re_maliang','tw_maliang','ol_maliang','old_maliang'], - dingfeng:['dingfeng','tw_dingfeng','old_dingfeng'], - zumao:['zumao','tw_zumao'], - tw_beimihu:['beimihu','tw_beimihu'], - panfeng:['panfeng','re_panfeng','std_panfeng'], - sunluyu:['sunluyu','re_sunluyu','mb_sunluyu'], - jin_simazhao:['jin_simazhao','simazhao','sp_simazhao'], - jin_wangyuanji:['jin_wangyuanji','wangyuanji','sp_wangyuanji'], - wangyun:['clan_wangyun','wangyun','dc_wangyun','re_wangyun','jsrg_wangyun','old_wangyun','pe_wangyun'], - zhangliang:['xin_zhangliang','re_zhangliang','zhangliang'], - lingju:['lingju','old_lingju'], - guansuo:['guansuo','dc_guansuo'], - zhangxingcai:['zhangxingcai','old_zhangxingcai'], - lisu:['ol_lisu','lisu'], - fuwan:['fuwan','tw_fuwan','sp_fuwan'], - huaxin:['ol_huaxin','huaxin','sp_huaxin'], - xujing:['xujing','dc_xujing','sp_xujing','tw_xujing'], - zhaoxiang:['zhaoxiang','dc_zhaoxiang','tw_zhaoxiang'], - dengzhi:['ol_dengzhi','re_dengzhi','dengzhi','tw_dengzhi'], - wangrong:['ol_wangrong','wangrong'], - zongyu:['zongyu','sp_zongyu','tw_zongyu'], - ol_dongzhao:['ol_dongzhao','dc_dongzhao','tw_dongzhao'], - mayunlu:['mayunlu','tw_mayunlu'], - zhuling:['ol_zhuling','dc_zhuling','zhuling'], - zangba:['zangba','tw_zangba'], - zhangbao:['zhangbao','re_zhangbao'], - jianggan:['jianggan','sp_jianggan'], - dc_jiben:['dc_jiben','sp_jiben'], - yangyi:['ol_yangyi','yangyi','tw_yangyi'], - tianyu:['tianyu','tw_tianyu'], - huangchengyan:['huangchengyan','dc_huangchengyan'], - puyuan:['ol_puyuan','puyuan'], - huangzu:['huangzu','dc_huangzu'], - huojun:['huojun','dc_huojun','xin_huojun','tw_huojun'], - zhaoyǎn:['zhaoyǎn','dc_zhaoyǎn'], - furong:['ol_furong','furong','tw_furong'], - daxiaoqiao:['daxiaoqiao','dc_daxiaoqiao','tw_daxiaoqiao'], - zhugeguo:['zhugeguo','tw_zhugeguo'], - wanglang:['ol_wanglang','wanglang','old_wanglang'], - tengfanglan:['tengfanglan','dc_tengfanglan'], - zhangyì:['ol_zhangyì','zhangyì'], - yuantanyuanshang:['yuantanyuanshang','yuantanyuanxiyuanshang'], - ruiji:['ruiji','dc_ruiji'], - jsp_huangyueying:['jsp_huangyueying','re_jsp_huangyueying'], - ganfuren:['ganfuren','dc_ganfuren','jsp_ganfuren'], - wenqin:['wenqin','pe_wenqin'], - zhouqun:['ol_zhouqun','zhouqun'], - qianzhao:['ol_qianzhao','qianzhao'], - ol_pengyang:['ol_pengyang','sp_pengyang'], - ol_luyusheng:['ol_luyusheng','luyusheng'], - fanjiangzhangda:['fanjiangzhangda','jsrg_fanjiangzhangda'], - simalang:['re_simalang','simalang'], - zhugedan:['re_zhugedan','zhugedan'], - zhangren:['jsrg_zhangren','zhangren'], - wenqin:['ol_wenqin','pe_wenqin'], - lukai:['ol_lukai','lukai'], - liupi:['ol_liupi','liupi'], + characterReplace: { + guanyinping: ["guanyinping", "old_guanyinping"], + shixie: ["shixie", "dc_shixie", "old_shixie"], + caoshuang: ["caoshuang", "dc_caoshuang", "ns_caoshuang"], + caoang: ["caoang", "yj_caoang", "tw_caoang"], + caohong: ["caohong", "tw_re_caohong", "tw_caohong", "yj_caohong"], + xiahouba: ["xiahouba", "dc_xiahouba", "tw_xiahouba"], + maliang: ["maliang", "re_maliang", "tw_maliang", "ol_maliang", "old_maliang"], + dingfeng: ["dingfeng", "tw_dingfeng", "old_dingfeng"], + zumao: ["zumao", "tw_zumao"], + tw_beimihu: ["beimihu", "tw_beimihu"], + panfeng: ["panfeng", "re_panfeng", "std_panfeng"], + sunluyu: ["sunluyu", "re_sunluyu", "mb_sunluyu"], + jin_simazhao: ["jin_simazhao", "simazhao", "sp_simazhao"], + jin_wangyuanji: ["jin_wangyuanji", "wangyuanji", "sp_wangyuanji"], + wangyun: [ + "clan_wangyun", + "wangyun", + "dc_wangyun", + "re_wangyun", + "jsrg_wangyun", + "old_wangyun", + "pe_wangyun", + ], + zhangliang: ["xin_zhangliang", "re_zhangliang", "zhangliang"], + lingju: ["lingju", "old_lingju"], + guansuo: ["guansuo", "dc_guansuo"], + zhangxingcai: ["zhangxingcai", "old_zhangxingcai"], + lisu: ["ol_lisu", "lisu"], + fuwan: ["fuwan", "tw_fuwan", "sp_fuwan"], + huaxin: ["ol_huaxin", "huaxin", "sp_huaxin"], + xujing: ["xujing", "dc_xujing", "sp_xujing", "tw_xujing"], + zhaoxiang: ["zhaoxiang", "dc_zhaoxiang", "tw_zhaoxiang"], + dengzhi: ["ol_dengzhi", "re_dengzhi", "dengzhi", "tw_dengzhi"], + wangrong: ["ol_wangrong", "wangrong"], + zongyu: ["zongyu", "sp_zongyu", "tw_zongyu"], + ol_dongzhao: ["ol_dongzhao", "dc_dongzhao", "tw_dongzhao"], + mayunlu: ["mayunlu", "tw_mayunlu"], + zhuling: ["ol_zhuling", "dc_zhuling", "zhuling"], + zangba: ["zangba", "tw_zangba"], + zhangbao: ["zhangbao", "re_zhangbao"], + jianggan: ["jianggan", "sp_jianggan"], + dc_jiben: ["dc_jiben", "sp_jiben"], + yangyi: ["ol_yangyi", "yangyi", "tw_yangyi"], + tianyu: ["tianyu", "tw_tianyu"], + huangchengyan: ["huangchengyan", "dc_huangchengyan"], + puyuan: ["ol_puyuan", "puyuan"], + huangzu: ["huangzu", "dc_huangzu"], + huojun: ["huojun", "dc_huojun", "xin_huojun", "tw_huojun"], + zhaoyǎn: ["zhaoyǎn", "dc_zhaoyǎn"], + furong: ["ol_furong", "furong", "tw_furong"], + daxiaoqiao: ["daxiaoqiao", "dc_daxiaoqiao", "tw_daxiaoqiao"], + zhugeguo: ["zhugeguo", "tw_zhugeguo"], + wanglang: ["ol_wanglang", "wanglang", "old_wanglang"], + tengfanglan: ["tengfanglan", "dc_tengfanglan"], + zhangyì: ["ol_zhangyì", "zhangyì"], + yuantanyuanshang: ["yuantanyuanshang", "yuantanyuanxiyuanshang"], + ruiji: ["ruiji", "dc_ruiji"], + jsp_huangyueying: ["jsp_huangyueying", "re_jsp_huangyueying"], + ganfuren: ["ganfuren", "dc_ganfuren", "jsp_ganfuren"], + wenqin: ["wenqin", "pe_wenqin"], + zhouqun: ["ol_zhouqun", "zhouqun"], + qianzhao: ["ol_qianzhao", "qianzhao"], + ol_pengyang: ["ol_pengyang", "sp_pengyang"], + ol_luyusheng: ["ol_luyusheng", "luyusheng"], + fanjiangzhangda: ["fanjiangzhangda", "jsrg_fanjiangzhangda"], + simalang: ["re_simalang", "simalang"], + zhugedan: ["re_zhugedan", "zhugedan"], + zhangren: ["jsrg_zhangren", "zhangren"], + wenqin: ["ol_wenqin", "pe_wenqin"], + lukai: ["ol_lukai", "lukai"], + liupi: ["ol_liupi", "liupi"], }, - translate:{ - "xinfu_lingren":"凌人", - "xinfu_lingren_info":"每回合限一次。当你使用带有「伤害」标签的基本牌或普通锦囊牌指定目标后,你可以猜测其中的一个目标的手牌中是否有基本牌,锦囊牌或装备牌。若你猜中的项目数:≥1,此牌对该角色的伤害+1;≥2,你摸两张牌;≥3,你获得技能〖奸雄〗和〖行殇〗直到你的下回合开始。", - "lingren_adddamage":"凌人", - "lingren_adddamage_info":"", - "lingren_jianxiong":"奸雄", - "lingren_jianxiong_info":"当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", - "lingren_xingshang":"行殇", - "lingren_xingshang_info":"当有角色死亡后,你可以选择一项:1.回复1点体力。2.获得该角色的所有牌。", - "xinfu_fujian":"伏间", - "xinfu_fujian_info":"锁定技,结束阶段,你观看一名随机的其他角色的随机X张手牌。(X为场上手牌最少的角色的手牌数)", - fujian:'伏间', - fujian_info:'锁定技,准备阶段和结束阶段,你随机观看一名手牌数不为全场最多的其他角色的手牌。', - xinfu_xionghuo:'凶镬', - xinfu_xionghuo_info:'游戏开始时,你获得3个“暴戾”标记(标记上限为3)。出牌阶段,你可以交给一名其他角色一个“暴戾”标记。当你对有“暴戾”标记的其他角色造成伤害时,此伤害+1。有“暴戾”标记的其他角色的出牌阶段开始时,其移去所有“暴戾”标记并随机执行一项:1.受到1点火焰伤害且本回合不能对你使用【杀】;2.失去1点体力且本回合手牌上限-1;3.你随机获得其两张牌。', - xinfu_shajue:'杀绝', - xinfu_shajue_info:'锁定技,其他角色进入濒死状态时,你获得一个“暴戾”标记。然后若其体力值小于0,你获得使其进入濒死状态的牌。', - xinfu_jianjie:"荐杰", - jianjie:'荐杰', - jianjie_info:'①你的第一个准备阶段开始时,你令一名其他角色获得“龙印”,然后令另一名其他角色获得“凤印”。②出牌阶段限一次。若当前回合不是你的第一个回合,则你可以移动场上的“龙印”或“凤印”。③拥有“龙印”或“凤印”的其他角色死亡时,你转移该角色的“龙印”和“凤印”。④拥有“龙印”/“凤印”的角色视为拥有〖火计〗/〖连环〗,且同时拥有这两种标记的角色视为拥有〖业炎〗。', - jianjie_huoji:'火计', - jianjie_huoji_effect:'火计', - jianjie_huoji_info:'出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。', - jianjie_lianhuan:'连环', - jianjie_lianhuan_effect:'连环', - jianjie_lianhuan_info:'出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。', - jianjie_yeyan:'业炎', - jianjie_yeyan_info:'限定技。出牌阶段,你可以移去你所有的“龙印”和“凤印”,对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。', - xinfu_yinshi:"隐士", - xinfu_yinshi_info:"锁定技,若你没有“龙印”和“凤印”且防具栏为空,则当你受到属性伤害或锦囊牌造成的伤害时,防止此伤害。", - xinfu_chenghao:"称好", - xinfu_chenghao_info:"当一名角色受到属性伤害后,若其存活且其武将牌横置且是伤害传导的起点,则你可以观看牌堆顶的X张牌并分配给任意角色。(X为横置的角色数量且包含该角色)", - "jianjie_faq":"关于龙凤印", - "jianjie_faq_info":"龙印效果:视为拥有〖火计〗。凤印效果:视为拥有〖连环〗。(均一回合限使用三次) 龙凤印齐全:视为拥有〖业炎〗,〖业炎〗发动后移除龙凤印。", - "xinfu_wuniang":"武娘", - "xinfu_wuniang_info":"当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,该角色和场上所有的“关索”各摸一张牌。", - "xinfu_xushen":"许身", - "xinfu_xushen_info":"限定技,当一名男性角色使用【桃】令你脱离濒死状态时,若场上没有“关索”,则其可以将自己的一张武将牌变更为“关索”。然后你回复1点体力,并获得技能〖镇南〗。", - "xinfu_zhennan":"镇南", - "xinfu_zhennan_info":"当你成为【南蛮入侵】的目标时,你可以对一名其他角色造成1-3点随机伤害。", - "xinfu_falu":"法箓", - "xinfu_falu_info":"锁定技,游戏开始时,你获得「紫薇」「后土」「玉清」「勾陈」标记各一个。当你的牌因弃置而进入弃牌堆后,根据这些牌的花色,你获得对应的标记:黑桃,你获得1枚「紫薇」;梅花,你获得1枚「后土」;红桃,你获得1枚「玉清」;方块,你获得1枚「勾陈」。(每种标记限拥有1个)", - "xinfu_dianhua":"点化", - "xinfu_dianhua_info":"准备阶段或结束阶段,你可以观看牌堆顶的X张牌(X为你的「紫薇」「后土」「玉清」「勾陈」标记数的总和)。若如此做,你将这些牌以任意顺序放回牌堆顶或牌堆底。", - "xinfu_zhenyi":"真仪", - "xinfu_zhenyi_info":"你可以在以下时机弃置相应的标记来发动以下效果:一名角色的判定牌生效前,你可以弃置一枚「紫薇」,然后将判定结果改为任意花色且点数为5;你的回合外,你可以弃置一枚「后土」,然后将你的一张手牌当【桃】使用;当你造成伤害时,你可以弃置一枚「玉清」,然后令此伤害+1;当你受到伤害后,你可以弃置一张「勾陈」,然后你从牌堆中随机获得三种类型的牌各一张。", - "zhenyi_spade":"真仪", - "zhenyi_spade_info":"", - "zhenyi_club":"真仪", - "zhenyi_club_info":"", - "zhenyi_heart":"真仪", - "zhenyi_heart_info":"", - zhangren:'张任', - zoushi:'邹氏', - zangba:'臧霸', - gz_jiling:'纪灵', - gz_sp_dongzhuo:'董卓', - gz_zhangjiao:'张角', - litong:'李通', - mizhu:'糜竺', - buzhi:'步骘', - chenlin:'陈琳', - yuanshu:'SP袁术', - yuanshu_prefix:'SP', - gongsunzan:'公孙瓒', - sp_diaochan:'SP貂蝉', - sp_diaochan_prefix:'SP', - yangxiu:'杨修', - sp_zhaoyun:'SP赵云', - sp_zhaoyun_prefix:'SP', - caohong:'曹洪', - liuxie:'刘协', - xiahouba:'夏侯霸', - zhugejin:'诸葛瑾', - zhugeke:'诸葛恪', - guanyinping:'关银屏', - sunhao:'孙皓', - chengyu:'程昱', - simalang:'司马朗', - gz_tianfeng:'田丰', - sp_jiaxu:'SP贾诩', - sp_jiaxu_prefix:'SP', - maliang:'马良', - sp_caoren:'SP曹仁', - sp_caoren_prefix:'SP', - yuejin:'乐进', - mifuren:'糜夫人', - sp_dongzhuo:'SP董卓', - sp_dongzhuo_prefix:'SP', - gz_jiangfei:'蒋琬费祎', - gz_jiangqing:'蒋钦', - hetaihou:'何太后', - dingfeng:'丁奉', - zhangxingcai:'张星彩', - caoang:'曹昂', - gz_kongrong:'孔融', - fuwan:'伏完', - sp_pangde:'SP庞德', - sp_pangde_prefix:'SP', - sp_sunshangxiang:'SP孙尚香', - sp_sunshangxiang_prefix:'SP', - zhugedan:'诸葛诞', - sp_machao:'SP马超', - sp_machao_prefix:'SP', - sp_jiangwei:'SP姜维', - sp_jiangwei_prefix:'SP', - zhangbao:'张宝', - yangxiou:'杨修', - shixie:'士燮', - mayunlu:'马云騄', - zhanglu:'张鲁', - wutugu:'兀突骨', - gz_mateng:'马腾', - sp_caiwenji:'SP蔡琰', - sp_caiwenji_prefix:'SP', - zhugeguo:'诸葛果', - lingcao:'凌操', - lingju:'灵雎', - lifeng:'李丰', - jsp_guanyu:'SP关羽', - jsp_guanyu_prefix:'SP', - zhuling:'朱灵', - sunluyu:'OL孙鲁育', - sunluyu_prefix:'OL', - hanba:'旱魃', - gz_panfeng:'潘凤', - zumao:'祖茂', - daxiaoqiao:'大乔小乔', - cuiyan:'崔琰', - wenpin:'文聘', - jsp_huangyueying:'SP黄月英', - jsp_huangyueying_prefix:'SP', - guansuo:'关索', - tadun:'蹋顿', - yanbaihu:'严虎', - wanglang:'王朗', - caochun:'曹纯', - dongbai:'OL董白', - dongbai_prefix:'OL', - zhaoxiang:'赵襄', - heqi:'贺齐', - kanze:'OL阚泽', - kanze_prefix:'OL', - dongyun:'董允', - mazhong:'马忠', - huangfusong:'皇甫嵩', - wangyun:'王允', - sunqian:'孙乾', - xizhicai:'戏志才', - beimihu:'卑弥呼', - luzhi:'鲁芝', - bianfuren:'卞夫人', - ol_bianfuren:'卞夫人', - shamoke:'沙摩柯', + translate: { + xinfu_lingren: "凌人", + xinfu_lingren_info: + "每回合限一次。当你使用带有「伤害」标签的基本牌或普通锦囊牌指定目标后,你可以猜测其中的一个目标的手牌中是否有基本牌,锦囊牌或装备牌。若你猜中的项目数:≥1,此牌对该角色的伤害+1;≥2,你摸两张牌;≥3,你获得技能〖奸雄〗和〖行殇〗直到你的下回合开始。", + lingren_adddamage: "凌人", + lingren_adddamage_info: "", + lingren_jianxiong: "奸雄", + lingren_jianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", + lingren_xingshang: "行殇", + lingren_xingshang_info: "当有角色死亡后,你可以选择一项:1.回复1点体力。2.获得该角色的所有牌。", + xinfu_fujian: "伏间", + xinfu_fujian_info: + "锁定技,结束阶段,你观看一名随机的其他角色的随机X张手牌。(X为场上手牌最少的角色的手牌数)", + fujian: "伏间", + fujian_info: "锁定技,准备阶段和结束阶段,你随机观看一名手牌数不为全场最多的其他角色的手牌。", + xinfu_xionghuo: "凶镬", + xinfu_xionghuo_info: + "游戏开始时,你获得3个“暴戾”标记(标记上限为3)。出牌阶段,你可以交给一名其他角色一个“暴戾”标记。当你对有“暴戾”标记的其他角色造成伤害时,此伤害+1。有“暴戾”标记的其他角色的出牌阶段开始时,其移去所有“暴戾”标记并随机执行一项:1.受到1点火焰伤害且本回合不能对你使用【杀】;2.失去1点体力且本回合手牌上限-1;3.你随机获得其两张牌。", + xinfu_shajue: "杀绝", + xinfu_shajue_info: + "锁定技,其他角色进入濒死状态时,你获得一个“暴戾”标记。然后若其体力值小于0,你获得使其进入濒死状态的牌。", + xinfu_jianjie: "荐杰", + jianjie: "荐杰", + jianjie_info: + "①你的第一个准备阶段开始时,你令一名其他角色获得“龙印”,然后令另一名其他角色获得“凤印”。②出牌阶段限一次。若当前回合不是你的第一个回合,则你可以移动场上的“龙印”或“凤印”。③拥有“龙印”或“凤印”的其他角色死亡时,你转移该角色的“龙印”和“凤印”。④拥有“龙印”/“凤印”的角色视为拥有〖火计〗/〖连环〗,且同时拥有这两种标记的角色视为拥有〖业炎〗。", + jianjie_huoji: "火计", + jianjie_huoji_effect: "火计", + jianjie_huoji_info: + "出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。", + jianjie_lianhuan: "连环", + jianjie_lianhuan_effect: "连环", + jianjie_lianhuan_info: + "出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。", + jianjie_yeyan: "业炎", + jianjie_yeyan_info: + "限定技。出牌阶段,你可以移去你所有的“龙印”和“凤印”,对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。", + xinfu_yinshi: "隐士", + xinfu_yinshi_info: + "锁定技,若你没有“龙印”和“凤印”且防具栏为空,则当你受到属性伤害或锦囊牌造成的伤害时,防止此伤害。", + xinfu_chenghao: "称好", + xinfu_chenghao_info: + "当一名角色受到属性伤害后,若其存活且其武将牌横置且是伤害传导的起点,则你可以观看牌堆顶的X张牌并分配给任意角色。(X为横置的角色数量且包含该角色)", + jianjie_faq: "关于龙凤印", + jianjie_faq_info: + "龙印效果:视为拥有〖火计〗。凤印效果:视为拥有〖连环〗。(均一回合限使用三次) 龙凤印齐全:视为拥有〖业炎〗,〖业炎〗发动后移除龙凤印。", + xinfu_wuniang: "武娘", + xinfu_wuniang_info: + "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,该角色和场上所有的“关索”各摸一张牌。", + xinfu_xushen: "许身", + xinfu_xushen_info: + "限定技,当一名男性角色使用【桃】令你脱离濒死状态时,若场上没有“关索”,则其可以将自己的一张武将牌变更为“关索”。然后你回复1点体力,并获得技能〖镇南〗。", + xinfu_zhennan: "镇南", + xinfu_zhennan_info: "当你成为【南蛮入侵】的目标时,你可以对一名其他角色造成1-3点随机伤害。", + xinfu_falu: "法箓", + xinfu_falu_info: + "锁定技,游戏开始时,你获得「紫薇」「后土」「玉清」「勾陈」标记各一个。当你的牌因弃置而进入弃牌堆后,根据这些牌的花色,你获得对应的标记:黑桃,你获得1枚「紫薇」;梅花,你获得1枚「后土」;红桃,你获得1枚「玉清」;方块,你获得1枚「勾陈」。(每种标记限拥有1个)", + xinfu_dianhua: "点化", + xinfu_dianhua_info: + "准备阶段或结束阶段,你可以观看牌堆顶的X张牌(X为你的「紫薇」「后土」「玉清」「勾陈」标记数的总和)。若如此做,你将这些牌以任意顺序放回牌堆顶或牌堆底。", + xinfu_zhenyi: "真仪", + xinfu_zhenyi_info: + "你可以在以下时机弃置相应的标记来发动以下效果:一名角色的判定牌生效前,你可以弃置一枚「紫薇」,然后将判定结果改为任意花色且点数为5;你的回合外,你可以弃置一枚「后土」,然后将你的一张手牌当【桃】使用;当你造成伤害时,你可以弃置一枚「玉清」,然后令此伤害+1;当你受到伤害后,你可以弃置一张「勾陈」,然后你从牌堆中随机获得三种类型的牌各一张。", + zhenyi_spade: "真仪", + zhenyi_spade_info: "", + zhenyi_club: "真仪", + zhenyi_club_info: "", + zhenyi_heart: "真仪", + zhenyi_heart_info: "", + zhangren: "张任", + zoushi: "邹氏", + zangba: "臧霸", + gz_jiling: "纪灵", + gz_sp_dongzhuo: "董卓", + gz_zhangjiao: "张角", + litong: "李通", + mizhu: "糜竺", + buzhi: "步骘", + chenlin: "陈琳", + yuanshu: "SP袁术", + yuanshu_prefix: "SP", + gongsunzan: "公孙瓒", + sp_diaochan: "SP貂蝉", + sp_diaochan_prefix: "SP", + yangxiu: "杨修", + sp_zhaoyun: "SP赵云", + sp_zhaoyun_prefix: "SP", + caohong: "曹洪", + liuxie: "刘协", + xiahouba: "夏侯霸", + zhugejin: "诸葛瑾", + zhugeke: "诸葛恪", + guanyinping: "关银屏", + sunhao: "孙皓", + chengyu: "程昱", + simalang: "司马朗", + gz_tianfeng: "田丰", + sp_jiaxu: "SP贾诩", + sp_jiaxu_prefix: "SP", + maliang: "马良", + sp_caoren: "SP曹仁", + sp_caoren_prefix: "SP", + yuejin: "乐进", + mifuren: "糜夫人", + sp_dongzhuo: "SP董卓", + sp_dongzhuo_prefix: "SP", + gz_jiangfei: "蒋琬费祎", + gz_jiangqing: "蒋钦", + hetaihou: "何太后", + dingfeng: "丁奉", + zhangxingcai: "张星彩", + caoang: "曹昂", + gz_kongrong: "孔融", + fuwan: "伏完", + sp_pangde: "SP庞德", + sp_pangde_prefix: "SP", + sp_sunshangxiang: "SP孙尚香", + sp_sunshangxiang_prefix: "SP", + zhugedan: "诸葛诞", + sp_machao: "SP马超", + sp_machao_prefix: "SP", + sp_jiangwei: "SP姜维", + sp_jiangwei_prefix: "SP", + zhangbao: "张宝", + yangxiou: "杨修", + shixie: "士燮", + mayunlu: "马云騄", + zhanglu: "张鲁", + wutugu: "兀突骨", + gz_mateng: "马腾", + sp_caiwenji: "SP蔡琰", + sp_caiwenji_prefix: "SP", + zhugeguo: "诸葛果", + lingcao: "凌操", + lingju: "灵雎", + lifeng: "李丰", + jsp_guanyu: "SP关羽", + jsp_guanyu_prefix: "SP", + zhuling: "朱灵", + sunluyu: "OL孙鲁育", + sunluyu_prefix: "OL", + hanba: "旱魃", + gz_panfeng: "潘凤", + zumao: "祖茂", + daxiaoqiao: "大乔小乔", + cuiyan: "崔琰", + wenpin: "文聘", + jsp_huangyueying: "SP黄月英", + jsp_huangyueying_prefix: "SP", + guansuo: "关索", + tadun: "蹋顿", + yanbaihu: "严虎", + wanglang: "王朗", + caochun: "曹纯", + dongbai: "OL董白", + dongbai_prefix: "OL", + zhaoxiang: "赵襄", + heqi: "贺齐", + kanze: "OL阚泽", + kanze_prefix: "OL", + dongyun: "董允", + mazhong: "马忠", + huangfusong: "皇甫嵩", + wangyun: "王允", + sunqian: "孙乾", + xizhicai: "戏志才", + beimihu: "卑弥呼", + luzhi: "鲁芝", + bianfuren: "卞夫人", + ol_bianfuren: "卞夫人", + shamoke: "沙摩柯", - caoying:"曹婴", - simahui:"司马徽", - baosanniang:"鲍三娘", - majun:"马钧", - simazhao:"司马昭", - wangyuanji:"王元姬", + caoying: "曹婴", + simahui: "司马徽", + baosanniang: "鲍三娘", + majun: "马钧", + simazhao: "司马昭", + wangyuanji: "王元姬", - jianggan:"蒋干", - hejin:'何进', - hansui:'韩遂', - niujin:'牛金', - xujing:'OL许靖', - xujing_prefix:'OL', - yuantanyuanshang:'袁谭袁尚', + jianggan: "蒋干", + hejin: "何进", + hansui: "韩遂", + niujin: "牛金", + xujing: "OL许靖", + xujing_prefix: "OL", + yuantanyuanshang: "袁谭袁尚", - xinfenyue:'奋钺', - xinfenyue_info:'出牌阶段限X次(X为与你不同阵营的存活角色数),你可以与一名其他角色拼点,若你赢,根据你拼点牌的点数依次执行以下效果:不大于5,你获得其一张牌;不大于9,你获得牌堆里的一张【杀】; 不大于K,视为你对其使用一张雷【杀】。', - neifa:'内伐', - neifa_info:'出牌阶段开始时,你可以摸两张牌或获得场上的一张牌,然后弃置一张牌。若弃置的牌是基本牌,本回合你不能使用锦囊和装备牌,且【杀】的使用次数+X且目标+1;若弃置的不是基本牌,本回合你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标,前两次使用装备牌时摸X张牌(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5)。', - neifa_use:'内伐', - yuxu:'誉虚', - yuxu_info:'当你于出牌阶段内使用的牌结算结束后,若你此前于此阶段发动过〖誉虚〗的次数为:偶数,你可以摸一张牌;奇数,你弃置一张牌。', - yuxu2:'誉虚(弃牌)', - xjshijian:'实荐', - xjshijian_info:'一名其他角色于其回合内使用的第二张牌结算完成后,你可弃置一张牌并令其获得技能〖誉虚〗直到回合结束。', - mouzhu:'谋诛', - mouzhu_info:'出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若你的手牌数大于其,其选择视为对你使用一张【杀】或【决斗】。', - yanhuo:'延祸', - yanhuo_info:'当你死亡时,你可以依次弃置一名其他角色的X张牌。(X为你的牌数)', - niluan:'逆乱', - niluan_info:'其他角色的结束阶段开始时,若其本回合内使用过【杀】或其体力值大于你,则你可以将一张黑色牌当做【杀】使用。', - cuorui:'挫锐', - cuorui_info:'锁定技,游戏开始时,你摸X张牌(X为你的体力上限)。锁定技,限定技,判定阶段开始前,若你的判定区有牌,你跳过此阶段。', - cuorui_info_single:'锁定技,你的起始手牌数改为X+2(X为你剩余的备选武将数)。你跳过登场后的第一个判定阶段。', - liewei:'裂围', - liewei_info:'当你杀死一名角色后,你可以摸三张牌。', + xinfenyue: "奋钺", + xinfenyue_info: + "出牌阶段限X次(X为与你不同阵营的存活角色数),你可以与一名其他角色拼点,若你赢,根据你拼点牌的点数依次执行以下效果:不大于5,你获得其一张牌;不大于9,你获得牌堆里的一张【杀】; 不大于K,视为你对其使用一张雷【杀】。", + neifa: "内伐", + neifa_info: + "出牌阶段开始时,你可以摸两张牌或获得场上的一张牌,然后弃置一张牌。若弃置的牌是基本牌,本回合你不能使用锦囊和装备牌,且【杀】的使用次数+X且目标+1;若弃置的不是基本牌,本回合你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标,前两次使用装备牌时摸X张牌(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5)。", + neifa_use: "内伐", + yuxu: "誉虚", + yuxu_info: + "当你于出牌阶段内使用的牌结算结束后,若你此前于此阶段发动过〖誉虚〗的次数为:偶数,你可以摸一张牌;奇数,你弃置一张牌。", + yuxu2: "誉虚(弃牌)", + xjshijian: "实荐", + xjshijian_info: + "一名其他角色于其回合内使用的第二张牌结算完成后,你可弃置一张牌并令其获得技能〖誉虚〗直到回合结束。", + mouzhu: "谋诛", + mouzhu_info: + "出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若你的手牌数大于其,其选择视为对你使用一张【杀】或【决斗】。", + yanhuo: "延祸", + yanhuo_info: "当你死亡时,你可以依次弃置一名其他角色的X张牌。(X为你的牌数)", + niluan: "逆乱", + niluan_info: + "其他角色的结束阶段开始时,若其本回合内使用过【杀】或其体力值大于你,则你可以将一张黑色牌当做【杀】使用。", + cuorui: "挫锐", + cuorui_info: + "锁定技,游戏开始时,你摸X张牌(X为你的体力上限)。锁定技,限定技,判定阶段开始前,若你的判定区有牌,你跳过此阶段。", + cuorui_info_single: + "锁定技,你的起始手牌数改为X+2(X为你剩余的备选武将数)。你跳过登场后的第一个判定阶段。", + liewei: "裂围", + liewei_info: "当你杀死一名角色后,你可以摸三张牌。", - weicheng:'伪诚', - weicheng_info:'当牌从你的手牌区移动至其他角色的手牌区后,若你的手牌数小于体力值,你可以摸一张牌。', - daoshu:'盗书', - daoshu_info:'出牌阶段限一次。你可以选择一个花色并获得一名其他角色的一张手牌。若此牌花色与你选择的相同,则你对其造成1点伤害且你〖盗书〗于此阶段内可使用的次数上限+1。否则你须交给其一张与此牌花色不同的手牌(没有则展示手牌)。', + weicheng: "伪诚", + weicheng_info: + "当牌从你的手牌区移动至其他角色的手牌区后,若你的手牌数小于体力值,你可以摸一张牌。", + daoshu: "盗书", + daoshu_info: + "出牌阶段限一次。你可以选择一个花色并获得一名其他角色的一张手牌。若此牌花色与你选择的相同,则你对其造成1点伤害且你〖盗书〗于此阶段内可使用的次数上限+1。否则你须交给其一张与此牌花色不同的手牌(没有则展示手牌)。", - xinshanjia:"缮甲", - xinshanjia_info:"出牌阶段开始时,你可以摸三张牌,然后弃置3-X张牌(X为你本局游戏内不因使用而失去过的装备牌的数目且至多为3)。若你没有以此法弃置:基本牌,此阶段你使用【杀】的次数上限+1;锦囊牌,此阶段你使用牌无距离限制;基本牌或锦囊牌,你可以视为使用一张【杀】。", - "new_meibu":"魅步", - "new_meibu_info":"其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得技能〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", - "new_mumu":"穆穆", - "new_mumu_info":"出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌;2.获得一名角色装备区里的一张防具牌,若如此做,你本回合不能使用【杀】。", - new_zhixi:"止息", - new_zhixi_info:"锁定技。出牌阶段内,若你使用过锦囊牌或使用过的牌数不小于X,则你不能使用牌(X为你的体力值)。", - "new_mumu2":"穆穆", - "new_mumu2_info":"锁定技,你不能使用【杀】。", - new_xingwu:"星舞", - new_xingwu_info:"弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“舞”。然后你可以选择一项:①将三张“舞”置入弃牌堆;②弃置两张手牌并将武将牌翻面。若如此做,你选择一名角色,该角色弃置其装备区的所有牌并受到2点伤害(若为女性,则改为1点)。", - "new_luoyan":"落雁", - "new_luoyan_info":"锁定技。若你的武将牌上有“舞”,则你视为拥有技能〖天香〗和〖流离〗。", - "new_luoyan_tianxiang":"天香", - "new_luoyan_tianxiang_info":"", - "new_luoyan_liuli":"流离", - "new_luoyan_liuli_info":"", - ol_shichou:"誓仇", - ol_shichou_info:"当你使用【杀】时,你可以令至多X+1名角色也成为此【杀】的目标(X为你已损失的体力值)。", - dc_olshichou: '誓仇', - dc_olshichou_info: '当你使用【杀】时,你可以令至多X名角色也成为此【杀】的目标。此牌结算结束后,若你未因【杀】造成过伤害,则你获得此【杀】(X为你已损失的体力值)。', - "zhenwei_three":"镇卫", - "zhenwei_three_info":"锁定技,敌方角色至己方其他角色的距离+1。", - "huanshi_three":"缓释", - "huanshi_three_info":"一名友方角色的判定牌生效前,你可打出一张牌代替之。", + xinshanjia: "缮甲", + xinshanjia_info: + "出牌阶段开始时,你可以摸三张牌,然后弃置3-X张牌(X为你本局游戏内不因使用而失去过的装备牌的数目且至多为3)。若你没有以此法弃置:基本牌,此阶段你使用【杀】的次数上限+1;锦囊牌,此阶段你使用牌无距离限制;基本牌或锦囊牌,你可以视为使用一张【杀】。", + new_meibu: "魅步", + new_meibu_info: + "其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得技能〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。", + new_mumu: "穆穆", + new_mumu_info: + "出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌;2.获得一名角色装备区里的一张防具牌,若如此做,你本回合不能使用【杀】。", + new_zhixi: "止息", + new_zhixi_info: + "锁定技。出牌阶段内,若你使用过锦囊牌或使用过的牌数不小于X,则你不能使用牌(X为你的体力值)。", + new_mumu2: "穆穆", + new_mumu2_info: "锁定技,你不能使用【杀】。", + new_xingwu: "星舞", + new_xingwu_info: + "弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“舞”。然后你可以选择一项:①将三张“舞”置入弃牌堆;②弃置两张手牌并将武将牌翻面。若如此做,你选择一名角色,该角色弃置其装备区的所有牌并受到2点伤害(若为女性,则改为1点)。", + new_luoyan: "落雁", + new_luoyan_info: "锁定技。若你的武将牌上有“舞”,则你视为拥有技能〖天香〗和〖流离〗。", + new_luoyan_tianxiang: "天香", + new_luoyan_tianxiang_info: "", + new_luoyan_liuli: "流离", + new_luoyan_liuli_info: "", + ol_shichou: "誓仇", + ol_shichou_info: + "当你使用【杀】时,你可以令至多X+1名角色也成为此【杀】的目标(X为你已损失的体力值)。", + dc_olshichou: "誓仇", + dc_olshichou_info: + "当你使用【杀】时,你可以令至多X名角色也成为此【杀】的目标。此牌结算结束后,若你未因【杀】造成过伤害,则你获得此【杀】(X为你已损失的体力值)。", + zhenwei_three: "镇卫", + zhenwei_three_info: "锁定技,敌方角色至己方其他角色的距离+1。", + huanshi_three: "缓释", + huanshi_three_info: "一名友方角色的判定牌生效前,你可打出一张牌代替之。", - yizan:"翊赞", - yizan_info:"你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", - yizan0:"翊赞", - yizan0_info:"你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", - yizan1:"翊赞", - yizan1_info:"你可以将两张牌(其中至少一张是基本牌)当【闪】打出。", - yizan2:"翊赞", - yizan2_info:"你可以将一张基本牌当任意基本牌牌使用。", - yizan3:"翊赞", - yizan3_info:"你可以将一张基本牌当【闪】打出。", - yizan5:"翊赞", - yizan5_info:"你可以将两张牌(其中至少一张是基本牌)当【杀】打出。", - yizan6:"翊赞", - yizan6_info:"你可以将一张基本牌当【杀】打出。", - longyuan:"龙渊", - longyuan_info:"觉醒技 当你使用或打出基本牌时,若你已经已累计发动过3次〖翊赞〗,你将〖翊赞〗改为“你可以将一张基本牌当任意基本牌牌使用或打出”。", - wuniang:"武娘", - wuniang_info:"你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后该角色摸一张牌;若“关索”在场,你可令“关索”也摸一张牌。", - zhennan:"镇南", - zhennan_info:"当你成为【南蛮入侵】的目标时,你可令一名其他角色随机受到1至3点伤害。", - xushen:"许身", - xushen_info:"当其他男性角色令你脱离濒死状态时,若“关索”不在场,其可以选择是否用“关索”替换其武将牌,然后你回复1点体力并获得技能〖镇南〗。", + yizan: "翊赞", + yizan_info: "你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", + yizan0: "翊赞", + yizan0_info: "你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", + yizan1: "翊赞", + yizan1_info: "你可以将两张牌(其中至少一张是基本牌)当【闪】打出。", + yizan2: "翊赞", + yizan2_info: "你可以将一张基本牌当任意基本牌牌使用。", + yizan3: "翊赞", + yizan3_info: "你可以将一张基本牌当【闪】打出。", + yizan5: "翊赞", + yizan5_info: "你可以将两张牌(其中至少一张是基本牌)当【杀】打出。", + yizan6: "翊赞", + yizan6_info: "你可以将一张基本牌当【杀】打出。", + longyuan: "龙渊", + longyuan_info: + "觉醒技 当你使用或打出基本牌时,若你已经已累计发动过3次〖翊赞〗,你将〖翊赞〗改为“你可以将一张基本牌当任意基本牌牌使用或打出”。", + wuniang: "武娘", + wuniang_info: + "你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后该角色摸一张牌;若“关索”在场,你可令“关索”也摸一张牌。", + zhennan: "镇南", + zhennan_info: "当你成为【南蛮入侵】的目标时,你可令一名其他角色随机受到1至3点伤害。", + xushen: "许身", + xushen_info: + "当其他男性角色令你脱离濒死状态时,若“关索”不在场,其可以选择是否用“关索”替换其武将牌,然后你回复1点体力并获得技能〖镇南〗。", - wanwei:'挽危', - wanwei_info:'当你因被其他角色获得或弃置而失去牌时,你可以改为自己选择失去的牌。', - gzjili:'蒺藜', - gzjili_info:'当你于一回合内使用或打出第X张牌时,你可以摸X张牌(X为你的攻击范围)。', + wanwei: "挽危", + wanwei_info: "当你因被其他角色获得或弃置而失去牌时,你可以改为自己选择失去的牌。", + gzjili: "蒺藜", + gzjili_info: "当你于一回合内使用或打出第X张牌时,你可以摸X张牌(X为你的攻击范围)。", - qingzhong:'清忠', - qingzhong_info:'出牌阶段开始时,你可以摸两张牌,若如此做,此阶段结束时,你与手牌数最少的角色交换手牌。', - weijing:'卫境', - weijing_info:'每轮限一次,当你需要使用【杀】或【闪】时,你可以视为使用一张【杀】或【闪】。', - zishu:'自书', - zishu_info:'锁定技。①其他角色的回合结束时,你将手牌区里所有你于此回合得到过的牌置入弃牌堆。②当你于回合内不因〖自书②〗而得到牌后,你摸一张牌。', - yingyuan:'应援', - yingyuan_info:'当你于回合内使用的牌结算完成后,你可以将其交给一名其他角色(相同牌名的牌每回合限一次)。', - xinyingyuan:'应援', - xinyingyuan_info:'当你于回合内使用一张牌后,你可以令一名其他角色从牌堆获得一张与该牌类型相同的牌(每种类型的牌每回合限一次)。', - qianya:'谦雅', - qianya_info:'当你成为锦囊牌的目标后,你可以将任意张手牌交给一名其他角色。', - shuimeng:'说盟', - shuimeng_info:'出牌阶段结束时,你可以与一名角色拼点,若你赢,视为你使用【无中生有】;若你没赢,视为其对你使用【过河拆桥】。', - xianfu:'先辅', - xianfu2:'先辅', - xianfu2_bg:'辅', - xianfu_info:'锁定技,游戏开始时,你选择一名其他角色,当其受到伤害后,你受到等量的伤害,当其回复体力后,你回复等量的体力。', - chouce:'筹策', - chouce_info:'当你受到1点伤害后,你可以判定,若结果为:黑色,你弃置一名角色区域里的一张牌;红色,你选择一名角色,其摸一张牌,若其是〖先辅〗选择的角色,改为其摸两张牌。', - fuqi:'伏骑', - fuqi_info:'锁定技,当你使用牌时,你令所有与你距离为1的其他角色不能使用或打出牌响应此牌。', - jiaozi:'骄恣', - jiaozi_info:'锁定技,若你的手牌数为全场唯一最多,则当你造成或受到伤害时,此伤害+1。', - wy_meirenji:'美人计', - wy_meirenji_info:'出牌阶段,对一名有手牌的其他男性角色使用。每名女性角色各获得其一张手牌并将一张手牌交给你,然后比较你与其的手牌数,手牌少的角色对手牌多的角色造成1点伤害。', - wy_xiaolicangdao:'笑里藏刀', - wy_xiaolicangdao_info:'出牌阶段,对一名其他角色使用。该角色摸X张牌(X为其已损失的体力值且至多为5),然后你对其造成1点伤害。', - weikui:'伪溃', - weikui2:'伪溃', - weikui_info:'出牌阶段限一次,你可以失去1点体力并选择一名有手牌的其他角色,你观看其手牌:若其手牌中有【闪】,则视为你对其使用【杀】,且本回合你计算与其的距离视为1;若其手牌中没有【闪】,你弃置其中一张牌。', - lizhan:'励战', - lizhan_info:'结束阶段,你可以令任意名已受伤的角色摸一张牌。', - wylianji:'连计', - wylianji_info:'出牌阶段限一次,你可以展示一张【杀】或黑色锦囊牌,并令一名其他角色将牌堆中的随机一张武器牌置入装备区(可替换原装备)。然后该角色选择一项:1.对除你以外的角色使用该牌,并将装备区里的武器牌交给该牌的一个目标角色;2.令你对其使用此牌,然后获得此牌,并将装备区内的武器牌交给你。', + qingzhong: "清忠", + qingzhong_info: + "出牌阶段开始时,你可以摸两张牌,若如此做,此阶段结束时,你与手牌数最少的角色交换手牌。", + weijing: "卫境", + weijing_info: "每轮限一次,当你需要使用【杀】或【闪】时,你可以视为使用一张【杀】或【闪】。", + zishu: "自书", + zishu_info: + "锁定技。①其他角色的回合结束时,你将手牌区里所有你于此回合得到过的牌置入弃牌堆。②当你于回合内不因〖自书②〗而得到牌后,你摸一张牌。", + yingyuan: "应援", + yingyuan_info: + "当你于回合内使用的牌结算完成后,你可以将其交给一名其他角色(相同牌名的牌每回合限一次)。", + xinyingyuan: "应援", + xinyingyuan_info: + "当你于回合内使用一张牌后,你可以令一名其他角色从牌堆获得一张与该牌类型相同的牌(每种类型的牌每回合限一次)。", + qianya: "谦雅", + qianya_info: "当你成为锦囊牌的目标后,你可以将任意张手牌交给一名其他角色。", + shuimeng: "说盟", + shuimeng_info: + "出牌阶段结束时,你可以与一名角色拼点,若你赢,视为你使用【无中生有】;若你没赢,视为其对你使用【过河拆桥】。", + xianfu: "先辅", + xianfu2: "先辅", + xianfu2_bg: "辅", + xianfu_info: + "锁定技,游戏开始时,你选择一名其他角色,当其受到伤害后,你受到等量的伤害,当其回复体力后,你回复等量的体力。", + chouce: "筹策", + chouce_info: + "当你受到1点伤害后,你可以判定,若结果为:黑色,你弃置一名角色区域里的一张牌;红色,你选择一名角色,其摸一张牌,若其是〖先辅〗选择的角色,改为其摸两张牌。", + fuqi: "伏骑", + fuqi_info: "锁定技,当你使用牌时,你令所有与你距离为1的其他角色不能使用或打出牌响应此牌。", + jiaozi: "骄恣", + jiaozi_info: "锁定技,若你的手牌数为全场唯一最多,则当你造成或受到伤害时,此伤害+1。", + wy_meirenji: "美人计", + wy_meirenji_info: + "出牌阶段,对一名有手牌的其他男性角色使用。每名女性角色各获得其一张手牌并将一张手牌交给你,然后比较你与其的手牌数,手牌少的角色对手牌多的角色造成1点伤害。", + wy_xiaolicangdao: "笑里藏刀", + wy_xiaolicangdao_info: + "出牌阶段,对一名其他角色使用。该角色摸X张牌(X为其已损失的体力值且至多为5),然后你对其造成1点伤害。", + weikui: "伪溃", + weikui2: "伪溃", + weikui_info: + "出牌阶段限一次,你可以失去1点体力并选择一名有手牌的其他角色,你观看其手牌:若其手牌中有【闪】,则视为你对其使用【杀】,且本回合你计算与其的距离视为1;若其手牌中没有【闪】,你弃置其中一张牌。", + lizhan: "励战", + lizhan_info: "结束阶段,你可以令任意名已受伤的角色摸一张牌。", + wylianji: "连计", + wylianji_info: + "出牌阶段限一次,你可以展示一张【杀】或黑色锦囊牌,并令一名其他角色将牌堆中的随机一张武器牌置入装备区(可替换原装备)。然后该角色选择一项:1.对除你以外的角色使用该牌,并将装备区里的武器牌交给该牌的一个目标角色;2.令你对其使用此牌,然后获得此牌,并将装备区内的武器牌交给你。", // from here - moucheng:'谋逞', - moucheng_info:'觉醒技,当其他角色使用因〖连计〗交给其的牌累计造成伤害达到3点后,你失去技能〖连计〗,然后获得技能〖矜功〗。', - jingong:'矜功', - jingong2:'矜功', - jingong_backup:'矜功', - jingong_info:'出牌阶段限一次,你可以将一张装备牌或【杀】当做一张随机锦囊牌使用(三选一,其中一张为【美人计】或【笑里藏刀】),然后本回合的结束阶段,若你于本回合内未造成过伤害,你失去1点体力。', - fenyue:'奋钺', - fenyue2:'奋钺', - fenyue2_bg:'钺', - fenyue_info:'出牌阶段限X次,你可以与一名角色拼点,若你赢,你选择一项:1.令其不能使用或打出手牌直到回合结束;2.视为对其使用一张【杀】(不计入次数)。若你没赢,你结束出牌阶段。(X为存活的忠臣数)', + moucheng: "谋逞", + moucheng_info: + "觉醒技,当其他角色使用因〖连计〗交给其的牌累计造成伤害达到3点后,你失去技能〖连计〗,然后获得技能〖矜功〗。", + jingong: "矜功", + jingong2: "矜功", + jingong_backup: "矜功", + jingong_info: + "出牌阶段限一次,你可以将一张装备牌或【杀】当做一张随机锦囊牌使用(三选一,其中一张为【美人计】或【笑里藏刀】),然后本回合的结束阶段,若你于本回合内未造成过伤害,你失去1点体力。", + fenyue: "奋钺", + fenyue2: "奋钺", + fenyue2_bg: "钺", + fenyue_info: + "出牌阶段限X次,你可以与一名角色拼点,若你赢,你选择一项:1.令其不能使用或打出手牌直到回合结束;2.视为对其使用一张【杀】(不计入次数)。若你没赢,你结束出牌阶段。(X为存活的忠臣数)", - zfengshi:'锋矢', - zfengshi_info:'当你使用【杀】指定目标后,你可以令目标弃置装备区内的一张牌。', - chuanxin:'穿心', - chuanxin_info:'当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.随机移除主武将牌上的一个技能。', - chuanxin_info_guozhan:'当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,若其与你势力不同且有副将,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.移除副将。', - hengjiang:'横江', - hengjiang2:'横江', - hengjiang_info:'当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内没有弃牌,则你摸一张牌。', - rehengjiang:'横江', - rehengjiang2:'横江', - rehengjiang3:'横江', - rehengjiang_info:'当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内有/没有弃牌,则你摸一/X张牌(X为你本回合内对其发动过〖横江〗的次数)。', - shuangren:'双刃', - shuangren_info:'出牌阶段开始时,你可以与一名角色拼点。若你赢,你视为对其或与其势力相同的另一名角色使用一张【杀】(不计入出牌阶段的次数限制);若你没赢,你本回合内不能对其他角色使用牌。', - xiashu:'下书', - xiashu_info:'出牌阶段开始时,你可以将所有手牌交给一名其他角色,然后该角色亮出任意数量的手牌(至少一张)。你选择一项:1.获得其亮出的手牌;2.获得其未亮出的手牌。', - kuanshi:'宽释', - kuanshi2:'宽释', - kuanshi_info:'结束阶段,你可以选择一名角色。直到你的下回合开始,该角色第一次受到大于1的伤害时,防止此伤害,然后你跳过下个回合的摸牌阶段。', - bingzheng:'秉正', - bingzheng_info:'出牌阶段结束时,你可以令手牌数不等于体力值的一名角色弃置一张手牌或摸一张牌。然后若其手牌数等于体力值,你摸一张牌,且可以交给该角色一张牌。', - sheyan:'舍宴', - sheyan_info:'当你成为普通锦囊牌的目标时(【借刀杀人】等带有指向目标的锦囊除外),你可以为此牌增加一个目标或令其对其中一个目标无效。(有效目标数至少为一)', - fuman:'抚蛮', - fuman2:'抚蛮', - fuman_info:'出牌阶段每名角色限一次,你可以将一张手牌交给一名其他角色并标记为“抚蛮”且“抚蛮”牌的牌名视为【杀】。然后当一名角色使用“抚蛮”牌结算结束后,你摸一张牌。若此牌造成过伤害,则改为摸两张牌。', - qizhou:'绮胄', - qizhou_info:'锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖马术〗;2种或以上:〖英姿〗;3种或以上:〖短兵〗;4种:〖奋威〗。', - shanxi:'闪袭', - shanxi_info:'出牌阶段限一次,你可以弃置一张红色基本牌,然后弃置攻击范围内的一名其他角色的一张牌。若弃置的牌是【闪】,你观看其手牌,若弃置的不是【闪】,其观看你的手牌。', - duanbing:'短兵', - duanbing_info:'当你使用【杀】选择目标后,你可以令一名距离为1的其他角色也成为此牌的目标。', - fanghun:'芳魂', - fanghun_info:'当你使用【杀】造成伤害或受到【杀】的伤害后,你获得X个“梅影”标记(X为伤害点数);你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。', - refanghun:'芳魂', - refanghun_info:'当你使用【杀】或成为【杀】的目标后,你获得1个“梅影”标记;你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。', - fanghun_sha:'龙胆', - fuhan:'扶汉', - fuhan_info:'限定技,回合开始时,你可以移去所有“梅影”标记并摸等量的牌,随机观看五名未登场的蜀势力角色,将武将牌替换为其中一名角色,并将体力上限数调整为本局游戏中移去“梅影”标记的数量(至少为2,至多为8),然后回复1点体力。', - refuhan:'扶汉', - refuhan_info:'限定技,回合开始时,你可以移去所有"梅影"标记并摸等量的牌,然后从X张蜀势力武将牌中选择并获得至多两个技能(限定技、觉醒技、隐匿技、使命技、主公技除外)。若此时你是体力值最低的角色,你回复1点体力(X为场上角色数,且X∈[4,+∞))。', - yjixi:'觊玺', - yjixi_info:'觉醒技,结束阶段,若你已连续三个自己回合未失去过体力,则你增加1点体力上限并回复1点体力,然后选择一项:获得技能〖妄尊〗;摸两张牌并获得当前主公的主公技。', - xinyongsi:'庸肆', - xinyongsi1:'庸肆', - xinyongsi2:'庸肆', - xinyongsi_info:'锁定技,摸牌阶段,你令额定摸牌数改为X(X为势力数);弃牌阶段开始时,你选择一项:1.弃置一张牌;2.失去1点体力。', - xiehui:'黠慧', - xiehui2:'黠慧', - xiehui_info:'锁定技,你的黑色牌不计入手牌上限;其他角色获得你的黑色牌时,其不能使用、打出、弃置这些牌直到其体力值扣减为止。', - lianzhu:'连诛', - lianzhu_info:'出牌阶段限一次,你可以展示并交给一名其他角色一张牌,若此牌为黑色,其选择一项:1.你摸两张牌;2.弃置两张牌。', - shanjia:'缮甲', - shanjia_info:'出牌阶段开始时,你可以摸X张牌,然后弃置等量的牌。若你以此法弃置了装备区内的牌,则你可以视为使用一张【杀】。(X为你于本局游戏内使用过的装备牌数且最大为7)', - tuifeng:'推锋', - tuifeng2:'推锋', - tuifeng_info:'1.当你受到伤害后,你可以将至多X张牌置于武将牌上(X为伤害值),称为“锋”。2.准备阶段开始时,若你的武将牌上有“锋”,你移去所有“锋”,摸2X张牌,然后你于此回合的出牌阶段内使用【杀】的次数上限+X。(X为你此次移去的“锋”数)', - ziyuan:'资援', - ziyuan_info:'出牌阶段限一次,你可以将任意张点数之和为13的手牌交给一名其他角色,然后该角色回复1点体力。', - jugu:'巨贾', - jugu_info:'锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。', - hongde:'弘德', - hongde_info:'当你一次获得或失去至少两张牌后,你可以令一名其他角色摸一张牌。', - dingpan:'定叛', - dingpan_info_identity:'出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的反贼数)', - dingpan_info_doudizhu:'出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的农民数)', - dingpan_info_versus_two:'出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的最大阵营角色数)', - dingpan_info_versus:'出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的敌方角色数)', - dingpan_info:'出牌阶段限一次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。', - weidi:'伪帝', - weidi_info:'锁定技,你视为拥有当前主公的主公技。', - juesi:'决死', - juesi_info:'出牌阶段,你可以弃置一张【杀】并选择攻击范围内的一名有牌的其他角色,该角色弃置一张牌,然后若弃置的牌不是【杀】且你的体力值不大于该角色,你视为对其使用【决斗】。', - zhenlue:'缜略', - zhenlue_info:'锁定技,你使用的普通锦囊牌不能被【无懈可击】响应;你不能成为延时锦囊牌的目标。', - jianshu:'间书', - jianshu_info:'限定技,出牌阶段,你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,然后令这两名角色拼点。赢的角色弃置两张牌,没赢的角色失去1点体力。', - yongdi:'拥嫡', - yongdi_info:'限定技,准备阶段开始时,你可令一名其他男性角色增加1点体力上限并回复1点体力,然后若该角色的武将牌上有主公技且其不为主公,其获得此主公技。', - regushe:'鼓舌', - regushe_info:'出牌阶段,若X小于7,则你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。(X为你的“饶舌”标记数与本回合因“鼓舌”拼点而胜利的次数之和)', - rejici:'激词', - rejici2:'激词', - rejici_info:'锁定技。①当你的拼点牌亮出后,若此牌的点数不大于X,则你令此牌点数+X,并获得此次拼点中点数最大的拼点牌。②当你死亡时,你令杀死你的角色弃置7-X张牌并失去1点体力(X为你的“饶舌”标记数)。', - gushe:'鼓舌', - gushe_bg:'舌', - gushe_info:'出牌阶段限一次,你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。', - jici:'激词', - jici_info:'当你因发动〖鼓舌〗而扣置的拼点牌亮出后,若点数小于X,你可令点数+X;若点数等于X,你可令你本回合发动〖鼓舌〗的次数上限+1。(X为你“饶舌”标记的数量)', - shefu:'设伏', - shefu2:'设伏', - shefu_bg:'伏', - shefu_info:'结束阶段开始时,你可以将一张牌移出游戏,称为「伏兵」。并为「伏兵」记录一个基本牌或锦囊牌的名称(须与其他「伏兵」记录的名称均不同)。你的回合外,当有其他角色使用与你记录的「伏兵」牌名相同的手牌时,你可以取消此牌的所有目标,然后移去该「伏兵」。若此时处于使用者的回合内,则你令使用者当前的所有非Charlotte技失效直至回合结束。', - benyu:'贲育', - benyu2:'贲育', - benyu_info:'当你受到伤害后,你可选择:①将手牌摸至与伤害来源手牌数相同(至多摸至5张);②弃置大于伤害来源手牌数的牌,然后对其造成1点伤害。', - zhidao:'雉盗', - zhidao_info:'锁定技,当你于你的回合内第一次对区域里有牌的其他角色造成伤害后,你获得其手牌、装备区和判定区里的各一张牌,然后直到回合结束,其他角色不能被选择为你使用牌的目标。', - jili:'寄篱', - jili_info:'锁定技,当一名其他角色成为红色基本牌或红色普通锦囊牌的目标时,若其与你的距离为1且你既不是此牌的使用者也不是目标,你也成为此牌的目标。', - luanzhan:'乱战', - luanzhan_info:'你使用【杀】或黑色普通锦囊牌可以额外选择X名角色为目标;当你使用【杀】或黑色普通锦囊牌指定目标后,若此牌的目标角色数小于X,则X减至0。(X为你于本局游戏内造成过伤害的次数)', - zhengnan:'征南', - zhengnan_info:'其他角色死亡后,你可以摸三张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗。', - xinzhengnan:'征南', - xinzhengnan_info:'当一名角色进入濒死状态时,若你未因其发动过〖征南〗,则你回复1点体力并摸一张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗(若技能全部拥有则改为摸三张牌。你以此法获得的〖当先〗结算时视为已发动过〖伏枥〗)。', - xiefang:'撷芳', - xiefang_info:'锁定技,你计算与其他角色的距离时-X。(X为女性角色数)', - qizhi:'奇制', - qizhi_info:'当你于回合内使用基本牌或锦囊牌指定目标后,你可以弃置不是此牌目标的一名角色的一张牌。若如此做,其摸一张牌。', - jinqu:'进趋', - jinqu_info:'结束阶段开始时,你可以摸两张牌,若如此做,你将手牌弃置至X张。(X为你于此回合发动过〖奇制〗的次数)', - jiqiao:'机巧', - jiqiao_info:'出牌阶段开始时,你可以弃置任意张装备牌,然后亮出牌堆顶两倍数量的牌并获得其中的非装备牌。', - linglong:'玲珑', - linglong_info:'锁定技,若你的装备区没有武器牌,则你使用【杀】的次数上限+1;若你的装备区没有防具牌,视为你装备着【八卦阵】;若你的装备区没有坐骑牌,你的手牌上限+1;若你的装备区没有宝物牌,则你视为拥有技能〖奇才〗。', - zhenwei:'镇卫', - zhenwei2:'镇卫', - zhenwei_info:'当一名其他角色成为【杀】或黑色锦囊牌的目标时(使用者不是你),若该角色的体力值小于你且此牌的目标角色数为1,你可以弃置一张牌。若如此做,你选择一项:1、摸一张牌,然后将此【杀】或黑色锦囊牌转移给你;2、令此【杀】或黑色锦囊牌无效,然后将此【杀】或黑色锦囊牌置于使用者的武将牌旁,若如此做,当前回合结束后,使用者获得使用者武将牌旁的这些牌。', - xingwu:'星舞', - xingwu_info:'弃牌阶段开始时,你可以将一张与你本回合使用的牌颜色均不同的手牌置于武将牌上:若你有至少三张“星舞”牌,你移去“星舞”牌并选择一名男性角色,该角色受到2点伤害并弃置其装备区的所有牌。', - luoyan:'落雁', - luoyan_info:'锁定技。若你的武将牌上有“星舞牌”,你拥有“天香”和“流离”。', - yinbing:'引兵', - yinbing_info:'结束阶段开始时,你可以将至少一张非基本牌置于武将牌上。每当你受到【杀】或【决斗】的伤害后,你移去一张「引兵」牌。', - juedi:'绝地', - juedi_info:'锁定技,准备阶段,若你的武将牌上有「引兵」牌,你选择一项:1.移去「引兵」牌,将手牌补至体力上限数;2.将「引兵」牌交给一名体力值不大于你的其他角色,其回复1点体力并摸等量的牌。', - kuangfu:'狂斧', - kuangfu_info:'当你使用【杀】造成伤害后,你可以选择一项:弃置其装备区内的一张牌,或将其装备区内的一张牌移动到你的装备区内。', - xintan:'心惔', - xintan_info:'出牌阶段限一次,你可以移去两张「焚」并选择一名角色,该角色失去1点体力。', - fentian:'焚天', - fentian_info:'锁定技,结束阶段开始时,若你的手牌数少于体力值,你须选择一名攻击范围内的角色,将其一张牌置于你的武将牌上,称为「焚」。锁定技,你的攻击范围+X(X为「焚」的数量)。', - zhiri:'炙日', - zhiri_info:'觉醒技,准备阶段开始时,若你的「焚」的数量不小于3,你减1点体力上限,然后获得技能〖心惔〗。', - meibu:'魅步', - meibu_info:'其他角色的出牌阶段开始时,若你不在其攻击范围内,你可以令该角色的锦囊牌均视为【杀】,直到该角色以此法使用了一张【杀】或回合结束。若如此做,则直到回合结束,视为你在其攻击范围内。', - mumu:'穆穆', - mumu_info:'出牌阶段限一次,你可以弃置一张【杀】或黑色锦囊牌,然后选择一项:弃置场上的一张武器牌,然后摸一张牌;或将场上的一张防具牌移动到你的装备区里(可替换原防具)。', - zhanyi:'战意', - zhanyi_basic_sha:'战杀', - zhanyi_basic_jiu:'战酒', - zhanyi_basic_tao:'战桃', - zhanyi_info:'出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作【杀】、【酒】或【桃】使用;锦囊牌,摸两张牌且你使用的牌无距离限制;装备牌,你使用【杀】指定目标角色后,其弃置两张牌。', - nuzhan:'怒斩', - nuzhan2:'怒斩', - nuzhan_info:'锁定技,你使用的由一张锦囊牌转化的【杀】不计入出牌阶段的次数限制;锁定技,你使用的由一张装备牌转化的【杀】的伤害值基数+1。', - danji:'单骑', - danji_info:'觉醒技,准备阶段开始时,若你的手牌数大于你的体力值且本局游戏的主公不为刘备,你减1点体力上限,然后获得〖马术〗和〖怒斩〗。', - jieyuan:'竭缘', - jieyuan_more:'竭缘', - jieyuan_less:'竭缘', - jieyuan_info:'当你对一名其他角色造成伤害时,若其体力值大于或等于你的体力值,你可弃置一张黑色手牌,令此伤害+1;当你受到一名其他角色造成的伤害时,若其体力值大于或等于你的体力值,你可弃置一张红色手牌,令此伤害-1。', - fenxin:'焚心', - fenxin_info:'锁定技,一名其他角色死亡后,若其身份为:忠臣,你本局内发动〖竭缘〗减少伤害时无视体力值限制;反贼,你本局内发动〖竭缘〗增加伤害时无视体力值限制;内奸,你本局内选择发动〖竭缘〗的牌时无颜色和区域限制。', - fenxin_info_versus:'锁定技,一名其他角色首次受到伤害后,你选择本局游戏未选择过的一项:1.发动〖竭缘〗减少伤害时无视体力值限制;2.发动〖竭缘〗增加伤害时无视体力值限制;3.发动〖竭缘〗选择的牌时无颜色和区域限制。', - qingyi:'轻逸', - qingyi1:'轻逸', - qingyi2:'轻逸', - qingyi_info:'你可以跳过判定阶段和摸牌阶段。若如此做,视为对一名角色使用了一张无距离限制的【杀】。', - xiandeng:'先登', - xiandeng_info:'锁定技,出牌阶段,你使用的第一张【杀】不计入次数且无距离限制。', - shulv:'熟虑', - shulv_info:'出牌阶段限一次,若你的手牌数大于体力值,则你可以弃置一张牌并摸一张牌。', - xisheng:'牺牲', - xisheng_info:'每名其他角色的回合限一次,你可以将两张牌当做【桃】使用。', - yuhua:'羽化', - yuhua_info:'锁定技。①你的非基本牌不计入手牌上限。②准备阶段和结束阶段开始时,你卜算1。', - qirang:'祈禳', - qirang_info:'当有装备牌进入你的装备区时,你可获得牌堆中的一张锦囊牌。若此牌为:普通锦囊牌,则当你使用此“祈禳”牌选择唯一目标后,可为此牌增加一个目标;延时锦囊牌,则你下回合发动〖羽化〗时的卜算量+1(至多为5)。', - biluan:'避乱', - biluan_info:'摸牌阶段开始时,若有与你距离不大于1的其他角色,你可以放弃摸牌。若如此做,本局内其他角色计算与你的距离时+X。(X为势力数)', - lixia:'礼下', - lixia_info:'锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸一张牌。本局内其他角色计算与你的距离时-1。', - olbiluan: '避乱', - olbiluan_info: '结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上的势力数)', - relixia:'礼下', - relixia_info:'锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你选择一至两项:1.摸一张牌;2.其摸两张牌;3.其回复1点体力。本局内其他角色计算与你的距离时-X(X为你选择的选项数)。', - rebiluan:'避乱', - rebiluan2:'避乱', - rebiluan_info:'结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上角色数且至多为4)', - ollixia: '礼下', - ollixia_info: '锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸两张牌。本局内其他角色计算与你的距离时-1。', - yishe:'义舍', - yishe_bg:'米', - yishe_info:'结束阶段开始时,若你的武将牌上没有「米」,则你可以摸两张牌。若如此做,你将两张牌置于武将牌上,称为「米」;当有「米」移至其他区域后,若你的武将牌上没有「米」,则你回复1点体力。', - bushi:'布施', - midao:'米道', - bushi_info:'当你受到1点伤害后,或其他角色受到你造成的1点伤害后,受到伤害的角色可以获得你的一张「米」。', - midao_info:'一名角色的判定牌生效前,你可以打出一张「米」代替之。', - fengpo:'凤魄', - fengpo_info:'每种牌名各限一次。当你每回合使用的第一张【杀】或【决斗】指定目标后,若目标角色数为1,你可以选择一项:1.摸X张牌,令此牌的伤害值基数+1;2.摸一张牌,令此牌的伤害值基数+X(X为其♦牌的数量)。', - chenqing:'陈情', - chenqing_info:'每轮限一次,当一名角色处于濒死状态时,你可以令另一名其他角色摸四张牌,然后其弃置四张牌。若其以此法弃置的四张牌花色各不相同,则视为该角色对濒死的角色使用一张【桃】。', - mozhi:'默识', - mozhi_info:'结束阶段开始时,你可以将一张手牌当作你本回合出牌阶段内使用的第一张基本或普通锦囊牌使用。然后,你可以将一张手牌当做你本回合出牌阶段内使用的第二张基本或普通锦囊牌使用。(你不能通过此技能使用【酒】)', - ranshang:'燃殇', - ranshang2:'燃殇', - ranshang_info:'锁定技,当你受到1点火焰伤害后,你获得1枚“燃”标记;结束阶段开始时,你失去X点体力。若X大于2,则你减2点体力上限并摸两张牌。(X为“燃”标记的数量)', - hanyong:'悍勇', - hanyong_info:'当你使用【南蛮入侵】或【万箭齐发】或黑桃普通【杀】时,若你已受伤,则你可以令此牌的伤害值基数+1。然后若你的体力值不小于游戏轮数,则你获得一枚“燃”标记。', + zfengshi: "锋矢", + zfengshi_info: "当你使用【杀】指定目标后,你可以令目标弃置装备区内的一张牌。", + chuanxin: "穿心", + chuanxin_info: + "当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.随机移除主武将牌上的一个技能。", + chuanxin_info_guozhan: + "当你于出牌阶段内使用【杀】或【决斗】对目标角色造成伤害时,若其与你势力不同且有副将,你可以防止此伤害。若如此做,该角色选择一项:1.弃置装备区里的所有牌,若如此做,其失去1点体力;2.移除副将。", + hengjiang: "横江", + hengjiang2: "横江", + hengjiang_info: + "当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内没有弃牌,则你摸一张牌。", + rehengjiang: "横江", + rehengjiang2: "横江", + rehengjiang3: "横江", + rehengjiang_info: + "当你受到1点伤害后,你可以令当前回合角色本回合的手牌上限-1。然后若其弃牌阶段内有/没有弃牌,则你摸一/X张牌(X为你本回合内对其发动过〖横江〗的次数)。", + shuangren: "双刃", + shuangren_info: + "出牌阶段开始时,你可以与一名角色拼点。若你赢,你视为对其或与其势力相同的另一名角色使用一张【杀】(不计入出牌阶段的次数限制);若你没赢,你本回合内不能对其他角色使用牌。", + xiashu: "下书", + xiashu_info: + "出牌阶段开始时,你可以将所有手牌交给一名其他角色,然后该角色亮出任意数量的手牌(至少一张)。你选择一项:1.获得其亮出的手牌;2.获得其未亮出的手牌。", + kuanshi: "宽释", + kuanshi2: "宽释", + kuanshi_info: + "结束阶段,你可以选择一名角色。直到你的下回合开始,该角色第一次受到大于1的伤害时,防止此伤害,然后你跳过下个回合的摸牌阶段。", + bingzheng: "秉正", + bingzheng_info: + "出牌阶段结束时,你可以令手牌数不等于体力值的一名角色弃置一张手牌或摸一张牌。然后若其手牌数等于体力值,你摸一张牌,且可以交给该角色一张牌。", + sheyan: "舍宴", + sheyan_info: + "当你成为普通锦囊牌的目标时(【借刀杀人】等带有指向目标的锦囊除外),你可以为此牌增加一个目标或令其对其中一个目标无效。(有效目标数至少为一)", + fuman: "抚蛮", + fuman2: "抚蛮", + fuman_info: + "出牌阶段每名角色限一次,你可以将一张手牌交给一名其他角色并标记为“抚蛮”且“抚蛮”牌的牌名视为【杀】。然后当一名角色使用“抚蛮”牌结算结束后,你摸一张牌。若此牌造成过伤害,则改为摸两张牌。", + qizhou: "绮胄", + qizhou_info: + "锁定技,你根据装备区里牌的花色数获得以下技能:1种或以上:〖马术〗;2种或以上:〖英姿〗;3种或以上:〖短兵〗;4种:〖奋威〗。", + shanxi: "闪袭", + shanxi_info: + "出牌阶段限一次,你可以弃置一张红色基本牌,然后弃置攻击范围内的一名其他角色的一张牌。若弃置的牌是【闪】,你观看其手牌,若弃置的不是【闪】,其观看你的手牌。", + duanbing: "短兵", + duanbing_info: "当你使用【杀】选择目标后,你可以令一名距离为1的其他角色也成为此牌的目标。", + fanghun: "芳魂", + fanghun_info: + "当你使用【杀】造成伤害或受到【杀】的伤害后,你获得X个“梅影”标记(X为伤害点数);你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。", + refanghun: "芳魂", + refanghun_info: + "当你使用【杀】或成为【杀】的目标后,你获得1个“梅影”标记;你可以移去1个“梅影”标记来发动〖龙胆〗并摸一张牌。", + fanghun_sha: "龙胆", + fuhan: "扶汉", + fuhan_info: + "限定技,回合开始时,你可以移去所有“梅影”标记并摸等量的牌,随机观看五名未登场的蜀势力角色,将武将牌替换为其中一名角色,并将体力上限数调整为本局游戏中移去“梅影”标记的数量(至少为2,至多为8),然后回复1点体力。", + refuhan: "扶汉", + refuhan_info: + '限定技,回合开始时,你可以移去所有"梅影"标记并摸等量的牌,然后从X张蜀势力武将牌中选择并获得至多两个技能(限定技、觉醒技、隐匿技、使命技、主公技除外)。若此时你是体力值最低的角色,你回复1点体力(X为场上角色数,且X∈[4,+∞))。', + yjixi: "觊玺", + yjixi_info: + "觉醒技,结束阶段,若你已连续三个自己回合未失去过体力,则你增加1点体力上限并回复1点体力,然后选择一项:获得技能〖妄尊〗;摸两张牌并获得当前主公的主公技。", + xinyongsi: "庸肆", + xinyongsi1: "庸肆", + xinyongsi2: "庸肆", + xinyongsi_info: + "锁定技,摸牌阶段,你令额定摸牌数改为X(X为势力数);弃牌阶段开始时,你选择一项:1.弃置一张牌;2.失去1点体力。", + xiehui: "黠慧", + xiehui2: "黠慧", + xiehui_info: + "锁定技,你的黑色牌不计入手牌上限;其他角色获得你的黑色牌时,其不能使用、打出、弃置这些牌直到其体力值扣减为止。", + lianzhu: "连诛", + lianzhu_info: + "出牌阶段限一次,你可以展示并交给一名其他角色一张牌,若此牌为黑色,其选择一项:1.你摸两张牌;2.弃置两张牌。", + shanjia: "缮甲", + shanjia_info: + "出牌阶段开始时,你可以摸X张牌,然后弃置等量的牌。若你以此法弃置了装备区内的牌,则你可以视为使用一张【杀】。(X为你于本局游戏内使用过的装备牌数且最大为7)", + tuifeng: "推锋", + tuifeng2: "推锋", + tuifeng_info: + "1.当你受到伤害后,你可以将至多X张牌置于武将牌上(X为伤害值),称为“锋”。2.准备阶段开始时,若你的武将牌上有“锋”,你移去所有“锋”,摸2X张牌,然后你于此回合的出牌阶段内使用【杀】的次数上限+X。(X为你此次移去的“锋”数)", + ziyuan: "资援", + ziyuan_info: + "出牌阶段限一次,你可以将任意张点数之和为13的手牌交给一名其他角色,然后该角色回复1点体力。", + jugu: "巨贾", + jugu_info: "锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。", + hongde: "弘德", + hongde_info: "当你一次获得或失去至少两张牌后,你可以令一名其他角色摸一张牌。", + dingpan: "定叛", + dingpan_info_identity: + "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的反贼数)", + dingpan_info_doudizhu: + "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的农民数)", + dingpan_info_versus_two: + "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的最大阵营角色数)", + dingpan_info_versus: + "出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的敌方角色数)", + dingpan_info: + "出牌阶段限一次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。", + weidi: "伪帝", + weidi_info: "锁定技,你视为拥有当前主公的主公技。", + juesi: "决死", + juesi_info: + "出牌阶段,你可以弃置一张【杀】并选择攻击范围内的一名有牌的其他角色,该角色弃置一张牌,然后若弃置的牌不是【杀】且你的体力值不大于该角色,你视为对其使用【决斗】。", + zhenlue: "缜略", + zhenlue_info: "锁定技,你使用的普通锦囊牌不能被【无懈可击】响应;你不能成为延时锦囊牌的目标。", + jianshu: "间书", + jianshu_info: + "限定技,出牌阶段,你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,然后令这两名角色拼点。赢的角色弃置两张牌,没赢的角色失去1点体力。", + yongdi: "拥嫡", + yongdi_info: + "限定技,准备阶段开始时,你可令一名其他男性角色增加1点体力上限并回复1点体力,然后若该角色的武将牌上有主公技且其不为主公,其获得此主公技。", + regushe: "鼓舌", + regushe_info: + "出牌阶段,若X小于7,则你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。(X为你的“饶舌”标记数与本回合因“鼓舌”拼点而胜利的次数之和)", + rejici: "激词", + rejici2: "激词", + rejici_info: + "锁定技。①当你的拼点牌亮出后,若此牌的点数不大于X,则你令此牌点数+X,并获得此次拼点中点数最大的拼点牌。②当你死亡时,你令杀死你的角色弃置7-X张牌并失去1点体力(X为你的“饶舌”标记数)。", + gushe: "鼓舌", + gushe_bg: "舌", + gushe_info: + "出牌阶段限一次,你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。", + jici: "激词", + jici_info: + "当你因发动〖鼓舌〗而扣置的拼点牌亮出后,若点数小于X,你可令点数+X;若点数等于X,你可令你本回合发动〖鼓舌〗的次数上限+1。(X为你“饶舌”标记的数量)", + shefu: "设伏", + shefu2: "设伏", + shefu_bg: "伏", + shefu_info: + "结束阶段开始时,你可以将一张牌移出游戏,称为「伏兵」。并为「伏兵」记录一个基本牌或锦囊牌的名称(须与其他「伏兵」记录的名称均不同)。你的回合外,当有其他角色使用与你记录的「伏兵」牌名相同的手牌时,你可以取消此牌的所有目标,然后移去该「伏兵」。若此时处于使用者的回合内,则你令使用者当前的所有非Charlotte技失效直至回合结束。", + benyu: "贲育", + benyu2: "贲育", + benyu_info: + "当你受到伤害后,你可选择:①将手牌摸至与伤害来源手牌数相同(至多摸至5张);②弃置大于伤害来源手牌数的牌,然后对其造成1点伤害。", + zhidao: "雉盗", + zhidao_info: + "锁定技,当你于你的回合内第一次对区域里有牌的其他角色造成伤害后,你获得其手牌、装备区和判定区里的各一张牌,然后直到回合结束,其他角色不能被选择为你使用牌的目标。", + jili: "寄篱", + jili_info: + "锁定技,当一名其他角色成为红色基本牌或红色普通锦囊牌的目标时,若其与你的距离为1且你既不是此牌的使用者也不是目标,你也成为此牌的目标。", + luanzhan: "乱战", + luanzhan_info: + "你使用【杀】或黑色普通锦囊牌可以额外选择X名角色为目标;当你使用【杀】或黑色普通锦囊牌指定目标后,若此牌的目标角色数小于X,则X减至0。(X为你于本局游戏内造成过伤害的次数)", + zhengnan: "征南", + zhengnan_info: + "其他角色死亡后,你可以摸三张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗。", + xinzhengnan: "征南", + xinzhengnan_info: + "当一名角色进入濒死状态时,若你未因其发动过〖征南〗,则你回复1点体力并摸一张牌并获得下列技能中的任意一个:〖武圣〗、〖当先〗和〖制蛮〗(若技能全部拥有则改为摸三张牌。你以此法获得的〖当先〗结算时视为已发动过〖伏枥〗)。", + xiefang: "撷芳", + xiefang_info: "锁定技,你计算与其他角色的距离时-X。(X为女性角色数)", + qizhi: "奇制", + qizhi_info: + "当你于回合内使用基本牌或锦囊牌指定目标后,你可以弃置不是此牌目标的一名角色的一张牌。若如此做,其摸一张牌。", + jinqu: "进趋", + jinqu_info: + "结束阶段开始时,你可以摸两张牌,若如此做,你将手牌弃置至X张。(X为你于此回合发动过〖奇制〗的次数)", + jiqiao: "机巧", + jiqiao_info: + "出牌阶段开始时,你可以弃置任意张装备牌,然后亮出牌堆顶两倍数量的牌并获得其中的非装备牌。", + linglong: "玲珑", + linglong_info: + "锁定技,若你的装备区没有武器牌,则你使用【杀】的次数上限+1;若你的装备区没有防具牌,视为你装备着【八卦阵】;若你的装备区没有坐骑牌,你的手牌上限+1;若你的装备区没有宝物牌,则你视为拥有技能〖奇才〗。", + zhenwei: "镇卫", + zhenwei2: "镇卫", + zhenwei_info: + "当一名其他角色成为【杀】或黑色锦囊牌的目标时(使用者不是你),若该角色的体力值小于你且此牌的目标角色数为1,你可以弃置一张牌。若如此做,你选择一项:1、摸一张牌,然后将此【杀】或黑色锦囊牌转移给你;2、令此【杀】或黑色锦囊牌无效,然后将此【杀】或黑色锦囊牌置于使用者的武将牌旁,若如此做,当前回合结束后,使用者获得使用者武将牌旁的这些牌。", + xingwu: "星舞", + xingwu_info: + "弃牌阶段开始时,你可以将一张与你本回合使用的牌颜色均不同的手牌置于武将牌上:若你有至少三张“星舞”牌,你移去“星舞”牌并选择一名男性角色,该角色受到2点伤害并弃置其装备区的所有牌。", + luoyan: "落雁", + luoyan_info: "锁定技。若你的武将牌上有“星舞牌”,你拥有“天香”和“流离”。", + yinbing: "引兵", + yinbing_info: + "结束阶段开始时,你可以将至少一张非基本牌置于武将牌上。每当你受到【杀】或【决斗】的伤害后,你移去一张「引兵」牌。", + juedi: "绝地", + juedi_info: + "锁定技,准备阶段,若你的武将牌上有「引兵」牌,你选择一项:1.移去「引兵」牌,将手牌补至体力上限数;2.将「引兵」牌交给一名体力值不大于你的其他角色,其回复1点体力并摸等量的牌。", + kuangfu: "狂斧", + kuangfu_info: + "当你使用【杀】造成伤害后,你可以选择一项:弃置其装备区内的一张牌,或将其装备区内的一张牌移动到你的装备区内。", + xintan: "心惔", + xintan_info: "出牌阶段限一次,你可以移去两张「焚」并选择一名角色,该角色失去1点体力。", + fentian: "焚天", + fentian_info: + "锁定技,结束阶段开始时,若你的手牌数少于体力值,你须选择一名攻击范围内的角色,将其一张牌置于你的武将牌上,称为「焚」。锁定技,你的攻击范围+X(X为「焚」的数量)。", + zhiri: "炙日", + zhiri_info: + "觉醒技,准备阶段开始时,若你的「焚」的数量不小于3,你减1点体力上限,然后获得技能〖心惔〗。", + meibu: "魅步", + meibu_info: + "其他角色的出牌阶段开始时,若你不在其攻击范围内,你可以令该角色的锦囊牌均视为【杀】,直到该角色以此法使用了一张【杀】或回合结束。若如此做,则直到回合结束,视为你在其攻击范围内。", + mumu: "穆穆", + mumu_info: + "出牌阶段限一次,你可以弃置一张【杀】或黑色锦囊牌,然后选择一项:弃置场上的一张武器牌,然后摸一张牌;或将场上的一张防具牌移动到你的装备区里(可替换原防具)。", + zhanyi: "战意", + zhanyi_basic_sha: "战杀", + zhanyi_basic_jiu: "战酒", + zhanyi_basic_tao: "战桃", + zhanyi_info: + "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作【杀】、【酒】或【桃】使用;锦囊牌,摸两张牌且你使用的牌无距离限制;装备牌,你使用【杀】指定目标角色后,其弃置两张牌。", + nuzhan: "怒斩", + nuzhan2: "怒斩", + nuzhan_info: + "锁定技,你使用的由一张锦囊牌转化的【杀】不计入出牌阶段的次数限制;锁定技,你使用的由一张装备牌转化的【杀】的伤害值基数+1。", + danji: "单骑", + danji_info: + "觉醒技,准备阶段开始时,若你的手牌数大于你的体力值且本局游戏的主公不为刘备,你减1点体力上限,然后获得〖马术〗和〖怒斩〗。", + jieyuan: "竭缘", + jieyuan_more: "竭缘", + jieyuan_less: "竭缘", + jieyuan_info: + "当你对一名其他角色造成伤害时,若其体力值大于或等于你的体力值,你可弃置一张黑色手牌,令此伤害+1;当你受到一名其他角色造成的伤害时,若其体力值大于或等于你的体力值,你可弃置一张红色手牌,令此伤害-1。", + fenxin: "焚心", + fenxin_info: + "锁定技,一名其他角色死亡后,若其身份为:忠臣,你本局内发动〖竭缘〗减少伤害时无视体力值限制;反贼,你本局内发动〖竭缘〗增加伤害时无视体力值限制;内奸,你本局内选择发动〖竭缘〗的牌时无颜色和区域限制。", + fenxin_info_versus: + "锁定技,一名其他角色首次受到伤害后,你选择本局游戏未选择过的一项:1.发动〖竭缘〗减少伤害时无视体力值限制;2.发动〖竭缘〗增加伤害时无视体力值限制;3.发动〖竭缘〗选择的牌时无颜色和区域限制。", + qingyi: "轻逸", + qingyi1: "轻逸", + qingyi2: "轻逸", + qingyi_info: + "你可以跳过判定阶段和摸牌阶段。若如此做,视为对一名角色使用了一张无距离限制的【杀】。", + xiandeng: "先登", + xiandeng_info: "锁定技,出牌阶段,你使用的第一张【杀】不计入次数且无距离限制。", + shulv: "熟虑", + shulv_info: "出牌阶段限一次,若你的手牌数大于体力值,则你可以弃置一张牌并摸一张牌。", + xisheng: "牺牲", + xisheng_info: "每名其他角色的回合限一次,你可以将两张牌当做【桃】使用。", + yuhua: "羽化", + yuhua_info: "锁定技。①你的非基本牌不计入手牌上限。②准备阶段和结束阶段开始时,你卜算1。", + qirang: "祈禳", + qirang_info: + "当有装备牌进入你的装备区时,你可获得牌堆中的一张锦囊牌。若此牌为:普通锦囊牌,则当你使用此“祈禳”牌选择唯一目标后,可为此牌增加一个目标;延时锦囊牌,则你下回合发动〖羽化〗时的卜算量+1(至多为5)。", + biluan: "避乱", + biluan_info: + "摸牌阶段开始时,若有与你距离不大于1的其他角色,你可以放弃摸牌。若如此做,本局内其他角色计算与你的距离时+X。(X为势力数)", + lixia: "礼下", + lixia_info: + "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸一张牌。本局内其他角色计算与你的距离时-1。", + olbiluan: "避乱", + olbiluan_info: + "结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上的势力数)", + relixia: "礼下", + relixia_info: + "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你选择一至两项:1.摸一张牌;2.其摸两张牌;3.其回复1点体力。本局内其他角色计算与你的距离时-X(X为你选择的选项数)。", + rebiluan: "避乱", + rebiluan2: "避乱", + rebiluan_info: + "结束阶段开始时,若有与你距离不大于1的其他角色,你可以弃置一张牌。若如此做,本局内其他角色计算与你的距离时+X。(X为场上角色数且至多为4)", + ollixia: "礼下", + ollixia_info: + "锁定技,其他角色的结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸两张牌。本局内其他角色计算与你的距离时-1。", + yishe: "义舍", + yishe_bg: "米", + yishe_info: + "结束阶段开始时,若你的武将牌上没有「米」,则你可以摸两张牌。若如此做,你将两张牌置于武将牌上,称为「米」;当有「米」移至其他区域后,若你的武将牌上没有「米」,则你回复1点体力。", + bushi: "布施", + midao: "米道", + bushi_info: + "当你受到1点伤害后,或其他角色受到你造成的1点伤害后,受到伤害的角色可以获得你的一张「米」。", + midao_info: "一名角色的判定牌生效前,你可以打出一张「米」代替之。", + fengpo: "凤魄", + fengpo_info: + "每种牌名各限一次。当你每回合使用的第一张【杀】或【决斗】指定目标后,若目标角色数为1,你可以选择一项:1.摸X张牌,令此牌的伤害值基数+1;2.摸一张牌,令此牌的伤害值基数+X(X为其♦牌的数量)。", + chenqing: "陈情", + chenqing_info: + "每轮限一次,当一名角色处于濒死状态时,你可以令另一名其他角色摸四张牌,然后其弃置四张牌。若其以此法弃置的四张牌花色各不相同,则视为该角色对濒死的角色使用一张【桃】。", + mozhi: "默识", + mozhi_info: + "结束阶段开始时,你可以将一张手牌当作你本回合出牌阶段内使用的第一张基本或普通锦囊牌使用。然后,你可以将一张手牌当做你本回合出牌阶段内使用的第二张基本或普通锦囊牌使用。(你不能通过此技能使用【酒】)", + ranshang: "燃殇", + ranshang2: "燃殇", + ranshang_info: + "锁定技,当你受到1点火焰伤害后,你获得1枚“燃”标记;结束阶段开始时,你失去X点体力。若X大于2,则你减2点体力上限并摸两张牌。(X为“燃”标记的数量)", + hanyong: "悍勇", + hanyong_info: + "当你使用【南蛮入侵】或【万箭齐发】或黑桃普通【杀】时,若你已受伤,则你可以令此牌的伤害值基数+1。然后若你的体力值不小于游戏轮数,则你获得一枚“燃”标记。", - yicong:'义从', - yongsi:'庸肆', - yongsi1:'庸肆', - yongsi2:'庸肆', - bifa:'笔伐', - bifa2:'笔伐', - songci:'颂词', - songci_draw:'颂词', - baobian:'豹变', - lihun:'离魂', - chongzhen:'冲阵', - yuanhu:'援护', - tianming:'天命', - mizhao:'密诏', - duwu:'黩武', - duwu3:'黩武', - mingzhe:'明哲', - huanshi:'缓释', - hongyuan:'弘援', - aocai:'傲才', - aocai2:'傲才', - aocai2_backup:'傲才', - aocai3:'傲才', - huxiao:'虎啸', - huxiao3:'虎啸', - xueji:'雪恨', - wuji:'武继', - shushen:'淑慎', - shenzhi:'神智', - xiongyi:'雄异', - junbing:'郡兵', - junbing2:'郡兵', - quji:'去疾', - sijian:'死谏', - suishi:'随势', - suishi2:'随势', - xiaoguo:'骁果', - duanxie:'断绁', - fenming:'奋命', - guixiu:'闺秀', - cunsi:'存嗣', - yongjue:'勇决', - hengzheng:'横征', - shengxi:'生息', - shoucheng:'守成', - shangyi:'尚义', - zniaoxiang:'鸟翔', - zhendu:'鸩毒', - qiluan:'戚乱', - qiluan2:'戚乱', - qiluan3:'戚乱', - shenxian:'甚贤', - oldshenxian:'甚贤', - qiangwu:'枪舞', - moukui:'谋溃', - moukui2:'谋溃', - lirang:'礼让', - mingshi:'名士', - liangzhu:'良助', - kaikang:'慷忾', - wangzun:'妄尊', - tongji:'同疾', - kuiwei:'溃围', - kuiwei2:'溃围', - yanzheng:'严整', - zhoufu:'咒缚', - zhoufu2:'咒缚', - zhoufu3:'咒缚', - yingbin:'影兵', - reyingbing:'影兵', - rezhoufu:'咒缚', - rezhoufu2:'咒缚', - fenxun:'奋迅', - fenxun2:'奋迅', - spmengjin:'猛进', - xiemu:'协穆', - xiemu2:'协穆', - oldxiemu:'协穆', - naman:'纳蛮', - taichen:'抬榇', - jilei:'鸡肋', - jilei2:'鸡肋', - jilei2_bg:'肋', - yawang:'雅望', - xunzhi:'殉志', - fanxiang:'返乡', - fanxiang_info:'觉醒技,准备阶段开始时,若场上有已受伤且你发动过〖良助〗的选项二的角色,则你加1点体力上限并回复1点体力,失去技能〖良助〗并获得技能〖枭姬〗。', - xunzhi_info:'准备阶段开始时,若你的上家和下家与你的体力值均不相等,你可以失去1点体力。若如此做,你本局内手牌上限+2。', - yawang_info:'锁定技,摸牌阶段开始时,你改为摸X张牌,然后你于本回合的出牌阶段内至多使用X张牌(X为与你体力值相等的角色数)。', - jilei_info:'当你受到有来源的伤害后,你可以声明一种牌的类别。若如此做,你令伤害来源不能使用、打出或弃置此类别的手牌直到其下个回合开始。', - danlao:'啖酪', - danlao_info:'当你成为【杀】或普通锦囊牌的目标后,若此牌的目标数大于1,则你可以摸一张牌,令此牌对你无效。', - gongao:'功獒', - zhuiji:'追击', - chouhai:'仇海', - chouhai_info:'锁定技,当你受到伤害时,若你没有手牌,此伤害+1。', - rechouhai:'仇海', - rechouhai_info:'锁定技,当你受到渠道为【杀】的伤害时,若你没有手牌,此伤害+1。', - guiming:'归命', - guiming_info:'主公技,锁定技,你将残蚀描述中的“已受伤角色”改为“已受伤角色或其他吴势力角色”。', - canshi:'残蚀', - canshi2:'残蚀', - canshi_info:'摸牌阶段开始时,你可以改为摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用基本牌或锦囊牌时,你弃置一张牌。', - recanshi:'残蚀', - recanshi2:'残蚀', - recanshi_info:'摸牌阶段开始时,你可以多摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用【杀】或普通锦囊牌时,你弃置一张牌。', - zhuiji_info:'锁定技,你与体力值不大于你的角色的距离视为1。', - kunfen:'困奋', - kunfen_info:'锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。', - fengliang:'逢亮', - fengliang_info:'觉醒技,当你进入濒死状态时,你减1点体力上限,将体力值回复至2点,获得技能〖挑衅〗并将〖困奋〗改为非锁定技。', - oldcihuai:'刺槐', - oldcihuai2:'刺槐', - oldcihuai_info:'出牌阶段开始时,你可以展示手牌。若其中没有【杀】,则当你于此阶段内手牌数变化之前/有角色死亡之前需要使用【杀】时,你可以使用无对应实体牌的【杀】。', - cihuai:'刺槐', - cihuai_info:'出牌阶段开始时,若你的手牌中没有【杀】,则你可以展示你的手牌,视为对一名角色使用一张【杀】。', - gongao_info:'锁定技,当一名角色死亡后,你增加1点体力上限,回复1点体力。', - juyi:'举义', - juyi_info:'觉醒技,准备阶段开始时,若你的体力上限大于存活角色数,你摸等同于体力上限张数的牌,然后获得技能〖崩坏〗和〖威重〗。', - weizhong:'威重', - weizhong_info:'锁定技,当你的体力上限增加或减少时,你摸一张牌。若你的手牌数为全场最少,则你改为摸两张牌。', - taichen_info:'出牌阶段限一次,你可以失去1点体力,视为对一名角色使用一张【杀】。(不计入出牌阶段的使用次数限制)', - naman_info:'当其他角色打出的【杀】结算结束后,你可以获得此牌对应的所有实体牌。', - xiemu_info:'出牌阶段限一次,你可以弃置一张【杀】并选择一个势力。若如此做,直到你的下回合开始时,当你成为该势力的其他角色使用的黑色牌的目标后,你摸两张牌。', - oldxiemu_info:'当你成为其他角色使用的黑色牌的目标后,你可以弃置一张【杀】,然后摸两张牌。', - spmengjin_info:'当你使用【杀】指定目标后,你可以弃置目标角色的一张牌。', - fenxun_info:'出牌阶段限一次,你可以弃置一张牌并选择一名其他角色,你于本回合内至其的距离视为1。', - rezhoufu_info:'①出牌阶段限一次。你可以用一张牌对一名其他角色施“咒”,且当其判定时,将“咒”作为判定牌。②一名角色的回合结束时,你令本回合移除过“咒”的角色各失去1点体力。', - reyingbing_info:'锁定技,有“咒”的角色使用与“咒”颜色相同的牌时,你摸一张牌;若这是你第二次因该“咒”摸牌,则你获得该"咒"。', - yingbin_info:'锁定技,有“咒”的角色使用与“咒”花色相同的牌时,你摸一张牌;当你因同一名角色的同一张“咒”的效果摸第二张牌时,移去该“咒”。', - zhoufu_info:'出牌阶段限一次,你可以将一张手牌置于一名没有“咒”的其他角色的武将牌旁,称为“咒”。当有“咒”的角色判定时,其改为将“咒”作为判定牌;一名角色的回合结束时,若有角色于此回合因判定而移除过“咒”,则你令这些角色各失去1点体力。', - yanzheng_info:'若你的手牌数大于你的体力值,则你可以将你装备区内的牌当做【无懈可击】使用。', - kuiwei_info:'结束阶段开始时,你可以摸2+X张牌并翻面。你的下个摸牌阶段开始时,你弃置X张牌(X为当前时机场上所有角色装备区内武器牌数之和)。', - tongji_info:'锁定技。若你的手牌数大于你的体力值,则攻击范围包含你的其他角色使用【杀】时不能指定你以外的角色为目标。', - wangzun_info:'其他角色的准备阶段开始时,你可以摸一张牌。若如此做,该角色此回合的手牌上限-1。然后你不能再发动〖妄尊〗直到回合开始。', - kaikang_info:'当一名角色成为【杀】的目标后,若你至该角色的距离为1,你可以摸一张牌。若如此做,你交给其一张牌并展示之。若为装备牌,该角色可以使用此牌。', - liangzhu_info:'当一名角色于其出牌阶段内回复体力时,你可以选择一项:1、摸一张牌;2、令该角色摸两张牌。', - mingshi_info:'当你受到伤害时,若伤害来源的体力值大于你,你可以弃置一张黑色手牌,令伤害值-1。', - lirang_info:'当你的牌因弃置而置入弃牌堆后,你可以将其中的任意张牌交给其他角色。', - moukui_info:'当你使用【杀】指定目标后,你可以选择一项:摸一张牌,或弃置其一张牌。若如此做,当此【杀】被【闪】抵消时,目标角色弃置你的一张牌。', - qiangwu_info:'出牌阶段,你可以进行判定。若如此做,直到回合结束,你使用点数小于判定结果的【杀】时不受距离限制,且你使用点数大于判定结果的【杀】时无使用次数限制。', - shenxian_info:'每名角色的回合限一次,你的回合外,当有其他角色因弃置而失去基本牌时,你可以摸一张牌。', - oldshenxian_info:'你的回合外,每当有其他角色因弃置而失去基本牌时,你可以摸一张牌。', - qiluan_info:'一名角色的回合结束时,你可以摸3X+Y张牌。(X为你本回合内杀死过的角色数,Y为本回合内其他角色杀死过的角色数)', + yicong: "义从", + yongsi: "庸肆", + yongsi1: "庸肆", + yongsi2: "庸肆", + bifa: "笔伐", + bifa2: "笔伐", + songci: "颂词", + songci_draw: "颂词", + baobian: "豹变", + lihun: "离魂", + chongzhen: "冲阵", + yuanhu: "援护", + tianming: "天命", + mizhao: "密诏", + duwu: "黩武", + duwu3: "黩武", + mingzhe: "明哲", + huanshi: "缓释", + hongyuan: "弘援", + aocai: "傲才", + aocai2: "傲才", + aocai2_backup: "傲才", + aocai3: "傲才", + huxiao: "虎啸", + huxiao3: "虎啸", + xueji: "雪恨", + wuji: "武继", + shushen: "淑慎", + shenzhi: "神智", + xiongyi: "雄异", + junbing: "郡兵", + junbing2: "郡兵", + quji: "去疾", + sijian: "死谏", + suishi: "随势", + suishi2: "随势", + xiaoguo: "骁果", + duanxie: "断绁", + fenming: "奋命", + guixiu: "闺秀", + cunsi: "存嗣", + yongjue: "勇决", + hengzheng: "横征", + shengxi: "生息", + shoucheng: "守成", + shangyi: "尚义", + zniaoxiang: "鸟翔", + zhendu: "鸩毒", + qiluan: "戚乱", + qiluan2: "戚乱", + qiluan3: "戚乱", + shenxian: "甚贤", + oldshenxian: "甚贤", + qiangwu: "枪舞", + moukui: "谋溃", + moukui2: "谋溃", + lirang: "礼让", + mingshi: "名士", + liangzhu: "良助", + kaikang: "慷忾", + wangzun: "妄尊", + tongji: "同疾", + kuiwei: "溃围", + kuiwei2: "溃围", + yanzheng: "严整", + zhoufu: "咒缚", + zhoufu2: "咒缚", + zhoufu3: "咒缚", + yingbin: "影兵", + reyingbing: "影兵", + rezhoufu: "咒缚", + rezhoufu2: "咒缚", + fenxun: "奋迅", + fenxun2: "奋迅", + spmengjin: "猛进", + xiemu: "协穆", + xiemu2: "协穆", + oldxiemu: "协穆", + naman: "纳蛮", + taichen: "抬榇", + jilei: "鸡肋", + jilei2: "鸡肋", + jilei2_bg: "肋", + yawang: "雅望", + xunzhi: "殉志", + fanxiang: "返乡", + fanxiang_info: + "觉醒技,准备阶段开始时,若场上有已受伤且你发动过〖良助〗的选项二的角色,则你加1点体力上限并回复1点体力,失去技能〖良助〗并获得技能〖枭姬〗。", + xunzhi_info: + "准备阶段开始时,若你的上家和下家与你的体力值均不相等,你可以失去1点体力。若如此做,你本局内手牌上限+2。", + yawang_info: + "锁定技,摸牌阶段开始时,你改为摸X张牌,然后你于本回合的出牌阶段内至多使用X张牌(X为与你体力值相等的角色数)。", + jilei_info: + "当你受到有来源的伤害后,你可以声明一种牌的类别。若如此做,你令伤害来源不能使用、打出或弃置此类别的手牌直到其下个回合开始。", + danlao: "啖酪", + danlao_info: + "当你成为【杀】或普通锦囊牌的目标后,若此牌的目标数大于1,则你可以摸一张牌,令此牌对你无效。", + gongao: "功獒", + zhuiji: "追击", + chouhai: "仇海", + chouhai_info: "锁定技,当你受到伤害时,若你没有手牌,此伤害+1。", + rechouhai: "仇海", + rechouhai_info: "锁定技,当你受到渠道为【杀】的伤害时,若你没有手牌,此伤害+1。", + guiming: "归命", + guiming_info: "主公技,锁定技,你将残蚀描述中的“已受伤角色”改为“已受伤角色或其他吴势力角色”。", + canshi: "残蚀", + canshi2: "残蚀", + canshi_info: + "摸牌阶段开始时,你可以改为摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用基本牌或锦囊牌时,你弃置一张牌。", + recanshi: "残蚀", + recanshi2: "残蚀", + recanshi_info: + "摸牌阶段开始时,你可以多摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用【杀】或普通锦囊牌时,你弃置一张牌。", + zhuiji_info: "锁定技,你与体力值不大于你的角色的距离视为1。", + kunfen: "困奋", + kunfen_info: "锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。", + fengliang: "逢亮", + fengliang_info: + "觉醒技,当你进入濒死状态时,你减1点体力上限,将体力值回复至2点,获得技能〖挑衅〗并将〖困奋〗改为非锁定技。", + oldcihuai: "刺槐", + oldcihuai2: "刺槐", + oldcihuai_info: + "出牌阶段开始时,你可以展示手牌。若其中没有【杀】,则当你于此阶段内手牌数变化之前/有角色死亡之前需要使用【杀】时,你可以使用无对应实体牌的【杀】。", + cihuai: "刺槐", + cihuai_info: + "出牌阶段开始时,若你的手牌中没有【杀】,则你可以展示你的手牌,视为对一名角色使用一张【杀】。", + gongao_info: "锁定技,当一名角色死亡后,你增加1点体力上限,回复1点体力。", + juyi: "举义", + juyi_info: + "觉醒技,准备阶段开始时,若你的体力上限大于存活角色数,你摸等同于体力上限张数的牌,然后获得技能〖崩坏〗和〖威重〗。", + weizhong: "威重", + weizhong_info: + "锁定技,当你的体力上限增加或减少时,你摸一张牌。若你的手牌数为全场最少,则你改为摸两张牌。", + taichen_info: + "出牌阶段限一次,你可以失去1点体力,视为对一名角色使用一张【杀】。(不计入出牌阶段的使用次数限制)", + naman_info: "当其他角色打出的【杀】结算结束后,你可以获得此牌对应的所有实体牌。", + xiemu_info: + "出牌阶段限一次,你可以弃置一张【杀】并选择一个势力。若如此做,直到你的下回合开始时,当你成为该势力的其他角色使用的黑色牌的目标后,你摸两张牌。", + oldxiemu_info: "当你成为其他角色使用的黑色牌的目标后,你可以弃置一张【杀】,然后摸两张牌。", + spmengjin_info: "当你使用【杀】指定目标后,你可以弃置目标角色的一张牌。", + fenxun_info: "出牌阶段限一次,你可以弃置一张牌并选择一名其他角色,你于本回合内至其的距离视为1。", + rezhoufu_info: + "①出牌阶段限一次。你可以用一张牌对一名其他角色施“咒”,且当其判定时,将“咒”作为判定牌。②一名角色的回合结束时,你令本回合移除过“咒”的角色各失去1点体力。", + reyingbing_info: + '锁定技,有“咒”的角色使用与“咒”颜色相同的牌时,你摸一张牌;若这是你第二次因该“咒”摸牌,则你获得该"咒"。', + yingbin_info: + "锁定技,有“咒”的角色使用与“咒”花色相同的牌时,你摸一张牌;当你因同一名角色的同一张“咒”的效果摸第二张牌时,移去该“咒”。", + zhoufu_info: + "出牌阶段限一次,你可以将一张手牌置于一名没有“咒”的其他角色的武将牌旁,称为“咒”。当有“咒”的角色判定时,其改为将“咒”作为判定牌;一名角色的回合结束时,若有角色于此回合因判定而移除过“咒”,则你令这些角色各失去1点体力。", + yanzheng_info: "若你的手牌数大于你的体力值,则你可以将你装备区内的牌当做【无懈可击】使用。", + kuiwei_info: + "结束阶段开始时,你可以摸2+X张牌并翻面。你的下个摸牌阶段开始时,你弃置X张牌(X为当前时机场上所有角色装备区内武器牌数之和)。", + tongji_info: + "锁定技。若你的手牌数大于你的体力值,则攻击范围包含你的其他角色使用【杀】时不能指定你以外的角色为目标。", + wangzun_info: + "其他角色的准备阶段开始时,你可以摸一张牌。若如此做,该角色此回合的手牌上限-1。然后你不能再发动〖妄尊〗直到回合开始。", + kaikang_info: + "当一名角色成为【杀】的目标后,若你至该角色的距离为1,你可以摸一张牌。若如此做,你交给其一张牌并展示之。若为装备牌,该角色可以使用此牌。", + liangzhu_info: + "当一名角色于其出牌阶段内回复体力时,你可以选择一项:1、摸一张牌;2、令该角色摸两张牌。", + mingshi_info: "当你受到伤害时,若伤害来源的体力值大于你,你可以弃置一张黑色手牌,令伤害值-1。", + lirang_info: "当你的牌因弃置而置入弃牌堆后,你可以将其中的任意张牌交给其他角色。", + moukui_info: + "当你使用【杀】指定目标后,你可以选择一项:摸一张牌,或弃置其一张牌。若如此做,当此【杀】被【闪】抵消时,目标角色弃置你的一张牌。", + qiangwu_info: + "出牌阶段,你可以进行判定。若如此做,直到回合结束,你使用点数小于判定结果的【杀】时不受距离限制,且你使用点数大于判定结果的【杀】时无使用次数限制。", + shenxian_info: + "每名角色的回合限一次,你的回合外,当有其他角色因弃置而失去基本牌时,你可以摸一张牌。", + oldshenxian_info: "你的回合外,每当有其他角色因弃置而失去基本牌时,你可以摸一张牌。", + qiluan_info: + "一名角色的回合结束时,你可以摸3X+Y张牌。(X为你本回合内杀死过的角色数,Y为本回合内其他角色杀死过的角色数)", //qiluan_info_guozhan:'一名角色的回合结束时,若你于回合内杀死过角色,则你可以摸三张牌。', - zhendu_info:'一名角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若该角色不是你,你对其造成1点伤害。', + zhendu_info: + "一名角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若该角色不是你,你对其造成1点伤害。", //zhendu_info_guozhan:'其他角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若如此做,你对其造成1点伤害。', - shangyi_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后弃置其中的一张黑色牌。', - zniaoxiang_info:'锁定技,当你使用【杀】指定目标后,你令目标角色响应此【杀】所需要使用的【闪】的数目+1。', - shoucheng_info:'当一名角色于其回合外失去手牌时,若其没有手牌,则你可令该角色摸一张牌。', - shengxi_info:'弃牌阶段开始时,若你本回合内未造成过伤害,则你可以摸两张牌。', - hengzheng_info:'摸牌阶段开始时,若你的体力值为1或你没有手牌,则你可以放弃摸牌,改为获得每名其他角色区域内的一张牌。', - cunsi_info:'限定技,出牌阶段,你可以将所有手牌交给一名男性角色。该角色获得技能〖勇决〗,然后你将武将牌翻面。', - yongjue_info:'每回合限一次。当其他角色于回合内使用的【杀】结算完成后,若你不是此【杀】的目标角色,则你可以获得之。', - guixiu_info:'当你成为【杀】的目标后,若你的手牌数小于体力值,则你可以摸一张牌。', - fenming_info:'结束阶段开始时,若你处于横置状态,你可以弃置所有处于横置状态的角色的各一张牌。', - duanxie_info:'出牌阶段限一次,你可以令至多X名其他角色横置(X为你已损失的体力值且至少为1),然后你横置。', - xiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。', - sijian_info:'当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。', - suishi_info:'当其他角色进入濒死状态时,伤害来源可以令你摸一张牌;当其他角色死亡时,伤害来源可以令你失去1点体力。', - quji_info:'出牌阶段限一次,你可以弃置X张牌(X为你已损失的体力值),然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌,你失去1点体力。', - junbing_info:'一名角色的结束阶段开始时,若其手牌数不大于1,该角色可以摸一张牌。若如此做,该角色将所有手牌交给你,然后你交给其等量的牌。', - xiongyi_info:'限定技,出牌阶段,你可以选择任意名角色,这些角色各摸三张牌。然后若你的体力值最小,你回复1点体力。', - xiongyi_info_guozhan:'限定技,出牌阶段,你可以令与你势力相同的所有角色各摸三张牌,然后若你的势力是角色最少的势力(或之一),则你回复1点体力。', - shenzhi_info:'准备阶段开始时,你可以弃置所有手牌。若你以此法弃置的牌数不小于X,你回复1点体力(X为你的体力值)。', - shushen_info:'当你回复1点体力时,你可以令一名其他角色选择回复1点体力或摸两张牌。', - wuji_info:'觉醒技,结束阶段开始时,若你于此回合内造成过3点或更多伤害,你加1点体力上限并回复1点体力,失去〖虎啸〗,然后从场上、牌堆或弃牌堆中获得【青龙偃月刀】。', - xueji_info:'出牌阶段限一次,你可以弃置一张红色牌,然后选择至多X名角色,横置这些角色并对其中一名角色造成1点火焰伤害。(X为你已损失的体力值且至少为1)', - huxiao_info:'锁定技,当你造成火焰伤害后,你令受伤角色摸一张牌,然后你于此回合内对其使用牌没有次数限制。', - aocai_info:'当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌(若你没有手牌则改为四张)。若你观看的牌中有此牌,你可以使用打出之。', - aocai_info_guozhan:'当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若你观看的牌中有此牌,你可以使用打出之。', - hongyuan_info:'摸牌阶段,你可以少摸一张牌并指定至多两名其他角色。若如此做,这些角色各摸一张牌。', - hongyuan_info_combat:'摸牌阶段,你可以少摸一张牌。若如此做,其他友方角色各摸一张牌。', - huanshi_info:'一名角色的判定牌生效前,你可令其观看你的手牌。若如此做,该角色选择你的一张牌,你打出此牌代替之。', - mingzhe_info:'当你于回合外使用或打出红色牌,或因弃置失去一张红色牌后,你可以摸一张牌。', - duwu_info:'出牌阶段,你可以弃置X张牌对你攻击范围内的一名其他角色造成1点伤害(X为该角色的体力值)。若该角色因此法进入濒死状态且存活,则你于濒死状态结算后失去1点体力,且本回合不能再发动〖黩武〗。', - tianming_info:'当你成为【杀】的目标时,你可以弃置两张牌(不足则全弃,无牌则不弃),然后摸两张牌;若此时全场体力值最多的角色仅有一名且不是你,该角色也可以如此做。', - mizhao_info:'出牌阶段限一次,你可以将所有手牌交给一名其他角色。若如此做,你令该角色与你指定的另一名有手牌的角色拼点,视为拼点赢的角色对没赢的角色使用一张【杀】。', - yuanhu_info:'结束阶段开始时,你可以将一张装备牌置于一名角色的装备区里,然后根据此装备牌的类型执行以下对应效果。武器牌:弃置该角色距离1以内的一名角色区域中的一张牌;防具牌:该角色摸一张牌;坐骑牌:该角色回复1点体力。', - lihun_info:'出牌阶段限一次,你可以弃置一张牌并选择一名其他男性角色。若如此做,你将武将牌翻面并获得其所有手牌。出牌阶段结束时,你交给其X张牌。(X为该角色的体力值)', - chongzhen_info:'当你因发动〖龙胆〗而使用或打出【杀】或【闪】时,你可以获得对方的一张手牌。', - bifa_info:'结束阶段开始时,你可以将一张手牌移出游戏并指定一名其他角色。该角色的准备阶段开始时,其观看你移出游戏的牌并选择一项:交给你一张与此牌类型相同的手牌并获得此牌;或将此牌置入弃牌堆,然后失去1点体力。', - songci_info:'①出牌阶段,你可以选择一名未以此法选择过的角色。若其手牌数:大于其体力值,其弃置两张牌;不大于其体力值,其摸两张牌。②弃牌阶段结束时,若你已对场上所有存活角色发动过〖颂词①〗,则你摸一张牌。', - yongsi_info:'锁定技。①摸牌阶段,你多摸X张牌。②弃牌阶段开始时,你弃置X张牌。(X为场上势力数)', - yicong_info:'锁定技,当你的体力值大于2时,你计算与其他角色的距离时-1;当你的体力值不大于2时,其他角色计算与你的距离时+1。', - baobian_info:'锁定技,若你的体力值为3或更少,你视为拥有技能〖挑衅〗;若你的体力值为2或更少;你视为拥有技能〖咆哮〗;若你的体力值为1,你视为拥有技能〖神速〗。', - rebaobian:'豹变', - rebaobian_info:'锁定技。当你受到伤害后,你获得以下技能中第一个未拥有的技能:〖挑衅〗/〖咆哮〗/〖神速〗。', - bingzhao:'秉诏', - bingzhao_info:'主公技,游戏开始时,你选择一个其他势力。当你对该势力的角色发动〖骨疽〗时,其可令你额外摸一张牌。', - sunshao:'孙邵', - bizheng:'弼政', - bizheng_info:'摸牌阶段结束时,你可以令一名其他角色摸两张牌。然后,若你的手牌数大于体力上限,你弃置两张牌。若其的手牌数大于体力上限,其弃置两张牌。', - yidian:'佚典', - yidian_info:'当你使用牌选择目标时,若弃牌堆中没有与此牌名称相同的牌,则你可以为此牌增加一个目标(无距离限制)。', - xinlianji:'连计', - xinlianji_info:'出牌阶段限一次,你可以弃置一张手牌,令一名角色使用牌堆中的一张随机武器牌。然后其选择一项:对你指定的一名角色使用一张【杀】,或令你将其装备区里的武器牌交给任意角色。', - xinmoucheng:'谋逞', - xinmoucheng_info:'觉醒技,准备阶段,若有角色因你发动〖连计〗使用【杀】而造成过伤害,则你失去〖连计〗并获得〖矜功〗。', - xinjingong:'矜功', - xinjingong_backup:'矜功', - xinjingong_info:'出牌阶段限一次,你可以将一张【杀】或装备牌当做三张随机锦囊牌中的一张使用。', - caiyang:'蔡阳', - yinka:'印卡', - zhangling:'张陵', - zlhuji:'虎骑', - zlhuji_info:'锁定技,你与其他角色的距离-1,当你于回合外受到伤害后,你可进行判定,若结果为红色,视为你对伤害来源使用一张【杀】(无距离限制)。', - zlshoufu:'授符', - zlshoufu2:'授符', - zlshoufu_info:'出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有【箓】的角色的武将牌上,称为【箓】;其不能使用和打出与【箓】同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与【箓】同类型的牌后,将【箓】置入弃牌堆。', - ol_zhangchangpu:'OL张昌蒲', - ol_zhangchangpu_prefix:'OL', - olxingshen:'省身', - olxingshen_info:'当你受到伤害后,你可以随机摸至多两张牌。若如此做,你获得X个“省”,且下一次发动〖严教〗展示牌时移去所有“省”并多展示等量的牌。(X为你已损失的体力值,且你至多拥有6个“省”)', - caoshuang:'曹爽', - tuogu:'托孤', - tuogu_info:'限定技,一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能。', - retuogu:'托孤', - retuogu_info:'一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能并失去上次因〖托孤〗获得的技能。', - shanzhuan:'擅专', - shanzhuan_info:'①当你对其他角色造成伤害后,若其判定区没有延时类锦囊牌,则你可以将其的一张牌置于其的判定区。若此牌不为延时锦囊牌且此牌为:红色,此牌视为【乐不思蜀】;黑色,此牌视为【兵粮寸断】。②回合结束时,若你本回合内未造成伤害,你可摸一张牌。', - spniluan:'逆乱', - spniluan_info:'出牌阶段,你可以将一张黑色牌当做【杀】使用。此【杀】使用结算完成后,若你未因此【杀】造成过伤害,则你令此【杀】不计入使用次数。', - spweiwu:'违忤', - spweiwu_info:'出牌阶段限一次,你可以将一张红色牌当无距离限制的【顺手牵羊】使用。', - spmouzhu:'谋诛', - spmouzhu_backup:'谋诛', - spmouzhu_info:'出牌阶段限一次,你可以选择任意名“距离为1”或“体力值等于你”的其他角色,这些角色依次进行以下结算:交给你一张手牌,然后若其手牌数小于你,则其视为对你使用一张【杀】或【决斗】。', - spyanhuo:'延祸', - spyanhuo_info:'当你死亡时,你可增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。', - xiaoxi:'骁袭', - xiaoxi_info:'当你登场时,你可以视为使用一张【杀】。', - quyi:'麴义', - wolongfengchu:'卧龙凤雏', - youlong:'游龙', - youlong_info:'转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。', - luanfeng:'鸾凤', + shangyi_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后弃置其中的一张黑色牌。", + zniaoxiang_info: + "锁定技,当你使用【杀】指定目标后,你令目标角色响应此【杀】所需要使用的【闪】的数目+1。", + shoucheng_info: "当一名角色于其回合外失去手牌时,若其没有手牌,则你可令该角色摸一张牌。", + shengxi_info: "弃牌阶段开始时,若你本回合内未造成过伤害,则你可以摸两张牌。", + hengzheng_info: + "摸牌阶段开始时,若你的体力值为1或你没有手牌,则你可以放弃摸牌,改为获得每名其他角色区域内的一张牌。", + cunsi_info: + "限定技,出牌阶段,你可以将所有手牌交给一名男性角色。该角色获得技能〖勇决〗,然后你将武将牌翻面。", + yongjue_info: + "每回合限一次。当其他角色于回合内使用的【杀】结算完成后,若你不是此【杀】的目标角色,则你可以获得之。", + guixiu_info: "当你成为【杀】的目标后,若你的手牌数小于体力值,则你可以摸一张牌。", + fenming_info: "结束阶段开始时,若你处于横置状态,你可以弃置所有处于横置状态的角色的各一张牌。", + duanxie_info: + "出牌阶段限一次,你可以令至多X名其他角色横置(X为你已损失的体力值且至少为1),然后你横置。", + xiaoguo_info: + "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。", + sijian_info: "当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。", + suishi_info: + "当其他角色进入濒死状态时,伤害来源可以令你摸一张牌;当其他角色死亡时,伤害来源可以令你失去1点体力。", + quji_info: + "出牌阶段限一次,你可以弃置X张牌(X为你已损失的体力值),然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌,你失去1点体力。", + junbing_info: + "一名角色的结束阶段开始时,若其手牌数不大于1,该角色可以摸一张牌。若如此做,该角色将所有手牌交给你,然后你交给其等量的牌。", + xiongyi_info: + "限定技,出牌阶段,你可以选择任意名角色,这些角色各摸三张牌。然后若你的体力值最小,你回复1点体力。", + xiongyi_info_guozhan: + "限定技,出牌阶段,你可以令与你势力相同的所有角色各摸三张牌,然后若你的势力是角色最少的势力(或之一),则你回复1点体力。", + shenzhi_info: + "准备阶段开始时,你可以弃置所有手牌。若你以此法弃置的牌数不小于X,你回复1点体力(X为你的体力值)。", + shushen_info: "当你回复1点体力时,你可以令一名其他角色选择回复1点体力或摸两张牌。", + wuji_info: + "觉醒技,结束阶段开始时,若你于此回合内造成过3点或更多伤害,你加1点体力上限并回复1点体力,失去〖虎啸〗,然后从场上、牌堆或弃牌堆中获得【青龙偃月刀】。", + xueji_info: + "出牌阶段限一次,你可以弃置一张红色牌,然后选择至多X名角色,横置这些角色并对其中一名角色造成1点火焰伤害。(X为你已损失的体力值且至少为1)", + huxiao_info: + "锁定技,当你造成火焰伤害后,你令受伤角色摸一张牌,然后你于此回合内对其使用牌没有次数限制。", + aocai_info: + "当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌(若你没有手牌则改为四张)。若你观看的牌中有此牌,你可以使用打出之。", + aocai_info_guozhan: + "当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌。若你观看的牌中有此牌,你可以使用打出之。", + hongyuan_info: "摸牌阶段,你可以少摸一张牌并指定至多两名其他角色。若如此做,这些角色各摸一张牌。", + hongyuan_info_combat: "摸牌阶段,你可以少摸一张牌。若如此做,其他友方角色各摸一张牌。", + huanshi_info: + "一名角色的判定牌生效前,你可令其观看你的手牌。若如此做,该角色选择你的一张牌,你打出此牌代替之。", + mingzhe_info: "当你于回合外使用或打出红色牌,或因弃置失去一张红色牌后,你可以摸一张牌。", + duwu_info: + "出牌阶段,你可以弃置X张牌对你攻击范围内的一名其他角色造成1点伤害(X为该角色的体力值)。若该角色因此法进入濒死状态且存活,则你于濒死状态结算后失去1点体力,且本回合不能再发动〖黩武〗。", + tianming_info: + "当你成为【杀】的目标时,你可以弃置两张牌(不足则全弃,无牌则不弃),然后摸两张牌;若此时全场体力值最多的角色仅有一名且不是你,该角色也可以如此做。", + mizhao_info: + "出牌阶段限一次,你可以将所有手牌交给一名其他角色。若如此做,你令该角色与你指定的另一名有手牌的角色拼点,视为拼点赢的角色对没赢的角色使用一张【杀】。", + yuanhu_info: + "结束阶段开始时,你可以将一张装备牌置于一名角色的装备区里,然后根据此装备牌的类型执行以下对应效果。武器牌:弃置该角色距离1以内的一名角色区域中的一张牌;防具牌:该角色摸一张牌;坐骑牌:该角色回复1点体力。", + lihun_info: + "出牌阶段限一次,你可以弃置一张牌并选择一名其他男性角色。若如此做,你将武将牌翻面并获得其所有手牌。出牌阶段结束时,你交给其X张牌。(X为该角色的体力值)", + chongzhen_info: "当你因发动〖龙胆〗而使用或打出【杀】或【闪】时,你可以获得对方的一张手牌。", + bifa_info: + "结束阶段开始时,你可以将一张手牌移出游戏并指定一名其他角色。该角色的准备阶段开始时,其观看你移出游戏的牌并选择一项:交给你一张与此牌类型相同的手牌并获得此牌;或将此牌置入弃牌堆,然后失去1点体力。", + songci_info: + "①出牌阶段,你可以选择一名未以此法选择过的角色。若其手牌数:大于其体力值,其弃置两张牌;不大于其体力值,其摸两张牌。②弃牌阶段结束时,若你已对场上所有存活角色发动过〖颂词①〗,则你摸一张牌。", + yongsi_info: "锁定技。①摸牌阶段,你多摸X张牌。②弃牌阶段开始时,你弃置X张牌。(X为场上势力数)", + yicong_info: + "锁定技,当你的体力值大于2时,你计算与其他角色的距离时-1;当你的体力值不大于2时,其他角色计算与你的距离时+1。", + baobian_info: + "锁定技,若你的体力值为3或更少,你视为拥有技能〖挑衅〗;若你的体力值为2或更少;你视为拥有技能〖咆哮〗;若你的体力值为1,你视为拥有技能〖神速〗。", + rebaobian: "豹变", + rebaobian_info: + "锁定技。当你受到伤害后,你获得以下技能中第一个未拥有的技能:〖挑衅〗/〖咆哮〗/〖神速〗。", + bingzhao: "秉诏", + bingzhao_info: + "主公技,游戏开始时,你选择一个其他势力。当你对该势力的角色发动〖骨疽〗时,其可令你额外摸一张牌。", + sunshao: "孙邵", + bizheng: "弼政", + bizheng_info: + "摸牌阶段结束时,你可以令一名其他角色摸两张牌。然后,若你的手牌数大于体力上限,你弃置两张牌。若其的手牌数大于体力上限,其弃置两张牌。", + yidian: "佚典", + yidian_info: + "当你使用牌选择目标时,若弃牌堆中没有与此牌名称相同的牌,则你可以为此牌增加一个目标(无距离限制)。", + xinlianji: "连计", + xinlianji_info: + "出牌阶段限一次,你可以弃置一张手牌,令一名角色使用牌堆中的一张随机武器牌。然后其选择一项:对你指定的一名角色使用一张【杀】,或令你将其装备区里的武器牌交给任意角色。", + xinmoucheng: "谋逞", + xinmoucheng_info: + "觉醒技,准备阶段,若有角色因你发动〖连计〗使用【杀】而造成过伤害,则你失去〖连计〗并获得〖矜功〗。", + xinjingong: "矜功", + xinjingong_backup: "矜功", + xinjingong_info: "出牌阶段限一次,你可以将一张【杀】或装备牌当做三张随机锦囊牌中的一张使用。", + caiyang: "蔡阳", + yinka: "印卡", + zhangling: "张陵", + zlhuji: "虎骑", + zlhuji_info: + "锁定技,你与其他角色的距离-1,当你于回合外受到伤害后,你可进行判定,若结果为红色,视为你对伤害来源使用一张【杀】(无距离限制)。", + zlshoufu: "授符", + zlshoufu2: "授符", + zlshoufu_info: + "出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有【箓】的角色的武将牌上,称为【箓】;其不能使用和打出与【箓】同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与【箓】同类型的牌后,将【箓】置入弃牌堆。", + ol_zhangchangpu: "OL张昌蒲", + ol_zhangchangpu_prefix: "OL", + olxingshen: "省身", + olxingshen_info: + "当你受到伤害后,你可以随机摸至多两张牌。若如此做,你获得X个“省”,且下一次发动〖严教〗展示牌时移去所有“省”并多展示等量的牌。(X为你已损失的体力值,且你至多拥有6个“省”)", + caoshuang: "曹爽", + tuogu: "托孤", + tuogu_info: + "限定技,一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能。", + retuogu: "托孤", + retuogu_info: + "一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能并失去上次因〖托孤〗获得的技能。", + shanzhuan: "擅专", + shanzhuan_info: + "①当你对其他角色造成伤害后,若其判定区没有延时类锦囊牌,则你可以将其的一张牌置于其的判定区。若此牌不为延时锦囊牌且此牌为:红色,此牌视为【乐不思蜀】;黑色,此牌视为【兵粮寸断】。②回合结束时,若你本回合内未造成伤害,你可摸一张牌。", + spniluan: "逆乱", + spniluan_info: + "出牌阶段,你可以将一张黑色牌当做【杀】使用。此【杀】使用结算完成后,若你未因此【杀】造成过伤害,则你令此【杀】不计入使用次数。", + spweiwu: "违忤", + spweiwu_info: "出牌阶段限一次,你可以将一张红色牌当无距离限制的【顺手牵羊】使用。", + spmouzhu: "谋诛", + spmouzhu_backup: "谋诛", + spmouzhu_info: + "出牌阶段限一次,你可以选择任意名“距离为1”或“体力值等于你”的其他角色,这些角色依次进行以下结算:交给你一张手牌,然后若其手牌数小于你,则其视为对你使用一张【杀】或【决斗】。", + spyanhuo: "延祸", + spyanhuo_info: "当你死亡时,你可增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。", + xiaoxi: "骁袭", + xiaoxi_info: "当你登场时,你可以视为使用一张【杀】。", + quyi: "麴义", + wolongfengchu: "卧龙凤雏", + youlong: "游龙", + youlong_info: + "转换技,阴,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的普通锦囊牌;阳,每轮限一次,你可以废除你的一个装备栏,视为使用一张未以此法使用过的基本牌。", + luanfeng: "鸾凤", //luanfeng_info_fullinfo:'限定技,一名角色进入濒死状态时,若其体力上限不小于你,你可令其回复至3点体力,恢复其被废除的装备栏,令其手牌补至6-X张(X为以此法恢复的装备栏数量),重置其因“改写”使用过的牌名。若该角色是你,重置你因“游龙”使用过的牌名。', - luanfeng_info:'限定技,一名角色进入濒死状态时,若其体力上限不小于你,你可令其回复至3点体力,恢复其被废除的装备栏,令其手牌补至6-X张(X为以此法恢复的装备栏数量)。若该角色是你,重置你因“游龙”使用过的牌名。', - reluanzhan:'乱战', - reluanzhan_add:'乱战', - reluanzhan_remove:'乱战', - reluanzhan_info:'当你受到或造成伤害后,你获得一个“乱”。当你使用【杀】或黑色普通锦囊牌选择目标后,你可为此牌增加至多X个目标。当你使用这些牌指定第一个目标后,若此牌目标数小于X,则你移去X/2(向上取整)个“乱”。(X为“乱”数)', - zhuixi:'追摄', - zhuixi_info:'锁定技,你使用【杀】的次数上限+1。', - reduanbing:'短兵', - reduanbing_info:'你使用【杀】选择目标后,可以为此【杀】增加一名距离为1的额外目标。你对距离为1的角色使用的【杀】需两张【闪】才能抵消。', - refenxun:'奋迅', - refenxun2:'奋迅', - refenxun_info:'出牌阶段限一次,你可以选择一名其他角色,然后本回合你计算与其的距离视为1;结束阶段开始时,若你未对其造成过伤害,你弃一张牌。', - zongyu:'宗预', - zyqiao:'气傲', - zyqiao_info:'每回合限两次。当你成为其他角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。', - zyqiao_info_guozhan:'每回合限两次。当你成为其他势力的角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。', - chengshang:'承赏', - chengshang_info:'当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。', - chengshang_info_guozhan:'当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。', - panshu:'OL潘淑', - panshu_prefix:'OL', - weiyi:'威仪', - weiyi_info:'每名角色限一次。当有角色受到伤害后,你可选择:①若其体力值不小于你,则其失去1点体力。②若其体力值不大于你且其已受伤,则其回复1点体力。', - jinzhi:'锦织', - jinzhi2:'锦织', - jinzhi_info:'当你需要使用或打出一张基本牌时,你可弃置X+1张颜色相同的牌并摸一张牌,然后视为你使用或打出了此牌。(X为你于本轮内发动此技能的次数)', - yanxiao_card:'言笑', - yanxiao_global:'言笑', - yanxiao_card_info:'判定阶段开始时,你获得判定区内的所有牌。', - gz_huangzu:'黄祖', - huangzu:'OL黄祖', - huangzu_prefix:'OL', - wangong:'挽弓', - wangong2:'挽弓', - wangong_info:'锁定技,当你使用基本牌时,你获得如下效果:当你使用下一张牌时,若此牌为【杀】,则此牌无次数和距离限制且伤害+1。', - huangchengyan:'OL黄承彦', - huangchengyan_prefix:'OL', - guanxu:'观虚', - guanxu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶五张牌中的一张交换。若如此做,你弃置其手牌中三张花色相同的牌。', - yashi:'雅士', - yashi_info:'当你受到一次伤害后,你可选择一项:1. 令伤害来源的非锁定技无效直到其下个回合开始;2. 对一名其他角色发动〖观虚〗。', - olwuniang:'武娘', - olwuniang_info:'每回合限一次,当你于回合内使用的【杀】结算完成后,若此【杀】对应的目标数为1,则你可以令目标角色选择是否对你使用使用【杀】。你于其选择结算完成后摸一张牌,且本回合内使用【杀】的次数上限+1。', - olxushen:'许身', - olxushen_info:'限定技,当你进入濒死状态时,你可将体力回复至1点并获得技能〖镇南〗。然后若场上没有存活的“关索”,则你可以令一名其他男性角色选择是否将一张武将牌替换为“关索”。', - olzhennan:'镇南', - olzhennan2:'镇南', - olzhennan_info:'【南蛮入侵】对你无效。出牌阶段限一次,你可以将任意张手牌当做【南蛮入侵】对等量的角色使用。', - gaogan:'高干', - juguan:'拒关', - juguan_backup:'拒关', - juguan_info:'出牌阶段限一次,你可将一张手牌当【杀】或【决斗】使用。若受到此牌伤害的角色未在你的下回合开始前对你造成过伤害,你的下个摸牌阶段摸牌数+2。', - duxi:'杜袭', - quxi:'驱徙', - quxi_info:'限定技。出牌阶段结束时,你可跳过下个弃牌阶段并选择两名手牌数不同的其他角色。你将武将牌翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。拥有“丰”/“歉”的角色的摸牌阶段额定摸牌数+1/-1。拥有“丰”/“歉”的角色死亡时,或一轮游戏开始时,你可转移“丰”/“歉”。', - bixiong:'避凶', - bixiong2:'避凶', - bixiong_info:'锁定技,当你于弃牌阶段弃置手牌后,其他角色不能使用与这些牌花色相同的牌指定你为目标直到你的下回合开始。', - fuwei:'扶危', - fuwei_info:'每回合限一次。当你的牌被其他角色弃置或获得后,你可从牌堆中获得一张与此牌名称相同的牌(若没有则改为摸一张牌)。', - yuejian:'约俭', - yuejian_info:'每回合限两次。当其他角色对你使用的牌A结算结束后,你可展示所有手牌。若牌A有花色且你的手牌中没有同花色的牌,则你获得牌A对应的所有实体牌。', - ol_dengzhi:'OL邓芝', - ol_dengzhi_prefix:'OL', - olxiuhao:'修好', - olxiuhao_info:'每回合限一次。当你受到其他角色造成的伤害时,或其他角色受到你造成的伤害时,你可防止此伤害,然后令伤害来源摸两张牌。', - olsujian:'素俭', - olsujian_given:'已分配', - olsujian_info:'锁定技。弃牌阶段开始前,你将此阶段的规则改为:{你选择一项:①将所有不为本回合得到的手牌分配给其他角色。②弃置这些手牌,然后弃置一名其他角色等量的牌}。', - ol_wangrong:'OL王荣', - ol_wangrong_prefix:'OL', - olfengzi:'丰姿', - olfengzi_info:'出牌阶段限一次。当你使用有目标的基本牌或普通锦囊牌时,你可弃置一张与此牌类型相同的牌,然后令此牌结算两次。', - oljizhan:'吉占', - oljizhan_info:'摸牌阶段开始时,你可以放弃摸牌。你亮出牌堆顶的一张牌,并猜测牌堆顶的下一张牌点数大于或小于此牌。若你猜对,你可继续重复此流程。然后你获得以此法展示的所有牌。', - olfusong:'赋颂', - olfusong_info:'当你死亡时,你可以选择一名体力上限大于你的其他角色。其选择获得〖吉占〗或〖丰姿〗。', - zuofen:'左棻', - zhaosong:'诏颂', - zhaosong_info:'一名其他角色的摸牌阶段结束时,若其没有因〖诏颂〗而获得的标记,则你可令其正面向上交给你一张手牌。根据此牌的类型,该角色获得对应的标记和效果:
    锦囊牌:“诔”标记。当拥有者进入濒死状态时,其可弃置所有“诔”,将体力回复至1点并摸一张牌。
    装备牌:“赋”标记。拥有者的出牌阶段开始时,其可弃置所有“赋”,弃置一名角色区域内的至多两张牌。
    基本牌:“颂”标记。当使用者使用仅指定一个目标的【杀】时,其可弃置“颂”,为此【杀】增加至多两个目标。', - lisi:'离思', - lisi_info:'当你于回合外使用的牌结算结束后,你可将其交给一名手牌数不大于你的其他角色。', - ol_yangyi:'杨仪', - oljuanxia:'狷狭', - oljuanxia_info:'结束阶段,你可以选择一名其他角色。你依次视为对其使用至多三种单目标普通锦囊牌。然后其下回合结束时,可视为对你使用等量的【杀】。', - oldingcuo:'定措', - oldingcuo_info:'每回合限一次。当你受到或造成伤害后,你可摸两张牌。若这两张牌颜色不同,则你弃置一张手牌。', - fengfangnv:'OL冯妤', - fengfangnv_prefix:'OL', - zhuangshu:'妆梳', - zhuangshu_info:'①游戏开始时,你可将{【琼梳】,【犀梳】,【金梳】}中的一张牌置于装备区。②一名角色的回合开始时,若其宝物区为空,则你可以弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。', - chuiti:'垂涕', - chuiti_info:'每回合限一次。当你或拥有〖妆梳〗牌角色的牌因弃置而进入弃牌堆后,你可使用其中的一张牌。', - zhuangshu_basic:'琼梳', - zhuangshu_basic_bg:'琼', - zhuangshu_basic_info:'当你受到伤害时,你可以弃置X张牌并防止此伤害(X为伤害值)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。', - zhuangshu_trick:'犀梳', - zhuangshu_trick_bg:'犀', - zhuangshu_trick_info:'判定阶段开始前,你可选择:①跳过此阶段。②跳过本回合的弃牌阶段。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。', - zhuangshu_equip:'金梳', - zhuangshu_equip_bg:'金', - zhuangshu_equip_info:'锁定技。出牌阶段结束时,你将手牌摸至手牌上限(至多摸五张)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。', - ol_dongzhao:'OL董昭', - ol_dongzhao_prefix:'OL', - olxianlve:'先略', - olxianlve_info:'①主公的回合开始时,你可声明并记录一个锦囊牌的名称并移除先前的记录。②每回合限一次,其他角色使用〖先略〗记录过的锦囊牌后,你可摸两张牌并可以分配给任意其他角色,然后你可声明并记录一个锦囊牌的名称并移除先前的记录。', - olzaowang:'造王', - olzaowang2:'造王', - olzaowang_info:'限定技。出牌阶段,你可以令一名角色加1点体力上限,回复1点体力并摸三张牌,且获得如下效果:主公死亡时,若其身份为忠臣,则其和主公交换身份牌;其死亡时,若其身份为反贼且伤害来源的身份为主公或忠臣,则以主忠胜利结束本局游戏。', - sp_ol_zhanghe:'SP张郃', - sp_ol_zhanghe_prefix:'SP', - spolzhouxuan:'周旋', - spolzhouxuan_info:'①弃牌阶段开始时,你可将任意张置于武将牌上,称为“旋”(你至多拥有五张“旋”)。②当你使用牌时,你随机将一张“旋”置入弃牌堆,然后摸一张牌(若你的手牌数不为全场唯一最多则额外摸X张牌,X为“旋”数)。③出牌阶段结束时,你将所有“旋”置入弃牌堆。', - wuyan:'吾彦', - lanjiang:'澜疆', - lanjiang_info:'结束阶段,你可以选择所有手牌数不小于你的角色。这些角色依次选择是否令你摸一张牌。然后你可以对其中一名手牌数等于你的角色造成1点伤害,随后令其中一名手牌数小于你的角色摸一张牌。', - ol_zhuling:'OL朱灵', - ol_zhuling_prefix:'OL', - jixian:'急陷', - jixian_info:'摸牌阶段结束时,你可以选择一名满足以下至少一项条件的角色:⒈装备区内有防具牌;⒉拥有的普通技能数大于你;⒊体力值等于体力上限。你视为对其使用一张【杀】,然后摸X张牌(X为其于此【杀】结算前满足的条件数);若此【杀】未造成伤害,则你失去1点体力。', - ol_chendeng:'OL陈登', - ol_chendeng_prefix:'OL', - olfengji:'丰积', - olfengji_info:'摸牌阶段开始时,你选择:⒈本回合摸牌阶段的额定摸牌数-1,且令一名其他角色下回合摸牌阶段的额定摸牌数+2;⒉本回合摸牌阶段的额定摸牌数+1。然后你选择:⒈本回合使用【杀】的次数上限-1,且令一名其他角色下回合使用【杀】的次数上限+2;⒉本回合使用【杀】的次数上限+1。', - tianyu:'田豫', - saodi:'扫狄', - saodi_info:'当你使用【杀】或普通锦囊牌指定唯一其他角色为目标时,你可从逆时针方向和顺时针方向中选择一个你与其之间角色最少的方向。你令该方向下你与其之间的所有能成为此牌额外目标的角色均成为此牌的目标。', - zhuitao:'追讨', - zhuitao_info:'①准备阶段,你可选择一名未被〖追讨〗记录过的其他角色。②你至所有〖追讨〗记录过的角色的距离-1。③当你对一名被〖追讨〗记录过的角色造成伤害时,你从〖追讨〗记录里移除该角色。', - fanjiangzhangda_ab:'范疆张达', - fanjiangzhangda:'范强张达', - yuanchou:'怨仇', - yuanchou_info:'锁定技。当你使用黑色【杀】指定目标角色后或成为黑色【杀】的目标角色后,你令目标角色的防具技能无效直到此【杀】被抵消或造成伤害。', - juesheng:'决生', - juesheng_info:'限定技。出牌阶段,你可视为使用一张【决斗】。当你因此【决斗】造成伤害时,你将伤害值改为X(X为目标角色本局游戏内使用过【杀】的数量且至少为1)且令目标角色获得此技能直到其下回合结束。', - qinghegongzhu:'清河公主', - zengou:'谮构', - zengou_info:'当有角色使用【闪】时,若其在你的攻击范围内,则你可以弃置一张非基本牌或失去1点体力,然后取消此【闪】的目标并获得其对应的实体牌。', - qhzhangji:'长姬', - qhzhangji_info:'一名角色的回合结束时,若你本回合内:造成过伤害,则你可以令其摸两张牌;受到过伤害,则你可以令其弃置两张牌。', - sp_menghuo:'SP孟获', - sp_menghuo_prefix:'SP', - spmanwang:'蛮王', - spmanwang_info:'出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前等量项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。', - sppanqin:'叛侵', - sppanqin_info:'出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项。', - tengfanglan:'OL滕芳兰', - tengfanglan_prefix:'OL', - luochong:'落宠', - luochong_info:'准备阶段开始时/当你于一回合内首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):⒈令一名角色回复1点体力。⒉令一名角色失去1点体力。⒊令一名角色弃置两张牌。⒋令一名角色摸两张牌。', - aichen:'哀尘', - aichen_info:'锁定技。当你进入濒死状态时,若〖落宠〗中的剩余选项数大于1,则你选择移去〖落宠〗中的一个选项。', - weizi:'卫兹', - yuanzi:'援资', - yuanzi_info:'每轮限一次。其他角色的准备阶段开始时,你可将所有手牌交给该角色。若如此做,当该角色于本回合内造成伤害后,若其手牌数不小于你,则你摸两张牌。', - liejie:'烈节', - liejie_info:'当你受到伤害后,你可以弃置至多三张牌,摸等量的牌,然后可弃置伤害来源的至多X张牌(X为你以此法弃置的红色牌的数量)。', - ruiji:'OL芮姬', - ruiji_prefix:'OL', - qiaoli:'巧力', - qiaoli_info:'出牌阶段各限一次,你可以将一张武器牌/非武器装备牌当作【决斗】使用。若此【决斗】对应的实体牌为武器牌,当你以此【决斗】对目标角色造成伤害后,你摸X张牌(X为此牌的攻击范围),且可以将其中任意张牌分配给其他角色;若此【决斗】对应的实体牌不为武器牌,此牌不可被响应,且你于结束阶段从牌堆中获得一张装备牌。', - qiaoli_given:'已分配', - qingliang:'清靓', - qingliang_info:'每回合限一次,当你成为其他角色使用【杀】或伤害类锦囊牌的唯一目标时,你可展示所有手牌,然后选择一项:⒈你与其各摸一张牌,⒉取消此目标,然后弃置你手牌中一种花色的所有牌。', - chixueqingfeng:'赤血青锋', - chixueqingfeng2:'赤血青锋', - chixueqingfeng_info:'锁定技,当你使用【杀】指定目标后,你令目标角色不能使用或打出手牌且防具技能无效直到此【杀】结算结束。', - wushuangfangtianji:'无双方天戟', - wushuangfangtianji_skill:"无双方天戟", - wushuangfangtianji_info:"当你因执行【杀】的效果而造成伤害后,你可选择一项:⒈摸一张牌;⒉弃置目标角色的一张牌。", - guilongzhanyuedao:'鬼龙斩月刀', - guilongzhanyuedao_info:'锁定技,你使用的红色【杀】不可被响应。', - bintieshuangji:'镔铁双戟', - bintieshuangji_skill:'镔铁双戟', - bintieshuangji_info:'当你使用的【杀】被抵消后,你可失去1点体力。获得此【杀】对应的所有实体牌,摸一张牌,且本回合使用【杀】的次数上限+1。', - linglongshimandai:"玲珑狮蛮带", - linglongshimandai_info:"当你成为其他角色使用的牌的唯一目标后,你可以进行判定。若判定结果为♥,则此牌对你无效。", - linglongshimandai_skill:"玲珑狮蛮带", - hongmianbaihuapao_skill:"红棉百花袍", - hongmianbaihuapao:"红棉百花袍", - hongmianbaihuapao_info:"锁定技,当你受到属性伤害时,防止此伤害。", - qimenbagua:'奇门八卦', - qimenbagua_info:'锁定技,【杀】对你无效。', - guofengyupao:'国风玉袍', - guofengyupao_info:'锁定技,你不是其他角色使用普通锦囊牌的合法目标。', - shufazijinguan:'束发紫金冠', - shufazijinguan_skill:"束发紫金冠", - shufazijinguan_info:"准备阶段,你可以对一名其他角色造成1点伤害。", - sanlve:'三略', - sanlve_skill:'三略', - sanlve_info:'锁定技。你的攻击范围+1。你的手牌上限+1。你使用【杀】的次数上限+1。', - zhaogujing:'照骨镜', - zhaogujing_skill:'照骨镜', - zhaogujing_info:'出牌阶段结束时,你可展示手牌中的一张基本牌或普通锦囊牌,然后你视为使用一张牌名和属性与此牌相同的牌。', - xuwangzhimian:'虚妄之冕', - xuwangzhimian_info:'锁定技,摸牌阶段,你令额定摸牌数+2;你的手牌上限-1。', - ol_puyuan:'OL蒲元', - ol_puyuan_prefix:'OL', - olshengong:'神工', - olshengong_info:'出牌阶段每项限一次。你可以弃置一张武器牌/防具牌/其他装备牌,并发起一次“锻造”。然后你从锻造结果中选择一张牌,置于一名角色的装备区内(可替换原装备)。当有因你发动〖神工〗而加入游戏的牌进入弃牌堆后,你将此牌移出游戏,然后你于当前回合结束后摸一张牌。', - olqisi:'奇思', - olqisi_info:'①游戏开始时,你获得两张副类别不同的牌,并将这些牌置入你的装备区。②摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。', - olzhuiji:'追击', - olzhuiji_info:'锁定技。①你至体力值不大于你的角色的距离为1。②当你使用【杀】指定距离为1的角色为目标后,你令其选择一项:⒈弃置一张牌。⒉重铸装备区内的所有牌。', - zhaoyǎn:'OL赵俨', - zhaoyǎn_prefix:'OL', - tongxie:'同协', - tongxie_info:'出牌阶段开始时,你可以选择包括你在内的至多三名角色(你与这些角色均称为“同协角色”)。这些角色中手牌数唯一最少的角色摸一张牌,且你获得如下效果直到你下回合开始:①当有“同协角色”对唯一目标角色使用的【杀】结算结束后,其他“同协角色”可以依次对目标角色使用一张【杀】(无距离和次数限制,且不能再触发此效果)。②当有“同协角色”受到伤害时,其他“同协角色”(本回合内失去过体力的角色除外)可以防止此伤害,失去1点体力。', - jin_zhouchu:'周处', - shanduan:'善断', - shanduan_info:'锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。', - yilie:'义烈', - yilie_info:'每轮每种牌名限一次。你可以将两张颜色相同的手牌当做任意一种基本牌使用。', - caoxiancaohua:'曹宪曹华', - huamu:'化木', - huamu_info:'当你使用手牌后,若此牌和本回合内上一张被使用的牌颜色不同,则你可以将此牌对应的所有{位于处理区或装备区}的实体牌置于你的武将牌上。这些牌中的黑色牌称为“灵杉”,红色牌称为“玉树”。', - qianmeng:'前盟', - qianmeng_info:'锁定技。当有牌移动事件结算结束后,若有角色的“灵杉”和“玉树”数量发生了变化,且二者数量相等或有一项为0,则你摸一张牌。', - liangyuan:'良缘', - liangyuan_info:'每轮每项各限一次。你可以将场上所有的“灵杉”/“玉树”置于处理区,然后将这些牌当做【酒】/【桃】使用。', - jisi:'羁肆', - jisi_info:'限定技。准备阶段,你可以令一名其他角色获得你武将牌上的一个已发动过的其他技能。然后你弃置所有手牌,并视为对其使用一张【杀】(无距离关系的限制)。', - huojun:'OL霍峻', - huojun_prefix:'OL', - qiongshou:'穷守', - qiongshou_info:'锁定技。①游戏开始时,你废除所有装备栏并摸四张牌。②你的手牌上限+4。', - fenrui:'奋锐', - fenrui_info:'结束阶段,你可以弃置一张牌并恢复一个装备栏。系统检索一张对应的装备牌,你使用之。然后你可以选择一名装备区内牌数小于你的其他角色,对其造成X点伤害(X为你与其装备区内的牌数之差,且每局限一次)。', - wangyan:'王衍', - yangkuang:'阳狂', - yangkuang_info:'当你回复体力后,若你的体力值等于体力上限,则你可以视为使用一张【酒】,然后当前回合角色摸一张牌,你摸一张牌。', - cihuang:'雌黄', - cihuang_info:'当有牌被抵消后,若此牌的目标数为1且此牌的使用者A为当前回合角色,则你可以将一张牌当做一张你本轮内未使用过的属性【杀】或单目标锦囊牌对A使用(不可被响应)。', - sanku:'三窟', - sanku_info:'锁定技。①当你进入濒死状态时,你减1点体力上限,然后将体力回复至体力上限。②当你加体力上限前,取消之。', - dengzhong:'邓忠', - dzkanpo:'勘破', - dzkanpo_info:'①当你因执行【杀】的效果而造成伤害后,你可以观看目标角色的手牌,然后获得其中一张与此【杀】花色相同的牌。②每回合限一次,你可以将一张手牌当做【杀】使用。', - dzgengzhan:'更战', - dzgengzhan_info:'①其他角色的出牌阶段限一次,当有【杀】因弃置而进入弃牌堆后,你可以获得这些【杀】。②其他角色的结束阶段,若其本回合内未使用过【杀】,则你下个出牌阶段使用【杀】的次数上限+1。', - xiahouxuan:'夏侯玄', - olhuanfu:'宦浮', - olhuanfu_info:'当你使用【杀】指定第一个目标后,或成为【杀】的目标后,你可以弃置X张牌(X∈[1, 你的体力上限])。此【杀】结算结束后,若此【杀】累计因执行效果而造成的伤害值等于X,则你摸2X张牌。', - olqingyi:'清议', - olqingyi_info:'①出牌阶段限一次,你可以选择至多两名有牌的其他角色。你和这些角色同时弃置一张牌,然后若这些牌类型均相同,则你重复此流程。②结束阶段开始时,若你本回合内发动〖清议①〗弃置的牌包含两种颜色,则你获得每种颜色的牌各一张。', - olzeyue:'迮阅', - olzeyue_info:'限定技。准备阶段,你可以选择一名于你的上个回合结束后对你造成过伤害的角色A及其武将牌上的一个非锁定技B,令A的B失效。然后每轮游戏开始时,A依次视为对你使用X张【杀】(X为B失效状态下经过的完整轮数)。当你因这些【杀】受到伤害后,你令A恢复技能B。', - xindiaodu:"调度", - xindiaodu_info:"①每回合限一次,与你势力相同的角色使用装备牌时,其可以摸一张牌。②出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。", - olhuanshi:'缓释', - olhuanshi_info:'一名角色的判定牌生效前,你可以令其观看你的手牌并选择你的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。', - olhongyuan:'弘援', - olhongyuan_info:'每阶段限一次。当你一次性获得至少两张牌以后,你可以将至多两张牌交给等量名角色。', - olmingzhe:'明哲', - olmingzhe_info:'锁定技。当你于出牌阶段外失去红色牌后,你展示这些牌中所有背面朝上移动的牌(没有则不展示),然后摸一张牌。', - ahuinan:'阿会喃', - jueman:'蟨蛮', - jueman_info:'锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均不为你,你视为使用本回合被使用的第三张基本牌;有且仅有其中之一为你,你摸一张牌。', - ol_liuba:'OL刘巴', - ol_liuba_prefix:'OL', - oltongduo:'统度', - oltongduo_info:'准备阶段,你可以令一名角色交给你一张手牌,然后出牌阶段结束时,你将此牌置于牌堆顶。', - olzhubi:'铸币', - olzhubi_tag:'币', - olzhubi_info:'①出牌阶段限X次(X为你的体力上限)。你可以令一名角色重铸一张牌,以此法获得的牌称为“币”。②一名角色的结束阶段,若其有“币”,其观看牌堆底的五张牌,然后可以用任意“币”交换其中等量张牌。', - ol_furong:'傅肜', - olxiaosi:'效死', - olxiaosi_info:'出牌阶段限一次。你可以选择一名有手牌的其他角色并弃置一张基本牌。若其有可被弃置的基本牌,其弃置一张基本牌。然后你可以以任意顺序使用你与其以此法弃置的牌(无距离和次数限制)。最后若其未以此法弃置牌,你摸一张牌。', - zhangzhi:'张芝', - olbixin:'笔心', - olbixin_info:'一名角色的准备阶段或结束阶段,你可以声明一种牌的类型(每种类型限[1]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[3]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。', - olximo:'洗墨', - olximo_info:'锁定技。当你发动〖笔心〗后,你移除其描述的前五个字符。若你已发动三次〖笔心〗,交换中括号中的两个数字,失去〖洗墨〗并获得〖飞白〗。', - olfeibai:'飞白', - olfeibai_info:'转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。', - olqizhou:'绮冑', - olqizhou_info:'锁定技。每个回合开始前,或当你装备区内的牌发生变化后,你失去所有因此技能获得过的额外技能,然后根据你装备区内的花色数获得对应的技能。至少一种:〖短兵〗、至少两种:〖英姿〗、至少三种:〖奋威〗、至少四种:〖澜江〗。', - olshanxi:'闪袭', - olshanxi_info:'出牌阶段限一次。你可以选择一名攻击范围内不包含你的其他角色,展示你与其的至多X张手牌(X为你的空装备栏数)。若这些牌中有【闪】,则你弃置这些【闪】,然后获得对方的一张未展示的牌。', - macheng:'马承', - olchenglie:'骋烈', - olchenglie_info:'当你使用【杀】选择目标后,你可以令至多两名角色也成为此牌目标,并亮出牌堆顶的等同于目标数张牌,然后你可以将一张手牌与其中一张牌交换,将这些牌扣置于每名目标角色武将牌上,称为“骋烈”牌。此牌结算结束后:1.若有红色“骋烈”牌的角色:响应过此【杀】,其交给你一张牌;未响应此【杀】,其回复1点体力;2.有“骋烈”牌的角色将其“骋烈”牌置入弃牌堆。', - quhuang:'屈晃', - olqiejian:'切谏', - olqiejian_info:'当一名角色失去最后的手牌后,你可以摸一张牌,然后令其摸一张牌,你选择一项:1.弃置你或其场上的一张牌;2.你于本轮不能再对其发动此技能。', - olnishou:'泥首', - olnishou_info:'锁定技。当你装备区里的牌进入弃牌堆后,你选择一项:1.将这些牌中第一张能当【闪电】对你使用的牌当【闪电】使用;2.本阶段结束时,你与一名手牌数最少的角色交换手牌。', - zhanghua:'张华', - olbihun:'弼昏', - olbihun_info:'锁定技。当你使用牌指定其他角色为目标时,若你的手牌数大于手牌上限且若此牌的目标数:大于1,取消此目标;为1,其获得此牌。', - olchuanwu:'穿屋', - olchuanwu_info:'锁定技。当你造成或受到伤害后,你令武将牌上的前X个未失效的技能失效直到回合结束。然后你摸等同于你此次失效的技能数张牌(X为你的攻击范围)。', - oljianhe:'剑合', - oljianhe_info:'出牌阶段每名角色限一次。你可以重铸至少两张同名牌或至少两张装备牌,然后令一名角色选择一项:1.重铸等量张与你以此法重铸的牌类型相同的牌;2.受到你造成的1点雷电伤害。', - dongtuna:'董荼那', - oljianman:'鹣蛮', - oljianman_info:'锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均为你,你视为使用其中的一张牌;有且仅有其中之一为你,你弃置另一名使用者一张牌。', - maxiumatie:'马休马铁', - olkenshang:'垦伤', - olkenshang_info:'你可以将任意张牌当【杀】使用,然后你可以将此牌目标改为所有你攻击范围外的角色。此牌结算结束后,若此牌对应的实体牌数大于X,你摸X张牌(X为此牌造成过的伤害值),否则你失去一个技能。', - rekenshang:'垦伤', - rekenshang_info:'你可以将至少两张牌当【杀】使用,然后你可以将此牌目标改为等量名角色。此牌结算结束后,若此牌对应的实体牌数大于此牌造成过的伤害值,你摸一张牌。', - ol_zhujun:'OL朱儁', - ol_zhujun_prefix:'OL', - olcuipo:'摧破', - olcuipo_info:'锁定技。当你使用牌时,若此牌是你本回合使用的第X张牌(X为此牌牌名的字数),则:{若此牌为【杀】或伤害类锦囊牌,则此牌的伤害值基数+1,否则你摸一张牌}。', - ol_zhangyì:'OL张翼', - ol_zhangyì_prefix:'OL', - oldianjun:'殿军', - oldianjun_info:'锁定技。回合结束时,你受到1点无来源伤害,然后执行一个额外的出牌阶段。', - olkangrui:'亢锐', - olkangrui_info:'当一名角色于其回合内首次受到伤害后,你可以摸一张牌并选择一项:1.令其回复1点体力;2.令其于本回合下次造成的伤害+1。然后当其于本回合造成伤害时,其本回合手牌上限基数为0。', - wangguan:'王瓘', - olmiuyan:'谬焰', - olmiuyan_tag:'invisible', - olmiuyan_info:'转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的手牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。', - olshilu:'失路', - olshilu_info:'锁定技。当你受到伤害后,你摸X张牌(X为你的体力值且至多为5)。然后你展示攻击范围内一名角色的一张手牌,令此牌的牌名视为【杀】。', - ol_huban:'OL胡班', - ol_huban_prefix:'OL', - olhuiyun:'晖云', - olhuiyun_tag:'invisible', - olhuiyun_info:'每轮每项各限一次。你可以将一张牌当【火攻】使用。此牌结算结束后,你选择一项,令目标角色选择是否执行:1.使用展示的牌,然后重铸所有手牌;2.使用一张手牌,然后重铸展示牌;3.摸一张牌。', - sunhong:'孙弘', - olxianbi:'险诐', - olxianbi_info:'出牌阶段限一次。你可以选择一名角色,然后将手牌摸至或弃置至等同于其装备区里的牌数(至多摸五张),且当你因此弃置一张牌后,你随机获得弃牌堆中的另一张类型相同的牌。', - olzenrun:'谮润', - olzenrun_info:'每阶段限一次。当你摸牌时,你可以改为获得一名其他角色等量的牌,然后其选择一项:1.摸等量的牌;2.令你本局游戏不能再对其发动〖险诐〗和〖谮润〗。', - luoxian:'罗宪', - oldaili:'带砺', - oldaili_tag:'带砺', - oldaili_info:'一名角色的回合结束时,若你被展示过的手牌数为偶数,则你可以翻面,摸三张牌并展示之。', - zhangshiping:'张世平', - olhongji:'鸿济', - olhongji_info:'每轮每项各限一次。一名角色的准备阶段,若其手牌数最少/最多,你可以令其于本回合第一个摸牌阶段/出牌阶段后执行一个额外的摸牌阶段/出牌阶段(若其条件同时满足则只能选择一项)。', - olxinggu:'行贾', - olxinggu_info:'①游戏开始时,你将牌堆中的三张坐骑牌扣置于武将牌上。②结束阶段,你可以将一张〖行贾①〗牌置于一名其他角色的装备区,然后你从牌堆获得一张♦牌。', - lushi:'卢氏', - olzhuyan:'驻颜', - olzhuyan_info:'每名角色每项各限一次。结束阶段,你可以令一名角色将以下一项调整至与其上一个结束阶段结束后相同:1.体力值;2.手牌数(体力值至多失去至1,手牌数至多摸至5;若其未执行过准备阶段则改为游戏开始时)。', - olleijie:'雷劫', - olleijie_info:'准备阶段,你可以令一名角色判定,若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。', - releijie:'雷劫', - releijie_info:'出牌阶段限一次,你可以令一名角色判定,若结果为黑桃2~9,则你视为依次对其使用两张雷【杀】,否则其摸两张牌。', - ol_liuyan:'OL刘焉', - ol_liuyan_prefix:'OL', - olpianan:'偏安', - olpianan_info:'锁定技。游戏开始或弃牌阶段结束时,你弃置所有不为【闪】的手牌(没有则不弃)。若你的手牌数小于体力值,你获得牌堆或弃牌堆中的前X张【闪】(X为你的体力值与手牌数的差)。', - olyinji:'殷积', - olyinji_info:'锁定技。结束阶段,若你的体力值不为唯一最大,你选择回复1点体力或加1点体力上限。', - olkuisi:'窥伺', - olkuisi_info:'锁定技。摸牌阶段开始时,你跳过此阶段,然后观看牌堆顶的四张牌并可以使用其中任意张。若你以此法使用的牌数不为2或3,你减1点体力上限。', - ol_wanglang:'OL王朗', - ol_wanglang_prefix:'OL', - oljici:'激词', - oljici_info:'当你的拼点牌亮出后,若点数不大于X,你可令点数+X并令〖鼓舌〗视为未发动过(X为你的“饶舌”标记数)。', - ol_mengda:'OL孟达', - ol_mengda_prefix:'OL', - olgoude:'苟得', - olgoude_info:'一名角色的回合结束时,若有与你势力相同的角色执行过以下项,则你可以执行这些角色未执行过的一项:1.摸一张牌;2.弃置一名角色的一张手牌;3.使用一张无对应实体牌的【杀】;4.变更势力。', - haopu:'郝普', - olzhenying:'镇荧', - olzhenying_info:'出牌阶段限两次。你可以选择一名手牌数不大于你的其他角色,你与其同时将手牌摸或弃置至至多两张。然后你与其中手牌数较少的角色视为对另一名角色使用一张【决斗】。', - ol_wenqin:'文钦', - olguangao:'犷骜', - olguangao_info:'当你/其他角色使用【杀】时,你/该角色可以额外指定一个目标/你为目标(有距离限制)。然后若你的手牌数为偶数,你摸一张牌并令此牌对任意目标无效(可不选)。', - olhuiqi:'彗企', - olhuiqi_info:'觉醒技。一名角色回合结束后,若你与其他两名角色于此回合成为过牌的目标,你获得〖偕举〗并获得一个额外的回合。', - olxieju:'偕举', - olxieju_info:'出牌阶段限一次。你可以令任意名本回合成为过牌的目标的角色依次视为使用一张【杀】。', - ol_zhouqun:'周群', - oltianhou:'天候', - oltianhou_info:'锁定技。准备阶段,你观看牌堆顶的一张牌,且可以用你的一张牌交换此牌。然后你亮出牌堆顶的牌,令一名角色根据此牌的花色获得对应的技能直到你下个准备阶段开始:♠〖骤雨〗;♥〖烈暑〗;♣〖严霜〗;♦〖凝雾〗。', - olchenshuo:'谶说', - olchenshuo_info:'结束阶段,你可以展示一张手牌,然后亮出牌堆顶的一张牌。若这两张牌类型/花色/点数/牌名字数中任一项相同且已展示的牌数小于3,则你重复此流程,然后获得所有所有展示牌。', - oltianhou_spade:'骤雨', - oltianhou_spade_miehuo:'骤雨', - oltianhou_spade_info:'锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。', - oltianhou_heart:'烈暑', - oltianhou_heart_info:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。', - oltianhou_club:'严霜', - oltianhou_club_info:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。', - oltianhou_diamond:'凝雾', - oltianhou_diamond_info:'锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。', - duanjiong:'段颎', - olsaogu:'扫谷', - olsaogu_info:'转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。', - olcuorui:'挫锐', - olcuorui_info:'锁定技。①游戏开始时,你将手牌摸至场上存活人数张(至多摸至8张)。②当你成为延时锦囊牌的目标后,你跳过下个判定阶段。', - olmouzhu:'谋诛', - olmouzhu_info:'出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若其手牌数小于你,其视为使用一张【杀】或【决斗】。', - olyanhuo:'延祸', - olyanhuo_info:'当你死亡时,你可以弃置杀死你的角色至多X张牌(X为你的牌数)。', - olniluan:'逆乱', - olniluan_info:'体力值大于你的其他角色的结束阶段,若其本回合内使用过【杀】,则你可以将一张黑色牌当作【杀】对其使用(无距离限制)。', - olxiaoxi:'骁袭', - olxiaoxi_info:'一轮游戏开始时,你可以视为使用一张无距离限制的【杀】。', - ol_qianzhao:'牵招', - olweifu:'威抚', - olweifu_info:'出牌阶段,你可以弃置一张牌并判定。你本回合下次使用与结果类型相同的牌无距离限制,且可以额外指定一个目标。若你弃置的牌与判定牌类型相同,你摸一张牌。', - olkuansai:'款塞', - olkuansai_info:'每回合限一次,当一张牌指定第一个目标后,若目标数不小于你的体力值,你可以令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。', - ol_luyusheng:'OL陆郁生', - ol_luyusheng_prefix:'OL', - olcangxin:'藏心', - olcangxin_info:'锁定技。①当你每回合第一次受到伤害时,你观看牌堆底的三张牌并弃置其中任意张牌,然后此伤害-X。②摸牌阶段开始时,你亮出牌堆底的三张牌,然后摸X张牌(X为其中红桃牌的数量)。', - olrunwei:'润微', - olrunwei_info:'其他角色的弃牌阶段开始时,若其已受伤,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1;②令其摸一张牌,其本回合手牌上限-1。', - caoxi:'曹羲', - olgangshu:'刚述', - olgangshu_info:'①当你使用非基本牌结算结束后,你可以令以下一项数值+1(每项至多加至5):1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。', - oljianxuan:'谏旋', - oljianxuan_info:'当你受到伤害后,你可以令一名角色摸一张牌,然后若其手牌数等于你〖刚述①〗中的任意一项对应的数值,其重复此流程。', - ol_pengyang:'彭羕', - olxiaofan:'嚣翻', - olxiaofan_info:'当你需要使用不为【无懈可击】的牌时,你可以观看牌堆底的X+1张牌并使用其中的一张。此牌结算结束时,你依次弃置以下前X个区域中的所有牌:⒈判定区、⒉装备区、⒊手牌区(X为本回合你使用过的牌中包含的类型数)。', - oltuishi:'侻失', - oltuishi_info:'锁定技。①你不能使用【无懈可击】。②当你使用点数为字母的牌时,你令此牌无效并摸一张牌,且你对手牌数小于你的角色使用的下一张牌无距离和次数限制。③当你使用伤害类卡牌结算完毕后,若此牌为你本回合使用的第三张或以上未造成伤害的卡牌,则你令〖器翻〗于本回合失效。', - ol_tw_zhangji:'张既', - skill_zhangji_A:'技能', - skill_zhangji_A_info:'出牌阶段限X次(X为你的体力值),当你使用牌指定一名其他角色为目标后,你可以观看其手牌,然后你选择一项:
    1.弃置其一张牌,然后若弃置的牌是能造成火焰伤害的牌,你摸一张牌。
    2.重铸其手牌中的所有【杀】和【决斗】。
    3.若其没有【闪】,你与其互相对对方造成1点伤害。', - skill_zhangji_B:'技能', - skill_zhangji_B_info:'当你受到1点伤害后,你可令一名手牌数小于体力上限的角色摸三张牌,然后其将手牌数弃置至其体力上限数;当你进入濒死状态时,你可令一名其他角色观看五张魏势力武将牌,其可以选择其中一张代替自己的武将牌(体力和体力上限不变)。', - ol_feiyi:'费祎', - yanru:'宴如', - yanru_info:'出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。', - hezhong:'和衷', - hezhong_info:'每回合每项限一次,当你的手牌数变为1后,你可以展示唯一手牌并摸一张牌,然后你选择一项:①本回合使用的下一张点数大于此牌的点数的普通锦囊牌额外结算一次;②本回合使用的下一张点数小于此牌的点数的普通锦囊牌额外结算一次。', - lvboshe:'吕伯奢', - olfushi:'缚豕', - olfushi_info:'①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以将任意张“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。', - oldongdao:'东道', - oldongdao_info:'农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。', - zhangyan:'张燕', - olsuji:'肃疾', - olsuji_info:'一名角色的出牌阶段开始时,若其已受伤,你可以将一张黑色牌当【杀】使用。若其受到此【杀】的伤害,你获得其一张牌。', - ollangdao:'狼蹈', - ollangdao_info:'当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:1.令此【杀】伤害基数+1;2.令你可以为此【杀】多选择一个目标;3.令此【杀】不可被响应。然后若没有角色因此【杀】死亡,你移除本次被选择的项。', - ol_dingshangwan:'OL丁尚涴', - ol_dingshangwan_prefix:'OL', - olfudao:'抚悼', - olfudao_info:'①游戏开始时,你摸三张牌,然后可以将至多三张手牌交给一名其他角色,然后可以弃置任意张手牌,最后记录你的手牌数。②一名角色的回合结束时,若其手牌数和你发动〖抚悼①〗记录的数值相同,则你可以与其各摸一张牌。', - olfengyan:'讽言', - olfengyan_info:'锁定技。当你受到其他角色造成的伤害后或响应其他角色使用的牌时,你选择一项:①摸一张牌,然后交给其一张牌。②令其摸一张牌,然后其弃置两张牌。', - ol_liwan:'OL李婉', - ol_liwan_prefix:'OL', - ollianju:'联句', - ollianju_info:'结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,然后若A与B的牌名相同,则你失去1点体力;若A与B的牌名不同,则你可以视为使用A。', - olsilv:'思闾', - olsilv_info:'锁定技,每回合每项限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。', - xueji_old:'血祭', - xueji_old_info:'出牌阶段限一次,你可以弃置一张红色牌并对攻击范围内的至多X名角色各造成1点伤害(X为你已损失的体力值),然后这些角色各摸一张牌。', - oldhuxiao:'虎啸', - oldhuxiao_info:'锁定技,当你使用的【杀】被【闪】抵消后,你令此【杀】不计入使用次数。', - oldwuji:'武继', - oldwuji_info:'觉醒技,结束阶段,若你本回合造成了3点或更多伤害,你加1点体力上限并回复1点体力,并失去技能〖虎啸〗。', - olfeiyang:'飞扬', + luanfeng_info: + "限定技,一名角色进入濒死状态时,若其体力上限不小于你,你可令其回复至3点体力,恢复其被废除的装备栏,令其手牌补至6-X张(X为以此法恢复的装备栏数量)。若该角色是你,重置你因“游龙”使用过的牌名。", + reluanzhan: "乱战", + reluanzhan_add: "乱战", + reluanzhan_remove: "乱战", + reluanzhan_info: + "当你受到或造成伤害后,你获得一个“乱”。当你使用【杀】或黑色普通锦囊牌选择目标后,你可为此牌增加至多X个目标。当你使用这些牌指定第一个目标后,若此牌目标数小于X,则你移去X/2(向上取整)个“乱”。(X为“乱”数)", + zhuixi: "追摄", + zhuixi_info: "锁定技,你使用【杀】的次数上限+1。", + reduanbing: "短兵", + reduanbing_info: + "你使用【杀】选择目标后,可以为此【杀】增加一名距离为1的额外目标。你对距离为1的角色使用的【杀】需两张【闪】才能抵消。", + refenxun: "奋迅", + refenxun2: "奋迅", + refenxun_info: + "出牌阶段限一次,你可以选择一名其他角色,然后本回合你计算与其的距离视为1;结束阶段开始时,若你未对其造成过伤害,你弃一张牌。", + zongyu: "宗预", + zyqiao: "气傲", + zyqiao_info: + "每回合限两次。当你成为其他角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。", + zyqiao_info_guozhan: + "每回合限两次。当你成为其他势力的角色使用牌的目标后,你可以弃置其一张牌,然后你弃置一张牌。", + chengshang: "承赏", + chengshang_info: + "当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。", + chengshang_info_guozhan: + "当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗得到过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。", + panshu: "OL潘淑", + panshu_prefix: "OL", + weiyi: "威仪", + weiyi_info: + "每名角色限一次。当有角色受到伤害后,你可选择:①若其体力值不小于你,则其失去1点体力。②若其体力值不大于你且其已受伤,则其回复1点体力。", + jinzhi: "锦织", + jinzhi2: "锦织", + jinzhi_info: + "当你需要使用或打出一张基本牌时,你可弃置X+1张颜色相同的牌并摸一张牌,然后视为你使用或打出了此牌。(X为你于本轮内发动此技能的次数)", + yanxiao_card: "言笑", + yanxiao_global: "言笑", + yanxiao_card_info: "判定阶段开始时,你获得判定区内的所有牌。", + gz_huangzu: "黄祖", + huangzu: "OL黄祖", + huangzu_prefix: "OL", + wangong: "挽弓", + wangong2: "挽弓", + wangong_info: + "锁定技,当你使用基本牌时,你获得如下效果:当你使用下一张牌时,若此牌为【杀】,则此牌无次数和距离限制且伤害+1。", + huangchengyan: "OL黄承彦", + huangchengyan_prefix: "OL", + guanxu: "观虚", + guanxu_info: + "出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶五张牌中的一张交换。若如此做,你弃置其手牌中三张花色相同的牌。", + yashi: "雅士", + yashi_info: + "当你受到一次伤害后,你可选择一项:1. 令伤害来源的非锁定技无效直到其下个回合开始;2. 对一名其他角色发动〖观虚〗。", + olwuniang: "武娘", + olwuniang_info: + "每回合限一次,当你于回合内使用的【杀】结算完成后,若此【杀】对应的目标数为1,则你可以令目标角色选择是否对你使用使用【杀】。你于其选择结算完成后摸一张牌,且本回合内使用【杀】的次数上限+1。", + olxushen: "许身", + olxushen_info: + "限定技,当你进入濒死状态时,你可将体力回复至1点并获得技能〖镇南〗。然后若场上没有存活的“关索”,则你可以令一名其他男性角色选择是否将一张武将牌替换为“关索”。", + olzhennan: "镇南", + olzhennan2: "镇南", + olzhennan_info: + "【南蛮入侵】对你无效。出牌阶段限一次,你可以将任意张手牌当做【南蛮入侵】对等量的角色使用。", + gaogan: "高干", + juguan: "拒关", + juguan_backup: "拒关", + juguan_info: + "出牌阶段限一次,你可将一张手牌当【杀】或【决斗】使用。若受到此牌伤害的角色未在你的下回合开始前对你造成过伤害,你的下个摸牌阶段摸牌数+2。", + duxi: "杜袭", + quxi: "驱徙", + quxi_info: + "限定技。出牌阶段结束时,你可跳过下个弃牌阶段并选择两名手牌数不同的其他角色。你将武将牌翻至背面,令这两名角色中手牌数较少的角色获得另一名角色的一张牌并获得一枚“丰”,另一名角色获得一枚“歉”。拥有“丰”/“歉”的角色的摸牌阶段额定摸牌数+1/-1。拥有“丰”/“歉”的角色死亡时,或一轮游戏开始时,你可转移“丰”/“歉”。", + bixiong: "避凶", + bixiong2: "避凶", + bixiong_info: + "锁定技,当你于弃牌阶段弃置手牌后,其他角色不能使用与这些牌花色相同的牌指定你为目标直到你的下回合开始。", + fuwei: "扶危", + fuwei_info: + "每回合限一次。当你的牌被其他角色弃置或获得后,你可从牌堆中获得一张与此牌名称相同的牌(若没有则改为摸一张牌)。", + yuejian: "约俭", + yuejian_info: + "每回合限两次。当其他角色对你使用的牌A结算结束后,你可展示所有手牌。若牌A有花色且你的手牌中没有同花色的牌,则你获得牌A对应的所有实体牌。", + ol_dengzhi: "OL邓芝", + ol_dengzhi_prefix: "OL", + olxiuhao: "修好", + olxiuhao_info: + "每回合限一次。当你受到其他角色造成的伤害时,或其他角色受到你造成的伤害时,你可防止此伤害,然后令伤害来源摸两张牌。", + olsujian: "素俭", + olsujian_given: "已分配", + olsujian_info: + "锁定技。弃牌阶段开始前,你将此阶段的规则改为:{你选择一项:①将所有不为本回合得到的手牌分配给其他角色。②弃置这些手牌,然后弃置一名其他角色等量的牌}。", + ol_wangrong: "OL王荣", + ol_wangrong_prefix: "OL", + olfengzi: "丰姿", + olfengzi_info: + "出牌阶段限一次。当你使用有目标的基本牌或普通锦囊牌时,你可弃置一张与此牌类型相同的牌,然后令此牌结算两次。", + oljizhan: "吉占", + oljizhan_info: + "摸牌阶段开始时,你可以放弃摸牌。你亮出牌堆顶的一张牌,并猜测牌堆顶的下一张牌点数大于或小于此牌。若你猜对,你可继续重复此流程。然后你获得以此法展示的所有牌。", + olfusong: "赋颂", + olfusong_info: + "当你死亡时,你可以选择一名体力上限大于你的其他角色。其选择获得〖吉占〗或〖丰姿〗。", + zuofen: "左棻", + zhaosong: "诏颂", + zhaosong_info: + "一名其他角色的摸牌阶段结束时,若其没有因〖诏颂〗而获得的标记,则你可令其正面向上交给你一张手牌。根据此牌的类型,该角色获得对应的标记和效果:
    锦囊牌:“诔”标记。当拥有者进入濒死状态时,其可弃置所有“诔”,将体力回复至1点并摸一张牌。
    装备牌:“赋”标记。拥有者的出牌阶段开始时,其可弃置所有“赋”,弃置一名角色区域内的至多两张牌。
    基本牌:“颂”标记。当使用者使用仅指定一个目标的【杀】时,其可弃置“颂”,为此【杀】增加至多两个目标。", + lisi: "离思", + lisi_info: "当你于回合外使用的牌结算结束后,你可将其交给一名手牌数不大于你的其他角色。", + ol_yangyi: "杨仪", + oljuanxia: "狷狭", + oljuanxia_info: + "结束阶段,你可以选择一名其他角色。你依次视为对其使用至多三种单目标普通锦囊牌。然后其下回合结束时,可视为对你使用等量的【杀】。", + oldingcuo: "定措", + oldingcuo_info: + "每回合限一次。当你受到或造成伤害后,你可摸两张牌。若这两张牌颜色不同,则你弃置一张手牌。", + fengfangnv: "OL冯妤", + fengfangnv_prefix: "OL", + zhuangshu: "妆梳", + zhuangshu_info: + "①游戏开始时,你可将{【琼梳】,【犀梳】,【金梳】}中的一张牌置于装备区。②一名角色的回合开始时,若其宝物区为空,则你可以弃置一张牌,并根据此牌的类型,按如下关系将一张宝物牌置入该角色的装备区:{<基本牌,【琼梳】>,<锦囊牌,【犀梳】>,<装备牌,【金梳】>}。", + chuiti: "垂涕", + chuiti_info: + "每回合限一次。当你或拥有〖妆梳〗牌角色的牌因弃置而进入弃牌堆后,你可使用其中的一张牌。", + zhuangshu_basic: "琼梳", + zhuangshu_basic_bg: "琼", + zhuangshu_basic_info: + "当你受到伤害时,你可以弃置X张牌并防止此伤害(X为伤害值)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", + zhuangshu_trick: "犀梳", + zhuangshu_trick_bg: "犀", + zhuangshu_trick_info: + "判定阶段开始前,你可选择:①跳过此阶段。②跳过本回合的弃牌阶段。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", + zhuangshu_equip: "金梳", + zhuangshu_equip_bg: "金", + zhuangshu_equip_info: + "锁定技。出牌阶段结束时,你将手牌摸至手牌上限(至多摸五张)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。", + ol_dongzhao: "OL董昭", + ol_dongzhao_prefix: "OL", + olxianlve: "先略", + olxianlve_info: + "①主公的回合开始时,你可声明并记录一个锦囊牌的名称并移除先前的记录。②每回合限一次,其他角色使用〖先略〗记录过的锦囊牌后,你可摸两张牌并可以分配给任意其他角色,然后你可声明并记录一个锦囊牌的名称并移除先前的记录。", + olzaowang: "造王", + olzaowang2: "造王", + olzaowang_info: + "限定技。出牌阶段,你可以令一名角色加1点体力上限,回复1点体力并摸三张牌,且获得如下效果:主公死亡时,若其身份为忠臣,则其和主公交换身份牌;其死亡时,若其身份为反贼且伤害来源的身份为主公或忠臣,则以主忠胜利结束本局游戏。", + sp_ol_zhanghe: "SP张郃", + sp_ol_zhanghe_prefix: "SP", + spolzhouxuan: "周旋", + spolzhouxuan_info: + "①弃牌阶段开始时,你可将任意张置于武将牌上,称为“旋”(你至多拥有五张“旋”)。②当你使用牌时,你随机将一张“旋”置入弃牌堆,然后摸一张牌(若你的手牌数不为全场唯一最多则额外摸X张牌,X为“旋”数)。③出牌阶段结束时,你将所有“旋”置入弃牌堆。", + wuyan: "吾彦", + lanjiang: "澜疆", + lanjiang_info: + "结束阶段,你可以选择所有手牌数不小于你的角色。这些角色依次选择是否令你摸一张牌。然后你可以对其中一名手牌数等于你的角色造成1点伤害,随后令其中一名手牌数小于你的角色摸一张牌。", + ol_zhuling: "OL朱灵", + ol_zhuling_prefix: "OL", + jixian: "急陷", + jixian_info: + "摸牌阶段结束时,你可以选择一名满足以下至少一项条件的角色:⒈装备区内有防具牌;⒉拥有的普通技能数大于你;⒊体力值等于体力上限。你视为对其使用一张【杀】,然后摸X张牌(X为其于此【杀】结算前满足的条件数);若此【杀】未造成伤害,则你失去1点体力。", + ol_chendeng: "OL陈登", + ol_chendeng_prefix: "OL", + olfengji: "丰积", + olfengji_info: + "摸牌阶段开始时,你选择:⒈本回合摸牌阶段的额定摸牌数-1,且令一名其他角色下回合摸牌阶段的额定摸牌数+2;⒉本回合摸牌阶段的额定摸牌数+1。然后你选择:⒈本回合使用【杀】的次数上限-1,且令一名其他角色下回合使用【杀】的次数上限+2;⒉本回合使用【杀】的次数上限+1。", + tianyu: "田豫", + saodi: "扫狄", + saodi_info: + "当你使用【杀】或普通锦囊牌指定唯一其他角色为目标时,你可从逆时针方向和顺时针方向中选择一个你与其之间角色最少的方向。你令该方向下你与其之间的所有能成为此牌额外目标的角色均成为此牌的目标。", + zhuitao: "追讨", + zhuitao_info: + "①准备阶段,你可选择一名未被〖追讨〗记录过的其他角色。②你至所有〖追讨〗记录过的角色的距离-1。③当你对一名被〖追讨〗记录过的角色造成伤害时,你从〖追讨〗记录里移除该角色。", + fanjiangzhangda_ab: "范疆张达", + fanjiangzhangda: "范强张达", + yuanchou: "怨仇", + yuanchou_info: + "锁定技。当你使用黑色【杀】指定目标角色后或成为黑色【杀】的目标角色后,你令目标角色的防具技能无效直到此【杀】被抵消或造成伤害。", + juesheng: "决生", + juesheng_info: + "限定技。出牌阶段,你可视为使用一张【决斗】。当你因此【决斗】造成伤害时,你将伤害值改为X(X为目标角色本局游戏内使用过【杀】的数量且至少为1)且令目标角色获得此技能直到其下回合结束。", + qinghegongzhu: "清河公主", + zengou: "谮构", + zengou_info: + "当有角色使用【闪】时,若其在你的攻击范围内,则你可以弃置一张非基本牌或失去1点体力,然后取消此【闪】的目标并获得其对应的实体牌。", + qhzhangji: "长姬", + qhzhangji_info: + "一名角色的回合结束时,若你本回合内:造成过伤害,则你可以令其摸两张牌;受到过伤害,则你可以令其弃置两张牌。", + sp_menghuo: "SP孟获", + sp_menghuo_prefix: "SP", + spmanwang: "蛮王", + spmanwang_info: + "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前等量项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。", + sppanqin: "叛侵", + sppanqin_info: + "出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项。", + tengfanglan: "OL滕芳兰", + tengfanglan_prefix: "OL", + luochong: "落宠", + luochong_info: + "准备阶段开始时/当你于一回合内首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):⒈令一名角色回复1点体力。⒉令一名角色失去1点体力。⒊令一名角色弃置两张牌。⒋令一名角色摸两张牌。", + aichen: "哀尘", + aichen_info: + "锁定技。当你进入濒死状态时,若〖落宠〗中的剩余选项数大于1,则你选择移去〖落宠〗中的一个选项。", + weizi: "卫兹", + yuanzi: "援资", + yuanzi_info: + "每轮限一次。其他角色的准备阶段开始时,你可将所有手牌交给该角色。若如此做,当该角色于本回合内造成伤害后,若其手牌数不小于你,则你摸两张牌。", + liejie: "烈节", + liejie_info: + "当你受到伤害后,你可以弃置至多三张牌,摸等量的牌,然后可弃置伤害来源的至多X张牌(X为你以此法弃置的红色牌的数量)。", + ruiji: "OL芮姬", + ruiji_prefix: "OL", + qiaoli: "巧力", + qiaoli_info: + "出牌阶段各限一次,你可以将一张武器牌/非武器装备牌当作【决斗】使用。若此【决斗】对应的实体牌为武器牌,当你以此【决斗】对目标角色造成伤害后,你摸X张牌(X为此牌的攻击范围),且可以将其中任意张牌分配给其他角色;若此【决斗】对应的实体牌不为武器牌,此牌不可被响应,且你于结束阶段从牌堆中获得一张装备牌。", + qiaoli_given: "已分配", + qingliang: "清靓", + qingliang_info: + "每回合限一次,当你成为其他角色使用【杀】或伤害类锦囊牌的唯一目标时,你可展示所有手牌,然后选择一项:⒈你与其各摸一张牌,⒉取消此目标,然后弃置你手牌中一种花色的所有牌。", + chixueqingfeng: "赤血青锋", + chixueqingfeng2: "赤血青锋", + chixueqingfeng_info: + "锁定技,当你使用【杀】指定目标后,你令目标角色不能使用或打出手牌且防具技能无效直到此【杀】结算结束。", + wushuangfangtianji: "无双方天戟", + wushuangfangtianji_skill: "无双方天戟", + wushuangfangtianji_info: + "当你因执行【杀】的效果而造成伤害后,你可选择一项:⒈摸一张牌;⒉弃置目标角色的一张牌。", + guilongzhanyuedao: "鬼龙斩月刀", + guilongzhanyuedao_info: "锁定技,你使用的红色【杀】不可被响应。", + bintieshuangji: "镔铁双戟", + bintieshuangji_skill: "镔铁双戟", + bintieshuangji_info: + "当你使用的【杀】被抵消后,你可失去1点体力。获得此【杀】对应的所有实体牌,摸一张牌,且本回合使用【杀】的次数上限+1。", + linglongshimandai: "玲珑狮蛮带", + linglongshimandai_info: + "当你成为其他角色使用的牌的唯一目标后,你可以进行判定。若判定结果为♥,则此牌对你无效。", + linglongshimandai_skill: "玲珑狮蛮带", + hongmianbaihuapao_skill: "红棉百花袍", + hongmianbaihuapao: "红棉百花袍", + hongmianbaihuapao_info: "锁定技,当你受到属性伤害时,防止此伤害。", + qimenbagua: "奇门八卦", + qimenbagua_info: "锁定技,【杀】对你无效。", + guofengyupao: "国风玉袍", + guofengyupao_info: "锁定技,你不是其他角色使用普通锦囊牌的合法目标。", + shufazijinguan: "束发紫金冠", + shufazijinguan_skill: "束发紫金冠", + shufazijinguan_info: "准备阶段,你可以对一名其他角色造成1点伤害。", + sanlve: "三略", + sanlve_skill: "三略", + sanlve_info: "锁定技。你的攻击范围+1。你的手牌上限+1。你使用【杀】的次数上限+1。", + zhaogujing: "照骨镜", + zhaogujing_skill: "照骨镜", + zhaogujing_info: + "出牌阶段结束时,你可展示手牌中的一张基本牌或普通锦囊牌,然后你视为使用一张牌名和属性与此牌相同的牌。", + xuwangzhimian: "虚妄之冕", + xuwangzhimian_info: "锁定技,摸牌阶段,你令额定摸牌数+2;你的手牌上限-1。", + ol_puyuan: "OL蒲元", + ol_puyuan_prefix: "OL", + olshengong: "神工", + olshengong_info: + "出牌阶段每项限一次。你可以弃置一张武器牌/防具牌/其他装备牌,并发起一次“锻造”。然后你从锻造结果中选择一张牌,置于一名角色的装备区内(可替换原装备)。当有因你发动〖神工〗而加入游戏的牌进入弃牌堆后,你将此牌移出游戏,然后你于当前回合结束后摸一张牌。", + olqisi: "奇思", + olqisi_info: + "①游戏开始时,你获得两张副类别不同的牌,并将这些牌置入你的装备区。②摸牌阶段开始时,你可以少摸一张牌并声明一种装备牌的副类别,然后从牌堆或弃牌堆中获得一张该副类别的牌。", + olzhuiji: "追击", + olzhuiji_info: + "锁定技。①你至体力值不大于你的角色的距离为1。②当你使用【杀】指定距离为1的角色为目标后,你令其选择一项:⒈弃置一张牌。⒉重铸装备区内的所有牌。", + zhaoyǎn: "OL赵俨", + zhaoyǎn_prefix: "OL", + tongxie: "同协", + tongxie_info: + "出牌阶段开始时,你可以选择包括你在内的至多三名角色(你与这些角色均称为“同协角色”)。这些角色中手牌数唯一最少的角色摸一张牌,且你获得如下效果直到你下回合开始:①当有“同协角色”对唯一目标角色使用的【杀】结算结束后,其他“同协角色”可以依次对目标角色使用一张【杀】(无距离和次数限制,且不能再触发此效果)。②当有“同协角色”受到伤害时,其他“同协角色”(本回合内失去过体力的角色除外)可以防止此伤害,失去1点体力。", + jin_zhouchu: "周处", + shanduan: "善断", + shanduan_info: + "锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。", + yilie: "义烈", + yilie_info: "每轮每种牌名限一次。你可以将两张颜色相同的手牌当做任意一种基本牌使用。", + caoxiancaohua: "曹宪曹华", + huamu: "化木", + huamu_info: + "当你使用手牌后,若此牌和本回合内上一张被使用的牌颜色不同,则你可以将此牌对应的所有{位于处理区或装备区}的实体牌置于你的武将牌上。这些牌中的黑色牌称为“灵杉”,红色牌称为“玉树”。", + qianmeng: "前盟", + qianmeng_info: + "锁定技。当有牌移动事件结算结束后,若有角色的“灵杉”和“玉树”数量发生了变化,且二者数量相等或有一项为0,则你摸一张牌。", + liangyuan: "良缘", + liangyuan_info: + "每轮每项各限一次。你可以将场上所有的“灵杉”/“玉树”置于处理区,然后将这些牌当做【酒】/【桃】使用。", + jisi: "羁肆", + jisi_info: + "限定技。准备阶段,你可以令一名其他角色获得你武将牌上的一个已发动过的其他技能。然后你弃置所有手牌,并视为对其使用一张【杀】(无距离关系的限制)。", + huojun: "OL霍峻", + huojun_prefix: "OL", + qiongshou: "穷守", + qiongshou_info: "锁定技。①游戏开始时,你废除所有装备栏并摸四张牌。②你的手牌上限+4。", + fenrui: "奋锐", + fenrui_info: + "结束阶段,你可以弃置一张牌并恢复一个装备栏。系统检索一张对应的装备牌,你使用之。然后你可以选择一名装备区内牌数小于你的其他角色,对其造成X点伤害(X为你与其装备区内的牌数之差,且每局限一次)。", + wangyan: "王衍", + yangkuang: "阳狂", + yangkuang_info: + "当你回复体力后,若你的体力值等于体力上限,则你可以视为使用一张【酒】,然后当前回合角色摸一张牌,你摸一张牌。", + cihuang: "雌黄", + cihuang_info: + "当有牌被抵消后,若此牌的目标数为1且此牌的使用者A为当前回合角色,则你可以将一张牌当做一张你本轮内未使用过的属性【杀】或单目标锦囊牌对A使用(不可被响应)。", + sanku: "三窟", + sanku_info: + "锁定技。①当你进入濒死状态时,你减1点体力上限,然后将体力回复至体力上限。②当你加体力上限前,取消之。", + dengzhong: "邓忠", + dzkanpo: "勘破", + dzkanpo_info: + "①当你因执行【杀】的效果而造成伤害后,你可以观看目标角色的手牌,然后获得其中一张与此【杀】花色相同的牌。②每回合限一次,你可以将一张手牌当做【杀】使用。", + dzgengzhan: "更战", + dzgengzhan_info: + "①其他角色的出牌阶段限一次,当有【杀】因弃置而进入弃牌堆后,你可以获得这些【杀】。②其他角色的结束阶段,若其本回合内未使用过【杀】,则你下个出牌阶段使用【杀】的次数上限+1。", + xiahouxuan: "夏侯玄", + olhuanfu: "宦浮", + olhuanfu_info: + "当你使用【杀】指定第一个目标后,或成为【杀】的目标后,你可以弃置X张牌(X∈[1, 你的体力上限])。此【杀】结算结束后,若此【杀】累计因执行效果而造成的伤害值等于X,则你摸2X张牌。", + olqingyi: "清议", + olqingyi_info: + "①出牌阶段限一次,你可以选择至多两名有牌的其他角色。你和这些角色同时弃置一张牌,然后若这些牌类型均相同,则你重复此流程。②结束阶段开始时,若你本回合内发动〖清议①〗弃置的牌包含两种颜色,则你获得每种颜色的牌各一张。", + olzeyue: "迮阅", + olzeyue_info: + "限定技。准备阶段,你可以选择一名于你的上个回合结束后对你造成过伤害的角色A及其武将牌上的一个非锁定技B,令A的B失效。然后每轮游戏开始时,A依次视为对你使用X张【杀】(X为B失效状态下经过的完整轮数)。当你因这些【杀】受到伤害后,你令A恢复技能B。", + xindiaodu: "调度", + xindiaodu_info: + "①每回合限一次,与你势力相同的角色使用装备牌时,其可以摸一张牌。②出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。", + olhuanshi: "缓释", + olhuanshi_info: + "一名角色的判定牌生效前,你可以令其观看你的手牌并选择你的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。", + olhongyuan: "弘援", + olhongyuan_info: "每阶段限一次。当你一次性获得至少两张牌以后,你可以将至多两张牌交给等量名角色。", + olmingzhe: "明哲", + olmingzhe_info: + "锁定技。当你于出牌阶段外失去红色牌后,你展示这些牌中所有背面朝上移动的牌(没有则不展示),然后摸一张牌。", + ahuinan: "阿会喃", + jueman: "蟨蛮", + jueman_info: + "锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均不为你,你视为使用本回合被使用的第三张基本牌;有且仅有其中之一为你,你摸一张牌。", + ol_liuba: "OL刘巴", + ol_liuba_prefix: "OL", + oltongduo: "统度", + oltongduo_info: + "准备阶段,你可以令一名角色交给你一张手牌,然后出牌阶段结束时,你将此牌置于牌堆顶。", + olzhubi: "铸币", + olzhubi_tag: "币", + olzhubi_info: + "①出牌阶段限X次(X为你的体力上限)。你可以令一名角色重铸一张牌,以此法获得的牌称为“币”。②一名角色的结束阶段,若其有“币”,其观看牌堆底的五张牌,然后可以用任意“币”交换其中等量张牌。", + ol_furong: "傅肜", + olxiaosi: "效死", + olxiaosi_info: + "出牌阶段限一次。你可以选择一名有手牌的其他角色并弃置一张基本牌。若其有可被弃置的基本牌,其弃置一张基本牌。然后你可以以任意顺序使用你与其以此法弃置的牌(无距离和次数限制)。最后若其未以此法弃置牌,你摸一张牌。", + zhangzhi: "张芝", + olbixin: "笔心", + olbixin_info: + "一名角色的准备阶段或结束阶段,你可以声明一种牌的类型(每种类型限[1]次),并选择一种你本轮未使用过且有合法目标的的基本牌。你摸[3]张牌,然后若你有此类型的手牌,你将所有此类型的手牌当此基本牌使用。", + olximo: "洗墨", + olximo_info: + "锁定技。当你发动〖笔心〗后,你移除其描述的前五个字符。若你已发动三次〖笔心〗,交换中括号中的两个数字,失去〖洗墨〗并获得〖飞白〗。", + olfeibai: "飞白", + olfeibai_info: + "转换技,锁定技。阴:当你因执行你使用的非黑色牌的效果而造成伤害时,此伤害值+1;阳:当你因执行你使用的非红色牌的效果而回复体力时,此回复值+1。", + olqizhou: "绮冑", + olqizhou_info: + "锁定技。每个回合开始前,或当你装备区内的牌发生变化后,你失去所有因此技能获得过的额外技能,然后根据你装备区内的花色数获得对应的技能。至少一种:〖短兵〗、至少两种:〖英姿〗、至少三种:〖奋威〗、至少四种:〖澜江〗。", + olshanxi: "闪袭", + olshanxi_info: + "出牌阶段限一次。你可以选择一名攻击范围内不包含你的其他角色,展示你与其的至多X张手牌(X为你的空装备栏数)。若这些牌中有【闪】,则你弃置这些【闪】,然后获得对方的一张未展示的牌。", + macheng: "马承", + olchenglie: "骋烈", + olchenglie_info: + "当你使用【杀】选择目标后,你可以令至多两名角色也成为此牌目标,并亮出牌堆顶的等同于目标数张牌,然后你可以将一张手牌与其中一张牌交换,将这些牌扣置于每名目标角色武将牌上,称为“骋烈”牌。此牌结算结束后:1.若有红色“骋烈”牌的角色:响应过此【杀】,其交给你一张牌;未响应此【杀】,其回复1点体力;2.有“骋烈”牌的角色将其“骋烈”牌置入弃牌堆。", + quhuang: "屈晃", + olqiejian: "切谏", + olqiejian_info: + "当一名角色失去最后的手牌后,你可以摸一张牌,然后令其摸一张牌,你选择一项:1.弃置你或其场上的一张牌;2.你于本轮不能再对其发动此技能。", + olnishou: "泥首", + olnishou_info: + "锁定技。当你装备区里的牌进入弃牌堆后,你选择一项:1.将这些牌中第一张能当【闪电】对你使用的牌当【闪电】使用;2.本阶段结束时,你与一名手牌数最少的角色交换手牌。", + zhanghua: "张华", + olbihun: "弼昏", + olbihun_info: + "锁定技。当你使用牌指定其他角色为目标时,若你的手牌数大于手牌上限且若此牌的目标数:大于1,取消此目标;为1,其获得此牌。", + olchuanwu: "穿屋", + olchuanwu_info: + "锁定技。当你造成或受到伤害后,你令武将牌上的前X个未失效的技能失效直到回合结束。然后你摸等同于你此次失效的技能数张牌(X为你的攻击范围)。", + oljianhe: "剑合", + oljianhe_info: + "出牌阶段每名角色限一次。你可以重铸至少两张同名牌或至少两张装备牌,然后令一名角色选择一项:1.重铸等量张与你以此法重铸的牌类型相同的牌;2.受到你造成的1点雷电伤害。", + dongtuna: "董荼那", + oljianman: "鹣蛮", + oljianman_info: + "锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均为你,你视为使用其中的一张牌;有且仅有其中之一为你,你弃置另一名使用者一张牌。", + maxiumatie: "马休马铁", + olkenshang: "垦伤", + olkenshang_info: + "你可以将任意张牌当【杀】使用,然后你可以将此牌目标改为所有你攻击范围外的角色。此牌结算结束后,若此牌对应的实体牌数大于X,你摸X张牌(X为此牌造成过的伤害值),否则你失去一个技能。", + rekenshang: "垦伤", + rekenshang_info: + "你可以将至少两张牌当【杀】使用,然后你可以将此牌目标改为等量名角色。此牌结算结束后,若此牌对应的实体牌数大于此牌造成过的伤害值,你摸一张牌。", + ol_zhujun: "OL朱儁", + ol_zhujun_prefix: "OL", + olcuipo: "摧破", + olcuipo_info: + "锁定技。当你使用牌时,若此牌是你本回合使用的第X张牌(X为此牌牌名的字数),则:{若此牌为【杀】或伤害类锦囊牌,则此牌的伤害值基数+1,否则你摸一张牌}。", + ol_zhangyì: "OL张翼", + ol_zhangyì_prefix: "OL", + oldianjun: "殿军", + oldianjun_info: "锁定技。回合结束时,你受到1点无来源伤害,然后执行一个额外的出牌阶段。", + olkangrui: "亢锐", + olkangrui_info: + "当一名角色于其回合内首次受到伤害后,你可以摸一张牌并选择一项:1.令其回复1点体力;2.令其于本回合下次造成的伤害+1。然后当其于本回合造成伤害时,其本回合手牌上限基数为0。", + wangguan: "王瓘", + olmiuyan: "谬焰", + olmiuyan_tag: "invisible", + olmiuyan_info: + "转换技。你可以将一张黑色牌当做【火攻】使用。然后若此技能:处于阳状态且此牌造成了伤害,则你获得此阶段内所有被展示过的手牌;处于阴状态且未造成伤害,则你令此技能失效直到本轮结束。", + olshilu: "失路", + olshilu_info: + "锁定技。当你受到伤害后,你摸X张牌(X为你的体力值且至多为5)。然后你展示攻击范围内一名角色的一张手牌,令此牌的牌名视为【杀】。", + ol_huban: "OL胡班", + ol_huban_prefix: "OL", + olhuiyun: "晖云", + olhuiyun_tag: "invisible", + olhuiyun_info: + "每轮每项各限一次。你可以将一张牌当【火攻】使用。此牌结算结束后,你选择一项,令目标角色选择是否执行:1.使用展示的牌,然后重铸所有手牌;2.使用一张手牌,然后重铸展示牌;3.摸一张牌。", + sunhong: "孙弘", + olxianbi: "险诐", + olxianbi_info: + "出牌阶段限一次。你可以选择一名角色,然后将手牌摸至或弃置至等同于其装备区里的牌数(至多摸五张),且当你因此弃置一张牌后,你随机获得弃牌堆中的另一张类型相同的牌。", + olzenrun: "谮润", + olzenrun_info: + "每阶段限一次。当你摸牌时,你可以改为获得一名其他角色等量的牌,然后其选择一项:1.摸等量的牌;2.令你本局游戏不能再对其发动〖险诐〗和〖谮润〗。", + luoxian: "罗宪", + oldaili: "带砺", + oldaili_tag: "带砺", + oldaili_info: + "一名角色的回合结束时,若你被展示过的手牌数为偶数,则你可以翻面,摸三张牌并展示之。", + zhangshiping: "张世平", + olhongji: "鸿济", + olhongji_info: + "每轮每项各限一次。一名角色的准备阶段,若其手牌数最少/最多,你可以令其于本回合第一个摸牌阶段/出牌阶段后执行一个额外的摸牌阶段/出牌阶段(若其条件同时满足则只能选择一项)。", + olxinggu: "行贾", + olxinggu_info: + "①游戏开始时,你将牌堆中的三张坐骑牌扣置于武将牌上。②结束阶段,你可以将一张〖行贾①〗牌置于一名其他角色的装备区,然后你从牌堆获得一张♦牌。", + lushi: "卢氏", + olzhuyan: "驻颜", + olzhuyan_info: + "每名角色每项各限一次。结束阶段,你可以令一名角色将以下一项调整至与其上一个结束阶段结束后相同:1.体力值;2.手牌数(体力值至多失去至1,手牌数至多摸至5;若其未执行过准备阶段则改为游戏开始时)。", + olleijie: "雷劫", + olleijie_info: + "准备阶段,你可以令一名角色判定,若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。", + releijie: "雷劫", + releijie_info: + "出牌阶段限一次,你可以令一名角色判定,若结果为黑桃2~9,则你视为依次对其使用两张雷【杀】,否则其摸两张牌。", + ol_liuyan: "OL刘焉", + ol_liuyan_prefix: "OL", + olpianan: "偏安", + olpianan_info: + "锁定技。游戏开始或弃牌阶段结束时,你弃置所有不为【闪】的手牌(没有则不弃)。若你的手牌数小于体力值,你获得牌堆或弃牌堆中的前X张【闪】(X为你的体力值与手牌数的差)。", + olyinji: "殷积", + olyinji_info: "锁定技。结束阶段,若你的体力值不为唯一最大,你选择回复1点体力或加1点体力上限。", + olkuisi: "窥伺", + olkuisi_info: + "锁定技。摸牌阶段开始时,你跳过此阶段,然后观看牌堆顶的四张牌并可以使用其中任意张。若你以此法使用的牌数不为2或3,你减1点体力上限。", + ol_wanglang: "OL王朗", + ol_wanglang_prefix: "OL", + oljici: "激词", + oljici_info: + "当你的拼点牌亮出后,若点数不大于X,你可令点数+X并令〖鼓舌〗视为未发动过(X为你的“饶舌”标记数)。", + ol_mengda: "OL孟达", + ol_mengda_prefix: "OL", + olgoude: "苟得", + olgoude_info: + "一名角色的回合结束时,若有与你势力相同的角色执行过以下项,则你可以执行这些角色未执行过的一项:1.摸一张牌;2.弃置一名角色的一张手牌;3.使用一张无对应实体牌的【杀】;4.变更势力。", + haopu: "郝普", + olzhenying: "镇荧", + olzhenying_info: + "出牌阶段限两次。你可以选择一名手牌数不大于你的其他角色,你与其同时将手牌摸或弃置至至多两张。然后你与其中手牌数较少的角色视为对另一名角色使用一张【决斗】。", + ol_wenqin: "文钦", + olguangao: "犷骜", + olguangao_info: + "当你/其他角色使用【杀】时,你/该角色可以额外指定一个目标/你为目标(有距离限制)。然后若你的手牌数为偶数,你摸一张牌并令此牌对任意目标无效(可不选)。", + olhuiqi: "彗企", + olhuiqi_info: + "觉醒技。一名角色回合结束后,若你与其他两名角色于此回合成为过牌的目标,你获得〖偕举〗并获得一个额外的回合。", + olxieju: "偕举", + olxieju_info: "出牌阶段限一次。你可以令任意名本回合成为过牌的目标的角色依次视为使用一张【杀】。", + ol_zhouqun: "周群", + oltianhou: "天候", + oltianhou_info: + "锁定技。准备阶段,你观看牌堆顶的一张牌,且可以用你的一张牌交换此牌。然后你亮出牌堆顶的牌,令一名角色根据此牌的花色获得对应的技能直到你下个准备阶段开始:♠〖骤雨〗;♥〖烈暑〗;♣〖严霜〗;♦〖凝雾〗。", + olchenshuo: "谶说", + olchenshuo_info: + "结束阶段,你可以展示一张手牌,然后亮出牌堆顶的一张牌。若这两张牌类型/花色/点数/牌名字数中任一项相同且已展示的牌数小于3,则你重复此流程,然后获得所有所有展示牌。", + oltianhou_spade: "骤雨", + oltianhou_spade_miehuo: "骤雨", + oltianhou_spade_info: + "锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。", + oltianhou_heart: "烈暑", + oltianhou_heart_info: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。", + oltianhou_club: "严霜", + oltianhou_club_info: "锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。", + oltianhou_diamond: "凝雾", + oltianhou_diamond_info: + "锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。", + duanjiong: "段颎", + olsaogu: "扫谷", + olsaogu_info: + "转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。", + olcuorui: "挫锐", + olcuorui_info: + "锁定技。①游戏开始时,你将手牌摸至场上存活人数张(至多摸至8张)。②当你成为延时锦囊牌的目标后,你跳过下个判定阶段。", + olmouzhu: "谋诛", + olmouzhu_info: + "出牌阶段限一次,你可以令一名有手牌的其他角色交给你一张手牌。然后若其手牌数小于你,其视为使用一张【杀】或【决斗】。", + olyanhuo: "延祸", + olyanhuo_info: "当你死亡时,你可以弃置杀死你的角色至多X张牌(X为你的牌数)。", + olniluan: "逆乱", + olniluan_info: + "体力值大于你的其他角色的结束阶段,若其本回合内使用过【杀】,则你可以将一张黑色牌当作【杀】对其使用(无距离限制)。", + olxiaoxi: "骁袭", + olxiaoxi_info: "一轮游戏开始时,你可以视为使用一张无距离限制的【杀】。", + ol_qianzhao: "牵招", + olweifu: "威抚", + olweifu_info: + "出牌阶段,你可以弃置一张牌并判定。你本回合下次使用与结果类型相同的牌无距离限制,且可以额外指定一个目标。若你弃置的牌与判定牌类型相同,你摸一张牌。", + olkuansai: "款塞", + olkuansai_info: + "每回合限一次,当一张牌指定第一个目标后,若目标数不小于你的体力值,你可以令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。", + ol_luyusheng: "OL陆郁生", + ol_luyusheng_prefix: "OL", + olcangxin: "藏心", + olcangxin_info: + "锁定技。①当你每回合第一次受到伤害时,你观看牌堆底的三张牌并弃置其中任意张牌,然后此伤害-X。②摸牌阶段开始时,你亮出牌堆底的三张牌,然后摸X张牌(X为其中红桃牌的数量)。", + olrunwei: "润微", + olrunwei_info: + "其他角色的弃牌阶段开始时,若其已受伤,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1;②令其摸一张牌,其本回合手牌上限-1。", + caoxi: "曹羲", + olgangshu: "刚述", + olgangshu_info: + "①当你使用非基本牌结算结束后,你可以令以下一项数值+1(每项至多加至5):1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。", + oljianxuan: "谏旋", + oljianxuan_info: + "当你受到伤害后,你可以令一名角色摸一张牌,然后若其手牌数等于你〖刚述①〗中的任意一项对应的数值,其重复此流程。", + ol_pengyang: "彭羕", + olxiaofan: "嚣翻", + olxiaofan_info: + "当你需要使用不为【无懈可击】的牌时,你可以观看牌堆底的X+1张牌并使用其中的一张。此牌结算结束时,你依次弃置以下前X个区域中的所有牌:⒈判定区、⒉装备区、⒊手牌区(X为本回合你使用过的牌中包含的类型数)。", + oltuishi: "侻失", + oltuishi_info: + "锁定技。①你不能使用【无懈可击】。②当你使用点数为字母的牌时,你令此牌无效并摸一张牌,且你对手牌数小于你的角色使用的下一张牌无距离和次数限制。③当你使用伤害类卡牌结算完毕后,若此牌为你本回合使用的第三张或以上未造成伤害的卡牌,则你令〖器翻〗于本回合失效。", + ol_tw_zhangji: "张既", + skill_zhangji_A: "技能", + skill_zhangji_A_info: + "出牌阶段限X次(X为你的体力值),当你使用牌指定一名其他角色为目标后,你可以观看其手牌,然后你选择一项:
    1.弃置其一张牌,然后若弃置的牌是能造成火焰伤害的牌,你摸一张牌。
    2.重铸其手牌中的所有【杀】和【决斗】。
    3.若其没有【闪】,你与其互相对对方造成1点伤害。", + skill_zhangji_B: "技能", + skill_zhangji_B_info: + "当你受到1点伤害后,你可令一名手牌数小于体力上限的角色摸三张牌,然后其将手牌数弃置至其体力上限数;当你进入濒死状态时,你可令一名其他角色观看五张魏势力武将牌,其可以选择其中一张代替自己的武将牌(体力和体力上限不变)。", + ol_feiyi: "费祎", + yanru: "宴如", + yanru_info: + "出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。", + hezhong: "和衷", + hezhong_info: + "每回合每项限一次,当你的手牌数变为1后,你可以展示唯一手牌并摸一张牌,然后你选择一项:①本回合使用的下一张点数大于此牌的点数的普通锦囊牌额外结算一次;②本回合使用的下一张点数小于此牌的点数的普通锦囊牌额外结算一次。", + lvboshe: "吕伯奢", + olfushi: "缚豕", + olfushi_info: + "①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以将任意张“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。", + oldongdao: "东道", + oldongdao_info: + "农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。", + zhangyan: "张燕", + olsuji: "肃疾", + olsuji_info: + "一名角色的出牌阶段开始时,若其已受伤,你可以将一张黑色牌当【杀】使用。若其受到此【杀】的伤害,你获得其一张牌。", + ollangdao: "狼蹈", + ollangdao_info: + "当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:1.令此【杀】伤害基数+1;2.令你可以为此【杀】多选择一个目标;3.令此【杀】不可被响应。然后若没有角色因此【杀】死亡,你移除本次被选择的项。", + ol_dingshangwan: "OL丁尚涴", + ol_dingshangwan_prefix: "OL", + olfudao: "抚悼", + olfudao_info: + "①游戏开始时,你摸三张牌,然后可以将至多三张手牌交给一名其他角色,然后可以弃置任意张手牌,最后记录你的手牌数。②一名角色的回合结束时,若其手牌数和你发动〖抚悼①〗记录的数值相同,则你可以与其各摸一张牌。", + olfengyan: "讽言", + olfengyan_info: + "锁定技。当你受到其他角色造成的伤害后或响应其他角色使用的牌时,你选择一项:①摸一张牌,然后交给其一张牌。②令其摸一张牌,然后其弃置两张牌。", + ol_liwan: "OL李婉", + ol_liwan_prefix: "OL", + ollianju: "联句", + ollianju_info: + "结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,然后若A与B的牌名相同,则你失去1点体力;若A与B的牌名不同,则你可以视为使用A。", + olsilv: "思闾", + olsilv_info: + "锁定技,每回合每项限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。", + xueji_old: "血祭", + xueji_old_info: + "出牌阶段限一次,你可以弃置一张红色牌并对攻击范围内的至多X名角色各造成1点伤害(X为你已损失的体力值),然后这些角色各摸一张牌。", + oldhuxiao: "虎啸", + oldhuxiao_info: "锁定技,当你使用的【杀】被【闪】抵消后,你令此【杀】不计入使用次数。", + oldwuji: "武继", + oldwuji_info: + "觉醒技,结束阶段,若你本回合造成了3点或更多伤害,你加1点体力上限并回复1点体力,并失去技能〖虎啸〗。", + olfeiyang: "飞扬", //olfeiyang_info:'限定技。准备阶段,你可以弃置两张牌,然后弃置判定区的一张牌。', - olfeiyang_info:'准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌。', - caoyu:'曹宇', - olgongjie:'恭节', - olgongjie_info:'每轮的首个回合开始时,你可以令任意名角色获得你的一张牌,然后你摸X张牌(X为你本次失去的花色数)。', - olxiangxv:'相胥', - olxiangxv_info:'当你的手牌数变为全场最少时,你可以获得以下效果:本回合结束时,将手牌数调整至与当前回合角色手牌数相同(至多摸至五张),然后若你以此法弃置了至少两张手牌,则你回复1点体力。', - olxiangzuo:'襄胙', - olxiangzuo_info:'限定技,当你进入濒死状态时,你可以交给一名其他角色任意张牌,然后若你本回合已对其发动过〖恭节〗和〖相胥〗,你回复等量的体力。', - liyi:'李异', - olchanshuang:'缠双', - olchanshuang_info:'①出牌阶段限一次,你可以选择一名其他角色。你与其依次选择〖缠双③〗的一项,然后你与其依次执行各自选择的项。②结束阶段,若X大于0,你执行〖缠双③〗的前X项(X为你本回合以任意形式执行过的〖缠双③〗的选项数)。③选项:1.重铸一张牌;2.使用一张【杀】;3.弃置两张牌。', - olzhanjin:'蘸金', - olzhanjin_info:'锁定技,若你有空置的武器栏,则你视为装备【贯石斧】。', - tianchou:'田畴', - olshandao:'善刀', - olshandao_info:'出牌阶段限一次,你可以选择任意名角色,你选择这些角色的各一张牌,依次将这些牌放置到牌堆顶,然后你视为对这些角色使用【五谷丰登】,然后你视为对这些角色外的所有其他角色使用【万箭齐发】。', - ol_hujinding:'胡金定', - olqingyuan:'轻缘', - olqingyuan_info:'锁定技。①游戏开始时,或当你于本局游戏首次受到伤害后,你选择一名未以此法选择过的其他角色。②每回合限一次,你发动〖轻缘①〗选择过的角色得到牌后,你随机获得其中一名角色的随机一张手牌。', - olchongshen:'重身', - olchongshen_info:'你可以将本轮得到的红色手牌当作【闪】使用。', - guotu:'郭图', - olqushi:'趋势', - olqushi_info:'出牌阶段限一次,你可以摸一张牌,然后将一张手牌扣置于一名其他角色的武将牌上,称为“趋”。目标角色于其结束阶段移去武将牌上的所有“趋”,若其于本回合使用过与“趋”相同类别的牌,则你摸X张牌(X为其本回合使用牌指定过的目标数之和且至多为5)。', - olweijie:'诿解', - olweijie_info:'回合外每名角色的回合限一次,当你需要使用或打出一张基本牌时,你可以弃置距离为1的一名角色的一张手牌,若此牌牌名与你需要使用或打出的牌的牌名相同,则视为你使用或打出之。', - liupan:'刘磐', - olpijing:'披荆', - olpijing_info:'每回合限一次,当你使用黑色【杀】或黑色普通锦囊牌指定唯一目标后,你可以令至多X名其他角色成为此牌的额外目标并依次交给你一张牌(X为你已损失的体力值且X至少为1)。这些角色下次使用基本牌或普通锦囊牌指定唯一目标时,其可令你成为此牌的额外目标或摸一张牌。', - ol_lukai:'OL陆凯', - ol_lukai_prefix:'OL', - olxuanzhu:'玄注', - olxuanzhu_info:'转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。', - oljiane:'謇谔', - oljiane_info:'锁定技。①当你对其他角色使用的牌生效后,其本回合无法抵消牌。②当你抵消牌后,你本回合无法成为牌的目标。', - ol_liupi:'刘辟', - olyicheng:'易城', - olyicheng_info:'出牌阶段限一次,你可以亮出牌堆顶的三张牌,然后你可以以任意手牌交换这些牌,若这三张牌的点数和因此增加,则你可以选择用所有手牌交换这三张牌。最后你将这三张牌置于牌堆顶。', + olfeiyang_info: "准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌。", + caoyu: "曹宇", + olgongjie: "恭节", + olgongjie_info: + "每轮的首个回合开始时,你可以令任意名角色获得你的一张牌,然后你摸X张牌(X为你本次失去的花色数)。", + olxiangxv: "相胥", + olxiangxv_info: + "当你的手牌数变为全场最少时,你可以获得以下效果:本回合结束时,将手牌数调整至与当前回合角色手牌数相同(至多摸至五张),然后若你以此法弃置了至少两张手牌,则你回复1点体力。", + olxiangzuo: "襄胙", + olxiangzuo_info: + "限定技,当你进入濒死状态时,你可以交给一名其他角色任意张牌,然后若你本回合已对其发动过〖恭节〗和〖相胥〗,你回复等量的体力。", + liyi: "李异", + olchanshuang: "缠双", + olchanshuang_info: + "①出牌阶段限一次,你可以选择一名其他角色。你与其依次选择〖缠双③〗的一项,然后你与其依次执行各自选择的项。②结束阶段,若X大于0,你执行〖缠双③〗的前X项(X为你本回合以任意形式执行过的〖缠双③〗的选项数)。③选项:1.重铸一张牌;2.使用一张【杀】;3.弃置两张牌。", + olzhanjin: "蘸金", + olzhanjin_info: "锁定技,若你有空置的武器栏,则你视为装备【贯石斧】。", + tianchou: "田畴", + olshandao: "善刀", + olshandao_info: + "出牌阶段限一次,你可以选择任意名角色,你选择这些角色的各一张牌,依次将这些牌放置到牌堆顶,然后你视为对这些角色使用【五谷丰登】,然后你视为对这些角色外的所有其他角色使用【万箭齐发】。", + ol_hujinding: "胡金定", + olqingyuan: "轻缘", + olqingyuan_info: + "锁定技。①游戏开始时,或当你于本局游戏首次受到伤害后,你选择一名未以此法选择过的其他角色。②每回合限一次,你发动〖轻缘①〗选择过的角色得到牌后,你随机获得其中一名角色的随机一张手牌。", + olchongshen: "重身", + olchongshen_info: "你可以将本轮得到的红色手牌当作【闪】使用。", + guotu: "郭图", + olqushi: "趋势", + olqushi_info: + "出牌阶段限一次,你可以摸一张牌,然后将一张手牌扣置于一名其他角色的武将牌上,称为“趋”。目标角色于其结束阶段移去武将牌上的所有“趋”,若其于本回合使用过与“趋”相同类别的牌,则你摸X张牌(X为其本回合使用牌指定过的目标数之和且至多为5)。", + olweijie: "诿解", + olweijie_info: + "回合外每名角色的回合限一次,当你需要使用或打出一张基本牌时,你可以弃置距离为1的一名角色的一张手牌,若此牌牌名与你需要使用或打出的牌的牌名相同,则视为你使用或打出之。", + liupan: "刘磐", + olpijing: "披荆", + olpijing_info: + "每回合限一次,当你使用黑色【杀】或黑色普通锦囊牌指定唯一目标后,你可以令至多X名其他角色成为此牌的额外目标并依次交给你一张牌(X为你已损失的体力值且X至少为1)。这些角色下次使用基本牌或普通锦囊牌指定唯一目标时,其可令你成为此牌的额外目标或摸一张牌。", + ol_lukai: "OL陆凯", + ol_lukai_prefix: "OL", + olxuanzhu: "玄注", + olxuanzhu_info: + "转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。", + oljiane: "謇谔", + oljiane_info: + "锁定技。①当你对其他角色使用的牌生效后,其本回合无法抵消牌。②当你抵消牌后,你本回合无法成为牌的目标。", + ol_liupi: "刘辟", + olyicheng: "易城", + olyicheng_info: + "出牌阶段限一次,你可以亮出牌堆顶的三张牌,然后你可以以任意手牌交换这些牌,若这三张牌的点数和因此增加,则你可以选择用所有手牌交换这三张牌。最后你将这三张牌置于牌堆顶。", - sp_tianji:'天极·皇室宗亲', - sp_sibi:'四弼·辅国文曲', - sp_tianzhu:'天柱·势冠一方', - sp_nvshi:'女史·留史巾帼', - sp_shaowei:'少微·能人异士', - sp_huben:'虎贲·勇冠三军', - sp_liesi:'列肆·豪商巨贾', - sp_default:"天同·同名异势", - sp_qifu:'灯愿·祈福武将', - sp_wanglang:'OL·限定专属', - sp_zhongdan:"忠胆英杰", - sp_guozhan:"国战", - sp_guozhan2:"国战移植", - sp_others:"其他", - sp_waitforsort:'等待分包', - } + sp_tianji: "天极·皇室宗亲", + sp_sibi: "四弼·辅国文曲", + sp_tianzhu: "天柱·势冠一方", + sp_nvshi: "女史·留史巾帼", + sp_shaowei: "少微·能人异士", + sp_huben: "虎贲·勇冠三军", + sp_liesi: "列肆·豪商巨贾", + sp_default: "天同·同名异势", + sp_qifu: "灯愿·祈福武将", + sp_wanglang: "OL·限定专属", + sp_zhongdan: "忠胆英杰", + sp_guozhan: "国战", + sp_guozhan2: "国战移植", + sp_others: "其他", + sp_waitforsort: "等待分包", + }, }; }); diff --git a/character/sp2.js b/character/sp2.js index 3fbf00dbd..5cb9213bd 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -1,481 +1,705 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'sp2', - connect:true, - character:{ - liqueguosi:['male','qun',4,['xiongsuan']], - star_zhangchunhua:['female','wei',3,['starliangyan','starminghui']], - star_yuanshao:['male','qun',4,['starxiaoyan','starzongshi','starjiaowang','staraoshi'],['zhu']], - star_dongzhuo:['male','qun',5,['starweilin','starzhangrong','starhaoshou'],['zhu']], - star_yuanshu:['male','qun',4,['starcanxi','starpizhi','starzhonggu'],['zhu']], - star_caoren:['male','wei',4,['starsujun','starlifeng']], - mp_liuling:['male','jin',3,['mpjiusong','mpmaotao','mpbishi'],['doublegroup:wei:qun:jin']], - dc_jikang:['male','wei',3,['new_qingxian','dcjuexiang']], - dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']], - dc_mengda:['male','wei',4,['dclibang','dcwujie']], + name: "sp2", + connect: true, + character: { + liqueguosi: ["male", "qun", 4, ["xiongsuan"]], + star_zhangchunhua: ["female", "wei", 3, ["starliangyan", "starminghui"]], + star_yuanshao: [ + "male", + "qun", + 4, + ["starxiaoyan", "starzongshi", "starjiaowang", "staraoshi"], + ["zhu"], + ], + star_dongzhuo: ["male", "qun", 5, ["starweilin", "starzhangrong", "starhaoshou"], ["zhu"]], + star_yuanshu: ["male", "qun", 4, ["starcanxi", "starpizhi", "starzhonggu"], ["zhu"]], + star_caoren: ["male", "wei", 4, ["starsujun", "starlifeng"]], + mp_liuling: ["male", "jin", 3, ["mpjiusong", "mpmaotao", "mpbishi"], ["doublegroup:wei:qun:jin"]], + dc_jikang: ["male", "wei", 3, ["new_qingxian", "dcjuexiang"]], + dc_jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "dcdanji"]], + dc_mengda: ["male", "wei", 4, ["dclibang", "dcwujie"]], //dc_fuwan:['male','qun',4,['dcmoukui']], - guānning:['male','shu',3,['dcxiuwen','longsong']], - sunhuan:['male','wu',4,['dcniji']], - sunlang:['male','shu',4,['dctingxian','dcbenshi']], - shiyi:['male','wu',3,['dccuichuan','dczhengxu']], - dc_hujinding:['female','shu','3/6',['dcdeshi','dcwuyuan','huaizi']], - liyixiejing:['male','wu',4,['dcdouzhen']], - mushun:['male','qun',4,['dcjinjian','dcshizhao']], - dc_zhaoyǎn:['male','wei',3,['dcfuning','dcbingji']], - wangwei:['male','qun',4,['dcruizhan','dcshilie']], - dc_huban:['male','wei',4,['dcchongyi']], - niufu:['male','qun','4/7',['dcxiaoxi','xiongrao']], - bianxi:['male','wei',4,['dunxi']], - fengfang:['male','qun',3,['dcditing','dcbihuo']], - qinyilu:['male','qun',3,['piaoping','tuoxian','chuaili']], - yanrou:['male','wei',4,['choutao','xiangshu']], - dc_zhuling:['male','wei',4,['dczhanyi']], - licaiwei:['female','wei',3,['yijiao','qibie']], - yanfuren:['female','qun',3,['channi','nifu']], - haomeng:['male','qun',7,['xiongmang']], - re_pangdegong:['male','qun',3,['heqia','yinyi']], - hanmeng:['male','qun',4,['jieliang','quanjiu']], - xinping:['male','qun',3,['fuyuan','zhongjie','yongdi']], - zhangning:['female','qun',3,['tianze','difa']], - tongyuan:['male','qun',4,['chaofeng','chuanshu']], - sp_mifangfushiren:['male','shu',4,['fengshi']], - re_nanhualaoxian:['male','qun',4,['gongxiu','jinghe']], - dufuren:['female','wei',3,['yise','shunshi']], - caoanmin:['male','wei',4,['xianwei']], - re_zoushi:['female','qun',3,['rehuoshui','reqingcheng']], - qiuliju:['male','qun','4/6',['koulve','qljsuiren']], - re_hucheer:['male','qun',4,['redaoji','fuzhong']], - re_dongcheng:['male','qun',4,['xuezhao']], - tangji:['female','qun',3,['kangge','jielie']], - zhangheng:['male','qun',8,['dangzai','liangjue']], - duanwei:['male','qun',4,['langmie']], - re_niujin:['male','wei',4,['recuorui','reliewei']], - zhangmiao:['male','qun',4,['mouni','zongfan']], - liangxing:['male','qun',4,['lulve','lxzhuixi']], - caosong:['male','wei',4,['cslilu','csyizheng']], - re_taoqian:['male','qun',3,['zhaohuo','reyixiang','reyirang']], - zhaozhong:['male','qun',6,['yangzhong','huangkong']], - hanfu:['male','qun',4,['hfjieying','weipo']], - re_quyi:['male','qun',4,['refuqi','jiaozi']], - dongxie:['female','qun',4,['dcjiaoxia','dchumei']], - wangrong:['female','qun',3,['minsi','jijing','zhuide']], - ol_dingyuan:['male','qun',4,['cixiao','xianshuai']], - re_hejin:['male','qun',4,['spmouzhu','spyanhuo']], - re_hansui:['male','qun',4,['spniluan','spweiwu']], - liuhong:['male','qun',4,['yujue','tuxing']], - zhujun:['male','qun',4,['gongjian','kuimang']], - re_maliang:['male','shu',3,['rexiemu','heli'],[]], - caobuxing:['male','wu',3,['moying','juanhui'],[]], - lijue:["male","qun","4/6",["xinfu_langxi","xinfu_yisuan"],[]], - zhangji:["male","qun",4,["xinfu_lveming","xinfu_tunjun"],[]], - fanchou:["male","qun",4,["xinxingluan"],[]], - guosi:["male","qun",4,["xinfu_tanbei","xinfu_sidao"],[]], - lvkai:["male","shu",3,["xinfu_tunan","xinfu_bijing"],[]], - zhanggong:["male","wei",3,["xinfu_zhenxing","xinfu_qianxin"],[]], - weiwenzhugezhi:["male","wu",4,["xinfu_fuhai"],[]], - beimihu:['female','qun',3,['zongkui','guju','baijia']], - xurong:["male","qun",4,["xinfu_xionghuo","xinfu_shajue"],[]], - zhangqiying:["female","qun",3,["xinfu_falu","xinfu_dianhua","xinfu_zhenyi"],[]], - sp_liuqi:['male','qun',3,['rewenji','sptunjiang']], - xf_tangzi:["male","wei",4,["xinfu_xingzhao"],[]], - xf_huangquan:["male","shu",3,["xinfu_dianhu","xinfu_jianji"],[]], - xf_sufei:["male","wu",4,["xinfu_lianpian"],[]], - xushao:['male','qun',4,['pingjian']], - xinpi:['male','wei',3,['xpchijie','yinju']], - lisu:['male','qun',2,['lslixun','lskuizhu']], - zhangwen:['male','wu',3,['songshu','sibian']], - mangyachang:["male","qun",4,["spjiedao"],[]], - xugong:["male","wu",3,["biaozhao","yechou"],[]], - zhangchangpu:["female","wei",3,["yanjiao","xingshen"],[]], - gaolan:['male','qun',4,['xiying']], - sp_shenpei:['male','qun',3,['gangzhi','beizhan']], - xunchen:['male','qun',3,['fenglve','mouzhi'],['clan:颍川荀氏']], - sp_zhanghe:['male','qun',4,['yuanlve']], - sp_xuyou:['male','qun',3,['spshicai','spfushi']], - chunyuqiong:['male','qun',5,['cangchu','sushou','liangying']], - lvkuanglvxiang:['male','qun',4,['liehou','qigong']], + guānning: ["male", "shu", 3, ["dcxiuwen", "longsong"]], + sunhuan: ["male", "wu", 4, ["dcniji"]], + sunlang: ["male", "shu", 4, ["dctingxian", "dcbenshi"]], + shiyi: ["male", "wu", 3, ["dccuichuan", "dczhengxu"]], + dc_hujinding: ["female", "shu", "3/6", ["dcdeshi", "dcwuyuan", "huaizi"]], + liyixiejing: ["male", "wu", 4, ["dcdouzhen"]], + mushun: ["male", "qun", 4, ["dcjinjian", "dcshizhao"]], + dc_zhaoyǎn: ["male", "wei", 3, ["dcfuning", "dcbingji"]], + wangwei: ["male", "qun", 4, ["dcruizhan", "dcshilie"]], + dc_huban: ["male", "wei", 4, ["dcchongyi"]], + niufu: ["male", "qun", "4/7", ["dcxiaoxi", "xiongrao"]], + bianxi: ["male", "wei", 4, ["dunxi"]], + fengfang: ["male", "qun", 3, ["dcditing", "dcbihuo"]], + qinyilu: ["male", "qun", 3, ["piaoping", "tuoxian", "chuaili"]], + yanrou: ["male", "wei", 4, ["choutao", "xiangshu"]], + dc_zhuling: ["male", "wei", 4, ["dczhanyi"]], + licaiwei: ["female", "wei", 3, ["yijiao", "qibie"]], + yanfuren: ["female", "qun", 3, ["channi", "nifu"]], + haomeng: ["male", "qun", 7, ["xiongmang"]], + re_pangdegong: ["male", "qun", 3, ["heqia", "yinyi"]], + hanmeng: ["male", "qun", 4, ["jieliang", "quanjiu"]], + xinping: ["male", "qun", 3, ["fuyuan", "zhongjie", "yongdi"]], + zhangning: ["female", "qun", 3, ["tianze", "difa"]], + tongyuan: ["male", "qun", 4, ["chaofeng", "chuanshu"]], + sp_mifangfushiren: ["male", "shu", 4, ["fengshi"]], + re_nanhualaoxian: ["male", "qun", 4, ["gongxiu", "jinghe"]], + dufuren: ["female", "wei", 3, ["yise", "shunshi"]], + caoanmin: ["male", "wei", 4, ["xianwei"]], + re_zoushi: ["female", "qun", 3, ["rehuoshui", "reqingcheng"]], + qiuliju: ["male", "qun", "4/6", ["koulve", "qljsuiren"]], + re_hucheer: ["male", "qun", 4, ["redaoji", "fuzhong"]], + re_dongcheng: ["male", "qun", 4, ["xuezhao"]], + tangji: ["female", "qun", 3, ["kangge", "jielie"]], + zhangheng: ["male", "qun", 8, ["dangzai", "liangjue"]], + duanwei: ["male", "qun", 4, ["langmie"]], + re_niujin: ["male", "wei", 4, ["recuorui", "reliewei"]], + zhangmiao: ["male", "qun", 4, ["mouni", "zongfan"]], + liangxing: ["male", "qun", 4, ["lulve", "lxzhuixi"]], + caosong: ["male", "wei", 4, ["cslilu", "csyizheng"]], + re_taoqian: ["male", "qun", 3, ["zhaohuo", "reyixiang", "reyirang"]], + zhaozhong: ["male", "qun", 6, ["yangzhong", "huangkong"]], + hanfu: ["male", "qun", 4, ["hfjieying", "weipo"]], + re_quyi: ["male", "qun", 4, ["refuqi", "jiaozi"]], + dongxie: ["female", "qun", 4, ["dcjiaoxia", "dchumei"]], + wangrong: ["female", "qun", 3, ["minsi", "jijing", "zhuide"]], + ol_dingyuan: ["male", "qun", 4, ["cixiao", "xianshuai"]], + re_hejin: ["male", "qun", 4, ["spmouzhu", "spyanhuo"]], + re_hansui: ["male", "qun", 4, ["spniluan", "spweiwu"]], + liuhong: ["male", "qun", 4, ["yujue", "tuxing"]], + zhujun: ["male", "qun", 4, ["gongjian", "kuimang"]], + re_maliang: ["male", "shu", 3, ["rexiemu", "heli"], []], + caobuxing: ["male", "wu", 3, ["moying", "juanhui"], []], + lijue: ["male", "qun", "4/6", ["xinfu_langxi", "xinfu_yisuan"], []], + zhangji: ["male", "qun", 4, ["xinfu_lveming", "xinfu_tunjun"], []], + fanchou: ["male", "qun", 4, ["xinxingluan"], []], + guosi: ["male", "qun", 4, ["xinfu_tanbei", "xinfu_sidao"], []], + lvkai: ["male", "shu", 3, ["xinfu_tunan", "xinfu_bijing"], []], + zhanggong: ["male", "wei", 3, ["xinfu_zhenxing", "xinfu_qianxin"], []], + weiwenzhugezhi: ["male", "wu", 4, ["xinfu_fuhai"], []], + beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia"]], + xurong: ["male", "qun", 4, ["xinfu_xionghuo", "xinfu_shajue"], []], + zhangqiying: ["female", "qun", 3, ["xinfu_falu", "xinfu_dianhua", "xinfu_zhenyi"], []], + sp_liuqi: ["male", "qun", 3, ["rewenji", "sptunjiang"]], + xf_tangzi: ["male", "wei", 4, ["xinfu_xingzhao"], []], + xf_huangquan: ["male", "shu", 3, ["xinfu_dianhu", "xinfu_jianji"], []], + xf_sufei: ["male", "wu", 4, ["xinfu_lianpian"], []], + xushao: ["male", "qun", 4, ["pingjian"]], + xinpi: ["male", "wei", 3, ["xpchijie", "yinju"]], + lisu: ["male", "qun", 2, ["lslixun", "lskuizhu"]], + zhangwen: ["male", "wu", 3, ["songshu", "sibian"]], + mangyachang: ["male", "qun", 4, ["spjiedao"], []], + xugong: ["male", "wu", 3, ["biaozhao", "yechou"], []], + zhangchangpu: ["female", "wei", 3, ["yanjiao", "xingshen"], []], + gaolan: ["male", "qun", 4, ["xiying"]], + sp_shenpei: ["male", "qun", 3, ["gangzhi", "beizhan"]], + xunchen: ["male", "qun", 3, ["fenglve", "mouzhi"], ["clan:颍川荀氏"]], + sp_zhanghe: ["male", "qun", 4, ["yuanlve"]], + sp_xuyou: ["male", "qun", 3, ["spshicai", "spfushi"]], + chunyuqiong: ["male", "qun", 5, ["cangchu", "sushou", "liangying"]], + lvkuanglvxiang: ["male", "qun", 4, ["liehou", "qigong"]], }, - characterSort:{ - sp2:{ - sp_whlw:["xurong","lijue","zhangji","fanchou","guosi","duanwei","liangxing","zhangheng",'tangji','niufu','dongxie','liqueguosi'], - sp_zlzy:["zhangqiying","lvkai","zhanggong","weiwenzhugezhi","beimihu"], - sp_longzhou:["xf_tangzi","xf_huangquan","xf_sufei","sp_liuqi"], - sp_zizouqi:["mangyachang","xugong","zhangchangpu"], - sp_sbfm:["lisu","xinpi","zhangwen"], - sp_guandu:["sp_zhanghe","xunchen","sp_shenpei","gaolan","lvkuanglvxiang","chunyuqiong","sp_xuyou","xinping","hanmeng"], - sp_qihuan:['zhaozhong','re_hejin','fengfang','mushun'], - sp_binglin:['re_niujin',"sp_mifangfushiren",'licaiwei','dc_zhaoyan','shiyi','sunlang','sunhuan','dc_mengda'], - sp_danqi:['dufuren','qinyilu','bianxi','dc_huban','dc_hujinding','dc_zhaoyǎn','wangwei','liyixiejing','guānning','dc_jsp_guanyu'], - sp_fenghuo:['re_nanhualaoxian','tongyuan','zhangning','re_pangdegong'], - sp_huangjin:['liuhong','zhujun','re_hansui',"xushao"], - sp_fadong:['ol_dingyuan','wangrong','re_quyi','hanfu'], - sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'], - sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'], - sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'], - sp_star:['star_caoren','star_yuanshu','star_dongzhuo','star_yuanshao','star_zhangchunhua'], - mini_qixian:['mp_liuling'], - sp2_waitforsort:['caobuxing','re_maliang','dc_jikang'], - } + characterSort: { + sp2: { + sp_whlw: [ + "xurong", + "lijue", + "zhangji", + "fanchou", + "guosi", + "duanwei", + "liangxing", + "zhangheng", + "tangji", + "niufu", + "dongxie", + "liqueguosi", + ], + sp_zlzy: ["zhangqiying", "lvkai", "zhanggong", "weiwenzhugezhi", "beimihu"], + sp_longzhou: ["xf_tangzi", "xf_huangquan", "xf_sufei", "sp_liuqi"], + sp_zizouqi: ["mangyachang", "xugong", "zhangchangpu"], + sp_sbfm: ["lisu", "xinpi", "zhangwen"], + sp_guandu: [ + "sp_zhanghe", + "xunchen", + "sp_shenpei", + "gaolan", + "lvkuanglvxiang", + "chunyuqiong", + "sp_xuyou", + "xinping", + "hanmeng", + ], + sp_qihuan: ["zhaozhong", "re_hejin", "fengfang", "mushun"], + sp_binglin: [ + "re_niujin", + "sp_mifangfushiren", + "licaiwei", + "dc_zhaoyan", + "shiyi", + "sunlang", + "sunhuan", + "dc_mengda", + ], + sp_danqi: [ + "dufuren", + "qinyilu", + "bianxi", + "dc_huban", + "dc_hujinding", + "dc_zhaoyǎn", + "wangwei", + "liyixiejing", + "guānning", + "dc_jsp_guanyu", + ], + sp_fenghuo: ["re_nanhualaoxian", "tongyuan", "zhangning", "re_pangdegong"], + sp_huangjin: ["liuhong", "zhujun", "re_hansui", "xushao"], + sp_fadong: ["ol_dingyuan", "wangrong", "re_quyi", "hanfu"], + sp_xuzhou: ["re_taoqian", "caosong", "zhangmiao", "qiuliju"], + sp_zhongyuan: ["re_hucheer", "re_zoushi", "caoanmin", "re_dongcheng"], + sp_xiaohu: ["haomeng", "yanfuren", "yanrou", "dc_zhuling"], + sp_star: [ + "star_caoren", + "star_yuanshu", + "star_dongzhuo", + "star_yuanshao", + "star_zhangchunhua", + ], + mini_qixian: ["mp_liuling"], + sp2_waitforsort: ["caobuxing", "re_maliang", "dc_jikang"], + }, }, - skill:{ + skill: { //李傕郭汜 - xiongsuan:{ - audio:2, - enable:'phaseUse', - filterTarget:true, - filterCard:lib.filter.cardDiscardable, - position:'h', - usable:1, - async content(event,trigger,player){ - const target=event.target; + xiongsuan: { + audio: 2, + enable: "phaseUse", + filterTarget: true, + filterCard: lib.filter.cardDiscardable, + position: "h", + usable: 1, + async content(event, trigger, player) { + const target = event.target; await target.damage(); await player.draw(3); - if(target!=player) await player.loseHp(); + if (target != player) await player.loseHp(); }, - ai:{ - order:9, - result:{ - player(player,target){ - let res=2*get.effect(player,{name:'draw',player,player}); - if(player!==target) res+=get.effect(player,{name:'losehp'},player,player); + ai: { + order: 9, + result: { + player(player, target) { + let res = 2 * get.effect(player, { name: "draw", player, player }); + if (player !== target) + res += get.effect(player, { name: "losehp" }, player, player); return res; }, - target(player,target){ - return get.damageEffect(target,player,target); + target(player, target) { + return get.damageEffect(target, player, target); }, }, }, }, //张春华 - starliangyan:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - chooseButton:{ - dialog(event,player){ - const name=get.translation(event.result.targets[0]); - const list=[ - '你摸一张牌,其弃置一张牌','你弃置一张牌,其摸一张牌', - '你摸两张牌,其弃置两张牌','你弃置两张牌,其摸两张牌' - ].map((item,i)=>[i,item]); - const dialog=ui.create.dialog( + starliangyan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + chooseButton: { + dialog(event, player) { + const name = get.translation(event.result.targets[0]); + const list = [ + "你摸一张牌,其弃置一张牌", + "你弃置一张牌,其摸一张牌", + "你摸两张牌,其弃置两张牌", + "你弃置两张牌,其摸两张牌", + ].map((item, i) => [i, item]); + const dialog = ui.create.dialog( `梁燕:请选择你与${name}要执行的选项`, - [list.slice(0,2),'tdnodes'], - [list.slice(2,4),'tdnodes'], - 'hidden' + [list.slice(0, 2), "tdnodes"], + [list.slice(2, 4), "tdnodes"], + "hidden" ); return dialog; }, - filter(button,player){ - const link=button.link; - if(link%2===0) return true; - return player.countDiscardableCards(player,'he')>=(link+1)/2; + filter(button, player) { + const link = button.link; + if (link % 2 === 0) return true; + return player.countDiscardableCards(player, "he") >= (link + 1) / 2; }, - check(button){ - const player=get.player(),target=get.event().getParent().result.targets[0]; - const link=button.link; - if(get.attitude(player,target)<=0&&link===2) return 100; - const ph=player.countCards('h'),th=target.countCards('h'); - if(link%2===0){ - const num=(link/2)+1; - if(ph+num===th-num) return 10; - } - else{ - const num=(link+1)/2; - if(ph-num===th+num) return 10; + check(button) { + const player = get.player(), + target = get.event().getParent().result.targets[0]; + const link = button.link; + if (get.attitude(player, target) <= 0 && link === 2) return 100; + const ph = player.countCards("h"), + th = target.countCards("h"); + if (link % 2 === 0) { + const num = link / 2 + 1; + if (ph + num === th - num) return 10; + } else { + const num = (link + 1) / 2; + if (ph - num === th + num) return 10; } return 5; }, - backup(links){ + backup(links) { return { - audio:'starliangyan', - target:get.event().result.targets[0], - link:links[0], - filterTarget(card,player,target){ - return target===lib.skill.starliangyan_backup.target; + audio: "starliangyan", + target: get.event().result.targets[0], + link: links[0], + filterTarget(card, player, target) { + return target === lib.skill.starliangyan_backup.target; }, - selectTarget:-1, - async content(content,trigger,player){ - const target=lib.skill.starliangyan_backup.target; - const link=lib.skill.starliangyan_backup.link; - const num=link<=1?1:2; - const fn=['draw','chooseToDiscard']; - if(link%2===1) fn.reverse(); - await player[fn[0]](num,true,'he'); - await target[fn[1]](num,true,'he'); - if(player.countCards('h')===target.countCards('h')){ - const skipper=[player,target][link%2]; - skipper.skip('phaseDiscard'); - game.log(skipper,'跳过了下一个','#y弃牌阶段'); + selectTarget: -1, + async content(content, trigger, player) { + const target = lib.skill.starliangyan_backup.target; + const link = lib.skill.starliangyan_backup.link; + const num = link <= 1 ? 1 : 2; + const fn = ["draw", "chooseToDiscard"]; + if (link % 2 === 1) fn.reverse(); + await player[fn[0]](num, true, "he"); + await target[fn[1]](num, true, "he"); + if (player.countCards("h") === target.countCards("h")) { + const skipper = [player, target][link % 2]; + skipper.skip("phaseDiscard"); + game.log(skipper, "跳过了下一个", "#y弃牌阶段"); } - } + }, }; }, - prompt(links){ - return '点击“确定”以执行效果'; + prompt(links) { + return "点击“确定”以执行效果"; }, }, - subSkill:{ - backup:{}, + subSkill: { + backup: {}, }, - ai:{ - order(item,player){ - if(!game.hasPlayer(current=>current!==player&&get.attitude(player,current)>0)&&game.hasPlayer(current=>get.attitude(player,current)<=0)) return 10; - if(game.hasPlayer(current=>{ - const del=player.countCards('h')-current.countCards('h'),toFind=[2,4].find(num=>Math.abs(del)===num); - if(toFind===4&&del<0&&get.attitude(player,current)<=0){ - return true; - } - return false; - })) return 10; + ai: { + order(item, player) { + if ( + !game.hasPlayer( + (current) => current !== player && get.attitude(player, current) > 0 + ) && + game.hasPlayer((current) => get.attitude(player, current) <= 0) + ) + return 10; + if ( + game.hasPlayer((current) => { + const del = player.countCards("h") - current.countCards("h"), + toFind = [2, 4].find((num) => Math.abs(del) === num); + if (toFind === 4 && del < 0 && get.attitude(player, current) <= 0) { + return true; + } + return false; + }) + ) + return 10; return 1; }, - result:{ - target(player,target){ - const del=player.countCards('h')-target.countCards('h'),toFind=[2,4].find(num=>Math.abs(del)===num); - if(toFind){ - return -del*(get.attitude(player,target)*Math.min(3,target.countCards('h')))*toFind/10; + result: { + target(player, target) { + const del = player.countCards("h") - target.countCards("h"), + toFind = [2, 4].find((num) => Math.abs(del) === num); + if (toFind) { + return ( + (-del * + (get.attitude(player, target) * Math.min(3, target.countCards("h"))) * + toFind) / + 10 + ); } return -1; }, }, }, }, - starminghui:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter(event,player){ - return player.isMinHandcard()||player.isMaxHandcard(); + starminghui: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter(event, player) { + return player.isMinHandcard() || player.isMaxHandcard(); }, - direct:true, - async content(event,trigger,player){ - let logged=false; - if(player.isMinHandcard()){ - const card=new lib.element.VCard({ - name:'sha', + direct: true, + async content(event, trigger, player) { + let logged = false; + if (player.isMinHandcard()) { + const card = new lib.element.VCard({ + name: "sha", }); - const result=await player.chooseUseTarget(`###${get.prompt('starminghui')}###视为使用一张无距离限制的【杀】`,card,false,'nodistance').set('logSkill','starminghui').forResult(); - if(result.bool) logged=true; + const result = await player + .chooseUseTarget( + `###${get.prompt("starminghui")}###视为使用一张无距离限制的【杀】`, + card, + false, + "nodistance" + ) + .set("logSkill", "starminghui") + .forResult(); + if (result.bool) logged = true; } - const num=player.countCards('h'); - if(player.isMaxHandcard()&&num>0){ - const maxNum=game.findPlayer(current=>{ - if(current===player) return false; - return !game.hasPlayer(current2=>{ - if(current2===player) return false; - return current2.countCards('h')>current.countCards('h'); + const num = player.countCards("h"); + if (player.isMaxHandcard() && num > 0) { + const maxNum = game + .findPlayer((current) => { + if (current === player) return false; + return !game.hasPlayer((current2) => { + if (current2 === player) return false; + return current2.countCards("h") > current.countCards("h"); + }); + }) + .countCards("h"); + const leastDiscardNum = num - maxNum + 1; + const prompt = logged ? `是否将手牌弃置至不为最多?` : get.prompt("starminghui"); + const next = player + .chooseToDiscard( + prompt, + `弃置至少${get.cnNumber(leastDiscardNum)}张手牌,然后你令一名角色回复1点体力` + ) + .set("selectCard", [leastDiscardNum, Infinity]) + .set( + "goon", + game.hasPlayer((current) => + get.recoverEffect(current, get.player(), get.player()) + ) + ) + .set("ai", (card) => { + if (!get.event("goon")) return 0; + if (get.tag(card, "recover")) return 0; + if (ui.selected.cards.length === get.event("selectCard")[0] - 1) + return 6.5 - get.value(card); + return 4 - get.value(card); }); - }).countCards('h'); - const leastDiscardNum=num-maxNum+1; - const prompt=logged?`是否将手牌弃置至不为最多?`:get.prompt('starminghui'); - const next=player.chooseToDiscard(prompt,`弃置至少${get.cnNumber(leastDiscardNum)}张手牌,然后你令一名角色回复1点体力`) - .set('selectCard',[leastDiscardNum,Infinity]) - .set('goon',game.hasPlayer(current=>get.recoverEffect(current,get.player(),get.player()))) - .set('ai',card=>{ - if(!get.event('goon')) return 0; - if(get.tag(card,'recover')) return 0; - if(ui.selected.cards.length===get.event('selectCard')[0]-1) return 6.5-get.value(card); - return 4-get.value(card); - }); - if(!logged) next.set('logSkill','starminghui'); - const result=await next.forResult(); - if(!result.bool) return; - if(!player.isUnderControl(true)&&!player.isOnline()) await game.asyncDelayx(); - const [bool,targets]=await player.chooseTarget('令一名角色回复1点体力') - .set('ai',target=>get.recoverEffect(target,get.player(),get.player())) - .forResult('bool','targets'); - if(bool){ - const target=targets[0]; - player.line(target,'green'); + if (!logged) next.set("logSkill", "starminghui"); + const result = await next.forResult(); + if (!result.bool) return; + if (!player.isUnderControl(true) && !player.isOnline()) await game.asyncDelayx(); + const [bool, targets] = await player + .chooseTarget("令一名角色回复1点体力") + .set("ai", (target) => get.recoverEffect(target, get.player(), get.player())) + .forResult("bool", "targets"); + if (bool) { + const target = targets[0]; + player.line(target, "green"); await target.recover(); } } }, - }, //星袁绍 - starxiaoyan:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:['enterGame'/*,'logSkill'*/], + starxiaoyan: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame" /*,'logSkill'*/], }, - filter(event,player){ - if(!game.hasPlayer(current=>current!=player)) return false; + filter(event, player) { + if (!game.hasPlayer((current) => current != player)) return false; //if(event.name=='logSkill'&&evt.skill!='starjiaowang') return false; - return event.name!='phase'||game.phaseNumber==0; + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - async content(event,trigger,player){ - let targets=game.filterPlayer(current=>current!=player); + forced: true, + async content(event, trigger, player) { + let targets = game.filterPlayer((current) => current != player); player.line(targets); - for(const target of targets) await target.damage('fire'); - targets=targets.filter(i=>i.isIn()); - if(targets.length){ - for(const target of targets){ - if(!target.countCards('he')) continue; - const {result:{bool}}=await target.chooseToGive('he',player) - .set('prompt','是否交给'+get.translation(player)+'一张牌'+(target.isDamaged()?'并回复1点体力':'')+'?') - .set('ai',card=>{ - const target=get.event('player'),player=get.event('target'); - const att=get.attitude(target,player); - if(get.recoverEffect(target,target,target)<=0){ - if(att<=0) return -get.value(card); - return 0; - } - return 7-get.value(card); - }).set('target',player); - if(bool) await target.recover(); + for (const target of targets) await target.damage("fire"); + targets = targets.filter((i) => i.isIn()); + if (targets.length) { + for (const target of targets) { + if (!target.countCards("he")) continue; + const { + result: { bool }, + } = await target + .chooseToGive("he", player) + .set( + "prompt", + "是否交给" + + get.translation(player) + + "一张牌" + + (target.isDamaged() ? "并回复1点体力" : "") + + "?" + ) + .set("ai", (card) => { + const target = get.event("player"), + player = get.event("target"); + const att = get.attitude(target, player); + if (get.recoverEffect(target, target, target) <= 0) { + if (att <= 0) return -get.value(card); + return 0; + } + return 7 - get.value(card); + }) + .set("target", player); + if (bool) await target.recover(); } } }, }, - starzongshi:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - const cards=player.getCards('h',card=>{ - const type=get.type(card,player); - if(type!='basic'&&type!='trick') return false; - return lib.filter.cardUsable(card,player)&&game.hasPlayer(target=>{ - return lib.filter.targetEnabled2(card,player,target)/*&&lib.filter.targetInRange(card,player,target)*/; - }); + starzongshi: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + const cards = player.getCards("h", (card) => { + const type = get.type(card, player); + if (type != "basic" && type != "trick") return false; + return ( + lib.filter.cardUsable(card, player) && + game.hasPlayer((target) => { + return lib.filter.targetEnabled2( + card, + player, + target + ) /*&&lib.filter.targetInRange(card,player,target)*/; + }) + ); }); - if(!cards.length) return false; - return cards.some(card=>{ - const cardss=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player)); - return cardss.length&&!cardss.some(cardx=>!game.checkMod(cardx,player,'unchanged','cardEnabled2',player)); + if (!cards.length) return false; + return cards.some((card) => { + const cardss = player.getCards( + "h", + (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) + ); + return ( + cardss.length && + !cardss.some( + (cardx) => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player) + ) + ); }); }, - filterCard(card,player){ - if(ui.selected.cards.length) return false; - const cards=player.getCards('h',card=>{ - const type=get.type(card,player); - if(type!='basic'&&type!='trick') return false; - return lib.filter.cardUsable(card,player)&&game.hasPlayer(target=>{ - return lib.filter.targetEnabled2(card,player,target)/*&&lib.filter.targetInRange(card,player,target)*/; - }); + filterCard(card, player) { + if (ui.selected.cards.length) return false; + const cards = player.getCards("h", (card) => { + const type = get.type(card, player); + if (type != "basic" && type != "trick") return false; + return ( + lib.filter.cardUsable(card, player) && + game.hasPlayer((target) => { + return lib.filter.targetEnabled2( + card, + player, + target + ) /*&&lib.filter.targetInRange(card,player,target)*/; + }) + ); }); - if(!cards.includes(card)) return false; - const cardss=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player)); - return cardss.length&&!cardss.some(cardx=>!game.checkMod(cardx,player,'unchanged','cardEnabled2',player)); + if (!cards.includes(card)) return false; + const cardss = player.getCards( + "h", + (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) + ); + return ( + cardss.length && + !cardss.some( + (cardx) => !game.checkMod(cardx, player, "unchanged", "cardEnabled2", player) + ) + ); }, - selectCard:[1,2], - complexCard:true, - check(card){ - const player=get.event('player'),select=get.copy(get.info(card).selectTarget); + selectCard: [1, 2], + complexCard: true, + check(card) { + const player = get.event("player"), + select = get.copy(get.info(card).selectTarget); let range; - if(select==undefined) range=[1,1]; - else if(typeof select=='number') range=[select,select]; - else if(get.itemtype(select)=='select') range=select; - else if(typeof select=='function') range=select(card,player); - game.checkMod(card,player,range,'selectTarget',player); - const cards=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player)); - let targets=game.filterPlayer(target=>lib.filter.targetEnabled2(card,player,target)/*&&lib.filter.targetInRange(card,player,target)*/&&get.effect(target,card,player,player)>0); - const max=range[1],max2=Math.min(cards.length,targets.length); - if(max>max2) return 0; - targets=targets.sort((a,b)=>get.effect(b,card,player,player)-get.effect(a,card,player,player)).slice(0,max2); - const sum=targets.reduce((num,target)=>num+get.effect(target,card,player,player),0); - if(max==-1){ - if(game.filterPlayer(target=>{ - return lib.filter.targetEnabled2(card,player,target)/*&&lib.filter.targetInRange(card,player,target)*/; - }).reduce((num,target)=>num+get.effect(target,card,player,player),0)>sum) return 0; + if (select == undefined) range = [1, 1]; + else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); + const cards = player.getCards( + "h", + (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) + ); + let targets = game.filterPlayer( + (target) => + lib.filter.targetEnabled2( + card, + player, + target + ) /*&&lib.filter.targetInRange(card,player,target)*/ && + get.effect(target, card, player, player) > 0 + ); + const max = range[1], + max2 = Math.min(cards.length, targets.length); + if (max > max2) return 0; + targets = targets + .sort( + (a, b) => + get.effect(b, card, player, player) - get.effect(a, card, player, player) + ) + .slice(0, max2); + const sum = targets.reduce( + (num, target) => num + get.effect(target, card, player, player), + 0 + ); + if (max == -1) { + if ( + game + .filterPlayer((target) => { + return lib.filter.targetEnabled2( + card, + player, + target + ) /*&&lib.filter.targetInRange(card,player,target)*/; + }) + .reduce((num, target) => num + get.effect(target, card, player, player), 0) > + sum + ) + return 0; } return sum; }, - position:'h', - discard:false, - lose:false, - delay:false, - async content(event,trigger,player){ - const card=event.cards[0],cards=player.getCards('h',cardx=>card!=cardx&&get.suit(card,player)==get.suit(cardx,player)); - await player.showCards([card],get.translation(player)+'发动了【纵势】'); - const cardx=new lib.element.VCard({name:get.name(card,player),nature:get.nature(card,player),cards:cards}); - const {result:{bool,targets}}=await player.chooseTarget((card,player,target)=>{ - //return player.canUse(get.event('cardx'),target); - return lib.filter.targetEnabled2(get.event('cardx'),player,target)/*&&lib.filter.targetInRange(get.event('cardx'),player,target)*/; - },true).set('cardx',cardx).set('selectTarget',[1,cards.length]) - .set('prompt','请选择'+(game.hasNature(cardx)?get.translation(get.nature(cardx)):'')+'【'+get.translation(cardx)+'】('+get.translation(cards)+')的目标') - .set('ai',target=>{ - const player=get.event('player'),card=get.event('cardx'); - return get.effect(target,card,player,player); + position: "h", + discard: false, + lose: false, + delay: false, + async content(event, trigger, player) { + const card = event.cards[0], + cards = player.getCards( + "h", + (cardx) => card != cardx && get.suit(card, player) == get.suit(cardx, player) + ); + await player.showCards([card], get.translation(player) + "发动了【纵势】"); + const cardx = new lib.element.VCard({ + name: get.name(card, player), + nature: get.nature(card, player), + cards: cards, }); - if(bool) player.useCard(cardx,cards,targets.sortBySeat()); + const { + result: { bool, targets }, + } = await player + .chooseTarget((card, player, target) => { + //return player.canUse(get.event('cardx'),target); + return lib.filter.targetEnabled2( + get.event("cardx"), + player, + target + ) /*&&lib.filter.targetInRange(get.event('cardx'),player,target)*/; + }, true) + .set("cardx", cardx) + .set("selectTarget", [1, cards.length]) + .set( + "prompt", + "请选择" + + (game.hasNature(cardx) ? get.translation(get.nature(cardx)) : "") + + "【" + + get.translation(cardx) + + "】(" + + get.translation(cards) + + ")的目标" + ) + .set("ai", (target) => { + const player = get.event("player"), + card = get.event("cardx"); + return get.effect(target, card, player, player); + }); + if (bool) player.useCard(cardx, cards, targets.sortBySeat()); }, - ai:{ - order:9, - result:{player:1}, + ai: { + order: 9, + result: { player: 1 }, }, }, - starjiaowang:{ - audio:2, - trigger:{global:'roundStart'}, - filter(event,player){ - if(game.roundNumber<=1) return false; - const history=game.getAllGlobalHistory(); - for(let i=history.length-2;i>=0;i--){ - const evt=history[i]['everything']; - for(let j=evt.length-1;j>=0;j--){ - if(evt[j].name=='die'&&evt[j].getParent(3).name!='starxiaoyan') return false; + starjiaowang: { + audio: 2, + trigger: { global: "roundStart" }, + filter(event, player) { + if (game.roundNumber <= 1) return false; + const history = game.getAllGlobalHistory(); + for (let i = history.length - 2; i >= 0; i--) { + const evt = history[i]["everything"]; + for (let j = evt.length - 1; j >= 0; j--) { + if (evt[j].name == "die" && evt[j].getParent(3).name != "starxiaoyan") + return false; } - if(history[i].isRound) break; + if (history[i].isRound) break; } return true; }, - forced:true, - async content(event,trigger,player){ + forced: true, + async content(event, trigger, player) { await player.loseHp(); - if(game.hasPlayer(current=>current!=player)) player.useResult({skill:'starxiaoyan'},event); + if (game.hasPlayer((current) => current != player)) + player.useResult({ skill: "starxiaoyan" }, event); }, }, - staraoshi:{ - audio:2, - zhuSkill:true, - global:'staraoshi_global', - subSkill:{ - global:{ - audio:'staraoshi', - forceaudio:true, - enable:'phaseUse', - filter(event,player){ - return player.group=='qun'&&game.hasPlayer(target=>lib.skill.staraoshi.subSkill.global.filterTarget(null,player,target)); + staraoshi: { + audio: 2, + zhuSkill: true, + global: "staraoshi_global", + subSkill: { + global: { + audio: "staraoshi", + forceaudio: true, + enable: "phaseUse", + filter(event, player) { + return ( + player.group == "qun" && + game.hasPlayer((target) => + lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target) + ) + ); }, - filterTarget(card,player,target){ - return target!=player&&target.hasZhuSkill('staraoshi'); + filterTarget(card, player, target) { + return target != player && target.hasZhuSkill("staraoshi"); }, - prompt(){ - const player=get.event('player'); - const targets=game.filterPlayer(target=>lib.skill.staraoshi.subSkill.global.filterTarget(null,player,target)); - return '交给'+get.translation(targets)+(targets.length>1?'中的一人':'')+'一张手牌,然后其可以发动一次【纵势】'; + prompt() { + const player = get.event("player"); + const targets = game.filterPlayer((target) => + lib.skill.staraoshi.subSkill.global.filterTarget(null, player, target) + ); + return ( + "交给" + + get.translation(targets) + + (targets.length > 1 ? "中的一人" : "") + + "一张手牌,然后其可以发动一次【纵势】" + ); }, - filterCard:true, - check(card){ - const player=get.event('player'); - const target=game.filterPlayer(target=>{ - return lib.skill.staraoshi.subSkill.global.filterTarget(null,player,target); - }).sort((a,b)=>b.countCards('h')-a.countCards('h'))[0]; + filterCard: true, + check(card) { + const player = get.event("player"); + const target = game + .filterPlayer((target) => { + return lib.skill.staraoshi.subSkill.global.filterTarget( + null, + player, + target + ); + }) + .sort((a, b) => b.countCards("h") - a.countCards("h"))[0]; return target.getUseValue(card); }, - discard:false, - lose:false, - delay:false, - usable:1, - async content(event,trigger,player){ - const target=event.target,info=get.info('starzongshi'); - await player.give(event.cards,target); - const {result:{bool,cards}}= await target.chooseCard(info.position,(card,player)=>{ - return get.event('info').filterCard(card,player); - }).set('info',info).set('ai',card=>get.event('info').check(card)).set('selectCard',[1,2]).set('complexCard',true) - .set('prompt',get.prompt('starzongshi')).set('prompt2',lib.translate.starzongshi_info.slice(8).slice(0,-1)); - if(bool) target.useResult({skill:'starzongshi',cards:cards},event); + discard: false, + lose: false, + delay: false, + usable: 1, + async content(event, trigger, player) { + const target = event.target, + info = get.info("starzongshi"); + await player.give(event.cards, target); + const { + result: { bool, cards }, + } = await target + .chooseCard(info.position, (card, player) => { + return get.event("info").filterCard(card, player); + }) + .set("info", info) + .set("ai", (card) => get.event("info").check(card)) + .set("selectCard", [1, 2]) + .set("complexCard", true) + .set("prompt", get.prompt("starzongshi")) + .set("prompt2", lib.translate.starzongshi_info.slice(8).slice(0, -1)); + if (bool) target.useResult({ skill: "starzongshi", cards: cards }, event); }, - ai:{ - order:9, - result:{ - target(player,target){ - return target.countCards('h')+1; + ai: { + order: 9, + result: { + target(player, target) { + return target.countCards("h") + 1; }, }, }, @@ -483,637 +707,841 @@ game.import('character', function () { }, }, //星董卓 - starweilin:{ - audio:2, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return !event.player.getHistory('damage').length&&player.getHistory('useCard').length>=event.player.getHp(); + starweilin: { + audio: 2, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return ( + !event.player.getHistory("damage").length && + player.getHistory("useCard").length >= event.player.getHp() + ); }, - forced:true, - logTarget:'player', - content:function(){ + forced: true, + logTarget: "player", + content: function () { trigger.num++; }, }, - starzhangrong:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.getHp()>0; + starzhangrong: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getHp() > 0; }, - direct:true, - content:function*(event,map){ - var player=map.player; - var str=get.cnNumber(player.getHp()); - var choiceList=[ - '令至多'+str+'名体力值大于等于你的角色各失去1点体力', - '令至多'+str+'名手牌数大于等于你的角色各弃置一张手牌', - ],list=['cancel2']; - if(game.hasPlayer(target=>{ - if(target==player) return player.countCards('h',card=>lib.filter.cardDiscardable(card,player)); - return target.countCards('h')>=Math.max(1,player.countCards('h')); - })) list.unshift('弃牌'); - else choiceList[1]=''+choiceList[1]+''; - list.unshift('扣血'); - var result=yield player.chooseControl(list).set('prompt','###'+get.prompt('starzhangrong')+'###选择其中一项令任意名符合条件的角色执行,然后你摸等量的牌,回合结束时,若这些角色中有本回合未受到过伤害的角色,则你失去1点体力').set('ai',()=>{ - var player=_status.event.player; - var controls=_status.event.controls.slice(); - /* + direct: true, + content: function* (event, map) { + var player = map.player; + var str = get.cnNumber(player.getHp()); + var choiceList = [ + "令至多" + str + "名体力值大于等于你的角色各失去1点体力", + "令至多" + str + "名手牌数大于等于你的角色各弃置一张手牌", + ], + list = ["cancel2"]; + if ( + game.hasPlayer((target) => { + if (target == player) + return player.countCards("h", (card) => + lib.filter.cardDiscardable(card, player) + ); + return target.countCards("h") >= Math.max(1, player.countCards("h")); + }) + ) + list.unshift("弃牌"); + else choiceList[1] = '' + choiceList[1] + ""; + list.unshift("扣血"); + var result = yield player + .chooseControl(list) + .set( + "prompt", + "###" + + get.prompt("starzhangrong") + + "###选择其中一项令任意名符合条件的角色执行,然后你摸等量的牌,回合结束时,若这些角色中有本回合未受到过伤害的角色,则你失去1点体力" + ) + .set("ai", () => { + var player = _status.event.player; + var controls = _status.event.controls.slice(); + /* var cards=player.getCards('hes',card=>get.tag(card,'damage')&&player.hasValueTarget(card)); var cardx=cards.filter(card=>get.name(card)=='sha'); cardx.sort((a,b)=>player.getUseValue(b)-player.getUseValue(a)); cardx=cardx.slice(Math.min(cardx.length,player.getCardUsable('sha')),cardx.length); cards.removeArray(cardx); */ - var targets1=game.filterPlayer(target=>get.attitude(player,target)<0&&target.getHp()>=player.getHp()&&get.effect(target,{name:'losehp'},player,player)>0/*&&cards.some(card=>player.canUse(card,target))*/); - _status.starzhangrong_check=true; - var targets2=game.filterPlayer(target=>get.attitude(player,target)<0&&target.countCards('h')>=Math.max(1,player.countCards('h'))&&get.effect(target,{name:'guohe_copy2'},player,player)>0/*&&cards.some(card=>player.canUse(card,target))*/); - delete _status.starzhangrong_check; - [targets1,targets2].forEach(list=>{ - list.sort((a,b)=>get.damageEffect(b)-get.damageEffect(a)); - list=list.slice(0,Math.min(player.getHp()/*,cards.length*/)); - }); - if(!controls.includes('弃牌')) return 1-get.sgn(targets1.length); - return Math.max(0,get.sgn(targets2.length-targets1.length)); - }).set('choiceList',choiceList); - if(result.control!='cancel2'){ - var choice=result.index; - var result2=yield player.chooseTarget([1,player.getHp()],'请选择【掌戎】的目标','令至多'+str+'名'+(choice?'手牌数':'体力值')+'大于你的角色各'+(choice?'弃置一张手牌':'失去1点体力'),(card,player,target)=>{ - var name=_status.event.card.name; - if(name=='guohe_copy2'){ - if(target==player) return player.countCards('h',card=>lib.filter.cardDiscardable(card,player)); - return target.countCards('h')>=Math.max(1,player.countCards('h')); - } - return target.getHp()>=player.getHp(); - }).set('ai',target=>{ - var player=_status.event.player; - if(get.attitude(player,target)>=0) return 0; - return get.effect(target,_status.event.card,player,player); - }).set('card',{name:choice?'guohe_copy2':'losehp'}); - if(result2.bool){ - var targets=result2.targets.sortBySeat(); - player.logSkill('starzhangrong',targets); - targets.forEach(target=>{ - target.addTempSkill('starzhangrong_threaten'); - if(choice) target.chooseToDiscard('h',true); + var targets1 = game.filterPlayer( + (target) => + get.attitude(player, target) < 0 && + target.getHp() >= player.getHp() && + get.effect(target, { name: "losehp" }, player, player) > + 0 /*&&cards.some(card=>player.canUse(card,target))*/ + ); + _status.starzhangrong_check = true; + var targets2 = game.filterPlayer( + (target) => + get.attitude(player, target) < 0 && + target.countCards("h") >= Math.max(1, player.countCards("h")) && + get.effect(target, { name: "guohe_copy2" }, player, player) > + 0 /*&&cards.some(card=>player.canUse(card,target))*/ + ); + delete _status.starzhangrong_check; + [targets1, targets2].forEach((list) => { + list.sort((a, b) => get.damageEffect(b) - get.damageEffect(a)); + list = list.slice(0, Math.min(player.getHp() /*,cards.length*/)); + }); + if (!controls.includes("弃牌")) return 1 - get.sgn(targets1.length); + return Math.max(0, get.sgn(targets2.length - targets1.length)); + }) + .set("choiceList", choiceList); + if (result.control != "cancel2") { + var choice = result.index; + var result2 = yield player + .chooseTarget( + [1, player.getHp()], + "请选择【掌戎】的目标", + "令至多" + + str + + "名" + + (choice ? "手牌数" : "体力值") + + "大于你的角色各" + + (choice ? "弃置一张手牌" : "失去1点体力"), + (card, player, target) => { + var name = _status.event.card.name; + if (name == "guohe_copy2") { + if (target == player) + return player.countCards("h", (card) => + lib.filter.cardDiscardable(card, player) + ); + return target.countCards("h") >= Math.max(1, player.countCards("h")); + } + return target.getHp() >= player.getHp(); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + if (get.attitude(player, target) >= 0) return 0; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", { name: choice ? "guohe_copy2" : "losehp" }); + if (result2.bool) { + var targets = result2.targets.sortBySeat(); + player.logSkill("starzhangrong", targets); + targets.forEach((target) => { + target.addTempSkill("starzhangrong_threaten"); + if (choice) target.chooseToDiscard("h", true); else target.loseHp(); }); player.draw(targets.length); - player.when('phaseEnd').then(()=>{ - targets.forEach(target=>target.removeSkill('starzhangrong_threaten')); - var targetx=targets.filter(target=>!target.getHistory('damage').length); - if(targetx.length){ - targetx.forEach(target=>target.chat('乐')); - player.popup('杯具'); - player.loseHp(); - return; - } - player.popup('洗具'); - }).vars({targets:targets}); + player + .when("phaseEnd") + .then(() => { + targets.forEach((target) => target.removeSkill("starzhangrong_threaten")); + var targetx = targets.filter( + (target) => !target.getHistory("damage").length + ); + if (targetx.length) { + targetx.forEach((target) => target.chat("乐")); + player.popup("杯具"); + player.loseHp(); + return; + } + player.popup("洗具"); + }) + .vars({ targets: targets }); } } }, - global:'starzhangrong_check', - subSkill:{ - check:{ - mod:{ - canBeDiscarded:function(card,player,target){ - if(!_status.starzhangrong_check) return; - if(player.hasSkill('starzhangrong')&&get.position(card)!='h') return false; + global: "starzhangrong_check", + subSkill: { + check: { + mod: { + canBeDiscarded: function (card, player, target) { + if (!_status.starzhangrong_check) return; + if (player.hasSkill("starzhangrong") && get.position(card) != "h") + return false; }, }, }, - threaten:{ - charlotte:true, - trigger:{player:'damageEnd'}, - firstDo:true, - forced:true, - popup:false, - content:function(){ - player.removeSkill('starzhangrong_threaten'); + threaten: { + charlotte: true, + trigger: { player: "damageEnd" }, + firstDo: true, + forced: true, + popup: false, + content: function () { + player.removeSkill("starzhangrong_threaten"); }, - ai:{threaten:114514+1919810}, - mark:true, - markimage:'image/card/sha.png', - intro:{content:'我还没受到伤害哟!'}, + ai: { threaten: 114514 + 1919810 }, + mark: true, + markimage: "image/card/sha.png", + intro: { content: "我还没受到伤害哟!" }, }, }, }, - starhaoshou:{ - unique:true, - audio:2, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.player!=player&&event.card.name=='jiu'&&player.isDamaged()&&event.player.group=='qun'; + starhaoshou: { + unique: true, + audio: 2, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return ( + event.player != player && + event.card.name == "jiu" && + player.isDamaged() && + event.player.group == "qun" + ); }, - direct:true, - zhuSkill:true, - content:function*(event,map){ - var player=map.player,target=map.trigger.player; - var result=yield target.chooseBool(get.prompt('starhaoshou',player),'令'+get.translation(player)+'回复1点体力').set('choice',get.recoverEffect(player,target,target)>0); - if(result.bool){ + direct: true, + zhuSkill: true, + content: function* (event, map) { + var player = map.player, + target = map.trigger.player; + var result = yield target + .chooseBool( + get.prompt("starhaoshou", player), + "令" + get.translation(player) + "回复1点体力" + ) + .set("choice", get.recoverEffect(player, target, target) > 0); + if (result.bool) { target.line(player); - player.logSkill('starhaoshou'); + player.logSkill("starhaoshou"); player.recover(); } }, //global:'starhaoshou_global', - subSkill:{ - global:{ - audio:'starhaoshou', - forceaudio:true, - filter:function(event,player){ - if(!player.countCards('hes',card=>{ - if(get.position(card)=='h'&&_status.connectMode) return true; - return get.name(card)=='jiu'; - })) return false; - return event.type=='dying'&&event.dying&&event.dying!=player&&event.dying.hp<=0&&event.dying.hasZhuSkill('starhaoshou')&&player.group=='qun'; + subSkill: { + global: { + audio: "starhaoshou", + forceaudio: true, + filter: function (event, player) { + if ( + !player.countCards("hes", (card) => { + if (get.position(card) == "h" && _status.connectMode) return true; + return get.name(card) == "jiu"; + }) + ) + return false; + return ( + event.type == "dying" && + event.dying && + event.dying != player && + event.dying.hp <= 0 && + event.dying.hasZhuSkill("starhaoshou") && + player.group == "qun" + ); }, - filterCard:function(card,player){ - return get.name(card)=='jiu'; + filterCard: function (card, player) { + return get.name(card) == "jiu"; }, - check:()=>1, - viewAs:{name:'tao'}, - position:'hes', - prompt:function(){ - return '将一张【酒】当作【桃】对'+get.translation(_status.event.dying)+'使用'; + check: () => 1, + viewAs: { name: "tao" }, + position: "hes", + prompt: function () { + return "将一张【酒】当作【桃】对" + get.translation(_status.event.dying) + "使用"; }, - ai:{ - save:true, - skillTagFilter:function(player,arg,target){ - if(!player.countCards('hes',card=>{ - if(get.position(card)=='h'&&_status.connectMode) return true; - return get.name(card)=='jiu'; - })||player==target||!target.hasSkill('starhaoshou')||player.group!='qun') return false; + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + if ( + !player.countCards("hes", (card) => { + if (get.position(card) == "h" && _status.connectMode) return true; + return get.name(card) == "jiu"; + }) || + player == target || + !target.hasSkill("starhaoshou") || + player.group != "qun" + ) + return false; }, }, }, }, }, //星袁术 - starcanxi:{ - audio:2, - trigger:{ - global:['phaseBefore','roundStart'], - player:'enterGame', + starcanxi: { + audio: 2, + trigger: { + global: ["phaseBefore", "roundStart"], + player: "enterGame", }, - filter:function(event,player,name){ - if(name=='roundStart') return player.getSkills().some(skill=>skill.indexOf('starcanxi_')==0); - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player, name) { + if (name == "roundStart") + return player.getSkills().some((skill) => skill.indexOf("starcanxi_") == 0); + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - content:function(){ - 'step 0' - if(event.triggername!='roundStart'){ - var list=game.filterPlayer().reduce((list,target)=>list.add(target.group),[]); - list.sort((a,b)=>lib.group.indexOf(a)-lib.group.indexOf(b)); - list.forEach(group=>lib.skill.starcanxi.create(group,player)); + forced: true, + content: function () { + "step 0"; + if (event.triggername != "roundStart") { + var list = game.filterPlayer().reduce((list, target) => list.add(target.group), []); + list.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); + list.forEach((group) => lib.skill.starcanxi.create(group, player)); event.finish(); return; } - 'step 1' - var groups=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0); - groups=groups.map(group=>group.slice(10)); - groups.sort((a,b)=>lib.group.indexOf(a)-lib.group.indexOf(b)); - var map={}; - groups.forEach(group=>map[group]=get.translation(group+'2')); - event.map=map; - player.chooseButton([ - '###残玺###
    请选择势力和效果
    ', - [Object.values(map),'tdnodes'], - [[ - ['wangsheng',''], - ['xiangsi',''] - ],'textbutton'] - ],2,true).set('filterButton',function(button){ - var list=['wangsheng','xiangsi']; - if(!ui.selected.buttons.length) return true; - return list.includes(ui.selected.buttons[0].link)!=list.includes(button.link); - }).set('ai',function(button){ - var player=_status.event.player; - var map=_status.event.map,list=['wangsheng','xiangsi']; - var getNum=function(group,effect){ - var num=0,sgn=effect=='wangsheng'?1.05:-1; - game.countPlayer(function(current){ - if(!(current==player&&sgn==-1)) num+=get.sgn(get.attitude(player,current))*sgn; - }); - return num; - }; - var listx=[]; - Object.keys(map).forEach(group=>list.forEach(effect=>listx.add([group,effect]))); - listx.sort((a,b)=>getNum(b[0],b[1])-getNum(a[0],a[1])); - if(button.link==map[listx[0][0]]||button.link==listx[0][1]) return 1; - return 0; - }).set('map',map); - 'step 2' - if(result.bool){ - if(!Object.keys(event.map).some(group=>event.map[group]==result.links[0])) result.links.reverse(); + ("step 1"); + var groups = player.getSkills().filter((skill) => skill.indexOf("starcanxi_") == 0); + groups = groups.map((group) => group.slice(10)); + groups.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); + var map = {}; + groups.forEach((group) => (map[group] = get.translation(group + "2"))); + event.map = map; + player + .chooseButton( + [ + '###残玺###
    请选择势力和效果
    ', + [Object.values(map), "tdnodes"], + [ + [ + [ + "wangsheng", + '', + ], + [ + "xiangsi", + '', + ], + ], + "textbutton", + ], + ], + 2, + true + ) + .set("filterButton", function (button) { + var list = ["wangsheng", "xiangsi"]; + if (!ui.selected.buttons.length) return true; + return list.includes(ui.selected.buttons[0].link) != list.includes(button.link); + }) + .set("ai", function (button) { + var player = _status.event.player; + var map = _status.event.map, + list = ["wangsheng", "xiangsi"]; + var getNum = function (group, effect) { + var num = 0, + sgn = effect == "wangsheng" ? 1.05 : -1; + game.countPlayer(function (current) { + if (!(current == player && sgn == -1)) + num += get.sgn(get.attitude(player, current)) * sgn; + }); + return num; + }; + var listx = []; + Object.keys(map).forEach((group) => + list.forEach((effect) => listx.add([group, effect])) + ); + listx.sort((a, b) => getNum(b[0], b[1]) - getNum(a[0], a[1])); + if (button.link == map[listx[0][0]] || button.link == listx[0][1]) return 1; + return 0; + }) + .set("map", map); + ("step 2"); + if (result.bool) { + if (!Object.keys(event.map).some((group) => event.map[group] == result.links[0])) + result.links.reverse(); player.popup(result.links[0]); - var group=Object.keys(event.map).find(group=>event.map[group]==result.links[0]); - var skill='starcanxi_'+result.links[1]; + var group = Object.keys(event.map).find( + (group) => event.map[group] == result.links[0] + ); + var skill = "starcanxi_" + result.links[1]; player.popup(skill); - game.log(player,'选择了','#g'+result.links[0],'、','#y'+get.translation(skill)); - player.addTempSkill(skill,'roundStart'); - player.markAuto(skill,[group]); + game.log( + player, + "选择了", + "#g" + result.links[0], + "、", + "#y" + get.translation(skill) + ); + player.addTempSkill(skill, "roundStart"); + player.markAuto(skill, [group]); } }, - create:function(group,player){ - const skill='starcanxi_'+group; - get.info('starcanxi').createSkill(skill); - if(!_status.postReconnect.starcanxi){ - _status.postReconnect.starcanxi=[get.info('starcanxi').createSkill,[]]; + create: function (group, player) { + const skill = "starcanxi_" + group; + get.info("starcanxi").createSkill(skill); + if (!_status.postReconnect.starcanxi) { + _status.postReconnect.starcanxi = [get.info("starcanxi").createSkill, []]; } _status.postReconnect.starcanxi[1].add(skill); player.addSkill(skill); }, - createSkill(skill){ - if(!lib.skill[skill]) game.broadcastAll(skill=>{ - const group=skill.slice('starcanxi_'.length); - lib.skill[skill]={ - mark:true, - charlotte:true, - onremove:function(player){ - player.addMark('starpizhi',1,false); - }, - intro:{content:'玉玺的一角'}, - }; - lib.translate[skill]='残玺·'+get.translation(group+'2'); - lib.skill[skill].marktext=get.translation(group); - lib.translate[skill+'_bg']=get.translation(group); - },skill); + createSkill(skill) { + if (!lib.skill[skill]) + game.broadcastAll((skill) => { + const group = skill.slice("starcanxi_".length); + lib.skill[skill] = { + mark: true, + charlotte: true, + onremove: function (player) { + player.addMark("starpizhi", 1, false); + }, + intro: { content: "玉玺的一角" }, + }; + lib.translate[skill] = "残玺·" + get.translation(group + "2"); + lib.skill[skill].marktext = get.translation(group); + lib.translate[skill + "_bg"] = get.translation(group); + }, skill); }, - subSkill:{ - wangsheng:{ - charlotte:true, - onremove:true, - trigger:{global:'damageBegin1'}, - filter:function(event,player){ - if(!event.source||!player.getStorage('starcanxi_wangsheng').includes(event.source.group)) return false; - return !event.source.getHistory('sourceDamage').length; + subSkill: { + wangsheng: { + charlotte: true, + onremove: true, + trigger: { global: "damageBegin1" }, + filter: function (event, player) { + if ( + !event.source || + !player.getStorage("starcanxi_wangsheng").includes(event.source.group) + ) + return false; + return !event.source.getHistory("sourceDamage").length; }, - forced:true, - logTarget:'source', - content:function(){ + forced: true, + logTarget: "source", + content: function () { trigger.num++; }, - group:'starcanxi_remove', - global:'starcanxi_effect', - intro:{content:'$势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1'}, + group: "starcanxi_remove", + global: "starcanxi_effect", + intro: { content: "$势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1" }, }, - xiangsi:{ - charlotte:true, - onremove:true, - trigger:{global:'recoverEnd'}, - filter:function(event,player){ - if(!player.getStorage('starcanxi_xiangsi').includes(event.player.group)||event.player==player) return false; - return game.getGlobalHistory('changeHp',function(evt){ - return evt.getParent().name=='recover'&&evt.player==event.player; - }).length==1; + xiangsi: { + charlotte: true, + onremove: true, + trigger: { global: "recoverEnd" }, + filter: function (event, player) { + if ( + !player.getStorage("starcanxi_xiangsi").includes(event.player.group) || + event.player == player + ) + return false; + return ( + game.getGlobalHistory("changeHp", function (evt) { + return evt.getParent().name == "recover" && evt.player == event.player; + }).length == 1 + ); }, - forced:true, - logTarget:'player', - content:function(){ + forced: true, + logTarget: "player", + content: function () { trigger.player.loseHp(); }, - group:['starcanxi_remove','starcanxi_cancel'], - global:'starcanxi_effect', - intro:{content:'其他$势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效'}, - }, - cancel:{ - charlotte:true, - trigger:{global:'useCard'}, - filter:function(event,player){ - if(!event.targets||!event.targets.includes(player)||!player.getStorage('starcanxi_xiangsi').includes(event.player.group)||event.player==player) return false; - return event.player.getHistory('useCard',evt=>evt.targets&&evt.targets.includes(player)).indexOf(event)==0; + group: ["starcanxi_remove", "starcanxi_cancel"], + global: "starcanxi_effect", + intro: { + content: + "其他$势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效", }, - forced:true, - logTarget:'player', - content:function(){ + }, + cancel: { + charlotte: true, + trigger: { global: "useCard" }, + filter: function (event, player) { + if ( + !event.targets || + !event.targets.includes(player) || + !player.getStorage("starcanxi_xiangsi").includes(event.player.group) || + event.player == player + ) + return false; + return ( + event.player + .getHistory( + "useCard", + (evt) => evt.targets && evt.targets.includes(player) + ) + .indexOf(event) == 0 + ); + }, + forced: true, + logTarget: "player", + content: function () { trigger.excluded.add(player); }, }, - effect:{ - mod:{ - globalFrom:function(from,to,distance){ - if(game.hasPlayer(target=>target.getStorage('starcanxi_wangsheng').includes(from.group))) return distance-1; + effect: { + mod: { + globalFrom: function (from, to, distance) { + if ( + game.hasPlayer((target) => + target.getStorage("starcanxi_wangsheng").includes(from.group) + ) + ) + return distance - 1; }, }, - ai:{ - effect:{ - player_use:function(card,player,target){ - var targets=game.filterPlayer(targetx=>targetx!=player&&targetx.getStorage('starcanxi_xiangsi').includes(player.group)); - if(!targets.length) return; - if(get.tag(card,'recover')&&target==player&&target.hp>2) return 0; - if(get.tag(card,'damage')&&targets.includes(target)) return 0.5; + ai: { + effect: { + player_use: function (card, player, target) { + var targets = game.filterPlayer( + (targetx) => + targetx != player && + targetx.getStorage("starcanxi_xiangsi").includes(player.group) + ); + if (!targets.length) return; + if (get.tag(card, "recover") && target == player && target.hp > 2) + return 0; + if (get.tag(card, "damage") && targets.includes(target)) return 0.5; }, }, }, }, - remove:{ - charlotte:true, - trigger:{player:'die'}, - forced:true, - popup:false, - firstDo:true, - forceDie:true, - content:function(){ - player.removeSkill('starcanxi_wangsheng'); - player.removeSkill('starcanxi_xiangsi'); + remove: { + charlotte: true, + trigger: { player: "die" }, + forced: true, + popup: false, + firstDo: true, + forceDie: true, + content: function () { + player.removeSkill("starcanxi_wangsheng"); + player.removeSkill("starcanxi_xiangsi"); }, }, }, }, - starpizhi:{ - audio:2, - trigger:{player:'phaseEnd',global:'die'}, - filter:function(event,player){ - if(event.name=='phase') return player.hasMark('starpizhi'); - if(!player.getStorage('starcanxi_wangsheng').includes(event.player.group)&&!player.getStorage('starcanxi_xiangsi').includes(event.player.group)) return false; - var groups=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0); - groups=groups.map(group=>group.slice(10)); + starpizhi: { + audio: 2, + trigger: { player: "phaseEnd", global: "die" }, + filter: function (event, player) { + if (event.name == "phase") return player.hasMark("starpizhi"); + if ( + !player.getStorage("starcanxi_wangsheng").includes(event.player.group) && + !player.getStorage("starcanxi_xiangsi").includes(event.player.group) + ) + return false; + var groups = player.getSkills().filter((skill) => skill.indexOf("starcanxi_") == 0); + groups = groups.map((group) => group.slice(10)); return groups.includes(event.player.group); }, - forced:true, - content:function(){ - 'step 0' - if(trigger.name=='die'){ - var skills=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0&&skill.slice(10)==trigger.player.group); + forced: true, + content: function () { + "step 0"; + if (trigger.name == "die") { + var skills = player + .getSkills() + .filter( + (skill) => + skill.indexOf("starcanxi_") == 0 && + skill.slice(10) == trigger.player.group + ); player.removeSkill(skills); } - 'step 1' - player.draw(player.countMark('starpizhi')); + ("step 1"); + player.draw(player.countMark("starpizhi")); }, - intro:{content:'已失去#个“玺角”'}, - ai:{combo:'starcanxi'}, + intro: { content: "已失去#个“玺角”" }, + ai: { combo: "starcanxi" }, }, - starzhonggu:{ - unique:true, - audio:2, - trigger:{player:'phaseDrawBegin2'}, - filter:function(event,player){ + starzhonggu: { + unique: true, + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + filter: function (event, player) { return !event.numFixed; }, - forced:true, - zhuSkill:true, - content:function(){ - var num=(game.roundNumber>=game.countPlayer(current=>current.group=='qun')?2:-1); - trigger.num+=num; + forced: true, + zhuSkill: true, + content: function () { + var num = + game.roundNumber >= game.countPlayer((current) => current.group == "qun") ? 2 : -1; + trigger.num += num; }, }, //星曹仁 - starsujun:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - return player.countCards('h',{type:'basic'})*2==player.countCards('h'); + starsujun: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return player.countCards("h", { type: "basic" }) * 2 == player.countCards("h"); }, - frequent:true, - locked:false, - content:function(){ + frequent: true, + locked: false, + content: function () { player.draw(2); }, - mod:{ - aiOrder:function(player,card,num){ - var num=player.countCards('h')-2*player.countCards('h',{type:'basic'}); - if(Math.abs(num)!=1) return; - if(num==1&&get.type(card)!='basic') return num+10; - if(num==-1&&get.type(card)=='basic') return num+10; + mod: { + aiOrder: function (player, card, num) { + var num = player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); + if (Math.abs(num) != 1) return; + if (num == 1 && get.type(card) != "basic") return num + 10; + if (num == -1 && get.type(card) == "basic") return num + 10; }, }, }, - starlifeng:{ - audio:2, - enable:'chooseToUse', - filter:function(event,player){ - if(!event.filterCard(get.autoViewAs({name:'sha'},'unsure'),player,event)&&!event.filterCard(get.autoViewAs({name:'wuxie'},'unsure'),player,event)) return false; - return player.hasCard(card=>{ - return !player.getStorage('starlifeng_count').includes(get.color(card,player)); - },'hs'); + starlifeng: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + if ( + !event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && + !event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) + ) + return false; + return player.hasCard((card) => { + return !player.getStorage("starlifeng_count").includes(get.color(card, player)); + }, "hs"); }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - if(event.filterCard(get.autoViewAs({name:'sha'},'unsure'),player,event)) list.push(['基本','','sha']); - if(event.filterCard(get.autoViewAs({name:'wuxie'},'unsure'),player,event)) list.push(['锦囊','','wuxie']); - return ui.create.dialog('砺锋',[list,'vcard']); + chooseButton: { + dialog: function (event, player) { + var list = []; + if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) + list.push(["基本", "", "sha"]); + if (event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event)) + list.push(["锦囊", "", "wuxie"]); + return ui.create.dialog("砺锋", [list, "vcard"]); }, - check:function(button){ - var player=_status.event.player; - return _status.event.getParent().type=='phase'?player.getUseValue({name:button.link[2]}):1 + check: function (button) { + var player = _status.event.player; + return _status.event.getParent().type == "phase" + ? player.getUseValue({ name: button.link[2] }) + : 1; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:function(card,player){ - return !player.getStorage('starlifeng_count').includes(get.color(card,player)); + filterCard: function (card, player) { + return !player + .getStorage("starlifeng_count") + .includes(get.color(card, player)); }, - precontent:function(){ + precontent: function () { delete event.result.skill; - player.logSkill('starlifeng'); - event.getParent().addCount=false; + player.logSkill("starlifeng"); + event.getParent().addCount = false; }, - popname:true, - viewAs:{ - name:links[0][2], + popname: true, + viewAs: { + name: links[0][2], }, - ai1:function(card){ - var player=_status.event.player; - var num=player.countCards('h')-2*player.countCards('h',{type:'basic'}); - if(player.hasSkill('starsujin')&&Math.abs(num)==1){ - if(num==1&&get.type(card)!='basic') return 15-get.value(card); - if(num==-1&&get.type(card)=='basic') return 15-get.value(card); + ai1: function (card) { + var player = _status.event.player; + var num = + player.countCards("h") - 2 * player.countCards("h", { type: "basic" }); + if (player.hasSkill("starsujin") && Math.abs(num) == 1) { + if (num == 1 && get.type(card) != "basic") return 15 - get.value(card); + if (num == -1 && get.type(card) == "basic") return 15 - get.value(card); } - return 7-get.value(card); + return 7 - get.value(card); }, }; }, - prompt:function(links){ - return '将一张本回合未使用过的颜色的手牌当做【'+get.translation(links[0][2])+'】使用'; + prompt: function (links) { + return ( + "将一张本回合未使用过的颜色的手牌当做【" + get.translation(links[0][2]) + "】使用" + ); }, }, - hiddenCard:function(player,name){ - if(name=='wuxie') return player.countCards('hs',card=>{ - return !player.getStorage('starlifeng_count').includes(get.color(card,player))||_status.connectMode; - }); + hiddenCard: function (player, name) { + if (name == "wuxie") + return player.countCards("hs", (card) => { + return ( + !player.getStorage("starlifeng_count").includes(get.color(card, player)) || + _status.connectMode + ); + }); }, - ai:{ - respondSha:true, - skillTagFilter:function(player,tag,arg){ - if(arg=='respond') return false; - if(!player.countCards('hs',card=>{ - return !player.getStorage('starlifeng_count').includes(get.color(card,player))||_status.connectMode; - })) return false; + ai: { + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (arg == "respond") return false; + if ( + !player.countCards("hs", (card) => { + return ( + !player + .getStorage("starlifeng_count") + .includes(get.color(card, player)) || _status.connectMode + ); + }) + ) + return false; }, - order:10, - result:{player:1}, + order: 10, + result: { player: 1 }, }, - group:'starlifeng_mark', - subSkill:{ - mark:{ - charlotte:true, - trigger:{global:'useCard1'}, - filter:function(event,player){ - return !player.getStorage('starlifeng_count').includes(get.color(event.card)); + group: "starlifeng_mark", + subSkill: { + mark: { + charlotte: true, + trigger: { global: "useCard1" }, + filter: function (event, player) { + return !player.getStorage("starlifeng_count").includes(get.color(event.card)); }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - player.addTempSkill('starlifeng_count'); - player.markAuto('starlifeng_count',[get.color(trigger.card)]); + forced: true, + popup: false, + firstDo: true, + content: function () { + player.addTempSkill("starlifeng_count"); + player.markAuto("starlifeng_count", [get.color(trigger.card)]); }, }, - count:{ - charlotte:true, - onremove:true, + count: { + charlotte: true, + onremove: true, }, }, }, //小程序刘伶 - mpjiusong:{ - audio:2, - enable:'chooseToUse', - trigger:{global:'useCard'}, - filterCard:function(card){ - return get.type2(card)=='trick'; + mpjiusong: { + audio: 2, + enable: "chooseToUse", + trigger: { global: "useCard" }, + filterCard: function (card) { + return get.type2(card) == "trick"; }, - viewAs:{name:'jiu'}, - position:'hs', - viewAsFilter:function(player){ - return player.hasCard(card=>get.type2(card)=='trick','hs'); + viewAs: { name: "jiu" }, + position: "hs", + viewAsFilter: function (player) { + return player.hasCard((card) => get.type2(card) == "trick", "hs"); }, - check:function(card){ - if(get.itemtype(card)!=='card') return true; - if(get.event().type=='dying') return 1/Math.max(0.1,get.value(card)); - return 4-get.value(card); + check: function (card) { + if (get.itemtype(card) !== "card") return true; + if (get.event().type == "dying") return 1 / Math.max(0.1, get.value(card)); + return 4 - get.value(card); }, - prompt:'将一张锦囊牌当【酒】使用', - filter:function(event,player){ - if(event.name=='chooseToUse') return player.hasCard(card=>get.type2(card)=='trick','hs'); - return event.card.name=='jiu'&&player.countMark('mpjiusong')<3; + prompt: "将一张锦囊牌当【酒】使用", + filter: function (event, player) { + if (event.name == "chooseToUse") + return player.hasCard((card) => get.type2(card) == "trick", "hs"); + return event.card.name == "jiu" && player.countMark("mpjiusong") < 3; }, - forced:true, - locked:false, - content:function(){ - player.addMark('mpjiusong'); + forced: true, + locked: false, + content: function () { + player.addMark("mpjiusong"); + }, + marktext: "醉", + intro: { + name: "醉(酒颂/酕醄)", + name2: "醉", + content: "mark", }, - marktext:'醉', - intro:{ - name:'醉(酒颂/酕醄)', - name2:'醉', - content:'mark', - } }, - mpmaotao:{ - audio:2, - trigger:{global:'useCardToPlayer'}, - filter:function(event,player){ - if(event.targets.length!=1||!event.isFirstTarget) return false; - if(!['basic','trick'].includes(get.type(event.card))) return false; - return event.player!=player&&player.countMark('mpjiusong'); + mpmaotao: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + if (event.targets.length != 1 || !event.isFirstTarget) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; + return event.player != player && player.countMark("mpjiusong"); }, - prompt2:function(event,player){ + prompt2: function (event, player) { let list; - if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{ - return lib.filter.targetEnabled2(event.card,event.player,current); - }); - else list=game.filterPlayer(current=>current.canAddJudge(event.card)); - const gainText=`${list.length>1&&!player.storage.mpmaotao_gained?`若新目标与原目标相同,你`:''}${!player.storage.mpmaotao_gained?'获得牌堆中的一张锦囊牌。':''}`; - return `移去1枚“醉”${list.length>1?`,令${get.translation(event.card)}目标改为${get.translation(list)}中的一名随机角色`:''}。${gainText}`; + if (get.type(event.card) != "delay") + list = game.filterPlayer((current) => { + return lib.filter.targetEnabled2(event.card, event.player, current); + }); + else list = game.filterPlayer((current) => current.canAddJudge(event.card)); + const gainText = `${ + list.length > 1 && !player.storage.mpmaotao_gained ? `若新目标与原目标相同,你` : "" + }${!player.storage.mpmaotao_gained ? "获得牌堆中的一张锦囊牌。" : ""}`; + return `移去1枚“醉”${ + list.length > 1 + ? `,令${get.translation(event.card)}目标改为${get.translation( + list + )}中的一名随机角色` + : "" + }。${gainText}`; }, - check:function(event,player){ - const eff=get.effect(event.target,event.card,player,player); + check: function (event, player) { + const eff = get.effect(event.target, event.card, player, player); let list; - if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{ - return lib.filter.targetEnabled2(event.card,event.player,current); - }); - else list=game.filterPlayer(current=>current.canAddJudge(event.card)); - let list2=list.filter(current=>get.effect(current,event.card,player,player)>eff); - let list3=list.filter(current=>get.effect(current,event.card,player,player)>0); - return list2.length>=list.length/2||player.countMark('mpjiusong')>=2&&list3.length>=list.length/2; + if (get.type(event.card) != "delay") + list = game.filterPlayer((current) => { + return lib.filter.targetEnabled2(event.card, event.player, current); + }); + else list = game.filterPlayer((current) => current.canAddJudge(event.card)); + let list2 = list.filter( + (current) => get.effect(current, event.card, player, player) > eff + ); + let list3 = list.filter((current) => get.effect(current, event.card, player, player) > 0); + return ( + list2.length >= list.length / 2 || + (player.countMark("mpjiusong") >= 2 && list3.length >= list.length / 2) + ); }, - content:function(){ - player.removeMark('mpjiusong',1); - var list,oriTarget=trigger.target; + content: function () { + player.removeMark("mpjiusong", 1); + var list, + oriTarget = trigger.target; trigger.targets.remove(oriTarget); trigger.getParent().triggeredTargets1.remove(oriTarget); trigger.untrigger(); game.delayx(); - if(get.type(trigger.card)!='delay') list=game.filterPlayer(current=>{ - return lib.filter.targetEnabled2(trigger.card,trigger.player,current); - }); - else list=game.filterPlayer(current=>current.canAddJudge(trigger.card)); - if(list.length) target=list.randomGet(); + if (get.type(trigger.card) != "delay") + list = game.filterPlayer((current) => { + return lib.filter.targetEnabled2(trigger.card, trigger.player, current); + }); + else list = game.filterPlayer((current) => current.canAddJudge(trigger.card)); + if (list.length) target = list.randomGet(); trigger.targets.push(target); - trigger.player.line(target,'thunder'); - game.log(trigger.card,'的目标被改为',target); - if(target==oriTarget&&!player.storage.mpmaotao_gained){ - var card=get.cardPile2(card=>get.type2(card)=='trick'); - if(card){ - if(!player.storage.mpmaotao_gained){ - player.when({global:'phaseAfter'}).then(()=>{ + trigger.player.line(target, "thunder"); + game.log(trigger.card, "的目标被改为", target); + if (target == oriTarget && !player.storage.mpmaotao_gained) { + var card = get.cardPile2((card) => get.type2(card) == "trick"); + if (card) { + if (!player.storage.mpmaotao_gained) { + player.when({ global: "phaseAfter" }).then(() => { delete player.storage.mpmaotao_gained; }); - player.storage.mpmaotao_gained=true; + player.storage.mpmaotao_gained = true; } - player.gain(card,'gain2'); - } - else{ + player.gain(card, "gain2"); + } else { // player.chat('没酒了!'); // game.log('但是牌堆中已经没有','#y酒','了!'); - player.chat('没牌了!'); - game.log('但是牌堆中已经没有','#y锦囊牌','了!'); + player.chat("没牌了!"); + game.log("但是牌堆中已经没有", "#y锦囊牌", "了!"); } } }, }, - mpbishi:{ - audio:2, - forced:true, - trigger:{global:'useCard1'}, - filter:function(event,player){ - if(get.type2(event.card)!='trick'||!get.tag(event.card,'damage')) return false; - if(!lib.skill.xunshi.isXunshi(event.card)) return false; - const targets=event.targets.slice(); + mpbishi: { + audio: 2, + forced: true, + trigger: { global: "useCard1" }, + filter: function (event, player) { + if (get.type2(event.card) != "trick" || !get.tag(event.card, "damage")) return false; + if (!lib.skill.xunshi.isXunshi(event.card)) return false; + const targets = event.targets.slice(); targets.remove(event.player); - return targets.length==game.countPlayer()-2; + return targets.length == game.countPlayer() - 2; + }, + content: function* () {}, + mod: { + targetEnabled: function (card) { + if (get.type2(card) == "trick" && get.tag(card, "damage") > 0) return false; + }, }, - content:function*(){}, - mod:{ - targetEnabled:function(card){ - if(get.type2(card)=='trick'&&get.tag(card,'damage')>0) return false; - } - } }, //十周年嵇康 dcjuexiang: { - derivation: 'dccanyun', - audio: 'juexiang', - trigger: { player: 'die' }, + derivation: "dccanyun", + audio: "juexiang", + trigger: { player: "die" }, forced: true, - locked:false, + locked: false, forceDie: true, skillAnimation: true, - animationColor: 'water', + animationColor: "water", content: function () { - 'step 0' + "step 0"; if (trigger.source && trigger.source.isIn()) { - trigger.source.discard(trigger.source.getCards('e')); + trigger.source.discard(trigger.source.getCards("e")); trigger.source.loseHp(); } - 'step 1' - player.chooseTarget('绝响:是否令一名其他角色获得技能〖残韵〗?', lib.filter.notMe).set('ai', function (target) { - return get.attitude(_status.event.player, target); - }).set('forceDie', true); - 'step 2' + ("step 1"); + player + .chooseTarget("绝响:是否令一名其他角色获得技能〖残韵〗?", lib.filter.notMe) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("forceDie", true); + ("step 2"); if (result.bool) { var target = result.targets[0]; - player.line(target, 'thunder'); - target.addSkills('dccanyun'); + player.line(target, "thunder"); + target.addSkills("dccanyun"); } }, }, dccanyun: { - enable: 'phaseUse', + enable: "phaseUse", filter: function (event, player) { return game.hasPlayer(function (target) { return lib.skill.dccanyun.filterTarget(null, player, target); @@ -1121,31 +1549,31 @@ game.import('character', function () { }, filterTarget: function (card, player, target) { var list = [player]; - player.getAllHistory('useSkill', function (evt) { - if (evt.skill == 'dccanyun') list.addArray(evt.targets); + player.getAllHistory("useSkill", function (evt) { + if (evt.skill == "dccanyun") list.addArray(evt.targets); }); return !list.includes(target) && !ui.selected.targets.length; }, selectTarget: [1, 2], targetprompt: function (target) { - var pe = _status.event.player.countCards('e', function (card) { + var pe = _status.event.player.countCards("e", function (card) { return ui.selected.cards.includes(card) == false; }); - var te = target.countCards('e'); - if (pe > te) return '回复体力'; - else if (pe == te) return '摸一张牌'; - else if (pe < te) return '失去体力'; + var te = target.countCards("e"); + if (pe > te) return "回复体力"; + else if (pe == te) return "摸一张牌"; + else if (pe < te) return "失去体力"; }, filterCard: true, - position: 'he', + position: "he", check: function (cardx) { var player = _status.event.player; var number = game.countPlayer(function (target) { if (player == target) return false; - var pe = player.countCards('e', function (card) { + var pe = player.countCards("e", function (card) { return card != cardx && ui.selected.cards.includes(card) == false; }); - var te = target.countCards('e'); + var te = target.countCards("e"); if (pe > te && target.isDamaged() && get.attitude(player, target) > 2) return true; else if (pe < te && get.attitude(player, target) < 0) return true; return false; @@ -1155,8 +1583,8 @@ game.import('character', function () { }, usable: 1, content: function () { - var pe = player.countCards('e'); - var te = target.countCards('e'); + var pe = player.countCards("e"); + var te = target.countCards("e"); if (pe > te) target.recover(); else if (pe == te) target.draw(); else if (pe < te) target.loseHp(); @@ -1168,8 +1596,8 @@ game.import('character', function () { order: 10, result: { target: function (player, target) { - var pe = player.countCards('e'); - var te = target.countCards('e'); + var pe = player.countCards("e"); + var te = target.countCards("e"); if (pe > te && target.isDamaged()) return 2; else if (pe == te) return 1; else if (pe < te) return -2.5; @@ -1179,1195 +1607,1519 @@ game.import('character', function () { }, }, //董翓 - dcjiaoxia:{ - mod:{ - cardUsableTarget:function(card,player,target){ - if(!player.isPhaseUsing()) return; - if(card.name=='sha'&&!player.getStorage('dcjiaoxia_mark').includes(target)) return true; + dcjiaoxia: { + mod: { + cardUsableTarget: function (card, player, target) { + if (!player.isPhaseUsing()) return; + if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) + return true; }, - targetInRange:function(card,player,target){ - if(!player.isPhaseUsing()) return; - if(card.name=='sha'&&!player.getStorage('dcjiaoxia_mark').includes(target)) return true; + targetInRange: function (card, player, target) { + if (!player.isPhaseUsing()) return; + if (card.name == "sha" && !player.getStorage("dcjiaoxia_mark").includes(target)) + return true; }, }, - audio:2, - locked:false, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.countCards('h'); + audio: 2, + locked: false, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h"); }, - check:function(event,player){ - return player.countCards('h',card=>{ - return game.hasPlayer(target=>{ - var cardx=get.autoViewAs({name:'sha'},[card]); - return player.canUse(cardx,target)&&get.effect(target,cardx,player,player)>0&&(!player.hasUseTarget(card)||player.hasValueTarget(card)); + check: function (event, player) { + return player.countCards("h", (card) => { + return game.hasPlayer((target) => { + var cardx = get.autoViewAs({ name: "sha" }, [card]); + return ( + player.canUse(cardx, target) && + get.effect(target, cardx, player, player) > 0 && + (!player.hasUseTarget(card) || player.hasValueTarget(card)) + ); }); }); }, - content:function(){ - var cards=player.getCards('h'); - player.addTempSkill('dcjiaoxia_used','phaseUseAfter'); - player.addGaintag(cards,'dcjiaoxia_used'); + content: function () { + var cards = player.getCards("h"); + player.addTempSkill("dcjiaoxia_used", "phaseUseAfter"); + player.addGaintag(cards, "dcjiaoxia_used"); }, - group:'dcjiaoxia_load', - subSkill:{ - load:{ - charlotte:true, - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(!player.isPhaseUsing()) return false; - return event.card.name=='sha'&&event.targets&&event.targets.some(target=>!player.getStorage('dcjiaoxia_mark').includes(target)); + group: "dcjiaoxia_load", + subSkill: { + load: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + return ( + event.card.name == "sha" && + event.targets && + event.targets.some( + (target) => !player.getStorage("dcjiaoxia_mark").includes(target) + ) + ); }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - player.addTempSkill('dcjiaoxia_mark','phaseUseAfter'); - player.markAuto('dcjiaoxia_mark',trigger.targets.filter(target=>!player.getStorage('dcjiaoxia_mark').includes(target))); + forced: true, + popup: false, + firstDo: true, + content: function () { + player.addTempSkill("dcjiaoxia_mark", "phaseUseAfter"); + player.markAuto( + "dcjiaoxia_mark", + trigger.targets.filter( + (target) => !player.getStorage("dcjiaoxia_mark").includes(target) + ) + ); }, }, - mark:{ - charlotte:true, - onremove:true, + mark: { + charlotte: true, + onremove: true, }, - used:{ - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dcjiaoxia_used')) return num+1; + used: { + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) + return num + 1; }, - cardname:function(card,player){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dcjiaoxia_used')) return 'sha'; + cardname: function (card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcjiaoxia_used")) + return "sha"; }, }, - charlotte:true, - onremove:function(player){ - player.removeGaintag('dcjiaoxia_used'); + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcjiaoxia_used"); }, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.cards&&event.cards.length==1&&player.hasUseTarget(get.copy(event.cards[0]))&&player.getHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dcjiaoxia_used')) return true; - } - return false; - }).length&&player.getHistory('sourceDamage',evt=>evt.card==event.card).length&&player.hasUseTarget(event.cards[0]); + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.cards && + event.cards.length == 1 && + player.hasUseTarget(get.copy(event.cards[0])) && + player.getHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcjiaoxia_used")) return true; + } + return false; + }).length && + player.getHistory("sourceDamage", (evt) => evt.card == event.card).length && + player.hasUseTarget(event.cards[0]) + ); }, - direct:true, - content:function(){ - player.chooseUseTarget(trigger.cards[0],get.prompt('dcjiaoxia'),false,false).set('prompt2','使用'+get.translation(card)).logSkill='dcjiaoxia'; + direct: true, + content: function () { + player + .chooseUseTarget(trigger.cards[0], get.prompt("dcjiaoxia"), false, false) + .set("prompt2", "使用" + get.translation(card)).logSkill = "dcjiaoxia"; }, }, }, }, - dchumei:{ - subSkill:{ - 0:{charlotte:true}, - 1:{charlotte:true}, - 2:{charlotte:true}, + dchumei: { + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + 2: { charlotte: true }, }, - onChooseToUse:function(event){ - if(!game.online&&!event.dchumei_num){ - var player=event.player; - var evtx=event.getParent('phaseUse'); - event.set('dchumei_num',player.getHistory('sourceDamage',evt=>{ - return evt.getParent('phaseUse')==evtx; - }).reduce((sum,evt)=>sum+evt.num,0)); + onChooseToUse: function (event) { + if (!game.online && !event.dchumei_num) { + var player = event.player; + var evtx = event.getParent("phaseUse"); + event.set( + "dchumei_num", + player + .getHistory("sourceDamage", (evt) => { + return evt.getParent("phaseUse") == evtx; + }) + .reduce((sum, evt) => sum + evt.num, 0) + ); } }, - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(typeof event.dchumei_num!='number') return false; - return game.hasPlayer(target=>lib.skill.dchumei.filterTarget(null,player,target)); + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (typeof event.dchumei_num != "number") return false; + return game.hasPlayer((target) => lib.skill.dchumei.filterTarget(null, player, target)); }, - filterTarget:function(card,player,target){ - if(target.getHp()>_status.event.dchumei_num) return false; - if(!player.hasSkill('dchumei_0')) return true; - if(!player.hasSkill('dchumei_1')&&target.countCards('he')) return true; - if(!player.hasSkill('dchumei_2')&&target.isDamaged()) return true; + filterTarget: function (card, player, target) { + if (target.getHp() > _status.event.dchumei_num) return false; + if (!player.hasSkill("dchumei_0")) return true; + if (!player.hasSkill("dchumei_1") && target.countCards("he")) return true; + if (!player.hasSkill("dchumei_2") && target.isDamaged()) return true; return false; }, - content:function(){ - 'step 0' - var str=get.translation(target); - player.chooseButton([ - '狐魅:请选择一项', - [[ - [0,'令'+str+'摸一张牌'], - [1,'令'+str+'交给你一张牌'], - [2,'令'+str+'回复1点体力'], - ].filter(list=>{ - if(player.hasSkill('dchumei_'+list[0])) return false; - if(list[0]==1&&!target.countCards('he')) return false; - if(list[0]==2&&target.isHealthy()) return false; + content: function () { + "step 0"; + var str = get.translation(target); + player + .chooseButton( + [ + "狐魅:请选择一项", + [ + [ + [0, "令" + str + "摸一张牌"], + [1, "令" + str + "交给你一张牌"], + [2, "令" + str + "回复1点体力"], + ].filter((list) => { + if (player.hasSkill("dchumei_" + list[0])) return false; + if (list[0] == 1 && !target.countCards("he")) return false; + if (list[0] == 2 && target.isHealthy()) return false; + return true; + }), + "textbutton", + ], + ], + true + ) + .set("filterButton", (button) => { + var target = _status.event.target; + if (player.hasSkill("dchumei_" + button.link)) return false; + if (button.link == 1 && !target.countCards("he")) return false; + if (button.link == 2 && target.isHealthy()) return false; return true; - }),'textbutton'] - ],true).set('filterButton',button=>{ - var target=_status.event.target; - if(player.hasSkill('dchumei_'+button.link)) return false; - if(button.link==1&&!target.countCards('he')) return false; - if(button.link==2&&target.isHealthy()) return false; - return true; - }).set('ai',function(button){ - var target=_status.event.target; - return [ - get.effect(target,{name:'draw'},player,player), - get.effect(target,{name:'shunshou_copy2'},player,player), - get.recoverEffect(target,player,player), - ][button.link]; - }).set('target',target); - 'step 1' - if(result.bool){ - var num=result.links[0]; - player.addTempSkill('dchumei_'+num,'phaseUseAfter'); - switch(num){ + }) + .set("ai", function (button) { + var target = _status.event.target; + return [ + get.effect(target, { name: "draw" }, player, player), + get.effect(target, { name: "shunshou_copy2" }, player, player), + get.recoverEffect(target, player, player), + ][button.link]; + }) + .set("target", target); + ("step 1"); + if (result.bool) { + var num = result.links[0]; + player.addTempSkill("dchumei_" + num, "phaseUseAfter"); + switch (num) { case 0: - target.draw(); - break; + target.draw(); + break; case 1: - target.chooseCard('狐魅:交给'+get.translation(player)+'一张牌','he',true); - break; + target.chooseCard( + "狐魅:交给" + get.translation(player) + "一张牌", + "he", + true + ); + break; case 2: - target.recover(); - break; + target.recover(); + break; } - if(num!=1) event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool) player.gain(result.cards,target,'giveAuto'); + if (num != 1) event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) player.gain(result.cards, target, "giveAuto"); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(!player.hasSkill('dchumei_0')) return 1; - if(!player.hasSkill('dchumei_1')) return -1; - if(!player.hasSkill('dchumei_2')) return 1; + ai: { + order: 1, + result: { + target: function (player, target) { + if (!player.hasSkill("dchumei_0")) return 1; + if (!player.hasSkill("dchumei_1")) return -1; + if (!player.hasSkill("dchumei_2")) return 1; }, }, }, }, //魏关羽 - dcdanji:{ - audio:'danji', - skillAnimation:true, - animationColor:'water', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - derivation:['mashu','dcnuchen'], - filter:function(event,player){ - return player.countCards('h')>player.hp; + dcdanji: { + audio: "danji", + skillAnimation: true, + animationColor: "water", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + derivation: ["mashu", "dcnuchen"], + filter: function (event, player) { + return player.countCards("h") > player.hp; }, - async content(event, trigger, player){ - player.awakenSkill('dcdanji'); + async content(event, trigger, player) { + player.awakenSkill("dcdanji"); await player.loseMaxHp(); - await player.recover(player.maxHp-player.hp); - await player.addSkills(['mashu','dcnuchen']); + await player.recover(player.maxHp - player.hp); + await player.addSkills(["mashu", "dcnuchen"]); }, - ai:{ - maixie:true, - skillTagFilter:(player,tag,arg)=>{ - if(tag==='maixie') return player.hp>=2&&!player.storage.dcdanji&&!player.hasSkill('dcnuchen')&&player.countCards('h')===player.hp; + ai: { + maixie: true, + skillTagFilter: (player, tag, arg) => { + if (tag === "maixie") + return ( + player.hp >= 2 && + !player.storage.dcdanji && + !player.hasSkill("dcnuchen") && + player.countCards("h") === player.hp + ); }, - effect:{ - target:(card,player,target)=>{ - let hs=target.countCards('h'); - if(target.hp<3||target.storage.dcdanji||target.hasSkill('dcnuchen')||hs>target.hp+1) return; - if(get.tag(card,'draw')) return 1.6; - if(get.tag(card,'lose')||get.tag(card,'discard')) return [1,-0.8]; - if(hs===target.hp&&get.tag(card,'damage')) return [1,target.hp/3]; - if(hs>target.hp&&target.hp>3&&(card.name==='shan'||card.name==='wuxie')) return 'zeroplayertarget'; - } - } - } + effect: { + target: (card, player, target) => { + let hs = target.countCards("h"); + if ( + target.hp < 3 || + target.storage.dcdanji || + target.hasSkill("dcnuchen") || + hs > target.hp + 1 + ) + return; + if (get.tag(card, "draw")) return 1.6; + if (get.tag(card, "lose") || get.tag(card, "discard")) return [1, -0.8]; + if (hs === target.hp && get.tag(card, "damage")) return [1, target.hp / 3]; + if ( + hs > target.hp && + target.hp > 3 && + (card.name === "shan" || card.name === "wuxie") + ) + return "zeroplayertarget"; + }, + }, + }, }, - dcnuchen:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.countCards('h')&&target!=player; + dcnuchen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h") && target != player; }, - content:function(){ - 'step 0' - player.choosePlayerCard(target,true,'h'); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - event.card=card; - player.showCards(card,get.translation(player)+'对'+get.translation(target)+'发动了【怒嗔】'); - } - else event.finish(); - 'step 2' - var suit=get.suit(card); - var str=get.translation(suit); - player.chooseToDiscard('怒嗔:是否弃置至少一张'+str+'牌?','若如此做,你对其造成等量伤害;或点击“取消”,获得其所有'+str+'手牌','he',{suit:suit},[1,Infinity]).set('ai',card=>{ - if(ui.selected.cards.length>=_status.event.num) return 0; - return 6-get.value(card); - }).set('num',function(){ - var eff=get.damageEffect(target,player,player); - if(eff>0){ - if(get.attitude(player,target)>0){ - return 1; - } - var cards=target.getCards('h',{suit:suit}); - if(cards.length>2||get.value(cards)>=6){ + content: function () { + "step 0"; + player.choosePlayerCard(target, true, "h"); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + event.card = card; + player.showCards( + card, + get.translation(player) + "对" + get.translation(target) + "发动了【怒嗔】" + ); + } else event.finish(); + ("step 2"); + var suit = get.suit(card); + var str = get.translation(suit); + player + .chooseToDiscard( + "怒嗔:是否弃置至少一张" + str + "牌?", + "若如此做,你对其造成等量伤害;或点击“取消”,获得其所有" + str + "手牌", + "he", + { suit: suit }, + [1, Infinity] + ) + .set("ai", (card) => { + if (ui.selected.cards.length >= _status.event.num) return 0; + return 6 - get.value(card); + }) + .set( + "num", + (function () { + var eff = get.damageEffect(target, player, player); + if (eff > 0) { + if (get.attitude(player, target) > 0) { + return 1; + } + var cards = target.getCards("h", { suit: suit }); + if (cards.length > 2 || get.value(cards) >= 6) { + return 0; + } + if ( + !player.hasSkillTag("jueqing", false, target) && + target.hasSkillTag("filterDamage", null, { player: player }) + ) + return 1; + return Infinity; + } return 0; - } - if(!player.hasSkillTag('jueqing',false,target)&&target.hasSkillTag('filterDamage',null,{player:player})) return 1; - return Infinity; - } - return 0; - }()); - 'step 3' - if(result.bool){ + })() + ); + ("step 3"); + if (result.bool) { target.damage(result.cards.length); - } - else{ - var cards=target.getCards('h',{suit:get.suit(card)}); - if(cards.length) player.gain(cards,target,'giveAuto','bySelf'); + } else { + var cards = target.getCards("h", { suit: get.suit(card) }); + if (cards.length) player.gain(cards, target, "giveAuto", "bySelf"); } }, - ai:{ - expose:0.4, - order:10, - result:{ - target:function(player,target){ - return -Math.sqrt(target.countCards('h')); - } - } - } + ai: { + expose: 0.4, + order: 10, + result: { + target: function (player, target) { + return -Math.sqrt(target.countCards("h")); + }, + }, + }, }, //孟达 - dclibang:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:true, - position:'he', - filter:function(event,player){ - return player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'dclibang'); - },'he')&&game.countPlayer(current=>current!=player)>=2; + dclibang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + filter: function (event, player) { + return ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "dclibang"); + }, "he") && game.countPlayer((current) => current != player) >= 2 + ); }, - filterTarget:function(card,player,target){ - return target!=player; + filterTarget: function (card, player, target) { + return target != player; }, - selectTarget:2, - multiline:true, - multitarget:true, - content:function(){ - 'step 0' - event.num=0; - event.cardsx=[]; + selectTarget: 2, + multiline: true, + multitarget: true, + content: function () { + "step 0"; + event.num = 0; + event.cardsx = []; event.targets.sortBySeat(); - 'step 1' - var current=targets[event.num]; - if(current.countCards('he')) player.gainPlayerCard(current,'he',true,'visibleMove'); + ("step 1"); + var current = targets[event.num]; + if (current.countCards("he")) player.gainPlayerCard(current, "he", true, "visibleMove"); event.num++; - 'step 2' - if(result.bool){ - var card=result.cards[0]; + ("step 2"); + if (result.bool) { + var card = result.cards[0]; event.cardsx.push(card); } - if(event.num{ - return player.canUse('sha',target); + ("step 1"); + var targets = event.getParent(2).targets.filter((target) => { + return player.canUse("sha", target); }); - if(!targets.length) event.finish(); - else player.chooseTarget('利傍:视为对其中一名角色使用一张【杀】',true,(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('targets',targets).set('ai',target=>{ - return get.effect(target,{name:'sha'},player,player); - }); - 'step 2' - if(result.bool){ - player.useCard({name:'sha',isCard:true},result.targets[0],false); + if (!targets.length) event.finish(); + else + player + .chooseTarget( + "利傍:视为对其中一名角色使用一张【杀】", + true, + (card, player, target) => { + return _status.event.targets.includes(target); + } + ) + .set("targets", targets) + .set("ai", (target) => { + return get.effect(target, { name: "sha" }, player, player); + }); + ("step 2"); + if (result.bool) { + player.useCard({ name: "sha", isCard: true }, result.targets[0], false); } event.finish(); - 'step 3' + ("step 3"); player.chooseCardTarget({ - filterCard:function(card){ - return get.itemtype(card)=='card'; + filterCard: function (card) { + return get.itemtype(card) == "card"; }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return _status.event.targets.includes(target); }, - selectCard:2, - targets:event.getParent(2).targets, - position:'he', - prompt:'交给其中一名角色两张牌,或失去1点体力', - ai1:function(card){ + selectCard: 2, + targets: event.getParent(2).targets, + position: "he", + prompt: "交给其中一名角色两张牌,或失去1点体力", + ai1: function (card) { return 1; }, - ai2:function(target){ - var player=_status.event.player,card=ui.selected.cards[0]; - var val=get.value(card,target); - if(val>0) return get.attitude(player,target)*2; - return (val-2)*get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + var val = get.value(card, target); + if (val > 0) return get.attitude(player, target) * 2; + return (val - 2) * get.attitude(player, target); }, }); - 'step 4' - if(result.bool){ - player.give(result.cards,result.targets[0]); - } - else player.loseHp(); + ("step 4"); + if (result.bool) { + player.give(result.cards, result.targets[0]); + } else player.loseHp(); }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(get.attitude(player,target)>0&&ui.selected.targets.length) return 0.1; + ai: { + order: 8, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0 && ui.selected.targets.length) return 0.1; return -1; - } - } - } + }, + }, + }, }, - dcwujie:{ - audio:2, - trigger:{ - global:['discardBegin','drawBegin'], + dcwujie: { + audio: 2, + trigger: { + global: ["discardBegin", "drawBegin"], }, - forced:true, - forceDie:true, - group:'dcwujie_inf', - logTarget:'player', - filter:function(event,player){ - return event.getParent().name=='die'&&event.getParent().source==event.player&&event.player!=player&&event.getParent().player==player; + forced: true, + forceDie: true, + group: "dcwujie_inf", + logTarget: "player", + filter: function (event, player) { + return ( + event.getParent().name == "die" && + event.getParent().source == event.player && + event.player != player && + event.getParent().player == player + ); }, - content:function(){ + content: function () { trigger.cancel(); }, - subSkill:{ - inf:{ - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - if(get.color(event.card)=='none'&&event.addCount!==false) return true; + subSkill: { + inf: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + if (get.color(event.card) == "none" && event.addCount !== false) return true; return false; }, - content:function(){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(typeof stat[name]=='number') stat[name]--; + content: function () { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; }, - } + }, }, - mod:{ - targetInRange:function(card,player){ + mod: { + targetInRange: function (card, player) { const color = get.color(card); - if (color === 'none' || color === 'unsure') return true; + if (color === "none" || color === "unsure") return true; }, - cardUsable:function(card){ + cardUsable: function (card) { const color = get.color(card); - if (color === 'none' || color === 'unsure') return Infinity; + if (color === "none" || color === "unsure") return Infinity; }, - } + }, }, //关宁 - dcxiuwen:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - return !player.getStorage('dcxiuwen').includes(event.card.name); + dcxiuwen: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return !player.getStorage("dcxiuwen").includes(event.card.name); }, - frequent:true, - content:function(){ + frequent: true, + content: function () { player.draw(); - player.markAuto('dcxiuwen',[trigger.card.name]); + player.markAuto("dcxiuwen", [trigger.card.name]); }, - intro:{content:'已使用:$'} + intro: { content: "已使用:$" }, }, - oldlongsong:{ - audio:'dclongsong', - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + oldlongsong: { + audio: "dclongsong", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - getSkills:function(target,player,trigger){ - return target.getSkills(null,false).filter(skill=>{ - var skills=game.expandSkills([skill]); - if(skills.filter(skillx=>{ - var info=get.info(skillx); - if(!info||!info.enable||(info.usable&&!(info.usable>=1))) return false; - if(info.enable!='phaseUse'&&(!Array.isArray(info.enable)||!info.enable.includes('phaseUse'))) return false; - if(info.viewAs&&info.usable&&info.usable!=1) return false; - if(info.juexingji||info.hiddenSkill||info.charlotte||info.limited||info.dutySkill) return false; - if((!info.usable||info.usable>1)&&info.filter){ - try{ - var bool1=info.filter(trigger,player); - var num=player.getStat().skill[skillx]; - player.getStat().skill[skillx]=1; - var bool2=info.filter(trigger,player); - if(!num) delete player.getStat().skill[skillx]; - else player.getStat().skill[skillx]=num; - var bool3=!(bool1&&!bool2); - } catch (e) { - console.trace(e); + getSkills: function (target, player, trigger) { + return target.getSkills(null, false).filter((skill) => { + var skills = game.expandSkills([skill]); + if ( + skills.filter((skillx) => { + var info = get.info(skillx); + if (!info || !info.enable || (info.usable && !(info.usable >= 1))) + return false; + if ( + info.enable != "phaseUse" && + (!Array.isArray(info.enable) || !info.enable.includes("phaseUse")) + ) + return false; + if (info.viewAs && info.usable && info.usable != 1) return false; + if ( + info.juexingji || + info.hiddenSkill || + info.charlotte || + info.limited || + info.dutySkill + ) + return false; + if ((!info.usable || info.usable > 1) && info.filter) { + try { + var bool1 = info.filter(trigger, player); + var num = player.getStat().skill[skillx]; + player.getStat().skill[skillx] = 1; + var bool2 = info.filter(trigger, player); + if (!num) delete player.getStat().skill[skillx]; + else player.getStat().skill[skillx] = num; + var bool3 = !(bool1 && !bool2); + } catch (e) { + console.trace(e); + } + if ( + !bool1 && + !bool2 && + get.skillInfoTranslation(skill, player).indexOf("出牌阶段限一次") == + -1 + ) + return false; + if ((bool1 || bool2) && bool3) return false; } - if(!bool1&&!bool2&&get.skillInfoTranslation(skill,player).indexOf('出牌阶段限一次')==-1) return false; - if((bool1||bool2)&&bool3) return false; - } + return true; + }).length + ) return true; - }).length) return true; return false; }); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:true, - selectCard:1, - filterTarget:function(card,player,target){ - return player!=target; + filterCard: true, + selectCard: 1, + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ - return 6-get.value(card); + ai1: function (card) { + return 6 - get.value(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target),trigger=_status.event.getTrigger(),player=_status.event.player; - return lib.skill.oldlongsong.getSkills(target,player,trigger).length*3+att/3; + ai2: function (target) { + var att = get.attitude(_status.event.player, target), + trigger = _status.event.getTrigger(), + player = _status.event.player; + return ( + lib.skill.oldlongsong.getSkills(target, player, trigger).length * 3 + att / 3 + ); }, - prompt:get.prompt2('oldlongsong') + prompt: get.prompt2("oldlongsong"), }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('oldlongsong',target); - event.target=target; - player.line(target,'green'); - player.give(result.cards,target); - var skills=lib.skill.oldlongsong.getSkills(target,player,trigger); - if(skills.length){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - target.disableSkill('oldlongsong_back',skills); - target.markAuto('oldlongsong_back',skills); - target.addTempSkill('oldlongsong_back',['phaseUseAfter','phaseAfter']); - var str=''; - for(var i=0; i0; + player.popup(skills, "thunder"); + }, + }, }, - getSkills:function(target){ - return target.getSkills(null,false).filter(skill=>{ - var str=get.skillInfoTranslation(skill,target); - if(str.indexOf('当你于出牌阶段')!=-1) return true; - var skills=game.expandSkills([skill]); - if(skills.some(skillx=>{ - var info=get.info(skillx); - if(!info||!info.enable) return false; - if(info.enable!='phaseUse'&&info.enable!='chooseToUse'&&(!Array.isArray(info.enable)||!info.enable.includes('phaseUse')&&!info.enable.includes('chooseToUse'))) return false; - if(info.juexingji||info.hiddenSkill||info.charlotte||info.limited||info.dutySkill) return false; - if(info.ai&&info.ai.notemp) return false; + }, + dclongsong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + getSkills: function (target) { + return target.getSkills(null, false).filter((skill) => { + var str = get.skillInfoTranslation(skill, target); + if (str.indexOf("当你于出牌阶段") != -1) return true; + var skills = game.expandSkills([skill]); + if ( + skills.some((skillx) => { + var info = get.info(skillx); + if (!info || !info.enable) return false; + if ( + info.enable != "phaseUse" && + info.enable != "chooseToUse" && + (!Array.isArray(info.enable) || + (!info.enable.includes("phaseUse") && + !info.enable.includes("chooseToUse"))) + ) + return false; + if ( + info.juexingji || + info.hiddenSkill || + info.charlotte || + info.limited || + info.dutySkill + ) + return false; + if (info.ai && info.ai.notemp) return false; + return true; + }) + ) return true; - })) return true; return false; }); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:{color:'red'}, - selectCard:1, - position:'he', - filterTarget:function(card,player,target){ - return player!=target; + filterCard: { color: "red" }, + selectCard: 1, + position: "he", + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ - return 6-get.value(card); + ai1: function (card) { + return 6 - get.value(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - return lib.skill.dclongsong.getSkills(target).length*2+att/2.5; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + return lib.skill.dclongsong.getSkills(target).length * 2 + att / 2.5; }, - prompt:get.prompt2('dclongsong') + prompt: get.prompt2("dclongsong"), }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dclongsong',target); - event.target=target; - player.line(target,'green'); - player.give(result.cards,target); - var skills=lib.skill.dclongsong.getSkills(target); - if(skills.length){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - target.disableSkill('dclongsong_back',skills); - target.markAuto('dclongsong_back',skills); - player.addTempSkill('dclongsong_remove',['phaseUseAfter','phaseAfter']); - player.markAuto('dclongsong_remove',skills); - target.addTempSkill('dclongsong_back',['phaseUseAfter','phaseAfter']); - var str=''; - for(var i=0; i{ - if(target==player) return false; - return target.hasCard(card=>{ - if(get.position(card)=='h') return true; - return get.color(card)=='red'&&lib.filter.canBeGained(card,player,target); - },'he'); + longsong: { + audio: "dclongsong", + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer((target) => { + if (target == player) return false; + return target.hasCard((card) => { + if (get.position(card) == "h") return true; + return get.color(card) == "red" && lib.filter.canBeGained(card, player, target); + }, "he"); }); }, - async cost(event,trigger,player){ - const func=function(player){ - game.countPlayer(target=>{ - if(target!=player){ - const skills=lib.skill.dclongsong.getSkills(target); - if(skills.length){ - target.prompt(skills.map(i=>get.translation(i)).join('
    ')); + async cost(event, trigger, player) { + const func = function (player) { + game.countPlayer((target) => { + if (target != player) { + const skills = lib.skill.dclongsong.getSkills(target); + if (skills.length) { + target.prompt(skills.map((i) => get.translation(i)).join("
    ")); } } }); }; - if(event.player==game.me) func(player); - else if(event.isOnline()) player.send(func,player); - event.result=await player.chooseTarget(get.prompt2('longsong'),(card,player,target)=>{ - if(target==player) return false; - return target.hasCard(card=>{ - if(get.position(card)=='h') return true; - return get.color(card)=='red'&&lib.filter.canBeGained(card,player,target); - },'he'); - }).set('ai',target=>{ - const player=get.event('player'),att=get.attitude(player,target); - if(att>0&&!target.getGainableCards(player,'he').some(card=>get.color(card)=='red')) return 0; - return lib.skill.dclongsong.getSkills(target).length+(att>0?0:Math.max(0,get.effect(target,{name:'shunshou_copy2'},player,player))); - }).forResult(); + if (event.player == game.me) func(player); + else if (event.isOnline()) player.send(func, player); + event.result = await player + .chooseTarget(get.prompt2("longsong"), (card, player, target) => { + if (target == player) return false; + return target.hasCard((card) => { + if (get.position(card) == "h") return true; + return ( + get.color(card) == "red" && lib.filter.canBeGained(card, player, target) + ); + }, "he"); + }) + .set("ai", (target) => { + const player = get.event("player"), + att = get.attitude(player, target); + if ( + att > 0 && + !target + .getGainableCards(player, "he") + .some((card) => get.color(card) == "red") + ) + return 0; + return ( + lib.skill.dclongsong.getSkills(target).length + + (att > 0 + ? 0 + : Math.max( + 0, + get.effect(target, { name: "shunshou_copy2" }, player, player) + )) + ); + }) + .forResult(); }, - async content(event,trigger,player){ - const target=event.targets[0],cards=target.getGainableCards(player,'he').filter(card=>get.color(card)=='red'); - if(cards.length){ - let dialog=['龙诵:获得'+get.translation(target)+'的一张红色牌']; - let cards1=cards.filter(i=>get.position(i)=='h'),cards2=cards.filter(i=>get.position(i)=='e'); - if(cards1.length){ + async content(event, trigger, player) { + const target = event.targets[0], + cards = target + .getGainableCards(player, "he") + .filter((card) => get.color(card) == "red"); + if (cards.length) { + let dialog = ["龙诵:获得" + get.translation(target) + "的一张红色牌"]; + let cards1 = cards.filter((i) => get.position(i) == "h"), + cards2 = cards.filter((i) => get.position(i) == "e"); + if (cards1.length) { dialog.push('
    手牌区
    '); - if(player.hasSkillTag('viewHandcard',null,target,true)) dialog.push(cards1); - else dialog.push([cards1.randomSort(),'blank']); + if (player.hasSkillTag("viewHandcard", null, target, true)) dialog.push(cards1); + else dialog.push([cards1.randomSort(), "blank"]); } - if(cards2.length){ + if (cards2.length) { dialog.push('
    装备区
    '); dialog.push(cards2); } - const {result:{bool,links}}=await player.chooseButton(dialog,true).set('ai',button=>{ - const player=get.event('player'),target=get.event().getParent().targets[0]; - return get.value(card,player)*get.value(card,target)*(1+Math.random()); + const { + result: { bool, links }, + } = await player.chooseButton(dialog, true).set("ai", (button) => { + const player = get.event("player"), + target = get.event().getParent().targets[0]; + return get.value(card, player) * get.value(card, target) * (1 + Math.random()); }); - if(bool){ - await player.gain(links,target,'giveAuto','bySelf'); - const skills=lib.skill.dclongsong.getSkills(target); - if(skills.length){ - if(!event.isMine()&&!event.isOnline()) await game.asyncDelayx(); - for(const skill of skills){ - player.popup(skill,'thunder'); - await player.addTempSkills(skill,['phaseUseAfter','phaseAfter']); + if (bool) { + await player.gain(links, target, "giveAuto", "bySelf"); + const skills = lib.skill.dclongsong.getSkills(target); + if (skills.length) { + if (!event.isMine() && !event.isOnline()) await game.asyncDelayx(); + for (const skill of skills) { + player.popup(skill, "thunder"); + await player.addTempSkills(skill, ["phaseUseAfter", "phaseAfter"]); } } } - } - else{ - player.popup('杯具'); - player.chat('无牌可得?!'); - game.log('但是',target,'没有红色牌可被'+get.translation(player)+'获得!'); + } else { + player.popup("杯具"); + player.chat("无牌可得?!"); + game.log("但是", target, "没有红色牌可被" + get.translation(player) + "获得!"); } }, }, //伏完 - dcmoukui:{ - audio:'moukui', - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.isFirstTarget; + dcmoukui: { + audio: "moukui", + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.isFirstTarget; }, - content:function(){ - 'step 0' - player.chooseButton([ - get.prompt('dcmoukui'), - [[ - ['draw','摸一张牌'], - ['discard','弃置'+(trigger.targets.length==1?get.translation(trigger.targets[0]):'一名目标角色')+'的一张牌'] - ],'textbutton'] - ]).set('filterButton',button=>{ - if(button.link=='discard'&&_status.event.getTrigger().targets.every(target=>{ - return target.countDiscardableCards(_status.event.player,'he')==0; - })) return false; - return true; - }).set('ai',function(button){ - if(button.link=='discard'&&_status.event.getTrigger().targets.every(target=>{ - return get.effect(target,{name:'guohe_copy2'},_status.event.player)<=0; - })) return 0; - return 1; - }).set('selectButton',[1,2]); - 'step 1' - if(result.bool){ - player.logSkill('dcmoukui'); - var choices=result.links; - event.choices=choices; - if(choices.includes('draw')){ - game.log(player,'选择了','#y选项一'); + content: function () { + "step 0"; + player + .chooseButton([ + get.prompt("dcmoukui"), + [ + [ + ["draw", "摸一张牌"], + [ + "discard", + "弃置" + + (trigger.targets.length == 1 + ? get.translation(trigger.targets[0]) + : "一名目标角色") + + "的一张牌", + ], + ], + "textbutton", + ], + ]) + .set("filterButton", (button) => { + if ( + button.link == "discard" && + _status.event.getTrigger().targets.every((target) => { + return target.countDiscardableCards(_status.event.player, "he") == 0; + }) + ) + return false; + return true; + }) + .set("ai", function (button) { + if ( + button.link == "discard" && + _status.event.getTrigger().targets.every((target) => { + return ( + get.effect(target, { name: "guohe_copy2" }, _status.event.player) <= 0 + ); + }) + ) + return 0; + return 1; + }) + .set("selectButton", [1, 2]); + ("step 1"); + if (result.bool) { + player.logSkill("dcmoukui"); + var choices = result.links; + event.choices = choices; + if (choices.includes("draw")) { + game.log(player, "选择了", "#y选项一"); player.draw(); } - if(choices.includes('discard')){ - game.log(player,'选择了','#y选项二'); - if(trigger.targets.length==1) event.directtarget=trigger.targets[0]; - else player.chooseTarget('谋溃:弃置一名目标角色的一张牌',true,(card,player,target)=>{ - return _status.event.getTrigger().targets.includes(target)&&target.countDiscardableCards(player,'he')>0; - }).set('ai',target=>{ - return get.effect(target,{name:'guohe_copy2'},_status.event.player); - }); - } - else event.finish(); - if(choices.length>=2){ - player.addTempSkill('dcmoukui_conseq'); - player.markAuto('dcmoukui_conseq',[trigger.card]); + if (choices.includes("discard")) { + game.log(player, "选择了", "#y选项二"); + if (trigger.targets.length == 1) event.directtarget = trigger.targets[0]; + else + player + .chooseTarget( + "谋溃:弃置一名目标角色的一张牌", + true, + (card, player, target) => { + return ( + _status.event.getTrigger().targets.includes(target) && + target.countDiscardableCards(player, "he") > 0 + ); + } + ) + .set("ai", (target) => { + return get.effect( + target, + { name: "guohe_copy2" }, + _status.event.player + ); + }); + } else event.finish(); + if (choices.length >= 2) { + player.addTempSkill("dcmoukui_conseq"); + player.markAuto("dcmoukui_conseq", [trigger.card]); } } - 'step 2' - player.discardPlayerCard(event.directtarget||result.targets[0],true,'he').boolline=true; + ("step 2"); + player.discardPlayerCard( + event.directtarget || result.targets[0], + true, + "he" + ).boolline = true; }, - subSkill:{ - conseq:{ - trigger:{ - global:['shaMiss','useCardToExcluded','eventNeutralized','shaCancelled'], + subSkill: { + conseq: { + trigger: { + global: ["shaMiss", "useCardToExcluded", "eventNeutralized", "shaCancelled"], }, - forced:true, - popup:false, - charlotte:true, - onremove:true, - filter:function(event,player,name){ - if(!event.card) return false; - var cards=player.getStorage('dcmoukui_conseq'); - if(!cards.includes(event.card)) return false; + forced: true, + popup: false, + charlotte: true, + onremove: true, + filter: function (event, player, name) { + if (!event.card) return false; + var cards = player.getStorage("dcmoukui_conseq"); + if (!cards.includes(event.card)) return false; return true; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; game.delayx(); - 'step 1' - trigger.target.discardPlayerCard(player,true,'he').boolline=true; - } - } + ("step 1"); + trigger.target.discardPlayerCard(player, true, "he").boolline = true; + }, + }, }, }, //孙桓 - dcniji:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return get.type(event.card)!='equip'; + dcniji: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return get.type(event.card) != "equip"; }, - frequent:true, - group:'dcniji_discard', - content:function(){ - var next=player.draw(); - var evt=trigger.getParent('dcniji_discard'); - if(!evt||evt.player!=player) next.gaintag=['dcniji']; - player.addTempSkill('dcniji_clear'); + frequent: true, + group: "dcniji_discard", + content: function () { + var next = player.draw(); + var evt = trigger.getParent("dcniji_discard"); + if (!evt || evt.player != player) next.gaintag = ["dcniji"]; + player.addTempSkill("dcniji_clear"); }, - subSkill:{ - clear:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('dcniji'); + subSkill: { + clear: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcniji"); }, }, - discard:{ - audio:'dcniji', - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasCard(card=>card.hasGaintag('dcniji')&&lib.filter.cardDiscardable(card,player,'dcniji'),'h'); + discard: { + audio: "dcniji", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasCard( + (card) => + card.hasGaintag("dcniji") && + lib.filter.cardDiscardable(card, player, "dcniji"), + "h" + ); }, - forced:true, - locked:false, - content:function(){ - 'step 0' - var cards=player.getCards('h',card=>card.hasGaintag('dcniji')&&lib.filter.cardDiscardable(card,player,'dcniji')); - event.cards=cards; + forced: true, + locked: false, + content: function () { + "step 0"; + var cards = player.getCards( + "h", + (card) => + card.hasGaintag("dcniji") && + lib.filter.cardDiscardable(card, player, "dcniji") + ); + event.cards = cards; // if(cards.length>=player.hp){ - if(cards.some(card=>player.hasUseTarget(card))){ + if (cards.some((card) => player.hasUseTarget(card))) { player.chooseToUse({ - prompt:'是否使用一张“逆击”牌?', - filterCard:function(card,player){ - if(get.itemtype(card)=='card'&&!card.hasGaintag('dcniji')) return false; - return lib.filter.filterCard.apply(this,arguments); + prompt: "是否使用一张“逆击”牌?", + filterCard: function (card, player) { + if (get.itemtype(card) == "card" && !card.hasGaintag("dcniji")) + return false; + return lib.filter.filterCard.apply(this, arguments); }, - ai1:function(card){ + ai1: function (card) { return get.player().getUseValue(card); }, }); } // } - 'step 1' - if(result.bool) game.delayex(); - var cards=cards.filter(card=>get.owner(card)==player&&get.position(card)=='h'&&lib.filter.cardDiscardable(card,player,'dcniji')); - if(cards.length) player.discard(cards); - } - } - } + ("step 1"); + if (result.bool) game.delayex(); + var cards = cards.filter( + (card) => + get.owner(card) == player && + get.position(card) == "h" && + lib.filter.cardDiscardable(card, player, "dcniji") + ); + if (cards.length) player.discard(cards); + }, + }, + }, }, //孙狼 - dctingxian:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - usable:1, - filter:function(event,player){ - return event.card.name=='sha'&&event.getParent().triggeredTargets3.length==event.targets.length; + dctingxian: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + usable: 1, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.getParent().triggeredTargets3.length == event.targets.length + ); }, - check:function(event,player){ - return event.targets.some(target=>get.effect(target,event.card,player,player)<=0); + check: function (event, player) { + return event.targets.some( + (target) => get.effect(target, event.card, player, player) <= 0 + ); }, - content:function(){ - 'step 0' - var num=player.countCards('e')+1; - event.num=num; + content: function () { + "step 0"; + var num = player.countCards("e") + 1; + event.num = num; player.draw(num); - 'step 1' - var num=Math.min(trigger.targets.length,num); - player.chooseTarget('铤险:令此杀对其中至多'+get.cnNumber(num)+'个目标无效',[1,num],true,(card,player,target)=>{ - return _status.event.getTrigger().targets.includes(target); - }).set('ai',target=>{ - return 1-get.effect(target,_status.event.getTrigger().card,_status.event.player,_status.event.player); - }); - 'step 2' - if(result.bool){ + ("step 1"); + var num = Math.min(trigger.targets.length, num); + player + .chooseTarget( + "铤险:令此杀对其中至多" + get.cnNumber(num) + "个目标无效", + [1, num], + true, + (card, player, target) => { + return _status.event.getTrigger().targets.includes(target); + } + ) + .set("ai", (target) => { + return ( + 1 - + get.effect( + target, + _status.event.getTrigger().card, + _status.event.player, + _status.event.player + ) + ); + }); + ("step 2"); + if (result.bool) { player.line(result.targets); trigger.getParent().excluded.addArray(result.targets); } }, - ai:{ - effect:{ - player:function(card,player,target){ - if(_status.event.name=='chooseToUse'&&get.name(card)=='sha'&&(!player.storage.counttrigger||!player.storage.counttrigger.dctingxian)&&!_status._dctingxian_aiChecking){ - _status._dctingxian_aiChecking=true; - var eff=get.effect(target,{name:'sha'},player,player); + ai: { + effect: { + player: function (card, player, target) { + if ( + _status.event.name == "chooseToUse" && + get.name(card) == "sha" && + (!player.storage.counttrigger || !player.storage.counttrigger.dctingxian) && + !_status._dctingxian_aiChecking + ) { + _status._dctingxian_aiChecking = true; + var eff = get.effect(target, { name: "sha" }, player, player); delete _status._dctingxian_aiChecking; - if(eff<0&&ui.selected.targets.filter(targetx=>{ - if(targetx==target) return false; - _status._dctingxian_aiChecking=true; - var eff=get.effect(targetx,{name:'sha'},player,player); - delete _status._dctingxian_aiChecking; - if(eff<0) return true; - }).length { + if (targetx == target) return false; + _status._dctingxian_aiChecking = true; + var eff = get.effect(targetx, { name: "sha" }, player, player); + delete _status._dctingxian_aiChecking; + if (eff < 0) return true; + }).length < + player.countCards("e") + 1 + ) + return [0, 0, 0, 0.5]; } }, - } - } - }, - dcbenshi:{ - audio:2, - forced:true, - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(event.card.name!='sha') return false; - var card=event.card; - var range; - var select=get.copy(get.info(card).selectTarget); - if(select==undefined){ - if(get.info(card).filterTarget==undefined) return false; - range=[1,1]; - } - else if(typeof select=='number') range=[select,select]; - else if(get.itemtype(select)=='select') range=select; - else if(typeof select=='function') range=select(card,player); - game.checkMod(card,player,range,'selectTarget',player); - return range[1]==-1; + }, }, - content:function(){}, - mod:{ - attackRangeBase:function(player,num){ - if(num!=='unchanged') return num; - var range=1; - var equips=player.getCards('e',function(card){ - return get.subtype(card)!='equip1'&&(!ui.selected.cards||!ui.selected.cards.includes(card)); + }, + dcbenshi: { + audio: 2, + forced: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name != "sha") return false; + var card = event.card; + var range; + var select = get.copy(get.info(card).selectTarget); + if (select == undefined) { + if (get.info(card).filterTarget == undefined) return false; + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + game.checkMod(card, player, range, "selectTarget", player); + return range[1] == -1; + }, + content: function () {}, + mod: { + attackRangeBase: function (player, num) { + if (num !== "unchanged") return num; + var range = 1; + var equips = player.getCards("e", function (card) { + return ( + get.subtype(card) != "equip1" && + (!ui.selected.cards || !ui.selected.cards.includes(card)) + ); }); - for(var i=0;i0; + dccuichuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: true, + filterCard: true, + derivation: "dczuojian", + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' - event.num=target.countCards('e'); - var subtypes=[]; - for(var i=1;i<7;i++){ - if(target.hasEmptySlot(i)) subtypes.push('equip'+i); + content: function () { + "step 0"; + event.num = target.countCards("e"); + var subtypes = []; + for (var i = 1; i < 7; i++) { + if (target.hasEmptySlot(i)) subtypes.push("equip" + i); } - if(subtypes.length){ + if (subtypes.length) { subtypes.randomSort(); - for(var subtype of subtypes){ - var card=get.cardPile2(card=>get.subtype(card)==subtype); - if(card&&target.canUse(card,target)){ - target.chooseUseTarget(card,true,'nopopup'); + for (var subtype of subtypes) { + var card = get.cardPile2((card) => get.subtype(card) == subtype); + if (card && target.canUse(card, target)) { + target.chooseUseTarget(card, true, "nopopup"); break; } } } - 'step 1' - var numx=target.countCards('e'); - if(numx>0) player.draw(numx); + ("step 1"); + var numx = target.countCards("e"); + if (numx > 0) player.draw(numx); game.delayx(); - 'step 2' - event.num2=target.countCards('e'); - if(event.num2==4&&num!=4){ - player.trySkillAnimate('dccuichuan_animate','dccuichuan_animate',player.checkShow('dccuichuan')); + ("step 2"); + event.num2 = target.countCards("e"); + if (event.num2 == 4 && num != 4) { + player.trySkillAnimate( + "dccuichuan_animate", + "dccuichuan_animate", + player.checkShow("dccuichuan") + ); //player.removeSkill('dccuichuan'); //game.log(player,'失去了技能','#g【榱椽】'); - player.changeSkills(['dczuojian'],['dccuichuan']); + player.changeSkills(["dczuojian"], ["dccuichuan"]); target.insertPhase(); game.delayx(); } }, - subSkill:{ - animate:{ - skillAnimation:true, - animationColor:'wood', - } + subSkill: { + animate: { + skillAnimation: true, + animationColor: "wood", + }, }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(target.countCards('e')==3) return 2; + ai: { + order: 7, + result: { + target: function (player, target) { + if (target.countCards("e") == 3) return 2; return 1; }, - player:function(player,target){ - if(target.countCards('e')==3) return 0.5; - return target.countCards('e')+1; - } - } - } + player: function (player, target) { + if (target.countCards("e") == 3) return 0.5; + return target.countCards("e") + 1; + }, + }, + }, }, - dczhengxu:{ - audio:2, - group:['dczhengxu_lose','dczhengxu_damage'], - subSkill:{ - lose:{ - audio:'dczhengxu', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dczhengxu: { + audio: 2, + group: ["dczhengxu_lose", "dczhengxu_damage"], + subSkill: { + lose: { + audio: "dczhengxu", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - prompt2:function(event,player){ - return '当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌('+get.cnNumber(event.getl(player).cards2.length)+'张)'; + prompt2: function (event, player) { + return ( + "当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌(" + + get.cnNumber(event.getl(player).cards2.length) + + "张)" + ); }, - check:()=>true, - filter:function(event,player){ - if(event.name=='gain'&&event.player==player) return false; - if(!player.getHistory('damage').length||player.hasHistory('useSkill',evt=>evt.skill=='dczhengxu_lose')) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + check: () => true, + filter: function (event, player) { + if (event.name == "gain" && event.player == player) return false; + if ( + !player.getHistory("damage").length || + player.hasHistory("useSkill", (evt) => evt.skill == "dczhengxu_lose") + ) + return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; }, - content:function(){ + content: function () { player.draw(trigger.getl(player).cards2.length); }, - ai:{ - effect:{ - target:(card,player,target)=>{ - if((get.tag(card,'lose')||get.tag(card,'discard'))&&target.getHistory('damage').length&&!target.hasHistory('useSkill',evt=>evt.skill=='dczhengxu_lose')) return [1,1]; - } - } - } - }, - damage:{ - audio:'dczhengxu', - trigger:{ - player:'damageBegin4', + ai: { + effect: { + target: (card, player, target) => { + if ( + (get.tag(card, "lose") || get.tag(card, "discard")) && + target.getHistory("damage").length && + !target.hasHistory("useSkill", (evt) => evt.skill == "dczhengxu_lose") + ) + return [1, 1]; + }, + }, }, - prompt2:'当你受到伤害时,若你本回合失去过牌,你可以防止之', - check:()=>true, - filter:function(event,player){ - if(!player.hasHistory('lose',evt=>evt.cards2&&evt.cards2.length)||player.hasHistory('useSkill',evt=>evt.skill=='dczhengxu_damage')) return false; + }, + damage: { + audio: "dczhengxu", + trigger: { + player: "damageBegin4", + }, + prompt2: "当你受到伤害时,若你本回合失去过牌,你可以防止之", + check: () => true, + filter: function (event, player) { + if ( + !player.hasHistory("lose", (evt) => evt.cards2 && evt.cards2.length) || + player.hasHistory("useSkill", (evt) => evt.skill == "dczhengxu_damage") + ) + return false; return true; }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:(card,player,target)=>{ - if(player.hasSkillTag('jueqing',false,target)||!get.tag(card,'damage')) return; - if(target.hasHistory('useSkill',evt=>evt.skill=='dczhengxu_damage')||!target.hasHistory('lose',evt=>evt.cards2&&evt.cards2.length)) return; - if(get.attitude(player,target)>=0) return 'zeroplayertarget'; - let num=0,shas=player.getCardUsable('sha'),hs=player.getCards('hs',i=>{ - if(i===card||card.cards&&card.cards.includes(i)||!get.tag(i,'damage')||!player.canUse(i,target)) return false; - if(get.name(i)==='sha'){ - num++; - return false; - } - return true; - }); - if(card.name==='sha') shas--; - num=Math.min(num,shas); - num+=hs.length; - if(!num) return 'zeroplayertarget'; - num=1-2/3/num; - return [num,0,num,0]; - } - } - } + ai: { + effect: { + target: (card, player, target) => { + if ( + player.hasSkillTag("jueqing", false, target) || + !get.tag(card, "damage") + ) + return; + if ( + target.hasHistory( + "useSkill", + (evt) => evt.skill == "dczhengxu_damage" + ) || + !target.hasHistory("lose", (evt) => evt.cards2 && evt.cards2.length) + ) + return; + if (get.attitude(player, target) >= 0) return "zeroplayertarget"; + let num = 0, + shas = player.getCardUsable("sha"), + hs = player.getCards("hs", (i) => { + if ( + i === card || + (card.cards && card.cards.includes(i)) || + !get.tag(i, "damage") || + !player.canUse(i, target) + ) + return false; + if (get.name(i) === "sha") { + num++; + return false; + } + return true; + }); + if (card.name === "sha") shas--; + num = Math.min(num, shas); + num += hs.length; + if (!num) return "zeroplayertarget"; + num = 1 - 2 / 3 / num; + return [num, 0, num, 0]; + }, + }, + }, }, - } - }, - dczuojian:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.getHistory('useCard',evt=>{ - var evtx=evt.getParent('phaseUse'); - if(evtx&&evtx==event) return true; - return false; - }).length>=player.hp; }, - direct:true, - content:function(){ - 'step 0' - var choices=[]; - var choiceList=['令装备区牌数多于你的角色各摸一张牌','令装备区牌数少于你的角色各弃置一张手牌']; - var num=player.countCards('e'); - var targets=[],targets2=[]; - var eff=0,eff2=0; - for(var target of game.filterPlayer()){ - if(target.countCards('e')>num) { + }, + dczuojian: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.getHistory("useCard", (evt) => { + var evtx = evt.getParent("phaseUse"); + if (evtx && evtx == event) return true; + return false; + }).length >= player.hp + ); + }, + direct: true, + content: function () { + "step 0"; + var choices = []; + var choiceList = [ + "令装备区牌数多于你的角色各摸一张牌", + "令装备区牌数少于你的角色各弃置一张手牌", + ]; + var num = player.countCards("e"); + var targets = [], + targets2 = []; + var eff = 0, + eff2 = 0; + for (var target of game.filterPlayer()) { + if (target.countCards("e") > num) { targets.push(target); - eff+=get.attitude(player,target); + eff += get.attitude(player, target); } - if(target.countCards('e')'; - if(targets2.length){ - choices.push('选项二'); - choiceList[1]+='('+get.translation(targets2)+')'; - } - else choiceList[1]=''+choiceList[1]+''; - if(!choices.length) event.finish(); - else player.chooseControl(choices,'cancel2').set('prompt',get.prompt('dczuojian')).set('choiceList',choiceList).set('ai',()=>{ - var controls=_status.event.controls,choice=_status.event.choice; - if(!controls.includes('选项一')||controls.includes('选项二')&&choice==1) return '选项二'; - return '选项一'; - }).set('choice',eff<=0&&eff2<=0?'cancel2':(eff>-eff2?0:1)); - 'step 1' - if(result.control=='选项一'){ - player.logSkill('dczuojian',targets); - game.asyncDraw(targets,1); - } - else if(result.control=='选项二'){ - player.logSkill('dczuojian',event.targets2); - for(var target of event.targets2){ - player.discardPlayerCard('h',target,true); + event.targets = targets; + event.targets2 = targets2; + if (targets.length) { + choices.push("选项一"); + choiceList[0] += "(" + get.translation(targets) + ")"; + } else choiceList[0] = '' + choiceList[0] + ""; + if (targets2.length) { + choices.push("选项二"); + choiceList[1] += "(" + get.translation(targets2) + ")"; + } else choiceList[1] = '' + choiceList[1] + ""; + if (!choices.length) event.finish(); + else + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("dczuojian")) + .set("choiceList", choiceList) + .set("ai", () => { + var controls = _status.event.controls, + choice = _status.event.choice; + if ( + !controls.includes("选项一") || + (controls.includes("选项二") && choice == 1) + ) + return "选项二"; + return "选项一"; + }) + .set("choice", eff <= 0 && eff2 <= 0 ? "cancel2" : eff > -eff2 ? 0 : 1); + ("step 1"); + if (result.control == "选项一") { + player.logSkill("dczuojian", targets); + game.asyncDraw(targets, 1); + } else if (result.control == "选项二") { + player.logSkill("dczuojian", event.targets2); + for (var target of event.targets2) { + player.discardPlayerCard("h", target, true); } } - } + }, }, //胡金定 - dcdeshi:{ - audio:2, - trigger:{player:'damageBegin4'}, - forced:true, - filter:function(event,player){ - return player.isDamaged()&&event.card&&event.card.name=='sha'; + dcdeshi: { + audio: 2, + trigger: { player: "damageBegin4" }, + forced: true, + filter: function (event, player) { + return player.isDamaged() && event.card && event.card.name == "sha"; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.cancel(); - for(var func of ['discardPile','cardPile2']){ - var card=get[func](card=>card.name=='sha'); - if(card){ - player.gain(card,'gain2'); + for (var func of ["discardPile", "cardPile2"]) { + var card = get[func]((card) => card.name == "sha"); + if (card) { + player.gain(card, "gain2"); break; } } - 'step 1' + ("step 1"); player.loseMaxHp(); }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.card&&arg.card.name=='sha') return true; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") return true; return false; }, }, }, - dcwuyuan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h','sha')>0; + dcwuyuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; }, - filterCard:{name:'sha'}, - filterTarget:lib.filter.notMe, - check:function(card){ - var player=_status.event.player; - if(get.color(card)=='red'&&game.hasPlayer(function(current){ - return current!=player&¤t.isDamaged()&&get.attitude(player,current)>2; - })) return 2; - if(get.natureList(card).length) return 1.5; + filterCard: { name: "sha" }, + filterTarget: lib.filter.notMe, + check: function (card) { + var player = _status.event.player; + if ( + get.color(card) == "red" && + game.hasPlayer(function (current) { + return ( + current != player && current.isDamaged() && get.attitude(player, current) > 2 + ); + }) + ) + return 2; + if (get.natureList(card).length) return 1.5; return 1; }, - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - player.give(cards,target,'give'); + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target, "give"); player.recover(); - 'step 1' - var num=1; - if(get.natureList(cards[0]).length) num++; - player.draw('nodelay'); + ("step 1"); + var num = 1; + if (get.natureList(cards[0]).length) num++; + player.draw("nodelay"); target.draw(num); - if(get.color(cards[0])=='red') target.recover(); + if (get.color(cards[0]) == "red") target.recover(); }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(player.isDamaged()) return 1; + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.isDamaged()) return 1; return 0; }, - target:function(player,target){ - if(ui.selected.cards.length){ - var num=1; - if(get.natureList(ui.selected.cards[0]).length) num++; - if(target.hasSkillTag('nogain')) num=0; - if(get.color(ui.selected.cards[0])=='red') return num+2 - else return num+1; + target: function (player, target) { + if (ui.selected.cards.length) { + var num = 1; + if (get.natureList(ui.selected.cards[0]).length) num++; + if (target.hasSkillTag("nogain")) num = 0; + if (get.color(ui.selected.cards[0]) == "red") return num + 2; + else return num + 1; } return 1; }, @@ -2375,1897 +3127,2339 @@ game.import('character', function () { }, }, //李异谢旌 - dcdouzhen:{ - audio:2, - trigger:{ - player:['useCard','respond'], + dcdouzhen: { + audio: 2, + trigger: { + player: ["useCard", "respond"], }, - forced:true, - zhuanhuanji:'number', - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - var str='
  • 已转换过'+get.cnNumber(storage||0)+'次。
  • 你的回合内,'; - str+=player.countMark('dcdouzhen')%2?'你的红色基本牌均视为普【杀】且无次数限制。':'你的黑色基本牌均视为【决斗】且使用时获得目标的一张牌。'; + forced: true, + zhuanhuanji: "number", + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + var str = "
  • 已转换过" + get.cnNumber(storage || 0) + "次。
  • 你的回合内,"; + str += + player.countMark("dcdouzhen") % 2 + ? "你的红色基本牌均视为普【杀】且无次数限制。" + : "你的黑色基本牌均视为【决斗】且使用时获得目标的一张牌。"; return str; }, }, - filter:function(event,player){ - if(player !=_status.currentPhase||!event.card.isCard||!event.cards||event.cards.length!=1||get.type(event.cards[0])!='basic') return false; - if(player.countMark('dcdouzhen')%2) return get.color(event.cards[0])=='red'&&event.card.name=='sha'; - return event.name!='respond'&&get.color(event.cards[0])=='black'&&event.card.name=='juedou'; + filter: function (event, player) { + if ( + player != _status.currentPhase || + !event.card.isCard || + !event.cards || + event.cards.length != 1 || + get.type(event.cards[0]) != "basic" + ) + return false; + if (player.countMark("dcdouzhen") % 2) + return get.color(event.cards[0]) == "red" && event.card.name == "sha"; + return ( + event.name != "respond" && + get.color(event.cards[0]) == "black" && + event.card.name == "juedou" + ); }, - content:function(){ - if(player.countMark('dcdouzhen')%2){ + content: function () { + if (player.countMark("dcdouzhen") % 2) { // if(trigger.addCount!==false){ // trigger.addCount=false; // if(player.stat[player.stat.length-1].card.sha>0){ // player.stat[player.stat.length-1].card.sha--; // } // } - }else{ - if(trigger.targets.length&&trigger.targets.filter(i=>i.countGainableCards(player,'he')>0).length) player.gainMultiple(trigger.targets.sortBySeat(),'he'); + } else { + if ( + trigger.targets.length && + trigger.targets.filter((i) => i.countGainableCards(player, "he") > 0).length + ) + player.gainMultiple(trigger.targets.sortBySeat(), "he"); } - player.changeZhuanhuanji('dcdouzhen'); + player.changeZhuanhuanji("dcdouzhen"); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(card.name!='juedou') return; - if(player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card, - },true)){ - return [1,1]; + ai: { + effect: { + player: function (card, player, target) { + if (card.name != "juedou") return; + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) { + return [1, 1]; } - var hs1=target.getCards('h','sha'); - var hs2=player.getCards('h',card=>(get.color(card)=='red'&&get.type(card)=='basic')||get.name(card)=='sha'); - var hsx=target.getCards('h'); - if(hs1.length>hs2.length+1||hsx.length>2&&hs2.length==0&&hsx[0].number<6||hsx.length>3&&hs2.length==0||hs1.length>hs2.length&&(!hs2.length||hs1[0].number>hs2[0].number)){ - return [1,-2]; + var hs1 = target.getCards("h", "sha"); + var hs2 = player.getCards( + "h", + (card) => + (get.color(card) == "red" && get.type(card) == "basic") || + get.name(card) == "sha" + ); + var hsx = target.getCards("h"); + if ( + hs1.length > hs2.length + 1 || + (hsx.length > 2 && hs2.length == 0 && hsx[0].number < 6) || + (hsx.length > 3 && hs2.length == 0) || + (hs1.length > hs2.length && (!hs2.length || hs1[0].number > hs2[0].number)) + ) { + return [1, -2]; } - return [1,-0.5]; - } - } + return [1, -0.5]; + }, + }, }, - mod:{ - cardname:function(card,player){ - if(get.type(card,null,false)!='basic'||player!=_status.currentPhase) return; - if(player.countMark('dcdouzhen')%2){ - if(get.color(card)=='red') return 'sha'; - }else{ - if(get.color(card)=='black') return 'juedou'; + mod: { + cardname: function (card, player) { + if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; + if (player.countMark("dcdouzhen") % 2) { + if (get.color(card) == "red") return "sha"; + } else { + if (get.color(card) == "black") return "juedou"; } }, - cardnature:function(card,player){ - if(get.type(card,null,false)!='basic'||player!=_status.currentPhase) return; - if(player.countMark('dcdouzhen')%2){ - if(get.color(card)=='red') return false; + cardnature: function (card, player) { + if (get.type(card, null, false) != "basic" || player != _status.currentPhase) return; + if (player.countMark("dcdouzhen") % 2) { + if (get.color(card) == "red") return false; } }, - cardUsable:function(card,player){ - if(_status.currentPhase==player&&card.name=='sha'&&player.countMark('dcdouzhen')%2&&get.color(card)=='red'&&card.isCard) return Infinity; - } - } + cardUsable: function (card, player) { + if ( + _status.currentPhase == player && + card.name == "sha" && + player.countMark("dcdouzhen") % 2 && + get.color(card) == "red" && + card.isCard + ) + return Infinity; + }, + }, }, //穆顺 - dcjinjian:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + dcjinjian: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - forced:true, - locked:false, - filter:function(event,player,name){ - return name=='damageSource'||(event.source&&event.source!=player&&event.source.isIn()); + forced: true, + locked: false, + filter: function (event, player, name) { + return ( + name == "damageSource" || + (event.source && event.source != player && event.source.isIn()) + ); }, - content:function(){ - 'step 0' - player.addMark('dcjinjian',1); + content: function () { + "step 0"; + player.addMark("dcjinjian", 1); game.delayx(); - 'step 1' - var source=trigger.source; - if(source&&source!=player&&source.isIn()&&player.canCompare(source)){ - player.chooseBool('是否和'+get.translation(source)+'拼点?','若你赢,则你恢复1点体力').set('goon',(player.countCards('h')==1||player.hasCard(function(card){ - return get.value(card)<=5||get.number(card)>10; - }))&&(get.attitude(player,source)<=0||source.countCards('h')>=4)).set('ai',function(){ - return _status.event.goon; - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.line(trigger.source,'green'); + ("step 1"); + var source = trigger.source; + if (source && source != player && source.isIn() && player.canCompare(source)) { + player + .chooseBool( + "是否和" + get.translation(source) + "拼点?", + "若你赢,则你恢复1点体力" + ) + .set( + "goon", + (player.countCards("h") == 1 || + player.hasCard(function (card) { + return get.value(card) <= 5 || get.number(card) > 10; + })) && + (get.attitude(player, source) <= 0 || source.countCards("h") >= 4) + ) + .set("ai", function () { + return _status.event.goon; + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.line(trigger.source, "green"); player.chooseToCompare(trigger.source); - } - else event.finish(); - 'step 3' - if(result.bool) player.recover(); + } else event.finish(); + ("step 3"); + if (result.bool) player.recover(); }, - intro:{ - name2:'劲', - content:'mark', + intro: { + name2: "劲", + content: "mark", }, - mod:{ - attackRange:function(player,num){ - return num+player.countMark('dcjinjian'); + mod: { + attackRange: function (player, num) { + return num + player.countMark("dcjinjian"); }, }, }, - dcshizhao:{ - audio:2, - usable:1, - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dcshizhao: { + audio: 2, + usable: 1, + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter:function(event,player){ - return player!=_status.currentPhase&&player.countCards('h')==0&&event.getl(player).hs.length>0; + forced: true, + filter: function (event, player) { + return ( + player != _status.currentPhase && + player.countCards("h") == 0 && + event.getl(player).hs.length > 0 + ); }, - content:function(){ - if(player.hasMark('dcjinjian')){ - player.removeMark('dcjinjian',1); + content: function () { + if (player.hasMark("dcjinjian")) { + player.removeMark("dcjinjian", 1); player.draw(2); - } - else{ - player.addTempSkill('dcshizhao_effect'); - player.addMark('dcshizhao_effect',1,false); + } else { + player.addTempSkill("dcshizhao_effect"); + player.addMark("dcshizhao_effect", 1, false); game.delayx(); } }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - trigger:{player:'damageBegin1'}, - forced:true, - content:function(){ - trigger.num+=player.countMark(event.name); + subSkill: { + effect: { + charlotte: true, + onremove: true, + trigger: { player: "damageBegin1" }, + forced: true, + content: function () { + trigger.num += player.countMark(event.name); player.removeSkill(event.name); }, }, }, - ai:{ - combo:'dcjinjian' - } + ai: { + combo: "dcjinjian", + }, }, //赵俨 - dcfuning:{ - audio:2, - trigger:{player:'useCard'}, - prompt2:function(event,player){ - return '摸两张牌,然后弃置'+get.cnNumber(1+player.getHistory('useSkill',function(evt){ - return evt.skill=='dcfuning'; - }).length)+'张牌'; + dcfuning: { + audio: 2, + trigger: { player: "useCard" }, + prompt2: function (event, player) { + return ( + "摸两张牌,然后弃置" + + get.cnNumber( + 1 + + player.getHistory("useSkill", function (evt) { + return evt.skill == "dcfuning"; + }).length + ) + + "张牌" + ); }, - check:function(event,player){ - return player.getHistory('useSkill',function(evt){ - return evt.skill=='dcfuning'; - }).length<2; + check: function (event, player) { + return ( + player.getHistory("useSkill", function (evt) { + return evt.skill == "dcfuning"; + }).length < 2 + ); }, - content:function(){ + content: function () { player.draw(2); - player.chooseToDiscard('he',true,+player.getHistory('useSkill',function(evt){ - return evt.skill=='dcfuning'; - }).length); + player.chooseToDiscard( + "he", + true, + +player.getHistory("useSkill", function (evt) { + return evt.skill == "dcfuning"; + }).length + ); }, }, - dcbingji:{ - audio:2, - enable:'phaseUse', - usable:4, - filter:function(event,player){ - var hs=player.getCards('h'),suits=player.getStorage('dcbingji_mark'); - if(!hs.length) return false; - var suit=get.suit(hs[0],player); - if(suit=='none'||suits.includes(suit)) return false; - for(var i=1;ifalse, - selectCard:-1, - filterTarget:function(card,player,target){ - if(!card) card=get.card(); - if(player==target) return false; - return lib.filter.targetEnabled2(card,player,target)&&lib.filter.targetInRange(card,player,target); + filterCard: () => false, + selectCard: -1, + filterTarget: function (card, player, target) { + if (!card) card = get.card(); + if (player == target) return false; + return ( + lib.filter.targetEnabled2(card, player, target) && + lib.filter.targetInRange(card, player, target) + ); }, - selectTarget:1, - ignoreMod:true, - filterOk:()=>true, - precontent:function(){ - player.logSkill('dcbingji'); + selectTarget: 1, + ignoreMod: true, + filterOk: () => true, + precontent: function () { + player.logSkill("dcbingji"); delete event.result.skill; - var hs=player.getCards('h'); - player.showCards(hs,get.translation(player)+'发动了【秉纪】'); - player.markAuto('dcbingji_mark',[get.suit(hs[0],player)]); - player.addTempSkill('dcbingji_mark'); + var hs = player.getCards("h"); + player.showCards(hs, get.translation(player) + "发动了【秉纪】"); + player.markAuto("dcbingji_mark", [get.suit(hs[0], player)]); + player.addTempSkill("dcbingji_mark"); }, - } + }; }, - prompt:function(links,player){ - return '请选择【'+get.translation(links[0][2])+'】的目标'; + prompt: function (links, player) { + return "请选择【" + get.translation(links[0][2]) + "】的目标"; }, }, - subSkill:{ - mark:{ - charlotte:true, - onremove:true, - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - return event.addCount!==false&&event.card.name=='sha'&&event.card.storage&&event.card.storage.dcbingji; + subSkill: { + mark: { + charlotte: true, + onremove: true, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return ( + event.addCount !== false && + event.card.name == "sha" && + event.card.storage && + event.card.storage.dcbingji + ); }, - content:function(){ - trigger.addCount=false; - player.getStat('card').sha--; + content: function () { + trigger.addCount = false; + player.getStat("card").sha--; }, }, }, }, //王威 - dcruizhan:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player!=event.player&&event.player.countCards('h')>=Math.max(1,event.player.hp)&&player.canCompare(event.player); + dcruizhan: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return ( + player != event.player && + event.player.countCards("h") >= Math.max(1, event.player.hp) && + player.canCompare(event.player) + ); }, - logTarget:'player', - check:function(event,player){ - var goon=player.hasCard(function(card){ - return card.name=='sha'||get.value(card)<=5; + logTarget: "player", + check: function (event, player) { + var goon = player.hasCard(function (card) { + return card.name == "sha" || get.value(card) <= 5; }); - var target=event.player; - if(goon&&get.attitude(player,target)<0){ - return get.effect(target,{name:'sha'},player,player)>0; + var target = event.player; + if (goon && get.attitude(player, target) < 0) { + return get.effect(target, { name: "sha" }, player, player) > 0; } return 0; }, - content:function(){ - 'step 0' - event.target=trigger.player; - player.chooseToCompare(event.target).set('ai',function(card){ - if(typeof card=='string'&&lib.skill[card]){ - var ais=lib.skill[card].check||function(){return 0}; + content: function () { + "step 0"; + event.target = trigger.player; + player.chooseToCompare(event.target).set("ai", function (card) { + if (typeof card == "string" && lib.skill[card]) { + var ais = + lib.skill[card].check || + function () { + return 0; + }; return ais(); } - var player=get.owner(card); - var getn=function(card){ - if(player.hasSkill('tianbian')&&get.suit(card)=='heart') return 13; + var player = get.owner(card); + var getn = function (card) { + if (player.hasSkill("tianbian") && get.suit(card) == "heart") return 13; return get.number(card); - } - var event=_status.event.getParent(); - var to=(player==event.player?event.target:event.player); - var addi=(get.value(card)>=8&&get.type(card)!='equip')?-6:0; - if(card.name=='du') addi-=5; - if(player==event.player){ - if(get.name(card,player)=='sha'){ - return 10+getn(card); + }; + var event = _status.event.getParent(); + var to = player == event.player ? event.target : event.player; + var addi = get.value(card) >= 8 && get.type(card) != "equip" ? -6 : 0; + if (card.name == "du") addi -= 5; + if (player == event.player) { + if (get.name(card, player) == "sha") { + return 10 + getn(card); } - return getn(card)-get.value(card)/2+addi; - } - else{ - if(get.name(card,player)=='sha'){ - return -10-getn(card)-get.value(card)/2+addi; + return getn(card) - get.value(card) / 2 + addi; + } else { + if (get.name(card, player) == "sha") { + return -10 - getn(card) - get.value(card) / 2 + addi; } - return getn(card)-get.value(card)/2+addi; + return getn(card) - get.value(card) / 2 + addi; } }); - 'step 1' - var bool1=result.bool; - var bool2=(get.name(result.player,player)=='sha'||get.name(result.target,target)=='sha'); - if(bool1||bool2){ - if(player.canUse('sha',target,false)){ - player.useCard({name:'sha',isCard:true},target,false); - if(!bool1||!bool2) event.finish(); - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(target.hasCard(function(card){ - return lib.filter.canBeGained(card,target,player) - },'he')&&player.hasHistory('sourceDamage',function(evt){ - var evtx=evt.getParent('useCard'); - return evtx&&evtx.card==evt.card&&evtx.getParent()==event; - })) player.gainPlayerCard(target,true,'he'); + ("step 1"); + var bool1 = result.bool; + var bool2 = + get.name(result.player, player) == "sha" || get.name(result.target, target) == "sha"; + if (bool1 || bool2) { + if (player.canUse("sha", target, false)) { + player.useCard({ name: "sha", isCard: true }, target, false); + if (!bool1 || !bool2) event.finish(); + } else event.finish(); + } else event.finish(); + ("step 2"); + if ( + target.hasCard(function (card) { + return lib.filter.canBeGained(card, target, player); + }, "he") && + player.hasHistory("sourceDamage", function (evt) { + var evtx = evt.getParent("useCard"); + return evtx && evtx.card == evt.card && evtx.getParent() == event; + }) + ) + player.gainPlayerCard(target, true, "he"); }, }, - dcshilie:{ - audio:2, - enable:'phaseUse', - usable:1, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('示烈:请选择一项',[[ - ['recover','回复1点体力,将两张牌置于武将牌上作为“示烈”'], - ['losehp','失去1点体力,获得两张“示烈”牌'], - ],'textbutton'],'hidden'); + dcshilie: { + audio: 2, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog( + "示烈:请选择一项", + [ + [ + ["recover", "回复1点体力,将两张牌置于武将牌上作为“示烈”"], + ["losehp", "失去1点体力,获得两张“示烈”牌"], + ], + "textbutton", + ], + "hidden" + ); }, - check:function(button){ - return button.link=='recover'?1:0; + check: function (button) { + return button.link == "recover" ? 1 : 0; }, - backup:function(links,player){ - return get.copy(lib.skill['dcshilie_'+links[0]]); + backup: function (links, player) { + return get.copy(lib.skill["dcshilie_" + links[0]]); }, - prompt:()=>'点击“确定”以执行选项', + prompt: () => "点击“确定”以执行选项", }, - intro:{ - markcount:'expansion', - content:'expansion', + intro: { + markcount: "expansion", + content: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'dcshilie_die', - ai:{ - order:0.5, - result:{ - player:function(player){ - if(player.isDamaged()&&!player.countCards('h','tao')) return 1; + group: "dcshilie_die", + ai: { + order: 0.5, + result: { + player: function (player) { + if (player.isDamaged() && !player.countCards("h", "tao")) return 1; return 0; }, }, }, - subSkill:{ - backup:{}, - recover:{ - audio:'dcshilie', - selectCard:-1, - selectTarget:-1, - filterCard:()=>false, - filterTarget:()=>false, - multitarget:true, - content:function(){ - 'step 0' + subSkill: { + backup: {}, + recover: { + audio: "dcshilie", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + multitarget: true, + content: function () { + "step 0"; player.recover(); - 'step 1' - var hs=player.getCards('he'); - if(!hs.length) event.finish(); - else if(hs.length<=2) event._result={bool:true,cards:hs}; - else player.chooseCard('he',2,true,'选择两张牌作为“示烈”牌'); - 'step 2' - if(result.bool){ - player.addToExpansion(result.cards,player,'give').gaintag.add('dcshilie'); - } - else event.finish(); - 'step 3' - var cards=player.getExpansions('dcshilie'); - if(cards.length>game.countPlayer()){ + ("step 1"); + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", 2, true, "选择两张牌作为“示烈”牌"); + ("step 2"); + if (result.bool) { + player.addToExpansion(result.cards, player, "give").gaintag.add("dcshilie"); + } else event.finish(); + ("step 3"); + var cards = player.getExpansions("dcshilie"); + if (cards.length > game.countPlayer()) { player.loseToDiscardpile(cards.slice(game.countPlayer())); } }, }, - losehp:{ - audio:'dcshilie', - selectCard:-1, - selectTarget:-1, - filterCard:()=>false, - filterTarget:()=>false, - multitarget:true, - content:function(){ - 'step 0' + losehp: { + audio: "dcshilie", + selectCard: -1, + selectTarget: -1, + filterCard: () => false, + filterTarget: () => false, + multitarget: true, + content: function () { + "step 0"; player.loseHp(); - 'step 1' - var hs=player.getExpansions('dcshilie'); - if(!hs.length) event.finish(); - else if(hs.length<=2) event._result={bool:true,links:hs}; - else player.chooseButton(['选择获得两张“示烈”牌',hs],2,true); - 'step 2' - if(result.bool){ - player.gain(result.links,'gain2'); + ("step 1"); + var hs = player.getExpansions("dcshilie"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, links: hs }; + else player.chooseButton(["选择获得两张“示烈”牌", hs], 2, true); + ("step 2"); + if (result.bool) { + player.gain(result.links, "gain2"); } }, }, - die:{ - audio:'dcshilie', - forceDie:true, - trigger:{player:'die'}, - filter:function(event,player){ - return player.getExpansions('dcshilie').length>0; + die: { + audio: "dcshilie", + forceDie: true, + trigger: { player: "die" }, + filter: function (event, player) { + return player.getExpansions("dcshilie").length > 0; }, - direct:true, - skillAnimation:true, - animationColor:'metal', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('dcshilie'),'令一名角色获得你的“示烈”牌',function(card,player,target){ - return target!=player&&target!=_status.event.getTrigger().source; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcshilie_die',target); - player.give(player.getExpansions('dcshilie'),target,'give'); + direct: true, + skillAnimation: true, + animationColor: "metal", + content: function () { + "step 0"; + player.chooseTarget( + get.prompt("dcshilie"), + "令一名角色获得你的“示烈”牌", + function (card, player, target) { + return target != player && target != _status.event.getTrigger().source; + } + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcshilie_die", target); + player.give(player.getExpansions("dcshilie"), target, "give"); } }, }, }, }, //胡班 - dcchongyi:{ - audio:2, - init:()=>{ - game.addGlobalSkill('dcchongyi_ai'); + dcchongyi: { + audio: 2, + init: () => { + game.addGlobalSkill("dcchongyi_ai"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('dcchongyi'),true)) game.removeGlobalSkill('dcchongyi_ai'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("dcchongyi"), true)) + game.removeGlobalSkill("dcchongyi_ai"); }, - trigger:{global:'useCard'}, - logTarget:'player', - filter:function(event,player){ - if(event.card.name!='sha'||!event.player.isIn()) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=event.player) return false; - var goon=false; - var history=event.player.getHistory('useCard',function(evtx){ - if(goon||evtx.getParent('phaseUse')!=evt) return false; - goon=true; + trigger: { global: "useCard" }, + logTarget: "player", + filter: function (event, player) { + if (event.card.name != "sha" || !event.player.isIn()) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + var goon = false; + var history = event.player.getHistory("useCard", function (evtx) { + if (goon || evtx.getParent("phaseUse") != evt) return false; + goon = true; return true; }); - return history[0]==event; + return history[0] == event; }, - prompt2:(event)=>'令其摸两张牌,且使用【杀】的次数上限+1', - check:function(event,player){ - return get.attitude(player,event.player)>0; + prompt2: (event) => "令其摸两张牌,且使用【杀】的次数上限+1", + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ - var target=trigger.player; + content: function () { + var target = trigger.player; target.draw(2); - target.addMark('dcchongyi_sha',1,false); - target.addTempSkill('dcchongyi_sha'); + target.addMark("dcchongyi_sha", 1, false); + target.addTempSkill("dcchongyi_sha"); }, - group:'dcchongyi_end', - subSkill:{ - ai:{ - mod:{ - aiOrder:function(player,card,num){ - if(card.name!='sha') return; - var evt=_status.event.getParent('phaseUse'); - if(!evt||evt.player!=player) return; - if(player.hasHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt; - })) return; - if(game.hasPlayer(function(current){ - return current.hasSkill('dcchongyi')&&get.attitude(player,current)>=0; - })) return num+10; + group: "dcchongyi_end", + subSkill: { + ai: { + mod: { + aiOrder: function (player, card, num) { + if (card.name != "sha") return; + var evt = _status.event.getParent("phaseUse"); + if (!evt || evt.player != player) return; + if ( + player.hasHistory("useCard", function (evtx) { + return evtx.getParent("phaseUse") == evt; + }) + ) + return; + if ( + game.hasPlayer(function (current) { + return ( + current.hasSkill("dcchongyi") && + get.attitude(player, current) >= 0 + ); + }) + ) + return num + 10; }, }, - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('dcchongyi'),true); + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("dcchongyi"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("dcchongyi_ai"); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('dcchongyi_ai'); - } }, - end:{ - audio:'dcchongyi', - trigger:{global:'phaseUseEnd'}, - logTarget:'player', - filter:function(event,player){ - if(!event.player.isIn()) return false; - var history=event.player.getHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==event; + end: { + audio: "dcchongyi", + trigger: { global: "phaseUseEnd" }, + logTarget: "player", + filter: function (event, player) { + if (!event.player.isIn()) return false; + var history = event.player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; }); - return history.length&&history[history.length-1].card.name=='sha'; + return history.length && history[history.length - 1].card.name == "sha"; }, - prompt2(event,player){ + prompt2(event, player) { const target = event.player; - const history = target.getHistory('useCard', evt => { - return evt.getParent('phaseUse') === event; + const history = target.getHistory("useCard", (evt) => { + return evt.getParent("phaseUse") === event; }); - const evt = history.lastItem, cards = evt.cards.filterInD('d'); - let str = '令' + get.translation(target) + '本回合的手牌上限+1'; + const evt = history.lastItem, + cards = evt.cards.filterInD("d"); + let str = "令" + get.translation(target) + "本回合的手牌上限+1"; if (cards.length) str += `,然后你获得${get.translation(cards)}`; - str += '。'; + str += "。"; return str; }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = trigger.player; - target.addMark('dcchongyi_keep',1,false); - target.addTempSkill('dcchongyi_keep'); - const history = target.getHistory('useCard', evt => { - return evt.getParent('phaseUse') === trigger; + target.addMark("dcchongyi_keep", 1, false); + target.addTempSkill("dcchongyi_keep"); + const history = target.getHistory("useCard", (evt) => { + return evt.getParent("phaseUse") === trigger; }); - const evt = history.lastItem, cards = evt.cards.filterInD('d'); - if (cards.length) await player.gain(cards, 'gain2'); + const evt = history.lastItem, + cards = evt.cards.filterInD("d"); + if (cards.length) await player.gain(cards, "gain2"); else await game.asyncDelayx(); }, }, - sha:{ - charlotte:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('dcchongyi_sha'); + sha: { + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("dcchongyi_sha"); }, }, - onremove:true, - intro:{content:'使用【杀】的次数上限+#'}, + onremove: true, + intro: { content: "使用【杀】的次数上限+#" }, }, - keep:{ - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('dcchongyi_keep'); + keep: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dcchongyi_keep"); }, }, - onremove:true, - intro:{content:'手牌上限+#'}, + onremove: true, + intro: { content: "手牌上限+#" }, }, }, }, //牛辅 - dcxiaoxi:{ - auto:2, - trigger:{player:'phaseUseBegin'}, - forced:true, - filter:function(event,player){ - return player.maxHp>1; + dcxiaoxi: { + auto: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + return player.maxHp > 1; }, - content:function(){ - 'step 0' - if(player.maxHp<=2) event._result={index:0}; - else player.chooseControl('1点','2点').set('prompt','宵袭:减少1或2点体力上限').set('ai',function(){ - var player=_status.event.player; - if(!game.hasPlayer(function(current){ - if(!player.inRange(current)||get.attitude(player,current)>=0) return false; - if(get.effect(current,{name:'shunshou_copy2'},player,player)>0&¤t.countCards('h')+current.countCards('e',function(card){ - return get.value(card,current)>0; - })>1) return true; - if(get.effect(current,{name:'sha'},player,player)>0&¤t.countCards('hs','shan')+current.hp>1) return true; - })) return 0; - return 1; - }); - 'step 1' - player.loseMaxHp(1+result.index); - event.num=1+result.index; - 'step 2' - if(!game.hasPlayer((current)=>player.inRange(current))) event.finish(); - else player.chooseTarget('请选择【宵袭】的目标','然后你选择一项:⒈获得该角色的'+get.cnNumber(num)+'张牌。⒉视为对其使用'+get.cnNumber(num)+'张【杀】。',function(card,player,target){ - return player.inRange(target); - },true).set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>=0) return 0; - var eff1=get.effect(target,{name:'shunshou_copy2'},player,player); - if(eff1>0&&target.countCards('h')+target.countCards('e',function(card){ - return get.value(card,target)>0; - })>1) eff1*=1.6; - var eff2=player.canUse('sha',target)?get.effect(target,{name:'sha'},player,player):0; - if(eff2>0&&target.countCards('hs','shan')+target.hp>1) eff2*=2; - return Math.max(eff1,eff2); - }); - 'step 3' - var target=result.targets[0]; - player.line(target,'green'); - event.target=target; - var bool1=target.countGainableCards(player,'he')>0; - var bool2=player.canUse('sha',target); - if(!bool1&&!bool2) event.finish(); - else if(bool1&&bool2){ - var str=get.translation(target),numx=get.cnNumber(num); - player.chooseControl().set('choiceList',[ - '获得'+str+'的'+numx+'张牌', - '视为对'+str+'使用'+numx+'张【杀】', - ]).set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target; - var eff1=get.effect(target,{name:'shunshou_copy2'},player,player); - if(eff1>0&&target.countCards('h')+target.countCards('e',function(card){ - return get.value(card,target)>0; - })>1) eff1*=1.6; - var eff2=player.canUse('sha',target)?get.effect(target,{name:'sha'},player,player):0; - if(eff2>0&&target.countCards('hs','shan')+target.hp>1) eff2*=2; - return eff1>eff2?0:1; - }); - } - else event._result={index:bool1?0:1}; - 'step 4' - if(result.index==0){ - player.gainPlayerCard(target,true,num,'he'); + content: function () { + "step 0"; + if (player.maxHp <= 2) event._result = { index: 0 }; + else + player + .chooseControl("1点", "2点") + .set("prompt", "宵袭:减少1或2点体力上限") + .set("ai", function () { + var player = _status.event.player; + if ( + !game.hasPlayer(function (current) { + if (!player.inRange(current) || get.attitude(player, current) >= 0) + return false; + if ( + get.effect(current, { name: "shunshou_copy2" }, player, player) > + 0 && + current.countCards("h") + + current.countCards("e", function (card) { + return get.value(card, current) > 0; + }) > + 1 + ) + return true; + if ( + get.effect(current, { name: "sha" }, player, player) > 0 && + current.countCards("hs", "shan") + current.hp > 1 + ) + return true; + }) + ) + return 0; + return 1; + }); + ("step 1"); + player.loseMaxHp(1 + result.index); + event.num = 1 + result.index; + ("step 2"); + if (!game.hasPlayer((current) => player.inRange(current))) event.finish(); + else + player + .chooseTarget( + "请选择【宵袭】的目标", + "然后你选择一项:⒈获得该角色的" + + get.cnNumber(num) + + "张牌。⒉视为对其使用" + + get.cnNumber(num) + + "张【杀】。", + function (card, player, target) { + return player.inRange(target); + }, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) >= 0) return 0; + var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); + if ( + eff1 > 0 && + target.countCards("h") + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) > + 1 + ) + eff1 *= 1.6; + var eff2 = player.canUse("sha", target) + ? get.effect(target, { name: "sha" }, player, player) + : 0; + if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; + return Math.max(eff1, eff2); + }); + ("step 3"); + var target = result.targets[0]; + player.line(target, "green"); + event.target = target; + var bool1 = target.countGainableCards(player, "he") > 0; + var bool2 = player.canUse("sha", target); + if (!bool1 && !bool2) event.finish(); + else if (bool1 && bool2) { + var str = get.translation(target), + numx = get.cnNumber(num); + player + .chooseControl() + .set("choiceList", [ + "获得" + str + "的" + numx + "张牌", + "视为对" + str + "使用" + numx + "张【杀】", + ]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + var eff1 = get.effect(target, { name: "shunshou_copy2" }, player, player); + if ( + eff1 > 0 && + target.countCards("h") + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) > + 1 + ) + eff1 *= 1.6; + var eff2 = player.canUse("sha", target) + ? get.effect(target, { name: "sha" }, player, player) + : 0; + if (eff2 > 0 && target.countCards("hs", "shan") + target.hp > 1) eff2 *= 2; + return eff1 > eff2 ? 0 : 1; + }); + } else event._result = { index: bool1 ? 0 : 1 }; + ("step 4"); + if (result.index == 0) { + player.gainPlayerCard(target, true, num, "he"); event.finish(); } - 'step 5' + ("step 5"); event.num--; - if(player.canUse('sha',target,false)){ - player.useCard({name:'sha',isCard:true},target,false); - if(event.num>0) event.redo(); + if (player.canUse("sha", target, false)) { + player.useCard({ name: "sha", isCard: true }, target, false); + if (event.num > 0) event.redo(); } }, }, - xiongrao:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - limited:true, - skillAnimation:true, - animationColor:'soil', - prompt:function(event,player){ - var str='是否发动【熊扰】?'; - str+=('(可摸'+get.cnNumber(Math.max(0,7-player.maxHp))+'张牌)'); + xiongrao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + limited: true, + skillAnimation: true, + animationColor: "soil", + prompt: function (event, player) { + var str = "是否发动【熊扰】?"; + str += "(可摸" + get.cnNumber(Math.max(0, 7 - player.maxHp)) + "张牌)"; return str; }, - logTarget:(event,player)=>game.filterPlayer((current)=>current!=player), - check:function(event,player){ - return player.maxHp<=3; + logTarget: (event, player) => game.filterPlayer((current) => current != player), + check: function (event, player) { + return player.maxHp <= 3; }, - content:function(){ - player.awakenSkill('xiongrao'); - game.countPlayer(function(current){ - if(current!=player) current.addTempSkill('xiongrao_blocker'); + content: function () { + player.awakenSkill("xiongrao"); + game.countPlayer(function (current) { + if (current != player) current.addTempSkill("xiongrao_blocker"); }); - var num=7-player.maxHp; - if(num>0){ + var num = 7 - player.maxHp; + if (num > 0) { player.gainMaxHp(num); player.draw(num); } }, - subSkill:{ - blocker:{ - init:function(player,skill){ + subSkill: { + blocker: { + init: function (player, skill) { player.addSkillBlocker(skill); }, - onremove:function(player,skill){ + onremove: function (player, skill) { player.removeSkillBlocker(skill); }, - charlotte:true, - locked:true, - skillBlocker:function(skill,player){ - var info=get.info(skill); - return info&&!info.charlotte&&!get.is.locked(skill)&&!info.limited&&!info.juexingji; + charlotte: true, + locked: true, + skillBlocker: function (skill, player) { + var info = get.info(skill); + return ( + info && + !info.charlotte && + !get.is.locked(skill) && + !info.limited && + !info.juexingji + ); }, - mark:true, - marktext:'扰', - intro:{ - content:function(list,player,skill){ - var storage=player.getSkills(null,false,false).filter(function(i){ - return lib.skill.xiongrao_blocker.skillBlocker(i,player); + mark: true, + marktext: "扰", + intro: { + content: function (list, player, skill) { + var storage = player.getSkills(null, false, false).filter(function (i) { + return lib.skill.xiongrao_blocker.skillBlocker(i, player); }); - if(storage.length) return '失效技能:'+get.translation(storage); - return '无失效技能'; - } - } + if (storage.length) return "失效技能:" + get.translation(storage); + return "无失效技能"; + }, + }, }, - } + }, }, //卞喜 - dunxi:{ - audio:2, - trigger:{player:'useCard'}, - direct:true, - filter:function(event,player){ - if(!get.tag(event.card,'damage')) return false; - return event.targets.some(target=>target!=player&&target.isIn()); + dunxi: { + audio: 2, + trigger: { player: "useCard" }, + direct: true, + filter: function (event, player) { + if (!get.tag(event.card, "damage")) return false; + return event.targets.some((target) => target != player && target.isIn()); }, - content:function(){ - 'step 0' - var targets=trigger.targets.filter(function(current){ - return current!=player&¤t.isIn(); + content: function () { + "step 0"; + var targets = trigger.targets.filter(function (current) { + return current != player && current.isIn(); }); - if(targets.length==1){ - event.target=targets[0]; - player.chooseBool(get.prompt('dunxi',event.target),'令'+get.translation(event.target)+'获得一枚“钝”标记').set('goon',get.attitude(player,event.target)<0).set('ai',()=>_status.event.goon); + if (targets.length == 1) { + event.target = targets[0]; + player + .chooseBool( + get.prompt("dunxi", event.target), + "令" + get.translation(event.target) + "获得一枚“钝”标记" + ) + .set("goon", get.attitude(player, event.target) < 0) + .set("ai", () => _status.event.goon); + } else { + player + .chooseTarget( + get.prompt("dunxi"), + "选择一名目标角色获得一枚“钝”标记", + function (card, player, target) { + return ( + target != player && + _status.event.getTrigger().targets.includes(target) + ); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att >= 0) return 0; + return -att / (1 + target.hasMark("dunxi")); + }); } - else{ - player.chooseTarget(get.prompt('dunxi'),'选择一名目标角色获得一枚“钝”标记',function(card,player,target){ - return target!=player&&_status.event.getTrigger().targets.includes(target); - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>=0) return 0; - return -att/(1+target.hasMark('dunxi')); - }); - } - 'step 1' - if(result.bool){ - var target=event.target||result.targets[0]; - player.logSkill('dunxi',target); - target.addMark('dunxi',1); + ("step 1"); + if (result.bool) { + var target = event.target || result.targets[0]; + player.logSkill("dunxi", target); + target.addMark("dunxi", 1); game.delayx(); } }, - intro:{content:'mark',name2:'钝'}, - group:'dunxi_random', - subSkill:{ - random:{ - audio:'dunxi', - trigger:{global:'useCard'}, - forced:true, - locked:false, - filter:function(event,player){ - if(!event.player.hasMark('dunxi')||event.targets.length!=1||event._dunxi||_status.dying.length) return false; - var type=get.type2(event.card,false); - return (type=='basic'||type=='trick'); + intro: { content: "mark", name2: "钝" }, + group: "dunxi_random", + subSkill: { + random: { + audio: "dunxi", + trigger: { global: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if ( + !event.player.hasMark("dunxi") || + event.targets.length != 1 || + event._dunxi || + _status.dying.length + ) + return false; + var type = get.type2(event.card, false); + return type == "basic" || type == "trick"; }, - logTarget:'player', - line:'fire', - content:function(){ - 'step 0' - trigger._dunxi=true; - trigger.player.removeMark('dunxi',1); - var target=trigger.targets[0]; - event.target=target; + logTarget: "player", + line: "fire", + content: function () { + "step 0"; + trigger._dunxi = true; + trigger.player.removeMark("dunxi", 1); + var target = trigger.targets[0]; + event.target = target; trigger.targets.remove(target); //trigger.triggeredTargets1.remove(target); trigger.untrigger(); game.delayx(); - 'step 1' + ("step 1"); var list; - if(get.type(event.card)!='delay') list=game.filterPlayer(function(current){ - return lib.filter.targetEnabled2(trigger.card,trigger.player,current); - }); - else list=game.filterPlayer(function(current){ - return current.canAddJudge(event.card); - }); - if(list.length) target=list.randomGet(); + if (get.type(event.card) != "delay") + list = game.filterPlayer(function (current) { + return lib.filter.targetEnabled2(trigger.card, trigger.player, current); + }); + else + list = game.filterPlayer(function (current) { + return current.canAddJudge(event.card); + }); + if (list.length) target = list.randomGet(); trigger.targets.push(target); - trigger.player.line(target,'fire'); - game.log(trigger.card,'的目标被改为',target); - if(target==event.target){ + trigger.player.line(target, "fire"); + game.log(trigger.card, "的目标被改为", target); + if (target == event.target) { trigger.player.loseHp(); - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.player==trigger.player) evt.skipped=true; + var evt = trigger.getParent("phaseUse"); + if (evt && evt.player == trigger.player) evt.skipped = true; } }, }, }, }, //冯方 - dcditing:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - logTarget:'player', - filter:function(event,player){ - return player.hp>0&&event.player.countCards('h')>0&&event.player.inRange(player); + dcditing: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + logTarget: "player", + filter: function (event, player) { + return player.hp > 0 && event.player.countCards("h") > 0 && event.player.inRange(player); }, - prompt2:(event,player)=>('观看其'+get.cnNumber(Math.min(player.hp,event.player.countCards('h')))+'张手牌并选择其中一张'), - check:function(event,player){ - var target=event.player; - if(get.attitude(player,target)>0) return true; - if(Math.min(player.hp,target.countCards('h'))>2) return true; + prompt2: (event, player) => + "观看其" + + get.cnNumber(Math.min(player.hp, event.player.countCards("h"))) + + "张手牌并选择其中一张", + check: function (event, player) { + var target = event.player; + if (get.attitude(player, target) > 0) return true; + if (Math.min(player.hp, target.countCards("h")) > 2) return true; return false; }, - content:function(){ - 'step 0' - var target=trigger.player; - var cards=target.getCards('h'); - var num=Math.min(cards.length,player.hp),cards2=cards.randomGets(num); - player.chooseButton([get.translation(target)+'的手牌('+num+'/'+cards.length+')',cards2],true).set('ai',function(button){ - var player=_status.event.player,target=_status.event.getTrigger().player,card=button.link; - var att=get.attitude(player,target); - var val=target.getUseValue(card,null,true); - if(val<=0) return -get.value(card,target)/2*get.sgn(att-0.05); - if(target.canUse(card,player)&&get.effect(player,card,target,target)>0){ - var eff=get.effect(player,card,target,player); - if(eff<0) val-=eff; - } - return val; - }); - 'step 1' - if(result.bool){ - player.addTempSkill('dcditing_effect','phaseUseAfter'); - player.storage.dcditing_effect=[trigger.player,result.links[0]]; + content: function () { + "step 0"; + var target = trigger.player; + var cards = target.getCards("h"); + var num = Math.min(cards.length, player.hp), + cards2 = cards.randomGets(num); + player + .chooseButton( + [get.translation(target) + "的手牌(" + num + "/" + cards.length + ")", cards2], + true + ) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.getTrigger().player, + card = button.link; + var att = get.attitude(player, target); + var val = target.getUseValue(card, null, true); + if (val <= 0) return (-get.value(card, target) / 2) * get.sgn(att - 0.05); + if (target.canUse(card, player) && get.effect(player, card, target, target) > 0) { + var eff = get.effect(player, card, target, player); + if (eff < 0) val -= eff; + } + return val; + }); + ("step 1"); + if (result.bool) { + player.addTempSkill("dcditing_effect", "phaseUseAfter"); + player.storage.dcditing_effect = [trigger.player, result.links[0]]; } }, - subSkill:{ - effect:{ - audio:'dcditing', - charlotte:true, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - var list=player.storage.dcditing_effect; - return list&&event.player==list[0]&&event.cards.includes(list[1]); + subSkill: { + effect: { + audio: "dcditing", + charlotte: true, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + var list = player.storage.dcditing_effect; + return list && event.player == list[0] && event.cards.includes(list[1]); }, - content:function(){ + content: function () { trigger.excluded.add(player); game.delayx(); }, - group:['dcditing_draw','dcditing_gain'], + group: ["dcditing_draw", "dcditing_gain"], }, - draw:{ - audio:'dcditing', - charlotte:true, - trigger:{global:'useCardAfter'}, - forced:true, - filter:function(event,player){ - var list=player.storage.dcditing_effect; - return list&&event.player==list[0]&&event.cards.includes(list[1])&&!event.targets.includes(player); + draw: { + audio: "dcditing", + charlotte: true, + trigger: { global: "useCardAfter" }, + forced: true, + filter: function (event, player) { + var list = player.storage.dcditing_effect; + return ( + list && + event.player == list[0] && + event.cards.includes(list[1]) && + !event.targets.includes(player) + ); }, - content:function(){ + content: function () { player.draw(2); }, }, - gain:{ - audio:'dcditing', - charlotte:true, - trigger:{global:'phaseUseEnd'}, - forced:true, - filter:function(event,player){ - var list=player.storage.dcditing_effect; - return list&&event.player==list[0]&&event.player.getCards('h').includes(list[1]); + gain: { + audio: "dcditing", + charlotte: true, + trigger: { global: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + var list = player.storage.dcditing_effect; + return ( + list && + event.player == list[0] && + event.player.getCards("h").includes(list[1]) + ); }, - content:function(){ - var list=player.storage.dcditing_effect; - player.gain(list[0],list[1],'giveAuto','bySelf'); + content: function () { + var list = player.storage.dcditing_effect; + player.gain(list[0], list[1], "giveAuto", "bySelf"); }, }, }, }, - dcbihuo:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + dcbihuo: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - direct:true, - filter:function(event,player){ - return event.source&&event.player!=event.source; + direct: true, + filter: function (event, player) { + return event.source && event.player != event.source; }, - content:function(){ - 'step 0' - event.num=(event.triggername=='damageEnd'?1:-1); - player.chooseTarget(get.prompt('dcbihuo'),'令一名角色下回合的额定摸牌数'+(event.num>0?'+1':'-1')).set('ai',function(target){ - var player=_status.event.player,num=_status.event.getParent().num; - var att=get.attitude(player,target); - if(num>0){ - if(att<=0) return 0; - if(target.hasJudge('lebu')) return att/10; - return att/Math.sqrt(Math.min(5,1+target.countCards('h')))*Math.sqrt(1+target.hp); - } - if(num<0){ - if(att>=0) return 0; - if((target.storage.dcbihuo_effect||0)<=-2) return -att/10; - return -att/Math.sqrt(Math.min(5,1+target.countCards('h')))*Math.sqrt(1+target.hp); - } - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcbihuo',target); - if(typeof target.storage.dcbihuo_effect!='number') target.storage.dcbihuo_effect=0; - target.storage.dcbihuo_effect+=event.num; - target.addTempSkill('dcbihuo_effect',{player:'phaseAfter'}); + content: function () { + "step 0"; + event.num = event.triggername == "damageEnd" ? 1 : -1; + player + .chooseTarget( + get.prompt("dcbihuo"), + "令一名角色下回合的额定摸牌数" + (event.num > 0 ? "+1" : "-1") + ) + .set("ai", function (target) { + var player = _status.event.player, + num = _status.event.getParent().num; + var att = get.attitude(player, target); + if (num > 0) { + if (att <= 0) return 0; + if (target.hasJudge("lebu")) return att / 10; + return ( + (att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * + Math.sqrt(1 + target.hp) + ); + } + if (num < 0) { + if (att >= 0) return 0; + if ((target.storage.dcbihuo_effect || 0) <= -2) return -att / 10; + return ( + (-att / Math.sqrt(Math.min(5, 1 + target.countCards("h")))) * + Math.sqrt(1 + target.hp) + ); + } + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcbihuo", target); + if (typeof target.storage.dcbihuo_effect != "number") + target.storage.dcbihuo_effect = 0; + target.storage.dcbihuo_effect += event.num; + target.addTempSkill("dcbihuo_effect", { player: "phaseAfter" }); game.delayx(); } }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{player:'phaseDrawBegin'}, - forced:true, - onremove:true, - content:function(){ - var num=player.storage.dcbihuo_effect; - trigger.num+=num; - game.log(player,'的额定摸牌数','#g'+(num>=0?'+':'')+num); + subSkill: { + effect: { + charlotte: true, + trigger: { player: "phaseDrawBegin" }, + forced: true, + onremove: true, + content: function () { + var num = player.storage.dcbihuo_effect; + trigger.num += num; + game.log(player, "的额定摸牌数", "#g" + (num >= 0 ? "+" : "") + num); }, - mark:true, - intro:{ - content:(num)=>('额定摸牌数'+(num>=0?'+':'')+num), + mark: true, + intro: { + content: (num) => "额定摸牌数" + (num >= 0 ? "+" : "") + num, }, }, }, }, //秦宜禄 - piaoping:{ - audio:2, - trigger:{player:'useCard'}, - forced:true, - zhuanhuanji:true, - filter:function(event,player){ - return !player.hasSkill('piaoping_blocker',null,null,false); + piaoping: { + audio: 2, + trigger: { player: "useCard" }, + forced: true, + zhuanhuanji: true, + filter: function (event, player) { + return !player.hasSkill("piaoping_blocker", null, null, false); }, - content:function(){ - player.changeZhuanhuanji('piaoping'); - var num=Math.min(player.hp,player.getHistory('useSkill',function(evt){ - return evt.skill=='piaoping'; - }).length); - if(num<=0) return; - if(player.storage.piaoping==true) player.draw(num); - else if(player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'piaoping'); - },'he')){ + content: function () { + player.changeZhuanhuanji("piaoping"); + var num = Math.min( + player.hp, + player.getHistory("useSkill", function (evt) { + return evt.skill == "piaoping"; + }).length + ); + if (num <= 0) return; + if (player.storage.piaoping == true) player.draw(num); + else if ( + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "piaoping"); + }, "he") + ) { game.delayx(); - player.chooseToDiscard(true,'he',num); + player.chooseToDiscard(true, "he", num); } }, - mark:true, - marktext:'☯', - intro:{ - content:function(storage){ - if(storage) return '转换技,锁定技。当你使用一张牌时,你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; - return '转换技,锁定技。当你使用一张牌时,你摸X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) + return "转换技,锁定技。当你使用一张牌时,你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; + return "转换技,锁定技。当你使用一张牌时,你摸X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)"; }, }, - subSkill:{blocker:{charlotte:true}}, + subSkill: { blocker: { charlotte: true } }, }, - tuoxian:{ - audio:2, - ai:{combo:'piaoping'}, - trigger:{player:'loseAfter'}, - marktext:'栗', - filter:function(event,player){ - return event.type=='discard'&&event.getParent(3).name=='piaoping'&&player.countMark('tuoxian')>0&&event.cards.filterInD('d').length>0; + tuoxian: { + audio: 2, + ai: { combo: "piaoping" }, + trigger: { player: "loseAfter" }, + marktext: "栗", + filter: function (event, player) { + return ( + event.type == "discard" && + event.getParent(3).name == "piaoping" && + player.countMark("tuoxian") > 0 && + event.cards.filterInD("d").length > 0 + ); }, - direct:true, - content:function(){ - 'step 0' - event.cards=trigger.cards.filterInD('d'); - player.chooseTarget(lib.filter.notMe,get.prompt('tuoxian'),'令一名其他角色获得'+get.translation(event.cards)).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<0) return 0; - if(target.hasSkillTag('nogain')) att/=10; - return att*Math.pow(1+target.countCards('he'),0.25); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('tuoxian',target); - player.removeMark('tuoxian',1); - target.gain(cards,'gain2'); - } - else event.finish(); - 'step 2' - target.chooseControl().set('choiceList',[ - '弃置区域内的'+get.cnNumber(cards.length)+'张牌', - '令'+get.translation(player)+'的〖漂萍〗于本回合内失效', - ]).set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().player; - if(player.hasCard(function(card){ - return get.effect(player,{name:card.viewAs||card.name},player,player)<0; - },'j')||player.hasCard(function(card){ - return get.value(card,player)<=0; - })) return 0; - if(get.attitude(player,target)<=0||!target.isPhaseUsing()) return 1; - if(!target.needsToDiscard()&&!target.hasCard(function(card){ - return !target.hasValueTarget(card,null,true); - },'hs')) return 1; - return 0; - }); - 'step 3' - if(result.index==0){ - if(target.countCards('j')>0) target.discardPlayerCard(target,cards.length,true,'hej'); - else target.chooseToDiscard('he',true,cards.length); - } - else player.addTempSkill('piaoping_blocker'); + direct: true, + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD("d"); + player + .chooseTarget( + lib.filter.notMe, + get.prompt("tuoxian"), + "令一名其他角色获得" + get.translation(event.cards) + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att < 0) return 0; + if (target.hasSkillTag("nogain")) att /= 10; + return att * Math.pow(1 + target.countCards("he"), 0.25); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("tuoxian", target); + player.removeMark("tuoxian", 1); + target.gain(cards, "gain2"); + } else event.finish(); + ("step 2"); + target + .chooseControl() + .set("choiceList", [ + "弃置区域内的" + get.cnNumber(cards.length) + "张牌", + "令" + get.translation(player) + "的〖漂萍〗于本回合内失效", + ]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + if ( + player.hasCard(function (card) { + return ( + get.effect( + player, + { name: card.viewAs || card.name }, + player, + player + ) < 0 + ); + }, "j") || + player.hasCard(function (card) { + return get.value(card, player) <= 0; + }) + ) + return 0; + if (get.attitude(player, target) <= 0 || !target.isPhaseUsing()) return 1; + if ( + !target.needsToDiscard() && + !target.hasCard(function (card) { + return !target.hasValueTarget(card, null, true); + }, "hs") + ) + return 1; + return 0; + }); + ("step 3"); + if (result.index == 0) { + if (target.countCards("j") > 0) + target.discardPlayerCard(target, cards.length, true, "hej"); + else target.chooseToDiscard("he", true, cards.length); + } else player.addTempSkill("piaoping_blocker"); }, - init(player){ - player.addMark('tuoxian',1,false); + init(player) { + player.addMark("tuoxian", 1, false); }, - intro:{name2:'栗',content:'剩余可用#次'}, + intro: { name2: "栗", content: "剩余可用#次" }, }, - chuaili:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - if(player==event.player||get.color(event.card)!='black') return false; - if(!player.hasSkill('piaoping',null,null,false)) return false; - return player.storage.piaoping==true||!player.hasSkill('chuaili_blocker',null,null,false); + chuaili: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (player == event.player || get.color(event.card) != "black") return false; + if (!player.hasSkill("piaoping", null, null, false)) return false; + return ( + player.storage.piaoping == true || + !player.hasSkill("chuaili_blocker", null, null, false) + ); }, - content:function(){ - if(player.storage.piaoping==true){ - player.changeZhuanhuanji('piaoping'); - } - else{ - player.addMark('tuoxian',1,false); - if(player.countCards('tuoxian')>3) player.addTempSkill('chuaili_blocker'); + content: function () { + if (player.storage.piaoping == true) { + player.changeZhuanhuanji("piaoping"); + } else { + player.addMark("tuoxian", 1, false); + if (player.countCards("tuoxian") > 3) player.addTempSkill("chuaili_blocker"); } game.delayx(); }, - ai:{combo:'piaoping'}, - subSkill:{blocker:{charlotte:true}}, + ai: { combo: "piaoping" }, + subSkill: { blocker: { charlotte: true } }, }, //闫柔 - choutao:{ - audio:2, - trigger:{ - player:'useCard', - target:'useCardToTargeted', + choutao: { + audio: 2, + trigger: { + player: "useCard", + target: "useCardToTargeted", }, - filter:function(event,player){ - if(event.card.name!='sha'||!event.player.isIn()) return false; - if(player==event.player) return player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'choutao'); - },'he'); - return event.player.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,event.player); - },'he'); + filter: function (event, player) { + if (event.card.name != "sha" || !event.player.isIn()) return false; + if (player == event.player) + return player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "choutao"); + }, "he"); + return event.player.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, event.player); + }, "he"); }, - check:function(event,player){ - if(player==event.player){ - if(!player.hasCard(function(card){ - return get.value(card)<=5; - },'he')) return false; - for(var i of event.targets){ - var eff1=get.damageEffect(i,player,player); - if(eff1<0) return false; - if(i.hasShan()&&eff1>0) return true; + check: function (event, player) { + if (player == event.player) { + if ( + !player.hasCard(function (card) { + return get.value(card) <= 5; + }, "he") + ) + return false; + for (var i of event.targets) { + var eff1 = get.damageEffect(i, player, player); + if (eff1 < 0) return false; + if (i.hasShan() && eff1 > 0) return true; } - var sha=false; - return player.getCardUsable({name:'sha'})<=0&&player.hasCard(function(card){ - if(!sha&&get.name(card)=='sha'&&player.getUseValue(card)>0){ - sha=true; - return false; - } - return sha&&get.value(card)<=5; - },'hs'); - } - else{ - var eff1=get.effect(event.player,{name:'guohe_copy2'},player,player); - var eff2=get.damageEffect(player,event.player,player); - if(!player.hasShan()) return eff1>0; - if(eff2>0) return eff1>0; - return player.hp>2&&eff2 0) { + sha = true; + return false; + } + return sha && get.value(card) <= 5; + }, "hs") + ); + } else { + var eff1 = get.effect(event.player, { name: "guohe_copy2" }, player, player); + var eff2 = get.damageEffect(player, event.player, player); + if (!player.hasShan()) return eff1 > 0; + if (eff2 > 0) return eff1 > 0; + return player.hp > 2 && eff2 < eff1; } }, - logTarget:'player', - shaRelated:true, - content:function(){ - 'step 0' - if(player!=game.me&&!player.isOnline()&&!player.isUnderControl()) game.delayx(); - if(player==trigger.player) player.chooseToDiscard('he',true).set('ai',function(card){ - var player=_status.event.player; - var val=player.getUseValue(card); - if(get.name(card)=='sha'&&player.getUseValue(card)>0) val+=5; - return 20-val; - }); - else player.discardPlayerCard(trigger.player,true,'he'); - 'step 1' + logTarget: "player", + shaRelated: true, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline() && !player.isUnderControl()) game.delayx(); + if (player == trigger.player) + player.chooseToDiscard("he", true).set("ai", function (card) { + var player = _status.event.player; + var val = player.getUseValue(card); + if (get.name(card) == "sha" && player.getUseValue(card) > 0) val += 5; + return 20 - val; + }); + else player.discardPlayerCard(trigger.player, true, "he"); + ("step 1"); trigger.directHit.addArray(game.players); - if(player==trigger.player&&trigger.addCount!==false){ - trigger.addCount=false; + if (player == trigger.player && trigger.addCount !== false) { + trigger.addCount = false; player.getStat().card.sha--; } }, }, - xiangshu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - limited:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return (player.getStat('damage')||0)>0&&game.hasPlayer((current)=>current.isDamaged()); + xiangshu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return ( + (player.getStat("damage") || 0) > 0 && + game.hasPlayer((current) => current.isDamaged()) + ); }, - content:function(){ - 'step 0' - event.num=Math.min(5,player.getStat('damage')); - player.chooseTarget('是否发动限定技【襄戍】?','令一名角色回复'+event.num+'点体力并摸'+get.cnNumber(event.num)+'张牌',function(card,player,target){ - return target.isDamaged(); - }).set('ai',function(target){ - var num=_status.event.getParent().num,player=_status.event.player; - var att=get.attitude(player,target); - if(att>0&&num>=Math.min(player.hp,2)) return att*Math.sqrt(target.getDamagedHp()); - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.awakenSkill('xiangshu'); - player.logSkill('xiangshu',target); + content: function () { + "step 0"; + event.num = Math.min(5, player.getStat("damage")); + player + .chooseTarget( + "是否发动限定技【襄戍】?", + "令一名角色回复" + event.num + "点体力并摸" + get.cnNumber(event.num) + "张牌", + function (card, player, target) { + return target.isDamaged(); + } + ) + .set("ai", function (target) { + var num = _status.event.getParent().num, + player = _status.event.player; + var att = get.attitude(player, target); + if (att > 0 && num >= Math.min(player.hp, 2)) + return att * Math.sqrt(target.getDamagedHp()); + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.awakenSkill("xiangshu"); + player.logSkill("xiangshu", target); target.recover(num); target.draw(num); - if(player!=target) player.addExpose(0.2); + if (player != target) player.addExpose(0.2); } }, }, //朱灵 - dczhanyi:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - var list=['basic','trick','equip']; - var list2=[]; - var hs=player.getCards('he'); - for(var card of hs){ - var type=get.type2(card,player); - if(list.includes(type)){ - var bool=lib.filter.cardDiscardable(card,player,'dczhanyi'); - if(bool) list2.add(type); - else{ + dczhanyi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + var list = ["basic", "trick", "equip"]; + var list2 = []; + var hs = player.getCards("he"); + for (var card of hs) { + var type = get.type2(card, player); + if (list.includes(type)) { + var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); + if (bool) list2.add(type); + else { list.remove(type); list2.remove(type); } } } - return list2.length>0; + return list2.length > 0; }, - content:function(){ - 'step 0' - var list=['basic','trick','equip']; - var list2=[]; - var hs=player.getCards('he'); - for(var card of hs){ - var type=get.type2(card,player); - if(list.includes(type)){ - var bool=lib.filter.cardDiscardable(card,player,'dczhanyi'); - if(bool) list2.add(type); - else{ + content: function () { + "step 0"; + var list = ["basic", "trick", "equip"]; + var list2 = []; + var hs = player.getCards("he"); + for (var card of hs) { + var type = get.type2(card, player); + if (list.includes(type)) { + var bool = lib.filter.cardDiscardable(card, player, "dczhanyi"); + if (bool) list2.add(type); + else { list.remove(type); list2.remove(type); } } } - player.chooseControl(list2,'cancel2').set('prompt',get.prompt('dczhanyi')).set('prompt2','弃置一种类型的所有牌').set('ai',function(){ - var player=_status.event.player; - var getval=function(control){ - if(control=='cancel2') return 0; - var hs=player.getCards('h'),eff=0; - var es=player.getCards('e'); - var ss=player.getCards('s'); - var sha=player.getCardUsable({name:'sha'}); - for(var i of hs){ - var type=get.type2(i); - if(type==control){ - eff-=get.value(i,player); - } - else{ - switch(type){ - case 'basic': - if(sha>0&&get.name(i)=='sha'){ - sha--; - var add=3; - if(!player.hasValueTarget(i)&&player.hasValueTarget(i,false)) add+=player.getUseValue(i,false); - eff+=add; - } - break - case 'trick': - if(player.hasValueTarget(i)) eff+=6; - break; - case 'equip': - if(player.hasValueTarget({name:'guohe_copy2'})) eff+=player.getUseValue({name:'guohe_copy2'}); - break; + player + .chooseControl(list2, "cancel2") + .set("prompt", get.prompt("dczhanyi")) + .set("prompt2", "弃置一种类型的所有牌") + .set("ai", function () { + var player = _status.event.player; + var getval = function (control) { + if (control == "cancel2") return 0; + var hs = player.getCards("h"), + eff = 0; + var es = player.getCards("e"); + var ss = player.getCards("s"); + var sha = player.getCardUsable({ name: "sha" }); + for (var i of hs) { + var type = get.type2(i); + if (type == control) { + eff -= get.value(i, player); + } else { + switch (type) { + case "basic": + if (sha > 0 && get.name(i) == "sha") { + sha--; + var add = 3; + if ( + !player.hasValueTarget(i) && + player.hasValueTarget(i, false) + ) + add += player.getUseValue(i, false); + eff += add; + } + break; + case "trick": + if (player.hasValueTarget(i)) eff += 6; + break; + case "equip": + if (player.hasValueTarget({ name: "guohe_copy2" })) + eff += player.getUseValue({ name: "guohe_copy2" }); + break; + } } } - } - if(control=='equip'){ - for(var i of es) eff-=get.value(i,player); - } - else{ - for(var i of ss){ - var type=get.type2(i); - if(type==control) continue; - switch(type){ - case 'basic': - if(sha>0&&get.name(i)=='sha'){ - sha--; - var add=3; - if(!player.hasValueTarget(i)&&player.hasValueTarget(i,false)) add+=player.getUseValue(i,false); - eff+=add; - } - break - case 'trick': - if(player.hasValueTarget(i)) eff+=6; - break; - case 'equip': - if(player.hasValueTarget({name:'guohe_copy2'})) eff+=player.getUseValue({name:'guohe_copy2'}); - break; + if (control == "equip") { + for (var i of es) eff -= get.value(i, player); + } else { + for (var i of ss) { + var type = get.type2(i); + if (type == control) continue; + switch (type) { + case "basic": + if (sha > 0 && get.name(i) == "sha") { + sha--; + var add = 3; + if ( + !player.hasValueTarget(i) && + player.hasValueTarget(i, false) + ) + add += player.getUseValue(i, false); + eff += add; + } + break; + case "trick": + if (player.hasValueTarget(i)) eff += 6; + break; + case "equip": + if (player.hasValueTarget({ name: "guohe_copy2" })) + eff += player.getUseValue({ name: "guohe_copy2" }); + break; + } } } + return eff; + }; + var controls = _status.event.controls.slice(0); + var eff = 0, + current = "cancel2"; + for (var i of controls) { + var effx = getval(i); + if (effx > eff) { + eff = effx; + current = i; + } } - return eff; - }; - var controls=_status.event.controls.slice(0); - var eff=0,current='cancel2'; - for(var i of controls){ - var effx=getval(i); - if(effx>eff){ - eff=effx; - current=i; - } - } - return current; - }); - 'step 1' - var type=result.control; - if(type!='cancel2'){ - event.type=type; - var cards=player.getCards('he',function(card){ - return get.type2(card,player)==type; + return current; }); - if(cards.length){ - player.logSkill('dczhanyi'); + ("step 1"); + var type = result.control; + if (type != "cancel2") { + event.type = type; + var cards = player.getCards("he", function (card) { + return get.type2(card, player) == type; + }); + if (cards.length) { + player.logSkill("dczhanyi"); player.discard(cards); - } - else event.finish(); - } - else event.finish(); - 'step 2' - var list=['basic','trick','equip']; - for(var i of list){ - if(i!=event.type) player.addTempSkill('dczhanyi_'+i,{player:'phaseBegin'}); + } else event.finish(); + } else event.finish(); + ("step 2"); + var list = ["basic", "trick", "equip"]; + for (var i of list) { + if (i != event.type) player.addTempSkill("dczhanyi_" + i, { player: "phaseBegin" }); } }, - subSkill:{ - basic:{ - charlotte:true, - marktext:'基', - mark:true, - intro:{ - content:'使用基本牌无距离限制,且伤害值和回复值基数+1', + subSkill: { + basic: { + charlotte: true, + marktext: "基", + mark: true, + intro: { + content: "使用基本牌无距离限制,且伤害值和回复值基数+1", }, - trigger:{source:['damageBegin1','recoverBegin']}, - filter:function(event,player){ - var evt=event.getParent(); - return evt.type=='card'&&get.type(evt.card,false)=='basic'; + trigger: { source: ["damageBegin1", "recoverBegin"] }, + filter: function (event, player) { + var evt = event.getParent(); + return evt.type == "card" && get.type(evt.card, false) == "basic"; }, - forced:true, - logTarget:'player', - content:function(){ + forced: true, + logTarget: "player", + content: function () { trigger.num++; }, - mod:{ - targetInRange:function(card){ - if(get.type(card)=='basic') return true; + mod: { + targetInRange: function (card) { + if (get.type(card) == "basic") return true; }, }, - ai:{ - damageBonus:true, + ai: { + damageBonus: true, }, }, - trick:{ - charlotte:true, - marktext:'锦', - mark:true, - intro:{ - content:'使用锦囊牌时摸一张牌,且锦囊牌不计入本回合的手牌上限', + trick: { + charlotte: true, + marktext: "锦", + mark: true, + intro: { + content: "使用锦囊牌时摸一张牌,且锦囊牌不计入本回合的手牌上限", }, - trigger:{player:'useCard'}, - filter:function(event,player){ - return get.type2(event.card)=='trick'; + trigger: { player: "useCard" }, + filter: function (event, player) { + return get.type2(event.card) == "trick"; }, - forced:true, - content:function(){ + forced: true, + content: function () { player.draw(); }, - mod:{ - ignoredHandcard:function(card,player){ - if(get.type2(card,player)=='trick') return true; + mod: { + ignoredHandcard: function (card, player) { + if (get.type2(card, player) == "trick") return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.type2(card,player)=='trick') return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.type2(card, player) == "trick") + return false; + }, + }, + }, + equip: { + charlotte: true, + marktext: "装", + mark: true, + intro: { + content: "有装备牌进入你的装备区时,可弃置一名其他角色的一张牌", + }, + trigger: { player: "equipAfter" }, + filter: function (event, player) { + return game.hasPlayer( + (target) => target != player && target.countDiscardableCards(player, "he") > 0 + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + "战意:是否弃置一名其他角色的一张牌?", + function (card, player, target) { + return ( + target != player && target.countDiscardableCards(player, "he") > 0 + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dczhanyi_equip", target); + player.discardPlayerCard(target, "he", true); } }, }, - equip:{ - charlotte:true, - marktext:'装', - mark:true, - intro:{ - content:'有装备牌进入你的装备区时,可弃置一名其他角色的一张牌', - }, - trigger:{player:'equipAfter'}, - filter:function(event,player){ - return game.hasPlayer((target)=>(target!=player&&target.countDiscardableCards(player,'he')>0)); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget('战意:是否弃置一名其他角色的一张牌?',function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'he')>0; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dczhanyi_equip',target); - player.discardPlayerCard(target,'he',true); - } - }, - } }, }, //李采薇 - yijiao:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&!current.hasMark('yijiao'); + yijiao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && !current.hasMark("yijiao"); }); }, - filterTarget:function(card,player,target){ - return target!=player&&!target.hasMark('yijiao'); + filterTarget: function (card, player, target) { + return target != player && !target.hasMark("yijiao"); }, - content:function(){ - 'step 0' - player.chooseControl('10个','20个','30个','40个').set('prompt','要令'+get.translation(target)+'获得多少标记?').set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target; - /*if(get.attitude(player,target)<0&&game.hasPlayer(function(current){ + content: function () { + "step 0"; + player + .chooseControl("10个", "20个", "30个", "40个") + .set("prompt", "要令" + get.translation(target) + "获得多少标记?") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + /*if(get.attitude(player,target)<0&&game.hasPlayer(function(current){ return current!=player&¤t!=target&&!current.hasMark('yijiao')&&get.attitude(player,current)<0; })) return 3;*/ - return 0; - }); - 'step 1' - target.addMark('yijiao',10*(1+result.index)); + return 0; + }); + ("step 1"); + target.addMark("yijiao", 10 * (1 + result.index)); }, - ai:{ - order:1.1, - result:{ - player:1, - target:-0.5, + ai: { + order: 1.1, + result: { + player: 1, + target: -0.5, }, }, - group:'yijiao_effect', - subSkill:{ - effect:{ - trigger:{global:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return event.player.isIn()&&event.player!=player&&event.player.hasMark('yijiao'); + group: "yijiao_effect", + subSkill: { + effect: { + trigger: { global: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return ( + event.player.isIn() && + event.player != player && + event.player.hasMark("yijiao") + ); }, - logTarget:'player', - content:function(){ - var target=trigger.player,num=target.countMark('yijiao'); - var num2=0; - target.getHistory('useCard',function(evt){ - var numz=get.number(evt.card); - if(typeof numz=='number') num2+=numz; + logTarget: "player", + content: function () { + var target = trigger.player, + num = target.countMark("yijiao"); + var num2 = 0; + target.getHistory("useCard", function (evt) { + var numz = get.number(evt.card); + if (typeof numz == "number") num2 += numz; }); - if(num>num2){ - var hs=target.getCards('he',function(card){ - return lib.filter.cardDiscardable(card,target,'yijiao_effect'); + if (num > num2) { + var hs = target.getCards("he", function (card) { + return lib.filter.cardDiscardable(card, target, "yijiao_effect"); }); - if(hs.length) target.discard(hs.randomGets(get.rand(1,3))); - } - else if(num==num2){ + if (hs.length) target.discard(hs.randomGets(get.rand(1, 3))); + } else if (num == num2) { target.insertPhase(); player.draw(2); - } - else{ + } else { player.draw(3); } - target.removeMark('yijiao',num); + target.removeMark("yijiao", num); }, }, }, - intro:{ - onunmark:true, - name2:'异', - content:'mark', + intro: { + onunmark: true, + name2: "异", + content: "mark", }, }, - qibie:{ - audio:2, - trigger:{global:'die'}, - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasCard(function(card){ - return !lib.filter.cardDiscardable(card,player,'qibie'); - },'h'); + qibie: { + audio: 2, + trigger: { global: "die" }, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + !player.hasCard(function (card) { + return !lib.filter.cardDiscardable(card, player, "qibie"); + }, "h") + ); }, - check:function(event,player){ - return player.isDamaged()&&player.countCards('h','tao')0; + channi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:lib.filter.notMe, - filterCard:true, - selectCard:[1,Infinity], - check:function(card){ - let player=_status.event.player,num=player.hasSkill('nifu')?15:8; - if(ui.selected.cards.length<=Math.max(1,player.needsToDiscard(),player.countCards('h')-4)) return num-get.value(card); - return num/2-get.value(card); + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: [1, Infinity], + check: function (card) { + let player = _status.event.player, + num = player.hasSkill("nifu") ? 15 : 8; + if ( + ui.selected.cards.length <= + Math.max(1, player.needsToDiscard(), player.countCards("h") - 4) + ) + return num - get.value(card); + return num / 2 - get.value(card); }, - position:'h', - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' - player.give(cards,target); - 'step 1' - if(target.countCards('h')>0){ - game.broadcastAll(function(num){ - lib.skill.channi_backup.selectCard=[1,num]; - },cards.length); - var next=target.chooseToUse(); - next.set('openskilldialog','将至多'+get.cnNumber(cards.length)+'张手牌当做【决斗】使用'); - next.set('norestore',true); - next.set('addCount',false); - next.set('_backupevent','channi_backup'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + position: "h", + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; + player.give(cards, target); + ("step 1"); + if (target.countCards("h") > 0) { + game.broadcastAll(function (num) { + lib.skill.channi_backup.selectCard = [1, num]; + }, cards.length); + var next = target.chooseToUse(); + next.set( + "openskilldialog", + "将至多" + get.cnNumber(cards.length) + "张手牌当做【决斗】使用" + ); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "channi_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('channi_backup'); - } - else event.finish(); - 'step 2' - if(result.bool){ - var evts=target.getHistory('useCard',function(evt){ - return evt.card.name=='juedou'&&evt.getParent(2)==event; + next.backup("channi_backup"); + } else event.finish(); + ("step 2"); + if (result.bool) { + var evts = target.getHistory("useCard", function (evt) { + return evt.card.name == "juedou" && evt.getParent(2) == event; }); - if(!evts.length){ + if (!evts.length) { event.finish(); return; } - var num=evts[0].cards.length; - if(target.hasHistory('sourceDamage',function(evt){ - return evt.card&&evt.card.name=='juedou'&&evt.getParent(4)==event; - })) target.draw(num); - } - else event.finish(); - 'step 3' - if(player.countCards('h')>0&&target.hasHistory('damage',function(evt){ - return evt.card&&evt.card.name=='juedou'&&evt.getParent(4)==event; - })) player.chooseToDiscard('h',true,player.countCards('h')); + var num = evts[0].cards.length; + if ( + target.hasHistory("sourceDamage", function (evt) { + return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; + }) + ) + target.draw(num); + } else event.finish(); + ("step 3"); + if ( + player.countCards("h") > 0 && + target.hasHistory("damage", function (evt) { + return evt.card && evt.card.name == "juedou" && evt.getParent(4) == event; + }) + ) + player.chooseToDiscard("h", true, player.countCards("h")); }, - subSkill:{ - backup:{ - filterCard:function(card){ - return get.itemtype(card)=='card'; + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; }, - viewAs:{name:'juedou'}, - position:'h', - filterTarget:lib.filter.targetEnabled, - ai1:(card)=>{ - if(get.name(card)==='sha') return 0; - return 5.5-get.value(card); + viewAs: { name: "juedou" }, + position: "h", + filterTarget: lib.filter.targetEnabled, + ai1: (card) => { + if (get.name(card) === "sha") return 0; + return 5.5 - get.value(card); }, - log:false, - precontent:function(){ + log: false, + precontent: function () { delete event.result.skill; }, }, }, - ai:{ - order:0.3, - result:{ - target:function(player,target){ - if(target==game.me||target.isOnline()||target.hasValueTarget({name:'juedou'})) return 2; - if(player.needsToDiscard()) return 0.5; + ai: { + order: 0.3, + result: { + target: function (player, target) { + if ( + target == game.me || + target.isOnline() || + target.hasValueTarget({ name: "juedou" }) + ) + return 2; + if (player.needsToDiscard()) return 0.5; return 0; }, }, }, }, - nifu:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - filter:function(event,player){ - return player.countCards('h')!=3; + nifu: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + filter: function (event, player) { + return player.countCards("h") != 3; }, - content:function(){ - var num=player.countCards('h')-3; - if(num>0) player.chooseToDiscard('h',num,true); + content: function () { + var num = player.countCards("h") - 3; + if (num > 0) player.chooseToDiscard("h", num, true); else player.draw(-num); }, }, //郝萌 - xiongmang:{ - audio:2, - enable:'chooseToUse', - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - return player.countCards('hs')>0; + xiongmang: { + audio: 2, + enable: "chooseToUse", + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + return player.countCards("hs") > 0; }, - selectCard:function(){ - return [1,4]; + selectCard: function () { + return [1, 4]; }, - selectTarget:function(){ - var card=get.card(),player=get.player(); - if(card==undefined) return; - var range=[1,Math.max(1,ui.selected.cards.length)] - game.checkMod(card,player,range,'selectTarget',player); + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (card == undefined) return; + var range = [1, Math.max(1, ui.selected.cards.length)]; + game.checkMod(card, player, range, "selectTarget", player); return range; }, - complexCard:true, - filterCard:function(card){ - if(!ui.selected.cards.length) return true; - var suit=get.suit(card); - for(var i of ui.selected.cards){ - if(get.suit(i)==suit) return false; + complexCard: true, + filterCard: function (card) { + if (!ui.selected.cards.length) return true; + var suit = get.suit(card); + for (var i of ui.selected.cards) { + if (get.suit(i) == suit) return false; } return true; }, - filterOk:function(){ - if(!ui.selected.targets.length) return false; - var card=get.card(),player=get.player(); - if(card==undefined) return; - var range=[1,Math.max(1,ui.selected.cards.length)] - game.checkMod(card,player,range,'selectTarget',player); - if(range[0]<=ui.selected.targets.length&&range[1]>=ui.selected.targets.length||range[0]==-1) return true; + filterOk: function () { + if (!ui.selected.targets.length) return false; + var card = get.card(), + player = get.player(); + if (card == undefined) return; + var range = [1, Math.max(1, ui.selected.cards.length)]; + game.checkMod(card, player, range, "selectTarget", player); + if ( + (range[0] <= ui.selected.targets.length && range[1] >= ui.selected.targets.length) || + range[0] == -1 + ) + return true; return false; }, - check:function(card){ - var player=_status.event.player,card=get.autoViewAs({name:'sha'},ui.selected.cards.concat(card)); - if(game.countPlayer(function(current){ - return (_status.event.filterTarget||lib.filter.filterTarget)(card,player,current)&&get.effect_use(current,card,player,player)>0; - })<=ui.selected.cards.length) return 0; - return 5-get.value(card); + check: function (card) { + var player = _status.event.player, + card = get.autoViewAs({ name: "sha" }, ui.selected.cards.concat(card)); + if ( + game.countPlayer(function (current) { + return ( + (_status.event.filterTarget || lib.filter.filterTarget)( + card, + player, + current + ) && get.effect_use(current, card, player, player) > 0 + ); + }) <= ui.selected.cards.length + ) + return 0; + return 5 - get.value(card); }, - position:'hs', - onuse:function(links,player){ - player.addTempSkill('xiongmang_effect'); + position: "hs", + onuse: function (links, player) { + player.addTempSkill("xiongmang_effect"); }, - ai:{ - order:()=>get.order({name:'sha'})+0.2, - respondSha:true, - skillTagFilter:function(player,tag,arg){ - return player.countCards('hs')>0; + ai: { + order: () => get.order({ name: "sha" }) + 0.2, + respondSha: true, + skillTagFilter: function (player, tag, arg) { + return player.countCards("hs") > 0; }, }, - subSkill:{ - effect:{ - trigger:{player:'useCardAfter'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.maxHp>1&&event.skill=='xiongmang'&&!player.hasHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }); + subSkill: { + effect: { + trigger: { player: "useCardAfter" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.maxHp > 1 && + event.skill == "xiongmang" && + !player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) + ); }, - content:function(){ + content: function () { player.loseMaxHp(); }, }, }, }, //庞德公 - heqia:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer((current)=>current.countCards(current==player?'he':'h')>0); + heqia: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer( + (current) => current.countCards(current == player ? "he" : "h") > 0 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('heqia'), - prompt2:'操作提示:选择要给出的牌和目标角色,或直接选择一名目标角色,令其将牌交给自己', - filterCard:true, - position:'he', - selectCard:function(){ - if(ui.selected.targets.length&&!ui.selected.targets[0].countCards('h')) return [1,Infinity]; - return [0,Infinity]; + prompt: get.prompt("heqia"), + prompt2: + "操作提示:选择要给出的牌和目标角色,或直接选择一名目标角色,令其将牌交给自己", + filterCard: true, + position: "he", + selectCard: function () { + if (ui.selected.targets.length && !ui.selected.targets[0].countCards("h")) + return [1, Infinity]; + return [0, Infinity]; }, - filterTarget:function(card,player,target){ - if(player==target) return false; - if(!ui.selected.cards.length) return target.countCards('h')>0; + filterTarget: function (card, player, target) { + if (player == target) return false; + if (!ui.selected.cards.length) return target.countCards("h") > 0; return true; }, - ai1:function(card){ - if(!_status.event.nogive||ui.selected.cards.length) return 0-get.value(card); - return 1/Math.max(1,get.value(card)); + ai1: function (card) { + if (!_status.event.nogive || ui.selected.cards.length) return 0 - get.value(card); + return 1 / Math.max(1, get.value(card)); }, - ai2:function(target){ - return (get.attitude(player,target)-0.1)*(ui.selected.cards.length?1:-1); + ai2: function (target) { + return (get.attitude(player, target) - 0.1) * (ui.selected.cards.length ? 1 : -1); }, - nogive:!game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)<=0&¤t.countCards('h')>0; + nogive: !game.hasPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) <= 0 && + current.countCards("h") > 0 + ); }), }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('heqia',target); - if(result.cards.length){ - player.give(result.cards,target); - event.source=target; - event.num=result.cards.length; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("heqia", target); + if (result.cards.length) { + player.give(result.cards, target); + event.source = target; + event.num = result.cards.length; event.goto(4); } - } - else event.finish(); - 'step 2' - var he=target.getCards('he'); - if(he.length>0){ - if(he.length>1) target.chooseCard('he',true,[1,Infinity],'选择交给'+get.translation(player)+'任意张牌').set('ai',(card)=>-get.value(card)); - else event._result={bool:true,cards:he}; - } - else event.finish(); - 'step 3' - if(result.bool){ - event.source=player; - target.give(result.cards,player); - event.num=result.cards.length; - } - else event.finish(); - 'step 4' - if(source&&source.isIn()&&source.countCards('h')>0){ - var list=[]; - for(var name of lib.inpile){ - if(get.type(name)!='basic') continue; - if(source.hasUseTarget({name:name},false)) list.push(['基本','',name]); - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - if(source.hasUseTarget({name:name,nature:nature},false)) list.push(['基本','',name,nature]); + } else event.finish(); + ("step 2"); + var he = target.getCards("he"); + if (he.length > 0) { + if (he.length > 1) + target + .chooseCard( + "he", + true, + [1, Infinity], + "选择交给" + get.translation(player) + "任意张牌" + ) + .set("ai", (card) => -get.value(card)); + else event._result = { bool: true, cards: he }; + } else event.finish(); + ("step 3"); + if (result.bool) { + event.source = player; + target.give(result.cards, player); + event.num = result.cards.length; + } else event.finish(); + ("step 4"); + if (source && source.isIn() && source.countCards("h") > 0) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) != "basic") continue; + if (source.hasUseTarget({ name: name }, false)) list.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if (source.hasUseTarget({ name: name, nature: nature }, false)) + list.push(["基本", "", name, nature]); } } } - if(list.length){ - source.chooseButton(['是否将一张手牌当做一种基本牌使用?',[list,'vcard']]).set('ai',(button)=>_status.event.player.getUseValue({name:button.link[2],nature:button.link[3]},false)); - } - else event.finish(); - } - else event.finish(); - 'step 5' - if(result.bool){ - var card={name:result.links[0][2],nature:result.links[0][3]}; - game.broadcastAll(function(card){ - lib.skill.heqia_backup.viewAs=card; - },card); - var next=source.chooseToUse(); - next.set('openskilldialog','将一张手牌当做'+get.translation(card)+'使用'); - next.set('norestore',true); - next.set('addCount',false); - next.set('_backupevent','heqia_backup'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + if (list.length) { + source + .chooseButton(["是否将一张手牌当做一种基本牌使用?", [list, "vcard"]]) + .set("ai", (button) => + _status.event.player.getUseValue( + { name: button.link[2], nature: button.link[3] }, + false + ) + ); + } else event.finish(); + } else event.finish(); + ("step 5"); + if (result.bool) { + var card = { name: result.links[0][2], nature: result.links[0][3] }; + game.broadcastAll(function (card) { + lib.skill.heqia_backup.viewAs = card; + }, card); + var next = source.chooseToUse(); + next.set("openskilldialog", "将一张手牌当做" + get.translation(card) + "使用"); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "heqia_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('heqia_backup'); + next.backup("heqia_backup"); } }, - group:'heqia_add', - subSkill:{ - backup:{ - filterCard:function(card){ - return get.itemtype(card)=='card'; + group: "heqia_add", + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; }, - position:'h', - filterTarget:lib.filter.targetEnabled, - selectCard:1, - check:(card)=>6-get.value(card), - log:false, - precontent:function(){ + position: "h", + filterTarget: lib.filter.targetEnabled, + selectCard: 1, + check: (card) => 6 - get.value(card), + log: false, + precontent: function () { delete event.result.skill; }, }, - add:{ - trigger:{global:'useCard2'}, - charlotte:true, - direct:true, - filter:function(event,player){ - var evt=event.getParent(2); - if(evt.name!='heqia'||evt.player!=player||!event.targets||evt.num<=event.targets.length) return false; - var card=event.card,info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,event.player,current); - })){ + add: { + trigger: { global: "useCard2" }, + charlotte: true, + direct: true, + filter: function (event, player) { + var evt = event.getParent(2); + if ( + evt.name != "heqia" || + evt.player != player || + !event.targets || + evt.num <= event.targets.length + ) + return false; + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, event.player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var num=trigger.getParent(2).num-trigger.targets.length; - var prompt2='是否为'+get.translation(trigger.card)+'增加至多'+get.cnNumber(num)+'个目标?' - trigger.player.chooseTarget(prompt2,[1,num],function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + var num = trigger.getParent(2).num - trigger.targets.length; + var prompt2 = + "是否为" + + get.translation(trigger.card) + + "增加至多" + + get.cnNumber(num) + + "个目标?"; + trigger.player + .chooseTarget(prompt2, [1, num], function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { trigger.player.line(result.targets); - game.log(result.targets,'也成为了',trigger.card,'的目标') + game.log(result.targets, "也成为了", trigger.card, "的目标"); trigger.targets.addArray(result.targets); } }, }, }, }, - yinyi:{ - audio:2, - trigger:{player:'damageBegin1'}, - forced:true, - usable:1, - filter:function(event,player){ - return event.source&&event.source.hp!=player.hp&&!event.hasNature('linked')&&event.source.countCards('h')!=player.countCards('h'); + yinyi: { + audio: 2, + trigger: { player: "damageBegin1" }, + forced: true, + usable: 1, + filter: function (event, player) { + return ( + event.source && + event.source.hp != player.hp && + !event.hasNature("linked") && + event.source.countCards("h") != player.countCards("h") + ); }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')){ - if(player.hp==target.hp||lib.linked.includes(get.nature(card))) return; - var cards=[card]; - if(card.cards&&card.cards.length) cards.addArray(card.cards); - if(ui.selected.cards.length) cards.addArray(ui.selected.cards); - if(player.countCards('h',function(card){ - return !cards.includes(card); - })==target.countCards('h')) return; - return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) { + if (player.hp == target.hp || lib.linked.includes(get.nature(card))) return; + var cards = [card]; + if (card.cards && card.cards.length) cards.addArray(card.cards); + if (ui.selected.cards.length) cards.addArray(ui.selected.cards); + if ( + player.countCards("h", function (card) { + return !cards.includes(card); + }) == target.countCards("h") + ) + return; + return "zeroplayertarget"; } }, }, }, }, //韩猛 - jieliang:{ - trigger:{global:'phaseDrawBegin2'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&!event.numFixed&&event.num>1&&player.countCards('he')>0; + jieliang: { + trigger: { global: "phaseDrawBegin2" }, + direct: true, + filter: function (event, player) { + return ( + event.player != player && + !event.numFixed && + event.num > 1 && + player.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - event.target=trigger.player; - player.chooseToDiscard(get.prompt2('jieliang',event.target),'he').set('goon',get.attitude(player,trigger.player)<-2).set('ai',function(card){ - if(!_status.event.goon) return 0; - return 7-get.value(card); - }).logSkill=['jieliang',event.target]; - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + event.target = trigger.player; + player + .chooseToDiscard(get.prompt2("jieliang", event.target), "he") + .set("goon", get.attitude(player, trigger.player) < -2) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }).logSkill = ["jieliang", event.target]; + ("step 1"); + if (result.bool) { trigger.num--; - if(get.mode()!='identity'||player.identity!='nei') player.addExpose(0.15); - target.addMark('jieliang_less',1,false); - target.addTempSkill('jieliang_less'); - player.addTempSkill('jieliang_gain'); + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.15); + target.addMark("jieliang_less", 1, false); + target.addTempSkill("jieliang_less"); + player.addTempSkill("jieliang_gain"); } }, - subSkill:{ - less:{ - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('jieliang_less'); + subSkill: { + less: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("jieliang_less"); }, }, - onremove:true, - intro:{content:'手牌上限-#'}, + onremove: true, + intro: { content: "手牌上限-#" }, }, - gain:{ - trigger:{global:'loseAfter'}, - charlotte:true, - direct:true, - filter:function(event,player){ - return event.type=='discard'&&event.player==_status.currentPhase&& - event.getParent(3).name=='phaseDiscard'&&event.cards2.filterInD('d').length>0; + gain: { + trigger: { global: "loseAfter" }, + charlotte: true, + direct: true, + filter: function (event, player) { + return ( + event.type == "discard" && + event.player == _status.currentPhase && + event.getParent(3).name == "phaseDiscard" && + event.cards2.filterInD("d").length > 0 + ); }, - content:function(){ - 'step 0' - player.chooseButton(['截粮:是否获得一张牌?',trigger.cards2.filterInD('d')]).set('ai',function(button){ - return get.value(button.link,_status.event.player); - }); - 'step 1' - if(result.bool){ - player.logSkill('jieliang',trigger.player); - player.gain(result.links,'gain2'); + content: function () { + "step 0"; + player + .chooseButton(["截粮:是否获得一张牌?", trigger.cards2.filterInD("d")]) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("jieliang", trigger.player); + player.gain(result.links, "gain2"); } }, }, }, }, - quanjiu:{ - audio:2, - mod:{ - aiOrder:function(player,card,num){ - if((card.name=='jiu'||card.name=='xujiu')&&get.name(card)=='sha') return num+0.5; + quanjiu: { + audio: 2, + mod: { + aiOrder: function (player, card, num) { + if ((card.name == "jiu" || card.name == "xujiu") && get.name(card) == "sha") + return num + 0.5; }, - cardname:function(card,player,name){ - if(card.name=='jiu'||card.name=='xujiu') return 'sha'; + cardname: function (card, player, name) { + if (card.name == "jiu" || card.name == "xujiu") return "sha"; }, }, - trigger:{player:'useCard1'}, - forced:true, - filter:function(event,player){ - return event.addCount!==false&&event.card.isCard&&event.card.name=='sha'&& - event.cards.length==1&&(event.cards[0].name=='jiu'||event.cards[0].name=='xujiu'); + trigger: { player: "useCard1" }, + forced: true, + filter: function (event, player) { + return ( + event.addCount !== false && + event.card.isCard && + event.card.name == "sha" && + event.cards.length == 1 && + (event.cards[0].name == "jiu" || event.cards[0].name == "xujiu") + ); }, - content:function(){ - trigger.addCount=false; + content: function () { + trigger.addCount = false; player.getStat().card.sha--; }, }, //辛评 - fuyuan:{ - audio:2, - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - var target=_status.currentPhase; - return target&&target!=player&&target.isIn(); + fuyuan: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + var target = _status.currentPhase; + return target && target != player && target.isIn(); }, - logTarget:function(event,player){ - var target=_status.currentPhase; - return target.countCards('h')0; + check: function (event, player) { + var target = lib.skill.fuyuan.logTarget(event, player); + return get.attitude(player, target) > 0; }, - prompt:'是否发动【辅袁】?', - prompt2:function(event,player){ - var target=lib.skill.fuyuan.logTarget(event,player); - return '令'+get.translation(target)+(target==player?'(你)':'')+'摸一张牌'; + prompt: "是否发动【辅袁】?", + prompt2: function (event, player) { + var target = lib.skill.fuyuan.logTarget(event, player); + return "令" + get.translation(target) + (target == player ? "(你)" : "") + "摸一张牌"; }, - content:function(){ - lib.skill.fuyuan.logTarget(trigger,player).draw(); + content: function () { + lib.skill.fuyuan.logTarget(trigger, player).draw(); }, }, - zhongjie:{ - trigger:{player:'die'}, - direct:true, - forceDie:true, - skillAnimation:true, - animationColor:'gray', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('zhongjie'),lib.filter.notMe).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ + zhongjie: { + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("zhongjie"), lib.filter.notMe) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { //player.awakenSkill('zhongjie'); - var target=result.targets[0]; - player.logSkill('zhongjie',target); + var target = result.targets[0]; + player.logSkill("zhongjie", target); target.gainMaxHp(); target.recover(); target.draw(); @@ -4273,3870 +5467,4704 @@ game.import('character', function () { }, }, //张宁 - tianze:{ - audio:2, - trigger:{global:'useCardAfter'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&event.player.isIn()&&get.color(event.card)=='black'&&event.player.hasHistory('lose',function(evt){ - return evt&&evt.hs.length&&evt.getParent()==event; - })&&event.player.isPhaseUsing()&&!player.hasSkill('tianze_block'); + tianze: { + audio: 2, + trigger: { global: "useCardAfter" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.isIn() && + get.color(event.card) == "black" && + event.player.hasHistory("lose", function (evt) { + return evt && evt.hs.length && evt.getParent() == event; + }) && + event.player.isPhaseUsing() && + !player.hasSkill("tianze_block") + ); }, - content:function(){ - 'step 0' - player.addTempSkill('tianze_block'); - if(!player.hasCard(function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.color(card,player)=='black'; - },'he')) event.finish(); - else player.chooseToDiscard('he',function(card,player){ - return get.color(card,player)=='black'; - },get.prompt('tianze',trigger.player),'弃置一张黑色牌并对其造成1点伤害').set('ai',function(card){ - if(!_status.event.goon) return 0; - return 8-get.value(card); - }).set('goon',get.damageEffect(trigger.player,player,player)>0).logSkill=['tianze',trigger.player]; - 'step 1' - if(result.bool){ - if(get.mode()!='identity'||player.identity!='nei') player.addExpose(0.2); + content: function () { + "step 0"; + player.addTempSkill("tianze_block"); + if ( + !player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.color(card, player) == "black"; + }, "he") + ) + event.finish(); + else + player + .chooseToDiscard( + "he", + function (card, player) { + return get.color(card, player) == "black"; + }, + get.prompt("tianze", trigger.player), + "弃置一张黑色牌并对其造成1点伤害" + ) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 8 - get.value(card); + }) + .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = [ + "tianze", + trigger.player, + ]; + ("step 1"); + if (result.bool) { + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); trigger.player.damage(); - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); game.delayx(); }, - group:'tianze_draw', - subSkill:{ - block:{charlotte:true}, - draw:{ - trigger:{global:'judgeEnd'}, - forced:true, - locked:false, - filter:function(event,player){ - return event.player!=player&&event.result&&event.result.color=='black'; + group: "tianze_draw", + subSkill: { + block: { charlotte: true }, + draw: { + trigger: { global: "judgeEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player != player && event.result && event.result.color == "black"; }, - content:function(){ + content: function () { player.draw(); }, }, }, }, - difa:{ - trigger:{player:'gainAfter'}, - filter:function(event,player){ - if(player!=_status.currentPhase||event.getParent().name!='draw') return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of event.cards){ - if(hs.includes(i)&&get.color(i,player)=='red'&&lib.filter.cardDiscardable(i,player,'difa')) return true; + difa: { + trigger: { player: "gainAfter" }, + filter: function (event, player) { + if (player != _status.currentPhase || event.getParent().name != "draw") return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of event.cards) { + if ( + hs.includes(i) && + get.color(i, player) == "red" && + lib.filter.cardDiscardable(i, player, "difa") + ) + return true; } return false; }, - usable:1, - check:function(event,player){ - var hs=player.getCards('h'),cards=event.cards.filter(function(i){ - return (hs.includes(i)&&get.color(i,player)=='red'&&lib.filter.cardDiscardable(i,player,'difa')); - }); - var value=get.value(hs,player); - return Array.from(ui.cardPile.childNodes).some(function(card){ - return get.type2(card,false)=='trick'&&get.value(card,player)>value; + usable: 1, + check: function (event, player) { + var hs = player.getCards("h"), + cards = event.cards.filter(function (i) { + return ( + hs.includes(i) && + get.color(i, player) == "red" && + lib.filter.cardDiscardable(i, player, "difa") + ); + }); + var value = get.value(hs, player); + return Array.from(ui.cardPile.childNodes).some(function (card) { + return get.type2(card, false) == "trick" && get.value(card, player) > value; }); }, - content:function(){ - 'step 0' - var hs=player.getCards('h'),cards=trigger.cards.filter(function(i){ - return (hs.includes(i)&&get.color(i,player)=='red'&&lib.filter.cardDiscardable(i,player,'difa')); - }); - if(!cards.length) event.finish(); - else{ - event.cards=cards; + content: function () { + "step 0"; + var hs = player.getCards("h"), + cards = trigger.cards.filter(function (i) { + return ( + hs.includes(i) && + get.color(i, player) == "red" && + lib.filter.cardDiscardable(i, player, "difa") + ); + }); + if (!cards.length) event.finish(); + else { + event.cards = cards; player.discard(cards); } - 'step 1' - var list=lib.inpile.filter(function(i){ - return get.type2(i,false)=='trick'; + ("step 1"); + var list = lib.inpile.filter(function (i) { + return get.type2(i, false) == "trick"; }); - if(!list.length) event.finish(); - else player.chooseButton(['选择获得一种锦囊牌',[list.map((i)=>['锦囊','',i]),'vcard']],true).set('ai',function(button){ - var card={name:button.link[2]}; - if(!_status.event.list.includes(card.name)) return 0; - return _status.event.player.getUseValue(card); - }).set('list',Array.from(ui.cardPile.childNodes).filter(function(card){ - return get.type2(card,false)=='trick'; - }).map(function(card){ - return card.name; - }).reduce(function(list,name){ - if(!list.includes(name)) list.add(name); - return list; - },[])); - 'step 2' - var card=get.cardPile(function(i){ - return i.name==result.links[0][2]&&!event.cards.includes(i); + if (!list.length) event.finish(); + else + player + .chooseButton( + ["选择获得一种锦囊牌", [list.map((i) => ["锦囊", "", i]), "vcard"]], + true + ) + .set("ai", function (button) { + var card = { name: button.link[2] }; + if (!_status.event.list.includes(card.name)) return 0; + return _status.event.player.getUseValue(card); + }) + .set( + "list", + Array.from(ui.cardPile.childNodes) + .filter(function (card) { + return get.type2(card, false) == "trick"; + }) + .map(function (card) { + return card.name; + }) + .reduce(function (list, name) { + if (!list.includes(name)) list.add(name); + return list; + }, []) + ); + ("step 2"); + var card = get.cardPile(function (i) { + return i.name == result.links[0][2] && !event.cards.includes(i); }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); }, }, //童渊 - chaofeng:{ - audio:2, - trigger:{source:'damageBegin1'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0&&player.isPhaseUsing()&&!player.hasSkill('chaofeng2'); + chaofeng: { + audio: 2, + trigger: { source: "damageBegin1" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && player.isPhaseUsing() && !player.hasSkill("chaofeng2") + ); }, - content:function(){ - 'step 0' - var str='弃置一张手牌并摸一张牌',color,type; - if(trigger.card){ - type=get.type2(trigger.card,false); - color=get.color(trigger.card,false); - if(color!='none') str+=';若弃置'+get.translation(color)+'牌则改为摸两张牌'; - if(type) str+=';若弃置类型为'+get.translation(type)+'的牌则伤害+1'; + content: function () { + "step 0"; + var str = "弃置一张手牌并摸一张牌", + color, + type; + if (trigger.card) { + type = get.type2(trigger.card, false); + color = get.color(trigger.card, false); + if (color != "none") str += ";若弃置" + get.translation(color) + "牌则改为摸两张牌"; + if (type) str += ";若弃置类型为" + get.translation(type) + "的牌则伤害+1"; } - var next=player.chooseToDiscard('h',get.prompt('chaofeng',trigger.player),str); - next.set('ai',function(card){ - var player=_status.event.player,att=_status.event.att; - var val=4.2-get.value(card); - if(get.color(card)==_status.event.color) val+=3; - if(get.type2(card)==_status.event.type){ - if(att<0) val+=4; - else if(att===0) val+=2; - else val=0; + var next = player.chooseToDiscard("h", get.prompt("chaofeng", trigger.player), str); + next.set("ai", function (card) { + var player = _status.event.player, + att = _status.event.att; + var val = 4.2 - get.value(card); + if (get.color(card) == _status.event.color) val += 3; + if (get.type2(card) == _status.event.type) { + if (att < 0) val += 4; + else if (att === 0) val += 2; + else val = 0; } return val; }); - next.set('att',get.attitude(player,trigger.player)); - next.logSkill=['chaofeng',trigger.player]; - if(color!='none'){ - event.color=color; - next.set('color',color); + next.set("att", get.attitude(player, trigger.player)); + next.logSkill = ["chaofeng", trigger.player]; + if (color != "none") { + event.color = color; + next.set("color", color); } - if(type){ - event.type=type; - next.set('type',type); + if (type) { + event.type = type; + next.set("type", type); } - 'step 1' - if(result.bool){ - player.addTempSkill('chaofeng2','phaseUseEnd'); - var card=result.cards[0]; - player.draw((event.color&&get.color(card,card.original=='h'?player:false)==event.color)?2:1); - if(event.type&&get.type2(card,card.original=='h'?player:false)==event.type) trigger.num++; + ("step 1"); + if (result.bool) { + player.addTempSkill("chaofeng2", "phaseUseEnd"); + var card = result.cards[0]; + player.draw( + event.color && + get.color(card, card.original == "h" ? player : false) == event.color + ? 2 + : 1 + ); + if ( + event.type && + get.type2(card, card.original == "h" ? player : false) == event.type + ) + trigger.num++; } }, }, - chaofeng2:{}, - chuanshu:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','die']}, - direct:true, - limited:true, - forceDie:true, - filter:function(event,player){ - return player.isDamaged()&&(event.name=='die'||player.isIn()); + chaofeng2: {}, + chuanshu: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "die"] }, + direct: true, + limited: true, + forceDie: true, + filter: function (event, player) { + return player.isDamaged() && (event.name == "die" || player.isIn()); }, - skillAnimation:true, - animationColor:'gray', - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,get.prompt('chuanshu'),'令一名其他角色获得〖朝凤〗').set('ai',function(target){ - return get.attitude(_status.event.player,target) - }).set('forceDie',true); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.awakenSkill('chuanshu'); - player.logSkill('chuanshu',target); - target.addSkills('chaofeng'); - if(player.isDead()) event.finish(); - } - else event.finish(); - 'step 2' + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, get.prompt("chuanshu"), "令一名其他角色获得〖朝凤〗") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("forceDie", true); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.awakenSkill("chuanshu"); + player.logSkill("chuanshu", target); + target.addSkills("chaofeng"); + if (player.isDead()) event.finish(); + } else event.finish(); + ("step 2"); player.addSkills(lib.skill.chuanshu.derivation); }, - derivation:['ollongdan','drlt_congjian','chuanyun'], + derivation: ["ollongdan", "drlt_congjian", "chuanyun"], }, - longdan_tongyuan:{audio:true}, - ocongjian_tongyuan:{audio:true}, - chuanyun:{ - audio:true, - trigger:{player:'useCardToPlayered'}, - shaRelated:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.target.countCards('e')>0; + longdan_tongyuan: { audio: true }, + ocongjian_tongyuan: { audio: true }, + chuanyun: { + audio: true, + trigger: { player: "useCardToPlayered" }, + shaRelated: true, + filter: function (event, player) { + return event.card.name == "sha" && event.target.countCards("e") > 0; }, - logTarget:'target', - content:function(){ - var target=trigger.target;card=target.getCards('e').randomGet(); - if(card) target.discard(card); + logTarget: "target", + content: function () { + var target = trigger.target; + card = target.getCards("e").randomGet(); + if (card) target.discard(card); }, }, //南华老仙 - jinghe:{ - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('jinghe_clear'); + jinghe: { + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("jinghe_clear"); }, - selectCard:function(){ - if(ui.selected.targets.length) return [ui.selected.targets.length,4]; - return [1,4]; + selectCard: function () { + if (ui.selected.targets.length) return [ui.selected.targets.length, 4]; + return [1, 4]; }, - selectTarget:function(){ + selectTarget: function () { return ui.selected.cards.length; }, - filterTarget:true, - filterCard:function(card){ - if(ui.selected.cards.length){ - var name=get.name(card); - for(var i of ui.selected.cards){ - if(get.name(i)==name) return false; + filterTarget: true, + filterCard: function (card) { + if (ui.selected.cards.length) { + var name = get.name(card); + for (var i of ui.selected.cards) { + if (get.name(i) == name) return false; } } return true; }, - check:function(card){ - var player=_status.event.player; - if(game.countPlayer(function(current){ - return get.attitude(player,current)>0; - })>ui.selected.cards.length) return 1; + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (current) { + return get.attitude(player, current) > 0; + }) > ui.selected.cards.length + ) + return 1; return 0; }, - position:'h', - complexCard:true, - discard:false, - lose:false, - delay:false, - multitarget:true, - multiline:true, - content:function(){ - 'step 0' - player.showCards(cards,get.translation(player)+'发动了【经合】'); - event.skills=lib.skill.jinghe.derivation.randomGets(4); - player.addTempSkill('jinghe_clear',{player:'phaseBegin'}); + position: "h", + complexCard: true, + discard: false, + lose: false, + delay: false, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + player.showCards(cards, get.translation(player) + "发动了【经合】"); + event.skills = lib.skill.jinghe.derivation.randomGets(4); + player.addTempSkill("jinghe_clear", { player: "phaseBegin" }); event.targets.sortBySeat(); - event.num=0; - 'step 1' - event.target=targets[num]; + event.num = 0; + ("step 1"); + event.target = targets[num]; event.num++; - event.target.chooseControl(event.skills,'cancel2').set('choiceList',event.skills.map(function(i){ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; - })).set('displayIndex',false).set('prompt','选择获得一个技能'); - 'step 2' - var skill=result.control; - if(skill!='cancel2'){ + event.target + .chooseControl(event.skills, "cancel2") + .set( + "choiceList", + event.skills.map(function (i) { + return ( + '
    【' + + get.translation( + lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set("prompt", "选择获得一个技能"); + ("step 2"); + var skill = result.control; + if (skill != "cancel2") { event.skills.remove(skill); - target.addAdditionalSkills('jinghe_'+player.playerid,skill); + target.addAdditionalSkills("jinghe_" + player.playerid, skill); target.popup(skill); } - if(event.num1?'各':'')+'摸一张牌'); + if (event.list1.length) + choices.push( + "令" + + get.translation(event.list1) + + (event.list1.length > 1 ? "各" : "") + + "摸一张牌" + ); else event.addIndex++; event.list2.sortBySeat(); - if(event.list2.length) choices.push('令'+get.translation(event.list2)+(event.list2.length>1?'各':'')+'弃置一张手牌'); - player.chooseControl('cancel2').set('choiceList',choices).set('prompt',get.prompt('gongxiu')).set('',function(){ - var evt=_status.event.getParent(); - if(evt.list2.filter(function(current){ - return get.attitude(player,current)<=0&&!current.hasSkillTag('noh'); - }).length-evt.list1.length>1) return 1-evt.addIndex; - return 0; - }); - 'step 1' - if(result.control!='cancel2'){ - if(result.index+event.addIndex==0){ - player.logSkill('gongxiu',event.list1); + if (event.list2.length) + choices.push( + "令" + + get.translation(event.list2) + + (event.list2.length > 1 ? "各" : "") + + "弃置一张手牌" + ); + player + .chooseControl("cancel2") + .set("choiceList", choices) + .set("prompt", get.prompt("gongxiu")) + .set("", function () { + var evt = _status.event.getParent(); + if ( + evt.list2.filter(function (current) { + return get.attitude(player, current) <= 0 && !current.hasSkillTag("noh"); + }).length - + evt.list1.length > + 1 + ) + return 1 - evt.addIndex; + return 0; + }); + ("step 1"); + if (result.control != "cancel2") { + if (result.index + event.addIndex == 0) { + player.logSkill("gongxiu", event.list1); game.asyncDraw(event.list1); - } - else{ - player.logSkill('gongxiu',event.list2); - for(var i of event.list2) i.chooseToDiscard('h',true); + } else { + player.logSkill("gongxiu", event.list2); + for (var i of event.list2) i.chooseToDiscard("h", true); event.finish(); } - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); game.delayx(); }, - ai:{ - combo:'jinghe' - } - }, - nhyinbing:{ - trigger:{source:'damageBefore'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'; + ai: { + combo: "jinghe", }, - content:function(){ + }, + nhyinbing: { + trigger: { source: "damageBefore" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; + }, + content: function () { trigger.cancel(); trigger.player.loseHp(trigger.num); }, - group:'nhyinbing_draw', - subSkill:{ - draw:{ - trigger:{global:'loseHpAfter'}, - forced:true, - filter:function(event,player){ - return player!=event.player; + group: "nhyinbing_draw", + subSkill: { + draw: { + trigger: { global: "loseHpAfter" }, + forced: true, + filter: function (event, player) { + return player != event.player; }, - content:function(){ + content: function () { player.draw(); }, }, }, - ai:{ - jueqing:true, - } - }, - nhhuoqi:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0; + ai: { + jueqing: true, }, - position:'he', - filterCard:true, - filterTarget:function(card,player,target){ + }, + nhhuoqi: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { return target.isMinHp(); }, - check:function(card){ - return 7-get.value(card); + check: function (card) { + return 7 - get.value(card); }, - content:function(){ + content: function () { target.recover(); target.draw(); }, - ai:{ - order:1, - tag:{ - draw:1, - recover:1, + ai: { + order: 1, + tag: { + draw: 1, + recover: 1, }, - result:{ - target:function(player,target){ - if(target.isDamaged()) return 3; - if(ui.selected.cards.length) return 0; + result: { + target: function (player, target) { + if (target.isDamaged()) return 3; + if (ui.selected.cards.length) return 0; return 1; }, }, }, }, - nhguizhu:{ - trigger:{global:'dying'}, - usable:1, - logTarget:'player', - frequent:true, - content:function(){ + nhguizhu: { + trigger: { global: "dying" }, + usable: 1, + logTarget: "player", + frequent: true, + content: function () { player.draw(2); }, }, - nhxianshou:{ - enable:'phaseUse', - usable:1, - filterTarget:true, - content:function(){ - target.draw(target.isHealthy()?2:1); + nhxianshou: { + enable: "phaseUse", + usable: 1, + filterTarget: true, + content: function () { + target.draw(target.isHealthy() ? 2 : 1); }, - ai:{ - order:1, - tag:{ - draw:1, + ai: { + order: 1, + tag: { + draw: 1, }, - result:{ - target:function(player,target){ - return target.isHealthy()?2:0.5; + result: { + target: function (player, target) { + return target.isHealthy() ? 2 : 0.5; }, }, }, }, - nhlundao:{ - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.source&&player!=event.source&&player.countCards('h')!=event.source.countCards('h'); + nhlundao: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + event.source && + player != event.source && + player.countCards("h") != event.source.countCards("h") + ); }, - logTarget:'source', - check:function(event,player){ - return (player.countCards('h')0; + logTarget: "source", + check: function (event, player) { + return ( + player.countCards("h") < event.source.countCards("h") || + get.effect(event.source, { name: "guohe_copy2" }, player, player) > 0 + ); }, - content:function(){ - if(player.countCards('h')>trigger.source.countCards('h')) player.draw(); - else player.discardPlayerCard(trigger.source,'he',true); + content: function () { + if (player.countCards("h") > trigger.source.countCards("h")) player.draw(); + else player.discardPlayerCard(trigger.source, "he", true); }, }, - nhguanyue:{ - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - content:function(){ - 'step 0' - var cards=get.cards(2); - player.chooseButton(['观月:选择获得一张牌',cards.slice(0)],true).set('ai',function(button){ - return get.value(button.link,_status.event.player); - }); - while(cards.length){ - ui.cardPile.insertBefore(cards.pop(),ui.cardPile.firstChild); - } - 'step 1' - if(result.bool){ - player.gain(result.links,'gain2'); - } - }, - }, - nhyanzheng:{ - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; - }, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('nhyanzheng')).set('goon',function(){ - var num=player.countCards('h')-1; - return game.countPlayer(function(current){ - return get.damageEffect(current,player,player)>0; - })>=Math.min(3,num) - }()).set('ai',function(card){ - if(_status.event.goon) return Math.max(1,get.value(card)); - return 0; - }); - 'step 1' - if(result.bool){ - player.logSkill('nhyanzheng'); - var cards=player.getCards('h',function(card){ - return card!=result.cards[0]&&lib.filter.cardDiscardable(card,player,'nhyanzheng'); + nhguanyue: { + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + var cards = get.cards(2); + player + .chooseButton(["观月:选择获得一张牌", cards.slice(0)], true) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); }); - if(cards.length){ - player.discard(cards); - event.num=cards.length; - } - else event.finish(); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); } - else event.finish(); - 'step 2' - num=Math.min(num,game.countPlayer()); - player.chooseTarget([1,num],true,'对'+(num>1?'至多':'')+get.cnNumber(num)+'名角色造成1点伤害').set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 3' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.line(targets,'green'); - for(var i of targets) i.damage(); + ("step 1"); + if (result.bool) { + player.gain(result.links, "gain2"); + } + }, + }, + nhyanzheng: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + player + .chooseCard("h", get.prompt("nhyanzheng")) + .set( + "goon", + (function () { + var num = player.countCards("h") - 1; + return ( + game.countPlayer(function (current) { + return get.damageEffect(current, player, player) > 0; + }) >= Math.min(3, num) + ); + })() + ) + .set("ai", function (card) { + if (_status.event.goon) return Math.max(1, get.value(card)); + return 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("nhyanzheng"); + var cards = player.getCards("h", function (card) { + return ( + card != result.cards[0] && + lib.filter.cardDiscardable(card, player, "nhyanzheng") + ); + }); + if (cards.length) { + player.discard(cards); + event.num = cards.length; + } else event.finish(); + } else event.finish(); + ("step 2"); + num = Math.min(num, game.countPlayer()); + player + .chooseTarget( + [1, num], + true, + "对" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "名角色造成1点伤害" + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 3"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets, "green"); + for (var i of targets) i.damage(); } }, }, //樊稠 - xinxingluan:{ - audio:'xinfu_xingluan', - usable:1, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ + xinxingluan: { + audio: "xinfu_xingluan", + usable: 1, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { return player.isPhaseUsing(); }, - async cost(event, trigger, player){ + async cost(event, trigger, player) { const choiceList = [ - '观看牌堆中两张点数为6的牌并获得其中一张', - '令一名其他角色弃置一张点数为6的牌或交给你一张牌', - '获得场上一张点数为6的牌' - ], choices = ['选项一']; - if (game.hasPlayer(current => (current != player && current.countCards('he') > 0))) { - choices.push('选项二'); + "观看牌堆中两张点数为6的牌并获得其中一张", + "令一名其他角色弃置一张点数为6的牌或交给你一张牌", + "获得场上一张点数为6的牌", + ], + choices = ["选项一"]; + if (game.hasPlayer((current) => current != player && current.countCards("he") > 0)) { + choices.push("选项二"); + } else { + choiceList[1] = `${choiceList[1]}`; } - else { - choiceList[1] = `${ choiceList[1] }`; + if ( + game.hasPlayer((current) => { + return current.hasCard(function (card) { + return get.number(card) == 6 && lib.filter.canBeGained(card, current, player); + }, "ej"); + }) + ) { + choices.push("选项三"); + } else { + choiceList[2] = `${choiceList[2]}`; } - if (game.hasPlayer(current => { - return current.hasCard(function(card){ - return get.number(card)==6&&lib.filter.canBeGained(card,current,player); - },'ej'); - })) { - choices.push('选项三'); - } - else { - choiceList[2] = `${ choiceList[2] }`; - } - const result = await player.chooseControl(choices, 'cancel2') - .set('choiceList',choiceList).set('prompt',get.prompt('xinxingluan')) - .set('ai',function(){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - if(current==player) return false; - var att=-get.sgn(get.attitude(player,current)-0.1); - return current.hasCard(function(card){ - return get.number(card)==6&&lib.filter.canBeGained(card,current,player)&&get.sgn(get.useful(card,current))==att; - },'ej'); - })) return '选项三'; - if(game.hasPlayer(function(target){ - if(target==player) return false; - var att=get.attitude(player,target); - return att<0&&target.countCards('he')>0&&!target.hasCard(function(card){ - return get.value(card,target)<=0; - },'he'); - })) return '选项二'; - return '选项一'; - }).forResult(); - if (result.control !== 'cancel2') { - const results = {bool: true, cost_data: {index: choices.indexOf(result.control)}}; - if(results.cost_data.index === 1) { - const {targets} = await player.chooseTarget('令一名其他角色弃置一张点数为6的牌,否则交给你一张牌',true,function(card,player,current){ - return current!=player&¤t.countCards('he')>0; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att>=0) return 0; - if(!target.hasCard(function(card){ - return get.value(card,target)<=0; - },'he')) return -att/Math.sqrt(target.countCards('he')); - return 0; - }).forResult(); + const result = await player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("xinxingluan")) + .set("ai", function () { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + if (current == player) return false; + var att = -get.sgn(get.attitude(player, current) - 0.1); + return current.hasCard(function (card) { + return ( + get.number(card) == 6 && + lib.filter.canBeGained(card, current, player) && + get.sgn(get.useful(card, current)) == att + ); + }, "ej"); + }) + ) + return "选项三"; + if ( + game.hasPlayer(function (target) { + if (target == player) return false; + var att = get.attitude(player, target); + return ( + att < 0 && + target.countCards("he") > 0 && + !target.hasCard(function (card) { + return get.value(card, target) <= 0; + }, "he") + ); + }) + ) + return "选项二"; + return "选项一"; + }) + .forResult(); + if (result.control !== "cancel2") { + const results = { bool: true, cost_data: { index: choices.indexOf(result.control) } }; + if (results.cost_data.index === 1) { + const { targets } = await player + .chooseTarget( + "令一名其他角色弃置一张点数为6的牌,否则交给你一张牌", + true, + function (card, player, current) { + return current != player && current.countCards("he") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + !target.hasCard(function (card) { + return get.value(card, target) <= 0; + }, "he") + ) + return -att / Math.sqrt(target.countCards("he")); + return 0; + }) + .forResult(); results.targets = targets; - } - else if(results.cost_data.index === 2){ - const {targets} = await player.chooseTarget('获得一名角色装备区或判定区内点数为6的牌',true,function(card,player,current){ - return current.hasCard(function(card){ - return get.number(card)==6&&lib.filter.canBeGained(card,current,player); - },'ej'); - }).set('ai',function(target){ - var player=_status.event.player,att=-get.sgn(get.attitude(player,target)-0.1),max=0,ej=target.getCards('ej',function(card){ - return get.number(card)==6&&lib.filter.canBeGained(card,target,player); - }); - for(var i of ej){ - var num=get.useful(i,target)*att; - if(num>max) max=num; - return max; - } - }).forResult(); + } else if (results.cost_data.index === 2) { + const { targets } = await player + .chooseTarget( + "获得一名角色装备区或判定区内点数为6的牌", + true, + function (card, player, current) { + return current.hasCard(function (card) { + return ( + get.number(card) == 6 && + lib.filter.canBeGained(card, current, player) + ); + }, "ej"); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = -get.sgn(get.attitude(player, target) - 0.1), + max = 0, + ej = target.getCards("ej", function (card) { + return ( + get.number(card) == 6 && + lib.filter.canBeGained(card, target, player) + ); + }); + for (var i of ej) { + var num = get.useful(i, target) * att; + if (num > max) max = num; + return max; + } + }) + .forResult(); results.targets = targets; } event.result = results; } }, - content:function(){ - 'step 0' + content: function () { + "step 0"; var result = event.cost_data; - if(result.index === 1) event.goto(4); - else if(result.index === 2) event.goto(3); - 'step 1' - var cards=[]; - while(cards.length<2){ - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&get.number(card)==6; + if (result.index === 1) event.goto(4); + else if (result.index === 2) event.goto(3); + ("step 1"); + var cards = []; + while (cards.length < 2) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.number(card) == 6; }); - if(!card) break; + if (!card) break; cards.push(card); } - if(!cards.length){ + if (!cards.length) { player.draw(6); event.finish(); - } - else if(cards.length==1){ - event._result={bool:true,links:cards}; - } - else player.chooseButton(['兴乱:选择获得其中一张',cards],true).set('ai',function(button){ - return get.value(button.link,_status.event.player); - }); - 'step 2' - if(result.bool){ - player.gain(result.links,'gain2'); + } else if (cards.length == 1) { + event._result = { bool: true, links: cards }; + } else + player + .chooseButton(["兴乱:选择获得其中一张", cards], true) + .set("ai", function (button) { + return get.value(button.link, _status.event.player); + }); + ("step 2"); + if (result.bool) { + player.gain(result.links, "gain2"); } event.finish(); - 'step 3' - var target=targets[0]; - player.gainPlayerCard(target,'ej',true).set('filterButton',function(button){ - return get.number(button.link)==6; + ("step 3"); + var target = targets[0]; + player.gainPlayerCard(target, "ej", true).set("filterButton", function (button) { + return get.number(button.link) == 6; }); event.finish(); - 'step 4' - var target=targets[0]; - event.target=target; - target.chooseToDiscard('he','弃置一张点数为6的牌,否则交给'+get.translation(player)+'一张牌',function(card){ - return get.number(card)==6; - }).ai=(card)=>(8-get.value(card)); - 'step 5' - if(!result.bool){ - target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); - } - else event.finish(); - 'step 6' - if(result.bool) target.give(result.cards,player,'giveAuto'); + ("step 4"); + var target = targets[0]; + event.target = target; + target.chooseToDiscard( + "he", + "弃置一张点数为6的牌,否则交给" + get.translation(player) + "一张牌", + function (card) { + return get.number(card) == 6; + } + ).ai = (card) => 8 - get.value(card); + ("step 5"); + if (!result.bool) { + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); + } else event.finish(); + ("step 6"); + if (result.bool) target.give(result.cards, player, "giveAuto"); }, }, - rexingluan:{ - audio:'xinfu_xingluan', - usable:1, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.targets&&event.targets.length==1&&typeof get.number(event.card,false)=='number'&&player.isPhaseUsing(); + rexingluan: { + audio: "xinfu_xingluan", + usable: 1, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + event.targets && + event.targets.length == 1 && + typeof get.number(event.card, false) == "number" && + player.isPhaseUsing() + ); }, - direct:true, - content:function(){ - 'step 0' - var str='',num=get.number(trigger.card,false),nums=get.strNumber(num); - var list=game.filterPlayer(function(current){ - return current.hasCard(function(card){ - return get.number(card)==num&&lib.filter.canBeGained(card,current,player); - },'ej'); + direct: true, + content: function () { + "step 0"; + var str = "", + num = get.number(trigger.card, false), + nums = get.strNumber(num); + var list = game.filterPlayer(function (current) { + return current.hasCard(function (card) { + return get.number(card) == num && lib.filter.canBeGained(card, current, player); + }, "ej"); }); - if(list.length){ - str+='获得一名角色装备区或判定区内的一张点数为'+nums+'的牌,或直接从牌堆中获得一张点数为'+nums+'的牌'; - player.chooseTarget(get.prompt('rexingluan'),str,[0,1],function(card,player,target){ - return _status.event.targets.includes(target); - }).set('targets',list).set('ai',function(target){ - if(!target) return 1; - var player=_status.event.player,num=get.number(_status.event.getTrigger().card,false),att=-get.sgn(get.attitude(player,target)); - if(target.hasCard(function(card){ - return get.number(card)==num&&get.effect(target,card,target,player)<0; - },'j')) return 1.2*Math.abs(get.attitude(player,target)); - if(target.hasCard(function(card){ - return get.number(card)==num&&get.sgn(get.value(card,target)+0.1)==att; - },'e')) return Math.abs(get.attitude(player,target)); - return 0; - }); - } - else{ - player.chooseBool(get.prompt('rexingluan'),'从牌堆中获得一张点数为'+nums+'的牌').ai=()=>true; - } - 'step 1' - if(result.bool){ - if(result.targets&&result.targets.length){ - var target=result.targets[0]; - player.logSkill('rexingluan',target); - player.gainPlayerCard(target,'ej',true).set('num',get.number(trigger.card,false)).set('filterButton',function(button){ - return get.number(button.link)==_status.event.num; + if (list.length) { + str += + "获得一名角色装备区或判定区内的一张点数为" + + nums + + "的牌,或直接从牌堆中获得一张点数为" + + nums + + "的牌"; + player + .chooseTarget( + get.prompt("rexingluan"), + str, + [0, 1], + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("targets", list) + .set("ai", function (target) { + if (!target) return 1; + var player = _status.event.player, + num = get.number(_status.event.getTrigger().card, false), + att = -get.sgn(get.attitude(player, target)); + if ( + target.hasCard(function (card) { + return ( + get.number(card) == num && + get.effect(target, card, target, player) < 0 + ); + }, "j") + ) + return 1.2 * Math.abs(get.attitude(player, target)); + if ( + target.hasCard(function (card) { + return ( + get.number(card) == num && + get.sgn(get.value(card, target) + 0.1) == att + ); + }, "e") + ) + return Math.abs(get.attitude(player, target)); + return 0; }); - } - else{ - player.logSkill('rexingluan'); - var num=get.number(trigger.card,false),card=get.cardPile2(function(i){ - return get.number(i,false)==num; - }); - if(card) player.gain(card,'gain2'); + } else { + player.chooseBool( + get.prompt("rexingluan"), + "从牌堆中获得一张点数为" + nums + "的牌" + ).ai = () => true; + } + ("step 1"); + if (result.bool) { + if (result.targets && result.targets.length) { + var target = result.targets[0]; + player.logSkill("rexingluan", target); + player + .gainPlayerCard(target, "ej", true) + .set("num", get.number(trigger.card, false)) + .set("filterButton", function (button) { + return get.number(button.link) == _status.event.num; + }); + } else { + player.logSkill("rexingluan"); + var num = get.number(trigger.card, false), + card = get.cardPile2(function (i) { + return get.number(i, false) == num; + }); + if (card) player.gain(card, "gain2"); } } }, }, //杜夫人 - yise:{ - audio:2, - trigger:{ - global:'gainAfter', - player:'loseAsyncAfter', + yise: { + audio: 2, + trigger: { + global: "gainAfter", + player: "loseAsyncAfter", }, - filter:function(event,player){ - if(event.name=='loseAsync'){ - if(event.type!='gain') return false; + filter: function (event, player) { + if (event.name == "loseAsync") { + if (event.type != "gain") return false; } - var cards=event.getl(player).cards2; - return game.hasPlayer(function(current){ - if(current==player) return false; - var cardsx=event.getg(current); - for(var i of cardsx){ - if(cards.includes(i)){ - if(current.isDamaged()) return true; - return get.color(i,player)=='black'; + var cards = event.getl(player).cards2; + return game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) { + if (current.isDamaged()) return true; + return get.color(i, player) == "black"; } } return false; }); }, - direct:true, - content:function(){ - 'step 0' - var cards=trigger.getl(player).cards2; - event.cards=cards; - event.targets=game.filterPlayer(function(current){ - if(current==player) return false; - var cardsx=trigger.getg(current); - for(var i of cardsx){ - if(cards.includes(i)) return true; - } - return false; - }).sortBySeat(); - if(!event.targets.length) event.finish(); - 'step 1' - var target=targets.shift(); - var cardsx=trigger.getg(target); - var goon=false; - for(var i of cardsx){ - if(cards.includes(i)){ - if(target.isDamaged()||get.color(i,player)=='black'){goon=true;break;} + direct: true, + content: function () { + "step 0"; + var cards = trigger.getl(player).cards2; + event.cards = cards; + event.targets = game + .filterPlayer(function (current) { + if (current == player) return false; + var cardsx = trigger.getg(current); + for (var i of cardsx) { + if (cards.includes(i)) return true; + } + return false; + }) + .sortBySeat(); + if (!event.targets.length) event.finish(); + ("step 1"); + var target = targets.shift(); + var cardsx = trigger.getg(target); + var goon = false; + for (var i of cardsx) { + if (cards.includes(i)) { + if (target.isDamaged() || get.color(i, player) == "black") { + goon = true; + break; + } } } - if(goon){ - var next=game.createEvent('yise_insert'); - next.player=player; - next.target=target; - next.cards=cardsx; + if (goon) { + var next = game.createEvent("yise_insert"); + next.player = player; + next.target = target; + next.cards = cardsx; next.setContent(lib.skill.yise.contentx); } - if(targets.length>0) event.redo(); + if (targets.length > 0) event.redo(); }, - contentx:function(){ - 'step 0' - for(var i of cards){ - event[get.color(i,player)]=true; - if(event.red&&event.black) break; + contentx: function () { + "step 0"; + for (var i of cards) { + event[get.color(i, player)] = true; + if (event.red && event.black) break; } - if(event.red&&target.isDamaged()){ - player.chooseBool( - get.prompt('yise',target), - '令'+get.translation(target)+'回复1点体力' - ).set('ai',()=>get.recoverEffect(_status.event.getParent().target,_status.event.player,_status.event.player)>0); + if (event.red && target.isDamaged()) { + player + .chooseBool( + get.prompt("yise", target), + "令" + get.translation(target) + "回复1点体力" + ) + .set( + "ai", + () => + get.recoverEffect( + _status.event.getParent().target, + _status.event.player, + _status.event.player + ) > 0 + ); } - 'step 1' - if(event.black||event.red&&result.bool) player.logSkill('yise',target); - if(event.red&&result.bool) target.recover(); - if(event.black){ - target.addMark('yise_damage',1,false); - target.addSkill('yise_damage'); + ("step 1"); + if (event.black || (event.red && result.bool)) player.logSkill("yise", target); + if (event.red && result.bool) target.recover(); + if (event.black) { + target.addMark("yise_damage", 1, false); + target.addSkill("yise_damage"); } }, - subSkill:{ - damage:{ - trigger:{player:'damageBegin1'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.getParent().name=='sha'; + subSkill: { + damage: { + trigger: { player: "damageBegin1" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && event.getParent().name == "sha"; }, - content:function(){ - trigger.num+=player.countMark('yise_damage'); - player.removeSkill('yise_damage'); + content: function () { + trigger.num += player.countMark("yise_damage"); + player.removeSkill("yise_damage"); }, - intro:{ - content:'下一次受到杀的伤害+#', + intro: { + content: "下一次受到杀的伤害+#", }, }, }, }, - shunshi:{ - trigger:{player:['damageEnd','phaseZhunbeiBegin']}, - direct:true, - filter:function(event,player){ - return (event.name!='damage'||player!=_status.currentPhase)&&player.countCards('he')>0&&game.hasPlayer(function(current){ - return current!=player&¤t!=event.source; - }); + shunshi: { + trigger: { player: ["damageEnd", "phaseZhunbeiBegin"] }, + direct: true, + filter: function (event, player) { + return ( + (event.name != "damage" || player != _status.currentPhase) && + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current != event.source; + }) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('shunshi'), - prompt2:'将一张牌交给一名其他角色,并获得+1效果', - filterCard:true, - filterTarget:function(card,player,target){ - return target!=player&&target!=_status.event.source; + prompt: get.prompt("shunshi"), + prompt2: "将一张牌交给一名其他角色,并获得+1效果", + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && target != _status.event.source; }, - position:'he', - source:trigger.source, - ai1:function(card){ - var player=_status.event.player; - if(player.hasSkill('yise')){ - if(get.color(card,player)=='red'&&game.hasPlayer(function(current){ - return current!=player&¤t!=_status.event.source&¤t.isDamaged()&&get.recoverEffect(current,player,player)>0; - })) return 10-get.value(card); - if(get.color(card,player)=='black') return 4-get.value(card); + position: "he", + source: trigger.source, + ai1: function (card) { + var player = _status.event.player; + if (player.hasSkill("yise")) { + if ( + get.color(card, player) == "red" && + game.hasPlayer(function (current) { + return ( + current != player && + current != _status.event.source && + current.isDamaged() && + get.recoverEffect(current, player, player) > 0 + ); + }) + ) + return 10 - get.value(card); + if (get.color(card, player) == "black") return 4 - get.value(card); } - return 8-get.value(card); + return 8 - get.value(card); }, - ai2:function(target){ - var player=_status.event.player,card=ui.selected.cards[0]; - if(player.hasSkill('yise')){ - if(get.color(card)=='red'&&target.isDamaged()) return 2*get.recoverEffect(target,player,player); - if(get.color(card)=='black') return -get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player, + card = ui.selected.cards[0]; + if (player.hasSkill("yise")) { + if (get.color(card) == "red" && target.isDamaged()) + return 2 * get.recoverEffect(target, player, player); + if (get.color(card) == "black") return -get.attitude(player, target); } - if(get.value(card,target)<0) return -get.attitude(player,target); - if(get.value(card,target)<1) return 0.01*-get.attitude(player,target); - return Math.max(1,get.value(card,target)-get.value(card,player))*get.attitude(player,target); + if (get.value(card, target) < 0) return -get.attitude(player, target); + if (get.value(card, target) < 1) return 0.01 * -get.attitude(player, target); + return ( + Math.max(1, get.value(card, target) - get.value(card, player)) * + get.attitude(player, target) + ); }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('shunshi',target); - player.give(result.cards,target); - player.addMark('shunshi_mark',1,false); - player.addTempSkill('shunshi_mark',{player:'phaseEnd'}); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("shunshi", target); + player.give(result.cards, target); + player.addMark("shunshi_mark", 1, false); + player.addTempSkill("shunshi_mark", { player: "phaseEnd" }); } }, - subSkill:{ - mark:{ - onremove:true, - trigger:{player:'phaseDrawBegin2'}, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player){ + subSkill: { + mark: { + onremove: true, + trigger: { player: "phaseDrawBegin2" }, + forced: true, + charlotte: true, + popup: false, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=player.countMark('shunshi_mark'); + content: function () { + trigger.num += player.countMark("shunshi_mark"); }, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('shunshi_mark'); + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("shunshi_mark"); }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('shunshi_mark'); + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("shunshi_mark"); }, }, - intro:{ - content:'拥有#层效果', + intro: { + content: "拥有#层效果", }, }, }, }, - xianwei:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ + xianwei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { return player.hasEnabledSlot(); }, - content:function(){ - 'step 0' - player.chooseToDisable().ai=function(event,player,list){ - var getVal=function(num){ - var card=player.getEquip(num); - if(card){ - var val=get.value(card); - if(val>0) return 0; - return 5-val; + content: function () { + "step 0"; + player.chooseToDisable().ai = function (event, player, list) { + var getVal = function (num) { + var card = player.getEquip(num); + if (card) { + var val = get.value(card); + if (val > 0) return 0; + return 5 - val; } - switch(num){ - case 'equip3':return 4.5; - case 'equip4':return 4.4; - case 'equip5':return 4.3; - case 'equip2':return (3-player.hp)*1.5; - case 'equip1':{ - if(game.hasPlayer(function(current){ - return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1; - })) return 0; + switch (num) { + case "equip3": + return 4.5; + case "equip4": + return 4.4; + case "equip5": + return 4.3; + case "equip2": + return (3 - player.hp) * 1.5; + case "equip1": { + if ( + game.hasPlayer(function (current) { + return ( + (get.realAttitude || get.attitude)(player, current) < 0 && + get.distance(player, current) > 1 + ); + }) + ) + return 0; return 3.2; } } - } - list.sort(function(a,b){ - return getVal(b)-getVal(a); + }; + list.sort(function (a, b) { + return getVal(b) - getVal(a); }); return list[0]; }; - 'step 1' - var cardType=result.control; - event.cardType=cardType; - var num=player.countDisabledSlot(); - if(num<5) player.draw(5-num); - player.chooseTarget(lib.filter.notMe,'是否令一名其他角色从牌堆中使用一张'+get.translation(cardType)+'牌?').set('ai',function(target){ - var player=_status.event.player,type=_status.event.cardType; - var card=get.cardPile2(function(card){ - return get.subtype(card)==type&&target.canUse(card,target); - }); - if(!card) return 0; - return get.effect(target,card,target,player); - }).set('cardType',event.cardType); - 'step 2' - if(!result.bool) return; - var target=result.targets[0]; - player.line(target,'green'); - var card=get.cardPile2(function(card){ - return get.subtype(card)==event.cardType&&target.canUse(card,target); + ("step 1"); + var cardType = result.control; + event.cardType = cardType; + var num = player.countDisabledSlot(); + if (num < 5) player.draw(5 - num); + player + .chooseTarget( + lib.filter.notMe, + "是否令一名其他角色从牌堆中使用一张" + get.translation(cardType) + "牌?" + ) + .set("ai", function (target) { + var player = _status.event.player, + type = _status.event.cardType; + var card = get.cardPile2(function (card) { + return get.subtype(card) == type && target.canUse(card, target); + }); + if (!card) return 0; + return get.effect(target, card, target, player); + }) + .set("cardType", event.cardType); + ("step 2"); + if (!result.bool) return; + var target = result.targets[0]; + player.line(target, "green"); + var card = get.cardPile2(function (card) { + return get.subtype(card) == event.cardType && target.canUse(card, target); }); - if(card) target.chooseUseTarget(card,'nopopup',true); + if (card) target.chooseUseTarget(card, "nopopup", true); else target.draw(); }, - group:'xianwei_all', - subSkill:{ - all:{ - trigger:{player:'disableEquipAfter'}, - forced:true, - filter:function(event,player){ + group: "xianwei_all", + subSkill: { + all: { + trigger: { player: "disableEquipAfter" }, + forced: true, + filter: function (event, player) { return !player.hasEnabledSlot(); }, - content:function(){ + content: function () { player.gainMaxHp(2); - player.addSkill('xianwei_effect'); + player.addSkill("xianwei_effect"); }, }, - effect:{ - charlotte:true, - mark:true, - intro:{content:'和其他角色视为在彼此的攻击范围内'}, - mod:{ - inRange:()=>true, - inRangeOf:()=>true, + effect: { + charlotte: true, + mark: true, + intro: { content: "和其他角色视为在彼此的攻击范围内" }, + mod: { + inRange: () => true, + inRangeOf: () => true, }, }, }, }, - rehuoshui:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - var num=Math.min(game.countPlayer()-1,Math.max(1,player.getDamagedHp())); + rehuoshui: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + var num = Math.min(game.countPlayer() - 1, Math.max(1, player.getDamagedHp())); var str; - if(num>1){ - str='选择至多'+get.cnNumber(num)+'名其他角色。'; - var list=['第一名角色的非锁定技失效直到回合结束',';第二名角色交给你一张手牌',';第三名及之后角色弃置装备区内的所有牌']; - for(var i=0;i 1) { + str = "选择至多" + get.cnNumber(num) + "名其他角色。"; + var list = [ + "第一名角色的非锁定技失效直到回合结束", + ";第二名角色交给你一张手牌", + ";第三名及之后角色弃置装备区内的所有牌", + ]; + for (var i = 0; i < Math.min(3, num); i++) { + str += list[i]; } - str+='。'; + str += "。"; + } else str = "令一名其他角色的非锁定技本回合内失效"; + player + .chooseTarget([1, num], get.prompt("rehuoshui"), str, lib.filter.notMe) + .set("ai", function (target) { + var att = -get.attitude(_status.event.player, target); + if (att <= 0) return 0; + if ( + target.hasSkillTag("maixie") || + target.hasSkill("maixie_hp") || + target.hasSkill("maixie_defed") + ) + att *= 3; + return att / get.threaten(target); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; + player.logSkill("rehuoshui", targets); + event.targets = targets; + targets[0].addTempSkill("fengyin"); + if (targets.length < 2) event.goto(5); + } else event.finish(); + ("step 2"); + if (targets[1].countCards("h") == 0) event.goto(targets.length > 2 ? 4 : 5); + else targets[1].chooseCard("h", true, "交给" + get.translation(player) + "一张手牌"); + ("step 3"); + if (result.bool) { + targets[1].give(result.cards, player); } - else str='令一名其他角色的非锁定技本回合内失效'; - player.chooseTarget([1,num],get.prompt('rehuoshui'),str,lib.filter.notMe).set('ai',function(target){ - var att=-get.attitude(_status.event.player,target); - if(att<=0) return 0; - if(target.hasSkillTag('maixie')||target.hasSkill('maixie_hp')||target.hasSkill('maixie_defed')) att*=3; - return att/get.threaten(target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets; - player.logSkill('rehuoshui',targets); - event.targets=targets; - targets[0].addTempSkill('fengyin'); - if(targets.length<2) event.goto(5); - } - else event.finish(); - 'step 2' - if(targets[1].countCards('h')==0) event.goto(targets.length>2?4:5); - else targets[1].chooseCard('h',true,'交给'+get.translation(player)+'一张手牌'); - 'step 3' - if(result.bool){ - targets[1].give(result.cards,player); - } - if(targets.length<3) event.goto(5); - 'step 4' - var num=targets[2].countCards('e'); - if(num>0) targets[2].chooseToDiscard('e',true,num); - 'step 5' + if (targets.length < 3) event.goto(5); + ("step 4"); + var num = targets[2].countCards("e"); + if (num > 0) targets[2].chooseToDiscard("e", true, num); + ("step 5"); game.delayx(); }, }, - reqingcheng:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer((current)=>lib.skill.reqingcheng.filterTarget(null,player,current)); + reqingcheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => + lib.skill.reqingcheng.filterTarget(null, player, current) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.hasSex('male')&&target.countCards('h')<=player.countCards('h'); + filterTarget: function (card, player, target) { + return ( + target != player && + target.hasSex("male") && + target.countCards("h") <= player.countCards("h") + ); }, - content:function(){ + content: function () { player.swapHandcards(target); }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(target.countCards('h')>0) return -Math.max(get.value(target.getCards('h'),player)-get.value(player.getCards('h'),player),0); + ai: { + order: 1, + result: { + player: function (player, target) { + if (target.countCards("h") > 0) + return -Math.max( + get.value(target.getCards("h"), player) - + get.value(player.getCards("h"), player), + 0 + ); return 0; }, }, }, }, //丘力居 - koulve:{ - audio:2, - trigger:{source:'damageSource'}, - logTarget:'player', - filter:function(event,player){ - return event.player.isDamaged()&&event.player.countCards('h')>0&&player.isPhaseUsing(); + koulve: { + audio: 2, + trigger: { source: "damageSource" }, + logTarget: "player", + filter: function (event, player) { + return ( + event.player.isDamaged() && event.player.countCards("h") > 0 && player.isPhaseUsing() + ); }, - check:function(event,player){ - if(player.hp==1&&player.isHealthy()) return false; - return get.attitude(player,event.player)<=0; + check: function (event, player) { + if (player.hp == 1 && player.isHealthy()) return false; + return get.attitude(player, event.player) <= 0; }, - content:function(){ - 'step 0' - player.choosePlayerCard(trigger.player,'h',true,trigger.player.getDamagedHp()); - 'step 1' - var card=result.cards; - event.cards=card; - player.showCards(card,get.translation(player)+'发动了【宼略】'); - 'step 2' - var gains=[],red=false; - var target=trigger.player; - for(var card of cards){ - var type=get.type2(card,target); - if((type=='basic'||type=='trick')&&get.tag(card,'damage')>0) gains.push(card); - if(!red&&get.color(card,target)=='red') red=true; + content: function () { + "step 0"; + player.choosePlayerCard(trigger.player, "h", true, trigger.player.getDamagedHp()); + ("step 1"); + var card = result.cards; + event.cards = card; + player.showCards(card, get.translation(player) + "发动了【宼略】"); + ("step 2"); + var gains = [], + red = false; + var target = trigger.player; + for (var card of cards) { + var type = get.type2(card, target); + if ((type == "basic" || type == "trick") && get.tag(card, "damage") > 0) + gains.push(card); + if (!red && get.color(card, target) == "red") red = true; } - if(gains.length) player.gain(gains,'gain2'); - if(!red) event.finish(); - 'step 3' - player[player.isDamaged()?'loseMaxHp':'loseHp'](); + if (gains.length) player.gain(gains, "gain2"); + if (!red) event.finish(); + ("step 3"); + player[player.isDamaged() ? "loseMaxHp" : "loseHp"](); player.draw(2); }, }, - qljsuiren:{ - audio:2, - trigger:{player:'die'}, - direct:true, - forceDie:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return player.countCards('h',function(card){ - var type=get.type(card,player); - return (type=='basic'||type=='trick')&&get.tag(card,'damage')>0; + qljsuiren: { + audio: 2, + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return player.countCards("h", function (card) { + var type = get.type(card, player); + return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; }); }, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,get.prompt('qljsuiren'),'将所有伤害性基本牌和锦囊牌交给一名其他角色').set('forceDie',true).set('ai',function(target){ - var player=_status.event.player,cards=_status.event.aiCards; - var att=get.attitude(player,target); - if(att<=0) return 0; - if(target.hasSkillTag('nogain')) att/=100; - var num=0.1; - for(var i of cards) num+=Math.max(0,target.getUseValue(card)); - return num*att; - }).set('aiCards',player.getCards('h',function(card){ - var type=get.type(card,player); - return (type=='basic'||type=='trick')&&get.tag(card,'damage')>0; - })); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('qljsuiren',target); - player.give(player.getCards('h',function(card){ - var type=get.type(card,player); - return (type=='basic'||type=='trick')&&get.tag(card,'damage')>0; - }),target,'give'); + content: function () { + "step 0"; + player + .chooseTarget( + lib.filter.notMe, + get.prompt("qljsuiren"), + "将所有伤害性基本牌和锦囊牌交给一名其他角色" + ) + .set("forceDie", true) + .set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.aiCards; + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.hasSkillTag("nogain")) att /= 100; + var num = 0.1; + for (var i of cards) num += Math.max(0, target.getUseValue(card)); + return num * att; + }) + .set( + "aiCards", + player.getCards("h", function (card) { + var type = get.type(card, player); + return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; + }) + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qljsuiren", target); + player.give( + player.getCards("h", function (card) { + var type = get.type(card, player); + return (type == "basic" || type == "trick") && get.tag(card, "damage") > 0; + }), + target, + "give" + ); } }, }, //胡车儿 - redaoji:{ - audio:2, - trigger:{global:'useCard'}, - direct:true, - filter:function(event,player){ - if(player==event.player||get.subtype(event.card,false)!='equip1'||(event.player.isDead()&&!event.cards.filterInD().length)) return false; - var all=event.player.getAllHistory('useCard'); - for(var i of all){ - if(get.subtype(i.card,false)=='equip1') return i==event; + redaoji: { + audio: 2, + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + if ( + player == event.player || + get.subtype(event.card, false) != "equip1" || + (event.player.isDead() && !event.cards.filterInD().length) + ) + return false; + var all = event.player.getAllHistory("useCard"); + for (var i of all) { + if (get.subtype(i.card, false) == "equip1") return i == event; } return false; }, - content:function(){ - 'step 0' - var list=[]; - event.addIndex=0; - if(trigger.cards.filterInD().length>0) list.push('获得'+get.translation(trigger.cards.filterInD())); + content: function () { + "step 0"; + var list = []; + event.addIndex = 0; + if (trigger.cards.filterInD().length > 0) + list.push("获得" + get.translation(trigger.cards.filterInD())); else event.addIndex++; - if(trigger.player.isIn()) list.push('令'+get.translation(trigger.player)+'本回合不能使用或打出【杀】'); - player.chooseControl('cancel2').set('choiceList',list).set('prompt',get.prompt('redaoji',trigger.player)).set('ai',function(){ - var evt=_status.event.getParent(),player=evt.player,evt2=evt._trigger; - if(evt.addIndex==0){ - var noob=get.attitude(player,evt2.player)<0?1:'cancel2'; - if(player.countMark('fuzhong')==3) return noob; - if(get.effect(evt2.targets[0],evt2.card,evt2.player,player)<=0) return 0; - return noob; - } - return get.attitude(player,evt2.player)<0?0:'cancel2'; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('redaoji',trigger.player); + if (trigger.player.isIn()) + list.push("令" + get.translation(trigger.player) + "本回合不能使用或打出【杀】"); + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("redaoji", trigger.player)) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.player, + evt2 = evt._trigger; + if (evt.addIndex == 0) { + var noob = get.attitude(player, evt2.player) < 0 ? 1 : "cancel2"; + if (player.countMark("fuzhong") == 3) return noob; + if (get.effect(evt2.targets[0], evt2.card, evt2.player, player) <= 0) + return 0; + return noob; + } + return get.attitude(player, evt2.player) < 0 ? 0 : "cancel2"; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("redaoji", trigger.player); game.delayx(); - if(result.index+event.addIndex==0){ - player.gain(trigger.cards.filterInD(),'gain2'); - } - else trigger.player.addTempSkill('redaoji2'); + if (result.index + event.addIndex == 0) { + player.gain(trigger.cards.filterInD(), "gain2"); + } else trigger.player.addTempSkill("redaoji2"); } }, }, - redaoji2:{ - charlotte:true, - mark:true, - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + redaoji2: { + charlotte: true, + mark: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, - cardRespondable:function(card){ - if(card.name=='sha') return false; + cardRespondable: function (card) { + if (card.name == "sha") return false; }, }, - intro:{ - content:'本回合不能使用或打出杀', + intro: { + content: "本回合不能使用或打出杀", }, }, - fuzhong:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player.countMark('fuzhong')>3; + fuzhong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("fuzhong") > 3; }, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,'对一名其他角色造成1点伤害',true).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; + content: function () { + "step 0"; + player + .chooseTarget(lib.filter.notMe, "对一名其他角色造成1点伤害", true) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - target.damage('nocard'); + target.damage("nocard"); } - player.removeMark('fuzhong',4); + player.removeMark("fuzhong", 4); }, - marktext:'重', - intro:{content:'mark'}, - group:['fuzhong_gain','fuzhong_yingzi'], - mod:{ - maxHandcard:function(player,num){ - if(player.countMark('fuzhong')>2) return num+3; + marktext: "重", + intro: { content: "mark" }, + group: ["fuzhong_gain", "fuzhong_yingzi"], + mod: { + maxHandcard: function (player, num) { + if (player.countMark("fuzhong") > 2) return num + 3; + }, + globalFrom: function (player, target, num) { + if (player.countMark("fuzhong") > 1) return num - 2; }, - globalFrom:function(player,target,num){ - if(player.countMark('fuzhong')>1) return num-2; - } }, - subSkill:{ - gain:{ - audio:'fuzhong', - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + subSkill: { + gain: { + audio: "fuzhong", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - forced:true, - filter:function(event,player){ - return player!=_status.currentPhase&&event.getg(player).length>0; + forced: true, + filter: function (event, player) { + return player != _status.currentPhase && event.getg(player).length > 0; }, - content:function(){ - player.addMark('fuzhong',1); + content: function () { + player.addMark("fuzhong", 1); }, }, - yingzi:{ - audio:'fuzhong', - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:function(event,player){ - return !event.numFixed&&player.countMark('fuzhong')>0; + yingzi: { + audio: "fuzhong", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + return !event.numFixed && player.countMark("fuzhong") > 0; }, - content:function(){ + content: function () { trigger.num++; }, }, }, }, //董承 - xuezhao:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.maxHp>0&&player.countCards('h')>0; + xuezhao: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.maxHp > 0 && player.countCards("h") > 0; }, - filterCard:true, - position:'h', - filterTarget:lib.filter.notMe, - selectTarget:function(){ - return [1,_status.event.player.maxHp]; + filterCard: true, + position: "h", + filterTarget: lib.filter.notMe, + selectTarget: function () { + return [1, _status.event.player.maxHp]; }, - check:function(card){ - return 2*(_status.event.player.maxHp+2)-get.value(card); + check: function (card) { + return 2 * (_status.event.player.maxHp + 2) - get.value(card); }, - content:function(){ - 'step 0' - if(!target.countCards('he')) event._result={bool:false}; - else target.chooseCard('he','交给'+get.translation(player)+'一张牌并摸一张牌,或不能响应其使用的牌直到回合结束').set('ai',function(card){ - var player=_status.event.player,target=_status.event.getParent().player,val=get.value(card); - if(get.attitude(player,target)>0){ - if(get.name(card,target)=='sha'&&target.hasValueTarget(card)) return 30-val; - return 20-val; - } - return -val; - }); - 'step 1' - if(result.bool){ - player.addTempSkill('xuezhao_sha'); - player.addMark('xuezhao_sha',1,false); - target.give(result.cards,player); + content: function () { + "step 0"; + if (!target.countCards("he")) event._result = { bool: false }; + else + target + .chooseCard( + "he", + "交给" + + get.translation(player) + + "一张牌并摸一张牌,或不能响应其使用的牌直到回合结束" + ) + .set("ai", function (card) { + var player = _status.event.player, + target = _status.event.getParent().player, + val = get.value(card); + if (get.attitude(player, target) > 0) { + if (get.name(card, target) == "sha" && target.hasValueTarget(card)) + return 30 - val; + return 20 - val; + } + return -val; + }); + ("step 1"); + if (result.bool) { + player.addTempSkill("xuezhao_sha"); + player.addMark("xuezhao_sha", 1, false); + target.give(result.cards, player); target.draw(); - } - else{ - player.addTempSkill('xuezhao_hit'); - player.markAuto('xuezhao_hit',[target]); + } else { + player.addTempSkill("xuezhao_hit"); + player.markAuto("xuezhao_hit", [target]); } }, - ai:{ - threaten:2.4, - order:3.6, - result:{ - player:function(player,target){ - if(get.attitude(target,player)>0){ - if(target.countCards('e',function(card){ - return get.value(card,target)<0; - })) return 3; - return Math.sqrt(target.countCards('he')); + ai: { + threaten: 2.4, + order: 3.6, + result: { + player: function (player, target) { + if (get.attitude(target, player) > 0) { + if ( + target.countCards("e", function (card) { + return get.value(card, target) < 0; + }) + ) + return 3; + return Math.sqrt(target.countCards("he")); } - if(target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))&&player.countCards('hs',function(card){ - return !ui.selected.cards.includes(card)&&get.name(card)=='sha'&&player.canUse(card,target)&&get.effect(target,card,player,player)!=0; - })) return -Math.sqrt(Math.abs(get.attitude(player,target)))/2; + if ( + target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) && + player.countCards("hs", function (card) { + return ( + !ui.selected.cards.includes(card) && + get.name(card) == "sha" && + player.canUse(card, target) && + get.effect(target, card, player, player) != 0 + ); + }) + ) + return -Math.sqrt(Math.abs(get.attitude(player, target))) / 2; return 0.1; }, }, }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - marktext:'血', - intro:{content:'多杀#刀,誓诛曹贼!'}, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('xuezhao_sha'); + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "血", + intro: { content: "多杀#刀,誓诛曹贼!" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("xuezhao_sha"); }, }, }, - hit:{ - charlotte:true, - onremove:true, - marktext:'诏', - intro:{content:'$篡汉,其心可诛!'}, - trigger:{player:'useCard1'}, - forced:true, - popup:false, - content:function(){ - trigger.directHit.addArray(player.getStorage('xuezhao_hit')); + hit: { + charlotte: true, + onremove: true, + marktext: "诏", + intro: { content: "$篡汉,其心可诛!" }, + trigger: { player: "useCard1" }, + forced: true, + popup: false, + content: function () { + trigger.directHit.addArray(player.getStorage("xuezhao_hit")); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return player.getStorage('xuezhao_hit').includes(arg.target); + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return player.getStorage("xuezhao_hit").includes(arg.target); }, }, }, }, }, //唐姬 - kangge:{ - audio:2, - trigger:{player:'phaseBegin'}, - direct:true, - filter:function(event,player){ - return player.phaseNumber==1&&!player.storage.kangge&&game.hasPlayer(current=>current!=player); + kangge: { + audio: 2, + trigger: { player: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.phaseNumber == 1 && + !player.storage.kangge && + game.hasPlayer((current) => current != player) + ); }, - content:function(){ - 'step 0' - player.chooseTarget('请选择【抗歌】的目标','其于回合外摸牌后,你摸等量的牌;其进入濒死状态时,你可令其回复体力至1点;其死亡后,你弃置所有牌并失去1点体力',lib.filter.notMe,true).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('kangge',target); - player.addSkill('kangge_clear'); - player.storage.kangge=target; - player.markSkill('kangge'); + content: function () { + "step 0"; + player + .chooseTarget( + "请选择【抗歌】的目标", + "其于回合外摸牌后,你摸等量的牌;其进入濒死状态时,你可令其回复体力至1点;其死亡后,你弃置所有牌并失去1点体力", + lib.filter.notMe, + true + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("kangge", target); + player.addSkill("kangge_clear"); + player.storage.kangge = target; + player.markSkill("kangge"); game.delayx(); } }, - intro:{content:'已指定$为目标'}, - group:['kangge_draw','kangge_dying','kangge_die'], - subSkill:{ - draw:{ - audio:'kangge', - trigger:{ - global:['gainAfter','loseAsyncAfter'], + intro: { content: "已指定$为目标" }, + group: ["kangge_draw", "kangge_dying", "kangge_die"], + subSkill: { + draw: { + audio: "kangge", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - forced:true, - filter:function(event,player){ - if(player.countMark('kangge_draw')>=3) return false; - var target=player.storage.kangge; - return target&&target!=_status.currentPhase&&event.getg(target).length>0; + forced: true, + filter: function (event, player) { + if (player.countMark("kangge_draw") >= 3) return false; + var target = player.storage.kangge; + return target && target != _status.currentPhase && event.getg(target).length > 0; }, - logTarget:'player', - content:function(){ - var num=Math.min(3-player.countMark('kangge_draw'),trigger.getg(player.storage.kangge).length); - player.addMark('kangge_draw',num,false); + logTarget: "player", + content: function () { + var num = Math.min( + 3 - player.countMark("kangge_draw"), + trigger.getg(player.storage.kangge).length + ); + player.addMark("kangge_draw", num, false); player.draw(num); }, }, - clear:{ - trigger:{global:'phaseBeginStart'}, - forced:true, - firstDo:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return player.countMark('kangge_draw')>0; + clear: { + trigger: { global: "phaseBeginStart" }, + forced: true, + firstDo: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.countMark("kangge_draw") > 0; }, - content:function(){ - player.removeMark('kangge_draw',player.countMark('kangge_draw'),false); + content: function () { + player.removeMark("kangge_draw", player.countMark("kangge_draw"), false); }, }, - dying:{ - audio:'kangge', - trigger:{global:'dying'}, - logTarget:'player', - filter:function(event,player){ - return event.player==player.storage.kangge&&event.player.hp<1&&!player.hasSkill('kangge_temp'); + dying: { + audio: "kangge", + trigger: { global: "dying" }, + logTarget: "player", + filter: function (event, player) { + return ( + event.player == player.storage.kangge && + event.player.hp < 1 && + !player.hasSkill("kangge_temp") + ); }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - prompt2:'令其将体力值回复至1点', - content:function(){ - trigger.player.recover(1-trigger.player.hp); - player.addTempSkill('kangge_temp','roundStart'); + prompt2: "令其将体力值回复至1点", + content: function () { + trigger.player.recover(1 - trigger.player.hp); + player.addTempSkill("kangge_temp", "roundStart"); }, }, - temp:{}, - die:{ - audio:'kangge', - trigger:{global:'dieAfter'}, - filter:function(event,player){ - return event.player==player.storage.kangge; + temp: {}, + die: { + audio: "kangge", + trigger: { global: "dieAfter" }, + filter: function (event, player) { + return event.player == player.storage.kangge; }, - forced:true, - content:function(){ - var cards=player.getCards('he'); - if(cards.length) player.discard(cards); + forced: true, + content: function () { + var cards = player.getCards("he"); + if (cards.length) player.discard(cards); player.loseHp(); }, }, }, - ai:{ - threaten:2, + ai: { + threaten: 2, }, }, - jielie:{ - audio:2, - trigger:{player:'damageBegin4'}, - direct:true, - filter:function(event,player){ - return ((!event.source)||(event.source!=player&&event.source!=player.storage.kangge))&&player.storage.kangge&&player.storage.kangge.isIn(); + jielie: { + audio: 2, + trigger: { player: "damageBegin4" }, + direct: true, + filter: function (event, player) { + return ( + (!event.source || + (event.source != player && event.source != player.storage.kangge)) && + player.storage.kangge && + player.storage.kangge.isIn() + ); }, - content:function(){ - 'step 0' - player.chooseControl(lib.suit.slice(0),'cancel2').set('prompt',get.prompt('jielie')).set('prompt2','防止伤害并改为失去等量体力,且令'+get.translation(player.storage.kangge)+'从弃牌堆中获得等量的花色牌').set('ai',function(){ - var player=_status.event.player; - if(get.attitude(player,player.storage.kangge)<=0) return 'cancel2'; - return lib.suit.randomGet(); - }); - 'step 1' - if(result.control!='cancel2'){ - event.suit=result.control; - player.logSkill('jielie',player.storage.kangge); + content: function () { + "step 0"; + player + .chooseControl(lib.suit.slice(0), "cancel2") + .set("prompt", get.prompt("jielie")) + .set( + "prompt2", + "防止伤害并改为失去等量体力,且令" + + get.translation(player.storage.kangge) + + "从弃牌堆中获得等量的花色牌" + ) + .set("ai", function () { + var player = _status.event.player; + if (get.attitude(player, player.storage.kangge) <= 0) return "cancel2"; + return lib.suit.randomGet(); + }); + ("step 1"); + if (result.control != "cancel2") { + event.suit = result.control; + player.logSkill("jielie", player.storage.kangge); trigger.cancel(); player.loseHp(trigger.num); - } - else event.finish(); - 'step 2' - var cards=[]; - while(cards.length0; - }) - }, - content:function(){ - 'step 0' - player.chooseTarget(function(card,player,target){ - return target!=player&&target.countCards('j',function(card){ - return player.canAddJudge(card); - })>0; - },get.prompt('dangzai'),'将一名其他角色判定区内的一张牌移动到你的判定区内'); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('dangzai',target); - player.choosePlayerCard(target,'j',true).set('filterButton',function(button){ - return _status.event.player.canAddJudge(button.link); + dangzai: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + !player.isDisabledJudge() && + game.hasPlayer(function (current) { + return ( + current != player && + current.countCards("j", function (card) { + return player.canAddJudge(card); + }) > 0 + ); }) - } - else event.finish(); - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ - var card=result.cards[0]; - target.$give(card,player); + ); + }, + content: function () { + "step 0"; + player.chooseTarget( + function (card, player, target) { + return ( + target != player && + target.countCards("j", function (card) { + return player.canAddJudge(card); + }) > 0 + ); + }, + get.prompt("dangzai"), + "将一名其他角色判定区内的一张牌移动到你的判定区内" + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dangzai", target); + player.choosePlayerCard(target, "j", true).set("filterButton", function (button) { + return _status.event.player.canAddJudge(button.link); + }); + } else event.finish(); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + var card = result.cards[0]; + target.$give(card, player); game.delayx(); - var name=card.viewAs||card.name; - if(card.name!=name){ - player.addJudge(name,card); - } - else{ + var name = card.viewAs || card.name; + if (card.name != name) { + player.addJudge(name, card); + } else { player.addJudge(card); } } }, }, - liangjue:{ - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + liangjue: { + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter:function(event,player){ - if(player.hp<=1) return false; - if(event.player==player){ - if(event.name=='equip'&&get.color(event.card,player)=='black') return true; - if(event.name=='addJudge'&&get.color(event.cards[0],player)=='black') return true; + forced: true, + filter: function (event, player) { + if (player.hp <= 1) return false; + if (event.player == player) { + if (event.name == "equip" && get.color(event.card, player) == "black") return true; + if (event.name == "addJudge" && get.color(event.cards[0], player) == "black") + return true; } - var evt=event.getl(player); - if(!evt||!evt.es||!evt.js||!evt.es.length&&!evt.js.length) return false; - for(var i of evt.es){ - if(get.color(i,player)=='black') return true; + var evt = event.getl(player); + if (!evt || !evt.es || !evt.js || (!evt.es.length && !evt.js.length)) return false; + for (var i of evt.es) { + if (get.color(i, player) == "black") return true; } - for(var i of evt.js){ - if(get.color(i,player)=='black') return true; + for (var i of evt.js) { + if (get.color(i, player) == "black") return true; } return false; }, - content:function(){ + content: function () { player.loseHp(); player.draw(2); }, }, //狼灭 - langmie:{ - trigger:{global:'phaseUseEnd'}, + langmie: { + trigger: { global: "phaseUseEnd" }, //forced:true, - filter:function(event,player){ - if(player==event.player||!player.countCards('he')) return false; - var map={}; - var list=event.player.getHistory('useCard',function(evt){ - var evt2=evt.getParent('phaseUse'); - return evt2==event; + filter: function (event, player) { + if (player == event.player || !player.countCards("he")) return false; + var map = {}; + var list = event.player.getHistory("useCard", function (evt) { + var evt2 = evt.getParent("phaseUse"); + return evt2 == event; }); - for(var i of list){ - var name=get.type2(i.card,false); - if(!map[name]) map[name]=true; + for (var i of list) { + var name = get.type2(i.card, false); + if (!map[name]) map[name] = true; else return true; } }, - frequent:true, - content:function(){ + frequent: true, + content: function () { player.draw(); }, - group:'langmie_damage', + group: "langmie_damage", }, - langmie_damage:{ - audio:'langmie', - trigger:{global:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&(event.player.getStat('damage')||0)>1&&player.countCards('he')>0; + langmie_damage: { + audio: "langmie", + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return ( + event.player != player && + (event.player.getStat("damage") || 0) > 1 && + player.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('langmie',trigger.player),'弃置一张牌并对其造成1点伤害').set('goon',get.damageEffect(trigger.player,player,player)>0).set('ai',function(card){ - if(!_status.event.goon) return 0; - return 7-get.value(card); - }).logSkill=['langmie_damage',trigger.player]; - 'step 1' - if(result.bool) trigger.player.damage(); + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + get.prompt("langmie", trigger.player), + "弃置一张牌并对其造成1点伤害" + ) + .set("goon", get.damageEffect(trigger.player, player, player) > 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }).logSkill = ["langmie_damage", trigger.player]; + ("step 1"); + if (result.bool) trigger.player.damage(); }, - ai:{expose:0.2}, + ai: { expose: 0.2 }, }, //牛金 - recuorui:{ - audio:'cuorui', - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.hp>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countGainableCards(player,'h')>0; - }) + recuorui: { + audio: "cuorui", + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return ( + player.hp > 0 && + game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "h") > 0; + }) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countGainableCards(player,'h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "h") > 0; }, - selectTarget:function(){ - return [1,_status.event.player.hp]; + selectTarget: function () { + return [1, _status.event.player.hp]; }, - content:function(){ - if(num==0) player.awakenSkill('recuorui'); - player.gainPlayerCard(target,true,'h'); + content: function () { + if (num == 0) player.awakenSkill("recuorui"); + player.gainPlayerCard(target, true, "h"); }, - ai:{ - order:10, - result:{ - player:1, - target:function(player,target){ - if(target.hasSkillTag('noh')) return 0; + ai: { + order: 10, + result: { + player: 1, + target: function (player, target) { + if (target.hasSkillTag("noh")) return 0; return -1; - } - } - } - }, - reliewei:{ - audio:'liewei', - trigger:{global:'dying'}, - filter:function(event,player){ - return player==_status.currentPhase||player.getHistory('useSkill',evt=>evt.skill=='reliewei').length evt.skill == "reliewei").length < + player.getHp() + ); + }, + frequent: true, + content: function () { player.draw(); }, }, //张邈 - mouni:{ - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h','sha')>0; + mouni: { + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h", "sha") > 0; }, - content:function(){ - 'step 0' - player.addSkill('mouni2'); - player.chooseTarget(get.prompt2('mouni'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,cards=player.getCards('h','sha'); - if(get.attitude(player,target)>=0||!player.canUse(cards[0],target,false)||(!player.hasJudge('lebu')&&target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))&&!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:cards[0], - },true))) return 0; - return get.effect(target,cards[0],player,player); + content: function () { + "step 0"; + player.addSkill("mouni2"); + player.chooseTarget(get.prompt2("mouni"), lib.filter.notMe).set("ai", function (target) { + var player = _status.event.player, + cards = player.getCards("h", "sha"); + if ( + get.attitude(player, target) >= 0 || + !player.canUse(cards[0], target, false) || + (!player.hasJudge("lebu") && + target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) && + !player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: cards[0], + }, + true + )) + ) + return 0; + return get.effect(target, cards[0], player, player); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('mouni',target); - event.cards=player.getCards('h','sha'); - } - else event.finish(); - 'step 2' - if(event.mouni_dying) return; - var hs=player.getCards('h'); - cards=cards.filter(function(card){ - return hs.includes(card)&&get.name(card,player)=='sha'&&player.canUse({ - name:'sha', - nature:get.nature(card,player), - isCard:true, - cards:[card], - },target,false); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("mouni", target); + event.cards = player.getCards("h", "sha"); + } else event.finish(); + ("step 2"); + if (event.mouni_dying) return; + var hs = player.getCards("h"); + cards = cards.filter(function (card) { + return ( + hs.includes(card) && + get.name(card, player) == "sha" && + player.canUse( + { + name: "sha", + nature: get.nature(card, player), + isCard: true, + cards: [card], + }, + target, + false + ) + ); }); - if(cards.length){ - var card=cards.randomRemove(1)[0]; - player.useCard(target,false,card); + if (cards.length) { + var card = cards.randomRemove(1)[0]; + player.useCard(target, false, card); event.redo(); } - 'step 3' - if(player.getHistory('useCard',function(evt){ - return evt.getParent()==event&&!player.getHistory('sourceDamage',function(evt2){ - return evt.card==evt2.card; - }).length; - }).length){ - player.skip('phaseUse'); - player.skip('phaseDiscard'); + ("step 3"); + if ( + player.getHistory("useCard", function (evt) { + return ( + evt.getParent() == event && + !player.getHistory("sourceDamage", function (evt2) { + return evt.card == evt2.card; + }).length + ); + }).length + ) { + player.skip("phaseUse"); + player.skip("phaseDiscard"); } - player.removeSkill('mouni2'); + player.removeSkill("mouni2"); }, }, - mouni2:{ - charlotte:true, - trigger:{global:'dying'}, - forced:true, - firstDo:true, - popup:false, - filter:function(event,player){ - var evt=event.getParent('mouni'); - return evt&&evt.player==player&&evt.target==event.player; + mouni2: { + charlotte: true, + trigger: { global: "dying" }, + forced: true, + firstDo: true, + popup: false, + filter: function (event, player) { + var evt = event.getParent("mouni"); + return evt && evt.player == player && evt.target == event.player; }, - content:function(){ - trigger.getParent('mouni').mouni_dying=true; + content: function () { + trigger.getParent("mouni").mouni_dying = true; }, }, - zongfan:{ - derivation:'zhangu', - trigger:{player:'phaseJieshuBegin'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return !player.getHistory('skipped').includes('phaseUse')&&player.getHistory('useCard',function(evt){ - return evt.getParent().name=='mouni'; - }).length>0; + zongfan: { + derivation: "zhangu", + trigger: { player: "phaseJieshuBegin" }, + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return ( + !player.getHistory("skipped").includes("phaseUse") && + player.getHistory("useCard", function (evt) { + return evt.getParent().name == "mouni"; + }).length > 0 + ); }, - content:function(){ - 'step 0' - player.awakenSkill('zongfan'); - var num=player.countCards('he'); - if(num>0){ + content: function () { + "step 0"; + player.awakenSkill("zongfan"); + var num = player.countCards("he"); + if (num > 0) { player.chooseCardTarget({ - prompt:'是否将任意张牌交给一名其他角色?', - selectCard:[1,num], - filterCard:true, - filterTarget:lib.filter.notMe, - position:'he', - ai1:function(card){ - if(card.name=='du') return 10; - else if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - var player=_status.event.player; - if(ui.selected.cards.length>4||!game.hasPlayer(function(current){ - return get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); - })) return 0; - return 1/Math.max(0.1,get.value(card)); + prompt: "是否将任意张牌交给一名其他角色?", + selectCard: [1, num], + filterCard: true, + filterTarget: lib.filter.notMe, + position: "he", + ai1: function (card) { + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") + return 0; + var player = _status.event.player; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + return 0; + return 1 / Math.max(0.1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(ui.selected.cards[0].name=='du') return -att; - if(target.hasSkillTag('nogain')) att/=6; + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; return att; }, }); - } - else event.goto(2); - 'step 1' - if(result.bool){ - var cards=result.cards,target=result.targets[0],num=Math.min(5,cards.length); - player.give(cards,target); + } else event.goto(2); + ("step 1"); + if (result.bool) { + var cards = result.cards, + target = result.targets[0], + num = Math.min(5, cards.length); + player.give(cards, target); player.gainMaxHp(num); player.recover(num); } - 'step 2' + ("step 2"); //player.removeSkill('mouni'); - player.changeSkills(['zhangu'],['mouni']); + player.changeSkills(["zhangu"], ["mouni"]); }, }, - zhangu:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.maxHp>1&&(player.countCards('h')==0||player.countCards('e')==0) + zhangu: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.maxHp > 1 && (player.countCards("h") == 0 || player.countCards("e") == 0); }, - content:function(){ - var cards=[],types=[]; - for(var i=0;i<3;i++){ - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&!types.includes(get.type2(card,false)); + content: function () { + var cards = [], + types = []; + for (var i = 0; i < 3; i++) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && !types.includes(get.type2(card, false)); }); - if(card){ + if (card) { cards.push(card); - types.push(get.type2(card,false)); - } - else break; + types.push(get.type2(card, false)); + } else break; } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); player.loseMaxHp(); }, }, //梁兴 - lulve:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - var hs=player.countCards('h'); - return hs>1&&game.hasPlayer(function(target){ - var ts=target.countCards('h'); - return target!=player&&ts>0&&hs>ts; - }); + lulve: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + var hs = player.countCards("h"); + return ( + hs > 1 && + game.hasPlayer(function (target) { + var ts = target.countCards("h"); + return target != player && ts > 0 && hs > ts; + }) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('lulve'),function(card,player,target){ - var hs=player.countCards('h'),ts=target.countCards('h'); - return target!=player&&ts>0&&hs>ts; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.isTurnedOver()) return att/10; - if(!player.hasShan()&&target.canUse({name:'sha',isCard:true},player,false)&&get.effect(player,{name:'sha',isCard:true},target,player)<0&&player.hp<4) return 0; - return -att*Math.sqrt(target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('lulve',target); - var str=get.translation(player); - target.chooseControl().set('choiceList',[ - '将所有手牌交给'+str+',然后其将武将牌翻面', - '将武将牌翻面,然后视为对'+str+'使用【杀】', - ]).set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().player; - if(player.isTurnedOver()) return 1; - if(!target.hasShan()&&player.canUse({name:'sha',isCard:true},target,false)&&get.effect(target,{name:'sha',isCard:true},player,player)<0) return 0; - return Math.random()<0.5?0:1; + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("lulve"), function (card, player, target) { + var hs = player.countCards("h"), + ts = target.countCards("h"); + return target != player && ts > 0 && hs > ts; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.isTurnedOver()) return att / 10; + if ( + !player.hasShan() && + target.canUse({ name: "sha", isCard: true }, player, false) && + get.effect(player, { name: "sha", isCard: true }, target, player) < 0 && + player.hp < 4 + ) + return 0; + return -att * Math.sqrt(target.countCards("h")); }); - } - else event.finish(); - 'step 2' - if(result.index==0){ - target.give(target.getCards('h'),player); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("lulve", target); + var str = get.translation(player); + target + .chooseControl() + .set("choiceList", [ + "将所有手牌交给" + str + ",然后其将武将牌翻面", + "将武将牌翻面,然后视为对" + str + "使用【杀】", + ]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + if (player.isTurnedOver()) return 1; + if ( + !target.hasShan() && + player.canUse({ name: "sha", isCard: true }, target, false) && + get.effect(target, { name: "sha", isCard: true }, player, player) < 0 + ) + return 0; + return Math.random() < 0.5 ? 0 : 1; + }); + } else event.finish(); + ("step 2"); + if (result.index == 0) { + target.give(target.getCards("h"), player); player.turnOver(); event.finish(); - } - else target.turnOver(); - 'step 3' - if(target.canUse({name:'sha',isCard:true},player,false)) target.useCard({name:'sha',isCard:true},player,false); + } else target.turnOver(); + ("step 3"); + if (target.canUse({ name: "sha", isCard: true }, player, false)) + target.useCard({ name: "sha", isCard: true }, player, false); }, }, - lxzhuixi:{ - audio:2, - trigger:{ - player:'damageBegin3', - source:'damageBegin1', + lxzhuixi: { + audio: 2, + trigger: { + player: "damageBegin3", + source: "damageBegin1", }, - forced:true, - logTarget:'player', - filter:function(event,player){ - return event.source&&event.player.isTurnedOver()!=event.source.isTurnedOver(); + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.source && event.player.isTurnedOver() != event.source.isTurnedOver(); }, - content:function(){ + content: function () { trigger.num++; }, }, //陶谦和曹嵩 - reyirang:{ - audio:'yirang', - audioname:['re_taoqian'], - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - if(!player.countCards('he',function(card){ - return get.type(card)!='basic'; - })){ + reyirang: { + audio: "yirang", + audioname: ["re_taoqian"], + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + if ( + !player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) + ) { return false; } - return game.hasPlayer(function(current){ - return current!=player; + return game.hasPlayer(function (current) { + return current != player; }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('reyirang'),function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - return (get.attitude(_status.event.player,target)-2)*target.maxHp; - }); - 'step 1' - if(result.bool){ - var cards=player.getCards('he',function(card){ - return get.type(card)!='basic'; + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("reyirang"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + return (get.attitude(_status.event.player, target) - 2) * target.maxHp; }); - var target=result.targets[0]; - player.logSkill('reyirang',target); - player.give(cards,target,'give'); - if(target.maxHp>player.maxHp) player.gainMaxHp(target.maxHp-player.maxHp,true); + ("step 1"); + if (result.bool) { + var cards = player.getCards("he", function (card) { + return get.type(card) != "basic"; + }); + var target = result.targets[0]; + player.logSkill("reyirang", target); + player.give(cards, target, "give"); + if (target.maxHp > player.maxHp) player.gainMaxHp(target.maxHp - player.maxHp, true); player.recover(cards.length); } - } + }, }, - cslilu:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ + cslilu: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { return !event.numFixed; }, - check:function(event,player){ - return Math.min(player.maxHp,5)-player.countCards('h')>3||game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - }); + check: function (event, player) { + return ( + Math.min(player.maxHp, 5) - player.countCards("h") > 3 || + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.changeToZero(); - 'step 1' - player.drawTo(Math.min(player.maxHp,5)); - 'step 2' - if(player.countCards('h')>0){ - var str='将至少一张手牌交给一名其他角色'; - var num=player.countMark('cslilu'); - if(num0) str+=('。若给出的牌数大于'+get.cnNumber(num)+'张,则你'); - else str+=',并'; - str+='加1点体力上限并回复1点体力' + ("step 1"); + player.drawTo(Math.min(player.maxHp, 5)); + ("step 2"); + if (player.countCards("h") > 0) { + var str = "将至少一张手牌交给一名其他角色"; + var num = player.countMark("cslilu"); + if (num < player.countCards("h")) { + if (num > 0) str += "。若给出的牌数大于" + get.cnNumber(num) + "张,则你"; + else str += ",并"; + str += "加1点体力上限并回复1点体力"; } player.chooseCardTarget({ - prompt:str, - filterCard:true, - filterTarget:lib.filter.notMe, - selectCard:[1,Infinity], - forced:true, - ai1:function(card){ - if(ui.selected.cards.length<_status.event.goon){ - if(get.tag(card,'damage')&&game.hasPlayer(function(current){ - current!=player&&get.attitude(player,current)>0&&!current.hasSkillTag('nogain')&&!current.hasJudge('lebu')&¤t.hasValueTarget(card); - })) return 1; - return 1/Math.max(0.1,get.value(card)); + prompt: str, + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + forced: true, + ai1: function (card) { + if (ui.selected.cards.length < _status.event.goon) { + if ( + get.tag(card, "damage") && + game.hasPlayer(function (current) { + current != player && + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") && + !current.hasJudge("lebu") && + current.hasValueTarget(card); + }) + ) + return 1; + return 1 / Math.max(0.1, get.value(card)); } return 0; }, - ai2:function(target){ - return Math.sqrt(5-Math.min(4,target.countCards('h')))*get.attitude(_status.event.player,target); + ai2: function (target) { + return ( + Math.sqrt(5 - Math.min(4, target.countCards("h"))) * + get.attitude(_status.event.player, target) + ); }, - goon:function(){ - if(!game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0&&!current.hasSkillTag('nogain')&&!current.hasJudge('lebu'); - })) return 1; - if(num 0 && + !current.hasSkillTag("nogain") && + !current.hasJudge("lebu") + ); + }) + ) + return 1; + if (num < player.countCards("h")) return num + 1; return 1; - }(), + })(), }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var num=player.countMark('cslilu'); - player.give(result.cards,result.targets[0]); - if(result.cards.length>num){ + } else event.finish(); + ("step 3"); + if (result.bool) { + var num = player.countMark("cslilu"); + player.give(result.cards, result.targets[0]); + if (result.cards.length > num) { player.gainMaxHp(); player.recover(); } - player.storage.cslilu=result.cards.length; - player.markSkill('cslilu'); + player.storage.cslilu = result.cards.length; + player.markSkill("cslilu"); } }, }, - csyizheng:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('csyizheng'),lib.filter.notMe).set('ai',function(target){ - if(target.isTurnedOver()||target.hasJudge('lebu')) return 0; - return get.attitude(_status.event.player,target)*Math.max(0,target.countCards('h')-2); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('csyizheng',target); - player.storage.csyizheng2=target; - player.addTempSkill('csyizheng2',{player:'phaseBegin'}); + csyizheng: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("csyizheng"), lib.filter.notMe) + .set("ai", function (target) { + if (target.isTurnedOver() || target.hasJudge("lebu")) return 0; + return ( + get.attitude(_status.event.player, target) * + Math.max(0, target.countCards("h") - 2) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("csyizheng", target); + player.storage.csyizheng2 = target; + player.addTempSkill("csyizheng2", { player: "phaseBegin" }); } }, }, - csyizheng2:{ - audio:'csyizheng', - trigger:{ - global:['recoverBegin','damageBegin1'], + csyizheng2: { + audio: "csyizheng", + trigger: { + global: ["recoverBegin", "damageBegin1"], }, - forced:true, - charlotte:true, - logTarget:function(event){ - return event.name=='damage'?event.source:event.player; + forced: true, + charlotte: true, + logTarget: function (event) { + return event.name == "damage" ? event.source : event.player; }, - filter:function(event,player){ - var target=lib.skill.csyizheng2.logTarget(event); - if(target!=player.storage.csyizheng2) return false; - return player.maxHp>target.maxHp; + filter: function (event, player) { + var target = lib.skill.csyizheng2.logTarget(event); + if (target != player.storage.csyizheng2) return false; + return player.maxHp > target.maxHp; }, - content:function(){ + content: function () { player.loseMaxHp(); trigger.num++; }, - mark:'character', - intro:{ - content:'$造成伤害或回复体力时,若你的体力上限大于其,则你减1点体力上限,然后此伤害/回复量+1', + mark: "character", + intro: { + content: + "$造成伤害或回复体力时,若你的体力上限大于其,则你减1点体力上限,然后此伤害/回复量+1", }, }, - reyixiang:{ - audio:'yixiang', - audioname:['re_taoqian'], - trigger:{player:'damageBegin1'}, - forced:true, - filter:function(event,player){ - var evt=event.getParent(2); - if(evt.name!='useCard'||evt.card!=event.card) return false; - var source=evt.player; - var phsu=evt.getParent('phaseUse'); - if(!source||source==player||source!=phsu.player) return false; - return source.getHistory('useCard',function(evt2){ - return evt2.getParent('phaseUse')==phsu; - })[0]==evt; + reyixiang: { + audio: "yixiang", + audioname: ["re_taoqian"], + trigger: { player: "damageBegin1" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent(2); + if (evt.name != "useCard" || evt.card != event.card) return false; + var source = evt.player; + var phsu = evt.getParent("phaseUse"); + if (!source || source == player || source != phsu.player) return false; + return ( + source.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == phsu; + })[0] == evt + ); }, - content:function(){ + content: function () { trigger.num--; }, - group:'reyixiang_card', - subSkill:{ - card:{ - audio:'yixiang', - audioname:['re_taoqian'], - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - if(get.color(event.card)!='black') return false; - var evt=event.getParent(); - var source=evt.player; - var phsu=evt.getParent('phaseUse'); - if(!source||source==player||source!=phsu.player) return false; - return source.getHistory('useCard',function(evt2){ - return evt2.getParent('phaseUse')==phsu; - }).indexOf(evt)==1; + group: "reyixiang_card", + subSkill: { + card: { + audio: "yixiang", + audioname: ["re_taoqian"], + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (get.color(event.card) != "black") return false; + var evt = event.getParent(); + var source = evt.player; + var phsu = evt.getParent("phaseUse"); + if (!source || source == player || source != phsu.player) return false; + return ( + source + .getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == phsu; + }) + .indexOf(evt) == 1 + ); }, - content:function(){ + content: function () { trigger.excluded.add(player); }, }, }, - ai:{ - effect:{ - target:function(card,player,target,current,isLink){ - if(isLink||typeof card!=='object'||!player.isPhaseUsing()) return; + ai: { + effect: { + target: function (card, player, target, current, isLink) { + if (isLink || typeof card !== "object" || !player.isPhaseUsing()) return; var num; - var evt=_status.event.getParent('useCard'),evt2=_status.event.getParent('phaseUse'); - if(evt.card==card){ - num=player.getHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==evt2; - }).indexOf(evt); + var evt = _status.event.getParent("useCard"), + evt2 = _status.event.getParent("phaseUse"); + if (evt.card == card) { + num = player + .getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == evt2; + }) + .indexOf(evt); + } else + num = player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == evt2; + }).length; + if (num < 0 || num > 1) return; + if (num === 0 && get.tag(card, "damage")) { + if ( + target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) || + !player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ) + return "zerotarget"; + return [0.5, 0, 0.5, 0]; } - else num=player.getHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==evt2; - }).length; - if(num<0||num>1) return; - if(num===0&&get.tag(card,'damage')){ - if(target.hasSkillTag('filterDamage',null,{ - player:player, - card:card - })||!player.hasSkillTag('damageBonus',true,{ - target:target, - card:card - })) return 'zerotarget'; - return [0.5,0,0.5,0]; - } - if(num===1&&get.color(card)=='black') return 'zeroplayertarget'; + if (num === 1 && get.color(card) == "black") return "zeroplayertarget"; }, }, }, }, //赵忠 - yangzhong:{ - audio:2, - trigger:{ - source:'damageSource', - player:'damageEnd', + yangzhong: { + audio: 2, + trigger: { + source: "damageSource", + player: "damageEnd", }, - direct:true, - filter:function(event,player){ - var target=event.player,source=event.source; - if(player!=source&&!player.hasSkill('yangzhong')) return false; - if(!target||!source||!target.isIn()||!source.isIn()) return false; - return source.countCards('he')>1; + direct: true, + filter: function (event, player) { + var target = event.player, + source = event.source; + if (player != source && !player.hasSkill("yangzhong")) return false; + if (!target || !source || !target.isIn() || !source.isIn()) return false; + return source.countCards("he") > 1; }, - content:function(){ - 'step 0' - trigger.source.chooseToDiscard('是否对'+get.translation(trigger.player)+'发动【殃众】?','弃置两张牌,并令其失去1点体力','he',2).set('ai',function(card){ - var evt=_status.event; - if(get.attitude(evt.player,evt.getTrigger().player)>=0) return 0; - return 7-get.value(card); - }).logSkill=['yangzhong',trigger.player]; - 'step 1' - if(result.bool) trigger.player.loseHp(); + content: function () { + "step 0"; + trigger.source + .chooseToDiscard( + "是否对" + get.translation(trigger.player) + "发动【殃众】?", + "弃置两张牌,并令其失去1点体力", + "he", + 2 + ) + .set("ai", function (card) { + var evt = _status.event; + if (get.attitude(evt.player, evt.getTrigger().player) >= 0) return 0; + return 7 - get.value(card); + }).logSkill = ["yangzhong", trigger.player]; + ("step 1"); + if (result.bool) trigger.player.loseHp(); }, }, - huangkong:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - if(player==_status.currentPhase||player.countCards('h')) return false; - return event.card.name=='sha'||get.type(event.card,false)=='trick'; + huangkong: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + if (player == _status.currentPhase || player.countCards("h")) return false; + return event.card.name == "sha" || get.type(event.card, false) == "trick"; }, - content:function(){ + content: function () { player.draw(2); }, }, - hfjieying:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('hfjieying'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target)*(1+target.countCards('h',function(card){ - return !get.tag(card,'damage')&&target.hasValueTarget(card); - }))/(1+target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('hfjieying',target); - target.addTempSkill('hfjieying2',{player:'phaseJieshuBegin'}); + hfjieying: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("hfjieying"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + return ( + (get.attitude(player, target) * + (1 + + target.countCards("h", function (card) { + return !get.tag(card, "damage") && target.hasValueTarget(card); + }))) / + (1 + target.countCards("h")) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("hfjieying", target); + target.addTempSkill("hfjieying2", { player: "phaseJieshuBegin" }); } }, - ai:{ - expose:0.05, + ai: { + expose: 0.05, }, }, - hfjieying2:{ - mod:{ - cardEnabled:function(card,player){ - if(player.storage.hfjieying2) return false; + hfjieying2: { + mod: { + cardEnabled: function (card, player) { + if (player.storage.hfjieying2) return false; }, - cardSavable:function(card,player){ - if(player.storage.hfjieying2) return false; + cardSavable: function (card, player) { + if (player.storage.hfjieying2) return false; }, - targetInRange:function(card,player){ - if(player==_status.currentPhase&&(card.name=='sha'||get.type(card)=='trick')) return true; + targetInRange: function (card, player) { + if ( + player == _status.currentPhase && + (card.name == "sha" || get.type(card) == "trick") + ) + return true; }, - aiOrder:function(player,card,num){ - var info=get.info(card); - if(!get.tag(card,'damage')&&(!info||!info.toself)) return num+8; + aiOrder: function (player, card, num) { + var info = get.info(card); + if (!get.tag(card, "damage") && (!info || !info.toself)) return num + 8; }, }, - onremove:true, - trigger:{player:'useCard2'}, - direct:true, - charlotte:true, - filter:function(event,player){ - if(player!=_status.currentPhase||event.targets.length!=1) return false; - var card=event.card; - if(card.name!='sha'&&get.type(card)!='trick')return false; - var info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(card,player,current); - })){ + onremove: true, + trigger: { player: "useCard2" }, + direct: true, + charlotte: true, + filter: function (event, player) { + if (player != _status.currentPhase || event.targets.length != 1) return false; + var card = event.card; + if (card.name != "sha" && get.type(card) != "trick") return false; + var info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加一个目标' - player.chooseTarget(get.prompt('hfjieying2'),function(card,player,target){ - var player=_status.event.player; - return !_status.event.targets.includes(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('card',trigger.card).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; + player + .chooseTarget(get.prompt("hfjieying2"), function (card, player, target) { + var player = _status.event.player; + return ( + !_status.event.targets.includes(target) && + lib.filter.targetEnabled2(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("card", trigger.card) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('hfjieying2',event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("hfjieying2", event.targets); trigger.targets.addArray(event.targets); } }, - group:'hfjieying3', - mark:true, - intro:{ - content:function(player){ - if(player) return '不能使用牌直到回合结束'; - return '使用【杀】或普通锦囊牌时无距离限制且可以多指定一个目标'; + group: "hfjieying3", + mark: true, + intro: { + content: function (player) { + if (player) return "不能使用牌直到回合结束"; + return "使用【杀】或普通锦囊牌时无距离限制且可以多指定一个目标"; }, }, }, - hfjieying3:{ - trigger:{source:'damageSource'}, - forced:true, - popup:false, - filter:function(event,player){ - return !player.storage.hfjieying2&&player==_status.currentPhase; + hfjieying3: { + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter: function (event, player) { + return !player.storage.hfjieying2 && player == _status.currentPhase; }, - content:function(){ - player.storage.hfjieying2=true; + content: function () { + player.storage.hfjieying2 = true; }, }, - weipo:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - return player!=event.player&&!player.hasSkill('weipo3')&&player.countCards('h')player.countCards('h'); + weipo2: { + charlotte: true, + trigger: { global: "useCardAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.weipo && + event.weipo[player.playerid] != undefined && + event.weipo[player.playerid] > player.countCards("h") + ); }, - content:function(){ - 'step 0' - player.addTempSkill('weipo3',{player:'phaseBegin'}); - if(player.countCards('h')&&trigger.player.isIn()){ - player.chooseCard('h',true,'将一张手牌交给'+get.translation(trigger.player)); - } - else event.finish(); - 'step 1' - if(result.bool){ - player.give(result.cards,trigger.player); + content: function () { + "step 0"; + player.addTempSkill("weipo3", { player: "phaseBegin" }); + if (player.countCards("h") && trigger.player.isIn()) { + player.chooseCard("h", true, "将一张手牌交给" + get.translation(trigger.player)); + } else event.finish(); + ("step 1"); + if (result.bool) { + player.give(result.cards, trigger.player); } }, }, - weipo3:{charlotte:true}, - refuqi:{ - audio:'fuqi', - forced:true, - trigger:{ - player:"useCard", + weipo3: { charlotte: true }, + refuqi: { + audio: "fuqi", + forced: true, + trigger: { + player: "useCard", }, - filter:function(event,player){ - return event.card&&(get.type(event.card)=='trick'||get.type(event.card)=='basic'&&!['shan','tao','jiu','du'].includes(event.card.name))&&game.hasPlayer(function(current){ - return current!=player&&get.distance(player,current)<=1; - }); + filter: function (event, player) { + return ( + event.card && + (get.type(event.card) == "trick" || + (get.type(event.card) == "basic" && + !["shan", "tao", "jiu", "du"].includes(event.card.name))) && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) <= 1; + }) + ); }, - content:function(){ - trigger.directHit.addArray(game.filterPlayer(function(current){ - return current!=player&&get.distance(player,current)<=1; - })); + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player && get.distance(player, current) <= 1; + }) + ); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return get.distance(player,arg.target)<=1; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return get.distance(player, arg.target) <= 1; }, }, }, - zhuide:{ - audio:2, - trigger:{player:'die'}, - forceDie:true, - skillAnimation:true, - animationColor:'thunder', - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('zhuide'),lib.filter.notMe).set('ai',function(target){ - return get.attitude(_status.event.player,target); + zhuide: { + audio: 2, + trigger: { player: "die" }, + forceDie: true, + skillAnimation: true, + animationColor: "thunder", + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("zhuide"), lib.filter.notMe).set("ai", function (target) { + return get.attitude(_status.event.player, target); }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('zhuide',target); - var names=[]; - var cards=[]; - while(cards.length<4){ - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&!names.includes(card.name)&&get.type(card)=='basic'; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhuide", target); + var names = []; + var cards = []; + while (cards.length < 4) { + var card = get.cardPile2(function (card) { + return ( + !cards.includes(card) && + !names.includes(card.name) && + get.type(card) == "basic" + ); }); - if(card){ + if (card) { cards.push(card); names.push(card.name); - } - else break; + } else break; } - if(cards.length) target.gain(cards,'gain2'); + if (cards.length) target.gain(cards, "gain2"); } }, }, - juntun:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.maxHp>1; + juntun: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return player.maxHp > 1; }, - content:function(){ + content: function () { player.loseMaxHp(); player.draw(player.maxHp); }, }, - jiaojie:{ - audio:2, - mod:{ - ignoredHandcard:function(card,player){ - if(get.color(card)=='red'){ + jiaojie: { + audio: 2, + mod: { + ignoredHandcard: function (card, player) { + if (get.color(card) == "red") { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.color(card)=='red'){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.color(card) == "red") { return false; } }, - targetInRange:function(card){ + targetInRange: function (card) { const color = get.color(card); - if (color === 'black' || color === 'unsure') return true; + if (color === "black" || color === "unsure") return true; }, - cardUsable:function(card){ + cardUsable: function (card) { const color = get.color(card); - if (color === 'black' || color === 'unsure') return Infinity; + if (color === "black" || color === "unsure") return Infinity; }, }, }, - decadewuniang:{ - trigger:{ - player:["useCard","respond"], + decadewuniang: { + trigger: { + player: ["useCard", "respond"], }, - audio:'xinfu_wuniang', - direct:true, - filter:function(event,player){ - return event.card.name=='sha'; + audio: "xinfu_wuniang", + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('decadewuniang'),function(card,player,target){ - if(player==target) return false; - return target.countGainableCards(player,'he')>0; - }).set('ai',function(target){ - return 10-get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('decadewuniang',target); - player.line(target,'fire'); - player.gainPlayerCard(target,'he',true); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("decadewuniang"), function (card, player, target) { + if (player == target) return false; + return target.countGainableCards(player, "he") > 0; + }) + .set("ai", function (target) { + return 10 - get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("decadewuniang", target); + player.line(target, "fire"); + player.gainPlayerCard(target, "he", true); target.draw(); - if(!player.storage.decadexushen) event.finish(); - } - else event.finish(); - 'step 2' - var list=game.filterPlayer(function(current){ - return current.name=='dc_guansuo'||current.name2=='dc_guansuo'; + if (!player.storage.decadexushen) event.finish(); + } else event.finish(); + ("step 2"); + var list = game.filterPlayer(function (current) { + return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; }); - if(list.length) game.asyncDraw(list); + if (list.length) game.asyncDraw(list); else event.finish(); - 'step 3' + ("step 3"); game.delayx(); }, }, - minsi:{ - audio:2, - enable:'phaseUse', - getResult:function(cards){ - var l=cards.length; - var all=Math.pow(l,2); - var list=[]; - for(var i=1;i0) array.push(cards[j]) + minsi: { + audio: 2, + enable: "phaseUse", + getResult: function (cards) { + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) + array.push(cards[j]); } - var num=0; - for(var k of array){ - num+=get.number(k); + var num = 0; + for (var k of array) { + num += get.number(k); } - if(num==13) list.push(array); + if (num == 13) list.push(array); } - if(list.length){ - list.sort(function(a,b){ - if(a.length!=b.length) return b.length-a.length; - return get.value(a)-get.value(b); + if (list.length) { + list.sort(function (a, b) { + if (a.length != b.length) return b.length - a.length; + return get.value(a) - get.value(b); }); return list[0]; } return list; }, - usable:1, - filterCard:function(card){ - var num=0; - for(var i=0;i0) array.push(cards[j]) + ("step 1"); + var num = result.number; + var next = player.chooseToDiscard( + "是否弃置任意张点数之和为" + get.cnNumber(num) + "的牌并回复1点体力?", + function (card) { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); } - var numx=0; - for(var k of array){ - numx+=get.number(k); - } - if(numx==num) list.push(array); + return get.number(card) + num <= _status.event.num; + }, + "he" + ); + next.set("num", num); + next.set("complexCard", true); + next.set("selectCard", function () { + var num = 0; + for (var i = 0; i < ui.selected.cards.length; i++) { + num += get.number(ui.selected.cards[i]); } - if(list.length){ - list.sort(function(a,b){ - return get.value(a)-get.value(b); - }); - return list[0]; - } - return list; - }()); - next.set('ai',function(card){ - if(!_status.event.cardResult.includes(card)) return 0; - return 6-get.value(card); + if (num == _status.event.num) return ui.selected.cards.length; + return ui.selected.cards.length + 2; }); - 'step 2' - if(result.bool) player.recover(); + next.set( + "cardResult", + (function () { + var cards = player.getCards("he"); + var l = cards.length; + var all = Math.pow(l, 2); + var list = []; + for (var i = 1; i < all; i++) { + var array = []; + for (var j = 0; j < l; j++) { + if (Math.floor((i % Math.pow(2, j + 1)) / Math.pow(2, j)) > 0) + array.push(cards[j]); + } + var numx = 0; + for (var k of array) { + numx += get.number(k); + } + if (numx == num) list.push(array); + } + if (list.length) { + list.sort(function (a, b) { + return get.value(a) - get.value(b); + }); + return list[0]; + } + return list; + })() + ); + next.set("ai", function (card) { + if (!_status.event.cardResult.includes(card)) return 0; + return 6 - get.value(card); + }); + ("step 2"); + if (result.bool) player.recover(); }, }, - cixiao:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - if(!game.hasPlayer(function(current){ - return current.hasSkill('panshi'); - })) return true; - return player.countCards('he')>=1&&game.hasPlayer(function(current){ - return current!=player&&!current.hasSkill('panshi'); - }); + cixiao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + if ( + !game.hasPlayer(function (current) { + return current.hasSkill("panshi"); + }) + ) + return true; + return ( + player.countCards("he") >= 1 && + game.hasPlayer(function (current) { + return current != player && !current.hasSkill("panshi"); + }) + ); }, - content:function(){ - 'step 0' - if(game.hasPlayer(function(current){ - return current.hasSkill('panshi'); - })) event.goto(2); - else player.chooseTarget(lib.filter.notMe,get.prompt('cixiao'),'令一名其他角色获得「义子」标记').set('ai',function(target){ - var player=_status.event.player; - var att=-get.attitude(player,target); - return att*target.countCards('h'); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('cixiao',target); - target.addSkills('panshi'); + content: function () { + "step 0"; + if ( + game.hasPlayer(function (current) { + return current.hasSkill("panshi"); + }) + ) + event.goto(2); + else + player + .chooseTarget( + lib.filter.notMe, + get.prompt("cixiao"), + "令一名其他角色获得「义子」标记" + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target); + return att * target.countCards("h"); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("cixiao", target); + target.addSkills("panshi"); } event.finish(); - 'step 2' - var list=game.filterPlayer(function(current){ - return current.hasSkill('panshi'); + ("step 2"); + var list = game.filterPlayer(function (current) { + return current.hasSkill("panshi"); }); player.chooseCardTarget({ - prompt:get.prompt('cixiao'), - prompt2:('弃置一张牌并将'+get.translation(list)+'的「义子」标记转移给其他角色'), - position:'he', - filterTarget:function(card,player,target){ - return player!=target&&!target.hasSkill('panshi'); + prompt: get.prompt("cixiao"), + prompt2: "弃置一张牌并将" + get.translation(list) + "的「义子」标记转移给其他角色", + position: "he", + filterTarget: function (card, player, target) { + return player != target && !target.hasSkill("panshi"); }, - filterCard:lib.filter.cardDiscardable, - ai1:function(card){ - if(_status.event.goon) return 5-get.value(card); + filterCard: lib.filter.cardDiscardable, + ai1: function (card) { + if (_status.event.goon) return 5 - get.value(card); return 0; }, - ai2:function(target){ - var player=_status.event.player; - var att=-get.attitude(player,target); - return att*target.countCards('h'); + ai2: function (target) { + var player = _status.event.player; + var att = -get.attitude(player, target); + return att * target.countCards("h"); }, - goon:function(target){ - var att=-get.attitude(player,target); - return att*target.countCards('h')<=0; - }(list[0]), + goon: (function (target) { + var att = -get.attitude(player, target); + return att * target.countCards("h") <= 0; + })(list[0]), }); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('cixiao'); - player.discard(result.cards).delay=false; - player.line2(game.filterPlayer(function(current){ - if(current.hasSkill('panshi')){ - current.removeSkills('panshi'); - return true; - } - }).concat(result.targets),'green'); - target.addSkills('panshi'); - } - else event.finish(); - 'step 4' + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("cixiao"); + player.discard(result.cards).delay = false; + player.line2( + game + .filterPlayer(function (current) { + if (current.hasSkill("panshi")) { + current.removeSkills("panshi"); + return true; + } + }) + .concat(result.targets), + "green" + ); + target.addSkills("panshi"); + } else event.finish(); + ("step 4"); game.delayx(); }, - derivation:'panshi', - ai:{threaten:8}, + derivation: "panshi", + ai: { threaten: 8 }, }, - panshi:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return player.countCards('h')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.hasSkill('cixiao'); - }); + panshi: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + game.hasPlayer(function (current) { + return current != player && current.hasSkill("cixiao"); + }) + ); }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('cixiao'); + content: function () { + "step 0"; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("cixiao"); }); - if(targets.length==1){ - event.target=targets[0]; - player.chooseCard('h',true,'叛弑:将一张手牌交给'+get.translation(targets)); - } - else player.chooseCardTarget({ - prompt:'叛弑:将一张手牌交给'+get.translation(targets)+'中的一名角色', - filterCard:true, - position:'h', - targets:targets, - forced:true, - filterTarget:function(card,player,target){ - return _status.event.targets.includes(target); - }, - }); - 'step 1' - if(result.bool){ - if(!target) target=result.targets[0]; + if (targets.length == 1) { + event.target = targets[0]; + player.chooseCard("h", true, "叛弑:将一张手牌交给" + get.translation(targets)); + } else + player.chooseCardTarget({ + prompt: "叛弑:将一张手牌交给" + get.translation(targets) + "中的一名角色", + filterCard: true, + position: "h", + targets: targets, + forced: true, + filterTarget: function (card, player, target) { + return _status.event.targets.includes(target); + }, + }); + ("step 1"); + if (result.bool) { + if (!target) target = result.targets[0]; player.line(target); - player.give(result.cards,target); + player.give(result.cards, target); } }, - mark:true, - marktext:'子', - intro:{ - name:'义子', + mark: true, + marktext: "子", + intro: { + name: "义子", //content:'我是儿子', //R·I·P——永远怀念:被棘手砍掉的“我是儿子” - content(_,player){ - const targets=game.filterPlayer2(target=>target.hasSkill('cixiao',null,null,false)).sortBySeat(player); - if(!targets.length) return '我义父呢?!'; - if(['name','name1','name2'].some(name=>{ - if(!player[name]||!get.character(player[name])||typeof get.translation(player[name])!='string') return false; - return player[name].includes('lvbu')&&get.translation(player[name]).includes('吕布'); - })) return '公若不弃,布愿拜为义父'; - return '我是'+get.translation(targets)+'的'+((player)=>{ - switch(player.sex){ - case 'female': - return '义女'; - case 'double': - return '义子义女'; - default: - return '义子'; - } - })(player); + content(_, player) { + const targets = game + .filterPlayer2((target) => target.hasSkill("cixiao", null, null, false)) + .sortBySeat(player); + if (!targets.length) return "我义父呢?!"; + if ( + ["name", "name1", "name2"].some((name) => { + if ( + !player[name] || + !get.character(player[name]) || + typeof get.translation(player[name]) != "string" + ) + return false; + return ( + player[name].includes("lvbu") && + get.translation(player[name]).includes("吕布") + ); + }) + ) + return "公若不弃,布愿拜为义父"; + return ( + "我是" + + get.translation(targets) + + "的" + + ((player) => { + switch (player.sex) { + case "female": + return "义女"; + case "double": + return "义子义女"; + default: + return "义子"; + } + })(player) + ); }, }, - group:'panshi_damage', + group: "panshi_damage", }, - panshi_damage:{ - trigger:{source:'damageBegin1'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return player.isPhaseUsing()&&event.card&&event.card.name=='sha'&&event.player.hasSkill('cixiao'); + panshi_damage: { + trigger: { source: "damageBegin1" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return ( + player.isPhaseUsing() && + event.card && + event.card.name == "sha" && + event.player.hasSkill("cixiao") + ); }, - content:function(){ + content: function () { trigger.num++; - if(['name','name1','name2'].some(name=>{ - if(!player[name]||!get.character(player[name])||typeof get.translation(player[name])!='string') return false; - return player[name].includes('lvbu')&&get.translation(player[name]).includes('吕布'); - })) player.chat('吾堂堂丈夫,安肯为汝子乎!'); - var evt=event.getParent('phaseUse'); - if(evt&&evt.player==player) evt.skipped=true; + if ( + ["name", "name1", "name2"].some((name) => { + if ( + !player[name] || + !get.character(player[name]) || + typeof get.translation(player[name]) != "string" + ) + return false; + return ( + player[name].includes("lvbu") && + get.translation(player[name]).includes("吕布") + ); + }) + ) + player.chat("吾堂堂丈夫,安肯为汝子乎!"); + var evt = event.getParent("phaseUse"); + if (evt && evt.player == player) evt.skipped = true; }, }, - xianshuai:{ - audio:2, - trigger:{global:'damageSource'}, - forced:true, - filter:function(event,player){ - return event.source&&event.source.isIn()&&!player.hasSkill('xianshuai2'); + xianshuai: { + audio: 2, + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + return event.source && event.source.isIn() && !player.hasSkill("xianshuai2"); }, - content:function(){ - player.addTempSkill('xianshuai2','roundStart'); + content: function () { + player.addTempSkill("xianshuai2", "roundStart"); player.draw(); - if(player==trigger.source&&trigger.player.isIn()){ - player.line(trigger.player,'green'); + if (player == trigger.source && trigger.player.isIn()) { + player.line(trigger.player, "green"); trigger.player.damage(); } }, }, - xianshuai2:{charlotte:true}, - decadexushen:{ - derivation:'decadezhennan', - audio:'xinfu_xushen', - trigger:{player:'dying'}, - limited:true, - skillAnimation:true, - animationColor:'orange', - filter:function(event,player){ - return player.hp<1; + xianshuai2: { charlotte: true }, + decadexushen: { + derivation: "decadezhennan", + audio: "xinfu_xushen", + trigger: { player: "dying" }, + limited: true, + skillAnimation: true, + animationColor: "orange", + filter: function (event, player) { + return player.hp < 1; }, - content:function(){ - player.awakenSkill('decadexushen'); - player.addSkills('decadezhennan'); - player.addTempSkill('decadexushen2'); - trigger.decadexushen=true; + content: function () { + player.awakenSkill("decadexushen"); + player.addSkills("decadezhennan"); + player.addTempSkill("decadexushen2"); + trigger.decadexushen = true; player.recover(); }, }, - decadexushen2:{ - trigger:{player:'dyingAfter'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return event.decadexushen==true&&!game.hasPlayer(function(current){ - return current.name=='dc_guansuo'||current.name2=='dc_guansuo'; - }); + decadexushen2: { + trigger: { player: "dyingAfter" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return ( + event.decadexushen == true && + !game.hasPlayer(function (current) { + return current.name == "dc_guansuo" || current.name2 == "dc_guansuo"; + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,'许身:是否令一名其他角色选择是否将其武将牌替换为“关索”并令其摸三张牌?').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(!result.bool){ + content: function () { + "step 0"; + player + .chooseTarget( + lib.filter.notMe, + "许身:是否令一名其他角色选择是否将其武将牌替换为“关索”并令其摸三张牌?" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (!result.bool) { event.finish(); return; } - var target=result.targets[0]; - event.target=target; - player.line(target,'fire'); - target.chooseBool('许身:是否将自己的一张武将牌替换为“关索”并令'+get.translation(player)+'摸三张牌?'); - 'step 2' - if(result.bool){ - if(target.name2!=undefined){ - target.chooseControl(target.name1,target.name2).set('prompt','请选择要更换的武将牌'); - } - else event._result={control:target.name1}; - } - else event.goto(4); - 'step 3' - target.reinitCharacter(result.control,'dc_guansuo'); - 'step 4' + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); + target.chooseBool( + "许身:是否将自己的一张武将牌替换为“关索”并令" + + get.translation(player) + + "摸三张牌?" + ); + ("step 2"); + if (result.bool) { + if (target.name2 != undefined) { + target + .chooseControl(target.name1, target.name2) + .set("prompt", "请选择要更换的武将牌"); + } else event._result = { control: target.name1 }; + } else event.goto(4); + ("step 3"); + target.reinitCharacter(result.control, "dc_guansuo"); + ("step 4"); target.draw(3); }, }, - decadezhennan:{ - audio:'xinfu_zhennan', - trigger:{ - global:"useCardToPlayered", + decadezhennan: { + audio: "xinfu_zhennan", + trigger: { + global: "useCardToPlayered", }, - filter:function(event,player){ - return event.isFirstTarget&&event.targets&&event.targets.length>1&&get.type2(event.card)=='trick'; + filter: function (event, player) { + return ( + event.isFirstTarget && + event.targets && + event.targets.length > 1 && + get.type2(event.card) == "trick" + ); }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('decadezhennan'),'对一名其他角色造成1点伤害',function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - "step 1" - if(result.bool&&result.targets&&result.targets.length){ - player.logSkill('decadezhennan',result.targets); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("decadezhennan"), + "对一名其他角色造成1点伤害", + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool && result.targets && result.targets.length) { + player.logSkill("decadezhennan", result.targets); result.targets[0].damage(); } }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, - yujue:{ - audio:2, - derivation:'zhihu', - enable:'phaseUse', - usable:1, - filter:function(event,player){ + yujue: { + audio: 2, + derivation: "zhihu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { return player.hasEnabledSlot(); }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('###鬻爵###'+lib.translate.yujue_info); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("###鬻爵###" + lib.translate.yujue_info); }, - chooseControl:function(event,player){ - var list=[]; - for(var i=1;i<6;i++){ - if(player.hasEnabledSlot(i)) list.push('equip'+i); + chooseControl: function (event, player) { + var list = []; + for (var i = 1; i < 6; i++) { + if (player.hasEnabledSlot(i)) list.push("equip" + i); } - list.push('cancel2'); + list.push("cancel2"); return list; }, - check:function(event,player){ - for(var i=5;i>0;i--){ - if(player.hasEmptySlot(i)) return ('equip'+i); + check: function (event, player) { + for (var i = 5; i > 0; i--) { + if (player.hasEmptySlot(i)) return "equip" + i; } - return 'cancel2'; + return "cancel2"; }, - backup:function(result){ - var next=get.copy(lib.skill.yujuex); - next.position=result.control; + backup: function (result) { + var next = get.copy(lib.skill.yujuex); + next.position = result.control; return next; }, }, - ai:{ - order:1, - result:{ - player:function(player){ - if(game.hasPlayer(function(target){ - if(player==target) return false; - var hs=target.countCards('h'); - return hs>2&&get.attitude(player,target)>0; - })) return 1; + ai: { + order: 1, + result: { + player: function (player) { + if ( + game.hasPlayer(function (target) { + if (player == target) return false; + var hs = target.countCards("h"); + return hs > 2 && get.attitude(player, target) > 0; + }) + ) + return 1; return 0; }, }, }, }, - yujuex:{ - audio:'yujue', - async content(event,trigger,player){ + yujuex: { + audio: "yujue", + async content(event, trigger, player) { await player.disableEquip(lib.skill.yujue_backup.position); - if(player.isIn()&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); - })){ - const result = await player.chooseTarget(true,'选择一名角色交给你一张牌并获得技能〖执笏〗',function(card,player,target){ - if(player==target) return false; - return target.countCards('h')>0; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target)*target.countCards('h'); - }).forResult(); - if(result.bool){ - var target=result.targets[0]; - event.target=target; + if ( + player.isIn() && + game.hasPlayer(function (current) { + return current != player && current.countCards("h"); + }) + ) { + const result = await player + .chooseTarget( + true, + "选择一名角色交给你一张牌并获得技能〖执笏〗", + function (card, player, target) { + if (player == target) return false; + return target.countCards("h") > 0; + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) * target.countCards("h"); + }) + .forResult(); + if (result.bool) { + var target = result.targets[0]; + event.target = target; player.line(target); - const result2 = await target.chooseCard('h',true,'交给'+get.translation(player)+'一张手牌').forResult(); - if(result2.bool&&result2.cards&&result2.cards.length){ - await target.give(result2.cards,player); - target.storage.zhihu_mark=player; - await target.addSkills('zhihu'); - target.addSkill('zhihu_mark'); + const result2 = await target + .chooseCard("h", true, "交给" + get.translation(player) + "一张手牌") + .forResult(); + if (result2.bool && result2.cards && result2.cards.length) { + await target.give(result2.cards, player); + target.storage.zhihu_mark = player; + await target.addSkills("zhihu"); + target.addSkill("zhihu_mark"); } } } }, }, - zhihu:{ - usable:2, - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - return player!=event.player; + zhihu: { + usable: 2, + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + return player != event.player; }, - content:function(){ + content: function () { player.draw(2); }, }, - zhihu_mark:{ - mark:'character', - intro:{ - content:'以$之名,授予汝技能〖执笏〗,直至$的下回合开始为止!', + zhihu_mark: { + mark: "character", + intro: { + content: "以$之名,授予汝技能〖执笏〗,直至$的下回合开始为止!", }, - onremove:function(player){ + onremove: function (player) { delete player.storage.zhihu_mark; - player.removeSkills('zhihu'); + player.removeSkills("zhihu"); }, - trigger:{global:'phaseBeginStart'}, - firstDo:true, - charlotte:true, - silent:true, - filter:function(event,player){ - return event.player==player.storage.zhihu_mark; + trigger: { global: "phaseBeginStart" }, + firstDo: true, + charlotte: true, + silent: true, + filter: function (event, player) { + return event.player == player.storage.zhihu_mark; }, - content:function(){ - player.removeSkill('zhihu_mark'); + content: function () { + player.removeSkill("zhihu_mark"); }, }, - tuxing:{ - audio:2, - trigger:{player:'disableEquipAfter'}, - forced:true, - content:function(){ - 'step 0' + tuxing: { + audio: 2, + trigger: { player: "disableEquipAfter" }, + forced: true, + content: function () { + "step 0"; player.gainMaxHp(); player.recover(); - 'step 1' - if(!player.hasEnabledSlot()){ + ("step 1"); + if (!player.hasEnabledSlot()) { player.loseMaxHp(4); - player.addSkill('tuxing2'); + player.addSkill("tuxing2"); } - } + }, }, - tuxing2:{ - audio:'tuxing', - trigger:{source:'damageBegin1'}, - forced:true, - charlotte:true, - content:function(){ + tuxing2: { + audio: "tuxing", + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + content: function () { trigger.num++; }, - mark:true, - intro:{ - content:'造成伤害时,此伤害+1', + mark: true, + intro: { + content: "造成伤害时,此伤害+1", }, }, - gongjian:{ - audio:2, - trigger:{global:'useCardToPlayered'}, - usable:1, - logTarget:function(event){ - return event.parent.gongjian_targets.filter(function(target){ - return event.targets.includes(target)&&target.countCards('he')>0; + gongjian: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + usable: 1, + logTarget: function (event) { + return event.parent.gongjian_targets.filter(function (target) { + return event.targets.includes(target) && target.countCards("he") > 0; }); }, - filter:function(event,player){ - if(event.card.name!='sha'||!event.isFirstTarget) return false; - if(event.parent.gongjian_targets&&event.parent.gongjian_targets.filter(function(target){ - return event.targets.includes(target)&&target.countCards('he')>0; - }).length>0) return true; + filter: function (event, player) { + if (event.card.name != "sha" || !event.isFirstTarget) return false; + if ( + event.parent.gongjian_targets && + event.parent.gongjian_targets.filter(function (target) { + return event.targets.includes(target) && target.countCards("he") > 0; + }).length > 0 + ) + return true; return false; }, - check:function(event,player){ - var targets=event.parent.gongjian_targets.filter(function(target){ - return event.targets.includes(target)&&target.countCards('he')>0; - }),att=0; - for(var i of targets){ - att+=get.attitude(player,i); + check: function (event, player) { + var targets = event.parent.gongjian_targets.filter(function (target) { + return event.targets.includes(target) && target.countCards("he") > 0; + }), + att = 0; + for (var i of targets) { + att += get.attitude(player, i); } - return att<0; + return att < 0; }, - content:function(){ - 'step 0' - event.targets=trigger.parent.gongjian_targets.filter(function(target){ + content: function () { + "step 0"; + event.targets = trigger.parent.gongjian_targets.filter(function (target) { return trigger.targets.includes(target); }); - event.num=0; - 'step 1' - var target=targets[num]; - player.discardPlayerCard(target,true,'he',[1,2]).set('forceAuto',true); - 'step 2' + event.num = 0; + ("step 1"); + var target = targets[num]; + player.discardPlayerCard(target, true, "he", [1, 2]).set("forceAuto", true); + ("step 2"); event.num++; - if(event.num0; + kuimang: { + audio: 2, + trigger: { global: "dieAfter" }, + forced: true, + filter: function (event, player) { + return ( + player.getAllHistory("sourceDamage", function (target) { + return target.player == event.player; + }).length > 0 + ); }, - content:function(){ + content: function () { player.draw(2); }, }, - rexiemu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return !game.hasPlayer(function(current){ - return current.hasMark('rexiemu'); + rexiemu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return !game.hasPlayer(function (current) { + return current.hasMark("rexiemu"); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('rexiemu'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target)*Math.sqrt(Math.max(1+player.countCards('h'),1+target.countCards('h'))); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('rexiemu',target); - target.addMark('rexiemu',1); - player.addSkill('rexiemu2'); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rexiemu"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + return ( + get.attitude(player, target) * + Math.sqrt(Math.max(1 + player.countCards("h"), 1 + target.countCards("h"))) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("rexiemu", target); + target.addMark("rexiemu", 1); + player.addSkill("rexiemu2"); } }, - intro:{content:'mark'}, - ai:{ - expose:0.1, + intro: { content: "mark" }, + ai: { + expose: 0.1, }, }, - rexiemu2:{ - audio:'rexiemu', - trigger:{global:['loseAfter']}, - forced:true, - charlotte:true, - usable:1, - filter:function(event,player){ - return (event.player==player||event.player.hasMark('rexiemu'))&&['useCard','respond'].includes(event.getParent().name)&&event.hs&&event.hs.length&& - event.player!=_status.currentPhase&&game.hasPlayer(function(current){ - return current.hasMark('rexiemu'); - }); + rexiemu2: { + audio: "rexiemu", + trigger: { global: ["loseAfter"] }, + forced: true, + charlotte: true, + usable: 1, + filter: function (event, player) { + return ( + (event.player == player || event.player.hasMark("rexiemu")) && + ["useCard", "respond"].includes(event.getParent().name) && + event.hs && + event.hs.length && + event.player != _status.currentPhase && + game.hasPlayer(function (current) { + return current.hasMark("rexiemu"); + }) + ); }, - content:function(){ - 'step 0' - game.asyncDraw(game.filterPlayer(function(current){ - return current==player||current==trigger.player||current.hasMark('rexiemu'); - })); - 'step 1' + content: function () { + "step 0"; + game.asyncDraw( + game.filterPlayer(function (current) { + return ( + current == player || current == trigger.player || current.hasMark("rexiemu") + ); + }) + ); + ("step 1"); game.delayx(); }, - group:'rexiemu3', + group: "rexiemu3", }, - rexiemu3:{ - trigger:{player:'phaseBegin'}, - forced:true, - charlotte:true, - silent:true, - firstDo:true, - content:function(){ - player.removeSkill('rexiemu2'); - game.countPlayer(function(current){ - var num=current.countMark('rexiemu'); - if(num) current.removeMark('rexiemu',num); + rexiemu3: { + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + silent: true, + firstDo: true, + content: function () { + player.removeSkill("rexiemu2"); + game.countPlayer(function (current) { + var num = current.countMark("rexiemu"); + if (num) current.removeMark("rexiemu", num); }); }, }, - heli:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return lib.skill.heli.filterTarget(null,player,current); + heli: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return lib.skill.heli.filterTarget(null, player, current); }); }, - filterTarget:function(card,player,target){ - return target.countCards('h')=1&&number<=13; + content: function () { + "step 0"; + var number = trigger.getl(player).cards2[0].number; + var numbers = [number - 2, number - 1, number, number + 1, number + 2].filter(function ( + number + ) { + return number >= 1 && number <= 13; }); - if(player.isUnderControl()){ + if (player.isUnderControl()) { game.swapPlayerAuto(player); } - var switchToAuto=function(){ - _status.imchoosing=false; - event._result={ - bool:true, - suit:lib.suit.randomGet(), - number:numbers.randomGet(), + var switchToAuto = function () { + _status.imchoosing = false; + event._result = { + bool: true, + suit: lib.suit.randomGet(), + number: numbers.randomGet(), }; - if(event.dialog) event.dialog.close(); - if(event.control) event.control.close(); + if (event.dialog) event.dialog.close(); + if (event.control) event.control.close(); }; - var chooseButton=function(player,numbers){ - var event=_status.event; - player=player||event.player; - if(!event._result) event._result={}; - var dialog=ui.create.dialog('是否发动【墨影】?','forcebutton','hidden'); - event.dialog=dialog; - dialog.addText('花色'); - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; - var listi=['spade','heart','club','diamond']; - for(var i=0;i'; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - var current=this.parentNode.querySelector('.bluebg'); - if(current){ - current.classList.remove('bluebg'); + td.innerHTML = "" + get.translation(listi[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); } - this.classList.add('bluebg'); - event._result.suit=link; + this.classList.add("bluebg"); + event._result.suit = link; }); } dialog.content.appendChild(table); - dialog.addText('点数'); - var table2=document.createElement('div'); - table2.classList.add('add-setting'); - table2.style.margin='0'; - table2.style.width='100%'; - table2.style.position='relative'; - for(var i=0;i'; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - var current=this.parentNode.querySelector('.bluebg'); - if(current){ - current.classList.remove('bluebg'); + td.innerHTML = "" + num + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); } - this.classList.add('bluebg'); - event._result.number=link; + this.classList.add("bluebg"); + event._result.number = link; }); } dialog.content.appendChild(table2); - dialog.add('  '); + dialog.add("  "); event.dialog.open(); - event.switchToAuto=function(){ - event._result={ - bool:true, - number:numbers.randomGet(), - suit:lib.suit.randomGet(), + event.switchToAuto = function () { + event._result = { + bool: true, + number: numbers.randomGet(), + suit: lib.suit.randomGet(), }; event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }; - event.control=ui.create.control('ok','cancel2',function(link){ - var result=event._result; - if(link=='cancel2') result.bool=false; - else{ - if(!result.number||!result.suit) return; - result.bool=true; + event.control = ui.create.control("ok", "cancel2", function (link) { + var result = event._result; + if (link == "cancel2") result.bool = false; + else { + if (!result.number || !result.suit) return; + result.bool = true; } event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }); - for(var i=0;i0&&player.countCards('hs')>0; + group: "juanhui3", + enable: "phaseUse", + filter: function (event, player) { + return player.getStorage("juanhui3").length > 0 && player.countCards("hs") > 0; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('绢绘',[player.getStorage('juanhui3'),'vcard'],'hidden') + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("绢绘", [player.getStorage("juanhui3"), "vcard"], "hidden"); }, - filter:function(button,player){ - return lib.filter.cardEnabled({ - name:button.link[2], - nature:button.link[3], - },player,_status.event.getParent()); + filter: function (button, player) { + return lib.filter.cardEnabled( + { + name: button.link[2], + nature: button.link[3], + }, + player, + _status.event.getParent() + ); }, - check:function(button){ - var player=_status.event.player; - var card={ - name:button.link[2], - nature:button.link[3], + check: function (button) { + var player = _status.event.player; + var card = { + name: button.link[2], + nature: button.link[3], }; - if(player.getUseValue(card)>0) return get.order(card); + if (player.getUseValue(card) > 0) return get.order(card); return -1; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'juanhui', - popname:true, - filterCard:true, - position:'hs', - viewAs:{ - name:links[0][2], - nature:links[0][3], + audio: "juanhui", + popname: true, + filterCard: true, + position: "hs", + viewAs: { + name: links[0][2], + nature: links[0][3], }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - precontent:function(){ - var card=event.result.card; - if(card.name=='sha') event.getParent().addCount=false; - var vcard=player.storage.juanhui3; - for(var i=0;i0){ - var order2=get.order(card); - if(order2>order) order=order2 + ai: { + order: function (item, player) { + var muniu = player.getStorage("juanhui3"); + var order = 0; + for (var i = 0; i < muniu.length; i++) { + var card = { name: muniu[i][2], nature: muniu[i][3] }; + if (player.getUseValue(card) > 0) { + var order2 = get.order(card); + if (order2 > order) order = order2; } } - return order+0.1; + return order + 0.1; }, - result:{ - player:1, + result: { + player: 1, }, }, }, - juanhui3:{ - charlotte:true, - firstDo:true, - trigger:{ - global:'useCard2', - player:['phaseUseEnd','phaseUseSkipped','useCardAfter'], + juanhui3: { + charlotte: true, + firstDo: true, + trigger: { + global: "useCard2", + player: ["phaseUseEnd", "phaseUseSkipped", "useCardAfter"], }, - silent:true, - filter:function(event,player,name){ - if(event.name=='phaseUse') return true; - else if(name=='useCardAfter') return event.getParent().juanhui; - return event.player==player.storage.juanhui2&&event.player.isPhaseUsing()&& - ['basic','trick'].includes(get.type(event.card))&&player.getStorage('juanhui3').filter(function(vcard){ - return vcard[2]==event.card.name; - }).length==0; + silent: true, + filter: function (event, player, name) { + if (event.name == "phaseUse") return true; + else if (name == "useCardAfter") return event.getParent().juanhui; + return ( + event.player == player.storage.juanhui2 && + event.player.isPhaseUsing() && + ["basic", "trick"].includes(get.type(event.card)) && + player.getStorage("juanhui3").filter(function (vcard) { + return vcard[2] == event.card.name; + }).length == 0 + ); }, - content:function(){ - if(trigger.name=='phaseUse') player.removeSkill('juanhui2'); - else if(event.triggername=='useCardAfter'){ + content: function () { + if (trigger.name == "phaseUse") player.removeSkill("juanhui2"); + else if (event.triggername == "useCardAfter") { player.recover(); player.drawTo(3); - } - else{ - var vcard=[get.type(trigger.card),'',trigger.card.name]; - if(game.hasNature(trigger.card)) vcard.push(get.nature(trigger.card)); + } else { + var vcard = [get.type(trigger.card), "", trigger.card.name]; + if (game.hasNature(trigger.card)) vcard.push(get.nature(trigger.card)); player.storage.juanhui3.push(vcard); - player.markSkill('juanhui2'); + player.markSkill("juanhui2"); } }, }, - mubing:{ - audio:2, - audioname:['sp_key_yuri'], - trigger:{player:'phaseUseBegin'}, + mubing: { + audio: 2, + audioname: ["sp_key_yuri"], + trigger: { player: "phaseUseBegin" }, //direct:true, - frequent:true, - filter:function(event,player){ - return player.countCards('he')>0; + frequent: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - var num=player.storage.mubing2?4:3; - event.num=num; - event.cards=game.cardsGotoOrdering(get.cards(num)).cards; - game.log(player,'展示了',event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - var str=get.translation(player)+'发动了【募兵】'; - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - game.addVideo('showCards',player,[get.translation(player)+'发动了【募兵】',get.cardsInfo(event.cards)]); + content: function () { + "step 0"; + var num = player.storage.mubing2 ? 4 : 3; + event.num = num; + event.cards = game.cardsGotoOrdering(get.cards(num)).cards; + game.log(player, "展示了", event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str = get.translation(player) + "发动了【募兵】"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [ + get.translation(player) + "发动了【募兵】", + get.cardsInfo(event.cards), + ]); game.delay(2); - 'step 1' - var numa=0; - cards.sort(function(a,b){ - return a.number-b.number; + ("step 1"); + var numa = 0; + cards.sort(function (a, b) { + return a.number - b.number; }); - for(var i of cards){ - if(get.value(i,player)>0) numa+=get.number(i); + for (var i of cards) { + if (get.value(i, player) > 0) numa += get.number(i); } - player.chooseToDiscard([1,Infinity],'h').set('ai',function(card){ - var player=_status.event.player; - var numa=_status.event.numa; - //if(card.name!='tengjia'&&get.position(card)=='e'&&get.equipValue(card,player)<=0) return 14; - var num=0; - for(var i of ui.selected.cards){ - num+=i.number; - } - if(num>=numa) return 0; - if(card.number+num>=numa) return 15-get.value(card); - if(!ui.selected.cards.length){ - var min=_status.event.min; - if(card.numbermin; - })) return 0; - return card.number; - } - return Math.max(5-get.value(card),card.number); - }).set('prompt',false).set('numa',numa).set('min',cards[0].number); - var func=function(id){ - var dialog=get.idDialog(id); - if(dialog) dialog.content.firstChild.innerHTML='请选择要弃置的牌'; + player + .chooseToDiscard([1, Infinity], "h") + .set("ai", function (card) { + var player = _status.event.player; + var numa = _status.event.numa; + //if(card.name!='tengjia'&&get.position(card)=='e'&&get.equipValue(card,player)<=0) return 14; + var num = 0; + for (var i of ui.selected.cards) { + num += i.number; + } + if (num >= numa) return 0; + if (card.number + num >= numa) return 15 - get.value(card); + if (!ui.selected.cards.length) { + var min = _status.event.min; + if ( + card.number < min && + !player.countCards("h", function (xcard) { + return xcard != card && card.number + xcard.number > min; + }) + ) + return 0; + return card.number; + } + return Math.max(5 - get.value(card), card.number); + }) + .set("prompt", false) + .set("numa", numa) + .set("min", cards[0].number); + var func = function (id) { + var dialog = get.idDialog(id); + if (dialog) dialog.content.firstChild.innerHTML = "请选择要弃置的牌"; }; - if(player==game.me) func(event.videoId); - else if(player.isOnline()) player.send(func,event.videoId); - 'step 2' - if(!result.bool){ + if (player == game.me) func(event.videoId); + else if (player.isOnline()) player.send(func, event.videoId); + ("step 2"); + if (!result.bool) { return; } - var numx=0; - for(var i of result.cards){ - numx+=get.number(i); + var numx = 0; + for (var i of result.cards) { + numx += get.number(i); } - event.numx=numx; - var next=player.chooseButton([0,num]); - next.set('dialog',event.videoId); - next.set('filterButton',function(button){ - var num=0 - for(var i=0;i0; + ziqu: { + audio: 2, + audioname: ["sp_key_yuri"], + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return ( + event.player != player && + !player.getStorage("ziqu").includes(event.player) && + event.player.countCards("he") > 0 + ); }, - check:function(event,player){ - var target=event.player; - var eff=get.damageEffect(target,player,player); - if(get.attitude(player,target)>0){ - if(eff>=0) return false; + check: function (event, player) { + var target = event.player; + var eff = get.damageEffect(target, player, player); + if (get.attitude(player, target) > 0) { + if (eff >= 0) return false; return true; } - if(eff<=0) return true; - if(target.hp==1) return false; - if(event.num>1) return false; - var cards=target.getCards('he'); - for(var i=0;i10) return true; + if (eff <= 0) return true; + if (target.hp == 1) return false; + if (event.num > 1) return false; + var cards = target.getCards("he"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) > 10) return true; } return false; }, - logTarget:'player', - content:function(){ - 'step 0' + logTarget: "player", + content: function () { + "step 0"; trigger.cancel(); - if(!player.storage.ziqu) player.storage.ziqu=[]; + if (!player.storage.ziqu) player.storage.ziqu = []; player.storage.ziqu.push(trigger.player); - player.markSkill('ziqu'); - trigger.player.chooseCard(true,'he',function(card,player){ - return !player.countCards('he',function(cardx){ - return cardx.number>card.number; + player.markSkill("ziqu"); + trigger.player.chooseCard(true, "he", function (card, player) { + return !player.countCards("he", function (cardx) { + return cardx.number > card.number; }); }); - 'step 1' - if(result.bool&&result.cards&&result.cards.length) trigger.player.give(result.cards,player); + ("step 1"); + if (result.bool && result.cards && result.cards.length) + trigger.player.give(result.cards, player); }, - intro:{content:'已对$发动过'}, + intro: { content: "已对$发动过" }, }, - mubing_rewrite:{ - mark:true, - intro:{ - content:'出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。', + mubing_rewrite: { + mark: true, + intro: { + content: + "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。", }, }, - diaoling:{ - audio:2, - audioname:['sp_key_yuri'], - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'metal', - filter:function(event,player){ - var num=0; - player.getAllHistory('gain',function(evt){ - var evt2=evt.getParent(); - if(evt2.name=='mubing'&&evt2.player==player) num+=evt.cards.filter(function(card){ - return card.name=='sha'||get.subtype(card,false)=='equip1'||(get.type2(card,false)=='trick'&&get.tag({name:card.name},'damage')); - }).length; + diaoling: { + audio: 2, + audioname: ["sp_key_yuri"], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "metal", + filter: function (event, player) { + var num = 0; + player.getAllHistory("gain", function (evt) { + var evt2 = evt.getParent(); + if (evt2.name == "mubing" && evt2.player == player) + num += evt.cards.filter(function (card) { + return ( + card.name == "sha" || + get.subtype(card, false) == "equip1" || + (get.type2(card, false) == "trick" && + get.tag({ name: card.name }, "damage")) + ); + }).length; }); - return num>=6; + return num >= 6; }, - content:function(){ - player.awakenSkill('diaoling'); - player.storage.mubing2=true; - player.markSkill('mubing_rewrite'); - player.chooseDrawRecover(2,true); + content: function () { + player.awakenSkill("diaoling"); + player.storage.mubing2 = true; + player.markSkill("mubing_rewrite"); + player.chooseDrawRecover(2, true); }, - derivation:'mubing_rewrite', + derivation: "mubing_rewrite", }, - refenyin_wufan:{audio:2}, + refenyin_wufan: { audio: 2 }, //官渡之战 - xiying:{ - trigger:{player:'phaseUseBegin'}, - audio:2, - direct:true, - filter:function(event,player){ - return player.countCards('h',function(card){ - return _status.connectMode||get.type(card)!='basic'; - })>0; + xiying: { + trigger: { player: "phaseUseBegin" }, + audio: 2, + direct: true, + filter: function (event, player) { + return ( + player.countCards("h", function (card) { + return _status.connectMode || get.type(card) != "basic"; + }) > 0 + ); }, - content:function(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current!=player; + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current != player; }); list.sortBySeat(); - event.targets=list; - player.chooseToDiscard(get.prompt2('xiying'),'h',function(card){ - return get.type(card)!='basic'; - }).set('logSkill',['xiying',list]).set('ai',function(card){ - return _status.event.val-get.value(card) - }).set('val',function(){ - return 4*Math.sqrt(game.countPlayer(function(current){ - return get.attitude(player,current)<0&¤t.countCards('he')>0; - })); - }()); - 'step 1' - if(!result.bool) event.finish(); - else player.addTempSkill('xiying_gain'); - 'step 2' - var target=targets.shift(); - event.target=target; - if(target.isIn()) target.chooseToDiscard('he','弃置一张牌,或本回合内不能使用或打出牌').set('ai',function(card){ - var player=_status.event.player; - var source=_status.event.getTrigger().player; - if(get.attitude(source,player)>0) return -1; - if(_status.event.getRand()>0.5) return 5-get.value(card); - return -1; - }); - 'step 3' - if(target.isIn()&&!result.bool) target.addTempSkill('xiying2'); - if(targets.length) event.goto(2); + event.targets = list; + player + .chooseToDiscard(get.prompt2("xiying"), "h", function (card) { + return get.type(card) != "basic"; + }) + .set("logSkill", ["xiying", list]) + .set("ai", function (card) { + return _status.event.val - get.value(card); + }) + .set( + "val", + (function () { + return ( + 4 * + Math.sqrt( + game.countPlayer(function (current) { + return ( + get.attitude(player, current) < 0 && + current.countCards("he") > 0 + ); + }) + ) + ); + })() + ); + ("step 1"); + if (!result.bool) event.finish(); + else player.addTempSkill("xiying_gain"); + ("step 2"); + var target = targets.shift(); + event.target = target; + if (target.isIn()) + target + .chooseToDiscard("he", "弃置一张牌,或本回合内不能使用或打出牌") + .set("ai", function (card) { + var player = _status.event.player; + var source = _status.event.getTrigger().player; + if (get.attitude(source, player) > 0) return -1; + if (_status.event.getRand() > 0.5) return 5 - get.value(card); + return -1; + }); + ("step 3"); + if (target.isIn() && !result.bool) target.addTempSkill("xiying2"); + if (targets.length) event.goto(2); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg.target.hasSkill('xiying2'); + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.target.hasSkill("xiying2"); }, }, - subSkill:{ - gain:{ - trigger:{player:'phaseJieshuBegin'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.getHistory('sourceDamage',function(evt){ - return evt.isPhaseUsing(player); - }).length>0; + subSkill: { + gain: { + trigger: { player: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getHistory("sourceDamage", function (evt) { + return evt.isPhaseUsing(player); + }).length > 0 + ); }, - content:function(){ - var card=get.cardPile2(function(card){ - var type=get.type(card,false); - if(type!='basic'&&type!='trick') return false; - return get.tag(card,'damage')>0; + content: function () { + var card = get.cardPile2(function (card) { + var type = get.type(card, false); + if (type != "basic" && type != "trick") return false; + return get.tag(card, "damage") > 0; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); }, }, }, }, - xiying2:{ - mark:true, - intro:{content:'本回合内不能使用或打出牌'}, - mod:{ - cardEnabled2:function(card){ + xiying2: { + mark: true, + intro: { content: "本回合内不能使用或打出牌" }, + mod: { + cardEnabled2: function (card) { return false; }, }, }, - gangzhi:{ - audio:2, - trigger:{ - player:'damageBefore', - source:'damageBefore', + gangzhi: { + audio: 2, + trigger: { + player: "damageBefore", + source: "damageBefore", }, - forced:true, - filter:function(event,player){ - if(event.source==event.player) return false; - if(event.player==player){ - return event.source&&event.source.isIn(); + forced: true, + filter: function (event, player) { + if (event.source == event.player) return false; + if (event.player == player) { + return event.source && event.source.isIn(); } return true; }, - content:function(){ + content: function () { trigger.cancel(); trigger.player.loseHp(trigger.num); }, - ai:{ - jueqing:true, + ai: { + jueqing: true, }, }, - beizhan:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - audio:2, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('beizhan')).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - var hs=target.countCards('h'); - var ht=target.maxHp; - if(hs>=ht&&target.isMaxHandcard()) return -att*hs; - if(hsht; - })) return att*2*(ht-hs); + beizhan: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("beizhan")).set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + var hs = target.countCards("h"); + var ht = target.maxHp; + if (hs >= ht && target.isMaxHandcard()) return -att * hs; + if ( + hs < ht && + game.hasPlayer(function (current) { + return current.countCards("h") > ht; + }) + ) + return att * 2 * (ht - hs); return 0; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('beizhan',target); - target.drawTo(Math.min(5,target.maxHp)) - target.addSkill('beizhan2'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("beizhan", target); + target.drawTo(Math.min(5, target.maxHp)); + target.addSkill("beizhan2"); } }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, - beizhan2:{ - trigger:{player:'phaseBegin'}, - silent:true, - firstDo:true, - content:function(){ - player.removeSkill('beizhan2'); - if(player.isMaxHandcard()) player.addTempSkill('zishou2'); + beizhan2: { + trigger: { player: "phaseBegin" }, + silent: true, + firstDo: true, + content: function () { + player.removeSkill("beizhan2"); + if (player.isMaxHandcard()) player.addTempSkill("zishou2"); }, - mark:true, - intro:{content:'回合开始时,若手牌数为全场最多,则回合内不能使用牌指定其他角色为目标'}, + mark: true, + intro: { content: "回合开始时,若手牌数为全场最多,则回合内不能使用牌指定其他角色为目标" }, }, - fenglve:{ - audio:2, - trigger:{ - player:"phaseUseBegin", + fenglve: { + audio: 2, + trigger: { + player: "phaseUseBegin", }, - direct:true, - content:function(){ - 'step 0' - var goon=player.hasCard(function(card){ - if(get.position(card)!="h") return false; - var val=get.value(card); - if(val<0) return true; - if(val<=5){ - return card.number>=12; + direct: true, + content: function () { + "step 0"; + var goon = player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 12; } - if(val<=6){ - return card.number>=13; + if (val <= 6) { + return card.number >= 13; } return false; }); - player.chooseTarget(get.prompt2('fenglve'),function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - if(!_status.event.goon) return 0; - return -get.attitude(player,target)*(1+target.countCards('e'))/(1+target.countCards('j')); - }).set('goon',goon); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('fenglve',target); + player + .chooseTarget(get.prompt2("fenglve"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + return ( + (-get.attitude(player, target) * (1 + target.countCards("e"))) / + (1 + target.countCards("j")) + ); + }) + .set("goon", goon); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("fenglve", target); player.chooseToCompare(target); - } - else{ + } else { event.finish(); } - 'step 2' - if(result.bool){ - var num=0; - if(target.countCards('h')) num++; - if(target.countCards('e')) num++; - if(target.countCards('j')) num++; - if(num){ - event.gainner=player; - event.giver=target; - target.choosePlayerCard(target,num,'hej',true).set('filterButton',function(button){ - for(var i=0;i0; + return get.attitude(player, target) * get.value(card, target, "raw") > 0; }, - filter:function(event,player){ - if(event.targets) return false; - var card,target; - if(player==event.player){ - card=event.card1; - target=event.target; + filter: function (event, player) { + if (event.targets) return false; + var card, target; + if (player == event.player) { + card = event.card1; + target = event.target; + } else { + card = event.card2; + target = event.player; } - else{ - card=event.card2; - target=event.player; - } - return get.position(card,true)=='o'; + return get.position(card, true) == "o"; }, - prompt:function(event,player){ - var card,target; - if(player==event.player){ - card=event.card1; - target=event.target; + prompt: function (event, player) { + var card, target; + if (player == event.player) { + card = event.card1; + target = event.target; + } else { + card = event.card2; + target = event.player; } - else{ - card=event.card2; - target=event.player; - } - return '是否发动【锋略】,令'+get.translation(target)+'获得'+get.translation(card)+'?' + return ( + "是否发动【锋略】,令" + + get.translation(target) + + "获得" + + get.translation(card) + + "?" + ); }, - logTarget:function(event,player){ + logTarget: function (event, player) { var target; - if(player==event.player){ - target=event.target; - } - else{ - target=event.player; + if (player == event.player) { + target = event.target; + } else { + target = event.player; } return target; }, - content:function(){ - var card,target; - if(player==trigger.player){ - card=trigger.card1; - target=trigger.target; + content: function () { + var card, target; + if (player == trigger.player) { + card = trigger.card1; + target = trigger.target; + } else { + card = trigger.card2; + target = trigger.player; } - else{ - card=trigger.card2; - target=trigger.player; - } - target.gain(card,'gain2','log'); + target.gain(card, "gain2", "log"); }, }, - mouzhi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0 + mouzhi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - filterTarget:function(card,player,target){ - if(target.storage.mouzhi2&&target.storage.mouzhi2.includes(player)) return false; - return target!=player; + filterCard: true, + filterTarget: function (card, player, target) { + if (target.storage.mouzhi2 && target.storage.mouzhi2.includes(player)) return false; + return target != player; }, - delay:0, - lose:false, - discard:false, - check:function(card){ - if(card.name=='du') return 20; - var player=_status.event.player; - var useval=player.getUseValue(card); - var maxval=0; - game.countPlayer(function(current){ - if(current!=player&&!current.hasSkillTag('nogain')&&get.attitude(player,current)>0){ - var temp=current.getUseValue(card); - if(temp>maxval) maxval=temp; + delay: 0, + lose: false, + discard: false, + check: function (card) { + if (card.name == "du") return 20; + var player = _status.event.player; + var useval = player.getUseValue(card); + var maxval = 0; + game.countPlayer(function (current) { + if ( + current != player && + !current.hasSkillTag("nogain") && + get.attitude(player, current) > 0 + ) { + var temp = current.getUseValue(card); + if (temp > maxval) maxval = temp; } }); - if(maxval>0&&get.tag(card,'damage')) return 15; - if(maxval>useval) return 10; - if(player.needsToDiscard()) return 1/Math.max(0.1,get.value(card)); + if (maxval > 0 && get.tag(card, "damage")) return 15; + if (maxval > useval) return 10; + if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); return -1; }, - content:function(){ - player.give(cards,target); - target.addTempSkill('mouzhi2',{player:'phaseEnd'}); + content: function () { + player.give(cards, target); + target.addTempSkill("mouzhi2", { player: "phaseEnd" }); target.storage.mouzhi2.add(player); target.storage.mouzhi2.sortBySeat(target); - target.markSkill('mouzhi2'); + target.markSkill("mouzhi2"); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(ui.selected.cards.length){ - var card=ui.selected.cards[0]; - if(card.name=='du') return target.hasSkill('lucia_duqu')?1:-1; - var t=target.getUseValue(card); - var p=player.getUseValue(card); - if(t>p) return 2; - if(t>0) return 1.5 - if(player.needsToDiscard()) return 1; + ai: { + order: 10, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; + var t = target.getUseValue(card); + var p = player.getUseValue(card); + if (t > p) return 2; + if (t > 0) return 1.5; + if (player.needsToDiscard()) return 1; return 0; } return 0; @@ -8144,83 +10172,87 @@ game.import('character', function () { }, }, }, - mouzhi2:{ - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + mouzhi2: { + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - onremove:true, - trigger:{source:'damageSource'}, - forced:true, - intro:{ - content:'出牌阶段内第一次对一名其他角色造成伤害时,$摸一张牌', + onremove: true, + trigger: { source: "damageSource" }, + forced: true, + intro: { + content: "出牌阶段内第一次对一名其他角色造成伤害时,$摸一张牌", }, - filter:function(event,player){ - var evt2=event.getParent('phaseUse'); - if(!evt2||evt2.player!=player) return false; - var history=event.player.getHistory('damage',function(evt){ - return evt.source==player&&evt.getParent('phaseUse')==evt2; + filter: function (event, player) { + var evt2 = event.getParent("phaseUse"); + if (!evt2 || evt2.player != player) return false; + var history = event.player.getHistory("damage", function (evt) { + return evt.source == player && evt.getParent("phaseUse") == evt2; }); - return history[0]==event; + return history[0] == event; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; game.asyncDraw(player.storage.mouzhi2); - 'step 1' + ("step 1"); game.delay(); }, }, - yuanlve:{ - enable:'phaseUse', - usable:1, - audio:2, - filter:function(event,player){ - return player.countCards('h',function(card){ - return get.type(card)!='equip'; - }) + yuanlve: { + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h", function (card) { + return get.type(card) != "equip"; + }); }, - filterCard:function(card){ - return get.type(card)!='equip'; + filterCard: function (card) { + return get.type(card) != "equip"; }, - filterTarget:lib.filter.notMe, - delay:false, - discard:false, - lose:false, - check:function(card){ - if(card.name=='du') return 20; - var player=_status.event.player; - var useval=player.getUseValue(card); - var maxval=0; - game.countPlayer(function(current){ - if(current!=player&&!current.hasSkillTag('nogain')&&get.attitude(player,current)>0){ - var temp=current.getUseValue(card); - if(temp>maxval) maxval=temp; + filterTarget: lib.filter.notMe, + delay: false, + discard: false, + lose: false, + check: function (card) { + if (card.name == "du") return 20; + var player = _status.event.player; + var useval = player.getUseValue(card); + var maxval = 0; + game.countPlayer(function (current) { + if ( + current != player && + !current.hasSkillTag("nogain") && + get.attitude(player, current) > 0 + ) { + var temp = current.getUseValue(card); + if (temp > maxval) maxval = temp; } }); - if(maxval>useval) return 15; - if(maxval>0) return 10; - if(player.needsToDiscard()) return 1/Math.max(0.1,get.value(card)); + if (maxval > useval) return 15; + if (maxval > 0) return 10; + if (player.needsToDiscard()) return 1 / Math.max(0.1, get.value(card)); return -1; }, - content:function(){ - 'step 0' - player.give(cards,target); - 'step 1' + content: function () { + "step 0"; + player.give(cards, target); + ("step 1"); target.chooseUseTarget(cards[0]); - 'step 2' - if(result.bool) player.draw(); + ("step 2"); + if (result.bool) player.draw(); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(ui.selected.cards.length){ - var card=ui.selected.cards[0]; - if(card.name=='du') return target.hasSkill('lucia_duqu')?1:-1; - var t=target.getUseValue(card); - var p=player.getUseValue(card); - if(t>p) return 2; - if(t>0) return 1.5 - if(player.needsToDiscard()) return 1; + ai: { + order: 10, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + var card = ui.selected.cards[0]; + if (card.name == "du") return target.hasSkill("lucia_duqu") ? 1 : -1; + var t = target.getUseValue(card); + var p = player.getUseValue(card); + if (t > p) return 2; + if (t > 0) return 1.5; + if (player.needsToDiscard()) return 1; return 0; } return 0; @@ -8229,3600 +10261,4312 @@ game.import('character', function () { }, }, //吕旷吕翔和淳于琼和官渡哔哔机 - spshicai:{ - audio:2, - enable:'phaseUse', - position:'he', - filter:function(event,player){ - return !player.storage.spshicai2||!player.getCards('h').includes(player.storage.spshicai2); + spshicai: { + audio: 2, + enable: "phaseUse", + position: "he", + filter: function (event, player) { + return ( + !player.storage.spshicai2 || !player.getCards("h").includes(player.storage.spshicai2) + ); }, - filterCard:true, - prompt:function(){ - var str='弃置一张牌,然后获得'; - if(get.itemtype(_status.pileTop)=='card') str+=get.translation(_status.pileTop); - else str+='牌堆顶的一张牌'; + filterCard: true, + prompt: function () { + var str = "弃置一张牌,然后获得"; + if (get.itemtype(_status.pileTop) == "card") str += get.translation(_status.pileTop); + else str += "牌堆顶的一张牌"; return str; }, - check:function(card){ - var player=_status.event.player; - var cardx=_status.pileTop; - if(get.itemtype(cardx)!='card') return 0; - var val=player.getUseValue(cardx,null,true); - if(!val) return 0; - var val2=player.getUseValue(card,null,true); - return (val-val2)/Math.max(0.1,get.value(card)); + check: function (card) { + var player = _status.event.player; + var cardx = _status.pileTop; + if (get.itemtype(cardx) != "card") return 0; + var val = player.getUseValue(cardx, null, true); + if (!val) return 0; + var val2 = player.getUseValue(card, null, true); + return (val - val2) / Math.max(0.1, get.value(card)); }, - content:function(){ - var card=get.cards()[0]; - player.storage.spshicai2=card; - player.gain(card,'draw'); - game.log(player,'获得了牌堆顶的一张牌'); + content: function () { + var card = get.cards()[0]; + player.storage.spshicai2 = card; + player.gain(card, "draw"); + game.log(player, "获得了牌堆顶的一张牌"); }, - group:'spshicai_mark', - ai:{ - order:1, - result:{player:1}, + group: "spshicai_mark", + ai: { + order: 1, + result: { player: 1 }, }, }, - spshicai_mark:{ - trigger:{player:'phaseUseBegin'}, - silent:true, - firstDo:true, - content:function(){ - player.addTempSkill('spshicai2','phaseUseEnd'); + spshicai_mark: { + trigger: { player: "phaseUseBegin" }, + silent: true, + firstDo: true, + content: function () { + player.addTempSkill("spshicai2", "phaseUseEnd"); }, }, - spshicai2:{ - onremove:true, - mark:true, - intro:{ - mark:function(dialog,content,player){ - if(player!=game.me) return get.translation(player)+'观看牌堆中...'; - if(get.itemtype(_status.pileTop)!='card') return '牌堆顶无牌'; + spshicai2: { + onremove: true, + mark: true, + intro: { + mark: function (dialog, content, player) { + if (player != game.me) return get.translation(player) + "观看牌堆中..."; + if (get.itemtype(_status.pileTop) != "card") return "牌堆顶无牌"; dialog.add([_status.pileTop]); }, }, }, - spfushi:{ - group:['zezhu','chenggong'], - derivation:['zezhu','chenggong'], - locked:true, + spfushi: { + group: ["zezhu", "chenggong"], + derivation: ["zezhu", "chenggong"], + locked: true, }, - zezhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var enemy=0; - var friend=0; - var zhu=0; - for(var i of game.players){ - if(i.isEnemyOf(player)) enemy++; + zezhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var enemy = 0; + var friend = 0; + var zhu = 0; + for (var i of game.players) { + if (i.isEnemyOf(player)) enemy++; else friend++; - if(i!=player&&i.isZhu) zhu++; + if (i != player && i.isZhu) zhu++; } - return zhu>0&&enemy 0 && enemy < friend; }, - filterTarget:function(card,player,target){ - return target!=player&&target.isZhu; + filterTarget: function (card, player, target) { + return target != player && target.isZhu; }, - selectTarget:-1, - multiline:true, - multitarget:true, - content:function(){ - 'step 0' + selectTarget: -1, + multiline: true, + multitarget: true, + content: function () { + "step 0"; event.targets.sortBySeat(); - event.targets2=event.targets.slice(0); - 'step 1' - var target=event.targets2.shift(); - if(target.countGainableCards(player,'he')>0) player.gainPlayerCard(target,'he',true); + event.targets2 = event.targets.slice(0); + ("step 1"); + var target = event.targets2.shift(); + if (target.countGainableCards(player, "he") > 0) + player.gainPlayerCard(target, "he", true); else player.draw(); - if(event.targets2.length) event.redo(); - 'step 2' - if(player.countCards('he')>=targets.length){ - player.chooseCard('he',true,'依次选择'+get.cnNumber(targets.length)+'张牌,分别交给'+get.translation(targets),targets.length).set('ai',function(card){ - var target=_status.event.getParent().targets[ui.selected.cards.length]; - var player=_status.event.player; - return get.attitude(player,target)*get.value(card,target); - }); - } - else event.finish(); - 'step 3' - var list=[]; - for(var i=0;i= targets.length) { + player + .chooseCard( + "he", + true, + "依次选择" + + get.cnNumber(targets.length) + + "张牌,分别交给" + + get.translation(targets), + targets.length + ) + .set("ai", function (card) { + var target = _status.event.getParent().targets[ui.selected.cards.length]; + var player = _status.event.player; + return get.attitude(player, target) * get.value(card, target); + }); + } else event.finish(); + ("step 3"); + var list = []; + for (var i = 0; i < targets.length; i++) { + list.push([targets[i], result.cards[i]]); } game.loseAsync({ - gain_list:list, - giver:player, - player:player, - cards:result.cards, - animate:'giveAuto', - }).setContent('gaincardMultiple'); + gain_list: list, + giver: player, + player: player, + cards: result.cards, + animate: "giveAuto", + }).setContent("gaincardMultiple"); }, - ai:{ - order:6, - result:{player:1}, + ai: { + order: 6, + result: { player: 1 }, }, }, - chenggong:{ - audio:2, - trigger:{global:'useCardToPlayered'}, - filter:function(event,player){ - if(!(event.isFirstTarget&&event.targets&&event.targets.length>1&&event.player.isIn())) return false; - var enemy=0; - var friend=0; - for(var i of game.players){ - if(i.isEnemyOf(player)) enemy++; + chenggong: { + audio: 2, + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if ( + !( + event.isFirstTarget && + event.targets && + event.targets.length > 1 && + event.player.isIn() + ) + ) + return false; + var enemy = 0; + var friend = 0; + for (var i of game.players) { + if (i.isEnemyOf(player)) enemy++; else friend++; } - return enemy>friend; + return enemy > friend; }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.player.draw(); }, }, - cangchu:{ - trigger:{ - global:'phaseBefore', - player:['damageEnd','enterGame'], + cangchu: { + trigger: { + global: "phaseBefore", + player: ["damageEnd", "enterGame"], }, - audio:2, - forced:true, - filter:function(event,player){ - if(event.name!='damage') return (event.name!='phase'||game.phaseNumber==0); - return event.hasNature('fire')&&player.countMark('cangchu')>0; + audio: 2, + forced: true, + filter: function (event, player) { + if (event.name != "damage") return event.name != "phase" || game.phaseNumber == 0; + return event.hasNature("fire") && player.countMark("cangchu") > 0; }, - content:function(){ - if(trigger.name!='damage') player.addMark('cangchu',3); - else{ - player.removeMark('cangchu',Math.min(trigger.num,player.countMark('cangchu'))); - if(!player.hasMark('cangchu')) event.trigger('cangchuAwaken'); + content: function () { + if (trigger.name != "damage") player.addMark("cangchu", 3); + else { + player.removeMark("cangchu", Math.min(trigger.num, player.countMark("cangchu"))); + if (!player.hasMark("cangchu")) event.trigger("cangchuAwaken"); } }, - marktext:'粮', - intro:{ - name2:'粮', - content:'mark', + marktext: "粮", + intro: { + name2: "粮", + content: "mark", }, - ai:{ - threaten:function(player,target){ - return 1+target.countMark('cangchu')/2; + ai: { + threaten: function (player, target) { + return 1 + target.countMark("cangchu") / 2; }, - effect:{ - target:function(card,player,target,current){ - if(target.hasMark('cangchu')){ - if(card.name=='sha'){ - if(lib.skill.global.includes('huoshaowuchao')||game.hasNature(card,'fire')||player.hasSkill('zhuque_skill')) return 2; + effect: { + target: function (card, player, target, current) { + if (target.hasMark("cangchu")) { + if (card.name == "sha") { + if ( + lib.skill.global.includes("huoshaowuchao") || + game.hasNature(card, "fire") || + player.hasSkill("zhuque_skill") + ) + return 2; } - if(get.tag(card,'fireDamage')&¤t<0) return 2; + if (get.tag(card, "fireDamage") && current < 0) return 2; } - } + }, }, - combo:'liangying' + combo: "liangying", }, }, - sushou:{ - audio:2, - trigger:{player:'phaseDiscardBegin'}, - frequent:true, - async content(event,trigger,player){ - await player.draw(1+player.countMark('cangchu')); - const num=Math.min(player.countCards('h'),player.countCards('he'),game.countPlayer(target=>target!=player&&target.isFriendOf(player))); - if(num){ - let list=[]; - if(_status.connectMode) game.broadcastAll(()=>_status.noclearcountdown=true); - while(num-list.length>0){ - const {result:{bool,targets,cards}}=await player.chooseCardTarget({ - prompt:'宿守:你可以交给友方角色各一张牌', - position:'he', - animate:false, - filterCard(card,player){ - return !get.event('list').some(list=>list[1]==card); - }, - filterTarget(card,player,target){ - return target!=player&&target.isFriendOf(player)&&!get.event('list').some(list=>list[0]==target); - }, - ai1(card){ - if(card.name=='shan') return 1; - return Math.random(); - }, - ai2(target){ - return get.attitude(get.event('player'),target); - }, - }).set('list',list); - if(bool){ - list.push([targets[0],cards[0]]); - player.addGaintag(cards,'olsujian_given'); - } - else break; + sushou: { + audio: 2, + trigger: { player: "phaseDiscardBegin" }, + frequent: true, + async content(event, trigger, player) { + await player.draw(1 + player.countMark("cangchu")); + const num = Math.min( + player.countCards("h"), + player.countCards("he"), + game.countPlayer((target) => target != player && target.isFriendOf(player)) + ); + if (num) { + let list = []; + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + while (num - list.length > 0) { + const { + result: { bool, targets, cards }, + } = await player + .chooseCardTarget({ + prompt: "宿守:你可以交给友方角色各一张牌", + position: "he", + animate: false, + filterCard(card, player) { + return !get.event("list").some((list) => list[1] == card); + }, + filterTarget(card, player, target) { + return ( + target != player && + target.isFriendOf(player) && + !get.event("list").some((list) => list[0] == target) + ); + }, + ai1(card) { + if (card.name == "shan") return 1; + return Math.random(); + }, + ai2(target) { + return get.attitude(get.event("player"), target); + }, + }) + .set("list", list); + if (bool) { + list.push([targets[0], cards[0]]); + player.addGaintag(cards, "olsujian_given"); + } else break; } - if(_status.connectMode){ - game.broadcastAll(()=>{ + if (_status.connectMode) { + game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose(); }); } - if(list.length){ - await game.loseAsync({ - gain_list:list, - player:player, - cards:list.slice().map(list=>list[1]), - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); + if (list.length) { + await game + .loseAsync({ + gain_list: list, + player: player, + cards: list.slice().map((list) => list[1]), + giver: player, + animate: "giveAuto", + }) + .setContent("gaincardMultiple"); } } }, }, - liangying:{ - trigger:{ - global:'phaseDrawBegin2', - player:'cangchuAwaken', + liangying: { + trigger: { + global: "phaseDrawBegin2", + player: "cangchuAwaken", }, - forced:true, - audio:1, - logTarget:function(event,player){ - if(event.name=='phaseDraw') return event.player; - return game.filterPlayer(function(current){ + forced: true, + audio: 1, + logTarget: function (event, player) { + if (event.name == "phaseDraw") return event.player; + return game.filterPlayer(function (current) { return current.isEnemyOf(player); }); }, - filter:function(event,player){ - if(event.name=='cangchu') return true; - return player.hasMark('cangchu')&&!event.numFixed&&event.player.isFriendOf(player); + filter: function (event, player) { + if (event.name == "cangchu") return true; + return player.hasMark("cangchu") && !event.numFixed && event.player.isFriendOf(player); }, - content:function(){ - 'step 0' - if(trigger.name=='cangchu'){ + content: function () { + "step 0"; + if (trigger.name == "cangchu") { player.loseMaxHp(); - var list=game.filterPlayer(function(current){ + var list = game.filterPlayer(function (current) { return current.isEnemyOf(player); }); - if(list.length){ - game.asyncDraw(list,2); + if (list.length) { + game.asyncDraw(list, 2); } - } - else{ + } else { trigger.num++; event.finish(); } - 'step 1' + ("step 1"); game.delay(); }, - ai:{ - combo:'cangchu' - } - }, - liehou:{ - enable:'phaseUse', - usable:1, - audio:2, - filterTarget:function(card,player,target){ - return player.inRange(target)&&target.countCards('h'); + ai: { + combo: "cangchu", }, - content:function(){ - 'step 0' - target.chooseCard('h',true,'交给'+get.translation(player)+'一张牌'); - 'step 1' - if(result.bool){ - target.give(result.cards,player); - } - else event.finish(); - 'step 2' - if(player.countCards('h')&&game.hasPlayer(function(current){ - return current!=target&&player.inRange(current); - })){ + }, + liehou: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterTarget: function (card, player, target) { + return player.inRange(target) && target.countCards("h"); + }, + content: function () { + "step 0"; + target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌"); + ("step 1"); + if (result.bool) { + target.give(result.cards, player); + } else event.finish(); + ("step 2"); + if ( + player.countCards("h") && + game.hasPlayer(function (current) { + return current != target && player.inRange(current); + }) + ) { player.chooseCardTarget({ - position:'h', - filterCard:true, - filterTarget:function(card,player,target){ - return target!=_status.event.getParent().target&&player.inRange(target); + position: "h", + filterCard: true, + filterTarget: function (card, player, target) { + return target != _status.event.getParent().target && player.inRange(target); }, - forced:true, - prompt:'将一张手牌交给一名攻击范围内的其他角色', - ai1:function(card){ - var player=_status.event.player; - if(get.name(card)=='du') return 20; - if(game.hasPlayer(function(current){ - return current!=_status.event.getParent().target&&player.inRange(current)&&get.attitude(player,current)>0&¤t.getUseValue(card)>player.getUseValue(card)&¤t.getUseValue(card)>player.getUseValue(card); - })) return 12; - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })){ - if(card.name=='wuxie') return 11; - if(card.name=='shan'&&player.countCards('h','shan')>1) return 9 + forced: true, + prompt: "将一张手牌交给一名攻击范围内的其他角色", + ai1: function (card) { + var player = _status.event.player; + if (get.name(card) == "du") return 20; + if ( + game.hasPlayer(function (current) { + return ( + current != _status.event.getParent().target && + player.inRange(current) && + get.attitude(player, current) > 0 && + current.getUseValue(card) > player.getUseValue(card) && + current.getUseValue(card) > player.getUseValue(card) + ); + }) + ) + return 12; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) { + if (card.name == "wuxie") return 11; + if (card.name == "shan" && player.countCards("h", "shan") > 1) return 9; } - return 6/Math.max(1,get.value(card)); + return 6 / Math.max(1, get.value(card)); }, - ai2:function(target){ - var player=_status.event.player; - var card=ui.selected.cards[0]; - var att=get.attitude(player,target); - if(card.name=='du') return -6*att; - if(att>0){ - if(get.position(card)=='h'&&target.getUseValue(card)>player.getUseValue(card)) return 4*att; - if(get.value(card,target)>get.value(card,player)) return 2*att; - return 1.2*att; + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (card.name == "du") return -6 * att; + if (att > 0) { + if ( + get.position(card) == "h" && + target.getUseValue(card) > player.getUseValue(card) + ) + return 4 * att; + if (get.value(card, target) > get.value(card, player)) return 2 * att; + return 1.2 * att; } - return -att*Math.min(4,target.countCards('he'))/6; + return (-att * Math.min(4, target.countCards("he"))) / 6; }, }); - } - else event.finish(); - 'step 3' - if(result.bool) player.give(result.cards,result.targets[0]); + } else event.finish(); + ("step 3"); + if (result.bool) player.give(result.cards, result.targets[0]); }, - ai:{ - order:6, - result:{ - target:-1, + ai: { + order: 6, + result: { + target: -1, }, }, }, - qigong:{ - trigger:{player:'shaMiss'}, - direct:true, - audio:2, - filter:function(event,player){ - return event.target.isIn()&&game.hasPlayer(function(current){ - return current!=event.target&¤t.canUse('sha',event.target,false); - }) + qigong: { + trigger: { player: "shaMiss" }, + direct: true, + audio: 2, + filter: function (event, player) { + return ( + event.target.isIn() && + game.hasPlayer(function (current) { + return current != event.target && current.canUse("sha", event.target, false); + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('qigong'),'令一名角色可再对'+get.translation(trigger.target)+'使用一张【杀】',function(card,player,target){ - var source=_status.event.getTrigger().target; - return target!=source&&target.canUse('sha',source,false); - }).set('ai',function(target){ - var player=_status.event.player,card={name:'sha'},source=_status.event.getTrigger().target; - if(target.hasSha()){ - var eff1=get.effect(source,card,target,target); - if(eff1>0) return get.effect(source,card,target,player); - } - return (target!=player)?(Math.random()*get.attitude(player,target)):0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('qigong',target); - target.addTempSkill('qigong_ai','chooseToUseEnd'); - target.chooseToUse('是否再对'+get.translation(trigger.target)+'使用一张【杀】?',function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },trigger.target,-1).set('addCount',false).set('oncard',function(){ - _status.event.directHit.addArray(game.players); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("qigong"), + "令一名角色可再对" + get.translation(trigger.target) + "使用一张【杀】", + function (card, player, target) { + var source = _status.event.getTrigger().target; + return target != source && target.canUse("sha", source, false); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + card = { name: "sha" }, + source = _status.event.getTrigger().target; + if (target.hasSha()) { + var eff1 = get.effect(source, card, target, target); + if (eff1 > 0) return get.effect(source, card, target, player); + } + return target != player ? Math.random() * get.attitude(player, target) : 0; }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qigong", target); + target.addTempSkill("qigong_ai", "chooseToUseEnd"); + target + .chooseToUse( + "是否再对" + get.translation(trigger.target) + "使用一张【杀】?", + function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, + trigger.target, + -1 + ) + .set("addCount", false) + .set("oncard", function () { + _status.event.directHit.addArray(game.players); + }); } }, - subSkill:{ - ai:{ - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg.card&&arg.card.name=='sha'; + subSkill: { + ai: { + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.card && arg.card.name == "sha"; }, }, }, }, }, //和沙摩柯一起上线的新服三将 - spjiedao:{ - audio:2, - trigger:{ - source:"damageBegin1", + spjiedao: { + audio: 2, + trigger: { + source: "damageBegin1", }, - filter:function(event,player){ - return player.isDamaged()&&!player.getHistory('sourceDamage').length; + filter: function (event, player) { + return player.isDamaged() && !player.getHistory("sourceDamage").length; }, - logTarget:'player', - direct:true, - check:function(trigger,player){ - if(get.attitude(player,trigger.player)>=-1) return false; - return !trigger.player.hasSkillTag('filterDamage',null,{ - player:player, - card:trigger.card, + logTarget: "player", + direct: true, + check: function (trigger, player) { + if (get.attitude(player, trigger.player) >= -1) return false; + return !trigger.player.hasSkillTag("filterDamage", null, { + player: player, + card: trigger.card, }); }, - content:function(){ - "step 0" - var num=player.getDamagedHp(); - var map={}; - var list=[]; - for(var i=1;i<=num;i++){ - var cn=get.cnNumber(i,true); - map[cn]=i; + content: function () { + "step 0"; + var num = player.getDamagedHp(); + var map = {}; + var list = []; + for (var i = 1; i <= num; i++) { + var cn = get.cnNumber(i, true); + map[cn] = i; list.push(cn); } - event.map=map; - player.chooseControl(list,'cancel2',function(){ - if(!lib.skill.spjiedao.check(_status.event.getTrigger(),player)) return 'cancel2'; - return get.cnNumber(_status.event.goon,true); - }).set('prompt',get.prompt2('spjiedao',trigger.player)).set('goon',num); - "step 1" - if(result.control=='cancel2') return; - player.logSkill('spjiedao',trigger.player); - var num=event.map[result.control]||1; - trigger.num+=num; - var next=game.createEvent('spjiedao_after',null,trigger.getParent()); - next.player=player; - next.target=trigger.player; - next.num=num; - next.setContent(function(){ - if(target.isIn()) player.chooseToDiscard(num,true,'he'); + event.map = map; + player + .chooseControl(list, "cancel2", function () { + if (!lib.skill.spjiedao.check(_status.event.getTrigger(), player)) + return "cancel2"; + return get.cnNumber(_status.event.goon, true); + }) + .set("prompt", get.prompt2("spjiedao", trigger.player)) + .set("goon", num); + ("step 1"); + if (result.control == "cancel2") return; + player.logSkill("spjiedao", trigger.player); + var num = event.map[result.control] || 1; + trigger.num += num; + var next = game.createEvent("spjiedao_after", null, trigger.getParent()); + next.player = player; + next.target = trigger.player; + next.num = num; + next.setContent(function () { + if (target.isIn()) player.chooseToDiscard(num, true, "he"); }); }, }, - biaozhao:{ - audio:2, - intro:{ - content:"expansion", - markcount:'expansion', + biaozhao: { + audio: 2, + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - trigger:{ - player:"phaseJieshuBegin", + trigger: { + player: "phaseJieshuBegin", }, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0&&!player.getExpansions('biaozhao').length; + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0 && !player.getExpansions("biaozhao").length; }, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('biaozhao'),'将一张牌置于武将牌上作为“表”').ai=function(card){ - return 6-get.value(card); - } - 'step 1' - if(result.bool){ - player.logSkill('biaozhao'); - player.addToExpansion(result.cards,player,'give').gaintag.add('biaozhao'); + content: function () { + "step 0"; + player.chooseCard("he", get.prompt("biaozhao"), "将一张牌置于武将牌上作为“表”").ai = + function (card) { + return 6 - get.value(card); + }; + ("step 1"); + if (result.bool) { + player.logSkill("biaozhao"); + player.addToExpansion(result.cards, player, "give").gaintag.add("biaozhao"); } }, - ai:{ - notemp:true, + ai: { + notemp: true, }, - group:['biaozhao2','biaozhao3'], + group: ["biaozhao2", "biaozhao3"], }, - biaozhao2:{ - trigger:{ - global:["loseAsyncAfter","loseAfter","cardsDiscardAfter"], + biaozhao2: { + trigger: { + global: ["loseAsyncAfter", "loseAfter", "cardsDiscardAfter"], }, - forced:true, - audio:"biaozhao", - filter:function(event,player){ - if(event.name=='loseAsyncAfter'&&event.type!='discard') return false; - if(event.name=='lose'&&(event.getlx===false||event.position!=ui.discardPile)) return false; - var cards=player.getExpansions('biaozhao'); - if(!cards.length) return false; - var suit=get.suit(cards[0]); - var num=get.number(cards[0]); - var cards=event.getd(); - for(var card of cards){ - if(get.suit(card)==suit&&get.number(card)==num) return true; + forced: true, + audio: "biaozhao", + filter: function (event, player) { + if (event.name == "loseAsyncAfter" && event.type != "discard") return false; + if (event.name == "lose" && (event.getlx === false || event.position != ui.discardPile)) + return false; + var cards = player.getExpansions("biaozhao"); + if (!cards.length) return false; + var suit = get.suit(cards[0]); + var num = get.number(cards[0]); + var cards = event.getd(); + for (var card of cards) { + if (get.suit(card) == suit && get.number(card) == num) return true; } return false; }, - content:function(){ - "step 0" - var card=player.getExpansions('biaozhao')[0]; - if(trigger.getParent().name=='discard'){ - trigger.player.gain(card,player,'give','bySelf'); - } - else{ + content: function () { + "step 0"; + var card = player.getExpansions("biaozhao")[0]; + if (trigger.getParent().name == "discard") { + trigger.player.gain(card, player, "give", "bySelf"); + } else { player.loseToDiscardpile(card); } - "step 1" + ("step 1"); player.loseHp(); }, }, - biaozhao3:{ - trigger:{ - player:"phaseZhunbeiBegin", + biaozhao3: { + trigger: { + player: "phaseZhunbeiBegin", }, - forced:true, - charlotte:true, - audio:"biaozhao", - filter:function(event,player){ - return player.getExpansions('biaozhao').length>0; + forced: true, + charlotte: true, + audio: "biaozhao", + filter: function (event, player) { + return player.getExpansions("biaozhao").length > 0; }, - content:function(){ - "step 0" - var card=player.getExpansions('biaozhao')[0]; + content: function () { + "step 0"; + var card = player.getExpansions("biaozhao")[0]; player.loseToDiscardpile(card); - "step 1" - event.num=0; - game.countPlayer(function(current){ - if(current.countCards('h')>event.num) event.num=current.countCards('h'); + ("step 1"); + event.num = 0; + game.countPlayer(function (current) { + if (current.countCards("h") > event.num) event.num = current.countCards("h"); }); - player.chooseTarget('是否令一名角色将手牌摸至'+event.num+'张并回复1点体力?').ai=function(target){ - var num=Math.min(event.num-target.countCards('h'),5); - if(target.isDamaged()) num++; - return num*get.attitude(_status.event.player,target); - }; - "step 2" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - var draw=Math.min(num-target.countCards('h'),5); - if(draw) target.draw(draw); + player.chooseTarget("是否令一名角色将手牌摸至" + event.num + "张并回复1点体力?").ai = + function (target) { + var num = Math.min(event.num - target.countCards("h"), 5); + if (target.isDamaged()) num++; + return num * get.attitude(_status.event.player, target); + }; + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + var draw = Math.min(num - target.countCards("h"), 5); + if (draw) target.draw(draw); target.recover(); } }, }, - yechou:{ - audio:2, - trigger:{ - player:"die", + yechou: { + audio: 2, + trigger: { + player: "die", }, - direct:true, - forceDie:true, - skillAnimation:true, - animationColor:'wood', - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('yechou'),function(card,player,target){ - return player!=target&&target.getDamagedHp()>1 - }).set('forceDie',true).set('ai',function(target){ - let att=get.attitude(_status.event.player,target); - if(att>0) return 0; - att=Math.sqrt(0.01-att); - return att*(get.distance(_status.currentPhase,target,'absolute')||game.players.length); - }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('yechou',target); - player.line(target,'green'); - target.addTempSkill('yechou2',{player:'phaseZhunbeiBegin'}); + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yechou"), function (card, player, target) { + return player != target && target.getDamagedHp() > 1; + }) + .set("forceDie", true) + .set("ai", function (target) { + let att = get.attitude(_status.event.player, target); + if (att > 0) return 0; + att = Math.sqrt(0.01 - att); + return ( + att * + (get.distance(_status.currentPhase, target, "absolute") || + game.players.length) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("yechou", target); + player.line(target, "green"); + target.addTempSkill("yechou2", { player: "phaseZhunbeiBegin" }); } }, - ai:{ - expose:0.5, - maixie_defend:true + ai: { + expose: 0.5, + maixie_defend: true, }, }, - "yechou2":{ - mark:true, - marktext:"仇", - intro:{ - content:"每个回合结束时失去1点体力直到回合开始", + yechou2: { + mark: true, + marktext: "仇", + intro: { + content: "每个回合结束时失去1点体力直到回合开始", }, - trigger:{ - global:"phaseAfter", + trigger: { + global: "phaseAfter", + }, + forced: true, + content: function () { + player.loseHp(); }, - forced:true, - content:function(){player.loseHp()}, }, - yanjiao:{ - audio:2, - ai:{ - order:10, - result:{ - player:1, - target:1.1, + yanjiao: { + audio: 2, + ai: { + order: 10, + result: { + player: 1, + target: 1.1, }, }, - enable:"phaseUse", - usable:1, - filterTarget:function(card,player,target){ - return target!=player; + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; }, - content:function(){ - "step 0" - var num=4; - if(player.storage.xingshen){ - num+=player.storage.xingshen; - player.storage.xingshen=0; - player.unmarkSkill('xingshen'); + content: function () { + "step 0"; + var num = 4; + if (player.storage.xingshen) { + num += player.storage.xingshen; + player.storage.xingshen = 0; + player.unmarkSkill("xingshen"); } - if(player.storage.olxingshen){ - num+=player.storage.olxingshen; - player.storage.olxingshen=0; - player.unmarkSkill('olxingshen'); + if (player.storage.olxingshen) { + num += player.storage.olxingshen; + player.storage.olxingshen = 0; + player.unmarkSkill("olxingshen"); } - num=Math.min(10,num); - event.cards=get.cards(num); + num = Math.min(10, num); + event.cards = get.cards(num); game.cardsGotoOrdering(event.cards); player.showCards(event.cards); - "step 1" - event.getedResult=lib.skill.yanjiao.getResult(cards); - if(!event.getedResult.length){ - player.addTempSkill('yanjiao2'); + ("step 1"); + event.getedResult = lib.skill.yanjiao.getResult(cards); + if (!event.getedResult.length) { + player.addTempSkill("yanjiao2"); event.finish(); } - "step 2" - target.chooseControl("自动分配","手动分配").set("prompt","【严教】:是否让系统自动分配方案?").ai=function(){ + ("step 2"); + target + .chooseControl("自动分配", "手动分配") + .set("prompt", "【严教】:是否让系统自动分配方案?").ai = function () { return 0; }; - "step 3" - if(result.control=="手动分配"){ + ("step 3"); + if (result.control == "手动分配") { event.goto(8); } - "step 4" - event.index=0; - event.togain=event.getedResult[event.index]; - target.showCards(event.togain[0],get.translation(target)+'分出的第一份牌'); - "step 5" - target.showCards(event.togain[1],get.translation(target)+'分出的第二份牌'); - "step 6" - target.chooseControl().set('choiceList',[ - '获得'+get.translation(event.togain[0]), - '获得'+get.translation(event.togain[1]) - ]).ai=function(){return Math.random()<0.5?1:0}; - "step 7" - var list=[ - [target,event.togain[result.index]], - [player,event.togain[1-result.index]] + ("step 4"); + event.index = 0; + event.togain = event.getedResult[event.index]; + target.showCards(event.togain[0], get.translation(target) + "分出的第一份牌"); + ("step 5"); + target.showCards(event.togain[1], get.translation(target) + "分出的第二份牌"); + ("step 6"); + target + .chooseControl() + .set("choiceList", [ + "获得" + get.translation(event.togain[0]), + "获得" + get.translation(event.togain[1]), + ]).ai = function () { + return Math.random() < 0.5 ? 1 : 0; + }; + ("step 7"); + var list = [ + [target, event.togain[result.index]], + [player, event.togain[1 - result.index]], ]; game.loseAsync({ - gain_list:list, - giver:target, - animate:'gain2', - }).setContent('gaincardMultiple'); - if(event.togain[2].length>1) player.addTempSkill('yanjiao2'); + gain_list: list, + giver: target, + animate: "gain2", + }).setContent("gaincardMultiple"); + if (event.togain[2].length > 1) player.addTempSkill("yanjiao2"); event.finish(); - "step 8" - var next=target.chooseToMove('严教:分出点数相等的两组牌'); - next.set('chooseTime',(cards.length*4).toString()); - next.set('list',[ - ['未分配',cards,function(list){ - var num=0; - for(var i of list) num+=i.number; - return '未分配(点数和'+num+')'; - }], - ['第一组',[],function(list){ - var num=0; - for(var i of list) num+=i.number; - return '第一组(点数和'+num+')'; - }], - ['第二组',[],function(list){ - var num=0; - for(var i of list) num+=i.number; - return '第二组(点数和'+num+')'; - }], + ("step 8"); + var next = target.chooseToMove("严教:分出点数相等的两组牌"); + next.set("chooseTime", (cards.length * 4).toString()); + next.set("list", [ + [ + "未分配", + cards, + function (list) { + var num = 0; + for (var i of list) num += i.number; + return "未分配(点数和" + num + ")"; + }, + ], + [ + "第一组", + [], + function (list) { + var num = 0; + for (var i of list) num += i.number; + return "第一组(点数和" + num + ")"; + }, + ], + [ + "第二组", + [], + function (list) { + var num = 0; + for (var i of list) num += i.number; + return "第二组(点数和" + num + ")"; + }, + ], ]); - next.set('filterOk',function(moved){ - var num1=0; - for(var i of moved[1]) num1+=i.number; - if(num1==0) return false; - var num2=0; - for(var i of moved[2]) num2+=i.number; - return num1==num2; - }) - next.set('processAI',()=>false); - "step 9" - if(result.bool){ - var moved=result.moved; - event.getedResult=[[moved[1],moved[2],moved[0]]]; + next.set("filterOk", function (moved) { + var num1 = 0; + for (var i of moved[1]) num1 += i.number; + if (num1 == 0) return false; + var num2 = 0; + for (var i of moved[2]) num2 += i.number; + return num1 == num2; + }); + next.set("processAI", () => false); + ("step 9"); + if (result.bool) { + var moved = result.moved; + event.getedResult = [[moved[1], moved[2], moved[0]]]; event.goto(4); - } - else{ - player.addTempSkill('yanjiao2'); + } else { + player.addTempSkill("yanjiao2"); } }, - getResult:function(cards){ - var cl=cards.length; - var maxmium=Math.pow(3,cl); - var filter=function(list){ - if(!list[1].length||!list[0].length) return false; - var num1=0; - for(var i=0;i4) player.storage.xingshen=4; - player.markSkill('xingshen'); + frequent: true, + content: function () { + player.draw(player.isMinHandcard() ? 2 : 1); + if (!player.storage.xingshen) player.storage.xingshen = 0; + player.storage.xingshen += player.isMinHp() ? 2 : 1; + if (player.storage.xingshen > 4) player.storage.xingshen = 4; + player.markSkill("xingshen"); }, }, - pingjian:{ - initList:function(){ - var list=[]; - if(_status.connectMode) list=get.charactersOL(); - else{ - var list=[]; - for(var i in lib.character){ - if(!lib.filter.characterDisabled2(i)&&!lib.filter.characterDisabled(i)) list.push(i); + pingjian: { + initList: function () { + var list = []; + if (_status.connectMode) list = get.charactersOL(); + else { + var list = []; + for (var i in lib.character) { + if (!lib.filter.characterDisabled2(i) && !lib.filter.characterDisabled(i)) + list.push(i); } } - game.countPlayer2(function(current){ + game.countPlayer2(function (current) { list.remove(current.name); list.remove(current.name1); list.remove(current.name2); }); - _status.characterlist=list; + _status.characterlist = list; }, - init:function(player){ - player.addSkill('pingjian_check'); - if(!player.storage.pingjian_check) player.storage.pingjian_check={}; + init: function (player) { + player.addSkill("pingjian_check"); + if (!player.storage.pingjian_check) player.storage.pingjian_check = {}; }, - audio:2, - trigger:{player:['damageEnd','phaseJieshuBegin']}, - frequent:true, - content:function(){ - 'step 0' - if(!_status.characterlist){ + audio: 2, + trigger: { player: ["damageEnd", "phaseJieshuBegin"] }, + frequent: true, + content: function () { + "step 0"; + if (!_status.characterlist) { lib.skill.pingjian.initList(); } - var allList=_status.characterlist.slice(0); - game.countPlayer(function(current){ - if(current.name&&lib.character[current.name]&¤t.name.indexOf('gz_shibing')!=0&¤t.name.indexOf('gz_jun_')!=0) allList.add(current.name); - if(current.name1&&lib.character[current.name1]&¤t.name1.indexOf('gz_shibing')!=0&¤t.name1.indexOf('gz_jun_')!=0) allList.add(current.name1); - if(current.name2&&lib.character[current.name2]&¤t.name2.indexOf('gz_shibing')!=0&¤t.name2.indexOf('gz_jun_')!=0) allList.add(current.name2); + var allList = _status.characterlist.slice(0); + game.countPlayer(function (current) { + if ( + current.name && + lib.character[current.name] && + current.name.indexOf("gz_shibing") != 0 && + current.name.indexOf("gz_jun_") != 0 + ) + allList.add(current.name); + if ( + current.name1 && + lib.character[current.name1] && + current.name1.indexOf("gz_shibing") != 0 && + current.name1.indexOf("gz_jun_") != 0 + ) + allList.add(current.name1); + if ( + current.name2 && + lib.character[current.name2] && + current.name2.indexOf("gz_shibing") != 0 && + current.name2.indexOf("gz_jun_") != 0 + ) + allList.add(current.name2); }); - var list=[]; - var skills=[]; - var map=[]; + var list = []; + var skills = []; + var map = []; allList.randomSort(); - var name2=event.triggername; - for(var i=0;i2) break; + if (list.length > 2) break; } - if(skills.length){ - event.list=list; - player.chooseControl(skills).set('dialog',['评鉴:请选择尝试发动的技能',[list,'character']]); - } - else event.finish(); - 'step 1' - player.markAuto('pingjian',[result.control]); + if (skills.length) { + event.list = list; + player + .chooseControl(skills) + .set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); + } else event.finish(); + ("step 1"); + player.markAuto("pingjian", [result.control]); player.addTempSkill(result.control); - player.storage.pingjian_check[result.control]=(trigger.name=='damage'?trigger:'phaseJieshu'); - var name=event.list.find(name=>lib.character[name][3].includes(result.control)); + player.storage.pingjian_check[result.control] = + trigger.name == "damage" ? trigger : "phaseJieshu"; + var name = event.list.find((name) => lib.character[name][3].includes(result.control)); // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); - if(name) game.broadcastAll((player,name)=>player.tempname.add(name),player,name); + if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); }, - group:'pingjian_use', - phaseUse_special:[], - ai:{threaten:5}, + group: "pingjian_use", + phaseUse_special: [], + ai: { threaten: 5 }, }, - pingjian_use:{ - audio:'pingjian', - enable:'phaseUse', - usable:1, - prompt:()=>lib.translate.pingjian_info, - content:function(){ - 'step 0' - var list=[]; - var skills=[]; - var map=[]; - var evt=event.getParent(2); - if(!_status.characterlist){ + pingjian_use: { + audio: "pingjian", + enable: "phaseUse", + usable: 1, + prompt: () => lib.translate.pingjian_info, + content: function () { + "step 0"; + var list = []; + var skills = []; + var map = []; + var evt = event.getParent(2); + if (!_status.characterlist) { lib.skill.pingjian.initList(); } - var allList=_status.characterlist.slice(0); - game.countPlayer(function(current){ - if(current.name&&lib.character[current.name]&¤t.name.indexOf('gz_shibing')!=0&¤t.name.indexOf('gz_jun_')!=0) allList.add(current.name); - if(current.name1&&lib.character[current.name1]&¤t.name1.indexOf('gz_shibing')!=0&¤t.name1.indexOf('gz_jun_')!=0) allList.add(current.name1); - if(current.name2&&lib.character[current.name2]&¤t.name2.indexOf('gz_shibing')!=0&¤t.name2.indexOf('gz_jun_')!=0) allList.add(current.name2); + var allList = _status.characterlist.slice(0); + game.countPlayer(function (current) { + if ( + current.name && + lib.character[current.name] && + current.name.indexOf("gz_shibing") != 0 && + current.name.indexOf("gz_jun_") != 0 + ) + allList.add(current.name); + if ( + current.name1 && + lib.character[current.name1] && + current.name1.indexOf("gz_shibing") != 0 && + current.name1.indexOf("gz_jun_") != 0 + ) + allList.add(current.name1); + if ( + current.name2 && + lib.character[current.name2] && + current.name2.indexOf("gz_shibing") != 0 && + current.name2.indexOf("gz_jun_") != 0 + ) + allList.add(current.name2); }); allList.randomSort(); - for(var i=0;i2) break; + if (list.length > 2) break; } - if(skills.length){ - event.list=list; - player.chooseControl(skills).set('dialog',['评鉴:请选择尝试发动的技能',[list,'character']]); - } - else event.finish(); - 'step 1' - player.markAuto('pingjian',[result.control]); + if (skills.length) { + event.list = list; + player + .chooseControl(skills) + .set("dialog", ["评鉴:请选择尝试发动的技能", [list, "character"]]); + } else event.finish(); + ("step 1"); + player.markAuto("pingjian", [result.control]); player.addTempSkill(result.control); - player.storage.pingjian_check[result.control]='phaseUse'; - var name=event.list.find(name=>lib.character[name][3].includes(result.control)); + player.storage.pingjian_check[result.control] = "phaseUse"; + var name = event.list.find((name) => lib.character[name][3].includes(result.control)); // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); - if(name) game.broadcastAll((player,name)=>player.tempname.add(name),player,name); + if (name) game.broadcastAll((player, name) => player.tempname.add(name), player, name); }, - ai:{order:12,result:{player:1}}, + ai: { order: 12, result: { player: 1 } }, }, - pingjian_check:{ - charlotte:true, - trigger:{player:['useSkill','logSkillBegin']}, - filter:function(event,player){ - var info=get.info(event.skill); - if(info&&info.charlotte) return false; - var skill=event.sourceSkill||event.skill; + pingjian_check: { + charlotte: true, + trigger: { player: ["useSkill", "logSkillBegin"] }, + filter: function (event, player) { + var info = get.info(event.skill); + if (info && info.charlotte) return false; + var skill = event.sourceSkill || event.skill; return player.storage.pingjian_check[skill]; }, - direct:true, - firstDo:true, - priority:Infinity, - content:function(){ - var skill=trigger.sourceSkill||trigger.skill; + direct: true, + firstDo: true, + priority: Infinity, + content: function () { + var skill = trigger.sourceSkill || trigger.skill; player.removeSkill(skill); - const names=player.tempname&&player.tempname.filter(i=>lib.character[i][3].includes(skill)); - if(names) game.broadcastAll((player,names)=>player.tempname.removeArray(names),player,names); + const names = + player.tempname && player.tempname.filter((i) => lib.character[i][3].includes(skill)); + if (names) + game.broadcastAll( + (player, names) => player.tempname.removeArray(names), + player, + names + ); delete player.storage.pingjian_check[skill]; }, - group:'pingjian_check2', + group: "pingjian_check2", }, - pingjian_check2:{ - charlotte:true, - trigger:{player:['phaseUseEnd','damageEnd','phaseJieshuBegin']}, - filter:function(event,player){ - return Object.keys(player.storage.pingjian_check).find(function(skill){ - if(event.name!='damage') return player.storage.pingjian_check[skill]==event.name; - return player.storage.pingjian_check[skill]==event; + pingjian_check2: { + charlotte: true, + trigger: { player: ["phaseUseEnd", "damageEnd", "phaseJieshuBegin"] }, + filter: function (event, player) { + return Object.keys(player.storage.pingjian_check).find(function (skill) { + if (event.name != "damage") return player.storage.pingjian_check[skill] == event.name; + return player.storage.pingjian_check[skill] == event; }); }, - direct:true, - lastDo:true, - priority:-Infinity, - content:function(){ - var skills=Object.keys(player.storage.pingjian_check).filter(function(skill){ - if(trigger.name!='damage') return player.storage.pingjian_check[skill]==trigger.name; - return player.storage.pingjian_check[skill]==trigger; + direct: true, + lastDo: true, + priority: -Infinity, + content: function () { + var skills = Object.keys(player.storage.pingjian_check).filter(function (skill) { + if (trigger.name != "damage") + return player.storage.pingjian_check[skill] == trigger.name; + return player.storage.pingjian_check[skill] == trigger; }); player.removeSkill(skills); - const names=player.tempname&&player.tempname.filter(i=>skills.some(skill=>lib.character[i][3].includes(skill))); - if(names) game.broadcastAll((player,names)=>player.tempname.removeArray(names),player,names); - for(var skill of skills) delete player.storage.pingjian_check[skill]; + const names = + player.tempname && + player.tempname.filter((i) => + skills.some((skill) => lib.character[i][3].includes(skill)) + ); + if (names) + game.broadcastAll( + (player, names) => player.tempname.removeArray(names), + player, + names + ); + for (var skill of skills) delete player.storage.pingjian_check[skill]; }, }, //上兵伐谋 //伊籍在标包 不会移动 - songshu:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('songshu_reflectionblue',null,null,false)&&player.countCards('h')>0; + songshu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + !player.hasSkill("songshu_reflectionblue", null, null, false) && + player.countCards("h") > 0 + ); }, - filterTarget:function(card,player,target){ - return target!=player&&player.canCompare(target); + filterTarget: function (card, player, target) { + return target != player && player.canCompare(target); }, - content:function(){ - 'step 0' - player.chooseToCompare(target).set('small',get.attitude(player,target)>0); - 'step 1' - if(!result.bool){ - player.draw(2,'nodelay'); + content: function () { + "step 0"; + player.chooseToCompare(target).set("small", get.attitude(player, target) > 0); + ("step 1"); + if (!result.bool) { + player.draw(2, "nodelay"); target.draw(2); - player.addTempSkill('songshu_reflectionblue','phaseUseAfter'); - } - else{ - target.addTempSkill('songshu_ai'); + player.addTempSkill("songshu_reflectionblue", "phaseUseAfter"); + } else { + target.addTempSkill("songshu_ai"); } }, - ai:{ - basic:{ - order:1 + ai: { + basic: { + order: 1, }, - expose:0.2, - result:{ - target:function(player,target){ - if(target.hasSkill('songshu_ai',null,null,false)) return 0; - var maxnum=0; - var cards2=target.getCards('h'); - for(var i=0;imaxnum){ - maxnum=get.number(cards2[i]); + expose: 0.2, + result: { + target: function (player, target) { + if (target.hasSkill("songshu_ai", null, null, false)) return 0; + var maxnum = 0; + var cards2 = target.getCards("h"); + for (var i = 0; i < cards2.length; i++) { + if (get.number(cards2[i]) > maxnum) { + maxnum = get.number(cards2[i]); } } - if(maxnum>10) maxnum=10; - if(maxnum<5&&cards2.length>1) maxnum=5; - var cards=player.getCards('h'); - for(var i=0;i 10) maxnum = 10; + if (maxnum < 5 && cards2.length > 1) maxnum = 5; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { + if (get.number(cards[i]) < maxnum) return 1; } return 0; - } - } - } + }, + }, + }, }, - songshu_ai:{charlotte:true}, - songshu_reflectionblue:{charlotte:true}, - sibian:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ + songshu_ai: { charlotte: true }, + songshu_reflectionblue: { charlotte: true }, + sibian: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.changeToZero(); - event.cards=get.cards(4); + event.cards = get.cards(4); game.cardsGotoOrdering(event.cards); player.showCards(event.cards); - 'step 1' - cards.sort(function(a,b){ - return b.number-a.number; + ("step 1"); + cards.sort(function (a, b) { + return b.number - a.number; }); - var gains=[]; - var mx=[cards[0].number,cards[3].number]; - for(var i=0;i0) player.chooseTarget('是否令一名手牌数最少的角色获得'+get.translation(cards),function(card,player,target){ - return target.isMinHandcard(); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); + player.gain(gains, "gain2"); + if (cards.length > 0) + player + .chooseTarget( + "是否令一名手牌数最少的角色获得" + get.translation(cards), + function (card, player, target) { + return target.isMinHandcard(); + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; + ("step 2"); + if (result.bool) { + var target = result.targets[0]; player.line(target); player.addExpose(0.2); - target.gain(cards,'gain2'); + target.gain(cards, "gain2"); } }, }, - lslixun:{ - audio:2, - forced:true, - trigger:{player:'damageBegin4'}, - marktext:'珠', - intro:{ - name2:'珠', - content:'共有#个“珠”', + lslixun: { + audio: 2, + forced: true, + trigger: { player: "damageBegin4" }, + marktext: "珠", + intro: { + name2: "珠", + content: "共有#个“珠”", }, - content:function(){ + content: function () { trigger.cancel(); - player.addMark('lslixun',trigger.num); + player.addMark("lslixun", trigger.num); }, - group:'lslixun_fate', + group: "lslixun_fate", }, - lslixun_fate:{ - audio:'lslixun', - trigger:{player:'phaseUseBegin'}, - forced:true, - filter:function(event,player){ - return player.countMark('lslixun')>0; + lslixun_fate: { + audio: "lslixun", + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("lslixun") > 0; }, - content:function(){ - 'step 0' - event.forceDie=true; - _status.lslixun=player.countMark('lslixun'); - player.judge(function(card){ - if(get.number(card)<_status.lslixun) return -_status.lslixun; + content: function () { + "step 0"; + event.forceDie = true; + _status.lslixun = player.countMark("lslixun"); + player.judge(function (card) { + if (get.number(card) < _status.lslixun) return -_status.lslixun; return 1; - }).judge2=function(result){ - return result.bool?true:false; + }).judge2 = function (result) { + return result.bool ? true : false; }; - 'step 1' + ("step 1"); delete _status.lslixun; - if(!result.bool){ - player.chooseToDiscard([1,player.countMark('lslixun')],'h').ai=lib.skill.qiangxi.check; - } - else event.finish(); - 'step 2' - var num=player.countMark('lslixun'); - if(result.cards&&result.cards.length) num-=result.cards.length; - if(num) player.loseHp(num); + if (!result.bool) { + player.chooseToDiscard([1, player.countMark("lslixun")], "h").ai = + lib.skill.qiangxi.check; + } else event.finish(); + ("step 2"); + var num = player.countMark("lslixun"); + if (result.cards && result.cards.length) num -= result.cards.length; + if (num) player.loseHp(num); }, }, - lskuizhu:{ - audio:2, - trigger:{player:'phaseUseEnd'}, - direct:true, - filter:function(event,player){ - return player.isMaxHp(true)==false; + lskuizhu: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return player.isMaxHp(true) == false; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('lskuizhu'),function(card,player,target){ - return target!=player&&target.isMaxHp(); - }).ai=function(target){ - var player=_status.event.player; - var ts=Math.min(5,target.countCards('h')); - var delta=ts-player.countCards('h'); - if(delta<=0) return 0; - if(get.attitude(player,target)<1) return false; - return target.countCards('he',function(card){ - return lib.skill.zhiheng.check(card)>0; - })>1?delta:0; + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("lskuizhu"), function (card, player, target) { + return target != player && target.isMaxHp(); + }).ai = function (target) { + var player = _status.event.player; + var ts = Math.min(5, target.countCards("h")); + var delta = ts - player.countCards("h"); + if (delta <= 0) return 0; + if (get.attitude(player, target) < 1) return false; + return target.countCards("he", function (card) { + return lib.skill.zhiheng.check(card) > 0; + }) > 1 + ? delta + : 0; }; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('lskuizhu',target); - player.drawTo(Math.min(5,target.countCards('h'))); - } - else event.finish(); - 'step 2' - if(!player.countCards('h')){ + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("lskuizhu", target); + player.drawTo(Math.min(5, target.countCards("h"))); + } else event.finish(); + ("step 2"); + if (!player.countCards("h")) { event.finish(); return; } target.viewHandcards(player); - 'step 3' - if(!target.countCards('h')){ + ("step 3"); + if (!target.countCards("h")) { event.finish(); return; } - target.chooseToDiscard(true,'h',[1,player.countCards('h')],'弃置至多'+get.cnNumber(player.countCards('h'))+'张手牌,并获得'+get.translation(player)+'等量的手牌').ai=function(card){ - if(ui.selected.cards.length>1) return -1; - return lib.skill.zhiheng.check.apply(this,arguments) + target.chooseToDiscard( + true, + "h", + [1, player.countCards("h")], + "弃置至多" + + get.cnNumber(player.countCards("h")) + + "张手牌,并获得" + + get.translation(player) + + "等量的手牌" + ).ai = function (card) { + if (ui.selected.cards.length > 1) return -1; + return lib.skill.zhiheng.check.apply(this, arguments); }; - 'step 4' - if(result.bool&&result.cards&&result.cards.length&&player.countGainableCards(target,'h')>0){ - target.gainPlayerCard(player,'h',true,result.cards.length).visible=true; + ("step 4"); + if ( + result.bool && + result.cards && + result.cards.length && + player.countGainableCards(target, "h") > 0 + ) { + target.gainPlayerCard(player, "h", true, result.cards.length).visible = true; } - 'step 5' - if(result.bool&&result.cards&&result.cards.length>1){ - var bool=player.storage.lslixun>0!==true; - player.chooseTarget(bool,'令'+get.translation(target)+'对其攻击范围内的一名角色造成1点伤害'+(bool?'':',或点「取消」移去一个“珠”'),function(card,player,target){ - var source=_status.event.source; - return target!=source&&source.inRange(target); - }).set('source',target).set('ai',function(target){ - return get.damageEffect(target,_status.event.source,_status.event.player); - }); - } - else event.finish(); - 'step 6' - if(result.bool&&result.targets&&result.targets.length){ + ("step 5"); + if (result.bool && result.cards && result.cards.length > 1) { + var bool = player.storage.lslixun > 0 !== true; + player + .chooseTarget( + bool, + "令" + + get.translation(target) + + "对其攻击范围内的一名角色造成1点伤害" + + (bool ? "" : ",或点「取消」移去一个“珠”"), + function (card, player, target) { + var source = _status.event.source; + return target != source && source.inRange(target); + } + ) + .set("source", target) + .set("ai", function (target) { + return get.damageEffect(target, _status.event.source, _status.event.player); + }); + } else event.finish(); + ("step 6"); + if (result.bool && result.targets && result.targets.length) { player.line(result.targets[0]); result.targets[0].damage(target); - } - else{ - player.removeMark('lslixun',1); + } else { + player.removeMark("lslixun", 1); } }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, - xpchijie:{ - audio:2, - trigger:{ - target:'useCardToAfter', + xpchijie: { + audio: 2, + trigger: { + target: "useCardToAfter", }, - filter:function(event,player){ - var evt=event.getParent(); - var targets=evt.targets.slice(evt.num+1); - return event.player!=player&&targets.length>0; + filter: function (event, player) { + var evt = event.getParent(); + var targets = evt.targets.slice(evt.num + 1); + return event.player != player && targets.length > 0; }, - usable:1, - prompt2:function(event,player){ - var evt=event.getParent(); - var targets=evt.targets.slice(evt.num+1); - return '令'+get.translation(event.card)+'对'+get.translation(targets)+'无效'; + usable: 1, + prompt2: function (event, player) { + var evt = event.getParent(); + var targets = evt.targets.slice(evt.num + 1); + return "令" + get.translation(event.card) + "对" + get.translation(targets) + "无效"; }, - check:function(event,player){ - var evt=event.getParent(); - var targets=evt.targets.slice(evt.num+1); - var num=0; - for(var i=0;i0&&!game.hasPlayer2(function(current){ - return current.getHistory('damage',function(evt){ - return evt.card==event.card; - }).length>0; - }); + xpchijie2: { + trigger: { global: "useCardAfter" }, + audio: "xpchijie", + filter: function (event, player) { + return ( + event.player != player && + event.targets.includes(player) && + event.cards.filterInD().length > 0 && + !game.hasPlayer2(function (current) { + return ( + current.getHistory("damage", function (evt) { + return evt.card == event.card; + }).length > 0 + ); + }) + ); }, - usable:1, - check:function(event,player){ - return get.value(event.cards.filterInD(),player,'raw')>0; + usable: 1, + check: function (event, player) { + return get.value(event.cards.filterInD(), player, "raw") > 0; }, - prompt2:function(event,player){ - return '获得'+get.translation(event.cards.filterInD())+'。'; + prompt2: function (event, player) { + return "获得" + get.translation(event.cards.filterInD()) + "。"; }, - content:function(){ - player.gain(trigger.cards.filterInD(),'log','gain2'); + content: function () { + player.gain(trigger.cards.filterInD(), "log", "gain2"); }, }, - xpchijie4:{}, - yinju:{ - audio:2, - enable:'phaseUse', - limited:true, - filterTarget:lib.filter.notMe, - skillAnimation:true, - animationColor:'water', - content:function(){ - player.awakenSkill('yinju'); - player.storage.yinju2=target; - player.addTempSkill('yinju2'); + xpchijie4: {}, + yinju: { + audio: 2, + enable: "phaseUse", + limited: true, + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "water", + content: function () { + player.awakenSkill("yinju"); + player.storage.yinju2 = target; + player.addTempSkill("yinju2"); }, - ai:{ - result:{ - order:10, - player:function(player,target){ - if(player.countCards('hs',function(card){ - return get.tag(card,'damage')&&player.canUse(card,target); - })>=1&&target.hp<=2) return 0.1; - if(player.countCards('hes',function(card){ - return player.canUse(card,target); - })<=2) return -100; + ai: { + result: { + order: 10, + player: function (player, target) { + if ( + player.countCards("hs", function (card) { + return get.tag(card, "damage") && player.canUse(card, target); + }) >= 1 && + target.hp <= 2 + ) + return 0.1; + if ( + player.countCards("hes", function (card) { + return player.canUse(card, target); + }) <= 2 + ) + return -100; return 1; }, - target:function(player,target){ - return target.isDamaged()?5:3; + target: function (player, target) { + return target.isDamaged() ? 5 : 3; }, - } - } + }, + }, }, - yinju2:{ - trigger:{ - player:'useCardToPlayered', - source:'damageBefore', + yinju2: { + trigger: { + player: "useCardToPlayered", + source: "damageBefore", }, - forced:true, - onremove:true, - filter:function(event,player,name){ - if(name=='useCardToPlayered') return event.target==player.storage.yinju2; - return event.player==player.storage.yinju2; + forced: true, + onremove: true, + filter: function (event, player, name) { + if (name == "useCardToPlayered") return event.target == player.storage.yinju2; + return event.player == player.storage.yinju2; }, - logTarget:function(event){ - return event[event.name=='damage'?'player':'target']; + logTarget: function (event) { + return event[event.name == "damage" ? "player" : "target"]; }, - content:function(){ - 'step 0' - if(trigger.name=='damage'){ + content: function () { + "step 0"; + if (trigger.name == "damage") { trigger.cancel(); trigger.player.recover(trigger.num); event.finish(); + } else { + game.asyncDraw([player, trigger.target]); } - else{ - game.asyncDraw([player,trigger.target]); - } - 'step 1' + ("step 1"); game.delayx(); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(target!=player.storage.yinju2) return; - if(card.name=='lebu') return; - if(card.name!=='huogong'&&get.tag(card,'damage')&&target.isDamaged()) [1,0.6,0,2.4]; - return [1,0.6,1,0.6]; + ai: { + effect: { + player: function (card, player, target) { + if (target != player.storage.yinju2) return; + if (card.name == "lebu") return; + if (card.name !== "huogong" && get.tag(card, "damage") && target.isDamaged()) + [1, 0.6, 0, 2.4]; + return [1, 0.6, 1, 0.6]; }, }, }, }, - rewenji:{ - audio:'spwenji', - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he'); + rewenji: { + audio: "spwenji", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('rewenji'),function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0) return Math.sqrt(att)/10; - return 5-att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('rewenji',target); - target.chooseCard('he',true,'问计:将一张牌交给'+get.translation(player)); - } - else{ + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rewenji"), function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("rewenji", target); + target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.addTempSkill('rewenji_respond'); - player.storage.rewenji_respond=get.type2(result.cards[0],target); - event.target.give(result.cards,player,true); + ("step 2"); + if (result.bool) { + player.addTempSkill("rewenji_respond"); + player.storage.rewenji_respond = get.type2(result.cards[0], target); + event.target.give(result.cards, player, true); } }, - subSkill:{ - respond:{ - onremove:true, - trigger:{player:'useCard'}, - forced:true, - charlotte:true, - audio:'spwenji', - filter:function(event,player){ - return get.type2(event.card)==player.storage.rewenji_respond; + subSkill: { + respond: { + onremove: true, + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + audio: "spwenji", + filter: function (event, player) { + return get.type2(event.card) == player.storage.rewenji_respond; }, - content:function(){ - trigger.directHit.addArray(game.filterPlayer(function(current){ - return current!=player; - })); + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return get.type2(arg.card)==player.storage.rewenji_respond; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return get.type2(arg.card) == player.storage.rewenji_respond; }, }, - } - } + }, + }, }, - spwenji:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he'); + spwenji: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he"); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('spwenji'),function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0) return Math.sqrt(att)/10; - return 5-att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('spwenji',target); - target.chooseCard('he',true,'问计:将一张牌交给'+get.translation(player)); - } - else{ + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("spwenji"), function (card, player, target) { + return target != player && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) return Math.sqrt(att) / 10; + return 5 - att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("spwenji", target); + target.chooseCard("he", true, "问计:将一张牌交给" + get.translation(player)); + } else { event.finish(); } - 'step 2' - if(result.bool){ - player.addTempSkill('spwenji_respond'); - player.storage.spwenji_respond=result.cards[0].name; - event.target.give(result.cards,player,true); + ("step 2"); + if (result.bool) { + player.addTempSkill("spwenji_respond"); + player.storage.spwenji_respond = result.cards[0].name; + event.target.give(result.cards, player, true); } }, - subSkill:{ - respond:{ - onremove:true, - trigger:{player:'useCard'}, - forced:true, - charlotte:true, - audio:'spwenji', - filter:function(event,player){ - return event.card.name==player.storage.spwenji_respond; + subSkill: { + respond: { + onremove: true, + trigger: { player: "useCard" }, + forced: true, + charlotte: true, + audio: "spwenji", + filter: function (event, player) { + return event.card.name == player.storage.spwenji_respond; }, - content:function(){ - trigger.directHit.addArray(game.filterPlayer(function(current){ - return current!=player; - })); + content: function () { + trigger.directHit.addArray( + game.filterPlayer(function (current) { + return current != player; + }) + ); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg.card.name==player.storage.spwenji_respond; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg.card.name == player.storage.spwenji_respond; }, }, - } - } + }, + }, }, - sptunjiang:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - filter:function(event,player){ + sptunjiang: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { //if(player.getHistory('skipped').includes('phaseUse')) return false; - return player.getHistory('useCard',function(evt){ - if(evt.targets&&evt.targets.length&&evt.isPhaseUsing()){ - var targets=evt.targets.slice(0); - while(targets.includes(player)) targets.remove(player); - return targets.length>0; - } - return false; - }).length==0; + return ( + player.getHistory("useCard", function (evt) { + if (evt.targets && evt.targets.length && evt.isPhaseUsing()) { + var targets = evt.targets.slice(0); + while (targets.includes(player)) targets.remove(player); + return targets.length > 0; + } + return false; + }).length == 0 + ); }, - content:function(){ + content: function () { player.draw(game.countGroup()); }, }, - bingzhao:{ - audio:2, - unique:true, - zhuSkill:true, - forced:true, - locked:false, - intro:{ - content:function(group){ - return '已选择了'+get.translation(group)+'势力' + bingzhao: { + audio: 2, + unique: true, + zhuSkill: true, + forced: true, + locked: false, + intro: { + content: function (group) { + return "已选择了" + get.translation(group) + "势力"; }, }, - trigger:{global:['phaseBefore','zhuUpdate']}, - filter:function(event,player){ - if(!lib.group.some(function(group){ - if(group==player.group) return false; - return lib.group.includes(group)||game.hasPlayer(function(current){ - return current.group==group; - }); - })) return false; - return !player.storage.bingzhao&&player.hasZhuSkill('bingzhao')&&(event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - 'step 0' - var list=lib.group.filter(function(group){ - if(group==player.group) return false; - return lib.group.includes(group)||game.hasPlayer(function(current){ - return current.group==group; - }); - }); - player.chooseControl(list).set('prompt','秉诏:请选择一个其他势力').set('ai',function(){ - var listx=list.slice(0); - listx.sort(function(a,b){ - return game.countPlayer(function(current){ - return current!=player&¤t.group==b; - })-game.countPlayer(function(current){ - return current!=player&¤t.group==a; - }); + trigger: { global: ["phaseBefore", "zhuUpdate"] }, + filter: function (event, player) { + if ( + !lib.group.some(function (group) { + if (group == player.group) return false; + return ( + lib.group.includes(group) || + game.hasPlayer(function (current) { + return current.group == group; + }) + ); }) - return listx[0]; + ) + return false; + return ( + !player.storage.bingzhao && + player.hasZhuSkill("bingzhao") && + (event.name != "phase" || game.phaseNumber == 0) + ); + }, + content: function () { + "step 0"; + var list = lib.group.filter(function (group) { + if (group == player.group) return false; + return ( + lib.group.includes(group) || + game.hasPlayer(function (current) { + return current.group == group; + }) + ); }); - 'step 1' - var group=result.control; - player.popup(get.translation(group)+'势力',get.groupnature(group,'raw')); - game.log(player,'选择了','#y'+get.translation(group)+'势力'); - player.storage.bingzhao=group; - player.markSkill('bingzhao'); + player + .chooseControl(list) + .set("prompt", "秉诏:请选择一个其他势力") + .set("ai", function () { + var listx = list.slice(0); + listx.sort(function (a, b) { + return ( + game.countPlayer(function (current) { + return current != player && current.group == b; + }) - + game.countPlayer(function (current) { + return current != player && current.group == a; + }) + ); + }); + return listx[0]; + }); + ("step 1"); + var group = result.control; + player.popup(get.translation(group) + "势力", get.groupnature(group, "raw")); + game.log(player, "选择了", "#y" + get.translation(group) + "势力"); + player.storage.bingzhao = group; + player.markSkill("bingzhao"); }, }, - baijia:{ - audio:2, - audioname:['tw_beimihu'], - unique:true, - derivation:'bmcanshi', - juexingji:true, - ai:{ - combo:'guju' + baijia: { + audio: 2, + audioname: ["tw_beimihu"], + unique: true, + derivation: "bmcanshi", + juexingji: true, + ai: { + combo: "guju", }, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.hasSkill('guju')&&player.storage.guju>=7; + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.hasSkill("guju") && player.storage.guju >= 7; }, - content:function(){ - player.awakenSkill('baijia'); + content: function () { + player.awakenSkill("baijia"); player.gainMaxHp(); player.recover(); - var list=game.filterPlayer(); - for(var i=0;i1; - }; - } - else event.finish(); - 'step 2' - if(result.bool){ - trigger.player.logSkill('bingzhao',player); + player.markSkill("guju"); + ("step 1"); + if ( + player.hasZhuSkill("bingzhao", trigger.player) && + trigger.player.group == player.storage.bingzhao && + trigger.player.isIn() + ) { + trigger.player.chooseBool("是否对" + get.translation(player) + "发动【秉诏】?").ai = + function () { + return get.attitude(trigger.player, player) > 1; + }; + } else event.finish(); + ("step 2"); + if (result.bool) { + trigger.player.logSkill("bingzhao", player); player.draw(); player.storage.guju++; - player.markSkill('guju'); + player.markSkill("guju"); } }, - ai:{ - combo:'zongkui' - } + ai: { + combo: "zongkui", + }, }, - zongkui:{ - trigger:{ - player:'phaseBeforeEnd', - global:'roundStart', + zongkui: { + trigger: { + player: "phaseBeforeEnd", + global: "roundStart", }, - direct:true, - audio:2, - audioname:['tw_beimihu'], - filter:function(event,player,name){ - return game.hasPlayer(function(current){ - if(name=='roundStart'&&!current.isMinHp()) return false; - return current!=player&&!current.hasMark('zongkui_mark'); + direct: true, + audio: 2, + audioname: ["tw_beimihu"], + filter: function (event, player, name) { + return game.hasPlayer(function (current) { + if (name == "roundStart" && !current.isMinHp()) return false; + return current != player && !current.hasMark("zongkui_mark"); }); }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(function(current){ - if(event.triggername=='roundStart'&&!current.isMinHp()) return false; - return current!=player&&!current.hasMark('zongkui_mark'); + content: function () { + "step 0"; + var targets = game.filterPlayer(function (current) { + if (event.triggername == "roundStart" && !current.isMinHp()) return false; + return current != player && !current.hasMark("zongkui_mark"); }); - if(event.triggername=='roundStart'&&targets.length==1){ - event._result={bool:true,targets:targets}; + if (event.triggername == "roundStart" && targets.length == 1) { + event._result = { bool: true, targets: targets }; + } else { + var next = player + .chooseTarget( + get.prompt("zongkui"), + "令一名" + + (event.triggername == "roundStart" ? "体力值最小的" : "") + + "其他角色获得“傀”标记", + function (card, player, target) { + if (_status.event.round && !target.isMinHp()) return false; + return target != player && !target.hasMark("zongkui_mark"); + } + ) + .set("ai", function (target) { + var num = target.isMinHp() ? 0.5 : 1; + return num * get.threaten(target); + }) + .set("round", event.triggername == "roundStart"); + if (event.triggername == "roundStart") next.set("forced", true); } - else{ - var next=player.chooseTarget(get.prompt('zongkui'),'令一名'+(event.triggername=='roundStart'?'体力值最小的':'')+'其他角色获得“傀”标记',function(card,player,target){ - if(_status.event.round&&!target.isMinHp()) return false; - return target!=player&&!target.hasMark('zongkui_mark'); - }).set('ai',function(target){ - var num=target.isMinHp()?0.5:1; - return num*get.threaten(target); - }).set('round',event.triggername=='roundStart'); - if(event.triggername=='roundStart') next.set('forced',true); - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('zongkui',target); - target.addMark('zongkui_mark',1); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zongkui", target); + target.addMark("zongkui_mark", 1); game.delayx(); } }, - subSkill:{ - mark:{ - marktext:'傀', - intro:{ - name2:'傀', - content:'mark' - } - } + subSkill: { + mark: { + marktext: "傀", + intro: { + name2: "傀", + content: "mark", + }, + }, + }, + ai: { + combo: "guju", + threaten: 1.4, }, - ai:{ - combo:'guju', - threaten:1.4 - } }, - "xinfu_langxi":{ - audio:2, - trigger:{ - player:"phaseZhunbeiBegin", + xinfu_langxi: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", }, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.hp<=player.hp; + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.hp <= player.hp; }); }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('xinfu_langxi'),'对一名体力值不大于你的其他角色造成0-2点随机伤害',function(card,player,target){ - return target.hp<=player.hp&&target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - "step 1" - if(result.bool&&result.targets&&result.targets.length){ - player.logSkill('xinfu_langxi',result.targets); - var num=[1,2,0].randomGet(); - if(get.isLuckyStar(player)) num=2; - player.line(result.targets[0],'green'); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("xinfu_langxi"), + "对一名体力值不大于你的其他角色造成0-2点随机伤害", + function (card, player, target) { + return target.hp <= player.hp && target != player; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool && result.targets && result.targets.length) { + player.logSkill("xinfu_langxi", result.targets); + var num = [1, 2, 0].randomGet(); + if (get.isLuckyStar(player)) num = 2; + player.line(result.targets[0], "green"); result.targets[0].damage(num); } }, - ai:{ - expose:0.25, - threaten:1.7, + ai: { + expose: 0.25, + threaten: 1.7, }, }, - "xinfu_yisuan":{ - usable:1, - audio:2, - trigger:{ - player:"useCardEnd", + xinfu_yisuan: { + usable: 1, + audio: 2, + trigger: { + player: "useCardEnd", }, - check:function(event,player){ - return get.value(event.cards)+player.maxHp*2-18>0; + check: function (event, player) { + return get.value(event.cards) + player.maxHp * 2 - 18 > 0; }, - prompt2:function(event,player){ - return '你可以减1点体力上限,然后获得'+get.translation(event.cards.filterInD())+'。'; + prompt2: function (event, player) { + return "你可以减1点体力上限,然后获得" + get.translation(event.cards.filterInD()) + "。"; }, - filter:function(event,player){ - return player.isPhaseUsing()&&get.type(event.card)=='trick'&&event.cards.filterInD().length>0; + filter: function (event, player) { + return ( + player.isPhaseUsing() && + get.type(event.card) == "trick" && + event.cards.filterInD().length > 0 + ); }, - content:function(){ + content: function () { player.loseMaxHp(); - player.gain(trigger.cards.filterInD(),'gain2','log'); + player.gain(trigger.cards.filterInD(), "gain2", "log"); }, }, - "xinfu_xingluan":{ - usable:1, - audio:2, - trigger:{ - player:"useCardAfter", + xinfu_xingluan: { + usable: 1, + audio: 2, + trigger: { + player: "useCardAfter", }, - filter:function(event,player){ - if(!player.isPhaseUsing()) return false; - if(get.type(event.card)==undefined) return false; - return (event.targets&&event.targets.length==1); + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + if (get.type(event.card) == undefined) return false; + return event.targets && event.targets.length == 1; }, - content:function(){ - var card=get.cardPile2(function(card){ - return card.number==6; + content: function () { + var card = get.cardPile2(function (card) { + return card.number == 6; }); - if(!card){ - player.chat('无牌可得了吗'); - game.log('但是牌堆里面已经没有点数为6的牌了!'); + if (!card) { + player.chat("无牌可得了吗"); + game.log("但是牌堆里面已经没有点数为6的牌了!"); event.finish(); return; } - player.gain(card,'gain2'); + player.gain(card, "gain2"); }, }, - "xinfu_lveming":{ - init:function(player){ - player.storage.xinfu_lveming=0; + xinfu_lveming: { + init: function (player) { + player.storage.xinfu_lveming = 0; }, - mark:true, - intro:{ - content:"已发动过#次", + mark: true, + intro: { + content: "已发动过#次", }, - audio:2, - enable:"phaseUse", - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('e')get.strNumber(i)); - target.chooseControl(list).set('ai',function(){ - return get.rand(0,12); - }).set('prompt','请选择一个点数'); - "step 1" - if(result.control){ - target.$damagepop(result.control,'thunder'); - var num=result.index+1; - event.num=num; + content: function () { + "step 0"; + var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].map((i) => get.strNumber(i)); + target + .chooseControl(list) + .set("ai", function () { + return get.rand(0, 12); + }) + .set("prompt", "请选择一个点数"); + ("step 1"); + if (result.control) { + target.$damagepop(result.control, "thunder"); + var num = result.index + 1; + event.num = num; + } else { + target.$damagepop("K", "thunder"); + event.num = 13; } - else{ - target.$damagepop('K','thunder'); - event.num=13; - } - game.log(target,'选择的点数是','#y'+get.strNumber(event.num)); + game.log(target, "选择的点数是", "#y" + get.strNumber(event.num)); player.storage.xinfu_lveming++; - player.judge(function(card){ - if(card.number==_status.event.getParent('xinfu_lveming').num) return 4; + player.judge(function (card) { + if (card.number == _status.event.getParent("xinfu_lveming").num) return 4; return 0; }); - "step 2" - if(result.bool==true){ + ("step 2"); + if (result.bool == true) { target.damage(2); - } - else{ - var card=target.getCards('hej').randomGet(); - player.gain(card,target,'giveAuto','bySelf'); + } else { + var card = target.getCards("hej").randomGet(); + player.gain(card, target, "giveAuto", "bySelf"); } }, - ai:{ - order:9, - result:{ - target:function(player,target){ - var numj=target.countCards('j'); - var numhe=target.countCards('he'); - if(numhe==0) return numj>0?6:-6; - return -6-(numj+1)/numhe; + ai: { + order: 9, + result: { + target: function (player, target) { + var numj = target.countCards("j"); + var numhe = target.countCards("he"); + if (numhe == 0) return numj > 0 ? 6 : -6; + return -6 - (numj + 1) / numhe; }, }, - threaten:1.1, + threaten: 1.1, }, }, - "xinfu_tunjun":{ - skillAnimation:true, - animationColor:'metal', - limited:true, - unique:true, - enable:"phaseUse", - audio:2, - filter:function(event,player){ - if(player.storage.xinfu_tunjun) return false; - return player.storage.xinfu_lveming&&player.storage.xinfu_lveming>0; + xinfu_tunjun: { + skillAnimation: true, + animationColor: "metal", + limited: true, + unique: true, + enable: "phaseUse", + audio: 2, + filter: function (event, player) { + if (player.storage.xinfu_tunjun) return false; + return player.storage.xinfu_lveming && player.storage.xinfu_lveming > 0; }, - filterTarget:true, - selectTarget:1, - content:function(){ - "step 0" - player.awakenSkill('xinfu_tunjun'); - event.num=player.storage.xinfu_lveming; - event.toequip=[]; - "step 1" - var equip=get.cardPile(function(card){ - var bool1=true; - for(var i=0;i0) event.goto(1); - "step 3" - for (var i=0;i 0) event.goto(1); + ("step 3"); + for (var i = 0; i < event.toequip.length; i++) { + target + .chooseUseTarget(event.toequip[i], true) + .set("animate", false) + .set("nopopup", true); } }, - ai:{ - combo:'xinfu_lveming', - order:function(){ - var player=_status.event.player,num=0; - for(var i=1;i<6;i++){ - num+=player.countEquipableSlot(i); + ai: { + combo: "xinfu_lveming", + order: function () { + var player = _status.event.player, + num = 0; + for (var i = 1; i < 6; i++) { + num += player.countEquipableSlot(i); } - if(num<=2) return 6; - if(player.hp<=2||!game.hasPlayer((current)=>{ - if(player==current||get.attitude(player,current)<0||current.hp<=1) return false; - return current.hp>2||current.countCards('hs')>2; - })) return 1; + if (num <= 2) return 6; + if ( + player.hp <= 2 || + !game.hasPlayer((current) => { + if (player == current || get.attitude(player, current) < 0 || current.hp <= 1) + return false; + return current.hp > 2 || current.countCards("hs") > 2; + }) + ) + return 1; return 0; }, - result:{ - target:function(player,target){ - var num=0; - for(var i=1;i<6;i++){ - num+=target.countEquipableSlot(i); + result: { + target: function (player, target) { + var num = 0; + for (var i = 1; i < 6; i++) { + num += target.countEquipableSlot(i); } return num; - } - } - }, - mark:true, - intro:{ - content:"limited", - }, - init:function(player){ - player.storage.xinfu_tunjun=false; - }, - }, - "xinfu_tanbei":{ - audio:2, - enable:"phaseUse", - usable:1, - filterTarget:function(card,player,target){ - return player!=target; - }, - content:function(){ - "step 0" - if(target.countCards('hej')==0){ - event._result={index:1}; - } - else{ - target.chooseControl().set('choiceList',[ - '令'+get.translation(player)+'随机获得你区域内的一张牌,然后其本回合内不能再对你使用牌。', - '令'+get.translation(player)+'本回合内对你使用牌没有次数与距离限制。', - ]).set('ai',function(){ - var list=[0,1]; - return list.randomGet(); - }); - } - "step 1" - player.addTempSkill('tanbei_effect3'); - if(result.index==0){ - var card=target.getCards('hej').randomGet(); - player.gain(card,target,'giveAuto','bySelf'); - target.addTempSkill('tanbei_effect2'); - } - else{ - target.addTempSkill('tanbei_effect1'); - } - }, - ai:{ - order:function(){ - return [2,4,6,8,10].randomGet(); - }, - result:{ - target:function(player,target){ - return -2-target.countCards('h'); }, }, - threaten:1.1, + }, + mark: true, + intro: { + content: "limited", + }, + init: function (player) { + player.storage.xinfu_tunjun = false; }, }, - tanbei_effect3:{ - charlotte:true, - mod:{ - targetInRange:function(card,player,target){ - if(target.hasSkill('tanbei_effect1')){ + xinfu_tanbei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target; + }, + content: function () { + "step 0"; + if (target.countCards("hej") == 0) { + event._result = { index: 1 }; + } else { + target + .chooseControl() + .set("choiceList", [ + "令" + + get.translation(player) + + "随机获得你区域内的一张牌,然后其本回合内不能再对你使用牌。", + "令" + get.translation(player) + "本回合内对你使用牌没有次数与距离限制。", + ]) + .set("ai", function () { + var list = [0, 1]; + return list.randomGet(); + }); + } + ("step 1"); + player.addTempSkill("tanbei_effect3"); + if (result.index == 0) { + var card = target.getCards("hej").randomGet(); + player.gain(card, target, "giveAuto", "bySelf"); + target.addTempSkill("tanbei_effect2"); + } else { + target.addTempSkill("tanbei_effect1"); + } + }, + ai: { + order: function () { + return [2, 4, 6, 8, 10].randomGet(); + }, + result: { + target: function (player, target) { + return -2 - target.countCards("h"); + }, + }, + threaten: 1.1, + }, + }, + tanbei_effect3: { + charlotte: true, + mod: { + targetInRange: function (card, player, target) { + if (target.hasSkill("tanbei_effect1")) { return true; } }, - cardUsableTarget:function(card,player,target){ - if(target.hasSkill('tanbei_effect1')) return true; + cardUsableTarget: function (card, player, target) { + if (target.hasSkill("tanbei_effect1")) return true; }, - playerEnabled:function(card,player,target){ - if(target.hasSkill('tanbei_effect2')) return false; + playerEnabled: function (card, player, target) { + if (target.hasSkill("tanbei_effect2")) return false; }, }, }, - "xinfu_sidao":{ - audio:2, - trigger:{ - player:'useCardAfter', + xinfu_sidao: { + audio: 2, + trigger: { + player: "useCardAfter", }, - filter:function(event,player){ - if(player.hasSkill('xinfu_sidaoy')||!player.countCards('hs')) return false; - if(!event.targets||!event.targets.length||!event.isPhaseUsing(player)) return false; - var history=player.getHistory('useCard'); - var index=history.indexOf(event)-1; - if(index<0) return false; - var evt=history[index]; - if(!evt||!evt.targets||!evt.targets.length||!evt.isPhaseUsing(player)) return false; - for(var i=0;itarget.getUseValue({name:'sha',cards:cards})?0:1); - } - else if(bool1){ - event.directindex=0; - } - else if(bool2){ - event.directindex=1; - } - else{ - ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + if (bool1 && bool2) { + target + .chooseControl(function () { + return 0; + }) + .set("choiceList", [ + "使用" + get.translation(cards) + "。(没有距离限制)", + "将" + get.translation(cards) + "当做【杀】使用。", + ]) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + target.getUseValue(card, false) > + target.getUseValue({ name: "sha", cards: cards }) + ? 0 + : 1 + ); + } else if (bool1) { + event.directindex = 0; + } else if (bool2) { + event.directindex = 1; + } else { + ui.cardPile.insertBefore(card, ui.cardPile.firstChild); event.finish(); } - 'step 2' - var card=cards[0]; - if(result&&typeof event.directindex!='number'){ - event.directindex=result.index; + ("step 2"); + var card = cards[0]; + if (result && typeof event.directindex != "number") { + event.directindex = result.index; } - if(event.directindex==1){ - target.chooseUseTarget({name:'sha'},cards,true,false).viewAs=false; - } - else{ - target.chooseUseTarget(card,true,false,'nodistance'); + if (event.directindex == 1) { + target.chooseUseTarget({ name: "sha" }, cards, true, false).viewAs = false; + } else { + target.chooseUseTarget(card, true, false, "nodistance"); } }, - ai:{ - order:7, - result:{ - target:1, + ai: { + order: 7, + result: { + target: 1, }, }, }, - "xinfu_bijing":{ - audio:2, - subSkill:{ - lose:{ - trigger:{ - global:"phaseDiscardBegin", + xinfu_bijing: { + audio: 2, + subSkill: { + lose: { + trigger: { + global: "phaseDiscardBegin", }, - audio:'xinfu_bijing', - charlotte:true, - filter:function(event,player){ - if(event.player==player) return false; - return player.getHistory('lose',function(evt){ - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('xinfu_bijing')) return true; - } - }).length>0&&event.player.countCards('he')>0; + audio: "xinfu_bijing", + charlotte: true, + filter: function (event, player) { + if (event.player == player) return false; + return ( + player.getHistory("lose", function (evt) { + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("xinfu_bijing")) return true; + } + }).length > 0 && event.player.countCards("he") > 0 + ); }, - forced:true, - logTarget:'player', - content:function(){ - trigger.player.chooseToDiscard(2,true,'he'); + forced: true, + logTarget: "player", + content: function () { + trigger.player.chooseToDiscard(2, true, "he"); }, - sub:true, + sub: true, }, - discard:{ - trigger:{ - player:"phaseZhunbeiBegin", + discard: { + trigger: { + player: "phaseZhunbeiBegin", }, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.hasCard(card=>card.hasGaintag('xinfu_bijing')&&player.canRecast(card),'h'); + forced: true, + charlotte: true, + filter: function (event, player) { + return player.hasCard( + (card) => card.hasGaintag("xinfu_bijing") && player.canRecast(card), + "h" + ); }, - content:function(){ - player.recast(player.getCards('h',card=>card.hasGaintag('xinfu_bijing')&&player.canRecast(card))); + content: function () { + player.recast( + player.getCards( + "h", + (card) => card.hasGaintag("xinfu_bijing") && player.canRecast(card) + ) + ); }, - sub:true, + sub: true, }, }, - trigger:{ - player:"phaseJieshuBegin", + trigger: { + player: "phaseJieshuBegin", }, - direct:true, - filter:function(player,event){ - return event.countCards('h')>0; + direct: true, + filter: function (player, event) { + return event.countCards("h") > 0; }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt2('xinfu_bijing'),'h',[1,2]).set('ai',function(card){ - if(card.name=='shan') return 6; - return 6-get.value(card); + content: function () { + "step 0"; + player.chooseCard(get.prompt2("xinfu_bijing"), "h", [1, 2]).set("ai", function (card) { + if (card.name == "shan") return 6; + return 6 - get.value(card); }); - 'step 1' - if(result.bool){ - player.logSkill('xinfu_bijing'); - player.addGaintag(result.cards,'xinfu_bijing'); - player.addSkill('xinfu_bijing_lose'); - player.addSkill('xinfu_bijing_discard'); + ("step 1"); + if (result.bool) { + player.logSkill("xinfu_bijing"); + player.addGaintag(result.cards, "xinfu_bijing"); + player.addSkill("xinfu_bijing_lose"); + player.addSkill("xinfu_bijing_discard"); } }, }, - xinfu_zhenxing:{ - audio:2, - trigger:{ - player:["damageEnd","phaseJieshuBegin"], + xinfu_zhenxing: { + audio: 2, + trigger: { + player: ["damageEnd", "phaseJieshuBegin"], }, - direct:true, - content:function(){ - 'step 0' - player.chooseControl('一张','两张','三张','cancel2').set('prompt',get.prompt2('xinfu_zhenxing')).set('',function(){return 0}); - 'step 1' - if(result.control=='cancel2') event.finish(); - else{ - player.logSkill('xinfu_zhenxing'); - event.num={一张:1,两张:2,三张:3}[result.control]; + direct: true, + content: function () { + "step 0"; + player + .chooseControl("一张", "两张", "三张", "cancel2") + .set("prompt", get.prompt2("xinfu_zhenxing")) + .set("", function () { + return 0; + }); + ("step 1"); + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("xinfu_zhenxing"); + event.num = { 一张: 1, 两张: 2, 三张: 3 }[result.control]; } - 'step 2' - event.cards=get.cards(num); - player.chooseButton(['【镇行】:请选择要获得的牌',event.cards]).set('filterButton',function(button){ - var cards=_status.event.cards; - for(var i=0;i=0;i--){ - if(result.bool&&result.links.includes(event.cards[i])){ - player.gain(event.cards[i],'gain2'); - } - else{ + ("step 2"); + event.cards = get.cards(num); + player + .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) + .set("filterButton", function (button) { + var cards = _status.event.cards; + for (var i = 0; i < cards.length; i++) { + if (button.link != cards[i] && get.suit(cards[i]) == get.suit(button.link)) + return false; + } + return true; + }) + .set("ai", function (button) { + return get.value(button.link); + }) + .set("cards", event.cards); + ("step 3"); + var tothrow = []; + for (var i = event.cards.length - 1; i >= 0; i--) { + if (result.bool && result.links.includes(event.cards[i])) { + player.gain(event.cards[i], "gain2"); + } else { event.cards[i].fix(); - ui.cardPile.insertBefore(event.cards[i],ui.cardPile.childNodes[0]); + ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); } } game.updateRoundNumber(); }, }, - "xinfu_qianxin":{ - audio:2, - group:["xinfu_qianxin2"], - enable:"phaseUse", - usable:1, - onChooseToUse:function(event){ - if(!game.online){ - var num1=game.players.length-1; - var player=event.player; - var num2=ui.cardPile.childElementCount; - var num3=num2; - if(num1>num2) num3=0; - else if(player.storage.xinfu_qianxin){ - for(var i=0;i num2) num3 = 0; + else if (player.storage.xinfu_qianxin) { + for (var i = 0; i < num2; i++) { + if (player.storage.xinfu_qianxin.includes(ui.cardPile.childNodes[i])) { + num3 = 0; + break; } } } - event.set('qianxinNum',num3); + event.set("qianxinNum", num3); } }, - filter:function(event,player){ - return event.qianxinNum&&event.qianxinNum>0; + filter: function (event, player) { + return event.qianxinNum && event.qianxinNum > 0; }, - filterTarget:function(card,player,target){ - return target!=player; + filterTarget: function (card, player, target) { + return target != player; }, - filterCard:true, - selectCard:function(){ - var num1=game.players.length-1; - var num2=_status.event.qianxinNum; - return [1,Math.floor(num2/num1)]; + filterCard: true, + selectCard: function () { + var num1 = game.players.length - 1; + var num2 = _status.event.qianxinNum; + return [1, Math.floor(num2 / num1)]; }, - discard:false, - check:function(){ + discard: false, + check: function () { return -1; }, - delay:false, - lose:false, - prompt:function(){ - return '选择一名角色并将任意张手牌放置于牌堆中'+get.cnNumber(game.players.length)+'倍数的位置(先选择的牌在上)'; + delay: false, + lose: false, + prompt: function () { + return ( + "选择一名角色并将任意张手牌放置于牌堆中" + + get.cnNumber(game.players.length) + + "倍数的位置(先选择的牌在上)" + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.$throw(cards.length); - player.storage.xinfu_qianxin=cards.slice(0); - player.storage.xinfu_qianxin2=target; + player.storage.xinfu_qianxin = cards.slice(0); + player.storage.xinfu_qianxin2 = target; //cards.reverse(); - player.lose(cards,ui.cardPile).insert_index=function(event,card){ - var num1=game.players.length,i=event.cards.indexOf(card); - var num3=num1*(i+1)-1; + player.lose(cards, ui.cardPile).insert_index = function (event, card) { + var num1 = game.players.length, + i = event.cards.indexOf(card); + var num3 = num1 * (i + 1) - 1; return ui.cardPile.childNodes[num3]; }; - 'step 1' + ("step 1"); game.updateRoundNumber(); - game.log(player,'把',get.cnNumber(cards.length),'张牌放在了牌堆里'); + game.log(player, "把", get.cnNumber(cards.length), "张牌放在了牌堆里"); game.delayx(); }, - ai:{ - order:1, - result:{ - target:-1, + ai: { + order: 1, + result: { + target: -1, }, }, }, - "xinfu_qianxin2":{ - subSkill:{ - dis:{ - mod:{ - maxHandcard:function(player,num){ - return num-2; + xinfu_qianxin2: { + subSkill: { + dis: { + mod: { + maxHandcard: function (player, num) { + return num - 2; }, }, - sub:true, + sub: true, }, }, - forced:true, - locked:false, - audio:'xinfu_qianxin', - logTarget:'player', - trigger:{ - global:"phaseDiscardBegin", + forced: true, + locked: false, + audio: "xinfu_qianxin", + logTarget: "player", + trigger: { + global: "phaseDiscardBegin", }, - filter:function(event,player){ - if(player.storage.xinfu_qianxin2!=event.player) return false; - if(!player.storage.xinfu_qianxin) return false; - var hs=event.player.getCards('h'); - var cs=player.storage.xinfu_qianxin; - var bool=false; - var history=event.player.getHistory('gain') - for(var i=0;i=4){ - event._result={index:1}; + if (player.countCards("h") >= 4) { + event._result = { index: 1 }; + } else { + trigger.player + .chooseControl() + .set("choiceList", [ + "令" + get.translation(player) + "将手牌摸至四张", + "令自己本回合的手牌上限-2", + ]) + .set("ai", function () { + var player = _status.event.player; + var source = _status.event.getParent().player; + if (get.attitude(player, source) > 0) return 0; + if (player.hp - player.countCards("h") > 1) return 1; + return [0, 1].randomGet(); + }); } - else{ - trigger.player.chooseControl().set('choiceList',[ - '令'+get.translation(player)+'将手牌摸至四张', - '令自己本回合的手牌上限-2' - ]).set('ai',function(){ - var player=_status.event.player; - var source=_status.event.getParent().player; - if(get.attitude(player,source)>0) return 0; - if(player.hp-player.countCards('h')>1) return 1; - return [0,1].randomGet(); - }) - } - 'step 1' - if(result.index==0){ + ("step 1"); + if (result.index == 0) { player.drawTo(4); - } - else{ - trigger.player.addTempSkill('xinfu_qianxin2_dis'); + } else { + trigger.player.addTempSkill("xinfu_qianxin2_dis"); } }, }, - "xinfu_fuhai":{ - subSkill:{ - next:{}, - previous:{}, + xinfu_fuhai: { + subSkill: { + next: {}, + previous: {}, }, - audio:2, - group:["fuhai_clear"], - intro:{ - content:"已指定过#个目标", + audio: 2, + group: ["fuhai_clear"], + intro: { + content: "已指定过#个目标", }, - enable:"phaseUse", - filter:function(event,player){ - if(player.hasSkill('xinfu_fuhai_next')&&player.hasSkill('xinfu_fuhai_previous')) return false; - return player.countCards('h')>0; + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("xinfu_fuhai_next") && player.hasSkill("xinfu_fuhai_previous")) + return false; + return player.countCards("h") > 0; }, - filterTarget:function(card,player,target){ - if(![player.next,player.previous].includes(target)||target.countCards('h')==0) return false; - if(player.hasSkill('xinfu_fuhai_next')) return target==player.previous; - if(player.hasSkill('xinfu_fuhai_previous')) return target==player.next; + filterTarget: function (card, player, target) { + if (![player.next, player.previous].includes(target) || target.countCards("h") == 0) + return false; + if (player.hasSkill("xinfu_fuhai_next")) return target == player.previous; + if (player.hasSkill("xinfu_fuhai_previous")) return target == player.next; return true; }, - line:false, - content:function(){ - 'step 0' - event.side=target==player.next?'next':'previous'; - event.current=target; - if(!player.storage.xinfu_fuhai) player.storage.xinfu_fuhai=1; - player.addTempSkill('xinfu_fuhai_'+event.side,'phaseUseAfter'); - 'step 1' - if(player.countCards('h')==0||event.current.countCards('h')==0||event.current==player){ - event.finish(); - return; + line: false, + content: function () { + "step 0"; + event.side = target == player.next ? "next" : "previous"; + event.current = target; + if (!player.storage.xinfu_fuhai) player.storage.xinfu_fuhai = 1; + player.addTempSkill("xinfu_fuhai_" + event.side, "phaseUseAfter"); + ("step 1"); + if ( + player.countCards("h") == 0 || + event.current.countCards("h") == 0 || + event.current == player + ) { + event.finish(); + return; } - var next=event.current[event.side]; - if(get.attitude(event.current,player)>0){ - if(get.attitude(next,target)<=0||next.countCards('h')==0||player.countCards('h')==1){ - event.stopm=true; - event.stopt=true + var next = event.current[event.side]; + if (get.attitude(event.current, player) > 0) { + if ( + get.attitude(next, target) <= 0 || + next.countCards("h") == 0 || + player.countCards("h") == 1 + ) { + event.stopm = true; + event.stopt = true; + } else { + event.stopm = false; + event.stopt = false; } - else{ - event.stopm=false; - event.stopt=false; + } else { + if (get.attitude(next, target) >= 0) { + event.stopt = true; + event.stopm = false; + } else { + event.stopt = false; + event.stopm = false; } } - else{ - if(get.attitude(next,target)>=0){ - event.stopt=true; - event.stopm=false; - } - else{ - event.stopt=false; - event.stopm=false; - } - } - player.markSkill('xinfu_fuhai'); - player.line(event.current,'green'); - player.chooseCard('请选择要展示的牌',true).set('ai',function(card){ - if(_status.event.stop) return 14-get.number(card); - return get.number(card) - }).set('stop',event.stopm); - 'step 2' - event.mes=result.cards[0]; + player.markSkill("xinfu_fuhai"); + player.line(event.current, "green"); + player + .chooseCard("请选择要展示的牌", true) + .set("ai", function (card) { + if (_status.event.stop) return 14 - get.number(card); + return get.number(card); + }) + .set("stop", event.stopm); + ("step 2"); + event.mes = result.cards[0]; player.showCards(event.mes); - 'step 3' - event.current.chooseCard('请选择要展示的牌',true).set('ai',function(card){ - if(_status.event.stop) return get.number(card); - return 14-get.number(card); - }).set('stop',event.stopt); - 'step 4' - event.tes=result.cards[0]; + ("step 3"); + event.current + .chooseCard("请选择要展示的牌", true) + .set("ai", function (card) { + if (_status.event.stop) return get.number(card); + return 14 - get.number(card); + }) + .set("stop", event.stopt); + ("step 4"); + event.tes = result.cards[0]; event.current.showCards(event.tes); - 'step 5' - var num1=get.number(event.mes); - var num2=get.number(event.tes); - if(num10&&event.current.countCards('h')>0&&event.current!=player) event.goto(1); + event.current = event.current[event.side]; + if ( + player.countCards("h") > 0 && + event.current.countCards("h") > 0 && + event.current != player + ) + event.goto(1); } }, - ai:{ - order:1, - result:{ - player:function(player,target){ - var hs=player.countCards('h'); - var side=target==player.next?'next':'previous'; - var current=player; - for(var i=0;i0) return 1; + ai: { + order: 1, + result: { + player: function (player, target) { + var hs = player.countCards("h"); + var side = target == player.next ? "next" : "previous"; + var current = player; + for (var i = 0; i < hs; i++) { + current = current[side]; + if (current == player || !current.countCards("h")) return 0; + if (get.attitude(current, player) > 0) return 1; } return 0; }, }, }, }, - "fuhai_clear":{ - trigger:{ - player:"phaseAfter", + fuhai_clear: { + trigger: { + player: "phaseAfter", }, - forced:true, - silent:true, - popup:false, - filter:function(event,player){ - return player.storage.xinfu_fuhai!=undefined; + forced: true, + silent: true, + popup: false, + filter: function (event, player) { + return player.storage.xinfu_fuhai != undefined; }, - content:function(){ - player.unmarkSkill('xinfu_fuhai'); + content: function () { + player.unmarkSkill("xinfu_fuhai"); delete player.storage.xinfu_fuhai; }, }, - "xz_xunxun":{ - filter:function(event,player){ - var num=game.countPlayer(function(current){ + xz_xunxun: { + filter: function (event, player) { + var num = game.countPlayer(function (current) { return current.isDamaged(); }); - return num>=1&&!player.hasSkill('xunxun'); + return num >= 1 && !player.hasSkill("xunxun"); }, - audio:2, - trigger:{ - player:"phaseDrawBegin1", + audio: 2, + trigger: { + player: "phaseDrawBegin1", }, //priority:10, - content:function(){ - 'step 0' - var cards=get.cards(4); + content: function () { + "step 0"; + var cards = get.cards(4); game.cardsGotoOrdering(cards); - var next=player.chooseToMove('恂恂:将两张牌置于牌堆顶',true); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('filterMove',function(from,to,moved){ - if(to==1&&moved[1].length>=2) return false; + var next = player.chooseToMove("恂恂:将两张牌置于牌堆顶", true); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("filterMove", function (from, to, moved) { + if (to == 1 && moved[1].length >= 2) return false; return true; }); - next.set('filterOk',function(moved){ - return moved[1].length==2; + next.set("filterOk", function (moved) { + return moved[1].length == 2; }); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0).sort(function(a,b){ - return get.value(b)-get.value(a); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.value(a); }); - return [cards,cards.splice(2)]; - }) - 'step 1' - var top=result.moved[0]; - var bottom=result.moved[1]; + return [cards, cards.splice(2)]; + }); + ("step 1"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - for(var i=0;i=1){ - str='
  • 视为拥有技能“恂恂”'; + }); + var str = "暂无任何效果"; + if (num >= 1) { + str = "
  • 视为拥有技能“恂恂”"; } - if(num>=2){ - str+=';使用装备牌时摸一张牌'; + if (num >= 2) { + str += ";使用装备牌时摸一张牌"; } - if(num>=3){ - str+=';始终跳过弃牌阶段'; + if (num >= 3) { + str += ";始终跳过弃牌阶段"; } - if(num==0||num>=4){ - str+=';造成的伤害+1'; + if (num == 0 || num >= 4) { + str += ";造成的伤害+1"; } return str; }, }, - trigger:{ - player:"useCard", + trigger: { + player: "useCard", }, - forced:true, - filter:function(event,player){ - if(get.type(event.card)!='equip') return false; - var num=game.countPlayer(function(current){ + forced: true, + filter: function (event, player) { + if (get.type(event.card) != "equip") return false; + var num = game.countPlayer(function (current) { return current.isDamaged(); }); - return num>=2; + return num >= 2; }, - content:function(){ + content: function () { player.draw(); }, }, - "xinfu_xingzhao2":{ - audio:true, - trigger:{ - player:['phaseJudgeBefore','phaseDiscardBefore'], + xinfu_xingzhao2: { + audio: true, + trigger: { + player: ["phaseJudgeBefore", "phaseDiscardBefore"], }, - forced:true, - filter:function(event,player){ - var num=game.countPlayer(function(current){ + forced: true, + filter: function (event, player) { + var num = game.countPlayer(function (current) { return current.isDamaged(); }); - return num>=3; + return num >= 3; }, - content:function(){ + content: function () { trigger.cancel(); - game.log(player,'跳过了'+(trigger.name=='phaseJudge'?'判定':'弃牌')+'阶段'); + game.log(player, "跳过了" + (trigger.name == "phaseJudge" ? "判定" : "弃牌") + "阶段"); }, }, - xinfu_xingzhao3:{ - audio:'xinfu_xingzhao', - trigger:{ - source:'damageBegin1', + xinfu_xingzhao3: { + audio: "xinfu_xingzhao", + trigger: { + source: "damageBegin1", }, - forced:true, - filter:function(event,player){ - var num=game.countPlayer(function(current){ + forced: true, + filter: function (event, player) { + var num = game.countPlayer(function (current) { return current.isDamaged(); }); - return num==0||num>=4; + return num == 0 || num >= 4; }, - content:function(){ + content: function () { trigger.num++; }, }, - "xinfu_dianhu":{ - audio:2, - trigger:{ - global:"phaseBefore", - player:"enterGame", + xinfu_dianhu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); }, - content:function(){ - 'step 0' - player.chooseTarget('选择【点虎】的目标',lib.translate.xinfu_dianhu_info,true,function(card,player,target){ - return target!=player&&!target.hasSkill('xinfu_dianhu2'); - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att<0) return -att+3; - return Math.random(); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - game.log(target,'成为了','【点虎】','的目标'); - target.storage.xinfu_dianhu2=player; - target.addTempSkill('xinfu_dianhu2',{player:'die'}); + content: function () { + "step 0"; + player + .chooseTarget( + "选择【点虎】的目标", + lib.translate.xinfu_dianhu_info, + true, + function (card, player, target) { + return target != player && !target.hasSkill("xinfu_dianhu2"); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att < 0) return -att + 3; + return Math.random(); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(target, "成为了", "【点虎】", "的目标"); + target.storage.xinfu_dianhu2 = player; + target.addTempSkill("xinfu_dianhu2", { player: "die" }); } }, }, - xinfu_dianhu2:{ - mark:"character", - intro:{ - content:"当你受到来自$的伤害或回复体力后,$摸一张牌", + xinfu_dianhu2: { + mark: "character", + intro: { + content: "当你受到来自$的伤害或回复体力后,$摸一张牌", }, - nopop:true, - trigger:{ - player:["damageEnd","recoverEnd"], + nopop: true, + trigger: { + player: ["damageEnd", "recoverEnd"], }, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - if(player.storage.xinfu_dianhu2&&player.storage.xinfu_dianhu2.isIn()){ - if(event.name=='damage') return event.source==player.storage.xinfu_dianhu2; + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + if (player.storage.xinfu_dianhu2 && player.storage.xinfu_dianhu2.isIn()) { + if (event.name == "damage") return event.source == player.storage.xinfu_dianhu2; return true; } }, - content:function(){ - 'step 0' - var target=player.storage.xinfu_dianhu2; - target.logSkill('xinfu_dianhu'); + content: function () { + "step 0"; + var target = player.storage.xinfu_dianhu2; + target.logSkill("xinfu_dianhu"); target.draw(); }, - onremove:true, + onremove: true, }, - "xinfu_jianji":{ - audio:2, - enable:"phaseUse", - usable:1, - filterTarget:function(card,player,target){ - return target!=player; + xinfu_jianji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; target.draw(); - 'step 1' - var card=result[0]; - if(card&&game.hasPlayer(function(current){ - return target.canUse(card,current); - })&&get.owner(card)==target){ + ("step 1"); + var card = result[0]; + if ( + card && + game.hasPlayer(function (current) { + return target.canUse(card, current); + }) && + get.owner(card) == target + ) { target.chooseToUse({ - prompt:'是否使用'+get.translation(card)+'?', - filterCard:function(cardx,player,target){ - return cardx==_status.event.cardx; + prompt: "是否使用" + get.translation(card) + "?", + filterCard: function (cardx, player, target) { + return cardx == _status.event.cardx; }, - cardx:card, + cardx: card, }); } }, - ai:{ - order:7.5, - result:{ - target:1, + ai: { + order: 7.5, + result: { + target: 1, }, }, }, - "xinfu_lianpian":{ - audio:2, - usable:3, - trigger:{ - player:"useCardToPlayered", + xinfu_lianpian: { + audio: 2, + usable: 3, + trigger: { + player: "useCardToPlayered", }, - frequent:true, - filter:function(event,player){ - if(!event.targets||!event.targets.length|| - event.getParent().triggeredTargets3.length>1||!event.isPhaseUsing(player)) return false; - var evt=player.getLastUsed(1); - if(!evt||!evt.targets||!evt.targets.length||!evt.isPhaseUsing(player)) return false; - for(var i=0;i 1 || + !event.isPhaseUsing(player) + ) + return false; + var evt = player.getLastUsed(1); + if (!evt || !evt.targets || !evt.targets.length || !evt.isPhaseUsing(player)) + return false; + for (var i = 0; i < event.targets.length; i++) { + if (evt.targets.includes(event.targets[i])) return true; } return false; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - event.card=result[0]; - var ablers=player.getLastUsed(1).targets.slice(0); - for(var i=0;i0; - })){ - return num+10; + locked: false, + mod: { + aiOrder: function (player, card, num) { + if ( + player.isPhaseUsing() && + (!player.storage.counttrigger || + !player.storage.counttrigger.xinfu_lianpian || + !player.storage.counttrigger.xinfu_lianpian < 3) + ) { + var evt = player.getLastUsed(); + if ( + evt && + evt.targets && + evt.targets.length && + evt.isPhaseUsing(player) && + game.hasPlayer(function (current) { + return ( + evt.targets.includes(current) && + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + return num + 10; } } }, }, - ai:{ - effect:{ - player:function(card,player,target){ - var evt=player.getLastUsed(); - if(evt&&evt.targets.includes(target)&&(!player.storage.counttrigger||!player.storage.counttrigger.xinfu_lianpian||!player.storage.counttrigger.xinfu_lianpian<3)&&player.isPhaseUsing(player)) return [1.5,0]; - } + ai: { + effect: { + player: function (card, player, target) { + var evt = player.getLastUsed(); + if ( + evt && + evt.targets.includes(target) && + (!player.storage.counttrigger || + !player.storage.counttrigger.xinfu_lianpian || + !player.storage.counttrigger.xinfu_lianpian < 3) && + player.isPhaseUsing(player) + ) + return [1.5, 0]; + }, }, }, }, //糜芳傅士仁 - fengshi:{ - audio:'mffengshi', - audioname:['sp_mifangfushiren'], - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - if(!event.isFirstTarget) return false; - return event.targets.some(target=>{ - return player.countCards('h')>target.countCards('h')&&target.countCards('he')>0&&player.hasCard(card=>{ - return lib.filter.cardDiscardable(card,player,'fengshi'); - },'he'); + fengshi: { + audio: "mffengshi", + audioname: ["sp_mifangfushiren"], + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!event.isFirstTarget) return false; + return event.targets.some((target) => { + return ( + player.countCards("h") > target.countCards("h") && + target.countCards("he") > 0 && + player.hasCard((card) => { + return lib.filter.cardDiscardable(card, player, "fengshi"); + }, "he") + ); }); }, - direct:true, - async content(event,trigger,player){ - const {result:{bool,targets}}=await player.chooseTarget(get.prompt('fengshi'),'弃置你与一名目标角色的各一张牌,然后令'+get.translation(event.card)+'对其造成的伤害+1',(card,player,target)=>{ - const targets=get.event().getTrigger().targets; - if(!targets.includes(target)) return false; - return player.countCards('h')>target.countCards('h')&&target.countCards('he')>0&&player.hasCard(card=>{ - return lib.filter.cardDiscardable(card,player,'fengshi'); - },'he'); - }).set('ai',target=>{ - const player=get.event('player'); - const card=get.event().getTrigger().card; - if(!get.info('dcmffengshi').check({card:card,target:target})) return 0; - return get.effect(target,{name:'guohe_copy2'},player,player); - }); - if(bool){ - const target=targets[0]; - player.logSkill('fengshi',target); - await player.chooseToDiscard('he',true); - await player.discardPlayerCard(target,'he',true); - if(get.tag(trigger.card,'damage')){ - var id=target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].extraDamage!='number') map[id].extraDamage=0; + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget( + get.prompt("fengshi"), + "弃置你与一名目标角色的各一张牌,然后令" + + get.translation(event.card) + + "对其造成的伤害+1", + (card, player, target) => { + const targets = get.event().getTrigger().targets; + if (!targets.includes(target)) return false; + return ( + player.countCards("h") > target.countCards("h") && + target.countCards("he") > 0 && + player.hasCard((card) => { + return lib.filter.cardDiscardable(card, player, "fengshi"); + }, "he") + ); + } + ) + .set("ai", (target) => { + const player = get.event("player"); + const card = get.event().getTrigger().card; + if (!get.info("dcmffengshi").check({ card: card, target: target })) return 0; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + if (bool) { + const target = targets[0]; + player.logSkill("fengshi", target); + await player.chooseToDiscard("he", true); + await player.discardPlayerCard(target, "he", true); + if (get.tag(trigger.card, "damage")) { + var id = target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; map[id].extraDamage++; } } }, - group:'fengshi_target', - subSkill:{ - target:{ - inherit:'dcmffengshi', - trigger:{target:'useCardToTargeted'}, - filter(event,player){ - if(event.player==event.target) return false; - return event.player.countCards('h')>player.countCards('h')&&event.player.countCards('he')>0&&player.hasCard(card=>{ - return lib.filter.cardDiscardable(card,player,'fengshi'); - },'he'); + group: "fengshi_target", + subSkill: { + target: { + inherit: "dcmffengshi", + trigger: { target: "useCardToTargeted" }, + filter(event, player) { + if (event.player == event.target) return false; + return ( + event.player.countCards("h") > player.countCards("h") && + event.player.countCards("he") > 0 && + player.hasCard((card) => { + return lib.filter.cardDiscardable(card, player, "fengshi"); + }, "he") + ); }, - async content(event,trigger,player){ - const target=trigger.player; - await player.chooseToDiscard('he',true); - await player.discardPlayerCard(target,'he',true); - if(get.tag(trigger.card,'damage')){ - var id=player.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].extraDamage!='number') map[id].extraDamage=0; + async content(event, trigger, player) { + const target = trigger.player; + await player.chooseToDiscard("he", true); + await player.discardPlayerCard(target, "he", true); + if (get.tag(trigger.card, "damage")) { + var id = player.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; map[id].extraDamage++; } }, }, }, }, - dcmffengshi:{ - audio:'mffengshi', - audioname:['sp_mifangfushiren'], - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + dcmffengshi: { + audio: "mffengshi", + audioname: ["sp_mifangfushiren"], + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - filter:function(event,player,name){ - if(event.player==event.target||event.targets.length!=1) return false; - return event.player.countCards('h')>event.target.countCards('h')&&event.target.countCards('he')>0&&player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'dcmffengshi'); - },'he'); + filter: function (event, player, name) { + if (event.player == event.target || event.targets.length != 1) return false; + return ( + event.player.countCards("h") > event.target.countCards("h") && + event.target.countCards("he") > 0 && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "dcmffengshi"); + }, "he") + ); }, - logTarget:function(event,player){ - return player==event.player?event.target:event.player; + logTarget: function (event, player) { + return player == event.player ? event.target : event.player; }, - prompt2:function(event,player){ - var target=lib.skill.dcmffengshi.logTarget(event,player); - return '弃置你与'+get.translation(target)+'的各一张牌,然后令'+get.translation(event.card)+'的伤害+1'; + prompt2: function (event, player) { + var target = lib.skill.dcmffengshi.logTarget(event, player); + return ( + "弃置你与" + + get.translation(target) + + "的各一张牌,然后令" + + get.translation(event.card) + + "的伤害+1" + ); }, - check:function(event,player){ - var viewer=player,player=event.player,target=event.target; - if(viewer==player){ - if(get.attitude(viewer,target)>=0) return false; - if(player.countCards('he',(card)=>get.value(card,player)<5)) return true; - var card=get.event().getTrigger().card; - if((get.tag(card,'damage')||target.countCards('he',(card)=>get.value(card,target)>6))&&player.countCards('he',(card)=>get.value(card,player)<7)) return true; + check: function (event, player) { + var viewer = player, + player = event.player, + target = event.target; + if (viewer == player) { + if (get.attitude(viewer, target) >= 0) return false; + if (player.countCards("he", (card) => get.value(card, player) < 5)) return true; + var card = get.event().getTrigger().card; + if ( + (get.tag(card, "damage") || + target.countCards("he", (card) => get.value(card, target) > 6)) && + player.countCards("he", (card) => get.value(card, player) < 7) + ) + return true; return false; - } - else{ - if(get.attitude(viewer,player)>=0) return false; - if(!get.tag(card,'damage')) return false; - if(viewer.countCards('he')>player.countCards('he')) return true; - if(viewer.countCards('he',(card)=>get.value(card,target)>6)) return false; + } else { + if (get.attitude(viewer, player) >= 0) return false; + if (!get.tag(card, "damage")) return false; + if (viewer.countCards("he") > player.countCards("he")) return true; + if (viewer.countCards("he", (card) => get.value(card, target) > 6)) return false; return true; } }, - content:function(){ - if(get.tag(trigger.card,'damage')) trigger.getParent().baseDamage++; - var target=lib.skill.dcmffengshi.logTarget(trigger,player); - player.chooseToDiscard('he',true); - player.discardPlayerCard(target,'he',true); + content: function () { + if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; + var target = lib.skill.dcmffengshi.logTarget(trigger, player); + player.chooseToDiscard("he", true); + player.discardPlayerCard(target, "he", true); }, }, - mffengshi:{ - audio:2, - audioname:['sp_mifangfushiren'], - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + mffengshi: { + audio: 2, + audioname: ["sp_mifangfushiren"], + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - direct:true, - preHidden:true, - filter:function(event,player){ - if(event.player==event.target||event.targets.length!=1) return false; - if(player!=event.player&&!player.hasSkill('mffengshi')) return false; - return event.player.countCards('h')>event.target.countCards('h')&&event.target.countCards('he')>0; + direct: true, + preHidden: true, + filter: function (event, player) { + if (event.player == event.target || event.targets.length != 1) return false; + if (player != event.player && !player.hasSkill("mffengshi")) return false; + return ( + event.player.countCards("h") > event.target.countCards("h") && + event.target.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - event.source=trigger.player; - event.target=(player==trigger.target?trigger.player:trigger.target); + content: function () { + "step 0"; + event.source = trigger.player; + event.target = player == trigger.target ? trigger.player : trigger.target; var str; - if(player==trigger.player) str='弃置自己的和该角色'; - else str='令其弃置其与你的'; - var next=trigger.player.chooseBool('是否对'+get.translation(trigger.target)+'发动【锋势】?',str+'的各一张牌,然后令'+get.translation(trigger.card)+'的伤害+1').set('ai',function(){ - var player=_status.event.getParent().player; - var target=_status.event.getParent().target; - var viewer=_status.event.player; - if(viewer==player){ - if(get.attitude(viewer,target)>=0) return false; - if(player.countCards('he',(card)=>get.value(card,player)<5)) return true; - var card=_status.event.getTrigger().card; - if((get.tag(card,'damage')||target.countCards('he',(card)=>get.value(card,target)>6))&&player.countCards('he',(card)=>get.value(card,player)<7)) return true; - return false; + if (player == trigger.player) str = "弃置自己的和该角色"; + else str = "令其弃置其与你的"; + var next = trigger.player + .chooseBool( + "是否对" + get.translation(trigger.target) + "发动【锋势】?", + str + "的各一张牌,然后令" + get.translation(trigger.card) + "的伤害+1" + ) + .set("ai", function () { + var player = _status.event.getParent().player; + var target = _status.event.getParent().target; + var viewer = _status.event.player; + if (viewer == player) { + if (get.attitude(viewer, target) >= 0) return false; + if (player.countCards("he", (card) => get.value(card, player) < 5)) + return true; + var card = _status.event.getTrigger().card; + if ( + (get.tag(card, "damage") || + target.countCards("he", (card) => get.value(card, target) > 6)) && + player.countCards("he", (card) => get.value(card, player) < 7) + ) + return true; + return false; + } else { + if (get.attitude(viewer, player) >= 0) return false; + if (!get.tag(card, "damage")) return false; + if (viewer.countCards("he") > player.countCards("he")) return true; + if (viewer.countCards("he", (card) => get.value(card, target) > 6)) + return false; + return true; + } + }); + if (player == next.player) next.setHiddenSkill("mffengshi"); + ("step 1"); + if (result.bool) { + if (player == source) player.logSkill("mffengshi", target); + else { + player.logSkill("mffengshi"); + source.line(player, "green"); } - else{ - if(get.attitude(viewer,player)>=0) return false; - if(!get.tag(card,'damage')) return false; - if(viewer.countCards('he')>player.countCards('he')) return true; - if(viewer.countCards('he',(card)=>get.value(card,target)>6)) return false; - return true; - } - }); - if(player==next.player) next.setHiddenSkill('mffengshi'); - 'step 1' - if(result.bool){ - if(player==source) player.logSkill('mffengshi',target); - else{ - player.logSkill('mffengshi'); - source.line(player,'green'); - } - if(get.tag(trigger.card,'damage')) trigger.getParent().baseDamage++; - player.chooseToDiscard('he',true); - } - else event.finish(); - 'step 2' - if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,'he',true); + if (get.tag(trigger.card, "damage")) trigger.getParent().baseDamage++; + player.chooseToDiscard("he", true); + } else event.finish(); + ("step 2"); + if (target.countDiscardableCards(player, "he") > 0) + player.discardPlayerCard(target, "he", true); }, }, }, - card:{ - }, - characterIntro:{ - tangji:'唐姬,会稽太守唐瑁女,弘农怀王刘辩的妃子。刘辩死后,唐姬回归故里,因节烈不愿改嫁他人,后被汉献帝下诏封为弘农王妃。', - lijue:"李傕(一说“傕”读音“què”)(?—198年),字稚然。北地郡泥阳县(今陕西省耀县)人,汉末群雄之一。东汉末年汉献帝时的军阀、权臣,官至大司马、车骑将军、开府、领司隶校尉、假节。
    李傕本为董卓部将,后被董卓的女婿牛辅派遣至中牟与朱儁交战,大破朱儁,进而至陈留、颍川等地劫掠。初平三年(192年)董卓和牛辅被杀后,李傕归无所依,于是采用贾诩之谋,伙同郭汜、张济、樊稠等原董卓部曲将攻向长安。击败吕布,杀死王允等人,占领长安,把持朝廷大权。后诸将不和,李傕在会议上杀死了樊稠,又与郭汜分别劫持了汉献帝和众臣,相互交战,张济率兵赶来和解,于是二人罢兵,李傕出屯池阳黄白城,郭汜、张济等人随汉献帝东归前往弘农。
    后来,李傕、郭汜、张济反悔,联合起来追击汉献帝,与杨奉、董承等人几番交战。汉献帝一路逃亡,狼狈不堪,到达安邑,与李傕等人讲和。不久,汉献帝被曹操迎往许都。建安三年(198年),曹操派谒者仆射裴茂召集关西诸将段煨等人征讨李傕,灭其三族。", - zhangji:"张济(?-196年),武威郡祖厉县(今甘肃靖远东南)人。东汉末年割据军阀之一。 张济原为董卓部将,董卓被诛杀后,张济与李傕一同率军攻破长安,任中郎将。不久,升任镇东将军,封平阳侯,出屯弘农。献帝东迁时,张济升任骠骑将军,率军护卫献帝,后来因与董承等人有矛盾,便与李傕、郭汜一同追赶献帝。 建安元年(196年),张济因军队缺粮而进攻穰城,中流矢而死。死后,部队由侄儿张绣接管。", - guosi:"郭汜(?-197年),又名郭多,凉州张掖(今甘肃张掖西北)人,东汉末年将领、军阀,献帝时权臣。原为董卓部下。董卓被杀后,凉州众将归无所依,于是采用贾诩之谋,联兵将攻向长安,击败吕布,杀死王允等人,占领长安,把持朝廷大权。几年后,郭汜被部将伍习杀死。", - fanchou:"樊稠(?—195年),凉州金城(治今甘肃永靖西北)人。东汉末年军阀、将领。官至右将军,封万年侯。 原为董卓部将,董卓死后,伙同李傕、郭汜、张济等人合众十余万反扑长安,败吕布、杀王允,把持朝政。后马腾因与李傕有隙,于是联合韩遂举兵进攻,李傕派樊稠、郭汜等与其交战,大败马腾、韩遂于长平观下。樊稠追至陈仓,与韩遂友好罢兵,却遭李傕猜疑。兴平二年(195年),李傕让外甥骑都尉胡封在会议上将樊稠刺死(一说趁醉用杖击杀)。", - lvkai:"吕凯(?―225年),字季平,永昌郡不韦县(今云南保山东北)人,三国时期蜀汉官员。初任永昌郡五官掾功曹。章武三年(223年),建宁太守雍闿反叛,投降吴国,吴国任雍闿为永昌太守,吕凯闭境抗拒雍闿。建兴三年(225年),丞相诸葛亮南征,表奏吕凯功劳,任命他为云南太守,封阳迁亭侯。吕凯还未上任,便被叛乱的少数民族杀害。", - zhanggong:"张恭(生卒年不详),三国时期魏国大臣,与子张就一同闻名于西域。官至西域戊己校尉、关内侯,赠执金吾。初为敦煌郡功曹。东汉末河西大乱,太守马艾卒官,他被众人推为代理长史,遂派儿子张就请曹操委任太守,直至新太守到任。魏文帝时拜西域戊己校尉。魏明帝时去世。", - weiwenzhugezhi:"卫温 (?—231年),三国时期东吴将领,曾任将军职。诸葛直(?—231年),三国时期东吴将领。黄龙二年(230年)正月,孙权派卫温、诸葛直带领上万士兵出海寻找夷洲、亶洲,想要俘获那里的民众以充实东吴的人口,陆逊和全琮都谏言反对,孙权不听。230年和卫温一起登上台湾(当时的台湾叫做夷洲),他们是中国历史上记载的最早登陆台湾的人。卫温和诸葛直花费了约一年时间行军,士兵们因为疾病死去了十分之八到十分之九,因为亶洲太过遥远,卫温和诸葛直最终没能到达那里,只带了几千名夷洲的人返回。黄龙三年(231年),孙权认为诸葛直违背诏令,劳财伤民,无功而返,和卫温一同入狱被处死。", - xurong:"徐荣(?-192年),玄菟人(一说为辽东襄平人,《公孙度传》中说公孙度本辽东襄平人,迁居玄菟,为同郡徐荣所举,任辽东太守。同郡当是同“玄菟”郡),东汉末年将领。本为中郎将,曾向董卓推举同郡出身的公孙度出任辽东太守。于汴水之战中击败曹操的独立追击军,以及在梁东之战中击败孙坚的部队。在董卓死后,受司徒王允的命令与李傕、郭汜交战,因部将胡珍投降,寡不敌众,于新丰之战被击败,战死在乱军之中。", - zhangqiying:"张琪瑛(196年-217年),字不详(或琪瑛为字,名不详),祖籍沛国丰县(今江苏省丰县)。她的曾祖父张陵是西汉留侯张良的十一世孙、天师道(五斗米道)教祖,她的父亲是东汉末年割据汉中的军阀张鲁。张琪瑛继承家说,是五斗米教的传人。", - beimihu:'卑弥呼(ひみこ,约159年-约249年,有的史书也写成“俾弥呼”)是日本弥生时代邪马台国(今日本本州近畿地区)的女王,在《三国志·魏书·倭人传》中有关于她的记载。关于她的真实身份一直众说纷纭,是个极具神秘色彩的古代女性统治者。亦是日本古代宗教鬼道教的发源者。', - liuqi:'刘琦(?-209年)。兖州山阳郡高平县(今山东省济宁市微山县两城镇)人。荆州牧刘表的长子、谏议大夫刘琮兄。官至荆州刺史。建安十四年(209年)病逝。', - tangzi:"唐咨(生卒年不详),三国时魏利城(今江苏赣榆西)人。魏文帝黄初中利城郡反,推唐咨为主。后为魏军击破,遂亡至吴,官至左将军,封侯、持节。后助诸葛诞拒魏,兵败被俘。为安抚吴国军民,魏主拜唐咨为安远将军。", - huangquan:"黄权(?-240年),字公衡。巴西郡阆中县(今四川阆中)人。三国时期蜀汉、曹魏将领。
    黄权年轻时为郡吏,后被益州牧刘璋召为主簿。曾劝谏刘璋不要迎接刘备,因而被外放为广汉县长。刘璋败,才降刘备,被拜为偏将军。建计取汉中,拜护军。刘备为汉中王,仍领益州牧,以黄权为治中从事。及刘备称帝,将伐吴,黄权劝谏而不纳。以其为镇北将军,督江北军以防魏师进攻。刘备伐吴败还,而归途隔绝,黄权不得归,无奈之下率部降魏。被魏文帝所赏识,拜镇南将军,封育阳侯,加侍中,使同车陪乘。后领益州刺史,进驻河南。景初三年(239年),迁车骑将军、仪同三司。正始元年(240年),黄权去世,谥号“景”。", - sufei:"苏飞(生卒年不详),东汉末年人物,原为东汉末年荆州牧刘表的部将,任江夏都督。
    苏飞与甘宁交好,但是数次向黄祖推荐都失败。甘宁决定投效孙权时助其逃离。后来甘宁率吴军攻破江夏,苏飞兵败被俘。孙权打算将苏飞处斩,但是因为甘宁用性命担保而赦免了苏飞。降吴后官至军都督。", + card: {}, + characterIntro: { + tangji: "唐姬,会稽太守唐瑁女,弘农怀王刘辩的妃子。刘辩死后,唐姬回归故里,因节烈不愿改嫁他人,后被汉献帝下诏封为弘农王妃。", + lijue: "李傕(一说“傕”读音“què”)(?—198年),字稚然。北地郡泥阳县(今陕西省耀县)人,汉末群雄之一。东汉末年汉献帝时的军阀、权臣,官至大司马、车骑将军、开府、领司隶校尉、假节。
    李傕本为董卓部将,后被董卓的女婿牛辅派遣至中牟与朱儁交战,大破朱儁,进而至陈留、颍川等地劫掠。初平三年(192年)董卓和牛辅被杀后,李傕归无所依,于是采用贾诩之谋,伙同郭汜、张济、樊稠等原董卓部曲将攻向长安。击败吕布,杀死王允等人,占领长安,把持朝廷大权。后诸将不和,李傕在会议上杀死了樊稠,又与郭汜分别劫持了汉献帝和众臣,相互交战,张济率兵赶来和解,于是二人罢兵,李傕出屯池阳黄白城,郭汜、张济等人随汉献帝东归前往弘农。
    后来,李傕、郭汜、张济反悔,联合起来追击汉献帝,与杨奉、董承等人几番交战。汉献帝一路逃亡,狼狈不堪,到达安邑,与李傕等人讲和。不久,汉献帝被曹操迎往许都。建安三年(198年),曹操派谒者仆射裴茂召集关西诸将段煨等人征讨李傕,灭其三族。", + zhangji: + "张济(?-196年),武威郡祖厉县(今甘肃靖远东南)人。东汉末年割据军阀之一。 张济原为董卓部将,董卓被诛杀后,张济与李傕一同率军攻破长安,任中郎将。不久,升任镇东将军,封平阳侯,出屯弘农。献帝东迁时,张济升任骠骑将军,率军护卫献帝,后来因与董承等人有矛盾,便与李傕、郭汜一同追赶献帝。 建安元年(196年),张济因军队缺粮而进攻穰城,中流矢而死。死后,部队由侄儿张绣接管。", + guosi: "郭汜(?-197年),又名郭多,凉州张掖(今甘肃张掖西北)人,东汉末年将领、军阀,献帝时权臣。原为董卓部下。董卓被杀后,凉州众将归无所依,于是采用贾诩之谋,联兵将攻向长安,击败吕布,杀死王允等人,占领长安,把持朝廷大权。几年后,郭汜被部将伍习杀死。", + fanchou: + "樊稠(?—195年),凉州金城(治今甘肃永靖西北)人。东汉末年军阀、将领。官至右将军,封万年侯。 原为董卓部将,董卓死后,伙同李傕、郭汜、张济等人合众十余万反扑长安,败吕布、杀王允,把持朝政。后马腾因与李傕有隙,于是联合韩遂举兵进攻,李傕派樊稠、郭汜等与其交战,大败马腾、韩遂于长平观下。樊稠追至陈仓,与韩遂友好罢兵,却遭李傕猜疑。兴平二年(195年),李傕让外甥骑都尉胡封在会议上将樊稠刺死(一说趁醉用杖击杀)。", + lvkai: "吕凯(?―225年),字季平,永昌郡不韦县(今云南保山东北)人,三国时期蜀汉官员。初任永昌郡五官掾功曹。章武三年(223年),建宁太守雍闿反叛,投降吴国,吴国任雍闿为永昌太守,吕凯闭境抗拒雍闿。建兴三年(225年),丞相诸葛亮南征,表奏吕凯功劳,任命他为云南太守,封阳迁亭侯。吕凯还未上任,便被叛乱的少数民族杀害。", + zhanggong: + "张恭(生卒年不详),三国时期魏国大臣,与子张就一同闻名于西域。官至西域戊己校尉、关内侯,赠执金吾。初为敦煌郡功曹。东汉末河西大乱,太守马艾卒官,他被众人推为代理长史,遂派儿子张就请曹操委任太守,直至新太守到任。魏文帝时拜西域戊己校尉。魏明帝时去世。", + weiwenzhugezhi: + "卫温 (?—231年),三国时期东吴将领,曾任将军职。诸葛直(?—231年),三国时期东吴将领。黄龙二年(230年)正月,孙权派卫温、诸葛直带领上万士兵出海寻找夷洲、亶洲,想要俘获那里的民众以充实东吴的人口,陆逊和全琮都谏言反对,孙权不听。230年和卫温一起登上台湾(当时的台湾叫做夷洲),他们是中国历史上记载的最早登陆台湾的人。卫温和诸葛直花费了约一年时间行军,士兵们因为疾病死去了十分之八到十分之九,因为亶洲太过遥远,卫温和诸葛直最终没能到达那里,只带了几千名夷洲的人返回。黄龙三年(231年),孙权认为诸葛直违背诏令,劳财伤民,无功而返,和卫温一同入狱被处死。", + xurong: "徐荣(?-192年),玄菟人(一说为辽东襄平人,《公孙度传》中说公孙度本辽东襄平人,迁居玄菟,为同郡徐荣所举,任辽东太守。同郡当是同“玄菟”郡),东汉末年将领。本为中郎将,曾向董卓推举同郡出身的公孙度出任辽东太守。于汴水之战中击败曹操的独立追击军,以及在梁东之战中击败孙坚的部队。在董卓死后,受司徒王允的命令与李傕、郭汜交战,因部将胡珍投降,寡不敌众,于新丰之战被击败,战死在乱军之中。", + zhangqiying: + "张琪瑛(196年-217年),字不详(或琪瑛为字,名不详),祖籍沛国丰县(今江苏省丰县)。她的曾祖父张陵是西汉留侯张良的十一世孙、天师道(五斗米道)教祖,她的父亲是东汉末年割据汉中的军阀张鲁。张琪瑛继承家说,是五斗米教的传人。", + beimihu: + "卑弥呼(ひみこ,约159年-约249年,有的史书也写成“俾弥呼”)是日本弥生时代邪马台国(今日本本州近畿地区)的女王,在《三国志·魏书·倭人传》中有关于她的记载。关于她的真实身份一直众说纷纭,是个极具神秘色彩的古代女性统治者。亦是日本古代宗教鬼道教的发源者。", + liuqi: "刘琦(?-209年)。兖州山阳郡高平县(今山东省济宁市微山县两城镇)人。荆州牧刘表的长子、谏议大夫刘琮兄。官至荆州刺史。建安十四年(209年)病逝。", + tangzi: "唐咨(生卒年不详),三国时魏利城(今江苏赣榆西)人。魏文帝黄初中利城郡反,推唐咨为主。后为魏军击破,遂亡至吴,官至左将军,封侯、持节。后助诸葛诞拒魏,兵败被俘。为安抚吴国军民,魏主拜唐咨为安远将军。", + huangquan: + "黄权(?-240年),字公衡。巴西郡阆中县(今四川阆中)人。三国时期蜀汉、曹魏将领。
    黄权年轻时为郡吏,后被益州牧刘璋召为主簿。曾劝谏刘璋不要迎接刘备,因而被外放为广汉县长。刘璋败,才降刘备,被拜为偏将军。建计取汉中,拜护军。刘备为汉中王,仍领益州牧,以黄权为治中从事。及刘备称帝,将伐吴,黄权劝谏而不纳。以其为镇北将军,督江北军以防魏师进攻。刘备伐吴败还,而归途隔绝,黄权不得归,无奈之下率部降魏。被魏文帝所赏识,拜镇南将军,封育阳侯,加侍中,使同车陪乘。后领益州刺史,进驻河南。景初三年(239年),迁车骑将军、仪同三司。正始元年(240年),黄权去世,谥号“景”。", + sufei: "苏飞(生卒年不详),东汉末年人物,原为东汉末年荆州牧刘表的部将,任江夏都督。
    苏飞与甘宁交好,但是数次向黄祖推荐都失败。甘宁决定投效孙权时助其逃离。后来甘宁率吴军攻破江夏,苏飞兵败被俘。孙权打算将苏飞处斩,但是因为甘宁用性命担保而赦免了苏飞。降吴后官至军都督。", - zhangchangpu:"钟会的母亲。《母夫人张氏传》:夫人张氏,字昌蒲,太原兹氏人,太傅定陵成侯之命妇也。", - xugong:"许贡是东汉末官吏。先后任吴郡都尉、太守,欲送密信给曹操,要曹操注意孙策,却被孙策发现而被杀。许贡生前招揽了一些门客,当中有三人不忘故主,千方百计想要手刃仇人。建安五年(公元200年),广陵太守陈登派人秘密联系孙策治下的山贼余党,企图颠覆孙策在江东的统治。孙策决定讨伐陈登,行军到丹徒时,许贡门客终于找到了机会。因为孙策有单骑出猎,在野外思考的习惯,三门客趁孙策轻装外出打猎时,放冷箭射中孙策面颊。这些门客后来在与孙策的搏斗中,被赶到的侍卫杀死。孙策此后因为伤口感染,并且俊美的容貌被毁,终于不治身亡,去世时年仅26岁。", - mangyachang:"南蛮王孟获的部将,使一口截头大刀,骑一匹黄骠马。率军与蜀军交战,战败王平。后被平北将军马岱斩杀。只出现在《三国演义》里,正史中无此人。", - xushao:'许劭(150年—195年),字子将。汝南平舆(今河南平舆县射桥镇)人。东汉末年著名人物评论家。据说他每月都要对当时人物进行一次品评,人称为“月旦评”。曾任汝南郡功曹,后南渡投靠扬州刺史刘繇。刘繇被孙策击败后,许劭随其逃往豫章郡,并在豫章去世。', - zhangwen:'张温(193年—230年),字惠恕,吴郡吴县(今江苏苏州)人。少修节操,容貌奇伟。孙权召拜议郎、选曹尚书,徙太子太傅。黄武三年(224),以辅义中郎将身份出使蜀汉,孙权原先害怕诸葛亮会有意留难张温,但张温不担心。在呈上蜀汉朝廷的文书刻意称颂蜀汉,以表明和解的诚意,重建两国关系。他在蜀汉表现出色,得蜀汉朝廷重视。回东吴后不久,被调进豫章的军队,事业上再无进展。孙权一方面介怀他出使蜀汉时称颂蜀汉,又嫌他声名太盛,恐怕张温不会尽忠地由他任用。当时正好碰上暨艳事件,暨艳是张温引荐的臣子,但他滥用职权,升迁评定等只看自己喜恶。事件被揭发后暨艳及同党徐彪都自杀。孙权见此,于是以张温与暨艳、徐彪等人多有来往而下罪张温,后更将张温发还到家乡吴郡。将军骆统曾上书为张温辩解,但孙权不理会。六年后,张温病逝。', - lisu:'李肃(?-192年),五原(治今内蒙古包头西北)人。永汉三年四月,司徒王允、尚书仆射士孙瑞、卓将吕布共谋诛卓。是时,天子有疾新愈,大会未央殿。布使同郡骑都尉肃等、将亲兵十馀人,伪著卫士服守掖门。布怀诏书。卓至,肃等格卓。卓惊呼布所在。布曰“有诏”,遂杀卓,夷三族。后卓女婿中郎将牛辅典兵别屯陕,分遣校尉李傕、郭汜、张济略陈留、颍川诸县。卓死,吕布使李肃至陕,欲以诏命诛辅。辅等逆与肃战,肃败走弘农,布诛肃。', - xinpi:'辛毗(生卒年不详),字佐治,颍川阳翟人。三国时期曹魏大臣。原居陇西(郡治在今甘肃临洮县),东汉光武帝建武年间,其先人东迁。当初,辛毗跟随其兄事袁绍。曹操任司空时,征召辛毗,他不受命。官渡战后,辛毗事袁绍的儿子袁谭。公元204年,曹操攻下邺城,上表推荐辛毗任议郎,后为丞相长史。公元220年,曹丕即皇帝位,以辛毗为侍中,赐爵关内侯,后赐广平亭侯。魏明帝即位,封辛毗颍乡侯,食邑三百户,后为卫尉。公元234年,诸葛亮屯兵渭南,司马懿上表魏明帝。魏明帝任辛毗为大将军军师,加使持节号。诸葛亮病逝后,辛毗返回,仍任卫尉。不久,逝世,谥肃侯。', + zhangchangpu: + "钟会的母亲。《母夫人张氏传》:夫人张氏,字昌蒲,太原兹氏人,太傅定陵成侯之命妇也。", + xugong: "许贡是东汉末官吏。先后任吴郡都尉、太守,欲送密信给曹操,要曹操注意孙策,却被孙策发现而被杀。许贡生前招揽了一些门客,当中有三人不忘故主,千方百计想要手刃仇人。建安五年(公元200年),广陵太守陈登派人秘密联系孙策治下的山贼余党,企图颠覆孙策在江东的统治。孙策决定讨伐陈登,行军到丹徒时,许贡门客终于找到了机会。因为孙策有单骑出猎,在野外思考的习惯,三门客趁孙策轻装外出打猎时,放冷箭射中孙策面颊。这些门客后来在与孙策的搏斗中,被赶到的侍卫杀死。孙策此后因为伤口感染,并且俊美的容貌被毁,终于不治身亡,去世时年仅26岁。", + mangyachang: + "南蛮王孟获的部将,使一口截头大刀,骑一匹黄骠马。率军与蜀军交战,战败王平。后被平北将军马岱斩杀。只出现在《三国演义》里,正史中无此人。", + xushao: "许劭(150年—195年),字子将。汝南平舆(今河南平舆县射桥镇)人。东汉末年著名人物评论家。据说他每月都要对当时人物进行一次品评,人称为“月旦评”。曾任汝南郡功曹,后南渡投靠扬州刺史刘繇。刘繇被孙策击败后,许劭随其逃往豫章郡,并在豫章去世。", + zhangwen: + "张温(193年—230年),字惠恕,吴郡吴县(今江苏苏州)人。少修节操,容貌奇伟。孙权召拜议郎、选曹尚书,徙太子太傅。黄武三年(224),以辅义中郎将身份出使蜀汉,孙权原先害怕诸葛亮会有意留难张温,但张温不担心。在呈上蜀汉朝廷的文书刻意称颂蜀汉,以表明和解的诚意,重建两国关系。他在蜀汉表现出色,得蜀汉朝廷重视。回东吴后不久,被调进豫章的军队,事业上再无进展。孙权一方面介怀他出使蜀汉时称颂蜀汉,又嫌他声名太盛,恐怕张温不会尽忠地由他任用。当时正好碰上暨艳事件,暨艳是张温引荐的臣子,但他滥用职权,升迁评定等只看自己喜恶。事件被揭发后暨艳及同党徐彪都自杀。孙权见此,于是以张温与暨艳、徐彪等人多有来往而下罪张温,后更将张温发还到家乡吴郡。将军骆统曾上书为张温辩解,但孙权不理会。六年后,张温病逝。", + lisu: "李肃(?-192年),五原(治今内蒙古包头西北)人。永汉三年四月,司徒王允、尚书仆射士孙瑞、卓将吕布共谋诛卓。是时,天子有疾新愈,大会未央殿。布使同郡骑都尉肃等、将亲兵十馀人,伪著卫士服守掖门。布怀诏书。卓至,肃等格卓。卓惊呼布所在。布曰“有诏”,遂杀卓,夷三族。后卓女婿中郎将牛辅典兵别屯陕,分遣校尉李傕、郭汜、张济略陈留、颍川诸县。卓死,吕布使李肃至陕,欲以诏命诛辅。辅等逆与肃战,肃败走弘农,布诛肃。", + xinpi: "辛毗(生卒年不详),字佐治,颍川阳翟人。三国时期曹魏大臣。原居陇西(郡治在今甘肃临洮县),东汉光武帝建武年间,其先人东迁。当初,辛毗跟随其兄事袁绍。曹操任司空时,征召辛毗,他不受命。官渡战后,辛毗事袁绍的儿子袁谭。公元204年,曹操攻下邺城,上表推荐辛毗任议郎,后为丞相长史。公元220年,曹丕即皇帝位,以辛毗为侍中,赐爵关内侯,后赐广平亭侯。魏明帝即位,封辛毗颍乡侯,食邑三百户,后为卫尉。公元234年,诸葛亮屯兵渭南,司马懿上表魏明帝。魏明帝任辛毗为大将军军师,加使持节号。诸葛亮病逝后,辛毗返回,仍任卫尉。不久,逝世,谥肃侯。", - liuzan:'字正明,会稽长山人人,曾任左护军,有两子:留略、留平。少为会稽郡吏,曾参与镇压黄巾起义,后被东吴大将凌统所引用,任屯骑校尉。吴五凤二年(公元255年)留赞任左护军,随孙峻征淮南,因病撤军,被魏将蒋班围困于道,力战而死,时年73岁。', - zhujun:'朱儁(?-195年),字公伟。会稽郡上虞县(今浙江绍兴上虞区)人。东汉末年名将。朱儁出身寒门,赡养母亲,以好义轻财闻名,受乡里敬重。后被太守徐珪举为孝廉,任兰陵令,颇有治绩。再升任交州刺史,以家兵五千大破叛军,平定交州。战后以功封都亭侯,入朝为谏议大夫。光和七年(184年),黄巾起义爆发,朱儁以右中郎将、持节平定三郡之地,以功进封西乡侯,迁镇贼中郎将。又率军讨平黄巾,“威声满天下”。中平二年(185年),进拜右车骑将军,更封钱塘侯。后为河内太守,击退进逼的张燕。权臣董卓秉政时,想任朱儁为副手,遭其婉拒。其后出逃荆州,更屯军中牟,徐州刺史陶谦等欲推举他为太师,并传檄各州牧伯,相邀讨伐李傕、奉迎天子。但朱儁却奉诏入京任太仆。初平三年(192年),升任太尉、录尚书事。兴平元年(194年),行骠骑将军事,持节镇关东,因故未成行。兴平二年(195年),李傕与郭汜相互攻杀,郭汜扣留朱儁作为人质。朱儁性格刚烈,即日发病而死。', - liuhong:'汉灵帝刘宏(157年,一作156年-189年5月13日),生于冀州河间国(今河北深州)。东汉第十二位皇帝(168年-189年在位),汉章帝刘炟的玄孙。刘宏早年世袭解渎亭侯。永康元年(167年)十二月,汉桓帝刘志逝世,刘宏被外戚窦氏挑选为皇位继承人,于建宁元年(168年)正月即位。刘宏在位的大部分时期,施行党锢及宦官政治。他又设置西园,巧立名目搜刮钱财,甚至卖官鬻爵以用于自己享乐。在位晚期,爆发了黄巾起义,而凉州等地也陷入持续动乱之中。中平六年(189年),刘宏去世,谥号孝灵皇帝,葬于文陵。刘宏喜好辞赋,作有《皇羲篇》、《追德赋》、《令仪颂》、《招商歌》等。', - wangrong:'汉灵怀皇后王荣(?~181年),赵国邯郸(今河北邯郸市)人。五官中郎将王苞孙女,汉灵帝刘宏妃子,汉献帝刘协生母。初以良家子选入掖庭,封为美人,服侍汉灵帝。光和四年(181年),生下陈留王刘协,惨遭灵思皇后毒杀。王荣死后,汉灵帝曾作《追德赋》、《令仪颂》。永汉元年(189年),其子刘协即位,是为汉献帝,追谥灵怀皇后,葬于文昭陵。', - hanfu:'韩馥(?—191年),字文节,颍川郡(今河南禹州)人。东汉末年的诸侯,冀州牧。韩馥担任过东汉的御史中丞,之后被董卓举荐为冀州牧;在各诸侯起兵讨伐董卓时,韩馥也是其中之一的参与者。韩馥与袁绍也曾经有意立刘虞为皇帝。当时冀州民殷人盛,兵粮优足,于是袁绍便用计夺取冀州,韩馥被迫投靠张邈;之后张邈与袁绍的使者见面,韩馥以为是要来杀害自己的,于是在厕所中以刻书用的小刀自杀。', - zhaozhong:'赵忠(?—189年),安平人,东汉末年宦官,赵延之兄。桓帝、灵帝时,历为小黄门、中常侍、大长秋、车骑将军等职,封都乡侯。在职时以搜刮暴敛、骄纵贪婪见称,灵帝极为宠信,常谓“赵常侍是我母”。中平六年(189年),何进谋诛宦官,事泄,他和其余几个常侍设计伏杀何进,袁绍、袁术等人闻何进被杀,入宫杀尽宦官,后捕杀赵忠。', - caosong:'曹嵩(?—194年),字巨高,沛郡谯县(今安徽省亳州市)人。东汉大臣,大长秋曹腾的养子,曹操之父亲。门荫入仕,历任司隶校尉、鸿胪卿、大司农,位列九卿,位高权重。中平四年(187年),靠着贿赂中官,出任太尉,位列三公。中平五年(188年),受累于黄巾之乱,坐罪免官。兴平元年(194年),投奔兖州牧曹操,遇害于徐州。延康元年(220年),追尊魏国太王。曹魏建立后,追尊皇帝,谥号为太。', - liangxing:'梁兴(?-212年),武威郡姑臧人也,东汉末年凉州军阀之一。与张横、贾诩、段煨是同乡,曾斩杀李傕。建安十六年,同韩遂、马超联合,起兵反抗曹操。梁兴率步骑五千夜袭曹军先头部队徐晃,被击退。联军战败后,梁兴逃到蓝田,劫掠周围郡县。夏侯渊进攻蓝田联合郑浑征讨梁兴,梁兴战败,不知所终。', - zhangmiao:'张邈(?-195年),字孟卓,东平寿张(今山东东平县)人。东汉大臣、名士,“八厨”之一。举孝廉出身,授骑都尉,出任陈留太守。参与讨伐董卓,参加汴水之战,归附于曹操。兴平元年(194年),趁着曹操讨伐徐州牧陶谦,联合陈宫发动叛乱,迎立吕布为兖州牧。受到曹操讨伐,兵败投奔徐州牧刘备。兴平二年,张邈向袁术借兵途中,被部下所杀。', - duanwei:'段煨(?~209年),字忠明,武威郡姑臧(今甘肃省武威市)人也。东汉末年将领,东汉太尉段颎同族兄弟,与太尉贾诩、张济、宣威侯张绣乃是同乡。原为董卓帐下将领,奉命屯兵华阴,勤劳农业。兴平二年(195年),迎接汉献帝刘协东归洛阳,供给衣食补给,与护驾将领杨定不和,引发激战十余天,听从汉献帝刘协劝解。东汉建安三年(198年),攻打黄白城,击杀李傕,夷其三族,封为镇远将军、闅乡亭侯、北地太守,累迁大鸿胪、金光禄大夫。建安十四年(209年),寿终正寝。', - zhangheng:'张横,生卒年不详,武威郡姑臧人,东汉末年凉州军阀之一。与梁兴、贾诩、段煨乃是同乡。建安三年(198),张横与梁兴、段煨等斩杀李傕。十六年(211),同韩遂、马超联合,起兵反抗曹操,兵败后不知所终。', - wenqin:'文钦(?~258年),字仲若,沛国谯郡(今安徽省亳州市)人,三国时期曹魏将领,曹操部将文稷之子。魏明帝太和年间文钦任牙门将、五营校督,后拜庐江太守、冠军将军,嘉平元年(249年),曹爽及其同党在高平陵之变中被杀,文钦心中不安,执政的司马氏集团为了安抚文钦,升其为前将军、扬州刺史,任职期间结交镇东将军毌丘俭。击退吴国太傅诸葛恪进攻,取得一定战果。正元二年(255年),文钦与镇东将军毌丘俭在扬州起兵讨伐司马师,兵败后投奔吴国,被封为镇北大将军、幽州牧,封谯侯。甘露二年(257年),文钦随吴军援救起兵反抗司马氏的诸葛诞,此后因被司马昭大军围困,军情告急,文钦与诸葛诞本就有矛盾,对文钦日益不满的诸葛诞遂将文钦杀死。淮南平定之后,文钦遗体被其二子收敛安葬。', - qiuliju:'丘力居,东汉末年的辽西乌丸大人。拉拢中山太守张纯反叛东汉,寇略青、徐、幽、冀四州,杀略吏民。死时认为儿子楼班年幼,于是让从子蹋顿总摄三王部。', - liuba:'刘巴(?-222年),字子初,荆州零陵郡烝阳县(今湖南省衡阳县、邵东县一带)人,东汉末年至三国时期蜀汉时期官员、名士。刘巴少知名,荆州牧刘表多次征用推举,刘巴均不应就。曹操征伐荆州,荆州士人多归刘备,刘巴却北上投靠曹操。后受曹操命令招降荆南三郡,不料先为刘备所得,刘巴不能复命曹操,遂远至交趾,又辗转进入益州。刘备平定益州后,刘巴归附刘备,为左将军西曹掾,法正死后接任尚书令。章武二年(222年)去世。刘巴博学多才,为刘备解决入蜀后的财政困难问题,又与诸葛亮等共制蜀汉的法律文件《蜀科》。为人简朴清高,退无私交,曹魏大臣陈群甚敬重之。所著录于《刘令君集》。', - pengyang:'彭羕(184年-220年),字永年,广汉(今四川广汉北)人。东汉末年官吏。彭羕起初在益州任书佐,但后来其他人向益州牧刘璋诽谤他,刘璋于是以“髡钳”(剃去头发和胡须,并戴上刑具)处罚他,并且贬奴隶。此时刘备入蜀,彭羕想投靠刘备,于是去见庞统。庞统和他会面后很欣赏他,而法正亦很清楚彭羕,于是二人共同向刘备推荐彭羕。刘备多次命令彭羕传递军情和指示给诸将,表现都十分满意,日渐被赏识。刘备入主益州,领益州牧后就任命他为治州从事。彭羕见此,又变得嚣张自矜,诸葛亮对他礼待但心中并不喜欢他,多次密告刘备,说彭羕“心大志广,难可保安”。刘备见诸葛亮这样说,决定疏远彭羕,又观察他行事,于是贬他为江阳太守。彭羕见将被派往外地,心感不悦,与马超见面时又曾对他说“老革荒悖,可复道邪!”“卿为其外,我为其内,天下不足定也。”马超听后大惊,彭羕走后以他的说话告发彭羕,彭羕于是被收监下狱。最后彭羕被处死,死时三十七岁。', - dongxie:'董卓之女,牛辅之妻。在《三国群英传》中名为董宜,在电视剧《三国群英会之吕布与貂蝉》中名为董媛。', - caoanmin:'曹安民(?-197年),沛国谯县(今安徽亳州)人,字安民。东汉时期人物,曹德之子,曹操之侄,曹昂的堂兄弟,曹丕的堂兄,死于宛城之战。按曹丕《典论》记载的“亡兄孝廉子脩、从兄安民遇害。”等情况来看,安民应该是曹操侄子错不了,曹丕是他们属于兄弟关系肯定不会弄错。另外从典论的记载来看安民是和子脩并提的,子脩是曹昂的字,安民则肯定也是字不是名,至于三国志中记载则应取自曹丕之《典论》但陈寿又不知曹安民其名,故写为“长子昂、弟子安民”。', - dufuren:'杜夫人(生卒年不详),东汉末年至三国时人。有异色,原为吕布将秦宜禄之妻,生子秦朗。后为曹操纳为妾,又生曹林、曹衮、金乡公主。', - mifangfushiren:'麋芳(生卒年不详),字子方,东海郡朐县(今江苏省连云港市)人。汉末三国时期蜀国将领,刘备糜夫人的兄弟。麋芳本为徐州牧陶谦部下,曾被曹操表为彭城相。后来辞官,随刘备从徐州辗转至邺城、汝南、新野、长坂坡、江夏等地,奔波多年。傅士仁(生卒年不详),字君义,幽州广阳郡(今北京市)人,刘备手下将领。受到刘备的重用,但被关羽轻慢。
    刘备称汉中王时,糜芳为南郡太守,但受到关羽的轻慢。后来,因未完成供给军资的任务而被关羽责骂,心中不安。吕蒙袭取荆州时,将已经投降的傅士仁展示给糜芳,麋芳于是选择投降,导致关羽兵败被杀。此后,在吴国担任将军,并且为吴征伐。', - tongyuan:'童渊,字雄付,武术名家,与并州李彦是结拜兄弟,两人均师承义父玉真子,两人分别娶了河北颜家的两位大小姐颜云、颜雨。童飞之父,有张任、张绣为入室弟子,晚年收赵云为关门弟子,传其毕生所学。其成名技为“百鸟朝凤枪”。童渊是南方苏州评话三国中的原创人物,在历史中以及《三国演义》中并不存在。', + liuzan: "字正明,会稽长山人人,曾任左护军,有两子:留略、留平。少为会稽郡吏,曾参与镇压黄巾起义,后被东吴大将凌统所引用,任屯骑校尉。吴五凤二年(公元255年)留赞任左护军,随孙峻征淮南,因病撤军,被魏将蒋班围困于道,力战而死,时年73岁。", + zhujun: "朱儁(?-195年),字公伟。会稽郡上虞县(今浙江绍兴上虞区)人。东汉末年名将。朱儁出身寒门,赡养母亲,以好义轻财闻名,受乡里敬重。后被太守徐珪举为孝廉,任兰陵令,颇有治绩。再升任交州刺史,以家兵五千大破叛军,平定交州。战后以功封都亭侯,入朝为谏议大夫。光和七年(184年),黄巾起义爆发,朱儁以右中郎将、持节平定三郡之地,以功进封西乡侯,迁镇贼中郎将。又率军讨平黄巾,“威声满天下”。中平二年(185年),进拜右车骑将军,更封钱塘侯。后为河内太守,击退进逼的张燕。权臣董卓秉政时,想任朱儁为副手,遭其婉拒。其后出逃荆州,更屯军中牟,徐州刺史陶谦等欲推举他为太师,并传檄各州牧伯,相邀讨伐李傕、奉迎天子。但朱儁却奉诏入京任太仆。初平三年(192年),升任太尉、录尚书事。兴平元年(194年),行骠骑将军事,持节镇关东,因故未成行。兴平二年(195年),李傕与郭汜相互攻杀,郭汜扣留朱儁作为人质。朱儁性格刚烈,即日发病而死。", + liuhong: + "汉灵帝刘宏(157年,一作156年-189年5月13日),生于冀州河间国(今河北深州)。东汉第十二位皇帝(168年-189年在位),汉章帝刘炟的玄孙。刘宏早年世袭解渎亭侯。永康元年(167年)十二月,汉桓帝刘志逝世,刘宏被外戚窦氏挑选为皇位继承人,于建宁元年(168年)正月即位。刘宏在位的大部分时期,施行党锢及宦官政治。他又设置西园,巧立名目搜刮钱财,甚至卖官鬻爵以用于自己享乐。在位晚期,爆发了黄巾起义,而凉州等地也陷入持续动乱之中。中平六年(189年),刘宏去世,谥号孝灵皇帝,葬于文陵。刘宏喜好辞赋,作有《皇羲篇》、《追德赋》、《令仪颂》、《招商歌》等。", + wangrong: + "汉灵怀皇后王荣(?~181年),赵国邯郸(今河北邯郸市)人。五官中郎将王苞孙女,汉灵帝刘宏妃子,汉献帝刘协生母。初以良家子选入掖庭,封为美人,服侍汉灵帝。光和四年(181年),生下陈留王刘协,惨遭灵思皇后毒杀。王荣死后,汉灵帝曾作《追德赋》、《令仪颂》。永汉元年(189年),其子刘协即位,是为汉献帝,追谥灵怀皇后,葬于文昭陵。", + hanfu: "韩馥(?—191年),字文节,颍川郡(今河南禹州)人。东汉末年的诸侯,冀州牧。韩馥担任过东汉的御史中丞,之后被董卓举荐为冀州牧;在各诸侯起兵讨伐董卓时,韩馥也是其中之一的参与者。韩馥与袁绍也曾经有意立刘虞为皇帝。当时冀州民殷人盛,兵粮优足,于是袁绍便用计夺取冀州,韩馥被迫投靠张邈;之后张邈与袁绍的使者见面,韩馥以为是要来杀害自己的,于是在厕所中以刻书用的小刀自杀。", + zhaozhong: + "赵忠(?—189年),安平人,东汉末年宦官,赵延之兄。桓帝、灵帝时,历为小黄门、中常侍、大长秋、车骑将军等职,封都乡侯。在职时以搜刮暴敛、骄纵贪婪见称,灵帝极为宠信,常谓“赵常侍是我母”。中平六年(189年),何进谋诛宦官,事泄,他和其余几个常侍设计伏杀何进,袁绍、袁术等人闻何进被杀,入宫杀尽宦官,后捕杀赵忠。", + caosong: + "曹嵩(?—194年),字巨高,沛郡谯县(今安徽省亳州市)人。东汉大臣,大长秋曹腾的养子,曹操之父亲。门荫入仕,历任司隶校尉、鸿胪卿、大司农,位列九卿,位高权重。中平四年(187年),靠着贿赂中官,出任太尉,位列三公。中平五年(188年),受累于黄巾之乱,坐罪免官。兴平元年(194年),投奔兖州牧曹操,遇害于徐州。延康元年(220年),追尊魏国太王。曹魏建立后,追尊皇帝,谥号为太。", + liangxing: + "梁兴(?-212年),武威郡姑臧人也,东汉末年凉州军阀之一。与张横、贾诩、段煨是同乡,曾斩杀李傕。建安十六年,同韩遂、马超联合,起兵反抗曹操。梁兴率步骑五千夜袭曹军先头部队徐晃,被击退。联军战败后,梁兴逃到蓝田,劫掠周围郡县。夏侯渊进攻蓝田联合郑浑征讨梁兴,梁兴战败,不知所终。", + zhangmiao: + "张邈(?-195年),字孟卓,东平寿张(今山东东平县)人。东汉大臣、名士,“八厨”之一。举孝廉出身,授骑都尉,出任陈留太守。参与讨伐董卓,参加汴水之战,归附于曹操。兴平元年(194年),趁着曹操讨伐徐州牧陶谦,联合陈宫发动叛乱,迎立吕布为兖州牧。受到曹操讨伐,兵败投奔徐州牧刘备。兴平二年,张邈向袁术借兵途中,被部下所杀。", + duanwei: + "段煨(?~209年),字忠明,武威郡姑臧(今甘肃省武威市)人也。东汉末年将领,东汉太尉段颎同族兄弟,与太尉贾诩、张济、宣威侯张绣乃是同乡。原为董卓帐下将领,奉命屯兵华阴,勤劳农业。兴平二年(195年),迎接汉献帝刘协东归洛阳,供给衣食补给,与护驾将领杨定不和,引发激战十余天,听从汉献帝刘协劝解。东汉建安三年(198年),攻打黄白城,击杀李傕,夷其三族,封为镇远将军、闅乡亭侯、北地太守,累迁大鸿胪、金光禄大夫。建安十四年(209年),寿终正寝。", + zhangheng: + "张横,生卒年不详,武威郡姑臧人,东汉末年凉州军阀之一。与梁兴、贾诩、段煨乃是同乡。建安三年(198),张横与梁兴、段煨等斩杀李傕。十六年(211),同韩遂、马超联合,起兵反抗曹操,兵败后不知所终。", + wenqin: "文钦(?~258年),字仲若,沛国谯郡(今安徽省亳州市)人,三国时期曹魏将领,曹操部将文稷之子。魏明帝太和年间文钦任牙门将、五营校督,后拜庐江太守、冠军将军,嘉平元年(249年),曹爽及其同党在高平陵之变中被杀,文钦心中不安,执政的司马氏集团为了安抚文钦,升其为前将军、扬州刺史,任职期间结交镇东将军毌丘俭。击退吴国太傅诸葛恪进攻,取得一定战果。正元二年(255年),文钦与镇东将军毌丘俭在扬州起兵讨伐司马师,兵败后投奔吴国,被封为镇北大将军、幽州牧,封谯侯。甘露二年(257年),文钦随吴军援救起兵反抗司马氏的诸葛诞,此后因被司马昭大军围困,军情告急,文钦与诸葛诞本就有矛盾,对文钦日益不满的诸葛诞遂将文钦杀死。淮南平定之后,文钦遗体被其二子收敛安葬。", + qiuliju: + "丘力居,东汉末年的辽西乌丸大人。拉拢中山太守张纯反叛东汉,寇略青、徐、幽、冀四州,杀略吏民。死时认为儿子楼班年幼,于是让从子蹋顿总摄三王部。", + liuba: "刘巴(?-222年),字子初,荆州零陵郡烝阳县(今湖南省衡阳县、邵东县一带)人,东汉末年至三国时期蜀汉时期官员、名士。刘巴少知名,荆州牧刘表多次征用推举,刘巴均不应就。曹操征伐荆州,荆州士人多归刘备,刘巴却北上投靠曹操。后受曹操命令招降荆南三郡,不料先为刘备所得,刘巴不能复命曹操,遂远至交趾,又辗转进入益州。刘备平定益州后,刘巴归附刘备,为左将军西曹掾,法正死后接任尚书令。章武二年(222年)去世。刘巴博学多才,为刘备解决入蜀后的财政困难问题,又与诸葛亮等共制蜀汉的法律文件《蜀科》。为人简朴清高,退无私交,曹魏大臣陈群甚敬重之。所著录于《刘令君集》。", + pengyang: + "彭羕(184年-220年),字永年,广汉(今四川广汉北)人。东汉末年官吏。彭羕起初在益州任书佐,但后来其他人向益州牧刘璋诽谤他,刘璋于是以“髡钳”(剃去头发和胡须,并戴上刑具)处罚他,并且贬奴隶。此时刘备入蜀,彭羕想投靠刘备,于是去见庞统。庞统和他会面后很欣赏他,而法正亦很清楚彭羕,于是二人共同向刘备推荐彭羕。刘备多次命令彭羕传递军情和指示给诸将,表现都十分满意,日渐被赏识。刘备入主益州,领益州牧后就任命他为治州从事。彭羕见此,又变得嚣张自矜,诸葛亮对他礼待但心中并不喜欢他,多次密告刘备,说彭羕“心大志广,难可保安”。刘备见诸葛亮这样说,决定疏远彭羕,又观察他行事,于是贬他为江阳太守。彭羕见将被派往外地,心感不悦,与马超见面时又曾对他说“老革荒悖,可复道邪!”“卿为其外,我为其内,天下不足定也。”马超听后大惊,彭羕走后以他的说话告发彭羕,彭羕于是被收监下狱。最后彭羕被处死,死时三十七岁。", + dongxie: + "董卓之女,牛辅之妻。在《三国群英传》中名为董宜,在电视剧《三国群英会之吕布与貂蝉》中名为董媛。", + caoanmin: + "曹安民(?-197年),沛国谯县(今安徽亳州)人,字安民。东汉时期人物,曹德之子,曹操之侄,曹昂的堂兄弟,曹丕的堂兄,死于宛城之战。按曹丕《典论》记载的“亡兄孝廉子脩、从兄安民遇害。”等情况来看,安民应该是曹操侄子错不了,曹丕是他们属于兄弟关系肯定不会弄错。另外从典论的记载来看安民是和子脩并提的,子脩是曹昂的字,安民则肯定也是字不是名,至于三国志中记载则应取自曹丕之《典论》但陈寿又不知曹安民其名,故写为“长子昂、弟子安民”。", + dufuren: + "杜夫人(生卒年不详),东汉末年至三国时人。有异色,原为吕布将秦宜禄之妻,生子秦朗。后为曹操纳为妾,又生曹林、曹衮、金乡公主。", + mifangfushiren: + "麋芳(生卒年不详),字子方,东海郡朐县(今江苏省连云港市)人。汉末三国时期蜀国将领,刘备糜夫人的兄弟。麋芳本为徐州牧陶谦部下,曾被曹操表为彭城相。后来辞官,随刘备从徐州辗转至邺城、汝南、新野、长坂坡、江夏等地,奔波多年。傅士仁(生卒年不详),字君义,幽州广阳郡(今北京市)人,刘备手下将领。受到刘备的重用,但被关羽轻慢。
    刘备称汉中王时,糜芳为南郡太守,但受到关羽的轻慢。后来,因未完成供给军资的任务而被关羽责骂,心中不安。吕蒙袭取荆州时,将已经投降的傅士仁展示给糜芳,麋芳于是选择投降,导致关羽兵败被杀。此后,在吴国担任将军,并且为吴征伐。", + tongyuan: + "童渊,字雄付,武术名家,与并州李彦是结拜兄弟,两人均师承义父玉真子,两人分别娶了河北颜家的两位大小姐颜云、颜雨。童飞之父,有张任、张绣为入室弟子,晚年收赵云为关门弟子,传其毕生所学。其成名技为“百鸟朝凤枪”。童渊是南方苏州评话三国中的原创人物,在历史中以及《三国演义》中并不存在。", //zhangning:'张宁,东汉末年大贤良师张角的女儿。自幼学习太平道法,掌握天地法则。', - xinping:'辛评(?-204年),字仲治,颍川阳翟人,东汉末年人物。曹魏卫尉辛毗之兄。原是韩馥部下,韩馥逃亡后转而辅佐袁绍。袁绍死后,辛评、郭图欲立袁谭为主,与审配等不和。后来曹操破邺,其弟辛毗在城下劝降。审配怒遣手下将辛评全家杀害。', - hanmeng:'韩猛,又名韩若、韩荀、韩泣(上荀下大) ,东汉末年袁绍帐下名将,或与《曹瞒传》所言韩莒子为同一人。公元200年,官渡之战爆发。袁绍派遣韩猛劫掠曹操军的西道,被曹军部将曹仁击破于鸡洛山。袁绍又派韩猛前去运送粮车,因为轻敌被曹军部将徐晃、史涣击退。', - yanfuren:'《三国志》中东汉末年著名武将吕布有一妻子,但姓名未载于史书,或为魏续的姐妹魏氏。在李傕郭汜之乱期间曾受困,幸亏被庞舒所救,私藏于府中而得以幸免。吕布被曹操围困时,反对陈宫的计谋,导致了吕布的失败。《三国演义》中,姓严,通称严夫人,和吕布生有一女欲嫁于袁术之子,未果,吕布失败后与其女一同送往许昌。', - haomeng:'郝萌(?-196年),东汉末年吕布帐下名将。建安元年(196年),郝萌在袁术的怂恿下反叛吕布,曾一度打得吕布躲入厕所。后来,被吕布部将高顺所阻,其部将曹性临阵反叛,最终被高顺所杀。在小说《三国演义》中,吕布被围下邳时,郝萌护送许汜王楷回城时,被张飞擒获,被曹操所杀。', - licaiwei:'李采薇,生卒年不详,汉末将领庞德之妻,庞会之母。襄樊之战时,庞德任先锋,随于禁率军增援驻守樊城的曹仁。出战前,他将妻子李采薇与年仅六岁的儿子庞会叫来面前,对李采薇说:“吾今为先锋,义当效死疆场。我若死,汝好生看养吾儿。吾儿有异相,长大必当与吾报仇也。”李采薇闻言,与儿子痛哭送别庞德。她知道丈夫已下定决心,若无法胜利归还则必当战死沙场,绝不会投降求生。其后前线果然传来消息:魏军全军覆没,于禁投降,庞德誓死不降被关羽所杀。其子庞会自幼丧父,由母亲抚养长大。成年后,庞会性格勇烈,有先父之风。他多次立下战功,深受魏文帝曹丕的喜爱。后来庞会随钟会、邓艾伐蜀,成都城破之后,尽灭关氏家以报父仇。', - yanrou:'阎柔(生卒年不详),燕国广阳(今北京市附近)人。三国时期曹魏名将。年少时曾被乌丸、鲜卑俘虏,后来却得到他们的信任。刘虞死后,阎柔被鲜于辅等推举为乌丸司马,联系鲜卑为刘虞报仇,和公孙瓒对抗。在官渡之战时归曹操,拜护乌丸校尉,对曹操讨伐乌丸有功,赐爵关内侯。曹操待其如子,曹丕也视其如亲兄弟,阎柔坐镇北方,统帅幽州兵马,抗击胡人的入侵。曹丕即位后,阎柔被拜为度辽将军。', - qinyilu:'秦宜禄(?—200年),并州云中郡云中县人(今内蒙古自治区呼和浩特市托克托县古城镇)。东汉军阀吕布的部将。吕布战败后归降曹操,后为张飞所杀。', - fengfang:'冯方,其字不详,司隶人。初掌校事,监察京师及周边地区,刺探文武百官秘事。十常侍之乱后,董卓进京,掌控朝政。冯方认为他胸怀不臣之心,于是弃官携女儿冯妤至江南避祸。其后董卓果然乱政,京师之地生灵涂炭,更将洛阳付之一炬。冯方因其先见之明得以保全家人。
    冯妤长大成人后,有倾国之貌。一日袁术登城观景,得见冯妤,心中非常喜欢,于是将其纳为夫人。冯方心忧自家女儿不谙世事,于是将可以让人更显妩媚的家传宝梳交给她,希望能借此使其获得袁术的宠爱。其后果然传来袁术偏爱冯夫人的消息,冯方因此宽心,接受了袁术的征辟,为其效力。然而好景不长,没过多久,冯妤自缢身亡的消息传出,冯方悲愤不已,弃官而走,自此销声匿迹。', - bianxi:'小说《三国演义》里的人物。汜水关守将,并州人氏。原是黄巾余党,后投曹操,拨来守汜水关。善使流星锤。在镇国寺设下伏兵欲谋害千里寻兄的关羽,但是寺中僧人普净暗示加以解救。最后被关羽斩杀。', - niufu:'牛辅,东汉末年武将,东汉相国董卓的女婿。曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。', - wangwei:'王威,东汉末年人。荆州刺史刘表部下将领,乃忠义之士。刘表亡后,刘琮投降曹操,王威向刘琮献计偷袭曹操,刘琮没有采纳。小说《三国演义》中,曹操表刘琮为青州刺史,使远离故乡,时只有王威追随,曹操复遣于禁追杀刘琮等人,王威亦于乱军中殉主。', - liyixiejing:'李异(生卒年不详),三国时吴将领,曾随陆逊大败蜀军。谢旌(生卒年不详),三国时期吴国名将,会稽(今属浙江)人。建安末,李异与谢旌率水陆三千,破蜀将詹晏、陈凤。刘备领兵攻孙权,李异与陆议等屯巫、秭归,为蜀将所破。黄武元年(222),陆逊破刘备于猇亭,他追踪蜀军,屯驻南山。建安二十四年,陆逊击败关羽后,遣李异、谢旌二人将水陆军三千,进攻蜀将詹晏、陈凤。李异率水军,谢旌率陆军,于险要之地设防,击败詹晏,生擒陈凤。其后进攻房陵太守邓辅、南乡太守郭睦,大破之。又攻秭归大姓文布、邓凯等所合夷兵数千人,大胜,文布、邓凯落荒而逃。在《三国演义》中,两人为孙桓麾下部将,皆有“万夫不当之勇”。刘备攻吴时,谢旌迎战张苞,不敌败走。李异接战,被关兴所斩。次日,谢旌于乱军中被张苞一矛刺死。', - shiyi:'是仪(生卒年不详),本名氏仪,字子羽,北海郡营陵县(今山东昌乐)人,三国时期吴国官员。仕东汉、东吴两朝,早年曾在本县营陵县及本郡北海郡任官,后在东吴历任骑都尉、忠义校尉、裨将军、偏将军、侍中、中执法、尚书仆射等官。先封都亭侯,后进封都乡侯。年八十一岁时病逝,死前要求节葬。', - sunlang:'孙狼(生卒年不详),东汉末农民起义军首领。建安二十三年(218)陆浑(今河南嵩县东北)县长张固发民服徭役,百姓惶俱,狼等乘机发动起义,杀县主簿,攻破县城,后南下投奔蜀将关羽。', - sp_jiaxu:'字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。', - sunhuan:'孙桓(198年-223年),字叔武,吴郡富春(今浙江杭州富阳区)人,三国时期吴国建武将军。孙河第三子。仪容端正,器怀聪明,博学强记,能论议应对,孙权常称为“宗室颜渊”。初擢为武卫都尉。建安二十四年(219年),参与由吕蒙指挥的袭击荆州行动,从讨关羽于华容,招揽关羽余众,得五千人以及大量牛马器械。黄武元年(222年),孙桓二十五岁,拜安东中郎将,跟随陆逊抗击进攻东吴的刘备。当时刘备率领众多兵众进攻,满山都是蜀军,孙桓奋战,与陆逊等协力击破蜀军。刘备兵败逃走,孙桓截击,“斩上夔道,扼要径”,差点生擒刘备。战后孙桓因功拜建武将军,封丹徒侯,督牛渚,修筑横江坞,期间逝世。', - guānning:'关宁,《三国演义》的虚构人物,为关定之子,关平的哥哥,学文。关羽前往冀州寻找刘备时曾居于关定庄,关定命关宁、关平二子出拜。后关羽同刘备回到关定庄时,关羽向刘备介绍关宁、关平二人,关定即提出让关平拜关羽为义父。', - mushun:'穆顺,小说《三国演义》中的人物,男,东汉末宦官。献帝欲修书与国舅伏完,共谋图曹公。因顺为宦官中之忠义可托者,乃命顺往送书。顺藏书于发中,潜出禁宫,径至完宅,将书呈上。及完回书付顺,顺乃藏于头髻内,辞完回宫。然公闻信,先于宫门等候,顺回遇公,公喝左右,遍搜身上,并无夹带,放行。忽然风吹落其帽。公又唤回,取帽视之,遍观无物,还帽令戴。顺双手倒戴其帽。公心疑,令左右搜其头发中,搜出伏完书来。公见书大怒,执下顺于密室问之,顺不肯招。当晚将顺、完等宗族二百余口,皆斩于市。', - jsp_guanyu:'关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。', - liuling:'刘伶(约221年-约300年),字伯伦,西晋沛国(治今安徽濉溪县西北)人,竹林七贤之一,中国魏晋时期作家,名士。
    刘伶自幼便失去了父爱,因其父亲身材矮小,及至长大成人后,刘伶身高也不过六尺。魏齐王曹芳正始之末(249年),刘伶已成为当世名重一时的名士,并且常与嵇康、阮籍、阮咸集会于山阳竹林之下,饮酒赋诗,弹琴作歌。晋武帝司马炎泰始初年(265年)前后,曾做过一段时间的建威参军,不久朝廷下诏,入宫中策问。他大谈老庄,强调无为而治,非但没有得到重用,反而连参军之职也被罢免了,从此再无仕进。晋惠帝司马衷永康元年(300年)前后,以寿而终。
    刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。', + xinping: + "辛评(?-204年),字仲治,颍川阳翟人,东汉末年人物。曹魏卫尉辛毗之兄。原是韩馥部下,韩馥逃亡后转而辅佐袁绍。袁绍死后,辛评、郭图欲立袁谭为主,与审配等不和。后来曹操破邺,其弟辛毗在城下劝降。审配怒遣手下将辛评全家杀害。", + hanmeng: + "韩猛,又名韩若、韩荀、韩泣(上荀下大) ,东汉末年袁绍帐下名将,或与《曹瞒传》所言韩莒子为同一人。公元200年,官渡之战爆发。袁绍派遣韩猛劫掠曹操军的西道,被曹军部将曹仁击破于鸡洛山。袁绍又派韩猛前去运送粮车,因为轻敌被曹军部将徐晃、史涣击退。", + yanfuren: + "《三国志》中东汉末年著名武将吕布有一妻子,但姓名未载于史书,或为魏续的姐妹魏氏。在李傕郭汜之乱期间曾受困,幸亏被庞舒所救,私藏于府中而得以幸免。吕布被曹操围困时,反对陈宫的计谋,导致了吕布的失败。《三国演义》中,姓严,通称严夫人,和吕布生有一女欲嫁于袁术之子,未果,吕布失败后与其女一同送往许昌。", + haomeng: + "郝萌(?-196年),东汉末年吕布帐下名将。建安元年(196年),郝萌在袁术的怂恿下反叛吕布,曾一度打得吕布躲入厕所。后来,被吕布部将高顺所阻,其部将曹性临阵反叛,最终被高顺所杀。在小说《三国演义》中,吕布被围下邳时,郝萌护送许汜王楷回城时,被张飞擒获,被曹操所杀。", + licaiwei: + "李采薇,生卒年不详,汉末将领庞德之妻,庞会之母。襄樊之战时,庞德任先锋,随于禁率军增援驻守樊城的曹仁。出战前,他将妻子李采薇与年仅六岁的儿子庞会叫来面前,对李采薇说:“吾今为先锋,义当效死疆场。我若死,汝好生看养吾儿。吾儿有异相,长大必当与吾报仇也。”李采薇闻言,与儿子痛哭送别庞德。她知道丈夫已下定决心,若无法胜利归还则必当战死沙场,绝不会投降求生。其后前线果然传来消息:魏军全军覆没,于禁投降,庞德誓死不降被关羽所杀。其子庞会自幼丧父,由母亲抚养长大。成年后,庞会性格勇烈,有先父之风。他多次立下战功,深受魏文帝曹丕的喜爱。后来庞会随钟会、邓艾伐蜀,成都城破之后,尽灭关氏家以报父仇。", + yanrou: "阎柔(生卒年不详),燕国广阳(今北京市附近)人。三国时期曹魏名将。年少时曾被乌丸、鲜卑俘虏,后来却得到他们的信任。刘虞死后,阎柔被鲜于辅等推举为乌丸司马,联系鲜卑为刘虞报仇,和公孙瓒对抗。在官渡之战时归曹操,拜护乌丸校尉,对曹操讨伐乌丸有功,赐爵关内侯。曹操待其如子,曹丕也视其如亲兄弟,阎柔坐镇北方,统帅幽州兵马,抗击胡人的入侵。曹丕即位后,阎柔被拜为度辽将军。", + qinyilu: + "秦宜禄(?—200年),并州云中郡云中县人(今内蒙古自治区呼和浩特市托克托县古城镇)。东汉军阀吕布的部将。吕布战败后归降曹操,后为张飞所杀。", + fengfang: + "冯方,其字不详,司隶人。初掌校事,监察京师及周边地区,刺探文武百官秘事。十常侍之乱后,董卓进京,掌控朝政。冯方认为他胸怀不臣之心,于是弃官携女儿冯妤至江南避祸。其后董卓果然乱政,京师之地生灵涂炭,更将洛阳付之一炬。冯方因其先见之明得以保全家人。
    冯妤长大成人后,有倾国之貌。一日袁术登城观景,得见冯妤,心中非常喜欢,于是将其纳为夫人。冯方心忧自家女儿不谙世事,于是将可以让人更显妩媚的家传宝梳交给她,希望能借此使其获得袁术的宠爱。其后果然传来袁术偏爱冯夫人的消息,冯方因此宽心,接受了袁术的征辟,为其效力。然而好景不长,没过多久,冯妤自缢身亡的消息传出,冯方悲愤不已,弃官而走,自此销声匿迹。", + bianxi: "小说《三国演义》里的人物。汜水关守将,并州人氏。原是黄巾余党,后投曹操,拨来守汜水关。善使流星锤。在镇国寺设下伏兵欲谋害千里寻兄的关羽,但是寺中僧人普净暗示加以解救。最后被关羽斩杀。", + niufu: "牛辅,东汉末年武将,东汉相国董卓的女婿。曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。", + wangwei: + "王威,东汉末年人。荆州刺史刘表部下将领,乃忠义之士。刘表亡后,刘琮投降曹操,王威向刘琮献计偷袭曹操,刘琮没有采纳。小说《三国演义》中,曹操表刘琮为青州刺史,使远离故乡,时只有王威追随,曹操复遣于禁追杀刘琮等人,王威亦于乱军中殉主。", + liyixiejing: + "李异(生卒年不详),三国时吴将领,曾随陆逊大败蜀军。谢旌(生卒年不详),三国时期吴国名将,会稽(今属浙江)人。建安末,李异与谢旌率水陆三千,破蜀将詹晏、陈凤。刘备领兵攻孙权,李异与陆议等屯巫、秭归,为蜀将所破。黄武元年(222),陆逊破刘备于猇亭,他追踪蜀军,屯驻南山。建安二十四年,陆逊击败关羽后,遣李异、谢旌二人将水陆军三千,进攻蜀将詹晏、陈凤。李异率水军,谢旌率陆军,于险要之地设防,击败詹晏,生擒陈凤。其后进攻房陵太守邓辅、南乡太守郭睦,大破之。又攻秭归大姓文布、邓凯等所合夷兵数千人,大胜,文布、邓凯落荒而逃。在《三国演义》中,两人为孙桓麾下部将,皆有“万夫不当之勇”。刘备攻吴时,谢旌迎战张苞,不敌败走。李异接战,被关兴所斩。次日,谢旌于乱军中被张苞一矛刺死。", + shiyi: "是仪(生卒年不详),本名氏仪,字子羽,北海郡营陵县(今山东昌乐)人,三国时期吴国官员。仕东汉、东吴两朝,早年曾在本县营陵县及本郡北海郡任官,后在东吴历任骑都尉、忠义校尉、裨将军、偏将军、侍中、中执法、尚书仆射等官。先封都亭侯,后进封都乡侯。年八十一岁时病逝,死前要求节葬。", + sunlang: + "孙狼(生卒年不详),东汉末农民起义军首领。建安二十三年(218)陆浑(今河南嵩县东北)县长张固发民服徭役,百姓惶俱,狼等乘机发动起义,杀县主簿,攻破县城,后南下投奔蜀将关羽。", + sp_jiaxu: + "字文和,武威姑臧人。三国时期魏国著名谋士。曾先后担任三国军阀李傕、张绣、曹操的谋士。官至魏国太尉,谥曰肃侯。", + sunhuan: + "孙桓(198年-223年),字叔武,吴郡富春(今浙江杭州富阳区)人,三国时期吴国建武将军。孙河第三子。仪容端正,器怀聪明,博学强记,能论议应对,孙权常称为“宗室颜渊”。初擢为武卫都尉。建安二十四年(219年),参与由吕蒙指挥的袭击荆州行动,从讨关羽于华容,招揽关羽余众,得五千人以及大量牛马器械。黄武元年(222年),孙桓二十五岁,拜安东中郎将,跟随陆逊抗击进攻东吴的刘备。当时刘备率领众多兵众进攻,满山都是蜀军,孙桓奋战,与陆逊等协力击破蜀军。刘备兵败逃走,孙桓截击,“斩上夔道,扼要径”,差点生擒刘备。战后孙桓因功拜建武将军,封丹徒侯,督牛渚,修筑横江坞,期间逝世。", + guānning: + "关宁,《三国演义》的虚构人物,为关定之子,关平的哥哥,学文。关羽前往冀州寻找刘备时曾居于关定庄,关定命关宁、关平二子出拜。后关羽同刘备回到关定庄时,关羽向刘备介绍关宁、关平二人,关定即提出让关平拜关羽为义父。", + mushun: "穆顺,小说《三国演义》中的人物,男,东汉末宦官。献帝欲修书与国舅伏完,共谋图曹公。因顺为宦官中之忠义可托者,乃命顺往送书。顺藏书于发中,潜出禁宫,径至完宅,将书呈上。及完回书付顺,顺乃藏于头髻内,辞完回宫。然公闻信,先于宫门等候,顺回遇公,公喝左右,遍搜身上,并无夹带,放行。忽然风吹落其帽。公又唤回,取帽视之,遍观无物,还帽令戴。顺双手倒戴其帽。公心疑,令左右搜其头发中,搜出伏完书来。公见书大怒,执下顺于密室问之,顺不肯招。当晚将顺、完等宗族二百余口,皆斩于市。", + jsp_guanyu: + "关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。", + liuling: + "刘伶(约221年-约300年),字伯伦,西晋沛国(治今安徽濉溪县西北)人,竹林七贤之一,中国魏晋时期作家,名士。
    刘伶自幼便失去了父爱,因其父亲身材矮小,及至长大成人后,刘伶身高也不过六尺。魏齐王曹芳正始之末(249年),刘伶已成为当世名重一时的名士,并且常与嵇康、阮籍、阮咸集会于山阳竹林之下,饮酒赋诗,弹琴作歌。晋武帝司马炎泰始初年(265年)前后,曾做过一段时间的建威参军,不久朝廷下诏,入宫中策问。他大谈老庄,强调无为而治,非但没有得到重用,反而连参军之职也被罢免了,从此再无仕进。晋惠帝司马衷永康元年(300年)前后,以寿而终。
    刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。", }, - characterTitle:{ - chunyuqiong:'#b对决限定武将', - sp_xuyou:'#g4v4限定武将', + characterTitle: { + chunyuqiong: "#b对决限定武将", + sp_xuyou: "#g4v4限定武将", }, - characterFilter:{ - chunyuqiong:function(mode){ - return mode!='identity'&&mode!='guozhan'; + characterFilter: { + chunyuqiong: function (mode) { + return mode != "identity" && mode != "guozhan"; }, - sp_xuyou:function(mode){ - return mode=='versus'&&['guandu','4v4','four'].includes(_status.mode); + sp_xuyou: function (mode) { + return mode == "versus" && ["guandu", "4v4", "four"].includes(_status.mode); }, }, - dynamicTranslate:{ - mubing:function(player){ - if(player.storage.mubing2) return '出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。'; - return '出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。'; + dynamicTranslate: { + mubing: function (player) { + if (player.storage.mubing2) + return "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。"; + return "出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。"; }, - piaoping:function(player){ - if(player.storage.piaoping) return '转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; + piaoping: function (player) { + if (player.storage.piaoping) + return '转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; return '转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)'; }, - chuaili:function(player){ - if(!player.hasSkill('piaoping',null,null,false)) return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; - if(player.storage.piaoping) return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; + chuaili: function (player) { + if (!player.hasSkill("piaoping", null, null, false)) + return "锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。"; + if (player.storage.piaoping) + return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; return '锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。'; }, - dcdouzhen:function(player){ - var str='锁定技。①转换技。你的回合内,'; - if(player.countMark('dcdouzhen')%2) str+='阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; - else str+='阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; + dcdouzhen: function (player) { + var str = "锁定技。①转换技。你的回合内,"; + if (player.countMark("dcdouzhen") % 2) + str += + '阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; + else + str += + '阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。'; return str; }, }, - perfectPair:{ - nanhualaoxian:['zuoci','yuji'], - re_nanhualaoxian:['zuoci','yuji'], + perfectPair: { + nanhualaoxian: ["zuoci", "yuji"], + re_nanhualaoxian: ["zuoci", "yuji"], }, - characterReplace:{ - lijue:['lijue','ns_lijue'], - fanchou:['fanchou','tw_fanchou','ns_fanchou'], - zhangji:['zhangji','ns_zhangji'], - zhangchangpu:['ol_zhangchangpu','zhangchangpu','sp_zhangchangpu'], - huangfusong:['huangfusong','sp_huangfusong','jsrg_huangfusong','old_huangfusong'], - dingyuan:['ol_dingyuan','dingyuan'], - quyi:['quyi','re_quyi'], - hansui:['hansui','re_hansui','xin_hansui','jsrg_hansui'], - jin_simashi:['dc_simashi','jin_simashi','simashi'], - jin_yanghuiyu:['jin_yanghuiyu','yanghuiyu'], - taoqian:['re_taoqian','taoqian'], - jsp_liubei:['jsrg_liubei','jsp_liubei'], - dongcheng:['re_dongcheng','dongcheng'], - hucheer:['re_hucheer','hucheer','tw_hucheer'], - nanhualaoxian:['re_nanhualaoxian','nanhualaoxian','jsrg_nanhualaoxian'], - pangdegong:['re_pangdegong','pangdegong'], - zhujun:['ol_zhujun','zhujun','sp_zhujun','jsrg_zhujun'], - tw_liuhong:['liuhong','tw_liuhong','jsrg_liuhong'], - re_hejin:['hejin','re_hejin','tw_hejin','jsrg_hejin'], - hujinding:['dc_hujinding','ol_hujinding','hujinding'], - caosong:['caosong','sp_caosong'], - re_niujin:['niujin','re_niujin','tw_niujin'], - haomeng:['haomeng','tw_haomeng'], - zhangning:['zhangning','tw_zhangning'], - caoanmin:['caoanmin','ns_caoanmin'], - duanwei:['duanwei','junk_duanwei'], - xushao:['xushao','jsrg_xushao'], - huban:['ol_huban','dc_huban','mb_huban'], - mengda:['ol_mengda','dc_mengda','pe_mengda'], - jsp_guanyu:['jsp_guanyu','dc_jsp_guanyu','jsrg_guanyu'], - mushun:['mushun','sp_mushun'], - wangjun:['dc_wangjun','wangjun'], - zoushi:['re_zoushi','jsrg_zoushi'], - zhangmancheng:['dc_zhangmancheng','tw_zhangmancheng'], + characterReplace: { + lijue: ["lijue", "ns_lijue"], + fanchou: ["fanchou", "tw_fanchou", "ns_fanchou"], + zhangji: ["zhangji", "ns_zhangji"], + zhangchangpu: ["ol_zhangchangpu", "zhangchangpu", "sp_zhangchangpu"], + huangfusong: ["huangfusong", "sp_huangfusong", "jsrg_huangfusong", "old_huangfusong"], + dingyuan: ["ol_dingyuan", "dingyuan"], + quyi: ["quyi", "re_quyi"], + hansui: ["hansui", "re_hansui", "xin_hansui", "jsrg_hansui"], + jin_simashi: ["dc_simashi", "jin_simashi", "simashi"], + jin_yanghuiyu: ["jin_yanghuiyu", "yanghuiyu"], + taoqian: ["re_taoqian", "taoqian"], + jsp_liubei: ["jsrg_liubei", "jsp_liubei"], + dongcheng: ["re_dongcheng", "dongcheng"], + hucheer: ["re_hucheer", "hucheer", "tw_hucheer"], + nanhualaoxian: ["re_nanhualaoxian", "nanhualaoxian", "jsrg_nanhualaoxian"], + pangdegong: ["re_pangdegong", "pangdegong"], + zhujun: ["ol_zhujun", "zhujun", "sp_zhujun", "jsrg_zhujun"], + tw_liuhong: ["liuhong", "tw_liuhong", "jsrg_liuhong"], + re_hejin: ["hejin", "re_hejin", "tw_hejin", "jsrg_hejin"], + hujinding: ["dc_hujinding", "ol_hujinding", "hujinding"], + caosong: ["caosong", "sp_caosong"], + re_niujin: ["niujin", "re_niujin", "tw_niujin"], + haomeng: ["haomeng", "tw_haomeng"], + zhangning: ["zhangning", "tw_zhangning"], + caoanmin: ["caoanmin", "ns_caoanmin"], + duanwei: ["duanwei", "junk_duanwei"], + xushao: ["xushao", "jsrg_xushao"], + huban: ["ol_huban", "dc_huban", "mb_huban"], + mengda: ["ol_mengda", "dc_mengda", "pe_mengda"], + jsp_guanyu: ["jsp_guanyu", "dc_jsp_guanyu", "jsrg_guanyu"], + mushun: ["mushun", "sp_mushun"], + wangjun: ["dc_wangjun", "wangjun"], + zoushi: ["re_zoushi", "jsrg_zoushi"], + zhangmancheng: ["dc_zhangmancheng", "tw_zhangmancheng"], }, - translate:{ - lijue:"李傕", - zhangji:"张济", - fanchou:"樊稠", - guosi:"郭汜", - lvkai:"吕凯", - zhanggong:"张恭", - weiwenzhugezhi:"卫温诸葛直", - xurong:"徐荣", - zhangqiying:"张琪瑛", - sp_liuqi:'刘琦', - xf_tangzi:"唐咨", - gz_xf_huangquan:"黄权", - xf_huangquan:"OL黄权", - xf_huangquan_prefix:"OL", - gz_xf_sufei:"苏飞", - xf_sufei:"OL苏飞", - xf_sufei_prefix:"OL", - "xinfu_langxi":"狼袭", - "xinfu_langxi_info":"准备阶段,你可以对一名体力小于或等于你的其他角色造成0~2点随机伤害。", - "xinfu_yisuan":"亦算", - "xinfu_yisuan_info":"每回合限一次。当你于出牌阶段内使用的锦囊牌结算结束后,你可以减1点体力上限并获得此牌对应的所有实体牌。", - "xinfu_xingluan":"兴乱", - "xinfu_xingluan_info":"每回合限一次。当你于出牌阶段内使用的仅指定一个目标的牌结算完成后,你可以从牌堆中随机获得一张点数为6的牌。", - "xinfu_lveming":"掠命", - "xinfu_lveming_info":"出牌阶段限一次,你可以选择一名装备区装备比你少的角色,令其选择一个点数,然后你进行判定:
    若点数相同,你对其造成2点伤害;
    若点数不同,则你随机获得其区域内的一张牌。", - "xinfu_tunjun":"屯军", - "xinfu_tunjun_info":"限定技,出牌阶段,你可以选择一名角色,令其随机使用牌堆中的X张装备牌。(X为你发动过“掠命”的次数)", - "xinfu_tanbei":"贪狈", - "xinfu_tanbei_info":"出牌阶段限一次,你可以令一名其他角色选择一项:1.令你随机获得其区域内的一张牌,本回合内你不能对其使用牌。2.令你此回合内对其使用牌没有次数与距离限制。", - "xinfu_sidao":"伺盗", - xinfu_sidaox:'伺盗', - "xinfu_sidao_info":"出牌阶段限一次,当你对一名其他角色连续使用两张牌后,你可以将一张手牌当做【顺手牵羊】对其使用。", - "tanbei_effect1":"贪狈", - "tanbei_effect1_info":"", - "tanbei_effect2":"贪狈", - "tanbei_effect2_info":"", + translate: { + lijue: "李傕", + zhangji: "张济", + fanchou: "樊稠", + guosi: "郭汜", + lvkai: "吕凯", + zhanggong: "张恭", + weiwenzhugezhi: "卫温诸葛直", + xurong: "徐荣", + zhangqiying: "张琪瑛", + sp_liuqi: "刘琦", + xf_tangzi: "唐咨", + gz_xf_huangquan: "黄权", + xf_huangquan: "OL黄权", + xf_huangquan_prefix: "OL", + gz_xf_sufei: "苏飞", + xf_sufei: "OL苏飞", + xf_sufei_prefix: "OL", + xinfu_langxi: "狼袭", + xinfu_langxi_info: "准备阶段,你可以对一名体力小于或等于你的其他角色造成0~2点随机伤害。", + xinfu_yisuan: "亦算", + xinfu_yisuan_info: + "每回合限一次。当你于出牌阶段内使用的锦囊牌结算结束后,你可以减1点体力上限并获得此牌对应的所有实体牌。", + xinfu_xingluan: "兴乱", + xinfu_xingluan_info: + "每回合限一次。当你于出牌阶段内使用的仅指定一个目标的牌结算完成后,你可以从牌堆中随机获得一张点数为6的牌。", + xinfu_lveming: "掠命", + xinfu_lveming_info: + "出牌阶段限一次,你可以选择一名装备区装备比你少的角色,令其选择一个点数,然后你进行判定:
    若点数相同,你对其造成2点伤害;
    若点数不同,则你随机获得其区域内的一张牌。", + xinfu_tunjun: "屯军", + xinfu_tunjun_info: + "限定技,出牌阶段,你可以选择一名角色,令其随机使用牌堆中的X张装备牌。(X为你发动过“掠命”的次数)", + xinfu_tanbei: "贪狈", + xinfu_tanbei_info: + "出牌阶段限一次,你可以令一名其他角色选择一项:1.令你随机获得其区域内的一张牌,本回合内你不能对其使用牌。2.令你此回合内对其使用牌没有次数与距离限制。", + xinfu_sidao: "伺盗", + xinfu_sidaox: "伺盗", + xinfu_sidao_info: + "出牌阶段限一次,当你对一名其他角色连续使用两张牌后,你可以将一张手牌当做【顺手牵羊】对其使用。", + tanbei_effect1: "贪狈", + tanbei_effect1_info: "", + tanbei_effect2: "贪狈", + tanbei_effect2_info: "", - "xinfu_tunan":"图南", - "xinfu_tunan_info":"出牌阶段限一次,你可以亮出牌堆顶的一张牌并选择一名其他角色,然后该角色选择一项:使用此牌(无距离限制);或将此牌当普通【杀】使用。", - "xinfu_bijing":"闭境", - "xinfu_bijing_info":"结束阶段,你可以选择至多两张手牌并标记为“闭境”,然后你获得如下效果:1.其他角色的弃牌阶段开始时,若你于本回合内失去过“闭境”,其弃置两张牌;2.准备阶段,你重铸所有“闭境”牌。", - "xinfu_zhenxing":"镇行", - "xinfu_zhenxing_info":"结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的至多三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", - "xinfu_qianxin":"遣信", - "xinfu_qianxin_info":"出牌阶段限一次,若牌堆中没有“信”,你可以选择一名角色并将任意张手牌放置于牌堆中X倍数的位置(X为存活人数),称为“信”。该角色的弃牌阶段开始时,若其手牌区内有于本回合内获得过的“信”,其选择一项:令你将手牌摸至四张;本回合手牌上限-2。", - "qianxin_effect":"遣信", - "qianxin_effect_info":"", - "xinfu_qianxin2":"遣信", - "xinfu_qianxin2_info":"", + xinfu_tunan: "图南", + xinfu_tunan_info: + "出牌阶段限一次,你可以亮出牌堆顶的一张牌并选择一名其他角色,然后该角色选择一项:使用此牌(无距离限制);或将此牌当普通【杀】使用。", + xinfu_bijing: "闭境", + xinfu_bijing_info: + "结束阶段,你可以选择至多两张手牌并标记为“闭境”,然后你获得如下效果:1.其他角色的弃牌阶段开始时,若你于本回合内失去过“闭境”,其弃置两张牌;2.准备阶段,你重铸所有“闭境”牌。", + xinfu_zhenxing: "镇行", + xinfu_zhenxing_info: + "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的至多三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", + xinfu_qianxin: "遣信", + xinfu_qianxin_info: + "出牌阶段限一次,若牌堆中没有“信”,你可以选择一名角色并将任意张手牌放置于牌堆中X倍数的位置(X为存活人数),称为“信”。该角色的弃牌阶段开始时,若其手牌区内有于本回合内获得过的“信”,其选择一项:令你将手牌摸至四张;本回合手牌上限-2。", + qianxin_effect: "遣信", + qianxin_effect_info: "", + xinfu_qianxin2: "遣信", + xinfu_qianxin2_info: "", - "xinfu_fuhai":"浮海", - "xinfu_fuhai_info":"出牌阶段每个方向限一次,你可以展示一张手牌并选择上家或下家。该角色展示一张手牌,若你展示的牌点数大于等于其展示的牌点数,你弃置你展示的牌,然后继续对其上家或下家重复此流程;若你展示的牌点数小于该展示角色牌的点数,则该角色弃置其展示的牌,然后你与其各摸X张牌(X为你此回合内发动此技能选择的角色数),且你此阶段内不能再发动〖浮海〗。", - "fuhai_clear":"浮海", - "fuhai_clear_info":"", + xinfu_fuhai: "浮海", + xinfu_fuhai_info: + "出牌阶段每个方向限一次,你可以展示一张手牌并选择上家或下家。该角色展示一张手牌,若你展示的牌点数大于等于其展示的牌点数,你弃置你展示的牌,然后继续对其上家或下家重复此流程;若你展示的牌点数小于该展示角色牌的点数,则该角色弃置其展示的牌,然后你与其各摸X张牌(X为你此回合内发动此技能选择的角色数),且你此阶段内不能再发动〖浮海〗。", + fuhai_clear: "浮海", + fuhai_clear_info: "", - "xz_xunxun":"恂恂", - "xz_xunxun_info":"摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", - "xinfu_xingzhao":"兴棹", - "xinfu_xingzhao_info":"锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段。若X=0或X≥4,当你造成伤害时,此伤害+1(X为场上已受伤的角色数)。", - "xinfu_xingzhao2":"兴棹", - "xinfu_xingzhao2_info":"", - xinfu_xingzhao3:'兴棹', - "xinfu_dianhu":"点虎", - "xinfu_dianhu_info":"锁定技,游戏开始时,你选择一名其他角色。当其受到来自你的伤害后或回复体力后,你摸一张牌。", - "xinfu_dianhu2":"点虎", - "xinfu_dianhu2_info":"", - "xinfu_jianji":"谏计", - "xinfu_jianji_info":"出牌阶段限一次,你可以令一名其他角色摸一张牌。然后该角色可以使用此牌。", - "xinfu_lianpian":"联翩", - "xinfu_lianpian_info":"出牌阶段限三次。当你对一名角色连续使用牌时,你可以摸一张牌,然后可以将一张牌交给该角色。", - spwenji:'问计', - spwenji_info:'出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。', - rewenji:'问计', - rewenji_info:'出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌类型相同的牌时不能被其他角色响应。', - sptunjiang:'屯江', - sptunjiang_info:'结束阶段,若你未于本回合的出牌阶段内使用牌指定过其他角色为目标,则你可以摸X张牌(X为全场势力数)。', - zongkui:'纵傀', - zongkui_mark:'纵傀', - zongkui_mark_bg:'傀', - zongkui_info:'回合开始前,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。一轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。', - guju:'骨疽', - guju_info:'锁定技,拥有“傀”标记的角色受到伤害后,你摸一张牌。', - baijia:'拜假', - baijia_info:'觉醒技,准备阶段,若你因〖骨疽〗得到的牌不少于7张,则你增加1点体力上限,回复1点体力,然后令所有未拥有“傀”标记的其他角色获得“傀”标记,最后失去技能〖骨疽〗,并获得技能〖蚕食〗。', - bmcanshi:'蚕食', - bmcanshi_info:'一名角色使用基本牌或普通锦囊牌指定你为唯一目标时,若其有“傀”标记,你可以取消之,然后其失去“傀”标记;你使用牌仅指定一名角色为目标时,你可以额外指定任意名带有“傀”标记的角色为目标(无距离限制),然后这些角色失去“傀”标记。', + xz_xunxun: "恂恂", + xz_xunxun_info: + "摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", + xinfu_xingzhao: "兴棹", + xinfu_xingzhao_info: + "锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段。若X=0或X≥4,当你造成伤害时,此伤害+1(X为场上已受伤的角色数)。", + xinfu_xingzhao2: "兴棹", + xinfu_xingzhao2_info: "", + xinfu_xingzhao3: "兴棹", + xinfu_dianhu: "点虎", + xinfu_dianhu_info: + "锁定技,游戏开始时,你选择一名其他角色。当其受到来自你的伤害后或回复体力后,你摸一张牌。", + xinfu_dianhu2: "点虎", + xinfu_dianhu2_info: "", + xinfu_jianji: "谏计", + xinfu_jianji_info: "出牌阶段限一次,你可以令一名其他角色摸一张牌。然后该角色可以使用此牌。", + xinfu_lianpian: "联翩", + xinfu_lianpian_info: + "出牌阶段限三次。当你对一名角色连续使用牌时,你可以摸一张牌,然后可以将一张牌交给该角色。", + spwenji: "问计", + spwenji_info: + "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。", + rewenji: "问计", + rewenji_info: + "出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌类型相同的牌时不能被其他角色响应。", + sptunjiang: "屯江", + sptunjiang_info: + "结束阶段,若你未于本回合的出牌阶段内使用牌指定过其他角色为目标,则你可以摸X张牌(X为全场势力数)。", + zongkui: "纵傀", + zongkui_mark: "纵傀", + zongkui_mark_bg: "傀", + zongkui_info: + "回合开始前,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。一轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。", + guju: "骨疽", + guju_info: "锁定技,拥有“傀”标记的角色受到伤害后,你摸一张牌。", + baijia: "拜假", + baijia_info: + "觉醒技,准备阶段,若你因〖骨疽〗得到的牌不少于7张,则你增加1点体力上限,回复1点体力,然后令所有未拥有“傀”标记的其他角色获得“傀”标记,最后失去技能〖骨疽〗,并获得技能〖蚕食〗。", + bmcanshi: "蚕食", + bmcanshi_info: + "一名角色使用基本牌或普通锦囊牌指定你为唯一目标时,若其有“傀”标记,你可以取消之,然后其失去“傀”标记;你使用牌仅指定一名角色为目标时,你可以额外指定任意名带有“傀”标记的角色为目标(无距离限制),然后这些角色失去“傀”标记。", - xinpi:'辛毗', - lisu:'李肃', - zhangwen:'张温', - xushao:'许劭', - mangyachang:"忙牙长", - xugong:"许贡", - zhangchangpu:"张昌蒲", - pingjian:'评荐', - pingjian_use:'评荐', - pingjian_info:'结束阶段开始时/当你受到伤害后/出牌阶段限一次,你可以令系统随机检索出三张拥有发动时机为结束阶段开始时/当你受到伤害后/出牌阶段的技能的武将牌。然后你可以选择尝试发动其中一个技能。每个技能每局游戏只能选择一次。', + xinpi: "辛毗", + lisu: "李肃", + zhangwen: "张温", + xushao: "许劭", + mangyachang: "忙牙长", + xugong: "许贡", + zhangchangpu: "张昌蒲", + pingjian: "评荐", + pingjian_use: "评荐", + pingjian_info: + "结束阶段开始时/当你受到伤害后/出牌阶段限一次,你可以令系统随机检索出三张拥有发动时机为结束阶段开始时/当你受到伤害后/出牌阶段的技能的武将牌。然后你可以选择尝试发动其中一个技能。每个技能每局游戏只能选择一次。", - songshu:'颂蜀', - songshu_info:'出牌阶段,你可以和其他角色拼点。若你没赢,你与其各摸两张牌,且你本阶段内不能再发动〖颂蜀〗。', - sibian:'思辩', - sibian_info:'摸牌阶段,你可以放弃摸牌,改为亮出牌堆顶的四张牌,然后获得其中所有点数最大与点数最小的牌,且可以将剩余的牌交给手牌数最少的角色。', - lslixun:'利熏', - lslixun_fate:'利熏', - lslixun_info:'锁定技,当你受到伤害时,你防止此伤害,然后获得等同于伤害值的“珠”标记。出牌阶段开始时,你进行判定,若结果点数小于“珠”的数量,你弃置等同于“珠”数量的手牌(若弃牌的牌数不够,则失去剩余数量的体力值)。', - lskuizhu:'馈珠', - lskuizhu_info:'出牌阶段结束时,你可以选择体力值为全场最多的一名其他角色,将手牌摸至与该角色相同(最多摸至五张),然后该角色观看你的手牌,弃置任意张手牌并从观看的牌中获得等量的牌。若其得到的牌大于一张,则你选择一项:移去一个“珠”;或令其对其攻击范围内的一名角色造成1点伤害。', - xpchijie:'持节', - xpchijie_info:'每回合每项各限一次。1.当其他角色使用的牌对你结算结束后,你可以令此牌对所有后续目标无效。2.其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。', - xpchijie2:'持节', - yinju:'引裾', - yinju_info:'限定技,出牌阶段,你可以选择一名其他角色。若如此做,当你于此阶段内使用牌指定其为目标后,你与其各摸一张牌;当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。', - yinju2:'引裾', + songshu: "颂蜀", + songshu_info: + "出牌阶段,你可以和其他角色拼点。若你没赢,你与其各摸两张牌,且你本阶段内不能再发动〖颂蜀〗。", + sibian: "思辩", + sibian_info: + "摸牌阶段,你可以放弃摸牌,改为亮出牌堆顶的四张牌,然后获得其中所有点数最大与点数最小的牌,且可以将剩余的牌交给手牌数最少的角色。", + lslixun: "利熏", + lslixun_fate: "利熏", + lslixun_info: + "锁定技,当你受到伤害时,你防止此伤害,然后获得等同于伤害值的“珠”标记。出牌阶段开始时,你进行判定,若结果点数小于“珠”的数量,你弃置等同于“珠”数量的手牌(若弃牌的牌数不够,则失去剩余数量的体力值)。", + lskuizhu: "馈珠", + lskuizhu_info: + "出牌阶段结束时,你可以选择体力值为全场最多的一名其他角色,将手牌摸至与该角色相同(最多摸至五张),然后该角色观看你的手牌,弃置任意张手牌并从观看的牌中获得等量的牌。若其得到的牌大于一张,则你选择一项:移去一个“珠”;或令其对其攻击范围内的一名角色造成1点伤害。", + xpchijie: "持节", + xpchijie_info: + "每回合每项各限一次。1.当其他角色使用的牌对你结算结束后,你可以令此牌对所有后续目标无效。2.其他角色使用的牌结算完成时,若你是此牌的目标之一且此牌未造成过伤害,则你可以获得此牌对应的所有实体牌。", + xpchijie2: "持节", + yinju: "引裾", + yinju_info: + "限定技,出牌阶段,你可以选择一名其他角色。若如此做,当你于此阶段内使用牌指定其为目标后,你与其各摸一张牌;当你即将对其造成伤害时,防止此伤害,然后其回复等量的体力。", + yinju2: "引裾", - spjiedao:"截刀", - "spjiedao_info":"当你每回合第一次造成伤害时,你可令此伤害至多+X(X为你损失的体力值)。然后若受到此伤害的角色没有死亡,你弃置等同于此伤害加值的牌。", - biaozhao:"表召", - "biaozhao_info":"结束阶段,你可以将一张牌置于武将牌上,称为“表”。当有一张与“表”花色点数均相同的牌进入弃牌堆后,你将“表”置入弃牌堆并失去1点体力,若此牌是其他角色因弃置而进入弃牌堆的,则改为该角色获得“表”。准备阶段,若你的武将牌上有“表”,则你将“表”置入弃牌堆。然后你选择一名角色,该角色回复1点体力且将手牌摸至与全场手牌数最多的人相同(最多摸五张)。", - "biaozhao2":"表召", - "biaozhao2_info":"", - "biaozhao3":"表召", - "biaozhao3_info":"", - yechou:"业仇", - "yechou_info":"当你死亡时,你可以选择一名已损失体力值大于1的角色。直到其下个回合开始前,每个回合结束时,该角色失去1点体力。", - "yechou2":"业仇", - "yechou2_info":"", - yanjiao:"严教", - "yanjiao_info":"出牌阶段限一次,你可以选择一名其他角色并从牌堆顶亮出四张牌。该角色将这些牌分成点数之和相等的两组,你与其各获得其中一组,然后将剩余未分组的牌置入弃牌堆。若未分组的牌超过一张,则你本回合手牌上限-1。", - "yanjiao2":"严教", - "yanjiao2_info":"", - xingshen:"省身", - "xingshen_info":"当你受到伤害后,你可以摸一张牌且下一次发动〖严教〗亮出的牌数+1。若你的手牌数为全场最少,则改为摸两张牌;若你的体力值为全场最少,则〖严教〗亮出的牌数改为+2(加值总数不能超过4)。", + spjiedao: "截刀", + spjiedao_info: + "当你每回合第一次造成伤害时,你可令此伤害至多+X(X为你损失的体力值)。然后若受到此伤害的角色没有死亡,你弃置等同于此伤害加值的牌。", + biaozhao: "表召", + biaozhao_info: + "结束阶段,你可以将一张牌置于武将牌上,称为“表”。当有一张与“表”花色点数均相同的牌进入弃牌堆后,你将“表”置入弃牌堆并失去1点体力,若此牌是其他角色因弃置而进入弃牌堆的,则改为该角色获得“表”。准备阶段,若你的武将牌上有“表”,则你将“表”置入弃牌堆。然后你选择一名角色,该角色回复1点体力且将手牌摸至与全场手牌数最多的人相同(最多摸五张)。", + biaozhao2: "表召", + biaozhao2_info: "", + biaozhao3: "表召", + biaozhao3_info: "", + yechou: "业仇", + yechou_info: + "当你死亡时,你可以选择一名已损失体力值大于1的角色。直到其下个回合开始前,每个回合结束时,该角色失去1点体力。", + yechou2: "业仇", + yechou2_info: "", + yanjiao: "严教", + yanjiao_info: + "出牌阶段限一次,你可以选择一名其他角色并从牌堆顶亮出四张牌。该角色将这些牌分成点数之和相等的两组,你与其各获得其中一组,然后将剩余未分组的牌置入弃牌堆。若未分组的牌超过一张,则你本回合手牌上限-1。", + yanjiao2: "严教", + yanjiao2_info: "", + xingshen: "省身", + xingshen_info: + "当你受到伤害后,你可以摸一张牌且下一次发动〖严教〗亮出的牌数+1。若你的手牌数为全场最少,则改为摸两张牌;若你的体力值为全场最少,则〖严教〗亮出的牌数改为+2(加值总数不能超过4)。", - sp_zhanghe:'SP张郃', - sp_zhanghe_prefix:'SP', - yuanlve:'远略', - yuanlve_info:'出牌阶段限一次,你可以将一张非装备牌交给一名角色,然后该角色可以使用该牌并令你摸一张牌。', - xunchen:'OL荀谌', - xunchen_prefix:'OL', - fenglve:'锋略', - fenglve2:'锋略', - fenglve_info:'出牌阶段开始时,你可以与一名角色拼点,若你赢,该角色将其区域内的各一张牌交给你;若你没赢,你交给其一张牌。当你的单人拼点结算后,你可以令对方获得你拼点的牌。', - mouzhi:'谋识', - mouzhi2:'谋识', - mouzhi_info:'出牌阶段限一次,你可以将一张手牌交给一名角色,若如此做,当其于其下回合的出牌阶段内对一名角色造成伤害后,若是此阶段其第一次对该角色造成伤害,你摸一张牌。', - sp_shenpei:'SP审配', - sp_shenpei_prefix:'SP', - gangzhi:'刚直', - gangzhi_info:'锁定技,当你即将受到其他角色造成的伤害时,或即将对其他角色造成伤害时,你防止此伤害,改为受到伤害的角色失去等量的体力。', - beizhan:'备战', - beizhan2:'备战', - beizhan_info:'结束阶段,你可以令一名角色将手牌摸至体力上限(至多为5)。其下个回合开始时,若其手牌数为全场最多,则其此回合内使用的牌不能指定其他角色为目标。', - gaolan:'OL高览', - gaolan_prefix:'OL', - xiying:'袭营', - xiying2:'袭营', - xiying_info:'出牌阶段开始时,你可以弃置一张非基本手牌,然后令所有其他角色依次选择一项:弃置一张牌,或本回合内不能使用或打出牌;且你本回合内获得如下效果:结束阶段,若你于本回合的出牌阶段内造成过伤害,则你从牌堆中获得一张伤害性基本牌或普通锦囊牌。', - lvkuanglvxiang:'OL吕旷吕翔', - lvkuanglvxiang_prefix:'OL', - liehou:'列侯', - liehou_info:'出牌阶段限一次,你可以令一名攻击范围内的角色交给你一张手牌,然后你将一张手牌交给攻击范围内的另一名角色。', - qigong:'齐攻', - qigong_info:'当你使用的【杀】被【闪】抵消之后,你可以令一名角色再对目标角色使用一张【杀】(不可被响应)。', - chunyuqiong:'淳于琼', - sushou:'宿守', - sushou_info:'弃牌阶段开始时,你可以摸X+1张牌(X为“粮”数),然后可以交给任意名友方角色各一张牌。', - cangchu:'仓储', - cangchu_info:'锁定技,游戏开始时,你获得3枚“粮”标记,当你受到1点火焰伤害后,你失去一枚“粮”标记。', - liangying:'粮营', - liangying_info:'锁定技,若你有“粮”标记,则友方角色摸牌阶段摸牌数+1;当你失去所有“粮”标记后,你减1点体力上限,然后令敌方角色各摸两张牌。', - sp_xuyou:'SP许攸', - sp_xuyou_prefix:'SP', - spshicai:'恃才', - spshicai2:'恃才', - spshicai_info:'出牌阶段,牌堆顶的一张牌对你可见。你可以弃置一张牌,然后获得牌堆顶的一张牌,且不能再发动〖恃才〗直到此牌离开你的手牌区。', - spfushi:'附势', - spfushi_info:'锁定技,若己方存活角色数:大于敌方,你视为拥有〖择主〗;小于敌方,你视为拥有〖逞功〗。', - zezhu:'择主', - zezhu_info:'出牌阶段限一次,你可以获得双方主帅的各一张牌(若无牌则改为你摸一张牌),然后交给双方主帅各一张牌。', - chenggong:'逞功', - chenggong_info:'当有角色使用牌指定目标后,若此牌对目标数大于1,则你可令使用者摸一张牌。', - sp_zhangliao:'SP张辽', - sp_zhangliao_prefix:'SP', + sp_zhanghe: "SP张郃", + sp_zhanghe_prefix: "SP", + yuanlve: "远略", + yuanlve_info: + "出牌阶段限一次,你可以将一张非装备牌交给一名角色,然后该角色可以使用该牌并令你摸一张牌。", + xunchen: "OL荀谌", + xunchen_prefix: "OL", + fenglve: "锋略", + fenglve2: "锋略", + fenglve_info: + "出牌阶段开始时,你可以与一名角色拼点,若你赢,该角色将其区域内的各一张牌交给你;若你没赢,你交给其一张牌。当你的单人拼点结算后,你可以令对方获得你拼点的牌。", + mouzhi: "谋识", + mouzhi2: "谋识", + mouzhi_info: + "出牌阶段限一次,你可以将一张手牌交给一名角色,若如此做,当其于其下回合的出牌阶段内对一名角色造成伤害后,若是此阶段其第一次对该角色造成伤害,你摸一张牌。", + sp_shenpei: "SP审配", + sp_shenpei_prefix: "SP", + gangzhi: "刚直", + gangzhi_info: + "锁定技,当你即将受到其他角色造成的伤害时,或即将对其他角色造成伤害时,你防止此伤害,改为受到伤害的角色失去等量的体力。", + beizhan: "备战", + beizhan2: "备战", + beizhan_info: + "结束阶段,你可以令一名角色将手牌摸至体力上限(至多为5)。其下个回合开始时,若其手牌数为全场最多,则其此回合内使用的牌不能指定其他角色为目标。", + gaolan: "OL高览", + gaolan_prefix: "OL", + xiying: "袭营", + xiying2: "袭营", + xiying_info: + "出牌阶段开始时,你可以弃置一张非基本手牌,然后令所有其他角色依次选择一项:弃置一张牌,或本回合内不能使用或打出牌;且你本回合内获得如下效果:结束阶段,若你于本回合的出牌阶段内造成过伤害,则你从牌堆中获得一张伤害性基本牌或普通锦囊牌。", + lvkuanglvxiang: "OL吕旷吕翔", + lvkuanglvxiang_prefix: "OL", + liehou: "列侯", + liehou_info: + "出牌阶段限一次,你可以令一名攻击范围内的角色交给你一张手牌,然后你将一张手牌交给攻击范围内的另一名角色。", + qigong: "齐攻", + qigong_info: + "当你使用的【杀】被【闪】抵消之后,你可以令一名角色再对目标角色使用一张【杀】(不可被响应)。", + chunyuqiong: "淳于琼", + sushou: "宿守", + sushou_info: "弃牌阶段开始时,你可以摸X+1张牌(X为“粮”数),然后可以交给任意名友方角色各一张牌。", + cangchu: "仓储", + cangchu_info: + "锁定技,游戏开始时,你获得3枚“粮”标记,当你受到1点火焰伤害后,你失去一枚“粮”标记。", + liangying: "粮营", + liangying_info: + "锁定技,若你有“粮”标记,则友方角色摸牌阶段摸牌数+1;当你失去所有“粮”标记后,你减1点体力上限,然后令敌方角色各摸两张牌。", + sp_xuyou: "SP许攸", + sp_xuyou_prefix: "SP", + spshicai: "恃才", + spshicai2: "恃才", + spshicai_info: + "出牌阶段,牌堆顶的一张牌对你可见。你可以弃置一张牌,然后获得牌堆顶的一张牌,且不能再发动〖恃才〗直到此牌离开你的手牌区。", + spfushi: "附势", + spfushi_info: + "锁定技,若己方存活角色数:大于敌方,你视为拥有〖择主〗;小于敌方,你视为拥有〖逞功〗。", + zezhu: "择主", + zezhu_info: + "出牌阶段限一次,你可以获得双方主帅的各一张牌(若无牌则改为你摸一张牌),然后交给双方主帅各一张牌。", + chenggong: "逞功", + chenggong_info: "当有角色使用牌指定目标后,若此牌对目标数大于1,则你可令使用者摸一张牌。", + sp_zhangliao: "SP张辽", + sp_zhangliao_prefix: "SP", //这仨技能给SP仲村由理毫无违和感好吗!!! - mubing:'募兵', - mubing_info:'出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。', - ziqu:'资取', - ziqu_info:'每名角色限一次,当你对有牌的其他角色造成伤害后,你可以防止此伤害。然后其将其点数最大的牌交给你。', - diaoling:'调令', - diaoling_info:'觉醒技,准备阶段,若你已因〖募兵〗获得了6张或更多的【杀】或武器牌或伤害锦囊牌,则你回复1点体力或摸两张牌,然后修改〖募兵〗。', - mubing_rewrite:'募兵·改', - mubing_rewrite_info:'出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。', - caobuxing:'曹不兴', - moying:'墨影', - moying_info:'每回合限一次,当你于回合外不因使用而失去单一一张锦囊牌或装备牌后,你可以选择一个花色和与此牌点数差绝对值不超过2的点数,然后获得牌堆中所有与此牌花色点数相同的牌。', - juanhui:'绢绘', - juanhui2:'绢绘', - juanhui2_backup:'绢绘', - juanhui_info:'结束阶段,你可以选择一名其他角色。记录该角色下回合的出牌阶段里使用的基本牌和普通锦囊牌(每种牌名限记一次),你的下回合出牌阶段,可将一张手牌当这些牌里的任意一张牌使用(每张限使用一次,且【杀】不计次数)。当"绢绘"的牌全部用完时,你回复1点体力并将手牌摸至三张。', - re_maliang:'新杀马良', - re_maliang_prefix:'新杀', - rexiemu:'协穆', - rexiemu_info:'结束阶段,若全场没有“协穆”标记,你可以选择一名角色获得“协穆”标记直到你的下回合开始。你或该角色在各自的回合外使用或打出手牌时,你与其各摸一张牌(每回合限一次)。', - heli:'贺励', - heli_info:'出牌阶段限一次,你可以选择手牌数比你少的一名其他角色。该角色展示所有手牌,然后每缺少一种类型的牌,便从牌堆中随机获得一张此类型的牌。', - zhujun:'朱儁', - gongjian:'攻坚', - gongjian_info:'每回合限一次,当有角色使用【杀】指定第一个目标后,若此【杀】的目标和本局游戏内被使用的上一张【杀】的目标的交集A不为空,则你可以依次弃置A中所有角色的至多两张牌,然后获得以此法弃置的所有【杀】。', - kuimang:'溃蟒', - kuimang_info:'锁定技,一名角色死亡后,若你对其造成过伤害,你摸两张牌。', - liuhong:'刘宏', - yujue:'鬻爵', - yujue_backup:'鬻爵', - yujue_info:'出牌阶段限一次,你可以废除一个装备栏,然后令一名有手牌的其他角色交给你一张手牌。其获得〖执笏〗直到你的下回合开始。', - zhihu:'执笏', - zhihu_mark:'执笏', - zhihu_info:'锁定技,每回合限两次,当你对其他角色造成伤害后,你摸两张牌。', - tuxing:'图兴', - tuxing2:'图兴', - tuxing_info:'锁定技,当你废除一个装备栏时,你加1点体力上限并回复1点体力。然后若你所有的装备栏均已被废除,则你减4点体力上限,且本局游戏内造成的伤害+1。', - re_hejin:'新杀何进', - re_hejin_prefix:'新杀', - xin_baosanniang:'新杀鲍三娘', - xin_baosanniang_prefix:'新杀', - decadexushen:"许身", - decadexushen2:'许身', - decadexushen_info:"限定技,当你进入濒死状态后,你可以回复1点体力并获得技能“镇南”,然后如果你脱离濒死状态且“关索”不在场,你可令一名其他角色选择是否用“关索”代替其武将并令其摸三张牌。", - decadezhennan:"镇南", - decadezhennan_info:"当有角色使用普通锦囊牌指定目标后,若此牌目标数大于1,你可以对一名其他角色造成1点伤害。", - ol_dingyuan:'丁原', - cixiao:'慈孝', - cixiao_info:'准备阶段,若场上没有“义子”标记,你可令一名其他角色获得一个“义子”标记;若场上有“义子”标记,你可以弃置一张牌移动“义子”标记。拥有“义子”标记的角色获得技能“叛弑”。', - panshi:'叛弑', - panshi_info:'锁定技,准备阶段,你交给有“慈孝”技能的角色一张手牌;当你于出牌阶段因使用【杀】对其他角色造成伤害时,若其拥有技能“慈孝”,则此伤害+1,且你结束出牌阶段。', - xianshuai:'先率', - xianshuai_info:'锁定技,有角色造成伤害后,若此伤害是本轮第一次造成伤害:你摸一张牌;若伤害来源是你,则你对受伤角色再造成1点伤害。', - wangrong:'王荣', - minsi:'敏思', - minsi2:'敏思', - minsi_info:'出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离限制,红色牌本回合不计入手牌上限。', - jijing:'吉境', - jijing_info:'当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。', - zhuide:'追德', - zhuide_info:'当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。', - decadewuniang:'武娘', - decadewuniang_info:'当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,其摸一张牌。(若你已发动许身,则关索也摸一张牌)', - dongxie:'董翓', - juntun:'军屯', - juntun_info:'锁定技,准备阶段,若X大于1,则你减1点体力上限并摸X张牌(X为你的体力上限)。', - jiaojie:'狡黠', - jiaojie_info:'锁定技,你的红色牌不计入手牌上限。你使用黑色牌无距离和次数限制。', - dcjiaoxia:'狡黠', - dcjiaoxia_info:'①出牌阶段开始时,你可以令自己的所有手牌于此阶段均视为【杀】。若如此做,你使用以此法转化的【杀】造成伤害后,你可以使用此牌对应的原卡牌。②出牌阶段,你对你本阶段未使用过【杀】的角色使用【杀】无距离和次数限制。', - dchumei:'狐魅', - dchumei_info:'出牌阶段各限一次,你可以选择一名体力值不大于X的角色,令其:①摸一张牌。②交给你一张牌。③回复1点体力。(X为你本阶段造成的伤害数)', - buchen:'不臣', - buchen_info:'隐匿技,你于其他角色的回合登场时,可获得当前回合角色的一张牌。', - smyyingshi:'鹰视', - smyyingshi_info:'锁定技,出牌阶段,你可观看牌堆顶的X张牌(X为你的体力上限)。', - xiongzhi:'雄志', - xiongzhi_info:'限定技,出牌阶段,你可亮出牌堆顶的一张牌并使用之。若如此做,你重复此流程,直到你以此法展示的牌无法使用。', - quanbian:'权变', - quanbian2:'权变', - quanbian_info:'当你于出牌阶段内使用/打出手牌时,若此牌有花色且你本回合内未使用/打出过该花色的其他手牌,则你可以选择一项:①摸一张牌。②将牌堆顶X张牌中的一张置于牌堆底(X为你的体力上限)。若你发动此技能,则你本回合内不能再使用与此牌花色相同的手牌。', - re_hansui:'新杀韩遂', - re_hansui_prefix:'新杀', - re_quyi:'新杀麴义', - re_quyi_prefix:'新杀', - refuqi:'伏骑', - refuqi_info:'锁定技,当你使用牌时,你令所有距离为1的其他角色不能使用或打出牌响应此牌。', - hanfu:'韩馥', - hfjieying:'节应', - hfjieying2:'节应', - hfjieying3:'节应', - hfjieying_info:'结束阶段,你可以选择一名其他角色,该角色下回合使用目标数为1的【杀】或普通锦囊牌无距离限制且可多指定一个目标,且当其造成伤害后,其无法再使用牌直到回合结束。', - weipo:'危迫', - weipo_info:'锁定技,其他角色使用【杀】或普通锦囊牌指定你为目标后,若你的手牌数小于X,则你将手牌摸至X张,并记录摸牌事件结算后的手牌数Y。此牌结算结束后,若你的手牌数小于Y,则你将一张手牌交给此牌的使用者,且此技能失效直到你的下回合开始。(X为你的体力上限且至多为5)', - zhaozhong:'赵忠', - yangzhong:'殃众', - yangzhong_info:'当你造成或受到伤害后,若受伤角色和伤害来源均存活,则伤害来源可弃置两张牌,然后令受伤角色失去1点体力。', - huangkong:'惶恐', - huangkong_info:'锁定技,当你于回合外成为【杀】或普通锦囊牌的目标后,若你没有手牌,则你摸两张牌。', - re_taoqian:'陶谦', - reyixiang:'义襄', - reyixiang_info:'锁定技,其他角色于其出牌阶段内使用的第一张牌对你的伤害-1;其使用的第二张牌若为黑色,则对你无效。', - caosong:'曹嵩', - cslilu:'礼赂', - cslilu_info:'摸牌阶段,你可以放弃摸牌,改为将手牌摸至X张(X为你的体力上限和5中的最小值),然后将至少一张手牌交给一名其他角色。若你以此法给出的牌数大于你上次以此法给出的牌数,则你加1点体力上限并回复1点体力。', - csyizheng:'翊正', - csyizheng2:'翊正', - csyizheng_info:'结束阶段开始时,你可以选择一名其他角色。你的下回合开始前,当该角色造成伤害或回复体力时,若其体力上限小于你,则你减1点体力上限,且令此伤害值/回复值+1。', - reyirang:'揖让', - reyirang_info:'出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同。然后你回复X点体力(X为你以此法交给其的牌数)。', - liangxing:'梁兴', - lulve:'掳掠', - lulve_info:'出牌阶段开始时,你可选择一名有手牌且手牌数少于你的角色。其选择一项:①将所有手牌交给你,然后你将武将牌翻面。②将武将牌翻面,然后其视为对你使用一张【杀】。', - lxzhuixi:'追袭', - lxzhuixi_info:'锁定技,当你造成伤害或受到伤害时,若受伤角色的翻面状态和伤害来源的翻面状态不同,则此伤害+1。', - zhangmiao:'张邈', - mouni:'谋逆', - mouni_info:'准备阶段,你可对一名其他角色依次使用你手牌中所有的【杀】(若其进入了濒死状态,则终止此流程)。然后若这些【杀】中有未造成伤害的【杀】,则你跳过本回合的出牌阶段和弃牌阶段。', - zongfan:'纵反', - zongfan_info:'觉醒技。结束阶段,若你本回合内因〖谋逆〗使用过【杀】且未跳过本回合的出牌阶段,则你将任意张牌交给一名其他角色,然后加X点体力上限并回复X点体力(X为你以此法给出的牌数且至多为5)。最后失去〖谋逆〗并获得〖战孤〗。', - zhangu:'战孤', - zhangu_info:'锁定技,准备阶段,若你的体力上限大于1且没有手牌/装备区内没有牌,则你减1点体力上限,然后从牌堆中获得三张类型不同的牌。', - re_niujin:'新杀牛金', - re_niujin_prefix:'新杀', - recuorui:'摧锐', - recuorui_info:'限定技,出牌阶段,你可以依次获得至多X名角色的各一张手牌(X为你的体力值)。', - reliewei:'裂围', - reliewei_info:'每回合限Y次,当有角色进入濒死状态时,你可以摸一张牌(Y为你的体力值,若当前回合角色为你,则Y为Infinity)。', - duanwei:'段煨', - langmie:'狼灭', - langmie_damage:'狼灭', - langmie_info:'其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。', - zhangheng:'张横', - dangzai:'挡灾', - dangzai_info:'出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。', - liangjue:'粮绝', - liangjue_info:'锁定技,当有黑色牌进入或者离开你的判定区或装备区后,若你的体力值大于1,你失去1点体力,然后摸两张牌。', - tangji:'唐姬', - kangge:'抗歌', - kangge_info:'你的第一个回合开始时,选择一名其他角色,该角色每次于其回合外得到牌后,你摸等量的牌(每回合至多摸三张);其进入濒死状态时,你可令其回复体力至1点(每轮限一次)。该角色死亡时,你弃置所有牌并失去1点体力。', - jielie:'节烈', - jielie_info:'当你受到除自己和“抗歌”角色以外的角色造成的伤害时,你可以防止此伤害并选择一种花色,然后你失去X点体力,令“抗歌”角色从弃牌堆中随机获得X张此花色的牌(X为伤害值)。', - re_dongcheng:'董承', - xuezhao:'血诏', - xuezhao_info:'出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。', - re_hucheer:'胡车儿', - redaoji:'盗戟', - redaoji2:'盗戟', - redaoji_info:'其他角色第一次使用武器牌时,你可选择一项:①获得此牌。②令其本回合内不能使用或打出【杀】。', - fuzhong:'负重', - fuzhong_info:'锁定技,当你于回合外得到牌后,你获得一枚“重”标记。若X:大于0,你于摸牌阶段开始时令额定摸牌数+1;大于1,你至其他角色的距离-2;大于2,你的手牌上限+3;大于3,结束阶段开始时,你对一名其他角色造成1点伤害,然后移去4枚“重”(X为“重”数)。', - qiuliju:'丘力居', - koulve:'寇略', - koulve_info:'当你于出牌阶段内对其他角色造成伤害后,你可以展示其X张手牌(X为其已损失的体力值)。若这些牌中:有带有伤害标签的基本牌或锦囊牌,则你获得之;有红色牌,则你失去1点体力(若已受伤则改为减1点体力上限),然后摸两张牌。', - qljsuiren:'随认', - qljsuiren_info:'当你死亡时,你可以将手牌中所有的带有伤害标签的基本牌或锦囊牌交给一名其他角色。', - re_zoushi:'邹氏', - rehuoshui:'祸水', - rehuoshui_info:'准备阶段,你可以选择至多X名角色(X为你已损失的体力值且至少为1)。你令这些角色中第一名角色的非锁定技失效直到回合结束;第二名角色交给你一张手牌;第三名及之后角色弃置装备区内的所有牌。', - reqingcheng:'倾城', - reqingcheng_info:'出牌阶段限一次,你可以与一名手牌数不大于你的男性角色交换手牌。', - caoanmin:'曹安民', - xianwei:'险卫', - xianwei_info:'锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你可以令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。', - dufuren:'杜夫人', - yise:'异色', - yise_info:'其他角色得到你的牌后,若这些牌中:有红色牌,你可令其回复1点体力;有黑色牌,其下次受到因执行【杀】的效果造成的伤害时,此伤害+1。', - shunshi:'顺世', - shunshi_info:'准备阶段开始时,或当你受到伤害后,你可将一张牌交给一名不为伤害来源的其他角色并获得如下效果直到你的回合结束:摸牌阶段的额定摸牌数+1,使用【杀】的次数上限+1,手牌上限+1。', - rexingluan:'兴乱', - rexingluan_info:'出牌阶段限一次,当你使用的仅指定一个目标的牌结算完成后,你可以获得场上一张与此牌点数相同的牌,或获得牌堆中随机一张点数与此牌相同的牌。', - xinxingluan:'兴乱', - xinxingluan_info:'每回合限一次。当你于出牌阶段内使用牌结算结束后,你可选择一项:①观看牌堆中的两张点数为6的牌并获得其中一张(没有则改为摸六张牌);②令一名其他角色弃置一张点数为6的牌或交给你一张牌;③获得场上的一张点数为6的牌。', - re_nanhualaoxian:'南华老仙', - gongxiu:'共修', - gongxiu_info:'结束阶段,若你本回合内发动过〖经合〗,则你选择一项:①令所有本回合内成为过〖经合〗目标的角色各摸一张牌;②令所有本回合内未成为过〖经合〗目标的角色各弃置一张手牌。', - jinghe:'经合', - jinghe_info:'出牌阶段限一次,你可以展示至多四张牌名各不相同的牌并选择等量的角色。系统从“写满技能的天书”中随机选择等量的技能,然后这些角色依次选择获得其中的一个。', - nhyinbing:'阴兵', - nhyinbing_info:'锁定技,你使用的【杀】造成伤害改为失去体力。其他角色失去体力后,你摸一张牌。', - nhhuoqi:'活气', - nhhuoqi_info:'出牌阶段限一次,你可以弃置一张牌,然后令体力值最少的一名角色回复1点体力并摸一张牌。', - nhguizhu:'鬼助', - nhguizhu_info:'一名角色进入濒死状态时,你可以摸两张牌(每回合限一次)。', - nhxianshou:'仙授', - nhxianshou_info:'出牌阶段限一次,你可以选择一名角色令其摸一张牌。若其未受伤,则多摸一张。', - nhlundao:'论道', - nhlundao_info:'当你受到伤害后,若伤害来源比你手牌多,你可以弃置其一张牌;若伤害来源比你手牌少,你摸一张牌。', - nhguanyue:'观月', - nhguanyue_info:'结束阶段,你可以观看牌堆顶两张牌,然后获得其中—张,另一张放回牌堆顶。', - nhyanzheng:'言政', - nhyanzheng_info:'准备阶段,若你的手牌数大于1,你可以保留一张手牌并弃置其余的牌,然后选择至多等于弃牌数量的角色,对这些角色各造成1点伤害。', - sp_mifangfushiren:'糜芳傅士仁', - mffengshi:'锋势', - mffengshi_info:'当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则此牌的使用者可令你弃置自己和对方的各一张牌,并令此牌的伤害值+1。', - dcmffengshi:'锋势', - dcmffengshi_info:'当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则你可弃置自己和对方的各一张牌,并令此牌的伤害值+1。', - fengshi:'锋势', - fengshi_info:'当你使用牌指定第一个目标后,你可弃置你与其中一名手牌数小于你的目标角色的各一张牌,并令此牌对其造成的伤害+1;当你成为其他角色使用牌的目标后,若你的手牌数小于其,则你可以弃置你与其的各一张牌,并令此牌对你造成的伤害+1。', - tongyuan:'童渊', - chaofeng:'朝凤', - chaofeng_info:'出牌阶段限一次。当你造成伤害时,你可以弃置一张手牌,然后摸一张牌。若此伤害的渠道为牌且你弃置的牌:与此牌颜色相同,则你改为摸两张牌;与此牌类型相同,则此伤害+1。', - chuanshu:'传术', - chuanshu_info:'限定技。准备阶段,若你已受伤;或当你死亡时,你可令一名其他角色获得〖朝凤〗。然后你获得〖龙胆〗、〖从谏〗和〖穿云〗。', - chuanyun:'穿云', - chuanyun_info:'当你使用【杀】指定目标后,你可令目标角色随机弃置其装备区内的一张牌。', - zhangning:'张宁', - tianze:'天则', - tianze_info:'①每回合限触发一次。其他角色于其出牌阶段内使用的黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。', - difa:'地法', - difa_info:'每回合限一次。当你于回合内因摸牌而得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。', - xinping:'辛评', - fuyuan:'辅袁', - fuyuan_info:'当你于回合外使用或打出牌时,若当前回合角色的手牌数:不小于你,你可摸一张牌;小于你,你可令其摸一张牌。', - zhongjie:'忠节', - zhongjie_info:'当你死亡时,你可令一名其他角色加1点体力上限并回复1点体力,然后摸一张牌。', - hanmeng:'韩猛', - jieliang:'截粮', - jieliang_info:'其他角色的摸牌阶段开始时,你可弃置一张牌,令其本阶段的摸牌数和本回合的手牌上限-1。然后当其于本回合的弃牌阶段内因弃置而失去牌后,你可获得其中的一张。', - quanjiu:'劝酒', - quanjiu_info:'锁定技。①你手牌区中的【酒】的牌名视为【杀】。②你使用对应的实体牌为一张【酒】的非转化【杀】不计入次数限制。', - re_pangdegong:'庞德公', - heqia:'和洽', - heqia_info:'出牌阶段开始时,你可选择一项:①将任意张牌交给一名其他角色。②令一名有手牌的其他角色交给你任意张牌。然后以此法得到牌的角色可以将一张手牌当作任意基本牌使用,且当其声明使用此牌后,可以为此牌增加至至多X个目标(X为以此法移动的牌数)。', - yinyi:'隐逸', - yinyi_info:'锁定技。每回合限一次,当你受到非属性伤害时,若你的手牌数和体力值与伤害来源均不相同,则你防止此伤害。', - haomeng:'郝萌', - xiongmang:'雄莽', - xiongmang_info:'你可将任意张花色各不相同的手牌当做目标数上限为X的【杀】使用(X为此【杀】对应的实体牌数)。此【杀】使用结算结束后,若你未造成过渠道为此牌的伤害且体力上限大于1,则你减1点体力上限。', - yanfuren:'严夫人', - channi:'谗逆', - channi_info:'出牌阶段限一次。你可将任意张手牌交给一名其他角色,然后其可以将至多等量的手牌当做【决斗】使用。若其因此【决斗】造成了伤害,则其摸X张牌(X为此【决斗】对应的实体牌数)。若其因此【决斗】受到过伤害,则你弃置所有手牌。', - nifu:'匿伏', - nifu_info:'锁定技。一名角色的回合结束时,你将手牌摸至或弃置至三张。', - licaiwei:'李采薇', - yijiao:'异教', - yijiao_info:'出牌阶段限一次,你可以选择一名没有“异”标记的其他角色并声明一个整数X(X∈[1,4]),该角色获得10X个“异”标记。有“异”标记的角色的结束阶段,其移去“异”标记,且若其本回合使用牌的点数之和:1.小于“异”标记数,其随机弃置至多三张手牌;2.等于“异”标记数,你摸两张牌且该角色本回合结束后进行一个额外的回合;3.大于“异”标记数,你摸三张牌。', - qibie:'泣别', - qibie_info:'一名角色死亡后,若你有手牌且这些手牌均可被弃置,则你可以弃置所有手牌,然后回复1点体力并摸X+2张牌(X为你弃置的牌数)。', - dc_zhuling:'朱灵', - dczhanyi:'战意', - dczhanyi_info:'出牌阶段开始时,你可以弃置所有基本牌/锦囊牌/装备牌,然后获得另外两种类型的牌对应的效果直到你的下个回合开始:基本牌、你使用基本牌无距离限制,且伤害值和回复值基数+1;锦囊牌、你使用锦囊牌时摸一张牌,且锦囊牌不计入手牌上限;装备牌,当装备牌进入你的装备区时,你可弃置一名其他角色的一张牌。', - yanrou:'阎柔', - choutao:'仇讨', - choutao_info:'当你使用【杀】时,或成为【杀】的目标后,你可以弃置此【杀】使用者的一张牌,令此【杀】不可被响应。若你是此【杀】的使用者,则你令此【杀】不计入次数限制。', - xiangshu:'襄戍', - xiangshu_info:'限定技。结束阶段开始时,若你本回合内造成过伤害,则你可以选择一名已受伤的角色。该角色回复X点体力并摸X张牌(X为你本回合内造成的伤害值总和且至多为5)。', - qinyilu:'秦宜禄', - piaoping:'漂萍', - piaoping_info:'转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)', - tuoxian:'托献', - tuoxian_info:'每局游戏限一次。当你因执行〖漂萍〗的效果而弃置牌后,你可令一名其他角色获得这些牌,然后令该角色选择一项:⒈弃置区域内等量的牌。⒉令你的〖漂萍〗失效直到回合结束。', - chuaili:'惴栗', - chuaili_info:'锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。', - fengfang:'冯方', - dcditing:'谛听', - dcditing_info:'其他角色的出牌阶段开始时,若你在该角色的攻击范围内,则你可以观看其的X张手牌(X为你的体力值)并选择其中一张,且获得如下效果:①当其使用对应实体牌包含此牌的牌指定你为目标后,你令此牌对你无效。②当其使用对应实体牌包含此牌的牌结算结束后,若你不是此牌的目标,则你摸两张牌。③其出牌阶段结束时,若此牌位于其的手牌区,则你获得此牌。', - dcbihuo:'避祸', - dcbihuo_info:'①当你受到其他角色造成的伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数+1。②当你对其他角色造成伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数-1。', - bianxi:'卞喜', - dunxi:'钝袭', - dunxi_info:'①当你使用具有伤害标签的牌时,你可以令一名不为你的目标角色获得一枚“钝”。②有“钝”的角色使用基本牌或锦囊牌时,若此牌目标数为1且此时没有角色处于濒死状态,你令其移去一枚“钝”。系统随机选择一名角色,并将此牌的目标改为该角色。若该角色和原目标相同,则其失去1点体力。若其正处于出牌阶段内,则结束此阶段。', - niufu:'牛辅', - dcxiaoxi:'宵袭', - dcxiaoxi_info:'锁定技。出牌阶段开始时,你声明X并减X点体力上限(X∈[1,2])。然后你选择一名攻击范围内的其他角色并选择一项:⒈获得该角色的X张牌。⒉视为对其使用X张【杀】。', - xiongrao:'熊扰', - xiongrao_info:'限定技。准备阶段开始时,你可以选择所有其他角色。这些角色本回合内所有不为锁定技、限定技、觉醒技的普通技能失效。然后你将体力上限增加至7点并摸X张牌(X为你以此法增加的体力上限数)。', - dc_huban:'胡班', - dcchongyi:'崇义', - dcchongyi_info:'①一名角色使用【杀】时,若此牌是其于当前出牌阶段内使用的第一张牌,则你可以令其摸两张牌,且其本回合使用【杀】的次数上限+1。②一名角色的出牌阶段结束时,若其于此阶段内使用的最后一张牌为【杀】,则你可以令其本回合的手牌上限+1,然后你获得此【杀】。', - wangwei:'王威', - dcruizhan:'锐战', - dcruizhan_info:'其他角色的准备阶段开始时,若其的手牌数不小于其体力值,则你可以和其拼点。若你赢或拼点牌中有【杀】,则你视为对其使用一张【杀】。然后若此【杀】造成了伤害且以上两个条件均被满足,则你获得其一张牌。', - dcshilie:'示烈', - dcshilie_info:'①出牌阶段限一次。你可以选择一项:⒈回复1点体力,将两张牌置于武将牌上作为“示烈”。若“示烈”牌数大于存活人数,则你将最早的多余牌置入弃牌堆;⒉失去1点体力,获得两张“示烈”牌。(满血则不回血,无牌则不移动)②当你死亡时,你可以将所有“示烈”牌交给一名不为伤害来源的其他角色。', - dc_zhaoyǎn:'赵俨', - dcfuning:'抚宁', - dcfuning_info:'当你使用牌时,你可以摸两张牌,然后弃置X张牌(X为你本回合内发动过〖抚宁〗的次数)。', - dcbingji:'秉纪', - dcbingji_info:'出牌阶段每种花色各限一次。若你有手牌且这些牌的花色均相同,则你可以展示手牌,然后选择一名其他角色,视为对其使用一张【杀】或【桃】(有距离限制)。', - mushun:'穆顺', - dcjinjian:'劲坚', - dcjinjian_info:'①当你受到其他角色造成的伤害后或造成伤害后,你获得一枚“劲”。然后你可以和伤害来源拼点,若你赢,你恢复1点体力。②你的攻击范围+X(X为“劲”数)。', - dcshizhao:'失诏', - dcshizhao_info:'锁定技。每回合限一次,当你于回合外失去手牌后,若你没有手牌,且你:有“劲”,则你移去一枚“劲”并摸两张牌;没有“劲”,则你本回合下一次受到的伤害+1。', - liyixiejing:'李异谢旌', - dcdouzhen:'斗阵', - dcdouzhen_info:'锁定技。①转换技。你的回合内,阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。', - dc_hujinding:'新杀胡金定', - dc_hujinding_prefix:'新杀', - dcdeshi:'德释', - dcdeshi_info:'锁定技。当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并令系统从弃牌堆/牌堆中检索一张【杀】,你获得此【杀】,然后减1点体力上限。', - dcwuyuan:'武缘', - dcwuyuan_info:'出牌阶段限一次。你可将一张【杀】交给一名其他角色,然后你回复1点体力,你与其各摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。', - shiyi:'是仪', - dccuichuan:'榱椽', - dccuichuan_info:'出牌阶段限一次。你可以弃置一张手牌并选择一名角色,其随机使用牌堆里一张其空置装备栏对应副类别且其能对其使用的装备牌,你摸X张牌(X为其装备区里的牌数)。然后若其装备区里的牌数增加至四张,你失去〖榱椽〗,获得〖佐谏〗,且令其获得一个额外回合。', - dczhengxu:'正序', - dczhengxu_info:'每回合每项限一次。①当你受到伤害时,若你本回合失去过牌,你可以防止此伤害。②当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌。', - dczuojian:'佐谏', - dczuojian_info:'出牌阶段结束时,若你于此阶段使用过的牌数不小于体力值,你可以选择一项:1.令装备区牌数多于你的角色各摸一张牌;2.弃置装备区牌数少于你的角色各一张手牌。', - sunlang:'孙狼', - dctingxian:'铤险', - dctingxian_info:'每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。', - dcbenshi:'奔矢', - dcbenshi_info:'锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。', - sunhuan:'孙桓', - dcniji:'逆击', - dcniji_info:'①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,你可以使用一张“逆击”牌,然后弃置所有“逆击”牌。', + mubing: "募兵", + mubing_info: + "出牌阶段开始时,你可以亮出牌堆顶的三张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。", + ziqu: "资取", + ziqu_info: + "每名角色限一次,当你对有牌的其他角色造成伤害后,你可以防止此伤害。然后其将其点数最大的牌交给你。", + diaoling: "调令", + diaoling_info: + "觉醒技,准备阶段,若你已因〖募兵〗获得了6张或更多的【杀】或武器牌或伤害锦囊牌,则你回复1点体力或摸两张牌,然后修改〖募兵〗。", + mubing_rewrite: "募兵·改", + mubing_rewrite_info: + "出牌阶段开始时,你可以亮出牌堆顶的四张牌。你可弃置任意张手牌,并可获得任意张点数之和不大于你弃置的牌点数之和的牌。然后你可将以此法得到的牌以任意方式交给其他角色。", + caobuxing: "曹不兴", + moying: "墨影", + moying_info: + "每回合限一次,当你于回合外不因使用而失去单一一张锦囊牌或装备牌后,你可以选择一个花色和与此牌点数差绝对值不超过2的点数,然后获得牌堆中所有与此牌花色点数相同的牌。", + juanhui: "绢绘", + juanhui2: "绢绘", + juanhui2_backup: "绢绘", + juanhui_info: + '结束阶段,你可以选择一名其他角色。记录该角色下回合的出牌阶段里使用的基本牌和普通锦囊牌(每种牌名限记一次),你的下回合出牌阶段,可将一张手牌当这些牌里的任意一张牌使用(每张限使用一次,且【杀】不计次数)。当"绢绘"的牌全部用完时,你回复1点体力并将手牌摸至三张。', + re_maliang: "新杀马良", + re_maliang_prefix: "新杀", + rexiemu: "协穆", + rexiemu_info: + "结束阶段,若全场没有“协穆”标记,你可以选择一名角色获得“协穆”标记直到你的下回合开始。你或该角色在各自的回合外使用或打出手牌时,你与其各摸一张牌(每回合限一次)。", + heli: "贺励", + heli_info: + "出牌阶段限一次,你可以选择手牌数比你少的一名其他角色。该角色展示所有手牌,然后每缺少一种类型的牌,便从牌堆中随机获得一张此类型的牌。", + zhujun: "朱儁", + gongjian: "攻坚", + gongjian_info: + "每回合限一次,当有角色使用【杀】指定第一个目标后,若此【杀】的目标和本局游戏内被使用的上一张【杀】的目标的交集A不为空,则你可以依次弃置A中所有角色的至多两张牌,然后获得以此法弃置的所有【杀】。", + kuimang: "溃蟒", + kuimang_info: "锁定技,一名角色死亡后,若你对其造成过伤害,你摸两张牌。", + liuhong: "刘宏", + yujue: "鬻爵", + yujue_backup: "鬻爵", + yujue_info: + "出牌阶段限一次,你可以废除一个装备栏,然后令一名有手牌的其他角色交给你一张手牌。其获得〖执笏〗直到你的下回合开始。", + zhihu: "执笏", + zhihu_mark: "执笏", + zhihu_info: "锁定技,每回合限两次,当你对其他角色造成伤害后,你摸两张牌。", + tuxing: "图兴", + tuxing2: "图兴", + tuxing_info: + "锁定技,当你废除一个装备栏时,你加1点体力上限并回复1点体力。然后若你所有的装备栏均已被废除,则你减4点体力上限,且本局游戏内造成的伤害+1。", + re_hejin: "新杀何进", + re_hejin_prefix: "新杀", + xin_baosanniang: "新杀鲍三娘", + xin_baosanniang_prefix: "新杀", + decadexushen: "许身", + decadexushen2: "许身", + decadexushen_info: + "限定技,当你进入濒死状态后,你可以回复1点体力并获得技能“镇南”,然后如果你脱离濒死状态且“关索”不在场,你可令一名其他角色选择是否用“关索”代替其武将并令其摸三张牌。", + decadezhennan: "镇南", + decadezhennan_info: + "当有角色使用普通锦囊牌指定目标后,若此牌目标数大于1,你可以对一名其他角色造成1点伤害。", + ol_dingyuan: "丁原", + cixiao: "慈孝", + cixiao_info: + "准备阶段,若场上没有“义子”标记,你可令一名其他角色获得一个“义子”标记;若场上有“义子”标记,你可以弃置一张牌移动“义子”标记。拥有“义子”标记的角色获得技能“叛弑”。", + panshi: "叛弑", + panshi_info: + "锁定技,准备阶段,你交给有“慈孝”技能的角色一张手牌;当你于出牌阶段因使用【杀】对其他角色造成伤害时,若其拥有技能“慈孝”,则此伤害+1,且你结束出牌阶段。", + xianshuai: "先率", + xianshuai_info: + "锁定技,有角色造成伤害后,若此伤害是本轮第一次造成伤害:你摸一张牌;若伤害来源是你,则你对受伤角色再造成1点伤害。", + wangrong: "王荣", + minsi: "敏思", + minsi2: "敏思", + minsi_info: + "出牌阶段限一次,你可以弃置任意张点数之和为13的牌,然后摸两倍数量的牌。以此法得到的牌中,黑色牌本回合无距离限制,红色牌本回合不计入手牌上限。", + jijing: "吉境", + jijing_info: + "当你受到伤害后,你可以进行一次判定,然后若你弃置任意张点数之和与判定结果点数相同的牌,你回复1点体力。", + zhuide: "追德", + zhuide_info: "当你死亡时,你可令一名其他角色从牌堆中获得四张名称各不相同的基本牌。", + decadewuniang: "武娘", + decadewuniang_info: + "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,其摸一张牌。(若你已发动许身,则关索也摸一张牌)", + dongxie: "董翓", + juntun: "军屯", + juntun_info: "锁定技,准备阶段,若X大于1,则你减1点体力上限并摸X张牌(X为你的体力上限)。", + jiaojie: "狡黠", + jiaojie_info: "锁定技,你的红色牌不计入手牌上限。你使用黑色牌无距离和次数限制。", + dcjiaoxia: "狡黠", + dcjiaoxia_info: + "①出牌阶段开始时,你可以令自己的所有手牌于此阶段均视为【杀】。若如此做,你使用以此法转化的【杀】造成伤害后,你可以使用此牌对应的原卡牌。②出牌阶段,你对你本阶段未使用过【杀】的角色使用【杀】无距离和次数限制。", + dchumei: "狐魅", + dchumei_info: + "出牌阶段各限一次,你可以选择一名体力值不大于X的角色,令其:①摸一张牌。②交给你一张牌。③回复1点体力。(X为你本阶段造成的伤害数)", + buchen: "不臣", + buchen_info: "隐匿技,你于其他角色的回合登场时,可获得当前回合角色的一张牌。", + smyyingshi: "鹰视", + smyyingshi_info: "锁定技,出牌阶段,你可观看牌堆顶的X张牌(X为你的体力上限)。", + xiongzhi: "雄志", + xiongzhi_info: + "限定技,出牌阶段,你可亮出牌堆顶的一张牌并使用之。若如此做,你重复此流程,直到你以此法展示的牌无法使用。", + quanbian: "权变", + quanbian2: "权变", + quanbian_info: + "当你于出牌阶段内使用/打出手牌时,若此牌有花色且你本回合内未使用/打出过该花色的其他手牌,则你可以选择一项:①摸一张牌。②将牌堆顶X张牌中的一张置于牌堆底(X为你的体力上限)。若你发动此技能,则你本回合内不能再使用与此牌花色相同的手牌。", + re_hansui: "新杀韩遂", + re_hansui_prefix: "新杀", + re_quyi: "新杀麴义", + re_quyi_prefix: "新杀", + refuqi: "伏骑", + refuqi_info: "锁定技,当你使用牌时,你令所有距离为1的其他角色不能使用或打出牌响应此牌。", + hanfu: "韩馥", + hfjieying: "节应", + hfjieying2: "节应", + hfjieying3: "节应", + hfjieying_info: + "结束阶段,你可以选择一名其他角色,该角色下回合使用目标数为1的【杀】或普通锦囊牌无距离限制且可多指定一个目标,且当其造成伤害后,其无法再使用牌直到回合结束。", + weipo: "危迫", + weipo_info: + "锁定技,其他角色使用【杀】或普通锦囊牌指定你为目标后,若你的手牌数小于X,则你将手牌摸至X张,并记录摸牌事件结算后的手牌数Y。此牌结算结束后,若你的手牌数小于Y,则你将一张手牌交给此牌的使用者,且此技能失效直到你的下回合开始。(X为你的体力上限且至多为5)", + zhaozhong: "赵忠", + yangzhong: "殃众", + yangzhong_info: + "当你造成或受到伤害后,若受伤角色和伤害来源均存活,则伤害来源可弃置两张牌,然后令受伤角色失去1点体力。", + huangkong: "惶恐", + huangkong_info: + "锁定技,当你于回合外成为【杀】或普通锦囊牌的目标后,若你没有手牌,则你摸两张牌。", + re_taoqian: "陶谦", + reyixiang: "义襄", + reyixiang_info: + "锁定技,其他角色于其出牌阶段内使用的第一张牌对你的伤害-1;其使用的第二张牌若为黑色,则对你无效。", + caosong: "曹嵩", + cslilu: "礼赂", + cslilu_info: + "摸牌阶段,你可以放弃摸牌,改为将手牌摸至X张(X为你的体力上限和5中的最小值),然后将至少一张手牌交给一名其他角色。若你以此法给出的牌数大于你上次以此法给出的牌数,则你加1点体力上限并回复1点体力。", + csyizheng: "翊正", + csyizheng2: "翊正", + csyizheng_info: + "结束阶段开始时,你可以选择一名其他角色。你的下回合开始前,当该角色造成伤害或回复体力时,若其体力上限小于你,则你减1点体力上限,且令此伤害值/回复值+1。", + reyirang: "揖让", + reyirang_info: + "出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同。然后你回复X点体力(X为你以此法交给其的牌数)。", + liangxing: "梁兴", + lulve: "掳掠", + lulve_info: + "出牌阶段开始时,你可选择一名有手牌且手牌数少于你的角色。其选择一项:①将所有手牌交给你,然后你将武将牌翻面。②将武将牌翻面,然后其视为对你使用一张【杀】。", + lxzhuixi: "追袭", + lxzhuixi_info: + "锁定技,当你造成伤害或受到伤害时,若受伤角色的翻面状态和伤害来源的翻面状态不同,则此伤害+1。", + zhangmiao: "张邈", + mouni: "谋逆", + mouni_info: + "准备阶段,你可对一名其他角色依次使用你手牌中所有的【杀】(若其进入了濒死状态,则终止此流程)。然后若这些【杀】中有未造成伤害的【杀】,则你跳过本回合的出牌阶段和弃牌阶段。", + zongfan: "纵反", + zongfan_info: + "觉醒技。结束阶段,若你本回合内因〖谋逆〗使用过【杀】且未跳过本回合的出牌阶段,则你将任意张牌交给一名其他角色,然后加X点体力上限并回复X点体力(X为你以此法给出的牌数且至多为5)。最后失去〖谋逆〗并获得〖战孤〗。", + zhangu: "战孤", + zhangu_info: + "锁定技,准备阶段,若你的体力上限大于1且没有手牌/装备区内没有牌,则你减1点体力上限,然后从牌堆中获得三张类型不同的牌。", + re_niujin: "新杀牛金", + re_niujin_prefix: "新杀", + recuorui: "摧锐", + recuorui_info: "限定技,出牌阶段,你可以依次获得至多X名角色的各一张手牌(X为你的体力值)。", + reliewei: "裂围", + reliewei_info: + "每回合限Y次,当有角色进入濒死状态时,你可以摸一张牌(Y为你的体力值,若当前回合角色为你,则Y为Infinity)。", + duanwei: "段煨", + langmie: "狼灭", + langmie_damage: "狼灭", + langmie_info: + "其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。", + zhangheng: "张横", + dangzai: "挡灾", + dangzai_info: "出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。", + liangjue: "粮绝", + liangjue_info: + "锁定技,当有黑色牌进入或者离开你的判定区或装备区后,若你的体力值大于1,你失去1点体力,然后摸两张牌。", + tangji: "唐姬", + kangge: "抗歌", + kangge_info: + "你的第一个回合开始时,选择一名其他角色,该角色每次于其回合外得到牌后,你摸等量的牌(每回合至多摸三张);其进入濒死状态时,你可令其回复体力至1点(每轮限一次)。该角色死亡时,你弃置所有牌并失去1点体力。", + jielie: "节烈", + jielie_info: + "当你受到除自己和“抗歌”角色以外的角色造成的伤害时,你可以防止此伤害并选择一种花色,然后你失去X点体力,令“抗歌”角色从弃牌堆中随机获得X张此花色的牌(X为伤害值)。", + re_dongcheng: "董承", + xuezhao: "血诏", + xuezhao_info: + "出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。", + re_hucheer: "胡车儿", + redaoji: "盗戟", + redaoji2: "盗戟", + redaoji_info: + "其他角色第一次使用武器牌时,你可选择一项:①获得此牌。②令其本回合内不能使用或打出【杀】。", + fuzhong: "负重", + fuzhong_info: + "锁定技,当你于回合外得到牌后,你获得一枚“重”标记。若X:大于0,你于摸牌阶段开始时令额定摸牌数+1;大于1,你至其他角色的距离-2;大于2,你的手牌上限+3;大于3,结束阶段开始时,你对一名其他角色造成1点伤害,然后移去4枚“重”(X为“重”数)。", + qiuliju: "丘力居", + koulve: "寇略", + koulve_info: + "当你于出牌阶段内对其他角色造成伤害后,你可以展示其X张手牌(X为其已损失的体力值)。若这些牌中:有带有伤害标签的基本牌或锦囊牌,则你获得之;有红色牌,则你失去1点体力(若已受伤则改为减1点体力上限),然后摸两张牌。", + qljsuiren: "随认", + qljsuiren_info: "当你死亡时,你可以将手牌中所有的带有伤害标签的基本牌或锦囊牌交给一名其他角色。", + re_zoushi: "邹氏", + rehuoshui: "祸水", + rehuoshui_info: + "准备阶段,你可以选择至多X名角色(X为你已损失的体力值且至少为1)。你令这些角色中第一名角色的非锁定技失效直到回合结束;第二名角色交给你一张手牌;第三名及之后角色弃置装备区内的所有牌。", + reqingcheng: "倾城", + reqingcheng_info: "出牌阶段限一次,你可以与一名手牌数不大于你的男性角色交换手牌。", + caoanmin: "曹安民", + xianwei: "险卫", + xianwei_info: + "锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你可以令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。", + dufuren: "杜夫人", + yise: "异色", + yise_info: + "其他角色得到你的牌后,若这些牌中:有红色牌,你可令其回复1点体力;有黑色牌,其下次受到因执行【杀】的效果造成的伤害时,此伤害+1。", + shunshi: "顺世", + shunshi_info: + "准备阶段开始时,或当你受到伤害后,你可将一张牌交给一名不为伤害来源的其他角色并获得如下效果直到你的回合结束:摸牌阶段的额定摸牌数+1,使用【杀】的次数上限+1,手牌上限+1。", + rexingluan: "兴乱", + rexingluan_info: + "出牌阶段限一次,当你使用的仅指定一个目标的牌结算完成后,你可以获得场上一张与此牌点数相同的牌,或获得牌堆中随机一张点数与此牌相同的牌。", + xinxingluan: "兴乱", + xinxingluan_info: + "每回合限一次。当你于出牌阶段内使用牌结算结束后,你可选择一项:①观看牌堆中的两张点数为6的牌并获得其中一张(没有则改为摸六张牌);②令一名其他角色弃置一张点数为6的牌或交给你一张牌;③获得场上的一张点数为6的牌。", + re_nanhualaoxian: "南华老仙", + gongxiu: "共修", + gongxiu_info: + "结束阶段,若你本回合内发动过〖经合〗,则你选择一项:①令所有本回合内成为过〖经合〗目标的角色各摸一张牌;②令所有本回合内未成为过〖经合〗目标的角色各弃置一张手牌。", + jinghe: "经合", + jinghe_info: + "出牌阶段限一次,你可以展示至多四张牌名各不相同的牌并选择等量的角色。系统从“写满技能的天书”中随机选择等量的技能,然后这些角色依次选择获得其中的一个。", + nhyinbing: "阴兵", + nhyinbing_info: "锁定技,你使用的【杀】造成伤害改为失去体力。其他角色失去体力后,你摸一张牌。", + nhhuoqi: "活气", + nhhuoqi_info: + "出牌阶段限一次,你可以弃置一张牌,然后令体力值最少的一名角色回复1点体力并摸一张牌。", + nhguizhu: "鬼助", + nhguizhu_info: "一名角色进入濒死状态时,你可以摸两张牌(每回合限一次)。", + nhxianshou: "仙授", + nhxianshou_info: "出牌阶段限一次,你可以选择一名角色令其摸一张牌。若其未受伤,则多摸一张。", + nhlundao: "论道", + nhlundao_info: + "当你受到伤害后,若伤害来源比你手牌多,你可以弃置其一张牌;若伤害来源比你手牌少,你摸一张牌。", + nhguanyue: "观月", + nhguanyue_info: "结束阶段,你可以观看牌堆顶两张牌,然后获得其中—张,另一张放回牌堆顶。", + nhyanzheng: "言政", + nhyanzheng_info: + "准备阶段,若你的手牌数大于1,你可以保留一张手牌并弃置其余的牌,然后选择至多等于弃牌数量的角色,对这些角色各造成1点伤害。", + sp_mifangfushiren: "糜芳傅士仁", + mffengshi: "锋势", + mffengshi_info: + "当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则此牌的使用者可令你弃置自己和对方的各一张牌,并令此牌的伤害值+1。", + dcmffengshi: "锋势", + dcmffengshi_info: + "当你使用牌指定唯一目标后,或成为其他角色使用牌的唯一目标后,若此牌使用者的手牌数大于此牌目标的手牌数,则你可弃置自己和对方的各一张牌,并令此牌的伤害值+1。", + fengshi: "锋势", + fengshi_info: + "当你使用牌指定第一个目标后,你可弃置你与其中一名手牌数小于你的目标角色的各一张牌,并令此牌对其造成的伤害+1;当你成为其他角色使用牌的目标后,若你的手牌数小于其,则你可以弃置你与其的各一张牌,并令此牌对你造成的伤害+1。", + tongyuan: "童渊", + chaofeng: "朝凤", + chaofeng_info: + "出牌阶段限一次。当你造成伤害时,你可以弃置一张手牌,然后摸一张牌。若此伤害的渠道为牌且你弃置的牌:与此牌颜色相同,则你改为摸两张牌;与此牌类型相同,则此伤害+1。", + chuanshu: "传术", + chuanshu_info: + "限定技。准备阶段,若你已受伤;或当你死亡时,你可令一名其他角色获得〖朝凤〗。然后你获得〖龙胆〗、〖从谏〗和〖穿云〗。", + chuanyun: "穿云", + chuanyun_info: "当你使用【杀】指定目标后,你可令目标角色随机弃置其装备区内的一张牌。", + zhangning: "张宁", + tianze: "天则", + tianze_info: + "①每回合限触发一次。其他角色于其出牌阶段内使用的黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。", + difa: "地法", + difa_info: + "每回合限一次。当你于回合内因摸牌而得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。", + xinping: "辛评", + fuyuan: "辅袁", + fuyuan_info: + "当你于回合外使用或打出牌时,若当前回合角色的手牌数:不小于你,你可摸一张牌;小于你,你可令其摸一张牌。", + zhongjie: "忠节", + zhongjie_info: "当你死亡时,你可令一名其他角色加1点体力上限并回复1点体力,然后摸一张牌。", + hanmeng: "韩猛", + jieliang: "截粮", + jieliang_info: + "其他角色的摸牌阶段开始时,你可弃置一张牌,令其本阶段的摸牌数和本回合的手牌上限-1。然后当其于本回合的弃牌阶段内因弃置而失去牌后,你可获得其中的一张。", + quanjiu: "劝酒", + quanjiu_info: + "锁定技。①你手牌区中的【酒】的牌名视为【杀】。②你使用对应的实体牌为一张【酒】的非转化【杀】不计入次数限制。", + re_pangdegong: "庞德公", + heqia: "和洽", + heqia_info: + "出牌阶段开始时,你可选择一项:①将任意张牌交给一名其他角色。②令一名有手牌的其他角色交给你任意张牌。然后以此法得到牌的角色可以将一张手牌当作任意基本牌使用,且当其声明使用此牌后,可以为此牌增加至至多X个目标(X为以此法移动的牌数)。", + yinyi: "隐逸", + yinyi_info: + "锁定技。每回合限一次,当你受到非属性伤害时,若你的手牌数和体力值与伤害来源均不相同,则你防止此伤害。", + haomeng: "郝萌", + xiongmang: "雄莽", + xiongmang_info: + "你可将任意张花色各不相同的手牌当做目标数上限为X的【杀】使用(X为此【杀】对应的实体牌数)。此【杀】使用结算结束后,若你未造成过渠道为此牌的伤害且体力上限大于1,则你减1点体力上限。", + yanfuren: "严夫人", + channi: "谗逆", + channi_info: + "出牌阶段限一次。你可将任意张手牌交给一名其他角色,然后其可以将至多等量的手牌当做【决斗】使用。若其因此【决斗】造成了伤害,则其摸X张牌(X为此【决斗】对应的实体牌数)。若其因此【决斗】受到过伤害,则你弃置所有手牌。", + nifu: "匿伏", + nifu_info: "锁定技。一名角色的回合结束时,你将手牌摸至或弃置至三张。", + licaiwei: "李采薇", + yijiao: "异教", + yijiao_info: + "出牌阶段限一次,你可以选择一名没有“异”标记的其他角色并声明一个整数X(X∈[1,4]),该角色获得10X个“异”标记。有“异”标记的角色的结束阶段,其移去“异”标记,且若其本回合使用牌的点数之和:1.小于“异”标记数,其随机弃置至多三张手牌;2.等于“异”标记数,你摸两张牌且该角色本回合结束后进行一个额外的回合;3.大于“异”标记数,你摸三张牌。", + qibie: "泣别", + qibie_info: + "一名角色死亡后,若你有手牌且这些手牌均可被弃置,则你可以弃置所有手牌,然后回复1点体力并摸X+2张牌(X为你弃置的牌数)。", + dc_zhuling: "朱灵", + dczhanyi: "战意", + dczhanyi_info: + "出牌阶段开始时,你可以弃置所有基本牌/锦囊牌/装备牌,然后获得另外两种类型的牌对应的效果直到你的下个回合开始:基本牌、你使用基本牌无距离限制,且伤害值和回复值基数+1;锦囊牌、你使用锦囊牌时摸一张牌,且锦囊牌不计入手牌上限;装备牌,当装备牌进入你的装备区时,你可弃置一名其他角色的一张牌。", + yanrou: "阎柔", + choutao: "仇讨", + choutao_info: + "当你使用【杀】时,或成为【杀】的目标后,你可以弃置此【杀】使用者的一张牌,令此【杀】不可被响应。若你是此【杀】的使用者,则你令此【杀】不计入次数限制。", + xiangshu: "襄戍", + xiangshu_info: + "限定技。结束阶段开始时,若你本回合内造成过伤害,则你可以选择一名已受伤的角色。该角色回复X点体力并摸X张牌(X为你本回合内造成的伤害值总和且至多为5)。", + qinyilu: "秦宜禄", + piaoping: "漂萍", + piaoping_info: + "转换技,锁定技。当你使用一张牌时,阴:你摸X张牌。阳:你弃置X张牌。(X为你本阶段内发动过〖漂萍〗的次数且至多等于你的体力值)", + tuoxian: "托献", + tuoxian_info: + "每局游戏限一次。当你因执行〖漂萍〗的效果而弃置牌后,你可令一名其他角色获得这些牌,然后令该角色选择一项:⒈弃置区域内等量的牌。⒉令你的〖漂萍〗失效直到回合结束。", + chuaili: "惴栗", + chuaili_info: + "锁定技。当你成为其他角色使用黑色牌的目标后,若你的〖漂萍〗:处于阳状态,则你将〖漂萍〗转换至阴状态;处于阴状态,则你令〖托献〗发动次数+1,然后若〖托献〗发动次数大于3,则〖惴栗〗于本回合内失效。", + fengfang: "冯方", + dcditing: "谛听", + dcditing_info: + "其他角色的出牌阶段开始时,若你在该角色的攻击范围内,则你可以观看其的X张手牌(X为你的体力值)并选择其中一张,且获得如下效果:①当其使用对应实体牌包含此牌的牌指定你为目标后,你令此牌对你无效。②当其使用对应实体牌包含此牌的牌结算结束后,若你不是此牌的目标,则你摸两张牌。③其出牌阶段结束时,若此牌位于其的手牌区,则你获得此牌。", + dcbihuo: "避祸", + dcbihuo_info: + "①当你受到其他角色造成的伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数+1。②当你对其他角色造成伤害后,你可令一名角色下回合摸牌阶段的额定摸牌数-1。", + bianxi: "卞喜", + dunxi: "钝袭", + dunxi_info: + "①当你使用具有伤害标签的牌时,你可以令一名不为你的目标角色获得一枚“钝”。②有“钝”的角色使用基本牌或锦囊牌时,若此牌目标数为1且此时没有角色处于濒死状态,你令其移去一枚“钝”。系统随机选择一名角色,并将此牌的目标改为该角色。若该角色和原目标相同,则其失去1点体力。若其正处于出牌阶段内,则结束此阶段。", + niufu: "牛辅", + dcxiaoxi: "宵袭", + dcxiaoxi_info: + "锁定技。出牌阶段开始时,你声明X并减X点体力上限(X∈[1,2])。然后你选择一名攻击范围内的其他角色并选择一项:⒈获得该角色的X张牌。⒉视为对其使用X张【杀】。", + xiongrao: "熊扰", + xiongrao_info: + "限定技。准备阶段开始时,你可以选择所有其他角色。这些角色本回合内所有不为锁定技、限定技、觉醒技的普通技能失效。然后你将体力上限增加至7点并摸X张牌(X为你以此法增加的体力上限数)。", + dc_huban: "胡班", + dcchongyi: "崇义", + dcchongyi_info: + "①一名角色使用【杀】时,若此牌是其于当前出牌阶段内使用的第一张牌,则你可以令其摸两张牌,且其本回合使用【杀】的次数上限+1。②一名角色的出牌阶段结束时,若其于此阶段内使用的最后一张牌为【杀】,则你可以令其本回合的手牌上限+1,然后你获得此【杀】。", + wangwei: "王威", + dcruizhan: "锐战", + dcruizhan_info: + "其他角色的准备阶段开始时,若其的手牌数不小于其体力值,则你可以和其拼点。若你赢或拼点牌中有【杀】,则你视为对其使用一张【杀】。然后若此【杀】造成了伤害且以上两个条件均被满足,则你获得其一张牌。", + dcshilie: "示烈", + dcshilie_info: + "①出牌阶段限一次。你可以选择一项:⒈回复1点体力,将两张牌置于武将牌上作为“示烈”。若“示烈”牌数大于存活人数,则你将最早的多余牌置入弃牌堆;⒉失去1点体力,获得两张“示烈”牌。(满血则不回血,无牌则不移动)②当你死亡时,你可以将所有“示烈”牌交给一名不为伤害来源的其他角色。", + dc_zhaoyǎn: "赵俨", + dcfuning: "抚宁", + dcfuning_info: + "当你使用牌时,你可以摸两张牌,然后弃置X张牌(X为你本回合内发动过〖抚宁〗的次数)。", + dcbingji: "秉纪", + dcbingji_info: + "出牌阶段每种花色各限一次。若你有手牌且这些牌的花色均相同,则你可以展示手牌,然后选择一名其他角色,视为对其使用一张【杀】或【桃】(有距离限制)。", + mushun: "穆顺", + dcjinjian: "劲坚", + dcjinjian_info: + "①当你受到其他角色造成的伤害后或造成伤害后,你获得一枚“劲”。然后你可以和伤害来源拼点,若你赢,你恢复1点体力。②你的攻击范围+X(X为“劲”数)。", + dcshizhao: "失诏", + dcshizhao_info: + "锁定技。每回合限一次,当你于回合外失去手牌后,若你没有手牌,且你:有“劲”,则你移去一枚“劲”并摸两张牌;没有“劲”,则你本回合下一次受到的伤害+1。", + liyixiejing: "李异谢旌", + dcdouzhen: "斗阵", + dcdouzhen_info: + "锁定技。①转换技。你的回合内,阴:当你使用非转化且对应的实体牌为一张黑色基本牌的【决斗】时,你获得目标角色各一张牌并获得1枚“☯”;阳:当你使用或打出非转化且对应的实体牌为一张红色基本牌的【杀】时,你获得1枚“☯”。②若你的“☯”数为:偶数,你的黑色基本牌均视为【决斗】;奇数,你的红色基本牌均视为无次数限制的普【杀】。", + dc_hujinding: "新杀胡金定", + dc_hujinding_prefix: "新杀", + dcdeshi: "德释", + dcdeshi_info: + "锁定技。当你受到【杀】的伤害时,若你已受伤,则你防止此伤害并令系统从弃牌堆/牌堆中检索一张【杀】,你获得此【杀】,然后减1点体力上限。", + dcwuyuan: "武缘", + dcwuyuan_info: + "出牌阶段限一次。你可将一张【杀】交给一名其他角色,然后你回复1点体力,你与其各摸一张牌。若此【杀】为:红色【杀】,其回复1点体力;属性【杀】,其改为摸两张牌。", + shiyi: "是仪", + dccuichuan: "榱椽", + dccuichuan_info: + "出牌阶段限一次。你可以弃置一张手牌并选择一名角色,其随机使用牌堆里一张其空置装备栏对应副类别且其能对其使用的装备牌,你摸X张牌(X为其装备区里的牌数)。然后若其装备区里的牌数增加至四张,你失去〖榱椽〗,获得〖佐谏〗,且令其获得一个额外回合。", + dczhengxu: "正序", + dczhengxu_info: + "每回合每项限一次。①当你受到伤害时,若你本回合失去过牌,你可以防止此伤害。②当你失去牌后,若你本回合受到过伤害,你可以摸等量的牌。", + dczuojian: "佐谏", + dczuojian_info: + "出牌阶段结束时,若你于此阶段使用过的牌数不小于体力值,你可以选择一项:1.令装备区牌数多于你的角色各摸一张牌;2.弃置装备区牌数少于你的角色各一张手牌。", + sunlang: "孙狼", + dctingxian: "铤险", + dctingxian_info: + "每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。", + dcbenshi: "奔矢", + dcbenshi_info: + "锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。", + sunhuan: "孙桓", + dcniji: "逆击", + dcniji_info: + "①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,你可以使用一张“逆击”牌,然后弃置所有“逆击”牌。", //dc_fuwan:'新杀伏完', //dc_fuwan_prefix:'新杀', //dc_fuwan_ab:'伏完', - dcmoukui:'谋溃', - dcmoukui_info:'当你使用【杀】指定第一个目标后,你可以选择任意项:1.摸一张牌;2.弃置其中一个目标角色一张牌。若你均选择,当此【杀】被无效后或被抵消后,该角色弃置你一张牌。', - guānning:'关宁', - dcxiuwen:'修文', - dcxiuwen_info:'当你使用牌时,若你未记录此牌牌名,你可以记录之并摸一张牌。', - oldlongsong:'龙诵', - oldlongsong_info:'出牌阶段开始时,你可以将一张手牌交给一名其他角色。然后其须选择其所有的发动时机为出牌阶段内的空闲时间点且你至多能于此阶段发动一次的技能,其于此阶段这些技能失效,你获得这些技能。', - dclongsong:'龙诵', - dclongsong_info:'出牌阶段开始时,你可以将一张红色牌交给一名其他角色。然后其须选择其所有的发动时机包含“出牌阶段”的技能,其于此阶段这些技能失效,你获得这些技能且至多可以发动一次。', - longsong:'龙诵', - longsong_info:'出牌阶段开始时,你可以获得一名其他角色的一张红色牌,然后你本阶段视为拥有其所有的发动时机包含“出牌阶段”的技能。', - dc_mengda:'孟达', - dclibang:'利傍', - dclibang_info:'出牌阶段限一次。你可以弃置一张牌,正面向上获得两名其他角色的各一张牌。然后你判定,若结果与这两张牌的颜色均不同,你交给其中一名角色两张牌或失去1点体力,否则你获得判定牌并视为对其中一名角色使用一张【杀】。', - dcwujie:'无节', - dcwujie_info:'锁定技。①你使用无色牌无任何次数限制且无距离限制。②当其他角色执行杀死你的奖惩而摸牌或弃牌时,取消之。', - dc_jsp_guanyu:'新杀SP关羽', - dc_jsp_guanyu_prefix:'新杀SP', - dcdanji:'单骑', - dcdanji_info:'觉醒技。准备阶段,若你的手牌数大于体力值,你减1点体力上限,将体力回复至体力上限,然后获得〖马术〗和〖怒嗔〗。', - dcnuchen:'怒嗔', - dcnuchen_info:'出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。', - dc_jikang:'新杀嵇康', - dc_jikang_prefix:'新杀', - dcjuexiang:'绝响', - dcjuexiang_info:'当你死亡时,杀死你的角色弃置其装备区内的所有牌并失去1点体力,然后你可以令一名其他角色获得〖残韵〗。', - dccanyun:'残韵', - dccanyun_info:'每名角色限一次。出牌阶段,你可以弃置一张牌并选择一名其他角色,然后若其装备区里的牌数:小于你,其回复1点体力;大于你,其失去1点体力;等于你,其摸一张牌。若你的体力值为1,你摸一张牌。', - mp_liuling:'刘伶', - mpjiusong:'酒颂', - mpjiusong_info:'①你可以将一张锦囊牌当【酒】使用。②当一名角色使用【酒】时,你获得1枚“醉”标记(“醉”数至多为3)。', - mpmaotao:'酕醄', - mpmaotao_info:'当其他角色使用基本牌或普通锦囊牌指定唯一目标时,你可以移去1枚“醉”,令此牌的目标改为随机一名合法角色(无距离限制)。若目标角色与原目标相同且你本回合未以此法获得过牌,你从牌堆中随机获得一张锦囊牌。', - mpbishi:'避世', - mpbishi_info:'锁定技。你不能成为伤害类锦囊牌的目标。', - star_caoren:'星曹仁', - star_caoren_prefix:'星', - starsujun:'肃军', - starsujun_info:'当你使用一张牌时,若你手牌中的基本牌和非基本牌的牌数相等,你可以摸两张牌。', - starlifeng:'砺锋', - starlifeng_info:'你可以将一张本回合未有角色使用过的颜色的手牌当做不计入次数的【杀】或【无懈可击】使用。', - star_yuanshu:'星袁术', - star_yuanshu_prefix:'星', - starcanxi:'残玺', - starcanxi_wangsheng:'妄生', - starcanxi_xiangsi:'向死', - starcanxi_cancel:'向死', - starcanxi_info:'锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。', - starpizhi:'圮秩', - starpizhi_info:'锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)', - starzhonggu:'冢骨', - starzhonggu_info:'主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。', - star_dongzhuo:'星董卓', - star_dongzhuo_prefix:'星', - starweilin:'威临', - starweilin_info:'锁定技。当你于回合内对一名其他角色造成伤害时,若其本回合未受到过伤害,且你本回合使用的牌数大于等于其体力值,则此伤害+1。', - starzhangrong:'掌戎', - starzhangrong_info:'准备阶段,你可以选择令至多X名体力值大于等于你的角色各失去1点体力或令至多X名手牌数大于等于你的角色各弃置一张手牌(X为你的体力值)。若如此做,你摸等同于选择角色数的牌,且本回合结束时,若这些角色中存在本回合未受到过伤害的角色,则你失去1点体力。', - starhaoshou:'豪首', + dcmoukui: "谋溃", + dcmoukui_info: + "当你使用【杀】指定第一个目标后,你可以选择任意项:1.摸一张牌;2.弃置其中一个目标角色一张牌。若你均选择,当此【杀】被无效后或被抵消后,该角色弃置你一张牌。", + guānning: "关宁", + dcxiuwen: "修文", + dcxiuwen_info: "当你使用牌时,若你未记录此牌牌名,你可以记录之并摸一张牌。", + oldlongsong: "龙诵", + oldlongsong_info: + "出牌阶段开始时,你可以将一张手牌交给一名其他角色。然后其须选择其所有的发动时机为出牌阶段内的空闲时间点且你至多能于此阶段发动一次的技能,其于此阶段这些技能失效,你获得这些技能。", + dclongsong: "龙诵", + dclongsong_info: + "出牌阶段开始时,你可以将一张红色牌交给一名其他角色。然后其须选择其所有的发动时机包含“出牌阶段”的技能,其于此阶段这些技能失效,你获得这些技能且至多可以发动一次。", + longsong: "龙诵", + longsong_info: + "出牌阶段开始时,你可以获得一名其他角色的一张红色牌,然后你本阶段视为拥有其所有的发动时机包含“出牌阶段”的技能。", + dc_mengda: "孟达", + dclibang: "利傍", + dclibang_info: + "出牌阶段限一次。你可以弃置一张牌,正面向上获得两名其他角色的各一张牌。然后你判定,若结果与这两张牌的颜色均不同,你交给其中一名角色两张牌或失去1点体力,否则你获得判定牌并视为对其中一名角色使用一张【杀】。", + dcwujie: "无节", + dcwujie_info: + "锁定技。①你使用无色牌无任何次数限制且无距离限制。②当其他角色执行杀死你的奖惩而摸牌或弃牌时,取消之。", + dc_jsp_guanyu: "新杀SP关羽", + dc_jsp_guanyu_prefix: "新杀SP", + dcdanji: "单骑", + dcdanji_info: + "觉醒技。准备阶段,若你的手牌数大于体力值,你减1点体力上限,将体力回复至体力上限,然后获得〖马术〗和〖怒嗔〗。", + dcnuchen: "怒嗔", + dcnuchen_info: + "出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。", + dc_jikang: "新杀嵇康", + dc_jikang_prefix: "新杀", + dcjuexiang: "绝响", + dcjuexiang_info: + "当你死亡时,杀死你的角色弃置其装备区内的所有牌并失去1点体力,然后你可以令一名其他角色获得〖残韵〗。", + dccanyun: "残韵", + dccanyun_info: + "每名角色限一次。出牌阶段,你可以弃置一张牌并选择一名其他角色,然后若其装备区里的牌数:小于你,其回复1点体力;大于你,其失去1点体力;等于你,其摸一张牌。若你的体力值为1,你摸一张牌。", + mp_liuling: "刘伶", + mpjiusong: "酒颂", + mpjiusong_info: + "①你可以将一张锦囊牌当【酒】使用。②当一名角色使用【酒】时,你获得1枚“醉”标记(“醉”数至多为3)。", + mpmaotao: "酕醄", + mpmaotao_info: + "当其他角色使用基本牌或普通锦囊牌指定唯一目标时,你可以移去1枚“醉”,令此牌的目标改为随机一名合法角色(无距离限制)。若目标角色与原目标相同且你本回合未以此法获得过牌,你从牌堆中随机获得一张锦囊牌。", + mpbishi: "避世", + mpbishi_info: "锁定技。你不能成为伤害类锦囊牌的目标。", + star_caoren: "星曹仁", + star_caoren_prefix: "星", + starsujun: "肃军", + starsujun_info: "当你使用一张牌时,若你手牌中的基本牌和非基本牌的牌数相等,你可以摸两张牌。", + starlifeng: "砺锋", + starlifeng_info: + "你可以将一张本回合未有角色使用过的颜色的手牌当做不计入次数的【杀】或【无懈可击】使用。", + star_yuanshu: "星袁术", + star_yuanshu_prefix: "星", + starcanxi: "残玺", + starcanxi_wangsheng: "妄生", + starcanxi_xiangsi: "向死", + starcanxi_cancel: "向死", + starcanxi_info: + "锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。", + starpizhi: "圮秩", + starpizhi_info: + "锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)", + starzhonggu: "冢骨", + starzhonggu_info: + "主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。", + star_dongzhuo: "星董卓", + star_dongzhuo_prefix: "星", + starweilin: "威临", + starweilin_info: + "锁定技。当你于回合内对一名其他角色造成伤害时,若其本回合未受到过伤害,且你本回合使用的牌数大于等于其体力值,则此伤害+1。", + starzhangrong: "掌戎", + starzhangrong_info: + "准备阶段,你可以选择令至多X名体力值大于等于你的角色各失去1点体力或令至多X名手牌数大于等于你的角色各弃置一张手牌(X为你的体力值)。若如此做,你摸等同于选择角色数的牌,且本回合结束时,若这些角色中存在本回合未受到过伤害的角色,则你失去1点体力。", + starhaoshou: "豪首", //starhaoshou_info:'主公技。①其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。②当你处于濒死状态时,其他群势力角色可以将【酒】当作【桃】对你使用。', - starhaoshou_info:'主公技。其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。', - star_yuanshao:'星袁绍', - star_yuanshao_prefix:'星', - starxiaoyan:'硝焰', - starxiaoyan_info:'锁定技,游戏开始时,你对所有其他角色各造成1点火属性伤害,然后这些角色可依次交给你一张牌并回复1点体力。', - starzongshi:'纵势', - starzongshi_info:'出牌阶段,你可以展示一张可展示目标的基本牌或普通锦囊牌,然后你将手牌中所有与此牌花色相同的其他牌当作此牌使用(无距离限制),且此牌至多指定转化牌数的目标。', - starjiaowang:'骄妄', - starjiaowang_info:'锁定技,非首轮游戏开始时,若上一轮没有角色死亡(因〖硝焰〗死亡的角色除外),则你失去1点体力并发动〖硝焰〗。', - staraoshi:'傲势', - staraoshi_info:'主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张手牌,然后你可以发动一次〖纵势〗。', - star_zhangchunhua:'星张春华', - star_zhangchunhua_prefix:'星', - starliangyan:'梁燕', - starliangyan_info:'出牌阶段限一次。你可以选择一名其他角色,你摸/弃置至多两张牌,令其弃置/摸等量的牌。然后若你与其手牌数相同,以此法摸牌的角色跳过其下一个弃牌阶段。', - starminghui:'明慧', - starminghui_info:'一名角色的回合结束时,若你的手牌数:最少,你可以视为使用一张无距离限制的【杀】;最多,你可以将手牌弃置至你手牌数不为最多,然后令一名角色回复1点体力。', - liqueguosi:'李傕郭汜', - xiongsuan:'凶算', - xiongsuan_info:'出牌阶段限一次,你可以弃置一张手牌并对一名角色造成1点伤害,然后你摸三张牌。若该角色不为你,你失去1点体力。', + starhaoshou_info: "主公技。其他群势力角色使用【酒】结算完毕后,其可以令你回复1点体力。", + star_yuanshao: "星袁绍", + star_yuanshao_prefix: "星", + starxiaoyan: "硝焰", + starxiaoyan_info: + "锁定技,游戏开始时,你对所有其他角色各造成1点火属性伤害,然后这些角色可依次交给你一张牌并回复1点体力。", + starzongshi: "纵势", + starzongshi_info: + "出牌阶段,你可以展示一张可展示目标的基本牌或普通锦囊牌,然后你将手牌中所有与此牌花色相同的其他牌当作此牌使用(无距离限制),且此牌至多指定转化牌数的目标。", + starjiaowang: "骄妄", + starjiaowang_info: + "锁定技,非首轮游戏开始时,若上一轮没有角色死亡(因〖硝焰〗死亡的角色除外),则你失去1点体力并发动〖硝焰〗。", + staraoshi: "傲势", + staraoshi_info: + "主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张手牌,然后你可以发动一次〖纵势〗。", + star_zhangchunhua: "星张春华", + star_zhangchunhua_prefix: "星", + starliangyan: "梁燕", + starliangyan_info: + "出牌阶段限一次。你可以选择一名其他角色,你摸/弃置至多两张牌,令其弃置/摸等量的牌。然后若你与其手牌数相同,以此法摸牌的角色跳过其下一个弃牌阶段。", + starminghui: "明慧", + starminghui_info: + "一名角色的回合结束时,若你的手牌数:最少,你可以视为使用一张无距离限制的【杀】;最多,你可以将手牌弃置至你手牌数不为最多,然后令一名角色回复1点体力。", + liqueguosi: "李傕郭汜", + xiongsuan: "凶算", + xiongsuan_info: + "出牌阶段限一次,你可以弃置一张手牌并对一名角色造成1点伤害,然后你摸三张牌。若该角色不为你,你失去1点体力。", - sp_whlw:"文和乱武", - sp_zlzy:"逐鹿中原", - sp_longzhou:"同舟共济", - sp_zizouqi:"自走棋", - sp_sbfm:'上兵伐谋', - sp_shengun:'三国奇人传', - sp_guandu:'官渡之战', - sp_huangjin:'列传·黄巾之乱', - sp_fadong:'列传·诸侯伐董', - sp_xuzhou:'列传·徐州风云', - sp_qihuan:'戚宦之争', - sp_zhongyuan:'列传·中原狼烟', - sp_binglin:'兵临城下', - sp_xiaohu:'列传·虓虎悲歌', - sp_fenghuo:'烽火连天', - sp_danqi:'千里单骑', - sp_star:'将星系列', - mini_qixian:'小程序·竹林七贤', - sp2_waitforsort:'等待分包', + sp_whlw: "文和乱武", + sp_zlzy: "逐鹿中原", + sp_longzhou: "同舟共济", + sp_zizouqi: "自走棋", + sp_sbfm: "上兵伐谋", + sp_shengun: "三国奇人传", + sp_guandu: "官渡之战", + sp_huangjin: "列传·黄巾之乱", + sp_fadong: "列传·诸侯伐董", + sp_xuzhou: "列传·徐州风云", + sp_qihuan: "戚宦之争", + sp_zhongyuan: "列传·中原狼烟", + sp_binglin: "兵临城下", + sp_xiaohu: "列传·虓虎悲歌", + sp_fenghuo: "烽火连天", + sp_danqi: "千里单骑", + sp_star: "将星系列", + mini_qixian: "小程序·竹林七贤", + sp2_waitforsort: "等待分包", + }, + pinyins: { + 卑弥呼: ["Himiko"], }, - pinyins:{ - 卑弥呼:['Himiko'] - } }; }); diff --git a/character/standard.js b/character/standard.js index 3b872c7be..0e8a9e994 100755 --- a/character/standard.js +++ b/character/standard.js @@ -1,2548 +1,2923 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'standard', - connect:true, - characterSort:{ - standard:{ - standard_2008:["caocao","simayi","xiahoudun","zhangliao","xuzhu","guojia","zhenji","liubei","guanyu","zhangfei","zhugeliang","zhaoyun","machao","huangyueying","sunquan","ganning","lvmeng","huanggai","zhouyu","daqiao","luxun","sunshangxiang","huatuo","lvbu","diaochan"], - standard_2013:['old_re_lidian',"huaxiong","re_yuanshu"], - standard_2019:["gongsunzan","xf_yiji"], - standard_2023:["std_panfeng",'ganfuren'], + name: "standard", + connect: true, + characterSort: { + standard: { + standard_2008: [ + "caocao", + "simayi", + "xiahoudun", + "zhangliao", + "xuzhu", + "guojia", + "zhenji", + "liubei", + "guanyu", + "zhangfei", + "zhugeliang", + "zhaoyun", + "machao", + "huangyueying", + "sunquan", + "ganning", + "lvmeng", + "huanggai", + "zhouyu", + "daqiao", + "luxun", + "sunshangxiang", + "huatuo", + "lvbu", + "diaochan", + ], + standard_2013: ["old_re_lidian", "huaxiong", "re_yuanshu"], + standard_2019: ["gongsunzan", "xf_yiji"], + standard_2023: ["std_panfeng", "ganfuren"], }, }, - character:{ - old_re_lidian:['male','wei',3,['xunxun','wangxi'],['die_audio:lidian']], - ganfuren:['female','shu',3,['stdshushen','shenzhi']], - std_panfeng:['male','qun',4,['stdkuangfu']], - caocao:['male','wei',4,['jianxiong','hujia'],['zhu']], - simayi:['male','wei',3,['fankui','guicai']], - xiahoudun:['male','wei',4,['ganglie']], - zhangliao:['male','wei',4,['tuxi']], - xuzhu:['male','wei',4,['luoyi']], - guojia:['male','wei',3,['tiandu','yiji']], - zhenji:['female','wei',3,['luoshen','qingguo']], - liubei:['male','shu',4,['rende','jijiang'],['zhu']], - guanyu:['male','shu',4,['wusheng']], - zhangfei:['male','shu',4,['paoxiao']], - zhugeliang:['male','shu',3,['guanxing','kongcheng']], - zhaoyun:['male','shu',4,['longdan']], - machao:['male','shu',4,['mashu','tieji']], - huangyueying:['female','shu',3,['jizhi','qicai']], - sunquan:['male','wu',4,['zhiheng','jiuyuan'],['zhu']], - ganning:['male','wu',4,['qixi']], - lvmeng:['male','wu',4,['keji']], - huanggai:['male','wu',4,['kurou']], - zhouyu:['male','wu',3,['yingzi','fanjian']], - daqiao:['female','wu',3,['guose','liuli']], - luxun:['male','wu',3,['qianxun','lianying']], - sunshangxiang:['female','wu',3,['xiaoji','jieyin']], - huatuo:['male','qun',3,['qingnang','jijiu']], - lvbu:['male','qun',4,['wushuang']], - diaochan:['female','qun',3,['lijian','biyue']], - huaxiong:['male','qun',6,['yaowu']], - gongsunzan:['male','qun',4,['reyicong']], + character: { + old_re_lidian: ["male", "wei", 3, ["xunxun", "wangxi"], ["die_audio:lidian"]], + ganfuren: ["female", "shu", 3, ["stdshushen", "shenzhi"]], + std_panfeng: ["male", "qun", 4, ["stdkuangfu"]], + caocao: ["male", "wei", 4, ["jianxiong", "hujia"], ["zhu"]], + simayi: ["male", "wei", 3, ["fankui", "guicai"]], + xiahoudun: ["male", "wei", 4, ["ganglie"]], + zhangliao: ["male", "wei", 4, ["tuxi"]], + xuzhu: ["male", "wei", 4, ["luoyi"]], + guojia: ["male", "wei", 3, ["tiandu", "yiji"]], + zhenji: ["female", "wei", 3, ["luoshen", "qingguo"]], + liubei: ["male", "shu", 4, ["rende", "jijiang"], ["zhu"]], + guanyu: ["male", "shu", 4, ["wusheng"]], + zhangfei: ["male", "shu", 4, ["paoxiao"]], + zhugeliang: ["male", "shu", 3, ["guanxing", "kongcheng"]], + zhaoyun: ["male", "shu", 4, ["longdan"]], + machao: ["male", "shu", 4, ["mashu", "tieji"]], + huangyueying: ["female", "shu", 3, ["jizhi", "qicai"]], + sunquan: ["male", "wu", 4, ["zhiheng", "jiuyuan"], ["zhu"]], + ganning: ["male", "wu", 4, ["qixi"]], + lvmeng: ["male", "wu", 4, ["keji"]], + huanggai: ["male", "wu", 4, ["kurou"]], + zhouyu: ["male", "wu", 3, ["yingzi", "fanjian"]], + daqiao: ["female", "wu", 3, ["guose", "liuli"]], + luxun: ["male", "wu", 3, ["qianxun", "lianying"]], + sunshangxiang: ["female", "wu", 3, ["xiaoji", "jieyin"]], + huatuo: ["male", "qun", 3, ["qingnang", "jijiu"]], + lvbu: ["male", "qun", 4, ["wushuang"]], + diaochan: ["female", "qun", 3, ["lijian", "biyue"]], + huaxiong: ["male", "qun", 6, ["yaowu"]], + gongsunzan: ["male", "qun", 4, ["reyicong"]], - xf_yiji:["male","shu",3,["xinfu_jijie","xinfu_jiyuan"],[]], - re_yuanshu:['male','qun',4,['rewangzun','retongji']], + xf_yiji: ["male", "shu", 3, ["xinfu_jijie", "xinfu_jiyuan"], []], + re_yuanshu: ["male", "qun", 4, ["rewangzun", "retongji"]], }, - characterIntro:{ - liubei:'先主姓刘,讳备,字玄德,涿郡涿县人,汉景帝子中山靖王胜之后也。以仁德治天下。', - guanyu:'字云长,本字长生,并州河东解州人。五虎上将之首,爵至汉寿亭侯,谥曰“壮缪侯”。被奉为“关圣帝君”,崇为“武圣”。', - zhangfei:'字翼德,涿郡人,燕颔虎须,豹头环眼。有诗云:“长坂坡头杀气生,横枪立马眼圆睁。一声好似轰雷震,独退曹家百万兵”。', - zhugeliang:'字孔明,号卧龙,琅琊阳都人,蜀汉丞相。在世时被封为武乡侯,谥曰忠武侯。著有《出师表》、《诫子书》等。怀不世之才,以空城戏司马,能观星象而通鬼神。', - zhaoyun:'字子龙,常山真定人。身长八尺,姿颜雄伟。长坂坡单骑救阿斗,先主云:“子龙一身都是胆也。”', - machao:'字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。', - huangyueying:'荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。', - sunquan:'吴大帝,字仲谋,吴郡富春县人。统领吴与蜀魏三足鼎立,制衡天下。', - ganning:'字兴霸,巴郡临江人,祖籍荆州南阳郡。为人勇猛刚强,忠心耿耿,勇往无前。曾带兵百人于二更奇袭曹营,大挫其锐气。', - lvmeng:'字子明,汝南富陂人。陈寿评曰:“吕蒙勇而有谋断,识军计,谲郝普,擒关羽,最其妙者。初虽轻果妄杀,终于克己,有国士之量,岂徒武将而已乎!”', - huanggai:'字公覆,零陵郡泉陵县人。官至偏将军、武陵太守。以苦肉计骗曹孟德,亲往诈降,火烧战船,重创敌军。', - zhouyu:'字公瑾,庐江舒县人,任东吴三军大都督,雄姿英发,人称“美周郎”。赤壁之战前,巧用反间计杀了精通水战的叛将蔡瑁、张允。', - daqiao:'庐江皖县人,为乔公长女,孙策之妻,小乔之姊。与小乔并称为“江东二乔”,容貌国色流离。', - luxun:'本名陆议,字伯言,吴郡吴县人。历任东吴大都督、丞相。吴大帝孙权兄孙策之婿,世代为江东大族。以谦逊之书麻痹关羽,夺取荆州,又有火烧连营大破蜀军。', - sunshangxiang:'孙夫人,乃孙权之妹。刘备定荆州,孙权进妹与其结姻,重固盟好。孙夫人才捷刚猛,有诸兄之风。后人为其立庙,号曰“枭姬庙”。', - caocao:'魏武帝曹操,字孟德,小名阿瞒、吉利,沛国谯人。精兵法,善诗歌,乃治世之能臣,乱世之奸雄也。', - simayi:'晋宣帝,字仲达,河内温人。曾任职过曹魏的大都督,太尉,太傅。少有奇节,聪明多大略,博学洽闻,伏膺儒教,世之鬼才也。', - xiahoudun:'字元让,沛国谯人。有拔矢啖睛之勇,性格勇猛刚烈。', - zhangliao:'字文远,魏雁门马邑人。官至前将军、征东将军、晋阳侯。武功高强,又谋略过人,多次建立奇功,以800人突袭孙权十万大军,皆望风披靡。', - xuzhu:'字仲康,谯国谯县人。和典韦一同统率着曹操的亲卫队“虎卫军”。因为他十分勇猛,所以有“虎痴”的绰号。曾有裸衣斗马超之举。', - guojia:'字奉孝,颍川阳翟人,官至军师祭酒。惜天妒英才,英年早逝。有诗云:“良计环环不遗策,每临制变满座惊”。', - zhenji:'中山无极人,别称甄洛或甄宓,庙号文昭甄皇后。魏文帝曹丕的正室。懂诗文,有倾国倾城之貌,《洛神赋》即是曹植为她所作。', - huatuo:'字元化,一名旉,沛国谯人,“建安三神医”之一。集平生之所得著《青囊经》,现已失传。', - lvbu:'字奉先,五原郡九原县人。三国第一猛将,曾独力战刘关张三人,其武力世之无双。时人语曰:“人中有吕布,马中有赤兔。”', - diaochan:'中国古代四大美女之一,有闭月羞花之貌。司徒王允之义女,由王允授意施行连环计,离间董卓、吕布,借布手除卓。后貂蝉成为吕布的妾。', - huaxiong:'董卓旗下名将,自荐抵抗山东地区反对董卓的诸侯联军于汜水关前,他先后斩杀济北相鲍信之弟鲍忠和孙坚部将祖茂、以及袁术部将俞涉和韩馥手下潘凤等人,最后关东联军派出关羽与之一对一决斗而被杀。', + characterIntro: { + liubei: "先主姓刘,讳备,字玄德,涿郡涿县人,汉景帝子中山靖王胜之后也。以仁德治天下。", + guanyu: "字云长,本字长生,并州河东解州人。五虎上将之首,爵至汉寿亭侯,谥曰“壮缪侯”。被奉为“关圣帝君”,崇为“武圣”。", + zhangfei: + "字翼德,涿郡人,燕颔虎须,豹头环眼。有诗云:“长坂坡头杀气生,横枪立马眼圆睁。一声好似轰雷震,独退曹家百万兵”。", + zhugeliang: + "字孔明,号卧龙,琅琊阳都人,蜀汉丞相。在世时被封为武乡侯,谥曰忠武侯。著有《出师表》、《诫子书》等。怀不世之才,以空城戏司马,能观星象而通鬼神。", + zhaoyun: "字子龙,常山真定人。身长八尺,姿颜雄伟。长坂坡单骑救阿斗,先主云:“子龙一身都是胆也。”", + machao: "字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。", + huangyueying: + "荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。", + sunquan: "吴大帝,字仲谋,吴郡富春县人。统领吴与蜀魏三足鼎立,制衡天下。", + ganning: + "字兴霸,巴郡临江人,祖籍荆州南阳郡。为人勇猛刚强,忠心耿耿,勇往无前。曾带兵百人于二更奇袭曹营,大挫其锐气。", + lvmeng: "字子明,汝南富陂人。陈寿评曰:“吕蒙勇而有谋断,识军计,谲郝普,擒关羽,最其妙者。初虽轻果妄杀,终于克己,有国士之量,岂徒武将而已乎!”", + huanggai: + "字公覆,零陵郡泉陵县人。官至偏将军、武陵太守。以苦肉计骗曹孟德,亲往诈降,火烧战船,重创敌军。", + zhouyu: "字公瑾,庐江舒县人,任东吴三军大都督,雄姿英发,人称“美周郎”。赤壁之战前,巧用反间计杀了精通水战的叛将蔡瑁、张允。", + daqiao: "庐江皖县人,为乔公长女,孙策之妻,小乔之姊。与小乔并称为“江东二乔”,容貌国色流离。", + luxun: "本名陆议,字伯言,吴郡吴县人。历任东吴大都督、丞相。吴大帝孙权兄孙策之婿,世代为江东大族。以谦逊之书麻痹关羽,夺取荆州,又有火烧连营大破蜀军。", + sunshangxiang: + "孙夫人,乃孙权之妹。刘备定荆州,孙权进妹与其结姻,重固盟好。孙夫人才捷刚猛,有诸兄之风。后人为其立庙,号曰“枭姬庙”。", + caocao: "魏武帝曹操,字孟德,小名阿瞒、吉利,沛国谯人。精兵法,善诗歌,乃治世之能臣,乱世之奸雄也。", + simayi: "晋宣帝,字仲达,河内温人。曾任职过曹魏的大都督,太尉,太傅。少有奇节,聪明多大略,博学洽闻,伏膺儒教,世之鬼才也。", + xiahoudun: "字元让,沛国谯人。有拔矢啖睛之勇,性格勇猛刚烈。", + zhangliao: + "字文远,魏雁门马邑人。官至前将军、征东将军、晋阳侯。武功高强,又谋略过人,多次建立奇功,以800人突袭孙权十万大军,皆望风披靡。", + xuzhu: "字仲康,谯国谯县人。和典韦一同统率着曹操的亲卫队“虎卫军”。因为他十分勇猛,所以有“虎痴”的绰号。曾有裸衣斗马超之举。", + guojia: "字奉孝,颍川阳翟人,官至军师祭酒。惜天妒英才,英年早逝。有诗云:“良计环环不遗策,每临制变满座惊”。", + zhenji: "中山无极人,别称甄洛或甄宓,庙号文昭甄皇后。魏文帝曹丕的正室。懂诗文,有倾国倾城之貌,《洛神赋》即是曹植为她所作。", + huatuo: "字元化,一名旉,沛国谯人,“建安三神医”之一。集平生之所得著《青囊经》,现已失传。", + lvbu: "字奉先,五原郡九原县人。三国第一猛将,曾独力战刘关张三人,其武力世之无双。时人语曰:“人中有吕布,马中有赤兔。”", + diaochan: + "中国古代四大美女之一,有闭月羞花之貌。司徒王允之义女,由王允授意施行连环计,离间董卓、吕布,借布手除卓。后貂蝉成为吕布的妾。", + huaxiong: + "董卓旗下名将,自荐抵抗山东地区反对董卓的诸侯联军于汜水关前,他先后斩杀济北相鲍信之弟鲍忠和孙坚部将祖茂、以及袁术部将俞涉和韩馥手下潘凤等人,最后关东联军派出关羽与之一对一决斗而被杀。", - xf_yiji:"伊籍,字机伯,生卒年不详,兖州山阳郡(今山东金乡县)人,三国时期蜀汉官员。年少时依附于同乡刘表。刘备落难到荆州时,伊籍时常拜访,托请刘备照顾。建安十三年(208年),刘表病死,伊籍便转投刘备,一起渡江南下。建安十六年(211年),刘备入蜀帮助刘璋,伊籍亦有跟随。随后刘备和刘璋双方决裂。建安十九年(214年),刘备平定益州,任命伊籍为左将军从事中郎,其待遇次于简雍、孙乾等。后升任昭文将军,并与诸葛亮、法正、刘巴、李严共同编制《蜀科》。", + xf_yiji: + "伊籍,字机伯,生卒年不详,兖州山阳郡(今山东金乡县)人,三国时期蜀汉官员。年少时依附于同乡刘表。刘备落难到荆州时,伊籍时常拜访,托请刘备照顾。建安十三年(208年),刘表病死,伊籍便转投刘备,一起渡江南下。建安十六年(211年),刘备入蜀帮助刘璋,伊籍亦有跟随。随后刘备和刘璋双方决裂。建安十九年(214年),刘备平定益州,任命伊籍为左将军从事中郎,其待遇次于简雍、孙乾等。后升任昭文将军,并与诸葛亮、法正、刘巴、李严共同编制《蜀科》。", }, - perfectPair:{ - xiahoudun:['xiahouyuan'], - zhenji:['caopi'], - caocao:['xuzhu','dianwei','bianfuren'], - huangzhong:['weiyan'], - zhugeliang:['jiangwei','jiangfei','huangyueying'], - liubei:['guanyu','zhangfei','ganfuren'], - zhaoyun:['liushan'], - daqiao:['xiaoqiao'], - zhouyu:['huanggai','xiaoqiao','zhouyi'], - sunquan:['zhoutai'], - lvbu:['diaochan','lvlingqi'], - machao:['madai','mayunlu','yangwan'], - zhangliao:['zangba'], - ganning:['lingtong','xf_sufei'], - guanyu:['zhangfei','liaohua'], + perfectPair: { + xiahoudun: ["xiahouyuan"], + zhenji: ["caopi"], + caocao: ["xuzhu", "dianwei", "bianfuren"], + huangzhong: ["weiyan"], + zhugeliang: ["jiangwei", "jiangfei", "huangyueying"], + liubei: ["guanyu", "zhangfei", "ganfuren"], + zhaoyun: ["liushan"], + daqiao: ["xiaoqiao"], + zhouyu: ["huanggai", "xiaoqiao", "zhouyi"], + sunquan: ["zhoutai"], + lvbu: ["diaochan", "lvlingqi"], + machao: ["madai", "mayunlu", "yangwan"], + zhangliao: ["zangba"], + ganning: ["lingtong", "xf_sufei"], + guanyu: ["zhangfei", "liaohua"], }, - skill:{ + skill: { //标准版甘夫人 - stdshushen:{ - audio:'shushen', - trigger:{player:'recoverEnd'}, - getIndex(event){ - return event.num||1; + stdshushen: { + audio: "shushen", + trigger: { player: "recoverEnd" }, + getIndex(event) { + return event.num || 1; }, - async cost(event,trigger,player){ - event.result = await player.chooseTarget(get.prompt2('stdshushen'),lib.filter.notMe) - .set('ai',target=>get.attitude(_status.event.player,target)).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("stdshushen"), lib.filter.notMe) + .set("ai", (target) => get.attitude(_status.event.player, target)) + .forResult(); }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = event.targets[0]; - await target.draw(target.countCards('h') > 0 ? 1 : 2); + await target.draw(target.countCards("h") > 0 ? 1 : 2); }, - ai:{threaten:0.8,expose:0.1}, + ai: { threaten: 0.8, expose: 0.1 }, }, - stdkuangfu:{ - audio:'xinkuangfu', - trigger:{source:'damageSource'}, - forced:true, - usable:1, - filter(event,player){ - return player.isPhaseUsing()&&event.card&&event.card.name=='sha'&&event.player!=player&&event.player.isIn(); + stdkuangfu: { + audio: "xinkuangfu", + trigger: { source: "damageSource" }, + forced: true, + usable: 1, + filter(event, player) { + return ( + player.isPhaseUsing() && + event.card && + event.card.name == "sha" && + event.player != player && + event.player.isIn() + ); }, - async content(event,trigger,player){ - if(trigger.player.hpplayer.hp; + ai: { + halfneg: true, }, - logTarget:'player', - async content(event,trigger,player){ + }, + rewangzun: { + trigger: { global: "phaseZhunbeiBegin" }, + forced: true, + audio: "wangzun", + filter(event, player) { + return event.player.hp > player.hp; + }, + logTarget: "player", + async content(event, trigger, player) { player.draw(); - let zhu=false; - const target=trigger.player; - switch(get.mode()){ - case 'identity':{ - zhu=target.isZhu; + let zhu = false; + const target = trigger.player; + switch (get.mode()) { + case "identity": { + zhu = target.isZhu; break; } - case 'guozhan':{ - zhu=get.is.jun(target); + case "guozhan": { + zhu = get.is.jun(target); break; } - case 'versus':{ - zhu=target.identity=='zhu'; + case "versus": { + zhu = target.identity == "zhu"; break; } - case 'doudizhu':{ - zhu=target==game.zhu; + case "doudizhu": { + zhu = target == game.zhu; break; } } - if(zhu){ + if (zhu) { player.draw(); - target.addTempSkill('rewangzun2'); - target.addMark('rewangzun2',1,false); + target.addTempSkill("rewangzun2"); + target.addMark("rewangzun2", 1, false); } }, }, - rewangzun2:{ - onremove:true, - mod:{ - maxHandcard(player,num){ - return num-player.countMark('rewangzun2'); + rewangzun2: { + onremove: true, + mod: { + maxHandcard(player, num) { + return num - player.countMark("rewangzun2"); }, }, - intro:{content:'手牌上限-#'}, + intro: { content: "手牌上限-#" }, }, - retongji:{ - trigger:{global:'useCardToTarget'}, - logTarget:'target', - audio:'tongji', - filter(event,player){ - return event.card.name=='sha'&&event.player!=player&&!event.targets.includes(player)&& - event.target.inRange(player)&&event.target.countCards('he')>0; + retongji: { + trigger: { global: "useCardToTarget" }, + logTarget: "target", + audio: "tongji", + filter(event, player) { + return ( + event.card.name == "sha" && + event.player != player && + !event.targets.includes(player) && + event.target.inRange(player) && + event.target.countCards("he") > 0 + ); }, - async cost(event, trigger, player){ - const {result} = await trigger.target.chooseCard('he', '是否对'+get.translation(player)+'发动【同疾】?', - '弃置一张牌,将'+get.translation(trigger.card)+'转移给'+get.translation(player), lib.filter.cardDiscardable) - .set('ai',card=>{ - if(!_status.event.check) return -1; - return get.unuseful(card)+9; - }) - .set('check',(()=>{ - if(trigger.target.countCards('h','shan')){ - return -get.attitude(trigger.target,player); - } - if(get.attitude(trigger.target,player)<5){ - return 6-get.attitude(trigger.target,player); - } - if(trigger.target.hp==1&&player.countCards('h','shan')==0){ - return 10-get.attitude(trigger.target,player); - } - if(trigger.target.hp==2&&player.countCards('h','shan')==0){ - return 8-get.attitude(trigger.target,player); - } - return -1; - })()>0); - if(result.bool){ + async cost(event, trigger, player) { + const { result } = await trigger.target + .chooseCard( + "he", + "是否对" + get.translation(player) + "发动【同疾】?", + "弃置一张牌,将" + + get.translation(trigger.card) + + "转移给" + + get.translation(player), + lib.filter.cardDiscardable + ) + .set("ai", (card) => { + if (!_status.event.check) return -1; + return get.unuseful(card) + 9; + }) + .set( + "check", + (() => { + if (trigger.target.countCards("h", "shan")) { + return -get.attitude(trigger.target, player); + } + if (get.attitude(trigger.target, player) < 5) { + return 6 - get.attitude(trigger.target, player); + } + if (trigger.target.hp == 1 && player.countCards("h", "shan") == 0) { + return 10 - get.attitude(trigger.target, player); + } + if (trigger.target.hp == 2 && player.countCards("h", "shan") == 0) { + return 8 - get.attitude(trigger.target, player); + } + return -1; + })() > 0 + ); + if (result.bool) { event.result = { - bool:true, - cost_data:{ - cards: result.cards - } + bool: true, + cost_data: { + cards: result.cards, + }, }; } }, - async content(event,trigger,player){ + async content(event, trigger, player) { trigger.target.discard(event.cost_data.cards); - const evt=trigger.getParent(); + const evt = trigger.getParent(); evt.triggeredTargets2.remove(trigger.target); evt.targets.remove(trigger.target); evt.targets.push(player); }, }, - hujia:{ - audio:2, - audioname:['re_caocao'], - unique:true, - zhuSkill:true, - trigger:{player:['chooseToRespondBefore','chooseToUseBefore']}, - filter(event,player){ - if(event.responded) return false; - if(player.storage.hujiaing) return false; - if(!player.hasZhuSkill('hujia')) return false; - if(!event.filterCard({name:'shan',isCard:true},player,event)) return false; - return game.hasPlayer(current=>current!=player&¤t.group=='wei'); + hujia: { + audio: 2, + audioname: ["re_caocao"], + unique: true, + zhuSkill: true, + trigger: { player: ["chooseToRespondBefore", "chooseToUseBefore"] }, + filter(event, player) { + if (event.responded) return false; + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("hujia")) return false; + if (!event.filterCard({ name: "shan", isCard: true }, player, event)) return false; + return game.hasPlayer((current) => current != player && current.group == "wei"); }, - check(event,player){ - if(get.damageEffect(player,event.player,player)>=0) return false; + check(event, player) { + if (get.damageEffect(player, event.player, player) >= 0) return false; return true; }, - async content(event,trigger,player){ - while(true){ + async content(event, trigger, player) { + while (true) { let bool; - if(!event.current) event.current=player.next; - if(event.current==player) return; - else if(event.current.group=='wei'){ - if((event.current==game.me&&!_status.auto)||( - get.attitude(event.current,player)>2)|| - event.current.isOnline()){ - player.storage.hujiaing=true; - const next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张闪?',{name:'shan'}); - next.set('ai',()=>{ - const event=_status.event; - return (get.attitude(event.player,event.source)-2); + if (!event.current) event.current = player.next; + if (event.current == player) return; + else if (event.current.group == "wei") { + if ( + (event.current == game.me && !_status.auto) || + get.attitude(event.current, player) > 2 || + event.current.isOnline() + ) { + player.storage.hujiaing = true; + const next = event.current.chooseToRespond( + "是否替" + get.translation(player) + "打出一张闪?", + { name: "shan" } + ); + next.set("ai", () => { + const event = _status.event; + return get.attitude(event.player, event.source) - 2; }); - next.set('skillwarn','替'+get.translation(player)+'打出一张闪'); - next.autochoose=lib.filter.autoRespondShan; - next.set('source',player); - bool=(await next).result.bool; + next.set("skillwarn", "替" + get.translation(player) + "打出一张闪"); + next.autochoose = lib.filter.autoRespondShan; + next.set("source", player); + bool = (await next).result.bool; } } - player.storage.hujiaing=false; - if(bool){ - trigger.result={bool:true,card:{name:'shan',isCard:true}}; - trigger.responded=true; - trigger.animate=false; - if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ - event.current.ai.shown+=0.3; - if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + player.storage.hujiaing = false; + if (bool) { + trigger.result = { bool: true, card: { name: "shan", isCard: true } }; + trigger.responded = true; + trigger.animate = false; + if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; } return; - } - else{ - event.current=event.current.next; + } else { + event.current = event.current.next; } } }, - ai:{ - respondShan:true, - skillTagFilter(player){ - if(player.storage.hujiaing) return false; - if(!player.hasZhuSkill('hujia')) return false; - return game.hasPlayer(current=>current!=player&¤t.group=='wei'); + ai: { + respondShan: true, + skillTagFilter(player) { + if (player.storage.hujiaing) return false; + if (!player.hasZhuSkill("hujia")) return false; + return game.hasPlayer((current) => current != player && current.group == "wei"); }, }, }, - jianxiong:{ - audio:2, - preHidden:true, - trigger:{player:'damageEnd'}, - filter(event,player){ - return get.itemtype(event.cards)=='cards'&&get.position(event.cards[0],true)=='o'; + jianxiong: { + audio: 2, + preHidden: true, + trigger: { player: "damageEnd" }, + filter(event, player) { + return get.itemtype(event.cards) == "cards" && get.position(event.cards[0], true) == "o"; }, - async content(event,trigger,player){ - player.gain(trigger.cards,'gain2'); + async content(event, trigger, player) { + player.gain(trigger.cards, "gain2"); + }, + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.tag(card, "damage")) return [1, 0.55]; + }, + }, }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.tag(card,'damage')) return [1,0.55]; - } - } - } }, - fankui:{ - audio:2, - trigger:{player:'damageEnd'}, - logTarget:'source', - preHidden:true, - filter(event,player){ - return event.source&&event.source.countGainableCards(player,event.source!=player?'he':'e')>0&&event.num>0; + fankui: { + audio: 2, + trigger: { player: "damageEnd" }, + logTarget: "source", + preHidden: true, + filter(event, player) { + return ( + event.source && + event.source.countGainableCards(player, event.source != player ? "he" : "e") > 0 && + event.num > 0 + ); }, - async content(event,trigger,player){ - player.gainPlayerCard(true,trigger.source,trigger.source!=player?'he':'e'); + async content(event, trigger, player) { + player.gainPlayerCard(true, trigger.source, trigger.source != player ? "he" : "e"); }, - ai:{ - maixie_defend:true, - effect:{ - target(card,player,target){ - if(player.countCards('he')>1&&get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; - if(get.attitude(target,player)<0) return [1,1]; + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.countCards("he") > 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (get.attitude(target, player) < 0) return [1, 1]; } - } - } - } - }, - guicai:{ - audio:2, - trigger:{global:'judge'}, - preHidden:true, - filter(event,player){ - return player.countCards(get.mode()=='guozhan'?'hes':'hs')>0; + }, + }, }, - async cost(event, trigger, player){ - const {result:{bool,cards}}=await player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('guicai'),get.mode()=='guozhan'?'hes':'hs',card=>{ - const player=_status.event.player; - const mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - const mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',card=>{ - const trigger=_status.event.getTrigger(); - const player=_status.event.player; - const judging=_status.event.judging; - const result=trigger.judge(card)-trigger.judge(judging); - const attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result-get.value(card)/2; - } - else{ - return -result-get.value(card)/2; - } - }).set('judging',trigger.player.judging[0]).setHiddenSkill('guicai'); - if(bool) event.result = {bool,cost_data:{cards}} + }, + guicai: { + audio: 2, + trigger: { global: "judge" }, + preHidden: true, + filter(event, player) { + return player.countCards(get.mode() == "guozhan" ? "hes" : "hs") > 0; + }, + async cost(event, trigger, player) { + const { + result: { bool, cards }, + } = await player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("guicai"), + get.mode() == "guozhan" ? "hes" : "hs", + (card) => { + const player = _status.event.player; + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + const mod = game.checkMod( + card, + player, + "unchanged", + "cardRespondable", + player + ); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", (card) => { + const trigger = _status.event.getTrigger(); + const player = _status.event.player; + const judging = _status.event.judging; + const result = trigger.judge(card) - trigger.judge(judging); + const attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result - get.value(card) / 2; + } else { + return -result - get.value(card) / 2; + } + }) + .set("judging", trigger.player.judging[0]) + .setHiddenSkill("guicai"); + if (bool) event.result = { bool, cost_data: { cards } }; }, //技能的logSkill跟着打出牌走 不进行logSkill - popup:false, - async content(event,trigger,player){ + popup: false, + async content(event, trigger, player) { const chooseCardResultCards = event.cost_data.cards; - player.respond(chooseCardResultCards,'guicai','highlight','noOrdering'); - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + player.respond(chooseCardResultCards, "guicai", "highlight", "noOrdering"); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=chooseCardResultCards[0]; + trigger.player.judging[0] = chooseCardResultCards[0]; trigger.orderingCards.addArray(chooseCardResultCards); - game.log(trigger.player,'的判定牌改为',chooseCardResultCards[0]); + game.log(trigger.player, "的判定牌改为", chooseCardResultCards[0]); game.asyncDelay(2); }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, }, - ganglie:{ - audio:2, - trigger:{player:'damageEnd'}, - filter(event,player){ - return (event.source!=undefined); + ganglie: { + audio: 2, + trigger: { player: "damageEnd" }, + filter(event, player) { + return event.source != undefined; }, - check(event,player){ - return (get.attitude(player,event.source)<=0); + check(event, player) { + return get.attitude(player, event.source) <= 0; }, - logTarget:'source', - async content(event,trigger,player){ - const judgeEvent=player.judge(card=>{ - if(get.suit(card)=='heart') return -2; + logTarget: "source", + async content(event, trigger, player) { + const judgeEvent = player.judge((card) => { + if (get.suit(card) == "heart") return -2; return 2; }); - judgeEvent.judge2=result=>result.bool; - const {result:{judge}}=await judgeEvent; - if(judge<2) return; - const {result:{bool}}=await trigger.source.chooseToDiscard(2) - .set('ai',card=>{ - if(card.name=='tao') return -10; - if(card.name=='jiu'&&_status.event.player.hp==1) return -10; - return get.unuseful(card)+2.5*(5-get.owner(card).hp); + judgeEvent.judge2 = (result) => result.bool; + const { + result: { judge }, + } = await judgeEvent; + if (judge < 2) return; + const { + result: { bool }, + } = await trigger.source.chooseToDiscard(2).set("ai", (card) => { + if (card.name == "tao") return -10; + if (card.name == "jiu" && _status.event.player.hp == 1) return -10; + return get.unuseful(card) + 2.5 * (5 - get.owner(card).hp); }); - if(bool==false){ + if (bool == false) { trigger.source.damage(); } }, - ai:{ - maixie_defend:true, - effect:{ - target(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; return 0.8; // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; - } - } - } + }, + }, + }, }, - ganglie_three:{ - audio:'ganglie', - trigger:{player:'damageEnd'}, - async cost(event, trigger, player){ - const {result} = await player.chooseTarget(get.prompt2('ganglie_three'),(card,player,target)=>{ - return target.isEnemyOf(player); - }).set('ai',target=>{ - return -get.attitude(_status.event.player,target)/Math.sqrt(1+target.countCards('h')); - }); + ganglie_three: { + audio: "ganglie", + trigger: { player: "damageEnd" }, + async cost(event, trigger, player) { + const { result } = await player + .chooseTarget(get.prompt2("ganglie_three"), (card, player, target) => { + return target.isEnemyOf(player); + }) + .set("ai", (target) => { + return ( + -get.attitude(_status.event.player, target) / + Math.sqrt(1 + target.countCards("h")) + ); + }); event.result = result; }, - async content(event, trigger, player){ + async content(event, trigger, player) { event.target = event.targets[0]; - player.logSkill('ganglie_three', event.target); - const judgeEvent=player.judge(card=>{ - if(get.suit(card)=='heart') return -2; + player.logSkill("ganglie_three", event.target); + const judgeEvent = player.judge((card) => { + if (get.suit(card) == "heart") return -2; return 2; }); - judgeEvent.judge2 = (result => result.bool); - const {result:{judge}} = await judgeEvent; + judgeEvent.judge2 = (result) => result.bool; + const { + result: { judge }, + } = await judgeEvent; if (judge < 2) return; - const {result:{bool:chooseToDiscardResultBool}} = await event.target.chooseToDiscard(2).set('ai',card=>{ - if (card.name=='tao') return -10; - if (card.name=='jiu' && _status.event.player.hp==1) return -10; - return get.unuseful(card)+2.5*(5-get.owner(card).hp); + const { + result: { bool: chooseToDiscardResultBool }, + } = await event.target.chooseToDiscard(2).set("ai", (card) => { + if (card.name == "tao") return -10; + if (card.name == "jiu" && _status.event.player.hp == 1) return -10; + return get.unuseful(card) + 2.5 * (5 - get.owner(card).hp); }); if (chooseToDiscardResultBool === false) { event.target.damage(); } }, - ai:{ - maixie_defend:true, - effect:{ - target(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; + ai: { + maixie_defend: true, + effect: { + target(card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; return 0.8; // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; - } - } - } + }, + }, + }, }, - tuxi:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter(event,player){ + tuxi: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter(event, player) { return !event.numFixed; }, - async cost(event, trigger, player){ - let num = game.countPlayer(current => current != player && current.countCards('h') && get.attitude(player,current) <= 0); - let check = (num >= 2); - const {result} = await player.chooseTarget(get.prompt('tuxi'), '获得其他一至两名角色的各一张手牌', [1,2], (card, player, target) => { - return target.countCards('h') > 0 && player != target; - }, target => { - if (!_status.event.aicheck) return 0; - const att=get.attitude(_status.event.player, target); - if (target.hasSkill('tuntian')) return att / 10; - return 1 - att; - }).set('aicheck', check); + async cost(event, trigger, player) { + let num = game.countPlayer( + (current) => + current != player && current.countCards("h") && get.attitude(player, current) <= 0 + ); + let check = num >= 2; + const { result } = await player + .chooseTarget( + get.prompt("tuxi"), + "获得其他一至两名角色的各一张手牌", + [1, 2], + (card, player, target) => { + return target.countCards("h") > 0 && player != target; + }, + (target) => { + if (!_status.event.aicheck) return 0; + const att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ) + .set("aicheck", check); event.result = result; }, - async content(event, trigger, player){ + async content(event, trigger, player) { player.gainMultiple(event.targets); trigger.changeToZero(); game.asyncDelay(); }, - ai:{ - threaten:2, - expose:0.3 - } + ai: { + threaten: 2, + expose: 0.3, + }, }, - luoyi:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - check(event,player){ - if(player.skipList.includes('phaseUse')||player.countCards('h')<3) return false; - if(!player.hasSha()) return false; - return game.hasPlayer(current=>get.attitude(player,current)<0&&player.canUse('sha',current)); + luoyi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + check(event, player) { + if (player.skipList.includes("phaseUse") || player.countCards("h") < 3) return false; + if (!player.hasSha()) return false; + return game.hasPlayer( + (current) => get.attitude(player, current) < 0 && player.canUse("sha", current) + ); }, - preHidden:true, - filter(event,player){ - return !event.numFixed&&event.num>0; + preHidden: true, + filter(event, player) { + return !event.numFixed && event.num > 0; }, - async content(event,trigger,player){ - player.addTempSkill('luoyi2','phaseJieshuBegin'); + async content(event, trigger, player) { + player.addTempSkill("luoyi2", "phaseJieshuBegin"); trigger.num--; - } - }, - luoyi2:{ - trigger:{source:'damageBegin1'}, - filter(event){ - return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.notLink(); }, - forced:true, - async content(event,trigger,player){ + }, + luoyi2: { + trigger: { source: "damageBegin1" }, + filter(event) { + return ( + event.card && + (event.card.name == "sha" || event.card.name == "juedou") && + event.notLink() + ); + }, + forced: true, + async content(event, trigger, player) { trigger.num++; }, - ai:{ - damageBonus:true - } + ai: { + damageBonus: true, + }, }, - tiandu:{ - audio:2, - audioname:['re_guojia','xizhicai','gz_nagisa'], - trigger:{player:'judgeEnd'}, - preHidden:true, - frequent(event){ + tiandu: { + audio: 2, + audioname: ["re_guojia", "xizhicai", "gz_nagisa"], + trigger: { player: "judgeEnd" }, + preHidden: true, + frequent(event) { //if(get.mode()=='guozhan') return false; - return event.result.card.name!=='du'; + return event.result.card.name !== "du"; }, - check(event){ - return event.result.card.name!=='du'; + check(event) { + return event.result.card.name !== "du"; }, - filter(event,player){ - return get.position(event.result.card,true)=='o'; + filter(event, player) { + return get.position(event.result.card, true) == "o"; + }, + async content(event, trigger, player) { + player.gain(trigger.result.card, "gain2"); }, - async content(event,trigger,player){ - player.gain(trigger.result.card,'gain2'); - } }, - yiji:{ - audio:2, - trigger:{player:'damageEnd'}, - frequent:true, - filter(event){ - return event.num>0; + yiji: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + filter(event) { + return event.num > 0; }, - getIndex(event, player, triggername){ + getIndex(event, player, triggername) { return event.num; }, - async content(event, trigger, player){ - const {cards}=await game.cardsGotoOrdering(get.cards(2)); - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - if(!cards.length) return; + async content(event, trigger, player) { + const { cards } = await game.cardsGotoOrdering(get.cards(2)); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + event.given_map = {}; + if (!cards.length) return; // event.goto -> do while - do{ - const {result:{bool,links}} = - cards.length==1? - {result:{links:cards.slice(0),bool: true}}: - await player.chooseCardButton('遗计:请选择要分配的牌',true,cards,[1,cards.length]) - .set('ai',()=>{ - if(ui.selected.buttons.length==0) return 1; - return 0; - }); - if(!bool) return; + do { + const { + result: { bool, links }, + } = + cards.length == 1 + ? { result: { links: cards.slice(0), bool: true } } + : await player + .chooseCardButton("遗计:请选择要分配的牌", true, cards, [ + 1, + cards.length, + ]) + .set("ai", () => { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + if (!bool) return; cards.removeArray(links); - event.togive=links.slice(0); - const {result:{targets}}=await player.chooseTarget('选择一名角色获得'+get.translation(links),true) - .set('ai',target=>{ - const att=get.attitude(_status.event.player,target); - if(_status.event.enemy){ + event.togive = links.slice(0); + const { + result: { targets }, + } = await player + .chooseTarget("选择一名角色获得" + get.translation(links), true) + .set("ai", (target) => { + const att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { return -att; - } - else if(att>0){ - return att/(1+target.countCards('h')); - } - else{ - return att/100; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; } }) - .set('enemy',get.value(event.togive[0],player,'raw')<0); - if(targets.length){ - const id=targets[0].playerid, - map=event.given_map; - if(!map[id]) map[id]=[]; + .set("enemy", get.value(event.togive[0], player, "raw") < 0); + if (targets.length) { + const id = targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; map[id].addArray(event.togive); } - }while(cards.length>0); - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + } while (cards.length > 0); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - const list=[]; - for(const i in event.given_map){ - const source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - if(player!==source&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.2); + const list = []; + for (const i in event.given_map) { + const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) + player.addExpose(0.2); list.push([source, event.given_map[i]]); } game.loseAsync({ - gain_list:list, - giver:player, - animate:'draw', - }).setContent('gaincardMultiple'); + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - let num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()) num=0.7; - else num=0.5; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target(card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + let num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; } - if(target.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } - } - } - } + }, + }, + }, }, - luoshen:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - frequent:true, - preHidden:true, - async content(event,trigger,player){ - while(true){ - if(event.cards==undefined) event.cards=[]; - const judgeEvent=player.judge(card=>{ - if(get.color(card)=='black') return 1.5; + luoshen: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + preHidden: true, + async content(event, trigger, player) { + while (true) { + if (event.cards == undefined) event.cards = []; + const judgeEvent = player.judge((card) => { + if (get.color(card) == "black") return 1.5; return -1.5; }); - judgeEvent.judge2=result=>result.bool; - if(get.mode()!='guozhan'&&!player.hasSkillTag('rejudge')) judgeEvent.set('callback',async event=>{ - if(event.judgeResult.color=='black'&&get.position(event.card,true)=='o') await player.gain(event.card,'gain2'); - }); - else judgeEvent.set('callback',async event=>{ - if(event.judgeResult.color=='black') event.getParent().orderingCards.remove(event.card); - }); - const {result:{judge,card}}=await judgeEvent; + judgeEvent.judge2 = (result) => result.bool; + if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge")) + judgeEvent.set("callback", async (event) => { + if ( + event.judgeResult.color == "black" && + get.position(event.card, true) == "o" + ) + await player.gain(event.card, "gain2"); + }); + else + judgeEvent.set("callback", async (event) => { + if (event.judgeResult.color == "black") + event.getParent().orderingCards.remove(event.card); + }); + const { + result: { judge, card }, + } = await judgeEvent; let bool; - if(judge>0){ + if (judge > 0) { event.cards.push(card); - bool=(await player.chooseBool('是否再次发动【洛神】?').set('frequentSkill','luoshen')).result.bool; - } - else{ - for(let i=0;i{ - if(get.color(card)=='black') return 1.5; - return -1.5; - },ui.special); - judgeEvent.judge2=result=>result.bool; - const {result:{judge,card}}=await judgeEvent; - let bool; - if(judge>0){ - event.cards.push(card); - bool=lib.config.autoskilllist.includes('luoshen')?(await player.chooseBool('是否再次发动【洛神】?')).result.bool:true; - } - else{ - for(let i=0;i { + if (get.color(card) == "black") return 1.5; + return -1.5; + }, ui.special); + judgeEvent.judge2 = (result) => result.bool; + const { + result: { judge, card }, + } = await judgeEvent; + let bool; + if (judge > 0) { + event.cards.push(card); + bool = lib.config.autoskilllist.includes("luoshen") + ? (await player.chooseBool("是否再次发动【洛神】?")).result.bool + : true; + } else { + for (let i = 0; i < event.cards.length; i++) { + if (get.position(event.cards[i]) != "s") { + event.cards.splice(i, 1); + i--; + } + } + player.gain(event.cards, "gain2"); + player.storage.xinluoshen = event.cards.slice(0); + return; + } + if (!bool) { + if (event.cards.length) { + player.gain(event.cards, "gain2"); + player.storage.xinluoshen = event.cards.slice(0); return; } } } }, - mod:{ - ignoredHandcard(card,player){ - if(get.is.altered('xinluoshen')&&player.storage.xinluoshen&&player.storage.xinluoshen.includes(card)){ + mod: { + ignoredHandcard(card, player) { + if ( + get.is.altered("xinluoshen") && + player.storage.xinluoshen && + player.storage.xinluoshen.includes(card) + ) { return true; } - } + }, }, - group:'xinluoshen_clear', - subSkill:{ - clear:{ - trigger:{player:'phaseAfter'}, - silent:true, - async content(event,trigger,player){ + group: "xinluoshen_clear", + subSkill: { + clear: { + trigger: { player: "phaseAfter" }, + silent: true, + async content(event, trigger, player) { delete player.storage.xinluoshen; - } - } - } + }, + }, + }, }, - qingguo:{ - mod:{ - aiValue(player,card,num){ - if(get.name(card)!='shan'&&get.color(card)!='black') return; - const cards=player.getCards('hs',card=>get.name(card)=='shan'||get.color(card)=='black'); - cards.sort((a,b)=>{ - return (get.name(b)=='shan'?1:2)-(get.name(a)=='shan'?1:2); + qingguo: { + mod: { + aiValue(player, card, num) { + if (get.name(card) != "shan" && get.color(card) != "black") return; + const cards = player.getCards( + "hs", + (card) => get.name(card) == "shan" || get.color(card) == "black" + ); + cards.sort((a, b) => { + return (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2); }); - const geti=()=>{ - if(cards.includes(card)) cards.indexOf(card); + const geti = () => { + if (cards.includes(card)) cards.indexOf(card); return cards.length; }; - if(get.name(card)=='shan') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6; - return Math.max(num,[6.5,4,3][Math.min(geti(),2)]); + if (get.name(card) == "shan") + return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6; + return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]); }, - aiUseful(){ - return lib.skill.qingguo.mod.aiValue.apply(this,arguments); + aiUseful() { + return lib.skill.qingguo.mod.aiValue.apply(this, arguments); }, }, - locked:false, - audio:2, - audioname:['sb_zhenji'], - enable:['chooseToRespond','chooseToUse'], - filterCard(card){ - return get.color(card)=='black'; + locked: false, + audio: 2, + audioname: ["sb_zhenji"], + enable: ["chooseToRespond", "chooseToUse"], + filterCard(card) { + return get.color(card) == "black"; }, - viewAs:{name:'shan'}, - viewAsFilter(player){ - if(!player.countCards('hs',{color:'black'})) return false; + viewAs: { name: "shan" }, + viewAsFilter(player) { + if (!player.countCards("hs", { color: "black" })) return false; }, - position:'hs', - prompt:'将一张黑色手牌当闪使用或打出', - check(){return 1}, - ai:{ - order:3, - respondShan:true, - skillTagFilter(player){ - if(!player.countCards('hs',{color:'black'})) return false; + position: "hs", + prompt: "将一张黑色手牌当闪使用或打出", + check() { + return 1; + }, + ai: { + order: 3, + respondShan: true, + skillTagFilter(player) { + if (!player.countCards("hs", { color: "black" })) return false; }, - effect:{ - target(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0) return 0.6 - } - } - } + effect: { + target(card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.6; + }, + }, + }, }, - rende:{ - audio:2, - enable:'phaseUse', - filterCard:true, - selectCard:[1,Infinity], - discard:false, - lose:false, - delay:0, - filterTarget(card,player,target){ - return player!=target; + rende: { + audio: 2, + enable: "phaseUse", + filterCard: true, + selectCard: [1, Infinity], + discard: false, + lose: false, + delay: 0, + filterTarget(card, player, target) { + return player != target; }, - check(card){ - if(ui.selected.cards.length>1) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - const player=get.owner(card); - let num=0; - const evt2=_status.event.getParent(); - player.getHistory('lose',evt=>{ - if(evt.getParent().skill=='rende'&&evt.getParent(3)==evt2) num+=evt.cards.length; + check(card) { + if (ui.selected.cards.length > 1) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; + if (!ui.selected.cards.length && card.name == "du") return 20; + const player = get.owner(card); + let num = 0; + const evt2 = _status.event.getParent(); + player.getHistory("lose", (evt) => { + if (evt.getParent().skill == "rende" && evt.getParent(3) == evt2) + num += evt.cards.length; }); - if(player.hp==player.maxHp||num>1||player.countCards('h')<=1){ - if(ui.selected.cards.length){ + if (player.hp == player.maxHp || num > 1 || player.countCards("h") <= 1) { + if (ui.selected.cards.length) { return -1; } - const players=game.filterPlayer(); - for(let i=0;i=3&& - get.attitude(players[i],player)>=3){ - return 11-get.value(card); + const players = game.filterPlayer(); + for (let i = 0; i < players.length; i++) { + if ( + players[i].hasSkill("haoshi") && + !players[i].isTurnedOver() && + !players[i].hasJudge("lebu") && + get.attitude(player, players[i]) >= 3 && + get.attitude(players[i], player) >= 3 + ) { + return 11 - get.value(card); } } - if(player.countCards('h')>player.hp) return 10-get.value(card); - if(player.countCards('h')>2) return 6-get.value(card); + if (player.countCards("h") > player.hp) return 10 - get.value(card); + if (player.countCards("h") > 2) return 6 - get.value(card); return -1; } - return 10-get.value(card); + return 10 - get.value(card); }, - async content(event,trigger,player){ - const evt2=event.getParent(3); - let num=0; - player.getHistory('lose',evt=>{ - if(evt.getParent(2).name=='rende'&&evt.getParent(5)==evt2) num+=evt.cards.length; + async content(event, trigger, player) { + const evt2 = event.getParent(3); + let num = 0; + player.getHistory("lose", (evt) => { + if (evt.getParent(2).name == "rende" && evt.getParent(5) == evt2) + num += evt.cards.length; }); - player.give(event.cards,event.target); - if(num<2&&num+event.cards.length>1) player.recover(); + player.give(event.cards, event.target); + if (num < 2 && num + event.cards.length > 1) player.recover(); }, - ai:{ - order(skill,player){ - if(player.hp1){ + ai: { + order(skill, player) { + if ( + player.hp < player.maxHp && + player.storage.rende < 2 && + player.countCards("h") > 1 + ) { return 10; } return 1; }, - result:{ - target(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - return target.hasSkillTag('nodu')?0:-10; + result: { + target(player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + return target.hasSkillTag("nodu") ? 0 : -10; } - if(target.hasJudge('lebu')) return 0; - const nh=target.countCards('h'); - const np=player.countCards('h'); - if(player.hp==player.maxHp||player.storage.rende<0||player.countCards('h')<=1){ - if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; + if (target.hasJudge("lebu")) return 0; + const nh = target.countCards("h"); + const np = player.countCards("h"); + if ( + player.hp == player.maxHp || + player.storage.rende < 0 || + player.countCards("h") <= 1 + ) { + if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; } - return Math.max(1,5-nh); - } + return Math.max(1, 5 - nh); + }, }, - effect:{ - target(card,player,target){ - if(player==target&&get.type(card)=='equip'){ - if(player.countCards('e',{subtype:get.subtype(card)})){ - const players=game.filterPlayer(); - for(let i=0;i0){ + effect: { + target(card, player, target) { + if (player == target && get.type(card) == "equip") { + if (player.countCards("e", { subtype: get.subtype(card) })) { + const players = game.filterPlayer(); + for (let i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 0) { return 0; } } } } - } + }, }, - threaten:0.8 - } - }, - rende1:{ - trigger:{player:'phaseUseBegin'}, - silent:true, - async content(event,trigger,player){ - player.storage.rende=0; - } - }, - jijiang:{ - audio:'jijiang1', - audioname:['liushan','re_liubei','re_liushan','ol_liushan'], - unique:true, - group:['jijiang1'], - zhuSkill:true, - filter(event,player){ - if(!player.hasZhuSkill('jijiang')||!game.hasPlayer(current=>current!=player&¤t.group=='shu')) return false; - return !event.jijiang&&(event.type!='phase'||!player.hasSkill('jijiang3')); + threaten: 0.8, }, - enable:['chooseToUse','chooseToRespond'], - viewAs:{name:'sha'}, - filterCard(){return false}, - selectCard:-1, - ai:{ - order(){ - return get.order({name:'sha'})+0.3; + }, + rende1: { + trigger: { player: "phaseUseBegin" }, + silent: true, + async content(event, trigger, player) { + player.storage.rende = 0; + }, + }, + jijiang: { + audio: "jijiang1", + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + unique: true, + group: ["jijiang1"], + zhuSkill: true, + filter(event, player) { + if ( + !player.hasZhuSkill("jijiang") || + !game.hasPlayer((current) => current != player && current.group == "shu") + ) + return false; + return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); + }, + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { name: "sha" }, + filterCard() { + return false; + }, + selectCard: -1, + ai: { + order() { + return get.order({ name: "sha" }) + 0.3; }, - respondSha:true, - skillTagFilter(player){ - if(!player.hasZhuSkill('jijiang')||!game.hasPlayer(current=>current!=player&¤t.group=='shu')) return false; + respondSha: true, + skillTagFilter(player) { + if ( + !player.hasZhuSkill("jijiang") || + !game.hasPlayer((current) => current != player && current.group == "shu") + ) + return false; }, }, }, - jijiang1:{ - audio:2, - audioname:['liushan','re_liubei','re_liushan','ol_liushan'], - trigger:{player:['useCardBegin','respondBegin']}, - logTarget:'targets', - filter(event,player){ - return event.skill=='jijiang'; + jijiang1: { + audio: 2, + audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"], + trigger: { player: ["useCardBegin", "respondBegin"] }, + logTarget: "targets", + filter(event, player) { + return event.skill == "jijiang"; }, - forced:true, - async content(event,trigger,player){ + forced: true, + async content(event, trigger, player) { delete trigger.skill; - trigger.getParent().set('jijiang',true); - while(true){ - if(event.current==undefined) event.current=player.next; - if(event.current==player){ - player.addTempSkill('jijiang3'); + trigger.getParent().set("jijiang", true); + while (true) { + if (event.current == undefined) event.current = player.next; + if (event.current == player) { + player.addTempSkill("jijiang3"); trigger.cancel(); trigger.getParent().goto(0); return; - } - else if(event.current.group=='shu'){ - const chooseToRespondEvent=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张杀?',{name:'sha'}); - chooseToRespondEvent.set('ai',()=>{ - const event=_status.event; - return (get.attitude(event.player,event.source)-2); + } else if (event.current.group == "shu") { + const chooseToRespondEvent = event.current.chooseToRespond( + "是否替" + get.translation(player) + "打出一张杀?", + { name: "sha" } + ); + chooseToRespondEvent.set("ai", () => { + const event = _status.event; + return get.attitude(event.player, event.source) - 2; }); - chooseToRespondEvent.set('source',player); - chooseToRespondEvent.set('jijiang',true); - chooseToRespondEvent.set('skillwarn','替'+get.translation(player)+'打出一张杀'); - chooseToRespondEvent.noOrdering=true; - chooseToRespondEvent.autochoose=lib.filter.autoRespondSha; - const {bool,card,cards}=(await chooseToRespondEvent).result; - if(bool){ - trigger.card=card; - trigger.cards=cards; - trigger.throw=false; - if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ - event.current.ai.shown+=0.3; - if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + chooseToRespondEvent.set("source", player); + chooseToRespondEvent.set("jijiang", true); + chooseToRespondEvent.set( + "skillwarn", + "替" + get.translation(player) + "打出一张杀" + ); + chooseToRespondEvent.noOrdering = true; + chooseToRespondEvent.autochoose = lib.filter.autoRespondSha; + const { bool, card, cards } = (await chooseToRespondEvent).result; + if (bool) { + trigger.card = card; + trigger.cards = cards; + trigger.throw = false; + if ( + typeof event.current.ai.shown == "number" && + event.current.ai.shown < 0.95 + ) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; } return; - } - else event.current=event.current.next; - } - else event.current=event.current.next; + } else event.current = event.current.next; + } else event.current = event.current.next; } - } + }, }, - jijiang3:{ - trigger:{global:['useCardAfter','useSkillAfter','phaseAfter']}, - silent:true, - charlotte:true, - filter(event){ - return event.skill!='jijiang'&&event.skill!='qinwang'; + jijiang3: { + trigger: { global: ["useCardAfter", "useSkillAfter", "phaseAfter"] }, + silent: true, + charlotte: true, + filter(event) { + return event.skill != "jijiang" && event.skill != "qinwang"; + }, + async content(event, trigger, player) { + player.removeSkill("jijiang3"); }, - async content(event,trigger,player){ - player.removeSkill('jijiang3'); - } }, - wusheng:{ - audio:2, - audioname2:{ - old_guanzhang:'old_fuhun', - old_guanyu:'wusheng_re_guanyu', + wusheng: { + audio: 2, + audioname2: { + old_guanzhang: "old_fuhun", + old_guanyu: "wusheng_re_guanyu", }, - audioname:['re_guanyu','guanzhang','jsp_guanyu','guansuo','re_guanzhang','dc_jsp_guanyu'], - enable:['chooseToRespond','chooseToUse'], - filterCard(card,player){ - if(get.zhu(player,'shouyue')) return true; - return get.color(card)=='red'; + audioname: [ + "re_guanyu", + "guanzhang", + "jsp_guanyu", + "guansuo", + "re_guanzhang", + "dc_jsp_guanyu", + ], + enable: ["chooseToRespond", "chooseToUse"], + filterCard(card, player) { + if (get.zhu(player, "shouyue")) return true; + return get.color(card) == "red"; }, - position:'hes', - viewAs:{name:'sha'}, - viewAsFilter(player){ - if(get.zhu(player,'shouyue')){ - if(!player.countCards('hes')) return false; - } - else{ - if(!player.countCards('hes',{color:'red'})) return false; + position: "hes", + viewAs: { name: "sha" }, + viewAsFilter(player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; } }, - prompt:'将一张红色牌当杀使用或打出', - check(card){ - const val=get.value(card); - if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); - return 5-val; + prompt: "将一张红色牌当杀使用或打出", + check(card) { + const val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 5 - val; }, - ai:{ - skillTagFilter(player){ - if(get.zhu(player,'shouyue')){ - if(!player.countCards('hes')) return false; - } - else{ - if(!player.countCards('hes',{color:'red'})) return false; + ai: { + skillTagFilter(player) { + if (get.zhu(player, "shouyue")) { + if (!player.countCards("hes")) return false; + } else { + if (!player.countCards("hes", { color: "red" })) return false; } }, - respondSha:true, - } - }, - wusheng_re_guanyu:{audio:2}, - zhongyi:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'orange', - filterCard:true, - position:'he', - filter(event,player){ - return player.countCards('he')>0; - }, - discard:false, - lose:false, - async content(event,trigger,player){ - player.awakenSkill('zhongyi'); - player.addTempSkill('zhongyi2','roundStart'); - player.addToExpansion(player,'give',event.cards).gaintag.add('zhongyi2'); + respondSha: true, }, }, - zhongyi2:{ - trigger:{global:'damageBegin1'}, - forced:true, - popup:false, - logTarget:'source', - filter(event,player){ - return event.getParent().name=='sha'&&event.source&&event.source.isFriendOf(player); + wusheng_re_guanyu: { audio: 2 }, + zhongyi: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + filterCard: true, + position: "he", + filter(event, player) { + return player.countCards("he") > 0; }, - async content(event,trigger,player){trigger.num++}, - intro:{content:'expansion',markcount:'expansion'}, - onremove(player,skill){ - const cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + discard: false, + lose: false, + async content(event, trigger, player) { + player.awakenSkill("zhongyi"); + player.addTempSkill("zhongyi2", "roundStart"); + player.addToExpansion(player, "give", event.cards).gaintag.add("zhongyi2"); }, }, - paoxiao:{ - audio:2, - firstDo:true, - audioname:['re_zhangfei','guanzhang','xiahouba'], + zhongyi2: { + trigger: { global: "damageBegin1" }, + forced: true, + popup: false, + logTarget: "source", + filter(event, player) { + return event.getParent().name == "sha" && event.source && event.source.isFriendOf(player); + }, + async content(event, trigger, player) { + trigger.num++; + }, + intro: { content: "expansion", markcount: "expansion" }, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + }, + paoxiao: { + audio: 2, + firstDo: true, + audioname: ["re_zhangfei", "guanzhang", "xiahouba"], audioname2: { - old_guanzhang:'old_fuhun', - dc_xiahouba:'paoxiao_xiahouba', + old_guanzhang: "old_fuhun", + dc_xiahouba: "paoxiao_xiahouba", }, - trigger:{player:'useCard1'}, - forced:true, - filter(event,player){ - return !event.audioed&&event.card.name=='sha'&&player.countUsed('sha',true)>1&&event.getParent().type=='phase'; + trigger: { player: "useCard1" }, + forced: true, + filter(event, player) { + return ( + !event.audioed && + event.card.name == "sha" && + player.countUsed("sha", true) > 1 && + event.getParent().type == "phase" + ); }, - async content(event,trigger,player){ - trigger.audioed=true; + async content(event, trigger, player) { + trigger.audioed = true; }, - mod:{ - cardUsable(card,player,num){ - if(card.name=='sha') return Infinity; - } + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return Infinity; + }, }, - ai:{ - unequip:true, - skillTagFilter(player,tag,arg){ - if(!get.zhu(player,'shouyue')) return false; - if(arg&&arg.name=='sha') return true; + ai: { + unequip: true, + skillTagFilter(player, tag, arg) { + if (!get.zhu(player, "shouyue")) return false; + if (arg && arg.name == "sha") return true; return false; - } - } + }, + }, }, - paoxiao_xiahouba:{audio:2}, - guanxing_fail:{}, - guanxing:{ - audio:2, - audioname:['jiangwei','re_jiangwei','re_zhugeliang','ol_jiangwei'], - trigger:{player:'phaseZhunbeiBegin'}, - frequent:true, - preHidden:true, - async content(event,trigger,player){ - const num=player.hasSkill('yizhi')&&player.hasSkill('guanxing')?5:Math.min(5,game.countPlayer()); - const cards=get.cards(num); + paoxiao_xiahouba: { audio: 2 }, + guanxing_fail: {}, + guanxing: { + audio: 2, + audioname: ["jiangwei", "re_jiangwei", "re_zhugeliang", "ol_jiangwei"], + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + preHidden: true, + async content(event, trigger, player) { + const num = + player.hasSkill("yizhi") && player.hasSkill("guanxing") + ? 5 + : Math.min(5, game.countPlayer()); + const cards = get.cards(num); game.cardsGotoOrdering(cards); - const next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('prompt','观星:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=list=>{ - const cards=list[0][1],player=_status.event.player; - const top=[]; - const judges=player.getCards('j'); - let stopped=false; - if(!player.hasWuxie()){ - for(let i=0;ijudge(b)-judge(a)); - if(judge(cards[0])<0){ - stopped=true;break; - } - else{ + const next = player.chooseToMove(); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("prompt", "观星:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = (list) => { + const cards = list[0][1], + player = _status.event.player; + const top = []; + const judges = player.getCards("j"); + let stopped = false; + if (!player.hasWuxie()) { + for (let i = 0; i < judges.length; i++) { + const judge = get.judge(judges[i]); + cards.sort((a, b) => judge(b) - judge(a)); + if (judge(cards[0]) < 0) { + stopped = true; + break; + } else { top.unshift(cards.shift()); } } } let bottom; - if(!stopped){ - cards.sort((a,b)=>get.value(b,player)-get.value(a,player)); - while(cards.length){ - if(get.value(cards[0],player)<=5) break; + if (!stopped) { + cards.sort((a, b) => get.value(b, player) - get.value(a, player)); + while (cards.length) { + if (get.value(cards[0], player) <= 5) break; top.unshift(cards.shift()); } } - bottom=cards; - return [top,bottom]; - } - const {result:{moved}}=await next; - const top=moved[0]; - const bottom=moved[1]; + bottom = cards; + return [top, bottom]; + }; + const { + result: { moved }, + } = await next; + const top = moved[0]; + const bottom = moved[1]; top.reverse(); - game.cardsGotoPile( - top.concat(bottom), - ['top_cards',top], - (event,card)=>{ - if(event.top_cards.includes(card)) return ui.cardPile.firstChild; - return null; - } - ); - player.popup(get.cnNumber(top.length)+'上'+get.cnNumber(bottom.length)+'下'); - game.log(player,'将'+get.cnNumber(top.length)+'张牌置于牌堆顶'); + game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); game.asyncDelayx(); }, - ai:{ - threaten:1.2 - } - }, - kongcheng:{ - mod:{ - targetEnabled(card,player,target,now){ - if(target.countCards('h')==0){ - if(card.name=='sha'||card.name=='juedou') return false; - } - } + ai: { + threaten: 1.2, }, - group:'kongcheng1', - audio:'kongcheng1', - audioname:['re_zhugeliang'], - ai:{ - noh:true, - skillTagFilter(player,tag){ - if(tag=='noh'){ - if(player.countCards('h')!=1) return false; - } - } - } }, - kongcheng1:{ - audio:2, - trigger:{player:'loseEnd'}, - forced:true, - firstDo:true, - audioname:['re_zhugeliang'], - filter(event,player){ - if(player.countCards('h')) return false; - for(let i=0;i{ - if(get.zhu(_status.event.player,'shouyue')){ - if(get.suit(card)!='spade') return 2; - } - else{ - if(get.color(card)=='red') return 2; + }, + mashu2: { + mod: { + globalFrom(from, to, distance) { + return distance - 1; + }, + }, + }, + feiying: { + mod: { + globalTo(from, to, distance) { + return distance + 1; + }, + }, + }, + tieji: { + audio: 2, + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + check(event, player) { + return get.attitude(player, event.target) <= 0; + }, + filter(event, player) { + return event.card.name == "sha"; + }, + logTarget: "target", + preHidden: true, + async content(event, trigger, player) { + const judgeEvent = player.judge((card) => { + if (get.zhu(_status.event.player, "shouyue")) { + if (get.suit(card) != "spade") return 2; + } else { + if (get.color(card) == "red") return 2; } return -0.5; }); - judgeEvent.judge2=result=>result.bool; - const {result:{bool}}=await judgeEvent; - if(bool){ + judgeEvent.judge2 = (result) => result.bool; + const { + result: { bool }, + } = await judgeEvent; + if (bool) { trigger.getParent().directHit.add(trigger.target); } }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(get.attitude(player,arg.target)>0||arg.card.name!='sha'||!ui.cardPile.firstChild||get.color(ui.cardPile.firstChild,player)!='red') return false; + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if ( + get.attitude(player, arg.target) > 0 || + arg.card.name != "sha" || + !ui.cardPile.firstChild || + get.color(ui.cardPile.firstChild, player) != "red" + ) + return false; }, }, }, - jizhi:{ - audio:2, - audioname:['jianyong'], - trigger:{player:'useCard'}, - frequent:true, - preHidden:true, - filter(event){ - return (get.type(event.card)=='trick'&&event.card.isCard); + jizhi: { + audio: 2, + audioname: ["jianyong"], + trigger: { player: "useCard" }, + frequent: true, + preHidden: true, + filter(event) { + return get.type(event.card) == "trick" && event.card.isCard; }, - async content(event,trigger,player){ + async content(event, trigger, player) { player.draw(); }, - ai:{ - threaten:1.4, - noautowuxie:true, - } - }, - xinjizhi:{ - audio:'jizhi', - trigger:{player:'useCard'}, - frequent:true, - // alter:true, - filter(event){ - if(get.type(event.card)=='delay') return false; - return (get.type(event.card,'trick')=='trick'&&event.cards[0]&&event.cards[0]==event.card); + ai: { + threaten: 1.4, + noautowuxie: true, }, - async content(event, trigger, player){ + }, + xinjizhi: { + audio: "jizhi", + trigger: { player: "useCard" }, + frequent: true, + // alter:true, + filter(event) { + if (get.type(event.card) == "delay") return false; + return ( + get.type(event.card, "trick") == "trick" && + event.cards[0] && + event.cards[0] == event.card + ); + }, + async content(event, trigger, player) { player.draw(); }, - ai:{ - threaten:1.4, - noautowuxie:true, + ai: { + threaten: 1.4, + noautowuxie: true, }, }, - qicai:{ - mod:{ - targetInRange(card,player,target,now){ - if(['trick','delay'].includes(get.type(card))) return true; - } + qicai: { + mod: { + targetInRange(card, player, target, now) { + if (["trick", "delay"].includes(get.type(card))) return true; + }, }, }, - xinqicai:{ + xinqicai: { // alter:true, - mod:{ - targetInRange(card,player,target,now){ - if(['trick','delay'].includes(get.type(card))) return true; - } + mod: { + targetInRange(card, player, target, now) { + if (["trick", "delay"].includes(get.type(card))) return true; + }, }, }, - xinzhiheng:{ - audio:'zhiheng', - mod:{ - aiOrder(player,card,num){ - if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; - let eq=player.getEquip(get.subtype(card)); - if(eq&&get.equipValue(card)-get.equipValue(eq)get.value(card)>=8)){ - return 8-get.value(card); + usable: 1, + position: "he", + filterCard: true, + selectCard: [1, Infinity], + check(card) { + const player = _status.event.player; + if ( + get.is.altered("xinzhiheng") && + get.position(card) == "h" && + !player.countCards("h", (card) => get.value(card) >= 8) + ) { + return 8 - get.value(card); } - return 6-get.value(card) + return 6 - get.value(card); }, - delay:0, - async content(event,trigger,player){ - if(!player.hasSkill('xinzhiheng_delay')) game.asyncDelayx(); + delay: 0, + async content(event, trigger, player) { + if (!player.hasSkill("xinzhiheng_delay")) game.asyncDelayx(); player.draw(event.cards.length); }, - group:'xinzhiheng_draw', - subSkill:{ - draw:{ - trigger:{player:'loseEnd'}, - silent:true, - filter(event,player){ - if(event.getParent(2).skill!='xinzhiheng') return false; - if(!get.is.altered('xinzhiheng')) return false; - if(player.countCards('h')) return false; - for(let i=0;iget.value(i)>Math.max(6,9-player.hp),'he')) return 1; + ai: { + order(item, player) { + if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1; return 10; }, - result:{ - player:1 + result: { + player: 1, }, - nokeep:true, - skillTagFilter(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.xinzhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); + nokeep: true, + skillTagFilter(player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg && arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + !player.getStat().skill.xinzhiheng && + player.hasCard((card) => get.name(card) !== "tao", "h") + ); }, - threaten:1.55 + threaten: 1.55, }, }, - zhiheng:{ - audio:2, - audioname:['gz_jun_sunquan'], - mod:{ - aiOrder(player,card,num){ - if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; - let eq=player.getEquip(get.subtype(card)); - if(eq&&get.equipValue(card)-get.equipValue(eq)0) return false; - if(event.player.group!='wu') return false; + trigger: { target: "taoBegin" }, + zhuSkill: true, + forced: true, + filter(event, player) { + if (get.is.altered("xinjiuyuan")) return false; + if (event.player == player) return false; + if (!player.hasZhuSkill("jiuyuan")) return false; + if (player.hp > 0) return false; + if (event.player.group != "wu") return false; return true; }, - async content(event,trigger,player){ + async content(event, trigger, player) { player.recover(); }, - global:'xinjiuyuan2', + global: "xinjiuyuan2", }, - xinjiuyuan2:{ - audio:'jiuyuan', - forceaudio:true, - trigger:{player:'taoBegin'}, - filter(event,player){ - if(!get.is.altered('xinjiuyuan')) return false; - if(player.group!='wu') return false; - return game.hasPlayer(target=>{ - return player!=target&&target.isDamaged()&&target.hp { + return ( + player != target && + target.isDamaged() && + target.hp < player.hp && + target.hasZhuSkill("xinjiuyuan", player) + ); }); }, - direct:true, - async content(event,trigger,player){ - event.list=game.filterPlayer(target=>player!=target&&target.isDamaged()&&target.hp0){ - const current=event.list.shift(); - event.current=current; - const {result:{bool}}=await player.chooseBool(get.prompt('xinjiuyuan',current)).set('choice',get.attitude(player,current)>0); - if(bool){ - player.logSkill('xinjiuyuan',event.current); + direct: true, + async content(event, trigger, player) { + event.list = game + .filterPlayer( + (target) => + player != target && + target.isDamaged() && + target.hp < player.hp && + target.hasZhuSkill("xinjiuyuan", player) + ) + .sortBySeat(); + while (event.list.length > 0) { + const current = event.list.shift(); + event.current = current; + const { + result: { bool }, + } = await player + .chooseBool(get.prompt("xinjiuyuan", current)) + .set("choice", get.attitude(player, current) > 0); + if (bool) { + player.logSkill("xinjiuyuan", event.current); event.current.recover(); player.draw(); } } - } - }, - qixi:{ - audio:2, - audioname:['re_ganning','re_heqi'], - enable:'chooseToUse', - filterCard(card){ - return get.color(card)=='black'; }, - position:'hes', - viewAs:{name:'guohe'}, - viewAsFilter(player){ - if(!player.countCards('hes',{color:'black'})) return false; - }, - prompt:'将一张黑色牌当过河拆桥使用', - check(card){return 4-get.value(card)} }, - keji:{ - audio:2, - audioname:['re_lvmeng','sp_lvmeng'], - trigger:{player:'phaseDiscardBefore'}, - frequent(event,player){ + qixi: { + audio: 2, + audioname: ["re_ganning", "re_heqi"], + enable: "chooseToUse", + filterCard(card) { + return get.color(card) == "black"; + }, + position: "hes", + viewAs: { name: "guohe" }, + viewAsFilter(player) { + if (!player.countCards("hes", { color: "black" })) return false; + }, + prompt: "将一张黑色牌当过河拆桥使用", + check(card) { + return 4 - get.value(card); + }, + }, + keji: { + audio: 2, + audioname: ["re_lvmeng", "sp_lvmeng"], + trigger: { player: "phaseDiscardBefore" }, + frequent(event, player) { return player.needsToDiscard(); }, - filter(event,player){ - if(player.getHistory('skipped').includes('phaseUse')) return true; - const history=player.getHistory('useCard').concat(player.getHistory('respond')); - for(let i=0;i=player.hp-1) return -1; - if(player.hp<3) return -1; + result: { + player(player) { + if (player.countCards("h") >= player.hp - 1) return -1; + if (player.hp < 3) return -1; return 1; - } - } - } + }, + }, + }, }, - yingzi:{ - audio:2, - audioname:['sp_lvmeng'], - trigger:{player:'phaseDrawBegin2'}, - frequent:true, - filter(event,player){ + yingzi: { + audio: 2, + audioname: ["sp_lvmeng"], + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + filter(event, player) { return !event.numFixed; }, - async content(event,trigger,player){ + async content(event, trigger, player) { trigger.num++; }, - ai:{ - threaten:1.3 - } + ai: { + threaten: 1.3, + }, }, - fanjian:{ - audio:2, - enable:'phaseUse', - usable:1, - filter(event,player){ - return player.countCards('h')>0; + fanjian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("h") > 0; }, - filterTarget(card,player,target){ - return player!=target; + filterTarget(card, player, target) { + return player != target; }, - async content(event,trigger,player){ - const target=event.target; - const control=await target.chooseControl('heart2','diamond2','club2','spade2').set('ai',event=>{ - switch(Math.floor(Math.random()*6)){ - case 0:return 'heart2'; - case 1:case 4:case 5:return 'diamond2'; - case 2:return 'club2'; - case 3:return 'spade2'; - } - }) - .forResultControl(); - game.log(target,'选择了'+get.translation(control)); - event.choice=control; - target.chat('我选'+get.translation(event.choice)); - const {result:{bool,cards}}=await target.gainPlayerCard(player,true,'h'); - if(bool&&get.suit(cards[0],player)+'2'!=event.choice) target.damage('nocard'); + async content(event, trigger, player) { + const target = event.target; + const control = await target + .chooseControl("heart2", "diamond2", "club2", "spade2") + .set("ai", (event) => { + switch (Math.floor(Math.random() * 6)) { + case 0: + return "heart2"; + case 1: + case 4: + case 5: + return "diamond2"; + case 2: + return "club2"; + case 3: + return "spade2"; + } + }) + .forResultControl(); + game.log(target, "选择了" + get.translation(control)); + event.choice = control; + target.chat("我选" + get.translation(event.choice)); + const { + result: { bool, cards }, + } = await target.gainPlayerCard(player, true, "h"); + if (bool && get.suit(cards[0], player) + "2" != event.choice) target.damage("nocard"); + }, + ai: { + order: 1, + result: { + target(player, target) { + const eff = get.damageEffect(target, player); + if (eff >= 0) return 1 + eff; + let value = 0, + i; + const cards = player.getCards("h"); + for (i = 0; i < cards.length; i++) value += get.value(cards[i]); + value /= player.countCards("h"); + if (target.hp == 1) return Math.min(0, value - 7); + return Math.min(0, value - 5); + }, + }, }, - ai:{ - order:1, - result:{ - target(player,target){ - const eff=get.damageEffect(target,player); - if(eff>=0) return 1+eff; - let value=0,i; - const cards=player.getCards('h'); - for(i=0;i0; + guose: { + audio: 2, + filter(event, player) { + return player.countCards("hes", { suit: "diamond" }) > 0; }, - enable:'chooseToUse', - filterCard(card){ - return get.suit(card)=='diamond'; + enable: "chooseToUse", + filterCard(card) { + return get.suit(card) == "diamond"; + }, + position: "hes", + viewAs: { name: "lebu" }, + prompt: "将一张方片牌当乐不思蜀使用", + check(card) { + return 6 - get.value(card); + }, + ai: { + threaten: 1.5, }, - position:'hes', - viewAs:{name:'lebu'}, - prompt:'将一张方片牌当乐不思蜀使用', - check(card){return 6-get.value(card)}, - ai:{ - threaten:1.5 - } }, - liuli:{ - audio:2, - audioname:['re_daqiao','daxiaoqiao'], - trigger:{target:'useCardToTarget'}, - preHidden:true, - filter(event,player){ - if(event.card.name!='sha') return false; - if(player.countCards('he')==0) return false; - return game.hasPlayer(current=>{ - return player.inRange(current)&¤t!=event.player&& - current!=player&&lib.filter.targetEnabled(event.card,event.player,current); + liuli: { + audio: 2, + audioname: ["re_daqiao", "daxiaoqiao"], + trigger: { target: "useCardToTarget" }, + preHidden: true, + filter(event, player) { + if (event.card.name != "sha") return false; + if (player.countCards("he") == 0) return false; + return game.hasPlayer((current) => { + return ( + player.inRange(current) && + current != event.player && + current != player && + lib.filter.targetEnabled(event.card, event.player, current) + ); }); }, - async cost(event,trigger,player){ - event.result = await player.chooseCardTarget({ - position:'he', - filterCard:lib.filter.cardDiscardable, - filterTarget:(card,player,target)=>{ - const trigger=_status.event; - if(player.inRange(target)&&target!=trigger.source){ - if(lib.filter.targetEnabled(trigger.card,trigger.source,target)) return true; - } - return false; - }, - ai1:card=>get.unuseful(card)+9, - ai2:target=>{ - if(_status.event.player.countCards('h','shan')){ - return -get.attitude(_status.event.player,target); - } - if(get.attitude(_status.event.player,target)<5){ - return 6-get.attitude(_status.event.player,target); - } - if(_status.event.player.hp==1&&player.countCards('h','shan')==0){ - return 10-get.attitude(_status.event.player,target); - } - if(_status.event.player.hp==2&&player.countCards('h','shan')==0){ - return 8-get.attitude(_status.event.player,target); - } - return -1; - }, - prompt:get.prompt('liuli'), - prompt2:'弃置一张牌,将此【杀】转移给攻击范围内的一名其他角色', - source:trigger.player, - card:trigger.card, - }) - .setHiddenSkill(event.name).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + position: "he", + filterCard: lib.filter.cardDiscardable, + filterTarget: (card, player, target) => { + const trigger = _status.event; + if (player.inRange(target) && target != trigger.source) { + if (lib.filter.targetEnabled(trigger.card, trigger.source, target)) + return true; + } + return false; + }, + ai1: (card) => get.unuseful(card) + 9, + ai2: (target) => { + if (_status.event.player.countCards("h", "shan")) { + return -get.attitude(_status.event.player, target); + } + if (get.attitude(_status.event.player, target) < 5) { + return 6 - get.attitude(_status.event.player, target); + } + if (_status.event.player.hp == 1 && player.countCards("h", "shan") == 0) { + return 10 - get.attitude(_status.event.player, target); + } + if (_status.event.player.hp == 2 && player.countCards("h", "shan") == 0) { + return 8 - get.attitude(_status.event.player, target); + } + return -1; + }, + prompt: get.prompt("liuli"), + prompt2: "弃置一张牌,将此【杀】转移给攻击范围内的一名其他角色", + source: trigger.player, + card: trigger.card, + }) + .setHiddenSkill(event.name) + .forResult(); }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = event.targets[0]; - player.logSkill(event.name,target); + player.logSkill(event.name, target); player.discard(event.cards); - const evt=trigger.getParent(); + const evt = trigger.getParent(); evt.triggeredTargets2.remove(player); evt.targets.remove(player); evt.targets.push(target); }, - ai:{ - effect:{ - target(card,player,target){ - if(target.countCards('he')==0) return; - if(card.name!='sha') return; - let min=1; - const friend=get.attitude(player,target)>0; - const vcard={name:'shacopy',nature:card.nature,suit:card.suit}; - const players=game.filterPlayer(); - for(let i=0;i0){ - if(!player.canUse(card,players[0])){ - return [0,0.1]; + ai: { + effect: { + target(card, player, target) { + if (target.countCards("he") == 0) return; + if (card.name != "sha") return; + let min = 1; + const friend = get.attitude(player, target) > 0; + const vcard = { name: "shacopy", nature: card.nature, suit: card.suit }; + const players = game.filterPlayer(); + for (let i = 0; i < players.length; i++) { + if ( + player != players[i] && + get.attitude(target, players[i]) < 0 && + target.canUse(card, players[i]) + ) { + if (!friend) return 0; + if (get.effect(players[i], vcard, player, player) > 0) { + if (!player.canUse(card, players[0])) { + return [0, 0.1]; } - min=0; + min = 0; } } } return min; - } - } - } + }, + }, + }, }, - qianxun:{ - mod:{ - targetEnabled(card,player,target,now){ - if(card.name=='shunshou'||card.name=='lebu') return false; - } + qianxun: { + mod: { + targetEnabled(card, player, target, now) { + if (card.name == "shunshou" || card.name == "lebu") return false; + }, }, - audio:2, + audio: 2, }, - lianying:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + lianying: { + audio: 2, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - frequent:true, - filter(event,player){ - if(player.countCards('h')) return false; - const evt=event.getl(player); - return evt&&evt.player==player&&evt.hs&&evt.hs.length>0; + frequent: true, + filter(event, player) { + if (player.countCards("h")) return false; + const evt = event.getl(player); + return evt && evt.player == player && evt.hs && evt.hs.length > 0; }, - async content(event,trigger,player){ + async content(event, trigger, player) { player.draw(); }, - ai:{ - threaten:0.8, - effect:{ - target(card){ - if(card.name=='guohe'||card.name=='liuxinghuoyu') return 0.5; + ai: { + threaten: 0.8, + effect: { + target(card) { + if (card.name == "guohe" || card.name == "liuxinghuoyu") return 0.5; + }, + }, + noh: true, + skillTagFilter(player, tag) { + if (tag == "noh") { + if (player.countCards("h") != 1) return false; } }, - noh:true, - skillTagFilter(player,tag){ - if(tag=='noh'){ - if(player.countCards('h')!=1) return false; - } - } - } - }, - xiaoji:{ - audio:2, - audioname:['sp_sunshangxiang','re_sunshangxiang'], - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, - frequent:true, - getIndex(event, player){ - const evt=event.getl(player); + }, + xiaoji: { + audio: 2, + audioname: ["sp_sunshangxiang", "re_sunshangxiang"], + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + frequent: true, + getIndex(event, player) { + const evt = event.getl(player); if (evt && evt.player === player && evt.es) return evt.es.length; return false; }, - async content(event,trigger,player){ + async content(event, trigger, player) { player.draw(2); }, - ai:{ - noe:true, - reverseEquip:true, - effect:{ - target(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; - } - } - } - }, - jieyin:{ - audio:2, - enable:'phaseUse', - filterCard:true, - usable:1, - selectCard:2, - check(card){ - const player=get.owner(card); - if(player.countCards('h')>player.hp) return 8-get.value(card); - if(player.hp=target.maxHp) return false; - if(target==player) return false; + }, + jieyin: { + audio: 2, + enable: "phaseUse", + filterCard: true, + usable: 1, + selectCard: 2, + check(card) { + const player = get.owner(card); + if (player.countCards("h") > player.hp) return 8 - get.value(card); + if (player.hp < player.maxHp) return 6 - get.value(card); + return 4 - get.value(card); + }, + filterTarget(card, player, target) { + if (!target.hasSex("male")) return false; + if (target.hp >= target.maxHp) return false; + if (target == player) return false; return true; }, - async content(event,trigger,player){ + async content(event, trigger, player) { player.recover(); event.target.recover(); }, - ai:{ - order:5.5, - result:{ - player(player){ - if(player.hpplayer.hp) return 0 + ai: { + order: 5.5, + result: { + player(player) { + if (player.hp < player.maxHp) return 4; + if (player.countCards("h") > player.hp) return 0; return -1; }, - target:4 + target: 4, }, - threaten:2, - } + threaten: 2, + }, }, - xinjieyin:{ - group:['xinjieyin_old','xinjieyin_new'], + xinjieyin: { + group: ["xinjieyin_old", "xinjieyin_new"], // alter:true, - subSkill:{ - new:{ - audio:'jieyin', - enable:'phaseUse', - filterCard:true, - usable:1, - position:'he', - filter(event,player){ - if(!get.is.altered('xinjieyin')) return false; - return player.countCards('he')>0; + subSkill: { + new: { + audio: "jieyin", + enable: "phaseUse", + filterCard: true, + usable: 1, + position: "he", + filter(event, player) { + if (!get.is.altered("xinjieyin")) return false; + return player.countCards("he") > 0; }, - check(card){ - const player=_status.event.player; - if(get.position(card)=='e'){ - const subtype=get.subtype(card); - if(!game.hasPlayer(current=>{ - return current!=player&¤t.hp!=player.hp&&get.attitude(player,current)>0&&!current.countCards('e',{subtype}); - })){ + check(card) { + const player = _status.event.player; + if (get.position(card) == "e") { + const subtype = get.subtype(card); + if ( + !game.hasPlayer((current) => { + return ( + current != player && + current.hp != player.hp && + get.attitude(player, current) > 0 && + !current.countCards("e", { subtype }) + ); + }) + ) { return 0; } // 你还想我兼容{subtype:subtype}?不可能! - if(player.countCards('h',{subtype})) return 20-get.value(card); - return 10-get.value(card); - } - else{ - if(player.countCards('e')) return 0; - if(player.countCards('h',{type:'equip'})) return 0; - return 8-get.value(card); + if (player.countCards("h", { subtype })) return 20 - get.value(card); + return 10 - get.value(card); + } else { + if (player.countCards("e")) return 0; + if (player.countCards("h", { type: "equip" })) return 0; + return 8 - get.value(card); } }, - filterTarget(card,player,target){ - if(!target.hasSex('male')) return false; - card=ui.selected.cards[0]; - if(!card) return false; - if(get.position(card)=='e'&&target.countCards('e',{subtype:get.subtype(card)})) return false; + filterTarget(card, player, target) { + if (!target.hasSex("male")) return false; + card = ui.selected.cards[0]; + if (!card) return false; + if ( + get.position(card) == "e" && + target.countCards("e", { subtype: get.subtype(card) }) + ) + return false; return true; }, - discard:false, - delay:0, - lose:false, - async content(event,trigger,player){ - const {cards,target}=event; - if(get.position(cards[0])=='e'){ - player.$give(cards,target); + discard: false, + delay: 0, + lose: false, + async content(event, trigger, player) { + const { cards, target } = event; + if (get.position(cards[0]) == "e") { + player.$give(cards, target); target.equip(cards[0]); - } - else{ + } else { player.discard(cards); } - if(player.hp>target.hp){ + if (player.hp > target.hp) { player.draw(); - if(target.isDamaged()) target.recover(); - } - else if(player.hp{ - const es=player.getCards('e'); - for(let i=0;i { + const es = player.getCards("e"); + for (let i = 0; i < es.length; i++) { + if (player.countCards("h", { subtype: get.subtype(es[i]) })) + return true; } return false; - } - if(player.hptarget.hp){ - if(target.isHealthy()){ - if(!player.needsToDiscard(1)||goon()) return 0.1; + if (player.hp > target.hp) { + if (target.isHealthy()) { + if (!player.needsToDiscard(1) || goon()) return 0.1; return 0; } return 1; } return 0; - } - } - } + }, + }, + }, }, - old:{ - audio:'jieyin', - enable:'phaseUse', - filterCard:true, - usable:1, - selectCard:2, - filter(event,player){ - if(get.is.altered('xinjieyin')) return false; - return player.countCards('h')>=2; + old: { + audio: "jieyin", + enable: "phaseUse", + filterCard: true, + usable: 1, + selectCard: 2, + filter(event, player) { + if (get.is.altered("xinjieyin")) return false; + return player.countCards("h") >= 2; }, - check(card){ - const player=get.owner(card); - if(player.countCards('h')>player.hp) return 8-get.value(card); - if(player.hp player.hp) return 8 - get.value(card); + if (player.hp < player.maxHp) return 6 - get.value(card); + return 4 - get.value(card); }, - filterTarget(card,player,target){ - if(!target.hasSex('male')) return false; - if(target.hp>=target.maxHp) return false; - if(target==player) return false; + filterTarget(card, player, target) { + if (!target.hasSex("male")) return false; + if (target.hp >= target.maxHp) return false; + if (target == player) return false; return true; }, - async content(event,trigger,player){ + async content(event, trigger, player) { player.recover(); event.target.recover(); }, - ai:{ - order:5.5, - result:{ - player(player){ - if(player.hpplayer.hp) return 0 + ai: { + order: 5.5, + result: { + player(player) { + if (player.hp < player.maxHp) return 4; + if (player.countCards("h") > player.hp) return 0; return -1; }, - target:4 - } - } - } + target: 4, + }, + }, + }, + }, + ai: { + threaten: 2.3, }, - ai:{ - threaten:2.3 - } }, - qingnang:{ - audio:2, - enable:'phaseUse', - filterCard:true, - usable:1, - check(card){ - return 9-get.value(card); + qingnang: { + audio: 2, + enable: "phaseUse", + filterCard: true, + usable: 1, + check(card) { + return 9 - get.value(card); }, - filterTarget(card,player,target){ - if(target.hp>=target.maxHp) return false; + filterTarget(card, player, target) { + if (target.hp >= target.maxHp) return false; return true; }, - async content(event,trigger,player){ + async content(event, trigger, player) { event.target.recover(); }, - ai:{ - order:9, - result:{ - target(player,target){ - if(target.hp==1) return 5; - if(player==target&&player.countCards('h')>player.hp) return 5; + ai: { + order: 9, + result: { + target(player, target) { + if (target.hp == 1) return 5; + if (player == target && player.countCards("h") > player.hp) return 5; return 2; - } + }, }, - threaten:2 - } + threaten: 2, + }, }, - jijiu:{ - mod:{ - aiValue(player,card,num){ - if(get.name(card)!='tao'&&get.color(card)!='red') return; - const cards=player.getCards('hs',card=>get.name(card)=='tao'||get.color(card)=='red'); - cards.sort((a,b)=>(get.name(a)=='tao'?1:2)-(get.name(b)=='tao'?1:2)); - var geti=()=>{ - if(cards.includes(card)) cards.indexOf(card); + jijiu: { + mod: { + aiValue(player, card, num) { + if (get.name(card) != "tao" && get.color(card) != "red") return; + const cards = player.getCards( + "hs", + (card) => get.name(card) == "tao" || get.color(card) == "red" + ); + cards.sort((a, b) => (get.name(a) == "tao" ? 1 : 2) - (get.name(b) == "tao" ? 1 : 2)); + var geti = () => { + if (cards.includes(card)) cards.indexOf(card); return cards.length; }; - return Math.max(num,[6.5,4,3,2][Math.min(geti(),2)]); + return Math.max(num, [6.5, 4, 3, 2][Math.min(geti(), 2)]); }, - aiUseful(){ - return lib.skill.kanpo.mod.aiValue.apply(this,arguments); + aiUseful() { + return lib.skill.kanpo.mod.aiValue.apply(this, arguments); }, }, - locked:false, - audio:2, - audioname:['re_huatuo'], - enable:'chooseToUse', - viewAsFilter(player){ - return player!=_status.currentPhase&&player.countCards('hes',{color:'red'})>0; + locked: false, + audio: 2, + audioname: ["re_huatuo"], + enable: "chooseToUse", + viewAsFilter(player) { + return player != _status.currentPhase && player.countCards("hes", { color: "red" }) > 0; }, - filterCard(card){ - return get.color(card)=='red'; + filterCard(card) { + return get.color(card) == "red"; + }, + position: "hes", + viewAs: { name: "tao" }, + prompt: "将一张红色牌当桃使用", + check(card) { + return 15 - get.value(card); + }, + ai: { + threaten: 1.5, }, - position:'hes', - viewAs:{name:'tao'}, - prompt:'将一张红色牌当桃使用', - check(card){return 15-get.value(card)}, - ai:{ - threaten:1.5, - } }, - wushuang:{ - shaRelated:true, - audio:2, - audioname:['re_lvbu','shen_lvbu','lvlingqi'], - forced:true, - locked:true, - group:['wushuang1','wushuang2'], - preHidden:['wushuang1','wushuang2'], + wushuang: { + shaRelated: true, + audio: 2, + audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], + forced: true, + locked: true, + group: ["wushuang1", "wushuang2"], + preHidden: ["wushuang1", "wushuang2"], }, - wushuang1:{ - audio:'wushuang', - audioname:['re_lvbu','shen_lvbu','lvlingqi'], - trigger:{player:'useCardToPlayered'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'&&!event.getParent().directHit.includes(event.target); + wushuang1: { + audio: "wushuang", + audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], + trigger: { player: "useCardToPlayered" }, + forced: true, + filter(event, player) { + return event.card.name == "sha" && !event.getParent().directHit.includes(event.target); }, //priority:-1, - logTarget:'target', - async content(event,trigger,player){ - const id=trigger.target.playerid; - const map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number'){ + logTarget: "target", + async content(event, trigger, player) { + const id = trigger.target.playerid; + const map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { map[id].shanRequired++; - } - else{ - map[id].shanRequired=2; + } else { + map[id].shanRequired = 2; } }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(arg.card.name!='sha'||arg.target.countCards('h','shan')>1) return false; + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if (arg.card.name != "sha" || arg.target.countCards("h", "shan") > 1) return false; }, }, }, - wushuang2:{ - audio:'wushuang', - audioname:['re_lvbu','shen_lvbu','lvlingqi'], - trigger:{player:'useCardToPlayered',target:'useCardToTargeted'}, - forced:true, - logTarget(trigger,player){ - return player==trigger.player?trigger.target:trigger.player + wushuang2: { + audio: "wushuang", + audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], + trigger: { player: "useCardToPlayered", target: "useCardToTargeted" }, + forced: true, + logTarget(trigger, player) { + return player == trigger.player ? trigger.target : trigger.player; }, - filter(event,player){ - return event.card.name=='juedou'; + filter(event, player) { + return event.card.name == "juedou"; }, //priority:-1, - async content(event,trigger,player){ - const id=(player==trigger.player?trigger.target:trigger.player)['playerid']; - const idt=trigger.target.playerid; - const map=trigger.getParent().customArgs; - if(!map[idt]) map[idt]={}; - if(!map[idt].shaReq) map[idt].shaReq={}; - if(!map[idt].shaReq[id]) map[idt].shaReq[id]=1; + async content(event, trigger, player) { + const id = (player == trigger.player ? trigger.target : trigger.player)["playerid"]; + const idt = trigger.target.playerid; + const map = trigger.getParent().customArgs; + if (!map[idt]) map[idt] = {}; + if (!map[idt].shaReq) map[idt].shaReq = {}; + if (!map[idt].shaReq[id]) map[idt].shaReq[id] = 1; map[idt].shaReq[id]++; }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(arg.card.name!='juedou'||Math.floor(arg.target.countCards('h','sha')/2)>player.countCards('h','sha')) return false; - } - } - }, - zhanshen:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - skillAnimation:true, - animationColor:'gray', - filter(event,player){ - return player.isDamaged()&&game.dead.filter(target=>target.isFriendOf(player)).length>0 - }, - async content(event,trigger,player){ - player.awakenSkill('zhanshen'); - const cards=player.getEquips(1); - if(cards.length) player.discard(cards); - player.loseMaxHp(); - player.addSkills(['mashu','shenji']); - }, - derivation:['mashu','shenji'], - }, - shenji:{ - mod:{ - selectTarget(card,player,range){ - if(range[1]==-1) return; - if(card.name=='sha') range[1]+=2; + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if ( + arg.card.name != "juedou" || + Math.floor(arg.target.countCards("h", "sha") / 2) > player.countCards("h", "sha") + ) + return false; }, - cardUsable(card,player,num){ - if(card.name=='sha') return num+1; - } }, }, - lijian:{ - audio:2, - audioname:['re_diaochan'], - enable:'phaseUse', - usable:1, - filter(event,player){ - return game.countPlayer(current=>current!=player&¤t.hasSex('male'))>1; + zhanshen: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + skillAnimation: true, + animationColor: "gray", + filter(event, player) { + return ( + player.isDamaged() && + game.dead.filter((target) => target.isFriendOf(player)).length > 0 + ); }, - check(card){return 10-get.value(card)}, - filterCard:true, - position:'he', - filterTarget(card,player,target){ - if(player==target) return false; - if(!target.hasSex('male')) return false; - if(ui.selected.targets.length==1){ - return target.canUse({name:'juedou'},ui.selected.targets[0]); + async content(event, trigger, player) { + player.awakenSkill("zhanshen"); + const cards = player.getEquips(1); + if (cards.length) player.discard(cards); + player.loseMaxHp(); + player.addSkills(["mashu", "shenji"]); + }, + derivation: ["mashu", "shenji"], + }, + shenji: { + mod: { + selectTarget(card, player, range) { + if (range[1] == -1) return; + if (card.name == "sha") range[1] += 2; + }, + cardUsable(card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + lijian: { + audio: 2, + audioname: ["re_diaochan"], + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.countPlayer((current) => current != player && current.hasSex("male")) > 1; + }, + check(card) { + return 10 - get.value(card); + }, + filterCard: true, + position: "he", + filterTarget(card, player, target) { + if (player == target) return false; + if (!target.hasSex("male")) return false; + if (ui.selected.targets.length == 1) { + return target.canUse({ name: "juedou" }, ui.selected.targets[0]); } return true; }, - targetprompt:['先出杀','后出杀'], - selectTarget:2, - multitarget:true, - async content(event,trigger,player){ - const useCardEvent=event.targets[1].useCard({name:'juedou',isCard:true},'nowuxie',event.targets[0],'noai'); - useCardEvent.animate=false; + targetprompt: ["先出杀", "后出杀"], + selectTarget: 2, + multitarget: true, + async content(event, trigger, player) { + const useCardEvent = event.targets[1].useCard( + { name: "juedou", isCard: true }, + "nowuxie", + event.targets[0], + "noai" + ); + useCardEvent.animate = false; game.asyncDelay(0.5); }, - ai:{ - order:8, - result:{ - target(player,target){ - if(ui.selected.targets.length==0){ + ai: { + order: 8, + result: { + target(player, target) { + if (ui.selected.targets.length == 0) { return -3; + } else { + return get.effect(target, { name: "juedou" }, ui.selected.targets[0], target); } - else{ - return get.effect(target,{name:'juedou'},ui.selected.targets[0],target); - } - } + }, }, - expose:0.4, - threaten:3, - } + expose: 0.4, + threaten: 3, + }, }, - biyue:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - preHidden:true, - async content(event,trigger,player){ + biyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + preHidden: true, + async content(event, trigger, player) { player.draw(); }, }, - xinbiyue:{ - audio:'biyue', - trigger:{player:'phaseJieshuBegin'}, - frequent:true, + xinbiyue: { + audio: "biyue", + trigger: { player: "phaseJieshuBegin" }, + frequent: true, // alter:true, - async content(event,trigger,player){ + async content(event, trigger, player) { player.draw(); }, }, - yaowu:{ - trigger:{player:'damageBegin3'}, + yaowu: { + trigger: { player: "damageBegin3" }, //priority:1, - audio:2, - filter(event){ - if(event.card&&(event.card.name=='sha')){ - if(get.color(event.card)=='red') return true; + audio: 2, + filter(event) { + if (event.card && event.card.name == "sha") { + if (get.color(event.card) == "red") return true; } return false; }, - forced:true, - check(){return false;}, - async content(event,trigger,player){ + forced: true, + check() { + return false; + }, + async content(event, trigger, player) { trigger.source.chooseDrawRecover(true); }, - ai:{ - effect:{ - target(card,player,target,current){ - if(card.name=='sha'&&(get.color(card)=='red')){ - return [1,-2]; + ai: { + effect: { + target(card, player, target, current) { + if (card.name == "sha" && get.color(card) == "red") { + return [1, -2]; } - } - } - } + }, + }, + }, }, - "new_jiangchi":{ - audio:2, - trigger:{ - player:"phaseDrawEnd", + new_jiangchi: { + audio: 2, + trigger: { + player: "phaseDrawEnd", }, - async cost(event,trigger,player){ - const list=['弃牌','摸牌','cancel2']; - if(!player.countCards('he')) list.remove('弃牌'); - const control=await player.chooseControl(list,()=>{ - const player=_status.event.player; - if(list.includes('弃牌')){ - if(player.countCards('h')>3&&player.countCards('h','sha')>1){ - return '弃牌'; + async cost(event, trigger, player) { + const list = ["弃牌", "摸牌", "cancel2"]; + if (!player.countCards("he")) list.remove("弃牌"); + const control = await player + .chooseControl(list, () => { + const player = _status.event.player; + if (list.includes("弃牌")) { + if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { + return "弃牌"; + } + if (player.countCards("h", "sha") > 2) { + return "弃牌"; + } } - if(player.countCards('h','sha')>2){ - return '弃牌'; + if (!player.countCards("h", "sha")) { + return "摸牌"; } - } - if(!player.countCards('h','sha')){ - return '摸牌'; - } - return 'cancel2'; - }) - .set('prompt',get.prompt2('new_jiangchi')) - .forResultControl(); - if (control === 'cancel2') event.result = {bool: false}; - else event.result = { - bool: true, - cost_data: control - }; + return "cancel2"; + }) + .set("prompt", get.prompt2("new_jiangchi")) + .forResultControl(); + if (control === "cancel2") event.result = { bool: false }; + else + event.result = { + bool: true, + cost_data: control, + }; }, - async content(event,trigger,player){ + async content(event, trigger, player) { const control = event.cost_data; - if(control=='弃牌'){ - player.chooseToDiscard(true,'he'); - player.addTempSkill('jiangchi2','phaseUseEnd'); - } - else if(control=='摸牌'){ + if (control == "弃牌") { + player.chooseToDiscard(true, "he"); + player.addTempSkill("jiangchi2", "phaseUseEnd"); + } else if (control == "摸牌") { player.draw(); - player.addTempSkill('new_jiangchi3','phaseEnd'); + player.addTempSkill("new_jiangchi3", "phaseEnd"); } }, }, - new_jiangchi3:{ - mod:{ - cardEnabled(card){ - if(card.name=='sha') return false; + new_jiangchi3: { + mod: { + cardEnabled(card) { + if (card.name == "sha") return false; }, - cardRespondable(card){ - if(card.name=='sha') return false; + cardRespondable(card) { + if (card.name == "sha") return false; }, - ignoredHandcard(card,player){ - if(get.name(card)=='sha') return true; + ignoredHandcard(card, player) { + if (get.name(card) == "sha") return true; }, - cardDiscardable(card,player,name){ - if(name=='phaseDiscard'&&get.name(card)=='sha') return false; + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") return false; }, }, }, - xinfu_jijie:{ - enable:"phaseUse", - usable:1, - audio:2, - async content(event,trigger,player){ - const card=get.bottomCards()[0]; + xinfu_jijie: { + enable: "phaseUse", + usable: 1, + audio: 2, + async content(event, trigger, player) { + const card = get.bottomCards()[0]; game.cardsGotoOrdering(card); - event.card=card; - const {result:{bool,targets}}=await player.chooseTarget(true).set('ai',target=>{ - let att=get.attitude(_status.event.player,target); - if(_status.event.du){ - if(target.hasSkillTag('nodu')) return 0.5; - return -att; - } - if(att>0){ - if(_status.event.player!=target) att+=2; - return att+Math.max(0,5-target.countCards('h')); - } - return att; - }).set('du',event.card.name=='du').set('createDialog',[ - '机捷:选择一名角色获得此牌', - [card] - ]); - if(bool){ - const target=targets[0]; - player.line(target,'green'); - const gainEvent=target.gain(card,'draw'); - gainEvent.giver=player; + event.card = card; + const { + result: { bool, targets }, + } = await player + .chooseTarget(true) + .set("ai", (target) => { + let att = get.attitude(_status.event.player, target); + if (_status.event.du) { + if (target.hasSkillTag("nodu")) return 0.5; + return -att; + } + if (att > 0) { + if (_status.event.player != target) att += 2; + return att + Math.max(0, 5 - target.countCards("h")); + } + return att; + }) + .set("du", event.card.name == "du") + .set("createDialog", ["机捷:选择一名角色获得此牌", [card]]); + if (bool) { + const target = targets[0]; + player.line(target, "green"); + const gainEvent = target.gain(card, "draw"); + gainEvent.giver = player; } }, - ai:{ - order:7.2, - result:{ - player:1, + ai: { + order: 7.2, + result: { + player: 1, }, }, }, - xinfu_jiyuan:{ - trigger:{ - global:['dying','gainAfter','loseAsyncAfter'], + xinfu_jiyuan: { + trigger: { + global: ["dying", "gainAfter", "loseAsyncAfter"], }, - audio:2, - getIndex:function(event, player){ - if (event.name !== 'loseAsync') return [event.player]; - else return game.filterPlayer(current => current != player && event.getg(current).length > 0).sortBySeat(); + audio: 2, + getIndex: function (event, player) { + if (event.name !== "loseAsync") return [event.player]; + else + return game + .filterPlayer((current) => current != player && event.getg(current).length > 0) + .sortBySeat(); }, - filter(event, player, triggername, target){ + filter(event, player, triggername, target) { if (!target.isIn()) return false; - if (event.name === 'dying') return true; + if (event.name === "dying") return true; if (event.giver !== player) return false; - if (event.name === 'gain') { - return event.player!=player&&event.getg(target).length>0; + if (event.name === "gain") { + return event.player != player && event.getg(target).length > 0; } - return game.hasPlayer(current=>current!=player&&event.getg(current).length>0); + return game.hasPlayer((current) => current != player && event.getg(current).length > 0); }, - logTarget(event, player, triggername, target){ + logTarget(event, player, triggername, target) { return target; }, - check(event, player, triggername, target){ - return get.attitude(player,target) > 0; + check(event, player, triggername, target) { + return get.attitude(player, target) > 0; }, - async content(event, trigger, player){ + async content(event, trigger, player) { event.targets[0].draw(); }, }, }, - characterReplace:{ - caocao:['caocao','re_caocao','sb_caocao','dc_caocao'], - guojia:['guojia','re_guojia','ps1059_guojia','ps2070_guojia'], - simayi:['simayi','re_simayi','jsrg_simayi','ps_simayi','ps2068_simayi'], - jin_simayi:['jin_simayi','junk_simayi','ps_jin_simayi'], - zhenji:['zhenji','re_zhenji','sb_zhenji','yj_zhenji'], - xuzhu:['xuzhu','re_xuzhu'], - zhangliao:['zhangliao','re_zhangliao'], - sp_zhangliao:['sp_zhangliao','yj_zhangliao','jsrg_zhangliao'], - xiahoudun:['xiahoudun','re_xiahoudun','xin_xiahoudun','sb_xiahoudun'], - liubei:['liubei','re_liubei','sb_liubei','dc_liubei','junk_liubei'], - guanyu:['guanyu','re_guanyu','ol_sb_guanyu','sb_guanyu','ps_guanyu','old_guanyu','junk_guanyu'], - zhangfei:['zhangfei','re_zhangfei','old_zhangfei','xin_zhangfei','sb_zhangfei','tw_zhangfei','jsrg_zhangfei','yj_zhangfei'], - zhaoyun:['zhaoyun','re_zhaoyun','old_zhaoyun','sb_zhaoyun','jsrg_zhaoyun','ps2063_zhaoyun','ps2067_zhaoyun'], - sp_zhaoyun:['sp_zhaoyun','jsp_zhaoyun'], - machao:['machao','re_machao','sb_machao','ps_machao'], - sp_machao:['sp_machao','dc_sp_machao','jsrg_machao','old_machao'], - zhugeliang:['zhugeliang','re_zhugeliang','sb_zhugeliang','ps2066_zhugeliang','ps_zhugeliang'], - huangyueying:['huangyueying','re_huangyueying','junk_huangyueying','sb_huangyueying'], - sunquan:['sunquan','re_sunquan','sb_sunquan','dc_sunquan'], - zhouyu:['zhouyu','re_zhouyu','dc_sb_zhouyu','sb_zhouyu','ps1062_zhouyu','ps2080_zhouyu'], - luxun:['luxun','re_luxun','jsrg_luxun'], - lvmeng:['lvmeng','re_lvmeng','sb_lvmeng'], - huanggai:['huanggai','re_huanggai','sb_huanggai'], - daqiao:['daqiao','re_daqiao','sb_daqiao'], - sunshangxiang:['sunshangxiang','re_sunshangxiang','sb_sunshangxiang','jsrg_sunshangxiang'], - ganning:['ganning','re_ganning','sb_ganning','yongjian_ganning'], - yj_ganning:['yj_ganning','sp_ganning'], - lvbu:['lvbu','re_lvbu','jsrg_lvbu','ps_lvbu'], - diaochan:['diaochan','re_diaochan','sb_diaochan'], - huatuo:['huatuo','re_huatuo','old_huatuo'], - huaxiong:['huaxiong','re_huaxiong','old_huaxiong','sb_huaxiong','ol_huaxiong'], - yuanshu:['yuanshu','re_yuanshu','yl_yuanshu','old_yuanshu','ol_yuanshu','star_yuanshu'], - gongsunzan:['gongsunzan','re_gongsunzan','dc_gongsunzan','xin_gongsunzan'], - re_lidian:['re_lidian','old_re_lidian','junk_lidian'], + characterReplace: { + caocao: ["caocao", "re_caocao", "sb_caocao", "dc_caocao"], + guojia: ["guojia", "re_guojia", "ps1059_guojia", "ps2070_guojia"], + simayi: ["simayi", "re_simayi", "jsrg_simayi", "ps_simayi", "ps2068_simayi"], + jin_simayi: ["jin_simayi", "junk_simayi", "ps_jin_simayi"], + zhenji: ["zhenji", "re_zhenji", "sb_zhenji", "yj_zhenji"], + xuzhu: ["xuzhu", "re_xuzhu"], + zhangliao: ["zhangliao", "re_zhangliao"], + sp_zhangliao: ["sp_zhangliao", "yj_zhangliao", "jsrg_zhangliao"], + xiahoudun: ["xiahoudun", "re_xiahoudun", "xin_xiahoudun", "sb_xiahoudun"], + liubei: ["liubei", "re_liubei", "sb_liubei", "dc_liubei", "junk_liubei"], + guanyu: [ + "guanyu", + "re_guanyu", + "ol_sb_guanyu", + "sb_guanyu", + "ps_guanyu", + "old_guanyu", + "junk_guanyu", + ], + zhangfei: [ + "zhangfei", + "re_zhangfei", + "old_zhangfei", + "xin_zhangfei", + "sb_zhangfei", + "tw_zhangfei", + "jsrg_zhangfei", + "yj_zhangfei", + ], + zhaoyun: [ + "zhaoyun", + "re_zhaoyun", + "old_zhaoyun", + "sb_zhaoyun", + "jsrg_zhaoyun", + "ps2063_zhaoyun", + "ps2067_zhaoyun", + ], + sp_zhaoyun: ["sp_zhaoyun", "jsp_zhaoyun"], + machao: ["machao", "re_machao", "sb_machao", "ps_machao"], + sp_machao: ["sp_machao", "dc_sp_machao", "jsrg_machao", "old_machao"], + zhugeliang: [ + "zhugeliang", + "re_zhugeliang", + "sb_zhugeliang", + "ps2066_zhugeliang", + "ps_zhugeliang", + ], + huangyueying: ["huangyueying", "re_huangyueying", "junk_huangyueying", "sb_huangyueying"], + sunquan: ["sunquan", "re_sunquan", "sb_sunquan", "dc_sunquan"], + zhouyu: ["zhouyu", "re_zhouyu", "dc_sb_zhouyu", "sb_zhouyu", "ps1062_zhouyu", "ps2080_zhouyu"], + luxun: ["luxun", "re_luxun", "jsrg_luxun"], + lvmeng: ["lvmeng", "re_lvmeng", "sb_lvmeng"], + huanggai: ["huanggai", "re_huanggai", "sb_huanggai"], + daqiao: ["daqiao", "re_daqiao", "sb_daqiao"], + sunshangxiang: ["sunshangxiang", "re_sunshangxiang", "sb_sunshangxiang", "jsrg_sunshangxiang"], + ganning: ["ganning", "re_ganning", "sb_ganning", "yongjian_ganning"], + yj_ganning: ["yj_ganning", "sp_ganning"], + lvbu: ["lvbu", "re_lvbu", "jsrg_lvbu", "ps_lvbu"], + diaochan: ["diaochan", "re_diaochan", "sb_diaochan"], + huatuo: ["huatuo", "re_huatuo", "old_huatuo"], + huaxiong: ["huaxiong", "re_huaxiong", "old_huaxiong", "sb_huaxiong", "ol_huaxiong"], + yuanshu: ["yuanshu", "re_yuanshu", "yl_yuanshu", "old_yuanshu", "ol_yuanshu", "star_yuanshu"], + gongsunzan: ["gongsunzan", "re_gongsunzan", "dc_gongsunzan", "xin_gongsunzan"], + re_lidian: ["re_lidian", "old_re_lidian", "junk_lidian"], }, - translate:{ - caocao:'曹操', - hujia:'护驾', - hujia_info:'主公技,当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。', - jianxiong:'奸雄', - jianxiong_info:'当你受到伤害后,你可以获得对你造成伤害的牌。', + translate: { + caocao: "曹操", + hujia: "护驾", + hujia_info: + "主公技,当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。", + jianxiong: "奸雄", + jianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌。", - simayi:'司马懿', - fankui:'反馈', - fankui_info:'当你受到伤害后,你可以获得伤害来源的一张牌。', - guicai:'鬼才', - guicai_info:'一名角色的判定牌生效前,你可以打出一张手牌代替之。', - guicai_info_guozhan:'一名角色的判定牌生效前,你可以打出一张牌代替之。', + simayi: "司马懿", + fankui: "反馈", + fankui_info: "当你受到伤害后,你可以获得伤害来源的一张牌。", + guicai: "鬼才", + guicai_info: "一名角色的判定牌生效前,你可以打出一张手牌代替之。", + guicai_info_guozhan: "一名角色的判定牌生效前,你可以打出一张牌代替之。", - xiahoudun:'夏侯惇', - zhangliao:'张辽', - xuzhu:'许褚', - guojia:'郭嘉', - zhenji:'甄宓', - liubei:'刘备', - guanyu:'关羽', - zhangfei:'张飞', - zhugeliang:'诸葛亮', - zhaoyun:'赵云', - machao:'马超', - huangyueying:'黄月英', - sunquan:'孙权', - ganning:'甘宁', - lvmeng:'吕蒙', - huanggai:'黄盖', - zhouyu:'周瑜', - daqiao:'大乔', - luxun:'陆逊', - sunshangxiang:'孙尚香', - huatuo:'华佗', - lvbu:'吕布', - diaochan:'貂蝉', - huaxiong:'华雄', - "xf_yiji":"伊籍", - re_yuanshu:'袁术', - caozhang:'曹彰', + xiahoudun: "夏侯惇", + zhangliao: "张辽", + xuzhu: "许褚", + guojia: "郭嘉", + zhenji: "甄宓", + liubei: "刘备", + guanyu: "关羽", + zhangfei: "张飞", + zhugeliang: "诸葛亮", + zhaoyun: "赵云", + machao: "马超", + huangyueying: "黄月英", + sunquan: "孙权", + ganning: "甘宁", + lvmeng: "吕蒙", + huanggai: "黄盖", + zhouyu: "周瑜", + daqiao: "大乔", + luxun: "陆逊", + sunshangxiang: "孙尚香", + huatuo: "华佗", + lvbu: "吕布", + diaochan: "貂蝉", + huaxiong: "华雄", + xf_yiji: "伊籍", + re_yuanshu: "袁术", + caozhang: "曹彰", - ganglie:'刚烈', - tuxi:'突袭', - luoyi:'裸衣', - luoyi2:'裸衣', - tiandu:'天妒', - yiji:'遗计', - luoshen:'洛神', - xinluoshen:'洛神', - qingguo:'倾国', - rende:'仁德', - jijiang:'激将', - jijiang1:'激将', - jijiang2:'激将', - wusheng:'武圣', - paoxiao:'咆哮', - guanxing:'观星', - kongcheng:'空城', - kongcheng1:'空城', - longdan:'龙胆', - longdan1:'龙胆', - longdan2:'龙胆', - mashu:'马术', - mashu2:'马术', - feiying:'飞影', - tieji:'铁骑', - jizhi:'集智', - qicai:'奇才', - zhiheng:'制衡', - jiuyuan:'救援', - qixi:'奇袭', - keji:'克己', - kurou:'苦肉', - yingzi:'英姿', - fanjian:'反间', - guose:'国色', - liuli:'流离', - qianxun:'谦逊', - lianying:'连营', - xiaoji:'枭姬', - jieyin:'结姻', - xinjieyin:'结姻', - qingnang:'青囊', - jijiu:'急救', - wushuang:'无双', - wushuang1:'无双', - wushuang2:'无双', - lijian:'离间', - biyue:'闭月', - xinbiyue:'闭月', - pileTop:'牌堆顶', - pileBottom:'牌堆底', - ganglie_info:'当你受到伤害后,你可以判定。若结果不为红桃,则伤害来源须弃置两张手牌,否则受到来自你的1点伤害。', - tuxi_info:'摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。', - luoyi_info:'摸牌阶段,你可以少摸一张牌。若如此做,当你本回合内使用【杀】或【决斗】造成伤害时,此伤害+1。', - tiandu_info:'当你的判定牌生效后,你可以获得之。', - yiji_info:'当你受到1点伤害后,你可以观看牌堆顶的两张牌,然后将其分配给任意角色。', - luoshen_info:'准备阶段,你可以判定。若结果为黑色,你获得判定牌。你可重复此流程,直到出现红色的判定结果。', - luoshen_info_guozhan:'准备阶段,你可以判定。若结果为黑色,则可以继续判定,直到出现红色的判定牌。然后你获得所有黑色的判定牌。(判定结果为黑色的牌在此过程中不会进入弃牌堆)', - xinluoshen_info:'准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。', - xinluoshen_info_alter:'准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过洛神获得的牌,不计入当前回合的手牌上限。', - qingguo_info:'你可以将一张黑色手牌当做【闪】使用或打出。', - rende_info:'出牌阶段,你可以将任意张手牌交给其他角色。当你以此法于一回合内给出第二张牌时,你回复1点体力。', - jijiang_info:'主公技,当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。', - wusheng_info:'你可以将一张红色牌当做【杀】使用或打出。', - paoxiao_info:'锁定技,出牌阶段,你使用【杀】没有数量限制。', - guanxing_info:'准备阶段,你可以观看牌堆顶的X张牌,并将其以任意顺序置于牌堆项或牌堆底。(X为存活角色数且至多为5)', - kongcheng_info:'锁定技,当你没有手牌时,你不能成为【杀】或【决斗】的目标。', - longdan_info:'你可以将【杀】当做【闪】,或将【闪】当做【杀】使用或打出。', - mashu_info:'锁定技,你计算与其他角色的距离时-1。', - mashu2_info:'锁定技,你计算与其他角色的距离时-1。', - feiying_info:'锁定技,其他角色计算与你的距离时+1。', - tieji_info:'当你使用【杀】指定目标后,你可以进行判定。若结果为红色,则此【杀】不可被闪避。', - jizhi_info:'当你使用非转化的普通锦囊牌时,你可以摸一张牌。', - xinjizhi:'集智', - xinjizhi_info:'当你使用非转化的普通锦囊牌时,你可以摸一张牌。', - xinjizhi_info_alter:'每当你使用一张非转化的锦囊牌,可以摸一张牌,如果摸到的是基本牌,你可以弃置这张牌,然后本回合手牌上限+1。', - xinqicai:'奇才', - xinqicai_info:'锁定技,你使用锦囊牌无距离限制。', - xinqicai_info_alter:'锁定技,你使用的锦囊牌无距离限制,你装备区内的牌不能被弃置。', - qicai_info:'锁定技,你使用锦囊牌无距离限制。', - zhiheng_info:'出牌阶段限一次,你可以弃置任意张牌,然后摸等量的牌。', - xinzhiheng:'制衡', - xinzhiheng_info:'出牌阶段限1次,你可以弃置任意张牌并摸等量的牌。', - xinzhiheng_info_alter:'出牌阶段限1次,你可以弃置任意张牌并摸等量的牌,如果在发动制衡时弃置了所有手牌,你额外摸一张牌。', - jiuyuan_info:'主公技,锁定技,其他吴势力角色对你使用的【桃】的回复值+1。', - xinjiuyuan:'救援', - xinjiuyuan_info:'主公技,锁定技,濒死阶段,吴势力角色对你使用的[桃]额外回复1点体力。', - xinjiuyuan_info_alter:'主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,其可以令你回复1点体力,然后其摸一张牌。', - qixi_info:'你可以将一张黑色牌当做【过河拆桥】使用。', - keji_info:'弃牌阶段开始时,若你于本回合的出牌阶段内没有过使用或打出过【杀】,则你可以跳过此阶段。', - kurou_info:'出牌阶段,你可以失去1点体力,然后摸两张牌。', - yingzi_info:'摸牌阶段,你可以多摸一张牌。', - fanjian_info:'出牌阶段限一次。你可以令一名角色选择一种花色,然后其获得你的一张手牌。若其以此法选择的花色与其得到的牌花色不同,则你对其造成1点伤害。', - guose_info:'你可以将一张方片牌当做【乐不思蜀】使用。', - liuli_info:'当你成为【杀】的目标时,你可以弃置一张牌并将此【杀】转移给攻击范围内的一名其他角色(不能是此【杀】的使用者)。', - qianxun_info:'锁定技,你不能成为【顺手牵羊】和【乐不思蜀】的目标。', - lianying_info:'当你失去最后的手牌时,你可以摸一张牌。', - xiaoji_info:'当你失去一张装备区内的牌后,你可以摸两张牌。', - jieyin_info:'出牌阶段限一次,你可以弃置两张手牌并选择一名已经受伤的男性角色。你与其各回复1点体力。', - xinjieyin_info:'出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。', - xinjieyin_old_info:'出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。', - xinjieyin_new_info:'出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。', - xinjieyin_info_alter:'出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。', - qingnang_info:'出牌阶段限一次,你可以弃置一张手牌并令一名角色回复1点体力。', - jijiu_info:'你的回合外,你可以将一张红色牌当做【桃】使用。', - wushuang_info:'锁定技,当你使用【杀】或【决斗】指定目标后,你令此牌需要依次使用或打出两张【闪】或【杀】响应。', - lijian_info:'出牌阶段限一次,你可以弃置一张牌,视为一名男性角色对另一名男性角色使用一张【决斗】(不可被【无懈可击】响应)。', - biyue_info:'结束阶段,你可以摸一张牌。', - xinbiyue_info:'结束阶段,你可以摸一张牌。', - xinbiyue_info_alter:'结束阶段,你可以摸一张牌,如果你没有手牌,改为摸两张牌。', - yaowu:'耀武', - yaowu_info:'锁定技,一名角色使用红色【杀】对你造成伤害时,该角色回复1点体力或摸一张牌。', - "new_jiangchi":"将驰", - "new_jiangchi_info":"摸牌阶段结束时,你可以选择一项:1、摸一张牌,若如此做,你本回合内不能使用或打出【杀】且【杀】不计入手牌上限。 2、弃置一张牌,若如此做,出牌阶段你使用【杀】无距离限制且你可以额外使用一张【杀】,直到回合结束。", - xinfu_jijie:"机捷", - xinfu_jijie_info:"出牌阶段限一次。你可以观看牌堆底的一张牌,然后将其交给一名角色。", - xinfu_jiyuan:"急援", - xinfu_jiyuan_info:"当有角色进入濒死状态时,或你将牌交给一名其他角色后,你可以令该角色摸一张牌。", - ganglie_three:'刚烈', - ganglie_three_info:'当你受到伤害后,你可令一名敌方角色判定。若结果不为♥,其弃置两张牌或受到来自你的1点伤害。', - zhongyi:'忠义', - zhongyi2:'忠义', - zhongyi_info:'限定技,出牌阶段,你可以将一张牌置于武将牌上。你的武将牌上有〖忠义〗牌时,己方角色使用【杀】造成的伤害+1。下轮游戏开始时,你将〖忠义〗牌置入弃牌堆。', - zhanshen:'战神', - zhanshen_info:'觉醒技,准备阶段,若场上有已死亡的其他己方角色且你已受伤,则你弃置装备区的武器牌,减1点体力上限,获得技能〖马术〗和〖神戟〗。', - shenji:'神戟', - shenji_info:'锁定技,你使用【杀】指定的目标数上限+2,次数上限+1。', - rewangzun:'妄尊', - rewangzun2:'妄尊', - rewangzun_info:'锁定技,一名其他角色的准备阶段开始时,若其体力值大于你,你摸一张牌。然后若其身份为主公/主帅/君主/地主且明置,则你摸一张牌,且其本回合的手牌上限-1。', - retongji:'同疾', - retongji_info:'攻击范围内包含你的角色成为【杀】的目标时,若你不是此【杀】的使用者或目标,其可弃置一张牌,然后将此【杀】转移给你。', - std_panfeng:'潘凤', - stdkuangfu:'狂斧', - stdkuangfu_info:'锁定技。出牌阶段限一次。当你使用【杀】对其他角色造成伤害后,若其体力值:小于你,你摸两张牌;不小于你,你失去1点体力。', - ganfuren:'甘夫人', - stdshushen:'淑慎', - stdshushen_info:'当你回复1点体力时,你可以令一名其他角色摸一张牌(若其没有手牌则改为摸两张牌)。', - old_re_lidian:'李典', + ganglie: "刚烈", + tuxi: "突袭", + luoyi: "裸衣", + luoyi2: "裸衣", + tiandu: "天妒", + yiji: "遗计", + luoshen: "洛神", + xinluoshen: "洛神", + qingguo: "倾国", + rende: "仁德", + jijiang: "激将", + jijiang1: "激将", + jijiang2: "激将", + wusheng: "武圣", + paoxiao: "咆哮", + guanxing: "观星", + kongcheng: "空城", + kongcheng1: "空城", + longdan: "龙胆", + longdan1: "龙胆", + longdan2: "龙胆", + mashu: "马术", + mashu2: "马术", + feiying: "飞影", + tieji: "铁骑", + jizhi: "集智", + qicai: "奇才", + zhiheng: "制衡", + jiuyuan: "救援", + qixi: "奇袭", + keji: "克己", + kurou: "苦肉", + yingzi: "英姿", + fanjian: "反间", + guose: "国色", + liuli: "流离", + qianxun: "谦逊", + lianying: "连营", + xiaoji: "枭姬", + jieyin: "结姻", + xinjieyin: "结姻", + qingnang: "青囊", + jijiu: "急救", + wushuang: "无双", + wushuang1: "无双", + wushuang2: "无双", + lijian: "离间", + biyue: "闭月", + xinbiyue: "闭月", + pileTop: "牌堆顶", + pileBottom: "牌堆底", + ganglie_info: + "当你受到伤害后,你可以判定。若结果不为红桃,则伤害来源须弃置两张手牌,否则受到来自你的1点伤害。", + tuxi_info: "摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。", + luoyi_info: + "摸牌阶段,你可以少摸一张牌。若如此做,当你本回合内使用【杀】或【决斗】造成伤害时,此伤害+1。", + tiandu_info: "当你的判定牌生效后,你可以获得之。", + yiji_info: "当你受到1点伤害后,你可以观看牌堆顶的两张牌,然后将其分配给任意角色。", + luoshen_info: + "准备阶段,你可以判定。若结果为黑色,你获得判定牌。你可重复此流程,直到出现红色的判定结果。", + luoshen_info_guozhan: + "准备阶段,你可以判定。若结果为黑色,则可以继续判定,直到出现红色的判定牌。然后你获得所有黑色的判定牌。(判定结果为黑色的牌在此过程中不会进入弃牌堆)", + xinluoshen_info: + "准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。", + xinluoshen_info_alter: + "准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过洛神获得的牌,不计入当前回合的手牌上限。", + qingguo_info: "你可以将一张黑色手牌当做【闪】使用或打出。", + rende_info: + "出牌阶段,你可以将任意张手牌交给其他角色。当你以此法于一回合内给出第二张牌时,你回复1点体力。", + jijiang_info: + "主公技,当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。", + wusheng_info: "你可以将一张红色牌当做【杀】使用或打出。", + paoxiao_info: "锁定技,出牌阶段,你使用【杀】没有数量限制。", + guanxing_info: + "准备阶段,你可以观看牌堆顶的X张牌,并将其以任意顺序置于牌堆项或牌堆底。(X为存活角色数且至多为5)", + kongcheng_info: "锁定技,当你没有手牌时,你不能成为【杀】或【决斗】的目标。", + longdan_info: "你可以将【杀】当做【闪】,或将【闪】当做【杀】使用或打出。", + mashu_info: "锁定技,你计算与其他角色的距离时-1。", + mashu2_info: "锁定技,你计算与其他角色的距离时-1。", + feiying_info: "锁定技,其他角色计算与你的距离时+1。", + tieji_info: "当你使用【杀】指定目标后,你可以进行判定。若结果为红色,则此【杀】不可被闪避。", + jizhi_info: "当你使用非转化的普通锦囊牌时,你可以摸一张牌。", + xinjizhi: "集智", + xinjizhi_info: "当你使用非转化的普通锦囊牌时,你可以摸一张牌。", + xinjizhi_info_alter: + "每当你使用一张非转化的锦囊牌,可以摸一张牌,如果摸到的是基本牌,你可以弃置这张牌,然后本回合手牌上限+1。", + xinqicai: "奇才", + xinqicai_info: "锁定技,你使用锦囊牌无距离限制。", + xinqicai_info_alter: "锁定技,你使用的锦囊牌无距离限制,你装备区内的牌不能被弃置。", + qicai_info: "锁定技,你使用锦囊牌无距离限制。", + zhiheng_info: "出牌阶段限一次,你可以弃置任意张牌,然后摸等量的牌。", + xinzhiheng: "制衡", + xinzhiheng_info: "出牌阶段限1次,你可以弃置任意张牌并摸等量的牌。", + xinzhiheng_info_alter: + "出牌阶段限1次,你可以弃置任意张牌并摸等量的牌,如果在发动制衡时弃置了所有手牌,你额外摸一张牌。", + jiuyuan_info: "主公技,锁定技,其他吴势力角色对你使用的【桃】的回复值+1。", + xinjiuyuan: "救援", + xinjiuyuan_info: "主公技,锁定技,濒死阶段,吴势力角色对你使用的[桃]额外回复1点体力。", + xinjiuyuan_info_alter: + "主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,其可以令你回复1点体力,然后其摸一张牌。", + qixi_info: "你可以将一张黑色牌当做【过河拆桥】使用。", + keji_info: + "弃牌阶段开始时,若你于本回合的出牌阶段内没有过使用或打出过【杀】,则你可以跳过此阶段。", + kurou_info: "出牌阶段,你可以失去1点体力,然后摸两张牌。", + yingzi_info: "摸牌阶段,你可以多摸一张牌。", + fanjian_info: + "出牌阶段限一次。你可以令一名角色选择一种花色,然后其获得你的一张手牌。若其以此法选择的花色与其得到的牌花色不同,则你对其造成1点伤害。", + guose_info: "你可以将一张方片牌当做【乐不思蜀】使用。", + liuli_info: + "当你成为【杀】的目标时,你可以弃置一张牌并将此【杀】转移给攻击范围内的一名其他角色(不能是此【杀】的使用者)。", + qianxun_info: "锁定技,你不能成为【顺手牵羊】和【乐不思蜀】的目标。", + lianying_info: "当你失去最后的手牌时,你可以摸一张牌。", + xiaoji_info: "当你失去一张装备区内的牌后,你可以摸两张牌。", + jieyin_info: + "出牌阶段限一次,你可以弃置两张手牌并选择一名已经受伤的男性角色。你与其各回复1点体力。", + xinjieyin_info: + "出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。", + xinjieyin_old_info: + "出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。", + xinjieyin_new_info: + "出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", + xinjieyin_info_alter: + "出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。", + qingnang_info: "出牌阶段限一次,你可以弃置一张手牌并令一名角色回复1点体力。", + jijiu_info: "你的回合外,你可以将一张红色牌当做【桃】使用。", + wushuang_info: + "锁定技,当你使用【杀】或【决斗】指定目标后,你令此牌需要依次使用或打出两张【闪】或【杀】响应。", + lijian_info: + "出牌阶段限一次,你可以弃置一张牌,视为一名男性角色对另一名男性角色使用一张【决斗】(不可被【无懈可击】响应)。", + biyue_info: "结束阶段,你可以摸一张牌。", + xinbiyue_info: "结束阶段,你可以摸一张牌。", + xinbiyue_info_alter: "结束阶段,你可以摸一张牌,如果你没有手牌,改为摸两张牌。", + yaowu: "耀武", + yaowu_info: "锁定技,一名角色使用红色【杀】对你造成伤害时,该角色回复1点体力或摸一张牌。", + new_jiangchi: "将驰", + new_jiangchi_info: + "摸牌阶段结束时,你可以选择一项:1、摸一张牌,若如此做,你本回合内不能使用或打出【杀】且【杀】不计入手牌上限。 2、弃置一张牌,若如此做,出牌阶段你使用【杀】无距离限制且你可以额外使用一张【杀】,直到回合结束。", + xinfu_jijie: "机捷", + xinfu_jijie_info: "出牌阶段限一次。你可以观看牌堆底的一张牌,然后将其交给一名角色。", + xinfu_jiyuan: "急援", + xinfu_jiyuan_info: "当有角色进入濒死状态时,或你将牌交给一名其他角色后,你可以令该角色摸一张牌。", + ganglie_three: "刚烈", + ganglie_three_info: + "当你受到伤害后,你可令一名敌方角色判定。若结果不为♥,其弃置两张牌或受到来自你的1点伤害。", + zhongyi: "忠义", + zhongyi2: "忠义", + zhongyi_info: + "限定技,出牌阶段,你可以将一张牌置于武将牌上。你的武将牌上有〖忠义〗牌时,己方角色使用【杀】造成的伤害+1。下轮游戏开始时,你将〖忠义〗牌置入弃牌堆。", + zhanshen: "战神", + zhanshen_info: + "觉醒技,准备阶段,若场上有已死亡的其他己方角色且你已受伤,则你弃置装备区的武器牌,减1点体力上限,获得技能〖马术〗和〖神戟〗。", + shenji: "神戟", + shenji_info: "锁定技,你使用【杀】指定的目标数上限+2,次数上限+1。", + rewangzun: "妄尊", + rewangzun2: "妄尊", + rewangzun_info: + "锁定技,一名其他角色的准备阶段开始时,若其体力值大于你,你摸一张牌。然后若其身份为主公/主帅/君主/地主且明置,则你摸一张牌,且其本回合的手牌上限-1。", + retongji: "同疾", + retongji_info: + "攻击范围内包含你的角色成为【杀】的目标时,若你不是此【杀】的使用者或目标,其可弃置一张牌,然后将此【杀】转移给你。", + std_panfeng: "潘凤", + stdkuangfu: "狂斧", + stdkuangfu_info: + "锁定技。出牌阶段限一次。当你使用【杀】对其他角色造成伤害后,若其体力值:小于你,你摸两张牌;不小于你,你失去1点体力。", + ganfuren: "甘夫人", + stdshushen: "淑慎", + stdshushen_info: + "当你回复1点体力时,你可以令一名其他角色摸一张牌(若其没有手牌则改为摸两张牌)。", + old_re_lidian: "李典", - standard_2008:"2008版标准包", - standard_2013:"2013版标准包", - standard_2019:"2019版标准包", - standard_2023:"2023版标准包", + standard_2008: "2008版标准包", + standard_2013: "2013版标准包", + standard_2019: "2019版标准包", + standard_2023: "2023版标准包", }, }; }); diff --git a/character/swd.js b/character/swd.js index 36d497d68..e844313d7 100644 --- a/character/swd.js +++ b/character/swd.js @@ -1,84 +1,84 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'swd', - character:{ - swd_huzhongxian:['male','wu',3,['daofa','xielv','hujing']], + name: "swd", + character: { + swd_huzhongxian: ["male", "wu", 3, ["daofa", "xielv", "hujing"]], - swd_anka:['male','qun',3,['songci','anlianying']], - swd_septem:['male','qun',4,['jiying','liaoyuan','yishan']], - swd_kama:['female','qun',3,['yueren','shangshi']], + swd_anka: ["male", "qun", 3, ["songci", "anlianying"]], + swd_septem: ["male", "qun", 4, ["jiying", "liaoyuan", "yishan"]], + swd_kama: ["female", "qun", 3, ["yueren", "shangshi"]], // swd_miles:['male','qun',4,['aojian','miles_xueyi','mohua2']], - swd_nicole:['female','qun',3,['huanjian','lingwu','minjing']], - swd_wangsiyue:['female','wei',3,['duishi','biyue']], - swd_weida:['female','qun',3,['yueren','zhenlie','duijue']], - swd_xuanyuanjianxian:['male','qun',4,['pozhou','huajian','xuanyuan']], + swd_nicole: ["female", "qun", 3, ["huanjian", "lingwu", "minjing"]], + swd_wangsiyue: ["female", "wei", 3, ["duishi", "biyue"]], + swd_weida: ["female", "qun", 3, ["yueren", "zhenlie", "duijue"]], + swd_xuanyuanjianxian: ["male", "qun", 4, ["pozhou", "huajian", "xuanyuan"]], - swd_chenjingchou:['male','wu',3,['youyin','yihua']], - swd_duguningke:['female','qun',3,['nlianji','touxi']], - swd_guyue:['male','wei',3,['gtiandao','gxianyin','wangchen']], - swd_tuobayuer:['female','shu',4,['swdliuhong','poyue','niepan']], - swd_yuwentuo:['male','shu',4,['wushuang','xielei','kunlunjing']], - swd_yuxiaoxue:['female','wei',3,['huanhun','daixing','yinyue']], + swd_chenjingchou: ["male", "wu", 3, ["youyin", "yihua"]], + swd_duguningke: ["female", "qun", 3, ["nlianji", "touxi"]], + swd_guyue: ["male", "wei", 3, ["gtiandao", "gxianyin", "wangchen"]], + swd_tuobayuer: ["female", "shu", 4, ["swdliuhong", "poyue", "niepan"]], + swd_yuwentuo: ["male", "shu", 4, ["wushuang", "xielei", "kunlunjing"]], + swd_yuxiaoxue: ["female", "wei", 3, ["huanhun", "daixing", "yinyue"]], - swd_jiliang:['male','wu',3,['yunchou','gongxin','jqimou']], - swd_shuijing:['female','qun',4,['mojian','duanyue','tuzhen']], - swd_quxian:['female','qun',3,['mojian','huanxia']], - swd_xiyan:['male','qun',3,['jiefen','datong']], - swd_cheyun:['female','wu',3,['cyxianjiang','cyqiaoxie','shengong']], - swd_huanyuanzhi:['male','qun',3,['swdtianshu','lanzhi','mufeng']], - swd_murongshi:['female','shu',4,['duanyi','guxing']], - swd_jipeng:['male','wu',3,['reyingzi','guozao']], - swd_qi:['male','qun',3,['yaotong','heihuo','pojian']], + swd_jiliang: ["male", "wu", 3, ["yunchou", "gongxin", "jqimou"]], + swd_shuijing: ["female", "qun", 4, ["mojian", "duanyue", "tuzhen"]], + swd_quxian: ["female", "qun", 3, ["mojian", "huanxia"]], + swd_xiyan: ["male", "qun", 3, ["jiefen", "datong"]], + swd_cheyun: ["female", "wu", 3, ["cyxianjiang", "cyqiaoxie", "shengong"]], + swd_huanyuanzhi: ["male", "qun", 3, ["swdtianshu", "lanzhi", "mufeng"]], + swd_murongshi: ["female", "shu", 4, ["duanyi", "guxing"]], + swd_jipeng: ["male", "wu", 3, ["reyingzi", "guozao"]], + swd_qi: ["male", "qun", 3, ["yaotong", "heihuo", "pojian"]], - swd_luchengxuan:['male','wu',4,['ljifeng','lxianglong']], - swd_xiarou:['female','shu',3,['xianghui','huiqi']], - swd_moye:['female','wu',3,['rexue','liuli','senluo']], + swd_luchengxuan: ["male", "wu", 4, ["ljifeng", "lxianglong"]], + swd_xiarou: ["female", "shu", 3, ["xianghui", "huiqi"]], + swd_moye: ["female", "wu", 3, ["rexue", "liuli", "senluo"]], - swd_zhaoyun:['male','shu',4,['longdan','pozhen','tanlin']], - swd_hengai:['female','shu',3,['funiao','ningxian','hlingbo']], - swd_duanmeng:['female','shu',4,['xuanying','lieren']], - swd_jiangwu:['male','shu',4,['yijue','dangping']], - swd_tuwei:['male','shu',3,['zhanlu','susheng']], - swd_yeyaxi:['female','shu',3,['rexue','huopu','shenyan']], + swd_zhaoyun: ["male", "shu", 4, ["longdan", "pozhen", "tanlin"]], + swd_hengai: ["female", "shu", 3, ["funiao", "ningxian", "hlingbo"]], + swd_duanmeng: ["female", "shu", 4, ["xuanying", "lieren"]], + swd_jiangwu: ["male", "shu", 4, ["yijue", "dangping"]], + swd_tuwei: ["male", "shu", 3, ["zhanlu", "susheng"]], + swd_yeyaxi: ["female", "shu", 3, ["rexue", "huopu", "shenyan"]], - swd_muyun:['male','wei',4,['zhuhai','polang','jikong']], - swd_lanyin:['female','wei',3,['xingdian','yulin','luomei']], - swd_zhiyin:['female','wei',3,['xuehuang','ningshuang','zhuyu']], - swd_qiner:['female','wei',3,['huanyin','tianhuo','xuanzhou']], - swd_jiuyou:['male','wei',3,['lexue']], - swd_duopeng:['male','wu',3,['luanji','reyingzi']], + swd_muyun: ["male", "wei", 4, ["zhuhai", "polang", "jikong"]], + swd_lanyin: ["female", "wei", 3, ["xingdian", "yulin", "luomei"]], + swd_zhiyin: ["female", "wei", 3, ["xuehuang", "ningshuang", "zhuyu"]], + swd_qiner: ["female", "wei", 3, ["huanyin", "tianhuo", "xuanzhou"]], + swd_jiuyou: ["male", "wei", 3, ["lexue"]], + swd_duopeng: ["male", "wu", 3, ["luanji", "reyingzi"]], - swd_fengtianling:['male','shu',4,['guiyan','jiang']], - swd_huyue:['female','wu',3,['hyunshen','fengming']], - swd_jialanduo:['male','qun',4,['xianyin','mailun']], - swd_rongshuang:['female','wu',3,['suiyan','duanxing']], - swd_zhuoshanzhu:['male','wu',4,['suiyan','wanjun']], - swd_jiting:['female','wei',4,['guanhu','lingshi']], + swd_fengtianling: ["male", "shu", 4, ["guiyan", "jiang"]], + swd_huyue: ["female", "wu", 3, ["hyunshen", "fengming"]], + swd_jialanduo: ["male", "qun", 4, ["xianyin", "mailun"]], + swd_rongshuang: ["female", "wu", 3, ["suiyan", "duanxing"]], + swd_zhuoshanzhu: ["male", "wu", 4, ["suiyan", "wanjun"]], + swd_jiting: ["female", "wei", 4, ["guanhu", "lingshi"]], - swd_sikongyu:['male','wu',4,['sliufeng','linyun','hutian']], - swd_muyue:['female','wei',3,['xingzhui','lingxian','shouyin']], - swd_ziqiao:['female','shu',3,['guaili','fuyan']], - swd_fengyu:['male','shu',4,['fzhenwei','shangxi']], + swd_sikongyu: ["male", "wu", 4, ["sliufeng", "linyun", "hutian"]], + swd_muyue: ["female", "wei", 3, ["xingzhui", "lingxian", "shouyin"]], + swd_ziqiao: ["female", "shu", 3, ["guaili", "fuyan"]], + swd_fengyu: ["male", "shu", 4, ["fzhenwei", "shangxi"]], // swd_wushi:['male','wei',3,['zhoufu','yingbin','xuying']], // swd_lanmoshen:['female','wei',3,['bingjian','lieren']], - swd_huanglei:['male','qun',3,['jilve','gongshen','gaizao']], + swd_huanglei: ["male", "qun", 3, ["jilve", "gongshen", "gaizao"]], // swd_libai:['female','qun',3,['miaobi','zhexian']], - swd_kendi:['male','qun',3,['zhanxing','kbolan']], + swd_kendi: ["male", "qun", 3, ["zhanxing", "kbolan"]], // swd_lijing:['male','qun',4,['tianyi','zhuhai']], - swd_lilian:['female','qun',3,['swd_wuxie','lqingcheng']], + swd_lilian: ["female", "qun", 3, ["swd_wuxie", "lqingcheng"]], // swd_linming:['male','qun',3,['shelie','bifa']], // swd_philis:['male','qun',4,['yicong','wangxi']], // swd_pepin:['male','qun',4,['rejianxiong','quhu']], - swd_kangnalishi:['male','qun',1,['busi','xuying','yinguo']], - swd_xuanyuanjiantong:['male','qun',3,['chengjian','huanling']], - swd_huiyan:['male','qun',4,['hwendao','lingfeng','hxunzhi']], + swd_kangnalishi: ["male", "qun", 1, ["busi", "xuying", "yinguo"]], + swd_xuanyuanjiantong: ["male", "qun", 3, ["chengjian", "huanling"]], + swd_huiyan: ["male", "qun", 4, ["hwendao", "lingfeng", "hxunzhi"]], // swd_chenfu:['male','qun',4,['xuanzhou','bingfeng']], // swd_chengyaojin:['male','qun',4,['jiuchi','jufu']], - swd_shanxiaoxiao:['female','wu',3,['shehun','xiaomoyu']], - swd_yuchiyanhong:['female','shu',3,['huanxing','meihuo']], + swd_shanxiaoxiao: ["female", "wu", 3, ["shehun", "xiaomoyu"]], + swd_yuchiyanhong: ["female", "shu", 3, ["huanxing", "meihuo"]], // swd_hanteng:['male','qun',4,['kuangfu']], // swd_heran:['male','qun',3,['yujian','guiyin','shejie']], // swd_xingtian:['male','qun',8,[]], @@ -87,2342 +87,2534 @@ game.import('character', function () { // swd_yangshuo:['male','qun',4,['longdan','luomu']], // swd_zhanglie:['male','qun',4,['huajin','poxiao']], - swd_hanluo:['male','qun',5,['tiebi']], - swd_fu:['male','qun',5,['yudun']], - swd_linyue:['male','wei',3,['zhenjiu','lmazui']], - swd_zidashu:['male','wu',3,['shoulie','hudun']], - swd_maixing:['male','wu',3,['toudan','shending']], - swd_fuyan:['male','qun',4,['lianda']], - swd_haidapang:['female','wu',3,['bingjian','rumeng']], - swd_shaowei:['female','shu',3,['jianji','huangyu']], + swd_hanluo: ["male", "qun", 5, ["tiebi"]], + swd_fu: ["male", "qun", 5, ["yudun"]], + swd_linyue: ["male", "wei", 3, ["zhenjiu", "lmazui"]], + swd_zidashu: ["male", "wu", 3, ["shoulie", "hudun"]], + swd_maixing: ["male", "wu", 3, ["toudan", "shending"]], + swd_fuyan: ["male", "qun", 4, ["lianda"]], + swd_haidapang: ["female", "wu", 3, ["bingjian", "rumeng"]], + swd_shaowei: ["female", "shu", 3, ["jianji", "huangyu"]], - swd_youzhao:['male','shu',4,['longdan','yuchen']], - swd_shangzhang:['male','shu',4,['lianwu']], - swd_situqiang:['female','shu',3,['fengze','lingyue','jinlin']], + swd_youzhao: ["male", "shu", 4, ["longdan", "yuchen"]], + swd_shangzhang: ["male", "shu", 4, ["lianwu"]], + swd_situqiang: ["female", "shu", 3, ["fengze", "lingyue", "jinlin"]], - swd_chunyuheng:['male','wei',2,['jueqing','shengshou','xuying']], - swd_hanlong:['male','wei',4,['ciqiu','siji']], - swd_yuli:['female','wu',3,['lingxin','tianxiang']], - swd_zhanggao:['male','wei',4,['yicong','poxing']], - swd_shuwaner:['female','shu',3,['sxianjing','huodan']], - swd_xiaohuanglong:['male','wei',3,['yeying','juxi']], + swd_chunyuheng: ["male", "wei", 2, ["jueqing", "shengshou", "xuying"]], + swd_hanlong: ["male", "wei", 4, ["ciqiu", "siji"]], + swd_yuli: ["female", "wu", 3, ["lingxin", "tianxiang"]], + swd_zhanggao: ["male", "wei", 4, ["yicong", "poxing"]], + swd_shuwaner: ["female", "shu", 3, ["sxianjing", "huodan"]], + swd_xiaohuanglong: ["male", "wei", 3, ["yeying", "juxi"]], - swd_hupo:['male','wu',3,['dunxing','guiying']], - swd_jiangziya:['male','wu',3,['mingfu','tianlun']], + swd_hupo: ["male", "wu", 3, ["dunxing", "guiying"]], + swd_jiangziya: ["male", "wu", 3, ["mingfu", "tianlun"]], }, - characterIntro:{ - swd_kendi:'占星大师老肯迪的孙子,老肯迪死后,他也自称肯迪,伪装成老肯迪,以保护老肯迪的藏书。肯迪平常以接受委托抄书与翻译拉丁文书籍为业,除了占星术以外,其余知识也相当广博。为了增长见闻,什么可怕的地方都敢去,所以认识薇达与不少的军官。后来,肯迪的子孙成为伊斯兰地区的大学者,以因果定律的学说著名于世。', - swd_shuwaner:'第一代祝犁黄汉卿的妻子,二代祝犁黄采儿的母亲。陷阱机关师,擅长火系陷阱,并能驱使一种可爆裂来杀敌之神秘「火丹」技术。', - swd_xiaohuanglong:'龙族之幻兽,后土之神将它送给兰茵避险,以保护她安全。', - swd_huzhongxian:'炼妖壶是女娲神所创,是以开天辟地创造生命的工具,开创出万物后即遗留于某一处水底神殿中。由巴蛇及蛟龟守护该神器,过了约莫千年之久,炼妖壶已可幻化成人形,即为壶中仙。此时正因人类对异类的排斥,巴蛇对此愤愤不平,壶中仙与巴蛇讨论人魔共存的方法,但巴蛇觉得壶中仙是另有所图。自不采用,一日趁壶中仙不注意,将炼妖壶的妖怪全数释放,留下蛟龟看守练妖壶,巴蛇率领魔族大军反攻人类,从此人魔之战一直持续着。', - swd_anka:'安卡在数千年前,曾经是法老王的宠物。在法老王过世后,本来要当陪葬品,却被一位也要被陪葬的祭司带着逃走,安卡借着长期跟随祭司,学得不少后来传到欧洲的黑魔法,成了一只猫精。但在欧洲黑猫很不受欢迎,之后遇上卡玛,成为共患难的好友。安卡有许多癖好,像是收集漂亮的石头把它藏起来,若是日后又发现会很高兴。', - swd_septem:'欧洲梅罗文加王朝高卢出生的东方人与日耳曼混血儿,宇文拓的后人。深受丕平三世的器重,主要担任收集情报等工作,因为屡立大功而被受封为骑士。后因接受丕平三世的任务而秘密离开高卢前往东方寻找所谓的战争不败之术,由此踏上漫漫征途。', - swd_kama:'来自印度的爱情精灵,与一只来自埃及的有翼黑猫一同旅行,黑猫名叫安卡。数百年来,卡玛跟人类有数不尽的爱情故事,大部分都以悲剧收场,她不断的在人间徘徊,为的是寻找永恒的知己。', - swd_nicole:'前世是独孤宁珂,灵魂被古月仙人用伏羲琴净化,因此未受到魔界污染。她没有过去的记忆,因此个性单纯,对许多事都好奇。后来受撒旦派遣来引导赛特,希望赛特能加入撒旦的阵营。', - swd_wangsiyue:'长安名士的孙女,熟读四书以及佛经,有才女之称,还没出嫁就有大批追求者,她的字画就能在市集上以高价卖出。她非常喜欢诗,特别是古朴的诗经的诗句,遇到说不出口的事,就用吟诗的方式表达。', - swd_weida:'阿拉伯女性,凯利宾瓦力德之后裔,女中豪杰,做事干脆利落,不喜欢拖拖拉拉。长期的军旅生涯,使她的行事作风与一般女性不同。阿拉伯世界的女子长年戴着面纱,不能与男子一起走路,薇达则是通通不遵守。', - swd_xuanyuanjianxian:'东汉末年,年幼的徐暮云的神识被应龙之女分离出来时附于野狼尸体上,化作金狼。因总想夺回成年徐暮云神识所控制的肉身而时常袭击徐暮云。在木门道获得剑气后化为人形,前往遥远的云和山的彼端,归隐为轩辕剑仙。平常能言善道,出口成章,甚至杀人出血成“书画”为其一绝。', - swd_xuanyuanjiantong:'由轩辕剑鞘幻化而成的仙童,好奇心很重,完全是个小孩子的心,跟轩辕剑仙成一老一少的对比。', - swd_chenjingchou:'为陈朝后裔。忠臣陈辅以“靖北虏,复国仇”为他命名“靖仇”。将所有的复国重任全都寄托于他身上。虽然师傅对其寄予厚望,但长大后的陈靖仇却个性温柔,只喜欢诗词与音乐,非常讨厌杀戮,无心复国,一心只想过着与世无争的平静生活。因这样的性格,被其师责为软弱无能、胸无大志。', - swd_duguningke:'西方魔王撒旦手下的女魔将。由撒旦派往神州,目的是扩大赤贯星在神州九天结界上所划开的裂痕。是撒旦侵略神州的前锋。与宇文拓自幼相识,对他怀有感情。因不愿在宇文拓面前吃下撒旦之果而变得丑陋,在赤贯星上败给陈靖仇一行人后悲凉死去,后古月圣将她的魂魄放入伏羲琴中净化99年,宇文拓带着她的魂魄一路西行,回到欧洲。经过净化后忘记前世记忆,转世成为妮可。', - swd_guyue:'仙山岛最深处隐居的年轻仙人,飘逸潇洒,气质不凡。据说他的医术在仙界,也堪称是第一、第二位之绝。真身为一只白狐,后与修炼成仙的何然同归仙山岛隐居,二人经常在对弈亭对弈,不问世事。', - swd_tuobayuer:'本是拓跋部落(鲜卑)遗民,世世代代保护拓跋族神器“神农鼎”。年幼的她有一次随族人外出游牧时,隋炀帝为凸显天威而发兵侵略冲袭留守的部民,父母惨死,神鼎被夺。自此对隋人产生极深敌意,苦苦恳求姐夫张烈教她武艺,日夜勤练,打算伺机南下找回神鼎,并替父母报仇。', - swd_yuwentuo:'又名杨拓,本是北周皇室后裔,因国家被隋朝所篡,他自小流落於民间。幸好隋朝名将杨素发现了他,看出他的素质,就收他为徒,并让自己师弟杨义臣收他为义子。12岁那年曾用轩辕剑歼灭南陈旧部叛乱,杨素死後,宇文拓就担负起继续捍卫杨家天下的重责大任。后通过昆仑镜预见未来,得知赤贯将要划破九天神州结界,决定再也不管隋家天下安危,转而全心寻找上古神器,只想阻止这场危机,担负起挽救神州的重任。', - swd_yuxiaoxue:'女娲石转世,自幼孤儿,由月河村客栈老板贺老伯抚养,满头白发被当地村人认为是不祥的象征,备受歧视。后来她村子被村人祭祀的河神所摧毁,村人把责任全归咎于她,她因而被永远逐出了自己故乡。', - swd_jiliang:'故韩王国贵族出身,世代公卿,祖父被封于张邑,因此也以张为氏。喜好思考,心思敏捷聪慧,好奇心非常旺盛。尽管看来手无缚鸡之力,但却能以过人的智慧,凭藉著最少的情报,而去推演出全局;以一人之力,而胜过千军万马。', - swd_shuijing:'墨家的年轻女弟子,故赵王国人。亲人在秦战火中丧生,被协防赵国的墨家弟子在废墟之中发现,带回交由墨家夫人收容抚养。', - swd_quxian:'墨家年轻女弟子,故楚王国人。出身贵族,带有独特高贵气质。由于亲眼目睹全家死于秦人机关部队,心中有难以抹灭之阴影。', - swd_xiyan:'来自云中界的灵犀族,被壶中仙选中做为入室弟子,由他负责整合云中界的种族纠纷。', - swd_cheyun:'令狐国人,祖父是令狐国的大夫。但昔日由于研究“御木为兵”的“木甲术”而被政敌北宫大夫构陷,最后遭到抄家灭族;车芸年幼,因之只被处以刖刑,需以木制义肢来行走。由家臣端木氏抚养,之后她继续秘密研究祖父的木甲术,誓要效忠国家,为祖父及家人平反。', - swd_huanyuanzhi:'东晋名将桓温的亲属,为了改变淝水之战秦灭晋的结局而来到春秋时代,成为了晋国太辰宫的“九龙子”祭司之一,人称“肆龙子”,代号为 “负屃”。设置五岳阵法把王霸之气汇聚晋国,好让一千年后变成晋灭秦,和四百年以前来自不同时空的土耀使者墨老先生是同一个灵魂。', - swd_murongshi:'自称昔日夏朝时负责保管「夏后祭器」的涂山氏后人,实际是从经桓远之改动的历史中穿越回来,目的是在太一之轮上刻下秦克晋生克从而改变历史。和车芸、苻殷是不同历史中同一灵魂的人。', - swd_jipeng:'聒噪自大的鹦鹉国王,鹦鹉王国「多毛国」国王。原是野心家蜀桑子部下,被壶中仙丢入「云中界」后,在那里建立了自己的鹦鹉王国。由于曾偷吃壶中仙的长生丹药,因此老化速度变慢,聒噪威力不减当年。为了保护老主人女儿(墨家夫人),随同水镜返回人间,参与对抗赤松子的战争。', - swd_qi:'上古文明的术者,沉睡千年后醒来,梦想重建古代王朝。古代蜀国的科学家,是一个天才少年。', - swd_luchengxuan:'从小便拥有着强大的力量,可是不懂得控制,被周遭的人当成怪物般的看待,导致养成阴郁犹疑不轻易吐露心声的性格,后来在探索自己拥有力量与生命意义的旅程中,逐渐历练成熟,进而立志发挥自己的力量协助他人。', - swd_xiarou:'纯洁无瑕的气质与温柔婉约的外表,让人以为她手无缚鸡之力,但其实体内蕴藏有相当强的灵力,与生俱来个性温柔娴静,聪慧坚强,带领着族人勇敢面对他族的侵略,希望苍生皆能过着和平安稳的生活。', - swd_moye:'青龙圣者手下,对于青龙圣者有着莫名崇拜,常因沉不住气而搞砸许多事,不过还是很受族人的喜爱,单纯的个性让她丝毫不会烦恼任何事太久。后奉青龙圣者委派携带圣宇盘前往山海界西方寻找继任青龙圣者。', - swd_zhaoyun:'朝云出生于三国时期普通的民家,荆州襄阳人。父亲皇甫疾,乃昔日刘表麾下的水师参军,荆州投降后,被曹魏所征召,后惨死于赤壁,母亲韩氏,则于关羽北伐时,死于逃难途中。朝云为把剩余不多的干粮留给一起逃难的姊弟,决心自我牺牲,趁夜偷偷离开他们,躲在荒野中,后来在饥寒交迫之中昏死,为路过的名将赵云救起。赵云将他带至一收容战火孤儿的组织,让他有栖身之所。后来,朝云在一次支援粮秣运输工作中,意外以剑气救了误入曹贼陷阱中的赵云及所属部队,此后,赵云便夜夜蒙面,把朝云带至营后的山上,传授枪戟武术。最终朝云在天干十杰选拔中获得首位拿下“焉逢”称号,成为蜀汉精英部队“飞羽”的“羽之部”领导人。', - swd_hengai:'充满神秘色彩之女子。聪明而慧黠,凡事颇有自己见地。携上古神器「炼妖壶」在身,不时会同情敌人,又不喜杀戮的姑娘。擅法术,一头异于常人之蓝色长发,据说乃昔日为修练高深法术所造成。她对焉逢甚有好感,却又保持距离,态度甚为微妙。', - swd_duanmeng:'马良之女,本名马蕴。马良死后流落南蛮,后在诸葛亮平定南中时被马良之弟马谡找到并收为义女。马谡因街亭失守被斩,马蕴认为父亲是优秀幕僚而非将帅之才,街亭失守主因在于诸葛亮用人不当。为建立功勋,洗刷父亲的污名,马蕴加入飞羽部队,在「天干十杰」选拔中获得第二名「端蒙」称号,成为飞之部领导人', - swd_jiangwu:'故巴东郡主簿严函之子,因诸葛亮曾为父亲严函洗脱冤情,故对其为人与公忠体国的精神十分景仰,因此将报效朝廷一事,置于个人一己的功业之上。左手持巨弓,右手配强弩,擅远距离攻击,有百步穿杨能力。他与焉逢乃是战场上一起出生入死之多年至交,二人情深谊厚,因此平日彼此之间从不以代号互称,而皆直称对方本名。以自己能身为「飞羽」一员而深深自豪。', - swd_tuwei:'容貌清秀,但沉默寡言的青年。平日常闭目若有所思,偶一说话,也仅简单几个字回应而已。与横艾为同门之师姊弟,但飞羽「十杰」排名却意外地在横艾之上。他与横艾一样,坚不透露所属之道术门派,来历神秘。擅长疗愈系之法术', - swd_yeyaxi:'孙尚香的义女,深色肌肤,大眼睛,天真无邪。是吴帝孙权派人出海寻找传说中之夷洲、亶洲时,所掳回之夷洲当地原住民少女。耶亚希心里偷恋焉逢,于是在孙尚香请托下,随焉逢一行人共同旅行历练。', - swd_muyun:'皇甫朝云之弟,幼时遭逢变故,流落荒野,幸得魏国前御史中丞徐庶所救,将之收为养子,抚养成人。在洛阳的那段童年时光中,暮云与青梅竹马兰茵、以及魏国名将张郃之孙张诰相交甚笃,一同习剑成长。十年匆匆,暮云如今已是英姿焕发、名满洛阳的少年剑客,但为求精进,暮云始终勤练剑术,希望有朝一日能以一身武艺协助恩师张郃,报效朝廷。', - swd_lanyin:'魏国名将张郃,府中之女剑僮。性格温婉可人,剑术高超,身手利落,深为张郃所赏识。与暮云为青梅竹马,二人情投意合,经常一起行动。真实身份为应龙之女。', - swd_zhiyin:'女性法师,自称多年前随师父旅行至洛阳时与兰茵相遇,认作姊妹,实际与兰茵均为应龙之女的分身。个性果决,伶俐慧黠。于并西胡匈之地修习道术、降妖伏魔。', - swd_qiner:'「铜雀尊者」之副领导人,赤衣尊者,虽年纪轻轻,却有着令人难以置信之惊人实力,能施展许多强大而罕见的术法。随身总是抱着一只琵琶,以音律操纵幻术、幻兽来进行各式各样之攻击。天女青儿赠予巫山女神瑶姬的四样乐器中的磬所化。', - swd_jiuyou:'本名久须毗呼,来自东方邪马台国之清秀少年。他乃是多年前邪马台国领袖日御子(卑弥呼)私下派遣至辽东接触的使臣之一,由于对中原风土民情、文化制度深为着迷,便决定留下游历。身手非凡能使术法与剑术,持有剑、镜、玉三大法器。', - swd_duopeng:'来自桃源界之多毛民,自称是多毛国疾鹏大王驾前第一勇士「禽灵天尊铁爪无敌啸风攫魂多毛翔鹏大元帅」。多鹏不小心打碎了留侯夫人夫君(姬良)送给她的最喜爱的琉璃花瓶,担心被留侯夫人(水镜)宰了煮了吃。于是逃离了桃源仙境,来到了轩辕界。遇见了寻找盘古斧的兰茵,带领兰茵到云中界寻找盘古斧。', - swd_fengtianling:'商朝东方最强大的诸侯国──奄国大夫凤千平之子,外貌不俗,时刻流露出强烈的贵族气质与自信,但他脸上仍保有些许少年之青涩。从小生长在商民大族中的凤天凌,家中有一位哥哥,两人从小跟随住在太山上的师父习剑,剑术天分十分被肯定。', - swd_huyue:'九尾狐妖,商亡后狐妖一族被商朝太师诛灭,因年幼未被发现而逃过一劫。与幼时的凤天凌因巧合相遇,与其成为好友。', - swd_jialanduo:'迦兰多来自遥远的身毒国,身为身毒皇室的后裔,他却只身一人千里迢迢来到中原,只为了寻找昔日比他更早之前便独自前来中原、但如今却音信全无的亲姐姐。', - swd_rongshuang:'蓉霜来自中原西南方的古蜀国,是师承古蜀文明“战甲”一派的谜样少女。由于蓉霜初懂中原语言,因此在战甲师群中战力不算特别强大的她,也一起被派遣前来中原执行任务。', - swd_zhuoshanzhu:'战甲技能非常优秀的浊山铸,深受黑火门掌门师尊的重视,并有意指定他为自己的继承人。当师尊得知中原曾出现黑火踪迹,便下令浊山铸率领众徒前往中原,务必将黑火带回蜀国。任务途中,浊山铸为了保蓉霜周全,惨遭敌对门派痛下杀手,被埋葬在异国他乡黄土之下。', - swd_jiting:'周朝王姬,好武且崇尚英雄,擅长于箭术与驭车。其人飒爽英姿、风华绝代,以长弓为贴身武器。逃不开政治婚姻的宿命,因对未来夫君充满好奇并且不愿盲目嫁人,遂毅然离开镐京去寻求真相。', - swd_sikongyu:'来自有熊村,祖先自夏朝被灭后一直四处迁徙躲避战乱。习练的武功是司空一家代代相传的棍术,但也痴迷于研究陷阱、鸣竹等防御外来者入侵的机关,希望通过自己的本领使族人过上安稳的生活。', - swd_muyue:'华胥人,千年前,颛顼帝与华胥国主联手施行“绝地天通”之阵关闭天门,以绝世人登天之妄想,平天下之乱。“绝地天通”阵势浩大,需以华胥族人的魂灵为祭,沐月本欲替代被选为做辅祭的姐姐入阵,却在最后时刻因信念不够坚定,错过了施术时间。最终,天门关闭,华胥国被建木托升至天际,沐月独自留守在华胥。千年后,相柳为重开天门,借助青榆和伏羲琴之力试图破坏结界,沐月因此坠入人间。', - swd_ziqiao:'子国巫人之女,拥有凭神的体质。身材虽然娇小,却拥有常人所没有的力量,能够轻易的挥动巨斧作战。', - swd_fengyu:'商朝王子,化名凤煜四处游历,希望能找到解决商朝内忧外患的局面的方法', - swd_huanglei:'擅长古传的机关术(鲁班一脉),曾经在任官于唐朝政府少府监,因为被李林甫排挤而对政府怀恨在心。他出任高仙芝的参谋,出了主意灭掉石国,又企图干扰大食(阿拉伯)改朝换代,引起怛罗斯之战。当高仙芝返回长安,听其余的部属劝告,又因怛罗斯之战失利跟黄雷脱不了关系,疏远黄雷。黄雷转而投靠安禄山,想藉安禄山的叛乱取得势力。', - swd_lilian:'生长在一个贵族家庭,是第三千金,她父亲已经许婚给其他贵族,但她却迷恋上来做客的骑士麦尔斯,之后麦尔斯出任务到威尼斯,莉莲也偷偷的带着她的爱犬波尔去追随他。', - swd_kangnalishi:'梅罗文加护教骑士的指导教士,直属罗马教皇。在高卢没有一个人喜欢这个神情诡异的人。讲话都会带给人恐惧感。他称麦尔斯是他教出来最完美的骑士。', - swd_huiyan:'慧彦俗名刘书经,从小被誉为神童,一心想金榜题名,由于过于狂妄自大,在考场取笑主考官而被逐出考场,觉得了无生趣,也不敢回乡面对乡亲父老,游荡到嵩山时,对那些会武术的和尚发生兴趣,于是就在少林寺出家。慧彦天资聪颖,无论在武术、佛学上几乎凌驾师辈后来对少林祖师达摩的事迹产生兴趣。当时唐僧玄奘去天竺取经的事迹为世人尊崇,而从天竺来到达摩所教的(禅宗)却还有些出入,于是想亲身去天竺求证,获得唐玄宗支持,让他持使节信符出关。但唐玄宗额外交代一些军事上的任务,慧彦必须协助探查远至大食附近诸国的军事情势。', - swd_shanxiaoxiao:'独孤宁珂的婢女,是宁珂来到中原之后收伏的千年琵琶精。', - swd_yuchiyanhong:'独孤宁珂的婢女,是宁珂来到中原之后收伏之千年狐狸精。', - swd_hanluo:'寒洛是玄武国世子,因与知盈的婚事遭其父玄武侯反对,而与之私奔。', - swd_fu:'福来自毛民国,因助陆承轩、夏柔搭救被毛民抓来做祭品的莫耶而得罪族人,而后随陆承轩等人离开。', - swd_linyue:'来自氐人国的老医生,医术高明。醉心于各种医学技术,因此常外出云游,四处学习。随遇而安的个性让他不过于担心身边的人事物。', - swd_zidashu:'周侥国王子,十分仰慕陆承轩等人的高超武艺,故随其一同游历,磨练自己。', - swd_maixing:'奇肱国老神丁的徒弟。虽然是奇肱族近来难见的天才,但好胜的个性,让他常与旁人发生争执,孤独的他在没有比较之下更以为自己技术高超,另急躁的个性也让他急于试验自己未完成的工艺品,以致于常造成大乌龙。', - swd_fuyan:'俱有满腔的热血与爱国心,外表虽然像其他白虎族人一样勇猛,其实是自幼常生病的药罐子。', - swd_haidapang:'一目民,能在远处就注意到周遭的状况,一有危险马上逃跑!过于小心翼翼的性格,对于外界既害怕又好奇,总是张着大眼睛四处观望,又像惊弓之鸟似的随时保持警戒,做好逃跑的准备。', - swd_shaowei:'生在朱雀国,个性高傲、善变,因与主角战斗受伤,因而忘记过去的朱雀族少女。时而天真迷惘、时而冷漠无情、时而阴狠狡诈,不知何者是她的本性。', - swd_youzhao:'名将赵云之孙,枪法凛冽,胆识过人。一心追求建立不世之功业,期许自己能协助大汉讨灭曹贼,克复中原,以光耀祖先之名声。性格冷傲孤高,对自己在「天干十杰」名次排行战之中,竟输给了籍籍无名之孤儿焉逢,暗自耿耿为怀不已。执行任务时,出手迅疾猛狠,对敌人毫不留情,是极出色之菁英战士。', - swd_shangzhang:'端蒙之弟,马谡之子。由于姊姊不顾家族劝阻,坚持加入飞羽,他十分担忧她的安危,便努力苦练武艺,历经艰难之后,终于在高手如林的飞羽「天干十杰」争夺战之中,以遍体鳞伤却仍力战不懈之姿,撼动所有战友,最后如愿挤入了十天干最末一个名位。他配属于「飞之部」,在姊姊身边默默守护她。', - swd_situqiang:'原籍长安,父亲原是魏国医官,后因治疫不力遭罢,举家放逐。父亲死后,司徒蔷便想运用其自幼所习的知识,行走各地教授防疫知识。', - swd_chunyuheng:'字长生。身拥承袭淳于一脉的绝顶医术,却不轻易替人治病。因淳于一族不长命且无法治好自己的怪病,导致性情古怪孤僻,且言谈之间尽是轻生之词,让人难以亲近。最后知晓原因后,得同伴帮助,消除诅咒。', - swd_hanlong:'魁梧高大,身手矫健,能单手持巨刃而面不改色,是一本事卓绝之勇士。原为并西之地的胡族,因该地官员贪暴,其父反抗却遭杀害,他为照顾母亲,无奈沦为草莽盗匪,靠打劫路过达官显贵以维生。', - swd_yuli:'他人以为是鱼妖而自称是鱼仙的混仙。在徐暮云等人追查鱼妖传闻的真相时,与其相遇,却从此成为助她成仙的伙伴。', - swd_zhanggao:'字柏乔,为大魏名将张郃之孙,同时亦是徐暮云情谊深笃之挚友。暮云视他彷若兄长,十分尊敬。不时与暮云切磋剑术,互相砥砺,同为洛阳著名之少年剑客。', - swd_hupo:'属于山林鬼神一族,全身雪白,眼睛碧蓝,一对长而尖细的耳朵,长着一簇蓬松的大尾巴。它的同族都是力量强大的山林鬼魅,但一般人并看不到它们,只有拥有特殊能力的人才能看得见。', - swd_jiangziya:'周军统帅、周朝开国元勋,是一位尤其擅长法术攻击的权谋大家。曾修改了用于记载宇宙间万物生克关系的神器“太一之轮”,并留下了“周克商”的生克,造就牧野之战的胜利。', + characterIntro: { + swd_kendi: + "占星大师老肯迪的孙子,老肯迪死后,他也自称肯迪,伪装成老肯迪,以保护老肯迪的藏书。肯迪平常以接受委托抄书与翻译拉丁文书籍为业,除了占星术以外,其余知识也相当广博。为了增长见闻,什么可怕的地方都敢去,所以认识薇达与不少的军官。后来,肯迪的子孙成为伊斯兰地区的大学者,以因果定律的学说著名于世。", + swd_shuwaner: + "第一代祝犁黄汉卿的妻子,二代祝犁黄采儿的母亲。陷阱机关师,擅长火系陷阱,并能驱使一种可爆裂来杀敌之神秘「火丹」技术。", + swd_xiaohuanglong: "龙族之幻兽,后土之神将它送给兰茵避险,以保护她安全。", + swd_huzhongxian: + "炼妖壶是女娲神所创,是以开天辟地创造生命的工具,开创出万物后即遗留于某一处水底神殿中。由巴蛇及蛟龟守护该神器,过了约莫千年之久,炼妖壶已可幻化成人形,即为壶中仙。此时正因人类对异类的排斥,巴蛇对此愤愤不平,壶中仙与巴蛇讨论人魔共存的方法,但巴蛇觉得壶中仙是另有所图。自不采用,一日趁壶中仙不注意,将炼妖壶的妖怪全数释放,留下蛟龟看守练妖壶,巴蛇率领魔族大军反攻人类,从此人魔之战一直持续着。", + swd_anka: + "安卡在数千年前,曾经是法老王的宠物。在法老王过世后,本来要当陪葬品,却被一位也要被陪葬的祭司带着逃走,安卡借着长期跟随祭司,学得不少后来传到欧洲的黑魔法,成了一只猫精。但在欧洲黑猫很不受欢迎,之后遇上卡玛,成为共患难的好友。安卡有许多癖好,像是收集漂亮的石头把它藏起来,若是日后又发现会很高兴。", + swd_septem: + "欧洲梅罗文加王朝高卢出生的东方人与日耳曼混血儿,宇文拓的后人。深受丕平三世的器重,主要担任收集情报等工作,因为屡立大功而被受封为骑士。后因接受丕平三世的任务而秘密离开高卢前往东方寻找所谓的战争不败之术,由此踏上漫漫征途。", + swd_kama: + "来自印度的爱情精灵,与一只来自埃及的有翼黑猫一同旅行,黑猫名叫安卡。数百年来,卡玛跟人类有数不尽的爱情故事,大部分都以悲剧收场,她不断的在人间徘徊,为的是寻找永恒的知己。", + swd_nicole: + "前世是独孤宁珂,灵魂被古月仙人用伏羲琴净化,因此未受到魔界污染。她没有过去的记忆,因此个性单纯,对许多事都好奇。后来受撒旦派遣来引导赛特,希望赛特能加入撒旦的阵营。", + swd_wangsiyue: + "长安名士的孙女,熟读四书以及佛经,有才女之称,还没出嫁就有大批追求者,她的字画就能在市集上以高价卖出。她非常喜欢诗,特别是古朴的诗经的诗句,遇到说不出口的事,就用吟诗的方式表达。", + swd_weida: + "阿拉伯女性,凯利宾瓦力德之后裔,女中豪杰,做事干脆利落,不喜欢拖拖拉拉。长期的军旅生涯,使她的行事作风与一般女性不同。阿拉伯世界的女子长年戴着面纱,不能与男子一起走路,薇达则是通通不遵守。", + swd_xuanyuanjianxian: + "东汉末年,年幼的徐暮云的神识被应龙之女分离出来时附于野狼尸体上,化作金狼。因总想夺回成年徐暮云神识所控制的肉身而时常袭击徐暮云。在木门道获得剑气后化为人形,前往遥远的云和山的彼端,归隐为轩辕剑仙。平常能言善道,出口成章,甚至杀人出血成“书画”为其一绝。", + swd_xuanyuanjiantong: + "由轩辕剑鞘幻化而成的仙童,好奇心很重,完全是个小孩子的心,跟轩辕剑仙成一老一少的对比。", + swd_chenjingchou: + "为陈朝后裔。忠臣陈辅以“靖北虏,复国仇”为他命名“靖仇”。将所有的复国重任全都寄托于他身上。虽然师傅对其寄予厚望,但长大后的陈靖仇却个性温柔,只喜欢诗词与音乐,非常讨厌杀戮,无心复国,一心只想过着与世无争的平静生活。因这样的性格,被其师责为软弱无能、胸无大志。", + swd_duguningke: + "西方魔王撒旦手下的女魔将。由撒旦派往神州,目的是扩大赤贯星在神州九天结界上所划开的裂痕。是撒旦侵略神州的前锋。与宇文拓自幼相识,对他怀有感情。因不愿在宇文拓面前吃下撒旦之果而变得丑陋,在赤贯星上败给陈靖仇一行人后悲凉死去,后古月圣将她的魂魄放入伏羲琴中净化99年,宇文拓带着她的魂魄一路西行,回到欧洲。经过净化后忘记前世记忆,转世成为妮可。", + swd_guyue: + "仙山岛最深处隐居的年轻仙人,飘逸潇洒,气质不凡。据说他的医术在仙界,也堪称是第一、第二位之绝。真身为一只白狐,后与修炼成仙的何然同归仙山岛隐居,二人经常在对弈亭对弈,不问世事。", + swd_tuobayuer: + "本是拓跋部落(鲜卑)遗民,世世代代保护拓跋族神器“神农鼎”。年幼的她有一次随族人外出游牧时,隋炀帝为凸显天威而发兵侵略冲袭留守的部民,父母惨死,神鼎被夺。自此对隋人产生极深敌意,苦苦恳求姐夫张烈教她武艺,日夜勤练,打算伺机南下找回神鼎,并替父母报仇。", + swd_yuwentuo: + "又名杨拓,本是北周皇室后裔,因国家被隋朝所篡,他自小流落於民间。幸好隋朝名将杨素发现了他,看出他的素质,就收他为徒,并让自己师弟杨义臣收他为义子。12岁那年曾用轩辕剑歼灭南陈旧部叛乱,杨素死後,宇文拓就担负起继续捍卫杨家天下的重责大任。后通过昆仑镜预见未来,得知赤贯将要划破九天神州结界,决定再也不管隋家天下安危,转而全心寻找上古神器,只想阻止这场危机,担负起挽救神州的重任。", + swd_yuxiaoxue: + "女娲石转世,自幼孤儿,由月河村客栈老板贺老伯抚养,满头白发被当地村人认为是不祥的象征,备受歧视。后来她村子被村人祭祀的河神所摧毁,村人把责任全归咎于她,她因而被永远逐出了自己故乡。", + swd_jiliang: + "故韩王国贵族出身,世代公卿,祖父被封于张邑,因此也以张为氏。喜好思考,心思敏捷聪慧,好奇心非常旺盛。尽管看来手无缚鸡之力,但却能以过人的智慧,凭藉著最少的情报,而去推演出全局;以一人之力,而胜过千军万马。", + swd_shuijing: + "墨家的年轻女弟子,故赵王国人。亲人在秦战火中丧生,被协防赵国的墨家弟子在废墟之中发现,带回交由墨家夫人收容抚养。", + swd_quxian: + "墨家年轻女弟子,故楚王国人。出身贵族,带有独特高贵气质。由于亲眼目睹全家死于秦人机关部队,心中有难以抹灭之阴影。", + swd_xiyan: "来自云中界的灵犀族,被壶中仙选中做为入室弟子,由他负责整合云中界的种族纠纷。", + swd_cheyun: + "令狐国人,祖父是令狐国的大夫。但昔日由于研究“御木为兵”的“木甲术”而被政敌北宫大夫构陷,最后遭到抄家灭族;车芸年幼,因之只被处以刖刑,需以木制义肢来行走。由家臣端木氏抚养,之后她继续秘密研究祖父的木甲术,誓要效忠国家,为祖父及家人平反。", + swd_huanyuanzhi: + "东晋名将桓温的亲属,为了改变淝水之战秦灭晋的结局而来到春秋时代,成为了晋国太辰宫的“九龙子”祭司之一,人称“肆龙子”,代号为 “负屃”。设置五岳阵法把王霸之气汇聚晋国,好让一千年后变成晋灭秦,和四百年以前来自不同时空的土耀使者墨老先生是同一个灵魂。", + swd_murongshi: + "自称昔日夏朝时负责保管「夏后祭器」的涂山氏后人,实际是从经桓远之改动的历史中穿越回来,目的是在太一之轮上刻下秦克晋生克从而改变历史。和车芸、苻殷是不同历史中同一灵魂的人。", + swd_jipeng: + "聒噪自大的鹦鹉国王,鹦鹉王国「多毛国」国王。原是野心家蜀桑子部下,被壶中仙丢入「云中界」后,在那里建立了自己的鹦鹉王国。由于曾偷吃壶中仙的长生丹药,因此老化速度变慢,聒噪威力不减当年。为了保护老主人女儿(墨家夫人),随同水镜返回人间,参与对抗赤松子的战争。", + swd_qi: "上古文明的术者,沉睡千年后醒来,梦想重建古代王朝。古代蜀国的科学家,是一个天才少年。", + swd_luchengxuan: + "从小便拥有着强大的力量,可是不懂得控制,被周遭的人当成怪物般的看待,导致养成阴郁犹疑不轻易吐露心声的性格,后来在探索自己拥有力量与生命意义的旅程中,逐渐历练成熟,进而立志发挥自己的力量协助他人。", + swd_xiarou: + "纯洁无瑕的气质与温柔婉约的外表,让人以为她手无缚鸡之力,但其实体内蕴藏有相当强的灵力,与生俱来个性温柔娴静,聪慧坚强,带领着族人勇敢面对他族的侵略,希望苍生皆能过着和平安稳的生活。", + swd_moye: + "青龙圣者手下,对于青龙圣者有着莫名崇拜,常因沉不住气而搞砸许多事,不过还是很受族人的喜爱,单纯的个性让她丝毫不会烦恼任何事太久。后奉青龙圣者委派携带圣宇盘前往山海界西方寻找继任青龙圣者。", + swd_zhaoyun: + "朝云出生于三国时期普通的民家,荆州襄阳人。父亲皇甫疾,乃昔日刘表麾下的水师参军,荆州投降后,被曹魏所征召,后惨死于赤壁,母亲韩氏,则于关羽北伐时,死于逃难途中。朝云为把剩余不多的干粮留给一起逃难的姊弟,决心自我牺牲,趁夜偷偷离开他们,躲在荒野中,后来在饥寒交迫之中昏死,为路过的名将赵云救起。赵云将他带至一收容战火孤儿的组织,让他有栖身之所。后来,朝云在一次支援粮秣运输工作中,意外以剑气救了误入曹贼陷阱中的赵云及所属部队,此后,赵云便夜夜蒙面,把朝云带至营后的山上,传授枪戟武术。最终朝云在天干十杰选拔中获得首位拿下“焉逢”称号,成为蜀汉精英部队“飞羽”的“羽之部”领导人。", + swd_hengai: + "充满神秘色彩之女子。聪明而慧黠,凡事颇有自己见地。携上古神器「炼妖壶」在身,不时会同情敌人,又不喜杀戮的姑娘。擅法术,一头异于常人之蓝色长发,据说乃昔日为修练高深法术所造成。她对焉逢甚有好感,却又保持距离,态度甚为微妙。", + swd_duanmeng: + "马良之女,本名马蕴。马良死后流落南蛮,后在诸葛亮平定南中时被马良之弟马谡找到并收为义女。马谡因街亭失守被斩,马蕴认为父亲是优秀幕僚而非将帅之才,街亭失守主因在于诸葛亮用人不当。为建立功勋,洗刷父亲的污名,马蕴加入飞羽部队,在「天干十杰」选拔中获得第二名「端蒙」称号,成为飞之部领导人", + swd_jiangwu: + "故巴东郡主簿严函之子,因诸葛亮曾为父亲严函洗脱冤情,故对其为人与公忠体国的精神十分景仰,因此将报效朝廷一事,置于个人一己的功业之上。左手持巨弓,右手配强弩,擅远距离攻击,有百步穿杨能力。他与焉逢乃是战场上一起出生入死之多年至交,二人情深谊厚,因此平日彼此之间从不以代号互称,而皆直称对方本名。以自己能身为「飞羽」一员而深深自豪。", + swd_tuwei: + "容貌清秀,但沉默寡言的青年。平日常闭目若有所思,偶一说话,也仅简单几个字回应而已。与横艾为同门之师姊弟,但飞羽「十杰」排名却意外地在横艾之上。他与横艾一样,坚不透露所属之道术门派,来历神秘。擅长疗愈系之法术", + swd_yeyaxi: + "孙尚香的义女,深色肌肤,大眼睛,天真无邪。是吴帝孙权派人出海寻找传说中之夷洲、亶洲时,所掳回之夷洲当地原住民少女。耶亚希心里偷恋焉逢,于是在孙尚香请托下,随焉逢一行人共同旅行历练。", + swd_muyun: + "皇甫朝云之弟,幼时遭逢变故,流落荒野,幸得魏国前御史中丞徐庶所救,将之收为养子,抚养成人。在洛阳的那段童年时光中,暮云与青梅竹马兰茵、以及魏国名将张郃之孙张诰相交甚笃,一同习剑成长。十年匆匆,暮云如今已是英姿焕发、名满洛阳的少年剑客,但为求精进,暮云始终勤练剑术,希望有朝一日能以一身武艺协助恩师张郃,报效朝廷。", + swd_lanyin: + "魏国名将张郃,府中之女剑僮。性格温婉可人,剑术高超,身手利落,深为张郃所赏识。与暮云为青梅竹马,二人情投意合,经常一起行动。真实身份为应龙之女。", + swd_zhiyin: + "女性法师,自称多年前随师父旅行至洛阳时与兰茵相遇,认作姊妹,实际与兰茵均为应龙之女的分身。个性果决,伶俐慧黠。于并西胡匈之地修习道术、降妖伏魔。", + swd_qiner: + "「铜雀尊者」之副领导人,赤衣尊者,虽年纪轻轻,却有着令人难以置信之惊人实力,能施展许多强大而罕见的术法。随身总是抱着一只琵琶,以音律操纵幻术、幻兽来进行各式各样之攻击。天女青儿赠予巫山女神瑶姬的四样乐器中的磬所化。", + swd_jiuyou: + "本名久须毗呼,来自东方邪马台国之清秀少年。他乃是多年前邪马台国领袖日御子(卑弥呼)私下派遣至辽东接触的使臣之一,由于对中原风土民情、文化制度深为着迷,便决定留下游历。身手非凡能使术法与剑术,持有剑、镜、玉三大法器。", + swd_duopeng: + "来自桃源界之多毛民,自称是多毛国疾鹏大王驾前第一勇士「禽灵天尊铁爪无敌啸风攫魂多毛翔鹏大元帅」。多鹏不小心打碎了留侯夫人夫君(姬良)送给她的最喜爱的琉璃花瓶,担心被留侯夫人(水镜)宰了煮了吃。于是逃离了桃源仙境,来到了轩辕界。遇见了寻找盘古斧的兰茵,带领兰茵到云中界寻找盘古斧。", + swd_fengtianling: + "商朝东方最强大的诸侯国──奄国大夫凤千平之子,外貌不俗,时刻流露出强烈的贵族气质与自信,但他脸上仍保有些许少年之青涩。从小生长在商民大族中的凤天凌,家中有一位哥哥,两人从小跟随住在太山上的师父习剑,剑术天分十分被肯定。", + swd_huyue: + "九尾狐妖,商亡后狐妖一族被商朝太师诛灭,因年幼未被发现而逃过一劫。与幼时的凤天凌因巧合相遇,与其成为好友。", + swd_jialanduo: + "迦兰多来自遥远的身毒国,身为身毒皇室的后裔,他却只身一人千里迢迢来到中原,只为了寻找昔日比他更早之前便独自前来中原、但如今却音信全无的亲姐姐。", + swd_rongshuang: + "蓉霜来自中原西南方的古蜀国,是师承古蜀文明“战甲”一派的谜样少女。由于蓉霜初懂中原语言,因此在战甲师群中战力不算特别强大的她,也一起被派遣前来中原执行任务。", + swd_zhuoshanzhu: + "战甲技能非常优秀的浊山铸,深受黑火门掌门师尊的重视,并有意指定他为自己的继承人。当师尊得知中原曾出现黑火踪迹,便下令浊山铸率领众徒前往中原,务必将黑火带回蜀国。任务途中,浊山铸为了保蓉霜周全,惨遭敌对门派痛下杀手,被埋葬在异国他乡黄土之下。", + swd_jiting: + "周朝王姬,好武且崇尚英雄,擅长于箭术与驭车。其人飒爽英姿、风华绝代,以长弓为贴身武器。逃不开政治婚姻的宿命,因对未来夫君充满好奇并且不愿盲目嫁人,遂毅然离开镐京去寻求真相。", + swd_sikongyu: + "来自有熊村,祖先自夏朝被灭后一直四处迁徙躲避战乱。习练的武功是司空一家代代相传的棍术,但也痴迷于研究陷阱、鸣竹等防御外来者入侵的机关,希望通过自己的本领使族人过上安稳的生活。", + swd_muyue: + "华胥人,千年前,颛顼帝与华胥国主联手施行“绝地天通”之阵关闭天门,以绝世人登天之妄想,平天下之乱。“绝地天通”阵势浩大,需以华胥族人的魂灵为祭,沐月本欲替代被选为做辅祭的姐姐入阵,却在最后时刻因信念不够坚定,错过了施术时间。最终,天门关闭,华胥国被建木托升至天际,沐月独自留守在华胥。千年后,相柳为重开天门,借助青榆和伏羲琴之力试图破坏结界,沐月因此坠入人间。", + swd_ziqiao: + "子国巫人之女,拥有凭神的体质。身材虽然娇小,却拥有常人所没有的力量,能够轻易的挥动巨斧作战。", + swd_fengyu: "商朝王子,化名凤煜四处游历,希望能找到解决商朝内忧外患的局面的方法", + swd_huanglei: + "擅长古传的机关术(鲁班一脉),曾经在任官于唐朝政府少府监,因为被李林甫排挤而对政府怀恨在心。他出任高仙芝的参谋,出了主意灭掉石国,又企图干扰大食(阿拉伯)改朝换代,引起怛罗斯之战。当高仙芝返回长安,听其余的部属劝告,又因怛罗斯之战失利跟黄雷脱不了关系,疏远黄雷。黄雷转而投靠安禄山,想藉安禄山的叛乱取得势力。", + swd_lilian: + "生长在一个贵族家庭,是第三千金,她父亲已经许婚给其他贵族,但她却迷恋上来做客的骑士麦尔斯,之后麦尔斯出任务到威尼斯,莉莲也偷偷的带着她的爱犬波尔去追随他。", + swd_kangnalishi: + "梅罗文加护教骑士的指导教士,直属罗马教皇。在高卢没有一个人喜欢这个神情诡异的人。讲话都会带给人恐惧感。他称麦尔斯是他教出来最完美的骑士。", + swd_huiyan: + "慧彦俗名刘书经,从小被誉为神童,一心想金榜题名,由于过于狂妄自大,在考场取笑主考官而被逐出考场,觉得了无生趣,也不敢回乡面对乡亲父老,游荡到嵩山时,对那些会武术的和尚发生兴趣,于是就在少林寺出家。慧彦天资聪颖,无论在武术、佛学上几乎凌驾师辈后来对少林祖师达摩的事迹产生兴趣。当时唐僧玄奘去天竺取经的事迹为世人尊崇,而从天竺来到达摩所教的(禅宗)却还有些出入,于是想亲身去天竺求证,获得唐玄宗支持,让他持使节信符出关。但唐玄宗额外交代一些军事上的任务,慧彦必须协助探查远至大食附近诸国的军事情势。", + swd_shanxiaoxiao: "独孤宁珂的婢女,是宁珂来到中原之后收伏的千年琵琶精。", + swd_yuchiyanhong: "独孤宁珂的婢女,是宁珂来到中原之后收伏之千年狐狸精。", + swd_hanluo: "寒洛是玄武国世子,因与知盈的婚事遭其父玄武侯反对,而与之私奔。", + swd_fu: "福来自毛民国,因助陆承轩、夏柔搭救被毛民抓来做祭品的莫耶而得罪族人,而后随陆承轩等人离开。", + swd_linyue: + "来自氐人国的老医生,医术高明。醉心于各种医学技术,因此常外出云游,四处学习。随遇而安的个性让他不过于担心身边的人事物。", + swd_zidashu: "周侥国王子,十分仰慕陆承轩等人的高超武艺,故随其一同游历,磨练自己。", + swd_maixing: + "奇肱国老神丁的徒弟。虽然是奇肱族近来难见的天才,但好胜的个性,让他常与旁人发生争执,孤独的他在没有比较之下更以为自己技术高超,另急躁的个性也让他急于试验自己未完成的工艺品,以致于常造成大乌龙。", + swd_fuyan: "俱有满腔的热血与爱国心,外表虽然像其他白虎族人一样勇猛,其实是自幼常生病的药罐子。", + swd_haidapang: + "一目民,能在远处就注意到周遭的状况,一有危险马上逃跑!过于小心翼翼的性格,对于外界既害怕又好奇,总是张着大眼睛四处观望,又像惊弓之鸟似的随时保持警戒,做好逃跑的准备。", + swd_shaowei: + "生在朱雀国,个性高傲、善变,因与主角战斗受伤,因而忘记过去的朱雀族少女。时而天真迷惘、时而冷漠无情、时而阴狠狡诈,不知何者是她的本性。", + swd_youzhao: + "名将赵云之孙,枪法凛冽,胆识过人。一心追求建立不世之功业,期许自己能协助大汉讨灭曹贼,克复中原,以光耀祖先之名声。性格冷傲孤高,对自己在「天干十杰」名次排行战之中,竟输给了籍籍无名之孤儿焉逢,暗自耿耿为怀不已。执行任务时,出手迅疾猛狠,对敌人毫不留情,是极出色之菁英战士。", + swd_shangzhang: + "端蒙之弟,马谡之子。由于姊姊不顾家族劝阻,坚持加入飞羽,他十分担忧她的安危,便努力苦练武艺,历经艰难之后,终于在高手如林的飞羽「天干十杰」争夺战之中,以遍体鳞伤却仍力战不懈之姿,撼动所有战友,最后如愿挤入了十天干最末一个名位。他配属于「飞之部」,在姊姊身边默默守护她。", + swd_situqiang: + "原籍长安,父亲原是魏国医官,后因治疫不力遭罢,举家放逐。父亲死后,司徒蔷便想运用其自幼所习的知识,行走各地教授防疫知识。", + swd_chunyuheng: + "字长生。身拥承袭淳于一脉的绝顶医术,却不轻易替人治病。因淳于一族不长命且无法治好自己的怪病,导致性情古怪孤僻,且言谈之间尽是轻生之词,让人难以亲近。最后知晓原因后,得同伴帮助,消除诅咒。", + swd_hanlong: + "魁梧高大,身手矫健,能单手持巨刃而面不改色,是一本事卓绝之勇士。原为并西之地的胡族,因该地官员贪暴,其父反抗却遭杀害,他为照顾母亲,无奈沦为草莽盗匪,靠打劫路过达官显贵以维生。", + swd_yuli: + "他人以为是鱼妖而自称是鱼仙的混仙。在徐暮云等人追查鱼妖传闻的真相时,与其相遇,却从此成为助她成仙的伙伴。", + swd_zhanggao: + "字柏乔,为大魏名将张郃之孙,同时亦是徐暮云情谊深笃之挚友。暮云视他彷若兄长,十分尊敬。不时与暮云切磋剑术,互相砥砺,同为洛阳著名之少年剑客。", + swd_hupo: + "属于山林鬼神一族,全身雪白,眼睛碧蓝,一对长而尖细的耳朵,长着一簇蓬松的大尾巴。它的同族都是力量强大的山林鬼魅,但一般人并看不到它们,只有拥有特殊能力的人才能看得见。", + swd_jiangziya: + "周军统帅、周朝开国元勋,是一位尤其擅长法术攻击的权谋大家。曾修改了用于记载宇宙间万物生克关系的神器“太一之轮”,并留下了“周克商”的生克,造就牧野之战的胜利。", }, - perfectPair:{ - swd_fengtianling:['swd_huyue','swd_jiting'], - swd_rongshuang:['swd_zhuoshanzhu'], - swd_jialanduo:['swd_zhuoshanzhu'], - swd_sikongyu:['swd_muyue'], - swd_fengyu:['swd_ziqiao'], - swd_zhaoyun:['swd_hengai','swd_yeyaxi','zhaoyun'], - swd_hengai:['zhugeliang','sp_zhugeliang'], - swd_duanmeng:['swd_shangzhang'], - swd_shangzhang:['swd_situqiang'], - swd_tuwei:['swd_hengai'], - swd_jiangwu:['swd_zhaoyun'], - swd_muyun:['swd_lanyin','swd_zhiyin','swd_zhanggao','xushu'], - swd_lanyin:['swd_zhiyin'], - swd_yuli:['swd_chunyuheng'], - swd_jiuyou:['swd_zhiyin'], - swd_qiner:['swd_hengai'], - swd_huzhongxian:['swd_jiliang','swd_jipeng','swd_xiyan'], - swd_anka:['swd_kama'], - swd_septem:['swd_nicole','swd_kama','swd_weida','swd_wangsiyue','swd_huiyan'], - swd_nicole:['swd_lilian'], - swd_xuanyuanjianxian:['swd_xuanyuanjiantong'], - swd_chenjingchou:['swd_yuxiaoxue','swd_tuobayuer'], - swd_yuxiaoxue:['swd_yuwentuo'], - swd_zhanglie:['swd_tuobayuer'], - swd_duguningke:['swd_yuwentuo','swd_shanxiaoxiao','swd_yuchiyanhong'], - swd_jiliang:['swd_shuijing','swd_jipeng'], - swd_jipeng:['swd_duopeng'], - swd_cheyun:['swd_huanyuanzhi','swd_murongshi'], - swd_murongshi:['swd_huanyuanzhi','swd_shuijing'], - swd_huanyuanzhi:['swd_jipeng'], - swd_qi:['swd_huzhongxian'], - swd_luchengxuan:['swd_xiarou'], + perfectPair: { + swd_fengtianling: ["swd_huyue", "swd_jiting"], + swd_rongshuang: ["swd_zhuoshanzhu"], + swd_jialanduo: ["swd_zhuoshanzhu"], + swd_sikongyu: ["swd_muyue"], + swd_fengyu: ["swd_ziqiao"], + swd_zhaoyun: ["swd_hengai", "swd_yeyaxi", "zhaoyun"], + swd_hengai: ["zhugeliang", "sp_zhugeliang"], + swd_duanmeng: ["swd_shangzhang"], + swd_shangzhang: ["swd_situqiang"], + swd_tuwei: ["swd_hengai"], + swd_jiangwu: ["swd_zhaoyun"], + swd_muyun: ["swd_lanyin", "swd_zhiyin", "swd_zhanggao", "xushu"], + swd_lanyin: ["swd_zhiyin"], + swd_yuli: ["swd_chunyuheng"], + swd_jiuyou: ["swd_zhiyin"], + swd_qiner: ["swd_hengai"], + swd_huzhongxian: ["swd_jiliang", "swd_jipeng", "swd_xiyan"], + swd_anka: ["swd_kama"], + swd_septem: ["swd_nicole", "swd_kama", "swd_weida", "swd_wangsiyue", "swd_huiyan"], + swd_nicole: ["swd_lilian"], + swd_xuanyuanjianxian: ["swd_xuanyuanjiantong"], + swd_chenjingchou: ["swd_yuxiaoxue", "swd_tuobayuer"], + swd_yuxiaoxue: ["swd_yuwentuo"], + swd_zhanglie: ["swd_tuobayuer"], + swd_duguningke: ["swd_yuwentuo", "swd_shanxiaoxiao", "swd_yuchiyanhong"], + swd_jiliang: ["swd_shuijing", "swd_jipeng"], + swd_jipeng: ["swd_duopeng"], + swd_cheyun: ["swd_huanyuanzhi", "swd_murongshi"], + swd_murongshi: ["swd_huanyuanzhi", "swd_shuijing"], + swd_huanyuanzhi: ["swd_jipeng"], + swd_qi: ["swd_huzhongxian"], + swd_luchengxuan: ["swd_xiarou"], }, - skill:{ - cyqiaoxie:{ - trigger:{player:'loseEnd'}, - frequent:true, + skill: { + cyqiaoxie: { + trigger: { player: "loseEnd" }, + frequent: true, // alter:true, - filter:function(event,player){ - if(event.type=='use') return false; - for(var i=0;i1){ - prompt='###'+prompt+'###(剩余'+get.cnNumber(event.num)+'次)'; + if (list.length) { + var prompt = get.prompt("cyqiaoxie"); + if (event.num > 1) { + prompt = "###" + prompt + "###(剩余" + get.cnNumber(event.num) + "次)"; } - player.chooseVCardButton(list.randomGets(3),prompt); - } - else{ + player.chooseVCardButton(list.randomGets(3), prompt); + } else { event.finish(); } - "step 2" - if(result.bool){ - player.chooseUseTarget(true,game.createCard(result.links[0][2])); + ("step 2"); + if (result.bool) { + player.chooseUseTarget(true, game.createCard(result.links[0][2])); } event.num--; - if(event.num>0){ + if (event.num > 0) { event.goto(1); } }, - ai:{ - noe:true, - reverseEquip:true, - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip') return [1,3]; - } - } - } - }, - cyxianjiang:{ - trigger:{player:'useCardToBegin'}, - init:function(player){ - player.storage.cyxianjiang=[]; + ai: { + noe: true, + reverseEquip: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip") return [1, 3]; + }, + }, }, - filter:function(event,player){ - if(event.target!=player&&event.targets&&event.targets.length==1){ - if(player.storage.cyxianjiang.includes(event.target)) return false; - return event.target.countCards('e',function(card){ - return !player.countCards('he',card.name); + }, + cyxianjiang: { + trigger: { player: "useCardToBegin" }, + init: function (player) { + player.storage.cyxianjiang = []; + }, + filter: function (event, player) { + if (event.target != player && event.targets && event.targets.length == 1) { + if (player.storage.cyxianjiang.includes(event.target)) return false; + return event.target.countCards("e", function (card) { + return !player.countCards("he", card.name); }); } return false; }, - direct:true, - content:function(){ - 'step 0' - player.choosePlayerCard(trigger.target,'e',get.prompt('cyxianjiang')).set('ai',get.buttonValue).set('filterButton',function(button){ - return !player.countCards('he',button.link.name); - }); - 'step 1' - if(result.bool){ - player.logSkill('cyxianjiang'); - var card=result.links[0]; - player.equip(game.createCard(card),true); + direct: true, + content: function () { + "step 0"; + player + .choosePlayerCard(trigger.target, "e", get.prompt("cyxianjiang")) + .set("ai", get.buttonValue) + .set("filterButton", function (button) { + return !player.countCards("he", button.link.name); + }); + ("step 1"); + if (result.bool) { + player.logSkill("cyxianjiang"); + var card = result.links[0]; + player.equip(game.createCard(card), true); player.storage.cyxianjiang.add(trigger.target); } }, - group:'cyxianjiang_clear', - subSkill:{ - clear:{ - trigger:{global:'phaseAfter'}, - silent:true, - content:function(){ - player.storage.cyxianjiang.length=0; - } - } - } + group: "cyxianjiang_clear", + subSkill: { + clear: { + trigger: { global: "phaseAfter" }, + silent: true, + content: function () { + player.storage.cyxianjiang.length = 0; + }, + }, + }, }, - cyzhencha:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(!game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); - })){ + cyzhencha: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if ( + !game.hasPlayer(function (current) { + return current != player && current.countCards("h"); + }) + ) { return false; } - if(!player.countCards('h',{type:'basic'})) return false; - var es=player.getCards('e'); - for(var i=0;i0; - }).set('autodelay',0.5).ai=function(target){ - return -get.attitude(player,target); + cyzhencha_shuiyun: { + trigger: { player: "phaseBegin" }, + direct: true, + thundertext: true, + content: function () { + "step 0"; + player + .chooseTarget( + [1, 1], + "水云:你可以弃置一名角色的一张牌", + function (card, player, target) { + if (player == target) return false; + return target.countCards("he") > 0; + } + ) + .set("autodelay", 0.5).ai = function (target) { + return -get.attitude(player, target); }; - "step 1" - if(result.bool){ - player.logSkill('cyzhencha_shuiyun',result.targets); - player.discardPlayerCard(result.targets[0],'he',true); - } - else{ + ("step 1"); + if (result.bool) { + player.logSkill("cyzhencha_shuiyun", result.targets); + player.discardPlayerCard(result.targets[0], "he", true); + } else { event.finish(); } }, - onremove:function(player){ - _status.event.insert(lib.skill.cyzhencha_shuiyun.content,{player:player}); - } + onremove: function (player) { + _status.event.insert(lib.skill.cyzhencha_shuiyun.content, { player: player }); + }, }, - cyzhencha_liuzi:{ - trigger:{player:'phaseDrawBegin'}, - frequent:true, - thundertext:true, - content:function(){ + cyzhencha_liuzi: { + trigger: { player: "phaseDrawBegin" }, + frequent: true, + thundertext: true, + content: function () { trigger.num++; }, - onremove:function(player){ + onremove: function (player) { player.draw(); - } + }, }, - cyzhencha_yijin:{ - trigger:{player:'phaseBegin'}, - direct:true, - thundertext:true, - content:function(){ - "step 0" - player.chooseTarget([1,1],'水云:你可以弃置一名角色的一张牌',function(card,player,target){ - if(player==target) return false; - return target.countCards('he')>0; - }).set('autodelay',0.5).ai=function(target){ - return -get.attitude(player,target); + cyzhencha_yijin: { + trigger: { player: "phaseBegin" }, + direct: true, + thundertext: true, + content: function () { + "step 0"; + player + .chooseTarget( + [1, 1], + "水云:你可以弃置一名角色的一张牌", + function (card, player, target) { + if (player == target) return false; + return target.countCards("he") > 0; + } + ) + .set("autodelay", 0.5).ai = function (target) { + return -get.attitude(player, target); }; - "step 1" - if(result.bool){ - player.logSkill('cyzhencha_shuiyun',result.targets); - player.discardPlayerCard(result.targets[0],'he',true); - } - else{ + ("step 1"); + if (result.bool) { + player.logSkill("cyzhencha_shuiyun", result.targets); + player.discardPlayerCard(result.targets[0], "he", true); + } else { event.finish(); } }, - onremove:function(player){ - _status.event.insert(lib.skill.cyzhencha_shuiyun.content,{player:player}); - } - }, - cyzhencha_qingling:{ - inhert:'cyzhencha_shuiyun' - }, - cyzhencha_qiandian:{ - inhert:'cyzhencha_shuiyun' - }, - cyqiaoxie_old:{ - enable:'phaseUse', - filterCard:function(card){ - return get.type(card,'trick')=='trick'; + onremove: function (player) { + _status.event.insert(lib.skill.cyzhencha_shuiyun.content, { player: player }); }, - usable:1, - filter:function(event,player){ - var current=[]; - var es=player.getCards('e'); - for(var i=0;i7){ - map[i]=0;break; - } - else if(val<=5){ + for (var i in map) { + var hs = player.getCards("h", { suit: i }); + for (var j = 0; j < hs.length; j++) { + var val = get.value(hs[j], player, "raw"); + if (val > 7) { + map[i] = 0; + break; + } else if (val <= 5) { map[i]++; - if(val<=4){ - map[i]+=0.5; + if (val <= 4) { + map[i] += 0.5; } - if(val<0){ - map[i]+=2; + if (val < 0) { + map[i] += 2; } } } - if(map[i]>max){ - choice=i; - max=map[i]; + if (map[i] > max) { + choice = i; + max = map[i]; } } - var controls=['heart2','spade2','diamond2','club2']; - for(var i=0;i=3){ - return controls[2]; - } - else{ - return controls[0]; - } - }).set('prompt','选择一个花色从牌堆中获得'+hs.length+'张该花色的牌'); - event.num=hs.length; - 'step 2' - if(result.control){ - var suit=result.control.slice(0,result.control.length-1); - var cards=[]; - for(var i=0;i= 3) { + return controls[2]; + } else { + return controls[0]; + } + }) + .set("prompt", "选择一个花色从牌堆中获得" + hs.length + "张该花色的牌"); + event.num = hs.length; + ("step 2"); + if (result.control) { + var suit = result.control.slice(0, result.control.length - 1); + var cards = []; + for (var i = 0; i < event.num; i++) { + var card = get.cardPile(function (card) { + return get.suit(card) == suit; }); - if(card){ + if (card) { ui.special.appendChild(card); cards.push(card); - } - else{ + } else { break; } } - if(cards.length){ + if (cards.length) { player.directgain(cards); player.$draw(cards.length); game.delay(); - game.log(player,'获得了'+get.cnNumber(cards.length)+'张','#y'+get.translation(suit+'2')+'牌'); + game.log( + player, + "获得了" + get.cnNumber(cards.length) + "张", + "#y" + get.translation(suit + "2") + "牌" + ); } } }, - ai:{ - order:7, - result:{ - player:function(player){ - var list=['club','heart','diamond','spade']; - for(var i=0;i7){ - bool=false;break; - } - else if(val<=4){ - bool=true; + ai: { + order: 7, + result: { + player: function (player) { + var list = ["club", "heart", "diamond", "spade"]; + for (var i = 0; i < list.length; i++) { + var hs = player.getCards("h", { suit: list[i] }); + var bool = false; + for (var j = 0; j < hs.length; j++) { + var val = get.value(hs[j], player); + if (val > 7) { + bool = false; + break; + } else if (val <= 4) { + bool = true; } } - if(bool){ + if (bool) { return 1; } } return 0; - } - } - } + }, + }, + }, }, - yeying:{ - enable:'phaseUse', - usable:1, - viewAs:{name:'qiankunbiao'}, - viewAsFilter:function(player){ - return player.countCards('he',{color:'black'}); + yeying: { + enable: "phaseUse", + usable: 1, + viewAs: { name: "qiankunbiao" }, + viewAsFilter: function (player) { + return player.countCards("he", { color: "black" }); }, - filterCard:{color:'black'}, - position:'he', - check:function(card){ - return 7-get.value(card); + filterCard: { color: "black" }, + position: "he", + check: function (card) { + return 7 - get.value(card); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5 - } }, - juxi:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.storage.juxi>=game.countPlayer(); + juxi: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.storage.juxi >= game.countPlayer(); }, - filterTarget:true, - init:function(player){ - player.storage.juxi=0; + filterTarget: true, + init: function (player) { + player.storage.juxi = 0; }, - init2:function(player){ - if(get.mode()=='guozhan'){ - player.logSkill('juxi'); + init2: function (player) { + if (get.mode() == "guozhan") { + player.logSkill("juxi"); } }, - intro:{ - content:'mark' + intro: { + content: "mark", }, - content:function(){ - 'step 0' - player.storage.juxi-=game.countPlayer(); - player.syncStorage('juxi'); - if(player.storage.juxi<=0){ - player.unmarkSkill('juxi'); - } - else{ + content: function () { + "step 0"; + player.storage.juxi -= game.countPlayer(); + player.syncStorage("juxi"); + if (player.storage.juxi <= 0) { + player.unmarkSkill("juxi"); + } else { player.updateMarks(); } - if(target.isDamaged()){ - player.chooseControl(function(){ - if(get.attitude(player,target)>0) return 1; - return 0; - }).set('choiceList',[ - '对'+get.translation(target)+'造成1点伤害', - '令'+get.translation(target)+'回复1点体力', - ]) - } - else{ + if (target.isDamaged()) { + player + .chooseControl(function () { + if (get.attitude(player, target) > 0) return 1; + return 0; + }) + .set("choiceList", [ + "对" + get.translation(target) + "造成1点伤害", + "令" + get.translation(target) + "回复1点体力", + ]); + } else { target.damage(); event.finish(); } - 'step 1' - if(result.control=='选项一'){ + ("step 1"); + if (result.control == "选项一") { target.damage(); - } - else{ + } else { target.recover(); } }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(get.attitude(player,target)>0){ - if(target.isDamaged()) return get.recoverEffect(target,player,target); + ai: { + order: 7, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0) { + if (target.isDamaged()) return get.recoverEffect(target, player, target); return 0; + } else { + return get.damageEffect(target, player, target); } - else{ - return get.damageEffect(target,player,target); - } - } - } - }, - group:'juxi_count', - subSkill:{ - count:{ - trigger:{global:'discardAfter'}, - forced:true, - popup:false, - filter:function(event,player){ - return _status.currentPhase!=event.player; }, - content:function(){ + }, + }, + group: "juxi_count", + subSkill: { + count: { + trigger: { global: "discardAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return _status.currentPhase != event.player; + }, + content: function () { player.storage.juxi++; - player.syncStorage('juxi'); - player.markSkill('juxi'); + player.syncStorage("juxi"); + player.markSkill("juxi"); player.updateMarks(); }, - } - } - }, - jiefen:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.countCards('h')>player.countCards('h'); + }, }, - filter:function(event,player){ + }, + jiefen: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h") > player.countCards("h"); + }, + filter: function (event, player) { return !player.isMaxHandcard(); }, - content:function(){ - 'step 0' - target.chooseCard('h',true,'交给'+get.translation(player)+'一张牌'); - 'step 1' - if(result.bool){ - player.gain(result.cards,target); - target.$giveAuto(result.cards,player); - } - else{ + content: function () { + "step 0"; + target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌"); + ("step 1"); + if (result.bool) { + player.gain(result.cards, target); + target.$giveAuto(result.cards, player); + } else { event.finish(); } - 'step 2' - var nh=player.countCards('h'); - if(game.hasPlayer(function(current){ - return current.countCards('h')max){ - max=nh; + datong: { + trigger: { global: "phaseEnd" }, + frequent: true, + filter: function (event, player) { + var max = player.countCards("h"); + var min = max; + game.countPlayer(function (current) { + var nh = current.countCards("h"); + if (nh > max) { + max = nh; } - if(nh0; + huodan: { + enable: "phaseUse", + usable: 1, + filterCard: { color: "red" }, + filter: function (event, player) { + return player.countCards("he", { color: "red" }) > 0; }, - filterTarget:true, - selectTarget:[1,2], - position:'he', - check:function(card){ - return 7-get.value(card); + filterTarget: true, + selectTarget: [1, 2], + position: "he", + check: function (card) { + return 7 - get.value(card); }, - contentBefore:function(){ + contentBefore: function () { player.loseHp(); }, // alter:true, - content:function(){ - if(targets.length==1){ - target.damage('fire',2); - if(get.is.altered('huodan')) target.draw(); - } - else{ - target.damage('fire'); + content: function () { + if (targets.length == 1) { + target.damage("fire", 2); + if (get.is.altered("huodan")) target.draw(); + } else { + target.damage("fire"); } }, - line:'fire', - ai:{ - order:15, - expose:0.2, - threaten:1.5, - result:{ - target:function(player,target){ - if(player.hp<2) return 0; - if(get.attitude(player,target)>=0) return 0; - if(target.hp>player.hp) return 0; - var eff=get.damageEffect(target,player,target,'fire'); - if(eff<0){ - if(ui.selected.targets.length&&target.hp>1&&ui.selected.targets[0].hp>1){ + line: "fire", + ai: { + order: 15, + expose: 0.2, + threaten: 1.5, + result: { + target: function (player, target) { + if (player.hp < 2) return 0; + if (get.attitude(player, target) >= 0) return 0; + if (target.hp > player.hp) return 0; + var eff = get.damageEffect(target, player, target, "fire"); + if (eff < 0) { + if ( + ui.selected.targets.length && + target.hp > 1 && + ui.selected.targets[0].hp > 1 + ) { return 0; } - if(target.nodying) return eff/10; - return eff/Math.sqrt(target.hp); + if (target.nodying) return eff / 10; + return eff / Math.sqrt(target.hp); } return 0; - } - } - } + }, + }, + }, }, - sxianjing:{ - enable:'phaseUse', - filter:function(event,player){ - var suits=[]; - for(var i=0;i0; + ("step 1"); + player.randomGain(trigger.player, true); }, - content:function(){ - var card=player.storage.sxianjing.randomGet(); + }, + damage: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player.storage.sxianjing.length > 0; + }, + content: function () { + var card = player.storage.sxianjing.randomGet(); player.storage.sxianjing.remove(card); - player.gain(card,'draw'); - player.syncStorage('sxianjing'); - if(player.storage.sxianjing.length){ + player.gain(card, "draw"); + player.syncStorage("sxianjing"); + if (player.storage.sxianjing.length) { player.updateMarks(); + } else { + player.unmarkSkill("sxianjing"); } - else{ - player.unmarkSkill('sxianjing'); - } - } - } - } - }, - zhanxing:{ - enable:'phaseUse', - usable:1, - position:'he', - filterCard:true, - selectCard:[1,Infinity], - filter:function(event,player){ - return player.countCards('he')>0; + }, + }, }, - check:function(card){ - switch(ui.selected.cards.length){ - case 0: return 8-get.value(card); - case 1: return 6-get.value(card); - case 2: return 3-get.value(card); + }, + zhanxing: { + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + selectCard: [1, Infinity], + filter: function (event, player) { + return player.countCards("he") > 0; + }, + check: function (card) { + switch (ui.selected.cards.length) { + case 0: + return 8 - get.value(card); + case 1: + return 6 - get.value(card); + case 2: + return 3 - get.value(card); } return 0; }, - content:function(){ - 'step 0' - var list=get.cards(cards.length); - event.list=list; + content: function () { + "step 0"; + var list = get.cards(cards.length); + event.list = list; player.showCards(list); - 'step 1' - var suits=[]; - event.suits=suits; - for(var i=0;i2&& - get.damageEffect(trigger.target,trigger.player,player)<0); - next.ai=function(card){ - if(goon){ - if(trigger.target.hp==1) return 10-get.value(card); - return 7-get.value(card); + }, + tiebi: { + trigger: { global: "shaBegin" }, + filter: function (event, player) { + return ( + player.countCards("h", { color: "black" }) && + !event.target.hujia && + get.distance(player, event.target) <= 1 + ); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("tiebi", trigger.target), { + color: "black", + }); + var goon = + get.attitude(player, trigger.target) > 2 && + get.damageEffect(trigger.target, trigger.player, player) < 0; + next.ai = function (card) { + if (goon) { + if (trigger.target.hp == 1) return 10 - get.value(card); + return 7 - get.value(card); } return 0; }; - next.logSkill=['tiebi',trigger.target]; - "step 1" - if(result.bool){ + next.logSkill = ["tiebi", trigger.target]; + ("step 1"); + if (result.bool) { trigger.target.changeHujia(); } }, - ai:{ - threaten:1.1 - } + ai: { + threaten: 1.1, + }, }, - shenyan:{ - trigger:{source:'damageBegin'}, - skillAnimation:true, - animationColor:'fire', - filter:function(event,player){ - return !player.storage.shenyan&&event.hasNature('fire'); + shenyan: { + trigger: { source: "damageBegin" }, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + return !player.storage.shenyan && event.hasNature("fire"); }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - mark:true, - logTarget:'player', - init:function(player){ - player.storage.shenyan=false; + mark: true, + logTarget: "player", + init: function (player) { + player.storage.shenyan = false; }, - check:function(event,player){ - if(get.attitude(player,event.player)>=0) return 0; - if(player.hasUnknown()) return 0; - var num=0,players=game.filterPlayer(); - for(var i=0;i0){ + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return 0; + if (player.hasUnknown()) return 0; + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + players[i] != event.player && + get.distance(event.player, players[i]) <= 1 + ) { + var eff = get.damageEffect(players[i], player, player, "fire"); + if (eff > 0) { num++; - } - else if(eff<0){ + } else if (eff < 0) { num--; } } } - return num>0; + return num > 0; }, - content:function(){ + content: function () { trigger.num++; - player.addSkill('shenyan2'); - player.storage.shenyan=true; - player.awakenSkill('shenyan'); - player.storage.shenyan2=[]; - var players=game.filterPlayer(); - for(var i=0;i0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - target.chooseToDiscard(2,'h',true).delay=false; - 'step 1' + content: function () { + "step 0"; + target.chooseToDiscard(2, "h", true).delay = false; + ("step 1"); target.draw(); }, - selectTarget:-1, - ai:{ - order:9, - result:{ - target:-1 - } - } + selectTarget: -1, + ai: { + order: 9, + result: { + target: -1, + }, + }, }, - xuanying:{ - subSkill:{ - sha:{ - enable:'chooseToUse', - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - if(player.isLinked()) return false; + xuanying: { + subSkill: { + sha: { + enable: "chooseToUse", + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (player.isLinked()) return false; }, - precontent:function(){ + precontent: function () { player.link(); // player.getStat().card.sha--; }, - filterCard:function(){return false}, - selectCard:-1, - prompt:'横置武将牌,视为使用一张无视距离的杀', - ai:{ - order:function(){ + filterCard: function () { + return false; + }, + selectCard: -1, + prompt: "横置武将牌,视为使用一张无视距离的杀", + ai: { + order: function () { // if(_status.event.player.countCards('h',{type:'equip'})) return 9; return 3.15; }, - skillTagFilter:function(player,tag,arg){ - if(arg!='use') return false; - if(player.isLinked()) return false; + skillTagFilter: function (player, tag, arg) { + if (arg != "use") return false; + if (player.isLinked()) return false; }, - respondSha:true, + respondSha: true, }, - mod:{ - targetInRange:function(card){ - if(_status.event.skill=='xuanying_sha') return true; - } + mod: { + targetInRange: function (card) { + if (_status.event.skill == "xuanying_sha") return true; + }, }, }, - shan:{ - trigger:{player:['chooseToRespondBegin','chooseToUseBegin']}, - filter:function(event,player){ - if(!player.isLinked()) return false; - if(event.responded) return false; - if(!event.filterCard({name:'shan'},player,event)) return false; + shan: { + trigger: { player: ["chooseToRespondBegin", "chooseToUseBegin"] }, + filter: function (event, player) { + if (!player.isLinked()) return false; + if (event.responded) return false; + if (!event.filterCard({ name: "shan" }, player, event)) return false; return true; }, - check:function(event,player){ - if(get.damageEffect(player,event.player,player)>=0) return false; + check: function (event, player) { + if (get.damageEffect(player, event.player, player) >= 0) return false; return true; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.link(); - 'step 1' + ("step 1"); trigger.untrigger(); - trigger.responded=true; - trigger.result={bool:true,card:{name:'shan'}} + trigger.responded = true; + trigger.result = { bool: true, card: { name: "shan" } }; }, - ai:{ - respondShan:true, - target:function(card,player,target,current){ - if(!player.isLinked()&¤t<0) return 1.5; - if(!target.hasFriend()) return; - if(get.tag(card,'loseCard')&&_status.currentPhase!=target&&target.countCards('he')){ - return [0.5,Math.max(2,target.countCards('h'))]; + ai: { + respondShan: true, + target: function (card, player, target, current) { + if (!player.isLinked() && current < 0) return 1.5; + if (!target.hasFriend()) return; + if ( + get.tag(card, "loseCard") && + _status.currentPhase != target && + target.countCards("he") + ) { + return [0.5, Math.max(2, target.countCards("h"))]; } - if(get.tag(card,'respondSha')||get.tag(card,'respondShan')){ - if(get.attitude(player,target)>0&&card.name=='juedou') return; - return [0.5,target.countCards('h','sha')+target.countCards('h','shan')]; + if (get.tag(card, "respondSha") || get.tag(card, "respondShan")) { + if (get.attitude(player, target) > 0 && card.name == "juedou") return; + return [ + 0.5, + target.countCards("h", "sha") + target.countCards("h", "shan"), + ]; } - } - } + }, + }, }, - damage:{ - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.source&&event.source.isAlive()&&player.isLinked()&& - lib.filter.targetEnabled({name:'sha'},player,event.source); + damage: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + event.source && + event.source.isAlive() && + player.isLinked() && + lib.filter.targetEnabled({ name: "sha" }, player, event.source) + ); }, - check:function(event,player){ - return get.effect(event.source,{name:'sha'},player,player)>0; + check: function (event, player) { + return get.effect(event.source, { name: "sha" }, player, player) > 0; }, - logTarget:'source', - content:function(){ - 'step 0' + logTarget: "source", + content: function () { + "step 0"; player.link(); - 'step 1' - player.useCard({name:'sha'},trigger.source); - } - }, - use:{ - trigger:{player:'loseEnd'}, - direct:true, - filter:function(event,player){ - return _status.currentPhase!=player&&player.isLinked()&&event.cards&&event.cards.length; + ("step 1"); + player.useCard({ name: "sha" }, trigger.source); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('xuanying'),function(card,player,target){ - return lib.filter.targetEnabled({name:'sha'},player,target); - }).set('ai',function(target){ - return get.effect(target,{name:'sha'},_status.event.player); - }).set('autodelay',0.5); - 'step 1' - if(result.bool){ - player.logSkill('xuanying'); + }, + use: { + trigger: { player: "loseEnd" }, + direct: true, + filter: function (event, player) { + return ( + _status.currentPhase != player && + player.isLinked() && + event.cards && + event.cards.length + ); + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("xuanying"), function (card, player, target) { + return lib.filter.targetEnabled({ name: "sha" }, player, target); + }) + .set("ai", function (target) { + return get.effect(target, { name: "sha" }, _status.event.player); + }) + .set("autodelay", 0.5); + ("step 1"); + if (result.bool) { + player.logSkill("xuanying"); player.link(); - player.useCard({name:'sha'},result.targets,false); + player.useCard({ name: "sha" }, result.targets, false); } }, - } + }, }, - group:['xuanying_sha','xuanying_use'], - ai:{ - threaten:function(player,target){ - if(target.isLinked()) return 0.7; + group: ["xuanying_sha", "xuanying_use"], + ai: { + threaten: function (player, target) { + if (target.isLinked()) return 0.7; return 1.4; - } - } - }, - hwendao:{ - trigger:{player:['useCardAfter','respondAfter',]}, - check:function(event,player){ - return get.attitude(player,_status.currentPhase)<=0; + }, }, - logTarget:function(){ + }, + hwendao: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + check: function (event, player) { + return get.attitude(player, _status.currentPhase) <= 0; + }, + logTarget: function () { return _status.currentPhase; }, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(!_status.currentPhase.countCards('he')) return false; - return event.cards&&event.cards.length==1; + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (!_status.currentPhase.countCards("he")) return false; + return event.cards && event.cards.length == 1; }, - content:function(){ - 'step 0' - var suit=get.suit(trigger.cards[0]); - var goon=(get.attitude(_status.currentPhase,player)<=0); - _status.currentPhase.chooseToDiscard('弃置一张'+get.translation(suit+'2')+ - '牌,或令'+get.translation(player)+'获得你的一张牌',{suit:suit}).ai=function(card){ - if(goon) return 8-get.value(card); + content: function () { + "step 0"; + var suit = get.suit(trigger.cards[0]); + var goon = get.attitude(_status.currentPhase, player) <= 0; + _status.currentPhase.chooseToDiscard( + "弃置一张" + + get.translation(suit + "2") + + "牌,或令" + + get.translation(player) + + "获得你的一张牌", + { suit: suit } + ).ai = function (card) { + if (goon) return 8 - get.value(card); return 0; - } - 'step 1' - if(!result.bool){ - player.gainPlayerCard(_status.currentPhase,'he',true); + }; + ("step 1"); + if (!result.bool) { + player.gainPlayerCard(_status.currentPhase, "he", true); } }, - ai:{ - threaten:0.7 - } + ai: { + threaten: 0.7, + }, }, - lingfeng:{ - trigger:{player:'phaseEnd'}, - frequent:true, - filter:function(event,player){ - return player.countUsed()>=Math.min(3,player.hp); + lingfeng: { + trigger: { player: "phaseEnd" }, + frequent: true, + filter: function (event, player) { + return player.countUsed() >= Math.min(3, player.hp); }, - content:function(){ - 'step 0' - player.chooseTarget('凌锋',function(card,player,target){ - return player!=target&&get.distance(player,target,'attack')<=1; - }).set('prompt2','造成1点伤害,或取消并获得1点护甲').ai=function(target){ - if(player.hp==1) return 0; - if(player.hp==2&&target.hp>=3) return 0; - return get.damageEffect(target,player,player); - } - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + player + .chooseTarget("凌锋", function (card, player, target) { + return player != target && get.distance(player, target, "attack") <= 1; + }) + .set("prompt2", "造成1点伤害,或取消并获得1点护甲").ai = function (target) { + if (player.hp == 1) return 0; + if (player.hp == 2 && target.hp >= 3) return 0; + return get.damageEffect(target, player, player); + }; + ("step 1"); + if (result.bool) { player.line(result.targets[0]); result.targets[0].damage(); - } - else{ + } else { player.changeHujia(); } }, - ai:{ - order:-10, - result:{ - target:2 + ai: { + order: -10, + result: { + target: 2, }, - threaten:1.5 - } + threaten: 1.5, + }, }, - hxunzhi:{ - unique:true, - enable:'phaseUse', - derivation:['wusheng','paoxiao'], - filter:function(event,player){ + hxunzhi: { + unique: true, + enable: "phaseUse", + derivation: ["wusheng", "paoxiao"], + filter: function (event, player) { return !player.storage.hxunzhi; }, // alter:true, - init:function(player){ - player.storage.hxunzhi=false; + init: function (player) { + player.storage.hxunzhi = false; }, - mark:true, - intro:{ - content:'limited' + mark: true, + intro: { + content: "limited", }, - skillAnimation:true, - animationColor:'fire', - content:function(){ - 'step 0' - player.awakenSkill('hxunzhi'); - player.storage.hxunzhi=true; - if(!get.is.altered('hxunzhi')){ - var targets=game.filterPlayer(function(current){ - return player.canUse('wanjian',current); + skillAnimation: true, + animationColor: "fire", + content: function () { + "step 0"; + player.awakenSkill("hxunzhi"); + player.storage.hxunzhi = true; + if (!get.is.altered("hxunzhi")) { + var targets = game.filterPlayer(function (current) { + return player.canUse("wanjian", current); }); targets.sort(lib.sort.seat); - player.useCard({name:'wanjian'},targets); + player.useCard({ name: "wanjian" }, targets); } - 'step 1' - player.addSkill('wusheng'); - player.addSkill('paoxiao'); - player.addSkill('hxunzhi2'); + ("step 1"); + player.addSkill("wusheng"); + player.addSkill("paoxiao"); + player.addSkill("hxunzhi2"); }, - ai:{ - order:2, - result:{ - player:function(player){ - if(get.mode()=='identity'){ - if(player.identity=='zhu') return 0; - if(player.identity=='nei') return 0; + ai: { + order: 2, + result: { + player: function (player) { + if (get.mode() == "identity") { + if (player.identity == "zhu") return 0; + if (player.identity == "nei") return 0; + } else if (get.mode() == "guozhan") { + if (player.identity == "ye") return 0; + if (player.isUnseen()) return 0; } - else if(get.mode()=='guozhan'){ - if(player.identity=='ye') return 0; - if(player.isUnseen()) return 0; - } - if(player.hp==1) return 1; - if(player.hasUnknown()) return 0; - if(!player.hasFriend()) return 0; - var enemies=player.getEnemies(); - if(enemies.length+1==game.players.length) return 0; - var num=player.hasCard(function(card){ - return card.name=='sha'||get.color(card)=='red'; + if (player.hp == 1) return 1; + if (player.hasUnknown()) return 0; + if (!player.hasFriend()) return 0; + var enemies = player.getEnemies(); + if (enemies.length + 1 == game.players.length) return 0; + var num = player.hasCard(function (card) { + return card.name == "sha" || get.color(card) == "red"; }); - if(num<2) return 0; - for(var i=0;i0&& - !enemies[i].getEquip(2)&&num>enemies[i].hp&&enemies[i].hp<=2){ + if (num < 2) return 0; + for (var i = 0; i < enemies.length; i++) { + if ( + player.canUse("sha", enemies[i]) && + get.effect(enemies[i], { name: "sha" }, player, player) > 0 && + !enemies[i].getEquip(2) && + num > enemies[i].hp && + enemies[i].hp <= 2 + ) { return 1; } } return 0; - } - } - } + }, + }, + }, }, - hxunzhi2:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('xunzhi2'); + hxunzhi2: { + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("xunzhi2"); player.die(); - } + }, }, - hjifeng:{ - enable:'phaseUse', - filter:function(event,player){ - if(!player.countCards('h')) return false; - if(player.countCards('h',{type:'jiqi'})) return false; + hjifeng: { + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("h")) return false; + if (player.countCards("h", { type: "jiqi" })) return false; return true; }, - discard:false, - prepare:'throw2', - usable:1, - check:function(card){ - return 6-get.value(card); + discard: false, + prepare: "throw2", + usable: 1, + check: function (card) { + return 6 - get.value(card); }, - filterCard:true, - content:function(){ - var name=get.suit(cards[0]); - ui.cardPile.insertBefore(cards[0],ui.cardPile.firstChild); - switch(name){ - case 'spade':name='qinglongzhigui';break; - case 'club':name='baishouzhihu';break; - case 'diamond':name='zhuquezhizhang';break; - case 'heart':name='xuanwuzhihuang';break; + filterCard: true, + content: function () { + var name = get.suit(cards[0]); + ui.cardPile.insertBefore(cards[0], ui.cardPile.firstChild); + switch (name) { + case "spade": + name = "qinglongzhigui"; + break; + case "club": + name = "baishouzhihu"; + break; + case "diamond": + name = "zhuquezhizhang"; + break; + case "heart": + name = "xuanwuzhihuang"; + break; } - player.gain(get.cardPile(name)||game.createCard(name),'draw'); + player.gain(get.cardPile(name) || game.createCard(name), "draw"); + }, + ai: { + order: 4, + result: { + player: 1, + }, }, - ai:{ - order:4, - result:{ - player:1 - } - } }, - hjifeng_old:{ - trigger:{player:'phaseEnd'}, - filter:function(event,player){ - if(!player.countCards('he',{type:'equip'})) return false; - if(player.countCards('h',{type:'jiqi'})) return false; - if(get.cardPile(function(card){return get.type(card)=='jiqi'})) return true; + hjifeng_old: { + trigger: { player: "phaseEnd" }, + filter: function (event, player) { + if (!player.countCards("he", { type: "equip" })) return false; + if (player.countCards("h", { type: "jiqi" })) return false; + if ( + get.cardPile(function (card) { + return get.type(card) == "jiqi"; + }) + ) + return true; return false; }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard('he','祭风:是否弃置一张装备牌并获得一张祭器牌?',{type:'equip'}).set('ai',function(card){ - return 6-get.value(card); - }).logSkill='hjifeng'; - 'step 1' - if(result.bool){ - var card=get.cardPile(function(card){ - return get.type(card)=='jiqi'&&card.name.indexOf('yuchan')!=0; - })||get.cardPile(function(card){ - return get.type(card)=='jiqi'; - }); - if(card){ - player.gain(card,'draw'); + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard("he", "祭风:是否弃置一张装备牌并获得一张祭器牌?", { + type: "equip", + }) + .set("ai", function (card) { + return 6 - get.value(card); + }).logSkill = "hjifeng"; + ("step 1"); + if (result.bool) { + var card = + get.cardPile(function (card) { + return get.type(card) == "jiqi" && card.name.indexOf("yuchan") != 0; + }) || + get.cardPile(function (card) { + return get.type(card) == "jiqi"; + }); + if (card) { + player.gain(card, "draw"); } } - } + }, }, - lmazui:{ - audio:'mazui', - enable:'phaseUse', - usable:1, - filterCard:{color:'black'}, - filterTarget:function(card,player,target){ - return !target.hasSkill('lmazui2'); + lmazui: { + audio: "mazui", + enable: "phaseUse", + usable: 1, + filterCard: { color: "black" }, + filterTarget: function (card, player, target) { + return !target.hasSkill("lmazui2"); }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - discard:false, - prepare:'give', - content:function(){ - target.storage.lmazui2=cards[0]; - target.addSkill('lmazui2'); - game.addVideo('storage',target,['lmazui2',get.cardInfo(target.storage.lmazui2),'card']); + discard: false, + prepare: "give", + content: function () { + target.storage.lmazui2 = cards[0]; + target.addSkill("lmazui2"); + game.addVideo("storage", target, [ + "lmazui2", + get.cardInfo(target.storage.lmazui2), + "card", + ]); }, - ai:{ - expose:0.2, - result:{ - target:function(player,target){ + ai: { + expose: 0.2, + result: { + target: function (player, target) { return -target.hp; - } + }, }, - order:4, - threaten:1.2 - } - }, - lmazui2:{ - trigger:{source:'damageBegin'}, - forced:true, - mark:'card', - filter:function(event){ - return event.num>0; + order: 4, + threaten: 1.2, }, - content:function(){ + }, + lmazui2: { + trigger: { source: "damageBegin" }, + forced: true, + mark: "card", + filter: function (event) { + return event.num > 0; + }, + content: function () { trigger.num--; - player.addSkill('lmazui3'); - player.removeSkill('lmazui2'); + player.addSkill("lmazui3"); + player.removeSkill("lmazui2"); + }, + intro: { + content: "card", }, - intro:{ - content:'card' - } }, - lmazui3:{ - trigger:{source:['damageEnd','damageZero']}, - forced:true, - popup:false, - content:function(){ - player.gain(player.storage.lmazui2,'gain2','log'); - player.removeSkill('lmazui3'); + lmazui3: { + trigger: { source: ["damageEnd", "damageZero"] }, + forced: true, + popup: false, + content: function () { + player.gain(player.storage.lmazui2, "gain2", "log"); + player.removeSkill("lmazui3"); delete player.storage.lmazui2; - } + }, }, - hyunshen:{ - trigger:{player:['respond','useCard']}, - filter:function(event,player){ - return event.card.name=='shan'; + hyunshen: { + trigger: { player: ["respond", "useCard"] }, + filter: function (event, player) { + return event.card.name == "shan"; }, - frequent:true, - init:function(player){ - player.storage.hyunshen=0; + frequent: true, + init: function (player) { + player.storage.hyunshen = 0; }, - content:function(){ + content: function () { player.storage.hyunshen++; - player.markSkill('hyunshen'); + player.markSkill("hyunshen"); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'respondShan')){ - var shans=target.countCards('h','shan'); - var hs=target.countCards('h'); - if(shans>1) return [1,1]; - if(shans&&hs>2) return [1,1]; - if(shans) return [1,0.5]; - if(hs>2) return [1,0.3]; - if(hs>1) return [1,0.2]; - return [1.2,0]; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "respondShan")) { + var shans = target.countCards("h", "shan"); + var hs = target.countCards("h"); + if (shans > 1) return [1, 1]; + if (shans && hs > 2) return [1, 1]; + if (shans) return [1, 0.5]; + if (hs > 2) return [1, 0.3]; + if (hs > 1) return [1, 0.2]; + return [1.2, 0]; } - } + }, }, - threaten:0.8 + threaten: 0.8, }, - intro:{ - content:'mark' + intro: { + content: "mark", }, - group:'hyunshen2' + group: "hyunshen2", }, - hyunshen2:{ - trigger:{player:'phaseBegin'}, - forced:true, - filter:function(event,player){ - return player.storage.hyunshen>0; + hyunshen2: { + trigger: { player: "phaseBegin" }, + forced: true, + filter: function (event, player) { + return player.storage.hyunshen > 0; }, - content:function(){ + content: function () { player.draw(player.storage.hyunshen); - player.storage.hyunshen=0; - player.unmarkSkill('hyunshen'); + player.storage.hyunshen = 0; + player.unmarkSkill("hyunshen"); + }, + mod: { + globalTo: function (from, to, distance) { + if (typeof to.storage.hyunshen == "number") return distance + to.storage.hyunshen; + }, }, - mod:{ - globalTo:function(from,to,distance){ - if(typeof to.storage.hyunshen=='number') return distance+to.storage.hyunshen; - } - } }, - hlingbo:{ - audio:['lingbo',2], - trigger:{player:['respond','useCard']}, - filter:function(event,player){ - return event.card.name=='shan'; + hlingbo: { + audio: ["lingbo", 2], + trigger: { player: ["respond", "useCard"] }, + filter: function (event, player) { + return event.card.name == "shan"; }, - frequent:true, - content:function(){ + frequent: true, + content: function () { player.draw(2); }, - ai:{ - mingzhi:false, - useShan:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'respondShan')){ - var shans=target.countCards('h','shan'); - var hs=target.countCards('h'); - if(shans>1) return [0,1]; - if(shans&&hs>2) return [0,1]; - if(shans) return [0,0]; - if(hs>2) return [0,0]; - if(hs>1) return [1,0.5]; - return [1.5,0]; + ai: { + mingzhi: false, + useShan: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "respondShan")) { + var shans = target.countCards("h", "shan"); + var hs = target.countCards("h"); + if (shans > 1) return [0, 1]; + if (shans && hs > 2) return [0, 1]; + if (shans) return [0, 0]; + if (hs > 2) return [0, 0]; + if (hs > 1) return [1, 0.5]; + return [1.5, 0]; } - } + }, }, - threaten:0.8 - } - }, - gtiandao:{ - audio:true, - trigger:{global:'judge'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + threaten: 0.8, }, - content:function(){ - "step 0" - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('gtiandao'),'he').ai=function(card){ - var trigger=_status.event.parent._trigger; - var player=_status.event.player; - var result=trigger.judge(card)-trigger.judge(trigger.player.judging[0]); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ + }, + gtiandao: { + audio: true, + trigger: { global: "judge" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("gtiandao"), + "he" + ).ai = function (card) { + var trigger = _status.event.parent._trigger; + var player = _status.event.player; + var result = trigger.judge(card) - trigger.judge(trigger.player.judging[0]); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { return result; - } - else{ + } else { return -result; } }; - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight'); - } - else{ + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight"); + } else { event.finish(); } - "step 2" - if(result.bool){ - player.logSkill('gtiandao'); + ("step 2"); + if (result.bool) { + player.logSkill("gtiandao"); player.$gain2(trigger.player.judging[0]); player.gain(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.position.appendChild(result.cards[0]); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); } - "step 3" + ("step 3"); game.delay(2); }, - ai:{ - tag:{ - rejudge:1 + ai: { + tag: { + rejudge: 1, }, - threaten:1.5 - } - }, - jinlin:{ - enable:'phaseUse', - unique:true, - mark:true, - skillAnimation:true, - animationColor:'metal', - init:function(player){ - player.storage.jinlin=false; + threaten: 1.5, }, - filter:function(event,player){ - if(player.storage.jinlin) return false; + }, + jinlin: { + enable: "phaseUse", + unique: true, + mark: true, + skillAnimation: true, + animationColor: "metal", + init: function (player) { + player.storage.jinlin = false; + }, + filter: function (event, player) { + if (player.storage.jinlin) return false; return true; }, - filterTarget:true, - selectTarget:[1,Infinity], - contentBefore:function(){ - player.awakenSkill('jinlin'); - player.storage.jinlin=true; + filterTarget: true, + selectTarget: [1, Infinity], + contentBefore: function () { + player.awakenSkill("jinlin"); + player.storage.jinlin = true; }, - content:function(){ + content: function () { target.changeHujia(3); - target.addSkill('jinlin2'); - target.storage.jinlin2=3; + target.addSkill("jinlin2"); + target.storage.jinlin2 = 3; }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(player.hp==1) return 1; - var num=0; - var players=game.filterPlayer(); - for(var i=0;i2){ - if(players[i].hp==1) return 1; - if(players[i].hp==2) { - if(players[i].countCards('h')==0) return 1; + ai: { + order: 1, + result: { + target: function (player, target) { + if (player.hp == 1) return 1; + var num = 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 2) { + if (players[i].hp == 1) return 1; + if (players[i].hp == 2) { + if (players[i].countCards("h") == 0) return 1; num++; } } } - if(player.hasUnknown()) return 0; - if(num>1) return 1; + if (player.hasUnknown()) return 0; + if (num > 1) return 1; return 0; - } + }, }, }, - intro:{ - content:'limited' - } + intro: { + content: "limited", + }, }, - jinlin2:{ - trigger:{player:'phaseBegin'}, - silent:true, - content:function(){ - if(player.hujia>0){ + jinlin2: { + trigger: { player: "phaseBegin" }, + silent: true, + content: function () { + if (player.hujia > 0) { player.changeHujia(-1); } player.storage.jinlin2--; - if(player.hujia==0||player.storage.jinlin2==0){ - player.removeSkill('jinlin2'); + if (player.hujia == 0 || player.storage.jinlin2 == 0) { + player.removeSkill("jinlin2"); delete player.storage.jinlin2; } }, - ai:{ - threaten:0.8 - } + ai: { + threaten: 0.8, + }, }, - lingyue:{ - trigger:{player:'shaBegin'}, - check:function(event,player){ - return get.attitude(player,event.target)<0; + lingyue: { + trigger: { player: "shaBegin" }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - logTarget:'target', - filter:function(event,player){ - return event.target.countCards('he')>0; + logTarget: "target", + filter: function (event, player) { + return event.target.countCards("he") > 0; + }, + content: function () { + trigger.target.chooseToDiscard("he", true); }, - content:function(){ - trigger.target.chooseToDiscard('he',true); - } }, - fengze:{ - enable:'phaseUse', - filterCard:{color:'black'}, - selectCard:1, - position:'he', - usable:1, - viewAs:{name:'taoyuan'}, - filter:function(event,player){ - return player.countCards('he',{color:'black'})>0; + fengze: { + enable: "phaseUse", + filterCard: { color: "black" }, + selectCard: 1, + position: "he", + usable: 1, + viewAs: { name: "taoyuan" }, + filter: function (event, player) { + return player.countCards("he", { color: "black" }) > 0; }, - audio:true, - prompt:'将一张黑色牌当作桃园结义使用', - check:function(card){ - return 7-get.useful(card) + audio: true, + prompt: "将一张黑色牌当作桃园结义使用", + check: function (card) { + return 7 - get.useful(card); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5 - } }, - zaowu:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h',{suit:['spade','heart']})>0; + zaowu: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", { suit: ["spade", "heart"] }) > 0; }, - filterCard:{suit:['spade','heart']}, - viewAs:{name:'fengyinzhidan'}, - check:function(card){ - return 7-get.value(card); + filterCard: { suit: ["spade", "heart"] }, + viewAs: { name: "fengyinzhidan" }, + check: function (card) { + return 7 - get.value(card); + }, + ai: { + order: 8.5, }, - ai:{ - order:8.5, - } }, - huanxia:{ - enable:'chooseToUse', - filterCard:function(card){ - return get.color(card)=='red'; + huanxia: { + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "red"; }, - position:'he', - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - if(!player.countCards('he',{color:'red'})) return false; + position: "he", + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (!player.countCards("he", { color: "red" })) return false; }, - prompt:'将一张红色牌当杀使用', - check:function(card){return 5-get.value(card)}, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.1; + prompt: "将一张红色牌当杀使用", + check: function (card) { + return 5 - get.value(card); + }, + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.1; }, - respondSha:true, - skillTagFilter:function(player,tag,arg){ - if(arg!='use') return false; - if(!player.countCards('he',{color:'red'})) return false; + respondSha: true, + skillTagFilter: function (player, tag, arg) { + if (arg != "use") return false; + if (!player.countCards("he", { color: "red" })) return false; }, }, - group:['huanxia_expire','huanxia_draw','huanxia_gain'], - subSkill:{ - expire:{ - trigger:{source:'damageAfter'}, - forced:true, - popup:false, - filter:function(event){ - return event.parent.skill=='huanxia'; + group: ["huanxia_expire", "huanxia_draw", "huanxia_gain"], + subSkill: { + expire: { + trigger: { source: "damageAfter" }, + forced: true, + popup: false, + filter: function (event) { + return event.parent.skill == "huanxia"; + }, + content: function () { + player.storage.huanxia = true; }, - content:function(){ - player.storage.huanxia=true; - } }, - draw:{ - trigger:{player:'shaAfter'}, - forced:true, - popup:false, - content:function(){ - if(trigger.parent.skill=='huanxia'){ - var card=trigger.cards[0]; - if(get.itemtype(card)=='card'&&get.position(card)=='d'&&!player.storage.huanxia){ + draw: { + trigger: { player: "shaAfter" }, + forced: true, + popup: false, + content: function () { + if (trigger.parent.skill == "huanxia") { + var card = trigger.cards[0]; + if ( + get.itemtype(card) == "card" && + get.position(card) == "d" && + !player.storage.huanxia + ) { ui.special.appendChild(card); - if(!player.storage.huanxia_draw){ - player.storage.huanxia_draw=[]; + if (!player.storage.huanxia_draw) { + player.storage.huanxia_draw = []; } player.storage.huanxia_draw.push(card); } } delete player.storage.huanxia; - } + }, }, - gain:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter:function(event,player){ + gain: { + trigger: { player: "phaseEnd" }, + forced: true, + filter: function (event, player) { return player.storage.huanxia_draw; }, - content:function(){ - player.gain(player.storage.huanxia_draw,'gain2'); + content: function () { + player.gain(player.storage.huanxia_draw, "gain2"); delete player.storage.huanxia_draw; - } - } - } + }, + }, + }, }, - kongmo:{ - trigger:{player:'useCardAfter'}, - forced:true, - filter:function(event,player){ - if(event.parent.name=='kongmo') return false; - if(!event.targets||!event.card) return false; - var type=get.type(event.card); - if(type!='basic'&&type!='trick') return false; - var card=game.createCard(event.card.name,event.card.suit,event.card.number); - for(var i=0;i=0) return 0; - if(get.population('fan')<3) return 0; + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.hasSkillTag("noturn")) return 0; + if (game.phaseNumber < game.players.length) return 0; + if (game.phaseNumber < game.players.length * 2 && player.hp == player.maxHp) + return 0; + if (player.hasUnknown()) return 0; + switch (lib.config.mode) { + case "identity": { + switch (player.identity) { + case "zhu": { + if (get.situation() >= 0) return 0; + if (get.population("fan") < 3) return 0; return -1; } - case 'zhong':{ - if(get.population('fan')<3) return 0; + case "zhong": { + if (get.population("fan") < 3) return 0; return -1; } - case 'nei':return 0; - case 'fan':{ - if(get.population('fan')==0) return 0; - if(get.population('zhong')<2) return 0; + case "nei": + return 0; + case "fan": { + if (get.population("fan") == 0) return 0; + if (get.population("zhong") < 2) return 0; return -1; } } break; } - case 'guozhan':{ - if(player.identity=='unknown') return 0; - return get.population(player.identity)>=3?-1:0; + case "guozhan": { + if (player.identity == "unknown") return 0; + return get.population(player.identity) >= 3 ? -1 : 0; } - default:{ + default: { return -1; } } }, - } - } - }, - bingfeng2:{ - mod:{ - cardEnabled:function(){ - return false; }, - cardUsable:function(){ - return false; - }, - cardRespondable:function(){ - return false; - }, - cardSavable:function(){ - return false; - } }, - trigger:{player:'turnOverAfter'}, - forced:true, - filter:function(event,player){ + }, + bingfeng2: { + mod: { + cardEnabled: function () { + return false; + }, + cardUsable: function () { + return false; + }, + cardRespondable: function () { + return false; + }, + cardSavable: function () { + return false; + }, + }, + trigger: { player: "turnOverAfter" }, + forced: true, + filter: function (event, player) { return !player.isTurnedOver(); }, - content:function(){ - player.removeSkill('bingfeng2'); - } + content: function () { + player.removeSkill("bingfeng2"); + }, }, - yudun:{ - mod:{ - cardEnabled:function(card,player){ - if(get.type(card,'trick')=='trick') return false; + yudun: { + mod: { + cardEnabled: function (card, player) { + if (get.type(card, "trick") == "trick") return false; }, - cardRespondable:function(card,player){ - if(get.type(card,'trick')=='trick') return false; + cardRespondable: function (card, player) { + if (get.type(card, "trick") == "trick") return false; }, - cardSavable:function(card,player){ - if(get.type(card,'trick')=='trick') return false; + cardSavable: function (card, player) { + if (get.type(card, "trick") == "trick") return false; }, }, - enable:'chooseToUse', - filterCard:function(card){ - return get.type(card,'trick')=='trick'; + enable: "chooseToUse", + filterCard: function (card) { + return get.type(card, "trick") == "trick"; }, - selectCard:2, - viewAs:{name:'sha'}, - viewAsFilter:function(player){ - if(player.countCards('h',{type:['trick','delay']})<2) return false; + selectCard: 2, + viewAs: { name: "sha" }, + viewAsFilter: function (player) { + if (player.countCards("h", { type: ["trick", "delay"] }) < 2) return false; }, - check:function(){return 1}, - ai:{ - skillTagFilter:function(player,tag,arg){ - if(arg!='use') return false; - if(player.countCards('h',{type:['trick','delay']})<2) return false; + check: function () { + return 1; + }, + ai: { + skillTagFilter: function (player, tag, arg) { + if (arg != "use") return false; + if (player.countCards("h", { type: ["trick", "delay"] }) < 2) return false; }, - respondSha:true, - order:function(){ - return get.order({name:'sha'})+0.1; + respondSha: true, + order: function () { + return get.order({ name: "sha" }) + 0.1; }, - useful:-1, - value:-1 + useful: -1, + value: -1, }, - group:'yudun_count', - subSkill:{ - count:{ - trigger:{player:'useCard'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.skill=='yudun'&&_status.currentPhase==player; + group: "yudun_count", + subSkill: { + count: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "yudun" && _status.currentPhase == player; }, - content:function(){ + content: function () { player.getStat().card.sha--; - } - } - } + }, + }, + }, }, - guozao:{ - trigger:{global:'damageEnd'}, - forced:true, - logv:false, + guozao: { + trigger: { global: "damageEnd" }, + forced: true, + logv: false, // alter:true, - check:function(event,player){ - return game.hasPlayer(function(current){ - return get.attitude(player,current)>2&¤t.countCards('h')==1 + check: function (event, player) { + return game.hasPlayer(function (current) { + return get.attitude(player, current) > 2 && current.countCards("h") == 1; }); }, - filter:function(event,player){ - if(event.source==player) return false; - if(get.distance(player,event.player)>1) return false; - return game.hasPlayer(function(current){ - return current.countCards('h'); + filter: function (event, player) { + if (event.source == player) return false; + if (get.distance(player, event.player) > 1) return false; + return game.hasPlayer(function (current) { + return current.countCards("h"); }); }, - content:function(){ - "step 0" - var cards=[]; - if(ui.cardPile.childNodes.length<3){ - var discardcards=get.cards(3); - for(var i=0;i0&&get.distance(player,target)<=dist; - }).ai=function(target){ - var att=get.attitude(player,target); - var hs=target.getCards('h'); - var num=hs.length; - if(num<=1) return att*2; - if(num==2){ - for(var i=0;i6) return att; + var next = (player.chooseTarget(true, dialog, function (card, player, target) { + return target.countCards("h") > 0 && get.distance(player, target) <= dist; + }).ai = function (target) { + var att = get.attitude(player, target); + var hs = target.getCards("h"); + var num = hs.length; + if (num <= 1) return att * 2; + if (num == 2) { + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i], target, "raw") > 6) return att; } - if(target==player){ - for(var i=0;i<2;i++){ - if(get.value(cards[i],target,'raw')>6) return -1; + if (target == player) { + for (var i = 0; i < 2; i++) { + if (get.value(cards[i], target, "raw") > 6) return -1; } } - return att/2; + return att / 2; } - if(num==3){ - if(target==player){ - var num2=0; - for(var i=0;i<3;i++){ - num2+=get.value(cards[i],player,'raw'); - num2-=get.value(hs[i],player,'raw'); + if (num == 3) { + if (target == player) { + var num2 = 0; + for (var i = 0; i < 3; i++) { + num2 += get.value(cards[i], player, "raw"); + num2 -= get.value(hs[i], player, "raw"); } - if(num2>0) return 0.5; - if(num2<0) return -0.5; + if (num2 > 0) return 0.5; + if (num2 < 0) return -0.5; } return 0; } - return -att/2; - }; - "step 1" - if(result.bool&&result.targets[0]){ - var target=result.targets[0]; - player.line(target,'green'); + return -att / 2; + }); + ("step 1"); + if (result.bool && result.targets[0]) { + var target = result.targets[0]; + player.line(target, "green"); // player.logSkill('guozao',target,'green',true); - var cards=target.getCards('h'); - target.lose(cards)._triggered=null; - game.log(target,'弃置了',cards,',并获得三张牌'); + var cards = target.getCards("h"); + target.lose(cards)._triggered = null; + game.log(target, "弃置了", cards, ",并获得三张牌"); // target.$draw(3); target.$throw(cards); - target.gain(event.cards,'draw')._triggered=null; - } - else{ + target.gain(event.cards, "draw")._triggered = null; + } else { event.finish(); } }, - ai:{ - expose:0.1 - } + ai: { + expose: 0.1, + }, }, - heihuo:{ - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h')>0&&player.countCards('he',{type:'equip'})>0&&!player.hasSkill('heihuo2'); + heihuo: { + enable: "phaseUse", + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + player.countCards("he", { type: "equip" }) > 0 && + !player.hasSkill("heihuo2") + ); }, - filterCard:function(card){ - return get.type(card)=='equip'; + filterCard: function (card) { + return get.type(card) == "equip"; }, - position:'he', - check:function(card){ - var player=_status.currentPhase; - var nh=player.countCards('h'); - var pos=get.position(card); - if(nh<2) return 0; - if(nh>4) return 0; - if(nh==4&&pos=='e') return 0; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card)+(pos=='e'?0.4:0); + position: "he", + check: function (card) { + var player = _status.currentPhase; + var nh = player.countCards("h"); + var pos = get.position(card); + if (nh < 2) return 0; + if (nh > 4) return 0; + if (nh == 4 && pos == "e") return 0; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card) + (pos == "e" ? 0.4 : 0); } - return 5.5-get.value(card)+(pos=='e'?0.4:0); + return 5.5 - get.value(card) + (pos == "e" ? 0.4 : 0); }, - content:function(){ - "step 0" - player.draw(player.countCards('h')); - "step 1" - if(player.countCards('h')>=8){ - player.damage(3,'fire'); - player.addTempSkill('heihuo2'); + content: function () { + "step 0"; + player.draw(player.countCards("h")); + ("step 1"); + if (player.countCards("h") >= 8) { + player.damage(3, "fire"); + player.addTempSkill("heihuo2"); } }, - ai:{ - order:10, - threaten:1.4, - result:{ - player:1 - } - } - }, - heihuo2:{}, - yaotong:{ - // alter:true, - group:['yaotong1','yaotong2','yaotong3'], - ai:{ - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ - if(tag=='respondShan'&&get.is.altered('yaotong')) return false; - if(player.countCards('h')%2==0) return false; + ai: { + order: 10, + threaten: 1.4, + result: { + player: 1, }, }, - threaten:1.3 }, - yaotong1:{ - enable:['chooseToRespond','chooseToUse'], - filterCard:true, - viewAs:{name:'sha'}, - filter:function(event,player){ - var num=player.countCards('h'); - if(num==0) return false; - return num%2==1; + heihuo2: {}, + yaotong: { + // alter:true, + group: ["yaotong1", "yaotong2", "yaotong3"], + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + if (tag == "respondShan" && get.is.altered("yaotong")) return false; + if (player.countCards("h") % 2 == 0) return false; + }, }, - prompt:'将一张手牌当作杀使用或打出', - check:function(card){return 6-get.value(card)} + threaten: 1.3, }, - yaotong2:{ - enable:['chooseToRespond','chooseToUse'], - filterCard:true, - viewAs:{name:'shan'}, - filter:function(event,player){ - if(get.is.altered('yaotong')) return false; - var num=player.countCards('h'); - if(num==0) return false; - return num%2==1; + yaotong1: { + enable: ["chooseToRespond", "chooseToUse"], + filterCard: true, + viewAs: { name: "sha" }, + filter: function (event, player) { + var num = player.countCards("h"); + if (num == 0) return false; + return num % 2 == 1; + }, + prompt: "将一张手牌当作杀使用或打出", + check: function (card) { + return 6 - get.value(card); }, - prompt:'将一张手牌当作闪使用或打出', - check:function(card){return 6-get.value(card)} }, - yaotong3:{ - enable:'chooseToUse', - filterCard:true, - viewAs:{name:'wuxie'}, - filter:function(event,player){ - var num=player.countCards('h'); - if(num==0) return false; - return num%2==0; + yaotong2: { + enable: ["chooseToRespond", "chooseToUse"], + filterCard: true, + viewAs: { name: "shan" }, + filter: function (event, player) { + if (get.is.altered("yaotong")) return false; + var num = player.countCards("h"); + if (num == 0) return false; + return num % 2 == 1; }, - viewAsFilter:function(player){ - var num=player.countCards('h'); - if(num==0) return false; - return num%2==0; + prompt: "将一张手牌当作闪使用或打出", + check: function (card) { + return 6 - get.value(card); }, - prompt:'将一张手牌当作无懈可击使用', - check:function(card){return 7-get.value(card)}, }, - yaotong4:{ - enable:'chooseToUse', - filterCard:true, - viewAs:{name:'tao'}, - filter:function(event,player){ - var num=player.countCards('h'); - if(num==0) return false; - return num%2==0; + yaotong3: { + enable: "chooseToUse", + filterCard: true, + viewAs: { name: "wuxie" }, + filter: function (event, player) { + var num = player.countCards("h"); + if (num == 0) return false; + return num % 2 == 0; }, - viewAsFilter:function(player){ - var num=player.countCards('h'); - if(num==0) return false; - return num%2==0; + viewAsFilter: function (player) { + var num = player.countCards("h"); + if (num == 0) return false; + return num % 2 == 0; + }, + prompt: "将一张手牌当作无懈可击使用", + check: function (card) { + return 7 - get.value(card); }, - prompt:'将一张手牌当作桃使用', - check:function(card){return 9-get.value(card)}, }, - pojian:{ - trigger:{player:'loseEnd'}, - filter:function(event,player){ - if(player.countCards('h')) return false; - for(var i=0;i0; + huajin: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - position:'he', - content:function(){ - player.addSkill('huajin2'); + filterCard: true, + position: "he", + content: function () { + player.addSkill("huajin2"); }, - check:function(card){ - return 5-get.value(card); + check: function (card) { + return 5 - get.value(card); }, - ai:{ - order:10, - result:{ - player:function(player){ - if(player.countCards('h','juedou')) return 1; - if(player.countCards('h','sha')==0) return 0; - var players=game.filterPlayer(); - for(var i=0;i0){ + ai: { + order: 10, + result: { + player: function (player) { + if (player.countCards("h", "juedou")) return 1; + if (player.countCards("h", "sha") == 0) return 0; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + player.canUse("sha", players[i]) && + get.effect(players[i], { name: "sha" }, player, player) > 0 + ) { return 1; } } return 0; - } - } - } + }, + }, + }, }, - huajin2:{ - trigger:{source:'damageBegin'}, - forced:true, - content:function(){ + huajin2: { + trigger: { source: "damageBegin" }, + forced: true, + content: function () { trigger.num++; }, - group:'huajin3' + group: "huajin3", }, - huajin3:{ - trigger:{player:'phaseBegin'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('huajin2'); - } + huajin3: { + trigger: { player: "phaseBegin" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("huajin2"); + }, }, - yuchen:{ - trigger:{player:['useCard','respondAfter']}, - direct:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(event.cards){ - for(var i=0;i0; - }).set('autodelay',trigger.name=='respond'?0.5:1).ai=function(target){ - return -get.attitude(player,target); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("yuchen"), function (card, player, target) { + return player != target && target.countCards("he") > 0; + }) + .set("autodelay", trigger.name == "respond" ? 0.5 : 1).ai = function (target) { + return -get.attitude(player, target); }; - "step 1" - if(result.bool){ - player.logSkill('yuchen',result.targets); - player.discardPlayerCard(result.targets[0],true); + ("step 1"); + if (result.bool) { + player.logSkill("yuchen", result.targets); + player.discardPlayerCard(result.targets[0], true); } }, - ai:{ - threaten:0.7 - } + ai: { + threaten: 0.7, + }, }, - bingjian:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',{color:'black',name:'sha'})>0; + bingjian: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he", { color: "black", name: "sha" }) > 0; }, - filterCard:function(card){ - return card.name=='sha'&&get.color(card)=='black'; + filterCard: function (card) { + return card.name == "sha" && get.color(card) == "black"; }, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return player != target && target.countCards("h") > 0; }, - line:'thunder', - content:function(){ - "step 0" + line: "thunder", + content: function () { + "step 0"; target.showHandcards(); - "step 1" - var cards=target.getCards('h','shan'); - if(cards.length){ + ("step 1"); + var cards = target.getCards("h", "shan"); + if (cards.length) { target.discard(cards); - } - else{ - target.damage('thunder'); + } else { + target.damage("thunder"); } }, - ai:{ - order:5, - result:{ - target:function(player,target){ - return get.damageEffect(target,player,target,'thunder'); - } + ai: { + order: 5, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target, "thunder"); + }, }, - expose:0.2 - } - }, - rumeng:{ - trigger:{global:'phaseUseBefore'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&player.countCards('he',{type:'basic'})2; - var next=player.chooseToDiscard(function(card){ - return get.type(card)!='basic'; - },get.prompt('rumeng',trigger.player),'he'); - next.logSkill=['rumeng',trigger.player]; - next.ai=function(card){ - if(yep){ - return 6-get.value(card); + }, + rumeng: { + trigger: { global: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return ( + event.player != player && + player.countCards("he", { type: "basic" }) < player.countCards("he") + ); + }, + content: function () { + "step 0"; + var yep = get.attitude(player, trigger.player) < 0 && trigger.player.countCards("h") > 2; + var next = player.chooseToDiscard( + function (card) { + return get.type(card) != "basic"; + }, + get.prompt("rumeng", trigger.player), + "he" + ); + next.logSkill = ["rumeng", trigger.player]; + next.ai = function (card) { + if (yep) { + return 6 - get.value(card); } return 0; - } - "step 1" - if(result.bool){ - trigger.player.chooseToDiscard({type:'basic'},'入梦:弃置一张基本牌或跳过出牌及弃牌阶段').ai=function(card){ - return 5-get.value(card); - } - } - else{ + }; + ("step 1"); + if (result.bool) { + trigger.player.chooseToDiscard( + { type: "basic" }, + "入梦:弃置一张基本牌或跳过出牌及弃牌阶段" + ).ai = function (card) { + return 5 - get.value(card); + }; + } else { event.finish(); } - "step 2" - if(!result.bool){ + ("step 2"); + if (!result.bool) { trigger.cancel(); - trigger.player.skip('phaseDiscard'); + trigger.player.skip("phaseDiscard"); } }, - ai:{ - expose:0.1 - } - }, - lianda:{ - trigger:{player:'shaAfter'}, - direct:true, - filter:function(event,player){ - return event.target.isAlive()&&player.countCards('he')>0&&!player.hasSkill('lianda2'); + ai: { + expose: 0.1, }, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he',get.prompt('lianda')); - next.ai=function(card){ - if(get.effect(trigger.target,{name:'sha'},player,player)>0){ - return 7-get.value(card); + }, + lianda: { + trigger: { player: "shaAfter" }, + direct: true, + filter: function (event, player) { + return ( + event.target.isAlive() && player.countCards("he") > 0 && !player.hasSkill("lianda2") + ); + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", get.prompt("lianda")); + next.ai = function (card) { + if (get.effect(trigger.target, { name: "sha" }, player, player) > 0) { + return 7 - get.value(card); } return 0; + }; + next.logSkill = "lianda"; + ("step 1"); + if (result.bool) { + player.addTempSkill("lianda2"); + player.useCard({ name: "sha" }, trigger.target); } - next.logSkill='lianda'; - "step 1" - if(result.bool){ - player.addTempSkill('lianda2'); - player.useCard({name:'sha'},trigger.target); - } - } - }, - lianda2:{}, - huiqi:{ - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return player.hp3){ - return att+Math.max(0,5-target.countCards('h')); + if (att > 3) { + return att + Math.max(0, 5 - target.countCards("h")); } - return att/4; + return att / 4; } - if(att>3){ - return att+Math.max(0,5-target.countCards('h')); + if (att > 3) { + return att + Math.max(0, 5 - target.countCards("h")); } return att; - } - "step 1" - if(result.bool){ - player.logSkill('huiqi',result.targets); - result.targets[0].draw(player.maxHp-player.hp); + }; + ("step 1"); + if (result.bool) { + player.logSkill("huiqi", result.targets); + result.targets[0].draw(player.maxHp - player.hp); } }, - ai:{ - expose:0.2, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - return [1,0.5]; + ai: { + expose: 0.2, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + return [1, 0.5]; } - } - } - } + }, + }, + }, }, - xianghui:{ - enable:'phaseUse', - usable:1, - filterCard:{color:'red'}, - filter:function(event,player){ - if(!player.countCards('h',{color:'red'})) return false; - var players=game.filterPlayer(); - var min=players[0].hp; - for(var i=0;i2){ - if(player.countCards('h','shan')||player.getEquip(2)|| - trigger.target.hp==1||player.hp>trigger.target.hp+1){ - if(!trigger.target.countCards('h','shan')||trigger.target.countCards('h') 2) { + if ( + player.countCards("h", "shan") || + player.getEquip(2) || + trigger.target.hp == 1 || + player.hp > trigger.target.hp + 1 + ) { + if ( + !trigger.target.countCards("h", "shan") || + trigger.target.countCards("h") < player.countCards("h") + ) { + save = true; } } } - var next=player.chooseToDiscard('he',get.prompt('hzhenwei')); - next.logSkill=['hzhenwei',trigger.target]; - next.ai=function(card){ - if(save){ - return 7-get.value(card); + var next = player.chooseToDiscard("he", get.prompt("hzhenwei")); + next.logSkill = ["hzhenwei", trigger.target]; + next.ai = function (card) { + if (save) { + return 7 - get.value(card); } return 0; - } - "step 1" - if(result.bool){ - trigger.target=player; - player.addSkill('hzhenwei2'); + }; + ("step 1"); + if (result.bool) { + trigger.target = player; + player.addSkill("hzhenwei2"); game.delay(); } }, - ai:{ - effect:{ - target:function(card){ - if(card.name=='sha') return 1.3; - } - } - } + ai: { + effect: { + target: function (card) { + if (card.name == "sha") return 1.3; + }, + }, + }, }, - hzhenwei2:{ - trigger:{target:'shaAfter'}, - forced:true, - popup:false, - content:function(){ + hzhenwei2: { + trigger: { target: "shaAfter" }, + forced: true, + popup: false, + content: function () { player.draw(); - player.removeSkill('hzhenwei2'); - } + player.removeSkill("hzhenwei2"); + }, }, - fzhenwei:{ - trigger:{global:'respondEnd'}, - filter:function(event,player){ - if(_status.currentPhase!=player) return false; - if(event.player==player) return false; - if(event.cards){ - for(var i=0;i3){ - return 100-target.countCards('h'); + event.cards = cards; + player + .chooseTarget(get.prompt("fzhenwei"), function (card, player, target) { + return target != trigger.player; + }) + .set("autodelay", 0.5).ai = function (target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (att > 3) { + return 100 - target.countCards("h"); } return att; - } - "step 1" - if(result.bool){ - player.logSkill('fzhenwei',result.targets); - result.targets[0].gain(event.cards,'gain2','log'); + }; + ("step 1"); + if (result.bool) { + player.logSkill("fzhenwei", result.targets); + result.targets[0].gain(event.cards, "gain2", "log"); } }, - ai:{ - expose:0.1, - threaten:1.6 - } + ai: { + expose: 0.1, + threaten: 1.6, + }, }, - shangxi:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - if(player.countCards('he')==0) return false; - return game.hasPlayer(function(current){ - return (current!=player&&get.distance(player,current,'attack')<=1&&player.hp<=current.hp); + shangxi: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + if (player.countCards("he") == 0) return false; + return game.hasPlayer(function (current) { + return ( + current != player && + get.distance(player, current, "attack") <= 1 && + player.hp <= current.hp + ); }); }, - content:function(){ - "step 0" - var next=player.chooseCardTarget({ - position:'he', - filterTarget:function(card,player,target){ - return get.distance(player,target,'attack')<=1&& - player!=target&&player.hp<=target.hp; + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + position: "he", + filterTarget: function (card, player, target) { + return ( + get.distance(player, target, "attack") <= 1 && + player != target && + player.hp <= target.hp + ); }, - filterCard:lib.filter.cardDiscardable, - ai1:function(card){ - return 9-get.value(card); + filterCard: lib.filter.cardDiscardable, + ai1: function (card) { + return 9 - get.value(card); }, - ai2:function(target){ - return get.damageEffect(target,player,player); + ai2: function (target) { + return get.damageEffect(target, player, player); }, - prompt:get.prompt('shangxi') + prompt: get.prompt("shangxi"), }); - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.discard(result.cards); - player.logSkill('shangxi',result.targets); + player.logSkill("shangxi", result.targets); result.targets[0].damage(); } }, - ai:{ - expose:0.3 - } - }, - fuyan:{ - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event){ - return event.num>0; + ai: { + expose: 0.3, }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('fuyan'),function(card,player,target){ + }, + fuyan: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event) { + return event.num > 0; + }, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("fuyan"), function (card, player, target) { return !target.hujia; - }).ai=function(target){ - if(get.attitude(player,target)<=0) return 0; - var eff=-get.damageEffect(target,target,player)+(player==target?2:0); - if(target.hp==1) eff+=2; - return Math.min(1,eff); + }).ai = function (target) { + if (get.attitude(player, target) <= 0) return 0; + var eff = -get.damageEffect(target, target, player) + (player == target ? 2 : 0); + if (target.hp == 1) eff += 2; + return Math.min(1, eff); }; - "step 1" - if(result.bool){ - player.logSkill('fuyan',result.targets); - var target=result.targets[0]; + ("step 1"); + if (result.bool) { + player.logSkill("fuyan", result.targets); + var target = result.targets[0]; target.changeHujia(); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; return 0.7; } - } + }, }, - expose:0.2 - } - }, - fuyan2:{ - trigger:{player:'damageBegin'}, - filter:function(event,player){ - return event.num>0; + expose: 0.2, }, - forced:true, - mark:'card', - content:function(){ + }, + fuyan2: { + trigger: { player: "damageBegin" }, + filter: function (event, player) { + return event.num > 0; + }, + forced: true, + mark: "card", + content: function () { trigger.num--; - player.removeSkill('fuyan2'); + player.removeSkill("fuyan2"); player.storage.fuyan2.discard(); delete player.storage.fuyan2; }, - intro:{ - content:'card' - } + intro: { + content: "card", + }, }, - pingshen:{ - trigger:{source:'damageBegin'}, - unique:true, - silent:true, - content:function(){ - trigger.player.addSkill('pingshen2'); - trigger.player.storage.pingshen=player; - } + pingshen: { + trigger: { source: "damageBegin" }, + unique: true, + silent: true, + content: function () { + trigger.player.addSkill("pingshen2"); + trigger.player.storage.pingshen = player; + }, }, - pingshen2:{ - enable:'phaseUse', - unique:true, - mark:true, - init:function(player){ - player.storage.pingshen2=false; + pingshen2: { + enable: "phaseUse", + unique: true, + mark: true, + init: function (player) { + player.storage.pingshen2 = false; }, - filter:function(event,player){ - return !player.storage.pingshen2&&player.storage.pingshen.isAlive(); + filter: function (event, player) { + return !player.storage.pingshen2 && player.storage.pingshen.isAlive(); }, - filterCard:true, - filterTarget:function(card,player,target){ - return target==player.storage.pingshen; + filterCard: true, + filterTarget: function (card, player, target) { + return target == player.storage.pingshen; }, - selectTarget:-1, - position:'he', - content:function(){ - player.storage.pingshen2=true; - player.unmarkSkill('pingshen2'); - player.gain(target.getCards('h'),target); - target.$give(target.countCards('h'),player); + selectTarget: -1, + position: "he", + content: function () { + player.storage.pingshen2 = true; + player.unmarkSkill("pingshen2"); + player.gain(target.getCards("h"), target); + target.$give(target.countCards("h"), player); player.turnOver(); - player.addSkill('pingshen3'); + player.addSkill("pingshen3"); }, - check:function(card){return 8-get.value(card);}, - intro:{ - content:'limited' + check: function (card) { + return 8 - get.value(card); }, - ai:{ - order:10, - result:{ - player:function(player){ - if(player.classList.contains('turnedover')) return 10; - if(get.attitude(player,player.storage.pingshen)>=0){ + intro: { + content: "limited", + }, + ai: { + order: 10, + result: { + player: function (player) { + if (player.classList.contains("turnedover")) return 10; + if (get.attitude(player, player.storage.pingshen) >= 0) { return 0; } - if(player.storage.pingshen.countCards('h')>player.storage.pingshen.hp) return 1; + if (player.storage.pingshen.countCards("h") > player.storage.pingshen.hp) + return 1; return 0; - } + }, }, - effect:{ - target:function(card,player,target){ - if(!target.storage.pingshen2){ - if(card.name=='guiyoujie') return [0,1]; + effect: { + target: function (card, player, target) { + if (!target.storage.pingshen2) { + if (card.name == "guiyoujie") return [0, 1]; } - } - } + }, + }, }, }, - pingshen3:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - popup:false, - content:function(){ - "step 0" - player.removeSkill('pingshen3'); - if(player.storage.pingshen.classList.contains('dead')){ + pingshen3: { + trigger: { player: "phaseUseEnd" }, + forced: true, + popup: false, + content: function () { + "step 0"; + player.removeSkill("pingshen3"); + if (player.storage.pingshen.classList.contains("dead")) { event.finish(); + } else { + player.chooseCard("he", true, player.storage.pingshen.hp); } - else{ - player.chooseCard('he',true,player.storage.pingshen.hp); - } - "step 1" - player.storage.pingshen.gain(result.cards,player); - player.$give(result.cards.length,player.storage.pingshen); - } - }, - guaili:{ - trigger:{source:'damageBegin'}, - filter:function(event){ - return event.card&&event.card.name=='sha'&&event.parent.name!='_lianhuan'&&event.parent.name!='_lianhuan2'; + ("step 1"); + player.storage.pingshen.gain(result.cards, player); + player.$give(result.cards.length, player.storage.pingshen); }, - forced:true, - content:function(){ + }, + guaili: { + trigger: { source: "damageBegin" }, + filter: function (event) { + return ( + event.card && + event.card.name == "sha" && + event.parent.name != "_lianhuan" && + event.parent.name != "_lianhuan2" + ); + }, + forced: true, + content: function () { trigger.num++; - player.addSkill('guaili2'); - } - }, - guaili2:{ - trigger:{source:'damageEnd'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('guaili2'); - player.chooseToDiscard(2,true); - } - }, - xingzhui:{ - enable:'phaseUse', - usable:1, - filterCard:true, - position:'he', - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('he')>0; + player.addSkill("guaili2"); }, - check:function(card){ - if(get.type(card)=='equip'){ - var distance=get.info(card).distance; - if(distance){ - if(distance.attackFrom<0||distance.globalFrom<0) return 10; + }, + guaili2: { + trigger: { source: "damageEnd" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("guaili2"); + player.chooseToDiscard(2, true); + }, + }, + xingzhui: { + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 0; + }, + check: function (card) { + if (get.type(card) == "equip") { + var distance = get.info(card).distance; + if (distance) { + if (distance.attackFrom < 0 || distance.globalFrom < 0) return 10; } } - return 7-get.value(card); + return 7 - get.value(card); }, - content:function(){ - "step 0" - event.type=get.type(cards[0],'trick'); - var dme=get.damageEffect(target,player,target); - target.chooseToDiscard('he',function(card){ - return get.type(card,'trick')==event.type; - },'弃置一张牌'+get.translation(event.type)+'牌,或受到1点伤害').ai=function(card){ - if(dme<0){ - return 8-get.value(card); + content: function () { + "step 0"; + event.type = get.type(cards[0], "trick"); + var dme = get.damageEffect(target, player, target); + target.chooseToDiscard( + "he", + function (card) { + return get.type(card, "trick") == event.type; + }, + "弃置一张牌" + get.translation(event.type) + "牌,或受到1点伤害" + ).ai = function (card) { + if (dme < 0) { + return 8 - get.value(card); } return 0; - } - "step 1" - if(!result.bool){ + }; + ("step 1"); + if (!result.bool) { target.damage(); } }, - ai:{ - order:9, - result:{ - target:function(player,target){ - return get.damageEffect(target,player); - } + ai: { + order: 9, + result: { + target: function (player, target) { + return get.damageEffect(target, player); + }, }, - threaten:2, - expose:0.2 - } + threaten: 2, + expose: 0.2, + }, }, - lingxian:{ - trigger:{player:['respond','useCard']}, - direct:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(get.itemtype(event.cards)!='cards') return false; - return game.hasPlayer(function(current){ - return get.distance(player,current,'attack')>1&&player!=current; + lingxian: { + trigger: { player: ["respond", "useCard"] }, + direct: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (get.itemtype(event.cards) != "cards") return false; + return game.hasPlayer(function (current) { + return get.distance(player, current, "attack") > 1 && player != current; }); }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('lingxian'),function(card,player,target){ - return get.distance(player,target,'attack')>1&&player!=target; - }).ai=function(target){ - var att=get.attitude(player,target); - if(att<=-0.5) return 0; - if(att<=3) return att+0.5; - return att+Math.min(0.5,5-target.countCards('h')); - } - "step 1" - if(result.bool){ - game.asyncDraw([player,result.targets[0]]); - player.logSkill('lingxian',result.targets); + content: function () { + "step 0"; + player.chooseTarget(get.prompt("lingxian"), function (card, player, target) { + return get.distance(player, target, "attack") > 1 && player != target; + }).ai = function (target) { + var att = get.attitude(player, target); + if (att <= -0.5) return 0; + if (att <= 3) return att + 0.5; + return att + Math.min(0.5, 5 - target.countCards("h")); + }; + ("step 1"); + if (result.bool) { + game.asyncDraw([player, result.targets[0]]); + player.logSkill("lingxian", result.targets); } }, - ai:{ - mingzhi:false, - effect:{ - target:function(card,player,target){ - if(player==_status.currentPhase) return; - if(!game.hasPlayer(function(current){ - return get.distance(player,current,'attack')>1&&player!=current&&get.attitude(player,current)>=0; - })){ + ai: { + mingzhi: false, + effect: { + target: function (card, player, target) { + if (player == _status.currentPhase) return; + if ( + !game.hasPlayer(function (current) { + return ( + get.distance(player, current, "attack") > 1 && + player != current && + get.attitude(player, current) >= 0 + ); + }) + ) { return; } - if(get.type(card)=='equip'&&player==target){ - var distance=get.info(card).distance; - if(distance){ - if(distance.attackFrom<0||distance.globalFrom<0) return 0; + if (get.type(card) == "equip" && player == target) { + var distance = get.info(card).distance; + if (distance) { + if (distance.attackFrom < 0 || distance.globalFrom < 0) return 0; + } + } else { + if (!target.hasFriend()) return; + var hs = target.countCards("h"); + if (get.tag(card, "respondShan")) { + var shans = target.countCards("h", "shan"); + if (shans > 1) return [0, 1]; + if (shans && hs > 2) return [0, 1]; + if (shans) return [0, 0]; + if (hs > 2) return [0, 0]; + if (hs > 1) return [1, 0.5]; + return [1.5, 0]; + } + if (get.tag(card, "respondSha")) { + var shas = target.countCards("h", "sha"); + if (shas > 1) return [0, 1]; + if (shas && hs > 2) return [0, 1]; + if (shas) return [0, 0]; + if (hs > 2) return [0, 0]; + if (hs > 1) return [1, 0.5]; + return [1.5, 0]; } } - else{ - if(!target.hasFriend()) return; - var hs=target.countCards('h'); - if(get.tag(card,'respondShan')){ - var shans=target.countCards('h','shan'); - if(shans>1) return [0,1]; - if(shans&&hs>2) return [0,1]; - if(shans) return [0,0]; - if(hs>2) return [0,0]; - if(hs>1) return [1,0.5]; - return [1.5,0]; - } - if(get.tag(card,'respondSha')){ - var shas=target.countCards('h','sha'); - if(shas>1) return [0,1]; - if(shas&&hs>2) return [0,1]; - if(shas) return [0,0]; - if(hs>2) return [0,0]; - if(hs>1) return [1,0.5]; - return [1.5,0]; - } - } - } + }, }, - threaten:0.8, - expose:0.1 - } - }, - shouyin:{ - skillAnimation:'epic', - animationColor:'water', - unique:true, - enable:'chooseToUse', - init:function(player){ - player.storage.shouyin=false; + threaten: 0.8, + expose: 0.1, }, - mark:true, - filter:function(event,player){ - if(event.type!='dying') return false; - if(player.storage.shouyin) return false; - if(player.isTurnedOver()) return false; + }, + shouyin: { + skillAnimation: "epic", + animationColor: "water", + unique: true, + enable: "chooseToUse", + init: function (player) { + player.storage.shouyin = false; + }, + mark: true, + filter: function (event, player) { + if (event.type != "dying") return false; + if (player.storage.shouyin) return false; + if (player.isTurnedOver()) return false; return true; }, - content:function(){ - "step 0" - player.awakenSkill('shouyin'); - player.storage.shouyin=true; + content: function () { + "step 0"; + player.awakenSkill("shouyin"); + player.storage.shouyin = true; player.turnOver(); - "step 1" - event.targets=game.filterPlayer(); + ("step 1"); + event.targets = game.filterPlayer(); event.targets.sort(lib.sort.seat); - "step 2" - if(event.targets.length){ - var target=event.targets.shift(); - if(target.hp=target.hp){ + sliufeng: { + mod: { + targetInRange: function (card, player, target) { + if (card.name == "sha" && player.hp >= target.hp) { return true; } - } + }, }, }, - linyun:{ - enable:'chooseToUse', - filterCard:true, - selectCard:2, - position:'he', - viewAs:{name:'sha'}, - prompt:'将两张牌当杀使用', - check:function(card){ - if(_status.event.player.countCards('h')<4) return 6-get.useful(card); - return 7-get.useful(card); + linyun: { + enable: "chooseToUse", + filterCard: true, + selectCard: 2, + position: "he", + viewAs: { name: "sha" }, + prompt: "将两张牌当杀使用", + check: function (card) { + if (_status.event.player.countCards("h") < 4) return 6 - get.useful(card); + return 7 - get.useful(card); }, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.1; - } + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.1; + }, }, - group:['linyun2'] + group: ["linyun2"], }, - linyun2:{ - trigger:{player:'shaBegin'}, - filter:function(event){ - return event.skill=='linyun' + linyun2: { + trigger: { player: "shaBegin" }, + filter: function (event) { + return event.skill == "linyun"; }, - forced:true, - popup:false, - content:function(){ - "step 0" - var next=trigger.target.chooseToRespond({name:'shan'}); - next.autochoose=lib.filter.autoRespondShan; - next.ai=function(card){ - if(trigger.target.countCards('h','shan')>1){ + forced: true, + popup: false, + content: function () { + "step 0"; + var next = trigger.target.chooseToRespond({ name: "shan" }); + next.autochoose = lib.filter.autoRespondShan; + next.ai = function (card) { + if (trigger.target.countCards("h", "shan") > 1) { return get.unuseful2(card); } return -1; }; - "step 1" - if(result.bool==false){ + ("step 1"); + if (result.bool == false) { trigger.untrigger(); - trigger.directHit=true; + trigger.directHit = true; } }, - ai:{ - threaten:1.3 - } - }, - linyun3:{ - trigger:{source:'damageAfter'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.parent.skill=='linyun'&&!player.hasSkill('linyun4'); + ai: { + threaten: 1.3, }, - content:function(){ - player.draw(); - player.addTempSkill('linyun4','shaAfter') - } }, - linyun4:{}, - bofeng:{ - mod:{ - targetInRange:function(card,player,target){ - if(card.name=='sha'&&player.hp>=target.hp){ + linyun3: { + trigger: { source: "damageAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.parent.skill == "linyun" && !player.hasSkill("linyun4"); + }, + content: function () { + player.draw(); + player.addTempSkill("linyun4", "shaAfter"); + }, + }, + linyun4: {}, + bofeng: { + mod: { + targetInRange: function (card, player, target) { + if (card.name == "sha" && player.hp >= target.hp) { return true; } - } + }, }, - trigger:{player:'shaBegin'}, - check:function(event,player){ - return get.attitude(player,event.target)<0; + trigger: { player: "shaBegin" }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - content:function(){ - "step 0" - trigger.target.chooseToRespond({name:'shan'}); - "step 1" - if(result.bool==false){ + content: function () { + "step 0"; + trigger.target.chooseToRespond({ name: "shan" }); + ("step 1"); + if (result.bool == false) { trigger.untrigger(); - trigger.directHit=true; - player.addTempSkill('bofeng2','shaEnd'); + trigger.directHit = true; + player.addTempSkill("bofeng2", "shaEnd"); } }, - ai:{ - threaten:1.3 - } - }, - bofeng2:{ - trigger:{source:'damageBegin'}, - filter:function(event){ - return (event.card&&(event.card.name=='sha')&&event.parent.name!='_lianhuan'&&event.parent.name!='_lianhuan2'); + ai: { + threaten: 1.3, }, - forced:true, - popup:false, - content:function(){ + }, + bofeng2: { + trigger: { source: "damageBegin" }, + filter: function (event) { + return ( + event.card && + event.card.name == "sha" && + event.parent.name != "_lianhuan" && + event.parent.name != "_lianhuan2" + ); + }, + forced: true, + popup: false, + content: function () { trigger.num++; }, }, - hutian:{ - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0&&!player.storage.hutian; + hutian: { + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0 && !player.storage.hutian; }, - content:function(){ - "step 0" - var next=player.chooseCardTarget({ - filterTarget:function(card,player,target){ - return target.maxHp>=ui.selected.cards.length; + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + filterTarget: function (card, player, target) { + return target.maxHp >= ui.selected.cards.length; }, - filterCard:true, - selectCard:[1,player.countCards('he')], - ai1:function(card){ - var useful=get.useful(card); - if(card.name=='du'){ - useful=-5; + filterCard: true, + selectCard: [1, player.countCards("he")], + ai1: function (card) { + var useful = get.useful(card); + if (card.name == "du") { + useful = -5; } - if(ui.selected.cards.length==0&&player.hp==1) return 11-useful; - if(ui.selected.cards.length>1) return 0; - return 7-useful; + if (ui.selected.cards.length == 0 && player.hp == 1) return 11 - useful; + if (ui.selected.cards.length > 1) return 0; + return 7 - useful; }, - ai2:function(target){ - if(target.hp>ui.selected.cards.length){ + ai2: function (target) { + if (target.hp > ui.selected.cards.length) { return 0; } - return get.attitude(player,target); + return get.attitude(player, target); }, - position:'he', - prompt:get.prompt('hutian') + position: "he", + prompt: get.prompt("hutian"), }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.$give(result.cards,target); - player.lose(result.cards,ui.special); - player.storage.hutian=target; - player.logSkill('hutian',result.targets); - player.addTempSkill('hutian4'); - target.addSkill('hutian2'); - target.storage.hutian2=result.cards; - game.addVideo('storage',target,['hutian2',get.cardsInfo(result.cards),'cards']); - } - else{ + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.$give(result.cards, target); + player.lose(result.cards, ui.special); + player.storage.hutian = target; + player.logSkill("hutian", result.targets); + player.addTempSkill("hutian4"); + target.addSkill("hutian2"); + target.storage.hutian2 = result.cards; + game.addVideo("storage", target, ["hutian2", get.cardsInfo(result.cards), "cards"]); + } else { event.finish(); } - "step 2" - var target=event.target; - if(target.storage.hutian2&&target.hp0; + hutian4: {}, + chengjian: { + trigger: { global: "damageEnd" }, + check: function (event, player) { + return get.attitude(player, event.source) > 0; }, - filter:function(event,player){ - return event.source&&event.card&&event.card.name=='sha'&&event.source!=player; + filter: function (event, player) { + return event.source && event.card && event.card.name == "sha" && event.source != player; }, - logTarget:'source', - content:function(){ + logTarget: "source", + content: function () { trigger.source.draw(); }, - ai:{ - expose:0.1, - threaten:1.2 - } + ai: { + expose: 0.1, + threaten: 1.2, + }, }, - huanxing:{ - trigger:{player:'phaseBegin'}, - group:'huanxing2', - direct:true, - content:function(){ - "step 0" - if(player.countCards('he')){ + huanxing: { + trigger: { player: "phaseBegin" }, + group: "huanxing2", + direct: true, + content: function () { + "step 0"; + if (player.countCards("he")) { player.chooseCardTarget({ - prompt:get.prompt('huanxing'), - filterCard:lib.filter.cardDiscardable, - position:'he', - filterTarget:function(card,player,target){ - if(target==player) return false; - if(target.sex!='male') return false; - var name=target.name.indexOf('unknown')==0?target.name2:target.name; - if(name==player.storage.huanxing) return false; - var info=lib.character[name]; - if(info){ - var skills=info[3]; - for(var j=0;j0) return 0; - return 7-get.value(card); + ai1: function (card) { + if ( + player.additionalSkills.huanxing && + player.additionalSkills.huanxing.length > 0 + ) + return 0; + return 7 - get.value(card); + }, + ai2: function (target) { + if (target.isMin()) return 0; + return 6 - target.maxHp; }, - ai2:function(target){ - if(target.isMin()) return 0; - return 6-target.maxHp; - } }); - } - else{ + } else { event.finish(); } - "step 1" - if(result.bool){ - player.unmark(player.storage.huanxing+'_charactermark'); + ("step 1"); + if (result.bool) { + player.unmark(player.storage.huanxing + "_charactermark"); player.discard(result.cards); - player.logSkill('huanxing',result.targets); - var name=result.targets[0].name; - if(name.indexOf('unknown')==0){ - name=result.targets[0].name2; + player.logSkill("huanxing", result.targets); + var name = result.targets[0].name; + if (name.indexOf("unknown") == 0) { + name = result.targets[0].name2; } - var list=[]; - var skills=lib.character[name][3]; - for(var j=0;j0; + ai: { + threaten: 1.5, }, - content:function(){ - player.unmark(player.storage.huanxing+'_charactermark'); - player.removeAdditionalSkill('huanxing'); + }, + huanxing2: { + trigger: { player: "damageAfter" }, + priority: -15, + forced: true, + filter: function (event, player) { + return player.additionalSkills.huanxing && player.additionalSkills.huanxing.length > 0; + }, + content: function () { + player.unmark(player.storage.huanxing + "_charactermark"); + player.removeAdditionalSkill("huanxing"); delete player.storage.huanxing; player.checkMarks(); - } + }, }, - guiying:{ - enable:'chooseToUse', - filterCard:{color:'black'}, - position:'he', - viewAs:{name:'toulianghuanzhu'}, - prompt:'将一张黑色牌当作偷梁换柱使用', - check:function(card){ - if(_status.event.player.countCards('h')>_status.event.player.hp){ - return 5-get.value(card) + guiying: { + enable: "chooseToUse", + filterCard: { color: "black" }, + position: "he", + viewAs: { name: "toulianghuanzhu" }, + prompt: "将一张黑色牌当作偷梁换柱使用", + check: function (card) { + if (_status.event.player.countCards("h") > _status.event.player.hp) { + return 5 - get.value(card); } return 0; }, }, - suiyan:{ - trigger:{source:'damageEnd'}, - direct:true, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.player.countCards('e'); + suiyan: { + trigger: { source: "damageEnd" }, + direct: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.player.countCards("e"); }, - content:function(){ - "step 0" - var att=get.attitude(player,trigger.player); - var next=player.chooseToDiscard('he',get.prompt('suiyan')); - next.ai=function(card){ - if(att<0) return 7-get.value(card); + content: function () { + "step 0"; + var att = get.attitude(player, trigger.player); + var next = player.chooseToDiscard("he", get.prompt("suiyan")); + next.ai = function (card) { + if (att < 0) return 7 - get.value(card); return -1; - } - next.logSkill=['suiyan',trigger.player]; - "step 1" - if(result.bool){ - trigger.player.discard(trigger.player.getCards('e')); + }; + next.logSkill = ["suiyan", trigger.player]; + ("step 1"); + if (result.bool) { + trigger.player.discard(trigger.player.getCards("e")); } }, - ai:{ - expose:0.3 + ai: { + expose: 0.3, }, }, - ningxian:{ - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('he',{color:'black'})>0; + ningxian: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he", { color: "black" }) > 0; }, - content:function(){ - "step 0" - var enemy=game.countPlayer(function(current){ - return current!=player&&get.damageEffect(current,player,player)>0; + content: function () { + "step 0"; + var enemy = game.countPlayer(function (current) { + return current != player && get.damageEffect(current, player, player) > 0; }); - var next=player.chooseCardTarget({ - position:'he', - filterTarget:function(card,player,target){ - return player!=target; + var next = player.chooseCardTarget({ + position: "he", + filterTarget: function (card, player, target) { + return player != target; }, - selectCard:[1,player.countCards('he',{color:'black'})], - selectTarget:function(){ - if(ui.selected.targets.length>ui.selected.cards.length){ - game.uncheck('target'); + selectCard: [1, player.countCards("he", { color: "black" })], + selectTarget: function () { + if (ui.selected.targets.length > ui.selected.cards.length) { + game.uncheck("target"); } return ui.selected.cards.length; }, - filterCard:function(card,player){ - return get.color(card)=='black'&&lib.filter.cardDiscardable(card,player); + filterCard: function (card, player) { + return get.color(card) == "black" && lib.filter.cardDiscardable(card, player); }, - ai1:function(card){ - if(ui.selected.cards.length>=enemy) return 0; - return 9-get.value(card); + ai1: function (card) { + if (ui.selected.cards.length >= enemy) return 0; + return 9 - get.value(card); }, - ai2:function(target){ - return get.damageEffect(target,player,player); + ai2: function (target) { + return get.damageEffect(target, player, player); }, - prompt:get.prompt('ningxian') + prompt: get.prompt("ningxian"), }); - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.discard(result.cards); - player.logSkill('ningxian',result.targets); - event.targets=result.targets; + player.logSkill("ningxian", result.targets); + event.targets = result.targets; event.targets.sort(lib.sort.seat); - } - else{ + } else { event.finish(); } - "step 2" - if(event.targets.length){ + ("step 2"); + if (event.targets.length) { event.targets.shift().damage(); event.redo(); } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-0.5]; - if(!target.hasFriend()){ - if(get.mode()=='guozhan'){ - if(!player.hasFriend()) return; - } - else{ + ai: { + maixie: true, + maixie_hp: true, + effect: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -0.5]; + if (!target.hasFriend()) { + if (get.mode() == "guozhan") { + if (!player.hasFriend()) return; + } else { return; } } - if(target.countCards('h')>2||target.countCards('e',{color:'black'})){ - return [1,0,0,-1]; + if (target.countCards("h") > 2 || target.countCards("e", { color: "black" })) { + return [1, 0, 0, -1]; } - return [1,-0.5]; + return [1, -0.5]; } }, - } + }, }, - xuanyuan:{ - trigger:{player:'phaseEnd'}, - unique:true, - forceunique:true, - direct:true, - filter:function(event,player){ - if(!player.countCards('he',{suit:'spade'})) return false; - for(var i=0;i=4) return [1,1.5]; - if(target.hp==3) return [1,1]; - if(target.hp==2) return [1,0.5]; + group: "pozhou2", + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (player.hp >= 4) return [1, 1.5]; + if (target.hp == 3) return [1, 1]; + if (target.hp == 2) return [1, 0.5]; } - } - } - } + }, + }, + }, }, - pozhou2:{ - enable:'phaseUse', - filter:function(event,player){ - return player.storage.pozhou>0; + pozhou2: { + enable: "phaseUse", + filter: function (event, player) { + return player.storage.pozhou > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&!target.hasSkill('fengyin'); + filterTarget: function (card, player, target) { + return target != player && !target.hasSkill("fengyin"); }, - selectTarget:function(){ - return [1,_status.event.player.storage.pozhou]; + selectTarget: function () { + return [1, _status.event.player.storage.pozhou]; }, - prompt:'出牌阶段,你可以指定任意名其他角色并弃置等量的破咒标记,令目标的非锁定技失效直到其下一回合结束', - content:function(){ + prompt: "出牌阶段,你可以指定任意名其他角色并弃置等量的破咒标记,令目标的非锁定技失效直到其下一回合结束", + content: function () { player.storage.pozhou--; - if(!player.storage.pozhou){ - player.unmarkSkill('pozhou'); - } - else{ + if (!player.storage.pozhou) { + player.unmarkSkill("pozhou"); + } else { player.updateMarks(); } - target.addTempSkill('fengyin',{player:'phaseAfter'}); + target.addTempSkill("fengyin", { player: "phaseAfter" }); }, - ai:{ - order:11, - result:{ - target:function(player,target){ - var skills=target.getSkills(); - for(var i=0;i0&&player!=event.player; + filter: function (event, player) { + return player.storage.pozhou > 0 && player != event.player; }, - prompt:function(event,player){ - return '###是否弃置一枚破咒标记令'+get.translation(event.player)+ - '的非锁定技失效?###(剩余'+player.storage.pozhou+'枚)'; + prompt: function (event, player) { + return ( + "###是否弃置一枚破咒标记令" + + get.translation(event.player) + + "的非锁定技失效?###(剩余" + + player.storage.pozhou + + "枚)" + ); }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { player.storage.pozhou--; - if(!player.storage.pozhou){ - player.unmarkSkill('pozhou'); - } - else{ + if (!player.storage.pozhou) { + player.unmarkSkill("pozhou"); + } else { player.updateMarks(); } - trigger.player.addTempSkill('fengyin',{player:'phaseBegin'}); - } + trigger.player.addTempSkill("fengyin", { player: "phaseBegin" }); + }, }, - fengmo:{ - enable:'phaseUse', - usable:1, - filter:function(){ - return game.countPlayer(function(current){ - return current.getEquip(1); - })>=1; + fengmo: { + enable: "phaseUse", + usable: 1, + filter: function () { + return ( + game.countPlayer(function (current) { + return current.getEquip(1); + }) >= 1 + ); }, - filterTarget:function(card,player,target){ - return player!=target&&!target.isTurnedOver(); + filterTarget: function (card, player, target) { + return player != target && !target.isTurnedOver(); }, - content:function(){ - "step 0" - event.targets=[]; - event.num=0; - var players=game.filterPlayer(); - for(var i=0;i1){ - return 12-get.equipValue(card); + duanyue: { + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: { type: "equip" }, + check: function (card) { + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 12 - get.equipValue(card); } - return 8-get.equipValue(card); + return 8 - get.equipValue(card); }, - filter:function(event,player){ - return player.countCards('he',{type:'equip'}); + filter: function (event, player) { + return player.countCards("he", { type: "equip" }); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - content:function(){ + content: function () { target.damage(); }, - ai:{ - order:9.5, - expose:0.2, - result:{ - player:function(player,target){ - return get.damageEffect(target,player,player); - } - } - } + ai: { + order: 9.5, + expose: 0.2, + result: { + player: function (player, target) { + return get.damageEffect(target, player, player); + }, + }, + }, }, - tuzhen:{ - trigger:{source:'damageAfter'}, - filter:function(event,player){ - return event.player.isIn()&&event.player!=player&&event.player.hasCard(function(card){ - return get.type(card)!='basic'; - }); + tuzhen: { + trigger: { source: "damageAfter" }, + filter: function (event, player) { + return ( + event.player.isIn() && + event.player != player && + event.player.hasCard(function (card) { + return get.type(card) != "basic"; + }) + ); }, // alter:true, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)<0; + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) < 0; }, - content:function(){ - var hs=trigger.player.getCards('h',function(card){ - return get.type(card)!='basic'; + content: function () { + var hs = trigger.player.getCards("h", function (card) { + return get.type(card) != "basic"; }); - if(get.is.altered('tuzhen')){ - hs=hs.randomGet(); + if (get.is.altered("tuzhen")) { + hs = hs.randomGet(); } trigger.player.discard(hs); - } - }, - mojian:{ - trigger:{player:'shaBegin'}, - check:function(event,player){ - if(get.attitude(player,event.target)>0) return true; - return player.hp 0) return true; + return player.hp < player.maxHp; + }, + logTarget: "target", + content: function () { + "step 0"; trigger.target.draw(); - "step 1" + ("step 1"); player.recover(); - } - }, - swdliuhong:{ - trigger:{player:['useCard']}, - frequent:true, - filter:function(event){ - return event.card&&event.card.name=='sha'; }, - content:function(){ - player.draw(); - } }, - poyue:{ - mod:{ - targetInRange:function(card,player){ - if(card.name=='sha'&&get.color(card)=='black') return true; + swdliuhong: { + trigger: { player: ["useCard"] }, + frequent: true, + filter: function (event) { + return event.card && event.card.name == "sha"; + }, + content: function () { + player.draw(); + }, + }, + poyue: { + mod: { + targetInRange: function (card, player) { + if (card.name == "sha" && get.color(card) == "black") return true; + }, + cardUsable: function (card) { + if (get.is.altered("poyue")) return; + if (card.name == "sha" && get.color(card) == "red") return Infinity; }, - cardUsable:function(card){ - if(get.is.altered('poyue')) return; - if(card.name=='sha'&&get.color(card)=='red') return Infinity; - } }, // alter:true, - trigger:{player:'useCard'}, - filter:function(event,player){ - if(get.is.altered('poyue')) return false; - return event.card.name=='sha'&&get.color(event.card)=='red'; + trigger: { player: "useCard" }, + filter: function (event, player) { + if (get.is.altered("poyue")) return false; + return event.card.name == "sha" && get.color(event.card) == "red"; }, - forced:true, - content:function(){ - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + forced: true, + content: function () { + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } }, - group:'poyue2' + group: "poyue2", }, - poyue2:{ - trigger:{player:'shaBegin'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card&&get.color(event.card)=='red'; + poyue2: { + trigger: { player: "shaBegin" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.card && get.color(event.card) == "red"; + }, + content: function () { + trigger.directHit = true; }, - content:function(){ - trigger.directHit=true; - } }, - jianji:{ - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0&&lib.filter.cardEnabled({name:'sha'},player); + jianji: { + enable: "phaseUse", + filter: function (event, player) { + return ( + player.countCards("he", { type: "equip" }) > 0 && + lib.filter.cardEnabled({ name: "sha" }, player) + ); }, - usable:1, - filterCard:{type:'equip'}, - position:'he', - check:function(card){ - var player=_status.currentPhase; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); + usable: 1, + filterCard: { type: "equip" }, + position: "he", + check: function (card) { + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); } - return 6-get.equipValue(card); + return 6 - get.equipValue(card); }, - discard:false, - prepare:'throw', - delay:false, - filterTarget:function(card,player,target){ - return lib.filter.targetEnabled({name:'sha'},player,target); + discard: false, + prepare: "throw", + delay: false, + filterTarget: function (card, player, target) { + return lib.filter.targetEnabled({ name: "sha" }, player, target); }, - content:function(){ - "step 0" - player.addAdditionalSkill('jianji','unequip'); + content: function () { + "step 0"; + player.addAdditionalSkill("jianji", "unequip"); player.draw(); - player.useCard({name:'sha'},cards,targets,false).animate=false; - player.line(targets,'fire'); - "step 1" - player.removeAdditionalSkill('jianji'); + player.useCard({ name: "sha" }, cards, targets, false).animate = false; + player.line(targets, "fire"); + ("step 1"); + player.removeAdditionalSkill("jianji"); }, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.1; + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.1; }, - result:{ - target:function(player,target){ - player.addAdditionalSkill('jianji_ai','unequip'); - var eff=get.effect(target,{name:'sha'},player,target); - player.removeAdditionalSkill('jianji_ai'); + result: { + target: function (player, target) { + player.addAdditionalSkill("jianji_ai", "unequip"); + var eff = get.effect(target, { name: "sha" }, player, target); + player.removeAdditionalSkill("jianji_ai"); return eff; - } + }, }, - effect:{ - player:function(card,player){ - if(_status.currentPhase!=player) return; - if(get.type(card)=='equip'&& - player.countCards('e',{subtype:get.subtype(card)})&& - lib.filter.filterCard({name:'sha'},player)){ + effect: { + player: function (card, player) { + if (_status.currentPhase != player) return; + if ( + get.type(card) == "equip" && + player.countCards("e", { subtype: get.subtype(card) }) && + lib.filter.filterCard({ name: "sha" }, player) + ) { return 0; } - } + }, }, - threaten:1.3 - } - }, - huangyu:{ - enable:'phaseUse', - filter:function(event,player){ - if(!lib.card.chiyuxi) return false; - return !player.getStat('skill').huangyu&&player.countCards('he',{color:'red'})>1; + threaten: 1.3, }, - filterCard:{color:'red'}, - selectCard:2, - position:'he', - viewAs:{name:'chiyuxi',nature:'fire'}, - check:function(card){ - var player=_status.event.player; - if(player.hasSkill('jianji')&&get.type(card)=='equip'&& - lib.filter.filterCard({name:'sha'},player)){ + }, + huangyu: { + enable: "phaseUse", + filter: function (event, player) { + if (!lib.card.chiyuxi) return false; + return !player.getStat("skill").huangyu && player.countCards("he", { color: "red" }) > 1; + }, + filterCard: { color: "red" }, + selectCard: 2, + position: "he", + viewAs: { name: "chiyuxi", nature: "fire" }, + check: function (card) { + var player = _status.event.player; + if ( + player.hasSkill("jianji") && + get.type(card) == "equip" && + lib.filter.filterCard({ name: "sha" }, player) + ) { return 0; } - return 6-get.value(card) + return 6 - get.value(card); + }, + ai: { + order: 8, + expose: 0.2, + threaten: 1.2, }, - ai:{ - order:8, - expose:0.2, - threaten:1.2 - } }, - gongshen:{ - trigger:{global:'useCard'}, - priority:15, - filter:function(event,player){ - var type=get.type(event.card,'trick'); - if(type!='basic'&&type!='trick') return false; - return event.player!=player&&player.countCards('he',{type:'equip'})>0&& - event.targets&&event.targets.length>0; + gongshen: { + trigger: { global: "useCard" }, + priority: 15, + filter: function (event, player) { + var type = get.type(event.card, "trick"); + if (type != "basic" && type != "trick") return false; + return ( + event.player != player && + player.countCards("he", { type: "equip" }) > 0 && + event.targets && + event.targets.length > 0 + ); }, - direct:true, - content:function(){ - "step 0" - var effect=0; - for(var i=0;i=7&&get.type(trigger.card)=='trick') return val; - if(nme=='tao') return val; - if(nme=='wuzhong') return val; - if(nme=='zengbin') return val; - if(nme=='wangmeizhike') return val; - if(nme=='shunshou'&&player==trigger.targets[0]) return val; - if(nme=='guohe'&&player==trigger.targets[0]) return val; - if(nme=='liuxinghuoyu') return val; - if(nme=='nanman') return val; - if(nme=='wanjian') return val; - if(nme=='jingleishan') return val; - if(nme=='chiyuxi') return val; - if((nme=='juedou')&&(player==trigger.targets[0]||trigger.targets[0].hp==1)) return val; - if(nme=='chenhuodajie') return val; - if(nme=='lebu'&&trigger.targets[0].countCards('h')>trigger.targets[0].hp) return val; - if(nme=='sha'&&trigger.targets[0].hp==1&&!trigger.targets[0].hasShan()) return val; - if(nme=='jiedao'&&trigger.targets[0]==player) return val; - if(nme=='yihuajiemu'&&trigger.targets[0]==player) return val; - if(nme=='shuiyanqijun'&&trigger.targets.includes(player)) return val; + str += "的" + get.translation(trigger.card) + "失效"; + var next = player.chooseToDiscard("he", { type: "equip" }, get.prompt("gongshen")); + next.prompt2 = str; + next.logSkill = ["gongshen", trigger.player]; + next.autodelay = true; + next.ai = function (card) { + if (effect < 0) { + var val = 9 - get.value(card); + var nme = trigger.card.name; + if (get.value(trigger.card) >= 7 && get.type(trigger.card) == "trick") return val; + if (nme == "tao") return val; + if (nme == "wuzhong") return val; + if (nme == "zengbin") return val; + if (nme == "wangmeizhike") return val; + if (nme == "shunshou" && player == trigger.targets[0]) return val; + if (nme == "guohe" && player == trigger.targets[0]) return val; + if (nme == "liuxinghuoyu") return val; + if (nme == "nanman") return val; + if (nme == "wanjian") return val; + if (nme == "jingleishan") return val; + if (nme == "chiyuxi") return val; + if ( + nme == "juedou" && + (player == trigger.targets[0] || trigger.targets[0].hp == 1) + ) + return val; + if (nme == "chenhuodajie") return val; + if (nme == "lebu" && trigger.targets[0].countCards("h") > trigger.targets[0].hp) + return val; + if (nme == "sha" && trigger.targets[0].hp == 1 && !trigger.targets[0].hasShan()) + return val; + if (nme == "jiedao" && trigger.targets[0] == player) return val; + if (nme == "yihuajiemu" && trigger.targets[0] == player) return val; + if (nme == "shuiyanqijun" && trigger.targets.includes(player)) return val; return 0; } return -1; - } - "step 1" - if(result.bool){ + }; + ("step 1"); + if (result.bool) { // game.delay(2); trigger.cancel(); } }, - ai:{ - effect:{ - player:function(card,player,target){ - if(player!=target) return; - if(get.type(card)=='equip'&&!player.needsToDiscard()){ - return [0,0,0,0]; + ai: { + effect: { + player: function (card, player, target) { + if (player != target) return; + if (get.type(card) == "equip" && !player.needsToDiscard()) { + return [0, 0, 0, 0]; } - } + }, }, - threaten:2, - expose:0.3 - } - }, - xiaozhan:{ - trigger:{global:'useCard'}, - priority:15, - filter:function(event,player){ - return event.card.name=='sha'&&event.player!=player&& - player.countCards('h','sha')>0&&event.targets.includes(player)==false; + threaten: 2, + expose: 0.3, }, - direct:true, - content:function(){ - "step 0" - var effect=0; - for(var i=0;i 0 && + event.targets.includes(player) == false + ); + }, + direct: true, + content: function () { + "step 0"; + var effect = 0; + for (var i = 0; i < trigger.targets.length; i++) { + effect += get.effect(trigger.targets[i], trigger.card, trigger.player, player); } - var str='是否弃置一张杀令'+get.translation(trigger.player); - if(trigger.targets&&trigger.targets.length){ - str+='对'+get.translation(trigger.targets); + var str = "是否弃置一张杀令" + get.translation(trigger.player); + if (trigger.targets && trigger.targets.length) { + str += "对" + get.translation(trigger.targets); } - str+='的'+get.translation(trigger.card)+'失效?' - player.chooseToDiscard('h',{name:'sha'},str).ai=function(card){ - if(effect<0){ - return 9-get.value(card); + str += "的" + get.translation(trigger.card) + "失效?"; + player.chooseToDiscard("h", { name: "sha" }, str).ai = function (card) { + if (effect < 0) { + return 9 - get.value(card); } return -1; - } - "step 1" - if(result.bool){ + }; + ("step 1"); + if (result.bool) { trigger.cancel(); - player.logSkill('xiaozhan'); + player.logSkill("xiaozhan"); } }, - ai:{ - threaten:1.2, - expose:0.1 - } + ai: { + threaten: 1.2, + expose: 0.1, + }, }, - chuanyue:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + chuanyue: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - selectCard:2, - filterCard:true, - discard:false, - prepare:'throw', - filterTarget:function(card,player,target){ - return lib.filter.targetEnabled({name:'juedou'},player,target); + selectCard: 2, + filterCard: true, + discard: false, + prepare: "throw", + filterTarget: function (card, player, target) { + return lib.filter.targetEnabled({ name: "juedou" }, player, target); }, - check:function(card){ - return Math.max(7-get.value(card),7-get.useful(card)); + check: function (card) { + return Math.max(7 - get.value(card), 7 - get.useful(card)); }, - content:function(){ - player.useCard({name:'juedou'},targets,cards).animate=false; + content: function () { + player.useCard({ name: "juedou" }, targets, cards).animate = false; }, - ai:{ - result:{ - target:function(player,target){ - return get.effect(target,{name:'juedou'},player,target); - } + ai: { + result: { + target: function (player, target) { + return get.effect(target, { name: "juedou" }, player, target); + }, }, - order:8, - } - }, - dangping:{ - trigger:{source:'damageAfter'}, - direct:true, - filter:function(event,player){ - return event.parent.name!='dangping'&&!player.hasSkill('dangping2')&&player.countCards('he')>0; + order: 8, }, - content:function(){ - "step 0" - var next=player.chooseCardTarget({ - position:'he', - filterTarget:function(card,player,target){ - return player!=target&&trigger.player!=target&&get.distance(trigger.player,target)<=1; + }, + dangping: { + trigger: { source: "damageAfter" }, + direct: true, + filter: function (event, player) { + return ( + event.parent.name != "dangping" && + !player.hasSkill("dangping2") && + player.countCards("he") > 0 + ); + }, + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + position: "he", + filterTarget: function (card, player, target) { + return ( + player != target && + trigger.player != target && + get.distance(trigger.player, target) <= 1 + ); }, - filterCard:lib.filter.cardDiscardable, - ai1:function(card){ - return get.unuseful(card)+9; + filterCard: lib.filter.cardDiscardable, + ai1: function (card) { + return get.unuseful(card) + 9; }, - ai2:function(target){ - return get.damageEffect(target,player,player); + ai2: function (target) { + return get.damageEffect(target, player, player); }, - prompt:get.prompt('dangping') + prompt: get.prompt("dangping"), }); - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.discard(result.cards); - player.logSkill('dangping',result.targets); - player.addTempSkill('dangping2'); + player.logSkill("dangping", result.targets); + player.addTempSkill("dangping2"); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { result.targets[0].damage(); } - } + }, }, - dangping2:{}, - duishi:{ - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h')>0&&!player.hasSkill('duishi2'); + dangping2: {}, + duishi: { + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h") > 0 && !player.hasSkill("duishi2"); }, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h')>0&&!target.hasSkill('duishi3'); + filterTarget: function (card, player, target) { + return player != target && target.countCards("h") > 0 && !target.hasSkill("duishi3"); }, - filterCard:true, - check:function(card){return 8-get.value(card)}, - content:function(){ - "step 0" - var suit=get.suit(cards[0]); - target.chooseToDiscard({suit:suit},'h','对诗:弃置一张'+get.translation(suit)+ - '牌,或令'+get.translation(player)+'获得你一张牌').ai=function(card){ - if(get.attitude(target,player)>0) return 0; - return 9-get.value(card); - } - "step 1" - if(result.bool){ - target.addTempSkill('duishi3'); - } - else{ - player.gainPlayerCard(target,'he',true); - player.addTempSkill('duishi2'); + filterCard: true, + check: function (card) { + return 8 - get.value(card); + }, + content: function () { + "step 0"; + var suit = get.suit(cards[0]); + target.chooseToDiscard( + { suit: suit }, + "h", + "对诗:弃置一张" + + get.translation(suit) + + "牌,或令" + + get.translation(player) + + "获得你一张牌" + ).ai = function (card) { + if (get.attitude(target, player) > 0) return 0; + return 9 - get.value(card); + }; + ("step 1"); + if (result.bool) { + target.addTempSkill("duishi3"); + } else { + player.gainPlayerCard(target, "he", true); + player.addTempSkill("duishi2"); } }, - ai:{ - order:9, - threaten:1.5, - result:{ - target:-2, - player:0.5 + ai: { + order: 9, + threaten: 1.5, + result: { + target: -2, + player: 0.5, }, - expose:0.2 - } - }, - duishi2:{}, - duishi3:{}, - guisi:{ - trigger:{target:'shaBefore'}, - popup:false, - direct:true, - filter:function(event,player){ - return player.countCards('h'); + expose: 0.2, }, - content:function(){ - "step 0" - player.chooseCard('是否交给'+get.translation(trigger.player)+'一张牌并取消此杀?').ai=function(card){ - if(get.attitude(player,trigger.player)>0){ - return 9-get.value(card); + }, + duishi2: {}, + duishi3: {}, + guisi: { + trigger: { target: "shaBefore" }, + popup: false, + direct: true, + filter: function (event, player) { + return player.countCards("h"); + }, + content: function () { + "step 0"; + player.chooseCard( + "是否交给" + get.translation(trigger.player) + "一张牌并取消此杀?" + ).ai = function (card) { + if (get.attitude(player, trigger.player) > 0) { + return 9 - get.value(card); } - if(player.countCards('h',{name:'shan'})) return -1; - return 7-get.value(card); - } - "step 1" - if(result.bool){ - player.logSkill('guisi'); - trigger.player.gain(result.cards,player); - player.$give(result.cards,trigger.player); + if (player.countCards("h", { name: "shan" })) return -1; + return 7 - get.value(card); + }; + ("step 1"); + if (result.bool) { + player.logSkill("guisi"); + trigger.player.gain(result.cards, player); + player.$give(result.cards, trigger.player); trigger.cancel(); } }, }, - lianwu:{ - mod:{ - selectTarget:function(card,player,range){ - if(card.name=='sha'&&range[1]!=-1) range[1]++; + lianwu: { + mod: { + selectTarget: function (card, player, range) { + if (card.name == "sha" && range[1] != -1) range[1]++; }, }, - trigger:{player:'shaBegin'}, - forced:true, - filter:function(event,player){ - return event.card&&get.color(event.card)=='red'; + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event, player) { + return event.card && get.color(event.card) == "red"; + }, + content: function () { + trigger.directHit = true; }, - content:function(){ - trigger.directHit=true; - } }, - mingfu:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',{suit:'club'})>0; + mingfu: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he", { suit: "club" }) > 0; }, - position:'he', - filterCard:{suit:'club'}, - discard:false, - prepare:'throw', - filterTarget:function(card,player,target){ - return lib.filter.targetEnabled({name:'guiyoujie'},player,target); + position: "he", + filterCard: { suit: "club" }, + discard: false, + prepare: "throw", + filterTarget: function (card, player, target) { + return lib.filter.targetEnabled({ name: "guiyoujie" }, player, target); }, - check:function(card){ - if(card.name=='du') return 20; - return Math.max(7-get.value(card),7-get.useful(card)); + check: function (card) { + if (card.name == "du") return 20; + return Math.max(7 - get.value(card), 7 - get.useful(card)); }, - content:function(){ - target.addJudge('guiyoujie',cards); + content: function () { + target.addJudge("guiyoujie", cards); }, - ai:{ - result:{ - target:function(player,target){ - return get.effect(target,{name:'guiyoujie'},player,target); - } - }, - order:8, - } - }, - mufeng_old:{ - init:function(player){ - player.storage.mufeng=0; - }, - group:['mufeng_gain','mufeng_lose'], - mark:true, - intro:{ - content:function(storage){ - if(storage>0){ - return '防御距离+'+storage; - } - else if(storage<0){ - return '防御距离'+storage; - } - else{ - return '无距离变化'; - } - } - }, - subSkill:{ - lose:{ - trigger:{global:'dieAfter'}, - forced:true, - filter:function(event,player){ - return player.storage.mufeng>game.players.length/2; + ai: { + result: { + target: function (player, target) { + return get.effect(target, { name: "guiyoujie" }, player, target); }, - content:function(){ - player.storage.mufeng=0; + }, + order: 8, + }, + }, + mufeng_old: { + init: function (player) { + player.storage.mufeng = 0; + }, + group: ["mufeng_gain", "mufeng_lose"], + mark: true, + intro: { + content: function (storage) { + if (storage > 0) { + return "防御距离+" + storage; + } else if (storage < 0) { + return "防御距离" + storage; + } else { + return "无距离变化"; + } + }, + }, + subSkill: { + lose: { + trigger: { global: "dieAfter" }, + forced: true, + filter: function (event, player) { + return player.storage.mufeng > game.players.length / 2; + }, + content: function () { + player.storage.mufeng = 0; player.updateMarks(); - } - }, - gain:{ - trigger:{player:'loseEnd'}, - forced:true, - filter:function(event,player){ - return _status.currentPhase!=player; }, - content:function(){ + }, + gain: { + trigger: { player: "loseEnd" }, + forced: true, + filter: function (event, player) { + return _status.currentPhase != player; + }, + content: function () { player.storage.mufeng++; - if(player.storage.mufeng>game.players.length/2){ - player.storage.mufeng=0; + if (player.storage.mufeng > game.players.length / 2) { + player.storage.mufeng = 0; } player.updateMarks(); + }, + }, + }, + mod: { + globalTo: function (from, to, distance) { + if (typeof to.storage.mufeng == "number") { + return distance + to.storage.mufeng; } }, }, - mod:{ - globalTo:function(from,to,distance){ - if(typeof to.storage.mufeng=='number'){ - return distance+to.storage.mufeng; - } - } - } }, - mufeng:{ - trigger:{player:'phaseEnd'}, - frequent:true, - filter:function(event,player){ - return player.hasSkill('mufeng_used'); + mufeng: { + trigger: { player: "phaseEnd" }, + frequent: true, + filter: function (event, player) { + return player.hasSkill("mufeng_used"); }, - content:function(){ + content: function () { player.discoverCard(); }, - subSkill:{ - used:{}, - count:{ - trigger:{player:'useCard'}, - silent:true, - filter:function(event,player){ - return _status.currentPhase==player&&get.type(event.card)=='basic'; + subSkill: { + used: {}, + count: { + trigger: { player: "useCard" }, + silent: true, + filter: function (event, player) { + return _status.currentPhase == player && get.type(event.card) == "basic"; }, - content:function(){ - player.addTempSkill('mufeng_used'); - } - } + content: function () { + player.addTempSkill("mufeng_used"); + }, + }, }, - group:'mufeng_count' + group: "mufeng_count", }, - mufeng_old2:{ - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return !player.hasSkill('mufeng2')&&event.player!=player&& - Math.min(5,event.player.countCards('h'))>player.countCards('h'); + mufeng_old2: { + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + return ( + !player.hasSkill("mufeng2") && + event.player != player && + Math.min(5, event.player.countCards("h")) > player.countCards("h") + ); }, - content:function(){ - player.draw(Math.min(5,trigger.player.countCards('h'))-player.countCards('h')); - player.addTempSkill('mufeng2',{player:'phaseBegin'}); + content: function () { + player.draw(Math.min(5, trigger.player.countCards("h")) - player.countCards("h")); + player.addTempSkill("mufeng2", { player: "phaseBegin" }); }, }, - mufeng2:{}, - jiying:{ - mod:{ - targetInRange:function(card){ - if(card.name=='sha') return true; - } + mufeng2: {}, + jiying: { + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; + }, }, }, - minjing:{ - trigger:{player:'damageBegin'}, - forced:true, - filter:function(event,player){ - if(player.getEquip(2)) return false; - return lib.skill.guangshatianyi.filter(event,player); + minjing: { + trigger: { player: "damageBegin" }, + forced: true, + filter: function (event, player) { + if (player.getEquip(2)) return false; + return lib.skill.guangshatianyi.filter(event, player); }, - content:function(){ + content: function () { trigger.num--; }, - ai:{ - threaten:0.8 - } + ai: { + threaten: 0.8, + }, }, - touxi:{ - trigger:{global:'phaseEnd'}, - check:function(event,player){ - if(get.damageEffect(event.player,player,player,'thunder')>0){ - if(get.is.altered('touxi')&&get.attitude(player,event.player)<0&&player.countCards('he')){ - if(event.player.hp==1&&player.hp>1){ + touxi: { + trigger: { global: "phaseEnd" }, + check: function (event, player) { + if (get.damageEffect(event.player, player, player, "thunder") > 0) { + if ( + get.is.altered("touxi") && + get.attitude(player, event.player) < 0 && + player.countCards("he") + ) { + if (event.player.hp == 1 && player.hp > 1) { return true; } - } - else{ + } else { return true; } } return false; }, // alter:true, - filter:function(event,player){ - return event.player!=player&&!player.hasSkill('touxi2')&&event.player.isAlive(); + filter: function (event, player) { + return event.player != player && !player.hasSkill("touxi2") && event.player.isAlive(); }, - logTarget:'player', - content:function(){ - "step 0" - player.judge(function(card){ - if(get.color(card)=='black') return 1; + logTarget: "player", + content: function () { + "step 0"; + player.judge(function (card) { + if (get.color(card) == "black") return 1; return -1; }); - "step 1" - if(result.bool){ - trigger.player.damage('thunder'); - player.addSkill('touxi2'); + ("step 1"); + if (result.bool) { + trigger.player.damage("thunder"); + player.addSkill("touxi2"); event.finish(); - } - else{ - if(player.countCards('he')){ - var att=get.attitude(trigger.player,player); - trigger.player[get.is.altered('touxi')?'gainPlayerCard':'discardPlayerCard'](player,'he',function(button){ - if(att>0) return 0; - return get.buttonValue(button); - }); + } else { + if (player.countCards("he")) { + var att = get.attitude(trigger.player, player); + trigger.player[get.is.altered("touxi") ? "gainPlayerCard" : "discardPlayerCard"]( + player, + "he", + function (button) { + if (att > 0) return 0; + return get.buttonValue(button); + } + ); } } }, - ai:{ - expose:0.3, - threaten:1.2 - } + ai: { + expose: 0.3, + threaten: 1.2, + }, }, - touxi2:{ - trigger:{player:'phaseBegin'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('touxi2'); - } + touxi2: { + trigger: { player: "phaseBegin" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("touxi2"); + }, }, - nlianji:{ - audio:'lianji', - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - if(player==target) return false; - if(!ui.selected.targets.length) return target.countCards('h')>0; + nlianji: { + audio: "lianji", + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + if (player == target) return false; + if (!ui.selected.targets.length) return target.countCards("h") > 0; return ui.selected.targets[0].canCompare(target); }, - selectTarget:2, - multitarget:true, - multiline:true, - filter:function(event,player){ - return player.countCards('h')>0; + selectTarget: 2, + multitarget: true, + multiline: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - prepare:'throw', - discard:false, - filterCard:true, - check:function(card){ - return 6-get.value(card); + prepare: "throw", + discard: false, + filterCard: true, + check: function (card) { + return 6 - get.value(card); }, - content:function(){ - "step 0" - if(targets[0].canCompare(targets[1])){ + content: function () { + "step 0"; + if (targets[0].canCompare(targets[1])) { targets[0].chooseToCompare(targets[1]); - } - else{ + } else { event.finish(); } - "step 1" - if(result.bool){ - targets[0].gain(cards,'log'); + ("step 1"); + if (result.bool) { + targets[0].gain(cards, "log"); targets[0].$gain2(cards); targets[1].damage(targets[0]); - } - else if(!result.tie){ - targets[1].gain(cards,'log'); + } else if (!result.tie) { + targets[1].gain(cards, "log"); targets[1].$gain2(cards); targets[0].damage(targets[1]); } }, - ai:{ - expose:0.3, - threaten:2, - order:9, - result:{ - target:-1 - } + ai: { + expose: 0.3, + threaten: 2, + order: 9, + result: { + target: -1, + }, }, }, - lianji2:{ - group:['lianji3','lianji4'] + lianji2: { + group: ["lianji3", "lianji4"], }, - lianji3:{ - trigger:{player:'shaHit'}, - forced:true, - popup:false, - content:function(){ - player.storage.lianji2=true; - } + lianji3: { + trigger: { player: "shaHit" }, + forced: true, + popup: false, + content: function () { + player.storage.lianji2 = true; + }, }, - lianji4:{ - trigger:{player:'shaAfter'}, - forced:true, - popup:false, - content:function(){ - if(!player.storage.lianji2){ - player.damage('thunder',player.storage.lianji); + lianji4: { + trigger: { player: "shaAfter" }, + forced: true, + popup: false, + content: function () { + if (!player.storage.lianji2) { + player.damage("thunder", player.storage.lianji); } delete player.storage.lianji; delete player.storage.lianji2; - player.removeSkill('lianji2'); - } - }, - yinmo:{}, - miedao:{ - group:['miedao1','miedao2'], - ai:{ - threaten:1.4 - } - }, - miedao1:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - filter:function(event,player){ - return player.hp=player.maxHp-1) return [0,0]; - } - } - } + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, + }, }, - moyan:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hp0; + moyan: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hp < player.maxHp && player.countCards("h", { color: "red" }) > 0; }, - filterTarget:function(card,player,target){ - return player!=target;//&&get.distance(player,target,'attack')<=1; + filterTarget: function (card, player, target) { + return player != target; //&&get.distance(player,target,'attack')<=1; }, - selectTarget:function(){ + selectTarget: function () { return ui.selected.cards.length; }, - selectCard:function(){ - var player=_status.currentPhase; - return [1,Math.min(game.players.length-1,player.maxHp-player.hp)]; + selectCard: function () { + var player = _status.currentPhase; + return [1, Math.min(game.players.length - 1, player.maxHp - player.hp)]; }, - filterCard:function(card){ - return get.color(card)=='red'; + filterCard: function (card) { + return get.color(card) == "red"; }, - check:function(card){ - if(ui.selected.cards.length==0){ - return 8-get.value(card); + check: function (card) { + if (ui.selected.cards.length == 0) { + return 8 - get.value(card); } - return 6-get.value(card); + return 6 - get.value(card); }, - line:'fire', - content:function(){ - "step 0" - target.damage('fire'); - "step 1" + line: "fire", + content: function () { + "step 0"; + target.damage("fire"); + ("step 1"); // target.draw(); }, - ai:{ - order:9, - result:{ - target:function(player,target){ - return get.damageEffect(target,player,target,'fire'); - } + ai: { + order: 9, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target, "fire"); + }, }, - threaten:function(player,target){ - if(target.hp==1) return 2; - if(target.hp==2) return 1.5; + threaten: function (player, target) { + if (target.hp == 1) return 2; + if (target.hp == 2) return 1.5; return 0.5; }, - maixie:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(target.hp==target.maxHp) return [0,1]; + maixie: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp) return [0, 1]; } - if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0]; - } - } - } - }, - shejie:{ - trigger:{player:'damageEnd'}, - priority:9, - check:function(event,player){ - return get.attitude(player,event.source)<0; - }, - filter:function(event){ - return event&&event.source; - }, - content:function(){ - trigger.source.addSkill('shejie2'); - }, - ai:{ - threaten:0.4 - } - }, - shejie2:{ - unique:true, - trigger:{player:'phaseBegin'}, - forced:true, - priority:10, - mod:{ - cardEnabled:function(){ - return false; + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, }, - cardUsable:function(){ - return false; - }, - cardRespondable:function(){ - return false; - }, - cardSavable:function(){ - return false; - } - }, - content:function(){ - player.removeSkill('shejie2') }, }, - guiyin:{ - trigger:{player:'phaseDiscardEnd'}, - frequent:true, - filter:function(event,player){ - return event.cards&&event.cards.length>1 + shejie: { + trigger: { player: "damageEnd" }, + priority: 9, + check: function (event, player) { + return get.attitude(player, event.source) < 0; }, - content:function(){ + filter: function (event) { + return event && event.source; + }, + content: function () { + trigger.source.addSkill("shejie2"); + }, + ai: { + threaten: 0.4, + }, + }, + shejie2: { + unique: true, + trigger: { player: "phaseBegin" }, + forced: true, + priority: 10, + mod: { + cardEnabled: function () { + return false; + }, + cardUsable: function () { + return false; + }, + cardRespondable: function () { + return false; + }, + cardSavable: function () { + return false; + }, + }, + content: function () { + player.removeSkill("shejie2"); + }, + }, + guiyin: { + trigger: { player: "phaseDiscardEnd" }, + frequent: true, + filter: function (event, player) { + return event.cards && event.cards.length > 1; + }, + content: function () { player.draw(2); }, }, - wangchen:{ - trigger:{player:'phaseDiscardEnd'}, - direct:true, - filter:function(event,player){ - if(event.cards){ + wangchen: { + trigger: { player: "phaseDiscardEnd" }, + direct: true, + filter: function (event, player) { + if (event.cards) { // if(!get.is.altered('wangchen')) return true; - for(var i=0;i=2; }, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('yihua',trigger.player),2); - next.ai=function(card){ - if(get.effect(player,trigger.card)<0){ - if(card.name=='liuxinghuoyu') return 7-get.value(card); - return 5-get.value(card); + }, + yihua: { + trigger: { target: "useCardToBefore" }, + popup: false, + direct: true, + filter: function (event, player) { + if (event.addedTargets) return false; + // return event.card&&get.color(event.card)=='red'&&event.player!=player; + return event.targets.length == 1 && event.player != player && player.countCards("h") >= 2; + }, + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt("yihua", trigger.player), 2); + next.ai = function (card) { + if (get.effect(player, trigger.card) < 0) { + if (card.name == "liuxinghuoyu") return 7 - get.value(card); + return 5 - get.value(card); } return 0; }; - next.prompt2='反弹'+get.translation(trigger.player)+'的'+get.translation(trigger.card); - next.logSkill=['yihua',trigger.player]; - "step 1" - if(result.bool){ + next.prompt2 = + "反弹" + get.translation(trigger.player) + "的" + get.translation(trigger.card); + next.logSkill = ["yihua", trigger.player]; + ("step 1"); + if (result.bool) { // player.discard(result.cards); - trigger.target=trigger.player; - trigger.player=player; + trigger.target = trigger.player; + trigger.player = player; trigger.untrigger(); - trigger.trigger('useCardToBefore'); + trigger.trigger("useCardToBefore"); } // "step 2" // if(result.bool){ @@ -4994,383 +5318,418 @@ game.import('character', function () { // game.delay(); // } }, - ai:{ - threaten:function(player,target){ - if(target.countCards('h')<=2){ + ai: { + threaten: function (player, target) { + if (target.countCards("h") <= 2) { return 2; } - return 2/(target.countCards('h')-1); - } - } + return 2 / (target.countCards("h") - 1); + }, + }, }, - youyin:{ - trigger:{global:'discardAfter'}, - filter:function(event,player){ - if(event.player==player) return false; - if(player.countCards('h')>=5) return false; - for(var i=0;i= 5) return false; + for (var i = 0; i < event.cards.length; i++) { + if (get.type(event.cards[i]) != "basic") { return true; } } return false; }, - frequent:true, - content:function(){ - "step 0" - if(trigger.delay==false) game.delay(); - "step 1" + frequent: true, + content: function () { + "step 0"; + if (trigger.delay == false) game.delay(); + ("step 1"); player.draw(); }, }, - anlianying:{ - trigger:{player:'loseEnd'}, - frequent:true, - filter:function(event,player){ - if(player.countCards('h')) return false; - for(var i=0;i0; + zhanlu: { + enable: "phaseUse", + filterCard: function (card) { + var suit = get.suit(card); + return suit == "spade"; }, - check:function(card){ - return 10-get.value(card) + position: "he", + usable: 1, + filter: function (event, player) { + return player.countCards("he", { suit: "spade" }) > 0; }, - filterTarget:function(card,player,target){ - if(target.hp>=target.maxHp) return false; + check: function (card) { + return 10 - get.value(card); + }, + filterTarget: function (card, player, target) { + if (target.hp >= target.maxHp) return false; return true; }, - selectTarget:[1,3], - content:function(){ + selectTarget: [1, 3], + content: function () { target.recover(); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(player==target&&player.countCards('h')>player.hp) return 20; - return get.recoverEffect(target,player,target); - } + ai: { + order: 10, + result: { + target: function (player, target) { + if (player == target && player.countCards("h") > player.hp) return 20; + return get.recoverEffect(target, player, target); + }, }, - threaten:2 - } + threaten: 2, + }, }, - huopu:{ - enable:'phaseUse', - usable:1, - position:'he', - filterCard:function(card){ - return get.suit(card)=='heart'; + huopu: { + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: function (card) { + return get.suit(card) == "heart"; }, - viewAs:{name:'liuxinghuoyu'}, - viewAsFilter:function(player){ - if(!player.countCards('he',{suit:'heart'})) return false; + viewAs: { name: "liuxinghuoyu" }, + viewAsFilter: function (player) { + if (!player.countCards("he", { suit: "heart" })) return false; + }, + prompt: "将一张红桃手牌当作流星火羽使用", + check: function (card) { + return 6 - get.value(card); + }, + ai: { + threaten: 1.4, + order: 9, }, - prompt:'将一张红桃手牌当作流星火羽使用', - check:function(card){return 6-get.value(card)}, - ai:{ - threaten:1.4, - order:9, - } }, - rexue:{ - trigger:{global:'phaseBegin'}, - direct:true, - filter:function(event,player){ - return lib.filter.targetEnabled({name:'sha'},player,event.player)&&player.hasSha(null,true); + rexue: { + trigger: { global: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return ( + lib.filter.targetEnabled({ name: "sha" }, player, event.player) && + player.hasSha(null, true) + ); }, - content:function(){ - var next=player.chooseToUse({name:'sha'},'热血:是否对'+get.translation(trigger.player)+'使用一张杀',trigger.player,-1); - next.logSkill='rexue'; - next.oncard=function(){ + content: function () { + var next = player.chooseToUse( + { name: "sha" }, + "热血:是否对" + get.translation(trigger.player) + "使用一张杀", + trigger.player, + -1 + ); + next.logSkill = "rexue"; + next.oncard = function () { player.draw(); - } - } + }; + }, }, - shengshou:{ - enable:'phaseUse', - filterCard:function(card){ - return get.color(card)=='black'; + shengshou: { + enable: "phaseUse", + filterCard: function (card) { + return get.color(card) == "black"; + }, + viewAs: { name: "caoyao" }, + prompt: "将一张黑色手牌当作草药使用", + check: function (card) { + return 6 - get.value(card); + }, + ai: { + threaten: 1.6, }, - viewAs:{name:'caoyao'}, - prompt:'将一张黑色手牌当作草药使用', - check:function(card){return 6-get.value(card)}, - ai:{ - threaten:1.6 - } }, - huanjian:{ - enable:'phaseUse', - filterCard:function(card){ - return get.color(card)=='black'; + huanjian: { + enable: "phaseUse", + filterCard: function (card) { + return get.color(card) == "black"; }, - viewAs:{name:'bingpotong'}, - position:'he', - filter:function(event,player){ - return player.countCards('h',{color:'black'})>0; + viewAs: { name: "bingpotong" }, + position: "he", + filter: function (event, player) { + return player.countCards("h", { color: "black" }) > 0; }, - viewAsFilter:function(player){ - if(!player.countCards('he',{color:'black'})) return false; + viewAsFilter: function (player) { + if (!player.countCards("he", { color: "black" })) return false; + }, + prompt: "将一张黑色牌当作冰魄针使用", + check: function (card) { + return 5 - get.value(card); + }, + ai: { + threaten: 1.1, }, - prompt:'将一张黑色牌当作冰魄针使用', - check:function(card){return 5-get.value(card)}, - ai:{ - threaten:1.1 - } }, - benlei:{ - enable:'phaseUse', - viewAs:{name:'jingleishan',nature:'thunder'}, - filterCard:function(card,player){ + benlei: { + enable: "phaseUse", + viewAs: { name: "jingleishan", nature: "thunder" }, + filterCard: function (card, player) { return true; }, - selectCard:3, - position:'he', - prompt:'将三张牌当作惊雷闪使用', - check:function(card){ - return 4-get.value(card); + selectCard: 3, + position: "he", + prompt: "将三张牌当作惊雷闪使用", + check: function (card) { + return 4 - get.value(card); + }, + group: "benlei2", + ai: { + basic: { + order: 10, + }, }, - group:'benlei2', - ai:{ - basic:{ - order:10 - } - } }, - benlei2:{ - trigger:{source:'damageAfter'}, - filter:function(event,player){ - return event.hasNature('thunder')&&player.hp0; - } - else{ - return player.countCards('h')>0; + filter: function (event, player) { + if (player.hasSkill("susheng2")) return false; + if (get.is.altered("susheng")) { + return player.countCards("h", { color: "red" }) > 0; + } else { + return player.countCards("h") > 0; } }, - content:function(){ - "step 0" - var att=get.attitude(player,trigger.player); - var nh=player.countCards('h'); + content: function () { + "step 0"; + var att = get.attitude(player, trigger.player); + var nh = player.countCards("h"); var next; - if(get.is.altered('susheng')){ - next=player.chooseToDiscard(get.prompt('susheng',trigger.player),{color:'red'}); + if (get.is.altered("susheng")) { + next = player.chooseToDiscard(get.prompt("susheng", trigger.player), { + color: "red", + }); + } else { + next = player.chooseToDiscard(get.prompt("susheng", trigger.player)); } - else{ - next=player.chooseToDiscard(get.prompt('susheng',trigger.player)); - } - next.logSkill=['susheng',trigger.player]; - next.ai=function(card){ - if(att>3||(att>1&&nh>2)){ + next.logSkill = ["susheng", trigger.player]; + next.ai = function (card) { + if (att > 3 || (att > 1 && nh > 2)) { return get.unuseful2(card); } return 0; }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { // player.chooseToDiscard('h',true); trigger.cancel(); - trigger.player.hp=1; - if(trigger.player.maxHp<1) trigger.player.maxHp=1; + trigger.player.hp = 1; + if (trigger.player.maxHp < 1) trigger.player.maxHp = 1; trigger.player.update(); - player.addTempSkill('susheng2'); + player.addTempSkill("susheng2"); } }, - ai:{ - threaten:2 - } + ai: { + threaten: 2, + }, }, - susheng2:{}, - kunlunjing:{ - unique:true, + susheng2: {}, + kunlunjing: { + unique: true, // alter:true, - group:['kunlunjing1','kunlunjing2'], - 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=''; + group: ["kunlunjing1", "kunlunjing2"], + 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;j0){ - num+=num2; - } - else if(att<0){ - num-=num2; + onremove: ["kunlunjing", "kunlunjing2"], + check: function (event, player) { + if (get.is.altered("kunlunjing")) return false; + var storage = player.storage.kunlunjing; + var num = 0; + for (var i = 0; i < storage.length; i++) { + if (game.players.includes(storage[i].player)) { + var att = get.attitude(player, storage[i].player); + var num2 = + storage[i].value - + storage[i].player.countCards("he") + + storage[i].player.countCards("j"); + if (att > 0) { + num += num2; + } else if (att < 0) { + num -= num2; } } } - return num>Math.min(2,game.players.length/2); + return num > Math.min(2, game.players.length / 2); }, - content:function(){ - "step 0" + content: function () { + "step 0"; game.delay(0.5); - "step 1" + ("step 1"); game.animate.window(1); - "step 2" - var storage=event.player.storage.kunlunjing; - for(var i=0;i0 + oldliaoyuan: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:function(card,player,target){ - return player!=target + filterTarget: function (card, player, target) { + return player != target; }, - filterCard:function(card,player){ - if(ui.selected.cards.length){ - return get.suit(card)==get.suit(ui.selected.cards[0]); + filterCard: function (card, player) { + if (ui.selected.cards.length) { + return get.suit(card) == get.suit(ui.selected.cards[0]); } - var cards=player.getCards('h'); - for(var i=0;i0 + oldliaoyuan2: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:function(card,player,target){ - return player!=target + filterTarget: function (card, player, target) { + return player != target; }, - filterCard:function(card,player){ - if(ui.selected.cards.length){ - return get.suit(card)==get.suit(ui.selected.cards[0]); + filterCard: function (card, player) { + if (ui.selected.cards.length) { + return get.suit(card) == get.suit(ui.selected.cards[0]); } - var cards=player.getCards('h'); - for(var i=0;i0; + shehun: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('he')>0; + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 0; }, - filterCard:function(card){ - var suit=get.suit(card); - for(var i=0;ilength) return -1.5+eff; - return -1+eff; - } + ai: { + order: 6, + result: { + target: function (player, target) { + var eff = get.damageEffect(target, player); + var num = target.countCards("he"); + var length = ui.selected.cards.length; + if (num == length) return -2 + eff; + if (num > length) return -1.5 + eff; + return -1 + eff; + }, }, - expose:0.2 - } + expose: 0.2, + }, }, - liaoyuan:{ - trigger:{player:'shaBegin'}, - direct:true, - filter:function(event,player){ - if(get.itemtype(event.cards)!='cards') return false; - return player.countCards('he',{suit:get.suit(event.cards)})>0; + liaoyuan: { + trigger: { player: "shaBegin" }, + direct: true, + filter: function (event, player) { + if (get.itemtype(event.cards) != "cards") return false; + return player.countCards("he", { suit: get.suit(event.cards) }) > 0; }, // alter:true, - content:function(){ - "step 0" - player.storage.liaoyuan=0; - event.num=0; - event.cards=[]; - "step 1" - var suit=get.suit(trigger.cards); - event.suit=suit; - player.chooseCard('he',get.prompt('liaoyuan'),function(card,player){ - return get.suit(card)==suit&&lib.filter.cardDiscardable(card,player); - }).ai=function(card){ - if(get.attitude(player,trigger.target)>=0) return 0; - if(get.effect(trigger.target,{name:'sha'},player,player)>0){ - return 7-get.value(card); + content: function () { + "step 0"; + player.storage.liaoyuan = 0; + event.num = 0; + event.cards = []; + ("step 1"); + var suit = get.suit(trigger.cards); + event.suit = suit; + player.chooseCard("he", get.prompt("liaoyuan"), function (card, player) { + return get.suit(card) == suit && lib.filter.cardDiscardable(card, player); + }).ai = function (card) { + if (get.attitude(player, trigger.target) >= 0) return 0; + if (get.effect(trigger.target, { name: "sha" }, player, player) > 0) { + return 7 - get.value(card); } return 0; - } - "step 2" - if(result.bool){ - if(event.num==0){ - player.logSkill('liaoyuan'); + }; + ("step 2"); + if (result.bool) { + if (event.num == 0) { + player.logSkill("liaoyuan"); } player.discard(result.cards); event.num++; - if(player.countCards('he',{suit:event.suit})>1&&!get.is.altered('liaoyuan')){ + if ( + player.countCards("he", { suit: event.suit }) > 1 && + !get.is.altered("liaoyuan") + ) { event.goto(1); } } - "step 3" - if(event.num){ - var next=trigger.target.chooseToRespond({name:'shan'},'请打出一张闪响应燎原'); - next.ai=get.unuseful2; - if(event.num>1) next.set('prompt2','共需额外打出'+event.num+'张闪'); - } - else{ + ("step 3"); + if (event.num) { + var next = trigger.target.chooseToRespond({ name: "shan" }, "请打出一张闪响应燎原"); + next.ai = get.unuseful2; + if (event.num > 1) next.set("prompt2", "共需额外打出" + event.num + "张闪"); + } else { event.finish(); } - "step 4" - if(result.bool){ + ("step 4"); + if (result.bool) { event.num--; event.goto(3); - } - else{ + } else { trigger.untrigger(); - trigger.directHit=true; - player.storage.liaoyuan=event.num; + trigger.directHit = true; + player.storage.liaoyuan = event.num; } }, - group:['liaoyuan2','liaoyuan3'] + group: ["liaoyuan2", "liaoyuan3"], }, - liaoyuan2:{ - trigger:{source:'damageBegin'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.storage.liaoyuan>0&&event.parent.name!='_lianhuan'&&event.parent.name!='_lianhuan2'; + liaoyuan2: { + trigger: { source: "damageBegin" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + player.storage.liaoyuan > 0 && + event.parent.name != "_lianhuan" && + event.parent.name != "_lianhuan2" + ); }, - content:function(){ - trigger.num+=player.storage.liaoyuan; - player.storage.liaoyuan=0; - } - }, - liaoyuan3:{ - trigger:{player:'shaEnd'}, - silent:true, - content:function(){ - player.storage.liaoyuan=0; - } - }, - dunxing:{ - direct:true, - filter:function(event,player){ - if(event.player==player) return false; - return player.countCards('he')>0; + content: function () { + trigger.num += player.storage.liaoyuan; + player.storage.liaoyuan = 0; }, - trigger:{target:'useCardToBefore'}, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he',get.prompt(event.name)); - next.logSkill=event.name; - next.ai=function(card){ - if(get.tag(trigger.card,'multitarget')&&!get.tag(card,'multineg')) return 0; - if(get.value(trigger.card,trigger.player,'raw')<5) return 0; - if(get.tag(trigger.card,'respondSha')&&player.hasSha()) return 0; - if(get.tag(trigger.card,'respondShan')&&player.hasShan()) return 0; - if(get.effect(player,trigger.card,trigger.player,player)<0){ - return 7-get.value(card); + }, + liaoyuan3: { + trigger: { player: "shaEnd" }, + silent: true, + content: function () { + player.storage.liaoyuan = 0; + }, + }, + dunxing: { + direct: true, + filter: function (event, player) { + if (event.player == player) return false; + return player.countCards("he") > 0; + }, + trigger: { target: "useCardToBefore" }, + content: function () { + "step 0"; + var next = player.chooseToDiscard("he", get.prompt(event.name)); + next.logSkill = event.name; + next.ai = function (card) { + if (get.tag(trigger.card, "multitarget") && !get.tag(card, "multineg")) return 0; + if (get.value(trigger.card, trigger.player, "raw") < 5) return 0; + if (get.tag(trigger.card, "respondSha") && player.hasSha()) return 0; + if (get.tag(trigger.card, "respondShan") && player.hasShan()) return 0; + if (get.effect(player, trigger.card, trigger.player, player) < 0) { + return 7 - get.value(card); } return 0; - } - next.prompt2='弃置一张牌并进行一次判定,若结果不为红桃则'+get.translation(trigger.card)+'失效'; - "step 1" - if(result.bool){ - player.judge(function(card){ - return get.suit(card)=='heart'?-1:1; + }; + next.prompt2 = + "弃置一张牌并进行一次判定,若结果不为红桃则" + get.translation(trigger.card) + "失效"; + ("step 1"); + if (result.bool) { + player.judge(function (card) { + return get.suit(card) == "heart" ? -1 : 1; }); - } - else{ + } else { event.finish(); } - "step 2" - if(result.suit!='heart'){ + ("step 2"); + if (result.suit != "heart") { trigger.cancel(); } - } + }, }, - qiaoxie:{ - group:['qiaoxie2','qiaoxie3'], - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip') return [1,3]; - } + qiaoxie: { + group: ["qiaoxie2", "qiaoxie3"], + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip") return [1, 3]; + }, }, - reverseEquip:true, - noe:true, - } + reverseEquip: true, + noe: true, + }, }, - qiaoxie2:{ - trigger:{player:'equipEnd'}, - frequent:true, + qiaoxie2: { + trigger: { player: "equipEnd" }, + frequent: true, //filter:function(event,player){ // for(var i=0;i0; - }).set('autodelay',0.5).ai=function(target){ - return -get.attitude(player,target); + content: function () { + "step 0"; + player + .chooseTarget([1, 1], "请选择巧械的目标", function (card, player, target) { + if (player == target) return false; + return target.countCards("he") > 0; + }) + .set("autodelay", 0.5).ai = function (target) { + return -get.attitude(player, target); }; - "step 1" - if(result.bool){ - player.logSkill('qiaoxie3',result.targets); - player.discardPlayerCard(result.targets[0],'he',true); - } - else{ + ("step 1"); + if (result.bool) { + player.logSkill("qiaoxie3", result.targets); + player.discardPlayerCard(result.targets[0], "he", true); + } else { event.finish(); } }, }, - qiaoxie4:{ - trigger:{player:['loseEnd']}, - frequent:true, - filter:function(event,player){ - if(typeof lib.cardType.hslingjian!='number') return false; - if(!player.equiping) return false; - for(var i=0;i0; - }).ai=function(target){ - var att=get.attitude(player,target); - if(att<=0){ - return 1-att+(target.countCards('e')?2:0); + content: function () { + "step 0"; + player.chooseTarget([1, 1], get.prompt("meihuo"), function (card, player, target) { + if (player == target) return false; + return target.countCards("he") > 0; + }).ai = function (target) { + var att = get.attitude(player, target); + if (att <= 0) { + return 1 - att + (target.countCards("e") ? 2 : 0); } return 0; }; - "step 1" - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('meihuo',event.target); - player.choosePlayerCard(event.target,'he',true).ai=function(button){ - var card=button.link; - if(get.position(card)=='e') return get.equipValue(card); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("meihuo", event.target); + player.choosePlayerCard(event.target, "he", true).ai = function (button) { + var card = button.link; + if (get.position(card) == "e") return get.equipValue(card); return 5; }; } - "step 2" - if(result.bool){ - if(get.position(result.buttons[0].link)=='e'){ + ("step 2"); + if (result.bool) { + if (get.position(result.buttons[0].link) == "e") { player.equip(result.buttons[0].link); + } else { + player.gain(result.buttons[0].link, event.target); } - else{ - player.gain(result.buttons[0].link,event.target); - } - event.target.$giveAuto(result.buttons[0].link,player); + event.target.$giveAuto(result.buttons[0].link, player); } }, }, - yishan:{ - group:'yishan2', - notemp:true, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - var content=player.storage.yishan; - for(var i=0;i最近失去的牌'); - var cards=[]; - for(var i=0;i=4) break; + if (cards.length >= 4) break; } } - if(cards.length){ + if (cards.length) { dialog.add(cards); - } - else{ - dialog.add('(无)'); + } else { + dialog.add("(无)"); } }, - content:function(content,player){ - var str='最近失去的牌:'; - var cards=[]; - for(var i=0;i=4) break; + if (cards.length >= 4) break; } } - if(cards.length){ - str+=get.translation(cards); - } - else{ - str+='无'; + if (cards.length) { + str += get.translation(cards); + } else { + str += "无"; } return str; - } - } + }, + }, }, - yishan2:{ - trigger:{player:'loseEnd'}, - silent:true, - content:function(){ - for(var i=0;i1; + return get.distance(event.target, player, "attack") > 1; + }, + content: function () { + trigger.directHit = true; }, - content:function(){ - trigger.directHit=true; - } }, - poxing:{ - trigger:{source:'damageBegin'}, - filter:function(trigger,player){ - return trigger.player.hp>player.hp; + poxing: { + trigger: { source: "damageBegin" }, + filter: function (trigger, player) { + return trigger.player.hp > player.hp; }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.num++; - } - }, - luomu:{ - trigger:{source:'damageEnd'}, - forced:true, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.player.countCards('hej'); }, - content:function(){ - trigger.player.discard(trigger.player.getCards('hej').randomGet()); - } }, - huanhun:{ - trigger:{global:'dying'}, - priority:6, - filter:function(event,player){ - if(event.player.hp>0) return false; - if(get.is.altered('huanhun')) return player.countCards('h',{color:'red'})>0; - return player.countCards('he')>0; + luomu: { + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.player.countCards("hej"); + }, + content: function () { + trigger.player.discard(trigger.player.getCards("hej").randomGet()); + }, + }, + huanhun: { + trigger: { global: "dying" }, + priority: 6, + filter: function (event, player) { + if (event.player.hp > 0) return false; + if (get.is.altered("huanhun")) return player.countCards("h", { color: "red" }) > 0; + return player.countCards("he") > 0; }, // alter:true, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.is.altered('huanhun')?'h':'he',get.prompt2('huanhun',trigger.player),function(card){ - if(get.is.altered('huanhun')){ - return get.color(card)=='red'; + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + get.is.altered("huanhun") ? "h" : "he", + get.prompt2("huanhun", trigger.player), + function (card) { + if (get.is.altered("huanhun")) { + return get.color(card) == "red"; + } else { + return true; + } } - else{ - return true; - } - }); - next.logSkill=['huanhun',trigger.player]; - next.ai=function(card){ - if(card.name=='tao') return 0; - if(get.attitude(player,trigger.player)>0){ - return 8-get.value(card); + ); + next.logSkill = ["huanhun", trigger.player]; + next.ai = function (card) { + if (card.name == "tao") return 0; + if (get.attitude(player, trigger.player) > 0) { + return 8 - get.value(card); } return 0; }; - "step 1" - if(result.bool){ - event.card=result.cards[0]; - trigger.player.judge(function(card){ - return get.color(card)=='red'?1:0; + ("step 1"); + if (result.bool) { + event.card = result.cards[0]; + trigger.player.judge(function (card) { + return get.color(card) == "red" ? 1 : 0; }); - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { trigger.player.recover(); - } - else if(event.card.isInPile()){ - trigger.player.gain(event.card,'gain2'); + } else if (event.card.isInPile()) { + trigger.player.gain(event.card, "gain2"); } }, - ai:{ - threaten:1.6, - expose:0.2 - } + ai: { + threaten: 1.6, + expose: 0.2, + }, }, - huanhun_old:{ - enable:'phaseUse', - forbid:['versus'], - filter:function(){ - return game.dead.length>0 + huanhun_old: { + enable: "phaseUse", + forbid: ["versus"], + filter: function () { + return game.dead.length > 0; }, - usable:1, - filterCard:function(card){ - return get.suit(card)=='heart'; + usable: 1, + filterCard: function (card) { + return get.suit(card) == "heart"; }, - direct:true, - content:function(){ - "step 0" - var list=[]; - for(var i=0;i2) return 3; + ai: { + order: 10, + result: { + player: function (player) { + for (var i = 0; i < game.dead.length; i++) { + if (get.attitude(player, game.dead[i]) > 2) return 3; } return 0; - } + }, }, - threaten:2, - } - }, - yinyue:{ - trigger:{global:'recoverAfter'}, - check:function(event,player){ - return get.attitude(player,event.player)>0; + threaten: 2, }, - logTarget:'player', + }, + yinyue: { + trigger: { global: "recoverAfter" }, + check: function (event, player) { + return get.attitude(player, event.player) > 0; + }, + logTarget: "player", // alter:true, - content:function(){ - "step 0" + content: function () { + "step 0"; // if(get.is.altered('yinyue')){ // trigger.player.draw(); // event.finish(); // } // else - if(trigger.player!=player&&trigger.player.countCards('h')>=player.countCards('h')){ - game.asyncDraw([trigger.player,player]); - } - else{ + if ( + trigger.player != player && + trigger.player.countCards("h") >= player.countCards("h") + ) { + game.asyncDraw([trigger.player, player]); + } else { trigger.player.draw(); event.finish(); } - "step 1" + ("step 1"); game.delay(); }, - ai:{ - expose:0.2 - } + ai: { + expose: 0.2, + }, }, - daofa:{ - trigger:{global:'damageAfter'}, - check:function(event,player){ - return event.source&&get.attitude(player,event.source)<0; + daofa: { + trigger: { global: "damageAfter" }, + check: function (event, player) { + return event.source && get.attitude(player, event.source) < 0; }, - filter:function(event,player){ - return event.source&&event.source!=player&&event.source.countCards('he'); + filter: function (event, player) { + return event.source && event.source != player && event.source.countCards("he"); }, - logTarget:'source', - content:function(){ - trigger.source.chooseToDiscard('he',true); + logTarget: "source", + content: function () { + trigger.source.chooseToDiscard("he", true); + }, + ai: { + expose: 0.2, + threaten: 1.5, }, - ai:{ - expose:0.2, - threaten:1.5 - } }, - daixing:{ - group:['daixing2','daixing3'], - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + daixing: { + group: ["daixing2", "daixing3"], + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt2('daixing'),'he',[1,player.countCards('he')]); - next.logSkill='daixing'; - next.ai=function(card){ - if(ui.selected.cards.length>=2) return 0; - if(ui.selected.cards.length==1){ - if(player.countCards('h')>player.hp){ - return 3-get.value(card); + content: function () { + "step 0"; + var next = player.chooseToDiscard(get.prompt2("daixing"), "he", [ + 1, + player.countCards("he"), + ]); + next.logSkill = "daixing"; + next.ai = function (card) { + if (ui.selected.cards.length >= 2) return 0; + if (ui.selected.cards.length == 1) { + if (player.countCards("h") > player.hp) { + return 3 - get.value(card); } return 0; } - return 6-get.value(card); + return 6 - get.value(card); }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.changeHujia(result.cards.length); - player.storage.daixing=result.cards.length; + player.storage.daixing = result.cards.length; } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(target.storage.daixing>1) return 0.1; - if(target.storage.daixing==1) return 0.5; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (target.storage.daixing > 1) return 0.1; + if (target.storage.daixing == 1) return 0.5; } return 1.5; - } - } + }, + }, + }, + intro: { + content: "mark", }, - intro:{ - content:'mark' - } }, - daixing2:{ - trigger:{player:'phaseBegin'}, - silent:true, - content:function(){ - if(player.storage.daixing){ + daixing2: { + trigger: { player: "phaseBegin" }, + silent: true, + content: function () { + if (player.storage.daixing) { player.changeHujia(-player.storage.daixing); - player.storage.daixing=0; + player.storage.daixing = 0; } - } - }, - daixing3:{ - trigger:{player:['damageEnd','damageZero']}, - silent:true, - filter:function(event,player){ - return player.storage.daixing>0&&event.hujia>0; }, - content:function(){ - player.storage.daixing-=trigger.hujia; - if(player.storage.daixing<0){ - player.storage.daixing=0; - } - } }, - swd_wuxie:{ - mod:{ - targetEnabled:function(card,player,target){ - if(get.type(card)=='delay'&&player!=target){ + daixing3: { + trigger: { player: ["damageEnd", "damageZero"] }, + silent: true, + filter: function (event, player) { + return player.storage.daixing > 0 && event.hujia > 0; + }, + content: function () { + player.storage.daixing -= trigger.hujia; + if (player.storage.daixing < 0) { + player.storage.daixing = 0; + } + }, + }, + swd_wuxie: { + mod: { + targetEnabled: function (card, player, target) { + if (get.type(card) == "delay" && player != target) { return false; } - } - } + }, + }, }, - lqingcheng:{ - trigger:{player:'phaseEnd'}, - frequent:true, - content:function(){ - "step 0" - if(event.cards==undefined) event.cards=[]; - player.judge(function(card){ - if(get.color(card)=='red') return 1.5; + lqingcheng: { + trigger: { player: "phaseEnd" }, + frequent: true, + content: function () { + "step 0"; + if (event.cards == undefined) event.cards = []; + player.judge(function (card) { + if (get.color(card) == "red") return 1.5; return -1.5; - },ui.special); - "step 1" - if(result.judge>0){ + }, ui.special); + ("step 1"); + if (result.judge > 0) { event.cards.push(result.card); - if(event.cards.length==3){ + if (event.cards.length == 3) { player.gain(event.cards); - if(event.cards.length){ + if (event.cards.length) { player.$draw(event.cards); } event.finish(); + } else if (lib.config.autoskilllist.includes("lqingcheng")) { + player.chooseBool("是否再次发动【倾城】?"); + } else { + event._result = { bool: true }; } - else if(lib.config.autoskilllist.includes('lqingcheng')){ - player.chooseBool('是否再次发动【倾城】?'); - } - else{ - event._result={bool:true}; - } - } - else{ + } else { player.gain(event.cards); - if(event.cards.length){ + if (event.cards.length) { player.$draw(event.cards); } event.finish(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { event.goto(0); - } - else{ + } else { player.gain(event.cards); - if(event.cards.length){ + if (event.cards.length) { player.$draw(event.cards); } } }, - ai:{ - threaten:1.4 - } + ai: { + threaten: 1.4, + }, }, - lingxin:{ - trigger:{player:'phaseEnd'}, - frequent:true, - content:function(){ - "step 0" - event.cards=get.cards(3); + lingxin: { + trigger: { player: "phaseEnd" }, + frequent: true, + content: function () { + "step 0"; + event.cards = get.cards(3); player.showCards(event.cards); - "step 1" - for(var i=0;i=player.hp&&event.skill!='lingwu'; + lingwu: { + trigger: { player: "phaseAfter" }, + frequent: true, + filter: function (event, player) { + return player.countUsed() >= player.hp && event.skill != "lingwu"; }, - content:function(){ + content: function () { player.insertPhase(); }, - ai:{ - order:-10, - result:{ - target:2 + ai: { + order: -10, + result: { + target: 2, }, - threaten:1.5 - } + threaten: 1.5, + }, }, - xianjiang_old:{ - enable:'phaseUse', - position:'he', - usable:1, - filterCard:function(card,player){ - if(player.storage.xianjiang&&player.storage.xianjiang.includes(card)) return false; - return get.type(card)=='equip'; + xianjiang_old: { + enable: "phaseUse", + position: "he", + usable: 1, + filterCard: function (card, player) { + if (player.storage.xianjiang && player.storage.xianjiang.includes(card)) return false; + return get.type(card) == "equip"; }, - init:function(player){ - player.storage.xianjiang=[]; + init: function (player) { + player.storage.xianjiang = []; }, - check:function(card){ - return 10-get.value(card); + check: function (card) { + return 10 - get.value(card); }, - prompt:'将一张装备牌永久转化为任意一张装备牌', - content:function(){ - "step 0" - var list=[]; - var suit=get.suit(cards[0]); - var number=get.number(cards[0]); - for(var i in lib.card){ - if(lib.card[i].mode&&lib.card[i].mode.includes(lib.config.mode)==false) continue; - if(lib.card[i].type=='equip'&&cards[0].name!=i){ - if(get.equipValue({name:i})<10) list.push([suit,number,i]); + prompt: "将一张装备牌永久转化为任意一张装备牌", + content: function () { + "step 0"; + var list = []; + var suit = get.suit(cards[0]); + var number = get.number(cards[0]); + for (var i in lib.card) { + if (lib.card[i].mode && lib.card[i].mode.includes(lib.config.mode) == false) continue; + if (lib.card[i].type == "equip" && cards[0].name != i) { + if (get.equipValue({ name: i }) < 10) list.push([suit, number, i]); } } - var dialog=ui.create.dialog([list,'vcard']); - player.chooseButton(dialog,true,function(button){ - return get.value({name:button.link[2]},player); + var dialog = ui.create.dialog([list, "vcard"]); + player.chooseButton(dialog, true, function (button) { + return get.value({ name: button.link[2] }, player); }); - "step 1" + ("step 1"); cards[0].init(result.buttons[0].link); player.gain(cards[0]); player.$gain(cards[0]); game.delay(); player.storage.xianjiang.add(cards[0]); }, - ai:{ - order:9, - result:{ - player:1 + ai: { + order: 9, + result: { + player: 1, }, - threaten:2, - } - }, - xianjiang2:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - popup:false, - filter:function(event,player){ - return player.hasSkill('xianjiang'); + threaten: 2, }, - content:function(){ - player.storage.xianjiang=[]; - } }, - xianjiang:{ - enable:'phaseUse', + xianjiang2: { + trigger: { player: "phaseUseBegin" }, + forced: true, + popup: false, + filter: function (event, player) { + return player.hasSkill("xianjiang"); + }, + content: function () { + player.storage.xianjiang = []; + }, + }, + xianjiang: { + enable: "phaseUse", // alter:true, - filterCard:function(card){ - return get.type(card,'trick')=='trick'; + filterCard: function (card) { + return get.type(card, "trick") == "trick"; }, - usable:1, - filter:function(event,player){ - if(get.is.altered('xianjiang')&&player.countCards('e')) return false; - if(player.countCards('h',{type:'trick'})) return true; - if(player.countCards('h',{type:'delay'})) return true; + usable: 1, + filter: function (event, player) { + if (get.is.altered("xianjiang") && player.countCards("e")) return false; + if (player.countCards("h", { type: "trick" })) return true; + if (player.countCards("h", { type: "delay" })) return true; return false; }, - selectCard:1, - check:function(card){ - return 8-get.value(card); + selectCard: 1, + check: function (card) { + return 8 - get.value(card); }, - content:function(){ - var card=game.createCard(get.inpile('equip').randomGet()); + content: function () { + var card = game.createCard(get.inpile("equip").randomGet()); player.equip(card); player.$gain2(card); game.delay(); }, - ai:{ - result:{ - player:1 + ai: { + result: { + player: 1, }, - order:9 - } + order: 9, + }, }, - shengong:{ - trigger:{player:['chooseToRespondBegin']}, - filter:function(event,player){ - if(event.responded) return false; - if(!player.countCards('he')) return false; - if(event.filterCard({name:'shan'})){ - if(game.hasPlayer(function(current){ - return current!=player&¤t.getEquip(2); - })){ + shengong: { + trigger: { player: ["chooseToRespondBegin"] }, + filter: function (event, player) { + if (event.responded) return false; + if (!player.countCards("he")) return false; + if (event.filterCard({ name: "shan" })) { + if ( + game.hasPlayer(function (current) { + return current != player && current.getEquip(2); + }) + ) { return true; } } - if(event.filterCard({name:'sha'})){ - if(game.hasPlayer(function(current){ - return current!=player&¤t.getEquip(1); - })){ + if (event.filterCard({ name: "sha" })) { + if ( + game.hasPlayer(function (current) { + return current != player && current.getEquip(1); + }) + ) { return true; } } return false; }, - direct:true, - content:function(){ - "step 0" - var list=[]; - var players=game.filterPlayer(); - if(trigger.filterCard({name:'shan'})){ - for(var i=0;i0; + huajian: { + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - "step 0" - var next=player.chooseCardTarget({ - position:'he', - filterTarget:function(card,player,target){ - return lib.filter.targetEnabled({name:'sha'},player,target); + content: function () { + "step 0"; + var next = player.chooseCardTarget({ + position: "he", + filterTarget: function (card, player, target) { + return lib.filter.targetEnabled({ name: "sha" }, player, target); }, - filterCard:true, - ai1:function(card){ - return get.unuseful(card)+9; + filterCard: true, + ai1: function (card) { + return get.unuseful(card) + 9; }, - ai2:function(target){ - return get.effect(target,{name:'sha'},player); + ai2: function (target) { + return get.effect(target, { name: "sha" }, player); }, - prompt:get.prompt('huajian') + prompt: get.prompt("huajian"), }); - "step 1" - if(result.bool){ - player.logSkill('huajian'); - player.useCard({name:'sha'},result.cards,result.targets,false); + ("step 1"); + if (result.bool) { + player.logSkill("huajian"); + player.useCard({ name: "sha" }, result.cards, result.targets, false); } }, - ai:{ - expose:0.2, - } - }, - polang:{ - trigger:{source:'damageEnd'}, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.player.countCards('e'); - }, - direct:true, - logTarget:'player', - content:function(){ - player.discardPlayerCard(trigger.player,'e',get.prompt('polang',trigger.player)).logSkill='polang'; - }, - ai:{ - expose:0.3 + ai: { + expose: 0.2, }, }, - jikong:{ - trigger:{player:['loseEnd','phaseBegin']}, - direct:true, - usable:1, + polang: { + trigger: { source: "damageEnd" }, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.player.countCards("e"); + }, + direct: true, + logTarget: "player", + content: function () { + player.discardPlayerCard( + trigger.player, + "e", + get.prompt("polang", trigger.player) + ).logSkill = "polang"; + }, + ai: { + expose: 0.3, + }, + }, + jikong: { + trigger: { player: ["loseEnd", "phaseBegin"] }, + direct: true, + usable: 1, // alter:true, - filter:function(event,player){ - if(event.name=='phase') return true; - if(get.is.altered('jikong')) return false; - if(player.countCards('h')) return false; - for(var i=0;i2&&event.card&&event.card.name=='sha'; + }, }, - content:function(){ - "step 0" + }, + xielei: { + trigger: { player: ["useCard", "respondAfter"] }, + direct: true, + filter: function (event) { + return game.countPlayer() > 2 && event.card && event.card.name == "sha"; + }, + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('xielei'), - filterCard:lib.filter.cardDiscardable, - position:'he', - filterTarget:function(card,player,target){ - if(player==target) return false; - if(trigger.name=='respond'){ - return trigger.source!=target; - } - else{ + prompt: get.prompt("xielei"), + filterCard: lib.filter.cardDiscardable, + position: "he", + filterTarget: function (card, player, target) { + if (player == target) return false; + if (trigger.name == "respond") { + return trigger.source != target; + } else { return !trigger.targets.includes(target); } }, - ai1:function(card){ - return 8-get.value(card); + ai1: function (card) { + return 8 - get.value(card); + }, + ai2: function (target) { + return get.damageEffect(target, player, player, "thunder"); }, - ai2:function(target){ - return get.damageEffect(target,player,player,'thunder'); - } }); - "step 1" - if(result.bool&&!event.isMine()){ + ("step 1"); + if (result.bool && !event.isMine()) { game.delayx(); } - "step 2" - if(result.bool){ - player.logSkill('xielei',result.targets,'thunder'); + ("step 2"); + if (result.bool) { + player.logSkill("xielei", result.targets, "thunder"); player.discard(result.cards); - result.targets[0].damage('thunder'); + result.targets[0].damage("thunder"); } }, - ai:{ - expose:0.3, - threaten:1.6 - } + ai: { + expose: 0.3, + threaten: 1.6, + }, }, - jingjie:{ - enable:'phaseUse', - init:function(player){ - player.storage.jingjie=false; + jingjie: { + enable: "phaseUse", + init: function (player) { + player.storage.jingjie = false; }, - mark:true, - intro:{ - content:'limited', + mark: true, + intro: { + content: "limited", }, - filter:function(event,player){ + filter: function (event, player) { return !player.storage.jingjie; }, - content:function(){ - 'step 0' - player.storage.jingjie=true; - player.unmarkSkill('jingjie'); - event.targets=game.filterPlayer(); - for(var i=0;i0){ - num-=players[i].countCards('he')-2; - } - else if(att<0){ - num+=players[i].countCards('he')-2; + ai: { + threaten: 1.3, + order: 1, + result: { + player: function (player) { + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var att = get.attitude(player, players[i]); + if (att > 0) { + num -= players[i].countCards("he") - 2; + } else if (att < 0) { + num += players[i].countCards("he") - 2; } } - if(player.hp==1) return num-1; - return num-players.length/2; - } - } - } - }, - ningjian:{ - group:['ningjian1','ningjian2'], - ai:{ - effect:{ - target:function(card,player,target){ - if(target.countCards('he')&&(get.tag(card,'respondShan')||get.tag(card,'respondSha'))) return 0.6 - } + if (player.hp == 1) return num - 1; + return num - players.length / 2; + }, }, - respondSha:true, - respondShan:true, - } - }, - ningjian1:{ - enable:['chooseToRespond','chooseToUse'], - filterCard:{color:'black'}, - viewAs:{name:'sha'}, - position:'he', - prompt:'将一张黑色牌当杀打出', - check:function(card){return 6-get.value(card)} - }, - ningjian2:{ - enable:['chooseToRespond','chooseToUse'], - filterCard:{color:'red'}, - viewAs:{name:'shan'}, - position:'he', - prompt:'将一张红色牌当闪使用或打出', - check:function(card){return 6-get.value(card)} - }, - duoren:{ - trigger:{target:'shaMiss'}, - filter:function(event){ - return event.player.getEquip(1)!=undefined; }, - check:function(event,player){ - return get.attitude(player,event.player)<0; + }, + ningjian: { + group: ["ningjian1", "ningjian2"], + ai: { + effect: { + target: function (card, player, target) { + if ( + target.countCards("he") && + (get.tag(card, "respondShan") || get.tag(card, "respondSha")) + ) + return 0.6; + }, + }, + respondSha: true, + respondShan: true, }, - priority:5, - content:function(){ - trigger.player.$give(trigger.player.getEquip(1),player); - player.gain(trigger.player.getEquip(1),trigger.player); + }, + ningjian1: { + enable: ["chooseToRespond", "chooseToUse"], + filterCard: { color: "black" }, + viewAs: { name: "sha" }, + position: "he", + prompt: "将一张黑色牌当杀打出", + check: function (card) { + return 6 - get.value(card); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'&&target.countCards('h')>1&&player.getEquip(1)){ - return [1,0.5,0,-0.5]; + }, + ningjian2: { + enable: ["chooseToRespond", "chooseToUse"], + filterCard: { color: "red" }, + viewAs: { name: "shan" }, + position: "he", + prompt: "将一张红色牌当闪使用或打出", + check: function (card) { + return 6 - get.value(card); + }, + }, + duoren: { + trigger: { target: "shaMiss" }, + filter: function (event) { + return event.player.getEquip(1) != undefined; + }, + check: function (event, player) { + return get.attitude(player, event.player) < 0; + }, + priority: 5, + content: function () { + trigger.player.$give(trigger.player.getEquip(1), player); + player.gain(trigger.player.getEquip(1), trigger.player); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "sha" && target.countCards("h") > 1 && player.getEquip(1)) { + return [1, 0.5, 0, -0.5]; } - } - } - } + }, + }, + }, // filter:function(event){ // return event.player.countCards('e')>0; // }, @@ -6746,188 +7174,199 @@ game.import('character', function () { // } // }, }, - taixu:{ - enable:'phaseUse', - filter:function(event,player){ - return (!player.storage.taixu)&&player.countCards('hej'); + taixu: { + enable: "phaseUse", + filter: function (event, player) { + return !player.storage.taixu && player.countCards("hej"); }, - filterTarget:function(card,player,target){ - return player!=target&&target.hp>1; + filterTarget: function (card, player, target) { + return player != target && target.hp > 1; }, - content:function(){ - player.discard(player.getCards('hej')); - player.storage.taixu=true; - target.damage(player.maxHp-player.hp); + content: function () { + player.discard(player.getCards("hej")); + player.storage.taixu = true; + target.damage(player.maxHp - player.hp); }, - ai:{ - basic:{ - order:1, + ai: { + basic: { + order: 1, }, - result:{ - target:function(player,target){ - if(player.maxHp-player.hp<2) return 0; + result: { + target: function (player, target) { + if (player.maxHp - player.hp < 2) return 0; return -2; }, - player:function(player,target){ - return -0.5*player.countCards('he'); - } - } - } + player: function (player, target) { + return -0.5 * player.countCards("he"); + }, + }, + }, }, - pozhen:{ - trigger:{player:'damageEnd'}, - filter:function(event,player){ - if(!event.source) return false; - if(get.is.altered('pozhen')){ - return event.source.countCards('h')>player.countCards('h'); + pozhen: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + if (!event.source) return false; + if (get.is.altered("pozhen")) { + return event.source.countCards("h") > player.countCards("h"); } - return event.source.countCards('h')!=player.countCards('h'); + return event.source.countCards("h") != player.countCards("h"); }, // alter:true, // check:function(event,player){ // return get.attitude(player,event.source)<0; // }, - direct:true, - content:function(){ - "step 0" - var num=player.countCards('h')-trigger.source.countCards('h'); - event.num=num; - if(num>0){ - var next=player.chooseToDiscard(num,get.prompt('pozhen',trigger.source),'弃置'+num+'张手牌,并对'+get.translation(trigger.source)+'造成1点伤害'); - next.logSkill=['pozhen',trigger.source]; - next.ai=function(card){ - if(get.damageEffect(trigger.source,player,player)>0&&num<=2){ - return 6-get.value(card); + direct: true, + content: function () { + "step 0"; + var num = player.countCards("h") - trigger.source.countCards("h"); + event.num = num; + if (num > 0) { + var next = player.chooseToDiscard( + num, + get.prompt("pozhen", trigger.source), + "弃置" + num + "张手牌,并对" + get.translation(trigger.source) + "造成1点伤害" + ); + next.logSkill = ["pozhen", trigger.source]; + next.ai = function (card) { + if (get.damageEffect(trigger.source, player, player) > 0 && num <= 2) { + return 6 - get.value(card); } return -1; - } - } - else if(num<0){ - player.chooseBool(get.prompt('pozhen',trigger.source),'弃置'+get.translation(trigger.source)+(-num)+'张手牌').ai=function(){ - return get.attitude(player,trigger.source)<0; - } - } - else{ + }; + } else if (num < 0) { + player.chooseBool( + get.prompt("pozhen", trigger.source), + "弃置" + get.translation(trigger.source) + -num + "张手牌" + ).ai = function () { + return get.attitude(player, trigger.source) < 0; + }; + } else { event.finish(); } - "step 1" - if(result.bool){ - if(event.num>0){ + ("step 1"); + if (result.bool) { + if (event.num > 0) { trigger.source.damage(); - } - else{ - player.logSkill('pozhen',trigger.source); - var cards=trigger.source.getCards('h'); + } else { + player.logSkill("pozhen", trigger.source); + var cards = trigger.source.getCards("h"); cards.sort(lib.sort.random); - trigger.source.discard(cards.slice(0,-event.num)); + trigger.source.discard(cards.slice(0, -event.num)); } } }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - var num=player.countCards('h')-target.countCards('h'); - if(num>0){ - return [1,0,0,-num/2]; + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + var num = player.countCards("h") - target.countCards("h"); + if (num > 0) { + return [1, 0, 0, -num / 2]; } - if(num<0&&!get.is.altered('pozhen')){ - return [1,0,0,-0.5]; + if (num < 0 && !get.is.altered("pozhen")) { + return [1, 0, 0, -0.5]; } } - } - } - } - }, - tanlin_defence:{ - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return player.countCards('h')&&event.source&&event.source.countCards('h'); + }, + }, }, - direct:true, - content:function(){ - "step 0" - player.chooseToDiscard([1,trigger.source.countCards('h')],'弃置任意张手牌并令伤害来源弃置等量手牌').ai=function(card){ - if(ui.selected.cards.length>=trigger.source.countCards('h')) return -1; - if(ui.selected.cards.length==0) return 8-get.value(card); - return 4-get.value(card); - } - "step 1" - if(result.bool){ - player.logSkill('tanlin'); - trigger.source.randomDiscard('h',result.cards.length); - } - else{ + }, + tanlin_defence: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return player.countCards("h") && event.source && event.source.countCards("h"); + }, + direct: true, + content: function () { + "step 0"; + player.chooseToDiscard( + [1, trigger.source.countCards("h")], + "弃置任意张手牌并令伤害来源弃置等量手牌" + ).ai = function (card) { + if (ui.selected.cards.length >= trigger.source.countCards("h")) return -1; + if (ui.selected.cards.length == 0) return 8 - get.value(card); + return 4 - get.value(card); + }; + ("step 1"); + if (result.bool) { + player.logSkill("tanlin"); + trigger.source.randomDiscard("h", result.cards.length); + } else { event.finish(); } - "step 2" + ("step 2"); player.draw(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')&&target.countCards('h')&&target.hp>1&&player!=target) return [1,0.2,0,-0.2]; - } - } - } + ai: { + effect: { + target: function (card, player, target) { + if ( + get.tag(card, "damage") && + target.countCards("h") && + target.hp > 1 && + player != target + ) + return [1, 0.2, 0, -0.2]; + }, + }, + }, }, - tanlin:{ - enable:'phaseUse', - usable:1, - group:'tanlin4', + tanlin: { + enable: "phaseUse", + usable: 1, + group: "tanlin4", // alter:true, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h'); + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - "step 0" - player.chooseToCompare(target).set('preserve','win'); - "step 1" - if(result.bool){ - if(target.hasSkill('tanlin2')==false){ - target.addSkill('tanlin2'); - player.addSkill('tanlin3'); - if(get.is.altered('tanlin')){ + content: function () { + "step 0"; + player.chooseToCompare(target).set("preserve", "win"); + ("step 1"); + if (result.bool) { + if (target.hasSkill("tanlin2") == false) { + target.addSkill("tanlin2"); + player.addSkill("tanlin3"); + if (get.is.altered("tanlin")) { player.gain([result.target]); player.$gain2([result.target]); - } - else{ - player.gain([result.player,result.target]); - player.$gain2([result.player,result.target]); + } else { + player.gain([result.player, result.target]); + player.$gain2([result.player, result.target]); } } - } - else{ + } else { player.damage(target); } }, - ai:{ - result:{ - target:function(player,target){ - var cards=player.getCards('h'); - var num=target.countCards('h'); - if(num>cards.length+3&&player.hp>1) return -2; - if(num>cards.length+1&&player.hp>1) return -1; - if(num==cards.length-1&&player.hp>1&&!get.is.altered('pozhen')) return -1; - for(var i=0;i9) return num==1?-1:-0.5; + ai: { + result: { + target: function (player, target) { + var cards = player.getCards("h"); + var num = target.countCards("h"); + if (num > cards.length + 3 && player.hp > 1) return -2; + if (num > cards.length + 1 && player.hp > 1) return -1; + if (num == cards.length - 1 && player.hp > 1 && !get.is.altered("pozhen")) + return -1; + for (var i = 0; i < cards.length; i++) { + if (cards[i].number > 9) return num == 1 ? -1 : -0.5; } return 0; - } + }, }, - order:9, - } + order: 9, + }, }, - tanlin2:{ - trigger:{global:'phaseAfter'}, - forced:true, - content:function(){ - player.removeSkill('tanlin2'); + tanlin2: { + trigger: { global: "phaseAfter" }, + forced: true, + content: function () { + player.removeSkill("tanlin2"); }, // mod:{ // cardEnabled:function(){ @@ -6944,231 +7383,283 @@ game.import('character', function () { // } // }, }, - tanlin3:{ - trigger:{global:'phaseAfter'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('tanlin3'); + tanlin3: { + trigger: { global: "phaseAfter" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("tanlin3"); }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; - } - }, - }, - tanlin4:{ - mod:{ - targetInRange:function(card,player,target,now){ - if(target.hasSkill('tanlin2')) return true; + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, }, - yunchou_old:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h'); + tanlin4: { + mod: { + targetInRange: function (card, player, target, now) { + if (target.hasSkill("tanlin2")) return true; + }, }, - filterCard:true, - selectCard:[1,Infinity], - content:function(){ - "step 0" - var card=target.getCards('h').randomGet(); - if(!card){ + }, + yunchou_old: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); + }, + filterCard: true, + selectCard: [1, Infinity], + content: function () { + "step 0"; + var card = target.getCards("h").randomGet(); + if (!card) { event.finish(); return; } target.discard(card); - var color=get.color(card); - var suit=get.suit(card); - var num1=0,num2=0; - for(var i=0;i0; + mark: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('swdtianshu')).ai=function(card){ - if(get.position(card)=='h') return 5-get.useful(card); - return 4-get.value(card); - }.logSkill='swdtianshu'; - 'step 1' - if(result.bool){ - var list=[]; - for(var i in lib.character){ - if(lib.character[i][4]&&(lib.character[i][4].includes('boss')||lib.character[i][4].includes('hiddenboss'))) continue; - if(i==player.name||i==player.name1||i==player.name2) continue; - for(var j=0;j0; + swdtianshu2: { + enable: "phaseUse", + filter: function (event, player) { + return ( + !player.hasSkill("swdtianshu3") && + player.storage.swdtianshu && + player.storage.swdtianshu.length > 0 + ); }, - intro:{ - nocount:true + intro: { + nocount: true, }, - delay:0, - content:function(){ - 'step 0' - var list=player.storage.swdtianshu; - if(player.additionalSkills.swdtianshu){ + delay: 0, + content: function () { + "step 0"; + var list = player.storage.swdtianshu; + if (player.additionalSkills.swdtianshu) { player.removeSkill(player.additionalSkills.swdtianshu); } - event.skillai=function(list){ - return get.max(list,get.skillRank,'item'); + event.skillai = function (list) { + return get.max(list, get.skillRank, "item"); }; - if(event.isMine()){ - var dialog=ui.create.dialog('forcebutton'); - dialog.add('选择获得一项技能'); - _status.event.list=list; - var clickItem=function(){ - _status.event._result=this.link; + if (event.isMine()) { + var dialog = ui.create.dialog("forcebutton"); + dialog.add("选择获得一项技能"); + _status.event.list = list; + var clickItem = function () { + _status.event._result = this.link; game.resume(); }; - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); - event.dialog=dialog; - event.switchToAuto=function(){ - event._result=event.skillai(list); + dialog.add(ui.create.div(".placeholder")); + event.dialog = dialog; + event.switchToAuto = function () { + event._result = event.skillai(list); game.resume(); }; game.pause(); - _status.imchoosing=true; + _status.imchoosing = true; + } else { + event._result = event.skillai(list); } - else{ - event._result=event.skillai(list); - } - "step 1" - _status.imchoosing=false; - if(event.dialog){ + ("step 1"); + _status.imchoosing = false; + if (event.dialog) { event.dialog.close(); } - var link=result; + var link = result; player.addSkill(link); player.skills.remove(link); - player.additionalSkills.swdtianshu=link; + player.additionalSkills.swdtianshu = link; player.popup(link); - var target=player.storage.swdtianshu2[player.storage.swdtianshu.indexOf(link)]; - player.markSkillCharacter('swdtianshu2',target,get.translation(link),lib.translate[link+'_info']); + var target = player.storage.swdtianshu2[player.storage.swdtianshu.indexOf(link)]; + player.markSkillCharacter( + "swdtianshu2", + target, + get.translation(link), + lib.translate[link + "_info"] + ); player.checkMarks(); - player.addSkill('swdtianshu3'); + player.addSkill("swdtianshu3"); }, - ai:{ - order:10, - result:{ - player:function(player){ + ai: { + order: 10, + result: { + player: function (player) { return 1; - } - } - } + }, + }, + }, }, - swdtianshu3:{ - trigger:{global:['useCardAfter','useSkillAfter','phaseAfter']}, - silent:true, - filter:function(event){ - return event.skill!='swdtianshu2'; + swdtianshu3: { + trigger: { global: ["useCardAfter", "useSkillAfter", "phaseAfter"] }, + silent: true, + filter: function (event) { + return event.skill != "swdtianshu2"; + }, + content: function () { + player.removeSkill("swdtianshu3"); }, - content:function(){ - player.removeSkill('swdtianshu3'); - } }, - swdtianshu:{ - unique:true, - enable:'phaseUse', - filterCard:function(card){ - return get.type(card,'trick')=='trick'; + swdtianshu: { + unique: true, + enable: "phaseUse", + filterCard: function (card) { + return get.type(card, "trick") == "trick"; }, - filter:function(event,player){ - return player.countCards('h',{type:['trick','delay']})>0; + filter: function (event, player) { + return player.countCards("h", { type: ["trick", "delay"] }) > 0; }, - filterTarget:function(card,player,target){ - var names=[]; - if(target.name&&!target.isUnseen(0)) names.add(target.name); - if(target.name1&&!target.isUnseen(0)) names.add(target.name1); - if(target.name2&&!target.isUnseen(1)) names.add(target.name2); - var pss=player.getSkills(); - for(var i=0;i
    【'+ - translation+'】
    '+lib.translate[list[i]+'_info']+'
    '); - item.firstChild.addEventListener('click',clickItem); - item.firstChild.link=list[i]; + var item = dialog.add( + '" + ); + item.firstChild.addEventListener("click", clickItem); + item.firstChild.link = list[i]; } } - dialog.add(ui.create.div('.placeholder')); + dialog.add(ui.create.div(".placeholder")); return dialog; }, - check:function(card){ - return 5-get.value(card); + check: function (card) { + return 5 - get.value(card); }, - content:function(){ - "step 0" + content: function () { + "step 0"; // target.gain(cards,player); - event.skillai=function(list){ - return get.max(list,get.skillRank,'item'); + event.skillai = function (list) { + return get.max(list, get.skillRank, "item"); }; - if(event.isMine()){ - event.dialog=lib.skill.swdtianshu.createDialog(player,target); - event.switchToAuto=function(){ - event._result=event.skillai(event.list); + if (event.isMine()) { + event.dialog = lib.skill.swdtianshu.createDialog(player, target); + event.switchToAuto = function () { + event._result = event.skillai(event.list); game.resume(); }; - _status.imchoosing=true; + _status.imchoosing = true; game.pause(); + } else { + event._result = event.skillai( + lib.skill.swdtianshu.createDialog(player, target, true) + ); } - else{ - event._result=event.skillai(lib.skill.swdtianshu.createDialog(player,target,true)); - } - "step 1" - _status.imchoosing=false; - if(event.dialog){ + ("step 1"); + _status.imchoosing = false; + if (event.dialog) { event.dialog.close(); } - var link=result; - player.addAdditionalSkill('swdtianshu',link); + var link = result; + player.addAdditionalSkill("swdtianshu", link); player.popup(link); - player.markSkillCharacter('swdtianshu',target,get.translation(link),lib.translate[link+'_info']); - player.storage.swdtianshu=target; + player.markSkillCharacter( + "swdtianshu", + target, + get.translation(link), + lib.translate[link + "_info"] + ); + player.storage.swdtianshu = target; player.checkMarks(); - game.log(player,'获得了技能','【'+get.translation(link)+'】'); + game.log(player, "获得了技能", "【" + get.translation(link) + "】"); }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(player.countCards('h')>player.hp) return 1; + ai: { + order: 1, + result: { + player: function (player, target) { + if (player.countCards("h") > player.hp) return 1; return 0; - } - } - } - }, - swdtianshu_remove:{ - trigger:{global:'dieAfter'}, - silent:true, - filter:function(event,player){ - return event.player==player.storage.swdtianshu; + }, + }, }, - content:function(){ - player.unmarkSkill('swdtianshu'); - player.removeAdditionalSkill('swdtianshu'); - delete player.storage.swdtianshu; - } }, - swdtianshu2_old:{ - trigger:{player:'phaseBegin'}, - direct:true, - priority:-9, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('swdtianshu'),lib.skill.swdtianshu.filterTarget).ai=function(target){ - if(target.maxHp<5) return Math.random()*(5-target.maxHp); - return -1; - }; - "step 1" - if(result.bool){ - player.logSkill('swdtianshu',result.targets); - event.target=result.targets[0]; - if(event.isMine()){ + swdtianshu_remove: { + trigger: { global: "dieAfter" }, + silent: true, + filter: function (event, player) { + return event.player == player.storage.swdtianshu; + }, + content: function () { + player.unmarkSkill("swdtianshu"); + player.removeAdditionalSkill("swdtianshu"); + delete player.storage.swdtianshu; + }, + }, + swdtianshu2_old: { + trigger: { player: "phaseBegin" }, + direct: true, + priority: -9, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("swdtianshu"), lib.skill.swdtianshu.filterTarget).ai = + function (target) { + if (target.maxHp < 5) return Math.random() * (5 - target.maxHp); + return -1; + }; + ("step 1"); + if (result.bool) { + player.logSkill("swdtianshu", result.targets); + event.target = result.targets[0]; + if (event.isMine()) { ui.auto.hide(); - event.dialog=lib.skill.swdtianshu.createDialog(player,result.targets[0]); + event.dialog = lib.skill.swdtianshu.createDialog(player, result.targets[0]); game.pause(); - } - else{ - var target=result.targets[0]; - var names=[]; - var list=[]; - if(target.name&&!target.isUnseen(0)) names.add(target.name); - if(target.name1&&!target.isUnseen(0)) names.add(target.name1); - if(target.name2&&!target.isUnseen(1)) names.add(target.name2); - var pss=player.getSkills(); - for(var i=0;i0; + xingdian: { + enable: "phaseUse", + usable: 1, + filterCard: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, // filterTarget:function(card,player,target){ // return player!=target&&target.countCards('h')>0; // }, - check:function(card){ - return 7-get.value(card); + check: function (card) { + return 7 - get.value(card); }, // selectTarget:[1,2], - content:function(){ - 'step 0' - event.list=game.filterPlayer(function(current){ - return current.isEnemyOf(player)&¤t.countCards('he'); - }).randomGets(2).sortBySeat(); - 'step 1' - if(event.list.length){ - var target=event.list.shift(); - player.line(target,'green'); - if(event.list.length){ - target.randomDiscard('he',false); - } - else{ - target.randomDiscard('he'); + content: function () { + "step 0"; + event.list = game + .filterPlayer(function (current) { + return current.isEnemyOf(player) && current.countCards("he"); + }) + .randomGets(2) + .sortBySeat(); + ("step 1"); + if (event.list.length) { + var target = event.list.shift(); + player.line(target, "green"); + if (event.list.length) { + target.randomDiscard("he", false); + } else { + target.randomDiscard("he"); } event.redo(); } }, - ai:{ - order:9, - result:{ - player:function(player){ - if(game.countPlayer(function(current){ - return current.isEnemyOf(player)&¤t.countCards('he'); - })>=2){ + ai: { + order: 9, + result: { + player: function (player) { + if ( + game.countPlayer(function (current) { + return current.isEnemyOf(player) && current.countCards("he"); + }) >= 2 + ) { return 1; } return 0; - } + }, // target:function(player,target){ // if(target.countCards('h')==1) return -1.5; // return -1; // } }, - } - }, - yulin:{ - trigger:{player:'damageBefore'}, - priority:-10, - filter:function(event,player){ - return player.countCards('he',{type:'equip'}); }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he','是否弃置一张装备牌抵消伤害?',function(card,player){ - return get.type(card)=='equip'; - }); - next.logSkill='yulin'; - next.ai=function(card){ - if(player.hp==1||trigger.num>1){ - return 9-get.value(card); + }, + yulin: { + trigger: { player: "damageBefore" }, + priority: -10, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + "是否弃置一张装备牌抵消伤害?", + function (card, player) { + return get.type(card) == "equip"; } - if(player.hp==2){ - return 8-get.value(card); + ); + next.logSkill = "yulin"; + next.ai = function (card) { + if (player.hp == 1 || trigger.num > 1) { + return 9 - get.value(card); } - return 7-get.value(card); + if (player.hp == 2) { + return 8 - get.value(card); + } + return 7 - get.value(card); }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { game.delay(); trigger.cancel(); } - } + }, }, - funiao:{ - enable:'phaseUse', - usable:1, - prepare:'give2', - filterTarget:function(card,player,target){ - if(player==target) return false; + funiao: { + enable: "phaseUse", + usable: 1, + prepare: "give2", + filterTarget: function (card, player, target) { + if (player == target) return false; return true; }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - check:function(card){ - if(card.name=='du') return 20; - return 7-get.value(card); + filterCard: true, + check: function (card) { + if (card.name == "du") return 20; + return 7 - get.value(card); }, - discard:false, - content:function(){ - 'step 0' - target.gain(cards,player).delay=false; + discard: false, + content: function () { + "step 0"; + target.gain(cards, player).delay = false; player.draw(); - 'step 1' - if(target.countCards('h')){ + ("step 1"); + if (target.countCards("h")) { player.viewHandcards(target); } }, - ai:{ - result:{ - target:function(player,target){ - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ + ai: { + result: { + target: function (player, target) { + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { return -1; } return 1; }, }, - order:2 - } + order: 2, + }, }, - funiao_old:{ - enable:'phaseUse', - discard:false, - prepare:'give2', - filterTarget:function(card,player,target){ - if(player==target) return false; - if(player.countCards('h')==0) return false; - if(target.storage.funiao) return false; + funiao_old: { + enable: "phaseUse", + discard: false, + prepare: "give2", + filterTarget: function (card, player, target) { + if (player == target) return false; + if (player.countCards("h") == 0) return false; + if (target.storage.funiao) return false; return true; }, - filterCard:true, - check:function(card){ - if(card.name=='du') return 20; - if(get.owner(card).countCards('h')0; + filterTarget: function (card, player, target) { + return get.distance(player, target) <= 1 || player == target; }, - selectTarget:-1, - content:function(){ - target.damage('fire'); + filter: function (event, player) { + return player.countCards("h", { color: "red" }) > 0; }, - line:'fire', - ai:{ - order:1, - result:{ - target:function(player,target){ - var eff=get.damageEffect(target,player,target,'fire'); - if(player==target&&player.hp<=1&&eff<0){ - eff*10; + selectTarget: -1, + content: function () { + target.damage("fire"); + }, + line: "fire", + ai: { + order: 1, + result: { + target: function (player, target) { + var eff = get.damageEffect(target, player, target, "fire"); + if (player == target && player.hp <= 1 && eff < 0) { + eff * 10; } return eff; - } - } - } + }, + }, + }, }, - xuehuang:{ - enable:'phaseUse', - init:function(player){ - player.storage.xuehuang=false; + xuehuang: { + enable: "phaseUse", + init: function (player) { + player.storage.xuehuang = false; }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - mark:true, - unique:true, - skillAnimation:true, - animationColor:'fire', - line:'fire', - filter:function(event,player){ - return !player.storage.xuehuang&& - player.countCards('h',{color:'red'})>0&& - player.countCards('h',{color:'black'})==0; + mark: true, + unique: true, + skillAnimation: true, + animationColor: "fire", + line: "fire", + filter: function (event, player) { + return ( + !player.storage.xuehuang && + player.countCards("h", { color: "red" }) > 0 && + player.countCards("h", { color: "black" }) == 0 + ); }, - content:function(){ - 'step 0' - player.storage.xuehuang=true; - player.awakenSkill('xuehuang'); + content: function () { + "step 0"; + player.storage.xuehuang = true; + player.awakenSkill("xuehuang"); player.showHandcards(); - var cards=player.getCards('h'); + var cards = player.getCards("h"); player.discard(cards); - event.num=cards.length; - 'step 1' - if(event.num){ - var targets=player.getEnemies().randomGets(2); - if(!targets.length){ + event.num = cards.length; + ("step 1"); + if (event.num) { + var targets = player.getEnemies().randomGets(2); + if (!targets.length) { event.finish(); return; } - player.useCard({name:'sha',nature:'fire'},targets); + player.useCard({ name: "sha", nature: "fire" }, targets); event.num--; event.redo(); } }, - ai:{ - order:9, - result:{ - player:function(player){ - if(player.countCards('h',{color:'red'})<2) return 0; - if(player.hasCard(function(card){ - return get.color(card)=='red'&&get.value(card)>8; - })){ + ai: { + order: 9, + result: { + player: function (player) { + if (player.countCards("h", { color: "red" }) < 2) return 0; + if ( + player.hasCard(function (card) { + return get.color(card) == "red" && get.value(card) > 8; + }) + ) { return 0; } return 1; - } - } - } + }, + }, + }, }, - zhuyu:{ - trigger:{global:'damageBegin'}, - filter:function(event,player){ - if(!event.player.isLinked()) return false; - if(!event.notLink()) return false; - if(player.countCards('he',{color:'red'})) return true; + zhuyu: { + trigger: { global: "damageBegin" }, + filter: function (event, player) { + if (!event.player.isLinked()) return false; + if (!event.notLink()) return false; + if (player.countCards("he", { color: "red" })) return true; return false; }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('朱羽:是否弃置一张红色牌使'+get.translation(trigger.player)+'受到的伤害+1?','he',function(card){ - return get.color(card)=='red'; - }); - next.logSkill=['zhuyu',trigger.player,'fire']; - var num=game.countPlayer(function(current){ - if(current.isLinked()){ - if(trigger.hasNature()){ - return get.sgn(get.damageEffect(current,player,player,'fire')); - } - else{ - if(current==trigger.player){ - return get.sgn(get.damageEffect(current,player,player,'fire')); - } - else{ - return 2*get.sgn(get.damageEffect(current,player,player,'fire')); + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "朱羽:是否弃置一张红色牌使" + get.translation(trigger.player) + "受到的伤害+1?", + "he", + function (card) { + return get.color(card) == "red"; + } + ); + next.logSkill = ["zhuyu", trigger.player, "fire"]; + var num = game.countPlayer(function (current) { + if (current.isLinked()) { + if (trigger.hasNature()) { + return get.sgn(get.damageEffect(current, player, player, "fire")); + } else { + if (current == trigger.player) { + return get.sgn(get.damageEffect(current, player, player, "fire")); + } else { + return 2 * get.sgn(get.damageEffect(current, player, player, "fire")); } } } }); - next.ai=function(card){ - if(trigger.player.hasSkillTag('nofire')) return 0; - if(num>0){ - return 9-get.value(card); + next.ai = function (card) { + if (trigger.player.hasSkillTag("nofire")) return 0; + if (num > 0) { + return 9 - get.value(card); } return 0; }; - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { trigger.num++; - game.setNature(trigger,'fire'); + game.setNature(trigger, "fire"); } - } + }, }, - ningshuang:{ - trigger:{target:'useCardToBegin'}, - filter:function(event,player){ - if(get.color(event.card)!='black') return false; - if(!event.player) return false; - if(event.player==player) return false; - if(event.player.isLinked()&&event.player.isTurnedOver()) return false; - if(player.countCards('he',{color:'black'})) return true; + ningshuang: { + trigger: { target: "useCardToBegin" }, + filter: function (event, player) { + if (get.color(event.card) != "black") return false; + if (!event.player) return false; + if (event.player == player) return false; + if (event.player.isLinked() && event.player.isTurnedOver()) return false; + if (player.countCards("he", { color: "black" })) return true; return false; }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('凝霜:是否弃置一张黑色牌使'+get.translation(trigger.player)+'横置或翻面?','he',function(card){ - return get.color(card)=='black'; - }); - next.logSkill=['ningshuang',trigger.player]; - next.ai=function(card){ - if(trigger.player.hasSkillTag('noturn')&&trigger.player.isLinked()) return 0; - if(get.attitude(player,trigger.player)<0){ - return 9-get.value(card); + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "凝霜:是否弃置一张黑色牌使" + get.translation(trigger.player) + "横置或翻面?", + "he", + function (card) { + return get.color(card) == "black"; + } + ); + next.logSkill = ["ningshuang", trigger.player]; + next.ai = function (card) { + if (trigger.player.hasSkillTag("noturn") && trigger.player.isLinked()) return 0; + if (get.attitude(player, trigger.player) < 0) { + return 9 - get.value(card); } return 0; }; - "step 1" - if(result.bool){ - if(trigger.player.isTurnedOver()){ + ("step 1"); + if (result.bool) { + if (trigger.player.isTurnedOver()) { trigger.player.loseHp(); } - if(trigger.player.isLinked()){ + if (trigger.player.isLinked()) { trigger.player.turnOver(); - } - else{ + } else { trigger.player.link(); player.draw(); } } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.color(card)=='black'&&get.attitude(target,player)<0&&target.countCards('h')>0){ - return [1,0.1,0,-target.countCards('h')/4]; + ai: { + effect: { + target: function (card, player, target) { + if ( + get.color(card) == "black" && + get.attitude(target, player) < 0 && + target.countCards("h") > 0 + ) { + return [1, 0.1, 0, -target.countCards("h") / 4]; } - } - } - } + }, + }, + }, }, - zaowu_old:{ - enable:'phaseUse', - usable:1, - position:'he', - filterCard:function(card,player,target){ - if(ui.selected.cards.length==0) return true; - for(var i=0;i=10) continue; - if(i!='list') list.push([suit,number,i]); + content: function () { + "step 0"; + var list = []; + var suit = ["heart", "diamond", "club", "spade"].randomGet(); + var number = Math.floor(Math.random() * 13) + 1; + for (var i in lib.card) { + if (lib.card[i].mode && lib.card[i].mode.includes(lib.config.mode) == false) continue; + if (get.value({ name: i }) >= 10) continue; + if (i != "list") list.push([suit, number, i]); } - var dialog=ui.create.dialog([list,'vcard']); - player.chooseButton(dialog,2,true,function(button){ - return get.value({name:button.link[2]},player); + var dialog = ui.create.dialog([list, "vcard"]); + player.chooseButton(dialog, 2, true, function (button) { + return get.value({ name: button.link[2] }, player); }); - "step 1" - var cards=[ui.create.card(),ui.create.card()]; + ("step 1"); + var cards = [ui.create.card(), ui.create.card()]; cards[0].init(result.buttons[0].link); cards[1].init(result.buttons[1].link); player.gain(cards); player.$gain(cards); game.delay(); }, - ai:{ - order:8, - result:{ - player:1 + ai: { + order: 8, + result: { + player: 1, }, - threaten:1.6 - } + threaten: 1.6, + }, }, - xielv:{ - trigger:{player:'phaseDiscardEnd'}, - filter:function(event,player){ - var cards=player.getCards('h'); - if(cards.length<2) return false; - var color=get.color(cards[0]); - for(var i=1;i0; + check: function (event, player) { + if (player.isDamaged()) return true; + return ( + game.countPlayer(function (current) { + if (current.countCards("j")) return get.sgn(get.attitude(player, current)); + }) > 0 + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - 'step 1' + ("step 1"); player.recover(); - event.targets=game.filterPlayer(function(current){ - return current.countCards('j'); + event.targets = game.filterPlayer(function (current) { + return current.countCards("j"); }); event.targets.sortBySeat(); - 'step 2' - if(event.targets.length){ - var current=event.targets.shift(); - var js=current.getCards('j'); - if(js.length){ + ("step 2"); + if (event.targets.length) { + var current = event.targets.shift(); + var js = current.getCards("j"); + if (js.length) { current.discard(js); - player.line(current,'green'); + player.line(current, "green"); } event.redo(); } }, - ai:{ - expose:0.1, - } + ai: { + expose: 0.1, + }, }, - xiaomoyu:{ - trigger:{source:'damageEnd'}, - priority:1, - forced:true, - filter:function(event,player){ - return !player.hasSkill('xiaomoyu2'); + xiaomoyu: { + trigger: { source: "damageEnd" }, + priority: 1, + forced: true, + filter: function (event, player) { + return !player.hasSkill("xiaomoyu2"); }, - content:function(){ - "step 0" - player.addTempSkill('xiaomoyu2'); - if(player.hp0; + xiangu: { + mod: { + maxHandcard: function (player, num) { + if (player.hp < player.maxHp) return num + player.maxHp - player.hp; + }, }, - usable:1, - selectTarget:-1, - filter:function(){ - return game.hasPlayer(function(current){ - return current.countCards('j'); + }, + tianhuo: { + enable: "phaseUse", + filterTarget: function (card, player, target) { + return target.countCards("j") > 0; + }, + usable: 1, + selectTarget: -1, + filter: function () { + return game.hasPlayer(function (current) { + return current.countCards("j"); }); }, - line:'fire', - content:function(){ - "step 0" - event.num=target.countCards('j'); - target.discard(target.getCards('j')); - "step 1" - target.damage(event.num,'fire','nosource') + line: "fire", + content: function () { + "step 0"; + event.num = target.countCards("j"); + target.discard(target.getCards("j")); + ("step 1"); + target.damage(event.num, "fire", "nosource"); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var eff=get.damageEffect(target,player,target,'fire'); - if(eff>=0) return eff+1; - var judges=target.getCards('j'); - if(!judges.length) return 0; - if(target.hp==1||judges.length>1) return -judges.length; - var name=judges[0].viewAs||judges[0].name; - if(name=='shandian'||name=='huoshan'||name=='hongshui') return -judges.length; + ai: { + order: 1, + result: { + target: function (player, target) { + var eff = get.damageEffect(target, player, target, "fire"); + if (eff >= 0) return eff + 1; + var judges = target.getCards("j"); + if (!judges.length) return 0; + if (target.hp == 1 || judges.length > 1) return -judges.length; + var name = judges[0].viewAs || judges[0].name; + if (name == "shandian" || name == "huoshan" || name == "hongshui") + return -judges.length; return 0; - } - } - } - }, - huanyin:{ - trigger:{target:'useCardToBefore'}, - forced:true, - priority:5.9, - filter:function(event,player){ - return event.player!=player; + }, + }, }, - content:function(){ - "step 0" - var effect=get.effect(player,trigger.card,trigger.player,player); - player.judge(function(card){ - switch(get.suit(card)){ - case 'spade':return -effect; - case 'heart':return 1; - default:return 0; + }, + huanyin: { + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 5.9, + filter: function (event, player) { + return event.player != player; + }, + content: function () { + "step 0"; + var effect = get.effect(player, trigger.card, trigger.player, player); + player.judge(function (card) { + switch (get.suit(card)) { + case "spade": + return -effect; + case "heart": + return 1; + default: + return 0; } }); - "step 1" - switch(result.suit){ - case 'spade':{ + ("step 1"); + switch (result.suit) { + case "spade": { trigger.cancel(); break; } - case 'heart':{ + case "heart": { player.draw(); break; } } }, - ai:{ - effect:{ - target:function(card,player,target){ - return 0.7 - } + ai: { + effect: { + target: function (card, player, target) { + return 0.7; + }, }, - threaten:0.8 - } + threaten: 0.8, + }, }, - xuanzhou:{ - enable:'phaseUse', - usable:1, - discard:false, - filter:function(event,player){ - return player.countCards('he',{type:'trick'})>0; + xuanzhou: { + enable: "phaseUse", + usable: 1, + discard: false, + filter: function (event, player) { + return player.countCards("he", { type: "trick" }) > 0; }, - prepare:'throw', - position:'he', - filterCard:{type:'trick'}, - filterTarget:function(card,player,target){ - return player!=target; + prepare: "throw", + position: "he", + filterCard: { type: "trick" }, + filterTarget: function (card, player, target) { + return player != target; }, - check:function(card){ - return 7-get.value(card); + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - "step 0" - var list=[]; - for(var i in lib.card){ - if(lib.card[i].mode&&lib.card[i].mode.includes(lib.config.mode)==false) continue; - if(lib.card[i].type=='delay') list.push([cards[0].suit,cards[0].number,i]); + content: function () { + "step 0"; + var list = []; + for (var i in lib.card) { + if (lib.card[i].mode && lib.card[i].mode.includes(lib.config.mode) == false) continue; + if (lib.card[i].type == "delay") list.push([cards[0].suit, cards[0].number, i]); } - var dialog=ui.create.dialog('玄咒',[list,'vcard']); - var bing=target.countCards('h')<=1; - player.chooseButton(dialog,true,function(button){ - if(get.effect(target,{name:button.link[2]},player,player)>0){ - if(button.link[2]=='bingliang'){ - if(bing) return 2; + var dialog = ui.create.dialog("玄咒", [list, "vcard"]); + var bing = target.countCards("h") <= 1; + player.chooseButton(dialog, true, function (button) { + if (get.effect(target, { name: button.link[2] }, player, player) > 0) { + if (button.link[2] == "bingliang") { + if (bing) return 2; return 0.7; } - if(button.link[2]=='lebu'){ + if (button.link[2] == "lebu") { return 1; } - if(button.link[2]=='guiyoujie'){ + if (button.link[2] == "guiyoujie") { return 0.5; } - if(button.link[2]=='caomu'){ + if (button.link[2] == "caomu") { return 0.3; } return 0.2; } return 0; - }).filterButton=function(button){ + }).filterButton = function (button) { return !target.hasJudge(button.link[2]); }; - "step 1" - target.addJudge(result.links[0][2],cards); + ("step 1"); + target.addJudge(result.links[0][2], cards); }, - ai:{ - result:{ - player:function(player,target){ - var eff=0; - for(var i in lib.card){ - if(lib.card[i].type=='delay'){ - var current=get.effect(target,{name:i},player,player); - if(current>eff){ - eff=current; + ai: { + result: { + player: function (player, target) { + var eff = 0; + for (var i in lib.card) { + if (lib.card[i].type == "delay") { + var current = get.effect(target, { name: i }, player, player); + if (current > eff) { + eff = current; } } } return eff; - } + }, }, - order:9.5, - } + order: 9.5, + }, }, - tianlun:{ - unique:true, - trigger:{global:'judge'}, - direct:true, - filter:function(event){ - if(event.card) return true; - return game.hasPlayer(function(current){ - return current.countCards('j'); + tianlun: { + unique: true, + trigger: { global: "judge" }, + direct: true, + filter: function (event) { + if (event.card) return true; + return game.hasPlayer(function (current) { + return current.countCards("j"); }); }, - content:function(){ - "step 0" - var list=[]; - if(trigger.card) list.push(trigger.card); - var players=game.filterPlayer(); - for(var i=0;i1) return true; - var eff=get.damageEffect(event.player,player,player); - if(player.hp==player.maxHp) return eff<0; - return eff<=0; + ai: { + tag: { + rejudge: 0.6, + }, }, - content:function(){ + }, + lanzhi_old: { + trigger: { source: "damageBefore" }, + logTarget: "player", + check: function (event, player) { + if (player.hp == 1 && event.player.hp > 1) return true; + var eff = get.damageEffect(event.player, player, player); + if (player.hp == player.maxHp) return eff < 0; + return eff <= 0; + }, + content: function () { trigger.cancel(); player.recover(); }, }, - lanzhi:{ - trigger:{player:'useCard'}, - filter:function(event,player){ - if(get.suit(event.card)=='club'){ - return game.hasPlayer(function(current){ - return current.hp<=player.hp&¤t.isDamaged(); + lanzhi: { + trigger: { player: "useCard" }, + filter: function (event, player) { + if (get.suit(event.card) == "club") { + return game.hasPlayer(function (current) { + return current.hp <= player.hp && current.isDamaged(); }); } return false; }, - prompt:function(event,player){ - var list=game.filterPlayer(function(current){ - return current.hp<=player.hp&¤t.isDamaged(); + prompt: function (event, player) { + var list = game.filterPlayer(function (current) { + return current.hp <= player.hp && current.isDamaged(); }); - return get.prompt('lanzhi',list); + return get.prompt("lanzhi", list); }, - check:function(event,player){ - var list=game.filterPlayer(function(current){ - return current.hp<=player.hp&¤t.isDamaged(); + check: function (event, player) { + var list = game.filterPlayer(function (current) { + return current.hp <= player.hp && current.isDamaged(); }); - var num=0; - for(var i=0;i0){ + var num = 0; + for (var i = 0; i < list.length; i++) { + var eff = get.recoverEffect(list[i], player, player); + if (eff > 0) { num++; - } - else{ + } else { num--; } } - return num>0; + return num > 0; }, - content:function(){ - "step 0" - var list=game.filterPlayer(function(current){ - return current.hp<=player.hp&¤t.isDamaged(); + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current.hp <= player.hp && current.isDamaged(); }); - player.line(list,'green'); + player.line(list, "green"); list.sort(lib.sort.seat); - event.list=list; - "step 1" - if(event.list.length){ + event.list = list; + ("step 1"); + if (event.list.length) { event.list.shift().recover(); event.redo(); } }, - ai:{ - expose:0.3, - threaten:1.5 - } + ai: { + expose: 0.3, + threaten: 1.5, + }, }, - lanzhi2:{}, - duanyi:{ - enable:'phaseUse', - usable:1, + lanzhi2: {}, + duanyi: { + enable: "phaseUse", + usable: 1, // alter:true, - filter:function(event,player){ - return player.countCards('h','sha')>1; + filter: function (event, player) { + return player.countCards("h", "sha") > 1; }, - filterCard:{name:'sha'}, - selectCard:2, - filterTarget:function(card,player,target){ - return player!=target; + filterCard: { name: "sha" }, + selectCard: 2, + filterTarget: function (card, player, target) { + return player != target; }, - check:function(card){ - return 10-get.value(card); + check: function (card) { + return 10 - get.value(card); }, - content:function(){ - "step 0" + content: function () { + "step 0"; target.damage(); - if(get.is.altered('duanyi')){ + if (get.is.altered("duanyi")) { event.finish(); } - "step 1" - var he=target.getCards('he'); - target.discard(he.randomGets(target.maxHp-target.hp)); + ("step 1"); + var he = target.getCards("he"); + target.discard(he.randomGets(target.maxHp - target.hp)); }, - ai:{ - expose:0.3, - result:{ - target:function(player,target){ - return get.damageEffect(target,player)-(target.maxHp-target.hp)/2; - } + ai: { + expose: 0.3, + result: { + target: function (player, target) { + return get.damageEffect(target, player) - (target.maxHp - target.hp) / 2; + }, }, - order:5 - } - }, - guxing:{ - group:['guxing1','guxing3'] - }, - guxing1:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var min=Math.max(1,player.maxHp-player.hp); - return player.countCards('h')<=min&&player.countCards('h')>0&& - lib.filter.filterCard({name:'sha'},player); + order: 5, }, - filterCard:true, - selectCard:-1, + }, + guxing: { + group: ["guxing1", "guxing3"], + }, + guxing1: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var min = Math.max(1, player.maxHp - player.hp); + return ( + player.countCards("h") <= min && + player.countCards("h") > 0 && + lib.filter.filterCard({ name: "sha" }, player) + ); + }, + filterCard: true, + selectCard: -1, // viewAs:{name:'sha'}, - discard:false, - prepare:'throw', - filterTarget:function(card,player,target){ - return lib.filter.targetEnabled({name:'sha'},player,target); + discard: false, + prepare: "throw", + filterTarget: function (card, player, target) { + return lib.filter.targetEnabled({ name: "sha" }, player, target); }, - content:function(){ - "step 0" + content: function () { + "step 0"; delete player.storage.guxing; targets.sort(lib.sort.seat); - player.useCard({name:'sha'},cards,targets,'guxing').animate=false; - "step 1" - if(player.storage.guxing){ + player.useCard({ name: "sha" }, cards, targets, "guxing").animate = false; + ("step 1"); + if (player.storage.guxing) { player.draw(player.storage.guxing); delete player.storage.guxing; } }, - multitarget:true, - multiline:true, - selectTarget:[1,3], - ai:{ - order:function(){ - if(_status.event.player.countCards('h')==1) return 10; - return get.order({name:'sha'})+0.1; + multitarget: true, + multiline: true, + selectTarget: [1, 3], + ai: { + order: function () { + if (_status.event.player.countCards("h") == 1) return 10; + return get.order({ name: "sha" }) + 0.1; }, - result:{ - target:function(player,target){ - return get.effect(target,{name:'sha'},player,target); - } + result: { + target: function (player, target) { + return get.effect(target, { name: "sha" }, player, target); + }, }, - threaten:function(player,target){ - if(target.hp=player.maxHp-1) return [0,0]; - } - } - } }, - jifeng:{ - mod:{ - selectTarget:function(card,player,range){ - if(range[0]!=1||range[1]!=1) return; - var range2=get.select(get.info(card).selectTarget); - if(range2[0]!=1&&range2[1]!=1) return; - if(card.name=='sha'||get.type(card)=='trick') range[1]=Infinity; + swdxueyi: { + trigger: { player: "phaseDrawBegin" }, + frequent: true, + content: function () { + trigger.num += player.maxHp - player.hp; + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (target.hp == target.maxHp) return [0, 1]; + } + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, }, }, - trigger:{player:'useCardToBefore'}, - priority:6, - forced:true, - popup:false, - filter:function(event,player){ - if(event.targets.length<=1) return false; - if(event.card.name=='sha') return true; - else if(get.type(event.card)=='trick'){ - var range=get.select(get.info(event.card).selectTarget); - if(range[0]==1&&range[1]==1) return true; + }, + jifeng: { + mod: { + selectTarget: function (card, player, range) { + if (range[0] != 1 || range[1] != 1) return; + var range2 = get.select(get.info(card).selectTarget); + if (range2[0] != 1 && range2[1] != 1) return; + if (card.name == "sha" || get.type(card) == "trick") range[1] = Infinity; + }, + }, + trigger: { player: "useCardToBefore" }, + priority: 6, + forced: true, + popup: false, + filter: function (event, player) { + if (event.targets.length <= 1) return false; + if (event.card.name == "sha") return true; + else if (get.type(event.card) == "trick") { + var range = get.select(get.info(event.card).selectTarget); + if (range[0] == 1 && range[1] == 1) return true; } return false; }, - content:function(){ - if(Math.random()>(1.3+trigger.targets.length/5)/trigger.targets.length){ - trigger.target.popup('失误'); + content: function () { + if (Math.random() > (1.3 + trigger.targets.length / 5) / trigger.targets.length) { + trigger.target.popup("失误"); trigger.cancel(); } - } + }, }, - mohua2:{ - unique:true, - trigger:{player:'dying'}, - priority:10, - forced:true, - content:function(){ - "step 0" - player.removeSkill('miles_xueyi'); - player.removeSkill('aojian'); - player.removeSkill('mohua2'); - player.addSkill('moyan'); - player.addSkill('miedao'); - player.addSkill('jifeng'); - player.addSkill('swd_xiuluo'); + mohua2: { + unique: true, + trigger: { player: "dying" }, + priority: 10, + forced: true, + content: function () { + "step 0"; + player.removeSkill("miles_xueyi"); + player.removeSkill("aojian"); + player.removeSkill("mohua2"); + player.addSkill("moyan"); + player.addSkill("miedao"); + player.addSkill("jifeng"); + player.addSkill("swd_xiuluo"); - lib.character.swd_satan=['','qun',4,['moyan','miedao','jifeng','swd_xiuluo'],['temp']]; - if(player.name=='swd_miles') player.name='swd_satan'; - if(player.name1=='swd_miles') player.name1='swd_satan'; - if(player.name2=='swd_miles'){ - player.name2='swd_satan'; - player.node.avatar2.setBackground('swd_satan','character'); + lib.character.swd_satan = [ + "", + "qun", + 4, + ["moyan", "miedao", "jifeng", "swd_xiuluo"], + ["temp"], + ]; + if (player.name == "swd_miles") player.name = "swd_satan"; + if (player.name1 == "swd_miles") player.name1 = "swd_satan"; + if (player.name2 == "swd_miles") { + player.name2 = "swd_satan"; + player.node.avatar2.setBackground("swd_satan", "character"); + } else { + player.node.avatar.setBackground("swd_satan", "character"); } - else{ - player.node.avatar.setBackground('swd_satan','character'); - } - "step 1" + ("step 1"); player.recover(2); - "step 2" + ("step 2"); player.draw(2); }, }, - liexin:{ - trigger:{source:'damageBegin'}, - direct:true, - content:function(){ - "step 0" - player.chooseToDiscard('是否弃置一张牌使伤害+1?','he').ai=function(card){ - if(get.attitude(player,trigger.player)<0){ - return 7-get.value(card); + liexin: { + trigger: { source: "damageBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseToDiscard("是否弃置一张牌使伤害+1?", "he").ai = function (card) { + if (get.attitude(player, trigger.player) < 0) { + return 7 - get.value(card); } - } - "step 1" - if(result.bool){ - player.logSkill('liexin'); + }; + ("step 1"); + if (result.bool) { + player.logSkill("liexin"); trigger.num++; } }, - ai:{ - threaten:1.8 - } + ai: { + threaten: 1.8, + }, }, - mohua:{ - trigger:{player:'dying'}, - priority:10, - forced:true, - mode:['identity'], - content:function(){ - "step 0" - var skills=['wuying','xiehun','jumo']; - if(lib.config.mode_choice.double_character){ - skills.push('swd_xiuluo'); + mohua: { + trigger: { player: "dying" }, + priority: 10, + forced: true, + mode: ["identity"], + content: function () { + "step 0"; + var skills = ["wuying", "xiehun", "jumo"]; + if (lib.config.mode_choice.double_character) { + skills.push("swd_xiuluo"); } - lib.character.swd_satan=['','qun',6,skills,['temp']]; - if(!_status.ai.customAttitude) _status.ai.customAttitude=[]; - _status.ai.customAttitude.push(function(from,to){ - if(from.storage.xiehun){ - if(to==game.zhu) return 10; + lib.character.swd_satan = ["", "qun", 6, skills, ["temp"]]; + if (!_status.ai.customAttitude) _status.ai.customAttitude = []; + _status.ai.customAttitude.push(function (from, to) { + if (from.storage.xiehun) { + if (to == game.zhu) return 10; return -10; } - if(to.storage.xiehun){ + if (to.storage.xiehun) { return 0; } }); player.uninit(); - player.init('swd_satan'); - player.hp=game.players.length; + player.init("swd_satan"); + player.hp = game.players.length; player.update(); - game.zhu=player; - player.identity='zhu'; - player.setIdentity('魔'); - player.identityShown=true; - var players=get.players(false,true); - for(var i=0;i0){ + if (num > 0) { player.draw(num); } }, }, - duijue:{ - enable:'phaseUse', - mark:true, - unique:true, - forceunique:true, - skillAnimation:true, - filter:function(event,player){ - if(event.skill) return false; + duijue: { + enable: "phaseUse", + mark: true, + unique: true, + forceunique: true, + skillAnimation: true, + filter: function (event, player) { + if (event.skill) return false; return !player.storage.duijue; }, - filterTarget:function(card,player,target){ - if(target.hp<=1) return false; + filterTarget: function (card, player, target) { + if (target.hp <= 1) return false; // if(get.mode()=='identity'&&_status.mode=='zhong'&&game.zhu&&!game.zhu.isZhu){ // return target==game.zhong; // } // if(target.identity=='zhu'||get.is.jun(target)) return false; - return player!=target; + return player != target; }, - content:function(){ - player.storage.duijue=true; - player.awakenSkill('duijue'); - var evt=_status.event; - for(var i=0;i<10;i++){ - if(evt&&evt.getParent){ - evt=evt.getParent(); + content: function () { + player.storage.duijue = true; + player.awakenSkill("duijue"); + var evt = _status.event; + for (var i = 0; i < 10; i++) { + if (evt && evt.getParent) { + evt = evt.getParent(); } - if(evt.name=='phaseUse'){ - evt.skipped=true; + if (evt.name == "phaseUse") { + evt.skipped = true; break; } } - player.storage.duijue3=target; - player.addSkill('duijue3'); + player.storage.duijue3 = target; + player.addSkill("duijue3"); }, - duijueLoop:function(){ - 'step 0' - targets[0].phase('duijue'); - 'step 1' + duijueLoop: function () { + "step 0"; + targets[0].phase("duijue"); + ("step 1"); ui.duijueLoop.round--; - ui.duijueLoop.innerHTML=get.cnNumber(ui.duijueLoop.round)+'回合'; - if(targets[0].isDead()||targets[1].isDead()||ui.duijueLoop.round==0){ + ui.duijueLoop.innerHTML = get.cnNumber(ui.duijueLoop.round) + "回合"; + if (targets[0].isDead() || targets[1].isDead() || ui.duijueLoop.round == 0) { event.goto(3); + } else { + targets[1].phase("duijue"); } - else{ - targets[1].phase('duijue'); - } - 'step 2' + ("step 2"); ui.duijueLoop.round--; - ui.duijueLoop.innerHTML=get.cnNumber(ui.duijueLoop.round)+'回合'; - if(targets[0].isDead()||targets[1].isDead()||ui.duijueLoop.round==0){ + ui.duijueLoop.innerHTML = get.cnNumber(ui.duijueLoop.round) + "回合"; + if (targets[0].isDead() || targets[1].isDead() || ui.duijueLoop.round == 0) { event.goto(3); - } - else{ + } else { event.goto(0); } - 'step 3' - for(var i=0;i=3) return -1; - if(target.hp= 3) return -1; + if (target.hp < player.hp && target.countCards("h") <= player.countCards("h")) + return -1; return 0; - } - } - } + }, + }, + }, }, - duijue3:{ - trigger:{player:'phaseAfter'}, - forced:true, - popup:false, - priority:-50, - content:function(){ - var target=player.storage.duijue3; + duijue3: { + trigger: { player: "phaseAfter" }, + forced: true, + popup: false, + priority: -50, + content: function () { + var target = player.storage.duijue3; delete player.storage.duijue3; - player.removeSkill('duijue3'); - if(!target.isAlive()){ + player.removeSkill("duijue3"); + if (!target.isAlive()) { event.finish(); return; } - var next=player.insertEvent('duijueLoop',lib.skill.duijue.duijueLoop,{ - targets:[target,player], - num:0, - backup:[], - source:player, + var next = player.insertEvent("duijueLoop", lib.skill.duijue.duijueLoop, { + targets: [target, player], + num: 0, + backup: [], + source: player, }); - next.forceDie=true; - for(var i=0;i0&& - get.attitude(player,trigger.source)<0&& - get.damageEffect(trigger.player,trigger.source,player)< - get.damageEffect(trigger.source,trigger.player,player); - var next=player.chooseToDiscard('是否将伤害来源('+get.translation(trigger.source)+ - ')和目标('+get.translation(trigger.player)+')对调?','he'); - next.ai=function(card){ - if(go){ - return 10-get.value(card); + content: function () { + "step 0"; + var go = + get.attitude(player, trigger.player) > 0 && + get.attitude(player, trigger.source) < 0 && + get.damageEffect(trigger.player, trigger.source, player) < + get.damageEffect(trigger.source, trigger.player, player); + var next = player.chooseToDiscard( + "是否将伤害来源(" + + get.translation(trigger.source) + + ")和目标(" + + get.translation(trigger.player) + + ")对调?", + "he" + ); + next.ai = function (card) { + if (go) { + return 10 - get.value(card); } return 0; }; - next.logSkill='yinguo'; - "step 1" - if(result.bool){ - var target=trigger.player; - trigger.player=trigger.source; - trigger.source=target; - trigger.trigger('damageBefore'); - player.addTempSkill('yinguo2',['damageAfter','damageCancelled']); + next.logSkill = "yinguo"; + ("step 1"); + if (result.bool) { + var target = trigger.player; + trigger.player = trigger.source; + trigger.source = target; + trigger.trigger("damageBefore"); + player.addTempSkill("yinguo2", ["damageAfter", "damageCancelled"]); } }, - ai:{ - threaten:10, - expose:0.5, + ai: { + threaten: 10, + expose: 0.5, }, - global:'yinguo3' + global: "yinguo3", }, - yinguo2:{}, - yinguo3:{ - ai:{ - effect:{ - target:function(card,player,target){ - if(!get.tag(card,'damage')) return; - if(target.hasSkill('yinguo')) return; - var source=game.findPlayer(function(current){ - return current.hasSkill('yinguo'); + yinguo2: {}, + yinguo3: { + ai: { + effect: { + target: function (card, player, target) { + if (!get.tag(card, "damage")) return; + if (target.hasSkill("yinguo")) return; + var source = game.findPlayer(function (current) { + return current.hasSkill("yinguo"); }); - if(source&&source.countCards('he')){ - if(get.attitude(source,player)<0&&get.attitude(source,target)>0){ - return [0,0,0,-1]; + if (source && source.countCards("he")) { + if (get.attitude(source, player) < 0 && get.attitude(source, target) > 0) { + return [0, 0, 0, -1]; } } - } - } - } + }, + }, + }, }, - guiyan:{ - unique:true, - enable:'phaseUse', - usable:1, - intro:{ - content:'濒死时回复1点体力并失去鬼眼' + guiyan: { + unique: true, + enable: "phaseUse", + usable: 1, + intro: { + content: "濒死时回复1点体力并失去鬼眼", }, - mark:true, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('h'); + mark: true, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h"); }, - content:function(){ - "step 0" - player.chooseCardButton(target,target.getCards('h')).set('ai',function(button){ + content: function () { + "step 0"; + player.chooseCardButton(target, target.getCards("h")).set("ai", function (button) { return get.value(button.link); - }).filterButton=function(button){ - return get.suit(button.link)=='club'; - } - "step 1" - if(result.bool){ - player.gain(result.links[0],target); - target.$giveAuto(result.links[0],player); + }).filterButton = function (button) { + return get.suit(button.link) == "club"; + }; + ("step 1"); + if (result.bool) { + player.gain(result.links[0], target); + target.$giveAuto(result.links[0], player); } }, - ai:{ - order:11, - result:{ - target:-1, - player:1, + ai: { + order: 11, + result: { + target: -1, + player: 1, }, - threaten:1.3 + threaten: 1.3, }, - group:['guiyan2'], + group: ["guiyan2"], }, - guiyan2:{ - trigger:{player:'dying'}, - priority:6, - forced:true, - content:function(){ + guiyan2: { + trigger: { player: "dying" }, + priority: 6, + forced: true, + content: function () { player.recover(); - player.removeSkill('guiyan'); - player.removeSkill('guiyan2'); - } + player.removeSkill("guiyan"); + player.removeSkill("guiyan2"); + }, }, - yunshen_old:{ - mod:{ - globalFrom:function(from,to,distance){ - if(!from.getEquip(1)) return distance-1; + yunshen_old: { + mod: { + globalFrom: function (from, to, distance) { + if (!from.getEquip(1)) return distance - 1; }, - globalTo:function(from,to,distance){ - if(!to.getEquip(2)) return distance+1; - } - } + globalTo: function (from, to, distance) { + if (!to.getEquip(2)) return distance + 1; + }, + }, }, - suiyan_old:{ - enable:'phaseUse', - usable:1, - filterCard:function(card){ - return get.type(card)=='basic'; + suiyan_old: { + enable: "phaseUse", + usable: 1, + filterCard: function (card) { + return get.type(card) == "basic"; }, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('e'); + filterTarget: function (card, player, target) { + return player != target && target.countCards("e"); }, - content:function(){ - var num=Math.floor(Math.random()*3); - if(num==0){ + content: function () { + var num = Math.floor(Math.random() * 3); + if (num == 0) { player.draw(); - } - else{ - target.discard(target.getCards('e').sort(lib.sort.random).splice(0,num)); + } else { + target.discard(target.getCards("e").sort(lib.sort.random).splice(0, num)); } }, - ai:{ - order:7, - result:{ - target:-1, + ai: { + order: 7, + result: { + target: -1, }, - threaten:1.2 - } + threaten: 1.2, + }, }, - xianyin:{ - enable:'phaseUse', - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('j')&¤t!=player; + xianyin: { + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("j") && current != player; }); }, - content:function(){ - "step 0" - event.targets=game.filterPlayer(function(current){ - return current.countCards('j')&¤t!=player; + content: function () { + "step 0"; + event.targets = game.filterPlayer(function (current) { + return current.countCards("j") && current != player; }); event.targets.sort(lib.sort.seat); - "step 1" - if(event.targets.length){ - event.target=event.targets.shift(); - event.target.discard(event.target.getCards('j')); - player.line(event.target,'green'); - } - else{ + ("step 1"); + if (event.targets.length) { + event.target = event.targets.shift(); + event.target.discard(event.target.getCards("j")); + player.line(event.target, "green"); + } else { event.finish(); } - "step 2" - if(event.target.countCards('h')){ - event.target.chooseCard('选择一张手牌交给'+get.translation(player),true).ai=function(card){ - return -get.value(card); - } - } - else{ + ("step 2"); + if (event.target.countCards("h")) { + event.target.chooseCard("选择一张手牌交给" + get.translation(player), true).ai = + function (card) { + return -get.value(card); + }; + } else { event.goto(1); } - "step 3" - if(result.bool){ - player.gain(result.cards[0],target); - target.$give(1,player); + ("step 3"); + if (result.bool) { + player.gain(result.cards[0], target); + target.$give(1, player); } event.goto(1); }, - ai:{ - order:9, - result:{ - player:function(player){ - var num=0,players=game.filterPlayer(); - for(var i=0;i=0&& - get.attitude(players[i],player)>=0){ + ai: { + order: 9, + result: { + player: function (player) { + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && players[i].countCards("j")) { + if ( + get.attitude(player, players[i]) >= 0 && + get.attitude(players[i], player) >= 0 + ) { num++; - } - else{ + } else { num--; } } } return num; - } - } - } - }, - mailun:{ - unique:true, - trigger:{player:'phaseBegin'}, - direct:true, - intro:{ - content:function(storage){ - if(!storage) return '无'; - return lib.skill.mailun.effects[storage-1]; - } + }, + }, }, - effects:[ - '减少1点体力并增加1点体力上限', - '增加1点体力并减少1点体力上限', - '令你即将造成和即将受到的首次伤害-1', - '令你即将造成和即将受到的首次伤害+1', - '少摸一张牌并令手牌上限+1', - '多摸一张牌并令手牌上限-1', - '进攻距离+1,防御距离-1', - '进攻距离-1,防御距离+1' + }, + mailun: { + unique: true, + trigger: { player: "phaseBegin" }, + direct: true, + intro: { + content: function (storage) { + if (!storage) return "无"; + return lib.skill.mailun.effects[storage - 1]; + }, + }, + effects: [ + "减少1点体力并增加1点体力上限", + "增加1点体力并减少1点体力上限", + "令你即将造成和即将受到的首次伤害-1", + "令你即将造成和即将受到的首次伤害+1", + "少摸一张牌并令手牌上限+1", + "多摸一张牌并令手牌上限-1", + "进攻距离+1,防御距离-1", + "进攻距离-1,防御距离+1", ], - content:function(){ - "step 0" - player.removeSkill('mailun31'); - player.removeSkill('mailun32'); - player.removeSkill('mailun41'); - player.removeSkill('mailun42'); - player.removeSkill('mailun5'); - player.removeSkill('mailun6'); - player.removeSkill('mailun7'); - player.removeSkill('mailun8'); - if(event.isMine()){ + content: function () { + "step 0"; + player.removeSkill("mailun31"); + player.removeSkill("mailun32"); + player.removeSkill("mailun41"); + player.removeSkill("mailun42"); + player.removeSkill("mailun5"); + player.removeSkill("mailun6"); + player.removeSkill("mailun7"); + player.removeSkill("mailun8"); + if (event.isMine()) { ui.auto.hide(); - event.dialog=ui.create.dialog('脉轮:选择一个效果','forcebutton'); - var effects=lib.skill.mailun.effects; - var clickItem=function(){ - event.choice=this.link; + event.dialog = ui.create.dialog("脉轮:选择一个效果", "forcebutton"); + var effects = lib.skill.mailun.effects; + var clickItem = function () { + event.choice = this.link; game.resume(); + }; + for (var i = 0; i < 8; i++) { + if (i == 0 && player.maxHp == 6) continue; + var item = event.dialog.add( + '" + ); + item.addEventListener("click", clickItem); + item.link = i + 1; } - for(var i=0;i<8;i++){ - if(i==0&&player.maxHp==6) continue; - var item=event.dialog.add(''); - item.addEventListener('click',clickItem); - item.link=i+1; - } - event.control=ui.create.control('取消',function(){ - event.choice=0; + event.control = ui.create.control("取消", function () { + event.choice = 0; game.resume(); }); - event.dialog.add(ui.create.div('.placeholder')); - event.dialog.add(ui.create.div('.placeholder')); - event.dialog.add(ui.create.div('.placeholder')); + event.dialog.add(ui.create.div(".placeholder")); + event.dialog.add(ui.create.div(".placeholder")); + event.dialog.add(ui.create.div(".placeholder")); game.pause(); - } - else{ + } else { var ctrl; - if(player.hp<=1){ - if(player.maxHp>3){ - ctrl=2; + if (player.hp <= 1) { + if (player.maxHp > 3) { + ctrl = 2; + } else { + ctrl = 3; } - else{ - ctrl=3; + } else if (player.hp == 2) { + if (player.maxHp > 4) { + ctrl = 2; + } else if (player.countCards("h") == 0) { + ctrl = 6; + } else { + ctrl = 3; } + } else if (player.countCards("h") < player.hp) { + ctrl = 6; + } else if (player.countCards("h") > player.hp + 1) { + ctrl = 5; } - else if(player.hp==2){ - if(player.maxHp>4){ - ctrl=2; - } - else if(player.countCards('h')==0){ - ctrl=6; - } - else{ - ctrl=3; - } - } - else if(player.countCards('h')player.hp+1){ - ctrl=5; - } - event.choice=ctrl; + event.choice = ctrl; } - "step 1" + ("step 1"); ui.auto.show(); - player.storage.mailun=event.choice; - game.addVideo('storage',player,['mailun',player.storage.mailun]); - if(event.choice){ - player.logSkill('mailun'); - player.markSkill('mailun'); - switch(event.choice){ - case 1:{ + player.storage.mailun = event.choice; + game.addVideo("storage", player, ["mailun", player.storage.mailun]); + if (event.choice) { + player.logSkill("mailun"); + player.markSkill("mailun"); + switch (event.choice) { + case 1: { player.loseHp(); player.gainMaxHp(); break; } - case 2:{ + case 2: { player.recover(); player.loseMaxHp(); break; } - case 3:{ - player.addSkill('mailun31'); - player.addSkill('mailun32'); + case 3: { + player.addSkill("mailun31"); + player.addSkill("mailun32"); break; } - case 4:{ - player.addSkill('mailun41'); - player.addSkill('mailun42'); + case 4: { + player.addSkill("mailun41"); + player.addSkill("mailun42"); break; } - case 5:{ - player.addSkill('mailun5'); + case 5: { + player.addSkill("mailun5"); break; } - case 6:{ - player.addSkill('mailun6'); + case 6: { + player.addSkill("mailun6"); break; } - case 7:{ - player.addSkill('mailun7'); + case 7: { + player.addSkill("mailun7"); break; } - case 8:{ - player.addSkill('mailun8'); + case 8: { + player.addSkill("mailun8"); break; } } + } else { + player.unmarkSkill("mailun"); } - else{ - player.unmarkSkill('mailun'); - } - if(event.dialog){ + if (event.dialog) { event.dialog.close(); } - if(event.control){ + if (event.control) { event.control.close(); } - } + }, }, - mailun31:{ - trigger:{source:'damageBegin'}, - forced:true, - content:function(){ + mailun31: { + trigger: { source: "damageBegin" }, + forced: true, + content: function () { trigger.num--; - player.removeSkill('mailun31'); - } + player.removeSkill("mailun31"); + }, }, - mailun32:{ - trigger:{player:'damageBegin'}, - forced:true, - content:function(){ + mailun32: { + trigger: { player: "damageBegin" }, + forced: true, + content: function () { trigger.num--; - player.removeSkill('mailun32'); - } + player.removeSkill("mailun32"); + }, }, - mailun41:{ - trigger:{source:'damageBegin'}, - forced:true, - content:function(){ + mailun41: { + trigger: { source: "damageBegin" }, + forced: true, + content: function () { trigger.num++; - player.removeSkill('mailun41'); - } + player.removeSkill("mailun41"); + }, }, - mailun42:{ - trigger:{player:'damageBegin'}, - forced:true, - content:function(){ + mailun42: { + trigger: { player: "damageBegin" }, + forced: true, + content: function () { trigger.num++; - player.removeSkill('mailun42'); - } + player.removeSkill("mailun42"); + }, }, - mailun5:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - popup:false, - content:function(){ + mailun5: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + popup: false, + content: function () { trigger.num--; }, - mod:{ - maxHandcard:function(player,num){ - return num+1; - } - } - }, - mailun6:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - popup:false, - content:function(){ - trigger.num++; - }, - mod:{ - maxHandcard:function(player,num){ - return num-1; - } - } - }, - mailun7:{ - mod:{ - globalFrom:function(from,to,distance){ - return distance-1; + mod: { + maxHandcard: function (player, num) { + return num + 1; }, - globalTo:function(from,to,distance){ - return distance-1; - } - } - }, - mailun8:{ - mod:{ - globalFrom:function(from,to,distance){ - return distance+1; - }, - globalTo:function(from,to,distance){ - return distance+1; - } - } - }, - fengming:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0; }, - filterCard:{type:'equip'}, - position:'he', - filterTarget:true, - content:function(){ - "step 0" + }, + mailun6: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + popup: false, + content: function () { + trigger.num++; + }, + mod: { + maxHandcard: function (player, num) { + return num - 1; + }, + }, + }, + mailun7: { + mod: { + globalFrom: function (from, to, distance) { + return distance - 1; + }, + globalTo: function (from, to, distance) { + return distance - 1; + }, + }, + }, + mailun8: { + mod: { + globalFrom: function (from, to, distance) { + return distance + 1; + }, + globalTo: function (from, to, distance) { + return distance + 1; + }, + }, + }, + fengming: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; + }, + filterCard: { type: "equip" }, + position: "he", + filterTarget: true, + content: function () { + "step 0"; target.recover(); - "step 1" + ("step 1"); target.draw(); }, - ai:{ - order:9, - result:{ - target:function(player,target){ - if(target.hp0; + wanjun: { + enable: "chooseToUse", + filter: function (event, player) { + return player.countCards("he", { type: "equip" }) > 0; }, - filterCard:function(card){ - return get.type(card)=='equip'; + filterCard: function (card) { + return get.type(card) == "equip"; }, - position:'he', - viewAs:{name:'nanman'}, - prompt:'将一张装备牌当南蛮入侵使用', - check:function(card){ - var player=_status.currentPhase; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); + position: "he", + viewAs: { name: "nanman" }, + prompt: "将一张装备牌当南蛮入侵使用", + check: function (card) { + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); } - if(player.countCards('h')0){ - return att+5; + huanling: { + trigger: { player: "phaseEnd" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt("huanling"), function (card, player, target) { + return player != target; + }).ai = function (target) { + if (target.hasSkillTag("noturn")) return 0; + var att = get.attitude(player, target); + if (target.isTurnedOver()) { + if (att > 0) { + return att + 5; } return -1; } - if(player.isTurnedOver()){ - return 5-att; + if (player.isTurnedOver()) { + return 5 - att; } - if(att<=-3){ + if (att <= -3) { return -att; } return 0; }; - "step 1" - if(result.bool){ - player.logSkill('huanling',result.targets); + ("step 1"); + if (result.bool) { + player.logSkill("huanling", result.targets); player.turnOver(); result.targets[0].turnOver(); } }, - group:'huanling2', - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='guiyoujie') return [0,2]; - if(target.isTurnedOver()){ - if(get.tag(card,'damage')) return 0; + group: "huanling2", + ai: { + effect: { + target: function (card, player, target, current) { + if (card.name == "guiyoujie") return [0, 2]; + if (target.isTurnedOver()) { + if (get.tag(card, "damage")) return 0; } - } + }, }, - expose:0.2 - } + expose: 0.2, + }, }, - huanling2:{ - trigger:{player:'damageBefore'}, - filter:function(event,player){ + huanling2: { + trigger: { player: "damageBefore" }, + filter: function (event, player) { return player.isTurnedOver(); }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.cancel(); }, }, - ljifeng:{ - mod:{ - selectTarget:function(card,player,range){ - if(card.name=='sha'&&range[1]!=-1) range[1]+=player.maxHp-player.hp; + ljifeng: { + mod: { + selectTarget: function (card, player, range) { + if (card.name == "sha" && range[1] != -1) range[1] += player.maxHp - player.hp; + }, + attackFrom: function (from, to, distance) { + return distance + from.hp - from.maxHp; }, - attackFrom:function(from,to,distance){ - return distance+from.hp-from.maxHp; - } }, }, - ljifeng_old:{ - trigger:{player:'phaseUseBefore'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + ljifeng_old: { + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - "step 0" - var check=player.countCards('h')<=player.hp+(player.hp>2?2:1); + content: function () { + "step 0"; + var check = player.countCards("h") <= player.hp + (player.hp > 2 ? 2 : 1); player.chooseCardTarget({ - prompt:get.prompt('ljifeng'), - filterCard:lib.filter.cardDiscardable, - filterTarget:function(card,player,target){ - if(player==target) return false; - return player.canUse({name:'sha'},target,false); + prompt: get.prompt("ljifeng"), + filterCard: lib.filter.cardDiscardable, + filterTarget: function (card, player, target) { + if (player == target) return false; + return player.canUse({ name: "sha" }, target, false); }, - selectTarget:[1,2], - ai1:function(card){ - if(!check) return 0; - return 8-get.value(card); + selectTarget: [1, 2], + ai1: function (card) { + if (!check) return 0; + return 8 - get.value(card); + }, + ai2: function (target) { + if (!check) return 0; + return get.effect(target, { name: "sha" }, player); }, - ai2:function(target){ - if(!check) return 0; - return get.effect(target,{name:'sha'},player); - } }); - "step 1" - if(result.bool){ - player.logSkill('ljifeng',result.targets); + ("step 1"); + if (result.bool) { + player.logSkill("ljifeng", result.targets); player.discard(result.cards); - player.useCard({name:'sha'},result.targets).animate=false; + player.useCard({ name: "sha" }, result.targets).animate = false; trigger.cancel(); } - } + }, }, - lxianglong:{ - trigger:{target:'shaMiss'}, - priority:5, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(function(card,player,target){ - return player.canUse('sha',target); - },get.prompt('lxianglong')).ai=function(target){ - return get.effect(target,{name:'sha'},player,player); - } - "step 1" - if(result.bool){ - player.logSkill('lxianglong',result.targets); - player.useCard({name:'sha'},trigger.cards,result.targets).animate=false; + lxianglong: { + trigger: { target: "shaMiss" }, + priority: 5, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(function (card, player, target) { + return player.canUse("sha", target); + }, get.prompt("lxianglong")).ai = function (target) { + return get.effect(target, { name: "sha" }, player, player); + }; + ("step 1"); + if (result.bool) { + player.logSkill("lxianglong", result.targets); + player.useCard({ name: "sha" }, trigger.cards, result.targets).animate = false; game.delay(); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(card.name=='sha'&&target.countCards('h')) return 0.7; - } - } - } - }, - zhenjiu:{ - enable:'phaseUse', - usable:1, - filterCard:{color:'red'}, - filterTarget:function(card,player,target){ - return !target.hasSkill('zhenjiu2'); - }, - check:function(card){ - return 8-get.value(card); - }, - discard:false, - prepare:'give', - content:function(){ - target.storage.zhenjiu2=cards[0]; - game.addVideo('storage',target,['zhenjiu2',get.cardInfo(target.storage.zhenjiu2),'card']); - target.addSkill('zhenjiu2'); - }, - ai:{ - result:{ - target:function(player,target){ - if(target.hpplayer.hp) return 0.5; - return 0; - } + ai: { + effect: { + target: function (card, player, target) { + if (card.name == "sha" && target.countCards("h")) return 0.7; + }, }, - order:9, - threaten:1.7 - } + }, }, - zhenjiu2:{ - trigger:{player:'phaseBegin'}, - forced:true, - mark:'card', - content:function(){ + zhenjiu: { + enable: "phaseUse", + usable: 1, + filterCard: { color: "red" }, + filterTarget: function (card, player, target) { + return !target.hasSkill("zhenjiu2"); + }, + check: function (card) { + return 8 - get.value(card); + }, + discard: false, + prepare: "give", + content: function () { + target.storage.zhenjiu2 = cards[0]; + game.addVideo("storage", target, [ + "zhenjiu2", + get.cardInfo(target.storage.zhenjiu2), + "card", + ]); + target.addSkill("zhenjiu2"); + }, + ai: { + result: { + target: function (player, target) { + if (target.hp < target.maxHp) { + return target == player ? 1 : 1.5; + } + if (player.countCards("h") > player.hp) return 0.5; + return 0; + }, + }, + order: 9, + threaten: 1.7, + }, + }, + zhenjiu2: { + trigger: { player: "phaseBegin" }, + forced: true, + mark: "card", + content: function () { player.recover(); - player.gain(player.storage.zhenjiu2,'gain2','log'); - player.removeSkill('zhenjiu2'); + player.gain(player.storage.zhenjiu2, "gain2", "log"); + player.removeSkill("zhenjiu2"); delete player.storage.zhenjiu2; }, - intro:{ - content:'card' - } - }, - shoulie:{ - trigger:{player:'shaBegin'}, - direct:true, - content:function(){ - "step 0" - var dis=trigger.target.countCards('h','shan')||trigger.target.hasSkillTag('freeShan',false,{ - player:player, - card:trigger.card - },true)||trigger.target.countCards('h')>2; - var next=player.chooseToDiscard(get.prompt('shoulie',trigger.target)); - next.ai=function(card){ - if(dis) return 7-get.value(card); - return 0; - } - next.logSkill='shoulie'; - "step 1" - if(result.bool){ - trigger.directHit=true; - } - } - }, - hudun:{ - trigger:{source:'damageEnd'}, - forced:true, - filter:function(event,player){ - return !player.hujia&&event.player!=player; + intro: { + content: "card", }, - content:function(){ + }, + shoulie: { + trigger: { player: "shaBegin" }, + direct: true, + content: function () { + "step 0"; + var dis = + trigger.target.countCards("h", "shan") || + trigger.target.hasSkillTag( + "freeShan", + false, + { + player: player, + card: trigger.card, + }, + true + ) || + trigger.target.countCards("h") > 2; + var next = player.chooseToDiscard(get.prompt("shoulie", trigger.target)); + next.ai = function (card) { + if (dis) return 7 - get.value(card); + return 0; + }; + next.logSkill = "shoulie"; + ("step 1"); + if (result.bool) { + trigger.directHit = true; + } + }, + }, + hudun: { + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event, player) { + return !player.hujia && event.player != player; + }, + content: function () { player.changeHujia(); player.update(); }, }, - toudan:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',{suit:'spade'}); + toudan: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he", { suit: "spade" }); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - filterCard:{suit:'spade'}, - check:function(card){ - return 10-get.value(card); + filterCard: { suit: "spade" }, + check: function (card) { + return 10 - get.value(card); }, - position:'he', - line:'fire', - content:function(){ - "step 0" - target.damage('fire'); - event.targets=game.filterPlayer(function(current){ - return get.distance(target,current)<=1; + position: "he", + line: "fire", + content: function () { + "step 0"; + target.damage("fire"); + event.targets = game.filterPlayer(function (current) { + return get.distance(target, current) <= 1; }); event.targets.sortBySeat(event.target); event.targets.unshift(player); - "step 1" - if(event.targets.length){ - var current=event.targets.shift(); - if(current.countCards('he')){ - current.chooseToDiscard('he',true); + ("step 1"); + if (event.targets.length) { + var current = event.targets.shift(); + if (current.countCards("he")) { + current.chooseToDiscard("he", true); } event.redo(); } }, - ai:{ - result:{ - target:function(player,target){ - return get.damageEffect(target,player,target,'fire'); - } + ai: { + result: { + target: function (player, target) { + return get.damageEffect(target, player, target, "fire"); + }, }, - order:10, - threaten:1.5 - } + order: 10, + threaten: 1.5, + }, }, - shending:{ - inherit:'longfan', - filter:function(event,player){ + shending: { + inherit: "longfan", + filter: function (event, player) { return !player.getEquip(5); }, - ai:{ - order:11, - result:{ - player:1, + ai: { + order: 11, + result: { + player: 1, }, - effect:{ - target:function(card,player,target){ - if(player!=target) return; - if(get.subtype(card)=='equip5'){ - if(get.equipValue(card)<=7) return 0; + effect: { + target: function (card, player, target) { + if (player != target) return; + if (get.subtype(card) == "equip5") { + if (get.equipValue(card) <= 7) return 0; } - } + }, }, - threaten:1.2 - } + threaten: 1.2, + }, }, - poxiao:{ - mod:{ - attackFrom:function(from,to,distance){ - if(!from.getEquip(1)) return distance-1; + poxiao: { + mod: { + attackFrom: function (from, to, distance) { + if (!from.getEquip(1)) return distance - 1; }, - selectTarget:function(card,player,range){ - if(!player.getEquip(1)&&card.name=='sha') range[1]++; - } - }, - enable:'chooseToUse', - filterCard:{type:'equip'}, - filter:function(event,player){ - return player.countCards('he',{type:'equip'}); - }, - position:'he', - viewAs:{name:'sha'}, - prompt:'将一张闪当杀使用或打出', - check:function(card){ - if(get.subtype(card)=='equip1') return 10-get.value(card); - return 7-get.equipValue(card); - }, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.1; + selectTarget: function (card, player, range) { + if (!player.getEquip(1) && card.name == "sha") range[1]++; }, - effect:{ - target:function(card,player){ - if(get.subtype(card)=='equip1'){ - var num=0,players=game.filterPlayer(); - for(var i=0;i1) return 'zeroplayertarget'; + if (num > 1) return "zeroplayertarget"; } } } - } - } - } + }, + }, + }, }, }, - translate:{ - swd_yangshuo:'杨硕', - swd_septem:'赛特', - swd_yuxiaoxue:'于小雪', - swd_lilian:'莉莲', - swd_cheyun:'车芸', - swd_jipeng:'疾鹏', - swd_muyun:'徐暮云', - swd_zhaoyun:'皇甫朝云', - swd_jiliang:'姬良', - swd_lanyin:'兰茵', - swd_zhiyin:'芝茵', - swd_hengai:'横艾', - swd_huzhongxian:'壶中仙', - swd_qiner:'磬儿', - swd_huanyuanzhi:'桓远之', - swd_murongshi:'慕容诗', - swd_hupo:'琥珀', - swd_miles:'麦尔斯', - swd_kangnalishi:'康那里士', - swd_satan:'撒旦', - swd_philis:'菲力斯', - swd_weida:'薇达', - swd_fengtianling:'凤天凌', - swd_huyue:'瑚月', - swd_jiting:'姬亭', - swd_rongshuang:'蓉霜', - swd_zhuoshanzhu:'浊山铸', - swd_jialanduo:'迦兰多', - swd_linming:'林明', - swd_duanmeng:'端蒙', - swd_nicole:'妮可', - swd_kendi:'肯迪', - swd_lijing:'李靖', - swd_hanteng:'韩腾', - swd_yuwentuo:'宇文拓', - swd_shanxiaoxiao:'单小小', - swd_yuchiyanhong:'尉迟嫣红', - swd_pepin:'丕平', - swd_anka:'安卡', - swd_jiangwu:'疆梧', - swd_situqiang:'司徒蔷', - swd_tuwei:'徒维', - swd_yeyaxi:'耶亚希', - swd_chunyuheng:'淳于恒', - swd_duguningke:'独孤宁珂', - swd_duguningke2:'魔化宁珂', - swd_chenjingchou:'陈靖仇', - swd_zhanglie:'张烈', - swd_guyue:'古月圣', - swd_kama:'卡玛', - swd_yuli:'玉澧', - swd_duopeng:'多鹏', - swd_jiangziya:'姜子牙', - swd_heran:'何然', - swd_zhanggao:'张诰', - swd_hanlong:'韩龙', - swd_jiuyou:'久悠', - swd_qingming:'青冥', - swd_shangzhang:'尚章', - swd_youzhao:'游兆', - swd_wangsiyue:'王思月', - swd_huanglei:'黄雷', - swd_tuobayuer:'拓跋玉儿', - swd_tuobayueer:'拓跋月儿', - swd_chengyaojin:'程咬金', - swd_qinshubao:'秦叔宝', - swd_lishimin:'李世民', - swd_shuijing:'水镜', - swd_xuanyuanjianxian:'轩辕剑仙', - swd_xuanyuanjiantong:'轩辕剑童', - swd_luchengxuan:'陆承轩', - swd_xiarou:'夏柔', - swd_moye:'莫耶', - swd_fu:'毛民·福', - swd_hanluo:'寒洛', - swd_linyue:'临月', - swd_zidashu:'子大暑', - swd_maixing:'麦星', - swd_haidapang:'海大胖', - swd_shaowei:'少微', - swd_fuyan:'符验', - swd_huiyan:'慧彦', - swd_sikongyu:'司空宇', - swd_muyue:'沐月', - swd_ziqiao:'子巧', - swd_fengyu:'凤煜', - swd_qi:'柒', - swd_chenfu:'陈辅', - swd_libai:'李白', - swd_xingtian:'刑天', - swd_lanmoshen:'蓝魔神', - swd_wushi:'巫师', - swd_quxian:'屈娴', - swd_xiyan:'犀衍', - swd_shuwaner:'舒莞儿', - swd_xiaohuanglong:'小黄龙', + translate: { + swd_yangshuo: "杨硕", + swd_septem: "赛特", + swd_yuxiaoxue: "于小雪", + swd_lilian: "莉莲", + swd_cheyun: "车芸", + swd_jipeng: "疾鹏", + swd_muyun: "徐暮云", + swd_zhaoyun: "皇甫朝云", + swd_jiliang: "姬良", + swd_lanyin: "兰茵", + swd_zhiyin: "芝茵", + swd_hengai: "横艾", + swd_huzhongxian: "壶中仙", + swd_qiner: "磬儿", + swd_huanyuanzhi: "桓远之", + swd_murongshi: "慕容诗", + swd_hupo: "琥珀", + swd_miles: "麦尔斯", + swd_kangnalishi: "康那里士", + swd_satan: "撒旦", + swd_philis: "菲力斯", + swd_weida: "薇达", + swd_fengtianling: "凤天凌", + swd_huyue: "瑚月", + swd_jiting: "姬亭", + swd_rongshuang: "蓉霜", + swd_zhuoshanzhu: "浊山铸", + swd_jialanduo: "迦兰多", + swd_linming: "林明", + swd_duanmeng: "端蒙", + swd_nicole: "妮可", + swd_kendi: "肯迪", + swd_lijing: "李靖", + swd_hanteng: "韩腾", + swd_yuwentuo: "宇文拓", + swd_shanxiaoxiao: "单小小", + swd_yuchiyanhong: "尉迟嫣红", + swd_pepin: "丕平", + swd_anka: "安卡", + swd_jiangwu: "疆梧", + swd_situqiang: "司徒蔷", + swd_tuwei: "徒维", + swd_yeyaxi: "耶亚希", + swd_chunyuheng: "淳于恒", + swd_duguningke: "独孤宁珂", + swd_duguningke2: "魔化宁珂", + swd_chenjingchou: "陈靖仇", + swd_zhanglie: "张烈", + swd_guyue: "古月圣", + swd_kama: "卡玛", + swd_yuli: "玉澧", + swd_duopeng: "多鹏", + swd_jiangziya: "姜子牙", + swd_heran: "何然", + swd_zhanggao: "张诰", + swd_hanlong: "韩龙", + swd_jiuyou: "久悠", + swd_qingming: "青冥", + swd_shangzhang: "尚章", + swd_youzhao: "游兆", + swd_wangsiyue: "王思月", + swd_huanglei: "黄雷", + swd_tuobayuer: "拓跋玉儿", + swd_tuobayueer: "拓跋月儿", + swd_chengyaojin: "程咬金", + swd_qinshubao: "秦叔宝", + swd_lishimin: "李世民", + swd_shuijing: "水镜", + swd_xuanyuanjianxian: "轩辕剑仙", + swd_xuanyuanjiantong: "轩辕剑童", + swd_luchengxuan: "陆承轩", + swd_xiarou: "夏柔", + swd_moye: "莫耶", + swd_fu: "毛民·福", + swd_hanluo: "寒洛", + swd_linyue: "临月", + swd_zidashu: "子大暑", + swd_maixing: "麦星", + swd_haidapang: "海大胖", + swd_shaowei: "少微", + swd_fuyan: "符验", + swd_huiyan: "慧彦", + swd_sikongyu: "司空宇", + swd_muyue: "沐月", + swd_ziqiao: "子巧", + swd_fengyu: "凤煜", + swd_qi: "柒", + swd_chenfu: "陈辅", + swd_libai: "李白", + swd_xingtian: "刑天", + swd_lanmoshen: "蓝魔神", + swd_wushi: "巫师", + swd_quxian: "屈娴", + swd_xiyan: "犀衍", + swd_shuwaner: "舒莞儿", + swd_xiaohuanglong: "小黄龙", - cyshuiyun:'水云', - cyshuiyun_info:'准备阶段,你可以弃置一名其他角色的一张牌;每当你失去此技能,你可以弃置一名其他角色的一张牌。', - cyliuzi:'流紫', - cyliuzi_info:'摸牌阶段,你可以额外摸一张牌;每当你失去此技能,你可以摸一张牌。', - cyyijin:'异金', - cyyijin_info:'出牌阶段,你可以对一名体力值为全场最多的角色造成1点伤害;每当你失去此技能,你可以对一名体力值为全场最多的角色造成1点伤害。', - cyqingling:'青凌', - cyqingling_info:'弃牌阶段,若你弃置了至少一张牌,你可以获得1点护甲;每当你失去此技能,你可以获得1点护甲。', - cyqiandian:'千靛', - cyqiandian_info:'结束阶段,你可以视为使用一张惊雷闪;每当你失去此技能,你可以视为使用一张惊雷闪。', - gxianyin:'仙音', - gxianyin_info:'出牌阶段限一次,你可以选择一种花色,将你的手牌中该花色的牌移至弃牌堆,然后选择另一种花色,从牌堆中获得等量的该花色的牌。', + cyshuiyun: "水云", + cyshuiyun_info: + "准备阶段,你可以弃置一名其他角色的一张牌;每当你失去此技能,你可以弃置一名其他角色的一张牌。", + cyliuzi: "流紫", + cyliuzi_info: "摸牌阶段,你可以额外摸一张牌;每当你失去此技能,你可以摸一张牌。", + cyyijin: "异金", + cyyijin_info: + "出牌阶段,你可以对一名体力值为全场最多的角色造成1点伤害;每当你失去此技能,你可以对一名体力值为全场最多的角色造成1点伤害。", + cyqingling: "青凌", + cyqingling_info: + "弃牌阶段,若你弃置了至少一张牌,你可以获得1点护甲;每当你失去此技能,你可以获得1点护甲。", + cyqiandian: "千靛", + cyqiandian_info: + "结束阶段,你可以视为使用一张惊雷闪;每当你失去此技能,你可以视为使用一张惊雷闪。", + gxianyin: "仙音", + gxianyin_info: + "出牌阶段限一次,你可以选择一种花色,将你的手牌中该花色的牌移至弃牌堆,然后选择另一种花色,从牌堆中获得等量的该花色的牌。", // gxianyin_info_alter:'', - cyxianjiang:'仙匠', - cyxianjiang_info:'每当你使用一张牌指定唯一目标时,你可以复制对方装备区内的一张你没有的牌,并置入你的装备区,每回合对一名角色最多发动一次。', - cyqiaoxie:'巧械', - cyqiaoxie_info:'每当你失去一张装备牌(使用除外),你可以随机观看三张机关牌,并使用其中一张。', - cyqiaoxie_info_alter:'每当你装备一件装备,若你的手牌数不大于体力值,你可以摸一张牌;每当你失去一件装备牌,你可以随机观看2张机关牌,并使用其中一张。', - cyzhencha:'侦察', - cyzhencha_info:'出牌阶段限一次,若你的装备区内的可强化装备,你可以弃置一张基本牌并观看一名其他角色的手牌,若其中有与你弃置的牌颜色相同的牌,你随机升级装备区内的一件装备,否则你摸一张牌;你根据装备区内升级的装备数获得额外技能。', - cylingjia:'灵甲', - cylingjia_info:'出牌阶段限一次,你可以弃置一张装备牌,然后令云狐随机装备一件装备(不替换现有装备)并将其强化。', - cyqiaobo:'巧补', - cyqiaobo_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后令云狐回复1点体力。', - cqiaoxie:'巧械', - cqiaoxie_info:'出牌阶段限一次,你可以将一张锦囊牌当作零件袋使用;每当你使用一张零件牌,你获得1点技能点数。', - xiufu:'修复', - xiufu_info:'出牌阶段,你可以弃置一张装备牌或机关牌,令云狐回复1点体力。', - yhshengong:'神工', - yhshengong_info:'游戏开始时,你获得3点技能点数;每当你造成1点伤害,你获得1点技能点数;出牌阶段,你可以通过消耗技能点令云狐获得新的技能(云狐体力为0时无法学习或发动技能)。', - juxi:'聚息', - juxi_info:'锁定技,每当一名角色于其回合外弃置牌,你获得一枚聚息标记;出牌阶段限一次,你可以移去X枚聚息标记,然后选择一项:对一名角造成1点伤害,或令一名角色回复1点体力,X为存活角色数。', - yeying:'曳影', - yeying_info:'出牌阶段限一次,你可以将一张黑色牌当作乾坤镖使用。', - jiefen:'解纷', - jiefen_info:'出牌阶段限一次,你可以令一名手牌数多于你的角色交给你一张牌,然后你交给一名手牌数少于你的角色一张牌。', - datong:'大同', - datong_info:'任意一名角色的结束阶段,若全场手牌数最多和最少的角色手牌数之差不超过1,你摸两张牌。', - huodan:'火丹', - huodan_info:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色。', - huodan_info_alter:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色;若你只分配了一名角色,该角色在结算后摸一张牌。', - sxianjing:'陷阱', - sxianjing_bg:'阱', - sxianjing_info:'出牌阶段,你可以将一张手牌背面朝上置于你的武将牌上(不能与已有花色相同)。当一名其他角色使用与一张“陷阱”牌花色相同的牌指定你为目标时,你移去对应的“陷阱”牌,然后随机获得该角色的一张牌。每当你受到一次伤害,你随机将一张“陷阱”牌返回手牌。', - zhanxing:'占星', - zhanxing_info:'出牌阶段限一次,你可以弃置任意张牌,并亮出牌堆顶的等量的牌,并根据亮出的牌包含的花色执行以下效果:♦︎摸两张牌;♥回复1点体力(若未损失体力改为获得1点护甲);♣令所有敌人随机弃置一张牌;♠令一名角色受到1点无来源的雷属性伤害。', - kbolan:'博览', - kbolan_info:'每当你摸牌时,你可以额外摸一张牌,然后摸牌结束时将一张手牌置于牌堆顶。', - gaizao:'改造', - gaizao_info:'每当你即将装备一张牌(特殊类装备除外),若你的装备区内对应位置已有牌,你可以永久改变此牌的装备类型使其装备在装备区内的空余位置。', - lingshi:'灵矢', - lingshi_info:'你的装备区内每有一张牌,你的攻击范围+2;当你的装备区内有武器牌或防具牌时,你的杀不可闪避;当你的装备区内有马时,你摸牌阶段额外摸一张牌;当你的装备内的宝物牌时,你回合内可以额外使用一张杀。', - tiebi:'铁壁', - tiebi_info:'当距离你1以内的一名角色成为杀的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得1点护甲。', - shenyan:'神炎', - shenyan_bg:'炎', - shenyan_info:'限定技,当你即将造成火焰伤害时,你可以令此伤害+1,并对目标距离1以内的所有其他角色各造成1点火焰伤害。', - xuanying:'旋影', - xuanying_info:'你可以横置你的武将牌,视为使用一张无视距离的杀;每当你于回合外失去牌,你可以竖置你的武将牌,视为使用一张无视距离的杀。', - hwendao:'问道', - hwendao_info:'每当你于回合外使用或打出一张牌,你可以令当前回合角色弃置一张与之花色相同的牌,否则你获得其一张牌。', - lingfeng:'凌锋', - lingfeng_info:'结束阶段,若你本回合内使用了至少X张牌,你可以选择一项:获得1点护甲,或对攻击范围内的一名角色造成1点伤害(X为你当前的体力值且最多为3)。', - hxunzhi:'殉志', - hxunzhi_info:'限定技,出牌阶段,你可以视为使用一张万箭齐发并获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡。', - hxunzhi_info_alter:'限定技,出牌阶段,你可以获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡。', - lmazui:'麻醉', - lmazui2:'麻醉', - lmazui_info:'出牌阶段限一次,你可以将一张黑色手牌置于一名角色的武将牌上,该角色造成的下一次伤害-1,然后获得此牌。', - hyunshen:'云身', - hyunshen2:'云身', - hyunshen_info:'每当你打出一张闪,你可以令你的防御距离+1;准备阶段,你将累计的防御距离清零,然后摸等量的牌。', - hlingbo:'凌波', - hlingbo_info:'每当你使用或打出一张闪,你可以摸两张牌。', - gtiandao:'天道', - gtiandao_info:'任意一名角色的判定生效前,你可以打出一张牌替换之。', - nlianji:'连计', - nlianji_info:'出牌阶段限一次,你可以选择一张手牌并指定两名角色进行拼点。若拼点结果不为平局,拼点赢的角色获得此牌,并对没赢的角色造成1点伤害。', - fengze:'风泽', - fengze_info:'出牌阶段限一次,你可以将一张黑色牌当作桃园结义使用。', - lingyue:'凌月', - lingyue_info:'每当你使用一张杀,你可以令目标弃置一张牌。', - jinlin:'金鳞', - jinlin_info:'限定技,出牌阶段,你可以令任意名角色各获得3点护甲,获得护甲的角色于每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲。', - huanxia:'幻霞', - huanxia_info:'你可以将一张红色牌当作杀使用,若此杀未造成伤害,你在结束阶段收回此牌。', - jingjie:'幻镜', - jingjie_info:'限定技,出牌阶段,你可以令所有角色弃置所有牌,然后摸两张牌(不触发任何技能)。', - kongmo:'恐魔', - kongmo_info:'锁定技,你使用基本牌或普通锦囊牌后将额外结算一次卡牌效果。', - jufu:'巨斧', - jufu_info:'锁定技,当你有武器牌时,杀造成的伤害+1。', - huajing:'化精', - huajing_info:'每当你使用锦囊牌造成伤害,可以回复1点体力并摸一张牌。', - pingxu:'冯虚', - pingxu_info:'锁定技,当你没有武器牌时,你的进攻距离+1;当你没有防具牌时,你的防御距离+1。', - yudun:'愚钝', - yudun_info:'锁定技,你无法使用锦囊牌;你可以将两张锦囊牌当作一张不计入出杀次数的杀使用。', - bingfeng:'冰封', - bingfeng2:'冰封', - bingfeng2_info:'不能使用或打出手牌。', - bingfeng_info:'限定技,出牌阶段,你可以指定至多三个目标与其一同翻面,且处于翻面状态时不能使用或打出手牌;若如此做,你失去技能玄咒并减少1点体力上限。', - guozao:'聒噪', - guozao_info:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离2以内的一名有手牌角色将手牌与这些牌交换。', - guozao_info_alter:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离1以内的一名有手牌角色将手牌与这些牌交换。', - heihuo:'黑火', - heihuo_info:'出牌阶段,你可以弃置一张装备牌,令你的手牌数加倍;若你的手牌因此达到8张或更多,你立即受到3点火焰伤害且本回合内不能再次发动黑火。', - yaotong:'妖瞳', - yaotong1:'妖瞳', - yaotong2:'妖瞳', - yaotong3:'妖瞳', - yaotong4:'妖瞳', - yaotong_info:'当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。', - yaotong_info_alter:'当你的手牌数为奇数时,你可以将一张手牌当作杀使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。', - pojian:'破茧', - pojian_info:'每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之。', - huajin:'化金', - huajin2:'化金', - huajin_info:'出牌阶段限一次,你可以弃置一张牌令你造成的伤害+1,直到你的下一回合开始。', - poxiao:'破霄', - poxiao_info:'你可以将一张装备牌当杀使用;当你没有武器牌时,你的攻击范围+1,杀可以额外指定一个目标。', - jianji:'箭疾', - jianji_info:'你可以将一张装备牌当杀使用,然后摸一张牌,此杀无视距离和防具,且不计入回合内出杀限制。', - yuchen:'浴尘', - yuchen_info:'每当你于回合外使用或打出一张黑色牌,你可以弃置一名角色的一张牌。', - huangyu:'凰羽', - huangyu_info:'出牌阶段限一次,你可以将两张红色牌当炽羽袭使用。', - bingjian:'冰箭', - bingjian_info:'出牌阶段限一次,你可以弃置一张黑色的杀,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到1点雷电伤害。', - rumeng:'入梦', - rumeng_info:'其他角色的出牌阶段前,你可以弃置一张非基本牌,并令其选择一项:弃置一张基本牌,或跳过出牌及弃牌阶段。', - lianda:'连打', - lianda_info:'当你使用一杀结算完毕后,可以弃置一张牌视为对目标再使用一张杀。', - xianghui:'祥晖', - xianghui_info:'出牌阶段限一次,你可以弃置一张红色手牌,然后令场上体力值最少的角色各回复1点体力。', - huiqi:'回气', - huiqi_info:'每当你受到一次伤害,可令一名其他角色摸X张牌,X为你已损失的体力值。', - toudan:'投弹', - toudan_info:'出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成1点火焰伤害,然后你与距离该角色1以内的所有角色各弃置一张牌。', - shending:'神丁', - shending_info:'锁定技,若你没有宝物牌,视为装备了蓝格怪衣。', - hzhenwei:'镇卫', - hzhenwei_info:'当一名其他角色成为杀的目标后,若你在杀的使用者的攻击范围内,你可以弃置一张牌将此杀转移给自己,并在杀结算完毕后摸一张牌。', - shoulie:'狩猎', - shoulie_info:'当你使用一张杀指定目标后,可以弃置一张手牌令此杀不可闪避。', - hudun:'盾甲', - hudun_bg:'盾', - hudun2:'盾甲', - hudun_info:'锁定技,当你对其他角色造成伤害后,若你没有护甲,你获得1点护甲值。', - zhenjiu:'针灸', - zhenjiu2:'针灸', - zhenjiu_info:'出牌阶段限一次,你可以将一张红色手牌置于一名角色的武将牌上,该角色于下一个准备阶段回复1点体力,然后获得此牌。', - ljifeng:'疾风', - ljifeng_info:'锁定技,你的攻击范围+X,杀可以额外指定X个目标,X为你已损失的体力值。', - lxianglong:'翔龙', - lxianglong_info:'每当你闪避一张杀,你可以视为使用一张杀。', - shangxi:'伤袭', - shangxi_info:'准备阶段,你可以弃置一张牌,并对攻击范围内一名体力值不小于你的其他角色造成1点伤害。', - fzhenwei:'镇威', - fzhenwei_info:'在你的回合内,你可以将其他角色打出的卡牌交给除该角色外的任意一名角色。', - fuyan:'覆岩', - fuyan2:'覆岩', - fuyan_info:'每当你受到一次伤害,可以令一名没有护甲的角色获得1点护甲值。', - guaili:'怪力', - guaili_info:'锁定技,你的杀造成的伤害+1,造成伤害后需弃置两张手牌。', - pingshen:'凭神', - pingshen2:'凭神', - pingshen_info:'锁定技,受到过你的伤害的角色可在回合内对你发动一次【离魂】(每局限发动一次)。', - xingzhui:'星坠', - xingzhui_info:'出牌阶段限一次,你可以弃置一张牌,并令一名有牌的其他角色弃置一张类别相同的牌,否则受到1点伤害。', - lingxian:'凌仙', - lingxian_info:'每当你于回合外使用或打出一张手牌,你可以选择攻击范围外的一名其他角色与你各摸一张牌。', - shouyin:'守印', - shouyin_info:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色将体力回复至体力上限。', - shouyin_info_alter:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色回复2点体力。', - bofeng:'搏风', - bofeng_info:'锁定技,体力值不大于你的角色视为在你的攻击范围;当你使用杀指定目标时,可令目标额外打出一张闪,否则此杀不可闪避且造成的伤害+1。', - hutian:'护天', - hutian2:'护天', - hutian3:'护天', - hutian_info:'结束阶段,你可以将任意张牌置于一名角色的武将牌上,则该角色的体力值始终不能小于“护天”牌数;在你的下一个结束阶段,该角色获得武将牌上的“护天”牌(在此回合不能再次发动)。', - linyun:'凌云', - linyun_info:'你可以将两张牌当作杀使用,此杀需要额外一张闪才能闪避。', - sliufeng:'流风', - sliufeng_info:'锁定技,体力值不大于你的角色视为在你的攻击范围。', - chengjian:'承剑', - chengjian_info:'每当其他角色使用杀造成一次伤害,你可以令其摸一张牌。', - huanling:'幻灵', - huanling2:'幻灵', - huanling_info:'结束阶段,你可以选择一名角色与你同时翻面;翻面状态下,你防止一切伤害。', - xiaozhan:'消战', - xiaozhan_info:'其他角色使用杀时,若你不是杀的目标,可以弃置一张杀取消之。', - xielei:'挟雷', - xielei_info:'每当你使用或打出一张杀,可以弃置一张牌并对目标以外的一名角色造成1点雷电伤害。', - dangping:'荡平', - dangping_info:'每当你造成一次伤害,可以弃置一张手牌对其距离1以内的另一名角色造成1点伤害,每回合限一次。', - guisi:'归思', - guisi_info:'每当你成为杀的目标,你可以交给对方一张手牌并取消之。', - duishi:'对诗', - duishi_info:'出牌阶段,你可以弃置一张手牌,并指定一名有手牌的角色选择一项:1)弃置一张与之花色相同的手牌,本回合内对诗不能再次指定其为目标,2)令你获得其一张牌,对诗失效直到回合结束。', - anlianying:'连营', - anlianying_info:'每当你失去最后一张手牌,可摸两张牌。', - lianwu:'连舞', - lianwu_info:'锁定技,你的杀可以额外指定一个目标,你的红杀不可被闪避。', - jiying:'疾鹰', - jiying_info:'锁定技,你使用杀无视距离。', - daofa:'道法', - daofa_info:'每当有一名其他角色造成伤害,你可以令其弃置一张牌。', - xiaomoyu:'魔愈', - xiaomoyu_info:'锁定技,每当你于一个回合内首次造成伤害,你回复1点体力,若你没有受伤,则改为摸一张牌。', - yihua:'移花', - yihua_info:'每当你成为其他角色的某张卡牌的唯一目标时,你可以弃置两张手牌,将使用者与目标对调。', - youyin:'游吟', - youyin_info:'每当有其他角色弃置卡牌时,若其中有非基本牌且你的手牌数不超过5,你可以摸一张牌。', - rexue:'热血', - rexue_info:'任意一名角色的准备阶段,你可以对其使用一张杀,并摸一张牌。', - huopu:'火瀑', - huopu_info:'出牌阶段限一次,你可以将一张红桃牌当作流星火羽使用。', - benlei:'奔雷', - benlei2:'奔雷', - benlei_info:'你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复1点体力。', - lingwu:'灵舞', - lingwu_info:'回合结束后,若你在本回合内使用的牌数不少于当前体力值,你可以进行一个额外的回合(不可重复发动)。', - miejing:'灭境', - miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到1点雷电伤害。', - lingxin:'灵心', - lingxin_info:'结束阶段,你可以亮出牌堆顶的三张牌,然后获得其中的红桃牌。', - fushen:'附身', - fushen_info:'回合开始前,你可以将自己移出游戏,并代替另一名角色进行一回合,然后失去1点体力。', - fushen2:'附身', - wangchen:'忘尘', - wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面。', - wangchen_info_alter:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面并获得1点护甲。', + cyxianjiang: "仙匠", + cyxianjiang_info: + "每当你使用一张牌指定唯一目标时,你可以复制对方装备区内的一张你没有的牌,并置入你的装备区,每回合对一名角色最多发动一次。", + cyqiaoxie: "巧械", + cyqiaoxie_info: "每当你失去一张装备牌(使用除外),你可以随机观看三张机关牌,并使用其中一张。", + cyqiaoxie_info_alter: + "每当你装备一件装备,若你的手牌数不大于体力值,你可以摸一张牌;每当你失去一件装备牌,你可以随机观看2张机关牌,并使用其中一张。", + cyzhencha: "侦察", + cyzhencha_info: + "出牌阶段限一次,若你的装备区内的可强化装备,你可以弃置一张基本牌并观看一名其他角色的手牌,若其中有与你弃置的牌颜色相同的牌,你随机升级装备区内的一件装备,否则你摸一张牌;你根据装备区内升级的装备数获得额外技能。", + cylingjia: "灵甲", + cylingjia_info: + "出牌阶段限一次,你可以弃置一张装备牌,然后令云狐随机装备一件装备(不替换现有装备)并将其强化。", + cyqiaobo: "巧补", + cyqiaobo_info: "出牌阶段限一次,你可以弃置一张锦囊牌,然后令云狐回复1点体力。", + cqiaoxie: "巧械", + cqiaoxie_info: + "出牌阶段限一次,你可以将一张锦囊牌当作零件袋使用;每当你使用一张零件牌,你获得1点技能点数。", + xiufu: "修复", + xiufu_info: "出牌阶段,你可以弃置一张装备牌或机关牌,令云狐回复1点体力。", + yhshengong: "神工", + yhshengong_info: + "游戏开始时,你获得3点技能点数;每当你造成1点伤害,你获得1点技能点数;出牌阶段,你可以通过消耗技能点令云狐获得新的技能(云狐体力为0时无法学习或发动技能)。", + juxi: "聚息", + juxi_info: + "锁定技,每当一名角色于其回合外弃置牌,你获得一枚聚息标记;出牌阶段限一次,你可以移去X枚聚息标记,然后选择一项:对一名角造成1点伤害,或令一名角色回复1点体力,X为存活角色数。", + yeying: "曳影", + yeying_info: "出牌阶段限一次,你可以将一张黑色牌当作乾坤镖使用。", + jiefen: "解纷", + jiefen_info: + "出牌阶段限一次,你可以令一名手牌数多于你的角色交给你一张牌,然后你交给一名手牌数少于你的角色一张牌。", + datong: "大同", + datong_info: + "任意一名角色的结束阶段,若全场手牌数最多和最少的角色手牌数之差不超过1,你摸两张牌。", + huodan: "火丹", + huodan_info: + "出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色。", + huodan_info_alter: + "出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色;若你只分配了一名角色,该角色在结算后摸一张牌。", + sxianjing: "陷阱", + sxianjing_bg: "阱", + sxianjing_info: + "出牌阶段,你可以将一张手牌背面朝上置于你的武将牌上(不能与已有花色相同)。当一名其他角色使用与一张“陷阱”牌花色相同的牌指定你为目标时,你移去对应的“陷阱”牌,然后随机获得该角色的一张牌。每当你受到一次伤害,你随机将一张“陷阱”牌返回手牌。", + zhanxing: "占星", + zhanxing_info: + "出牌阶段限一次,你可以弃置任意张牌,并亮出牌堆顶的等量的牌,并根据亮出的牌包含的花色执行以下效果:♦︎摸两张牌;♥回复1点体力(若未损失体力改为获得1点护甲);♣令所有敌人随机弃置一张牌;♠令一名角色受到1点无来源的雷属性伤害。", + kbolan: "博览", + kbolan_info: "每当你摸牌时,你可以额外摸一张牌,然后摸牌结束时将一张手牌置于牌堆顶。", + gaizao: "改造", + gaizao_info: + "每当你即将装备一张牌(特殊类装备除外),若你的装备区内对应位置已有牌,你可以永久改变此牌的装备类型使其装备在装备区内的空余位置。", + lingshi: "灵矢", + lingshi_info: + "你的装备区内每有一张牌,你的攻击范围+2;当你的装备区内有武器牌或防具牌时,你的杀不可闪避;当你的装备区内有马时,你摸牌阶段额外摸一张牌;当你的装备内的宝物牌时,你回合内可以额外使用一张杀。", + tiebi: "铁壁", + tiebi_info: + "当距离你1以内的一名角色成为杀的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得1点护甲。", + shenyan: "神炎", + shenyan_bg: "炎", + shenyan_info: + "限定技,当你即将造成火焰伤害时,你可以令此伤害+1,并对目标距离1以内的所有其他角色各造成1点火焰伤害。", + xuanying: "旋影", + xuanying_info: + "你可以横置你的武将牌,视为使用一张无视距离的杀;每当你于回合外失去牌,你可以竖置你的武将牌,视为使用一张无视距离的杀。", + hwendao: "问道", + hwendao_info: + "每当你于回合外使用或打出一张牌,你可以令当前回合角色弃置一张与之花色相同的牌,否则你获得其一张牌。", + lingfeng: "凌锋", + lingfeng_info: + "结束阶段,若你本回合内使用了至少X张牌,你可以选择一项:获得1点护甲,或对攻击范围内的一名角色造成1点伤害(X为你当前的体力值且最多为3)。", + hxunzhi: "殉志", + hxunzhi_info: + "限定技,出牌阶段,你可以视为使用一张万箭齐发并获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡。", + hxunzhi_info_alter: + "限定技,出牌阶段,你可以获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡。", + lmazui: "麻醉", + lmazui2: "麻醉", + lmazui_info: + "出牌阶段限一次,你可以将一张黑色手牌置于一名角色的武将牌上,该角色造成的下一次伤害-1,然后获得此牌。", + hyunshen: "云身", + hyunshen2: "云身", + hyunshen_info: + "每当你打出一张闪,你可以令你的防御距离+1;准备阶段,你将累计的防御距离清零,然后摸等量的牌。", + hlingbo: "凌波", + hlingbo_info: "每当你使用或打出一张闪,你可以摸两张牌。", + gtiandao: "天道", + gtiandao_info: "任意一名角色的判定生效前,你可以打出一张牌替换之。", + nlianji: "连计", + nlianji_info: + "出牌阶段限一次,你可以选择一张手牌并指定两名角色进行拼点。若拼点结果不为平局,拼点赢的角色获得此牌,并对没赢的角色造成1点伤害。", + fengze: "风泽", + fengze_info: "出牌阶段限一次,你可以将一张黑色牌当作桃园结义使用。", + lingyue: "凌月", + lingyue_info: "每当你使用一张杀,你可以令目标弃置一张牌。", + jinlin: "金鳞", + jinlin_info: + "限定技,出牌阶段,你可以令任意名角色各获得3点护甲,获得护甲的角色于每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲。", + huanxia: "幻霞", + huanxia_info: "你可以将一张红色牌当作杀使用,若此杀未造成伤害,你在结束阶段收回此牌。", + jingjie: "幻镜", + jingjie_info: "限定技,出牌阶段,你可以令所有角色弃置所有牌,然后摸两张牌(不触发任何技能)。", + kongmo: "恐魔", + kongmo_info: "锁定技,你使用基本牌或普通锦囊牌后将额外结算一次卡牌效果。", + jufu: "巨斧", + jufu_info: "锁定技,当你有武器牌时,杀造成的伤害+1。", + huajing: "化精", + huajing_info: "每当你使用锦囊牌造成伤害,可以回复1点体力并摸一张牌。", + pingxu: "冯虚", + pingxu_info: "锁定技,当你没有武器牌时,你的进攻距离+1;当你没有防具牌时,你的防御距离+1。", + yudun: "愚钝", + yudun_info: "锁定技,你无法使用锦囊牌;你可以将两张锦囊牌当作一张不计入出杀次数的杀使用。", + bingfeng: "冰封", + bingfeng2: "冰封", + bingfeng2_info: "不能使用或打出手牌。", + bingfeng_info: + "限定技,出牌阶段,你可以指定至多三个目标与其一同翻面,且处于翻面状态时不能使用或打出手牌;若如此做,你失去技能玄咒并减少1点体力上限。", + guozao: "聒噪", + guozao_info: + "锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离2以内的一名有手牌角色将手牌与这些牌交换。", + guozao_info_alter: + "锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离1以内的一名有手牌角色将手牌与这些牌交换。", + heihuo: "黑火", + heihuo_info: + "出牌阶段,你可以弃置一张装备牌,令你的手牌数加倍;若你的手牌因此达到8张或更多,你立即受到3点火焰伤害且本回合内不能再次发动黑火。", + yaotong: "妖瞳", + yaotong1: "妖瞳", + yaotong2: "妖瞳", + yaotong3: "妖瞳", + yaotong4: "妖瞳", + yaotong_info: + "当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", + yaotong_info_alter: + "当你的手牌数为奇数时,你可以将一张手牌当作杀使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", + pojian: "破茧", + pojian_info: "每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之。", + huajin: "化金", + huajin2: "化金", + huajin_info: "出牌阶段限一次,你可以弃置一张牌令你造成的伤害+1,直到你的下一回合开始。", + poxiao: "破霄", + poxiao_info: + "你可以将一张装备牌当杀使用;当你没有武器牌时,你的攻击范围+1,杀可以额外指定一个目标。", + jianji: "箭疾", + jianji_info: + "你可以将一张装备牌当杀使用,然后摸一张牌,此杀无视距离和防具,且不计入回合内出杀限制。", + yuchen: "浴尘", + yuchen_info: "每当你于回合外使用或打出一张黑色牌,你可以弃置一名角色的一张牌。", + huangyu: "凰羽", + huangyu_info: "出牌阶段限一次,你可以将两张红色牌当炽羽袭使用。", + bingjian: "冰箭", + bingjian_info: + "出牌阶段限一次,你可以弃置一张黑色的杀,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到1点雷电伤害。", + rumeng: "入梦", + rumeng_info: + "其他角色的出牌阶段前,你可以弃置一张非基本牌,并令其选择一项:弃置一张基本牌,或跳过出牌及弃牌阶段。", + lianda: "连打", + lianda_info: "当你使用一杀结算完毕后,可以弃置一张牌视为对目标再使用一张杀。", + xianghui: "祥晖", + xianghui_info: + "出牌阶段限一次,你可以弃置一张红色手牌,然后令场上体力值最少的角色各回复1点体力。", + huiqi: "回气", + huiqi_info: "每当你受到一次伤害,可令一名其他角色摸X张牌,X为你已损失的体力值。", + toudan: "投弹", + toudan_info: + "出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成1点火焰伤害,然后你与距离该角色1以内的所有角色各弃置一张牌。", + shending: "神丁", + shending_info: "锁定技,若你没有宝物牌,视为装备了蓝格怪衣。", + hzhenwei: "镇卫", + hzhenwei_info: + "当一名其他角色成为杀的目标后,若你在杀的使用者的攻击范围内,你可以弃置一张牌将此杀转移给自己,并在杀结算完毕后摸一张牌。", + shoulie: "狩猎", + shoulie_info: "当你使用一张杀指定目标后,可以弃置一张手牌令此杀不可闪避。", + hudun: "盾甲", + hudun_bg: "盾", + hudun2: "盾甲", + hudun_info: "锁定技,当你对其他角色造成伤害后,若你没有护甲,你获得1点护甲值。", + zhenjiu: "针灸", + zhenjiu2: "针灸", + zhenjiu_info: + "出牌阶段限一次,你可以将一张红色手牌置于一名角色的武将牌上,该角色于下一个准备阶段回复1点体力,然后获得此牌。", + ljifeng: "疾风", + ljifeng_info: "锁定技,你的攻击范围+X,杀可以额外指定X个目标,X为你已损失的体力值。", + lxianglong: "翔龙", + lxianglong_info: "每当你闪避一张杀,你可以视为使用一张杀。", + shangxi: "伤袭", + shangxi_info: + "准备阶段,你可以弃置一张牌,并对攻击范围内一名体力值不小于你的其他角色造成1点伤害。", + fzhenwei: "镇威", + fzhenwei_info: "在你的回合内,你可以将其他角色打出的卡牌交给除该角色外的任意一名角色。", + fuyan: "覆岩", + fuyan2: "覆岩", + fuyan_info: "每当你受到一次伤害,可以令一名没有护甲的角色获得1点护甲值。", + guaili: "怪力", + guaili_info: "锁定技,你的杀造成的伤害+1,造成伤害后需弃置两张手牌。", + pingshen: "凭神", + pingshen2: "凭神", + pingshen_info: "锁定技,受到过你的伤害的角色可在回合内对你发动一次【离魂】(每局限发动一次)。", + xingzhui: "星坠", + xingzhui_info: + "出牌阶段限一次,你可以弃置一张牌,并令一名有牌的其他角色弃置一张类别相同的牌,否则受到1点伤害。", + lingxian: "凌仙", + lingxian_info: + "每当你于回合外使用或打出一张手牌,你可以选择攻击范围外的一名其他角色与你各摸一张牌。", + shouyin: "守印", + shouyin_info: + "限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色将体力回复至体力上限。", + shouyin_info_alter: + "限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色回复2点体力。", + bofeng: "搏风", + bofeng_info: + "锁定技,体力值不大于你的角色视为在你的攻击范围;当你使用杀指定目标时,可令目标额外打出一张闪,否则此杀不可闪避且造成的伤害+1。", + hutian: "护天", + hutian2: "护天", + hutian3: "护天", + hutian_info: + "结束阶段,你可以将任意张牌置于一名角色的武将牌上,则该角色的体力值始终不能小于“护天”牌数;在你的下一个结束阶段,该角色获得武将牌上的“护天”牌(在此回合不能再次发动)。", + linyun: "凌云", + linyun_info: "你可以将两张牌当作杀使用,此杀需要额外一张闪才能闪避。", + sliufeng: "流风", + sliufeng_info: "锁定技,体力值不大于你的角色视为在你的攻击范围。", + chengjian: "承剑", + chengjian_info: "每当其他角色使用杀造成一次伤害,你可以令其摸一张牌。", + huanling: "幻灵", + huanling2: "幻灵", + huanling_info: "结束阶段,你可以选择一名角色与你同时翻面;翻面状态下,你防止一切伤害。", + xiaozhan: "消战", + xiaozhan_info: "其他角色使用杀时,若你不是杀的目标,可以弃置一张杀取消之。", + xielei: "挟雷", + xielei_info: "每当你使用或打出一张杀,可以弃置一张牌并对目标以外的一名角色造成1点雷电伤害。", + dangping: "荡平", + dangping_info: + "每当你造成一次伤害,可以弃置一张手牌对其距离1以内的另一名角色造成1点伤害,每回合限一次。", + guisi: "归思", + guisi_info: "每当你成为杀的目标,你可以交给对方一张手牌并取消之。", + duishi: "对诗", + duishi_info: + "出牌阶段,你可以弃置一张手牌,并指定一名有手牌的角色选择一项:1)弃置一张与之花色相同的手牌,本回合内对诗不能再次指定其为目标,2)令你获得其一张牌,对诗失效直到回合结束。", + anlianying: "连营", + anlianying_info: "每当你失去最后一张手牌,可摸两张牌。", + lianwu: "连舞", + lianwu_info: "锁定技,你的杀可以额外指定一个目标,你的红杀不可被闪避。", + jiying: "疾鹰", + jiying_info: "锁定技,你使用杀无视距离。", + daofa: "道法", + daofa_info: "每当有一名其他角色造成伤害,你可以令其弃置一张牌。", + xiaomoyu: "魔愈", + xiaomoyu_info: + "锁定技,每当你于一个回合内首次造成伤害,你回复1点体力,若你没有受伤,则改为摸一张牌。", + yihua: "移花", + yihua_info: "每当你成为其他角色的某张卡牌的唯一目标时,你可以弃置两张手牌,将使用者与目标对调。", + youyin: "游吟", + youyin_info: "每当有其他角色弃置卡牌时,若其中有非基本牌且你的手牌数不超过5,你可以摸一张牌。", + rexue: "热血", + rexue_info: "任意一名角色的准备阶段,你可以对其使用一张杀,并摸一张牌。", + huopu: "火瀑", + huopu_info: "出牌阶段限一次,你可以将一张红桃牌当作流星火羽使用。", + benlei: "奔雷", + benlei2: "奔雷", + benlei_info: "你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复1点体力。", + lingwu: "灵舞", + lingwu_info: + "回合结束后,若你在本回合内使用的牌数不少于当前体力值,你可以进行一个额外的回合(不可重复发动)。", + miejing: "灭境", + miejing_info: "限制技,你可以弃置所有黑色牌,然后令所有其他角色受到1点雷电伤害。", + lingxin: "灵心", + lingxin_info: "结束阶段,你可以亮出牌堆顶的三张牌,然后获得其中的红桃牌。", + fushen: "附身", + fushen_info: "回合开始前,你可以将自己移出游戏,并代替另一名角色进行一回合,然后失去1点体力。", + fushen2: "附身", + wangchen: "忘尘", + wangchen_info: "弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面。", + wangchen_info_alter: + "弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面并获得1点护甲。", // wangchen_info:'若你于弃牌阶段弃置了基本牌,可令一名角色翻面。', // wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,可将一名其他角色移出游戏直到你死亡或下一回合开始。', - guiyin:'归隐', - guiyin_info:'若你于弃牌阶段弃置了至少两张牌,你可以摸两张牌。', - shejie:'设界', - shejie2:'设界', - shejie_info:'每当你受到一次伤害,可以令伤害来源不能使用或打出其手牌,直到其下一回合开始。', - shejie2_info:'不能使用或打出手牌,直到下一回合开始。', - yinyue:'引月', - yinyue_info:'每当有一名角色回复一次体力,你可以令其摸一张牌,若该角色不是你且你的手牌数不大于该角色,你也摸一张牌。', - yinyue_info_alter:'每当有一名角色回复一次体力,你可以令其摸一张牌。', - mohua2:'魔化', - mohua2_info:'锁定技,当你进入濒死状态时,你立即变身为撒旦,将体力回复至2,然后摸两张牌。', - liexin:'裂心', - liexin_info:'每当你即将造成伤害,你可以弃置一张牌令伤害+1。', - swdxueyi:'血裔', - swdxueyi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。', - moyan:'血焰', - moyan_info:'出牌阶段,你可以弃置X张红色手牌,然后对至多X名角色各造成1点火焰伤害,X为你已损失的体力值。每阶段限一次。', - aojian:'傲剑', - aojian_info:'出牌阶段,你可以弃置X张手牌,然后对攻击范围内至多X名角色各造成1点伤害,X为你已损失的体力值。每阶段限一次。', - milesxiehun:'邪魂', - milesxiehun_info:'锁定技,出牌阶段结束后,你令随机X名角色各弃置一张牌,X为你已损失的体力值且至少为1。', - liaochen:'撩尘', - liaochen_info:'锁定技,出牌阶段结束后,所有角色需弃置一张牌。', - yinmo:'引魔', - yinmo_info:'锁定技,当你对场上所有角色发动〖连计〗后,你立即变身为魔化宁珂,然后对所有其他角色造成1点雷电伤害。', - huanxing:'幻形', - huanxing2:'幻形', - huanxing_info:'准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害。', - meihuo:'魅惑', - meihuo_info:'每当你失去最后一张装备牌,你可以获得一名其他角色的一张牌,若此牌来自装备区,你立即装备之。', + guiyin: "归隐", + guiyin_info: "若你于弃牌阶段弃置了至少两张牌,你可以摸两张牌。", + shejie: "设界", + shejie2: "设界", + shejie_info: "每当你受到一次伤害,可以令伤害来源不能使用或打出其手牌,直到其下一回合开始。", + shejie2_info: "不能使用或打出手牌,直到下一回合开始。", + yinyue: "引月", + yinyue_info: + "每当有一名角色回复一次体力,你可以令其摸一张牌,若该角色不是你且你的手牌数不大于该角色,你也摸一张牌。", + yinyue_info_alter: "每当有一名角色回复一次体力,你可以令其摸一张牌。", + mohua2: "魔化", + mohua2_info: "锁定技,当你进入濒死状态时,你立即变身为撒旦,将体力回复至2,然后摸两张牌。", + liexin: "裂心", + liexin_info: "每当你即将造成伤害,你可以弃置一张牌令伤害+1。", + swdxueyi: "血裔", + swdxueyi_info: "锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值。", + moyan: "血焰", + moyan_info: + "出牌阶段,你可以弃置X张红色手牌,然后对至多X名角色各造成1点火焰伤害,X为你已损失的体力值。每阶段限一次。", + aojian: "傲剑", + aojian_info: + "出牌阶段,你可以弃置X张手牌,然后对攻击范围内至多X名角色各造成1点伤害,X为你已损失的体力值。每阶段限一次。", + milesxiehun: "邪魂", + milesxiehun_info: + "锁定技,出牌阶段结束后,你令随机X名角色各弃置一张牌,X为你已损失的体力值且至少为1。", + liaochen: "撩尘", + liaochen_info: "锁定技,出牌阶段结束后,所有角色需弃置一张牌。", + yinmo: "引魔", + yinmo_info: + "锁定技,当你对场上所有角色发动〖连计〗后,你立即变身为魔化宁珂,然后对所有其他角色造成1点雷电伤害。", + huanxing: "幻形", + huanxing2: "幻形", + huanxing_info: + "准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害。", + meihuo: "魅惑", + meihuo_info: + "每当你失去最后一张装备牌,你可以获得一名其他角色的一张牌,若此牌来自装备区,你立即装备之。", - touxi:'偷袭', - touxi_info:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以弃置你的一张牌。', - touxi_info_alter:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以获得你的一张牌。', - minjing:'明镜', - minjing_info:'若你没有防具牌,你视为装备了光纱天衣。', - jqimou:'奇谋', - jqimou_info:'每当你于回合外受到一次伤害,你可以摸一张牌,并可以使用一张牌。', - mufeng:'沐风', - mufeng_info:'结束阶段,若你本回合使用过基本牌,则可发现一张牌。', - mufeng_info_alter:'结束阶段,你可以将手牌数补至当前体力值。', - mufeng_old2_info:'在一名角色的结束阶段,若你的手牌数比其少,你可以将手牌补至与该角色相同(最多补至5),每轮限一次。', - hjifeng:'祭风', - hjifeng_info:'出牌阶段限一次,若你手牌中没有祭器牌,你可以将一张手牌置于牌堆顶,并根据其花色获得对应祭器:黑桃-青龙之圭;梅花-白兽之琥;方片-朱雀之璋;红桃-玄武之璜。', - mufeng_old_info:'锁定技,每当你于回合外失去牌,你的防御距离+1;若防御距离的变化值超过了存活角色数的一半,则降至0。', - lexue:'乐学', - lexue_info:'回合内,你随机获得制衡、集智、缔盟、驱虎中的一个技能;回合外,你随机获得遗计、急救、鬼道、反馈中的一个技能。', - mingfu:'冥缚', - mingfu_info:'出牌阶段限一次,你可以将一张梅花牌当鬼幽结使用。', - chuanyue:'穿月', - chuanyue_info:'出牌阶段限一次,你可以将两张手牌当决斗使用。', + touxi: "偷袭", + touxi_info: + "在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以弃置你的一张牌。", + touxi_info_alter: + "在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以获得你的一张牌。", + minjing: "明镜", + minjing_info: "若你没有防具牌,你视为装备了光纱天衣。", + jqimou: "奇谋", + jqimou_info: "每当你于回合外受到一次伤害,你可以摸一张牌,并可以使用一张牌。", + mufeng: "沐风", + mufeng_info: "结束阶段,若你本回合使用过基本牌,则可发现一张牌。", + mufeng_info_alter: "结束阶段,你可以将手牌数补至当前体力值。", + mufeng_old2_info: + "在一名角色的结束阶段,若你的手牌数比其少,你可以将手牌补至与该角色相同(最多补至5),每轮限一次。", + hjifeng: "祭风", + hjifeng_info: + "出牌阶段限一次,若你手牌中没有祭器牌,你可以将一张手牌置于牌堆顶,并根据其花色获得对应祭器:黑桃-青龙之圭;梅花-白兽之琥;方片-朱雀之璋;红桃-玄武之璜。", + mufeng_old_info: + "锁定技,每当你于回合外失去牌,你的防御距离+1;若防御距离的变化值超过了存活角色数的一半,则降至0。", + lexue: "乐学", + lexue_info: + "回合内,你随机获得制衡、集智、缔盟、驱虎中的一个技能;回合外,你随机获得遗计、急救、鬼道、反馈中的一个技能。", + mingfu: "冥缚", + mingfu_info: "出牌阶段限一次,你可以将一张梅花牌当鬼幽结使用。", + chuanyue: "穿月", + chuanyue_info: "出牌阶段限一次,你可以将两张手牌当决斗使用。", - miedao:'灭道', - miedao1:'灭道', - miedao2:'灭道', - miedao_info:'锁定技,摸牌阶段,你额外摸X张牌;弃牌阶段,你至少须弃X张牌(不足则全弃),X为你已损失的体力值。', + miedao: "灭道", + miedao1: "灭道", + miedao2: "灭道", + miedao_info: + "锁定技,摸牌阶段,你额外摸X张牌;弃牌阶段,你至少须弃X张牌(不足则全弃),X为你已损失的体力值。", - senluo:'森罗', - senluo_info:'出牌阶段限一次,若你的手牌数为全场最少或之一,你可以令所有有手牌的其他角色弃置两张手牌然后摸一张牌。', - polang:'破浪', - polang_info:'每当你造成一次伤害,可以一张对方的装备牌。', - jikong:'亟空', - jikong2:'亟空', - jikong_info:'准备阶段,你可以指定一名角色视为对其使用一张雷杀;每当你失去最后一张手牌,你可以指定一名角色视为对其使用一张雷杀(每回合限发动一次)。', - jikong_info_alter:'准备阶段,你可以指定一名角色视为对其使用一张雷杀。', - xiangu:'仙骨', - xiangu_info:'锁定技,你的手牌上限不会因体力值的减少而减少。', - hujing:'壶境', - hujing_info:'锁定技,准备阶段,若弃牌堆中有炼妖壶,你装备之;当你的装备区内有炼妖壶时,你的手牌上限+2。', - huajian:'化剑', - huajian_info:'出牌阶段结束时,你可以将一张牌当作杀对任意一名角色使用。', - xuanyuan:'轩辕', - xuanyuan_info:'锁定技,你无视【轩辕剑】的装备条件及失去体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之。', - jilve:'极略', - jilve_backup:'极略', - jilve2:'极略', - jilve_info:'出牌阶段,你可以观看牌堆顶的三张牌,然后使用其中的非装备牌。每回合最多发动三次。', - jilve_info_alter:'出牌阶段,你可以观看牌堆顶的两张牌,然后使用其中的非装备牌。每回合最多发动三次。', - gongshen:'工神', - gongshen_info:'任意一名其他角色使用一张基本牌或锦囊牌指定目标后,你可以弃置一张装备牌令其失效。', + senluo: "森罗", + senluo_info: + "出牌阶段限一次,若你的手牌数为全场最少或之一,你可以令所有有手牌的其他角色弃置两张手牌然后摸一张牌。", + polang: "破浪", + polang_info: "每当你造成一次伤害,可以一张对方的装备牌。", + jikong: "亟空", + jikong2: "亟空", + jikong_info: + "准备阶段,你可以指定一名角色视为对其使用一张雷杀;每当你失去最后一张手牌,你可以指定一名角色视为对其使用一张雷杀(每回合限发动一次)。", + jikong_info_alter: "准备阶段,你可以指定一名角色视为对其使用一张雷杀。", + xiangu: "仙骨", + xiangu_info: "锁定技,你的手牌上限不会因体力值的减少而减少。", + hujing: "壶境", + hujing_info: + "锁定技,准备阶段,若弃牌堆中有炼妖壶,你装备之;当你的装备区内有炼妖壶时,你的手牌上限+2。", + huajian: "化剑", + huajian_info: "出牌阶段结束时,你可以将一张牌当作杀对任意一名角色使用。", + xuanyuan: "轩辕", + xuanyuan_info: + "锁定技,你无视【轩辕剑】的装备条件及失去体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之。", + jilve: "极略", + jilve_backup: "极略", + jilve2: "极略", + jilve_info: "出牌阶段,你可以观看牌堆顶的三张牌,然后使用其中的非装备牌。每回合最多发动三次。", + jilve_info_alter: + "出牌阶段,你可以观看牌堆顶的两张牌,然后使用其中的非装备牌。每回合最多发动三次。", + gongshen: "工神", + gongshen_info: "任意一名其他角色使用一张基本牌或锦囊牌指定目标后,你可以弃置一张装备牌令其失效。", - swdliuhong:'流虹', - swdliuhong_info:'每当你使用一张杀,可以摸一张牌。', - poyue:'破月', - poyue_info:'锁定技,你的黑杀无视距离,红色杀不计入回合内的出杀限制且不可闪避。', - poyue_info_alter:'锁定技,你的黑杀无视距离,红色杀不可闪避。', - mojian:'墨剑', - mojian_info:'每当你使用杀并指定目标后,你可以令其摸一张牌,然后你回复1点体力。', - duanyue:'断月', - duanyue_info:'出牌阶段限一次,你可以弃置一张装备牌,对一名其他角色造成1点伤害。', - tuzhen:'突阵', - tuzhen_info:'当你造成一次伤害后,你可以弃置对方手牌中的非基本牌。', - tuzhen_info_alter:'当你造成一次伤害后,你可以弃置对方手牌中的一张非基本牌。', - fengmo:'封魔', - fengmo_info:'出牌阶段限一次,你可以弃置场所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面。', - pozhou:'破咒', - pozhou_bg:'破', - pozhou2:'破咒', - pozhou_info:'每当你受到一次伤害,你获得一枚破咒标记。出牌阶段,你可以指定任意名其他角色并弃置等量的破咒标记,令目标的非锁定技失效直到其下一回合结束。', - xuanzhou:'玄咒', - xuanzhou_info:'出牌阶段限一次,你可以将一张普通锦囊牌当作任意一张延时锦囊,对任意一名角色使用(无视锦囊使用范围限制)。', - ningxian:'凝霰', - ningxian_info:'每当你受到一次伤害,你可以弃置任意张黑色牌并选择等量其他角色对其各造成1点伤害。', - guanhu:'贯鹄', - guanhu_info:'每当你使用杀造成伤害,你可以弃置对方一张手牌和一张装备牌。', - chuanyang:'穿杨', - chuanyang_info:'每当你使用一张杀,若你不在目标的攻击范围,你可以令此杀不可闪避。', - fengming:'凤鸣', - fengming_info:'出牌阶段限一次,你可以弃置一张装备牌,令一名角色恢复1点体力并摸一张牌。', - duanxing:'锻星', - duanxing_info:'每当你装备一张未强化的装备牌,可以视为一名角色使用一张杀。', - wanjun:'万钧', - wanjun_info:'你可以将一张装备牌当作南蛮入侵使用。', - dunxing:'遁形', - dunxing_info:'当你成为其他角色卡牌的目标时,你可以弃置一张牌并进行一次判定,若不为红桃,则取消之。', - guiying:'鬼影', - guiying_info:'你可以将一张黑色牌当偷梁换柱使用。', - shehun:'摄魂', - shehun_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌,另一名其他角色弃置等量的牌,若其弃置的牌中有牌的花色与你弃置的牌相同,你对其造成1点伤害。', + swdliuhong: "流虹", + swdliuhong_info: "每当你使用一张杀,可以摸一张牌。", + poyue: "破月", + poyue_info: "锁定技,你的黑杀无视距离,红色杀不计入回合内的出杀限制且不可闪避。", + poyue_info_alter: "锁定技,你的黑杀无视距离,红色杀不可闪避。", + mojian: "墨剑", + mojian_info: "每当你使用杀并指定目标后,你可以令其摸一张牌,然后你回复1点体力。", + duanyue: "断月", + duanyue_info: "出牌阶段限一次,你可以弃置一张装备牌,对一名其他角色造成1点伤害。", + tuzhen: "突阵", + tuzhen_info: "当你造成一次伤害后,你可以弃置对方手牌中的非基本牌。", + tuzhen_info_alter: "当你造成一次伤害后,你可以弃置对方手牌中的一张非基本牌。", + fengmo: "封魔", + fengmo_info: + "出牌阶段限一次,你可以弃置场所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面。", + pozhou: "破咒", + pozhou_bg: "破", + pozhou2: "破咒", + pozhou_info: + "每当你受到一次伤害,你获得一枚破咒标记。出牌阶段,你可以指定任意名其他角色并弃置等量的破咒标记,令目标的非锁定技失效直到其下一回合结束。", + xuanzhou: "玄咒", + xuanzhou_info: + "出牌阶段限一次,你可以将一张普通锦囊牌当作任意一张延时锦囊,对任意一名角色使用(无视锦囊使用范围限制)。", + ningxian: "凝霰", + ningxian_info: "每当你受到一次伤害,你可以弃置任意张黑色牌并选择等量其他角色对其各造成1点伤害。", + guanhu: "贯鹄", + guanhu_info: "每当你使用杀造成伤害,你可以弃置对方一张手牌和一张装备牌。", + chuanyang: "穿杨", + chuanyang_info: "每当你使用一张杀,若你不在目标的攻击范围,你可以令此杀不可闪避。", + fengming: "凤鸣", + fengming_info: "出牌阶段限一次,你可以弃置一张装备牌,令一名角色恢复1点体力并摸一张牌。", + duanxing: "锻星", + duanxing_info: "每当你装备一张未强化的装备牌,可以视为一名角色使用一张杀。", + wanjun: "万钧", + wanjun_info: "你可以将一张装备牌当作南蛮入侵使用。", + dunxing: "遁形", + dunxing_info: + "当你成为其他角色卡牌的目标时,你可以弃置一张牌并进行一次判定,若不为红桃,则取消之。", + guiying: "鬼影", + guiying_info: "你可以将一张黑色牌当偷梁换柱使用。", + shehun: "摄魂", + shehun_info: + "出牌阶段限一次,你可以弃置任意张花色不同的牌,另一名其他角色弃置等量的牌,若其弃置的牌中有牌的花色与你弃置的牌相同,你对其造成1点伤害。", - zhanlu:'沾露', - luomu:'落木', - jifeng:'魔影', - liaoyuan:'燎原', - huanhun:'唤魂', - daixing:'代形', - yishan:'异闪', - yishan2:'异闪', - swd_wuxie:'无邪', - lqingcheng:'倾城', - xianjiang:'仙匠', - xianjiang3:'仙匠', - shengong:'神工', - ningjian:'凝剑', - ningjian1:'凝剑', - ningjian2:'凝剑', - taixu:'太虚', - duoren:'夺刃', - tanlin:'探麟', - tanlin2:'探麟', - pozhen:'破阵', - yunchou:'运筹', - swdtianshu:'天书', - swdtianshu_bg:'书', - swdtianshu2:'天书', - xingdian:'星点', - luomei:'落梅', - yulin:'玉鳞', - funiao:'符鸟', - xuehuang:'血凰', - xuehuang_bg:'凰', - zhuyu:'朱羽', - ningshuang:'凝霜', - zaowu:'造物', + zhanlu: "沾露", + luomu: "落木", + jifeng: "魔影", + liaoyuan: "燎原", + huanhun: "唤魂", + daixing: "代形", + yishan: "异闪", + yishan2: "异闪", + swd_wuxie: "无邪", + lqingcheng: "倾城", + xianjiang: "仙匠", + xianjiang3: "仙匠", + shengong: "神工", + ningjian: "凝剑", + ningjian1: "凝剑", + ningjian2: "凝剑", + taixu: "太虚", + duoren: "夺刃", + tanlin: "探麟", + tanlin2: "探麟", + pozhen: "破阵", + yunchou: "运筹", + swdtianshu: "天书", + swdtianshu_bg: "书", + swdtianshu2: "天书", + xingdian: "星点", + luomei: "落梅", + yulin: "玉鳞", + funiao: "符鸟", + xuehuang: "血凰", + xuehuang_bg: "凰", + zhuyu: "朱羽", + ningshuang: "凝霜", + zaowu: "造物", // shouhua:'收化', - xielv:'谐率', - tianhuo:'天火', - huanyin:'幻音', - tianlun:'天轮', - hlongyin:'龙吟', - lanzhi:'兰芷', - duanyi:'断意', - miesheng:'灭生', - guxing:'孤星', - guxing1:'孤星', - guxing2:'孤星', - poxing:'破星', - mohua:'魔化', - miles_xueyi:'血裔', - wuying:'无影', - xiehun:'邪魂', - xiehun1:'邪魂', - xiehun2:'邪魂', - xiehun3:'邪魂', - jumo:'聚魔', - duijue:'对决', - duijue_bg:'决', - yueren:'月刃', - busi:'不死', - xuying:'虚影', - yinguo:'因果', - guiyan:'鬼眼', - guiyan2:'鬼眼', - swd_xiuluo:'修罗', - suiyan:'碎岩', - suiyan_info:'每当你造成一次伤害,可以弃置一张牌并弃置对方的全部装备牌。', - xianyin:'散结', - qiaoxie:'巧械', - qiaoxie2:'巧械', - qiaoxie3:'巧械', - qiaoxie4:'巧械', - mailun:'脉轮', - mailun31:'脉轮', - mailun32:'脉轮', - mailun41:'脉轮', - mailun42:'脉轮', - kunlunjing:'幻镜', - kunlunjing1:'幻镜', - kunlunjing2:'幻镜', - susheng:'苏生', - shengshou:'圣手', - huanjian:'幻箭', - huanjian_info:'出牌阶段,你可以将一张黑色牌当作冰魄针使用。', - shengshou_info:'你可以将一张黑色手牌当作草药使用。', - susheng_info:'在任意一名角色即将死亡时,你可以弃置一张手牌防止其死亡,并将其体力回复至1,每回合限发动一次。', - susheng_info_alter:'在任意一名角色即将死亡时,你可以弃置一张红色手牌防止其死亡,并将其体力回复至1,每回合限发动一次。', - zhanlu_info:'出牌阶段限一次,你可以弃置一张黑桃牌令至多3名角色各回复1点体力。', - kunlunjing_info:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置。', - kunlunjing_info_alter:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置,然后失去1点体力。', - swd_xiuluo_info:'准备阶段,你可以弃一张手牌来弃置你判断区里的一张延时类锦囊(必须花色相同)。', - xianyin_info:'出牌阶段,你可以令所有判定区内有牌的角色弃置判定区内的牌,然后交给你一张手牌。', - qiaoxie_info:'每当你装备一张牌,可摸一张牌;每当你失去一张装备牌(不含替换),你可以弃置其他角色的一张牌。', - mailun_info:'准备阶段,你可以选择一个脉轮效果直到下一回合开始。', - guiyan_info:'出牌阶段,你可以观看一名角色的手牌,并获得其中一张梅花牌,每阶段限一次。当你首次进入濒死状态时,你须回复1点体力并失去技能鬼眼。', - busi_info:'锁定技,当你进入濒死状态时,你进行一次判定,若结果不为黑桃,你将体力回复至1并将武将牌翻至背面。', - xuying_info:'锁定技,每当你即将受到伤害,你防止此伤害,若你此时有手牌,你失去1点体力。', - yinguo_info:'除你之外的任意一名角色即将受到受到伤害时,若有伤害来源,你可以弃置一张牌将伤害来源和目标对调。', - yueren_info:'每当你使用一张杀,可以进行一次判定,若结果为黑色,你弃置目标一张牌,若结果为红色,你将此杀收回,每回合限发动一次。', - duijue_info:'限定技,出牌阶段,你可以指定一名体力值大于1的其他角色,你结束出牌阶段,并在回合结束后将所有其他角色移出游戏,然后该角色与你轮流进行回合,直到有一方死亡或一共进行六个回合为止。', - wuying_info:'锁定技,你的杀和单体x锦囊目标锁定为范围内的所有角色。', - xiehun_info:'锁定技,受到来自你伤害的角色进入混乱状态,行为不受控制,且会攻击队友,直到你的下一回合开始。', - jumo_info:'锁定技,结束阶段,你摸X-1张牌,X为未进入混乱状态的角色数与进入混乱状态的角色数之差(若为双将则改为X)。', - jifeng_info:'你的杀和单体锦囊可以额外指定任意个目标,若如此做,此卡牌有一定机率失效,指定的目标越多失效的概率越大。', - mohua_info:'锁定技,在身份局中,当你进入濒死状态时,你立即变身为撒旦,体力上限变为现存角色数(至少为4),并成为其他所有角色的共同敌人。', - miles_xueyi_info:'锁定技,你防止即将受到的伤害,然后失去1点体力。', - duanyi_info:'出牌阶段限一次,你可以弃置两张杀,对一名角色造成1点伤害,然后其随机弃置X张牌,X为其已损失的体力值。', - duanyi_info_alter:'出牌阶段限一次,你可以弃置两张杀,并对一名角色造成1点伤害。', - guxing_info:'出牌阶段,你可以将最后至多X张手牌当杀使用,此杀无视距离且可以指定至多3个目标,每造成一次伤害,你摸一张牌,X为你已损失的体力值且至少为1。', - tianlun_info:'任意一名角色的判定牌生效前,你可以弃置一张场上角色的判定牌代替之。', - hlongyin_info:'出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次。', - lanzhi_info:'每当你使用一张梅花牌,你可以令所有体力值不大于你的角色回复1点体力。', - lanzhi_old_info:'每当你即将造成伤害,可以防止此伤害,然后摸两张牌。每回合限发动一次。', - tianhuo_info:'出牌阶段,你可以令所有角色弃置其判定区域内的牌,并受到没有来源的等量火焰伤害,每阶段限一次。', - huanyin_info:'锁定技,每当你成为其他角色的卡牌的目标时,你进行一次判定,若为黑桃则取消之,若为红桃你摸一张牌。', - luomu_info:'锁定技,每当你造成伤害时,受伤害角色随机弃置一张牌。', - poxing_info:'锁定技,每当你即将造成伤害,若目标的体力值大于你,你令伤害+1。', - liaoyuan_info:'每当你使用一张杀指定目标后,你可以弃置任意张与此杀花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此杀的伤害+1。', - liaoyuan_info_alter:'每当你使用一张杀指定目标后,你可以弃置一张与此杀花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此杀的伤害+1。', - yishan_info:'每当你受到一次伤害,你可以重新获得最近失去的两张牌。', - huanhun_info:'当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。', - huanhun_info_alter:'当一名角色进入濒死状态时,你可以弃置一张红色手牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。', - daixing_info:'结束阶段,你可以弃置任意张牌并获得等量的护甲;这些护甲将在你的下个准备阶段消失。', - swd_wuxie_info:'锁定技,你不能成为其他角色的延时锦囊的目标。', - lqingcheng_info:'结束阶段,你可以进行判定,若为红色则可以继续判定,最多判定3次,判定结束后将判定成功的牌收入手牌。', - xianjiang_old_info:'出牌阶段,你可以将一张装备牌永久转化为任意一张其它装备牌,一张牌在一个阶段只能转化一次。', - xianjiang_info:'出牌阶段限一次,你可以弃置一张锦囊牌并随机装备一件装备。', - xianjiang_info_alter:'出牌阶段限一次,若你装备内没有牌,你可以弃置一张锦囊牌并随机装备一件装备。', - shengong_info:'每当你需要打出一张杀或闪时,你可以弃置一名其他角色装备区内的一张武器牌或防具牌,视为打出一张杀或闪,然后该角色摸一张牌,你弃一张牌。', - ningjian_info:'你可以将一张红色牌当闪、黑色牌当杀使用或打出。', - taixu_info:'限定技,你可以弃置你的所有牌(至少1张),并对一名体力值大于1为其他角色造成X点火焰伤害,X为你已损失的体力值且至少为1。', - duoren_info:'每当你闪避一张杀,你可以立即获得来源的武器牌。', - tanlin_info:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得双方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。', - tanlin_info_alter:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得对方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。', - pozhen_info:'每当你受到一次伤害,若你的手牌数大于伤害来源,你可以弃置X张手牌对其造成1点伤害;若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。', - pozhen_info_alter:'每当你受到一次伤害,若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。', - yunchou_info:'出牌阶段限一次,你可以弃置一张手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌。', - yunchou_info_alter:'出牌阶段限一次,你可以弃置一张非基本手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌。', - swdtianshu_old_info:'结束阶段,你可以弃置一张牌并从三名随机武将中选择一个,在2X回合后你将其所有技能加入你的天书列表,X为其技能数;在技能加入天书列表时,或于出牌阶段,你可以装备一项天书列表中的技能。', - swdtianshu_info:'出牌阶段,你可以弃置一张锦囊牌,然后获得一名其他角色的一项技能直到该角色死亡(替换以此法获得的前一个技能)。', - zaowu_info:'出牌阶段限一次,你可以将一张黑桃或红桃手牌当作封印之蛋使用。', - luomei_info:'每当你使用或打出一张梅花花色的牌,你可以摸一张牌。', - xingdian_info:'出牌阶段限一次,你可以弃置一张手牌,然后随机弃置两名敌人各一张牌。', - yulin_info:'每当你即将受到伤害,你可以弃置一张装备牌抵消此伤害。', - funiao_info:'出牌阶段限一次,你可以将一张手牌交给一名其他角色,然后摸一张牌并观看其手牌。', - funiao_old_info:'出牌阶段,你可以交给一名角色一张手牌,然后观看其手牌,每个阶段对一名角色只能发动一次。', - xuehuang_info:'限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火杀,随机指定两名敌人为目标。', - zhuyu_info:'每当一名横置的角色即将受到伤害时,你可以弃置一张红色牌令此伤害+1并变为火属性。', - ningshuang_info:'每当你成为黑色牌的目标,你可以弃置一张黑色牌将其横置,并摸一张牌,若其已经模置则改为将其翻面。', - zaowu_old_info:'出牌阶段,你可以弃置三张不同类型的牌,创造任意两张牌并获得之。', - xielv_info:'弃牌阶段结束后,若你的所有手牌(至少两张)颜色均相同,你可以展示所有手牌,然后回复1点体力并弃置场上的所有判定牌。', + xielv: "谐率", + tianhuo: "天火", + huanyin: "幻音", + tianlun: "天轮", + hlongyin: "龙吟", + lanzhi: "兰芷", + duanyi: "断意", + miesheng: "灭生", + guxing: "孤星", + guxing1: "孤星", + guxing2: "孤星", + poxing: "破星", + mohua: "魔化", + miles_xueyi: "血裔", + wuying: "无影", + xiehun: "邪魂", + xiehun1: "邪魂", + xiehun2: "邪魂", + xiehun3: "邪魂", + jumo: "聚魔", + duijue: "对决", + duijue_bg: "决", + yueren: "月刃", + busi: "不死", + xuying: "虚影", + yinguo: "因果", + guiyan: "鬼眼", + guiyan2: "鬼眼", + swd_xiuluo: "修罗", + suiyan: "碎岩", + suiyan_info: "每当你造成一次伤害,可以弃置一张牌并弃置对方的全部装备牌。", + xianyin: "散结", + qiaoxie: "巧械", + qiaoxie2: "巧械", + qiaoxie3: "巧械", + qiaoxie4: "巧械", + mailun: "脉轮", + mailun31: "脉轮", + mailun32: "脉轮", + mailun41: "脉轮", + mailun42: "脉轮", + kunlunjing: "幻镜", + kunlunjing1: "幻镜", + kunlunjing2: "幻镜", + susheng: "苏生", + shengshou: "圣手", + huanjian: "幻箭", + huanjian_info: "出牌阶段,你可以将一张黑色牌当作冰魄针使用。", + shengshou_info: "你可以将一张黑色手牌当作草药使用。", + susheng_info: + "在任意一名角色即将死亡时,你可以弃置一张手牌防止其死亡,并将其体力回复至1,每回合限发动一次。", + susheng_info_alter: + "在任意一名角色即将死亡时,你可以弃置一张红色手牌防止其死亡,并将其体力回复至1,每回合限发动一次。", + zhanlu_info: "出牌阶段限一次,你可以弃置一张黑桃牌令至多3名角色各回复1点体力。", + kunlunjing_info: + "准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置。", + kunlunjing_info_alter: + "准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置,然后失去1点体力。", + swd_xiuluo_info: "准备阶段,你可以弃一张手牌来弃置你判断区里的一张延时类锦囊(必须花色相同)。", + xianyin_info: "出牌阶段,你可以令所有判定区内有牌的角色弃置判定区内的牌,然后交给你一张手牌。", + qiaoxie_info: + "每当你装备一张牌,可摸一张牌;每当你失去一张装备牌(不含替换),你可以弃置其他角色的一张牌。", + mailun_info: "准备阶段,你可以选择一个脉轮效果直到下一回合开始。", + guiyan_info: + "出牌阶段,你可以观看一名角色的手牌,并获得其中一张梅花牌,每阶段限一次。当你首次进入濒死状态时,你须回复1点体力并失去技能鬼眼。", + busi_info: + "锁定技,当你进入濒死状态时,你进行一次判定,若结果不为黑桃,你将体力回复至1并将武将牌翻至背面。", + xuying_info: "锁定技,每当你即将受到伤害,你防止此伤害,若你此时有手牌,你失去1点体力。", + yinguo_info: + "除你之外的任意一名角色即将受到受到伤害时,若有伤害来源,你可以弃置一张牌将伤害来源和目标对调。", + yueren_info: + "每当你使用一张杀,可以进行一次判定,若结果为黑色,你弃置目标一张牌,若结果为红色,你将此杀收回,每回合限发动一次。", + duijue_info: + "限定技,出牌阶段,你可以指定一名体力值大于1的其他角色,你结束出牌阶段,并在回合结束后将所有其他角色移出游戏,然后该角色与你轮流进行回合,直到有一方死亡或一共进行六个回合为止。", + wuying_info: "锁定技,你的杀和单体x锦囊目标锁定为范围内的所有角色。", + xiehun_info: + "锁定技,受到来自你伤害的角色进入混乱状态,行为不受控制,且会攻击队友,直到你的下一回合开始。", + jumo_info: + "锁定技,结束阶段,你摸X-1张牌,X为未进入混乱状态的角色数与进入混乱状态的角色数之差(若为双将则改为X)。", + jifeng_info: + "你的杀和单体锦囊可以额外指定任意个目标,若如此做,此卡牌有一定机率失效,指定的目标越多失效的概率越大。", + mohua_info: + "锁定技,在身份局中,当你进入濒死状态时,你立即变身为撒旦,体力上限变为现存角色数(至少为4),并成为其他所有角色的共同敌人。", + miles_xueyi_info: "锁定技,你防止即将受到的伤害,然后失去1点体力。", + duanyi_info: + "出牌阶段限一次,你可以弃置两张杀,对一名角色造成1点伤害,然后其随机弃置X张牌,X为其已损失的体力值。", + duanyi_info_alter: "出牌阶段限一次,你可以弃置两张杀,并对一名角色造成1点伤害。", + guxing_info: + "出牌阶段,你可以将最后至多X张手牌当杀使用,此杀无视距离且可以指定至多3个目标,每造成一次伤害,你摸一张牌,X为你已损失的体力值且至少为1。", + tianlun_info: "任意一名角色的判定牌生效前,你可以弃置一张场上角色的判定牌代替之。", + hlongyin_info: + "出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次。", + lanzhi_info: "每当你使用一张梅花牌,你可以令所有体力值不大于你的角色回复1点体力。", + lanzhi_old_info: "每当你即将造成伤害,可以防止此伤害,然后摸两张牌。每回合限发动一次。", + tianhuo_info: + "出牌阶段,你可以令所有角色弃置其判定区域内的牌,并受到没有来源的等量火焰伤害,每阶段限一次。", + huanyin_info: + "锁定技,每当你成为其他角色的卡牌的目标时,你进行一次判定,若为黑桃则取消之,若为红桃你摸一张牌。", + luomu_info: "锁定技,每当你造成伤害时,受伤害角色随机弃置一张牌。", + poxing_info: "锁定技,每当你即将造成伤害,若目标的体力值大于你,你令伤害+1。", + liaoyuan_info: + "每当你使用一张杀指定目标后,你可以弃置任意张与此杀花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此杀的伤害+1。", + liaoyuan_info_alter: + "每当你使用一张杀指定目标后,你可以弃置一张与此杀花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此杀的伤害+1。", + yishan_info: "每当你受到一次伤害,你可以重新获得最近失去的两张牌。", + huanhun_info: + "当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。", + huanhun_info_alter: + "当一名角色进入濒死状态时,你可以弃置一张红色手牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。", + daixing_info: "结束阶段,你可以弃置任意张牌并获得等量的护甲;这些护甲将在你的下个准备阶段消失。", + swd_wuxie_info: "锁定技,你不能成为其他角色的延时锦囊的目标。", + lqingcheng_info: + "结束阶段,你可以进行判定,若为红色则可以继续判定,最多判定3次,判定结束后将判定成功的牌收入手牌。", + xianjiang_old_info: + "出牌阶段,你可以将一张装备牌永久转化为任意一张其它装备牌,一张牌在一个阶段只能转化一次。", + xianjiang_info: "出牌阶段限一次,你可以弃置一张锦囊牌并随机装备一件装备。", + xianjiang_info_alter: + "出牌阶段限一次,若你装备内没有牌,你可以弃置一张锦囊牌并随机装备一件装备。", + shengong_info: + "每当你需要打出一张杀或闪时,你可以弃置一名其他角色装备区内的一张武器牌或防具牌,视为打出一张杀或闪,然后该角色摸一张牌,你弃一张牌。", + ningjian_info: "你可以将一张红色牌当闪、黑色牌当杀使用或打出。", + taixu_info: + "限定技,你可以弃置你的所有牌(至少1张),并对一名体力值大于1为其他角色造成X点火焰伤害,X为你已损失的体力值且至少为1。", + duoren_info: "每当你闪避一张杀,你可以立即获得来源的武器牌。", + tanlin_info: + "出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得双方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。", + tanlin_info_alter: + "出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得对方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。", + pozhen_info: + "每当你受到一次伤害,若你的手牌数大于伤害来源,你可以弃置X张手牌对其造成1点伤害;若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。", + pozhen_info_alter: + "每当你受到一次伤害,若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。", + yunchou_info: + "出牌阶段限一次,你可以弃置一张手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌。", + yunchou_info_alter: + "出牌阶段限一次,你可以弃置一张非基本手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌。", + swdtianshu_old_info: + "结束阶段,你可以弃置一张牌并从三名随机武将中选择一个,在2X回合后你将其所有技能加入你的天书列表,X为其技能数;在技能加入天书列表时,或于出牌阶段,你可以装备一项天书列表中的技能。", + swdtianshu_info: + "出牌阶段,你可以弃置一张锦囊牌,然后获得一名其他角色的一项技能直到该角色死亡(替换以此法获得的前一个技能)。", + zaowu_info: "出牌阶段限一次,你可以将一张黑桃或红桃手牌当作封印之蛋使用。", + luomei_info: "每当你使用或打出一张梅花花色的牌,你可以摸一张牌。", + xingdian_info: "出牌阶段限一次,你可以弃置一张手牌,然后随机弃置两名敌人各一张牌。", + yulin_info: "每当你即将受到伤害,你可以弃置一张装备牌抵消此伤害。", + funiao_info: "出牌阶段限一次,你可以将一张手牌交给一名其他角色,然后摸一张牌并观看其手牌。", + funiao_old_info: + "出牌阶段,你可以交给一名角色一张手牌,然后观看其手牌,每个阶段对一名角色只能发动一次。", + xuehuang_info: + "限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火杀,随机指定两名敌人为目标。", + zhuyu_info: "每当一名横置的角色即将受到伤害时,你可以弃置一张红色牌令此伤害+1并变为火属性。", + ningshuang_info: + "每当你成为黑色牌的目标,你可以弃置一张黑色牌将其横置,并摸一张牌,若其已经模置则改为将其翻面。", + zaowu_old_info: "出牌阶段,你可以弃置三张不同类型的牌,创造任意两张牌并获得之。", + xielv_info: + "弃牌阶段结束后,若你的所有手牌(至少两张)颜色均相同,你可以展示所有手牌,然后回复1点体力并弃置场上的所有判定牌。", }, }; }); diff --git a/character/tw.js b/character/tw.js index a2ab9940d..46c2102a1 100644 --- a/character/tw.js +++ b/character/tw.js @@ -1,2477 +1,3326 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'tw', - connect:true, - characterSort:{ - tw:{ - tw_sp:['tw_yanliang','tw_wenchou','tw_yuantan','tw_zhangzhao','tw_zhanghong','tw_fuwan','tw_yujin','tw_zhaoxiang','tw_hucheer','tw_hejin','tw_mayunlu','tw_re_caohong','tw_zangba','tw_liuhong','tw_tianyu','jiachong','duosidawang','wuban','yuejiu','tw_caocao','tw_zhangmancheng','tw_caozhao','tw_wangchang','tw_puyangxing','tw_jiangji','tw_niujin','tw_xiahouen','tw_xiahoushang','tw_zhangji','tw_zhangnan','tw_fengxí','tw_furong','tw_liwei','tw_yangyi','tw_daxiaoqiao','tw_dengzhi','tw_baoxin','tw_bingyuan','tw_fanchou','tw_haomeng','tw_huchuquan','tw_jianshuo','tw_jiling','tw_liufuren','tw_liuzhang','tw_mateng','tw_niufudongxie','tw_qiaorui','tw_weixu','tw_yanxiang','tw_yufuluo','tw_zhangning','tw_dengzhi','tw_yangyi','tw_yangang','tw_gongsunfan'], - tw_yunchouzhi:['tw_wangcan','tw_dongzhao','tw_bianfuren','tw_feiyi','tw_chenzhen','tw_xunchen'], - tw_yunchouxin:['tw_wangling','tw_huojun','tw_wujing','tw_zhouchu'], - tw_yunchouren:['tw_xujing','tw_qiaogong'], - tw_yunchouyong:['tw_zongyu','tw_chendong','tw_sunyi'], - tw_yunchouyan:['tw_jiangqing'], - tw_zhu:['tw_beimihu','tw_ol_sunjian','ol_liuyu','tw_menghuo'], - tw_swordsman:['xia_yuzhenzi','xia_shie','xia_shitao','xia_guanyu','xia_liubei','xia_xiahousone','xia_xiahoudun','xia_zhangwei','xia_xushu','xia_wangyue','xia_liyàn','xia_tongyuan','xia_lusu','xia_dianwei','xia_zhaoe','xia_xiahouzie'], - tw_mobile:['nashime','tw_gexuan','tw_zhugeguo'], - tw_mobile2:['tw_chengpu','tw_guohuai','old_quancong','tw_caoxiu','tw_guanqiujian','tw_re_fazheng','tw_madai','tw_zhangfei','tw_guyong','tw_handang','tw_xuezong','tw_yl_luzhi'], - tw_yijiang:['tw_caoang','tw_caohong','tw_zumao','tw_dingfeng','tw_maliang','tw_xiahouba'], - tw_english:['kaisa'], + name: "tw", + connect: true, + characterSort: { + tw: { + tw_sp: [ + "tw_yanliang", + "tw_wenchou", + "tw_yuantan", + "tw_zhangzhao", + "tw_zhanghong", + "tw_fuwan", + "tw_yujin", + "tw_zhaoxiang", + "tw_hucheer", + "tw_hejin", + "tw_mayunlu", + "tw_re_caohong", + "tw_zangba", + "tw_liuhong", + "tw_tianyu", + "jiachong", + "duosidawang", + "wuban", + "yuejiu", + "tw_caocao", + "tw_zhangmancheng", + "tw_caozhao", + "tw_wangchang", + "tw_puyangxing", + "tw_jiangji", + "tw_niujin", + "tw_xiahouen", + "tw_xiahoushang", + "tw_zhangji", + "tw_zhangnan", + "tw_fengxí", + "tw_furong", + "tw_liwei", + "tw_yangyi", + "tw_daxiaoqiao", + "tw_dengzhi", + "tw_baoxin", + "tw_bingyuan", + "tw_fanchou", + "tw_haomeng", + "tw_huchuquan", + "tw_jianshuo", + "tw_jiling", + "tw_liufuren", + "tw_liuzhang", + "tw_mateng", + "tw_niufudongxie", + "tw_qiaorui", + "tw_weixu", + "tw_yanxiang", + "tw_yufuluo", + "tw_zhangning", + "tw_dengzhi", + "tw_yangyi", + "tw_yangang", + "tw_gongsunfan", + ], + tw_yunchouzhi: [ + "tw_wangcan", + "tw_dongzhao", + "tw_bianfuren", + "tw_feiyi", + "tw_chenzhen", + "tw_xunchen", + ], + tw_yunchouxin: ["tw_wangling", "tw_huojun", "tw_wujing", "tw_zhouchu"], + tw_yunchouren: ["tw_xujing", "tw_qiaogong"], + tw_yunchouyong: ["tw_zongyu", "tw_chendong", "tw_sunyi"], + tw_yunchouyan: ["tw_jiangqing"], + tw_zhu: ["tw_beimihu", "tw_ol_sunjian", "ol_liuyu", "tw_menghuo"], + tw_swordsman: [ + "xia_yuzhenzi", + "xia_shie", + "xia_shitao", + "xia_guanyu", + "xia_liubei", + "xia_xiahousone", + "xia_xiahoudun", + "xia_zhangwei", + "xia_xushu", + "xia_wangyue", + "xia_liyàn", + "xia_tongyuan", + "xia_lusu", + "xia_dianwei", + "xia_zhaoe", + "xia_xiahouzie", + ], + tw_mobile: ["nashime", "tw_gexuan", "tw_zhugeguo"], + tw_mobile2: [ + "tw_chengpu", + "tw_guohuai", + "old_quancong", + "tw_caoxiu", + "tw_guanqiujian", + "tw_re_fazheng", + "tw_madai", + "tw_zhangfei", + "tw_guyong", + "tw_handang", + "tw_xuezong", + "tw_yl_luzhi", + ], + tw_yijiang: [ + "tw_caoang", + "tw_caohong", + "tw_zumao", + "tw_dingfeng", + "tw_maliang", + "tw_xiahouba", + ], + tw_english: ["kaisa"], }, }, - character:{ - tw_yanliang:['male','qun',4,['twduwang','twylyanshi']], - tw_wenchou:['male','qun',4,['twjuexing','twxiayong']], - tw_yuantan:['male','qun',4,['twqiaosi','twbaizu']], - xia_yuzhenzi:['male','qun',3,['twhuajing','twtianshou']], - xia_shie:['male','wei',4,['twdengjian','twxinshou']], - xia_shitao:['male','qun',4,['twjieqiu','twenchou']], - xia_guanyu:['male','qun',4,['twzhongyi','twchue']], - xia_liubei:['male','shu',4,['twshenyi','twxinghan']], - xia_xiahousone:['female','qun',3,['twchengxi']], - xia_xiahoudun:['male','qun',4,['twdanlie']], - xia_zhangwei:['female','qun',3,['twhuzhong','twfenwang']], - tw_zhanghong:['male','wu',3,['twquanqian','twrouke']], - tw_zhangzhao:['male','wu',3,['twlijian','twchungang']], - tw_ol_sunjian:['male','wu','4/5',['gzyinghun','wulie','twpolu'],['zhu']], - tw_menghuo:['male','qun',4,['huoshou','rezaiqi','twqiushou'],['zhu']], - ol_liuyu:['male','qun',2,['zongzuo','zhige','twchongwang'],['zhu']], - tw_gongsunfan:['male','qun',4,['twhuiyuan','twshoushou']], - tw_yangang:['male','qun',4,['twzhiqu','twxianfeng']], - xia_xiahouzie:['female','qun','3/4',['twxuechang','twduoren']], - xia_zhaoe:['female','qun',3,['twyanshi','twrenchou']], - xia_lusu:['male','qun',4,['twkaizeng','twyangming']], - xia_dianwei:['male','qun',4,['twliexi','twshezhong']], - tw_bingyuan:['male','qun',3,['twbingde','twqingtao']], - tw_niufudongxie:['double','qun',4,['twjuntun','twxiongxi','twxiafeng']], - tw_jianshuo:['male','qun',6,['twkunsi']], - tw_jiangji:['male','wei',3,['twjichou','twjilun']], - tw_mateng:['male','qun',4,['mashu','twxiongzheng','twluannian'],['zhu']], - tw_baoxin:['male','qun',4,['twmutao','twyimou']], - tw_liufuren:['female','qun',3,['twzhuidu','twshigong']], - tw_yufuluo:['male','qun',6,['twjiekuang','twneirao']], - tw_fengxí:['male','shu',4,['twqingkou']], - tw_zhangji:['male','wei',3,['twdingzhen','twyouye']], - tw_zhangnan:['male','shu',4,['twfenwu']], - tw_huchuquan:['male','qun',4,['twfupan']], - tw_liwei:['male','shu',4,['twjiaohua']], - tw_yanxiang:['male','qun',3,['twkujian','twruilian']], - tw_xiahouen:['male','wei',5,['twfujian','twjianwei']], - tw_xiahoushang:['male','wei',4,['twtanfeng']], - tw_qiaorui:['male','qun',5,['twxiawei','twqiongji']], - tw_haomeng:['male','qun',4,['twgongge']], - tw_weixu:['male','qun',4,['twsuizheng','twtuidao']], - xia_xushu:['male','qun',4,['twjiange','twxiawang']], - xia_wangyue:['male','qun',4,['twyulong','twjianming']], - xia_liyàn:['male','qun',4,['twzhenhu','twlvren']], - xia_tongyuan:['male','qun',4,['twchaofeng','twchuanshu']], - tw_zhangning:['female','qun',3,['twxingzhui','twjuchen']], - tw_yangyi:['male','shu',3,['duoduan','twgongsun']], - tw_dengzhi:['male','shu',3,['twjimeng','shuaiyan']], - tw_wangling:['male','wei',4,['twmibei','twxingqi'],['clan:太原王氏']], - tw_zhugeguo:['female','shu',3,['twqirang','twyuhua']], - tw_fanchou:['male','qun',4,['twxingluan']], - tw_xujing:['male','shu',3,['twboming','twejian']], - tw_zhangfei:['male','shu',4,['new_repaoxiao','twxuhe']], - tw_xuezong:['male','wu',3,['funan','twjiexun']], - tw_xunchen:['male','qun',3,['twweipo','mjchenshi','twmouzhi']], - tw_jiangqing:['male','wu',4,['twshangyi','twxiangyu']], - tw_guyong:['male','wu',3,['twgyshenxing','twbingyi']], - tw_chendong:['male','wu',4,['twyilie','twfenming']], - tw_handang:['male','wu',4,['twgongji','twjiefan']], - tw_jiling:['male','qun',4,['twshuangren']], - tw_re_fazheng:['male','shu',3,['twxuanhuo','twenyuan']], - tw_madai:['male','shu',4,['mashu','twqianxi']], - tw_niujin:['male','wei',4,['twcuorui','twliewei']], - tw_guanqiujian:['male','wei',3,['twzhengrong','twhongju']], - tw_daxiaoqiao:['female','wu',3,['twxingwu','twpingting'],['tempname:daxiaoqiao']], - tw_furong:['male','shu',4,['twxuewei','twliechi']], - tw_yl_luzhi:['male','qun',3,['twmingren','twzhenliang']], - tw_liuzhang:['male','qun',3,['jutu','twyaohu','rehuaibi']], - tw_zongyu:['male','shu',3,['twzhibian','twyuyan']], - tw_zhouchu:['male','wu',4,['twguoyi','twchuhai']], - tw_qiaogong:['male','wu',3,['twyizhu','twluanchou']], - tw_feiyi:['male','shu',3,['twshengxi','twkuanji']], - tw_bianfuren:['female','wei',3,['twwanwei','twyuejian']], - tw_chenzhen:['male','shu',3,['twmuyue','twchayi']], - tw_caoxiu:['male','wei',4,['twqianju','twqingxi']], - tw_sunyi:['male','wu',4,['twzaoli']], - tw_puyangxing:['male','wu',4,['twzhengjian','twzhongchi']], - tw_tianyu:['male','wei',4,['twzhenxi','twyangshi']], - old_quancong:['male','wu',4,['zhenshan']], - tw_wujing:['male','wu',4,['twfenghan','twcongji']], - tw_wangcan:['male','wei',3,['twdianyi','twyingji','twshanghe']], - tw_wangchang:['male','wei',3,['twkaiji','twshepan'],['clan:太原王氏']], - tw_caozhao:['male','wei',4,['twfuzuan','twchongqi']], - tw_guohuai:["male","wei",4,["twjingce","yuzhang"]], - tw_chengpu:['male','wu',4,['twlihuo','twchunlao']], - tw_zhangmancheng:['male','qun',4,['twfengji','twyiju','twbudao']], - tw_caocao:['male','qun',4,['twlingfa']], - tw_liuhong:['male','qun',4,['twyujue','twgezhi','twfengqi'],['zhu']], - tw_huojun:['male','shu',4,['twsidai','twjieyu']], - tw_zangba:['male','wei',4,['twhanyu','twhengjiang']], - tw_re_caohong:['male','wei',4,['twyuanhu','twjuezhu']], - tw_mayunlu:['female','shu',4,['mashu','twfengpo']], - tw_hejin:['male','qun',4,['twmouzhu','twyanhuo']], - tw_hucheer:['male','qun',4,['twshenxing','twdaoji']], - tw_yujin:['male','qun',4,['xinzhenjun']], - tw_fuwan:['male','qun',4,['twmoukui']], - tw_zhaoxiang:['female','shu',4,['refanghun','twfuhan','twqueshi']], - yuejiu:['male','qun',4,['cuijin']], - wuban:['male','shu',4,['jintao'],['clan:陈留吴氏']], - duosidawang:['male','qun','4/5',['equan','manji']], - jiachong:['male','qun',3,['beini','dingfa']], - tw_dongzhao:['male','wei',3,['twmiaolve','twyingjia']], - tw_gexuan:['male','qun',3,['twdanfa','twlingbao','twsidao']], - tw_beimihu:['female','qun',3,['zongkui','guju','baijia','bingzhao'],['zhu']], - nashime:['male','qun',3,['chijie','waishi','renshe']], - tw_xiahouba:['male','shu',4,['twyanqin','twbaobian']], - tw_zumao:['male','wu',4,['twtijin']], - tw_caoang:['male','wei',4,['twxiaolian']], - tw_dingfeng:['male','wu',4,['twqijia','twzhuchen']], - tw_caohong:['male','wei',4,['twhuzhu','twliancai']], - tw_maliang:['male','shu',3,['twrangyi','twbaimei']], - kaisa:["male","western",4,["zhengfu"]], + character: { + tw_yanliang: ["male", "qun", 4, ["twduwang", "twylyanshi"]], + tw_wenchou: ["male", "qun", 4, ["twjuexing", "twxiayong"]], + tw_yuantan: ["male", "qun", 4, ["twqiaosi", "twbaizu"]], + xia_yuzhenzi: ["male", "qun", 3, ["twhuajing", "twtianshou"]], + xia_shie: ["male", "wei", 4, ["twdengjian", "twxinshou"]], + xia_shitao: ["male", "qun", 4, ["twjieqiu", "twenchou"]], + xia_guanyu: ["male", "qun", 4, ["twzhongyi", "twchue"]], + xia_liubei: ["male", "shu", 4, ["twshenyi", "twxinghan"]], + xia_xiahousone: ["female", "qun", 3, ["twchengxi"]], + xia_xiahoudun: ["male", "qun", 4, ["twdanlie"]], + xia_zhangwei: ["female", "qun", 3, ["twhuzhong", "twfenwang"]], + tw_zhanghong: ["male", "wu", 3, ["twquanqian", "twrouke"]], + tw_zhangzhao: ["male", "wu", 3, ["twlijian", "twchungang"]], + tw_ol_sunjian: ["male", "wu", "4/5", ["gzyinghun", "wulie", "twpolu"], ["zhu"]], + tw_menghuo: ["male", "qun", 4, ["huoshou", "rezaiqi", "twqiushou"], ["zhu"]], + ol_liuyu: ["male", "qun", 2, ["zongzuo", "zhige", "twchongwang"], ["zhu"]], + tw_gongsunfan: ["male", "qun", 4, ["twhuiyuan", "twshoushou"]], + tw_yangang: ["male", "qun", 4, ["twzhiqu", "twxianfeng"]], + xia_xiahouzie: ["female", "qun", "3/4", ["twxuechang", "twduoren"]], + xia_zhaoe: ["female", "qun", 3, ["twyanshi", "twrenchou"]], + xia_lusu: ["male", "qun", 4, ["twkaizeng", "twyangming"]], + xia_dianwei: ["male", "qun", 4, ["twliexi", "twshezhong"]], + tw_bingyuan: ["male", "qun", 3, ["twbingde", "twqingtao"]], + tw_niufudongxie: ["double", "qun", 4, ["twjuntun", "twxiongxi", "twxiafeng"]], + tw_jianshuo: ["male", "qun", 6, ["twkunsi"]], + tw_jiangji: ["male", "wei", 3, ["twjichou", "twjilun"]], + tw_mateng: ["male", "qun", 4, ["mashu", "twxiongzheng", "twluannian"], ["zhu"]], + tw_baoxin: ["male", "qun", 4, ["twmutao", "twyimou"]], + tw_liufuren: ["female", "qun", 3, ["twzhuidu", "twshigong"]], + tw_yufuluo: ["male", "qun", 6, ["twjiekuang", "twneirao"]], + tw_fengxí: ["male", "shu", 4, ["twqingkou"]], + tw_zhangji: ["male", "wei", 3, ["twdingzhen", "twyouye"]], + tw_zhangnan: ["male", "shu", 4, ["twfenwu"]], + tw_huchuquan: ["male", "qun", 4, ["twfupan"]], + tw_liwei: ["male", "shu", 4, ["twjiaohua"]], + tw_yanxiang: ["male", "qun", 3, ["twkujian", "twruilian"]], + tw_xiahouen: ["male", "wei", 5, ["twfujian", "twjianwei"]], + tw_xiahoushang: ["male", "wei", 4, ["twtanfeng"]], + tw_qiaorui: ["male", "qun", 5, ["twxiawei", "twqiongji"]], + tw_haomeng: ["male", "qun", 4, ["twgongge"]], + tw_weixu: ["male", "qun", 4, ["twsuizheng", "twtuidao"]], + xia_xushu: ["male", "qun", 4, ["twjiange", "twxiawang"]], + xia_wangyue: ["male", "qun", 4, ["twyulong", "twjianming"]], + xia_liyàn: ["male", "qun", 4, ["twzhenhu", "twlvren"]], + xia_tongyuan: ["male", "qun", 4, ["twchaofeng", "twchuanshu"]], + tw_zhangning: ["female", "qun", 3, ["twxingzhui", "twjuchen"]], + tw_yangyi: ["male", "shu", 3, ["duoduan", "twgongsun"]], + tw_dengzhi: ["male", "shu", 3, ["twjimeng", "shuaiyan"]], + tw_wangling: ["male", "wei", 4, ["twmibei", "twxingqi"], ["clan:太原王氏"]], + tw_zhugeguo: ["female", "shu", 3, ["twqirang", "twyuhua"]], + tw_fanchou: ["male", "qun", 4, ["twxingluan"]], + tw_xujing: ["male", "shu", 3, ["twboming", "twejian"]], + tw_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "twxuhe"]], + tw_xuezong: ["male", "wu", 3, ["funan", "twjiexun"]], + tw_xunchen: ["male", "qun", 3, ["twweipo", "mjchenshi", "twmouzhi"]], + tw_jiangqing: ["male", "wu", 4, ["twshangyi", "twxiangyu"]], + tw_guyong: ["male", "wu", 3, ["twgyshenxing", "twbingyi"]], + tw_chendong: ["male", "wu", 4, ["twyilie", "twfenming"]], + tw_handang: ["male", "wu", 4, ["twgongji", "twjiefan"]], + tw_jiling: ["male", "qun", 4, ["twshuangren"]], + tw_re_fazheng: ["male", "shu", 3, ["twxuanhuo", "twenyuan"]], + tw_madai: ["male", "shu", 4, ["mashu", "twqianxi"]], + tw_niujin: ["male", "wei", 4, ["twcuorui", "twliewei"]], + tw_guanqiujian: ["male", "wei", 3, ["twzhengrong", "twhongju"]], + tw_daxiaoqiao: ["female", "wu", 3, ["twxingwu", "twpingting"], ["tempname:daxiaoqiao"]], + tw_furong: ["male", "shu", 4, ["twxuewei", "twliechi"]], + tw_yl_luzhi: ["male", "qun", 3, ["twmingren", "twzhenliang"]], + tw_liuzhang: ["male", "qun", 3, ["jutu", "twyaohu", "rehuaibi"]], + tw_zongyu: ["male", "shu", 3, ["twzhibian", "twyuyan"]], + tw_zhouchu: ["male", "wu", 4, ["twguoyi", "twchuhai"]], + tw_qiaogong: ["male", "wu", 3, ["twyizhu", "twluanchou"]], + tw_feiyi: ["male", "shu", 3, ["twshengxi", "twkuanji"]], + tw_bianfuren: ["female", "wei", 3, ["twwanwei", "twyuejian"]], + tw_chenzhen: ["male", "shu", 3, ["twmuyue", "twchayi"]], + tw_caoxiu: ["male", "wei", 4, ["twqianju", "twqingxi"]], + tw_sunyi: ["male", "wu", 4, ["twzaoli"]], + tw_puyangxing: ["male", "wu", 4, ["twzhengjian", "twzhongchi"]], + tw_tianyu: ["male", "wei", 4, ["twzhenxi", "twyangshi"]], + old_quancong: ["male", "wu", 4, ["zhenshan"]], + tw_wujing: ["male", "wu", 4, ["twfenghan", "twcongji"]], + tw_wangcan: ["male", "wei", 3, ["twdianyi", "twyingji", "twshanghe"]], + tw_wangchang: ["male", "wei", 3, ["twkaiji", "twshepan"], ["clan:太原王氏"]], + tw_caozhao: ["male", "wei", 4, ["twfuzuan", "twchongqi"]], + tw_guohuai: ["male", "wei", 4, ["twjingce", "yuzhang"]], + tw_chengpu: ["male", "wu", 4, ["twlihuo", "twchunlao"]], + tw_zhangmancheng: ["male", "qun", 4, ["twfengji", "twyiju", "twbudao"]], + tw_caocao: ["male", "qun", 4, ["twlingfa"]], + tw_liuhong: ["male", "qun", 4, ["twyujue", "twgezhi", "twfengqi"], ["zhu"]], + tw_huojun: ["male", "shu", 4, ["twsidai", "twjieyu"]], + tw_zangba: ["male", "wei", 4, ["twhanyu", "twhengjiang"]], + tw_re_caohong: ["male", "wei", 4, ["twyuanhu", "twjuezhu"]], + tw_mayunlu: ["female", "shu", 4, ["mashu", "twfengpo"]], + tw_hejin: ["male", "qun", 4, ["twmouzhu", "twyanhuo"]], + tw_hucheer: ["male", "qun", 4, ["twshenxing", "twdaoji"]], + tw_yujin: ["male", "qun", 4, ["xinzhenjun"]], + tw_fuwan: ["male", "qun", 4, ["twmoukui"]], + tw_zhaoxiang: ["female", "shu", 4, ["refanghun", "twfuhan", "twqueshi"]], + yuejiu: ["male", "qun", 4, ["cuijin"]], + wuban: ["male", "shu", 4, ["jintao"], ["clan:陈留吴氏"]], + duosidawang: ["male", "qun", "4/5", ["equan", "manji"]], + jiachong: ["male", "qun", 3, ["beini", "dingfa"]], + tw_dongzhao: ["male", "wei", 3, ["twmiaolve", "twyingjia"]], + tw_gexuan: ["male", "qun", 3, ["twdanfa", "twlingbao", "twsidao"]], + tw_beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia", "bingzhao"], ["zhu"]], + nashime: ["male", "qun", 3, ["chijie", "waishi", "renshe"]], + tw_xiahouba: ["male", "shu", 4, ["twyanqin", "twbaobian"]], + tw_zumao: ["male", "wu", 4, ["twtijin"]], + tw_caoang: ["male", "wei", 4, ["twxiaolian"]], + tw_dingfeng: ["male", "wu", 4, ["twqijia", "twzhuchen"]], + tw_caohong: ["male", "wei", 4, ["twhuzhu", "twliancai"]], + tw_maliang: ["male", "shu", 3, ["twrangyi", "twbaimei"]], + kaisa: ["male", "western", 4, ["zhengfu"]], }, - characterIntro:{ - yanliang:'颜良(?~200年),字公骥,安平郡堂阳县(今河北省新河县)人。东汉末年河北将领。颜良性格促狭,虽骁勇不可独任,为一夫之勇。官渡之战,袁绍令颜良进攻白马(今河南滑县)。曹操采用军师荀攸“声东击西、轻兵掩袭”之计,大败袁军,颜良本人也被关羽亲自斩杀死,白马之围遂解。据说颜之推是其后人。', - wenchou:'文丑(?~200年),东汉末年河北将领。文丑为一夫之勇。建安五年(200年),带领左将军刘备进驻延津,误中曹操军师荀攸的“饵敌”之计,其麾下“五六千骑”惨败于“不满六百”的曹军骑兵。文丑本人也死于乱军之中,葬于河南省禹州市。', - yuantan:'袁谭(?-205年),字显思,汝南郡汝阳县,袁绍长子,曾任青州刺史。建安元年(196年),击败田楷、孔融,完全占据青州。袁绍去世后,审配等伪立遗令,拥立袁尚为继承人,袁谭不能继位,心怀愤恨。后袁谭、袁尚二人的矛盾彻底爆发,袁谭联合曹操共同攻打袁尚。建安十年,曹操兴兵进攻南皮,袁谭奋力抵抗,终于在曹操急攻之下战败,为曹纯麾下虎豹骑所杀。', - yuzhenzi:'评书三国中的人物,其人有徒弟兼义子童渊、徒弟并州李彦,有徒孙常山赵子龙、北地枪王张绣、张任等人。', - shie:'三国人物,善剑术。桓、灵间,有虎贲王越以剑术称于京师,阿得其法。魏帝曹丕曾从阿学剑术。曹丕在《典论·自叙》中说:“余又学击剑,阅师多矣,四方之法各异,唯京师为善。桓、灵之间,有虎贲王越善斯术,称於京师。河南史阿言昔与越游,具得其法,余从阿学精熟。尝与平虏将军刘勋、奋威将军邓展等共饮,宿闻展善有手臂,晓五兵,又称其能空手入白刃。余与论剑良久,谓将军非法也,余顾尝好之,又得善术,因求与余对。', - shitao:'石韬,字广元,即石广元,颍川(今河南禹州)人,仕魏,官拜典农校尉、郡守。初平年间,石韬与徐庶一同来到荆州,在荆州时与诸葛亮和庞统等人相善。与崔州平(名钧)、孟公威(名建)、徐元直(名庶)为“诸葛四友”。', - xiahousone:'夏侯子萼,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为在貂蝉不在时血婆娑的实际首领。在海外服中,设定为夏侯惇的养女,继承了夏侯紫萼的血婆娑,之后“夏侯紫萼”这个名字就被隐匿于历史之中,而“夏侯子萼”则成为了血婆娑的首领“血蔷薇”的固定名号。', - zhangwei:'张葳,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为被夏侯子萼救下后加入的血婆娑成员。在海外服中,设定为张奂的养女,张奂为宦官迫害时与其失散,为神秘女子所救并学得武艺,后与夏侯紫萼一起建立血婆娑。在李儒分成时为了保护百姓而牺牲。', - nashime:'难升米(なしめ,或なんしょうまい)是倭国大夫。景初二年六月,受女王卑弥呼之命,与都市牛利出使魏国,被魏国拜为率善中郎将。', - jiachong:'贾充(217年—282年),字公闾,平阳襄陵(今山西襄汾)人,三国曹魏至西晋时期大臣,曹魏豫州刺史贾逵之子。西晋王朝的开国元勋。出身平阳贾氏。曾参与镇压淮南二叛和弑杀魏帝曹髦,因此深得司马氏信任,其女儿贾褒(一名荃)及贾南风分别嫁予司马炎弟司马攸及次子司马衷,与司马氏结为姻亲,地位显赫。晋朝建立后,转任车骑将军、散骑常侍、尚书仆射,后升任司空、太尉等要职。更封鲁郡公。咸宁末,为使持节、假黄钺、大都督征讨吴国。吴国平定后,增邑八千户。太康三年(282年),贾充去世。西晋朝廷追赠他为太宰,礼官议谥曰荒,司马炎不采纳,改谥为武。有集五卷。', - duosidawang:'朵思大王是《三国演义》中人物,南蛮秃龙洞的元帅,孟获弟弟孟优的朋友,据说是南蛮第一智者。', - wuban:'吴班,字元雄,生卒年不详,兖州陈留郡(治今河南省开封市)人。三国时期蜀汉将领。为领军,随刘备参加伐吴之战,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争,并于公元231年(建兴九年)的北伐中大破司马懿。官至骠骑将军,封绵竹侯。吴班以豪爽侠义著称于当时,又因族妹吴氏是蜀汉穆皇后,在蜀汉将领中有较高的地位。', - yuejiu:'乐就(?-197),在袁术为攻徐州而大兴七军之际,以督战官之身份担任联络之役。但是,袁术军不幸战败,其也在寿春被曹操军逮捕并遭到斩首。', - huojun:'霍峻(178年—217年),字仲邈,南郡枝江(今湖北枝江)人,东汉末年刘备麾下名将。其兄霍笃曾在故乡聚部众数百人。后霍笃逝世,刘表以霍峻继承其部曲。208年(建安十三年),刘表病逝,霍峻便率部曲归降刘备,并被任为中郎将。后随刘备入蜀,刘备从葭萌还袭刘璋,留霍峻守葭萌城。张鲁遣将杨帛劝降霍峻,霍峻严词拒绝,杨帛退去。后刘璋将扶禁、向存等率万余人由阆水上,攻围霍峻,城中兵不过数百人,霍峻坚守一年,伺机将其击破。刘备定蜀,嘉霍峻之功,于是分广汉为梓潼郡,以峻为梓潼太守、裨将军。三年后去世,还葬成都。刘备亲率群僚临会吊祭,留宿墓上,当时的人都为他感到荣幸。', - zhangmancheng:'张曼成(?—184年6月),东汉末年黄巾之乱时南阳黄巾军首领,杀郡守褚贡,一度占据宛城数月,后为秦颉所杀。', - caozhao:'曹肇(?-244年),字长思,沛国谯县(今安徽亳州)人。三国时期魏国大臣,大司马曹休之子。容貌俊美,有当世才度,深得魏明帝宠信,官至散骑常侍、屯骑校尉。魏明帝临死,与燕王曹宇等托付后事。不果,以长平侯归第。正始五年(244年)卒,追赠为卫将军。', - wangchang:'王昶(2世纪-259年),字文舒,太原郡晋阳县(今山西太原)人。三国时期曹魏将领,东汉代郡太守王泽之子。出身太原王氏,少有名气,进入曹丕幕府,授太子文学。曹丕即位后,拜散骑侍郎,迁兖州刺史,撰写《治论》、《兵书》,作为朝廷提供施政参考。魏明帝曹叡即位后,升任扬烈将军,封关内侯。齐王曹芳即位,迁徐州刺史,拜征南将军。太傅司马懿掌权后,深得器重,奏请伐吴,在江陵取得重大胜利,升任征南大将军、开府仪同三司,晋爵京陵侯。正元年间(255年),参与平定“淮南三乱”有功,迁骠骑大将军,守司空。甘露四年(259年),去世,赠司徒,谥号为穆。', - puyangxing:'濮阳兴(?-264年),字子元,陈留(治今河南开封)人,三国时期东吴大臣,吴景帝孙休末年至末帝孙皓初年任丞相。孙权时为上虞县令,后升任尚书左曹、五官中郎将、会稽太守。孙休即位,征召为太常卫将军、平军国事,封外黄侯。永安三年(260年),力主建丹杨湖田,事倍功半,百姓大怨。后升任丞相。永安七年(264年),孙休去世,濮阳兴与张布迎立孙皓。担任侍郎,兼任青州牧。同年被万彧谮毁,流放广州,途中被孙皓派人追杀,并夷三族。', - re_caohong:'字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。', - jiangji:'蒋济(?—249年5月18日),字子通,楚国平阿(今安徽省怀远县常坟镇孔岗)人。三国后期曹魏名臣,历仕曹操、曹丕、曹睿、曹芳四朝。蒋济在汉末出任九江郡吏、扬州别驾。后被曹操聘为丹杨太守,不久升任丞相府主薄,西曹属,成为曹操的心腹谋士。魏文帝时期,蒋济出任东中郎将,代替曹仁统率大军,后升任尚书。魏明帝时期,蒋济出任中护军,封侯关内,功勋颇多。景初年间担任护军将军、散骑常侍等职。曹芳继位之后,转任领军将军,封昌陵亭侯,又代司马懿为太尉。正始十年(249年),蒋济随司马懿推翻曹爽势力之后,晋封都乡侯,同年卒(一说为蒋济觉得失信于曹爽,不久后自责忧愤而死),谥曰景侯。', - huchuquan:'呼厨泉(生卒年不详),东汉末年、三国时期匈奴单于。南匈奴羌渠单于之子,于夫罗之弟。于夫罗死后继任成为单于,曾数次依附,又反叛东汉。建安七年(公元202年),呼厨泉统领南匈奴诸部作乱平阳,钟繇率诸军围之。河北袁氏将领高干、郭援等前来增援呼厨泉,与钟繇及关中诸将大战于平阳。最终,呼厨泉惨败,从此归降曹操。建安二十一年(216年),呼厨泉被留在了邺城,南匈奴遂被分为五部。', - xiahouen:'夏侯恩是古典小说《三国演义》中的人物,为曹操随身之背剑心腹。曹操有宝剑二口:一名“倚天剑”,一名“青釭剑”。倚天剑镇威,青釭剑杀人。倚天剑曹操自佩之,青釭剑令夏侯恩佩之。那青釭剑削铁如泥,锋利无比。《三国演义》第四十一回《刘玄德携民渡江 赵子龙单骑救主》中描写:当时夏侯恩自恃勇力,背着曹操,只顾引人抢夺掳掠。不想撞着赵云,被他一枪刺死。青釭剑自此归赵云所有。', - xiahoushang:'夏侯尚(?~226年),字伯仁,沛国谯郡(今安徽省亳州市)人。三国时期曹魏将领,征西将军夏侯渊的堂侄。曹操平定冀州,以为军司马、五官将文学,迁黄门侍郎,随曹彰远征乌桓,得胜归来。与魏文帝曹丕亲近友好,以为征南将军,领荆州刺史,假节、都督南方诸军事,攻拔蜀国上庸,平定三郡九县,升为征南大将军;江陵击败吴将诸葛瑾,升为荆州牧,封昌陵乡侯。黄初七年(226年),去世,谥号为悼,其子夏侯玄继嗣。正始四年,配享魏武帝曹操庙庭。', - zhangnan:'张南(?-公元222年),字文进。三国时期蜀汉将领。刘备攻伐吴国时,张南担任前部。后刘备被陆逊击败,张南兵败战死。', - fengxí:'冯习(?—222年),字休元,南郡(治今湖北省荆州市公安县)人。三国时期蜀汉将领。随刘备入川,并于刘备攻伐孙吴时担任领军,后在猇亭被吴将陆逊击败,兵败战死。', - liwei:'李遗,生卒年不详,三国时期蜀汉名臣李恢之子,关羽女儿关银屏之夫。正史鲜有其生平记载,多见于关银屏的民间传说,其名在民间传说中被传为“李蔚”,因为遗为多音字且民间传说为口头相传并不知道具体字形之故,当以史书《三国志》作李遗为正。死后夫妇二人合葬于俞元县(今云南澄江)关三小姐墓。其父去世后,继承了汉兴亭候的爵位。', - baoxin:'鲍信(151年-192年),泰山平阳(今山东新泰)人。东汉末年济北相,讨伐董卓的诸路人马之一。鲍信受何进征召在外募兵,回到洛阳时适逢董卓进京,鲍信劝袁绍除掉董卓,袁绍不同意。后袁绍、曹操等人起兵对抗董卓,鲍信也起兵响应。后联盟破裂,鲍信劝戒曹操静观其变。青州黄巾军进攻兖州,刺史刘岱不听鲍信所劝贸然出战,兵败战死。鲍信便把曹操迎立为兖州牧。在与黄巾军交战期间,鲍信为救曹操不幸战死,曹操后来追记功绩,赐封其子。', - bingyuan:'邴原(生卒年不详),字根矩,北海朱虚(今山东临朐东)人。东汉末年名士、大臣。邴原家贫、早孤。初为北海相孔融所举。曹操为司空时,任邴原为东阁祭酒。建安十五年(210年),邴原担任丞相征事,后又代凉茂为五官将长史,闭门自守,非公事不出。随曹操征吴,于途中去世。', - jianshuo:'蹇硕(?—189年),东汉末宦官。中平五年(188年),蹇硕为上军校尉,汉灵帝以蹇硕壮健而有武略,对其特别信任,并以其为西园军元帅,领导袁绍、曹操等八校尉,以监督司隶校尉以下诸官。蹇硕虽然握有兵权,但对何进非常畏忌,曾和宦官们一起说服灵帝派遣何进西击边章、韩遂。中平六年(189年),灵帝在病重时将刘协托给蹇硕。灵帝去世后,蹇硕想先杀何进再立刘协为天子,但因手下司马潘隐与何进有旧对何进使眼色而失败。刘辩继承帝位后,蹇硕与中常侍赵忠、郭胜等写信欲合谋除去何进兄弟,因郭胜与何进为同郡且何进及何皇后发迹亦有其功劳于是亲信何氏便怂恿赵忠等人不听蹇硕之计,且将蹇硕的书信告知何进,何进于是便派黄门将之诛杀,其部下士兵亦被何进所领。', - liufuren:'刘夫人,东汉末年军阀袁绍的后妻,袁谭与袁尚的母亲。袁绍的二子中,袁谭年长而贤惠,袁尚年幼相貌美好。袁绍的后妻刘夫人有宠,她偏爱少子袁尚而讨厌长子袁谭,多次称赞袁尚的才能,袁绍也为三子的容貌感到惊奇,想要作为继承人,于是让袁谭做哥哥的后代,出外任青州刺史,后导致二子相争。。', - niufudongxie:'牛辅,东汉末年武将,东汉相国董卓的女婿。董翓,牛辅之妻,董卓之女。牛辅曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。', - tw_zhangji:'张既(?—223年),字德容,冯翊高陵(今陕西西安市高陵区)人。汉末三国时期曹魏名臣。举秀才出身,授新丰县令,治绩为三辅第一。河东之战时,劝说马腾参与讨伐高干、张晟叛乱。迁京兆尹,抚民兴政,联合夏侯渊平宋建,定临洮,取狄道,安郡民,迁徙氐人。张鲁投降后,建议曹操迁徙汉中百姓充实三辅,辅助曹洪击败吴兰。魏国建立后,拜尚书。黄初二年(221年),临危受命,拜雍州刺史,平定诸胡叛乱。迁凉州刺史,封西乡侯。在任期间,降苏衡,邻戴众,修工事,安抚百姓,平定西平郡麹光叛乱。一生以惠政闻名,征辟杨阜、胡遵等人,皆有名位。黄初四年(223年)去世。魏明帝曹叡即位后,追谥肃侯,其子张缉为关内侯。', - qiaorui:'桥蕤(?—197年),东汉末年袁术部下将领,为袁术开拓地盘立下了一定战功。曹操进攻袁术时,担任迎击军的先锋。在寿春与曹操军大战,被夏侯惇杀死。据正史记载,他曾经被袁术任命为大将军。', - weixu:'魏续,东汉末年吕布帐下名将。与吕布有亲,吕布将高顺兵归续管。汉献帝建安三年(198年),曹操率军攻吕布,围之三月。魏续与侯成、宋宪缚陈宫,降曹。吕布被迫降,被缢杀在白门楼。', - yanxiang:'阎象,东汉末期人物,袁术的主簿。献帝兴平二年(195),手执玉玺的袁术要称帝时,问于部下,只有阎象引用周文王虽拥有三分之二的天下还向殷称臣的故事进行劝谏。却未被采纳。', - yufuluo:'东汉时匈奴单于。亦称於夫罗、栾提于夫罗、于扶罗。羌渠单于子,右贤王。前赵刘渊之祖。于东汉中平年间带兵来到中原协助东汉政府镇压起义,赶上本国叛乱,其父被杀,于是留在中原,与白波军联合,在太原、河东等地劫掠。汉末军阀混战之际,于夫罗先后与袁绍、张杨、袁术等人联合,两次与曹操交战,均被击败。后来,于夫罗去世,其弟呼厨泉继任成为单于,其子刘豹被立为左贤王。', - sp_xunchen:'荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。', - sp_xujing:'许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。', - sp_zongyu:'宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。', - sp_chendong:'陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。', - xia_wangyue:'王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。', - liyàn:'李彦,号称"并州第一戟",是童渊的师兄。早年间两人在玉真子门下一起习武,后成年出师开枝散叶。同为并州人的吕布在得知李彦的名声后,投入其门下学习武艺。', - re_fazheng:'字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。', - xin_guyong:'为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。', - zhaoe:'赵娥,东汉酒泉郡禄福县(即肃州)人。丈夫庞子夏,表氏县(今高台县)人。庞子夏去世后,赵娥在禄福县抚养其子庞淯。她的父亲被李寿杀死。灵帝光和二年(公元179年)二月上旬的一天早晨,赵娥在都亭前与李寿相遇,她奋力挥刀杀死了李寿,随后到了都亭尊长的面前认罪伏法。后来,凉州刺史周洪、酒泉太守刘班等人共同上表朝廷,禀奏赵娥的烈义行为,刻石立碑显其赵家门户。黄门侍郎梁宽还著书追述赵娥的事迹,为其作传。西晋政治家傅玄为其作《秦女休行》诗,加以赞美。', - xiahouzie:'夏侯紫萼,游卡桌游《三国杀阵面对决》中虚构的人物。幼年因天天帮病种的母亲采紫萼得其名。亲眼目睹母亲被宦官所杀,愤怒之下夺过佩剑斩下宦官的头颅。被神秘人所救,发现了自己的身世,决心与宦官争斗到底。后再闯荡江湖的过程中,与夏侯惇义结金兰,以夏侯家姓氏称呼。', - yangang:'严纲(163~191年),东汉末年公孙瓒部下的冀州刺史。汉献帝初平二年(191年),袁绍与公孙瓒在界桥交战,严纲为袁绍部下麹义所斩。', - gongsunfan:'公孙范,辽西令支(今河北迁安)人。东汉末年武将,公孙瓒从弟,官至勃海太守。公孙瓒起兵攻打袁绍之时,袁绍畏惧公孙瓒的势力,将自己的勃海太守印绶给予公孙范,意图和解,结果公孙范反而起勃海之兵帮助公孙瓒。初平二年(191年),公孙范以勃海兵助公孙瓒率二万人大破青、徐黄巾军。最后于界桥之战与公孙瓒一同败走。', - zhangzhao:'张昭(156年-236年),字子布。徐州彭城县(今江苏省徐州市)人。汉末三国时期孙吴政权重臣。东汉末年,张昭为避战乱而南渡至扬州。孙策创业时,任命其为长史、抚军中郎将,将文武之事都委任于张昭。孙策临终前,将其弟孙权托付给张昭,张昭率群僚辅立孙权,并安抚百姓、讨伐叛军,与周瑜等辅助孙权稳定局势。孙权每次出征,常留张昭镇守后方,领幕府事,并敬称他为“张公”。赤壁之战时,张昭鉴于曹操势大,持主降论,从而被排挤出军政决策中心。孙权代理车骑将军时,任命张昭为军师。孙权被封为吴王后,任绥远将军,封由拳侯。此后曾参与撰定朝仪。孙权两次要设立丞相时,众人都推举张昭,孙权以张昭敢于直谏、性格刚直为由而不用他,先后用孙邵、顾雍。黄龙元年(229年),孙权称帝,张昭以年老多病为由,上还官位及所统领部属,改拜辅吴将军、班亚三司,改封娄侯。晚年时一度不参与政事,在家著书,即使偶有参加朝议,也常与孙权产生激烈冲突。嘉禾五年(236年),张昭去世,享年八十一岁,谥号“文”。张昭容貌严正,敢于直言谏诤,一生以忠于孙氏基业为任,但因其与孙权在个性、军政策略等方面的深层矛盾,使其以“入宫则拜孤,出宫则拜君”的地位,却终身不得任丞相。著有《春秋左氏传解》及《论语注》,今皆佚失。', - zhanghong:'张纮(153年~212年),字子纲,徐州广陵(江苏省扬州市广陵区人)人。东汉末年文学家、官员,和张昭一起合称“二张”。曾被大将军何进、太尉朱儁、司空荀爽辟为掾属,皆不就,避难江东。孙策平定江东前,亲自多次登门邀请,张纮出仕为官。孙权即位时,建议孙权迁都秣陵。建安十七年(212年),病逝,时年六十岁,孙权为之流涕。', + characterIntro: { + yanliang: + "颜良(?~200年),字公骥,安平郡堂阳县(今河北省新河县)人。东汉末年河北将领。颜良性格促狭,虽骁勇不可独任,为一夫之勇。官渡之战,袁绍令颜良进攻白马(今河南滑县)。曹操采用军师荀攸“声东击西、轻兵掩袭”之计,大败袁军,颜良本人也被关羽亲自斩杀死,白马之围遂解。据说颜之推是其后人。", + wenchou: + "文丑(?~200年),东汉末年河北将领。文丑为一夫之勇。建安五年(200年),带领左将军刘备进驻延津,误中曹操军师荀攸的“饵敌”之计,其麾下“五六千骑”惨败于“不满六百”的曹军骑兵。文丑本人也死于乱军之中,葬于河南省禹州市。", + yuantan: + "袁谭(?-205年),字显思,汝南郡汝阳县,袁绍长子,曾任青州刺史。建安元年(196年),击败田楷、孔融,完全占据青州。袁绍去世后,审配等伪立遗令,拥立袁尚为继承人,袁谭不能继位,心怀愤恨。后袁谭、袁尚二人的矛盾彻底爆发,袁谭联合曹操共同攻打袁尚。建安十年,曹操兴兵进攻南皮,袁谭奋力抵抗,终于在曹操急攻之下战败,为曹纯麾下虎豹骑所杀。", + yuzhenzi: + "评书三国中的人物,其人有徒弟兼义子童渊、徒弟并州李彦,有徒孙常山赵子龙、北地枪王张绣、张任等人。", + shie: "三国人物,善剑术。桓、灵间,有虎贲王越以剑术称于京师,阿得其法。魏帝曹丕曾从阿学剑术。曹丕在《典论·自叙》中说:“余又学击剑,阅师多矣,四方之法各异,唯京师为善。桓、灵之间,有虎贲王越善斯术,称於京师。河南史阿言昔与越游,具得其法,余从阿学精熟。尝与平虏将军刘勋、奋威将军邓展等共饮,宿闻展善有手臂,晓五兵,又称其能空手入白刃。余与论剑良久,谓将军非法也,余顾尝好之,又得善术,因求与余对。", + shitao: "石韬,字广元,即石广元,颍川(今河南禹州)人,仕魏,官拜典农校尉、郡守。初平年间,石韬与徐庶一同来到荆州,在荆州时与诸葛亮和庞统等人相善。与崔州平(名钧)、孟公威(名建)、徐元直(名庶)为“诸葛四友”。", + xiahousone: + "夏侯子萼,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为在貂蝉不在时血婆娑的实际首领。在海外服中,设定为夏侯惇的养女,继承了夏侯紫萼的血婆娑,之后“夏侯紫萼”这个名字就被隐匿于历史之中,而“夏侯子萼”则成为了血婆娑的首领“血蔷薇”的固定名号。", + zhangwei: + "张葳,游卡桌游《三国杀阵面对决》中虚构的人物。在《阵面对决》中,设定为被夏侯子萼救下后加入的血婆娑成员。在海外服中,设定为张奂的养女,张奂为宦官迫害时与其失散,为神秘女子所救并学得武艺,后与夏侯紫萼一起建立血婆娑。在李儒分成时为了保护百姓而牺牲。", + nashime: + "难升米(なしめ,或なんしょうまい)是倭国大夫。景初二年六月,受女王卑弥呼之命,与都市牛利出使魏国,被魏国拜为率善中郎将。", + jiachong: + "贾充(217年—282年),字公闾,平阳襄陵(今山西襄汾)人,三国曹魏至西晋时期大臣,曹魏豫州刺史贾逵之子。西晋王朝的开国元勋。出身平阳贾氏。曾参与镇压淮南二叛和弑杀魏帝曹髦,因此深得司马氏信任,其女儿贾褒(一名荃)及贾南风分别嫁予司马炎弟司马攸及次子司马衷,与司马氏结为姻亲,地位显赫。晋朝建立后,转任车骑将军、散骑常侍、尚书仆射,后升任司空、太尉等要职。更封鲁郡公。咸宁末,为使持节、假黄钺、大都督征讨吴国。吴国平定后,增邑八千户。太康三年(282年),贾充去世。西晋朝廷追赠他为太宰,礼官议谥曰荒,司马炎不采纳,改谥为武。有集五卷。", + duosidawang: + "朵思大王是《三国演义》中人物,南蛮秃龙洞的元帅,孟获弟弟孟优的朋友,据说是南蛮第一智者。", + wuban: "吴班,字元雄,生卒年不详,兖州陈留郡(治今河南省开封市)人。三国时期蜀汉将领。为领军,随刘备参加伐吴之战,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争,并于公元231年(建兴九年)的北伐中大破司马懿。官至骠骑将军,封绵竹侯。吴班以豪爽侠义著称于当时,又因族妹吴氏是蜀汉穆皇后,在蜀汉将领中有较高的地位。", + yuejiu: "乐就(?-197),在袁术为攻徐州而大兴七军之际,以督战官之身份担任联络之役。但是,袁术军不幸战败,其也在寿春被曹操军逮捕并遭到斩首。", + huojun: "霍峻(178年—217年),字仲邈,南郡枝江(今湖北枝江)人,东汉末年刘备麾下名将。其兄霍笃曾在故乡聚部众数百人。后霍笃逝世,刘表以霍峻继承其部曲。208年(建安十三年),刘表病逝,霍峻便率部曲归降刘备,并被任为中郎将。后随刘备入蜀,刘备从葭萌还袭刘璋,留霍峻守葭萌城。张鲁遣将杨帛劝降霍峻,霍峻严词拒绝,杨帛退去。后刘璋将扶禁、向存等率万余人由阆水上,攻围霍峻,城中兵不过数百人,霍峻坚守一年,伺机将其击破。刘备定蜀,嘉霍峻之功,于是分广汉为梓潼郡,以峻为梓潼太守、裨将军。三年后去世,还葬成都。刘备亲率群僚临会吊祭,留宿墓上,当时的人都为他感到荣幸。", + zhangmancheng: + "张曼成(?—184年6月),东汉末年黄巾之乱时南阳黄巾军首领,杀郡守褚贡,一度占据宛城数月,后为秦颉所杀。", + caozhao: + "曹肇(?-244年),字长思,沛国谯县(今安徽亳州)人。三国时期魏国大臣,大司马曹休之子。容貌俊美,有当世才度,深得魏明帝宠信,官至散骑常侍、屯骑校尉。魏明帝临死,与燕王曹宇等托付后事。不果,以长平侯归第。正始五年(244年)卒,追赠为卫将军。", + wangchang: + "王昶(2世纪-259年),字文舒,太原郡晋阳县(今山西太原)人。三国时期曹魏将领,东汉代郡太守王泽之子。出身太原王氏,少有名气,进入曹丕幕府,授太子文学。曹丕即位后,拜散骑侍郎,迁兖州刺史,撰写《治论》、《兵书》,作为朝廷提供施政参考。魏明帝曹叡即位后,升任扬烈将军,封关内侯。齐王曹芳即位,迁徐州刺史,拜征南将军。太傅司马懿掌权后,深得器重,奏请伐吴,在江陵取得重大胜利,升任征南大将军、开府仪同三司,晋爵京陵侯。正元年间(255年),参与平定“淮南三乱”有功,迁骠骑大将军,守司空。甘露四年(259年),去世,赠司徒,谥号为穆。", + puyangxing: + "濮阳兴(?-264年),字子元,陈留(治今河南开封)人,三国时期东吴大臣,吴景帝孙休末年至末帝孙皓初年任丞相。孙权时为上虞县令,后升任尚书左曹、五官中郎将、会稽太守。孙休即位,征召为太常卫将军、平军国事,封外黄侯。永安三年(260年),力主建丹杨湖田,事倍功半,百姓大怨。后升任丞相。永安七年(264年),孙休去世,濮阳兴与张布迎立孙皓。担任侍郎,兼任青州牧。同年被万彧谮毁,流放广州,途中被孙皓派人追杀,并夷三族。", + re_caohong: + "字子廉,沛国谯(今安徽亳县)人,曹操从弟,曾献马并救护曹操。后多随军征伐,平兖州、征刘表、讨祝臂。曹丕即位时封曹洪为骠骑将军。曹叡即位,拜曹洪为后将军,更封乐城侯,后复拜为骠骑将军。曹洪逝世,追谥曰恭侯。", + jiangji: + "蒋济(?—249年5月18日),字子通,楚国平阿(今安徽省怀远县常坟镇孔岗)人。三国后期曹魏名臣,历仕曹操、曹丕、曹睿、曹芳四朝。蒋济在汉末出任九江郡吏、扬州别驾。后被曹操聘为丹杨太守,不久升任丞相府主薄,西曹属,成为曹操的心腹谋士。魏文帝时期,蒋济出任东中郎将,代替曹仁统率大军,后升任尚书。魏明帝时期,蒋济出任中护军,封侯关内,功勋颇多。景初年间担任护军将军、散骑常侍等职。曹芳继位之后,转任领军将军,封昌陵亭侯,又代司马懿为太尉。正始十年(249年),蒋济随司马懿推翻曹爽势力之后,晋封都乡侯,同年卒(一说为蒋济觉得失信于曹爽,不久后自责忧愤而死),谥曰景侯。", + huchuquan: + "呼厨泉(生卒年不详),东汉末年、三国时期匈奴单于。南匈奴羌渠单于之子,于夫罗之弟。于夫罗死后继任成为单于,曾数次依附,又反叛东汉。建安七年(公元202年),呼厨泉统领南匈奴诸部作乱平阳,钟繇率诸军围之。河北袁氏将领高干、郭援等前来增援呼厨泉,与钟繇及关中诸将大战于平阳。最终,呼厨泉惨败,从此归降曹操。建安二十一年(216年),呼厨泉被留在了邺城,南匈奴遂被分为五部。", + xiahouen: + "夏侯恩是古典小说《三国演义》中的人物,为曹操随身之背剑心腹。曹操有宝剑二口:一名“倚天剑”,一名“青釭剑”。倚天剑镇威,青釭剑杀人。倚天剑曹操自佩之,青釭剑令夏侯恩佩之。那青釭剑削铁如泥,锋利无比。《三国演义》第四十一回《刘玄德携民渡江 赵子龙单骑救主》中描写:当时夏侯恩自恃勇力,背着曹操,只顾引人抢夺掳掠。不想撞着赵云,被他一枪刺死。青釭剑自此归赵云所有。", + xiahoushang: + "夏侯尚(?~226年),字伯仁,沛国谯郡(今安徽省亳州市)人。三国时期曹魏将领,征西将军夏侯渊的堂侄。曹操平定冀州,以为军司马、五官将文学,迁黄门侍郎,随曹彰远征乌桓,得胜归来。与魏文帝曹丕亲近友好,以为征南将军,领荆州刺史,假节、都督南方诸军事,攻拔蜀国上庸,平定三郡九县,升为征南大将军;江陵击败吴将诸葛瑾,升为荆州牧,封昌陵乡侯。黄初七年(226年),去世,谥号为悼,其子夏侯玄继嗣。正始四年,配享魏武帝曹操庙庭。", + zhangnan: + "张南(?-公元222年),字文进。三国时期蜀汉将领。刘备攻伐吴国时,张南担任前部。后刘备被陆逊击败,张南兵败战死。", + fengxí: "冯习(?—222年),字休元,南郡(治今湖北省荆州市公安县)人。三国时期蜀汉将领。随刘备入川,并于刘备攻伐孙吴时担任领军,后在猇亭被吴将陆逊击败,兵败战死。", + liwei: "李遗,生卒年不详,三国时期蜀汉名臣李恢之子,关羽女儿关银屏之夫。正史鲜有其生平记载,多见于关银屏的民间传说,其名在民间传说中被传为“李蔚”,因为遗为多音字且民间传说为口头相传并不知道具体字形之故,当以史书《三国志》作李遗为正。死后夫妇二人合葬于俞元县(今云南澄江)关三小姐墓。其父去世后,继承了汉兴亭候的爵位。", + baoxin: "鲍信(151年-192年),泰山平阳(今山东新泰)人。东汉末年济北相,讨伐董卓的诸路人马之一。鲍信受何进征召在外募兵,回到洛阳时适逢董卓进京,鲍信劝袁绍除掉董卓,袁绍不同意。后袁绍、曹操等人起兵对抗董卓,鲍信也起兵响应。后联盟破裂,鲍信劝戒曹操静观其变。青州黄巾军进攻兖州,刺史刘岱不听鲍信所劝贸然出战,兵败战死。鲍信便把曹操迎立为兖州牧。在与黄巾军交战期间,鲍信为救曹操不幸战死,曹操后来追记功绩,赐封其子。", + bingyuan: + "邴原(生卒年不详),字根矩,北海朱虚(今山东临朐东)人。东汉末年名士、大臣。邴原家贫、早孤。初为北海相孔融所举。曹操为司空时,任邴原为东阁祭酒。建安十五年(210年),邴原担任丞相征事,后又代凉茂为五官将长史,闭门自守,非公事不出。随曹操征吴,于途中去世。", + jianshuo: + "蹇硕(?—189年),东汉末宦官。中平五年(188年),蹇硕为上军校尉,汉灵帝以蹇硕壮健而有武略,对其特别信任,并以其为西园军元帅,领导袁绍、曹操等八校尉,以监督司隶校尉以下诸官。蹇硕虽然握有兵权,但对何进非常畏忌,曾和宦官们一起说服灵帝派遣何进西击边章、韩遂。中平六年(189年),灵帝在病重时将刘协托给蹇硕。灵帝去世后,蹇硕想先杀何进再立刘协为天子,但因手下司马潘隐与何进有旧对何进使眼色而失败。刘辩继承帝位后,蹇硕与中常侍赵忠、郭胜等写信欲合谋除去何进兄弟,因郭胜与何进为同郡且何进及何皇后发迹亦有其功劳于是亲信何氏便怂恿赵忠等人不听蹇硕之计,且将蹇硕的书信告知何进,何进于是便派黄门将之诛杀,其部下士兵亦被何进所领。", + liufuren: + "刘夫人,东汉末年军阀袁绍的后妻,袁谭与袁尚的母亲。袁绍的二子中,袁谭年长而贤惠,袁尚年幼相貌美好。袁绍的后妻刘夫人有宠,她偏爱少子袁尚而讨厌长子袁谭,多次称赞袁尚的才能,袁绍也为三子的容貌感到惊奇,想要作为继承人,于是让袁谭做哥哥的后代,出外任青州刺史,后导致二子相争。。", + niufudongxie: + "牛辅,东汉末年武将,东汉相国董卓的女婿。董翓,牛辅之妻,董卓之女。牛辅曾任中郎将,征讨白波军,不能取胜。董卓被杀时,牛辅别屯于陕地。吕布派李肃前去征讨牛辅,被牛辅击败。后来,牛辅营中有士兵半夜背叛出逃,造成内乱,牛辅以为整营皆叛,于是带着金银珠宝,独与亲信胡赤儿等五六人逾城北渡河。赤儿等人以绳索系在牛辅腰间将其从城头放下,但赤儿等因为谋财而在离地面数丈高的地方就松开了绳子使得牛辅重重摔在地上腰部受伤,而后赤儿与诸胡人将牛辅斩首,将其首级送去长安。", + tw_zhangji: + "张既(?—223年),字德容,冯翊高陵(今陕西西安市高陵区)人。汉末三国时期曹魏名臣。举秀才出身,授新丰县令,治绩为三辅第一。河东之战时,劝说马腾参与讨伐高干、张晟叛乱。迁京兆尹,抚民兴政,联合夏侯渊平宋建,定临洮,取狄道,安郡民,迁徙氐人。张鲁投降后,建议曹操迁徙汉中百姓充实三辅,辅助曹洪击败吴兰。魏国建立后,拜尚书。黄初二年(221年),临危受命,拜雍州刺史,平定诸胡叛乱。迁凉州刺史,封西乡侯。在任期间,降苏衡,邻戴众,修工事,安抚百姓,平定西平郡麹光叛乱。一生以惠政闻名,征辟杨阜、胡遵等人,皆有名位。黄初四年(223年)去世。魏明帝曹叡即位后,追谥肃侯,其子张缉为关内侯。", + qiaorui: + "桥蕤(?—197年),东汉末年袁术部下将领,为袁术开拓地盘立下了一定战功。曹操进攻袁术时,担任迎击军的先锋。在寿春与曹操军大战,被夏侯惇杀死。据正史记载,他曾经被袁术任命为大将军。", + weixu: "魏续,东汉末年吕布帐下名将。与吕布有亲,吕布将高顺兵归续管。汉献帝建安三年(198年),曹操率军攻吕布,围之三月。魏续与侯成、宋宪缚陈宫,降曹。吕布被迫降,被缢杀在白门楼。", + yanxiang: + "阎象,东汉末期人物,袁术的主簿。献帝兴平二年(195),手执玉玺的袁术要称帝时,问于部下,只有阎象引用周文王虽拥有三分之二的天下还向殷称臣的故事进行劝谏。却未被采纳。", + yufuluo: + "东汉时匈奴单于。亦称於夫罗、栾提于夫罗、于扶罗。羌渠单于子,右贤王。前赵刘渊之祖。于东汉中平年间带兵来到中原协助东汉政府镇压起义,赶上本国叛乱,其父被杀,于是留在中原,与白波军联合,在太原、河东等地劫掠。汉末军阀混战之际,于夫罗先后与袁绍、张杨、袁术等人联合,两次与曹操交战,均被击败。后来,于夫罗去世,其弟呼厨泉继任成为单于,其子刘豹被立为左贤王。", + sp_xunchen: + "荀谌,字友若,荀彧之兄(一说荀彧之弟),荀绲之子,颍川人。曾任军阀袁绍的幕僚。帮助袁绍游说韩馥,夺取了冀州。", + sp_xujing: + "许靖(?—222年),字文休。汝南郡平舆县(今河南省平舆县)人。汉末至三国蜀汉时期重臣、名士、评论家。许靖因与从弟许邵俱以品评人物而闻名于世。后被刘翊推举为孝廉,任尚书郎。曾先后投奔孔伷、陈祎、许贡、王朗等人,于孙策攻王朗前与家属俱避难交州,受到交趾太守士燮礼待。其后受益州牧刘璋邀请,相继为巴郡、广汉、蜀郡太守。于刘备包围成都时欲越墙叛逃,为刘璋所获。刘备定蜀后欲将其弃用,在法正的建议下方以其为左将军长史。建安二十三年(218年),刘备称汉中王,任命许靖为汉中王傅。章武元年(221年),刘备称帝,任命许靖为司徒,位列三公。章武二年(222年),去世。有文集二卷。", + sp_zongyu: + "宗预(?-264年),字德艳 ,荆州南阳郡安众县(今河南省南阳市)人。三国时期蜀汉官员、将领。曾随张飞入蜀助平益州,又受辟为丞相诸葛亮手下主簿,升任参军、右中郎将。诸葛亮逝世后,宗预受命出使孙吴,得到孙权的赞赏。迁后将军,出督永安,又升任征西大将军,并受封关内侯。公元258年(景耀元年),因病回成都,受任镇军大将军。蜀汉灭亡后,宗预随后主刘禅徙往洛阳,在中途病逝。宗预为人坦率耿直,多次出使孙吴并深得孙权的敬重,为吴、汉两国同盟的巩固作出了一定的贡献。", + sp_chendong: + "陈武,东吴将领,孙策攻打刘繇,陈武前来相助,孙策非常喜爱陈武,拜为校尉,使作先锋。陈武以十数骑兵力杀敌五十余人。后于赤壁等战役屡立功勋。董袭献上严虎的人头来降孙策。赤壁之战,董袭受周瑜命,分兵去汉阳,合肥会战时接应太史慈,逍遥津支援孙权。濡须口之战时,董袭在船上督战,船覆董袭坚守殉职。", + xia_wangyue: + "王越,东汉末年游侠(生卒年不详),乃辽东燕山人士,擅使剑术, 三国时期史阿的师父,曹丕的师公,官职虎贲将军。在史书《典论》中略有记载。", + liyàn: '李彦,号称"并州第一戟",是童渊的师兄。早年间两人在玉真子门下一起习武,后成年出师开枝散叶。同为并州人的吕布在得知李彦的名声后,投入其门下学习武艺。', + re_fazheng: + "字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。", + xin_guyong: + "为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。", + zhaoe: "赵娥,东汉酒泉郡禄福县(即肃州)人。丈夫庞子夏,表氏县(今高台县)人。庞子夏去世后,赵娥在禄福县抚养其子庞淯。她的父亲被李寿杀死。灵帝光和二年(公元179年)二月上旬的一天早晨,赵娥在都亭前与李寿相遇,她奋力挥刀杀死了李寿,随后到了都亭尊长的面前认罪伏法。后来,凉州刺史周洪、酒泉太守刘班等人共同上表朝廷,禀奏赵娥的烈义行为,刻石立碑显其赵家门户。黄门侍郎梁宽还著书追述赵娥的事迹,为其作传。西晋政治家傅玄为其作《秦女休行》诗,加以赞美。", + xiahouzie: + "夏侯紫萼,游卡桌游《三国杀阵面对决》中虚构的人物。幼年因天天帮病种的母亲采紫萼得其名。亲眼目睹母亲被宦官所杀,愤怒之下夺过佩剑斩下宦官的头颅。被神秘人所救,发现了自己的身世,决心与宦官争斗到底。后再闯荡江湖的过程中,与夏侯惇义结金兰,以夏侯家姓氏称呼。", + yangang: + "严纲(163~191年),东汉末年公孙瓒部下的冀州刺史。汉献帝初平二年(191年),袁绍与公孙瓒在界桥交战,严纲为袁绍部下麹义所斩。", + gongsunfan: + "公孙范,辽西令支(今河北迁安)人。东汉末年武将,公孙瓒从弟,官至勃海太守。公孙瓒起兵攻打袁绍之时,袁绍畏惧公孙瓒的势力,将自己的勃海太守印绶给予公孙范,意图和解,结果公孙范反而起勃海之兵帮助公孙瓒。初平二年(191年),公孙范以勃海兵助公孙瓒率二万人大破青、徐黄巾军。最后于界桥之战与公孙瓒一同败走。", + zhangzhao: + "张昭(156年-236年),字子布。徐州彭城县(今江苏省徐州市)人。汉末三国时期孙吴政权重臣。东汉末年,张昭为避战乱而南渡至扬州。孙策创业时,任命其为长史、抚军中郎将,将文武之事都委任于张昭。孙策临终前,将其弟孙权托付给张昭,张昭率群僚辅立孙权,并安抚百姓、讨伐叛军,与周瑜等辅助孙权稳定局势。孙权每次出征,常留张昭镇守后方,领幕府事,并敬称他为“张公”。赤壁之战时,张昭鉴于曹操势大,持主降论,从而被排挤出军政决策中心。孙权代理车骑将军时,任命张昭为军师。孙权被封为吴王后,任绥远将军,封由拳侯。此后曾参与撰定朝仪。孙权两次要设立丞相时,众人都推举张昭,孙权以张昭敢于直谏、性格刚直为由而不用他,先后用孙邵、顾雍。黄龙元年(229年),孙权称帝,张昭以年老多病为由,上还官位及所统领部属,改拜辅吴将军、班亚三司,改封娄侯。晚年时一度不参与政事,在家著书,即使偶有参加朝议,也常与孙权产生激烈冲突。嘉禾五年(236年),张昭去世,享年八十一岁,谥号“文”。张昭容貌严正,敢于直言谏诤,一生以忠于孙氏基业为任,但因其与孙权在个性、军政策略等方面的深层矛盾,使其以“入宫则拜孤,出宫则拜君”的地位,却终身不得任丞相。著有《春秋左氏传解》及《论语注》,今皆佚失。", + zhanghong: + "张纮(153年~212年),字子纲,徐州广陵(江苏省扬州市广陵区人)人。东汉末年文学家、官员,和张昭一起合称“二张”。曾被大将军何进、太尉朱儁、司空荀爽辟为掾属,皆不就,避难江东。孙策平定江东前,亲自多次登门邀请,张纮出仕为官。孙权即位时,建议孙权迁都秣陵。建安十七年(212年),病逝,时年六十岁,孙权为之流涕。", }, - card:{ - dz_mantianguohai:{ - fullskin:true, - type:'trick', - enable:true, - derivation:'tw_dongzhao', - global:['dz_mantianguohai'], - selectTarget:[1,2], - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('hej')>0; + card: { + dz_mantianguohai: { + fullskin: true, + type: "trick", + enable: true, + derivation: "tw_dongzhao", + global: ["dz_mantianguohai"], + selectTarget: [1, 2], + filterTarget: function (card, player, target) { + return target != player && target.countCards("hej") > 0; }, - content:function(){ - player.gainPlayerCard(target,'hej',true); + content: function () { + player.gainPlayerCard(target, "hej", true); }, - contentAfter:function(){ - 'step 0' - var evtx=event.getParent(); - event.targets=targets.filter(function(target){ - return target.hasHistory('lose',function(evt){ - return evt.getParent(3).name=='dz_mantianguohai'&&evt.getParent(4)==evtx; + contentAfter: function () { + "step 0"; + var evtx = event.getParent(); + event.targets = targets.filter(function (target) { + return target.hasHistory("lose", function (evt) { + return evt.getParent(3).name == "dz_mantianguohai" && evt.getParent(4) == evtx; }); }); - if(!event.targets.length||!player.countCards('he')) event.finish(); - 'step 1' - var target=targets.shift(); - event.target=target; - var next=player.chooseCard('he',true,'交给'+get.translation(target)+'一张牌'); - if(player.hasSkill('twyingjia')&&player.countUsed('dz_mantianguohai')==1) next.set('ai',function(card){ - if(card.name=='dz_mantianguohai') return -10; - return -get.value(card,_status.event.getParent().target); - }); - 'step 2' - if(result.bool){ - player.give(result.cards,target); + if (!event.targets.length || !player.countCards("he")) event.finish(); + ("step 1"); + var target = targets.shift(); + event.target = target; + var next = player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌"); + if (player.hasSkill("twyingjia") && player.countUsed("dz_mantianguohai") == 1) + next.set("ai", function (card) { + if (card.name == "dz_mantianguohai") return -10; + return -get.value(card, _status.event.getParent().target); + }); + ("step 2"); + if (result.bool) { + player.give(result.cards, target); } - 'step 3' - if(targets.length&&player.countCards('h')>0) event.goto(1); + ("step 3"); + if (targets.length && player.countCards("h") > 0) event.goto(1); }, - ai:{ - order:6, - tag:{ - lose:1, - loseCard:1, + ai: { + order: 6, + tag: { + lose: 1, + loseCard: 1, }, - result:{ - target:-0.1, + result: { + target: -0.1, }, }, }, - gx_lingbaoxianhu:{ - fullskin:true, - type:'equip', - subtype:'equip1', - derivation:'tw_gexuan', - distance:{attackFrom:-2}, - ai:{ - basic:{ - equipValue:4.5, - } + gx_lingbaoxianhu: { + fullskin: true, + type: "equip", + subtype: "equip1", + derivation: "tw_gexuan", + distance: { attackFrom: -2 }, + ai: { + basic: { + equipValue: 4.5, + }, }, - skills:['gx_lingbaoxianhu'] + skills: ["gx_lingbaoxianhu"], }, - gx_taijifuchen:{ - fullskin:true, - type:'equip', - subtype:'equip1', - derivation:'tw_gexuan', - distance:{attackFrom:-4}, - ai:{ - basic:{ - equipValue:4.5, - } + gx_taijifuchen: { + fullskin: true, + type: "equip", + subtype: "equip1", + derivation: "tw_gexuan", + distance: { attackFrom: -4 }, + ai: { + basic: { + equipValue: 4.5, + }, }, - skills:['gx_taijifuchen'] + skills: ["gx_taijifuchen"], }, - gx_chongyingshenfu:{ - fullskin:true, - type:'equip', - subtype:'equip2', - derivation:'tw_gexuan', - ai:{ - basic:{ - equipValue:7, - } + gx_chongyingshenfu: { + fullskin: true, + type: "equip", + subtype: "equip2", + derivation: "tw_gexuan", + ai: { + basic: { + equipValue: 7, + }, }, - skills:['gx_chongyingshenfu'], - loseDelay:false, + skills: ["gx_chongyingshenfu"], + loseDelay: false, }, - meiyingqiang:{ - fullskin:true, - type:'equip', - subtype:'equip1', - cardimage:'yinyueqiang', - derivation:'tw_zhaoxiang', - distance:{attackFrom:-2}, - ai:{ - basic:{ - equipValue:4.5, - } + meiyingqiang: { + fullskin: true, + type: "equip", + subtype: "equip1", + cardimage: "yinyueqiang", + derivation: "tw_zhaoxiang", + distance: { attackFrom: -2 }, + ai: { + basic: { + equipValue: 4.5, + }, }, - skills:['meiyingqiang'], + skills: ["meiyingqiang"], }, }, - characterFilter:{ - nashime:function(mode){ - return mode!='guozhan'; + characterFilter: { + nashime: function (mode) { + return mode != "guozhan"; }, - tw_xiahouba:function(mode){ - return mode!='guozhan'; + tw_xiahouba: function (mode) { + return mode != "guozhan"; }, }, - skill:{ + skill: { //颜良文丑,但是颜良+文丑 - twduwang:{ - audio:3, - dutySkill:true, - derivation:['twxiayong','twylyanshix'], - global:'twduwang_global', - group:['twduwang_effect','twduwang_achieve','twduwang_fail'], - onremove:['twduwang','twduwang_fail'], - subSkill:{ - effect:{ - audio:'twduwang1.mp3', - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return game.hasPlayer(target=>{ - return target!=player&&target.hasCard(card=>{ - if(get.position(card)=='h') return true; - return target.canUse(get.autoViewAs({name:'juedou'},[card]),player,false); - },'he'); + twduwang: { + audio: 3, + dutySkill: true, + derivation: ["twxiayong", "twylyanshix"], + global: "twduwang_global", + group: ["twduwang_effect", "twduwang_achieve", "twduwang_fail"], + onremove: ["twduwang", "twduwang_fail"], + subSkill: { + effect: { + audio: "twduwang1.mp3", + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer((target) => { + return ( + target != player && + target.hasCard((card) => { + if (get.position(card) == "h") return true; + return target.canUse( + get.autoViewAs({ name: "juedou" }, [card]), + player, + false + ); + }, "he") + ); }); }, - async cost(event,trigger,player){ - let {result}=await player.chooseTarget([1,3],(_,player,target)=>{ - return target!=player&&target.hasCard(card=>{ - if(get.position(card)=='h') return true; - return target.canUse(get.autoViewAs({name:'juedou'},[card]),player,false); - },'he'); - }).set('prompt',get.prompt('twduwang')).set('ai',target=>{ - const player=get.event('player'); - const num=game.countPlayer(current=>{ - return current!=player&¤t.hasCard(card=>{ - if(get.position(card)=='h') return true; - return current.canUse(get.autoViewAs({name:'juedou'},[card]),player,false); - },'he')&&get.effect(current,{name:'guohe_copy2'},current,player)+get.effect(player,{name:'juedou'},current,player)>0; - }); - return (Math.min(num,3)+1)*get.effect(player,{name:'draw'},player,player)+get.effect(target,{name:'guohe_copy2'},target,player)+get.effect(player,{name:'juedou'},target,player); - }).set('prompt2','选择至多三名其他角色并摸选择角色数+1的牌,然后这些角色须将一张牌当作【决斗】对你使用'); - if(result.bool) result.targets.sortBySeat(); - event.result=result; + async cost(event, trigger, player) { + let { result } = await player + .chooseTarget([1, 3], (_, player, target) => { + return ( + target != player && + target.hasCard((card) => { + if (get.position(card) == "h") return true; + return target.canUse( + get.autoViewAs({ name: "juedou" }, [card]), + player, + false + ); + }, "he") + ); + }) + .set("prompt", get.prompt("twduwang")) + .set("ai", (target) => { + const player = get.event("player"); + const num = game.countPlayer((current) => { + return ( + current != player && + current.hasCard((card) => { + if (get.position(card) == "h") return true; + return current.canUse( + get.autoViewAs({ name: "juedou" }, [card]), + player, + false + ); + }, "he") && + get.effect(current, { name: "guohe_copy2" }, current, player) + + get.effect(player, { name: "juedou" }, current, player) > + 0 + ); + }); + return ( + (Math.min(num, 3) + 1) * + get.effect(player, { name: "draw" }, player, player) + + get.effect(target, { name: "guohe_copy2" }, target, player) + + get.effect(player, { name: "juedou" }, target, player) + ); + }) + .set( + "prompt2", + "选择至多三名其他角色并摸选择角色数+1的牌,然后这些角色须将一张牌当作【决斗】对你使用" + ); + if (result.bool) result.targets.sortBySeat(); + event.result = result; }, - async content(event,trigger,player){ - const targets=event.targets; - await player.draw(targets.length+1); + async content(event, trigger, player) { + const targets = event.targets; + await player.draw(targets.length + 1); await game.asyncDelayx(); - for(const target of targets){ - if(!target.hasCard(card=>{ - return target.canUse(get.autoViewAs({name:'juedou'},[card]),player,false); - },'he')) continue; - await target.chooseToUse() - .set('forced',true) - .set('openskilldialog','独往:将一张牌当作【决斗】对'+get.translation(player)+'使用') - .set('norestore',true) - .set('_backupevent','twduwang_backup') - .set('targetRequired',true) - .set('complexSelect',true) - .set('custom',{ - add:{}, - replace:{window:function(){}} - }) - .backup('twduwang_backup') - .set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }) - .set('sourcex',player) - .set('addCount',false); + for (const target of targets) { + if ( + !target.hasCard((card) => { + return target.canUse( + get.autoViewAs({ name: "juedou" }, [card]), + player, + false + ); + }, "he") + ) + continue; + await target + .chooseToUse() + .set("forced", true) + .set( + "openskilldialog", + "独往:将一张牌当作【决斗】对" + get.translation(player) + "使用" + ) + .set("norestore", true) + .set("_backupevent", "twduwang_backup") + .set("targetRequired", true) + .set("complexSelect", true) + .set("custom", { + add: {}, + replace: { window: function () {} }, + }) + .backup("twduwang_backup") + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", player) + .set("addCount", false); await game.asyncDelayx(); } }, }, - backup:{ - viewAs:{name:'juedou'}, - position:'he', - filterCard(card,player){ - const cardx=get.autoViewAs({name:'juedou'},[card]); - return lib.filter.targetEnabledx(cardx,player,get.event('sourcex')); + backup: { + viewAs: { name: "juedou" }, + position: "he", + filterCard(card, player) { + const cardx = get.autoViewAs({ name: "juedou" }, [card]); + return lib.filter.targetEnabledx(cardx, player, get.event("sourcex")); }, - check(card){ - if(get.name(card)=='sha') return 5-get.value(card); - return 8-get.value(card); + check(card) { + if (get.name(card) == "sha") return 5 - get.value(card); + return 8 - get.value(card); }, - precontent(){ + precontent() { delete event.result.skill; - } + }, }, - achieve:{ - audio:'twduwang2.mp3', - trigger:{player:'phaseZhunbeiBegin'}, - filter(event,player){ - if(player.storage.twduwang_fail) return false; - const history=player.actionHistory; - if(history.length<2) return false; - for(let i=history.length-2;i>=0;i--){ - if(history[i].isMe&&!history[i].isSkipped){ - let num=history[i].useCard.filter(evt=>{ - return evt.card.name=='juedou'; - }).length,targets=game.players.slice().concat(game.dead.slice()); - for(const target of targets){ - num+=target.actionHistory[i].useCard.filter(evt=>{ - return evt.card.name=='juedou'&&evt.targets&&evt.targets.includes(player); + achieve: { + audio: "twduwang2.mp3", + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + if (player.storage.twduwang_fail) return false; + const history = player.actionHistory; + if (history.length < 2) return false; + for (let i = history.length - 2; i >= 0; i--) { + if (history[i].isMe && !history[i].isSkipped) { + let num = history[i].useCard.filter((evt) => { + return evt.card.name == "juedou"; + }).length, + targets = game.players.slice().concat(game.dead.slice()); + for (const target of targets) { + num += target.actionHistory[i].useCard.filter((evt) => { + return ( + evt.card.name == "juedou" && + evt.targets && + evt.targets.includes(player) + ); }).length; } - return num>=(targets.length<4?3:4); + return num >= (targets.length < 4 ? 3 : 4); } } return false; }, - forced:true, - skillAnimation:true, - animationColor:'metal', - async content(event,trigger,player){ - player.awakenSkill('twduwang'); - game.log(player,'完成使命'); - if(player.awakenedSkills.includes('twduwang')){ - player.restoreSkill('twduwang'); - game.log(player,'重置了技能','#g【独往】'); + forced: true, + skillAnimation: true, + animationColor: "metal", + async content(event, trigger, player) { + player.awakenSkill("twduwang"); + game.log(player, "完成使命"); + if (player.awakenedSkills.includes("twduwang")) { + player.restoreSkill("twduwang"); + game.log(player, "重置了技能", "#g【独往】"); } - if(!player.storage.twduwang_fail){ - player.storage.twduwang_fail=true; - game.log(player,'修改了技能','#g【独往】'); + if (!player.storage.twduwang_fail) { + player.storage.twduwang_fail = true; + game.log(player, "修改了技能", "#g【独往】"); } - let result,bool1=(player.hasSkill('twxiayong',null,false,false)),bool2=(!player.awakenedSkills.includes('twylyanshi')&&player.storage.twduwang_ylyanshi); - if(bool1&&bool2) result={index:2}; - else if(bool1) result={index:1}; - else if(bool2) result={index:0}; - else result=await player.chooseControl().set('choiceList',[ - '获得〖狭勇〗', - '重置〖延势〗并为其添加历战效果', - ]).set('prompt','独往:请选择一项').set('ai',()=>{ - const player=get.event('player'),num=game.countPlayer(current=>{ - return current!=player&¤t.hasCard(card=>{ - if(get.position(card)=='h') return true; - return current.canUse(get.autoViewAs({name:'juedou'},[card]),player,false); - },'he')&&(get.effect(current,{name:'guohe_copy2'},current,player)/2.5+get.effect(player,{name:'juedou'},current,player)>0); - }); - return num>=2?0:1; - }).forResult(); - if(result.index==0) await player.addSkills('twxiayong'); - if(result.index==1){ - player.popup('twylyanshi'); - if(player.awakenedSkills.includes('twylyanshi')){ - player.restoreSkill('twylyanshi'); - game.log(player,'重置了技能','#g【延势】'); + let result, + bool1 = player.hasSkill("twxiayong", null, false, false), + bool2 = + !player.awakenedSkills.includes("twylyanshi") && + player.storage.twduwang_ylyanshi; + if (bool1 && bool2) result = { index: 2 }; + else if (bool1) result = { index: 1 }; + else if (bool2) result = { index: 0 }; + else + result = await player + .chooseControl() + .set("choiceList", ["获得〖狭勇〗", "重置〖延势〗并为其添加历战效果"]) + .set("prompt", "独往:请选择一项") + .set("ai", () => { + const player = get.event("player"), + num = game.countPlayer((current) => { + return ( + current != player && + current.hasCard((card) => { + if (get.position(card) == "h") return true; + return current.canUse( + get.autoViewAs({ name: "juedou" }, [card]), + player, + false + ); + }, "he") && + get.effect( + current, + { name: "guohe_copy2" }, + current, + player + ) / + 2.5 + + get.effect( + player, + { name: "juedou" }, + current, + player + ) > + 0 + ); + }); + return num >= 2 ? 0 : 1; + }) + .forResult(); + if (result.index == 0) await player.addSkills("twxiayong"); + if (result.index == 1) { + player.popup("twylyanshi"); + if (player.awakenedSkills.includes("twylyanshi")) { + player.restoreSkill("twylyanshi"); + game.log(player, "重置了技能", "#g【延势】"); } - if(!player.storage.twduwang_ylyanshi){ - player.storage.twduwang_ylyanshi=true; - game.log(player,'修改了技能','#g【延势】'); + if (!player.storage.twduwang_ylyanshi) { + player.storage.twduwang_ylyanshi = true; + game.log(player, "修改了技能", "#g【延势】"); } } }, }, - fail:{ - audio:'twduwang3.mp3', - trigger:{player:'die'}, - forceDie:true, - filter(event,player){ + fail: { + audio: "twduwang3.mp3", + trigger: { player: "die" }, + forceDie: true, + filter(event, player) { return !player.storage.twduwang_fail; }, - forced:true, - content(){ - player.awakenSkill('twduwang'); - game.log(player,'使命失败'); + forced: true, + content() { + player.awakenSkill("twduwang"); + game.log(player, "使命失败"); }, }, - global:{ - mod:{ - cardSavable(card,player,target){ - if(card.name=='tao'&&target!=player&&target.hasSkill('twduwang')&&!target.storage.twduwang_fail) return false; + global: { + mod: { + cardSavable(card, player, target) { + if ( + card.name == "tao" && + target != player && + target.hasSkill("twduwang") && + !target.storage.twduwang_fail + ) + return false; }, }, - audio:'twduwang3.mp3', - trigger:{player:'dying'}, - filter(event,player){ - return player.hasSkill('twduwang')&&!player.storage.twduwang_fail; + audio: "twduwang3.mp3", + trigger: { player: "dying" }, + filter(event, player) { + return player.hasSkill("twduwang") && !player.storage.twduwang_fail; }, - forced:true, - content(){}, + forced: true, + content() {}, }, }, }, - twylyanshi:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - filter(event,player){ - return ['juedou','binglinchengxiax'].concat(get.zhinangs()).some(name=>{ - const info={name:name}; - return get.info(info)&&player.hasCard(card=>{ - return get.name(card)=='sha'&&event.filterCard({name:name,cards:[card]},player,event); - },'hs'); + twylyanshi: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + return ["juedou", "binglinchengxiax"].concat(get.zhinangs()).some((name) => { + const info = { name: name }; + return ( + get.info(info) && + player.hasCard((card) => { + return ( + get.name(card) == "sha" && + event.filterCard({ name: name, cards: [card] }, player, event) + ); + }, "hs") + ); }); }, - limited:true, - skillAnimation:true, - animationColor:'fire', - onremove:['twylyanshi','twduwang_ylyanshi'], - chooseButton:{ - dialog(event,player){ - const list=['juedou','binglinchengxiax'].concat(get.zhinangs()).filter(name=>{ - const info={name:name}; - return get.info(info)&&player.hasCard(card=>{ - return get.name(card)=='sha'&&event.filterCard({name:name,cards:[card]},player,event); - },'hs'); - }).map(name=>[get.translation(get.type(name)),'',name]); - return ui.create.dialog('延势',[list,'vcard']); + limited: true, + skillAnimation: true, + animationColor: "fire", + onremove: ["twylyanshi", "twduwang_ylyanshi"], + chooseButton: { + dialog(event, player) { + const list = ["juedou", "binglinchengxiax"] + .concat(get.zhinangs()) + .filter((name) => { + const info = { name: name }; + return ( + get.info(info) && + player.hasCard((card) => { + return ( + get.name(card) == "sha" && + event.filterCard({ name: name, cards: [card] }, player, event) + ); + }, "hs") + ); + }) + .map((name) => [get.translation(get.type(name)), "", name]); + return ui.create.dialog("延势", [list, "vcard"]); }, - check(button){ - return get.event('player').getUseValue({name:button.link[2]}); + check(button) { + return get.event("player").getUseValue({ name: button.link[2] }); }, - backup(links,player){ + backup(links, player) { return { - audio:'twylyanshi', - filterCard(card,player){ - return get.name(card)=='sha'; + audio: "twylyanshi", + filterCard(card, player) { + return get.name(card) == "sha"; }, - popname:true, - check(card){ - return 5-get.value(card); + popname: true, + check(card) { + return 5 - get.value(card); }, - position:'hs', - viewAs:{name:links[0][2]}, - precontent(){ + position: "hs", + viewAs: { name: links[0][2] }, + precontent() { delete event.result.skill; - player.logSkill('twylyanshi'); - player.awakenSkill('twylyanshi'); - if(player.storage.twduwang_ylyanshi){ - player.when({global:'phaseEnd'}).then(()=>{ - if(player.awakenedSkills.includes('twylyanshi')){ - player.popup('历战'); - player.restoreSkill('twylyanshi'); - game.log(player,'触发了','#g【延势】','的','#y历战','效果'); + player.logSkill("twylyanshi"); + player.awakenSkill("twylyanshi"); + if (player.storage.twduwang_ylyanshi) { + player.when({ global: "phaseEnd" }).then(() => { + if (player.awakenedSkills.includes("twylyanshi")) { + player.popup("历战"); + player.restoreSkill("twylyanshi"); + game.log(player, "触发了", "#g【延势】", "的", "#y历战", "效果"); } }); } }, - } + }; + }, + prompt(links, player) { + return "将一张【杀】当作" + "【" + get.translation(links[0][2]) + "】使用"; }, - prompt(links,player){ - return '将一张【杀】当作'+'【'+get.translation(links[0][2])+'】使用'; - } }, - subSkill:{backup:{}}, - hiddenCard(player,name){ - if(player.awakenedSkills.includes('twylyanshi')||!player.countCards('hs',card=>_status.connectMode||get.name(card)=='sha')) return false; - return ['juedou','binglinchengxiax'].concat(get.zhinangs()).includes(name); + subSkill: { backup: {} }, + hiddenCard(player, name) { + if ( + player.awakenedSkills.includes("twylyanshi") || + !player.countCards("hs", (card) => _status.connectMode || get.name(card) == "sha") + ) + return false; + return ["juedou", "binglinchengxiax"].concat(get.zhinangs()).includes(name); }, - ai:{ - order(item,player){ - if(!player||_status.event.type!='phase') return 0.001; - let max=0,names=['juedou','binglinchengxiax'].concat(get.zhinangs()).filter(name=>{ - const info={name:name}; - return get.info(info)&&player.hasCard(card=>{ - return get.name(card)=='sha'&&player.hasValueTarget(get.autoViewAs(info,[card]),true,true); - },'hs'); + ai: { + order(item, player) { + if (!player || _status.event.type != "phase") return 0.001; + let max = 0, + names = ["juedou", "binglinchengxiax"].concat(get.zhinangs()).filter((name) => { + const info = { name: name }; + return ( + get.info(info) && + player.hasCard((card) => { + return ( + get.name(card) == "sha" && + player.hasValueTarget(get.autoViewAs(info, [card]), true, true) + ); + }, "hs") + ); + }); + if (!names.length) return 0; + names = names.map((namex) => { + return { name: namex }; }); - if(!names.length) return 0; - names=names.map(namex=>{return {name:namex}}); - names.forEach(card=>{ - if(player.getUseValue(card)>0){ - let temp=get.order(card); - if(temp>max) max=temp; + names.forEach((card) => { + if (player.getUseValue(card) > 0) { + let temp = get.order(card); + if (temp > max) max = temp; } }); - if(max>0) max+=0.3; + if (max > 0) max += 0.3; return max; }, - result:{player:1}, + result: { player: 1 }, }, }, - twjuexing:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(target=>get.info('twjuexing').filterTarget(null,player,target)); + twjuexing: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer((target) => + get.info("twjuexing").filterTarget(null, player, target) + ); }, - filterTarget(_,player,target){ - const card=new lib.element.VCard({name:'juedou'}); - return target!=player&&player.canUse(card,target); + filterTarget(_, player, target) { + const card = new lib.element.VCard({ name: "juedou" }); + return target != player && player.canUse(card, target); }, - usable:1, - onremove:'twjuexing_lizhan', - async content(event,trigger,player){ - player.when({global:'phaseEnd'}).then(()=>{ - player.popup('历战'); - player.addSkill('twjuexing_lizhan'); - player.addMark('twjuexing_lizhan',1,false); - game.log(player,'触发了','#g【绝行】','的','#y历战','效果'); + usable: 1, + onremove: "twjuexing_lizhan", + async content(event, trigger, player) { + player.when({ global: "phaseEnd" }).then(() => { + player.popup("历战"); + player.addSkill("twjuexing_lizhan"); + player.addMark("twjuexing_lizhan", 1, false); + game.log(player, "触发了", "#g【绝行】", "的", "#y历战", "效果"); }); - const target=event.target; - const card=new lib.element.VCard({name:'juedou'}); - player.addTempSkill('twjuexing_effect'); - player.when({global:'useCardAfter'}).filter(evtx=>evtx.getParent()==event) - .then(()=>{ - let list=[]; - var targets=[player].concat(trigger.targets); - for(const i of targets){ - if(i.isIn()&&i.hasCard(card=>card.hasGaintag('twjuexing'),'h')){ - list.push([i,i.getCards('h',card=>card.hasGaintag('twjuexing'))]); - } - } - if(list.length){ - game.loseAsync({lose_list:list}).setContent('discardMultiple'); - } - }).then(()=>{ - let listx=[]; - var targets=[player].concat(trigger.targets); - for(const i of targets){ - if(i.isIn()&&i.getExpansions('twjuexing_buff').length){ - listx.push([i,i.getExpansions('twjuexing_buff')]); - } - } - if(listx.length){ - game.loseAsync({gain_list:listx,animate:'draw'}).setContent('gaincardMultiple'); - } - }).then(()=>{ - var targets=[player].concat(trigger.targets); - targets.forEach(current=>{ - current.removeSkill('twjuexing_buff'); - }); - game.delay(); - }); - await player.useCard(card,target,false); - }, - ai:{ - order:1, - result:{ - target(player,target){ - return get.sgn(get.attitude(player,target))*get.effect(target,{name:'juedou'},player,player)*((player.getHp()+1)/(target.getHp()+1)); - }, - }, - }, - subSkill:{ - effect:{ - trigger:{global:'useCardToBegin'}, - forced:true, - popup:false, - charlotte:true, - filter(event,player){ - return event.getParent(2).name==='twjuexing'; - }, - async content(event,trigger,player){ - const target=trigger.target; - player.addSkill('twjuexing_buff'); - target.addSkill('twjuexing_buff'); - let list=[]; - for(const i of [player,target]){ - if(i.isIn()&&i.countCards('h')){ - list.push([i,i.getCards('h')]); + const target = event.target; + const card = new lib.element.VCard({ name: "juedou" }); + player.addTempSkill("twjuexing_effect"); + player + .when({ global: "useCardAfter" }) + .filter((evtx) => evtx.getParent() == event) + .then(() => { + let list = []; + var targets = [player].concat(trigger.targets); + for (const i of targets) { + if (i.isIn() && i.hasCard((card) => card.hasGaintag("twjuexing"), "h")) { + list.push([i, i.getCards("h", (card) => card.hasGaintag("twjuexing"))]); } } - if(list.length){ - await game.loseAsync({ - lose_list:list, - log:true, - animate:'giveAuto', - gaintag:['twjuexing_buff'], - }).setContent(get.info('sbquhu').addToExpansionMultiple); + if (list.length) { + game.loseAsync({ lose_list: list }).setContent("discardMultiple"); } - if(player.getHp()>0) await player.draw(player.getHp(),(target.getHp()>0?'nodelay':'')).set('gaintag',['twjuexing']); - if(target.getHp()>0) await target.draw(target.getHp()).set('gaintag',['twjuexing']); + }) + .then(() => { + let listx = []; + var targets = [player].concat(trigger.targets); + for (const i of targets) { + if (i.isIn() && i.getExpansions("twjuexing_buff").length) { + listx.push([i, i.getExpansions("twjuexing_buff")]); + } + } + if (listx.length) { + game.loseAsync({ gain_list: listx, animate: "draw" }).setContent( + "gaincardMultiple" + ); + } + }) + .then(() => { + var targets = [player].concat(trigger.targets); + targets.forEach((current) => { + current.removeSkill("twjuexing_buff"); + }); + game.delay(); + }); + await player.useCard(card, target, false); + }, + ai: { + order: 1, + result: { + target(player, target) { + return ( + get.sgn(get.attitude(player, target)) * + get.effect(target, { name: "juedou" }, player, player) * + ((player.getHp() + 1) / (target.getHp() + 1)) + ); + }, + }, + }, + subSkill: { + effect: { + trigger: { global: "useCardToBegin" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + return event.getParent(2).name === "twjuexing"; + }, + async content(event, trigger, player) { + const target = trigger.target; + player.addSkill("twjuexing_buff"); + target.addSkill("twjuexing_buff"); + let list = []; + for (const i of [player, target]) { + if (i.isIn() && i.countCards("h")) { + list.push([i, i.getCards("h")]); + } + } + if (list.length) { + await game + .loseAsync({ + lose_list: list, + log: true, + animate: "giveAuto", + gaintag: ["twjuexing_buff"], + }) + .setContent(get.info("sbquhu").addToExpansionMultiple); + } + if (player.getHp() > 0) + await player + .draw(player.getHp(), target.getHp() > 0 ? "nodelay" : "") + .set("gaintag", ["twjuexing"]); + if (target.getHp() > 0) + await target.draw(target.getHp()).set("gaintag", ["twjuexing"]); await game.asyncDelay(); - } - }, - lizhan:{ - charlotte:true, - onremove:true, - marktext:'战', - intro:{content:'因【绝行】摸牌时,摸牌数+#'}, - trigger:{player:'drawBegin'}, - filter(event,player){ - if(!player.hasMark('twjuexing_lizhan')) return false; - return (event.gaintag||[]).includes('twjuexing'); - }, - forced:true, - popup:false, - content(){ - player.popup('历战'); - game.log(player,'触发了','#g【绝行】','的','#y历战','效果'); - trigger.num+=player.countMark('twjuexing_lizhan'); }, }, - buff:{ - charlotte:true, - onremove(player,skill){ - const cards=player.getExpansions(skill); - if(cards.length) player.gain(cards,'gain2'); + lizhan: { + charlotte: true, + onremove: true, + marktext: "战", + intro: { content: "因【绝行】摸牌时,摸牌数+#" }, + trigger: { player: "drawBegin" }, + filter(event, player) { + if (!player.hasMark("twjuexing_lizhan")) return false; + return (event.gaintag || []).includes("twjuexing"); }, - intro:{ - markcount:'expansion', - mark(dialog,_,player){ - var cards=player.getExpansions('twjuexing_buff'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; + forced: true, + popup: false, + content() { + player.popup("历战"); + game.log(player, "触发了", "#g【绝行】", "的", "#y历战", "效果"); + trigger.num += player.countMark("twjuexing_lizhan"); + }, + }, + buff: { + charlotte: true, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.gain(cards, "gain2"); + }, + intro: { + markcount: "expansion", + mark(dialog, _, player) { + var cards = player.getExpansions("twjuexing_buff"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; }, }, }, }, }, - twxiayong:{ - audio:2, - audioname:['tw_yanliang'], - locked:true, - group:'twxiayong_effect', - subSkill:{ - effect:{ - trigger:{global:'damageBegin1'}, - filter(event,player){ - if(event.getParent().type!='card'||event.card.name!='juedou'||!event.player.isIn()) return false; - const evt=game.getGlobalHistory('useCard',evt=>evt.card==event.card)[0]; - if(evt&&evt.targets&&(event.player!=player||player.countCards('h'))){ - if(evt.player==player){ - return evt.targets.includes(event.player)&&event.player!=player; + twxiayong: { + audio: 2, + audioname: ["tw_yanliang"], + locked: true, + group: "twxiayong_effect", + subSkill: { + effect: { + trigger: { global: "damageBegin1" }, + filter(event, player) { + if ( + event.getParent().type != "card" || + event.card.name != "juedou" || + !event.player.isIn() + ) + return false; + const evt = game.getGlobalHistory("useCard", (evt) => evt.card == event.card)[0]; + if (evt && evt.targets && (event.player != player || player.countCards("h"))) { + if (evt.player == player) { + return evt.targets.includes(event.player) && event.player != player; } - return evt.targets.includes(player)&&evt.player!=player; + return evt.targets.includes(player) && evt.player != player; } return false; }, - forced:true, - popup:false, - async content(event,trigger,player){ - await player.logSkill('twxiayong'+(trigger.player===player?'1':'2'),trigger.player); - if(trigger.player===player){ - const cards=player.getCards('h',card=>{ - return lib.filter.cardDiscardable(card,player,'twxiayong'); + forced: true, + popup: false, + async content(event, trigger, player) { + await player.logSkill( + "twxiayong" + (trigger.player === player ? "1" : "2"), + trigger.player + ); + if (trigger.player === player) { + const cards = player.getCards("h", (card) => { + return lib.filter.cardDiscardable(card, player, "twxiayong"); }); - if(cards.length>0) player.discard(cards.randomGet()); - } - else{ - trigger.increase('num'); + if (cards.length > 0) player.discard(cards.randomGet()); + } else { + trigger.increase("num"); } }, }, }, }, - twxiayong1:{ - audio:true, - audioname:['tw_yanliang'], - sourceSkill:'twxiayong', + twxiayong1: { + audio: true, + audioname: ["tw_yanliang"], + sourceSkill: "twxiayong", }, - twxiayong2:{ - inherit:'twxiayong1', + twxiayong2: { + inherit: "twxiayong1", }, //袁谭 - twqiaosi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return get.info('twqiaosi').getCards(player).length; + twqiaosi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return get.info("twqiaosi").getCards(player).length; }, - check(event,player){ - const cards=get.info('twqiaosi').getCards(player); - if(cards.reduce((sum,card)=>sum+get.value(card),0)) return false; - if(cards.length>=player.getHp()||cards.some(card=>get.name(card,player)=='tao'||get.name(card,player)=='jiu')) return true; - return player.getHp()>2&&cards.length>1; + check(event, player) { + const cards = get.info("twqiaosi").getCards(player); + if (cards.reduce((sum, card) => sum + get.value(card), 0)) return false; + if ( + cards.length >= player.getHp() || + cards.some( + (card) => get.name(card, player) == "tao" || get.name(card, player) == "jiu" + ) + ) + return true; + return player.getHp() > 2 && cards.length > 1; }, - prompt2(event,player){ - const cards=get.info('twqiaosi').getCards(player); - let str='获得'+get.translation(cards); - if(cards.lengthevt.position==ui.discardPile); - if(history.length){ - for(const evt of history) cards.addArray(evt.cards2.filterInD('d')); + getCards(player) { + let cards = [], + targets = game.players.slice().concat(game.dead.slice()); + for (const target of targets) { + if (target == player) continue; + const history = target.getHistory("lose", (evt) => evt.position == ui.discardPile); + if (history.length) { + for (const evt of history) cards.addArray(evt.cards2.filterInD("d")); } } - const historyx=game.getGlobalHistory('cardMove',evt=>{ - if(evt.name!='cardsDiscard') return false; - const evtx=evt.getParent(); - if(evtx.name!='orderingDiscard') return false; - const evt2=(evtx.relatedEvent||evtx.getParent()); - const current=evt2.player; - if(evt2.name=='phaseJudge'||current==player) return false; - return current.hasHistory('lose',evtx3=>{ - const evtx4=evtx3.relatedEvent||evtx3.getParent(); - if(evt2!=evtx4) return false; - return evtx3.getl(current).cards2.length>0; + const historyx = game.getGlobalHistory("cardMove", (evt) => { + if (evt.name != "cardsDiscard") return false; + const evtx = evt.getParent(); + if (evtx.name != "orderingDiscard") return false; + const evt2 = evtx.relatedEvent || evtx.getParent(); + const current = evt2.player; + if (evt2.name == "phaseJudge" || current == player) return false; + return current.hasHistory("lose", (evtx3) => { + const evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evt2 != evtx4) return false; + return evtx3.getl(current).cards2.length > 0; }); }); - if(historyx.length){ - for(const evtx of historyx) cards.addArray(evtx.cards.filterInD('d')); + if (historyx.length) { + for (const evtx of historyx) cards.addArray(evtx.cards.filterInD("d")); } return cards; }, }, - twbaizu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter(event,player){ - return player.isDamaged()&&player.countCards('h')&&game.hasPlayer(target=>{ - return target!=player&&target.countCards('h'); - })&&(player.getHp()+player.countMark('twbaizu_lizhan')); + twbaizu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.isDamaged() && + player.countCards("h") && + game.hasPlayer((target) => { + return target != player && target.countCards("h"); + }) && + player.getHp() + player.countMark("twbaizu_lizhan") + ); }, - locked:true, - async cost(event,trigger,player){ - const sum=player.getHp()+player.countMark('twbaizu_lizhan'),filterTarget=(_,player,target)=>{ - return target!=player&&target.countCards('h'); - }; - let targets=game.filterPlayer(target=>filterTarget(null,player,target)); - if(targets.length>sum){ - targets=await player.chooseTarget('请选择【败族】的目标','令你和这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的其他角色各造成1点伤害',filterTarget,sum,true).set('ai',target=>{ - const player=get.event('player'); - return get.effect(target,{name:'guohe_copy2'},target,player)+get.damageEffect(target,player,player); - }).forResultTargets(); + locked: true, + async cost(event, trigger, player) { + const sum = player.getHp() + player.countMark("twbaizu_lizhan"), + filterTarget = (_, player, target) => { + return target != player && target.countCards("h"); + }; + let targets = game.filterPlayer((target) => filterTarget(null, player, target)); + if (targets.length > sum) { + targets = await player + .chooseTarget( + "请选择【败族】的目标", + "令你和这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的其他角色各造成1点伤害", + filterTarget, + sum, + true + ) + .set("ai", (target) => { + const player = get.event("player"); + return ( + get.effect(target, { name: "guohe_copy2" }, target, player) + + get.damageEffect(target, player, player) + ); + }) + .forResultTargets(); } - event.result={bool:true,targets}; + event.result = { bool: true, targets }; }, - async content(event,trigger,player){ - const targets=event.targets.slice().sortBySeat(); + async content(event, trigger, player) { + const targets = event.targets.slice().sortBySeat(); player.line(targets); - let list=[player].concat(targets).filter(target=>target.countDiscardableCards(target,'h')); - if(list.length){ - let discards=[]; - const {result}=await player.chooseCardOL(list,'败族:请弃置一张手牌',(card,player)=>{ - return lib.filter.cardDiscardable(card,player); - },true).set('ai',get.unuseful); - if(result){ - for(let i=0;i target.countDiscardableCards(target, "h")); + if (list.length) { + let discards = []; + const { result } = await player + .chooseCardOL( + list, + "败族:请弃置一张手牌", + (card, player) => { + return lib.filter.cardDiscardable(card, player); + }, + true + ) + .set("ai", get.unuseful); + if (result) { + for (let i = 0; i < result.length; i++) { + discards.push([list[i], result[i].cards]); } - await game.loseAsync({lose_list:discards}).setContent('discardMultiple'); - list=list.filter(i=>get.type2(result[0].cards[0])==get.type2(result[list.indexOf(i)].cards[0])); - if(list.length){ - for(const i of list){ - if(i===player) continue; + await game.loseAsync({ lose_list: discards }).setContent("discardMultiple"); + list = list.filter( + (i) => + get.type2(result[0].cards[0]) == + get.type2(result[list.indexOf(i)].cards[0]) + ); + if (list.length) { + for (const i of list) { + if (i === player) continue; player.line(i); await i.damage(); } } } } - player.when({global:'phaseEnd'}).then(()=>{ - player.popup('历战'); - player.addMark('twbaizu_lizhan',1,false); - game.log(player,'触发了','#g【败族】','的','#y历战','效果'); + player.when({ global: "phaseEnd" }).then(() => { + player.popup("历战"); + player.addMark("twbaizu_lizhan", 1, false); + game.log(player, "触发了", "#g【败族】", "的", "#y历战", "效果"); }); }, - subSkill:{ - lizhan:{ - charlotte:true, - onremove:true, - marktext:'战', - intro:{content:'【败族】目标选择数+#'}, + subSkill: { + lizhan: { + charlotte: true, + onremove: true, + marktext: "战", + intro: { content: "【败族】目标选择数+#" }, }, }, }, //玉真子 - twhuajing:{ - audio:2, - getSkills(player){ - return player.getCards('e',card=>get.subtype(card)=='equip1').reduce((list,card)=>{ - const info=get.info(card); - if(info&&info.skills) return list.addArray(info.skills); - return list; - },[]); + twhuajing: { + audio: 2, + getSkills(player) { + return player + .getCards("e", (card) => get.subtype(card) == "equip1") + .reduce((list, card) => { + const info = get.info(card); + if (info && info.skills) return list.addArray(info.skills); + return list; + }, []); }, - trigger:{global:'phaseBefore',player:'enterGame'}, - filter(event,player){ - return event.name!='phase'||game.phaseNumber==0; + trigger: { global: "phaseBefore", player: "enterGame" }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - async content(event,trigger,player){ - const skills=lib.skill.twhuajing.derivation; - for(const eff of skills){ - player.addMark(eff,1); + forced: true, + locked: false, + async content(event, trigger, player) { + const skills = lib.skill.twhuajing.derivation; + for (const eff of skills) { + player.addMark(eff, 1); player.unmarkSkill(eff); } - player.markSkill('twhuajing'); + player.markSkill("twhuajing"); }, - global:'twhuajing_global', - group:'twhuajing_use', - derivation:['twhuajing_jian','twhuajing_dao','twhuajing_fu','twhuajing_qiang','twhuajing_ji','twhuajing_gong'], - marktext:'武', - intro:{ - markcount(storage,player){ - return lib.skill.twhuajing.derivation.filter(skill=>player.hasMark(skill)).length; + global: "twhuajing_global", + group: "twhuajing_use", + derivation: [ + "twhuajing_jian", + "twhuajing_dao", + "twhuajing_fu", + "twhuajing_qiang", + "twhuajing_ji", + "twhuajing_gong", + ], + marktext: "武", + intro: { + markcount(storage, player) { + return lib.skill.twhuajing.derivation.filter((skill) => player.hasMark(skill)).length; }, - content(storage,player){ - const skills=lib.skill.twhuajing.derivation.filter(skill=>player.hasMark(skill)); - if(!skills.length) return '功力已消耗殆尽'; - let str='当前武功:'; - for(const eff of skills){ - str+='
  • '; - str+=lib.translate[eff]; - str+=':'; - str+=lib.translate[eff+'_info']; + content(storage, player) { + const skills = lib.skill.twhuajing.derivation.filter((skill) => + player.hasMark(skill) + ); + if (!skills.length) return "功力已消耗殆尽"; + let str = "当前武功:"; + for (const eff of skills) { + str += "
  • "; + str += lib.translate[eff]; + str += ":"; + str += lib.translate[eff + "_info"]; } return str; }, }, - subSkill:{ - global:{ - mod:{ - attackRange(player,num){ - const skills=lib.skill.twhuajing.derivation.filter(skill=>player.hasMark(skill)||player.hasSkill(skill)); - if(skills.length) return num+skills.length*game.countPlayer(target=>target.hasSkill('twhuajing')); + subSkill: { + global: { + mod: { + attackRange(player, num) { + const skills = lib.skill.twhuajing.derivation.filter( + (skill) => player.hasMark(skill) || player.hasSkill(skill) + ); + if (skills.length) + return ( + num + + skills.length * + game.countPlayer((target) => target.hasSkill("twhuajing")) + ); }, }, }, - use:{ - audio:'twhuajing', - enable:'phaseUse', - filter(event,player){ - return lib.skill.twhuajing.derivation.some(skill=>player.hasMark(skill)); + use: { + audio: "twhuajing", + enable: "phaseUse", + filter(event, player) { + return lib.skill.twhuajing.derivation.some((skill) => player.hasMark(skill)); }, - filterCard:true, - selectCard:[1,4], - position:'h', - complexCard:true, - discard:false, - lose:false, - delay:false, - check(card){ - const player=get.event('player'),skills=lib.skill.twhuajing.derivation.filter(skill=>player.hasMark(skill)); - if(ui.selected.cards.some(cardx=>get.suit(cardx,player)==get.suit(card,player))) return 0; - return skills.length-ui.selected.cards.length; + filterCard: true, + selectCard: [1, 4], + position: "h", + complexCard: true, + discard: false, + lose: false, + delay: false, + check(card) { + const player = get.event("player"), + skills = lib.skill.twhuajing.derivation.filter((skill) => + player.hasMark(skill) + ); + if ( + ui.selected.cards.some( + (cardx) => get.suit(cardx, player) == get.suit(card, player) + ) + ) + return 0; + return skills.length - ui.selected.cards.length; }, - usable:1, - prompt:'展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果', - async content(event,trigger,player){ - await player.showCards(event.cards,get.translation(player)+'发动了【化境】'); - const skills=lib.skill.twhuajing.derivation.filter(skill=>player.hasMark(skill)); - const gainSkills=skills.randomGets(Math.min(skills.length,event.cards.reduce((list,cardx)=>list.add(get.suit(cardx,player)),[]).length)); - for(const eff of gainSkills) player.popup(eff); + usable: 1, + prompt: "展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果", + async content(event, trigger, player) { + await player.showCards(event.cards, get.translation(player) + "发动了【化境】"); + const skills = lib.skill.twhuajing.derivation.filter((skill) => + player.hasMark(skill) + ); + const gainSkills = skills.randomGets( + Math.min( + skills.length, + event.cards.reduce((list, cardx) => list.add(get.suit(cardx, player)), []) + .length + ) + ); + for (const eff of gainSkills) player.popup(eff); player.addTempSkill(gainSkills); - player.addTempSkill('twhuajing_blocker'); - player.getHistory('custom').push({twhuajing_skills:gainSkills}); + player.addTempSkill("twhuajing_blocker"); + player.getHistory("custom").push({ twhuajing_skills: gainSkills }); }, - ai:{ - order:12, - result:{ - player(player){ - return player.countCards('hs',card=>{ - return get.name(card)=='sha'&&player.hasValueTarget(card,false,true); + ai: { + order: 12, + result: { + player(player) { + return player.countCards("hs", (card) => { + return ( + get.name(card) == "sha" && + player.hasValueTarget(card, false, true) + ); }); }, }, }, }, - jian:{ - charlotte:true, - mark:true, - marktext:'剑', - intro:{ - name:'化境·剑', - name2:'剑', - markcount:()=>0, - content:()=>lib.translate.twhuajing_jian_info, + jian: { + charlotte: true, + mark: true, + marktext: "剑", + intro: { + name: "化境·剑", + name2: "剑", + markcount: () => 0, + content: () => lib.translate.twhuajing_jian_info, }, - nopop:true, - trigger:{player:'useCardToPlayered'}, - filter(event,player){ - return event.card.name=='sha'&&event.target.countCards('he'); + nopop: true, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return event.card.name == "sha" && event.target.countCards("he"); }, - forced:true, - logTarget:'target', - async content(event,trigger,player){ - const target=trigger.target; - const cards=target.getDiscardableCards(player,'he'); - target.discard(cards.randomGets(Math.min(2,cards.length))).discarder=player; + forced: true, + logTarget: "target", + async content(event, trigger, player) { + const target = trigger.target; + const cards = target.getDiscardableCards(player, "he"); + target.discard(cards.randomGets(Math.min(2, cards.length))).discarder = player; }, }, - dao:{ - charlotte:true, - mark:true, - marktext:'刀', - intro:{ - name:'化境·刀', - name2:'刀', - markcount:()=>0, - content:()=>lib.translate.twhuajing_dao_info, + dao: { + charlotte: true, + mark: true, + marktext: "刀", + intro: { + name: "化境·刀", + name2: "刀", + markcount: () => 0, + content: () => lib.translate.twhuajing_dao_info, }, - nopop:true, - inherit:'guding_skill', - equipSkill:false, + nopop: true, + inherit: "guding_skill", + equipSkill: false, }, - fu:{ - charlotte:true, - mark:true, - marktext:'斧', - intro:{ - name:'化境·斧', - name2:'斧', - markcount:()=>0, - content:()=>lib.translate.twhuajing_fu_info, + fu: { + charlotte: true, + mark: true, + marktext: "斧", + intro: { + name: "化境·斧", + name2: "斧", + markcount: () => 0, + content: () => lib.translate.twhuajing_fu_info, }, - nopop:true, - trigger:{player:'shaMiss'}, - forced:true, - logTarget:'target', - async content(event,trigger,player){ + nopop: true, + trigger: { player: "shaMiss" }, + forced: true, + logTarget: "target", + async content(event, trigger, player) { trigger.target.damage(); }, - ai:{ - directHit_ai:true, - skillTagFilter(player,tag,arg){ - if(!arg||!arg.card||arg.card.name!='sha'||!arg.baseDamage||arg.baseDamage<=1) return false; + ai: { + directHit_ai: true, + skillTagFilter(player, tag, arg) { + if ( + !arg || + !arg.card || + arg.card.name != "sha" || + !arg.baseDamage || + arg.baseDamage <= 1 + ) + return false; return true; }, }, }, - qiang:{ - charlotte:true, - mark:true, - marktext:'枪', - intro:{ - name:'化境·枪', - name2:'枪', - markcount:()=>0, - content:()=>lib.translate.twhuajing_qiang_info, + qiang: { + charlotte: true, + mark: true, + marktext: "枪", + intro: { + name: "化境·枪", + name2: "枪", + markcount: () => 0, + content: () => lib.translate.twhuajing_qiang_info, }, - nopop:true, - trigger:{player:'useCardAfter'}, - filter(event,player){ - return event.card.name=='sha'&&get.color(event.card)=='black'; + nopop: true, + trigger: { player: "useCardAfter" }, + filter(event, player) { + return event.card.name == "sha" && get.color(event.card) == "black"; }, - forced:true, - async content(event,trigger,player){ - const card=get.cardPile(card=>card.name=='shan'); - if(card) player.gain(card,'gain2'); + forced: true, + async content(event, trigger, player) { + const card = get.cardPile((card) => card.name == "shan"); + if (card) player.gain(card, "gain2"); }, }, - ji:{ - charlotte:true, - mark:true, - marktext:'戟', - intro:{ - name:'化境·戟', - name2:'戟', - markcount:()=>0, - content:()=>lib.translate.twhuajing_ji_info, + ji: { + charlotte: true, + mark: true, + marktext: "戟", + intro: { + name: "化境·戟", + name2: "戟", + markcount: () => 0, + content: () => lib.translate.twhuajing_ji_info, }, - nopop:true, - trigger:{source:'damageBegin3'}, - filter(event,player){ - return event.card&&event.card.name=='sha'; + nopop: true, + trigger: { source: "damageBegin3" }, + filter(event, player) { + return event.card && event.card.name == "sha"; }, - forced:true, - async content(event,trigger,player){ + forced: true, + async content(event, trigger, player) { player.draw(trigger.num); }, }, - gong:{ - charlotte:true, - mark:true, - marktext:'弓', - intro:{ - name:'化境·弓', - name2:'弓', - markcount:()=>0, - content:()=>lib.translate.twhuajing_gong_info, + gong: { + charlotte: true, + mark: true, + marktext: "弓", + intro: { + name: "化境·弓", + name2: "弓", + markcount: () => 0, + content: () => lib.translate.twhuajing_gong_info, }, - nopop:true, - trigger:{source:'damageSource'}, - filter(event,player){ - return event.card&&event.card.name=='sha'&&event.player.countDiscardableCards(player,'e'); + nopop: true, + trigger: { source: "damageSource" }, + filter(event, player) { + return ( + event.card && + event.card.name == "sha" && + event.player.countDiscardableCards(player, "e") + ); }, - forced:true, - logTarget:'player', - async content(event,trigger,player){ - trigger.player.discard(trigger.player.getDiscardableCards(player,'e').randomGets(1)).discarder=player; + forced: true, + logTarget: "player", + async content(event, trigger, player) { + trigger.player.discard( + trigger.player.getDiscardableCards(player, "e").randomGets(1) + ).discarder = player; }, }, - blocker:{ - charlotte:true, - init(player,skill){ - player.disableSkill(skill,lib.skill.twhuajing.getSkills(player)); + blocker: { + charlotte: true, + init(player, skill) { + player.disableSkill(skill, lib.skill.twhuajing.getSkills(player)); }, - onremove(player,skill){ + onremove(player, skill) { player.enableSkill(skill); }, - mod:{ - attackRange(player,num){ - return num-player.getEquipRange(); + mod: { + attackRange(player, num) { + return num - player.getEquipRange(); }, }, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter','phaseBefore'], + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + "phaseBefore", + ], }, - filter(event,player){ - if(event.name=='phase') return true; - if(event.name=='equip'&&event.player==player&&get.subtype(event.card)=='equip1') return true; - const evt=event.getl(player); - return evt&&evt.player==player&&evt.es&&evt.es.some(card=>get.subtype(card)=='equip1'); + filter(event, player) { + if (event.name == "phase") return true; + if ( + event.name == "equip" && + event.player == player && + get.subtype(event.card) == "equip1" + ) + return true; + const evt = event.getl(player); + return ( + evt && + evt.player == player && + evt.es && + evt.es.some((card) => get.subtype(card) == "equip1") + ); }, - forced:true, - popup:false, - firstDo:true, - async content(event,trigger,player){ - player.enableSkill('twhuajing_blocker'); - player.disableSkill('twhuajing_blocker',lib.skill.twhuajing.getSkills(player)); + forced: true, + popup: false, + firstDo: true, + async content(event, trigger, player) { + player.enableSkill("twhuajing_blocker"); + player.disableSkill("twhuajing_blocker", lib.skill.twhuajing.getSkills(player)); }, - ai:{unequip_equip1:true}, + ai: { unequip_equip1: true }, }, }, }, - twtianshou:{ - audio:2, - trigger:{player:'phaseEnd'}, - filter(event,player){ - return player.getHistory('sourceDamage',evt=>{ - return evt.card&&evt.card.name=='sha'; - }).length&&player.getHistory('custom',evt=>{ - return evt.twhuajing_skills; - }).reduce((list,evt)=>list.addArray(evt.twhuajing_skills),[]).some(skill=>player.hasMark(skill)); + twtianshou: { + audio: 2, + trigger: { player: "phaseEnd" }, + filter(event, player) { + return ( + player.getHistory("sourceDamage", (evt) => { + return evt.card && evt.card.name == "sha"; + }).length && + player + .getHistory("custom", (evt) => { + return evt.twhuajing_skills; + }) + .reduce((list, evt) => list.addArray(evt.twhuajing_skills), []) + .some((skill) => player.hasMark(skill)) + ); }, - forced:true, - async content(event,trigger,player){ - const {result:{bool,targets}}=await player.chooseTarget(lib.filter.notMe,true) - .set('prompt','天授:令一名其他角色获得1枚“武”并获得此标记的效果') - .set('ai',target=>{ - const player=get.event('player'),att=get.attitude(player,target); - const card=new lib.element.VCard({name:'sha'}); - if(att>0) return game.countPlayer(aim=>{ - return target.canUse(card,target)&&get.effect(aim,card,target,player)>0&&get.effect(aim,card,target,target)>0; - })+10; - if(att==0) return 1.5+Math.random(); - return 0.1+Math.random(); - }); - if(bool){ - const target=targets[0]; - const skills=player.getHistory('custom',evt=>{ - return evt.twhuajing_skills; - }).reduce((list,evt)=>list.addArray(evt.twhuajing_skills),[]).filter(skill=>player.hasMark(skill)); - let choiceList=skills.map(i=>{ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    ' + - '
    '+get.skillInfoTranslation(i,player)+'
    '; + forced: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(lib.filter.notMe, true) + .set("prompt", "天授:令一名其他角色获得1枚“武”并获得此标记的效果") + .set("ai", (target) => { + const player = get.event("player"), + att = get.attitude(player, target); + const card = new lib.element.VCard({ name: "sha" }); + if (att > 0) + return ( + game.countPlayer((aim) => { + return ( + target.canUse(card, target) && + get.effect(aim, card, target, player) > 0 && + get.effect(aim, card, target, target) > 0 + ); + }) + 10 + ); + if (att == 0) return 1.5 + Math.random(); + return 0.1 + Math.random(); }); - const {result:{control}}=await player.chooseControl(skills) - .set('prompt','选择令'+get.translation(target)+'获得的“武”') - .set('choiceList',choiceList).set('displayIndex',false).set('ai',()=>get.event('controls').randomGet()); - if(control){ - player.removeMark(control,1); - player.markSkill('twhuajing'); - player.popup(control,'metal'); - target.addTempSkill(control,{player:'phaseAfter'}); - target.addTempSkill('twhuajing_blocker',{player:'phaseAfter'}); - target.getHistory('custom').push({twhuajing_skills:[control]}); + if (bool) { + const target = targets[0]; + const skills = player + .getHistory("custom", (evt) => { + return evt.twhuajing_skills; + }) + .reduce((list, evt) => list.addArray(evt.twhuajing_skills), []) + .filter((skill) => player.hasMark(skill)); + let choiceList = skills.map((i) => { + return ( + '
    【' + + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + + "】
    " + + "
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }); + const { + result: { control }, + } = await player + .chooseControl(skills) + .set("prompt", "选择令" + get.translation(target) + "获得的“武”") + .set("choiceList", choiceList) + .set("displayIndex", false) + .set("ai", () => get.event("controls").randomGet()); + if (control) { + player.removeMark(control, 1); + player.markSkill("twhuajing"); + player.popup(control, "metal"); + target.addTempSkill(control, { player: "phaseAfter" }); + target.addTempSkill("twhuajing_blocker", { player: "phaseAfter" }); + target.getHistory("custom").push({ twhuajing_skills: [control] }); await player.draw(2); } } }, - ai:{combo:'twhuajing'}, + ai: { combo: "twhuajing" }, }, //史阿 - twdengjian:{ - audio:2, - trigger:{global:'phaseDiscardEnd'}, - filter(event,player){ - if(player.hasSkill('twdengjian_ban')) return false; - return event.player!=player&&lib.skill.twdengjian.getCards(player,event.player).length; + twdengjian: { + audio: 2, + trigger: { global: "phaseDiscardEnd" }, + filter(event, player) { + if (player.hasSkill("twdengjian_ban")) return false; + return ( + event.player != player && lib.skill.twdengjian.getCards(player, event.player).length + ); }, - getCards(player,target){ - let cards=target.getHistory('useCard',evt=>{ - return evt.cards&&evt.cards.filterInD('d').some(card=>get.name(card,false)=='sha')&&target.getHistory('sourceDamage',evtx=>{ - return evtx.card&&evtx.card==evt.card; - }).length; - }).reduce((list,evt)=>list.addArray(evt.cards.filterInD('d').filter(card=>get.name(card,false)=='sha')),[]); - if(cards.length){ - const history=player.actionHistory; - for(let i=history.length-1;i>=0;i--){ - for(let evt of history[i].gain){ - if(evt.getParent().name=='twdengjian'){ - const card=evt.cards[0]; - cards=cards.filter(cardx=>get.color(cardx)!=get.color(card)); - if(!cards.length) break; + getCards(player, target) { + let cards = target + .getHistory("useCard", (evt) => { + return ( + evt.cards && + evt.cards.filterInD("d").some((card) => get.name(card, false) == "sha") && + target.getHistory("sourceDamage", (evtx) => { + return evtx.card && evtx.card == evt.card; + }).length + ); + }) + .reduce( + (list, evt) => + list.addArray( + evt.cards.filterInD("d").filter((card) => get.name(card, false) == "sha") + ), + [] + ); + if (cards.length) { + const history = player.actionHistory; + for (let i = history.length - 1; i >= 0; i--) { + for (let evt of history[i].gain) { + if (evt.getParent().name == "twdengjian") { + const card = evt.cards[0]; + cards = cards.filter((cardx) => get.color(cardx) != get.color(card)); + if (!cards.length) break; } } - if(history[i].isRound) break; + if (history[i].isRound) break; } } return cards; }, //direct:true, - frequent:true, - async content(event,trigger,player){ - const cards=lib.skill.twdengjian.getCards(player,trigger.player); + frequent: true, + async content(event, trigger, player) { + const cards = lib.skill.twdengjian.getCards(player, trigger.player); /*const {result:{bool}}=await player.chooseToDiscard(get.prompt('twdengjian'),'he') .set('prompt2','弃置一张牌并随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】') .set('ai',card=>7-get.value(card)) .set('logSkill','twdengjian'); - if(bool) */await player.gain(cards.randomGet(),'gain2').gaintag.add('twdengjianx'); + if(bool) */ await player.gain(cards.randomGet(), "gain2").gaintag.add("twdengjianx"); }, - group:'twdengjian_buff', - subSkill:{ - ban:{charlotte:true}, - buff:{ - mod:{ - aiOrder(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('twdengjianx')) return num+0.1; + group: "twdengjian_buff", + subSkill: { + ban: { charlotte: true }, + buff: { + mod: { + aiOrder(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("twdengjianx")) + return num + 0.1; }, }, - audio:'twdengjian', - trigger:{player:'useCard1'}, - filter(event,player){ - return event.cards&&event.cards.length==1&&player.getHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('twdengjianx')) return true; - } - return false; - }).length&&event.addCount!==false; + audio: "twdengjian", + trigger: { player: "useCard1" }, + filter(event, player) { + return ( + event.cards && + event.cards.length == 1 && + player.getHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twdengjianx")) return true; + } + return false; + }).length && + event.addCount !== false + ); }, - forced:true, - locked:false, - async content(event,trigger,player){ - trigger.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0) player.stat[player.stat.length-1].card.sha--; - game.log(trigger.card,'不计入次数限制'); + forced: true, + locked: false, + async content(event, trigger, player) { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) + player.stat[player.stat.length - 1].card.sha--; + game.log(trigger.card, "不计入次数限制"); }, }, }, }, - twdengjianx:{}, - twxinshou:{ - audio:2, - trigger:{player:'useCard'}, - filter(event,player){ - if(event.card.name!='sha') return false; - const goon=(!player.getHistory('useCard',evt=>{ - return evt!=event&&evt.card.name=='sha'&&get.color(evt.card)==get.color(event.card); - }).length&&player.isPhaseUsing()); - if(!player.hasSkill('twxinshou_0')) return goon; - if(!player.hasSkill('twxinshou_1')) return goon&&game.hasPlayer(target=>target!=player); - return !player.hasSkill('twdengjian_ban')&&game.hasPlayer(target=>{ - if(target==player) return false; - return !target.hasSkill('twdengjian',null,null,false); - })&&player.hasSkill('twdengjian',null,null,false); + twdengjianx: {}, + twxinshou: { + audio: 2, + trigger: { player: "useCard" }, + filter(event, player) { + if (event.card.name != "sha") return false; + const goon = + !player.getHistory("useCard", (evt) => { + return ( + evt != event && + evt.card.name == "sha" && + get.color(evt.card) == get.color(event.card) + ); + }).length && player.isPhaseUsing(); + if (!player.hasSkill("twxinshou_0")) return goon; + if (!player.hasSkill("twxinshou_1")) + return goon && game.hasPlayer((target) => target != player); + return ( + !player.hasSkill("twdengjian_ban") && + game.hasPlayer((target) => { + if (target == player) return false; + return !target.hasSkill("twdengjian", null, null, false); + }) && + player.hasSkill("twdengjian", null, null, false) + ); }, - direct:true, - async content(event,trigger,player){ - if(player.hasSkill('twxinshou_0')&&player.hasSkill('twxinshou_1')){ - const {result:{bool,targets}}=await player.chooseTarget((card,player,target)=>{ - return target!=player&&!target.hasSkill('twdengjian',null,null,false); - }).set('ai',target=>{ - const player=get.event('player'); - if(get.attitude(player,target)>0){ - if(target.isTurnedOver()) return 0; - const card=new lib.element.VCard({name:'sha'}); - if(game.hasPlayer(aim=>{ - return target.canUse(card,target)&&get.effect(aim,card,target,player)>0&&get.effect(aim,card,target,target)>0; - })) return target.countCards('h')-3; - return 0; - } - return 0; - }) - .set('prompt',get.prompt('twxinshou')) - .set('prompt2','令【登剑】失效并令一名其他角色获得【登剑】,你的下个回合开始时,其失去【登剑】,若其这期间使用【杀】造成过伤害,则你结束【登剑】的失效状态'); - if(bool){ - const target=targets[0]; - player.logSkill('twxinshou',target); - player.addSkill('twdengjian_ban'); - target.addAdditionalSkills('twxinshou_'+player.playerid,'twdengjian'); - player.popup('登剑'); - target.popup('登剑'); - game.log(player,'将','#g【登剑】','传授给了',target); - game.log(player,'的','#g【登剑】','被失效了'); - player.when('phaseBegin').then(()=>{ - target.removeAdditionalSkills('twxinshou_'+player.playerid); - }).then(()=>{ - const history=game.getAllGlobalHistory('everything'); - for(let i=history.length-1;i>=0;i--){ - const evt=history[i]; - if(evt.name=='damage'&&evt.card&&evt.source&&evt.card.name=='sha'&&evt.source==target){ - player.popup('洗具'); - player.removeSkill('twdengjian_ban'); - game.log(player,'结束了','#g【登剑】','的失效状态'); - return; - } - if(evt==evtx) break; + direct: true, + async content(event, trigger, player) { + if (player.hasSkill("twxinshou_0") && player.hasSkill("twxinshou_1")) { + const { + result: { bool, targets }, + } = await player + .chooseTarget((card, player, target) => { + return target != player && !target.hasSkill("twdengjian", null, null, false); + }) + .set("ai", (target) => { + const player = get.event("player"); + if (get.attitude(player, target) > 0) { + if (target.isTurnedOver()) return 0; + const card = new lib.element.VCard({ name: "sha" }); + if ( + game.hasPlayer((aim) => { + return ( + target.canUse(card, target) && + get.effect(aim, card, target, player) > 0 && + get.effect(aim, card, target, target) > 0 + ); + }) + ) + return target.countCards("h") - 3; + return 0; } - player.popup('杯具'); - player.chat('剑法废掉了...'); - }).vars({target:target,evtx:event}); + return 0; + }) + .set("prompt", get.prompt("twxinshou")) + .set( + "prompt2", + "令【登剑】失效并令一名其他角色获得【登剑】,你的下个回合开始时,其失去【登剑】,若其这期间使用【杀】造成过伤害,则你结束【登剑】的失效状态" + ); + if (bool) { + const target = targets[0]; + player.logSkill("twxinshou", target); + player.addSkill("twdengjian_ban"); + target.addAdditionalSkills("twxinshou_" + player.playerid, "twdengjian"); + player.popup("登剑"); + target.popup("登剑"); + game.log(player, "将", "#g【登剑】", "传授给了", target); + game.log(player, "的", "#g【登剑】", "被失效了"); + player + .when("phaseBegin") + .then(() => { + target.removeAdditionalSkills("twxinshou_" + player.playerid); + }) + .then(() => { + const history = game.getAllGlobalHistory("everything"); + for (let i = history.length - 1; i >= 0; i--) { + const evt = history[i]; + if ( + evt.name == "damage" && + evt.card && + evt.source && + evt.card.name == "sha" && + evt.source == target + ) { + player.popup("洗具"); + player.removeSkill("twdengjian_ban"); + game.log(player, "结束了", "#g【登剑】", "的失效状态"); + return; + } + if (evt == evtx) break; + } + player.popup("杯具"); + player.chat("剑法废掉了..."); + }) + .vars({ target: target, evtx: event }); } - } - else{ - let choice=[],choiceList=['摸一张牌','交给一名其他角色一张牌']; - if(!player.hasSkill('twxinshou_0')) choice.push('摸牌'); - else choiceList[0]=''+choiceList[0]+''; - if(!player.hasSkill('twxinshou_1')&&game.hasPlayer(target=>target!=player)) choice.push('给牌'); - else choiceList[1]=''+choiceList[1]+''; - const {result:{control}}=await player.chooseControl(choice,'cancel2') - .set('prompt',get.prompt('twxinshou')).set('choiceList',choiceList) - .set('ai',()=>{ - if(get.event('controls').includes('摸牌')) return '摸牌'; - const player=get.event('player'); - return (game.hasPlayer(target=>{ - if(target==player) return false; - if(player.countCards('he',card=>card.name=='du')&&get.attitude(player,target)<=0) return true; - if(player.countCards('he',card=>get.value(card,player)<0&&get.attitude(player,target)*get.value(card,target)>0)) return true; - return get.attitude(player,target)>0; - })&&get.event('controls').includes('给牌'))?'给牌':'cancel2'; - }); - if(control=='cancel2') return; - player.logSkill('twxinshou'); - if(control=='摸牌'){ - player.addTempSkill('twxinshou_0'); + } else { + let choice = [], + choiceList = ["摸一张牌", "交给一名其他角色一张牌"]; + if (!player.hasSkill("twxinshou_0")) choice.push("摸牌"); + else choiceList[0] = '' + choiceList[0] + ""; + if (!player.hasSkill("twxinshou_1") && game.hasPlayer((target) => target != player)) + choice.push("给牌"); + else choiceList[1] = '' + choiceList[1] + ""; + const { + result: { control }, + } = await player + .chooseControl(choice, "cancel2") + .set("prompt", get.prompt("twxinshou")) + .set("choiceList", choiceList) + .set("ai", () => { + if (get.event("controls").includes("摸牌")) return "摸牌"; + const player = get.event("player"); + return game.hasPlayer((target) => { + if (target == player) return false; + if ( + player.countCards("he", (card) => card.name == "du") && + get.attitude(player, target) <= 0 + ) + return true; + if ( + player.countCards( + "he", + (card) => + get.value(card, player) < 0 && + get.attitude(player, target) * get.value(card, target) > 0 + ) + ) + return true; + return get.attitude(player, target) > 0; + }) && get.event("controls").includes("给牌") + ? "给牌" + : "cancel2"; + }); + if (control == "cancel2") return; + player.logSkill("twxinshou"); + if (control == "摸牌") { + player.addTempSkill("twxinshou_0"); await player.draw(); } - if(control=='给牌'){ - player.addTempSkill('twxinshou_1'); - const {result:{bool,targets}}=await player.chooseTarget('交给一名其他角色一张牌',lib.filter.notMe,true).set('ai',target=>{ - const player=get.event('player'),att=get.attitude(player,target); - if(player.countCards('he',card=>card.name=='du')) return -att; - let cards=player.getCards('he',card=>get.value(card,player)<0); - if(cards.length){ - cards.sort((a,b)=>get.value(a,player)-get.value(b,player)); - return get.value(cards[0],target)*att; - } - return att; - }); - if(bool){ - const target=targets[0]; + if (control == "给牌") { + player.addTempSkill("twxinshou_1"); + const { + result: { bool, targets }, + } = await player + .chooseTarget("交给一名其他角色一张牌", lib.filter.notMe, true) + .set("ai", (target) => { + const player = get.event("player"), + att = get.attitude(player, target); + if (player.countCards("he", (card) => card.name == "du")) return -att; + let cards = player.getCards("he", (card) => get.value(card, player) < 0); + if (cards.length) { + cards.sort((a, b) => get.value(a, player) - get.value(b, player)); + return get.value(cards[0], target) * att; + } + return att; + }); + if (bool) { + const target = targets[0]; player.line(target); - await player.chooseToGive(target,'he',true); + await player.chooseToGive(target, "he", true); } } } }, - subSkill:{ - '0':{charlotte:true}, - '1':{charlotte:true}, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, }, }, //石韬 - twjieqiu:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(target=>lib.skill.twjieqiu.filterTarget(null,player,target)); + twjieqiu: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer((target) => lib.skill.twjieqiu.filterTarget(null, player, target)); }, - filterTarget(card,player,target){ - return target!=player&&!target.hasDisabledSlot(); + filterTarget(card, player, target) { + return target != player && !target.hasDisabledSlot(); }, - usable:1, - async content(event,trigger,player){ - const target=event.target,num=target.countCards('e'); - let disables=[]; - for(let i=1;i<=5;i++){ - for(let j=0;j!p.hasDisabledSlot()) - .then(()=>player.removeSkill('twjieqiu_buff')); + if (num) await target.draw(num); + target.addSkill("twjieqiu_buff"); + target.markAuto("twjieqiu_buff", [player]); + target + .when("enableEquipEnd") + .filter((e, p) => !p.hasDisabledSlot()) + .then(() => player.removeSkill("twjieqiu_buff")); }, - ai:{ - order:7, - result:{ - target(player,target){ - return -target.countCards('e')-(get.attitude(player,target)<0?1:0); + ai: { + order: 7, + result: { + target(player, target) { + return -target.countCards("e") - (get.attitude(player, target) < 0 ? 1 : 0); }, }, }, - subSkill:{ - used:{charlotte:true}, - buff:{ - charlotte:true, - onremove:true, - trigger:{player:'phaseDiscardEnd'}, - filter(event,player){ - return player.hasDisabledSlot()&&event.cards&&event.cards.length; + subSkill: { + used: { charlotte: true }, + buff: { + charlotte: true, + onremove: true, + trigger: { player: "phaseDiscardEnd" }, + filter(event, player) { + return player.hasDisabledSlot() && event.cards && event.cards.length; }, - forced:true, - popup:false, - async content(event,trigger,player){ - const num=trigger.cards.length; - let list=[],map={}; - for(let i=1;i<6;i++){ - map[get.translation('equip'+i)]=('equip'+i); - if(player.hasDisabledSlot(i)){ - for(let j=0;jget.translation(i)); - if(transList.length<=num) result={bool:true,links:transList}; - else result=await player.chooseButton([ - '劫囚:请选择你要恢复的装备栏', - [transList,'tdnodes'], - ],Math.min(transList.length,num),true).set('map',map) - .set('ai',button=>['equip5','equip4','equip1','equip3','equip2'].indexOf(get.event('map')[button.link])+2).forResult(); - if(result.bool) await player.enableEquip(result.links.slice().map(i=>map[i])); + const transList = list.map((i) => get.translation(i)); + if (transList.length <= num) result = { bool: true, links: transList }; + else + result = await player + .chooseButton( + ["劫囚:请选择你要恢复的装备栏", [transList, "tdnodes"]], + Math.min(transList.length, num), + true + ) + .set("map", map) + .set( + "ai", + (button) => + ["equip5", "equip4", "equip1", "equip3", "equip2"].indexOf( + get.event("map")[button.link] + ) + 2 + ) + .forResult(); + if (result.bool) + await player.enableEquip(result.links.slice().map((i) => map[i])); }, - group:['twjieqiu_end'], + group: ["twjieqiu_end"], }, - end:{ - charlotte:true, - trigger:{player:'phaseEnd'}, - filter(event,player){ - return player.hasDisabledSlot()&&player.getStorage('twjieqiu_buff').some(target=>{ - return target.isIn()&&!target.hasSkill('twjieqiu_used'); - }); + end: { + charlotte: true, + trigger: { player: "phaseEnd" }, + filter(event, player) { + return ( + player.hasDisabledSlot() && + player.getStorage("twjieqiu_buff").some((target) => { + return target.isIn() && !target.hasSkill("twjieqiu_used"); + }) + ); }, - forced:true, - popup:false, - async content(event,trigger,player){ - const targets=player.getStorage('twjieqiu_buff').filter(target=>{ - return target.isIn()&&!target.hasSkill('twjieqiu_used'); - }).sortBySeat(); - for(const target of targets){ - target.popup('劫囚'); - target.addTempSkill('twjieqiu_used','roundStart'); + forced: true, + popup: false, + async content(event, trigger, player) { + const targets = player + .getStorage("twjieqiu_buff") + .filter((target) => { + return target.isIn() && !target.hasSkill("twjieqiu_used"); + }) + .sortBySeat(); + for (const target of targets) { + target.popup("劫囚"); + target.addTempSkill("twjieqiu_used", "roundStart"); target.insertPhase(); } }, }, }, }, - twenchou:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return game.hasPlayer(current=>lib.skill.twenchou.filterTarget(null,player,current)); + twenchou: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer((current) => + lib.skill.twenchou.filterTarget(null, player, current) + ); }, - position:'he', - filterTarget(card,player,target){ - return target!=player&&target.countCards('h')&&target.hasDisabledSlot(); + position: "he", + filterTarget(card, player, target) { + return target != player && target.countCards("h") && target.hasDisabledSlot(); }, - usable:1, - async content(event,trigger,player){ - const target=event.target; - await player.gainPlayerCard(target,'h',true,'visible'); - let list=[],map={}; - for(let i=1;i<6;i++){ - map[get.translation('equip'+i)]=('equip'+i); - if(target.hasDisabledSlot(i)){ - list.push('equip'+i); + usable: 1, + async content(event, trigger, player) { + const target = event.target; + await player.gainPlayerCard(target, "h", true, "visible"); + let list = [], + map = {}; + for (let i = 1; i < 6; i++) { + map[get.translation("equip" + i)] = "equip" + i; + if (target.hasDisabledSlot(i)) { + list.push("equip" + i); } } let result; - const transList=list.map(i=>get.translation(i)); - if(transList.length==1) result={bool:true,links:transList}; - else result=await player.chooseButton([ - '恩仇:请选择'+get.translation(target)+'要恢复的装备栏', - [transList,'tdnodes'], - ],true).set('map',map) - .set('ai',button=>1/(['equip5','equip4','equip1','equip3','equip2'].indexOf(get.event('map')[button.link])+2)).forResult(); - if(result.bool) await target.enableEquip(result.links.slice().map(i=>map[i])); + const transList = list.map((i) => get.translation(i)); + if (transList.length == 1) result = { bool: true, links: transList }; + else + result = await player + .chooseButton( + [ + "恩仇:请选择" + get.translation(target) + "要恢复的装备栏", + [transList, "tdnodes"], + ], + true + ) + .set("map", map) + .set( + "ai", + (button) => + 1 / + (["equip5", "equip4", "equip1", "equip3", "equip2"].indexOf( + get.event("map")[button.link] + ) + + 2) + ) + .forResult(); + if (result.bool) await target.enableEquip(result.links.slice().map((i) => map[i])); }, - ai:{ - order:9, - result:{target:-1}, + ai: { + order: 9, + result: { target: -1 }, }, }, //侠关羽 - twzhongyi:{ - mod:{ - targetInRange(card){ - if(card.name=='sha') return true; + twzhongyi: { + mod: { + targetInRange(card) { + if (card.name == "sha") return true; }, }, - audio:2, - trigger:{player:'useCardAfter'}, - filter(event,player){ - if(event.card.name!='sha') return false; - return player.getHistory('sourceDamage',evt=>evt.card&&evt.card==event.card).length; + audio: 2, + trigger: { player: "useCardAfter" }, + filter(event, player) { + if (event.card.name != "sha") return false; + return player.getHistory("sourceDamage", (evt) => evt.card && evt.card == event.card) + .length; }, - forced:true, - async content(event,trigger,player){ + forced: true, + async content(event, trigger, player) { //const num=player.getHistory('sourceDamage',evt=>evt.card&&evt.card==trigger.card).reduce((sum,evt)=>sum+evt.num,0); - const num=game.countPlayer2(target=>{ - return target.hasHistory('damage',evt=>{ - return evt.card&&evt.card==trigger.card; + const num = game.countPlayer2((target) => { + return target.hasHistory("damage", (evt) => { + return evt.card && evt.card == trigger.card; }); }); - const num2=1+player.getAllHistory('custom',evt=>evt.twzhongyi).length; - let choice=['摸牌'],choiceList=['摸'+get.cnNumber(num)+'张牌']; - if(player.isDamaged()){ - choice.addArray(['回血','背水!']); + const num2 = 1 + player.getAllHistory("custom", (evt) => evt.twzhongyi).length; + let choice = ["摸牌"], + choiceList = ["摸" + get.cnNumber(num) + "张牌"]; + if (player.isDamaged()) { + choice.addArray(["回血", "背水!"]); choiceList.addArray([ - '回复'+num+'点体力', - '失去'+num2+'点体力,依次执行以上所有项', + "回复" + num + "点体力", + "失去" + num2 + "点体力,依次执行以上所有项", ]); } - const {result:{control}}=await player.chooseControl(choice) - .set('prompt','忠义:请选择一项').set('choiceList',choiceList) - .set('ai',()=>{ - const player=get.event('player'); - const num=get.event('num'),num2=get.event('num2'); - if(player.isHealthy()) return '摸牌'; - return (player.hp+player.countCards('hs',card=>player.canSaveCard(card,player))-num2>0&&num>num2)?'背水!':'回血'; - }).set('num',num).set('num2',num2); - if(control!='cancel2'){ - if(control=='背水!'){ + const { + result: { control }, + } = await player + .chooseControl(choice) + .set("prompt", "忠义:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + const player = get.event("player"); + const num = get.event("num"), + num2 = get.event("num2"); + if (player.isHealthy()) return "摸牌"; + return player.hp + + player.countCards("hs", (card) => player.canSaveCard(card, player)) - + num2 > + 0 && num > num2 + ? "背水!" + : "回血"; + }) + .set("num", num) + .set("num2", num2); + if (control != "cancel2") { + if (control == "背水!") { await player.loseHp(num2); - player.getHistory('custom').push({twzhongyi:true}); + player.getHistory("custom").push({ twzhongyi: true }); } - if(control!='回血') await player.draw(num); - if(control!='摸牌') await player.recover(num); + if (control != "回血") await player.draw(num); + if (control != "摸牌") await player.recover(num); } }, }, - twchue:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter(event,player){ - return event.card.name=='sha'&&event.isFirstTarget&&event.targets.length==1&&game.hasPlayer(target=>!event.targets.includes(target)&&player.canUse(event.card,target)); + twchue: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter(event, player) { + return ( + event.card.name == "sha" && + event.isFirstTarget && + event.targets.length == 1 && + game.hasPlayer( + (target) => !event.targets.includes(target) && player.canUse(event.card, target) + ) + ); }, - prompt2:'失去1点体力,额外指定至多等同于你体力值的目标', - check(event,player){ - return player.hp+player.countCards('hs',card=>player.canSaveCard(card,player))-1>0; + prompt2: "失去1点体力,额外指定至多等同于你体力值的目标", + check(event, player) { + return ( + player.hp + player.countCards("hs", (card) => player.canSaveCard(card, player)) - 1 > + 0 + ); }, - async content(event,trigger,player){ + async content(event, trigger, player) { await player.loseHp(); - const targetx=trigger.targets.slice(),num=player.getHp(); - if(!num) return; - const {result:{bool,targets}}=await player.chooseTarget('额外指定至多'+get.cnNumber(num)+'名目标',[1,num],(card,player,target)=>{ - const trigger=_status.event.getTrigger(); - return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); - }).set('ai',target=>{ - const player=get.event('player'),trigger=_status.event.getTrigger(); - return get.effect(target,trigger.card,player,player); - }); - if(!bool) return; + const targetx = trigger.targets.slice(), + num = player.getHp(); + if (!num) return; + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "额外指定至多" + get.cnNumber(num) + "名目标", + [1, num], + (card, player, target) => { + const trigger = _status.event.getTrigger(); + return ( + !trigger.targets.includes(target) && player.canUse(trigger.card, target) + ); + } + ) + .set("ai", (target) => { + const player = get.event("player"), + trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + if (!bool) return; player.line(targets); trigger.targets.addArray(targets); }, - group:['twchue_gain','twchue_effect'], - marktext:'勇', - intro:{ - name:'勇', - content:'mark', + group: ["twchue_gain", "twchue_effect"], + marktext: "勇", + intro: { + name: "勇", + content: "mark", }, - subSkill:{ - gain:{ - audio:'twchue', - trigger:{player:['damageEnd','loseHpEnd']}, - forced:true, - locked:false, - async content(event,trigger,player){ + subSkill: { + gain: { + audio: "twchue", + trigger: { player: ["damageEnd", "loseHpEnd"] }, + forced: true, + locked: false, + async content(event, trigger, player) { await player.draw(); - player.addMark('twchue',1); + player.addMark("twchue", 1); }, }, - effect:{ - audio:'twchue', - trigger:{global:'phaseEnd'}, - filter(event,player){ - const card=new lib.element.VCard({name:'sha'}); - return player.hasUseTarget(card)&&/*player.getHistory('useSkill',evt=>{ + effect: { + audio: "twchue", + trigger: { global: "phaseEnd" }, + filter(event, player) { + const card = new lib.element.VCard({ name: "sha" }); + return ( + player.hasUseTarget(card) && + /*player.getHistory('useSkill',evt=>{ return evt.skill=='twchue_gain'; - }).length&&player.getHp()&&*/player.countMark('twchue')>=player.getHp(); + }).length&&player.getHp()&&*/ player.countMark("twchue") >= player.getHp() + ); }, - check(event,player){ - return player.hasValueTarget(new lib.element.VCard({name:'sha'})); + check(event, player) { + return player.hasValueTarget(new lib.element.VCard({ name: "sha" })); }, - prompt2(event,player){ - const num=player.getHp(); - return '失去'+num+'个“勇”标记,视为使用一张造成的伤害+1且可以额外指定'+num+'个目标的【杀】'; + prompt2(event, player) { + const num = player.getHp(); + return ( + "失去" + + num + + "个“勇”标记,视为使用一张造成的伤害+1且可以额外指定" + + num + + "个目标的【杀】" + ); }, - async content(event,trigger,player){ - const num=player.getHp(); - player.removeMark('twchue',num); - const card=new lib.element.VCard({name:'sha'}); - player.when('useCard2') - .filter(evt=>evt.getParent(2)==event&&game.hasPlayer(target=>!evt.targets.includes(target)&&player.canUse(evt.card,target))) - .assign({ - firstDo:true, - }) - .then(()=>{ - trigger.baseDamage++; - player.chooseTarget('额外指定至多'+get.cnNumber(num)+'名目标',[1,num],(card,player,target)=>{ - const trigger=_status.event.getTrigger(); - return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); - }).set('ai',target=>{ - const player=get.event('player'),trigger=_status.event.getTrigger(); - return get.effect(target,trigger.card,player,player); - }); - }) - .then(()=>{ - if(result.bool){ - const targets=result.targets; - player.line(targets); - trigger.targets.addArray(targets); - } - }).vars({num:num}); - player.chooseUseTarget('视为使用造成的伤害+1且可以额外指定'+num+'个目标的【杀】',card,false,true); + async content(event, trigger, player) { + const num = player.getHp(); + player.removeMark("twchue", num); + const card = new lib.element.VCard({ name: "sha" }); + player + .when("useCard2") + .filter( + (evt) => + evt.getParent(2) == event && + game.hasPlayer( + (target) => + !evt.targets.includes(target) && + player.canUse(evt.card, target) + ) + ) + .assign({ + firstDo: true, + }) + .then(() => { + trigger.baseDamage++; + player + .chooseTarget( + "额外指定至多" + get.cnNumber(num) + "名目标", + [1, num], + (card, player, target) => { + const trigger = _status.event.getTrigger(); + return ( + !trigger.targets.includes(target) && + player.canUse(trigger.card, target) + ); + } + ) + .set("ai", (target) => { + const player = get.event("player"), + trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + }) + .then(() => { + if (result.bool) { + const targets = result.targets; + player.line(targets); + trigger.targets.addArray(targets); + } + }) + .vars({ num: num }); + player.chooseUseTarget( + "视为使用造成的伤害+1且可以额外指定" + num + "个目标的【杀】", + card, + false, + true + ); }, }, }, }, //夏侯惇 - twdanlie:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return game.hasPlayer(target=>player.canCompare(target)); + twdanlie: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer((target) => player.canCompare(target)); }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return player.canCompare(target); }, - usable:1, - selectTarget:[1,3], - multitarget:true, - multiline:true, - group:'twdanlie_add', - content:function(){ - 'step 0' - player.chooseToCompare(targets).setContent('chooseToCompareMeanwhile'); - 'step 1' - if(result.winner&&result.winner==player){ + usable: 1, + selectTarget: [1, 3], + multitarget: true, + multiline: true, + group: "twdanlie_add", + content: function () { + "step 0"; + player.chooseToCompare(targets).setContent("chooseToCompareMeanwhile"); + ("step 1"); + if (result.winner && result.winner == player) { player.line(targets); - targets.forEach(target=>target.damage()); - } - else player.loseHp(); + targets.forEach((target) => target.damage()); + } else player.loseHp(); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - if(player.getHp()>2) return -get.damageEffect(target,player,player)-10/target.countCards('h'); - var hs=player.getCards('h').sort((a,b)=>b.number-a.number); - var ts=target.getCards('h').sort((a,b)=>b.number-a.number); - if(!hs.length||!ts.length) return 0; - if(Math.min(13,hs[0].number+player.getDamagedHp())>ts[0].number) return -get.damageEffect(target,player,player); + ai: { + order: 10, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if (player.getHp() > 2) + return ( + -get.damageEffect(target, player, player) - 10 / target.countCards("h") + ); + var hs = player.getCards("h").sort((a, b) => b.number - a.number); + var ts = target.getCards("h").sort((a, b) => b.number - a.number); + if (!hs.length || !ts.length) return 0; + if (Math.min(13, hs[0].number + player.getDamagedHp()) > ts[0].number) + return -get.damageEffect(target, player, player); return 0; }, }, }, - subSkill:{ - add:{ - audio:'twdanlie', - trigger:{player:'compare',target:'compare'}, - filter:function(event,player){ - if(!player.isDamaged()) return false; - if(player!=event.target&&event.iwhile) return false; + subSkill: { + add: { + audio: "twdanlie", + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (!player.isDamaged()) return false; + if (player != event.target && event.iwhile) return false; return true; }, - forced:true, - locked:false, - content:function(){ - var num=player.getDamagedHp(); - if(player==trigger.player){ - trigger.num1+=num; - if(trigger.num1>13) trigger.num1=13; + forced: true, + locked: false, + content: function () { + var num = player.getDamagedHp(); + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; } - else{ - trigger.num2+=num; - if(trigger.num2>13) trigger.num2=13; - } - game.log(player,'的拼点牌点数+',num); + game.log(player, "的拼点牌点数+", num); }, }, }, }, //张葳 - twhuzhong:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - return event.card.name=='sha'&&!game.hasNature(event.card,'linked')&&event.targets.length==1&&player.isPhaseUsing()&&(game.hasPlayer(target=>!event.targets.includes(target)&&player.canUse(event.card,target))||event.target.countCards('h')>0); + twhuzhong: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + !game.hasNature(event.card, "linked") && + event.targets.length == 1 && + player.isPhaseUsing() && + (game.hasPlayer( + (target) => !event.targets.includes(target) && player.canUse(event.card, target) + ) || + event.target.countCards("h") > 0) + ); }, - direct:true, - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - var list=['cancel2']; - var choiceList=[ - '令此【杀】可以额外指定一个目标', - '弃置'+get.translation(target)+'一张手牌,若此【杀】造成伤害,则你摸一张牌且本阶段可以额外使用一张【杀】', + direct: true, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var list = ["cancel2"]; + var choiceList = [ + "令此【杀】可以额外指定一个目标", + "弃置" + + get.translation(target) + + "一张手牌,若此【杀】造成伤害,则你摸一张牌且本阶段可以额外使用一张【杀】", ]; - if(target.countCards('h')) list.unshift('其弃置'); - else choiceList[1]=''+choiceList[1]+''; - if(game.hasPlayer(targetx=>!trigger.targets.includes(targetx)&&player.canUse(trigger.card,targetx))) list.unshift('多指'); - else choiceList[0]=''+choiceList[0]+''; - player.chooseControl(list).set('choiceList',choiceList).set('ai',()=>{ - var controls=_status.event.controls; - var trigger=_status.event.getTrigger(); - var player=trigger.player; - var target=trigger.target; - if(controls.includes('其弃置')&&_status.event.goon) return '其弃置'; - if(controls.includes('多指')){ - if(game.hasPlayer(targetx=>!trigger.targets.includes(targetx)&&player.canUse(trigger.card,targetx)&&get.effect(targetx,trigger.card,player,player)>0)) return '你弃置'; - } - return 'cancel2'; - }).set('goon',function(){ - var d1=true; - if(player.hasSkill('jueqing')||player.hasSkill('gangzhi')) d1=false; - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))||player.hasSkillTag('directHit_ai',true,{ - target:target, - card:trigger.card, - },true)){ - if(!target.hasSkill('gangzhi')) d1=false; - if(!target.hasSkillTag('filterDamage',null,{ - player:player, - card:trigger.card, - })&&get.attitude(player,target)<0) return true; - } - if(d1) return get.damageEffect(player,player,player)>0; - return false; - }()).set('prompt','护众:是否摸一张牌并执行其中一项?'); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('twhuzhong',target); - player.draw(); - if(result.control=='其弃置'){ - player.discardPlayerCard(target,'h',true); - player.when('useCardAfter').filter(evt=>evt==trigger.getParent()).then(()=>{ - if(player.getHistory('sourceDamage',evt=>evt.card==trigger.card).length){ - player.draw(); - player.addTempSkill('twhuzhong_sha','phaseUseAfter'); - player.addMark('twhuzhong_sha',1,false); + if (target.countCards("h")) list.unshift("其弃置"); + else choiceList[1] = '' + choiceList[1] + ""; + if ( + game.hasPlayer( + (targetx) => + !trigger.targets.includes(targetx) && player.canUse(trigger.card, targetx) + ) + ) + list.unshift("多指"); + else choiceList[0] = '' + choiceList[0] + ""; + player + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", () => { + var controls = _status.event.controls; + var trigger = _status.event.getTrigger(); + var player = trigger.player; + var target = trigger.target; + if (controls.includes("其弃置") && _status.event.goon) return "其弃置"; + if (controls.includes("多指")) { + if ( + game.hasPlayer( + (targetx) => + !trigger.targets.includes(targetx) && + player.canUse(trigger.card, targetx) && + get.effect(targetx, trigger.card, player, player) > 0 + ) + ) + return "你弃置"; + } + return "cancel2"; + }) + .set( + "goon", + (function () { + var d1 = true; + if (player.hasSkill("jueqing") || player.hasSkill("gangzhi")) d1 = false; + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) || + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: trigger.card, + }, + true + ) + ) { + if (!target.hasSkill("gangzhi")) d1 = false; + if ( + !target.hasSkillTag("filterDamage", null, { + player: player, + card: trigger.card, + }) && + get.attitude(player, target) < 0 + ) + return true; } - }); + if (d1) return get.damageEffect(player, player, player) > 0; + return false; + })() + ) + .set("prompt", "护众:是否摸一张牌并执行其中一项?"); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("twhuzhong", target); + player.draw(); + if (result.control == "其弃置") { + player.discardPlayerCard(target, "h", true); + player + .when("useCardAfter") + .filter((evt) => evt == trigger.getParent()) + .then(() => { + if ( + player.getHistory("sourceDamage", (evt) => evt.card == trigger.card) + .length + ) { + player.draw(); + player.addTempSkill("twhuzhong_sha", "phaseUseAfter"); + player.addMark("twhuzhong_sha", 1, false); + } + }); event.finish(); } - } - else event.finish(); - 'step 2' - player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); - }).set('ai',function(target){ - var player=_status.event.player; - var trigger=_status.event.getTrigger(); - return get.effect(target,trigger.card,player,player); - }); - 'step 3' - if(result.bool){ + } else event.finish(); + ("step 2"); + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "的额外目标", + function (card, player, target) { + var trigger = _status.event.getTrigger(); + return ( + !trigger.targets.includes(target) && player.canUse(trigger.card, target) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + return get.effect(target, trigger.card, player, player); + }); + ("step 3"); + if (result.bool) { player.line(result.targets); trigger.getParent().targets.addArray(result.targets); - game.log(result.targets,'成为了',trigger.card,'的额外目标'); + game.log(result.targets, "成为了", trigger.card, "的额外目标"); } }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('twhuzhong_sha'); + subSkill: { + sha: { + charlotte: true, + onremove: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("twhuzhong_sha"); }, }, - } - } + }, + }, }, - twfenwang:{ - audio:2, - trigger:{source:'damageBegin2',player:'damageBegin4'}, - filter:function(event,player,name){ - if(name=='damageBegin2'){ - return !event.hasNature()&&player.countCards('h')>=event.player.countCards('h'); + twfenwang: { + audio: 2, + trigger: { source: "damageBegin2", player: "damageBegin4" }, + filter: function (event, player, name) { + if (name == "damageBegin2") { + return !event.hasNature() && player.countCards("h") >= event.player.countCards("h"); } return event.hasNature(); }, - forced:true, - content:function(){ - 'step 0' - if(event.triggername=='damageBegin2'){ + forced: true, + content: function () { + "step 0"; + if (event.triggername == "damageBegin2") { player.line(trigger.player); trigger.num++; event.finish(); - } - else player.chooseToDiscard('h','弃置一张手牌,或令此伤害+1').set('ai',function(card){ - return 8-get.value(card); - }); - 'step 1' - if(!result.bool) trigger.num++; + } else + player.chooseToDiscard("h", "弃置一张手牌,或令此伤害+1").set("ai", function (card) { + return 8 - get.value(card); + }); + ("step 1"); + if (!result.bool) trigger.num++; }, }, //夏侯子萼 //差点和夏侯紫萼搞混 - twchengxi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return game.hasPlayer(target=>lib.skill.twchengxi.filterTarget(null,player,target)); + twchengxi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return game.hasPlayer((target) => lib.skill.twchengxi.filterTarget(null, player, target)); }, - filterTarget:function(card,player,target){ - if(player.getStorage('twchengxi_used').includes(target)||target==player) return false; - return !player.hasSkillTag('noCompareSource')&&target.countCards('h')>0&&!target.hasSkillTag('noCompareTarget'); + filterTarget: function (card, player, target) { + if (player.getStorage("twchengxi_used").includes(target) || target == player) + return false; + return ( + !player.hasSkillTag("noCompareSource") && + target.countCards("h") > 0 && + !target.hasSkillTag("noCompareTarget") + ); }, - content:function(){ - 'step 0' - if(!player.storage.twchengxi_used){ - player.when('phaseUseAfter').then(()=>delete player.storage.twchengxi_used); + content: function () { + "step 0"; + if (!player.storage.twchengxi_used) { + player.when("phaseUseAfter").then(() => delete player.storage.twchengxi_used); } - player.markAuto('twchengxi_used',[target]); + player.markAuto("twchengxi_used", [target]); player.draw(); - 'step 1' - if(player.canCompare(target)) player.chooseToCompare(target); + ("step 1"); + if (player.canCompare(target)) player.chooseToCompare(target); else event.finish(); - 'step 2' - if(result.bool){ - player.addSkill('twchengxi_effect'); - } - else{ - var card={name:'sha',isCard:true}; - if(target.canUse(card,player,false)) target.useCard(card,player,false); + ("step 2"); + if (result.bool) { + player.addSkill("twchengxi_effect"); + } else { + var card = { name: "sha", isCard: true }; + if (target.canUse(card, player, false)) target.useCard(card, player, false); } }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(player.hasSkill('twchengxi_effect')) return 0; - var hs=player.getCards('h').sort((a,b)=>b.number-a.number); - var ts=target.getCards('h').sort((a,b)=>b.number-a.number); - if(!hs.length||!ts.length) return 0; - if(hs[0].number>ts[0].number) return -3; - if(!target.canUse({name:'sha',isCard:true},player,false)) return -1; + ai: { + order: 8, + result: { + target: function (player, target) { + if (player.hasSkill("twchengxi_effect")) return 0; + var hs = player.getCards("h").sort((a, b) => b.number - a.number); + var ts = target.getCards("h").sort((a, b) => b.number - a.number); + if (!hs.length || !ts.length) return 0; + if (hs[0].number > ts[0].number) return -3; + if (!target.canUse({ name: "sha", isCard: true }, player, false)) return -1; return 0; }, }, }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{player:'useCard1'}, - filter:function(event,player){ - return get.type(event.card)=='basic'||get.type(event.card)=='trick'; + subSkill: { + effect: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return get.type(event.card) == "basic" || get.type(event.card) == "trick"; }, - forced:true, - popup:false, - content:function(){ - player.removeSkill('twchengxi_effect'); - player.when('useCardAfter').filter(evt=>evt==trigger).then(()=>{ - if(trigger.targets){ - var card={ - name:trigger.card.name, - isCard:true, - }; - var targets=trigger.targets.filter(i=>i.isIn()&&player.canUse(card,i,false)); - if(targets.length) player.useCard(card,targets,false); - } - }); + forced: true, + popup: false, + content: function () { + player.removeSkill("twchengxi_effect"); + player + .when("useCardAfter") + .filter((evt) => evt == trigger) + .then(() => { + if (trigger.targets) { + var card = { + name: trigger.card.name, + isCard: true, + }; + var targets = trigger.targets.filter( + (i) => i.isIn() && player.canUse(card, i, false) + ); + if (targets.length) player.useCard(card, targets, false); + } + }); + }, + mark: true, + marktext: "袭", + intro: { + content: + "使用的下一张基本牌或非延时锦囊牌结算完毕后视为对相同目标再使用一张无次数限制的同名牌", }, - mark:true, - marktext:'袭', - intro:{content:'使用的下一张基本牌或非延时锦囊牌结算完毕后视为对相同目标再使用一张无次数限制的同名牌'}, }, }, }, //侠刘备 - twshenyi:{ - audio:2, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - if(!event.player.isIn()) return false; - if(event.player.getHistory('damage').indexOf(event)!=0) return false; - return event.player==player||player.inRange(event.player); + twshenyi: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if (!event.player.isIn()) return false; + if (event.player.getHistory("damage").indexOf(event) != 0) return false; + return event.player == player || player.inRange(event.player); }, - usable:1, - direct:true, - content:function*(event,map){ - var player=map.player,trigger=map.trigger; - var list=get.inpileVCardList(info=>{ - return ['basic','trick','delay'].includes(info[0])&&!player.getStorage('twshenyi').includes(info[2]); + usable: 1, + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + var list = get.inpileVCardList((info) => { + return ( + ["basic", "trick", "delay"].includes(info[0]) && + !player.getStorage("twshenyi").includes(info[2]) + ); }); - var dialog=[`###${get.prompt('twshenyi',trigger.player)}###
    从牌堆中将一张牌作为“侠义”置于武将牌上${player!=trigger.player&&player.countCards('h')?',然后将任意张手牌交给其':''}
    `,[list,'vcard']]; - var result=yield player.chooseButton(dialog).set('ai',function(button){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player,name=button.link[2]; - if(!get.cardPile2(card=>card.name==name)) return 0; - var value=get.value({name:name}); - if(['tao','jiu','caochuan','wuxie'].includes(name)&&get.event().getRand()>0.4) return value*2; + var dialog = [ + `###${get.prompt( + "twshenyi", + trigger.player + )}###
    从牌堆中将一张牌作为“侠义”置于武将牌上${ + player != trigger.player && player.countCards("h") + ? ",然后将任意张手牌交给其" + : "" + }
    `, + [list, "vcard"], + ]; + var result = yield player.chooseButton(dialog).set("ai", function (button) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player, + name = button.link[2]; + if (!get.cardPile2((card) => card.name == name)) return 0; + var value = get.value({ name: name }); + if (["tao", "jiu", "caochuan", "wuxie"].includes(name) && get.event().getRand() > 0.4) + return value * 2; return value; }); - if(result.bool){ - var name=result.links[0][2],nature=result.links[0][3]; - var cardx={name:name,nature:nature}; - player.logSkill('twshenyi',trigger.player); + if (result.bool) { + var name = result.links[0][2], + nature = result.links[0][3]; + var cardx = { name: name, nature: nature }; + player.logSkill("twshenyi", trigger.player); player.popup(cardx); - player.markAuto('twshenyi',[name]); - game.log(player,'声明了',`#y${get.translation(cardx)}`); - var card=get.cardPile2(card=>get.name(card,false)==name&&get.nature(card,false)==nature); - if(card) player.addToExpansion([card],'gain2').gaintag.add('twshenyi'); - else{ - var card=get.cardPile2(card=>get.type2(card)==get.type2(name)); - if(card) player.addToExpansion([card],'gain2').gaintag.add('twshenyi'); - else player.chat('无牌可得?!'); + player.markAuto("twshenyi", [name]); + game.log(player, "声明了", `#y${get.translation(cardx)}`); + var card = get.cardPile2( + (card) => get.name(card, false) == name && get.nature(card, false) == nature + ); + if (card) player.addToExpansion([card], "gain2").gaintag.add("twshenyi"); + else { + var card = get.cardPile2((card) => get.type2(card) == get.type2(name)); + if (card) player.addToExpansion([card], "gain2").gaintag.add("twshenyi"); + else player.chat("无牌可得?!"); } - if(trigger.player!=player&&player.countCards('h')){ + if (trigger.player != player && player.countCards("h")) { game.delayex(); - var skill='twshenyi_'+player.playerid; - game.broadcastAll(lib.skill.twshenyi.createGainTag,skill,player.name); - game.addVideo('skill',player,['twshenyi',[skill,player.name]]); - var result2=yield player.chooseCard('伸义:是否将任意张牌交给'+get.translation(trigger.player)+'?',[1,player.countCards('h')]).set('ai',card=>{ - if(!_status.event.goon) return 0; - return 7-get.value(card); - }).set('goon',get.attitude(player,trigger.player)>0); - if(result2.bool){ - player.give(result2.cards,trigger.player).gaintag.add(skill); - player.addSkill('twshenyi_draw'); + var skill = "twshenyi_" + player.playerid; + game.broadcastAll(lib.skill.twshenyi.createGainTag, skill, player.name); + game.addVideo("skill", player, ["twshenyi", [skill, player.name]]); + var result2 = yield player + .chooseCard( + "伸义:是否将任意张牌交给" + get.translation(trigger.player) + "?", + [1, player.countCards("h")] + ) + .set("ai", (card) => { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }) + .set("goon", get.attitude(player, trigger.player) > 0); + if (result2.bool) { + player.give(result2.cards, trigger.player).gaintag.add(skill); + player.addSkill("twshenyi_draw"); } } - } - else player.storage.counttrigger.twshenyi--; + } else player.storage.counttrigger.twshenyi--; }, - video:(player,info)=>lib.skill.twshenyi.createGainTag(info[0],info[1]), - createGainTag:function(skill,name){ - if(!lib.skill[skill]){ - lib.skill[skill]={charlotte:true}; - lib.translate[skill]='义·'+get.translation(name); + video: (player, info) => lib.skill.twshenyi.createGainTag(info[0], info[1]), + createGainTag: function (skill, name) { + if (!lib.skill[skill]) { + lib.skill[skill] = { charlotte: true }; + lib.translate[skill] = "义·" + get.translation(name); } - if(!_status.postReconnect.twshenyi){ - _status.postReconnect.twshenyi=[ - lib.skill.twshenyi.createGainTag,[],[] - ]; + if (!_status.postReconnect.twshenyi) { + _status.postReconnect.twshenyi = [lib.skill.twshenyi.createGainTag, [], []]; } _status.postReconnect.twshenyi[1].add(skill); _status.postReconnect.twshenyi[2].add(name); }, - marktext:'义', - intro:{ - name:'侠义', - content:'expansion', - markcount:'expansion', + marktext: "义", + intro: { + name: "侠义", + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ + onremove: function (player, skill) { delete player.storage[skill]; //var cards=player.getExpansions(skill); //if(cards.length) player.loseToDiscardpile(cards); }, - subSkill:{ - draw:{ - charlotte:true, - audio:'twshenyi', - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + draw: { + charlotte: true, + audio: "twshenyi", + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var skill='twshenyi_'+player.playerid; - return game.hasPlayer(target=>{ - var evt=event.getl(target); - if(!evt||!evt.hs||!evt.hs.length) return false; - for(let i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes(skill)) return true; + filter: function (event, player) { + var skill = "twshenyi_" + player.playerid; + return game.hasPlayer((target) => { + var evt = event.getl(target); + if (!evt || !evt.hs || !evt.hs.length) return false; + for (let i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes(skill)) return true; } return false; }); }, - forced:true, - direct:true, - content:function(){ - var skill='twshenyi_'+player.playerid; - var num=0; - var targets=game.filterPlayer(target=>{ - var evt=trigger.getl(target); - var numx=0; - if(!evt||!evt.hs||!evt.hs.length) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes(skill)) numx++; + forced: true, + direct: true, + content: function () { + var skill = "twshenyi_" + player.playerid; + var num = 0; + var targets = game.filterPlayer((target) => { + var evt = trigger.getl(target); + var numx = 0; + if (!evt || !evt.hs || !evt.hs.length) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes(skill)) numx++; } - if(numx>0) return num+=numx; + if (numx > 0) return (num += numx); return false; }); - if(num>0){ - player.logSkill('twshenyi_draw',targets); + if (num > 0) { + player.logSkill("twshenyi_draw", targets); player.draw(num); } }, }, }, }, - twxinghan:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.getExpansions('twshenyi').length>game.countPlayer(); + twxinghan: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("twshenyi").length > game.countPlayer(); }, - check:function(event,player){ - if(player.hp>=3||(player.countCards('h')>=4&&player.getExpansions('twshenyi').every(card=>!player.hasValueTarget(card)||!get.tag(card,'damage')||!lib.skill.xunshi.isXunshi(card)))) return false; - return player.getExpansions('twshenyi').some(card=>player.hasValueTarget(card)); + check: function (event, player) { + if ( + player.hp >= 3 || + (player.countCards("h") >= 4 && + player + .getExpansions("twshenyi") + .every( + (card) => + !player.hasValueTarget(card) || + !get.tag(card, "damage") || + !lib.skill.xunshi.isXunshi(card) + )) + ) + return false; + return player.getExpansions("twshenyi").some((card) => player.hasValueTarget(card)); }, - direct:true, - content:function*(event,map){ - var player=map.player; - var result=yield player.chooseBool().set('createDialog',[ - get.prompt('twxinghan'), - `
    按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)
    `, - player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(), - 'hidden', - ]).set('choice',lib.skill.twxinghan.check(null,player)); - if(!result.bool){ + direct: true, + content: function* (event, map) { + var player = map.player; + var result = yield player + .chooseBool() + .set("createDialog", [ + get.prompt("twxinghan"), + `
    按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)
    `, + player + .getExpansions("twshenyi") + .filter((card) => player.hasUseTarget(card)) + .reverse(), + "hidden", + ]) + .set("choice", lib.skill.twxinghan.check(null, player)); + if (!result.bool) { event.finish(); return; } - while(true){ - var cards=player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(); - if(!cards.length) break; - yield player.chooseUseTarget(true,cards[0],false); + while (true) { + var cards = player + .getExpansions("twshenyi") + .filter((card) => player.hasUseTarget(card)) + .reverse(); + if (!cards.length) break; + yield player.chooseUseTarget(true, cards[0], false); } - player.when('phaseEnd').then(()=>{ - if(player.countCards('h')) player.chooseToDiscard(player.countCards('h'),true); - var num=Math.max(1,player.getHp()-1); + player.when("phaseEnd").then(() => { + if (player.countCards("h")) player.chooseToDiscard(player.countCards("h"), true); + var num = Math.max(1, player.getHp() - 1); player.loseHp(num); }); }, - group:'twxinghan_init', - subSkill:{ - init:{ - audio:'twxinghan', - trigger:{ - player:['loseEnd','dying','phaseBefore','phaseAfter','dyingAfter','die'], - global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + group: "twxinghan_init", + subSkill: { + init: { + audio: "twxinghan", + trigger: { + player: ["loseEnd", "dying", "phaseBefore", "phaseAfter", "dyingAfter", "die"], + global: [ + "equipEnd", + "addJudgeEnd", + "gainEnd", + "loseAsyncEnd", + "addToExpansionEnd", + ], }, - filter:function(event,player){ - return (player.getExpansions('twshenyi').length&&event.name!='die'&&(_status.currentPhase!=player||player.isDying()))^player.hasSkill('twxinghan_in'); + filter: function (event, player) { + return ( + (player.getExpansions("twshenyi").length && + event.name != "die" && + (_status.currentPhase != player || player.isDying())) ^ + player.hasSkill("twxinghan_in") + ); }, - forced:true, - firstDo:true, - silent:true, - forceDie:true, - content:function(){ - if(player.getExpansions('twshenyi').length&&trigger.name!='die'&&(_status.currentPhase!=player||player.isDying())){ - var cards=player.getExpansions('twshenyi'); - var cardsx=cards.map(card=>{ - var cardx=ui.create.card(); + forced: true, + firstDo: true, + silent: true, + forceDie: true, + content: function () { + if ( + player.getExpansions("twshenyi").length && + trigger.name != "die" && + (_status.currentPhase != player || player.isDying()) + ) { + var cards = player.getExpansions("twshenyi"); + var cardsx = cards.map((card) => { + var cardx = ui.create.card(); cardx.init(get.cardInfo(card)); - cardx._cardid=card.cardid; + cardx._cardid = card.cardid; return cardx; }); - player.directgains(cardsx,null,'twxinghan_tag'); - player.addSkill('twxinghan_in'); - } - else player.removeSkill('twxinghan_in'); + player.directgains(cardsx, null, "twxinghan_tag"); + player.addSkill("twxinghan_in"); + } else player.removeSkill("twxinghan_in"); }, }, - in:{ - charlotte:true, - audio:'twxinghan', - trigger:{player:'addToExpansionEnd'}, - filter:function(event,player){ - return event.gaintag.includes('twshenyi'); + in: { + charlotte: true, + audio: "twxinghan", + trigger: { player: "addToExpansionEnd" }, + filter: function (event, player) { + return event.gaintag.includes("twshenyi"); }, - forced:true, - locked:false, - silent:true, - content:function(){ - 'step 0' - var cards2=player.getCards('s',card=>card.hasGaintag('twxinghan_tag')); - if(player.isOnline2()){ - player.send(function(cards,player){ - cards.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - },cards2,player); + forced: true, + locked: false, + silent: true, + content: function () { + "step 0"; + var cards2 = player.getCards("s", (card) => card.hasGaintag("twxinghan_tag")); + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); } - cards2.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - 'step 1' - var cards=player.getExpansions('twshenyi'); - var cardsx=cards.map(card=>{ - var cardx=ui.create.card(); + cards2.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + ("step 1"); + var cards = player.getExpansions("twshenyi"); + var cardsx = cards.map((card) => { + var cardx = ui.create.card(); cardx.init(get.cardInfo(card)); - cardx._cardid=card.cardid; + cardx._cardid = card.cardid; return cardx; }); - player.directgains(cardsx,null,'twxinghan_tag'); + player.directgains(cardsx, null, "twxinghan_tag"); }, - onremove:function(player){ - var cards2=player.getCards('s',card=>card.hasGaintag('twxinghan_tag')); - if(player.isOnline2()){ - player.send(function(cards,player){ - cards.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - },cards2,player); + onremove: function (player) { + var cards2 = player.getCards("s", (card) => card.hasGaintag("twxinghan_tag")); + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards2, + player + ); } - cards2.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); + cards2.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); }, - group:'twxinghan_use', + group: "twxinghan_use", }, - use:{ - charlotte:true, - trigger:{player:['useCardBefore','respondBefore']}, - filter:function(event,player){ - var cards=player.getCards('s',card=>card.hasGaintag('twxinghan_tag')&&card._cardid); - return event.cards&&event.cards.some(card=>{ - return cards.includes(card); - }); + use: { + charlotte: true, + trigger: { player: ["useCardBefore", "respondBefore"] }, + filter: function (event, player) { + var cards = player.getCards( + "s", + (card) => card.hasGaintag("twxinghan_tag") && card._cardid + ); + return ( + event.cards && + event.cards.some((card) => { + return cards.includes(card); + }) + ); }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - var idList=player.getCards('s',card=>card.hasGaintag('twxinghan_tag')).map(i=>i._cardid); - var cards=player.getExpansions('twshenyi'); - var cards2=[]; - for(var card of trigger.cards){ - var cardx=cards.find(cardx=>cardx.cardid==card._cardid); - if(cardx) cards2.push(cardx); + forced: true, + popup: false, + firstDo: true, + content: function () { + var idList = player + .getCards("s", (card) => card.hasGaintag("twxinghan_tag")) + .map((i) => i._cardid); + var cards = player.getExpansions("twshenyi"); + var cards2 = []; + for (var card of trigger.cards) { + var cardx = cards.find((cardx) => cardx.cardid == card._cardid); + if (cardx) cards2.push(cardx); } - var cards3=trigger.cards.slice(); - trigger.cards=cards2; - trigger.card.cards=cards2; - if(player.isOnline2()){ - player.send(function(cards,player){ - cards.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); - },cards3,player); + var cards3 = trigger.cards.slice(); + trigger.cards = cards2; + trigger.card.cards = cards2; + if (player.isOnline2()) { + player.send( + function (cards, player) { + cards.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); + }, + cards3, + player + ); } - cards3.forEach(i=>i.delete()); - if(player==game.me) ui.updatehl(); + cards3.forEach((i) => i.delete()); + if (player == game.me) ui.updatehl(); }, }, }, - ai:{ - combo:'twshenyi' - } + ai: { + combo: "twshenyi", + }, }, //张纮 - twquanqian:{ - audio:2, - sunbenSkill:true, - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('twquanqian_sunben')&&player.countCards('h')&&game.countPlayer()>1; + twquanqian: { + audio: 2, + sunbenSkill: true, + enable: "phaseUse", + filter: function (event, player) { + return ( + !player.hasSkill("twquanqian_sunben") && + player.countCards("h") && + game.countPlayer() > 1 + ); }, - filterCard:function(card,player){ - return !ui.selected.cards.some(cardx=>get.suit(cardx,player)==get.suit(card,player)); + filterCard: function (card, player) { + return !ui.selected.cards.some( + (cardx) => get.suit(cardx, player) == get.suit(card, player) + ); }, - selectCard:[1,4], - check:function(card){ - return 1/(get.value(card)||0.5); + selectCard: [1, 4], + check: function (card) { + return 1 / (get.value(card) || 0.5); }, - position:'h', - complexCard:true, - discard:false, - lose:false, - delay:false, - filterTarget:lib.filter.notMe, - usable:1, - content:function(){ - 'step 0' - player.addSkill('twquanqian_sunben'); - player.give(cards,target); - if(cards.length<2) event.finish(); - 'step 1' - var card=get.cardPile2(card=>get.type(card)=='equip'); - if(card) player.gain(card,'gain2'); - 'step 2' - if(player.countCards('h')>=target.countCards('h')){ - if(target.countCards('h')) event._result={index:1}; + position: "h", + complexCard: true, + discard: false, + lose: false, + delay: false, + filterTarget: lib.filter.notMe, + usable: 1, + content: function () { + "step 0"; + player.addSkill("twquanqian_sunben"); + player.give(cards, target); + if (cards.length < 2) event.finish(); + ("step 1"); + var card = get.cardPile2((card) => get.type(card) == "equip"); + if (card) player.gain(card, "gain2"); + ("step 2"); + if (player.countCards("h") >= target.countCards("h")) { + if (target.countCards("h")) event._result = { index: 1 }; else event.finish(); + } else { + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", [ + "将手牌数摸至与" + str + "相同", + "观看" + str + "的手牌并获得其一种花色的所有手牌", + ]) + .set("ai", () => { + var player = _status.event.player; + var target = _status.event.target; + if ( + target.countCards("h") - player.countCards("h") > + target.countCards("h") / 4 || + get.attitude(player, target) > 0 + ) + return 0; + return 1; + }) + .set("target", target); } - else{ - var str=get.translation(target); - player.chooseControl().set('choiceList',[ - '将手牌数摸至与'+str+'相同', - '观看'+str+'的手牌并获得其一种花色的所有手牌', - ]).set('ai',()=>{ - var player=_status.event.player; - var target=_status.event.target; - if(target.countCards('h')-player.countCards('h')>target.countCards('h')/4||get.attitude(player,target)>0) return 0; - return 1; - }).set('target',target); - } - 'step 3' - if(result.index==0){ - player.drawTo(target.countCards('h')); + ("step 3"); + if (result.index == 0) { + player.drawTo(target.countCards("h")); event.finish(); return; } - var list=[]; - var dialog=['劝迁:获得'+get.translation(target)+'一种花色的所有牌']; - for(var suit of lib.suit.concat('none')){ - if(target.countCards('h',{suit:suit})){ - dialog.push('
    '+get.translation(suit+'2')+'牌
    '); - dialog.push(target.getCards('h',{suit:suit})); + var list = []; + var dialog = ["劝迁:获得" + get.translation(target) + "一种花色的所有牌"]; + for (var suit of lib.suit.concat("none")) { + if (target.countCards("h", { suit: suit })) { + dialog.push( + '
    ' + get.translation(suit + "2") + "牌
    " + ); + dialog.push(target.getCards("h", { suit: suit })); list.push(suit); } } - if(!list.length){ + if (!list.length) { event.finish(); return; } - player.chooseControl(list).set('dialog',dialog).set('ai',()=>{ - return _status.event.control; - }).set('control',(()=>{ - var getv=(cards)=>cards.map(i=>get.value(i)).reduce((p,c)=>p+c,0); - return list.sort((a,b)=>{ - return getv(target.getCards('h',{suit:b}))-getv(target.getCards('h',{suit:a})); - })[0]; - })()); - 'step 4' - if(result.control) player.gain(target.getCards('h',{suit:result.control}),target,'give'); + player + .chooseControl(list) + .set("dialog", dialog) + .set("ai", () => { + return _status.event.control; + }) + .set( + "control", + (() => { + var getv = (cards) => + cards.map((i) => get.value(i)).reduce((p, c) => p + c, 0); + return list.sort((a, b) => { + return ( + getv(target.getCards("h", { suit: b })) - + getv(target.getCards("h", { suit: a })) + ); + })[0]; + })() + ); + ("step 4"); + if (result.control) + player.gain(target.getCards("h", { suit: result.control }), target, "give"); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - return target.countCards('h'); + ai: { + order: 7, + result: { + target: function (player, target) { + return target.countCards("h"); }, }, }, - subSkill:{ - sunben:{ - charlotte:true, - init:function(player){ - player.storage.twquanqian_sunben=0; + subSkill: { + sunben: { + charlotte: true, + init: function (player) { + player.storage.twquanqian_sunben = 0; }, - onremove:true, - mark:true, - intro:{ - markcount:function(num){ - return (num||0).toString(); + onremove: true, + mark: true, + intro: { + markcount: function (num) { + return (num || 0).toString(); }, - content:'弃牌进度:#/6', + content: "弃牌进度:#/6", }, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - if(event.type!='discard') return false; - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length; + filter: function (event, player) { + if (event.type != "discard") return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - 'step 0' - player.addMark('twquanqian_sunben',trigger.getl(player).hs.length,false); - 'step 1' - if(player.countMark('twquanqian_sunben')>=6){ - player.removeSkill('twquanqian_sunben'); - player.popup('劝迁'); - game.log(player,'恢复了技能','#g【劝迁】'); + forced: true, + popup: false, + firstDo: true, + content: function () { + "step 0"; + player.addMark("twquanqian_sunben", trigger.getl(player).hs.length, false); + ("step 1"); + if (player.countMark("twquanqian_sunben") >= 6) { + player.removeSkill("twquanqian_sunben"); + player.popup("劝迁"); + game.log(player, "恢复了技能", "#g【劝迁】"); } }, }, }, }, - twrouke:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter' + twrouke: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - if(evt&&evt.player==player) return false; - return event.getg(player).length>1; + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + if (evt && evt.player == player) return false; + return event.getg(player).length > 1; }, - forced:true, - content:function(){ + forced: true, + content: function () { player.draw(); }, }, //张昭 - twlijian:{ - getCards:function(event){ - var cards=[]; - game.countPlayer2(function(current){ - current.checkHistory('lose',function(evt){ - if(evt.position==ui.discardPile&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards); - }) + twlijian: { + getCards: function (event) { + var cards = []; + game.countPlayer2(function (current) { + current.checkHistory("lose", function (evt) { + if (evt.position == ui.discardPile && evt.getParent("phaseDiscard") == event) + cards.addArray(evt.cards); + }); }); - game.checkGlobalHistory('cardMove',function(evt){ - if(evt.name=='cardsDiscard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards); + game.checkGlobalHistory("cardMove", function (evt) { + if (evt.name == "cardsDiscard" && evt.getParent("phaseDiscard") == event) + cards.addArray(evt.cards); }); - return cards.filterInD('d'); + return cards.filterInD("d"); }, - audio:2, - sunbenSkill:true, - trigger:{global:'phaseDiscardEnd'}, - filter:function(event,player){ - if(player.hasSkill('twlijian_sunben')) return false; - if(event.player!=player&&event.player.isIn()){ + audio: 2, + sunbenSkill: true, + trigger: { global: "phaseDiscardEnd" }, + filter: function (event, player) { + if (player.hasSkill("twlijian_sunben")) return false; + if (event.player != player && event.player.isIn()) { return lib.skill.twlijian.getCards(event).length; } return false; }, - prompt2:()=>'选择任意张本阶段进入弃牌堆的牌令其获得,然后你获得剩余的牌,若其获得的牌数大于你,则你可以对其造成1点伤害', - logTarget:'player', - content:function(){ - 'step 0' - player.addSkill('twlijian_sunben'); - var cards=lib.skill.twlijian.getCards(trigger),target=trigger.player; - event.cards=cards;event.target=target; - player.chooseToMove('力荐:请分配'+get.translation(target)+'和你获得的牌',true).set('list',[ - [get.translation(target)+'获得的牌',cards], - ['你获得的牌'], - ]).set('processAI',function(list){ - var player=_status.event.player; - var target=_status.event.getTrigger().player; - var att=get.attitude(player,target); - var cards=_status.event.cards; - var cardx=cards.filter(card=>card.name=='du'); - var cardy=cards.removeArray(cardx); - switch(get.sgn(att)){ - case 1: - return [cards,[]]; - case 0: - return [cardx,cardy]; - case -1: - var num=Math.ceil(cards.length/2)+(cards.length%2==0?1:0); - if(num>1&&player.hasSkill('twchungang')) num--; - if(get.damageEffect(target,player,player)<=0||num>2||cardx.length>cardy.length) return [cardx,cardy]; - var num2=cardy.length-cardx.length; - num2=Math.ceil(num2/2)+(num2%2==0?1:0); - cardy.sort((a,b)=>get.value(b)-get.value(a)); - cardx.addArray(cardy.slice(num,cardy.length)); - return [cardx,cardy.slice(0,num)]; - } - }).set('cards',cards); - 'step 1' - if(result.bool){ - target.gain(result.moved[0],'gain2'); - player.gain(result.moved[1],'gain2'); - if(result.moved[0].length>result.moved[1].length){ - player.chooseBool('是否对'+get.translation(target)+'造成1点伤害?').set('choice',get.damageEffect(target,player,player)>0); - } - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ + prompt2: () => + "选择任意张本阶段进入弃牌堆的牌令其获得,然后你获得剩余的牌,若其获得的牌数大于你,则你可以对其造成1点伤害", + logTarget: "player", + content: function () { + "step 0"; + player.addSkill("twlijian_sunben"); + var cards = lib.skill.twlijian.getCards(trigger), + target = trigger.player; + event.cards = cards; + event.target = target; + player + .chooseToMove("力荐:请分配" + get.translation(target) + "和你获得的牌", true) + .set("list", [[get.translation(target) + "获得的牌", cards], ["你获得的牌"]]) + .set("processAI", function (list) { + var player = _status.event.player; + var target = _status.event.getTrigger().player; + var att = get.attitude(player, target); + var cards = _status.event.cards; + var cardx = cards.filter((card) => card.name == "du"); + var cardy = cards.removeArray(cardx); + switch (get.sgn(att)) { + case 1: + return [cards, []]; + case 0: + return [cardx, cardy]; + case -1: + var num = Math.ceil(cards.length / 2) + (cards.length % 2 == 0 ? 1 : 0); + if (num > 1 && player.hasSkill("twchungang")) num--; + if ( + get.damageEffect(target, player, player) <= 0 || + num > 2 || + cardx.length > cardy.length + ) + return [cardx, cardy]; + var num2 = cardy.length - cardx.length; + num2 = Math.ceil(num2 / 2) + (num2 % 2 == 0 ? 1 : 0); + cardy.sort((a, b) => get.value(b) - get.value(a)); + cardx.addArray(cardy.slice(num, cardy.length)); + return [cardx, cardy.slice(0, num)]; + } + }) + .set("cards", cards); + ("step 1"); + if (result.bool) { + target.gain(result.moved[0], "gain2"); + player.gain(result.moved[1], "gain2"); + if (result.moved[0].length > result.moved[1].length) { + player + .chooseBool("是否对" + get.translation(target) + "造成1点伤害?") + .set("choice", get.damageEffect(target, player, player) > 0); + } else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) { player.line(target); target.damage(); } }, - subSkill:{ - sunben:{ - charlotte:true, - init:function(player){ - player.storage.twlijian_sunben=0; + subSkill: { + sunben: { + charlotte: true, + init: function (player) { + player.storage.twlijian_sunben = 0; }, - onremove:true, - mark:true, - intro:{ - markcount:function(num){ - return (num||0).toString(); + onremove: true, + mark: true, + intro: { + markcount: function (num) { + return (num || 0).toString(); }, - content:'弃牌堆进入牌进度:#/8', + content: "弃牌堆进入牌进度:#/8", }, - trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, - filter:function(event,player){ - var cards=event.getd(); - if(!cards.length) return false; - var list=cards.slice(); - game.checkGlobalHistory('cardMove',function(evt){ - if(evt==event||evt.getParent()==event||(evt.name!='lose'&&evt.name!='cardsDiscard')) return false; - if(evt.name=='lose'&&evt.position!=ui.discardPile) return false; - list.removeArray(evt.cards); - },event); - return list.length>0; + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - 'step 0' - var cards=trigger.getd().slice(); - game.checkGlobalHistory('cardMove',function(evt){ - if(evt==trigger||evt.getParent()==trigger||(evt.name!='lose'&&evt.name!='cardsDiscard')) return false; - if(evt.name=='lose'&&evt.position!=ui.discardPile) return false; - cards.removeArray(evt.cards); - },trigger); - player.addMark('twlijian_sunben',cards.length,false); - 'step 1' - if(player.countMark('twlijian_sunben')>=8){ - player.removeSkill('twlijian_sunben'); - player.popup('力荐'); - game.log(player,'恢复了技能','#g【力荐】'); + filter: function (event, player) { + var cards = event.getd(); + if (!cards.length) return false; + var list = cards.slice(); + game.checkGlobalHistory( + "cardMove", + function (evt) { + if ( + evt == event || + evt.getParent() == event || + (evt.name != "lose" && evt.name != "cardsDiscard") + ) + return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + list.removeArray(evt.cards); + }, + event + ); + return list.length > 0; + }, + forced: true, + popup: false, + firstDo: true, + content: function () { + "step 0"; + var cards = trigger.getd().slice(); + game.checkGlobalHistory( + "cardMove", + function (evt) { + if ( + evt == trigger || + evt.getParent() == trigger || + (evt.name != "lose" && evt.name != "cardsDiscard") + ) + return false; + if (evt.name == "lose" && evt.position != ui.discardPile) return false; + cards.removeArray(evt.cards); + }, + trigger + ); + player.addMark("twlijian_sunben", cards.length, false); + ("step 1"); + if (player.countMark("twlijian_sunben") >= 8) { + player.removeSkill("twlijian_sunben"); + player.popup("力荐"); + game.log(player, "恢复了技能", "#g【力荐】"); } }, }, }, }, - twchungang:{ - audio:2, - init: ()=>{ - game.addGlobalSkill('twchungang_global'); + twchungang: { + audio: 2, + init: () => { + game.addGlobalSkill("twchungang_global"); }, - onremove: player => { - if (!game.hasPlayer(i => { - return player !== i && i.hasSkill('twchungang'); - }, true)) game.removeGlobalSkill('twchungang_global'); + onremove: (player) => { + if ( + !game.hasPlayer((i) => { + return player !== i && i.hasSkill("twchungang"); + }, true) + ) + game.removeGlobalSkill("twchungang_global"); }, - trigger:{global:['gainAfter','loseAsyncAfter']}, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - return game.hasPlayer(target=>{ - if(target==player||(evt&&evt.player==target)) return false; - return event.getg(target).length>1&&target.countCards('he'); + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + var evt = event.getParent("phaseDraw"); + return game.hasPlayer((target) => { + if (target == player || (evt && evt.player == target)) return false; + return event.getg(target).length > 1 && target.countCards("he"); }); }, - forced:true, - logTarget:function(event,player){ - var evt=event.getParent('phaseDraw'); - return game.filterPlayer(target=>{ - if(target==player||evt&&evt.player==target) return false; - return event.getg(target).length>1&&target.countCards('he'); + forced: true, + logTarget: function (event, player) { + var evt = event.getParent("phaseDraw"); + return game.filterPlayer((target) => { + if (target == player || (evt && evt.player == target)) return false; + return event.getg(target).length > 1 && target.countCards("he"); }); }, - content:function(){ - for(var i of lib.skill.twchungang.logTarget(trigger,player)){ - i.chooseToDiscard('he',true); + content: function () { + for (var i of lib.skill.twchungang.logTarget(trigger, player)) { + i.chooseToDiscard("he", true); } }, subSkill: { global: { trigger: { - player: 'dieAfter' + player: "dieAfter", }, filter(event, player) { - return !game.hasPlayer(i => i.hasSkill('twchungang'), true) + return !game.hasPlayer((i) => i.hasSkill("twchungang"), true); }, silent: true, forceDie: true, charlotte: true, content() { - game.removeGlobalSkill('twchungang_global'); + game.removeGlobalSkill("twchungang_global"); }, ai: { effect: { target(card, player, target) { - if ((get.tag(card, 'gain') || 0) < 2 && (get.tag(card, 'draw') || 0) < 2) return; - let evt = _status.event.getParent('phaseDraw'), dis = game.countPlayer(i => { - return target !== i && i.hasSkill('twchungang'); - }); - if (!dis || evt && evt.player === target) return; + if ((get.tag(card, "gain") || 0) < 2 && (get.tag(card, "draw") || 0) < 2) + return; + let evt = _status.event.getParent("phaseDraw"), + dis = game.countPlayer((i) => { + return target !== i && i.hasSkill("twchungang"); + }); + if (!dis || (evt && evt.player === target)) return; return [1, -dis]; - } - } - } - } - } + }, + }, + }, + }, + }, }, //海外主公技 //张鲁 twshijun: { unique: true, - global: 'twshijun_global', + global: "twshijun_global", audio: 2, zhuSkill: true, - ai: { combo: 'yishe' }, + ai: { combo: "yishe" }, subSkill: { global: { - audio: 'twshijun', + audio: "twshijun", usable: 1, - enable: 'phaseUse', + enable: "phaseUse", forceaudio: true, filter: function (event, player) { - return player.group == 'qun' && game.hasPlayer(function (current) { - return current != player && current.hasZhuSkill('twshijun', player) && !current.getExpansions('yishe').length; - }); + return ( + player.group == "qun" && + game.hasPlayer(function (current) { + return ( + current != player && + current.hasZhuSkill("twshijun", player) && + !current.getExpansions("yishe").length + ); + }) + ); }, filterTarget: function (card, player, target) { - return target != player && target.hasZhuSkill('twshijun', player) && !target.getExpansions('yishe').length; + return ( + target != player && + target.hasZhuSkill("twshijun", player) && + !target.getExpansions("yishe").length + ); }, - prompt: '摸一张牌然后将一张牌作为“米”置于主公的武将牌上', + prompt: "摸一张牌然后将一张牌作为“米”置于主公的武将牌上", content: function () { - 'step 0' + "step 0"; player.draw(); - if (player.countCards('he')) player.chooseCard('将一张牌置于' + get.translation(target) + '的武将牌上', 'he', true); + if (player.countCards("he")) + player.chooseCard( + "将一张牌置于" + get.translation(target) + "的武将牌上", + "he", + true + ); else event.finish(); - 'step 1' - if (result.bool) target.addToExpansion(result.cards, player, 'give').gaintag.add('yishe'); + ("step 1"); + if (result.bool) + target.addToExpansion(result.cards, player, "give").gaintag.add("yishe"); }, ai: { order: 7, @@ -2485,38 +3334,55 @@ game.import('character', function () { //张绣 twjuxiang: { unique: true, - global: 'twjuxiang_global', + global: "twjuxiang_global", audio: 2, zhuSkill: true, subSkill: { global: { - audio: 'twjuxiang', + audio: "twjuxiang", usable: 1, - enable: 'phaseUse', + enable: "phaseUse", forceaudio: true, filter: function (event, player) { - return player.countCards('e') && player.group == 'qun' && game.hasPlayer(function (target) { - return target != player && target.hasZhuSkill('twjuxiang', player) && player.countCards('e',card=>target.hasEmptySlot(get.subtype(card))||target.hasDisabledSlot(get.subtype(card))); - }); + return ( + player.countCards("e") && + player.group == "qun" && + game.hasPlayer(function (target) { + return ( + target != player && + target.hasZhuSkill("twjuxiang", player) && + player.countCards( + "e", + (card) => + target.hasEmptySlot(get.subtype(card)) || + target.hasDisabledSlot(get.subtype(card)) + ) + ); + }) + ); }, filterTarget: function (card, player, target) { - return target != player && target.hasZhuSkill('twjuxiang', player) && (target.hasEmptySlot(get.subtype(ui.selected.cards[0]))||target.hasDisabledSlot(get.subtype(ui.selected.cards[0]))); + return ( + target != player && + target.hasZhuSkill("twjuxiang", player) && + (target.hasEmptySlot(get.subtype(ui.selected.cards[0])) || + target.hasDisabledSlot(get.subtype(ui.selected.cards[0]))) + ); }, - filterCard: { type: 'equip' }, - position: 'e', + filterCard: { type: "equip" }, + position: "e", check: function (card) { return get.value(card); }, - prompt: '将装备区中的一张牌置入主公的装备区中或恢复主公的对应装备栏', + prompt: "将装备区中的一张牌置入主公的装备区中或恢复主公的对应装备栏", discard: false, lose: false, content: function () { if (target.hasEmptySlot(get.subtype(cards[0]))) { player.$give(cards[0], target, false); target.equip(cards[0]); - } - else { - target.gain(cards[0], player, 'give'); + } else { + target.gain(cards[0], player, "give"); target.enableEquip(get.subtype(cards[0])); } }, @@ -2532,33 +3398,38 @@ game.import('character', function () { //孙坚 twpolu: { unique: true, - audio: 'repolu', - trigger: { global: ['dieAfter', 'die'] }, + audio: "repolu", + trigger: { global: ["dieAfter", "die"] }, forceDie: true, zhuSkill: true, filter: function (event, player, name) { - if (!player.hasZhuSkill('twpolu')) return false; - if (name == 'dieAfter' && event.source && event.source.group == 'wu') return true; - if (name == 'die' && event.player.group == 'wu') return true; + if (!player.hasZhuSkill("twpolu")) return false; + if (name == "dieAfter" && event.source && event.source.group == "wu") return true; + if (name == "die" && event.player.group == "wu") return true; return false; }, direct: true, content: function () { - 'step 0' + "step 0"; if (!player.storage.twpolu) player.storage.twpolu = 0; event.num = player.storage.twpolu + 1; - player.chooseTarget([1, Infinity], get.prompt('twpolu'), '令任意名角色摸' + get.cnNumber(event.num) + '张牌').set('forceDie', true).ai = function (target) { + player + .chooseTarget( + [1, Infinity], + get.prompt("twpolu"), + "令任意名角色摸" + get.cnNumber(event.num) + "张牌" + ) + .set("forceDie", true).ai = function (target) { return get.attitude(_status.event.player, target); }; - 'step 1' + ("step 1"); if (result.bool) { player.storage.twpolu++; result.targets.sortBySeat(); - player.logSkill('repolu', result.targets); + player.logSkill("repolu", result.targets); game.asyncDraw(result.targets, num); - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); game.delay(); }, }, @@ -2566,179 +3437,203 @@ game.import('character', function () { twqiushou: { unique: true, audio: 2, - trigger: { global: 'useCardAfter' }, + trigger: { global: "useCardAfter" }, filter: function (event, player) { - if (event.card.name != 'nanman') return false; - var num = 0, bool = false; + if (event.card.name != "nanman") return false; + var num = 0, + bool = false; for (var i of event.targets) { if (!i.isAlive()) bool = true; - i.getHistory('damage', function (evt) { + i.getHistory("damage", function (evt) { if (evt.getParent(2) == event) num += evt.num; }); } - return player.hasZhuSkill('twqiushou') && (bool || num > 3); + return player.hasZhuSkill("twqiushou") && (bool || num > 3); }, zhuSkill: true, forced: true, logTarget: function (event, player) { return game.filterPlayer(function (target) { - return ['shu', 'qun'].includes(target.group); + return ["shu", "qun"].includes(target.group); }); }, content: function () { - 'step 0' + "step 0"; game.asyncDraw(lib.skill.twqiushou.logTarget(trigger.player)); - 'step 1' + ("step 1"); game.delayx(); }, }, //刘协 - twzhuiting:{ - unique:true, - zhuSkill:true, - audio:2, - global:'twzhuiting_global', - subSkill:{ - global:{ - hiddenWuxie:function(player,info){ - if(player.group!='wei'&&player.group!='qun') return false; - const target=info.target,card=info.card; - if(!target||target==player||!target.hasZhuSkill('twzhuiting')) return false; - if(_status.connectMode&&player.countCards('hs')>0) return true; - const color=get.color(card,false); - if(color=='none') return false; - return player.hasCard(card=>get.color(card)==color,'hes'); + twzhuiting: { + unique: true, + zhuSkill: true, + audio: 2, + global: "twzhuiting_global", + subSkill: { + global: { + hiddenWuxie: function (player, info) { + if (player.group != "wei" && player.group != "qun") return false; + const target = info.target, + card = info.card; + if (!target || target == player || !target.hasZhuSkill("twzhuiting")) + return false; + if (_status.connectMode && player.countCards("hs") > 0) return true; + const color = get.color(card, false); + if (color == "none") return false; + return player.hasCard((card) => get.color(card) == color, "hes"); }, - audio:'twzhuiting', - forceaudio:true, - enable:'chooseToUse', - filter:function(event,player){ - if(event.type!='wuxie'||player.group!='wei'&&player.group!='qun') return false; - const info=event.info_map,target=info.target,card=info.card; - if(!target||target==player||!target.hasZhuSkill('twzhuiting')) return false; - const color=get.color(card,false); - if(color=='none') return false; - return player.hasCard(card=>get.color(card)==color,'hes'); + audio: "twzhuiting", + forceaudio: true, + enable: "chooseToUse", + filter: function (event, player) { + if (event.type != "wuxie" || (player.group != "wei" && player.group != "qun")) + return false; + const info = event.info_map, + target = info.target, + card = info.card; + if (!target || target == player || !target.hasZhuSkill("twzhuiting")) + return false; + const color = get.color(card, false); + if (color == "none") return false; + return player.hasCard((card) => get.color(card) == color, "hes"); }, - filterCard:function(card){ - const info=_status.event.info_map; - return info&&get.color(card)==get.color(info.card,false); + filterCard: function (card) { + const info = _status.event.info_map; + return info && get.color(card) == get.color(info.card, false); }, - viewAs:{name:'wuxie'}, - position:'hes', - prompt:function(){ - const info=_status.event.info_map; - return '将一张'+get.translation(get.color(info.card))+'牌当作【无懈可击】对'+get.translation(info.target)+'使用'; + viewAs: { name: "wuxie" }, + position: "hes", + prompt: function () { + const info = _status.event.info_map; + return ( + "将一张" + + get.translation(get.color(info.card)) + + "牌当作【无懈可击】对" + + get.translation(info.target) + + "使用" + ); }, - check:function(card){ - return 8-get.value(card); + check: function (card) { + return 8 - get.value(card); }, }, }, }, //刘繇 - twniju:{ - audio:2, - zhuSkill:true, - trigger:{ - global:'compare', + twniju: { + audio: 2, + zhuSkill: true, + trigger: { + global: "compare", }, - priority:1, - filter(event,player){ - if(!player.hasZhuSkill('twniju')) return false; - if(event.iwhile||(event.target&&event.compareMeanwhile)) return false; - const participant=[event.player]; - if(event.targets) participant.addArray(event.targets); + priority: 1, + filter(event, player) { + if (!player.hasZhuSkill("twniju")) return false; + if (event.iwhile || (event.target && event.compareMeanwhile)) return false; + const participant = [event.player]; + if (event.targets) participant.addArray(event.targets); else participant.add(event.target); return participant.includes(player); }, - direct:true, - async content(event,trigger,player){ - const num=game.countPlayer(current=>current.group==='qun'); - const dialog=[ - get.prompt('twniju'), + direct: true, + async content(event, trigger, player) { + const num = game.countPlayer((current) => current.group === "qun"); + const dialog = [ + get.prompt("twniju"), `
    令一张拼点牌的点数+${num}或-${num}
    `, - [[ - ['addNumber','增加'], - ['subtractNumber','减少'] - ],'tdnodes'], + [ + [ + ["addNumber", "增加"], + ["subtractNumber", "减少"], + ], + "tdnodes", + ], ]; - const lose_list=trigger.lose_list.slice().sort((a,b)=>lib.sort.seat(a[0],b[0])); - dialog.push(`
    ${lose_list.map(list=>{ - return get.translation(list[0]); - }).join('  /  ')}
    `); - const cards=lose_list.map(list=>list[1]).flat(); + const lose_list = trigger.lose_list.slice().sort((a, b) => lib.sort.seat(a[0], b[0])); + dialog.push( + `
    ${lose_list + .map((list) => { + return get.translation(list[0]); + }) + .join("  /  ")}
    ` + ); + const cards = lose_list.map((list) => list[1]).flat(); dialog.push(cards); - const result=await player.chooseButton(dialog,2) - .set('filterButton',button=>{ - const type=typeof button.link; - if(ui.selected.buttons.length&&type===typeof ui.selected.buttons[0].link) return false; + const result = await player + .chooseButton(dialog, 2) + .set("filterButton", (button) => { + const type = typeof button.link; + if (ui.selected.buttons.length && type === typeof ui.selected.buttons[0].link) + return false; return true; }) - .forResult() - if(!result.bool) return; - const {links}=result; - if(typeof links[0]!=='string') links.reverse(); - let [fn,card]=links; - const selectedPlayer=lose_list.find(item=>{ - if(Array.isArray(item[1])) return item[1].includes(card); - return item[1]==card; + .forResult(); + if (!result.bool) return; + const { links } = result; + if (typeof links[0] !== "string") links.reverse(); + let [fn, card] = links; + const selectedPlayer = lose_list.find((item) => { + if (Array.isArray(item[1])) return item[1].includes(card); + return item[1] == card; })[0]; - player.logSkill('twniju',selectedPlayer); - selectedPlayer.addTempSkill('twniju_change'); - if(!selectedPlayer.storage.twniju_change) selectedPlayer.storage.twniju_change=[]; - selectedPlayer.storage.twniju_change.push([fn,num,card]); - player.when('chooseToCompareAfter') - .filter(evt=>evt===trigger) + player.logSkill("twniju", selectedPlayer); + selectedPlayer.addTempSkill("twniju_change"); + if (!selectedPlayer.storage.twniju_change) selectedPlayer.storage.twniju_change = []; + selectedPlayer.storage.twniju_change.push([fn, num, card]); + player + .when("chooseToCompareAfter") + .filter((evt) => evt === trigger) .vars({ - toDraw:num, + toDraw: num, }) - .then(()=>{ - const num1=trigger.result.num1,num2=trigger.result.num2; - let bool=false; - if(typeof num1==='number'&&typeof num2==='number'){ - if(num1===num2){ - bool=true; + .then(() => { + const num1 = trigger.result.num1, + num2 = trigger.result.num2; + let bool = false; + if (typeof num1 === "number" && typeof num2 === "number") { + if (num1 === num2) { + bool = true; + } + } else { + const num1List = num1.toUniqued(); + const totalList = num1List.concat(num2).toUniqued(); + if (totalList.length < num1List.length + num2.length) { + bool = true; } } - else{ - const num1List=num1.toUniqued(); - const totalList=num1List.concat(num2).toUniqued(); - if(totalList.length{ - const cards=Array.isArray(list[1])?list[1]:[list[1]]; - return list[0]===player&&storage.some(s=>cards.includes(s[2])); + subSkill: { + change: { + trigger: { global: "compare" }, + filter(event, player) { + const storage = player.getStorage("twniju_change"); + if (!storage.length) return false; + if ((player !== event.player || event.iwhile) && player !== event.target) + return false; + return event.lose_list.some((list) => { + const cards = Array.isArray(list[1]) ? list[1] : [list[1]]; + return list[0] === player && storage.some((s) => cards.includes(s[2])); }); }, - charlotte:true, - forced:true, - silent:true, - async content(event,trigger,player){ - const [fn,num]=player.getStorage('twniju_change').find(s=>{ - return trigger.lose_list.some(list=>{ - const cards=Array.isArray(list[1])?list[1]:[list[1]]; - return list[0]===player&&cards.includes(s[2]); + charlotte: true, + forced: true, + silent: true, + async content(event, trigger, player) { + const [fn, num] = player.getStorage("twniju_change").find((s) => { + return trigger.lose_list.some((list) => { + const cards = Array.isArray(list[1]) ? list[1] : [list[1]]; + return list[0] === player && cards.includes(s[2]); }); }); - const numId=player===trigger.player?'num1':'num2'; - trigger[fn](numId,num); - if(trigger[numId]>13) trigger[numId]=13; - else if(trigger[numId]<1) trigger[numId]=1; - game.log(player,'的拼点牌点数',fn==='addNumber'?'+':'-',num); - } + const numId = player === trigger.player ? "num1" : "num2"; + trigger[fn](numId, num); + if (trigger[numId] > 13) trigger[numId] = 13; + else if (trigger[numId] < 1) trigger[numId] = 1; + game.log(player, "的拼点牌点数", fn === "addNumber" ? "+" : "-", num); + }, }, }, }, @@ -2750,68 +3645,90 @@ game.import('character', function () { }, mod: { playerEnabled: function (card, player, target) { - if (!player.hasZhuSkill('twchongwang')) return; - if (get.tag(card, 'damage') > 0 && player.storage.twchongwangx.includes(target)) return false; + if (!player.hasZhuSkill("twchongwang")) return; + if (get.tag(card, "damage") > 0 && player.storage.twchongwangx.includes(target)) + return false; }, targetEnabled: function (card, player, target) { - if (!target.hasZhuSkill('twchongwang')) return; - if (get.tag(card, 'damage') > 0 && target.storage.twchongwangx.includes(player)) return false; + if (!target.hasZhuSkill("twchongwang")) return; + if (get.tag(card, "damage") > 0 && target.storage.twchongwangx.includes(player)) + return false; }, }, - locked:false, + locked: false, unique: true, onremove: true, - global: 'twchongwang_global', - group: 'twchongwang_clear', + global: "twchongwang_global", + group: "twchongwang_clear", audio: 2, zhuSkill: true, subSkill: { clear: { charlotte: true, - trigger: { player: 'phaseAfter' }, + trigger: { player: "phaseAfter" }, direct: true, content: function () { player.storage.twchongwangx = []; }, }, global: { - trigger: { player: 'phaseUseBegin' }, + trigger: { player: "phaseUseBegin" }, filter: function (event, player) { - return player.group == 'qun' && game.hasPlayer(function (current) { - return current != player && current.hasZhuSkill('twchongwang', player) && !current.storage.twchongwang.includes(player); - }); + return ( + player.group == "qun" && + game.hasPlayer(function (current) { + return ( + current != player && + current.hasZhuSkill("twchongwang", player) && + !current.storage.twchongwang.includes(player) + ); + }) + ); }, direct: true, content: function () { - 'step 0' + "step 0"; player.chooseCardTarget({ - prompt: '崇望:是否将一张牌交给主公并获得双重庇护?', + prompt: "崇望:是否将一张牌交给主公并获得双重庇护?", selectCard: 1, filterCard: true, filterTarget: function (card, player, target) { - return target != player && target.hasZhuSkill('twchongwang', player) && !target.storage.twchongwang.includes(player); + return ( + target != player && + target.hasZhuSkill("twchongwang", player) && + !target.storage.twchongwang.includes(player) + ); }, - position: 'he', + position: "he", ai1: function (card) { - if (card.name == 'du') return 10; - else if (ui.selected.cards.length && ui.selected.cards[0].name == 'du') return 0; + if (card.name == "du") return 10; + else if (ui.selected.cards.length && ui.selected.cards[0].name == "du") + return 0; var player = _status.event.player; - if (ui.selected.cards.length > 4 || !game.hasPlayer(function (current) { - return get.attitude(player, current) > 0 && !current.hasSkillTag('nogain'); - })) return 0; + if ( + ui.selected.cards.length > 4 || + !game.hasPlayer(function (current) { + return ( + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + return 0; return 1 / Math.max(0.1, get.value(card)); }, ai2: function (target) { - var player = _status.event.player, att = get.attitude(player, target); - if (ui.selected.cards[0].name == 'du') return -att; - if (target.hasSkillTag('nogain')) att /= 6; + var player = _status.event.player, + att = get.attitude(player, target); + if (ui.selected.cards[0].name == "du") return -att; + if (target.hasSkillTag("nogain")) att /= 6; return att; }, }); - 'step 1' + ("step 1"); if (result.bool) { - player.logSkill('twchongwang', result.targets[0]); - result.targets[0].gain(result.cards, player, 'giveAuto'); + player.logSkill("twchongwang", result.targets[0]); + result.targets[0].gain(result.cards, player, "giveAuto"); result.targets[0].storage.twchongwang.push(player); result.targets[0].storage.twchongwangx.push(player); } @@ -2820,3345 +3737,4021 @@ game.import('character', function () { }, }, //公孙范 - twhuiyuan:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - var type=get.type2(event.card); - return !player.hasHistory('gain',evtx=>{ - if(evtx.getParent('phaseUse')!=evt) return false; - return evtx.cards.some(card=>get.type2(card)==type); + twhuiyuan: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var type = get.type2(event.card); + return !player.hasHistory("gain", (evtx) => { + if (evtx.getParent("phaseUse") != evt) return false; + return evtx.cards.some((card) => get.type2(card) == type); }); }, - direct:true, - content:function(){ - 'step 0' - var prompt2='展示一名角色的一张手牌。若展示牌为'+get.translation(get.type2(trigger.card))+'牌,则你获得之,否则其弃置之并摸一张牌。然后若其在你的攻击范围内,且你不在其攻击范围内,你对其造成1点伤害'; - player.chooseTarget(get.prompt('twhuiyuan'),prompt2,(card,player,target)=>{ - return target.countCards('h'); - }).set('ai',target=>{ - var player=_status.event.player; - var att=get.attitude(player,target); - return -att+(player.inRange(target)&&!target.inRange(player)?get.damageEffect(target,player,player)/3:0); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twhuiyuan',target); - player.choosePlayerCard(target,'h',true,'回援:展示'+get.translation(target)+'一张手牌'); - } - else event.finish(); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - target.showCards([card],get.translation(target)+'【回援】展示'); - if(get.type2(card)==get.type2(trigger.card)){ - if(lib.filter.canBeGained(card,target,player)){ - player.gain(card,target,'giveAuto','bySelf'); + direct: true, + content: function () { + "step 0"; + var prompt2 = + "展示一名角色的一张手牌。若展示牌为" + + get.translation(get.type2(trigger.card)) + + "牌,则你获得之,否则其弃置之并摸一张牌。然后若其在你的攻击范围内,且你不在其攻击范围内,你对其造成1点伤害"; + player + .chooseTarget(get.prompt("twhuiyuan"), prompt2, (card, player, target) => { + return target.countCards("h"); + }) + .set("ai", (target) => { + var player = _status.event.player; + var att = get.attitude(player, target); + return ( + -att + + (player.inRange(target) && !target.inRange(player) + ? get.damageEffect(target, player, player) / 3 + : 0) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twhuiyuan", target); + player.choosePlayerCard( + target, + "h", + true, + "回援:展示" + get.translation(target) + "一张手牌" + ); + } else event.finish(); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + target.showCards([card], get.translation(target) + "【回援】展示"); + if (get.type2(card) == get.type2(trigger.card)) { + if (lib.filter.canBeGained(card, target, player)) { + player.gain(card, target, "giveAuto", "bySelf"); } - } - else{ - if(lib.filter.canBeDiscarded(card,target,player)){ - target.discard(card,'notBySelf'); + } else { + if (lib.filter.canBeDiscarded(card, target, player)) { + target.discard(card, "notBySelf"); target.draw(); } } - } - else event.finish(); - 'step 3' - if(player.inRange(target)&&!target.inRange(player)){ - game.log(player,'触发了','#y搏击','效果'); + } else event.finish(); + ("step 3"); + if (player.inRange(target) && !target.inRange(player)) { + game.log(player, "触发了", "#y搏击", "效果"); player.line(target); target.damage(); } }, - ai:{ - expose:0.2, - threaten:3, - } + ai: { + expose: 0.2, + threaten: 3, + }, }, - twshoushou:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + twshoushou: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - var cards=event.getg(player); - if(!cards.length) return false; - return game.hasPlayer(current=>{ - return event.getl(current).cards2.length; - })&&game.hasPlayer(current=>{ - return current.inRange(player); - }); + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length) return false; + return ( + game.hasPlayer((current) => { + return event.getl(current).cards2.length; + }) && + game.hasPlayer((current) => { + return current.inRange(player); + }) + ); }, - forced:true, - locked:false, - group:'twshoushou_damage', - onremove:function(player){ - if(player.countMark('twshoushou_plus')-player.countMark('twshoushou_minus')==0){ - player.removeSkill('twshoushou_distance'); + forced: true, + locked: false, + group: "twshoushou_damage", + onremove: function (player) { + if (player.countMark("twshoushou_plus") - player.countMark("twshoushou_minus") == 0) { + player.removeSkill("twshoushou_distance"); } }, - content:function(){ - player.addSkill('twshoushou_distance'); - player.addMark('twshoushou_plus',1,false); + content: function () { + player.addSkill("twshoushou_distance"); + player.addMark("twshoushou_plus", 1, false); }, - ai:{ - halfneg:true, + ai: { + halfneg: true, }, - subSkill:{ - damage:{ - trigger:{ - player:'damageEnd', - source:'damageSource' + subSkill: { + damage: { + trigger: { + player: "damageEnd", + source: "damageSource", }, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current!=player&&!current.inRange(player); + filter: function (event, player) { + return game.hasPlayer((current) => { + return current != player && !current.inRange(player); }); }, - forced:true, - locked:false, - content:function(){ - player.addSkill('twshoushou_distance'); - player.addMark('twshoushou_minus',1,false); - } - }, - distance:{ - mark:true, - marktext:'绶', - intro:{ - markcount:function(storage,player){ - return player.countMark('twshoushou_plus')-player.countMark('twshoushou_minus'); - }, - content:function(storage,player){ - var dis=player.countMark('twshoushou_plus')-player.countMark('twshoushou_minus'); - return '其他角色至你的距离'+(dis>=0?'+':'')+dis; - } + forced: true, + locked: false, + content: function () { + player.addSkill("twshoushou_distance"); + player.addMark("twshoushou_minus", 1, false); }, - mod:{ - globalTo:function(from,to,distance){ - return distance+to.countMark('twshoushou_plus')-to.countMark('twshoushou_minus'); - } - } - } - } + }, + distance: { + mark: true, + marktext: "绶", + intro: { + markcount: function (storage, player) { + return ( + player.countMark("twshoushou_plus") - player.countMark("twshoushou_minus") + ); + }, + content: function (storage, player) { + var dis = + player.countMark("twshoushou_plus") - + player.countMark("twshoushou_minus"); + return "其他角色至你的距离" + (dis >= 0 ? "+" : "") + dis; + }, + }, + mod: { + globalTo: function (from, to, distance) { + return ( + distance + + to.countMark("twshoushou_plus") - + to.countMark("twshoushou_minus") + ); + }, + }, + }, + }, }, //严纲 - twzhiqu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - var count=get.cnNumber(game.countPlayer(current=>{ - return get.distance(player,current)<=1; - })); - player.chooseTarget(get.prompt('twzhiqu'),'选择一名其他角色并视为使用牌堆顶'+count+'张牌中的【杀】。若你与其均在对方的攻击范围内,你改为依次对其使用牌堆顶'+count+'张牌中的【杀】或锦囊牌。',lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player)*(get.distance(player,target)==1?2:1); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twzhiqu',target); - event.fight=player.inRange(target)&&target.inRange(player); - if(event.fight) game.log(player,'触发了','#y搏击','效果'); - event.cards=game.cardsGotoOrdering(get.cards(game.countPlayer(current=>{ - return get.distance(player,current)<=1; - }))).cards.slice(); - } - else event.finish(); - 'step 2' - if(player.isIn()&&target.isIn()&&cards.length){ - do var card=cards.shift(); - while(get.name(card)!='sha'&&(!event.fight||get.type2(card)!='trick')&&cards.length); - if(get.name(card)!='sha'&&(!event.fight||get.type2(card)!='trick')) return; - player.showCards([card],get.translation(player)+'发动了【直取】'); - player.chooseUseTarget(card,true,false,'nodistance').set('filterTarget',function(card,player,target){ - var evt=_status.event; - if(_status.event.name=='chooseTarget') evt=evt.getParent(); - if(target!=player&&target!=evt.twzhiqu_target) return false; - return lib.filter.targetEnabledx(card,player,target); - }).set('twzhiqu_target',target); + twzhiqu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + var count = get.cnNumber( + game.countPlayer((current) => { + return get.distance(player, current) <= 1; + }) + ); + player + .chooseTarget( + get.prompt("twzhiqu"), + "选择一名其他角色并视为使用牌堆顶" + + count + + "张牌中的【杀】。若你与其均在对方的攻击范围内,你改为依次对其使用牌堆顶" + + count + + "张牌中的【杀】或锦囊牌。", + lib.filter.notMe + ) + .set("ai", (target) => { + var player = _status.event.player; + return ( + get.effect(target, { name: "sha" }, player, player) * + (get.distance(player, target) == 1 ? 2 : 1) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twzhiqu", target); + event.fight = player.inRange(target) && target.inRange(player); + if (event.fight) game.log(player, "触发了", "#y搏击", "效果"); + event.cards = game + .cardsGotoOrdering( + get.cards( + game.countPlayer((current) => { + return get.distance(player, current) <= 1; + }) + ) + ) + .cards.slice(); + } else event.finish(); + ("step 2"); + if (player.isIn() && target.isIn() && cards.length) { + do var card = cards.shift(); + while ( + get.name(card) != "sha" && + (!event.fight || get.type2(card) != "trick") && + cards.length + ); + if (get.name(card) != "sha" && (!event.fight || get.type2(card) != "trick")) return; + player.showCards([card], get.translation(player) + "发动了【直取】"); + player + .chooseUseTarget(card, true, false, "nodistance") + .set("filterTarget", function (card, player, target) { + var evt = _status.event; + if (_status.event.name == "chooseTarget") evt = evt.getParent(); + if (target != player && target != evt.twzhiqu_target) return false; + return lib.filter.targetEnabledx(card, player, target); + }) + .set("twzhiqu_target", target); event.redo(); } - } - }, - twxianfeng:{ - audio:2, - trigger:{source:'damageSource'}, - filter:function(event,player){ - if(!player.isPhaseUsing()) return false; - if(player==event.player) return false; - if(!event.player.isIn()) return false; - if(!event.card) return false; - return event.card.name=='sha'||get.type(event.card)=='trick'&&get.tag(event.card,'damage'); }, - logTarget:'player', - check:function(event,player){ - let att=get.attitude(player,event.player); - if(att>0) return true; - if(!player.hasSkill('twzhiqu')) return false; - let cnt=game.countPlayer(current=>get.distance(player,current)===2); - if(cnt>2||cnt===2&&Math.abs(att)<2||cnt&&Math.abs(att)<1) return true; + }, + twxianfeng: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + if (player == event.player) return false; + if (!event.player.isIn()) return false; + if (!event.card) return false; + return ( + event.card.name == "sha" || + (get.type(event.card) == "trick" && get.tag(event.card, "damage")) + ); + }, + logTarget: "player", + check: function (event, player) { + let att = get.attitude(player, event.player); + if (att > 0) return true; + if (!player.hasSkill("twzhiqu")) return false; + let cnt = game.countPlayer((current) => get.distance(player, current) === 2); + if (cnt > 2 || (cnt === 2 && Math.abs(att) < 2) || (cnt && Math.abs(att) < 1)) + return true; return false; }, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - target.chooseControl().set('choiceList',[ - '你摸一张牌,然后直到'+get.translation(player)+'下个回合开始时,其至其他角色的距离-1', - get.translation(player)+'摸一张牌,然后直到其下个回合开始时,你至其的距离-1', - ]).set('prompt','先锋:请选择一项').set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - var att=get.attitude(target,player); - if(att===0) return 0; - if(player.hasSkill('twzhiqu')){ - var cnt=game.countPlayer(current=>get.distance(player,current)===2); - if(att>0){ - if(cnt||player.needsToDiscard(1)) return 0; - return 1; - } - if(!cnt) return 0; - if(cnt>=2||get.distance(target,player,'attack')===2||get.distance(target,player)===2) return 1; - return 0; - } - if(att<0||player.needsToDiscard(1)&&game.hasPlayer(function(current){ - return current!==player&¤t!==target&&!player.inRange(current); - })) return 0; - return [0,1].randomGet(); - }()); - 'step 1' - if(result.index==0){ + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target + .chooseControl() + .set("choiceList", [ + "你摸一张牌,然后直到" + + get.translation(player) + + "下个回合开始时,其至其他角色的距离-1", + get.translation(player) + "摸一张牌,然后直到其下个回合开始时,你至其的距离-1", + ]) + .set("prompt", "先锋:请选择一项") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var att = get.attitude(target, player); + if (att === 0) return 0; + if (player.hasSkill("twzhiqu")) { + var cnt = game.countPlayer( + (current) => get.distance(player, current) === 2 + ); + if (att > 0) { + if (cnt || player.needsToDiscard(1)) return 0; + return 1; + } + if (!cnt) return 0; + if ( + cnt >= 2 || + get.distance(target, player, "attack") === 2 || + get.distance(target, player) === 2 + ) + return 1; + return 0; + } + if ( + att < 0 || + (player.needsToDiscard(1) && + game.hasPlayer(function (current) { + return ( + current !== player && + current !== target && + !player.inRange(current) + ); + })) + ) + return 0; + return [0, 1].randomGet(); + })() + ); + ("step 1"); + if (result.index == 0) { target.draw(); - player.addTempSkill('twxianfeng_me',{player:'phaseBegin'}); - player.addMark('twxianfeng_me',1,false); - } - else{ + player.addTempSkill("twxianfeng_me", { player: "phaseBegin" }); + player.addMark("twxianfeng_me", 1, false); + } else { player.draw(); - target.addSkill('twxianfeng_others'); - if(!target.storage.twxianfeng_others) target.storage.twxianfeng_others={}; - if(typeof target.storage.twxianfeng_others[player.playerid]!='number') target.storage.twxianfeng_others[player.playerid]=0; + target.addSkill("twxianfeng_others"); + if (!target.storage.twxianfeng_others) target.storage.twxianfeng_others = {}; + if (typeof target.storage.twxianfeng_others[player.playerid] != "number") + target.storage.twxianfeng_others[player.playerid] = 0; target.storage.twxianfeng_others[player.playerid]++; } }, - subSkill:{ - me:{ - charlotte:true, - mark:true, - intro:{content:'至其他角色的距离-#'}, - mod:{ - globalFrom:function(from,to,distance){ - return distance-from.countMark('twxianfeng_me'); - } - } - }, - others:{ - trigger:{global:['phaseBegin','die']}, - filter:function(event,player){ - return player.storage.twxianfeng_others&&player.storage.twxianfeng_others[event.player.playerid]; + subSkill: { + me: { + charlotte: true, + mark: true, + intro: { content: "至其他角色的距离-#" }, + mod: { + globalFrom: function (from, to, distance) { + return distance - from.countMark("twxianfeng_me"); + }, }, - charlotte:true, - mark:true, - forced:true, - intro:{ - markcount:function(storage,player){ - var max=0; - for(var id in storage){ - if(storage[id]>max) max=storage[id]; + }, + others: { + trigger: { global: ["phaseBegin", "die"] }, + filter: function (event, player) { + return ( + player.storage.twxianfeng_others && + player.storage.twxianfeng_others[event.player.playerid] + ); + }, + charlotte: true, + mark: true, + forced: true, + intro: { + markcount: function (storage, player) { + var max = 0; + for (var id in storage) { + if (storage[id] > max) max = storage[id]; } return max; }, - content:function(storage,player){ - if(!storage) return ''; - var str=''; - var map=(_status.connectMode?lib.playerOL:game.playerMap); - for(var id in storage){ - str+='至'+get.translation(map[id])+'的距离-'+storage[id]+'、'; + content: function (storage, player) { + if (!storage) return ""; + var str = ""; + var map = _status.connectMode ? lib.playerOL : game.playerMap; + for (var id in storage) { + str += "至" + get.translation(map[id]) + "的距离-" + storage[id] + "、"; } - return str.slice(0,-1); + return str.slice(0, -1); }, }, - content:function(){ + content: function () { delete player.storage.twxianfeng_others[trigger.player.playerid]; - if(get.is.empty(player.storage.twxianfeng_others)) player.removeSkill('twxianfeng_others'); + if (get.is.empty(player.storage.twxianfeng_others)) + player.removeSkill("twxianfeng_others"); + }, + mod: { + globalFrom: function (from, to, distance) { + if ( + from.storage.twxianfeng_others && + typeof from.storage.twxianfeng_others[to.playerid] == "number" + ) + return distance - from.storage.twxianfeng_others[to.playerid]; + }, }, - mod:{ - globalFrom:function(from,to,distance){ - if(from.storage.twxianfeng_others&&typeof from.storage.twxianfeng_others[to.playerid]=='number') return distance-from.storage.twxianfeng_others[to.playerid]; - } - } }, - } + }, }, //夏侯紫萼 - twxuechang:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + twxuechang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - if(!target.countGainableCards(player,'he')) event.finish(); - else player.gainPlayerCard(target,'he',true); - } - else{ + ("step 1"); + if (result.bool) { + if (!target.countGainableCards(player, "he")) event.finish(); + else player.gainPlayerCard(target, "he", true); + } else { player.damage(target); - player.addSkill('twxuechang_add'); - if(!player.storage.twxuechang_add) player.storage.twxuechang_add={}; - if(!player.storage.twxuechang_add[target.playerid]) player.storage.twxuechang_add[target.playerid]=0; + player.addSkill("twxuechang_add"); + if (!player.storage.twxuechang_add) player.storage.twxuechang_add = {}; + if (!player.storage.twxuechang_add[target.playerid]) + player.storage.twxuechang_add[target.playerid] = 0; player.storage.twxuechang_add[target.playerid]++; - player.markSkill('twxuechang_add'); + player.markSkill("twxuechang_add"); event.finish(); } - 'step 2' - var card=result.cards[0]; - if(get.type(card)=='equip'){ - var card={name:'sha',isCard:true}; - if(player.canUse(card,target,false)) player.useCard(card,target,'noai',false); + ("step 2"); + var card = result.cards[0]; + if (get.type(card) == "equip") { + var card = { name: "sha", isCard: true }; + if (player.canUse(card, target, false)) player.useCard(card, target, "noai", false); } }, - ai:{ - order:6.5, - result:{ - target:function(player,target){ - var hs=player.getCards('h').sort(function(a,b){ - return get.number(b)-get.number(a); + ai: { + order: 6.5, + result: { + target: function (player, target) { + var hs = player.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); }); - var ts=target.getCards('h').sort(function(a,b){ - return get.number(b)-get.number(a); + var ts = target.getCards("h").sort(function (a, b) { + return get.number(b) - get.number(a); }); - if(!hs.length||!ts.length) return 0; - if(get.number(hs[0])>get.number(ts[0])||get.number(hs[0])-ts.length>=(9+Math.min(2,player.hp/2))) return get.sgnAttitude(player,target)*get.effect(target,{name:'shunshou_copy2'},player,player); + if (!hs.length || !ts.length) return 0; + if ( + get.number(hs[0]) > get.number(ts[0]) || + get.number(hs[0]) - ts.length >= 9 + Math.min(2, player.hp / 2) + ) + return ( + get.sgnAttitude(player, target) * + get.effect(target, { name: "shunshou_copy2" }, player, player) + ); return 0; - } - } + }, + }, }, - subSkill:{ - add:{ - audio:'twxuechang', - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return player.storage.twxuechang_add&&player.storage.twxuechang_add[event.player.playerid]; + subSkill: { + add: { + audio: "twxuechang", + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return ( + player.storage.twxuechang_add && + player.storage.twxuechang_add[event.player.playerid] + ); }, - forced:true, - charlotte:true, - content:function(){ - trigger.num+=player.storage.twxuechang_add[trigger.player.playerid]; + forced: true, + charlotte: true, + content: function () { + trigger.num += player.storage.twxuechang_add[trigger.player.playerid]; delete player.storage.twxuechang_add[trigger.player.playerid]; - if(get.is.empty(player.storage.twxuechang_add)) player.removeSkill('twxuechang_add'); - else player.markSkill('twxuechang_add'); + if (get.is.empty(player.storage.twxuechang_add)) + player.removeSkill("twxuechang_add"); + else player.markSkill("twxuechang_add"); }, - marktext:'偿', - intro:{ - content:function(storage,player){ - if(!storage) return ''; - var str=''; - var map=(_status.connectMode?lib.playerOL:game.playerMap); - for(var i in storage){ - str+='
  • 下次对'+get.translation(map[i])+'造成的伤害+'+storage[i]; + marktext: "偿", + intro: { + content: function (storage, player) { + if (!storage) return ""; + var str = ""; + var map = _status.connectMode ? lib.playerOL : game.playerMap; + for (var i in storage) { + str += + "
  • 下次对" + get.translation(map[i]) + "造成的伤害+" + storage[i]; } return str; - } - } - } - } + }, + }, + }, + }, }, - twduoren:{ - audio:2, - trigger:{source:'dieAfter'}, - check:function(event,player){ - if(player.hp<3&&!player.isDamaged()) return false; - var skills=event.player.getSkills(null,false,false).filter(skill=>{ - if(player.hasSkill(skill,null,false,false)) return false; - var info=get.info(skill); - return info&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte; + twduoren: { + audio: 2, + trigger: { source: "dieAfter" }, + check: function (event, player) { + if (player.hp < 3 && !player.isDamaged()) return false; + var skills = event.player.getSkills(null, false, false).filter((skill) => { + if (player.hasSkill(skill, null, false, false)) return false; + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; }); - return skills.length>0; + return skills.length > 0; }, - group:'twduoren_remove', - prompt2:function(event,player){ - var skills=event.player.getSkills(null,false,false).filter(skill=>{ - if(player.hasSkill(skill,null,false,false)) return false; - var info=get.info(skill); - return info&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte; + group: "twduoren_remove", + prompt2: function (event, player) { + var skills = event.player.getSkills(null, false, false).filter((skill) => { + if (player.hasSkill(skill, null, false, false)) return false; + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; }); - var str=''; - for(var i of skills){ - str+='〖'+get.translation(i)+'〗、'; + var str = ""; + for (var i of skills) { + str += "〖" + get.translation(i) + "〗、"; } - str=str.slice(0,str.length-1); - return '减1点体力上限,然后'+(str.length?'获得'+str:'听一句技能配音'); + str = str.slice(0, str.length - 1); + return "减1点体力上限,然后" + (str.length ? "获得" + str : "听一句技能配音"); }, - logTarget:'player', - content:function(){ - 'step 0' + logTarget: "player", + content: function () { + "step 0"; player.loseMaxHp(); - 'step 1' - var skills=trigger.player.getSkills(null,false,false).filter(skill=>{ - if(player.hasSkill(skill,null,false,false)) return false; - var info=get.info(skill); - return info&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte; + ("step 1"); + var skills = trigger.player.getSkills(null, false, false).filter((skill) => { + if (player.hasSkill(skill, null, false, false)) return false; + var info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; }); - if(skills.length){ + if (skills.length) { //for(var i of skills) player.addSkillLog(i); player.addSkills(skills); - player.markAuto('twduoren',skills); - game.broadcastAll(function(list){ + player.markAuto("twduoren", skills); + game.broadcastAll(function (list) { game.expandSkills(list); - for(var i of list){ - var info=lib.skill[i]; - if(!info) continue; - if(!info.audioname2) info.audioname2={}; - info.audioname2.xia_xiahouzie='twduoren'; + for (var i of list) { + var info = lib.skill[i]; + if (!info) continue; + if (!info.audioname2) info.audioname2 = {}; + info.audioname2.xia_xiahouzie = "twduoren"; } - },skills); + }, skills); } }, - subSkill:{ - remove:{ - trigger:{source:'dying'}, - filter:function(event,player){ - return event.player!=player&&player.getStorage('twduoren').some(skill=>{ - return player.hasSkill(skill,null,false,false); - }); + subSkill: { + remove: { + trigger: { source: "dying" }, + filter: function (event, player) { + return ( + event.player != player && + player.getStorage("twduoren").some((skill) => { + return player.hasSkill(skill, null, false, false); + }) + ); }, - forced:true, - locked:false, - content:function(){ - player.removeSkills(player.getStorage('twduoren')); + forced: true, + locked: false, + content: function () { + player.removeSkills(player.getStorage("twduoren")); delete player.storage.twduoren; - } - } - } + }, + }, + }, }, //赵娥 - twyanshi:{ - audio:2, - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - locked:false, - direct:true, - onremove:true, - intro:{ - content:'players' + twyanshi: { + audio: 2, + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + direct: true, + onremove: true, + intro: { + content: "players", }, - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); }, - group:['twyanshi_hurt','twyanshi_damage'], - content:function(){ - 'step 0' - player.chooseTarget('言誓:选择一名其他角色',lib.filter.notMe,true).set('ai',target=>get.attitude(_status.event.player,target)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twyanshi',target); - player.markAuto('twyanshi',[target]); + group: ["twyanshi_hurt", "twyanshi_damage"], + content: function () { + "step 0"; + player + .chooseTarget("言誓:选择一名其他角色", lib.filter.notMe, true) + .set("ai", (target) => get.attitude(_status.event.player, target)); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twyanshi", target); + player.markAuto("twyanshi", [target]); } }, - mod:{ - targetInRange:function(card,player,target){ - if(target.hasMark('twyanshi_mark')) return true; + mod: { + targetInRange: function (card, player, target) { + if (target.hasMark("twyanshi_mark")) return true; }, }, - subSkill:{ - hurt:{ - audio:'twyanshi', - trigger:{ - global:'damageEnd', + subSkill: { + hurt: { + audio: "twyanshi", + trigger: { + global: "damageEnd", }, - forced:true, - locked:false, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - return player==event.player&&!player.getStorage('twyanshi').includes(event.source)||player!=event.source&&player.getStorage('twyanshi').includes(event.player); + forced: true, + locked: false, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return ( + (player == event.player && + !player.getStorage("twyanshi").includes(event.source)) || + (player != event.source && + player.getStorage("twyanshi").includes(event.player)) + ); + }, + content: function () { + trigger.source.addMark("twyanshi_mark", 1); }, - content:function(){ - trigger.source.addMark('twyanshi_mark',1); - } }, - damage:{ - audio:'twyanshi', - trigger:{ - source:['damageBegin1','damageSource'], + damage: { + audio: "twyanshi", + trigger: { + source: ["damageBegin1", "damageSource"], }, - forced:true, - locked:false, - filter:function(event,player){ - return event.player.hasMark('twyanshi_mark'); + forced: true, + locked: false, + filter: function (event, player) { + return event.player.hasMark("twyanshi_mark"); }, - content:function(){ - 'step 0' - if(event.triggername=='damageBegin1'){ + content: function () { + "step 0"; + if (event.triggername == "damageBegin1") { trigger.num++; - } - else{ + } else { player.draw(trigger.num); - trigger.player.removeMark('twyanshi_mark',trigger.player.countMark('twyanshi_mark')); + trigger.player.removeMark( + "twyanshi_mark", + trigger.player.countMark("twyanshi_mark") + ); } - } - }, - mark:{ - marktext:'誓', - intro:{ - name:'誓', - name2:'誓', - content:'mark' }, - } - } + }, + mark: { + marktext: "誓", + intro: { + name: "誓", + name2: "誓", + content: "mark", + }, + }, + }, }, - twrenchou:{ - audio:2, - trigger:{global:'die'}, - forced:true, - forceDie:true, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - if(event.player==player){ - return player.getStorage('twyanshi').some(i=>i.isIn()&&i.hp>0); + twrenchou: { + audio: 2, + trigger: { global: "die" }, + forced: true, + forceDie: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + if (event.player == player) { + return player.getStorage("twyanshi").some((i) => i.isIn() && i.hp > 0); } - if(player.getStorage('twyanshi').includes(event.player)){ - return player.isIn()&&player.hp>0; + if (player.getStorage("twyanshi").includes(event.player)) { + return player.isIn() && player.hp > 0; } return false; }, - logTarget:'source', - line:false, - skillAnimation:true, - animationColor:'water', - global:'twrenchou_ai', - content:function(){ - 'step 0' - var avengers=[]; - if(trigger.player==player){ - avengers=player.getStorage('twyanshi').filter(i=>i.isIn()&&i.hp>0); + logTarget: "source", + line: false, + skillAnimation: true, + animationColor: "water", + global: "twrenchou_ai", + content: function () { + "step 0"; + var avengers = []; + if (trigger.player == player) { + avengers = player.getStorage("twyanshi").filter((i) => i.isIn() && i.hp > 0); } - if(player.getStorage('twyanshi').includes(trigger.player)){ - avengers=[player]; + if (player.getStorage("twyanshi").includes(trigger.player)) { + avengers = [player]; } - event.avengers=avengers; - 'step 1' - var avenger=event.avengers.shift(); - avenger.line(trigger.source,'fire'); - trigger.source.damage(avenger,avenger.hp); - 'step 2' - if(event.avengers.length&&trigger.source.isIn()) event.goto(1); + event.avengers = avengers; + ("step 1"); + var avenger = event.avengers.shift(); + avenger.line(trigger.source, "fire"); + trigger.source.damage(avenger, avenger.hp); + ("step 2"); + if (event.avengers.length && trigger.source.isIn()) event.goto(1); }, - ai:{ - combo:'twyanshi', + ai: { + combo: "twyanshi", }, - subSkill:{ - ai:{ - ai:{ - effect:{ - target:function(card,player,target){ - if(!get.tag(card,'damage')) return; - if(target.hp>1) return; - var num=0; - game.filterPlayer(current=>{ - if(current.getStorage('twyanshi').some(i=>target==i)){ - num+=current.hp; + subSkill: { + ai: { + ai: { + effect: { + target: function (card, player, target) { + if (!get.tag(card, "damage")) return; + if (target.hp > 1) return; + var num = 0; + game.filterPlayer((current) => { + if (current.getStorage("twyanshi").some((i) => target == i)) { + num += current.hp; } }); - var targets=target.getStorage('twyanshi').filter(i=>i.isIn()); - for(var targetx of targets){ - num+=targetx.hp; + var targets = target.getStorage("twyanshi").filter((i) => i.isIn()); + for (var targetx of targets) { + num += targetx.hp; } - if(num>=player.hp) return 0; - if(num>0) return [1,0,0,0.5-1.5*num]; - } - } - } - } - } + if (num >= player.hp) return 0; + if (num > 0) return [1, 0, 0, 0.5 - 1.5 * num]; + }, + }, + }, + }, + }, }, //侠典韦 - twliexi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.countCards('he'); + twliexi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.countCards("he"); }, - direct:true, - content:function(){ - 'step 0' - var list=[[],[]]; - for(var current of game.players){ - if(current==player) continue; - var cards=[]; - var weapon=false; - for(var card of player.getCards('he')){ - if(!lib.filter.cardDiscardable(card,player)) continue; - if(get.subtype(card)=='equip1'&&!ui.selected.cards.some(i=>get.subtype(i)=='equip1')){ - if(16-get.value(card)>0){ + direct: true, + content: function () { + "step 0"; + var list = [[], []]; + for (var current of game.players) { + if (current == player) continue; + var cards = []; + var weapon = false; + for (var card of player.getCards("he")) { + if (!lib.filter.cardDiscardable(card, player)) continue; + if ( + get.subtype(card) == "equip1" && + !ui.selected.cards.some((i) => get.subtype(i) == "equip1") + ) { + if (16 - get.value(card) > 0) { cards.push(card); - weapon=true; + weapon = true; } } - if(7-get.value(card)>0) cards.push(card); + if (7 - get.value(card) > 0) cards.push(card); } - if(cards.length>current.hp){ - var val=0; - for(var card of cards){ - if(get.subtype(card)!='equip1') val+=get.value(card); + if (cards.length > current.hp) { + var val = 0; + for (var card of cards) { + if (get.subtype(card) != "equip1") val += get.value(card); } - if(val<30) list[0].push(current); + if (val < 30) list[0].push(current); } - if(weapon&&player.hp>2||get.damageEffect(player,current,player)>10) list[1].push(current); + if ((weapon && player.hp > 2) || get.damageEffect(player, current, player) > 10) + list[1].push(current); } - list[0].sort((a,b)=>{ - return get.damageEffect(b,player,player)-get.damageEffect(a,player,player); + list[0].sort((a, b) => { + return get.damageEffect(b, player, player) - get.damageEffect(a, player, player); }); player.chooseCardTarget({ - filterCard:lib.filter.cardDiscardable, - selectCard:[1,Infinity], - position:'he', - filterTarget:lib.filter.notMe, - prompt:get.prompt2('twliexi'), - targetsx:[list[0][0],list[1][0]], - ai1:function(card){ - var targetx=_status.event.targetsx[0]; - var hasWeapon=ui.selected.cards.some(i=>get.subtype(i)=='equip1'); - if(!targetx){ - var targetx=_status.event.targetsx[1]; - if(get.subtype(card)=='equip1'&&!hasWeapon) return 30-get.value(card); + filterCard: lib.filter.cardDiscardable, + selectCard: [1, Infinity], + position: "he", + filterTarget: lib.filter.notMe, + prompt: get.prompt2("twliexi"), + targetsx: [list[0][0], list[1][0]], + ai1: function (card) { + var targetx = _status.event.targetsx[0]; + var hasWeapon = ui.selected.cards.some((i) => get.subtype(i) == "equip1"); + if (!targetx) { + var targetx = _status.event.targetsx[1]; + if (get.subtype(card) == "equip1" && !hasWeapon) return 30 - get.value(card); return -get.value(card); } - if(ui.selected.cards.length>targetx.hp) return 0; - if(get.subtype(card)=='equip1'&&!hasWeapon) return 30-get.value(card); - return 7-get.value(card); + if (ui.selected.cards.length > targetx.hp) return 0; + if (get.subtype(card) == "equip1" && !hasWeapon) return 30 - get.value(card); + return 7 - get.value(card); }, - ai2:function(target){ - var targetx=_status.event.targetsx[0]||_status.event.targetsx[1]; - if(targetx==target) return 10; + ai2: function (target) { + var targetx = _status.event.targetsx[0] || _status.event.targetsx[1]; + if (targetx == target) return 10; return 0; }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - var cards=result.cards; - player.logSkill('twliexi',target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var cards = result.cards; + player.logSkill("twliexi", target); player.discard(cards); - if(cards.length>target.hp) target.damage(); + if (cards.length > target.hp) target.damage(); else player.damage(target); - var goon=false; - for(var card of cards){ - if(get.subtype(card)=='equip1'){ - goon=true; + var goon = false; + for (var card of cards) { + if (get.subtype(card) == "equip1") { + goon = true; break; } } - if(!goon) event.finish(); - } - else event.finish(); - 'step 2' + if (!goon) event.finish(); + } else event.finish(); + ("step 2"); game.delayx(); target.damage(); - } + }, }, - twshezhong:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - var damage=player.getHistory('sourceDamage').length; - if(damage){ - player.chooseTarget(get.prompt('twshezhong'),'令至多'+get.cnNumber(damage)+'名其他角色下个摸牌阶段的摸牌数-1',[1,damage],lib.filter.notMe).set('ai',target=>{ - return -get.attitude(_status.event.player,target); - }); - } - else event.goto(2); - 'step 1' - if(result.bool){ - var targets=result.targets; - player.logSkill('twshezhong',targets); - for(var target of targets){ - target.addSkill('twshezhong_minus'); - target.addMark('twshezhong_minus',1,false); + twshezhong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + var damage = player.getHistory("sourceDamage").length; + if (damage) { + player + .chooseTarget( + get.prompt("twshezhong"), + "令至多" + get.cnNumber(damage) + "名其他角色下个摸牌阶段的摸牌数-1", + [1, damage], + lib.filter.notMe + ) + .set("ai", (target) => { + return -get.attitude(_status.event.player, target); + }); + } else event.goto(2); + ("step 1"); + if (result.bool) { + var targets = result.targets; + player.logSkill("twshezhong", targets); + for (var target of targets) { + target.addSkill("twshezhong_minus"); + target.addMark("twshezhong_minus", 1, false); } } - 'step 2' - var targets=[]; - for(var evt of player.getHistory('damage')){ - if(evt.source&&evt.source.isIn()) targets.add(evt.source); + ("step 2"); + var targets = []; + for (var evt of player.getHistory("damage")) { + if (evt.source && evt.source.isIn()) targets.add(evt.source); } - if(targets.length){ - player.chooseTarget(get.prompt('twshezhong'),'将手牌摸至一名与一名本回合对你造成过伤害的角色的体力值相同,且至多摸至五张',(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('ai',target=>{ - return Math.max(0.1,target.hp-_status.event.player.countCards('h')); - }).set('targets',targets); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twshezhong',target); - var num=Math.min(target.hp,5)-player.countCards('h'); - if(num>0) player.draw(num); + if (targets.length) { + player + .chooseTarget( + get.prompt("twshezhong"), + "将手牌摸至一名与一名本回合对你造成过伤害的角色的体力值相同,且至多摸至五张", + (card, player, target) => { + return _status.event.targets.includes(target); + } + ) + .set("ai", (target) => { + return Math.max(0.1, target.hp - _status.event.player.countCards("h")); + }) + .set("targets", targets); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twshezhong", target); + var num = Math.min(target.hp, 5) - player.countCards("h"); + if (num > 0) player.draw(num); } }, - subSkill:{ - minus:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - onremove:true, - content:function(){ - var num=player.countMark('twshezhong_minus'); - trigger.num-=num; - game.log(player,'的额定摸牌数','#g-'+num); - player.removeSkill('twshezhong_minus'); + subSkill: { + minus: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + onremove: true, + content: function () { + var num = player.countMark("twshezhong_minus"); + trigger.num -= num; + game.log(player, "的额定摸牌数", "#g-" + num); + player.removeSkill("twshezhong_minus"); }, - mark:true, - intro:{ - content:'额定摸牌数-#', + mark: true, + intro: { + content: "额定摸牌数-#", }, - } - } + }, + }, }, //侠鲁肃 - twkaizeng:{ - audio:2, - global:'twkaizeng_want', - refuseInfo:['不给','拒绝'], - subSkill:{ - want:{ - audio:'twkaizeng', - forceaudio:true, - enable:'phaseUse', - usable:1, - charlotte:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current!=player&¤t.hasSkill('twkaizeng'); + twkaizeng: { + audio: 2, + global: "twkaizeng_want", + refuseInfo: ["不给", "拒绝"], + subSkill: { + want: { + audio: "twkaizeng", + forceaudio: true, + enable: "phaseUse", + usable: 1, + charlotte: true, + filter: function (event, player) { + return game.hasPlayer((current) => { + return current != player && current.hasSkill("twkaizeng"); }); }, - chooseButton:{ - dialog:function(event,player){ - var targets=game.filterPlayer(current=>{ - return current!=player&¤t.hasSkill('twkaizeng'); + chooseButton: { + dialog: function (event, player) { + var targets = game.filterPlayer((current) => { + return current != player && current.hasSkill("twkaizeng"); }); - return ui.create.dialog('###慨赠###'+'选择一种基本牌的牌名或非基本牌的类型,然后令'+get.translation(targets)+(targets.length>1?'中的一人':'')+'选择是否交给你任意张牌'); + return ui.create.dialog( + "###慨赠###" + + "选择一种基本牌的牌名或非基本牌的类型,然后令" + + get.translation(targets) + + (targets.length > 1 ? "中的一人" : "") + + "选择是否交给你任意张牌" + ); }, - chooseControl:function(){ - var list=[]; - var basic=[]; - for(var i=0;icurrent!=player&¤t.hasSkill('twkaizeng')); - targets.sort((a,b)=>get.attitude(player,b)-get.attitude(player,a)); - var cards=targets[0].getCards('h'); - var list=[]; - for(var card of cards){ - var type=get.type2(card); - if(type=='basic') list.add(get.name(card)); + var targets = game.filterPlayer( + (current) => current != player && current.hasSkill("twkaizeng") + ); + targets.sort((a, b) => get.attitude(player, b) - get.attitude(player, a)); + var cards = targets[0].getCards("h"); + var list = []; + for (var card of cards) { + var type = get.type2(card); + if (type == "basic") list.add(get.name(card)); else list.add(type); } - var need=['trick','equip'].randomSort(); - need.addArray(['sha','jiu'].randomSort()); - for(var type of need){ - if(list.includes(type)) return type; + var need = ["trick", "equip"].randomSort(); + need.addArray(["sha", "jiu"].randomSort()); + for (var type of need) { + if (list.includes(type)) return type; } return list.randomGet(); }, - backup:function(result,player){ + backup: function (result, player) { return { - audio:'twkaizeng', - type:result.control, - log:false, - delay:false, - filterTarget:function(card,player,target){ - return target.hasSkill('twkaizeng'); + audio: "twkaizeng", + type: result.control, + log: false, + delay: false, + filterTarget: function (card, player, target) { + return target.hasSkill("twkaizeng"); }, - selectTarget:function(){ - var player=_status.event.player; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('twkaizeng'); + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twkaizeng"); }); - return targets.length>1?1:-1; + return targets.length > 1 ? 1 : -1; }, - prepare:function(cards,player,targets){ - targets[0].logSkill('twkaizeng_want',player); + prepare: function (cards, player, targets) { + targets[0].logSkill("twkaizeng_want", player); }, - content:function(){ - 'step 0' - var type=lib.skill.twkaizeng_want_backup.type; - var isbasic=lib.card[type]; - target.chooseCard('慨赠:是否交给'+get.translation(player)+'任意张手牌?','若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌包含其选择的牌名或类型,你获得一张不为此牌名或类型的牌',[1,Infinity]).set('ai',card=>{ - if(!_status.event.goon) return -get.value(card); - var player=_status.event.player,target=_status.event.getParent().player; - if(ui.selected.cards.length>player.countCards('h')/2&&ui.selected.cards.length>=2) return 0; - var type=_status.event.type; - var isbasic=lib.card[type]; - var add=0; - if(!ui.selected.cards.some(i=>get[isbasic?'name':'type2'](i,target)==type)) add+=3; - if(ui.selected.cards.length<2) add+=3; - return get.value(card,target)-get.value(card,player)+add; - }).set('type',type).set('goon',get.attitude(target,player)>0); - 'step 1' - if(result.bool){ - var cards=result.cards; - event.cards=cards; - target.give(cards,player); - } - else{ - var refuseInfo=lib.skill.twkaizeng.refuseInfo.slice(); - if(get.attitude(target,player)<0) refuseInfo.push('没门'); + content: function () { + "step 0"; + var type = lib.skill.twkaizeng_want_backup.type; + var isbasic = lib.card[type]; + target + .chooseCard( + "慨赠:是否交给" + get.translation(player) + "任意张手牌?", + "若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌包含其选择的牌名或类型,你获得一张不为此牌名或类型的牌", + [1, Infinity] + ) + .set("ai", (card) => { + if (!_status.event.goon) return -get.value(card); + var player = _status.event.player, + target = _status.event.getParent().player; + if ( + ui.selected.cards.length > player.countCards("h") / 2 && + ui.selected.cards.length >= 2 + ) + return 0; + var type = _status.event.type; + var isbasic = lib.card[type]; + var add = 0; + if ( + !ui.selected.cards.some( + (i) => + get[isbasic ? "name" : "type2"](i, target) == type + ) + ) + add += 3; + if (ui.selected.cards.length < 2) add += 3; + return ( + get.value(card, target) - get.value(card, player) + add + ); + }) + .set("type", type) + .set("goon", get.attitude(target, player) > 0); + ("step 1"); + if (result.bool) { + var cards = result.cards; + event.cards = cards; + target.give(cards, player); + } else { + var refuseInfo = lib.skill.twkaizeng.refuseInfo.slice(); + if (get.attitude(target, player) < 0) refuseInfo.push("没门"); target.chat(refuseInfo.randomGet()); event.finish(); } - 'step 2' - if(cards.length>1) target.draw(); - 'step 3' - var type=lib.skill.twkaizeng_want_backup.type; - var isbasic=lib.card[type]; - var fn=isbasic?'name':'type2'; - if(cards.some(card=>get[fn](card,player)==type)){ - var card=get.cardPile(cardx=>{ - return get[fn](cardx,target)!=type; + ("step 2"); + if (cards.length > 1) target.draw(); + ("step 3"); + var type = lib.skill.twkaizeng_want_backup.type; + var isbasic = lib.card[type]; + var fn = isbasic ? "name" : "type2"; + if (cards.some((card) => get[fn](card, player) == type)) { + var card = get.cardPile((cardx) => { + return get[fn](cardx, target) != type; }); - if(card) target.gain(card,'gain2'); + if (card) target.gain(card, "gain2"); } - 'step 4' + ("step 4"); game.delayx(); }, - ai:{ - result:{ - target:1, + ai: { + result: { + target: 1, }, }, - } + }; }, - prompt:()=>'请选择一名有【慨赠】的角色', + prompt: () => "请选择一名有【慨赠】的角色", }, - ai:{ - order:10, - result:{ - player:function(player){ - var targets=game.filterPlayer(current=>{ - return current!=player&¤t.hasSkill('twkaizeng'); + ai: { + order: 10, + result: { + player: function (player) { + var targets = game.filterPlayer((current) => { + return current != player && current.hasSkill("twkaizeng"); }); - for(var i of targets) if(get.attitude(player,i)>0) return 1; + for (var i of targets) if (get.attitude(player, i) > 0) return 1; return 0; - } - }, - }, - }, - want_backup:{}, - }, - ai:{ - threaten:3 - } - }, - twyangming:{ - audio:2, - trigger:{ - player:'phaseUseEnd', - }, - frequent:true, - filter:function(event,player){ - return player.hasHistory('useCard',evt=>evt.getParent('phaseUse')==event); - }, - content:function(){ - var types=[]; - var history=player.getHistory('useCard',evt=>evt.getParent('phaseUse')==trigger); - for(var evt of history){ - types.add(get.type2(evt.card)); - } - var num=types.length; - player.draw(num); - player.addTempSkill('twyangming_limit'); - player.addMark('twyangming_limit',num,false); - game.log(player,'本回合的手牌上限','#g+'+num); - }, - subSkill:{ - limit:{ - charlotte:true, - onremove:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('twyangming_limit'); - } - } - } - } - }, - //邴原 - twbingde:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')&&player.getStorage('twbingde_clear').length<4; - }, - onChooseToUse:function(event){ - if(event.type=='phase'&&!game.online){ - var map={}; - event.player.getHistory('useCard',evt=>{ - var evtx=evt.getParent('phaseUse'),suit=get.suit(evt.card); - if(!lib.suit.includes(suit)) return; - if(evtx!=event.getParent('phaseUse')) return; - if(typeof map[suit]!='number') map[suit]=0; - map[suit]++; - }); - event.set('twbingde_map',map); - } - }, - chooseButton:{ - dialog:function(event,player){ - var str=get.translation('twbingde_info'),str2=''; - if(event.twbingde_map){ - str2='
    本回合使用牌对应花色数:
    '; - str2+='
    '; - for(var suit of lib.suit){ - str2+=get.translation(suit)+':'+get.cnNumber(event.twbingde_map[suit]||0)+'张;'; - } - str2=str2.slice(0,str2.length-1)+'
    '; - } - return ui.create.dialog('###秉德###'+str,str2); - }, - chooseControl:function(event,player){ - var list=lib.suit.slice(); - list.removeArray(player.getStorage('twbingde_clear')); - list.push('cancel2'); - return list; - }, - check:function(event,player){ - var map=event.twbingde_map; - var suit=lib.suit.filter(i=>!player.getStorage('twbingde_clear').includes(i)).sort((a,b)=>{ - return map[b]-map[a]; - })[0]; - if(map[suit]==0) return 'cancel2'; - return suit; - }, - backup:function(result,player){ - return { - audio:'twbingde', - filterCard:true, - selectCard:1, - position:'he', - suit:result.control, - check:function(card){ - var suit=lib.skill.twbingde.suit; - if(get.suit(card)==suit) return 10-get.value(card); - return 6-get.value(card); - }, - content:function(){ - 'step 0' - var suit=lib.skill.twbingde_backup.suit,num=0; - player.popup(suit+2); - game.log(player,'选择了','#y'+suit+2); - player.addTempSkill('twbingde_clear','phaseUseAfter'); - player.markAuto('twbingde_clear',[suit]); - player.getHistory('useCard',evt=>{ - var evtx=evt.getParent('phaseUse'),suitx=get.suit(evt.card); - if(!evtx||evtx!=event.getParent('phaseUse')||suit!=suitx) return false; - num++; - }); - if(num>0) player.draw(num); - 'step 1' - if(get.suit(cards[0],player)==lib.skill.twbingde_backup.suit){ - delete player.getStat('skill').twbingde; - } - }, - ai:{ - result:{ - player:1, }, }, - } + }, }, - prompt:()=>'秉德:弃置一张牌', + want_backup: {}, }, - ai:{ - order:2, - result:{player:1} - }, - subSkill:{ - backup:{}, - clear:{ - charlotte:true, - onremove:true, - } + ai: { + threaten: 3, }, }, - twqingtao:{ - audio:2, - trigger:{player:'phaseDrawEnd'}, - filter:function(event,player){ - return player.countCards('he'); + twyangming: { + audio: 2, + trigger: { + player: "phaseUseEnd", }, - direct:true, - group:'twqingtao_jieshu', - content:function(){ - 'step 0' - player.chooseCard(get.prompt2('twqingtao'),'he',lib.filter.cardRecastable).set('ai',function(card){ - if(card.name=='jiu'||get.type(card)!='basic') return 10-get.value(card); - return 6-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('twqingtao'); - player.recast(result.cards); - if(get.name(result.cards[0])=='jiu'||get.type(result.cards[0],false,player)!='basic') player.draw(); + frequent: true, + filter: function (event, player) { + return player.hasHistory("useCard", (evt) => evt.getParent("phaseUse") == event); + }, + content: function () { + var types = []; + var history = player.getHistory("useCard", (evt) => evt.getParent("phaseUse") == trigger); + for (var evt of history) { + types.add(get.type2(evt.card)); + } + var num = types.length; + player.draw(num); + player.addTempSkill("twyangming_limit"); + player.addMark("twyangming_limit", num, false); + game.log(player, "本回合的手牌上限", "#g+" + num); + }, + subSkill: { + limit: { + charlotte: true, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("twyangming_limit"); + }, + }, + }, + }, + }, + //邴原 + twbingde: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") && player.getStorage("twbingde_clear").length < 4; + }, + onChooseToUse: function (event) { + if (event.type == "phase" && !game.online) { + var map = {}; + event.player.getHistory("useCard", (evt) => { + var evtx = evt.getParent("phaseUse"), + suit = get.suit(evt.card); + if (!lib.suit.includes(suit)) return; + if (evtx != event.getParent("phaseUse")) return; + if (typeof map[suit] != "number") map[suit] = 0; + map[suit]++; + }); + event.set("twbingde_map", map); } }, - subSkill:{ - jieshu:{ - audio:'twqingtao', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('he')>0&&!player.hasHistory('useSkill',evt=>evt.skill=='twqingtao'); + chooseButton: { + dialog: function (event, player) { + var str = get.translation("twbingde_info"), + str2 = ""; + if (event.twbingde_map) { + str2 = '
    本回合使用牌对应花色数:
    '; + str2 += '
    '; + for (var suit of lib.suit) { + str2 += + get.translation(suit) + + ":" + + get.cnNumber(event.twbingde_map[suit] || 0) + + "张;"; + } + str2 = str2.slice(0, str2.length - 1) + "
    "; + } + return ui.create.dialog("###秉德###" + str, str2); + }, + chooseControl: function (event, player) { + var list = lib.suit.slice(); + list.removeArray(player.getStorage("twbingde_clear")); + list.push("cancel2"); + return list; + }, + check: function (event, player) { + var map = event.twbingde_map; + var suit = lib.suit + .filter((i) => !player.getStorage("twbingde_clear").includes(i)) + .sort((a, b) => { + return map[b] - map[a]; + })[0]; + if (map[suit] == 0) return "cancel2"; + return suit; + }, + backup: function (result, player) { + return { + audio: "twbingde", + filterCard: true, + selectCard: 1, + position: "he", + suit: result.control, + check: function (card) { + var suit = lib.skill.twbingde.suit; + if (get.suit(card) == suit) return 10 - get.value(card); + return 6 - get.value(card); + }, + content: function () { + "step 0"; + var suit = lib.skill.twbingde_backup.suit, + num = 0; + player.popup(suit + 2); + game.log(player, "选择了", "#y" + suit + 2); + player.addTempSkill("twbingde_clear", "phaseUseAfter"); + player.markAuto("twbingde_clear", [suit]); + player.getHistory("useCard", (evt) => { + var evtx = evt.getParent("phaseUse"), + suitx = get.suit(evt.card); + if (!evtx || evtx != event.getParent("phaseUse") || suit != suitx) + return false; + num++; + }); + if (num > 0) player.draw(num); + ("step 1"); + if (get.suit(cards[0], player) == lib.skill.twbingde_backup.suit) { + delete player.getStat("skill").twbingde; + } + }, + ai: { + result: { + player: 1, + }, + }, + }; + }, + prompt: () => "秉德:弃置一张牌", + }, + ai: { + order: 2, + result: { player: 1 }, + }, + subSkill: { + backup: {}, + clear: { + charlotte: true, + onremove: true, + }, + }, + }, + twqingtao: { + audio: 2, + trigger: { player: "phaseDrawEnd" }, + filter: function (event, player) { + return player.countCards("he"); + }, + direct: true, + group: "twqingtao_jieshu", + content: function () { + "step 0"; + player + .chooseCard(get.prompt2("twqingtao"), "he", lib.filter.cardRecastable) + .set("ai", function (card) { + if (card.name == "jiu" || get.type(card) != "basic") return 10 - get.value(card); + return 6 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("twqingtao"); + player.recast(result.cards); + if ( + get.name(result.cards[0]) == "jiu" || + get.type(result.cards[0], false, player) != "basic" + ) + player.draw(); + } + }, + subSkill: { + jieshu: { + audio: "twqingtao", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + !player.hasHistory("useSkill", (evt) => evt.skill == "twqingtao") + ); }, - direct:true, - content:function(){ - var next=game.createEvent('twqingtao'); - next.player=player; + direct: true, + content: function () { + var next = game.createEvent("twqingtao"); + next.player = player; next.setContent(lib.skill.twqingtao.content); }, - } - } - }, - //牛董 - twjuntun:{ - audio:2, - trigger:{ - global:['phaseBefore','dieAfter'], - player:'enterGame', - }, - init:function(player){lib.skill.baonvezhi.change(player,0)}, - direct:true, - derivation:['twxiongjun','baonvezhi_faq'], - group:'twjuntun_extra', - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&game.hasPlayer(current=>{ - return !current.hasSkill('twxiongjun'); - }); - }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twjuntun'),'令一名角色获得〖凶军〗',(card,player,target)=>{ - return !target.hasSkill('twxiongjun'); - }).set('ai',target=>get.attitude(player,target)-2); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twjuntun',target); - target.addSkills('twxiongjun'); - if(target!=player) player.addExpose(0.25); - } - }, - subSkill:{ - extra:{ - audio:2, - trigger:{global:'damageSource'}, - forced:true, - locked:false, - filter:function(event,player){ - return event.source&&event.source.hasSkill('twxiongjun')&&event.source!=player; - }, - logTarget:'source', - content:function(){ - lib.skill.baonvezhi.change(player,trigger.num); - } }, }, }, - baonvezhi:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + //牛董 + twjuntun: { + audio: 2, + trigger: { + global: ["phaseBefore", "dieAfter"], + player: "enterGame", }, - silent:true, - forced:true, - charlotte:true, - baonvezhi_max:5, - change:function(player,num){ - var baonvezhi_max=lib.skill.baonvezhi.baonvezhi_max; - player.addSkill('baonvezhi'); - var tmp=player.countMark('baonvezhi'); - if(tmp+num>baonvezhi_max) num=baonvezhi_max-tmp; - else if(tmp+num<0) num=-tmp; - if(num===0) return; - player[num>0?'addMark':'removeMark']('baonvezhi',Math.abs(num),false); - game.log(player,num>=0?'获得了':'失去了',get.cnNumber(Math.abs(num))+'点暴虐值'); - player[player.countMark('baonvezhi')>0?'markSkill':'unmarkSkill']('baonvezhi'); + init: function (player) { + lib.skill.baonvezhi.change(player, 0); }, - filter:function(event,player){ - return player.countMark('baonvezhi') { + return !current.hasSkill("twxiongjun"); + }) + ); }, - content:function(){ - lib.skill.baonvezhi.change(player,trigger.num); - }, - marktext:'暴', - intro:{ - name:'暴虐值', - content:function(storage,player){ - return get.translation(player)+'的暴虐值为'+(player.storage.baonvezhi||0); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twjuntun"), + "令一名角色获得〖凶军〗", + (card, player, target) => { + return !target.hasSkill("twxiongjun"); + } + ) + .set("ai", (target) => get.attitude(player, target) - 2); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twjuntun", target); + target.addSkills("twxiongjun"); + if (target != player) player.addExpose(0.25); } - } + }, + subSkill: { + extra: { + audio: 2, + trigger: { global: "damageSource" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + event.source && event.source.hasSkill("twxiongjun") && event.source != player + ); + }, + logTarget: "source", + content: function () { + lib.skill.baonvezhi.change(player, trigger.num); + }, + }, + }, }, - baonvezhi_faq:{}, - twxiongjun:{ - init:function(player){lib.skill.baonvezhi.change(player,0)}, - trigger:{source:'damageSource'}, - forced:true, - usable:1, - content:function(){ - var targets=game.filterPlayer(current=>current.hasSkill('twxiongjun')).sortBySeat(); - player.line(targets,'green'); + baonvezhi: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", + }, + silent: true, + forced: true, + charlotte: true, + baonvezhi_max: 5, + change: function (player, num) { + var baonvezhi_max = lib.skill.baonvezhi.baonvezhi_max; + player.addSkill("baonvezhi"); + var tmp = player.countMark("baonvezhi"); + if (tmp + num > baonvezhi_max) num = baonvezhi_max - tmp; + else if (tmp + num < 0) num = -tmp; + if (num === 0) return; + player[num > 0 ? "addMark" : "removeMark"]("baonvezhi", Math.abs(num), false); + game.log( + player, + num >= 0 ? "获得了" : "失去了", + get.cnNumber(Math.abs(num)) + '点暴虐值' + ); + player[player.countMark("baonvezhi") > 0 ? "markSkill" : "unmarkSkill"]("baonvezhi"); + }, + filter: function (event, player) { + return player.countMark("baonvezhi") < lib.skill.baonvezhi.baonvezhi_max; + }, + content: function () { + lib.skill.baonvezhi.change(player, trigger.num); + }, + marktext: "暴", + intro: { + name: "暴虐值", + content: function (storage, player) { + return get.translation(player) + "的暴虐值为" + (player.storage.baonvezhi || 0); + }, + }, + }, + baonvezhi_faq: {}, + twxiongjun: { + init: function (player) { + lib.skill.baonvezhi.change(player, 0); + }, + trigger: { source: "damageSource" }, + forced: true, + usable: 1, + content: function () { + var targets = game.filterPlayer((current) => current.hasSkill("twxiongjun")).sortBySeat(); + player.line(targets, "green"); game.asyncDraw(targets); }, }, - twxiongxi:{ - audio:2, - enable:'phaseUse', - usable:1, - init:function(player){lib.skill.baonvezhi.change(player,0)}, - filterCard:()=>true, - selectCard:function(){ - return (lib.skill.baonvezhi.baonvezhi_max||5)-_status.event.player.countMark('baonvezhi'); + twxiongxi: { + audio: 2, + enable: "phaseUse", + usable: 1, + init: function (player) { + lib.skill.baonvezhi.change(player, 0); }, - check:function(card){ - return 6-get.value(card); + filterCard: () => true, + selectCard: function () { + return ( + (lib.skill.baonvezhi.baonvezhi_max || 5) - _status.event.player.countMark("baonvezhi") + ); }, - position:'he', - filterTarget:function(card,player,target){ - return target!=player; + check: function (card) { + return 6 - get.value(card); }, - content:function(){ + position: "he", + filterTarget: function (card, player, target) { + return target != player; + }, + content: function () { target.damage(); }, - ai:{ - expose:0.25, - order:8, - result:{ - target:function(player,target){ - return get.damageEffect(target,player,player); - } - } - } + ai: { + expose: 0.25, + order: 8, + result: { + target: function (player, target) { + return get.damageEffect(target, player, player); + }, + }, + }, }, - twxiafeng:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.countMark('baonvezhi')>0; + twxiafeng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countMark("baonvezhi") > 0; }, - init:function(player){lib.skill.baonvezhi.change(player,0)}, - direct:true, - content:function(){ - 'step 0' - player.chooseButton(['黠凤:选择要消耗的暴虐值',[['tw_bn_1','tw_bn_2','tw_bn_3'],'vcard']],(button)=>{ - var num=player.countCards('hs',card=>get.tag(card,'damage')&&game.hasPlayer(current=>get.effect(current,card,player,player)>0)); - if(num<=0) return 0; - if(num>=3) num=3; - if(button.link[2]=='tw_bn_'+num) return 10; - return 1; - }).set('filterButton',(button)=>{ - var player=_status.event.player; - var link=button.link[2]; - if(link[link.length-1]*1>player.storage.baonvezhi) return false; - return true; - }); - 'step 1' - if(result.bool){ - player.logSkill('twxiafeng'); - var link=result.links[0][2],num=link[link.length-1]*1; - player.addTempSkill('twxiafeng_effect'); - player.storage.twxiafeng_effect=num; - lib.skill.baonvezhi.change(player,-num); + init: function (player) { + lib.skill.baonvezhi.change(player, 0); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseButton( + ["黠凤:选择要消耗的暴虐值", [["tw_bn_1", "tw_bn_2", "tw_bn_3"], "vcard"]], + (button) => { + var num = player.countCards( + "hs", + (card) => + get.tag(card, "damage") && + game.hasPlayer( + (current) => get.effect(current, card, player, player) > 0 + ) + ); + if (num <= 0) return 0; + if (num >= 3) num = 3; + if (button.link[2] == "tw_bn_" + num) return 10; + return 1; + } + ) + .set("filterButton", (button) => { + var player = _status.event.player; + var link = button.link[2]; + if (link[link.length - 1] * 1 > player.storage.baonvezhi) return false; + return true; + }); + ("step 1"); + if (result.bool) { + player.logSkill("twxiafeng"); + var link = result.links[0][2], + num = link[link.length - 1] * 1; + player.addTempSkill("twxiafeng_effect"); + player.storage.twxiafeng_effect = num; + lib.skill.baonvezhi.change(player, -num); } }, - subSkill:{ - effect:{ - trigger:{player:'useCard'}, - filter:function(event,player){ + subSkill: { + effect: { + trigger: { player: "useCard" }, + filter: function (event, player) { return !player.storage.twxiafeng_effect2; }, - forced:true, - content:function(){ - var count=player.getHistory('useCard',evt=>evt.getParent('phaseUse').player==player).length; - if(count==player.storage.twxiafeng_effect){ - player.storage.twxiafeng_effect2=true; + forced: true, + content: function () { + var count = player.getHistory( + "useCard", + (evt) => evt.getParent("phaseUse").player == player + ).length; + if (count == player.storage.twxiafeng_effect) { + player.storage.twxiafeng_effect2 = true; } - if(count<=player.storage.twxiafeng_effect){ + if (count <= player.storage.twxiafeng_effect) { trigger.directHit.addArray(game.players); - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(typeof stat[name]=='number') stat[name]--; + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; } } }, - onremove:function(player){ + onremove: function (player) { delete player.storage.twxiafeng_effect; delete player.storage.twxiafeng_effect2; }, - mod:{ - targetInRange:function(card,player,target,now){ - if(!player.storage.twxiafeng_effect2) return true; + mod: { + targetInRange: function (card, player, target, now) { + if (!player.storage.twxiafeng_effect2) return true; }, - cardUsableTarget:function(card,player,target){ - if(!player.storage.twxiafeng_effect2) return true; + cardUsableTarget: function (card, player, target) { + if (!player.storage.twxiafeng_effect2) return true; + }, + maxHandcard: function (player, num) { + return num + (player.storage.twxiafeng_effect || 0); }, - maxHandcard:function(player,num){ - return num+(player.storage.twxiafeng_effect||0); - } }, - } - } + }, + }, }, //蒋济 - twjichou:{ - audio:2, - enable:'chooseToUse', - group:['twjichou_ban','twjichou_give'], - filter:function(event,player){ - if(player.hasSkill('twjichou_used')&&player.hasSkill('twjichou_given')) return false; - if(!player.hasSkill('twjichou_used')){ - var record=player.getStorage('twjichou'); - for(var i of lib.inpile){ - var type=get.type(i); - if(type=='trick'&&!record.includes(i)&&event.filterCard({name:i,isCard:true},player,event)) return true; + twjichou: { + audio: 2, + enable: "chooseToUse", + group: ["twjichou_ban", "twjichou_give"], + filter: function (event, player) { + if (player.hasSkill("twjichou_used") && player.hasSkill("twjichou_given")) return false; + if (!player.hasSkill("twjichou_used")) { + var record = player.getStorage("twjichou"); + for (var i of lib.inpile) { + var type = get.type(i); + if ( + type == "trick" && + !record.includes(i) && + event.filterCard({ name: i, isCard: true }, player, event) + ) + return true; } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('急筹'); - if(!player.hasSkill('twjichou_used')&&!player.hasSkill('twjichou_given')&&event.type=='phase'&&player.countCards('h',card=>{ - return player.getStorage('twjichou').includes(get.name(card)); - })){ - dialog._chosenOpt=[]; - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; - var list=['视为使用牌','交出锦囊牌']; - for(var i of list){ - var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); - td.innerHTML=''+i+''; - td.link=i; - if(i==list[0]){ - td.classList.add('bluebg'); + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("急筹"); + if ( + !player.hasSkill("twjichou_used") && + !player.hasSkill("twjichou_given") && + event.type == "phase" && + player.countCards("h", (card) => { + return player.getStorage("twjichou").includes(get.name(card)); + }) + ) { + dialog._chosenOpt = []; + var table = document.createElement("div"); + table.classList.add("add-setting"); + table.style.margin = "0"; + table.style.width = "100%"; + table.style.position = "relative"; + var list = ["视为使用牌", "交出锦囊牌"]; + for (var i of list) { + var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); + td.innerHTML = "" + i + ""; + td.link = i; + if (i == list[0]) { + td.classList.add("bluebg"); dialog._chosenOpt.add(td); } - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.clicked) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - _status.clicked=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - if(link=='交出锦囊牌') game.uncheck(); - var current=this.parentNode.querySelector('.bluebg'); - if(current){ - current.classList.remove('bluebg'); - dialog._chosenOpt.remove(current); + td.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + function () { + if (_status.dragged) return; + if (_status.clicked) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + _status.clicked = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (link == "交出锦囊牌") game.uncheck(); + var current = this.parentNode.querySelector(".bluebg"); + if (current) { + current.classList.remove("bluebg"); + dialog._chosenOpt.remove(current); + } + dialog._chosenOpt.add(this); + this.classList.add("bluebg"); + game.check(); } - dialog._chosenOpt.add(this); - this.classList.add('bluebg'); - game.check(); - }); + ); table.appendChild(td); dialog.buttons.add(td); } dialog.content.appendChild(table); } - var list=[],record=player.getStorage('twjichou'); - for(var name of lib.inpile){ - if(get.type(name)=='trick'&&!record.includes(name)&&event.filterCard({name:name,isCard:true},player,event)) list.push(['锦囊','',name]); + var list = [], + record = player.getStorage("twjichou"); + for (var name of lib.inpile) { + if ( + get.type(name) == "trick" && + !record.includes(name) && + event.filterCard({ name: name, isCard: true }, player, event) + ) + list.push(["锦囊", "", name]); } - dialog.add([list,'vcard']); + dialog.add([list, "vcard"]); return dialog; }, - filter:function(button){ - if(_status.event.dialog){ - var opts=_status.event.dialog._chosenOpt; - if(opts&&opts.length&&opts[0].link=='交出锦囊牌'&&typeof button.link!=typeof opts[0].link){ + filter: function (button) { + if (_status.event.dialog) { + var opts = _status.event.dialog._chosenOpt; + if ( + opts && + opts.length && + opts[0].link == "交出锦囊牌" && + typeof button.link != typeof opts[0].link + ) { return false; } return true; } return false; }, - select:function(){ - if(_status.event.dialog){ - var opts=_status.event.dialog._chosenOpt; - return opts&&opts.length&&opts[0].link=='交出锦囊牌'?0:1; + select: function () { + if (_status.event.dialog) { + var opts = _status.event.dialog._chosenOpt; + return opts && opts.length && opts[0].link == "交出锦囊牌" ? 0 : 1; } return 0; }, - check:function(button){ - if(_status.event.getParent().type!='phase') return 1; - var player=_status.event.player; - if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].includes(button.link[2])) return 0.1; - return player.getUseValue({name:button.link[2]}); + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + if ( + [ + "wugu", + "zhulu_card", + "yiyi", + "lulitongxin", + "lianjunshengyan", + "diaohulishan", + ].includes(button.link[2]) + ) + return 0.1; + return player.getUseValue({ name: button.link[2] }); }, - backup:function(links,player){ - var isUse=links.length==1; - var backup=get.copy(lib.skill['twjichou_'+(isUse?'use':'give')]); - if(isUse) backup.viewAs={name:links[0][2],isCard:true}; + backup: function (links, player) { + var isUse = links.length == 1; + var backup = get.copy(lib.skill["twjichou_" + (isUse ? "use" : "give")]); + if (isUse) backup.viewAs = { name: links[0][2], isCard: true }; return backup; }, - prompt:function(links,player){ - var isUse=links.length==1; - return '急筹:'+(isUse?('视为使用'+get.translation(links[0][2])+''):'选择要交出的牌和要交给的目标'); - } + prompt: function (links, player) { + var isUse = links.length == 1; + return ( + "急筹:" + + (isUse + ? "视为使用" + get.translation(links[0][2]) + "" + : "选择要交出的牌和要交给的目标") + ); + }, }, - hiddenCard:function(player,name){ - if(player.hasSkill('twjichou_used')) return false; - var type=get.type(name); - return type=='trick'&&!player.getStorage('twjichou').includes(name); + hiddenCard: function (player, name) { + if (player.hasSkill("twjichou_used")) return false; + var type = get.type(name); + return type == "trick" && !player.getStorage("twjichou").includes(name); }, - marktext:'筹', - intro:{ - markcount:function(storage,player){ - if(storage&&storage.length) return storage.length; + marktext: "筹", + intro: { + markcount: function (storage, player) { + if (storage && storage.length) return storage.length; return 0; }, - content:'已记录牌名:$', + content: "已记录牌名:$", }, - ai:{ - order:1, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + ai: { + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; }, }, }, - subSkill:{ - backup:{}, - used:{charlotte:true}, - given:{charlotte:true}, - ban:{ - trigger:{global:'useCard1'}, - filter:function(event,player){ - return player.getStorage('twjichou').includes(event.card.name); + subSkill: { + backup: {}, + used: { charlotte: true }, + given: { charlotte: true }, + ban: { + trigger: { global: "useCard1" }, + filter: function (event, player) { + return player.getStorage("twjichou").includes(event.card.name); }, - forced:true, - locked:false, - silent:true, - content:function(){ + forced: true, + locked: false, + silent: true, + content: function () { trigger.directHit.add(player); }, - mod:{ - cardEnabled:function(card,player){ - if(player.getStorage('twjichou').includes(card.name)&&(get.position(card)=='h'||card.cards&&card.cards.some(i=>get.position(i)=='h'))) return false; + mod: { + cardEnabled: function (card, player) { + if ( + player.getStorage("twjichou").includes(card.name) && + (get.position(card) == "h" || + (card.cards && card.cards.some((i) => get.position(i) == "h"))) + ) + return false; }, - cardSavable:function(card,player){ - if(player.getStorage('twjichou').includes(card.name)&&(get.position(card)=='h'||card.cards&&card.cards.some(i=>get.position(i)=='h'))) return false; + cardSavable: function (card, player) { + if ( + player.getStorage("twjichou").includes(card.name) && + (get.position(card) == "h" || + (card.cards && card.cards.some((i) => get.position(i) == "h"))) + ) + return false; }, - aiValue:function(player,card){ - if(get.type(card)!='trick'||_status.twjichou_give_aiCheck) return; - if(!player.getFriends().length&&player.getStorage('twjichou').includes(get.name(card))) return 0; + aiValue: function (player, card) { + if (get.type(card) != "trick" || _status.twjichou_give_aiCheck) return; + if ( + !player.getFriends().length && + player.getStorage("twjichou").includes(get.name(card)) + ) + return 0; }, - aiUseful:function(){ - return lib.skill.twjichou_ban.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.twjichou_ban.mod.aiValue.apply(this, arguments); }, }, }, - use:{ - filterCard:()=>false, - selectCard:-1, - audio:'twjichou', - popname:true, - onuse:function(links,player){ - player.markAuto('twjichou',[links.card.name]); - player.syncStorage('twjichou'); - player.addTempSkill('twjichou_used'); + use: { + filterCard: () => false, + selectCard: -1, + audio: "twjichou", + popname: true, + onuse: function (links, player) { + player.markAuto("twjichou", [links.card.name]); + player.syncStorage("twjichou"); + player.addTempSkill("twjichou_used"); }, }, - give:{ - audio:'twjichou', - enable:'phaseUse', - filter:function(event,player){ - return player.hasSkill('twjichou_used')&&!player.hasSkill('twjichou_given')&&player.countCards('h',i=>player.getStorage('twjichou').includes(get.name(i))); + give: { + audio: "twjichou", + enable: "phaseUse", + filter: function (event, player) { + return ( + player.hasSkill("twjichou_used") && + !player.hasSkill("twjichou_given") && + player.countCards("h", (i) => + player.getStorage("twjichou").includes(get.name(i)) + ) + ); }, - filterTarget:function(card,player,target){ - return target!=player; + filterTarget: function (card, player, target) { + return target != player; }, - filterCard:function(card,player){ - return player.getStorage('twjichou').includes(get.name(card)); + filterCard: function (card, player) { + return player.getStorage("twjichou").includes(get.name(card)); }, - check:function(card){ - _status.twjichou_give_aiCheck=true; - var val=get.value(card); + check: function (card) { + _status.twjichou_give_aiCheck = true; + var val = get.value(card); delete _status.twjichou_give_aiCheck; return val; }, - prompt:()=>'选择要交出的牌和要交给的目标', - selectCard:1, - discard:false, - lose:false, - delay:false, - content:function(){ - player.give(cards,target); - player.addTempSkill('twjichou_given','phaseUseAfter'); + prompt: () => "选择要交出的牌和要交给的目标", + selectCard: 1, + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); + player.addTempSkill("twjichou_given", "phaseUseAfter"); }, - ai:{ - order:0.9, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(target.hasJudge('lebu')) return 0; - return target.getCards('h',card=>player.getStorage('twjichou').includes(get.name(card))).reduce((p,c)=>p+(target.getUseValue(c)||1),0); - } + ai: { + order: 0.9, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (target.hasJudge("lebu")) return 0; + return target + .getCards("h", (card) => + player.getStorage("twjichou").includes(get.name(card)) + ) + .reduce((p, c) => p + (target.getUseValue(c) || 1), 0); + }, }, - } + }, }, - } + }, }, - twjilun:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - content:function(){ - 'step 0' - var num=Math.min(Math.max(1,player.getStorage('twjichou').length),5); - event.num=num; - var choices=['选项一']; - var choiceList=['摸'+get.cnNumber(num)+'张牌','视为使用一张在〖急筹〗记录内且不在〖机论〗记录内的普通锦囊牌']; - if((!player.getStorage('twjichou').length)||player.getStorage('twjichou').filter(name=>{ - return !player.getStorage('twjilun').includes(name)&&player.hasUseTarget({name:name}); - }).length==0) - choiceList[1]=''+choiceList[1]+''; - else choices.push('选项二'); - player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('twjilun')).set('ai',()=>{ - if(_status.event.choiceList.length==1||!player.getStorage('twjichou').length) return 0; - var val=_status.event.num>3?Math.min(1.5,1+(_status.event.num-3)*0.1):1; - for(var name of player.getStorage('twjichou')){ - if(player.getStorage('twjilun').includes(name)) continue; - if(player.getUseValue({name:name})>4*val) return 1; - } - return 0; - }).set('num',num); - 'step 1' - if(result.control!='cancel2'){ - if(result.control=='选项一'){ - player.logSkill('twjilun'); + twjilun: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + var num = Math.min(Math.max(1, player.getStorage("twjichou").length), 5); + event.num = num; + var choices = ["选项一"]; + var choiceList = [ + "摸" + get.cnNumber(num) + "张牌", + "视为使用一张在〖急筹〗记录内且不在〖机论〗记录内的普通锦囊牌", + ]; + if ( + !player.getStorage("twjichou").length || + player.getStorage("twjichou").filter((name) => { + return ( + !player.getStorage("twjilun").includes(name) && + player.hasUseTarget({ name: name }) + ); + }).length == 0 + ) + choiceList[1] = '' + choiceList[1] + ""; + else choices.push("选项二"); + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("twjilun")) + .set("ai", () => { + if (_status.event.choiceList.length == 1 || !player.getStorage("twjichou").length) + return 0; + var val = + _status.event.num > 3 ? Math.min(1.5, 1 + (_status.event.num - 3) * 0.1) : 1; + for (var name of player.getStorage("twjichou")) { + if (player.getStorage("twjilun").includes(name)) continue; + if (player.getUseValue({ name: name }) > 4 * val) return 1; + } + return 0; + }) + .set("num", num); + ("step 1"); + if (result.control != "cancel2") { + if (result.control == "选项一") { + player.logSkill("twjilun"); player.draw(num); event.finish(); - } - else{ - var list=[]; - for(var name of player.getStorage('twjichou')){ - if(!player.getStorage('twjilun').includes(name)){ - list.push(['锦囊','',name]); + } else { + var list = []; + for (var name of player.getStorage("twjichou")) { + if (!player.getStorage("twjilun").includes(name)) { + list.push(["锦囊", "", name]); } } - player.chooseButton(['###机论###
    是否视为使用一张〖急筹〗已记录的普通锦囊牌?
    ',[list,'vcard']]).set('filterButton',button=>{ - return _status.event.player.hasUseTarget({name:button.link[2]}); - }).set('ai',button=>{ - return _status.event.getParent().player.getUseValue({name:button.link[2]},null,true); - }); + player + .chooseButton([ + '###机论###
    是否视为使用一张〖急筹〗已记录的普通锦囊牌?
    ', + [list, "vcard"], + ]) + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget({ name: button.link[2] }); + }) + .set("ai", (button) => { + return _status.event + .getParent() + .player.getUseValue({ name: button.link[2] }, null, true); + }); } } else event.finish(); - 'step 2' - if(result.bool){ - var card={name:result.links[0][2],isCard:true}; - player.chooseUseTarget(card,true).set('logSkill','twjilun'); - player.markAuto('twjilun',[card.name]); - player.syncStorage('twjilun'); + ("step 2"); + if (result.bool) { + var card = { name: result.links[0][2], isCard: true }; + player.chooseUseTarget(card, true).set("logSkill", "twjilun"); + player.markAuto("twjilun", [card.name]); + player.syncStorage("twjilun"); } else event.goto(0); }, - marktext:'论', - intro:{ - markcount:function(storage,player){ - if(storage&&storage.length) return storage.length; + marktext: "论", + intro: { + markcount: function (storage, player) { + if (storage && storage.length) return storage.length; return 0; }, - content:'已记录牌名:$', + content: "已记录牌名:$", + }, + ai: { + maixie: true, + maixie_defend: true, + threaten: 0.7, }, - ai:{ - maixie:true, - maixie_defend:true, - threaten:0.7, - } }, //蹇硕 - twkunsi:{ - audio:2, - enable:'phaseUse', - onremove:true, - derivation:'twlinglu', - filter:function(event,player){ - return game.hasPlayer(function(current){ - return player.canUse({name:'sha',isCard:true},current,false)&¤t!=player&&!player.getStorage('twkunsi').includes(current); + twkunsi: { + audio: 2, + enable: "phaseUse", + onremove: true, + derivation: "twlinglu", + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + player.canUse({ name: "sha", isCard: true }, current, false) && + current != player && + !player.getStorage("twkunsi").includes(current) + ); }); }, - filterTarget:function(card,player,target){ - return player.canUse({name:'sha',isCard:true},target,false)&&target!=player&&!player.getStorage('twkunsi').includes(target); + filterTarget: function (card, player, target) { + return ( + player.canUse({ name: "sha", isCard: true }, target, false) && + target != player && + !player.getStorage("twkunsi").includes(target) + ); }, - content:function(){ - 'step 0' - player.markAuto('twkunsi',[target]); + content: function () { + "step 0"; + player.markAuto("twkunsi", [target]); player.storage.twkunsi.sortBySeat(); - player.markSkill('twkunsi'); - player.useCard({name:'sha',isCard:true},target,false).animate=false; - 'step 1' - if(!player.hasHistory('sourceDamage',function(evt){ - var card=evt.card; - if(!card||card.name!='sha') return false; - var evtx=evt.getParent('useCard'); - return evtx.card==card&&evtx.getParent()==event; - })){ + player.markSkill("twkunsi"); + player.useCard({ name: "sha", isCard: true }, target, false).animate = false; + ("step 1"); + if ( + !player.hasHistory("sourceDamage", function (evt) { + var card = evt.card; + if (!card || card.name != "sha") return false; + var evtx = evt.getParent("useCard"); + return evtx.card == card && evtx.getParent() == event; + }) + ) { player.line(target); - target.markAuto('twlinglu',[player]); - target.addAdditionalSkills('twkunsi_temp','twlinglu'); - player.markAuto('twkunsi_clear',[target]); - player.addTempSkill('twkunsi_clear',{player:'phaseBegin'}); + target.markAuto("twlinglu", [player]); + target.addAdditionalSkills("twkunsi_temp", "twlinglu"); + player.markAuto("twkunsi_clear", [target]); + player.addTempSkill("twkunsi_clear", { player: "phaseBegin" }); } }, - intro:{content:'已对$发动过〖困兕〗'}, - ai:{ - order:function(){ - return get.order({name:'sha'})-0.1; + intro: { content: "已对$发动过〖困兕〗" }, + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.1; }, - expose:0.2, - result:{ - target:function(player,target){ - if(target.countCards('h')<=target.hp&&!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))&&get.effect(target,{name:'sha',isCard:true},player,player)>0) return -1; - else if(target.countCards('h')>target.hp&&target.hp>2&&target.hasShan()) return 1; + expose: 0.2, + result: { + target: function (player, target) { + if ( + target.countCards("h") <= target.hp && + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) && + get.effect(target, { name: "sha", isCard: true }, player, player) > 0 + ) + return -1; + else if (target.countCards("h") > target.hp && target.hp > 2 && target.hasShan()) + return 1; return 0; }, }, }, - subSkill:{ - clear:{ - forced:true, - onremove:function(player,skill){ - var targets=player.getStorage(skill); - for(var target of targets){ - if(target.isIn()){ - target.removeAdditionalSkill('twkunsi_temp'); + subSkill: { + clear: { + forced: true, + onremove: function (player, skill) { + var targets = player.getStorage(skill); + for (var target of targets) { + if (target.isIn()) { + target.removeAdditionalSkill("twkunsi_temp"); } } }, }, }, }, - twlinglu:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player; + twlinglu: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player; }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twlinglu'),function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.countCards('hs')>4&&target.hp>=3) return att; - if(player.getStorage('twlinglu').includes(target)) return -2*att; - return -att; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twlinglu',target); - target.addTempSkill('twlinglu_order',{player:'phaseAfter'}); - if(!target.storage.twlinglu_settle) target.storage.twlinglu_settle=[]; - target.storage.twlinglu_settle.unshift([player,1]); - if(player.getStorage('twlinglu').includes(target)) player.chooseBool('是否令'+get.translation(target)+'于〖令戮〗失败时进行两次结算?').set('ai',function(){return true}); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twlinglu"), function (card, player, target) { + return target != player; + }) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.countCards("hs") > 4 && target.hp >= 3) return att; + if (player.getStorage("twlinglu").includes(target)) return -2 * att; + return -att; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twlinglu", target); + target.addTempSkill("twlinglu_order", { player: "phaseAfter" }); + if (!target.storage.twlinglu_settle) target.storage.twlinglu_settle = []; + target.storage.twlinglu_settle.unshift([player, 1]); + if (player.getStorage("twlinglu").includes(target)) + player + .chooseBool( + "是否令" + get.translation(target) + "于〖令戮〗失败时进行两次结算?" + ) + .set("ai", function () { + return true; + }); else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ + } else event.finish(); + ("step 2"); + if (result.bool) { target.storage.twlinglu_settle[0][1]++; - game.log(target,'于本次强令失败时进行两次结算'); + game.log(target, "于本次强令失败时进行两次结算"); } }, - ai:{expose:0.2}, - subSkill:{ - order:{ - audio:2, - trigger:{source:'damageSource'}, - group:'twlinglu_settle', - silent:true, - charlotte:true, - onremove:true, - mark:true, - marktext:'令', - intro:{ - content:function(storage,player){ - return '
  • 任务目标:于你下回合结束前造成的伤害不小于2点
  • 已造成'+player.countMark('twlinglu_order')+'点伤害'; - } + ai: { expose: 0.2 }, + subSkill: { + order: { + audio: 2, + trigger: { source: "damageSource" }, + group: "twlinglu_settle", + silent: true, + charlotte: true, + onremove: true, + mark: true, + marktext: "令", + intro: { + content: function (storage, player) { + return ( + "
  • 任务目标:于你下回合结束前造成的伤害不小于2点
  • 已造成" + + player.countMark("twlinglu_order") + + "点伤害" + ); + }, }, - content:function(){ - player.addMark('twlinglu_order',trigger.num,false); + content: function () { + player.addMark("twlinglu_order", trigger.num, false); }, }, - settle:{ - audio:'twlinglu_order', - trigger:{player:'phaseEnd'}, - charlotte:true, - silent:true, - onremove:true, - filter:function(event,player){ - return player.getStorage('twlinglu_settle').length>0; + settle: { + audio: "twlinglu_order", + trigger: { player: "phaseEnd" }, + charlotte: true, + silent: true, + onremove: true, + filter: function (event, player) { + return player.getStorage("twlinglu_settle").length > 0; }, - content:function(){ - 'step 0' - var list=player.getStorage('twlinglu_settle').shift(); - var target=list[0],count=list[1]||1; - event.target=target; event.count=count; - 'step 1' - if(player.countMark('twlinglu_order')>=2){ - game.log(player,'成功完成了',target,'发布的','#g【令戮】','强令'); - player.popup('强令成功','wood'); + content: function () { + "step 0"; + var list = player.getStorage("twlinglu_settle").shift(); + var target = list[0], + count = list[1] || 1; + event.target = target; + event.count = count; + ("step 1"); + if (player.countMark("twlinglu_order") >= 2) { + game.log(player, "成功完成了", target, "发布的", "#g【令戮】", "强令"); + player.popup("强令成功", "wood"); player.draw(2); event.finish(); + } else { + game.log(player, "未完成", target, "发布的", "#g【令戮】", "强令"); + player.popup("强令失败", "fire"); } - else{ - game.log(player,'未完成',target,'发布的','#g【令戮】','强令'); - player.popup('强令失败','fire'); - } - 'step 2' - if(player.countMark('twlinglu_order')>=2){ + ("step 2"); + if (player.countMark("twlinglu_order") >= 2) { game.delayx(); - } - else{ + } else { event.count--; player.loseHp(); } - 'step 3' - if(event.count>0) event.goto(2); - 'step 4' - if(player.getStorage('twlinglu_settle').length>0){ + ("step 3"); + if (event.count > 0) event.goto(2); + ("step 4"); + if (player.getStorage("twlinglu_settle").length > 0) { event.goto(0); game.delayx(); } }, - } + }, }, }, //马腾 - twxiongzheng:{ - audio:2, - onremove:true, - trigger:{global:'roundStart'}, - direct:true, - content:function(){ - 'step 0' - var target=player.storage.twxiongzheng_target; + twxiongzheng: { + audio: 2, + onremove: true, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + var target = player.storage.twxiongzheng_target; delete player.storage.twxiongzheng_target; - if(!target){event.goto(4);return;} - event.target=target; - var list=[],list2=[]; - var history=target.actionHistory; - if(history.length<2){event.goto(4);return;} - for(var i=history.length-2;i>=0;i--){ - for(var evt of history[i].damage){ - if(evt.source) list.add(evt.source); + if (!target) { + event.goto(4); + return; + } + event.target = target; + var list = [], + list2 = []; + var history = target.actionHistory; + if (history.length < 2) { + event.goto(4); + return; + } + for (var i = history.length - 2; i >= 0; i--) { + for (var evt of history[i].damage) { + if (evt.source) list.add(evt.source); } - if(history[i].isRound) break; + if (history[i].isRound) break; } - var list2=game.filterPlayer(i=>i!=player).removeArray(list); - event.list=list; event.list2=list2; - var choiceList=[ - '视为对任意名上一轮未对'+get.translation(target)+'造成过伤害的角色使用一张【杀】', - '令任意名上一轮对'+get.translation(target)+'造成过伤害的角色摸两张牌' + var list2 = game.filterPlayer((i) => i != player).removeArray(list); + event.list = list; + event.list2 = list2; + var choiceList = [ + "视为对任意名上一轮未对" + get.translation(target) + "造成过伤害的角色使用一张【杀】", + "令任意名上一轮对" + get.translation(target) + "造成过伤害的角色摸两张牌", ]; - var choices=[]; - if(list2.length){ - choices.push('选项一'); - choiceList[0]+='('+get.translation(list2)+')'; - } - else choiceList[0]=''+choiceList[0]+''; - if(list.length){ - choices.push('选项二'); - choiceList[1]+='('+get.translation(list)+')'; - } - else choiceList[1]=''+choiceList[1]+''; - choices.push('cancel2'); - player.chooseControl(choices).set('prompt','雄争:是否选择一项?').set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player; - var list=_status.event.getParent().list,list2=_status.event.getParent().list2; - var eff=list.map(target=>{ - if(target==player) return 0; - return get.effect(target,{name:'sha'},player,player); - }).reduce((p,c)=>p+c,0),eff2=list2.map(target=>2*get.effect(target,{name:'draw'},player,player)).reduce((p,c)=>p+c,0); - if(_status.event.controls.includes('选项二')&&eff2>eff) return '选项二'; - if(eff>0) return 0; - return 'cancel2'; - }); - 'step 1' - if(result.control=='选项一'){ - event.bool=true; - if(event.list2.length) player.chooseTarget('雄争:请选择任意名满足条件的角色,你视为依次对这些角色使用一张杀',[1,Infinity],true,function(card,player,target){ - return player.canUse('sha',target,false,false)&&_status.event.getParent().list2.includes(target); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); + var choices = []; + if (list2.length) { + choices.push("选项一"); + choiceList[0] += "(" + get.translation(list2) + ")"; + } else choiceList[0] = '' + choiceList[0] + ""; + if (list.length) { + choices.push("选项二"); + choiceList[1] += "(" + get.translation(list) + ")"; + } else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("prompt", "雄争:是否选择一项?") + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player; + var list = _status.event.getParent().list, + list2 = _status.event.getParent().list2; + var eff = list + .map((target) => { + if (target == player) return 0; + return get.effect(target, { name: "sha" }, player, player); + }) + .reduce((p, c) => p + c, 0), + eff2 = list2 + .map((target) => 2 * get.effect(target, { name: "draw" }, player, player)) + .reduce((p, c) => p + c, 0); + if (_status.event.controls.includes("选项二") && eff2 > eff) return "选项二"; + if (eff > 0) return 0; + return "cancel2"; }); + ("step 1"); + if (result.control == "选项一") { + event.bool = true; + if (event.list2.length) + player + .chooseTarget( + "雄争:请选择任意名满足条件的角色,你视为依次对这些角色使用一张杀", + [1, Infinity], + true, + function (card, player, target) { + return ( + player.canUse("sha", target, false, false) && + _status.event.getParent().list2.includes(target) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); else event.finish(); - } - else if(result.control=='选项二'){ - event.bool=false; - if(event.list.length) player.chooseTarget('雄争:请选择任意名满足条件的角色,这些角色摸两张牌',[1,Infinity],true,function(card,player,target){ - return _status.event.getParent().list.includes(target); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'draw'},player,player); - }); + } else if (result.control == "选项二") { + event.bool = false; + if (event.list.length) + player + .chooseTarget( + "雄争:请选择任意名满足条件的角色,这些角色摸两张牌", + [1, Infinity], + true, + function (card, player, target) { + return _status.event.getParent().list.includes(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "draw" }, player, player); + }); else event.finish(); - } - else event.goto(3); - 'step 2' + } else event.goto(3); + ("step 2"); result.targets.sortBySeat(); - player.logSkill('twxiongzheng',result.targets); - if(event.bool){ - for(var i of result.targets) player.useCard({name:'sha',isCard:true},i,false); - } - else game.asyncDraw(result.targets,2); - 'step 3' - if(!game.hasPlayer(function(current){ - return !player.getStorage('twxiongzheng').includes(current); - })) event.finish(); + player.logSkill("twxiongzheng", result.targets); + if (event.bool) { + for (var i of result.targets) player.useCard({ name: "sha", isCard: true }, i, false); + } else game.asyncDraw(result.targets, 2); + ("step 3"); + if ( + !game.hasPlayer(function (current) { + return !player.getStorage("twxiongzheng").includes(current); + }) + ) + event.finish(); else game.delayx(); - 'step 4' - player.chooseTarget(get.prompt('twxiongzheng'),'选择一名未选择过的角色,称为“雄争”角色',function(card,player,target){ - return !player.getStorage('twxiongzheng').includes(target); - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(game.roundNumber<=1&&player.hasUnknown()) return 0; - return -att; - }); - 'step 5' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twxiongzheng',target); - player.markAuto('twxiongzheng',[target]); - player.storage.twxiongzheng_target=target; - player.addTempSkill('twxiongzheng_mark','roundStart'); - target.addTempSkill('twxiongzheng_threaten','roundStart'); + ("step 4"); + player + .chooseTarget( + get.prompt("twxiongzheng"), + "选择一名未选择过的角色,称为“雄争”角色", + function (card, player, target) { + return !player.getStorage("twxiongzheng").includes(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (game.roundNumber <= 1 && player.hasUnknown()) return 0; + return -att; + }); + ("step 5"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twxiongzheng", target); + player.markAuto("twxiongzheng", [target]); + player.storage.twxiongzheng_target = target; + player.addTempSkill("twxiongzheng_mark", "roundStart"); + target.addTempSkill("twxiongzheng_threaten", "roundStart"); game.delayx(); } }, - subSkill:{ - mark:{ - intro:{ - content:'$参与了〖雄争〗的争斗', - onunmark:true, + subSkill: { + mark: { + intro: { + content: "$参与了〖雄争〗的争斗", + onunmark: true, }, - charlotte:true, - onremove:true, - trigger:{global:'damage'}, - firstDo:true, - direct:true, - filter:function(event,player){ - return event.player==player.storage.twxiongzheng_target&&get.itemtype(event.source)=='player'; + charlotte: true, + onremove: true, + trigger: { global: "damage" }, + firstDo: true, + direct: true, + filter: function (event, player) { + return ( + event.player == player.storage.twxiongzheng_target && + get.itemtype(event.source) == "player" + ); }, - content:function(){ - player.markAuto('twxiongzheng_mark',[trigger.source]); + content: function () { + player.markAuto("twxiongzheng_mark", [trigger.source]); }, }, - threaten:{ - mark:true, - intro:{content:'本轮〖雄争〗目标'}, - ai:{threaten:10}, + threaten: { + mark: true, + intro: { content: "本轮〖雄争〗目标" }, + ai: { threaten: 10 }, }, }, }, - twluannian:{ - audio:2, - global:'twluannian_global', - unique:true, - zhuSkill:true, - subSkill:{ - global:{ - audio:'twluannian', - enable:'phaseUse', - usable:1, - forceaudio:true, - onChooseToUse:function(event){ - if(!game.online){ - var num=1; - game.countPlayer2(current=>{ - var history=current.actionHistory; - for(var i=history.length-1;i>=0;i--){ - for(var evt of history[i].useSkill){ - if(evt.skill=='twluannian_global') num++; + twluannian: { + audio: 2, + global: "twluannian_global", + unique: true, + zhuSkill: true, + subSkill: { + global: { + audio: "twluannian", + enable: "phaseUse", + usable: 1, + forceaudio: true, + onChooseToUse: function (event) { + if (!game.online) { + var num = 1; + game.countPlayer2((current) => { + var history = current.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + for (var evt of history[i].useSkill) { + if (evt.skill == "twluannian_global") num++; } - if(history[i].isRound) break; + if (history[i].isRound) break; } }); - event.set('twluannian_num',num); + event.set("twluannian_num", num); } }, - filter:function(event,player){ - if(!event.twluannian_num) return false; - return player.group=='qun'&&player.countCards('he')>=event.twluannian_num&&game.hasPlayer(function(current){ - var target=current.storage.twxiongzheng_target; - return target&&target.isIn()&¤t!=player&¤t.hasZhuSkill('twluannian',player) - }) + filter: function (event, player) { + if (!event.twluannian_num) return false; + return ( + player.group == "qun" && + player.countCards("he") >= event.twluannian_num && + game.hasPlayer(function (current) { + var target = current.storage.twxiongzheng_target; + return ( + target && + target.isIn() && + current != player && + current.hasZhuSkill("twluannian", player) + ); + }) + ); }, - filterCard:true, - position:'he', - prompt:function(){ - var player=_status.event.player; - var num=_status.event.twluannian_num - var list=game.filterPlayer(function(current){ - return current.hasZhuSkill('twluannian',player); - }).map(i=>i.storage.twxiongzheng_target).sortBySeat(); - return '弃置'+get.cnNumber(num)+'张牌,对'+get.translation(list)+(list.length>1?'中的一人':'')+'造成1点伤害'; + filterCard: true, + position: "he", + prompt: function () { + var player = _status.event.player; + var num = _status.event.twluannian_num; + var list = game + .filterPlayer(function (current) { + return current.hasZhuSkill("twluannian", player); + }) + .map((i) => i.storage.twxiongzheng_target) + .sortBySeat(); + return ( + "弃置" + + get.cnNumber(num) + + "张牌,对" + + get.translation(list) + + (list.length > 1 ? "中的一人" : "") + + "造成1点伤害" + ); }, - selectCard:function(){ + selectCard: function () { return _status.event.twluannian_num; }, - complexSelect:true, - complexCard:true, - filterTarget:function(card,player,target){ - return game.filterPlayer(function(current){ - return current.hasZhuSkill('twluannian',player); - }).map(i=>i.storage.twxiongzheng_target).includes(target); + complexSelect: true, + complexCard: true, + filterTarget: function (card, player, target) { + return game + .filterPlayer(function (current) { + return current.hasZhuSkill("twluannian", player); + }) + .map((i) => i.storage.twxiongzheng_target) + .includes(target); }, - selectTarget:function(){ - return game.filterPlayer(function(current){ - return current.hasZhuSkill('twluannian',_status.event.player); - }).map(i=>i.storage.twxiongzheng_target).filter(i=>i&&i.isIn()).length>1?1:-1; + selectTarget: function () { + return game + .filterPlayer(function (current) { + return current.hasZhuSkill("twluannian", _status.event.player); + }) + .map((i) => i.storage.twxiongzheng_target) + .filter((i) => i && i.isIn()).length > 1 + ? 1 + : -1; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - content:function(){ + content: function () { target.damage(); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - return get.damageEffect(target,player,target); - } + ai: { + order: 7, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target); + }, }, - expose:0.25, + expose: 0.25, }, }, }, }, //鲍信 - twmutao:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.countCards('h'); + twmutao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h"); }, - content:function(){ - 'step 0' - event.togive=target.getNext(); - var cards=target.getCards('h',{name:'sha'}); - if(!cards.length){ - game.log('但',target,'没有','#y杀','!'); + content: function () { + "step 0"; + event.togive = target.getNext(); + var cards = target.getCards("h", { name: "sha" }); + if (!cards.length) { + game.log("但", target, "没有", "#y杀", "!"); event.finish(); } - 'step 1' - var cards=target.getCards('h',{name:'sha'}),card=cards.randomRemove(1)[0]; - target.give(card,event.togive); - if(cards.length){ - event.togive=event.togive.getNext(); + ("step 1"); + var cards = target.getCards("h", { name: "sha" }), + card = cards.randomRemove(1)[0]; + target.give(card, event.togive); + if (cards.length) { + event.togive = event.togive.getNext(); event.redo(); } - 'step 2' + ("step 2"); target.line(event.togive); - event.togive.damage(Math.min(2,event.togive.countCards('h',{name:'sha'})),target); + event.togive.damage(Math.min(2, event.togive.countCards("h", { name: "sha" })), target); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - var num=0,numx=target.countCards('h',{name:'sha'}),targetx=target; - for(var i=0; i0&&att2<0) num=0.25; - if(att1<0&&att2<0) num=4; - return att1*num*numx*(targetx.countCards('h',{name:'sha'})+1); + var att1 = get.attitude(player, target), + att2 = get.attitude(player, targetx); + if (att1 > 0 && att2 < 0) num = 0.25; + if (att1 < 0 && att2 < 0) num = 4; + return att1 * num * numx * (targetx.countCards("h", { name: "sha" }) + 1); }, }, }, }, - twyimou:{ - audio:2, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - return event.player.isIn()&&get.distance(player,event.player)<=1; + twyimou: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.player.isIn() && get.distance(player, event.player) <= 1; }, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)>0; + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ - 'step 0' - if(trigger.player!=player) player.addExpose(0.3); - var target=get.translation(trigger.player); - var choiceList=[ - '令'+target+'获得牌堆里的一张【杀】', - '令'+target+'将一张牌交给另一名角色,然后'+target+'摸两张牌', - '背水!'+(trigger.player!=player?'将所有手牌交给'+target+',然后':'')+'依次执行以上所有选项', + content: function () { + "step 0"; + if (trigger.player != player) player.addExpose(0.3); + var target = get.translation(trigger.player); + var choiceList = [ + "令" + target + "获得牌堆里的一张【杀】", + "令" + target + "将一张牌交给另一名角色,然后" + target + "摸两张牌", + "背水!" + + (trigger.player != player ? "将所有手牌交给" + target + ",然后" : "") + + "依次执行以上所有选项", ]; - var list=['选项一']; - if(trigger.player.countCards('h')) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(player.countCards('h')) list.push('背水!'); - else choiceList[2]=''+choiceList[2]+''; - player.chooseControl(list).set('prompt','毅谋:请选择一项').set('choiceList',choiceList).set('ai',function(){ - var evt=_status.event.getTrigger(),list=_status.event.list; - var player=_status.event.player; - var target=evt.player; - if((target.hp>=target.countCards('h')+2||target==player)&&list.includes('背水!')) return '背水!'; - if(target.countCards('h')&&list.includes('选项二')) return '选项二'; - return '选项一'; - }).set('list',list); - 'step 1' - event.choice=result.control; - if(event.choice=='背水!'&&player!=trigger.player) player.give(player.getCards('h'),trigger.player); - 'step 2' - if(event.choice!='选项二'){ - var card=get.cardPile2(function(card){ - return card.name=='sha'; + var list = ["选项一"]; + if (trigger.player.countCards("h")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (player.countCards("h")) list.push("背水!"); + else choiceList[2] = '' + choiceList[2] + ""; + player + .chooseControl(list) + .set("prompt", "毅谋:请选择一项") + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event.getTrigger(), + list = _status.event.list; + var player = _status.event.player; + var target = evt.player; + if ( + (target.hp >= target.countCards("h") + 2 || target == player) && + list.includes("背水!") + ) + return "背水!"; + if (target.countCards("h") && list.includes("选项二")) return "选项二"; + return "选项一"; + }) + .set("list", list); + ("step 1"); + event.choice = result.control; + if (event.choice == "背水!" && player != trigger.player) + player.give(player.getCards("h"), trigger.player); + ("step 2"); + if (event.choice != "选项二") { + var card = get.cardPile2(function (card) { + return card.name == "sha"; }); - if(card) trigger.player.gain(card,'gain2'); - else game.log('但牌堆里已经没有','#y杀','了!'); - if(event.choice=='选项一') event.finish(); + if (card) trigger.player.gain(card, "gain2"); + else game.log("但牌堆里已经没有", "#y杀", "了!"); + if (event.choice == "选项一") event.finish(); } - 'step 3' - if(event.choice!='选项一'){ - if(trigger.player.countCards('h')) trigger.player.chooseCardTarget({ - prompt:'将一张手牌交给另一名其他角色并摸两张牌', - filterCard:true, - forced:true, - filterTarget:lib.filter.notMe, - ai1:function(card){ - return 1/Math.max(0.1,get.value(card)); - }, - ai2:function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkillTag('nogain')) att/=9; - return 4+att; - }, - }); + ("step 3"); + if (event.choice != "选项一") { + if (trigger.player.countCards("h")) + trigger.player.chooseCardTarget({ + prompt: "将一张手牌交给另一名其他角色并摸两张牌", + filterCard: true, + forced: true, + filterTarget: lib.filter.notMe, + ai1: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + ai2: function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 9; + return 4 + att; + }, + }); else event.finish(); } - 'step 4' - var target=result.targets[0]; + ("step 4"); + var target = result.targets[0]; trigger.player.line(target); - trigger.player.give(result.cards,target); + trigger.player.give(result.cards, target); trigger.player.draw(2); }, - ai:{ - threaten:2.5, + ai: { + threaten: 2.5, }, }, //刘夫人 - twzhuidu:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.isDamaged(); + twzhuidu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.isDamaged(); }); }, - filterTarget:function(card,player,target){ - if(player==target) return false; + filterTarget: function (card, player, target) { + if (player == target) return false; return target.isDamaged(); }, - chooseButton:{ - dialog:function(event,player){ - var name=get.translation(event.result.targets[0]); - var dialog=ui.create.dialog('追妒:选择一项','hidden'); - dialog.add([[ - ['damage','对'+name+'造成1点伤害'], - ['discard','弃置'+name+'装备区里的一张牌'], - ['both','背水!若该角色为女性,弃置一张牌,然后依次执行以上所有选项'], - ],'textbutton']); + chooseButton: { + dialog: function (event, player) { + var name = get.translation(event.result.targets[0]); + var dialog = ui.create.dialog("追妒:选择一项", "hidden"); + dialog.add([ + [ + ["damage", "对" + name + "造成1点伤害"], + ["discard", "弃置" + name + "装备区里的一张牌"], + ["both", "背水!若该角色为女性,弃置一张牌,然后依次执行以上所有选项"], + ], + "textbutton", + ]); return dialog; }, - filter:function(button,player){ - var target=_status.event.getParent().result.targets[0]; - var link=button.link; - if(link=='damage') return true; - if(link=='discard') return target.countCards('e'); - return target.hasSex('female')&&player.countDiscardableCards(player,'he')>0; + filter: function (button, player) { + var target = _status.event.getParent().result.targets[0]; + var link = button.link; + if (link == "damage") return true; + if (link == "discard") return target.countCards("e"); + return target.hasSex("female") && player.countDiscardableCards(player, "he") > 0; }, - check:function(button){ - switch (button.link){ - case 'damage': + check: function (button) { + switch (button.link) { + case "damage": return 10; - case 'discard': + case "discard": return 1; - case 'both': + case "both": return 15; } }, - backup:function(links){ - var backup={ - audio:'twzhuidu', - target:_status.event.result.targets[0], - choice:links[0], - filterTarget:function(card,player,target){ - return target==lib.skill.twzhuidu_backup.target; + backup: function (links) { + var backup = { + audio: "twzhuidu", + target: _status.event.result.targets[0], + choice: links[0], + filterTarget: function (card, player, target) { + return target == lib.skill.twzhuidu_backup.target; }, - selectTarget:-1, - content:function(){ - var target=lib.skill.twzhuidu_backup.target; - var choice=lib.skill.twzhuidu_backup.choice; - if(choice!='discard') target.damage(); - if(choice!='damage') player.discardPlayerCard(target,'e',true); - } - } - if(links[0]=='both'){ - backup.filterCard=true; - backup.position='he'; + selectTarget: -1, + content: function () { + var target = lib.skill.twzhuidu_backup.target; + var choice = lib.skill.twzhuidu_backup.choice; + if (choice != "discard") target.damage(); + if (choice != "damage") player.discardPlayerCard(target, "e", true); + }, + }; + if (links[0] == "both") { + backup.filterCard = true; + backup.position = "he"; } return backup; }, - prompt:function(links){ - var name=get.translation(_status.event.result.targets[0]); - switch (links[0]){ - case 'damage': - return '对'+name+'造成1点伤害'; - case 'discard': - return '弃置'+name+'装备区里的一张牌'; - case 'both': - return '背水!弃置一张牌,然后对'+name+'造成1点伤害并弃置其装备区里的一张牌'; + prompt: function (links) { + var name = get.translation(_status.event.result.targets[0]); + switch (links[0]) { + case "damage": + return "对" + name + "造成1点伤害"; + case "discard": + return "弃置" + name + "装备区里的一张牌"; + case "both": + return ( + "背水!弃置一张牌,然后对" + name + "造成1点伤害并弃置其装备区里的一张牌" + ); } }, }, - subSkill:{ - backup:{}, + subSkill: { + backup: {}, }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(target.hasSex('female')&&target.countCards('e')&&player.countCards('he')) return -2; + ai: { + order: 7, + result: { + target: function (player, target) { + if (target.hasSex("female") && target.countCards("e") && player.countCards("he")) + return -2; return -1; }, }, }, }, - twshigong:{ - audio:2, - trigger:{player:'dying'}, - filter:function(event,player){ - var target=_status.currentPhase; - return player.hp<=0&&target&&target.isIn()&&target!=player; + twshigong: { + audio: 2, + trigger: { player: "dying" }, + filter: function (event, player) { + var target = _status.currentPhase; + return player.hp <= 0 && target && target.isIn() && target != player; }, - skillAnimation:true, - animationColor:'gray', - limited:true, - logTarget:function(event,player){ + skillAnimation: true, + animationColor: "gray", + limited: true, + logTarget: function (event, player) { return _status.currentPhase; }, - content:function(){ - 'step 0' - player.awakenSkill('twshigong'); - var target=_status.currentPhase; - if(target.hp<=0) event._result={bool:false}; - else target.chooseToDiscard('h',target.hp,get.translation(player)+'对你发动了【示恭】,是否弃置'+get.cnNumber(target.hp)+'张手牌?','若如此做,其将体力回复至1点;或者点击“取消”加1点体力上限并回复1点体力,摸一张牌,然后其将体力回复至体力上限').set('ai',card=>{ - if(!_status.event.goon) return 0; - return 7-get.value(card); - }).set('goon',get.attitude(target,player)>=0); - 'step 1' - var target=_status.currentPhase; - if(result.bool){ - var num=1-player.hp; - if(num>0) player.recover(num); + content: function () { + "step 0"; + player.awakenSkill("twshigong"); + var target = _status.currentPhase; + if (target.hp <= 0) event._result = { bool: false }; + else + target + .chooseToDiscard( + "h", + target.hp, + get.translation(player) + + "对你发动了【示恭】,是否弃置" + + get.cnNumber(target.hp) + + "张手牌?", + "若如此做,其将体力回复至1点;或者点击“取消”加1点体力上限并回复1点体力,摸一张牌,然后其将体力回复至体力上限" + ) + .set("ai", (card) => { + if (!_status.event.goon) return 0; + return 7 - get.value(card); + }) + .set("goon", get.attitude(target, player) >= 0); + ("step 1"); + var target = _status.currentPhase; + if (result.bool) { + var num = 1 - player.hp; + if (num > 0) player.recover(num); event.finish(); - } - else{ + } else { target.gainMaxHp(); target.recover(); target.draw(); } - 'step 2' - var num=player.maxHp-player.hp; - if(num>0) player.recover(num); + ("step 2"); + var num = player.maxHp - player.hp; + if (num > 0) player.recover(num); }, }, //王淩 - twmibei:{ - audio:'mibei', - trigger:{player:'useCardAfter'}, - group:['twmibei_mark','twmibei_fail'], - forced:true, - locked:false, - direct:true, - dutySkill:true, - derivation:'twmouli', - filter:function(event,player){ - var map={basic:0,trick:0,equip:0}; - for(var name of player.getStorage('twmibei')){ - var type=get.type2(name); - if(typeof map[type]=='number') map[type]++; + twmibei: { + audio: "mibei", + trigger: { player: "useCardAfter" }, + group: ["twmibei_mark", "twmibei_fail"], + forced: true, + locked: false, + direct: true, + dutySkill: true, + derivation: "twmouli", + filter: function (event, player) { + var map = { basic: 0, trick: 0, equip: 0 }; + for (var name of player.getStorage("twmibei")) { + var type = get.type2(name); + if (typeof map[type] == "number") map[type]++; } - for(var i in map){ - if(map[i]<2) return false; + for (var i in map) { + if (map[i] < 2) return false; } return true; }, - content:function(){ - player.awakenSkill('twmibei'); - player.logSkill('twmibei_achieve'); - game.log(player,'成功完成使命'); - player.addSkills('twmouli'); + content: function () { + player.awakenSkill("twmibei"); + player.logSkill("twmibei_achieve"); + game.log(player, "成功完成使命"); + player.addSkills("twmouli"); }, - intro:{content:'已使用牌名:$'}, - subSkill:{ - achieve:{ - audio:'mibei1', - skillAnimation:true, - animationColor:'water', + intro: { content: "已使用牌名:$" }, + subSkill: { + achieve: { + audio: "mibei1", + skillAnimation: true, + animationColor: "water", }, - mark:{ - trigger:{player:'useCard1'}, - filter:function(event,player){ - return !player.getStorage('twmibei').includes(event.card.name); + mark: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + return !player.getStorage("twmibei").includes(event.card.name); }, - charlotte:true, - forced:true, - silent:true, - dutySkill:true, - content:function(){ - player.markAuto('twmibei',[trigger.card.name]); + charlotte: true, + forced: true, + silent: true, + dutySkill: true, + content: function () { + player.markAuto("twmibei", [trigger.card.name]); }, }, - fail:{ - audio:'mibei2', - trigger:{player:'phaseUseEnd'}, - forced:true, - filter:function(event,player){ - return !player.getHistory('useCard').length; + fail: { + audio: "mibei2", + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return !player.getHistory("useCard").length; }, - content:function(){ - game.log(player,'使命失败'); + content: function () { + game.log(player, "使命失败"); delete player.storage.twmibei; - player.addTempSkill('twmibei_less'); - player.addMark('twmibei_less',1,false); + player.addTempSkill("twmibei_less"); + player.addMark("twmibei_less", 1, false); }, }, - less:{ - charlotte:true, - marktext:'缚', - intro:{content:'本回合手牌上限-#'}, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('twmibei_less'); + less: { + charlotte: true, + marktext: "缚", + intro: { content: "本回合手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("twmibei_less"); }, }, }, }, }, - twxingqi:{ - audio:'xingqi', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - var num=0; - game.countPlayer(function(current){ - num+=current.countCards('ej'); + twxingqi: { + audio: "xingqi", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var num = 0; + game.countPlayer(function (current) { + num += current.countCards("ej"); }); - return num>player.hp; + return num > player.hp; }, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - player.awakenSkill('twxingqi'); + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + player.awakenSkill("twxingqi"); player.recover(); - if(!player.awakenedSkills.includes('twmibei')){ - var list=['basic','equip','trick'],cards=[]; - for(var i of list){ - var card=get.cardPile2(function(card){ - return get.type(card)==i; + if (!player.awakenedSkills.includes("twmibei")) { + var list = ["basic", "equip", "trick"], + cards = []; + for (var i of list) { + var card = get.cardPile2(function (card) { + return get.type(card) == i; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); - } - else player.addSkill('twxingqi_range'); + if (cards.length) player.gain(cards, "gain2"); + } else player.addSkill("twxingqi_range"); }, - subSkill:{ - range:{ - charlotte:true, - mark:true, - marktext:'启', - mod:{ - targetInRange:()=>true, + subSkill: { + range: { + charlotte: true, + mark: true, + marktext: "启", + mod: { + targetInRange: () => true, }, - intro:{content:'使用牌无距离限制'}, + intro: { content: "使用牌无距离限制" }, }, }, }, - twmouli:{ - audio:'mouli', - enable:'chooseToUse', - filter:function(event,player){ - if(event.type=='wuxie') return false; - if(player.hasSkill('twmouli_used')) return false; - if(!Array.isArray(event.twmouli)) return false; - for(var card of event.twmouli){ - if(event.filterCard(card,player,event)) return true; + twmouli: { + audio: "mouli", + enable: "chooseToUse", + filter: function (event, player) { + if (event.type == "wuxie") return false; + if (player.hasSkill("twmouli_used")) return false; + if (!Array.isArray(event.twmouli)) return false; + for (var card of event.twmouli) { + if (event.filterCard(card, player, event)) return true; } return false; }, - onChooseToUse:function(event){ - if(game.online||!event.player.hasSkill('twmouli')) return; - var cards=[]; - for(var i=0;ifalse, - selectCard:-1, - viewAs:{name:links[0].name,isCard:true,cards:[links[0]]}, - popname:true, - precontent:function(){ - player.logSkill('twmouli'); - player.addTempSkill('twmouli_used'); + audio: "mouli", + filterCard: () => false, + selectCard: -1, + viewAs: { name: links[0].name, isCard: true, cards: [links[0]] }, + popname: true, + precontent: function () { + player.logSkill("twmouli"); + player.addTempSkill("twmouli_used"); delete event.result.skill; - var name=event.result.card.name; - event.result.cards=event.result.card.cards; - event.result.card=get.autoViewAs(event.result.cards[0]); - event.result.card.name=name; - var next=game.createEvent('twmouli_update'); + var name = event.result.card.name; + event.result.cards = event.result.card.cards; + event.result.card = get.autoViewAs(event.result.cards[0]); + event.result.card.name = name; + var next = game.createEvent("twmouli_update"); event.next.remove(next); event.getParent().after.push(next); - next.setContent(function(){game.updateRoundNumber()}); + next.setContent(function () { + game.updateRoundNumber(); + }); }, - } + }; }, - prompt:function(links,player){ - return '使用牌堆中的'+get.translation(links); + prompt: function (links, player) { + return "使用牌堆中的" + get.translation(links); }, }, - hiddenCard:function(player,name){ - return get.type(name)=='basic'&&!player.getStat('skill').twmouli; + hiddenCard: function (player, name) { + return get.type(name) == "basic" && !player.getStat("skill").twmouli; }, - subSkill:{ - used:{charlotte:true}, + subSkill: { + used: { charlotte: true }, }, - ai:{ - effect:{ - target:function(card,player,target,effect){ - if(get.tag(card,'respondShan')) return 0.7; - if(get.tag(card,'respondSha')) return 0.7; + ai: { + effect: { + target: function (card, player, target, effect) { + if (get.tag(card, "respondShan")) return 0.7; + if (get.tag(card, "respondSha")) return 0.7; }, }, - order:11, - respondSha:true, - respondShan:true, - fireAttack:true, - skillTagFilter:function(player,tag,arg){ - if(arg=='respond') return false; - var list=[]; - for(var i=0;icards.some(card=>get.type2(card)==type)); - let fs=game.filterPlayer(i=>get.attitude(_status.event.player,i)>0).sort((a,b)=>{ - if(a===player){//尽量把player往前放 - if(a.hpget.attitude(_status.event.player,i)<0).sort((a,b)=>a.hp-b.hp), - types=list.map(type=>{ - let num=0; - for(let i of event.cards){ - if(get.type2(i)==type) num++; - } - return [type,num]; - }).sort((a,b)=>b[1]-a[1]); - event.tempCache={ - max:-Infinity, - tars:[] + twxingluan: { + audio: "xinfu_xingluan", + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + event.cards = game.cardsGotoOrdering(get.cards(6)).cards; + event.list = []; + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + var str; + if (player == game.me && !_status.auto) str = "兴乱:选择分配一种类别的牌"; + else str = "兴乱"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + event.time = get.utc(); + game.addVideo("showCards", player, ["兴乱", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + ("step 1"); + var list = ["basic", "trick", "equip"].filter((type) => + cards.some((card) => get.type2(card) == type) + ); + let fs = game + .filterPlayer((i) => get.attitude(_status.event.player, i) > 0) + .sort((a, b) => { + if (a === player) { + //尽量把player往前放 + if (a.hp < b.hp) return 1; + return -1; + } + if (b === player) { + if (b.hp < a.hp) return -1; + return 1; + } + return b.hp - a.hp; + }), + es = game + .filterPlayer((i) => get.attitude(_status.event.player, i) < 0) + .sort((a, b) => a.hp - b.hp), + types = list + .map((type) => { + let num = 0; + for (let i of event.cards) { + if (get.type2(i) == type) num++; + } + return [type, num]; + }) + .sort((a, b) => b[1] - a[1]); + event.tempCache = { + max: -Infinity, + tars: [], }; - for(let idx=0;idx=type){//都分给敌人 - e=-type; - while(temp= type) { + //都分给敌人 + e = -type; + while (temp < es.length && temp < type) { + e += 10 / (2 + es[temp].hp); tars.push(es[temp]); temp++; } - if(e>event.tempCache.max){ - event.tempCache.type=types[idx][0]; - event.tempCache.max=e; - event.tempCache.tars=tars.slice(0); + if (e > event.tempCache.max) { + event.tempCache.type = types[idx][0]; + event.tempCache.max = e; + event.tempCache.tars = tars.slice(0); delete event.tempCache.more; } } - if(fs.length*3>=type){//都分给队友 - tars=[]; - f=type-10/(2+fs[0].hp); - temp=type-Math.max(3,type);//让血厚的尽可能多拿 - if(temp){ - if(fs.length<3){ + if (fs.length * 3 >= type) { + //都分给队友 + tars = []; + f = type - 10 / (2 + fs[0].hp); + temp = type - Math.max(3, type); //让血厚的尽可能多拿 + if (temp) { + if (fs.length < 3) { tars.push(fs[1]); - if(temp>=3) f-=10/(2+fs[1].hp); - } - else{ - if(player!==fs[0]){ + if (temp >= 3) f -= 10 / (2 + fs[1].hp); + } else { + if (player !== fs[0]) { tars.push(player); - temp-=Math.max(2,temp); + temp -= Math.max(2, temp); } - if(temp) tars.addArray(fs.filter(i=>fs[0]!==i&&player!==i).sort((a,b)=>{ - return get.attitude(_status.event.player,b)-get.attitude(_status.event.player,a); - }).slice(temp<3?-1:-2)); + if (temp) + tars.addArray( + fs + .filter((i) => fs[0] !== i && player !== i) + .sort((a, b) => { + return ( + get.attitude(_status.event.player, b) - + get.attitude(_status.event.player, a) + ); + }) + .slice(temp < 3 ? -1 : -2) + ); } } - if(f>event.tempCache.max){ - event.tempCache.type=types[idx][0]; - event.tempCache.max=f; - event.tempCache.more=fs[0]; - event.tempCache.tars=tars.slice(0); + if (f > event.tempCache.max) { + event.tempCache.type = types[idx][0]; + event.tempCache.max = f; + event.tempCache.more = fs[0]; + event.tempCache.tars = tars.slice(0); } } } - player.chooseControl(list).set('ai',function(){ - return _status.event.type; - }).set('type',event.tempCache.type); - 'step 2' - game.broadcastAll('closeDialog',event.videoId); - event.cardsx=[]; - var type=result.control; - for(var j of cards){ - if(type==get.type2(j)) event.cardsx.push(j); + player + .chooseControl(list) + .set("ai", function () { + return _status.event.type; + }) + .set("type", event.tempCache.type); + ("step 2"); + game.broadcastAll("closeDialog", event.videoId); + event.cardsx = []; + var type = result.control; + for (var j of cards) { + if (type == get.type2(j)) event.cardsx.push(j); } - var time=1000-(get.utc()-event.time); - if(time>0) game.delay(0,time); - player.$gain2(event.cardsx,false); + var time = 1000 - (get.utc() - event.time); + if (time > 0) game.delay(0, time); + player.$gain2(event.cardsx, false); game.delayx(); - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - event.num=0; - 'step 3' - if(event.cardsx.length>1){ - player.chooseCardButton('兴乱:请选择要分配的牌',true,event.cardsx,[1,Math.min(3,event.cardsx.length)]).set('ai',function(button){ - if(ui.selected.buttons.length==0) return get.buttonValue(button); - return 0; + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - } - else if(event.cardsx.length==1){ - event._result={links:event.cardsx.slice(0),bool:true}; - } - else{ + event.given_map = {}; + event.num = 0; + ("step 3"); + if (event.cardsx.length > 1) { + player + .chooseCardButton("兴乱:请选择要分配的牌", true, event.cardsx, [ + 1, + Math.min(3, event.cardsx.length), + ]) + .set("ai", function (button) { + if (ui.selected.buttons.length == 0) return get.buttonValue(button); + return 0; + }); + } else if (event.cardsx.length == 1) { + event._result = { links: event.cardsx.slice(0), bool: true }; + } else { event.goto(6); } - 'step 4' - if(result.bool){ - var cards=result.links; - event.togive=cards.slice(0); - player.chooseTarget('选择获得'+get.translation(cards)+'的角色',event.cardsx.length==1,(card,player,target)=>{ - var map=_status.event.getParent().given_map; - var togive=_status.event.getParent().togive; - return (map[target.playerid]||[]).length+togive.length<=3; - }).set('ai',function(target){ - let targets=_status.event.targets,att=get.attitude(_status.event.player,target); - if(targets.length){ - if(targets.includes(target)) return Math.max(1,att*_status.event.value); - return 0; - } - return att*_status.event.value; - }).set('value',cards.reduce((p,c)=>p+get.value(c,player,'raw'),0)).set('more',event.tempCache.more).set('targets',function(){ - let arr=[],arr2=[]; - if(event.tempCache.more&&(event.given_map[event.tempCache.more.playerid]||[]).length+cards.length<=3) return [event.tempCache.more]; - for(let cur of event.tempCache.tars){ - let map=(event.given_map[cur.playerid]||[]).length; - if(map+cards.length<=3){ - if(map) arr2.push(cur); - else arr.push(cur); + ("step 4"); + if (result.bool) { + var cards = result.links; + event.togive = cards.slice(0); + player + .chooseTarget( + "选择获得" + get.translation(cards) + "的角色", + event.cardsx.length == 1, + (card, player, target) => { + var map = _status.event.getParent().given_map; + var togive = _status.event.getParent().togive; + return (map[target.playerid] || []).length + togive.length <= 3; } - } - if(arr.length) return arr; - return arr2; - }()); + ) + .set("ai", function (target) { + let targets = _status.event.targets, + att = get.attitude(_status.event.player, target); + if (targets.length) { + if (targets.includes(target)) + return Math.max(1, att * _status.event.value); + return 0; + } + return att * _status.event.value; + }) + .set( + "value", + cards.reduce((p, c) => p + get.value(c, player, "raw"), 0) + ) + .set("more", event.tempCache.more) + .set( + "targets", + (function () { + let arr = [], + arr2 = []; + if ( + event.tempCache.more && + (event.given_map[event.tempCache.more.playerid] || []).length + + cards.length <= + 3 + ) + return [event.tempCache.more]; + for (let cur of event.tempCache.tars) { + let map = (event.given_map[cur.playerid] || []).length; + if (map + cards.length <= 3) { + if (map) arr2.push(cur); + else arr.push(cur); + } + } + if (arr.length) return arr; + return arr2; + })() + ); } - 'step 5' - if(result.bool){ + ("step 5"); + if (result.bool) { event.cardsx.removeArray(event.togive); - if(result.targets.length){ - var id=result.targets[0].playerid,map=event.given_map; - if(!map[id]) map[id]=[]; + if (result.targets.length) { + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; map[id].addArray(event.togive); } - if(event.cardsx.length>0) event.goto(3); + if (event.cardsx.length > 0) event.goto(3); + } else event.goto(3); + ("step 6"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - else event.goto(3); - 'step 6' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); - } - var list=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - if(player==source) event.num+=event.given_map[i].length; - player.line(source,'green'); - game.log(source,'获得了',event.given_map[i]); - list.push([source,event.given_map[i]]); + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (player == source) event.num += event.given_map[i].length; + player.line(source, "green"); + game.log(source, "获得了", event.given_map[i]); + list.push([source, event.given_map[i]]); } game.loseAsync({ - gain_list:list, - giver:player, - animate:'gain2', - }).setContent('gaincardMultiple'); - 'step 7' - var list=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - if(event.given_map[i].length>=num) list.push(source); + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); + ("step 7"); + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (event.given_map[i].length >= num) list.push(source); } list.sortBySeat(); player.line(list); - for(var i of list){ + for (var i of list) { i.loseHp(); } }, }, //许靖 - twboming:{ - audio:'boming', - enable:'phaseUse', - usable:2, - filter:function(event,player){ - return player.countCards('he'); + twboming: { + audio: "boming", + enable: "phaseUse", + usable: 2, + filter: function (event, player) { + return player.countCards("he"); }, - filterCard:true, - position:'he', - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - content:function(){ - player.give(cards,target); + filterCard: true, + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); }, - check:function(card){ - return 5-get.value(card); + check: function (card) { + return 5 - get.value(card); }, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(!ui.selected.cards.length) return 0; - var card=ui.selected.cards[0]; - if(get.attitude(player,target)<0&&player.hasSkill('twejian')){ - var dam=get.damageEffect(target,player,target); - if(dam>0) return dam; - var type=get.type(card,target),ts=target.getCards('he',function(card){ - return get.type(card)==type; - }); - if(ts.length){ - var val=get.value(ts,target); - if(val>get.value(card)) return -Math.max(1,val); + ai: { + order: 10, + result: { + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var card = ui.selected.cards[0]; + if (get.attitude(player, target) < 0 && player.hasSkill("twejian")) { + var dam = get.damageEffect(target, player, target); + if (dam > 0) return dam; + var type = get.type(card, target), + ts = target.getCards("he", function (card) { + return get.type(card) == type; + }); + if (ts.length) { + var val = get.value(ts, target); + if (val > get.value(card)) return -Math.max(1, val); return 0; } } - return get.value(card,target)/1.5; + return get.value(card, target) / 1.5; }, }, }, - group:'twboming_draw', - subSkill:{ - draw:{ - audio:'boming', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - var num=0; - for(var target of game.filterPlayer(i=>i!=player)){ - target.getHistory('gain',evt=>num+=evt.cards.length); - if(num>1) return true; + group: "twboming_draw", + subSkill: { + draw: { + audio: "boming", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + var num = 0; + for (var target of game.filterPlayer((i) => i != player)) { + target.getHistory("gain", (evt) => (num += evt.cards.length)); + if (num > 1) return true; } return false; }, - content:function(){ + content: function () { player.draw(2); }, }, }, }, - twejian:{ - audio:'ejian', - trigger:{ - global:['gainAfter','loseAsyncAfter'] + twejian: { + audio: "ejian", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - filter:function(event,player){ - if(event.name=='gain'){ - var cards=event.getg(event.player); - if(!cards.length) return false; - var cards2=event.getl(player).cards2; - for(var i of cards2){ - if(cards.includes(i)&&event.player.countCards('he',card=>{ - return card!=i&&get.type2(card)==get.type2(i); - })) return true; + filter: function (event, player) { + if (event.name == "gain") { + var cards = event.getg(event.player); + if (!cards.length) return false; + var cards2 = event.getl(player).cards2; + for (var i of cards2) { + if ( + cards.includes(i) && + event.player.countCards("he", (card) => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; } return false; - } - else{ - if(event.type!='gain') return false; - var cards=event.getl(player).cards2; - if(!cards.length) return false; - return game.hasPlayer(current=>{ - if(current==player) return false; - var cardsx=event.getg(current); - for(var i of cardsx){ - if(cards.includes(i)&¤t.countCards('he',card=>{ - return card!=i&&get.type2(card)==get.type2(i); - })) return true; + } else { + if (event.type != "gain") return false; + var cards = event.getl(player).cards2; + if (!cards.length) return false; + return game.hasPlayer((current) => { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if ( + cards.includes(i) && + current.countCards("he", (card) => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; } return false; }); } }, - logTarget:function(event,player){ - if(event.name=='gain') return event.player; - else{ - var cards=event.getl(player).cards2; - return game.filterPlayer(current=>{ - if(current==player) return false; - var cardsx=event.getg(current); - for(var i of cardsx){ - if(cards.includes(i)&¤t.countCards('he',card=>{ - return card!=i&&get.type2(card)==get.type2(i); - })) return true; + logTarget: function (event, player) { + if (event.name == "gain") return event.player; + else { + var cards = event.getl(player).cards2; + return game.filterPlayer((current) => { + if (current == player) return false; + var cardsx = event.getg(current); + for (var i of cardsx) { + if ( + cards.includes(i) && + current.countCards("he", (card) => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; } return false; }); } }, - direct:true, - content:function(){ - 'step 0' - if(trigger.name=='gain') event.targets=[trigger.player]; - else{ - var cards=trigger.getl(player).cards2; - event.targets=game.filterPlayer(current=>{ - if(current==player) return false; - var cardsx=trigger.getg(current); - for(var i of cardsx){ - if(cards.includes(i)&¤t.countCards('he',card=>{ - return card!=i&&get.type2(card)==get.type2(i); - })) return true; + direct: true, + content: function () { + "step 0"; + if (trigger.name == "gain") event.targets = [trigger.player]; + else { + var cards = trigger.getl(player).cards2; + event.targets = game.filterPlayer((current) => { + if (current == player) return false; + var cardsx = trigger.getg(current); + for (var i of cardsx) { + if ( + cards.includes(i) && + current.countCards("he", (card) => { + return card != i && get.type2(card) == get.type2(i); + }) + ) + return true; } return false; }); } - 'step 1' - var target=event.targets.shift(); - event.target=target; - player.chooseBool(get.prompt('twejian',target),'当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌').set('ai',()=>{ - return get.attitude(player,_status.event.getParent().target)<0; - }); - 'step 2' - if(result.bool){ - player.logSkill('twejian',target); - var cards=trigger.getg(target); - event.cards=cards; - event.cardType=[]; - for(var card of cards){ - event.cardType.add(get.type(card,'trick',target)); + ("step 1"); + var target = event.targets.shift(); + event.target = target; + player + .chooseBool( + get.prompt("twejian", target), + "当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌" + ) + .set("ai", () => { + return get.attitude(player, _status.event.getParent().target) < 0; + }); + ("step 2"); + if (result.bool) { + player.logSkill("twejian", target); + var cards = trigger.getg(target); + event.cards = cards; + event.cardType = []; + for (var card of cards) { + event.cardType.add(get.type(card, "trick", target)); } - var list=['选项一','选项二']; - target.chooseControl(list).set('prompt','恶荐:请选择一项').set('choiceList',[ - '受到1点伤害', - '弃置所有除'+get.translation(cards)+'外的'+get.translation(event.cardType)+'牌', - ]).set('ai',function(){ - var player=_status.event.player; - var types=_status.event.cardType,cards=player.getCards('he',function(card){ - return types.includes(get.type2(card)); - }); - if(cards.length==1) return '选项二'; - if(cards.length>=2){ - for(var i=0; i= 2) { + for (var i = 0; i < cards.length; i++) { + if (get.tag(cards[i], "save")) return "选项一"; + } } - } - if(player.hp==1) return '选项二'; - for(var i=0; i=8) return '选项一'; - } - if(cards.length>2&&player.hp>2) return '选项一'; - if(cards.length>3) return '选项一'; - return '选项二'; - }).set('cardType',event.cardType); - } - else event.goto(4); - 'step 3' - if(result.control=='选项一') target.damage(); - else target.discard(target.getCards('he',card=>{ - return event.cardType.includes(get.type2(card))&&!cards.includes(card); - })); - 'step 4' - if(event.targets.length>0) event.goto(1); + if (player.hp == 1) return "选项二"; + for (var i = 0; i < cards.length; i++) { + if (get.value(cards[i]) >= 8) return "选项一"; + } + if (cards.length > 2 && player.hp > 2) return "选项一"; + if (cards.length > 3) return "选项一"; + return "选项二"; + }) + .set("cardType", event.cardType); + } else event.goto(4); + ("step 3"); + if (result.control == "选项一") target.damage(); + else + target.discard( + target.getCards("he", (card) => { + return event.cardType.includes(get.type2(card)) && !cards.includes(card); + }) + ); + ("step 4"); + if (event.targets.length > 0) event.goto(1); else event.finish(); }, - ai:{ - expose:0.3, + ai: { + expose: 0.3, }, }, //张飞 - twxuhe:{ - audio:'retishen', - trigger:{player:'shaMiss'}, - check:function(event,player){ - return get.attitude(player,event.target)<0; + twxuhe: { + audio: "retishen", + trigger: { player: "shaMiss" }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - logTarget:'target', - content:function(){ - 'step 0' - trigger.target.chooseControl().set('choiceList',[ - '受到'+get.translation(player)+'对你造成的1点伤害', - '令'+get.translation(player)+'使用的下一张牌对你造成的伤害+2' - ]).set('ai',function(){ - var target=_status.event.player,player=_status.event.getParent().player; - if(target.hp<=3&&target.hp>1&&player.countCards('hs',function(card){ - return get.tag(card,'damage')&&player.canUse(card,target); - })>0) return 0; - return 1; - }); - 'step 1' - var target=trigger.target; - switch (result.index){ + logTarget: "target", + content: function () { + "step 0"; + trigger.target + .chooseControl() + .set("choiceList", [ + "受到" + get.translation(player) + "对你造成的1点伤害", + "令" + get.translation(player) + "使用的下一张牌对你造成的伤害+2", + ]) + .set("ai", function () { + var target = _status.event.player, + player = _status.event.getParent().player; + if ( + target.hp <= 3 && + target.hp > 1 && + player.countCards("hs", function (card) { + return get.tag(card, "damage") && player.canUse(card, target); + }) > 0 + ) + return 0; + return 1; + }); + ("step 1"); + var target = trigger.target; + switch (result.index) { case 0: - player.line(target,'fire'); + player.line(target, "fire"); target.damage(); break; case 1: - target.line(player,'fire'); - player.storage.twxuhe_damage=target; - trigger.getParent().twxuhe=true; - player.addTempSkill('twxuhe_damage'); + target.line(player, "fire"); + player.storage.twxuhe_damage = target; + trigger.getParent().twxuhe = true; + player.addTempSkill("twxuhe_damage"); break; } }, - subSkill:{ - damage:{ - charlotte:true, - onremove:true, - mark:true, - intro:{content:'本回合使用的下一张牌对$造成伤害时,此伤害+2'}, - trigger:{ - source:'damageBegin1', - player:'useCardAfter', + subSkill: { + damage: { + charlotte: true, + onremove: true, + mark: true, + intro: { content: "本回合使用的下一张牌对$造成伤害时,此伤害+2" }, + trigger: { + source: "damageBegin1", + player: "useCardAfter", }, - direct:true, - filter:function(event,player){ - if(event.name=='useCard') return !event.twxuhe; - if(!event.card) return false; - var evt=event.getParent(2); - var history=player.getHistory('useCard'); - return evt.name=='useCard'&&history[history.indexOf(evt)-1].twxuhe; + direct: true, + filter: function (event, player) { + if (event.name == "useCard") return !event.twxuhe; + if (!event.card) return false; + var evt = event.getParent(2); + var history = player.getHistory("useCard"); + return evt.name == "useCard" && history[history.indexOf(evt) - 1].twxuhe; }, - content:function(){ - if(trigger.name!='useCard') trigger.num+=2; - player.removeSkill('twxuhe_damage'); + content: function () { + if (trigger.name != "useCard") trigger.num += 2; + player.removeSkill("twxuhe_damage"); }, - } + }, }, }, //薛综 - twjiexun:{ - intro:{content:'已发动#次'}, - audio:'jiexun', - trigger:{player:'phaseJieshuBegin'}, - onremove:true, - direct:true, - derivation:['twfunanx','twjiexunx'], - content:function(){ - 'step 0' - var suits={}; - game.countPlayer(current=>{ - for(var card of current.getCards('ej')) { - if(typeof suits[get.suit(card)]!='number') suits[get.suit(card)]=0; + twjiexun: { + intro: { content: "已发动#次" }, + audio: "jiexun", + trigger: { player: "phaseJieshuBegin" }, + onremove: true, + direct: true, + derivation: ["twfunanx", "twjiexunx"], + content: function () { + "step 0"; + var suits = {}; + game.countPlayer((current) => { + for (var card of current.getCards("ej")) { + if (typeof suits[get.suit(card)] != "number") suits[get.suit(card)] = 0; suits[get.suit(card)]++; } }); - var choices=lib.suit.slice(); - choices.push('cancel2'); - var str=lib.suit.map(suit=>{ - return get.translation(suit)+':'+get.cnNumber(suits[suit]||0)+'张' - }).join(';'); - player.chooseControl(choices).set('prompt',get.prompt('twjiexun')+'(已发动过'+get.cnNumber(player.countMark('twjiexun'))+'次)').set('ai',function(){ - var player=_status.event.player; - var map={}; - game.countPlayer(current=>{ - for(var card of current.getCards('ej')) { - if(typeof map[get.suit(card)]!='number') map[get.suit(card)]=0; - map[get.suit(card)]++; - } + var choices = lib.suit.slice(); + choices.push("cancel2"); + var str = lib.suit + .map((suit) => { + return get.translation(suit) + ":" + get.cnNumber(suits[suit] || 0) + "张"; + }) + .join(";"); + player + .chooseControl(choices) + .set( + "prompt", + get.prompt("twjiexun") + + "(已发动过" + + get.cnNumber(player.countMark("twjiexun")) + + "次)" + ) + .set("ai", function () { + var player = _status.event.player; + var map = {}; + game.countPlayer((current) => { + for (var card of current.getCards("ej")) { + if (typeof map[get.suit(card)] != "number") map[get.suit(card)] = 0; + map[get.suit(card)]++; + } + }); + for (var suit in map) map[suit] = Math.abs(map[suit]); + var bool = game.hasPlayer( + (current) => get.attitude(player, current) > 0 && player != current + ); + var list = lib.suit + .slice() + .sort((a, b) => (bool ? 1 : -1) * ((map[b] || 0) - (map[a] || 0))); + if ((bool && map[list[0]] > 0) || !bool || player.hasMark("twjiexun")) + return list[0]; + return "cancel2"; + }) + .set("prompt2", get.skillInfoTranslation("twjiexun", player) + "
    " + str); + ("step 1"); + if (result.control != "cancel2") { + var suit = result.control; + event.suit = suit; + var num1 = game.countPlayer(function (current) { + return current.countCards("ej", { suit: suit }); }); - for(var suit in map) map[suit]=Math.abs(map[suit]); - var bool=game.hasPlayer(current=>get.attitude(player,current)>0&&player!=current); - var list=lib.suit.slice().sort((a,b)=>(bool?1:-1)*((map[b]||0)-(map[a]||0))); - if(bool&&map[list[0]]>0||!bool||player.hasMark('twjiexun')) return list[0]; - return 'cancel2'; - }).set('prompt2',get.skillInfoTranslation('twjiexun',player)+'
    '+str); - 'step 1' - if(result.control!='cancel2'){ - var suit=result.control; - event.suit=suit; - var num1=game.countPlayer(function(current){ - return current.countCards('ej',{suit:suit}); - }); - var num2=player.countMark('twjiexun'); - event.num1=num1; - event.num2=num2; - var str='令一名其他角色摸'+get.cnNumber(num1)+'张牌'; - if(num2) str+=',然后弃置'+get.cnNumber(num2)+'张牌'; - player.chooseTarget('请选择【诫训】的目标',str,lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - return _status.event.eff*get.sgn(att)+att/114514; - }).set('eff',num1>=num2&&num1>0?1:-1); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twjiexun',target); - if(player.hasMark('twjiexun')||event.num1) player.addExpose(0.2); + var num2 = player.countMark("twjiexun"); + event.num1 = num1; + event.num2 = num2; + var str = "令一名其他角色摸" + get.cnNumber(num1) + "张牌"; + if (num2) str += ",然后弃置" + get.cnNumber(num2) + "张牌"; + player + .chooseTarget("请选择【诫训】的目标", str, lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + return _status.event.eff * get.sgn(att) + att / 114514; + }) + .set("eff", num1 >= num2 && num1 > 0 ? 1 : -1); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twjiexun", target); + if (player.hasMark("twjiexun") || event.num1) player.addExpose(0.2); player.popup(event.suit); - game.log(player,'选择了','#y'+get.translation(event.suit)); - player.addMark('twjiexun',1,false); - if(event.num1) target.draw(event.num1); - } + game.log(player, "选择了", "#y" + get.translation(event.suit)); + player.addMark("twjiexun", 1, false); + if (event.num1) target.draw(event.num1); + } else event.finish(); + ("step 3"); + if (event.num2) target.chooseToDiscard(event.num2, true, "he"); else event.finish(); - 'step 3' - if(event.num2) target.chooseToDiscard(event.num2,true,'he'); - else event.finish(); - 'step 4' - if(result.bool&&result.autochoose&&result.cards.length==result.rawcards.length&&!player.hasSkill('funan_jiexun')){ - player.chooseControl().set('choiceList',[ - '摸'+get.cnNumber(event.num2)+'张牌,将【诫训】的发动次数归零', - '修改【复难】和【诫训】' - ]).set('ai',()=>_status.event.choice).set('prompt','诫训:选择一项').set('choice',event.num2>=4?0:(event.num2<=1?1:[0,1].randomGet())); - } - else event.finish(); - 'step 5' - if(result.index==0){ + ("step 4"); + if ( + result.bool && + result.autochoose && + result.cards.length == result.rawcards.length && + !player.hasSkill("funan_jiexun") + ) { + player + .chooseControl() + .set("choiceList", [ + "摸" + get.cnNumber(event.num2) + "张牌,将【诫训】的发动次数归零", + "修改【复难】和【诫训】", + ]) + .set("ai", () => _status.event.choice) + .set("prompt", "诫训:选择一项") + .set("choice", event.num2 >= 4 ? 0 : event.num2 <= 1 ? 1 : [0, 1].randomGet()); + } else event.finish(); + ("step 5"); + if (result.index == 0) { player.draw(event.num2); - player.removeMark('twjiexun',player.countMark('twjiexun'),false); - game.log(player,'归零了','#g【诫训】','的发动次数'); - } - else { - game.log(player,'修改了','#g【复难】','和','#g【诫训】'); - player.addSkill('funan_jiexun'); + player.removeMark("twjiexun", player.countMark("twjiexun"), false); + game.log(player, "归零了", "#g【诫训】", "的发动次数"); + } else { + game.log(player, "修改了", "#g【复难】", "和", "#g【诫训】"); + player.addSkill("funan_jiexun"); } }, }, //张宁 - twxingzhui:{ - audio:2, - enable:'phaseUse', - usable:1, - mahouSkill:true, - filter:function(event,player){ - return !player.hasSkill('twxingzhui_mahou'); + twxingzhui: { + audio: 2, + enable: "phaseUse", + usable: 1, + mahouSkill: true, + filter: function (event, player) { + return !player.hasSkill("twxingzhui_mahou"); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseHp(); - player.chooseControl('1回合','2回合','3回合').set('prompt','请选择施法时长').set('ai',function(){ - return 2; - }); - 'step 1' - player.storage.twxingzhui_mahou=[result.index+1,result.index+1]; - player.addTempSkill('twxingzhui_mahou',{player:'die'}); + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + return 2; + }); + ("step 1"); + player.storage.twxingzhui_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twxingzhui_mahou", { player: "die" }); }, - ai:{ - order:2, - result:{ - player:function(player,target){ - if(!player.hasFriend()) return 0; - if(player.hp>1) return 1; + ai: { + order: 2, + result: { + player: function (player, target) { + if (!player.hasFriend()) return 0; + if (player.hp > 1) return 1; return 0; }, }, }, - subSkill:{ - mahou:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - 'step 0' - var list=player.storage.twxingzhui_mahou; + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + "step 0"; + var list = player.storage.twxingzhui_mahou; list[1]--; - if(list[1]==0){ - game.log(player,'的','#g星坠','魔法生效'); - player.logSkill('twxingzhui'); - var num=list[0]; - event.num=num; - var cards=game.cardsGotoOrdering(get.cards(num*2)).cards; - event.cards=cards; - player.showCards(cards,get.translation(player)+'发动了【星坠】'); - player.removeSkill('twxingzhui_mahou'); - } - else{ - game.log(player,'的','#g星坠','魔法剩余','#g'+(list[1])+'回合'); - player.markSkill('twxingzhui_mahou'); + if (list[1] == 0) { + game.log(player, "的", "#g星坠", "魔法生效"); + player.logSkill("twxingzhui"); + var num = list[0]; + event.num = num; + var cards = game.cardsGotoOrdering(get.cards(num * 2)).cards; + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【星坠】"); + player.removeSkill("twxingzhui_mahou"); + } else { + game.log(player, "的", "#g星坠", "魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twxingzhui_mahou"); event.finish(); } - 'step 1' - var cards2=[]; - for(var card of event.cards){ - if(get.color(card,false)=='black') cards2.push(card); + ("step 1"); + var cards2 = []; + for (var card of event.cards) { + if (get.color(card, false) == "black") cards2.push(card); } - if(!cards2.length) event.finish(); - else{ - event.cards2=cards2; - var str='令一名其他角色获得其中的黑色牌('+get.translation(cards2)+')'; - if(cards2.length>=event.num) str+=',然后对其造成'+get.cnNumber(event.num)+'点伤害'; - player.chooseTarget('请选择〖星坠〗的目标',str,lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(_status.event.getParent().cards2.length>=_status.event.getParent().num) return get.damageEffect(target,player,player,'thunder'); - return get.attitude(player,target); - }); + if (!cards2.length) event.finish(); + else { + event.cards2 = cards2; + var str = "令一名其他角色获得其中的黑色牌(" + get.translation(cards2) + ")"; + if (cards2.length >= event.num) + str += ",然后对其造成" + get.cnNumber(event.num) + "点伤害"; + player + .chooseTarget("请选择〖星坠〗的目标", str, lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + if ( + _status.event.getParent().cards2.length >= + _status.event.getParent().num + ) + return get.damageEffect(target, player, player, "thunder"); + return get.attitude(player, target); + }); } - 'step 2' - if(result.bool){ - var target=result.targets[0]; + ("step 2"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - target.gain(event.cards2,'gain2'); - if(event.cards2.length>=num) target.damage(event.num,'thunder'); + target.gain(event.cards2, "gain2"); + if (event.cards2.length >= num) target.damage(event.num, "thunder"); } }, - mark:true, - onremove:true, - marktext:'♗', - intro:{ - name:'施法:星坠', - markcount:function(storage){ - if(storage) return storage[1]; + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:星坠", + markcount: function (storage) { + if (storage) return storage[1]; return 0; }, - content:function(storage){ - if(storage) return '经过'+storage[1]+'个“回合结束时”后,亮出牌堆顶的'+get.cnNumber(storage[0]*2)+'张牌并执行后续效果'; - return '未指定施法效果'; + content: function (storage) { + if (storage) + return ( + "经过" + + storage[1] + + "个“回合结束时”后,亮出牌堆顶的" + + get.cnNumber(storage[0] * 2) + + "张牌并执行后续效果" + ); + return "未指定施法效果"; }, }, }, }, }, - twjuchen:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>player.countCards('h'); - })&&game.hasPlayer(function(current){ - return current!=player&¤t.hp>player.hp; - }); + twjuchen: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > player.countCards("h"); + }) && + game.hasPlayer(function (current) { + return current != player && current.hp > player.hp; + }) + ); }, - logTarget:function(event,player){ + logTarget: function (event, player) { return game.players.sortBySeat(player); }, - content:function(){ - 'step 0' - event.num=0; - event.cards=[]; - event.targets=game.players.sortBySeat(player); - 'step 1' - var target=targets[num]; - if(target.countCards('he')) target.chooseToDiscard('he',true); - else event._result={bool:false}; - 'step 2' - if(result.bool&&Array.isArray(result.cards)) event.cards.addArray(result.cards); + content: function () { + "step 0"; + event.num = 0; + event.cards = []; + event.targets = game.players.sortBySeat(player); + ("step 1"); + var target = targets[num]; + if (target.countCards("he")) target.chooseToDiscard("he", true); + else event._result = { bool: false }; + ("step 2"); + if (result.bool && Array.isArray(result.cards)) event.cards.addArray(result.cards); event.num++; - if(event.num1) return false; - if(_status.dying.length) return false; - if(player==event.player) return false; - if(event.target.hp>=player.hp) return false; - if(!['basic','trick'].includes(get.type(event.card))) return false; + twjiekuang: { + audio: 2, + trigger: { global: "useCardToTargeted" }, + filter: function (event, player) { + if (!event.target || event.targets.length > 1) return false; + if (_status.dying.length) return false; + if (player == event.player) return false; + if (event.target.hp >= player.hp) return false; + if (!["basic", "trick"].includes(get.type(event.card))) return false; return true; }, - usable:1, - direct:true, - content:function(){ - 'step 0' - player.chooseControl('失去体力','减体力上限','cancel2').set('prompt',get.prompt2('twjiekuang',trigger.target)).set('ai',function(card){ - if(_status.event.aisave){ - if(player.isDamaged()) return '减体力上限'; - return '失去体力'; - } - return 'cancel2'; - }).set('aisave',function(){ - var save=false; - if(get.attitude(player,trigger.target)>2){ - if(trigger.card.name=='sha'){ - if(player.countCards('h','shan')||player.getEquip(2) || - trigger.target.hp==1||player.hp>trigger.target.hp+1){ - if(!trigger.target.countCards('h','shan')||trigger.target.countCards('h') 2) { + if (trigger.card.name == "sha") { + if ( + player.countCards("h", "shan") || + player.getEquip(2) || + trigger.target.hp == 1 || + player.hp > trigger.target.hp + 1 + ) { + if ( + !trigger.target.countCards("h", "shan") || + trigger.target.countCards("h") < player.countCards("h") + ) { + save = true; + } + } + } else if (trigger.card.name == "juedou" && trigger.target.hp == 1) { + save = true; + } else if ( + trigger.card.name == "shunshou" && + get.attitude(player, trigger.player) < 0 && + get.attitude(trigger.player, trigger.target) < 0 + ) { + save = true; } } - } - else if(trigger.card.name=='juedou'&&trigger.target.hp==1){ - save=true; - } - else if(trigger.card.name=='shunshou' && - get.attitude(player,trigger.player)<0 && - get.attitude(trigger.player,trigger.target)<0){ - save=true; - } - } - return save; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('twjiekuang',trigger.target); - player[result.control=='失去体力'?'loseHp':'loseMaxHp'](); - player.addTempSkill('twjiekuang_after'); - trigger.getParent().twjiekuang=true; + return save; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("twjiekuang", trigger.target); + player[result.control == "失去体力" ? "loseHp" : "loseMaxHp"](); + player.addTempSkill("twjiekuang_after"); + trigger.getParent().twjiekuang = true; trigger.getParent().targets.remove(trigger.target); trigger.getParent().triggeredTargets4.remove(trigger.target); trigger.getParent().targets.push(player); trigger.untrigger(); game.delayx(); trigger.player.line(player); - } - else player.storage.counttrigger.twjiekuang--; + } else player.storage.counttrigger.twjiekuang--; }, - subSkill:{ - after:{ - charlotte:true, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ + subSkill: { + after: { + charlotte: true, + trigger: { global: "useCardAfter" }, + filter: function (event, player) { return event.twjiekuang; }, - direct:true, - content:function(){ - player.removeSkill('twjiekuang_after'); - var card=get.autoViewAs({ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true + direct: true, + content: function () { + player.removeSkill("twjiekuang_after"); + var card = get.autoViewAs({ + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, }); - if(!game.countPlayer2(current=>{ - return current.hasHistory('damage',evt=>evt.card==trigger.card); - })&&player.canUse(card,trigger.player,false)){ - player.useCard(card,trigger.player,false); + if ( + !game.countPlayer2((current) => { + return current.hasHistory("damage", (evt) => evt.card == trigger.card); + }) && + player.canUse(card, trigger.player, false) + ) { + player.useCard(card, trigger.player, false); } }, }, }, }, - twneirao:{ - audio:2, - derivation:'twluanlve', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return Math.max(0,player.hp)+player.maxHp<=9; + twneirao: { + audio: 2, + derivation: "twluanlve", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return Math.max(0, player.hp) + player.maxHp <= 9; }, - content:function(){ - 'step 0' - player.awakenSkill('twneirao'); - player.removeSkills('twjiekuang'); - 'step 1' - var num=player.countCards('he'),cards=[]; - player.discard(player.getCards('he')); - for(var i=0;i=player.countMark('twluanlve'); + viewAsFilter: function (player) { + return ( + player.isPhaseUsing() && + player.countCards("hs", { name: "sha" }) >= player.countMark("twluanlve") + ); }, - filterCard:function(card,player){ - if(player.countMark('twluanlve')==0) return false; - return card.name=='sha'; + filterCard: function (card, player) { + if (player.countMark("twluanlve") == 0) return false; + return card.name == "sha"; }, - selectCard:function(){ - var player=_status.event.player; - if(player.countMark('twluanlve')==0) return -1; - return player.countMark('twluanlve'); + selectCard: function () { + var player = _status.event.player; + if (player.countMark("twluanlve") == 0) return -1; + return player.countMark("twluanlve"); }, - onChooseToUse:function(event){ - if(!game.online&&event.type=='phase'){ - var targets=[]; - game.countPlayer2(current=>{ - var history=current.getHistory('useCard'); - if(!history.length) return false; - for(var evt of history){ - if(evt.card&&evt.card.name=='shunshou'){ + onChooseToUse: function (event) { + if (!game.online && event.type == "phase") { + var targets = []; + game.countPlayer2((current) => { + var history = current.getHistory("useCard"); + if (!history.length) return false; + for (var evt of history) { + if (evt.card && evt.card.name == "shunshou") { targets.addArray(evt.targets); } } }); - event.set('twluanlve_ban',targets); + event.set("twluanlve_ban", targets); } }, - position:'hs', - log:false, - group:['twluanlve_directHit'], - precontent:function(){ - player.logSkill('twluanlve'); - player.addMark('twluanlve',1,false); + position: "hs", + log: false, + group: ["twluanlve_directHit"], + precontent: function () { + player.logSkill("twluanlve"); + player.addMark("twluanlve", 1, false); }, - ai:{ - order:function(){ - return get.order({name:'shunshou'})+1; + ai: { + order: function () { + return get.order({ name: "shunshou" }) + 1; }, }, - mod:{ - playerEnabled:function(card,player,target){ - if(!_status.event.twluanlve_ban||!Array.isArray(_status.event.twluanlve_ban)) return; - if(player.isPhaseUsing()&&card.name=='shunshou'&&card.storage&&card.storage.twluanlve&&_status.event.twluanlve_ban.includes(target)) return false; + mod: { + playerEnabled: function (card, player, target) { + if (!_status.event.twluanlve_ban || !Array.isArray(_status.event.twluanlve_ban)) + return; + if ( + player.isPhaseUsing() && + card.name == "shunshou" && + card.storage && + card.storage.twluanlve && + _status.event.twluanlve_ban.includes(target) + ) + return false; }, }, - subSkill:{ - directHit:{ - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card.name=='shunshou'; + subSkill: { + directHit: { + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "shunshou"; }, - direct:true, - content:function(){ + direct: true, + content: function () { trigger.directHit.addArray(game.players); - game.log(trigger.card,'不可被响应'); + game.log(trigger.card, "不可被响应"); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg&&arg.card&&arg.card.name=='shunshou'; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return arg && arg.card && arg.card.name == "shunshou"; }, }, - } + }, }, }, //冯习 - twqingkou:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return player.canUse('juedou',current,false); + twqingkou: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return player.canUse("juedou", current, false); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twqingkou'),'视为对一名其他角色使用一张【决斗】',function(card,player,target){ - return player.canUse('juedou',target,false); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'juedou'},player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twqingkou',target); - player.useCard({name:'juedou',isCard:true,storage:{twqingkou:true}},target,false); - player.addTempSkill('twqingkou_after'); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twqingkou"), + "视为对一名其他角色使用一张【决斗】", + function (card, player, target) { + return player.canUse("juedou", target, false); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "juedou" }, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twqingkou", target); + player.useCard( + { name: "juedou", isCard: true, storage: { twqingkou: true } }, + target, + false + ); + player.addTempSkill("twqingkou_after"); } }, - subSkill:{ - after:{ - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.card.storage&&event.card.storage.twqingkou; + subSkill: { + after: { + trigger: { global: "useCardAfter" }, + filter: function (event, player) { + return event.card.storage && event.card.storage.twqingkou; }, - charlotte:true, - direct:true, - content:function(){ - var targets=game.filterPlayer(current=>{ - return current.hasHistory('sourceDamage',function(evt){ - return evt.card==trigger.card; - }); - }).sortBySeat(); - for(var target of targets){ + charlotte: true, + direct: true, + content: function () { + var targets = game + .filterPlayer((current) => { + return current.hasHistory("sourceDamage", function (evt) { + return evt.card == trigger.card; + }); + }) + .sortBySeat(); + for (var target of targets) { target.draw(); - if(target==player){ - player.skip('phaseJudge'); - game.log(player,'跳过了','#y判定阶段'); - player.skip('phaseDiscard'); - game.log(player,'跳过了','#y弃牌阶段'); + if (target == player) { + player.skip("phaseJudge"); + game.log(player, "跳过了", "#y判定阶段"); + player.skip("phaseDiscard"); + game.log(player, "跳过了", "#y弃牌阶段"); } } }, @@ -6166,1802 +7759,2306 @@ game.import('character', function () { }, }, //张既 - twdingzhen:{ - audio:2, - trigger:{global:'roundStart'}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return get.distance(player,current)<=Math.max(0,player.hp); + twdingzhen: { + audio: 2, + trigger: { global: "roundStart" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return get.distance(player, current) <= Math.max(0, player.hp); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twdingzhen'),[1,Infinity],function(card,player,target){ - return get.distance(player,target)<=player.hp; - }).set('ai',function(target){ - var player=_status.event.player; - if(target==player) return 0; - return Math.max(-get.attitude(player,target),1); - }); - 'step 1' - if(result.bool){ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt2("twdingzhen"), + [1, Infinity], + function (card, player, target) { + return get.distance(player, target) <= player.hp; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + if (target == player) return 0; + return Math.max(-get.attitude(player, target), 1); + }); + ("step 1"); + if (result.bool) { result.targets.sortBySeat(); - var targets=result.targets; - event.targets=targets; - player.logSkill('twdingzhen',targets); - event.num=0; + var targets = result.targets; + event.targets = targets; + player.logSkill("twdingzhen", targets); + event.num = 0; + } else event.finish(); + ("step 2"); + var target = targets[num]; + event.target = target; + target + .chooseToDiscard( + "h", + { name: "sha" }, + "定镇:弃置一张【杀】,或本轮你于回合内使用的第一张牌不能指定" + + get.translation(player) + + "为目标" + ) + .set("ai", function (card) { + if (_status.event.goon) return 1; + return 0; + }) + .set( + "goon", + get.attitude(target, player) < 0 && + player.countCards("hs") <= 3 && + target.countCards("hs", (card) => { + return target.hasValueTarget(card); + }) > 1 + ); + ("step 3"); + if (result.bool) target.addExpose(0.1); + else { + target.addSkill("twdingzhen_target"); + target.markAuto("twdingzhen_target", [player]); } - else event.finish(); - 'step 2' - var target=targets[num]; - event.target=target; - target.chooseToDiscard('h',{name:'sha'},'定镇:弃置一张【杀】,或本轮你于回合内使用的第一张牌不能指定'+get.translation(player)+'为目标').set('ai',function(card){ - if(_status.event.goon) return 1; - return 0; - }).set('goon',get.attitude(target,player)<0&&player.countCards('hs')<=3&&target.countCards('hs',card=>{ - return target.hasValueTarget(card); - })>1); - 'step 3' - if(result.bool) target.addExpose(0.1); - else{ - target.addSkill('twdingzhen_target'); - target.markAuto('twdingzhen_target',[player]); - } - 'step 4' - if(event.num0, - content:'回合内使用的第一张牌不能指定$为目标', + intro: { + markcount: () => 0, + content: "回合内使用的第一张牌不能指定$为目标", }, - mod:{ - playerEnabled:function(card,player,target){ - if(_status.currentPhase==player&&!player.countUsed()&&player.getStorage('twdingzhen_target').includes(target)) return false; + mod: { + playerEnabled: function (card, player, target) { + if ( + _status.currentPhase == player && + !player.countUsed() && + player.getStorage("twdingzhen_target").includes(target) + ) + return false; }, }, }, }, }, - twyouye:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player!=player&&!event.player.getHistory('sourceDamage',function(evt){ - return evt.player==player; - }).length&&player.getExpansions('twyouye').length<5; + twyouye: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player != player && + !event.player.getHistory("sourceDamage", function (evt) { + return evt.player == player; + }).length && + player.getExpansions("twyouye").length < 5 + ); }, - forced:true, - group:'twyouye_give', - content:function(){ - player.addToExpansion(get.cards(),'gain2').gaintag.add('twyouye'); + forced: true, + group: "twyouye_give", + content: function () { + player.addToExpansion(get.cards(), "gain2").gaintag.add("twyouye"); }, - marktext:'蓄', - intro:{ - name:'蓄(攸业)', - content:'expansion', - markcount:'expansion', + marktext: "蓄", + intro: { + name: "蓄(攸业)", + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - subSkill:{ - give:{ - audio:'twyouye', - trigger:{source:'damageSource',player:'damageEnd'}, - filter:function(event,player){ - return player.getExpansions('twyouye').length; + subSkill: { + give: { + audio: "twyouye", + trigger: { source: "damageSource", player: "damageEnd" }, + filter: function (event, player) { + return player.getExpansions("twyouye").length; }, - forced:true, - content:function(){ - 'step 0' - event.boolx=_status.currentPhase&&_status.currentPhase.isIn(); - event.cards=player.getExpansions('twyouye'); - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); - event.given_map={}; - 'step 1' - if(event.cards.length>1){ - player.chooseCardButton('攸业:请选择要分配的牌',true,event.cards,[1,event.cards.length]).set('ai',function(button){ - if(ui.selected.buttons.length) return 0; - return get.value(button.link,_status.event.player); + forced: true, + content: function () { + "step 0"; + event.boolx = _status.currentPhase && _status.currentPhase.isIn(); + event.cards = player.getExpansions("twyouye"); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; }); - } - else if(event.cards.length==1) event._result={links:event.cards.slice(0),bool:true}; + event.given_map = {}; + ("step 1"); + if (event.cards.length > 1) { + player + .chooseCardButton("攸业:请选择要分配的牌", true, event.cards, [ + 1, + event.cards.length, + ]) + .set("ai", function (button) { + if (ui.selected.buttons.length) return 0; + return get.value(button.link, _status.event.player); + }); + } else if (event.cards.length == 1) + event._result = { links: event.cards.slice(0), bool: true }; else event.finish(); - 'step 2' - if(result.bool){ - var cards=result.links; - event.cards2=cards; - player.chooseTarget('选择一名角色获得'+get.translation(cards),function(card,player,target){ - var evt=_status.event.getParent(); - var cards=evt.cards,cards2=evt.cards2.slice(); - if(cards.removeArray(cards2).length>0||!evt.boolx) return true; - return target==_status.currentPhase; - },event.cards.length==1).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(_status.event.enemy) return Math.max(0.01,100-att); - else if(att>0) return Math.max(0.1,att/(1+target.countCards('h')+(_status.event.getParent().given_map[target.playerid]||0))); - else return Math.max(0.01,(100+att)/100); - }).set('enemy',get.value(cards[0],player,'raw')<0); + ("step 2"); + if (result.bool) { + var cards = result.links; + event.cards2 = cards; + player + .chooseTarget( + "选择一名角色获得" + get.translation(cards), + function (card, player, target) { + var evt = _status.event.getParent(); + var cards = evt.cards, + cards2 = evt.cards2.slice(); + if (cards.removeArray(cards2).length > 0 || !evt.boolx) + return true; + return target == _status.currentPhase; + }, + event.cards.length == 1 + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (_status.event.enemy) return Math.max(0.01, 100 - att); + else if (att > 0) + return Math.max( + 0.1, + att / + (1 + + target.countCards("h") + + (_status.event.getParent().given_map[ + target.playerid + ] || 0)) + ); + else return Math.max(0.01, (100 + att) / 100); + }) + .set("enemy", get.value(cards[0], player, "raw") < 0); } - 'step 3' - if(result.bool){ - var cards=event.cards2; + ("step 3"); + if (result.bool) { + var cards = event.cards2; event.cards.removeArray(cards); - event.togive=cards.slice(0); - if(result.targets.length){ - if(result.targets[0]==_status.currentPhase) event.boolx=false; - var id=result.targets[0].playerid,map=event.given_map; - if(!map[id]) map[id]=[]; + event.togive = cards.slice(0); + if (result.targets.length) { + if (result.targets[0] == _status.currentPhase) event.boolx = false; + var id = result.targets[0].playerid, + map = event.given_map; + if (!map[id]) map[id] = []; map[id].addArray(event.togive); } - if(event.cards.length>0) event.goto(1); - } - else event.goto(1); - 'step 4' - if(_status.connectMode) game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); - var list=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - list.push([source,event.given_map[i]]); - game.log(source,'获得了',event.given_map[i]); + if (event.cards.length > 0) event.goto(1); + } else event.goto(1); + ("step 4"); + if (_status.connectMode) + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + var list = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + list.push([source, event.given_map[i]]); + game.log(source, "获得了", event.given_map[i]); } game.loseAsync({ - gain_list:list, - giver:player, - animate:'gain2', - }).setContent('gaincardMultiple'); + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); }, }, }, }, //荀谌 - twweipo:{ - audio:'mjweipo', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('he'); + twweipo: { + audio: "mjweipo", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("he"); }); }, - filterTarget:function(card,player,target){ - return target.countCards('he'); + filterTarget: function (card, player, target) { + return target.countCards("he"); }, - content:function(){ - 'step 0' - target.chooseToDiscard('he',true); - 'step 1' - var list=['binglinchengxiax']; + content: function () { + "step 0"; + target.chooseToDiscard("he", true); + ("step 1"); + var list = ["binglinchengxiax"]; list.addArray(get.zhinangs()); - player.chooseButton(['危迫:令其获得一张智囊牌或【兵临城下】',[list,'vcard']],true).set('ai',function(button){ - return _status.event.getParent().target.getUseValue({name:button.link[2]}); - }); - 'step 2' - if(result.bool){ - var name=result.links[0][2],card=false; - game.log(player,'选择了','#y'+get.translation(name)); - if(name=='binglinchengxiax'){ - if(!_status.binglinchengxiax){ - _status.binglinchengxiax=[ - ['spade',7], - ['club',7], - ['club',13], + player + .chooseButton(["危迫:令其获得一张智囊牌或【兵临城下】", [list, "vcard"]], true) + .set("ai", function (button) { + return _status.event.getParent().target.getUseValue({ name: button.link[2] }); + }); + ("step 2"); + if (result.bool) { + var name = result.links[0][2], + card = false; + game.log(player, "选择了", "#y" + get.translation(name)); + if (name == "binglinchengxiax") { + if (!_status.binglinchengxiax) { + _status.binglinchengxiax = [ + ["spade", 7], + ["club", 7], + ["club", 13], ]; - game.broadcastAll(function(){lib.inpile.add('binglinchengxiax')}); + game.broadcastAll(function () { + lib.inpile.add("binglinchengxiax"); + }); } - if(_status.binglinchengxiax.length){ - var info=_status.binglinchengxiax.randomRemove(); - card=game.createCard2('binglinchengxiax',info[0],info[1]); + if (_status.binglinchengxiax.length) { + var info = _status.binglinchengxiax.randomRemove(); + card = game.createCard2("binglinchengxiax", info[0], info[1]); } } - if(!card) card=get.cardPile(name); - if(card) target.gain(card,'gain2'); + if (!card) card = get.cardPile(name); + if (card) target.gain(card, "gain2"); } }, - ai:{ - order:7.1, - result:{ - target:function(player,target){ - if(target==player) return player.countCards('he')?10:0.01; - return (target.countCards('he')+0.5)*Math.sqrt(Math.max(1,target.hp)); + ai: { + order: 7.1, + result: { + target: function (player, target) { + if (target == player) return player.countCards("he") ? 10 : 0.01; + return (target.countCards("he") + 0.5) * Math.sqrt(Math.max(1, target.hp)); }, }, }, }, - twmouzhi:{ - audio:'mjmouzhi', - intro:{content:'上次受到伤害的颜色:$'}, - trigger:{player:'damageBegin4'}, - forced:true, - group:'twmouzhi_mark', - filter:function(event,player){ - if(!event.card||get.color(event.card)=='none') return false; - var all=player.getAllHistory('damage'); - if(!all.length) return false; - return all[all.length-1].card&&get.color(all[all.length-1].card)==get.color(event.card); + twmouzhi: { + audio: "mjmouzhi", + intro: { content: "上次受到伤害的颜色:$" }, + trigger: { player: "damageBegin4" }, + forced: true, + group: "twmouzhi_mark", + filter: function (event, player) { + if (!event.card || get.color(event.card) == "none") return false; + var all = player.getAllHistory("damage"); + if (!all.length) return false; + return ( + all[all.length - 1].card && + get.color(all[all.length - 1].card) == get.color(event.card) + ); }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:(card,player,target)=>{ - if(typeof card==='object'&&get.tag(card,'damage')){ - let color=get.color(card); - if(color==='none') return; - let all=target.getAllHistory('damage'); - if(!all.length||!all[all.length-1].card) return; - if(get.color(all[all.length-1].card)===color) return 'zeroplayertarget'; + ai: { + effect: { + target: (card, player, target) => { + if (typeof card === "object" && get.tag(card, "damage")) { + let color = get.color(card); + if (color === "none") return; + let all = target.getAllHistory("damage"); + if (!all.length || !all[all.length - 1].card) return; + if (get.color(all[all.length - 1].card) === color) return "zeroplayertarget"; } }, }, }, - subSkill:{ - mark:{ - trigger:{player:'damage'}, - silent:true, - firstDo:true, - content:function(){ - if(!trigger.card||get.color(trigger.card)=='none') player.unmarkSkill('twmouzhi'); + subSkill: { + mark: { + trigger: { player: "damage" }, + silent: true, + firstDo: true, + content: function () { + if (!trigger.card || get.color(trigger.card) == "none") + player.unmarkSkill("twmouzhi"); else { - player.markSkill('twmouzhi'); - player.storage.twmouzhi=get.color(trigger.card); - game.broadcastAll(function(player,color){ - if(player.marks.twmouzhi){ - player.marks.twmouzhi.firstChild.innerHTML=''; - } - player.storage.twmouzhi=color; - },player,player.storage.twmouzhi) + player.markSkill("twmouzhi"); + player.storage.twmouzhi = get.color(trigger.card); + game.broadcastAll( + function (player, color) { + if (player.marks.twmouzhi) { + player.marks.twmouzhi.firstChild.innerHTML = + ""; + } + player.storage.twmouzhi = color; + }, + player, + player.storage.twmouzhi + ); } }, }, }, }, //蒋钦 - twshangyi:{ - audio:'shangyi', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h'); - }); + twshangyi: { + audio: "shangyi", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he") && + game.hasPlayer(function (current) { + return current != player && current.countCards("h"); + }) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h'); + filterTarget: function (card, player, target) { + return target != player && target.countCards("h"); }, - filterCard:true, - position:'he', - content:function(){ - 'step 0' + filterCard: true, + position: "he", + content: function () { + "step 0"; target.viewHandcards(player); var chooseButton; - if(player.countCards('h')) chooseButton=player.chooseButton([1,2],['###尚义###
    选择'+get.translation(target)+'的一张手牌以弃置,或选择你与其的各一张牌以交换
    ','
    '+get.translation(target)+'的手牌
    ',target.getCards('h'),'
    你的手牌
    ',player.getCards('h')],true); - else chooseButton=player.chooseButton(['###尚义###
    弃置'+get.translation(target)+'的一张手牌
    ','
    '+get.translation(target)+'的手牌
    ',target.getCards('h')],true); - chooseButton.set('target',target); - chooseButton.set('ai',function(button){ - var player=_status.event.player,owner=get.owner(button.link),color=get.color(button.link,owner),value=get.value(button.link,owner); - if(player.countCards('h')){ - if(!ui.selected.buttons.length){ - if(player.countCards('h',function(card){ - return get.color(card,player)=='red'&&get.value(card)<6; - })&&color=='red'&&value>7) return value*3; + if (player.countCards("h")) + chooseButton = player.chooseButton( + [1, 2], + [ + '###尚义###
    选择' + + get.translation(target) + + "的一张手牌以弃置,或选择你与其的各一张牌以交换
    ", + '
    ' + get.translation(target) + "的手牌
    ", + target.getCards("h"), + '
    你的手牌
    ', + player.getCards("h"), + ], + true + ); + else + chooseButton = player.chooseButton( + [ + '###尚义###
    弃置' + + get.translation(target) + + "的一张手牌
    ", + '
    ' + get.translation(target) + "的手牌
    ", + target.getCards("h"), + ], + true + ); + chooseButton.set("target", target); + chooseButton.set("ai", function (button) { + var player = _status.event.player, + owner = get.owner(button.link), + color = get.color(button.link, owner), + value = get.value(button.link, owner); + if (player.countCards("h")) { + if (!ui.selected.buttons.length) { + if ( + player.countCards("h", function (card) { + return get.color(card, player) == "red" && get.value(card) < 6; + }) && + color == "red" && + value > 7 + ) + return value * 3; return value; + } else { + if (get.value(ui.selected.buttons[0].link) < 4) return 0; + return ( + 4 + + (get.color( + ui.selected.buttons[0].link, + get.owner(ui.selected.buttons[0].link) + ) == "red" + ? 3 + : 1) - + value + ); } - else { - if(get.value(ui.selected.buttons[0].link)<4) return 0; - return 4+(get.color(ui.selected.buttons[0].link,get.owner(ui.selected.buttons[0].link))=='red'?3:1)-value; - } - } - else { - if(color=='black') return value*1.5; + } else { + if (color == "black") return value * 1.5; return value; } }); - chooseButton.set('filterButton',function(button){ - if(get.itemtype(button.link)!='card') return false; - if(!ui.selected.buttons.length&&get.owner(button.link)!=_status.event.target) return false; - if(ui.selected.buttons.length&&get.owner(ui.selected.buttons[0].link)==get.owner(button.link)) return false; + chooseButton.set("filterButton", function (button) { + if (get.itemtype(button.link) != "card") return false; + if (!ui.selected.buttons.length && get.owner(button.link) != _status.event.target) + return false; + if ( + ui.selected.buttons.length && + get.owner(ui.selected.buttons[0].link) == get.owner(button.link) + ) + return false; return true; }); - 'step 1' - if(result.bool){ - if(result.links.length==1){ - target.discard(result.links[0]).discarder=player; - if(get.color(result.links[0],target)!='black') event.finish(); + ("step 1"); + if (result.bool) { + if (result.links.length == 1) { + target.discard(result.links[0]).discarder = player; + if (get.color(result.links[0], target) != "black") event.finish(); + } else { + var links = result.links.slice(); + if (get.owner(links[0]) != player) links.reverse(); + var card1 = links[0], + card2 = links[1]; + player.swapHandcards(target, [card1], [card2]); + if (get.color(card1, player) != "red" || get.color(card2, target) != "red") + event.finish(); } - else { - var links=result.links.slice(); - if(get.owner(links[0])!=player) links.reverse(); - var card1=links[0],card2=links[1]; - player.swapHandcards(target,[card1],[card2]); - if(get.color(card1,player)!='red'||get.color(card2,target)!='red') event.finish(); - } - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); player.draw(); }, - ai:{ - order:10, - result:{target:-1}, + ai: { + order: 10, + result: { target: -1 }, }, }, - twxiangyu:{ - group:'twxiangyu_lose', - shaRelated:true, - audio:'zniaoxiang', - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'&&get.distance(player,event.player){ - return current.getHistory('lose').length; + forced: true, + logTarget: "target", + init: function (player) { + var target = _status.currentPhase; + if (!target || !target != player) return; + if (!player.getStorage("twxiangyu_range").length) { + var targets = game.filterPlayer((current) => { + return current.getHistory("lose").length; }); - if(targets.length){ - player.addTempSkill('twxiangyu_range'); - player.markAuto('twxiangyu_range',targets); + if (targets.length) { + player.addTempSkill("twxiangyu_range"); + player.markAuto("twxiangyu_range", targets); } } }, - content:function(){ - var id=trigger.target.playerid; - var map=trigger.getParent().customArgs; - if(!map[id]) map[id]={}; - if(typeof map[id].shanRequired=='number'){ + content: function () { + var id = trigger.target.playerid; + var map = trigger.getParent().customArgs; + if (!map[id]) map[id] = {}; + if (typeof map[id].shanRequired == "number") { map[id].shanRequired++; - } - else map[id].shanRequired=2; + } else map[id].shanRequired = 2; }, - mod:{ - attackRange:function(player,num){ - return num+Math.min(5,player.getStorage('twxiangyu_range').length); + mod: { + attackRange: function (player, num) { + return num + Math.min(5, player.getStorage("twxiangyu_range").length); }, }, - subSkill:{ - lose:{ - trigger:{ - global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + lose: { + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - return player==_status.currentPhase&&game.hasPlayer(function(current){ - if(player.getStorage('twxiangyu_range').includes(current)) return false; - var evt=event.getl(current); - return evt&&evt.cards2&&evt.cards2.length>0; - }); + filter: function (event, player) { + return ( + player == _status.currentPhase && + game.hasPlayer(function (current) { + if (player.getStorage("twxiangyu_range").includes(current)) return false; + var evt = event.getl(current); + return evt && evt.cards2 && evt.cards2.length > 0; + }) + ); }, - silent:true, - charlotte:true, - content:function(){ - player.addTempSkill('twxiangyu_range'); - player.markAuto('twxiangyu_range',game.filterPlayer(function(current){ - if(player.getStorage('twxiangyu_range').includes(current)) return false; - var evt=trigger.getl(current); - return evt&&evt.cards2&&evt.cards2.length>0; - })); - player.syncStorage('twxiangyu_range'); + silent: true, + charlotte: true, + content: function () { + player.addTempSkill("twxiangyu_range"); + player.markAuto( + "twxiangyu_range", + game.filterPlayer(function (current) { + if (player.getStorage("twxiangyu_range").includes(current)) return false; + var evt = trigger.getl(current); + return evt && evt.cards2 && evt.cards2.length > 0; + }) + ); + player.syncStorage("twxiangyu_range"); }, }, - range:{ - marktext:'羽', - intro:{ - content:function(storage,player){ - var num=Math.min(5,storage?storage.length:0); - return '攻击范围+'+num; + range: { + marktext: "羽", + intro: { + content: function (storage, player) { + var num = Math.min(5, storage ? storage.length : 0); + return "攻击范围+" + num; }, }, - charlotte:true, - onremove:true, + charlotte: true, + onremove: true, }, }, }, //顾雍 - twgyshenxing:{ - audio:'xinshenxing', - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he')>=Math.min(2,player.countMark('twgyshenxing')); + twgyshenxing: { + audio: "xinshenxing", + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") >= Math.min(2, player.countMark("twgyshenxing")); }, - selectCard:function(){ - return Math.min(2,_status.event.player.countMark('twgyshenxing')); + selectCard: function () { + return Math.min(2, _status.event.player.countMark("twgyshenxing")); }, - prompt:function(){ - return '弃置'+get.cnNumber(Math.min(2,_status.event.player.countMark('twgyshenxing')))+'张牌并摸一张牌'; + prompt: function () { + return ( + "弃置" + + get.cnNumber(Math.min(2, _status.event.player.countMark("twgyshenxing"))) + + "张牌并摸一张牌" + ); }, - check:function(card){ - var num=_status.event.player.countCards('h',{color:get.color(card)}); - if(get.position(card)=='e') num++; - return (Math.max(4,7.1-num)-get.value(card))/num; + check: function (card) { + var num = _status.event.player.countCards("h", { color: get.color(card) }); + if (get.position(card) == "e") num++; + return (Math.max(4, 7.1 - num) - get.value(card)) / num; }, - filterCard:true, - position:'he', - content:function(){ + filterCard: true, + position: "he", + content: function () { player.draw(); - player.addMark('twgyshenxing',1); + player.addMark("twgyshenxing", 1); }, - marktext:'慎', - intro:{content:'已发动过#次'}, - ai:{ - order:function(item,player){ - if(!player.hasMark('twgyshenxing')) return 10; + marktext: "慎", + intro: { content: "已发动过#次" }, + ai: { + order: function (item, player) { + if (!player.hasMark("twgyshenxing")) return 10; return 1; }, - result:{player:1}, + result: { player: 1 }, }, }, - twbingyi:{ - audio:'bingyi_xin_guyong', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('h'); + twbingyi: { + audio: "bingyi_xin_guyong", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h"); }, - filterx:function(event,player){ - var cards=player.getCards('h'); - if(cards.length==1) return true; - var color=get.color(cards[0],player),type=get.type2(cards[0],player); - for(var i=1; iplayer.getCardUsable({name:'sha'})){ - return player.hp>2?2:0; - } - return 1; - }).set('prompt',get.prompt('twyilie')); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('twyilie'); - game.log(player,'选择了','#g【毅烈】','的','#y'+result.control); - if(result.index%2==0) player.addTempSkill('twyilie_add','phaseUseEnd'); - if(result.index>0) player.addTempSkill('twyilie_miss'); - if(result.index==2) player.loseHp(); + twyilie: { + audio: "spyilie", + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseControl("选项一", "选项二", "背水!", "cancel2") + .set("choiceList", [ + "本阶段内使用【杀】的次数上限+1", + "本回合内使用【杀】指定处于连环状态的目标后,或使用【杀】被【闪】抵消时,摸一张牌", + "背水!失去1点体力并依次执行上述所有选项", + ]) + .set("ai", function () { + if ( + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) > player.getCardUsable({ name: "sha" }) + ) { + return player.hp > 2 ? 2 : 0; + } + return 1; + }) + .set("prompt", get.prompt("twyilie")); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("twyilie"); + game.log(player, "选择了", "#g【毅烈】", "的", "#y" + result.control); + if (result.index % 2 == 0) player.addTempSkill("twyilie_add", "phaseUseEnd"); + if (result.index > 0) player.addTempSkill("twyilie_miss"); + if (result.index == 2) player.loseHp(); } }, - subSkill:{ - add:{ - charlotte:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + subSkill: { + add: { + charlotte: true, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, }, - mark:true, - intro:{content:'本阶段使用【杀】的次数上限+1'}, + mark: true, + intro: { content: "本阶段使用【杀】的次数上限+1" }, }, - miss:{ - charlotte:true, - audio:'spyilie', - trigger:{player:['useCardToTargeted','shaMiss']}, - filter:function(event,player,name){ - if(name=='useCardToTargeted') return event.card.name=='sha'&&event.target.isLinked(); + miss: { + charlotte: true, + audio: "spyilie", + trigger: { player: ["useCardToTargeted", "shaMiss"] }, + filter: function (event, player, name) { + if (name == "useCardToTargeted") + return event.card.name == "sha" && event.target.isLinked(); return true; }, - forced:true, - content:function(){ + forced: true, + content: function () { player.draw(); }, }, }, }, - twfenming:{ - audio:'spfenming', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.hasPlayer(function(target){ - return target!=player&&(target.countCards('he')||!target.isLinked()); + twfenming: { + audio: "spfenming", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return target != player && (target.countCards("he") || !target.isLinked()); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twfenming'),function(card,player,target){ - return target!=player&&(target.countCards('he')||!target.isLinked()); - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twfenming',target); - var list=[],choiceList=[ - '令'+get.translation(target)+'弃置一张牌', - '令'+get.translation(target)+'横置', - '背水!横置并依次令'+get.translation(target)+'执行上述所有选项', - ]; - if(target.countCards('he')) list.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(!target.isLinked()) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(target.countCards('he')&&!target.isLinked()&&!player.isLinked()) list.push('背水!'); - else choiceList[2]=''+choiceList[2]+''; - if(list.length==1) event._result={control:list[0]}; - else player.chooseControl(list).set('choiceList',choiceList).set('ai',function(){ - var list=_status.event.controls; - if(list.includes('背水!')) return '背水!'; - if(list.includes('选项一')) return '选项一'; - return '选项二'; - }).set('prompt','奋命:请选择一项'); - } - else event.finish(); - 'step 2' - game.log(player,'选择了','#y'+result.control); - if(result.control=='背水!'&&!player.isLinked()) player.link(true); - if(result.control!='选项二') target.chooseToDiscard('he',true); - if(result.control!='选项一'&&!target.isLinked()) target.link(true); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twfenming"), function (card, player, target) { + return target != player && (target.countCards("he") || !target.isLinked()); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twfenming", target); + var list = [], + choiceList = [ + "令" + get.translation(target) + "弃置一张牌", + "令" + get.translation(target) + "横置", + "背水!横置并依次令" + get.translation(target) + "执行上述所有选项", + ]; + if (target.countCards("he")) list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (!target.isLinked()) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (target.countCards("he") && !target.isLinked() && !player.isLinked()) + list.push("背水!"); + else choiceList[2] = '' + choiceList[2] + ""; + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", function () { + var list = _status.event.controls; + if (list.includes("背水!")) return "背水!"; + if (list.includes("选项一")) return "选项一"; + return "选项二"; + }) + .set("prompt", "奋命:请选择一项"); + } else event.finish(); + ("step 2"); + game.log(player, "选择了", "#y" + result.control); + if (result.control == "背水!" && !player.isLinked()) player.link(true); + if (result.control != "选项二") target.chooseToDiscard("he", true); + if (result.control != "选项一" && !target.isLinked()) target.link(true); }, }, //韩当 - twgongji:{ - audio:'regongji', - enable:'phaseUse', - usable:1, - position:'he', - filterCard:true, - locked:false, - filter:function(event,player){ - return player.countCards('he'); + twgongji: { + audio: "regongji", + enable: "phaseUse", + usable: 1, + position: "he", + filterCard: true, + locked: false, + filter: function (event, player) { + return player.countCards("he"); }, - check:function(card){ - var base=0,player=_status.event.player,suit=get.suit(card,player),added=false,added2=false,added3; - if(get.type(card)=='equip'&&game.hasPlayer(function(target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - if(target.countCards('he',function(card){ - return get.value(card)>5; - })) return -att; - })) base+=6; - var hs=player.getCards('h'); - var muniu=player.getEquip('muniu'); - if(muniu&&card!=muniu&&muniu.cards) hs=hs.concat(muniu.cards); - for(var i of hs){ - if(i!=card&&get.name(i)=='sha'){ - if(get.suit(i,player)==suit){ - if(player.hasValueTarget(i,false)){ - added3=true; - base+=5.5; + check: function (card) { + var base = 0, + player = _status.event.player, + suit = get.suit(card, player), + added = false, + added2 = false, + added3; + if ( + get.type(card) == "equip" && + game.hasPlayer(function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + }) + ) + base += 6; + var hs = player.getCards("h"); + var muniu = player.getEquip("muniu"); + if (muniu && card != muniu && muniu.cards) hs = hs.concat(muniu.cards); + for (var i of hs) { + if (i != card && get.name(i) == "sha") { + if (get.suit(i, player) == suit) { + if (player.hasValueTarget(i, false)) { + added3 = true; + base += 5.5; } - } - else { - if(player.hasValueTarget(i,false)) added2=true; - if(!added&&!player.hasValueTarget(i,null,true)&&player.hasValueTarget(i,false,true)){ - base+=4; - added=true; + } else { + if (player.hasValueTarget(i, false)) added2 = true; + if ( + !added && + !player.hasValueTarget(i, null, true) && + player.hasValueTarget(i, false, true) + ) { + base += 4; + added = true; } } } } - if(added3&&!added2) base-=4.5; - return base-get.value(card); + if (added3 && !added2) base -= 4.5; + return base - get.value(card); }, - content:function(){ - 'step 0' - player.addTempSkill('twgongji2'); - player.markAuto('twgongji2',[get.suit(cards[0],player)]); - 'step 1' - if(get.type(cards[0],null,cards[0].original=='h'?player:false)=='equip'){ - player.chooseTarget('是否弃置一名角色的一张牌?',function(card,player,target){ - return player!=target&&target.countCards('he'); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player); - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - player.line(result.targets,'green'); - player.discardPlayerCard(result.targets[0],'he',true); + content: function () { + "step 0"; + player.addTempSkill("twgongji2"); + player.markAuto("twgongji2", [get.suit(cards[0], player)]); + ("step 1"); + if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { + player + .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { + return player != target && target.countCards("he"); + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.line(result.targets, "green"); + player.discardPlayerCard(result.targets[0], "he", true); } }, - mod:{ - attackRangeBase:function(){ + mod: { + attackRangeBase: function () { return Infinity; }, }, - ai:{ - order:4.5, - result:{player:1}, + ai: { + order: 4.5, + result: { player: 1 }, }, }, - twgongji2:{ - charlotte:true, - onremove:true, - mark:true, - intro:{content:'使用$花色的杀无任何次数限制'}, - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(_status.currentPhase==player&&event.card.name=='sha'&& - player.getStorage('twgongji2').includes(get.suit(event.card))&&event.addCount!==false) return true; + twgongji2: { + charlotte: true, + onremove: true, + mark: true, + intro: { content: "使用$花色的杀无任何次数限制" }, + trigger: { player: "useCard1" }, + filter: function (event, player) { + if ( + _status.currentPhase == player && + event.card.name == "sha" && + player.getStorage("twgongji2").includes(get.suit(event.card)) && + event.addCount !== false + ) + return true; return false; }, - forced:true, - locked:false, - popup:false, - firstDo:true, - content:function(){ - trigger.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + forced: true, + locked: false, + popup: false, + firstDo: true, + content: function () { + trigger.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } }, - mod:{ - cardUsable:function(card,player){ - if(card.name=='sha'){ + mod: { + cardUsable: function (card, player) { + if (card.name == "sha") { const suit = get.suit(card); - return suit === 'unsure' || player.getStorage('twgongji2').includes(suit); + return suit === "unsure" || player.getStorage("twgongji2").includes(suit); } }, - aiOrder:function(player,card,num){ - if(get.name(card)=='sha'&&!player.getStorage('twgongji2').includes(get.suit(card))) return num+1; + aiOrder: function (player, card, num) { + if ( + get.name(card) == "sha" && + !player.getStorage("twgongji2").includes(get.suit(card)) + ) + return num + 1; }, }, }, - twjiefan:{ - skillAnimation:true, - animationColor:'wood', - audio:'jiefan_re_handang', - limited:true, - enable:'phaseUse', - filterTarget:true, - content:function(){ - 'step 0' - player.awakenSkill('twjiefan'); - event.players=game.filterPlayer(function(current){ - return current!=target&¤t.inRange(target); + twjiefan: { + skillAnimation: true, + animationColor: "wood", + audio: "jiefan_re_handang", + limited: true, + enable: "phaseUse", + filterTarget: true, + content: function () { + "step 0"; + player.awakenSkill("twjiefan"); + event.players = game.filterPlayer(function (current) { + return current != target && current.inRange(target); }); event.players.sortBySeat(); - 'step 1' - if(event.players.length){ - event.current=event.players.shift(); - event.current.addTempClass('target'); - player.line(event.current,'green'); - if(!event.current.countCards('he')||!target.isIn()) event._result={bool:false}; - else{ - event.current.chooseToDiscard({subtype:'equip1'},'he','解烦:弃置一张武器牌,或令'+get.translation(target)+'摸一张牌').set('ai',function(card){ - if(!_status.event.target.isIn()) return 0; - if(get.attitude(_status.event.player,_status.event.target)<0) return 7-get.value(card); - return -1; - }).set('target',target); + ("step 1"); + if (event.players.length) { + event.current = event.players.shift(); + event.current.addTempClass("target"); + player.line(event.current, "green"); + if (!event.current.countCards("he") || !target.isIn()) + event._result = { bool: false }; + else { + event.current + .chooseToDiscard( + { subtype: "equip1" }, + "he", + "解烦:弃置一张武器牌,或令" + get.translation(target) + "摸一张牌" + ) + .set("ai", function (card) { + if (!_status.event.target.isIn()) return 0; + if (get.attitude(_status.event.player, _status.event.target) < 0) + return 7 - get.value(card); + return -1; + }) + .set("target", target); } - } - else { - player.addSkill('twjiefan2'); - player.markAuto('twjiefan2',[target]); + } else { + player.addSkill("twjiefan2"); + player.markAuto("twjiefan2", [target]); event.finish(); } - 'step 2' - if(!result.bool&&target.isIn()) target.draw(); + ("step 2"); + if (!result.bool && target.isIn()) target.draw(); event.goto(1); }, - ai:{ - order:5, - result:{ - target:function(player,target){ - if(player.hp>2&&game.phaseNumber 2 && game.phaseNumber < game.players.length * 2) return 0; + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != target && players[i].inRange(target)) { num++; } } return num; - } - } - } - }, - twjiefan2:{ - charlotte:true, - onremove:true, - trigger:{global:'dying'}, - filter:function(event,player){ - return player.getStorage('twjiefan2').includes(event.player); - }, - forced:true, - popup:false, - content:function(){ - player.removeSkill('twjiefan2'); - player.restoreSkill('twjiefan'); + }, + }, }, }, - jiefan_re_handang:{audio:2}, + twjiefan2: { + charlotte: true, + onremove: true, + trigger: { global: "dying" }, + filter: function (event, player) { + return player.getStorage("twjiefan2").includes(event.player); + }, + forced: true, + popup: false, + content: function () { + player.removeSkill("twjiefan2"); + player.restoreSkill("twjiefan"); + }, + }, + jiefan_re_handang: { audio: 2 }, //纪灵 - twshuangren:{ - audio:'shuangren', - trigger:{player:'phaseUseBegin'}, - filter:function(event,player,name){ - if(!player.countCards('h')) return false; - if(name=='phaseUseEnd') return !player.hasHistory('sourceDamage',function(evt){ - return evt.card.name=='sha'&&event.getParent('phaseUse')==evt; - }); + twshuangren: { + audio: "shuangren", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player, name) { + if (!player.countCards("h")) return false; + if (name == "phaseUseEnd") + return !player.hasHistory("sourceDamage", function (evt) { + return evt.card.name == "sha" && event.getParent("phaseUse") == evt; + }); return true; }, - direct:true, - group:'twshuangren_end', - preHidden:true, - content:function(){ - 'step 0' - var forced=event.getParent(2).name=='twshuangren_end'&&game.hasPlayer(current=>{ - return player.canCompare(current); - }); - var str='与一名角色拼点,若你:赢,你可以视为对至多两名至其的距离不大于1的角色使用一张【杀】;没赢,其可以视为对你使用一张【杀】'; - player.chooseTarget(forced?'双刃:选择一名角色':get.prompt('twshuangren'),str,forced,(card,player,target)=>{ - return player.canCompare(target); - }).set('ai',target=>{ - if(_status.event.goon) return get.effect(target,{name:'sha'},_status.event.player); - return 0; - }).set('goon',event.triggername!='phaseUseBegin'||(player.countCards('hs','sha')>0&&player.hasValueTarget({name:'sha'}))); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twshuangren',target); - if(player.canCompare(target)) player.chooseToCompare(target); - else event.finish(); - } - else event.finish(); - 'step 2' - if(result.bool){ - event.sha=true; - player.chooseTarget([1,2],'请选择【杀】的目标',true,function(card,player,target){ - if(!player.canUse('sha',target,false,false)) return false; - return get.distance(target,_status.event.targetx)<=1; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); - }).set('targetx',target); - } - else target.chooseBool('双刃:是否视为对'+get.translation(player)+'使用一张杀?').set('choice',get.effect(player,{name:'sha'},target,target)>0); - 'step 3' - if(result.bool){ - if(event.sha==true) { - result.targets.sortBySeat(); - for(var i of result.targets){ - player.useCard({name:'sha',isCard:true},i,false); + direct: true, + group: "twshuangren_end", + preHidden: true, + content: function () { + "step 0"; + var forced = + event.getParent(2).name == "twshuangren_end" && + game.hasPlayer((current) => { + return player.canCompare(current); + }); + var str = + "与一名角色拼点,若你:赢,你可以视为对至多两名至其的距离不大于1的角色使用一张【杀】;没赢,其可以视为对你使用一张【杀】"; + player + .chooseTarget( + forced ? "双刃:选择一名角色" : get.prompt("twshuangren"), + str, + forced, + (card, player, target) => { + return player.canCompare(target); } - } - else target.useCard({name:'sha',isCard:true},player,false); + ) + .set("ai", (target) => { + if (_status.event.goon) + return get.effect(target, { name: "sha" }, _status.event.player); + return 0; + }) + .set( + "goon", + event.triggername != "phaseUseBegin" || + (player.countCards("hs", "sha") > 0 && player.hasValueTarget({ name: "sha" })) + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twshuangren", target); + if (player.canCompare(target)) player.chooseToCompare(target); + else event.finish(); + } else event.finish(); + ("step 2"); + if (result.bool) { + event.sha = true; + player + .chooseTarget( + [1, 2], + "请选择【杀】的目标", + true, + function (card, player, target) { + if (!player.canUse("sha", target, false, false)) return false; + return get.distance(target, _status.event.targetx) <= 1; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }) + .set("targetx", target); + } else + target + .chooseBool("双刃:是否视为对" + get.translation(player) + "使用一张杀?") + .set("choice", get.effect(player, { name: "sha" }, target, target) > 0); + ("step 3"); + if (result.bool) { + if (event.sha == true) { + result.targets.sortBySeat(); + for (var i of result.targets) { + player.useCard({ name: "sha", isCard: true }, i, false); + } + } else target.useCard({ name: "sha", isCard: true }, player, false); } }, - subSkill:{ - end:{ - audio:'shuangren', - trigger:{player:'phaseUseEnd'}, - filter:function(event,player,name){ - if(!player.countCards('h')) return false; - return !player.hasHistory('useSkill',function(evt){ - return evt.skill=='twshuangren'; - })&&!player.hasHistory('sourceDamage',function(evt){ - return evt.card&&evt.card.name=='sha'; - }); + subSkill: { + end: { + audio: "shuangren", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player, name) { + if (!player.countCards("h")) return false; + return ( + !player.hasHistory("useSkill", function (evt) { + return evt.skill == "twshuangren"; + }) && + !player.hasHistory("sourceDamage", function (evt) { + return evt.card && evt.card.name == "sha"; + }) + ); }, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('twshuangren'),'弃置一张牌发动〖双刃〗','he').set('ai',function(card){ - if(_status.event.goon) return 5-get.value(card); - return 0; - }).set('goon',function(){ - return player.hasCard(function(card){ - if(player.needsToDiscard()>1) return card.number>10&&get.value(card)<=5; - return (card.number>=9&&get.value(card)<=5)||get.value(card)<=3; - }); - }()).setHiddenSkill('twshuangren').set('logSkill','twshuangren'); - 'step 1' - if(result.bool){ - player.useSkill('twshuangren'); + direct: true, + preHidden: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt("twshuangren"), "弃置一张牌发动〖双刃〗", "he") + .set("ai", function (card) { + if (_status.event.goon) return 5 - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + return player.hasCard(function (card) { + if (player.needsToDiscard() > 1) + return card.number > 10 && get.value(card) <= 5; + return ( + (card.number >= 9 && get.value(card) <= 5) || + get.value(card) <= 3 + ); + }); + })() + ) + .setHiddenSkill("twshuangren") + .set("logSkill", "twshuangren"); + ("step 1"); + if (result.bool) { + player.useSkill("twshuangren"); } - } - } - } + }, + }, + }, }, //法正 - twxuanhuo:{ - audio:'rexuanhuo', - trigger:{player:'phaseDrawEnd'}, - filter:function(event,player){ - return player.countCards('he')>1&&game.countPlayer()>2; + twxuanhuo: { + audio: "rexuanhuo", + trigger: { player: "phaseDrawEnd" }, + filter: function (event, player) { + return player.countCards("he") > 1 && game.countPlayer() > 2; }, - direct:true, - content:function(){ - 'step 0' - var ai2=function(target){ - var player=_status.event.player; - if(get.attitude(player,target)<=0) return 0; - var list=['sha','juedou']; - var num=Math.max.apply(Math,list.map(function(i){ - return target.getUseValue({name:i,isCard:true},false); - })); - if(target.hasSkillTag('nogain')) num/=4; + direct: true, + content: function () { + "step 0"; + var ai2 = function (target) { + var player = _status.event.player; + if (get.attitude(player, target) <= 0) return 0; + var list = ["sha", "juedou"]; + var num = Math.max.apply( + Math, + list.map(function (i) { + return target.getUseValue({ name: i, isCard: true }, false); + }) + ); + if (target.hasSkillTag("nogain")) num /= 4; return num; }; player.chooseCardTarget({ - prompt:get.prompt2('twxuanhuo'), - filterCard:true, - selectCard:2, - position:'he', - filterTarget:lib.filter.notMe, - goon:game.hasPlayer(function(current){ - return current!=player&&ai2(player,current)>0; + prompt: get.prompt2("twxuanhuo"), + filterCard: true, + selectCard: 2, + position: "he", + filterTarget: lib.filter.notMe, + goon: game.hasPlayer(function (current) { + return current != player && ai2(player, current) > 0; }), - ai1:function(card){ - if(!_status.event.goon) return 0; - return 7-get.value(card); + ai1: function (card) { + if (!_status.event.goon) return 0; + return 7 - get.value(card); }, - ai2:ai2, + ai2: ai2, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twxuanhuo',target); - player.give(result.cards,target); - } + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twxuanhuo", target); + player.give(result.cards, target); + } else event.finish(); + ("step 2"); + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) + player + .chooseTarget( + function (card, player, target) { + return target != player && target != _status.event.target; + }, + "选择" + get.translation(target) + "使用【杀】或【决斗】的目标", + true + ) + .set("target", target) + .set("ai", function (target) { + var evt = _status.event; + var list = ["sha", "juedou"]; + return Math.max.apply( + Math, + list.map(function (i) { + var card = { name: i, isCard: true }; + if (!evt.target.canUse(card, target, false)) return 0; + return get.effect(target, card, evt.target, evt.player); + }) + ); + }); else event.finish(); - 'step 2' - if(game.hasPlayer(function(current){ - return current!=player&¤t!=target; - })) player.chooseTarget(function(card,player,target){ - return target!=player&&target!=_status.event.target; - },'选择'+get.translation(target)+'使用【杀】或【决斗】的目标',true).set('target',target).set('ai',function(target){ - var evt=_status.event; - var list=['sha','juedou']; - return Math.max.apply(Math,list.map(function(i){ - var card={name:i,isCard:true}; - if(!evt.target.canUse(card,target,false)) return 0; - return get.effect(target,card,evt.target,evt.player); - })); - }); - else event.finish(); - 'step 3' - var target2=result.targets[0]; - event.target2=target2; + ("step 3"); + var target2 = result.targets[0]; + event.target2 = target2; player.line(target2); - var vcards=[]; - if(target.canUse({name:'sha',isCard:true},target2,false)) vcards.push(['基本','','sha']); - if(target.canUse({name:'juedou',isCard:true},target2,false)) vcards.push(['锦囊','','juedou']); - if(!vcards.length){ - if(!target.countCards('h')) event.finish(); - else event._result={index:1}; + var vcards = []; + if (target.canUse({ name: "sha", isCard: true }, target2, false)) + vcards.push(["基本", "", "sha"]); + if (target.canUse({ name: "juedou", isCard: true }, target2, false)) + vcards.push(["锦囊", "", "juedou"]); + if (!vcards.length) { + if (!target.countCards("h")) event.finish(); + else event._result = { index: 1 }; + } else if (!target.countCards("h")) { + event.vcards = vcards; + event._result = { index: 0 }; + } else { + event.vcards = vcards; + target + .chooseControl() + .set("choiceList", [ + "视为对" + get.translation(target2) + "使用一张【杀】或【决斗】", + "令" + get.translation(player) + "获得你的两张牌", + ]); } - else if(!target.countCards('h')){ - event.vcards=vcards; - event._result={index:0}; - } - else { - event.vcards=vcards; - target.chooseControl().set('choiceList',[ - '视为对'+get.translation(target2)+'使用一张【杀】或【决斗】', - '令'+get.translation(player)+'获得你的两张牌', - ]); - } - 'step 4' - if(result.index==0){ - if(event.vcards.length==1) event._result={links:event.vcards,bool:true}; - else target.chooseButton(['请选择要对'+get.translation(event.target2)+'使用的牌',[event.vcards,'vcard']],true).set('ai',function(button){ - var player=_status.event.player; - return get.effect(_status.event.getParent().target2,{name:button.link[2],isCard:true},player,player); - }); - } - else { - player.gainPlayerCard(target,2,'he',true); + ("step 4"); + if (result.index == 0) { + if (event.vcards.length == 1) event._result = { links: event.vcards, bool: true }; + else + target + .chooseButton( + [ + "请选择要对" + get.translation(event.target2) + "使用的牌", + [event.vcards, "vcard"], + ], + true + ) + .set("ai", function (button) { + var player = _status.event.player; + return get.effect( + _status.event.getParent().target2, + { name: button.link[2], isCard: true }, + player, + player + ); + }); + } else { + player.gainPlayerCard(target, 2, "he", true); event.finish(); } - 'step 5' - if(result.bool) target.useCard({name:result.links[0][2],isCard:true},false,event.target2); + ("step 5"); + if (result.bool) + target.useCard({ name: result.links[0][2], isCard: true }, false, event.target2); }, - ai:{ - expose:0.15, + ai: { + expose: 0.15, }, }, - twenyuan:{ - audio:'reenyuan', - group:['twenyuan1','twenyuan2'], + twenyuan: { + audio: "reenyuan", + group: ["twenyuan1", "twenyuan2"], }, - twenyuan1:{ - audio:'reenyuan', - trigger:{ - global:['gainAfter','loseAsyncAfter'] + twenyuan1: { + audio: "reenyuan", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - direct:true, - filter:function(event,player){ - var cards=event.getg(player); - if(!cards.length||cards.length<2) return false; - return game.countPlayer(current=>{ - if(current==player) return false; - var evt=event.getl(current); - if(evt&&evt.cards&&evt.cards.filter(card=>cards.includes(card)).length>=2) return true; + direct: true, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length || cards.length < 2) return false; + return game.countPlayer((current) => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.filter((card) => cards.includes(card)).length >= 2) + return true; return false; }); }, - check:function(event,player){ - var cards=event.getg(player); - var target=game.filterPlayer(current=>{ - if(current==player) return false; - var evt=event.getl(current); - if(evt&&evt.cards&&evt.cards.filter(card=>cards.includes(card)).length>=2) return true; + check: function (event, player) { + var cards = event.getg(player); + var target = game.filterPlayer((current) => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.filter((card) => cards.includes(card)).length >= 2) + return true; return false; })[0]; - return get.attitude(player,target)>0; + return get.attitude(player, target) > 0; }, - logTarget:function(event,player){ - var cards=event.getg(player); - return game.filterPlayer(current=>{ - if(current==player) return false; - var evt=event.getl(current); - if(evt&&evt.cards&&evt.cards.filter(card=>cards.includes(card)).length>=2) return true; + logTarget: function (event, player) { + var cards = event.getg(player); + return game.filterPlayer((current) => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.filter((card) => cards.includes(card)).length >= 2) + return true; return false; }); }, - content:function(){ - 'step 0' - var target=lib.skill.twenyuan1.logTarget(trigger,player)[0]; - event.target=target; - var list=['摸一张牌']; - var prompt2='令'+get.translation(target)+'摸一张牌'; - if((!target.countCards('h')||!target.countCards('e'))&&target.isDamaged()){ - list.push('回复1点体力'); - prompt2+='或回复1点体力'; + content: function () { + "step 0"; + var target = lib.skill.twenyuan1.logTarget(trigger, player)[0]; + event.target = target; + var list = ["摸一张牌"]; + var prompt2 = "令" + get.translation(target) + "摸一张牌"; + if ((!target.countCards("h") || !target.countCards("e")) && target.isDamaged()) { + list.push("回复1点体力"); + prompt2 += "或回复1点体力"; } - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt('twenyuan',target)).set('prompt2',prompt2).set('ai',()=>_status.event.choice).set('choice',function(){ - if(get.attitude(player,target)>0){ - if(target.hp<=2&&list.includes('回复1点体力')) return '回复1点体力'; - return 0; - } - return 'cancel2'; - }()); - 'step 1' - if(result.control=='cancel2'){ - event.finish(); return; + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("twenyuan", target)) + .set("prompt2", prompt2) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + if (get.attitude(player, target) > 0) { + if (target.hp <= 2 && list.includes("回复1点体力")) return "回复1点体力"; + return 0; + } + return "cancel2"; + })() + ); + ("step 1"); + if (result.control == "cancel2") { + event.finish(); + return; } - player.logSkill('twenyuan1',target); - if(result.control=='回复1点体力') target.recover(); + player.logSkill("twenyuan1", target); + if (result.control == "回复1点体力") target.recover(); else target.draw(); }, }, - twenyuan2:{ - audio:'reenyuan', - trigger:{player:'damageEnd'}, - logTarget:'source', - filter:function(event,player){ - return event.source&&event.source.isIn(); + twenyuan2: { + audio: "reenyuan", + trigger: { player: "damageEnd" }, + logTarget: "source", + filter: function (event, player) { + return event.source && event.source.isIn(); }, - check:function(event,player){ - var att=get.attitude(player,event.source); - var num=event.source.countCards('h'); - if(att<=0) return true; - if(get.effect(event.source,{name:'losehp'},player,event.source)>0) return true; - if(num>2) return true; - if(num) return att<4; + check: function (event, player) { + var att = get.attitude(player, event.source); + var num = event.source.countCards("h"); + if (att <= 0) return true; + if (get.effect(event.source, { name: "losehp" }, player, event.source) > 0) return true; + if (num > 2) return true; + if (num) return att < 4; return false; }, - prompt2:'令其选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。', - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' - var target=trigger.source; + prompt2: "令其选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。", + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); + var target = trigger.source; event.count--; - if(!target.countCards('h')) event._result={bool:false}; - else target.chooseCard('h','恩怨:将一张手牌交给'+get.translation(player)+',或失去1点体力').set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.getParent().player)>0){ - if(get.suit(card)!='heart') return 15-get.value(card); - return 11-get.value(card); - } - else { - var num=12-_status.event.player.hp*2; - if(get.suit(card)!='heart') num-=2; - return num-get.value(card); - } - }); - 'step 2' - var target=trigger.source; - if(result.bool){ - var card=result.cards[0]; - event.card=card; - target.give(card,player); - } - else{ + if (!target.countCards("h")) event._result = { bool: false }; + else + target + .chooseCard( + "h", + "恩怨:将一张手牌交给" + get.translation(player) + ",或失去1点体力" + ) + .set("ai", function (card) { + if ( + get.attitude(_status.event.player, _status.event.getParent().player) > 0 + ) { + if (get.suit(card) != "heart") return 15 - get.value(card); + return 11 - get.value(card); + } else { + var num = 12 - _status.event.player.hp * 2; + if (get.suit(card) != "heart") num -= 2; + return num - get.value(card); + } + }); + ("step 2"); + var target = trigger.source; + if (result.bool) { + var card = result.cards[0]; + event.card = card; + target.give(card, player); + } else { target.loseHp(); event.goto(4); } - 'step 3' - if(get.suit(card)!='heart') player.draw(); - 'step 4' - var target=trigger.source; - if(target.isIn()&&event.count>0&&player.hasSkill('twenyuan')) player.chooseBool(get.prompt('twenyuan',target),lib.skill.twenyuan2.prompt2).set('ai',function(){ - var evt=_status.event.getTrigger(); - return lib.skill.twenyuan2.check(evt,evt.player); - }); + ("step 3"); + if (get.suit(card) != "heart") player.draw(); + ("step 4"); + var target = trigger.source; + if (target.isIn() && event.count > 0 && player.hasSkill("twenyuan")) + player + .chooseBool(get.prompt("twenyuan", target), lib.skill.twenyuan2.prompt2) + .set("ai", function () { + var evt = _status.event.getTrigger(); + return lib.skill.twenyuan2.check(evt, evt.player); + }); else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('twenyuan2',trigger.source); + ("step 5"); + if (result.bool) { + player.logSkill("twenyuan2", trigger.source); event.goto(1); } }, }, //马岱 - twqianxi:{ - audio:'qianxi', - trigger:{player:'phaseZhunbeiBegin'}, - preHidden:true, - content:function(){ - 'step 0' + twqianxi: { + audio: "qianxi", + trigger: { player: "phaseZhunbeiBegin" }, + preHidden: true, + content: function () { + "step 0"; player.draw(); - 'step 1' - if(player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'tweqianxi'),'he')) player.chooseToDiscard('he',true); + ("step 1"); + if (player.hasCard((card) => lib.filter.cardDiscardable(card, player, "tweqianxi"), "he")) + player.chooseToDiscard("he", true); else event.finish(); - 'step 2' - if(!result.bool||!game.hasPlayer(target=>{ - return player!=target&&get.distance(player,target)<=1; - })){ + ("step 2"); + if ( + !result.bool || + !game.hasPlayer((target) => { + return player != target && get.distance(player, target) <= 1; + }) + ) { event.finish(); return; } - event.color=get.color(result.cards[0],player); - player.chooseTarget(function(card,player,target){ - return player!=target&&get.distance(player,target)<=1; - },true).set('ai',function(target){ - return get.effect(target,{name:'sha'},_status.event.player,_status.event.player)+5; - }); - 'step 3' - if(result.bool){ - var target=result.targets[0]; + event.color = get.color(result.cards[0], player); + player + .chooseTarget(function (card, player, target) { + return player != target && get.distance(player, target) <= 1; + }, true) + .set("ai", function (target) { + return ( + get.effect( + target, + { name: "sha" }, + _status.event.player, + _status.event.player + ) + 5 + ); + }); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - target.storage.twqianxi2=event.color; - target.addTempSkill('twqianxi2'); - player.addTempSkill('twqianxi_self'); - player.markAuto('twqianxi_self',[target]); + target.storage.twqianxi2 = event.color; + target.addTempSkill("twqianxi2"); + player.addTempSkill("twqianxi_self"); + player.markAuto("twqianxi_self", [target]); } }, - subSkill:{ - self:{ - audio:'qianxi', - charlotte:true, - onremove:true, - forced:true, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasHistory('sourceDamage',evt=>{ - if(!evt.card||evt.card.name!='sha'||!evt.player.isIn()) return false; - if(player.getStorage('twqianxi_self').includes(evt.player)) return true; + subSkill: { + self: { + audio: "qianxi", + charlotte: true, + onremove: true, + forced: true, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.hasHistory("sourceDamage", (evt) => { + if (!evt.card || evt.card.name != "sha" || !evt.player.isIn()) return false; + if (player.getStorage("twqianxi_self").includes(evt.player)) return true; return false; }); }, - content:function(){ - 'step 0' - var targets=[]; - player.getHistory('sourceDamage',evt=>{ - if(!evt.card||evt.card.name!='sha') return false; - if(player.getStorage('twqianxi_self').includes(evt.player)){ + content: function () { + "step 0"; + var targets = []; + player.getHistory("sourceDamage", (evt) => { + if (!evt.card || evt.card.name != "sha") return false; + if (player.getStorage("twqianxi_self").includes(evt.player)) { targets.add(evt.player); } return false; }); player.line(targets); - for(var target of targets){ - target.storage.twqianxi3=target.storage.twqianxi2; - target.addTempSkill('twqianxi3',{player:'phaseAfter'}); + for (var target of targets) { + target.storage.twqianxi3 = target.storage.twqianxi2; + target.addTempSkill("twqianxi3", { player: "phaseAfter" }); } - } - } - } - }, - twqianxi2:{ - mark:true, - charlotte:true, - onremove:true, - intro:{ - markcount:()=>0, - content:function(storage){ - return '不能使用或打出'+get.translation(storage)+'手牌'; - }, - }, - mod:{ - cardEnabled2:function(card,player){ - if(get.itemtype(card)=='card'&&get.color(card)==player.getStorage('twqianxi2')&&get.position(card)=='h') return false; + }, }, }, }, - twqianxi3:{ - mod:{ - cardEnabled2:function(card,player){ - if(get.itemtype(card)=='card'&&get.color(card)!=player.getStorage('twqianxi3')&&get.position(card)=='h') return false; + twqianxi2: { + mark: true, + charlotte: true, + onremove: true, + intro: { + markcount: () => 0, + content: function (storage) { + return "不能使用或打出" + get.translation(storage) + "手牌"; }, }, - mark:true, - intro:{ - content:function(storage){ - return '不能使用或打出非'+get.translation(storage)+'手牌'; + mod: { + cardEnabled2: function (card, player) { + if ( + get.itemtype(card) == "card" && + get.color(card) == player.getStorage("twqianxi2") && + get.position(card) == "h" + ) + return false; }, }, - charlotte:true, - onremove:true, + }, + twqianxi3: { + mod: { + cardEnabled2: function (card, player) { + if ( + get.itemtype(card) == "card" && + get.color(card) != player.getStorage("twqianxi3") && + get.position(card) == "h" + ) + return false; + }, + }, + mark: true, + intro: { + content: function (storage) { + return "不能使用或打出非" + get.translation(storage) + "手牌"; + }, + }, + charlotte: true, + onremove: true, }, //牛金 - twcuorui:{ - audio:'cuorui', - limited:true, - skillAnimation:true, - animationColor:'thunder', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h'); + twcuorui: { + audio: "cuorui", + limited: true, + skillAnimation: true, + animationColor: "thunder", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countCards("h") > player.countCards("h"); }); }, - check:function(event,player){ - var num=0; - for(var target of game.players){ - if(target!=player&&target.countCards('h')>num) num=target.countCards('h'); + check: function (event, player) { + var num = 0; + for (var target of game.players) { + if (target != player && target.countCards("h") > num) num = target.countCards("h"); } - num=Math.min(num,5+player.countCards('h')); - return num-player.countCards('h')>=2; + num = Math.min(num, 5 + player.countCards("h")); + return num - player.countCards("h") >= 2; }, - prompt:function(event,player){ - var num=0; - for(var target of game.players){ - if(target!=player&&target.countCards('h')>num) num=target.countCards('h'); + prompt: function (event, player) { + var num = 0; + for (var target of game.players) { + if (target != player && target.countCards("h") > num) num = target.countCards("h"); } - num=Math.min(num,5+player.countCards('h')); - return get.prompt('twcuorui')+'(可摸'+get.cnNumber(num-player.countCards('h'))+'张牌)'; + num = Math.min(num, 5 + player.countCards("h")); + return ( + get.prompt("twcuorui") + + "(可摸" + + get.cnNumber(num - player.countCards("h")) + + "张牌)" + ); }, - content:function(){ - 'step 0' - player.awakenSkill('twcuorui'); - var num=0; - for(var target of game.players){ - if(target!=player&&target.countCards('h')>num) num=target.countCards('h'); + content: function () { + "step 0"; + player.awakenSkill("twcuorui"); + var num = 0; + for (var target of game.players) { + if (target != player && target.countCards("h") > num) num = target.countCards("h"); } - num=Math.min(num,5+player.countCards('h')); + num = Math.min(num, 5 + player.countCards("h")); player.drawTo(num); - if(!player.isDisabledJudge()){ + if (!player.isDisabledJudge()) { player.disableJudge(); event.finish(); - } - else player.chooseTarget('挫锐:是否对一名其他角色造成1点伤害?',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ + } else + player + .chooseTarget("挫锐:是否对一名其他角色造成1点伤害?", lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { player.line(result.targets[0]); result.targets[0].damage(); } }, }, - twliewei:{ - audio:'liewei', - trigger:{source:'dieAfter'}, - forced:true, - content:function(){ - 'step 0' - if(!player.hasSkill('twcuorui',null,null,false)||!player.awakenedSkills.includes('twcuorui')) event._result={index:0}; - else player.chooseControl().set('prompt','裂围:请选择一项').set('choiceList',[ - '摸两张牌', - '重置〖挫锐〗' - ]).set('ai',function(){ - return 1; - }); - 'step 1' - if(result.index==0) player.draw(2); - else player.restoreSkill('twcuorui'); + twliewei: { + audio: "liewei", + trigger: { source: "dieAfter" }, + forced: true, + content: function () { + "step 0"; + if ( + !player.hasSkill("twcuorui", null, null, false) || + !player.awakenedSkills.includes("twcuorui") + ) + event._result = { index: 0 }; + else + player + .chooseControl() + .set("prompt", "裂围:请选择一项") + .set("choiceList", ["摸两张牌", "重置〖挫锐〗"]) + .set("ai", function () { + return 1; + }); + ("step 1"); + if (result.index == 0) player.draw(2); + else player.restoreSkill("twcuorui"); }, }, //母兵脸 - twzhengrong:{ - audio:'drlt_zhenrong', - trigger:{player:'useCardAfter',source:'damageSource'}, - filter:function(event,player){ - if(!event.isPhaseUsing(player)) return false; - if(event.name=='damage') return player.getHistory('sourceDamage',evt=>{ - return evt.getParent('phaseUse')==event.getParent('phaseUse'); - }).indexOf(event)==0; - if(!event.targets||event.targets.every(target=>target==player)) return false; - return player.getAllHistory('useCard',function(evt){ - if(!evt.isPhaseUsing(player)) return false; - if(evt.targets.every(target=>target==player)) return false; - return true; - }).indexOf(event)%2==1; + twzhengrong: { + audio: "drlt_zhenrong", + trigger: { player: "useCardAfter", source: "damageSource" }, + filter: function (event, player) { + if (!event.isPhaseUsing(player)) return false; + if (event.name == "damage") + return ( + player + .getHistory("sourceDamage", (evt) => { + return evt.getParent("phaseUse") == event.getParent("phaseUse"); + }) + .indexOf(event) == 0 + ); + if (!event.targets || event.targets.every((target) => target == player)) return false; + return ( + player + .getAllHistory("useCard", function (evt) { + if (!evt.isPhaseUsing(player)) return false; + if (evt.targets.every((target) => target == player)) return false; + return true; + }) + .indexOf(event) % + 2 == + 1 + ); }, - direct:true, - content:function(){ - 'step 0' - if(!game.hasPlayer(function(target){ - return target!=player&&target.countCards('he'); - })){ + direct: true, + content: function () { + "step 0"; + if ( + !game.hasPlayer(function (target) { + return target != player && target.countCards("he"); + }) + ) { event.finish(); return; } - player.chooseTarget(get.prompt('twzhengrong'),'将一名其他角色的一张牌置于武将牌上,称为“荣”',function(card,player,target){ - return target!=player&&target.countCards('he'); - }).set('ai',function(target){ - return get.effect(target,{name:'guohe_copy2'},_status.event.player,_status.event.player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=result.targets[0]; - player.logSkill('twzhengrong',target); - player.choosePlayerCard(target,'he',true); - } - else event.finish(); - 'step 2' - if(result.bool) player.addToExpansion(result.links,target,'give').gaintag.add('twzhengrong'); + player + .chooseTarget( + get.prompt("twzhengrong"), + "将一名其他角色的一张牌置于武将牌上,称为“荣”", + function (card, player, target) { + return target != player && target.countCards("he"); + } + ) + .set("ai", function (target) { + return get.effect( + target, + { name: "guohe_copy2" }, + _status.event.player, + _status.event.player + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = result.targets[0]; + player.logSkill("twzhengrong", target); + player.choosePlayerCard(target, "he", true); + } else event.finish(); + ("step 2"); + if (result.bool) + player.addToExpansion(result.links, target, "give").gaintag.add("twzhengrong"); }, - marktext:'荣', - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + marktext: "荣", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + markcount: "expansion", }, - intro:{ - content:'expansion', - markcount:'expansion', - } }, - twhongju:{ - derivation:['twqingce','twsaotao'], - audio:'drlt_hongju', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.getExpansions('twzhengrong').length>=3; + twhongju: { + derivation: ["twqingce", "twsaotao"], + audio: "drlt_hongju", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.getExpansions("twzhengrong").length >= 3; }, - content:function(){ - 'step 0' - player.awakenSkill('twhongju'); - player.draw(player.getExpansions('twzhengrong').length); - 'step 1' - if(player.countCards('h')==0) event.goto(3); - else{ - var next=player.chooseToMove('鸿举:请选择要交换的手牌和“荣”'); - next.set('list',[ - [get.translation(player)+'(你)的“荣”',player.getExpansions('twzhengrong'),'twzhengrong_tag'], - ['手牌区',player.getCards('h')], + content: function () { + "step 0"; + player.awakenSkill("twhongju"); + player.draw(player.getExpansions("twzhengrong").length); + ("step 1"); + if (player.countCards("h") == 0) event.goto(3); + else { + var next = player.chooseToMove("鸿举:请选择要交换的手牌和“荣”"); + next.set("list", [ + [ + get.translation(player) + "(你)的“荣”", + player.getExpansions("twzhengrong"), + "twzhengrong_tag", + ], + ["手牌区", player.getCards("h")], ]); - next.set('filterMove',function(from,to){ - return typeof to!='number'; + next.set("filterMove", function (from, to) { + return typeof to != "number"; }); - next.set('processAI',function(list){ - var player=_status.event.player,cards=list[0][1].concat(list[1][1]).sort(function(a,b){ - return player.getUseValue(a)-player.getUseValue(b); - }),cards2=cards.splice(0,player.getExpansions('twzhengrong').length); - return [cards2,cards]; + next.set("processAI", function (list) { + var player = _status.event.player, + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return player.getUseValue(a) - player.getUseValue(b); + }), + cards2 = cards.splice(0, player.getExpansions("twzhengrong").length); + return [cards2, cards]; }); } - 'step 2' - if(result.bool){ - var pushs=result.moved[0],gains=result.moved[1]; - pushs.removeArray(player.getExpansions('twzhengrong')); - gains.removeArray(player.getCards('h')); - if(!pushs.length||pushs.length!=gains.length) return; - player.addToExpansion(pushs,player,'giveAuto').gaintag.add('twzhengrong'); - game.log(player,'将',pushs,'作为“荣”置于武将牌上'); - player.gain(gains,'gain2'); + ("step 2"); + if (result.bool) { + var pushs = result.moved[0], + gains = result.moved[1]; + pushs.removeArray(player.getExpansions("twzhengrong")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + player.addToExpansion(pushs, player, "giveAuto").gaintag.add("twzhengrong"); + game.log(player, "将", pushs, "作为“荣”置于武将牌上"); + player.gain(gains, "gain2"); } - 'step 3' - player.addSkills('twqingce'); - player.chooseBool('是否减1点体力上限并获得〖扫讨〗?').set('ai',()=>_status.event.bool).set('bool',player.isDamaged()&&player.countCards('h')>=3?(Math.random()<0.5?true:false):false); - 'step 4' - if(result.bool){ + ("step 3"); + player.addSkills("twqingce"); + player + .chooseBool("是否减1点体力上限并获得〖扫讨〗?") + .set("ai", () => _status.event.bool) + .set( + "bool", + player.isDamaged() && player.countCards("h") >= 3 + ? Math.random() < 0.5 + ? true + : false + : false + ); + ("step 4"); + if (result.bool) { player.loseMaxHp(); - player.addSkills('twsaotao'); + player.addSkills("twsaotao"); game.delayx(); } }, }, - twqingce:{ - enable:'phaseUse', - audio:'drlt_qingce', - filter:function(event,player){ - return player.getExpansions('twzhengrong').length>0; + twqingce: { + enable: "phaseUse", + audio: "drlt_qingce", + filter: function (event, player) { + return player.getExpansions("twzhengrong").length > 0; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('清侧:请选择要移去的“荣”',player.getExpansions('twzhengrong'),'hidden'); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog( + "清侧:请选择要移去的“荣”", + player.getExpansions("twzhengrong"), + "hidden" + ); }, - backup:function(links,player){ + backup: function (links, player) { return { - card:links[0], - filterCard:function(){return false}, - selectCard:-1, - filterTarget:function(card,player,target){ - return target.countDiscardableCards(player,'hej')>0; + card: links[0], + filterCard: function () { + return false; }, - delay:false, - audio:'drlt_qingce', - content:lib.skill.twqingce.contentx, - ai:{ - result:{ - target:function(player,target){ - return get.effect(target,{name:'guohe'},player,target); + selectCard: -1, + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "hej") > 0; + }, + delay: false, + audio: "drlt_qingce", + content: lib.skill.twqingce.contentx, + ai: { + result: { + target: function (player, target) { + return get.effect(target, { name: "guohe" }, player, target); }, }, }, - } + }; }, - prompt:()=>'弃置一名角色区域内的一张牌', + prompt: () => "弃置一名角色区域内的一张牌", }, - contentx:function(){ - 'step 0' - var card=lib.skill.twqingce_backup.card; + contentx: function () { + "step 0"; + var card = lib.skill.twqingce_backup.card; player.loseToDiscardpile([card]); - 'step 1' - if(target.countDiscardableCards(player,'hej')>0) player.discardPlayerCard('hej',true,target); + ("step 1"); + if (target.countDiscardableCards(player, "hej") > 0) + player.discardPlayerCard("hej", true, target); }, - ai:{ - order:8, - result:{ - player:function(player){ - if(game.hasPlayer(function(target){ - return get.effect(target,{name:'guohe'},player,player)>4*Math.max(0,5-player.getExpansions('twzhengrong').length); - })) return 1; + ai: { + order: 8, + result: { + player: function (player) { + if ( + game.hasPlayer(function (target) { + return ( + get.effect(target, { name: "guohe" }, player, player) > + 4 * Math.max(0, 5 - player.getExpansions("twzhengrong").length) + ); + }) + ) + return 1; return 0; }, }, }, }, - twsaotao:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card.name=='sha'||get.type(event.card)=='trick'; + twsaotao: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "sha" || get.type(event.card) == "trick"; }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.directHit.addArray(game.players); }, - ai:{directHit_ai:true}, + ai: { directHit_ai: true }, }, //大小乔 - twxingwu:{ - audio:'xingwu', - trigger:{player:'phaseDiscardBegin'}, - filter:function(event,player){ - return player.countCards('he'); + twxingwu: { + audio: "xingwu", + trigger: { player: "phaseDiscardBegin" }, + filter: function (event, player) { + return player.countCards("he"); }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('twxingwu'),'将一张牌置于武将牌上作为“星舞”').set('ai',function(card){ - if(_status.event.goon) return 20-get.value(card); - return 7-get.value(card); - }).set('goon',player.needsToDiscard()||player.getExpansions('twxingwu').length>1); - 'step 1' - if(result.bool){ - player.logSkill('twxingwu'); - var cards=result.cards; - player.addToExpansion(cards,player,'give').gaintag.add('twxingwu'); - } - else event.finish(); - 'step 2' + direct: true, + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("twxingwu"), "将一张牌置于武将牌上作为“星舞”") + .set("ai", function (card) { + if (_status.event.goon) return 20 - get.value(card); + return 7 - get.value(card); + }) + .set("goon", player.needsToDiscard() || player.getExpansions("twxingwu").length > 1); + ("step 1"); + if (result.bool) { + player.logSkill("twxingwu"); + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("twxingwu"); + } else event.finish(); + ("step 2"); game.delayx(); - if(player.getExpansions('twxingwu').length<3||!game.hasPlayer(current=>current!=player)) event.finish(); - 'step 3' - player.chooseButton(['是否移去三张“星舞”牌并发射核弹?',player.getExpansions('twxingwu')],3).set('ai',function(button){ - if(_status.event.goon) return 1; - return 0; - }).set('goon',game.hasPlayer(current=>get.damageEffect(current,player,player)<0)); - 'step 4' - if(result.bool) player.loseToDiscardpile(result.links); + if ( + player.getExpansions("twxingwu").length < 3 || + !game.hasPlayer((current) => current != player) + ) + event.finish(); + ("step 3"); + player + .chooseButton( + ["是否移去三张“星舞”牌并发射核弹?", player.getExpansions("twxingwu")], + 3 + ) + .set("ai", function (button) { + if (_status.event.goon) return 1; + return 0; + }) + .set( + "goon", + game.hasPlayer((current) => get.damageEffect(current, player, player) < 0) + ); + ("step 4"); + if (result.bool) player.loseToDiscardpile(result.links); else event.finish(); - 'step 5' - player.chooseTarget('星舞:选择一名其他角色','弃置其装备区内的所有牌。然后对其造成2点伤害(若其性别包含女性则改为1点)',true,lib.filter.notMe).set('ai',function(target){ - return get.damageEffect(target,player,player)*Math.sqrt(4+target.countCards('e',function(card){ - return get.value(card,target)>0; - }))*(target.hasSex('female')?1:2); - }); - 'step 6' - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'green'); - var num=target.countCards('e'); - if(num) player.discardPlayerCard(target,'e',num,true); - target.damage(target.hasSex('female')?1:2); + ("step 5"); + player + .chooseTarget( + "星舞:选择一名其他角色", + "弃置其装备区内的所有牌。然后对其造成2点伤害(若其性别包含女性则改为1点)", + true, + lib.filter.notMe + ) + .set("ai", function (target) { + return ( + get.damageEffect(target, player, player) * + Math.sqrt( + 4 + + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) + ) * + (target.hasSex("female") ? 1 : 2) + ); + }); + ("step 6"); + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; + player.line(target, "green"); + var num = target.countCards("e"); + if (num) player.discardPlayerCard(target, "e", num, true); + target.damage(target.hasSex("female") ? 1 : 2); } }, - intro:{ - content:'expansion', - markcount:'expansion', - onunmark:function(storage,player){ - if(player.hasSkill('twpingting')) return; - player.removeAdditionalSkill('twpingting'); + intro: { + content: "expansion", + markcount: "expansion", + onunmark: function (storage, player) { + if (player.hasSkill("twpingting")) return; + player.removeAdditionalSkill("twpingting"); }, }, - onremove:function(player,skill){ - if(player.hasSkill('twpingting')) return; - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + if (player.hasSkill("twpingting")) return; + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, }, - twpingting:{ - audio:2, - trigger:{global:['roundStart','dying']}, - init:function(player,skill){ - if(player.getExpansions('twxingwu').length) player.addAdditionalSkill(skill,['tianxiang','liuli']); + twpingting: { + audio: 2, + trigger: { global: ["roundStart", "dying"] }, + init: function (player, skill) { + if (player.getExpansions("twxingwu").length) + player.addAdditionalSkill(skill, ["tianxiang", "liuli"]); else player.removeAdditionalSkill(skill); }, - filter:function(event,player){ - if(event.name=='dying') return player==_status.currentPhase&&event.player!=player; + filter: function (event, player) { + if (event.name == "dying") + return player == _status.currentPhase && event.player != player; return true; }, - forced:true, - group:'twpingting_update', - derivation:['tianxiang','liuli'], - content:function(){ - 'step 0' + forced: true, + group: "twpingting_update", + derivation: ["tianxiang", "liuli"], + content: function () { + "step 0"; player.draw(); - player.chooseCard('he','娉婷:将一张牌置于武将牌上,称为“星舞”',true).set('ai',function(card){ - return -get.value(card); - }); - 'step 1' - if(result.bool){ - var cards=result.cards; - player.addToExpansion(cards,player,'give').gaintag.add('twxingwu'); - } - }, - onremove:function(player,skill){ - if(player.hasSkill('twxingwu')) return; - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); - }, - subSkill:{ - update:{ - trigger:{player:['loseAfter','loseAsyncAfter','addToExpansionAfter']}, - filter:function(event,player){ - var cards=player.getExpansions('twxingwu'),skills=player.additionalSkills.twpingting; - return !((cards.length&&skills&&skills.length)||(!cards.length&&(!skills||!skills.length))); - }, - forced:true, - silent:true, - content:function(){ - lib.skill.twpingting.init(player,'twpingting'); - } - } - } - }, - tianxiang_daxiaoqiao:{audio:2,inherit:'tianxiang'}, - liuli_daxiaoqiao:{audio:2,inherit:'liuli'}, - //傅肜 - twxuewei:{ - audio:'xuewei', - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return event.player!=player&&game.players.length>2&&!player.hasSkill('twxuewei_round'); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twxuewei'),function(card,player,target){ - return target!=player&&target!=_status.event.getTrigger().player; - }).set('ai',function(target){ - if(get.attitude(player,_status.event.getTrigger().player)>=0) return 0; - return get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twxuewei',trigger.player,false); - player.addTempSkill('twxuewei_round','roundStart'); - player.line2([trigger.player,target]); - trigger.player.chooseControl('选项一','选项二').set('choiceList',[ - '本回合不能对'+get.translation(target)+'使用【杀】且手牌上限-2', - '令'+get.translation(player)+'视为对你使用一张【决斗】', - ]).set('ai',function(){ - var player=_status.event.player,source=_status.event.getParent().player; - if(get.effect(player,{name:'juedou'},source,player)>0) return 1; - if(player.hp-player.countCards('h')>2||player.hp<=2) return 0; - return 1; + player + .chooseCard("he", "娉婷:将一张牌置于武将牌上,称为“星舞”", true) + .set("ai", function (card) { + return -get.value(card); }); + ("step 1"); + if (result.bool) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("twxingwu"); } - else event.finish(); - 'step 2' - game.log(trigger.player,'选择了','#g【血卫】','的','#y'+result.control); - if(result.control=='选项一'){ - trigger.player.markAuto('twxuewei_block',[target]); - trigger.player.addTempSkill('twxuewei_block'); - } - else player.useCard({name:'juedou',isCard:true},trigger.player,false); }, - subSkill:{ - round:{charlotte:true}, - block:{ - charlotte:true, - onremove:true, - locked:true, - mark:true, - marktext:'卫', - intro:{ - content:function(storage,player){ - if(!storage||!storage.length) return; - return '不能对'+get.translation(storage)+'使用【杀】;手牌上限-'+(2*storage.length); - } + onremove: function (player, skill) { + if (player.hasSkill("twxingwu")) return; + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { + update: { + trigger: { player: ["loseAfter", "loseAsyncAfter", "addToExpansionAfter"] }, + filter: function (event, player) { + var cards = player.getExpansions("twxingwu"), + skills = player.additionalSkills.twpingting; + return !( + (cards.length && skills && skills.length) || + (!cards.length && (!skills || !skills.length)) + ); }, - mod:{ - maxHandcard:function(player,num){ - return num-2*player.getStorage('twxuewei_block').length; + forced: true, + silent: true, + content: function () { + lib.skill.twpingting.init(player, "twpingting"); + }, + }, + }, + }, + tianxiang_daxiaoqiao: { audio: 2, inherit: "tianxiang" }, + liuli_daxiaoqiao: { audio: 2, inherit: "liuli" }, + //傅肜 + twxuewei: { + audio: "xuewei", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return ( + event.player != player && + game.players.length > 2 && + !player.hasSkill("twxuewei_round") + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twxuewei"), function (card, player, target) { + return target != player && target != _status.event.getTrigger().player; + }) + .set("ai", function (target) { + if (get.attitude(player, _status.event.getTrigger().player) >= 0) return 0; + return get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twxuewei", trigger.player, false); + player.addTempSkill("twxuewei_round", "roundStart"); + player.line2([trigger.player, target]); + trigger.player + .chooseControl("选项一", "选项二") + .set("choiceList", [ + "本回合不能对" + get.translation(target) + "使用【杀】且手牌上限-2", + "令" + get.translation(player) + "视为对你使用一张【决斗】", + ]) + .set("ai", function () { + var player = _status.event.player, + source = _status.event.getParent().player; + if (get.effect(player, { name: "juedou" }, source, player) > 0) return 1; + if (player.hp - player.countCards("h") > 2 || player.hp <= 2) return 0; + return 1; + }); + } else event.finish(); + ("step 2"); + game.log(trigger.player, "选择了", "#g【血卫】", "的", "#y" + result.control); + if (result.control == "选项一") { + trigger.player.markAuto("twxuewei_block", [target]); + trigger.player.addTempSkill("twxuewei_block"); + } else player.useCard({ name: "juedou", isCard: true }, trigger.player, false); + }, + subSkill: { + round: { charlotte: true }, + block: { + charlotte: true, + onremove: true, + locked: true, + mark: true, + marktext: "卫", + intro: { + content: function (storage, player) { + if (!storage || !storage.length) return; + return ( + "不能对" + + get.translation(storage) + + "使用【杀】;手牌上限-" + + 2 * storage.length + ); }, - playerEnabled:function(card,player,target){ - if(card.name=='sha'&&player.getStorage('twxuewei_block').includes(target)) return false; + }, + mod: { + maxHandcard: function (player, num) { + return num - 2 * player.getStorage("twxuewei_block").length; + }, + playerEnabled: function (card, player, target) { + if ( + card.name == "sha" && + player.getStorage("twxuewei_block").includes(target) + ) + return false; }, }, }, }, }, - twliechi:{ - audio:'liechi', - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.source&&event.source.hp>=player.hp&&(event.source.countCards('h')>player.countCards('h')||event.source.countCards('he')); + twliechi: { + audio: "liechi", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + event.source && + event.source.hp >= player.hp && + (event.source.countCards("h") > player.countCards("h") || + event.source.countCards("he")) + ); }, - direct:true, - content:function(){ - 'step 0' - var num=trigger.source.countCards('h')-player.countCards('h'); - event.num=num; - var list=[],choiceList=[ - '令'+get.translation(trigger.source)+'弃置'+get.cnNumber(num)+'张手牌', - '弃置'+get.translation(trigger.source)+'一张牌', - '背水!弃置一张装备牌,然后依次执行以上所有选项', - ]; - if(trigger.source.countCards('h')>player.countCards('h')) list.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(trigger.source.countCards('he')) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(trigger.source.countCards('h')>player.countCards('h')&&trigger.source.countCards('he')&&player.countCards('he',{type:'equip'})&&game.getGlobalHistory('changeHp',evt=>{ - return evt.player==player&&evt.getParent()._dyinged; - }).length) list.push('背水!'); - else choiceList[2]=''+choiceList[2]+'(未进入过濒死状态)'; - player.chooseControl(list,'cancel2').set('prompt',get.prompt('twliechi',trigger.source)).set('choiceList',choiceList).set('ai',()=>_status.event.choice).set('choice',function(){ - if(get.attitude(player,trigger.source)>0) return 'cancel2'; - if(list.includes('背水!')) return '背水!'; - if(num>1) return '选项一'; - return '选项二'; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('twliechi',trigger.source); - game.log(player,'选择了','#g【烈斥】','的','#y'+result.control); - if(result.control=='背水!') player.chooseToDiscard('he',{type:'equip'},true); - if(result.control!='选项二') trigger.source.chooseToDiscard('h',num,true); - if(result.control!='选项一') player.discardPlayerCard(trigger.source,'he',true); + direct: true, + content: function () { + "step 0"; + var num = trigger.source.countCards("h") - player.countCards("h"); + event.num = num; + var list = [], + choiceList = [ + "令" + get.translation(trigger.source) + "弃置" + get.cnNumber(num) + "张手牌", + "弃置" + get.translation(trigger.source) + "一张牌", + "背水!弃置一张装备牌,然后依次执行以上所有选项", + ]; + if (trigger.source.countCards("h") > player.countCards("h")) list.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (trigger.source.countCards("he")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if ( + trigger.source.countCards("h") > player.countCards("h") && + trigger.source.countCards("he") && + player.countCards("he", { type: "equip" }) && + game.getGlobalHistory("changeHp", (evt) => { + return evt.player == player && evt.getParent()._dyinged; + }).length + ) + list.push("背水!"); + else + choiceList[2] = + '' + choiceList[2] + "(未进入过濒死状态)"; + player + .chooseControl(list, "cancel2") + .set("prompt", get.prompt("twliechi", trigger.source)) + .set("choiceList", choiceList) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + if (get.attitude(player, trigger.source) > 0) return "cancel2"; + if (list.includes("背水!")) return "背水!"; + if (num > 1) return "选项一"; + return "选项二"; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("twliechi", trigger.source); + game.log(player, "选择了", "#g【烈斥】", "的", "#y" + result.control); + if (result.control == "背水!") player.chooseToDiscard("he", { type: "equip" }, true); + if (result.control != "选项二") trigger.source.chooseToDiscard("h", num, true); + if (result.control != "选项一") player.discardPlayerCard(trigger.source, "he", true); } - } + }, }, //卢植 - twmingren:{ - marktext:'任', - intro:{ - content:'expansion', - markcount:'expansion', + twmingren: { + marktext: "任", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'twmingren_change', - audio:'nzry_mingren_1', - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&!player.getExpansions('twmingren').length; + group: "twmingren_change", + audio: "nzry_mingren_1", + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + !player.getExpansions("twmingren").length + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.draw(); - 'step 1' - if(!player.countCards('h')) event.finish(); - else player.chooseCard('h','明任:将一张手牌置于武将牌上,称为“任”',true).set('ai',function(card){ - return 6-get.value(card); - }); - 'step 2' - if(result.bool) player.addToExpansion(result.cards[0],player,'give','log').gaintag.add('twmingren'); - }, - subSkill:{ - change:{ - audio:'nzry_mingren_1', - trigger:{player:['phaseUseBegin','phaseUseEnd']}, - filter:function(event,player){ - return player.countCards('he')&&player.getExpansions('twmingren').length; - }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('twmingren'),'用一张牌替换“任”('+get.translation(player.getExpansions('twmingren')[0])+')').set('ai',function(card){ - var player=_status.event.player; - var color=get.color(card); - if(color==get.color(player.getExpansions('twmingren')[0])) return false; - var num=0; - var list=[]; - player.countCards('he',function(cardx){ - if(cardx!=card||get.color(cardx)!=color) return false; - if(list.includes(cardx.name)) return false; - list.push(cardx.name); - switch (cardx.name){ - case 'wuxie':num+=(game.countPlayer()/2.2); break; - case 'caochuan':num+=1.1; break; - case 'shan':num+=1; break; - } - }); - return num*(30-get.value(card)); + ("step 1"); + if (!player.countCards("h")) event.finish(); + else + player + .chooseCard("h", "明任:将一张手牌置于武将牌上,称为“任”", true) + .set("ai", function (card) { + return 6 - get.value(card); }); - 'step 1' - if(result.bool){ - player.logSkill('twmingren'); - player.addToExpansion(result.cards[0],'log','give',player).gaintag.add('twmingren'); - var card=player.getExpansions('twmingren')[0]; - if(card) player.gain(card,'gain2'); + ("step 2"); + if (result.bool) + player + .addToExpansion(result.cards[0], player, "give", "log") + .gaintag.add("twmingren"); + }, + subSkill: { + change: { + audio: "nzry_mingren_1", + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + filter: function (event, player) { + return player.countCards("he") && player.getExpansions("twmingren").length; + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + "he", + get.prompt("twmingren"), + "用一张牌替换“任”(" + + get.translation(player.getExpansions("twmingren")[0]) + + ")" + ) + .set("ai", function (card) { + var player = _status.event.player; + var color = get.color(card); + if (color == get.color(player.getExpansions("twmingren")[0])) + return false; + var num = 0; + var list = []; + player.countCards("he", function (cardx) { + if (cardx != card || get.color(cardx) != color) return false; + if (list.includes(cardx.name)) return false; + list.push(cardx.name); + switch (cardx.name) { + case "wuxie": + num += game.countPlayer() / 2.2; + break; + case "caochuan": + num += 1.1; + break; + case "shan": + num += 1; + break; + } + }); + return num * (30 - get.value(card)); + }); + ("step 1"); + if (result.bool) { + player.logSkill("twmingren"); + player + .addToExpansion(result.cards[0], "log", "give", player) + .gaintag.add("twmingren"); + var card = player.getExpansions("twmingren")[0]; + if (card) player.gain(card, "gain2"); } }, }, }, }, - twzhenliang:{ - group:['twzhenliang_1','twzhenliang_2'], - audio:'nzry_zhenliang_1', - mark:true, - zhuanhuanji:true, - marktext:'☯', - intro:{ - content:function(storage,player,skill){ - if(player.storage.twzhenliang==true) return '当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; - return '出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; + twzhenliang: { + group: ["twzhenliang_1", "twzhenliang_2"], + audio: "nzry_zhenliang_1", + mark: true, + zhuanhuanji: true, + marktext: "☯", + intro: { + content: function (storage, player, skill) { + if (player.storage.twzhenliang == true) + return "当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。"; + return "出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。"; }, }, - subSkill:{ - 1:{ - audio:'nzry_zhenliang_1', - enable:'phaseUse', - filter:function(event,player){ - if(player.storage.twzhenliang) return false; - return game.hasPlayer(function(current){ + subSkill: { + 1: { + audio: "nzry_zhenliang_1", + enable: "phaseUse", + filter: function (event, player) { + if (player.storage.twzhenliang) return false; + return game.hasPlayer(function (current) { return player.inRange(current); }); }, - position:'he', - filterCard:true, - filterTarget:function(card,player,target){ + position: "he", + filterCard: true, + filterTarget: function (card, player, target) { return player.inRange(target); }, - check:function(card){ - var player=_status.event.player,cardx=player.getExpansions('twmingren')[0]; - if(cardx&&get.color(cardx,player)==get.color(card,player)) return 10-get.value(card); - return 7-get.value(card); + check: function (card) { + var player = _status.event.player, + cardx = player.getExpansions("twmingren")[0]; + if (cardx && get.color(cardx, player) == get.color(card, player)) + return 10 - get.value(card); + return 7 - get.value(card); }, - prompt:'弃置一张牌并对攻击范围内的一名角色造成1点伤害', - content:function(){ - 'step 0' - player.changeZhuanhuanji('twzhenliang'); - var cardx=player.getExpansions('twmingren')[0]; - target.damage('nocard'); - if(!cardx||get.color(cards[0],player)!=get.color(cardx,player)) event.finish(); - 'step 1' + prompt: "弃置一张牌并对攻击范围内的一名角色造成1点伤害", + content: function () { + "step 0"; + player.changeZhuanhuanji("twzhenliang"); + var cardx = player.getExpansions("twmingren")[0]; + target.damage("nocard"); + if (!cardx || get.color(cards[0], player) != get.color(cardx, player)) + event.finish(); + ("step 1"); player.draw(); }, - ai:{ - order:5, - result:{ - player:function(player,target){ - return get.damageEffect(target,player,player); + ai: { + order: 5, + result: { + player: function (player, target) { + return get.damageEffect(target, player, player); }, }, }, }, - 2:{ - audio:'nzry_zhenliang_1', - trigger:{global:'damageBegin4'}, - filter:function(event,player){ - if(_status.currentPhase==player||!player.storage.twzhenliang) return false; - return player.countCards('he')&&event.num>0&&(event.player==player||player.inRange(event.player)); + 2: { + audio: "nzry_zhenliang_1", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { + if (_status.currentPhase == player || !player.storage.twzhenliang) return false; + return ( + player.countCards("he") && + event.num > 0 && + (event.player == player || player.inRange(event.player)) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('twzhenliang',trigger.player),'弃置一张牌令此伤害-1').set('ai',function(card){ - if(_status.event.goon){ - var player=_status.event.player,cardx=player.getExpansions('twmingren')[0]; - if(cardx&&get.color(cardx,player)==get.color(card,player)) return 10-get.value(card); - return 6-get.value(card); - } - return 0; - }).set('goon',get.attitude(player,trigger.player)>0).logSkill=['twzhenliang',trigger.player]; - 'step 1' - if(result.bool){ - player.changeZhuanhuanji('twzhenliang'); - var cardx=player.getExpansions('twmingren')[0]; - if(cardx&&get.color(result.cards[0],player)==get.color(cardx,player)) player.draw(); + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + get.prompt("twzhenliang", trigger.player), + "弃置一张牌令此伤害-1" + ) + .set("ai", function (card) { + if (_status.event.goon) { + var player = _status.event.player, + cardx = player.getExpansions("twmingren")[0]; + if (cardx && get.color(cardx, player) == get.color(card, player)) + return 10 - get.value(card); + return 6 - get.value(card); + } + return 0; + }) + .set("goon", get.attitude(player, trigger.player) > 0).logSkill = [ + "twzhenliang", + trigger.player, + ]; + ("step 1"); + if (result.bool) { + player.changeZhuanhuanji("twzhenliang"); + var cardx = player.getExpansions("twmingren")[0]; + if (cardx && get.color(result.cards[0], player) == get.color(cardx, player)) + player.draw(); trigger.num--; } }, @@ -7969,367 +10066,492 @@ game.import('character', function () { }, }, //张南 - twfenwu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&&player.canUse('sha',current,false,false); + twfenwu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && player.canUse("sha", current, false, false); }); }, - direct:true, - content:function(){ - 'step 0' - var list=[]; - player.getHistory('useCard',function(evt){ - if(get.type(evt.card)!='basic') return; - var name=evt.card.name,nature=game.hasNature(evt.card)?get.nature(evt.card):''; - if(!list.includes(name+nature)) list.push(name+nature); + direct: true, + content: function () { + "step 0"; + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card) != "basic") return; + var name = evt.card.name, + nature = game.hasNature(evt.card) ? get.nature(evt.card) : ""; + if (!list.includes(name + nature)) list.push(name + nature); }); - event.addDamage=list.length>1; - player.chooseTarget(get.prompt('twfenwu'),'失去1点体力并视为使用一张无距离限制的【杀】'+(event.addDamage?'(伤害基数+1)':''),function(card,player,target){ - return target!=player&&player.canUse('sha',target,false,false); - }).set('ai',function(target){ - var player=_status.event.player; - if(player.hp+player.countCards('hs',{name:['tao','jiu']})<=1) return -1; - var num=1; - if((!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))||player.hasSkillTag('directHit_ai',true,{ - target:target, - card:{name:'sha'}, - },true))&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:{name:'sha'}, - })){ - num=1.3; - } - return get.effect(target,{name:'sha'},player,player)*num; - }); - 'step 1' - if(result.bool){ - var num=1; - var target=result.targets[0]; - player.logSkill('twfenwu',target); + event.addDamage = list.length > 1; + player + .chooseTarget( + get.prompt("twfenwu"), + "失去1点体力并视为使用一张无距离限制的【杀】" + + (event.addDamage ? "(伤害基数+1)" : ""), + function (card, player, target) { + return target != player && player.canUse("sha", target, false, false); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hp + player.countCards("hs", { name: ["tao", "jiu"] }) <= 1) return -1; + var num = 1; + if ( + (!target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) || + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: { name: "sha" }, + }, + true + )) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: { name: "sha" }, + }) + ) { + num = 1.3; + } + return get.effect(target, { name: "sha" }, player, player) * num; + }); + ("step 1"); + if (result.bool) { + var num = 1; + var target = result.targets[0]; + player.logSkill("twfenwu", target); player.loseHp(); - if(event.addDamage){ - num=2; - game.log('#y杀','的伤害基数+1'); + if (event.addDamage) { + num = 2; + game.log("#y杀", "的伤害基数+1"); } - player.useCard({name:'sha',isCard:true},target,false).baseDamage=num; + player.useCard({ name: "sha", isCard: true }, target, false).baseDamage = num; } }, }, //呼厨泉 - twfupan:{ - audio:3, - trigger:{ - player:'damageEnd', - source:'damageSource' + twfupan: { + audio: 3, + trigger: { + player: "damageEnd", + source: "damageSource", }, - check:()=>true, - onremove:true, - content:function(){ - 'step 0' - if(!player.storage.twfupan) player.storage.twfupan={}; + check: () => true, + onremove: true, + content: function () { + "step 0"; + if (!player.storage.twfupan) player.storage.twfupan = {}; player.draw(trigger.num); - 'step 1' - if(player.countCards('he')&&game.hasPlayer(current=>{ - return !(player.storage.twfupan[current.playerid]>=2)&&player!=current; - })){ + ("step 1"); + if ( + player.countCards("he") && + game.hasPlayer((current) => { + return !(player.storage.twfupan[current.playerid] >= 2) && player != current; + }) + ) { player.chooseCardTarget({ - filterCard:true, - selectCard:1, - position:'he', - forced:true, - targetprompt:function(target){ - return !_status.event.player.storage.twfupan[target.playerid]?'你摸两张牌':'对其
    造成伤害'; + filterCard: true, + selectCard: 1, + position: "he", + forced: true, + targetprompt: function (target) { + return !_status.event.player.storage.twfupan[target.playerid] + ? "你摸两张牌" + : "对其
    造成伤害"; }, - filterTarget:function(card,player,target){ - return !(player.storage.twfupan[target.playerid]>=2)&&player!=target; + filterTarget: function (card, player, target) { + return !(player.storage.twfupan[target.playerid] >= 2) && player != target; }, - ai1:function(card){ - var player=_status.event.player; - if(get.value(card,false,'raw')<0) return 20*get.value(card); - if(player==_status.currentPhase) return 20-player.getUseValue(card); - return 20-get.value(card); + ai1: function (card) { + var player = _status.event.player; + if (get.value(card, false, "raw") < 0) return 20 * get.value(card); + if (player == _status.currentPhase) return 20 - player.getUseValue(card); + return 20 - get.value(card); }, - ai2:function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(ui.selected.cards.length&&get.value(ui.selected.cards[0],false,'raw')<0){ - return -0.1-att; + ai2: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if ( + ui.selected.cards.length && + get.value(ui.selected.cards[0], false, "raw") < 0 + ) { + return -0.1 - att; } - if(player.storage.twfupan[target.playerid]===undefined) return 5; - else if(player.storage.twfupan[target.playerid]===1) return get.damageEffect(target,player,player); + if (player.storage.twfupan[target.playerid] === undefined) return 5; + else if (player.storage.twfupan[target.playerid] === 1) + return get.damageEffect(target, player, player); return 1; }, - prompt:'请选择要交出的卡牌和目标角色' + prompt: "请选择要交出的卡牌和目标角色", }); - }else event.finish(); - 'step 2' - if(result.bool){ - var cards=result.cards,target=result.targets[0]; - player.line(target,'green'); - player.give(cards,target); - event.target=target; - if(!player.storage.twfupan[target.playerid]){ - player.storage.twfupan[target.playerid]=1; + } else event.finish(); + ("step 2"); + if (result.bool) { + var cards = result.cards, + target = result.targets[0]; + player.line(target, "green"); + player.give(cards, target); + event.target = target; + if (!player.storage.twfupan[target.playerid]) { + player.storage.twfupan[target.playerid] = 1; player.draw(2); event.finish(); - }else{ - player.chooseBool('复叛:是否对'+get.translation(target)+'造成1点伤害?','然后你不能再因此技能交给其牌').set('ai',()=>_status.event.bool).set('bool',get.damageEffect(target,player,player)>0); + } else { + player + .chooseBool( + "复叛:是否对" + get.translation(target) + "造成1点伤害?", + "然后你不能再因此技能交给其牌" + ) + .set("ai", () => _status.event.bool) + .set("bool", get.damageEffect(target, player, player) > 0); } } - 'step 3' - if(result.bool){ - player.line(target,'fire'); + ("step 3"); + if (result.bool) { + player.line(target, "fire"); target.damage(); player.storage.twfupan[target.playerid]++; } }, - ai:{ - maixie:true, - maixie_hp:true, - threaten:0.9, - } + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.9, + }, }, //刘璋 - twyaohu:{ - audio:'yinlang', - trigger:{player:'phaseBegin'}, - direct:true, - filter:function(event,player){ - return !player.hasSkill('twyaohu_round')&&game.hasPlayer(function(current){ - return current.group&¤t.group!='unknown'; - }); + twyaohu: { + audio: "yinlang", + trigger: { player: "phaseBegin" }, + direct: true, + filter: function (event, player) { + return ( + !player.hasSkill("twyaohu_round") && + game.hasPlayer(function (current) { + return current.group && current.group != "unknown"; + }) + ); }, - content:function(){ - 'step 0' - var list=[]; - game.countPlayer(function(current){ - if(current.group&¤t.group!='unknown') list.add(current.group); + content: function () { + "step 0"; + var list = []; + game.countPlayer(function (current) { + if (current.group && current.group != "unknown") list.add(current.group); }); - list.sort(function(a,b){ - return lib.group.indexOf(a)-lib.group.indexOf(b); + list.sort(function (a, b) { + return lib.group.indexOf(a) - lib.group.indexOf(b); }); - if(!player.hasSkill('twyaohu')) list.push('cancel2'); - player.chooseControl(list).set('prompt','邀虎:请选择一个势力').set('ai',function(){ - return _status.event.choice; - }).set('choice',function(){ - var getn=function(group){ - return game.countPlayer(function(current){ - if(current.group!=group) return false; - if(player==current) return 2; - if(get.attitude(current,player)>0) return 1; - return 1.3; - }); - } - list.sort(function(a,b){ - return getn(b)-getn(a); - }); - return list[0]; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('twyaohu',game.filterPlayer(function(current){ - return current.group==result.control; - })); - game.log(player,'选择了','#y'+get.translation(result.control+2)); - player.storage.yaohu=result.control; - player.storage.twyaohu=result.control; - player.markSkill('twyaohu'); + if (!player.hasSkill("twyaohu")) list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "邀虎:请选择一个势力") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var getn = function (group) { + return game.countPlayer(function (current) { + if (current.group != group) return false; + if (player == current) return 2; + if (get.attitude(current, player) > 0) return 1; + return 1.3; + }); + }; + list.sort(function (a, b) { + return getn(b) - getn(a); + }); + return list[0]; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill( + "twyaohu", + game.filterPlayer(function (current) { + return current.group == result.control; + }) + ); + game.log(player, "选择了", "#y" + get.translation(result.control + 2)); + player.storage.yaohu = result.control; + player.storage.twyaohu = result.control; + player.markSkill("twyaohu"); } }, - ai:{combo:'jutu'}, - intro:{content:'已选择了$势力'}, - group:'twyaohu_gain', - subSkill:{ - round:{}, - gain:{ - audio:'yinlang', - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return event.player.group==player.storage.yaohu&&event.player.isIn()&&player.getExpansions('jutu').length>0; + ai: { combo: "jutu" }, + intro: { content: "已选择了$势力" }, + group: "twyaohu_gain", + subSkill: { + round: {}, + gain: { + audio: "yinlang", + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return ( + event.player.group == player.storage.yaohu && + event.player.isIn() && + player.getExpansions("jutu").length > 0 + ); }, - forced:true, - locked:false, - logTarget:'player', - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - target.chooseButton(['选择获得一张“生”',player.getExpansions('jutu')],true).set('ai',function(button){ - return get.value(button.link,player); - }); - 'step 1' - if(result.bool){ - target.gain(result.links,'give',player); - } - 'step 2' - if(game.hasPlayer(function(current){ - return current!=player&¤t!=target; - })){ - player.chooseTarget(true,'选择'+get.translation(target)+'使用【杀】的目标',function(card,player,target){ - return target!=player&&target!=_status.event.source; - }).set('source',target).set('ai',function(target){ - var evt=_status.event; - return get.effect(target,{name:'sha'},evt.source,evt.player); + forced: true, + locked: false, + logTarget: "player", + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target + .chooseButton(["选择获得一张“生”", player.getExpansions("jutu")], true) + .set("ai", function (button) { + return get.value(button.link, player); }); + ("step 1"); + if (result.bool) { + target.gain(result.links, "give", player); } - else { - event._result={bool:false}; + ("step 2"); + if ( + game.hasPlayer(function (current) { + return current != player && current != target; + }) + ) { + player + .chooseTarget( + true, + "选择" + get.translation(target) + "使用【杀】的目标", + function (card, player, target) { + return target != player && target != _status.event.source; + } + ) + .set("source", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + } else { + event._result = { bool: false }; event.goto(4); } - 'step 3' - var target2=result.targets[0]; - player.line(target2,'green'); - target.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'对'+get.translation(target2)+'使用一张杀,否则本回合使用伤害牌指定'+get.translation(player)+'为目标时须交给'+get.translation(player)+'两张牌,否则此牌对'+get.translation(player)+'无效').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',target2).set('addCount',false); - 'step 4' - if(!result.bool) player.addTempSkill('twyaohu_effect'); + ("step 3"); + var target2 = result.targets[0]; + player.line(target2, "green"); + target + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "对" + + get.translation(target2) + + "使用一张杀,否则本回合使用伤害牌指定" + + get.translation(player) + + "为目标时须交给" + + get.translation(player) + + "两张牌,否则此牌对" + + get.translation(player) + + "无效") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target2) + .set("addCount", false); + ("step 4"); + if (!result.bool) player.addTempSkill("twyaohu_effect"); }, }, - effect:{ - audio:'yinlang', - trigger:{global:'useCardToPlayer'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return event.target==player&&get.tag(event.card,'damage'); + effect: { + audio: "yinlang", + trigger: { global: "useCardToPlayer" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return event.target == player && get.tag(event.card, "damage"); }, - logTarget:'player', - content:function(){ - 'step 0' - var hs=trigger.player.getCards('he'); - if(hs.length<2) event._result={bool:false}; - else trigger.player.chooseCard(2,'交给'+get.translation(player)+'两张牌,否则取消'+get.translation(trigger.card)+'对其的目标','he').set('ai',card=>{ - if(_status.event.goon) return 5-get.value(card); - return 0; - }).set('goon',get.effect(player,trigger.card,trigger.player,trigger.player)>0); - 'step 1' - if(result.bool){ - trigger.player.give(result.cards,player); - }else{ + logTarget: "player", + content: function () { + "step 0"; + var hs = trigger.player.getCards("he"); + if (hs.length < 2) event._result = { bool: false }; + else + trigger.player + .chooseCard( + 2, + "交给" + + get.translation(player) + + "两张牌,否则取消" + + get.translation(trigger.card) + + "对其的目标", + "he" + ) + .set("ai", (card) => { + if (_status.event.goon) return 5 - get.value(card); + return 0; + }) + .set( + "goon", + get.effect(player, trigger.card, trigger.player, trigger.player) > 0 + ); + ("step 1"); + if (result.bool) { + trigger.player.give(result.cards, player); + } else { trigger.untrigger(); trigger.targets.remove(player); trigger.getParent().triggeredTargets1.remove(player); } }, - } + }, }, }, //李遗 - twjiaohua:{ - audio:2, - trigger:{global:'gainAfter'}, - filter:function(event,player){ - if(event.getParent().name!='draw') return false; - if(event.player!=player&&!event.player.isMinHp()) return false; - var cards=event.cards,list=['basic','trick','equip']; - for(var card of cards) if(list.includes(get.type2(card))) list.remove(get.type2(card)); - for(var type of event.player.getStorage('twjiaohua_gained')) if(list.includes(type)) list.remove(type); - return list.length>0; + twjiaohua: { + audio: 2, + trigger: { global: "gainAfter" }, + filter: function (event, player) { + if (event.getParent().name != "draw") return false; + if (event.player != player && !event.player.isMinHp()) return false; + var cards = event.cards, + list = ["basic", "trick", "equip"]; + for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); + for (var type of event.player.getStorage("twjiaohua_gained")) + if (list.includes(type)) list.remove(type); + return list.length > 0; }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - prompt2:function(event,player){ - var cards=event.cards,list=['basic','trick','equip']; - for(var card of cards) if(list.includes(get.type2(card))) list.remove(get.type2(card)); - for(var type of event.player.getStorage('twjiaohua_gained')) if(list.includes(type)) list.remove(type); - var name=event.player==player?'你':get.translation(event.player); - return '令'+name+'从牌堆或弃牌堆中获得一张'+(event.player.isUnderControl(true)?list.map(i=>get.translation(i)+'牌').join('、').replace(/(.*)、/, '$1或'):'本次未获得的类别的牌'); + prompt2: function (event, player) { + var cards = event.cards, + list = ["basic", "trick", "equip"]; + for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); + for (var type of event.player.getStorage("twjiaohua_gained")) + if (list.includes(type)) list.remove(type); + var name = event.player == player ? "你" : get.translation(event.player); + return ( + "令" + + name + + "从牌堆或弃牌堆中获得一张" + + (event.player.isUnderControl(true) + ? list + .map((i) => get.translation(i) + "牌") + .join("、") + .replace(/(.*)、/, "$1或") + : "本次未获得的类别的牌") + ); }, - logTarget:'player', - content:function(){ - trigger.player.addTempSkill('twjiaohua_gained'); - var cards=trigger.cards,list=['basic','trick','equip']; - for(var card of cards) if(list.includes(get.type2(card))) list.remove(get.type2(card)); - for(var type of trigger.player.getStorage('twjiaohua_gained')) if(list.includes(type)) list.remove(type); + logTarget: "player", + content: function () { + trigger.player.addTempSkill("twjiaohua_gained"); + var cards = trigger.cards, + list = ["basic", "trick", "equip"]; + for (var card of cards) if (list.includes(get.type2(card))) list.remove(get.type2(card)); + for (var type of trigger.player.getStorage("twjiaohua_gained")) + if (list.includes(type)) list.remove(type); list.randomSort(); - var card=get.cardPile(function(card){ + var card = get.cardPile(function (card) { return list.includes(get.type2(card)); }); - if(card){ - trigger.player.gain(card,'gain2'); - trigger.player.markAuto('twjiaohua_gained',[get.type2(card)]); + if (card) { + trigger.player.gain(card, "gain2"); + trigger.player.markAuto("twjiaohua_gained", [get.type2(card)]); } }, - subSkill:{ - gained:{onremove:true,charlotte:true} - } + subSkill: { + gained: { onremove: true, charlotte: true }, + }, }, //阎象 - twkujian:{ - audio:3, - enable:'phaseUse', - filterCard:true, - selectCard:[1,3], - usable:1, - discard:false, - lose:false, - delay:false, - filterTarget:lib.filter.notMe, - global:'twkujian_ai', - check:function(card){ - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - var player=get.owner(card); - if(ui.selected.cards.length>=Math.max(2,player.countCards('h')-player.hp)) return 0; - if(player.hp==player.maxHp||player.storage.jsprende<0||player.countCards('h')<=1){ - var players=game.filterPlayer(); - for(var i=0; i= Math.max(2, player.countCards("h") - player.hp)) return 0; + if ( + player.hp == player.maxHp || + player.storage.jsprende < 0 || + player.countCards("h") <= 1 + ) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].hasSkill("haoshi") && !players[i].isTurnedOver() && - !players[i].hasJudge('lebu') && - get.attitude(player,players[i])>=3 && - get.attitude(players[i],player)>=3){ - return 11-get.value(card); + !players[i].hasJudge("lebu") && + get.attitude(player, players[i]) >= 3 && + get.attitude(players[i], player) >= 3 + ) { + return 11 - get.value(card); } } - if(player.countCards('h')>player.hp) return 10-get.value(card); - if(player.countCards('h')>2) return 6-get.value(card); + if (player.countCards("h") > player.hp) return 10 - get.value(card); + if (player.countCards("h") > 2) return 6 - get.value(card); return -1; } - return 10-get.value(card); + return 10 - get.value(card); }, - content:function(){ - player.give(cards,target).gaintag.add('twkujianx'); - player.addSkill('twkujian_draw'); - player.addSkill('twkujian_discard'); + content: function () { + player.give(cards, target).gaintag.add("twkujianx"); + player.addSkill("twkujian_draw"); + player.addSkill("twkujian_discard"); }, - ai:{ - expose:0.2, - order:7, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - if(target.hasSkillTag('nodu')) return 0; + ai: { + expose: 0.2, + order: 7, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + if (target.hasSkillTag("nodu")) return 0; return -10; } - if(target.hasJudge('lebu')) return 0; - var nh=target.countCards('h'); - var np=player.countCards('h'); - if(player.hp==player.maxHp||player.storage.jsprende<0||player.countCards('h')<=1){ - if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; + if (target.hasJudge("lebu")) return 0; + var nh = target.countCards("h"); + var np = player.countCards("h"); + if ( + player.hp == player.maxHp || + player.storage.jsprende < 0 || + player.countCards("h") <= 1 + ) { + if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; } - return Math.max(1,5-nh); + return Math.max(1, 5 - nh); }, }, - effect:{ - target:function(card,player,target){ - if(player==target&&get.type(card)=='equip'){ - if(player.countCards('e',{subtype:get.subtype(card)})){ - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })){ + effect: { + target: function (card, player, target) { + if (player == target && get.type(card) == "equip") { + if (player.countCards("e", { subtype: get.subtype(card) })) { + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) { return 0; } } @@ -8337,389 +10559,463 @@ game.import('character', function () { }, }, }, - subSkill:{ - draw:{ - audio:'twkujian', - trigger:{global:['useCardAfter','respondAfter']}, - forced:true, - logTarget:'player', - charlotte:true, - filter:function(event,player){ - return event.player.hasHistory('lose',evt=>{ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('twkujianx')) return true; + subSkill: { + draw: { + audio: "twkujian", + trigger: { global: ["useCardAfter", "respondAfter"] }, + forced: true, + logTarget: "player", + charlotte: true, + filter: function (event, player) { + return event.player.hasHistory("lose", (evt) => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; } }); }, - content:function(){ - 'step 0' - game.asyncDraw([player,trigger.player]); - 'step 1' + content: function () { + "step 0"; + game.asyncDraw([player, trigger.player]); + ("step 1"); game.delayx(); - } + }, }, - discard:{ - audio:'twkujian', - trigger:{global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter']}, - forced:true, - logTarget:function(event,player){ - return game.filterPlayer(function(current){ - var evt=event.getl(current); - if(!evt||!evt.hs||!evt.hs.length) return false; - if(event.name=='lose'){ - var name=event.getParent().name; - if(name=='useCard'||name=='respond') return false; - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('twkujianx')) return true; + discard: { + audio: "twkujian", + trigger: { + global: [ + "loseAfter", + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + forced: true, + logTarget: function (event, player) { + return game.filterPlayer(function (current) { + var evt = event.getl(current); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + var name = event.getParent().name; + if (name == "useCard" || name == "respond") return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("twkujianx")) return true; } return false; } - return current.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('twkujianx')) return true; + return current.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; } return false; }); }); }, - charlotte:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - var evt=event.getl(current); - if(!evt||!evt.hs||!evt.hs.length) return false; - if(event.name=='lose'){ - var name=event.getParent().name; - if(name=='useCard'||name=='respond') return false; - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('twkujianx')) return true; + charlotte: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + var evt = event.getl(current); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + var name = event.getParent().name; + if (name == "useCard" || name == "respond") return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("twkujianx")) return true; } return false; } - return current.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('twkujianx')) return true; + return current.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; } return false; }); }); }, - content:function(){ - 'step 0' - var event=trigger; - var targets=game.filterPlayer(function(current){ - var evt=event.getl(current); - if(!evt||!evt.hs||!evt.hs.length) return false; - if(event.name=='lose'){ - var name=event.getParent().name; - if(name=='useCard'||name=='respond') return false; - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('twkujianx')) return true; + content: function () { + "step 0"; + var event = trigger; + var targets = game.filterPlayer(function (current) { + var evt = event.getl(current); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + var name = event.getParent().name; + if (name == "useCard" || name == "respond") return false; + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("twkujianx")) return true; } return false; } - return current.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('twkujianx')) return true; + return current.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twkujianx")) return true; } return false; }); }); targets.add(player); targets.sortBySeat(); - _status.event.targets=targets; - 'step 1' - var target=targets.shift(); - if(target.countCards('he')>0) target.chooseToDiscard('he',true); - if(targets.length>0) event.redo(); - } + _status.event.targets = targets; + ("step 1"); + var target = targets.shift(); + if (target.countCards("he") > 0) target.chooseToDiscard("he", true); + if (targets.length > 0) event.redo(); + }, }, - ai:{ - charlotte:true, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(card.cards&&card.cards.some(i=>i.hasGaintag('twkujianx'))&&game.hasPlayer(current=>{ - return get.attitude(player,current)>0; - })) return [1,1]; + ai: { + charlotte: true, + ai: { + effect: { + player_use: function (card, player, target) { + if ( + card.cards && + card.cards.some((i) => i.hasGaintag("twkujianx")) && + game.hasPlayer((current) => { + return get.attitude(player, current) > 0; + }) + ) + return [1, 1]; }, }, }, - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('twkujianx')&&game.hasPlayer(current=>{ - return get.attitude(player,current)>0; - })) return num+0.5; + mod: { + aiOrder: function (player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("twkujianx") && + game.hasPlayer((current) => { + return get.attitude(player, current) > 0; + }) + ) + return num + 0.5; }, - aiValue:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('twkujianx')&&game.hasPlayer(current=>{ - return get.attitude(player,current)>0; - })) return num+0.5; - } - } - } - } + aiValue: function (player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("twkujianx") && + game.hasPlayer((current) => { + return get.attitude(player, current) > 0; + }) + ) + return num + 0.5; + }, + }, + }, + }, }, - twruilian:{ - audio:2, - trigger:{global:'roundStart'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twruilian')).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target),eff=att/(player==target?2:1)+1; - if(att>=0){ - if(target.hasSkill('yongsi')) return eff*5; - if(target.hasSkill('zhiheng')||target.hasSkill('rezhiheng')) return eff*4; - if(target.hasSkill('rekurou')) return eff*3; - if(target.hasSkill('xinlianji')||target.hasSkill('dclianji')) return eff*2; - if(target.needsToDiscard()) return eff*1.5; + twruilian: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("twruilian")).set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + eff = att / (player == target ? 2 : 1) + 1; + if (att >= 0) { + if (target.hasSkill("yongsi")) return eff * 5; + if (target.hasSkill("zhiheng") || target.hasSkill("rezhiheng")) return eff * 4; + if (target.hasSkill("rekurou")) return eff * 3; + if (target.hasSkill("xinlianji") || target.hasSkill("dclianji")) return eff * 2; + if (target.needsToDiscard()) return eff * 1.5; return eff; } return 0; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twruilian',target); - player.markAuto('twruilian2',[target]); - player.addSkill('twruilian2'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twruilian", target); + player.markAuto("twruilian2", [target]); + player.addSkill("twruilian2"); } }, }, - twruilian2:{ - trigger:{global:'phaseEnd'}, - direct:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return player.getStorage('twruilian2').includes(event.player); + twruilian2: { + trigger: { global: "phaseEnd" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return player.getStorage("twruilian2").includes(event.player); }, - intro:{content:'已选择$'}, - content:function(){ - 'step 0' - player.removeSkill('twruilian2'); - var target=trigger.player; - event.target=target; - var cards=[]; - target.getHistory('lose',function(evt){ - if(evt.type=='discard') cards.addArray(evt.cards2); + intro: { content: "已选择$" }, + content: function () { + "step 0"; + player.removeSkill("twruilian2"); + var target = trigger.player; + event.target = target; + var cards = []; + target.getHistory("lose", function (evt) { + if (evt.type == "discard") cards.addArray(evt.cards2); }); - if(cards.length<2) event.finish(); - else event.cards=cards; - 'step 1' - var list=[]; - for(var type of ['basic','trick','equip']){ - for(var card of event.cards){ - if(get.type2(card)==type){ + if (cards.length < 2) event.finish(); + else event.cards = cards; + ("step 1"); + var list = []; + for (var type of ["basic", "trick", "equip"]) { + for (var card of event.cards) { + if (get.type2(card) == type) { list.push(type); break; } } } - list.push('cancel2'); - player.chooseControl(list).set('prompt','睿敛:是否与'+get.translation(target)+'各获得一种类型的牌?').set('ai',function(){ - var player=_status.event.player,list=_status.event.controls; - if(player.hp<=3&&!player.countCards('h',{name:['shan','tao']})&&list.includes('basic')) return 'basic'; - if(player.countCards('he',{type:'equip'})<2&&list.includes('equip')) return 'equip'; - if(list.includes('trick')) return 'trick'; - return list.remove('cancel2').randomGet(); - }); - 'step 2' - if(result.control!='cancel2'){ - player.logSkill('twruilian2',target); - var type=result.control; - var list=[target,player].sortBySeat(_status.currentPhase),cards=[]; - for(var current of list){ - var card=get.discardPile(function(card){ - return get.type2(card)==type&&!cards.includes(card); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "睿敛:是否与" + get.translation(target) + "各获得一种类型的牌?") + .set("ai", function () { + var player = _status.event.player, + list = _status.event.controls; + if ( + player.hp <= 3 && + !player.countCards("h", { name: ["shan", "tao"] }) && + list.includes("basic") + ) + return "basic"; + if (player.countCards("he", { type: "equip" }) < 2 && list.includes("equip")) + return "equip"; + if (list.includes("trick")) return "trick"; + return list.remove("cancel2").randomGet(); + }); + ("step 2"); + if (result.control != "cancel2") { + player.logSkill("twruilian2", target); + var type = result.control; + var list = [target, player].sortBySeat(_status.currentPhase), + cards = []; + for (var current of list) { + var card = get.discardPile(function (card) { + return get.type2(card) == type && !cards.includes(card); }); - if(card){ + if (card) { cards.push(card); - current.gain(card,'gain2'); + current.gain(card, "gain2"); } } } }, }, //夏侯恩 - twfujian:{ - audio:2, - group:'twfujian_lose', - trigger:{ - global:'phaseBefore', - player:['enterGame','phaseZhunbeiBegin'] + twfujian: { + audio: 2, + group: "twfujian_lose", + trigger: { + global: "phaseBefore", + player: ["enterGame", "phaseZhunbeiBegin"], }, - filter:function(event,player){ - if(player.getEquips(1).length) return false; - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player) { + if (player.getEquips(1).length) return false; + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - content:function(){ - var card=get.cardPile2(function(card){ - return get.type(card)=='equip'&&get.subtype(card)=='equip1'; + forced: true, + content: function () { + var card = get.cardPile2(function (card) { + return get.type(card) == "equip" && get.subtype(card) == "equip1"; }); - event.card=card; - if(card) player.equip(card); - else{ - game.log('但是牌堆中没有武器牌了!'); + event.card = card; + if (card) player.equip(card); + else { + game.log("但是牌堆中没有武器牌了!"); event.finish(); } }, - subSkill:{ - lose:{ - audio:'twfujian', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + lose: { + audio: "twfujian", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - if(event.name=='gain'&&event.player==player) return false; - var evt=event.getl(player); - if(evt&&evt.cards2&&evt.cards2.some(i=>get.subtype(i)=='equip1')) return true; + filter: function (event, player) { + if (player == _status.currentPhase) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + if (evt && evt.cards2 && evt.cards2.some((i) => get.subtype(i) == "equip1")) + return true; return false; }, - forced:true, - content:function(){ + forced: true, + content: function () { player.loseHp(); }, }, }, }, - twjianwei:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - if(!player.getEquips(1).length) return false; - return game.hasPlayer(function(current){ - return player.inRange(current)&&player.canCompare(current); + twjianwei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (!player.getEquips(1).length) return false; + return game.hasPlayer(function (current) { + return player.inRange(current) && player.canCompare(current); }); }, - pindianCheck:function(player,target){ - var hs=player.getCards('h').sort(function(a,b){ - return b.number-a.number; + pindianCheck: function (player, target) { + var hs = player.getCards("h").sort(function (a, b) { + return b.number - a.number; }); - var ts=target.getCards('h').sort(function(a,b){ - return b.number-a.number; + var ts = target.getCards("h").sort(function (a, b) { + return b.number - a.number; }); - if(!hs.length||!ts.length) return 0; - if(Math.min(13,hs[0].number+player.getAttackRange())>ts[0].number||ts[0].number>9&&get.value(ts[0])<=5||target.countCards('j')) return true; + if (!hs.length || !ts.length) return 0; + if ( + Math.min(13, hs[0].number + player.getAttackRange()) > ts[0].number || + (ts[0].number > 9 && get.value(ts[0]) <= 5) || + target.countCards("j") + ) + return true; return false; }, - direct:true, - locked:false, - group:['twjianwei_pindian','twjianwei_zhaocha'], - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twjianwei'),'与攻击范围内的一名角色拼点。若你赢,你获得其每个区域里的一张牌;若其赢,其获得你装备区里的武器牌',function(card,player,target){ - return player.inRange(target)&&player.canCompare(target); - }).set('ai',function(target){ - var player=_status.event.player; - if(lib.skill.twjianwei.pindianCheck(player,target)) return -5*get.attitude(player,target); - return -get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twjianwei',target); + direct: true, + locked: false, + group: ["twjianwei_pindian", "twjianwei_zhaocha"], + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twjianwei"), + "与攻击范围内的一名角色拼点。若你赢,你获得其每个区域里的一张牌;若其赢,其获得你装备区里的武器牌", + function (card, player, target) { + return player.inRange(target) && player.canCompare(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + if (lib.skill.twjianwei.pindianCheck(player, target)) + return -5 * get.attitude(player, target); + return -get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twjianwei", target); player.chooseToCompare(target); - } - else event.finish(); - 'step 2' - if(result.bool){ - var num=0; - if(target.countCards('h')) num++; - if(target.countCards('e')) num++; - if(target.countCards('j')) num++; - if(num){ - player.gainPlayerCard(target,num,'hej',true).set('filterButton',function(button){ - for(var i=0; i13) trigger.num1=13; + forced: true, + locked: false, + content: function () { + var num = player.getAttackRange(); + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; } - else { - trigger.num2+=num; - if(trigger.num2>13) trigger.num2=13; - } - game.log(player,'的拼点牌点数+'+num); + game.log(player, "的拼点牌点数+" + num); }, }, //你是故意找茬是不是 - zhaocha:{ - trigger:{global:'phaseZhunbeiBegin'}, - filter:function(event,player){ - if(event.player==player) return false; + zhaocha: { + trigger: { global: "phaseZhunbeiBegin" }, + filter: function (event, player) { + if (event.player == player) return false; return event.player.canCompare(player); }, - direct:true, - content:function(){ - 'step 0' - trigger.player.chooseBool('剑威:是否与'+get.translation(player)+'拼点?','若你赢,你获得其装备区里的武器牌;若其赢,其获得你每个区域里的一张牌').set('ai',()=>_status.event.choice).set('choice',get.attitude(trigger.player,player)<0&&!lib.skill.twjianwei.pindianCheck(player,trigger.player)); - 'step 1' - if(result.bool){ - trigger.player.logSkill('twjianwei',player); + direct: true, + content: function () { + "step 0"; + trigger.player + .chooseBool( + "剑威:是否与" + get.translation(player) + "拼点?", + "若你赢,你获得其装备区里的武器牌;若其赢,其获得你每个区域里的一张牌" + ) + .set("ai", () => _status.event.choice) + .set( + "choice", + get.attitude(trigger.player, player) < 0 && + !lib.skill.twjianwei.pindianCheck(player, trigger.player) + ); + ("step 1"); + if (result.bool) { + trigger.player.logSkill("twjianwei", player); trigger.player.chooseToCompare(player); - } - else event.finish(); - 'step 2' - if(!result.tie){ - if(result.bool){ - var card=player.getEquips(1); - if(card.length) trigger.player.gain(card,player,'give'); - } - else { - var num=0; - if(trigger.player.countCards('h')) num++; - if(trigger.player.countCards('e')) num++; - if(trigger.player.countCards('j')) num++; - if(num) player.gainPlayerCard(trigger.player,num,'hej',true).set('filterButton',function(button){ - for(var i=0; i0; + twtanfeng: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countDiscardableCards(player, "hej") > 0; }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twtanfeng'),function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'hej')>0; - }).set('ai',function(target){ - var player=_status.event.player,num=1; - if(get.attitude(player,target)>0) num=3; - else if(!target.countCards('he')||!target.canUse('sha',player)){ - if(target.hp+target.countCards('hs',{name:['tao','jiu']})<=1) num=2; - else num=1.2; - } - return get.effect(target,{name:'guohe'},player,player)*num*((player.hp<=1&&get.attitude(player,target)<=0)?0:1); - }).setHiddenSkill(event.name); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twtanfeng',target); - player.discardPlayerCard(target,'hej',true); - } - else event.finish(); - 'step 2' + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twtanfeng"), function (card, player, target) { + return target != player && target.countDiscardableCards(player, "hej") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player, + num = 1; + if (get.attitude(player, target) > 0) num = 3; + else if (!target.countCards("he") || !target.canUse("sha", player)) { + if (target.hp + target.countCards("hs", { name: ["tao", "jiu"] }) <= 1) + num = 2; + else num = 1.2; + } + return ( + get.effect(target, { name: "guohe" }, player, player) * + num * + (player.hp <= 1 && get.attitude(player, target) <= 0 ? 0 : 1) + ); + }) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twtanfeng", target); + player.discardPlayerCard(target, "hej", true); + } else event.finish(); + ("step 2"); target.chooseCardTarget({ - position:'hes', - prompt:'选择一张牌当做【杀】对'+get.translation(player)+'使用', - prompt2:'或点击“取消”,受到其造成的1点火焰伤害,并令其跳过本回合的一个阶段(准备阶段和结束阶段除外)', - filterCard:function(card,player){ - return player.canUse(get.autoViewAs({name:'sha'},[card]),_status.event.getParent().player,false); + position: "hes", + prompt: "选择一张牌当做【杀】对" + get.translation(player) + "使用", + prompt2: + "或点击“取消”,受到其造成的1点火焰伤害,并令其跳过本回合的一个阶段(准备阶段和结束阶段除外)", + filterCard: function (card, player) { + return player.canUse( + get.autoViewAs({ name: "sha" }, [card]), + _status.event.getParent().player, + false + ); }, - filterTarget:function(card,player,target){ - var source=_status.event.getParent().player; - if(target!=source&&!ui.selected.targets.includes(source)) return false; - card=get.autoViewAs({name:'sha'},[card]); - return lib.filter.filterTarget.apply(this,arguments); + filterTarget: function (card, player, target) { + var source = _status.event.getParent().player; + if (target != source && !ui.selected.targets.includes(source)) return false; + card = get.autoViewAs({ name: "sha" }, [card]); + return lib.filter.filterTarget.apply(this, arguments); }, - selectTarget:function(){ - var card=get.card(),player=get.player(); - if(!card) return; - card=get.autoViewAs({name:'sha'},[card]); - var range=[1,1]; - game.checkMod(card,player,range,'selectTarget',player); + selectTarget: function () { + var card = get.card(), + player = get.player(); + if (!card) return; + card = get.autoViewAs({ name: "sha" }, [card]); + var range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); return range; }, - ai1:function(card){ - var player=_status.event.player,target=_status.event.getParent().player; - var eff=get.effect(target,get.autoViewAs({name:'sha'},[card]),player,player); - var eff2=get.damageEffect(player,target,player,'fire'); - if(eff<0||eff2>0||eff2>eff||get.tag(card,'recover')) return 0; - return (player.hp==1?10:6)-get.value(card); + ai1: function (card) { + var player = _status.event.player, + target = _status.event.getParent().player; + var eff = get.effect( + target, + get.autoViewAs({ name: "sha" }, [card]), + player, + player + ); + var eff2 = get.damageEffect(player, target, player, "fire"); + if (eff < 0 || eff2 > 0 || eff2 > eff || get.tag(card, "recover")) return 0; + return (player.hp == 1 ? 10 : 6) - get.value(card); + }, + ai2: function (target) { + if (target == _status.event.getParent().player) return 100; + return get.effect(target, { name: "sha" }, _status.event.player); }, - ai2:function(target){ - if(target==_status.event.getParent().player) return 100; - return get.effect(target,{name:'sha'},_status.event.player); - } }); - 'step 3' - if(result.bool){ - var cards=result.cards,targets=result.targets; - var cardx=get.autoViewAs({name:'sha'},cards); - target.useCard(cardx,cards,targets,false); + ("step 3"); + if (result.bool) { + var cards = result.cards, + targets = result.targets; + var cardx = get.autoViewAs({ name: "sha" }, cards); + target.useCard(cardx, cards, targets, false); event.finish(); + } else { + player.line(target, "fire"); + target.damage(1, "fire"); } - else{ - player.line(target,'fire'); - target.damage(1,'fire'); + ("step 4"); + if (!target.isIn()) { + event.finish(); + return; } - 'step 4' - if(!target.isIn()){ - event.finish(); return; - } - var list=[]; - var list2=[]; - event.map={phaseJudge:'判定阶段',phaseDraw:'摸牌阶段',phaseUse:'出牌阶段',phaseDiscard:'弃牌阶段'}; - for(var i of ['phaseJudge','phaseDraw','phaseUse','phaseDiscard']){ - if(!player.skipList.includes(i)){ - i=event.map[i]; + var list = []; + var list2 = []; + event.map = { + phaseJudge: "判定阶段", + phaseDraw: "摸牌阶段", + phaseUse: "出牌阶段", + phaseDiscard: "弃牌阶段", + }; + for (var i of ["phaseJudge", "phaseDraw", "phaseUse", "phaseDiscard"]) { + if (!player.skipList.includes(i)) { + i = event.map[i]; list.push(i); - if(i!='判定阶段'&&i!='弃牌阶段') list2.push(i); + if (i != "判定阶段" && i != "弃牌阶段") list2.push(i); } } - target.chooseControl(list).set('prompt','探锋:令'+get.translation(player)+'跳过一个阶段').set('ai',function(){ - return _status.event.choice; - }).set('choice',function(){ - var att=get.attitude(target,player); - var num=player.countCards('j'); - if(att>0){ - if(list.includes('判定阶段')&&num>0) return '判定阶段'; - return '弃牌阶段'; - } - if(list.includes('摸牌阶段')&&player.hasJudge('lebu')) return '摸牌阶段'; - if(list.includes('出牌阶段')&&player.hasJudge('bingliang')||player.needsToDiscard()>0) return '出牌阶段'; - return list2.randomGet(); - }()); - 'step 5' - for(var i in event.map){ - if(event.map[i]==result.control) player.skip(i); + target + .chooseControl(list) + .set("prompt", "探锋:令" + get.translation(player) + "跳过一个阶段") + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var att = get.attitude(target, player); + var num = player.countCards("j"); + if (att > 0) { + if (list.includes("判定阶段") && num > 0) return "判定阶段"; + return "弃牌阶段"; + } + if (list.includes("摸牌阶段") && player.hasJudge("lebu")) return "摸牌阶段"; + if ( + (list.includes("出牌阶段") && player.hasJudge("bingliang")) || + player.needsToDiscard() > 0 + ) + return "出牌阶段"; + return list2.randomGet(); + })() + ); + ("step 5"); + for (var i in event.map) { + if (event.map[i] == result.control) player.skip(i); } target.popup(result.control); target.line(player); - game.log(player,'跳过了','#y'+result.control); + game.log(player, "跳过了", "#y" + result.control); }, }, //宗预 - twzhibian:{ - audio:'zhibian', - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return game.hasPlayer((current)=>(current!=player&&player.canCompare(current))); + twzhibian: { + audio: "zhibian", + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return game.hasPlayer((current) => current != player && player.canCompare(current)); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twzhibian'),'与一名其他角色拼点',function(card,player,target){ - return target!=player&&player.canCompare(target); - }).set('ai',function(target){ - if(!_status.event.goon) return false; - var att=get.attitude(player,target); - if(att<0&&(target.countCards('h')>1||target.countCards('e',function(card){ - return player.canEquip(card)&&get.effect(player,card,target,player)>0; - }))) return -att/Math.sqrt(target.countCards('h')); - if(!player.isDamaged()) return false; - if(att<=0) return (1-att)/Math.sqrt(target.countCards('h')); - return Math.sqrt(2/att*Math.sqrt(target.countCards('h'))); - }).set('goon',function(){ - if(!player.hasCard(function(card){ - return (card.number>=14-player.hp&&get.value(card)<=5); - })) return false; - return true; - }()); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twzhibian',target); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twzhibian"), + "与一名其他角色拼点", + function (card, player, target) { + return target != player && player.canCompare(target); + } + ) + .set("ai", function (target) { + if (!_status.event.goon) return false; + var att = get.attitude(player, target); + if ( + att < 0 && + (target.countCards("h") > 1 || + target.countCards("e", function (card) { + return ( + player.canEquip(card) && + get.effect(player, card, target, player) > 0 + ); + })) + ) + return -att / Math.sqrt(target.countCards("h")); + if (!player.isDamaged()) return false; + if (att <= 0) return (1 - att) / Math.sqrt(target.countCards("h")); + return Math.sqrt((2 / att) * Math.sqrt(target.countCards("h"))); + }) + .set( + "goon", + (function () { + if ( + !player.hasCard(function (card) { + return card.number >= 14 - player.hp && get.value(card) <= 5; + }) + ) + return false; + return true; + })() + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twzhibian", target); player.chooseToCompare(target); - } - else event.finish(); - 'step 2' - if(result.bool){ - var list=[],list2=[ - '将'+get.translation(target)+'区域中的一张牌移动到你的区域内', - '回复1点体力', - '背水!弃置一张非基本牌,并依次执行上述所有选项', - ]; - if(target.countCards('h')||target.hasCard(function(card){ - return player.canEquip(card); - },'e')||target.hasCard(function(card){ - return player.canAddJudge(card); - },'j')) list.push('选项一'); - else list2[0]=''+list2[0]+''; - if(player.isDamaged()) list.push('选项二'); - else list2[1]=''+list2[1]+''; - if(!list.length){event.finish(); return;} - if(player.countCards('he',card=>get.type(card)!='basic')) list.push('背水!') - else list2[2]=''+list2[2]+''; - list.push('cancel2'); - player.chooseControl(list).set('prompt','直辩:选择一项').set('choiceList',list2).set('ai',function(){ - var target=_status.event.getParent().target; - if(_status.event.controls.includes('背水!')&&player.isDamaged()&&(target.countCards('h')||target.countCards('e',function(card){ - return player.canEquip(card)&&get.value(card,target)>=4+player.getDamagedHp(); - }))) return 2; - if(player.isDamaged()&&(player.hp<=2||(!target.countCards('h')&&!target.countCards('e',function(card){ - return player.canEquip(card)&&get.value(card,target)>=4+player.getDamagedHp(); - })))) return 1; - return 0; - }); - } - else { + } else event.finish(); + ("step 2"); + if (result.bool) { + var list = [], + list2 = [ + "将" + get.translation(target) + "区域中的一张牌移动到你的区域内", + "回复1点体力", + "背水!弃置一张非基本牌,并依次执行上述所有选项", + ]; + if ( + target.countCards("h") || + target.hasCard(function (card) { + return player.canEquip(card); + }, "e") || + target.hasCard(function (card) { + return player.canAddJudge(card); + }, "j") + ) + list.push("选项一"); + else list2[0] = '' + list2[0] + ""; + if (player.isDamaged()) list.push("选项二"); + else list2[1] = '' + list2[1] + ""; + if (!list.length) { + event.finish(); + return; + } + if (player.countCards("he", (card) => get.type(card) != "basic")) list.push("背水!"); + else list2[2] = '' + list2[2] + ""; + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", "直辩:选择一项") + .set("choiceList", list2) + .set("ai", function () { + var target = _status.event.getParent().target; + if ( + _status.event.controls.includes("背水!") && + player.isDamaged() && + (target.countCards("h") || + target.countCards("e", function (card) { + return ( + player.canEquip(card) && + get.value(card, target) >= 4 + player.getDamagedHp() + ); + })) + ) + return 2; + if ( + player.isDamaged() && + (player.hp <= 2 || + (!target.countCards("h") && + !target.countCards("e", function (card) { + return ( + player.canEquip(card) && + get.value(card, target) >= 4 + player.getDamagedHp() + ); + }))) + ) + return 1; + return 0; + }); + } else { player.loseHp(); event.finish(); } - 'step 3' - if(result.control!='cancel2'){ - event.control=result.control; - if(result.control=='背水!'&&player.countCards('he',function(card){ - return get.type(card)!='basic'; - })) player.chooseToDiscard('he',true,function(card){ - return get.type(card)!='basic'; - }); - } - else event.finish(); - 'step 4' - if(event.control=='选项一'||event.control=='背水!'){ - player.choosePlayerCard(target,'hej',true).set('ai',get.buttonValue); - } - else event.goto(6); - 'step 5' - if(result.bool){ - var card=result.cards[0]; - switch (get.position(card)){ - case 'h':player.gain(card,target,'giveAuto'); break; - case 'e':target.$give(card,player,false); player.equip(card); break; - case 'j':target.$give(card,player,false); player.addJudge(card); break; + ("step 3"); + if (result.control != "cancel2") { + event.control = result.control; + if ( + result.control == "背水!" && + player.countCards("he", function (card) { + return get.type(card) != "basic"; + }) + ) + player.chooseToDiscard("he", true, function (card) { + return get.type(card) != "basic"; + }); + } else event.finish(); + ("step 4"); + if (event.control == "选项一" || event.control == "背水!") { + player.choosePlayerCard(target, "hej", true).set("ai", get.buttonValue); + } else event.goto(6); + ("step 5"); + if (result.bool) { + var card = result.cards[0]; + switch (get.position(card)) { + case "h": + player.gain(card, target, "giveAuto"); + break; + case "e": + target.$give(card, player, false); + player.equip(card); + break; + case "j": + target.$give(card, player, false); + player.addJudge(card); + break; } } - 'step 6' - if(event.control=='选项二'||event.control=='背水!') player.recover(); + ("step 6"); + if (event.control == "选项二" || event.control == "背水!") player.recover(); }, }, - twyuyan:{ - audio:'yuyan', - trigger:{target:'useCardToTarget'}, - filter:function(event,player){ - return event.card.name=='sha'&&event.card.isCard&&player.hp=13||!trigger.player.hasCard(function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.number(card)>num; - },'he')))||(typeof num!='number'&&!trigger.player.hasCard(function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.type(card)!='basic'; - },'he'))) event._result={bool:false}; - else trigger.player.chooseCard('he',function(card){ - if(typeof _status.event.number=='number') return get.number(card)>_status.event.number; - return get.type(card)!='basic'; - },'交给'+get.translation(player)+'一张'+str+'牌,或取消'+get.translation(trigger.card)+'对其的目标').set('number',num).set('ai',function(card){ - if(card.name=='shan'||card.name=='tao'||card.name=='jiu') return false; - return 6-get.value(card); - }); - 'step 1' - if(result.bool) trigger.player.give(result.cards,player); - else{ + forced: true, + logTarget: "player", + content: function () { + "step 0"; + var num = get.number(trigger.card), + str = ""; + if (typeof num == "number") str = "点数大于" + get.cnNumber(num) + "的"; + else str = "非基本"; + if ( + (typeof num == "number" && + (num >= 13 || + !trigger.player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.number(card) > num; + }, "he"))) || + (typeof num != "number" && + !trigger.player.hasCard(function (card) { + if (_status.connectMode && get.position(card) == "h") return true; + return get.type(card) != "basic"; + }, "he")) + ) + event._result = { bool: false }; + else + trigger.player + .chooseCard( + "he", + function (card) { + if (typeof _status.event.number == "number") + return get.number(card) > _status.event.number; + return get.type(card) != "basic"; + }, + "交给" + + get.translation(player) + + "一张" + + str + + "牌,或取消" + + get.translation(trigger.card) + + "对其的目标" + ) + .set("number", num) + .set("ai", function (card) { + if (card.name == "shan" || card.name == "tao" || card.name == "jiu") + return false; + return 6 - get.value(card); + }); + ("step 1"); + if (result.bool) trigger.player.give(result.cards, player); + else { trigger.targets.remove(player); trigger.getParent().triggeredTargets2.remove(player); trigger.untrigger(); } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'&&player.hp>target.hp&&get.attitude(player,target)<0){ - var num=get.number(card); - var bs=player.getCards('h',function(cardx){ - return (typeof num=='number'?(get.number(cardx)>num):(get.type(cardx)!='basic'))&&!['','',''].includes(cardx.name); + ai: { + effect: { + target: function (card, player, target, current) { + if ( + card.name == "sha" && + player.hp > target.hp && + get.attitude(player, target) < 0 + ) { + var num = get.number(card); + var bs = player.getCards("h", function (cardx) { + return ( + (typeof num == "number" + ? get.number(cardx) > num + : get.type(cardx) != "basic") && + !["", "", ""].includes(cardx.name) + ); }); - if(bs.length<2) return 0; - if(player.hasSkill('jiu')||player.hasSkill('tianxianjiu')) return; - if(bs.length<=2){ - for(var i=0; i{ - if(player!=evt.player&&evt._dyinged) targets.add(evt.player); + twchuhai: { + audio: "chuhai", + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var targets = []; + player.getHistory("sourceDamage", (evt) => { + if (player != evt.player && evt._dyinged) targets.add(evt.player); }); - return targets.length>=2; + return targets.length >= 2; }, - forced:true, - locked:false, - dutySkill:true, - skillAnimation:true, - animationColor:'wood', - group:'twchuhai_lose', - content:function(){ - 'step 0' - game.log(player,'成功完成使命'); - player.awakenSkill('twchuhai'); - if(!player.isDisabledJudge()) player.disableJudge(); - event.current=player.next; - 'step 1' - if(!event.current.countCards('he')) event.goto(3); - else event.current.chooseCard('交给'+get.translation(player)+'一张牌','he',true).set('ai',get.disvalue2); - 'step 2' - if(result.bool&&result.cards&&result.cards.length) event.current.give(result.cards,player); - 'step 3' - event.current=event.current.next; - if(event.current!=player) event.goto(1); + forced: true, + locked: false, + dutySkill: true, + skillAnimation: true, + animationColor: "wood", + group: "twchuhai_lose", + content: function () { + "step 0"; + game.log(player, "成功完成使命"); + player.awakenSkill("twchuhai"); + if (!player.isDisabledJudge()) player.disableJudge(); + event.current = player.next; + ("step 1"); + if (!event.current.countCards("he")) event.goto(3); + else + event.current + .chooseCard("交给" + get.translation(player) + "一张牌", "he", true) + .set("ai", get.disvalue2); + ("step 2"); + if (result.bool && result.cards && result.cards.length) + event.current.give(result.cards, player); + ("step 3"); + event.current = event.current.next; + if (event.current != player) event.goto(1); }, - subSkill:{ - lose:{ - audio:'chuhai', - trigger:{ - global:['gainAfter','loseAsyncAfter'] + subSkill: { + lose: { + audio: "chuhai", + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - forced:true, - dutySkill:true, - filter:function(event,player){ - var cards=event.getg(player); - if(!cards.length) return false; - return game.hasPlayer(current=>{ - if(current==player) return false; - var evt=event.getl(current); - if(evt&&evt.cards&&evt.cards.length) return true; + forced: true, + dutySkill: true, + filter: function (event, player) { + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer((current) => { + if (current == player) return false; + var evt = event.getl(current); + if (evt && evt.cards && evt.cards.length) return true; return false; }); }, - content:function(){ - 'step 0' - var cards=trigger.getg(player); - if(!cards.length){ + content: function () { + "step 0"; + var cards = trigger.getg(player); + if (!cards.length) { event.finish(); return; } - player.chooseCard('h','除害:将其中一张得到的牌置入弃牌堆',true,function(card){ - return _status.event.cards.includes(card); - }).set('ai',function(card){ - return -get.value(card); - }).set('cards',cards); - 'step 1' - if(result.bool) player.loseToDiscardpile(result.cards); + player + .chooseCard("h", "除害:将其中一张得到的牌置入弃牌堆", true, function (card) { + return _status.event.cards.includes(card); + }) + .set("ai", function (card) { + return -get.value(card); + }) + .set("cards", cards); + ("step 1"); + if (result.bool) player.loseToDiscardpile(result.cards); }, }, }, }, //桥公 - twyizhu:{ - audio:'yizhu', - group:['twyizhu_use','twyizhu_discard'], - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - content:function(){ - 'step 0' + twyizhu: { + audio: "yizhu", + group: ["twyizhu_use", "twyizhu_discard"], + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + content: function () { + "step 0"; player.draw(2); - 'step 1' - var hs=player.getCards('he'); - if(!hs.length) event.finish(); - else if(hs.length<=2) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,2,'选择两张牌洗入牌堆'); - 'step 2' - if(result.bool){ - player.$throw(result.cards.length,1000); - player.lose(result.cards,ui.cardPile).insert_index=function(){ - return ui.cardPile.childNodes[get.rand(0,game.players.length*2-2)]; - } - player.markAuto('twyizhu',result.cards); - } - else event.finish(); - 'step 3' + ("step 1"); + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length <= 2) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, 2, "选择两张牌洗入牌堆"); + ("step 2"); + if (result.bool) { + player.$throw(result.cards.length, 1000); + player.lose(result.cards, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[get.rand(0, game.players.length * 2 - 2)]; + }; + player.markAuto("twyizhu", result.cards); + } else event.finish(); + ("step 3"); game.updateRoundNumber(); game.delayx(); }, - intro:{ - mark:function(dialog,content,player){ - if(player==game.me||player.isUnderControl()) dialog.addAuto(content); + intro: { + mark: function (dialog, content, player) { + if (player == game.me || player.isUnderControl()) dialog.addAuto(content); else { - var names=[]; - for(var i of content) names.add(i.name); + var names = []; + for (var i of content) names.add(i.name); return get.translation(names); } }, }, - subSkill:{ - use:{ - audio:'yizhu', - trigger:{global:'useCardToPlayer'}, - filter:function(event,player){ - return player.getStorage('twyizhu').length&& - event.player!=player&&event.targets.length==1&& - event.cards.filter(function(i){ - return player.getStorage('twyizhu').includes(i); - }).length>0; + subSkill: { + use: { + audio: "yizhu", + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return ( + player.getStorage("twyizhu").length && + event.player != player && + event.targets.length == 1 && + event.cards.filter(function (i) { + return player.getStorage("twyizhu").includes(i); + }).length > 0 + ); }, - logTarget:'player', - forced:true, - locked:false, - content:function(){ - 'step 0' - var list=[]; - if(!game.hasPlayer(function(current){ - return current!=trigger.target&&lib.filter.targetEnabled2(trigger.card,trigger.player,current); - })) event.goto(3); - var filter=function(event,player){ - var card=event.card,info=get.info(card); - if(info.allowMultiple==false) return false; - if(!info.multitarget){ - return game.hasPlayer(current=>lib.filter.targetEnabled2(card,player,current)); + logTarget: "player", + forced: true, + locked: false, + content: function () { + "step 0"; + var list = []; + if ( + !game.hasPlayer(function (current) { + return ( + current != trigger.target && + lib.filter.targetEnabled2(trigger.card, trigger.player, current) + ); + }) + ) + event.goto(3); + var filter = function (event, player) { + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (!info.multitarget) { + return game.hasPlayer((current) => + lib.filter.targetEnabled2(card, player, current) + ); } return false; - } - var enable=filter(trigger.getParent(),trigger.player); - var prompt2='操作提示:'; - if(enable) prompt2+='选择一名合法的其他角色,以增加其为目标;或'; - prompt2+='选择目标角色('+get.translation(trigger.target)+')和另一名合法的角色,以取消前者为目标并增加后者为目标'; - player.chooseTarget('遗珠:是否'+(enable?'增加或':'')+'修改目标?',prompt2,[enable?1:2,2],(card,player,target)=>{ - var evt=_status.event.getTrigger(),card=evt.card; - if(target==evt.target) return true; - if(ui.selected.targets.length&&ui.selected.targets[0]!=evt.target) return false; - return lib.filter.targetEnabled2(card,evt.player,target); - }).set('targetprompt',target=>{ - return target==_status.event.targetx?'取消目标':'增加目标'; - }).set('filterOk',()=>{ - if(ui.selected.targets.length==1&&ui.selected.targets[0]==_status.event.targetx) return false; - return true; - }).set('ai',target=>{ - var evt=_status.event.getTrigger(),card=evt.card,player=_status.event.player; - if(target==evt.target&&get.effect(evt.target,card,evt.player,player)<0) return 100; - if(target==evt.target) return -100; - return get.effect(target,card,evt.player,player); - }).set('targetx',trigger.target).set('card',trigger.card); - 'step 1' - if(result.bool){ - var target=result.targets[result.targets[0]==trigger.target?1:0]; - if(result.targets.length>1) { - player.line2([trigger.target,target]); + }; + var enable = filter(trigger.getParent(), trigger.player); + var prompt2 = "操作提示:"; + if (enable) prompt2 += "选择一名合法的其他角色,以增加其为目标;或"; + prompt2 += + "选择目标角色(" + + get.translation(trigger.target) + + ")和另一名合法的角色,以取消前者为目标并增加后者为目标"; + player + .chooseTarget( + "遗珠:是否" + (enable ? "增加或" : "") + "修改目标?", + prompt2, + [enable ? 1 : 2, 2], + (card, player, target) => { + var evt = _status.event.getTrigger(), + card = evt.card; + if (target == evt.target) return true; + if ( + ui.selected.targets.length && + ui.selected.targets[0] != evt.target + ) + return false; + return lib.filter.targetEnabled2(card, evt.player, target); + } + ) + .set("targetprompt", (target) => { + return target == _status.event.targetx ? "取消目标" : "增加目标"; + }) + .set("filterOk", () => { + if ( + ui.selected.targets.length == 1 && + ui.selected.targets[0] == _status.event.targetx + ) + return false; + return true; + }) + .set("ai", (target) => { + var evt = _status.event.getTrigger(), + card = evt.card, + player = _status.event.player; + if ( + target == evt.target && + get.effect(evt.target, card, evt.player, player) < 0 + ) + return 100; + if (target == evt.target) return -100; + return get.effect(target, card, evt.player, player); + }) + .set("targetx", trigger.target) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + var target = result.targets[result.targets[0] == trigger.target ? 1 : 0]; + if (result.targets.length > 1) { + player.line2([trigger.target, target]); trigger.targets.remove(trigger.target); trigger.getParent().triggeredTargets1.remove(trigger.target); trigger.untrigger(); - } - else player.line(target); + } else player.line(target); trigger.targets.push(target); } - 'step 2' - var list=trigger.cards.filter(function(i){ - return player.getStorage('twyizhu').includes(i); + ("step 2"); + var list = trigger.cards.filter(function (i) { + return player.getStorage("twyizhu").includes(i); }); - player.unmarkAuto('twyizhu',list); + player.unmarkAuto("twyizhu", list); player.draw(); game.delayx(); }, }, - discard:{ - trigger:{ - global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter'], + discard: { + trigger: { + global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], }, - silent:true, - forced:true, - locked:false, - filter:function(event,player){ - return player.getStorage('twyizhu').length&&event.getd().filter(function(i){ - return player.getStorage('twyizhu').includes(i); - }).length>0; + silent: true, + forced: true, + locked: false, + filter: function (event, player) { + return ( + player.getStorage("twyizhu").length && + event.getd().filter(function (i) { + return player.getStorage("twyizhu").includes(i); + }).length > 0 + ); }, - content:function(){ - var list=trigger.getd().filter(function(i){ - return player.getStorage('twyizhu').includes(i); + content: function () { + var list = trigger.getd().filter(function (i) { + return player.getStorage("twyizhu").includes(i); }); - player.unmarkAuto('twyizhu',list); + player.unmarkAuto("twyizhu", list); }, }, }, }, - twluanchou:{ - audio:'luanchou', - enable:'phaseUse', - usable:1, - selectTarget:2, - filterTarget:true, - multitarget:true, - multiline:true, - content:function(){ - 'step 0' - game.filterPlayer().sortBySeat().forEach(function(current){ - current.removeSkills('twgonghuan'); - }); - 'step 1' + twluanchou: { + audio: "luanchou", + enable: "phaseUse", + usable: 1, + selectTarget: 2, + filterTarget: true, + multitarget: true, + multiline: true, + content: function () { + "step 0"; + game.filterPlayer() + .sortBySeat() + .forEach(function (current) { + current.removeSkills("twgonghuan"); + }); + ("step 1"); targets.sortBySeat(); - for(var i of targets) i.addSkills('twgonghuan'); + for (var i of targets) i.addSkills("twgonghuan"); }, - derivation:'twgonghuan', - ai:{ - order:10, - expose:0.2, - result:{ - target:function(player,target){ - return Math.max(0.1,target.hp)*(get.attitude(player,target)+20); + derivation: "twgonghuan", + ai: { + order: 10, + expose: 0.2, + result: { + target: function (player, target) { + return Math.max(0.1, target.hp) * (get.attitude(player, target) + 20); }, }, }, }, - twgonghuan:{ - audio:'gonghuan', - trigger:{global:'damageBegin4'}, - usable:1, - filter:function(event,player){ - if(event.player==player) return false; - return !event.twgonghuan&&event.player.hp<=player.hp&&event.player.hasSkill('twgonghuan'); + twgonghuan: { + audio: "gonghuan", + trigger: { global: "damageBegin4" }, + usable: 1, + filter: function (event, player) { + if (event.player == player) return false; + return ( + !event.twgonghuan && + event.player.hp <= player.hp && + event.player.hasSkill("twgonghuan") + ); }, - check:function(event,player){ - if(get.damageEffect(event.player,event.source,player)>0||(get.attitude(player,event.player)>0&&get.damageEffect(event.player,event.source,event.player)>0)) return false; - return get.attitude(player,event.player)>0&&event.player.hp0); + check: function (event, player) { + if ( + get.damageEffect(event.player, event.source, player) > 0 || + (get.attitude(player, event.player) > 0 && + get.damageEffect(event.player, event.source, event.player) > 0) + ) + return false; + return ( + get.attitude(player, event.player) > 0 && + event.player.hp < player.hp && + ((["君", "主"].includes(lib.translate[event.player.identity]) && + !["野", "内"].includes(lib.translate[player.identity])) || + player.hp + player.hujia - event.num > 0) + ); }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.cancel(); - player.damage(trigger.source?trigger.source:'nosource',trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards).twgonghuan=true; + player + .damage(trigger.source ? trigger.source : "nosource", trigger.nature, trigger.num) + .set("card", trigger.card) + .set("cards", trigger.cards).twgonghuan = true; }, }, //桥蕤 - twxiawei:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - locked:false, - group:['twxiawei_init','twxiawei_lose','twxiawei_unmark'], - content:function(){ - 'step 0' - player.chooseControl('1','2','3','4','cancel2').set('prompt',get.prompt('twxiawei')).set('prompt2','妄行:将X+1张牌置于武将牌上,称为“威”').set('ai',function(){ - var player=_status.event.player; - if(player.maxHp>3) return 3; - return Math.min(3,player.countCards('he')+1); - }); - 'step 1' - if(result.control!='cancel2'){ - var num=result.index+1,cards=get.cards(num+1); - player.logSkill('twxiawei'); - player.addTempSkill('wangxing'); - player.addMark('wangxing',num,false); - player.$gain2(cards,false); - game.log(player,'将',cards,'作为“威”置于了武将牌上'); - player.loseToSpecial(cards,'twxiawei').visible=true; - } - else event.finish(); - 'step 2' - player.markSkill('twxiawei'); + twxiawei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + locked: false, + group: ["twxiawei_init", "twxiawei_lose", "twxiawei_unmark"], + content: function () { + "step 0"; + player + .chooseControl("1", "2", "3", "4", "cancel2") + .set("prompt", get.prompt("twxiawei")) + .set("prompt2", "妄行:将X+1张牌置于武将牌上,称为“威”") + .set("ai", function () { + var player = _status.event.player; + if (player.maxHp > 3) return 3; + return Math.min(3, player.countCards("he") + 1); + }); + ("step 1"); + if (result.control != "cancel2") { + var num = result.index + 1, + cards = get.cards(num + 1); + player.logSkill("twxiawei"); + player.addTempSkill("wangxing"); + player.addMark("wangxing", num, false); + player.$gain2(cards, false); + game.log(player, "将", cards, "作为“威”置于了武将牌上"); + player.loseToSpecial(cards, "twxiawei").visible = true; + } else event.finish(); + ("step 2"); + player.markSkill("twxiawei"); game.delayx(); }, - marktext:'威', - intro:{ - mark:function(dialog,storage,player){ - var cards=player.getCards('s',function(card){ - return card.hasGaintag('twxiawei'); + marktext: "威", + intro: { + mark: function (dialog, storage, player) { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("twxiawei"); }); - if(!cards||!cards.length) return; + if (!cards || !cards.length) return; dialog.addAuto(cards); }, - markcount:function(storage,player){ - return player.countCards('s',function(card){ - return card.hasGaintag('twxiawei'); + markcount: function (storage, player) { + return player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); }); }, - onunmark:function(storage,player){ - var cards=player.getCards('s',function(card){ - return card.hasGaintag('twxiawei'); + onunmark: function (storage, player) { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("twxiawei"); }); - if(cards.length){ + if (cards.length) { player.loseToDiscardpile(cards); } }, }, - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('twxiawei')) return num+0.5; + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("twxiawei")) return num + 0.5; }, }, - subSkill:{ - init:{ - audio:'twxiawei', - trigger:{global:'phaseBefore',player:'enterGame'}, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + subSkill: { + init: { + audio: "twxiawei", + trigger: { global: "phaseBefore", player: "enterGame" }, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - content:function(){ - 'step 0' - var cards=[]; - for(var i=1;i<=2;i++){ - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&get.type(card)=='basic'; + forced: true, + locked: false, + content: function () { + "step 0"; + var cards = []; + for (var i = 1; i <= 2; i++) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.type(card) == "basic"; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length){ - player.$gain2(cards,false); - game.log(player,'将',cards,'作为“威”置于了武将牌上'); - player.loseToSpecial(cards,'twxiawei').visible=true; - } - else event.finish(); - 'step 1' - player.markSkill('twxiawei'); + if (cards.length) { + player.$gain2(cards, false); + game.log(player, "将", cards, "作为“威”置于了武将牌上"); + player.loseToSpecial(cards, "twxiawei").visible = true; + } else event.finish(); + ("step 1"); + player.markSkill("twxiawei"); game.delayx(); }, }, - lose:{ - audio:'twxiawei', - trigger:{player:'phaseBegin'}, - filter:function(event,player){ - return player.countCards('s',function(card){ - return card.hasGaintag('twxiawei'); + lose: { + audio: "twxiawei", + trigger: { player: "phaseBegin" }, + filter: function (event, player) { + return player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); }); }, - forced:true, - locked:false, - content:function(){ - var cards=player.getCards('s',function(card){ - return card.hasGaintag('twxiawei'); + forced: true, + locked: false, + content: function () { + var cards = player.getCards("s", function (card) { + return card.hasGaintag("twxiawei"); }); player.loseToDiscardpile(cards); }, }, - unmark:{ - trigger:{player:'loseAfter'}, - filter:function(event,player){ - if(!event.ss||!event.ss.length) return false; - return !player.countCards('s',function(card){ - return card.hasGaintag('twxiawei'); + unmark: { + trigger: { player: "loseAfter" }, + filter: function (event, player) { + if (!event.ss || !event.ss.length) return false; + return !player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); }); }, - charlotte:true, - forced:true, - silent:true, - content:function(){ - player.unmarkSkill('twxiawei'); + charlotte: true, + forced: true, + silent: true, + content: function () { + player.unmarkSkill("twxiawei"); }, }, }, }, - wangxing:{ - trigger:{player:'phaseEnd'}, - charlotte:true, - onremove:true, - forced:true, - popup:false, - filter:function(event,player){ - return player.countMark('wangxing')>0; + wangxing: { + trigger: { player: "phaseEnd" }, + charlotte: true, + onremove: true, + forced: true, + popup: false, + filter: function (event, player) { + return player.countMark("wangxing") > 0; }, - content:function(){ - 'step 0' - player.chooseToDiscard('he',player.countMark('wangxing'),'妄行:请弃置'+get.cnNumber(player.countMark('wangxing'))+'张牌,或减1点体力上限').set('ai',function(card){ - var player=_status.event.player; - if(player.maxHp==1) return 100-get.value(card); - return 5+Math.max(0,5-player.maxHp)-get.value(card); - }); - 'step 1' - if(!result.bool) player.loseMaxHp(); + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + player.countMark("wangxing"), + "妄行:请弃置" + + get.cnNumber(player.countMark("wangxing")) + + "张牌,或减1点体力上限" + ) + .set("ai", function (card) { + var player = _status.event.player; + if (player.maxHp == 1) return 100 - get.value(card); + return 5 + Math.max(0, 5 - player.maxHp) - get.value(card); + }); + ("step 1"); + if (!result.bool) player.loseMaxHp(); }, - intro:{content:'回合结束时,你须弃置#张牌,否则减1点体力上限'}, + intro: { content: "回合结束时,你须弃置#张牌,否则减1点体力上限" }, }, - twqiongji:{ - audio:2, - trigger:{player:['useCardAfter','respondAfter','damageBegin3']}, - filter:function(event,player){ - if(event.name=='damage') return !player.countCards('s',function(card){ - return card.hasGaintag('twxiawei'); - }); - return !player.hasSkill('twqiongji_silent')&&player.getHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('twxiawei')) return true; - } - return false; - }).length>0; + twqiongji: { + audio: 2, + trigger: { player: ["useCardAfter", "respondAfter", "damageBegin3"] }, + filter: function (event, player) { + if (event.name == "damage") + return !player.countCards("s", function (card) { + return card.hasGaintag("twxiawei"); + }); + return ( + !player.hasSkill("twqiongji_silent") && + player.getHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("twxiawei")) return true; + } + return false; + }).length > 0 + ); }, - forced:true, - content:function(){ - if(trigger.name=='damage') trigger.num++; + forced: true, + content: function () { + if (trigger.name == "damage") trigger.num++; else { player.draw(); - player.addTempSkill('twqiongji_silent'); + player.addTempSkill("twqiongji_silent"); } }, - ai:{ - combo:'twxiawei', - halfneg:true + ai: { + combo: "twxiawei", + halfneg: true, }, - subSkill:{silent:{charlotte:true}}, + subSkill: { silent: { charlotte: true } }, }, //卞夫人 - twwanwei:{ - audio:'wanwei', - trigger:{global:'damageBegin4'}, - filter:function(event,player){ + twwanwei: { + audio: "wanwei", + trigger: { global: "damageBegin4" }, + filter: function (event, player) { return event.player.isMinHp(); }, - check:function(event,player){ - return get.attitude(player,event.player)>0&&event.player.hp 0 && event.player.hp < player.hp; }, - usable:1, - logTarget:'player', - prompt2:function(event,player){ - if(player!=event.player){ - return '防止'+get.translation(event.player)+'即将受到的'+event.num+'点伤害,然后你失去1点体力'; - } - else if(event.player==player||!game.hasPlayer(function(current){ - return current!=player&¤t.maxHp>player.maxHp - })){ - return '于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之'; + usable: 1, + logTarget: "player", + prompt2: function (event, player) { + if (player != event.player) { + return ( + "防止" + + get.translation(event.player) + + "即将受到的" + + event.num + + "点伤害,然后你失去1点体力" + ); + } else if ( + event.player == player || + !game.hasPlayer(function (current) { + return current != player && current.maxHp > player.maxHp; + }) + ) { + return "于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之"; } }, - content:function(){ - if(trigger.player!=player){ + content: function () { + if (trigger.player != player) { trigger.cancel(); player.loseHp(); } - if(trigger.player==player||!game.hasPlayer(function(current){ - return current!=player&¤t.maxHp>player.maxHp - })) player.addTempSkill('twwanwei_effect'); + if ( + trigger.player == player || + !game.hasPlayer(function (current) { + return current != player && current.maxHp > player.maxHp; + }) + ) + player.addTempSkill("twwanwei_effect"); }, - subSkill:{ - effect:{ - audio:'wanwei', - charlotte:true, - trigger:{global:'phaseJieshuBegin'}, - prompt2:'获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之', - content:function(){ - 'step 0' - var card=get.cards()[0]; - player.gain(card,'gain2'); - 'step 1' - var card=get.bottomCards()[0]; + subSkill: { + effect: { + audio: "wanwei", + charlotte: true, + trigger: { global: "phaseJieshuBegin" }, + prompt2: "获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之", + content: function () { + "step 0"; + var card = get.cards()[0]; + player.gain(card, "gain2"); + ("step 1"); + var card = get.bottomCards()[0]; ui.cardPile.appendChild(card); game.updateRoundNumber(); - player.showCards([card],get.translation(player)+'挽危:牌堆底的牌'); - if(player.hasUseTarget(card)) player.chooseUseTarget(card,true); + player.showCards([card], get.translation(player) + "挽危:牌堆底的牌"); + if (player.hasUseTarget(card)) player.chooseUseTarget(card, true); }, }, }, }, - twyuejian:{ - audio:'yuejian', - enable:'phaseUse', - filterCard:true, - selectCard:function(){ - var player=_status.event.player; - var num=Math.max(1,player.countCards('h')-player.getHandcardLimit()); - return [1,num]; + twyuejian: { + audio: "yuejian", + enable: "phaseUse", + filterCard: true, + selectCard: function () { + var player = _status.event.player; + var num = Math.max(1, player.countCards("h") - player.getHandcardLimit()); + return [1, num]; }, - complexCard:true, - discard:false, - loseTo:'cardPile', - insert:true, - visible:true, - delay:false, - position:'he', - usable:1, - check:function(card){ - if(ui.selected.cards.length>=3) return 0; - var player=_status.event.player; - var num=Math.max(1,player.countCards('h')-player.getHandcardLimit()); - if(num>=3) return 5-get.value(card); - if(num>=2&&player.isDamaged()&&ui.selected.cards.length<1) return 7-get.value(card); - if(num>=1&&player.isDamaged()&&!ui.selected.cards.length) return 6-get.value(card); + complexCard: true, + discard: false, + loseTo: "cardPile", + insert: true, + visible: true, + delay: false, + position: "he", + usable: 1, + check: function (card) { + if (ui.selected.cards.length >= 3) return 0; + var player = _status.event.player; + var num = Math.max(1, player.countCards("h") - player.getHandcardLimit()); + if (num >= 3) return 5 - get.value(card); + if (num >= 2 && player.isDamaged() && ui.selected.cards.length < 1) + return 7 - get.value(card); + if (num >= 1 && player.isDamaged() && !ui.selected.cards.length) + return 6 - get.value(card); return 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.$throw(cards.length); - var next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('prompt','约俭:将这些牌置于牌堆顶或牌堆底'); - next.set('processAI',function(list){ - var cards=list[0][1],player=_status.event.player; - var target=player.next; - var att=get.sgn(get.attitude(player,target)); - var top=[]; - var judges=target.getCards('j'); - var stopped=false; - if(player!=target||!target.hasWuxie()){ - for(var i=0;i0)) break; + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; top.unshift(cards.shift()); } } - bottom=cards.sort(function(a,b){ - return player.getUseValue(a)-player.getUseValue(b); + bottom = cards.sort(function (a, b) { + return player.getUseValue(a) - player.getUseValue(b); }); - return [top,bottom]; + return [top, bottom]; }); - 'step 1' - var top=result.moved[0]; - var bottom=result.moved[1]; + ("step 1"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - for(var i=0;i=3) player.gainMaxHp(); - 'step 3' - if(cards.length>=2) player.recover(); - 'step 4' - if(cards.length>=1){ - player.addSkill('twyuejian_effect'); - player.addMark('twyuejian_effect',1,false); + ("step 2"); + if (cards.length >= 3) player.gainMaxHp(); + ("step 3"); + if (cards.length >= 2) player.recover(); + ("step 4"); + if (cards.length >= 1) { + player.addSkill("twyuejian_effect"); + player.addMark("twyuejian_effect", 1, false); } }, - ai:{ - order:5, - result:{player:1}, + ai: { + order: 5, + result: { player: 1 }, }, - subSkill:{ - effect:{ - charlotte:true, - onremove:true, - marktext:'俭', - intro:{ - content:'手牌上限+#', + subSkill: { + effect: { + charlotte: true, + onremove: true, + marktext: "俭", + intro: { + content: "手牌上限+#", }, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('twyuejian_effect'); + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("twyuejian_effect"); }, }, }, }, }, //陈震 - twmuyue:{ - audio:1, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')||player.hasSkill('twmuyue_effect'); + twmuyue: { + audio: 1, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") || player.hasSkill("twmuyue_effect"); }, - chooseButton:{ - dialog:function(){ - var list=[]; - for(var i of lib.inpile){ - var type=get.type(i); - if(type=='basic'||type=='trick') list.push([type,'',i]); + chooseButton: { + dialog: function () { + var list = []; + for (var i of lib.inpile) { + var type = get.type(i); + if (type == "basic" || type == "trick") list.push([type, "", i]); } - return ui.create.dialog('睦约',[list,'vcard']); + return ui.create.dialog("睦约", [list, "vcard"]); }, - check:function(button){ - if(!get.cardPile2(function(cardx){ - return cardx.name==button.link[2]; - })) return 0; - return get.value({name:button.link[2]}); + check: function (button) { + if ( + !get.cardPile2(function (cardx) { + return cardx.name == button.link[2]; + }) + ) + return 0; + return get.value({ name: button.link[2] }); }, - backup:function(links,player){ - return{ - audio:'twmuyue', - filterCard:function(card,player,target){ - return !player.hasSkill('twmuyue_effect'); + backup: function (links, player) { + return { + audio: "twmuyue", + filterCard: function (card, player, target) { + return !player.hasSkill("twmuyue_effect"); }, - selectCard:function(){ - var player=_status.event.player; - return player.hasSkill('twmuyue_effect')?-1:1; + selectCard: function () { + var player = _status.event.player; + return player.hasSkill("twmuyue_effect") ? -1 : 1; }, - check:function(card){ - return 7-get.value(card); + check: function (card) { + return 7 - get.value(card); }, - position:'he', - card:links[0], - filterTarget:true, - content:function(){ - 'step 0' - var card=lib.skill.twmuyue_backup.card; - event.card=card; - player.removeSkill('twmuyue_effect'); - var cardx=get.cardPile2(function(cardx){ - return cardx.name==card[2]; + position: "he", + card: links[0], + filterTarget: true, + content: function () { + "step 0"; + var card = lib.skill.twmuyue_backup.card; + event.card = card; + player.removeSkill("twmuyue_effect"); + var cardx = get.cardPile2(function (cardx) { + return cardx.name == card[2]; }); - player.line(target,'green'); - if(cardx) target.gain(cardx,'gain2'); - else{ - player.chat('无牌可得了吗?!'); - game.log('但是牌堆中已经没有','#g【'+get.translation(card[2])+'】','了!'); + player.line(target, "green"); + if (cardx) target.gain(cardx, "gain2"); + else { + player.chat("无牌可得了吗?!"); + game.log( + "但是牌堆中已经没有", + "#g【" + get.translation(card[2]) + "】", + "了!" + ); } - 'step 1' - if(cards&&cards.length&&get.name(cards[0],player)==card[2]) player.addSkill('twmuyue_effect'); + ("step 1"); + if (cards && cards.length && get.name(cards[0], player) == card[2]) + player.addSkill("twmuyue_effect"); }, - ai:{ - result:{ - target:function(player,target){ - var att=Math.abs(get.attitude(player,target)); - if(target.hasSkill('nogain')) att/=10; - return att/Math.sqrt(get.distance(player,target,'absolute')); - } - } + ai: { + result: { + target: function (player, target) { + var att = Math.abs(get.attitude(player, target)); + if (target.hasSkill("nogain")) att /= 10; + return att / Math.sqrt(get.distance(player, target, "absolute")); + }, + }, }, - } + }; }, - prompt:function(links,player){ - return (player.hasSkill('twmuyue_effect')?'':'弃置一张牌,')+'令一名角色从牌堆中获得一张【'+get.translation(links[0][2])+'】'; - } - }, - ai:{ - order:3, - result:{player:1}, - }, - subSkill:{ - effect:{ - charlotte:true, - mark:true, - intro:{content:'下一次发动【睦约】无需弃牌'}, + prompt: function (links, player) { + return ( + (player.hasSkill("twmuyue_effect") ? "" : "弃置一张牌,") + + "令一名角色从牌堆中获得一张【" + + get.translation(links[0][2]) + + "】" + ); }, - backup:{}, + }, + ai: { + order: 3, + result: { player: 1 }, + }, + subSkill: { + effect: { + charlotte: true, + mark: true, + intro: { content: "下一次发动【睦约】无需弃牌" }, + }, + backup: {}, }, }, - twchayi:{ - audio:1, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twchayi'),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return -get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twchayi',target); - if(!target.countCards('h')) event._result={index:1}; - else target.chooseControl().set('choiceList',[ - '展示手牌', - '下一次使用牌时候弃一张牌', - ]); - } - else event.finish(); - 'step 2' - target.storage.twchayi_re=[result.index,target.countCards('h')]; - target.addSkill('twchayi_re'); - target.markSkill('twchayi_re'); - if(result.index==0) target.showCards(target.getCards('h'),get.translation(target)+'的手牌'); - else{ - target.addMark('twchayi_effect',1,false); - target.addSkill('twchayi_effect'); + twchayi: { + audio: 1, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twchayi"), lib.filter.notMe) + .set("ai", function (target) { + var player = _status.event.player; + return -get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twchayi", target); + if (!target.countCards("h")) event._result = { index: 1 }; + else + target + .chooseControl() + .set("choiceList", ["展示手牌", "下一次使用牌时候弃一张牌"]); + } else event.finish(); + ("step 2"); + target.storage.twchayi_re = [result.index, target.countCards("h")]; + target.addSkill("twchayi_re"); + target.markSkill("twchayi_re"); + if (result.index == 0) + target.showCards(target.getCards("h"), get.translation(target) + "的手牌"); + else { + target.addMark("twchayi_effect", 1, false); + target.addSkill("twchayi_effect"); } }, - subSkill:{ - effect:{ - intro:{content:'使用下一张牌时弃置&张牌'}, - charlotte:true, - onremove:true, - audio:'twchayi', - trigger:{player:'useCard'}, - forced:true, - content:function(){ - player.chooseToDiscard('he',true,player.countMark('twchayi_effect')); - player.removeSkill('twchayi_effect'); + subSkill: { + effect: { + intro: { content: "使用下一张牌时弃置&张牌" }, + charlotte: true, + onremove: true, + audio: "twchayi", + trigger: { player: "useCard" }, + forced: true, + content: function () { + player.chooseToDiscard("he", true, player.countMark("twchayi_effect")); + player.removeSkill("twchayi_effect"); }, }, - re:{ - charlotte:true, - onremove:true, - audio:'twchayi', - trigger:{player:'phaseEnd'}, - direct:true, - filter:function(event,player){ + re: { + charlotte: true, + onremove: true, + audio: "twchayi", + trigger: { player: "phaseEnd" }, + direct: true, + filter: function (event, player) { return player.storage.twchayi_re; }, - content:function(){ - if(player.countCards('h')!=player.storage.twchayi_re[1]){ - player.popup('察异'); - if(player.storage.twchayi_re[0]==0){ - player.addMark('twchayi_effect',1,false); - player.addSkill('twchayi_effect'); - } - else player.showCards(player.getCards('h'),get.translation(player)+'的手牌'); + content: function () { + if (player.countCards("h") != player.storage.twchayi_re[1]) { + player.popup("察异"); + if (player.storage.twchayi_re[0] == 0) { + player.addMark("twchayi_effect", 1, false); + player.addSkill("twchayi_effect"); + } else + player.showCards( + player.getCards("h"), + get.translation(player) + "的手牌" + ); } - player.removeSkill('twchayi_re'); + player.removeSkill("twchayi_re"); }, - marktext:'异', - intro:{ - markcount:function(storage,player){ - if(!storage||!storage.length) return 0; + marktext: "异", + intro: { + markcount: function (storage, player) { + if (!storage || !storage.length) return 0; return storage[1]; }, - content:function(storage,player){ - if(!storage||!storage.length) return; - return '下个回合结束时,若你的手牌数不为'+storage[1]+',你'+(storage[0]==0?'下次使用牌时弃置一张牌':'展示所有手牌'); - } - } + content: function (storage, player) { + if (!storage || !storage.length) return; + return ( + "下个回合结束时,若你的手牌数不为" + + storage[1] + + ",你" + + (storage[0] == 0 ? "下次使用牌时弃置一张牌" : "展示所有手牌") + ); + }, + }, }, }, }, //费祎 - twshengxi:{ - audio:'shengxi_feiyi', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.getHistory('useCard').length>0&&player.getHistory('sourceDamage').length==0; + twshengxi: { + audio: "shengxi_feiyi", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.getHistory("useCard").length > 0 && + player.getHistory("sourceDamage").length == 0 + ); }, - direct:true, - content:function(){ - 'step 0' - var list=get.zhinangs(); - player.chooseButton(['###'+get.prompt('twshengxi')+'###获得一张智囊并摸一张牌',[list,'vcard']]).set('ai',function(card){ - return (Math.random()+0.5)*get.value({name:card.link[2]},_status.event.player) - }); - 'step 1' - if(result.bool){ - player.logSkill('twshengxi'); - var card=get.cardPile2(function(card){ - return card.name==result.links[0][2]; + direct: true, + content: function () { + "step 0"; + var list = get.zhinangs(); + player + .chooseButton([ + "###" + get.prompt("twshengxi") + "###获得一张智囊并摸一张牌", + [list, "vcard"], + ]) + .set("ai", function (card) { + return ( + (Math.random() + 0.5) * + get.value({ name: card.link[2] }, _status.event.player) + ); }); - if(card) player.gain(card,'gain2'); + ("step 1"); + if (result.bool) { + player.logSkill("twshengxi"); + var card = get.cardPile2(function (card) { + return card.name == result.links[0][2]; + }); + if (card) player.gain(card, "gain2"); player.draw(); } }, - group:'twshengxi_zhunbei', - subfrequent:['zhunbei'], - subSkill:{ - zhunbei:{ - audio:'shengxi_feiyi', - trigger:{player:'phaseZhunbeiBegin'}, - frequent:true, - prompt2:'从游戏外或牌堆中获得一张【调剂盐梅】', - content:function(){ - if(!_status.tiaojiyanmei_suits||_status.tiaojiyanmei_suits.length>0){ - if(!lib.inpile.includes('tiaojiyanmei')){ - game.broadcastAll(function(){lib.inpile.add('tiaojiyanmei')}); + group: "twshengxi_zhunbei", + subfrequent: ["zhunbei"], + subSkill: { + zhunbei: { + audio: "shengxi_feiyi", + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + prompt2: "从游戏外或牌堆中获得一张【调剂盐梅】", + content: function () { + if (!_status.tiaojiyanmei_suits || _status.tiaojiyanmei_suits.length > 0) { + if (!lib.inpile.includes("tiaojiyanmei")) { + game.broadcastAll(function () { + lib.inpile.add("tiaojiyanmei"); + }); } - if(!_status.tiaojiyanmei_suits) _status.tiaojiyanmei_suits=lib.suit.slice(0); - player.gain(game.createCard2('tiaojiyanmei',_status.tiaojiyanmei_suits.randomRemove(),6),'gain2'); - } - else { - var card=get.cardPile2(function(card){ - return card.name=='tiaojiyanmei'; + if (!_status.tiaojiyanmei_suits) + _status.tiaojiyanmei_suits = lib.suit.slice(0); + player.gain( + game.createCard2( + "tiaojiyanmei", + _status.tiaojiyanmei_suits.randomRemove(), + 6 + ), + "gain2" + ); + } else { + var card = get.cardPile2(function (card) { + return card.name == "tiaojiyanmei"; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); } }, }, }, }, - twkuanji:{ - audio:'fyjianyu', - trigger:{ - player:'loseAfter', - global:['cardsDiscardAfter','loseAsyncAfter','equipAfter'], + twkuanji: { + audio: "fyjianyu", + trigger: { + player: "loseAfter", + global: ["cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], }, - filter:function(event,player){ - if(event.name!='cardsDiscard'){ - return event.getd(player,'cards2').length>0; - } - else{ - if(event.cards.filterInD('d').length<=0) return false; - var evt=event.getParent(); - if(evt.name!='orderingDiscard') return false; - var evtx=(evt.relatedEvent||evt.getParent()); - if(evtx.player!=player) return false; - if(evtx.name=='useCard') return false; - return player.hasHistory('lose',evtxx=>{ - return evtx==(evtxx.relatedEvent||evtxx.getParent()); + filter: function (event, player) { + if (event.name != "cardsDiscard") { + return event.getd(player, "cards2").length > 0; + } else { + if (event.cards.filterInD("d").length <= 0) return false; + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + var evtx = evt.relatedEvent || evt.getParent(); + if (evtx.player != player) return false; + if (evtx.name == "useCard") return false; + return player.hasHistory("lose", (evtxx) => { + return evtx == (evtxx.relatedEvent || evtxx.getParent()); }); } }, - usable:1, - direct:true, - content:function(){ - 'step 0' - var cards=[]; - if(trigger.name!='cardsDiscard'){ - cards=trigger.getd(player,'cards2'); - } - else cards=trigger.cards.filterInD('d'); - player.chooseButton(['宽济:是否将一张牌交给一名其他角色?',cards]).set('ai',function(button){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })) return Math.abs(get.value(button.link,'raw'))+1; - return -get.value(button.link,'raw'); - }); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget('请选择【宽济】的目标','令一名其他角色获得'+get.translation(card),lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target)*get.value(_status.event.getParent().card,target)*(target.hasSkillTag('nogain')?0.1:1); + usable: 1, + direct: true, + content: function () { + "step 0"; + var cards = []; + if (trigger.name != "cardsDiscard") { + cards = trigger.getd(player, "cards2"); + } else cards = trigger.cards.filterInD("d"); + player + .chooseButton(["宽济:是否将一张牌交给一名其他角色?", cards]) + .set("ai", function (button) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + return Math.abs(get.value(button.link, "raw")) + 1; + return -get.value(button.link, "raw"); }); - } - else{ + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget( + "请选择【宽济】的目标", + "令一名其他角色获得" + get.translation(card), + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + return ( + get.attitude(player, target) * + get.value(_status.event.getParent().card, target) * + (target.hasSkillTag("nogain") ? 0.1 : 1) + ); + }); + } else { player.storage.counttrigger.twkuanji--; event.finish(); } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twkuanji',target); - target.gain(card,'gain2'); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twkuanji", target); + target.gain(card, "gain2"); } }, }, - shengxi_feiyi:{audio:2}, + shengxi_feiyi: { audio: 2 }, //王越 - twyulong:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - if(!event.isFirstTarget) return false; - if(event.card.name!='sha') return false; - return event.targets.some(target=>player.canCompare(target)); + twyulong: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget) return false; + if (event.card.name != "sha") return false; + return event.targets.some((target) => player.canCompare(target)); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twyulong'),(card,player,target)=>{ - return _status.event.getTrigger().targets.includes(target)&&player.canCompare(target); - }).set('ai',target=>{ - if(player.hasCard(card=>get.value(card)<6,'h')) return -get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twyulong',target); - if(player.canCompare(target)){ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twyulong"), (card, player, target) => { + return ( + _status.event.getTrigger().targets.includes(target) && + player.canCompare(target) + ); + }) + .set("ai", (target) => { + if (player.hasCard((card) => get.value(card) < 6, "h")) + return -get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twyulong", target); + if (player.canCompare(target)) { player.chooseToCompare(target); } - } - else{ + } else { event.finish(); } - 'step 2' - if(result.bool){ - var color=get.color(result.player,false); - if(color=='black') trigger.getParent().baseDamage++; - else if(color=='red') trigger.directHit.addArray(game.players); - trigger.getParent().twyulong=true; - player.addTempSkill('twyulong_addCount'); + ("step 2"); + if (result.bool) { + var color = get.color(result.player, false); + if (color == "black") trigger.getParent().baseDamage++; + else if (color == "red") trigger.directHit.addArray(game.players); + trigger.getParent().twyulong = true; + player.addTempSkill("twyulong_addCount"); } }, - subSkill:{ - addCount:{ - charlotte:true, - forced:true, - trigger:{source:'damageSource'}, - filter:function(event,player){ - if(!event.card||event.card.name!='sha') return false; - var evt=event.getParent(2); - if(evt.name!='useCard'||!evt.twyulong) return false; + subSkill: { + addCount: { + charlotte: true, + forced: true, + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!event.card || event.card.name != "sha") return false; + var evt = event.getParent(2); + if (evt.name != "useCard" || !evt.twyulong) return false; return true; }, - content:function(){ - var evt=trigger.getParent(2); - if(evt.addCount!==false){ - evt.addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + content: function () { + var evt = trigger.getParent(2); + if (evt.addCount !== false) { + evt.addCount = false; + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } } - } - } - } + }, + }, + }, }, - twjianming:{ - audio:2, - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - if(event.card.name!='sha'||!lib.suit.includes(get.suit(event.card))) return false; - var list=[]; - player.getHistory('useCard',function(evt){ - if(evt.card.name=='sha'){ - if(event.card!=evt.card) list.push(get.suit(evt.card)); + twjianming: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + if (event.card.name != "sha" || !lib.suit.includes(get.suit(event.card))) return false; + var list = []; + player.getHistory("useCard", function (evt) { + if (evt.card.name == "sha") { + if (event.card != evt.card) list.push(get.suit(evt.card)); } }); - player.getHistory('respond',function(evt){ - if(evt.card.name=='sha'){ - if(event.card!=evt.card) list.push(get.suit(evt.card)); + player.getHistory("respond", function (evt) { + if (evt.card.name == "sha") { + if (event.card != evt.card) list.push(get.suit(evt.card)); } }); return !list.includes(get.suit(event.card)); }, - forced:true, - content:function(){ + forced: true, + content: function () { player.draw(); }, }, //李彦 - twzhenhu:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - if(!event.isFirstTarget||!get.tag(event.card,'damage')) return false; - return !player.hasSkillTag('noCompareSource')&&game.hasPlayer(target=>{ - return player.canCompare(target,true); - }); + twzhenhu: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (!event.isFirstTarget || !get.tag(event.card, "damage")) return false; + return ( + !player.hasSkillTag("noCompareSource") && + game.hasPlayer((target) => { + return player.canCompare(target, true); + }) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twzhenhu'),[1,3],function(card,player,target){ - return player.canCompare(target,true); - }).set('ai',function(target){ - var player=_status.event.player,targets=_status.event.getTrigger().targets; - var num=0; - if(player.hasSkill('twlvren')) num+=2*(ui.selected.targets.length+1); - if(player.hasSkill('twchuanshu_effect')) num+=3; - var hs=player.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - if(hs.length==0) return -1; - var ts=target.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - if(Math.min(13,get.number(hs[0])+num)<=get.number(ts[0])) return -1; - return get.effect(target,{name:'guohe_copy2'},player,player)/2+(targets.includes(target)?get.damageEffect(target,player,player):0); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - event.targets=targets; - player.logSkill('twzhenhu',targets); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twzhenhu"), [1, 3], function (card, player, target) { + return player.canCompare(target, true); + }) + .set("ai", function (target) { + var player = _status.event.player, + targets = _status.event.getTrigger().targets; + var num = 0; + if (player.hasSkill("twlvren")) num += 2 * (ui.selected.targets.length + 1); + if (player.hasSkill("twchuanshu_effect")) num += 3; + var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (hs.length == 0) return -1; + var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a)); + if (Math.min(13, get.number(hs[0]) + num) <= get.number(ts[0])) return -1; + return ( + get.effect(target, { name: "guohe_copy2" }, player, player) / 2 + + (targets.includes(target) ? get.damageEffect(target, player, player) : 0) + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + player.logSkill("twzhenhu", targets); player.draw(); - } - else event.finish(); - 'step 2' - player.chooseToCompare(targets,function(card){ - return get.number(card); - }).setContent('chooseToCompareMeanwhile'); - 'step 3' - if(result.winner&&result.winner==player){ + } else event.finish(); + ("step 2"); + player + .chooseToCompare(targets, function (card) { + return get.number(card); + }) + .setContent("chooseToCompareMeanwhile"); + ("step 3"); + if (result.winner && result.winner == player) { event.targets.remove(result.winner); - player.line(event.targets,trigger.card.nature); - player.addTempSkill('twzhenhu_add'); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.twzhenhu=event.targets; - } - else player.loseHp(); + player.line(event.targets, trigger.card.nature); + player.addTempSkill("twzhenhu_add"); + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.twzhenhu = event.targets; + } else player.loseHp(); }, - subSkill:{ - add:{ - charlotte:true, - onremove:true, - forced:true, - popup:false, - trigger:{global:'damageBegin1'}, - filter:function(event,player){ - if(!event.card||!event.card.storage) return false; - var targets=event.card.storage.twzhenhu; - return targets&&targets.includes(event.player); + subSkill: { + add: { + charlotte: true, + onremove: true, + forced: true, + popup: false, + trigger: { global: "damageBegin1" }, + filter: function (event, player) { + if (!event.card || !event.card.storage) return false; + var targets = event.card.storage.twzhenhu; + return targets && targets.includes(event.player); }, - content:function(){ + content: function () { trigger.num++; }, }, }, }, - twlvren:{ - audio:2, - trigger:{source:'damageBegin3'}, - filter:function(event,player){ - return event.player!=player&&event.player.isIn()&&!event.player.hasMark('twlvren'); + twlvren: { + audio: 2, + trigger: { source: "damageBegin3" }, + filter: function (event, player) { + return event.player != player && event.player.isIn() && !event.player.hasMark("twlvren"); }, - logTarget:'player', - forced:true, - locked:false, - group:['twlvren_more','twlvren_add'], - content:function(){ - trigger.player.addMark('twlvren',1); + logTarget: "player", + forced: true, + locked: false, + group: ["twlvren_more", "twlvren_add"], + content: function () { + trigger.player.addMark("twlvren", 1); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(target&&target.hasMark('twlvren')) return 0.33; - } - } + ai: { + effect: { + player: function (card, player, target) { + if (target && target.hasMark("twlvren")) return 0.33; + }, + }, }, - marktext:'刃', - intro:{name2:'刃',content:'mark'}, - subSkill:{ - more:{ - audio:'twlvren', - trigger:{player:'useCard2'}, - filter:function(event,player){ - var card=event.card,info=get.info(card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - return get.tag(card,'damage')&&event.targets&&game.hasPlayer(function(target){ - return target.hasMark('twlvren')&&!event.targets.includes(target)&&lib.filter.targetEnabled2(card,player,target); - }); + marktext: "刃", + intro: { name2: "刃", content: "mark" }, + subSkill: { + more: { + audio: "twlvren", + trigger: { player: "useCard2" }, + filter: function (event, player) { + var card = event.card, + info = get.info(card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + return ( + get.tag(card, "damage") && + event.targets && + game.hasPlayer(function (target) { + return ( + target.hasMark("twlvren") && + !event.targets.includes(target) && + lib.filter.targetEnabled2(card, player, target) + ); + }) + ); } return false; }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twlvren'),'为'+get.translation(trigger.card)+'额外指定一个有“刃”的角色为目标',function(card,player,target){ - var evt=_status.event.getTrigger(); - return target.hasMark('twlvren')&&!evt.targets.includes(target)&&lib.filter.targetEnabled2(evt.card,player,target); - }).set('ai',function(target){ - return get.effect(target,_status.event.getTrigger().card,_status.event.player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets; - player.logSkill('twlvren',targets); - player.line(targets,trigger.card.nature); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twlvren"), + "为" + get.translation(trigger.card) + "额外指定一个有“刃”的角色为目标", + function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target.hasMark("twlvren") && + !evt.targets.includes(target) && + lib.filter.targetEnabled2(evt.card, player, target) + ); + } + ) + .set("ai", function (target) { + return get.effect( + target, + _status.event.getTrigger().card, + _status.event.player + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; + player.logSkill("twlvren", targets); + player.line(targets, trigger.card.nature); trigger.targets.addArray(targets); - for(var i of targets) i.removeMark('twlvren',i.countMark('twlvren'),false); + for (var i of targets) i.removeMark("twlvren", i.countMark("twlvren"), false); } }, }, - add:{ - audio:'twlvren', - trigger:{player:'compare',target:'compare'}, - filter:function(event,player){ - if(player!=event.target&&event.iwhile) return false; + add: { + audio: "twlvren", + trigger: { player: "compare", target: "compare" }, + filter: function (event, player) { + if (player != event.target && event.iwhile) return false; return true; }, - forced:true, - locked:false, - content:function(){ - var num=2*trigger.lose_list.length; - if(player==trigger.player){ - trigger.num1+=num; - if(trigger.num1>13) trigger.num1=13; + forced: true, + locked: false, + content: function () { + var num = 2 * trigger.lose_list.length; + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; } - else{ - trigger.num2+=num; - if(trigger.num2>13) trigger.num2=13; - } - game.log(player,'的拼点牌点数+',num); + game.log(player, "的拼点牌点数+", num); }, }, }, }, //童渊 - twchaofeng:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - if(!['sha','shan'].includes(name)) return false; - return player.hasCard(function(card){ - const name2=get.name(card); - return (name2=='sha'||name2=='shan')&&name!=name2; - },'hs'); + twchaofeng: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + if (!["sha", "shan"].includes(name)) return false; + return player.hasCard(function (card) { + const name2 = get.name(card); + return (name2 == "sha" || name2 == "shan") && name != name2; + }, "hs"); }, - filter:function(event,player){ - const names=[]; - if(event.filterCard(get.autoViewAs({name:'sha'},'unsure'),player,event)) names.push('shan'); - if(event.filterCard(get.autoViewAs({name:'shan'},'unsure'),player,event)) names.push('sha'); - return names.length>0&&player.hasCard(function(card){ - return names.includes(get.name(card)); - },'hs'); + filter: function (event, player) { + const names = []; + if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) + names.push("shan"); + if (event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event)) + names.push("sha"); + return ( + names.length > 0 && + player.hasCard(function (card) { + return names.includes(get.name(card)); + }, "hs") + ); //return false; }, - group:'twchaofeng_compare', - chooseButton:{ - dialog:function(event,player){ - var list=[]; - if(event.filterCard({name:'sha'},player,event)){ - list.push(['基本','','sha']); - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + group: "twchaofeng_compare", + chooseButton: { + dialog: function (event, player) { + var list = []; + if (event.filterCard({ name: "sha" }, player, event)) { + list.push(["基本", "", "sha"]); + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } - if(event.filterCard({name:'shan'},player,event)){ - list.push(['基本','','shan']); + if (event.filterCard({ name: "shan" }, player, event)) { + list.push(["基本", "", "shan"]); } - var dialog=ui.create.dialog('朝凤',[list,'vcard'],'hidden'); - dialog.direct=true; + var dialog = ui.create.dialog("朝凤", [list, "vcard"], "hidden"); + dialog.direct = true; return dialog; }, - check:function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - if(_status.event.getParent().type!='phase'||game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ - switch (button.link[2]){ - case 'shan':return 5; - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder'||button.link[3]=='ice') return 2.92; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + _status.event.getParent().type != "phase" || + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "shan": + return 5; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder" || button.link[3] == "ice") + return 2.92; else return 2.9; } } return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'twchaofeng', - name:links[0][2], - filterCard:function(card,player,target){ - if(lib.skill.twchaofeng_backup.name=='sha') return get.name(card)=='shan'; - else return get.name(card)=='sha'; + audio: "twchaofeng", + name: links[0][2], + filterCard: function (card, player, target) { + if (lib.skill.twchaofeng_backup.name == "sha") + return get.name(card) == "shan"; + else return get.name(card) == "sha"; }, - selectCard:1, - check:function(card,player,target){ - return 6-get.value(card); + selectCard: 1, + check: function (card, player, target) { + return 6 - get.value(card); }, - viewAs:{name:links[0][2],nature:links[0][3]}, - position:'hs', - popname:true, - } + viewAs: { name: links[0][2], nature: links[0][3] }, + position: "hs", + popname: true, + }; }, - prompt:function(links,player){ - var view,use; - if(links[0][2]=='sha'){ - use='【闪】'; - view=get.translation(links[0][3]||'')+'【'+get.translation(links[0][2])+'】'; + prompt: function (links, player) { + var view, use; + if (links[0][2] == "sha") { + use = "【闪】"; + view = + get.translation(links[0][3] || "") + + "【" + + get.translation(links[0][2]) + + "】"; + } else { + use = "【杀】"; + view = "【闪】"; } - else{ - use='【杀】'; - view='【闪】'; - } - return '将一张'+use+'当做'+view+(_status.event.name=='chooseToUse'?'使用':'打出'); + return ( + "将一张" + + use + + "当做" + + view + + (_status.event.name == "chooseToUse" ? "使用" : "打出") + ); }, }, - ai:{ - skillTagFilter:function(player,tag){ + ai: { + skillTagFilter: function (player, tag) { var name; - switch (tag){ - case 'respondSha':name='shan'; break; - case 'respondShan':name='sha'; break; + switch (tag) { + case "respondSha": + name = "shan"; + break; + case "respondShan": + name = "sha"; + break; } - if(!player.countCards('hs',name)) return false; + if (!player.countCards("hs", name)) return false; }, - order:function(item,player){ - if(player&&_status.event.type=='phase'){ - var max=0; - if(player.countCards('hs','shan')>0&&lib.inpile_nature.some(i=>player.getUseValue({name:'sha',nature:i})>0)){ - var temp=get.order({name:'sha'}); - if(temp>max) max=temp; + order: function (item, player) { + if (player && _status.event.type == "phase") { + var max = 0; + if ( + player.countCards("hs", "shan") > 0 && + lib.inpile_nature.some( + (i) => player.getUseValue({ name: "sha", nature: i }) > 0 + ) + ) { + var temp = get.order({ name: "sha" }); + if (temp > max) max = temp; } - if(max>0) max+=0.3; + if (max > 0) max += 0.3; return max; } return 4; }, - result:{ - player:1, + result: { + player: 1, }, - respondSha:true, - respondShan:true, - fireAttack:true, + respondSha: true, + respondShan: true, + fireAttack: true, }, - subSkill:{ - compare:{ - audio:'twchaofeng', - trigger:{player:'phaseUseBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twchaofeng'),'选择至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】',[1,3],(card,player,target)=>{ - return player.canCompare(target); - }).set('ai',function(target){ - var player=_status.event.player,targets=_status.event.getTrigger().targets; - var num=0,card={name:'sha',nature:'fire',isCard:true}; - if(target.hasSkill('twlvren')) num+=2*(ui.selected.targets.length+1); - if(target.hasSkill('twchuanshu_effect')) num+=3; - var hs=player.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - var ts=target.getCards('h').sort((a,b)=>get.number(b)-get.number(a)); - if(get.number(hs[0])<=Math.min(13,get.number(ts[0])+num)){ - return 6+get.effect(player,card,target,target); - } - return get.effect(target,{name:'guohe_copy2'},player,player)/2+get.effect(target,card,player,player); - }); - 'step 1' - if(result.bool){ - event.targets=result.targets; - player.logSkill('twchaofeng_compare',event.targets); - player.chooseToCompare(event.targets).setContent('chooseToCompareMeanwhile'); - } - 'step 2' - if(result.winner){ - var targets=[player].addArray(event.targets).sortBySeat(player); - targets.remove(result.winner); - var card={name:'sha',nature:'fire',isCard:true}; - var targetsx=targets.filter(function(target){ - return result.winner.canUse(card,target,false); + subSkill: { + compare: { + audio: "twchaofeng", + trigger: { player: "phaseUseBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twchaofeng"), + "选择至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】", + [1, 3], + (card, player, target) => { + return player.canCompare(target); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + targets = _status.event.getTrigger().targets; + var num = 0, + card = { name: "sha", nature: "fire", isCard: true }; + if (target.hasSkill("twlvren")) + num += 2 * (ui.selected.targets.length + 1); + if (target.hasSkill("twchuanshu_effect")) num += 3; + var hs = player + .getCards("h") + .sort((a, b) => get.number(b) - get.number(a)); + var ts = target + .getCards("h") + .sort((a, b) => get.number(b) - get.number(a)); + if (get.number(hs[0]) <= Math.min(13, get.number(ts[0]) + num)) { + return 6 + get.effect(player, card, target, target); + } + return ( + get.effect(target, { name: "guohe_copy2" }, player, player) / 2 + + get.effect(target, card, player, player) + ); }); - if(targetsx.length) result.winner.useCard(card,targetsx,'noai').set('addCount',false); + ("step 1"); + if (result.bool) { + event.targets = result.targets; + player.logSkill("twchaofeng_compare", event.targets); + player.chooseToCompare(event.targets).setContent("chooseToCompareMeanwhile"); } - } - } - } + ("step 2"); + if (result.winner) { + var targets = [player].addArray(event.targets).sortBySeat(player); + targets.remove(result.winner); + var card = { name: "sha", nature: "fire", isCard: true }; + var targetsx = targets.filter(function (target) { + return result.winner.canUse(card, target, false); + }); + if (targetsx.length) + result.winner.useCard(card, targetsx, "noai").set("addCount", false); + } + }, + }, + }, }, - twchuanshu:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - limited:true, - skillAnimation:true, - animationColor:'qun', - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twchuanshu')).set('ai',target=>get.attitude(_status.event.player,target)); - 'step 1' - if(result.bool){ - player.awakenSkill('twchuanshu'); - var target=result.targets[0]; - player.logSkill('twchuanshu',target); - target.addMark('twchuanshu_mark',1,false); - target.addSkill('twchuanshu_effect'); - target.markAuto('twchuanshu_effect',[player]); - player.addSkill('twchuanshu_clear'); - player.markAuto('twchuanshu_clear',[target]); + twchuanshu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + limited: true, + skillAnimation: true, + animationColor: "qun", + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twchuanshu")) + .set("ai", (target) => get.attitude(_status.event.player, target)); + ("step 1"); + if (result.bool) { + player.awakenSkill("twchuanshu"); + var target = result.targets[0]; + player.logSkill("twchuanshu", target); + target.addMark("twchuanshu_mark", 1, false); + target.addSkill("twchuanshu_effect"); + target.markAuto("twchuanshu_effect", [player]); + player.addSkill("twchuanshu_clear"); + player.markAuto("twchuanshu_clear", [target]); } }, - subSkill:{ - mark:{ - charlotte:true, + subSkill: { + mark: { + charlotte: true, }, - effect:{ - audio:'twchuanshu', - trigger:{ - player:'compare', - target:'compare', + effect: { + audio: "twchuanshu", + trigger: { + player: "compare", + target: "compare", }, - direct:true, - forced:true, - charlotte:true, - nopop:true, - mark:true, - intro:{ - content:function(storage,player){ - var shisyou=player.getStorage('twchuanshu_effect').filter(i=>i.isIn()); - var str='
  • 拼点牌点数+3;' - if(player.hasMark('twchuanshu_mark')){ - str+='
  • 使用的下一张【杀】对除'+get.translation(shisyou)+'外的角色造成伤害时,此伤害+'+player.countMark('twchuanshu_mark')+';'; - if(!shisyou.includes(player)){ - str+='
  • 使用的下一张【杀】结算结束后,'+get.translation(shisyou)+'摸等同于伤害值的牌;'; + direct: true, + forced: true, + charlotte: true, + nopop: true, + mark: true, + intro: { + content: function (storage, player) { + var shisyou = player.getStorage("twchuanshu_effect").filter((i) => i.isIn()); + var str = "
  • 拼点牌点数+3;"; + if (player.hasMark("twchuanshu_mark")) { + str += + "
  • 使用的下一张【杀】对除" + + get.translation(shisyou) + + "外的角色造成伤害时,此伤害+" + + player.countMark("twchuanshu_mark") + + ";"; + if (!shisyou.includes(player)) { + str += + "
  • 使用的下一张【杀】结算结束后," + + get.translation(shisyou) + + "摸等同于伤害值的牌;"; } } - str=str.slice(0,-1)+'。'; + str = str.slice(0, -1) + "。"; return str; - } + }, }, - filter:function(event,player,name){ - if(event.player==player&&event.iwhile>0) return false; - return (player==event.player?event.num1:event.num2)<13; + filter: function (event, player, name) { + if (event.player == player && event.iwhile > 0) return false; + return (player == event.player ? event.num1 : event.num2) < 13; }, - content:function(){ - game.log(player,'的拼点牌点数+3'); - if(player==trigger.player) trigger.num1=Math.min(13,trigger.num1+3); - else trigger.num2=Math.min(13,trigger.num2+3); + content: function () { + game.log(player, "的拼点牌点数+3"); + if (player == trigger.player) trigger.num1 = Math.min(13, trigger.num1 + 3); + else trigger.num2 = Math.min(13, trigger.num2 + 3); }, - group:'twchuanshu_damage', + group: "twchuanshu_damage", }, - damage:{ - charlotte:true, - trigger:{player:['useCard','useCardAfter'],source:'damageBegin1'}, - filter:function(event,player,name){ - if(name=='useCard') return (event.card.name=='sha'&&player.hasMark('twchuanshu_mark')); - if(name=='damageBegin1') return event.card&&event.card.twchuanshu_mark&&!player.getStorage('twchuanshu_effect').includes(event.player); - return event.card.twchuanshu_mark&&player.hasHistory('sourceDamage',function(evt){ - return evt.card==event.card; - })&&player.getStorage('twchuanshu_effect').filter(function(target){ - return target.isIn()&&target!=player; - }).length; + damage: { + charlotte: true, + trigger: { player: ["useCard", "useCardAfter"], source: "damageBegin1" }, + filter: function (event, player, name) { + if (name == "useCard") + return event.card.name == "sha" && player.hasMark("twchuanshu_mark"); + if (name == "damageBegin1") + return ( + event.card && + event.card.twchuanshu_mark && + !player.getStorage("twchuanshu_effect").includes(event.player) + ); + return ( + event.card.twchuanshu_mark && + player.hasHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }) && + player.getStorage("twchuanshu_effect").filter(function (target) { + return target.isIn() && target != player; + }).length + ); }, - forced:true, - content:function(){ - var name=event.triggername; - if(name=='useCard'){ - var num=player.countMark('twchuanshu_mark'); - trigger.card.twchuanshu_mark=num; - player.removeMark('twchuanshu_mark',num,false); - } - else if(name=='damageBegin1') trigger.num++; - else{ - var num1=trigger.card.twchuanshu_mark; - var num2=0; - player.getHistory('sourceDamage',function(evt){ - if(evt.card==trigger.card) num2+=evt.num; + forced: true, + content: function () { + var name = event.triggername; + if (name == "useCard") { + var num = player.countMark("twchuanshu_mark"); + trigger.card.twchuanshu_mark = num; + player.removeMark("twchuanshu_mark", num, false); + } else if (name == "damageBegin1") trigger.num++; + else { + var num1 = trigger.card.twchuanshu_mark; + var num2 = 0; + player.getHistory("sourceDamage", function (evt) { + if (evt.card == trigger.card) num2 += evt.num; }); - var targets=player.getStorage('twchuanshu_effect').filter(function(target){ - return target.isIn()&&target!=player; - }); - if(targets.length==1) targets[0].draw(num1*num2); - else game.asyncDraw(targets,num1*num2); + var targets = player + .getStorage("twchuanshu_effect") + .filter(function (target) { + return target.isIn() && target != player; + }); + if (targets.length == 1) targets[0].draw(num1 * num2); + else game.asyncDraw(targets, num1 * num2); } }, }, - clear:{ - charlotte:true, - onremove:true, - trigger:{player:'phaseBegin'}, - filter:function(event,player){ - return player.getStorage('twchuanshu_clear').length; + clear: { + charlotte: true, + onremove: true, + trigger: { player: "phaseBegin" }, + filter: function (event, player) { + return player.getStorage("twchuanshu_clear").length; }, - forced:true, - silent:true, - content:function(){ - 'step 0' - var targets=player.getStorage('twchuanshu_clear'); - for(var target of targets){ - target.unmarkAuto('twchuanshu_effect',[player]); - if(!target.getStorage('twchuanshu_effect').length) target.removeSkill('twchuanshu_effect'); + forced: true, + silent: true, + content: function () { + "step 0"; + var targets = player.getStorage("twchuanshu_clear"); + for (var target of targets) { + target.unmarkAuto("twchuanshu_effect", [player]); + if (!target.getStorage("twchuanshu_effect").length) + target.removeSkill("twchuanshu_effect"); } - 'step 1' - player.removeSkill('twchuanshu_clear'); + ("step 1"); + player.removeSkill("twchuanshu_clear"); }, }, }, }, //徐庶 - twjiange:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - filterCard:function(card,player){ - return get.type(card)!='basic'; + twjiange: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + filterCard: function (card, player) { + return get.type(card) != "basic"; }, - usable:1, - locked:false, - viewAs:{name:'sha',storage:{twjiange:true}}, - viewAsFilter:function(player){ - if(!player.countCards('hes',function(card){ - return get.type(card)!='basic'; - })) return false; + usable: 1, + locked: false, + viewAs: { name: "sha", storage: { twjiange: true } }, + viewAsFilter: function (player) { + if ( + !player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) + ) + return false; }, - position:'hes', - selectCard:function(){ - return _status.event.skill=='twjiange'?1:Infinity; + position: "hes", + selectCard: function () { + return _status.event.skill == "twjiange" ? 1 : Infinity; }, - precontent:function(){ - if(player!=_status.currentPhase){ - player.when({player:['useCard','respond']}) - .filter(evt=>evt.skill=='twjiange') - .then(()=>player.draw()); + precontent: function () { + if (player != _status.currentPhase) { + player + .when({ player: ["useCard", "respond"] }) + .filter((evt) => evt.skill == "twjiange") + .then(() => player.draw()); } - event.getParent().addCount=false; + event.getParent().addCount = false; }, - prompt:'将一张非基本牌当杀使用或打出', - check:function(card){ - var val=get.value(card); - if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); - return 6-val; + prompt: "将一张非基本牌当杀使用或打出", + check: function (card) { + var val = get.value(card); + if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); + return 6 - val; }, - ai:{ - order:function(item,player){ - var target=_status.currentPhase; - if(!target||target!=player) return 7; + ai: { + order: function (item, player) { + var target = _status.currentPhase; + if (!target || target != player) return 7; return 1; }, - respondSha:true, - skillTagFilter:function(player){ - if(!player.countCards('hes',function(card){ - return get.type(card)!='basic'; - })) return false; + respondSha: true, + skillTagFilter: function (player) { + if ( + !player.countCards("hes", function (card) { + return get.type(card) != "basic"; + }) + ) + return false; }, }, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.twjiange) return true; + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.twjiange) return true; }, - cardUsable:function(card,player,num){ - if(card.storage&&card.storage.twjiange) return Infinity; + cardUsable: function (card, player, num) { + if (card.storage && card.storage.twjiange) return Infinity; }, - } + }, }, - twxiawang:{ - audio:2, - trigger:{global:'damageEnd'}, - filter:function(event,player){ - if(!event.source||get.distance(player,event.player)>1||!player.canUse('sha',event.source,false,false)) return false; - return player.countCards('h')>0; + twxiawang: { + audio: 2, + trigger: { global: "damageEnd" }, + filter: function (event, player) { + if ( + !event.source || + get.distance(player, event.player) > 1 || + !player.canUse("sha", event.source, false, false) + ) + return false; + return player.countCards("h") > 0; }, - direct:true, - content:function(){ - player.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'侠望:是否对'+get.translation(trigger.source)+'使用一张杀?').set('logSkill','twxiawang').set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('sourcex',trigger.source); - player.addTempSkill('twxiawang_damage'); + direct: true, + content: function () { + player + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "侠望:是否对" + get.translation(trigger.source) + "使用一张杀?") + .set("logSkill", "twxiawang") + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if ( + target != _status.event.sourcex && + !ui.selected.targets.includes(_status.event.sourcex) + ) + return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("sourcex", trigger.source); + player.addTempSkill("twxiawang_damage"); }, - subSkill:{ - damage:{ - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - if(event.getParent(2).name!='twxiawang') return false; - if(!player.hasHistory('sourceDamage',evt=>evt.card==event.card)) return false; - for(var phase of lib.phaseName){ - var evt=event.getParent(phase); - if(evt&&evt.name==phase) return true; + subSkill: { + damage: { + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + if (event.getParent(2).name != "twxiawang") return false; + if (!player.hasHistory("sourceDamage", (evt) => evt.card == event.card)) + return false; + for (var phase of lib.phaseName) { + var evt = event.getParent(phase); + if (evt && evt.name == phase) return true; } return false; }, - content:function(){ - player.popup() - player.removeSkill('twjiange_damage'); - for(var phase of lib.phaseName){ - var evt=event.getParent(phase); - if(evt&&evt.name==phase){ - var name=['准备','判定','摸牌','出牌','弃牌','结束'][lib.phaseName.indexOf(phase)]; - game.log(player,'令',_status.currentPhase,'结束了'+name+'阶段'); - player.line(_status.currentPhase,'thunder'); - evt.skipped=true; + content: function () { + player.popup(); + player.removeSkill("twjiange_damage"); + for (var phase of lib.phaseName) { + var evt = event.getParent(phase); + if (evt && evt.name == phase) { + var name = ["准备", "判定", "摸牌", "出牌", "弃牌", "结束"][ + lib.phaseName.indexOf(phase) + ]; + game.log(player, "令", _status.currentPhase, "结束了" + name + "阶段"); + player.line(_status.currentPhase, "thunder"); + evt.skipped = true; } } - } - } + }, + }, }, }, //好萌 - twgongge:{ - audio:3, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - if(!event.isFirstTarget||!event.targets) return false; - return get.tag(event.card,'damage'); + twgongge: { + audio: 3, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget || !event.targets) return false; + return get.tag(event.card, "damage"); }, - direct:true, - usable:1, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twgongge'),function(card,player,target){ - var trigger=_status.event.getTrigger(); - return trigger.targets.includes(target); - }).set('ai',function(target){ - var player=_status.event.player; - var trigger=_status.event.getTrigger(); - var att=get.attitude(player,target); - var damageNum=trigger.getParent().baseDamage; - var map=trigger.getParent().customArgs,id=target.playerid; - if(map[id]){ - if(typeof map[id].baseDamage=='number') damageNum=map[id].baseDamage; - if(typeof map[id].extraDamage=='number') damageNum+=map[id].extraDamage; - } - if(target.hasSkillTag('filterDamage',null,{ - player:trigger.player, - card:trigger.card, - })) damageNum=1; - var num=target.getSkills(null,false,false).filter(function(skill){ - var info=get.info(skill); - return info&&!info.charlotte; - }).length+1; - var list=[0,0,0]; - var player=_status.event.player; - list[0]=num; - list[1]=(get.effect(target,{name:'guohe_copy2'},player,player)>0?((target.hp-damageNumget.damageEffect(target,player,player)?(Math.min(num-1,target.getDamagedHp())):(num-1))*2; - return Math.max.apply(Math,list); - }).set('yimie',function(trigger,player,target,damageNum){ - var hit=true; - var att=get.attitude(player,target); - if(get.type(trigger.card)=='trick'&&trigger.player.countCards('hs',{name:'wuxie'})) hit=false; - if(trigger.card.name=='huogong'&&trigger.player.countCards('h',function(card){ - var list=[]; - for(var i of player.getCards('h')) list.push(get.suit(i)); - return !list.includes(get.suit(card)); - })) hit=false; - var key; - switch (trigger.card.name){ - case 'sha':case 'wanjian':key=['shan']; break; - case 'juedou':case 'nanman':case 'jiedao':key=['sha']; break; - default:key=[]; break; - } - if(get.type(trigger.card)=='trick') key.push('wuxie'); - key.push('caochuan'); - var bool1=((get.recoverEffect(target,player,player)>0)?1:-1); - var bool2=(((att>0&&!hit)||(target.countCards('hs',{name:key})&&!trigger.getParent().directHit.includes(target)))?1:-1); - if(att<=0&&target.hp-damageNum>0) return false; - return bool1=bool2&&att!=0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twgongge',target); - var num=target.getSkills(null,false,false).filter(function(skill){ - var info=get.info(skill); - return info&&!info.charlotte; - }).length+1; - event.num=num; - var list=[]; - var choiceList=[ - '摸'+get.cnNumber(num)+'张牌,若'+get.translation(target)+'响应此牌,则你跳过下个摸牌阶段', - '弃置'+get.translation(target)+get.cnNumber(num)+'张牌,此牌结算完毕后,若'+get.translation(target)+'的体力值不小于你,你交给'+get.translation(target)+get.cnNumber(num-1)+'张牌', - '令此牌对'+get.translation(target)+'造成的伤害+'+(num-1)+',此伤害结算完成后,其回复等量的体力值' - ]; - list.push('摸牌'); - if(target.countDiscardableCards(player,'he')) list.push('拆牌'); - else choiceList[1]=''+choiceList[1]+''; - list.push('加伤'); - player.chooseControl(list).set('prompt','攻阁:请选择一项('+get.translation(target)+'对应X值:'+(num-1)+')').set('ai',()=>_status.event.choice).set('choice',function(){ - var att=get.attitude(player,target); - var damageNum=trigger.getParent().baseDamage; - var map=trigger.getParent().customArgs,id=target.playerid; - if(map[id]){ - if(typeof map[id].baseDamage=='number') damageNum=map[id].baseDamage; - if(typeof map[id].extraDamage=='number') damageNum+=map[id].extraDamage; + direct: true, + usable: 1, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twgongge"), function (card, player, target) { + var trigger = _status.event.getTrigger(); + return trigger.targets.includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + var trigger = _status.event.getTrigger(); + var att = get.attitude(player, target); + var damageNum = trigger.getParent().baseDamage; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (map[id]) { + if (typeof map[id].baseDamage == "number") damageNum = map[id].baseDamage; + if (typeof map[id].extraDamage == "number") damageNum += map[id].extraDamage; } - if(target.hasSkillTag('filterDamage',null,{ - player:trigger.player, - card:trigger.card, - })) damageNum=1; - var yimie=function(){ - if(damageNum==1) return false; - var hit=true; - if(get.type(trigger.card)=='trick'&&trigger.player.countCards('hs',{name:'wuxie'})) hit=false; - if(trigger.card.name=='huogong'&&trigger.player.countCards('h',function(card){ - var list=[]; - for(var i of player.getCards('h')) list.push(get.suit(i)); + if ( + target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) + ) + damageNum = 1; + var num = + target.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + return info && !info.charlotte; + }).length + 1; + var list = [0, 0, 0]; + var player = _status.event.player; + list[0] = num; + list[1] = + get.effect(target, { name: "guohe_copy2" }, player, player) > 0 + ? target.hp - damageNum < player.hp + ? num + : num - Math.min(player.getCards("he"), num - 1) + : 0; + if (_status.event.yimie(trigger, player, target, damageNum)) + list[2] = + (get.recoverEffect(target, player, player) > + get.damageEffect(target, player, player) + ? Math.min(num - 1, target.getDamagedHp()) + : num - 1) * 2; + return Math.max.apply(Math, list); + }) + .set("yimie", function (trigger, player, target, damageNum) { + var hit = true; + var att = get.attitude(player, target); + if ( + get.type(trigger.card) == "trick" && + trigger.player.countCards("hs", { name: "wuxie" }) + ) + hit = false; + if ( + trigger.card.name == "huogong" && + trigger.player.countCards("h", function (card) { + var list = []; + for (var i of player.getCards("h")) list.push(get.suit(i)); return !list.includes(get.suit(card)); - })) hit=false; - var key; - switch (trigger.card.name){ - case 'sha':case 'wanjian':key=['shan']; break; - case 'juedou':case 'nanman':case 'jiedao':key=['sha']; break; - default:key=[]; break; - } - key.push('caochuan'); - var bool1=((get.recoverEffect(target,player,player)>0)?1:-1); - var bool2=(((att>0&&!hit)||(target.countCards('hs',{name:key})&&!trigger.getParent().directHit.includes(target)))?1:-1); - if(att<=0&&target.hp-damageNum>0) return false; - return bool1=bool2&&att!=0; - }; - if(yimie()) return '加伤'; - if(list.includes('拆牌')&&get.effect(target,{name:'guohe_copy2'},player,player)>0&&target.hp-damageNum 0 ? 1 : -1; + var bool2 = + (att > 0 && !hit) || + (target.countCards("hs", { name: key }) && + !trigger.getParent().directHit.includes(target)) + ? 1 + : -1; + if (att <= 0 && target.hp - damageNum > 0) return false; + return (bool1 = bool2 && att != 0); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twgongge", target); + var num = + target.getSkills(null, false, false).filter(function (skill) { + var info = get.info(skill); + return info && !info.charlotte; + }).length + 1; + event.num = num; + var list = []; + var choiceList = [ + "摸" + + get.cnNumber(num) + + "张牌,若" + + get.translation(target) + + "响应此牌,则你跳过下个摸牌阶段", + "弃置" + + get.translation(target) + + get.cnNumber(num) + + "张牌,此牌结算完毕后,若" + + get.translation(target) + + "的体力值不小于你,你交给" + + get.translation(target) + + get.cnNumber(num - 1) + + "张牌", + "令此牌对" + + get.translation(target) + + "造成的伤害+" + + (num - 1) + + ",此伤害结算完成后,其回复等量的体力值", + ]; + list.push("摸牌"); + if (target.countDiscardableCards(player, "he")) list.push("拆牌"); + else choiceList[1] = '' + choiceList[1] + ""; + list.push("加伤"); + player + .chooseControl(list) + .set( + "prompt", + "攻阁:请选择一项(" + + get.translation(target) + + "对应X值:" + + (num - 1) + + ")" + ) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var att = get.attitude(player, target); + var damageNum = trigger.getParent().baseDamage; + var map = trigger.getParent().customArgs, + id = target.playerid; + if (map[id]) { + if (typeof map[id].baseDamage == "number") + damageNum = map[id].baseDamage; + if (typeof map[id].extraDamage == "number") + damageNum += map[id].extraDamage; + } + if ( + target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) + ) + damageNum = 1; + var yimie = function () { + if (damageNum == 1) return false; + var hit = true; + if ( + get.type(trigger.card) == "trick" && + trigger.player.countCards("hs", { name: "wuxie" }) + ) + hit = false; + if ( + trigger.card.name == "huogong" && + trigger.player.countCards("h", function (card) { + var list = []; + for (var i of player.getCards("h")) list.push(get.suit(i)); + return !list.includes(get.suit(card)); + }) + ) + hit = false; + var key; + switch (trigger.card.name) { + case "sha": + case "wanjian": + key = ["shan"]; + break; + case "juedou": + case "nanman": + case "jiedao": + key = ["sha"]; + break; + default: + key = []; + break; + } + key.push("caochuan"); + var bool1 = get.recoverEffect(target, player, player) > 0 ? 1 : -1; + var bool2 = + (att > 0 && !hit) || + (target.countCards("hs", { name: key }) && + !trigger.getParent().directHit.includes(target)) + ? 1 + : -1; + if (att <= 0 && target.hp - damageNum > 0) return false; + return (bool1 = bool2 && att != 0); + }; + if (yimie()) return "加伤"; + if ( + list.includes("拆牌") && + get.effect(target, { name: "guohe_copy2" }, player, player) > 0 && + target.hp - damageNum < player.hp + ) + return "拆牌"; + return "摸牌"; + })() + ) + .set("choiceList", choiceList); + } else { player.storage.counttrigger.twgongge--; event.finish(); } - 'step 2' - game.log(player,'选择了','#y'+result.control); - switch(result.control){ - case '摸牌': + ("step 2"); + game.log(player, "选择了", "#y" + result.control); + switch (result.control) { + case "摸牌": player.draw(num); - player.addTempSkill('twgongge_buff1'); - var evt={ - card:trigger.card, - target:target, + player.addTempSkill("twgongge_buff1"); + var evt = { + card: trigger.card, + target: target, }; - player.storage.twgongge_buff1=evt; + player.storage.twgongge_buff1 = evt; break; - case '拆牌': - player.discardPlayerCard(num,target,'he',true); - player.addTempSkill('twgongge_buff2'); - var evt={ - card:trigger.card, - target:target, - num:num-1, + case "拆牌": + player.discardPlayerCard(num, target, "he", true); + player.addTempSkill("twgongge_buff2"); + var evt = { + card: trigger.card, + target: target, + num: num - 1, }; - player.storage.twgongge_buff2=evt; + player.storage.twgongge_buff2 = evt; break; - case '加伤': - player.addTempSkill('twgongge_buff3'); - var evt={ - card:trigger.card, - target:target, - num:num-1, + case "加伤": + player.addTempSkill("twgongge_buff3"); + var evt = { + card: trigger.card, + target: target, + num: num - 1, }; - player.storage.twgongge_buff3=evt; + player.storage.twgongge_buff3 = evt; break; } }, - subSkill:{ + subSkill: { //摸牌后续 - buff1:{ - charlotte:true, - onremove:true, - trigger:{global:['useCard','respond']}, - filter:function(event,player){ - if(player.skipList.includes('phaseDraw')) return false; - if(!Array.isArray(event.respondTo)||player!=event.respondTo[0]) return false; - var evt=player.storage.twgongge_buff1; - if(evt.target==event.player&&evt.card==event.respondTo[1]) return true; + buff1: { + charlotte: true, + onremove: true, + trigger: { global: ["useCard", "respond"] }, + filter: function (event, player) { + if (player.skipList.includes("phaseDraw")) return false; + if (!Array.isArray(event.respondTo) || player != event.respondTo[0]) return false; + var evt = player.storage.twgongge_buff1; + if (evt.target == event.player && evt.card == event.respondTo[1]) return true; return false; }, - direct:true, - popup:false, - content:function(){ - player.skip('phaseDraw'); - game.log(player,'跳过了下个','#g摸牌阶段'); - player.addTempSkill('twgongge_buff1_mark','phaseDrawSkipped'); + direct: true, + popup: false, + content: function () { + player.skip("phaseDraw"); + game.log(player, "跳过了下个", "#g摸牌阶段"); + player.addTempSkill("twgongge_buff1_mark", "phaseDrawSkipped"); }, }, //拆牌后续 - buff2:{ - charlotte:true, - onremove:true, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - if(!player.countCards('he')) return false; - var evt=player.storage.twgongge_buff2; - if(evt.card==event.card&&evt.target.isIn()&&evt.target.hp>=player.hp) return true; + buff2: { + charlotte: true, + onremove: true, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if (!player.countCards("he")) return false; + var evt = player.storage.twgongge_buff2; + if (evt.card == event.card && evt.target.isIn() && evt.target.hp >= player.hp) + return true; return false; }, - direct:true, - popup:false, - content:function(){ - 'step 0' - var evt=player.storage.twgongge_buff2; - var target=evt.target,num=evt.num; - event.target=target; - if(player.countCards('he')<=num) event._result={bool:true,cards:player.getCards('he')}; - else player.chooseCard('he',num,'攻阁:交给'+get.translation(target)+get.cnNumber(num)+'张牌',true); - 'step 1' - if(result.bool) player.give(result.cards,target); + direct: true, + popup: false, + content: function () { + "step 0"; + var evt = player.storage.twgongge_buff2; + var target = evt.target, + num = evt.num; + event.target = target; + if (player.countCards("he") <= num) + event._result = { bool: true, cards: player.getCards("he") }; + else + player.chooseCard( + "he", + num, + "攻阁:交给" + get.translation(target) + get.cnNumber(num) + "张牌", + true + ); + ("step 1"); + if (result.bool) player.give(result.cards, target); }, }, //加伤后续 - buff3:{ - charlotte:true, - onremove:true, - trigger:{source:'damageBegin1',player:'useCardAfter'}, - filter:function(event,player){ - if(!event.card) return false; - var evt=player.storage.twgongge_buff3; - if(evt.card==event.card&&evt.target.isIn()&&(event.name=='useCard'||event.player==evt.target)) return true; + buff3: { + charlotte: true, + onremove: true, + trigger: { source: "damageBegin1", player: "useCardAfter" }, + filter: function (event, player) { + if (!event.card) return false; + var evt = player.storage.twgongge_buff3; + if ( + evt.card == event.card && + evt.target.isIn() && + (event.name == "useCard" || event.player == evt.target) + ) + return true; return false; }, - direct:true, - popup:false, - content:function(){ - var evt=player.storage.twgongge_buff3; - if(trigger.name=='damage') trigger.num+=evt.num; - else if(evt.target.isIn()) evt.target.recover(evt.num); + direct: true, + popup: false, + content: function () { + var evt = player.storage.twgongge_buff3; + if (trigger.name == "damage") trigger.num += evt.num; + else if (evt.target.isIn()) evt.target.recover(evt.num); }, }, - buff1_mark:{ - mark:true, - intro:{ - content:'跳过下一个摸牌阶段', + buff1_mark: { + mark: true, + intro: { + content: "跳过下一个摸牌阶段", }, - } + }, }, }, //魏续 - twsuizheng:{ - audio:3, - trigger:{global:'phaseBefore',player:'enterGame'}, - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); + twsuizheng: { + audio: 3, + trigger: { global: "phaseBefore", player: "enterGame" }, + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); }, - forced:true, - content:function(){ - 'step 0' - player.chooseTarget('请选择【随征】的目标',lib.translate.twsuizheng_info,lib.filter.notMe,true).set('ai',function(target){ - var player=_status.event.player; - return Math.max(1+get.attitude(player,target)*get.threaten(target),Math.random()); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; + forced: true, + content: function () { + "step 0"; + player + .chooseTarget( + "请选择【随征】的目标", + lib.translate.twsuizheng_info, + lib.filter.notMe, + true + ) + .set("ai", function (target) { + var player = _status.event.player; + return Math.max( + 1 + get.attitude(player, target) * get.threaten(target), + Math.random() + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - game.log(player,'选择了',target,'作为','“随征”角色'); - player.markAuto('twsuizheng',[target]); - player.addSkill('twsuizheng_draw'); - player.addSkill('twsuizheng_xianfu'); + game.log(player, "选择了", target, "作为", "“随征”角色"); + player.markAuto("twsuizheng", [target]); + player.addSkill("twsuizheng_draw"); + player.addSkill("twsuizheng_xianfu"); } }, - ai:{expose:0.3}, - intro:{content:'已选择$为“随征”角色'}, - subSkill:{ - draw:{ - charlotte:true, - audio:'twsuizheng', - trigger:{global:'damageSource'}, - filter:function(event,player){ - return player.getStorage('twsuizheng').includes(event.source); + ai: { expose: 0.3 }, + intro: { content: "已选择$为“随征”角色" }, + subSkill: { + draw: { + charlotte: true, + audio: "twsuizheng", + trigger: { global: "damageSource" }, + filter: function (event, player) { + return player.getStorage("twsuizheng").includes(event.source); }, - forced:true, - logTarget:'source', - content:function(){ + forced: true, + logTarget: "source", + content: function () { player.draw(); }, }, - xianfu:{ - audio:'twsuizheng', - trigger:{global:'damageEnd'}, - filter:function(event,player){ - return player.getStorage('twsuizheng').includes(event.player)&&event.player.isIn(); + xianfu: { + audio: "twsuizheng", + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return ( + player.getStorage("twsuizheng").includes(event.player) && event.player.isIn() + ); }, - forced:true, - charlotte:true, - logTarget:'player', - content:function(){ - 'step 0' - player.chooseToDiscard(2,'随征:弃置两张基本牌','若你弃牌,你令'+get.translation(trigger.player)+'回复1点体力;或点击“取消”失去1点体力,令'+get.translation(trigger.player)+'获得一张【杀】或【决斗】',{type:'basic'}).set('ai',function(card){ - if(_status.event.refuse) return -1; - return 6-get.value(card); - }).set('refuse',get.attitude(player,trigger.player)<=0||get.effect(player,{name:'losehp'})>=0); - 'step 1' - if(result.bool) trigger.player.recover(); + forced: true, + charlotte: true, + logTarget: "player", + content: function () { + "step 0"; + player + .chooseToDiscard( + 2, + "随征:弃置两张基本牌", + "若你弃牌,你令" + + get.translation(trigger.player) + + "回复1点体力;或点击“取消”失去1点体力,令" + + get.translation(trigger.player) + + "获得一张【杀】或【决斗】", + { type: "basic" } + ) + .set("ai", function (card) { + if (_status.event.refuse) return -1; + return 6 - get.value(card); + }) + .set( + "refuse", + get.attitude(player, trigger.player) <= 0 || + get.effect(player, { name: "losehp" }) >= 0 + ); + ("step 1"); + if (result.bool) trigger.player.recover(); else { player.loseHp(); - var card=get.cardPile(function(card){ - return card.name=='sha'||card.name=='juedou'; + var card = get.cardPile(function (card) { + return card.name == "sha" || card.name == "juedou"; }); - if(card) trigger.player.gain(card,'gain2'); + if (card) trigger.player.gain(card, "gain2"); } }, }, }, }, - twtuidao:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - var targets=player.getStorage('twsuizheng'); - if(!targets.length) return false; - return targets.some(target=>target.hp<=2||!target.isIn()); + twtuidao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + var targets = player.getStorage("twsuizheng"); + if (!targets.length) return false; + return targets.some((target) => target.hp <= 2 || !target.isIn()); }, - check:function(event,player){ - var targets=player.getStorage('twsuizheng'); - var val=0; - for(var target of targets){ - if(target.hp<=2&&target.isIn()) val-=get.attitude(player,target); - else if(!target.isIn()) val+=6; + check: function (event, player) { + var targets = player.getStorage("twsuizheng"); + var val = 0; + for (var target of targets) { + if (target.hp <= 2 && target.isIn()) val -= get.attitude(player, target); + else if (!target.isIn()) val += 6; } - return val>0; + return val > 0; }, - limited:true, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - 'step 0' - player.awakenSkill('twtuidao'); - var list1=['equip3','equip4'].map(i=>get.translation(i)),list2=['basic','trick','equip'].map(i=>get.translation(i)); - var targets=player.getStorage('twsuizheng'),str=get.translation(targets); - if(targets.length) str='与'+str; - player.chooseButton(2,true,[ - '颓盗:废除你'+str+'的一个坐骑栏废除并选择一个类别', - '坐骑栏', - [list1,'tdnodes'], - '类别', - [list2,'tdnodes'], - ]).set('filterButton',function(button){ - var list=_status.event.list,link=button.link; - if(ui.selected.buttons.length){ - if(list.includes(ui.selected.buttons[0].link)&&list.includes(link)) return false; - if(!list.includes(ui.selected.buttons[0].link)&&!list.includes(link)) return false; - } - return true; - }).set('ai',function(button){ - var player=_status.event.player; - var list=_status.event.list,link=button.link; - if(list.includes(link)){ - if(player.hasDisabledSlot(4)) return '攻击马'; - if(player.hasDisabledSlot(3)) return '防御马'; - return '攻击马'; - } - if(!list.includes(link)){ - var player=_status.event.player; - var targets=player.getStorage('twsuizheng'); - for(var target of targets){ - if(target.isIn()){ - var listx=[0,0,0],list2=['basic','trick','equip'].map(i=>get.translation(i)); - for(var i of target.getCards('he')) listx[list2.indexOf(get.translation(get.type2(i)))]++; - return list2[listx.indexOf(Math.max.apply(Math,listx))]; - } + limited: true, + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + player.awakenSkill("twtuidao"); + var list1 = ["equip3", "equip4"].map((i) => get.translation(i)), + list2 = ["basic", "trick", "equip"].map((i) => get.translation(i)); + var targets = player.getStorage("twsuizheng"), + str = get.translation(targets); + if (targets.length) str = "与" + str; + player + .chooseButton(2, true, [ + "颓盗:废除你" + str + "的一个坐骑栏废除并选择一个类别", + "坐骑栏", + [list1, "tdnodes"], + "类别", + [list2, "tdnodes"], + ]) + .set("filterButton", function (button) { + var list = _status.event.list, + link = button.link; + if (ui.selected.buttons.length) { + if (list.includes(ui.selected.buttons[0].link) && list.includes(link)) + return false; + if (!list.includes(ui.selected.buttons[0].link) && !list.includes(link)) + return false; } - return 1+Math.random(); - } - }).set('list',list1); - 'step 1' - if(result.links[0].indexOf('马')==-1) result.links.reverse(); - var subtype=result.links[0]=='防御马'?'equip3':'equip4',type={基本:'basic',锦囊:'trick',装备:'equip'}[result.links[1]]; + return true; + }) + .set("ai", function (button) { + var player = _status.event.player; + var list = _status.event.list, + link = button.link; + if (list.includes(link)) { + if (player.hasDisabledSlot(4)) return "攻击马"; + if (player.hasDisabledSlot(3)) return "防御马"; + return "攻击马"; + } + if (!list.includes(link)) { + var player = _status.event.player; + var targets = player.getStorage("twsuizheng"); + for (var target of targets) { + if (target.isIn()) { + var listx = [0, 0, 0], + list2 = ["basic", "trick", "equip"].map((i) => + get.translation(i) + ); + for (var i of target.getCards("he")) + listx[list2.indexOf(get.translation(get.type2(i)))]++; + return list2[listx.indexOf(Math.max.apply(Math, listx))]; + } + } + return 1 + Math.random(); + } + }) + .set("list", list1); + ("step 1"); + if (result.links[0].indexOf("马") == -1) result.links.reverse(); + var subtype = result.links[0] == "防御马" ? "equip3" : "equip4", + type = { 基本: "basic", 锦囊: "trick", 装备: "equip" }[result.links[1]]; player.disableEquip(subtype); - var targets=player.getStorage('twsuizheng') - for(var target of targets){ - if(target&&target.isIn()){ + var targets = player.getStorage("twsuizheng"); + for (var target of targets) { + if (target && target.isIn()) { target.disableEquip(subtype); - var cards=target.getCards('he',card=>get.type2(card)==type); - player.gain(cards,target,'give'); - event.gainners=cards; - } - else{ - var cards=[]; - for(var i=1; i<=2; i++){ - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&get.type2(card)==type; + var cards = target.getCards("he", (card) => get.type2(card) == type); + player.gain(cards, target, "give"); + event.gainners = cards; + } else { + var cards = []; + for (var i = 1; i <= 2; i++) { + var card = get.cardPile2(function (card) { + return !cards.includes(card) && get.type2(card) == type; }); - if(card) cards.push(card); + if (card) cards.push(card); else break; } - player.gain(cards,'gain2'); - event.gainners=cards; + player.gain(cards, "gain2"); + event.gainners = cards; } } - 'step 2' - player.chooseTarget('请重新选择【随征】目标',true,function(card,player,target){ - return !player.getStorage('twsuizheng').includes(target); - }).set('ai',function(target){ - var player=_status.event.player; - return Math.max(1+get.attitude(player,target)*get.threaten(target),Math.random()); - }); - 'step 3' - if(result.bool){ - var target=result.targets[0]; + ("step 2"); + player + .chooseTarget("请重新选择【随征】目标", true, function (card, player, target) { + return !player.getStorage("twsuizheng").includes(target); + }) + .set("ai", function (target) { + var player = _status.event.player; + return Math.max( + 1 + get.attitude(player, target) * get.threaten(target), + Math.random() + ); + }); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - game.log(player,'选择了',target,'作为','“随征”角色'); - delete player.storage.twsuizheng - player.markAuto('twsuizheng',[target]); + game.log(player, "选择了", target, "作为", "“随征”角色"); + delete player.storage.twsuizheng; + player.markAuto("twsuizheng", [target]); } }, - ai:{combo:'twsuizheng'}, + ai: { combo: "twsuizheng" }, }, //曹休 - twqianju:{ - audio:2, - trigger:{source:'damageSource'}, - filter:function(event,player){ - return get.distance(player,event.player)<=1&&player.countCards('e')<5; + twqianju: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + return get.distance(player, event.player) <= 1 && player.countCards("e") < 5; }, - forced:true, - usable:1, - content:function(){ - var card=get.cardPile(function(card){ - return get.type(card)=='equip'&&player.canEquip(card); + forced: true, + usable: 1, + content: function () { + var card = get.cardPile(function (card) { + return get.type(card) == "equip" && player.canEquip(card); }); - if(card){ + if (card) { player.$gain2(card); game.delayx(); player.equip(card); } }, - mod:{ - globalFrom:function(from,to,distance){ - return distance-from.countCards('e'); + mod: { + globalFrom: function (from, to, distance) { + return distance - from.countCards("e"); }, }, }, - twqingxi:{ - audio:'xinqingxi', - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'&&player.getHistory('useCard',evt=>evt.card.name=='sha').indexOf(event.getParent())==0; + twqingxi: { + audio: "xinqingxi", + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + player + .getHistory("useCard", (evt) => evt.card.name == "sha") + .indexOf(event.getParent()) == 0 + ); }, - check:function(event,player){ + check: function (event, player) { return true; }, - logTarget:'target', - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - if(!target.countCards('e')) event._result={index:0}; - else target.chooseControl().set('ai',function(){ - if(_status.event.goon||player.hp>2) return 0; - return 1; - }).set('choiceList',[ - '令'+get.translation(player)+'摸'+get.cnNumber(Math.max(1,player.countCards('e')))+'张牌,且此【杀】不可被响应', - '弃置装备区中的所有牌并弃置'+get.translation(player)+'装备区等量的牌,此【杀】造成的伤害+1' - ]).set('goon',get.attitude(target,player)>0); - 'step 1' - if(result.index==0){ - player.draw(Math.max(1,player.countCards('e'))); + logTarget: "target", + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + if (!target.countCards("e")) event._result = { index: 0 }; + else + target + .chooseControl() + .set("ai", function () { + if (_status.event.goon || player.hp > 2) return 0; + return 1; + }) + .set("choiceList", [ + "令" + + get.translation(player) + + "摸" + + get.cnNumber(Math.max(1, player.countCards("e"))) + + "张牌,且此【杀】不可被响应", + "弃置装备区中的所有牌并弃置" + + get.translation(player) + + "装备区等量的牌,此【杀】造成的伤害+1", + ]) + .set("goon", get.attitude(target, player) > 0); + ("step 1"); + if (result.index == 0) { + player.draw(Math.max(1, player.countCards("e"))); trigger.getParent().directHit.add(target); - game.log(trigger.card,'不可被',target,'响应'); + game.log(trigger.card, "不可被", target, "响应"); event.finish(); + } else { + var num = target.countCards("e"); + target.discard(target.getCards("e")); + target.discardPlayerCard(player, "e", num, true); } - else{ - var num=target.countCards('e'); - target.discard(target.getCards('e')); - target.discardPlayerCard(player,'e',num,true); - } - 'step 2' - var map=trigger.customArgs; - var id=target.playerid; - if(!map[id]) map[id]={}; - if(!map[id].extraDamage) map[id].extraDamage=0; + ("step 2"); + var map = trigger.customArgs; + var id = target.playerid; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; map[id].extraDamage++; - game.log(trigger.card,'对',target,'造成的伤害+1'); + game.log(trigger.card, "对", target, "造成的伤害+1"); game.delayx(); }, }, //孙翊 - twzaoli:{ - audio:'zaoli', - trigger:{player:'phaseUseBegin'}, - init:function(player){ - if(player.isPhaseUsing()){ - var hs=player.getCards('h'); - player.getHistory('gain',function(evt){ + twzaoli: { + audio: "zaoli", + trigger: { player: "phaseUseBegin" }, + init: function (player) { + if (player.isPhaseUsing()) { + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { hs.removeArray(evt.cards); }); - if(hs.length) player.addGaintag(hs,'twzaoli'); + if (hs.length) player.addGaintag(hs, "twzaoli"); } }, - filter:function(event,player){ - return player.countCards('he'); + filter: function (event, player) { + return player.countCards("he"); }, - forced:true, - group:'twzaoli_mark', - content:function(){ - 'step 0' - if(player.countCards('h',card=>get.type(card)!='equip')){ - player.chooseCard('h',[1,Infinity],true,'躁厉:请选择至少一张非装备手牌,你弃置这些牌和所有装备牌',(card,player)=>{ - return get.type(card)!='equip'&&lib.filter.cardDiscardable(card,player,'twzaoli'); - }).set('ai',function(card){ - if(!card.hasGaintag('twzaoli_temp')) return 5-get.value(card); - return 1; - }); - } - 'step 1' - var cards=player.getCards('he',{type:'equip'}); - var subtype=[]; - event.subtype=subtype.addArray(cards.map(card=>get.subtype(card))); - cards.addArray(result.cards||[]); - if(cards.length) player.discard(cards); - event.cards=cards; - 'step 2' - player.draw(cards.length); - 'step 3' - var num=0; - if(event.subtype.length){ - for(var i of event.subtype){ - var card=get.cardPile2(function(card){ - return get.type(card)=='equip'&&get.subtype(card)==i; + forced: true, + group: "twzaoli_mark", + content: function () { + "step 0"; + if (player.countCards("h", (card) => get.type(card) != "equip")) { + player + .chooseCard( + "h", + [1, Infinity], + true, + "躁厉:请选择至少一张非装备手牌,你弃置这些牌和所有装备牌", + (card, player) => { + return ( + get.type(card) != "equip" && + lib.filter.cardDiscardable(card, player, "twzaoli") + ); + } + ) + .set("ai", function (card) { + if (!card.hasGaintag("twzaoli_temp")) return 5 - get.value(card); + return 1; }); - if(card){ + } + ("step 1"); + var cards = player.getCards("he", { type: "equip" }); + var subtype = []; + event.subtype = subtype.addArray(cards.map((card) => get.subtype(card))); + cards.addArray(result.cards || []); + if (cards.length) player.discard(cards); + event.cards = cards; + ("step 2"); + player.draw(cards.length); + ("step 3"); + var num = 0; + if (event.subtype.length) { + for (var i of event.subtype) { + var card = get.cardPile2(function (card) { + return get.type(card) == "equip" && get.subtype(card) == i; + }); + if (card) { num++; player.$gain2(card); game.delayx(); @@ -11048,1519 +13966,1892 @@ game.import('character', function () { } } } - if(num<=2) event.finish(); - 'step 4' + if (num <= 2) event.finish(); + ("step 4"); player.loseHp(); }, - onremove:function(player){ - player.removeGaintag('twzaoli'); + onremove: function (player) { + player.removeGaintag("twzaoli"); }, - mod:{ - cardEnabled2:function(card,player){ - if(player.isPhaseUsing()&&get.itemtype(card)=='card'&&card.hasGaintag('twzaoli')) return false; + mod: { + cardEnabled2: function (card, player) { + if ( + player.isPhaseUsing() && + get.itemtype(card) == "card" && + card.hasGaintag("twzaoli") + ) + return false; }, }, - subSkill:{ - mark:{ - trigger:{player:['phaseUseBegin','phaseUseAfter','phaseAfter']}, - filter:function(event,player){ - return player.countCards('h'); + subSkill: { + mark: { + trigger: { player: ["phaseUseBegin", "phaseUseAfter", "phaseAfter"] }, + filter: function (event, player) { + return player.countCards("h"); }, - direct:true, - firstDo:true, - content:function(){ - if(event.triggername=='phaseUseBegin'){ - var hs=player.getCards('h'); - player.getHistory('gain',function(evt){ + direct: true, + firstDo: true, + content: function () { + if (event.triggername == "phaseUseBegin") { + var hs = player.getCards("h"); + player.getHistory("gain", function (evt) { hs.removeArray(evt.cards); }); - if(hs.length) player.addGaintag(hs,'twzaoli'); - } - else{ - player.removeGaintag('twzaoli'); + if (hs.length) player.addGaintag(hs, "twzaoli"); + } else { + player.removeGaintag("twzaoli"); } }, - } + }, }, }, //邓芝 - twjimeng:{ - audio:'jimeng', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countGainableCards(player,'he')>0; - }) + twjimeng: { + audio: "jimeng", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.countGainableCards(player, "he") > 0; + }); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countGainableCards(player,'hej')>0; + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "hej") > 0; }, - content:function(){ - 'step 0' - player.gainPlayerCard(target,'hej',true); - 'step 1' - var hs=player.getCards('he'); - if(hs.length){ - if(hs.length==1) event._result={bool:true,cards:hs}; - else player.chooseCard(true,'交给'+get.translation(target)+'一张牌','he',true); - } - else event.finish(); - 'step 2' - player.give(result.cards,target); - 'step 3' - if(target.hp>=player.hp) player.draw(); + content: function () { + "step 0"; + player.gainPlayerCard(target, "hej", true); + ("step 1"); + var hs = player.getCards("he"); + if (hs.length) { + if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard(true, "交给" + get.translation(target) + "一张牌", "he", true); + } else event.finish(); + ("step 2"); + player.give(result.cards, target); + ("step 3"); + if (target.hp >= player.hp) player.draw(); }, - ai:{ - order:8, - result:{ - player:function(player,target){ - if(target.hp>=player.hp) return 1; + ai: { + order: 8, + result: { + player: function (player, target) { + if (target.hp >= player.hp) return 1; return 0; }, - target:function(player,target){ - return get.effect(target,{name:'shunshou'},player,target)/10; - } - } - } + target: function (player, target) { + return get.effect(target, { name: "shunshou" }, player, target) / 10; + }, + }, + }, }, //杨仪 - twgongsun:{ - audio:'gongsun', - trigger:{player:'phaseUseBegin'}, - forced:true, - direct:true, - filter:function(event,player){ - return game.hasPlayer(current=>player.inRange(current)); + twgongsun: { + audio: "gongsun", + trigger: { player: "phaseUseBegin" }, + forced: true, + direct: true, + filter: function (event, player) { + return game.hasPlayer((current) => player.inRange(current)); }, - content:function(){ - 'step 0' - player.chooseTarget('共损:请选择一名攻击范围内的角色',lib.translate.twgongsun_info,true,function(card,player,target){ - return player!=target&&player.inRange(target); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)*(1+target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twgongsun',target); - player.addTempSkill('twgongsun_shadow',{player:['phaseBegin','die']}); - player.chooseControl(lib.suit).set('prompt','共损:请选择一个花色').set('ai',function(button){ - return lib.suit.randomGet(); + content: function () { + "step 0"; + player + .chooseTarget( + "共损:请选择一名攻击范围内的角色", + lib.translate.twgongsun_info, + true, + function (card, player, target) { + return player != target && player.inRange(target); + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) * (1 + target.countCards("h")); }); - } - else event.finish(); - 'step 2' - var suit=result.control; - player.popup(suit+2,'soil'); - game.log(player,'选择了',suit+2); - player.storage.twgongsun_shadow.push([target,suit]); - player.markSkill('twgongsun_shadow'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twgongsun", target); + player.addTempSkill("twgongsun_shadow", { player: ["phaseBegin", "die"] }); + player + .chooseControl(lib.suit) + .set("prompt", "共损:请选择一个花色") + .set("ai", function (button) { + return lib.suit.randomGet(); + }); + } else event.finish(); + ("step 2"); + var suit = result.control; + player.popup(suit + 2, "soil"); + game.log(player, "选择了", suit + 2); + player.storage.twgongsun_shadow.push([target, suit]); + player.markSkill("twgongsun_shadow"); }, }, - twgongsun_shadow:{ - global:'twgongsun_shadow2', - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + twgongsun_shadow: { + global: "twgongsun_shadow2", + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - marktext:'损', - onremove:true, - intro:{ - content:function(shadow){ - var str=''; - for(var i=0;i0) str+='
    ' - str+=get.translation(shadow[i][0]); - str+=':'; - str+=get.translation(shadow[i][1]); + marktext: "损", + onremove: true, + intro: { + content: function (shadow) { + var str = ""; + for (var i = 0; i < shadow.length; i++) { + if (i > 0) str += "
    "; + str += get.translation(shadow[i][0]); + str += ":"; + str += get.translation(shadow[i][1]); } return str; }, }, - mod:{ - cardEnabled:function(card,player){ - var list=player.storage.twgongsun_shadow; - for(var i=0;iMath.random()<=0.5?0:1); - 'step 1' - player.addSkill('twzhengjian_eff'+result.index); - game.log(player,'获得了','#g【征建】','的','#y效果'+get.cnNumber(result.index+1,true)); + content: function () { + "step 0"; + player + .chooseControl() + .set("prompt", "征建:请选择一种效果") + .set("choiceList", [ + "令“出牌阶段内未使用过非基本牌”的其他角色受到惩罚", + "令“出牌阶段内未得到过牌”的其他角色受到惩罚", + ]) + .set("ai", () => (Math.random() <= 0.5 ? 0 : 1)); + ("step 1"); + player.addSkill("twzhengjian_eff" + result.index); + game.log( + player, + "获得了", + "#g【征建】", + "的", + "#y效果" + get.cnNumber(result.index + 1, true) + ); game.delayx(); }, - onremove:true, - subSkill:{ - eff0:{ - audio:'twzhengjian', - trigger:{global:'phaseUseEnd'}, - forced:true, - charlotte:true, - marktext:'建', - mark:true, - filter:function(event,player){ - if(event.player==player||event._twzhengjian||!event.player.isIn()) return false; - if(event.player.hasHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==event&&get.type(evt.card)!='basic'; - })) return false; - return player.storage.twzhengjian||event.player.countCards('he')>0; + onremove: true, + subSkill: { + eff0: { + audio: "twzhengjian", + trigger: { global: "phaseUseEnd" }, + forced: true, + charlotte: true, + marktext: "建", + mark: true, + filter: function (event, player) { + if (event.player == player || event._twzhengjian || !event.player.isIn()) + return false; + if ( + event.player.hasHistory("useCard", function (evt) { + return ( + evt.getParent("phaseUse") == event && get.type(evt.card) != "basic" + ); + }) + ) + return false; + return player.storage.twzhengjian || event.player.countCards("he") > 0; }, - logTarget:'player', - content:function(){ - 'step 0' - trigger._twzhengjian=true; - var target=trigger.player; - event.target=target; - if(player.storage.twzhengjian){ - player.chooseBool('征建:是否对'+get.translation(target)+'造成1点伤害?').set('ai',()=>_status.event.goon).set('goon',get.damageEffect(target,player,_status.event.player)>0); + logTarget: "player", + content: function () { + "step 0"; + trigger._twzhengjian = true; + var target = trigger.player; + event.target = target; + if (player.storage.twzhengjian) { + player + .chooseBool("征建:是否对" + get.translation(target) + "造成1点伤害?") + .set("ai", () => _status.event.goon) + .set("goon", get.damageEffect(target, player, _status.event.player) > 0); + } else { + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); } - else{ - target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); + ("step 1"); + if (result.bool) { + if (result.cards && result.cards.length) { + target.give(result.cards, player).type = "twzhengjian"; + } else target.damage(); } - 'step 1' - if(result.bool){ - if(result.cards&&result.cards.length){ - target.give(result.cards,player).type='twzhengjian'; - } - else target.damage(); - } - player.chooseBool('是否变更【征建】的效果?').set('ai',()=>Math.random()>0.5); - 'step 2' - if(result.bool){ - player.removeSkill('twzhengjian_eff0'); - player.addSkill('twzhengjian_eff1'); - game.log(player,'将','#g【征建】','的效果变更为','#y效果二'); + player + .chooseBool("是否变更【征建】的效果?") + .set("ai", () => Math.random() > 0.5); + ("step 2"); + if (result.bool) { + player.removeSkill("twzhengjian_eff0"); + player.addSkill("twzhengjian_eff1"); + game.log(player, "将", "#g【征建】", "的效果变更为", "#y效果二"); } }, - intro:{ - content:function(storage,player){ - if(player.storage.twzhengjian) return '其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果二。'; - return '其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。'; + intro: { + content: function (storage, player) { + if (player.storage.twzhengjian) + return "其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果二。"; + return "其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。"; }, }, }, - eff1:{ - audio:'twzhengjian', - trigger:{global:'phaseUseEnd'}, - forced:true, - charlotte:true, - marktext:'征', - mark:true, - filter:function(event,player){ - if(event.player==player||event._twzhengjian||!event.player.isIn()) return false; - if(event.player.hasHistory('gain',function(evt){ - return evt.getParent('phaseUse')==event; - })) return false; - return player.storage.twzhengjian||event.player.countCards('he')>0; + eff1: { + audio: "twzhengjian", + trigger: { global: "phaseUseEnd" }, + forced: true, + charlotte: true, + marktext: "征", + mark: true, + filter: function (event, player) { + if (event.player == player || event._twzhengjian || !event.player.isIn()) + return false; + if ( + event.player.hasHistory("gain", function (evt) { + return evt.getParent("phaseUse") == event; + }) + ) + return false; + return player.storage.twzhengjian || event.player.countCards("he") > 0; }, - logTarget:'player', - content:function(){ - 'step 0' - trigger._twzhengjian=true; - var target=trigger.player; - event.target=target; - if(player.storage.twzhengjian){ - player.chooseBool('征建:是否对'+get.translation(target)+'造成1点伤害?').set('ai',()=>_status.event.goon).set('goon',get.damageEffect(target,player,_status.event.player)>0); + logTarget: "player", + content: function () { + "step 0"; + trigger._twzhengjian = true; + var target = trigger.player; + event.target = target; + if (player.storage.twzhengjian) { + player + .chooseBool("征建:是否对" + get.translation(target) + "造成1点伤害?") + .set("ai", () => _status.event.goon) + .set("goon", get.damageEffect(target, player, _status.event.player) > 0); + } else { + target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌"); } - else{ - target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); + ("step 1"); + if (result.bool) { + if (result.cards && result.cards.length) { + target.give(result.cards, player).type = "twzhengjian"; + } else target.damage(); } - 'step 1' - if(result.bool){ - if(result.cards&&result.cards.length){ - target.give(result.cards,player).type='twzhengjian'; - } - else target.damage(); - } - player.chooseBool('是否变更【征建】的效果?').set('ai',()=>Math.random()>0.5); - 'step 2' - if(result.bool){ - player.removeSkill('twzhengjian_eff1'); - player.addSkill('twzhengjian_eff0'); - game.log(player,'将','#g【征建】','的效果变更为','#y效果一'); + player + .chooseBool("是否变更【征建】的效果?") + .set("ai", () => Math.random() > 0.5); + ("step 2"); + if (result.bool) { + player.removeSkill("twzhengjian_eff1"); + player.addSkill("twzhengjian_eff0"); + game.log(player, "将", "#g【征建】", "的效果变更为", "#y效果一"); } }, - intro:{ - content:function(storage,player){ - if(player.storage.twzhengjian) return '其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果一。'; - return '其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。'; + intro: { + content: function (storage, player) { + if (player.storage.twzhengjian) + return "其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则你可对其造成1点伤害,然后你可失去此效果并获得〖征建〗的效果一。"; + return "其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。"; }, }, }, }, }, - twzhongchi:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + twzhongchi: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - forced:true, - skillAnimation:true, - animationColor:'wood', - filter:function(event,player){ - if(player.storage.twzhengjian||!player.hasSkill('twzhengjian',null,null,false)||!event.getg(player).length) return false; - var num1=game.countPlayer2(); - var list=[]; - player.getAllHistory('gain',function(evt){ - if(evt.type=='twzhengjian') list.add(evt.source); + forced: true, + skillAnimation: true, + animationColor: "wood", + filter: function (event, player) { + if ( + player.storage.twzhengjian || + !player.hasSkill("twzhengjian", null, null, false) || + !event.getg(player).length + ) + return false; + var num1 = game.countPlayer2(); + var list = []; + player.getAllHistory("gain", function (evt) { + if (evt.type == "twzhengjian") list.add(evt.source); }); - return list.length>=Math.ceil(num1/2); + return list.length >= Math.ceil(num1 / 2); }, - content:function(){ - 'step 0' - player.awakenSkill('twzhongchi'); - 'step 1' + content: function () { + "step 0"; + player.awakenSkill("twzhongchi"); + ("step 1"); player.recover(2); - player.addSkill('twzhongchi_effect'); - player.storage.twzhengjian=true; - 'step 2' + player.addSkill("twzhongchi_effect"); + player.storage.twzhengjian = true; + ("step 2"); game.delayx(); }, - subSkill:{ - effect:{ - mark:true, - marktext:'斥', - intro:{content:'受到渠道为【杀】的伤害+1'}, - trigger:{player:'damageBegin1'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'; + subSkill: { + effect: { + mark: true, + marktext: "斥", + intro: { content: "受到渠道为【杀】的伤害+1" }, + trigger: { player: "damageBegin1" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; }, - content:function(){ + content: function () { trigger.num++; }, }, }, - ai:{ - combo:'twzhengjian' - } + ai: { + combo: "twzhengjian", + }, }, //田豫 - twzhenxi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - var target=event.target; - return event.card.name=='sha'&&(target.countCards('h')>0||target.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card); - }) - },'e')||target.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canAddJudge(card); - }) - },'j')); + twzhenxi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + var target = event.target; + return ( + event.card.name == "sha" && + (target.countCards("h") > 0 || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }, "e") || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canAddJudge(card); + }); + }, "j")) + ); }, - usable:1, - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - var str=get.translation(target); - var list=[ - '弃置'+str+'的'+get.cnNumber(get.distance(player,target))+'张手牌', - '将'+str+'装备区或判定区内的一张牌移动到另一名角色的对应区域内', + usable: 1, + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var str = get.translation(target); + var list = [ + "弃置" + str + "的" + get.cnNumber(get.distance(player, target)) + "张手牌", + "将" + str + "装备区或判定区内的一张牌移动到另一名角色的对应区域内", ]; - var choices=[]; - if(target.countCards('h')>0) choices.push('选项一'); - else list[0]=''+list[0]+''; - if(target.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card); - }) - },'e')||target.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canAddJudge(card); - }) - },'j')) choices.push('选项二'); - else list[1]=''+list[1]+''; - if(choices.length==2&&(target.hp>player.hp||target.isMaxHp())) choices.push('全部执行'); - choices.push('cancel2'); - player.chooseControl(choices).set('choiceList',list).set('prompt',get.prompt('twzhenxi',target)).set('ai',function(){ - var player=_status.event.player,target=_status.event.getTrigger().target; - var eff1=0,eff2=0; - var choices=_status.event.controls.slice(0); - if(choices.includes('选项一')){ - eff1=-get.distance(player,target)*get.attitude(player,target); - } - if(choices.includes('选项二')){ - var equip=0,judge=0,att=get.attitude(player,target); - var es=target.getCards('e'),js=target.getCards('j'); - for(var i of es){ - var val=get.value(i); - if(att>0){ - if(val<=Math.min(0,equip)&&game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(i)&&get.effect(current,i,player,player)>0; - })) equip=val; - } - else{ - if(val>Math.max(0,equip)&&game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(i)&&get.effect(current,i,player,player)>0; - })) equip=val; - } + var choices = []; + if (target.countCards("h") > 0) choices.push("选项一"); + else list[0] = '' + list[0] + ""; + if ( + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }); + }, "e") || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canAddJudge(card); + }); + }, "j") + ) + choices.push("选项二"); + else list[1] = '' + list[1] + ""; + if (choices.length == 2 && (target.hp > player.hp || target.isMaxHp())) + choices.push("全部执行"); + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", list) + .set("prompt", get.prompt("twzhenxi", target)) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().target; + var eff1 = 0, + eff2 = 0; + var choices = _status.event.controls.slice(0); + if (choices.includes("选项一")) { + eff1 = -get.distance(player, target) * get.attitude(player, target); } - for(var i of js){ - var card={name:i.viewAs||i.name}; - var effect=get.effect(target,card,player,player); - if(effect<0){ - game.countPlayer(function(current){ - if(current!=target&¤t.canAddJudge(i)){ - var eff=get.effect(current,card,player,player); - judge=Math.max(eff,judge); - } - }); + if (choices.includes("选项二")) { + var equip = 0, + judge = 0, + att = get.attitude(player, target); + var es = target.getCards("e"), + js = target.getCards("j"); + for (var i of es) { + var val = get.value(i); + if (att > 0) { + if ( + val <= Math.min(0, equip) && + game.hasPlayer(function (current) { + return ( + current != target && + current.canEquip(i) && + get.effect(current, i, player, player) > 0 + ); + }) + ) + equip = val; + } else { + if ( + val > Math.max(0, equip) && + game.hasPlayer(function (current) { + return ( + current != target && + current.canEquip(i) && + get.effect(current, i, player, player) > 0 + ); + }) + ) + equip = val; + } } + for (var i of js) { + var card = { name: i.viewAs || i.name }; + var effect = get.effect(target, card, player, player); + if (effect < 0) { + game.countPlayer(function (current) { + if (current != target && current.canAddJudge(i)) { + var eff = get.effect(current, card, player, player); + judge = Math.max(eff, judge); + } + }); + } + } + eff2 = Math.max(-equip * att, judge); } - eff2=Math.max(-equip*att,judge); - } - if(eff1>0){ - if(eff2>0){ - if(choices.includes('全部执行')) return '全部执行'; - else if(eff2>=eff1) return '选项二'; - } - return '选项一'; - } - else if(eff2>0) return '选项二'; - return 'cancel2'; - }); - 'step 1' - if(result.control=='cancel2'){ + if (eff1 > 0) { + if (eff2 > 0) { + if (choices.includes("全部执行")) return "全部执行"; + else if (eff2 >= eff1) return "选项二"; + } + return "选项一"; + } else if (eff2 > 0) return "选项二"; + return "cancel2"; + }); + ("step 1"); + if (result.control == "cancel2") { event.finish(); return; } - player.logSkill('twzhenxi',target); - event.control=result.control; - if(event.control!='选项二') player.discardPlayerCard(target,true,'h',get.distance(player,target)); - if(event.control=='选项一') event.finish(); - 'step 2' - if(event.control!='选项一'&&(target.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canEquip(card); - }) - },'e')||target.hasCard(function(card){ - return game.hasPlayer(function(current){ - return current!=target&¤t.canAddJudge(card); - }) - },'j'))){ - player.chooseTarget(true,'将'+get.translation(target)+'区域内的一张牌移动给另一名角色',function(card,player,target){ - var source=_status.event.preTarget; - if(source==target) return false; - return source.hasCard(function(card){ - return target.canEquip(card); - },'e')||source.hasCard(function(card){ - return target.canAddJudge(card); - },'j'); - }).set('preTarget',target).set('ai',function(target){ - var player=_status.event.player,source=_status.event.preTarget; - var att=get.attitude(player,source); - var es=source.getCards('e',function(card){ - return target.canEquip(card); - }),js=source.getCards('j',function(card){ - return target.canAddJudge(card); + player.logSkill("twzhenxi", target); + event.control = result.control; + if (event.control != "选项二") + player.discardPlayerCard(target, true, "h", get.distance(player, target)); + if (event.control == "选项一") event.finish(); + ("step 2"); + if ( + event.control != "选项一" && + (target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); }); - var eff=0; - for(var i of es){ - var val=get.value(i,source); - if(att>0?val<=0:val>0){ - eff=Math.max(eff,get.effect(target,i,player,player)); + }, "e") || + target.hasCard(function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canAddJudge(card); + }); + }, "j")) + ) { + player + .chooseTarget( + true, + "将" + get.translation(target) + "区域内的一张牌移动给另一名角色", + function (card, player, target) { + var source = _status.event.preTarget; + if (source == target) return false; + return ( + source.hasCard(function (card) { + return target.canEquip(card); + }, "e") || + source.hasCard(function (card) { + return target.canAddJudge(card); + }, "j") + ); } - } - for(var i of js){ - var card={name:i.viewAs||i.name}; - if(get.effect(source,card,player,player)<0){ - eff=Math.max(eff,get.effect(target,card,player,player)); + ) + .set("preTarget", target) + .set("ai", function (target) { + var player = _status.event.player, + source = _status.event.preTarget; + var att = get.attitude(player, source); + var es = source.getCards("e", function (card) { + return target.canEquip(card); + }), + js = source.getCards("j", function (card) { + return target.canAddJudge(card); + }); + var eff = 0; + for (var i of es) { + var val = get.value(i, source); + if (att > 0 ? val <= 0 : val > 0) { + eff = Math.max(eff, get.effect(target, i, player, player)); + } } - } - return eff; - }); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target2=result.targets[0]; - event.target2=target2; - player.choosePlayerCard('ej',true,function(button){ - var player=_status.event.player; - var targets0=_status.event.targets0; - var targets1=_status.event.targets1; - if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ - if(get.position(button.link)=='j') return 12; - if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; - return 0; - } - else{ - if(get.position(button.link)=='j') return -10; - return get.value(button.link)*get.effect(targets1,button.link,player,targets1); - } - },target).set('targets0',target).set('targets1',target2).set('filterButton',function(button){ - var targets1=_status.event.targets1; - if(get.position(button.link)=='j'){ - return targets1.canAddJudge(button.link); - } - else{ - return targets1.canEquip(button.link); - } - }).set('ai',function(button){ - var player=_status.event.player,target=_status.event.targets1,source=_status.event.targets0; - var att=get.attitude(player,source); - var card=button.link; - if(get.position(card)=='e'){ - var val=get.value(card); - if(att>0?val>0:val<=0) return 0; - return get.effect(target,card,player,player); - } - var cardx={name:card.viewAs||card.name}; - if(get.effect(source,cardx,player,player)>=0) return 0; - return get.effect(target,cardx,player,player) - }); - } - else{ + for (var i of js) { + var card = { name: i.viewAs || i.name }; + if (get.effect(source, card, player, player) < 0) { + eff = Math.max(eff, get.effect(target, card, player, player)); + } + } + return eff; + }); + } else event.finish(); + ("step 3"); + if (result.bool) { + var target2 = result.targets[0]; + event.target2 = target2; + player + .choosePlayerCard( + "ej", + true, + function (button) { + var player = _status.event.player; + var targets0 = _status.event.targets0; + var targets1 = _status.event.targets1; + if ( + get.attitude(player, targets0) > 0 && + get.attitude(player, targets1) < 0 + ) { + if (get.position(button.link) == "j") return 12; + if ( + get.value(button.link, targets0) < 0 && + get.effect(targets1, button.link, player, targets1) > 0 + ) + return 10; + return 0; + } else { + if (get.position(button.link) == "j") return -10; + return ( + get.value(button.link) * + get.effect(targets1, button.link, player, targets1) + ); + } + }, + target + ) + .set("targets0", target) + .set("targets1", target2) + .set("filterButton", function (button) { + var targets1 = _status.event.targets1; + if (get.position(button.link) == "j") { + return targets1.canAddJudge(button.link); + } else { + return targets1.canEquip(button.link); + } + }) + .set("ai", function (button) { + var player = _status.event.player, + target = _status.event.targets1, + source = _status.event.targets0; + var att = get.attitude(player, source); + var card = button.link; + if (get.position(card) == "e") { + var val = get.value(card); + if (att > 0 ? val > 0 : val <= 0) return 0; + return get.effect(target, card, player, player); + } + var cardx = { name: card.viewAs || card.name }; + if (get.effect(source, cardx, player, player) >= 0) return 0; + return get.effect(target, cardx, player, player); + }); + } else { event.finish(); } - 'step 4' - if(result.bool&&result.links.length){ - var link=result.links[0]; - if(get.position(link)=='e'){ + ("step 4"); + if (result.bool && result.links.length) { + var link = result.links[0]; + if (get.position(link) == "e") { event.target2.equip(link); - } - else if(link.viewAs){ - event.target2.addJudge({name:link.viewAs},[link]); - } - else{ + } else if (link.viewAs) { + event.target2.addJudge({ name: link.viewAs }, [link]); + } else { event.target2.addJudge(link); } - target.$give(link,event.target2,false); - game.log(target,'的',link,'被移动给了',event.target2); + target.$give(link, event.target2, false); + game.log(target, "的", link, "被移动给了", event.target2); game.delay(); } }, - ai:{ - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.name||arg.name!='sha') return false; - if(player.storage.counttrigger&&player.storage.counttrigger.twzhenxi) return false; - if(!arg.target) return false; - var card=arg.target.getEquip(2); - return card&&get.value(card)>0&&game.hasPlayer(function(current){ - return current!=arg.target&¤t.canEquip(card)&&get.effect(current,card,player,player)>0; - }) + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.name || arg.name != "sha") return false; + if (player.storage.counttrigger && player.storage.counttrigger.twzhenxi) return false; + if (!arg.target) return false; + var card = arg.target.getEquip(2); + return ( + card && + get.value(card) > 0 && + game.hasPlayer(function (current) { + return ( + current != arg.target && + current.canEquip(card) && + get.effect(current, card, player, player) > 0 + ); + }) + ); }, }, }, - twyangshi:{ - audio:2, - trigger:{player:'damageEnd'}, - forced:true, - content:function(){ - if(game.hasPlayer(function(current){ - return current!=player&&!player.inRange(current); - })){ - player.addSkill('twyangshi_distance'); - player.addMark('twyangshi_distance',1,false); - } - else{ - var card=get.cardPile2(function(card){ - return card.name=='sha'; + twyangshi: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + content: function () { + if ( + game.hasPlayer(function (current) { + return current != player && !player.inRange(current); + }) + ) { + player.addSkill("twyangshi_distance"); + player.addMark("twyangshi_distance", 1, false); + } else { + var card = get.cardPile2(function (card) { + return card.name == "sha"; }); - if(card) player.gain(card,'gain2'); - else game.log('但是牌堆里已经没有杀了!'); + if (card) player.gain(card, "gain2"); + else game.log("但是牌堆里已经没有杀了!"); } }, - subSkill:{ - distance:{ - charlotte:true, - onremove:true, - mod:{ - attackRange:function(player,num){ - return num+player.countMark('twyangshi_distance'); + subSkill: { + distance: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("twyangshi_distance"); }, }, - intro:{ - content:'攻击范围+#', + intro: { + content: "攻击范围+#", }, }, }, }, //全琮 - zhenshan:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - filter:function(event,player){ - if(event.type=='wuxie'||player.hasSkill('zhenshan_used')) return false; - var nh=player.countCards('h'); - if(!game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')0; - })){ - if(card.name=='sha'){ - var eff=player.getUseValue(card); - if(eff>0) return 2.9+eff/10; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if (card.name == "jiu") return 0; + if ( + game.hasPlayer(function (current) { + return get.effect(current, card, player, player) > 0; + }) + ) { + if (card.name == "sha") { + var eff = player.getUseValue(card); + if (eff > 0) return 2.9 + eff / 10; return 0; - } - else if(card.name=='tao'||card.name=='shan'){ + } else if (card.name == "tao" || card.name == "shan") { return 4; } } return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:function(){return false}, - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, + filterCard: function () { + return false; }, - selectCard:-1, - precontent:function(){ - 'step 0' - player.chooseTarget('选择一名手牌数小于你的角色交换手牌',function(card,player,target){ - return target!=player&&target.countCards('h')0&¤t.countCards('h') 0 && current.countCards("h") < nh; + }) + ) { + if (event.type == "dying") { + if (event.filterCard({ name: "tao" }, player, event)) { return 0.5; } - } - else{ - if(event.filterCard({name:'tao'},player,event)||event.filterCard({name:'shan'},player,event)){ + } else { + if ( + event.filterCard({ name: "tao" }, player, event) || + event.filterCard({ name: "shan" }, player, event) + ) { return 4; } - if(event.filterCard({name:'sha'},player,event)){ + if (event.filterCard({ name: "sha" }, player, event)) { return 2.9; } } } return 0; }, - save:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(player.hasSkill('zhenshan_used')) return false; - var nh=player.countCards('h'); - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')0&&(event.card.name=='sha'||get.type(event.card,false)=='trick'&&get.tag(event.card,'damage')>0); + twfenghan: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + direct: true, + usable: 1, + filter: function (event, player) { + return ( + event.isFirstTarget && + event.targets.length > 0 && + (event.card.name == "sha" || + (get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0)) + ); }, - content:function(){ - 'step 0' - var num=trigger.targets.length; - player.chooseTarget([1,num],get.prompt('twfenghan'),'令至多'+get.cnNumber(num)+'名角色各摸一张牌').set('ai',function(target){ - return Math.sqrt(5-Math.min(4,target.countCards('h')))*get.attitude(_status.event.player,target)*(target.hasSkillTag('nogain')?0.1:1); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('twfenghan',targets); - if(targets.length>1) game.asyncDraw(targets); - else{ + content: function () { + "step 0"; + var num = trigger.targets.length; + player + .chooseTarget( + [1, num], + get.prompt("twfenghan"), + "令至多" + get.cnNumber(num) + "名角色各摸一张牌" + ) + .set("ai", function (target) { + return ( + Math.sqrt(5 - Math.min(4, target.countCards("h"))) * + get.attitude(_status.event.player, target) * + (target.hasSkillTag("nogain") ? 0.1 : 1) + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("twfenghan", targets); + if (targets.length > 1) game.asyncDraw(targets); + else { targets[0].draw(); event.finish(); } - } - else{ + } else { player.storage.counttrigger.twfenghan--; event.finish(); } - 'step 2' + ("step 2"); game.delayx(); }, }, - twcongji:{ - audio:2, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + twcongji: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - direct:true, - filter:function(event,player){ - if(player==_status.currentPhase||event.type!='discard'||event.getlx===false||!game.hasPlayer((current)=>current!=player)) return false; - var evt=event.getl(player); - for(var i of evt.cards2){ - if(get.color(i,player)=='red'&&get.position(i,true)=='d') return true; + direct: true, + filter: function (event, player) { + if ( + player == _status.currentPhase || + event.type != "discard" || + event.getlx === false || + !game.hasPlayer((current) => current != player) + ) + return false; + var evt = event.getl(player); + for (var i of evt.cards2) { + if (get.color(i, player) == "red" && get.position(i, true) == "d") return true; } return false; }, - content:function(){ - 'step 0' - var cards=[],cards2=trigger.getl(player).cards2; - for(var i of cards2){ - if(get.color(i,player)=='red'&&get.position(i,true)=='d') cards.push(i); + content: function () { + "step 0"; + var cards = [], + cards2 = trigger.getl(player).cards2; + for (var i of cards2) { + if (get.color(i, player) == "red" && get.position(i, true) == "d") cards.push(i); } - player.chooseButton(['从击:选择任意张牌交给其他角色',cards],[1,cards.length]).set('goon',game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0; - })).set('ai',function(button){ - if(_status.event.goon) return get.value(button.link); - return button.link.name=='du'?1:0; - }); - 'step 1' - if(result.bool){ - event.cards=result.links; - player.chooseTarget('选择一名角色获得以下牌:',get.translation(cards),true,lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player,cards=_status.event.getParent().cards; - if(cards[0].name=='du') return -get.attitude(player,target); - var att=get.attitude(player,target); - if(att<=0) return 0; - if(target.hasSkillTag('nogain')) att/=10; - if(target.hasJudge('lebu')) att/=4; - return get.value(cards,target)*att; + player + .chooseButton(["从击:选择任意张牌交给其他角色", cards], [1, cards.length]) + .set( + "goon", + game.hasPlayer(function (current) { + return current != player && get.attitude(player, current) > 0; + }) + ) + .set("ai", function (button) { + if (_status.event.goon) return get.value(button.link); + return button.link.name == "du" ? 1 : 0; }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twcongji',target); - target.gain(cards,'gain2'); + ("step 1"); + if (result.bool) { + event.cards = result.links; + player + .chooseTarget( + "选择一名角色获得以下牌:", + get.translation(cards), + true, + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player, + cards = _status.event.getParent().cards; + if (cards[0].name == "du") return -get.attitude(player, target); + var att = get.attitude(player, target); + if (att <= 0) return 0; + if (target.hasSkillTag("nogain")) att /= 10; + if (target.hasJudge("lebu")) att /= 4; + return get.value(cards, target) * att; + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twcongji", target); + target.gain(cards, "gain2"); } }, }, //王粲 - twdianyi:{ - audio:2, - trigger:{player:'phaseEnd'}, - forced:true, - filter:function(event,player){ - if(!player.getHistory('sourceDamage').length) return player.countCards('h')!=4; - return player.countCards('h')>0; + twdianyi: { + audio: 2, + trigger: { player: "phaseEnd" }, + forced: true, + filter: function (event, player) { + if (!player.getHistory("sourceDamage").length) return player.countCards("h") != 4; + return player.countCards("h") > 0; }, - content:function(){ - var num=player.countCards('h'); - if(player.getHistory('sourceDamage').length) player.chooseToDiscard('h',true,num); - else if(num>4) player.chooseToDiscard('h',true,num-4); + content: function () { + var num = player.countCards("h"); + if (player.getHistory("sourceDamage").length) player.chooseToDiscard("h", true, num); + else if (num > 4) player.chooseToDiscard("h", true, num - 4); else player.drawTo(4); }, }, - twyingji:{ - audio:2, - enable:['chooseToUse','chooseToRespond'], - hiddenCard:function(player,name){ - return player!=_status.currentPhase&&lib.inpile.includes(name)&&player.countCards('h')==0; + twyingji: { + audio: 2, + enable: ["chooseToUse", "chooseToRespond"], + hiddenCard: function (player, name) { + return ( + player != _status.currentPhase && + lib.inpile.includes(name) && + player.countCards("h") == 0 + ); }, - filter:function(event,player){ - if(player==_status.currentPhase||player.countCards('h')>0) return false; - for(var i of lib.inpile){ - if(i=='wuxie') continue; - var type=get.type(i); - if((type=='basic'||type=='trick')&&event.filterCard({name:i,isCard:true},player,event)) return true; - if(i=='sha'){ - for(var j of lib.inpile_nature){ - if(event.filterCard({name:i,nature:j,isCard:true},player,event)) return true; + filter: function (event, player) { + if (player == _status.currentPhase || player.countCards("h") > 0) return false; + for (var i of lib.inpile) { + if (i == "wuxie") continue; + var type = get.type(i); + if ( + (type == "basic" || type == "trick") && + event.filterCard({ name: i, isCard: true }, player, event) + ) + return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + if (event.filterCard({ name: i, nature: j, isCard: true }, player, event)) + return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i of lib.inpile){ - if(i=='wuxie') continue; - var type=get.type(i); - if(type=='basic'||type=='trick'){ - var card={name:i,isCard:true}; - if(event.filterCard(card,player,event)) list.push([type,'',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature){ - card.nature=j; - if(event.filterCard(card,player,event)) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var i of lib.inpile) { + if (i == "wuxie") continue; + var type = get.type(i); + if (type == "basic" || type == "trick") { + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) list.push([type, "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) + list.push(["基本", "", "sha", j]); } } } } - return ui.create.dialog('应机',[list,'vcard']); + return ui.create.dialog("应机", [list, "vcard"]); }, - check:function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - var val=_status.event.getParent().type=='phase'?player.getUseValue(card):1; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; return val; }, - backup:function(links,player){ + backup: function (links, player) { return { - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, }, - filterCard:()=>false, - selectCard:-1, - precontent:function(){ - player.logSkill('twyingji'); - player.draw('nodelay'); + filterCard: () => false, + selectCard: -1, + precontent: function () { + player.logSkill("twyingji"); + player.draw("nodelay"); delete event.result.skill; }, - } + }; }, - prompt:function(links){ - return '将一张手牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; + prompt: function (links) { + return ( + "将一张手牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, }, - ai:{ - fireAttack:true, - respondShan:true, - respondSha:true, - skillTagFilter:function(player){ - if(player==_status.currentPhase||player.countCards('h')>0) return false; + ai: { + fireAttack: true, + respondShan: true, + respondSha: true, + skillTagFilter: function (player) { + if (player == _status.currentPhase || player.countCards("h") > 0) return false; }, - order:10, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying)>0; + order: 10, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying) > 0; return 1; }, }, }, - group:['twyingji_wuxie'], + group: ["twyingji_wuxie"], }, - twyingji_wuxie:{ - enable:'chooseToUse', - viewAs:{ - name:'wuxie', - isCard:true, + twyingji_wuxie: { + enable: "chooseToUse", + viewAs: { + name: "wuxie", + isCard: true, }, - viewAsFilter:function(player){ - return player!=_status.currentPhase&&player.countCards('h')==0; + viewAsFilter: function (player) { + return player != _status.currentPhase && player.countCards("h") == 0; }, - filterCard:()=>false, - prompt:'视为使用【无懈可击】并摸一张牌', - selectCard:[0,1], - check:()=>1, - precontent:function(){ - player.logSkill('twyingji'); - player.draw('nodelay'); + filterCard: () => false, + prompt: "视为使用【无懈可击】并摸一张牌", + selectCard: [0, 1], + check: () => 1, + precontent: function () { + player.logSkill("twyingji"); + player.draw("nodelay"); delete event.result.skill; }, - ai:{ - order:4, + ai: { + order: 4, }, }, - twshanghe:{ - trigger:{player:'dying'}, - limited:true, - audio:2, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('he')>0; - }) - }, - prompt:'是否发动【觞贺】?', - skillAnimation:true, - animationColor:'soil', - logTarget:(event,player)=>game.filterPlayer((current)=>current!=player), - content:function(){ - "step 0" - player.awakenSkill('twshanghe'); - event.targets=game.filterPlayer((current)=>current!=player); - event.num=0; - event.jiu=false; - "step 1" - event.current=targets[num]; - if(!event.current.countCards('he')) event.goto(3); - else event.current.chooseCard('交给'+get.translation(player)+'一张牌','he',true).set('ai',function(card){ - var evt=_status.event.getParent(); - return 100-get.value(card); + twshanghe: { + trigger: { player: "dying" }, + limited: true, + audio: 2, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("he") > 0; }); - "step 2" - if(result.bool&&result.cards&&result.cards.length){ - event.current.give(result.cards,player); - if(!event.jiu&&get.name(result.cards[0],player)=='jiu') event.jiu=true; + }, + prompt: "是否发动【觞贺】?", + skillAnimation: true, + animationColor: "soil", + logTarget: (event, player) => game.filterPlayer((current) => current != player), + content: function () { + "step 0"; + player.awakenSkill("twshanghe"); + event.targets = game.filterPlayer((current) => current != player); + event.num = 0; + event.jiu = false; + ("step 1"); + event.current = targets[num]; + if (!event.current.countCards("he")) event.goto(3); + else + event.current + .chooseCard("交给" + get.translation(player) + "一张牌", "he", true) + .set("ai", function (card) { + var evt = _status.event.getParent(); + return 100 - get.value(card); + }); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + event.current.give(result.cards, player); + if (!event.jiu && get.name(result.cards[0], player) == "jiu") event.jiu = true; } - "step 3" + ("step 3"); event.num++; - if(event.num1) game.delayx(); - if(game.hasPlayer(function(current){ - return targets.includes(current)&¤t.hasHistory('gain',function(evt){ - return evt.getParent(2)==event&&get.type(evt.cards[0],current)!='basic'; + } else event.finish(); + ("step 2"); + if (targets.length > 1) game.delayx(); + if ( + game.hasPlayer(function (current) { + return ( + targets.includes(current) && + current.hasHistory("gain", function (evt) { + return ( + evt.getParent(2) == event && + get.type(evt.cards[0], current) != "basic" + ); + }) + ); }) - })) player.draw(); + ) + player.draw(); }, - group:'twkaiji_count', - subSkill:{ - count:{ - trigger:{global:'dying'}, - forced:true, - firstDo:true, - silent:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return !player.getStorage('twkaiji').includes(event.player); + group: "twkaiji_count", + subSkill: { + count: { + trigger: { global: "dying" }, + forced: true, + firstDo: true, + silent: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return !player.getStorage("twkaiji").includes(event.player); }, - content:function(){ - player.markAuto('twkaiji',[trigger.player]); + content: function () { + player.markAuto("twkaiji", [trigger.player]); }, }, }, }, - twshepan:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - usable:1, - direct:true, - filter:function(event,player){ - return player!=event.player; + twshepan: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + usable: 1, + direct: true, + filter: function (event, player) { + return player != event.player; }, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - var choiceList=[ - '摸一张牌', - '将'+get.translation(target)+'区域内的一张牌置于牌堆顶', + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var choiceList = [ + "摸一张牌", + "将" + get.translation(target) + "区域内的一张牌置于牌堆顶", ]; - var choices=['选项一']; - if(target.countCards('hej')>0) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - choices.push('cancel2'); - player.chooseControl(choices).set('choiceList',choiceList).set('choice',function(){ - if(choices.length>2&&get.effect(target,{name:'guohe_copy'},player,player)>0) return 1; - return 0; - }()) - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('twshepan',target); - if(result.index==1) player.choosePlayerCard(target,'hej',true); - else{ + var choices = ["选项一"]; + if (target.countCards("hej") > 0) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set( + "choice", + (function () { + if ( + choices.length > 2 && + get.effect(target, { name: "guohe_copy" }, player, player) > 0 + ) + return 1; + return 0; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("twshepan", target); + if (result.index == 1) player.choosePlayerCard(target, "hej", true); + else { player.draw(); event.goto(3); } - } - else{ + } else { player.storage.counttrigger.twshepan--; event.finish(); } - 'step 2' - var card=result.cards[0]; - target.$throw(get.position(card)=='h'?1:card,1000); - target.lose(card,ui.cardPile,'insert'); - 'step 3' + ("step 2"); + var card = result.cards[0]; + target.$throw(get.position(card) == "h" ? 1 : card, 1000); + target.lose(card, ui.cardPile, "insert"); + ("step 3"); game.delayx(); - if(target.isIn()&&player.countCards('h')==target.countCards('h')){ + if (target.isIn() && player.countCards("h") == target.countCards("h")) { player.storage.counttrigger.twshepan--; - player.chooseBool('是否令'+get.translation(trigger.card)+'对自己无效?').set('ai',function(){ - var evt=_status.event.getTrigger(); - return get.effect(evt.target,evt.card,evt.player,evt.target)<0; - }); - } - else event.finish(); - 'step 4' - if(result.bool) trigger.excluded.add(player); + player + .chooseBool("是否令" + get.translation(trigger.card) + "对自己无效?") + .set("ai", function () { + var evt = _status.event.getTrigger(); + return get.effect(evt.target, evt.card, evt.player, evt.target) < 0; + }); + } else event.finish(); + ("step 4"); + if (result.bool) trigger.excluded.add(player); }, }, //曹肇 - twfuzuan:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.getSkills(null,false,false).filter(function(i){ - return get.is.zhuanhuanji(i,current); - }).length>0; + twfuzuan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, current); + }).length > 0 + ); }); }, - filterTarget:function(card,player,target){ - return target.getSkills(null,false,false).filter(function(i){ - return get.is.zhuanhuanji(i,target); - }).length>0; + filterTarget: function (card, player, target) { + return ( + target.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, target); + }).length > 0 + ); }, - content:function(){ - 'step 0' - var list=target.getSkills(null,false,false).filter(function(i){ - return get.is.zhuanhuanji(i,target); + content: function () { + "step 0"; + var list = target.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, target); }); - if(list.length==1){ - event._result={control:list[0]}; - } - else player.chooseControl(list).set('prompt','选择变更'+get.translation(target)+'一个技能的状态').set('choice',list.includes('twfeifu')?'twfeifu':0).set('ai',()=>_status.event.choice); - 'step 1' - var skill=result.control; + if (list.length == 1) { + event._result = { control: list[0] }; + } else + player + .chooseControl(list) + .set("prompt", "选择变更" + get.translation(target) + "一个技能的状态") + .set("choice", list.includes("twfeifu") ? "twfeifu" : 0) + .set("ai", () => _status.event.choice); + ("step 1"); + var skill = result.control; target.changeZhuanhuanji(skill); - target.popup(skill,'wood'); - game.log(target,'的','#g【'+get.translation(skill)+'】','发生了状态变更'); + target.popup(skill, "wood"); + game.log(target, "的", "#g【" + get.translation(skill) + "】", "发生了状态变更"); game.delayx(); }, - ai:{ - order:8, - result:{ - target:function(player,target){ - if(!target.hasSkill('twfeifu')) return 0; - return target.storage.twfeifu?-1:1; + ai: { + order: 8, + result: { + target: function (player, target) { + if (!target.hasSkill("twfeifu")) return 0; + return target.storage.twfeifu ? -1 : 1; }, }, }, - group:'twfuzuan_damage', - subSkill:{ - damage:{ - audio:'twfuzuan', - trigger:{ - player:'damageEnd', - source:'damageSource', + group: "twfuzuan_damage", + subSkill: { + damage: { + audio: "twfuzuan", + trigger: { + player: "damageEnd", + source: "damageSource", }, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.getSkills(null,false,false).filter(function(i){ - return get.is.zhuanhuanji(i,current); - }).length>0; + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, current); + }).length > 0 + ); }); }, - content:function(){ - 'step 0' - player.chooseTarget(lib.skill.twfuzuan.filterTarget,get.prompt('twfuzuan'),'变更一名角色的一个转换技的状态').set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,'twfuzuan',player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twfuzuan',target); - var next=game.createEvent('twfuzuan'); - next.player=player; - next.target=target; + content: function () { + "step 0"; + player + .chooseTarget( + lib.skill.twfuzuan.filterTarget, + get.prompt("twfuzuan"), + "变更一名角色的一个转换技的状态" + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, "twfuzuan", player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twfuzuan", target); + var next = game.createEvent("twfuzuan"); + next.player = player; + next.target = target; next.setContent(lib.skill.twfuzuan.content); } }, }, }, }, - twchongqi:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + twchongqi: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - logTarget:()=>game.filterPlayer().sortBySeat(), - content:function(){ - 'step 0' - game.filterPlayer().sortBySeat().forEach(function(current){ - current.addSkills('twfeifu'); - }); + logTarget: () => game.filterPlayer().sortBySeat(), + content: function () { + "step 0"; + game.filterPlayer() + .sortBySeat() + .forEach(function (current) { + current.addSkills("twfeifu"); + }); //game.log(player,'令所有其他角色获得了技能','#g【非服】') game.delayx(); - 'step 1' - player.chooseTarget('是否减1点体力上限,并令一名其他角色获得技能【复纂】?',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - if(player.hasUnknown()&&!target.isZhu) return 0; - if(player.getEnemies().includes(target)) return 0; - return get.attitude(player,target); - }); - 'step 2' - if(result.bool){ + ("step 1"); + player + .chooseTarget( + "是否减1点体力上限,并令一名其他角色获得技能【复纂】?", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + if (player.hasUnknown() && !target.isZhu) return 0; + if (player.getEnemies().includes(target)) return 0; + return get.attitude(player, target); + }); + ("step 2"); + if (result.bool) { player.loseMaxHp(); - var target=result.targets[0]; - player.line(target,'fire'); - target.addSkills('twfuzuan'); + var target = result.targets[0]; + player.line(target, "fire"); + target.addSkills("twfuzuan"); game.delayx(); } }, - derivation:'twfeifu', + derivation: "twfeifu", }, - twfeifu:{ - audio:2, - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + twfeifu: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - zhuanhuanji:true, - forced:true, - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - return (storage?'当你使用【杀】指定唯一目标后':'当你成为【杀】的唯一目标后')+'目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。'; + zhuanhuanji: true, + forced: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + return ( + (storage ? "当你使用【杀】指定唯一目标后" : "当你成为【杀】的唯一目标后") + + "目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。" + ); }, }, - filter:function(event,player,name){ - return event.card.name=='sha'&&event.targets.length==1 - &&event.player.isIn()&&event.target.countCards('he')>0&& - (name=='useCardToPlayered')==Boolean(player.storage.twfeifu); + filter: function (event, player, name) { + return ( + event.card.name == "sha" && + event.targets.length == 1 && + event.player.isIn() && + event.target.countCards("he") > 0 && + (name == "useCardToPlayered") == Boolean(player.storage.twfeifu) + ); }, - logTarget:function(event,player){ - return player.storage.twfeifu?event.target:event.player; + logTarget: function (event, player) { + return player.storage.twfeifu ? event.target : event.player; }, - content:function(){ - 'step 0' - player.changeZhuanhuanji('twfeifu'); - trigger.target.chooseCard('he',true,'非服:交给'+get.translation(trigger.player)+'一张牌','若选择装备牌,则其可以使用此牌'); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - event.card=card; - trigger.target.give(card,trigger.player); - } - else event.finish(); - 'step 2' - var target=trigger.player; - if(target.getCards('h').includes(card)&&get.type(card,target)=='equip'&&target.hasUseTarget(card)) target.chooseUseTarget(card,'nopopup'); + content: function () { + "step 0"; + player.changeZhuanhuanji("twfeifu"); + trigger.target.chooseCard( + "he", + true, + "非服:交给" + get.translation(trigger.player) + "一张牌", + "若选择装备牌,则其可以使用此牌" + ); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + event.card = card; + trigger.target.give(card, trigger.player); + } else event.finish(); + ("step 2"); + var target = trigger.player; + if ( + target.getCards("h").includes(card) && + get.type(card, target) == "equip" && + target.hasUseTarget(card) + ) + target.chooseUseTarget(card, "nopopup"); }, }, //Powered by @污言噫对 - twjingce:{ - marktext:"策", - intro:{ - name:"策", - content:"mark", + twjingce: { + marktext: "策", + intro: { + name: "策", + content: "mark", }, - audio:2, - trigger:{player:"useCardAfter"}, - filter:function(event,player){ - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - var history=player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt; + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var history = player.getHistory("useCard", function (evtx) { + return evtx.getParent("phaseUse") == evt; }); - return history&&history.indexOf(event)==player.hp-1; + return history && history.indexOf(event) == player.hp - 1; }, - frequent:true, - content:function(){ - 'step 0' + frequent: true, + content: function () { + "step 0"; player.draw(2); - 'step 1' - if(player.getHistory('sourceDamage').length||player.getHistory('gain',function(evt){ - return evt.getParent('phaseUse')==trigger.getParent('phaseUse')&&evt.getParent().name=='draw'; - }).length>1) player.addMark('twjingce',1); + ("step 1"); + if ( + player.getHistory("sourceDamage").length || + player.getHistory("gain", function (evt) { + return ( + evt.getParent("phaseUse") == trigger.getParent("phaseUse") && + evt.getParent().name == "draw" + ); + }).length > 1 + ) + player.addMark("twjingce", 1); }, }, - yuzhang:{ - audio:2, - trigger:{ - player:"damageEnd", + yuzhang: { + audio: 2, + trigger: { + player: "damageEnd", }, - filter:function(event,player){ - return event.source&&player.hasMark('twjingce'); + filter: function (event, player) { + return event.source && player.hasMark("twjingce"); }, - direct:true, - content:function(){ - 'step 0' - var choiceList=['令'+get.translation(trigger.source)+'本回合不能再使用或打出牌']; - if (trigger.source.countCards('he')) choiceList.push('令'+get.translation(trigger.source)+'弃置两张牌'); - player.chooseControl('cancel2').set('prompt2',get.prompt2('yuzhang')).set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player,source=_status.event.source; - if(get.attitude(player,source)>=0) return 'cancel2'; - if(source.hasSkillTag('noh')||source.hasSkillTag('noe')||source.countCards('h')>=4) return 0; - if(source.hp>1&&source.countCards('he')>1) return 1; - return [0,1].randomGet(); - }).set('source',trigger.source); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('yuzhang',trigger.source); - player.removeMark('twjingce',1); - if(result.index==0) trigger.source.addTempSkill('yuzhang_dontuse'); - else trigger.source.chooseToDiscard('he',2,true); + direct: true, + content: function () { + "step 0"; + var choiceList = ["令" + get.translation(trigger.source) + "本回合不能再使用或打出牌"]; + if (trigger.source.countCards("he")) + choiceList.push("令" + get.translation(trigger.source) + "弃置两张牌"); + player + .chooseControl("cancel2") + .set("prompt2", get.prompt2("yuzhang")) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + source = _status.event.source; + if (get.attitude(player, source) >= 0) return "cancel2"; + if ( + source.hasSkillTag("noh") || + source.hasSkillTag("noe") || + source.countCards("h") >= 4 + ) + return 0; + if (source.hp > 1 && source.countCards("he") > 1) return 1; + return [0, 1].randomGet(); + }) + .set("source", trigger.source); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("yuzhang", trigger.source); + player.removeMark("twjingce", 1); + if (result.index == 0) trigger.source.addTempSkill("yuzhang_dontuse"); + else trigger.source.chooseToDiscard("he", 2, true); } }, - group:"yuzhang_skip", - subSkill:{ - skip:{ - audio:'yuzhang', - trigger:{ - player:['phaseZhunbeiBefore',"phaseJudgeBefore","phaseDrawBefore","phaseUseBefore","phaseDiscardBefore",'phaseJieshuBefore'], + group: "yuzhang_skip", + subSkill: { + skip: { + audio: "yuzhang", + trigger: { + player: [ + "phaseZhunbeiBefore", + "phaseJudgeBefore", + "phaseDrawBefore", + "phaseUseBefore", + "phaseDiscardBefore", + "phaseJieshuBefore", + ], }, - filter:function(event,player){ - return player.hasMark('twjingce'); + filter: function (event, player) { + return player.hasMark("twjingce"); }, - prompt2:function(event,player){ - var str='弃置一枚“策”并跳过'; - var list=lib.skill.yuzhang.subSkill.skip.trigger.player.slice(); - list=list.map(i=>i.slice(0,-6)); - str+=['准备','判定','摸牌','出牌','弃牌','结束'][list.indexOf(event.name)]; - str+='阶段'; + prompt2: function (event, player) { + var str = "弃置一枚“策”并跳过"; + var list = lib.skill.yuzhang.subSkill.skip.trigger.player.slice(); + list = list.map((i) => i.slice(0, -6)); + str += ["准备", "判定", "摸牌", "出牌", "弃牌", "结束"][list.indexOf(event.name)]; + str += "阶段"; return str; }, - check:function(event,player){ - if(event.name=='phaseDiscard') return player.needsToDiscard(); - if(event.name=='phaseJudge') return player.countCards('j'); + check: function (event, player) { + if (event.name == "phaseDiscard") return player.needsToDiscard(); + if (event.name == "phaseJudge") return player.countCards("j"); return false; }, - content:function(){ - player.removeMark('twjingce',1); + content: function () { + player.removeMark("twjingce", 1); trigger.cancel(); }, }, - dontuse:{ - charlotte:true, - mark:true, - mod:{ - cardEnabled2:function(card){ + dontuse: { + charlotte: true, + mark: true, + mod: { + cardEnabled2: function (card) { return false; }, }, - intro:{ - content:"不能使用或打出牌", + intro: { + content: "不能使用或打出牌", }, }, }, - ai:{ - combo:'twjingce' - } + ai: { + combo: "twjingce", + }, }, - twlihuo:{ - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; + twlihuo: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; return false; }, - audio:'lihuo', - prompt2:function(event){ - return '将'+get.translation(event.card)+'改为火属性'; + audio: "lihuo", + prompt2: function (event) { + return "将" + get.translation(event.card) + "改为火属性"; }, - audioname:['re_chengpu'], - check:function(event,player){ - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current)&&get.effect(current,{name:'sha',nature:'fire',cards:event.cards.slice(0)},player,player)>0; + audioname: ["re_chengpu"], + check: function (event, player) { + return game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + player.canUse(event.card, current) && + get.effect( + current, + { name: "sha", nature: "fire", cards: event.cards.slice(0) }, + player, + player + ) > 0 + ); }); }, - content:function(){ - game.setNature(trigger.card,'fire'); - trigger.card.twlihuo_buffed=true; + content: function () { + game.setNature(trigger.card, "fire"); + trigger.card.twlihuo_buffed = true; }, - group:['twlihuo2','twlihuo3'], - ai:{ - fireAttack:true, + group: ["twlihuo2", "twlihuo3"], + ai: { + fireAttack: true, }, }, - twlihuo2:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current); + twlihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twlihuo'),'为'+get.translation(trigger.card)+'增加一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('card',trigger.card).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!_status.connectMode) game.delayx(); - event.target=result.targets[0]; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twlihuo"), + "为" + get.translation(trigger.card) + "增加一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { event.finish(); } - 'step 2' - player.logSkill('twlihuo',event.target); + ("step 2"); + player.logSkill("twlihuo", event.target); trigger.targets.push(event.target); }, }, - twlihuo3:{ - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.card.twlihuo_buffed=true&&player.getHistory('sourceDamage',function(evt){ - return evt.card==event.card&&evt._dyinged; - }).length>0; + twlihuo3: { + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return (event.card.twlihuo_buffed = + true && + player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card && evt._dyinged; + }).length > 0); }, - forced:true, - audio:'lihuo', - audioname:['re_chengpu'], - content:function(){ + forced: true, + audio: "lihuo", + audioname: ["re_chengpu"], + content: function () { player.loseHp(); - } + }, }, - twchunlao:{ - audio:'chunlao', - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('hej')>0; - })&&!game.hasPlayer(function(current){ - return current.getExpansions('twchunlao').length>0; - }); + twchunlao: { + audio: "chunlao", + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return ( + game.hasPlayer(function (current) { + return current.countCards("hej") > 0; + }) && + !game.hasPlayer(function (current) { + return current.getExpansions("twchunlao").length > 0; + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twchunlao'),'将一名角色区域内的一张牌作为“醇”置于其武将牌上',function(card,player,target){ - return target.countCards('hej')>0; - }).set('ai',function(target){ - return (get.attitude(_status.event.player,target))*(player==target?1:2); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twchunlao',target); - player.choosePlayerCard(target,'hej',true); - } - else event.finish(); - 'step 2' - if(result.bool){ - target.addToExpansion(result.cards,target,'give').gaintag.add('twchunlao'); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twchunlao"), + "将一名角色区域内的一张牌作为“醇”置于其武将牌上", + function (card, player, target) { + return target.countCards("hej") > 0; + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) * (player == target ? 1 : 2); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twchunlao", target); + player.choosePlayerCard(target, "hej", true); + } else event.finish(); + ("step 2"); + if (result.bool) { + target.addToExpansion(result.cards, target, "give").gaintag.add("twchunlao"); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - group:['twchunlao_sha','twchunlao_dying'], - subSkill:{ - sha:{ - trigger:{global:'useCard'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.player.countCards('he')>0&&event.player.getExpansions('twchunlao').length>0; + group: ["twchunlao_sha", "twchunlao_dying"], + subSkill: { + sha: { + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.player.countCards("he") > 0 && + event.player.getExpansions("twchunlao").length > 0 + ); }, - content:function(){ - 'step 0' - event.target=trigger.player; - event.target.chooseCard('he','醇醪:是否交给'+get.translation(player)+'一张牌,令'+get.translation(trigger.card)+'的伤害值基数+1?').set('ai',function(card){ - if(!_status.event.goon) return 3.5-get.value(card); - return 7-get.value(card); - }).set('goon',function(){ - if(get.attitude(target,player)<0) return false; - var d1=true; - if(trigger.player.hasSkill('jueqing')||trigger.player.hasSkill('gangzhi')) d1=false; - for(var target of trigger.targets){ - if(!target.mayHaveShan(player,'use',target.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))||trigger.player.hasSkillTag('directHit_ai',true,{ - target:target, - card:trigger.card, - },true)){ - if(!target.hasSkill('gangzhi')) d1=false; - if(!target.hasSkillTag('filterDamage',null,{ - player:trigger.player, - card:trigger.card, - })&&get.attitude(player,target)<0) return true; - } - } - return d1; - }()); - if(!event.target.isUnderControl(true)&&!event.target.isOnline()) game.delayx(); - 'step 1' - if(result.bool){ - target.logSkill('twchunlao',player); - if(!target.hasSkill('twchunlao')) game.trySkillAudio('twchunlao',player); - if(player!=target) target.give(result.cards,player,'giveAuto'); + content: function () { + "step 0"; + event.target = trigger.player; + event.target + .chooseCard( + "he", + "醇醪:是否交给" + + get.translation(player) + + "一张牌,令" + + get.translation(trigger.card) + + "的伤害值基数+1?" + ) + .set("ai", function (card) { + if (!_status.event.goon) return 3.5 - get.value(card); + return 7 - get.value(card); + }) + .set( + "goon", + (function () { + if (get.attitude(target, player) < 0) return false; + var d1 = true; + if ( + trigger.player.hasSkill("jueqing") || + trigger.player.hasSkill("gangzhi") + ) + d1 = false; + for (var target of trigger.targets) { + if ( + !target.mayHaveShan( + player, + "use", + target.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) || + trigger.player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: trigger.card, + }, + true + ) + ) { + if (!target.hasSkill("gangzhi")) d1 = false; + if ( + !target.hasSkillTag("filterDamage", null, { + player: trigger.player, + card: trigger.card, + }) && + get.attitude(player, target) < 0 + ) + return true; + } + } + return d1; + })() + ); + if (!event.target.isUnderControl(true) && !event.target.isOnline()) game.delayx(); + ("step 1"); + if (result.bool) { + target.logSkill("twchunlao", player); + if (!target.hasSkill("twchunlao")) game.trySkillAudio("twchunlao", player); + if (player != target) target.give(result.cards, player, "giveAuto"); trigger.baseDamage++; } }, }, - dying:{ - audio:'chunlao', - trigger:{global:'dying'}, - logTarget:'player', - filter:function(event,player){ - return event.player.getExpansions('twchunlao').length>0; + dying: { + audio: "chunlao", + trigger: { global: "dying" }, + logTarget: "player", + filter: function (event, player) { + return event.player.getExpansions("twchunlao").length > 0; }, - prompt2:(event,player)=>('移去'+get.translation(event.player)+'武将牌上的“醇”并摸一张牌,然后令其回复1点体力'), - check:function(event,player){ - return get.attitude(player,event.player)>0; + prompt2: (event, player) => + "移去" + + get.translation(event.player) + + "武将牌上的“醇”并摸一张牌,然后令其回复1点体力", + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - content:function(){ - var target=trigger.player,cards=target.getExpansions('twchunlao'); - if(cards.length) target.loseToDiscardpile(cards); + content: function () { + var target = trigger.player, + cards = target.getExpansions("twchunlao"); + if (cards.length) target.loseToDiscardpile(cards); player.draw(); target.recover(); }, @@ -12568,4223 +15859,5238 @@ game.import('character', function () { }, }, //张曼成 - twfengji:{ - audio:2, - mahouSkill:true, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return !player.getExpansions('twfengji').length&&!player.hasSkill('twfengji_mahou')&&player.countCards('he'); + twfengji: { + audio: 2, + mahouSkill: true, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ( + !player.getExpansions("twfengji").length && + !player.hasSkill("twfengji_mahou") && + player.countCards("he") + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt2('twfengji')).set('ai',function(card){ - var name=card.name,num=0; - for(var i=0;i0){ - safe++; - next=next.next; + ("step 1"); + if (result.bool) { + player.logSkill("twfengji"); + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("twfengji"); + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = Math.min( + player.getHandcardLimit(), + player.countCards("h", "shan") + ); + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } } - } - return Math.max(2,Math.min(safe,3,game.countPlayer()))-1; - }); - } - else event.finish(); - 'step 2' - player.storage.twfengji_mahou=[result.index+1,result.index+1]; - player.addTempSkill('twfengji_mahou',{player:'die'}); + return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; + }); + } else event.finish(); + ("step 2"); + player.storage.twfengji_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twfengji_mahou", { player: "die" }); }, - marktext:'示', - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + marktext: "示", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - subSkill:{ - mahou:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - var list=player.storage.twfengji_mahou; + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twfengji_mahou; list[1]--; - if(list[1]==0){ - game.log(player,'的“蜂集”魔法生效'); - player.logSkill('twfengji'); - var cards=player.getExpansions('twfengji'); - if(cards.length){ - var cards2=[],num=list[0]; - for(var card of cards){ - for(var i=0;i0; + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return player.getExpansions("twfengji").length > 0; }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.num++; - var cards=player.getExpansions('twfengji'); - if(cards.length) player.loseToDiscardpile(cards); + var cards = player.getExpansions("twfengji"); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{ - halfneg:true, - combo:'twfengji', + ai: { + halfneg: true, + combo: "twfengji", }, }, - twbudao:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - derivation:['twzhouhu','twharvestinori','twzuhuo','twzhouzu','twhuangjin','twguimen','twdidao'], - limited:true, - skillAnimation:true, - animationColor:'metal', - check:function(event,player){ - return !player.hasUnknown()||!player.hasFriend(); + twbudao: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + derivation: [ + "twzhouhu", + "twharvestinori", + "twzuhuo", + "twzhouzu", + "twhuangjin", + "twguimen", + "twdidao", + ], + limited: true, + skillAnimation: true, + animationColor: "metal", + check: function (event, player) { + return !player.hasUnknown() || !player.hasFriend(); }, - skillValue:{ - twzhouhu:(target)=>Math.random()<0.6?0.1:1, - twzuhuo:(target,player)=>get.damageEffect(target,player,player)>0?0.1:1, - twharvestinori:(target)=>0.9+Math.random()/5, - twhuangjin:(target)=>Math.random()/5, - twguimen:(target)=>Math.sqrt(Math.min(3,target.countCards('he',{suit:'spade'})))*0.09, - twzhouzu:(target)=>{ - var rand=Math.random(); - if(rand<0.8) return 1-Math.sqrt(0.8-rand); + skillValue: { + twzhouhu: (target) => (Math.random() < 0.6 ? 0.1 : 1), + twzuhuo: (target, player) => (get.damageEffect(target, player, player) > 0 ? 0.1 : 1), + twharvestinori: (target) => 0.9 + Math.random() / 5, + twhuangjin: (target) => Math.random() / 5, + twguimen: (target) => + Math.sqrt(Math.min(3, target.countCards("he", { suit: "spade" }))) * 0.09, + twzhouzu: (target) => { + var rand = Math.random(); + if (rand < 0.8) return 1 - Math.sqrt(0.8 - rand); return 1; }, - twdidao:(target,player)=>{ - if([target,player].some(current=>current.getSkills().some(skill=>{ - var info=get.info(skill); - if(!info||!info.ai||!info.ai.rejudge) return false; - return true; - }))){ + twdidao: (target, player) => { + if ( + [target, player].some((current) => + current.getSkills().some((skill) => { + var info = get.info(skill); + if (!info || !info.ai || !info.ai.rejudge) return false; + return true; + }) + ) + ) { return 0.05; } - return 0.85+Math.random()/5; - } + return 0.85 + Math.random() / 5; + }, }, - content:function(){ - 'step 0' - player.awakenSkill('twbudao'); + content: function () { + "step 0"; + player.awakenSkill("twbudao"); player.loseMaxHp(); player.recover(); - var skills=lib.skill.twbudao.derivation,map=lib.skill.twbudao.skillValue; - skills=skills.randomGets(3); - var target=game.filterPlayer().sort((a,b)=>get.attitude(player,b)-get.attitude(player,a))[0]; - if(player.identity=='nei'||get.attitude(player,target)<6) target=player; - player.chooseControl(skills).set('choiceList',skills.map(function(i){ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; - })).set('displayIndex',false).set('prompt','布道:选择获得一个技能').set('ai',()=>{ - return _status.event.choice; - }).set('choice',skills.sort((a,b)=>(map[b](target,player)||0.5)-(map[a](target,player)||0.5))[0]); - 'step 1' - var skill=result.control; + var skills = lib.skill.twbudao.derivation, + map = lib.skill.twbudao.skillValue; + skills = skills.randomGets(3); + var target = game + .filterPlayer() + .sort((a, b) => get.attitude(player, b) - get.attitude(player, a))[0]; + if (player.identity == "nei" || get.attitude(player, target) < 6) target = player; + player + .chooseControl(skills) + .set( + "choiceList", + skills.map(function (i) { + return ( + '
    【' + + get.translation( + lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set("prompt", "布道:选择获得一个技能") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + skills.sort( + (a, b) => (map[b](target, player) || 0.5) - (map[a](target, player) || 0.5) + )[0] + ); + ("step 1"); + var skill = result.control; player.addSkills(skill); - event.twbudao_skill=skill; - player.chooseTarget(lib.filter.notMe,'是否令一名其他角色也获得【'+get.translation(skill)+'】?').set('ai',function(target){ - var player=_status.event.player; - if(player.identity=='nei') return 0; - return get.attitude(player,target); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); + event.twbudao_skill = skill; + player + .chooseTarget( + lib.filter.notMe, + "是否令一名其他角色也获得【" + get.translation(skill) + "】?" + ) + .set("ai", function (target) { + var player = _status.event.player; + if (player.identity == "nei") return 0; + return get.attitude(player, target); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); target.addSkills(event.twbudao_skill); - var cards=target.getCards('he'); - if(!cards.length) event.finish(); - else if(cards.length==1) event._result={bool:true,cards:cards}; - else target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌作为学费'); - } - else event.finish(); - 'step 3' - if(result.bool) target.give(result.cards,player); + var cards = target.getCards("he"); + if (!cards.length) event.finish(); + else if (cards.length == 1) event._result = { bool: true, cards: cards }; + else + target.chooseCard( + "he", + true, + "交给" + get.translation(player) + "一张牌作为学费" + ); + } else event.finish(); + ("step 3"); + if (result.bool) target.give(result.cards, player); }, }, - twzhouhu:{ - audio:2, - mahouSkill:true, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return !player.hasSkill('twzhouhu_mahou')&&player.countCards('h',lib.skill.twzhouhu.filterCard)>0; + twzhouhu: { + audio: 2, + mahouSkill: true, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + !player.hasSkill("twzhouhu_mahou") && + player.countCards("h", lib.skill.twzhouhu.filterCard) > 0 + ); }, - filterCard:{color:'red'}, - check:function(card){ - if(_status.event.player.isHealthy()) return 0; - return 7-get.value(card); + filterCard: { color: "red" }, + check: function (card) { + if (_status.event.player.isHealthy()) return 0; + return 7 - get.value(card); }, - content:function(){ - 'step 0' - player.chooseControl('1回合','2回合','3回合').set('prompt','请选择施法时长').set('ai',function(){ - var player=_status.event.player; - var safe=1; - if(safe0){ - safe++; - next=next.next; + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = 1; + if (safe < Math.min(3, game.countPlayer(), player.getDamagedHp())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } } - } - return Math.max(1,Math.min(safe,3,game.countPlayer(),player.getDamagedHp()))-1; - }); - 'step 1' - player.storage.twzhouhu_mahou=[result.index+1,result.index+1]; - player.addTempSkill('twzhouhu_mahou',{player:'die'}); + return ( + Math.max(1, Math.min(safe, 3, game.countPlayer(), player.getDamagedHp())) - 1 + ); + }); + ("step 1"); + player.storage.twzhouhu_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twzhouhu_mahou", { player: "die" }); }, - ai:{ - order:2, - result:{ - player:1, + ai: { + order: 2, + result: { + player: 1, }, }, - subSkill:{ - mahou:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - var list=player.storage.twzhouhu_mahou; + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twzhouhu_mahou; list[1]--; - if(list[1]==0){ - game.log(player,'的“咒护”魔法生效'); - player.logSkill('twzhouhu'); - var num=list[0]; + if (list[1] == 0) { + game.log(player, "的“咒护”魔法生效"); + player.logSkill("twzhouhu"); + var num = list[0]; player.recover(num); - player.removeSkill('twzhouhu_mahou'); - } - else{ - game.log(player,'的“咒护”魔法剩余','#g'+(list[1])+'回合'); - player.markSkill('twzhouhu_mahou'); + player.removeSkill("twzhouhu_mahou"); + } else { + game.log(player, "的“咒护”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twzhouhu_mahou"); } }, - mark:true, - onremove:true, - marktext:'♗', - intro:{ - name:'施法:咒护', - markcount:function(storage){ - if(storage) return storage[1]; + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:咒护", + markcount: function (storage) { + if (storage) return storage[1]; return 0; }, - content:function(storage){ - if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,回复'+storage[0]+'点体力'; + content: function (storage) { + if (storage) { + return ( + "经过" + storage[1] + "个“回合结束时”后,回复" + storage[0] + "点体力" + ); } - return '未指定施法效果'; + return "未指定施法效果"; }, }, }, }, }, - twharvestinori:{ - audio:2, - mahouSkill:true, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return !player.hasSkill('twharvestinori_mahou')&&player.countCards('h',lib.skill.twharvestinori.filterCard)>0; + twharvestinori: { + audio: 2, + mahouSkill: true, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + !player.hasSkill("twharvestinori_mahou") && + player.countCards("h", lib.skill.twharvestinori.filterCard) > 0 + ); }, - filterCard:{color:'black'}, - check:function(card){ - return 8-get.value(card); + filterCard: { color: "black" }, + check: function (card) { + return 8 - get.value(card); }, - content:function(){ - 'step 0' - player.chooseControl('1回合','2回合','3回合').set('prompt','请选择施法时长').set('ai',function(){ - var player=_status.event.player; - var safe=player.hp; - if(safe0){ - safe++; - next=next.next; + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = player.hp; + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } } - } - return Math.max(1,Math.min(safe,3,game.countPlayer()))-1; - }); - 'step 1' - player.storage.twharvestinori_mahou=[result.index+1,result.index+1]; - player.addTempSkill('twharvestinori_mahou',{player:'die'}); + return Math.max(1, Math.min(safe, 3, game.countPlayer())) - 1; + }); + ("step 1"); + player.storage.twharvestinori_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twharvestinori_mahou", { player: "die" }); }, - ai:{ - order:8, - result:{ - player:1, + ai: { + order: 8, + result: { + player: 1, }, }, - subSkill:{ - mahou:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - var list=player.storage.twharvestinori_mahou; + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twharvestinori_mahou; list[1]--; - if(list[1]==0){ - game.log(player,'的“丰祈”魔法生效'); - player.logSkill('twharvestinori'); - var num=list[0]*2; + if (list[1] == 0) { + game.log(player, "的“丰祈”魔法生效"); + player.logSkill("twharvestinori"); + var num = list[0] * 2; player.draw(num); - player.removeSkill('twharvestinori_mahou'); - } - else{ - game.log(player,'的“丰祈”魔法剩余','#g'+(list[1])+'回合'); - player.markSkill('twharvestinori_mahou'); + player.removeSkill("twharvestinori_mahou"); + } else { + game.log(player, "的“丰祈”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twharvestinori_mahou"); } }, - mark:true, - onremove:true, - marktext:'♗', - intro:{ - name:'施法:丰祈', - markcount:function(storage){ - if(storage) return storage[1]; + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:丰祈", + markcount: function (storage) { + if (storage) return storage[1]; return 0; }, - content:function(storage){ - if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,摸'+storage[0]*2+'张牌'; + content: function (storage) { + if (storage) { + return ( + "经过" + storage[1] + "个“回合结束时”后,摸" + storage[0] * 2 + "张牌" + ); } - return '未指定施法效果'; + return "未指定施法效果"; }, }, }, }, }, - twzuhuo:{ - audio:2, - mahouSkill:true, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return !player.hasSkill('twzuhuo_mahou')&&player.countCards('he',lib.skill.twzuhuo.filterCard)>0; + twzuhuo: { + audio: 2, + mahouSkill: true, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + !player.hasSkill("twzuhuo_mahou") && + player.countCards("he", lib.skill.twzuhuo.filterCard) > 0 + ); }, - filterCard:function(card){ - return get.type(card)!='basic'; + filterCard: function (card) { + return get.type(card) != "basic"; }, - position:'he', - check:function(card){ - return 7-get.value(card); + position: "he", + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - 'step 0' - player.chooseControl('1回合','2回合','3回合').set('prompt','请选择施法时长').set('ai',function(){ - var player=_status.event.player; - var safe=Math.min(player.getHandcardLimit(),player.countCards('h','shan')); - if(safe0){ - safe++; - next=next.next; + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = Math.min(player.getHandcardLimit(), player.countCards("h", "shan")); + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } } - } - return Math.max(2,Math.min(safe,3,game.countPlayer()))-1; - }); - 'step 1' - player.storage.twzuhuo_mahou=[result.index+1,result.index+1]; - player.addTempSkill('twzuhuo_mahou',{player:'die'}); + return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; + }); + ("step 1"); + player.storage.twzuhuo_mahou = [result.index + 1, result.index + 1]; + player.addTempSkill("twzuhuo_mahou", { player: "die" }); }, - ai:{ - order:2, - result:{ - player:1, + ai: { + order: 2, + result: { + player: 1, }, }, - subSkill:{ - mahou:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - var list=player.storage.twzuhuo_mahou; + subSkill: { + mahou: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twzuhuo_mahou; list[1]--; - if(list[1]==0){ - game.log(player,'的“阻祸”魔法生效'); - player.logSkill('twzuhuo'); - var num=list[0]; - player.addSkill('twzuhuo_effect'); - player.addMark('twzuhuo_effect',num,false); - player.removeSkill('twzuhuo_mahou'); - } - else{ - game.log(player,'的“阻祸”魔法剩余','#g'+(list[1])+'回合'); - player.markSkill('twzuhuo_mahou'); + if (list[1] == 0) { + game.log(player, "的“阻祸”魔法生效"); + player.logSkill("twzuhuo"); + var num = list[0]; + player.addSkill("twzuhuo_effect"); + player.addMark("twzuhuo_effect", num, false); + player.removeSkill("twzuhuo_mahou"); + } else { + game.log(player, "的“阻祸”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twzuhuo_mahou"); } }, - mark:true, - onremove:true, - marktext:'♗', - intro:{ - name:'施法:阻祸', - markcount:function(storage){ - if(storage) return storage[1]; + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:阻祸", + markcount: function (storage) { + if (storage) return storage[1]; return 0; }, - content:function(storage){ - if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,获得'+storage[0]+'层“防止一次伤害”的效果'; + content: function (storage) { + if (storage) { + return ( + "经过" + + storage[1] + + "个“回合结束时”后,获得" + + storage[0] + + "层“防止一次伤害”的效果" + ); } - return '未指定施法效果'; + return "未指定施法效果"; }, }, }, - effect:{ - charlotte:true, - onremove:true, - trigger:{player:'damageBegin2'}, - forced:true, - filter:function(event,player){ - return player.hasMark('twzuhuo_effect'); + effect: { + charlotte: true, + onremove: true, + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + return player.hasMark("twzuhuo_effect"); }, - content:function(){ + content: function () { trigger.cancel(); - player.removeMark('twzuhuo_effect',1,false); - if(!player.countMark('twzuhuo_effect')) player.removeSkill('twzuhuo_effect'); + player.removeMark("twzuhuo_effect", 1, false); + if (!player.countMark("twzuhuo_effect")) player.removeSkill("twzuhuo_effect"); }, - marktext:'阻︎', - intro:{ - onremove:true, - content:'防止接下来的#次伤害', + marktext: "阻︎", + intro: { + onremove: true, + content: "防止接下来的#次伤害", }, }, }, }, - twzhouzu:{ - audio:2, - enable:'phaseUse', - usable:1, - mahouSkill:true, - filter:function(event,player){ - return !player.hasSkill('twzhouzu_mahou'); + twzhouzu: { + audio: 2, + enable: "phaseUse", + usable: 1, + mahouSkill: true, + filter: function (event, player) { + return !player.hasSkill("twzhouzu_mahou"); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - line:false, - delay:false, - content:function(){ - 'step 0' - player.chooseControl('1回合','2回合','3回合').set('prompt','请选择施法时长').set('ai',function(){ - var player=_status.event.player; - var safe=1; - if(safe0){ - safe++; - next=next.next; + line: false, + delay: false, + content: function () { + "step 0"; + player + .chooseControl("1回合", "2回合", "3回合") + .set("prompt", "请选择施法时长") + .set("ai", function () { + var player = _status.event.player; + var safe = 1; + if (safe < Math.min(3, game.countPlayer())) { + var next = player.next; + while (next != player && get.attitude(next, player) > 0) { + safe++; + next = next.next; + } } - } - return Math.max(2,Math.min(safe,3,game.countPlayer()))-1; - }); - 'step 1' - player.storage.twzhouzu_mahou=[result.index+1,result.index+1,target]; - player.addTempSkill('twzhouzu_mahou',{player:'die'}); + return Math.max(2, Math.min(safe, 3, game.countPlayer())) - 1; + }); + ("step 1"); + player.storage.twzhouzu_mahou = [result.index + 1, result.index + 1, target]; + player.addTempSkill("twzhouzu_mahou", { player: "die" }); }, - subSkill:{ - mahou:{ - trigger:{ - global:'phaseEnd', + subSkill: { + mahou: { + trigger: { + global: "phaseEnd", }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - var list=player.storage.twzhouzu_mahou; + forced: true, + popup: false, + charlotte: true, + content: function () { + var list = player.storage.twzhouzu_mahou; list[1]--; - if(list[1]==0){ - game.log(player,'的“咒诅”魔法生效'); - var num=list[0],target=list[2]; - player.logSkill('twzhouzu',target); - target.chooseToDiscard(get.translation(player)+'对你的“咒诅”魔法生效,请弃置'+get.cnNumber(list[0])+'张牌',list[0],true); - target.damage('thunder'); - player.removeSkill('twzhouzu_mahou'); - } - else{ - game.log(player,'的“咒阻”魔法剩余','#g'+(list[1])+'回合'); - player.markSkill('twzhouzu_mahou'); + if (list[1] == 0) { + game.log(player, "的“咒诅”魔法生效"); + var num = list[0], + target = list[2]; + player.logSkill("twzhouzu", target); + target.chooseToDiscard( + get.translation(player) + + "对你的“咒诅”魔法生效,请弃置" + + get.cnNumber(list[0]) + + "张牌", + list[0], + true + ); + target.damage("thunder"); + player.removeSkill("twzhouzu_mahou"); + } else { + game.log(player, "的“咒阻”魔法剩余", "#g" + list[1] + "回合"); + player.markSkill("twzhouzu_mahou"); } }, - mark:true, - onremove:true, - marktext:'♗', - intro:{ - name:'施法:咒诅', - markcount:function(storage){ - if(storage) return storage[1]; + mark: true, + onremove: true, + marktext: "♗", + intro: { + name: "施法:咒诅", + markcount: function (storage) { + if (storage) return storage[1]; return 0; }, - content:function(storage){ - if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,你令'+get.translation(storage[2])+'弃置'+get.cnNumber(storage[0])+'张牌,然后你对其造成1点雷电伤害'; + content: function (storage) { + if (storage) { + return ( + "经过" + + storage[1] + + "个“回合结束时”后,你令" + + get.translation(storage[2]) + + "弃置" + + get.cnNumber(storage[0]) + + "张牌,然后你对其造成1点雷电伤害" + ); } - return '未指定施法效果'; + return "未指定施法效果"; }, - } + }, }, }, - ai:{ - order:1, - result:{ - target:-5, + ai: { + order: 1, + result: { + target: -5, }, - } + }, }, - twhuangjin:{ - audio:2, - trigger:{target:'useCardToTarget'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return event.card.name=='sha'&&typeof get.number(event.card)=='number'; + twhuangjin: { + audio: 2, + trigger: { target: "useCardToTarget" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.card.name == "sha" && typeof get.number(event.card) == "number"; }, - content:function(){ - 'step 0' - player.judge(function(result){ - var evt=_status.event.getTrigger(); - if(Math.abs(get.number(result)-get.number(evt.card))<=1) return 2; + content: function () { + "step 0"; + player.judge(function (result) { + var evt = _status.event.getTrigger(); + if (Math.abs(get.number(result) - get.number(evt.card)) <= 1) return 2; return -1; - }).judge2=function(result){ + }).judge2 = function (result) { return result.bool; }; - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { trigger.getParent().excluded.add(player); } }, - ai:{ - effect:{ - target:function(card,player,target,current,isLink){ - if(card.name=='sha'&&!isLink) return 0.8; + ai: { + effect: { + target: function (card, player, target, current, isLink) { + if (card.name == "sha" && !isLink) return 0.8; }, }, }, }, - twguimen:{ - audio:2, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + twguimen: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - direct:true, - filter:function(event,player){ - if(event.type!='discard') return false; - var evt=event.getl(player); - for(var card of evt.cards2){ - if(get.suit(card,player)=='spade') return true; + direct: true, + filter: function (event, player) { + if (event.type != "discard") return false; + var evt = event.getl(player); + for (var card of evt.cards2) { + if (get.suit(card, player) == "spade") return true; } return false; }, - forced:true, - content:function(){ - 'step 0' - var cards=[]; - var evt=trigger.getl(player); - for(var card of evt.cards2){ - if(get.suit(card,player)=='spade') cards.push(card); + forced: true, + content: function () { + "step 0"; + var cards = []; + var evt = trigger.getl(player); + for (var card of evt.cards2) { + if (get.suit(card, player) == "spade") cards.push(card); } - if(!cards.length) event.finish(); - else event.cards=cards; - 'step 1' - if(event.cards.length==1){ - event._result={bool:true,links:event.cards}; + if (!cards.length) event.finish(); + else event.cards = cards; + ("step 1"); + if (event.cards.length == 1) { + event._result = { bool: true, links: event.cards }; + } else { + player.chooseButton(["鬼门:选择一张♠牌,为其进行判定", event.cards], true); } - else{ - player.chooseButton(['鬼门:选择一张♠牌,为其进行判定',event.cards],true); - } - 'step 2' - if(result.bool&&result.links){ - event.judgingSpade=result.links[0]; + ("step 2"); + if (result.bool && result.links) { + event.judgingSpade = result.links[0]; event.cards.remove(event.judgingSpade); - game.log(player,'选择','#y'+get.translation(event.judgingSpade),'进行判定'); - player.judge(function(result){ - var card=_status.event.getParent().judgingSpade; - if(Math.abs(get.number(result)-get.number(card))<=1) return 4; + game.log(player, "选择", "#y" + get.translation(event.judgingSpade), "进行判定"); + player.judge(function (result) { + var card = _status.event.getParent().judgingSpade; + if (Math.abs(get.number(result) - get.number(card)) <= 1) return 4; return -1; - }).judge2=function(result){ + }).judge2 = function (result) { return result.bool; }; } else event.finish(); - 'step 3' - if(result.bool&&game.hasPlayer(current=>current!=player)){ - player.chooseTarget('选择一名其他角色,对其造成2点雷电伤害',lib.filter.notMe,true).set('ai',target=>get.damageEffect(target,player,player,'thunder')); + ("step 3"); + if (result.bool && game.hasPlayer((current) => current != player)) { + player + .chooseTarget("选择一名其他角色,对其造成2点雷电伤害", lib.filter.notMe, true) + .set("ai", (target) => get.damageEffect(target, player, player, "thunder")); } - 'step 4' - if(result.bool){ - player.line(result.targets[0],'thunder'); - result.targets[0].damage(2,'thunder'); + ("step 4"); + if (result.bool) { + player.line(result.targets[0], "thunder"); + result.targets[0].damage(2, "thunder"); } - if(event.cards.length) event.goto(1); - } - }, - twdidao:{ - audio:2, - trigger:{global:'judge'}, - filter:function(event,player){ - return player.countCards('hes'); + if (event.cards.length) event.goto(1); }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为' + - get.translation(trigger.player.judging[0])+','+get.prompt('twdidao'),'hes',function(card){ - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0){ - if(trigger.player!=player) return 0; - var checkx=get.color(card,player)==get.color(judging); - if(checkx>0) return checkx; + }, + twdidao: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + return player.countCards("hes"); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("twdidao"), + "hes", + function (card) { + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) { + if (trigger.player != player) return 0; + var checkx = get.color(card, player) == get.color(judging); + if (checkx > 0) return checkx; return 0; } - return result*(attitude>0?1:-1); - }).set('judging',trigger.player.judging[0]); - 'step 1' - if(result.bool){ - player.respond(result.cards,'highlight','twdidao','noOrdering'); - } - else{ + return result * (attitude > 0 ? 1 : -1); + }) + .set("judging", trigger.player.judging[0]); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "twdidao", "noOrdering"); + } else { event.finish(); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { player.$gain2(trigger.player.judging[0]); player.gain(trigger.player.judging[0]); - var card=result.cards[0]; - if(get.color(card,player)==get.color(trigger.player.judging[0])) player.draw('nodelay'); - trigger.player.judging[0]=result.cards[0]; + var card = result.cards[0]; + if (get.color(card, player) == get.color(trigger.player.judging[0])) + player.draw("nodelay"); + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); } - 'step 3' + ("step 3"); game.delay(2); }, - ai:{ - rejudge:true, - tag:{ - rejudge:1 - } - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, }, //群曹操 - twlingfa:{ - audio:2, - trigger:{global:'roundStart'}, - direct:true, - content:function(){ - 'step 0' - if(game.roundNumber<3||!player.hasSkill('twlingfa')){ + twlingfa: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + if (game.roundNumber < 3 || !player.hasSkill("twlingfa")) { var str; - switch(game.roundNumber){ - case 1:str='获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。';break; - case 2:str='获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。';break; - default:str='失去【令法】并获得【治暗】';break; - } - player.chooseBool(get.prompt('twlingfa'),str); - } - else event._result={bool:true}; - 'step 1' - if(result.bool){ - switch(game.roundNumber){ + switch (game.roundNumber) { case 1: - player.logSkill('twlingfa',game.filterPlayer((current)=>current!=player).sortBySeat()); - player.addTempSkill('twlingfa_sha','roundStart'); + str = + "获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。"; break; case 2: - player.logSkill('twlingfa',game.filterPlayer((current)=>current!=player).sortBySeat()); - player.addTempSkill('twlingfa_tao','roundStart'); + str = + "获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。"; break; default: - player.logSkill('twlingfa'); - player.addSkills(['twzhian'],['twlingfa']); + str = "失去【令法】并获得【治暗】"; + break; + } + player.chooseBool(get.prompt("twlingfa"), str); + } else event._result = { bool: true }; + ("step 1"); + if (result.bool) { + switch (game.roundNumber) { + case 1: + player.logSkill( + "twlingfa", + game.filterPlayer((current) => current != player).sortBySeat() + ); + player.addTempSkill("twlingfa_sha", "roundStart"); + break; + case 2: + player.logSkill( + "twlingfa", + game.filterPlayer((current) => current != player).sortBySeat() + ); + player.addTempSkill("twlingfa_tao", "roundStart"); + break; + default: + player.logSkill("twlingfa"); + player.addSkills(["twzhian"], ["twlingfa"]); break; } } }, - subSkill:{ - sha:{ - audio:'twlingfa', - trigger:{global:'useCard'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return player!=event.player&&event.card.name=='sha'&&event.player.countCards('he')>0; + subSkill: { + sha: { + audio: "twlingfa", + trigger: { global: "useCard" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return ( + player != event.player && + event.card.name == "sha" && + event.player.countCards("he") > 0 + ); }, - logTarget:'player', - content:function(){ - 'step 0' + logTarget: "player", + content: function () { + "step 0"; game.delayx(); - trigger.player.chooseToDiscard('he','令法:弃置一张牌,或受到来自'+get.translation(player)+'的1点伤害').set('goon',get.damageEffect(trigger.player,player,trigger.player)<0).set('ai',function(card){ - if(!_status.event.goon) return 0; - return 8-get.value(card); - }); - 'step 1' - if(!result.bool){ + trigger.player + .chooseToDiscard( + "he", + "令法:弃置一张牌,或受到来自" + get.translation(player) + "的1点伤害" + ) + .set("goon", get.damageEffect(trigger.player, player, trigger.player) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 8 - get.value(card); + }); + ("step 1"); + if (!result.bool) { trigger.player.damage(); } }, - mark:true, - marktext:'', - intro:{content:'其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。'}, + mark: true, + marktext: '', + intro: { + content: + "其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。", + }, }, - tao:{ - audio:'twlingfa', - trigger:{global:'useCard'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return player!=event.player&&event.card.name=='tao'&&event.player.countCards('he')>0; + tao: { + audio: "twlingfa", + trigger: { global: "useCard" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return ( + player != event.player && + event.card.name == "tao" && + event.player.countCards("he") > 0 + ); }, - logTarget:'player', - content:function(){ - 'step 0' + logTarget: "player", + content: function () { + "step 0"; game.delayx(); - trigger.player.chooseCard('he','令法:交给'+get.translation(player)+'一张牌,否则受到来自其的1点伤害').set('goon',get.damageEffect(trigger.player,player,trigger.player)<0).set('ai',function(card){ - if(!_status.event.goon) return 0; - return 8-get.value(card); - }); - 'step 1' - if(!result.bool){ + trigger.player + .chooseCard( + "he", + "令法:交给" + get.translation(player) + "一张牌,否则受到来自其的1点伤害" + ) + .set("goon", get.damageEffect(trigger.player, player, trigger.player) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 8 - get.value(card); + }); + ("step 1"); + if (!result.bool) { trigger.player.damage(); - } - else trigger.player.give(result.cards,player); + } else trigger.player.give(result.cards, player); + }, + mark: true, + marktext: '', + intro: { + content: + "其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。", }, - mark:true, - marktext:'', - intro:{content:'其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。'}, }, }, - derivation:'twzhian', + derivation: "twzhian", }, - twzhian:{ - audio:2, - init:function(player){ - game.addGlobalSkill('twzhian_ai'); + twzhian: { + audio: 2, + init: function (player) { + game.addGlobalSkill("twzhian_ai"); }, - onremove:function(player){ - if(!game.hasPlayer((current)=>current.hasSkill('twzhian'),true)) game.removeGlobalSkill('twzhian_ai'); + onremove: function (player) { + if (!game.hasPlayer((current) => current.hasSkill("twzhian"), true)) + game.removeGlobalSkill("twzhian_ai"); }, - usable:1, - trigger:{global:'useCardAfter'}, - direct:true, - filter:function(event,player){ - var type=get.type(event.card); - if(type!='delay'&&type!='equip') return false; - if(event.cards.length!=1) return false; - var position=get.position(event.cards[0]); - if(position=='e'||position=='j') return true; + usable: 1, + trigger: { global: "useCardAfter" }, + direct: true, + filter: function (event, player) { + var type = get.type(event.card); + if (type != "delay" && type != "equip") return false; + if (event.cards.length != 1) return false; + var position = get.position(event.cards[0]); + if (position == "e" || position == "j") return true; return event.player.isIn(); }, - content:function(){ - 'step 0' - var str=get.translation(trigger.cards[0]),owner=get.owner(trigger.cards[0]); - var choiceList=[ - '弃置'+(owner?(get.translation(owner)+'区域内的'):'')+str, - '弃置一张手牌并获得'+str, - '对'+get.translation(trigger.player)+'造成1点伤害', + content: function () { + "step 0"; + var str = get.translation(trigger.cards[0]), + owner = get.owner(trigger.cards[0]); + var choiceList = [ + "弃置" + (owner ? get.translation(owner) + "区域内的" : "") + str, + "弃置一张手牌并获得" + str, + "对" + get.translation(trigger.player) + "造成1点伤害", ]; - var choices=[]; - if(owner&&lib.filter.canBeDiscarded(card,player,owner)) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(owner&&player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'twzhian'); - },'h')&&lib.filter.canBeGained(card,player,owner)) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(trigger.player.isIn()) choices.push('选项三'); - else choiceList[2]=''+choiceList[2]+''; - player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('twzhian')).set('ai',function(){ - var player=_status.event.player,choices=_status.event.controls.slice(0); - var card=_status.event.getTrigger().cards[0],owner=get.owner(card); - var getEffect=function(choice){ - if(choice=='cancel2') return 0.1; - if(choice=='选项三'){ - return get.damageEffect(_status.event.getTrigger().player,player,player); - } - var result; - if(get.position(card)=='j'){ - result=-get.effect(player,{ - name:card.viewAs||card.name, - cards:[card], - },player,player)*get.sgn(get.attitude(player,owner)); - } - else result=-(get.value(card,owner)-0.01)*get.sgn(get.attitude(player,owner)); - if(choice=='选项一') return result; - if(player.hasCard(function(cardx){ - return lib.filter.cardDiscardable(cardx,player,'twzhian')&&get.value(cardx,player)"; + if ( + owner && + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "twzhian"); + }, "h") && + lib.filter.canBeGained(card, player, owner) + ) + choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (trigger.player.isIn()) choices.push("选项三"); + else choiceList[2] = '' + choiceList[2] + ""; + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("twzhian")) + .set("ai", function () { + var player = _status.event.player, + choices = _status.event.controls.slice(0); + var card = _status.event.getTrigger().cards[0], + owner = get.owner(card); + var getEffect = function (choice) { + if (choice == "cancel2") return 0.1; + if (choice == "选项三") { + return get.damageEffect( + _status.event.getTrigger().player, + player, + player + ); + } + var result; + if (get.position(card) == "j") { + result = + -get.effect( + player, + { + name: card.viewAs || card.name, + cards: [card], + }, + player, + player + ) * get.sgn(get.attitude(player, owner)); + } else + result = + -(get.value(card, owner) - 0.01) * + get.sgn(get.attitude(player, owner)); + if (choice == "选项一") return result; + if ( + player.hasCard(function (cardx) { + return ( + lib.filter.cardDiscardable(cardx, player, "twzhian") && + get.value(cardx, player) < get.value(card, player) + ); + }, "h") + ) + return result * 1.2; + return 0; + }; + choices.sort(function (a, b) { + return getEffect(b) - getEffect(a); + }); + return choices[0]; }); - return choices[0]; - }); - 'step 1' - if(result.control!='cancel2'){ - var card=trigger.cards[0],owner=get.owner(card); - switch(result.control){ - case '选项一': - player.logSkill('twzhian',owner); - owner.discard(card,'notBySelf'); + ("step 1"); + if (result.control != "cancel2") { + var card = trigger.cards[0], + owner = get.owner(card); + switch (result.control) { + case "选项一": + player.logSkill("twzhian", owner); + owner.discard(card, "notBySelf"); event.finish(); break; - case '选项二': - player.chooseToDiscard('h',true).logSkill=['twzhian',owner]; - event.target=owner; + case "选项二": + player.chooseToDiscard("h", true).logSkill = ["twzhian", owner]; + event.target = owner; break; - case '选项三': - player.logSkill('twzhian',trigger.player); + case "选项三": + player.logSkill("twzhian", trigger.player); trigger.player.damage(); event.finish(); break; } - } - else player.storage.counttrigger.twzhian--; - 'step 2' - if(result.bool&&target.getCards('ej').includes(trigger.cards[0])) player.gain(trigger.cards,target,'give','bySelf'); + } else player.storage.counttrigger.twzhian--; + ("step 2"); + if (result.bool && target.getCards("ej").includes(trigger.cards[0])) + player.gain(trigger.cards, target, "give", "bySelf"); }, - subSkill:{ - ai:{ - trigger:{player:'dieAfter'}, - filter:function(event,player){ - return !game.hasPlayer((current)=>current.hasSkill('twzhian'),true); + subSkill: { + ai: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer((current) => current.hasSkill("twzhian"), true); }, - silent:true, - forceDie:true, - content:function(){ - game.removeGlobalSkill('twzhian_ai'); + silent: true, + forceDie: true, + content: function () { + game.removeGlobalSkill("twzhian_ai"); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(get.type(card)!=='delay'&&get.type(card)!=='equip') return 1; - let za=game.findPlayer((cur)=>cur.hasSkill('twzhian')&&(!cur.storage.counttrigger||!cur.storage.counttrigger.twzhian)&&get.attitude(player,cur)<=0); - if(za) return [0.5,-0.8]; - } - } - } - } - } + ai: { + effect: { + player: function (card, player, target) { + if (get.type(card) !== "delay" && get.type(card) !== "equip") return 1; + let za = game.findPlayer( + (cur) => + cur.hasSkill("twzhian") && + (!cur.storage.counttrigger || + !cur.storage.counttrigger.twzhian) && + get.attitude(player, cur) <= 0 + ); + if (za) return [0.5, -0.8]; + }, + }, + }, + }, + }, }, - twyujue:{ - audio:2, - global:'twyujue_give', - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + twyujue: { + audio: 2, + global: "twyujue_give", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - direct:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - var cards=event.getg(player); - if(!cards.length) return false; - return game.hasPlayer(function(current){ - if(current==player) return false; - var evt=event.getl(current); - if(!evt||!evt.cards2||!evt.cards2.filter((card)=>cards.includes(card)).length) return false; - return (!current.hasSkill('twyujue_effect0'))||(!current.hasSkill('twyujue_effect1')); - }) + direct: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + var cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer(function (current) { + if (current == player) return false; + var evt = event.getl(current); + if (!evt || !evt.cards2 || !evt.cards2.filter((card) => cards.includes(card)).length) + return false; + return !current.hasSkill("twyujue_effect0") || !current.hasSkill("twyujue_effect1"); + }); }, - content:function(){ - 'step 0' - var cards=trigger.getg(player); - var list=game.filterPlayer(function(current){ - if(current==player) return false; - var evt=trigger.getl(current); - if(!evt||!evt.cards2||!evt.cards2.filter((card)=>cards.includes(card)).length) return false; - return (!current.hasSkill('twyujue_effect0'))||(!current.hasSkill('twyujue_effect1')); - }).sortBySeat(); - event.targets=list; - 'step 1' - var target=event.targets.shift(); - if(target.isIn()){ - event.target=target; - var num=2; - if(target.hasSkill('twyujue_effect0')) num--; - if(target.hasSkill('twyujue_effect1')) num--; - var cards=trigger.getg(player); - num=Math.min(num,trigger.getl(target).cards2.filter(i=>cards.includes(i)).length); - if(num>0) event.count=num; - else if(targets.length>0) event.redo(); + content: function () { + "step 0"; + var cards = trigger.getg(player); + var list = game + .filterPlayer(function (current) { + if (current == player) return false; + var evt = trigger.getl(current); + if ( + !evt || + !evt.cards2 || + !evt.cards2.filter((card) => cards.includes(card)).length + ) + return false; + return ( + !current.hasSkill("twyujue_effect0") || !current.hasSkill("twyujue_effect1") + ); + }) + .sortBySeat(); + event.targets = list; + ("step 1"); + var target = event.targets.shift(); + if (target.isIn()) { + event.target = target; + var num = 2; + if (target.hasSkill("twyujue_effect0")) num--; + if (target.hasSkill("twyujue_effect1")) num--; + var cards = trigger.getg(player); + num = Math.min( + num, + trigger.getl(target).cards2.filter((i) => cards.includes(i)).length + ); + if (num > 0) event.count = num; + else if (targets.length > 0) event.redo(); else event.finish(); - } - else if(targets.length>0) event.redo(); + } else if (targets.length > 0) event.redo(); else event.finish(); - 'step 2' + ("step 2"); event.count--; - player.chooseBool(get.prompt('twyujue',target),'可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。').set('ai',function(){ - var evt=_status.event.getParent(); - return get.attitude(evt.player,evt.target)>0; - }); - 'step 3' - if(result.bool){ - player.logSkill('twyujue',target); - var list=[0,1]; - if(target.hasSkill('twyujue_effect0')) list.remove(0); - if(target.hasSkill('twyujue_effect1')) list.remove(1); - if(!list.length) event.goto(6); - else if(list.length==1) event._result={index:list[0]}; - else target.chooseControl().set('choiceList',['弃置攻击范围内一名角色的一张牌','下一次使用牌时,从牌堆中获得一张同类别的牌']).set('ai',function(){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return player.inRange(current)&¤t.countDiscardableCards(player,'he')>0&&get.effect(current,{name:'guohe_copy2'},player,player)>0; - })) return 0; - return 1; + player + .chooseBool( + get.prompt("twyujue", target), + "可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。" + ) + .set("ai", function () { + var evt = _status.event.getParent(); + return get.attitude(evt.player, evt.target) > 0; }); + ("step 3"); + if (result.bool) { + player.logSkill("twyujue", target); + var list = [0, 1]; + if (target.hasSkill("twyujue_effect0")) list.remove(0); + if (target.hasSkill("twyujue_effect1")) list.remove(1); + if (!list.length) event.goto(6); + else if (list.length == 1) event._result = { index: list[0] }; + else + target + .chooseControl() + .set("choiceList", [ + "弃置攻击范围内一名角色的一张牌", + "下一次使用牌时,从牌堆中获得一张同类别的牌", + ]) + .set("ai", function () { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return ( + player.inRange(current) && + current.countDiscardableCards(player, "he") > 0 && + get.effect(current, { name: "guohe_copy2" }, player, player) > + 0 + ); + }) + ) + return 0; + return 1; + }); + } else event.goto(6); + ("step 4"); + target.addTempSkill("twyujue_effect" + result.index); + if (result.index == 0) { + if ( + game.hasPlayer(function (current) { + return ( + target.inRange(current) && current.countDiscardableCards(target, "he") > 0 + ); + }) + ) { + target + .chooseTarget( + "弃置攻击范围内一名角色的一张牌", + true, + function (card, player, target) { + return ( + player.inRange(target) && + target.countDiscardableCards(player, "he") > 0 + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + } else event.goto(6); + } else event.goto(6); + ("step 5"); + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2, "green"); + target.discardPlayerCard(target2, "he", true); } - else event.goto(6); - 'step 4' - target.addTempSkill('twyujue_effect'+result.index); - if(result.index==0){ - if(game.hasPlayer(function(current){ - return target.inRange(current)&¤t.countDiscardableCards(target,'he')>0; - })){ - target.chooseTarget('弃置攻击范围内一名角色的一张牌',true,function(card,player,target){ - return player.inRange(target)&&target.countDiscardableCards(player,'he')>0; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player) - }); - } - else event.goto(6); - } - else event.goto(6); - 'step 5' - if(result.bool){ - var target2=result.targets[0]; - target.line(target2,'green'); - target.discardPlayerCard(target2,'he',true); - } - 'step 6' + ("step 6"); game.delayx(); - if(event.count>0) event.goto(2); - else if(targets.length) event.goto(1); + if (event.count > 0) event.goto(2); + else if (targets.length) event.goto(1); }, - subSkill:{ - clear:{ - onremove:true, + subSkill: { + clear: { + onremove: true, }, - effect0:{charlotte:true}, - effect1:{ - charlotte:true, - trigger:{player:'useCard'}, - usable:1, - forced:true, - popup:false, - content:function(){ - player.unmarkSkill('twyujue_effect1'); - var type2=get.type2(trigger.card,false); - var card=get.cardPile2(function(card){ - return get.type2(card,false)==type2; + effect0: { charlotte: true }, + effect1: { + charlotte: true, + trigger: { player: "useCard" }, + usable: 1, + forced: true, + popup: false, + content: function () { + player.unmarkSkill("twyujue_effect1"); + var type2 = get.type2(trigger.card, false); + var card = get.cardPile2(function (card) { + return get.type2(card, false) == type2; }); - if(card) trigger.player.gain(card,'gain2'); + if (card) trigger.player.gain(card, "gain2"); }, - mark:true, - marktext:'爵', - intro:{content:'使用下一张牌时,从牌堆中获得一张类型相同的牌'}, + mark: true, + marktext: "爵", + intro: { content: "使用下一张牌时,从牌堆中获得一张类型相同的牌" }, }, }, }, - twyujue_give:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(!player.countCards('he')) return false; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('twyujue'); + twyujue_give: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (!player.countCards("he")) return false; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twyujue"); }); - if(!targets.length) return false; - for(var target of targets){ - var num=2; - if(player.group=='qun'&&target.hasZhuSkill('twfengqi',player)) num=4; - if(target.countMark('twyujue_clear')=Math.max(1,ui.selected.cards.length); + filterCard: true, + filterTarget: function (card, player, target) { + if (!target.hasSkill("twyujue")) return false; + var num = 2; + if (player.group == "qun" && target.hasZhuSkill("twfengqi", player)) num = 4; + return num - target.countMark("twyujue_clear") >= Math.max(1, ui.selected.cards.length); }, - selectTarget:function(){ - var player=_status.event.player; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('twyujue'); + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twyujue"); }); - return targets.length>1?1:-1; + return targets.length > 1 ? 1 : -1; }, - complexSelect:true, - prompt:function(){ - var player=_status.event.player; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('twyujue'); + complexSelect: true, + prompt: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("twyujue"); }); - return '将任意张牌交给'+get.translation(targets)+(targets.length>1?'中的一人':''); + return ( + "将任意张牌交给" + get.translation(targets) + (targets.length > 1 ? "中的一人" : "") + ); }, - position:'he', - discard:false, - lose:false, - delay:false, - check:function(card){ - if(ui.selected.cards.length) return 0; - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return lib.skill.twyujue_give.filterTarget(null,player,current)&&get.attitude(player,current)>0; - })){ - var val=get.value(card); - if(val<=0&&get.position(card)=='e') return 100-val; - if(!player.hasSkill('twyujue_effect1')&&player.hasCard(function(cardx){ - return cardx!=card&&player.getUseValue(cardx,null,true)>0; - },'hs')) return 6-get.value(card); - if(!player.hasSkill('twyujue_effect0')&&game.hasPlayer(function(current){ - return player.inRange(current)&¤t.countDiscardableCards(player,'he')>0&&get.effect(current,{name:'guohe_copy2'},player,player)>0; - })) return 5.5-get.value(card); + position: "he", + discard: false, + lose: false, + delay: false, + check: function (card) { + if (ui.selected.cards.length) return 0; + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return ( + lib.skill.twyujue_give.filterTarget(null, player, current) && + get.attitude(player, current) > 0 + ); + }) + ) { + var val = get.value(card); + if (val <= 0 && get.position(card) == "e") return 100 - val; + if ( + !player.hasSkill("twyujue_effect1") && + player.hasCard(function (cardx) { + return cardx != card && player.getUseValue(cardx, null, true) > 0; + }, "hs") + ) + return 6 - get.value(card); + if ( + !player.hasSkill("twyujue_effect0") && + game.hasPlayer(function (current) { + return ( + player.inRange(current) && + current.countDiscardableCards(player, "he") > 0 && + get.effect(current, { name: "guohe_copy2" }, player, player) > 0 + ); + }) + ) + return 5.5 - get.value(card); } return 0; }, - content:function(){ - game.trySkillAudio('twyujue',target); - player.give(cards,target); - target.addTempSkill('twyujue_clear'); - target.addMark('twyujue_clear',cards.length,false); + content: function () { + game.trySkillAudio("twyujue", target); + player.give(cards, target); + target.addTempSkill("twyujue_clear"); + target.addMark("twyujue_clear", cards.length, false); }, - ai:{ - order:10, - result:{target:1}, + ai: { + order: 10, + result: { target: 1 }, }, }, - twgezhi:{ - audio:2, - trigger:{player:'useCard'}, - direct:true, - filter:function(event,player){ - if(!player.countCards('h')) return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - var type=get.type2(event.card,false); - return !player.hasHistory('useCard',function(evtx){ - return evtx!=event&&get.type2(evtx.card,false)==type&&evtx.getParent('phaseUse')==evt; - },event); + twgezhi: { + audio: 2, + trigger: { player: "useCard" }, + direct: true, + filter: function (event, player) { + if (!player.countCards("h")) return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var type = get.type2(event.card, false); + return !player.hasHistory( + "useCard", + function (evtx) { + return ( + evtx != event && + get.type2(evtx.card, false) == type && + evtx.getParent("phaseUse") == evt + ); + }, + event + ); }, - content:function(){ - 'step 0' - if(!event.isMine()&&!event.isOnline()) game.delayx(); - player.chooseCard('是否发动【革制】重铸一张牌?',lib.filter.cardRecastable).set('ai',function(card){ - return 5.5-get.value(card); - }); - 'step 1' - if(result.bool){ - player.logSkill('twgezhi'); + content: function () { + "step 0"; + if (!event.isMine() && !event.isOnline()) game.delayx(); + player + .chooseCard("是否发动【革制】重铸一张牌?", lib.filter.cardRecastable) + .set("ai", function (card) { + return 5.5 - get.value(card); + }); + ("step 1"); + if (result.bool) { + player.logSkill("twgezhi"); player.recast(result.cards); } }, - group:'twgezhi_buff', - subSkill:{ - buff:{ - audio:'twgezhi', - trigger:{player:'phaseUseEnd'}, - direct:true, - filter:function(event,player){ - return player.getHistory('lose',function(evt){ - return evt.getParent(3).name=='twgezhi'&&evt.getParent('phaseUse')==event; - }).length>1; + group: "twgezhi_buff", + subSkill: { + buff: { + audio: "twgezhi", + trigger: { player: "phaseUseEnd" }, + direct: true, + filter: function (event, player) { + return ( + player.getHistory("lose", function (evt) { + return ( + evt.getParent(3).name == "twgezhi" && + evt.getParent("phaseUse") == event + ); + }).length > 1 + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('twgezhi'),'你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。',function(card,player,target){ - return !target.hasSkill('twgezhi_选项一')||!target.hasSkill('twgezhi_选项二')||!target.hasSkill('twgezhi_选项三'); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('twgezhi',target); - var list=[]; - for(var i=1;i<=3;i++){ - var str='选项'+get.cnNumber(i,true); - if(!target.hasSkill('twgezhi_'+str)) list.push(str); - } - if(list.length==1) event._result={control:list[0]}; - else target.chooseControl(list).set('choiceList',['令自己的攻击范围+2','令自己的手牌上限+2','令自己的体力上限+1']).set('ai',function(){ - var player=_status.event.player,controls=_status.event.controls; - if(controls.includes('选项一')&&game.hasPlayer(function(current){ - return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current,'attack')>1; - })) return '选项一'; - if(controls.includes('选项二')&&player.needsToDiscard()) return '选项二'; - if(controls.includes('选项三')) return '选项三'; - return controls.randomGet(); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("twgezhi"), + "你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。", + function (card, player, target) { + return ( + !target.hasSkill("twgezhi_选项一") || + !target.hasSkill("twgezhi_选项二") || + !target.hasSkill("twgezhi_选项三") + ); + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); }); - } - else{ - event._triggered=null; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("twgezhi", target); + var list = []; + for (var i = 1; i <= 3; i++) { + var str = "选项" + get.cnNumber(i, true); + if (!target.hasSkill("twgezhi_" + str)) list.push(str); + } + if (list.length == 1) event._result = { control: list[0] }; + else + target + .chooseControl(list) + .set("choiceList", [ + "令自己的攻击范围+2", + "令自己的手牌上限+2", + "令自己的体力上限+1", + ]) + .set("ai", function () { + var player = _status.event.player, + controls = _status.event.controls; + if ( + controls.includes("选项一") && + game.hasPlayer(function (current) { + return ( + (get.realAttitude || get.attitude)(player, current) < + 0 && get.distance(player, current, "attack") > 1 + ); + }) + ) + return "选项一"; + if (controls.includes("选项二") && player.needsToDiscard()) + return "选项二"; + if (controls.includes("选项三")) return "选项三"; + return controls.randomGet(); + }); + } else { + event._triggered = null; event.finish(); } - 'step 2' - target.addSkill('twgezhi_'+result.control); - if(result.control=='选项三') target.gainMaxHp(); - 'step 3' + ("step 2"); + target.addSkill("twgezhi_" + result.control); + if (result.control == "选项三") target.gainMaxHp(); + ("step 3"); game.delayx(); }, }, - 选项一:{ - charlotte:true, - mod:{ - attackFrom:function(from,to,distance){ - return distance-2; + 选项一: { + charlotte: true, + mod: { + attackFrom: function (from, to, distance) { + return distance - 2; }, }, - mark:true, - marktext:' +2 ', - intro:{content:'攻击范围+2'}, + mark: true, + marktext: " +2 ", + intro: { content: "攻击范围+2" }, }, - 选项二:{ - charlotte:true, - mod:{ - maxHandcard:function(player,num){ - return num+2; + 选项二: { + charlotte: true, + mod: { + maxHandcard: function (player, num) { + return num + 2; }, }, - mark:true, - marktext:' +2 ', - intro:{content:'手牌上限+2'}, + mark: true, + marktext: " +2 ", + intro: { content: "手牌上限+2" }, }, - 选项三:{ - charlotte:true, - mark:true, - marktext:' +1 ', - intro:{content:'体力上限+1'}, + 选项三: { + charlotte: true, + mark: true, + marktext: " +1 ", + intro: { content: "体力上限+1" }, }, }, }, - twfengqi:{ - audio:2, - zhuSkill:true, - trigger:{player:'twgezhi_buffAfter'}, - direct:true, - filter:function(event,player){ - if(!event.target||!event.target.isIn()||!player.hasZhuSkill('twfengqi',event.target)) return false; - var target=event.target; - return target.getStockSkills(true,true).some(skill=>{ - if(target.hasSkill(skill)) return false; - var info=get.info(skill); - return info&&info.zhuSkill; + twfengqi: { + audio: 2, + zhuSkill: true, + trigger: { player: "twgezhi_buffAfter" }, + direct: true, + filter: function (event, player) { + if ( + !event.target || + !event.target.isIn() || + !player.hasZhuSkill("twfengqi", event.target) + ) + return false; + var target = event.target; + return target.getStockSkills(true, true).some((skill) => { + if (target.hasSkill(skill)) return false; + var info = get.info(skill); + return info && info.zhuSkill; }); }, - skillAnimation:true, - animationColor:'thunder', - content:function(){ - 'step 0' - event.target=trigger.target; - event.target.chooseBool(get.prompt('twfengqi'),'获得武将牌上的所有主公技'); - 'step 1' - if(result.bool){ - target.logSkill('twfengqi',player); - var skills=target.getStockSkills(true,true).filter(skill=>{ - if(target.hasSkill(skill)) return false; - var info=get.info(skill); - return info&&info.zhuSkill; + skillAnimation: true, + animationColor: "thunder", + content: function () { + "step 0"; + event.target = trigger.target; + event.target.chooseBool(get.prompt("twfengqi"), "获得武将牌上的所有主公技"); + ("step 1"); + if (result.bool) { + target.logSkill("twfengqi", player); + var skills = target.getStockSkills(true, true).filter((skill) => { + if (target.hasSkill(skill)) return false; + var info = get.info(skill); + return info && info.zhuSkill; }); target.addSkills(skills); //for(var i of skills) target.addSkillLog(i); } }, }, - twsidai:{ - audio:2, - enable:'phaseUse', - usable:1, - locked:false, - limited:true, - skillAnimation:true, - animationColor:'fire', - filter:function(event,player){ - var cards=player.getCards('h',{type:'basic'}); - if(!cards.length) return false; - for(var i of cards){ - if(!game.checkMod(i,player,'unchanged','cardEnabled2',player)) return false; + twsidai: { + audio: 2, + enable: "phaseUse", + usable: 1, + locked: false, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + var cards = player.getCards("h", { type: "basic" }); + if (!cards.length) return false; + for (var i of cards) { + if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false; } - return event.filterCard(get.autoViewAs({name:'sha',storage:{twsidai:true}},cards),player,event); + return event.filterCard( + get.autoViewAs({ name: "sha", storage: { twsidai: true } }, cards), + player, + event + ); }, - viewAs:{name:'sha',storage:{twsidai:true}}, - filterCard:{type:'basic'}, - selectCard:-1, - check:()=>1, - onuse:function(result,player){ - player.awakenSkill('twsidai'); - player.addTempSkill('twsidai_effect'); + viewAs: { name: "sha", storage: { twsidai: true } }, + filterCard: { type: "basic" }, + selectCard: -1, + check: () => 1, + onuse: function (result, player) { + player.awakenSkill("twsidai"); + player.addTempSkill("twsidai_effect"); }, - ai:{ - order:2.9, - result:{ - target:function(player,target){ - var cards=ui.selected.cards.slice(0); - var names=[]; - for(var i of cards) names.add(i.name); - if(names.length=0) return -20; - return lib.card.sha.ai.result.target.apply(this,arguments); + ai: { + order: 2.9, + result: { + target: function (player, target) { + var cards = ui.selected.cards.slice(0); + var names = []; + for (var i of cards) names.add(i.name); + if (names.length < player.hp) return 0; + if (player.hasUnknown() && (player.identity != "fan" || !target.isZhu)) return 0; + if (get.attitude(player, target) >= 0) return -20; + return lib.card.sha.ai.result.target.apply(this, arguments); }, }, }, - mod:{ - cardUsable:function(card){ - if(card.storage&&card.storage.twsidai) return Infinity; + mod: { + cardUsable: function (card) { + if (card.storage && card.storage.twsidai) return Infinity; }, - targetInRange:function(card){ - if(card.storage&&card.storage.twsidai) return true; + targetInRange: function (card) { + if (card.storage && card.storage.twsidai) return true; }, }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.twsidai||event.getParent().type!='card') return false; - for(var i of event.cards){ - if(i.name=='jiu') return true; + subSkill: { + effect: { + charlotte: true, + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + if ( + !event.card || + !event.card.storage || + !event.card.storage.twsidai || + event.getParent().type != "card" + ) + return false; + for (var i of event.cards) { + if (i.name == "jiu") return true; } return false; }, - forced:true, - popup:false, - content:function(){ - trigger.num*=2; - game.log(trigger.card,'的伤害值','#y×2'); + forced: true, + popup: false, + content: function () { + trigger.num *= 2; + game.log(trigger.card, "的伤害值", "#y×2"); }, - group:['twsidai_tao','twsidai_shan'], + group: ["twsidai_tao", "twsidai_shan"], }, - tao:{ - trigger:{source:'damageSource'}, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.twsidai||!event.player.isIn()) return false; - for(var i of event.cards){ - if(i.name=='tao') return true; + tao: { + trigger: { source: "damageSource" }, + filter: function (event, player) { + if ( + !event.card || + !event.card.storage || + !event.card.storage.twsidai || + !event.player.isIn() + ) + return false; + for (var i of event.cards) { + if (i.name == "tao") return true; } return false; }, - forced:true, - popup:false, - content:function(){ + forced: true, + popup: false, + content: function () { trigger.player.loseMaxHp(); }, }, - shan:{ - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.twsidai||!event.target.isIn()) return false; - for(var i of event.cards){ - if(i.name=='shan') return true; + shan: { + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if ( + !event.card || + !event.card.storage || + !event.card.storage.twsidai || + !event.target.isIn() + ) + return false; + for (var i of event.cards) { + if (i.name == "shan") return true; } return false; }, - forced:true, - popup:false, - content:function(){ - 'step 0' - trigger.target.chooseToDiscard('h',{type:'basic'},'弃置一张基本牌,否则不能响应'+get.translation(trigger.card)).set('ai',function(card){ - var player=_status.event.player; - if(player.hasCard('hs',function(cardx){ - return cardx!=card&&get.name(cardx,player)=='shan'; - })) return 12-get.value(card); - return 0; - }); - 'step 1' - if(!result.bool) trigger.directHit.add(trigger.target); + forced: true, + popup: false, + content: function () { + "step 0"; + trigger.target + .chooseToDiscard( + "h", + { type: "basic" }, + "弃置一张基本牌,否则不能响应" + get.translation(trigger.card) + ) + .set("ai", function (card) { + var player = _status.event.player; + if ( + player.hasCard("hs", function (cardx) { + return cardx != card && get.name(cardx, player) == "shan"; + }) + ) + return 12 - get.value(card); + return 0; + }); + ("step 1"); + if (!result.bool) trigger.directHit.add(trigger.target); }, }, }, }, - twjieyu:{ - audio:2, - trigger:{player:['phaseJieshuBegin','damageEnd']}, - round:1, - filter:function(event,player){ - if(event.name!='phaseJieshu'){ - var history=player.getHistory('damage'); - for(var i of history){ - if(i==event) break; + twjieyu: { + audio: 2, + trigger: { player: ["phaseJieshuBegin", "damageEnd"] }, + round: 1, + filter: function (event, player) { + if (event.name != "phaseJieshu") { + var history = player.getHistory("damage"); + for (var i of history) { + if (i == event) break; return false; } - var all=player.actionHistory; - for(var i=all.length-2;i>=0;i--){ - if(all[i].damage.length) return false; - if(all[i].isRound) break; + var all = player.actionHistory; + for (var i = all.length - 2; i >= 0; i--) { + if (all[i].damage.length) return false; + if (all[i].isRound) break; } } - return player.countCards('h')>0&&!player.hasCard(function(card){ - return !lib.filter.cardDiscardable(card,player,'twjieyu'); - },'h') + return ( + player.countCards("h") > 0 && + !player.hasCard(function (card) { + return !lib.filter.cardDiscardable(card, player, "twjieyu"); + }, "h") + ); }, - check:function(event,player){ - var cards=[],names=[]; - for(var i=0;ieffect1; + check: function (event, player) { + var effect1 = get.effect(event.target, event.card, player, player); + var effect2 = 0, + targets = lib.skill.twhengjiang.logTarget(event, player); + for (var i of targets) effect2 += get.effect(i, event.card, player, player); + return effect2 > effect1; }, - content:function(){ - var targets=lib.skill.twhengjiang.logTarget(trigger,player); - trigger.targets.length=0; + content: function () { + var targets = lib.skill.twhengjiang.logTarget(trigger, player); + trigger.targets.length = 0; trigger.targets.addArray(targets); - trigger.getParent().triggeredTargets1.length=0; - trigger.getParent().twhengjiang_buffed=true; - player.addTempSkill('twhengjiang2','phaseUseAfter'); + trigger.getParent().triggeredTargets1.length = 0; + trigger.getParent().twhengjiang_buffed = true; + player.addTempSkill("twhengjiang2", "phaseUseAfter"); }, }, - twhengjiang2:{ - charlotte:true, - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.twhengjiang_buffed&&game.hasPlayer2(function(current){ - return current!=player&&(current.hasHistory('useCard',function(evt){ - return evt.respondTo&&evt.respondTo[1]==event.card; - })||current.hasHistory('respond',function(evt){ - return evt.respondTo&&evt.respondTo[1]==event.card; - })) - }); + twhengjiang2: { + charlotte: true, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return ( + event.twhengjiang_buffed && + game.hasPlayer2(function (current) { + return ( + current != player && + (current.hasHistory("useCard", function (evt) { + return evt.respondTo && evt.respondTo[1] == event.card; + }) || + current.hasHistory("respond", function (evt) { + return evt.respondTo && evt.respondTo[1] == event.card; + })) + ); + }) + ); }, - content:function(){ - player.draw(game.countPlayer2(function(current){ - return current!=player&&(current.hasHistory('useCard',function(evt){ - return evt.respondTo&&evt.respondTo[1]==trigger.card; - })||current.hasHistory('respond',function(evt){ - return evt.respondTo&&evt.respondTo[1]==trigger.card; - })) - })); + content: function () { + player.draw( + game.countPlayer2(function (current) { + return ( + current != player && + (current.hasHistory("useCard", function (evt) { + return evt.respondTo && evt.respondTo[1] == trigger.card; + }) || + current.hasHistory("respond", function (evt) { + return evt.respondTo && evt.respondTo[1] == trigger.card; + })) + ); + }) + ); }, }, - twyuanhu:{ - audio:'yuanhu', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hasCard({type:'equip'},'eh'); + twyuanhu: { + audio: "yuanhu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard({ type: "equip" }, "eh"); }, - filterCard:{type:'equip'}, - filterTarget:function(card,player,target){ - var card=ui.selected.cards[0]; + filterCard: { type: "equip" }, + filterTarget: function (card, player, target) { + var card = ui.selected.cards[0]; return target.canEquip(card); }, - discard:false, - lose:false, - prepare:'give', - position:'he', - check:function(card){ - if(get.position(card)=='h') return 9-get.value(card); - return 7-get.value(card); + discard: false, + lose: false, + prepare: "give", + position: "he", + check: function (card) { + if (get.position(card) == "h") return 9 - get.value(card); + return 7 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; target.equip(cards[0]); - 'step 1' + ("step 1"); event.goto(3); - switch(get.subtype(cards[0])){ - case 'equip1': - if(game.hasPlayer(function(current){ - return current!=target&&get.distance(target,current)==1&¤t.countCards('hej')>0; - })){ - player.chooseTarget(true,'弃置一名距离'+get.translation(target)+'为1的角色区域内的一张牌',function(card,player,target){ - var current=_status.event.current; - return current!=target&&get.distance(current,target)==1&¤t.countCards('hej')>0; - }).set('current',target).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy'},player,player); - }); + switch (get.subtype(cards[0])) { + case "equip1": + if ( + game.hasPlayer(function (current) { + return ( + current != target && + get.distance(target, current) == 1 && + current.countCards("hej") > 0 + ); + }) + ) { + player + .chooseTarget( + true, + "弃置一名距离" + get.translation(target) + "为1的角色区域内的一张牌", + function (card, player, target) { + var current = _status.event.current; + return ( + current != target && + get.distance(current, target) == 1 && + current.countCards("hej") > 0 + ); + } + ) + .set("current", target) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy" }, player, player); + }); event.goto(2); } break; - case 'equip2': + case "equip2": target.draw(); break; - case 'equip3': case 'equip4': case 'equip5': case 'equip6': + case "equip3": + case "equip4": + case "equip5": + case "equip6": target.recover(); break; } - 'step 2' - var target=result.targets[0]; + ("step 2"); + var target = result.targets[0]; player.line(target); - player.discardPlayerCard(target,true,'hej'); - 'step 3' - if(target.hp<=player.hp||target.countCards('h')<=player.countCards('h')){ + player.discardPlayerCard(target, true, "hej"); + ("step 3"); + if (target.hp <= player.hp || target.countCards("h") <= player.countCards("h")) { player.draw(); - player.addTempSkill('twyuanhu_end'); + player.addTempSkill("twyuanhu_end"); } }, - ai:{ - order:10, - result:{ - player:function(player,target){ - if(get.attitude(player,target)==0) return 0; - if(!ui.selected.cards.length) return; - var eff=get.effect(target,ui.selected.cards[0],player,player),sub=get.subtype(ui.selected.cards[0],false); - if(target==player) eff+=4; - else{ - var hp=player.hp,hs=player.countCards('h',(card)=>card!=ui.selected.cards[0]); - var tp=target.hp,ts=target.countCards('h'); - if(sub=='equip2') ts++; - if(tp card != ui.selected.cards[0]); + var tp = target.hp, + ts = target.countCards("h"); + if (sub == "equip2") ts++; + if ( + tp < target.maxHp && + (sub == "equip3" || sub == "equip4" || sub == "equip5" || sub == "equip6") + ) + tp++; + if (tp <= hp || ts <= hs) eff += 2; } - if(sub=='equip1'){ - var list=game.filterPlayer(function(current){ - return current!=target&&get.distance(target,current)==1&¤t.countCards('hej')<0; - }).map(function(i){ - return get.effect(i,{name:'guohe_copy'},player,player); - }).sort((a,b)=>b-a); - if(list.length) eff+=list[0]; + if (sub == "equip1") { + var list = game + .filterPlayer(function (current) { + return ( + current != target && + get.distance(target, current) == 1 && + current.countCards("hej") < 0 + ); + }) + .map(function (i) { + return get.effect(i, { name: "guohe_copy" }, player, player); + }) + .sort((a, b) => b - a); + if (list.length) eff += list[0]; } return eff; }, - target:function(player,target){ - if(!ui.selected.cards.length) return 0; - var sub=get.subtype(ui.selected.cards[0],false); - var eff=get.effect(target,ui.selected.cards[0],player,target); - if(sub=='equip2') eff+=(get.effect(target,{name:'draw'},target,target)); - if(target.isDamaged()&&(sub=='equip3'||sub=='equip4'||sub=='equip5'||sub=='equip6')) eff+=get.recoverEffect(target,player,player); + target: function (player, target) { + if (!ui.selected.cards.length) return 0; + var sub = get.subtype(ui.selected.cards[0], false); + var eff = get.effect(target, ui.selected.cards[0], player, target); + if (sub == "equip2") eff += get.effect(target, { name: "draw" }, target, target); + if ( + target.isDamaged() && + (sub == "equip3" || sub == "equip4" || sub == "equip5" || sub == "equip6") + ) + eff += get.recoverEffect(target, player, player); return eff; }, }, }, - subSkill:{ - end:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - charlotte:true, - filter:function(event,player){ - return player.hasSkill('twyuanhu')&&player.hasCard({type:'equip'},'eh'); + subSkill: { + end: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return player.hasSkill("twyuanhu") && player.hasCard({ type: "equip" }, "eh"); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('twyuanhu'), - prompt2:'将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌。', - filterCard:lib.skill.twyuanhu.filterCard, - filterTarget:lib.skill.twyuanhu.filterTarget, - position:'he', - ai1:lib.skill.twyuanhu.check, - ai2:function(target){ - var player=_status.event.player; - return get.effect(target,'twyuanhu',player,player); + prompt: get.prompt("twyuanhu"), + prompt2: + "将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌。", + filterCard: lib.skill.twyuanhu.filterCard, + filterTarget: lib.skill.twyuanhu.filterTarget, + position: "he", + ai1: lib.skill.twyuanhu.check, + ai2: function (target) { + var player = _status.event.player; + return get.effect(target, "twyuanhu", player, player); }, }); - 'step 1' - if(result.bool){ - result.skill='twyuanhu'; - player.useResult(result,event); + ("step 1"); + if (result.bool) { + result.skill = "twyuanhu"; + player.useResult(result, event); } }, }, }, }, - twjuezhu:{ - audio:2, - limited:true, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return player.hasEnabledSlot(3)||player.hasEnabledSlot(4); + twjuezhu: { + audio: 2, + limited: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.hasEnabledSlot(3) || player.hasEnabledSlot(4); }, - skillAnimation:true, - animationColor:'water', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('twjuezhu'),[1,2],function(card,player,target){ - return !ui.selected.targets.length&&!target.hasSkill('feiying'); - }).set('multitarget',true).set('promptbar','none').set('ai',function(target){ - if(player.hasUnknown()) return false; - return get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - event.target=result.targets[0]; - var list=[]; - if(player.hasEnabledSlot(3)) list.push('equip3'); - if(player.hasEnabledSlot(4)) list.push('equip4'); - if(list.length==1) event._result={control:list[0]}; - else player.chooseControl(list).set('prompt','选择废除一个坐骑栏'); - } - else event.finish(); - 'step 2' - player.logSkill('twjuezhu',target); - player.awakenSkill('twjuezhu'); + skillAnimation: true, + animationColor: "water", + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("twjuezhu"), [1, 2], function (card, player, target) { + return !ui.selected.targets.length && !target.hasSkill("feiying"); + }) + .set("multitarget", true) + .set("promptbar", "none") + .set("ai", function (target) { + if (player.hasUnknown()) return false; + return get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + var list = []; + if (player.hasEnabledSlot(3)) list.push("equip3"); + if (player.hasEnabledSlot(4)) list.push("equip4"); + if (list.length == 1) event._result = { control: list[0] }; + else player.chooseControl(list).set("prompt", "选择废除一个坐骑栏"); + } else event.finish(); + ("step 2"); + player.logSkill("twjuezhu", target); + player.awakenSkill("twjuezhu"); player.disableEquip(result.control); target.disableJudge(); - player.markAuto('twjuezhu_restore',[[target,result.control]]); - player.addSkill('twjuezhu_restore'); - target.addSkills('feiying'); + player.markAuto("twjuezhu_restore", [[target, result.control]]); + player.addSkill("twjuezhu_restore"); + target.addSkills("feiying"); }, - subSkill:{ - restore:{ - trigger:{global:'die'}, - forced:true, - charlotte:true, - filter:function(event,player){ - for(var i of player.getStorage('twjuezhu_restore')){ - if(i[0]==event.player&&player.hasDisabledSlot(i[1])) return true; + subSkill: { + restore: { + trigger: { global: "die" }, + forced: true, + charlotte: true, + filter: function (event, player) { + for (var i of player.getStorage("twjuezhu_restore")) { + if (i[0] == event.player && player.hasDisabledSlot(i[1])) return true; } return false; }, - content:function(){ - var list=[]; - for(var i of player.getStorage('twjuezhu_restore')){ - if(i[0]==trigger.player&&player.hasDisabledSlot(i[1])) list.push(i[1]); + content: function () { + var list = []; + for (var i of player.getStorage("twjuezhu_restore")) { + if (i[0] == trigger.player && player.hasDisabledSlot(i[1])) list.push(i[1]); } player.enableEquip(list); }, }, }, - derivation:'feiying', + derivation: "feiying", }, - twfengpo:{ - audio:'fengpo', - trigger:{player:'useCardToPlayered'}, - logTarget:'target', - filter:function(event,player){ - return (event.card.name=='sha'||event.card.name=='juedou')&&event.targets.length==1&&event.target.countCards('h')>0; + twfengpo: { + audio: "fengpo", + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter: function (event, player) { + return ( + (event.card.name == "sha" || event.card.name == "juedou") && + event.targets.length == 1 && + event.target.countCards("h") > 0 + ); }, - onremove:true, - content:function(){ - 'step 0' - event.target=trigger.target; + onremove: true, + content: function () { + "step 0"; + event.target = trigger.target; player.viewHandcards(trigger.target); - 'step 1' - var num=target.countCards('h',player.storage.twfengpo?{color:'red'}:{suit:'diamond'}); - if(!num){ + ("step 1"); + var num = target.countCards( + "h", + player.storage.twfengpo ? { color: "red" } : { suit: "diamond" } + ); + if (!num) { event.finish(); return; } - event.num=num; - player.chooseControl().set('choiceList',[ - '摸'+num+'张牌', - '令'+get.translation(trigger.card)+'的伤害值基数+'+num, - ]); - 'step 2' - if(result.index==0) player.draw(num); - else trigger.getParent().baseDamage+=num; + event.num = num; + player + .chooseControl() + .set("choiceList", [ + "摸" + num + "张牌", + "令" + get.translation(trigger.card) + "的伤害值基数+" + num, + ]); + ("step 2"); + if (result.index == 0) player.draw(num); + else trigger.getParent().baseDamage += num; }, - group:'twfengpo_kill', - subSkill:{ - kill:{ - audio:'fengpo', - trigger:{source:'die'}, - forced:true, - filter:(event,player)=>!player.storage.twfengpo, - skillAnimation:true, - animationColor:'fire', - content:function(){ - player.storage.twfengpo=true; - player.popup('凤魄'); - game.log(player,'恢复了技能','#g【凤魄】'); + group: "twfengpo_kill", + subSkill: { + kill: { + audio: "fengpo", + trigger: { source: "die" }, + forced: true, + filter: (event, player) => !player.storage.twfengpo, + skillAnimation: true, + animationColor: "fire", + content: function () { + player.storage.twfengpo = true; + player.popup("凤魄"); + game.log(player, "恢复了技能", "#g【凤魄】"); }, }, }, }, - twmouzhu:{ - audio:'mouzhu', - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - contentBefore:function(){ - var target=targets[0],evt=event.getParent(); - evt._target=target; - var list=game.filterPlayer(function(current){ - return current!=player&¤t!=target&¤t.hp<=player.hp; + twmouzhu: { + audio: "mouzhu", + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + contentBefore: function () { + var target = targets[0], + evt = event.getParent(); + evt._target = target; + var list = game.filterPlayer(function (current) { + return current != player && current != target && current.hp <= player.hp; }); - if(!list.length){ + if (!list.length) { player.loseHp(); evt.finish(); - } - else{ - evt.targets=list.sortBySeat(); + } else { + evt.targets = list.sortBySeat(); player.line(list); } }, - content:function(){ - 'step 0' - target.chooseCard('he','是否交给'+get.translation(player)+'一张牌?').set('ai',function(card){ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).set('goon',get.attitude(target,player)>0); - 'step 1' - if(result.bool){ - target.give(result.cards,player); - } - else{ - game.log(target,'拒绝给牌'); + content: function () { + "step 0"; + target + .chooseCard("he", "是否交给" + get.translation(player) + "一张牌?") + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", get.attitude(target, player) > 0); + ("step 1"); + if (result.bool) { + target.give(result.cards, player); + } else { + game.log(target, "拒绝给牌"); } }, - contentAfter:function(){ - 'step 0' - var num=0,par=event.getParent(); - player.getHistory('gain',function(evt){ - if(evt.getParent(2)==par) num+=evt.cards.length; + contentAfter: function () { + "step 0"; + var num = 0, + par = event.getParent(); + player.getHistory("gain", function (evt) { + if (evt.getParent(2) == par) num += evt.cards.length; }); - if(!num){ + if (!num) { player.loseHp(); - for(var i of targets) i.loseHp(); + for (var i of targets) i.loseHp(); event.finish(); - } - else{ - var target=event.getParent()._target; - event.target=target; - event.num=num; - var bool1=player.canUse('sha',target,false),bool2=player.canUse('juedou',target,false); - if(bool1&&bool2) target.chooseControl('sha','juedou').set('prompt','谋诛:视为被'+get.translation(player)+'使用一张…').set('prompt2','(伤害值基数:'+num+')').set('ai',function(){ - var target=_status.event.player,player=_status.event.getParent().player; - if(target.hasShan()||get.effect(target,{name:'sha'},player,target)>0) return 'sha'; - if(get.effect(target,{name:'juedou'},player,target)>0) return 'juedou'; - return 'sha'; - }); - else if(bool1) event._result={control:'sha'}; - else if(bool2) event._result={control:'juedou'}; + } else { + var target = event.getParent()._target; + event.target = target; + event.num = num; + var bool1 = player.canUse("sha", target, false), + bool2 = player.canUse("juedou", target, false); + if (bool1 && bool2) + target + .chooseControl("sha", "juedou") + .set("prompt", "谋诛:视为被" + get.translation(player) + "使用一张…") + .set("prompt2", "(伤害值基数:" + num + ")") + .set("ai", function () { + var target = _status.event.player, + player = _status.event.getParent().player; + if ( + target.hasShan() || + get.effect(target, { name: "sha" }, player, target) > 0 + ) + return "sha"; + if (get.effect(target, { name: "juedou" }, player, target) > 0) + return "juedou"; + return "sha"; + }); + else if (bool1) event._result = { control: "sha" }; + else if (bool2) event._result = { control: "juedou" }; else event.finish(); } - 'step 1' - if(result.control&&lib.card[result.control]) player.useCard({ - name:result.control, - isCard:true, - },false,target).baseDamage=num; + ("step 1"); + if (result.control && lib.card[result.control]) + player.useCard( + { + name: result.control, + isCard: true, + }, + false, + target + ).baseDamage = num; }, - ai:{ - order:9, - result:{ - target:function(player,target){ - if(get.attitude(player,target)>=0) return 0; - var list=game.filterPlayer(function(current){ - return current!=player&¤t!=target&¤t.hp<=player.hp; + ai: { + order: 9, + result: { + target: function (player, target) { + if (get.attitude(player, target) >= 0) return 0; + var list = game.filterPlayer(function (current) { + return current != player && current != target && current.hp <= player.hp; }); - if(!list.length) return 0; - return -Math.min(-get.effect(target,{name:'sha'},player,target),-get.effect(target,{name:'juedou'},player,target))*list.reduce(function(num,current){ - return num+(2+get.sgn(get.attitude(current,player))); - },0); + if (!list.length) return 0; + return ( + -Math.min( + -get.effect(target, { name: "sha" }, player, target), + -get.effect(target, { name: "juedou" }, player, target) + ) * + list.reduce(function (num, current) { + return num + (2 + get.sgn(get.attitude(current, player))); + }, 0) + ); }, }, }, }, - twyanhuo:{ - audio:'yanhuo', - trigger:{player:'die'}, - direct:true, - forceDie:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.countCards('he')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - }); + twyanhuo: { + audio: "yanhuo", + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); }, - content:function(){ - 'step 0' - var num=player.countCards('he'),str=get.cnNumber(num); - event.num1=num; - event.num2=1; - var list=['令一名其他角色弃置'+str+'张牌']; - if(num>1){ - list.push('令至多'+str+'名其他角色各弃置一张牌'); + content: function () { + "step 0"; + var num = player.countCards("he"), + str = get.cnNumber(num); + event.num1 = num; + event.num2 = 1; + var list = ["令一名其他角色弃置" + str + "张牌"]; + if (num > 1) { + list.push("令至多" + str + "名其他角色各弃置一张牌"); } - player.chooseControl('cancel2').set('choiceList',list).set('prompt',get.prompt('twyanhuo')).set('forceDie',true); - 'step 1' - if(result.control!='cancel2'){ - if(result.index==0){ - event.num2=event.num1; - event.num1=1; + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("prompt", get.prompt("twyanhuo")) + .set("forceDie", true); + ("step 1"); + if (result.control != "cancel2") { + if (result.index == 0) { + event.num2 = event.num1; + event.num1 = 1; } - player.chooseTarget([1,event.num1],true,'请选择【延祸】的目标',function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }).set('forceDie',true).set('ai',function(target){ - return -get.attitude(_status.event.player,target) - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('twyanhuo',targets); - for(var i of targets) i.chooseToDiscard(true,'he',event.num2); + player + .chooseTarget( + [1, event.num1], + true, + "请选择【延祸】的目标", + function (card, player, target) { + return target != player && target.countCards("he") > 0; + } + ) + .set("forceDie", true) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("twyanhuo", targets); + for (var i of targets) i.chooseToDiscard(true, "he", event.num2); } }, }, - twshenxing:{ - mod:{ - globalFrom:function(player,target,distance){ - var es=player.getCards('e',function(card){ + twshenxing: { + mod: { + globalFrom: function (player, target, distance) { + var es = player.getCards("e", function (card) { return !ui.selected.cards.includes(card); }); - for(var i of es){ - var type=get.subtype(i); - if(type=='equip3'||type=='equip4'||type=='equip6') return distance; + for (var i of es) { + var type = get.subtype(i); + if (type == "equip3" || type == "equip4" || type == "equip6") return distance; } - return distance-1; + return distance - 1; }, - maxHandcard:function(player,distance){ - var es=player.getCards('e',function(card){ + maxHandcard: function (player, distance) { + var es = player.getCards("e", function (card) { return !ui.selected.cards.includes(card); }); - for(var i of es){ - var type=get.subtype(i); - if(type=='equip3'||type=='equip4'||type=='equip6') return distance; + for (var i of es) { + var type = get.subtype(i); + if (type == "equip3" || type == "equip4" || type == "equip6") return distance; } - return distance+1; + return distance + 1; }, }, }, - twdaoji:{ - audio:'daoji', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hasCard(lib.skill.twdaoji.filterCard,'he'); + twdaoji: { + audio: "daoji", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard(lib.skill.twdaoji.filterCard, "he"); }, - filterCard:function(card){ - return get.type(card)!='basic'; + filterCard: function (card) { + return get.type(card) != "basic"; }, - position:'he', - filterTarget:function(card,player,target){ - return target!=player&&player.inRange(target)&&target.hasCard((card)=>lib.filter.canBeGained(card,target,player),'he'); + position: "he", + filterTarget: function (card, player, target) { + return ( + target != player && + player.inRange(target) && + target.hasCard((card) => lib.filter.canBeGained(card, target, player), "he") + ); }, - check:function(card){ - return 8-get.value(card); + check: function (card) { + return 8 - get.value(card); }, - content:function(){ - 'step 0' - player.gainPlayerCard(target,'he',true); - 'step 1' - if(result.bool&&result.cards&&result.cards.length==1){ - var card=result.cards[0]; - if(player.getCards('h').includes(card)){ - var type=get.type(card); - if(type=='basic') player.draw(); - else if(type=='equip'){ - if(player.hasUseTarget(card)) player.chooseUseTarget(card,'nopopup',true); - target.damage('nocard'); + content: function () { + "step 0"; + player.gainPlayerCard(target, "he", true); + ("step 1"); + if (result.bool && result.cards && result.cards.length == 1) { + var card = result.cards[0]; + if (player.getCards("h").includes(card)) { + var type = get.type(card); + if (type == "basic") player.draw(); + else if (type == "equip") { + if (player.hasUseTarget(card)) player.chooseUseTarget(card, "nopopup", true); + target.damage("nocard"); } } } }, - ai:{ - order:6, - result:{ - target:function(player,target){ - var eff=get.effect(target,{name:'shunshou_copy2'},player,target); - if(target.countCards('e')>0) eff+=get.damageEffect(target,player,target); + ai: { + order: 6, + result: { + target: function (player, target) { + var eff = get.effect(target, { name: "shunshou_copy2" }, player, target); + if (target.countCards("e") > 0) eff += get.damageEffect(target, player, target); return eff; }, }, }, }, - xinzhenjun:{ - audio:2, - trigger:{ - player:'phaseUseBegin' + xinzhenjun: { + audio: 2, + trigger: { + player: "phaseUseBegin", }, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:true, - filterTarget:lib.filter.notMe, - position:'he', - prompt:get.prompt2('xinzhenjun'), - ai1:function(card){ - var player=_status.event.player; - if(card.name=='sha'&&get.color(card)=='red'){ - for(var i=0;i0&¤t.hasValueTarget(card)) return 7; + filterCard: true, + filterTarget: lib.filter.notMe, + position: "he", + prompt: get.prompt2("xinzhenjun"), + ai1: function (card) { + var player = _status.event.player; + if (card.name == "sha" && get.color(card) == "red") { + for (var i = 0; i < game.players.length; i++) { + var current = game.players[i]; + if ( + current != player && + get.attitude(player, current) > 0 && + current.hasValueTarget(card) + ) + return 7; } return 0; } - return 7-get.value(card); + return 7 - get.value(card); }, - ai2:function(target){ - var player=_status.event.player; - var card=ui.selected.cards[0]; - var att=get.attitude(player,target); - if(get.value(card)<0) return -att*2; - if(target.countCards('h',{name:'sha',color:'red'})||target.hasSkill('wusheng')||target.hasSkill('new_rewusheng')||target.hasSkill('wushen')||(card.name=='sha'&&get.color(card)=='red'&&target.hasValueTarget(card))) return att*2; - var eff=0; - game.countPlayer(function(current){ - if(target!=current&&get.distance(target,current,'attack')>1) return; - var eff2=get.damageEffect(current,player,player); - if(eff2>eff) eff=eff2; + ai2: function (target) { + var player = _status.event.player; + var card = ui.selected.cards[0]; + var att = get.attitude(player, target); + if (get.value(card) < 0) return -att * 2; + if ( + target.countCards("h", { name: "sha", color: "red" }) || + target.hasSkill("wusheng") || + target.hasSkill("new_rewusheng") || + target.hasSkill("wushen") || + (card.name == "sha" && + get.color(card) == "red" && + target.hasValueTarget(card)) + ) + return att * 2; + var eff = 0; + game.countPlayer(function (current) { + if (target != current && get.distance(target, current, "attack") > 1) return; + var eff2 = get.damageEffect(current, player, player); + if (eff2 > eff) eff = eff2; }); - if(att>0&&eff>0) eff+=2*att; + if (att > 0 && eff > 0) eff += 2 * att; return eff; }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('xinzhenjun',target); - player.give(result.cards,target) - } - else event.finish(); - 'step 2' + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinzhenjun", target); + player.give(result.cards, target); + } else event.finish(); + ("step 2"); target.chooseToUse({ - filterCard:function(card){ - return get.name(card)=='sha'&&get.color(card)!='black'&&lib.filter.cardEnabled.apply(this,arguments); + filterCard: function (card) { + return ( + get.name(card) == "sha" && + get.color(card) != "black" && + lib.filter.cardEnabled.apply(this, arguments) + ); }, - prompt:'请使用一张不为黑色的【杀】,否则'+get.translation(player)+'可以对你或你攻击范围内的一名其他角色造成1点伤害', + prompt: + "请使用一张不为黑色的【杀】,否则" + + get.translation(player) + + "可以对你或你攻击范围内的一名其他角色造成1点伤害", }); - 'step 3' - if(result.bool){ - var num=1; - game.countPlayer2(function(current){ - current.getHistory('damage',function(evt){ - if(evt.getParent(evt.notLink()?4:8)==event) num+=evt.num; + ("step 3"); + if (result.bool) { + var num = 1; + game.countPlayer2(function (current) { + current.getHistory("damage", function (evt) { + if (evt.getParent(evt.notLink() ? 4 : 8) == event) num += evt.num; }); }); player.draw(num); event.finish(); - } - else{ - player.chooseTarget('是否对'+get.translation(target)+'或其攻击范围内的一名角色造成1点伤害?',function(card,player,target){ - return target==_status.event.targetx||_status.event.targetx.inRange(target); - }).set('targetx',event.target).ai=function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player) + } else { + player + .chooseTarget( + "是否对" + get.translation(target) + "或其攻击范围内的一名角色造成1点伤害?", + function (card, player, target) { + return ( + target == _status.event.targetx || + _status.event.targetx.inRange(target) + ); + } + ) + .set("targetx", event.target).ai = function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); }; } - 'step 4' - if(result.bool){ + ("step 4"); + if (result.bool) { player.line(result.targets); - result.targets[0].damage('nocard'); + result.targets[0].damage("nocard"); } }, }, - twmoukui:{ - audio:'moukui', - trigger:{player:'useCardToPlayered'}, - direct:true, - preHidden:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'; + twmoukui: { + audio: "moukui", + trigger: { player: "useCardToPlayered" }, + direct: true, + preHidden: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; }, - content:function(){ - 'step 0' - var list=['选项一']; - if(trigger.target.countDiscardableCards(player,'he')>0) list.push('选项二'); - list.push('背水!'); - list.push('cancel2'); - player.chooseControl(list).set('choiceList',[ - '摸一张牌', - '弃置'+get.translation(trigger.target)+'的一张牌', - '背水!依次执行以上两项。然后若此【杀】未令其进入濒死状态,则其弃置你的一张牌。', - ]).set('prompt',get.prompt('twmoukui',trigger.target)).setHiddenSkill('twmoukui'); - 'step 1' - if(result.control!='cancel2'){ - var target=trigger.target; - player.logSkill('twmoukui',target); - if(result.control=='选项一'||result.control=='背水!') player.draw(); - if(result.control=='选项二'||result.control=='背水!') player.discardPlayerCard(target,true,'he'); - if(result.control=='背水!'){ - player.addTempSkill('twmoukui_effect'); - var evt=trigger.getParent(); - if(!evt.twmoukui_effect) evt.twmoukui_effect=[]; + content: function () { + "step 0"; + var list = ["选项一"]; + if (trigger.target.countDiscardableCards(player, "he") > 0) list.push("选项二"); + list.push("背水!"); + list.push("cancel2"); + player + .chooseControl(list) + .set("choiceList", [ + "摸一张牌", + "弃置" + get.translation(trigger.target) + "的一张牌", + "背水!依次执行以上两项。然后若此【杀】未令其进入濒死状态,则其弃置你的一张牌。", + ]) + .set("prompt", get.prompt("twmoukui", trigger.target)) + .setHiddenSkill("twmoukui"); + ("step 1"); + if (result.control != "cancel2") { + var target = trigger.target; + player.logSkill("twmoukui", target); + if (result.control == "选项一" || result.control == "背水!") player.draw(); + if (result.control == "选项二" || result.control == "背水!") + player.discardPlayerCard(target, true, "he"); + if (result.control == "背水!") { + player.addTempSkill("twmoukui_effect"); + var evt = trigger.getParent(); + if (!evt.twmoukui_effect) evt.twmoukui_effect = []; evt.twmoukui_effect.add(target); } } }, - subSkill:{ - effect:{ - trigger:{player:'useCardAfter'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return event.twmoukui_effect&&event.twmoukui_effect.filter(function(current){ - return current.isIn()&&!current.hasHistory('damage',function(evt){ - return evt._dyinged&&evt.card==event.card; - }); - }).length>0; + subSkill: { + effect: { + trigger: { player: "useCardAfter" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return ( + event.twmoukui_effect && + event.twmoukui_effect.filter(function (current) { + return ( + current.isIn() && + !current.hasHistory("damage", function (evt) { + return evt._dyinged && evt.card == event.card; + }) + ); + }).length > 0 + ); }, - content:function(){ - var list=trigger.twmoukui_effect.filter(function(current){ - return current.isIn()&&!current.hasHistory('damage',function(evt){ - return evt._dyinged&&evt.card==event.card; - }); - }).sortBySeat(); - for(var i of list){ - i.discardPlayerCard(player,true,'he').boolline=true; + content: function () { + var list = trigger.twmoukui_effect + .filter(function (current) { + return ( + current.isIn() && + !current.hasHistory("damage", function (evt) { + return evt._dyinged && evt.card == event.card; + }) + ); + }) + .sortBySeat(); + for (var i of list) { + i.discardPlayerCard(player, true, "he").boolline = true; } }, }, }, }, - twfuhan:{ - audio:'fuhan', - trigger:{player:'phaseZhunbeiBegin'}, - unique:true, - limited:true, - skillAnimation:true, - animationColor:'orange', - forceunique:true, - filter:function(event,player){ - return player.countMark('fanghun')>0; + twfuhan: { + audio: "fuhan", + trigger: { player: "phaseZhunbeiBegin" }, + unique: true, + limited: true, + skillAnimation: true, + animationColor: "orange", + forceunique: true, + filter: function (event, player) { + return player.countMark("fanghun") > 0; }, - prompt:function(event,player){ - var num=Math.max(2,player.storage.fanghun); - num=Math.min(num,8); - return get.prompt('twfuhan')+'(体力上限:'+num+')'; + prompt: function (event, player) { + var num = Math.max(2, player.storage.fanghun); + num = Math.min(num, 8); + return get.prompt("twfuhan") + "(体力上限:" + num + ")"; }, - check:function(event,player){ - if(player.storage.fanghun>=Math.min(4,player.maxHp)) return true; - if(player.hp<=2&&player.storage.fanghun>=3) return true; + check: function (event, player) { + if (player.storage.fanghun >= Math.min(4, player.maxHp)) return true; + if (player.hp <= 2 && player.storage.fanghun >= 3) return true; return false; }, - content:function(){ - 'step 0' - var num=Math.max(2,player.storage.fanghun); - num=Math.min(num,8); - event.num=num; - player.removeMark('fanghun',player.storage.fanghun); - player.awakenSkill('twfuhan'); - if(_status.characterlist){ - list=[]; - for(var i=0;i<_status.characterlist.length;i++){ - var name=_status.characterlist[i]; - if(lib.character[name][1]=='shu') list.push(name); + content: function () { + "step 0"; + var num = Math.max(2, player.storage.fanghun); + num = Math.min(num, 8); + event.num = num; + player.removeMark("fanghun", player.storage.fanghun); + player.awakenSkill("twfuhan"); + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if (lib.character[name][1] == "shu") list.push(name); } - } - else if(_status.connectMode){ - list=get.charactersOL(function(i){ - return lib.character[i][1]!='shu'; + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return lib.character[i][1] != "shu"; + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "shu"; }); } - else{ - list=get.gainableCharacters(function(info){ - return info[1]=='shu'; - }); - } - var players=game.players.concat(game.dead); - for(var i=0;i0) player.gainMaxHp(num); + ("step 2"); + var num = event.num - player.maxHp; + if (num > 0) player.gainMaxHp(num); else player.loseMaxHp(-num); player.recover(); - 'step 3' - var card=get.cardPile('meiyingqiang','field'); - if(card){ - player.gain(card,'gain2','log'); + ("step 3"); + var card = get.cardPile("meiyingqiang", "field"); + if (card) { + player.gain(card, "gain2", "log"); } }, - ai:{ - combo:'refanghun' - } + ai: { + combo: "refanghun", + }, }, - twqueshi:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + twqueshi: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.hasEquipableSlot(1); + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && player.hasEquipableSlot(1); }, - content:function(){ - if(!lib.inpile.includes('meiyingqiang')){ - lib.inpile.push('meiyingqiang'); - player.equip(game.createCard('meiyingqiang','diamond',12)); - } - else{ - var card=get.cardPile(function(card){ - return card.name=='meiyingqiang'&&!player.getEquips(1).includes(card); - },'field'); - if(card) player.equip(card); + content: function () { + if (!lib.inpile.includes("meiyingqiang")) { + lib.inpile.push("meiyingqiang"); + player.equip(game.createCard("meiyingqiang", "diamond", 12)); + } else { + var card = get.cardPile(function (card) { + return card.name == "meiyingqiang" && !player.getEquips(1).includes(card); + }, "field"); + if (card) player.equip(card); } }, }, - meiyingqiang:{ - equipSkill:true, - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + meiyingqiang: { + equipSkill: true, + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - var evt=event.getl(player); - if(!evt||!evt.cards2||!evt.cards2.length) return false; - var list=player.getHistory('lose',function(evt){ - return evt.cards2&&evt.cards2.length; + filter: function (event, player) { + if (player == _status.currentPhase) return false; + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + var list = player.getHistory("lose", function (evt) { + return evt.cards2 && evt.cards2.length; }); - if(event.name=='lose'){ - if(list.indexOf(event)!=0) return false; + if (event.name == "lose") { + if (list.indexOf(event) != 0) return false; + } else { + if ( + !player.hasHistory("lose", function (evt) { + return evt.getParent() == event && list.indexOf(evt) == 0; + }) + ) + return false; } - else{ - if(!player.hasHistory('lose',function(evt){ - return evt.getParent()==event&&list.indexOf(evt)==0; - })) return false; - } - return _status.connectMode||!lib.config.skip_shan||player.hasSha(); + return _status.connectMode || !lib.config.skip_shan || player.hasSha(); }, - direct:true, - content:function(){ - if(trigger.delay===false) game.delayx(); - player.chooseToUse('梅影枪:是否使用一张【杀】?',function(card){ - if(get.name(card)!='sha') return false; - return lib.filter.cardEnabled.apply(this,arguments); - }).set('addCount',false).logSkill='meiyingqiang'; + direct: true, + content: function () { + if (trigger.delay === false) game.delayx(); + player + .chooseToUse("梅影枪:是否使用一张【杀】?", function (card) { + if (get.name(card) != "sha") return false; + return lib.filter.cardEnabled.apply(this, arguments); + }) + .set("addCount", false).logSkill = "meiyingqiang"; }, }, - cuijin:{ - trigger:{global:'useCard'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&(event.player==player||player.inRange(event.player))&&player.countCards('he')>0; + cuijin: { + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + (event.player == player || player.inRange(event.player)) && + player.countCards("he") > 0 + ); }, - checkx(event,player){ - let d1=true,e=false; - if(event.player.hasSkill('jueqing')||event.player.hasSkill('gangzhi')) d1=false; - for(let tar of event.targets){ - if(event.card.name=='sha'){ - if(!tar.mayHaveShan(player,'use',tar.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))||event.player.hasSkillTag('directHit_ai',true,{ - target:tar, - card:event.card, - },true)){ - if(!tar.hasSkill('gangzhi')) d1=false; - if(!tar.hasSkillTag('filterDamage',null,{ - player:event.player, - card:event.card, - })){ - let att=get.attitude(_status.event.player,tar); - if(att>0) return false; - if(att<0) e=true; + checkx(event, player) { + let d1 = true, + e = false; + if (event.player.hasSkill("jueqing") || event.player.hasSkill("gangzhi")) d1 = false; + for (let tar of event.targets) { + if (event.card.name == "sha") { + if ( + !tar.mayHaveShan( + player, + "use", + tar.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) || + event.player.hasSkillTag( + "directHit_ai", + true, + { + target: tar, + card: event.card, + }, + true + ) + ) { + if (!tar.hasSkill("gangzhi")) d1 = false; + if ( + !tar.hasSkillTag("filterDamage", null, { + player: event.player, + card: event.card, + }) + ) { + let att = get.attitude(_status.event.player, tar); + if (att > 0) return false; + if (att < 0) e = true; } } - } - else e=true; + } else e = true; } - if(e) return true; - if(d1) return get.damageEffect(event.player,player,_status.event.player)>0; + if (e) return true; + if (d1) return get.damageEffect(event.player, player, _status.event.player) > 0; return false; }, - content:function(){ - 'step 0' - if(player!=game.me&&!player.isOnline()) game.delayx(); - var target=trigger.player; - event.target=target; - player.chooseToDiscard('he',get.prompt('cuijin',target),'弃置一张牌并令'+get.translation(trigger.player)+'使用的【杀】伤害+1,但若其未造成伤害,则你对其造成1点伤害。').set('ai',function(card){ - if(_status.event.goon) return 7-get.value(card); - return 0; - }).set('goon',lib.skill.cuijin.checkx(trigger,player)).logSkill=['cuijin',target]; - 'step 1' - if(result.bool){ - if(typeof trigger.baseDamage!='number') trigger.baseDamage=1; + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + var target = trigger.player; + event.target = target; + player + .chooseToDiscard( + "he", + get.prompt("cuijin", target), + "弃置一张牌并令" + + get.translation(trigger.player) + + "使用的【杀】伤害+1,但若其未造成伤害,则你对其造成1点伤害。" + ) + .set("ai", function (card) { + if (_status.event.goon) return 7 - get.value(card); + return 0; + }) + .set("goon", lib.skill.cuijin.checkx(trigger, player)).logSkill = ["cuijin", target]; + ("step 1"); + if (result.bool) { + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; trigger.baseDamage++; - player.addTempSkill('cuijin_damage'); - player.markAuto('cuijin_damage',[trigger.card]); + player.addTempSkill("cuijin_damage"); + player.markAuto("cuijin_damage", [trigger.card]); } }, - subSkill:{ - damage:{ - trigger:{global:'useCardAfter'}, - forced:true, - popup:false, - charlotte:true, - onremove:true, - filter:function(event,player){ + subSkill: { + damage: { + trigger: { global: "useCardAfter" }, + forced: true, + popup: false, + charlotte: true, + onremove: true, + filter: function (event, player) { return player.storage.cuijin_damage.includes(event.card); }, - content:function(){ + content: function () { player.storage.cuijin_damage.remove(trigger.card); - if(!player.storage.cuijin_damage.length) player.removeSkill('cuijin_damage'); - if(trigger.player.isIn()&&!game.hasPlayer2(function(current){ - return current.hasHistory('damage',function(evt){ - return evt.card==trigger.card; - }); - })){ - player.line(trigger.player,'green'); + if (!player.storage.cuijin_damage.length) player.removeSkill("cuijin_damage"); + if ( + trigger.player.isIn() && + !game.hasPlayer2(function (current) { + return current.hasHistory("damage", function (evt) { + return evt.card == trigger.card; + }); + }) + ) { + player.line(trigger.player, "green"); trigger.player.damage(); } }, }, }, }, - jintao:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; + jintao: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; }, - targetInRange:function(card){ - if(card.name=='sha') return true; + targetInRange: function (card) { + if (card.name == "sha") return true; }, }, - audio:2, - trigger:{player:'useCard'}, - forced:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=player) return false; - var index=player.getHistory('useCard',function(evtx){ - return evtx.card.name=='sha'&&evtx.getParent('phaseUse')==evt; - }).indexOf(event); - return index==0||index==1; + audio: 2, + trigger: { player: "useCard" }, + forced: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != player) return false; + var index = player + .getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + }) + .indexOf(event); + return index == 0 || index == 1; }, - content:function(){ - var evt=trigger.getParent('phaseUse'); - var index=player.getHistory('useCard',function(evtx){ - return evtx.card.name=='sha'&&evtx.getParent('phaseUse')==evt; - }).indexOf(trigger); - if(index==0){ - game.log(trigger.card,'伤害+1'); - if(typeof trigger.baseDamage!='number') trigger.baseDamage=1; + content: function () { + var evt = trigger.getParent("phaseUse"); + var index = player + .getHistory("useCard", function (evtx) { + return evtx.card.name == "sha" && evtx.getParent("phaseUse") == evt; + }) + .indexOf(trigger); + if (index == 0) { + game.log(trigger.card, "伤害+1"); + if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1; trigger.baseDamage++; - } - else{ - game.log(trigger.card,'不可被响应'); + } else { + game.log(trigger.card, "不可被响应"); trigger.directHit.addArray(game.players); } }, }, - equan:{ - audio:2, - trigger:{global:'damageEnd'}, - forced:true, - filter:function(event,player){ - return player==_status.currentPhase&&event.player.isIn(); + equan: { + audio: 2, + trigger: { global: "damageEnd" }, + forced: true, + filter: function (event, player) { + return player == _status.currentPhase && event.player.isIn(); }, - logTarget:'player', - content:function(){ - trigger.player.addMark('equan',trigger.num,false); + logTarget: "player", + content: function () { + trigger.player.addMark("equan", trigger.num, false); }, - group:['equan_block','equan_lose'], - marktext:'毒', - intro:{ - name:'恶泉(毒)', - name2:'毒', + group: ["equan_block", "equan_lose"], + marktext: "毒", + intro: { + name: "恶泉(毒)", + name2: "毒", }, - subSkill:{ - lose:{ - audio:'equan', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(){ - return game.hasPlayer(function(current){ - return current.hasMark('equan'); + subSkill: { + lose: { + audio: "equan", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function () { + return game.hasPlayer(function (current) { + return current.hasMark("equan"); }); }, - logTarget:function(){ - return game.filterPlayer(function(current){ - return current.hasMark('equan'); + logTarget: function () { + return game.filterPlayer(function (current) { + return current.hasMark("equan"); }); }, - content:function(){ - game.countPlayer(function(current){ - var num=current.countMark('equan'); - if(num){ - current.removeMark('equan',num); + content: function () { + game.countPlayer(function (current) { + var num = current.countMark("equan"); + if (num) { + current.removeMark("equan", num); current.loseHp(num); } }); }, }, - block:{ - trigger:{global:'dyingBegin'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - var evt=event.getParent(2); - return evt.name=='equan_lose'&&evt.player==player; + block: { + trigger: { global: "dyingBegin" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + var evt = event.getParent(2); + return evt.name == "equan_lose" && evt.player == player; }, - content:function(){ - trigger.player.addTempSkill('baiban'); + content: function () { + trigger.player.addTempSkill("baiban"); }, }, }, }, - manji:{ - audio:2, - trigger:{global:'loseHpAfter'}, - forced:true, - filter:function(event,player){ - return player!=event.player&&(player.hp>=event.player.hp||player.isDamaged()); + manji: { + audio: 2, + trigger: { global: "loseHpAfter" }, + forced: true, + filter: function (event, player) { + return player != event.player && (player.hp >= event.player.hp || player.isDamaged()); }, - logTarget:'player', - content:function(){ - if(player.hp<=trigger.player.hp) player.recover(); - if(player.hp>=trigger.player.hp) player.draw(); + logTarget: "player", + content: function () { + if (player.hp <= trigger.player.hp) player.recover(); + if (player.hp >= trigger.player.hp) player.draw(); }, }, - beini:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - var str=get.translation(target); - player.chooseControl().set('choiceList',[ - '摸两张牌,然后令'+str+'视为对自己使用【杀】', - '令'+str+'摸两张牌,然后视为对其使用【杀】', - ]).set('ai',function(){ - var evt=_status.event.getParent(),player=evt.player,target=evt.target; - var card={name:'sha',isCard:true},att=get.attitude(player,target)>0; - if(!target.canUse(card,player,false)||get.effect(player,card,target,player)>=0) return 0; - if(att&&(!player.canUse(card,target,false)||get.effect(target,card,player,player)>=0)) return 1; - if(target.hasSkill('nogain')&&player.canUse(card,target,false)&&get.effect(target,card,player,player)>0) return 1; - if(player.hasShan()) return 0; - if(att&&target.hasShan()) return 1; - return 0; - }); - 'step 1' - var list=[player,target]; - if(result.index==1) list.reverse(); - event.list=list; + beini: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: lib.filter.notMe, + content: function () { + "step 0"; + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", [ + "摸两张牌,然后令" + str + "视为对自己使用【杀】", + "令" + str + "摸两张牌,然后视为对其使用【杀】", + ]) + .set("ai", function () { + var evt = _status.event.getParent(), + player = evt.player, + target = evt.target; + var card = { name: "sha", isCard: true }, + att = get.attitude(player, target) > 0; + if ( + !target.canUse(card, player, false) || + get.effect(player, card, target, player) >= 0 + ) + return 0; + if ( + att && + (!player.canUse(card, target, false) || + get.effect(target, card, player, player) >= 0) + ) + return 1; + if ( + target.hasSkill("nogain") && + player.canUse(card, target, false) && + get.effect(target, card, player, player) > 0 + ) + return 1; + if (player.hasShan()) return 0; + if (att && target.hasShan()) return 1; + return 0; + }); + ("step 1"); + var list = [player, target]; + if (result.index == 1) list.reverse(); + event.list = list; list[0].draw(2); - 'step 2' - var list=event.list; - if(list[1].isIn()&&list[0].isIn()&&list[1].canUse('sha',list[0],false)) list[1].useCard({name:'sha',isCard:true},list[0],false,'noai'); + ("step 2"); + var list = event.list; + if (list[1].isIn() && list[0].isIn() && list[1].canUse("sha", list[0], false)) + list[1].useCard({ name: "sha", isCard: true }, list[0], false, "noai"); }, - ai:{ - order:5, - expose:0, - result:{ - player:function(player,target){ - var card={name:'sha',isCard:true},att=get.attitude(player,target)>0; - if(!target.canUse(card,player,false)||get.effect(player,card,target,player)>=0) return 2; - if(att&&(!player.canUse(card,target,false)||get.effect(target,card,player,player)>=0)) return 2; - if(target.hasSkill('nogain')&&player.canUse(card,target,false)) return get.effect(target,card,player,player) - if(player.hasShan()) return 1; - if(att&&target.hasShan()) return 1; + ai: { + order: 5, + expose: 0, + result: { + player: function (player, target) { + var card = { name: "sha", isCard: true }, + att = get.attitude(player, target) > 0; + if ( + !target.canUse(card, player, false) || + get.effect(player, card, target, player) >= 0 + ) + return 2; + if ( + att && + (!player.canUse(card, target, false) || + get.effect(target, card, player, player) >= 0) + ) + return 2; + if (target.hasSkill("nogain") && player.canUse(card, target, false)) + return get.effect(target, card, player, player); + if (player.hasShan()) return 1; + if (att && target.hasShan()) return 1; return 0; }, }, }, }, - dingfa:{ - audio:2, - trigger:{player:'phaseDiscardAfter'}, - direct:true, - filter:function(event,player){ - var num=0; - player.getHistory('lose',function(evt){ - num+=evt.cards2.length; + dingfa: { + audio: 2, + trigger: { player: "phaseDiscardAfter" }, + direct: true, + filter: function (event, player) { + var num = 0; + player.getHistory("lose", function (evt) { + num += evt.cards2.length; }); - return num>=player.hp; + return num >= player.hp; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('dingfa'),'操作提示:选择自己以回复体力,或选择其他角色以造成伤害',function(card,player,target){ - return target==player?player.isDamaged():true; - }).set('ai',function(target){ - return target!=player?get.damageEffect(target,player,player):get.recoverEffect(player,player,player) - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dingfa',target); - if(target==player) player.recover(); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("dingfa"), + "操作提示:选择自己以回复体力,或选择其他角色以造成伤害", + function (card, player, target) { + return target == player ? player.isDamaged() : true; + } + ) + .set("ai", function (target) { + return target != player + ? get.damageEffect(target, player, player) + : get.recoverEffect(player, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dingfa", target); + if (target == player) player.recover(); else target.damage(); } }, }, - dz_mantianguohai:{ - mod:{ - ignoredHandcard:function(card,player){ - if(get.name(card)=='dz_mantianguohai') return true; + dz_mantianguohai: { + mod: { + ignoredHandcard: function (card, player) { + if (get.name(card) == "dz_mantianguohai") return true; }, - cardDiscardable:function(card,player,name){ - if(name=='cardsDiscard'&&get.name(card)=='dz_mantianguohai') return false; + cardDiscardable: function (card, player, name) { + if (name == "cardsDiscard" && get.name(card) == "dz_mantianguohai") return false; }, }, }, - twmiaolve:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + twmiaolve: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - content:function(){ - if(!lib.inpile.includes('dz_mantianguohai')) lib.inpile.add('dz_mantianguohai'); - if(!_status.dz_mantianguohai_suits) _status.dz_mantianguohai_suits=lib.suit.slice(0); - var list=_status.dz_mantianguohai_suits.randomRemove(2).map(function(i){ - return game.createCard2('dz_mantianguohai',i,5); + forced: true, + locked: false, + content: function () { + if (!lib.inpile.includes("dz_mantianguohai")) lib.inpile.add("dz_mantianguohai"); + if (!_status.dz_mantianguohai_suits) _status.dz_mantianguohai_suits = lib.suit.slice(0); + var list = _status.dz_mantianguohai_suits.randomRemove(2).map(function (i) { + return game.createCard2("dz_mantianguohai", i, 5); }); - if(list.length) player.gain(list,'gain2','log'); + if (list.length) player.gain(list, "gain2", "log"); }, - group:'twmiaolve_damage', - subSkill:{ - damage:{ - trigger:{player:'damageEnd'}, - direct:true, - content:function(){ - 'step 0' - event.count=trigger.num; - 'step 1' + group: "twmiaolve_damage", + subSkill: { + damage: { + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; - var list=['dz_mantianguohai']; + var list = ["dz_mantianguohai"]; list.addArray(get.zhinangs()); - player.chooseButton([get.prompt('twmiaolve'),[list,'vcard']]).set('ai',function(button){ - if(button.link[2]=='dz_mantianguohai'&&player.countCards('hs','dz_mantianguohai')<2) return 10; - return get.value({name:button.link[2]}); - }); - 'step 2' - if(result.bool){ - player.logSkill('twmiaolve'); - var name=result.links[0][2]; - if(name=='dz_mantianguohai'){ - if(!lib.inpile.includes('dz_mantianguohai')) lib.inpile.add('dz_mantianguohai'); - if(!_status.dz_mantianguohai_suits) _status.dz_mantianguohai_suits=lib.suit.slice(0); - if(_status.dz_mantianguohai_suits.length) player.gain(game.createCard2('dz_mantianguohai',_status.dz_mantianguohai_suits.randomRemove(),5),'gain2'); - else{ - var card=get.cardPile(function(card){ - return card.name==name; + player + .chooseButton([get.prompt("twmiaolve"), [list, "vcard"]]) + .set("ai", function (button) { + if ( + button.link[2] == "dz_mantianguohai" && + player.countCards("hs", "dz_mantianguohai") < 2 + ) + return 10; + return get.value({ name: button.link[2] }); + }); + ("step 2"); + if (result.bool) { + player.logSkill("twmiaolve"); + var name = result.links[0][2]; + if (name == "dz_mantianguohai") { + if (!lib.inpile.includes("dz_mantianguohai")) + lib.inpile.add("dz_mantianguohai"); + if (!_status.dz_mantianguohai_suits) + _status.dz_mantianguohai_suits = lib.suit.slice(0); + if (_status.dz_mantianguohai_suits.length) + player.gain( + game.createCard2( + "dz_mantianguohai", + _status.dz_mantianguohai_suits.randomRemove(), + 5 + ), + "gain2" + ); + else { + var card = get.cardPile(function (card) { + return card.name == name; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); } player.draw(); - } - else{ - var card=get.cardPile(function(card){ - return card.name==name; + } else { + var card = get.cardPile(function (card) { + return card.name == name; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); } - if(event.count>0&&player.hasSkill('twmiaolve')) event.goto(1); + if (event.count > 0 && player.hasSkill("twmiaolve")) event.goto(1); } }, }, }, }, - twyingjia:{ - audio:2, - trigger:{global:'phaseEnd'}, - direct:true, - filter:function(event,player){ - if(!player.countCards('he')) return false; - var history=player.getHistory('useCard'),map={}; - for(var i of history){ - if(get.type2(i.card)=='trick'){ - if(!map[i.card.name]) map[i.card.name]=true; + twyingjia: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + filter: function (event, player) { + if (!player.countCards("he")) return false; + var history = player.getHistory("useCard"), + map = {}; + for (var i of history) { + if (get.type2(i.card) == "trick") { + if (!map[i.card.name]) map[i.card.name] = true; else return true; } } return false; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - prompt:get.prompt('twyingjia'), - prompt2:'弃置一张牌并令一名角色进行一个额外回合', - filterCard:lib.filter.cardDiscardable, - filterTarget:true, - ai1:function(card){ - return 8-get.value(card); + prompt: get.prompt("twyingjia"), + prompt2: "弃置一张牌并令一名角色进行一个额外回合", + filterCard: lib.filter.cardDiscardable, + filterTarget: true, + ai1: function (card) { + return 8 - get.value(card); }, - ai2:function(target){ - if(target.hasJudge('lebu')) return -1; - var player=_status.event.player; - if(get.attitude(player,target)>4){ - return get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1); + ai2: function (target) { + if (target.hasJudge("lebu")) return -1; + var player = _status.event.player; + if (get.attitude(player, target) > 4) { + return ( + get.threaten(target) / + Math.sqrt(target.hp + 1) / + Math.sqrt(target.countCards("h") + 1) + ); } return -1; }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twyingjia',target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("twyingjia", target); player.discard(result.cards); target.insertPhase(); } }, }, - gx_lingbaoxianhu:{ - trigger:{ - source:'damageSource', - global:'dieAfter', + gx_lingbaoxianhu: { + trigger: { + source: "damageSource", + global: "dieAfter", }, - forced:true, - equipSkill:true, - filter:function(event,player){ - if(event.name=='damage') return event.num>1; + forced: true, + equipSkill: true, + filter: function (event, player) { + if (event.name == "damage") return event.num > 1; return true; }, - content:function(){ + content: function () { player.gainMaxHp(); player.recover(); }, }, - gx_taijifuchen:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - equipSkill:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'; + gx_taijifuchen: { + trigger: { player: "useCardToPlayered" }, + forced: true, + equipSkill: true, + filter: function (event, player) { + return event.card && event.card.name == "sha"; }, - logTarget:'target', - content:function(){ - 'step 0' - var suit=get.suit(trigger.card); - var num=trigger.target.countCards('h','shan'); - var next=trigger.target.chooseToDiscard('弃置一张牌,或不能响应'+get.translation(trigger.card),'he').set('ai',function(card){ - var num=_status.event.num; - if(num==0) return 0; - if(card.name=='shan') return num>1?2:0; - return (get.suit(card)!=_status.event.suit?9:6)-get.value(card); - }).set('num',num); - if(lib.suit.includes(suit)){ - next.set('prompt2','若弃置的是'+get.translation(suit)+'牌,则改为'+get.translation(player)+'获得之'); - next.set('suit',suit); + logTarget: "target", + content: function () { + "step 0"; + var suit = get.suit(trigger.card); + var num = trigger.target.countCards("h", "shan"); + var next = trigger.target + .chooseToDiscard("弃置一张牌,或不能响应" + get.translation(trigger.card), "he") + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return (get.suit(card) != _status.event.suit ? 9 : 6) - get.value(card); + }) + .set("num", num); + if (lib.suit.includes(suit)) { + next.set( + "prompt2", + "若弃置的是" + + get.translation(suit) + + "牌,则改为" + + get.translation(player) + + "获得之" + ); + next.set("suit", suit); } - 'step 1' - if(result.bool){ - var card=result.cards[0]; - if(get.suit(card,trigger.target)==get.suit(trigger.card,false)&&get.position(card)=='d') player.gain(card,'gain2'); - } - else trigger.directHit.add(trigger.target); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + if ( + get.suit(card, trigger.target) == get.suit(trigger.card, false) && + get.position(card) == "d" + ) + player.gain(card, "gain2"); + } else trigger.directHit.add(trigger.target); }, }, - gx_chongyingshenfu:{ - trigger:{player:'damageEnd'}, - forced:true, - equipSkill:true, - filter:function(event,player){ - if(!event.card||!event.card.name||player.getStorage('gx_chongyingshenfu_effect').includes(event.card.name)) return false; - if(player.hasSkillTag('unequip2')) return false; - if(event.source.hasSkillTag('unequip',false,{ - name:event.card.name, - target:player, - card:event.card, - })) return false; + gx_chongyingshenfu: { + trigger: { player: "damageEnd" }, + forced: true, + equipSkill: true, + filter: function (event, player) { + if ( + !event.card || + !event.card.name || + player.getStorage("gx_chongyingshenfu_effect").includes(event.card.name) + ) + return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.source.hasSkillTag("unequip", false, { + name: event.card.name, + target: player, + card: event.card, + }) + ) + return false; return true; }, - content:function(){ - player.markAuto('gx_chongyingshenfu_effect',[trigger.card.name]); + content: function () { + player.markAuto("gx_chongyingshenfu_effect", [trigger.card.name]); }, - group:'gx_chongyingshenfu_effect', - subSkill:{ - effect:{ - trigger:{player:'damageBegin4'}, - forced:true, - equipSkill:true, - filter:function(event,player){ - if(!event.card||!event.card.name||!player.storage.gx_chongyingshenfu_effect||!player.getStorage('gx_chongyingshenfu_effect').includes(event.card.name)) return false; - if(player.hasSkillTag('unequip2')) return false; - if(event.source.hasSkillTag('unequip',false,{ - name:event.card.name, - target:player, - card:event.card, - })) return false; + group: "gx_chongyingshenfu_effect", + subSkill: { + effect: { + trigger: { player: "damageBegin4" }, + forced: true, + equipSkill: true, + filter: function (event, player) { + if ( + !event.card || + !event.card.name || + !player.storage.gx_chongyingshenfu_effect || + !player.getStorage("gx_chongyingshenfu_effect").includes(event.card.name) + ) + return false; + if (player.hasSkillTag("unequip2")) return false; + if ( + event.source.hasSkillTag("unequip", false, { + name: event.card.name, + target: player, + card: event.card, + }) + ) + return false; return true; }, - content:function(){ + content: function () { trigger.num--; }, - ai:{ - effect:{ - target:function(card,player,target){ - if(typeof card=='object'&&target.storage.gx_chongyingshenfu_effect&&target.getStorage('gx_chongyingshenfu_effect').includes(card.name)&&!target.hasSkillTag('unequip2')&& - (get.itemtype(player)!=='player'||!player.hasSkillTag('jueqing',false,target)&&!player.hasSkillTag('unequip',false,{ - name:card.name, - target:target, - card:card, - }))){ - if(player&&player.hasSkillTag('damageBonus',true,{ - target:target, - card:card - })) return 0.5; - return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target) { + if ( + typeof card == "object" && + target.storage.gx_chongyingshenfu_effect && + target.getStorage("gx_chongyingshenfu_effect").includes(card.name) && + !target.hasSkillTag("unequip2") && + (get.itemtype(player) !== "player" || + (!player.hasSkillTag("jueqing", false, target) && + !player.hasSkillTag("unequip", false, { + name: card.name, + target: target, + card: card, + }))) + ) { + if ( + player && + player.hasSkillTag("damageBonus", true, { + target: target, + card: card, + }) + ) + return 0.5; + return "zeroplayertarget"; } - } - } + }, + }, }, - onremove:true, - intro:{ - content:'受到$造成的伤害-1', + onremove: true, + intro: { + content: "受到$造成的伤害-1", }, }, }, }, - twdanfa:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - filter:function(event,player){ - return player.countCards('he')>0; + twdanfa: { + audio: 2, + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + filter: function (event, player) { + return player.countCards("he") > 0; }, - direct:true, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('twdanfa'),'将一张牌作为“丹”置于武将牌上').set('ai',function(card){ - if(player.storage.twdanfa){ - var suit=get.suit(card); - for(var i of player.storage.twdanfa){ - if(get.suit(i,false)==suit) return 4-get.value(card); + direct: true, + content: function () { + "step 0"; + player + .chooseCard("he", get.prompt("twdanfa"), "将一张牌作为“丹”置于武将牌上") + .set("ai", function (card) { + if (player.storage.twdanfa) { + var suit = get.suit(card); + for (var i of player.storage.twdanfa) { + if (get.suit(i, false) == suit) return 4 - get.value(card); + } } - } - return 5.5-get.value(card); - }); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - player.logSkill('twdanfa'); - game.log(player,'将',card,'放在了武将牌上'); - player.$give(card,player,false); - player.lose(card,ui.special,'toStorage'); - player.markAuto('twdanfa',result.cards); - } - else event.finish(); - 'step 2' + return 5.5 - get.value(card); + }); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + player.logSkill("twdanfa"); + game.log(player, "将", card, "放在了武将牌上"); + player.$give(card, player, false); + player.lose(card, ui.special, "toStorage"); + player.markAuto("twdanfa", result.cards); + } else event.finish(); + ("step 2"); game.delayx(); }, - mark:true, - intro:{ - content:'cards', - onunmark:'throw', + mark: true, + intro: { + content: "cards", + onunmark: "throw", }, - group:'twdanfa_draw', - subSkill:{ - draw:{ - audio:'twdanfa', - trigger:{player:'useCard'}, - forced:true, - locked:false, - filter:function(event,player){ - if(!player.storage.twdanfa||!player.storage.twdanfa.length) return false; - var suit=get.suit(event.card,false); - if(suit=='none'||player.storage.twdanfa_count&&player.storage.twdanfa_count.includes(suit)) return false; - for(var i of player.storage.twdanfa){ - if(get.suit(i,false)==suit) return true; + group: "twdanfa_draw", + subSkill: { + draw: { + audio: "twdanfa", + trigger: { player: "useCard" }, + forced: true, + locked: false, + filter: function (event, player) { + if (!player.storage.twdanfa || !player.storage.twdanfa.length) return false; + var suit = get.suit(event.card, false); + if ( + suit == "none" || + (player.storage.twdanfa_count && player.storage.twdanfa_count.includes(suit)) + ) + return false; + for (var i of player.storage.twdanfa) { + if (get.suit(i, false) == suit) return true; } return false; }, - content:function(){ + content: function () { player.draw(); - player.addTempSkill('twdanfa_count'); - if(!player.storage.twdanfa_count) player.storage.twdanfa_count=[]; - player.storage.twdanfa_count.push(get.suit(trigger.card,false)); + player.addTempSkill("twdanfa_count"); + if (!player.storage.twdanfa_count) player.storage.twdanfa_count = []; + player.storage.twdanfa_count.push(get.suit(trigger.card, false)); }, }, - count:{onremove:true}, + count: { onremove: true }, }, }, - twlingbao:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var list=player.getStorage('twdanfa'); - if(list.length<2) return false; - var suit=get.suit(list[0],false); - for(var i=1;ifalse; - obj.selectCard=-1; + select: 2, + backup: function (links) { + var obj = get.copy(lib.skill["twlingbao_" + get.color(links)]); + obj.cards = links; + obj.audio = "twlingbao"; + obj.filterCard = () => false; + obj.selectCard = -1; return obj; }, - prompt:function(links){ - return lib.skill['twlingbao_'+get.color(links)].prompt; + prompt: function (links) { + return lib.skill["twlingbao_" + get.color(links)].prompt; }, - check:function(button){ - var storage=_status.event.player.storage.twdanfa.slice(0); + check: function (button) { + var storage = _status.event.player.storage.twdanfa.slice(0); storage.remove(button.link); - if(storage.filter(function(card){ - return card.suit==button.link.suit; - }).length) return 1+Math.random(); + if ( + storage.filter(function (card) { + return card.suit == button.link.suit; + }).length + ) + return 1 + Math.random(); return 0; }, }, - subSkill:{ - red:{ - filterTarget:function(card,player,target){ + subSkill: { + red: { + filterTarget: function (card, player, target) { return target.isDamaged(); }, - delay:false, - prompt:'令一名角色回复1点体力', - content:function(){ - 'step 0' - var cards=lib.skill.twlingbao_backup.cards; - player.$throw(cards,1000); - player.unmarkAuto('twdanfa',cards); - game.log(player,'将',cards,'置入了弃牌堆'); + delay: false, + prompt: "令一名角色回复1点体力", + content: function () { + "step 0"; + var cards = lib.skill.twlingbao_backup.cards; + player.$throw(cards, 1000); + player.unmarkAuto("twdanfa", cards); + game.log(player, "将", cards, "置入了弃牌堆"); game.delayx(); game.cardsDiscard(cards); - 'step 1' + ("step 1"); target.recover(); }, - ai:{ - tag:{ - recover:1, + ai: { + tag: { + recover: 1, }, - result:{ - target:1.5, + result: { + target: 1.5, }, }, }, - black:{ - filterTarget:function(card,player,target){ - return target.countDiscardableCards(player,'hej')>0; + black: { + filterTarget: function (card, player, target) { + return target.countDiscardableCards(player, "hej") > 0; }, - delay:false, - prompt:'弃置一名角色区域内至多两张区域不同的牌', - content:function(){ - 'step 0' - var cards=lib.skill.twlingbao_backup.cards; - player.$throw(cards,1000); - player.unmarkAuto('twdanfa',cards); - game.log(player,'将',cards,'置入了弃牌堆'); + delay: false, + prompt: "弃置一名角色区域内至多两张区域不同的牌", + content: function () { + "step 0"; + var cards = lib.skill.twlingbao_backup.cards; + player.$throw(cards, 1000); + player.unmarkAuto("twdanfa", cards); + game.log(player, "将", cards, "置入了弃牌堆"); game.delayx(); game.cardsDiscard(cards); - 'step 1' - var num=0; - if(target.countDiscardableCards(player,'h')) num++; - if(target.countDiscardableCards(player,'e')) num++; - if(target.countDiscardableCards(player,'j')) num++; - if(num){ - player.discardPlayerCard(target,[1,Math.max(2,num)],'hej',true).set('filterButton',function(button){ - for(var i=0;i0&&target.countCards('e',function(card){ - return get.value(card,target)<=0; - })>0&&target.countCards('j',function(card){ - return get.effect(target,card,target,target)<0; - })>8) return 3; - if(target.countCards('h')>0&&target.countCards('e',function(card){ - return get.value(card,target)>0; - })>0) return -2; + result: { + target: function (player, target) { + if ( + get.attitude(player, target) > 0 && + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) > 0 && + target.countCards("j", function (card) { + return get.effect(target, card, target, target) < 0; + }) > 8 + ) + return 3; + if ( + target.countCards("h") > 0 && + target.countCards("e", function (card) { + return get.value(card, target) > 0; + }) > 0 + ) + return -2; return 0; }, }, }, }, - none:{ - selectTarget:2, - filterTarget:function(card,player,target){ - if(!ui.selected.targets.length) return true; - return target.countCards('he')>0; + none: { + selectTarget: 2, + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) return true; + return target.countCards("he") > 0; }, - complexSelect:true, - targetprompt:['摸牌','弃牌'], - delay:false, - prompt:'令一名角色摸一张牌并令另一名角色弃置一张牌', - multitarget:true, - multiline:true, - content:function(){ - 'step 0' - var cards=lib.skill.twlingbao_backup.cards; - player.$throw(cards,1000); - player.unmarkAuto('twdanfa',cards); - game.log(player,'将',cards,'置入了弃牌堆'); + complexSelect: true, + targetprompt: ["摸牌", "弃牌"], + delay: false, + prompt: "令一名角色摸一张牌并令另一名角色弃置一张牌", + multitarget: true, + multiline: true, + content: function () { + "step 0"; + var cards = lib.skill.twlingbao_backup.cards; + player.$throw(cards, 1000); + player.unmarkAuto("twdanfa", cards); + game.log(player, "将", cards, "置入了弃牌堆"); game.delayx(); game.cardsDiscard(cards); - 'step 1' + ("step 1"); targets[0].draw(); - targets[1].chooseToDiscard('he',true); + targets[1].chooseToDiscard("he", true); }, - ai:{ - result:{ - target:function(player,target){ - if(!ui.selected.targets.length) return 1; - if(target.countCards('e',function(card){ - return get.value(card,target)<=0; - })>0) return 1; + ai: { + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return 1; + if ( + target.countCards("e", function (card) { + return get.value(card, target) <= 0; + }) > 0 + ) + return 1; return -1; }, }, }, }, - backup:{audio:'twlingbao'}, + backup: { audio: "twlingbao" }, }, - ai:{ - order:1, - result:{player:1}, - combo:'twdanfa' + ai: { + order: 1, + result: { player: 1 }, + combo: "twdanfa", }, }, - twsidao:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + twsidao: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&!player.storage.twsidao; + forced: true, + locked: false, + filter: function (event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && !player.storage.twsidao; }, - content:function(){ - 'step 0' - player.chooseButton(['请选择你的初始法宝',[['gx_lingbaoxianhu','gx_taijifuchen','gx_chongyingshenfu'],'vcard']],true).set('ai',function(button){ - return button.link[2]=='gx_chongyingshenfu'?2:1; - }); - 'step 1' - if(result.bool){ - var card=game.createCard2(result.links[0][2]); + content: function () { + "step 0"; + player + .chooseButton( + [ + "请选择你的初始法宝", + [["gx_lingbaoxianhu", "gx_taijifuchen", "gx_chongyingshenfu"], "vcard"], + ], + true + ) + .set("ai", function (button) { + return button.link[2] == "gx_chongyingshenfu" ? 2 : 1; + }); + ("step 1"); + if (result.bool) { + var card = game.createCard2(result.links[0][2]); lib.inpile.add(result.links[0][2]); - player.storage.twsidao=card; - player.chooseUseTarget(card,'nopopup',true); + player.storage.twsidao = card; + player.chooseUseTarget(card, "nopopup", true); } }, - group:'twsidao_equip', - subSkill:{ - equip:{ - audio:'twsidao', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - var card=player.storage.twsidao; - return card&&card.isInPile()&&player.hasUseTarget(card); + group: "twsidao_equip", + subSkill: { + equip: { + audio: "twsidao", + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + var card = player.storage.twsidao; + return card && card.isInPile() && player.hasUseTarget(card); }, - content:function(){ - player.chooseUseTarget(player.storage.twsidao,'nopopup',true); + content: function () { + player.chooseUseTarget(player.storage.twsidao, "nopopup", true); }, }, }, }, - twrangyi:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + twrangyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:lib.filter.notMe, - delay:0, - content:function(){ - 'step 0' - event.cards=player.getCards('h'); - player.give(event.cards,target).gaintag.add('twrangyi'); - target.addTempSkill('twrangyi2'); - 'step 1' + filterTarget: lib.filter.notMe, + delay: 0, + content: function () { + "step 0"; + event.cards = player.getCards("h"); + player.give(event.cards, target).gaintag.add("twrangyi"); + target.addTempSkill("twrangyi2"); + ("step 1"); target.chooseToUse({ - prompt:'请使用得到的一张牌,或者受到来自'+get.translation(player)+'的1点伤害', - filterCard:function(card,player){ - if(get.itemtype(card)!='card'||!card.hasGaintag('twrangyi')) return false; - return lib.filter.filterCard(card,player,event); + prompt: "请使用得到的一张牌,或者受到来自" + get.translation(player) + "的1点伤害", + filterCard: function (card, player) { + if (get.itemtype(card) != "card" || !card.hasGaintag("twrangyi")) return false; + return lib.filter.filterCard(card, player, event); }, - cards:cards, + cards: cards, }); - 'step 2' - target.removeSkill('twrangyi2'); - if(!result.bool) target.damage('nocard'); + ("step 2"); + target.removeSkill("twrangyi2"); + if (!result.bool) target.damage("nocard"); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var hs=player.getCards('h'); - for(var i=0;i0; + twrangyi2: { + trigger: { player: "useCard" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + var evt = event.getParent(2); + return ( + evt.name == "twrangyi" && + evt.player.isIn() && + player.countCards("h", function (card) { + return card.hasGaintag("twrangyi"); + }) > 0 + ); }, - content:function(){ - var cards=player.getCards('h',function(card){ - return card.hasGaintag('twrangyi'); + content: function () { + var cards = player.getCards("h", function (card) { + return card.hasGaintag("twrangyi"); }); game.delayx(); - player.give(cards,trigger.getParent(2).player); + player.give(cards, trigger.getParent(2).player); }, - onremove:function(player){ - player.removeGaintag('twrangyi'); + onremove: function (player) { + player.removeGaintag("twrangyi"); }, }, - twbaimei:{ - audio:2, - trigger:{ - player:"damageBegin4", + twbaimei: { + audio: 2, + trigger: { + player: "damageBegin4", }, - forced:true, - filter:function(event,player){ - if(player.countCards('h')) return false; - if(event.hasNature()) return true; - return get.type(event.card,'trick')=='trick'; + forced: true, + filter: function (event, player) { + if (player.countCards("h")) return false; + if (event.hasNature()) return true; + return get.type(event.card, "trick") == "trick"; }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(target.countCards('h')) return; - if(get.tag(card,'natureDamage')) return 'zeroplayertarget'; - if(get.type(card)=='trick'&&get.tag(card,'damage')){ - return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if (target.countCards("h")) return; + if (get.tag(card, "natureDamage")) return "zeroplayertarget"; + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; } }, }, }, }, - twhuzhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(e,player){ - return player.countCards('e')>0; + twhuzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (e, player) { + return player.countCards("e") > 0; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0 + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - target.chooseCard('交给'+get.translation(player)+'一张手牌','h',true); - 'step 1' - target.give(result.cards,player); - 'step 2' - if(player.countGainableCards(player,'e')) target.gainPlayerCard(player,'e',true); - 'step 3' - if(target.isDamaged()&&target.hp<=player.hp){ - player.chooseBool('是否令'+get.translation(target)+'回复1点体力?').set('ai',function(){ - return get.recoverEffect(target,player,player); - }); + content: function () { + "step 0"; + target.chooseCard("交给" + get.translation(player) + "一张手牌", "h", true); + ("step 1"); + target.give(result.cards, player); + ("step 2"); + if (player.countGainableCards(player, "e")) target.gainPlayerCard(player, "e", true); + ("step 3"); + if (target.isDamaged() && target.hp <= player.hp) { + player + .chooseBool("是否令" + get.translation(target) + "回复1点体力?") + .set("ai", function () { + return get.recoverEffect(target, player, player); + }); } - 'step 4' - if(result.bool) target.recover(); + ("step 4"); + if (result.bool) target.recover(); }, - ai:{ - order:8, - result:{ - target:function(player,target){ - var eff=(target.isDamaged()&&target.hp<=player.hp)?get.recoverEffect(target,player,target):0; - if(eff<=0&&!player.countGainableCards(target,'e')) return -1; + ai: { + order: 8, + result: { + target: function (player, target) { + var eff = + target.isDamaged() && target.hp <= player.hp + ? get.recoverEffect(target, player, target) + : 0; + if (eff <= 0 && !player.countGainableCards(target, "e")) return -1; return eff; }, }, }, }, - twliancai:{ - audio:2, - trigger:{player:['turnOverEnd','phaseJieshuBegin']}, - filter:function(card,player,target){ - return target=='phaseJieshuBegin'||player.countCards('h')0; + filterTarget: function (card, player, target) { + return target != player && target.countGainableCards(player, "e") > 0; }, - check:function(card,player){ - if(card.name=='turnOver') return true; - if(player.isTurnedOver()) return true; - if(player.hp-player.countCards('h')>1) return true; - return game.hasPlayer(function(current){ - return lib.skill.twliancai.filterTarget(null,player,current)&&lib.skill.twliancai.filterAI(current); + check: function (card, player) { + if (card.name == "turnOver") return true; + if (player.isTurnedOver()) return true; + if (player.hp - player.countCards("h") > 1) return true; + return game.hasPlayer(function (current) { + return ( + lib.skill.twliancai.filterTarget(null, player, current) && + lib.skill.twliancai.filterAI(current) + ); }); }, - filterAI:function(target){ - var player=_status.event.player; - var att=get.attitude(player,target); - if(target.isDamaged()&&target.countCards('e','baiyin')&&att>0) return 2*att; + filterAI: function (target) { + var player = _status.event.player; + var att = get.attitude(player, target); + if (target.isDamaged() && target.countCards("e", "baiyin") && att > 0) return 2 * att; return -att; }, - prompt2:function(card,player,target){ - return card.name=='phaseJieshu'?'将武将牌翻面,然后获得一名其他角色装备区内的一张牌':'将手牌摸至与体力值相同'; + prompt2: function (card, player, target) { + return card.name == "phaseJieshu" + ? "将武将牌翻面,然后获得一名其他角色装备区内的一张牌" + : "将手牌摸至与体力值相同"; }, - content:function(){ - 'step 0' - if(event.triggername=='phaseJieshuBegin') player.turnOver(); - else{ - player.draw(player.hp-player.countCards('h')); + content: function () { + "step 0"; + if (event.triggername == "phaseJieshuBegin") player.turnOver(); + else { + player.draw(player.hp - player.countCards("h")); event.finish(); } - 'step 1' - player.chooseTarget('获得一名角色装备区内的一张牌',lib.skill.twliancai.filterTarget).ai=lib.skill.twliancai.filterAI; - 'step 2' - if(result.bool){ - player.line(result.targets,'thunder'); - player.gainPlayerCard('e',true,result.targets[0]); + ("step 1"); + player.chooseTarget("获得一名角色装备区内的一张牌", lib.skill.twliancai.filterTarget).ai = + lib.skill.twliancai.filterAI; + ("step 2"); + if (result.bool) { + player.line(result.targets, "thunder"); + player.gainPlayerCard("e", true, result.targets[0]); } }, }, - twqijia:{ + twqijia: { //group:'twqijia_alka', - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('e',function(card){ - return !player.getStorage('twqijia_alka').includes(get.subtype(card)); + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("e", function (card) { + return !player.getStorage("twqijia_alka").includes(get.subtype(card)); }); }, - filterTarget:function(card,player,target){ - return target!=player&&player.canUse({name:'sha'},target); + filterTarget: function (card, player, target) { + return target != player && player.canUse({ name: "sha" }, target); }, - position:'e', - filterCard:function(card,player){ - return !player.getStorage('twqijia_alka').includes(get.subtype(card)); + position: "e", + filterCard: function (card, player) { + return !player.getStorage("twqijia_alka").includes(get.subtype(card)); }, - content:function(){ - 'step 0' - player.addTempSkill('twqijia_alka'); + content: function () { + "step 0"; + player.addTempSkill("twqijia_alka"); player.storage.twqijia_alka.push(get.subtype(cards[0])); - player.useCard({name:'sha'},target,false); + player.useCard({ name: "sha" }, target, false); }, - subSkill:{ - alka:{ - charlotte:true, - onremove:function(player){ + subSkill: { + alka: { + charlotte: true, + onremove: function (player) { delete player.storage.twqijia_alka; delete player.storage.twzhuchen; - player.unmarkSkill('twzhuchen'); + player.unmarkSkill("twzhuchen"); }, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; - if(!player.storage.twzhuchen) player.storage.twzhuchen=[]; + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + if (!player.storage.twzhuchen) player.storage.twzhuchen = []; }, - mod:{ - globalFrom:function(from,to,distance){ - if(from.storage.twzhuchen&&from.storage.twzhuchen.includes(to)) return -Infinity; - } - }, - }, - }, - check:function(card){ - return 7-get.value(card); - }, - ai:{ - order:function(){ - return get.order({name:'sha'})-0.2; - }, - result:{ - target:function(player,target){ - return get.effect(target,{name:'sha'},player,player); - }, - }, - }, - }, - twzhuchen:{ - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h',lib.skill.twzhuchen.filterCard)>0; - }, - filterCard:function(card,player){ - var name=get.name(card,player); - return name=='tao'||name=='jiu'; - }, - filterTarget:lib.filter.notMe, - content:function(){ - player.addTempSkill('twqijia_alka'); - player.storage.twzhuchen.add(target); - player.markSkill('twzhuchen'); - }, - intro:{ - content:function(content,player){ - return '至'+get.translation(content)+'的距离视为1'; - }, - }, - }, - twxiaolian:{ - audio:2, - trigger:{global:'useCardToTarget'}, - logTarget:'target', - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.player!=player&& - event.targets.length==1&&event.targets[0]!=player; - }, - check:function(event,player){ - return get.effect(event.targets[0],event.card,event.player,player)<=get.effect(player,event.card,event.player,player); - }, - content:function(){ - trigger.getParent().twxiaolian=trigger.targets[0]; - trigger.targets.length=0; - trigger.getParent().triggeredTargets2.length=0; - trigger.targets.push(player); - }, - group:'twxiaolian_damage', - subSkill:{ - distance:{ - sub:true, - charlotte:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; - }, - mark:true, - marktext:'马', - intro:{ - content:'cards', - onunmark:'throw', - }, - mod:{ - globalTo:function(from,to,distance){ - if(from!=to&&to.storage.twxiaolian_distance) return distance+to.storage.twxiaolian_distance.length; + mod: { + globalFrom: function (from, to, distance) { + if (from.storage.twzhuchen && from.storage.twzhuchen.includes(to)) + return -Infinity; }, }, }, - damage:{ - sub:true, - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return event.getParent(2).twxiaolian!=undefined; + }, + check: function (card) { + return 7 - get.value(card); + }, + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.2; + }, + result: { + target: function (player, target) { + return get.effect(target, { name: "sha" }, player, player); }, - content:function(){ - 'step 0' - var target=trigger.getParent(2).twxiaolian; - event.target=target; - player.chooseCard('是否将一张牌当做【马】置于'+get.translation(target)+'的武将牌旁?','he').ai=function(card){ - if(get.attitude(_status.event.player,_status.event.getParent('twxiaolian_damage').target)>2) return 7-get.value(card); + }, + }, + }, + twzhuchen: { + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h", lib.skill.twzhuchen.filterCard) > 0; + }, + filterCard: function (card, player) { + var name = get.name(card, player); + return name == "tao" || name == "jiu"; + }, + filterTarget: lib.filter.notMe, + content: function () { + player.addTempSkill("twqijia_alka"); + player.storage.twzhuchen.add(target); + player.markSkill("twzhuchen"); + }, + intro: { + content: function (content, player) { + return "至" + get.translation(content) + "的距离视为1"; + }, + }, + }, + twxiaolian: { + audio: 2, + trigger: { global: "useCardToTarget" }, + logTarget: "target", + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.player != player && + event.targets.length == 1 && + event.targets[0] != player + ); + }, + check: function (event, player) { + return ( + get.effect(event.targets[0], event.card, event.player, player) <= + get.effect(player, event.card, event.player, player) + ); + }, + content: function () { + trigger.getParent().twxiaolian = trigger.targets[0]; + trigger.targets.length = 0; + trigger.getParent().triggeredTargets2.length = 0; + trigger.targets.push(player); + }, + group: "twxiaolian_damage", + subSkill: { + distance: { + sub: true, + charlotte: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + mark: true, + marktext: "马", + intro: { + content: "cards", + onunmark: "throw", + }, + mod: { + globalTo: function (from, to, distance) { + if (from != to && to.storage.twxiaolian_distance) + return distance + to.storage.twxiaolian_distance.length; + }, + }, + }, + damage: { + sub: true, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return event.getParent(2).twxiaolian != undefined; + }, + content: function () { + "step 0"; + var target = trigger.getParent(2).twxiaolian; + event.target = target; + player.chooseCard( + "是否将一张牌当做【马】置于" + get.translation(target) + "的武将牌旁?", + "he" + ).ai = function (card) { + if ( + get.attitude( + _status.event.player, + _status.event.getParent("twxiaolian_damage").target + ) > 2 + ) + return 7 - get.value(card); return 0; }; - 'step 1' - if(result.bool){ - player.logSkill('twxiaolian',target); - player.lose(result.cards,ui.special,'toStorage'); - target.addSkill('twxiaolian_distance'); + ("step 1"); + if (result.bool) { + player.logSkill("twxiaolian", target); + player.lose(result.cards, ui.special, "toStorage"); + target.addSkill("twxiaolian_distance"); target.storage.twxiaolian_distance.addArray(result.cards); - target.markSkill('twxiaolian_distance'); + target.markSkill("twxiaolian_distance"); } }, }, }, }, - twtijin:{ - audio:2, - trigger:{global:'useCardToPlayer'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.player!=player&&event.target!=player&& - event.targets.length==1&&event.player.inRange(player); + twtijin: { + audio: 2, + trigger: { global: "useCardToPlayer" }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + event.player != player && + event.target != player && + event.targets.length == 1 && + event.player.inRange(player) + ); }, - logTarget:'target', - check:function(event,player){ - return get.effect(event.targets[0],event.card,event.player,player)<=get.effect(player,event.card,event.player,player); + logTarget: "target", + check: function (event, player) { + return ( + get.effect(event.targets[0], event.card, event.player, player) <= + get.effect(player, event.card, event.player, player) + ); }, - content:function(){ - 'step 0' - trigger.targets.length=0; - trigger.getParent().triggeredTargets1.length=0; + content: function () { + "step 0"; + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; trigger.targets.push(player); - var next=game.createEvent('twtijin_discard',null,trigger.getParent(2)); - next.player=player; - next.target=trigger.player; - next.setContent(function(){ - if(target.isDead()||!target.countCards('he')) return; - player.line(target,'green'); - player.discardPlayerCard(target,true,'he'); + var next = game.createEvent("twtijin_discard", null, trigger.getParent(2)); + next.player = player; + next.target = trigger.player; + next.setContent(function () { + if (target.isDead() || !target.countCards("he")) return; + player.line(target, "green"); + player.discardPlayerCard(target, true, "he"); }); }, }, - twyanqin:{ - forbid:['guozhan'], - audio:2, - trigger:{player:'phaseBegin'}, - direct:true, - content:function(){ - 'step 0' - var list=[]; - if(player.group!='wei') list.push('wei2'); - if(player.group!='shu') list.push('shu2'); - list.push('cancel2'); - player.chooseControl(list).set('ai',function(){ - return list.randomGet(); - }).set('prompt',get.prompt2('twyanqin')); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('twyanqin'); - var group=result.control.slice(0,3); + twyanqin: { + forbid: ["guozhan"], + audio: 2, + trigger: { player: "phaseBegin" }, + direct: true, + content: function () { + "step 0"; + var list = []; + if (player.group != "wei") list.push("wei2"); + if (player.group != "shu") list.push("shu2"); + list.push("cancel2"); + player + .chooseControl(list) + .set("ai", function () { + return list.randomGet(); + }) + .set("prompt", get.prompt2("twyanqin")); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("twyanqin"); + var group = result.control.slice(0, 3); player.changeGroup(group); } }, }, - twbaobian:{ - audio:2, - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - var card=event.card; - if(!card||(card.name!='sha'&&card.name!='juedou')) return false; - return event.player.group==player.group||event.player.countCards('h')>event.player.hp + twbaobian: { + audio: 2, + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + var card = event.card; + if (!card || (card.name != "sha" && card.name != "juedou")) return false; + return ( + event.player.group == player.group || event.player.countCards("h") > event.player.hp + ); }, - check:function(event,player){ - var att=get.attitude(player,event.player); - if(event.player.group==player.group) return att>0; - return att<0; + check: function (event, player) { + var att = get.attitude(player, event.player); + if (event.player.group == player.group) return att > 0; + return att < 0; }, - logTarget:'player', - content:function(){ - var target=trigger.player; - if(target.group==player.group){ + logTarget: "player", + content: function () { + var target = trigger.player; + if (target.group == player.group) { trigger.cancel(); - var num=target.maxHp-target.countCards('h'); - if(num) target.draw(num); - } - else{ - player.discardPlayerCard(target,'h',true,target.countCards('h')-target.hp) + var num = target.maxHp - target.countCards("h"); + if (num) target.draw(num); + } else { + player.discardPlayerCard(target, "h", true, target.countCards("h") - target.hp); } }, }, - chijie:{ - audio:true, - forbid:['guozhan'], - trigger:{ - global:'phaseBefore', - player:'enterGame', + chijie: { + audio: true, + forbid: ["guozhan"], + trigger: { + global: "phaseBefore", + player: "enterGame", }, - direct:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&game.hasPlayer(function(current){ - return current.group!=player.group&&lib.group.includes(current.group); + direct: true, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer(function (current) { + return current.group != player.group && lib.group.includes(current.group); + }) + ); + }, + content: function () { + "step 0"; + var list = lib.group.filter(function (group) { + return ( + group != player.group && + game.hasPlayer(function (current) { + return current.group == group; + }) + ); }); - }, - content:function(){ - 'step 0' - var list=lib.group.filter(function(group){ - return group!=player.group&&game.hasPlayer(function(current){ - return current.group==group; + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("chijie")) + .set("prompt2", "将自己的势力变更为场上存在的一个势力") + .set("ai", function () { + return list.randomGet(); }); - }); - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt('chijie')).set('prompt2','将自己的势力变更为场上存在的一个势力').set('ai',function(){ - return list.randomGet(); - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('chijie'); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("chijie"); player.changeGroup(result.control); } }, }, - waishi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - let used=player.getStat('skill').waishi; - if(used&&used>player.countMark('waishi_remover')) return false; - return player.countCards('he')>0&&game.hasPlayer(target=>target!=player&&target.countCards('h')>0); + waishi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + let used = player.getStat("skill").waishi; + if (used && used > player.countMark("waishi_remover")) return false; + return ( + player.countCards("he") > 0 && + game.hasPlayer((target) => target != player && target.countCards("h") > 0) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>=ui.selected.cards.length; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") >= ui.selected.cards.length; }, - filterCard:true, - position:'he', - check:function(card){ - if(!game.hasPlayer(function(current){ - return current!=_status.event.player&¤t.countCards('h')>ui.selected.cards.length; - })) return 0; - return 6-get.value(card); + filterCard: true, + position: "he", + check: function (card) { + if ( + !game.hasPlayer(function (current) { + return ( + current != _status.event.player && + current.countCards("h") > ui.selected.cards.length + ); + }) + ) + return 0; + return 6 - get.value(card); }, - selectCard:function(){ - if(!ui.selected.targets.length) return [1,game.countGroup()]; - return [1,Math.min(ui.selected.targets[0].countCards('h'),game.countGroup())]; + selectCard: function () { + if (!ui.selected.targets.length) return [1, game.countGroup()]; + return [1, Math.min(ui.selected.targets[0].countCards("h"), game.countGroup())]; }, - discard:false, - lose:false, - delay:0, - content:function(){ - 'step 0' - player.choosePlayerCard(target,true,'h',cards.length); - 'step 1' - player.swapHandcards(target,cards,result.cards); + discard: false, + lose: false, + delay: 0, + content: function () { + "step 0"; + player.choosePlayerCard(target, true, "h", cards.length); + ("step 1"); + player.swapHandcards(target, cards, result.cards); game.delayex(); - 'step 2' - if(target.countCards('h')>player.countCards('h')||player.group==target.group) player.draw(); + ("step 2"); + if (target.countCards("h") > player.countCards("h") || player.group == target.group) + player.draw(); }, - ai:{ - order:7, - result:{ - player:function(player,target){ - if(player.countCards('h'){ - return current.group!=player.group&&lib.group.includes(current.group); - })) controls.unshift('选项一'); - if(game.hasPlayer(current=>current!=player)) controls.push('选项三'); - player.chooseControl(controls,'cancel2').set('prompt',get.prompt('renshe')).set('choiceList',choiceList).set('ai',function(){ - if(game.hasPlayer(function(current){ - return get.attitude(player,current)>0||current.hasSkillTag('nogain'); - })) return '选项三' - return '选项二'; - }); - 'step 1' - if(result.control=='cancel2') event.finish(); - else{ - player.logSkill('renshe'); - switch(result.control){ - case '选项一': + var controls = ["选项二"]; + if ( + game.hasPlayer((current) => { + return current.group != player.group && lib.group.includes(current.group); + }) + ) + controls.unshift("选项一"); + if (game.hasPlayer((current) => current != player)) controls.push("选项三"); + player + .chooseControl(controls, "cancel2") + .set("prompt", get.prompt("renshe")) + .set("choiceList", choiceList) + .set("ai", function () { + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) > 0 || current.hasSkillTag("nogain"); + }) + ) + return "选项三"; + return "选项二"; + }); + ("step 1"); + if (result.control == "cancel2") event.finish(); + else { + player.logSkill("renshe"); + switch (result.control) { + case "选项一": event.goto(3); break; - case '选项二': - player.addMark('waishi_remover',1,false); - player.addTempSkill('waishi_remover',{player:'phaseUseAfter'}); + case "选项二": + player.addMark("waishi_remover", 1, false); + player.addTempSkill("waishi_remover", { player: "phaseUseAfter" }); event.finish(); break; - case '选项三': - player.chooseTarget('请选择一名角色,与其各摸一张牌',lib.filter.notMe,true).set('ai',function(target){ - if(target.hasSkillTag('nogain')) return 0.1; - return get.attitude(_status.event.player,target); - }) + case "选项三": + player + .chooseTarget("请选择一名角色,与其各摸一张牌", lib.filter.notMe, true) + .set("ai", function (target) { + if (target.hasSkillTag("nogain")) return 0.1; + return get.attitude(_status.event.player, target); + }); } } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - game.asyncDraw([player,target].sortBySeat()); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.asyncDraw([player, target].sortBySeat()); } game.delayex(); event.finish(); - 'step 3' - var list=lib.group.filter(function(group){ - return group!=player.group&&game.hasPlayer(function(current){ - return current.group==group; + ("step 3"); + var list = lib.group.filter(function (group) { + return ( + group != player.group && + game.hasPlayer(function (current) { + return current.group == group; + }) + ); + }); + player + .chooseControl(list) + .set("prompt", get.prompt("chijie")) + .set("prompt2", "将自己的势力变更为场上存在的一个势力") + .set("ai", function () { + return list.randomGet(); }); - }); - player.chooseControl(list).set('prompt',get.prompt('chijie')).set('prompt2','将自己的势力变更为场上存在的一个势力').set('ai',function(){ - return list.randomGet(); - }); - 'step 4' + ("step 4"); player.changeGroup(result.control); }, }, //英文版特典武将凯撒 - zhengfu:{ - trigger:{ - player:"useCardToPlayered", + zhengfu: { + trigger: { + player: "useCardToPlayered", }, - check:function (event,player){ - return get.attitude(player,event.target)<0; + check: function (event, player) { + return get.attitude(player, event.target) < 0; }, - filter:function(event,player){ - return event.card.name=='sha'; + filter: function (event, player) { + return event.card.name == "sha"; }, - logTarget:"target", - line:false, - content:function(){ - 'step 0' - player.line(trigger.target,{color:[220, 90, 139]}); - player.chooseControl(['basic','trick','equip']).set('ai',function(){ - var player=_status.event.target; - if(!player.countCards('h','sha')&&player.countCards('h','shan')) return 'trick'; - return 'basic'; - }).set('prompt','请选择一种牌的类别').set('target',trigger.target); - 'step 1' - trigger.target.chooseCard('he','交给'+get.translation(player)+'一张'+get.translation(result.control)+'牌,否则此【杀】不可被闪避',function(card){ - return get.type2(card)==_status.event.control; - }).set('ai',function(card){ - var num=_status.event.num; - if(num==0) return 0; - if(card.name=='shan') return num>1?2:0; - return 8-get.value(card); - }).set('num',trigger.target.countCards('h','shan')).set('control',result.control); - 'step 2' - if(result.bool){ - var cards=result.cards; - trigger.target.give(cards,player); - } - else{ + logTarget: "target", + line: false, + content: function () { + "step 0"; + player.line(trigger.target, { color: [220, 90, 139] }); + player + .chooseControl(["basic", "trick", "equip"]) + .set("ai", function () { + var player = _status.event.target; + if (!player.countCards("h", "sha") && player.countCards("h", "shan")) + return "trick"; + return "basic"; + }) + .set("prompt", "请选择一种牌的类别") + .set("target", trigger.target); + ("step 1"); + trigger.target + .chooseCard( + "he", + "交给" + + get.translation(player) + + "一张" + + get.translation(result.control) + + "牌,否则此【杀】不可被闪避", + function (card) { + return get.type2(card) == _status.event.control; + } + ) + .set("ai", function (card) { + var num = _status.event.num; + if (num == 0) return 0; + if (card.name == "shan") return num > 1 ? 2 : 0; + return 8 - get.value(card); + }) + .set("num", trigger.target.countCards("h", "shan")) + .set("control", result.control); + ("step 2"); + if (result.bool) { + var cards = result.cards; + trigger.target.give(cards, player); + } else { trigger.getParent().directHit.add(trigger.target); game.delay(); } - } - } + }, + }, }, - perfectPair:{ - tw_liufuren:['yuanshao'], - tw_xiahoushang:['caopi'], + perfectPair: { + tw_liufuren: ["yuanshao"], + tw_xiahoushang: ["caopi"], }, - characterReplace:{ - tw_caocao:['tw_caocao','jsrg_caocao','yj_caocao'], - mateng:['tw_mateng','mateng'], - xiahouen:['tw_xiahouen','jsrg_xiahouen'], - jiangji:['dc_jiangji','tw_jiangji','jiangji'], - baoxin:['tw_baoxin','baoxin'], - yanxiang:['yanxiang','tw_yanxiang'], - liwei:['liwei','tw_liwei'], + characterReplace: { + tw_caocao: ["tw_caocao", "jsrg_caocao", "yj_caocao"], + mateng: ["tw_mateng", "mateng"], + xiahouen: ["tw_xiahouen", "jsrg_xiahouen"], + jiangji: ["dc_jiangji", "tw_jiangji", "jiangji"], + baoxin: ["tw_baoxin", "baoxin"], + yanxiang: ["yanxiang", "tw_yanxiang"], + liwei: ["liwei", "tw_liwei"], }, - dynamicTranslate:{ - twfeifu:function(player){ - var str='锁定技,转换技。'; - if(!player.storage.twfeifu) str+=''; - str+='阴:当你成为【杀】的唯一目标后;'; - if(!player.storage.twfeifu) str+=''; - if(player.storage.twfeifu) str+=''; - str+='阳:当你使用【杀】指定唯一目标后;'; - if(player.storage.twfeifu) str+=''; - str+='目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。'; + dynamicTranslate: { + twfeifu: function (player) { + var str = "锁定技,转换技。"; + if (!player.storage.twfeifu) str += ''; + str += "阴:当你成为【杀】的唯一目标后;"; + if (!player.storage.twfeifu) str += ""; + if (player.storage.twfeifu) str += ''; + str += "阳:当你使用【杀】指定唯一目标后;"; + if (player.storage.twfeifu) str += ""; + str += "目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。"; return str; }, - twfengpo:function(player){ - if(player.storage.twfengpo) return '当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的红色牌数)。'; - return '①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。'; + twfengpo: function (player) { + if (player.storage.twfengpo) + return "当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的红色牌数)。"; + return "①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。"; }, - twjiexun:function(player){ - return lib.translate[player.hasSkill('funan_jiexun')?'twjiexunx_info':'twjiexun_info']; + twjiexun: function (player) { + return lib.translate[player.hasSkill("funan_jiexun") ? "twjiexunx_info" : "twjiexun_info"]; }, twzhenliang: function (player) { - if(player.storage.twzhenliang) return '转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; + if (player.storage.twzhenliang) + return '转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; return '转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。'; }, - twdengjian:function(player){ - let str='①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。'; - if(player.hasSkill('twdengjian_ban')) str=''+str+''; - str+='②你使用“剑法”牌不计入次数限制。'; + twdengjian: function (player) { + let str = + "①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。"; + if (player.hasSkill("twdengjian_ban")) str = '' + str + ""; + str += "②你使用“剑法”牌不计入次数限制。"; return str; }, - twduwang(player){ - let str='使命技。'; - if(!player.storage.twduwang_fail) str+='①'; - str+='出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。'; - if(!player.storage.twduwang_fail) str+=`\ + twduwang(player) { + let str = "使命技。"; + if (!player.storage.twduwang_fail) str += "①"; + str += + "出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。"; + if (!player.storage.twduwang_fail) + str += `\ ②当你处于濒死状态时,其他角色不能对你使用【桃】。\ ③使命:使用【决斗】或成为【决斗】目标的次数之和不小于4(若游戏总人数小于4则改为3)。\ ④成功:准备阶段,若你于你的上回合完成了〖独往③〗的使命,则你重置〖独往〗并将〖独往〗修改至只保留〖独往①〗的效果,选择一项:⒈获得〖狭勇〗;⒉重置〖延势〗并令其获得历战效果。\ ⑤失败:当你死亡时,使命失败。`; return str; }, - twylyanshi(player){ - return lib.translate[(player.storage.twduwang_ylyanshi?'twylyanshix':'twylyanshi')+'_info']; + twylyanshi(player) { + return lib.translate[ + (player.storage.twduwang_ylyanshi ? "twylyanshix" : "twylyanshi") + "_info" + ]; }, }, - translate:{ - tw_beimihu:'TW卑弥呼', - tw_beimihu_prefix:'TW', - nashime:'难升米', - tw_xiahouba:'TW夏侯霸', - tw_xiahouba_prefix:'TW', - tw_zumao:'TW祖茂', - tw_zumao_prefix:'TW', - tw_caoang:'TW曹昂', - tw_caoang_prefix:'TW', - tw_dingfeng:'TW丁奉', - tw_dingfeng_prefix:'TW', - tw_caohong:'TW将曹洪', - tw_caohong_prefix:'TW将', - tw_maliang:'TW马良', - tw_maliang_prefix:'TW', + translate: { + tw_beimihu: "TW卑弥呼", + tw_beimihu_prefix: "TW", + nashime: "难升米", + tw_xiahouba: "TW夏侯霸", + tw_xiahouba_prefix: "TW", + tw_zumao: "TW祖茂", + tw_zumao_prefix: "TW", + tw_caoang: "TW曹昂", + tw_caoang_prefix: "TW", + tw_dingfeng: "TW丁奉", + tw_dingfeng_prefix: "TW", + tw_caohong: "TW将曹洪", + tw_caohong_prefix: "TW将", + tw_maliang: "TW马良", + tw_maliang_prefix: "TW", - twyanqin:'姻亲', - twyanqin_info:'准备阶段,你可以将势力变更为魏或蜀。', - twbaobian:'豹变', - twbaobian_info:'当你使用【杀】或【决斗】造成伤害时,若目标角色的势力与你相同,则你可以防止此伤害,然后其将手牌数补充至与体力值相同。若不同且其手牌数大于体力值,则你可以将其手牌弃置至与其体力值相同。', - twtijin:'替巾', - twtijin_info:'当你攻击范围内的一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,此【杀】结算完成后,你弃置该角色的一张牌。', - twxiaolian:'孝廉', - twxiaolian_info:'当一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,当你受到此【杀】的伤害后,你可以将一张牌置于此【杀】原目标的武将牌旁,称为“马”,且令其获得如下效果:其他角色计算至其的距离+X(X为其武将牌旁的“马”数)。', - twqijia:'弃甲', - twqijia_info:'出牌阶段,你可以弃置一张装备区内的牌(每种类型的装备牌限一次),然后视为对攻击范围内的一名其他角色使用了一张【杀】。', - twzhuchen:'诛綝', - twzhuchen_info:'出牌阶段,你可以弃置一张【桃】或【酒】并选择一名其他角色。你与其的距离视为1直到此阶段结束。', - twhuzhu:'护主', - twhuzhu_info:'出牌阶段限一次,若你的装备区内有牌,则你可以令一名其他角色交给你一张手牌,然后获得你装备区内的一张牌。若其体力值不大于你,则你可以令其回复1点体力。', - twliancai:'敛财', - twliancai_info:'结束阶段,你可以将武将牌翻面,然后获得一名其他角色装备区内的一张牌。当你的武将牌翻面时,你可以将手牌补至与体力值相同。', - twrangyi:'攘夷', - twrangyi2:'攘夷', - twrangyi_info:'出牌阶段限一次,你可以将所有手牌交给一名其他角色,然后令其选择一项:1.使用其中的一张牌,并于此牌被使用时将其余的牌交还给你。2.受到来自你的1点伤害。', - twbaimei:'白眉', - twbaimei_info:'锁定技,若你没有手牌,则防止你受到的所有属性伤害和锦囊牌造成的伤害。', - chijie:'持节', - chijie_info:' 游戏开始时,你可以选择一个现存势力,你的势力视为该势力。', - waishi:'外使', - waishi_info:' 出牌阶段限一次,你可以用至多X张牌交换一名其他角色等量的手牌(X为现存势力数),然后若其与你势力相同或手牌多于你,你摸一张牌。', - renshe:'忍涉', - renshe_info:'当你受到伤害后,你可以选择一项:将势力改为现存的另一个势力;或可以额外发动一次“外使”直到你的下个出牌阶段结束;或与另一名其他角色各摸一张牌。', - tw_gexuan:'TW葛玄', - tw_gexuan_prefix:'TW', - twdanfa:'丹法', - twdanfa_info:'准备阶段或结束阶段开始时,你可将一张牌置于武将牌上,称为“丹”。每回合每种花色限一次,当你使用牌时,若“丹”中有与此牌花色相同的牌,则你摸一张牌。', - twlingbao:'灵宝', - twlingbao_info:'出牌阶段限一次,你可以将两张花色不同的“丹”置入弃牌堆。若这两张牌:均为红色,你令一名其他角色回复1点体力;均为黑色,你弃置一名其他角色区域内至多两张区域不同牌;颜色不同,则你令一名角色摸一张牌,并令另一名角色弃置一张牌。', - twsidao:'司道', - twsidao_info:'游戏开始时,你选择一张“法宝”置入装备区。准备阶段,若你以此法选择的法宝在牌堆/弃牌堆中,则你使用之。', - gx_lingbaoxianhu:'灵宝仙壶', - gx_lingbaoxianhu_info:'锁定技,当你造成点数大于1的伤害后,或有角色死亡后,你加1点体力上限并回复1点体力。', - gx_taijifuchen:'太极拂尘', - gx_taijifuchen_info:'锁定技,当你使用【杀】指定目标后,你令目标角色选择一项:①弃置一张牌,若此牌和【杀】花色相同,则你获得之。②其不可响应此【杀】。', - gx_chongyingshenfu:'冲应神符', - gx_chongyingshenfu_info:'锁定技。①当你受到牌造成的伤害后,你记录此牌的名称。②当你受到〖冲应神符①〗记录过的牌造成的伤害时,你令此牌伤害-1。', - tw_dongzhao:'TW董昭', - tw_dongzhao_prefix:'TW', - twmiaolve:'妙略', - twmiaolve_info:'游戏开始时,你获得两张【瞒天过海】。当你受到1点伤害后,你可选择:①获得一张【瞒天过海】并摸一张牌。②获得一张智囊。', - twyingjia:'迎驾', - twyingjia_info:'一名角色的回合结束时,若你本回合内使用过两张或更多的同名锦囊牌,则你可弃置一张手牌并令一名角色进行一个额外回合。', - dz_mantianguohai:'瞒天过海', - dz_mantianguohai_info:'此牌不计入拥有者的手牌上限。出牌阶段,对一至两名区域内有牌的其他角色使用。你获得目标角色一张牌,然后依次交给每名目标角色各一张牌。', - jiachong:'TW贾充', - jiachong_prefix:'TW', - beini:'悖逆', - beini_info:'出牌阶段限一次,你可以选择一名体力值不小于你的角色,令你或其摸两张牌,然后未摸牌的角色视为对摸牌的角色使用一张【杀】。', - dingfa:'定法', - dingfa_info:'弃牌阶段结束时,若本回合你失去的牌数不小于你的体力值,你可以选择一项:1、回复1点体力;2、对一名其他角色造成1点伤害。', - duosidawang:'朵思大王', - equan:'恶泉', - equan_info:'锁定技。①当有角色于你的回合内受到伤害后,其获得X枚“毒”(X为伤害值)。②准备阶段,你令所有拥有“毒”标记的角色移去所有“毒”标记并失去等量的体力。③当有角色因〖恶泉②〗进入濒死状态时,你令其所有技能失效直到回合结束。', - manji:'蛮汲', - manji_info:'锁定技。其他角色失去体力后,若你的体力值:不大于该角色,你回复1点体力;不小于该角色,你摸一张牌。', - wuban:'TW吴班', - wuban_prefix:'TW', - jintao:'进讨', - jintao_info:'锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】伤害+1,第二张【杀】不可被响应。', - yuejiu:'TW乐就', - yuejiu_prefix:'TW', - cuijin:'催进', - cuijin_info:'当你或你攻击范围内的角色使用【杀】时,你可以弃置一张牌并获得如下效果:此【杀】的伤害值基数+1,且当此【杀】结算结束后,若未造成过伤害,则你对使用者造成1点伤害。', - tw_zhaoxiang:'TW赵襄', - tw_zhaoxiang_prefix:'TW', - twfuhan:'扶汉', - twfuhan_info:'限定技。准备阶段开始时时,你可以移去所有"梅影"标记,然后从五张未登场的蜀势力武将牌中选择一名获得其所有技能,将体力上限数调整为以此技能移去所有“梅影”标记的数量(最少为2,最多为8)并回复1点体力,然后从牌堆/弃牌堆/场上获得【梅影枪】。', - twqueshi:'鹊拾', - twqueshi_info:'游戏开始时,你将【梅影枪】置于你的装备区。', - meiyingqiang:'梅影枪', - meiyingqiang_info:'当你于其他角色的回合内第一次失去牌时,你可以使用一张【杀】。', - tw_fuwan:'TW伏完', - tw_fuwan_prefix:'TW', - twmoukui:'谋溃', - twmoukui_info:'当你使用【杀】指定目标后,你可以选择一项:①摸一张牌;②弃置该角色的一张牌;③背水:若此【杀】未因造成伤害而令该角色进入过濒死状态,则该角色弃置你的一张牌。', - tw_yujin:'SP于禁', - tw_yujin_prefix:'SP', - xinzhenjun:'镇军', - xinzhenjun_info:'出牌阶段开始时,你可以将一张牌交给一名其他角色,令其选择是否使用一张不为黑色的【杀】。若其选择是,则你于此【杀】结算完成后摸1+X张牌(X为此【杀】造成的伤害总点数)。若其选择否,则你对其或其攻击范围内的一名其他角色造成1点伤害。', - tw_hucheer:'TW胡车儿', - tw_hucheer_prefix:'TW', - twshenxing:'神行', - twshenxing_info:'锁定技。若你的装备区内没有坐骑牌,则你至其他角色的距离-1且手牌上限+1。', - twdaoji:'盗戟', - twdaoji_info:'出牌阶段限一次,你可以弃置一张非基本牌并选择一名攻击范围内的角色,获得其一张牌。若你以此法得到的牌为:基本牌,你摸一张牌;装备牌,你使用此牌并对其造成1点伤害。', - tw_hejin:'TW何进', - tw_hejin_prefix:'TW', - twmouzhu:'谋诛', - twmouzhu_info:'出牌阶段限一次,你可以选择一名其他角色A。你令除A外所有体力值小于等于你的其他角色依次选择是否交给你一张牌。若你以此法得到的牌数X:等于0,你和所有进行选择的角色依次失去1点体力。大于0,你令A选择由你视为对其使用一张伤害值基数为X的【杀】或【决斗】。', - twyanhuo:'延祸', - twyanhuo_info:'当你死亡时,你可以选择一项:①令一名其他角色弃置X张牌。②令X名其他角色依次弃置一张牌。(X为你的牌数)', - tw_mayunlu:'TW马云禄', - tw_mayunlu_prefix:'TW', - twfengpo:'凤魄', - twfengpo_info:'①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。', - tw_re_caohong:'TW曹洪', - tw_re_caohong_prefix:'TW', - twyuanhu:'援护', - twyuanhu_info:'出牌阶段限一次。你可将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌,且你可以于本回合的结束阶段发动一次〖援护〗。', - twjuezhu:'决助', - twjuezhu_info:'限定技。准备阶段,你可废除一个坐骑栏,令一名角色获得〖飞影〗并废除判定区。该角色死亡后,你恢复以此法废除的装备栏。', - tw_zangba:'TW臧霸', - tw_zangba_prefix:'TW', - twhanyu:'捍御', - twhanyu_info:'锁定技。游戏开始时,你获得牌堆中的基本牌,锦囊牌,装备牌各一张。', - twhengjiang:'横江', - twhengjiang_info:'出牌阶段限一次,当你使用基本牌或普通锦囊牌指定唯一目标后,你可将此牌的目标改为攻击范围内的所有合法目标,然后你于此牌结算结束后摸X张牌(X为因响应此牌而使用或打出过牌的角色数)。', - tw_huojun:'TW霍峻', - tw_huojun_prefix:'TW', - twsidai:'伺怠', - twsidai_info:'限定技。出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用(无距离和次数限制)。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限;包含【酒】,则当目标角色受到此牌的伤害时,此伤害×2。', - twjieyu:'竭御', - twjieyu_info:'每轮限一次。结束阶段开始时,或当你于一轮内第一次受到伤害后,你可以弃置所有手牌,然后从弃牌堆中获得不同牌名的基本牌各一张。', - tw_liuhong:'TW刘宏', - tw_liuhong_prefix:'TW', - twyujue:'鬻爵', - twyujue_give:'鬻爵', - twyujue_info:'①其他角色的出牌阶段内,可以交给你任意张牌(每阶段上限为两张)。②当你于回合外获得其他角色的一张牌后,你可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。', - twgezhi:'革制', - twgezhi_info:'①当你于出牌阶段内首次使用某种类别的牌时,你可以重铸一张手牌。②出牌阶段结束时,若你本阶段内因〖革制①〗失去过至少两张牌,则你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。', - twfengqi:'烽起', - twfengqi_info:'主公技,锁定技。①其他群势力角色发动〖鬻爵①〗时,将每阶段上限改为四张。②以其他角色为目标的〖革制②〗结算结束后,目标角色可以获得其武将牌上的主公技。', - tw_caocao:'TW曹操', - tw_caocao_prefix:'TW', - twlingfa:'令法', - twlingfa_info:'①第一轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。②第二轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。③第三轮游戏开始时,你失去〖令法〗并获得〖治暗〗。', - twzhian:'治暗', - twzhian_info:'每回合限一次。一名角色使用装备牌或延时锦囊牌后,你可选择:⒈弃置位于场上的此牌。⒉弃置一张手牌并获得位于场上的此牌。⒊对其造成1点伤害。', - tw_zhangmancheng:'TW张曼成', - tw_zhangmancheng_prefix:'TW', - twfengji:'蜂集', - twfengji_info:'出牌阶段开始时,若你没有“示”,则你可以将一张牌作为“示”置于武将牌上并施法:从牌堆中获得X张与“示”牌名相同的牌,然后移去“示”。', - twyiju:'蚁聚', - twyiju_info:'若你的武将牌上有“示”,则:①你使用【杀】的次数上限和攻击范围的基数改为你的体力值。②当你受到伤害时,你移去“示”,且令此伤害+1。', - twbudao:'布道', - twbudao_info:'限定技。准备阶段,你可减1点体力上限,回复1点体力并选择获得一个〖布道〗技能池里的技能(三选一)。然后你可以令一名其他角色也获得此技能并交给你一张牌。', - twzhouhu:'咒护', - twzhouhu_info:'出牌阶段限一次。你可以弃置一张红色手牌并施法:回复X点体力。', - twharvestinori:'丰祈', - twharvestinori_info:'出牌阶段限一次。你可以弃置一张黑色手牌并施法:摸2X张牌。', - twzuhuo:'阻祸', - twzuhuo_info:'出牌阶段限一次。你可以弃置一张非基本牌并施法:防止你受到的下X次伤害。', - twzhouzu:'咒诅', - twzhouzu_info:'出牌阶段限一次。你可以对一名其他角色施法:其弃置X张牌,然后你对其造成1点雷电伤害。', - twhuangjin:'黄巾', - twhuangjin_info:'锁定技。当你一名角色使用【杀】指定你为目标时,若此【杀】有点数,你判定,若点数与此【杀】点数差值不大于1,则此【杀】对你无效。', - twguimen:'鬼门', - twguimen_info:'锁定技。当你弃置牌时,若其中有♠牌,你为每一张♠牌判定,若此牌点数与结果之差不大于1,你对一名其他角色造成2点雷电伤害。', - twdidao:'地道', - twdidao_info:'一名角色的判定牌生效前,你可以打出一张牌作为判定牌并获得原判定牌。若你以此法打出的牌与原判定牌颜色相同,你摸一张牌。', - tw_chengpu:'TW程普', - tw_chengpu_prefix:'TW', - twlihuo:'疠火', - twlihuo2:'疠火', - twlihuo3:'疠火', - twlihuo_info:'①当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。此牌使用结算结束后,若有角色因此【杀】造成的伤害进入过濒死状态,则你失去1点体力。②当你使用火【杀】选择目标后,你可为此牌增加一个目标。', - twchunlao:'醇醪', - twchunlao_info:'①准备阶段,若场上没有“醇”,则你可将一名角色区域内的一张牌置于其武将牌上,称为“醇”。②一名角色使用【杀】时,若其有“醇”,则其可以交给你一张牌,令此【杀】的伤害值基数+1。③一名角色进入濒死状态时,若其有“醇”,则你可以移去“醇”并摸一张牌,然后令其回复1点体力。', - tw_guohuai:'TW郭淮', - tw_guohuai_prefix:'TW', - twjingce:"精策", - twjingce_info:"当你于出牌阶段使用第X张牌结算完毕后,你可以摸两张牌(X为你的体力值)。若此阶段你此前已摸过牌或本回合造成过伤害,你获得一枚“策”标记。", - yuzhang:"御嶂", - yuzhang_info:"你可以弃置一枚“策”标记,然后跳过一个阶段。当你受到伤害后,你可弃置一枚“策”标记,然后选择一项:⒈令伤害来源弃置两张牌;⒉令伤害来源本回合不能再使用或打出牌。", - tw_caozhao:'曹肇', - twfuzuan:'复纂', - twfuzuan_info:'出牌阶段限一次/当你受到伤害后/当你对其他角色造成伤害后,你可选择一名拥有转换技的角色,变更其的一个转换技的的状态。', - twchongqi:'宠齐', - twchongqi_info:'锁定技。游戏开始时,你令所有角色获得〖非服〗。然后你可减1点体力上限,令一名其他角色获得〖复纂〗。', - twfeifu:'非服', - twfeifu_info:'锁定技,转换技。阴:当你成为【杀】的唯一目标后;阳:当你使用【杀】指定唯一目标后;目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。', - tw_wangchang:'TW王昶', - tw_wangchang_prefix:'TW', - twkaiji:'开济', - twkaiji_info:'准备阶段,你可令至多X名角色各摸一张牌(X为本局游戏内进入过濒死状态的角色数+1)。若有角色以此法获得了非基本牌,则你摸一张牌。', - twshepan:'慑叛', - twshepan_info:'每回合限一次。当你成为其他角色使用牌的目标后,你可选择一项:⒈摸一张牌。⒉将其区域内的一张牌置于牌堆顶。然后若你的手牌数与其相等,则你将此技能的发动次数归零,且可以令此牌对你无效。', - tw_wangcan:'TW王粲', - tw_wangcan_prefix:'TW', - twdianyi:'典仪', - twdianyi_info:'锁定技。你的回合结束时,若你本回合内:造成过伤害,你弃置所有手牌;未造成过伤害,你将手牌数调整至四张。', - twyingji:'应机', - twyingji_wuxie:'应机', - twyingji_info:'当你于回合外需要使用或打出一张基本牌或普通锦囊牌时,若你没有手牌,则你可摸一张牌,然后视为使用或打出此牌。', - twshanghe:'觞贺', - twshanghe_info:'限定技。当你进入濒死状态时,你可令所有其他角色依次交给你一张牌;若这些牌中没有【酒】,则你将体力回复至1点。', - tw_wujing:'TW吴景', - tw_wujing_prefix:'TW', - twfenghan:'锋捍', - twfenghan_info:'每回合限一次。当你使用【杀】或伤害类锦囊牌指定第一个目标后,你可令至多X名角色各摸一张牌(X为此牌的目标数)。', - twcongji:'从击', - twcongji_info:'当你的红色牌于回合外因弃置而进入弃牌堆后,你可令一名其他角色获得这些牌。', - old_quancong:'TW全琮', - old_quancong_prefix:'TW', - zhenshan:'振赡', - zhenshan_info:'每回合限一次,当你需要使用或打出一张基本牌时,你可以与一名手牌数少于你的角色交换手牌,视为使用或打出此牌。', - tw_tianyu:'TW田豫', - tw_tianyu_prefix:'TW', - gz_tw_tianyu:'田豫', - twzhenxi:'震袭', - twzhenxi_info:'每回合限一次。当你使用【杀】指定目标后,你可选择一项:⒈弃置其X张手牌(X为你至其的距离);⒉将其装备区或判定区内的一张牌移动到另一名角色的装备区或判定区内。若其体力值大于你或其体力值为全场最高,则你可以改为依次执行以上两项。', - twyangshi:'扬师', - twyangshi_info:'锁定技。当你受到伤害后,若场上有不在你攻击范围内的其他角色,则你令攻击范围+1;若没有,则你从牌堆中获得一张【杀】。', - tw_puyangxing:'濮阳兴', - twzhengjian:'征建', - twzhengjian_info:'游戏开始时,你可选择获得一项效果:⒈其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。⒉其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。', - twzhongchi:'众斥', - twzhongchi_info:'锁定技,限定技。当你因〖征建〗而得到牌后,若已经有至少X名角色因〖征建〗而交给你过牌(X为游戏人数的一半且向上取整),则你回复2点体力,且于本局游戏内受到渠道为【杀】的伤害+1,且你将〖征建〗中的“其须交给你一张牌”改为“你可对其造成1点伤害”。', - tw_bingyuan:'邴原', - twbingde:'秉德', - twbingde_info:'出牌阶段限一次。你可以选择一个本阶段未选择过的花色并弃置一张牌,你摸等同于本阶段你使用此花色的牌数,然后若你以此法弃置的牌的花色与你选择的花色相同,你令你〖秉德〗于此阶段发动的次数上限+1。', - twqingtao:'清滔', - twqingtao_info:'①摸牌阶段结束时,你可以重铸一张牌。若此牌为【酒】或非基本牌,你摸一张牌。②结束阶段,若你本回合未发动〖清滔①〗,你可以发动〖清滔①〗。', - tw_jiangji:'TW蒋济', - tw_jiangji_prefix:'TW', - twjichou:'急筹', - twjichou_info:'①每回合限一次。你可以视为使用一张未被〖急筹①〗记录过的普通锦囊牌并记录此牌。②你无法响应或{使用对应实体牌包含你的手牌的}〖急筹①〗记录过的锦囊牌。③出牌阶段限一次。你可将手牌中的一张〖急筹①〗记录过的锦囊牌交给其他角色。', - twjilun:'机论', - twjilun_info:'当你受到伤害后,你可以摸X张牌(X为〖急筹①〗记录数且至少为1,至多为5),或视为使用一张〖急筹①〗记录过且未被〖机论〗记录过的普通锦囊牌并记录此牌。', - tw_niufudongxie:'牛辅董翓', - baonvezhi_faq:'关于暴虐值', - baonvezhi_faq_info:'
  • 当你造成或受到伤害后,你获得等量的暴虐值;
  • 暴虐值的上限为5。', - twjuntun:'军屯', - twjuntun_info:'①游戏开始时或当其他角色死亡后,你可令一名角色获得〖凶军〗。②当其他角色造成伤害后,若其拥有〖凶军〗,你获得等同于此次伤害值的暴虐值。', - twxiongxi:'凶袭', - twxiongxi_info:'出牌阶段限一次。你可以弃置X张牌对一名其他角色造成1点伤害(X为你的暴虐值与暴虐值上限之差)。', - twxiafeng:'黠凤', - twxiafeng_info:'出牌阶段开始时,你可消耗至多3点暴虐值并获得如下效果直到回合结束:你使用的前X张牌没有距离和次数限制且不可被响应,你的手牌上限+X(X为你以此法消耗的暴虐值)。', - tw_bn_1:'一点', - tw_bn_2:'两点', - tw_bn_3:'三点', - tw_bn_1_bg:'一', - tw_bn_2_bg:'二', - tw_bn_3_bg:'三', - twxiongjun:'凶军', - twxiongjun_info:'锁定技,每回合限一次。当你造成伤害后,所有拥有〖凶军〗的角色摸一张牌。', - tw_jianshuo:'蹇硕', - twkunsi:'困兕', - twkunsi_info:'出牌阶段,你可以视为对一名未以此法选择过的其他角色使用一张【杀】。若此【杀】未造成伤害,其获得〖令戮〗直到你下回合开始,且当你成为其〖令戮〗的目标后,其可令你于〖令戮〗失败时进行两次结算。', - twlinglu:'令戮', - twlinglu_info:'强令:①任务:执行角色于其下回合结束前造成的伤害不小于2点。②成功:其摸两张牌。③失败:其失去1点体力。', - tw_mateng:'TW马腾', - tw_mateng_prefix:'TW', - twxiongzheng:'雄争', - twxiongzheng_info:'一轮游戏开始时,①若你上一轮发动过〖雄争〗且选择过“雄争”角色,你可以选择一项:1.视为对任意名上一轮内未对“雄争”角色造成过伤害的角色依次使用一张【杀】;2.令任意名上一轮对“雄争”角色造成过伤害的角色摸两张牌。②你可以选择一名未以此法选择过的角色,称为“雄争”角色。', - twluannian:'乱年', - twluannian_info:'主公技。其他群势力角色的出牌阶段限一次。其可以弃置X张牌并对“雄争”角色造成1点伤害(X为所有角色于本轮发动〖乱年〗的次数+1)。', - tw_baoxin:'TW鲍信', - tw_baoxin_prefix:'TW', - twmutao:'募讨', - twmutao_info:'出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】依次交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。', - twyimou:'毅谋', - twyimou_info:'当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色并摸两张牌;3.背水:将所有手牌交给其(若受伤角色为你则跳过此步骤),然后依次执行上述所有选项。', - tw_liufuren:'刘夫人', - twzhuidu:'追妒', - twzhuidu_info:'出牌阶段限一次。你可以选择一名已受伤的其他角色并选择一项:1.对其造成1点伤害;2.弃置其装备区里的一张牌;3.背水:若该角色为女性,弃置一张牌,然后依次执行上述所有选项。', - twshigong:'示恭', - twshigong_info:'限定技。当你于回合外进入濒死状态时,你可以令当前回合角色选择一项:1.加1点体力上限并回复1点体力,摸一张牌,然后令你将体力回复至体力上限;2.弃置X张手牌,然后令你将体力回复至1点(X为其体力值)。', - tw_wangling:'TW王淩', - tw_wangling_prefix:'TW', - twmibei:'秘备', - twmibei_info:'使命技。①使命:使用每种类型且牌名不同的牌各两张。②成功:当你使用牌后,若你于本次事件完成了〖秘备①〗的使命,你获得〖谋立〗。③失败:出牌阶段结束时,若你本回合未使用过牌,你本回合手牌上限-1并重置〖秘备〗。', - twxingqi:'星启', - twxingqi_info:'觉醒技。准备阶段,若场上的牌数大于你的体力值,你回复1点体力,然后若〖秘备〗:未完成,你从牌堆中获得每种类型的牌各一张;已完成,本局游戏你使用牌无距离限制。', - twmouli:'谋立', - twmouli_backup:'谋立', - twmouli_info:'每回合限一次。你可以使用牌堆中的一张基本牌。', - tw_zhugeguo:'TW诸葛果', - tw_zhugeguo_prefix:'TW', - twqirang:'祈禳', - twqirang_info:'当有装备牌进入你的装备区时,你可以从牌堆中获得一张锦囊牌,你本阶段使用此牌无距离限制且不可被响应,且当你使用此牌时,你可以为这张牌增加或减少一个目标。', - twyuhua:'羽化', - twyuhua_info:'锁定技。①你的非基本牌不计入手牌上限。②当你于回合外失去牌后,若其中有非基本牌,你可以卜算X,然后你可以摸X张牌(X为其中非基本牌数且至多为5)。', - tw_fanchou:'TW樊稠', - tw_fanchou_prefix:'TW', - twxingluan:'兴乱', - twxingluan_info:'结束阶段,你可以亮出牌堆顶的六张牌,然后你可以选择一种类型的牌并分配给任意角色(每名角色至多三张)。然后所有以此法得到过牌且得到的牌数不少于你的角色失去1点体力。', - tw_xujing:'TW许靖', - tw_xujing_prefix:'TW', - twboming:'博名', - twboming_info:'①出牌阶段限两次。你可以将一张牌交给一名其他角色。②结束阶段,若所有其他角色于此回合得到的牌数之和大于1,你摸两张牌。', - twejian:'恶荐', - twejian_info:'当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌。', - tw_zhangfei:'TW张飞', - tw_zhangfei_prefix:'TW', - twxuhe:'虚吓', - twxuhe_info:'当你使用的【杀】被【闪】抵消时,你可以令其选择一项:1.受到你造成的1点伤害;2.本回合你使用的下一张牌对其造成伤害时,此伤害+2。', - tw_xuezong:'TW薛综', - tw_xuezong_prefix:'TW', - twjiexun:'诫训', - twjiexun_info:'结束阶段,你可以选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌。若其以此法弃置了所有牌,你选择一项:1.摸X张牌,然后将X归零;2.修改〖复难〗和〖诫训〗(X为此前〖诫训〗的发动次数)。', - twfunanx:'复难·改', - twjiexunx:'诫训·改', - twfunanx_info:'当其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。', - twjiexunx_info:'结束阶段,你可选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌(X为此前〖诫训〗的发动次数)。', - tw_zhangning:'TW张宁', - tw_zhangning_prefix:'TW', - twxingzhui:'星坠', - twxingzhui_info:'出牌阶段限一次。你可以失去1点体力并施法:亮出牌堆顶2X张牌,若其中有黑色牌,则你可令一名其他角色获得这些黑色牌。若黑色牌的数量不小于X,则你对其造成X点雷电伤害。', - twjuchen:'聚尘', - twjuchen_info:'结束阶段,若你的手牌数和体力值均不为全场最多,则你可以令所有角色弃置一张牌,然后你获得其中的红色牌。', - tw_yufuluo:'于夫罗', - twjiekuang:'竭匡', - twjiekuang_info:'每回合限一次。当一名体力值小于你的角色成为其他角色使用基本牌或普通锦囊牌的唯一目标后,若没有角色处于濒死状态,你可以失去1点体力或减1点体力上限,将此牌的目标转移给你。然后此牌结算结束后,若此牌未造成伤害且此牌的使用者是你使用此牌名的牌的合法目标,你视为对此牌的使用者使用一张同名牌。', - twneirao:'内扰', - twneirao_info:'觉醒技。准备阶段,若你的体力值与体力上限之和不大于9,你失去〖竭匡〗,弃置所有牌并从牌堆或弃牌堆中获得等量的【杀】,然后获得〖乱掠〗。', - twluanlve:'乱掠', - twluanlve_info:'①出牌阶段,你可以将X张【杀】当做【顺手牵羊】对一名本阶段未成为过【顺手牵羊】的目标的角色使用(X为你以此法使用【顺手牵羊】的次数)。②当你使用牌时,若此牌为【顺手牵羊】,你令此牌不能被响应。', - tw_fengxí:'冯习', - twqingkou:'轻寇', - twqingkou_info:'准备阶段,你可以视为对一名其他角色使用一张【决斗】。然后此牌的伤害来源摸一张牌,若伤害来源包括你,你跳过本回合的判定阶段和弃牌阶段。', - tw_zhangji:'张既', - twdingzhen:'定镇',//丁真 - twdingzhen_info:'一轮游戏开始时,你可以选择任意名你至其距离不大于X的角色(X为你的体力值),这些角色选择一项:1.弃置一张【杀】;2.本轮其于回合内使用的第一张牌不能指定你为目标。', - twyouye:'攸业', - twyouye_info:'锁定技。①其他角色的结束阶段,若其本回合未对你造成过伤害且“蓄”数小于5,你将牌堆顶的牌置于武将牌上,称为“蓄”。②当你造成或受到伤害后,若你有“蓄”,你将所有“蓄”分配给任意角色(若当前回合角色存活,则你至少为当前回合角色分配一张)。', - tw_xunchen:'TW荀谌', - tw_xunchen_prefix:'TW', - twweipo:'危迫', - twweipo_info:'出牌阶段限一次。你可以令一名角色弃置一张牌,然后令其获得一张【兵临城下】或一张由你选择的智囊牌。', - twmouzhi:'谋识', - twmouzhi_info:'锁定技。当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害渠道对应的牌颜色相同,则你防止此伤害。', - tw_jiangqing:'TW蒋钦', - tw_jiangqing_prefix:'TW', - twshangyi:'尚义', - twshangyi_info:'出牌阶段限一次。你可以弃置一张牌并选择一名有手牌的其他角色,你令其观看你的手牌,然后你观看其手牌并选择一项:1.弃置其中一张牌;2.与其交换一张手牌。若你以此法弃置了其的黑色牌,或你与其交换的两张牌均为红色,你摸一张牌。', - twxiangyu:'翔羽', - twxiangyu_info:'锁定技。①你于回合内的攻击范围+X(X为本回合失去过牌的角色数且至多为5)。②当你使用【杀】指定目标后,若你至目标角色的距离小于你的攻击范围,你令此目标角色抵消此【杀】所需使用的【闪】数+1。', - twgyshenxing:'慎行', - twgyshenxing_info:'出牌阶段,你可以弃置X张牌,然后摸一张牌并获得1枚“慎”标记(X为你的“慎”数且至多为2)。', - tw_guyong:'TW顾雍', - tw_guyong_prefix:'TW', - twbingyi:'秉壹', - twbingyi_info:'结束阶段,你可以展示所有手牌,若这些牌的颜色均相同或类别均相同,你可以令至多Y名角色各摸一张牌(Y为你的手牌数)。若你以此法展示的牌数大于1且这些牌的颜色均相同且类别均相同,你移去所有“慎”。', - twyilie:'毅烈', - twyilie_info:'出牌阶段开始时,你可以选择一项:1.本阶段内使用【杀】的次数上限+1;2.本回合内使用【杀】指定处于连环状态的目标后,或使用【杀】被【闪】抵消时,摸一张牌;3.背水:失去1点体力,然后依次执行上述所有选项。', - tw_chendong:'TW陈武董袭', - tw_chendong_prefix:'TW', - twfenming:'奋命', - twfenming_info:'准备阶段,你可以选择一名其他角色并选择一项:1.令其弃置一张牌;2.令其横置;3.背水:横置,然后依次执行上述所有选项。', - tw_handang:'TW韩当', - tw_handang_prefix:'TW', - twgongji:'弓骑', - twgongji2:'弓骑', - twgongji_info:'①你的攻击范围无限。②出牌阶段限一次,你可以弃置一张牌,然后你使用与此牌花色相同的【杀】无任何次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。', - twjiefan:'解烦', - twjiefan_info:'限定技。出牌阶段,你可以选择一名角色,令攻击范围内含有其的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后当其第一次进入濒死状态后,你重置〖解烦〗。', - tw_jiling:'TW纪灵', - tw_jiling_prefix:'TW', - twshuangren:'双刃', - twshuangren_info:'①出牌阶段开始时,你可以与一名角色拼点。若你:赢,你可以视为对至多两名至其的距离不大于1的角色依次使用一张【杀】;没赢,其可以视为对你使用一张【杀】。②出牌阶段结束时,若你本回合未发动过〖双刃①〗且未造成过渠道为【杀】的伤害,你可以弃置一张牌发动〖双刃①〗。', - tw_re_fazheng:'TW法正', - tw_re_fazheng_prefix:'TW', - twxuanhuo:'眩惑', - twxuanhuo_info:'摸牌阶段结束时,你可以交给一名其他角色两张牌,然后其选择一项:1.视为对你选择的另一名其他角色使用一张【杀】或【决斗】,2.令你获得其两张牌。', - twenyuan:'恩怨', - twenyuan1:'恩怨', - twenyuan2:'恩怨', - twenyuan_info:'①当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌,若其手牌区或装备区没有牌,则你可以改为令其回复1点体力。②当你受到1点伤害后,你可令伤害来源选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。', - tw_madai:'TW马岱', - tw_madai_prefix:'TW', - twqianxi:'潜袭', - twqianxi2:'潜袭', - twqianxi3:'潜袭', - twqianxi2_bg:'潜', - twqianxi3_bg:'袭', - twqianxi_info:'准备阶段,你可以摸一张牌并弃置一张牌,令一名距离为1的角色本回合不能使用或打出与你弃置的牌颜色相同的手牌。然后本回合的结束阶段,若你本回合对其造成过渠道为【杀】的伤害,你令其不能使用或打出与你以此法弃置的牌颜色不同的牌直到其下回合结束。', - tw_niujin:'TW牛金', - tw_niujin_prefix:'TW', - twcuorui:'挫锐', - twcuorui_info:'限定技。准备阶段,你可以将手牌摸至X张(X为场上角色手牌数最多的角色的手牌数,且至多摸5张)。然后若你的判定区:未废除,你废除判定区;已废除,你可以对一名其他角色造成1点伤害。', - twliewei:'裂围', - twliewei_info:'锁定技。当你杀死一名角色后,你选择一项:1.摸两张牌;2.若你拥有〖挫锐〗且〖挫锐〗已发动过,重置〖挫锐〗。', - tw_guanqiujian:'TW毌丘俭', - tw_guanqiujian_prefix:'TW', - twzhengrong:'征荣', - twzhengrong_tag:'荣', - twzhengrong_info:'当你于出牌阶段使用牌结算结束后,若此牌为你于本局游戏你的出牌阶段内使用的第偶数张指定了其他角色为目标的牌,或你于出牌阶段第一次造成伤害后,你可以将一名其他角色的一张牌置于你的武将牌上,称为“荣”。', - twhongju:'鸿举', - twhongju_info:'觉醒技。准备阶段,若你的“荣”数不小于3,你摸等同于“荣”数的牌,且可以用任意手牌交换等量的“荣”,获得〖清侧〗,然后可以减1点体力上限并获得〖扫讨〗。', - twqingce:'清侧', - twqingce_backup:'清侧', - twqingce_info:'出牌阶段,你可以将一张“荣”置入弃牌堆并选择一名区域内有牌的角色,你弃置其区域里的一张牌。', - twsaotao:'扫讨', - twsaotao_info:'锁定技。你使用【杀】和普通锦囊牌不能被响应。', - tw_daxiaoqiao:'TW大乔小乔', - tw_daxiaoqiao_prefix:'TW', - twxingwu:'星舞', - twxingwu_info:'弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“星舞”。然后你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成2点伤害(若其性别包含女性则改为1点伤害)。', - twpingting:'娉婷', - twpingting_info:'锁定技。①一轮游戏开始时或其他角色于你的回合内进入濒死状态时,你摸一张牌并将一张牌置于武将牌上,称为“星舞”。②若你有“星舞”,你视为拥有〖天香〗和〖流离〗。', - tw_furong:'TW傅肜', - tw_furong_prefix:'TW', - twxuewei:'血卫', - twxuewei_info:'每轮限一次。一名其他角色A的出牌阶段开始时,你可以选择另一名其他角色B,然后你令A选择一项:1.本回合不能对B使用【杀】且手牌上限-2;2.你视为对A使用一张【决斗】。', - twliechi:'烈斥', - twliechi_info:'当你受到伤害后,若伤害来源的体力值不小于你,你可以选择一项:1.令其将手牌数弃置至与你的手牌数相同;2.弃置其一张牌;3.背水:若你本回合进入过濒死状态,弃置一张装备牌,然后依次执行上述所有选项。', - tw_yl_luzhi:'TW卢植', - tw_yl_luzhi_prefix:'TW', - twmingren:'明任', - twmingren_info:'①游戏开始时,你摸一张牌,然后将一张手牌置于武将牌上,称为“任”。②出牌阶段开始时或出牌阶段结束时,你可以用一张牌替换“任”。', - twzhenliang:'贞良', - twzhenliang_info:'转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。', - tw_zhangnan:'张南', - twfenwu:'奋武', - twfenwu_info:'结束阶段,你可以失去1点体力并视为使用一张无距离限制的【杀】。若本回合你使用过的基本牌种数大于1,此【杀】伤害基数+1。', - tw_huchuquan:'呼厨泉', - twfupan:'复叛', - twfupan_info:'当你造成或受到伤害后,你可以摸X张牌并将一张牌交给一名其他角色(X为伤害值)。若你此前:未以此法交给过该角色牌,你摸两张牌;以此法交给过该角色牌,你可{对其造成1点伤害,然后你不能再以此法交给其牌}。', - tw_liuzhang:'TW刘璋', - tw_liuzhang_prefix:'TW', - twyaohu:'邀虎', - twyaohu_info:'每轮限一次。回合开始时,你须选择场上的一个势力。该势力的角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:1.对你指定的另一名的其他角色使用一张【杀】(无距离限制);2.本回合其使用伤害牌指定你为目标时须交给你两张牌,否则取消此目标。', - tw_liwei:'TW李遗', - tw_liwei_prefix:'TW', - twjiaohua:'教化', - twjiaohua_info:'当你或体力值最小的其他角色因摸牌而得到牌后,你可以令该角色从牌堆或弃牌堆中获得一张本次未获得的类别的牌(每种类别每回合限一次)。', - tw_yanxiang:'TW阎象', - tw_yanxiang_prefix:'TW', - twkujian:'苦谏', - twkujianx:'谏', - twkujian_info:'出牌阶段限一次。你可以将至多三张手牌交给一名其他角色,称为“谏”,你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸一张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。', - twruilian:'睿敛', - twruilian2:'睿敛', - twruilian_info:'一轮游戏开始时,你可以选择一名角色。其下回合结束时,若其本回合弃置过至少两张牌,你可以选择其本回合弃置过的一种类别,你与其各从弃牌堆中获得一张此类别的牌。', - tw_xiahouen:'夏侯恩', - twfujian:'负剑', - twfujian_info:'锁定技。①游戏开始时或准备阶段,若你的装备区里没有武器牌,你随机将牌堆中的一张武器牌置入装备区。②当你于回合外失去武器牌后,你失去1点体力。', - twjianwei:'剑威', - twjianwei_info:'①若你的装备区里有武器牌,你使用【杀】无视防具且拼点牌点数+X(X为你的攻击范围)。②{其他角色的准备阶段,其可以与你拼点}/{准备阶段,你可以与攻击范围内的一名角色拼点}。若你赢,你获得其每个区域内的各一张牌;若其赢,其获得你装备区里的武器牌。', - tw_xiahoushang:'夏侯尚', - twtanfeng:'探锋', - twtanfeng_info:'准备阶段,你可以弃置一名其他角色区域内的一张牌,然后其选择一项:1.受到你造成的1点火焰伤害,然后令你跳过本回合的一个阶段(准备阶段和结束阶段除外);2.将一张牌当做【杀】对你使用(有距离限制)。', - tw_zongyu:'TW宗预', - tw_zongyu_prefix:'TW', - twzhibian:'直辩', - twzhibian_info:'出牌阶段开始时,你可以与一名其他角色拼点。若你赢,你可以选择一项:{1.将其区域里的一张牌移动到你的对应区域;2.回复1点体力;3.背水:弃置一张非基本牌,然后依次执行上述所有选项};若你没赢,你失去1点体力。', - twyuyan:'御严', - twyuyan_info:'锁定技。当你成为体力值大于你的角色使用的【杀】的目标时,你令使用者选择一项:1.交给你一张点数大于此【杀】的牌(若此【杀】无点数则改为非基本牌)。2.取消此目标。', - tw_zhouchu:'TW周处', - tw_zhouchu_prefix:'TW', - twguoyi:'果毅', - twguoyi_info:'当你不因〖果毅〗使用【杀】或普通锦囊牌指定一名其他角色为目标后,若其体力值或手牌数最大,或你的手牌数不大于X(X为你已损失的体力值+1),你可令其选择一项:1.本回合不能使用或打出手牌;2.弃置X张牌。若条件均满足,或其于本回合两个选项均已选择过,则你于此牌结算结束后依次视为对此牌的所有目标使用一张名称和属性相同的牌。', - twchuhai:'除害', - twchuhai_info:'使命技。①使命:令至少两名其他角色进入濒死状态。②成功:一名角色的回合结束时,若你于本回合完成了〖除害①〗的使命,你废除判定区,然后每名其他角色依次交给你一张牌。③当你获得其他角色的牌后,你须将其中的一张牌置入弃牌堆。', - tw_qiaogong:'TW桥公', - tw_qiaogong_prefix:'TW', - twyizhu:'遗珠', - twyizhu_info:'①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中,称为“遗珠”(X为角色数,选择牌的牌名对其他角色可见)。②当有其他角色使用“遗珠”指定唯一目标时,你可以选择一项:1.增加一个目标;2.取消此目标,增加一个目标。然后移除此牌对应的“遗珠”记录并摸一张牌。', - twluanchou:'鸾俦', - twluanchou_info:'出牌阶段限一次。你可以令两名角色获得〖共患〗直到你下次发动此技能。', - twgonghuan:'共患', - twgonghuan_info:'每回合限一次。当其他角色受到伤害时,若其拥有〖共患〗且其体力值不大于你,你可以将此伤害转移给你(不触发〖共患〗)。', - tw_qiaorui:'TW桥蕤', - tw_qiaorui_prefix:'TW', - wangxing:'妄行', - twxiawei:'狭威', - twxiawei_info:'①游戏开始时,你将牌堆中的两张基本牌置于武将牌上,称为“威”。②回合开始时,你将所有“威”置入弃牌堆。③你可以将“威”如手牌般使用或打出。④妄行:准备阶段,你可以将牌堆顶的X+1张牌置于武将牌上,称为“威”。', - twqiongji:'穷技', - twqiongji_info:'锁定技。①每回合限一次。当你使用或打出“威”后,你摸一张牌。②当你受到伤害时,若你没有“威”,此伤害+1。', - tw_bianfuren:'TW卞夫人', - tw_bianfuren_prefix:'TW', - twwanwei:'挽危', - twwanwei_info:'每回合限一次。当一名体力值最小的角色受到伤害时:若该角色不为你,你可以防止此伤害,然后失去1点体力;若该角色为你,或你的体力上限最大,你可以于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之。', - twyuejian:'约俭', - twyuejian_info:'出牌阶段限一次。你可以将X张牌置于牌堆顶或牌堆底(X为你的手牌数减你的手牌上限且至少为1)。若你以此法失去的牌数:不小于3,你的体力上限+1;不小于2,你回复1点体力;不小于1,你的手牌上限+1。', - tw_chenzhen:'TW陈震', - tw_chenzhen_prefix:'TW', - twmuyue:'睦约', - twmuyue_info:'出牌阶段限一次。你可以弃置一张牌并选择一个基本牌或普通锦囊牌的牌名,然后令一名角色从牌堆中获得一张此牌名的牌。若你以此法弃置的牌的牌名与你选择的牌名相同,你下次发动〖睦约〗无需弃牌。', - twchayi:'察异', - twchayi_info:'结束阶段,你可以选择一名其他角色,令其选择一项:1.展示所有手牌;2.下次使用牌时弃置一张牌。该角色的下个回合结束时,若其手牌数与其上一次成为〖察异〗目标后的手牌数不相同,其执行另一项。', - tw_feiyi:'TW费祎', - tw_feiyi_prefix:'TW', - twshengxi:'生息', - twshengxi_info:'①准备阶段,你可以获得一张【调剂盐梅】。②结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊并摸一张牌。', - twkuanji:'宽济', - twkuanji_info:'每回合限一次。当你的牌不因使用而进入弃牌堆后,你可以令一名其他角色获得其中的一张牌。', - xia_wangyue:'王越', - twyulong:'驭龙', - twyulong_info:'当你使用【杀】指定第一个目标后,你可以与一名目标角色拼点。若你赢,且你此次的拼点牌为:黑色,此【杀】伤害+1;红色,此【杀】不可被响应。当此【杀】造成伤害后,若你赢,你令此【杀】不计入次数。', - twjianming:'剑鸣', - twjianming_info:'锁定技。每回合每种花色限一次,当你使用或打出【杀】时,你摸一张牌。', - xia_liyàn:'李彦', - twzhenhu:'震虎', - twzhenhu_info:'当你使用伤害牌指定第一个目标时,你可以摸一张牌并与至多三名其他角色共同拼点。若你赢,此牌对所有本次拼点没赢的角色造成的伤害+1;若你没赢,你失去1点体力。', - twlvren:'履刃', - twlvren_info:'①当你对其他角色造成伤害时,你令其获得1枚“刃”标记。②当你使用伤害牌时,你可以额外指定一名有“刃”的角色并移去其所有“刃”。③你的拼点牌点数+2X(X为参与此次拼点的角色数)。', - xia_tongyuan:'侠童渊', - xia_tongyuan_prefix:'侠', - twchaofeng:'朝凤', - twchaofeng_backup:'朝凤', - twchaofeng_info:'①你可以将一张【杀】当做【闪】、【闪】当做任意一种【杀】使用或打出。②出牌阶段开始时,你可以与至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】。', - twchuanshu:'传术', - twchuanshu_info:'限定技。准备阶段,你可以选择一名角色。直到你的下回合开始,其获得以下效果:1.当其拼点牌亮出时,此牌点数+3;2.其使用的下一张【杀】对除你外的角色造成伤害时,此伤害+1;3.若其不为你,其使用的下一张【杀】结算结束后,你摸等同于其因此【杀】造成的伤害值数的牌。', - xia_xushu:'侠徐庶', - xia_xushu_prefix:'侠', - twjiange:'剑歌', - twjiange_info:'每回合限一次。你可以将一张非基本牌当做【杀】使用或打出(无距离和次数限制,且不计入次数)。若此时不为你的回合,你摸一张牌。', - twxiawang:'侠望', - twxiawang_info:'当一名角色受到伤害后,若你至其的距离不大于1,你可以对伤害来源使用一张【杀】。当此【杀】结算结束后,若你造成过渠道为此牌的伤害,结束当前阶段。', - tw_haomeng:'TW郝萌', - tw_haomeng_prefix:'TW', - twgongge:'攻阁', - twgongge_info:'摧坚:你可以选择一项:1.摸X+1张牌。其响应此牌后,跳过你的下一个摸牌阶段;2.弃置其X+1张牌。此牌结算结束后,若其体力值不小于你,你交给其X张牌;3.此牌对其造成的伤害+X。此牌结算结束后,其回复X点体力。', - tw_weixu:'魏续', - twsuizheng:'随征', - twsuizheng_info:'锁定技。游戏开始时,你选择一名其他角色,称为“随征”角色。你获得以下效果:当“随征”角色造成伤害后,你摸一张牌;当“随征”角色受到伤害后,你选择一项:1.失去1点体力,令其从牌堆或弃牌堆中获得一张【杀】或【决斗】;2.弃置两张基本牌,令其回复1点体力。', - twtuidao:'颓盗', - twtuidao_info:'限定技。准备阶段,若“随征”角色的体力值不大于2或“随征”角色已死亡,你可以废除你与其的一个坐骑栏并选择一个类别,然后若“随征”角色存活,你获得其所有此类别的牌,否则你从牌堆中获得两张此类别的牌。然后你将“随征”角色改为另一名角色。', - tw_caoxiu:'TW曹休', - tw_caoxiu_prefix:'TW', - twqianju:'千驹', - twqianju_info:'锁定技。①你计算与其他角色的距离-X(X为你装备区的牌数)。②每回合限一次。当你对距离为1以内的角色造成伤害后,若你的装备区存在空置装备栏,你从牌堆或弃牌堆中将一张你空置装备栏对应副类别的装备牌置于你的装备区。', - twqingxi:'倾袭', - twqingxi_info:'当你使用张【杀】指定目标后,若此牌为你于本回合使用的第一张【杀】,你可以令目标角色选择一项:1.令你摸Y张牌,此【杀】不可被其响应(Y为你装备区的牌数且至少为1);2.若其装备区里有牌,弃置装备区里的所有牌,然后弃置你装备区里的等量张牌,令此【杀】对其造成的伤害+1。', - tw_sunyi:'TW孙翊', - tw_sunyi_prefix:'TW', - twzaoli:'躁厉', - twzaoli_info:'锁定技。①出牌阶段,你只能使用或打出你本回合得到的手牌。②出牌阶段开始时,你须弃置你区域内的所有装备牌并弃置任意张非装备手牌,你摸等量的牌,从牌堆中将你此次弃置的装备牌对应副类别的装备牌置入装备区。若你以此法置入了超过两张装备牌,你失去1点体力。', - tw_yangyi:'TW杨仪', - tw_yangyi_prefix:'TW', - twgongsun:'共损', - twgongsun_shadow:'共损', - twgongsun_info:'锁定技。出牌阶段开始时,你选择攻击范围内的一名其他角色并选择一种花色,直至你的下个回合开始前或你死亡时,你与其均无法使用、打出或弃置该花色的手牌。', - tw_dengzhi:'TW邓芝', - tw_dengzhi_prefix:'TW', - twjimeng:'急盟', - twjimeng_info:'出牌阶段限一次。你可以获得一名其他角色区域内的一张牌,然后交给其一张牌。若其体力值不小于你,你摸一张牌。', - xia_lusu:'侠鲁肃', - xia_lusu_prefix:'侠', - twkaizeng:'慨赠', - twkaizeng_info:'其他角色的出牌阶段限一次。其可以选择一种基本牌的牌名或非基本牌的类型,然后令你选择是否交给其任意张手牌。若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌中包含其选择的牌名或类型的牌,你获得一张与此牌名或类型不同的牌。', - twyangming:'扬名', - twyangming_info:'出牌阶段结束时,你可以摸X张牌,且令本回合的手牌上限+X(X为你本阶段使用过的牌的类型数)。', - xia_dianwei:'侠典韦', - xia_dianwei_prefix:'侠', - twliexi:'烈袭', - twliexi_info:'准备阶段,你可以弃置任意张牌并选择一名其他角色。若你以此法弃置的牌数大于其体力值,你对其造成1点伤害;否则其对你造成1点伤害。然后若你弃置的牌中有武器牌,你对其造成1点伤害。', - twshezhong:'慑众', - twshezhong_info:'结束阶段,若你:本回合对其他角色造成过伤害,你可以令至多X名其他角色下个摸牌阶段的额定摸牌数-1(X为你本回合造成的伤害值);本回合受到过伤害,你可以将手牌摸至与其中一名伤害来源的体力值相同(至多摸至5)。', - xia_zhaoe:'赵娥', - twyanshi:'言誓', - twyanshi_info:'①游戏开始时,你选择一名其他角色,称为“言誓”角色。②当你或“言誓”角色受到二者之外角色造成的伤害后,伤害来源获得1枚“誓”标记。③你对有“誓”的角色使用牌无距离限制。④当你对有“誓”的角色造成伤害时,此伤害+1,且当你对这些角色造成伤害后,你摸等同于伤害值的牌并移去其所有“誓”。', - twrenchou:'刃仇', - twrenchou_info:'锁定技。当你或“言誓”角色死亡时,若二者中的另一名角色A存活,A对杀死你或其的角色造成X点伤害(X为A的体力值)。', - xia_xiahouzie:'夏侯紫萼', - twxuechang:'血偿', - twxuechang_info:'出牌阶段限一次。你可以与一名其他角色拼点。若你:赢,你获得其一张牌,若此牌为装备牌,你视为对其使用一张【杀】;没赢,其对你造成1点伤害,且你下次对其造成的伤害+1。', - twduoren:'夺刃', - twduoren_info:'①当你杀死角色后,你可以减1点体力上限,然后获得其所有的非主公技和非隐匿技。②当你令其他角色进入濒死状态时,你失去因〖夺刃①〗获得的技能。', - tw_yangang:'严纲', - twzhiqu:'直取', - twzhiqu_info:'结束阶段,你可以选择一名其他角色并依次使用牌堆顶X张牌中的【杀】。搏击:依次使用牌堆顶X张牌中的锦囊牌(X为你距离不大于1内的角色数,且你或其以外的角色不是你以此法使用牌的合法目标)。', - twxianfeng:'先锋', - twxianfeng_info:'当你于出牌阶段使用【杀】或伤害类锦囊牌对其他角色造成伤害后,你可以令受伤角色选择一项:1.其摸一张牌,然后直到你下个回合开始时,你至其他角色的距离-1;2.你摸一张牌,然后直到你下个回合开始时,其至你的距离-1。', - tw_gongsunfan:'公孙范', - twhuiyuan:'回援', - twhuiyuan_info:'当你于出牌阶段使用牌结算结束后,若你未于此阶段获得过此类型的牌,你可以展示一名角色的一张手牌,若此牌与你使用的牌类型相同,你获得此牌,否则你弃置此牌,然后其摸一张牌。游击:对其造成1点伤害。', - twshoushou:'收绶', - twshoushou_info:'①当你获得其他角色的牌时,若你在任意角色的攻击范围内,其他角色至你的距离+1。②当你造成或受到伤害后,若你不在任意其他角色的攻击范围内,其他角色至你的距离-1。', - twshijun:'师君', - twshijun_info:'主公技,其他群势力角色出牌阶段限一次,若你没有“米”,其可以摸一张牌,然后将一张牌置于你的武将牌上,称为“米”。', - twjuxiang:'踞襄', - twjuxiang_info:'主公技,其他群势力角色出牌阶段限一次,其可以选择其装备区的一张牌移动到你的装备区中,若你对应的装备栏已被废除,则改为交给你此装备牌,然后恢复你的对应装备栏。', - tw_ol_sunjian:'TW孙坚', - tw_ol_sunjian_prefix:'TW', - twpolu:'破虏', - twpolu_info:'主公技,当吴势力角色杀死一名角色或死亡后,你可以令任意名角色各摸X张牌(X为你此前发动过此技能的次数+1)。', - tw_menghuo:'TW孟获', - tw_menghuo_prefix:'TW', - twqiushou:'酋首', - twqiushou_info:'主公技,锁定技,当一张【南蛮入侵】结算结束后,若此牌造成的伤害大于3点或有角色因此死亡,所有蜀势力和群势力角色各摸一张牌。', - twzhuiting:'坠廷', - twzhuiting_info:'主公技,当一张锦囊牌即将对你生效时,其他魏势力角色和群势力角色可将一张与此牌颜色相同的牌当作【无懈可击】使用。', - twniju:'逆拒', - twniju_info:'主公技。当你的拼点牌亮出后,你可以令本次拼点事件中的一张拼点牌的点数+X或-X。然后当本次拼点事件结束后,若有两张拼点牌的点数相等,你摸X张牌(X为场上群势力角色数)。', - ol_liuyu:'TW刘虞', - ol_liuyu_prefix:'TW', - twchongwang:'崇望', - twchongwang_info:'主公技,其他群势力角色的出牌阶段开始时,其可以交给你一张牌,然后你与其使用【杀】或伤害性锦囊牌指定目标时不能指定对方为目标直至你的下回合结束(每名角色限发动一次)。', - tw_zhangzhao:'张昭', - twlijian:'力荐', - twlijian_info:'昂扬技。其他角色的弃牌阶段结束时,你可以令其获得任意本阶段进入弃牌堆的牌(可不选),然后你获得其余的牌,若其得到的牌数大于你,你可以对其造成1点伤害。
    激昂:八张牌进入弃牌堆。', - twchungang:'纯刚', - twchungang_info:'锁定技。一名其他角色于摸牌阶段外得到超过一张牌时,你令其弃置一张牌。', - tw_zhanghong:'张纮', - twquanqian:'劝迁', - twquanqian_info:'昂扬技。出牌阶段限一次,你可以将至多四张花色各不相同的手牌交给一名其他角色,然后若你交出的牌数大于1,则你从牌堆中获得一张装备牌,然后选择一项:①将手牌数摸至与其相同;②观看其手牌并获得其一种花色的所有牌。
    激昂:你弃置六张手牌。', - twrouke:'柔克', - twrouke_info:'锁定技。当你于摸牌阶段外得到超过一张牌时,你摸一张牌。', - kaisa:"凯撒", - zhengfu:"征服", - zhengfu_info:"当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。", - xia_xiahoudun:'侠夏侯惇', - xia_xiahoudun_prefix:'侠', - twdanlie:'胆烈', - twdanlie_info:'①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢,你对没赢的角色依次造成1点伤害;若你没赢,你失去1点体力。②你的拼点牌点数+X(X为你已损失的体力值)。', - xia_zhangwei:'张葳', - twhuzhong:'护众', - twhuzhong_info:'当你于出牌阶段使用无属性【杀】指定唯一目标角色时,你可以摸一张牌并选择一项:①为此牌额外选择一个目标;②弃置其一张手牌,此牌结算完毕后,若此牌造成过伤害,则你摸一张牌且本阶段可以额外使用一张【杀】。', - twfenwang:'焚亡', - twfenwang_info:'锁定技。①当你受到属性伤害时,你须弃置一张牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于等于其,则此伤害+1。', - xia_xiahousone:'夏侯子萼', - twchengxi:'承袭', - twchengxi_info:'出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。', - xia_liubei:'侠刘备', - xia_liubei_prefix:'侠', - twshenyi:'伸义', - twshenyi_info:'每回合限一次,当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌(若没有同名牌则改为同类型的牌)称为“侠义”置于武将牌上。若受伤角色不为你,则你可以将任意张手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。', - twxinghan:'兴汉', - twxinghan_info:'①你的回合外或你处于濒死状态时,你可以如手牌般使用或打出“侠义”牌。②准备阶段,若“侠义”牌数大于存活角色数,则你可以依次使用其中所有可以使用的牌。然后你获得如下效果:回合结束时,你弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)。', - twxinghan_tag:'侠义', - xia_guanyu:'侠关羽', - xia_guanyu_prefix:'侠', - twzhongyi:'忠义', - twzhongyi_info:'锁定技。①你使用【杀】无距离限制。②当你使用【杀】结算完毕后,你选择一项:⒈摸X张牌;⒉回复X点体力;⒊背水:失去Y点体力,依次执行以上两项(X为受到此牌造成的伤害的角色数,Y为你本局游戏选择此项的次数)。', - twchue:'除恶', - twchue_info:'①当你使用【杀】指定唯一目标时,若场上存在可称为此【杀】目标的非目标角色,则你可以失去1点体力,为此牌额外指定Z个目标。②当你受到伤害或失去体力后,你摸一张牌并获得1个“勇”标记。③回合结束时,若你的“勇”标记数大于等于Z,则你可以失去Z个“勇”标记,视为使用一张伤害+1且可以额外指定Z个目标的【杀】。(Z为你的体力值)', - xia_shitao:'石韬', - twjieqiu:'劫囚', - twjieqiu_info:'出牌阶段限一次,你可以选择一名装备区没有废除栏的其他角色,废除其所有装备栏,然后其摸X张牌(X为其废除装备栏前的装备区牌数),直到其恢复所有装备栏前:其弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。', - twenchou:'恩仇', - twenchou_info:'出牌阶段限一次,你可以观看一名存在废除装备栏的其他角色的手牌并获得其中一张牌,然后你恢复其一个装备栏。', - xia_shie:'史阿', - twdengjian:'登剑', - twdengjianx:'剑法', - twdengjian_info:'①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。②你使用“剑法”牌不计入次数限制。', - twxinshou:'心授', - twxinshou_info:'①当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。②当你使用【杀】时,若〖心授①〗的两项本回合均已被你选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。', - xia_yuzhenzi:'玉真子', - twhuajing:'化境', - twhuajing_info:'①游戏开始时,你获得6个效果各不相同的无效果“武”标记。②一名拥有“武”标记的角色的攻击范围+X(X为其拥有的“武”标记数)。③出牌阶段限一次,你可以展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果。④拥有“武”标记效果的角色的武器牌失效(武器牌不提供攻击范围且武器技能失效)。', - twhuajing_jian:'剑', - twhuajing_jian_info:'当你使用【杀】指定目标后,你随机弃置目标角色两张牌。', - twhuajing_dao:'刀', - twhuajing_dao_info:'当你使用【杀】对没有手牌的目标角色造成伤害时,此伤害+1。', - twhuajing_fu:'斧', - twhuajing_fu_info:'当你使用的【杀】被【闪】响应后,你对目标角色造成1点伤害。', - twhuajing_qiang:'枪', - twhuajing_qiang_info:'当你使用黑色【杀】结算完毕后,你从牌堆或弃牌堆中获得一张【闪】。', - twhuajing_ji:'戟', - twhuajing_ji_info:'当你使用【杀】造成伤害时,你摸一张牌。', - twhuajing_gong:'弓', - twhuajing_gong_info:'当你使用【杀】造成伤害后,你随机弃置受伤角色装备区里的一张牌。', - twtianshou:'天授', - twtianshou_info:'锁定技,回合结束时,若你本回合使用【杀】造成过伤害,且你拥有本回合获得过效果的“武”标记,则你须将其中一个“武”标记交给一名其他角色并令其获得此标记的效果直到其回合结束,然后你摸两张牌。', - tw_yanliang:'颜良', - tw_wenchou:'文丑', - tw_yuantan:'袁谭', - twduwang:'独往', - twduwang_info:'使命技。①出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。②当你处于濒死状态时,其他角色不能对你使用【桃】。③使命:使用【决斗】或成为【决斗】目标的次数之和不小于4(若游戏总人数小于4则改为3)。④成功:准备阶段,若你于你的上回合完成了〖独往③〗的使命,则你重置〖独往〗并将〖独往〗修改至只保留〖独往①〗的效果,选择一项:⒈获得〖狭勇〗;⒉重置〖延势〗并令其获得历战效果。⑤失败:当你死亡时,使命失败。', - twylyanshi:'延势', - twylyanshi_info:'限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。', - twylyanshix:'延势·改', - twylyanshix_info:'限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。历战:重置〖延势〗。', - twjuexing:'绝行', - twjuexing_info:'出牌阶段限一次。你可以视为对一名其他角色使用一张【决斗】。此牌对一名角色生效时,你与其将所有手牌扣置于武将牌上,然后各摸等同于当前体力值的牌。此牌结算结束后,你与所有目标角色弃置本次以此法摸的牌,然后获得扣置于武将牌上的牌。历战:当你因〖绝行〗摸牌时,摸牌数+1。', - twxiayong:'狭勇', - twxiayong1:'狭勇', - twxiayong2:'狭勇', - twxiayong_info:'锁定技。当你使用的【决斗】或目标角色包括你的【决斗】造成伤害时,若受伤角色为你,则你随机弃置一张手牌;否则你令此伤害+1。', - twqiaosi:'峭嗣', - twqiaosi_info:'结束阶段,你可以获得由其他角色区域直接置入或经由处理区置入弃牌堆的所有牌,然后若你以此法获得的牌数小于你的体力值,则你失去1点体力。', - twbaizu:'败族', - twbaizu_info:'锁定技。结束阶段,若你已受伤且你有手牌,则你须选择X名有手牌的其他角色(X为你的体力值),你与这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的所有其他角色各造成1点伤害。历战:〖败族〗目标选择数+1。', + twyanqin: "姻亲", + twyanqin_info: "准备阶段,你可以将势力变更为魏或蜀。", + twbaobian: "豹变", + twbaobian_info: + "当你使用【杀】或【决斗】造成伤害时,若目标角色的势力与你相同,则你可以防止此伤害,然后其将手牌数补充至与体力值相同。若不同且其手牌数大于体力值,则你可以将其手牌弃置至与其体力值相同。", + twtijin: "替巾", + twtijin_info: + "当你攻击范围内的一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,此【杀】结算完成后,你弃置该角色的一张牌。", + twxiaolian: "孝廉", + twxiaolian_info: + "当一名其他角色使用【杀】指定另一名其他角色为目标时,你可以将此【杀】的目标改为你。若如此做,当你受到此【杀】的伤害后,你可以将一张牌置于此【杀】原目标的武将牌旁,称为“马”,且令其获得如下效果:其他角色计算至其的距离+X(X为其武将牌旁的“马”数)。", + twqijia: "弃甲", + twqijia_info: + "出牌阶段,你可以弃置一张装备区内的牌(每种类型的装备牌限一次),然后视为对攻击范围内的一名其他角色使用了一张【杀】。", + twzhuchen: "诛綝", + twzhuchen_info: + "出牌阶段,你可以弃置一张【桃】或【酒】并选择一名其他角色。你与其的距离视为1直到此阶段结束。", + twhuzhu: "护主", + twhuzhu_info: + "出牌阶段限一次,若你的装备区内有牌,则你可以令一名其他角色交给你一张手牌,然后获得你装备区内的一张牌。若其体力值不大于你,则你可以令其回复1点体力。", + twliancai: "敛财", + twliancai_info: + "结束阶段,你可以将武将牌翻面,然后获得一名其他角色装备区内的一张牌。当你的武将牌翻面时,你可以将手牌补至与体力值相同。", + twrangyi: "攘夷", + twrangyi2: "攘夷", + twrangyi_info: + "出牌阶段限一次,你可以将所有手牌交给一名其他角色,然后令其选择一项:1.使用其中的一张牌,并于此牌被使用时将其余的牌交还给你。2.受到来自你的1点伤害。", + twbaimei: "白眉", + twbaimei_info: "锁定技,若你没有手牌,则防止你受到的所有属性伤害和锦囊牌造成的伤害。", + chijie: "持节", + chijie_info: " 游戏开始时,你可以选择一个现存势力,你的势力视为该势力。", + waishi: "外使", + waishi_info: + " 出牌阶段限一次,你可以用至多X张牌交换一名其他角色等量的手牌(X为现存势力数),然后若其与你势力相同或手牌多于你,你摸一张牌。", + renshe: "忍涉", + renshe_info: + "当你受到伤害后,你可以选择一项:将势力改为现存的另一个势力;或可以额外发动一次“外使”直到你的下个出牌阶段结束;或与另一名其他角色各摸一张牌。", + tw_gexuan: "TW葛玄", + tw_gexuan_prefix: "TW", + twdanfa: "丹法", + twdanfa_info: + "准备阶段或结束阶段开始时,你可将一张牌置于武将牌上,称为“丹”。每回合每种花色限一次,当你使用牌时,若“丹”中有与此牌花色相同的牌,则你摸一张牌。", + twlingbao: "灵宝", + twlingbao_info: + "出牌阶段限一次,你可以将两张花色不同的“丹”置入弃牌堆。若这两张牌:均为红色,你令一名其他角色回复1点体力;均为黑色,你弃置一名其他角色区域内至多两张区域不同牌;颜色不同,则你令一名角色摸一张牌,并令另一名角色弃置一张牌。", + twsidao: "司道", + twsidao_info: + "游戏开始时,你选择一张“法宝”置入装备区。准备阶段,若你以此法选择的法宝在牌堆/弃牌堆中,则你使用之。", + gx_lingbaoxianhu: "灵宝仙壶", + gx_lingbaoxianhu_info: + "锁定技,当你造成点数大于1的伤害后,或有角色死亡后,你加1点体力上限并回复1点体力。", + gx_taijifuchen: "太极拂尘", + gx_taijifuchen_info: + "锁定技,当你使用【杀】指定目标后,你令目标角色选择一项:①弃置一张牌,若此牌和【杀】花色相同,则你获得之。②其不可响应此【杀】。", + gx_chongyingshenfu: "冲应神符", + gx_chongyingshenfu_info: + "锁定技。①当你受到牌造成的伤害后,你记录此牌的名称。②当你受到〖冲应神符①〗记录过的牌造成的伤害时,你令此牌伤害-1。", + tw_dongzhao: "TW董昭", + tw_dongzhao_prefix: "TW", + twmiaolve: "妙略", + twmiaolve_info: + "游戏开始时,你获得两张【瞒天过海】。当你受到1点伤害后,你可选择:①获得一张【瞒天过海】并摸一张牌。②获得一张智囊。", + twyingjia: "迎驾", + twyingjia_info: + "一名角色的回合结束时,若你本回合内使用过两张或更多的同名锦囊牌,则你可弃置一张手牌并令一名角色进行一个额外回合。", + dz_mantianguohai: "瞒天过海", + dz_mantianguohai_info: + "此牌不计入拥有者的手牌上限。出牌阶段,对一至两名区域内有牌的其他角色使用。你获得目标角色一张牌,然后依次交给每名目标角色各一张牌。", + jiachong: "TW贾充", + jiachong_prefix: "TW", + beini: "悖逆", + beini_info: + "出牌阶段限一次,你可以选择一名体力值不小于你的角色,令你或其摸两张牌,然后未摸牌的角色视为对摸牌的角色使用一张【杀】。", + dingfa: "定法", + dingfa_info: + "弃牌阶段结束时,若本回合你失去的牌数不小于你的体力值,你可以选择一项:1、回复1点体力;2、对一名其他角色造成1点伤害。", + duosidawang: "朵思大王", + equan: "恶泉", + equan_info: + "锁定技。①当有角色于你的回合内受到伤害后,其获得X枚“毒”(X为伤害值)。②准备阶段,你令所有拥有“毒”标记的角色移去所有“毒”标记并失去等量的体力。③当有角色因〖恶泉②〗进入濒死状态时,你令其所有技能失效直到回合结束。", + manji: "蛮汲", + manji_info: + "锁定技。其他角色失去体力后,若你的体力值:不大于该角色,你回复1点体力;不小于该角色,你摸一张牌。", + wuban: "TW吴班", + wuban_prefix: "TW", + jintao: "进讨", + jintao_info: + "锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】伤害+1,第二张【杀】不可被响应。", + yuejiu: "TW乐就", + yuejiu_prefix: "TW", + cuijin: "催进", + cuijin_info: + "当你或你攻击范围内的角色使用【杀】时,你可以弃置一张牌并获得如下效果:此【杀】的伤害值基数+1,且当此【杀】结算结束后,若未造成过伤害,则你对使用者造成1点伤害。", + tw_zhaoxiang: "TW赵襄", + tw_zhaoxiang_prefix: "TW", + twfuhan: "扶汉", + twfuhan_info: + '限定技。准备阶段开始时时,你可以移去所有"梅影"标记,然后从五张未登场的蜀势力武将牌中选择一名获得其所有技能,将体力上限数调整为以此技能移去所有“梅影”标记的数量(最少为2,最多为8)并回复1点体力,然后从牌堆/弃牌堆/场上获得【梅影枪】。', + twqueshi: "鹊拾", + twqueshi_info: "游戏开始时,你将【梅影枪】置于你的装备区。", + meiyingqiang: "梅影枪", + meiyingqiang_info: "当你于其他角色的回合内第一次失去牌时,你可以使用一张【杀】。", + tw_fuwan: "TW伏完", + tw_fuwan_prefix: "TW", + twmoukui: "谋溃", + twmoukui_info: + "当你使用【杀】指定目标后,你可以选择一项:①摸一张牌;②弃置该角色的一张牌;③背水:若此【杀】未因造成伤害而令该角色进入过濒死状态,则该角色弃置你的一张牌。", + tw_yujin: "SP于禁", + tw_yujin_prefix: "SP", + xinzhenjun: "镇军", + xinzhenjun_info: + "出牌阶段开始时,你可以将一张牌交给一名其他角色,令其选择是否使用一张不为黑色的【杀】。若其选择是,则你于此【杀】结算完成后摸1+X张牌(X为此【杀】造成的伤害总点数)。若其选择否,则你对其或其攻击范围内的一名其他角色造成1点伤害。", + tw_hucheer: "TW胡车儿", + tw_hucheer_prefix: "TW", + twshenxing: "神行", + twshenxing_info: "锁定技。若你的装备区内没有坐骑牌,则你至其他角色的距离-1且手牌上限+1。", + twdaoji: "盗戟", + twdaoji_info: + "出牌阶段限一次,你可以弃置一张非基本牌并选择一名攻击范围内的角色,获得其一张牌。若你以此法得到的牌为:基本牌,你摸一张牌;装备牌,你使用此牌并对其造成1点伤害。", + tw_hejin: "TW何进", + tw_hejin_prefix: "TW", + twmouzhu: "谋诛", + twmouzhu_info: + "出牌阶段限一次,你可以选择一名其他角色A。你令除A外所有体力值小于等于你的其他角色依次选择是否交给你一张牌。若你以此法得到的牌数X:等于0,你和所有进行选择的角色依次失去1点体力。大于0,你令A选择由你视为对其使用一张伤害值基数为X的【杀】或【决斗】。", + twyanhuo: "延祸", + twyanhuo_info: + "当你死亡时,你可以选择一项:①令一名其他角色弃置X张牌。②令X名其他角色依次弃置一张牌。(X为你的牌数)", + tw_mayunlu: "TW马云禄", + tw_mayunlu_prefix: "TW", + twfengpo: "凤魄", + twfengpo_info: + "①当你使用【杀】或【决斗】指定唯一目标后,你可观看目标角色的手牌并选择一项:⒈摸X张牌。⒉令此牌的伤害值基数+X(X为其手牌中的♦数)。②当你杀死一名角色后,你将〖凤魄①〗中的“♦数”改为“红色牌数”。", + tw_re_caohong: "TW曹洪", + tw_re_caohong_prefix: "TW", + twyuanhu: "援护", + twyuanhu_info: + "出牌阶段限一次。你可将一张装备牌置入一名角色的装备区内。若此牌为:武器牌,你弃置与其距离为1的另一名角色区域的一张牌;防具牌,其摸一张牌;坐骑牌或宝物牌,其回复1点体力。然后若其体力值或手牌数不大于你,则你摸一张牌,且你可以于本回合的结束阶段发动一次〖援护〗。", + twjuezhu: "决助", + twjuezhu_info: + "限定技。准备阶段,你可废除一个坐骑栏,令一名角色获得〖飞影〗并废除判定区。该角色死亡后,你恢复以此法废除的装备栏。", + tw_zangba: "TW臧霸", + tw_zangba_prefix: "TW", + twhanyu: "捍御", + twhanyu_info: "锁定技。游戏开始时,你获得牌堆中的基本牌,锦囊牌,装备牌各一张。", + twhengjiang: "横江", + twhengjiang_info: + "出牌阶段限一次,当你使用基本牌或普通锦囊牌指定唯一目标后,你可将此牌的目标改为攻击范围内的所有合法目标,然后你于此牌结算结束后摸X张牌(X为因响应此牌而使用或打出过牌的角色数)。", + tw_huojun: "TW霍峻", + tw_huojun_prefix: "TW", + twsidai: "伺怠", + twsidai_info: + "限定技。出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用(无距离和次数限制)。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限;包含【酒】,则当目标角色受到此牌的伤害时,此伤害×2。", + twjieyu: "竭御", + twjieyu_info: + "每轮限一次。结束阶段开始时,或当你于一轮内第一次受到伤害后,你可以弃置所有手牌,然后从弃牌堆中获得不同牌名的基本牌各一张。", + tw_liuhong: "TW刘宏", + tw_liuhong_prefix: "TW", + twyujue: "鬻爵", + twyujue_give: "鬻爵", + twyujue_info: + "①其他角色的出牌阶段内,可以交给你任意张牌(每阶段上限为两张)。②当你于回合外获得其他角色的一张牌后,你可令其选择本回合内未选择过的一项:⒈弃置攻击范围内一名角色的一张牌。⒉下一次使用牌时,从牌堆中获得一张同类别的牌。", + twgezhi: "革制", + twgezhi_info: + "①当你于出牌阶段内首次使用某种类别的牌时,你可以重铸一张手牌。②出牌阶段结束时,若你本阶段内因〖革制①〗失去过至少两张牌,则你可以令一名角色选择获得一个其未获得过的效果:⒈攻击范围+2;⒉手牌上限+2;⒊加1点体力上限。", + twfengqi: "烽起", + twfengqi_info: + "主公技,锁定技。①其他群势力角色发动〖鬻爵①〗时,将每阶段上限改为四张。②以其他角色为目标的〖革制②〗结算结束后,目标角色可以获得其武将牌上的主公技。", + tw_caocao: "TW曹操", + tw_caocao_prefix: "TW", + twlingfa: "令法", + twlingfa_info: + "①第一轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。②第二轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。③第三轮游戏开始时,你失去〖令法〗并获得〖治暗〗。", + twzhian: "治暗", + twzhian_info: + "每回合限一次。一名角色使用装备牌或延时锦囊牌后,你可选择:⒈弃置位于场上的此牌。⒉弃置一张手牌并获得位于场上的此牌。⒊对其造成1点伤害。", + tw_zhangmancheng: "TW张曼成", + tw_zhangmancheng_prefix: "TW", + twfengji: "蜂集", + twfengji_info: + "出牌阶段开始时,若你没有“示”,则你可以将一张牌作为“示”置于武将牌上并施法:从牌堆中获得X张与“示”牌名相同的牌,然后移去“示”。", + twyiju: "蚁聚", + twyiju_info: + "若你的武将牌上有“示”,则:①你使用【杀】的次数上限和攻击范围的基数改为你的体力值。②当你受到伤害时,你移去“示”,且令此伤害+1。", + twbudao: "布道", + twbudao_info: + "限定技。准备阶段,你可减1点体力上限,回复1点体力并选择获得一个〖布道〗技能池里的技能(三选一)。然后你可以令一名其他角色也获得此技能并交给你一张牌。", + twzhouhu: "咒护", + twzhouhu_info: "出牌阶段限一次。你可以弃置一张红色手牌并施法:回复X点体力。", + twharvestinori: "丰祈", + twharvestinori_info: "出牌阶段限一次。你可以弃置一张黑色手牌并施法:摸2X张牌。", + twzuhuo: "阻祸", + twzuhuo_info: "出牌阶段限一次。你可以弃置一张非基本牌并施法:防止你受到的下X次伤害。", + twzhouzu: "咒诅", + twzhouzu_info: + "出牌阶段限一次。你可以对一名其他角色施法:其弃置X张牌,然后你对其造成1点雷电伤害。", + twhuangjin: "黄巾", + twhuangjin_info: + "锁定技。当你一名角色使用【杀】指定你为目标时,若此【杀】有点数,你判定,若点数与此【杀】点数差值不大于1,则此【杀】对你无效。", + twguimen: "鬼门", + twguimen_info: + "锁定技。当你弃置牌时,若其中有♠牌,你为每一张♠牌判定,若此牌点数与结果之差不大于1,你对一名其他角色造成2点雷电伤害。", + twdidao: "地道", + twdidao_info: + "一名角色的判定牌生效前,你可以打出一张牌作为判定牌并获得原判定牌。若你以此法打出的牌与原判定牌颜色相同,你摸一张牌。", + tw_chengpu: "TW程普", + tw_chengpu_prefix: "TW", + twlihuo: "疠火", + twlihuo2: "疠火", + twlihuo3: "疠火", + twlihuo_info: + "①当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。此牌使用结算结束后,若有角色因此【杀】造成的伤害进入过濒死状态,则你失去1点体力。②当你使用火【杀】选择目标后,你可为此牌增加一个目标。", + twchunlao: "醇醪", + twchunlao_info: + "①准备阶段,若场上没有“醇”,则你可将一名角色区域内的一张牌置于其武将牌上,称为“醇”。②一名角色使用【杀】时,若其有“醇”,则其可以交给你一张牌,令此【杀】的伤害值基数+1。③一名角色进入濒死状态时,若其有“醇”,则你可以移去“醇”并摸一张牌,然后令其回复1点体力。", + tw_guohuai: "TW郭淮", + tw_guohuai_prefix: "TW", + twjingce: "精策", + twjingce_info: + "当你于出牌阶段使用第X张牌结算完毕后,你可以摸两张牌(X为你的体力值)。若此阶段你此前已摸过牌或本回合造成过伤害,你获得一枚“策”标记。", + yuzhang: "御嶂", + yuzhang_info: + "你可以弃置一枚“策”标记,然后跳过一个阶段。当你受到伤害后,你可弃置一枚“策”标记,然后选择一项:⒈令伤害来源弃置两张牌;⒉令伤害来源本回合不能再使用或打出牌。", + tw_caozhao: "曹肇", + twfuzuan: "复纂", + twfuzuan_info: + "出牌阶段限一次/当你受到伤害后/当你对其他角色造成伤害后,你可选择一名拥有转换技的角色,变更其的一个转换技的的状态。", + twchongqi: "宠齐", + twchongqi_info: + "锁定技。游戏开始时,你令所有角色获得〖非服〗。然后你可减1点体力上限,令一名其他角色获得〖复纂〗。", + twfeifu: "非服", + twfeifu_info: + "锁定技,转换技。阴:当你成为【杀】的唯一目标后;阳:当你使用【杀】指定唯一目标后;目标角色须交给使用者一张牌。若此牌为装备牌,则使用者可使用此牌。", + tw_wangchang: "TW王昶", + tw_wangchang_prefix: "TW", + twkaiji: "开济", + twkaiji_info: + "准备阶段,你可令至多X名角色各摸一张牌(X为本局游戏内进入过濒死状态的角色数+1)。若有角色以此法获得了非基本牌,则你摸一张牌。", + twshepan: "慑叛", + twshepan_info: + "每回合限一次。当你成为其他角色使用牌的目标后,你可选择一项:⒈摸一张牌。⒉将其区域内的一张牌置于牌堆顶。然后若你的手牌数与其相等,则你将此技能的发动次数归零,且可以令此牌对你无效。", + tw_wangcan: "TW王粲", + tw_wangcan_prefix: "TW", + twdianyi: "典仪", + twdianyi_info: + "锁定技。你的回合结束时,若你本回合内:造成过伤害,你弃置所有手牌;未造成过伤害,你将手牌数调整至四张。", + twyingji: "应机", + twyingji_wuxie: "应机", + twyingji_info: + "当你于回合外需要使用或打出一张基本牌或普通锦囊牌时,若你没有手牌,则你可摸一张牌,然后视为使用或打出此牌。", + twshanghe: "觞贺", + twshanghe_info: + "限定技。当你进入濒死状态时,你可令所有其他角色依次交给你一张牌;若这些牌中没有【酒】,则你将体力回复至1点。", + tw_wujing: "TW吴景", + tw_wujing_prefix: "TW", + twfenghan: "锋捍", + twfenghan_info: + "每回合限一次。当你使用【杀】或伤害类锦囊牌指定第一个目标后,你可令至多X名角色各摸一张牌(X为此牌的目标数)。", + twcongji: "从击", + twcongji_info: "当你的红色牌于回合外因弃置而进入弃牌堆后,你可令一名其他角色获得这些牌。", + old_quancong: "TW全琮", + old_quancong_prefix: "TW", + zhenshan: "振赡", + zhenshan_info: + "每回合限一次,当你需要使用或打出一张基本牌时,你可以与一名手牌数少于你的角色交换手牌,视为使用或打出此牌。", + tw_tianyu: "TW田豫", + tw_tianyu_prefix: "TW", + gz_tw_tianyu: "田豫", + twzhenxi: "震袭", + twzhenxi_info: + "每回合限一次。当你使用【杀】指定目标后,你可选择一项:⒈弃置其X张手牌(X为你至其的距离);⒉将其装备区或判定区内的一张牌移动到另一名角色的装备区或判定区内。若其体力值大于你或其体力值为全场最高,则你可以改为依次执行以上两项。", + twyangshi: "扬师", + twyangshi_info: + "锁定技。当你受到伤害后,若场上有不在你攻击范围内的其他角色,则你令攻击范围+1;若没有,则你从牌堆中获得一张【杀】。", + tw_puyangxing: "濮阳兴", + twzhengjian: "征建", + twzhengjian_info: + "游戏开始时,你可选择获得一项效果:⒈其他角色的出牌阶段结束时,若其本阶段内未使用过非基本牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果二。⒉其他角色的出牌阶段结束时,若其本阶段内未得到过牌,则其须交给你一张牌,然后你可失去此效果并获得〖征建〗的效果一。", + twzhongchi: "众斥", + twzhongchi_info: + "锁定技,限定技。当你因〖征建〗而得到牌后,若已经有至少X名角色因〖征建〗而交给你过牌(X为游戏人数的一半且向上取整),则你回复2点体力,且于本局游戏内受到渠道为【杀】的伤害+1,且你将〖征建〗中的“其须交给你一张牌”改为“你可对其造成1点伤害”。", + tw_bingyuan: "邴原", + twbingde: "秉德", + twbingde_info: + "出牌阶段限一次。你可以选择一个本阶段未选择过的花色并弃置一张牌,你摸等同于本阶段你使用此花色的牌数,然后若你以此法弃置的牌的花色与你选择的花色相同,你令你〖秉德〗于此阶段发动的次数上限+1。", + twqingtao: "清滔", + twqingtao_info: + "①摸牌阶段结束时,你可以重铸一张牌。若此牌为【酒】或非基本牌,你摸一张牌。②结束阶段,若你本回合未发动〖清滔①〗,你可以发动〖清滔①〗。", + tw_jiangji: "TW蒋济", + tw_jiangji_prefix: "TW", + twjichou: "急筹", + twjichou_info: + "①每回合限一次。你可以视为使用一张未被〖急筹①〗记录过的普通锦囊牌并记录此牌。②你无法响应或{使用对应实体牌包含你的手牌的}〖急筹①〗记录过的锦囊牌。③出牌阶段限一次。你可将手牌中的一张〖急筹①〗记录过的锦囊牌交给其他角色。", + twjilun: "机论", + twjilun_info: + "当你受到伤害后,你可以摸X张牌(X为〖急筹①〗记录数且至少为1,至多为5),或视为使用一张〖急筹①〗记录过且未被〖机论〗记录过的普通锦囊牌并记录此牌。", + tw_niufudongxie: "牛辅董翓", + baonvezhi_faq: "关于暴虐值", + baonvezhi_faq_info: "
  • 当你造成或受到伤害后,你获得等量的暴虐值;
  • 暴虐值的上限为5。", + twjuntun: "军屯", + twjuntun_info: + "①游戏开始时或当其他角色死亡后,你可令一名角色获得〖凶军〗。②当其他角色造成伤害后,若其拥有〖凶军〗,你获得等同于此次伤害值的暴虐值。", + twxiongxi: "凶袭", + twxiongxi_info: + "出牌阶段限一次。你可以弃置X张牌对一名其他角色造成1点伤害(X为你的暴虐值与暴虐值上限之差)。", + twxiafeng: "黠凤", + twxiafeng_info: + "出牌阶段开始时,你可消耗至多3点暴虐值并获得如下效果直到回合结束:你使用的前X张牌没有距离和次数限制且不可被响应,你的手牌上限+X(X为你以此法消耗的暴虐值)。", + tw_bn_1: "一点", + tw_bn_2: "两点", + tw_bn_3: "三点", + tw_bn_1_bg: "一", + tw_bn_2_bg: "二", + tw_bn_3_bg: "三", + twxiongjun: "凶军", + twxiongjun_info: "锁定技,每回合限一次。当你造成伤害后,所有拥有〖凶军〗的角色摸一张牌。", + tw_jianshuo: "蹇硕", + twkunsi: "困兕", + twkunsi_info: + "出牌阶段,你可以视为对一名未以此法选择过的其他角色使用一张【杀】。若此【杀】未造成伤害,其获得〖令戮〗直到你下回合开始,且当你成为其〖令戮〗的目标后,其可令你于〖令戮〗失败时进行两次结算。", + twlinglu: "令戮", + twlinglu_info: + "强令:①任务:执行角色于其下回合结束前造成的伤害不小于2点。②成功:其摸两张牌。③失败:其失去1点体力。", + tw_mateng: "TW马腾", + tw_mateng_prefix: "TW", + twxiongzheng: "雄争", + twxiongzheng_info: + "一轮游戏开始时,①若你上一轮发动过〖雄争〗且选择过“雄争”角色,你可以选择一项:1.视为对任意名上一轮内未对“雄争”角色造成过伤害的角色依次使用一张【杀】;2.令任意名上一轮对“雄争”角色造成过伤害的角色摸两张牌。②你可以选择一名未以此法选择过的角色,称为“雄争”角色。", + twluannian: "乱年", + twluannian_info: + "主公技。其他群势力角色的出牌阶段限一次。其可以弃置X张牌并对“雄争”角色造成1点伤害(X为所有角色于本轮发动〖乱年〗的次数+1)。", + tw_baoxin: "TW鲍信", + tw_baoxin_prefix: "TW", + twmutao: "募讨", + twmutao_info: + "出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】依次交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。", + twyimou: "毅谋", + twyimou_info: + "当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色并摸两张牌;3.背水:将所有手牌交给其(若受伤角色为你则跳过此步骤),然后依次执行上述所有选项。", + tw_liufuren: "刘夫人", + twzhuidu: "追妒", + twzhuidu_info: + "出牌阶段限一次。你可以选择一名已受伤的其他角色并选择一项:1.对其造成1点伤害;2.弃置其装备区里的一张牌;3.背水:若该角色为女性,弃置一张牌,然后依次执行上述所有选项。", + twshigong: "示恭", + twshigong_info: + "限定技。当你于回合外进入濒死状态时,你可以令当前回合角色选择一项:1.加1点体力上限并回复1点体力,摸一张牌,然后令你将体力回复至体力上限;2.弃置X张手牌,然后令你将体力回复至1点(X为其体力值)。", + tw_wangling: "TW王淩", + tw_wangling_prefix: "TW", + twmibei: "秘备", + twmibei_info: + "使命技。①使命:使用每种类型且牌名不同的牌各两张。②成功:当你使用牌后,若你于本次事件完成了〖秘备①〗的使命,你获得〖谋立〗。③失败:出牌阶段结束时,若你本回合未使用过牌,你本回合手牌上限-1并重置〖秘备〗。", + twxingqi: "星启", + twxingqi_info: + "觉醒技。准备阶段,若场上的牌数大于你的体力值,你回复1点体力,然后若〖秘备〗:未完成,你从牌堆中获得每种类型的牌各一张;已完成,本局游戏你使用牌无距离限制。", + twmouli: "谋立", + twmouli_backup: "谋立", + twmouli_info: "每回合限一次。你可以使用牌堆中的一张基本牌。", + tw_zhugeguo: "TW诸葛果", + tw_zhugeguo_prefix: "TW", + twqirang: "祈禳", + twqirang_info: + "当有装备牌进入你的装备区时,你可以从牌堆中获得一张锦囊牌,你本阶段使用此牌无距离限制且不可被响应,且当你使用此牌时,你可以为这张牌增加或减少一个目标。", + twyuhua: "羽化", + twyuhua_info: + "锁定技。①你的非基本牌不计入手牌上限。②当你于回合外失去牌后,若其中有非基本牌,你可以卜算X,然后你可以摸X张牌(X为其中非基本牌数且至多为5)。", + tw_fanchou: "TW樊稠", + tw_fanchou_prefix: "TW", + twxingluan: "兴乱", + twxingluan_info: + "结束阶段,你可以亮出牌堆顶的六张牌,然后你可以选择一种类型的牌并分配给任意角色(每名角色至多三张)。然后所有以此法得到过牌且得到的牌数不少于你的角色失去1点体力。", + tw_xujing: "TW许靖", + tw_xujing_prefix: "TW", + twboming: "博名", + twboming_info: + "①出牌阶段限两次。你可以将一张牌交给一名其他角色。②结束阶段,若所有其他角色于此回合得到的牌数之和大于1,你摸两张牌。", + twejian: "恶荐", + twejian_info: + "当其他角色得到你的牌后,若其有其他与此牌类型相同的牌,你可以令其选择一项:1.受到你造成的1点伤害;2.弃置这些牌。", + tw_zhangfei: "TW张飞", + tw_zhangfei_prefix: "TW", + twxuhe: "虚吓", + twxuhe_info: + "当你使用的【杀】被【闪】抵消时,你可以令其选择一项:1.受到你造成的1点伤害;2.本回合你使用的下一张牌对其造成伤害时,此伤害+2。", + tw_xuezong: "TW薛综", + tw_xuezong_prefix: "TW", + twjiexun: "诫训", + twjiexun_info: + "结束阶段,你可以选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌。若其以此法弃置了所有牌,你选择一项:1.摸X张牌,然后将X归零;2.修改〖复难〗和〖诫训〗(X为此前〖诫训〗的发动次数)。", + twfunanx: "复难·改", + twjiexunx: "诫训·改", + twfunanx_info: "当其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。", + twjiexunx_info: + "结束阶段,你可选择一个花色并令一名其他角色摸等同于场上此花色牌数张牌,然后其弃置X张牌(X为此前〖诫训〗的发动次数)。", + tw_zhangning: "TW张宁", + tw_zhangning_prefix: "TW", + twxingzhui: "星坠", + twxingzhui_info: + "出牌阶段限一次。你可以失去1点体力并施法:亮出牌堆顶2X张牌,若其中有黑色牌,则你可令一名其他角色获得这些黑色牌。若黑色牌的数量不小于X,则你对其造成X点雷电伤害。", + twjuchen: "聚尘", + twjuchen_info: + "结束阶段,若你的手牌数和体力值均不为全场最多,则你可以令所有角色弃置一张牌,然后你获得其中的红色牌。", + tw_yufuluo: "于夫罗", + twjiekuang: "竭匡", + twjiekuang_info: + "每回合限一次。当一名体力值小于你的角色成为其他角色使用基本牌或普通锦囊牌的唯一目标后,若没有角色处于濒死状态,你可以失去1点体力或减1点体力上限,将此牌的目标转移给你。然后此牌结算结束后,若此牌未造成伤害且此牌的使用者是你使用此牌名的牌的合法目标,你视为对此牌的使用者使用一张同名牌。", + twneirao: "内扰", + twneirao_info: + "觉醒技。准备阶段,若你的体力值与体力上限之和不大于9,你失去〖竭匡〗,弃置所有牌并从牌堆或弃牌堆中获得等量的【杀】,然后获得〖乱掠〗。", + twluanlve: "乱掠", + twluanlve_info: + "①出牌阶段,你可以将X张【杀】当做【顺手牵羊】对一名本阶段未成为过【顺手牵羊】的目标的角色使用(X为你以此法使用【顺手牵羊】的次数)。②当你使用牌时,若此牌为【顺手牵羊】,你令此牌不能被响应。", + tw_fengxí: "冯习", + twqingkou: "轻寇", + twqingkou_info: + "准备阶段,你可以视为对一名其他角色使用一张【决斗】。然后此牌的伤害来源摸一张牌,若伤害来源包括你,你跳过本回合的判定阶段和弃牌阶段。", + tw_zhangji: "张既", + twdingzhen: "定镇", //丁真 + twdingzhen_info: + "一轮游戏开始时,你可以选择任意名你至其距离不大于X的角色(X为你的体力值),这些角色选择一项:1.弃置一张【杀】;2.本轮其于回合内使用的第一张牌不能指定你为目标。", + twyouye: "攸业", + twyouye_info: + "锁定技。①其他角色的结束阶段,若其本回合未对你造成过伤害且“蓄”数小于5,你将牌堆顶的牌置于武将牌上,称为“蓄”。②当你造成或受到伤害后,若你有“蓄”,你将所有“蓄”分配给任意角色(若当前回合角色存活,则你至少为当前回合角色分配一张)。", + tw_xunchen: "TW荀谌", + tw_xunchen_prefix: "TW", + twweipo: "危迫", + twweipo_info: + "出牌阶段限一次。你可以令一名角色弃置一张牌,然后令其获得一张【兵临城下】或一张由你选择的智囊牌。", + twmouzhi: "谋识", + twmouzhi_info: + "锁定技。当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害渠道对应的牌颜色相同,则你防止此伤害。", + tw_jiangqing: "TW蒋钦", + tw_jiangqing_prefix: "TW", + twshangyi: "尚义", + twshangyi_info: + "出牌阶段限一次。你可以弃置一张牌并选择一名有手牌的其他角色,你令其观看你的手牌,然后你观看其手牌并选择一项:1.弃置其中一张牌;2.与其交换一张手牌。若你以此法弃置了其的黑色牌,或你与其交换的两张牌均为红色,你摸一张牌。", + twxiangyu: "翔羽", + twxiangyu_info: + "锁定技。①你于回合内的攻击范围+X(X为本回合失去过牌的角色数且至多为5)。②当你使用【杀】指定目标后,若你至目标角色的距离小于你的攻击范围,你令此目标角色抵消此【杀】所需使用的【闪】数+1。", + twgyshenxing: "慎行", + twgyshenxing_info: + "出牌阶段,你可以弃置X张牌,然后摸一张牌并获得1枚“慎”标记(X为你的“慎”数且至多为2)。", + tw_guyong: "TW顾雍", + tw_guyong_prefix: "TW", + twbingyi: "秉壹", + twbingyi_info: + "结束阶段,你可以展示所有手牌,若这些牌的颜色均相同或类别均相同,你可以令至多Y名角色各摸一张牌(Y为你的手牌数)。若你以此法展示的牌数大于1且这些牌的颜色均相同且类别均相同,你移去所有“慎”。", + twyilie: "毅烈", + twyilie_info: + "出牌阶段开始时,你可以选择一项:1.本阶段内使用【杀】的次数上限+1;2.本回合内使用【杀】指定处于连环状态的目标后,或使用【杀】被【闪】抵消时,摸一张牌;3.背水:失去1点体力,然后依次执行上述所有选项。", + tw_chendong: "TW陈武董袭", + tw_chendong_prefix: "TW", + twfenming: "奋命", + twfenming_info: + "准备阶段,你可以选择一名其他角色并选择一项:1.令其弃置一张牌;2.令其横置;3.背水:横置,然后依次执行上述所有选项。", + tw_handang: "TW韩当", + tw_handang_prefix: "TW", + twgongji: "弓骑", + twgongji2: "弓骑", + twgongji_info: + "①你的攻击范围无限。②出牌阶段限一次,你可以弃置一张牌,然后你使用与此牌花色相同的【杀】无任何次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", + twjiefan: "解烦", + twjiefan_info: + "限定技。出牌阶段,你可以选择一名角色,令攻击范围内含有其的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后当其第一次进入濒死状态后,你重置〖解烦〗。", + tw_jiling: "TW纪灵", + tw_jiling_prefix: "TW", + twshuangren: "双刃", + twshuangren_info: + "①出牌阶段开始时,你可以与一名角色拼点。若你:赢,你可以视为对至多两名至其的距离不大于1的角色依次使用一张【杀】;没赢,其可以视为对你使用一张【杀】。②出牌阶段结束时,若你本回合未发动过〖双刃①〗且未造成过渠道为【杀】的伤害,你可以弃置一张牌发动〖双刃①〗。", + tw_re_fazheng: "TW法正", + tw_re_fazheng_prefix: "TW", + twxuanhuo: "眩惑", + twxuanhuo_info: + "摸牌阶段结束时,你可以交给一名其他角色两张牌,然后其选择一项:1.视为对你选择的另一名其他角色使用一张【杀】或【决斗】,2.令你获得其两张牌。", + twenyuan: "恩怨", + twenyuan1: "恩怨", + twenyuan2: "恩怨", + twenyuan_info: + "①当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌,若其手牌区或装备区没有牌,则你可以改为令其回复1点体力。②当你受到1点伤害后,你可令伤害来源选择一项:1.失去1点体力;2.交给你一张手牌,若此牌的花色不为♥,你摸一张牌。", + tw_madai: "TW马岱", + tw_madai_prefix: "TW", + twqianxi: "潜袭", + twqianxi2: "潜袭", + twqianxi3: "潜袭", + twqianxi2_bg: "潜", + twqianxi3_bg: "袭", + twqianxi_info: + "准备阶段,你可以摸一张牌并弃置一张牌,令一名距离为1的角色本回合不能使用或打出与你弃置的牌颜色相同的手牌。然后本回合的结束阶段,若你本回合对其造成过渠道为【杀】的伤害,你令其不能使用或打出与你以此法弃置的牌颜色不同的牌直到其下回合结束。", + tw_niujin: "TW牛金", + tw_niujin_prefix: "TW", + twcuorui: "挫锐", + twcuorui_info: + "限定技。准备阶段,你可以将手牌摸至X张(X为场上角色手牌数最多的角色的手牌数,且至多摸5张)。然后若你的判定区:未废除,你废除判定区;已废除,你可以对一名其他角色造成1点伤害。", + twliewei: "裂围", + twliewei_info: + "锁定技。当你杀死一名角色后,你选择一项:1.摸两张牌;2.若你拥有〖挫锐〗且〖挫锐〗已发动过,重置〖挫锐〗。", + tw_guanqiujian: "TW毌丘俭", + tw_guanqiujian_prefix: "TW", + twzhengrong: "征荣", + twzhengrong_tag: "荣", + twzhengrong_info: + "当你于出牌阶段使用牌结算结束后,若此牌为你于本局游戏你的出牌阶段内使用的第偶数张指定了其他角色为目标的牌,或你于出牌阶段第一次造成伤害后,你可以将一名其他角色的一张牌置于你的武将牌上,称为“荣”。", + twhongju: "鸿举", + twhongju_info: + "觉醒技。准备阶段,若你的“荣”数不小于3,你摸等同于“荣”数的牌,且可以用任意手牌交换等量的“荣”,获得〖清侧〗,然后可以减1点体力上限并获得〖扫讨〗。", + twqingce: "清侧", + twqingce_backup: "清侧", + twqingce_info: + "出牌阶段,你可以将一张“荣”置入弃牌堆并选择一名区域内有牌的角色,你弃置其区域里的一张牌。", + twsaotao: "扫讨", + twsaotao_info: "锁定技。你使用【杀】和普通锦囊牌不能被响应。", + tw_daxiaoqiao: "TW大乔小乔", + tw_daxiaoqiao_prefix: "TW", + twxingwu: "星舞", + twxingwu_info: + "弃牌阶段开始时,你可以将一张牌置于武将牌上,称为“星舞”。然后你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成2点伤害(若其性别包含女性则改为1点伤害)。", + twpingting: "娉婷", + twpingting_info: + "锁定技。①一轮游戏开始时或其他角色于你的回合内进入濒死状态时,你摸一张牌并将一张牌置于武将牌上,称为“星舞”。②若你有“星舞”,你视为拥有〖天香〗和〖流离〗。", + tw_furong: "TW傅肜", + tw_furong_prefix: "TW", + twxuewei: "血卫", + twxuewei_info: + "每轮限一次。一名其他角色A的出牌阶段开始时,你可以选择另一名其他角色B,然后你令A选择一项:1.本回合不能对B使用【杀】且手牌上限-2;2.你视为对A使用一张【决斗】。", + twliechi: "烈斥", + twliechi_info: + "当你受到伤害后,若伤害来源的体力值不小于你,你可以选择一项:1.令其将手牌数弃置至与你的手牌数相同;2.弃置其一张牌;3.背水:若你本回合进入过濒死状态,弃置一张装备牌,然后依次执行上述所有选项。", + tw_yl_luzhi: "TW卢植", + tw_yl_luzhi_prefix: "TW", + twmingren: "明任", + twmingren_info: + "①游戏开始时,你摸一张牌,然后将一张手牌置于武将牌上,称为“任”。②出牌阶段开始时或出牌阶段结束时,你可以用一张牌替换“任”。", + twzhenliang: "贞良", + twzhenliang_info: + "转换技。阴:出牌阶段限一次。你可以弃置一张牌并对攻击范围内的一名角色造成1点伤害。阳:当你或你攻击范围内的一名角色于你的回合外受到伤害时,你可以弃置一张牌令此伤害-1。然后若你以此法弃置的牌颜色与“任”的颜色相同,你摸一张牌。", + tw_zhangnan: "张南", + twfenwu: "奋武", + twfenwu_info: + "结束阶段,你可以失去1点体力并视为使用一张无距离限制的【杀】。若本回合你使用过的基本牌种数大于1,此【杀】伤害基数+1。", + tw_huchuquan: "呼厨泉", + twfupan: "复叛", + twfupan_info: + "当你造成或受到伤害后,你可以摸X张牌并将一张牌交给一名其他角色(X为伤害值)。若你此前:未以此法交给过该角色牌,你摸两张牌;以此法交给过该角色牌,你可{对其造成1点伤害,然后你不能再以此法交给其牌}。", + tw_liuzhang: "TW刘璋", + tw_liuzhang_prefix: "TW", + twyaohu: "邀虎", + twyaohu_info: + "每轮限一次。回合开始时,你须选择场上的一个势力。该势力的角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:1.对你指定的另一名的其他角色使用一张【杀】(无距离限制);2.本回合其使用伤害牌指定你为目标时须交给你两张牌,否则取消此目标。", + tw_liwei: "TW李遗", + tw_liwei_prefix: "TW", + twjiaohua: "教化", + twjiaohua_info: + "当你或体力值最小的其他角色因摸牌而得到牌后,你可以令该角色从牌堆或弃牌堆中获得一张本次未获得的类别的牌(每种类别每回合限一次)。", + tw_yanxiang: "TW阎象", + tw_yanxiang_prefix: "TW", + twkujian: "苦谏", + twkujianx: "谏", + twkujian_info: + "出牌阶段限一次。你可以将至多三张手牌交给一名其他角色,称为“谏”,你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸一张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。", + twruilian: "睿敛", + twruilian2: "睿敛", + twruilian_info: + "一轮游戏开始时,你可以选择一名角色。其下回合结束时,若其本回合弃置过至少两张牌,你可以选择其本回合弃置过的一种类别,你与其各从弃牌堆中获得一张此类别的牌。", + tw_xiahouen: "夏侯恩", + twfujian: "负剑", + twfujian_info: + "锁定技。①游戏开始时或准备阶段,若你的装备区里没有武器牌,你随机将牌堆中的一张武器牌置入装备区。②当你于回合外失去武器牌后,你失去1点体力。", + twjianwei: "剑威", + twjianwei_info: + "①若你的装备区里有武器牌,你使用【杀】无视防具且拼点牌点数+X(X为你的攻击范围)。②{其他角色的准备阶段,其可以与你拼点}/{准备阶段,你可以与攻击范围内的一名角色拼点}。若你赢,你获得其每个区域内的各一张牌;若其赢,其获得你装备区里的武器牌。", + tw_xiahoushang: "夏侯尚", + twtanfeng: "探锋", + twtanfeng_info: + "准备阶段,你可以弃置一名其他角色区域内的一张牌,然后其选择一项:1.受到你造成的1点火焰伤害,然后令你跳过本回合的一个阶段(准备阶段和结束阶段除外);2.将一张牌当做【杀】对你使用(有距离限制)。", + tw_zongyu: "TW宗预", + tw_zongyu_prefix: "TW", + twzhibian: "直辩", + twzhibian_info: + "出牌阶段开始时,你可以与一名其他角色拼点。若你赢,你可以选择一项:{1.将其区域里的一张牌移动到你的对应区域;2.回复1点体力;3.背水:弃置一张非基本牌,然后依次执行上述所有选项};若你没赢,你失去1点体力。", + twyuyan: "御严", + twyuyan_info: + "锁定技。当你成为体力值大于你的角色使用的【杀】的目标时,你令使用者选择一项:1.交给你一张点数大于此【杀】的牌(若此【杀】无点数则改为非基本牌)。2.取消此目标。", + tw_zhouchu: "TW周处", + tw_zhouchu_prefix: "TW", + twguoyi: "果毅", + twguoyi_info: + "当你不因〖果毅〗使用【杀】或普通锦囊牌指定一名其他角色为目标后,若其体力值或手牌数最大,或你的手牌数不大于X(X为你已损失的体力值+1),你可令其选择一项:1.本回合不能使用或打出手牌;2.弃置X张牌。若条件均满足,或其于本回合两个选项均已选择过,则你于此牌结算结束后依次视为对此牌的所有目标使用一张名称和属性相同的牌。", + twchuhai: "除害", + twchuhai_info: + "使命技。①使命:令至少两名其他角色进入濒死状态。②成功:一名角色的回合结束时,若你于本回合完成了〖除害①〗的使命,你废除判定区,然后每名其他角色依次交给你一张牌。③当你获得其他角色的牌后,你须将其中的一张牌置入弃牌堆。", + tw_qiaogong: "TW桥公", + tw_qiaogong_prefix: "TW", + twyizhu: "遗珠", + twyizhu_info: + "①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中,称为“遗珠”(X为角色数,选择牌的牌名对其他角色可见)。②当有其他角色使用“遗珠”指定唯一目标时,你可以选择一项:1.增加一个目标;2.取消此目标,增加一个目标。然后移除此牌对应的“遗珠”记录并摸一张牌。", + twluanchou: "鸾俦", + twluanchou_info: "出牌阶段限一次。你可以令两名角色获得〖共患〗直到你下次发动此技能。", + twgonghuan: "共患", + twgonghuan_info: + "每回合限一次。当其他角色受到伤害时,若其拥有〖共患〗且其体力值不大于你,你可以将此伤害转移给你(不触发〖共患〗)。", + tw_qiaorui: "TW桥蕤", + tw_qiaorui_prefix: "TW", + wangxing: "妄行", + twxiawei: "狭威", + twxiawei_info: + "①游戏开始时,你将牌堆中的两张基本牌置于武将牌上,称为“威”。②回合开始时,你将所有“威”置入弃牌堆。③你可以将“威”如手牌般使用或打出。④妄行:准备阶段,你可以将牌堆顶的X+1张牌置于武将牌上,称为“威”。", + twqiongji: "穷技", + twqiongji_info: + "锁定技。①每回合限一次。当你使用或打出“威”后,你摸一张牌。②当你受到伤害时,若你没有“威”,此伤害+1。", + tw_bianfuren: "TW卞夫人", + tw_bianfuren_prefix: "TW", + twwanwei: "挽危", + twwanwei_info: + "每回合限一次。当一名体力值最小的角色受到伤害时:若该角色不为你,你可以防止此伤害,然后失去1点体力;若该角色为你,或你的体力上限最大,你可以于当前回合的结束阶段获得牌堆顶的牌并亮出牌堆底的牌,若展示的牌能被使用,你使用之。", + twyuejian: "约俭", + twyuejian_info: + "出牌阶段限一次。你可以将X张牌置于牌堆顶或牌堆底(X为你的手牌数减你的手牌上限且至少为1)。若你以此法失去的牌数:不小于3,你的体力上限+1;不小于2,你回复1点体力;不小于1,你的手牌上限+1。", + tw_chenzhen: "TW陈震", + tw_chenzhen_prefix: "TW", + twmuyue: "睦约", + twmuyue_info: + "出牌阶段限一次。你可以弃置一张牌并选择一个基本牌或普通锦囊牌的牌名,然后令一名角色从牌堆中获得一张此牌名的牌。若你以此法弃置的牌的牌名与你选择的牌名相同,你下次发动〖睦约〗无需弃牌。", + twchayi: "察异", + twchayi_info: + "结束阶段,你可以选择一名其他角色,令其选择一项:1.展示所有手牌;2.下次使用牌时弃置一张牌。该角色的下个回合结束时,若其手牌数与其上一次成为〖察异〗目标后的手牌数不相同,其执行另一项。", + tw_feiyi: "TW费祎", + tw_feiyi_prefix: "TW", + twshengxi: "生息", + twshengxi_info: + "①准备阶段,你可以获得一张【调剂盐梅】。②结束阶段,若你本回合使用过牌且未造成伤害,则你可以获得一张智囊并摸一张牌。", + twkuanji: "宽济", + twkuanji_info: + "每回合限一次。当你的牌不因使用而进入弃牌堆后,你可以令一名其他角色获得其中的一张牌。", + xia_wangyue: "王越", + twyulong: "驭龙", + twyulong_info: + "当你使用【杀】指定第一个目标后,你可以与一名目标角色拼点。若你赢,且你此次的拼点牌为:黑色,此【杀】伤害+1;红色,此【杀】不可被响应。当此【杀】造成伤害后,若你赢,你令此【杀】不计入次数。", + twjianming: "剑鸣", + twjianming_info: "锁定技。每回合每种花色限一次,当你使用或打出【杀】时,你摸一张牌。", + xia_liyàn: "李彦", + twzhenhu: "震虎", + twzhenhu_info: + "当你使用伤害牌指定第一个目标时,你可以摸一张牌并与至多三名其他角色共同拼点。若你赢,此牌对所有本次拼点没赢的角色造成的伤害+1;若你没赢,你失去1点体力。", + twlvren: "履刃", + twlvren_info: + "①当你对其他角色造成伤害时,你令其获得1枚“刃”标记。②当你使用伤害牌时,你可以额外指定一名有“刃”的角色并移去其所有“刃”。③你的拼点牌点数+2X(X为参与此次拼点的角色数)。", + xia_tongyuan: "侠童渊", + xia_tongyuan_prefix: "侠", + twchaofeng: "朝凤", + twchaofeng_backup: "朝凤", + twchaofeng_info: + "①你可以将一张【杀】当做【闪】、【闪】当做任意一种【杀】使用或打出。②出牌阶段开始时,你可以与至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】。", + twchuanshu: "传术", + twchuanshu_info: + "限定技。准备阶段,你可以选择一名角色。直到你的下回合开始,其获得以下效果:1.当其拼点牌亮出时,此牌点数+3;2.其使用的下一张【杀】对除你外的角色造成伤害时,此伤害+1;3.若其不为你,其使用的下一张【杀】结算结束后,你摸等同于其因此【杀】造成的伤害值数的牌。", + xia_xushu: "侠徐庶", + xia_xushu_prefix: "侠", + twjiange: "剑歌", + twjiange_info: + "每回合限一次。你可以将一张非基本牌当做【杀】使用或打出(无距离和次数限制,且不计入次数)。若此时不为你的回合,你摸一张牌。", + twxiawang: "侠望", + twxiawang_info: + "当一名角色受到伤害后,若你至其的距离不大于1,你可以对伤害来源使用一张【杀】。当此【杀】结算结束后,若你造成过渠道为此牌的伤害,结束当前阶段。", + tw_haomeng: "TW郝萌", + tw_haomeng_prefix: "TW", + twgongge: "攻阁", + twgongge_info: + "摧坚:你可以选择一项:1.摸X+1张牌。其响应此牌后,跳过你的下一个摸牌阶段;2.弃置其X+1张牌。此牌结算结束后,若其体力值不小于你,你交给其X张牌;3.此牌对其造成的伤害+X。此牌结算结束后,其回复X点体力。", + tw_weixu: "魏续", + twsuizheng: "随征", + twsuizheng_info: + "锁定技。游戏开始时,你选择一名其他角色,称为“随征”角色。你获得以下效果:当“随征”角色造成伤害后,你摸一张牌;当“随征”角色受到伤害后,你选择一项:1.失去1点体力,令其从牌堆或弃牌堆中获得一张【杀】或【决斗】;2.弃置两张基本牌,令其回复1点体力。", + twtuidao: "颓盗", + twtuidao_info: + "限定技。准备阶段,若“随征”角色的体力值不大于2或“随征”角色已死亡,你可以废除你与其的一个坐骑栏并选择一个类别,然后若“随征”角色存活,你获得其所有此类别的牌,否则你从牌堆中获得两张此类别的牌。然后你将“随征”角色改为另一名角色。", + tw_caoxiu: "TW曹休", + tw_caoxiu_prefix: "TW", + twqianju: "千驹", + twqianju_info: + "锁定技。①你计算与其他角色的距离-X(X为你装备区的牌数)。②每回合限一次。当你对距离为1以内的角色造成伤害后,若你的装备区存在空置装备栏,你从牌堆或弃牌堆中将一张你空置装备栏对应副类别的装备牌置于你的装备区。", + twqingxi: "倾袭", + twqingxi_info: + "当你使用张【杀】指定目标后,若此牌为你于本回合使用的第一张【杀】,你可以令目标角色选择一项:1.令你摸Y张牌,此【杀】不可被其响应(Y为你装备区的牌数且至少为1);2.若其装备区里有牌,弃置装备区里的所有牌,然后弃置你装备区里的等量张牌,令此【杀】对其造成的伤害+1。", + tw_sunyi: "TW孙翊", + tw_sunyi_prefix: "TW", + twzaoli: "躁厉", + twzaoli_info: + "锁定技。①出牌阶段,你只能使用或打出你本回合得到的手牌。②出牌阶段开始时,你须弃置你区域内的所有装备牌并弃置任意张非装备手牌,你摸等量的牌,从牌堆中将你此次弃置的装备牌对应副类别的装备牌置入装备区。若你以此法置入了超过两张装备牌,你失去1点体力。", + tw_yangyi: "TW杨仪", + tw_yangyi_prefix: "TW", + twgongsun: "共损", + twgongsun_shadow: "共损", + twgongsun_info: + "锁定技。出牌阶段开始时,你选择攻击范围内的一名其他角色并选择一种花色,直至你的下个回合开始前或你死亡时,你与其均无法使用、打出或弃置该花色的手牌。", + tw_dengzhi: "TW邓芝", + tw_dengzhi_prefix: "TW", + twjimeng: "急盟", + twjimeng_info: + "出牌阶段限一次。你可以获得一名其他角色区域内的一张牌,然后交给其一张牌。若其体力值不小于你,你摸一张牌。", + xia_lusu: "侠鲁肃", + xia_lusu_prefix: "侠", + twkaizeng: "慨赠", + twkaizeng_info: + "其他角色的出牌阶段限一次。其可以选择一种基本牌的牌名或非基本牌的类型,然后令你选择是否交给其任意张手牌。若你以此法:交给其至少两张牌,你摸一张牌;交给其的牌中包含其选择的牌名或类型的牌,你获得一张与此牌名或类型不同的牌。", + twyangming: "扬名", + twyangming_info: + "出牌阶段结束时,你可以摸X张牌,且令本回合的手牌上限+X(X为你本阶段使用过的牌的类型数)。", + xia_dianwei: "侠典韦", + xia_dianwei_prefix: "侠", + twliexi: "烈袭", + twliexi_info: + "准备阶段,你可以弃置任意张牌并选择一名其他角色。若你以此法弃置的牌数大于其体力值,你对其造成1点伤害;否则其对你造成1点伤害。然后若你弃置的牌中有武器牌,你对其造成1点伤害。", + twshezhong: "慑众", + twshezhong_info: + "结束阶段,若你:本回合对其他角色造成过伤害,你可以令至多X名其他角色下个摸牌阶段的额定摸牌数-1(X为你本回合造成的伤害值);本回合受到过伤害,你可以将手牌摸至与其中一名伤害来源的体力值相同(至多摸至5)。", + xia_zhaoe: "赵娥", + twyanshi: "言誓", + twyanshi_info: + "①游戏开始时,你选择一名其他角色,称为“言誓”角色。②当你或“言誓”角色受到二者之外角色造成的伤害后,伤害来源获得1枚“誓”标记。③你对有“誓”的角色使用牌无距离限制。④当你对有“誓”的角色造成伤害时,此伤害+1,且当你对这些角色造成伤害后,你摸等同于伤害值的牌并移去其所有“誓”。", + twrenchou: "刃仇", + twrenchou_info: + "锁定技。当你或“言誓”角色死亡时,若二者中的另一名角色A存活,A对杀死你或其的角色造成X点伤害(X为A的体力值)。", + xia_xiahouzie: "夏侯紫萼", + twxuechang: "血偿", + twxuechang_info: + "出牌阶段限一次。你可以与一名其他角色拼点。若你:赢,你获得其一张牌,若此牌为装备牌,你视为对其使用一张【杀】;没赢,其对你造成1点伤害,且你下次对其造成的伤害+1。", + twduoren: "夺刃", + twduoren_info: + "①当你杀死角色后,你可以减1点体力上限,然后获得其所有的非主公技和非隐匿技。②当你令其他角色进入濒死状态时,你失去因〖夺刃①〗获得的技能。", + tw_yangang: "严纲", + twzhiqu: "直取", + twzhiqu_info: + "结束阶段,你可以选择一名其他角色并依次使用牌堆顶X张牌中的【杀】。搏击:依次使用牌堆顶X张牌中的锦囊牌(X为你距离不大于1内的角色数,且你或其以外的角色不是你以此法使用牌的合法目标)。", + twxianfeng: "先锋", + twxianfeng_info: + "当你于出牌阶段使用【杀】或伤害类锦囊牌对其他角色造成伤害后,你可以令受伤角色选择一项:1.其摸一张牌,然后直到你下个回合开始时,你至其他角色的距离-1;2.你摸一张牌,然后直到你下个回合开始时,其至你的距离-1。", + tw_gongsunfan: "公孙范", + twhuiyuan: "回援", + twhuiyuan_info: + "当你于出牌阶段使用牌结算结束后,若你未于此阶段获得过此类型的牌,你可以展示一名角色的一张手牌,若此牌与你使用的牌类型相同,你获得此牌,否则你弃置此牌,然后其摸一张牌。游击:对其造成1点伤害。", + twshoushou: "收绶", + twshoushou_info: + "①当你获得其他角色的牌时,若你在任意角色的攻击范围内,其他角色至你的距离+1。②当你造成或受到伤害后,若你不在任意其他角色的攻击范围内,其他角色至你的距离-1。", + twshijun: "师君", + twshijun_info: + "主公技,其他群势力角色出牌阶段限一次,若你没有“米”,其可以摸一张牌,然后将一张牌置于你的武将牌上,称为“米”。", + twjuxiang: "踞襄", + twjuxiang_info: + "主公技,其他群势力角色出牌阶段限一次,其可以选择其装备区的一张牌移动到你的装备区中,若你对应的装备栏已被废除,则改为交给你此装备牌,然后恢复你的对应装备栏。", + tw_ol_sunjian: "TW孙坚", + tw_ol_sunjian_prefix: "TW", + twpolu: "破虏", + twpolu_info: + "主公技,当吴势力角色杀死一名角色或死亡后,你可以令任意名角色各摸X张牌(X为你此前发动过此技能的次数+1)。", + tw_menghuo: "TW孟获", + tw_menghuo_prefix: "TW", + twqiushou: "酋首", + twqiushou_info: + "主公技,锁定技,当一张【南蛮入侵】结算结束后,若此牌造成的伤害大于3点或有角色因此死亡,所有蜀势力和群势力角色各摸一张牌。", + twzhuiting: "坠廷", + twzhuiting_info: + "主公技,当一张锦囊牌即将对你生效时,其他魏势力角色和群势力角色可将一张与此牌颜色相同的牌当作【无懈可击】使用。", + twniju: "逆拒", + twniju_info: + "主公技。当你的拼点牌亮出后,你可以令本次拼点事件中的一张拼点牌的点数+X或-X。然后当本次拼点事件结束后,若有两张拼点牌的点数相等,你摸X张牌(X为场上群势力角色数)。", + ol_liuyu: "TW刘虞", + ol_liuyu_prefix: "TW", + twchongwang: "崇望", + twchongwang_info: + "主公技,其他群势力角色的出牌阶段开始时,其可以交给你一张牌,然后你与其使用【杀】或伤害性锦囊牌指定目标时不能指定对方为目标直至你的下回合结束(每名角色限发动一次)。", + tw_zhangzhao: "张昭", + twlijian: "力荐", + twlijian_info: + "昂扬技。其他角色的弃牌阶段结束时,你可以令其获得任意本阶段进入弃牌堆的牌(可不选),然后你获得其余的牌,若其得到的牌数大于你,你可以对其造成1点伤害。
    激昂:八张牌进入弃牌堆。", + twchungang: "纯刚", + twchungang_info: "锁定技。一名其他角色于摸牌阶段外得到超过一张牌时,你令其弃置一张牌。", + tw_zhanghong: "张纮", + twquanqian: "劝迁", + twquanqian_info: + "昂扬技。出牌阶段限一次,你可以将至多四张花色各不相同的手牌交给一名其他角色,然后若你交出的牌数大于1,则你从牌堆中获得一张装备牌,然后选择一项:①将手牌数摸至与其相同;②观看其手牌并获得其一种花色的所有牌。
    激昂:你弃置六张手牌。", + twrouke: "柔克", + twrouke_info: "锁定技。当你于摸牌阶段外得到超过一张牌时,你摸一张牌。", + kaisa: "凯撒", + zhengfu: "征服", + zhengfu_info: + "当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。", + xia_xiahoudun: "侠夏侯惇", + xia_xiahoudun_prefix: "侠", + twdanlie: "胆烈", + twdanlie_info: + "①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢,你对没赢的角色依次造成1点伤害;若你没赢,你失去1点体力。②你的拼点牌点数+X(X为你已损失的体力值)。", + xia_zhangwei: "张葳", + twhuzhong: "护众", + twhuzhong_info: + "当你于出牌阶段使用无属性【杀】指定唯一目标角色时,你可以摸一张牌并选择一项:①为此牌额外选择一个目标;②弃置其一张手牌,此牌结算完毕后,若此牌造成过伤害,则你摸一张牌且本阶段可以额外使用一张【杀】。", + twfenwang: "焚亡", + twfenwang_info: + "锁定技。①当你受到属性伤害时,你须弃置一张牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于等于其,则此伤害+1。", + xia_xiahousone: "夏侯子萼", + twchengxi: "承袭", + twchengxi_info: + "出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。", + xia_liubei: "侠刘备", + xia_liubei_prefix: "侠", + twshenyi: "伸义", + twshenyi_info: + "每回合限一次,当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌(若没有同名牌则改为同类型的牌)称为“侠义”置于武将牌上。若受伤角色不为你,则你可以将任意张手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。", + twxinghan: "兴汉", + twxinghan_info: + "①你的回合外或你处于濒死状态时,你可以如手牌般使用或打出“侠义”牌。②准备阶段,若“侠义”牌数大于存活角色数,则你可以依次使用其中所有可以使用的牌。然后你获得如下效果:回合结束时,你弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)。", + twxinghan_tag: "侠义", + xia_guanyu: "侠关羽", + xia_guanyu_prefix: "侠", + twzhongyi: "忠义", + twzhongyi_info: + "锁定技。①你使用【杀】无距离限制。②当你使用【杀】结算完毕后,你选择一项:⒈摸X张牌;⒉回复X点体力;⒊背水:失去Y点体力,依次执行以上两项(X为受到此牌造成的伤害的角色数,Y为你本局游戏选择此项的次数)。", + twchue: "除恶", + twchue_info: + "①当你使用【杀】指定唯一目标时,若场上存在可称为此【杀】目标的非目标角色,则你可以失去1点体力,为此牌额外指定Z个目标。②当你受到伤害或失去体力后,你摸一张牌并获得1个“勇”标记。③回合结束时,若你的“勇”标记数大于等于Z,则你可以失去Z个“勇”标记,视为使用一张伤害+1且可以额外指定Z个目标的【杀】。(Z为你的体力值)", + xia_shitao: "石韬", + twjieqiu: "劫囚", + twjieqiu_info: + "出牌阶段限一次,你可以选择一名装备区没有废除栏的其他角色,废除其所有装备栏,然后其摸X张牌(X为其废除装备栏前的装备区牌数),直到其恢复所有装备栏前:其弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。", + twenchou: "恩仇", + twenchou_info: + "出牌阶段限一次,你可以观看一名存在废除装备栏的其他角色的手牌并获得其中一张牌,然后你恢复其一个装备栏。", + xia_shie: "史阿", + twdengjian: "登剑", + twdengjianx: "剑法", + twdengjian_info: + "①其他角色的弃牌阶段结束时,你可以随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。②你使用“剑法”牌不计入次数限制。", + twxinshou: "心授", + twxinshou_info: + "①当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。②当你使用【杀】时,若〖心授①〗的两项本回合均已被你选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。", + xia_yuzhenzi: "玉真子", + twhuajing: "化境", + twhuajing_info: + "①游戏开始时,你获得6个效果各不相同的无效果“武”标记。②一名拥有“武”标记的角色的攻击范围+X(X为其拥有的“武”标记数)。③出牌阶段限一次,你可以展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果。④拥有“武”标记效果的角色的武器牌失效(武器牌不提供攻击范围且武器技能失效)。", + twhuajing_jian: "剑", + twhuajing_jian_info: "当你使用【杀】指定目标后,你随机弃置目标角色两张牌。", + twhuajing_dao: "刀", + twhuajing_dao_info: "当你使用【杀】对没有手牌的目标角色造成伤害时,此伤害+1。", + twhuajing_fu: "斧", + twhuajing_fu_info: "当你使用的【杀】被【闪】响应后,你对目标角色造成1点伤害。", + twhuajing_qiang: "枪", + twhuajing_qiang_info: "当你使用黑色【杀】结算完毕后,你从牌堆或弃牌堆中获得一张【闪】。", + twhuajing_ji: "戟", + twhuajing_ji_info: "当你使用【杀】造成伤害时,你摸一张牌。", + twhuajing_gong: "弓", + twhuajing_gong_info: "当你使用【杀】造成伤害后,你随机弃置受伤角色装备区里的一张牌。", + twtianshou: "天授", + twtianshou_info: + "锁定技,回合结束时,若你本回合使用【杀】造成过伤害,且你拥有本回合获得过效果的“武”标记,则你须将其中一个“武”标记交给一名其他角色并令其获得此标记的效果直到其回合结束,然后你摸两张牌。", + tw_yanliang: "颜良", + tw_wenchou: "文丑", + tw_yuantan: "袁谭", + twduwang: "独往", + twduwang_info: + "使命技。①出牌阶段开始时,你可以选择至多三名有牌的其他角色,摸X张牌(X为选择角色数+1),然后这些角色依次将一张牌当【决斗】对你使用。②当你处于濒死状态时,其他角色不能对你使用【桃】。③使命:使用【决斗】或成为【决斗】目标的次数之和不小于4(若游戏总人数小于4则改为3)。④成功:准备阶段,若你于你的上回合完成了〖独往③〗的使命,则你重置〖独往〗并将〖独往〗修改至只保留〖独往①〗的效果,选择一项:⒈获得〖狭勇〗;⒉重置〖延势〗并令其获得历战效果。⑤失败:当你死亡时,使命失败。", + twylyanshi: "延势", + twylyanshi_info: "限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。", + twylyanshix: "延势·改", + twylyanshix_info: + "限定技。你可以将一张【杀】当作【决斗】、【兵临城下】或任意智囊牌使用或打出。历战:重置〖延势〗。", + twjuexing: "绝行", + twjuexing_info: + "出牌阶段限一次。你可以视为对一名其他角色使用一张【决斗】。此牌对一名角色生效时,你与其将所有手牌扣置于武将牌上,然后各摸等同于当前体力值的牌。此牌结算结束后,你与所有目标角色弃置本次以此法摸的牌,然后获得扣置于武将牌上的牌。历战:当你因〖绝行〗摸牌时,摸牌数+1。", + twxiayong: "狭勇", + twxiayong1: "狭勇", + twxiayong2: "狭勇", + twxiayong_info: + "锁定技。当你使用的【决斗】或目标角色包括你的【决斗】造成伤害时,若受伤角色为你,则你随机弃置一张手牌;否则你令此伤害+1。", + twqiaosi: "峭嗣", + twqiaosi_info: + "结束阶段,你可以获得由其他角色区域直接置入或经由处理区置入弃牌堆的所有牌,然后若你以此法获得的牌数小于你的体力值,则你失去1点体力。", + twbaizu: "败族", + twbaizu_info: + "锁定技。结束阶段,若你已受伤且你有手牌,则你须选择X名有手牌的其他角色(X为你的体力值),你与这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的所有其他角色各造成1点伤害。历战:〖败族〗目标选择数+1。", - tw_mobile:'海外服·稀有专属', - tw_yunchouzhi:'运筹帷幄·智', - tw_yunchouxin:'运筹帷幄·信', - tw_yunchouren:'运筹帷幄·仁', - tw_yunchouyong:'运筹帷幄·勇', - tw_yunchouyan:'运筹帷幄·严', - tw_zhu:'海外服·主公', - tw_sp:'海外服·SP', - tw_swordsman:'海外服·武侠篇', - tw_mobile2:'海外服·异构', - tw_yijiang:'一将成名TW', - tw_english:'英文版', + tw_mobile: "海外服·稀有专属", + tw_yunchouzhi: "运筹帷幄·智", + tw_yunchouxin: "运筹帷幄·信", + tw_yunchouren: "运筹帷幄·仁", + tw_yunchouyong: "运筹帷幄·勇", + tw_yunchouyan: "运筹帷幄·严", + tw_zhu: "海外服·主公", + tw_sp: "海外服·SP", + tw_swordsman: "海外服·武侠篇", + tw_mobile2: "海外服·异构", + tw_yijiang: "一将成名TW", + tw_english: "英文版", + }, + pinyins: { + 凯撒: ["Caesar"], + 难升米: ["Nashime"], }, - pinyins:{ - 凯撒:['Caesar'], - 难升米:['Nashime'] - } }; }); diff --git a/character/xiake.js b/character/xiake.js index 5436d1a3a..ed4caee9f 100644 --- a/character/xiake.js +++ b/character/xiake.js @@ -1,118 +1,123 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { - return { - name:'xiake', - character:{ - // xk_dongfangweiming:['male','shu',4,[]], - xk_guyuexuan:['male','qun',4,['rouquan','gzhenji']], - xk_jinji:['male','shu',4,['zhongzhan','lianpo']], - // xk_shenxiangyun:['female','wei',3,['zhenjiu']], - xk_fujianhan:['male','qun',4,['zuijian','zitong']], - }, - skill:{ - zhongzhan:{ - trigger:{source:'damageBegin'}, - logTarget:'player', - check:function(event,player){ - if(get.damageEffect(event.player,player,player)>0&& - get.attitude(player,event.player)<0){ - return player.hp>event.player.hp&&player.hp>=2; - } - return false; - }, - content:function(){ - player.loseHp(); - trigger.num++; - } - }, - rouquan:{ - mod:{ - selectTarget:function(card,player,range){ - if(card.name=='sha'&&!player.getEquip(1)&&range[1]!=-1) range[1]=Infinity; - } - }, - enable:'phaseUse', - position:'e', - filter:function(event,player){ - return player.hasCard(card=>lib.skill.rouquan.filterCard(card,player),lib.skill.rouquan.position); - }, - filterCard:lib.filter.cardRecastable, - prompt:'将要重铸的牌置入弃牌堆并摸一张牌', - discard:false, - lose:false, - delay:false, - check:function(card,player){ - var val=get.equipValue(card); - var player=_status.event.player; - var cards=player.getCards('h',{subtype:get.subtype(card)}); - for(var i=0;i=val){ - return 1; - } - } - return 0; - }, - content:function(){ - player.recast(cards); - }, - ai:{ - order:9.5, - result:{ - player:1 - } - } - }, - gzhenji:{ - trigger:{source:'damageEnd'}, - frequent:true, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return _status.currentPhase==player&&event.card&&event.card.name=='sha'; - }, - content:function(){ - player.draw(); - player.addTempSkill('gzhenji3'); - } - }, - gzhenji3:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; - } - }, - }, - zitong:{ - trigger:{player:'useCard'}, - frequent:true, - filter:function(event,player){ - return _status.currentPhase==player&&player.countUsed()==3; - }, - content:function(){ - var card=get.cardPile('chuansongmen'); - if(!card){ - card=game.createCard('chuansongmen'); - } - player.gain(card,'gain2'); - }, - ai:{ - threaten:1.2 - } - } - }, - translate:{ - xk_dongfangweiming:'东方未明', - xk_guyuexuan:'谷月轩', - xk_jinji:'荆棘', - xk_shenxiangyun:'沈湘芸', - xk_fujianhan:'傅剑寒', - zhongzhan:'重斩', - zhongzhan_info:'每当你即将造成伤害,你可失去1点体力令伤害+1。', - gzhenji:'震击', - gzhenji_info:'你使用杀造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张杀。', - rouquan:'柔拳', - rouquan_info:'你可以重铸装备区内的牌;当你没有武器牌时,你的杀可以指定任意个目标。', - zitong:'通悟', - zitong_info:'当你于自己的回合内使用第三张牌时,你可以将一张传送门置于你的手牌。', - }, - }; -}); +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { + return { + name: "xiake", + character: { + // xk_dongfangweiming:['male','shu',4,[]], + xk_guyuexuan: ["male", "qun", 4, ["rouquan", "gzhenji"]], + xk_jinji: ["male", "shu", 4, ["zhongzhan", "lianpo"]], + // xk_shenxiangyun:['female','wei',3,['zhenjiu']], + xk_fujianhan: ["male", "qun", 4, ["zuijian", "zitong"]], + }, + skill: { + zhongzhan: { + trigger: { source: "damageBegin" }, + logTarget: "player", + check: function (event, player) { + if ( + get.damageEffect(event.player, player, player) > 0 && + get.attitude(player, event.player) < 0 + ) { + return player.hp > event.player.hp && player.hp >= 2; + } + return false; + }, + content: function () { + player.loseHp(); + trigger.num++; + }, + }, + rouquan: { + mod: { + selectTarget: function (card, player, range) { + if (card.name == "sha" && !player.getEquip(1) && range[1] != -1) range[1] = Infinity; + }, + }, + enable: "phaseUse", + position: "e", + filter: function (event, player) { + return player.hasCard( + (card) => lib.skill.rouquan.filterCard(card, player), + lib.skill.rouquan.position + ); + }, + filterCard: lib.filter.cardRecastable, + prompt: "将要重铸的牌置入弃牌堆并摸一张牌", + discard: false, + lose: false, + delay: false, + check: function (card, player) { + var val = get.equipValue(card); + var player = _status.event.player; + var cards = player.getCards("h", { subtype: get.subtype(card) }); + for (var i = 0; i < cards.length; i++) { + if (get.equipValue(cards[i]) >= val) { + return 1; + } + } + return 0; + }, + content: function () { + player.recast(cards); + }, + ai: { + order: 9.5, + result: { + player: 1, + }, + }, + }, + gzhenji: { + trigger: { source: "damageEnd" }, + frequent: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return _status.currentPhase == player && event.card && event.card.name == "sha"; + }, + content: function () { + player.draw(); + player.addTempSkill("gzhenji3"); + }, + }, + gzhenji3: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + zitong: { + trigger: { player: "useCard" }, + frequent: true, + filter: function (event, player) { + return _status.currentPhase == player && player.countUsed() == 3; + }, + content: function () { + var card = get.cardPile("chuansongmen"); + if (!card) { + card = game.createCard("chuansongmen"); + } + player.gain(card, "gain2"); + }, + ai: { + threaten: 1.2, + }, + }, + }, + translate: { + xk_dongfangweiming: "东方未明", + xk_guyuexuan: "谷月轩", + xk_jinji: "荆棘", + xk_shenxiangyun: "沈湘芸", + xk_fujianhan: "傅剑寒", + zhongzhan: "重斩", + zhongzhan_info: "每当你即将造成伤害,你可失去1点体力令伤害+1。", + gzhenji: "震击", + gzhenji_info: "你使用杀造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张杀。", + rouquan: "柔拳", + rouquan_info: "你可以重铸装备区内的牌;当你没有武器牌时,你的杀可以指定任意个目标。", + zitong: "通悟", + zitong_info: "当你于自己的回合内使用第三张牌时,你可以将一张传送门置于你的手牌。", + }, + }; +}); diff --git a/character/xianding.js b/character/xianding.js index da39fdd76..9a8b10968 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -1,447 +1,583 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'xianding', - connect:true, - character:{ - sp_zhenji:['female','qun',3,['dcjijie','dchuiji']], - wu_guanyu:['male','shu',5,['dcjuewu','dcwuyou','dcyixian']], - caofang:['male','wei',4,['dczhimin','dcjujian'],['zhu']], - dc_sb_simayi:['male','wei',3,['dcsbquanmou','dcsbpingliao']], - chendong:['male','wu',4,['dcduanxie','fenming']], - lvfan:['male','wu',3,['diaodu','diancai']], - cuimao:['male','wei',3,['zhengbi','fengying']], - huzun:['male','wei',4,['dczhantao','dcanjing']], - zhugemengxue:['female','wei',3,['dcjichun','dchanying']], - bailingyun:['female','wei',3,['dclinghui','dcxiace','dcyuxin']], - dc_qinghegongzhu:['female','wei',3,['dczhangji','dczengou']], - caoxian:['female','wei',3,['dclingxi','dczhifou']], - dc_sb_zhouyu:['male','wu',4,['dcsbronghuo','dcsbyingmou']], - dc_sb_lusu:['male','wu',3,['dcsbmingshi','dcsbmengmou']], - zhangjian:['male','qun',105,['dc_zj_a','dc_zj_b'],['unseen']], - zhugeruoxue:['female','wei',3,['dcqiongying','dcnuanhui']], - caoyi:['female','wei',4,['dcmiyi','dcyinjun']], - malingli:['female','shu',3,['dclima','dcxiaoyin','dchuahuo']], - wu_luxun:['male','wu',3,['dcxiongmu','dczhangcai','dcruxian']], - dc_xujing:['male','shu',3,['dcshangyu','dccaixia']], - dc_zhaoxiang:['female','shu',4,['refanghun','refuhan']], - dc_guansuo:['male','shu',4,['xinzhengnan','xiefang']], - xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']], - dc_shixie:['male','qun',3,['rebiluan','ollixia']], - dc_sp_machao:['male','qun',4,['zhuiji','dc_olshichou']], - old_huangfusong:['male','qun',4,['xinfenyue']], - dc_xiahouba:['male','shu',4,['rebaobian']], - dc_daxiaoqiao:['female','wu',3,['dcxingwu','dcluoyan'],['tempname:daxiaoqiao']], - tianshangyi:['female','wei',3,['dcposuo','dcxiaoren']], - sunlingluan:['female','wu',3,['dclingyue','dcpandi']], - dc_wangjun:['male','qun',4,['dctongye','dcchangqu']], - zhoubuyi:['male','wei',3,['dcshiji','dcsilun']], - dc_duyu:['male','wei',4,['dcjianguo','dcdyqingshi']], - ganfurenmifuren:['female','shu',3,['dcchanjuan','dcxunbie']], - dc_ganfuren:['female','shu',3,['dcshushen','dcshenzhi']], - dc_mifuren:['female','shu',3,['dcguixiu','dccunsi']], - wanglang:['male','wei',3,['regushe','rejici']], - ruanji:['male','wei',3,['dczhaowen','dcjiudun']], - wu_zhugeliang:['male','shu','4/7',['dcjincui','dcqingshi','dczhizhe']], - duanqiaoxiao:['female','wei',3,['dccaizhuang','dchuayi']], - zhangjinyun:['female','shu',3,['dchuizhi','dcjijiao']], - huanfan:['male','wei',3,['dcjianzheng','dcfumou']], - chentai:['male','wei',4,['dcctjiuxian','dcchenyong']], - sunyu:['male','wu',3,['dcquanshou','dcshexue']], - xizheng:['male','shu',3,['dcdanyi','dcwencan']], - dc_ruiji:['female','wu',4,['dcwangyuan','dclingyin','dcliying']], - zerong:['male','qun',4,['dccansi','dcfozong']], - xielingyu:['female','wu',3,['dcyuandi','dcxinyou']], - dc_yangbiao:['male','qun',3,['dczhaohan','dcjinjie','dcjue']], - dc_tengfanglan:['female','wu',3,['dcluochong','dcaichen']], - yanghong:['male','qun',3,['dcjianji','dcyuanmo']], - xuelingyun:['female','wei',3,['dcxialei','dcanzhi']], - dc_wangyun:['male','qun',4,['dclianji','dcmoucheng'],['clan:太原王氏']], - dc_zhouxuān:['male','wei',3,['dcwumei','dczhanmeng']], - chengbing:['male','wu',3,['dcjingzao','dcenyu']], - dongguiren:['female','qun',3,['dclianzhi','dclingfang','dcfengying']], - yuanji:['female','wu',3,['dcfangdu','dcjiexing']], - zhujianping:['male','qun',3,['dcxiangmian','dctianji']], - zhaozhi:['male','shu',3,['dctongguan','dcmengjie']], - dc_liuye:['male','wei',3,['dcpoyuan','dchuace']], - luyi:['female','qun',3,['dcyaoyi','dcfuxue']], - dingshangwan:['female','wei',3,['dcfengyan','dcfudao']], - quanhuijie:['female','wu',3,['dchuishu','dcyishu','dcligong']], - dukui:['male','wei',3,['dcfanyin','dcpeiqi']], - zhangfen:['male','wu',4,['dcwanglu','dcxianzhu','dcchaixie']], - liuhui:['male','qun',4,['dcgeyuan','dcjieshu','dcgusuan']], - dc_wangchang:['male','wei',3,['dckaiji','dcpingxi'],['clan:太原王氏']], - zhaoang:['male','wei','3/4',['dczhongjie','dcsushou']], - caohua:['female','wei',3,['caiyi','guili']], - dc_liuyu:['male','qun',3,['dcsuifu','dcpijing']], - dc_huangzu:['male','qun',4,['dcjinggong','dcxiaojuan']], - laiyinger:['female','qun',3,['xiaowu','huaping']], - caomao:['male','wei','3/4',['qianlong','fensi','juetao','zhushi'],['zhu']], - dc_luotong:['male','wu',3,['renzheng','jinjian']], - re_fengfangnv:['female','qun',3,['tiqi','baoshu']], - wufan:['male','wu',4,['tianyun','wfyuyan']], - re_zhangbao:['male','qun',3,['xinzhoufu','xinyingbing']], - re_sunyi:['male','wu',5,['syjiqiao','syxiongyi']], - caojinyu:['female','wei',3,['yuqi','shanshen','xianjing']], - zhouyi:['female','wu',3,['zhukou','mengqing']], - re_panshu:['female','wu',3,['zhiren','yaner']], - yangwan:['female','shu',3,['youyan','zhuihuan']], - ruanyu:['male','wei',3,['xingzuo','miaoxian']], - fanyufeng:['female','qun',3,['bazhan','jiaoying']], - guozhao:['female','wei',3,['pianchong','zunwei']], - re_xinxianying:['female','wei',3,['rezhongjian','recaishi']], - liubian:['male','qun',3,['shiyuan','dushi','yuwei'],['zhu']], - re_liuzan:['male','wu',4,['refenyin','liji']], - wenyang:['male','wei',5,['xinlvli','choujue']], - wangshuang:['male','wei',8,['spzhuilie']], - huaman:['female','shu',3,['manyi','mansi','souying','zhanyuan']], - puyuan:['male','shu',4,['pytianjiang','pyzhuren']], - guanlu:['male','wei',3,['tuiyan','busuan','mingjie']], - gexuan:['male','wu',3,['gxlianhua','zhafu']], - leitong:['male','shu',4,['kuiji']], - wulan:['male','shu',4,['wlcuorui']], + name: "xianding", + connect: true, + character: { + sp_zhenji: ["female", "qun", 3, ["dcjijie", "dchuiji"]], + wu_guanyu: ["male", "shu", 5, ["dcjuewu", "dcwuyou", "dcyixian"]], + caofang: ["male", "wei", 4, ["dczhimin", "dcjujian"], ["zhu"]], + dc_sb_simayi: ["male", "wei", 3, ["dcsbquanmou", "dcsbpingliao"]], + chendong: ["male", "wu", 4, ["dcduanxie", "fenming"]], + lvfan: ["male", "wu", 3, ["diaodu", "diancai"]], + cuimao: ["male", "wei", 3, ["zhengbi", "fengying"]], + huzun: ["male", "wei", 4, ["dczhantao", "dcanjing"]], + zhugemengxue: ["female", "wei", 3, ["dcjichun", "dchanying"]], + bailingyun: ["female", "wei", 3, ["dclinghui", "dcxiace", "dcyuxin"]], + dc_qinghegongzhu: ["female", "wei", 3, ["dczhangji", "dczengou"]], + caoxian: ["female", "wei", 3, ["dclingxi", "dczhifou"]], + dc_sb_zhouyu: ["male", "wu", 4, ["dcsbronghuo", "dcsbyingmou"]], + dc_sb_lusu: ["male", "wu", 3, ["dcsbmingshi", "dcsbmengmou"]], + zhangjian: ["male", "qun", 105, ["dc_zj_a", "dc_zj_b"], ["unseen"]], + zhugeruoxue: ["female", "wei", 3, ["dcqiongying", "dcnuanhui"]], + caoyi: ["female", "wei", 4, ["dcmiyi", "dcyinjun"]], + malingli: ["female", "shu", 3, ["dclima", "dcxiaoyin", "dchuahuo"]], + wu_luxun: ["male", "wu", 3, ["dcxiongmu", "dczhangcai", "dcruxian"]], + dc_xujing: ["male", "shu", 3, ["dcshangyu", "dccaixia"]], + dc_zhaoxiang: ["female", "shu", 4, ["refanghun", "refuhan"]], + dc_guansuo: ["male", "shu", 4, ["xinzhengnan", "xiefang"]], + xin_baosanniang: ["female", "shu", 3, ["decadewuniang", "decadexushen"]], + dc_shixie: ["male", "qun", 3, ["rebiluan", "ollixia"]], + dc_sp_machao: ["male", "qun", 4, ["zhuiji", "dc_olshichou"]], + old_huangfusong: ["male", "qun", 4, ["xinfenyue"]], + dc_xiahouba: ["male", "shu", 4, ["rebaobian"]], + dc_daxiaoqiao: ["female", "wu", 3, ["dcxingwu", "dcluoyan"], ["tempname:daxiaoqiao"]], + tianshangyi: ["female", "wei", 3, ["dcposuo", "dcxiaoren"]], + sunlingluan: ["female", "wu", 3, ["dclingyue", "dcpandi"]], + dc_wangjun: ["male", "qun", 4, ["dctongye", "dcchangqu"]], + zhoubuyi: ["male", "wei", 3, ["dcshiji", "dcsilun"]], + dc_duyu: ["male", "wei", 4, ["dcjianguo", "dcdyqingshi"]], + ganfurenmifuren: ["female", "shu", 3, ["dcchanjuan", "dcxunbie"]], + dc_ganfuren: ["female", "shu", 3, ["dcshushen", "dcshenzhi"]], + dc_mifuren: ["female", "shu", 3, ["dcguixiu", "dccunsi"]], + wanglang: ["male", "wei", 3, ["regushe", "rejici"]], + ruanji: ["male", "wei", 3, ["dczhaowen", "dcjiudun"]], + wu_zhugeliang: ["male", "shu", "4/7", ["dcjincui", "dcqingshi", "dczhizhe"]], + duanqiaoxiao: ["female", "wei", 3, ["dccaizhuang", "dchuayi"]], + zhangjinyun: ["female", "shu", 3, ["dchuizhi", "dcjijiao"]], + huanfan: ["male", "wei", 3, ["dcjianzheng", "dcfumou"]], + chentai: ["male", "wei", 4, ["dcctjiuxian", "dcchenyong"]], + sunyu: ["male", "wu", 3, ["dcquanshou", "dcshexue"]], + xizheng: ["male", "shu", 3, ["dcdanyi", "dcwencan"]], + dc_ruiji: ["female", "wu", 4, ["dcwangyuan", "dclingyin", "dcliying"]], + zerong: ["male", "qun", 4, ["dccansi", "dcfozong"]], + xielingyu: ["female", "wu", 3, ["dcyuandi", "dcxinyou"]], + dc_yangbiao: ["male", "qun", 3, ["dczhaohan", "dcjinjie", "dcjue"]], + dc_tengfanglan: ["female", "wu", 3, ["dcluochong", "dcaichen"]], + yanghong: ["male", "qun", 3, ["dcjianji", "dcyuanmo"]], + xuelingyun: ["female", "wei", 3, ["dcxialei", "dcanzhi"]], + dc_wangyun: ["male", "qun", 4, ["dclianji", "dcmoucheng"], ["clan:太原王氏"]], + dc_zhouxuān: ["male", "wei", 3, ["dcwumei", "dczhanmeng"]], + chengbing: ["male", "wu", 3, ["dcjingzao", "dcenyu"]], + dongguiren: ["female", "qun", 3, ["dclianzhi", "dclingfang", "dcfengying"]], + yuanji: ["female", "wu", 3, ["dcfangdu", "dcjiexing"]], + zhujianping: ["male", "qun", 3, ["dcxiangmian", "dctianji"]], + zhaozhi: ["male", "shu", 3, ["dctongguan", "dcmengjie"]], + dc_liuye: ["male", "wei", 3, ["dcpoyuan", "dchuace"]], + luyi: ["female", "qun", 3, ["dcyaoyi", "dcfuxue"]], + dingshangwan: ["female", "wei", 3, ["dcfengyan", "dcfudao"]], + quanhuijie: ["female", "wu", 3, ["dchuishu", "dcyishu", "dcligong"]], + dukui: ["male", "wei", 3, ["dcfanyin", "dcpeiqi"]], + zhangfen: ["male", "wu", 4, ["dcwanglu", "dcxianzhu", "dcchaixie"]], + liuhui: ["male", "qun", 4, ["dcgeyuan", "dcjieshu", "dcgusuan"]], + dc_wangchang: ["male", "wei", 3, ["dckaiji", "dcpingxi"], ["clan:太原王氏"]], + zhaoang: ["male", "wei", "3/4", ["dczhongjie", "dcsushou"]], + caohua: ["female", "wei", 3, ["caiyi", "guili"]], + dc_liuyu: ["male", "qun", 3, ["dcsuifu", "dcpijing"]], + dc_huangzu: ["male", "qun", 4, ["dcjinggong", "dcxiaojuan"]], + laiyinger: ["female", "qun", 3, ["xiaowu", "huaping"]], + caomao: ["male", "wei", "3/4", ["qianlong", "fensi", "juetao", "zhushi"], ["zhu"]], + dc_luotong: ["male", "wu", 3, ["renzheng", "jinjian"]], + re_fengfangnv: ["female", "qun", 3, ["tiqi", "baoshu"]], + wufan: ["male", "wu", 4, ["tianyun", "wfyuyan"]], + re_zhangbao: ["male", "qun", 3, ["xinzhoufu", "xinyingbing"]], + re_sunyi: ["male", "wu", 5, ["syjiqiao", "syxiongyi"]], + caojinyu: ["female", "wei", 3, ["yuqi", "shanshen", "xianjing"]], + zhouyi: ["female", "wu", 3, ["zhukou", "mengqing"]], + re_panshu: ["female", "wu", 3, ["zhiren", "yaner"]], + yangwan: ["female", "shu", 3, ["youyan", "zhuihuan"]], + ruanyu: ["male", "wei", 3, ["xingzuo", "miaoxian"]], + fanyufeng: ["female", "qun", 3, ["bazhan", "jiaoying"]], + guozhao: ["female", "wei", 3, ["pianchong", "zunwei"]], + re_xinxianying: ["female", "wei", 3, ["rezhongjian", "recaishi"]], + liubian: ["male", "qun", 3, ["shiyuan", "dushi", "yuwei"], ["zhu"]], + re_liuzan: ["male", "wu", 4, ["refenyin", "liji"]], + wenyang: ["male", "wei", 5, ["xinlvli", "choujue"]], + wangshuang: ["male", "wei", 8, ["spzhuilie"]], + huaman: ["female", "shu", 3, ["manyi", "mansi", "souying", "zhanyuan"]], + puyuan: ["male", "shu", 4, ["pytianjiang", "pyzhuren"]], + guanlu: ["male", "wei", 3, ["tuiyan", "busuan", "mingjie"]], + gexuan: ["male", "wu", 3, ["gxlianhua", "zhafu"]], + leitong: ["male", "shu", 4, ["kuiji"]], + wulan: ["male", "shu", 4, ["wlcuorui"]], }, - characterSort:{ - xianding:{ - sp2_huben:['chendong','wangshuang','wenyang','re_liuzan','dc_huangzu','wulan','leitong','chentai','dc_duyu','dc_wangjun','dc_xiahouba','old_huangfusong','huzun'], - sp2_shengun:["puyuan","guanlu","gexuan",'wufan','re_zhangbao','dukui','zhaozhi','zhujianping','dc_zhouxuān','zerong'], - sp2_bizhe:['dc_luotong','dc_wangchang','chengbing','dc_yangbiao','ruanji','cuimao'], - sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu','sunyu','ganfurenmifuren','dc_ganfuren','dc_mifuren','dc_shixie','caofang'], - sp2_zhangtai:['guozhao','fanyufeng','ruanyu','yangwan','re_panshu'], - sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen','zhugeruoxue','caoxian','dc_qinghegongzhu','zhugemengxue'], - sp2_yinyu:['zhouyi','luyi','sunlingluan','caoyi'], - sp2_wangzhe:['dc_daxiaoqiao','dc_sp_machao','sp_zhenji'], - sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi','malingli','bailingyun'], - sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng','lvfan'], - sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'], - sp2_qifu:['dc_guansuo','xin_baosanniang','dc_zhaoxiang'], - sp2_gaoshan:['wanglang','liuhui','zhangjian'], - sp2_wumiao:['wu_zhugeliang','wu_luxun','wu_guanyu'], - sp2_mouding:['dc_sb_lusu','dc_sb_zhouyu','dc_sb_simayi'], - } + characterSort: { + xianding: { + sp2_huben: [ + "chendong", + "wangshuang", + "wenyang", + "re_liuzan", + "dc_huangzu", + "wulan", + "leitong", + "chentai", + "dc_duyu", + "dc_wangjun", + "dc_xiahouba", + "old_huangfusong", + "huzun", + ], + sp2_shengun: [ + "puyuan", + "guanlu", + "gexuan", + "wufan", + "re_zhangbao", + "dukui", + "zhaozhi", + "zhujianping", + "dc_zhouxuān", + "zerong", + ], + sp2_bizhe: ["dc_luotong", "dc_wangchang", "chengbing", "dc_yangbiao", "ruanji", "cuimao"], + sp2_huangjia: [ + "caomao", + "liubian", + "dc_liuyu", + "quanhuijie", + "dingshangwan", + "yuanji", + "xielingyu", + "sunyu", + "ganfurenmifuren", + "dc_ganfuren", + "dc_mifuren", + "dc_shixie", + "caofang", + ], + sp2_zhangtai: ["guozhao", "fanyufeng", "ruanyu", "yangwan", "re_panshu"], + sp2_jinse: [ + "caojinyu", + "re_sunyi", + "re_fengfangnv", + "caohua", + "laiyinger", + "zhangfen", + "zhugeruoxue", + "caoxian", + "dc_qinghegongzhu", + "zhugemengxue", + ], + sp2_yinyu: ["zhouyi", "luyi", "sunlingluan", "caoyi"], + sp2_wangzhe: ["dc_daxiaoqiao", "dc_sp_machao", "sp_zhenji"], + sp2_doukou: [ + "re_xinxianying", + "huaman", + "xuelingyun", + "dc_ruiji", + "duanqiaoxiao", + "tianshangyi", + "malingli", + "bailingyun", + ], + sp2_jichu: ["zhaoang", "dc_liuye", "dc_wangyun", "yanghong", "huanfan", "xizheng", "lvfan"], + sp2_yuxiu: ["dongguiren", "dc_tengfanglan", "zhangjinyun", "zhoubuyi", "dc_xujing"], + sp2_qifu: ["dc_guansuo", "xin_baosanniang", "dc_zhaoxiang"], + sp2_gaoshan: ["wanglang", "liuhui", "zhangjian"], + sp2_wumiao: ["wu_zhugeliang", "wu_luxun", "wu_guanyu"], + sp2_mouding: ["dc_sb_lusu", "dc_sb_zhouyu", "dc_sb_simayi"], + }, }, - characterSubstitute:{ - dc_sb_simayi:[ - ], + characterSubstitute: { + dc_sb_simayi: [], }, - skill:{ + skill: { //武关羽 - dcjuewu:{ - audio:2, - enable:'chooseToUse', - filter(event,player){ - if(!player.hasCard(card=>{ - return _status.connectMode||get.number(card)===2; - },'hes')) return false; - for(const name of ['shuiyanqijuny'].concat(lib.inpile)){ - if(player.getStorage('dcjuewu_used').includes(name)) continue; - const card=get.autoViewAs({name},'unsure'); - if(!get.tag(card,'damage')) continue; - if(event.filterCard(card,player,event)) return true; - if(name==='sha'){ - for(const nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) return true; + dcjuewu: { + audio: 2, + enable: "chooseToUse", + filter(event, player) { + if ( + !player.hasCard((card) => { + return _status.connectMode || get.number(card) === 2; + }, "hes") + ) + return false; + for (const name of ["shuiyanqijuny"].concat(lib.inpile)) { + if (player.getStorage("dcjuewu_used").includes(name)) continue; + const card = get.autoViewAs({ name }, "unsure"); + if (!get.tag(card, "damage")) continue; + if (event.filterCard(card, player, event)) return true; + if (name === "sha") { + for (const nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; } } } return false; }, - hiddenCard(player,name){ - if(!lib.inpile.includes(name)) return false; - if(player.getStorage('dcjuewu_used').includes(name)) return false; - if(!player.hasCard(card=>{ - return _status.connectMode||get.number(card)===2; - },'hes')) return false; - return get.tag({name},'damage'); + hiddenCard(player, name) { + if (!lib.inpile.includes(name)) return false; + if (player.getStorage("dcjuewu_used").includes(name)) return false; + if ( + !player.hasCard((card) => { + return _status.connectMode || get.number(card) === 2; + }, "hes") + ) + return false; + return get.tag({ name }, "damage"); }, - group:'dcjuewu_inTwo', - chooseButton:{ - dialog(event,player){ - let list=get.inpileVCardList(info=>{ - return get.tag({name:info[2]},'damage'); + group: "dcjuewu_inTwo", + chooseButton: { + dialog(event, player) { + let list = get.inpileVCardList((info) => { + return get.tag({ name: info[2] }, "damage"); }); - if(!list.some(info=>info[2]==='shuiyanqijuny')) list.add(['锦囊','','shuiyanqijuny']); - list=list.filter(info=>{ - const name=info[2],nature=info[3]; - if(player.getStorage('dcjuewu_used').includes(name)) return false; - const card=get.autoViewAs({name,nature},'unsure'); - return event.filterCard(card,player,event); + if (!list.some((info) => info[2] === "shuiyanqijuny")) + list.add(["锦囊", "", "shuiyanqijuny"]); + list = list.filter((info) => { + const name = info[2], + nature = info[3]; + if (player.getStorage("dcjuewu_used").includes(name)) return false; + const card = get.autoViewAs({ name, nature }, "unsure"); + return event.filterCard(card, player, event); }); - return ui.create.dialog('绝武',[list,'vcard']); + return ui.create.dialog("绝武", [list, "vcard"]); }, - check(button){ - if(get.event().getParent().type!='phase') return 1; - const player=get.player(); + check(button) { + if (get.event().getParent().type != "phase") return 1; + const player = get.player(); return player.getUseValue({ - name:button.link[2], - nature:button.link[3], + name: button.link[2], + nature: button.link[3], }); }, - backup(links,player){ + backup(links, player) { return { - audio:'dcjuewu', - filterCard(card,player){ - return get.number(card)===2; + audio: "dcjuewu", + filterCard(card, player) { + return get.number(card) === 2; }, - position:'hes', - check(card){ - return 8-get.value(card); + position: "hes", + check(card) { + return 8 - get.value(card); }, - popname:true, - viewAs:{ - name:links[0][2], - nature:links[0][3] + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], }, - precontent(){ - if (!player.storage.dcjuewu_used){ - player.when({global:'phaseAfter'}).then(() => { + precontent() { + if (!player.storage.dcjuewu_used) { + player.when({ global: "phaseAfter" }).then(() => { delete player.storage.dcjuewu_used; }); } - player.markAuto('dcjuewu_used', event.result.card.name); + player.markAuto("dcjuewu_used", event.result.card.name); }, - } + }; + }, + prompt(links, player) { + return ( + "将一张点数为2的牌当" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - prompt(links,player){ - return '将一张点数为2的牌当'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; - } }, - subSkill:{ - backup:{}, - inTwo:{ - audio:'dcjuewu', - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + subSkill: { + backup: {}, + inTwo: { + audio: "dcjuewu", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - filter(event,player){ - const cards=event.getg(player); - if(!cards.length) return false; - return game.hasPlayer(current=>{ - if(current===player) return false; - const evt=event.getl(current); - return evt&&evt.hs.length+evt.es.length+evt.js.length>0; + filter(event, player) { + const cards = event.getg(player); + if (!cards.length) return false; + return game.hasPlayer((current) => { + if (current === player) return false; + const evt = event.getl(current); + return evt && evt.hs.length + evt.es.length + evt.js.length > 0; }); }, - forced:true, - locked:false, - async content(event,trigger,player){ - player.addGaintag(trigger.getg(player),'dcjuewu_two'); - player.addSkill('dcjuewu_two'); + forced: true, + locked: false, + async content(event, trigger, player) { + player.addGaintag(trigger.getg(player), "dcjuewu_two"); + player.addSkill("dcjuewu_two"); }, }, - two:{ - charlotte:true, - mod:{ - cardnumber(card){ - if(card.hasGaintag('dcjuewu_two')) return 2; + two: { + charlotte: true, + mod: { + cardnumber(card) { + if (card.hasGaintag("dcjuewu_two")) return 2; }, }, }, }, - ai:{ - fireAttack:true, - respondSha:true, - skillTagFilter(player){ - if(!player.hasCard(card=>{ - return _status.connectMode||get.number(card)===2; - },'hes')) return false; + ai: { + fireAttack: true, + respondSha: true, + skillTagFilter(player) { + if ( + !player.hasCard((card) => { + return _status.connectMode || get.number(card) === 2; + }, "hes") + ) + return false; }, - order:1, - result:{ - player(player){ - if(get.event('dying')) return get.attitude(player,get.event('dying')); + order: 1, + result: { + player(player) { + if (get.event("dying")) return get.attitude(player, get.event("dying")); return 1; }, }, }, }, - dcwuyou:{ - audio:2, - global:'dcwuyou_g', - subSkill:{ - g:{ - audio:'dcwuyou', - enable:'phaseUse', - usable:1, - filter(event,player){ - if(!player.countCards('h')) return false; - return game.hasPlayer(current=>{ - return current.hasSkill('dcwuyou'); + dcwuyou: { + audio: 2, + global: "dcwuyou_g", + subSkill: { + g: { + audio: "dcwuyou", + enable: "phaseUse", + usable: 1, + filter(event, player) { + if (!player.countCards("h")) return false; + return game.hasPlayer((current) => { + return current.hasSkill("dcwuyou"); }); }, - filterCard:true, - filterTarget(card,player,target){ - return target.hasSkill('dcwuyou'); + filterCard: true, + filterTarget(card, player, target) { + return target.hasSkill("dcwuyou"); }, - selectTarget(){ - const count=game.countPlayer(current=>{ - return current.hasSkill('dcwuyou'); + selectTarget() { + const count = game.countPlayer((current) => { + return current.hasSkill("dcwuyou"); }); - return count>1?1:-1; + return count > 1 ? 1 : -1; }, - check(card){ - const player=get.player(); - const hasFriend=game.hasPlayer(current=>{ - return current.hasSkill('dcwuyou')&&get.attitude(player,current)>0; + check(card) { + const player = get.player(); + const hasFriend = game.hasPlayer((current) => { + return current.hasSkill("dcwuyou") && get.attitude(player, current) > 0; }); - return (hasFriend?7:1)-get.value(card); + return (hasFriend ? 7 : 1) - get.value(card); }, - prompt(){ - const player=get.player(),list=game.filterPlayer(current=>{ - return current.hasSkill('dcwuyou'); - }),list2=list.filter(current=>current!==player); - const moreThanOne=list.length>1,includesMe=list.includes(player); - let str='选择一张手牌,'; - if(includesMe) str+=`点击“确定”,${moreThanOne?'或':''}`; - if(moreThanOne||!includesMe) str+=`将此牌交给${get.translation(list2)}${list2.length>1?'中的一人':''},`; - str+='然后执行后续效果。'; + prompt() { + const player = get.player(), + list = game.filterPlayer((current) => { + return current.hasSkill("dcwuyou"); + }), + list2 = list.filter((current) => current !== player); + const moreThanOne = list.length > 1, + includesMe = list.includes(player); + let str = "选择一张手牌,"; + if (includesMe) str += `点击“确定”,${moreThanOne ? "或" : ""}`; + if (moreThanOne || !includesMe) + str += `将此牌交给${get.translation(list2)}${ + list2.length > 1 ? "中的一人" : "" + },`; + str += "然后执行后续效果。"; return str; }, - discard:false, - lose:false, - delay:false, - async content(event,trigger,player){ + discard: false, + lose: false, + delay: false, + async content(event, trigger, player) { const { target } = event; const isMe = target === player; let { cards } = event; if (!isMe) await player.give(cards, target); - const names = lib.inpile.filter(name => { - return get.type2(name) !== 'equip'; - }).randomGets(5); - if (names.includes('sha')) names.splice(names.indexOf('sha') + 1, 0, ...lib.inpile_nature.map(nature => ['sha', nature])); - const vcard = names.map(namex => { - let name = namex, nature; + const names = lib.inpile + .filter((name) => { + return get.type2(name) !== "equip"; + }) + .randomGets(5); + if (names.includes("sha")) + names.splice( + names.indexOf("sha") + 1, + 0, + ...lib.inpile_nature.map((nature) => ["sha", nature]) + ); + const vcard = names.map((namex) => { + let name = namex, + nature; if (Array.isArray(namex)) [name, nature] = namex; - const info = [get.type(name), '', name, nature]; + const info = [get.type(name), "", name, nature]; return info; }); - const links = await target.chooseButton(['武佑:选择一个牌名', [vcard, 'vcard']], true) - .set('user', player) - .set('ai', button => { - const player = get.player(), user = get.event('user'); - return user.getUseValue({name: button.link[2], nature: button.link[3]}) * get.attitude(player, user); + const links = await target + .chooseButton(["武佑:选择一个牌名", [vcard, "vcard"]], true) + .set("user", player) + .set("ai", (button) => { + const player = get.player(), + user = get.event("user"); + return ( + user.getUseValue({ name: button.link[2], nature: button.link[3] }) * + get.attitude(player, user) + ); }) .forResultLinks(); if (!links || !links.length) return; - const viewAs = {name: links[0][2], nature: links[0][3]}; + const viewAs = { name: links[0][2], nature: links[0][3] }; if (!isMe) { cards = await target.chooseToGive(player, true).forResultCards(); } const card = cards[0]; - if (player.getCards('h').includes(card)) { + if (player.getCards("h").includes(card)) { if (!player.storage.dcwuyou_transfer) player.storage.dcwuyou_transfer = {}; player.storage.dcwuyou_transfer[card.cardid] = viewAs; - player.addGaintag(cards, 'dcwuyou_transfer'); - player.addSkill('dcwuyou_transfer'); + player.addGaintag(cards, "dcwuyou_transfer"); + player.addSkill("dcwuyou_transfer"); } }, - ai:{ - order:10, - result:{ - player(player,target){ - if(get.attitude(player,target)>0) return 2; + ai: { + order: 10, + result: { + player(player, target) { + if (get.attitude(player, target) > 0) return 2; return 1; }, - target:0.5, + target: 0.5, }, }, }, - transfer:{ - trigger:{player:'useCard1'}, - forced:true, - popup:false, - charlotte:true, - filter(event,player){ - if(event.addCount===false) return false; - return player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - for(const i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dcwuyou_transfer')) return true; + transfer: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + charlotte: true, + filter(event, player) { + if (event.addCount === false) return false; + return player.hasHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + for (const i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcwuyou_transfer")) return true; } return false; }); }, - async content(event,trigger,player){ + async content(event, trigger, player) { trigger.addCount = false; - const stat = player.getStat().card, name = trigger.card.name; - if (typeof stat[name] === 'number') stat[name]--; + const stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] === "number") stat[name]--; }, - mod:{ - cardname(card,player){ - const map=player.storage.dcwuyou_transfer; - if(map&&map[card.cardid]&&get.itemtype(card)=='card'&&card.hasGaintag('dcwuyou_transfer')) return map[card.cardid].name; + mod: { + cardname(card, player) { + const map = player.storage.dcwuyou_transfer; + if ( + map && + map[card.cardid] && + get.itemtype(card) == "card" && + card.hasGaintag("dcwuyou_transfer") + ) + return map[card.cardid].name; }, - cardnature(card,player){ - const map=player.storage.dcwuyou_transfer; - if(map&&map[card.cardid]&&get.itemtype(card)=='card'&&card.hasGaintag('dcwuyou_transfer')) return map[card.cardid].nature||false; + cardnature(card, player) { + const map = player.storage.dcwuyou_transfer; + if ( + map && + map[card.cardid] && + get.itemtype(card) == "card" && + card.hasGaintag("dcwuyou_transfer") + ) + return map[card.cardid].nature || false; }, - cardUsable(card){ - if(!card.cards) return; - if(card.cards.some(card=>card.hasGaintag('dcwuyou_transfer'))) return Infinity; + cardUsable(card) { + if (!card.cards) return; + if (card.cards.some((card) => card.hasGaintag("dcwuyou_transfer"))) + return Infinity; }, }, }, - } + }, }, - dcyixian:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'metal', - chooseButton:{ - dialog(event,player){ - const dialog=ui.create.dialog('义贤:你可以选择一项','hidden'); - dialog.add([[ - ['field','获得场上的所有装备牌'], - ['discardPile','获得弃牌堆中的所有装备牌'] - ],'textbutton']); + dcyixian: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "metal", + chooseButton: { + dialog(event, player) { + const dialog = ui.create.dialog("义贤:你可以选择一项", "hidden"); + dialog.add([ + [ + ["field", "获得场上的所有装备牌"], + ["discardPile", "获得弃牌堆中的所有装备牌"], + ], + "textbutton", + ]); return dialog; }, - check(button){ - const player=get.player(); - if(button.link=='field') return game.filterPlayer().map(current=>{ - const cards=current.getCards('e'),att=get.sgnAttitude(player,current); - return cards.map(card=>{ - return Math.max(player.hasSkill('dcjuewu')?5:0,get.value(card,player))-get.value(card,current)*att; - }).reduce((p,c)=>p+c,0); - }).reduce((p,c)=>p+c,0); - if(button.link=='discardPile') return Array.from(ui.discardPile.childNodes).filter(card=>{ - return get.type(card)==='equip'; - }).map(card=>{ - return Math.max(player.hasSkill('dcjuewu')?5:0,get.value(card,player)); - }).reduce((p,c)=>p+c,0); + check(button) { + const player = get.player(); + if (button.link == "field") + return game + .filterPlayer() + .map((current) => { + const cards = current.getCards("e"), + att = get.sgnAttitude(player, current); + return cards + .map((card) => { + return ( + Math.max( + player.hasSkill("dcjuewu") ? 5 : 0, + get.value(card, player) + ) - + get.value(card, current) * att + ); + }) + .reduce((p, c) => p + c, 0); + }) + .reduce((p, c) => p + c, 0); + if (button.link == "discardPile") + return Array.from(ui.discardPile.childNodes) + .filter((card) => { + return get.type(card) === "equip"; + }) + .map((card) => { + return Math.max( + player.hasSkill("dcjuewu") ? 5 : 0, + get.value(card, player) + ); + }) + .reduce((p, c) => p + c, 0); return 0.1; }, - backup(links){ + backup(links) { return { - filterCard:()=>false, - selectCard:-1, - pos:links[0], - filterTarget:()=>false, - selectTarget:-1, - popup:false, - direct:true, - async content(event,trigger,player){ - await player.logSkill('dcyixian'); - player.awakenSkill('dcyixian'); + filterCard: () => false, + selectCard: -1, + pos: links[0], + filterTarget: () => false, + selectTarget: -1, + popup: false, + direct: true, + async content(event, trigger, player) { + await player.logSkill("dcyixian"); + player.awakenSkill("dcyixian"); const position = lib.skill.dcyixian_backup.pos; let cards = []; - if (position === 'field') { - cards.addArray(game.filterPlayer().map(current => current.getCards('e')).flat()); - } - else { - cards.addArray(Array.from(ui.discardPile.childNodes).filter(card => { - return get.type(card) === 'equip'; - })); + if (position === "field") { + cards.addArray( + game + .filterPlayer() + .map((current) => current.getCards("e")) + .flat() + ); + } else { + cards.addArray( + Array.from(ui.discardPile.childNodes).filter((card) => { + return get.type(card) === "equip"; + }) + ); } if (!cards.length) return; - await player.gain(cards, position === 'field'? 'give' : 'gain2'); - const pairs = game.filterPlayer().map(current => { + await player.gain(cards, position === "field" ? "give" : "gain2"); + const pairs = game.filterPlayer().map((current) => { let lostNum = 0; - current.checkHistory('lose', evt => { + current.checkHistory("lose", (evt) => { if (evt.getParent(2) === event) lostNum += evt.cards2.length; }); return [current, lostNum]; @@ -449,195 +585,284 @@ game.import('character', function () { for (const pair of pairs) { const [target, num] = pair; if (!num) continue; - const bool = await player.chooseBool(`是否令${get.translation(target)}摸${get.cnNumber(num)}张牌并回复1点体力?`) - .set('choice', get.effect(target, {name: 'draw'}, player, player) + get.recoverEffect(target, player, player) / 5 > 0) + const bool = await player + .chooseBool( + `是否令${get.translation(target)}摸${get.cnNumber( + num + )}张牌并回复1点体力?` + ) + .set( + "choice", + get.effect(target, { name: "draw" }, player, player) + + get.recoverEffect(target, player, player) / 5 > + 0 + ) .forResultBool(); if (bool) { - player.line(target, 'green'); + player.line(target, "green"); await target.draw(num); await target.recover(); } if (!event.isMine() && !event.isOnline()) await game.asyncDelayx(); } }, - } + }; }, - prompt(links){ - return `点击“确定”,从${links[0]==='field'?'场上':'弃牌堆中'}获得所有装备牌`; + prompt(links) { + return `点击“确定”,从${links[0] === "field" ? "场上" : "弃牌堆中"}获得所有装备牌`; }, }, - subSkill:{ - backup:{}, + subSkill: { + backup: {}, }, - ai:{ - order:10, - threaten:2.9, - result:{ - player(player){ - const enemies=game.filterPlayer(current=>{ - return get.rawAttitude(player,current)<0&&get.attitude(player,current)>=0; - }),knownEnemies=game.filterPlayer(current=>{ - return get.attitude(player,current)<0; - }); - if(!knownEnemies.length&&player.countCards('e')>1||player.getHp()>3&&enemies.length>0&&knownEnemies.length<2&&knownEnemies.lengthget.attitude(player,enemy)<=-9)) return 0; - const val1=game.filterPlayer().map(current=>{ - const cards=current.getCards('e'),att=get.sgnAttitude(player,current); - return cards.map(card=>{ - return Math.max(player.hasSkill('dcjuewu')?5:0,get.value(card,player))-get.value(card,current)*att; - }).reduce((p,c)=>p+c,0); - }).reduce((p,c)=>p+c,0); - const val2=Array.from(ui.discardPile.childNodes).filter(card=>{ - return get.type(card)==='equip'; - }).map(card=>{ - return Math.max(player.hasSkill('dcjuewu')?5:0,get.value(card,player)); - }).reduce((p,c)=>p+c,0); - return Math.max(val1,val2)>20?4:0; + ai: { + order: 10, + threaten: 2.9, + result: { + player(player) { + const enemies = game.filterPlayer((current) => { + return ( + get.rawAttitude(player, current) < 0 && + get.attitude(player, current) >= 0 + ); + }), + knownEnemies = game.filterPlayer((current) => { + return get.attitude(player, current) < 0; + }); + if ( + (!knownEnemies.length && player.countCards("e") > 1) || + (player.getHp() > 3 && + enemies.length > 0 && + knownEnemies.length < 2 && + knownEnemies.length < enemies.length && + !knownEnemies.some((enemy) => get.attitude(player, enemy) <= -9)) + ) + return 0; + const val1 = game + .filterPlayer() + .map((current) => { + const cards = current.getCards("e"), + att = get.sgnAttitude(player, current); + return cards + .map((card) => { + return ( + Math.max( + player.hasSkill("dcjuewu") ? 5 : 0, + get.value(card, player) + ) - + get.value(card, current) * att + ); + }) + .reduce((p, c) => p + c, 0); + }) + .reduce((p, c) => p + c, 0); + const val2 = Array.from(ui.discardPile.childNodes) + .filter((card) => { + return get.type(card) === "equip"; + }) + .map((card) => { + return Math.max( + player.hasSkill("dcjuewu") ? 5 : 0, + get.value(card, player) + ); + }) + .reduce((p, c) => p + c, 0); + return Math.max(val1, val2) > 20 ? 4 : 0; }, }, }, }, //SP甄宓 - dcjijie:{ - audio:2, - trigger:{ - global:['gainAfter','loseAsyncAfter','recoverAfter'], + dcjijie: { + audio: 2, + trigger: { + global: ["gainAfter", "loseAsyncAfter", "recoverAfter"], }, - getIndex(event,player){ - if (event.name!=='loseAsync') return [[event.player]]; - return [game.filterPlayer(current=>{ - return current!==player&&_status.currentPhase!==current&&event.getg(current).length>0; - }).sortBySeat()]; + getIndex(event, player) { + if (event.name !== "loseAsync") return [[event.player]]; + return [ + game + .filterPlayer((current) => { + return ( + current !== player && + _status.currentPhase !== current && + event.getg(current).length > 0 + ); + }) + .sortBySeat(), + ]; }, - filter(event,player,triggername,targets){ - if(player.getStorage('dcjijie_used').includes(event.name=='recover'?'recover':'draw')) return false; - if(event.name==='recover') return targets[0]!==player&&_status.currentPhase!==targets[0]&&player.isDamaged(); - return targets.some(current=>{ - return current!==player&&_status.currentPhase!==current&&event.getg(current).length>0; + filter(event, player, triggername, targets) { + if ( + player + .getStorage("dcjijie_used") + .includes(event.name == "recover" ? "recover" : "draw") + ) + return false; + if (event.name === "recover") + return ( + targets[0] !== player && _status.currentPhase !== targets[0] && player.isDamaged() + ); + return targets.some((current) => { + return ( + current !== player && + _status.currentPhase !== current && + event.getg(current).length > 0 + ); }); }, - forced:true, - logTarget(event,player,triggername,targets){ + forced: true, + logTarget(event, player, triggername, targets) { return targets; }, - async content(event,trigger,player){ - player.addTempSkill('dcjijie_used'); - if (trigger.name === 'recover') { - player.markAuto('dcjijie_used',['recover']); + async content(event, trigger, player) { + player.addTempSkill("dcjijie_used"); + if (trigger.name === "recover") { + player.markAuto("dcjijie_used", ["recover"]); await player.recover(trigger.num); - } - else{ - const count = game.countPlayer(current => { - if(current === player || _status.currentPhase === current) return 0; + } else { + const count = game.countPlayer((current) => { + if (current === player || _status.currentPhase === current) return 0; return trigger.getg(current).length; }); - player.markAuto('dcjijie_used',['draw']); + player.markAuto("dcjijie_used", ["draw"]); await player.draw(count); } }, - subSkill:{ - used:{ - charlotte:true, - onremove:true, + subSkill: { + used: { + charlotte: true, + onremove: true, }, }, }, - dchuiji:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:true, - chooseButton:{ - dialog(event,player){ - const name=get.translation(event.result.targets[0]); - const dialog=ui.create.dialog( + dchuiji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: true, + chooseButton: { + dialog(event, player) { + const name = get.translation(event.result.targets[0]); + const dialog = ui.create.dialog( `惠济:请选择要令${name}执行的选项`, - [[['draw','令其摸两张牌'],['equip','令其随机使用牌堆中的一张装备牌']],'textbutton'], - 'hidden' + [ + [ + ["draw", "令其摸两张牌"], + ["equip", "令其随机使用牌堆中的一张装备牌"], + ], + "textbutton", + ], + "hidden" ); return dialog; }, - filter(button,player){ - const target=get.event().getParent().result.targets[0]; - const link=button.link; - if(button.link==='equip'&&target.isMin()) return false; + filter(button, player) { + const target = get.event().getParent().result.targets[0]; + const link = button.link; + if (button.link === "equip" && target.isMin()) return false; return true; }, - check(button){ - const player=get.player(),target=get.event().getParent().result.targets[0]; - const link=button.link; - const att=get.attitude(player,target)/5; - const hs=target.countCards('h'); - if(link==='draw'){ - return (2-(hs+2>game.countPlayer())*hs)*att; + check(button) { + const player = get.player(), + target = get.event().getParent().result.targets[0]; + const link = button.link; + const att = get.attitude(player, target) / 5; + const hs = target.countCards("h"); + if (link === "draw") { + return (2 - (hs + 2 > game.countPlayer()) * hs) * att; } - return (1.1-(hs>game.countPlayer())*hs)*att; + return (1.1 - (hs > game.countPlayer()) * hs) * att; }, - backup(links){ + backup(links) { return { - audio:'dchuiji', - target:get.event().result.targets[0], - link:links[0], - filterTarget(card,player,target){ - return target===lib.skill.dchuiji_backup.target; + audio: "dchuiji", + target: get.event().result.targets[0], + link: links[0], + filterTarget(card, player, target) { + return target === lib.skill.dchuiji_backup.target; }, - selectTarget:-1, - async content(event,trigger,player){ + selectTarget: -1, + async content(event, trigger, player) { const link = lib.skill.dchuiji_backup.link; const { target } = event; - if (link === 'draw') await target.draw(2); + if (link === "draw") await target.draw(2); else { - const card = get.cardPile2(card => { - if (get.type(card) !== 'equip') return false; - return target.canUse(card, target) && !get.cardtag(card, 'gifts'); + const card = get.cardPile2((card) => { + if (get.type(card) !== "equip") return false; + return target.canUse(card, target) && !get.cardtag(card, "gifts"); }); - if (card) await target.chooseUseTarget(card, true).set('nopopup', true); + if (card) await target.chooseUseTarget(card, true).set("nopopup", true); else { - game.log('但是牌堆里没有', target, '的装备!'); + game.log("但是牌堆里没有", target, "的装备!"); await game.asyncDelayx(); } } - if (target.countCards('h') < game.countPlayer()) return; - player.when({global: 'wuguRemained'}).filter(evt => { - return evt.getParent(3) === event; - }).vars({originalOwner: target}).then(() => { - const remained = trigger.remained.filterInD('d'); - if (!remained.length) return event.finish(); - player.line(originalOwner); - originalOwner.gain(remained, 'gain2'); - }); - await target.chooseUseTarget({ - name: 'wugu', - storage: { - fixedShownCards: target.getCards('h'), + if (target.countCards("h") < game.countPlayer()) return; + player + .when({ global: "wuguRemained" }) + .filter((evt) => { + return evt.getParent(3) === event; + }) + .vars({ originalOwner: target }) + .then(() => { + const remained = trigger.remained.filterInD("d"); + if (!remained.length) return event.finish(); + player.line(originalOwner); + originalOwner.gain(remained, "gain2"); + }); + await target.chooseUseTarget( + { + name: "wugu", + storage: { + fixedShownCards: target.getCards("h"), + }, }, - }, true); - } + true + ); + }, }; }, - prompt(links){ - return '点击“确定”以执行效果'; + prompt(links) { + return "点击“确定”以执行效果"; }, }, - subSkill:{ - backup:{}, + subSkill: { + backup: {}, }, - ai:{ - order(item,player){ - if(!game.hasPlayer(current=>current!==player&&get.attitude(player,current)>0)&&game.hasPlayer(current=>get.attitude(player,current)<=0)) return 10; - if(game.hasPlayer(current=>{ - const del=player.countCards('h')-current.countCards('h'),toFind=[2,4].find(num=>Math.abs(del)===num); - if(toFind===4&&del<0&&get.attitude(player,current)<=0){ - return true; - } - return false; - })) return 10; + ai: { + order(item, player) { + if ( + !game.hasPlayer( + (current) => current !== player && get.attitude(player, current) > 0 + ) && + game.hasPlayer((current) => get.attitude(player, current) <= 0) + ) + return 10; + if ( + game.hasPlayer((current) => { + const del = player.countCards("h") - current.countCards("h"), + toFind = [2, 4].find((num) => Math.abs(del) === num); + if (toFind === 4 && del < 0 && get.attitude(player, current) <= 0) { + return true; + } + return false; + }) + ) + return 10; return 1; }, - result:{ - target(player,target){ - const del=player.countCards('h')-target.countCards('h'),toFind=[2,4].find(num=>Math.abs(del)===num); - if(toFind){ - return -del*(get.attitude(player,target)*Math.min(3,target.countCards('h')))*toFind/10; + result: { + target(player, target) { + const del = player.countCards("h") - target.countCards("h"), + toFind = [2, 4].find((num) => Math.abs(del) === num); + if (toFind) { + return ( + (-del * + (get.attitude(player, target) * Math.min(3, target.countCards("h"))) * + toFind) / + 10 + ); } return -1; }, @@ -645,136 +870,197 @@ game.import('character', function () { }, }, //曹芳 - dczhimin:{ - audio:2, - trigger:{global:'roundStart'}, - filter(event,player){ - return game.hasPlayer(current=>current!=player&¤t.countCards('h'))&&player.getHp()>0; + dczhimin: { + audio: 2, + trigger: { global: "roundStart" }, + filter(event, player) { + return ( + game.hasPlayer((current) => current != player && current.countCards("h")) && + player.getHp() > 0 + ); }, - forced:true, - group:['dczhimin_mark','dczhimin_draw'], - async content(event,trigger,player){ - const targets = await player.chooseTarget(`置民:请选择至多${get.cnNumber(player.getHp())}名其他角色`, '你获得这些角色各自手牌中的随机一张点数最小的牌', (card, player, target) => { - return target !== player && target.countCards('h'); - }, [1, player.getHp()], true).set('ai', target => { - const player = get.player(); - return get.effect(target, {name:'shunshou_copy', position: 'h'}, player, player) + 0.1; - }).forResultTargets(); + forced: true, + group: ["dczhimin_mark", "dczhimin_draw"], + async content(event, trigger, player) { + const targets = await player + .chooseTarget( + `置民:请选择至多${get.cnNumber(player.getHp())}名其他角色`, + "你获得这些角色各自手牌中的随机一张点数最小的牌", + (card, player, target) => { + return target !== player && target.countCards("h"); + }, + [1, player.getHp()], + true + ) + .set("ai", (target) => { + const player = get.player(); + return ( + get.effect(target, { name: "shunshou_copy", position: "h" }, player, player) + + 0.1 + ); + }) + .forResultTargets(); if (!targets || !targets.length) return; targets.sortBySeat(trigger.player); - player.line(targets, 'thunder'); + player.line(targets, "thunder"); const toGain = []; for (const target of targets) { - const cards = target.getCards('h'), minNumber = cards.map(card => get.number(card)).sort((a, b) => a - b)[0]; - const gainableCards = cards.filter(card => { - return get.number(card) === minNumber && lib.filter.canBeGained(card, player, target); - }).randomSort(); + const cards = target.getCards("h"), + minNumber = cards.map((card) => get.number(card)).sort((a, b) => a - b)[0]; + const gainableCards = cards + .filter((card) => { + return ( + get.number(card) === minNumber && + lib.filter.canBeGained(card, player, target) + ); + }) + .randomSort(); toGain.push(gainableCards[0]); } - if (toGain.length) await player.gain(toGain, 'giveAuto'); + if (toGain.length) await player.gain(toGain, "giveAuto"); await game.asyncDelayx(); }, - ai:{ - threaten:5.8, + ai: { + threaten: 5.8, }, - mod:{ - aiOrder(player,card,num){ - if(num>0&&get.itemtype(card)==='card'&&card.hasGaintag('dczhimin_tag')&&player.countCards('h',cardx=>{ - return cardx.hasGaintag('dczhimin_tag')&&cardx!==card; - }) 0 && + get.itemtype(card) === "card" && + card.hasGaintag("dczhimin_tag") && + player.countCards("h", (cardx) => { + return cardx.hasGaintag("dczhimin_tag") && cardx !== card; + }) < player.maxHp + ) + return num / 10; + }, }, - subSkill:{ - mark:{ - audio:'dczhimin', - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + subSkill: { + mark: { + audio: "dczhimin", + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - forced:true, - filter(event,player){ - if(_status.currentPhase===player||!event.getg(player).some(card=>get.position(card)==='h'&&get.owner(card)===player)) return false; + forced: true, + filter(event, player) { + if ( + _status.currentPhase === player || + !event + .getg(player) + .some((card) => get.position(card) === "h" && get.owner(card) === player) + ) + return false; return true; }, - async content(event,trigger,player){ - player.addGaintag(trigger.getg(player).filter(card=>get.position(card)==='h'&&get.owner(card)===player), 'dczhimin_tag'); + async content(event, trigger, player) { + player.addGaintag( + trigger + .getg(player) + .filter( + (card) => get.position(card) === "h" && get.owner(card) === player + ), + "dczhimin_tag" + ); }, }, - draw:{ - audio:'dczhimin', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + draw: { + audio: "dczhimin", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter(event,player){ - const evt=event.getl(player); - if(!evt.hs.length) return false; - return Object.values(evt.gaintag_map).flat().includes('dczhimin_tag'); + forced: true, + filter(event, player) { + const evt = event.getl(player); + if (!evt.hs.length) return false; + return Object.values(evt.gaintag_map).flat().includes("dczhimin_tag"); }, - async content(event,trigger,player){ - const count = player.maxHp - player.countCards('h'); + async content(event, trigger, player) { + const count = player.maxHp - player.countCards("h"); if (count <= 0) return; await player.draw(count); - } + }, }, }, }, - dcjujian:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuSkill:true, - filter(event,player){ - return game.hasPlayer(current=>{ - return player.hasZhuSkill('dcjujian',current)&¤t.group==='wei'&¤t!==player; + dcjujian: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuSkill: true, + filter(event, player) { + return game.hasPlayer((current) => { + return ( + player.hasZhuSkill("dcjujian", current) && + current.group === "wei" && + current !== player + ); }); }, - filterTarget(_,player,target){ - return player.hasZhuSkill('dcjujian',target)&&target.group==='wei'&&target!==player; + filterTarget(_, player, target) { + return ( + player.hasZhuSkill("dcjujian", target) && target.group === "wei" && target !== player + ); }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = event.targets[0]; await target.draw(); - target.addTempSkill('dcjujian_forbid', 'roundStart'); - target.markAuto('dcjujian_forbid', player); + target.addTempSkill("dcjujian_forbid", "roundStart"); + target.markAuto("dcjujian_forbid", player); }, - ai:{ - result:{ - target(player,target){ - const num=target.countCards('hs',card=>{ - return get.type(card)=='trick'&&target.canUse(card,player)&&get.effect(player,card,target,player)<-2; - }),att=get.attitude(player,target); - if(att<0) return -0.74*num; + ai: { + result: { + target(player, target) { + const num = target.countCards("hs", (card) => { + return ( + get.type(card) == "trick" && + target.canUse(card, player) && + get.effect(player, card, target, player) < -2 + ); + }), + att = get.attitude(player, target); + if (att < 0) return -0.74 * num; return 1.5; }, }, }, - subSkill:{ - forbid:{ - audio:'dcjujian', - trigger:{ - player:'useCardToBefore', + subSkill: { + forbid: { + audio: "dcjujian", + trigger: { + player: "useCardToBefore", }, - filter(event,player){ - if(get.type(event.card)!=='trick') return false; - return player.getStorage('dcjujian_forbid').includes(event.target); + filter(event, player) { + if (get.type(event.card) !== "trick") return false; + return player.getStorage("dcjujian_forbid").includes(event.target); }, - forced:true, - charlotte:true, - onremove:true, - direct:true, - async content(event,trigger,player){ - await trigger.target.logSkill('dcjujian_forbid', player); + forced: true, + charlotte: true, + onremove: true, + direct: true, + async content(event, trigger, player) { + await trigger.target.logSkill("dcjujian_forbid", player); trigger.cancel(); }, - intro:{ - content:'使用普通锦囊牌对$无效', + intro: { + content: "使用普通锦囊牌对$无效", }, - ai:{ - effect:{ - player(card,player,target,current){ - if(get.type(card)=='trick'&&player.getStorage('dcjujian_forbid').includes(target)) return 'zeroplayertarget'; + ai: { + effect: { + player(card, player, target, current) { + if ( + get.type(card) == "trick" && + player.getStorage("dcjujian_forbid").includes(target) + ) + return "zeroplayertarget"; }, }, }, @@ -782,331 +1068,426 @@ game.import('character', function () { }, }, //谋司马懿 - dcsbquanmou:{ - audio:2, - audioname:['dc_sb_simayi_shadow'], - zhuanhuanji:true, - marktext:'☯', - enable:'phaseUse', - filter(event,player){ - const selected=player.getStorage('dcsbquanmou_selected'); - return game.hasPlayer(current=>!selected.includes(current)&&player.inRange(current)&¤t.countCards('he')>0); + dcsbquanmou: { + audio: 2, + audioname: ["dc_sb_simayi_shadow"], + zhuanhuanji: true, + marktext: "☯", + enable: "phaseUse", + filter(event, player) { + const selected = player.getStorage("dcsbquanmou_selected"); + return game.hasPlayer( + (current) => + !selected.includes(current) && + player.inRange(current) && + current.countCards("he") > 0 + ); }, - filterTarget(card,player,target){ - if(player===target) return false; - const selected=player.getStorage('dcsbquanmou_selected'); - return !selected.includes(target)&&player.inRange(target)&&target.countCards('he')>0; + filterTarget(card, player, target) { + if (player === target) return false; + const selected = player.getStorage("dcsbquanmou_selected"); + return ( + !selected.includes(target) && player.inRange(target) && target.countCards("he") > 0 + ); }, - prompt(){ + prompt() { const player = get.player(); - if(player.storage.dcsbquanmou) return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。'; - return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。'; + if (player.storage.dcsbquanmou) + return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。"; + return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。"; }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = event.targets[0]; - player.changeZhuanhuanji('dcsbquanmou'); - player.changeSkin('dcsbquanmou','dc_sb_simayi'+(player.storage.dcsbquanmou?'_shadow':'')); - player.markAuto('dcsbquanmou_selected', [target]); - const cards = await target.chooseCard('he', true, `选择交给${get.translation(player)}一张牌`).forResultCards(); + player.changeZhuanhuanji("dcsbquanmou"); + player.changeSkin( + "dcsbquanmou", + "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : "") + ); + player.markAuto("dcsbquanmou_selected", [target]); + const cards = await target + .chooseCard("he", true, `选择交给${get.translation(player)}一张牌`) + .forResultCards(); if (cards && cards.length) { await target.give(cards, player); const key = `dcsbquanmou_${Boolean(!player.storage.dcsbquanmou)}`; - player.addTempSkill(key, {global:['phaseUseBefore','phaseChange']}); + player.addTempSkill(key, { global: ["phaseUseBefore", "phaseChange"] }); player.markAuto(key, [target]); target.addAdditionalSkill(`${key}_${player.playerid}`, `${key}_mark`); } }, - ai:{ - order:9, - result:{ - player:function(player,target){ - if(player.storage.dcsbquanmou) return 1; - return 1+game.countPlayer(i=>player!==i&&target!==i&&!i.hasSkill('false_mark')&&get.attitude(player,i)<0); + ai: { + order: 9, + result: { + player: function (player, target) { + if (player.storage.dcsbquanmou) return 1; + return ( + 1 + + game.countPlayer( + (i) => + player !== i && + target !== i && + !i.hasSkill("false_mark") && + get.attitude(player, i) < 0 + ) + ); }, - target:function(player,target){ - let res=target.hasSkillTag('noh')?0:-1; - if(player.storage.dcsbquanmou) return res+0.6; + target: function (player, target) { + let res = target.hasSkillTag("noh") ? 0 : -1; + if (player.storage.dcsbquanmou) return res + 0.6; return res; }, }, }, - onremove:true, - mark:true, - intro:{ - content:(storage)=>{ - if(storage) return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。'; - return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。'; - } + onremove: true, + mark: true, + intro: { + content: (storage) => { + if (storage) + return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。"; + return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。"; + }, }, - subSkill:{ - true:{ - charlotte:true, - audio:'dcsbquanmou', - audioname:['dc_sb_simayi_shadow'], - trigger:{source:'damageSource'}, - forced:true, - popup:false, - filter(event,player){ - return player.getStorage('dcsbquanmou_true').includes(event.player); + subSkill: { + true: { + charlotte: true, + audio: "dcsbquanmou", + audioname: ["dc_sb_simayi_shadow"], + trigger: { source: "damageSource" }, + forced: true, + popup: false, + filter(event, player) { + return player.getStorage("dcsbquanmou_true").includes(event.player); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const target = trigger.player; - player.getStorage('dcsbquanmou_true').remove(target); + player.getStorage("dcsbquanmou_true").remove(target); target.removeAdditionalSkill(`dcsbquanmou_true_${player.playerid}`); - if(game.hasPlayer(current => (current != player && current != target))){ - const result = await player.chooseTarget([1,3], `权谋:是否对${get.translation(target)}之外的至多三名其他角色各造成1点伤害?`, (card, player, target)=>{ - return target != player && target != get.event().getTrigger().player; - }).set('ai',target => { - const player = get.player(); - return get.damageEffect(target, player, player); - }).forResult(); + if (game.hasPlayer((current) => current != player && current != target)) { + const result = await player + .chooseTarget( + [1, 3], + `权谋:是否对${get.translation( + target + )}之外的至多三名其他角色各造成1点伤害?`, + (card, player, target) => { + return ( + target != player && target != get.event().getTrigger().player + ); + } + ) + .set("ai", (target) => { + const player = get.player(); + return get.damageEffect(target, player, player); + }) + .forResult(); if (result.bool) { - await player.logSkill('dcsbquanmou', result.targets); - for(let i of result.targets){ - if(i.isIn()) await i.damage(); + await player.logSkill("dcsbquanmou", result.targets); + for (let i of result.targets) { + if (i.isIn()) await i.damage(); } } } }, - onremove(player,skill){ - game.filterPlayer(current=>{ + onremove(player, skill) { + game.filterPlayer((current) => { current.removeAdditionalSkill(`${skill}_${player.playerid}`); }); delete player.storage[skill]; delete player.storage.dcsbquanmou_selected; }, }, - true_mark:{ - charlotte:true, - mark:true, - marktext:'讨', - intro:{ - name:'权谋 - 阳', - content:()=>{ - return `当你下次受到${get.translation(_status.currentPhase)}造成的伤害后,其可以对除你之外的至多三名其他角色各造成1点伤害。` + true_mark: { + charlotte: true, + mark: true, + marktext: "讨", + intro: { + name: "权谋 - 阳", + content: () => { + return `当你下次受到${get.translation( + _status.currentPhase + )}造成的伤害后,其可以对除你之外的至多三名其他角色各造成1点伤害。`; }, }, - ai:{ - threaten:2.5, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')&&player&&player.hasSkill('dcsbquanmou_true')){ - let tars=game.countPlayer(i=>player!==i&&target!==i&&get.attitude(player,target)<0&&!target.hasSkill('dcsbquanmou_false_mark')); - return [1,0,1,6*Math.min(3,tars)/(3+Math.pow(target.countCards('h'),2))]; + ai: { + threaten: 2.5, + effect: { + target(card, player, target) { + if ( + get.tag(card, "damage") && + player && + player.hasSkill("dcsbquanmou_true") + ) { + let tars = game.countPlayer( + (i) => + player !== i && + target !== i && + get.attitude(player, target) < 0 && + !target.hasSkill("dcsbquanmou_false_mark") + ); + return [ + 1, + 0, + 1, + (6 * Math.min(3, tars)) / + (3 + Math.pow(target.countCards("h"), 2)), + ]; } - } - } + }, + }, }, }, - false:{ - charlotte:true, - audio:'dcsbquanmou', - audioname:['dc_sb_simayi_shadow'], - trigger:{source:'damageBegin2'}, - forced:true, - filter(event,player){ - return player.getStorage('dcsbquanmou_false').includes(event.player); + false: { + charlotte: true, + audio: "dcsbquanmou", + audioname: ["dc_sb_simayi_shadow"], + trigger: { source: "damageBegin2" }, + forced: true, + filter(event, player) { + return player.getStorage("dcsbquanmou_false").includes(event.player); }, - async content(event, trigger, player){ + async content(event, trigger, player) { const target = trigger.player; - player.getStorage('dcsbquanmou_false').remove(target); + player.getStorage("dcsbquanmou_false").remove(target); target.removeAdditionalSkill(`dcsbquanmou_false_${player.playerid}`); trigger.cancel(); }, - onremove(player,skill){ - game.filterPlayer(current=>{ + onremove(player, skill) { + game.filterPlayer((current) => { current.removeAdditionalSkill(`${skill}_${player.playerid}`); }); delete player.storage[skill]; delete player.storage.dcsbquanmou_selected; }, }, - false_mark:{ - charlotte:true, - mark:true, - marktext:'抚', - intro:{ - name:'权谋 - 阴', - content:()=>{ - return `当你下次受到${get.translation(_status.currentPhase)}造成的伤害时,防止此伤害。` + false_mark: { + charlotte: true, + mark: true, + marktext: "抚", + intro: { + name: "权谋 - 阴", + content: () => { + return `当你下次受到${get.translation( + _status.currentPhase + )}造成的伤害时,防止此伤害。`; }, }, - ai:{ - nodamage:true, - nofire:true, - nothunder:true, - skillTagFilter(player,tag,arg){ - return (arg&&arg.player&&arg.player.hasSkill('dcsbquanmou_false')); + ai: { + nodamage: true, + nofire: true, + nothunder: true, + skillTagFilter(player, tag, arg) { + return arg && arg.player && arg.player.hasSkill("dcsbquanmou_false"); + }, + effect: { + target(card, player, target) { + if ( + get.tag(card, "damage") && + player && + player.hasSkill("dcsbquanmou_false") + ) + return "zeroplayertarget"; + }, }, - effect:{ - target(card,player,target){ - if(get.tag(card,'damage')&&player&&player.hasSkill('dcsbquanmou_false')) return 'zeroplayertarget'; - } - } }, }, }, }, - dcsbpingliao:{ - audio:2, - audioname:['dc_sb_simayi_shadow'], - trigger:{player:'useCard'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'; + dcsbpingliao: { + audio: 2, + audioname: ["dc_sb_simayi_shadow"], + trigger: { player: "useCard" }, + forced: true, + filter(event, player) { + return event.card.name == "sha"; }, - logTarget(event,player){ - return game.filterPlayer(current=>player.inRange(current)); + logTarget(event, player) { + return game.filterPlayer((current) => player.inRange(current)); }, async content(event, trigger, player) { const unrespondedTargets = []; const respondedTargets = []; let nonnonTargetResponded = false; const targets = game.filterPlayer().sortBySeat(); - const prompt = `###是否打出红色基本牌响应${get.translation(player)}?###${get.translation(player)}使用了一张不公开目标的${get.translation(trigger.card)}。若你选择响应且你不是此牌的隐藏目标,则其摸两张牌;若你选择不响应且你是此牌的隐藏目标,则你本回合内不能使用或打出手牌。` + const prompt = `###是否打出红色基本牌响应${get.translation(player)}?###${get.translation( + player + )}使用了一张不公开目标的${get.translation( + trigger.card + )}。若你选择响应且你不是此牌的隐藏目标,则其摸两张牌;若你选择不响应且你是此牌的隐藏目标,则你本回合内不能使用或打出手牌。`; for (let target of targets) { if (target.isIn() && player.inRange(target)) { - const result = await target.chooseToRespond(prompt, (card,player)=>{ - if (get.type(card) !== 'basic') return false; - const color = get.color(card); - return (color == 'red' || color == 'unsure'); - }).set('ai',card => { - const player = get.player(), event = get.event(); - const source = event.getParent().player; - //是队友且没有其他疑似队友的选手响应 那响应一下 - if (get.attitude(player,source) > 0){ - if(!event.respondedTargets.some(current => { - return get.attitude(player, current) > 0 || get.attitude(source, current) >= 0; - })) return get.order(card); - return -1; - } - //如果自己没有其他的闪桃就不响应 - else { - const needsTao = (player.hp <= 1); - const shanAndTao = player.getCards('hs', card=>{ - const name = get.name(card); - return name == 'shan' || (needsTao && name == 'shan'); - }); - shanAndTao.remove(card); - if(card.cards) shanAndTao.removeArray(card.cards); - if(!shanAndTao.length) return 0; - } - return event.getRand('dcsbpingliao') > (1 / Math.max(1,player.hp)) ? 0 : get.order(card); - }).set('respondedTargets', respondedTargets).forResult(); + const result = await target + .chooseToRespond(prompt, (card, player) => { + if (get.type(card) !== "basic") return false; + const color = get.color(card); + return color == "red" || color == "unsure"; + }) + .set("ai", (card) => { + const player = get.player(), + event = get.event(); + const source = event.getParent().player; + //是队友且没有其他疑似队友的选手响应 那响应一下 + if (get.attitude(player, source) > 0) { + if ( + !event.respondedTargets.some((current) => { + return ( + get.attitude(player, current) > 0 || + get.attitude(source, current) >= 0 + ); + }) + ) + return get.order(card); + return -1; + } + //如果自己没有其他的闪桃就不响应 + else { + const needsTao = player.hp <= 1; + const shanAndTao = player.getCards("hs", (card) => { + const name = get.name(card); + return name == "shan" || (needsTao && name == "shan"); + }); + shanAndTao.remove(card); + if (card.cards) shanAndTao.removeArray(card.cards); + if (!shanAndTao.length) return 0; + } + return event.getRand("dcsbpingliao") > 1 / Math.max(1, player.hp) + ? 0 + : get.order(card); + }) + .set("respondedTargets", respondedTargets) + .forResult(); if (result.bool) { respondedTargets.push(target); - if(!trigger.targets.includes(target)) nonnonTargetResponded = true; + if (!trigger.targets.includes(target)) nonnonTargetResponded = true; await game.asyncDelay(); - } - else if (trigger.targets.includes(target)) unrespondedTargets.push(target); + } else if (trigger.targets.includes(target)) unrespondedTargets.push(target); } } - unrespondedTargets.forEach(current => { - current.addTempSkill('dcsbpingliao_blocker'); - game.log(current,'本回合内无法使用或打出手牌'); + unrespondedTargets.forEach((current) => { + current.addTempSkill("dcsbpingliao_blocker"); + game.log(current, "本回合内无法使用或打出手牌"); }); if (nonnonTargetResponded) { player.draw(2); - player.addTempSkill('dcsbpingliao_buff', {global:'phaseChange'}); - player.addMark('dcsbpingliao_buff',1,false); + player.addTempSkill("dcsbpingliao_buff", { global: "phaseChange" }); + player.addMark("dcsbpingliao_buff", 1, false); } }, - ai:{ - ignoreLogAI:true, - skillTagFilter:function(player,tag,args){ - if(args){ - return args.card&&get.name(args.card)=='sha'; + ai: { + ignoreLogAI: true, + skillTagFilter: function (player, tag, args) { + if (args) { + return args.card && get.name(args.card) == "sha"; } }, }, - group:'dcsbpingliao_hide', - subSkill:{ - hide:{ - trigger:{player:'useCard0'}, - forced:true, - filter(event,player){ - return event.card.name=='sha'; + group: "dcsbpingliao_hide", + subSkill: { + hide: { + trigger: { player: "useCard0" }, + forced: true, + filter(event, player) { + return event.card.name == "sha"; }, - async content(event, trigger, player){ + async content(event, trigger, player) { trigger.hideTargets = true; - game.log(player,'隐藏了',trigger.card,'的目标'); + game.log(player, "隐藏了", trigger.card, "的目标"); }, }, - buff:{ - onremove:true, - charlotte:true, - mod:{ - cardUsable(card, player, num){ - if(card.name=='sha') return num + player.countMark('dcsbpingliao_buff'); - } + buff: { + onremove: true, + charlotte: true, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") return num + player.countMark("dcsbpingliao_buff"); + }, }, - mark:true, - intro:{ - content:'本阶段内使用【杀】的次数上限+#', + mark: true, + intro: { + content: "本阶段内使用【杀】的次数上限+#", }, }, - blocker:{ - charlotte:true, - mod:{ - cardEnabled2(card, player){ - if(player.getCards('h').includes(card)) return false; - } + blocker: { + charlotte: true, + mod: { + cardEnabled2(card, player) { + if (player.getCards("h").includes(card)) return false; + }, }, - mark:true, - marktext:'封', - intro:{ - content:'本回合内不能使用或打出手牌', + mark: true, + marktext: "封", + intro: { + content: "本回合内不能使用或打出手牌", }, }, }, }, //陈武董袭 - dcduanxie:{ - audio:'duanxie', - inherit:'duanxie', - selectTarget:1, + dcduanxie: { + audio: "duanxie", + inherit: "duanxie", + selectTarget: 1, }, //吕范 - diaodu:{ - audio:2, - trigger:{player:['phaseUseBegin','logSkill']}, - filter(event,player){ - if(event.name=='logSkill'&&event.skill!='diancai') return false; - return game.hasPlayer(target=>{ - return get.distance(player,target)<=1&&target.countGainableCards(player,'e'); + diaodu: { + audio: 2, + trigger: { player: ["phaseUseBegin", "logSkill"] }, + filter(event, player) { + if (event.name == "logSkill" && event.skill != "diancai") return false; + return game.hasPlayer((target) => { + return get.distance(player, target) <= 1 && target.countGainableCards(player, "e"); }); }, - direct:true, - async content(event,trigger,player){ - const {result:{bool,targets}}=await player.chooseTarget(get.prompt2('diaodu'),(card,player,target)=>{ - return get.distance(player,target)<=1&&target.countGainableCards(player,'e'); - }).set('ai',target=>{ - const player=get.event('player'),att=get.attitude(player,target); - let num=0; - if(target.hasSkill('gzxiaoji')) num+=2.5; - if(target.isDamaged()&&target.getEquip('baiyin')) num+=2.5; - if(target.hasSkill('xuanlve')) num+=2; - return get.sgn(att)*num+(target==player?1:0); - }); - if(bool){ - const aim=targets[0]; - player.logSkill('diaodu',aim); - const {result:{bool,cards}}=await player.gainPlayerCard(aim,'e',true); - if(bool&&game.hasPlayer(target=>target!=aim)){ - const card=cards[0]; - const {result:{bool,targets}}=await player.chooseTarget('调度:将'+get.translation(card)+'交给另一名角色',(card,player,target)=>{ - return target!=get.event('aim'); - },true).set('ai',target=>{ - const player=get.event('player'); - return get.attitude(player,target); - }).set('aim',aim); - if(bool&&get.owner(card)==player){ - const target=targets[0]; - player.line(target,'green'); - if(target!=player) await player.give([card],target); - if(get.owner(card)==target){ - const {result:{bool}}=await target.chooseUseTarget(card); - if(bool) await player.draw(); + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt2("diaodu"), (card, player, target) => { + return ( + get.distance(player, target) <= 1 && target.countGainableCards(player, "e") + ); + }) + .set("ai", (target) => { + const player = get.event("player"), + att = get.attitude(player, target); + let num = 0; + if (target.hasSkill("gzxiaoji")) num += 2.5; + if (target.isDamaged() && target.getEquip("baiyin")) num += 2.5; + if (target.hasSkill("xuanlve")) num += 2; + return get.sgn(att) * num + (target == player ? 1 : 0); + }); + if (bool) { + const aim = targets[0]; + player.logSkill("diaodu", aim); + const { + result: { bool, cards }, + } = await player.gainPlayerCard(aim, "e", true); + if (bool && game.hasPlayer((target) => target != aim)) { + const card = cards[0]; + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "调度:将" + get.translation(card) + "交给另一名角色", + (card, player, target) => { + return target != get.event("aim"); + }, + true + ) + .set("ai", (target) => { + const player = get.event("player"); + return get.attitude(player, target); + }) + .set("aim", aim); + if (bool && get.owner(card) == player) { + const target = targets[0]; + player.line(target, "green"); + if (target != player) await player.give([card], target); + if (get.owner(card) == target) { + const { + result: { bool }, + } = await target.chooseUseTarget(card); + if (bool) await player.draw(); else await target.draw(); } } @@ -1114,441 +1495,627 @@ game.import('character', function () { } }, }, - diancai:{ - audio:2, - inherit:'mbdiancai', - filter(event,player){ - if(_status.currentPhase===player) return false; - let num=player.getHistory('lose',evt=>{ - return evt.cards2&&evt.cards2.length&&evt.getParent('phaseUse')==event; - }).reduce((sum,evt)=>{ - return sum+evt.cards2.length; - },0); - return num>=Math.min(5,player.getHp()); + diancai: { + audio: 2, + inherit: "mbdiancai", + filter(event, player) { + if (_status.currentPhase === player) return false; + let num = player + .getHistory("lose", (evt) => { + return evt.cards2 && evt.cards2.length && evt.getParent("phaseUse") == event; + }) + .reduce((sum, evt) => { + return sum + evt.cards2.length; + }, 0); + return num >= Math.min(5, player.getHp()); }, }, //崔琰毛玠 - zhengbi:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter(event,player){ - return game.hasPlayer(target=>target!=player); + zhengbi: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer((target) => target != player); }, - direct:true, - async content(event,trigger,player){ - const {result:{bool,targets}}=await player.chooseTarget(get.prompt2('zhengbi'),lib.filter.notMe).set('ai',target=>{ - const player=get.event('player'); - return -get.attitude(player,target)*target.countCards('he'); - }); - if(bool){ - const target=targets[0],str=get.translation(target); - player.logSkill('zhengbi',target); - let choiceList=['此阶段结束时,若'+str+'本阶段获得过牌,则你获得其手牌区和装备区各一张牌']; - if(player.countCards('h',{type:'basic'})) choiceList.push('交给'+str+'一张基本牌,然后其交给你一张非基本牌或两张基本牌'); - const {result:{index}}=await player.chooseControl().set('choiceList',choiceList).set('ai',()=>get.event('controls').length-1); - if(index==0){ + direct: true, + async content(event, trigger, player) { + const { + result: { bool, targets }, + } = await player + .chooseTarget(get.prompt2("zhengbi"), lib.filter.notMe) + .set("ai", (target) => { + const player = get.event("player"); + return -get.attitude(player, target) * target.countCards("he"); + }); + if (bool) { + const target = targets[0], + str = get.translation(target); + player.logSkill("zhengbi", target); + let choiceList = [ + "此阶段结束时,若" + str + "本阶段获得过牌,则你获得其手牌区和装备区各一张牌", + ]; + if (player.countCards("h", { type: "basic" })) + choiceList.push( + "交给" + str + "一张基本牌,然后其交给你一张非基本牌或两张基本牌" + ); + const { + result: { index }, + } = await player + .chooseControl() + .set("choiceList", choiceList) + .set("ai", () => get.event("controls").length - 1); + if (index == 0) { player.line(target); - player.when('phaseUseEnd').filter(evt=>evt==trigger).then(()=>{ - if(target.isIn()&&target.getHistory('gain',evt=>evt.getParent('phaseUse')==trigger).length){ - player.line(target); - let num=(target.countGainableCards(player,'h')>0)+(target.countGainableCards(player,'e')>0); - if(num){ - player.gainPlayerCard(target,num,'he',true).set('filterButton',button=>{ - return !ui.selected.buttons.some(but=>get.position(button.link)==get.position(but.link)); - }); - } - } - }).vars({target:target}); - } - else{ - const {result:{bool}}=await player.chooseToGive(target,{type:'basic'},true).set('prompt','征辟:交给'+str+'一张基本牌'); - if(bool){ - let choices=[]; - if(target.countCards('he',{type:['trick','delay','equip']})) choices.push('一张非基本牌'); - if(target.countCards('h',{type:'basic'})>1) choices.push('两张基本牌'); - if(choices.length){ - const {result:{control}}=await target.chooseControl(choices).set('ai',function(event,player){ - if(choices.length>1){ - if(player.countCards('he',{type:['trick','delay','equip']},function(card){return get.value(card)<7})) return 0; - return 1; + player + .when("phaseUseEnd") + .filter((evt) => evt == trigger) + .then(() => { + if ( + target.isIn() && + target.getHistory( + "gain", + (evt) => evt.getParent("phaseUse") == trigger + ).length + ) { + player.line(target); + let num = + (target.countGainableCards(player, "h") > 0) + + (target.countGainableCards(player, "e") > 0); + if (num) { + player + .gainPlayerCard(target, num, "he", true) + .set("filterButton", (button) => { + return !ui.selected.buttons.some( + (but) => + get.position(button.link) == + get.position(but.link) + ); + }); } - return 0; - }).set('prompt','征辟:交给'+get.translation(player)+'…'); - const check=(control=='一张非基本牌'); - await target.chooseToGive('he',(check?1:2),{type:(check?['trick','delay','equip']:'basic')},player,true).set('prompt','征辟:交给'+get.translation(player)+control); - } - else if(target.countCards('h')) await target.give(target.getCards('h'),player); + } + }) + .vars({ target: target }); + } else { + const { + result: { bool }, + } = await player + .chooseToGive(target, { type: "basic" }, true) + .set("prompt", "征辟:交给" + str + "一张基本牌"); + if (bool) { + let choices = []; + if (target.countCards("he", { type: ["trick", "delay", "equip"] })) + choices.push("一张非基本牌"); + if (target.countCards("h", { type: "basic" }) > 1) choices.push("两张基本牌"); + if (choices.length) { + const { + result: { control }, + } = await target + .chooseControl(choices) + .set("ai", function (event, player) { + if (choices.length > 1) { + if ( + player.countCards( + "he", + { type: ["trick", "delay", "equip"] }, + function (card) { + return get.value(card) < 7; + } + ) + ) + return 0; + return 1; + } + return 0; + }) + .set("prompt", "征辟:交给" + get.translation(player) + "…"); + const check = control == "一张非基本牌"; + await target + .chooseToGive( + "he", + check ? 1 : 2, + { type: check ? ["trick", "delay", "equip"] : "basic" }, + player, + true + ) + .set("prompt", "征辟:交给" + get.translation(player) + control); + } else if (target.countCards("h")) + await target.give(target.getCards("h"), player); } } } }, }, - fengying:{ - unique:true, - limited:true, - audio:2, - enable:'phaseUse', - filter(event,player){ - return player.countCards('h')&&player.countCards('h')==player.countDiscardableCards(player,'h'); + fengying: { + unique: true, + limited: true, + audio: 2, + enable: "phaseUse", + filter(event, player) { + return ( + player.countCards("h") && + player.countCards("h") == player.countDiscardableCards(player, "h") + ); }, - skillAnimation:true, - animationColor:'thunder', - async content(event,trigger,player){ - player.awakenSkill('fengying'); - await player.discard(player.getCards('h')); - const evt=player.insertPhase(); - player.when('phaseBegin').filter(evtx=>evtx==evt).then(()=>{ - if(player.isMinHp()&&player.maxHp>0&&player.countCards('h') evtx == evt) + .then(() => { + if ( + player.isMinHp() && + player.maxHp > 0 && + player.countCards("h") < player.maxHp + ) { + player.drawTo(player.maxHp); + } + }); }, - ai:{ - order:0.0001, - result:{ - player(player){ - return player.isMinHp()?1:0; + ai: { + order: 0.0001, + result: { + player(player) { + return player.isMinHp() ? 1 : 0; }, }, }, }, //胡遵 - dczhantao:{ - audio:2, - trigger:{global:'damageEnd'}, - filter(event,player){ - if(!event.player.isIn()||(event.player!==player&&!player.inRange(event.player))) return false; - return event.source&&event.source!=player; + dczhantao: { + audio: 2, + trigger: { global: "damageEnd" }, + filter(event, player) { + if (!event.player.isIn() || (event.player !== player && !player.inRange(event.player))) + return false; + return event.source && event.source != player; }, - check(event,player){ - if(!event.source.isIn()||!event.card||typeof get.number(event.card)!=='number') return 0; - return get.effect(event.source,{name:'sha'},player,player)>=0; - }, - logTarget:'player', - async content(event,trigger,player){ - player.judge(card=>{ - const evt=get.event().getParent(get.event('eventName')).getTrigger(); - if(!evt.source.isIn()||!evt.card||typeof get.number(evt.card)!=='number') return 0; - if(get.number(card)>get.number(evt.card)) return 1.5; + check(event, player) { + if (!event.source.isIn() || !event.card || typeof get.number(event.card) !== "number") return 0; - }).set('judge2',r=>r.bool).set('callback',()=>{ - const evtx=event.getParent(); - const evt=event.getParent(evtx.eventName).getTrigger(); - if(!evt.source.isIn()||!evt.card||typeof get.number(evt.card)!=='number') return; - if(event.judgeResult.number>get.number(evt.card)){ - const sha=new lib.element.VCard({name:'sha'}),target=evt.source; - if(player.canUse(sha,target,false,false)){ - player.useCard(sha,target,false); - } - } - }) - .set('eventName',event.name) - } - }, - dcanjing:{ - audio:2, - trigger:{source:'damageSource'}, - filter(event,player){ - return game.hasPlayer(current=>current.isDamaged()); + return get.effect(event.source, { name: "sha" }, player, player) >= 0; }, - usable:1, - direct:true, - async content(event,trigger,player){ - const maxCount=player.getAllHistory('useSkill',evt=>evt.skill==='dcanjing').length+1; - const result=await player.chooseTarget(get.prompt2('dcanjing'),(card,player,target)=>target.isDamaged(),[1,maxCount]) - .set('ai',target=>{ - return get.attitude(get.player(),target)>0; + logTarget: "player", + async content(event, trigger, player) { + player + .judge((card) => { + const evt = get.event().getParent(get.event("eventName")).getTrigger(); + if (!evt.source.isIn() || !evt.card || typeof get.number(evt.card) !== "number") + return 0; + if (get.number(card) > get.number(evt.card)) return 1.5; + return 0; + }) + .set("judge2", (r) => r.bool) + .set("callback", () => { + const evtx = event.getParent(); + const evt = event.getParent(evtx.eventName).getTrigger(); + if (!evt.source.isIn() || !evt.card || typeof get.number(evt.card) !== "number") + return; + if (event.judgeResult.number > get.number(evt.card)) { + const sha = new lib.element.VCard({ name: "sha" }), + target = evt.source; + if (player.canUse(sha, target, false, false)) { + player.useCard(sha, target, false); + } + } + }) + .set("eventName", event.name); + }, + }, + dcanjing: { + audio: 2, + trigger: { source: "damageSource" }, + filter(event, player) { + return game.hasPlayer((current) => current.isDamaged()); + }, + usable: 1, + direct: true, + async content(event, trigger, player) { + const maxCount = + player.getAllHistory("useSkill", (evt) => evt.skill === "dcanjing").length + 1; + const result = await player + .chooseTarget(get.prompt2("dcanjing"), (card, player, target) => target.isDamaged(), [ + 1, + maxCount, + ]) + .set("ai", (target) => { + return get.attitude(get.player(), target) > 0; }) .forResult(); - if(!result.bool) return player.storage.counttrigger.dcanjing--; - const targets=result.targets.slice(); + if (!result.bool) return player.storage.counttrigger.dcanjing--; + const targets = result.targets.slice(); targets.sortBySeat(_status.currentPhase); - player.logSkill('dcanjing',targets); - for(const target of targets) await target.draw(); - const minHp=targets.map(i=>i.getHp()).sort((a,b)=>a-b)[0]; + player.logSkill("dcanjing", targets); + for (const target of targets) await target.draw(); + const minHp = targets.map((i) => i.getHp()).sort((a, b) => a - b)[0]; await game.asyncDelayx(); - for(const target of targets){ - if(!target.isIn()) continue; - if(target.getHp()===minHp) await target.recover(); + for (const target of targets) { + if (!target.isIn()) continue; + if (target.getHp() === minHp) await target.recover(); } - } + }, }, //诸葛梦雪 - dcjichun:{ - audio:2, - enable:'phaseUse', - filter(event,player){ - return player.countCards('he',card=>lib.skill.dcjichun.filterCard(card,player)); + dcjichun: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return player.countCards("he", (card) => lib.skill.dcjichun.filterCard(card, player)); }, - filterCard(card,player){ - if(!get.cardNameLength(card)||ui.selected.cards.length) return false; - if(game.hasPlayer(target=>{ - return target.countCards('h'){ - return target.countCards('h')>player.countCards('h')&&target.countDiscardableCards(player,'hej'); - })) return true; + filterCard(card, player) { + if (!get.cardNameLength(card) || ui.selected.cards.length) return false; + if ( + game.hasPlayer((target) => { + return target.countCards("h") < player.countCards("h"); + }) + ) + return true; + if ( + lib.filter.cardDiscardable(card, player) && + game.hasPlayer((target) => { + return ( + target.countCards("h") > player.countCards("h") && + target.countDiscardableCards(player, "hej") + ); + }) + ) + return true; return false; }, - selectCard:[1,2], - filterTarget(cardx,player,target){ - if(!ui.selected.cards.length) return false; - const card=ui.selected.cards[0]; - if(target.countCards('h')player.countCards('h')&&target.countDiscardableCards(player,'hej')) return true; + selectCard: [1, 2], + filterTarget(cardx, player, target) { + if (!ui.selected.cards.length) return false; + const card = ui.selected.cards[0]; + if (target.countCards("h") < player.countCards("h")) return true; + if ( + lib.filter.cardDiscardable(card, player) && + target.countCards("h") > player.countCards("h") && + target.countDiscardableCards(player, "hej") + ) + return true; return false; }, - usable:1, - position:'he', - check(card){ + usable: 1, + position: "he", + check(card) { return get.cardNameLength(card); }, - complexCard:true, - complexSelect:true, - lose:false, - discard:false, - delay:false, - targetprompt(){ - const target=ui.selected.targets[0],player=get.event('player'); - return target.countCards('h')get.type(card)=='equip'&&!get.cardtag(card,'gifts')); - if(!card){ - player.chat('无牌可得?!'); - game.log('但是牌堆已经没有装备牌了!'); + dchanying: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + frequent: true, + async content(event, trigger, player) { + const card = get.cardPile( + (card) => get.type(card) == "equip" && !get.cardtag(card, "gifts") + ); + if (!card) { + player.chat("无牌可得?!"); + game.log("但是牌堆已经没有装备牌了!"); return; } - await player.showCards([card],get.translation(player)+'发动了【寒英】'); - if(game.hasPlayer(target=>target.countCards('h')==player.countCards('h')&&target.hasUseTarget(card))){ - const {result:{bool,targets}}=await player.chooseTarget('请选择使用'+get.translation(card)+'的目标角色',(card,player,target)=>{ - return target.countCards('h')==player.countCards('h')&&target.hasUseTarget(get.event('card')); - },true).set('ai',target=>get.effect(target,get.event('card'),target,get.event('player'))).set('card',card); - if(bool){ - const target=targets[0]; + await player.showCards([card], get.translation(player) + "发动了【寒英】"); + if ( + game.hasPlayer( + (target) => + target.countCards("h") == player.countCards("h") && target.hasUseTarget(card) + ) + ) { + const { + result: { bool, targets }, + } = await player + .chooseTarget( + "请选择使用" + get.translation(card) + "的目标角色", + (card, player, target) => { + return ( + target.countCards("h") == player.countCards("h") && + target.hasUseTarget(get.event("card")) + ); + }, + true + ) + .set("ai", (target) => + get.effect(target, get.event("card"), target, get.event("player")) + ) + .set("card", card); + if (bool) { + const target = targets[0]; player.line(target); - target.chooseUseTarget(card,true,'nopopup'); + target.chooseUseTarget(card, true, "nopopup"); } - } - else{ - player.chat('无人可装?!'); - game.log('但是场上没有角色可以使用',card,'!'); + } else { + player.chat("无人可装?!"); + game.log("但是场上没有角色可以使用", card, "!"); } }, }, //柏灵筠 - dclinghui:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter(event,player){ - if(_status.currentPhase===player) return true; - return game.getGlobalHistory('everything',evt=>evt.name=='dying').length; + dclinghui: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + if (_status.currentPhase === player) return true; + return game.getGlobalHistory("everything", (evt) => evt.name == "dying").length; }, - frequent:true, - async content(event,trigger,player){ - let cards=get.cards(3); + frequent: true, + async content(event, trigger, player) { + let cards = get.cards(3); await game.cardsGotoOrdering(cards); - const {result:{bool,links}}=await player.chooseButton(['灵慧:是否使用其中的一张牌并随机获得其中一张剩余牌?',cards]).set('filterButton',button=>{ - return get.player().hasUseTarget(button.link); - }).set('ai',button=>{ - return get.event('player').getUseValue(button.link); - }); - if(bool){ - const card=links[0]; + const { + result: { bool, links }, + } = await player + .chooseButton(["灵慧:是否使用其中的一张牌并随机获得其中一张剩余牌?", cards]) + .set("filterButton", (button) => { + return get.player().hasUseTarget(button.link); + }) + .set("ai", (button) => { + return get.event("player").getUseValue(button.link); + }); + if (bool) { + const card = links[0]; cards.remove(card); - player.$gain2(card,false); + player.$gain2(card, false); await game.asyncDelayx(); - await player.chooseUseTarget(true,card,false); - cards=cards.filterInD(); - if(cards.length){ - const cardx=cards.randomRemove(); - await player.gain(cardx,'gain2'); + await player.chooseUseTarget(true, card, false); + cards = cards.filterInD(); + if (cards.length) { + const cardx = cards.randomRemove(); + await player.gain(cardx, "gain2"); } } - if(cards.length){ + if (cards.length) { cards.reverse(); - game.cardsGotoPile(cards.filterInD(),'insert'); - game.log(player,'将',get.cnNumber(cards.length),'张牌置于了牌堆顶'); + game.cardsGotoPile(cards.filterInD(), "insert"); + game.log(player, "将", get.cnNumber(cards.length), "张牌置于了牌堆顶"); } }, }, - dcxiace:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + dcxiace: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - filter(event,player){ - const bool1=(event.player==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='player')&&game.hasPlayer(target=>target!=player&&!target.hasSkill('fengyin'))); - const bool2=(event.source&&event.source==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='source')&&player.isDamaged()&&player.countCards('he',card=>{ - if(_status.connectMode&&get.position(card)=='h') return true; - return lib.filter.cardDiscardable(card,player); - })); - return bool1||bool2; - }, - direct:true, - async content(event,trigger,player){ - if(trigger.player==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='player')&&game.hasPlayer(target=>target!=player&&!target.hasSkill('fengyin'))){ - const {result:{bool,targets}}=await player.chooseTarget((card,player,target)=>{ - return target!=player&&!target.hasSkill('fengyin'); - }).set('prompt',get.prompt('dcxiace')).set('prompt2','令一名其他角色的非锁定技于本回合失效') - .set('ai',target=>{ - const player=get.event('player'); - return -get.sgn(get.attitude(player,target))*(target.getSkills(null,false,false).filter(skill=>{ - return !get.is.locked(skill); - }).length+1)*(target===_status.currentPhase?10:1); + filter(event, player) { + const bool1 = + event.player == player && + !player.hasHistory("custom", (evt) => evt.dcxiace == "player") && + game.hasPlayer((target) => target != player && !target.hasSkill("fengyin")); + const bool2 = + event.source && + event.source == player && + !player.hasHistory("custom", (evt) => evt.dcxiace == "source") && + player.isDamaged() && + player.countCards("he", (card) => { + if (_status.connectMode && get.position(card) == "h") return true; + return lib.filter.cardDiscardable(card, player); }); - if(bool){ - const target=targets[0]; - player.logSkill('dcxiace',target); - player.getHistory('custom').push({dcxiace:'player'}); - target.addTempSkill('fengyin'); + return bool1 || bool2; + }, + direct: true, + async content(event, trigger, player) { + if ( + trigger.player == player && + !player.hasHistory("custom", (evt) => evt.dcxiace == "player") && + game.hasPlayer((target) => target != player && !target.hasSkill("fengyin")) + ) { + const { + result: { bool, targets }, + } = await player + .chooseTarget((card, player, target) => { + return target != player && !target.hasSkill("fengyin"); + }) + .set("prompt", get.prompt("dcxiace")) + .set("prompt2", "令一名其他角色的非锁定技于本回合失效") + .set("ai", (target) => { + const player = get.event("player"); + return ( + -get.sgn(get.attitude(player, target)) * + (target.getSkills(null, false, false).filter((skill) => { + return !get.is.locked(skill); + }).length + + 1) * + (target === _status.currentPhase ? 10 : 1) + ); + }); + if (bool) { + const target = targets[0]; + player.logSkill("dcxiace", target); + player.getHistory("custom").push({ dcxiace: "player" }); + target.addTempSkill("fengyin"); } } - if(trigger.source&&trigger.source==player&&!player.hasHistory('custom',evt=>evt.dcxiace=='source')&&player.isDamaged()&&player.countCards('he',card=>{ - if(_status.connectMode&&get.position(card)=='h') return true; - return lib.filter.cardDiscardable(card,player); - })&&player.hasSkill('dcxiace')){ - const {result:{bool}}=await player.chooseToDiscard('he',get.prompt('dcxiace'),'弃置一张牌并回复1点体力').set('ai',card=>{ - const player=get.event('player'); - if(get.recoverEffect(player,player,player)<=0) return 0; - return 7-get.value(card); - }).set('logSkill','dcxiace'); - if(bool){ - player.getHistory('custom').push({dcxiace:'source'}); + if ( + trigger.source && + trigger.source == player && + !player.hasHistory("custom", (evt) => evt.dcxiace == "source") && + player.isDamaged() && + player.countCards("he", (card) => { + if (_status.connectMode && get.position(card) == "h") return true; + return lib.filter.cardDiscardable(card, player); + }) && + player.hasSkill("dcxiace") + ) { + const { + result: { bool }, + } = await player + .chooseToDiscard("he", get.prompt("dcxiace"), "弃置一张牌并回复1点体力") + .set("ai", (card) => { + const player = get.event("player"); + if (get.recoverEffect(player, player, player) <= 0) return 0; + return 7 - get.value(card); + }) + .set("logSkill", "dcxiace"); + if (bool) { + player.getHistory("custom").push({ dcxiace: "source" }); await player.recover(); } } }, }, - dcyuxin:{ - unique:true, - limited:true, - audio:2, - trigger:{global:'dying'}, - filter(event,player){ - return event.player.hp<(event.player==player?1:player.getHp()); + dcyuxin: { + unique: true, + limited: true, + audio: 2, + trigger: { global: "dying" }, + filter(event, player) { + return event.player.hp < (event.player == player ? 1 : player.getHp()); }, - prompt2(event,player){ - return '令其将体力值回复至'+(event.player==player?1:player.getHp())+'点'; + prompt2(event, player) { + return "令其将体力值回复至" + (event.player == player ? 1 : player.getHp()) + "点"; }, - check(event,player){ - if(get.recoverEffect(event.player,player,player)<=0) return false; - return lib.skill.luanfeng.check(event,player); + check(event, player) { + if (get.recoverEffect(event.player, player, player) <= 0) return false; + return lib.skill.luanfeng.check(event, player); }, - logTarget:'player', - skillAnimation:true, - animationColor:'thunder', - async content(event,trigger,player){ - player.awakenSkill('dcyuxin'); - trigger.player.recover((trigger.player==player?1:player.getHp())-trigger.player.hp); + logTarget: "player", + skillAnimation: true, + animationColor: "thunder", + async content(event, trigger, player) { + player.awakenSkill("dcyuxin"); + trigger.player.recover( + (trigger.player == player ? 1 : player.getHp()) - trigger.player.hp + ); }, }, //清河公主 - dczhangji:{ - audio:2, - trigger:{global:'useCard'}, - filter:function(event,player){ - return event.targets&&event.targets.length>1&&event.targets.includes(player); + dczhangji: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + return event.targets && event.targets.length > 1 && event.targets.includes(player); }, - forced:true, - logTarget:'player', - content:function*(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.player; - let targets=trigger.targets.slice(); - targets.sortBySeat((_status.currentPhase||target)); + forced: true, + logTarget: "player", + content: function* (event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.player; + let targets = trigger.targets.slice(); + targets.sortBySeat(_status.currentPhase || target); targets.remove(player); - player.when({global:'useCardToTargeted'}).filter(evt=>targets.length&&evt.getParent()==trigger&&evt.targets.length==evt.getParent().triggeredTargets4.length).then(()=>{ - trigger.getParent().targets=[player].concat(targets); - trigger.getParent().triggeredTargets4=[player].concat(targets); - }).vars({targets:targets}); - player.when({target:['useCardToEnd','useCardToExcluded']}).filter(evt=>targets.length&&evt.getParent()==trigger).then(()=>{ - player.draw(targets.length); - }).vars({targets:targets}); + player + .when({ global: "useCardToTargeted" }) + .filter( + (evt) => + targets.length && + evt.getParent() == trigger && + evt.targets.length == evt.getParent().triggeredTargets4.length + ) + .then(() => { + trigger.getParent().targets = [player].concat(targets); + trigger.getParent().triggeredTargets4 = [player].concat(targets); + }) + .vars({ targets: targets }); + player + .when({ target: ["useCardToEnd", "useCardToExcluded"] }) + .filter((evt) => targets.length && evt.getParent() == trigger) + .then(() => { + player.draw(targets.length); + }) + .vars({ targets: targets }); }, }, - dczengou:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.maxHp>0&&player.countCards('he')>0; + dczengou: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.maxHp > 0 && player.countCards("he") > 0; }, - filterCard:true, - selectCard:()=>[1,_status.event.player.maxHp], - position:'he', - filterTarget:lib.filter.notMe, - discard:false, - lose:false, - delay:false, - usable:1, - check:function(card){ - if(card.name=='tao'||card.name=='jiu') return 0; - return 1/(get.value(card)||0.5); + filterCard: true, + selectCard: () => [1, _status.event.player.maxHp], + position: "he", + filterTarget: lib.filter.notMe, + discard: false, + lose: false, + delay: false, + usable: 1, + check: function (card) { + if (card.name == "tao" || card.name == "jiu") return 0; + return 1 / (get.value(card) || 0.5); }, - content:function*(event,map){ - const player=map.player,cards=event.cards,target=event.target; - yield player.give(cards,target).gaintag.add('dczengou_debuff'); + content: function* (event, map) { + const player = map.player, + cards = event.cards, + target = event.target; + yield player.give(cards, target).gaintag.add("dczengou_debuff"); yield player.draw(cards.length); - target.addSkill('dczengou_debuff'); + target.addSkill("dczengou_debuff"); }, - ai:{ - order:10, - result:{target:-1}, + ai: { + order: 10, + result: { target: -1 }, }, - subSkill:{ - debuff:{ - charlotte:true, - mark:true, - intro:{content:'下次体力值增加或使用牌结算完毕后展示所有手牌,然后失去手牌中“谮构”牌数的体力值'}, - trigger:{player:['changeHp','useCardAfter']}, - filter:function(event,player){ - return event.name=='useCard'||event.num>0; + subSkill: { + debuff: { + charlotte: true, + mark: true, + intro: { + content: + "下次体力值增加或使用牌结算完毕后展示所有手牌,然后失去手牌中“谮构”牌数的体力值", }, - forced:true, - popup:false, - content:function(){ - player.removeSkill('dczengou_debuff'); - const cards=player.getCards('h',card=>card.hasGaintag('dczengou_debuff')); + trigger: { player: ["changeHp", "useCardAfter"] }, + filter: function (event, player) { + return event.name == "useCard" || event.num > 0; + }, + forced: true, + popup: false, + content: function () { + player.removeSkill("dczengou_debuff"); + const cards = player.getCards("h", (card) => card.hasGaintag("dczengou_debuff")); player.showHandcards(); - if(cards.length) player.loseHp(cards.length); + if (cards.length) player.loseHp(cards.length); }, - mod:{ - aiValue:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dczengou_debuff')) return -1; + mod: { + aiValue: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dczengou_debuff")) + return -1; }, - aiUseful:function(){ - return lib.skill.dczengou.subSkill.debuff.mod.aiValue.apply(this,arguments); + aiUseful: function () { + return lib.skill.dczengou.subSkill.debuff.mod.aiValue.apply(this, arguments); }, - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dczengou_debuff')){ - const cards=player.getCards('h',card=>card.hasGaintag('dczengou_debuff')); - if(cards.length==1) return num+10; + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dczengou_debuff")) { + const cards = player.getCards("h", (card) => + card.hasGaintag("dczengou_debuff") + ); + if (cards.length == 1) return num + 10; return 0; } }, @@ -1557,1172 +2124,1631 @@ game.import('character', function () { }, }, //曹宪 - dclingxi:{ - audio:2, - trigger:{player:['phaseUseBegin','phaseUseEnd']}, - filter:function(event,player){ - return player.countCards('he')&&player.maxHp>0; + dclingxi: { + audio: 2, + trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, + filter: function (event, player) { + return player.countCards("he") && player.maxHp > 0; }, - direct:true, - content:function*(event,map){ - var player=map.player,num=player.maxHp; - var result=yield player.chooseCard(get.prompt('dclingxi'),'将至多'+get.cnNumber(num)+'张牌称为“翼”置于武将牌上','he',[1,num]).set('ai',card=>{ - let player=_status.event.player,dis=player.needsToDiscard(0,(i,player)=>{ - return !player.canIgnoreHandcard(i)&&!ui.selected.cards.includes(i); - }), - cards=ui.selected.cards.concat(player.getExpansions('dclingxi')), - suit=get.suit(card,false); - if(_status.event.suits.length<4) _status.event.suits.add(get.suit(ui.selected.cards.at(-1),false)); - if(_status.event.triggerName==='phaseUseEnd'){ - if(_status.event.suits.includes(suit)) return (dis?10:3)-get.useful(card); - return (dis?6:1)-get.useful(card); - } - _status.event.hvt.remove(ui.selected.cards.at(-1)); - if(_status.event.hvt.length===1&&card===_status.event.hvt[0]) return 0; - let temp; - if(!cards.some(i=>{ - temp=get.suit(i,false); - return cards.some(j=>{ - return i!==j&&suit===get.suit(j,false); - }); - })&&suit===temp) return 15-get.value(card); - if(!_status.event.hvt.length){ - if(_status.event.suits.includes(suit)) return (dis?10:3)-get.useful(card); - return (dis?6:1)-get.useful(card); - } - if(_status.event.hvt.includes(card)){ - if(!_status.event.suits.includes(suit)) return 6-get.value(card); - if(card.name==='sha') return 3-get.value(card); - return 1-get.value(card); - } - return 15-get.value(card); - }).set('complexCard',true).set('hvt',player.getCards('hs',card=>{ - return card.name==='zhuge'||player.hasValueTarget(card,null,true); - })).set('suits',(()=>{ - let suits=[]; - player.getExpansions('dclingxi').forEach(i=>{ - suits.add(get.suit(i,false)); - }); - return suits; - })()).set('triggerName',event.triggername); - if(result.bool){ - player.logSkill('dclingxi'); - player.addToExpansion(result.cards,player,'give').gaintag.add('dclingxi'); + direct: true, + content: function* (event, map) { + var player = map.player, + num = player.maxHp; + var result = yield player + .chooseCard( + get.prompt("dclingxi"), + "将至多" + get.cnNumber(num) + "张牌称为“翼”置于武将牌上", + "he", + [1, num] + ) + .set("ai", (card) => { + let player = _status.event.player, + dis = player.needsToDiscard(0, (i, player) => { + return !player.canIgnoreHandcard(i) && !ui.selected.cards.includes(i); + }), + cards = ui.selected.cards.concat(player.getExpansions("dclingxi")), + suit = get.suit(card, false); + if (_status.event.suits.length < 4) + _status.event.suits.add(get.suit(ui.selected.cards.at(-1), false)); + if (_status.event.triggerName === "phaseUseEnd") { + if (_status.event.suits.includes(suit)) + return (dis ? 10 : 3) - get.useful(card); + return (dis ? 6 : 1) - get.useful(card); + } + _status.event.hvt.remove(ui.selected.cards.at(-1)); + if (_status.event.hvt.length === 1 && card === _status.event.hvt[0]) return 0; + let temp; + if ( + !cards.some((i) => { + temp = get.suit(i, false); + return cards.some((j) => { + return i !== j && suit === get.suit(j, false); + }); + }) && + suit === temp + ) + return 15 - get.value(card); + if (!_status.event.hvt.length) { + if (_status.event.suits.includes(suit)) + return (dis ? 10 : 3) - get.useful(card); + return (dis ? 6 : 1) - get.useful(card); + } + if (_status.event.hvt.includes(card)) { + if (!_status.event.suits.includes(suit)) return 6 - get.value(card); + if (card.name === "sha") return 3 - get.value(card); + return 1 - get.value(card); + } + return 15 - get.value(card); + }) + .set("complexCard", true) + .set( + "hvt", + player.getCards("hs", (card) => { + return card.name === "zhuge" || player.hasValueTarget(card, null, true); + }) + ) + .set( + "suits", + (() => { + let suits = []; + player.getExpansions("dclingxi").forEach((i) => { + suits.add(get.suit(i, false)); + }); + return suits; + })() + ) + .set("triggerName", event.triggername); + if (result.bool) { + player.logSkill("dclingxi"); + player.addToExpansion(result.cards, player, "give").gaintag.add("dclingxi"); } }, - marktext:'翼', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "翼", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'dclingxi_effect', - subSkill:{ - effect:{ - audio:'dclingxi', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter'], + group: "dclingxi_effect", + subSkill: { + effect: { + audio: "dclingxi", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter"], }, - filter:function(event,player){ - var num=2*player.getExpansions('dclingxi').reduce((list,card)=>list.add(get.suit(card,false)),[]).length; - num-=player.countCards('h'); - if(!num) return false; - if(event.name=='lose'&&event.getlx!==false){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('dclingxi')) return true; + filter: function (event, player) { + var num = + 2 * + player + .getExpansions("dclingxi") + .reduce((list, card) => list.add(get.suit(card, false)), []).length; + num -= player.countCards("h"); + if (!num) return false; + if (event.name == "lose" && event.getlx !== false) { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("dclingxi")) return true; } return false; } - return game.getGlobalHistory('cardMove',function(evt){ - if(evt.name!='lose'||event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dclingxi')&&evt.player==player) return true; + return game.getGlobalHistory("cardMove", function (evt) { + if (evt.name != "lose" || event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dclingxi") && evt.player == player) + return true; } return false; }).length; }, - forced:true, - locked:false, - content:function(){ - var num=2*player.getExpansions('dclingxi').reduce((list,card)=>list.add(get.suit(card,false)),[]).length; - num-=player.countCards('h'); - if(num>0) player.draw(num); - else player.chooseToDiscard('h',-num,true); + forced: true, + locked: false, + content: function () { + var num = + 2 * + player + .getExpansions("dclingxi") + .reduce((list, card) => list.add(get.suit(card, false)), []).length; + num -= player.countCards("h"); + if (num > 0) player.draw(num); + else player.chooseToDiscard("h", -num, true); }, }, }, - ai:{ - combo:'dczhifou' - } - }, - dczhifou:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - var num=player.getHistory('useSkill',evt=>evt.skill=='dczhifou').length+1; - return player.getExpansions('dclingxi').length>=num; + ai: { + combo: "dczhifou", }, - direct:true, - content:function*(event,map){ - var player=map.player,cards=player.getExpansions('dclingxi'); - var num=player.getHistory('useSkill',evt=>evt.skill=='dczhifou').length+1; - var result=yield player.chooseButton(['###'+get.prompt('dczhifou')+'###移去至少'+get.cnNumber(num)+'张武将牌上的“翼”',cards],[num,cards.length]).set('ai',button=>{ - if(!_status.event.res.bool) return 0; - if(_status.event.res.cards.includes(button.link)) return 1; - return 0; - }).set('num',num).set('res',(()=>{ - if(player.isPhaseUsing()&&player.hasCard(i=>{ - return player.hasValueTarget(i,null,true); - },'h')) return false; - let suits=[],cs=player.getExpansions('dclingxi'),cards=[],temp=num; - for(let i=0;i0){ - cards.push(cs.pop()); - temp--; - } - temp=suits.length*2-player.countCards('h'); - if(temp>0||!temp&&num evt.skill == "dczhifou").length + 1; + return player.getExpansions("dclingxi").length >= num; + }, + direct: true, + content: function* (event, map) { + var player = map.player, + cards = player.getExpansions("dclingxi"); + var num = player.getHistory("useSkill", (evt) => evt.skill == "dczhifou").length + 1; + var result = yield player + .chooseButton( + [ + "###" + + get.prompt("dczhifou") + + "###移去至少" + + get.cnNumber(num) + + "张武将牌上的“翼”", + cards, + ], + [num, cards.length] + ) + .set("ai", (button) => { + if (!_status.event.res.bool) return 0; + if (_status.event.res.cards.includes(button.link)) return 1; + return 0; + }) + .set("num", num) + .set( + "res", + (() => { + if ( + player.isPhaseUsing() && + player.hasCard((i) => { + return player.hasValueTarget(i, null, true); + }, "h") + ) + return false; + let suits = [], + cs = player.getExpansions("dclingxi"), + cards = [], + temp = num; + for (let i = 0; i < cs.length; i++) { + if (!temp) break; + let suit = get.suit(cs[i], false); + if (suits.includes(suit)) { + cards.push(cs.splice(i--, 1)[0]); + temp--; + } else suits.push(suit); + } + while (temp > 0) { + cards.push(cs.pop()); + temp--; + } + temp = suits.length * 2 - player.countCards("h"); + if (temp > 0 || (!temp && num < Math.max(2, 5 - player.hp))) cs = true; + else cs = false; + return { + bool: cs, + cards: cards, + }; + })() + ); + if (result.bool) { + player.logSkill("dczhifou"); player.loseToDiscardpile(result.links); - var list=[],choiceList=[ - '将一张牌称为“翼”置于你的武将牌上', - '弃置两张牌', - '失去1点体力', - ]; - if(!player.hasSkill('dczhifou_0')&&game.hasPlayer(target=>target.countCards('he'))) list.push('置入“翼”'); - else choiceList[0]=''+choiceList[0]+''; - if(!player.hasSkill('dczhifou_1')&&game.hasPlayer(target=>{ - return target==player?target.countDiscardableCards(target,'he'):target.countCards('he'); - })) list.push('弃置卡牌'); - else choiceList[1]=''+choiceList[1]+''; - if(!player.hasSkill('dczhifou_2')) list.push('失去体力'); - else choiceList[2]=''+choiceList[2]+''; - if(!list.length) return; - var str=''; - for(var i of list){ - str+=i; - str+='、'; + var list = [], + choiceList = ["将一张牌称为“翼”置于你的武将牌上", "弃置两张牌", "失去1点体力"]; + if ( + !player.hasSkill("dczhifou_0") && + game.hasPlayer((target) => target.countCards("he")) + ) + list.push("置入“翼”"); + else choiceList[0] = '' + choiceList[0] + ""; + if ( + !player.hasSkill("dczhifou_1") && + game.hasPlayer((target) => { + return target == player + ? target.countDiscardableCards(target, "he") + : target.countCards("he"); + }) + ) + list.push("弃置卡牌"); + else choiceList[1] = '' + choiceList[1] + ""; + if (!player.hasSkill("dczhifou_2")) list.push("失去体力"); + else choiceList[2] = '' + choiceList[2] + ""; + if (!list.length) return; + var str = ""; + for (var i of list) { + str += i; + str += "、"; } - str=str.slice(0,-1); - var result2=yield player.chooseTarget('知否:令一名角色执行以下一项',str,(card,player,target)=>{ - if(!player.hasSkill('dczhifou_2')) return true; - if(!player.hasSkill('dczhifou_0')&&target.countCards('he')) return true; - return target==player?target.countDiscardableCards(target,'he'):target.countCards('he'); - },true).set('ai',target=>{ - var player=_status.event.player,list=[]; - if(!player.hasSkill('dczhifou_0')) list.push(get.effect(target,{name:'guohe_copy2'},target,player)/2); - if(!player.hasSkill('dczhifou_1')) list.push(get.effect(target,{name:'guohe_copy2'},target,player)); - if(!player.hasSkill('dczhifou_2')) list.push(get.effect(target,{name:'losehp'},player,player)); - return list.sort((a,b)=>b-a)[0]; - }); - if(result2.bool){ - var target=result2.targets[0]; + str = str.slice(0, -1); + var result2 = yield player + .chooseTarget( + "知否:令一名角色执行以下一项", + str, + (card, player, target) => { + if (!player.hasSkill("dczhifou_2")) return true; + if (!player.hasSkill("dczhifou_0") && target.countCards("he")) + return true; + return target == player + ? target.countDiscardableCards(target, "he") + : target.countCards("he"); + }, + true + ) + .set("ai", (target) => { + var player = _status.event.player, + list = []; + if (!player.hasSkill("dczhifou_0")) + list.push( + get.effect(target, { name: "guohe_copy2" }, target, player) / 2 + ); + if (!player.hasSkill("dczhifou_1")) + list.push(get.effect(target, { name: "guohe_copy2" }, target, player)); + if (!player.hasSkill("dczhifou_2")) + list.push(get.effect(target, { name: "losehp" }, player, player)); + return list.sort((a, b) => b - a)[0]; + }); + if (result2.bool) { + var target = result2.targets[0]; player.line(target); - list=list.filter(control=>{ - if(control=='失去体力') return true; - if(control=='置入“翼”'&&target.countCards('he')) return true; - return target.countDiscardableCards(target,'he'); + list = list.filter((control) => { + if (control == "失去体力") return true; + if (control == "置入“翼”" && target.countCards("he")) return true; + return target.countDiscardableCards(target, "he"); }); var result3; - if(!list.length){ - game.log(target,'没有可执行项'); + if (!list.length) { + game.log(target, "没有可执行项"); return; - } - else if(list.length==1) result3={control:list[0]}; - else result3=yield player.chooseControl(list).set('prompt','知否:请选择一项').set('choiceList',choiceList.map(str=>'令'+get.translation(target)+str)).set('ai',()=>{ - var player=_status.event.player; - var target=_status.event.target; - var getNum=function(control){ - return [ - get.effect(target,{name:'guohe_copy2'},target,player)/2, - get.effect(target,{name:'guohe_copy2'},target,player), - get.effect(target,{name:'losehp'},target,player), - ][['置入“翼”','弃置卡牌','失去体力'].indexOf(control)]; - }; - var controls=_status.event.controls.slice(); - return controls.sort((a,b)=>getNum(b)-getNum(a))[0]; - }).set('target',target); - switch(result3.control){ - case '置入“翼”': - player.addTempSkill('dczhifou_0'); - var result4=yield target.chooseCard('he',choiceList[0],true); - if(result4.bool) player.addToExpansion(result4.cards,target,'give').gaintag.add('dclingxi'); + } else if (list.length == 1) result3 = { control: list[0] }; + else + result3 = yield player + .chooseControl(list) + .set("prompt", "知否:请选择一项") + .set( + "choiceList", + choiceList.map((str) => "令" + get.translation(target) + str) + ) + .set("ai", () => { + var player = _status.event.player; + var target = _status.event.target; + var getNum = function (control) { + return [ + get.effect(target, { name: "guohe_copy2" }, target, player) / + 2, + get.effect(target, { name: "guohe_copy2" }, target, player), + get.effect(target, { name: "losehp" }, target, player), + ][["置入“翼”", "弃置卡牌", "失去体力"].indexOf(control)]; + }; + var controls = _status.event.controls.slice(); + return controls.sort((a, b) => getNum(b) - getNum(a))[0]; + }) + .set("target", target); + switch (result3.control) { + case "置入“翼”": + player.addTempSkill("dczhifou_0"); + var result4 = yield target.chooseCard("he", choiceList[0], true); + if (result4.bool) + player + .addToExpansion(result4.cards, target, "give") + .gaintag.add("dclingxi"); break; - case '弃置卡牌': - player.addTempSkill('dczhifou_1'); - target.chooseToDiscard('he',2,true); + case "弃置卡牌": + player.addTempSkill("dczhifou_1"); + target.chooseToDiscard("he", 2, true); break; - case '失去体力': - player.addTempSkill('dczhifou_2'); + case "失去体力": + player.addTempSkill("dczhifou_2"); target.loseHp(); break; } } } }, - subSkill:{ - '0':{charlotte:true}, - '1':{charlotte:true}, - '2':{charlotte:true}, + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + 2: { charlotte: true }, + }, + ai: { + combo: "dclingxi", }, - ai:{ - combo:'dclingxi' - } }, //周瑜 //无 双 万 军 取 首 - dcsbronghuo:{ - audio:2, - trigger:{player:'useCard1'}, - filter:function(event,player){ - return (event.card.name=='sha'&&game.hasNature(event.card,'fire'))||event.card.name=='huogong'; + dcsbronghuo: { + audio: 2, + trigger: { player: "useCard1" }, + filter: function (event, player) { + return ( + (event.card.name == "sha" && game.hasNature(event.card, "fire")) || + event.card.name == "huogong" + ); }, - forced:true, - content:function(){ - trigger.baseDamage=game.countGroup(); + forced: true, + content: function () { + trigger.baseDamage = game.countGroup(); }, - ai:{threaten:3.5}, + ai: { threaten: 3.5 }, }, - dcsbyingmou:{ - mark:true, - marktext:'☯', - zhuanhuanji:true, - intro:{ - content:function(storage){ - if(!storage) return '每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】。' - return '每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。'; + dcsbyingmou: { + mark: true, + marktext: "☯", + zhuanhuanji: true, + intro: { + content: function (storage) { + if (!storage) + return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】。"; + return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。"; }, }, - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.isFirstTarget && event.targets.some(target => target != player); + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.isFirstTarget && event.targets.some((target) => target != player); }, - usable:1, - direct:true, - content:function*(event,map){ - var result,player=map.player,targets=map.trigger.targets; - var storage=player.storage.dcsbyingmou; - if(storage){ - result=yield player.chooseCardTarget({ - prompt:get.prompt('dcsbyingmou'), - prompt2:'选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)', - filterTarget:function(card,player,target){ - if(!ui.selected.targets.length) return _status.event.targets.includes(target); - return target.isMaxHandcard(); - }, - selectTarget:2, - complexSelect:true, - complexTarget:true, - multitarget:true, - targetprompt:['目标角色','使用角色'], - filterCard:()=>false, - selectCard:-1, - ai2:function(target){ - var player=_status.event.player; - var getNum=function(player,target,source){ - return player.getCards('h',card=>{ - if(get.name(card)!='sha'&&(get.type(card)!='trick'||!get.tag(card,'damage'))) return false; - return player.canUse(card,target,false); - }).reduce((sum,card)=>sum+get.effect(target,card,player,source),0); - }; - if(!ui.selected.targets.length){ - var targets=game.filterPlayer(target=>target.isMaxHandcard()); - targets.sort((a,b)=>getNum(b,target,player)-getNum(a,target,player)); - return getNum(targets[0],target,player)+1; - } - return getNum(target,ui.selected.targets[0],player)+1; - }, - }).set('targets',targets); - } - else result=yield player.chooseTarget(get.prompt('dcsbyingmou'),'选择一名目标角色,将手牌数摸至与其相同,然后视为对其使用一张【火攻】',(card,player,target)=>_status.event.targets.includes(target)).set('ai',target=>{ - var player=_status.event.player; - return Math.max(0,Math.min(5,target.countCards('h')-player.countCards('h')))*2+get.effect(target,{name:'huogong'},player,player); - }).set('targets',targets); - if(result.bool){ - var target=result.targets[0]; - if(storage){ - player.logSkill('dcsbyingmou',result.targets,false); + usable: 1, + direct: true, + content: function* (event, map) { + var result, + player = map.player, + targets = map.trigger.targets; + var storage = player.storage.dcsbyingmou; + if (storage) { + result = yield player + .chooseCardTarget({ + prompt: get.prompt("dcsbyingmou"), + prompt2: + "选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)", + filterTarget: function (card, player, target) { + if (!ui.selected.targets.length) + return _status.event.targets.includes(target); + return target.isMaxHandcard(); + }, + selectTarget: 2, + complexSelect: true, + complexTarget: true, + multitarget: true, + targetprompt: ["目标角色", "使用角色"], + filterCard: () => false, + selectCard: -1, + ai2: function (target) { + var player = _status.event.player; + var getNum = function (player, target, source) { + return player + .getCards("h", (card) => { + if ( + get.name(card) != "sha" && + (get.type(card) != "trick" || !get.tag(card, "damage")) + ) + return false; + return player.canUse(card, target, false); + }) + .reduce( + (sum, card) => sum + get.effect(target, card, player, source), + 0 + ); + }; + if (!ui.selected.targets.length) { + var targets = game.filterPlayer((target) => target.isMaxHandcard()); + targets.sort( + (a, b) => getNum(b, target, player) - getNum(a, target, player) + ); + return getNum(targets[0], target, player) + 1; + } + return getNum(target, ui.selected.targets[0], player) + 1; + }, + }) + .set("targets", targets); + } else + result = yield player + .chooseTarget( + get.prompt("dcsbyingmou"), + "选择一名目标角色,将手牌数摸至与其相同,然后视为对其使用一张【火攻】", + (card, player, target) => _status.event.targets.includes(target) + ) + .set("ai", (target) => { + var player = _status.event.player; + return ( + Math.max( + 0, + Math.min(5, target.countCards("h") - player.countCards("h")) + ) * + 2 + + get.effect(target, { name: "huogong" }, player, player) + ); + }) + .set("targets", targets); + if (result.bool) { + var target = result.targets[0]; + if (storage) { + player.logSkill("dcsbyingmou", result.targets, false); player.line2(result.targets); - player.changeZhuanhuanji('dcsbyingmou'); - var source=result.targets[1],discard=true; - while(true){ - var cards=source.getCards('h',card=>{ - if(get.name(card)!='sha'&&(get.type(card)!='trick'||!get.tag(card,'damage'))) return false; - return source.canUse(card,target,false); + player.changeZhuanhuanji("dcsbyingmou"); + var source = result.targets[1], + discard = true; + while (true) { + var cards = source.getCards("h", (card) => { + if ( + get.name(card) != "sha" && + (get.type(card) != "trick" || !get.tag(card, "damage")) + ) + return false; + return source.canUse(card, target, false); }); - if(cards.length){ - if(discard) discard=false; - yield source.useCard(cards.randomGet(),target,false); - } - else break; + if (cards.length) { + if (discard) discard = false; + yield source.useCard(cards.randomGet(), target, false); + } else break; } - if(discard&&player.countCards('h')evt==trigger&&player.countCards('h')).then(()=>{ - var str='明势:请展示三张牌并令一名其他角色选择获得其中的一张牌'; - if(player.countCards('h')<=3) str='明势:展示手牌并令一名其他角色选择获得其中的一张牌'; - player.chooseCardTarget({ - prompt:str, - filterTarget:lib.filter.notMe, - filterCard:true, - selectCard:function(){ - var player=_status.event.player; - if(player.countCards('h')<=3) return -1; - return 3; - }, - position:'h', - forced:true, - ai1:function(card){ - return -get.value(card); - }, - ai2:function(target){ - var player=_status.event.player; - if(player.hasSkill('dcsbmengmou')&&!get.is.blocked('dcsbmengmou',player)&&player.storage.dcsbmengmou&&get.attitude(player,target)<0) return get.effect(target,{name:'losehp'},player,player); - return get.attitude(player,target); - }, + frequent: true, + content: function () { + trigger.num += 2; + player + .when("phaseDrawEnd") + .filter((evt, player) => evt == trigger && player.countCards("h")) + .then(() => { + var str = "明势:请展示三张牌并令一名其他角色选择获得其中的一张牌"; + if (player.countCards("h") <= 3) + str = "明势:展示手牌并令一名其他角色选择获得其中的一张牌"; + player.chooseCardTarget({ + prompt: str, + filterTarget: lib.filter.notMe, + filterCard: true, + selectCard: function () { + var player = _status.event.player; + if (player.countCards("h") <= 3) return -1; + return 3; + }, + position: "h", + forced: true, + ai1: function (card) { + return -get.value(card); + }, + ai2: function (target) { + var player = _status.event.player; + if ( + player.hasSkill("dcsbmengmou") && + !get.is.blocked("dcsbmengmou", player) && + player.storage.dcsbmengmou && + get.attitude(player, target) < 0 + ) + return get.effect(target, { name: "losehp" }, player, player); + return get.attitude(player, target); + }, + }); + }) + .then(() => { + if (result.bool) { + var target = result.targets[0]; + event.target = target; + var cards = result.cards; + player.showCards(cards, get.translation(player) + "发动了【明势】"); + target + .chooseButton(["明势:请获得其中一张牌", cards], true) + .set("filterButton", (button) => { + return lib.filter.canBeGained( + button.link, + _status.event.source, + _status.event.player + ); + }) + .set("ai", (button) => get.value(button.link)) + .set("source", player); + } else event.finish(); + }) + .then(() => { + if (result.bool) { + var card = result.links[0]; + if (lib.filter.canBeGained(card, player, target)) + target.gain(card, player, "giveAuto"); + else game.log("但", card, "不能被", player, "获得!"); + } }); - }).then(()=>{ - if(result.bool){ - var target=result.targets[0]; - event.target=target; - var cards=result.cards; - player.showCards(cards,get.translation(player)+'发动了【明势】'); - target.chooseButton(['明势:请获得其中一张牌',cards],true).set('filterButton',button=>{ - return lib.filter.canBeGained(button.link,_status.event.source,_status.event.player); - }).set('ai',button=>get.value(button.link)).set('source',player); - } - else event.finish(); - }).then(()=>{ - if(result.bool){ - var card=result.links[0]; - if(lib.filter.canBeGained(card,player,target)) target.gain(card,player,'giveAuto'); - else game.log('但',card,'不能被',player,'获得!'); - } - }); }, }, - dcsbmengmou:{ - mark:true, - marktext:'☯', - zhuanhuanji:true, - intro:{ - content:function(storage){ - if(!storage) return '每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力。(X为你的体力上限)'; - return '每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)'; + dcsbmengmou: { + mark: true, + marktext: "☯", + zhuanhuanji: true, + intro: { + content: function (storage) { + if (!storage) + return "每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力。(X为你的体力上限)"; + return "每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)"; }, }, - audio:2, - trigger:{global:['gainAfter','loseAsyncAfter']}, - filter:function(event,player){ - if(typeof player.maxHp!='number'||player.maxHp<=0) return false; - if(event.name=='loseAsync'&&event.type!='gain') return false; - if(player.hasSkill('dcsbmengmou_true')&&player.hasSkill('dcsbmengmou_false')) return false; - var cards1=event.getl(player).cards2,cards2=event.getg(player); - return game.hasPlayer(function(current){ - if(current==player) return false; - var cardsx=event.getg(current); - return cardsx.some(i=>cards1.includes(i)); - })||game.hasPlayer(function(current){ - if(current==player) return false; - var cardsx=event.getl(current).cards2; - return cards2.some(i=>cardsx.includes(i)); - }); + audio: 2, + trigger: { global: ["gainAfter", "loseAsyncAfter"] }, + filter: function (event, player) { + if (typeof player.maxHp != "number" || player.maxHp <= 0) return false; + if (event.name == "loseAsync" && event.type != "gain") return false; + if (player.hasSkill("dcsbmengmou_true") && player.hasSkill("dcsbmengmou_false")) + return false; + var cards1 = event.getl(player).cards2, + cards2 = event.getg(player); + return ( + game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getg(current); + return cardsx.some((i) => cards1.includes(i)); + }) || + game.hasPlayer(function (current) { + if (current == player) return false; + var cardsx = event.getl(current).cards2; + return cards2.some((i) => cardsx.includes(i)); + }) + ); }, - direct:true, - content:function*(event,map){ - var player=map.player,trigger=map.trigger; - var storage=player.storage.dcsbmengmou; - player.addTempSkill('dcsbmengmou_effect','dcsbmengmouAfter'); - var targets=[],num=player.maxHp; - var cards1=trigger.getl(player).cards2; - var cards2=trigger.getg(player); - targets.addArray(game.filterPlayer(function(current){ - if(current==player) return false; - var cardsx=trigger.getg(current); - return cardsx.some(i=>cards1.includes(i)); - })); - targets.addArray(game.filterPlayer(function(current){ - if(current==player) return false; - var cardsx=trigger.getl(current).cards2; - return cards2.some(i=>cardsx.includes(i)); - })); + direct: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + var storage = player.storage.dcsbmengmou; + player.addTempSkill("dcsbmengmou_effect", "dcsbmengmouAfter"); + var targets = [], + num = player.maxHp; + var cards1 = trigger.getl(player).cards2; + var cards2 = trigger.getg(player); + targets.addArray( + game.filterPlayer(function (current) { + if (current == player) return false; + var cardsx = trigger.getg(current); + return cardsx.some((i) => cards1.includes(i)); + }) + ); + targets.addArray( + game.filterPlayer(function (current) { + if (current == player) return false; + var cardsx = trigger.getl(current).cards2; + return cards2.some((i) => cardsx.includes(i)); + }) + ); targets.sortBySeat(); - var check_true=function(player,target){ - if(get.attitude(player,target)>0){ - if(target.countCards('hs',card=>{ - if(get.name(card)!='sha') return false; - return target.hasValueTarget(card); - })) return 4; + var check_true = function (player, target) { + if (get.attitude(player, target) > 0) { + if ( + target.countCards("hs", (card) => { + if (get.name(card) != "sha") return false; + return target.hasValueTarget(card); + }) + ) + return 4; return 0.5; } - if(get.attitude(player,target)<0){ - if(!target.countCards('hs',card=>{ - if(get.name(card)!='sha') return false; - return target.hasValueTarget(card); - })){ - if(target.countCards('hs',card=>{ - if(get.name(card)!='sha') return false; - return target.hasUseTarget(card); - })) return -3; + if (get.attitude(player, target) < 0) { + if ( + !target.countCards("hs", (card) => { + if (get.name(card) != "sha") return false; + return target.hasValueTarget(card); + }) + ) { + if ( + target.countCards("hs", (card) => { + if (get.name(card) != "sha") return false; + return target.hasUseTarget(card); + }) + ) + return -3; return -1; } return 0; } return 0; }; - var check_false=function(player,target){ - if(get.attitude(player,target)<0) return get.effect(target,{name:'losehp'},player,player); + var check_false = function (player, target) { + if (get.attitude(player, target) < 0) + return get.effect(target, { name: "losehp" }, player, player); return 0; }; - var result,target; - if(targets.length==1){ - target=targets[0]; + var result, target; + if (targets.length == 1) { + target = targets[0]; var str; - if(storage) str='令'+get.translation(target)+'打出至多'+get.cnNumber(num)+'张【杀】,然后其失去Y点体力。(Y为'+num+'-其打出【杀】数)'; - else str='令'+get.translation(target)+'使用至多'+get.cnNumber(num)+'张【杀】,其每以此法造成1点伤害,其回复1点体力'; - result=yield player.chooseBool(get.prompt('dcsbmengmou',target),str).set('choice',(storage?check_false(player,target):check_true(player,target))>0); + if (storage) + str = + "令" + + get.translation(target) + + "打出至多" + + get.cnNumber(num) + + "张【杀】,然后其失去Y点体力。(Y为" + + num + + "-其打出【杀】数)"; + else + str = + "令" + + get.translation(target) + + "使用至多" + + get.cnNumber(num) + + "张【杀】,其每以此法造成1点伤害,其回复1点体力"; + result = yield player + .chooseBool(get.prompt("dcsbmengmou", target), str) + .set( + "choice", + (storage ? check_false(player, target) : check_true(player, target)) > 0 + ); + } else { + result = yield player + .chooseTarget( + get.prompt("dcsbmengmou"), + lib.skill.dcsbmengmou.intro.content(storage), + (card, player, target) => _status.event.targets.includes(target) + ) + .set("ai", (target) => { + return _status.event.check(_status.event.player, target); + }) + .set("targets", targets) + .set("check", storage ? check_false : check_true) + .set("ainmate", false); } - else{ - result=yield player.chooseTarget(get.prompt('dcsbmengmou'),lib.skill.dcsbmengmou.intro.content(storage),(card,player,target)=>_status.event.targets.includes(target)).set('ai',target=>{ - return _status.event.check(_status.event.player,target); - }).set('targets',targets).set('check',storage?check_false:check_true).set('ainmate',false); - } - if(result.bool){ - if(!target) target=result.targets[0]; - player.logSkill('dcsbmengmou',target); - player.addTempSkill('dcsbmengmou_'+(storage||false)); - player.changeZhuanhuanji('dcsbmengmou'); - while(num>0){ + if (result.bool) { + if (!target) target = result.targets[0]; + player.logSkill("dcsbmengmou", target); + player.addTempSkill("dcsbmengmou_" + (storage || false)); + player.changeZhuanhuanji("dcsbmengmou"); + while (num > 0) { num--; var result2; - if(storage){ - result2=yield target.chooseToRespond((card,player)=>{ - return get.name(card)=='sha'; - }).set('ai',card=>{ - return 1+Math.random(); - }).set('prompt','盟谋:是否打出一张【杀】?').set('prompt2','当前进度:'+(3-num)+'/3'); - } - else result2=yield target.chooseToUse(card=>{ - if(!lib.filter.cardEnabled(card,_status.event.player,_status.event)) return false; - return get.name(card)=='sha'; - }).set('prompt','盟谋:是否使用一张【杀】?').set('prompt2','当前进度:'+(3-num)+'/3'); - if(!result2.bool){ - if(storage){ - target.popup('杯具'); - target.loseHp(num+1); + if (storage) { + result2 = yield target + .chooseToRespond((card, player) => { + return get.name(card) == "sha"; + }) + .set("ai", (card) => { + return 1 + Math.random(); + }) + .set("prompt", "盟谋:是否打出一张【杀】?") + .set("prompt2", "当前进度:" + (3 - num) + "/3"); + } else + result2 = yield target + .chooseToUse((card) => { + if ( + !lib.filter.cardEnabled(card, _status.event.player, _status.event) + ) + return false; + return get.name(card) == "sha"; + }) + .set("prompt", "盟谋:是否使用一张【杀】?") + .set("prompt2", "当前进度:" + (3 - num) + "/3"); + if (!result2.bool) { + if (storage) { + target.popup("杯具"); + target.loseHp(num + 1); } break; } } } }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{global:'damageSource'}, - filter:function(event,player){ - if(!event.source||event.getParent().type!='card') return false; - if(event.source.isHealthy()||event.card.name!='sha') return false; - return event.getParent(4).name=='dcsbmengmou'&&event.getParent(4).player==player; + subSkill: { + effect: { + charlotte: true, + trigger: { global: "damageSource" }, + filter: function (event, player) { + if (!event.source || event.getParent().type != "card") return false; + if (event.source.isHealthy() || event.card.name != "sha") return false; + return ( + event.getParent(4).name == "dcsbmengmou" && + event.getParent(4).player == player + ); }, - forced:true, - popup:false, - firstDo:true, - content:function(){ + forced: true, + popup: false, + firstDo: true, + content: function () { trigger.source.recover(trigger.num); }, }, - true:{charlotte:true}, - false:{charlotte:false}, + true: { charlotte: true }, + false: { charlotte: false }, }, }, //张臶 - dc_zj_a:{ - audio:2, - trigger:{player:'damageBegin2'}, - filter:function(event,player){ - return event.getParent().type=='card'; + dc_zj_a: { + audio: 2, + trigger: { player: "damageBegin2" }, + filter: function (event, player) { + return event.getParent().type == "card"; }, - forced:true, - content:function(){ - var num=get.number(trigger.card); - if(typeof num=='number'&&num>0) trigger.num=num; + forced: true, + content: function () { + var num = get.number(trigger.card); + if (typeof num == "number" && num > 0) trigger.num = num; else trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&typeof get.number(card)!='number') return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && typeof get.number(card) != "number") + return "zeroplayertarget"; }, }, }, }, - dc_zj_b:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countDiscardableCards(player,'he'); + dc_zj_b: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countDiscardableCards(player, "he"); }, - direct:true, - content:function*(event,map){ - var player=map.player; - var result=yield player.chooseTarget(get.prompt2('dc_zj_b'),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - if(!player.hasFriend()) return 0; - return -game.countPlayer(current=>current.inRange(target)&&get.attitude(current,target)<0&&get.damageEffect(target,current,current)>0); - }); - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dc_zj_b',target); - player.discard(player.getCards('he')).discarder=player; - target.addSkill('dc_zj_a'); - target.addSkill('dc_zj_b_threaten'); - player.when('phaseBegin').then(()=>{ - if(target.isIn()){ - target.removeSkill('dc_zj_a'); - target.removeSkill('dc_zj_b_threaten'); - } - }).vars({target:target}); + direct: true, + content: function* (event, map) { + var player = map.player; + var result = yield player + .chooseTarget(get.prompt2("dc_zj_b"), lib.filter.notMe) + .set("ai", (target) => { + var player = _status.event.player; + if (!player.hasFriend()) return 0; + return -game.countPlayer( + (current) => + current.inRange(target) && + get.attitude(current, target) < 0 && + get.damageEffect(target, current, current) > 0 + ); + }); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dc_zj_b", target); + player.discard(player.getCards("he")).discarder = player; + target.addSkill("dc_zj_a"); + target.addSkill("dc_zj_b_threaten"); + player + .when("phaseBegin") + .then(() => { + if (target.isIn()) { + target.removeSkill("dc_zj_a"); + target.removeSkill("dc_zj_b_threaten"); + } + }) + .vars({ target: target }); } }, - subSkill:{ + subSkill: { //定要将你赶尽杀绝 - threaten:{ - charlotte:true, - mark:true, - marktext:'噩', - intro:{content:'已经开始汗流浃背了'}, - ai:{threaten:114514*1919810}, + threaten: { + charlotte: true, + mark: true, + marktext: "噩", + intro: { content: "已经开始汗流浃背了" }, + ai: { threaten: 114514 * 1919810 }, }, }, }, //诸葛若雪 - dcqiongying:{ - audio:2, - enable:'phaseUse', - usable:1, - direct:true, - filter:function(event,player){ + dcqiongying: { + audio: 2, + enable: "phaseUse", + usable: 1, + direct: true, + filter: function (event, player) { return player.canMoveCard(); }, - content:function*(event,map){ - const player=map.player; - event.pushHandler('onNextMoveCard',(event,option)=>{ - if(_status.connectMode&&event.step==1&&event._result.bool&&option.state=='end'){ - game.broadcastAll(()=>{ + content: function* (event, map) { + const player = map.player; + event.pushHandler("onNextMoveCard", (event, option) => { + if ( + _status.connectMode && + event.step == 1 && + event._result.bool && + option.state == "end" + ) { + game.broadcastAll(() => { delete _status.noclearcountdown; game.stopCountChoose(); }); } }); - let result=yield player.moveCard(false,`###琼英###移动场上的一张牌,然后弃置一张与此牌花色相同的手牌(若没有则展示手牌)。`).set('logSkill','dcqiongying').set('custom',{ - add:{}, - replace:{ - window:()=>{ - if(get.event().name=='chooseTarget') ui.click.cancel(); - } - }, - }); - if(result.bool){ - const card=result.card,suit=get.suit(card); - if(!player.hasCard({suit:suit})) player.showHandcards(); - else player.chooseToDiscard({suit:suit},true,`请弃置一张${get.translation(suit)}手牌`); - } - else{ - player.getStat('skill').dcqiongying--; + let result = yield player + .moveCard( + false, + `###琼英###移动场上的一张牌,然后弃置一张与此牌花色相同的手牌(若没有则展示手牌)。` + ) + .set("logSkill", "dcqiongying") + .set("custom", { + add: {}, + replace: { + window: () => { + if (get.event().name == "chooseTarget") ui.click.cancel(); + }, + }, + }); + if (result.bool) { + const card = result.card, + suit = get.suit(card); + if (!player.hasCard({ suit: suit })) player.showHandcards(); + else + player.chooseToDiscard( + { suit: suit }, + true, + `请弃置一张${get.translation(suit)}手牌` + ); + } else { + player.getStat("skill").dcqiongying--; } }, - ai:{ - expose:0.2, - order:function(item,player){ - if(player.countCards('h')<=4) return 0.5; + ai: { + expose: 0.2, + order: function (item, player) { + if (player.countCards("h") <= 4) return 0.5; return 9; }, - result:{ - player:function(player){ - if(player.canMoveCard(true)) return 1; + result: { + player: function (player) { + if (player.canMoveCard(true)) return 1; return 0; - } - } - } + }, + }, + }, }, - dcnuanhui:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function*(event,map){ - const player=map.player; - let result=yield player.chooseTarget(get.prompt('dcnuanhui'),'选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数且至少为1)').set('ai',target=>{ - return get.event('aiTarget')==target?10:0; - }).set('aiTarget',(()=>{ - const player=get.player(); - const list=get.inpileVCardList(info=>{ - return info[0]=='basic'; - }); - if(!list.length) return null; - const getUseValue=target=>{ - if(get.attitude(player,target)<=0) return -1; - const toUse=[]; - const hp=target.hp; - let eff=0,count=Math.max(1,target.countCards('e')); - while(count--){ - target.hp=Math.min(target.maxHp,target.hp+toUse.filter(card=>card.name=='tao').length); - const listx=list.map(info=>{ - const card=new lib.element.VCard({name:info[2],nature:info[3],isCard:true}); - return [card,target.getUseValue(card)]; - }).sort((a,b)=>{ - return b[1]-a[1]; + dcnuanhui: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function* (event, map) { + const player = map.player; + let result = yield player + .chooseTarget( + get.prompt("dcnuanhui"), + "选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数且至少为1)" + ) + .set("ai", (target) => { + return get.event("aiTarget") == target ? 10 : 0; + }) + .set( + "aiTarget", + (() => { + const player = get.player(); + const list = get.inpileVCardList((info) => { + return info[0] == "basic"; }); - const mostValuablePair=listx[0].slice(); - if(mostValuablePair[1]<=0) mostValuablePair[1]=0; - eff+=mostValuablePair[1]; - toUse.push(mostValuablePair[0]); - target.hp=hp; - } - if(toUse.length>1&&eff>0){ - eff-=target.getCards('e',card=>{ - return lib.filter.cardDiscardable(card,target,'dcnuanhui'); - }).map(card=>{ - return get.value(card,target); - }).reduce((p,c)=>{ - return p+c; - },0); - } - return eff; - } - const playerList=game.filterPlayer().map(current=>[current,getUseValue(current)]).sort((a,b)=>b[1]-a[1]); - if(playerList[0][1]<=0) return null; - return playerList[0][0]; - })()); - if(!result.bool) return event.finish(); - const target=result.targets[0]; - player.logSkill('dcnuanhui',target); - if(!target.isUnderControl(true)&&!target.isOnline()) game.delayx(); - const total=Math.max(1,target.countCards('e')); - let count=0,forced=false,used=[],discard=false; - while(count{ - return info[0]=='basic'&&target.hasUseTarget({name:info[2],nature:info[3],isCard:true}); + if (!list.length) return null; + const getUseValue = (target) => { + if (get.attitude(player, target) <= 0) return -1; + const toUse = []; + const hp = target.hp; + let eff = 0, + count = Math.max(1, target.countCards("e")); + while (count--) { + target.hp = Math.min( + target.maxHp, + target.hp + toUse.filter((card) => card.name == "tao").length + ); + const listx = list + .map((info) => { + const card = new lib.element.VCard({ + name: info[2], + nature: info[3], + isCard: true, + }); + return [card, target.getUseValue(card)]; + }) + .sort((a, b) => { + return b[1] - a[1]; + }); + const mostValuablePair = listx[0].slice(); + if (mostValuablePair[1] <= 0) mostValuablePair[1] = 0; + eff += mostValuablePair[1]; + toUse.push(mostValuablePair[0]); + target.hp = hp; + } + if (toUse.length > 1 && eff > 0) { + eff -= target + .getCards("e", (card) => { + return lib.filter.cardDiscardable(card, target, "dcnuanhui"); + }) + .map((card) => { + return get.value(card, target); + }) + .reduce((p, c) => { + return p + c; + }, 0); + } + return eff; + }; + const playerList = game + .filterPlayer() + .map((current) => [current, getUseValue(current)]) + .sort((a, b) => b[1] - a[1]); + if (playerList[0][1] <= 0) return null; + return playerList[0][0]; + })() + ); + if (!result.bool) return event.finish(); + const target = result.targets[0]; + player.logSkill("dcnuanhui", target); + if (!target.isUnderControl(true) && !target.isOnline()) game.delayx(); + const total = Math.max(1, target.countCards("e")); + let count = 0, + forced = false, + used = [], + discard = false; + while (count < total) { + const basicList = get.inpileVCardList((info) => { + return ( + info[0] == "basic" && + target.hasUseTarget({ name: info[2], nature: info[3], isCard: true }) + ); }); - if(!basicList.length){ - game.log('但是',target,'无牌可出!'); + if (!basicList.length) { + game.log("但是", target, "无牌可出!"); break; } - const str=forced?'视为使用一张基本牌':'是否视为使用一张基本牌?'; - const result=yield target.chooseButton([str,[basicList,'vcard']],forced).set('ai',button=>{ - return get.player().getUseValue({name:button.link[2],nature:button.link[3],isCard:true}); - }); - if(!result.bool){ - game.log('但是',target,'不愿出牌!'); + const str = forced ? "视为使用一张基本牌" : "是否视为使用一张基本牌?"; + const result = yield target + .chooseButton([str, [basicList, "vcard"]], forced) + .set("ai", (button) => { + return get + .player() + .getUseValue({ + name: button.link[2], + nature: button.link[3], + isCard: true, + }); + }); + if (!result.bool) { + game.log("但是", target, "不愿出牌!"); break; } - forced=true; - const card=new lib.element.VCard({name:result.links[0][2],nature:result.links[0][3],isCard:true}); - const result2=yield target.chooseUseTarget(card,true,false); - if(!discard&&result2.bool){ - if(used.includes(result.links[0][2])) discard=true; + forced = true; + const card = new lib.element.VCard({ + name: result.links[0][2], + nature: result.links[0][3], + isCard: true, + }); + const result2 = yield target.chooseUseTarget(card, true, false); + if (!discard && result2.bool) { + if (used.includes(result.links[0][2])) discard = true; else used.add(result.links[0][2]); } count++; } - if(discard){ - const cards=target.getCards('e',card=>{ - return lib.filter.cardDiscardable(card,target,'dcnuanhui'); + if (discard) { + const cards = target.getCards("e", (card) => { + return lib.filter.cardDiscardable(card, target, "dcnuanhui"); }); - if(cards.length) target.discard(cards).discarder=target; + if (cards.length) target.discard(cards).discarder = target; } }, - ai:{ - expose:0.3, - threaten:3.7, + ai: { + expose: 0.3, + threaten: 3.7, }, }, //曹轶 - dcmiyi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function*(event,map){ - const player=map.player; - if(_status.connectMode) game.broadcastAll(()=>{_status.noclearcountdown=true}); - let result=yield player.chooseControl(['回复体力','受到伤害'],'cancel2').set('choiceList',[ - '令你即将选择的角色各回复1点体力', - '令你即将选择的角色各受到你造成的1点伤害' - ]).set('prompt',get.prompt('dcmiyi')).set('ai',()=>{ - return get.event('choice'); - }).set('choice',(()=>{ - let damage=0; - game.countPlayer(current=>{ - let eff=get.damageEffect(current,player,player); - if(!current.isDamaged()){ - if(eff>0) eff=-eff; - } - else if(current.hasSkillTag('maixie')){ - if(get.attitude(player,current)<=0){ - if(current.getHp(true)>=2) eff=0; - else eff/=10; - } - else if(current.getHp(true)>=2){ - eff+=30; - } - } - else eff/=3; - damage+=eff; + dcmiyi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function* (event, map) { + const player = map.player; + if (_status.connectMode) + game.broadcastAll(() => { + _status.noclearcountdown = true; + }); + let result = yield player + .chooseControl(["回复体力", "受到伤害"], "cancel2") + .set("choiceList", [ + "令你即将选择的角色各回复1点体力", + "令你即将选择的角色各受到你造成的1点伤害", + ]) + .set("prompt", get.prompt("dcmiyi")) + .set("ai", () => { + return get.event("choice"); }) - if(damage<-20) return 0; - if(damage>5) return 1; - if(lib.skill.mbhuiyao.getUnrealDamageTargets(player,[[player],game.filterPlayer()])) return 0; - return 'cancel2'; - })()); - if(result.control=='cancel2'){ - if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + .set( + "choice", + (() => { + let damage = 0; + game.countPlayer((current) => { + let eff = get.damageEffect(current, player, player); + if (!current.isDamaged()) { + if (eff > 0) eff = -eff; + } else if (current.hasSkillTag("maixie")) { + if (get.attitude(player, current) <= 0) { + if (current.getHp(true) >= 2) eff = 0; + else eff /= 10; + } else if (current.getHp(true) >= 2) { + eff += 30; + } + } else eff /= 3; + damage += eff; + }); + if (damage < -20) return 0; + if (damage > 5) return 1; + if ( + lib.skill.mbhuiyao.getUnrealDamageTargets(player, [ + [player], + game.filterPlayer(), + ]) + ) + return 0; + return "cancel2"; + })() + ); + if (result.control == "cancel2") { + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } return event.finish(); } - const func=['recover','damage'],ind=result.index; - const fn=func[ind]; - result=yield player.chooseTarget(`蜜饴:令任意名角色${result.control.slice(0,2)}1点${result.control.slice(2)}`,[1,Infinity]).set('ai',target=>{ - const toDamage=get.event('toDamage'); - let eff=get.damageEffect(target,player,player); - if(toDamage){ - if(target.hasSkillTag('maixie')){ - if(get.attitude(player,target)<=0){ - if(target.getHp(true)>=2) eff=0; - else eff/=10; - } - else if(target.getHp(true)>=2){ - eff+=30; + const func = ["recover", "damage"], + ind = result.index; + const fn = func[ind]; + result = yield player + .chooseTarget( + `蜜饴:令任意名角色${result.control.slice(0, 2)}1点${result.control.slice(2)}`, + [1, Infinity] + ) + .set("ai", (target) => { + const toDamage = get.event("toDamage"); + let eff = get.damageEffect(target, player, player); + if (toDamage) { + if (target.hasSkillTag("maixie")) { + if (get.attitude(player, target) <= 0) { + if (target.getHp(true) >= 2) eff = 0; + else eff /= 10; + } else if (target.getHp(true) >= 2) { + eff += 30; + } } + return eff; } - return eff; - } - if(!target.isDamaged()){ - eff*=-2; - } - if(target.getHp(true)>=2) return -eff; - return 0; - }).set('toDamage',result.index==1); - if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} - if(!result.bool) return event.finish(); - const targets=result.targets.slice().sortBySeat(); - player.logSkill('dcmiyi',targets,fn=='damage'?'fire':'green'); - while(targets.length){ - const target=targets.shift(); - if(!target.isIn()) continue; - target[fn](); - target.when({global:'phaseJieshuBegin'}).vars({ - fn:func[ind^1], - source:player, - }).then(()=>{ - if(source.isIn()){ - if(!trigger._dcmiyi_logged){ - source.logSkill('dcmiyi'); - trigger._dcmiyi_logged=true; - } - source.line(player,fn=='damage'?'fire':'green'); + if (!target.isDamaged()) { + eff *= -2; } - player[fn](source); + if (target.getHp(true) >= 2) return -eff; + return 0; + }) + .set("toDamage", result.index == 1); + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); }); } + if (!result.bool) return event.finish(); + const targets = result.targets.slice().sortBySeat(); + player.logSkill("dcmiyi", targets, fn == "damage" ? "fire" : "green"); + while (targets.length) { + const target = targets.shift(); + if (!target.isIn()) continue; + target[fn](); + target + .when({ global: "phaseJieshuBegin" }) + .vars({ + fn: func[ind ^ 1], + source: player, + }) + .then(() => { + if (source.isIn()) { + if (!trigger._dcmiyi_logged) { + source.logSkill("dcmiyi"); + trigger._dcmiyi_logged = true; + } + source.line(player, fn == "damage" ? "fire" : "green"); + } + player[fn](source); + }); + } }, }, - dcyinjun:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - if(get.name(event.card,false)!='sha'&&get.type2(event.card)!='trick') return false; - if(event.targets.length!=1||!event.targets[0].isIn()) return false; - if(!player.canUse(new lib.element.VCard({name:'sha'}),event.targets[0],false)) return false; - return player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - return event.cards.every(card=>{ + dcyinjun: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if (get.name(event.card, false) != "sha" && get.type2(event.card) != "trick") + return false; + if (event.targets.length != 1 || !event.targets[0].isIn()) return false; + if (!player.canUse(new lib.element.VCard({ name: "sha" }), event.targets[0], false)) + return false; + return player.hasHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + return event.cards.every((card) => { return evt.hs.includes(card); }); }); }, - prompt2:function(event,player){ + prompt2: function (event, player) { return `视为对${get.translation(event.targets)}使用一张无伤害来源的【杀】`; }, - check:function(event,player){ - const sha=new lib.element.VCard({name:'sha'}); - return Math.max(...[event.targets[0],player].map(source=>get.effect(event.targets[0],sha,source,player)))>0; + check: function (event, player) { + const sha = new lib.element.VCard({ name: "sha" }); + return ( + Math.max( + ...[event.targets[0], player].map((source) => + get.effect(event.targets[0], sha, source, player) + ) + ) > 0 + ); }, - logTarget:'targets', - content:function*(event,map){ - const player=map.player,trigger=map.trigger,target=trigger.targets[0]; - yield player.useCard(new lib.element.VCard({name:'sha'}),target,false).oncard=()=>{ - get.event().customArgs.default.customSource={ - isDead:()=>true, - } - }; - if(player.getHistory('useSkill',evt=>evt.skill=='dcyinjun').length>player.getHp()){ - player.tempBanSkill('dcyinjun'); + logTarget: "targets", + content: function* (event, map) { + const player = map.player, + trigger = map.trigger, + target = trigger.targets[0]; + yield (player.useCard(new lib.element.VCard({ name: "sha" }), target, false).oncard = + () => { + get.event().customArgs.default.customSource = { + isDead: () => true, + }; + }); + if ( + player.getHistory("useSkill", (evt) => evt.skill == "dcyinjun").length > + player.getHp() + ) { + player.tempBanSkill("dcyinjun"); } - } + }, }, //马伶俐 - dclima:{ - audio:2, - mod:{ - globalFrom:function(from,to,distance){ - return distance-Math.max(1,game.countPlayer(current=>{ - return current.countCards('e',card=>{ - return get.is.attackingMount(card)||get.is.defendingMount(card); - }); - })); - } - } + dclima: { + audio: 2, + mod: { + globalFrom: function (from, to, distance) { + return ( + distance - + Math.max( + 1, + game.countPlayer((current) => { + return current.countCards("e", (card) => { + return get.is.attackingMount(card) || get.is.defendingMount(card); + }); + }) + ) + ); + }, + }, }, - dcxiaoyin:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return game.hasPlayer(current=>get.distance(player,current)<=1); + dcxiaoyin: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return game.hasPlayer((current) => get.distance(player, current) <= 1); }, - group:'dcxiaoyin_damage', - prompt2:function(event,player){ - return `亮出牌堆顶的${get.cnNumber(game.countPlayer(current=>get.distance(player,current)<=1))}张牌,获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上。`; + group: "dcxiaoyin_damage", + prompt2: function (event, player) { + return `亮出牌堆顶的${get.cnNumber( + game.countPlayer((current) => get.distance(player, current) <= 1) + )}张牌,获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上。`; }, - frequent:true, - check:()=>true, - content:function*(event,map){ - var player=map.player; - var count=game.countPlayer(current=>get.distance(player,current)<=1); - var cards=game.cardsGotoOrdering(get.cards(count)).cards; - yield player.showCards(cards,`${get.translation(player)}【硝引】亮出`); - player.gain(cards.filter(i=>get.color(i,false)=='red'),'gain2'); - var blackOnes=cards.filter(i=>get.color(i,false)=='black'); - if(!blackOnes.length) return event.finish(); - event.videoId=lib.status.videoId++; - var func=(cards,id)=>{ - var dialog=ui.create.dialog('硝引:剩余的黑色牌',`
    请选择至多${get.cnNumber(cards.length)}名座次连续的其他角色,然后将以下这些牌置于这些角色的武将牌上。
    `,cards); - dialog.videoId=id; + frequent: true, + check: () => true, + content: function* (event, map) { + var player = map.player; + var count = game.countPlayer((current) => get.distance(player, current) <= 1); + var cards = game.cardsGotoOrdering(get.cards(count)).cards; + yield player.showCards(cards, `${get.translation(player)}【硝引】亮出`); + player.gain( + cards.filter((i) => get.color(i, false) == "red"), + "gain2" + ); + var blackOnes = cards.filter((i) => get.color(i, false) == "black"); + if (!blackOnes.length) return event.finish(); + event.videoId = lib.status.videoId++; + var func = (cards, id) => { + var dialog = ui.create.dialog( + "硝引:剩余的黑色牌", + `
    请选择至多${get.cnNumber( + cards.length + )}名座次连续的其他角色,然后将以下这些牌置于这些角色的武将牌上。
    `, + cards + ); + dialog.videoId = id; return dialog; }; - if(player==game.me) func(blackOnes,event.videoId); - else if(player.isOnline2()){ - player.send(func,blackOnes,event.videoId); + if (player == game.me) func(blackOnes, event.videoId); + else if (player.isOnline2()) { + player.send(func, blackOnes, event.videoId); } - var targets=game.filterPlayer(current=>current!=player); - if(targets.length==1) var result={bool:true,targets:targets}; - else var result=yield player.chooseTarget([1,blackOnes.length],true,(card,player,target)=>{ - if(player==target) return false; - var selected=ui.selected.targets; - if(!selected.length) return true; - for(var i of selected){ - if(i.getNext()==target||i.getPrevious()==target) return true; - } - return false; - }).set('complexSelect',true).set('complexTarget',true).set('multitarget',true).set('multiline',true).set('ai',target=>{ - if(get.event('aiTargets').includes(target)) return 10; - return 0.1; - }).set('aiTargets',(()=>{ - var targets=game.filterPlayer(i=>i!=player).sortBySeat(player); - var maxEff=-Infinity,aiTargets=[]; - for(var i=0;i{ - return get.damageEffect(current,current,player,'fire'); - }).reduce((p,c)=>{ - return p+c; - },0); - if(tmpEff>maxEff){ - maxEff=tmpEff; - aiTargets=targetsx; + var targets = game.filterPlayer((current) => current != player); + if (targets.length == 1) var result = { bool: true, targets: targets }; + else + var result = yield player + .chooseTarget([1, blackOnes.length], true, (card, player, target) => { + if (player == target) return false; + var selected = ui.selected.targets; + if (!selected.length) return true; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; } - } - } - return aiTargets; - })()).set('prompt',false); - if(!result.bool){ + return false; + }) + .set("complexSelect", true) + .set("complexTarget", true) + .set("multitarget", true) + .set("multiline", true) + .set("ai", (target) => { + if (get.event("aiTargets").includes(target)) return 10; + return 0.1; + }) + .set( + "aiTargets", + (() => { + var targets = game.filterPlayer((i) => i != player).sortBySeat(player); + var maxEff = -Infinity, + aiTargets = []; + for (var i = 0; i < targets.length; i++) { + for (var j = 0; j < blackOnes.length; j++) { + if (targets.length < i + j) break; + var targetsx = targets.slice(i, j); + var tmpEff = targetsx + .map((current) => { + return get.damageEffect(current, current, player, "fire"); + }) + .reduce((p, c) => { + return p + c; + }, 0); + if (tmpEff > maxEff) { + maxEff = tmpEff; + aiTargets = targetsx; + } + } + } + return aiTargets; + })() + ) + .set("prompt", false); + if (!result.bool) { event.finish(); return; } - var func=(num,id)=>{ - var dialog=get.idDialog(id); - if(dialog) dialog.content.childNodes[1].innerHTML=`
    将${get.cnNumber(num)}张黑色牌按照选择的角色的座次顺序置于这些角色武将牌上
    `; + var func = (num, id) => { + var dialog = get.idDialog(id); + if (dialog) + dialog.content.childNodes[1].innerHTML = `
    将${get.cnNumber( + num + )}张黑色牌按照选择的角色的座次顺序置于这些角色武将牌上
    `; }; - var targets=result.targets.slice().sortBySeat(player); - var num=targets.length; - if(player==game.me) func(num,event.videoId); - else if(player.isOnline2()) player.send(func,num,event.videoId); - if(blackOnes.length==1) var result={bool:true,links:blackOnes}; - else var result=yield player.chooseButton(true,num).set('dialog',event.videoId).set('ai',()=>1); - game.broadcastAll('closeDialog',event.videoId); - if(result.bool){ - var cards=result.links; + var targets = result.targets.slice().sortBySeat(player); + var num = targets.length; + if (player == game.me) func(num, event.videoId); + else if (player.isOnline2()) player.send(func, num, event.videoId); + if (blackOnes.length == 1) var result = { bool: true, links: blackOnes }; + else + var result = yield player + .chooseButton(true, num) + .set("dialog", event.videoId) + .set("ai", () => 1); + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + var cards = result.links; player.line(targets); - targets.forEach((current,ind)=>{ - current.addToExpansion(cards[ind],'gain2').gaintag.add('dcxiaoyin'); - game.log(current,'将',cards[ind],'当“硝引”置于了武将牌上'); + targets.forEach((current, ind) => { + current.addToExpansion(cards[ind], "gain2").gaintag.add("dcxiaoyin"); + game.log(current, "将", cards[ind], "当“硝引”置于了武将牌上"); }); } }, - marktext:'硝', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "硝", + intro: { + content: "expansion", + markcount: "expansion", }, - subSkill:{ - damage:{ - audio:'dcxiaoyin', - trigger:{global:'damageBegin3'}, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - return event.player.getExpansions('dcxiaoyin').length; + subSkill: { + damage: { + audio: "dcxiaoyin", + trigger: { global: "damageBegin3" }, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + return event.player.getExpansions("dcxiaoyin").length; }, //direct:true, - async cost(event, trigger, player){ - const source = trigger.source, target = trigger.player; - const cards = target.getExpansions('dcxiaoyin'); - if (trigger.hasNature('fire')) { - const types = cards.map(i => get.type2(i, false)); - const str = get.translation(types).replace(/(.*)、/, '$1或'); - event.result = await source.chooseCard(`硝引:是否弃置一张${str}牌?`, `若如此做,将${get.translation(target)}的对应的“硝引”牌置入弃牌堆,令你对其造成的伤害+1`, 'he', function (card, player) { - if (!get.event('types').includes(get.type2(card))) return false; - return lib.filter.cardDiscardable.apply(this, arguments); - }).set('types', types).set('ai', card => { - if (get.event('goon')) return 7 - get.value(card); - return 0; - }).set('goon', get.damageEffect(target, player, player, 'fire') > 0 && get.attitude(player, target) <= 0).forResult(); - } - else { - event.result = await source.chooseBool(`###是否响应${get.translation(player)}的【硝引】?###获得${get.translation(target)}的一张“硝引”牌(${get.translation(cards)}),然后将你对其造成的此次伤害改为火焰伤害。`).set('choice', (() => { - if (get.damageEffect(target, source, source, 'fire') < get.damageEffect(target, source, source) - 5) return false; - if (cards.map(i => get.value(i)).reduce((p, c) => p + c, 0) > 0) return true; - return false; - })()).forResult(); + async cost(event, trigger, player) { + const source = trigger.source, + target = trigger.player; + const cards = target.getExpansions("dcxiaoyin"); + if (trigger.hasNature("fire")) { + const types = cards.map((i) => get.type2(i, false)); + const str = get.translation(types).replace(/(.*)、/, "$1或"); + event.result = await source + .chooseCard( + `硝引:是否弃置一张${str}牌?`, + `若如此做,将${get.translation( + target + )}的对应的“硝引”牌置入弃牌堆,令你对其造成的伤害+1`, + "he", + function (card, player) { + if (!get.event("types").includes(get.type2(card))) return false; + return lib.filter.cardDiscardable.apply(this, arguments); + } + ) + .set("types", types) + .set("ai", (card) => { + if (get.event("goon")) return 7 - get.value(card); + return 0; + }) + .set( + "goon", + get.damageEffect(target, player, player, "fire") > 0 && + get.attitude(player, target) <= 0 + ) + .forResult(); + } else { + event.result = await source + .chooseBool( + `###是否响应${get.translation( + player + )}的【硝引】?###获得${get.translation( + target + )}的一张“硝引”牌(${get.translation( + cards + )}),然后将你对其造成的此次伤害改为火焰伤害。` + ) + .set( + "choice", + (() => { + if ( + get.damageEffect(target, source, source, "fire") < + get.damageEffect(target, source, source) - 5 + ) + return false; + if (cards.map((i) => get.value(i)).reduce((p, c) => p + c, 0) > 0) + return true; + return false; + })() + ) + .forResult(); } }, - async content(event, trigger, player){ - const source = trigger.source, target = trigger.player; - if (trigger.hasNature('fire')) { - source.line(target, 'fire'); + async content(event, trigger, player) { + const source = trigger.source, + target = trigger.player; + if (trigger.hasNature("fire")) { + source.line(target, "fire"); const type = get.type2(event.cards[0]); - await source.discard(event.cards).set('discarder', source); + await source.discard(event.cards).set("discarder", source); //await game.asyncDelayx(); - const cardsToDiscard = target.getExpansions('dcxiaoyin').filter(card => get.type2(card, false) === type); - if (cardsToDiscard.length === 1) await target.loseToDiscardpile(cardsToDiscard); + const cardsToDiscard = target + .getExpansions("dcxiaoyin") + .filter((card) => get.type2(card, false) === type); + if (cardsToDiscard.length === 1) + await target.loseToDiscardpile(cardsToDiscard); else if (cardsToDiscard.length > 1) { - const result = await source.chooseButton([ - `请选择移去${get.translation(source)}的一张“硝引”牌`, - cardsToDiscard - ], true).forResult(); + const result = await source + .chooseButton( + [ + `请选择移去${get.translation(source)}的一张“硝引”牌`, + cardsToDiscard, + ], + true + ) + .forResult(); await target.loseToDiscardpile(result.links); } - trigger.addNumber('num', 1); - } - else { - source.line(target, 'fire'); - const cards = target.getExpansions('dcxiaoyin'); - if (cards.length === 1) await source.gain(cards, target, 'give'); + trigger.addNumber("num", 1); + } else { + source.line(target, "fire"); + const cards = target.getExpansions("dcxiaoyin"); + if (cards.length === 1) await source.gain(cards, target, "give"); else if (cards.length > 1) { - const result = await source.chooseButton([ - `请选择获得${get.translation(source)}的一张“硝引”牌`, - cards - ], true).forResult(); - await source.gain(result.links, target, 'give'); + const result = await source + .chooseButton( + [`请选择获得${get.translation(source)}的一张“硝引”牌`, cards], + true + ) + .forResult(); + await source.gain(result.links, target, "give"); } - game.setNature(trigger, 'fire'); + game.setNature(trigger, "fire"); } }, }, }, - ai:{ - threaten:4, + ai: { + threaten: 4, }, }, - dchuahuo:{ - audio:2, - enable:'phaseUse', - usable:1, - viewAs:{ - name:'sha', - nature:'fire', - storage:{dchuahuo:true}, + dchuahuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + viewAs: { + name: "sha", + nature: "fire", + storage: { dchuahuo: true }, }, - filterCard:{color:'red'}, - position:'hs', - filter:function(event,player){ - return player.countCards('hs',{color:'red'}); + filterCard: { color: "red" }, + position: "hs", + filter: function (event, player) { + return player.countCards("hs", { color: "red" }); }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - precontent:function(){ - event.getParent().addCount=false; - player.when('useCardToPlayer').filter(evt=>evt.card.storage&&evt.card.storage.dchuahuo).then(()=>{ - if(trigger.target.getExpansions('dcxiaoyin').length){ - var targets=game.filterPlayer(current=>{ - return current.getExpansions('dcxiaoyin').length; - }); - player.chooseBool(`是否更改${get.translation(trigger.card)}的目标?`,`将此牌的目标改为所有有“硝引”的角色(${get.translation(targets)})。`) - .set('choice',targets.map(current=>get.effect(current,trigger.card,player,player)).reduce((p,c)=>p+c,0)>get.effect(trigger.target,trigger.card,player,player)); - } - else event.finish(); - }).then(()=>{ - if(result.bool){ - trigger.targets.length=0; - trigger.getParent().triggeredTargets1.length=0; - trigger.untrigger(); - var targets=game.filterPlayer(current=>{ - return current.getExpansions('dcxiaoyin').length; - }); - player.line(targets,'fire'); - trigger.targets.addArray(targets); - game.log(targets,'成为了',trigger.card,'的新目标'); - game.delayx(); - } - }) + precontent: function () { + event.getParent().addCount = false; + player + .when("useCardToPlayer") + .filter((evt) => evt.card.storage && evt.card.storage.dchuahuo) + .then(() => { + if (trigger.target.getExpansions("dcxiaoyin").length) { + var targets = game.filterPlayer((current) => { + return current.getExpansions("dcxiaoyin").length; + }); + player + .chooseBool( + `是否更改${get.translation(trigger.card)}的目标?`, + `将此牌的目标改为所有有“硝引”的角色(${get.translation(targets)})。` + ) + .set( + "choice", + targets + .map((current) => + get.effect(current, trigger.card, player, player) + ) + .reduce((p, c) => p + c, 0) > + get.effect(trigger.target, trigger.card, player, player) + ); + } else event.finish(); + }) + .then(() => { + if (result.bool) { + trigger.targets.length = 0; + trigger.getParent().triggeredTargets1.length = 0; + trigger.untrigger(); + var targets = game.filterPlayer((current) => { + return current.getExpansions("dcxiaoyin").length; + }); + player.line(targets, "fire"); + trigger.targets.addArray(targets); + game.log(targets, "成为了", trigger.card, "的新目标"); + game.delayx(); + } + }); + }, + ai: { + order: () => get.order({ name: "sha" }) + 0.2, + result: { player: 1 }, }, - ai:{ - order:()=>get.order({name:'sha'})+0.2, - result:{player:1}, - } }, //武陆逊 - dcxiongmu:{ - audio:2, - trigger:{global:'roundStart'}, + dcxiongmu: { + audio: 2, + trigger: { global: "roundStart" }, // filter:function(event,player){ // return player.countCards('h'){ - return 6-get.value(card); - }); - 'step 2' - if(result.bool){ - var cards=result.cards; - event.cards=cards; - game.log(player,`将${get.cnNumber(cards.length)}张牌置入了牌堆`); - player.loseToDiscardpile(cards,ui.cardPile,'blank').set('log',false).insert_index=function(){ - return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; - }; - } - else event.finish(); - 'step 3' - var list=[],shown=[] - var piles=['cardPile','discardPile']; - for(var pile of piles){ - for(var i=0;i { + return 6 - get.value(card); + }); + ("step 2"); + if (result.bool) { + var cards = result.cards; + event.cards = cards; + game.log(player, `将${get.cnNumber(cards.length)}张牌置入了牌堆`); + player.loseToDiscardpile(cards, ui.cardPile, "blank").set("log", false).insert_index = + function () { + return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)]; + }; + } else event.finish(); + ("step 3"); + var list = [], + shown = []; + var piles = ["cardPile", "discardPile"]; + for (var pile of piles) { + for (var i = 0; i < ui[pile].childNodes.length; i++) { + var card = ui[pile].childNodes[i]; + var number = get.number(card, false); + if (!list.includes(card) && number == 8) { list.push(card); - if(pile=='discardPile') shown.push(card); - if(list.length>=cards.length) break; + if (pile == "discardPile") shown.push(card); + if (list.length >= cards.length) break; } } - if(list.length>=cards.length) break; + if (list.length >= cards.length) break; } - if(list.length){ - var next=player.gain(list); - next.shown_cards=shown; - next.set('animate',function(event){ - var player=event.player,cards=event.cards,shown=event.shown_cards; - if(shown.length0){ - player.$gain2(shown,false); - game.log(player,'从弃牌堆获得了',shown); + if (shown.length > 0) { + player.$gain2(shown, false); + game.log(player, "从弃牌堆获得了", shown); } return 500; }); - next.gaintag.add('dcxiongmu_tag'); - player.addTempSkill('dcxiongmu_tag','roundStart'); + next.gaintag.add("dcxiongmu_tag"); + player.addTempSkill("dcxiongmu_tag", "roundStart"); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(target.countCards('h')>target.getHp()||player.hasSkillTag('jueqing')) return; - if(player._dcxiongmu_temp) return; - if(_status.event.getParent('useCard',true)||_status.event.getParent('_wuxie',true)) return; - if(get.tag(card,'damage')){ - if(target.getHistory('damage').length>0){ - return [1,-2]; - } - else{ - if(get.attitude(player,target)>0&&target.hp>1){ + ai: { + effect: { + target: function (card, player, target) { + if (target.countCards("h") > target.getHp() || player.hasSkillTag("jueqing")) + return; + if (player._dcxiongmu_temp) return; + if ( + _status.event.getParent("useCard", true) || + _status.event.getParent("_wuxie", true) + ) + return; + if (get.tag(card, "damage")) { + if (target.getHistory("damage").length > 0) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0 && target.hp > 1) { return 0; } - if(get.attitude(player,target)<0&&!player.hasSkillTag('damageBonus')){ - if(card.name=='sha') return; - var sha=false; - player._dcxiongmu_temp=true; - var num=player.countCards('h',function(card){ - if(card.name=='sha'){ - if(sha){ + if ( + get.attitude(player, target) < 0 && + !player.hasSkillTag("damageBonus") + ) { + if (card.name == "sha") return; + var sha = false; + player._dcxiongmu_temp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha) { return false; - } - else{ - sha=true; + } else { + sha = true; } } - return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,player)>0; + return ( + get.tag(card, "damage") && + player.canUse(card, target) && + get.effect(target, card, player, player) > 0 + ); }); delete player._dcxiongmu_temp; - if(player.hasSkillTag('damage')){ + if (player.hasSkillTag("damage")) { num++; } - if(num<2){ - var enemies=player.getEnemies(); - if(enemies.length==1&&enemies[0]==target&&player.needsToDiscard()){ + if (num < 2) { + var enemies = player.getEnemies(); + if ( + enemies.length == 1 && + enemies[0] == target && + player.needsToDiscard() + ) { return; } return 0; @@ -2730,3510 +3756,4271 @@ game.import('character', function () { } } } - } - } - }, - subSkill:{ - minus:{ - audio:'dcxiongmu', - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - return player.countCards('h')<=player.getHp()&&game.getGlobalHistory('everything',evt=>{ - return evt.name=='damage'&&evt.player==player; - },event).indexOf(event)==0; }, - forced:true, - locked:false, - content:function(){ + }, + }, + subSkill: { + minus: { + audio: "dcxiongmu", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return ( + player.countCards("h") <= player.getHp() && + game + .getGlobalHistory( + "everything", + (evt) => { + return evt.name == "damage" && evt.player == player; + }, + event + ) + .indexOf(event) == 0 + ); + }, + forced: true, + locked: false, + content: function () { trigger.num--; - } + }, }, - tag:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('dcxiongmu_tag'); + tag: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dcxiongmu_tag"); }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('dcxiongmu_tag')) return true; + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcxiongmu_tag")) return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('dcxiongmu_tag')) return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcxiongmu_tag")) return false; }, }, - } - } + }, + }, }, - dczhangcai:{ - audio:2, - mod:{ - aiOrder:(player,card,num)=>{ - if(num>0&&get.tag(card,'draw')&&ui.cardPile.childNodes.length+ui.discardPile.childNodes.length<20) return 0; + dczhangcai: { + audio: 2, + mod: { + aiOrder: (player, card, num) => { + if ( + num > 0 && + get.tag(card, "draw") && + ui.cardPile.childNodes.length + ui.discardPile.childNodes.length < 20 + ) + return 0; }, - aiValue:(player,card,num)=>{ - if(num>0&&card.name==='zhuge') return 20; + aiValue: (player, card, num) => { + if (num > 0 && card.name === "zhuge") return 20; + }, + aiUseful: (player, card, num) => { + if (num > 0 && card.name === "zhuge") return 10; }, - aiUseful:(player,card,num)=>{ - if(num>0&&card.name==='zhuge') return 10; - } }, - trigger:{ - player:['useCard','respond'], + trigger: { + player: ["useCard", "respond"], }, - filter:function(event,player){ - if(player.hasSkill('dczhangcai_all')) return true; - return get.number(event.card)==8; + filter: function (event, player) { + if (player.hasSkill("dczhangcai_all")) return true; + return get.number(event.card) == 8; }, - prompt2:function(event,player){ - const num=player.hasSkill('dczhangcai_all')?get.number(event.card):8; - let count=1; - if(typeof num=='number') count=Math.max(1,player.countCards('h',card=>get.number(card)==num)) - return '你可以摸'+get.cnNumber(count)+'张牌。'; + prompt2: function (event, player) { + const num = player.hasSkill("dczhangcai_all") ? get.number(event.card) : 8; + let count = 1; + if (typeof num == "number") + count = Math.max( + 1, + player.countCards("h", (card) => get.number(card) == num) + ); + return "你可以摸" + get.cnNumber(count) + "张牌。"; }, - check:(event,player)=>{ - const num=player.hasSkill('dczhangcai_all')?get.number(event.card):8; - let count=1; - if(typeof num=='number') count=Math.max(1,player.countCards('h',card=>get.number(card)==num)); - return ui.cardPile.childNodes.length+ui.discardPile.childNodes.length>=count; + check: (event, player) => { + const num = player.hasSkill("dczhangcai_all") ? get.number(event.card) : 8; + let count = 1; + if (typeof num == "number") + count = Math.max( + 1, + player.countCards("h", (card) => get.number(card) == num) + ); + return ui.cardPile.childNodes.length + ui.discardPile.childNodes.length >= count; }, - frequent:true, - locked:false, - content:function(){ - var num=player.hasSkill('dczhangcai_all')?get.number(trigger.card):8; - var count=1; - if(typeof num=='number') count=Math.max(1,player.countCards('h',card=>get.number(card)==num)); + frequent: true, + locked: false, + content: function () { + var num = player.hasSkill("dczhangcai_all") ? get.number(trigger.card) : 8; + var count = 1; + if (typeof num == "number") + count = Math.max( + 1, + player.countCards("h", (card) => get.number(card) == num) + ); player.draw(count); }, - ai:{ - threaten:4, + ai: { + threaten: 4, }, - subSkill:{ - all:{ - charlotte:true, - mark:true, - intro:{ - content:'当你使用或打出牌时,你可以摸X张牌(X为你手牌中与此牌点数相同的牌数且至少为1)' + subSkill: { + all: { + charlotte: true, + mark: true, + intro: { + content: + "当你使用或打出牌时,你可以摸X张牌(X为你手牌中与此牌点数相同的牌数且至少为1)", }, }, - } - }, - dcruxian:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'wood', - content:function(){ - 'step 0' - player.awakenSkill('dcruxian'); - player.addTempSkill('dczhangcai_all',{player:'phaseBegin'}); }, - ai:{ - combo:'dczhangcai', - order:15, - result:{ - player:function(player){ - if(!player.hasSkill('dczhangcai')) return 0; - if(player.countCards('hs',card=>get.number(card)!=8&&player.hasValueTarget(card))>3||player.hp==1) return 5; + }, + dcruxian: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.awakenSkill("dcruxian"); + player.addTempSkill("dczhangcai_all", { player: "phaseBegin" }); + }, + ai: { + combo: "dczhangcai", + order: 15, + result: { + player: function (player) { + if (!player.hasSkill("dczhangcai")) return 0; + if ( + player.countCards( + "hs", + (card) => get.number(card) != 8 && player.hasValueTarget(card) + ) > 3 || + player.hp == 1 + ) + return 5; return 0; - } - } - } + }, + }, + }, }, //新杀许靖 - dcshangyu:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + dcshangyu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - content:function(){ - 'step 0' - var card=get.cardPile(card=>get.name(card,false)=='sha'); - if(card){ - event.card=card; - player.gain(card,'gain2').gaintag.add('dcshangyu_tag'); - player.markAuto('dcshangyu',card); - } - else{ - player.chat('不是,连杀都没有?'); + forced: true, + content: function () { + "step 0"; + var card = get.cardPile((card) => get.name(card, false) == "sha"); + if (card) { + event.card = card; + player.gain(card, "gain2").gaintag.add("dcshangyu_tag"); + player.markAuto("dcshangyu", card); + } else { + player.chat("不是,连杀都没有?"); event.finish(); } - 'step 1' - if(get.owner(card)==player&&get.position(card)=='h'&&game.hasPlayer(current=>current!=player)){ - let targets=game.filterPlayer(i=>{ - return get.attitude(player,i)>0; - },null,true).sortBySeat(get.zhu(player)||game.findPlayer(i=>{ - return i.getSeatNum()===1; - })); - if(targets.includes(player)) targets=targets.slice(0,targets.indexOf(player)); - player.chooseTarget(`是否将${get.translation(card)}交给一名其他角色?`,lib.filter.notMe).set('ai',target=>{ - let idx=_status.event.targets.indexOf(target); - if(idx<0) return -1; - return 1/(idx+1); - }).set('targets',targets); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; + ("step 1"); + if ( + get.owner(card) == player && + get.position(card) == "h" && + game.hasPlayer((current) => current != player) + ) { + let targets = game + .filterPlayer( + (i) => { + return get.attitude(player, i) > 0; + }, + null, + true + ) + .sortBySeat( + get.zhu(player) || + game.findPlayer((i) => { + return i.getSeatNum() === 1; + }) + ); + if (targets.includes(player)) targets = targets.slice(0, targets.indexOf(player)); + player + .chooseTarget( + `是否将${get.translation(card)}交给一名其他角色?`, + lib.filter.notMe + ) + .set("ai", (target) => { + let idx = _status.event.targets.indexOf(target); + if (idx < 0) return -1; + return 1 / (idx + 1); + }) + .set("targets", targets); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2); - player.give(card,target).gaintag.add('dcshangyu_tag'); + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); + player.give(card, target).gaintag.add("dcshangyu_tag"); } - player.addSkill('dcshangyu_effect'); + player.addSkill("dcshangyu_effect"); }, - subSkill:{ - effect:{ - audio:'dcshangyu', - trigger:{ - global:'damageSource', + subSkill: { + effect: { + audio: "dcshangyu", + trigger: { + global: "damageSource", }, - filter:function(event,player){ - return event.cards&&event.cards.some(card=>player.getStorage('dcshangyu').includes(card)); + filter: function (event, player) { + return ( + event.cards && + event.cards.some((card) => player.getStorage("dcshangyu").includes(card)) + ); }, - forced:true, - charlotte:true, - direct:true, - group:['dcshangyu_transfer','dcshangyu_addTag'], - content:function(){ - 'step 0' - var list=[player]; - if(trigger.source&&trigger.source.isIn()){ - player.logSkill('dcshangyu_effect',trigger.source); + forced: true, + charlotte: true, + direct: true, + group: ["dcshangyu_transfer", "dcshangyu_addTag"], + content: function () { + "step 0"; + var list = [player]; + if (trigger.source && trigger.source.isIn()) { + player.logSkill("dcshangyu_effect", trigger.source); list.push(trigger.source); - } - else player.logSkill('dcshangyu_effect'); + } else player.logSkill("dcshangyu_effect"); list.sortBySeat(); game.asyncDraw(list); - } - }, - transfer:{ - audio:'dcshangyu', - trigger:{ - global:['loseAfter','loseAsyncAfter','cardsDiscardAfter','equipAfter'], }, - forced:true, - direct:true, - filter:function(event,player){ - if(!game.hasPlayer(current=>{ - return !player.getStorage('dcshangyu_transfer').includes(current); - })) return false; - return event.getd().some(card=>{ - return get.position(card)=='d'&&player.getStorage('dcshangyu').includes(card); + }, + transfer: { + audio: "dcshangyu", + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], + }, + forced: true, + direct: true, + filter: function (event, player) { + if ( + !game.hasPlayer((current) => { + return !player.getStorage("dcshangyu_transfer").includes(current); + }) + ) + return false; + return event.getd().some((card) => { + return ( + get.position(card) == "d" && player.getStorage("dcshangyu").includes(card) + ); }); }, - content:function(){ - 'step 0' - var cards=trigger.getd().filter(card=>{ - return get.position(card)=='d'&&player.getStorage('dcshangyu').includes(card); - }),targets=game.filterPlayer(current=>{ - return !player.getStorage('dcshangyu_transfer').includes(current); - }).sortBySeat(_status.currentPhase); - if(targets.length&&targets[0]===_status.currentPhase&&!_status.currentPhase.getCardUsable('sha')) targets.push(targets.shift()); - event.cards=cards; - player.chooseTarget(`赏誉:将${get.translation(cards)}交给一名可选角色`,(card,player,target)=>{ - return !player.getStorage('dcshangyu_transfer').includes(target); - },true).set('ai',target=>{ - let att=get.sgnAttitude(_status.event.player,target),idx=1+_status.event.targets.indexOf(target); - if(att<0) return -idx; - return att+1/idx; - }).set('targets',targets); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcshangyu_transfer',target); - if(!player.storage.dcshangyu_transfer){ - player.when({global:'phaseAfter'}) - .then(()=>{ - player.unmarkSkill('dcshangyu_transfer'); - delete player.storage.dcshangyu_transfer; - }); + content: function () { + "step 0"; + var cards = trigger.getd().filter((card) => { + return ( + get.position(card) == "d" && + player.getStorage("dcshangyu").includes(card) + ); + }), + targets = game + .filterPlayer((current) => { + return !player.getStorage("dcshangyu_transfer").includes(current); + }) + .sortBySeat(_status.currentPhase); + if ( + targets.length && + targets[0] === _status.currentPhase && + !_status.currentPhase.getCardUsable("sha") + ) + targets.push(targets.shift()); + event.cards = cards; + player + .chooseTarget( + `赏誉:将${get.translation(cards)}交给一名可选角色`, + (card, player, target) => { + return !player.getStorage("dcshangyu_transfer").includes(target); + }, + true + ) + .set("ai", (target) => { + let att = get.sgnAttitude(_status.event.player, target), + idx = 1 + _status.event.targets.indexOf(target); + if (att < 0) return -idx; + return att + 1 / idx; + }) + .set("targets", targets); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcshangyu_transfer", target); + if (!player.storage.dcshangyu_transfer) { + player.when({ global: "phaseAfter" }).then(() => { + player.unmarkSkill("dcshangyu_transfer"); + delete player.storage.dcshangyu_transfer; + }); } - player.markAuto('dcshangyu_transfer',target); - target.gain(cards,'gain2').set('giver',player).gaintag.add('dcshangyu_tag'); + player.markAuto("dcshangyu_transfer", target); + target.gain(cards, "gain2").set("giver", player).gaintag.add("dcshangyu_tag"); } }, - intro:{ - content:'本回合已交给过$', + intro: { + content: "本回合已交给过$", }, }, - addTag:{ - trigger:{ - global:['gainAfter','loseAsyncAfter'], + addTag: { + trigger: { + global: ["gainAfter", "loseAsyncAfter"], }, - charlotte:true, - popup:false, - silent:true, - lastDo:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - var cards=event.getg(current); - return cards.some(card=>player.getStorage('dcshangyu').includes(card)); + charlotte: true, + popup: false, + silent: true, + lastDo: true, + filter: function (event, player) { + return game.hasPlayer((current) => { + var cards = event.getg(current); + return cards.some((card) => player.getStorage("dcshangyu").includes(card)); }); }, - content:function(){ - game.countPlayer(current=>{ - var cards=trigger.getg(current); - if(cards.length){ - cards=cards.filter(card=>player.getStorage('dcshangyu').includes(card)); - current.addGaintag(cards,'dcshangyu_tag'); + content: function () { + game.countPlayer((current) => { + var cards = trigger.getg(current); + if (cards.length) { + cards = cards.filter((card) => + player.getStorage("dcshangyu").includes(card) + ); + current.addGaintag(cards, "dcshangyu_tag"); } }); }, }, }, }, - dccaixia:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + dccaixia: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - filter:function(event,player){ - return !player.hasMark('dccaixia_clear'); + filter: function (event, player) { + return !player.hasMark("dccaixia_clear"); }, - direct:true, - locked:false, - content:function(){ - 'step 0' - var choices=Array.from({length:Math.min(5,game.players.length+game.dead.length)}).map((_,i)=>get.cnNumber(i+1,true)); - player.chooseControl(choices,'cancel2').set('prompt',get.prompt('dccaixia')).set('prompt2','你可以摸至多'+get.cnNumber(choices.length)+'张牌,但是你此后需要再使用等量的牌才可再发动本技能。').set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - var cards=player.getCards('hs',card=>get.name(card,player)!=='sha'&&player.hasValueTarget(card)); - var damage=Math.min(player.getCardUsable({name:'sha'}),player.countCards('hs','sha'))+cards.filter(i=>get.tag(i,'damage')).length; - if(player.isPhaseUsing()||player.hp+player.hujia+player.countCards('hs',i=>get.tag(card,'recover'))>2){ - if(damage) return Math.min(choices.length-1,cards.length-damage); - return Math.min(choices.length-1,cards.length-1); - } - return choices.length-1; - }()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('dccaixia'); - var num=result.index+1; + direct: true, + locked: false, + content: function () { + "step 0"; + var choices = Array.from({ + length: Math.min(5, game.players.length + game.dead.length), + }).map((_, i) => get.cnNumber(i + 1, true)); + player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("dccaixia")) + .set( + "prompt2", + "你可以摸至多" + + get.cnNumber(choices.length) + + "张牌,但是你此后需要再使用等量的牌才可再发动本技能。" + ) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var cards = player.getCards( + "hs", + (card) => get.name(card, player) !== "sha" && player.hasValueTarget(card) + ); + var damage = + Math.min( + player.getCardUsable({ name: "sha" }), + player.countCards("hs", "sha") + ) + cards.filter((i) => get.tag(i, "damage")).length; + if ( + player.isPhaseUsing() || + player.hp + + player.hujia + + player.countCards("hs", (i) => get.tag(card, "recover")) > + 2 + ) { + if (damage) return Math.min(choices.length - 1, cards.length - damage); + return Math.min(choices.length - 1, cards.length - 1); + } + return choices.length - 1; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("dccaixia"); + var num = result.index + 1; player.draw(num); - player.addMark('dccaixia_clear',num); - player.addSkill('dccaixia_clear'); + player.addMark("dccaixia_clear", num); + player.addSkill("dccaixia_clear"); } }, - mod:{ - aiOrder:function(player,card,num){ - if(!get.tag(card,'damage')) return; - if(player.countMark('dccaixia_clear')>1) return num/3; - return num+6; + mod: { + aiOrder: function (player, card, num) { + if (!get.tag(card, "damage")) return; + if (player.countMark("dccaixia_clear") > 1) return num / 3; + return num + 6; }, }, - subSkill:{ - clear:{ - trigger:{player:'useCard1'}, - filter:function(event,player){ - return player.hasMark('dccaixia_clear'); + subSkill: { + clear: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + return player.hasMark("dccaixia_clear"); }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - player.removeMark('dccaixia_clear',1); + forced: true, + popup: false, + charlotte: true, + content: function () { + player.removeMark("dccaixia_clear", 1); }, - intro:{ - name:'才瑕', - name2:'瑕', - content:'距离刷新技能还需使用&张牌', + intro: { + name: "才瑕", + name2: "瑕", + content: "距离刷新技能还需使用&张牌", }, - } + }, }, }, //十周年二乔 dcxingwu: { intro: { - content: 'expansion', - markcount: 'expansion', + content: "expansion", + markcount: "expansion", onunmark: function (storage, player) { - player.removeAdditionalSkill('dcluoyan'); + player.removeAdditionalSkill("dcluoyan"); }, }, onremove: function (player, skill) { var cards = player.getExpansions(skill); if (cards.length) player.loseToDiscardpile(cards); }, - audio: 'xingwu', - trigger: { player: 'phaseDiscardBegin' }, + audio: "xingwu", + trigger: { player: "phaseDiscardBegin" }, filter: function (event, player) { - return player.countCards('h'); + return player.countCards("h"); }, direct: true, content: function () { - 'step 0' - player.chooseCard('h', get.prompt('dcxingwu'), '将一张手牌作为“舞”置于武将牌上').set('ai', function (card) { - var att = 1, list = []; - for (var i of player.getExpansions('dcxingwu')) { - if (!list.includes(get.suit(i))) list.push(get.suit(i)); - } - if (!list.includes(get.suit(card))) att = 2; - if (_status.event.goon) return (20 - get.value(card)) * att; - return (7 - get.value(card)) * att; - }).set('goon', player.needsToDiscard() || player.getExpansions('dcxingwu').length == 2); - 'step 1' + "step 0"; + player + .chooseCard("h", get.prompt("dcxingwu"), "将一张手牌作为“舞”置于武将牌上") + .set("ai", function (card) { + var att = 1, + list = []; + for (var i of player.getExpansions("dcxingwu")) { + if (!list.includes(get.suit(i))) list.push(get.suit(i)); + } + if (!list.includes(get.suit(card))) att = 2; + if (_status.event.goon) return (20 - get.value(card)) * att; + return (7 - get.value(card)) * att; + }) + .set("goon", player.needsToDiscard() || player.getExpansions("dcxingwu").length == 2); + ("step 1"); if (result.bool) { - player.logSkill('dcxingwu'); + player.logSkill("dcxingwu"); var cards = result.cards; - player.addToExpansion(cards, player, 'give').gaintag.add('dcxingwu'); + player.addToExpansion(cards, player, "give").gaintag.add("dcxingwu"); } - 'step 2' + ("step 2"); game.delayx(); - if (player.getExpansions('dcxingwu').length > 2) { - player.chooseButton(['是否移去三张“舞”并发射核弹?', player.getExpansions('dcxingwu')], 3).ai = (button) => { - if (game.hasPlayer(function (current) { - return get.attitude(player, current) < 0; - })) return 1; + if (player.getExpansions("dcxingwu").length > 2) { + player.chooseButton( + ["是否移去三张“舞”并发射核弹?", player.getExpansions("dcxingwu")], + 3 + ).ai = (button) => { + if ( + game.hasPlayer(function (current) { + return get.attitude(player, current) < 0; + }) + ) + return 1; return 0; - } - } - else event.finish(); - 'step 3' + }; + } else event.finish(); + ("step 3"); if (result.bool) { event.cards = result.links; - var list = [], str = [ - '小型', - '中型', - '巨型' - ]; + var list = [], + str = [ + "小型", + "中型", + "巨型", + ]; for (var i of event.cards) { if (!list.includes(get.suit(i))) list.push(get.suit(i)); } - player.chooseTarget('请选择' + str[list.length - 1] + '核弹的投射的目标(伤害:' + list.length + '点)', lib.filter.notMe, true).ai = (target) => { + player.chooseTarget( + "请选择" + + str[list.length - 1] + + "核弹的投射的目标(伤害:" + + list.length + + "点)", + lib.filter.notMe, + true + ).ai = (target) => { var att = 1; - if (target.sex == 'male') att = 1.5; - if (target.hp == target.sex == 'male' ? 2 : 1) att *= 1.2; - if (get.mode() == 'identity' && player.identity == 'fan' && target.isZhu) att *= 3; - return (-get.attitude(player, target)) * att * (Math.max(1, target.countCards('e'))); - } + if (target.sex == "male") att = 1.5; + if ((target.hp == target.sex) == "male" ? 2 : 1) att *= 1.2; + if (get.mode() == "identity" && player.identity == "fan" && target.isZhu) + att *= 3; + return -get.attitude(player, target) * att * Math.max(1, target.countCards("e")); + }; } - 'step 4' + ("step 4"); if (result.bool) { var list = []; for (var i of event.cards) { if (!list.includes(get.suit(i))) list.push(get.suit(i)); } player.loseToDiscardpile(event.cards); - player.logSkill('dcxingwu', result.targets[0]); - player.discardPlayerCard(result.targets[0], 'e', result.targets[0].countCards('e'), true); - result.targets[0].damage(result.targets[0].sex == 'female' ? 1 : list.length); + player.logSkill("dcxingwu", result.targets[0]); + player.discardPlayerCard( + result.targets[0], + "e", + result.targets[0].countCards("e"), + true + ); + result.targets[0].damage(result.targets[0].sex == "female" ? 1 : list.length); } }, }, - dcluoyan:{ - derivation:['retianxiang','liuli'], - init:function(player){ - if(player.getExpansions('dcxingwu').length) player.addAdditionalSkill('dcluoyan',['retianxiang','liuli']); - else player.removeAdditionalSkill('dcluoyan'); + dcluoyan: { + derivation: ["retianxiang", "liuli"], + init: function (player) { + if (player.getExpansions("dcxingwu").length) + player.addAdditionalSkill("dcluoyan", ["retianxiang", "liuli"]); + else player.removeAdditionalSkill("dcluoyan"); }, - onremove:function(player){ - player.removeAdditionalSkill('dcluoyan'); + onremove: function (player) { + player.removeAdditionalSkill("dcluoyan"); }, - trigger:{player:['loseAfter','loseAsyncAfter','addToExpansionAfter']}, - filter:function(event,player){ - var cards=player.getExpansions('dcxingwu'),skills=player.additionalSkills.dcluoyan; - return !((cards.length&&skills&&skills.length)||(!cards.length&&(!skills||!skills.length))); + trigger: { player: ["loseAfter", "loseAsyncAfter", "addToExpansionAfter"] }, + filter: function (event, player) { + var cards = player.getExpansions("dcxingwu"), + skills = player.additionalSkills.dcluoyan; + return !( + (cards.length && skills && skills.length) || + (!cards.length && (!skills || !skills.length)) + ); }, - forced:true, - silent:true, - content:function(){ - lib.skill.dcluoyan.init(player,'dcluoyan'); + forced: true, + silent: true, + content: function () { + lib.skill.dcluoyan.init(player, "dcluoyan"); }, }, - retianxiang_daxiaoqiao:{ - audio:'tianxiang_daxiaoqiao', - inherit:'retianxiang', + retianxiang_daxiaoqiao: { + audio: "tianxiang_daxiaoqiao", + inherit: "retianxiang", }, //田尚衣 - dcposuo:{ - onChooseToUse:function(event){ - if(!game.online&&!event.dcposuo_cards){ - var player=event.player; - var evtx=event.getParent('phaseUse'); - var suits=lib.suit.slice(0).reverse(); - suits=suits.filter(suit=>!player.getStorage('dcposuo_suits').includes(suit)&&player.countCards('hs',card=>get.suit(card,player)==suit)); - if(!suits.length||player.getHistory('sourceDamage',evt=>{ - return evt.player!=player&&evt.getParent('phaseUse')==evtx; - }).length) event.set('dcposuo_cards',undefined); - else{ - var list=[],cards=Array.from(ui.cardPile.childNodes); + dcposuo: { + onChooseToUse: function (event) { + if (!game.online && !event.dcposuo_cards) { + var player = event.player; + var evtx = event.getParent("phaseUse"); + var suits = lib.suit.slice(0).reverse(); + suits = suits.filter( + (suit) => + !player.getStorage("dcposuo_suits").includes(suit) && + player.countCards("hs", (card) => get.suit(card, player) == suit) + ); + if ( + !suits.length || + player.getHistory("sourceDamage", (evt) => { + return evt.player != player && evt.getParent("phaseUse") == evtx; + }).length + ) + event.set("dcposuo_cards", undefined); + else { + var list = [], + cards = Array.from(ui.cardPile.childNodes); cards.addArray(Array.from(ui.discardPile.childNodes)); - game.countPlayer(current=>cards.addArray(current.getCards('hejxs'))); - for(var name of lib.inpile){ - if(!get.tag({name:name},'damage')||get.type(new lib.element.VCard({name:name}))==='delay') continue; - let same=cards.filter(card=>get.name(card,false)==name&&!get.natureList(card,false).length); - if(same.length){ - for(var suit of suits){ - if(same.some(card=>get.suit(card,false)==suit)){ - list.push([suit,'',name,undefined,suit]); + game.countPlayer((current) => cards.addArray(current.getCards("hejxs"))); + for (var name of lib.inpile) { + if ( + !get.tag({ name: name }, "damage") || + get.type(new lib.element.VCard({ name: name })) === "delay" + ) + continue; + let same = cards.filter( + (card) => + get.name(card, false) == name && !get.natureList(card, false).length + ); + if (same.length) { + for (var suit of suits) { + if (same.some((card) => get.suit(card, false) == suit)) { + list.push([suit, "", name, undefined, suit]); } } } - for(var nature of lib.inpile_nature){ - same=cards.filter(card=>get.name(card,false)==name&&get.is.sameNature(get.natureList(card,false),nature)); - if(same.length){ - for(var suit of suits){ - if(same.some(card=>get.suit(card,false)==suit)){ - list.push([suit,'',name,nature,suit]); + for (var nature of lib.inpile_nature) { + same = cards.filter( + (card) => + get.name(card, false) == name && + get.is.sameNature(get.natureList(card, false), nature) + ); + if (same.length) { + for (var suit of suits) { + if (same.some((card) => get.suit(card, false) == suit)) { + list.push([suit, "", name, nature, suit]); } } } } } - event.set('dcposuo_cards',list); + event.set("dcposuo_cards", list); } } }, - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return event.dcposuo_cards&&event.dcposuo_cards.length; + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return event.dcposuo_cards && event.dcposuo_cards.length; }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('婆娑',[event.dcposuo_cards,'vcard'],'hidden'); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("婆娑", [event.dcposuo_cards, "vcard"], "hidden"); }, - check:function(button){ - var player=_status.event.player; - return player.getUseValue({name:button.link[2],nature:button.link[3]}); + check: function (button) { + var player = _status.event.player; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }); }, - backup:function(links,player){ + backup: function (links, player) { return { - suit:links[0][4], - filterCard:function(card,player){ - return get.suit(card,player)==lib.skill.dcposuo_backup.suit; + suit: links[0][4], + filterCard: function (card, player) { + return get.suit(card, player) == lib.skill.dcposuo_backup.suit; }, - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, }, - check:function(card){ - return 6.5-get.value(card); + check: function (card) { + return 6.5 - get.value(card); }, - precontent:function(){ - player.logSkill('dcposuo'); + precontent: function () { + player.logSkill("dcposuo"); delete event.result.skill; - player.addTempSkill('dcposuo_suits','phaseUseAfter'); - player.markAuto('dcposuo_suits',[get.suit(event.result.cards[0])]); + player.addTempSkill("dcposuo_suits", "phaseUseAfter"); + player.markAuto("dcposuo_suits", [get.suit(event.result.cards[0])]); }, - } + }; }, - prompt:function(links,player){ - var suit=links[0][4]; - var name=links[0][2]; - var nature=links[0][3]; - return '将一张'+get.translation(suit)+'牌当作'+(get.translation(nature)||'')+get.translation(name)+'使用'; + prompt: function (links, player) { + var suit = links[0][4]; + var name = links[0][2]; + var nature = links[0][3]; + return ( + "将一张" + + get.translation(suit) + + "牌当作" + + (get.translation(nature) || "") + + get.translation(name) + + "使用" + ); }, }, - ai:{ - order:10, - result:{player:1}, + ai: { + order: 10, + result: { player: 1 }, }, - subSkill:{ - suits:{ - charlotte:true, - onremove:true, + subSkill: { + suits: { + charlotte: true, + onremove: true, }, }, }, - dcxiaoren:{ - audio:2, - trigger:{ - source:'damageSource' + dcxiaoren: { + audio: 2, + trigger: { + source: "damageSource", }, - usable:1, - check:(event,player)=>{ - let rev=game.countPlayer(i=>{ - return i.isDamaged()&&get.attitude(_status.event.player,i)>0; + usable: 1, + check: (event, player) => { + let rev = game.countPlayer((i) => { + return i.isDamaged() && get.attitude(_status.event.player, i) > 0; }); - if(!event.player.isIn()||game.countPlayer()<2) return rev; - if(get.damageEffect(event.player.getPrevious(),player,_status.event.player)>-rev) return true; - return get.damageEffect(event.player.getNext(),player,_status.event.player)>-rev; + if (!event.player.isIn() || game.countPlayer() < 2) return rev; + if (get.damageEffect(event.player.getPrevious(), player, _status.event.player) > -rev) + return true; + return get.damageEffect(event.player.getNext(), player, _status.event.player) > -rev; }, - content:function(){ - 'step 0' - player.addTempSkill('dcxiaoren_dying'); - event.target=trigger.player; - 'step 1' + content: function () { + "step 0"; + player.addTempSkill("dcxiaoren_dying"); + event.target = trigger.player; + ("step 1"); player.judge(); - 'step 2' - if(result.color=='red') player.chooseTarget('绡刃:是否令一名角色回复1点体力(若回满则额外摸一张牌)?').set('ai',target=>{ - let rec=get.recoverEffect(target,_status.event.player,_status.event.player); - if(target.getDamagedHp()<=1) return rec+get.effect(target,{name:'draw'},target,_status.event.player); - return rec; - }); - else if(result.color!='black'||!trigger.player.isIn()||game.countPlayer()<2) event.goto(9); + ("step 2"); + if (result.color == "red") + player + .chooseTarget("绡刃:是否令一名角色回复1点体力(若回满则额外摸一张牌)?") + .set("ai", (target) => { + let rec = get.recoverEffect( + target, + _status.event.player, + _status.event.player + ); + if (target.getDamagedHp() <= 1) + return ( + rec + + get.effect(target, { name: "draw" }, target, _status.event.player) + ); + return rec; + }); + else if (result.color != "black" || !trigger.player.isIn() || game.countPlayer() < 2) + event.goto(9); else event.goto(5); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - event.target=target; + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; player.line(target); target.recover(); - } - else event.goto(9); - 'step 4' - if(event.target.isHealthy()) event.target.draw(); + } else event.goto(9); + ("step 4"); + if (event.target.isHealthy()) event.target.draw(); event.goto(9); - 'step 5' - var targets=[].addArray([target.getPrevious(),target.getNext()]); - if(targets.length>1) player.chooseTarget('绡刃:对其中一名角色造成1点伤害',(card,player,target)=>{ - return _status.event.targets.includes(target); - },true).set('ai',target=>{ - let player=_status.event.player; - return get.damageEffect(target,player,player); - }).set('targets',targets); - else if(targets.length) event._result={bool:true,targets:targets}; - 'step 6' - if(result.bool){ - let target=result.targets[0]; - event.target=target; + ("step 5"); + var targets = [].addArray([target.getPrevious(), target.getNext()]); + if (targets.length > 1) + player + .chooseTarget( + "绡刃:对其中一名角色造成1点伤害", + (card, player, target) => { + return _status.event.targets.includes(target); + }, + true + ) + .set("ai", (target) => { + let player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .set("targets", targets); + else if (targets.length) event._result = { bool: true, targets: targets }; + ("step 6"); + if (result.bool) { + let target = result.targets[0]; + event.target = target; player.line(target); - target.damage('nocard'); - } - else event.goto(9); - 'step 7' - if(player.storage.dcxiaoren_dying||get.is.blocked(event.name,player)) event._result={bool:false}; - else if(event.frequent) event._result={bool:true}; - else player.chooseBool('绡刃:是否再次进行判定并执行对应效果直到未能执行此项或有角色进入濒死状态?').set('ai',function(){ - return _status.event.bool; - }).set('bool',lib.skill.dcxiaoren.check({player:event.target},player)); - 'step 8' - if(result.bool){ - event.frequent=true; + target.damage("nocard"); + } else event.goto(9); + ("step 7"); + if (player.storage.dcxiaoren_dying || get.is.blocked(event.name, player)) + event._result = { bool: false }; + else if (event.frequent) event._result = { bool: true }; + else + player + .chooseBool( + "绡刃:是否再次进行判定并执行对应效果直到未能执行此项或有角色进入濒死状态?" + ) + .set("ai", function () { + return _status.event.bool; + }) + .set("bool", lib.skill.dcxiaoren.check({ player: event.target }, player)); + ("step 8"); + if (result.bool) { + event.frequent = true; event.goto(1); } - 'step 9' - player.removeSkill('dcxiaoren_dying'); + ("step 9"); + player.removeSkill("dcxiaoren_dying"); }, - subSkill:{ - dying:{ - init:(player)=>{ + subSkill: { + dying: { + init: (player) => { delete player.storage.dcxiaoren_dying; }, - onremove:(player)=>{ + onremove: (player) => { delete player.storage.dcxiaoren_dying; }, - trigger:{global:'dying'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - player.storage.dcxiaoren_dying=true; - } + trigger: { global: "dying" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + player.storage.dcxiaoren_dying = true; + }, }, - } + }, }, //孙翎鸾 - dclingyue:{ - audio:2, - trigger:{global:'damageSource'}, - forced:true, - filter:function(event,player){ - if(!event.source||!event.source.isIn()) return false; - var history=event.source.actionHistory; - for(var i=history.length-1;i>=0;i--){ - if(i==history.length-1){ - if(history[i].sourceDamage.indexOf(event)>0) return false; - } - else if(history[i].sourceDamage.some(evt=>evt!=event)) return false; - if(history[i].isRound) break; + dclingyue: { + audio: 2, + trigger: { global: "damageSource" }, + forced: true, + filter: function (event, player) { + if (!event.source || !event.source.isIn()) return false; + var history = event.source.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + if (i == history.length - 1) { + if (history[i].sourceDamage.indexOf(event) > 0) return false; + } else if (history[i].sourceDamage.some((evt) => evt != event)) return false; + if (history[i].isRound) break; } return true; }, - content:function(){ - var num=1,current=_status.currentPhase; - if(current&&trigger.source!=current){ - var num=0,players=game.players.slice(0).concat(game.dead); - for(var target of players){ - target.getHistory('sourceDamage',function(evt){ - num+=evt.num; + content: function () { + var num = 1, + current = _status.currentPhase; + if (current && trigger.source != current) { + var num = 0, + players = game.players.slice(0).concat(game.dead); + for (var target of players) { + target.getHistory("sourceDamage", function (evt) { + num += evt.num; }); } } player.draw(num); }, }, - dcpandi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - var players=event.dcpandi; - if(!players||!players.length) return false; - var source=player.storage.dcpandi_effect; - return get.itemtype(source)!='player'||!source.isIn(); + dcpandi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + var players = event.dcpandi; + if (!players || !players.length) return false; + var source = player.storage.dcpandi_effect; + return get.itemtype(source) != "player" || !source.isIn(); }, - pandi_wrapKey:function(){ + pandi_wrapKey: function () { var str = ""; - for(var arg of arguments){ - if(arg === null || arg === undefined){ - str += (arg + "-"); + for (var arg of arguments) { + if (arg === null || arg === undefined) { + str += arg + "-"; continue; } - switch(get.itemtype(arg)){ - case 'player': - str+=("p:"+arg.playerid); + switch (get.itemtype(arg)) { + case "player": + str += "p:" + arg.playerid; break; - case 'card': - if(arg.cardid){ - str+=("c:"+arg.cardid); - }else{ - str+=("c:"+arg.name); + case "card": + if (arg.cardid) { + str += "c:" + arg.cardid; + } else { + str += "c:" + arg.name; } break; default: - str+=("n:"+arg); + str += "n:" + arg; break; } - str+="-"; + str += "-"; } return str; }, - pandi_effect:function(target,card,player,viewer){ - if(!_status.event)return get.effect(target,card,player,viewer); - var key = lib.skill.dcpandi.pandi_wrapKey.apply(null,arguments); - var effect = _status.event.getTempCache('effect',key); - if(effect !== undefined)return effect; - effect = get.effect(target,card,player,viewer); - _status.event.putTempCache('effect',key,effect); + pandi_effect: function (target, card, player, viewer) { + if (!_status.event) return get.effect(target, card, player, viewer); + var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments); + var effect = _status.event.getTempCache("effect", key); + if (effect !== undefined) return effect; + effect = get.effect(target, card, player, viewer); + _status.event.putTempCache("effect", key, effect); return effect; }, - pandi_canUse:function(player,card,target,arg1,arg2){ - if(!_status.event)return player.canUse(card,target,arg1,arg2); - var key = lib.skill.dcpandi.pandi_wrapKey.apply(null,arguments); - var effect = _status.event.getTempCache('canUse',key); - if(effect !== undefined)return effect; - effect = player.canUse(card,target,arg1,arg2); - _status.event.putTempCache('canUse',key,effect); + pandi_canUse: function (player, card, target, arg1, arg2) { + if (!_status.event) return player.canUse(card, target, arg1, arg2); + var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments); + var effect = _status.event.getTempCache("canUse", key); + if (effect !== undefined) return effect; + effect = player.canUse(card, target, arg1, arg2); + _status.event.putTempCache("canUse", key, effect); return effect; }, - pandi_effect_use:function(target,card,player,viewer){ - if(!_status.event)return get.effect_use(target,card,player,viewer); - var key = lib.skill.dcpandi.pandi_wrapKey.apply(null,arguments); - var effect = _status.event.getTempCache('effect_use',key); - if(effect !== undefined)return effect; - effect = get.effect_use(target,card,player,viewer); - _status.event.putTempCache('effect_use',key,effect); + pandi_effect_use: function (target, card, player, viewer) { + if (!_status.event) return get.effect_use(target, card, player, viewer); + var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments); + var effect = _status.event.getTempCache("effect_use", key); + if (effect !== undefined) return effect; + effect = get.effect_use(target, card, player, viewer); + _status.event.putTempCache("effect_use", key, effect); return effect; }, - onChooseToUse:function(event){ - if(!game.online&&event.type=='phase'&&!event.dcpandi){ - var players=game.filterPlayer(function(current){ - return current!=event.player&¤t.getHistory('sourceDamage').length==0; - }) - event.set('dcpandi',players) + onChooseToUse: function (event) { + if (!game.online && event.type == "phase" && !event.dcpandi) { + var players = game.filterPlayer(function (current) { + return current != event.player && current.getHistory("sourceDamage").length == 0; + }); + event.set("dcpandi", players); } }, - filterTarget:function(card,player,target){ - var players=_status.event.dcpandi; - if(!players||!players.length) return false; + filterTarget: function (card, player, target) { + var players = _status.event.dcpandi; + if (!players || !players.length) return false; return players.includes(target); }, - content:function(){ - if(target.isIn()){ - player.storage.dcpandi_effect=target; - player.addTempSkill('dcpandi_effect','phaseUseAfter'); + content: function () { + if (target.isIn()) { + player.storage.dcpandi_effect = target; + player.addTempSkill("dcpandi_effect", "phaseUseAfter"); } }, - ai:{ - threaten:4, - order:12, - result:{ - player:function(player,target){ - return player.getCards('hs').reduce(function(eff,card){ - return Math.max(eff,lib.skill.dcpandi.getUseValue(card,target,player)-lib.skill.dcpandi.getUseValue(card,player,player)) - },0) + ai: { + threaten: 4, + order: 12, + result: { + player: function (player, target) { + return player.getCards("hs").reduce(function (eff, card) { + return Math.max( + eff, + lib.skill.dcpandi.getUseValue(card, target, player) - + lib.skill.dcpandi.getUseValue(card, player, player) + ); + }, 0); }, }, }, - getUseValue:function(card,player,viewer){ - if(typeof(card)=='string'){ - card={name:card,isCard:true}; + getUseValue: function (card, player, viewer) { + if (typeof card == "string") { + card = { name: card, isCard: true }; } - var key = lib.skill.dcpandi.pandi_wrapKey(card,player,viewer); - if(_status.event){ - var uv = _status.event.getTempCache('getUseValue',key); - if(uv!==undefined){ + var key = lib.skill.dcpandi.pandi_wrapKey(card, player, viewer); + if (_status.event) { + var uv = _status.event.getTempCache("getUseValue", key); + if (uv !== undefined) { return uv; } } - var targets=game.filterPlayer(); - var value=[]; - var min=0; - var info=get.info(card); - if(!info||info.notarget){ - if(_status.event){ - _status.event.putTempCache('getUseValue',key,0); + var targets = game.filterPlayer(); + var value = []; + var min = 0; + var info = get.info(card); + if (!info || info.notarget) { + if (_status.event) { + _status.event.putTempCache("getUseValue", key, 0); } return 0; } var range; - var select=get.copy(info.selectTarget); - if(select==undefined){ - if(info.filterTarget==undefined) { - if(_status.event){ - _status.event.putTempCache('getUseValue',key,true); + var select = get.copy(info.selectTarget); + if (select == undefined) { + if (info.filterTarget == undefined) { + if (_status.event) { + _status.event.putTempCache("getUseValue", key, true); } return true; } - range=[1,1]; - } - else if(typeof select=='number') range=[select,select]; - else if(get.itemtype(select)=='select') range=select; - else if(typeof select=='function') range=select(card,player); - if(info.singleCard) range=[1,1]; - game.checkMod(card,player,range,'selectTarget',player); - if(!range){ - if(_status.event){ - _status.event.putTempCache('getUseValue',key,0); + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, player); + if (info.singleCard) range = [1, 1]; + game.checkMod(card, player, range, "selectTarget", player); + if (!range) { + if (_status.event) { + _status.event.putTempCache("getUseValue", key, 0); } return 0; } - for(var i=0;iplayer.storage.dcpandi_effect, - content:function(){ - trigger.player=player.storage.dcpandi_effect; - trigger.noai=true; - player.removeSkill('dcpandi_effect'); + logTarget: (event, player) => player.storage.dcpandi_effect, + content: function () { + trigger.player = player.storage.dcpandi_effect; + trigger.noai = true; + player.removeSkill("dcpandi_effect"); game.delay(0.5); }, - ai:{ - order:function(card,player,target,current){ - if(typeof card!='object') return; - var source=player.storage.dcpandi_effect; - if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; - return [0,lib.skill.dcpandi.pandi_effect_use(target,card,source,player),0,lib.skill.dcpandi.pandi_effect(target,card,source,target)] + ai: { + order: function (card, player, target, current) { + if (typeof card != "object") return; + var source = player.storage.dcpandi_effect; + if ( + !source.isIn() || + get.itemtype(source) != "player" || + get.itemtype(source.storage.dcpandi_effect) == "player" + ) + return; + return [ + 0, + lib.skill.dcpandi.pandi_effect_use(target, card, source, player), + 0, + lib.skill.dcpandi.pandi_effect(target, card, source, target), + ]; }, }, - mod:{ - selectCard:function(card,player,range){ - var source=player.storage.dcpandi_effect; - if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; - var range,info=get.info(card); - var select=get.copy(info.selectTarget); - if(select==undefined){ - if(info.filterTarget==undefined) return [0,0]; - range=[1,1]; - } - else if(typeof select=='number') range=[select,select]; - else if(get.itemtype(select)=='select') range=select; - else if(typeof select=='function') range=select(card,source); - game.checkMod(card,source,range,'selectTarget',source); + mod: { + selectCard: function (card, player, range) { + var source = player.storage.dcpandi_effect; + if ( + !source.isIn() || + get.itemtype(source) != "player" || + get.itemtype(source.storage.dcpandi_effect) == "player" + ) + return; + var range, + info = get.info(card); + var select = get.copy(info.selectTarget); + if (select == undefined) { + if (info.filterTarget == undefined) return [0, 0]; + range = [1, 1]; + } else if (typeof select == "number") range = [select, select]; + else if (get.itemtype(select) == "select") range = select; + else if (typeof select == "function") range = select(card, source); + game.checkMod(card, source, range, "selectTarget", source); }, - cardEnabled2:function(card,player,event){ - var source=player.storage.dcpandi_effect; - if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; - var check=game.checkMod(card,source,event,'unchanged','cardEnabled2',source); + cardEnabled2: function (card, player, event) { + var source = player.storage.dcpandi_effect; + if ( + !source.isIn() || + get.itemtype(source) != "player" || + get.itemtype(source.storage.dcpandi_effect) == "player" + ) + return; + var check = game.checkMod( + card, + source, + event, + "unchanged", + "cardEnabled2", + source + ); return check; }, - cardEnabled:function(card,player,event){ - var source=player.storage.dcpandi_effect; - if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; - if(event==='forceEnable'){ - var mod=game.checkMod(card,source,event,'unchanged','cardEnabled',source); - if(mod!='unchanged') return mod; + cardEnabled: function (card, player, event) { + var source = player.storage.dcpandi_effect; + if ( + !source.isIn() || + get.itemtype(source) != "player" || + get.itemtype(source.storage.dcpandi_effect) == "player" + ) + return; + if (event === "forceEnable") { + var mod = game.checkMod( + card, + source, + event, + "unchanged", + "cardEnabled", + source + ); + if (mod != "unchanged") return mod; return true; - } - else{ - var filter=get.info(card).enable; - if(!filter) return; - var mod=game.checkMod(card,player,source,'unchanged','cardEnabled',source); - if(mod!='unchanged') return mod; - if(typeof filter=='boolean') return filter; - if(typeof filter=='function') return filter(card,source,event); + } else { + var filter = get.info(card).enable; + if (!filter) return; + var mod = game.checkMod( + card, + player, + source, + "unchanged", + "cardEnabled", + source + ); + if (mod != "unchanged") return mod; + if (typeof filter == "boolean") return filter; + if (typeof filter == "function") return filter(card, source, event); } }, - cardUsable:function(card,player,num){ - var source=player.storage.dcpandi_effect; - if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; - var event=_status.event; - if(event.type=='chooseToUse_button') event=event.getParent(); - if(source!=_status.event.player) return true; - if(info.updateUsable=='phaseUse'){ - if(event.getParent().name!='phaseUse') return true; - if(event.getParent().player!=source) return true; + cardUsable: function (card, player, num) { + var source = player.storage.dcpandi_effect; + if ( + !source.isIn() || + get.itemtype(source) != "player" || + get.itemtype(source.storage.dcpandi_effect) == "player" + ) + return; + var event = _status.event; + if (event.type == "chooseToUse_button") event = event.getParent(); + if (source != _status.event.player) return true; + if (info.updateUsable == "phaseUse") { + if (event.getParent().name != "phaseUse") return true; + if (event.getParent().player != source) return true; } - event.addCount_extra=true; - var num=info.usable; - if(typeof num=='function') num=num(card,source); - num=game.checkMod(card,source,num,event,'cardUsable',source); - if(typeof num!='number') return true; - if(source.countUsed(card)4) return false; - if(event.name=='die') return true; - return event.name!='phase'||game.phaseNumber==0; + forced: true, + filter: function (event, player) { + if (game.countGroup() > 4) return false; + if (event.name == "die") return true; + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - player.addSkill('dctongye_buff'); - var num=game.countGroup(); - if(num<=4){ - player.addMark('dctongye_handcard',3,false); - game.log(player,'手牌上限','#y+3'); + content: function () { + player.addSkill("dctongye_buff"); + var num = game.countGroup(); + if (num <= 4) { + player.addMark("dctongye_handcard", 3, false); + game.log(player, "手牌上限", "#y+3"); } - if(num<=3){ - player.addMark('dctongye_range',3,false); - game.log(player,'攻击范围','#y+3'); + if (num <= 3) { + player.addMark("dctongye_range", 3, false); + game.log(player, "攻击范围", "#y+3"); } - if(num<=2){ - player.addMark('dctongye_sha',3,false); - game.log(player,'使用杀的次数上限','#y+3'); + if (num <= 2) { + player.addMark("dctongye_sha", 3, false); + game.log(player, "使用杀的次数上限", "#y+3"); } - if(num<=1){ - player.addMark('dctongye_draw',3,false); - game.log(player,'摸牌阶段额定摸牌数','#y+3'); + if (num <= 1) { + player.addMark("dctongye_draw", 3, false); + game.log(player, "摸牌阶段额定摸牌数", "#y+3"); } }, - subSkill:{ - buff:{ - audio:'dctongye', - trigger:{player:'phaseDrawBegin2'}, - forced:true, - filter:function(event,player){ - if(!player.hasMark('dctongye_draw')) return false; + subSkill: { + buff: { + audio: "dctongye", + trigger: { player: "phaseDrawBegin2" }, + forced: true, + filter: function (event, player) { + if (!player.hasMark("dctongye_draw")) return false; return !event.numFixed; }, - content:function(){ - trigger.num+=player.countMark('dctongye_draw'); + content: function () { + trigger.num += player.countMark("dctongye_draw"); }, - charlotte:true, - onremove:['dctongye_handcard','dctongye_range','dctongye_sha','dctongye_draw'], - mark:true, - marktext:'统', - intro:{ - content:function(storage,player){ - var str=''; - var hand=player.countMark('dctongye_handcard'),range=player.countMark('dctongye_range'),sha=player.countMark('dctongye_sha'),draw=player.countMark('dctongye_draw'); - if(hand>0){ - str+='
  • 手牌上限+'+hand+';'; + charlotte: true, + onremove: ["dctongye_handcard", "dctongye_range", "dctongye_sha", "dctongye_draw"], + mark: true, + marktext: "统", + intro: { + content: function (storage, player) { + var str = ""; + var hand = player.countMark("dctongye_handcard"), + range = player.countMark("dctongye_range"), + sha = player.countMark("dctongye_sha"), + draw = player.countMark("dctongye_draw"); + if (hand > 0) { + str += "
  • 手牌上限+" + hand + ";"; } - if(range>0){ - str+='
  • 攻击范围+'+range+';'; + if (range > 0) { + str += "
  • 攻击范围+" + range + ";"; } - if(sha>0){ - str+='
  • 使用【杀】的次数上限+'+sha+';' + if (sha > 0) { + str += "
  • 使用【杀】的次数上限+" + sha + ";"; } - if(draw>0){ - str+='
  • 摸牌阶段额定摸牌数+'+draw+'。'; + if (draw > 0) { + str += "
  • 摸牌阶段额定摸牌数+" + draw + "。"; } - str=str.slice(0,-1)+'。'; + str = str.slice(0, -1) + "。"; return str; - } + }, }, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('dctongye_handcard'); + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dctongye_handcard"); }, - attackRange:function(player,num){ - return num+player.countMark('dctongye_range'); + attackRange: function (player, num) { + return num + player.countMark("dctongye_range"); }, - cardUsable:function(card,player,num){ - if(card.name=='sha'){ - return num+player.countMark('dctongye_sha'); + cardUsable: function (card, player, num) { + if (card.name == "sha") { + return num + player.countMark("dctongye_sha"); } }, }, - ai:{ - threaten:2.6, + ai: { + threaten: 2.6, }, }, }, }, - dcmianyao:{ - audio:2, - trigger:{ - player:'phaseDrawEnd', + dcmianyao: { + audio: 2, + trigger: { + player: "phaseDrawEnd", }, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('dcmianyao'),'展示点数最小的一张牌并随机插入牌堆中,然后于回合结束时摸此牌点数张牌。',function(card,player){ - var num=get.number(card,player); - return !player.hasCard(card2=>{ - return card!=card2&&get.number(card2,player) { + return card != card2 && get.number(card2, player) < num; + }); + } + ) + .set("ai", (card) => { + var player = _status.event.player; + var value = player.getUseValue(card, null, true); + if (value > 5 && get.number(card) <= 2) return 0; + return 1 + 1 / Math.max(0.1, value); }); - }).set('ai',card=>{ - var player=_status.event.player; - var value=player.getUseValue(card,null,true); - if(value>5&&get.number(card)<=2) return 0; - return 1+1/Math.max(0.1,value); - }); - 'step 1' - if(result.bool){ - player.logSkill('dcmianyao'); - var card=result.cards[0]; - event.card=card; - player.showCards([card],get.translation(player)+'发动了【免徭】'); - } - else event.finish(); - 'step 2' - player.$throw(1,1000); - player.lose(card,ui.cardPile).insert_index=function(){ - return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; - } - player.addTempSkill('dcmianyao_draw'); - var num=get.number(card); - if(num>0) player.addMark('dcmianyao_draw',num,false); + ("step 1"); + if (result.bool) { + player.logSkill("dcmianyao"); + var card = result.cards[0]; + event.card = card; + player.showCards([card], get.translation(player) + "发动了【免徭】"); + } else event.finish(); + ("step 2"); + player.$throw(1, 1000); + player.lose(card, ui.cardPile).insert_index = function () { + return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)]; + }; + player.addTempSkill("dcmianyao_draw"); + var num = get.number(card); + if (num > 0) player.addMark("dcmianyao_draw", num, false); }, - subSkill:{ - draw:{ - trigger:{ - player:'phaseEnd', + subSkill: { + draw: { + trigger: { + player: "phaseEnd", }, - filter:function(event,player){ - return player.hasMark('dcmianyao_draw'); + filter: function (event, player) { + return player.hasMark("dcmianyao_draw"); }, - forced:true, - charlotte:true, - onremove:true, - content:function(){ - player.draw(player.countMark('dcmianyao_draw')); + forced: true, + charlotte: true, + onremove: true, + content: function () { + player.draw(player.countMark("dcmianyao_draw")); }, - } - } + }, + }, }, - dcchangqu:{ - audio:2, - enable:'phaseUse', - usable:1, - selectTarget:function(){ - return [1,game.countPlayer()-1]; + dcchangqu: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectTarget: function () { + return [1, game.countPlayer() - 1]; }, - complexSelect:true, - complexTarget:true, - multitarget:true, - multiline:true, - filterTarget:function(card,player,target){ - if(player==target) return false; - var next=player.getNext(),prev=player.getPrevious(); - var selected=ui.selected.targets; - if(!selected.includes(next)&&!selected.includes(prev)) return (target==next||target==prev); - for(var i of selected){ - if(i.getNext()==target||i.getPrevious()==target) return true; + complexSelect: true, + complexTarget: true, + multitarget: true, + multiline: true, + filterTarget: function (card, player, target) { + if (player == target) return false; + var next = player.getNext(), + prev = player.getPrevious(); + var selected = ui.selected.targets; + if (!selected.includes(next) && !selected.includes(prev)) + return target == next || target == prev; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; } return false; }, - contentBefore:function(){ - event.getParent()._dcchangqu_targets=targets.slice(); + contentBefore: function () { + event.getParent()._dcchangqu_targets = targets.slice(); }, - content:function(){ - 'step 0' - event.targets=event.getParent()._dcchangqu_targets; - var current=targets[0]; - current.addMark('dcchangqu_warship'); - current.addMark('dcchangqu_warshipx',1,false); - event.num=0; + content: function () { + "step 0"; + event.targets = event.getParent()._dcchangqu_targets; + var current = targets[0]; + current.addMark("dcchangqu_warship"); + current.addMark("dcchangqu_warshipx", 1, false); + event.num = 0; game.delayx(); - 'step 1' - var target=targets.shift(); - event.target=target; - var num=Math.max(1,event.num); - var nextPlayer=targets.find(i=>{ + ("step 1"); + var target = targets.shift(); + event.target = target; + var num = Math.max(1, event.num); + var nextPlayer = targets.find((i) => { return i.isIn(); }); - if(target.hasMark('dcchangqu_warshipx')){ - var prompt2='是否交给'+get.translation(player)+get.cnNumber(num)+'张手牌?'+(nextPlayer?'若如此做,将“战舰”移动给'+get.translation(nextPlayer)+',':',')+'否则你下次受到的属性伤害值+'+num; - target.chooseCard(get.translation(player)+'对你发动了【长驱】',prompt2,num).set('ai',card=>{ - if(_status.event.att>0) return 15-get.value(card); - if(_status.event.take) return 0; - return 8.2-0.8*Math.min(5,_status.event.target.hp+_status.event.target.hujia)-get.value(card); - }).set('att',get.attitude(target,player)).set('take',function(){ - var base=num; - var getEffect=function(target,player,num){ - var natures=['fire','thunder','ice']; - return natures.map(nature=>{ - return get.damageEffect(target,target,player,nature)*Math.sqrt(num)/Math.min(1.5,1+target.countCards('h')); - }).reduce((sum,eff)=>{ - return sum+eff; - },0)/natures.length; - } - var eff=getEffect(player,player,base); - return targets.some((current,ind)=>{ - var num=base+ind+1; - var effx=getEffect(current,player,num); - return effx { + if (_status.event.att > 0) return 15 - get.value(card); + if (_status.event.take) return 0; + return ( + 8.2 - + 0.8 * Math.min(5, _status.event.target.hp + _status.event.target.hujia) - + get.value(card) + ); + }) + .set("att", get.attitude(target, player)) + .set("take", function () { + var base = num; + var getEffect = function (target, player, num) { + var natures = ["fire", "thunder", "ice"]; + return ( + natures + .map((nature) => { + return ( + (get.damageEffect(target, target, player, nature) * + Math.sqrt(num)) / + Math.min(1.5, 1 + target.countCards("h")) + ); + }) + .reduce((sum, eff) => { + return sum + eff; + }, 0) / natures.length + ); + }; + var eff = getEffect(player, player, base); + return targets + .some((current, ind) => { + var num = base + ind + 1; + var effx = getEffect(current, player, num); + return effx < eff; + }) + .set("target", target); + }); + } else event.goto(4); + ("step 2"); + if (result.bool) { + var cards = result.cards; + target.give(cards, player); event.num++; - } - else{ - target.addSkill('dcchangqu_add'); - target.addMark('dcchangqu_add',Math.max(1,event.num),false); + } else { + target.addSkill("dcchangqu_add"); + target.addMark("dcchangqu_add", Math.max(1, event.num), false); target.link(true); event.goto(4); } - 'step 3' - var nextPlayer=targets.find(i=>{ + ("step 3"); + var nextPlayer = targets.find((i) => { return i.isIn(); }); - if(nextPlayer){ + if (nextPlayer) { target.line(nextPlayer); - nextPlayer.addMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); - nextPlayer.addMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); + nextPlayer.addMark("dcchangqu_warship", target.countMark("dcchangqu_warship")); + nextPlayer.addMark( + "dcchangqu_warshipx", + target.countMark("dcchangqu_warshipx"), + false + ); event.goto(1); game.delayx(); } - target.removeMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); - target.removeMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); - 'step 4' - var targets=game.players.slice().concat(game.dead); - targets.forEach(i=>{ + target.removeMark("dcchangqu_warship", target.countMark("dcchangqu_warship")); + target.removeMark("dcchangqu_warshipx", target.countMark("dcchangqu_warshipx"), false); + ("step 4"); + var targets = game.players.slice().concat(game.dead); + targets.forEach((i) => { delete i.storage.dcchangqu_warshipx; }); }, - ai:{ - order:10, - expose:0.05, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - var targets=game.filterPlayer(i=>i!=player); + ai: { + order: 10, + expose: 0.05, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + var targets = game.filterPlayer((i) => i != player); targets.sortBySeat(player); - var targets2=targets.reverse(); - var sum=0; - var maxSum=-Infinity,maxIndex=-1; - var maxSum2=-Infinity,maxIndex2=-1; - for(var i=0;imaxSum){ - maxSum=sum; - maxIndex=i; + var targets2 = targets.reverse(); + var sum = 0; + var maxSum = -Infinity, + maxIndex = -1; + var maxSum2 = -Infinity, + maxIndex2 = -1; + for (var i = 0; i < targets.length; i++) { + var current = targets[i]; + var att = -get.attitude(player, current) - 0.1; + var val = Math.sqrt(i + 1) * att; + val /= 0.01 + Math.max(3, current.countCards("h") / 2); + sum += val; + if (sum > maxSum) { + maxSum = sum; + maxIndex = i; } } - var sum=0; - for(var i=0;imaxSum2){ - maxSum2=sum; - maxIndex2=i; + var sum = 0; + for (var i = 0; i < targets2.length; i++) { + var current = targets[i]; + var att = -get.attitude(player, current) - 0.1; + var val = Math.sqrt(i + 1) * att; + val /= 0.01 + Math.max(3, current.countCards("h") / 2); + sum += val; + if (sum > maxSum2) { + maxSum2 = sum; + maxIndex2 = i; } } - if(maxSummaxIndex) return -100*get.sgnAttitude(player,target); - if(target==targets[ui.selected.targets.length]) return get.sgnAttitude(player,target); + if (ui.selected.targets.length > maxIndex) + return -100 * get.sgnAttitude(player, target); + if (target == targets[ui.selected.targets.length]) + return get.sgnAttitude(player, target); return 0; - } + }, }, }, - subSkill:{ - warship:{ - marktext:'舰', - intro:{ - name:'战舰', - name2:'战舰', - content:'这里停了&艘战舰!不过啥用没有。', - } + subSkill: { + warship: { + marktext: "舰", + intro: { + name: "战舰", + name2: "战舰", + content: "这里停了&艘战舰!不过啥用没有。", + }, }, - add:{ - trigger:{ - player:'damageBegin3', + add: { + trigger: { + player: "damageBegin3", }, - filter:function(event,player){ - return event.hasNature()&&player.hasMark('dcchangqu_add'); + filter: function (event, player) { + return event.hasNature() && player.hasMark("dcchangqu_add"); }, - forced:true, - onremove:true, - charlotte:true, - content:function(){ - 'step 0' - trigger.num+=player.countMark('dcchangqu_add'); - player.removeSkill('dcchangqu_add'); + forced: true, + onremove: true, + charlotte: true, + content: function () { + "step 0"; + trigger.num += player.countMark("dcchangqu_add"); + player.removeSkill("dcchangqu_add"); + }, + marktext: "驱", + intro: { + content: "下次受到的属性伤害+#", }, - marktext:'驱', - intro:{ - content:'下次受到的属性伤害+#', - } }, - } + }, }, //周不疑 - dcshiji:{ - audio:2, - trigger:{ - global:'phaseJieshuBegin', + dcshiji: { + audio: 2, + trigger: { + global: "phaseJieshuBegin", }, - filter:function(event,player){ - return event.player.isIn()&&!event.player.getHistory('sourceDamage').length; + filter: function (event, player) { + return event.player.isIn() && !event.player.getHistory("sourceDamage").length; }, - direct:true, - content:function(){ - 'step 0' - trigger.player.addTempSkill('dcshiji_forbidself'); - var list=[]; - for(var name of lib.inpile){ - var type=get.type(name); - if(type!='trick') continue; - if(player.getStorage('dcshiji_used').includes(name)) continue; - var card={ - name:name, - storage:{dcshiji:true}, + direct: true, + content: function () { + "step 0"; + trigger.player.addTempSkill("dcshiji_forbidself"); + var list = []; + for (var name of lib.inpile) { + var type = get.type(name); + if (type != "trick") continue; + if (player.getStorage("dcshiji_used").includes(name)) continue; + var card = { + name: name, + storage: { dcshiji: true }, }; - if(trigger.player.hasUseTarget(card)){ - list.push([type,'',name]); + if (trigger.player.hasUseTarget(card)) { + list.push([type, "", name]); } } - if(list.length){ - player.chooseButton([get.prompt('dcshiji',trigger.player),[list,'vcard']]).set('ai',button=>{ - if(_status.event.tochoose) return _status.event.getTrigger().player.getUseValue({name:button.link[2]}); - return 0; - }).set('tochoose',get.attitude(player,trigger.player)>0&&trigger.player.hasCard(card=>{ - return get.value(card)<7; - },'hes')); - } - else event.finish(); - 'step 1' - if(result.bool){ - var card={ - name:result.links[0][2], - storage:{dcshiji:true}, + if (list.length) { + player + .chooseButton([get.prompt("dcshiji", trigger.player), [list, "vcard"]]) + .set("ai", (button) => { + if (_status.event.tochoose) + return _status.event + .getTrigger() + .player.getUseValue({ name: button.link[2] }); + return 0; + }) + .set( + "tochoose", + get.attitude(player, trigger.player) > 0 && + trigger.player.hasCard((card) => { + return get.value(card) < 7; + }, "hes") + ); + } else event.finish(); + ("step 1"); + if (result.bool) { + var card = { + name: result.links[0][2], + storage: { dcshiji: true }, }; - var str=get.translation(card); - player.logSkill('dcshiji',trigger.player); - player.addTempSkill('dcshiji_used','roundStart'); - player.markAuto('dcshiji_used',[card.name]); + var str = get.translation(card); + player.logSkill("dcshiji", trigger.player); + player.addTempSkill("dcshiji_used", "roundStart"); + player.markAuto("dcshiji_used", [card.name]); player.popup(str); - game.log(player,'声明了','#y'+str); - game.broadcastAll(function(card){ - lib.skill.dcshiji_backup.viewAs=card; - lib.skill.dcshiji_backup.prompt='十计:是否将一张牌当做'+get.translation(card)+'使用?'; - },card); - var next=trigger.player.chooseToUse(); - next.set('openskilldialog','十计:是否将一张牌当做'+get.translation(card)+'使用?'); - next.set('norestore',true); - next.set('addCount',false); - next.set('_backupevent','dcshiji_backup'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + game.log(player, "声明了", "#y" + str); + game.broadcastAll(function (card) { + lib.skill.dcshiji_backup.viewAs = card; + lib.skill.dcshiji_backup.prompt = + "十计:是否将一张牌当做" + get.translation(card) + "使用?"; + }, card); + var next = trigger.player.chooseToUse(); + next.set( + "openskilldialog", + "十计:是否将一张牌当做" + get.translation(card) + "使用?" + ); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "dcshiji_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('dcshiji_backup'); + next.backup("dcshiji_backup"); } }, - subSkill:{ - backup:{ - filterCard:function(card){ - return get.itemtype(card)=='card'; + subSkill: { + backup: { + filterCard: function (card) { + return get.itemtype(card) == "card"; }, - position:'hes', - selectCard:1, - check:(card)=>7-get.value(card), - popname:true, + position: "hes", + selectCard: 1, + check: (card) => 7 - get.value(card), + popname: true, }, - used:{ - charlotte:true, - onremove:true, - mark:true, - marktext:'计', - intro:{ - content:'本轮已声明过$', + used: { + charlotte: true, + onremove: true, + mark: true, + marktext: "计", + intro: { + content: "本轮已声明过$", }, }, - forbidself:{ - charlotte:true, - mod:{ - targetEnabled:function(card,player,target){ - if(player==target&&card.storage&&card.storage.dcshiji) return false; + forbidself: { + charlotte: true, + mod: { + targetEnabled: function (card, player, target) { + if (player == target && card.storage && card.storage.dcshiji) return false; }, }, - } - } - }, - dcsilun:{ - audio:2, - trigger:{ - player:['phaseZhunbeiBegin','damageEnd'], + }, }, - frequent:true, - content:function(){ - 'step 0' + }, + dcsilun: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "damageEnd"], + }, + frequent: true, + content: function () { + "step 0"; player.draw(4); - event.count=0; - event.equipCount={}; - game.countPlayer(current=>{ - event.equipCount[current.playerid]=current.countCards('e'); - },true); - 'step 1' - if(!player.countCards('he')) event.goto(5); - else player.chooseCard('四论:选择一张牌('+(event.count+1)+'/'+'4)','然后选择将此牌置于场上或牌堆的两端',true,'he').set('ai',card=>{ - var player=_status.event.player; - if(['equip','delay'].includes(get.type(card))&&player.hasValueTarget(card)) return 50; - return 50-get.value(card); - }); - 'step 2' - if(result.bool){ - var card=result.cards[0]; - event.card=card; + event.count = 0; + event.equipCount = {}; + game.countPlayer((current) => { + event.equipCount[current.playerid] = current.countCards("e"); + }, true); + ("step 1"); + if (!player.countCards("he")) event.goto(5); + else + player + .chooseCard( + "四论:选择一张牌(" + (event.count + 1) + "/" + "4)", + "然后选择将此牌置于场上或牌堆的两端", + true, + "he" + ) + .set("ai", (card) => { + var player = _status.event.player; + if ( + ["equip", "delay"].includes(get.type(card)) && + player.hasValueTarget(card) + ) + return 50; + return 50 - get.value(card); + }); + ("step 2"); + if (result.bool) { + var card = result.cards[0]; + event.card = card; event.count++; - var choices=['牌堆顶','牌堆底']; - var type=get.type(card); - if(type=='equip'&&game.hasPlayer(current=>{ - return current.canEquip(card); - })||type=='delay'&&game.hasPlayer(current=>{ - return current.canAddJudge(card); - })) choices.unshift('场上'); - player.chooseControl(choices).set('prompt','请选择要将'+get.translation(card)+'置于的位置').set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(['equip','delay'].includes(get.type(card))&&player.hasValueTarget(card)&&choices.includes('场上')) return '场上'; - var val=get.value(card); - var next=_status.currentPhase; - if(next){ - if(trigger.name=='damage') next=next.getNext(); - if(get.attitude(player,next)>0&&val>=6||get.attitude(player,next)<0&&val<=4.5) return '牌堆顶'; - } - return '牌堆底'; - }()); + var choices = ["牌堆顶", "牌堆底"]; + var type = get.type(card); + if ( + (type == "equip" && + game.hasPlayer((current) => { + return current.canEquip(card); + })) || + (type == "delay" && + game.hasPlayer((current) => { + return current.canAddJudge(card); + })) + ) + choices.unshift("场上"); + player + .chooseControl(choices) + .set("prompt", "请选择要将" + get.translation(card) + "置于的位置") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if ( + ["equip", "delay"].includes(get.type(card)) && + player.hasValueTarget(card) && + choices.includes("场上") + ) + return "场上"; + var val = get.value(card); + var next = _status.currentPhase; + if (next) { + if (trigger.name == "damage") next = next.getNext(); + if ( + (get.attitude(player, next) > 0 && val >= 6) || + (get.attitude(player, next) < 0 && val <= 4.5) + ) + return "牌堆顶"; + } + return "牌堆底"; + })() + ); } - 'step 3' - if(result.control=='场上'){ - var type=get.type(card); - player.chooseTarget('将'+get.translation(card)+'置于一名角色的场上',true,(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('targets',game.filterPlayer(current=>{ - if(type=='equip') return current.canEquip(card); - if(type=='delay') return current.canAddJudge(card); - return false; - })).set('ai',target=>{ - var player=_status.event.player; - var card=_status.event.card; - return get.attitude(player,target)*(get.type(card)=='equip'?get.value(card,target):get.effect(target,{ - name:card.viewAs||card.name, - cards:[card], - },target,target)); - }).set('card',card); + ("step 3"); + if (result.control == "场上") { + var type = get.type(card); + player + .chooseTarget( + "将" + get.translation(card) + "置于一名角色的场上", + true, + (card, player, target) => { + return _status.event.targets.includes(target); + } + ) + .set( + "targets", + game.filterPlayer((current) => { + if (type == "equip") return current.canEquip(card); + if (type == "delay") return current.canAddJudge(card); + return false; + }) + ) + .set("ai", (target) => { + var player = _status.event.player; + var card = _status.event.card; + return ( + get.attitude(player, target) * + (get.type(card) == "equip" + ? get.value(card, target) + : get.effect( + target, + { + name: card.viewAs || card.name, + cards: [card], + }, + target, + target + )) + ); + }) + .set("card", card); + } else { + player.$throw(card, 1000); + var next = player.lose(card, ui.cardPile, "visible"); + if (result.control == "牌堆顶") next.insert_card = true; + game.log(player, "将", card, "置于了", "#y" + result.control); } - else{ - player.$throw(card,1000); - var next=player.lose(card,ui.cardPile,'visible'); - if(result.control=='牌堆顶') next.insert_card=true; - game.log(player,'将',card,'置于了','#y'+result.control); - } - 'step 4' - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; + ("step 4"); + if (result.bool && result.targets && result.targets.length) { + var target = result.targets[0]; player.line(target); - player.$give(card,target,false); - if(get.type(card)=='equip'){ + player.$give(card, target, false); + if (get.type(card) == "equip") { target.equip(card); - } - else{ + } else { target.addJudge(card); } } - 'step 5' - game.countPlayer(current=>{ - var count=current.countCards('e'); - var prevCount=event.equipCount[current.playerid]||0; - if(count!=prevCount){ + ("step 5"); + game.countPlayer((current) => { + var count = current.countCards("e"); + var prevCount = event.equipCount[current.playerid] || 0; + if (count != prevCount) { current.link(false); current.turnOver(false); } - event.equipCount[current.playerid]=count; + event.equipCount[current.playerid] = count; }); - if(event.count<4) event.goto(1); - } + if (event.count < 4) event.goto(1); + }, }, //杜预 - dcjianguo:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('dcjianguo_0')||!player.hasSkill('dcjianguo_1'); + dcjianguo: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("dcjianguo_0") || !player.hasSkill("dcjianguo_1"); }, - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('谏国:请选择一项','hidden'); - dialog.add([[ - ['discard','令一名角色摸一张牌,然后弃置一半手牌'], - ['draw','令一名角色弃置一张牌,然后摸等同于手牌数一半的牌'] - ],'textbutton']); + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("谏国:请选择一项", "hidden"); + dialog.add([ + [ + ["discard", "令一名角色摸一张牌,然后弃置一半手牌"], + ["draw", "令一名角色弃置一张牌,然后摸等同于手牌数一半的牌"], + ], + "textbutton", + ]); return dialog; }, - filter:function(button,player){ - if(button.link=='discard'&&player.hasSkill('dcjianguo_0')) return false; - if(button.link=='draw'&&player.hasSkill('dcjianguo_1')) return false; + filter: function (button, player) { + if (button.link == "discard" && player.hasSkill("dcjianguo_0")) return false; + if (button.link == "draw" && player.hasSkill("dcjianguo_1")) return false; return true; }, - check:function(button){ - var player=_status.event.player; - if(button.link=='discard'){ - var discard=Math.max.apply(Math,game.filterPlayer(current=>{ - return lib.skill.dcjianguo_discard.filterTarget(null,player,current); - }).map(current=>{ - return get.effect(current,'dcjianguo_discard',player,player); - })); + check: function (button) { + var player = _status.event.player; + if (button.link == "discard") { + var discard = Math.max.apply( + Math, + game + .filterPlayer((current) => { + return lib.skill.dcjianguo_discard.filterTarget( + null, + player, + current + ); + }) + .map((current) => { + return get.effect(current, "dcjianguo_discard", player, player); + }) + ); return discard; } - if(button.link=='draw'){ - var draw=Math.max.apply(Math,game.filterPlayer(current=>{ - return lib.skill.dcjianguo_draw.filterTarget(null,player,current); - }).map(current=>{ - return get.effect(current,'dcjianguo_draw',player,player); - })); + if (button.link == "draw") { + var draw = Math.max.apply( + Math, + game + .filterPlayer((current) => { + return lib.skill.dcjianguo_draw.filterTarget(null, player, current); + }) + .map((current) => { + return get.effect(current, "dcjianguo_draw", player, player); + }) + ); return draw; } return 0; }, - backup:function(links){ - return get.copy(lib.skill['dcjianguo_'+links[0]]); + backup: function (links) { + return get.copy(lib.skill["dcjianguo_" + links[0]]); }, - prompt:function(links){ - if(links[0]=='discard') return '令一名角色摸一张牌,然后弃置一半手牌'; - return '令一名角色弃置一张牌,然后摸等同于手牌数一半的牌'; + prompt: function (links) { + if (links[0] == "discard") return "令一名角色摸一张牌,然后弃置一半手牌"; + return "令一名角色弃置一张牌,然后摸等同于手牌数一半的牌"; }, }, - ai:{ - order:10, - threaten:2.8, - result:{ + ai: { + order: 10, + threaten: 2.8, + result: { //想让杜预两个技能自我联动写起来太累了,开摆 - player:1, + player: 1, }, }, - subSkill:{ - '0':{charlotte:true}, - '1':{charlotte:true}, - backup:{audio:'dcjianguo'}, - discard:{ - audio:'dcjianguo', - filterTarget:()=>true, - filterCard:()=>false, - selectCard:-1, - content:function(){ - 'step 0' - player.addTempSkill('dcjianguo_0','phaseUseAfter'); + subSkill: { + 0: { charlotte: true }, + 1: { charlotte: true }, + backup: { audio: "dcjianguo" }, + discard: { + audio: "dcjianguo", + filterTarget: () => true, + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcjianguo_0", "phaseUseAfter"); target.draw(); game.delayex(); - 'step 1' - var num=Math.ceil(target.countCards('h')/2); - if(num>0) target.chooseToDiscard(num,true,'谏国:请弃置'+get.cnNumber(num)+'张手牌'); + ("step 1"); + var num = Math.ceil(target.countCards("h") / 2); + if (num > 0) + target.chooseToDiscard( + num, + true, + "谏国:请弃置" + get.cnNumber(num) + "张手牌" + ); }, - ai:{ - result:{ - target:function(player,target){ - return 1.1-Math.floor(target.countCards('h')/2); + ai: { + result: { + target: function (player, target) { + return 1.1 - Math.floor(target.countCards("h") / 2); }, }, - tag:{ - gain:1, - loseCard:2, + tag: { + gain: 1, + loseCard: 2, }, }, }, - draw:{ - audio:'dcjianguo', - filterTarget:function(card,player,target){ - return target.countCards('he'); + draw: { + audio: "dcjianguo", + filterTarget: function (card, player, target) { + return target.countCards("he"); }, - filterCard:()=>false, - selectCard:-1, - content:function(){ - 'step 0' - player.addTempSkill('dcjianguo_1','phaseUseAfter'); - target.chooseToDiscard('he',true,'谏国:请弃置一张牌'); - 'step 1' - var num=Math.ceil(target.countCards('h')/2); - if(num>0) target.draw(num); + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcjianguo_1", "phaseUseAfter"); + target.chooseToDiscard("he", true, "谏国:请弃置一张牌"); + ("step 1"); + var num = Math.ceil(target.countCards("h") / 2); + if (num > 0) target.draw(num); }, - ai:{ - result:{ - target:function(player,target){ - var fix=0; - var num=target.countCards('h'); - if(player==target&&num%2==1&&num>=5) fix+=1; - return Math.ceil(num/2-0.5)+fix; + ai: { + result: { + target: function (player, target) { + var fix = 0; + var num = target.countCards("h"); + if (player == target && num % 2 == 1 && num >= 5) fix += 1; + return Math.ceil(num / 2 - 0.5) + fix; }, }, - tag:{ - loseCard:1, - gain:2, + tag: { + loseCard: 1, + gain: 2, }, }, }, }, }, - dcdyqingshi:{ - audio:2, - trigger:{ - player:'useCardToPlayered', + dcdyqingshi: { + audio: 2, + trigger: { + player: "useCardToPlayered", }, - filter:function(event,player){ - if(player!=_status.currentPhase) return false; - if(!event.isFirstTarget) return false; - if(event.card.name!='sha'&&get.type(event.card,false)!='trick') return false; - if(player.countCards('h')!=player.getHistory('useCard').indexOf(event.getParent())+1) return false; - return event.targets.some(target=>{ - return target!=player&&target.isIn(); + filter: function (event, player) { + if (player != _status.currentPhase) return false; + if (!event.isFirstTarget) return false; + if (event.card.name != "sha" && get.type(event.card, false) != "trick") return false; + if (player.countCards("h") != player.getHistory("useCard").indexOf(event.getParent()) + 1) + return false; + return event.targets.some((target) => { + return target != player && target.isIn(); }); }, - direct:true, - locked:false, - content:function(){ - 'step 0' - var targets=trigger.targets.filter(target=>{ - return target!=player&&target.isIn(); + direct: true, + locked: false, + content: function () { + "step 0"; + var targets = trigger.targets.filter((target) => { + return target != player && target.isIn(); }); - player.chooseTarget(get.prompt('dcdyqingshi'),'对一名不为你的目标角色造成1点伤害',(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }).set('targets',targets); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcdyqingshi',target); + player + .chooseTarget( + get.prompt("dcdyqingshi"), + "对一名不为你的目标角色造成1点伤害", + (card, player, target) => { + return _status.event.targets.includes(target); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }) + .set("targets", targets); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcdyqingshi", target); target.damage(); } }, - mod:{ - aiOrder:function(player,card,num){ - if(_status.currentPhase!=player) return; - var cardsh=[]; - if(Array.isArray(card.cards)){ - cardsh.addArray(card.cards.filter(card=>{ - return get.position(card)=='h'; - })); + mod: { + aiOrder: function (player, card, num) { + if (_status.currentPhase != player) return; + var cardsh = []; + if (Array.isArray(card.cards)) { + cardsh.addArray( + card.cards.filter((card) => { + return get.position(card) == "h"; + }) + ); } - var del=player.countCards('h')-cardsh.length-player.getHistory('useCard').length-1; - if(del<0) return; - if(del>0){ - if(card.name=='sha'||get.type(card,false)!='trick') return num/3; - return num+1; + var del = + player.countCards("h") - cardsh.length - player.getHistory("useCard").length - 1; + if (del < 0) return; + if (del > 0) { + if (card.name == "sha" || get.type(card, false) != "trick") return num / 3; + return num + 1; } - return num+15; + return num + 15; }, }, }, //甘糜 - dcchanjuan:{ - init:function(player){ - if(!player.storage.dcchanjuan){ - player.storage.dcchanjuan={}; + dcchanjuan: { + init: function (player) { + if (!player.storage.dcchanjuan) { + player.storage.dcchanjuan = {}; } }, - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - if(event.targets.length!=1||!player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - return event.cards.every(card=>evt.hs.includes(card)); - })) return false; - if(!['basic','trick'].includes(get.type(event.card,false))) return false; - if(event.getParent(2).name=='dcchanjuan') return false; - return !player.storage.dcchanjuan[event.card.name]||player.storage.dcchanjuan[event.card.name]<2; + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + if ( + event.targets.length != 1 || + !player.hasHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + return event.cards.every((card) => evt.hs.includes(card)); + }) + ) + return false; + if (!["basic", "trick"].includes(get.type(event.card, false))) return false; + if (event.getParent(2).name == "dcchanjuan") return false; + return ( + !player.storage.dcchanjuan[event.card.name] || + player.storage.dcchanjuan[event.card.name] < 2 + ); }, - direct:true, - content:function(){ - 'step 0' - var card={ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, - } - player.chooseUseTarget(card,get.prompt('dcchanjuan'),false,false).set('prompt2','视为再使用一张'+get.translation(card)).set('logSkill','dcchanjuan'); - 'step 1' - if(result.bool){ - if(!player.storage.dcchanjuan[trigger.card.name]) player.storage.dcchanjuan[trigger.card.name]=0; + direct: true, + content: function () { + "step 0"; + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + }; + player + .chooseUseTarget(card, get.prompt("dcchanjuan"), false, false) + .set("prompt2", "视为再使用一张" + get.translation(card)) + .set("logSkill", "dcchanjuan"); + ("step 1"); + if (result.bool) { + if (!player.storage.dcchanjuan[trigger.card.name]) + player.storage.dcchanjuan[trigger.card.name] = 0; player.storage.dcchanjuan[trigger.card.name]++; - var list1=trigger.targets,list2=result.targets; - if(list1.slice().removeArray(list2).length==0&&list2.slice().removeArray(list1).length==0) player.draw(); + var list1 = trigger.targets, + list2 = result.targets; + if ( + list1.slice().removeArray(list2).length == 0 && + list2.slice().removeArray(list1).length == 0 + ) + player.draw(); } }, - ai:{threaten:2}, - mark:true, - intro:{ - markcount:(storage)=>0, - content:function(storage){ - var str='已使用牌名:',names=Object.keys(storage); - if(!names.length) str+='无'; - else names.forEach(name=>{ - str+='
  • 【'; - str+=get.translation(name); - str+='】:'; - str+=storage[name]+'次'; - }); + ai: { threaten: 2 }, + mark: true, + intro: { + markcount: (storage) => 0, + content: function (storage) { + var str = "已使用牌名:", + names = Object.keys(storage); + if (!names.length) str += "无"; + else + names.forEach((name) => { + str += "
  • 【"; + str += get.translation(name); + str += "】:"; + str += storage[name] + "次"; + }); return str; }, }, }, - dcxunbie:{ - audio:2, - trigger:{ - player:'dying', + dcxunbie: { + audio: 2, + trigger: { + player: "dying", }, - filter:function(event,player){ - if(player.hp>0) return false; - var characters=['dc_ganfuren','dc_mifuren']; - game.countPlayer(current=>{ - if(current.name1=='dc_ganfuren'||current.name2=='dc_ganfuren'){ - characters.remove('dc_ganfuren'); + filter: function (event, player) { + if (player.hp > 0) return false; + var characters = ["dc_ganfuren", "dc_mifuren"]; + game.countPlayer((current) => { + if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") { + characters.remove("dc_ganfuren"); } - if(current.name1=='dc_mifuren'||current.name2=='dc_mifuren'){ - characters.remove('dc_mifuren'); + if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") { + characters.remove("dc_mifuren"); } }); return characters.length; }, - check:()=>true, - skillAnimation:true, - animationColor:'fire', - limited:true, - derivation:['dcyongjue','dcshushen','dcshenzhi','dcguixiu','dccunsi'], - content:function(){ - 'step 0' - player.awakenSkill('dcxunbie'); - if(player.name1=='ganfurenmifuren'||player.name2=='ganfurenmifuren'){ - var characters=['dc_ganfuren','dc_mifuren']; - game.countPlayer(current=>{ - if(current.name1=='dc_ganfuren'||current.name2=='dc_ganfuren'){ - characters.remove('dc_ganfuren'); + check: () => true, + skillAnimation: true, + animationColor: "fire", + limited: true, + derivation: ["dcyongjue", "dcshushen", "dcshenzhi", "dcguixiu", "dccunsi"], + content: function () { + "step 0"; + player.awakenSkill("dcxunbie"); + if (player.name1 == "ganfurenmifuren" || player.name2 == "ganfurenmifuren") { + var characters = ["dc_ganfuren", "dc_mifuren"]; + game.countPlayer((current) => { + if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") { + characters.remove("dc_ganfuren"); } - if(current.name1=='dc_mifuren'||current.name2=='dc_mifuren'){ - characters.remove('dc_mifuren'); + if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") { + characters.remove("dc_mifuren"); } }); - if(characters.length==1) event._result={control:characters[0]}; - else{ - player.chooseControl(characters).set('dialog',[ - '选择要替换成的武将', - [characters,'character'] - ]).set('ai',()=>[0,1].randomGet()); + if (characters.length == 1) event._result = { control: characters[0] }; + else { + player + .chooseControl(characters) + .set("dialog", ["选择要替换成的武将", [characters, "character"]]) + .set("ai", () => [0, 1].randomGet()); } - } - else event.goto(2); - 'step 1' - var character=result.control; - if(!_status.characterlist){ + } else event.goto(2); + ("step 1"); + var character = result.control; + if (!_status.characterlist) { lib.skill.pingjian.initList(); } - player.reinitCharacter('ganfurenmifuren',character); - 'step 2' - player.recover(1-player.hp); - player.addTempSkill('dcxunbie_muteki',{player:'phaseAfter'}); + player.reinitCharacter("ganfurenmifuren", character); + ("step 2"); + player.recover(1 - player.hp); + player.addTempSkill("dcxunbie_muteki", { player: "phaseAfter" }); }, - subSkill:{ - muteki:{ - trigger:{ - player:'damageBegin4', + subSkill: { + muteki: { + trigger: { + player: "damageBegin4", }, - charlotte:true, - forced:true, - content:function(){ + charlotte: true, + forced: true, + content: function () { trigger.cancel(); }, - mark:true, - intro:{content:'防止受到的所有伤害直到我的回合结束'}, - ai:{ - nofire:true, - nothunder:true, - nodamage:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')) return 'zeroplayertarget'; - } + mark: true, + intro: { content: "防止受到的所有伤害直到我的回合结束" }, + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return "zeroplayertarget"; + }, }, - } - } - } + }, + }, + }, }, //散装版糜夫人 - dcguixiu:{ - audio:'guixiu', - trigger:{ - player:'phaseBegin', + dcguixiu: { + audio: "guixiu", + trigger: { + player: "phaseBegin", }, - forced:true, - onremove:true, - filter:function(event,player){ - return !player.hasMark('dcguixiu'); + forced: true, + onremove: true, + filter: function (event, player) { + return !player.hasMark("dcguixiu"); }, - group:'dcguixiu_rec', - content:function(){ - player.addMark('dcguixiu',1,false); + group: "dcguixiu_rec", + content: function () { + player.addMark("dcguixiu", 1, false); player.draw(2); }, - subSkill:{ - rec:{ - audio:'guixiu', - trigger:{ - player:'useSkillAfter', + subSkill: { + rec: { + audio: "guixiu", + trigger: { + player: "useSkillAfter", }, - forced:true, - filter:function(event,player){ - return event.skill=='dccunsi'&&player.isDamaged(); + forced: true, + filter: function (event, player) { + return event.skill == "dccunsi" && player.isDamaged(); }, - content:function(){ + content: function () { player.recover(); - } - } - } + }, + }, + }, }, - dccunsi:{ - audio:'cunsi', - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'orange', - filterTarget:true, - derivation:'dcyongjue', - content:function(){ - 'step 0' - player.awakenSkill('dccunsi'); - target.addSkillLog('dcyongjue'); - if(target!=player) player.draw(2); + dccunsi: { + audio: "cunsi", + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + filterTarget: true, + derivation: "dcyongjue", + content: function () { + "step 0"; + player.awakenSkill("dccunsi"); + target.addSkillLog("dcyongjue"); + if (target != player) player.draw(2); + }, + ai: { + order: 10, + result: { + target: 1, + }, }, - ai:{ - order:10, - result:{ - target:1, - } - } }, - dcyongjue:{ - audio:'yongjue', - trigger:{ - player:'useCard', + dcyongjue: { + audio: "yongjue", + trigger: { + player: "useCard", }, - filter:function(event,player){ - var evtx=event.getParent('phaseUse'); - if(!evtx||evtx.player!=player) return false; - return player.getHistory('useCard',evt=>{ - return evt.card.name=='sha'&&event.getParent('phaseUse')==evtx; - }).indexOf(event)==0; + filter: function (event, player) { + var evtx = event.getParent("phaseUse"); + if (!evtx || evtx.player != player) return false; + return ( + player + .getHistory("useCard", (evt) => { + return evt.card.name == "sha" && event.getParent("phaseUse") == evtx; + }) + .indexOf(event) == 0 + ); }, - direct:true, - content:function(){ - 'step 0' - var choices=['选项一']; - var choiceList=['令'+get.translation(trigger.card)+'不计入次数','获得此牌']; - if(trigger.cards.length){ - choices.push('选项二'); - choiceList[1]='获得'+get.translation(trigger.cards); - } - else choiceList[1]=''+choiceList[1]+''; - choices.push('cancel2'); - player.chooseControl(choices).set('choiceList',choiceList).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(choices.length==3&&trigger.addCount===false) return 1; - if(player.getCardUsable({name:'sha'})"; + choices.push("cancel2"); + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (choices.length == 3 && trigger.addCount === false) return 1; + if (player.getCardUsable({ name: "sha" }) < player.countCards("hs", "sha")) + return 0; + if (choices.length == 3) return 1; + return 0; + })() + ); + ("step 1"); + if (result.control == "cancel2") { event.finish(); return; } - player.logSkill('dcyongjue'); - game.log(player,'选择了','#y'+result.control); - if(result.control=='选项一'){ - if(trigger.addCount!==false){ - trigger.addCount=false; + player.logSkill("dcyongjue"); + game.log(player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + if (trigger.addCount !== false) { + trigger.addCount = false; trigger.player.getStat().card.sha--; } + } else { + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2"); } - else{ - var cards=trigger.cards.filterInD(); - if(cards.length) player.gain(cards,'gain2'); - } - } + }, }, //散装版甘夫人 - dcshushen:{ - audio:'shushen', - trigger:{ - player:'recoverEnd', + dcshushen: { + audio: "shushen", + trigger: { + player: "recoverEnd", }, - direct:true, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - player.chooseTarget(get.prompt('dcshushen'),'选择一名其他角色,然后令其回复1点体力或令你与其各摸一张牌',lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - return get.recoverEffect(target,player,player)/2+get.attitude(player,target); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('dcshushen',target); + direct: true, + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); + player + .chooseTarget( + get.prompt("dcshushen"), + "选择一名其他角色,然后令其回复1点体力或令你与其各摸一张牌", + lib.filter.notMe + ) + .set("ai", (target) => { + var player = _status.event.player; + return ( + get.recoverEffect(target, player, player) / 2 + get.attitude(player, target) + ); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dcshushen", target); event.num--; - var choices=['选项二']; - var choiceList=[ - '令'+get.translation(target)+'回复1点体力', - '你与'+get.translation(target)+'各摸一张牌' + var choices = ["选项二"]; + var choiceList = [ + "令" + get.translation(target) + "回复1点体力", + "你与" + get.translation(target) + "各摸一张牌", ]; - if(target.isDamaged()) choices.unshift('选项一'); - else choiceList[0]=''+choiceList[0]+''; - player.chooseControl(choices).set('choiceList',choiceList).set('prompt','淑慎:请选择一项').set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(target.hp<=2||get.recoverEffect(target,player,player)>20) return 0; - return '选项二'; - }()); - } - else event.finish(); - 'step 3' - if(result.control=='选项一'){ + if (target.isDamaged()) choices.unshift("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "淑慎:请选择一项") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (target.hp <= 2 || get.recoverEffect(target, player, player) > 20) + return 0; + return "选项二"; + })() + ); + } else event.finish(); + ("step 3"); + if (result.control == "选项一") { target.recover(); - } - else{ - var drawers=[player,target].sortBySeat(_status.currentPhase); + } else { + var drawers = [player, target].sortBySeat(_status.currentPhase); game.asyncDraw(drawers); } - 'step 4' - if(event.num>0) event.goto(1); - } + ("step 4"); + if (event.num > 0) event.goto(1); + }, }, - dcshenzhi:{ - audio:'shenzhi', - trigger:{ - player:'phaseZhunbeiBegin', + dcshenzhi: { + audio: "shenzhi", + trigger: { + player: "phaseZhunbeiBegin", }, - filter:function(event,player){ - return player.countCards('h')>player.hp; + filter: function (event, player) { + return player.countCards("h") > player.hp; }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('dcshenzhi'),'弃置一张手牌,然后回复1点体力').set('logSkill','dcshenzhi').set('ai',card=>{ - var player=_status.event.player; - if(!player.isDamaged()) return 0; - return Math.min(3,10-2*player.hp)-get.value(card); - }); - 'step 1' - if(result.bool){ + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard(get.prompt("dcshenzhi"), "弃置一张手牌,然后回复1点体力") + .set("logSkill", "dcshenzhi") + .set("ai", (card) => { + var player = _status.event.player; + if (!player.isDamaged()) return 0; + return Math.min(3, 10 - 2 * player.hp) - get.value(card); + }); + ("step 1"); + if (result.bool) { player.recover(); } - } + }, }, //阮籍 - dczhaowen:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.countCards('h'); + dczhaowen: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h"); }, - check:function(event,player){ - return player.hasCard(card=>{ - return get.color(card)=='black'||get.color(card)=='red'&&player.hasValueTarget(card); + check: function (event, player) { + return player.hasCard((card) => { + return ( + get.color(card) == "black" || + (get.color(card) == "red" && player.hasValueTarget(card)) + ); }); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.showHandcards(); - 'step 1' - player.addTempSkill('dczhaowen_effect'); - game.broadcastAll(function(cards){ - cards.forEach(card=>card.addGaintag('dczhaowen_tag')); - },player.getCards('h')); + ("step 1"); + player.addTempSkill("dczhaowen_effect"); + game.broadcastAll(function (cards) { + cards.forEach((card) => card.addGaintag("dczhaowen_tag")); + }, player.getCards("h")); }, - ai:{ - threaten:3 + ai: { + threaten: 3, }, - subSkill:{ - effect:{ - audio:'dczhaowen', - enable:'chooseToUse', - charlotte:true, - onremove:function(player){ - player.removeGaintag('dczhaowen_tag'); + subSkill: { + effect: { + audio: "dczhaowen", + enable: "chooseToUse", + charlotte: true, + onremove: function (player) { + player.removeGaintag("dczhaowen_tag"); }, - hiddenCard:function(player,name){ - return get.type(name)=='trick'&&!player.getStorage('dczhaowen_viewed').includes(name)&&player.countCards('h',card=>{ - return get.color(card)=='black'&&card.hasGaintag('dczhaowen_tag'); - })>0; + hiddenCard: function (player, name) { + return ( + get.type(name) == "trick" && + !player.getStorage("dczhaowen_viewed").includes(name) && + player.countCards("h", (card) => { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); + }) > 0 + ); }, - filter:function(event,player){ - if(!player.hasCard(card=>{ - return get.color(card)=='black'&&card.hasGaintag('dczhaowen_tag'); - })) return false; - var storage=player.getStorage('dczhaowen_viewed'); - for(var i of lib.inpile){ - if(!storage.includes(i)&&get.type(i)=='trick'&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)) return true; + filter: function (event, player) { + if ( + !player.hasCard((card) => { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); + }) + ) + return false; + var storage = player.getStorage("dczhaowen_viewed"); + for (var i of lib.inpile) { + if ( + !storage.includes(i) && + get.type(i) == "trick" && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) + return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var cards=player.getCards('h',card=>{ - return get.color(card)=='black'&&card.hasGaintag('dczhaowen_tag'); + chooseButton: { + dialog: function (event, player) { + var cards = player.getCards("h", (card) => { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); }); - var storage=player.getStorage('dczhaowen_viewed'); - var list=[]; - for(var i of lib.inpile){ - if(!storage.includes(i)&&get.type(i)=='trick'&&event.filterCard(get.autoViewAs({name:i},'unsure'),player,event)){ - list.push(['锦囊','',i]); + var storage = player.getStorage("dczhaowen_viewed"); + var list = []; + for (var i of lib.inpile) { + if ( + !storage.includes(i) && + get.type(i) == "trick" && + event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event) + ) { + list.push(["锦囊", "", i]); } } - return ui.create.dialog('昭文',[list,'vcard'],'hidden'); + return ui.create.dialog("昭文", [list, "vcard"], "hidden"); }, - check:function(button){ - var player=_status.event.player; - return player.getUseValue({name:button.link[2]})+1; + check: function (button) { + var player = _status.event.player; + return player.getUseValue({ name: button.link[2] }) + 1; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'dczhaowen', - popname:true, - filterCard:function(card,player){ - return get.color(card)=='black'&&card.hasGaintag('dczhaowen_tag'); + audio: "dczhaowen", + popname: true, + filterCard: function (card, player) { + return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag"); }, - selectCard:1, - position:'h', - viewAs:{ - name:links[0][2], + selectCard: 1, + position: "h", + viewAs: { + name: links[0][2], }, - onuse:function(links,player){ - player.addTempSkill('dczhaowen_viewed'); - player.markAuto('dczhaowen_viewed',[links.card.name]); + onuse: function (links, player) { + player.addTempSkill("dczhaowen_viewed"); + player.markAuto("dczhaowen_viewed", [links.card.name]); }, - } + }; }, - prompt:function(links,player){ - return '将一张展示过的黑色手牌当做'+get.translation(links[0][2])+'使用'; + prompt: function (links, player) { + return "将一张展示过的黑色手牌当做" + get.translation(links[0][2]) + "使用"; }, }, - group:'dczhaowen_draw', - mod:{ - aiOrder:function(player,card,num){ - var cards=[]; - if(card.cards) cards.addArray(cards); - if(get.itemtype(card)=='card') cards.push(card); - for(var cardx of cards){ - if(get.color(cardx)!='red') continue; - if(cardx.hasGaintag('dczhaowen_tag')) return num+0.2; + group: "dczhaowen_draw", + mod: { + aiOrder: function (player, card, num) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (get.color(cardx) != "red") continue; + if (cardx.hasGaintag("dczhaowen_tag")) return num + 0.2; } }, }, - ai:{ - order:12, - result:{ - player:1, + ai: { + order: 12, + result: { + player: 1, }, }, }, - draw:{ - audio:'dczhaowen', - forced:true, - charlotte:true, - trigger:{player:'useCard'}, - filter:function(event,player){ - var cards=event.cards.filter(card=>get.color(card,player)=='red'); - return player.hasHistory('lose',evt=>{ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dczhaowen_tag')){ - if(cards.some(card=>card.cardid==i)) return true; + draw: { + audio: "dczhaowen", + forced: true, + charlotte: true, + trigger: { player: "useCard" }, + filter: function (event, player) { + var cards = event.cards.filter((card) => get.color(card, player) == "red"); + return player.hasHistory("lose", (evt) => { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dczhaowen_tag")) { + if (cards.some((card) => card.cardid == i)) return true; } } }); }, - content:function(){ - var num=0; - var cards=trigger.cards.filter(card=>get.color(card,player)=='red'); - player.getHistory('lose',evt=>{ - if(trigger!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dczhaowen_tag')){ - if(cards.some(card=>card.cardid==i)) num++; + content: function () { + var num = 0; + var cards = trigger.cards.filter((card) => get.color(card, player) == "red"); + player.getHistory("lose", (evt) => { + if (trigger != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dczhaowen_tag")) { + if (cards.some((card) => card.cardid == i)) num++; } } }); - while(num--) player.draw(); + while (num--) player.draw(); + }, + ai: { + effect: { + player: (card, player, target) => { + if ( + get.itemtype(card) === "card" && + cardx.hasGaintag("dczhaowen_tag") && + get.color(card, player) === "red" + ) + return [1, 1]; + }, + }, }, - ai:{ - effect:{ - player:(card,player,target)=>{ - if(get.itemtype(card)==='card'&&cardx.hasGaintag('dczhaowen_tag')&&get.color(card,player)==='red') return [1,1]; - } - } - } }, - viewed:{ - onremove:true, - charlotte:true, + viewed: { + onremove: true, + charlotte: true, }, - effect_backup:{ - audio:'dczhaowen', + effect_backup: { + audio: "dczhaowen", }, - } + }, }, - dcjiudun:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - if(event.player==player||get.color(event.card)!='black') return false; - if(player.hasSkill('jiu')) return player.countCards('h',card=>{ - return _status.connectMode||lib.filter.cardDiscardable(card,player,'dcjiudun'); - }); + dcjiudun: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + if (event.player == player || get.color(event.card) != "black") return false; + if (player.hasSkill("jiu")) + return player.countCards("h", (card) => { + return ( + _status.connectMode || lib.filter.cardDiscardable(card, player, "dcjiudun") + ); + }); return true; }, - direct:true, - content:function(){ - 'step 0' - if(player.hasSkill('jiu')){ - player.chooseToDiscard(get.prompt('dcjiudun'),'
    弃置一张手牌,令'+get.translation(trigger.card)+'对你无效
    ').set('logSkill','dcjiudun').set('ai',card=>{ - if(_status.event.goon) return 4.5+Math.max(0,3-player.hp)-get.value(card); - return 0; - }).set('goon',function(){ - if(get.effect(player,trigger.card,trigger.player,player)<-4*Math.max(0,5-Math.sqrt(player.countCards('h')))) return true; - return false; - }()); + direct: true, + content: function () { + "step 0"; + if (player.hasSkill("jiu")) { + player + .chooseToDiscard( + get.prompt("dcjiudun"), + '
    弃置一张手牌,令' + + get.translation(trigger.card) + + "对你无效
    " + ) + .set("logSkill", "dcjiudun") + .set("ai", (card) => { + if (_status.event.goon) + return 4.5 + Math.max(0, 3 - player.hp) - get.value(card); + return 0; + }) + .set( + "goon", + (function () { + if ( + get.effect(player, trigger.card, trigger.player, player) < + -4 * Math.max(0, 5 - Math.sqrt(player.countCards("h"))) + ) + return true; + return false; + })() + ); event.goto(2); + } else { + player + .chooseBool(get.prompt("dcjiudun"), "摸一张牌,然后视为使用一张【酒】") + .set("ai", () => 1); } - else{ - player.chooseBool(get.prompt('dcjiudun'),'摸一张牌,然后视为使用一张【酒】').set('ai',()=>1); - } - 'step 1' - if(result.bool){ - player.logSkill('dcjiudun'); + ("step 1"); + if (result.bool) { + player.logSkill("dcjiudun"); player.draw(); - player.chooseUseTarget('jiu',true); + player.chooseUseTarget("jiu", true); } event.finish(); - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { trigger.excluded.add(player); - game.log(trigger.card,'对',player,'无效'); + game.log(trigger.card, "对", player, "无效"); } }, - ai:{ - jiuSustain:true, - skillTagFilter:function(player,tag,name){ - if(name!='phase') return false; + ai: { + jiuSustain: true, + skillTagFilter: function (player, tag, name) { + if (name != "phase") return false; }, - effect:{ - target:(card,player,target)=>{ - if(player===target||typeof card!=='object'||get.color(card)!=='black') return; - if(target.hasSkill('jiu')){ - if(card.name!=='huogong'&&get.tag(card,'damage')&&get.attitude(player,target)<=0&&target.hasCard(i=>{ - return _status.connectMode||lib.filter.cardDiscardable(i,player,'dcjiudun'); - },'h')) return [0,-1]; - } - else return [1,1.2]; - } - } - } + effect: { + target: (card, player, target) => { + if (player === target || typeof card !== "object" || get.color(card) !== "black") + return; + if (target.hasSkill("jiu")) { + if ( + card.name !== "huogong" && + get.tag(card, "damage") && + get.attitude(player, target) <= 0 && + target.hasCard((i) => { + return ( + _status.connectMode || + lib.filter.cardDiscardable(i, player, "dcjiudun") + ); + }, "h") + ) + return [0, -1]; + } else return [1, 1.2]; + }, + }, + }, }, //武诸葛 - dcjincui:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ + dcjincui: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { return true; }, - forced:true, - group:'dcjincui_advent', - content:function(){ - 'step 0' - var num=0; - for(var i=0;i=player.maxHp) break; + if (num >= player.maxHp) break; } } - if(num<1) num=1; - if(num>player.hp) player.recover(num-player.hp); - else if(num player.hp) player.recover(num - player.hp); + else if (num < player.hp) player.loseHp(player.hp - num); + ("step 1"); + var num = player.hp; + var cards = get.cards(num); game.cardsGotoOrdering(cards); - var next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('prompt','尽瘁:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=function(list){ - var cards=list[0][1],player=_status.event.player; - var target=(_status.event.getTrigger().name=='phaseZhunbei')?player:player.next; - var att=get.sgn(get.attitude(player,target)); - var top=[]; - var judges=target.getCards('j'); - var stopped=false; - if(player!=target||!target.hasWuxie()){ - for(var i=0;i0)) break; + while (cards.length) { + if (get.value(cards[0], player) <= 5 == att > 0) break; top.unshift(cards.shift()); } } - bottom=cards; - return [top,bottom]; - } - 'step 2' - var top=result.moved[0]; - var bottom=result.moved[1]; + bottom = cards; + return [top, bottom]; + }; + ("step 2"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - for(var i=0;i=target.hp){ - bool=true; + if (num >= target.hp) { + bool = true; break; } } } - if(bool) return 0.2; - } - }, - threaten:0.6, - }, - subSkill:{ - advent:{ - audio:'dcjincui', - trigger:{global:'phaseBefore',player:'enterGame'}, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.countCards('h')<7; + if (bool) return 0.2; }, - content:function(){ + }, + threaten: 0.6, + }, + subSkill: { + advent: { + audio: "dcjincui", + trigger: { global: "phaseBefore", player: "enterGame" }, + forced: true, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") < 7 + ); + }, + content: function () { player.drawTo(7); - } - } + }, + }, }, }, - dcqingshi:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - if(!player.isPhaseUsing()||player.hasSkill('dcqingshi_blocker')) return false; - if(player.getStorage('dcqingshi_clear').includes(event.card.name)) return false; - if(player.hasCard(card=>{ - return get.name(card)==event.card.name; - })) return true; + dcqingshi: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + if (!player.isPhaseUsing() || player.hasSkill("dcqingshi_blocker")) return false; + if (player.getStorage("dcqingshi_clear").includes(event.card.name)) return false; + if ( + player.hasCard((card) => { + return get.name(card) == event.card.name; + }) + ) + return true; return false; }, - direct:true, - content:function(){ - 'step 0' - var choices=[]; - var choiceList=[ - '令'+get.translation(trigger.card)+'对其中一个目标角色造成的伤害+1', - '令任意名其他角色各摸一张牌', - '摸三张牌,然后〖情势〗于本回合失效' + direct: true, + content: function () { + "step 0"; + var choices = []; + var choiceList = [ + "令" + get.translation(trigger.card) + "对其中一个目标角色造成的伤害+1", + "令任意名其他角色各摸一张牌", + "摸三张牌,然后〖情势〗于本回合失效", ]; - if(trigger.targets&&trigger.targets.length) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+'(无目标角色)'; - if(game.countPlayer(i=>i!=player)) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(player.hp>0) choices.push('选项三'); - else choiceList[2]=''+choiceList[1]+'(体力值为0)'; - player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('dcqingshi')).set('ai',()=>{ - return _status.event.choice; - }).set('choice',(()=>{ - var choicesx=choices.slice(); - var cards=player.getCards('hs'); - var bool1=get.tag(trigger.card,'damage')&&choicesx.includes('选项一')&&trigger.targets.some(current=>{ - return get.attitude(player,current)<0; - }),bool2=choicesx.includes('选项二'); - if(bool2) bool2=game.countPlayer(function(current){ - return player!=current&&get.attitude(player,current)>0; - }); - else bool2=0; - if(bool1||bool2){ - for(var i=0;i"; + if (game.countPlayer((i) => i != player)) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (player.hp > 0) choices.push("选项三"); + else choiceList[2] = '' + choiceList[1] + "(体力值为0)"; + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt("dcqingshi")) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (() => { + var choicesx = choices.slice(); + var cards = player.getCards("hs"); + var bool1 = + get.tag(trigger.card, "damage") && + choicesx.includes("选项一") && + trigger.targets.some((current) => { + return get.attitude(player, current) < 0; + }), + bool2 = choicesx.includes("选项二"); + if (bool2) + bool2 = game.countPlayer(function (current) { + return player != current && get.attitude(player, current) > 0; + }); + else bool2 = 0; + if (bool1 || bool2) { + for (var i = 0; i < cards.length; i++) { + var name = get.name(cards[i]); + if (player.getStorage("dcqingshi_clear").includes(name)) continue; + for (var j = i + 1; j < cards.length; j++) { + if ( + name === get.name(cards[j]) && + get.position(cards[i]) + get.position(cards[j]) !== "ss" && + player.hasValueTarget(cards[i]) + ) { + choicesx.remove("选项三"); + break; + } + } } } + if (bool2 > 2) return "选项二"; + if (choicesx.includes("选项三")) return "选项三"; + if (bool2 === 2) return "选项二"; + if (bool1) return "选项一"; + if (bool2) return "选项二"; + return "cancel2"; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("dcqingshi"); + game.log(player, "选择了", "#y" + result.control); + var index = ["选项一", "选项二", "选项三"].indexOf(result.control) + 1; + player.addTempSkill("dcqingshi_clear"); + player.markAuto("dcqingshi_clear", [trigger.card.name]); + var next = game.createEvent("dcqingshi_after"); + next.player = player; + next.card = trigger.card; + next.setContent(lib.skill.dcqingshi["content" + index]); + } + }, + content1: function () { + "step 0"; + player + .chooseTarget( + "令" + get.translation(card) + "对其中一个目标造成的伤害+1", + true, + (card, player, target) => { + return _status.event.targets.includes(target); } - } - if(bool2>2) return '选项二'; - if(choicesx.includes('选项三')) return '选项三'; - if(bool2===2) return '选项二'; - if(bool1) return '选项一'; - if(bool2) return '选项二'; - return 'cancel2'; - })()); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('dcqingshi'); - game.log(player,'选择了','#y'+result.control); - var index=['选项一','选项二','选项三'].indexOf(result.control)+1; - player.addTempSkill('dcqingshi_clear'); - player.markAuto('dcqingshi_clear',[trigger.card.name]); - var next=game.createEvent('dcqingshi_after'); - next.player=player; - next.card=trigger.card; - next.setContent(lib.skill.dcqingshi['content'+index]); - } - }, - content1:function(){ - 'step 0' - player.chooseTarget('令'+get.translation(card)+'对其中一个目标造成的伤害+1',true,(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('ai',target=>{ - return 2-get.attitude(_status.event.player,target); - }).set('targets',event.getParent().getTrigger().targets); - 'step 1' - if(result.bool){ - var target=result.targets[0]; + ) + .set("ai", (target) => { + return 2 - get.attitude(_status.event.player, target); + }) + .set("targets", event.getParent().getTrigger().targets); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - player.addTempSkill('dcqingshi_ex'); - if(!player.storage.dcqingshi_ex) player.storage.dcqingshi_ex=[]; - player.storage.dcqingshi_ex.push([target,card]); + player.addTempSkill("dcqingshi_ex"); + if (!player.storage.dcqingshi_ex) player.storage.dcqingshi_ex = []; + player.storage.dcqingshi_ex.push([target, card]); } }, - content2:function(){ - 'step 0' - player.chooseTarget('令任意名其他角色各摸一张牌',[1,Infinity],true,lib.filter.notMe).set('ai',target=>{ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets; + content2: function () { + "step 0"; + player + .chooseTarget("令任意名其他角色各摸一张牌", [1, Infinity], true, lib.filter.notMe) + .set("ai", (target) => { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; targets.sortBySeat(); player.line(targets); game.asyncDraw(targets); game.delayex(); } }, - content3:function(){ - 'step 0' + content3: function () { + "step 0"; player.draw(3); - player.addTempSkill('dcqingshi_blocker'); + player.addTempSkill("dcqingshi_blocker"); }, - subSkill:{ - ex:{ - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return player.storage.dcqingshi_ex&&player.storage.dcqingshi_ex.some(info=>{ - return info[0]==event.player&&info[1]==event.card; - }); + subSkill: { + ex: { + trigger: { source: "damageBegin1" }, + filter: function (event, player) { + return ( + player.storage.dcqingshi_ex && + player.storage.dcqingshi_ex.some((info) => { + return info[0] == event.player && info[1] == event.card; + }) + ); }, - forced:true, - charlotte:true, - popup:false, - onremove:true, - content:function(){ + forced: true, + charlotte: true, + popup: false, + onremove: true, + content: function () { trigger.num++; - for(var i=0;i0&&get.itemtype(card)==='card'&&card.hasGaintag('dczhizhe')) return num+0.16; - }, - aiValue:function(player,card,num){ - if(num>0&&get.itemtype(card)==='card'&&card.hasGaintag('dczhizhe')) return 2*num; - }, - aiUseful:function(player,card,num){ - if(num>0&&!player._dczhizhe_mod&&get.itemtype(card)==='card'&&card.hasGaintag('dczhizhe')){ - if(player.canIgnoreHandcard(card)) return Infinity; - player._dczhizhe_mod=true; - if(player.hp<3&&player.needsToDiscard(0,(i,player)=>{ - return !player.canIgnoreHandcard(i)&&get.useful(i)>6; - })) return num*1.5; - return num*10; - } + for (var i = 0; i < player.storage.dcqingshi_ex.length; i++) { + if (player.storage.dcqingshi_ex[i][1] == trigger.card) + player.storage.dcqingshi_ex.splice(i--, 1); } }, - trigger:{player:['useCardAfter','respondAfter']}, - charlotte:true, - forced:true, - filter:function(event,player){ - return player.hasHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dczhizhe')){ - if(event.cards.some(card=>{ - return get.position(card,true)=='o'&&card.cardid==i; - })) return true; + }, + clear: { + onremove: true, + charlotte: true, + }, + blocker: { charlotte: true }, + }, + ai: { + threaten: 6, + }, + }, + dczhizhe: { + audio: 2, + enable: "phaseUse", + limited: true, + filterCard: true, + position: "h", + discard: false, + lose: false, + delay: false, + skillAnimation: true, + animationColor: "metal", + check: function (card) { + if (get.type(card) != "basic" && get.type(card) != "trick") return 0; + return get.value(card) - 7.5; + }, + content: function () { + "step 0"; + var card = cards[0]; + player.awakenSkill("dczhizhe"); + var cardx = game.createCard2(card.name, card.suit, card.number, card.nature); + player.gain(cardx).gaintag.add("dczhizhe"); + player.addSkill("dczhizhe_effect"); + }, + ai: { + order: 15, + result: { + player: 1, + }, + }, + subSkill: { + effect: { + mod: { + aiOrder: function (player, card, num) { + if (num > 0 && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) + return num + 0.16; + }, + aiValue: function (player, card, num) { + if (num > 0 && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) + return 2 * num; + }, + aiUseful: function (player, card, num) { + if ( + num > 0 && + !player._dczhizhe_mod && + get.itemtype(card) === "card" && + card.hasGaintag("dczhizhe") + ) { + if (player.canIgnoreHandcard(card)) return Infinity; + player._dczhizhe_mod = true; + if ( + player.hp < 3 && + player.needsToDiscard(0, (i, player) => { + return !player.canIgnoreHandcard(i) && get.useful(i) > 6; + }) + ) + return num * 1.5; + return num * 10; + } + }, + }, + trigger: { player: ["useCardAfter", "respondAfter"] }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dczhizhe")) { + if ( + event.cards.some((card) => { + return get.position(card, true) == "o" && card.cardid == i; + }) + ) + return true; } } return false; }); }, - content:function(){ - 'step 0' - var cards=[]; - player.getHistory('lose',function(evt){ - if(evt.getParent()!=trigger) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dczhizhe')){ - var cardsx=trigger.cards.filter(card=>{ - return get.position(card,true)=='o'&&card.cardid==i; + content: function () { + "step 0"; + var cards = []; + player.getHistory("lose", function (evt) { + if (evt.getParent() != trigger) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dczhizhe")) { + var cardsx = trigger.cards.filter((card) => { + return get.position(card, true) == "o" && card.cardid == i; }); - if(cardsx.length) cards.addArray(cardsx); + if (cardsx.length) cards.addArray(cardsx); } } }); - if(cards.length){ - player.gain(cards,'gain2').gaintag.addArray(['dczhizhe','dczhizhe_clear']); - player.addTempSkill('dczhizhe_clear'); + if (cards.length) { + player.gain(cards, "gain2").gaintag.addArray(["dczhizhe", "dczhizhe_clear"]); + player.addTempSkill("dczhizhe_clear"); } }, }, - clear:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('dczhizhe_clear'); + clear: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("dczhizhe_clear"); }, - mod:{ - cardEnabled2:function(card,player){ - var cards=[]; - if(card.cards) cards.addArray(cards); - if(get.itemtype(card)=='card') cards.push(card); - for(var cardx of cards){ - if(cardx.hasGaintag('dczhizhe_clear')) return false; + mod: { + cardEnabled2: function (card, player) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (cardx.hasGaintag("dczhizhe_clear")) return false; } }, - cardRespondable:function(card,player){ - var cards=[]; - if(card.cards) cards.addArray(cards); - if(get.itemtype(card)=='card') cards.push(card); - for(var cardx of cards){ - if(cardx.hasGaintag('dczhizhe_clear')) return false; + cardRespondable: function (card, player) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (cardx.hasGaintag("dczhizhe_clear")) return false; } }, - cardSavable:function(card,player){ - var cards=[]; - if(card.cards) cards.addArray(cards); - if(get.itemtype(card)=='card') cards.push(card); - for(var cardx of cards){ - if(cardx.hasGaintag('dczhizhe_clear')) return false; + cardSavable: function (card, player) { + var cards = []; + if (card.cards) cards.addArray(cards); + if (get.itemtype(card) == "card") cards.push(card); + for (var cardx of cards) { + if (cardx.hasGaintag("dczhizhe_clear")) return false; } }, - } - } - } + }, + }, + }, }, //段巧笑 - dccaizhuang:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'dccaizhuang'); - },'he'); + dccaizhuang: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "dccaizhuang"); + }, "he"); }, - complexCard:true, - selectCard:[1,Infinity], - position:'he', - filterCard:true, - check:function(card){ - let cache=lib.skill.dccaizhuang.tempCache(); - if(!cache||cache.no) return 0; - let player=_status.event.player,suit=get.suit(card); - if(ui.selected.cards.filter(i=>{ - return get.suit(i)===suit; - }).length<(cache[suit]||0)){ - if(get.position(card)==='h') return 15-get.value(card); - return 9-get.value(card); + complexCard: true, + selectCard: [1, Infinity], + position: "he", + filterCard: true, + check: function (card) { + let cache = lib.skill.dccaizhuang.tempCache(); + if (!cache || cache.no) return 0; + let player = _status.event.player, + suit = get.suit(card); + if ( + ui.selected.cards.filter((i) => { + return get.suit(i) === suit; + }).length < (cache[suit] || 0) + ) { + if (get.position(card) === "h") return 15 - get.value(card); + return 9 - get.value(card); } return 0; }, - tempCache(){ - let cache=_status.event.getTempCache('dccaizhuang','dsuits'); - if(cache) return cache; - cache={no:true}; - _status.event.putTempCache('dccaizhuang','dsuits',cache); - let player=_status.event.player,suits={}; - lib.suit.forEach(i=>{ - suits[i]=0; + tempCache() { + let cache = _status.event.getTempCache("dccaizhuang", "dsuits"); + if (cache) return cache; + cache = { no: true }; + _status.event.putTempCache("dccaizhuang", "dsuits", cache); + let player = _status.event.player, + suits = {}; + lib.suit.forEach((i) => { + suits[i] = 0; }); - player.getCards('h',i=>{ - let suit=get.suit(i); - if(lib.suit.includes(suit)) suits[suit]++; + player.getCards("h", (i) => { + let suit = get.suit(i); + if (lib.suit.includes(suit)) suits[suit]++; }); - let sortedSuits=Object.fromEntries(Object.entries(suits).sort((a,b)=>b[1]-a[1])); - let dis=0,idx=0,dsuits=0,leave=0; - for(let i in sortedSuits){ + let sortedSuits = Object.fromEntries(Object.entries(suits).sort((a, b) => b[1] - a[1])); + let dis = 0, + idx = 0, + dsuits = 0, + leave = 0; + for (let i in sortedSuits) { idx++; - if(!sortedSuits[i]) continue; - let num=1; - if(idx>2||sortedSuits[i]<3) num=sortedSuits[i]; - cache[i]=num; - dis+=num; - suits[i]-=num; + if (!sortedSuits[i]) continue; + let num = 1; + if (idx > 2 || sortedSuits[i] < 3) num = sortedSuits[i]; + cache[i] = num; + dis += num; + suits[i] -= num; dsuits++; } - for(let i in suits){ - if(suits[i]) leave++; + for (let i in suits) { + if (suits[i]) leave++; } - player.getCards('e',i=>{ - let suit=get.suit(i); - if(!cache[suit]){ + player.getCards("e", (i) => { + let suit = get.suit(i); + if (!cache[suit]) { dsuits++; - cache[suit]=1; + cache[suit] = 1; dis++; } }); - let draw=0,e=[0,1,4/3,2,4]; - if(dsuits<=leave) return false; - do{ - draw+=e[dsuits--]; - }while(dsuits>leave); - if(draw>dis){ + let draw = 0, + e = [0, 1, 4 / 3, 2, 4]; + if (dsuits <= leave) return false; + do { + draw += e[dsuits--]; + } while (dsuits > leave); + if (draw > dis) { delete cache.no; - _status.event.putTempCache('dccaizhuang','dsuits',cache); + _status.event.putTempCache("dccaizhuang", "dsuits", cache); return cache; } return false; }, - content:function(){ - 'step 0' - var suits=[]; - cards.forEach(i=>{ - if(suits.length>=4) return; - let suit=get.suit(i,player); - if(lib.suit.includes(suit)) suits.add(suit); + content: function () { + "step 0"; + var suits = []; + cards.forEach((i) => { + if (suits.length >= 4) return; + let suit = get.suit(i, player); + if (lib.suit.includes(suit)) suits.add(suit); }); - event.num=suits.length; - 'step 1' - var suits=[]; - player.countCards('h',card=>{ - if(suits.length>=4) return; - var suit=get.suit(card); - if(lib.suit.includes(suit)) suits.add(suit); + event.num = suits.length; + ("step 1"); + var suits = []; + player.countCards("h", (card) => { + if (suits.length >= 4) return; + var suit = get.suit(card); + if (lib.suit.includes(suit)) suits.add(suit); }); - if(suits.length>=event.num) event.finish(); - 'step 2' + if (suits.length >= event.num) event.finish(); + ("step 2"); player.draw(); event.goto(1); }, - ai:{ - order:2, - result:{player:1}, + ai: { + order: 2, + result: { player: 1 }, }, }, - dchuayi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - content:function(){ - 'step 0' - player.judge(()=>1).judge2=(result)=>result.bool; - 'step 1' - var color=result.color; - if(color=='red'||color=='black') player.addTempSkill('dchuayi_'+color,{player:'phaseBegin'}); + dchuayi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + content: function () { + "step 0"; + player.judge(() => 1).judge2 = (result) => result.bool; + ("step 1"); + var color = result.color; + if (color == "red" || color == "black") + player.addTempSkill("dchuayi_" + color, { player: "phaseBegin" }); }, - subSkill:{ - red:{ - trigger:{global:'phaseEnd'}, - charlotte:true, - forced:true, - content:function(){ + subSkill: { + red: { + trigger: { global: "phaseEnd" }, + charlotte: true, + forced: true, + content: function () { player.draw(); }, - mark:true, - intro:{ - name:'华衣·红', - content:'一名角色的回合结束时,你摸一张牌' + mark: true, + intro: { + name: "华衣·红", + content: "一名角色的回合结束时,你摸一张牌", }, }, - black:{ - trigger:{player:'damageEnd'}, - charlotte:true, - forced:true, - content:function(){ + black: { + trigger: { player: "damageEnd" }, + charlotte: true, + forced: true, + content: function () { player.draw(2); }, - mark:true, - intro:{ - name:'华衣·黑', - content:'当你受到伤害后,摸两张牌' + mark: true, + intro: { + name: "华衣·黑", + content: "当你受到伤害后,摸两张牌", }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()) num=0.5; - else num=0.3; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.5; + else num = 0.3; } - if(target.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } - } - } - } - } - } + }, + }, + }, + }, + }, }, //张瑾云 - dchuizhi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('dchuizhi'),'你可以选择弃置任意张手牌并点击“确定”,将手牌摸至与全场手牌数最多的角色数相同。',[0,Infinity]).set('logSkill','dchuizhi').set('ai',card=>{ - if(_status.event.isMax){ - if(ui.selected.cards.length) return -get.value(card); - return 0; - } - return 6-get.value(card); - }).set('isMax',player.isMaxHandcard()); - 'step 1' - if(result.bool){ - var num=0,targets=game.filterPlayer(); - for(var current of targets){ - if(current.isMaxHandcard()){ - num=current.countCards('h'); + dchuizhi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseToDiscard( + get.prompt("dchuizhi"), + "你可以选择弃置任意张手牌并点击“确定”,将手牌摸至与全场手牌数最多的角色数相同。", + [0, Infinity] + ) + .set("logSkill", "dchuizhi") + .set("ai", (card) => { + if (_status.event.isMax) { + if (ui.selected.cards.length) return -get.value(card); + return 0; + } + return 6 - get.value(card); + }) + .set("isMax", player.isMaxHandcard()); + ("step 1"); + if (result.bool) { + var num = 0, + targets = game.filterPlayer(); + for (var current of targets) { + if (current.isMaxHandcard()) { + num = current.countCards("h"); break; } } - num=Math.max(1,Math.min(5,num-player.countCards('h'))); + num = Math.max(1, Math.min(5, num - player.countCards("h"))); player.draw(num); } - } + }, }, - dcjijiao:{ - audio:2, - enable:'phaseUse', - limited:true, - skillAnimation:true, - animationColor:'orange', - init:function(player){ - player.addSkill('dcjijiao_machi'); + dcjijiao: { + audio: 2, + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + init: function (player) { + player.addSkill("dcjijiao_machi"); }, - onremove:function(player){ - player.removeSkill('dcjijiao_machi'); + onremove: function (player) { + player.removeSkill("dcjijiao_machi"); }, - onChooseToUse:function(event){ - if(event.dcjijiao==undefined&&!game.online){ - var bool=lib.skill.dcjijiao.getCards(event.player,true); - event.set('dcjijiao',bool); + onChooseToUse: function (event) { + if (event.dcjijiao == undefined && !game.online) { + var bool = lib.skill.dcjijiao.getCards(event.player, true); + event.set("dcjijiao", bool); } }, - filter:function(event,player){ + filter: function (event, player) { return event.dcjijiao; }, - filterTarget:true, - getCards:function(player,bool){ - var cards=Array.from(ui.discardPile.childNodes); - var gains=cards.slice(0); - var history=game.getAllGlobalHistory('cardMove',function(evt){ - if(evt.name=='lose') return evt.position==ui.discardPile; - return evt.name=='cardsDiscard'; + filterTarget: true, + getCards: function (player, bool) { + var cards = Array.from(ui.discardPile.childNodes); + var gains = cards.slice(0); + var history = game.getAllGlobalHistory("cardMove", function (evt) { + if (evt.name == "lose") return evt.position == ui.discardPile; + return evt.name == "cardsDiscard"; }); - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - var cards2=evt.cards.filter(function(card){ + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + var cards2 = evt.cards.filter(function (card) { return cards.includes(card); }); - if(cards2.length){ - if(!lib.skill.dcjijiao.isUse(evt,player)){ + if (cards2.length) { + if (!lib.skill.dcjijiao.isUse(evt, player)) { gains.removeArray(cards2); } cards.removeArray(cards2); } - if(!cards.length) break; + if (!cards.length) break; } - if(bool) return gains.some(card=>get.type2(card,false)=='trick'); - return gains.filter(card=>get.type2(card,false)=='trick'); + if (bool) return gains.some((card) => get.type2(card, false) == "trick"); + return gains.filter((card) => get.type2(card, false) == "trick"); }, - isUse:function(event,player){ - if(event.name!='cardsDiscard') return (event.type=='discard'&&event.player==player); - var evtx=event.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evt2=(evtx.relatedEvent||evtx.getParent()); - return (evt2.name=='useCard'&&evt2.player==player); + isUse: function (event, player) { + if (event.name != "cardsDiscard") + return event.type == "discard" && event.player == player; + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + return evt2.name == "useCard" && evt2.player == player; }, - content:function(){ - player.awakenSkill('dcjijiao'); - var cards=lib.skill.dcjijiao.getCards(player); - if(cards.length){ - target.gain(cards,'gain2').gaintag.add('dcjijiao'); - target.addSkill('dcjijiao_nowuxie'); + content: function () { + player.awakenSkill("dcjijiao"); + var cards = lib.skill.dcjijiao.getCards(player); + if (cards.length) { + target.gain(cards, "gain2").gaintag.add("dcjijiao"); + target.addSkill("dcjijiao_nowuxie"); } }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(ui.cardPile.childNodes.length>game.players.length*5&&!player.hasSkill('dcjijiao_risutoa')&& - !game.hasPlayer(current=>current.hp<=1)&&game.countPlayer(current=>current.hp===2&¤t.countCards('hes')<3)<=1) return 0; + ai: { + order: 1, + result: { + target: function (player, target) { + if ( + ui.cardPile.childNodes.length > game.players.length * 5 && + !player.hasSkill("dcjijiao_risutoa") && + !game.hasPlayer((current) => current.hp <= 1) && + game.countPlayer( + (current) => current.hp === 2 && current.countCards("hes") < 3 + ) <= 1 + ) + return 0; return 5; - } - } - }, - subSkill:{ - machi:{ - charlotte:true, - forced:true, - popup:false, - trigger:{ - global:['washCard','die'], }, - filter:function(event,player){ - return player.hasSkill('dcjijiao',null,false,false); - }, - content:function(){ - player.addSkill('dcjijiao_risutoa'); - } }, - risutoa:{ - charlotte:true, - forced:true, - popup:false, - trigger:{global:'phaseAfter'}, - content:function(){ - if(player.awakenedSkills.includes('dcjijiao')){ - player.restoreSkill('dcjijiao'); - game.log(player,'重置了','#g【继椒】'); + }, + subSkill: { + machi: { + charlotte: true, + forced: true, + popup: false, + trigger: { + global: ["washCard", "die"], + }, + filter: function (event, player) { + return player.hasSkill("dcjijiao", null, false, false); + }, + content: function () { + player.addSkill("dcjijiao_risutoa"); + }, + }, + risutoa: { + charlotte: true, + forced: true, + popup: false, + trigger: { global: "phaseAfter" }, + content: function () { + if (player.awakenedSkills.includes("dcjijiao")) { + player.restoreSkill("dcjijiao"); + game.log(player, "重置了", "#g【继椒】"); //player.removeSkill('dcjijiao_machi'); } - player.removeSkill('dcjijiao_risutoa'); - } + player.removeSkill("dcjijiao_risutoa"); + }, }, - nowuxie:{ - trigger:{player:'useCard1'}, - forced:true, - charlotte:true, - firstDo:true, - popup:false, - filter:function(event,player){ - if(get.type(event.card)!='trick') return false; - return player.hasHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('dcjijiao')) return true; + nowuxie: { + trigger: { player: "useCard1" }, + forced: true, + charlotte: true, + firstDo: true, + popup: false, + filter: function (event, player) { + if (get.type(event.card) != "trick") return false; + return player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("dcjijiao")) return true; } return false; }); }, - content:function(){ - trigger.nowuxie=true; + content: function () { + trigger.nowuxie = true; }, - onremove:function(player){ - player.removeGaintag('dcjijiao'); + onremove: function (player) { + player.removeGaintag("dcjijiao"); }, - } - } + }, + }, }, //桓范 - dcjianzheng:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.countCards('h')&&target!=player; + dcjianzheng: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("h") && target != player; }, - content:function(){ - 'step 0' - var forced=target.hasCard(i=>player.hasUseTarget(i),'h'); - player.choosePlayerCard(target,'h','visible',forced,'获得并使用其中一张牌').set('filterButton',button=>{ - return _status.event.player.hasUseTarget(button.link); - }).set('ai',button=>{ - return _status.event.player.getUseValue(button.link); - }); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.gain(card,'giveAuto'); + content: function () { + "step 0"; + var forced = target.hasCard((i) => player.hasUseTarget(i), "h"); + player + .choosePlayerCard(target, "h", "visible", forced, "获得并使用其中一张牌") + .set("filterButton", (button) => { + return _status.event.player.hasUseTarget(button.link); + }) + .set("ai", (button) => { + return _status.event.player.getUseValue(button.link); + }); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player.gain(card, "giveAuto"); + } else event.goto(3); + ("step 2"); + if (get.position(card) == "h" && get.owner(card) == player && player.hasUseTarget(card)) { + if (get.name(card, player) == "sha") player.chooseUseTarget(card, true, false); + else player.chooseUseTarget(card, true); } - else event.goto(3); - 'step 2' - if(get.position(card)=='h'&&get.owner(card)==player&&player.hasUseTarget(card)){ - if(get.name(card,player)=='sha') player.chooseUseTarget(card,true,false); - else player.chooseUseTarget(card,true); - } - 'step 3' - if(player.hasHistory('useCard',evt=>{ - return evt.getParent(2).name=='dcjianzheng'&&evt.targets.includes(target); - })){ + ("step 3"); + if ( + player.hasHistory("useCard", (evt) => { + return evt.getParent(2).name == "dcjianzheng" && evt.targets.includes(target); + }) + ) { player.link(true); target.link(true); - } - else event.finish(); - 'step 4' + } else event.finish(); + ("step 4"); target.viewHandcards(player); }, - ai:{ - order:10, - expose:0.2, - result:{ - target:function(player,target){ - return -Math.sqrt(target.countCards('h')); - } - } - } + ai: { + order: 10, + expose: 0.2, + result: { + target: function (player, target) { + return -Math.sqrt(target.countCards("h")); + }, + }, + }, }, //fumo! - dcfumou:{ - audio:2, - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return player.getDamagedHp()>0; + dcfumou: { + audio: 2, + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.getDamagedHp() > 0; }, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - player.chooseTarget(get.prompt2('dcfumou'),[1,player.getDamagedHp()]).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - if(target.countCards('h')>=3||target.countCards('e')&&!target.isDamaged()){ - if(!target.canMoveCard()) return -att; - else if(!target.canMoveCard(true)) return -att/5; - } - return att; - }); - 'step 2' - if(result.bool){ - var targets=result.targets; - targets.sortBySeat(player); - event.targets=targets; - player.logSkill('dcfumou',targets); - event.num--; - } - else event.finish(); - 'step 3' - var target=targets.shift(); - event.target=target; - var choices=[]; - var choiceList=[ - '移动场上的一张牌', - '弃置所有手牌并摸两张牌', - '弃置装备区里的所有牌并回复1点体力' - ]; - if(target.canMoveCard()) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(target.countCards('h')&&!target.hasCard(card=>{ - return !lib.filter.cardDiscardable(card,target,'dcfumou'); - },'h')) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - if(target.countCards('e')&&!target.hasCard(card=>{ - return !lib.filter.cardDiscardable(card,target,'dcfumou'); - },'h')) choices.push('选项三'); - else choiceList[2]=''+choiceList[2]+''; - if(choices.length){ - target.chooseControl(choices).set('prompt','腹谋:请选择一项').set('choiceList',choiceList).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(choices.length==1) return choices[0]; - var func=(choice,target)=>{ - switch(choice){ - case '选项一': - if(target.canMoveCard(true)) return 5; - return 3; - case '选项二': - if(target.countCards('h')<2&&get.value(target.getCards('h')[0])<6) return 4.5; - return 4.5-target.countCards('h'); - case '选项三': - var e2=target.getEquip(2); - if(target.hp+target.countCards('hs',['tao','jiu'])<2&&!e2) return 5.5; - if(get.recoverEffect(target,target,target)<=0) return 3; - if(!e2) return 4.4; - return 5-1.5*target.countCards('e'); - } + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); + player + .chooseTarget(get.prompt2("dcfumou"), [1, player.getDamagedHp()]) + .set("ai", (target) => { + var att = get.attitude(_status.event.player, target); + if ( + target.countCards("h") >= 3 || + (target.countCards("e") && !target.isDamaged()) + ) { + if (!target.canMoveCard()) return -att; + else if (!target.canMoveCard(true)) return -att / 5; } - var choicesx=choices.map(i=>[i,func(i,target)]).sort((a,b)=>b[1]-a[1]); - return choicesx[0][0]; - }()); - } - else event.goto(5); - 'step 4' - game.log(target,'选择了','#y'+result.control); - if(result.control=='选项一'){ + return att; + }); + ("step 2"); + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(player); + event.targets = targets; + player.logSkill("dcfumou", targets); + event.num--; + } else event.finish(); + ("step 3"); + var target = targets.shift(); + event.target = target; + var choices = []; + var choiceList = [ + "移动场上的一张牌", + "弃置所有手牌并摸两张牌", + "弃置装备区里的所有牌并回复1点体力", + ]; + if (target.canMoveCard()) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if ( + target.countCards("h") && + !target.hasCard((card) => { + return !lib.filter.cardDiscardable(card, target, "dcfumou"); + }, "h") + ) + choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if ( + target.countCards("e") && + !target.hasCard((card) => { + return !lib.filter.cardDiscardable(card, target, "dcfumou"); + }, "h") + ) + choices.push("选项三"); + else choiceList[2] = '' + choiceList[2] + ""; + if (choices.length) { + target + .chooseControl(choices) + .set("prompt", "腹谋:请选择一项") + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (choices.length == 1) return choices[0]; + var func = (choice, target) => { + switch (choice) { + case "选项一": + if (target.canMoveCard(true)) return 5; + return 3; + case "选项二": + if ( + target.countCards("h") < 2 && + get.value(target.getCards("h")[0]) < 6 + ) + return 4.5; + return 4.5 - target.countCards("h"); + case "选项三": + var e2 = target.getEquip(2); + if ( + target.hp + target.countCards("hs", ["tao", "jiu"]) < 2 && + !e2 + ) + return 5.5; + if (get.recoverEffect(target, target, target) <= 0) return 3; + if (!e2) return 4.4; + return 5 - 1.5 * target.countCards("e"); + } + }; + var choicesx = choices + .map((i) => [i, func(i, target)]) + .sort((a, b) => b[1] - a[1]); + return choicesx[0][0]; + })() + ); + } else event.goto(5); + ("step 4"); + game.log(target, "选择了", "#y" + result.control); + if (result.control == "选项一") { target.moveCard(true); - } - else if(result.control=='选项二'){ - target.chooseToDiscard(true,'h',target.countCards('h')); + } else if (result.control == "选项二") { + target.chooseToDiscard(true, "h", target.countCards("h")); target.draw(2); - } - else{ - target.chooseToDiscard(true,'e',target.countCards('e')); + } else { + target.chooseToDiscard(true, "e", target.countCards("e")); target.recover(); } - 'step 5' - if(event.targets.length) event.goto(3); + ("step 5"); + if (event.targets.length) event.goto(3); // else if(event.num) event.goto(1); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()) num=0.7; - else num=0.5; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var num = 1; + if (get.attitude(player, target) > 0) { + if (player.needsToDiscard()) num = 0.7; + else num = 0.5; } - if(target.hp==2&&target.hasFriend()) return [1,num*1.5]; - if(target.hp>=2) return [1,num]; + if (target.hp == 2 && target.hasFriend()) return [1, num * 1.5]; + if (target.hp >= 2) return [1, num]; } }, }, - } + }, }, //陈泰 - dcctjiuxian:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:lib.filter.cardRecastable, - selectCard:function(){ - return Math.ceil(_status.event.player.countCards('h')/2); + dcctjiuxian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: lib.filter.cardRecastable, + selectCard: function () { + return Math.ceil(_status.event.player.countCards("h") / 2); }, - check:function(card){ - return 6.5-get.value(card); + check: function (card) { + return 6.5 - get.value(card); }, - discard:false, - lose:false, - delay:false, - content:function(){ - 'step 0' + discard: false, + lose: false, + delay: false, + content: function () { + "step 0"; player.recast(cards); - 'step 1' - player.addTempSkill('dcctjiuxian_help'); - player.chooseUseTarget({ - name:'juedou', - isCard:true, - storage:{dcctjiuxian:true} - },true); + ("step 1"); + player.addTempSkill("dcctjiuxian_help"); + player.chooseUseTarget( + { + name: "juedou", + isCard: true, + storage: { dcctjiuxian: true }, + }, + true + ); }, - ai:{ - order:function(){ - return 0.9*get.order({name:'juedou'}); + ai: { + order: function () { + return 0.9 * get.order({ name: "juedou" }); }, - tag:{ - respond:2, - respondSha:2, - damage:1, + tag: { + respond: 2, + respondSha: 2, + damage: 1, }, - result:{ - player:function(player){ - let target=null, maxval=0; - for(let i of game.players){ - let jdeff=get.effect(i,{ - name:'juedou', - isCard:true, - cards:ui.selected.cards, - storage:{dcctjiuxian:true} - },player,player); - if(i===player||!player.canUse({ - name:'juedou', - isCard:true, - cards:ui.selected.cards, - storage:{dcctjiuxian:true} - },i)||jdeff<0) continue; - let receff=0; - game.filterPlayer(function(current){ - if(player!=current&&i.inRange(current)&¤t.isDamaged()) receff=Math.max(receff,get.recoverEffect(current,i,i)); + result: { + player: function (player) { + let target = null, + maxval = 0; + for (let i of game.players) { + let jdeff = get.effect( + i, + { + name: "juedou", + isCard: true, + cards: ui.selected.cards, + storage: { dcctjiuxian: true }, + }, + player, + player + ); + if ( + i === player || + !player.canUse( + { + name: "juedou", + isCard: true, + cards: ui.selected.cards, + storage: { dcctjiuxian: true }, + }, + i + ) || + jdeff < 0 + ) + continue; + let receff = 0; + game.filterPlayer(function (current) { + if (player != current && i.inRange(current) && current.isDamaged()) + receff = Math.max(receff, get.recoverEffect(current, i, i)); }); - if(jdeff+receff/5>maxval){ - target=i; - maxval=jdeff+receff/5; + if (jdeff + receff / 5 > maxval) { + target = i; + maxval = jdeff + receff / 5; } } - if(target) return maxval/80; + if (target) return maxval / 80; return 0; - } - } - }, - subSkill:{ - help:{ - trigger:{global:'damageSource'}, - filter:function(event,player){ - return event.card&&event.card.storage&&event.card.storage.dcctjiuxian&&event.player.isIn()&& - event.getParent(2).targets.includes(event.player)&&game.hasPlayer(current=>{ - return current!=player&&event.player.inRange(current)&¤t.isDamaged(); - }); }, - direct:true, - forced:true, - charlotte:true, - content:function(){ - 'step 0' - player.chooseTarget('救陷:是否令其攻击范围内的一名其他角色回复1点体力?',(card,player,target)=>{ - if(_status.event.player==target) return false; - return target.isDamaged()&&_status.event.targetx.inRange(target); - }).set('targetx',trigger.player).set('ai',target=>get.recoverEffect(target,_status.event.player,_status.event.player)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcctjiuxian_help',target); + }, + }, + subSkill: { + help: { + trigger: { global: "damageSource" }, + filter: function (event, player) { + return ( + event.card && + event.card.storage && + event.card.storage.dcctjiuxian && + event.player.isIn() && + event.getParent(2).targets.includes(event.player) && + game.hasPlayer((current) => { + return ( + current != player && + event.player.inRange(current) && + current.isDamaged() + ); + }) + ); + }, + direct: true, + forced: true, + charlotte: true, + content: function () { + "step 0"; + player + .chooseTarget( + "救陷:是否令其攻击范围内的一名其他角色回复1点体力?", + (card, player, target) => { + if (_status.event.player == target) return false; + return target.isDamaged() && _status.event.targetx.inRange(target); + } + ) + .set("targetx", trigger.player) + .set("ai", (target) => + get.recoverEffect(target, _status.event.player, _status.event.player) + ); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcctjiuxian_help", target); target.recover(player); } - } - } - } - }, - dcchenyong:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - filter:function(event,player){ - return player.getHistory('useCard').length; + }, + }, }, - content:function(){ - var types=[]; - var history=player.getHistory('useCard'); - for(var evt of history){ + }, + dcchenyong: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.getHistory("useCard").length; + }, + content: function () { + var types = []; + var history = player.getHistory("useCard"); + for (var evt of history) { types.add(get.type2(evt.card)); } - var num=types.length; + var num = types.length; player.draw(num); }, - ai:{threaten:2.2} + ai: { threaten: 2.2 }, }, //孙瑜 - dcquanshou:{ - audio:2, - trigger:{global:'phaseBegin'}, - filter:function(event,player){ - return event.player.countCards('h')<=event.player.maxHp; + dcquanshou: { + audio: 2, + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + return event.player.countCards("h") <= event.player.maxHp; }, - logTarget:'player', - check:function(event,player){ - if(get.attitude(player,event.player)>0) return true; - const draw=event.player.maxHp-event.player.countCards('h'); - return draw<=2&&event.player.getHp(true)-draw>=1; + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) > 0) return true; + const draw = event.player.maxHp - event.player.countCards("h"); + return draw <= 2 && event.player.getHp(true) - draw >= 1; }, - content:function(){ - 'step 0' - var draw=Math.min(5,trigger.player.maxHp-trigger.player.countCards('h')); - trigger.player.chooseControl().set('choiceList',[ - (draw>0?'摸'+get.cnNumber(draw)+'张牌,然后':'令')+'你本回合使用【杀】的次数上限-1', - '当你本回合使用牌被抵消后,'+get.translation(player)+'摸一张牌' - ]).set('ai',()=>_status.event.choice).set('choice',function(){ - var draw=Math.min(5,Math.max(0,trigger.player.maxHp-trigger.player.countCards('h'))); - if(get.attitude(trigger.player,player)>0){ - if(draw>=3||trigger.player.getCardUsable('sha')>1) return '选项一'; - if(!draw||draw<=1&&trigger.player.countCards('hs',card=>{ - return get.name(card)=='sha'&&trigger.player.hasValueTarget(card); - })) return '选项二'; - return '选项一'; - } - else{ - if(draw>=4) return '选项一'; - if(draw<2&&trigger.player.countCards('hs',card=>{ - return trigger.player.hasValueTarget(card); - })) return '选项二'; - return '选项一'; - } - }()).set('prompt','劝守:请选择一项'); - 'step 1' - game.log(trigger.player,'选择了','#y'+result.control); - if(result.control=='选项一'){ - var draw=Math.min(5,trigger.player.maxHp-trigger.player.countCards('h')); - if(draw>0) trigger.player.draw(draw); - trigger.player.addTempSkill('dcquanshou_sha'); - trigger.player.addMark('dcquanshou_sha',1,false); - } - else{ - trigger.player.addTempSkill('dcquanshou_respond'); - trigger.player.markAuto('dcquanshou_respond',[player]); + content: function () { + "step 0"; + var draw = Math.min(5, trigger.player.maxHp - trigger.player.countCards("h")); + trigger.player + .chooseControl() + .set("choiceList", [ + (draw > 0 ? "摸" + get.cnNumber(draw) + "张牌,然后" : "令") + + "你本回合使用【杀】的次数上限-1", + "当你本回合使用牌被抵消后," + get.translation(player) + "摸一张牌", + ]) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + var draw = Math.min( + 5, + Math.max(0, trigger.player.maxHp - trigger.player.countCards("h")) + ); + if (get.attitude(trigger.player, player) > 0) { + if (draw >= 3 || trigger.player.getCardUsable("sha") > 1) return "选项一"; + if ( + !draw || + (draw <= 1 && + trigger.player.countCards("hs", (card) => { + return ( + get.name(card) == "sha" && + trigger.player.hasValueTarget(card) + ); + })) + ) + return "选项二"; + return "选项一"; + } else { + if (draw >= 4) return "选项一"; + if ( + draw < 2 && + trigger.player.countCards("hs", (card) => { + return trigger.player.hasValueTarget(card); + }) + ) + return "选项二"; + return "选项一"; + } + })() + ) + .set("prompt", "劝守:请选择一项"); + ("step 1"); + game.log(trigger.player, "选择了", "#y" + result.control); + if (result.control == "选项一") { + var draw = Math.min(5, trigger.player.maxHp - trigger.player.countCards("h")); + if (draw > 0) trigger.player.draw(draw); + trigger.player.addTempSkill("dcquanshou_sha"); + trigger.player.addMark("dcquanshou_sha", 1, false); + } else { + trigger.player.addTempSkill("dcquanshou_respond"); + trigger.player.markAuto("dcquanshou_respond", [player]); } }, - ai:{ - expose:0.1 + ai: { + expose: 0.1, }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - marktext:'守', - intro:{content:'使用【杀】的次数上限-#'}, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num-player.countMark('dcquanshou_sha'); + subSkill: { + sha: { + charlotte: true, + onremove: true, + marktext: "守", + intro: { content: "使用【杀】的次数上限-#" }, + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("dcquanshou_sha"); }, - } - }, - respond:{ - trigger:{player:['shaMiss','eventNeutralized']}, - filter:function(event,player){ - if(event.type!='card'&&event.name!='_wuxie') return false; - return player.getStorage('dcquanshou_respond').some(i=>i.isIn()); }, - forced:true, - popup:false, - charlotte:true, - onremove:true, - marktext:'', - intro:{content:'本回合使用的牌被抵消后,$摸一张牌'}, - content:function(){ - var targets=player.getStorage('dcquanshou_respond'); + }, + respond: { + trigger: { player: ["shaMiss", "eventNeutralized"] }, + filter: function (event, player) { + if (event.type != "card" && event.name != "_wuxie") return false; + return player.getStorage("dcquanshou_respond").some((i) => i.isIn()); + }, + forced: true, + popup: false, + charlotte: true, + onremove: true, + marktext: '', + intro: { content: "本回合使用的牌被抵消后,$摸一张牌" }, + content: function () { + var targets = player.getStorage("dcquanshou_respond"); targets.sortBySeat(); - for(var target of targets){ - if(target.isIn()){ - target.logSkill('dcquanshou_respond',player); + for (var target of targets) { + if (target.isIn()) { + target.logSkill("dcquanshou_respond", player); target.draw(); } } - } - } - } - }, - dcshexue:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - var cards=lib.skill.dcshexue.getLast(); - return cards.some(card=>player.hasUseTarget(card,false)); + }, + }, }, - getLast:function(){ - var cards=[]; - for(var current of game.filterPlayer()){ - var history=current.actionHistory; - if(history.length<2) continue; - if(history[history.length-2].isMe){ - var evts=history[history.length-2].useCard; - for(var i=evts.length-1;i>=0;i--){ - var evt=evts[i]; - if(get.type(evt.card)!='basic'&&get.type(evt.card)!='trick') continue; - var evtx=evt.getParent('phaseUse'); - if(evtx&&evtx.player==current) cards.push({name:evt.card.name,nature:evt.card.nature}); + }, + dcshexue: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + var cards = lib.skill.dcshexue.getLast(); + return cards.some((card) => player.hasUseTarget(card, false)); + }, + getLast: function () { + var cards = []; + for (var current of game.filterPlayer()) { + var history = current.actionHistory; + if (history.length < 2) continue; + if (history[history.length - 2].isMe) { + var evts = history[history.length - 2].useCard; + for (var i = evts.length - 1; i >= 0; i--) { + var evt = evts[i]; + if (get.type(evt.card) != "basic" && get.type(evt.card) != "trick") continue; + var evtx = evt.getParent("phaseUse"); + if (evtx && evtx.player == current) + cards.push({ name: evt.card.name, nature: evt.card.nature }); } } } return cards; }, - direct:true, - group:'dcshexue_end', - content:function(){ - 'step 0' - var cards=lib.skill.dcshexue.getLast(); - cards=cards.filter(card=>player.hasUseTarget(card,false)); - player.chooseButton(['设学:是否将一张牌当作其中一张牌使用?',[cards,'vcard']]); - 'step 1' - if(!result.bool) return; - var card=result.links[0]; - game.broadcastAll(function(card){ - lib.skill.dcshexue_backup.viewAs=card; - },card); - var next=player.chooseToUse(); - next.set('openskilldialog',`###${get.prompt('dcshexue')}###将一张牌当做${get.translation(card.nature)||''}【${get.translation(card.name)}】使用`); - next.set('norestore',true); - next.set('addCount',false); - next.set('_backupevent','dcshexue_backup'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + direct: true, + group: "dcshexue_end", + content: function () { + "step 0"; + var cards = lib.skill.dcshexue.getLast(); + cards = cards.filter((card) => player.hasUseTarget(card, false)); + player.chooseButton(["设学:是否将一张牌当作其中一张牌使用?", [cards, "vcard"]]); + ("step 1"); + if (!result.bool) return; + var card = result.links[0]; + game.broadcastAll(function (card) { + lib.skill.dcshexue_backup.viewAs = card; + }, card); + var next = player.chooseToUse(); + next.set( + "openskilldialog", + `###${get.prompt("dcshexue")}###将一张牌当做${ + get.translation(card.nature) || "" + }【${get.translation(card.name)}】使用` + ); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "dcshexue_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('dcshexue_backup'); + next.backup("dcshexue_backup"); }, - subSkill:{ - backup:{ - audio:'dcshexue', - filterCard:function(card){ - return get.itemtype(card)=='card'; + subSkill: { + backup: { + audio: "dcshexue", + filterCard: function (card) { + return get.itemtype(card) == "card"; }, - filterTarget:lib.filter.targetEnabled, - position:'hes', - selectCard:1, - check:(card)=>6-get.value(card), - popname:true, + filterTarget: lib.filter.targetEnabled, + position: "hes", + selectCard: 1, + check: (card) => 6 - get.value(card), + popname: true, }, - end:{ - audio:'dcshexue', - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.getHistory('useCard',evt=>{ - return evt.getParent('phaseUse')==event&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick'); + end: { + audio: "dcshexue", + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return player.getHistory("useCard", (evt) => { + return ( + evt.getParent("phaseUse") == event && + (get.type(evt.card) == "basic" || get.type(evt.card) == "trick") + ); }).length; }, - prompt2:function(event,player){ - return '令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做你本阶段使用过的一张基本牌或普通锦囊牌使用?'; + prompt2: function (event, player) { + return "令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做你本阶段使用过的一张基本牌或普通锦囊牌使用?"; }, - check:function(event,player){ - let evt=event.getParent('phase').getParent(); - let nextPlayer=player.getNext(); - if(evt&&evt.next&&evt.next.length){ - nextPlayer=evt.next[0].player; + check: function (event, player) { + let evt = event.getParent("phase").getParent(); + let nextPlayer = player.getNext(); + if (evt && evt.next && evt.next.length) { + nextPlayer = evt.next[0].player; } - return get.attitude(player,nextPlayer)>0; + return get.attitude(player, nextPlayer) > 0; }, - content:function(){ - var history=player.getHistory('useCard',evt=>{ - return evt.getParent('phaseUse')==trigger&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick'); + content: function () { + var history = player.getHistory("useCard", (evt) => { + return ( + evt.getParent("phaseUse") == trigger && + (get.type(evt.card) == "basic" || get.type(evt.card) == "trick") + ); }); - player.addSkill('dcshexue_studyclear'); - if(!player.storage.dcshexue_studyclear) player.storage.dcshexue_studyclear=[]; - history.forEach(evt=>{ - var card=evt.card; - card={name:card.name,nature:card.nature}; + player.addSkill("dcshexue_studyclear"); + if (!player.storage.dcshexue_studyclear) player.storage.dcshexue_studyclear = []; + history.forEach((evt) => { + var card = evt.card; + card = { name: card.name, nature: card.nature }; player.storage.dcshexue_studyclear.push(card); }); - } - }, - study:{ - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i,false)); }, - onremove:true, - charlotte:true, - direct:true, - content:function(){ - 'step 0' - event.cards=player.getStorage('dcshexue_study'); - 'step 1' - var card=cards.pop(); - if(trigger.player.hasUseTarget(card,false)){ - game.broadcastAll(function(card){ - lib.skill.dcshexue_backup.viewAs=card; - lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?'; - },card); - var next=trigger.player.chooseToUse(); - next.set('openskilldialog',`###${get.prompt('dcshexue_study')}###将一张牌当做${get.translation(card.nature)||''}【${get.translation(card.name)}】使用`); - next.set('norestore',true); - next.set('addCount',false); - next.set('_backupevent','dcshexue_backup'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} - }); - next.backup('dcshexue_backup'); - } - if(cards.length) event.redo(); - } }, - studyclear:{ - trigger:{global:'phaseBegin'}, - charlotte:true, - forceDie:true, - silent:true, - onremove:true, - lastDo:true, - content:function(){ - trigger.player.addTempSkill('dcshexue_study'); - if(!trigger.player.storage.dcshexue_study) trigger.player.storage.dcshexue_study=[]; - trigger.player.storage.dcshexue_study=trigger.player.storage.dcshexue_study.concat(player.getStorage('dcshexue_studyclear')); - player.removeSkill('dcshexue_studyclear'); - } - } - } + study: { + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player + .getStorage("dcshexue_study") + .some((i) => event.player.hasUseTarget(i, false)); + }, + onremove: true, + charlotte: true, + direct: true, + content: function () { + "step 0"; + event.cards = player.getStorage("dcshexue_study"); + ("step 1"); + var card = cards.pop(); + if (trigger.player.hasUseTarget(card, false)) { + game.broadcastAll(function (card) { + lib.skill.dcshexue_backup.viewAs = card; + lib.skill.dcshexue_backup.prompt = + "设学:是否将一张牌当做" + get.translation(card) + "使用?"; + }, card); + var next = trigger.player.chooseToUse(); + next.set( + "openskilldialog", + `###${get.prompt("dcshexue_study")}###将一张牌当做${ + get.translation(card.nature) || "" + }【${get.translation(card.name)}】使用` + ); + next.set("norestore", true); + next.set("addCount", false); + next.set("_backupevent", "dcshexue_backup"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, + }); + next.backup("dcshexue_backup"); + } + if (cards.length) event.redo(); + }, + }, + studyclear: { + trigger: { global: "phaseBegin" }, + charlotte: true, + forceDie: true, + silent: true, + onremove: true, + lastDo: true, + content: function () { + trigger.player.addTempSkill("dcshexue_study"); + if (!trigger.player.storage.dcshexue_study) + trigger.player.storage.dcshexue_study = []; + trigger.player.storage.dcshexue_study = + trigger.player.storage.dcshexue_study.concat( + player.getStorage("dcshexue_studyclear") + ); + player.removeSkill("dcshexue_studyclear"); + }, + }, + }, }, //郤正 - dcdanyi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - if(!event.isFirstTarget) return false; - if(!event.targets||!event.targets.length) return false; - var evt=lib.skill.dcjianying.getLastUsed(player,event.getParent()); - if(!evt||!evt.targets||!evt.targets.length) return false; - return event.targets.some(target=>evt.targets.includes(target)); + dcdanyi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + if (!event.isFirstTarget) return false; + if (!event.targets || !event.targets.length) return false; + var evt = lib.skill.dcjianying.getLastUsed(player, event.getParent()); + if (!evt || !evt.targets || !evt.targets.length) return false; + return event.targets.some((target) => evt.targets.includes(target)); }, - frequent:true, - locked:false, - content:function(){ - var evt=lib.skill.dcjianying.getLastUsed(player,trigger.getParent()); - player.draw(trigger.targets.filter(target=>evt.targets.includes(target)).length); + frequent: true, + locked: false, + content: function () { + var evt = lib.skill.dcjianying.getLastUsed(player, trigger.getParent()); + player.draw(trigger.targets.filter((target) => evt.targets.includes(target)).length); }, - locked:false, - mod:{ - aiOrder:function(player,card,num){ - var evt=player.getLastUsed(); - if(evt&&evt.targets&&evt.targets.length&&game.hasPlayer(current=>{ - return evt.targets.includes(current)&&player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })) return num+10; + locked: false, + mod: { + aiOrder: function (player, card, num) { + var evt = player.getLastUsed(); + if ( + evt && + evt.targets && + evt.targets.length && + game.hasPlayer((current) => { + return ( + evt.targets.includes(current) && + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) + return num + 10; }, }, - ai:{ - effect:{ - player:function(card,player,target){ - var evt=player.getLastUsed(); - if(evt&&evt.targets.includes(target)) return [1.5,0]; + ai: { + effect: { + player: function (card, player, target) { + var evt = player.getLastUsed(); + if (evt && evt.targets.includes(target)) return [1.5, 0]; }, }, }, }, - dcwencan:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - if(ui.selected.targets.length){ - if(ui.selected.targets[0].hp==target.hp) return false; + dcwencan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + if (ui.selected.targets.length) { + if (ui.selected.targets[0].hp == target.hp) return false; } - return target!=player; + return target != player; }, - selectTarget:[1,2], - complexTarget:true, - multiline:true, - content:function(){ - 'step 0' - target.chooseToDiscard(get.translation(player)+'对你发动了【文灿】','是否弃置两张花色不同的牌?或者点击“取消”,令其本回合对你使用牌无距离和次数限制','he',2,(card,player)=>{ - if(!ui.selected.cards.length) return true; - var suit=get.suit(card,player); - for(var i of ui.selected.cards){ - if(get.suit(i,player)==suit) return false; - } - return true; - }).set('complexCard',true).set('ai',card=>{ - if(_status.event.nofear) return 0; - return 5-get.value(card); - }).set('nofear',player.countCards('hs',card=>{ - return get.tag(card,'damage')&&player.canUse(card,target,false)&&get.effect(target,card,player,target)<=0; - }) { + if (!ui.selected.cards.length) return true; + var suit = get.suit(card, player); + for (var i of ui.selected.cards) { + if (get.suit(i, player) == suit) return false; + } + return true; + } + ) + .set("complexCard", true) + .set("ai", (card) => { + if (_status.event.nofear) return 0; + return 5 - get.value(card); + }) + .set( + "nofear", + player.countCards("hs", (card) => { + return ( + get.tag(card, "damage") && + player.canUse(card, target, false) && + get.effect(target, card, player, target) <= 0 + ); + }) < target.hp + ); + ("step 1"); + if (!result.bool) { + player.addTempSkill("dcwencan_paoxiao"); + player.markAuto("dcwencan_paoxiao", [target]); } }, - subSkill:{ - paoxiao:{ - charlotte:true, - onremove:true, - marktext:'灿', - intro:{content:'对$使用牌无距离和次数限制'}, - mod:{ - cardUsableTarget:function(card,player,target){ - if(player.getStorage('dcwencan_paoxiao').includes(target)) return true; + subSkill: { + paoxiao: { + charlotte: true, + onremove: true, + marktext: "灿", + intro: { content: "对$使用牌无距离和次数限制" }, + mod: { + cardUsableTarget: function (card, player, target) { + if (player.getStorage("dcwencan_paoxiao").includes(target)) return true; }, - targetInRange:function(card,player,target){ - if(player.getStorage('dcwencan_paoxiao').includes(target)) return true; + targetInRange: function (card, player, target) { + if (player.getStorage("dcwencan_paoxiao").includes(target)) return true; }, - } - } + }, + }, + }, + ai: { + order: 9, + result: { target: -1 }, }, - ai:{ - order:9, - result:{target:-1} - } }, //芮姬 - dcwangyuan:{ - audio:2, - trigger:{ - player:['loseAfter','logSkill'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + dcwangyuan: { + audio: 2, + trigger: { + player: ["loseAfter", "logSkill"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - frequent:true, - filter:function(event,player,name){ - if(player==_status.currentPhase) return (name=='logSkill'&&event.skill=='dcliying'&&player.getExpansions('dcwangyuan').length=game.countPlayer()) return false; - if(event.name=='gain'&&event.player==player) return false; - var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.length>0; + frequent: true, + filter: function (event, player, name) { + if (player == _status.currentPhase) + return ( + name == "logSkill" && + event.skill == "dcliying" && + player.getExpansions("dcwangyuan").length < game.countPlayer2() + ); + if (name == "logSkill") return false; + if (player.getExpansions("dcwangyuan").length >= game.countPlayer()) return false; + if (event.name == "gain" && event.player == player) return false; + var evt = event.getl(player); + return evt && evt.cards2 && evt.cards2.length > 0; }, - content:function(){ - 'step 0' - var cards=player.getExpansions('dcwangyuan'); - var card=get.cardPile2(cardx=>{ - var type=get.type2(cardx); - return (type=='basic'||type=='trick')&&!cards.some(cardxx=>get.name(cardx,false)==get.name(cardxx,false)); + content: function () { + "step 0"; + var cards = player.getExpansions("dcwangyuan"); + var card = get.cardPile2((cardx) => { + var type = get.type2(cardx); + return ( + (type == "basic" || type == "trick") && + !cards.some((cardxx) => get.name(cardx, false) == get.name(cardxx, false)) + ); }); - if(card) player.addToExpansion(card,'gain2').gaintag.add('dcwangyuan'); + if (card) player.addToExpansion(card, "gain2").gaintag.add("dcwangyuan"); }, - ai:{ - combo:'dclingyin' + ai: { + combo: "dclingyin", }, - marktext:'妄', - intro:{ - name:'妄(妄缘/铃音)', - content:'expansion', - markcount:'expansion', + marktext: "妄", + intro: { + name: "妄(妄缘/铃音)", + content: "expansion", + markcount: "expansion", }, }, - dclingyin:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - return player.getExpansions('dcwangyuan').length; + dclingyin: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.getExpansions("dcwangyuan").length; }, - direct:true, - content:function(){ - 'step 0' - var cards=player.getExpansions('dcwangyuan'); - player.chooseButton([ - get.prompt('dclingyin')+'(当前轮数:'+get.cnNumber(game.roundNumber,true)+')', - cards - ],[1,game.roundNumber]).set('ai',button=>{ - var color=_status.event.color,player=_status.event.player; - if(ui.selected.buttons.length>0&&ui.selected.buttons.length==player.getExpansions('dcwangyuan').length-1) return 0; - if(color==1) return get.value(button.link); - if(color) return get.color(button.link)==color?1:0; - return 0; - }).set('color',function(){ - var cardsR=cards.filter(i=>get.color(i)=='red'); - if(cardsR.length==cards.length||cardsR.length==0||cards.length<=game.roundNumber) return 1; - if(cardsR.length<=game.roundNumber) return 'red'; - if(cards.length-cardsR.length<=game.roundNumber) return 'black'; - return 1; - }()); - 'step 1' - if(result.bool){ - player.logSkill('dclingyin'); - var cards=result.links; - player.gain(cards,'gain2'); - var cardsx=player.getExpansions('dcwangyuan').removeArray(cards); - if(cardsx.length<=1||get.color(cardsx)!='none'){ - player.addTempSkill('dclingyin_effect'); - player.addMark('dclingyin_effect',1,false); - game.log(player,'获得了','#g【铃音】','的后续效果'); + direct: true, + content: function () { + "step 0"; + var cards = player.getExpansions("dcwangyuan"); + player + .chooseButton( + [ + get.prompt("dclingyin") + + "(当前轮数:" + + get.cnNumber(game.roundNumber, true) + + ")", + cards, + ], + [1, game.roundNumber] + ) + .set("ai", (button) => { + var color = _status.event.color, + player = _status.event.player; + if ( + ui.selected.buttons.length > 0 && + ui.selected.buttons.length == player.getExpansions("dcwangyuan").length - 1 + ) + return 0; + if (color == 1) return get.value(button.link); + if (color) return get.color(button.link) == color ? 1 : 0; + return 0; + }) + .set( + "color", + (function () { + var cardsR = cards.filter((i) => get.color(i) == "red"); + if ( + cardsR.length == cards.length || + cardsR.length == 0 || + cards.length <= game.roundNumber + ) + return 1; + if (cardsR.length <= game.roundNumber) return "red"; + if (cards.length - cardsR.length <= game.roundNumber) return "black"; + return 1; + })() + ); + ("step 1"); + if (result.bool) { + player.logSkill("dclingyin"); + var cards = result.links; + player.gain(cards, "gain2"); + var cardsx = player.getExpansions("dcwangyuan").removeArray(cards); + if (cardsx.length <= 1 || get.color(cardsx) != "none") { + player.addTempSkill("dclingyin_effect"); + player.addMark("dclingyin_effect", 1, false); + game.log(player, "获得了", "#g【铃音】", "的后续效果"); } } }, - ai:{ - combo:'dcwangyuan', - threaten:3, + ai: { + combo: "dcwangyuan", + threaten: 3, }, - subSkill:{ - effect:{ - audio:'dclingyin', - enable:'phaseUse', - trigger:{source:'damageBegin1'}, - viewAs:{name:'juedou'}, - charlotte:true, - forced:true, - onremove:true, - prompt:'将一张武器牌或防具牌当【决斗】使用', - filterCard:function(card){ - return get.subtype(card)=='equip1'||get.subtype(card)=='equip2'; + subSkill: { + effect: { + audio: "dclingyin", + enable: "phaseUse", + trigger: { source: "damageBegin1" }, + viewAs: { name: "juedou" }, + charlotte: true, + forced: true, + onremove: true, + prompt: "将一张武器牌或防具牌当【决斗】使用", + filterCard: function (card) { + return get.subtype(card) == "equip1" || get.subtype(card) == "equip2"; }, - position:'hes', - filter:function(event,player){ - if(event.name=='chooseToUse') return player.countCards('hes',{subtype:['equip1','equip2']})>0; - return event.player!=player; + position: "hes", + filter: function (event, player) { + if (event.name == "chooseToUse") + return player.countCards("hes", { subtype: ["equip1", "equip2"] }) > 0; + return event.player != player; }, - content:function(){ - trigger.num+=player.countMark('dclingyin_effect'); + content: function () { + trigger.num += player.countMark("dclingyin_effect"); }, - ai:{ - damageBonus:true, - } - } - } + ai: { + damageBonus: true, + }, + }, + }, }, - dcliying:{ - audio:2, - usable:1, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', + dcliying: { + audio: 2, + usable: 1, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - var cards=event.getg(player).filter(i=>get.owner(i)==player&&get.position(i)=='h'); - if(!cards.length) return false; - var evt=event.getParent('phaseDraw'); - if(evt&&evt.name=='phaseDraw') return false; + filter: function (event, player) { + var cards = event + .getg(player) + .filter((i) => get.owner(i) == player && get.position(i) == "h"); + if (!cards.length) return false; + var evt = event.getParent("phaseDraw"); + if (evt && evt.name == "phaseDraw") return false; return true; }, - direct:true, - content:function(){ - 'step 0' - var cards=trigger.getg(player).filter(i=>get.owner(i)==player&&get.position(i)=='h'); - player.chooseCardTarget({ - prompt:get.prompt('dcliying'), - prompt2:'选择本次获得的任意张牌交给一名其他角色,然后摸一张牌', - filterTarget:lib.filter.notMe, - filterCard:card=>_status.event.cards.includes(card), - cards:cards, - selectCard:[1,cards.length], - ai1:function(card){ - if(ui.selected.cards.length) return 0; - return 3/(Math.abs(get.value(card))+0.1) - }, - ai2:function(target){ - return get.value(ui.selected.cards,target)*get.attitude(_status.event.player,target); - }, - }).set('cards',cards); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcliying',target); - player.give(result.cards,target); + direct: true, + content: function () { + "step 0"; + var cards = trigger + .getg(player) + .filter((i) => get.owner(i) == player && get.position(i) == "h"); + player + .chooseCardTarget({ + prompt: get.prompt("dcliying"), + prompt2: "选择本次获得的任意张牌交给一名其他角色,然后摸一张牌", + filterTarget: lib.filter.notMe, + filterCard: (card) => _status.event.cards.includes(card), + cards: cards, + selectCard: [1, cards.length], + ai1: function (card) { + if (ui.selected.cards.length) return 0; + return 3 / (Math.abs(get.value(card)) + 0.1); + }, + ai2: function (target) { + return ( + get.value(ui.selected.cards, target) * + get.attitude(_status.event.player, target) + ); + }, + }) + .set("cards", cards); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcliying", target); + player.give(result.cards, target); player.draw(); //if(player!=_status.currentPhase) event.finish(); - } - else{ + } else { player.storage.counttrigger.dcliying--; event.finish(); - }/* + } /* 'step 2' var cards=player.getExpansions('dcwangyuan'); var card=get.cardPile2(cardx=>{ @@ -6241,4170 +8028,5079 @@ game.import('character', function () { return (type=='basic'||type=='trick')&&!cards.some(cardxx=>get.name(cardx,false)==get.name(cardxx,false)); }); if(card) player.addToExpansion(card,'gain2').gaintag.add('dcwangyuan');*/ - } + }, }, //谢灵毓 - dcyuandi:{ - audio:2, - init:()=>{ - game.addGlobalSkill('dcyuandi_ai'); + dcyuandi: { + audio: 2, + init: () => { + game.addGlobalSkill("dcyuandi_ai"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('dcyuandi'),true)) game.removeGlobalSkill('dcyuandi_ai'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("dcyuandi"), true)) + game.removeGlobalSkill("dcyuandi_ai"); }, - trigger:{global:'useCard'}, - filter:function(event,player){ - var evt=event.getParent('phaseUse'); - if(!evt||evt.player!=event.player) return false; - if(event.player==player||!event.targets||event.targets.length>1||event.targets[0]!=event.player) return false; - return event.player.getHistory('useCard',evtx=>{ - return evtx.getParent('phaseUse')==evt; - }).indexOf(event)==0; + trigger: { global: "useCard" }, + filter: function (event, player) { + var evt = event.getParent("phaseUse"); + if (!evt || evt.player != event.player) return false; + if ( + event.player == player || + !event.targets || + event.targets.length > 1 || + event.targets[0] != event.player + ) + return false; + return ( + event.player + .getHistory("useCard", (evtx) => { + return evtx.getParent("phaseUse") == evt; + }) + .indexOf(event) == 0 + ); }, - direct:true, - content:function(){ - 'step 0' - var target=trigger.player; - var name=get.translation(target); - var choices=['选项二']; - var choiceList=['弃置'+name+'一张手牌','你与'+name+'各摸一张牌']; - if(target.countDiscardableCards(player,'h')) choices.unshift('选项一'); - else choiceList[0]=''+choiceList[0]+''; - player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('ai',()=>{ - return _status.event.choice; - }).set('prompt',get.prompt('dcyuandi',trigger.player)).set('choice',function(){ - if(get.attitude(player,target)<0){ - if(choices.includes('选项一')) return '选项一'; - return 'cancel2'; - } - return '选项二'; - }()); - 'step 1' - if(result.control!='cancel2'){ - var target=trigger.player; - player.logSkill('dcyuandi',target); - if(result.control=='选项一'){ - player.discardPlayerCard(target,'h',true); - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.15); - } - else game.asyncDraw([target,player]); + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + var name = get.translation(target); + var choices = ["选项二"]; + var choiceList = ["弃置" + name + "一张手牌", "你与" + name + "各摸一张牌"]; + if (target.countDiscardableCards(player, "h")) choices.unshift("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set("prompt", get.prompt("dcyuandi", trigger.player)) + .set( + "choice", + (function () { + if (get.attitude(player, target) < 0) { + if (choices.includes("选项一")) return "选项一"; + return "cancel2"; + } + return "选项二"; + })() + ); + ("step 1"); + if (result.control != "cancel2") { + var target = trigger.player; + player.logSkill("dcyuandi", target); + if (result.control == "选项一") { + player.discardPlayerCard(target, "h", true); + if (get.mode() !== "identity" || player.identity !== "nei") + player.addExpose(0.15); + } else game.asyncDraw([target, player]); } }, - subSkill:{ - ai:{ - mod:{ - aiOrder:function(player,card,num){ - var info=get.info(card); - if(!info||!info.toself) return; - var evt=_status.event.getParent('phaseUse'); - if(!evt||evt.player!=player) return; - if(player.hasHistory('useCard',evtx=>evtx.getParent('phaseUse')==evt)) return; - if(game.hasPlayer(current=>{ - return current.hasSkill('dcyuandi')&&get.attitude(player,current)>=0; - })) return num+10; - return num/3; + subSkill: { + ai: { + mod: { + aiOrder: function (player, card, num) { + var info = get.info(card); + if (!info || !info.toself) return; + var evt = _status.event.getParent("phaseUse"); + if (!evt || evt.player != player) return; + if (player.hasHistory("useCard", (evtx) => evtx.getParent("phaseUse") == evt)) + return; + if ( + game.hasPlayer((current) => { + return ( + current.hasSkill("dcyuandi") && get.attitude(player, current) >= 0 + ); + }) + ) + return num + 10; + return num / 3; }, }, - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('dcyuandi'),true); + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("dcyuandi"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("dcyuandi_ai"); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('dcyuandi_ai'); - } }, - } - }, - dcxinyou:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h'){ - return evt.getParent(2)==event&&evt.cards.length>=3; - })) check|=1; - if(game.getGlobalHistory('changeHp',evt=>{ - return evt.getParent().name=='recover'&&evt.getParent(2)==event; - }).length) check|=2; - if(check>0){ - player.addTempSkill('dcxinyou_effect'); - player.storage.dcxinyou_effect=check; + ("step 1"); + var check = 0; + if ( + player.hasHistory("gain", (evt) => { + return evt.getParent(2) == event && evt.cards.length >= 3; + }) + ) + check |= 1; + if ( + game.getGlobalHistory("changeHp", (evt) => { + return evt.getParent().name == "recover" && evt.getParent(2) == event; + }).length + ) + check |= 2; + if (check > 0) { + player.addTempSkill("dcxinyou_effect"); + player.storage.dcxinyou_effect = check; } }, - ai:{ - order:1, - result:{player:1} + ai: { + order: 1, + result: { player: 1 }, }, - subSkill:{ - effect:{ - audio:'dcxinyou', - trigger:{player:'phaseJieshuBegin'}, - charlotte:true, - forced:true, - onremove:true, - filter:function(event,player){ + subSkill: { + effect: { + audio: "dcxinyou", + trigger: { player: "phaseJieshuBegin" }, + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { return player.storage.dcxinyou_effect; }, - content:function(){ - if((player.storage.dcxinyou_effect&1)>0) player.loseHp(); - if((player.storage.dcxinyou_effect&2)>0) player.chooseToDiscard('心幽:请弃置一张牌',1,true,'he'); - } - } - } + content: function () { + if ((player.storage.dcxinyou_effect & 1) > 0) player.loseHp(); + if ((player.storage.dcxinyou_effect & 2) > 0) + player.chooseToDiscard("心幽:请弃置一张牌", 1, true, "he"); + }, + }, + }, }, //笮融 - dccansi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - 'step 0' + dccansi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; player.recover(); - if(!game.hasPlayer(current=>current!=player)) event.finish(); - else player.chooseTarget('残肆:选择一名其他角色',true,lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - var list=['recover','sha','juedou','huogong']; - return list.reduce((p,c)=>{ - return p+get.effect(target,{name:c},player,player); - },0); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'fire'); + if (!game.hasPlayer((current) => current != player)) event.finish(); + else + player + .chooseTarget("残肆:选择一名其他角色", true, lib.filter.notMe) + .set("ai", (target) => { + var player = _status.event.player; + var list = ["recover", "sha", "juedou", "huogong"]; + return list.reduce((p, c) => { + return p + get.effect(target, { name: c }, player, player); + }, 0); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "fire"); target.recover(); - event.list=['sha','juedou','huogong']; - player.addTempSkill('dccansi_draw'); - player.storage.dccansi_draw=target; - } - else event.finish(); - 'step 2' - var card={name:event.list.shift(),isCard:true}; - if(target.isIn()&&player.canUse(card,target,false)) player.useCard(card,target,false); - if(event.list.length) event.redo(); - 'step 3' - player.removeSkill('dccansi_draw'); + event.list = ["sha", "juedou", "huogong"]; + player.addTempSkill("dccansi_draw"); + player.storage.dccansi_draw = target; + } else event.finish(); + ("step 2"); + var card = { name: event.list.shift(), isCard: true }; + if (target.isIn() && player.canUse(card, target, false)) + player.useCard(card, target, false); + if (event.list.length) event.redo(); + ("step 3"); + player.removeSkill("dccansi_draw"); }, - subSkill:{ - draw:{ - trigger:{global:'damageEnd'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return event.getParent(3).name=='dccansi'&&player.storage.dccansi_draw==event.player; + subSkill: { + draw: { + trigger: { global: "damageEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + event.getParent(3).name == "dccansi" && + player.storage.dccansi_draw == event.player + ); }, - content:function(){ - for(var i=0;i7; + dcfozong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return player.countCards("h") > 7; }, - forced:true, - direct:true, - intro:{ - markcount:'expansion', - content:'expansion', + forced: true, + direct: true, + intro: { + markcount: "expansion", + content: "expansion", }, - content:function(){ - 'step 0' - var num=player.countCards('h')-7; - player.chooseCard('佛宗:将'+get.cnNumber(num)+'张手牌置于武将上',true,num); - 'step 1' - if(result.bool){ - var cards=result.cards; - player.logSkill('dcfozong'); - player.addToExpansion(cards,player,'give').gaintag.add('dcfozong'); + content: function () { + "step 0"; + var num = player.countCards("h") - 7; + player.chooseCard("佛宗:将" + get.cnNumber(num) + "张手牌置于武将上", true, num); + ("step 1"); + if (result.bool) { + var cards = result.cards; + player.logSkill("dcfozong"); + player.addToExpansion(cards, player, "give").gaintag.add("dcfozong"); } - 'step 2' - var cards=player.getExpansions('dcfozong'); - if(cards.length<7) event.finish(); - else{ - event.targets=game.filterPlayer(i=>i!=player).sortBySeat(player); + ("step 2"); + var cards = player.getExpansions("dcfozong"); + if (cards.length < 7) event.finish(); + else { + event.targets = game.filterPlayer((i) => i != player).sortBySeat(player); game.delayx(); } - 'step 3' - var target=targets.shift(); - event.target=target; + ("step 3"); + var target = targets.shift(); + event.target = target; player.line(target); - var cards=player.getExpansions('dcfozong'); - if(!cards.length) event._result={bool:false}; - else target.chooseButton(['###佛宗###
    获得一张牌并令'+get.translation(player)+'回复1点体力,或点击“取消”令其失去1点体力
    ',cards]).set('ai',button=>{ - if(_status.event.refuse) return get.value(button.link)-7.5; - return get.value(button.link); - }).set('refuse',get.attitude(target,player)<1&&get.effect(player,{name:'losehp'},player,target)>0); - 'step 4' - if(result.bool){ - var card=result.links[0]; - target.gain(card,'give',player); + var cards = player.getExpansions("dcfozong"); + if (!cards.length) event._result = { bool: false }; + else + target + .chooseButton([ + '###佛宗###
    获得一张牌并令' + + get.translation(player) + + "回复1点体力,或点击“取消”令其失去1点体力
    ", + cards, + ]) + .set("ai", (button) => { + if (_status.event.refuse) return get.value(button.link) - 7.5; + return get.value(button.link); + }) + .set( + "refuse", + get.attitude(target, player) < 1 && + get.effect(player, { name: "losehp" }, player, target) > 0 + ); + ("step 4"); + if (result.bool) { + var card = result.links[0]; + target.gain(card, "give", player); player.recover(target); - } - else player.loseHp(); - 'step 5' - if(targets.length) event.goto(3); + } else player.loseHp(); + ("step 5"); + if (targets.length) event.goto(3); }, - ai:{halfneg:true} + ai: { halfneg: true }, }, //滕芳兰 - dcluochong:{ - audio:2, - trigger:{global:'roundStart'}, - filter:function(event,player){ - return game.hasPlayer(current=>current.countDiscardableCards(player,'hej')>0); + dcluochong: { + audio: 2, + trigger: { global: "roundStart" }, + filter: function (event, player) { + return game.hasPlayer((current) => current.countDiscardableCards(player, "hej") > 0); }, - direct:true, - async content(event,trigger,player){ - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); + direct: true, + async content(event, trigger, player) { + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); const lose_list = []; - let num = 4 - player.countMark('dcluochong'); - while (num>0) { - const result = await player.chooseTarget( - get.prompt('dcluochong'), - `弃置任意名角色区域内的累计至多${num}张牌`, - (card,player,target)=>{ - return target.hasCard(card => { - const discarded = _status.event.lose_list.find(item => item[0] == target); - if (discarded && discarded[1].includes(card)) return false; - return lib.filter.canBeDiscarded(card,player,target,'dcluochong'); - }, 'hej') - } - ).set('ai',target=>{ - const player = _status.event.player, discarded = _status.event.lose_list.find(item => item[0] == target); - if(discarded){ - if (target == player) return 0; - const num = discarded[1].length; - if (num > 1 && player.hp + player.hujia > 2) return 0; - } - if (target == player){ - if(ui.cardPile.childNodes.length > 80 && player.hasCard(card => get.value(card) < 8)) return 20; - return 0; - } - return get.effect(target, {name:'guohe_copy2'}, player, player); - }).set('lose_list',lose_list).forResult(); + let num = 4 - player.countMark("dcluochong"); + while (num > 0) { + const result = await player + .chooseTarget( + get.prompt("dcluochong"), + `弃置任意名角色区域内的累计至多${num}张牌`, + (card, player, target) => { + return target.hasCard((card) => { + const discarded = _status.event.lose_list.find( + (item) => item[0] == target + ); + if (discarded && discarded[1].includes(card)) return false; + return lib.filter.canBeDiscarded(card, player, target, "dcluochong"); + }, "hej"); + } + ) + .set("ai", (target) => { + const player = _status.event.player, + discarded = _status.event.lose_list.find((item) => item[0] == target); + if (discarded) { + if (target == player) return 0; + const num = discarded[1].length; + if (num > 1 && player.hp + player.hujia > 2) return 0; + } + if (target == player) { + if ( + ui.cardPile.childNodes.length > 80 && + player.hasCard((card) => get.value(card) < 8) + ) + return 20; + return 0; + } + return get.effect(target, { name: "guohe_copy2" }, player, player); + }) + .set("lose_list", lose_list) + .forResult(); if (result.bool) { const target = result.targets[0]; - const cards = await player.choosePlayerCard(target, true, 'hej', [1,num], `选择弃置${get.translation(target)}区域内的牌`).set('filterButton',(button) => { - const card = button.link, target = _status.event.target, player = get.player(); - const discarded = _status.event.lose_list.find(item => item[0] == target); - if (discarded && discarded[1].includes(card)) return false; - return lib.filter.canBeDiscarded(card, player, target,'dcluochong'); - }).set('lose_list',lose_list).set('ai', button => { - if (ui.selected.buttons.length>0) return false; - var val = get.buttonValue(button); - if (get.attitude(_status.event.player, _status.event.target) > 0) return -val; - return val; - }).forResultCards(); + const cards = await player + .choosePlayerCard( + target, + true, + "hej", + [1, num], + `选择弃置${get.translation(target)}区域内的牌` + ) + .set("filterButton", (button) => { + const card = button.link, + target = _status.event.target, + player = get.player(); + const discarded = _status.event.lose_list.find( + (item) => item[0] == target + ); + if (discarded && discarded[1].includes(card)) return false; + return lib.filter.canBeDiscarded(card, player, target, "dcluochong"); + }) + .set("lose_list", lose_list) + .set("ai", (button) => { + if (ui.selected.buttons.length > 0) return false; + var val = get.buttonValue(button); + if (get.attitude(_status.event.player, _status.event.target) > 0) + return -val; + return val; + }) + .forResultCards(); num -= cards.length; - const index = lose_list.find(item => item[0] == target); + const index = lose_list.find((item) => item[0] == target); if (!index) { lose_list.push([target, cards]); - } - else { + } else { index[1].addArray(cards); } - } - else { + } else { break; } } if (_status.connectMode) { - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - if (lose_list.length>0) { + if (lose_list.length > 0) { lib.tempSortSeat = trigger.player; - lose_list.sort((a,b)=>{ - return lib.sort.seat(a[0],b[0]); + lose_list.sort((a, b) => { + return lib.sort.seat(a[0], b[0]); }); delete lib.tempSortSeat; - player.logSkill('dcluochong',lose_list.map(i => i[0])); - if (lose_list.some(i => i[1].length > 2)) { - game.log(player,'可弃置牌数','#g-1'); - player.addMark('dcluochong',1,false); + player.logSkill( + "dcluochong", + lose_list.map((i) => i[0]) + ); + if (lose_list.some((i) => i[1].length > 2)) { + game.log(player, "可弃置牌数", "#g-1"); + player.addMark("dcluochong", 1, false); } - if (lose_list[0].length==1) { + if (lose_list[0].length == 1) { lose_list[0][0].discard(lose_list[0][1]); - } - else{ + } else { game.loseAsync({ - lose_list:lose_list, - discarder:player, - }).setContent('discardMultiple'); + lose_list: lose_list, + discarder: player, + }).setContent("discardMultiple"); } } }, - ai:{ - threaten:2.5, - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='delay'&¤t<0){ - var current=_status.currentPhase; - if(current.getSeatNum()>target.getSeatNum()) return 'zerotarget'; + ai: { + threaten: 2.5, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && current < 0) { + var current = _status.currentPhase; + if (current.getSeatNum() > target.getSeatNum()) return "zerotarget"; } }, }, }, }, - dcaichen:{ - audio:2, - init:function(player){ - game.addGlobalSkill('dcaichen_hit'); + dcaichen: { + audio: 2, + init: function (player) { + game.addGlobalSkill("dcaichen_hit"); }, - onremove:function(player){ - if(!game.hasPlayer(current=>current.hasSkill('dcaichen'),true)) game.removeGlobalSkill('dcaichen_hit'); + onremove: function (player) { + if (!game.hasPlayer((current) => current.hasSkill("dcaichen"), true)) + game.removeGlobalSkill("dcaichen_hit"); }, - trigger:{ - player:['loseAfter','phaseDiscardBefore'], - global:'loseAsyncAfter', - target:'useCardToTargeted' + trigger: { + player: ["loseAfter", "phaseDiscardBefore"], + global: "loseAsyncAfter", + target: "useCardToTargeted", }, - filter:function(event,player,name){ - if(event.name=='phaseDiscard') return ui.cardPile.childNodes.length>40; - if(name=='useCardToTargeted') return ui.cardPile.childNodes.length<40&&get.suit(event.card)=='spade'; - if(event.getParent().name!='dcluochong') return false; - if(event.name=='loseAsync'&&!event.getl(player).cards.length) return false; - return ui.cardPile.childNodes.length>80; + filter: function (event, player, name) { + if (event.name == "phaseDiscard") return ui.cardPile.childNodes.length > 40; + if (name == "useCardToTargeted") + return ui.cardPile.childNodes.length < 40 && get.suit(event.card) == "spade"; + if (event.getParent().name != "dcluochong") return false; + if (event.name == "loseAsync" && !event.getl(player).cards.length) return false; + return ui.cardPile.childNodes.length > 80; }, - forced:true, - content:function(){ - if(trigger.name.indexOf('lose')==0) player.draw(2); - else if(trigger.name=='phaseDiscard'){ + forced: true, + content: function () { + if (trigger.name.indexOf("lose") == 0) player.draw(2); + else if (trigger.name == "phaseDiscard") { trigger.cancel(); - game.log(player,'跳过了弃牌阶段'); - } - else{ + game.log(player, "跳过了弃牌阶段"); + } else { trigger.directHit.add(player); - game.log(player,'不可响应',trigger.card); + game.log(player, "不可响应", trigger.card); } }, - subSkill:{ - hit:{ - trigger:{player:'dieAfter'}, - filter:function(event,player){ - return !game.hasPlayer(current=>current.hasSkill('dcaichen'),true); + subSkill: { + hit: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer((current) => current.hasSkill("dcaichen"), true); }, - silent:true, - forceDie:true, - content:function(){ - game.removeGlobalSkill('dcaichen_hit'); + silent: true, + forceDie: true, + content: function () { + game.removeGlobalSkill("dcaichen_hit"); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg&&arg.card&&arg.target&&arg.target.hasSkill('dcaichen')&&ui.cardPile.childNodes.length<40&&get.suit(arg.card)==='spade'; - } - } - } - } + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + return ( + arg && + arg.card && + arg.target && + arg.target.hasSkill("dcaichen") && + ui.cardPile.childNodes.length < 40 && + get.suit(arg.card) === "spade" + ); + }, + }, + }, + }, }, //杨彪 - dczhaohan:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - frequent:true, - filter:function(event,player){ + dczhaohan: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + frequent: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=2; - trigger.dczhaohan=true; - player.addTempSkill('dczhaohan_choose','phaseDrawAfter'); + content: function () { + trigger.num += 2; + trigger.dczhaohan = true; + player.addTempSkill("dczhaohan_choose", "phaseDrawAfter"); }, - subSkill:{ - choose:{ - trigger:{player:'gainAfter'}, - filter:function(event,player){ - return event.getParent(2).dczhaohan&&player.countCards('h')>=2; + subSkill: { + choose: { + trigger: { player: "gainAfter" }, + filter: function (event, player) { + return event.getParent(2).dczhaohan && player.countCards("h") >= 2; }, - forced:true, - charlotte:true, - popup:false, - content:function(){ - 'step 0' - var choices=[],choiceList=[ - '将两张手牌交给一名没有手牌的角色', - '弃置两张手牌' - ]; - if(game.hasPlayer(current=>current.countCards('h')==0)) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - choices.push('选项二'); - if(choices.length==1) event._result={control:'选项二'}; - else player.chooseControl(choices).set('choiceList',choiceList).set('ai',()=>_status.event.choice).set('choice',function(){ - if(game.hasPlayer(current=>{ - return current.countCards('h')==0&&get.attitude(player,current)>0; - })) return '选项一'; - return '选项二'; - }()); - 'step 1' - if(result.control=='选项一'){ + forced: true, + charlotte: true, + popup: false, + content: function () { + "step 0"; + var choices = [], + choiceList = ["将两张手牌交给一名没有手牌的角色", "弃置两张手牌"]; + if (game.hasPlayer((current) => current.countCards("h") == 0)) + choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + choices.push("选项二"); + if (choices.length == 1) event._result = { control: "选项二" }; + else + player + .chooseControl(choices) + .set("choiceList", choiceList) + .set("ai", () => _status.event.choice) + .set( + "choice", + (function () { + if ( + game.hasPlayer((current) => { + return ( + current.countCards("h") == 0 && + get.attitude(player, current) > 0 + ); + }) + ) + return "选项一"; + return "选项二"; + })() + ); + ("step 1"); + if (result.control == "选项一") { player.chooseCardTarget({ - filterCard:true, - selectCard:2, - forced:true, - filterTarget:function(card,player,target){ - return !target.countCards('h'); + filterCard: true, + selectCard: 2, + forced: true, + filterTarget: function (card, player, target) { + return !target.countCards("h"); }, - ai1:function(card){ - return 7-get.value(card); + ai1: function (card) { + return 7 - get.value(card); }, - ai2:function(target){ - return get.attitude(_status.event.player,target); + ai2: function (target) { + return get.attitude(_status.event.player, target); }, - prompt:'将两张手牌交给一名没有手牌的角色' + prompt: "将两张手牌交给一名没有手牌的角色", }); - } - else{ - player.chooseToDiscard('昭汉:请弃置两张手牌',true,2); + } else { + player.chooseToDiscard("昭汉:请弃置两张手牌", true, 2); event.finish(); } - 'step 2' - if(result.bool){ - player.give(result.cards,result.targets[0]); + ("step 2"); + if (result.bool) { + player.give(result.cards, result.targets[0]); } - } - } - } + }, + }, + }, }, - dcjinjie:{ - audio:2, - trigger:{global:'dying'}, - hasPhase:function(player){ - var history=player.actionHistory; - for(var i=history.length-1;i>=0;i--){ - if(history[i].isMe) return true; - if(history[i].isRound) break; + dcjinjie: { + audio: 2, + trigger: { global: "dying" }, + hasPhase: function (player) { + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + if (history[i].isMe) return true; + if (history[i].isRound) break; } return false; }, - direct:true, - content:function(){ - 'step 0' - player.chooseBool(get.prompt('dcjinjie',trigger.player),'令其摸一张牌').set('ai',()=>{ - return get.attitude(_status.event.player,_status.event.getTrigger().player)>0; - }); - 'step 1' - if(result.bool){ - player.logSkill('dcjinjie',trigger.player); - trigger.player.draw(); - } - else event.finish(); - if(lib.skill.dcjinjie.hasPhase(player)) event.finish(); - 'step 2' - var num=0; - var history=player.actionHistory; - for(var i=history.length-1;i>=0;i--){ - for(var evt of history[i].useSkill){ - if(evt.skill=='dcjinjie') num++; - } - if(history[i].isRound) break; - } - if(num==0){ - player.chooseBool(get.prompt('dcjinjie',trigger.player),'令其回复1点体力').set('ai',()=>{ - var player=_status.event.player; - return get.effect(_status.event.getTrigger().player,{name:'tao'},player,player)>0; + direct: true, + content: function () { + "step 0"; + player + .chooseBool(get.prompt("dcjinjie", trigger.player), "令其摸一张牌") + .set("ai", () => { + return get.attitude(_status.event.player, _status.event.getTrigger().player) > 0; }); + ("step 1"); + if (result.bool) { + player.logSkill("dcjinjie", trigger.player); + trigger.player.draw(); + } else event.finish(); + if (lib.skill.dcjinjie.hasPhase(player)) event.finish(); + ("step 2"); + var num = 0; + var history = player.actionHistory; + for (var i = history.length - 1; i >= 0; i--) { + for (var evt of history[i].useSkill) { + if (evt.skill == "dcjinjie") num++; + } + if (history[i].isRound) break; } - else{ - player.chooseToDiscard(get.prompt('dcjinjie',trigger.player),'弃置'+get.cnNumber(num)+'张牌,令其回复1点体力','he',num).set('ai',card=>{ - if(_status.event.eff>0) return get.value({name:'tao'})-get.value(card); - return 0; - }).set('eff',get.effect(trigger.player,{name:'tao'},player,player)); + if (num == 0) { + player + .chooseBool(get.prompt("dcjinjie", trigger.player), "令其回复1点体力") + .set("ai", () => { + var player = _status.event.player; + return ( + get.effect( + _status.event.getTrigger().player, + { name: "tao" }, + player, + player + ) > 0 + ); + }); + } else { + player + .chooseToDiscard( + get.prompt("dcjinjie", trigger.player), + "弃置" + get.cnNumber(num) + "张牌,令其回复1点体力", + "he", + num + ) + .set("ai", (card) => { + if (_status.event.eff > 0) + return get.value({ name: "tao" }) - get.value(card); + return 0; + }) + .set("eff", get.effect(trigger.player, { name: "tao" }, player, player)); } - 'step 3' - if(result.bool){ - player.line(trigger.player,'green'); + ("step 3"); + if (result.bool) { + player.line(trigger.player, "green"); trigger.player.recover(); } }, }, - dcjue:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(current=>(current.getHp()>player.getHp()||current.countCards('h')>player.countCards('h'))&&player.canUse('sha',current,false)); + dcjue: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer( + (current) => + (current.getHp() > player.getHp() || + current.countCards("h") > player.countCards("h")) && + player.canUse("sha", current, false) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('dcjue'),'视为对一名体力值或手牌数大于你的角色使用一张【杀】',(card,player,target)=>{ - return player.canUse('sha',target,false)&&(target.getHp()>player.getHp()||target.countCards('h')>player.countCards('h')); - }).set('ai',target=>{ - return get.effect(target,{name:'sha'},_status.event.player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcjue',target); - player.useCard({name:'sha',isCard:true},target,false); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("dcjue"), + "视为对一名体力值或手牌数大于你的角色使用一张【杀】", + (card, player, target) => { + return ( + player.canUse("sha", target, false) && + (target.getHp() > player.getHp() || + target.countCards("h") > player.countCards("h")) + ); + } + ) + .set("ai", (target) => { + return get.effect(target, { name: "sha" }, _status.event.player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcjue", target); + player.useCard({ name: "sha", isCard: true }, target, false); } }, }, //杨弘 - dcjianji:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.getAttackRange()>=1; + dcjianji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.getAttackRange() >= 1; }, - selectTarget:function(){ - return [1,_status.event.player.getAttackRange()]; + selectTarget: function () { + return [1, _status.event.player.getAttackRange()]; }, - complexSelect:true, - complexTarget:true, - filterTarget:function(card,player,target){ - var selected=ui.selected.targets; - if(!selected.length) return true; - for(var i of selected){ - if(i.getNext()==target||i.getPrevious()==target) return true; + complexSelect: true, + complexTarget: true, + filterTarget: function (card, player, target) { + var selected = ui.selected.targets; + if (!selected.length) return true; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; } return false; }, - contentBefore:function(){ - event.getParent()._dcjianji_discarded=[]; + contentBefore: function () { + event.getParent()._dcjianji_discarded = []; }, - content:function(){ - 'step 0' - if(target.countCards('he')>0) target.chooseToDiscard(true,'he'); + content: function () { + "step 0"; + if (target.countCards("he") > 0) target.chooseToDiscard(true, "he"); else event.finish(); - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { event.getParent()._dcjianji_discarded.push(target); } }, - contentAfter:function(){ - 'step 0' - var list=targets.filter(target=>{ - var num=target.countCards('h'); - return targets.every(targetx=>{ - return targetx.countCards('h')<=num; + contentAfter: function () { + "step 0"; + var list = targets.filter((target) => { + var num = target.countCards("h"); + return targets.every((targetx) => { + return targetx.countCards("h") <= num; }); }); - if(list.length){ - event.list=list; - event.current=event.list.shift(); + if (list.length) { + event.list = list; + event.current = event.list.shift(); event.getParent()._dcjianji_discarded.remove(player); - event.targets=event.getParent()._dcjianji_discarded; - } - else event.finish(); - 'step 1' - var targets=event.targets.slice(); + event.targets = event.getParent()._dcjianji_discarded; + } else event.finish(); + ("step 1"); + var targets = event.targets.slice(); targets.remove(event.current); - if(!targets.length) event._result={bool:false}; - else event.current.chooseTarget('间计:是否视为对除'+get.translation(player)+'外的弃置过牌的一名角色使用一张杀?',(card,player,target)=>{ - return _status.event.targets.includes(target)&&player.canUse('sha',target,false); - }).set('targets',event.targets).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,{name:'sha'},player,player); - }); - 'step 2' - if(result.bool){ - event.current.useCard({name:'sha',isCard:true},result.targets,false); + if (!targets.length) event._result = { bool: false }; + else + event.current + .chooseTarget( + "间计:是否视为对除" + + get.translation(player) + + "外的弃置过牌的一名角色使用一张杀?", + (card, player, target) => { + return ( + _status.event.targets.includes(target) && + player.canUse("sha", target, false) + ); + } + ) + .set("targets", event.targets) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, { name: "sha" }, player, player); + }); + ("step 2"); + if (result.bool) { + event.current.useCard({ name: "sha", isCard: true }, result.targets, false); } - 'step 3' - if(event.list.length){ - event.current=event.list.shift(); + ("step 3"); + if (event.list.length) { + event.current = event.list.shift(); event.goto(1); } }, - ai:{ - order:7, - result:{ - target:function(player,target){ - var eff=get.effect(target,{name:'guohe_copy2'},player,target)/2; - if(ui.selected.targets.length&&eff<0){ - var len=target.countCards('h'); - if(ui.selected.targets.every(i=>{ - return i.countCards('h'){ - return get.effect(i,{name:'sha'},target,player)>0; - })) return 0.1; + ai: { + order: 7, + result: { + target: function (player, target) { + var eff = get.effect(target, { name: "guohe_copy2" }, player, target) / 2; + if (ui.selected.targets.length && eff < 0) { + var len = target.countCards("h"); + if ( + ui.selected.targets.every((i) => { + return i.countCards("h") < len + 1; + }) && + ui.selected.targets.some((i) => { + return get.effect(i, { name: "sha" }, target, player) > 0; + }) + ) + return 0.1; } - return ui.selected.targets.reduce((p,c)=>p+get.effect(c,{name:'guohe_copy2'},player,c)/2,0)+eff; - } - } - }, - }, - dcyuanmo:{ - audio:2, - trigger:{player:['damageEnd','phaseZhunbeiBegin']}, - direct:true, - group:'dcyuanmo_add', - init:function(player){player.storage.dcyuanmo_range=0}, - change:function(player,num){ - player.addSkill('dcyuanmo_range'); - if(typeof player.storage.dcyuanmo_range!=='number') player.storage.dcyuanmo_range=0; - if(!num) return; - player.storage.dcyuanmo_range+=num; - if(player.storage.dcyuanmo_range!=0) player.markSkill('dcyuanmo_range'); - else player.unmarkSkill('dcyuanmo_range'); - game.log(player,'的攻击范围',(num>0?'+':'')+num); - }, - content:function(){ - 'step 0' - event.targets=game.filterPlayer(current=>player.inRange(current)); - var choiceList=['攻击范围+1。然后若你攻击范围内的角色数因此增加,你可以获得其中任意名角色的一张牌','攻击范围-1。然后你摸两张牌']; - player.chooseControl('cancel2').set('prompt',get.prompt('dcyuanmo')).set('choiceList',choiceList).set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - if(trigger.name=='phaseZhunbei'&&player.getAttackRange()==1&&!player.hasCard(card=>{ - if(get.subtype(card)!='equip1'&&!player.hasUseTarget(card)) return false; - var num=1; - var info=get.info(card,false); - if(info&&info.distance&&typeof info.distance.attackFrom=='number') num-=info.distance.attackFrom; - return num>1; - },'hs')) return '选项一'; - var targets=event.targets.slice(),targetsx=[]; - var _tmp=player.storage.dcyuanmo_range; - player.storage.dcyuanmo_range++; - try{ - targetsx=game.filterPlayer(current=>player.inRange(current)); - } - catch(e){ - player.storage.dcyuanmo_range=_tmp - } - player.storage.dcyuanmo_range=_tmp; - targetsx.removeArray(targets); - return targetsx.reduce((p,c)=>{ - return p+Math.max(0,get.effect(c,{name:'shunshou_copy2'},player,player)); - },0)>get.effect(player,{name:'draw'},player,player)*1.3?'选项一':'选项二'; - }()); - 'step 1' - if(result.control=='cancel2'){ - event.finish(); return; - } - player.logSkill('dcyuanmo'); - if(result.control=='选项一'){ - lib.skill.dcyuanmo.change(player,1); - var targetsx=game.filterPlayer(current=>player.inRange(current)); - if(targetsx.length<=targets.length){ - event.finish(); - } - else event.targets=targetsx.removeArray(targets); - } - else{ - lib.skill.dcyuanmo.change(player,-1); - player.draw(2); - event.finish(); - } - 'step 2' - player.chooseTarget('远谟:获得任意名本次进入你攻击范围的角色的一张牌',[1,targets.length],(card,player,target)=>{ - return _status.event.getParent().targets.includes(target)&&target.countGainableCards(player,'he')>0; - }).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,{name:'shunshou_copy2'},player,player); - }); - 'step 3' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.line(targets); - for(var target of targets){ - player.gainPlayerCard(target,'he',true); - } - } - }, - subSkill:{ - add:{ - audio:'dcyuanmo', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return !game.hasPlayer(current=>player.inRange(current)); - }, - prompt2:'令你的攻击范围+1', - check:()=>true, - content:function(){ - lib.skill.dcyuanmo.change(player,1); - }, - }, - range:{ - charlotte:true, - intro:{ - content:function(storage,player){ - var num=player.storage.dcyuanmo_range; - return '攻击范围'+(num>=0?'+':'')+num; - } - }, - mod:{ - attackRange:function(player,num){ - return num+player.countMark('dcyuanmo_range'); - }, - }, - } - }, - }, - //薛灵芸 - dcxialei:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['cardsDiscardAfter','loseAsyncAfter','equipAfter'], - }, - filter:function(event,player){ - if(player.countMark('dcxialei_clear')>=3) return false; - if(event.name!='cardsDiscard'){ - return event.getd(player,'cards2').some(i=>get.color(i,player)=='red'); - } - else{ - if(!event.cards.filterInD('d').some(i=>get.color(i,player)=='red')) return false; - var evt=event.getParent(); - if(evt.name!='orderingDiscard') return false; - var evtx=(evt.relatedEvent||evt.getParent()); - if(evtx.player!=player) return false; - return player.hasHistory('lose',evtxx=>{ - return evtx==(evtxx.relatedEvent||evtxx.getParent())&&evtxx.cards2.length>0; - }); - } - }, - content:function(){ - 'step 0' - var cards=get.cards(3-player.countMark('dcxialei_clear')); - event.cards=cards; - game.cardsGotoOrdering(cards); - if(cards.length==1) event._result={bool:true,links:cards}; - else player.chooseButton(['霞泪:获得其中的一张牌',cards],true); - 'step 1' - if(result.bool){ - var card=result.links[0]; - player.gain(card,'gain2'); - event.cards.remove(card); - if(event.cards.length){ - player.chooseBool().set('createDialog',['是否将剩余牌置于牌堆底?',event.cards]).set('ai',()=>_status.event.bool).set('bool',function(){ - if(!player.hasSkill('dcanzhi')) return Math.random()<0.5; - if(player.hasSkill('dcanzhi_blocker')){ - var next=_status.currentPhase.getNext(); - var judges=next.getCards('j'); - var val=0; - if(judges.length&&!next.hasWuxie()){ - var att=get.attitude(player,next); - for(var i=0;;i++){ - var judge=judges[i]&&get.judge(judges[i]),card=event.cards[i]; - if(!judge||!card) break; - val+=judge(card)*att; - i++; - } - } - if(val>0) return false; - else if(val==0) return Math.random()<0.5; - return true; - } - var card=event.cards[0]; - if(get.color(card,player)=='red'&&player.isPhaseUsing()&&player.countCards('hs',card=>{ - return get.color(card)=='red'&&player.hasValueTarget(card)&&['basic','trick'].includes(get.type(card)); - })>0) return false; - if(get.color(card,player)=='black') return false; - return true; - }()); - } - else event.goto(3); - } else event.finish(); - 'step 2' - if(result.bool){ - player.popup('牌堆底'); - game.log(player,'将'+get.cnNumber(event.cards.length)+'张牌置于了牌堆底'); - } - else player.popup('牌堆顶'); - while(cards.length){ - var card=cards.pop(); - card.fix(); - if(result.bool) ui.cardPile.appendChild(card); - else ui.cardPile.insertBefore(card,ui.cardPile.firstChild); - } - game.updateRoundNumber(); - 'step 3' - player.addMark('dcxialei_clear',1,false); - player.addTempSkill('dcxialei_clear'); - }, - subSkill:{clear:{onremove:true}} - }, - dcanzhi:{ - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('dcanzhi_blocker'); - }, - group:'dcanzhi_damage', - content:function(){ - 'step 0' - player.judge(result=>{ - if(get.color(result)=='red') return _status.event.getParent().player.countMark('dcxialei_clear')/2; - return 2; - }).judge2=result=>result.bool; - 'step 1' - if(result.color=='red'){ - player.removeSkill('dcxialei_clear'); - event.finish(); - } - else if(result.color=='black'){ - player.addTempSkill('dcanzhi_blocker'); - player.chooseTarget('暗织:是否令一名非当前回合角色获得本回合进入弃牌堆的两张牌?',(card,player,target)=>{ - return target!=_status.currentPhase; - }).set('ai',target=>{ - return get.effect(target,{name:'wuzhong'},_status.event.player); - }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target); - var cards=[]; - game.getGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ - cards.addArray(evt.cards.filterInD('d')); - } - }); - if(cards.length){ - player.chooseButton(['暗织:选择令'+get.translation(target)+'获得的牌',cards],true,Math.min(cards.length,2)).set('ai',button=>{ - var player=_status.event.player,target=_status.event.getParent().target; - return get.sgnAttitude(player,target)*get.value(button.link,target); - }); - } - }else event.finish(); - 'step 3' - if(result.bool){ - target.gain(result.links,'gain2'); - } - }, - ai:{ - combo:'dcxialei', - order:function(item,player){ - if(player.countMark('dcxialei_clear')>=2) return 10; - if(player.hasHistory('useSkill',evt=>evt.skill=='dcxialei')&&get.color(ui.cardPile.firstChild,player)=='red'&&player.countMark('dcxialei_clear')>0) return 9; - return 1; - }, - result:{ - player:function(player){ - return 1; - } - } - }, - subSkill:{ - damage:{ - audio:'dcanzhi', - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return !player.hasSkill('dcanzhi_blocker'); - }, - check:function(event,player){ - return game.hasPlayer(current=>{ - return get.attitude(player,current)>0&¤t!=_status.currentPhase; - }); - }, - prompt2:'你判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。', - content:function(){ - event.setContent(lib.skill.dcanzhi.content); - event.goto(0); - } - }, - blocker:{charlotte:true} - } - }, - //十周年王允 - dclianji:{ - enable:'phaseUse', - audio:'wylianji', - usable:1, - check:function(card){ - return 5-get.value(card); - }, - filterTarget:function(card,player,target){ - return target!=player; - }, - filterCard:true, - content:function(){ - 'step 0' - var card=get.cardPile2(function(card){ - return get.subtype(card)=='equip1'&&targets[0].hasUseTarget(card); - }); - if(card){ - if(card.name=='qinggang'&&!lib.inpile.includes('qibaodao')){ - card.remove(); - card=game.createCard('qibaodao',card.suit,card.number); - } - targets[0].chooseUseTarget(card,true,'nopopup','nothrow'); - } - else{ - player.chat('没有装备牌了吗'); - game.log('但是牌堆里已经没有装备牌了!'); - } - 'step 1' - game.updateRoundNumber(); - targets[0].chooseToUse(get.translation(player)+'对你发动了【连计】', - {name:'sha'}).set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target==_status.event.source) return false; - return lib.filter.filterTarget.apply(this,arguments); - }).set('addCount',false).set('source',player).set('prompt2','对除'+get.translation(player)+'外的一名角色使用一张【杀】,并将装备区内的武器牌交给其中一名目标角色;或点击“取消”,令'+get.translation(player)+'视为对你使用一张【杀】,并获得你装备区内的武器牌'); - 'step 2' - var card=targets[0].getEquips(1); - if(result.bool){ - player.addSkill('dclianji_1'); - if(card.length&&result.targets.filter(target=>target.isIn()).length>0){ - event.card=card; - targets[0].chooseTarget(true,'将'+get.translation(card)+'交给一名目标角色',(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - var card=_status.event.getParent().card[0]; - return (target.hasSkillTag('nogain')?0:get.attitude(_status.event.player,target))*Math.max(0.1,target.getUseValue(card)); - }).set('targets',result.targets); - } else event.finish(); - } - else{ - player.addSkill('dclianji_2'); - event.goto(4); - } - 'step 3' - targets[0].give(card,result.targets[0],'give'); - event.finish(); - 'step 4' - player.useCard({name:'sha',isCard:true},targets[0],false); - 'step 5' - var card=targets[0].getEquips(1); - if(card.length) targets[0].give(card,player,'give'); - }, - ai:{ - order:4, - result:{ - target:function(player,target){ - if(game.countPlayer()==2) return -3; - if(!target.getEquip(1)){ - if(game.hasPlayer(function(current){ - return current!=target&&!current.hasSkillTag('nogain')&&get.attitude(current,target)>0; - })) return 3; - return -3; - } - if(!game.hasPlayer(function(current){ - return current!=target&&!current.hasSkillTag('nogain')&&get.attitude(current,target)>0; - })) return -6; - return 4-get.value(target.getEquip(1)); + return ( + ui.selected.targets.reduce( + (p, c) => p + get.effect(c, { name: "guohe_copy2" }, player, c) / 2, + 0 + ) + eff + ); }, }, }, - subSkill:{ - 1:{charlotte:true,onremove:true}, - 2:{charlotte:true,onremove:true}, - } }, - dcmoucheng:{ - trigger:{player:'phaseZhunbeiBegin'}, - audio:'moucheng', - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'gray', - derivation:'xinjingong', - unique:true, - filter:function(event,player){ - return player.hasSkill('dclianji_1')&&player.hasSkill('dclianji_2'); + dcyuanmo: { + audio: 2, + trigger: { player: ["damageEnd", "phaseZhunbeiBegin"] }, + direct: true, + group: "dcyuanmo_add", + init: function (player) { + player.storage.dcyuanmo_range = 0; }, - content:function(){ - player.awakenSkill('dcmoucheng'); - player.changeSkills(['xinjingong'],['dclianji']); + change: function (player, num) { + player.addSkill("dcyuanmo_range"); + if (typeof player.storage.dcyuanmo_range !== "number") player.storage.dcyuanmo_range = 0; + if (!num) return; + player.storage.dcyuanmo_range += num; + if (player.storage.dcyuanmo_range != 0) player.markSkill("dcyuanmo_range"); + else player.unmarkSkill("dcyuanmo_range"); + game.log(player, "的攻击范围", (num > 0 ? "+" : "") + num); }, - }, - //周宣 - dcwumei:{ - audio:2, - trigger:{player:'phaseBeginStart'}, - filter:function(event,player){ - return !player.hasSkill('dcwumei_used'); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('dcwumei')).set('ai',target=>{ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcwumei',target); - player.addTempSkill('dcwumei_used','roundStart'); - target.insertPhase(); - target.addTempSkill('dcwumei_wake','phaseAfter'); - var targets=game.filterPlayer(); - if(!target.storage.dcwumei_wake) target.storage.dcwumei_wake=[[],[]]; - for(var targetx of targets){ - target.storage.dcwumei_wake[0].push(targetx); - target.storage.dcwumei_wake[1].push(targetx.hp); - } - target.markSkill('dcwumei_wake'); - if(!trigger._finished){ - trigger.finish(); - trigger.untrigger(true); - trigger._triggered=5; - game.players.slice().concat(game.dead).forEach(current=>{ - current.getHistory().isSkipped=true; - current.getStat().isSkipped=true; - }); - var evt=player.insertPhase(); - delete evt.skill; - game.broadcastAll(function(player){ - player.classList.remove('glow_phase'); - delete _status.currentPhase; - },player); - } - } - }, - subSkill:{ - used:{charlotte:true}, - wake:{ - init:function(player){ - game.addGlobalSkill('dcwumei_all'); - }, - onremove:function(player){ - game.removeGlobalSkill('dcwumei_all'); - delete player.storage.dcwumei_wake; - }, - trigger:{player:'phaseJieshuBegin'}, - charlotte:true, - popup:false, - forced:true, - filter:function(event,player){ - return player.storage.dcwumei_wake&&player.storage.dcwumei_wake.length; - }, - content:function(){ - var storage=player.storage.dcwumei_wake; - for(var i=0;i'; - str+='
  • '+str2; - } - return str; - } - } - }, - all:{ - trigger:{player:'dieAfter'}, - filter:function(event,player){ - return !game.hasPlayer(current=>current.hasSkill('dcwumei_wake'),true); - }, - silent:true, - forceDie:true, - content:function(){ - game.removeGlobalSkill('dcwumei_all'); - }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(get.tag(card,'recover')&&target.hp>0) return 0; - if(get.tag(card,'damage')) return 0.5; - } - } - } - } - } - }, - dczhanmeng:{ - audio:2, - trigger:{player:'useCard'}, - filter(event,player){ - return !player.hasSkill('dczhanmeng_choice1')||!player.hasSkill('dczhanmeng_choice2')|| - !player.hasSkill('dczhanmeng_choice0')&&!game.hasPlayer2(current=>{ - const history=current.actionHistory; - if(history.length<2) return false; - for(let i=history.length-2;i>=0;i--){ - if(history[i].isSkipped) continue; - const list=history[i].useCard.map(evt=>evt.card.name); - return list.includes(event.card.name); - } - return false; - },true); - }, - direct:true, - content(){ - 'step 0' - var list=[]; - var choiceList=[ - '上回合若没有同名牌被使用过,你获得一张非伤害牌', - '下回合当同名牌首次被使用后,你获得一张伤害牌', - '令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害' + content: function () { + "step 0"; + event.targets = game.filterPlayer((current) => player.inRange(current)); + var choiceList = [ + "攻击范围+1。然后若你攻击范围内的角色数因此增加,你可以获得其中任意名角色的一张牌", + "攻击范围-1。然后你摸两张牌", ]; - var used=game.hasPlayer2(current=>{ - var history=current.actionHistory; - if(history.length<2) return false; - for(let i=history.length-2;i>=0;i--){ - if(history[i].isSkipped) continue; - const list=history[i].useCard.map(evt=>evt.card.name); - return list.includes(trigger.card.name); - } - return false; - },true); - if(!player.hasSkill('dczhanmeng_choice0')&&!used) list.push('选项一'); - else choiceList[0]=''+choiceList[0]+(used?'(同名牌被使用过)':'(已选择)')+''; - if(!player.hasSkill('dczhanmeng_choice1')) list.push('选项二'); - else choiceList[1]=''+choiceList[1]+'(已选择)'; - var other=game.hasPlayer(current=>current!=player); - if(!player.hasSkill('dczhanmeng_choice2')&&other) list.push('选项三'); - else choiceList[2]=''+choiceList[2]+(!other?'(没人啦)':'(已选择)')+''; - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt('dczhanmeng')).set('ai',()=>{ - var choices=_status.event.controls.slice().remove('cancel2'); - var player=_status.event.player,evt=_status.event.getTrigger(); - if(!game.hasPlayer(current=>get.attitude(player,current)<0)) choices.remove('选项三'); - else if(choices.includes('选项三')) return '选项三'; - if(choices.includes('选项二')){ - if(evt.card.name=='sha') return '选项二'; - if(get.type(evt.card,null,false)=='equip') choices.remove('选项二'); - } - if(!choices.length) return 'cancel2'; - return choices.randomGet(); - }).set('choiceList',choiceList); - 'step 1' - if(result.control=='cancel2'){event.finish();return;} - if(result.control=='选项一'){ - player.logSkill('dczhanmeng'); - game.log(player,'选择了','#y'+result.control); - player.addTempSkill('dczhanmeng_choice0'); - var card=get.cardPile2(card=>{ - return !get.tag(card,'damage'); - }); - if(card) player.gain(card,'gain2'); - event.finish(); - } - else if(result.control=='选项二'){ - player.logSkill('dczhanmeng'); - game.log(player,'选择了','#y'+result.control); - player.addTempSkill('dczhanmeng_choice1'); - trigger['dczhanmeng_'+player.playerid]=true; - player.addSkill('dczhanmeng_delay'); - event.finish(); - } - else{ - player.addTempSkill('dczhanmeng_choice2'); - player.chooseTarget('占梦:令一名其他角色弃置两张牌',lib.filter.notMe,true).set('ai',target=>{ - var player=_status.event.player; - var eff1=get.effect(target,{name:'guohe_copy2'},player,player)+0.1; - var eff2=get.damageEffect(target,player,player,'fire')+0.1; - if(eff1<0&&eff2<0) return -eff1*eff2; - return eff1*eff2; - }); - } - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('dczhanmeng',target); - game.log(player,'选择了','#y选项三'); - target.chooseToDiscard(2,'he',true); - } else event.finish(); - 'step 3' - if(result.bool){ - var cards=result.cards; - var num=0; - for(var card of cards){ - num+=get.number(card,false); - } - if(num>10){ - player.line(target,'fire'); - target.damage('fire'); - } - } - }, - ai:{threaten:8}, - subSkill:{ - delay:{ - trigger:{global:['useCardAfter','phaseBeginStart']}, - charlotte:true, - forced:true, - popup:false, - silent:true, - filter(event,player,name){ - var history=player.actionHistory; - if(history.length<2) return false; - var list=history[history.length-2].useCard; - if(name=='phaseBeginStart'){ - return !list.some(evt=>evt['dczhanmeng_'+player.playerid]); - } - for(var evt of list){ - if(evt['dczhanmeng_'+player.playerid]&&event.card.name==evt.card.name&&game.getGlobalHistory('useCard',evtx=>{ - return evtx.card.name==event.card.name; - }).indexOf(event)==0) return true; - } - return false; - }, - content(){ - if(event.triggername!='phaseBeginStart'){ - player.logSkill('dczhanmeng_delay'); - var card=get.cardPile2(card=>{ - return get.tag(card,'damage'); - }); - if(card) player.gain(card,'gain2'); - } - else player.removeSkill('dczhanmeng_delay'); - } - }, - choice0:{charlotte:true}, - choice1:{charlotte:true}, - choice2:{charlotte:true}, - } - }, - //程秉 - dcjingzao:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - if(3+player.countMark('dcjingzao_add')-player.countMark('dcjingzao_ban')<=0) return false; - return game.hasPlayer(current=>lib.skill.dcjingzao.filterTarget(null,player,current)); - }, - filterTarget:function(card,player,target){ - return player!=target&&!target.hasSkill('dcjingzao_temp'); - }, - content:function(){ - 'step 0' - target.addTempSkill('dcjingzao_temp'); - var cards=game.cardsGotoOrdering(get.cards(3+player.countMark('dcjingzao_add')-player.countMark('dcjingzao_ban'))).cards; - event.cards=cards; - game.log(player,'亮出了',event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,target,id,cards){ - var str=get.translation(player)+'对'+(target==game.me?'你':get.translation(target))+'发动了【经造】'; - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,target,event.videoId,event.cards); - game.addVideo('showCards',player,[get.translation(player)+'发动了【经造】',get.cardsInfo(event.cards)]); - game.delay(cards.length-1); - 'step 1' - target.chooseToDiscard('he').set('prompt',false).set('filterCard',card=>{ - var names=_status.event.getParent().cards.map(i=>i.name); - return names.includes(get.name(card)); - }).set('ai',card=>{ - var target=_status.event.player,player=_status.event.getParent().player; - var att=get.attitude(target,player),val=get.value(card); - if(!lib.skill.dcjingzao.filter(null,player)){ - if(att>0) return 0; - return 6-val; - } - else{ - if(att>0) return 4-val; - return 0; - } - }); - var update=function(id,source){ - var dialog=get.idDialog(id); - if(dialog){ - var div=ui.create.div('',dialog.content,1); - var name=get.translation(source); - div.innerHTML='弃置一张满足条件的牌,然后'+name+'〖经造〗本回合亮出牌数+1;或点“取消”令'+name+'随机获得每种牌名的牌各一张,且〖经造〗本回合失效'; - ui.update(); - } - }; - if(target==game.me) update(event.videoId,player); - else if(target.isOnline()) target.send(update,event.videoId,player); - 'step 2' - game.broadcastAll('closeDialog',event.videoId); - if(result.bool){ - player.addTempSkill('dcjingzao_add'); - player.addMark('dcjingzao_add',1,false); - } - else{ - var cards=cards.randomSort(),cards2=[]; - for(var card of cards){ - if(!cards2.map(i=>i.name).includes(card.name)) cards2.push(card); - } - if(cards2.length) player.gain(cards2,'gain2'); - player.addTempSkill('dcjingzao_ban'); - player.addMark('dcjingzao_ban',cards2.length,false); - } - }, - ai:{ - order:7, - result:{ - player:1, - } - }, - subSkill:{ - add:{charlotte:true,onremove:true}, - ban:{charlotte:true,onremove:true}, - temp:{charlotte:true} - } - }, - dcenyu:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - return event.player!=player&&game.hasPlayer2(current=>{ - return current.hasHistory('useCard',evt=>{ - return evt.card.name==event.card.name&&evt!=event.getParent()&&evt.targets&&evt.targets.includes(player); - }); - })&&(event.card.name=='sha'||get.type(event.card)=='trick'); - }, - content:function(){ - trigger.getParent().excluded.add(player); - }, - ai:{ - effect:{ - target:(card,player,target)=>{ - if(player===target) return; - if(game.hasPlayer2(current=>{ - return current.hasHistory('useCard',evt=>evt.card.name==card.name&&evt.targets&&evt.targets.includes(target)); - })&&(card.name=='sha'||get.type(card)=='trick')) return 'zeroplayertarget'; - } - } - } - }, - //董贵人 - dclianzhi:{ - audio:2, - trigger:{player:'dying'}, - usable:1, - forced:true, - locked:false, - derivation:'dcshouze', - group:['dclianzhi_connect','dclianzhi_reproach'], - filter:function(event,player){ - return player.getStorage('dclianzhi').filter(i=>i&&i.isIn()).length; - }, - content:function(){ - player.recover(); - game.asyncDraw([player].concat(player.getStorage('dclianzhi').filter(i=>i&&i.isIn())).sortBySeat()); - }, - ai:{ - threaten:0.6, - }, - subSkill:{ - connect:{ - audio:'dclianzhi', - trigger:{ - player:'enterGame', - global:'phaseBefore', - }, - forced:true, - direct:true, - filter:function(event,player){ - return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - 'step 0' - player.chooseTarget('连枝:请选择一名其他角色',lib.translate.dclianzhi_info,true,(card,player,target)=>{ - return target!=player&&!player.getStorage('dclianzhi').includes(target); - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - if(att>0) return att+1; - if(att==0) return Math.random(); - return att; - }).set('animate',false); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dclianzhi'); - player.markAuto('dclianzhi',[target]); - } - }, - }, - reproach:{ - audio:'dclianzhi', - trigger:{global:'dieAfter'}, - filter:function(event,player){ - return player.getStorage('dclianzhi').includes(event.player); - }, - direct:true, - content:function(){ - 'step 0' - var num=Math.max(1,player.countMark('dclingfang')); - player.chooseTarget(get.prompt('dclianzhi'),'选择一名其他角色,你与其各获得〖受责〗,且其获得'+num+'枚“绞”标记',(card,player,target)=>{ - return target!=player; - }).set('ai',target=>-get.attitude(_status.event.player,target)); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dclianzhi_reproach',target); - player.addSkills('dcshouze'); - target.addSkills('dcshouze'); - target.addMark('dclingfang',Math.max(1,player.countMark('dclingfang'))); - } - }, - } - } - }, - dclingfang:{ - audio:2, - trigger:{ - player:'phaseZhunbeiBegin', - global:'useCardAfter', - }, - forced:true, - filter:function(event,player){ - if(event.name!='useCard') return true; - if(get.color(event.card)!='black') return false; - if(event.player==player) return !event.targets||!event.targets.includes(player); - return event.targets&&event.targets.includes(player); - }, - content:function(){ - player.addMark('dclingfang',1); - }, - ai:{ - combo:'dcfengying' - }, - marktext:'绞', - intro:{ - name:'绞', - name2:'绞', - content:'mark' - } - }, - dcfengying:{ - audio:2, - enable:'chooseToUse', - group:'dcfengying_record', - locked:false, - filter:function(event,player){ - var mark=player.countMark('dclingfang'); - if(mark<=0||!player.hasCard(card=>get.number(card)<=mark,'hs')) return false; - var storage=player.getStorage('dcfengying'); - if(!storage.length) return false; - var storage2=player.getStorage('dcfengying_used') - return storage.some(name=>{ - return !storage2.includes(name)&&event.filterCard(get.autoViewAs({name},'unsure'),player,event); - }); - }, - hiddenCard:function(player,name){ - var list=player.getStorage('dcfengying'); - if(player.getStorage('dcfengying_used').includes(name)) return false; - return list.includes(name)&&player.hasCard((card)=>(get.number(card)<=player.countMark('dclingfang')),'hs'); - }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of player.storage.dcfengying){ - if(get.type(name)=='basic') list.push(['基本','',name]); - if(get.type(name)=='trick') list.push(['锦囊','',name]); - } - return ui.create.dialog('风影',[list,'vcard']); - }, - filter:function(button,player){ - var card={name:button.link[2],storage:{dcfengying:true}}; - if(player.getStorage('dcfengying_used').includes(card.name)) return false; - return _status.event.getParent().filterCard(get.autoViewAs(card,'unsure'),player,_status.event.getParent()); - }, - check:function(button){ - var player=_status.event.player; - if(player.countCards('hs',button.link[2])>0) return 0; - if(button.link[2]=='wugu') return; - var effect=player.getUseValue(button.link[2]); - if(effect>0) return effect; - return 0; - }, - backup:function(links,player){ - return { - filterCard:function(card,player,event){ - return get.number(card)<=player.countMark('dclingfang'); - }, - audio:'dcfengying', - selectCard:1, - popname:true, - check:function(card){ - return 6-get.value(card)+get.number(card)/15; - }, - position:'hs', - viewAs:{ - name:links[0][2], - storage:{dcfengying:true}, - }, - precontent:function(){ - player.logSkill('dcfengying'); - player.addTempSkill('dcfengying_used'); - player.markAuto('dcfengying_used',[event.result.card.name]); - event.getParent().addCount=false; - delete event.result.skill; - } - } - }, - prompt:function(links,player){ - return '将一张点数不大于'+get.strNumber(player.countMark('dclingfang'))+'的手牌当做'+get.translation(links[0][2])+'使用(无距离和次数限制)'; - } - }, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.dcfengying) return true; - }, - cardUsable:function(card,player){ - if(card.storage&&card.storage.dcfengying) return Infinity; - }, - }, - ai:{ - order:4, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); - return 1; - } - }, - threaten:2, - combo:'dclingfang' - }, - subSkill:{ - record:{ - trigger:{global:'phaseBegin'}, - filter:function(event,player){ - return ui.discardPile.childNodes.length>0; - }, - forced:true, - popup:false, - content:function(){ - player.storage.dcfengying=[]; - for(var i=0;i{ - return lib.inpile.indexOf(a)-lib.inpile.indexOf(b); - }); - } - }, - used:{ - charlotte:true, - onremove:true, - intro:{ - content:'已使用过$', - }, - }, - } - }, - dcshouze:{ - audio:true, - trigger:{player:'phaseJieshuBegin'}, - forced:true, - filter:function(event,player){ - return player.countMark('dclingfang')>0; - }, - content:function(){ - 'step 0' - player.removeMark('dclingfang',1); - 'step 1' - var card=get.discardPile(card=>get.color(card,false)=='black'); - if(card) player.gain(card,'gain2'); - player.loseHp(); - }, - ai:{ - combo:'dclingfang' - } - }, - //袁姬 - dcmengchi:{ - audio:'dcfangdu', - trigger:{player:['linkBefore','damageEnd']}, - forced:true, - filter:function(event,player){ - var num=player.getStat('gain'); - if(num&&num>0) return false; - if(event.name=='link') return !player.isLinked(); - return event.hasNature(); - }, - content:function(){ - if(trigger.name=='link') trigger.cancel(); - else player.recover(); - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.itemtype(player)!='player'||player._dcmengchi_aiChecking||target.getStat('gain')) return; - if(card.name=='tiesuo'&&!target.isLinked()) return 0; - if(player.hasSkillTag('jueqing',false,target)) return; - if(!get.tag(card,'damage')||get.tag(card,'natureDamage')) return; - if(target.hp<=1) return 0.75; - if(!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card - })&&player.hasSkillTag('damageBonus',false,{ - target:target, - card:card - })){ - if(target.hp>2) return 0.5; - return 0.75; - } - if(get.attitude(player,target)>0) return [0,0]; - var sha=player.getCardUsable({name:'sha'}); - player._dcmengchi_aiChecking=true; - var num=player.countCards('h',function(card){ - if(get.name(card)=='sha'){ - if(sha==0) return false; - else sha--; + player + .chooseControl("cancel2") + .set("prompt", get.prompt("dcyuanmo")) + .set("choiceList", choiceList) + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if ( + trigger.name == "phaseZhunbei" && + player.getAttackRange() == 1 && + !player.hasCard((card) => { + if (get.subtype(card) != "equip1" && !player.hasUseTarget(card)) + return false; + var num = 1; + var info = get.info(card, false); + if ( + info && + info.distance && + typeof info.distance.attackFrom == "number" + ) + num -= info.distance.attackFrom; + return num > 1; + }, "hs") + ) + return "选项一"; + var targets = event.targets.slice(), + targetsx = []; + var _tmp = player.storage.dcyuanmo_range; + player.storage.dcyuanmo_range++; + try { + targetsx = game.filterPlayer((current) => player.inRange(current)); + } catch (e) { + player.storage.dcyuanmo_range = _tmp; } - return player.canUse(card,target)&&get.effect(target,card,player,player)>0; - }); - delete player._dcmengchi_aiChecking; - if(player.hasSkillTag('damage')) num++; - if(num<2) return [0,0]; - }, - }, - }, - mod:{ - cardEnabled:function(card,player){ - if(!player.getStat('gain')) return false; - }, - cardSavable:function(card,player){ - if(!player.getStat('gain')) return false; - }, - }, - }, - dcfangdu:{ - audio:2, - trigger:{ - player:'damageEnd', - }, - forced:true, - filter:function(event,player){ - if(player==_status.currentPhase) return false; - return !event.hasNature()&&!player.hasHistory('damage',evt=>{ - return !evt.hasNature()&&evt!=event; - },event)||event.hasNature()&&!player.hasHistory('damage',evt=>{ - return evt.hasNature()&&evt!=event; - },event)&&event.source&&event.source.isIn()&&event.source.countGainableCards(player,'h'); - }, - content:function(){ - 'step 0' - if(!trigger.hasNature()){ - player.recover(); - } - else{ - var cards=trigger.source.getGainableCards(player,'h'); - if(cards.length){ - player.gain(cards.randomGet(),trigger.source,'giveAuto','bySelf'); - } - } - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player._dcfangdu_aiChecking||target==_status.currentPhase) return; - if(!get.tag(card,'damage')||player.hasSkillTag('jueqing',false,target)) return; - if(_status.event.getParent('useCard',true)||_status.event.getParent('_wuxie',true)) return; - if(!get.tag(card,'natureDamage')){ - if(target.hasHistory('damage',evt=>!evt.hasNature())) return 1.5; - else if(target.hp<=1||player.hasSkillTag('damageBonus',false,{ - target:target, - card:card - })&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card - })) return 0.75; - else{ - if(get.attitude(player,target)>0) return [0,0]; - var sha=player.getCardUsable({name:'sha'}); - player._dcfangdu_aiChecking=true; - var num=player.countCards('h',function(card){ - if(get.name(card)=='sha'){ - if(sha==0) return false; - else sha--; - } - return player.canUse(card,target)&&get.effect(target,card,player,player)>0; - }); - delete player._dcfangdu_aiChecking; - if(player.hasSkillTag('damage')) num++; - if(num<2) return [0,0]; - } - } - if(get.tag(card,'natureDamage')&&!target.hasHistory('damage',evt=>evt.hasNature())&&player.countCards('he')>1) return [1,1,1,-1]; - } - } - } - }, - dcjiexing:{ - audio:2, - trigger:{player:['recoverEnd','damageEnd','loseHpEnd']}, - check:function(event,player){ - var current=_status.currentPhase; - if(!player.hasSkill('dcmengchi')||get.attitude(player,current)>=0) return true; - var num=player.getStat('gain'); - if(num&&num>0) return true; - if(current.countCards('hs',card=>current.canUse(card,player)&&get.effect(player,card,current,player)<0)>=2) return false; - return true; - }, - frequent:'check', - content:function(){ - player.draw().gaintag=['dcjiexing']; - player.addTempSkill('dcjiexing_add'); - }, - subSkill:{ - add:{ - charlotte:true, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('dcjiexing')) return true; - }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('dcjiexing')) return false; - }, - }, - onremove:function(player){ - player.removeGaintag('dcjiexing'); - }, - } - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'recover')) return [1,1]; - if(get.tag(card,'damage')){ - var draw=0.9; - if(target.hasSkill('dcmengchi')&&target.getStat('gain')) draw=1.8; - if(target.hp<=1||card.name=='sha'&&player.hasSkill('jiu')||get.itemtype(player)=='player'&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card - })&&player.hasSkillTag('damageBonus',false,{ - target:target, - card:card - })){ - if(target.hp>2) return [1,draw]; - return; - } - return [1,draw]; - } - } - } - } - }, - //朱建平 - olddcxiangmian:{ - audio:'dcxiangmian', - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return !player.getStorage('olddcxiangmian').includes(event.player)&&player!=event.player; - }, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)<0; - }, - content:function(){ - 'step 0' - player.judge(card=>2/Math.sqrt(get.number(card,false))).set('judge2',result=>result.bool); - 'step 1' - player.markAuto('olddcxiangmian',[trigger.player]); - trigger.player.addSkill('olddcxiangmian_countdown'); - if (!trigger.player.storage['olddcxiangmian_countdown']) trigger.player.storage['olddcxiangmian_countdown'] = []; - [player.playerid, result.suit, result.number].forEach(i => trigger.player.storage['olddcxiangmian_countdown'].push(i)); - trigger.player.markSkill('olddcxiangmian_countdown'); - }, - intro:{content:'已对$发动过技能'}, - ai:{ - expose:0.3, - }, - subSkill:{ - countdown:{ - trigger:{player:'useCardAfter'}, - mark:true, - marktext:'噬', - silent:true, - forced:true, - charlotte:true, - intro:{ - markcount:function(storage){ - if(storage){ - var list=storage.filter((_,i)=>i%3==2); - return Math.min.apply(null,list); - } - }, - content:function(storage,player){ - var str='使用' - for(var i=0;ii%3==1)).includes(get.suit(event.card,player)); - }, - content:function(){ - 'step 0' - var storage=player.getStorage('olddcxiangmian_countdown'); - for(var i=0;i0) player.loseHp(player.hp); - i--; - } - } - }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(typeof card!='object') return; - var storage=player.getStorage('olddcxiangmian_countdown'); - for(var i=0;ilib.skill.dcxiangmian.filterTarget(null,player,current)); - }, - filterTarget:function(card,player,target){ - return !player.getStorage('dcxiangmian').includes(target)&&player!=target; - }, - content:function(){ - 'step 0' - target.judge(card=>-2/Math.sqrt(get.number(card,false))).set('judge2',result=>result.bool===false?true:false); - 'step 1' - player.markAuto('dcxiangmian',[target]); - target.addSkill('dcxiangmian_countdown'); - if (!target.storage['dcxiangmian_countdown']) target.storage['dcxiangmian_countdown']=[]; - [player.playerid,result.suit,result.number].forEach(i=>target.storage['dcxiangmian_countdown'].push(i)); - target.markSkill('dcxiangmian_countdown'); - }, - intro:{content:'已对$发动过技能'}, - ai:{ - expose:0.3, - order:10, - result:{target:-5} - }, - subSkill:{ - countdown:{ - trigger:{player:'useCardAfter'}, - mark:true, - marktext:'💀', - silent:true, - forced:true, - charlotte:true, - intro:{ - markcount:function(storage){ - if(storage){ - var list=storage.filter((_,i)=>i%3==2); - return Math.min.apply(null,list); - } - }, - content:function(storage,player){ - if(!storage) return; - var str='使用'; - str+=get.cnNumber(Math.min.apply(null,storage.filter((_,i)=>i%3==2)))+'张牌后,或使用一张'; - for(var i=0;ii%3==1)).includes(get.suit(event.card,player)); - return true; - }, - content:function(){ - 'step 0' - var storage=player.getStorage('dcxiangmian_countdown'); - for(var i=0;i0) player.loseHp(player.hp); - i--; - } - } - }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(typeof card!='object') return; - var storage=player.getStorage('dcxiangmian_countdown'); - for(var i=0;i{ - if(get[fn](card,player)==get[fn](cardxx,player)&&!cards.includes(cardxx)){ - return true; - } - }); - if(cardx) cards.push(cardx); - } - /*if(cards.length&&!player.isMaxHandcard(true)) player.draw(); - else*/ if(cards.length) player.gain(cards,'gain2') - } - }, - //赵直 - dctongguan:{ - trigger:{ - global:'phaseBegin', - }, - filter:function(event,player){ - return event.player.getAllHistory().filter(history=>{ - return history.isMe&&!history.isSkipped; - }).indexOf(event.player.getHistory())===0&&lib.skill.dctongguan.derivation.some(i=>{ - return (player.getStorage('dctongguan')[i]||0)<2; - }); - }, - forced:true, - locked:false, - logTarget:'player', - derivation:['dctongguan_wuyong','dctongguan_gangying','dctongguan_duomou','dctongguan_guojue','dctongguan_renzhi'], - content:function(){ - 'step 0' - var skills=lib.skill.dctongguan.derivation.slice(); - player.chooseControl(skills.filter(i=>{ - return (player.getStorage('dctongguan')[i]||0)<2; - })).set('choiceList',skills.map(i=>{ - var info=''; - switch (player.getStorage('dctongguan')[i]){ - case 1: - info=' style="opacity:0.65;"'; - break; - case 2: - info=' style="text-decoration:line-through; opacity:0.3;"'; - break; - } - return '
    「'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'」
    ' + - ''+get.skillInfoTranslation(i,player)+'(已选过'+get.cnNumber(player.getStorage('dctongguan')[i]||0)+'次)'+''; - })).set('displayIndex',false).set('prompt','统观:为'+get.translation(trigger.player)+'选择一个属性').set('ai',function(){ - var controls=_status.event.controls,target=_status.event.getTrigger().player; - var str=target.getSkills(null,false,false).map(i=>get.skillInfoTranslation(i)).join(''); - var choices=[]; - if(controls.includes('dctongguan_wuyong')&&/你对\S{1,15}造成\S{1,10}伤害/.test(str)) choices.push('dctongguan_wuyong'); - if(controls.includes('dctongguan_gangying')&&/回复\S{1,5}体力/.test(str)&&_status.event.player.getFriends().length) choices.push('dctongguan_gangying'); - if(controls.includes('dctongguan_duomou')&&/你(可|可以)?摸\S{1,3}张牌/.test(str)) choices.push('dctongguan_duomou'); - if(controls.includes('dctongguan_guojue')&&/(当【过河拆桥】使用|((弃置|获得)\S{1,5}其他角色\S{1,7}牌|))/.test(str)) choices.push('dctongguan_guojue'); - if(controls.includes('dctongguan_renzhi')&&/交给\S{0,5}其他角色/.test(str)&&_status.event.player.getFriends().length) choices.push('dctongguan_renzhi'); - if(choices.length) return choices.randomGet(); - return _status.event.controls.randomGet(); - }); - 'step 1' - if(result.control){ - var skill=result.control; - var func=lib.skill.dctongguan.localMark; - if(event.player==game.me) func(skill,trigger.player) - else if(event.isOnline()) player.send(func,skill,trigger.player) - // game.log(player,'为',trigger.player,'选择了','#g「'+get.translation(skill)+'」','属性'); - game.log(player,'为',trigger.player,'选择了','#g一个属性'); - // player.popup(skill); - trigger.player.addSkill(skill); - if(!player.storage.dctongguan) player.storage.dctongguan={}; - if(!player.storage.dctongguan[skill]) player.storage.dctongguan[skill]=0; - player.storage.dctongguan[skill]++; - } - }, - localMark:function(skill,player){ - var name=skill,info; - if(player.marks[name]) player.updateMarks(); - if(lib.skill[name]) info=lib.skill[name].intro; - if(!info) return; - if(player.marks[name]) player.marks[name].info=info; - else player.marks[name]=player.mark(name,info); - player.updateMarks(); - }, - ai:{ - combo:'dcmengjie' - }, - subSkill:{ - forceFinish:{charlotte:true}, - wuyong:{ - marktext:'勇', - intro:{ - name:'武勇', - content:'属性目标:造成伤害', - }, - charlotte:true, - silent:true, - nopop:true, - }, - gangying:{ - marktext:'刚', - intro:{ - name:'刚硬', - content:'属性目标:回复体力,或于得到牌后手牌数大于体力值', - }, - charlotte:true, - silent:true, - forced:true, - nopop:true, - lastDo:true, - trigger:{player:'gainEnd'}, - filter:function(event,player){ - return player.countCards('h')>player.hp; - }, - content:function(){ - trigger._dctongguan_gangying=true; - }, - }, - duomou:{ - marktext:'谋', - intro:{ - name:'多谋', - content:'属性目标:于摸牌阶段外摸牌', - }, - charlotte:true, - silent:true, - nopop:true, - }, - guojue:{ - marktext:'决', - intro:{ - name:'果决', - content:'属性目标:弃置或获得其他角色牌', - }, - charlotte:true, - silent:true, - nopop:true, - }, - renzhi:{ - marktext:'仁', - intro:{ - name:'仁智', - content:'属性目标:交给其他角色牌', - }, - charlotte:true, - silent:true, - nopop:true, - }, - } - }, - dcmengjie:{ - trigger:{ - global:'phaseEnd', - }, - forced:true, - direct:true, - locked:false, - filter:function(event,player){ - var target=event.player; - if((target.hasSkill('dctongguan_gangying')&&(target.hasHistory('gain',function(evt){ - return evt._dctongguan_gangying==true; - })||game.getGlobalHistory('changeHp',function(evt){ - return evt.player==target&&(evt.getParent().name=='recover'||target.countCards('h')>target.hp); - }).length>0)) || - target.hasSkill('dctongguan_wuyong')&&target.getHistory('sourceDamage').length || - target.hasSkill('dctongguan_duomou')&&target.getHistory('gain',evt=>evt.getParent().name=='draw'&&evt.getParent('phaseDraw').name!='phaseDraw').length){ - return true; - } - var guojue=false,renzhi=false; - game.countPlayer2(current=>{ - if(current==target) return false; - if(!guojue&¤t.hasHistory('lose',evt=>{ - if(evt.type=='discard'){ - if((evt.discarder||evt.getParent(2).player)!=target) return false; - if(!evt.getl(current).cards2.length) return false; - return true; - } - else if(evt.type=='gain'){ - var evtx=evt.getParent(); - if(evtx.giver||evtx.getParent().name=='gift') return false; - var cards=evtx.getg(target); - if(!cards.length) return false; - var cards2=evtx.getl(current).cards2; - for(var card of cards2){ - if(cards.includes(card)) return true; - } - } - return false; - })) guojue=true; - if(!renzhi&¤t.hasHistory('gain',evt=>{ - if(evt.giver!=target||evt.getParent().name=='gift') return false; - return evt.cards.length; - })) renzhi=true; - }); - return target.hasSkill('dctongguan_guojue')&&guojue||target.hasSkill('dctongguan_renzhi')&&renzhi; - }, - rules:[ - (target)=>target.getHistory('sourceDamage').length, - (target)=>target.hasHistory('gain',function(evt){ - return evt._dctongguan_gangying; - })||game.getGlobalHistory('changeHp',function(evt){ - return evt.player==target&&evt.getParent().name=='recover'; - }).length>0||target.countCards('h')>target.hp, - (target)=>target.getHistory('gain',evt=>evt.getParent().name=='draw'&&evt.getParent('phaseDraw').name!='phaseDraw').length, - (target,bool)=>bool, - (target,bool)=>bool - ], - content:function(){ - 'step 0' - event.nowProperty=0; - var target=trigger.player; - var guojue=false,renzhi=false; - game.countPlayer2(current=>{ - if(current==target) return false; - if(!guojue&¤t.hasHistory('lose',evt=>{ - if(evt.type=='discard'){ - if((evt.discarder||evt.getParent(2).player)!=target) return false; - if(!evt.getl(current).cards2.length) return false; - return true; - } - else if(evt.type=='gain'){ - var evtx=evt.getParent(); - if(evtx.giver||evtx.getParent().name=='gift') return false; - var cards=evtx.getg(target); - if(!cards.length) return false; - var cards2=evtx.getl(current).cards2; - for(var card of cards2){ - if(cards.includes(card)) return true; - } - } - return false; - })) guojue=true; - if(!renzhi&¤t.hasHistory('gain',evt=>{ - if(evt.giver!=target||evt.getParent().name=='gift') return false; - return evt.cards.length; - })) renzhi=true; - }); - event.guojue=guojue; event.renzhi=renzhi; - 'step 1' - if(event.nowProperty>=5){ + player.storage.dcyuanmo_range = _tmp; + targetsx.removeArray(targets); + return targetsx.reduce((p, c) => { + return ( + p + + Math.max(0, get.effect(c, { name: "shunshou_copy2" }, player, player)) + ); + }, 0) > + get.effect(player, { name: "draw" }, player, player) * 1.3 + ? "选项一" + : "选项二"; + })() + ); + ("step 1"); + if (result.control == "cancel2") { event.finish(); return; } - var skills=lib.skill.dctongguan.derivation; - if(trigger.player.hasSkill(skills[event.nowProperty])&&lib.skill.dcmengjie.rules[event.nowProperty](trigger.player,event[event.nowProperty==3?'guojue':'renzhi'])){ - event.goto(2+event.nowProperty*2); + player.logSkill("dcyuanmo"); + if (result.control == "选项一") { + lib.skill.dcyuanmo.change(player, 1); + var targetsx = game.filterPlayer((current) => player.inRange(current)); + if (targetsx.length <= targets.length) { + event.finish(); + } else event.targets = targetsx.removeArray(targets); + } else { + lib.skill.dcyuanmo.change(player, -1); + player.draw(2); + event.finish(); + } + ("step 2"); + player + .chooseTarget( + "远谟:获得任意名本次进入你攻击范围的角色的一张牌", + [1, targets.length], + (card, player, target) => { + return ( + _status.event.getParent().targets.includes(target) && + target.countGainableCards(player, "he") > 0 + ); + } + ) + .set("ai", (target) => { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }); + ("step 3"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.line(targets); + for (var target of targets) { + player.gainPlayerCard(target, "he", true); + } + } + }, + subSkill: { + add: { + audio: "dcyuanmo", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return !game.hasPlayer((current) => player.inRange(current)); + }, + prompt2: "令你的攻击范围+1", + check: () => true, + content: function () { + lib.skill.dcyuanmo.change(player, 1); + }, + }, + range: { + charlotte: true, + intro: { + content: function (storage, player) { + var num = player.storage.dcyuanmo_range; + return "攻击范围" + (num >= 0 ? "+" : "") + num; + }, + }, + mod: { + attackRange: function (player, num) { + return num + player.countMark("dcyuanmo_range"); + }, + }, + }, + }, + }, + //薛灵芸 + dcxialei: { + audio: 2, + trigger: { + player: "loseAfter", + global: ["cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], + }, + filter: function (event, player) { + if (player.countMark("dcxialei_clear") >= 3) return false; + if (event.name != "cardsDiscard") { + return event.getd(player, "cards2").some((i) => get.color(i, player) == "red"); + } else { + if (!event.cards.filterInD("d").some((i) => get.color(i, player) == "red")) + return false; + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + var evtx = evt.relatedEvent || evt.getParent(); + if (evtx.player != player) return false; + return player.hasHistory("lose", (evtxx) => { + return ( + evtx == (evtxx.relatedEvent || evtxx.getParent()) && evtxx.cards2.length > 0 + ); + }); + } + }, + content: function () { + "step 0"; + var cards = get.cards(3 - player.countMark("dcxialei_clear")); + event.cards = cards; + game.cardsGotoOrdering(cards); + if (cards.length == 1) event._result = { bool: true, links: cards }; + else player.chooseButton(["霞泪:获得其中的一张牌", cards], true); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + player.gain(card, "gain2"); + event.cards.remove(card); + if (event.cards.length) { + player + .chooseBool() + .set("createDialog", ["是否将剩余牌置于牌堆底?", event.cards]) + .set("ai", () => _status.event.bool) + .set( + "bool", + (function () { + if (!player.hasSkill("dcanzhi")) return Math.random() < 0.5; + if (player.hasSkill("dcanzhi_blocker")) { + var next = _status.currentPhase.getNext(); + var judges = next.getCards("j"); + var val = 0; + if (judges.length && !next.hasWuxie()) { + var att = get.attitude(player, next); + for (var i = 0; ; i++) { + var judge = judges[i] && get.judge(judges[i]), + card = event.cards[i]; + if (!judge || !card) break; + val += judge(card) * att; + i++; + } + } + if (val > 0) return false; + else if (val == 0) return Math.random() < 0.5; + return true; + } + var card = event.cards[0]; + if ( + get.color(card, player) == "red" && + player.isPhaseUsing() && + player.countCards("hs", (card) => { + return ( + get.color(card) == "red" && + player.hasValueTarget(card) && + ["basic", "trick"].includes(get.type(card)) + ); + }) > 0 + ) + return false; + if (get.color(card, player) == "black") return false; + return true; + })() + ); + } else event.goto(3); + } else event.finish(); + ("step 2"); + if (result.bool) { + player.popup("牌堆底"); + game.log(player, "将" + get.cnNumber(event.cards.length) + "张牌置于了牌堆底"); + } else player.popup("牌堆顶"); + while (cards.length) { + var card = cards.pop(); + card.fix(); + if (result.bool) ui.cardPile.appendChild(card); + else ui.cardPile.insertBefore(card, ui.cardPile.firstChild); + } + game.updateRoundNumber(); + ("step 3"); + player.addMark("dcxialei_clear", 1, false); + player.addTempSkill("dcxialei_clear"); + }, + subSkill: { clear: { onremove: true } }, + }, + dcanzhi: { + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("dcanzhi_blocker"); + }, + group: "dcanzhi_damage", + content: function () { + "step 0"; + player.judge((result) => { + if (get.color(result) == "red") + return _status.event.getParent().player.countMark("dcxialei_clear") / 2; + return 2; + }).judge2 = (result) => result.bool; + ("step 1"); + if (result.color == "red") { + player.removeSkill("dcxialei_clear"); + event.finish(); + } else if (result.color == "black") { + player.addTempSkill("dcanzhi_blocker"); + player + .chooseTarget( + "暗织:是否令一名非当前回合角色获得本回合进入弃牌堆的两张牌?", + (card, player, target) => { + return target != _status.currentPhase; + } + ) + .set("ai", (target) => { + return get.effect(target, { name: "wuzhong" }, _status.event.player); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target); + var cards = []; + game.getGlobalHistory("cardMove", (evt) => { + if ( + (evt.name == "lose" && evt.position == ui.discardPile) || + evt.name == "cardsDiscard" + ) { + cards.addArray(evt.cards.filterInD("d")); + } + }); + if (cards.length) { + player + .chooseButton( + ["暗织:选择令" + get.translation(target) + "获得的牌", cards], + true, + Math.min(cards.length, 2) + ) + .set("ai", (button) => { + var player = _status.event.player, + target = _status.event.getParent().target; + return get.sgnAttitude(player, target) * get.value(button.link, target); + }); + } + } else event.finish(); + ("step 3"); + if (result.bool) { + target.gain(result.links, "gain2"); + } + }, + ai: { + combo: "dcxialei", + order: function (item, player) { + if (player.countMark("dcxialei_clear") >= 2) return 10; + if ( + player.hasHistory("useSkill", (evt) => evt.skill == "dcxialei") && + get.color(ui.cardPile.firstChild, player) == "red" && + player.countMark("dcxialei_clear") > 0 + ) + return 9; + return 1; + }, + result: { + player: function (player) { + return 1; + }, + }, + }, + subSkill: { + damage: { + audio: "dcanzhi", + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return !player.hasSkill("dcanzhi_blocker"); + }, + check: function (event, player) { + return game.hasPlayer((current) => { + return get.attitude(player, current) > 0 && current != _status.currentPhase; + }); + }, + prompt2: + "你判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。", + content: function () { + event.setContent(lib.skill.dcanzhi.content); + event.goto(0); + }, + }, + blocker: { charlotte: true }, + }, + }, + //十周年王允 + dclianji: { + enable: "phaseUse", + audio: "wylianji", + usable: 1, + check: function (card) { + return 5 - get.value(card); + }, + filterTarget: function (card, player, target) { + return target != player; + }, + filterCard: true, + content: function () { + "step 0"; + var card = get.cardPile2(function (card) { + return get.subtype(card) == "equip1" && targets[0].hasUseTarget(card); + }); + if (card) { + if (card.name == "qinggang" && !lib.inpile.includes("qibaodao")) { + card.remove(); + card = game.createCard("qibaodao", card.suit, card.number); + } + targets[0].chooseUseTarget(card, true, "nopopup", "nothrow"); + } else { + player.chat("没有装备牌了吗"); + game.log("但是牌堆里已经没有装备牌了!"); + } + ("step 1"); + game.updateRoundNumber(); + targets[0] + .chooseToUse(get.translation(player) + "对你发动了【连计】", { name: "sha" }) + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if (target == _status.event.source) return false; + return lib.filter.filterTarget.apply(this, arguments); + }) + .set("addCount", false) + .set("source", player) + .set( + "prompt2", + "对除" + + get.translation(player) + + "外的一名角色使用一张【杀】,并将装备区内的武器牌交给其中一名目标角色;或点击“取消”,令" + + get.translation(player) + + "视为对你使用一张【杀】,并获得你装备区内的武器牌" + ); + ("step 2"); + var card = targets[0].getEquips(1); + if (result.bool) { + player.addSkill("dclianji_1"); + if (card.length && result.targets.filter((target) => target.isIn()).length > 0) { + event.card = card; + targets[0] + .chooseTarget( + true, + "将" + get.translation(card) + "交给一名目标角色", + (card, player, target) => { + return _status.event.targets.includes(target); + } + ) + .set("ai", function (target) { + var card = _status.event.getParent().card[0]; + return ( + (target.hasSkillTag("nogain") + ? 0 + : get.attitude(_status.event.player, target)) * + Math.max(0.1, target.getUseValue(card)) + ); + }) + .set("targets", result.targets); + } else event.finish(); + } else { + player.addSkill("dclianji_2"); + event.goto(4); + } + ("step 3"); + targets[0].give(card, result.targets[0], "give"); + event.finish(); + ("step 4"); + player.useCard({ name: "sha", isCard: true }, targets[0], false); + ("step 5"); + var card = targets[0].getEquips(1); + if (card.length) targets[0].give(card, player, "give"); + }, + ai: { + order: 4, + result: { + target: function (player, target) { + if (game.countPlayer() == 2) return -3; + if (!target.getEquip(1)) { + if ( + game.hasPlayer(function (current) { + return ( + current != target && + !current.hasSkillTag("nogain") && + get.attitude(current, target) > 0 + ); + }) + ) + return 3; + return -3; + } + if ( + !game.hasPlayer(function (current) { + return ( + current != target && + !current.hasSkillTag("nogain") && + get.attitude(current, target) > 0 + ); + }) + ) + return -6; + return 4 - get.value(target.getEquip(1)); + }, + }, + }, + subSkill: { + 1: { charlotte: true, onremove: true }, + 2: { charlotte: true, onremove: true }, + }, + }, + dcmoucheng: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: "moucheng", + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + derivation: "xinjingong", + unique: true, + filter: function (event, player) { + return player.hasSkill("dclianji_1") && player.hasSkill("dclianji_2"); + }, + content: function () { + player.awakenSkill("dcmoucheng"); + player.changeSkills(["xinjingong"], ["dclianji"]); + }, + }, + //周宣 + dcwumei: { + audio: 2, + trigger: { player: "phaseBeginStart" }, + filter: function (event, player) { + return !player.hasSkill("dcwumei_used"); + }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("dcwumei")).set("ai", (target) => { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcwumei", target); + player.addTempSkill("dcwumei_used", "roundStart"); + target.insertPhase(); + target.addTempSkill("dcwumei_wake", "phaseAfter"); + var targets = game.filterPlayer(); + if (!target.storage.dcwumei_wake) target.storage.dcwumei_wake = [[], []]; + for (var targetx of targets) { + target.storage.dcwumei_wake[0].push(targetx); + target.storage.dcwumei_wake[1].push(targetx.hp); + } + target.markSkill("dcwumei_wake"); + if (!trigger._finished) { + trigger.finish(); + trigger.untrigger(true); + trigger._triggered = 5; + game.players + .slice() + .concat(game.dead) + .forEach((current) => { + current.getHistory().isSkipped = true; + current.getStat().isSkipped = true; + }); + var evt = player.insertPhase(); + delete evt.skill; + game.broadcastAll(function (player) { + player.classList.remove("glow_phase"); + delete _status.currentPhase; + }, player); + } + } + }, + subSkill: { + used: { charlotte: true }, + wake: { + init: function (player) { + game.addGlobalSkill("dcwumei_all"); + }, + onremove: function (player) { + game.removeGlobalSkill("dcwumei_all"); + delete player.storage.dcwumei_wake; + }, + trigger: { player: "phaseJieshuBegin" }, + charlotte: true, + popup: false, + forced: true, + filter: function (event, player) { + return player.storage.dcwumei_wake && player.storage.dcwumei_wake.length; + }, + content: function () { + var storage = player.storage.dcwumei_wake; + for (var i = 0; i < storage[0].length; i++) { + var target = storage[0][i]; + if (target && target.isIn()) { + if (target.hp != storage[1][i]) { + game.log( + target, + "将体力从", + get.cnNumber(target.hp, true), + "改为", + get.cnNumber(storage[1][i], true) + ); + target.changeHp(storage[1][i] - target.hp)._triggered = null; + } + } + } + player.removeSkill("dcwumei_wake"); + }, + marktext: "寐", + intro: { + markcount: function (storage, player) { + if (!storage || !storage.length) return 0; + return storage[0].length; + }, + content: function (storage, player) { + if (!storage || !storage.length) return "无信息"; + var str = "所有角色于回合开始时的体力值:
    "; + for (var i = 0; i < storage[0].length; i++) { + var str2 = get.translation(storage[0][i]) + ":" + storage[1][i]; + if (!storage[0][i].isIn()) + str2 = '' + str2 + "(已故)"; + str += "
  • " + str2; + } + return str; + }, + }, + }, + all: { + trigger: { player: "dieAfter" }, + filter: function (event, player) { + return !game.hasPlayer((current) => current.hasSkill("dcwumei_wake"), true); + }, + silent: true, + forceDie: true, + content: function () { + game.removeGlobalSkill("dcwumei_all"); + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (get.tag(card, "recover") && target.hp > 0) return 0; + if (get.tag(card, "damage")) return 0.5; + }, + }, + }, + }, + }, + }, + dczhanmeng: { + audio: 2, + trigger: { player: "useCard" }, + filter(event, player) { + return ( + !player.hasSkill("dczhanmeng_choice1") || + !player.hasSkill("dczhanmeng_choice2") || + (!player.hasSkill("dczhanmeng_choice0") && + !game.hasPlayer2((current) => { + const history = current.actionHistory; + if (history.length < 2) return false; + for (let i = history.length - 2; i >= 0; i--) { + if (history[i].isSkipped) continue; + const list = history[i].useCard.map((evt) => evt.card.name); + return list.includes(event.card.name); + } + return false; + }, true)) + ); + }, + direct: true, + content() { + "step 0"; + var list = []; + var choiceList = [ + "上回合若没有同名牌被使用过,你获得一张非伤害牌", + "下回合当同名牌首次被使用后,你获得一张伤害牌", + "令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害", + ]; + var used = game.hasPlayer2((current) => { + var history = current.actionHistory; + if (history.length < 2) return false; + for (let i = history.length - 2; i >= 0; i--) { + if (history[i].isSkipped) continue; + const list = history[i].useCard.map((evt) => evt.card.name); + return list.includes(trigger.card.name); + } + return false; + }, true); + if (!player.hasSkill("dczhanmeng_choice0") && !used) list.push("选项一"); + else + choiceList[0] = + '' + + choiceList[0] + + (used ? "(同名牌被使用过)" : "(已选择)") + + ""; + if (!player.hasSkill("dczhanmeng_choice1")) list.push("选项二"); + else choiceList[1] = '' + choiceList[1] + "(已选择)"; + var other = game.hasPlayer((current) => current != player); + if (!player.hasSkill("dczhanmeng_choice2") && other) list.push("选项三"); + else + choiceList[2] = + '' + + choiceList[2] + + (!other ? "(没人啦)" : "(已选择)") + + ""; + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("dczhanmeng")) + .set("ai", () => { + var choices = _status.event.controls.slice().remove("cancel2"); + var player = _status.event.player, + evt = _status.event.getTrigger(); + if (!game.hasPlayer((current) => get.attitude(player, current) < 0)) + choices.remove("选项三"); + else if (choices.includes("选项三")) return "选项三"; + if (choices.includes("选项二")) { + if (evt.card.name == "sha") return "选项二"; + if (get.type(evt.card, null, false) == "equip") choices.remove("选项二"); + } + if (!choices.length) return "cancel2"; + return choices.randomGet(); + }) + .set("choiceList", choiceList); + ("step 1"); + if (result.control == "cancel2") { + event.finish(); + return; + } + if (result.control == "选项一") { + player.logSkill("dczhanmeng"); + game.log(player, "选择了", "#y" + result.control); + player.addTempSkill("dczhanmeng_choice0"); + var card = get.cardPile2((card) => { + return !get.tag(card, "damage"); + }); + if (card) player.gain(card, "gain2"); + event.finish(); + } else if (result.control == "选项二") { + player.logSkill("dczhanmeng"); + game.log(player, "选择了", "#y" + result.control); + player.addTempSkill("dczhanmeng_choice1"); + trigger["dczhanmeng_" + player.playerid] = true; + player.addSkill("dczhanmeng_delay"); + event.finish(); + } else { + player.addTempSkill("dczhanmeng_choice2"); + player + .chooseTarget("占梦:令一名其他角色弃置两张牌", lib.filter.notMe, true) + .set("ai", (target) => { + var player = _status.event.player; + var eff1 = get.effect(target, { name: "guohe_copy2" }, player, player) + 0.1; + var eff2 = get.damageEffect(target, player, player, "fire") + 0.1; + if (eff1 < 0 && eff2 < 0) return -eff1 * eff2; + return eff1 * eff2; + }); + } + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("dczhanmeng", target); + game.log(player, "选择了", "#y选项三"); + target.chooseToDiscard(2, "he", true); + } else event.finish(); + ("step 3"); + if (result.bool) { + var cards = result.cards; + var num = 0; + for (var card of cards) { + num += get.number(card, false); + } + if (num > 10) { + player.line(target, "fire"); + target.damage("fire"); + } + } + }, + ai: { threaten: 8 }, + subSkill: { + delay: { + trigger: { global: ["useCardAfter", "phaseBeginStart"] }, + charlotte: true, + forced: true, + popup: false, + silent: true, + filter(event, player, name) { + var history = player.actionHistory; + if (history.length < 2) return false; + var list = history[history.length - 2].useCard; + if (name == "phaseBeginStart") { + return !list.some((evt) => evt["dczhanmeng_" + player.playerid]); + } + for (var evt of list) { + if ( + evt["dczhanmeng_" + player.playerid] && + event.card.name == evt.card.name && + game + .getGlobalHistory("useCard", (evtx) => { + return evtx.card.name == event.card.name; + }) + .indexOf(event) == 0 + ) + return true; + } + return false; + }, + content() { + if (event.triggername != "phaseBeginStart") { + player.logSkill("dczhanmeng_delay"); + var card = get.cardPile2((card) => { + return get.tag(card, "damage"); + }); + if (card) player.gain(card, "gain2"); + } else player.removeSkill("dczhanmeng_delay"); + }, + }, + choice0: { charlotte: true }, + choice1: { charlotte: true }, + choice2: { charlotte: true }, + }, + }, + //程秉 + dcjingzao: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + if (3 + player.countMark("dcjingzao_add") - player.countMark("dcjingzao_ban") <= 0) + return false; + return game.hasPlayer((current) => + lib.skill.dcjingzao.filterTarget(null, player, current) + ); + }, + filterTarget: function (card, player, target) { + return player != target && !target.hasSkill("dcjingzao_temp"); + }, + content: function () { + "step 0"; + target.addTempSkill("dcjingzao_temp"); + var cards = game.cardsGotoOrdering( + get.cards(3 + player.countMark("dcjingzao_add") - player.countMark("dcjingzao_ban")) + ).cards; + event.cards = cards; + game.log(player, "亮出了", event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, target, id, cards) { + var str = + get.translation(player) + + "对" + + (target == game.me ? "你" : get.translation(target)) + + "发动了【经造】"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + target, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [ + get.translation(player) + "发动了【经造】", + get.cardsInfo(event.cards), + ]); + game.delay(cards.length - 1); + ("step 1"); + target + .chooseToDiscard("he") + .set("prompt", false) + .set("filterCard", (card) => { + var names = _status.event.getParent().cards.map((i) => i.name); + return names.includes(get.name(card)); + }) + .set("ai", (card) => { + var target = _status.event.player, + player = _status.event.getParent().player; + var att = get.attitude(target, player), + val = get.value(card); + if (!lib.skill.dcjingzao.filter(null, player)) { + if (att > 0) return 0; + return 6 - val; + } else { + if (att > 0) return 4 - val; + return 0; + } + }); + var update = function (id, source) { + var dialog = get.idDialog(id); + if (dialog) { + var div = ui.create.div("", dialog.content, 1); + var name = get.translation(source); + div.innerHTML = + "弃置一张满足条件的牌,然后" + + name + + "〖经造〗本回合亮出牌数+1;或点“取消”令" + + name + + "随机获得每种牌名的牌各一张,且〖经造〗本回合失效"; + ui.update(); + } + }; + if (target == game.me) update(event.videoId, player); + else if (target.isOnline()) target.send(update, event.videoId, player); + ("step 2"); + game.broadcastAll("closeDialog", event.videoId); + if (result.bool) { + player.addTempSkill("dcjingzao_add"); + player.addMark("dcjingzao_add", 1, false); + } else { + var cards = cards.randomSort(), + cards2 = []; + for (var card of cards) { + if (!cards2.map((i) => i.name).includes(card.name)) cards2.push(card); + } + if (cards2.length) player.gain(cards2, "gain2"); + player.addTempSkill("dcjingzao_ban"); + player.addMark("dcjingzao_ban", cards2.length, false); + } + }, + ai: { + order: 7, + result: { + player: 1, + }, + }, + subSkill: { + add: { charlotte: true, onremove: true }, + ban: { charlotte: true, onremove: true }, + temp: { charlotte: true }, + }, + }, + dcenyu: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + return ( + event.player != player && + game.hasPlayer2((current) => { + return current.hasHistory("useCard", (evt) => { + return ( + evt.card.name == event.card.name && + evt != event.getParent() && + evt.targets && + evt.targets.includes(player) + ); + }); + }) && + (event.card.name == "sha" || get.type(event.card) == "trick") + ); + }, + content: function () { + trigger.getParent().excluded.add(player); + }, + ai: { + effect: { + target: (card, player, target) => { + if (player === target) return; + if ( + game.hasPlayer2((current) => { + return current.hasHistory( + "useCard", + (evt) => + evt.card.name == card.name && + evt.targets && + evt.targets.includes(target) + ); + }) && + (card.name == "sha" || get.type(card) == "trick") + ) + return "zeroplayertarget"; + }, + }, + }, + }, + //董贵人 + dclianzhi: { + audio: 2, + trigger: { player: "dying" }, + usable: 1, + forced: true, + locked: false, + derivation: "dcshouze", + group: ["dclianzhi_connect", "dclianzhi_reproach"], + filter: function (event, player) { + return player.getStorage("dclianzhi").filter((i) => i && i.isIn()).length; + }, + content: function () { + player.recover(); + game.asyncDraw( + [player] + .concat(player.getStorage("dclianzhi").filter((i) => i && i.isIn())) + .sortBySeat() + ); + }, + ai: { + threaten: 0.6, + }, + subSkill: { + connect: { + audio: "dclianzhi", + trigger: { + player: "enterGame", + global: "phaseBefore", + }, + forced: true, + direct: true, + filter: function (event, player) { + return ( + game.hasPlayer((current) => current != player) && + (event.name != "phase" || game.phaseNumber == 0) + ); + }, + content: function () { + "step 0"; + player + .chooseTarget( + "连枝:请选择一名其他角色", + lib.translate.dclianzhi_info, + true, + (card, player, target) => { + return ( + target != player && + !player.getStorage("dclianzhi").includes(target) + ); + } + ) + .set("ai", (target) => { + var att = get.attitude(_status.event.player, target); + if (att > 0) return att + 1; + if (att == 0) return Math.random(); + return att; + }) + .set("animate", false); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dclianzhi"); + player.markAuto("dclianzhi", [target]); + } + }, + }, + reproach: { + audio: "dclianzhi", + trigger: { global: "dieAfter" }, + filter: function (event, player) { + return player.getStorage("dclianzhi").includes(event.player); + }, + direct: true, + content: function () { + "step 0"; + var num = Math.max(1, player.countMark("dclingfang")); + player + .chooseTarget( + get.prompt("dclianzhi"), + "选择一名其他角色,你与其各获得〖受责〗,且其获得" + num + "枚“绞”标记", + (card, player, target) => { + return target != player; + } + ) + .set("ai", (target) => -get.attitude(_status.event.player, target)); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dclianzhi_reproach", target); + player.addSkills("dcshouze"); + target.addSkills("dcshouze"); + target.addMark("dclingfang", Math.max(1, player.countMark("dclingfang"))); + } + }, + }, + }, + }, + dclingfang: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + global: "useCardAfter", + }, + forced: true, + filter: function (event, player) { + if (event.name != "useCard") return true; + if (get.color(event.card) != "black") return false; + if (event.player == player) return !event.targets || !event.targets.includes(player); + return event.targets && event.targets.includes(player); + }, + content: function () { + player.addMark("dclingfang", 1); + }, + ai: { + combo: "dcfengying", + }, + marktext: "绞", + intro: { + name: "绞", + name2: "绞", + content: "mark", + }, + }, + dcfengying: { + audio: 2, + enable: "chooseToUse", + group: "dcfengying_record", + locked: false, + filter: function (event, player) { + var mark = player.countMark("dclingfang"); + if (mark <= 0 || !player.hasCard((card) => get.number(card) <= mark, "hs")) return false; + var storage = player.getStorage("dcfengying"); + if (!storage.length) return false; + var storage2 = player.getStorage("dcfengying_used"); + return storage.some((name) => { + return ( + !storage2.includes(name) && + event.filterCard(get.autoViewAs({ name }, "unsure"), player, event) + ); + }); + }, + hiddenCard: function (player, name) { + var list = player.getStorage("dcfengying"); + if (player.getStorage("dcfengying_used").includes(name)) return false; + return ( + list.includes(name) && + player.hasCard((card) => get.number(card) <= player.countMark("dclingfang"), "hs") + ); + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of player.storage.dcfengying) { + if (get.type(name) == "basic") list.push(["基本", "", name]); + if (get.type(name) == "trick") list.push(["锦囊", "", name]); + } + return ui.create.dialog("风影", [list, "vcard"]); + }, + filter: function (button, player) { + var card = { name: button.link[2], storage: { dcfengying: true } }; + if (player.getStorage("dcfengying_used").includes(card.name)) return false; + return _status.event + .getParent() + .filterCard(get.autoViewAs(card, "unsure"), player, _status.event.getParent()); + }, + check: function (button) { + var player = _status.event.player; + if (player.countCards("hs", button.link[2]) > 0) return 0; + if (button.link[2] == "wugu") return; + var effect = player.getUseValue(button.link[2]); + if (effect > 0) return effect; + return 0; + }, + backup: function (links, player) { + return { + filterCard: function (card, player, event) { + return get.number(card) <= player.countMark("dclingfang"); + }, + audio: "dcfengying", + selectCard: 1, + popname: true, + check: function (card) { + return 6 - get.value(card) + get.number(card) / 15; + }, + position: "hs", + viewAs: { + name: links[0][2], + storage: { dcfengying: true }, + }, + precontent: function () { + player.logSkill("dcfengying"); + player.addTempSkill("dcfengying_used"); + player.markAuto("dcfengying_used", [event.result.card.name]); + event.getParent().addCount = false; + delete event.result.skill; + }, + }; + }, + prompt: function (links, player) { + return ( + "将一张点数不大于" + + get.strNumber(player.countMark("dclingfang")) + + "的手牌当做" + + get.translation(links[0][2]) + + "使用(无距离和次数限制)" + ); + }, + }, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dcfengying) return true; + }, + cardUsable: function (card, player) { + if (card.storage && card.storage.dcfengying) return Infinity; + }, + }, + ai: { + order: 4, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + threaten: 2, + combo: "dclingfang", + }, + subSkill: { + record: { + trigger: { global: "phaseBegin" }, + filter: function (event, player) { + return ui.discardPile.childNodes.length > 0; + }, + forced: true, + popup: false, + content: function () { + player.storage.dcfengying = []; + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i]; + if (get.color(card, false) != "black") continue; + if (!["basic", "trick"].includes(get.type(card))) continue; + player.storage.dcfengying.add(card.name); + } + player.storage.dcfengying.sort((a, b) => { + return lib.inpile.indexOf(a) - lib.inpile.indexOf(b); + }); + }, + }, + used: { + charlotte: true, + onremove: true, + intro: { + content: "已使用过$", + }, + }, + }, + }, + dcshouze: { + audio: true, + trigger: { player: "phaseJieshuBegin" }, + forced: true, + filter: function (event, player) { + return player.countMark("dclingfang") > 0; + }, + content: function () { + "step 0"; + player.removeMark("dclingfang", 1); + ("step 1"); + var card = get.discardPile((card) => get.color(card, false) == "black"); + if (card) player.gain(card, "gain2"); + player.loseHp(); + }, + ai: { + combo: "dclingfang", + }, + }, + //袁姬 + dcmengchi: { + audio: "dcfangdu", + trigger: { player: ["linkBefore", "damageEnd"] }, + forced: true, + filter: function (event, player) { + var num = player.getStat("gain"); + if (num && num > 0) return false; + if (event.name == "link") return !player.isLinked(); + return event.hasNature(); + }, + content: function () { + if (trigger.name == "link") trigger.cancel(); + else player.recover(); + }, + ai: { + effect: { + target: function (card, player, target, current) { + if ( + get.itemtype(player) != "player" || + player._dcmengchi_aiChecking || + target.getStat("gain") + ) + return; + if (card.name == "tiesuo" && !target.isLinked()) return 0; + if (player.hasSkillTag("jueqing", false, target)) return; + if (!get.tag(card, "damage") || get.tag(card, "natureDamage")) return; + if (target.hp <= 1) return 0.75; + if ( + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) && + player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + }) + ) { + if (target.hp > 2) return 0.5; + return 0.75; + } + if (get.attitude(player, target) > 0) return [0, 0]; + var sha = player.getCardUsable({ name: "sha" }); + player._dcmengchi_aiChecking = true; + var num = player.countCards("h", function (card) { + if (get.name(card) == "sha") { + if (sha == 0) return false; + else sha--; + } + return ( + player.canUse(card, target) && + get.effect(target, card, player, player) > 0 + ); + }); + delete player._dcmengchi_aiChecking; + if (player.hasSkillTag("damage")) num++; + if (num < 2) return [0, 0]; + }, + }, + }, + mod: { + cardEnabled: function (card, player) { + if (!player.getStat("gain")) return false; + }, + cardSavable: function (card, player) { + if (!player.getStat("gain")) return false; + }, + }, + }, + dcfangdu: { + audio: 2, + trigger: { + player: "damageEnd", + }, + forced: true, + filter: function (event, player) { + if (player == _status.currentPhase) return false; + return ( + (!event.hasNature() && + !player.hasHistory( + "damage", + (evt) => { + return !evt.hasNature() && evt != event; + }, + event + )) || + (event.hasNature() && + !player.hasHistory( + "damage", + (evt) => { + return evt.hasNature() && evt != event; + }, + event + ) && + event.source && + event.source.isIn() && + event.source.countGainableCards(player, "h")) + ); + }, + content: function () { + "step 0"; + if (!trigger.hasNature()) { + player.recover(); + } else { + var cards = trigger.source.getGainableCards(player, "h"); + if (cards.length) { + player.gain(cards.randomGet(), trigger.source, "giveAuto", "bySelf"); + } + } + }, + ai: { + effect: { + target: function (card, player, target) { + if (player._dcfangdu_aiChecking || target == _status.currentPhase) return; + if (!get.tag(card, "damage") || player.hasSkillTag("jueqing", false, target)) + return; + if ( + _status.event.getParent("useCard", true) || + _status.event.getParent("_wuxie", true) + ) + return; + if (!get.tag(card, "natureDamage")) { + if (target.hasHistory("damage", (evt) => !evt.hasNature())) return 1.5; + else if ( + target.hp <= 1 || + (player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + }) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + })) + ) + return 0.75; + else { + if (get.attitude(player, target) > 0) return [0, 0]; + var sha = player.getCardUsable({ name: "sha" }); + player._dcfangdu_aiChecking = true; + var num = player.countCards("h", function (card) { + if (get.name(card) == "sha") { + if (sha == 0) return false; + else sha--; + } + return ( + player.canUse(card, target) && + get.effect(target, card, player, player) > 0 + ); + }); + delete player._dcfangdu_aiChecking; + if (player.hasSkillTag("damage")) num++; + if (num < 2) return [0, 0]; + } + } + if ( + get.tag(card, "natureDamage") && + !target.hasHistory("damage", (evt) => evt.hasNature()) && + player.countCards("he") > 1 + ) + return [1, 1, 1, -1]; + }, + }, + }, + }, + dcjiexing: { + audio: 2, + trigger: { player: ["recoverEnd", "damageEnd", "loseHpEnd"] }, + check: function (event, player) { + var current = _status.currentPhase; + if (!player.hasSkill("dcmengchi") || get.attitude(player, current) >= 0) return true; + var num = player.getStat("gain"); + if (num && num > 0) return true; + if ( + current.countCards( + "hs", + (card) => + current.canUse(card, player) && get.effect(player, card, current, player) < 0 + ) >= 2 + ) + return false; + return true; + }, + frequent: "check", + content: function () { + player.draw().gaintag = ["dcjiexing"]; + player.addTempSkill("dcjiexing_add"); + }, + subSkill: { + add: { + charlotte: true, + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("dcjiexing")) return true; + }, + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcjiexing")) return false; + }, + }, + onremove: function (player) { + player.removeGaintag("dcjiexing"); + }, + }, + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "recover")) return [1, 1]; + if (get.tag(card, "damage")) { + var draw = 0.9; + if (target.hasSkill("dcmengchi") && target.getStat("gain")) draw = 1.8; + if ( + target.hp <= 1 || + (card.name == "sha" && player.hasSkill("jiu")) || + (get.itemtype(player) == "player" && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) && + player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + })) + ) { + if (target.hp > 2) return [1, draw]; + return; + } + return [1, draw]; + } + }, + }, + }, + }, + //朱建平 + olddcxiangmian: { + audio: "dcxiangmian", + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + !player.getStorage("olddcxiangmian").includes(event.player) && player != event.player + ); + }, + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) < 0; + }, + content: function () { + "step 0"; + player + .judge((card) => 2 / Math.sqrt(get.number(card, false))) + .set("judge2", (result) => result.bool); + ("step 1"); + player.markAuto("olddcxiangmian", [trigger.player]); + trigger.player.addSkill("olddcxiangmian_countdown"); + if (!trigger.player.storage["olddcxiangmian_countdown"]) + trigger.player.storage["olddcxiangmian_countdown"] = []; + [player.playerid, result.suit, result.number].forEach((i) => + trigger.player.storage["olddcxiangmian_countdown"].push(i) + ); + trigger.player.markSkill("olddcxiangmian_countdown"); + }, + intro: { content: "已对$发动过技能" }, + ai: { + expose: 0.3, + }, + subSkill: { + countdown: { + trigger: { player: "useCardAfter" }, + mark: true, + marktext: "噬", + silent: true, + forced: true, + charlotte: true, + intro: { + markcount: function (storage) { + if (storage) { + var list = storage.filter((_, i) => i % 3 == 2); + return Math.min.apply(null, list); + } + }, + content: function (storage, player) { + var str = "使用"; + for (var i = 0; i < storage.length / 3; i++) { + str += + get.cnNumber(storage[i * 3 + 2]) + + "张" + + get.translation(storage[i * 3 + 1]) + + "牌、"; + } + str = str.slice(0, -1); + str += "后,失去等同于体力值的体力"; + return str; + }, + }, + filter: function (event, player) { + if (!player.getStorage("olddcxiangmian_countdown").length) return false; + return player + .getStorage("olddcxiangmian_countdown") + .filter((_, i) => i % 3 == 1) + .includes(get.suit(event.card, player)); + }, + content: function () { + "step 0"; + var storage = player.getStorage("olddcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 1] == get.suit(trigger.card, player)) { + storage[i * 3 + 2]--; + } + } + player.markSkill("olddcxiangmian_countdown"); + ("step 1"); + var storage = player.getStorage("olddcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 2] <= 0) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + player.logSkill("olddcxiangmian_countdown"); + var target = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.storage["olddcxiangmian_countdown"].splice(i * 3, 3); + if (!player.getStorage("olddcxiangmian_countdown").length) { + player.removeSkill("olddcxiangmian_countdown"); + } + if (player.hp > 0) player.loseHp(player.hp); + i--; + } + } + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (typeof card != "object") return; + var storage = player.getStorage("olddcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if ( + get.suit(card, player) == storage[i * 3 + 1] && + storage[i * 3 + 2] == 1 && + !player.canSave(player) && + !get.tag(card, "save") + ) + return "zeroplayertarget"; + } + }, + }, + }, + }, + }, + }, + dcxiangmian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => + lib.skill.dcxiangmian.filterTarget(null, player, current) + ); + }, + filterTarget: function (card, player, target) { + return !player.getStorage("dcxiangmian").includes(target) && player != target; + }, + content: function () { + "step 0"; + target + .judge((card) => -2 / Math.sqrt(get.number(card, false))) + .set("judge2", (result) => (result.bool === false ? true : false)); + ("step 1"); + player.markAuto("dcxiangmian", [target]); + target.addSkill("dcxiangmian_countdown"); + if (!target.storage["dcxiangmian_countdown"]) + target.storage["dcxiangmian_countdown"] = []; + [player.playerid, result.suit, result.number].forEach((i) => + target.storage["dcxiangmian_countdown"].push(i) + ); + target.markSkill("dcxiangmian_countdown"); + }, + intro: { content: "已对$发动过技能" }, + ai: { + expose: 0.3, + order: 10, + result: { target: -5 }, + }, + subSkill: { + countdown: { + trigger: { player: "useCardAfter" }, + mark: true, + marktext: "💀", + silent: true, + forced: true, + charlotte: true, + intro: { + markcount: function (storage) { + if (storage) { + var list = storage.filter((_, i) => i % 3 == 2); + return Math.min.apply(null, list); + } + }, + content: function (storage, player) { + if (!storage) return; + var str = "使用"; + str += + get.cnNumber( + Math.min.apply( + null, + storage.filter((_, i) => i % 3 == 2) + ) + ) + "张牌后,或使用一张"; + for (var i = 0; i < storage.length / 3; i++) { + str += get.translation(storage[i * 3 + 1]) + "、"; + } + str = str.slice(0, -1); + str += "后,失去等同于体力值的体力"; + return str; + }, + }, + filter: function (event, player) { + if (!player.getStorage("dcxiangmian_countdown").length) return false; + //return (player.getStorage('dcxiangmian_countdown').filter((_,i)=>i%3==1)).includes(get.suit(event.card,player)); + return true; + }, + content: function () { + "step 0"; + var storage = player.getStorage("dcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 1] == get.suit(trigger.card, player)) { + storage[i * 3 + 2] = 0; + } else storage[i * 3 + 2]--; + } + player.markSkill("dcxiangmian_countdown"); + ("step 1"); + var storage = player.getStorage("dcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if (storage[i * 3 + 2] <= 0) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + player.logSkill("dcxiangmian_countdown"); + player.storage["dcxiangmian_countdown"].splice(i * 3, 3); + if (!player.getStorage("dcxiangmian_countdown").length) { + player.removeSkill("dcxiangmian_countdown"); + } + if (player.hp > 0) player.loseHp(player.hp); + i--; + } + } + }, + ai: { + effect: { + player_use: function (card, player, target) { + if (typeof card != "object") return; + var storage = player.getStorage("dcxiangmian_countdown"); + for (var i = 0; i < storage.length / 3; i++) { + if ( + (storage[i * 3 + 2] == 1 || + get.suit(card, player) == storage[i * 3 + 1]) && + !player.canSave(player) && + !get.tag(card, "save") + ) + return "zeroplayertarget"; + } + }, + }, + }, + }, + }, + }, + dctianji: { + audio: 2, + trigger: { global: "cardsDiscardAfter" }, + forced: true, + filter: function (event, player) { + var evt = event.getParent().relatedEvent; + return evt && evt.name == "judge" && event.cards.filterInD("d").length; + }, + content: function () { + var card = trigger.cards[0], + cards = [], + func = ["type2", "suit", "number"]; + for (var fn of func) { + var cardx = get.cardPile2((cardxx) => { + if (get[fn](card, player) == get[fn](cardxx, player) && !cards.includes(cardxx)) { + return true; + } + }); + if (cardx) cards.push(cardx); + } + /*if(cards.length&&!player.isMaxHandcard(true)) player.draw(); + else*/ if (cards.length) player.gain(cards, "gain2"); + }, + }, + //赵直 + dctongguan: { + trigger: { + global: "phaseBegin", + }, + filter: function (event, player) { + return ( + event.player + .getAllHistory() + .filter((history) => { + return history.isMe && !history.isSkipped; + }) + .indexOf(event.player.getHistory()) === 0 && + lib.skill.dctongguan.derivation.some((i) => { + return (player.getStorage("dctongguan")[i] || 0) < 2; + }) + ); + }, + forced: true, + locked: false, + logTarget: "player", + derivation: [ + "dctongguan_wuyong", + "dctongguan_gangying", + "dctongguan_duomou", + "dctongguan_guojue", + "dctongguan_renzhi", + ], + content: function () { + "step 0"; + var skills = lib.skill.dctongguan.derivation.slice(); + player + .chooseControl( + skills.filter((i) => { + return (player.getStorage("dctongguan")[i] || 0) < 2; + }) + ) + .set( + "choiceList", + skills.map((i) => { + var info = ""; + switch (player.getStorage("dctongguan")[i]) { + case 1: + info = ' style="opacity:0.65;"'; + break; + case 2: + info = ' style="text-decoration:line-through; opacity:0.3;"'; + break; + } + return ( + '
    「' + + get.translation( + lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) + ) + + "」
    " + + "" + + get.skillInfoTranslation(i, player) + + "(已选过" + + get.cnNumber(player.getStorage("dctongguan")[i] || 0) + + "次)" + + "" + ); + }) + ) + .set("displayIndex", false) + .set("prompt", "统观:为" + get.translation(trigger.player) + "选择一个属性") + .set("ai", function () { + var controls = _status.event.controls, + target = _status.event.getTrigger().player; + var str = target + .getSkills(null, false, false) + .map((i) => get.skillInfoTranslation(i)) + .join(""); + var choices = []; + if ( + controls.includes("dctongguan_wuyong") && + /你对\S{1,15}造成\S{1,10}伤害/.test(str) + ) + choices.push("dctongguan_wuyong"); + if ( + controls.includes("dctongguan_gangying") && + /回复\S{1,5}体力/.test(str) && + _status.event.player.getFriends().length + ) + choices.push("dctongguan_gangying"); + if ( + controls.includes("dctongguan_duomou") && + /你(可|可以)?摸\S{1,3}张牌/.test(str) + ) + choices.push("dctongguan_duomou"); + if ( + controls.includes("dctongguan_guojue") && + /(当【过河拆桥】使用|((弃置|获得)\S{1,5}其他角色\S{1,7}牌|))/.test(str) + ) + choices.push("dctongguan_guojue"); + if ( + controls.includes("dctongguan_renzhi") && + /交给\S{0,5}其他角色/.test(str) && + _status.event.player.getFriends().length + ) + choices.push("dctongguan_renzhi"); + if (choices.length) return choices.randomGet(); + return _status.event.controls.randomGet(); + }); + ("step 1"); + if (result.control) { + var skill = result.control; + var func = lib.skill.dctongguan.localMark; + if (event.player == game.me) func(skill, trigger.player); + else if (event.isOnline()) player.send(func, skill, trigger.player); + // game.log(player,'为',trigger.player,'选择了','#g「'+get.translation(skill)+'」','属性'); + game.log(player, "为", trigger.player, "选择了", "#g一个属性"); + // player.popup(skill); + trigger.player.addSkill(skill); + if (!player.storage.dctongguan) player.storage.dctongguan = {}; + if (!player.storage.dctongguan[skill]) player.storage.dctongguan[skill] = 0; + player.storage.dctongguan[skill]++; + } + }, + localMark: function (skill, player) { + var name = skill, + info; + if (player.marks[name]) player.updateMarks(); + if (lib.skill[name]) info = lib.skill[name].intro; + if (!info) return; + if (player.marks[name]) player.marks[name].info = info; + else player.marks[name] = player.mark(name, info); + player.updateMarks(); + }, + ai: { + combo: "dcmengjie", + }, + subSkill: { + forceFinish: { charlotte: true }, + wuyong: { + marktext: "勇", + intro: { + name: "武勇", + content: "属性目标:造成伤害", + }, + charlotte: true, + silent: true, + nopop: true, + }, + gangying: { + marktext: "刚", + intro: { + name: "刚硬", + content: "属性目标:回复体力,或于得到牌后手牌数大于体力值", + }, + charlotte: true, + silent: true, + forced: true, + nopop: true, + lastDo: true, + trigger: { player: "gainEnd" }, + filter: function (event, player) { + return player.countCards("h") > player.hp; + }, + content: function () { + trigger._dctongguan_gangying = true; + }, + }, + duomou: { + marktext: "谋", + intro: { + name: "多谋", + content: "属性目标:于摸牌阶段外摸牌", + }, + charlotte: true, + silent: true, + nopop: true, + }, + guojue: { + marktext: "决", + intro: { + name: "果决", + content: "属性目标:弃置或获得其他角色牌", + }, + charlotte: true, + silent: true, + nopop: true, + }, + renzhi: { + marktext: "仁", + intro: { + name: "仁智", + content: "属性目标:交给其他角色牌", + }, + charlotte: true, + silent: true, + nopop: true, + }, + }, + }, + dcmengjie: { + trigger: { + global: "phaseEnd", + }, + forced: true, + direct: true, + locked: false, + filter: function (event, player) { + var target = event.player; + if ( + (target.hasSkill("dctongguan_gangying") && + (target.hasHistory("gain", function (evt) { + return evt._dctongguan_gangying == true; + }) || + game.getGlobalHistory("changeHp", function (evt) { + return ( + evt.player == target && + (evt.getParent().name == "recover" || + target.countCards("h") > target.hp) + ); + }).length > 0)) || + (target.hasSkill("dctongguan_wuyong") && target.getHistory("sourceDamage").length) || + (target.hasSkill("dctongguan_duomou") && + target.getHistory( + "gain", + (evt) => + evt.getParent().name == "draw" && + evt.getParent("phaseDraw").name != "phaseDraw" + ).length) + ) { + return true; + } + var guojue = false, + renzhi = false; + game.countPlayer2((current) => { + if (current == target) return false; + if ( + !guojue && + current.hasHistory("lose", (evt) => { + if (evt.type == "discard") { + if ((evt.discarder || evt.getParent(2).player) != target) return false; + if (!evt.getl(current).cards2.length) return false; + return true; + } else if (evt.type == "gain") { + var evtx = evt.getParent(); + if (evtx.giver || evtx.getParent().name == "gift") return false; + var cards = evtx.getg(target); + if (!cards.length) return false; + var cards2 = evtx.getl(current).cards2; + for (var card of cards2) { + if (cards.includes(card)) return true; + } + } + return false; + }) + ) + guojue = true; + if ( + !renzhi && + current.hasHistory("gain", (evt) => { + if (evt.giver != target || evt.getParent().name == "gift") return false; + return evt.cards.length; + }) + ) + renzhi = true; + }); + return ( + (target.hasSkill("dctongguan_guojue") && guojue) || + (target.hasSkill("dctongguan_renzhi") && renzhi) + ); + }, + rules: [ + (target) => target.getHistory("sourceDamage").length, + (target) => + target.hasHistory("gain", function (evt) { + return evt._dctongguan_gangying; + }) || + game.getGlobalHistory("changeHp", function (evt) { + return evt.player == target && evt.getParent().name == "recover"; + }).length > 0 || + target.countCards("h") > target.hp, + (target) => + target.getHistory( + "gain", + (evt) => + evt.getParent().name == "draw" && + evt.getParent("phaseDraw").name != "phaseDraw" + ).length, + (target, bool) => bool, + (target, bool) => bool, + ], + content: function () { + "step 0"; + event.nowProperty = 0; + var target = trigger.player; + var guojue = false, + renzhi = false; + game.countPlayer2((current) => { + if (current == target) return false; + if ( + !guojue && + current.hasHistory("lose", (evt) => { + if (evt.type == "discard") { + if ((evt.discarder || evt.getParent(2).player) != target) return false; + if (!evt.getl(current).cards2.length) return false; + return true; + } else if (evt.type == "gain") { + var evtx = evt.getParent(); + if (evtx.giver || evtx.getParent().name == "gift") return false; + var cards = evtx.getg(target); + if (!cards.length) return false; + var cards2 = evtx.getl(current).cards2; + for (var card of cards2) { + if (cards.includes(card)) return true; + } + } + return false; + }) + ) + guojue = true; + if ( + !renzhi && + current.hasHistory("gain", (evt) => { + if (evt.giver != target || evt.getParent().name == "gift") return false; + return evt.cards.length; + }) + ) + renzhi = true; + }); + event.guojue = guojue; + event.renzhi = renzhi; + ("step 1"); + if (event.nowProperty >= 5) { + event.finish(); + return; + } + var skills = lib.skill.dctongguan.derivation; + if ( + trigger.player.hasSkill(skills[event.nowProperty]) && + lib.skill.dcmengjie.rules[event.nowProperty]( + trigger.player, + event[event.nowProperty == 3 ? "guojue" : "renzhi"] + ) + ) { + event.goto(2 + event.nowProperty * 2); } else event.redo(); event.nowProperty++; - 'step 2' - if(!game.hasPlayer(current=>current!=player)) event._result={bool:false}; - else player.chooseTarget('梦解:对一名其他角色造成1点伤害',true,lib.filter.notMe).set('ai',target=>get.damageEffect(target,player,player)); - 'step 3' - if(result.bool){ - player.logSkill('dcmengjie',result.targets[0]); + ("step 2"); + if (!game.hasPlayer((current) => current != player)) event._result = { bool: false }; + else + player + .chooseTarget("梦解:对一名其他角色造成1点伤害", true, lib.filter.notMe) + .set("ai", (target) => get.damageEffect(target, player, player)); + ("step 3"); + if (result.bool) { + player.logSkill("dcmengjie", result.targets[0]); result.targets[0].damage(); } game.delayx(); event.goto(1); - 'step 4' - if(game.hasPlayer(target=>target!=player&&target.isDamaged())) player.chooseTarget('梦解:令一名角色回复1点体力',function(card,player,target){ - return target.isDamaged(); - }).set('ai',target=>get.recoverEffect(target,player,player)); - else event._result={bool:false}; - 'step 5' - if(result.bool){ - player.logSkill('dcmengjie',result.targets[0]); + ("step 4"); + if (game.hasPlayer((target) => target != player && target.isDamaged())) + player + .chooseTarget("梦解:令一名角色回复1点体力", function (card, player, target) { + return target.isDamaged(); + }) + .set("ai", (target) => get.recoverEffect(target, player, player)); + else event._result = { bool: false }; + ("step 5"); + if (result.bool) { + player.logSkill("dcmengjie", result.targets[0]); result.targets[0].recover(); } game.delayx(); event.goto(1); - 'step 6' - player.logSkill('dcmengjie'); + ("step 6"); + player.logSkill("dcmengjie"); player.draw(2); - 'step 7' + ("step 7"); game.delayx(); event.goto(1); - 'step 8' - if(game.hasPlayer(target=>target.countDiscardableCards(player,'hej'))) player.chooseTarget('梦解:弃置一名角色区域内至多两张牌',true,(card,player,target)=>{ - return target.countDiscardableCards(player,'hej'); - }).set('ai',target=>get.effect(target,{name:'guohe'},player,player)); - else event._result={bool:false}; - 'step 9' - if(result.bool){ - player.logSkill('dcmengjie',result.targets[0]); - player.discardPlayerCard(result.targets[0],true,'hej',[1,2]); + ("step 8"); + if (game.hasPlayer((target) => target.countDiscardableCards(player, "hej"))) + player + .chooseTarget( + "梦解:弃置一名角色区域内至多两张牌", + true, + (card, player, target) => { + return target.countDiscardableCards(player, "hej"); + } + ) + .set("ai", (target) => get.effect(target, { name: "guohe" }, player, player)); + else event._result = { bool: false }; + ("step 9"); + if (result.bool) { + player.logSkill("dcmengjie", result.targets[0]); + player.discardPlayerCard(result.targets[0], true, "hej", [1, 2]); } game.delayx(); event.goto(1); - 'step 10' - if(!game.hasPlayer(current=>current!=player)) event._result={bool:false}; - else player.chooseTarget('梦解:令一名其他角色将手牌补至上限',true,(card,player,target)=>{ - return target!=player; - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - if(target.hasSkillTag('nogain')) att/=6; - if(att>2){ - return Math.min(5,target.maxHp)-target.countCards('h'); - } - return att/3; - }); - 'step 11' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcmengjie',target); - var num=Math.min(5,target.maxHp-target.countCards('h')); + ("step 10"); + if (!game.hasPlayer((current) => current != player)) event._result = { bool: false }; + else + player + .chooseTarget( + "梦解:令一名其他角色将手牌补至上限", + true, + (card, player, target) => { + return target != player; + } + ) + .set("ai", (target) => { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) { + return Math.min(5, target.maxHp) - target.countCards("h"); + } + return att / 3; + }); + ("step 11"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcmengjie", target); + var num = Math.min(5, target.maxHp - target.countCards("h")); target.draw(num); } game.delayx(); event.goto(1); }, - ai:{ - combo:'dctongguan' - } + ai: { + combo: "dctongguan", + }, }, //刘晔 - dcpoyuan:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:['phaseZhunbeiBegin','enterGame'], + dcpoyuan: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["phaseZhunbeiBegin", "enterGame"], }, - filter:function(event,player){ - if(event.name=='phase'&&game.phaseNumber>0) return false; - if(player.getEquip('pilitoushiche')){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countDiscardableCards(player,'he')>0; + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber > 0) return false; + if (player.getEquip("pilitoushiche")) { + return game.hasPlayer(function (current) { + return current != player && current.countDiscardableCards(player, "he") > 0; }); - } - else{ + } else { return player.hasEquipableSlot(5); } }, - direct:true, - content:function(){ - 'step 0' - if(player.getEquip('pilitoushiche')){ + direct: true, + content: function () { + "step 0"; + if (player.getEquip("pilitoushiche")) { event.goto(2); - player.chooseTarget(get.prompt('dcpoyuan'),'弃置一名其他角色的至多两张牌',function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'he')>0; - }).set('ai',function(target){ - var player=_status.event.player,cards=target.getDiscardableCards(player,'he'); - var att=get.attitude(player,target); - if(att<0&&target.hasSkillTag('noe')) att/=2; - var zheng=[],fu=[]; - for(var i of cards){ - var val=get.value(i,target); - if(val>0) zheng.push(i); - else fu.push(i); - } - zheng.sort((a,b)=>get.value(b,target)-get.value(a,target)); - fu.sort((a,b)=>get.value(b,target)-get.value(a,target)); - zheng=zheng.slice(0,2); - fu=fu.slice(0,2); - var eff1=0,eff2=0; - for(var i of zheng) eff1+=get.value(i,target); - for(var i of fu){ - if(get.position(i)=='e') eff2+=(1-get.value(i,target)); - } - return -att*Math.max(eff1,eff2); - }); + player + .chooseTarget( + get.prompt("dcpoyuan"), + "弃置一名其他角色的至多两张牌", + function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + cards = target.getDiscardableCards(player, "he"); + var att = get.attitude(player, target); + if (att < 0 && target.hasSkillTag("noe")) att /= 2; + var zheng = [], + fu = []; + for (var i of cards) { + var val = get.value(i, target); + if (val > 0) zheng.push(i); + else fu.push(i); + } + zheng.sort((a, b) => get.value(b, target) - get.value(a, target)); + fu.sort((a, b) => get.value(b, target) - get.value(a, target)); + zheng = zheng.slice(0, 2); + fu = fu.slice(0, 2); + var eff1 = 0, + eff2 = 0; + for (var i of zheng) eff1 += get.value(i, target); + for (var i of fu) { + if (get.position(i) == "e") eff2 += 1 - get.value(i, target); + } + return -att * Math.max(eff1, eff2); + }); + } else { + player + .chooseBool(get.prompt("dcpoyuan"), "装备一张【霹雳投石车】") + .set("ai", function () { + return true; + }); } - else{ - player.chooseBool(get.prompt('dcpoyuan'),'装备一张【霹雳投石车】').set('ai',function(){ - return true; - }) - } - 'step 1' - if(result.bool){ - player.logSkill('dcpoyuan'); - var card=game.createCard('pilitoushiche','diamond',9); + ("step 1"); + if (result.bool) { + player.logSkill("dcpoyuan"); + var card = game.createCard("pilitoushiche", "diamond", 9); player.$gain2(card); game.delayx(); player.equip(card); } event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcpoyuan',target); - player.discardPlayerCard(target,true,'he',[1,2]) + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcpoyuan", target); + player.discardPlayerCard(target, true, "he", [1, 2]); } }, }, - dchuace:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return event.dchuace&&event.dchuace.length>0&&player.countCards('hs')>0; + dchuace: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return event.dchuace && event.dchuace.length > 0 && player.countCards("hs") > 0; }, - onChooseToUse:function(event){ - if(game.online||event.dchuace) return; - var list=lib.inpile.filter(function(i){ - return get.type(i)=='trick'&&lib.filter.filterCard({name:i},event.player,event); + onChooseToUse: function (event) { + if (game.online || event.dchuace) return; + var list = lib.inpile.filter(function (i) { + return ( + get.type(i) == "trick" && lib.filter.filterCard({ name: i }, event.player, event) + ); }); - if(!list.length){ - event.set('dchuace',list); + if (!list.length) { + event.set("dchuace", list); return; } - var history=_status.globalHistory; - var stop=false; - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - if(!stop){ - if(evt.isRound) stop=true; + var history = _status.globalHistory; + var stop = false; + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + if (!stop) { + if (evt.isRound) stop = true; continue; - } - else{ - for(var j of evt.useCard) list.remove(j.card.name); - if(evt.isRound) break; + } else { + for (var j of evt.useCard) list.remove(j.card.name); + if (evt.isRound) break; } } - event.set('dchuace',list); + event.set("dchuace", list); }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('画策',[event.dchuace,'vcard'],'hidden'); + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("画策", [event.dchuace, "vcard"], "hidden"); }, - check:function(button){ - var player=_status.event.player,card={name:button.link[2]}; + check: function (button) { + var player = _status.event.player, + card = { name: button.link[2] }; return player.getUseValue(card); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'dchuace', - viewAs:{name:links[0][2]}, - ai1:(card)=>7-get.value(card), - filterCard:true, - position:'hs', - popname:true, - } + audio: "dchuace", + viewAs: { name: links[0][2] }, + ai1: (card) => 7 - get.value(card), + filterCard: true, + position: "hs", + popname: true, + }; }, - prompt:function(links,player){ - return '将一张手牌当做【'+get.translation(links[0][2])+'】使用'; + prompt: function (links, player) { + return "将一张手牌当做【" + get.translation(links[0][2]) + "】使用"; }, }, - ai:{ - order:6, - result:{player:1}, + ai: { + order: 6, + result: { player: 1 }, }, - subSkill:{backup:{}}, + subSkill: { backup: {} }, }, - pilitoushiche:{ - trigger:{player:['useCard','respond']}, - forced:true, - equipSkill:true, - filter:function(event,player){ - return get.type(event.card)=='basic'; + pilitoushiche: { + trigger: { player: ["useCard", "respond"] }, + forced: true, + equipSkill: true, + filter: function (event, player) { + return get.type(event.card) == "basic"; }, - content:function(){ - if(player==_status.currentPhase) trigger.baseDamage++; + content: function () { + if (player == _status.currentPhase) trigger.baseDamage++; else player.draw(); }, - mod:{ - targetInRange:function(card,player){ - if(get.type(card)=='basic'&&player==_status.currentPhase) return true; + mod: { + targetInRange: function (card, player) { + if (get.type(card) == "basic" && player == _status.currentPhase) return true; }, - } + }, }, //路易 - dcyaoyi:{ - audio:2, - getZhuanhuanji:function(player,bool){ - var skills=player.getSkills(null,false,false).filter(function(i){ - return get.is.zhuanhuanji(i,player); + dcyaoyi: { + audio: 2, + getZhuanhuanji: function (player, bool) { + var skills = player.getSkills(null, false, false).filter(function (i) { + return get.is.zhuanhuanji(i, player); }); - if(!bool) return skills; - if(!skills.length) return 'none'; - var state=lib.skill.dcyaoyi.getState(player,skills[0]); - for(var i=1;i0&&!player.getStat('skill').dcshoutan; + dcshoutan: { + audio: 2, + enable: "phaseUse", + position: "h", + filter: function (event, player) { + if (player.hasSkill("dcyaoyi")) + return !player.hasSkill("dcshoutan_blocker", null, null, false); + return player.countCards("h") > 0 && !player.getStat("skill").dcshoutan; }, - selectCard:function(){ - if(_status.event.player.hasSkill('dcyaoyi')) return [0,1]; - return [1,1]; + selectCard: function () { + if (_status.event.player.hasSkill("dcyaoyi")) return [0, 1]; + return [1, 1]; }, - filterCard:function(card,player){ - if(player.hasSkill('dcyaoyi')) return false; - var color=get.color(card,player); - if(player.storage.dcshoutan) return color=='black'; - return color!='black'; + filterCard: function (card, player) { + if (player.hasSkill("dcyaoyi")) return false; + var color = get.color(card, player); + if (player.storage.dcshoutan) return color == "black"; + return color != "black"; }, - prompt:function(){ - var player=_status.event.player; - if(player.hasSkill('dcyaoyi')) return '点击“确认”来变更转换技状态'; - if(player.storage.dcshoutan) return '弃置一张黑色手牌,变更转换技状态'; - return '弃置一张非黑色手牌,变更转换技状态'; + prompt: function () { + var player = _status.event.player; + if (player.hasSkill("dcyaoyi")) return "点击“确认”来变更转换技状态"; + if (player.storage.dcshoutan) return "弃置一张黑色手牌,变更转换技状态"; + return "弃置一张非黑色手牌,变更转换技状态"; }, - check:function(card){ - return 11-get.value(card); + check: function (card) { + return 11 - get.value(card); }, - content:function(){ - player.changeZhuanhuanji('dcshoutan'); - player.addTempSkill('dcshoutan_blocker',{player:['useCard1','useSkillBegin','phaseUseEnd']}); + content: function () { + player.changeZhuanhuanji("dcshoutan"); + player.addTempSkill("dcshoutan_blocker", { + player: ["useCard1", "useSkillBegin", "phaseUseEnd"], + }); }, - zhuanhuanji:true, - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - if(storage) return '转换技。出牌阶段限一次,你可以弃置一张黑色手牌。'; - return '转换技。出牌阶段限一次,你可以弃置一张不为黑色的手牌。'; + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: function (storage, player) { + if (storage) return "转换技。出牌阶段限一次,你可以弃置一张黑色手牌。"; + return "转换技。出牌阶段限一次,你可以弃置一张不为黑色的手牌。"; }, }, - ai:{ - order:0.1, - result:{ - player:function(player){ - var base=0; - if(ui.selected.cards.length) base=get.value(ui.selected.cards[0]); - var status=player.storage.dcshoutan; - var cards=player.getCards('hs',function(card){ + ai: { + order: 0.1, + result: { + player: function (player) { + var base = 0; + if (ui.selected.cards.length) base = get.value(ui.selected.cards[0]); + var status = player.storage.dcshoutan; + var cards = player.getCards("hs", function (card) { return !ui.selected.cards.includes(card); }); - for(var card of cards){ - var val1=player.getUseValue(card,null,true); - player.storage.dcshoutan=!status; - var val2=0; - try{ - val2=player.getUseValue(card,null,true); - }catch(e){ - player.storage.dcshoutan=status; + for (var card of cards) { + var val1 = player.getUseValue(card, null, true); + player.storage.dcshoutan = !status; + var val2 = 0; + try { + val2 = player.getUseValue(card, null, true); + } catch (e) { + player.storage.dcshoutan = status; } - player.storage.dcshoutan=status; - if(val2>val1) base-=(val2-val1); + player.storage.dcshoutan = status; + if (val2 > val1) base -= val2 - val1; } - if(base<0) return 1; + if (base < 0) return 1; return 0; }, }, }, - subSkill:{blocker:{charlotte:true}}, + subSkill: { blocker: { charlotte: true } }, }, - dcfuxue:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return player.hp>0&&ui.discardPile.childNodes.length>0; + dcfuxue: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.hp > 0 && ui.discardPile.childNodes.length > 0; }, - content:function(){ - 'step 0' - var cards=Array.from(ui.discardPile.childNodes); - var gains=cards.slice(0); - var history=game.getAllGlobalHistory('cardMove',function(evt){ - if(evt.name=='lose') return evt.position==ui.discardPile; - return evt.name=='cardsDiscard'; + content: function () { + "step 0"; + var cards = Array.from(ui.discardPile.childNodes); + var gains = cards.slice(0); + var history = game.getAllGlobalHistory("cardMove", function (evt) { + if (evt.name == "lose") return evt.position == ui.discardPile; + return evt.name == "cardsDiscard"; }); - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - var cards2=evt.cards.filter(function(card){ + for (var i = history.length - 1; i >= 0; i--) { + var evt = history[i]; + var cards2 = evt.cards.filter(function (card) { return cards.includes(card); }); - if(cards2.length){ - if(lib.skill.dcfuxue.isUse(evt)){ + if (cards2.length) { + if (lib.skill.dcfuxue.isUse(evt)) { gains.removeArray(cards2); } cards.removeArray(cards2); } - if(!cards.length) break; + if (!cards.length) break; } - if(gains.length){ - var num=player.hp; - player.chooseButton([ - '复学:选择获得'+(num>0?'至多':'')+get.cnNumber(num)+'张牌', - gains, - ],[1,num]).set('ai',function(button){ - var player=_status.event.player,card=button.link; - var getn=function(card){ - return player.countCards('h',card.name)+ui.selected.buttons.filter((button)=>button.link.name==card.name).length; - } - var val=player.getUseValue(card); - if(card.name=='tao'&&getn(card)>=player.getDamagedHp()) return 0; - if(card.name=='sha'&&getn(card)>=player.getCardUsable('sha')) return 0; - return val; - }); - } - else event.finish(); - 'step 1' - if(result.bool){ - player.logSkill('dcfuxue'); - player.gain(result.links,'gain2').gaintag.add('dcfuxue'); + if (gains.length) { + var num = player.hp; + player + .chooseButton( + [ + "复学:选择获得" + (num > 0 ? "至多" : "") + get.cnNumber(num) + "张牌", + gains, + ], + [1, num] + ) + .set("ai", function (button) { + var player = _status.event.player, + card = button.link; + var getn = function (card) { + return ( + player.countCards("h", card.name) + + ui.selected.buttons.filter((button) => button.link.name == card.name) + .length + ); + }; + var val = player.getUseValue(card); + if (card.name == "tao" && getn(card) >= player.getDamagedHp()) return 0; + if (card.name == "sha" && getn(card) >= player.getCardUsable("sha")) return 0; + return val; + }); + } else event.finish(); + ("step 1"); + if (result.bool) { + player.logSkill("dcfuxue"); + player.gain(result.links, "gain2").gaintag.add("dcfuxue"); } }, - isUse:function(event){ - if(event.name!='cardsDiscard') return false; - var evtx=event.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evt2=(evtx.relatedEvent||evtx.getParent()); - return (evt2.name=='phaseJudge'||evt2.name=='useCard'); + isUse: function (event) { + if (event.name != "cardsDiscard") return false; + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evt2 = evtx.relatedEvent || evtx.getParent(); + return evt2.name == "phaseJudge" || evt2.name == "useCard"; }, - group:'dcfuxue_draw', - subSkill:{ - draw:{ - audio:'dcfuxue', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - mod:{ - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('dcfuxue')) return num+0.5; + group: "dcfuxue_draw", + subSkill: { + draw: { + audio: "dcfuxue", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcfuxue")) + return num + 0.5; }, }, - filter:function(event,player){ - return player.hp>0&&!player.hasCard(function(card){ - return card.hasGaintag('dcfuxue'); - },'h'); + filter: function (event, player) { + return ( + player.hp > 0 && + !player.hasCard(function (card) { + return card.hasGaintag("dcfuxue"); + }, "h") + ); }, - content:function(){ + content: function () { player.draw(player.hp); }, }, }, }, //丁尚涴 - dcfengyan:{ - enable:'phaseUse', - usable:2, - chooseButton:{ - dialog:function(event,player){ - var dialog=ui.create.dialog('讽言:请选择一项','hidden'); - dialog.add([[ - ['gain','令一名体力值不大于你的其他角色交给你一张手牌'], - ['sha','视为对一名手牌数不大于你的其他角色使用一张【杀】'] - ],'textbutton']); + dcfengyan: { + enable: "phaseUse", + usable: 2, + chooseButton: { + dialog: function (event, player) { + var dialog = ui.create.dialog("讽言:请选择一项", "hidden"); + dialog.add([ + [ + ["gain", "令一名体力值不大于你的其他角色交给你一张手牌"], + ["sha", "视为对一名手牌数不大于你的其他角色使用一张【杀】"], + ], + "textbutton", + ]); return dialog; }, - filter:function(button,player){ - return !player.hasSkill('dcfengyan_'+button.link,null,null,false); + filter: function (button, player) { + return !player.hasSkill("dcfengyan_" + button.link, null, null, false); }, - check:function(button){ - var player=_status.event.player; - if(button.link=='gain'&&game.hasPlayer(function(current){ - return lib.skill.dcfengyan_gain.filterTarget(null,player,current)&&get.effect(current,'dcfengyan_gain',player,player)>0; - })) return 4; - if(button.link=='sha'&&game.hasPlayer(function(current){ - return lib.skill.dcfengyan_sha.filterTarget(null,player,current)&&get.effect(current,'dcfengyan_sha',player,player)>0; - })) return 4; + check: function (button) { + var player = _status.event.player; + if ( + button.link == "gain" && + game.hasPlayer(function (current) { + return ( + lib.skill.dcfengyan_gain.filterTarget(null, player, current) && + get.effect(current, "dcfengyan_gain", player, player) > 0 + ); + }) + ) + return 4; + if ( + button.link == "sha" && + game.hasPlayer(function (current) { + return ( + lib.skill.dcfengyan_sha.filterTarget(null, player, current) && + get.effect(current, "dcfengyan_sha", player, player) > 0 + ); + }) + ) + return 4; return 2; }, - backup:function(links){ - return get.copy(lib.skill['dcfengyan_'+links[0]]); + backup: function (links) { + return get.copy(lib.skill["dcfengyan_" + links[0]]); }, - prompt:function(links){ - if(links[0]=='gain') return '令一名体力值不大于你的其他角色交给你一张手牌'; - return '视为对一名手牌数不大于你的其他角色使用【杀】'; + prompt: function (links) { + if (links[0] == "gain") return "令一名体力值不大于你的其他角色交给你一张手牌"; + return "视为对一名手牌数不大于你的其他角色使用【杀】"; }, }, - ai:{ - order:10, - threaten:1.7, - result:{player:1}, + ai: { + order: 10, + threaten: 1.7, + result: { player: 1 }, }, - subSkill:{ - backup:{audio:'dcfengyan'}, - gain:{ - audio:'dcfengyan', - filterTarget:function(card,player,target){ - return target!=player&&target.hp<=player.hp&&target.countCards('h')>0; + subSkill: { + backup: { audio: "dcfengyan" }, + gain: { + audio: "dcfengyan", + filterTarget: function (card, player, target) { + return target != player && target.hp <= player.hp && target.countCards("h") > 0; }, - filterCard:()=>false, - selectCard:-1, - content:function(){ - 'step 0' - player.addTempSkill('dcfengyan_gain','phaseUseAfter'); - target.chooseCard('h',true,'交给'+get.translation(player)+'一张牌'); - 'step 1' - if(result.bool) target.give(result.cards,player); + filterCard: () => false, + selectCard: -1, + content: function () { + "step 0"; + player.addTempSkill("dcfengyan_gain", "phaseUseAfter"); + target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌"); + ("step 1"); + if (result.bool) target.give(result.cards, player); }, - ai:{ - tag:{ - loseCard:1, - gain:1, + ai: { + tag: { + loseCard: 1, + gain: 1, }, - result:{ - player:0.1, - target:-1, + result: { + player: 0.1, + target: -1, }, }, }, - sha:{ - audio:'dcfengyan', - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')<=player.countCards('h')&&player.canUse('sha',target,false); + sha: { + audio: "dcfengyan", + filterTarget: function (card, player, target) { + return ( + target != player && + target.countCards("h") <= player.countCards("h") && + player.canUse("sha", target, false) + ); }, - filterCard:()=>false, - selectCard:-1, - content:function(){ - player.addTempSkill('dcfengyan_sha','phaseUseAfter'); - player.useCard({ - name:'sha', - isCard:true, - },target,false); + filterCard: () => false, + selectCard: -1, + content: function () { + player.addTempSkill("dcfengyan_sha", "phaseUseAfter"); + player.useCard( + { + name: "sha", + isCard: true, + }, + target, + false + ); }, - ai:{ - result:{ - player:function(player,target){ - return get.effect(target,{ - name:'sha', - isCard:true, - },player,player); + ai: { + result: { + player: function (player, target) { + return get.effect( + target, + { + name: "sha", + isCard: true, + }, + player, + player + ); }, }, }, }, }, }, - dcfudao:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + dcfudao: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&game.hasPlayer((current)=>current!=player); + forced: true, + locked: false, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && + game.hasPlayer((current) => current != player) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(true,lib.filter.notMe,'抚悼:请选择一名“继子”','你或“继子”每回合首次使用牌指定对方为目标后各摸两张牌;杀死你或“继子”的角色称为“决裂”。你或“继子”对“决裂”造成的伤害+1。“决裂”对你使用牌后,其本回合内不能再使用牌。').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dcfudao',target); - game.log(target,'成为了',player,'的继子'); - player.addSkill('dcfudao_effect'); - target.addSkill('dcfudao_effect'); - player.markAuto('dcfudao_effect',[target]); - target.markAuto('dcfudao_effect',[player]); + content: function () { + "step 0"; + player + .chooseTarget( + true, + lib.filter.notMe, + "抚悼:请选择一名“继子”", + "你或“继子”每回合首次使用牌指定对方为目标后各摸两张牌;杀死你或“继子”的角色称为“决裂”。你或“继子”对“决裂”造成的伤害+1。“决裂”对你使用牌后,其本回合内不能再使用牌。" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dcfudao", target); + game.log(target, "成为了", player, "的继子"); + player.addSkill("dcfudao_effect"); + target.addSkill("dcfudao_effect"); + player.markAuto("dcfudao_effect", [target]); + target.markAuto("dcfudao_effect", [player]); } }, - group:'dcfudao_refuse', - subSkill:{ - effect:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - charlotte:true, - usable:1, - filter:function(event,player){ - var target=event.target; - if(player==target||!target.isIn()) return false; - return player.getStorage('dcfudao_effect').includes(target); + group: "dcfudao_refuse", + subSkill: { + effect: { + trigger: { player: "useCardToPlayered" }, + forced: true, + charlotte: true, + usable: 1, + filter: function (event, player) { + var target = event.target; + if (player == target || !target.isIn()) return false; + return player.getStorage("dcfudao_effect").includes(target); }, - logTarget:'target', - content:function(){ - 'step 0' - var list=[player,trigger.target]; + logTarget: "target", + content: function () { + "step 0"; + var list = [player, trigger.target]; list.sortBySeat(); - game.asyncDraw(list,2); - 'step 1' + game.asyncDraw(list, 2); + ("step 1"); game.delayx(); }, - marktext:'继', - intro:{content:'已和$成为继母子关系'}, - group:['dcfudao_revenge','dcfudao_deadmark'], + marktext: "继", + intro: { content: "已和$成为继母子关系" }, + group: ["dcfudao_revenge", "dcfudao_deadmark"], }, - deadmark:{ - trigger:{player:'dieBegin'}, - forced:true, - popup:false, - lastDo:true, - silent:true, - filter:function(event,player){ - return get.itemtype(event.source)=='player'; + deadmark: { + trigger: { player: "dieBegin" }, + forced: true, + popup: false, + lastDo: true, + silent: true, + filter: function (event, player) { + return get.itemtype(event.source) == "player"; }, - content:function(){ - trigger.source.markAuto('dcfudao_deadmark',[player]); + content: function () { + trigger.source.markAuto("dcfudao_deadmark", [player]); }, - marktext:'裂', - intro:{ - name:'决裂', - content:'你害死了$!', + marktext: "裂", + intro: { + name: "决裂", + content: "你害死了$!", }, }, - revenge:{ - trigger:{source:'damageBegin1'}, - forced:true, - filter:function(event,player){ - var storage1=event.player.getStorage('dcfudao_deadmark'),storage2=player.getStorage('dcfudao_effect'); - for(var i of storage1){ - if(storage2.includes(i)) return true; + revenge: { + trigger: { source: "damageBegin1" }, + forced: true, + filter: function (event, player) { + var storage1 = event.player.getStorage("dcfudao_deadmark"), + storage2 = player.getStorage("dcfudao_effect"); + for (var i of storage1) { + if (storage2.includes(i)) return true; } return false; }, - content:function(){ + content: function () { trigger.num++; }, - logTarget:'player', + logTarget: "player", }, - refuse:{ - trigger:{target:'useCardToTargeted'}, - forced:true, - filter:function(event,player){ - var storage1=event.player.getStorage('dcfudao_deadmark'),storage2=player.getStorage('dcfudao_effect'); - for(var i of storage1){ - if(storage2.includes(i)) return true; + refuse: { + trigger: { target: "useCardToTargeted" }, + forced: true, + filter: function (event, player) { + var storage1 = event.player.getStorage("dcfudao_deadmark"), + storage2 = player.getStorage("dcfudao_effect"); + for (var i of storage1) { + if (storage2.includes(i)) return true; } return false; }, - content:function(){ - trigger.player.addTempSkill('dcfudao_blocker'); + content: function () { + trigger.player.addTempSkill("dcfudao_blocker"); }, - logTarget:'player', + logTarget: "player", }, - blocker:{ - charlotte:true, - mod:{ - cardEnabled:()=>false, - cardSavable:()=>false, + blocker: { + charlotte: true, + mod: { + cardEnabled: () => false, + cardSavable: () => false, }, }, }, }, //全惠解 - dchuishu:{ - audio:2, - getList:function(player){ - if(!player.storage.dchuishu) return [3,1,2]; + dchuishu: { + audio: 2, + getList: function (player) { + if (!player.storage.dchuishu) return [3, 1, 2]; return player.storage.dchuishu.slice(0); }, - trigger:{player:'phaseDrawEnd'}, - content:function(){ - 'step 0' - var list=lib.skill.dchuishu.getList(player); - event.list=list; + trigger: { player: "phaseDrawEnd" }, + content: function () { + "step 0"; + var list = lib.skill.dchuishu.getList(player); + event.list = list; player.draw(list[0]); - 'step 1' - player.addTempSkill('dchuishu_effect'); - player.chooseToDiscard('h',true,event.list[1]); + ("step 1"); + player.addTempSkill("dchuishu_effect"); + player.chooseToDiscard("h", true, event.list[1]); }, - onremove:true, - mark:true, - intro:{ - markcount:function(storage,player){ - var list=lib.skill.dchuishu.getList(player); - return Math.max.apply(Math,list); + onremove: true, + mark: true, + intro: { + markcount: function (storage, player) { + var list = lib.skill.dchuishu.getList(player); + return Math.max.apply(Math, list); }, - content:function(storage,player){ - var list=lib.skill.dchuishu.getList(player); - return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中获得['+list[2]+']张非基本牌。'; + content: function (storage, player) { + var list = lib.skill.dchuishu.getList(player); + return ( + "摸牌阶段结束时,你可以摸[" + + list[0] + + "]张牌。若如此做:你弃置[" + + list[1] + + "]张手牌,且当你于本回合内弃置第[" + + list[2] + + "]+1张牌后,你从弃牌堆中获得[" + + list[2] + + "]张非基本牌。" + ); }, }, - subSkill:{ - effect:{ - charlotte:true, - audio:'dchuishu', - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + subSkill: { + effect: { + charlotte: true, + audio: "dchuishu", + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - var num=lib.skill.dchuishu.getList(player)[2]; - if(typeof num!='number') return false; - if(event.type!='discard'||event.getlx===false) return false; - var evt=event.getl(player); - if(evt.cards2.length==0) return false; - var prev=0,goon=true; - player.getHistory('lose',function(evt){ - if(!goon||evt.type!='discard') return false; - prev+=evt.cards2.length; - if(evt==event||event.getParent()==event){ - goon=false; + filter: function (event, player) { + var num = lib.skill.dchuishu.getList(player)[2]; + if (typeof num != "number") return false; + if (event.type != "discard" || event.getlx === false) return false; + var evt = event.getl(player); + if (evt.cards2.length == 0) return false; + var prev = 0, + goon = true; + player.getHistory("lose", function (evt) { + if (!goon || evt.type != "discard") return false; + prev += evt.cards2.length; + if (evt == event || event.getParent() == event) { + goon = false; return false; } }); - return prev>num; + return prev > num; }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - var num=lib.skill.dchuishu.getList(player)[2]; - var cards=[]; - for(var i=0;imax) max=i; + content: function () { + "step 0"; + var list = lib.skill.dchuishu.getList(player); + var min = list[0], + max = list[0]; + for (var i of list) { + if (i < min) min = i; + if (i > max) max = i; } - var exps=['摸牌数[','弃牌数[','目标牌数[']; - var choices_min=[],choices_max=[]; - for(var i=0;i'; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - var current=this.parentNode.querySelector('.bluebg'); - if(current) current.classList.remove('bluebg'); - this.classList.add('bluebg'); - event._result.min=link; - }); + td.innerHTML = "" + min[i] + ""; + td.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) current.classList.remove("bluebg"); + this.classList.add("bluebg"); + event._result.min = link; + } + ); } dialog.content.appendChild(table); - dialog.addText('最大值-1'); - var table2=document.createElement('div'); - table2.classList.add('add-setting'); - table2.style.margin='0'; - table2.style.width='100%'; - table2.style.position='relative'; - for(var i=0;i'; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - var current=this.parentNode.querySelector('.bluebg'); - if(current) current.classList.remove('bluebg'); - this.classList.add('bluebg'); - event._result.max=link; - }); + td.innerHTML = "" + max[i] + ""; + td.addEventListener( + lib.config.touchscreen ? "touchend" : "click", + function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + var current = this.parentNode.querySelector(".bluebg"); + if (current) current.classList.remove("bluebg"); + this.classList.add("bluebg"); + event._result.max = link; + } + ); } dialog.content.appendChild(table2); - dialog.add('  '); + dialog.add("  "); event.dialog.open(); - event.switchToAuto=function(){ - event._result={ - bool:true, - min:min[0], - max:max[0], + event.switchToAuto = function () { + event._result = { + bool: true, + min: min[0], + max: max[0], }; event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }; - event.control=ui.create.control('ok',function(link){ - var result=event._result; - if(!result.min||!result.max) return; - result.bool=true; + event.control = ui.create.control("ok", function (link) { + var result = event._result; + if (!result.min || !result.max) return; + result.bool = true; event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }); - for(var i=0;i=5) return true; + dcligong: { + audio: 2, + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + if (!player.hasSkill("dchuishu")) return false; + var list = lib.skill.dchuishu.getList(player); + for (var i of list) { + if (i >= 5) return true; } return false; }, - skillAnimation:true, - animationColor:'wood', - content:function(){ - 'step 0' - player.awakenSkill('dcligong'); + skillAnimation: true, + animationColor: "wood", + content: function () { + "step 0"; + player.awakenSkill("dcligong"); player.gainMaxHp(); player.recover(); - 'step 1' - player.removeSkills('dcyishu'); - 'step 2' + ("step 1"); + player.removeSkills("dcyishu"); + ("step 2"); var list; - if(_status.characterlist){ - list=[]; - for(var i=0;i<_status.characterlist.length;i++){ - var name=_status.characterlist[i]; - if(lib.character[name][1]=='wu'&&(lib.character[name][0]=='female'||lib.character[name][0]=='double')) list.push(name); + if (_status.characterlist) { + list = []; + for (var i = 0; i < _status.characterlist.length; i++) { + var name = _status.characterlist[i]; + if ( + lib.character[name][1] == "wu" && + (lib.character[name][0] == "female" || lib.character[name][0] == "double") + ) + list.push(name); } - } - else if(_status.connectMode){ - list=get.charactersOL(function(i){ - return lib.character[i][1]!='wu'||(lib.character[i][0]!='female'&&lib.character[i][0]!='double'); + } else if (_status.connectMode) { + list = get.charactersOL(function (i) { + return ( + lib.character[i][1] != "wu" || + (lib.character[i][0] != "female" && lib.character[i][0] != "double") + ); + }); + } else { + list = get.gainableCharacters(function (info) { + return info[1] == "wu" && (info[0] == "female" || info[0] == "double"); }); } - else{ - list=get.gainableCharacters(function(info){ - return info[1]=='wu'&&(info[0]=='female'||info[0]=='double'); - }); - } - var players=game.players.concat(game.dead); - for(var i=0;i'; - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - _status.tempNoButton=true; - setTimeout(function(){ - _status.tempNoButton=false; - },500); - var link=this.link; - if(!this.classList.contains('bluebg')){ - if(rSkill.length>=2) return; + td.innerHTML = "" + get.translation(skills[i]) + ""; + td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { + if (_status.dragged) return; + if (_status.justdragged) return; + _status.tempNoButton = true; + setTimeout(function () { + _status.tempNoButton = false; + }, 500); + var link = this.link; + if (!this.classList.contains("bluebg")) { + if (rSkill.length >= 2) return; rSkill.add(link); - this.classList.add('bluebg'); - } - else{ - this.classList.remove('bluebg'); + this.classList.add("bluebg"); + } else { + this.classList.remove("bluebg"); rSkill.remove(link); } }); } dialog.content.appendChild(table); - dialog.add('  '); + dialog.add("  "); dialog.open(); - event.switchToAuto=function(){ + event.switchToAuto = function () { event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }; - event.control=ui.create.control('ok',function(link){ + event.control = ui.create.control("ok", function (link) { event.dialog.close(); event.control.close(); game.resume(); - _status.imchoosing=false; + _status.imchoosing = false; }); - for(var i=0;i0; + dcfanyin: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + return ui.cardPile.childNodes.length > 0; }, - frequent:true, - locked:false, - content:function(){ - 'step 0' - var card=false; - if(typeof event.num!='number'){ - var num=false; - for(var i=0;i'+choiceList[0]+'(已强化)'); - } - else{ - list.push('选项'+get.cnNumber(i,true)); - if(num) choiceList[i-1]+=('(已强化'+num+'次)'); + var list = []; + var card = player.getEquip("dagongche"); + for (var i = 1; i <= 3; i++) { + var key = "大攻车选项" + get.cnNumber(i, true); + var num = card.storage[key]; + if (i == 1) { + if (!num) list.push("选项一"); + else + choiceList[0] = + '' + choiceList[0] + "(已强化)"; + } else { + list.push("选项" + get.cnNumber(i, true)); + if (num) choiceList[i - 1] += "(已强化" + num + "次)"; } } - player.chooseControl(list,'cancel2').set('prompt','是否发动【陷筑】强化【大攻车】?').set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player,controls=_status.event.controls.slice(0); - var getval=function(choice){ - var card=player.getEquip('dagongche'); - if(choice=='选项一'){ - card.storage.大攻车选项一=1; - var goon=false; - if(game.hasPlayer(function(current){ - var eff1=0,eff2=0; - var cardx={name:'sha',isCard:true}; - if(player.canUse(cardx,current)) eff1=get.effect(current,cardx,player,player); - cardx.storage={dagongche:true}; - if(player.canUse(cardx,current)) eff2=get.effect(current,cardx,player,player); - return (eff2>eff1); - })) goon=true; - delete card.storage.大攻车选项一; - if(goon) return 5; + player + .chooseControl(list, "cancel2") + .set("prompt", "是否发动【陷筑】强化【大攻车】?") + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player, + controls = _status.event.controls.slice(0); + var getval = function (choice) { + var card = player.getEquip("dagongche"); + if (choice == "选项一") { + card.storage.大攻车选项一 = 1; + var goon = false; + if ( + game.hasPlayer(function (current) { + var eff1 = 0, + eff2 = 0; + var cardx = { name: "sha", isCard: true }; + if (player.canUse(cardx, current)) + eff1 = get.effect(current, cardx, player, player); + cardx.storage = { dagongche: true }; + if (player.canUse(cardx, current)) + eff2 = get.effect(current, cardx, player, player); + return eff2 > eff1; + }) + ) + goon = true; + delete card.storage.大攻车选项一; + if (goon) return 5; + return 0; + } else if (choice == "选项二") { + var num = 1; + if (card.storage.大攻车选项二) num += card.storage.大攻车选项二; + var cardx = { name: "sha", isCard: true }; + if ( + game.countPlayer(function (current) { + return ( + player.canUse(cardx, current) && + get.effect(current, cardx, player, player) > 0 + ); + }) > num + ) + return 2; + } else if (choice == "选项三") return 1; return 0; + }; + var eff = 0, + current = "cancel2"; + for (var i of controls) { + var effx = getval(i); + if (effx > eff) { + eff = effx; + current = i; + } } - else if(choice=='选项二'){ - var num=1; - if(card.storage.大攻车选项二) num+=card.storage.大攻车选项二; - var cardx={name:'sha',isCard:true}; - if(game.countPlayer(function(current){ - return player.canUse(cardx,current)&&get.effect(current,cardx,player,player)>0; - })>num) return 2; - } - else if(choice=='选项三') return 1; - return 0; - }; - var eff=0,current='cancel2'; - for(var i of controls){ - var effx=getval(i); - if(effx>eff){ - eff=effx; - current=i; - } - } - return current; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('dcxianzhu'); - var card=player.getEquip('dagongche'),key='大攻车'+result.control; - if(!card.storage[key]) card.storage[key]=0; + return current; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("dcxianzhu"); + var card = player.getEquip("dagongche"), + key = "大攻车" + result.control; + if (!card.storage[key]) card.storage[key] = 0; card.storage[key]++; lib.skill.dcwanglu.broadcast(player); } }, - ai:{ - combo:'dcwanglu' - } - }, - dcchaixie:{ - audio:2, - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + ai: { + combo: "dcwanglu", }, - forced:true, - filter:function(event,player){ - var evt=event.getl(player); - if(!evt||!evt.es||!evt.es.length) return false; - for(var card of evt.es){ - if(card.name=='dagongche'){ - for(var i=1;i<=3;i++){ - if(card.storage['大攻车选项'+get.cnNumber(i,true)]) return true; + }, + dcchaixie: { + audio: 2, + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], + }, + forced: true, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.es || !evt.es.length) return false; + for (var card of evt.es) { + if (card.name == "dagongche") { + for (var i = 1; i <= 3; i++) { + if (card.storage["大攻车选项" + get.cnNumber(i, true)]) return true; } } } return false; }, - content:function(){ - var num=0; - var evt=trigger.getl(player); - for(var card of evt.es){ - if(card.name=='dagongche'){ - for(var i=1;i<=3;i++){ - var key='大攻车选项'+get.cnNumber(i,true); - if(card.storage[key]) num+=card.storage[key]; + content: function () { + var num = 0; + var evt = trigger.getl(player); + for (var card of evt.es) { + if (card.name == "dagongche") { + for (var i = 1; i <= 3; i++) { + var key = "大攻车选项" + get.cnNumber(i, true); + if (card.storage[key]) num += card.storage[key]; } } } player.draw(num); }, - ai:{ - combo:'dcwanglu' - } + ai: { + combo: "dcwanglu", + }, }, - dagongche_skill:{ - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - var cardx={ - name:'sha', - isCard:true, - storage:{dagongche:true}, + dagongche_skill: { + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + var cardx = { + name: "sha", + isCard: true, + storage: { dagongche: true }, }; return player.hasUseTarget(cardx); }, - equipSkill:true, - content:function(){ - var card={ - name:'sha', - isCard:true, - storage:{dagongche:true}, + equipSkill: true, + content: function () { + var card = { + name: "sha", + isCard: true, + storage: { dagongche: true }, }; lib.skill.dcwanglu.broadcast(player); - player.chooseUseTarget(card,'大攻车:是否视为使用【杀】?',false).logSkill='dagongche_skill'; + player.chooseUseTarget(card, "大攻车:是否视为使用【杀】?", false).logSkill = + "dagongche_skill"; }, - mod:{ - targetInRange:function(card,player,target){ - if(card.storage&&card.storage.dagongche){ - var cardx=player.getEquip('dagongche'); - if(cardx&&cardx.storage.大攻车选项一) return true; + mod: { + targetInRange: function (card, player, target) { + if (card.storage && card.storage.dagongche) { + var cardx = player.getEquip("dagongche"); + if (cardx && cardx.storage.大攻车选项一) return true; } }, - selectTarget:function(card,player,range){ - if(card.storage&&card.storage.dagongche&&range[1]!=-1){ - var cardx=player.getEquip('dagongche'); - if(cardx&&cardx.storage.大攻车选项二) range[1]+=cardx.storage.大攻车选项二; + selectTarget: function (card, player, range) { + if (card.storage && card.storage.dagongche && range[1] != -1) { + var cardx = player.getEquip("dagongche"); + if (cardx && cardx.storage.大攻车选项二) range[1] += cardx.storage.大攻车选项二; } }, - canBeDiscarded:function(card){ - if(card.name=='dagongche'&&get.position(card)=='e'){ - for(var i=1;i<=3;i++){ - if(card.storage['大攻车选项'+get.cnNumber(i,true)]) return; + canBeDiscarded: function (card) { + if (card.name == "dagongche" && get.position(card) == "e") { + for (var i = 1; i <= 3; i++) { + if (card.storage["大攻车选项" + get.cnNumber(i, true)]) return; } return false; } }, }, - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.card||!arg.card.storage||!arg.card.storage.dagongche) return false; - var card=player.getEquip('dagongche'); - if(!card||!card.storage.大攻车选项一) return false; + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (!arg || !arg.card || !arg.card.storage || !arg.card.storage.dagongche) + return false; + var card = player.getEquip("dagongche"); + if (!card || !card.storage.大攻车选项一) return false; }, }, - group:'dagongche_skill_discard', - subSkill:{ - discard:{ - trigger:{source:'damageSource'}, - equipSkill:true, - forced:true, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.dagongche) return false; - if(event.getParent().type!='card') return false; - return event.player.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,event.player,player); - },'he'); + group: "dagongche_skill_discard", + subSkill: { + discard: { + trigger: { source: "damageSource" }, + equipSkill: true, + forced: true, + filter: function (event, player) { + if (!event.card || !event.card.storage || !event.card.storage.dagongche) + return false; + if (event.getParent().type != "card") return false; + return event.player.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, event.player, player); + }, "he"); }, - logTarget:'player', - content:function(){ - var num=1; - var cardx=player.getEquip('dagongche'); - if(cardx&&cardx.storage.大攻车选项三) num+=cardx.storage.大攻车选项三; - player.discardPlayerCard(trigger.player,true,num,'he'); + logTarget: "player", + content: function () { + var num = 1; + var cardx = player.getEquip("dagongche"); + if (cardx && cardx.storage.大攻车选项三) num += cardx.storage.大攻车选项三; + player.discardPlayerCard(trigger.player, true, num, "he"); }, }, }, }, //刘徽 - dcgeyuan:{ - audio:2, - trigger:{ - global:['loseAfter','loseAsyncAfter','cardsDiscardAfter','equipAfter'], + dcgeyuan: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], }, - forced:true, - filter:function(event,player){ - var cards=event.getd(); - for(var i of cards){ - if(lib.skill.dcgeyuan.filterNumber(player,get.number(i,false))) return true; + forced: true, + filter: function (event, player) { + var cards = event.getd(); + for (var i of cards) { + if (lib.skill.dcgeyuan.filterNumber(player, get.number(i, false))) return true; } return false; }, - content:function(){ - 'step 0' - event.cards=trigger.getd(); - 'step 1' - var card=false; - for(var i of cards){ - if(lib.skill.dcgeyuan.filterNumber(player,get.number(i,false))){ - card=i; + content: function () { + "step 0"; + event.cards = trigger.getd(); + ("step 1"); + var card = false; + for (var i of cards) { + if (lib.skill.dcgeyuan.filterNumber(player, get.number(i, false))) { + card = i; cards.remove(card); break; } } - if(card){ - var number=get.number(card,false); - game.log(player,'将','#y'+get.strNumber(number),'记录为','#g“圆环之弧”'); - player.markAuto('dcgeyuan_homura',[number]); - player.markSkill('dcgeyuan'); - if(player.getStorage('dcgeyuan').length>player.getStorage('dcgeyuan_homura').length){ - if(cards.length>0) event.redo(); - else event.finish() - } - else if(player.storage.dcgusuan) event.goto(5); - } - else event.finish(); - 'step 2' - var list=player.getStorage('dcgeyuan_homura'); - var num1=list[0],num2=list[list.length-1]; - event.cards2=[]; - var lose_list=[],players=game.filterPlayer(); - for(var current of players){ - var cards=current.getCards('ej',function(card){ - var num=get.number(card); - return num==num1||num==num2; + if (card) { + var number = get.number(card, false); + game.log(player, "将", "#y" + get.strNumber(number), "记录为", "#g“圆环之弧”"); + player.markAuto("dcgeyuan_homura", [number]); + player.markSkill("dcgeyuan"); + if ( + player.getStorage("dcgeyuan").length > player.getStorage("dcgeyuan_homura").length + ) { + if (cards.length > 0) event.redo(); + else event.finish(); + } else if (player.storage.dcgusuan) event.goto(5); + } else event.finish(); + ("step 2"); + var list = player.getStorage("dcgeyuan_homura"); + var num1 = list[0], + num2 = list[list.length - 1]; + event.cards2 = []; + var lose_list = [], + players = game.filterPlayer(); + for (var current of players) { + var cards = current.getCards("ej", function (card) { + var num = get.number(card); + return num == num1 || num == num2; }); - if(cards.length>0){ + if (cards.length > 0) { current.$throw(cards); - lose_list.push([current,cards]); + lose_list.push([current, cards]); event.cards2.addArray(cards); } } - if(lose_list.length){ - event.lose_list=lose_list; + if (lose_list.length) { + event.lose_list = lose_list; game.loseAsync({ - lose_list:lose_list, - }).setContent('chooseToCompareLose'); + lose_list: lose_list, + }).setContent("chooseToCompareLose"); } - 'step 3' - var list=player.getStorage('dcgeyuan_homura'); - var num1=list[0],num2=list[list.length-1]; - var cards=event.cards2; - for(var i=0;i0){ - if(event.lose_list) game.delayx(); - player.gain(cards,'gain2'); + if (cards.length > 0) { + if (event.lose_list) game.delayx(); + player.gain(cards, "gain2"); } - 'step 4' - var list=player.getStorage('dcgeyuan_homura'); - var num1=list[0],num2=list[list.length-1]; - player.storage.dcgeyuan_homura=[]; - game.log(player,'清空了','#g“圆环之弧”'); - player.markSkill('dcgeyuan'); - if(player.getStorage('dcgeyuan').length>3){ - player.unmarkAuto('dcgeyuan',[num1,num2]); - game.log(player,'从','#g“圆环之理”','中移除了','#y'+get.strNumber(num1),'和','#y'+get.strNumber(num2)); + ("step 4"); + var list = player.getStorage("dcgeyuan_homura"); + var num1 = list[0], + num2 = list[list.length - 1]; + player.storage.dcgeyuan_homura = []; + game.log(player, "清空了", "#g“圆环之弧”"); + player.markSkill("dcgeyuan"); + if (player.getStorage("dcgeyuan").length > 3) { + player.unmarkAuto("dcgeyuan", [num1, num2]); + game.log( + player, + "从", + "#g“圆环之理”", + "中移除了", + "#y" + get.strNumber(num1), + "和", + "#y" + get.strNumber(num2) + ); } event.finish(); - 'step 5' - player.chooseTarget('割圆:选择至多三名角色','第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将所有手牌与牌堆底的牌交换',true,[1,3]); - 'step 6' - if(result.bool){ - var targets=result.targets; - event.targets=targets; + ("step 5"); + player.chooseTarget( + "割圆:选择至多三名角色", + "第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将所有手牌与牌堆底的牌交换", + true, + [1, 3] + ); + ("step 6"); + if (result.bool) { + var targets = result.targets; + event.targets = targets; player.line(targets); targets[0].draw(3); - if(targets.length<2) event.goto(4); - } - else event.goto(4); - 'step 7' - if(targets[1].countCards('he')>0) targets[1].chooseToDiscard('he',true,4); - if(targets.length<3) event.goto(4); - 'step 8' - var target=targets[2]; - var cards=get.bottomCards(5); + if (targets.length < 2) event.goto(4); + } else event.goto(4); + ("step 7"); + if (targets[1].countCards("he") > 0) targets[1].chooseToDiscard("he", true, 4); + if (targets.length < 3) event.goto(4); + ("step 8"); + var target = targets[2]; + var cards = get.bottomCards(5); game.cardsGotoOrdering(cards); - var hs=target.getCards('h'); - if(hs.length>0) target.lose(hs,ui.cardPile); - target.gain(cards,'draw'); + var hs = target.getCards("h"); + if (hs.length > 0) target.lose(hs, ui.cardPile); + target.gain(cards, "draw"); event.goto(4); }, - group:'dcgeyuan_kyubey', - filterNumber:function(player,num){ - var list1=player.getStorage('dcgeyuan'); - var list2=player.getStorage('dcgeyuan_homura'); - if(!list1.includes(num)) return false; - if(!list2.length) return true; - if(list2.includes(num)) return false; - var madoka=list1.indexOf(num); - for(var i of list2){ - var homura=list1.indexOf(i); - var dist=Math.abs(madoka-homura); - if(dist==1||dist==list1.length-1) return true; + group: "dcgeyuan_kyubey", + filterNumber: function (player, num) { + var list1 = player.getStorage("dcgeyuan"); + var list2 = player.getStorage("dcgeyuan_homura"); + if (!list1.includes(num)) return false; + if (!list2.length) return true; + if (list2.includes(num)) return false; + var madoka = list1.indexOf(num); + for (var i of list2) { + var homura = list1.indexOf(i); + var dist = Math.abs(madoka - homura); + if (dist == 1 || dist == list1.length - 1) return true; } return false; }, - subSkill:{ - kyubey:{ - audio:'dcgeyuan', - trigger:{ - global:'phaseBefore', - player:'enterGame', + subSkill: { + kyubey: { + audio: "dcgeyuan", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&!player.storage.dcgusuan; + forced: true, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && !player.storage.dcgusuan + ); }, - content:function(){ - var list=[]; - for(var i=1;i<=13;i++){ + content: function () { + var list = []; + for (var i = 1; i <= 13; i++) { list.push(i); } list.randomSort(); - player.storage.dcgeyuan=list; - player.markSkill('dcgeyuan'); - var str='#y'; - for(var i=0;i<13;i++){ - str+=get.strNumber(list[i]); - if(i!=12) str+=','; + player.storage.dcgeyuan = list; + player.markSkill("dcgeyuan"); + var str = "#y"; + for (var i = 0; i < 13; i++) { + str += get.strNumber(list[i]); + if (i != 12) str += ","; } - game.log(player,'将','#y“圆环之理”','赋值为',str); + game.log(player, "将", "#y“圆环之理”", "赋值为", str); }, }, }, - intro:{ - name:'圆环之理', - markcount:function(storage,player){ - if(!player.storage.dcgeyuan||!player.getStorage('dcgeyuan_homura').length) return 0; - var list=player.storage.dcgeyuan.filter(i=>lib.skill.dcgeyuan.filterNumber(player,i)); - if(!list.length) return 0; - list=list.map(num=>{ - var list=[1,10,11,12,13]; - if(list.includes(num)) return ['A','X','J','Q','K'][list.indexOf(num)]; + intro: { + name: "圆环之理", + markcount: function (storage, player) { + if (!player.storage.dcgeyuan || !player.getStorage("dcgeyuan_homura").length) + return 0; + var list = player.storage.dcgeyuan.filter((i) => + lib.skill.dcgeyuan.filterNumber(player, i) + ); + if (!list.length) return 0; + list = list.map((num) => { + var list = [1, 10, 11, 12, 13]; + if (list.includes(num)) return ["A", "X", "J", "Q", "K"][list.indexOf(num)]; return parseFloat(num); }); - return list.reduce((str,num)=>{ - return str+num; - },''); + return list.reduce((str, num) => { + return str + num; + }, ""); }, - mark:function(dialog,storage,player){ - dialog.content.style['overflow-x']='visible'; - var list=storage; - if(!storage||!storage.length) return '(圆环之理尚不存在)'; - var list2=player.getStorage('dcgeyuan_homura'); - var core=document.createElement('div'); - core.style.width='0'; - var centerX=-15,centerY=80,radius=80; - var radian=Math.PI*2/list.length; - var fulllist=['A','2','3','4','5','6','7','8','9','10','J','Q','K']; - for(var i=0;i['+fulllist[list[i]-1]+']'; - td.style.position='absolute'; + mark: function (dialog, storage, player) { + dialog.content.style["overflow-x"] = "visible"; + var list = storage; + if (!storage || !storage.length) return "(圆环之理尚不存在)"; + var list2 = player.getStorage("dcgeyuan_homura"); + var core = document.createElement("div"); + core.style.width = "0"; + var centerX = -15, + centerY = 80, + radius = 80; + var radian = (Math.PI * 2) / list.length; + var fulllist = [ + "A", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "J", + "Q", + "K", + ]; + for (var i = 0; i < list.length; i++) { + var td = document.createElement("div"); + var color = ""; + if (list2[0] == list[i]) color = ' class="yellowtext"'; + else if (list2.includes(list[i])) color = ' class="greentext"'; + td.innerHTML = "[" + fulllist[list[i] - 1] + "]"; + td.style.position = "absolute"; core.appendChild(td); - td.style.left=(centerX+radius*Math.sin(radian*i))+'px'; - td.style.top=(centerY-radius*Math.cos(radian*i))+'px'; + td.style.left = centerX + radius * Math.sin(radian * i) + "px"; + td.style.top = centerY - radius * Math.cos(radian * i) + "px"; } dialog.content.appendChild(core); }, }, }, - dcjieshu:{ - audio:2, - trigger:{player:['useCard','respond']}, - forced:true, - filter:function(event,player){ - var num=get.number(event.card,false); - if(typeof num!='number') return false; - return lib.skill.dcgeyuan.filterNumber(player,num) + dcjieshu: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + forced: true, + filter: function (event, player) { + var num = get.number(event.card, false); + if (typeof num != "number") return false; + return lib.skill.dcgeyuan.filterNumber(player, num); }, - content:function(){ + content: function () { player.draw(); }, - mod:{ - ignoredHandcard:function(card,player){ - if(!player.getStorage('dcgeyuan').includes(get.number(card))) return true; + mod: { + ignoredHandcard: function (card, player) { + if (!player.getStorage("dcgeyuan").includes(get.number(card))) return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&!player.getStorage('dcgeyuan').includes(get.number(card))) return false; + cardDiscardable: function (card, player, name) { + if ( + name == "phaseDiscard" && + !player.getStorage("dcgeyuan").includes(get.number(card)) + ) + return false; }, }, }, - dcgusuan:{ - audio:2, - trigger:{global:'phaseEnd'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'soil', - filter:function(event,player){ - return player.getStorage('dcgeyuan').length==3; + dcgusuan: { + audio: 2, + trigger: { global: "phaseEnd" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "soil", + filter: function (event, player) { + return player.getStorage("dcgeyuan").length == 3; }, - content:function(){ - player.awakenSkill('dcgusuan'); - player.storage.dcgusuan=true; + content: function () { + player.awakenSkill("dcgusuan"); + player.storage.dcgusuan = true; player.loseMaxHp(); }, - ai:{combo:'dcgeyuan'}, - derivation:'dcgeyuan_magica', + ai: { combo: "dcgeyuan" }, + derivation: "dcgeyuan_magica", }, //王昶 - dckaiji:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(player.maxHp<=0) return false; - if(!player.storage.dckaiji) return true; - return player.hasCard((card)=>lib.filter.cardDiscardable(card,player,'phaseUse'),'he'); + dckaiji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (player.maxHp <= 0) return false; + if (!player.storage.dckaiji) return true; + return player.hasCard( + (card) => lib.filter.cardDiscardable(card, player, "phaseUse"), + "he" + ); }, - filterCard:function(card,player){ - if(!player.storage.dckaiji) return false; + filterCard: function (card, player) { + if (!player.storage.dckaiji) return false; return true; }, - position:'he', - selectCard:function(){ - var player=_status.event.player; - return player.storage.dckaiji?[1,player.maxHp]:-1; + position: "he", + selectCard: function () { + var player = _status.event.player; + return player.storage.dckaiji ? [1, player.maxHp] : -1; }, - check:function(card){ - var player=_status.event.player; - if(!player.hasSkill('dcpingxi')) return 0; - var num=lib.skill.dcpingxi.getNum()+ui.selected.cards.length; - if(num0; - })){ - if(get.position(card)=='h'&&player.needsToDiscard(0,(i,player)=>{ - return !ui.selected.cards.includes(i)&&!player.canIgnoreHandcard(i); - })) return 7+1/Math.max(1,get.value(card)); - return 7-get.value(card); + check: function (card) { + var player = _status.event.player; + if (!player.hasSkill("dcpingxi")) return 0; + var num = lib.skill.dcpingxi.getNum() + ui.selected.cards.length; + if ( + num < + game.countPlayer(function (current) { + if (current == player || current.countCards("he") == 0) return false; + return ( + get.effect(current, { name: "guohe_copy2" }, player, player) + + get.effect(current, { name: "sha" }, player, player) > + 0 + ); + }) + ) { + if ( + get.position(card) == "h" && + player.needsToDiscard(0, (i, player) => { + return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i); + }) + ) + return 7 + 1 / Math.max(1, get.value(card)); + return 7 - get.value(card); } return 0; }, - content:function(){ - player.changeZhuanhuanji('dckaiji'); - if(!cards.length) player.draw(Math.min(player.maxHp,5)); + content: function () { + player.changeZhuanhuanji("dckaiji"); + if (!cards.length) player.draw(Math.min(player.maxHp, 5)); }, - zhuanhuanji:true, - mark:true, - marktext:'☯', - intro:{ - content:(storage)=>('转换技。出牌阶段限一次,你可以'+(storage?'弃置至多X张牌':'摸X张牌')+'(X为你的体力上限且至多为5)。'), + zhuanhuanji: true, + mark: true, + marktext: "☯", + intro: { + content: (storage) => + "转换技。出牌阶段限一次,你可以" + + (storage ? "弃置至多X张牌" : "摸X张牌") + + "(X为你的体力上限且至多为5)。", }, - ai:{ - threaten:1.6, - order:function(item,player){ - if(player.storage.dckaiji) return 0.1; + ai: { + threaten: 1.6, + order: function (item, player) { + if (player.storage.dckaiji) return 0.1; return 8; }, - result:{player:1}, + result: { player: 1 }, }, }, - dcpingxi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - getNum:function(){ - var num=0; - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name=='lose'&&evt.type=='discard') num+=evt.cards2.length; + dcpingxi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + getNum: function () { + var num = 0; + game.getGlobalHistory("cardMove", function (evt) { + if (evt.name == "lose" && evt.type == "discard") num += evt.cards2.length; }); return num; }, - filter:function(event,player){ - return lib.skill.dcpingxi.getNum()>0&&game.hasPlayer(function(current){ - return current!=player; - }); + filter: function (event, player) { + return ( + lib.skill.dcpingxi.getNum() > 0 && + game.hasPlayer(function (current) { + return current != player; + }) + ); }, - content:function(){ - 'step 0' - var num=lib.skill.dcpingxi.getNum(); - player.chooseTarget([1,num],function(card,player,target){ - return target!=player; - },get.prompt('dcpingxi'),'选择至多'+get.cnNumber(num)+'名其他角色。弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】').set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player)+get.effect(target,{name:'sha'},player,player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - event.targets=targets; - player.logSkill('dcpingxi',targets); - event.num=0; - } - else event.finish(); - 'step 2' - var target=targets[num]; - if(target.hasCard(function(card){ - return lib.filter.canBeDiscarded(card,player,target); - },'he')) player.discardPlayerCard(target,'he',true); + content: function () { + "step 0"; + var num = lib.skill.dcpingxi.getNum(); + player + .chooseTarget( + [1, num], + function (card, player, target) { + return target != player; + }, + get.prompt("dcpingxi"), + "选择至多" + + get.cnNumber(num) + + "名其他角色。弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】" + ) + .set("ai", function (target) { + var player = _status.event.player; + return ( + get.effect(target, { name: "guohe_copy2" }, player, player) + + get.effect(target, { name: "sha" }, player, player) + ); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + event.targets = targets; + player.logSkill("dcpingxi", targets); + event.num = 0; + } else event.finish(); + ("step 2"); + var target = targets[num]; + if ( + target.hasCard(function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }, "he") + ) + player.discardPlayerCard(target, "he", true); event.num++; - if(event.num0) player.useCard({ - name:'sha', - isCard:true, - },targetsx); + if (targetsx.length > 0) + player.useCard( + { + name: "sha", + isCard: true, + }, + targetsx + ); }, }, //赵昂 - dczhongjie:{ - audio:2, - round:1, - trigger:{global:'dying'}, - logTarget:'player', - filter:function(event,player){ - return event.player.hp<1&&event.reason&&event.reason.name=='loseHp'; + dczhongjie: { + audio: 2, + round: 1, + trigger: { global: "dying" }, + logTarget: "player", + filter: function (event, player) { + return event.player.hp < 1 && event.reason && event.reason.name == "loseHp"; }, - check:function(event,player){ - return get.attitude(player,event.player)>2; + check: function (event, player) { + return get.attitude(player, event.player) > 2; }, - content:function(){ + content: function () { trigger.player.recover(); trigger.player.draw(); }, }, - dcsushou:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return player.hp>0&&event.player.isMaxHandcard(true); + dcsushou: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + return player.hp > 0 && event.player.isMaxHandcard(true); }, - logTarget:'player', - check:function(event,player){ - var num=player.hp; - if(player.hasSkill('dczhongjie')&&(player.storage.dczhongjie_roundcount||0)1; + logTarget: "player", + check: function (event, player) { + var num = player.hp; + if ( + player.hasSkill("dczhongjie") && + (player.storage.dczhongjie_roundcount || 0) < game.roundNumber + ) + num++; + return num > 1; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseHp(); - event.target=trigger.player; - 'step 1' - var num=player.getDamagedHp(); - if(num>0) player.draw(num); - if(player==target) event.finish(); - 'step 2' - var ts=target.getCards('h'); - if(ts.length<2) event.finish(); - else{ - var hs=player.getCards('h'); - ts=ts.randomGets(Math.floor(ts.length/2)); - if(!hs.length){ - player.viewCards(get.translation(target)+'的部分手牌'); + event.target = trigger.player; + ("step 1"); + var num = player.getDamagedHp(); + if (num > 0) player.draw(num); + if (player == target) event.finish(); + ("step 2"); + var ts = target.getCards("h"); + if (ts.length < 2) event.finish(); + else { + var hs = player.getCards("h"); + ts = ts.randomGets(Math.floor(ts.length / 2)); + if (!hs.length) { + player.viewCards(get.translation(target) + "的部分手牌"); event.finish(); return; } - var next=player.chooseToMove('夙守:交换至多'+get.cnNumber(Math.min(hs.length,ts.length,player.getDamagedHp()))+'张牌'); - next.set('list',[ - [get.translation(target)+'的部分手牌',ts,'dcsushou_tag'], - ['你的手牌',hs], + var next = player.chooseToMove( + "夙守:交换至多" + + get.cnNumber(Math.min(hs.length, ts.length, player.getDamagedHp())) + + "张牌" + ); + next.set("list", [ + [get.translation(target) + "的部分手牌", ts, "dcsushou_tag"], + ["你的手牌", hs], ]); - next.set('filterMove',function(from,to,moved){ - if(typeof to=='number') return false; - var player=_status.event.player; - var hs=player.getCards('h'); - var changed=hs.filter(function(card){ + next.set("filterMove", function (from, to, moved) { + if (typeof to == "number") return false; + var player = _status.event.player; + var hs = player.getCards("h"); + var changed = hs.filter(function (card) { return !moved[1].includes(card); }); - var changed2=moved[1].filter(function(card){ + var changed2 = moved[1].filter(function (card) { return !hs.includes(card); }); - if(changed.length{ - return player.getUseValue(b,null,true)-player.getUseValue(a,null,true); - }).slice(0,_status.event.max),give=list[1][1].sort((a,b)=>{ - return get.value(a,player)-get.value(b,player); - }).slice(0,_status.event.max); - for(let i of gain){ - if(get.value(i,player) { + return ( + player.getUseValue(b, null, true) - + player.getUseValue(a, null, true) + ); + }) + .slice(0, _status.event.max), + give = list[1][1] + .sort((a, b) => { + return get.value(a, player) - get.value(b, player); + }) + .slice(0, _status.event.max); + for (let i of gain) { + if (get.value(i, player) < get.value(give[0], player)) continue; + let j = give.shift(); list[0][1].remove(i); list[0][1].push(j); list[1][1].remove(j); list[1][1].push(i); - if(!give.length) break; + if (!give.length) break; } } - return [list[0][1],list[1][1]]; + return [list[0][1], list[1][1]]; }); } - 'step 3' - var moved=result.moved; - var hs=player.getCards('h'),ts=target.getCards('h'); - var cards1=[],cards2=[]; - for(var i of result.moved[0]){ - if(!ts.includes(i)) cards1.push(i); + ("step 3"); + var moved = result.moved; + var hs = player.getCards("h"), + ts = target.getCards("h"); + var cards1 = [], + cards2 = []; + for (var i of result.moved[0]) { + if (!ts.includes(i)) cards1.push(i); } - for(var i of result.moved[1]){ - if(!hs.includes(i)) cards2.push(i); + for (var i of result.moved[1]) { + if (!hs.includes(i)) cards2.push(i); } - if(cards1.length){ - player.swapHandcards(target,cards1,cards2); + if (cards1.length) { + player.swapHandcards(target, cards1, cards2); } }, }, //蓝曹华 - caiyi:{ - audio:2, - zhuanhuanji:true, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - onremove:function(player){ + caiyi: { + audio: 2, + zhuanhuanji: true, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + onremove: function (player) { delete player.storage.caiyi; delete player.storage.caiyi_info; }, - filter:function(event,player){ - if(player.storage.caiyi_info){ - if(player.storage.caiyi_info[player.storage.caiyi?1:0].length>=4) return false; + filter: function (event, player) { + if (player.storage.caiyi_info) { + if (player.storage.caiyi_info[player.storage.caiyi ? 1 : 0].length >= 4) return false; } return true; }, - choices:[[ - '回复X点体力', - '摸X张牌', - '复原武将牌', - '随机执行一个已经移除过的选项', - ],[ - '受到X点伤害', - '弃置X张牌', - '翻面并横置', - '随机执行一个已经移除过的选项', - ]], - filterx:[[ - (player)=>player.isDamaged(), - ()=>true, - (player)=>player.isTurnedOver()||player.isLinked(), - ()=>true, - ],[ - ()=>true, - (player)=>player.hasCard(function(card){ - return lib.filter.cardDiscardable(card,player,'caiyi'); - },'he'), - (player)=>!player.isTurnedOver()||!player.isLinked(), - ()=>true, - ]], - content:function(){ - 'step 0' - if(!player.storage.caiyi_info) player.storage.caiyi_info=[[],[]]; - var index=player.storage.caiyi?1:0; - event.index=index; - var list=player.storage.caiyi_info[index],choices=lib.skill.caiyi.choices[index],numbers=['⒈',';⒉',';⒊',';⒋']; - event.num=4-list.length; - var str='令一名角色选择执行其中一项:'; - for(var i=0;i<4;i++){ - if(list.includes(i)) continue; - if(i==3&&!list.length) continue; - str+=numbers.shift(); - str+=choices[i]; + choices: [ + ["回复X点体力", "摸X张牌", "复原武将牌", "随机执行一个已经移除过的选项"], + ["受到X点伤害", "弃置X张牌", "翻面并横置", "随机执行一个已经移除过的选项"], + ], + filterx: [ + [ + (player) => player.isDamaged(), + () => true, + (player) => player.isTurnedOver() || player.isLinked(), + () => true, + ], + [ + () => true, + (player) => + player.hasCard(function (card) { + return lib.filter.cardDiscardable(card, player, "caiyi"); + }, "he"), + (player) => !player.isTurnedOver() || !player.isLinked(), + () => true, + ], + ], + content: function () { + "step 0"; + if (!player.storage.caiyi_info) player.storage.caiyi_info = [[], []]; + var index = player.storage.caiyi ? 1 : 0; + event.index = index; + var list = player.storage.caiyi_info[index], + choices = lib.skill.caiyi.choices[index], + numbers = ["⒈", ";⒉", ";⒊", ";⒋"]; + event.num = 4 - list.length; + var str = "令一名角色选择执行其中一项:"; + for (var i = 0; i < 4; i++) { + if (list.includes(i)) continue; + if (i == 3 && !list.length) continue; + str += numbers.shift(); + str += choices[i]; } - str+='。'; - str=str.replace(/X/g,get.cnNumber(event.num)); - player.chooseTarget(get.prompt('caiyi')+'(当前状态:'+(index?'阳':'阴')+')',str).set('ai',function(target){ - var player=_status.event.player; - return (player.storage.caiyi?-1:1)*get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('caiyi',target); - player.changeZhuanhuanji('caiyi'); - event.goto(event.index==1?5:2); - } - else event.finish(); - 'step 2' - var list=[],str=get.cnNumber(num); - var choiceList=[ - '回复'+str+'点体力。', - '摸'+str+'张牌。', - '将武将牌翻至正面且重置。', - '随机执行一个已经被移除的选项。', + str += "。"; + str = str.replace(/X/g, get.cnNumber(event.num)); + player + .chooseTarget( + get.prompt("caiyi") + "(当前状态:" + (index ? "阳" : "阴") + ")", + str + ) + .set("ai", function (target) { + var player = _status.event.player; + return (player.storage.caiyi ? -1 : 1) * get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("caiyi", target); + player.changeZhuanhuanji("caiyi"); + event.goto(event.index == 1 ? 5 : 2); + } else event.finish(); + ("step 2"); + var list = [], + str = get.cnNumber(num); + var choiceList = [ + "回复" + str + "点体力。", + "摸" + str + "张牌。", + "将武将牌翻至正面且重置。", + "随机执行一个已经被移除的选项。", ]; - var storage=player.storage.caiyi_info[event.index]; - for(var i=0;i<4;i++){ - if(storage.includes(i)){ - choiceList[i]=(''+choiceList[i]+''); - } - else if(!lib.skill.caiyi.filterx[event.index][i](target)||(i==3&&!storage.length)){ - choiceList[i]=(''+choiceList[i]+''); - } - else list.push('选项'+get.cnNumber(i+1,true)) + var storage = player.storage.caiyi_info[event.index]; + for (var i = 0; i < 4; i++) { + if (storage.includes(i)) { + choiceList[i] = + '' + + choiceList[i] + + ""; + } else if ( + !lib.skill.caiyi.filterx[event.index][i](target) || + (i == 3 && !storage.length) + ) { + choiceList[i] = '' + choiceList[i] + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); } - if(!list.length){ + if (!list.length) { event.finish(); return; } - target.chooseControl(list).set('choiceList',choiceList).set('ai',function(){ - var evt=_status.event,player=evt.player; - var list=evt.controls.slice(0); - var gett=function(choice){ - if(choice=='cancel2') return 0.1; - var max=0,func={ - 选项一:function(current){ - max=get.recoverEffect(current,player,player)*Math.min(evt.getParent().num,player.getDamagedHp()); - }, - 选项二:function(target){ - max=get.effect(target,{name:'draw'},player,player)*evt.getParent().num; - }, - 选项三:function(target){ - if(player.isTurnedOver()) max+=25; - if(player.isLinked()) max+=get.effect(player,{name:'tiesuo'},player,player); - }, - 选项四:function(target){ - max=3; - }, - }[choice]; - func(player); - return max; - }; - return list.sort(function(a,b){ - return gett(b)-gett(a); - })[0]; - }); - 'step 3' - var index2=['选项一','选项二','选项三','选项四'].indexOf(result.control); - player.storage.caiyi_info[event.index].push(index2); - if(index2==3){ - var list=player.storage.caiyi_info[event.index].filter(function(i){ - return i!=3&&lib.skill.caiyi.filterx[event.index][i](target); + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event, + player = evt.player; + var list = evt.controls.slice(0); + var gett = function (choice) { + if (choice == "cancel2") return 0.1; + var max = 0, + func = { + 选项一: function (current) { + max = + get.recoverEffect(current, player, player) * + Math.min(evt.getParent().num, player.getDamagedHp()); + }, + 选项二: function (target) { + max = + get.effect(target, { name: "draw" }, player, player) * + evt.getParent().num; + }, + 选项三: function (target) { + if (player.isTurnedOver()) max += 25; + if (player.isLinked()) + max += get.effect(player, { name: "tiesuo" }, player, player); + }, + 选项四: function (target) { + max = 3; + }, + }[choice]; + func(player); + return max; + }; + return list.sort(function (a, b) { + return gett(b) - gett(a); + })[0]; }); - if(!list.length){ + ("step 3"); + var index2 = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + player.storage.caiyi_info[event.index].push(index2); + if (index2 == 3) { + var list = player.storage.caiyi_info[event.index].filter(function (i) { + return i != 3 && lib.skill.caiyi.filterx[event.index][i](target); + }); + if (!list.length) { event.finish(); return; } - index2=list.randomGet(); + index2 = list.randomGet(); } - switch(index2){ + switch (index2) { case 0: target.recover(num); break; @@ -10412,2084 +13108,2488 @@ game.import('character', function () { target.draw(num); break; case 2: - !target.isTurnedOver()||target.turnOver(); + !target.isTurnedOver() || target.turnOver(); break; } - if(index2!=2) event.finish(); - 'step 4' - !target.isLinked()||target.link(); + if (index2 != 2) event.finish(); + ("step 4"); + !target.isLinked() || target.link(); event.finish(); - 'step 5' - var list=[],str=get.cnNumber(num); - var choiceList=[ - '受到'+str+'点伤害。', - '弃置'+str+'张牌。', - '将武将牌翻至背面并横置。', - '随机执行一个已经被移除的选项。', + ("step 5"); + var list = [], + str = get.cnNumber(num); + var choiceList = [ + "受到" + str + "点伤害。", + "弃置" + str + "张牌。", + "将武将牌翻至背面并横置。", + "随机执行一个已经被移除的选项。", ]; - var storage=player.storage.caiyi_info[event.index]; - for(var i=0;i<4;i++){ - if(storage.includes(i)){ - choiceList[i]=(''+choiceList[i]+''); - } - else if(!lib.skill.caiyi.filterx[event.index][i](target)||(i==3&&!storage.length)){ - choiceList[i]=(''+choiceList[i]+''); - } - else list.push('选项'+get.cnNumber(i+1,true)) + var storage = player.storage.caiyi_info[event.index]; + for (var i = 0; i < 4; i++) { + if (storage.includes(i)) { + choiceList[i] = + '' + + choiceList[i] + + ""; + } else if ( + !lib.skill.caiyi.filterx[event.index][i](target) || + (i == 3 && !storage.length) + ) { + choiceList[i] = '' + choiceList[i] + ""; + } else list.push("选项" + get.cnNumber(i + 1, true)); } - if(!list.length){ + if (!list.length) { event.finish(); return; } - target.chooseControl(list).set('choiceList',choiceList).set('ai',function(){ - var evt=_status.event,player=evt.player; - var list=evt.controls.slice(0); - var gett=function(choice){ - if(choice=='cancel2') return 0.1; - var max=0,func={ - 选项一:function(current){ - max=get.effect(current,{name:'damage'},player,player)*evt.getParent().num; - }, - 选项二:function(target){ - max=get.effect(target,{name:'guohe_copy2'},player,player)*Math.min(player.countCards('he'),evt.getParent().num); - }, - 选项三:function(target){ - if(!player.isTurnedOver()) max-=5; - if(!player.isLinked()) max+=get.effect(player,{name:'tiesuo'},player,player); - }, - 选项四:function(target){ - max=-3; - }, - }[choice]; - func(player); - return max; - }; - return list.sort(function(a,b){ - return gett(b)-gett(a); - })[0]; - }); - 'step 6' - var index2=['选项一','选项二','选项三','选项四'].indexOf(result.control); - player.storage.caiyi_info[event.index].push(index2); - if(index2==3){ - var list=player.storage.caiyi_info[event.index].filter(function(i){ - return i!=3&&lib.skill.caiyi.filterx[event.index][i](target); + target + .chooseControl(list) + .set("choiceList", choiceList) + .set("ai", function () { + var evt = _status.event, + player = evt.player; + var list = evt.controls.slice(0); + var gett = function (choice) { + if (choice == "cancel2") return 0.1; + var max = 0, + func = { + 选项一: function (current) { + max = + get.effect(current, { name: "damage" }, player, player) * + evt.getParent().num; + }, + 选项二: function (target) { + max = + get.effect(target, { name: "guohe_copy2" }, player, player) * + Math.min(player.countCards("he"), evt.getParent().num); + }, + 选项三: function (target) { + if (!player.isTurnedOver()) max -= 5; + if (!player.isLinked()) + max += get.effect(player, { name: "tiesuo" }, player, player); + }, + 选项四: function (target) { + max = -3; + }, + }[choice]; + func(player); + return max; + }; + return list.sort(function (a, b) { + return gett(b) - gett(a); + })[0]; }); - if(!list.length){ + ("step 6"); + var index2 = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control); + player.storage.caiyi_info[event.index].push(index2); + if (index2 == 3) { + var list = player.storage.caiyi_info[event.index].filter(function (i) { + return i != 3 && lib.skill.caiyi.filterx[event.index][i](target); + }); + if (!list.length) { event.finish(); return; } - index2=list.randomGet(); + index2 = list.randomGet(); } - switch(index2){ + switch (index2) { case 0: target.damage(num); break; case 1: - target.chooseToDiscard(num,true,'he'); + target.chooseToDiscard(num, true, "he"); break; case 2: - target.isTurnedOver()||target.turnOver(); + target.isTurnedOver() || target.turnOver(); break; } - if(index2!=2) event.finish(); - 'step 7' - target.isLinked()||target.link(); + if (index2 != 2) event.finish(); + ("step 7"); + target.isLinked() || target.link(); event.finish(); }, - mark:true, - marktext:'☯', - intro:{ - content:function(storage){ - if(storage) return '转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。'; - return '转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。'; + mark: true, + marktext: "☯", + intro: { + content: function (storage) { + if (storage) + return "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。"; + return "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。"; }, }, }, - guili:{ - audio:2, - trigger:{player:'phaseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.phaseNumber==1&&game.hasPlayer((current)=>current!=player); + guili: { + audio: 2, + trigger: { player: "phaseBegin" }, + forced: true, + locked: false, + filter: function (event, player) { + return player.phaseNumber == 1 && game.hasPlayer((current) => current != player); }, - content:function(){ - 'step 0' - player.chooseTarget(lib.filter.notMe,true,'请选择【归离】的目标',lib.translate.guili_info).set('ai',function(target){ - return -get.threaten(target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - game.log(player,'选择了',target); - player.storage.guili_insert=target; - player.addSkill('guili_insert'); + content: function () { + "step 0"; + player + .chooseTarget( + lib.filter.notMe, + true, + "请选择【归离】的目标", + lib.translate.guili_info + ) + .set("ai", function (target) { + return -get.threaten(target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(player, "选择了", target); + player.storage.guili_insert = target; + player.addSkill("guili_insert"); game.delayx(); } }, - onremove:true, - subSkill:{ - insert:{ - mark:true, - intro:{ - content:'players' + onremove: true, + subSkill: { + insert: { + mark: true, + intro: { + content: "players", }, - trigger:{global:'phaseAfter'}, - forced:true, - charlotte:true, - logTarget:'player', - filter:function(event,player){ - if(event.player!=player.storage.guili_insert) return false; - if(event.player.getHistory('sourceDamage').length>0) return false; - var history=event.player.actionHistory; - if(history[history.length-1].isRound) return true; - for(var i=history.length-2;i>=0;i--){ - if(history[i].isMe) return false; - if(history[i].isRound) return true; + trigger: { global: "phaseAfter" }, + forced: true, + charlotte: true, + logTarget: "player", + filter: function (event, player) { + if (event.player != player.storage.guili_insert) return false; + if (event.player.getHistory("sourceDamage").length > 0) return false; + var history = event.player.actionHistory; + if (history[history.length - 1].isRound) return true; + for (var i = history.length - 2; i >= 0; i--) { + if (history[i].isMe) return false; + if (history[i].isRound) return true; } return false; }, - content:function(){ + content: function () { player.insertPhase(); }, }, }, }, //刘虞 - dcsuifu:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - if(player==event.player||!event.player.countCards('h')) return false; - var num=0; - game.countPlayer(function(current){ - if(current==player||current.getSeatNum()==1){ - current.getHistory('damage',function(evt){ - num+=evt.num; + dcsuifu: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + if (player == event.player || !event.player.countCards("h")) return false; + var num = 0; + game.countPlayer(function (current) { + if (current == player || current.getSeatNum() == 1) { + current.getHistory("damage", function (evt) { + num += evt.num; }); } }); - return num>=2; + return num >= 2; }, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)<=0; + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) <= 0; }, - content:function(){ - 'step 0' - var target=trigger.player,cards=target.getCards('h'); - target.lose(cards,ui.cardPile,'insert'); + content: function () { + "step 0"; + var target = trigger.player, + cards = target.getCards("h"); + target.lose(cards, ui.cardPile, "insert"); target.$throw(cards.length); game.updateRoundNumber(); - game.log(player,'将',target,'的',get.cnNumber(cards.length),'张手牌置于牌堆顶'); - 'step 1' + game.log(player, "将", target, "的", get.cnNumber(cards.length), "张手牌置于牌堆顶"); + ("step 1"); game.delayx(); - player.chooseUseTarget({name:'wugu',isCard:true},true); + player.chooseUseTarget({ name: "wugu", isCard: true }, true); }, }, - dcpijing:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget([1,game.countPlayer()],get.prompt('dcpijing'),'令任意名角色获得技能〖自牧〗').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var targets=result.targets; + dcpijing: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + [1, game.countPlayer()], + get.prompt("dcpijing"), + "令任意名角色获得技能〖自牧〗" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; targets.add(player); targets.sortBySeat(); - player.logSkill('dcpijing',targets); - game.countPlayer(function(current){ - if(!targets.includes(current)) current.removeSkills('dczimu'); - else current.addSkills('dczimu'); + player.logSkill("dcpijing", targets); + game.countPlayer(function (current) { + if (!targets.includes(current)) current.removeSkills("dczimu"); + else current.addSkills("dczimu"); }); game.delayx(); } }, - derivation:'dczimu', + derivation: "dczimu", }, - dczimu:{ - audio:2, - trigger:{player:'damageEnd'}, - forced:true, - mark:true, - logTarget:function(event,player){ - return game.filterPlayer(function(current){ - return current.hasSkill('dczimu',null,null,false); - }).sortBySeat(); + dczimu: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + mark: true, + logTarget: function (event, player) { + return game + .filterPlayer(function (current) { + return current.hasSkill("dczimu", null, null, false); + }) + .sortBySeat(); }, - content:function(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current.hasSkill('dczimu',null,null,false); + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current.hasSkill("dczimu", null, null, false); }); - if(list.length>0){ - if(list.length==1) list[0].draw(); - else{ + if (list.length > 0) { + if (list.length == 1) list[0].draw(); + else { game.asyncDraw(list); - event.delay=true; + event.delay = true; } } - 'step 1' - player.removeSkills('dczimu'); - if(event.delay) game.delayx(); + ("step 1"); + player.removeSkills("dczimu"); + if (event.delay) game.delayx(); + }, + marktext: "牧", + intro: { + content: + "锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。", }, - marktext:'牧', - intro:{content:'锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。'}, }, //黄祖 - dcjinggong:{ - audio:2, - enable:'chooseToUse', - locked:false, - mod:{ - targetInRange:function(card){ - if(card.storage&&card.storage.dcjinggong) return true; + dcjinggong: { + audio: 2, + enable: "chooseToUse", + locked: false, + mod: { + targetInRange: function (card) { + if (card.storage && card.storage.dcjinggong) return true; }, }, - viewAsFilter:function(player){ - return player.hasCard(function(card){ - return get.type(card)=='equip'; - },'ehs'); + viewAsFilter: function (player) { + return player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "ehs"); }, - position:'hes', - filterCard:{type:'equip'}, - viewAs:{ - name:'sha', - storage:{dcjinggong:true}, + position: "hes", + filterCard: { type: "equip" }, + viewAs: { + name: "sha", + storage: { dcjinggong: true }, }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - ai:{ - respondSha:true, - skillTagFilter:function(player){ - return player.hasCard(function(card){ - return get.type(card)=='equip'; - },'ehs'); + ai: { + respondSha: true, + skillTagFilter: function (player) { + return player.hasCard(function (card) { + return get.type(card) == "equip"; + }, "ehs"); }, }, - group:'dcjinggong_base', - subSkill:{ - base:{ - trigger:{player:'useCard1'}, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - return event.skill=='dcjinggong'&&event.targets.length>0; + group: "dcjinggong_base", + subSkill: { + base: { + trigger: { player: "useCard1" }, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + return event.skill == "dcjinggong" && event.targets.length > 0; }, - content:function(){ - trigger.baseDamage=Math.min(5,get.distance(player,trigger.targets[0])); + content: function () { + trigger.baseDamage = Math.min(5, get.distance(player, trigger.targets[0])); }, }, }, }, - dcxiaojuan:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - logTarget:'target', - filter:function(event,player){ - return event.targets.length==1&&player!=event.target&&event.target.countCards('h')>1; + dcxiaojuan: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + logTarget: "target", + filter: function (event, player) { + return ( + event.targets.length == 1 && + player != event.target && + event.target.countCards("h") > 1 + ); }, - check:function(event,player){ - var target=event.target; - if(get.attitude(player,target)>=0) return false; - if(get.color(event.card)=='none') return true; - return Math.floor(target.countCards('h')/2)>=Math.floor(player.countCards('h')/2); + check: function (event, player) { + var target = event.target; + if (get.attitude(player, target) >= 0) return false; + if (get.color(event.card) == "none") return true; + return Math.floor(target.countCards("h") / 2) >= Math.floor(player.countCards("h") / 2); }, - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - var num=Math.floor(target.countCards('h')/2); - if(num>0) player.discardPlayerCard(target,'h',num,true); + content: function () { + "step 0"; + var target = trigger.target; + event.target = target; + var num = Math.floor(target.countCards("h") / 2); + if (num > 0) player.discardPlayerCard(target, "h", num, true); else event.finish(); - 'step 1' - var suit=get.suit(trigger.card); - if(result.bool&&lib.suit.includes(suit)&&player.countCards('h')>1){ - var bool=false; - for(var i of result.cards){ - if(get.suit(i,target)==suit){ - bool=true; + ("step 1"); + var suit = get.suit(trigger.card); + if (result.bool && lib.suit.includes(suit) && player.countCards("h") > 1) { + var bool = false; + for (var i of result.cards) { + if (get.suit(i, target) == suit) { + bool = true; break; } } - if(!bool) event.finish(); - } - else event.finish(); - 'step 2' - if(player.countCards('h')>0) player.chooseToDiscard('h',1,true); + if (!bool) event.finish(); + } else event.finish(); + ("step 2"); + if (player.countCards("h") > 0) player.chooseToDiscard("h", 1, true); }, }, //来莺儿 - xiaowu:{ - audio:2, - enable:'phaseUse', - usable:1, - selectTarget:function(){ - return [1,game.countPlayer()-1]; + xiaowu: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectTarget: function () { + return [1, game.countPlayer() - 1]; }, - complexSelect:true, - complexTarget:true, - filterTarget:function(card,player,target){ - if(player==target) return false; - var next=player.getNext(),prev=player.getPrevious(); - var selected=ui.selected.targets; - if(!selected.includes(next)&&!selected.includes(prev)) return (target==next||target==prev); - for(var i of selected){ - if(i.getNext()==target||i.getPrevious()==target) return true; + complexSelect: true, + complexTarget: true, + filterTarget: function (card, player, target) { + if (player == target) return false; + var next = player.getNext(), + prev = player.getPrevious(); + var selected = ui.selected.targets; + if (!selected.includes(next) && !selected.includes(prev)) + return target == next || target == prev; + for (var i of selected) { + if (i.getNext() == target || i.getPrevious() == target) return true; } return false; }, - contentBefore:function(){ - event.getParent()._xiaowu_targets=[]; + contentBefore: function () { + event.getParent()._xiaowu_targets = []; }, - content:function(){ - 'step 0' - if(!target.isIn()){ + content: function () { + "step 0"; + if (!target.isIn()) { event.finish(); return; } - target.chooseControl().set('choiceList',[ - '令'+get.translation(player)+'摸一张牌', - '令自己摸一张牌', - ]).set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().player; - var all=_status.event.getParent().targets.length,dam=_status.event.getParent(2)._xiaowu_targets.length; - if(get.attitude(player,target)>0||dam>=Math.floor(all/2)) return 0; - return 1; - }); - 'step 1' - if(result.index==0){ + target + .chooseControl() + .set("choiceList", ["令" + get.translation(player) + "摸一张牌", "令自己摸一张牌"]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + var all = _status.event.getParent().targets.length, + dam = _status.event.getParent(2)._xiaowu_targets.length; + if (get.attitude(player, target) > 0 || dam >= Math.floor(all / 2)) return 0; + return 1; + }); + ("step 1"); + if (result.index == 0) { player.draw(); - } - else{ + } else { target.draw(); event.getParent()._xiaowu_targets.push(target); } }, - contentAfter:function(){ - var targetsx=event.getParent()._xiaowu_targets; - var num=(targets.length-targetsx.length-targetsx.length); - if(num>0) player.addMark('shawu',1); - else if(num<0){ - player.line(targetsx,'fire'); - for(var i of targetsx) i.damage(); + contentAfter: function () { + var targetsx = event.getParent()._xiaowu_targets; + var num = targets.length - targetsx.length - targetsx.length; + if (num > 0) player.addMark("shawu", 1); + else if (num < 0) { + player.line(targetsx, "fire"); + for (var i of targetsx) i.damage(); } }, - ai:{ - order:8, - result:{player:1}, + ai: { + order: 8, + result: { player: 1 }, }, }, - huaping:{ - audio:2, - trigger:{global:'die'}, - limited:true, - skillAnimation:true, - animationColor:'fire', - filter:function(event,player){ - return player!=event.player; + huaping: { + audio: 2, + trigger: { global: "die" }, + limited: true, + skillAnimation: true, + animationColor: "fire", + filter: function (event, player) { + return player != event.player; }, - logTarget:'player', - check:function(event,player){ - return get.rank(event.player.name,true)>=5; + logTarget: "player", + check: function (event, player) { + return get.rank(event.player.name, true) >= 5; }, - content:function(){ - player.awakenSkill('huaping'); - var skills=trigger.player.getSkills(null,false,false).filter(function(i){ - var info=get.info(i); - return info&&!info.charlotte; + content: function () { + player.awakenSkill("huaping"); + var skills = trigger.player.getSkills(null, false, false).filter(function (i) { + var info = get.info(i); + return info && !info.charlotte; }); - if(skills.length){ + if (skills.length) { //for(var i of skills) player.addSkillLog(i); player.addSkills(skills); } - player.removeSkills('xiaowu'); - var num=player.countMark('shawu'); - if(num>0){ - player.removeMark('shawu',num); + player.removeSkills("xiaowu"); + var num = player.countMark("shawu"); + if (num > 0) { + player.removeMark("shawu", num); player.draw(num); } }, - group:'huaping_give', - subSkill:{ - give:{ - audio:'huaping', - trigger:{player:'die'}, - direct:true, - filter:function(event,player){ - return event.player==player; + group: "huaping_give", + subSkill: { + give: { + audio: "huaping", + trigger: { player: "die" }, + direct: true, + filter: function (event, player) { + return event.player == player; }, - forceDie:true, - skillAnimation:true, - animationColor:'gray', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('huaping'),'令一名其他角色获得〖沙舞〗',lib.filter.notMe).set('forceDie',true).set('ai',function(target){ - return get.attitude(_status.event.player,target)+100; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.awakenSkill('huaping'); - player.logSkill('huaping_give',target); - target.addSkills('shawu'); - var num=player.countMark('shawu'); - if(num>0){ - player.removeMark('shawu',num); - target.addMark('shawu',num); + forceDie: true, + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("huaping"), + "令一名其他角色获得〖沙舞〗", + lib.filter.notMe + ) + .set("forceDie", true) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) + 100; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.awakenSkill("huaping"); + player.logSkill("huaping_give", target); + target.addSkills("shawu"); + var num = player.countMark("shawu"); + if (num > 0) { + player.removeMark("shawu", num); + target.addMark("shawu", num); } } }, }, }, - derivation:'shawu', + derivation: "shawu", }, - shawu:{ - audio:2, - trigger:{player:'useCardToTargeted'}, - shaRelated:true, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&event.player.isIn()&&(player.hasMark('shawu')||player.countCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'shawu'); - })>1); + shawu: { + audio: 2, + trigger: { player: "useCardToTargeted" }, + shaRelated: true, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.player.isIn() && + (player.hasMark("shawu") || + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "shawu"); + }) > 1) + ); }, - content:function(){ - 'step 0' - var list=[]; - if(player.countCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'shawu'); - })>1) list.push('弃置手牌'); - if(player.hasMark('shawu')) list.push('移除标记'); - list.push('cancel2'); - player.chooseControl(list).set('prompt',get.prompt('shawu',trigger.target)).set('prompt2','弃置两张手牌,或移去一枚“沙”并摸两张牌,然后对该角色造成1点伤害').set('ai',function(){ - var player=_status.event.player,target=_status.event.getTrigger().target; - if(get.damageEffect(target,player,player)<=0) return 'cancel2'; - if(player.hasMark('shawu')) return '移除标记'; - if(player.countCards('h',function(card){ - return lib.filter.cardDiscardable(card,player,'shawu')&&get.value(card)<=6.5; - })>1) return '弃置手牌'; - return 'cancel2'; - }); - 'step 1' - var target=trigger.target; - if(result.control=='cancel2'){ + content: function () { + "step 0"; + var list = []; + if ( + player.countCards("h", function (card) { + return lib.filter.cardDiscardable(card, player, "shawu"); + }) > 1 + ) + list.push("弃置手牌"); + if (player.hasMark("shawu")) list.push("移除标记"); + list.push("cancel2"); + player + .chooseControl(list) + .set("prompt", get.prompt("shawu", trigger.target)) + .set("prompt2", "弃置两张手牌,或移去一枚“沙”并摸两张牌,然后对该角色造成1点伤害") + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getTrigger().target; + if (get.damageEffect(target, player, player) <= 0) return "cancel2"; + if (player.hasMark("shawu")) return "移除标记"; + if ( + player.countCards("h", function (card) { + return ( + lib.filter.cardDiscardable(card, player, "shawu") && + get.value(card) <= 6.5 + ); + }) > 1 + ) + return "弃置手牌"; + return "cancel2"; + }); + ("step 1"); + var target = trigger.target; + if (result.control == "cancel2") { event.finish(); return; - } - else if(result.control=='移除标记'){ - player.logSkill('shawu',target); - player.removeMark('shawu',1); + } else if (result.control == "移除标记") { + player.logSkill("shawu", target); + player.removeMark("shawu", 1); player.draw(2); target.damage(); event.finish(); + } else { + player.chooseToDiscard("h", true, 2).logSkill = ["shawu", target]; } - else{ - player.chooseToDiscard('h',true,2).logSkill=['shawu',target]; - } - 'step 2' + ("step 2"); trigger.target.damage(); }, - intro:{ - content:'mark', + intro: { + content: "mark", }, }, //曹髦 - qianlong:{ - audio:2, - trigger:{player:'damageEnd'}, - frequent:true, - content:function(){ - 'step 0' - var cards=get.cards(3); - event.cards=cards; + qianlong: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + content: function () { + "step 0"; + var cards = get.cards(3); + event.cards = cards; game.cardsGotoOrdering(cards); //展示牌 - game.log(player,'展示了',event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards){ - if(player==game.me||player.isUnderControl()) return; - var str=get.translation(player)+'发动了【潜龙】'; - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards); - game.addVideo('showCards',player,[get.translation(player)+'发动了【潜龙】',get.cardsInfo(event.cards)]); - if(player!=game.me&&!player.isUnderControl()&&!player.isOnline()) game.delay(2); + game.log(player, "展示了", event.cards); + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards) { + if (player == game.me || player.isUnderControl()) return; + var str = get.translation(player) + "发动了【潜龙】"; + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [ + get.translation(player) + "发动了【潜龙】", + get.cardsInfo(event.cards), + ]); + if (player != game.me && !player.isUnderControl() && !player.isOnline()) game.delay(2); //选牌 - var next=player.chooseToMove('潜龙:获得至多'+get.cnNumber(Math.min(3,player.getDamagedHp()))+'张牌并将其余牌置于牌堆底'); - next.set('list',[ - ['置于牌堆底',cards], - ['自己获得'], - ]) - next.set('filterMove',function(from,to,moved){ - if(moved[0].includes(from.link)){ - if(typeof to=='number'){ - if(to==1){ - if(moved[1].length>=_status.event.player.getDamagedHp()) return false; + var next = player.chooseToMove( + "潜龙:获得至多" + + get.cnNumber(Math.min(3, player.getDamagedHp())) + + "张牌并将其余牌置于牌堆底" + ); + next.set("list", [["置于牌堆底", cards], ["自己获得"]]); + next.set("filterMove", function (from, to, moved) { + if (moved[0].includes(from.link)) { + if (typeof to == "number") { + if (to == 1) { + if (moved[1].length >= _status.event.player.getDamagedHp()) return false; } return true; } } return true; }); - next.set('processAI',function(list){ - let cards=list[0][1].slice(0),player=_status.event.player; - cards.sort((a,b)=>{ - return get.value(b,player)-get.value(a,player); + next.set("processAI", function (list) { + let cards = list[0][1].slice(0), + player = _status.event.player; + cards.sort((a, b) => { + return get.value(b, player) - get.value(a, player); }); - if(!player.storage.juetao&&player.hasSkill('juetao')&&player.hasSha()){ - let gain,bottom,pai=cards.filter(card=>card.name!=='sha'); - pai.sort((a,b)=>{ - return get.value(b,player)-get.value(a,player); + if (!player.storage.juetao && player.hasSkill("juetao") && player.hasSha()) { + let gain, + bottom, + pai = cards.filter((card) => card.name !== "sha"); + pai.sort((a, b) => { + return get.value(b, player) - get.value(a, player); }); - gain = pai.splice(0,player.getDamagedHp()); + gain = pai.splice(0, player.getDamagedHp()); bottom = cards.slice(0); bottom.removeArray(gain); return [bottom, gain]; } - return [cards,cards.splice(0,player.getDamagedHp())]; + return [cards, cards.splice(0, player.getDamagedHp())]; }); - 'step 1' - game.broadcastAll('closeDialog',event.videoId); - game.addVideo('cardDialog',null,event.videoId); - var moved=result.moved; - if(moved[0].length>0){ - for(var i of moved[0]){ + ("step 1"); + game.broadcastAll("closeDialog", event.videoId); + game.addVideo("cardDialog", null, event.videoId); + var moved = result.moved; + if (moved[0].length > 0) { + for (var i of moved[0]) { i.fix(); ui.cardPile.appendChild(i); } } - if(moved[1].length>0) player.gain(moved[1],'gain2'); + if (moved[1].length > 0) player.gain(moved[1], "gain2"); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(!target.hasFriend()) return; - var num=1; - if(!player.needsToDiscard()&&target.isDamaged()){ - num=0.7; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return; + if (!target.hasFriend()) return; + var num = 1; + if (!player.needsToDiscard() && target.isDamaged()) { + num = 0.7; + } else { + num = 0.5; } - else{ - num=0.5; - } - if(target.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; + if (target.hp >= 4) return [1, num * 2]; + if (target.hp == 3) return [1, num * 1.5]; + if (target.hp == 2) return [1, num * 0.5]; } - } - } - } + }, + }, + }, }, - fensi:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - 'step 0' - if(!game.hasPlayer(function(current){ - return current!=player&¤t.hp>=player.hp; - })){ + fensi: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + content: function () { + "step 0"; + if ( + !game.hasPlayer(function (current) { + return current != player && current.hp >= player.hp; + }) + ) { player.damage(); event.finish(); return; + } else { + player + .chooseTarget( + true, + "忿肆:对一名体力值不小于你的角色造成1点伤害", + function (card, player, target) { + return target.hp >= player.hp; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); } - else{ - player.chooseTarget(true,'忿肆:对一名体力值不小于你的角色造成1点伤害',function(card,player,target){ - return target.hp>=player.hp; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); target.damage(); - } - else event.finish(); - 'step 2' - if(target.isIn()&&target.canUse('sha',player,false)) target.useCard({name:'sha',isCard:true},player,false,'noai'); + } else event.finish(); + ("step 2"); + if (target.isIn() && target.canUse("sha", player, false)) + target.useCard({ name: "sha", isCard: true }, player, false, "noai"); }, }, - juetao:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - limited:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.hp==1; + juetao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + limited: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.hp == 1; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('juetao'),lib.filter.notMe).set('ai',function(target){ - let att=-get.attitude(_status.event.player,target); - if(att<=0) return att; - if(target.hasSkillTag('nodamage')||target.getEquip('qimenbagua')) return 0.01*att; - if(target.getEquip('tengjia')||target.getEquip('renwang')) return 0.3*att; - if(target.getEquip('rewrite_tengjia')||target.getEquip('rewrite_renwang')) return 0.2*att; - if(target.hasSkillTag('freeShan',false,{ - player:_status.event.player - },true)) return 0.3*att; - if(target.getEquip(2)) return att/2; - return 1.2*att; + content: function () { + "step 0"; + player.chooseTarget(get.prompt2("juetao"), lib.filter.notMe).set("ai", function (target) { + let att = -get.attitude(_status.event.player, target); + if (att <= 0) return att; + if (target.hasSkillTag("nodamage") || target.getEquip("qimenbagua")) + return 0.01 * att; + if (target.getEquip("tengjia") || target.getEquip("renwang")) return 0.3 * att; + if (target.getEquip("rewrite_tengjia") || target.getEquip("rewrite_renwang")) + return 0.2 * att; + if ( + target.hasSkillTag( + "freeShan", + false, + { + player: _status.event.player, + }, + true + ) + ) + return 0.3 * att; + if (target.getEquip(2)) return att / 2; + return 1.2 * att; }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('juetao',target); - player.awakenSkill('juetao'); - } - else event.finish(); - 'step 2' - var card=get.bottomCards()[0]; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("juetao", target); + player.awakenSkill("juetao"); + } else event.finish(); + ("step 2"); + var card = get.bottomCards()[0]; game.cardsGotoOrdering(card); player.showCards(card); - player.chooseUseTarget(card,true,false,'nodistance').set('filterTarget',function(card,player,target){ - var evt=_status.event; - if(_status.event.name=='chooseTarget') evt=evt.getParent(); - if(target!=player&&target!=evt.juetao_target) return false; - return lib.filter.targetEnabledx(card,player,target); - }).set('juetao_target',target); - 'step 3' - if(result.bool&&target.isIn()) event.goto(2); + player + .chooseUseTarget(card, true, false, "nodistance") + .set("filterTarget", function (card, player, target) { + var evt = _status.event; + if (_status.event.name == "chooseTarget") evt = evt.getParent(); + if (target != player && target != evt.juetao_target) return false; + return lib.filter.targetEnabledx(card, player, target); + }) + .set("juetao_target", target); + ("step 3"); + if (result.bool && target.isIn()) event.goto(2); }, }, - zhushi:{ - audio:2, - usable:1, - trigger:{global:'recoverEnd'}, - direct:true, - zhuSkill:true, - filter:function(event,player){ - return player!=event.player&&event.player.group=='wei'&&event.player==_status.currentPhase&& - event.player.isIn()&&player.hasZhuSkill('zhushi',event.player); + zhushi: { + audio: 2, + usable: 1, + trigger: { global: "recoverEnd" }, + direct: true, + zhuSkill: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.group == "wei" && + event.player == _status.currentPhase && + event.player.isIn() && + player.hasZhuSkill("zhushi", event.player) + ); }, - content:function(){ - 'step 0' - var str=get.translation(player); - trigger.player.chooseBool('是否响应'+get.translation(player)+'的主公技【助势】?','令'+get.translation(player)+'摸一张牌').set('goon',get.attitude(trigger.player,player)>0).set('ai',()=>_status.event.goon); - 'step 1' - if(result.bool){ - player.logSkill('zhushi'); - trigger.player.line(player,'thunder'); + content: function () { + "step 0"; + var str = get.translation(player); + trigger.player + .chooseBool( + "是否响应" + get.translation(player) + "的主公技【助势】?", + "令" + get.translation(player) + "摸一张牌" + ) + .set("goon", get.attitude(trigger.player, player) > 0) + .set("ai", () => _status.event.goon); + ("step 1"); + if (result.bool) { + player.logSkill("zhushi"); + trigger.player.line(player, "thunder"); player.draw(); - } - else player.storage.counttrigger.zhushi--; + } else player.storage.counttrigger.zhushi--; }, }, //骆统 - renzheng:{ - audio:2, - trigger:{global:['damageCancelled','damageZero','damageAfter']}, - forced:true, - filter:function(event,player,name){ - if(name=='damageCancelled') return true; - for(var i of event.change_history){ - if(i<0) return true; + renzheng: { + audio: 2, + trigger: { global: ["damageCancelled", "damageZero", "damageAfter"] }, + forced: true, + filter: function (event, player, name) { + if (name == "damageCancelled") return true; + for (var i of event.change_history) { + if (i < 0) return true; } return false; }, - content:function(){ + content: function () { player.draw(2); }, }, - jinjian:{ - audio:2, - trigger:{source:'damageBegin1'}, - logTarget:'player', - filter:function(event,player){ - return !event.jinjian_source2&&!player.hasSkill('jinjian_source2'); + jinjian: { + audio: 2, + trigger: { source: "damageBegin1" }, + logTarget: "player", + filter: function (event, player) { + return !event.jinjian_source2 && !player.hasSkill("jinjian_source2"); }, - prompt2:'令即将对其造成的伤害+1', - check:function(event,player){ - return get.attitude(player,event.player)<0&&!event.player.hasSkillTag('filterDamage',null,{ - player:player, - card:event.card, - }); + prompt2: "令即将对其造成的伤害+1", + check: function (event, player) { + return ( + get.attitude(player, event.player) < 0 && + !event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) + ); }, - content:function(){ - trigger.jinjian_source=true; + content: function () { + trigger.jinjian_source = true; trigger.num++; - player.addTempSkill('jinjian_source2') + player.addTempSkill("jinjian_source2"); }, - group:'jinjian_player', - subSkill:{ - player:{ - audio:'jinjian', - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - return !event.jinjian_player2&&!player.hasSkill('jinjian_player2'); + group: "jinjian_player", + subSkill: { + player: { + audio: "jinjian", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return !event.jinjian_player2 && !player.hasSkill("jinjian_player2"); }, - prompt2:'令即将受到的伤害-1', - content:function(){ - trigger.jinjian_player=true; + prompt2: "令即将受到的伤害-1", + content: function () { + trigger.jinjian_player = true; trigger.num--; - player.addTempSkill('jinjian_player2') + player.addTempSkill("jinjian_player2"); }, }, - source2:{ - trigger:{source:'damageBegin1'}, - forced:true, - charlotte:true, - filter:function(event,player){ + source2: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + filter: function (event, player) { return !event.jinjian_source; }, - content:function(){ + content: function () { trigger.num--; - trigger.jinjian_source2=true; - player.removeSkill('jinjian_source2'); + trigger.jinjian_source2 = true; + player.removeSkill("jinjian_source2"); }, - marktext:' -1 ', - intro:{ - content:'下次造成的伤害-1', + marktext: " -1 ", + intro: { + content: "下次造成的伤害-1", }, }, - player2:{ - trigger:{player:'damageBegin3'}, - forced:true, - charlotte:true, - filter:function(event,player){ + player2: { + trigger: { player: "damageBegin3" }, + forced: true, + charlotte: true, + filter: function (event, player) { return !event.jinjian_player; }, - content:function(){ + content: function () { trigger.num++; - trigger.jinjian_player2=true; - player.removeSkill('jinjian_player2'); + trigger.jinjian_player2 = true; + player.removeSkill("jinjian_player2"); }, - marktext:' +1 ', - intro:{ - content:'下次受到的伤害+1', + marktext: " +1 ", + intro: { + content: "下次受到的伤害+1", }, }, }, - ai:{ - maixie_defend:true, - threaten:0.9, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing')) return; + ai: { + maixie_defend: true, + threaten: 0.9, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing")) return; //if(target.hujia) return; - if(player._jinjian_tmp) return; - if(_status.event.getParent('useCard',true)||_status.event.getParent('_wuxie',true)) return; - if(get.tag(card,'damage')){ - if(target.hasSkill('jinjian_player2')){ - return [1,-2]; - } - else{ - if(get.attitude(player,target)>0){ - return [0,0.2]; + if (player._jinjian_tmp) return; + if ( + _status.event.getParent("useCard", true) || + _status.event.getParent("_wuxie", true) + ) + return; + if (get.tag(card, "damage")) { + if (target.hasSkill("jinjian_player2")) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0) { + return [0, 0.2]; } - if(get.attitude(player,target)<0&&!player.hasSkillTag('damageBonus')){ - var sha=player.getCardUsable({name:'sha'}); - player._jinjian_tmp=true; - var num=player.countCards('h',function(card){ - if(card.name=='sha'){ - if(sha==0){ + if ( + get.attitude(player, target) < 0 && + !player.hasSkillTag("damageBonus") + ) { + var sha = player.getCardUsable({ name: "sha" }); + player._jinjian_tmp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha == 0) { return false; - } - else{ + } else { sha--; } } - return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,player)>0; + return ( + get.tag(card, "damage") && + player.canUse(card, target) && + get.effect(target, card, player, player) > 0 + ); }); delete player._jinjian_tmp; - if(player.hasSkillTag('damage')){ + if (player.hasSkillTag("damage")) { num++; } - if(num<2){ - return [0,0.8]; + if (num < 2) { + return [0, 0.8]; } } } } - } - } - } - }, - //冯妤 - tiqi:{ - audio:2, - trigger:{global:['phaseDrawEnd','phaseDrawSkipped','phaseDrawCancelled']}, - filter:function(event,player){ - if(player==event.player) return false; - var num=0; - event.player.getHistory('gain',function(evt){ - if(evt.getParent().name=='draw'&&evt.getParent('phaseDraw')==event) num+=evt.cards.length; - }); - return num!=2; - }, - frequent:true, - logTarget:'player', - content:function(){ - 'step 0' - var num=0; - trigger.player.getHistory('gain',function(evt){ - if(evt.getParent().name=='draw'&&evt.getParent('phaseDraw')==trigger) num+=evt.cards.length; - }); - num=Math.abs(num-2); - event.num=num; - player.draw(num); - 'step 1' - if(trigger.player.isIn()){ - player.chooseControl(' +'+num+' ',' -'+num+' ','cancel2').set('prompt','是否改变'+get.translation(trigger.player)+'本回合的手牌上限?').set('ai',function(){ - var sgn=get.sgn(get.attitude(_status.event.player,_status.event.getTrigger().player)); - if(sgn==0) return 2; - if(sgn==1) return 0; - return 1; - }); - } - else event.finish(); - 'step 2' - if(result.index<2){ - var target=trigger.player; - player.line(target); - if(!target.storage.tiqi_effect) target.storage.tiqi_effect=0; - target.storage.tiqi_effect+=(num*get.sgn(0.5-result.index)); - target.addTempSkill('tiqi_effect'); - target.markSkill('tiqi_effect'); - } - }, - subSkill:{ - effect:{ - mod:{ - maxHandcard:function(player,num){ - if(typeof player.storage.tiqi_effect=='number') return num+player.storage.tiqi_effect; - }, - }, - charlotte:true, - onremove:true, - mark:true, - intro:{ - content:(num)=>('手牌上限'+(num<0?'':'+')+num), }, }, }, }, - baoshu:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - filter:function(event,player){ - return player.maxHp>0; - }, - content:function(){ - 'step 0' - player.chooseTarget([1,player.maxHp],get.prompt('baoshu'),'令至多'+get.cnNumber(player.maxHp)+'名角色重置武将牌并获得“梳”').set('ai',function(target){ - var att=get.attitude(player,target); - if(att<=0) return 0; - //if(target.isTurnedOver()) return 3*att; - if(target.isLinked()&&get.effect(target,{name:'tiesuo'},player,player)>0) return 1.6*att; - if(ui.selected.targets.length>=Math.sqrt(1+player.maxHp)) return 0; - if(target!=player) return 1.3*att; - return att; + //冯妤 + tiqi: { + audio: 2, + trigger: { global: ["phaseDrawEnd", "phaseDrawSkipped", "phaseDrawCancelled"] }, + filter: function (event, player) { + if (player == event.player) return false; + var num = 0; + event.player.getHistory("gain", function (evt) { + if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == event) + num += evt.cards.length; }); - 'step 1' - if(result.bool){ - var targets=result.targets; - targets.sortBySeat(); - player.logSkill('baoshu',targets); - event.targets=targets; - event.num=0; - event.num2=(1+player.maxHp-targets.length); + return num != 2; + }, + frequent: true, + logTarget: "player", + content: function () { + "step 0"; + var num = 0; + trigger.player.getHistory("gain", function (evt) { + if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == trigger) + num += evt.cards.length; + }); + num = Math.abs(num - 2); + event.num = num; + player.draw(num); + ("step 1"); + if (trigger.player.isIn()) { + player + .chooseControl(" +" + num + " ", " -" + num + " ", "cancel2") + .set( + "prompt", + "是否改变" + get.translation(trigger.player) + "本回合的手牌上限?" + ) + .set("ai", function () { + var sgn = get.sgn( + get.attitude(_status.event.player, _status.event.getTrigger().player) + ); + if (sgn == 0) return 2; + if (sgn == 1) return 0; + return 1; + }); + } else event.finish(); + ("step 2"); + if (result.index < 2) { + var target = trigger.player; + player.line(target); + if (!target.storage.tiqi_effect) target.storage.tiqi_effect = 0; + target.storage.tiqi_effect += num * get.sgn(0.5 - result.index); + target.addTempSkill("tiqi_effect"); + target.markSkill("tiqi_effect"); } - else event.finish(); - 'step 2' - var target=targets[num]; - event.target=target; - if(!target.isIn()){ - if(num "手牌上限" + (num < 0 ? "" : "+") + num, + }, + }, + }, + }, + baoshu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + filter: function (event, player) { + return player.maxHp > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget( + [1, player.maxHp], + get.prompt("baoshu"), + "令至多" + get.cnNumber(player.maxHp) + "名角色重置武将牌并获得“梳”" + ) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (att <= 0) return 0; + //if(target.isTurnedOver()) return 3*att; + if ( + target.isLinked() && + get.effect(target, { name: "tiesuo" }, player, player) > 0 + ) + return 1.6 * att; + if (ui.selected.targets.length >= Math.sqrt(1 + player.maxHp)) return 0; + if (target != player) return 1.3 * att; + return att; + }); + ("step 1"); + if (result.bool) { + var targets = result.targets; + targets.sortBySeat(); + player.logSkill("baoshu", targets); + event.targets = targets; + event.num = 0; + event.num2 = 1 + player.maxHp - targets.length; + } else event.finish(); + ("step 2"); + var target = targets[num]; + event.target = target; + if (!target.isIn()) { + if (num < targets.length - 1) { event.num++; event.goto(2); - } - else event.finish(); - } - else if(target.isLinked()) target.link(); - 'step 3' - if(target.isIn()) target.addMark('baoshu',event.num2); - if(num0; + tianyun: { + audio: 2, + trigger: { global: "phaseBegin" }, + frequent: true, + filter: function (event, player) { + return event.player.getSeatNum() == game.roundNumber && player.countCards("h") > 0; }, - content:function(){ - 'step 0' - var suits=[],hs=player.getCards('h'); - for(var i of hs){ - suits.add(get.suit(i,player)); + content: function () { + "step 0"; + var suits = [], + hs = player.getCards("h"); + for (var i of hs) { + suits.add(get.suit(i, player)); } - var num=suits.length; - event.num=num; - var cards=get.cards(num); + var num = suits.length; + event.num = num; + var cards = get.cards(num); game.cardsGotoOrdering(cards); - var next=player.chooseToMove(); - next.set('list',[ - ['牌堆顶',cards], - ['牌堆底'], - ]); - next.set('prompt','天运:点击将牌移动到牌堆顶或牌堆底'); - next.processAI=function(list){ - var cards=list[0][1] - return [[],cards]; - } - 'step 1' - var top=result.moved[0]; - var bottom=result.moved[1]; + var next = player.chooseToMove(); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("prompt", "天运:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = function (list) { + var cards = list[0][1]; + return [[], cards]; + }; + ("step 1"); + var top = result.moved[0]; + var bottom = result.moved[1]; top.reverse(); - for(var i=0;i1&&player.hp>5-num); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + ("step 2"); + player + .chooseTarget("是否令一名角色摸" + get.cnNumber(num) + "张牌,然后失去1点体力?") + .set("", function (target) { + if (!_status.event.goon || target.hasSkillTag("nogain")) return 0; + return ( + get.attitude(_status.event.player, target) * + Math.sqrt(Math.max(1, 5 - target.getCards("h"))) + ); + }) + .set("goon", num > 1 && player.hp > 5 - num); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.draw(num); player.loseHp(); - } - else game.delayx(); + } else game.delayx(); }, - group:'tianyun_gain', - subSkill:{ - gain:{ - audio:'tianyun', - trigger:{ - global:'phaseBefore', - player:'enterGame', + group: "tianyun_gain", + subSkill: { + gain: { + audio: "tianyun", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - if(event.name=='phase'&&game.phaseNumber!=0) return false; - var suits=lib.suit.slice(0),hs=player.getCards('h'); - for(var i of hs){ - suits.remove(get.suit(i,player)); - if(!suits.length) return false; + forced: true, + locked: false, + filter: function (event, player) { + if (event.name == "phase" && game.phaseNumber != 0) return false; + var suits = lib.suit.slice(0), + hs = player.getCards("h"); + for (var i of hs) { + suits.remove(get.suit(i, player)); + if (!suits.length) return false; } return true; }, - content:function(){ - var suits=lib.suit.slice(0),hs=player.getCards('h'); - for(var i of hs){ - suits.remove(get.suit(i,player)); + content: function () { + var suits = lib.suit.slice(0), + hs = player.getCards("h"); + for (var i of hs) { + suits.remove(get.suit(i, player)); } - var cards=[]; - for(var i of suits){ - var card=get.cardPile(function(card){ - return get.suit(card,false)==i; + var cards = []; + for (var i of suits) { + var card = get.cardPile(function (card) { + return get.suit(card, false) == i; }); - if(card) cards.push(card); + if (card) cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); }, }, }, }, - wfyuyan:{ - audio:2, - derivation:'refenyin', - trigger:{global:'roundStart'}, - forced:true, - locked:false, - content:function(){ - 'step 0' - var next=player.chooseTarget('请选择【预言】的目标',true).set('animate',false).set('ai',function(){ - return Math.random(); - }); - 'step 1' - if(result.bool){ - player.storage.wfyuyan=result.targets[0]; - player.addSkill('wfyuyan_dying'); - player.addSkill('wfyuyan_damage'); + wfyuyan: { + audio: 2, + derivation: "refenyin", + trigger: { global: "roundStart" }, + forced: true, + locked: false, + content: function () { + "step 0"; + var next = player + .chooseTarget("请选择【预言】的目标", true) + .set("animate", false) + .set("ai", function () { + return Math.random(); + }); + ("step 1"); + if (result.bool) { + player.storage.wfyuyan = result.targets[0]; + player.addSkill("wfyuyan_dying"); + player.addSkill("wfyuyan_damage"); } }, - subSkill:{ - dying:{ - trigger:{global:'dying'}, - forced:true, - charlotte:true, - popup:false, - content:function(){ - if(trigger.player==player.storage.wfyuyan){ - player.logSkill('wfyuyan',trigger.player); - player.addTempSkill('iwasawa_refenyin',{player:'phaseEnd'}); + subSkill: { + dying: { + trigger: { global: "dying" }, + forced: true, + charlotte: true, + popup: false, + content: function () { + if (trigger.player == player.storage.wfyuyan) { + player.logSkill("wfyuyan", trigger.player); + player.addTempSkill("iwasawa_refenyin", { player: "phaseEnd" }); } - player.removeSkill('wfyuyan_dying'); + player.removeSkill("wfyuyan_dying"); }, }, - damage:{ - trigger:{global:'damageSource'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return event.source&&event.source.isIn(); + damage: { + trigger: { global: "damageSource" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return event.source && event.source.isIn(); }, - content:function(){ - if(trigger.source==player.storage.wfyuyan){ - player.logSkill('wfyuyan',trigger.source); + content: function () { + if (trigger.source == player.storage.wfyuyan) { + player.logSkill("wfyuyan", trigger.source); player.draw(2); } - player.removeSkill('wfyuyan_damage'); + player.removeSkill("wfyuyan_damage"); }, }, }, }, //张宝 - xinzhoufu:{ - audio:'zhoufu', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0; + xinzhoufu: { + audio: "zhoufu", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filterCard:true, - filterTarget:function(card,player,target){ - return target!=player&&!target.getExpansions('xinzhoufu2').length; + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && !target.getExpansions("xinzhoufu2").length; }, - check:function(card){ - return 6-get.value(card) + check: function (card) { + return 6 - get.value(card); }, - position:'he', - discard:false, - lose:false, - delay:false, - content:function(){ - target.addToExpansion(cards,player,'give').gaintag.add('xinzhoufu2'); - target.addSkill('xinzhoufu_judge'); + position: "he", + discard: false, + lose: false, + delay: false, + content: function () { + target.addToExpansion(cards, player, "give").gaintag.add("xinzhoufu2"); + target.addSkill("xinzhoufu_judge"); }, - ai:{ - order:9, - result:{ - target:function(player,target){ - if(player.inRange(target)) return -1.3; + ai: { + order: 9, + result: { + target: function (player, target) { + if (player.inRange(target)) return -1.3; return -1; }, }, }, - subSkill:{ - judge:{ - audio:'zhoufu', - trigger:{player:'judgeBefore'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return !event.directresult&&player.getExpansions('xinzhoufu2').length; + subSkill: { + judge: { + audio: "zhoufu", + trigger: { player: "judgeBefore" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return !event.directresult && player.getExpansions("xinzhoufu2").length; }, - content:function(){ - var cards=[player.getExpansions('xinzhoufu2')[0]]; - trigger.directresult=cards[0]; + content: function () { + var cards = [player.getExpansions("xinzhoufu2")[0]]; + trigger.directresult = cards[0]; }, }, }, }, - xinzhoufu2:{ - intro:{ - content:'expansion', - markcount:'expansion', + xinzhoufu2: { + intro: { + content: "expansion", + markcount: "expansion", }, }, - xinyingbing:{ - audio:'yingbin', - trigger:{player:'useCardToPlayered'}, - forced:true, - logTarget:'target', - filter:function(event,player){ - return event.target.getExpansions('xinzhoufu2').length>0&&!player.hasHistory('gain',function(evt){ - var evtx=evt.getParent(2); - return evtx&&evtx.name=='xinyingbing'&&evtx._trigger.target==event.target; - }); + xinyingbing: { + audio: "yingbin", + trigger: { player: "useCardToPlayered" }, + forced: true, + logTarget: "target", + filter: function (event, player) { + return ( + event.target.getExpansions("xinzhoufu2").length > 0 && + !player.hasHistory("gain", function (evt) { + var evtx = evt.getParent(2); + return evtx && evtx.name == "xinyingbing" && evtx._trigger.target == event.target; + }) + ); }, - content:function(){ + content: function () { player.draw(2); }, - ai:{ - effect:{ - player:function(card,player,target){ - if(target&&target.getExpansions('xinzhoufu2').length>0&&!player.hasHistory('gain',function(evt){ - var evtx=evt.getParent(2); - return evtx&&evtx.name=='xinyingbing'&&evtx._trigger.target==target; - })) return [1,1]; + ai: { + effect: { + player: function (card, player, target) { + if ( + target && + target.getExpansions("xinzhoufu2").length > 0 && + !player.hasHistory("gain", function (evt) { + var evtx = evt.getParent(2); + return ( + evtx && evtx.name == "xinyingbing" && evtx._trigger.target == target + ); + }) + ) + return [1, 1]; }, }, - combo:'xinzhoufu' + combo: "xinzhoufu", }, }, //孙翊 - syjiqiao:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - content:function(){ - var cards=get.cards(player.maxHp); - cards.sort(function(a,b){ - return get.color(b).length-get.color(a).length; + syjiqiao: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + content: function () { + var cards = get.cards(player.maxHp); + cards.sort(function (a, b) { + return get.color(b).length - get.color(a).length; }); - player.addToExpansion(cards,'gain2').gaintag.add('syjiqiao'); - player.addTempSkill('syjiqiao_gain','phaseUseAfter'); + player.addToExpansion(cards, "gain2").gaintag.add("syjiqiao"); + player.addTempSkill("syjiqiao_gain", "phaseUseAfter"); }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - subSkill:{ - gain:{ - audio:'syjiqiao', - trigger:{player:'useCardAfter'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return player.hasCard((card)=>card.hasGaintag('syjiqiao'),'x'); + subSkill: { + gain: { + audio: "syjiqiao", + trigger: { player: "useCardAfter" }, + charlotte: true, + forced: true, + filter: function (event, player) { + return player.hasCard((card) => card.hasGaintag("syjiqiao"), "x"); }, - content:function(){ - 'step 0' - var cards=player.getExpansions('syjiqiao') - var dialog=['激峭:选择获得一张牌'] - var reds=[],blacks=[]; - for(var i of cards) (get.color(i)=='red'?reds:blacks).push(i); - if(reds.length>0){ + content: function () { + "step 0"; + var cards = player.getExpansions("syjiqiao"); + var dialog = ["激峭:选择获得一张牌"]; + var reds = [], + blacks = []; + for (var i of cards) (get.color(i) == "red" ? reds : blacks).push(i); + if (reds.length > 0) { dialog.push('
    红色牌
    '); dialog.push(reds); } - if(blacks.length>0){ + if (blacks.length > 0) { dialog.push('
    黑色牌
    '); dialog.push(blacks); } - player.chooseButton(dialog,true).set('ai',function(button){ - var player=_status.event.player; - var color=get.color(button.link),cards=player.getExpansions('syjiqiao'); - var num1=cards.filter((card)=>get.color(card)==color).length,num2=cards.length-num1; - if(num1>=num2) return get.value(button.link); + player.chooseButton(dialog, true).set("ai", function (button) { + var player = _status.event.player; + var color = get.color(button.link), + cards = player.getExpansions("syjiqiao"); + var num1 = cards.filter((card) => get.color(card) == color).length, + num2 = cards.length - num1; + if (num1 >= num2) return get.value(button.link); return 0; }); - 'step 1' - if(result.bool){ - player.gain(result.links,'gain2'); + ("step 1"); + if (result.bool) { + player.gain(result.links, "gain2"); + } else event.finish(); + ("step 2"); + var map = { red: 0, black: 0 }, + cards = player.getExpansions("syjiqiao"); + for (var i of cards) { + var color = get.color(i, false); + if (map[color] != undefined) map[color]++; } - else event.finish(); - 'step 2' - var map={red:0,black:0},cards=player.getExpansions('syjiqiao') - for(var i of cards){ - var color=get.color(i,false); - if(map[color]!=undefined) map[color]++; - } - if(map.red==map.black) player.recover(); + if (map.red == map.black) player.recover(); else player.loseHp(); }, - onremove:function(player){ - var cards=player.getExpansions('syjiqiao') - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player) { + var cards = player.getExpansions("syjiqiao"); + if (cards.length) player.loseToDiscardpile(cards); }, }, }, }, - syxiongyi:{ - audio:2, - skillAnimation:true, - animationColor:'wood', - limited:true, - enable:'chooseToUse', - filter:function(event,player){ - if(event.type!='dying') return false; - if(player!=event.dying) return false; + syxiongyi: { + audio: 2, + skillAnimation: true, + animationColor: "wood", + limited: true, + enable: "chooseToUse", + filter: function (event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; return true; }, - async content(event,trigger,player){ - 'step 0' - player.awakenSkill('syxiongyi'); - if(!_status.characterlist){ + async content(event, trigger, player) { + "step 0"; + player.awakenSkill("syxiongyi"); + if (!_status.characterlist) { lib.skill.pingjian.initList(); } - if(_status.characterlist.includes('xushi')){ - if (player.name2&&get.character(player.name2)[3].includes('syxiongyi')) { - await player.reinitCharacter(player.name2, 'xushi'); + if (_status.characterlist.includes("xushi")) { + if (player.name2 && get.character(player.name2)[3].includes("syxiongyi")) { + await player.reinitCharacter(player.name2, "xushi"); + } else { + await player.reinitCharacter(player.name1, "xushi"); } - else { - await player.reinitCharacter(player.name1, 'xushi'); - } - if(player.hp<3) await player.recover(3-player.hp); - } - else{ - await player.addSkills('olhunzi'); - if(player.hp<1) await player.recover(1-player.hp); + if (player.hp < 3) await player.recover(3 - player.hp); + } else { + await player.addSkills("olhunzi"); + if (player.hp < 1) await player.recover(1 - player.hp); } }, - ai:{ - order:1, - save:true, - skillTagFilter:function(player,arg,target){ - return player==target; + ai: { + order: 1, + save: true, + skillTagFilter: function (player, arg, target) { + return player == target; }, - result:{ - player:10 + result: { + player: 10, }, }, - derivation:['olhunzi','reyingzi','gzyinghun'], + derivation: ["olhunzi", "reyingzi", "gzyinghun"], }, - gzyinghun_re_sunyi:{audio:1}, - reyingzi_re_sunyi:{audio:1}, + gzyinghun_re_sunyi: { audio: 1 }, + reyingzi_re_sunyi: { audio: 1 }, //曹金玉 - yuqi:{ - audio:2, - trigger:{global:'damageEnd'}, - init:function(player){ - if(!player.storage.yuqi) player.storage.yuqi=[0,3,1,1]; + yuqi: { + audio: 2, + trigger: { global: "damageEnd" }, + init: function (player) { + if (!player.storage.yuqi) player.storage.yuqi = [0, 3, 1, 1]; }, - getInfo:function(player){ - if(!player.storage.yuqi) player.storage.yuqi=[0,3,1,1]; + getInfo: function (player) { + if (!player.storage.yuqi) player.storage.yuqi = [0, 3, 1, 1]; return player.storage.yuqi; }, - onremove:true, - usable:2, - filter:function(event,player){ - var list=lib.skill.yuqi.getInfo(player); - return event.player.isIn()&&get.distance(player,event.player)<=list[0]; + onremove: true, + usable: 2, + filter: function (event, player) { + var list = lib.skill.yuqi.getInfo(player); + return event.player.isIn() && get.distance(player, event.player) <= list[0]; }, - logTarget:'player', - content:function(){ - 'step 0' - event.list=lib.skill.yuqi.getInfo(player); - var cards=get.cards(event.list[1]); - event.cards=cards; + logTarget: "player", + content: function () { + "step 0"; + event.list = lib.skill.yuqi.getInfo(player); + var cards = get.cards(event.list[1]); + event.cards = cards; game.cardsGotoOrdering(cards); - var next=player.chooseToMove(true,'隅泣(若对话框显示不完整,可下滑操作)'); - next.set('list',[ - ['牌堆顶的牌',cards], - ['交给'+get.translation(trigger.player)+'(至少一张'+(event.list[2]>1?(',至多'+get.cnNumber(event.list[2])+'张'):'')+')'], - ['交给自己(至多'+get.cnNumber(event.list[3])+'张)'], + var next = player.chooseToMove(true, "隅泣(若对话框显示不完整,可下滑操作)"); + next.set("list", [ + ["牌堆顶的牌", cards], + [ + "交给" + + get.translation(trigger.player) + + "(至少一张" + + (event.list[2] > 1 ? ",至多" + get.cnNumber(event.list[2]) + "张" : "") + + ")", + ], + ["交给自己(至多" + get.cnNumber(event.list[3]) + "张)"], ]); - next.set('filterMove',function(from,to,moved){ - var info=lib.skill.yuqi.getInfo(_status.event.player); - if(to==1) return moved[1].length0) card2=cards.shift(); - else card2=cards.pop(); - return [cards,[card2],cards1]; + if (get.attitude(player, target) > 0) card2 = cards.shift(); + else card2 = cards.pop(); + return [cards, [card2], cards1]; }); - next.set('filterOk',function(moved){ - return moved[1].length>0; + next.set("filterOk", function (moved) { + return moved[1].length > 0; }); - 'step 1' - if(result.bool){ - var moved=result.moved; + ("step 1"); + if (result.bool) { + var moved = result.moved; cards.removeArray(moved[1]); cards.removeArray(moved[2]); - while(cards.length){ - ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); } - var list=[[trigger.player,moved[1]]]; - if(moved[2].length) list.push([player,moved[2]]); + var list = [[trigger.player, moved[1]]]; + if (moved[2].length) list.push([player, moved[2]]); game.loseAsync({ - gain_list:list, - giver:player, - animate:'gain2', - }).setContent('gaincardMultiple'); + gain_list: list, + giver: player, + animate: "gain2", + }).setContent("gaincardMultiple"); } }, - mark:true, - intro:{ - content:function(storage,player){ - var info=lib.skill.yuqi.getInfo(player); - return '
    蓝色:'+info[0]+' 红色:'+info[1]+'
    绿色:'+info[2]+' 黄色:'+info[3]+'
    ' + mark: true, + intro: { + content: function (storage, player) { + var info = lib.skill.yuqi.getInfo(player); + return ( + '
    蓝色:' + + info[0] + + " 红色:" + + info[1] + + "
    绿色:" + + info[2] + + " 黄色:" + + info[3] + + "
    " + ); }, }, - ai:{ - threaten:8.8, + ai: { + threaten: 8.8, }, }, - shanshen:{ - audio:2, - trigger:{global:'die'}, - direct:true, - content:function(){ - 'step 0' - event.goon=!player.hasAllHistory('sourceDamage',function(evt){ - return evt.player==trigger.player; + shanshen: { + audio: 2, + trigger: { global: "die" }, + direct: true, + content: function () { + "step 0"; + event.goon = !player.hasAllHistory("sourceDamage", function (evt) { + return evt.player == trigger.player; }); - var list=lib.skill.yuqi.getInfo(player); - player.chooseControl('蓝色('+list[0]+')','红色('+list[1]+')','绿色('+list[2]+')','黄色('+list[3]+')','cancel2').set('prompt',get.prompt('shanshen')).set('prompt2','令〖隅泣〗中的一个数字+2'+(event.goon?'并回复1点体力':'')).set('ai',function(){ - var player=_status.event.player,info=lib.skill.yuqi.getInfo(player); - if(info[0]info[0]; - })) return 0; - return 2; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('shanshen',trigger.player); - var list=lib.skill.yuqi.getInfo(player); - list[result.index]=Math.min(5,list[result.index]+2); - game.log(player,'将',result.control,'数字改为','#y'+list[result.index]) - player.markSkill('yuqi'); - if(event.goon) player.recover(); + var list = lib.skill.yuqi.getInfo(player); + player + .chooseControl( + "蓝色(" + list[0] + ")", + "红色(" + list[1] + ")", + "绿色(" + list[2] + ")", + "黄色(" + list[3] + ")", + "cancel2" + ) + .set("prompt", get.prompt("shanshen")) + .set("prompt2", "令〖隅泣〗中的一个数字+2" + (event.goon ? "并回复1点体力" : "")) + .set("ai", function () { + var player = _status.event.player, + info = lib.skill.yuqi.getInfo(player); + if ( + info[0] < info[3] && + game.countPlayer(function (current) { + return get.distance(player, current) <= info[0]; + }) < Math.min(3, game.countPlayer()) + ) + return 0; + if (info[3] < info[1] - 1) return 3; + if (info[1] < 5) return 1; + if ( + info[0] < 5 && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) > info[0]; + }) + ) + return 0; + return 2; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("shanshen", trigger.player); + var list = lib.skill.yuqi.getInfo(player); + list[result.index] = Math.min(5, list[result.index] + 2); + game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]); + player.markSkill("yuqi"); + if (event.goon) player.recover(); } }, }, - xianjing:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - 'step 0' - var list=lib.skill.yuqi.getInfo(player); - player.chooseControl('蓝色('+list[0]+')','红色('+list[1]+')','绿色('+list[2]+')','黄色('+list[3]+')','cancel2').set('prompt',get.prompt('xianjing')).set('prompt2','令〖隅泣〗中的一个数字+1').set('ai',function(){ - var player=_status.event.player,info=lib.skill.yuqi.getInfo(player); - if(info[0]info[0]; - })) return 0; - return 2; - }); - 'step 1' - if(result.control!='cancel2'){ - player.logSkill('xianjing'); - var list=lib.skill.yuqi.getInfo(player); - list[result.index]=Math.min(5,list[result.index]+1); - game.log(player,'将',result.control,'数字改为','#y'+list[result.index]) - player.markSkill('yuqi'); - if(player.isDamaged()) event.finish(); - } - else event.finish(); - 'step 2' - var list=lib.skill.yuqi.getInfo(player); - player.chooseControl('蓝色('+list[0]+')','红色('+list[1]+')','绿色('+list[2]+')','黄色('+list[3]+')','cancel2').set('prompt','是否令〖隅泣〗中的一个数字+1?').set('ai',function(){ - var player=_status.event.player,info=lib.skill.yuqi.getInfo(player); - if(info[0]info[0]; - })) return 0; - return 2; - }); - 'step 3' - if(result.control!='cancel2'){ - var list=lib.skill.yuqi.getInfo(player); - list[result.index]=Math.min(5,list[result.index]+1); - game.log(player,'将',result.control,'数字改为','#y'+list[result.index]) - player.markSkill('yuqi'); + xianjing: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + var list = lib.skill.yuqi.getInfo(player); + player + .chooseControl( + "蓝色(" + list[0] + ")", + "红色(" + list[1] + ")", + "绿色(" + list[2] + ")", + "黄色(" + list[3] + ")", + "cancel2" + ) + .set("prompt", get.prompt("xianjing")) + .set("prompt2", "令〖隅泣〗中的一个数字+1") + .set("ai", function () { + var player = _status.event.player, + info = lib.skill.yuqi.getInfo(player); + if ( + info[0] < info[3] && + game.countPlayer(function (current) { + return get.distance(player, current) <= info[0]; + }) < Math.min(3, game.countPlayer()) + ) + return 0; + if (info[3] < info[1] - 1) return 3; + if (info[1] < 5) return 1; + if ( + info[0] < 5 && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) > info[0]; + }) + ) + return 0; + return 2; + }); + ("step 1"); + if (result.control != "cancel2") { + player.logSkill("xianjing"); + var list = lib.skill.yuqi.getInfo(player); + list[result.index] = Math.min(5, list[result.index] + 1); + game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]); + player.markSkill("yuqi"); + if (player.isDamaged()) event.finish(); + } else event.finish(); + ("step 2"); + var list = lib.skill.yuqi.getInfo(player); + player + .chooseControl( + "蓝色(" + list[0] + ")", + "红色(" + list[1] + ")", + "绿色(" + list[2] + ")", + "黄色(" + list[3] + ")", + "cancel2" + ) + .set("prompt", "是否令〖隅泣〗中的一个数字+1?") + .set("ai", function () { + var player = _status.event.player, + info = lib.skill.yuqi.getInfo(player); + if ( + info[0] < info[3] && + game.countPlayer(function (current) { + return get.distance(player, current) <= info[0]; + }) < Math.min(3, game.countPlayer()) + ) + return 0; + if (info[3] < info[1] - 1) return 3; + if (info[1] < 5) return 1; + if ( + info[0] < 5 && + game.hasPlayer(function (current) { + return current != player && get.distance(player, current) > info[0]; + }) + ) + return 0; + return 2; + }); + ("step 3"); + if (result.control != "cancel2") { + var list = lib.skill.yuqi.getInfo(player); + list[result.index] = Math.min(5, list[result.index] + 1); + game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]); + player.markSkill("yuqi"); } }, }, //周夷 - zhukou:{ - audio:2, - trigger:{source:'damageSource'}, - filter:function(event,player){ - if(!player.getHistory('useCard').length) return false; - var evt=event.getParent('phaseUse'); - if(!evt||!evt.player) return false; - return player.getHistory('sourceDamage',function(evtx){ - return evtx.getParent('phaseUse')==evt; - }).indexOf(event)==0; + zhukou: { + audio: 2, + trigger: { source: "damageSource" }, + filter: function (event, player) { + if (!player.getHistory("useCard").length) return false; + var evt = event.getParent("phaseUse"); + if (!evt || !evt.player) return false; + return ( + player + .getHistory("sourceDamage", function (evtx) { + return evtx.getParent("phaseUse") == evt; + }) + .indexOf(event) == 0 + ); }, - frequent:true, - content:function(){ - player.draw(player.getHistory('useCard').length); + frequent: true, + content: function () { + player.draw(player.getHistory("useCard").length); }, - group:'zhukou_all', - subSkill:{ - all:{ - audio:'zhukou', - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return game.countPlayer((current)=>(current!=player))>1&&!player.getHistory('sourceDamage').length; + group: "zhukou_all", + subSkill: { + all: { + audio: "zhukou", + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + game.countPlayer((current) => current != player) > 1 && + !player.getHistory("sourceDamage").length + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhukou'),'对两名其他角色各造成1点伤害',2,lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var targets=result.targets.sortBySeat(); - player.logSkill('zhukou',targets); - for(var i of targets) i.damage(); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhukou"), + "对两名其他角色各造成1点伤害", + 2, + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + var targets = result.targets.sortBySeat(); + player.logSkill("zhukou", targets); + for (var i of targets) i.damage(); } }, }, }, }, - mengqing:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - filter:function(event,player){ - return game.countPlayer((current)=>current.isDamaged())>player.hp; + mengqing: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + filter: function (event, player) { + return game.countPlayer((current) => current.isDamaged()) > player.hp; }, - juexingji:true, - skillAnimation:true, - animationColor:'wood', - content:function(){ - player.awakenSkill('mengqing'); + juexingji: true, + skillAnimation: true, + animationColor: "wood", + content: function () { + player.awakenSkill("mengqing"); player.gainMaxHp(3); player.recover(3); //player.removeSkill('zhukou'); //player.addSkill('yuyun'); - player.changeSkills(['yuyun'],['zhukou']); + player.changeSkills(["yuyun"], ["zhukou"]); }, - derivation:'yuyun', + derivation: "yuyun", }, - yuyun:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - filter:function(event,player){ - return player.hp>0||player.maxHp>1; + yuyun: { + trigger: { player: "phaseUseBegin" }, + forced: true, + filter: function (event, player) { + return player.hp > 0 || player.maxHp > 1; }, - content:function(){ - 'step 0' - if(player.maxHp<=1) event._result={control:'失去体力',index:0}; - else if(player.hp<1) event._result={control:'减体力上限',index:1}; - else player.chooseControl('失去体力','减体力上限').set('prompt','玉陨:失去1点体力或减1点体力上限').set('ai',function(){ - var player=_status.event.player; - if(player.hp<2||player.getDamagedHp()>2) return 1; - return 0; - }); - 'step 1' - if(result.index==1) player.loseMaxHp(); + content: function () { + "step 0"; + if (player.maxHp <= 1) event._result = { control: "失去体力", index: 0 }; + else if (player.hp < 1) event._result = { control: "减体力上限", index: 1 }; + else + player + .chooseControl("失去体力", "减体力上限") + .set("prompt", "玉陨:失去1点体力或减1点体力上限") + .set("ai", function () { + var player = _status.event.player; + if (player.hp < 2 || player.getDamagedHp() > 2) return 1; + return 0; + }); + ("step 1"); + if (result.index == 1) player.loseMaxHp(); else player.loseHp(); - 'step 2' - var list=[ - '选项一:摸两张牌', - '选项二:对一名其他角色造成1点伤害,且本回合对其使用【杀】无距离和次数限制', - '选项三:本回合手牌上限视为无限', - '选项四:获得一名其他角色区域内的一张牌', - '选项五:令一名其他角色将手牌数摸至体力上限(至多摸至五张)', + ("step 2"); + var list = [ + "选项一:摸两张牌", + "选项二:对一名其他角色造成1点伤害,且本回合对其使用【杀】无距离和次数限制", + "选项三:本回合手牌上限视为无限", + "选项四:获得一名其他角色区域内的一张牌", + "选项五:令一名其他角色将手牌数摸至体力上限(至多摸至五张)", ]; - var next=player.chooseButton([ - '玉陨:请选择一'+(player.getDamagedHp()>0?('至'+get.cnNumber(player.getDamagedHp()+1)):'')+'项', - [list.map((item,i)=>{ - return [i,item]; - }),'textbutton'] + var next = player.chooseButton([ + "玉陨:请选择一" + + (player.getDamagedHp() > 0 + ? "至" + get.cnNumber(player.getDamagedHp() + 1) + : "") + + "项", + [ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ], ]); - next.set('dialog',event.videoId); - next.set('forced',true); - next.set('ai',function(button){ - var player=_status.event.player; - switch(button.link){ + next.set("dialog", event.videoId); + next.set("forced", true); + next.set("ai", function (button) { + var player = _status.event.player; + switch (button.link) { case 0: return 2; case 1: - return Math.max(0.5,player.countCards('hs',function(card){ - return get.name(card)=='sha'&&player.hasValueTarget(card); - })-player.getCardUsable({name:'sha'}))+Math.max.apply(Math,game.filterPlayer(function(current){ - return current!=player; - }).map(function(target){ - return get.damageEffect(target,player,player); - })); + return ( + Math.max( + 0.5, + player.countCards("hs", function (card) { + return get.name(card) == "sha" && player.hasValueTarget(card); + }) - player.getCardUsable({ name: "sha" }) + ) + + Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return current != player; + }) + .map(function (target) { + return get.damageEffect(target, player, player); + }) + ) + ); case 2: - return player.needsToDiscard()/4; + return player.needsToDiscard() / 4; case 3: - var num=0; - return 0.8*Math.max.apply(Math,game.filterPlayer(function(current){ - return current!=player&¤t.hasCard((card)=>lib.filter.canBeGained(card,current,player),'hej'); - }).map(function(target){ - return get.effect(target,{name:'shunshou_copy'},player,player); - })); + var num = 0; + return ( + 0.8 * + Math.max.apply( + Math, + game + .filterPlayer(function (current) { + return ( + current != player && + current.hasCard( + (card) => + lib.filter.canBeGained(card, current, player), + "hej" + ) + ); + }) + .map(function (target) { + return get.effect( + target, + { name: "shunshou_copy" }, + player, + player + ); + }) + ) + ); case 4: - var num=0; - game.countPlayer(function(current){ - if(current!=player&&get.attitude(player,current)>0){ - var num2=Math.min(5,current.maxHp)-current.countCards('h'); - if(num2>num) num=num2; + var num = 0; + game.countPlayer(function (current) { + if (current != player && get.attitude(player, current) > 0) { + var num2 = Math.min(5, current.maxHp) - current.countCards("h"); + if (num2 > num) num = num2; } }); - return num*0.8; + return num * 0.8; } }); - if(player.getDamagedHp()>0) next.set('selectButton',[1,1+player.getDamagedHp()]); - 'step 3' + if (player.getDamagedHp() > 0) next.set("selectButton", [1, 1 + player.getDamagedHp()]); + ("step 3"); result.links.sort(); - for(var i of result.links) game.log(player,'选择了','#g【玉陨】','的','#y选项'+get.cnNumber(1+i,true)) - event.links=result.links; - if(result.links.includes(0)) player.draw(2); - if(result.links.includes(2)) player.addTempSkill('yuyun_114514'); - 'step 4' - if(event.links.includes(1)&&game.hasPlayer(function(current){ - return current!=player; - })) player.chooseTarget(lib.filter.notMe,true,'对一名其他角色造成1点伤害').set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - else if(event.links.includes(3)) event.goto(6); - else if(event.links.includes(4)) event.goto(8); + for (var i of result.links) + game.log(player, "选择了", "#g【玉陨】", "的", "#y选项" + get.cnNumber(1 + i, true)); + event.links = result.links; + if (result.links.includes(0)) player.draw(2); + if (result.links.includes(2)) player.addTempSkill("yuyun_114514"); + ("step 4"); + if ( + event.links.includes(1) && + game.hasPlayer(function (current) { + return current != player; + }) + ) + player + .chooseTarget(lib.filter.notMe, true, "对一名其他角色造成1点伤害") + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + else if (event.links.includes(3)) event.goto(6); + else if (event.links.includes(4)) event.goto(8); else event.finish(); - 'step 5' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + ("step 5"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.damage(); - player.markAuto('yuyun_sha',[target]); - player.addTempSkill('yuyun_sha'); + player.markAuto("yuyun_sha", [target]); + player.addTempSkill("yuyun_sha"); } - if(event.links.includes(3)) event.goto(6); - else if(event.links.includes(4)) event.goto(8); + if (event.links.includes(3)) event.goto(6); + else if (event.links.includes(4)) event.goto(8); else event.finish(); - 'step 6' - if(event.links.includes(3)&&game.hasPlayer(function(current){ - return current!=player&¤t.hasCard((card)=>lib.filter.canBeGained(card,current,player),'hej'); - })){ - player.chooseTarget(true,'获得一名其他角色区域内的一张牌',function(card,player,current){ - return current!=player&¤t.hasCard((card)=>lib.filter.canBeGained(card,current,player),'hej'); - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'shunshou_copy'},player,player); - }); - } - else if(event.links.includes(4)) event.goto(8); + ("step 6"); + if ( + event.links.includes(3) && + game.hasPlayer(function (current) { + return ( + current != player && + current.hasCard( + (card) => lib.filter.canBeGained(card, current, player), + "hej" + ) + ); + }) + ) { + player + .chooseTarget( + true, + "获得一名其他角色区域内的一张牌", + function (card, player, current) { + return ( + current != player && + current.hasCard( + (card) => lib.filter.canBeGained(card, current, player), + "hej" + ) + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "shunshou_copy" }, player, player); + }); + } else if (event.links.includes(4)) event.goto(8); else event.finish(); - 'step 7' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.gainPlayerCard(target,'hej',true); + ("step 7"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.gainPlayerCard(target, "hej", true); } - if(!event.links.includes(4)) event.finish(); - 'step 8' - if(event.links.includes(4)&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')2){ - return Math.min(5,target.maxHp)-target.countCards('h'); - } - return att/3; - }); - } - else event.finish(); - 'step 9' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - target.drawTo(Math.min(5,target.maxHp)); + if (!event.links.includes(4)) event.finish(); + ("step 8"); + if ( + event.links.includes(4) && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") < Math.min(5, current.maxHp); + }) + ) { + player + .chooseTarget( + true, + "令一名其他角色将手牌数摸至体力上限", + function (card, player, current) { + return ( + current != player && + current.countCards("h") < Math.min(5, current.maxHp) + ); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkillTag("nogain")) att /= 6; + if (att > 2) { + return Math.min(5, target.maxHp) - target.countCards("h"); + } + return att / 3; + }); + } else event.finish(); + ("step 9"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + target.drawTo(Math.min(5, target.maxHp)); } }, - subSkill:{ - '114514':{ - mod:{ - maxHandcardFinal:function(player,num){ + subSkill: { + 114514: { + mod: { + maxHandcardFinal: function (player, num) { return 114514; }, }, - charlotte:true, + charlotte: true, }, - sha:{ - mod:{ - cardUsableTarget:function(card,player,target){ - if(card.name=='sha'&&player.getStorage('yuyun_sha').includes(target)) return Infinity; + sha: { + mod: { + cardUsableTarget: function (card, player, target) { + if (card.name == "sha" && player.getStorage("yuyun_sha").includes(target)) + return Infinity; }, - targetInRange:function(card,player,target){ - if(card.name=='sha'&&player.getStorage('yuyun_sha').includes(target)) return true; + targetInRange: function (card, player, target) { + if (card.name == "sha" && player.getStorage("yuyun_sha").includes(target)) + return true; }, }, - charlotte:true, - onremove:true, + charlotte: true, + onremove: true, }, }, }, //潘淑 - zhiren:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - return (player==_status.currentPhase||player.hasSkill('yaner_zhiren'))&&event.card.isCard&&player.getHistory('useCard',function(evt){ - return evt.card.isCard; - }).indexOf(event)==0; + zhiren: { + audio: 2, + trigger: { player: "useCard" }, + filter: function (event, player) { + return ( + (player == _status.currentPhase || player.hasSkill("yaner_zhiren")) && + event.card.isCard && + player + .getHistory("useCard", function (evt) { + return evt.card.isCard; + }) + .indexOf(event) == 0 + ); }, - frequent:true, - locked:false, - content:function(){ - 'step 0' - event.num=get.translation(trigger.card.name).length; + frequent: true, + locked: false, + content: function () { + "step 0"; + event.num = get.translation(trigger.card.name).length; player.chooseToGuanxing(event.num); - if(event.num<2) event.finish(); - 'step 1' - if(!game.hasPlayer(function(current){ - return current.countDiscardableCards(player,'e')>0; - })){ + if (event.num < 2) event.finish(); + ("step 1"); + if ( + !game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "e") > 0; + }) + ) { event.goto(3); - } - else player.chooseTarget('织纴:是否弃置一名角色装备区内的一张牌?',function(card,player,target){ - return target.countDiscardableCards(player,'e')>0; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target),es=target.getCards('e'),val=0; - for(var i of es){ - var eff=-(get.value(i,target)-0.1)*att; - if(eff>val) val=eff; - } - return eff; - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; + } else + player + .chooseTarget( + "织纴:是否弃置一名角色装备区内的一张牌?", + function (card, player, target) { + return target.countDiscardableCards(player, "e") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + es = target.getCards("e"), + val = 0; + for (var i of es) { + var eff = -(get.value(i, target) - 0.1) * att; + if (eff > val) val = eff; + } + return eff; + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; player.addExpose(0.15); - player.line(target,'green'); - player.discardPlayerCard(target,'e',true); - } - else event.goto(5); - if(event.num<3) event.finish(); - 'step 3' - if(!game.hasPlayer(function(current){ - return current.countDiscardableCards(player,'j')>0; - })){ - if(event.num<3) event.finish(); + player.line(target, "green"); + player.discardPlayerCard(target, "e", true); + } else event.goto(5); + if (event.num < 3) event.finish(); + ("step 3"); + if ( + !game.hasPlayer(function (current) { + return current.countDiscardableCards(player, "j") > 0; + }) + ) { + if (event.num < 3) event.finish(); else event.goto(5); - } - else player.chooseTarget('织纴:是否弃置一名角色判定区内的一张牌?',function(card,player,target){ - return target.countDiscardableCards(player,'j')>0; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target),es=target.getCards('j'),val=0; - for(var i of es){ - var eff=-(get.effect(target,i,target,player)) - if(eff>val) val=eff; - } - return eff; - }); - 'step 4' - if(result.bool){ - var target=result.targets[0]; + } else + player + .chooseTarget( + "织纴:是否弃置一名角色判定区内的一张牌?", + function (card, player, target) { + return target.countDiscardableCards(player, "j") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + es = target.getCards("j"), + val = 0; + for (var i of es) { + var eff = -get.effect(target, i, target, player); + if (eff > val) val = eff; + } + return eff; + }); + ("step 4"); + if (result.bool) { + var target = result.targets[0]; player.addExpose(0.15); - player.line(target,'green'); - player.discardPlayerCard(target,'j',true); + player.line(target, "green"); + player.discardPlayerCard(target, "j", true); } - if(event.num<3) event.finish(); - 'step 5' + if (event.num < 3) event.finish(); + ("step 5"); player.recover(); - if(event.num<4) event.finish(); - 'step 6' + if (event.num < 4) event.finish(); + ("step 6"); player.draw(3); }, - mod:{ - aiOrder:function(player,card,num){ - if(player==_status.currentPhase&&!player.getHistory('useCard',function(evt){ - return evt.card.isCard; - }).length) return num+Math.pow(get.translation(card.name).length,2); + mod: { + aiOrder: function (player, card, num) { + if ( + player == _status.currentPhase && + !player.getHistory("useCard", function (evt) { + return evt.card.isCard; + }).length + ) + return num + Math.pow(get.translation(card.name).length, 2); }, }, }, - yaner:{ - audio:2, - trigger:{ - global:['equipAfter','addJudgeAfter','loseAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + yaner: { + audio: 2, + trigger: { + global: [ + "equipAfter", + "addJudgeAfter", + "loseAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var current=_status.currentPhase; - if(!current||current==player||!current.isIn()||!current.isPhaseUsing()) return false; - var evt=event.getl(current); - return evt&&evt.hs&&evt.hs.length&¤t.countCards('h')==0; + filter: function (event, player) { + var current = _status.currentPhase; + if (!current || current == player || !current.isIn() || !current.isPhaseUsing()) + return false; + var evt = event.getl(current); + return evt && evt.hs && evt.hs.length && current.countCards("h") == 0; }, - usable:1, - logTarget:function(){ + usable: 1, + logTarget: function () { return _status.currentPhase; }, - prompt2:'与该角色各摸两张牌', - check:function(event,player){ - return get.attitude(player,_status.currentPhase)>0; + prompt2: "与该角色各摸两张牌", + check: function (event, player) { + return get.attitude(player, _status.currentPhase) > 0; }, - content:function(){ - 'step 0' - game.asyncDraw([_status.currentPhase,player],2); - 'step 1' - var e1=player.getHistory('gain',function(evt){ - return evt.getParent(2)==event; + content: function () { + "step 0"; + game.asyncDraw([_status.currentPhase, player], 2); + ("step 1"); + var e1 = player.getHistory("gain", function (evt) { + return evt.getParent(2) == event; })[0]; - if(e1&&e1.cards&&e1.cards.length==2&&get.type(e1.cards[0])==get.type(e1.cards[1])){ - player.addTempSkill('yaner_zhiren',{player:'phaseBegin'}); - game.log(player,'修改了技能','#g【织纴】'); + if ( + e1 && + e1.cards && + e1.cards.length == 2 && + get.type(e1.cards[0]) == get.type(e1.cards[1]) + ) { + player.addTempSkill("yaner_zhiren", { player: "phaseBegin" }); + game.log(player, "修改了技能", "#g【织纴】"); } - var target=_status.currentPhase; - if(target.isIn()&&target.isDamaged()){ - var e2=target.getHistory('gain',function(evt){ - return evt.getParent(2)==event; + var target = _status.currentPhase; + if (target.isIn() && target.isDamaged()) { + var e2 = target.getHistory("gain", function (evt) { + return evt.getParent(2) == event; })[0]; - if(e2&&e2.cards&&e2.cards.length==2&&get.type(e2.cards[0])==get.type(e2.cards[1])) target.recover(); + if ( + e2 && + e2.cards && + e2.cards.length == 2 && + get.type(e2.cards[0]) == get.type(e2.cards[1]) + ) + target.recover(); } - 'step 2' + ("step 2"); game.delayx(); }, - subSkill:{ - zhiren:{charlotte:true}, + subSkill: { + zhiren: { charlotte: true }, }, - ai:{ - expose:0.5, + ai: { + expose: 0.5, }, }, //杨婉 - youyan:{ - audio:2, + youyan: { + audio: 2, // trigger:{ // player:'loseAfter', // global:'loseAsyncAfter', // }, - trigger:{ - player:['loseAfter','equipAfter'], - global:['loseAsyncAfter','cardsDiscardAfter'], + trigger: { + player: ["loseAfter", "equipAfter"], + global: ["loseAsyncAfter", "cardsDiscardAfter"], }, //usable:1, - prompt2:function(event,player){ - var cards2=[]; - if(event.name=='cardsDiscard'){ - var evtx=event.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evtx2=(evtx.relatedEvent||evtx.getParent()); - if(evtx2.name=='useCard'||evtx2.name=='respond') return false; - player.getHistory('lose',evtx3=>{ - var evtx4=evtx3.relatedEvent||evtx3.getParent(); - if(evtx2!=evtx4) return false; - if(!evtx3.cards2||!evtx3.cards2.length) return false; - cards2.addArray(evtx3.cards2.filterInD('d')); + prompt2: function (event, player) { + var cards2 = []; + if (event.name == "cardsDiscard") { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + if (evtx2.name == "useCard" || evtx2.name == "respond") return false; + player.getHistory("lose", (evtx3) => { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + if (!evtx3.cards2 || !evtx3.cards2.length) return false; + cards2.addArray(evtx3.cards2.filterInD("d")); }); - } - else if(event.name=='loseAsync'){ - player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event||evt.position!=ui.discardPile) return false; - cards2.addArray(evt.cards2.filterInD('d')); + } else if (event.name == "loseAsync") { + player.hasHistory("lose", (evt) => { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + cards2.addArray(evt.cards2.filterInD("d")); }); + } else { + cards2.addArray(event.getd(player).filterInD("d")); } - else{ - cards2.addArray(event.getd(player).filterInD('d')); - } - return '获得与'+get.translation(cards2)+'花色'+(cards2.length>1?'各':'')+'不相同的牌各一张'; + return ( + "获得与" + + get.translation(cards2) + + "花色" + + (cards2.length > 1 ? "各" : "") + + "不相同的牌各一张" + ); }, - filter:function(event,player){ - if(player!=_status.currentPhase) return false; - var cards2=[]; - if(event.name=='cardsDiscard'){ - var evtx=event.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evtx2=(evtx.relatedEvent||evtx.getParent()); - if(evtx2.name=='useCard'||evtx2.name=='respond') return false; - player.getHistory('lose',evtx3=>{ - var evtx4=evtx3.relatedEvent||evtx3.getParent(); - if(evtx2!=evtx4) return false; - if(!evtx3.cards2||!evtx3.cards2.length) return false; - cards2.addArray(evtx3.cards2.filterInD('d')); + filter: function (event, player) { + if (player != _status.currentPhase) return false; + var cards2 = []; + if (event.name == "cardsDiscard") { + var evtx = event.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + if (evtx2.name == "useCard" || evtx2.name == "respond") return false; + player.getHistory("lose", (evtx3) => { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + if (!evtx3.cards2 || !evtx3.cards2.length) return false; + cards2.addArray(evtx3.cards2.filterInD("d")); }); - } - else if(event.name=='loseAsync'){ - player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event||evt.position!=ui.discardPile) return false; - cards2.addArray(evt.cards2.filterInD('d')); + } else if (event.name == "loseAsync") { + player.hasHistory("lose", (evt) => { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + cards2.addArray(evt.cards2.filterInD("d")); }); + } else { + cards2.addArray(event.getd(player).filterInD("d")); } - else{ - cards2.addArray(event.getd(player).filterInD('d')); + if (!cards2.length) return false; + var list = []; + for (var i of cards2) { + list.add(get.suit(i, player)); + if (list.length >= lib.suit.length) return false; } - if(!cards2.length) return false; - var list=[]; - for(var i of cards2){ - list.add(get.suit(i,player)); - if(list.length>=lib.suit.length) return false; - } - var evt=event.getParent('phaseUse'); - if(evt&&evt.player==player&&!evt.youyaned) return true; - var evt=event.getParent('phaseDiscard'); - if(evt&&evt.player==player&&!evt.youyaned) return true; + var evt = event.getParent("phaseUse"); + if (evt && evt.player == player && !evt.youyaned) return true; + var evt = event.getParent("phaseDiscard"); + if (evt && evt.player == player && !evt.youyaned) return true; return false; }, - content:function(){ - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.player==player) evt.youyaned=true; - else{ - var evt=trigger.getParent('phaseDiscard'); - if(evt) evt.youyaned=true; + content: function () { + var evt = trigger.getParent("phaseUse"); + if (evt && evt.player == player) evt.youyaned = true; + else { + var evt = trigger.getParent("phaseDiscard"); + if (evt) evt.youyaned = true; } - var list=[],cards=[]; - var cards2=[]; - if(trigger.name=='cardsDiscard'){ - var evtx=trigger.getParent(); - if(evtx.name!='orderingDiscard') return false; - var evtx2=(evtx.relatedEvent||evtx.getParent()); - if(evtx2.name=='useCard'||evtx2.name=='respond') return false; - player.getHistory('lose',evtx3=>{ - var evtx4=evtx3.relatedEvent||evtx3.getParent(); - if(evtx2!=evtx4) return false; - if(!evtx3.cards2||!evtx3.cards2.length) return false; - cards2.addArray(evtx3.cards2.filterInD('d')); + var list = [], + cards = []; + var cards2 = []; + if (trigger.name == "cardsDiscard") { + var evtx = trigger.getParent(); + if (evtx.name != "orderingDiscard") return false; + var evtx2 = evtx.relatedEvent || evtx.getParent(); + if (evtx2.name == "useCard" || evtx2.name == "respond") return false; + player.getHistory("lose", (evtx3) => { + var evtx4 = evtx3.relatedEvent || evtx3.getParent(); + if (evtx2 != evtx4) return false; + if (!evtx3.cards2 || !evtx3.cards2.length) return false; + cards2.addArray(evtx3.cards2.filterInD("d")); }); - } - else if(trigger.name=='loseAsync'){ - player.hasHistory('lose',evt=>{ - if(evt.getParent()!=trigger||evt.position!=ui.discardPile) return false; - cards2.addArray(evt.cards2.filterInD('d')); + } else if (trigger.name == "loseAsync") { + player.hasHistory("lose", (evt) => { + if (evt.getParent() != trigger || evt.position != ui.discardPile) return false; + cards2.addArray(evt.cards2.filterInD("d")); }); + } else { + cards2.addArray(trigger.getd(player).filterInD("d")); } - else{ - cards2.addArray(trigger.getd(player).filterInD('d')); + for (var i of cards2) { + list.add(get.suit(i, player)); } - for(var i of cards2){ - list.add(get.suit(i,player)); + for (var i of lib.suit) { + if (list.includes(i)) continue; + var card = get.cardPile2(function (card) { + return get.suit(card, false) == i; + }); + if (card) cards.push(card); } - for(var i of lib.suit){ - if(list.includes(i)) continue; - var card=get.cardPile2(function(card){ - return get.suit(card,false)==i; - }) - if(card) cards.push(card); - } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(typeof card=='object'&&player==_status.currentPhase&& - //(!player.storage.counttrigger||!player.storage.counttrigger.youyan)&& - player.needsToDiscard()==1&&card.cards&&card.cards.filter(function(i){ - return get.position(i)=='h'; - }).length>0&&!get.tag(card,'draw')&&!get.tag(card,'gain')&&!get.tag(card,'discard')) return 'zeroplayertarget'; + ai: { + effect: { + player_use: function (card, player, target) { + if ( + typeof card == "object" && + player == _status.currentPhase && + //(!player.storage.counttrigger||!player.storage.counttrigger.youyan)&& + player.needsToDiscard() == 1 && + card.cards && + card.cards.filter(function (i) { + return get.position(i) == "h"; + }).length > 0 && + !get.tag(card, "draw") && + !get.tag(card, "gain") && + !get.tag(card, "discard") + ) + return "zeroplayertarget"; }, }, }, }, - zhuihuan:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return !current.hasSkill('zhuihuan2_new'); + zhuihuan: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return !current.hasSkill("zhuihuan2_new"); }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhuihuan'),'令一名角色获得“追还”效果',function(card,player,target){ - return !target.hasSkill('zhuihuan2_new'); - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(target.hasSkill('maixie')||target.hasSkill('maixie_defend')) att/=3; - if(target!=player) att/=Math.pow(game.players.length-get.distance(player,target,'absolute'),0.7); - return att; - }).set('animate',false); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('zhuihuan'); - target.addTempSkill('zhuihuan2_new',{player:'phaseZhunbei'}); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhuihuan"), + "令一名角色获得“追还”效果", + function (card, player, target) { + return !target.hasSkill("zhuihuan2_new"); + } + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (target.hasSkill("maixie") || target.hasSkill("maixie_defend")) att /= 3; + if (target != player) + att /= Math.pow( + game.players.length - get.distance(player, target, "absolute"), + 0.7 + ); + return att; + }) + .set("animate", false); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("zhuihuan"); + target.addTempSkill("zhuihuan2_new", { player: "phaseZhunbei" }); game.delayx(); } }, }, - zhuihuan2_new:{ - trigger:{player:'phaseZhunbeiBegin'}, - charlotte:true, - forced:true, - onremove:true, - filter:function(event,player){ - if(player.storage.zhuihuan2_new){ - for(var source of player.storage.zhuihuan2_new){ - if(!source.isIn()) continue; - if(source.hp>player.hp) return true; - return source.countCards('h')>0; + zhuihuan2_new: { + trigger: { player: "phaseZhunbeiBegin" }, + charlotte: true, + forced: true, + onremove: true, + filter: function (event, player) { + if (player.storage.zhuihuan2_new) { + for (var source of player.storage.zhuihuan2_new) { + if (!source.isIn()) continue; + if (source.hp > player.hp) return true; + return source.countCards("h") > 0; } } }, - logTarget:function(event,player){ - return player.storage.zhuihuan2_new.filter(function(target){ + logTarget: function (event, player) { + return player.storage.zhuihuan2_new.filter(function (target) { return target.isIn(); }); }, - content:function(){ - 'step 0' - event.targets=player.storage.zhuihuan2_new; - player.removeSkill('zhuihuan2_new'); - 'step 1' - var target=targets.shift(); - if(target.isIn()){ - if(target.hp>player.hp) target.damage(2); - else{ - var hs=target.getCards('h'); - if(hs.length) target.discard(hs.randomGets(2)); + content: function () { + "step 0"; + event.targets = player.storage.zhuihuan2_new; + player.removeSkill("zhuihuan2_new"); + ("step 1"); + var target = targets.shift(); + if (target.isIn()) { + if (target.hp > player.hp) target.damage(2); + else { + var hs = target.getCards("h"); + if (hs.length) target.discard(hs.randomGets(2)); } } - if(targets.length) event.redo(); + if (targets.length) event.redo(); }, - group:'zhuihuan2_new_count', - subSkill:{ - count:{ - trigger:{player:'damage'}, - forced:true, - silent:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return get.itemtype(event.source)=='player'; + group: "zhuihuan2_new_count", + subSkill: { + count: { + trigger: { player: "damage" }, + forced: true, + silent: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return get.itemtype(event.source) == "player"; }, - content:function(){ - player.markAuto('zhuihuan2_new',[trigger.source]); + content: function () { + player.markAuto("zhuihuan2_new", [trigger.source]); }, }, }, }, - zhuihuan2:{ - trigger:{player:'damageEnd'}, - forced:true, - charlotte:true, - logTarget:'source', - filter:function(event,player){ - var source=event.source; - if(source.hp>player.hp) return true; - return source.countCards('h')>0; + zhuihuan2: { + trigger: { player: "damageEnd" }, + forced: true, + charlotte: true, + logTarget: "source", + filter: function (event, player) { + var source = event.source; + if (source.hp > player.hp) return true; + return source.countCards("h") > 0; }, - content:function(){ - if(player.hp1){ - allcards=allcards.concat(list[1][1]); + next.set("list", list); + next.set("processAI", function (list) { + var allcards = list[0][1].slice(0), + cards = []; + if (list.length > 1) { + allcards = allcards.concat(list[1][1]); } - var canchoose=allcards.slice(0); - var player=_status.event.player; - var getv=function(button){ - if(button.name=='sha'&&allcards.filter(function(card){ - return card.name=='sha'&&!cards.filter(function(){ - return button==card; - }).length; - }).length>player.getCardUsable({name:'sha'})) return 10; - return -player.getUseValue(button,player); + var canchoose = allcards.slice(0); + var player = _status.event.player; + var getv = function (button) { + if ( + button.name == "sha" && + allcards.filter(function (card) { + return ( + card.name == "sha" && + !cards.filter(function () { + return button == card; + }).length + ); + }).length > player.getCardUsable({ name: "sha" }) + ) + return 10; + return -player.getUseValue(button, player); }; - while(cards.length<3){ - canchoose.sort(function(a,b){ - return getv(b)-getv(a); + while (cards.length < 3) { + canchoose.sort(function (a, b) { + return getv(b) - getv(a); }); cards.push(canchoose.shift()); } - return [cards,canchoose]; - }) - 'step 1' - if(result.bool){ - event.forceDie=true; - var cards=result.moved[0]; - event.cards=cards; - player.storage.xingzuo2=cards; - var hs=player.getCards('h'); - var lose=[],gain=event.cards2; - for(var i of cards){ - if(hs.includes(i)) lose.push(i); + return [cards, canchoose]; + }); + ("step 1"); + if (result.bool) { + event.forceDie = true; + var cards = result.moved[0]; + event.cards = cards; + player.storage.xingzuo2 = cards; + var hs = player.getCards("h"); + var lose = [], + gain = event.cards2; + for (var i of cards) { + if (hs.includes(i)) lose.push(i); else gain.remove(i); } - if(lose.length) player.lose(lose,ui.cardPile); - if(gain.length) player.gain(gain,'draw'); - } - else event.finish(); - 'step 2' - for(var i of cards){ - if(!(('hejsdx').includes(get.position(i,true)))){ + if (lose.length) player.lose(lose, ui.cardPile); + if (gain.length) player.gain(gain, "draw"); + } else event.finish(); + ("step 2"); + for (var i of cards) { + if (!"hejsdx".includes(get.position(i, true))) { i.fix(); ui.cardPile.appendChild(i); } @@ -12497,251 +15597,317 @@ game.import('character', function () { game.updateRoundNumber(); }, }, - xingzuo2:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return game.hasPlayer(function(target){ - return target.countCards('h')>0; + xingzuo2: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return target.countCards("h") > 0; }); }, - content:function(){ - 'step 0' - player.chooseTarget(function(card,player,target){ - return target.countCards('h')>0; - },'兴作:是否令一名角色将其手牌与牌堆底的三张牌替换?').set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target),hs=target.getCards('h'),num=hs.length; - var getv=function(list,target){ - var num=0; - for(var i of list) num+=get.value(i,target); - return num; - },val=getv(hs,target)-getv(player.storage.xingzuo2,target); - if(num<3) return att*Math.sqrt(Math.max(0,-val))*1.5; - if(num==3) return -att*Math.sqrt(Math.max(0,val)); - if(player.hp<(num>4?3:2)) return 0; - return -att*Math.sqrt(Math.max(0,val)); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('xingzuo',target); - var cards=get.bottomCards(3); + content: function () { + "step 0"; + player + .chooseTarget(function (card, player, target) { + return target.countCards("h") > 0; + }, "兴作:是否令一名角色将其手牌与牌堆底的三张牌替换?") + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target), + hs = target.getCards("h"), + num = hs.length; + var getv = function (list, target) { + var num = 0; + for (var i of list) num += get.value(i, target); + return num; + }, + val = getv(hs, target) - getv(player.storage.xingzuo2, target); + if (num < 3) return att * Math.sqrt(Math.max(0, -val)) * 1.5; + if (num == 3) return -att * Math.sqrt(Math.max(0, val)); + if (player.hp < (num > 4 ? 3 : 2)) return 0; + return -att * Math.sqrt(Math.max(0, val)); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xingzuo", target); + var cards = get.bottomCards(3); game.cardsGotoOrdering(cards); - var hs=target.getCards('h'); - target.lose(hs,ui.cardPile); - target.gain(cards,'draw'); - if(hs.length>3) player.loseHp(); - } - else event.finish(); - 'step 2' + var hs = target.getCards("h"); + target.lose(hs, ui.cardPile); + target.gain(cards, "draw"); + if (hs.length > 3) player.loseHp(); + } else event.finish(); + ("step 2"); game.updateRoundNumber(); }, }, - miaoxian:{ - hiddenCard:function(player,name){ - return get.type(name)=='trick'&&!player.hasSkill('miaoxian2')&&player.countCards('h',{color:'black'})==1; + miaoxian: { + hiddenCard: function (player, name) { + return ( + get.type(name) == "trick" && + !player.hasSkill("miaoxian2") && + player.countCards("h", { color: "black" }) == 1 + ); }, - enable:'chooseToUse', - filter:function(event,player){ - if(player.hasSkill('miaoxian2')) return false; - var cards=player.getCards('h',{color:'black'}); - if(cards.length!=1) return false; - var mod2=game.checkMod(cards[0],player,'unchanged','cardEnabled2',player); - if(mod2===false) return false; - for(var i of lib.inpile){ - if(get.type(i)=='trick'&&event.filterCard({ - name:i, - cards:cards, - },player,event)) return true; + enable: "chooseToUse", + filter: function (event, player) { + if (player.hasSkill("miaoxian2")) return false; + var cards = player.getCards("h", { color: "black" }); + if (cards.length != 1) return false; + var mod2 = game.checkMod(cards[0], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; + for (var i of lib.inpile) { + if ( + get.type(i) == "trick" && + event.filterCard( + { + name: i, + cards: cards, + }, + player, + event + ) + ) + return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var cards=player.getCards('h',{color:'black'}); - var list=[]; - for(var i of lib.inpile){ - if(get.type(i)=='trick'&&event.filterCard({ - name:i, - cards:cards, - },player,event)){ - list.push(['锦囊','',i]); + chooseButton: { + dialog: function (event, player) { + var cards = player.getCards("h", { color: "black" }); + var list = []; + for (var i of lib.inpile) { + if ( + get.type(i) == "trick" && + event.filterCard( + { + name: i, + cards: cards, + }, + player, + event + ) + ) { + list.push(["锦囊", "", i]); } } - return ui.create.dialog('妙弦',[list,'vcard'],'hidden'); + return ui.create.dialog("妙弦", [list, "vcard"], "hidden"); }, - check:function(button){ - var player=_status.event.player; - return player.getUseValue({name:button.link[2]})+1; + check: function (button) { + var player = _status.event.player; + return player.getUseValue({ name: button.link[2] }) + 1; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'miaoxian', - popname:true, - filterCard:{color:'black'}, - selectCard:-1, - position:'h', - viewAs:{ - name:links[0][2], + audio: "miaoxian", + popname: true, + filterCard: { color: "black" }, + selectCard: -1, + position: "h", + viewAs: { + name: links[0][2], }, - onuse:function(links,player){ - player.addTempSkill('miaoxian2'); + onuse: function (links, player) { + player.addTempSkill("miaoxian2"); }, - } + }; }, - prompt:function(links,player){ - return '将'+get.translation(player.getCards('h',{color:'black'})[0])+'当做'+get.translation(links[0][2])+'使用'; + prompt: function (links, player) { + return ( + "将" + + get.translation(player.getCards("h", { color: "black" })[0]) + + "当做" + + get.translation(links[0][2]) + + "使用" + ); }, }, - group:'miaoxian_use', - subfrequent:['use'], - subSkill:{ - use:{ - audio:'miaoxian', - trigger:{player:'loseAfter'}, - frequent:true, - prompt:'是否发动【妙弦】摸一张牌?', - filter:function(event,player){ - var evt=event.getParent(); - if(evt.name!='useCard') return false; - return event.hs&&event.hs.length==1&&event.cards&&event.cards.length==1 - &&get.color(event.hs[0],player)=='red'&&!player.countCards('h',{color:'red'}); + group: "miaoxian_use", + subfrequent: ["use"], + subSkill: { + use: { + audio: "miaoxian", + trigger: { player: "loseAfter" }, + frequent: true, + prompt: "是否发动【妙弦】摸一张牌?", + filter: function (event, player) { + var evt = event.getParent(); + if (evt.name != "useCard") return false; + return ( + event.hs && + event.hs.length == 1 && + event.cards && + event.cards.length == 1 && + get.color(event.hs[0], player) == "red" && + !player.countCards("h", { color: "red" }) + ); }, - content:function(){ + content: function () { player.draw(); }, }, - backup:{ - audio:'miaoxian', + backup: { + audio: "miaoxian", }, }, - ai:{ - order:12, - result:{ - player:1, + ai: { + order: 12, + result: { + player: 1, }, }, }, - miaoxian2:{ - charlotte:true, + miaoxian2: { + charlotte: true, }, //樊玉凤 - bazhan:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuanhuanji:true, - marktext:'☯', - mark:true, - intro:{ - content:function(storage,player){ - return '出牌阶段限一次,'+(storage?'你可以获得一名其他角色的至多两张手牌。':'你可以将至多两张手牌交给一名其他角色。')+'若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。' + bazhan: { + audio: 2, + enable: "phaseUse", + usable: 1, + zhuanhuanji: true, + marktext: "☯", + mark: true, + intro: { + content: function (storage, player) { + return ( + "出牌阶段限一次," + + (storage + ? "你可以获得一名其他角色的至多两张手牌。" + : "你可以将至多两张手牌交给一名其他角色。") + + "若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。" + ); }, }, - filter:function(event,player){ - if(player.storage.bazhan){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countGainableCards(player,'h')>0; - }) + filter: function (event, player) { + if (player.storage.bazhan) { + return game.hasPlayer(function (current) { + return current != player && current.countGainableCards(player, "h") > 0; + }); } - return player.countCards('h')>0; + return player.countCards("h") > 0; }, - filterCard:true, - discard:false, - lose:false, - selectCard:function(){ - if(_status.event.player.storage.bazhan) return 0; - return [1,2]; + filterCard: true, + discard: false, + lose: false, + selectCard: function () { + if (_status.event.player.storage.bazhan) return 0; + return [1, 2]; }, - filterTarget:function(card,player,target){ - if(player==target) return false; - if(player.storage.bazhan) return target.countGainableCards(player,'h')>0; + filterTarget: function (card, player, target) { + if (player == target) return false; + if (player.storage.bazhan) return target.countGainableCards(player, "h") > 0; return true; }, - prompt:function(){ - if(_status.event.player.storage.bazhan) return '获得一名其他角色的至多两张手牌'; - return '将至多两张手牌交给一名其他角色'; + prompt: function () { + if (_status.event.player.storage.bazhan) return "获得一名其他角色的至多两张手牌"; + return "将至多两张手牌交给一名其他角色"; }, - delay:false, - check:function(card){ - var player=_status.event.player; - var bool1=false,bool2=false; - for(var i of game.players){ - if(get.attitude(player,i)<=0||player==i) continue; - bool1=true; - if(i.isDamaged()||i.isTurnedOver()){ - bool2=true; + delay: false, + check: function (card) { + var player = _status.event.player; + var bool1 = false, + bool2 = false; + for (var i of game.players) { + if (get.attitude(player, i) <= 0 || player == i) continue; + bool1 = true; + if (i.isDamaged() || i.isTurnedOver()) { + bool2 = true; break; } } - if(bool2&&!ui.selected.cards.length&&(get.suit(card,player)=='heart'||get.name(card,player)=='jiu')) return 10; - if(bool1) return 9-get.value(card); - if(get.color(card)=='red') return 5-get.value(card); + if ( + bool2 && + !ui.selected.cards.length && + (get.suit(card, player) == "heart" || get.name(card, player) == "jiu") + ) + return 10; + if (bool1) return 9 - get.value(card); + if (get.color(card) == "red") return 5 - get.value(card); return 0; }, - content:function(){ - 'step 0' - if(player.storage.bazhan){ - event.recover=player; - player.gainPlayerCard(target,'h',true,'visibleMove',[1,2]); + content: function () { + "step 0"; + if (player.storage.bazhan) { + event.recover = player; + player.gainPlayerCard(target, "h", true, "visibleMove", [1, 2]); + } else { + event.recover = target; + player.give(cards, target); } - else{ - event.recover=target; - player.give(cards,target); + player.changeZhuanhuanji("bazhan"); + ("step 1"); + var target = event.recover; + if (result.bool && result.cards && result.cards.length) { + cards = result.cards; } - player.changeZhuanhuanji('bazhan'); - 'step 1' - var target=event.recover; - if(result.bool&&result.cards&&result.cards.length){ - cards=result.cards; - } - if(!cards||!target||!target.getCards('h').filter(function(i){ - return cards.includes(i); - }).length||function(){ - for(var card of cards){ - if(get.suit(card,target)=='heart'||get.name(card,target)=='jiu') return false; - } - return true; - }()){ + if ( + !cards || + !target || + !target.getCards("h").filter(function (i) { + return cards.includes(i); + }).length || + (function () { + for (var card of cards) { + if (get.suit(card, target) == "heart" || get.name(card, target) == "jiu") + return false; + } + return true; + })() + ) { event.finish(); return; } - var list=[]; - event.addIndex=0; - var str=get.translation(target); - if(target.isDamaged()) list.push('令'+str+'回复1点体力'); + var list = []; + event.addIndex = 0; + var str = get.translation(target); + if (target.isDamaged()) list.push("令" + str + "回复1点体力"); else event.addIndex++; - if(target.isLinked()||target.isTurnedOver()) list.push('令'+get.translation(target)+'复原武将牌'); - if(!list.length) event.finish(); - else player.chooseControl('cancel2').set('choiceList',list).set('ai',function(){ - var evt=_status.event.getParent(); - if(get.attitude(evt.player,evt.target)<0) return 'cancel2'; - if(target.hp>1&&target.isTurnedOver()) return 1-evt.addIndex; - return 0; - }); - 'step 2' - if(result.control=='cancel2') event.finish(); - else if(result.index+event.addIndex==0){ + if (target.isLinked() || target.isTurnedOver()) + list.push("令" + get.translation(target) + "复原武将牌"); + if (!list.length) event.finish(); + else + player + .chooseControl("cancel2") + .set("choiceList", list) + .set("ai", function () { + var evt = _status.event.getParent(); + if (get.attitude(evt.player, evt.target) < 0) return "cancel2"; + if (target.hp > 1 && target.isTurnedOver()) return 1 - evt.addIndex; + return 0; + }); + ("step 2"); + if (result.control == "cancel2") event.finish(); + else if (result.index + event.addIndex == 0) { event.recover.recover(); event.finish(); - } - else if(event.recover.isLinked()) event.recover.link(); - 'step 3' - if(event.recover.isTurnedOver()) event.recover.turnOver(); + } else if (event.recover.isLinked()) event.recover.link(); + ("step 3"); + if (event.recover.isTurnedOver()) event.recover.turnOver(); }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(player.storage.bazhan) return -1; - if(ui.selected.cards.length){ - var cards=ui.selected.cards,card=cards[0]; - if(get.value(cards,target)<0) return -0.5; - if(get.attitude(player,target)>0){ - if((target.isDamaged()||target.isTurnedOver())&&(get.suit(card,target)=='heart'||get.name(card,target)=='jiu')) return 3; - if(target.hasUseTarget(card)&&target.getUseValue(card)>player.getUseValue(card,null,true)) return 1.4; + ai: { + order: 7, + result: { + target: function (player, target) { + if (player.storage.bazhan) return -1; + if (ui.selected.cards.length) { + var cards = ui.selected.cards, + card = cards[0]; + if (get.value(cards, target) < 0) return -0.5; + if (get.attitude(player, target) > 0) { + if ( + (target.isDamaged() || target.isTurnedOver()) && + (get.suit(card, target) == "heart" || get.name(card, target) == "jiu") + ) + return 3; + if ( + target.hasUseTarget(card) && + target.getUseValue(card) > player.getUseValue(card, null, true) + ) + return 1.4; return 1; } } @@ -12750,1434 +15916,1734 @@ game.import('character', function () { }, }, }, - jiaoying:{ - audio:2, - trigger:{source:'gainEnd'}, - forced:true, - filter:function(event,player){ - if(player==event.player) return false; - var evt=event.getl(player); - return evt&&evt.hs&&evt.hs.length; + jiaoying: { + audio: 2, + trigger: { source: "gainEnd" }, + forced: true, + filter: function (event, player) { + if (player == event.player) return false; + var evt = event.getl(player); + return evt && evt.hs && evt.hs.length; }, - logTarget:'player', - content:function(){ - var target=trigger.player; - if(!target.storage.jiaoying2) target.storage.jiaoying2=[]; - var cs=trigger.getl(player).hs; - for(var i of cs) target.storage.jiaoying2.add(get.color(i,player)); - target.addTempSkill('jiaoying2'); - target.markSkill('jiaoying2'); - player.addTempSkill('jiaoying3'); - if(!player.storage.jiaoying3) player.storage.jiaoying3=[]; + logTarget: "player", + content: function () { + var target = trigger.player; + if (!target.storage.jiaoying2) target.storage.jiaoying2 = []; + var cs = trigger.getl(player).hs; + for (var i of cs) target.storage.jiaoying2.add(get.color(i, player)); + target.addTempSkill("jiaoying2"); + target.markSkill("jiaoying2"); + player.addTempSkill("jiaoying3"); + if (!player.storage.jiaoying3) player.storage.jiaoying3 = []; player.storage.jiaoying3.add(target); }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - var target=arg.target; - if(target.getStorage('jiaoying2').includes('red')&&get.tag(arg.card,'respondShan')&&!target.hasSkillTag('respondShan',true,null,true)) return true; + ai: { + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + var target = arg.target; + if ( + target.getStorage("jiaoying2").includes("red") && + get.tag(arg.card, "respondShan") && + !target.hasSkillTag("respondShan", true, null, true) + ) + return true; return false; }, - } + }, }, - jiaoying2:{ - onremove:true, - charlotte:true, - mod:{ - cardEnabled2:function(card,player){ - if(player.getStorage('jiaoying2').includes(get.color(card))) return false; + jiaoying2: { + onremove: true, + charlotte: true, + mod: { + cardEnabled2: function (card, player) { + if (player.getStorage("jiaoying2").includes(get.color(card))) return false; }, }, - intro:{ - content:'本回合内不能使用或打出$牌', + intro: { + content: "本回合内不能使用或打出$牌", }, }, - jiaoying3:{ - onremove:true, - trigger:{global:'useCard1'}, - silent:true, - firstDo:true, - charlotte:true, - filter:function(event,player){ + jiaoying3: { + onremove: true, + trigger: { global: "useCard1" }, + silent: true, + firstDo: true, + charlotte: true, + filter: function (event, player) { return player.storage.jiaoying3.includes(event.player); }, - content:function(){ - while(player.storage.jiaoying3.includes(trigger.player)) player.storage.jiaoying3.remove(trigger.player); - if(!player.storage.jiaoying3.length) player.removeSkill('jiaoying3'); + content: function () { + while (player.storage.jiaoying3.includes(trigger.player)) + player.storage.jiaoying3.remove(trigger.player); + if (!player.storage.jiaoying3.length) player.removeSkill("jiaoying3"); }, - group:'jiaoying3_draw', + group: "jiaoying3_draw", }, - jiaoying3_draw:{ - trigger:{global:'phaseEnd'}, - direct:true, - charlotte:true, - filter:function(event,player){ - return player.getStorage('jiaoying3').length>0&&game.hasPlayer(function(current){ - return current.countCards('h')<5; - }) + jiaoying3_draw: { + trigger: { global: "phaseEnd" }, + direct: true, + charlotte: true, + filter: function (event, player) { + return ( + player.getStorage("jiaoying3").length > 0 && + game.hasPlayer(function (current) { + return current.countCards("h") < 5; + }) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.storage.jiaoying3.shift(); - player.chooseTarget('醮影:令一名角色将手牌摸至五张',function(card,player,target){ - return target.countCards('h')<5; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>2){ - return 5-target.countCards('h'); - } - return att/3; - }); - 'step 1' - if(result.bool){ - player.logSkill('jiaoying',result.targets); - for(var i=0;i 2) { + return 5 - target.countCards("h"); + } + return att / 3; + }); + ("step 1"); + if (result.bool) { + player.logSkill("jiaoying", result.targets); + for (var i = 0; i < result.targets.length; i++) { result.targets[i].drawTo(5); } - if(lib.skill.jiaoying3_draw.filter(null,player)) event.goto(0); + if (lib.skill.jiaoying3_draw.filter(null, player)) event.goto(0); } }, }, //郭照 - pianchong:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ + pianchong: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.changeToZero(); - var cards=[]; - var card1=get.cardPile2(function(card){ - return get.color(card,false)=='red'; + var cards = []; + var card1 = get.cardPile2(function (card) { + return get.color(card, false) == "red"; }); - if(card1) cards.push(card1); - var card2=get.cardPile2(function(card){ - return get.color(card,false)=='black'; + if (card1) cards.push(card1); + var card2 = get.cardPile2(function (card) { + return get.color(card, false) == "black"; }); - if(card2) cards.push(card2); - if(cards.length) player.gain(cards,'gain2'); - 'step 1' - player.chooseControl('red','black').set('prompt','偏宠:请选择一种颜色。直至你的下回合开始时,失去该颜色的一张牌后,从牌堆获得另一种颜色的一张牌。').set('ai',function(){ - var red=0,black=0; - var player=_status.event.player; - var cards=player.getCards('he'); - for(var i of cards){ - var add=1; - var color=get.color(i,player); - if(get.position(i)=='e') add=0.5; - else if(get.name(i,player)!='sha'&&player.hasValueTarget(i)) add=1.5; - if(color=='red') red+=add; - else black+=add; - } - if(black>red) return 'black'; - return 'red'; - }); - 'step 2' - player.storage.pianchong2=result.control; - player.addTempSkill('pianchong2',{player:'phaseBeginStart'}); - player.popup(result.control,result.control=='red'?'fire':'thunder'); - game.log(player,'声明了','#y'+get.translation(result.control)); + if (card2) cards.push(card2); + if (cards.length) player.gain(cards, "gain2"); + ("step 1"); + player + .chooseControl("red", "black") + .set( + "prompt", + "偏宠:请选择一种颜色。直至你的下回合开始时,失去该颜色的一张牌后,从牌堆获得另一种颜色的一张牌。" + ) + .set("ai", function () { + var red = 0, + black = 0; + var player = _status.event.player; + var cards = player.getCards("he"); + for (var i of cards) { + var add = 1; + var color = get.color(i, player); + if (get.position(i) == "e") add = 0.5; + else if (get.name(i, player) != "sha" && player.hasValueTarget(i)) add = 1.5; + if (color == "red") red += add; + else black += add; + } + if (black > red) return "black"; + return "red"; + }); + ("step 2"); + player.storage.pianchong2 = result.control; + player.addTempSkill("pianchong2", { player: "phaseBeginStart" }); + player.popup(result.control, result.control == "red" ? "fire" : "thunder"); + game.log(player, "声明了", "#y" + get.translation(result.control)); }, - ai:{ - threaten:4.8, + ai: { + threaten: 4.8, }, }, - pianchong2:{ - audio:'pianchong', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + pianchong2: { + audio: "pianchong", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - var evt=event.getl(player); - if(!evt||!evt.cards2||!evt.cards2.length) return false; - for(var i of evt.cards2){ - if(get.color(i,player)==player.storage.pianchong2) return true; + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + for (var i of evt.cards2) { + if (get.color(i, player) == player.storage.pianchong2) return true; } return false; }, - content:function(){ - 'step 0' - var num=trigger.getl(player).cards2.filter(function(card){ - return get.color(card,player)==player.storage.pianchong2; + content: function () { + "step 0"; + var num = trigger.getl(player).cards2.filter(function (card) { + return get.color(card, player) == player.storage.pianchong2; }).length; - var cards=[]; - while(num--){ - var card=get.cardPile2(function(card){ - return !cards.includes(card)&&get.color(card,false)!=player.storage.pianchong2; + var cards = []; + while (num--) { + var card = get.cardPile2(function (card) { + return ( + !cards.includes(card) && get.color(card, false) != player.storage.pianchong2 + ); }); - if(card) cards.push(card); + if (card) cards.push(card); else break; } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); }, - mark:true, - intro:{ - content:'失去一张$牌后,从牌堆中获得一张与此牌颜色不同的牌', + mark: true, + intro: { + content: "失去一张$牌后,从牌堆中获得一张与此牌颜色不同的牌", }, }, - zunwei:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - let storage=player.getStorage('zunwei'); - return storage.length<3&&game.hasPlayer(current=>{ - return player.isDamaged()&¤t.getHp()>player.getHp()&&!storage.includes(0)|| - current.countCards('h')>player.countCards('h')&&!storage.includes(1)|| - current.countCards('e')>player.countCards('e')&&!storage.includes(2); - }); + zunwei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + let storage = player.getStorage("zunwei"); + return ( + storage.length < 3 && + game.hasPlayer((current) => { + return ( + (player.isDamaged() && + current.getHp() > player.getHp() && + !storage.includes(0)) || + (current.countCards("h") > player.countCards("h") && !storage.includes(1)) || + (current.countCards("e") > player.countCards("e") && !storage.includes(2)) + ); + }) + ); }, - chooseButton:{ - dialog:function(event,player){ - var list=[ - '选择体力值大于你的一名角色', - '选择手牌数大于你的一名角色', - '选择装备数大于你的一名角色', + chooseButton: { + dialog: function (event, player) { + var list = [ + "选择体力值大于你的一名角色", + "选择手牌数大于你的一名角色", + "选择装备数大于你的一名角色", ]; - var choiceList=ui.create.dialog('尊位:请选择一项','forcebutton','hidden'); - choiceList.add([list.map((item,i)=>{ - if(player.getStorage('zunwei').includes(i)) item=`${item}`; - return [i,item]; - }),'textbutton']) + var choiceList = ui.create.dialog("尊位:请选择一项", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + if (player.getStorage("zunwei").includes(i)) + item = `${item}`; + return [i, item]; + }), + "textbutton", + ]); return choiceList; }, - filter:function(button){ - const player=get.player(); - if(player.getStorage('zunwei').includes(button.link)) return false; - if(button.link==0){ - if(!player.isDamaged()) return false; - return game.hasPlayer(current=>{ - return current.getHp()>player.getHp(); + filter: function (button) { + const player = get.player(); + if (player.getStorage("zunwei").includes(button.link)) return false; + if (button.link == 0) { + if (!player.isDamaged()) return false; + return game.hasPlayer((current) => { + return current.getHp() > player.getHp(); }); } - if(button.link==1){ - return game.hasPlayer(current=>{ - return current.countCards('h')>player.countCards('h'); + if (button.link == 1) { + return game.hasPlayer((current) => { + return current.countCards("h") > player.countCards("h"); }); } - if(button.link==2){ - return game.hasPlayer(current=>{ - return current.countCards('e')>player.countCards('e'); + if (button.link == 2) { + return game.hasPlayer((current) => { + return current.countCards("e") > player.countCards("e"); }); } }, - backup:function(links){ - var next=get.copy(lib.skill.zunwei.backups[links[0]]); - next.audio='zunwei'; - next.filterCard=function(){return false}; - next.selectCard=-1; + backup: function (links) { + var next = get.copy(lib.skill.zunwei.backups[links[0]]); + next.audio = "zunwei"; + next.filterCard = function () { + return false; + }; + next.selectCard = -1; return next; }, - check:function(button){ - var player=_status.event.player; - switch(button.link){ - case 0:{ - var target=game.findPlayer(function(current){ + check: function (button) { + var player = _status.event.player; + switch (button.link) { + case 0: { + var target = game.findPlayer(function (current) { return current.isMaxHp(); }); - return (Math.min(target.hp,player.maxHp)-player.hp)*2; + return (Math.min(target.hp, player.maxHp) - player.hp) * 2; } - case 1:{ - var target=game.findPlayer(function(current){ + case 1: { + var target = game.findPlayer(function (current) { return current.isMaxHandcard(); }); - return Math.min(5,target.countCards('h')-player.countCards('h'))*0.8; + return Math.min(5, target.countCards("h") - player.countCards("h")) * 0.8; } - case 2:{ - var target=game.findPlayer(function(current){ - return current.isMaxEquip(); + case 2: { + var target = game.findPlayer(function (current) { + return current.isMaxEquip(); }); - return (target.countCards('e')-player.countCards('e'))*1.4; + return (target.countCards("e") - player.countCards("e")) * 1.4; } } }, - prompt:function(links){ + prompt: function (links) { return [ - '选择一名体力值大于你的其他角色,将体力值回复至与其相同', - '选择一名手牌数大于你的其他角色,将手牌数摸至与其相同', - '选择一名装备区内牌数大于你的其他角色,依次使用牌堆中的装备牌,直到装备数与其相同', + "选择一名体力值大于你的其他角色,将体力值回复至与其相同", + "选择一名手牌数大于你的其他角色,将手牌数摸至与其相同", + "选择一名装备区内牌数大于你的其他角色,依次使用牌堆中的装备牌,直到装备数与其相同", ][links[0]]; }, }, - backups:[ - { - filterTarget:function(card,player,target){ - if(player.isHealthy()) return false; - return target.hp>player.hp; - }, - content:function(){ - player.recover(target.hp-player.hp); - if(!player.storage.zunwei) player.storage.zunwei=[]; - player.storage.zunwei.add(0); - }, - ai:{ - order:10, - result:{ - player:function(player,target){ - return (Math.min(target.hp,player.maxHp)-player.hp); + backups: [ + { + filterTarget: function (card, player, target) { + if (player.isHealthy()) return false; + return target.hp > player.hp; + }, + content: function () { + player.recover(target.hp - player.hp); + if (!player.storage.zunwei) player.storage.zunwei = []; + player.storage.zunwei.add(0); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(target.hp, player.maxHp) - player.hp; + }, }, }, }, - }, - { - filterTarget:function(card,player,target){ - return target.countCards('h')>player.countCards('h'); - }, - content:function(){ - player.draw(Math.min(5,target.countCards('h')-player.countCards('h'))); - if(!player.storage.zunwei) player.storage.zunwei=[]; - player.storage.zunwei.add(1); - }, - ai:{ - order:10, - result:{ - player:function(player,target){ - return Math.min(5,target.countCards('h')-player.countCards('h')); + { + filterTarget: function (card, player, target) { + return target.countCards("h") > player.countCards("h"); + }, + content: function () { + player.draw(Math.min(5, target.countCards("h") - player.countCards("h"))); + if (!player.storage.zunwei) player.storage.zunwei = []; + player.storage.zunwei.add(1); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return Math.min(5, target.countCards("h") - player.countCards("h")); + }, }, }, }, - }, - { - filterTarget:function(card,player,target){ - return target.countCards('e')>player.countCards('e'); - }, - content:function(){ - 'step 0' - if(!player.storage.zunwei) player.storage.zunwei=[]; - player.storage.zunwei.add(2); - event.num=1; - 'step 1' - var type='equip'+num; - if(!player.hasEmptySlot(type)) return; - var card=get.cardPile2(function(card){ - return get.subtype(card,false)==type&&player.canUse(card,player); - }); - if(card) player.chooseUseTarget(card,true).nopopup=true; - 'step 2' - event.num++; - if(event.num<=5&&target.isIn()&&player.countCards('e') player.countCards("e"); + }, + content: function () { + "step 0"; + if (!player.storage.zunwei) player.storage.zunwei = []; + player.storage.zunwei.add(2); + event.num = 1; + ("step 1"); + var type = "equip" + num; + if (!player.hasEmptySlot(type)) return; + var card = get.cardPile2(function (card) { + return get.subtype(card, false) == type && player.canUse(card, player); + }); + if (card) player.chooseUseTarget(card, true).nopopup = true; + ("step 2"); + event.num++; + if ( + event.num <= 5 && + target.isIn() && + player.countCards("e") < target.countCards("e") + ) + event.goto(1); + }, + ai: { + order: 10, + result: { + player: function (player, target) { + return target.countCards("e") - player.countCards("e"); + }, }, }, }, - }, ], - ai:{ - order:10, - result:{ - player:1, + ai: { + order: 10, + result: { + player: 1, }, }, }, //辛宪英 - rezhongjian:{ - enable:'phaseUse', - audio:'zhongjian', - usable:2, - filter:function(event,player){ - if(player.getStat().skill.rezhongjian&&!player.hasSkill('recaishi2')) return false; - return game.hasPlayer(function(current){ - return lib.skill.rezhongjian.filterTarget(null,player,current); + rezhongjian: { + enable: "phaseUse", + audio: "zhongjian", + usable: 2, + filter: function (event, player) { + if (player.getStat().skill.rezhongjian && !player.hasSkill("recaishi2")) return false; + return game.hasPlayer(function (current) { + return lib.skill.rezhongjian.filterTarget(null, player, current); }); }, - filterTarget:function(card,player,target){ - if(!player.storage.rezhongjian2) return true; - return !player.storage.rezhongjian2[0].includes(target)&&!player.storage.rezhongjian2[1].includes(target); + filterTarget: function (card, player, target) { + if (!player.storage.rezhongjian2) return true; + return ( + !player.storage.rezhongjian2[0].includes(target) && + !player.storage.rezhongjian2[1].includes(target) + ); }, - content:function(){ - 'step 0' - player.chooseControl().set('prompt','忠鉴:为'+get.translation(target)+'选择获得一项效果').set('choiceList',[ - '令其于下回合开始前首次造成伤害后弃置两张牌', - '令其于下回合开始前首次受到伤害后摸两张牌', - ]).set('ai',function(){ - return get.attitude(_status.event.player,_status.event.getParent().target)>0?1:0; - }); - 'step 1' - player.addTempSkill('rezhongjian2',{player:'phaseBeginStart'}); + content: function () { + "step 0"; + player + .chooseControl() + .set("prompt", "忠鉴:为" + get.translation(target) + "选择获得一项效果") + .set("choiceList", [ + "令其于下回合开始前首次造成伤害后弃置两张牌", + "令其于下回合开始前首次受到伤害后摸两张牌", + ]) + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.getParent().target) > 0 + ? 1 + : 0; + }); + ("step 1"); + player.addTempSkill("rezhongjian2", { player: "phaseBeginStart" }); //var str=['造成伤害弃牌','受到伤害摸牌'][result.index]; //player.popup(str,['fire','wood'][result.index]); //game.log(player,'选择了','#y'+str) player.storage.rezhongjian2[result.index].push(target); - player.markSkill('rezhongjian2'); + player.markSkill("rezhongjian2"); }, - ai:{ - order:10, - expose:0, - result:{ - player:function(player,target){ - if(get.attitude(player,target)==0) return false; - var sgn=get.sgn((get.realAttitude||get.attitude)(player,target)); - if(game.countPlayer(function(current){ - return get.sgn((get.realAttitude||get.attitude)(player,current))==sgn; - })<=game.countPlayer(function(current){ - return get.sgn((get.realAttitude||get.attitude)(player,current))!=sgn; - })) return 1; + ai: { + order: 10, + expose: 0, + result: { + player: function (player, target) { + if (get.attitude(player, target) == 0) return false; + var sgn = get.sgn((get.realAttitude || get.attitude)(player, target)); + if ( + game.countPlayer(function (current) { + return ( + get.sgn((get.realAttitude || get.attitude)(player, current)) == sgn + ); + }) <= + game.countPlayer(function (current) { + return ( + get.sgn((get.realAttitude || get.attitude)(player, current)) != sgn + ); + }) + ) + return 1; return 0.9; }, }, }, }, - rezhongjian2:{ - trigger:{ - global:['damageSource','damageEnd'], + rezhongjian2: { + trigger: { + global: ["damageSource", "damageEnd"], }, - forced:true, - filter:function(event,player,name){ - var num=(name=='damageSource'?0:1); - var logTarget=(name=='damageSource'?event.source:event.player); - return logTarget&&logTarget.isIn()&&player.storage.rezhongjian2[num].includes(logTarget); + forced: true, + filter: function (event, player, name) { + var num = name == "damageSource" ? 0 : 1; + var logTarget = name == "damageSource" ? event.source : event.player; + return ( + logTarget && logTarget.isIn() && player.storage.rezhongjian2[num].includes(logTarget) + ); }, - logTarget:function(event,player,name){ - return (name=='damageSource'?event.source:event.player); + logTarget: function (event, player, name) { + return name == "damageSource" ? event.source : event.player; }, - content:function(){ - var num=(event.triggername=='damageSource'?0:1); - var target=(event.triggername=='damageSource'?trigger.source:trigger.player); - var storage=player.storage.rezhongjian2; + content: function () { + var num = event.triggername == "damageSource" ? 0 : 1; + var target = event.triggername == "damageSource" ? trigger.source : trigger.player; + var storage = player.storage.rezhongjian2; storage[num].remove(target); - if(storage[0].length+storage[1].length) player.markSkill('rezhongjian2'); - else player.removeSkill('rezhongjian2'); - target[event.triggername=='damageSource'?'chooseToDiscard':'draw'](2,true,'he'); + if (storage[0].length + storage[1].length) player.markSkill("rezhongjian2"); + else player.removeSkill("rezhongjian2"); + target[event.triggername == "damageSource" ? "chooseToDiscard" : "draw"](2, true, "he"); player.draw(); }, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[[],[]]; + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = [[], []]; }, - onremove:true, - intro:{ - markcount:function(storage){ - return storage[0].length+storage[1].length; + onremove: true, + intro: { + markcount: function (storage) { + return storage[0].length + storage[1].length; }, - mark:function(dialog,storage,player){ - if(player==game.me||player.isUnderControl()){ - if(storage[0].length){ - dialog.addText('弃牌'); - dialog.add([storage[0],'player']); + mark: function (dialog, storage, player) { + if (player == game.me || player.isUnderControl()) { + if (storage[0].length) { + dialog.addText("弃牌"); + dialog.add([storage[0], "player"]); } - if(storage[1].length){ - dialog.addText('摸牌'); - dialog.add([storage[1],'player']); + if (storage[1].length) { + dialog.addText("摸牌"); + dialog.add([storage[1], "player"]); } - } - else{ - var list=storage[0].concat(storage[1]).sortBySeat(player); - dialog.add([list,'player']); + } else { + var list = storage[0].concat(storage[1]).sortBySeat(player); + dialog.add([list, "player"]); } }, }, }, - recaishi:{ - trigger:{player:'phaseDrawEnd'}, - direct:true, - audio:'caishi', - isSame:function(event){ - var cards=[]; - event.player.getHistory('gain',function(evt){ - if(evt.getParent().name=='draw'&&evt.getParent('phaseDraw')==event) cards.addArray(evt.cards); + recaishi: { + trigger: { player: "phaseDrawEnd" }, + direct: true, + audio: "caishi", + isSame: function (event) { + var cards = []; + event.player.getHistory("gain", function (evt) { + if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == event) + cards.addArray(evt.cards); }); - if(!cards.length) return 'nogain'; - var list=[]; - for(var i=0;i0; - })==0; - }); - 'step 1' - if(result.bool){ - player.logSkill('recaishi'); + player + .chooseBool(get.prompt("recaishi"), "回复1点体力,然后本回合内不能对自己使用牌") + .set("ai", function () { + if (player.countCards("h", "tao")) return false; + if (player.hp < 2) return true; + return ( + player.countCards("h", function (card) { + var info = get.info(card); + return ( + info && + (info.toself || info.selectTarget == -1) && + player.canUse(card, player) && + player.getUseValue(card) > 0 + ); + }) == 0 + ); + }); + ("step 1"); + if (result.bool) { + player.logSkill("recaishi"); player.recover(); - player.addTempSkill('recaishi3'); + player.addTempSkill("recaishi3"); } }, }, - recaishi2:{}, - recaishi3:{ - mod:{ - targetEnabled:function(card,player,target){ - if(player==target) return false; + recaishi2: {}, + recaishi3: { + mod: { + targetEnabled: function (card, player, target) { + if (player == target) return false; }, }, - mark:true, - intro:{content:'本回合内不能对自己使用牌'}, + mark: true, + intro: { content: "本回合内不能对自己使用牌" }, }, //刘辩 - shiyuan:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - frequent:true, - filter:function(event,player){ - var num=1; - if(_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.group=='qun'&&player.hasZhuSkill('yuwei',_status.currentPhase)) num=2; - return player!=event.player&&player.getHistory('gain',function(evt){ - return evt.getParent(2).name=='shiyuan'&&evt.cards.length==(2+get.sgn(event.player.hp-player.hp)); - }).length=num) return 1; - let name=get.name(card); - if(get.tag(card,'lose')||name==='huogong'||name==='juedou'||name==='tiesuo') return [1,ds]; - if(!target.hasFriend()) return 1; - return [1,0.8*ds]; - } - } - } - }, - dushi:{ - audio:2, - global:'dushi2', - locked:true, - trigger:{player:'die'}, - forceDie:true, - direct:true, - skillAnimation:true, - animationColor:'gray', - filter:function(event,player){ - return game.hasPlayer(current=>current!=player); - }, - content:function(){ - 'step 0' - player.chooseTarget('请选择【毒逝】的目标','选择一名其他角色,令其获得技能【毒逝】',true,lib.filter.notMe).set('forceDie',true).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('dushi',target); - target.markSkill('dushi'); - target.addSkills('dushi'); - } - }, - intro:{content:'您已经获得弘农王的诅咒'}, - }, - dushi2:{ - mod:{ - cardSavable:function(card,player,target){ - if(card.name=='tao'&&target!=player&&target.hasSkill('dushi')) return false; + ai: { + effect: { + target: function (card, player, target) { + if (get.itemtype(player) !== "player" || player === target) return 1; + let num = 1, + ds = 2 + get.sgn(player.hp - target.hp); + if ( + player === _status.currentPhase && + _status.currentPhase.group === "qun" && + target.hasZhuSkill("yuwei", player) + ) + num = 2; + if ( + target.getHistory("gain", function (evt) { + return evt.getParent(2).name === "shiyuan" && evt.cards.length === ds; + }).length >= num + ) + return 1; + let name = get.name(card); + if ( + get.tag(card, "lose") || + name === "huogong" || + name === "juedou" || + name === "tiesuo" + ) + return [1, ds]; + if (!target.hasFriend()) return 1; + return [1, 0.8 * ds]; + }, }, }, }, - yuwei:{ - audio:2, - trigger:{player:'shiyuanBegin'}, - filter:function(event,player){ - return _status.currentPhase.group=='qun'; + dushi: { + audio: 2, + global: "dushi2", + locked: true, + trigger: { player: "die" }, + forceDie: true, + direct: true, + skillAnimation: true, + animationColor: "gray", + filter: function (event, player) { + return game.hasPlayer((current) => current != player); }, - zhuSkill:true, - forced:true, - content:function(){}, - ai:{combo:'shiyuan'}, + content: function () { + "step 0"; + player + .chooseTarget( + "请选择【毒逝】的目标", + "选择一名其他角色,令其获得技能【毒逝】", + true, + lib.filter.notMe + ) + .set("forceDie", true) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("dushi", target); + target.markSkill("dushi"); + target.addSkills("dushi"); + } + }, + intro: { content: "您已经获得弘农王的诅咒" }, + }, + dushi2: { + mod: { + cardSavable: function (card, player, target) { + if (card.name == "tao" && target != player && target.hasSkill("dushi")) return false; + }, + }, + }, + yuwei: { + audio: 2, + trigger: { player: "shiyuanBegin" }, + filter: function (event, player) { + return _status.currentPhase.group == "qun"; + }, + zhuSkill: true, + forced: true, + content: function () {}, + ai: { combo: "shiyuan" }, }, //新岩泽(划掉)留赞 - refenyin:{ - audio:2, - audioname:['wufan'], - trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, - forced:true, - filter:function(event,player){ - if(player!=_status.currentPhase) return false; - var cards=event.getd(); - if(!cards.length) return false; - var list=[]; - var num=cards.length; - for(var i=0;i0; + player.storage.refenyin_mark2 = num; + return list.length > 0; }, - content:function(){ - var list=[]; - var list2=[]; - var cards=trigger.getd(); - for(var i=0;i4?8:4); - game.getGlobalHistory('cardMove',function(evt){ - if(evt.name=='cardsDiscard'||(evt.name=='lose'&&evt.position==ui.discardPile)) num+=evt.cards.length; + onChooseToUse: function (event) { + if (game.online) return; + var num = 0; + var evt2 = event.getParent(); + if (!evt2.liji_all) evt2.liji_all = game.players.length > 4 ? 8 : 4; + game.getGlobalHistory("cardMove", function (evt) { + if ( + evt.name == "cardsDiscard" || + (evt.name == "lose" && evt.position == ui.discardPile) + ) + num += evt.cards.length; }); - event.set('liji_num',Math.floor(num/evt2.liji_all)); + event.set("liji_num", Math.floor(num / evt2.liji_all)); }, - filterCard:true, - position:'he', - check:function(card){ - var val=get.value(card); - if(!_status.event.player.getStorage('refenyin_mark').includes(get.suit(card))) return 12-val; - return 8-val; + filterCard: true, + position: "he", + check: function (card) { + var val = get.value(card); + if (!_status.event.player.getStorage("refenyin_mark").includes(get.suit(card))) + return 12 - val; + return 8 - val; }, - filterTarget:lib.filter.notMe, - content:function(){ - target.damage('nocard'); + filterTarget: lib.filter.notMe, + content: function () { + target.damage("nocard"); }, - ai:{ - order:1, - result:{ - target:-1.5 + ai: { + order: 1, + result: { + target: -1.5, }, - tag:{ - damage:1 + tag: { + damage: 1, }, }, }, //文鸯 - xinlvli:{ - audio:'lvli', - trigger:{player:'damageEnd',source:'damageSource'}, - filter:function(event,player,name){ - var stat=player.getStat().skill; - if(!stat.xinlvli) stat.xinlvli=0; - if(name=='damageEnd'&&!player.storage.beishui) return false; - if(stat.xinlvli>1) return false; - if(stat.xinlvli>0&&(player!=_status.currentPhase||!player.storage.choujue)) return false; - if(player.hp==player.countCards('h')) return false; - if(player.hp 1) return false; + if (stat.xinlvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) + return false; + if (player.hp == player.countCards("h")) return false; + if (player.hp < player.countCards("h") && player.isHealthy()) return false; return true; }, - content:function(){ - var stat=player.getStat().skill; + content: function () { + var stat = player.getStat().skill; stat.xinlvli++; - var num=player.hp-player.countCards('h'); - if(num>0) player.draw(num); + var num = player.hp - player.countCards("h"); + if (num > 0) player.draw(num); else player.recover(-num); }, //group:'lvli3', }, - lvli:{ - audio:2, - init:function(player,skill){ - player.storage[skill]=0; + lvli: { + audio: 2, + init: function (player, skill) { + player.storage[skill] = 0; }, - enable:'chooseToUse', - filter:function(event,player){ - if(player.storage.lvli>1) return false; - if(player.storage.lvli>0&&(player!=_status.currentPhase||!player.storage.choujue)) return false; - return event.type!='wuxie'&&event.type!='respondShan'; + enable: "chooseToUse", + filter: function (event, player) { + if (player.storage.lvli > 1) return false; + if ( + player.storage.lvli > 0 && + (player != _status.currentPhase || !player.storage.choujue) + ) + return false; + return event.type != "wuxie" && event.type != "respondShan"; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var i=0;i=Math.random()){ - player.popup('洗具'); - } - else{ - player.popup('杯具'); + player.popup(trigger.card.name, trigger.name == "useCard" ? "metal" : "wood"); + ("step 1"); + var random = 0.5 + player.countCards("e") * 0.1; + if (get.isLuckyStar(player)) random = 1; + if (random >= Math.random()) { + player.popup("洗具"); + } else { + player.popup("杯具"); trigger.cancel(); - if(!trigger.getParent().lvli6){ + if (!trigger.getParent().lvli6) { trigger.getParent().goto(0); } - game.broadcastAll(function(str){ - var dialog=ui.create.dialog(str); - dialog.classList.add('center'); - setTimeout(function(){ + game.broadcastAll(function (str) { + var dialog = ui.create.dialog(str); + dialog.classList.add("center"); + setTimeout(function () { dialog.close(); - },1000); - },get.translation(player)+'声明的'+get.translation(trigger.card.name)+'并没有生效'); - game.log('然而什么都没有发生'); + }, 1000); + }, get.translation(player) + + "声明的" + + get.translation(trigger.card.name) + + "并没有生效"); + game.log("然而什么都没有发生"); game.delay(2); } }, }, - lvli3:{ - trigger:{global:'phaseBefore'}, - forced:true, - silent:true, - popup:false, - content:function(){ - player.storage.lvli=0; + lvli3: { + trigger: { global: "phaseBefore" }, + forced: true, + silent: true, + popup: false, + content: function () { + player.storage.lvli = 0; }, }, - lvli4:{ - log:false, - enable:'chooseToUse', - viewAsFilter:function(player){ - if(player.storage.lvli>1) return false; - if(player.storage.lvli>0&&(player!=_status.currentPhase||!player.storage.choujue)) return false; + lvli4: { + log: false, + enable: "chooseToUse", + viewAsFilter: function (player) { + if (player.storage.lvli > 1) return false; + if ( + player.storage.lvli > 0 && + (player != _status.currentPhase || !player.storage.choujue) + ) + return false; return true; }, - filterCard:function(){return false}, - selectCard:-1, - viewAs:{name:'shan'}, - ai:{ - skillTagFilter:function(player){ - if(player.storage.lvli>1) return false; - if(player.storage.lvli>0&&(player!=_status.currentPhase||!player.storage.choujue)) return false; + filterCard: function () { + return false; + }, + selectCard: -1, + viewAs: { name: "shan" }, + ai: { + skillTagFilter: function (player) { + if (player.storage.lvli > 1) return false; + if ( + player.storage.lvli > 0 && + (player != _status.currentPhase || !player.storage.choujue) + ) + return false; return true; }, - threaten:1.5, - respondShan:true, - } + threaten: 1.5, + respondShan: true, + }, }, - lvli5:{ - log:false, - enable:'chooseToUse', - viewAsFilter:function(player){ - if(player.storage.lvli>1) return false; - if(player.storage.lvli>0&&(player!=_status.currentPhase||!player.storage.choujue)) return false; + lvli5: { + log: false, + enable: "chooseToUse", + viewAsFilter: function (player) { + if (player.storage.lvli > 1) return false; + if ( + player.storage.lvli > 0 && + (player != _status.currentPhase || !player.storage.choujue) + ) + return false; return true; }, - filterCard:function(){return false}, - selectCard:-1, - viewAs:{name:'wuxie'}, + filterCard: function () { + return false; + }, + selectCard: -1, + viewAs: { name: "wuxie" }, }, - lvli6:{ - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - if(!player.storage.beishui) return false; - if(player.storage.lvli>1) return false; - if(player.storage.lvli>0&&(player!=_status.currentPhase||!player.storage.choujue)) return false; + lvli6: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + if (!player.storage.beishui) return false; + if (player.storage.lvli > 1) return false; + if ( + player.storage.lvli > 0 && + (player != _status.currentPhase || !player.storage.choujue) + ) + return false; return true; }, - content:function(){ - var next=player.chooseToUse(); - next.set('norestore',true); - next.set('_backupevent','lvli'); - next.backup('lvli'); - next.set('lvli6',true); + content: function () { + var next = player.chooseToUse(); + next.set("norestore", true); + next.set("_backupevent", "lvli"); + next.backup("lvli"); + next.set("lvli6", true); }, }, - choujue:{ - derivation:['beishui','qingjiao'], - trigger:{global:'phaseAfter'}, - audio:2, - skillAnimation:true, - animationColor:'water', - unique:true, - juexingji:true, - forced:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=false; + choujue: { + derivation: ["beishui", "qingjiao"], + trigger: { global: "phaseAfter" }, + audio: 2, + skillAnimation: true, + animationColor: "water", + unique: true, + juexingji: true, + forced: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = false; }, - filter:function(event,player){ - if(player.storage.choujue) return false; - return Math.abs(player.hp-player.countCards('h'))>=3; + filter: function (event, player) { + if (player.storage.choujue) return false; + return Math.abs(player.hp - player.countCards("h")) >= 3; }, - content:function(){ - player.awakenSkill('choujue'); - player.storage.choujue=true; + content: function () { + player.awakenSkill("choujue"); + player.storage.choujue = true; player.loseMaxHp(); - player.addSkills('beishui'); + player.addSkills("beishui"); }, }, - beishui:{ - trigger:{player:'phaseZhunbeiBegin'}, - audio:2, - skillAnimation:'epic', - animationColor:'thunder', - unique:true, - juexingji:true, - forced:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=false; + beishui: { + trigger: { player: "phaseZhunbeiBegin" }, + audio: 2, + skillAnimation: "epic", + animationColor: "thunder", + unique: true, + juexingji: true, + forced: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = false; }, - filter:function(event,player){ - if(player.storage.beishui) return false; - return Math.min(player.hp,player.countCards('h'))<2; + filter: function (event, player) { + if (player.storage.beishui) return false; + return Math.min(player.hp, player.countCards("h")) < 2; }, - content:function(){ - player.awakenSkill('beishui'); - player.storage.beishui=true; + content: function () { + player.awakenSkill("beishui"); + player.storage.beishui = true; player.loseMaxHp(); - player.addSkills('qingjiao'); + player.addSkills("qingjiao"); }, }, - qingjiao:{ - trigger:{player:'phaseUseBegin'}, - filter:function(event,player){ - if(!ui.cardPile.hasChildNodes()&&!ui.discardPile.hasChildNodes()); - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'qingjiao')) return false; + qingjiao: { + trigger: { player: "phaseUseBegin" }, + filter: function (event, player) { + if (!ui.cardPile.hasChildNodes() && !ui.discardPile.hasChildNodes()); + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i of hs) { + if (!lib.filter.cardDiscardable(i, player, "qingjiao")) return false; } return true; }, //check:function(event,player){ // return player.countCards('h')<=player.hp; //}, - content:function(){ - 'step 0' - player.chooseToDiscard(true,'h',player.countCards('h')); - 'step 1' - var evt=trigger.getParent(); - if(evt&&evt.getParent&&!evt.qingjiao){ - evt.qingjiao=true; - var next=game.createEvent('qingjiao_discard',false,evt.getParent()); - next.player=player; - next.setContent(function(){ - var hs=player.getCards('he'); - if(hs.length) player.discard(hs); + content: function () { + "step 0"; + player.chooseToDiscard(true, "h", player.countCards("h")); + ("step 1"); + var evt = trigger.getParent(); + if (evt && evt.getParent && !evt.qingjiao) { + evt.qingjiao = true; + var next = game.createEvent("qingjiao_discard", false, evt.getParent()); + next.player = player; + next.setContent(function () { + var hs = player.getCards("he"); + if (hs.length) player.discard(hs); }); } - 'step 2' - var list=[]; - var typelist=[]; - var getType=function(card){ - var sub=get.subtype(card); - if(sub) return sub; + ("step 2"); + var list = []; + var typelist = []; + var getType = function (card) { + var sub = get.subtype(card); + if (sub) return sub; return card.name; }; - for(var i=0;i=8) break; + if (list.length >= 8) break; } } - if(list.length<8){ - for(var i=0;i=8) break; + if (list.length >= 8) break; } } } - player.gain(list,'gain2'); + player.gain(list, "gain2"); }, }, //王双 - spzhuilie:{ - mod:{ - targetInRange:function(card){ - if(card.name=='sha') return true; + spzhuilie: { + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; }, }, - trigger:{player:'useCardToTargeted'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&!player.inRange(event.target); + trigger: { player: "useCardToTargeted" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && !player.inRange(event.target); }, - forced:true, - logTarget:'target', - content:function(){ - 'step 0' - player.judge(function(card){ - var type=get.subtype(card); - return ['equip1','equip4','equip3','equip6'].includes(type)?6:-6; + forced: true, + logTarget: "target", + content: function () { + "step 0"; + player.judge(function (card) { + var type = get.subtype(card); + return ["equip1", "equip4", "equip3", "equip6"].includes(type) ? 6 : -6; // switch(type){ // case 'equip':return 4; // case 'trick':return -4; // default:return 0; // } - }).judge2=function(result){ + }).judge2 = function (result) { return result.bool; }; - 'step 1' - if(trigger.getParent().addCount!==false){ - trigger.getParent().addCount=false; - var stat=player.getStat(); - if(stat&&stat.card&&stat.card.sha) stat.card.sha--; + ("step 1"); + if (trigger.getParent().addCount !== false) { + trigger.getParent().addCount = false; + var stat = player.getStat(); + if (stat && stat.card && stat.card.sha) stat.card.sha--; } - if(result.bool===true){ - var map=trigger.customArgs; - var id=trigger.target.playerid; - if(!map[id]) map[id]={}; - if(typeof map[id].extraDamage!='number') map[id].extraDamage=0; - map[id].extraDamage+=trigger.target.hp-1; - } - else if(result.bool===false) player.loseHp(); + if (result.bool === true) { + var map = trigger.customArgs; + var id = trigger.target.playerid; + if (!map[id]) map[id] = {}; + if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0; + map[id].extraDamage += trigger.target.hp - 1; + } else if (result.bool === false) player.loseHp(); }, }, - spzhuilie2:{ - onremove:true, - intro:{ - content:'使用【杀】的次数上限+#', + spzhuilie2: { + onremove: true, + intro: { + content: "使用【杀】的次数上限+#", }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('spzhuilie2'); + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.countMark("spzhuilie2"); }, }, }, //花鬘 - manyi:{ - audio:2, - audioname:['mengyou','menghuo','zhurong'], - trigger:{target:'useCardToBefore'}, - filter:function(event,player){ - return event.card.name=='nanman'; + manyi: { + audio: 2, + audioname: ["mengyou", "menghuo", "zhurong"], + trigger: { target: "useCardToBefore" }, + filter: function (event, player) { + return event.card.name == "nanman"; }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card){ - if(card.name=='nanman') return 'zerotarget'; + ai: { + effect: { + target: function (card) { + if (card.name == "nanman") return "zerotarget"; }, }, }, - group:'manyi_single', - subSkill:{ - single:{ - trigger:{ - player:'enterGame', - global:'gameDrawAfter', + group: "manyi_single", + subSkill: { + single: { + trigger: { + player: "enterGame", + global: "gameDrawAfter", }, - filter:function(event,player){ - return get.mode()=='single'&&_status.mode=='normal'; + filter: function (event, player) { + return get.mode() == "single" && _status.mode == "normal"; }, - direct:true, - content:function(){ - player.chooseUseTarget('nanman',get.prompt('manyi'),'视为使用一张【南蛮入侵】').logSkill='manyi'; + direct: true, + content: function () { + player.chooseUseTarget( + "nanman", + get.prompt("manyi"), + "视为使用一张【南蛮入侵】" + ).logSkill = "manyi"; }, }, }, }, - mansi:{ - audio:2, - group:'mansi_viewas', - trigger:{global:'damageEnd'}, - filter:function(event,player){ - return event.card&&event.card.name=='nanman'; + mansi: { + audio: 2, + group: "mansi_viewas", + trigger: { global: "damageEnd" }, + filter: function (event, player) { + return event.card && event.card.name == "nanman"; }, - frequent:true, - content:function(){ + frequent: true, + content: function () { player.draw(); - player.addMark('mansi',1,false); + player.addMark("mansi", 1, false); }, - intro:{content:'已因此技能得到了#张牌'}, + intro: { content: "已因此技能得到了#张牌" }, }, - mansi_viewas:{ - audio:'mansi', - position:'h', - enable:'phaseUse', - usable:1, - filterCard:true, - selectCard:-1, - filter:function(event,player){ - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i=0;iget.name(card)!=='tao','h'); - } + viewAs: { name: "nanman" }, + ai: { + order: 0.1, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + !player.getStat("skill").mansi_viewas && + player.hasCard((card) => get.name(card) !== "tao", "h") + ); + }, }, }, - souying:{ - audio:2, - trigger:{ - player:'useCardToPlayered', - target:'useCardToTargeted', + souying: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", }, - direct:true, - filter:function(event,player,name){ - if(!player.countCards('he')||player.hasSkill('souying2')) return false; - if(!event.targets||event.targets.length!=1||event.player==event.target) return false; - if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; - if(name=='useCardToPlayered'){ - if(!event.cards.filterInD().length) return false; - var target=event.target; - return player.getHistory('useCard',function(evt){ - return evt.targets&&evt.targets.includes(target); - }).indexOf(event.getParent())>0; - } - else{ - var source=event.player; - return source.getHistory('useCard',function(evt){ - return evt.targets&&evt.targets.includes(player); - }).indexOf(event.getParent())>0; + direct: true, + filter: function (event, player, name) { + if (!player.countCards("he") || player.hasSkill("souying2")) return false; + if (!event.targets || event.targets.length != 1 || event.player == event.target) + return false; + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + if (name == "useCardToPlayered") { + if (!event.cards.filterInD().length) return false; + var target = event.target; + return ( + player + .getHistory("useCard", function (evt) { + return evt.targets && evt.targets.includes(target); + }) + .indexOf(event.getParent()) > 0 + ); + } else { + var source = event.player; + return ( + source + .getHistory("useCard", function (evt) { + return evt.targets && evt.targets.includes(player); + }) + .indexOf(event.getParent()) > 0 + ); } }, - content:function(){ - 'step 0' - var next=player.chooseToDiscard('he'); + content: function () { + "step 0"; + var next = player.chooseToDiscard("he"); var prompt; - if(event.triggername=='useCardToTargeted'){ - event.target=trigger.player; - prompt='令'+get.translation(trigger.card)+'对你无效'; - next.set('goon',-get.effect(player,trigger.card,trigger.player,player)); + if (event.triggername == "useCardToTargeted") { + event.target = trigger.player; + prompt = "令" + get.translation(trigger.card) + "对你无效"; + next.set("goon", -get.effect(player, trigger.card, trigger.player, player)); + } else { + event.target = trigger.targets[0]; + prompt = "弃置一张牌,并获得" + get.translation(trigger.cards.filterInD()); + next.set("goon", get.value(trigger.cards.filterInD())); } - else{ - event.target=trigger.targets[0]; - prompt='弃置一张牌,并获得'+get.translation(trigger.cards.filterInD()); - next.set('goon',get.value(trigger.cards.filterInD())); - } - next.set('prompt',get.prompt('souying',event.target)); - next.set('prompt2',prompt) - next.set('ai',function(card){ - return _status.event.goon-get.value(card); + next.set("prompt", get.prompt("souying", event.target)); + next.set("prompt2", prompt); + next.set("ai", function (card) { + return _status.event.goon - get.value(card); }); - next.set('logSkill',['souying',event.target]); - 'step 1' - if(result.bool){ - player.addTempSkill('souying2'); - if(event.triggername=='useCardToPlayered') player.gain(trigger.cards.filterInD(),'gain2'); + next.set("logSkill", ["souying", event.target]); + ("step 1"); + if (result.bool) { + player.addTempSkill("souying2"); + if (event.triggername == "useCardToPlayered") + player.gain(trigger.cards.filterInD(), "gain2"); else trigger.excluded.add(player); } }, - ai:{ - expose:0.25, + ai: { + expose: 0.25, }, }, - souying2:{}, - zhanyuan:{ - unique:true, - audio:2, - derivation:'hmxili', - skillAnimation:true, - animationColor:'soil', - juexingji:true, - forced:true, - filter:function(event,player){ - return player.countMark('mansi')>7; + souying2: {}, + zhanyuan: { + unique: true, + audio: 2, + derivation: "hmxili", + skillAnimation: true, + animationColor: "soil", + juexingji: true, + forced: true, + filter: function (event, player) { + return player.countMark("mansi") > 7; }, - trigger:{player:'phaseZhunbeiBegin'}, - content:function(){ - 'step 0' - player.awakenSkill('zhanyuan'); + trigger: { player: "phaseZhunbeiBegin" }, + content: function () { + "step 0"; + player.awakenSkill("zhanyuan"); player.gainMaxHp(); player.recover(); - 'step 1' - player.chooseTarget('是否失去〖蛮嗣〗,令一名其他男性角色和自己一同获得技能〖系力〗?',function(card,player,target){ - return target!=player&&target.hasSex('male'); - }).ai=function(target){ - return get.attitude(_status.event.player,target); + ("step 1"); + player.chooseTarget( + "是否失去〖蛮嗣〗,令一名其他男性角色和自己一同获得技能〖系力〗?", + function (card, player, target) { + return target != player && target.hasSex("male"); + } + ).ai = function (target) { + return get.attitude(_status.event.player, target); }; - 'step 2' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'fire'); - player.changeSkills(['hmxili'],['mansi']); - target.addSkills('hmxili'); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "fire"); + player.changeSkills(["hmxili"], ["mansi"]); + target.addSkills("hmxili"); } }, }, - hmxili:{ - trigger:{global:'damageBegin1'}, - direct:true, - audio:2, - filter:function(event,player){ - return event.source&&event.source!=player&&event.source==_status.currentPhase&&event.source.hasSkill('hmxili')&&!event.player.hasSkill('hmxili')&&player.countCards('he')>0&&!player.hasSkill('hmxili2'); + hmxili: { + trigger: { global: "damageBegin1" }, + direct: true, + audio: 2, + filter: function (event, player) { + return ( + event.source && + event.source != player && + event.source == _status.currentPhase && + event.source.hasSkill("hmxili") && + !event.player.hasSkill("hmxili") && + player.countCards("he") > 0 && + !player.hasSkill("hmxili2") + ); }, - content:function(){ - 'step 0' - player.chooseToDiscard('是否弃置一张牌,令'+get.translation(trigger.source)+'对'+get.translation(trigger.player)+'的伤害+1,且你与其各摸两张牌?','he').set('logSkill',['hmxili',trigger.player]).ai=function(card){ - return 9-get.value(card); + content: function () { + "step 0"; + player + .chooseToDiscard( + "是否弃置一张牌,令" + + get.translation(trigger.source) + + "对" + + get.translation(trigger.player) + + "的伤害+1,且你与其各摸两张牌?", + "he" + ) + .set("logSkill", ["hmxili", trigger.player]).ai = function (card) { + return 9 - get.value(card); }; - 'step 1' - if(result.bool){ - game.asyncDraw([trigger.source,player],2); + ("step 1"); + if (result.bool) { + game.asyncDraw([trigger.source, player], 2); trigger.num++; - player.addTempSkill('hmxili2'); - } - else event.finish(); - 'step 2' + player.addTempSkill("hmxili2"); + } else event.finish(); + ("step 2"); game.delayx(); }, }, - hmxili2:{}, + hmxili2: {}, //吴兰雷铜 - wlcuorui:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - if(!['identity','guozhan'].includes(get.mode())){ - return game.hasPlayer(function(current){ - return current.isFriendOf(player)&¤t.countDiscardableCards(player,'hej')>0; + wlcuorui: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + if (!["identity", "guozhan"].includes(get.mode())) { + return game.hasPlayer(function (current) { + return ( + current.isFriendOf(player) && current.countDiscardableCards(player, "hej") > 0 + ); }); } - return game.hasPlayer(current=>{ - return get.distance(player,current)<=1&¤t.countDiscardableCards(player,'hej')>0; + return game.hasPlayer((current) => { + return ( + get.distance(player, current) <= 1 && + current.countDiscardableCards(player, "hej") > 0 + ); }); }, - content:function(){ - 'step 0' - if(!['identity','guozhan'].includes(get.mode())){ - player.chooseTarget(function(card,player,target){ - return target.isFriendOf(player)&&target.countDiscardableCards(player,'hej')>0; - },get.prompt2('wlcuorui')).set('ai',function(target){ - if(target.countCards('e',function(card){ - return card.name!='tengjia'&&get.value(card,target)<=0; - })) return 10; - if(target.countCards('j',function(card){ - return get.effect(target,{name:card.viewAs||card.name},target,target)<0; - })) return 10; - return Math.random()+0.2-1/target.countCards('hej'); - }); - } - else{ - player.chooseTarget(function(card,player,target){ - return get.distance(player,target)<=1&&target.countDiscardableCards(player,'hej')>0; - },get.prompt2('wlcuorui')).set('ai',function(target){ - if(game.hasPlayer(current=>{ - return current!=target&&get.attitude(_status.event.player,current)<0; - })) return get.effect(target,{name:'guohe'},player,player)+10; - return 0; - }); - } - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('wlcuorui',target); - player.discardPlayerCard(target,'hej',true); - if(['identity','guozhan'].includes(get.mode())) event.goto(7); - } - else event.finish(); - 'step 2' - if(!result.cards||!result.cards.length){ - event.finish(); - return; - } - var color=get.color(result.cards[0],result.cards[0].original=='j'?false:target); - event.color=color; - var list=[]; - if(game.hasPlayer(function(current){ - return (get.mode()=='versus'?current.isEnemyOf(player):current!=player&¤t!=target)&¤t.countCards('h'); - })) list.push('展示手牌'); - if(game.hasPlayer(function(current){ - return (get.mode()=='versus'?current.isEnemyOf(player):current!=player&¤t!=target)&¤t.countCards('e',{color:color}); - })) list.push('弃置装备'); - if(!list.length){ - event.finish(); - return; - } - if(list.length==1) event._result={control:list[0]}; - else player.chooseControl(list).set('prompt','挫锐:展示对手的至多两张手牌,或弃置对手装备区内至多两张'+get.translation(color)+'牌').set('ai',function(){ - var player=_status.event.player; - var color=_status.event.getParent().color; - if(game.countPlayer(function(current){ - if(!current.isEnemyOf(player)) return false; - return current.countCards('e',function(card){ - return get.color(card)==color&&get.value(card)>0; + content: function () { + "step 0"; + if (!["identity", "guozhan"].includes(get.mode())) { + player + .chooseTarget(function (card, player, target) { + return ( + target.isFriendOf(player) && + target.countDiscardableCards(player, "hej") > 0 + ); + }, get.prompt2("wlcuorui")) + .set("ai", function (target) { + if ( + target.countCards("e", function (card) { + return card.name != "tengjia" && get.value(card, target) <= 0; + }) + ) + return 10; + if ( + target.countCards("j", function (card) { + return ( + get.effect( + target, + { name: card.viewAs || card.name }, + target, + target + ) < 0 + ); + }) + ) + return 10; + return Math.random() + 0.2 - 1 / target.countCards("hej"); + }); + } else { + player + .chooseTarget(function (card, player, target) { + return ( + get.distance(player, target) <= 1 && + target.countDiscardableCards(player, "hej") > 0 + ); + }, get.prompt2("wlcuorui")) + .set("ai", function (target) { + if ( + game.hasPlayer((current) => { + return ( + current != target && + get.attitude(_status.event.player, current) < 0 + ); + }) + ) + return get.effect(target, { name: "guohe" }, player, player) + 10; + return 0; }); - })>1) return 1; - return 0; - }); - 'step 3' - if(result.control=='弃置装备') event.goto(5); - else{ - var dialog=['请选择要展示的牌']; - var list=game.filterPlayer(function(current){ - return current.isEnemyOf(player)&¤t.countCards('h'); - }).sortBySeat(); - for(var i of list){ - dialog.push('
    '+get.translation(i)+'
    '); - if(player.hasSkillTag('viewHandcard',null,i,true)) dialog.push(i.getCards('h')); - else dialog.push([i.getCards('h'),'blank']); - } - player.chooseButton([1,2],true).set('createDialog',dialog).set('ai',function(button){ - var color=(get.color(button.link)==_status.event.getParent().color); - return color?Math.random():0.35; - }); } - 'step 4' + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("wlcuorui", target); + player.discardPlayerCard(target, "hej", true); + if (["identity", "guozhan"].includes(get.mode())) event.goto(7); + } else event.finish(); + ("step 2"); + if (!result.cards || !result.cards.length) { + event.finish(); + return; + } + var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target); + event.color = color; + var list = []; + if ( + game.hasPlayer(function (current) { + return ( + (get.mode() == "versus" + ? current.isEnemyOf(player) + : current != player && current != target) && current.countCards("h") + ); + }) + ) + list.push("展示手牌"); + if ( + game.hasPlayer(function (current) { + return ( + (get.mode() == "versus" + ? current.isEnemyOf(player) + : current != player && current != target) && + current.countCards("e", { color: color }) + ); + }) + ) + list.push("弃置装备"); + if (!list.length) { + event.finish(); + return; + } + if (list.length == 1) event._result = { control: list[0] }; + else + player + .chooseControl(list) + .set( + "prompt", + "挫锐:展示对手的至多两张手牌,或弃置对手装备区内至多两张" + + get.translation(color) + + "牌" + ) + .set("ai", function () { + var player = _status.event.player; + var color = _status.event.getParent().color; + if ( + game.countPlayer(function (current) { + if (!current.isEnemyOf(player)) return false; + return current.countCards("e", function (card) { + return get.color(card) == color && get.value(card) > 0; + }); + }) > 1 + ) + return 1; + return 0; + }); + ("step 3"); + if (result.control == "弃置装备") event.goto(5); + else { + var dialog = ["请选择要展示的牌"]; + var list = game + .filterPlayer(function (current) { + return current.isEnemyOf(player) && current.countCards("h"); + }) + .sortBySeat(); + for (var i of list) { + dialog.push('
    ' + get.translation(i) + "
    "); + if (player.hasSkillTag("viewHandcard", null, i, true)) + dialog.push(i.getCards("h")); + else dialog.push([i.getCards("h"), "blank"]); + } + player + .chooseButton([1, 2], true) + .set("createDialog", dialog) + .set("ai", function (button) { + var color = get.color(button.link) == _status.event.getParent().color; + return color ? Math.random() : 0.35; + }); + } + ("step 4"); player.showCards(result.links); - var map={}; - var map2={}; - for(var i of result.links){ - var id=get.owner(i).playerid; - if(!map[id]) map[id]=[]; + var map = {}; + var map2 = {}; + for (var i of result.links) { + var id = get.owner(i).playerid; + if (!map[id]) map[id] = []; map[id].push(i); - if(get.color(i)!=event.color) continue; - if(!map2[id]) map2[id]=[]; + if (get.color(i) != event.color) continue; + if (!map2[id]) map2[id] = []; map2[id].push(i); } - for(var i in map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - if(map2[i]) player.gain(map2[i],source,'bySelf','give'); + for (var i in map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + if (map2[i]) player.gain(map2[i], source, "bySelf", "give"); player.line(source); - game.log(player,'展示了',source,'的',map[i]); + game.log(player, "展示了", source, "的", map[i]); } - event.next.sort(function(a,b){ - return lib.sort.seat(a.source||a.player,b.source||b.player); + event.next.sort(function (a, b) { + return lib.sort.seat(a.source || a.player, b.source || b.player); }); event.finish(); - 'step 5' - var dialog=['请选择要弃置的牌']; - var list=game.filterPlayer(function(current){ - return current.isEnemyOf(player)&¤t.countCards('e',function(card){ - return get.color(card)==event.color; - }); - }).sortBySeat(); - for(var i of list){ - dialog.push('
    '+get.translation(i)+'
    '); - dialog.push(i.getCards('e',function(card){ - return get.color(card)==event.color; - })); + ("step 5"); + var dialog = ["请选择要弃置的牌"]; + var list = game + .filterPlayer(function (current) { + return ( + current.isEnemyOf(player) && + current.countCards("e", function (card) { + return get.color(card) == event.color; + }) + ); + }) + .sortBySeat(); + for (var i of list) { + dialog.push('
    ' + get.translation(i) + "
    "); + dialog.push( + i.getCards("e", function (card) { + return get.color(card) == event.color; + }) + ); } - player.chooseButton([1,2],true).set('createDialog',dialog).set('ai',function(button){ - var owner=get.owner(button.link); - return get.value(button.link,owner) - }); - 'step 6' - var map={}; - for(var i of result.links){ - if(get.color(i)!=event.color) continue; - var id=get.owner(i).playerid; - if(!map[id]) map[id]=[]; + player + .chooseButton([1, 2], true) + .set("createDialog", dialog) + .set("ai", function (button) { + var owner = get.owner(button.link); + return get.value(button.link, owner); + }); + ("step 6"); + var map = {}; + for (var i of result.links) { + if (get.color(i) != event.color) continue; + var id = get.owner(i).playerid; + if (!map[id]) map[id] = []; map[id].push(i); } - for(var i in map){ - (_status.connectMode?lib.playerOL:game.playerMap)[i].discard(map[i],'notBySelf').discarder=player; + for (var i in map) { + (_status.connectMode ? lib.playerOL : game.playerMap)[i].discard( + map[i], + "notBySelf" + ).discarder = player; } - event.next.sort(function(a,b){ - return lib.sort.seat(a.player,b.player); + event.next.sort(function (a, b) { + return lib.sort.seat(a.player, b.player); }); event.finish(); - 'step 7' - if(!result.cards||!result.cards.length){ + ("step 7"); + if (!result.cards || !result.cards.length) { event.finish(); return; } - if(game.hasPlayer(current=>{ - return current.countCards('he')>0&¤t!=player&¤t!=target; - })){ - var color=get.color(result.cards[0],result.cards[0].original=='j'?false:target); - event.color=color; - var next=player.chooseTarget(true,'挫锐:选择另一名其他角色','弃置该角色装备区里至多两张'+get.translation(event.color)+'牌;或展示该角色的至多两张手牌,然后获得其中的'+get.translation(event.color)+'牌'); - next.set('filterTarget',(card,player,target)=>{ - return target.countCards('he')>0&&target!=player&&target!=_status.event.getParent().target; + if ( + game.hasPlayer((current) => { + return current.countCards("he") > 0 && current != player && current != target; + }) + ) { + var color = get.color( + result.cards[0], + result.cards[0].original == "j" ? false : target + ); + event.color = color; + var next = player.chooseTarget( + true, + "挫锐:选择另一名其他角色", + "弃置该角色装备区里至多两张" + + get.translation(event.color) + + "牌;或展示该角色的至多两张手牌,然后获得其中的" + + get.translation(event.color) + + "牌" + ); + next.set("filterTarget", (card, player, target) => { + return ( + target.countCards("he") > 0 && + target != player && + target != _status.event.getParent().target + ); }); - next.set('ai',target=>{ - return -get.attitude(_status.event.player,target)*target.countCards('he')+0.1; + next.set("ai", (target) => { + return ( + -get.attitude(_status.event.player, target) * target.countCards("he") + 0.1 + ); }); - } - else event.finish(); - 'step 8' - if(result.bool){ - var targetx=result.targets[0]; - event.targetx=targetx; + } else event.finish(); + ("step 8"); + if (result.bool) { + var targetx = result.targets[0]; + event.targetx = targetx; player.line(targetx); - player.choosePlayerCard(targetx,'he',true,[1,2]).set('prompt','展示至多两张手牌,或弃置至多两张'+get.translation(event.color)+'装备').set('filterButton',button=>{ - if(ui.selected.buttons.length){ - var linkx=ui.selected.buttons[0].link; - if(get.position(button.link)!=get.position(linkx)) return false; - } - if(get.position(button.link)=='e') return get.color(button.link,_status.event.target)==_status.event.getParent().color; - return true; - }).set('target',targetx); - } - else event.finish(); - 'step 9' - if(result.bool){ - var cards=result.links; - if(get.position(cards[0])=='e'){ - event.targetx.discard(cards,'notBySelf').discarder=player; + player + .choosePlayerCard(targetx, "he", true, [1, 2]) + .set( + "prompt", + "展示至多两张手牌,或弃置至多两张" + get.translation(event.color) + "装备" + ) + .set("filterButton", (button) => { + if (ui.selected.buttons.length) { + var linkx = ui.selected.buttons[0].link; + if (get.position(button.link) != get.position(linkx)) return false; + } + if (get.position(button.link) == "e") + return ( + get.color(button.link, _status.event.target) == + _status.event.getParent().color + ); + return true; + }) + .set("target", targetx); + } else event.finish(); + ("step 9"); + if (result.bool) { + var cards = result.links; + if (get.position(cards[0]) == "e") { + event.targetx.discard(cards, "notBySelf").discarder = player; event.finish(); - } - else{ - player.showCards(cards,get.translation(event.targetx)+'因【挫锐】展示的牌'); - var cards2=cards.filter(card=>{ - return get.color(card)==event.color; + } else { + player.showCards(cards, get.translation(event.targetx) + "因【挫锐】展示的牌"); + var cards2 = cards.filter((card) => { + return get.color(card) == event.color; }); - if(cards2.length) player.gain(cards2,event.targetx,'give'); + if (cards2.length) player.gain(cards2, event.targetx, "give"); } } }, }, - kuiji:{ - audio:2, - usable:1, - enable:"phaseUse", - filter:function(event,player){ - if(player.hasJudge('bingliang')) return false; - return player.countCards('hes',function(card){ - return get.color(card)=='black'&&get.type(card)=='basic'; - })>0; + kuiji: { + audio: 2, + usable: 1, + enable: "phaseUse", + filter: function (event, player) { + if (player.hasJudge("bingliang")) return false; + return ( + player.countCards("hes", function (card) { + return get.color(card) == "black" && get.type(card) == "basic"; + }) > 0 + ); }, - position:'hes', - discard:false, - lose:false, - delay:false, - prepare:function(cards,player){ - player.$give(cards,player,false); + position: "hes", + discard: false, + lose: false, + delay: false, + prepare: function (cards, player) { + player.$give(cards, player, false); }, - filterCard:function(card,player,event){ - return get.color(card)=='black'&&get.type(card)=='basic'&&player.canAddJudge({name:'bingliang',cards:[card]}); + filterCard: function (card, player, event) { + return ( + get.color(card) == "black" && + get.type(card) == "basic" && + player.canAddJudge({ name: "bingliang", cards: [card] }) + ); }, - selectTarget:-1, - filterTarget:function(card,player,target){ - return player==target; + selectTarget: -1, + filterTarget: function (card, player, target) { + return player == target; }, - check:function(card){ - return 9-get.value(card); + check: function (card) { + return 9 - get.value(card); }, // onuse:function(links,player){ // var next=game.createEvent('kuiji_content',false,_status.event.getParent()); @@ -14185,95 +17651,138 @@ game.import('character', function () { // next.setContent(lib.skill.kuiji.kuiji_content); // }, // kuiji_content:function(){ - content:function(){ - 'step 0' - player.addJudge({name:'bingliang'},cards); + content: function () { + "step 0"; + player.addJudge({ name: "bingliang" }, cards); player.draw(); - 'step 1' - var next=player.chooseTarget().set('ai',function(target){ - let player=_status.event.player; - if(target.hasSkillTag('filterDamage',null,{ - player:player - },true)) return get.damageEffect(target,player,player); - return 2*get.damageEffect(target,player,player); + ("step 1"); + var next = player.chooseTarget().set("ai", function (target) { + let player = _status.event.player; + if ( + target.hasSkillTag( + "filterDamage", + null, + { + player: player, + }, + true + ) + ) + return get.damageEffect(target, player, player); + return 2 * get.damageEffect(target, player, player); }); - if(!['identity','guozhan'].includes(get.mode())){ - next.set('prompt','选择一名体力值最大的敌方角色,对其造成2点伤害'); - next.set('filterTarget',function(card,player,target){ - return target.isEnemyOf(player)&&!game.hasPlayer(function(current){ - return current.isEnemyOf(player)&¤t.hp>target.hp; - }); + if (!["identity", "guozhan"].includes(get.mode())) { + next.set("prompt", "选择一名体力值最大的敌方角色,对其造成2点伤害"); + next.set("filterTarget", function (card, player, target) { + return ( + target.isEnemyOf(player) && + !game.hasPlayer(function (current) { + return current.isEnemyOf(player) && current.hp > target.hp; + }) + ); + }); + } else { + next.set("prompt", "选择一名除你外体力值最大的角色,对其造成2点伤害"); + next.set("filterTarget", function (card, player, target) { + return ( + player != target && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) + ); }); } - else{ - next.set('prompt','选择一名除你外体力值最大的角色,对其造成2点伤害'); - next.set('filterTarget',function(card,player,target){ - return player!=target&&!game.hasPlayer(function(current){ - return current!=player&¤t.hp>target.hp; - }); - }); - } - 'step 2' - if(result.bool){ - var target=result.targets[0]; + ("step 2"); + if (result.bool) { + var target = result.targets[0]; player.line(target); target.damage(2); } }, - ai:{ - result:{ - target:function(player,target){ + ai: { + result: { + target: function (player, target) { let es; - if(['identity','guozhan'].includes(get.mode())) es=game.hasPlayer(i=>{ - return i!=player&&!game.hasPlayer(j=>{ - return player!==j&&j.hp>i.hp; - })&&get.attitude(player,i)<0; - }); - else es=game.hasPlayer(i=>{ - return i.isEnemyOf(player)&&!game.hasPlayer(j=>{ - return j.hp>i.hp&&j.isEnemyOf(player); - })&&get.attitude(player,i)<0; - }); - if(es) return 2; + if (["identity", "guozhan"].includes(get.mode())) + es = game.hasPlayer((i) => { + return ( + i != player && + !game.hasPlayer((j) => { + return player !== j && j.hp > i.hp; + }) && + get.attitude(player, i) < 0 + ); + }); + else + es = game.hasPlayer((i) => { + return ( + i.isEnemyOf(player) && + !game.hasPlayer((j) => { + return j.hp > i.hp && j.isEnemyOf(player); + }) && + get.attitude(player, i) < 0 + ); + }); + if (es) return 2; return -1.5; }, }, - order:12, + order: 12, }, - group:'kuiji_dying', - subSkill:{ - dying:{ - trigger:{global:'dying'}, - filter:function(event,player){ - let evt=event.getParent(2); - return evt&&evt.name=='kuiji'; + group: "kuiji_dying", + subSkill: { + dying: { + trigger: { global: "dying" }, + filter: function (event, player) { + let evt = event.getParent(2); + return evt && evt.name == "kuiji"; }, - locked:true, - direct:true, - content:function(){ - 'step 0' + locked: true, + direct: true, + content: function () { + "step 0"; var list; - if(['identity','guozhan'].includes(get.mode())) list=game.filterPlayer(current=>{ - return current!==trigger.player&&!game.hasPlayer(i=>{ - return trigger.player!==i&&i.hpi.isDamaged()); - else list=game.filterPlayer(current=>{ - return current.isFriendOf(player)&&!game.hasPlayer(i=>{ - return i.hpi.isDamaged()); - if(list.length>1) player.chooseTarget('溃击:选择一名角色回复1点体力',(card,player,target)=>{ - return _status.event.list.includes(target); - },true).set('list',list).set('ai',target=>{ - return get.recoverEffect(target,player,_status.event.player); - }); - else if(list.length) event._result={bool:true,targets:list}; - else event._result={bool:false}; - 'step 1' - if(result.bool){ - let target=result.targets[0]; - player.logSkill('kuiji',target); + if (["identity", "guozhan"].includes(get.mode())) + list = game + .filterPlayer((current) => { + return ( + current !== trigger.player && + !game.hasPlayer((i) => { + return trigger.player !== i && i.hp < current.hp; + }) + ); + }) + .filter((i) => i.isDamaged()); + else + list = game + .filterPlayer((current) => { + return ( + current.isFriendOf(player) && + !game.hasPlayer((i) => { + return i.hp < current.hp && i.isFriendOf(player); + }) + ); + }) + .filter((i) => i.isDamaged()); + if (list.length > 1) + player + .chooseTarget( + "溃击:选择一名角色回复1点体力", + (card, player, target) => { + return _status.event.list.includes(target); + }, + true + ) + .set("list", list) + .set("ai", (target) => { + return get.recoverEffect(target, player, _status.event.player); + }); + else if (list.length) event._result = { bool: true, targets: list }; + else event._result = { bool: false }; + ("step 1"); + if (result.bool) { + let target = result.targets[0]; + player.logSkill("kuiji", target); target.recover(); } }, @@ -14281,86 +17790,95 @@ game.import('character', function () { }, }, //蒲元 - pytianjiang:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + pytianjiang: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + locked: false, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - var i=0; - var list=[]; - while(i++<2){ - var card=get.cardPile(function(card){ - if(get.type(card)!='equip') return false; - return list.length==0||get.subtype(card)!=get.subtype(list[0]); + content: function () { + "step 0"; + var i = 0; + var list = []; + while (i++ < 2) { + var card = get.cardPile(function (card) { + if (get.type(card) != "equip") return false; + return list.length == 0 || get.subtype(card) != get.subtype(list[0]); }); - if(card) list.push(card); + if (card) list.push(card); } - if(!list.length){event.finish();return;} - event.list=list; - player.gain(event.list,'gain2'); - 'step 1' + if (!list.length) { + event.finish(); + return; + } + event.list = list; + player.gain(event.list, "gain2"); + ("step 1"); game.delay(1); - var card=event.list.shift(); - if(player.getCards('h').includes(card)){ - player.$give(card,player,false) + var card = event.list.shift(); + if (player.getCards("h").includes(card)) { + player.$give(card, player, false); player.equip(card); } - if(event.list.length) event.redo(); + if (event.list.length) event.redo(); }, - group:'pytianjiang_move', + group: "pytianjiang_move", }, - pytianjiang_move:{ - audio:'pytianjiang', - prompt:'将装备区里的一张牌移动至其他角色的装备区', - enable:'phaseUse', - position:'e', - filter:function(event,player){ - return player.countCards('e')>0; + pytianjiang_move: { + audio: "pytianjiang", + prompt: "将装备区里的一张牌移动至其他角色的装备区", + enable: "phaseUse", + position: "e", + filter: function (event, player) { + return player.countCards("e") > 0; }, - check:function(){return 1}, - filterCard:true, - filterTarget:function(event,player,target){ - return target!=player&&target.canEquip(ui.selected.cards[0],true); + check: function () { + return 1; }, - prepare:'give', - discard:false, - lose:false, - content:function(){ - 'step 0' + filterCard: true, + filterTarget: function (event, player, target) { + return target != player && target.canEquip(ui.selected.cards[0], true); + }, + prepare: "give", + discard: false, + lose: false, + content: function () { + "step 0"; target.equip(cards[0]); - 'step 1' - if(cards[0].name.indexOf('pyzhuren_')==0&&!player.getCards('e').includes(cards[0])) player.draw(2); + ("step 1"); + if (cards[0].name.indexOf("pyzhuren_") == 0 && !player.getCards("e").includes(cards[0])) + player.draw(2); }, - ai:{ - order:(item,player)=>{ - if(player.hasCard(i=>get.subtype(i)==='equip1','h')) return 11; + ai: { + order: (item, player) => { + if (player.hasCard((i) => get.subtype(i) === "equip1", "h")) return 11; return 1; }, - expose:0.2, - result:{ - target:function(player,target){ - if(ui.selected.cards.length){ - let card=ui.selected.cards[0],tv=get.value(card,target),sub=get.subtype(card); - if(sub==='equip1'){ - let ev=Infinity,te=target.getEquips(1); - if(!te.length) return tv; - te.forEach(i=>{ - ev=Math.min(ev,get.value(i)); + expose: 0.2, + result: { + target: function (player, target) { + if (ui.selected.cards.length) { + let card = ui.selected.cards[0], + tv = get.value(card, target), + sub = get.subtype(card); + if (sub === "equip1") { + let ev = Infinity, + te = target.getEquips(1); + if (!te.length) return tv; + te.forEach((i) => { + ev = Math.min(ev, get.value(i)); }); - if(card.name.indexOf('pyzhuren_')==0) return 2+tv-ev; - return tv-ev; + if (card.name.indexOf("pyzhuren_") == 0) return 2 + tv - ev; + return tv - ev; } - if(target.hasCard(i=>get.subtype(i)===sub,'he')) return 0; - let pv=get.value(card,player); - if(pv>0&&Math.abs(tv)<=pv) return 0; + if (target.hasCard((i) => get.subtype(i) === sub, "he")) return 0; + let pv = get.value(card, player); + if (pv > 0 && Math.abs(tv) <= pv) return 0; return tv; } return 0; @@ -14368,767 +17886,862 @@ game.import('character', function () { }, }, }, - pyzhuren:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:true, - selectCard:1, - check:function(card){ - var player=_status.event.player; - var name='pyzhuren_'+(card[card.name=='shandian'?'name':'suit']); - if(!lib.card[name]||_status.pyzhuren&&_status.pyzhuren[name]){ - if(!player.countCards('h','sha')) return 4-get.value(card); + pyzhuren: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: 1, + check: function (card) { + var player = _status.event.player; + var name = "pyzhuren_" + card[card.name == "shandian" ? "name" : "suit"]; + if (!lib.card[name] || (_status.pyzhuren && _status.pyzhuren[name])) { + if (!player.countCards("h", "sha")) return 4 - get.value(card); return 0; } - return 7-get.value(card); + return 7 - get.value(card); }, - content:function(){ + content: function () { //player.addSkill('pyzhuren_destroy'); - if(!_status.pyzhuren) _status.pyzhuren={}; - var rand=0.85; - var num=get.number(cards[0]); - if(num>4) rand=0.9; - if(num>8) rand=0.95; - if(num>12||cards[0].name=='shandian'||get.isLuckyStar(player)) rand=1; - var name='pyzhuren_'+(cards[0][cards[0].name=='shandian'?'name':'suit']); - if(!lib.card[name]||_status.pyzhuren[name]||Math.random()>rand){ - player.popup('杯具'); - game.log(player,'锻造失败'); - var card=get.cardPile(function(card){ - return card.name=='sha'; + if (!_status.pyzhuren) _status.pyzhuren = {}; + var rand = 0.85; + var num = get.number(cards[0]); + if (num > 4) rand = 0.9; + if (num > 8) rand = 0.95; + if (num > 12 || cards[0].name == "shandian" || get.isLuckyStar(player)) rand = 1; + var name = "pyzhuren_" + cards[0][cards[0].name == "shandian" ? "name" : "suit"]; + if (!lib.card[name] || _status.pyzhuren[name] || Math.random() > rand) { + player.popup("杯具"); + game.log(player, "锻造失败"); + var card = get.cardPile(function (card) { + return card.name == "sha"; }); - if(card) player.gain(card,'gain2'); - } - else{ - _status.pyzhuren[name]=true; - var card=game.createCard(name,cards[0].name=='shandian'?'spade':cards[0].suit,1); - card.destroyed='discardPile'; - player.gain(card,'gain2') + if (card) player.gain(card, "gain2"); + } else { + _status.pyzhuren[name] = true; + var card = game.createCard( + name, + cards[0].name == "shandian" ? "spade" : cards[0].suit, + 1 + ); + card.destroyed = "discardPile"; + player.gain(card, "gain2"); } }, - ai:{ - order:10, - result:{ - player:1, + ai: { + order: 10, + result: { + player: 1, }, }, }, - pyzhuren_heart:{ - audio:true, - trigger:{source:'damageSource'}, - usable:1, - equipSkill:true, - filter:function(event,player){ - return event.getParent().name=='sha'; + pyzhuren_heart: { + audio: true, + trigger: { source: "damageSource" }, + usable: 1, + equipSkill: true, + filter: function (event, player) { + return event.getParent().name == "sha"; }, - content:function(){ - 'step 0' - player.judge(function(card){ - var player=_status.event.getParent('pyzhuren_heart').player; - if(player.isHealthy()&&get.color(card)=='red') return 0; + content: function () { + "step 0"; + player.judge(function (card) { + var player = _status.event.getParent("pyzhuren_heart").player; + if (player.isHealthy() && get.color(card) == "red") return 0; return 2; }); - 'step 1' - if(result.color=='red') player.recover(); + ("step 1"); + if (result.color == "red") player.recover(); else player.draw(2); }, - ai:{ - equipValue:function(card,player){ - if(player.isDamaged()) return 4.5; + ai: { + equipValue: function (card, player) { + if (player.isDamaged()) return 4.5; return 6; }, - basic:{ - equipValue:4.5 - } - } + basic: { + equipValue: 4.5, + }, + }, }, - pyzhuren_diamond:{ - audio:true, - trigger:{source:'damageBegin1'}, - direct:true, - usable:2, - equipSkill:true, - mod:{ - cardUsable:function(card,player,num){ - var cardx=player.getEquip('pyzhuren_diamond'); - if(card.name=='sha'&&(!cardx||player.hasSkill('pyzhuren_diamond',null,false)||(!_status.pyzhuren_diamond_temp&&!ui.selected.cards.includes(cardx)))){ - return num+1; + pyzhuren_diamond: { + audio: true, + trigger: { source: "damageBegin1" }, + direct: true, + usable: 2, + equipSkill: true, + mod: { + cardUsable: function (card, player, num) { + var cardx = player.getEquip("pyzhuren_diamond"); + if ( + card.name == "sha" && + (!cardx || + player.hasSkill("pyzhuren_diamond", null, false) || + (!_status.pyzhuren_diamond_temp && !ui.selected.cards.includes(cardx))) + ) { + return num + 1; } }, - cardEnabled2:function(card,player){ - if(!_status.event.addCount_extra||player.hasSkill('pyzhuren_diamond',null,false)) return; - if(card&&card==player.getEquip('pyzhuren_diamond')){ - _status.pyzhuren_diamond_temp=true; - var bool=lib.filter.cardUsable(get.autoViewAs({name:'sha'},ui.selected.cards.concat([card])),player); + cardEnabled2: function (card, player) { + if (!_status.event.addCount_extra || player.hasSkill("pyzhuren_diamond", null, false)) + return; + if (card && card == player.getEquip("pyzhuren_diamond")) { + _status.pyzhuren_diamond_temp = true; + var bool = lib.filter.cardUsable( + get.autoViewAs({ name: "sha" }, ui.selected.cards.concat([card])), + player + ); delete _status.pyzhuren_diamond_temp; - if(!bool) return false; + if (!bool) return false; } }, }, - filter:function(event,player){ - if(event.getParent().name!='sha') return false; - return player.countCards('he',function(card){ - return card!=player.getEquip('pyzhuren_diamond'); - })>0; + filter: function (event, player) { + if (event.getParent().name != "sha") return false; + return ( + player.countCards("he", function (card) { + return card != player.getEquip("pyzhuren_diamond"); + }) > 0 + ); }, - content:function(){ - 'step 0' - var next=player.chooseToDiscard('he',function(card,player){ - return card!=player.getEquip('pyzhuren_diamond'); - },get.prompt(event.name,trigger.player),'弃置一张牌,令即将对其造成的伤害+1'); - next.set('target',trigger.player); - next.ai=function(card){ - if(_status.event.goon) return 30/(1+_status.event.target.hp)-get.value(card); + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + function (card, player) { + return card != player.getEquip("pyzhuren_diamond"); + }, + get.prompt(event.name, trigger.player), + "弃置一张牌,令即将对其造成的伤害+1" + ); + next.set("target", trigger.player); + next.ai = function (card) { + if (_status.event.goon) return 30 / (1 + _status.event.target.hp) - get.value(card); return -1; }; - next.set('goon',get.attitude(player,trigger.player)<0&&!trigger.player.hasSkillTag('filterDamage',null,{ - player:player, - card:trigger.card, - })&&get.damageEffect(trigger.player,player,player,get.natureList(trigger))>0); - next.logSkill=[event.name,trigger.player]; - 'step 1' - if(result.bool) trigger.num++; + next.set( + "goon", + get.attitude(player, trigger.player) < 0 && + !trigger.player.hasSkillTag("filterDamage", null, { + player: player, + card: trigger.card, + }) && + get.damageEffect(trigger.player, player, player, get.natureList(trigger)) > 0 + ); + next.logSkill = [event.name, trigger.player]; + ("step 1"); + if (result.bool) trigger.num++; else player.storage.counttrigger.pyzhuren_diamond--; }, - ai:{ - expose:0.25, - equipValue:function(card,player){ - return Math.min(7,3.6+player.countCards('h')/2); + ai: { + expose: 0.25, + equipValue: function (card, player) { + return Math.min(7, 3.6 + player.countCards("h") / 2); }, - basic:{ - equipValue:4.5 - } - } + basic: { + equipValue: 4.5, + }, + }, }, - pyzhuren_club:{ - audio:true, - trigger:{player:'useCard2'}, - direct:true, - equipSkill:true, - filter:function(event,player){ - if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - var num=player.getHistory('useSkill',function(evt){ - return evt.skill=='pyzhuren_club'; + pyzhuren_club: { + audio: true, + trigger: { player: "useCard2" }, + direct: true, + equipSkill: true, + filter: function (event, player) { + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + var num = player.getHistory("useSkill", function (evt) { + return evt.skill == "pyzhuren_club"; }).length; - if(num>=2) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return lib.filter.targetEnabled2(event.card,player,current)&&!event.targets.includes(current); - })){ + if (num >= 2) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + lib.filter.targetEnabled2(event.card, player, current) && + !event.targets.includes(current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'额外指定一个目标'; - player.chooseTarget([1,player.storage.fumian_red],get.prompt(event.name),function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('targets',trigger.targets).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "额外指定一个目标"; + player + .chooseTarget( + [1, player.storage.fumian_red], + get.prompt(event.name), + function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + } + ) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; } - 'step 2' - if(event.targets){ - player.logSkill(event.name,event.targets); + ("step 2"); + if (event.targets) { + player.logSkill(event.name, event.targets); trigger.targets.addArray(event.targets); } }, - ai:{ - equipValue:function(card,player){ - if(player.getEnemies().length<2){ - if(player.isDamaged()) return 0; + ai: { + equipValue: function (card, player) { + if (player.getEnemies().length < 2) { + if (player.isDamaged()) return 0; return 1; } return 4.5; }, - basic:{ - equipValue:4.5 - } - } + basic: { + equipValue: 4.5, + }, + }, }, - pyzhuren_spade:{ - audio:true, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha';//&&event.targets.length==1&&get.color(event.card)=='black'; + pyzhuren_spade: { + audio: true, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha"; //&&event.targets.length==1&&get.color(event.card)=='black'; }, - check:function(event,player){ - return get.attitude(player,event.target)<=0; + check: function (event, player) { + return get.attitude(player, event.target) <= 0; }, - equipSkill:true, - logTarget:'target', - content:function(){ - var num=player.getHistory('useSkill',function(evt){ - return evt.skill=='pyzhuren_spade'; + equipSkill: true, + logTarget: "target", + content: function () { + var num = player.getHistory("useSkill", function (evt) { + return evt.skill == "pyzhuren_spade"; }).length; - trigger.target.loseHp(Math.min(num,5));//.set('source',player); + trigger.target.loseHp(Math.min(num, 5)); //.set('source',player); }, - ai:{ - equipValue:function(card,player){ - return 1+4*Math.min(5,player.getCardUsable('sha')); + ai: { + equipValue: function (card, player) { + return 1 + 4 * Math.min(5, player.getCardUsable("sha")); }, - basic:{ - equipValue:5 + basic: { + equipValue: 5, + }, + jueqing: true, + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "unequip_ai") return arg && arg.name === "sha"; }, - jueqing:true, - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='unequip_ai') return arg&&arg.name==='sha'; - } }, }, - pyzhuren_shandian:{ - audio:true, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha';//&&event.targets.length==1; + pyzhuren_shandian: { + audio: true, + trigger: { player: "useCardToPlayered" }, + filter: function (event, player) { + return event.card.name == "sha"; //&&event.targets.length==1; }, - check:function(event,player){ - return get.attitude(player,event.target)<=0; + check: function (event, player) { + return get.attitude(player, event.target) <= 0; }, - equipSkill:true, - logTarget:'target', - content:function(){ - 'step 0' - trigger.target.judge(function(card){ - var suit=get.suit(card); - if(suit=='spade') return -10; - if(suit=='club') return -5; + equipSkill: true, + logTarget: "target", + content: function () { + "step 0"; + trigger.target.judge(function (card) { + var suit = get.suit(card); + if (suit == "spade") return -10; + if (suit == "club") return -5; return 0; - }).judge2=function(result){ - return result.color=='black'?true:false; + }).judge2 = function (result) { + return result.color == "black" ? true : false; }; - 'step 1' - if(result.suit=='spade'){ - trigger.target.damage(3,'thunder'); + ("step 1"); + if (result.suit == "spade") { + trigger.target.damage(3, "thunder"); //trigger.getParent().excluded.add(trigger.target); - } - else if(result.suit=='club'){ - trigger.target.damage('thunder'); + } else if (result.suit == "club") { + trigger.target.damage("thunder"); player.recover(); player.draw(); } }, - ai:{ - equipValue:function(card,player){ - if(player.isDamaged()) return 6; + ai: { + equipValue: function (card, player) { + if (player.isDamaged()) return 6; return 4.8; }, - basic:{ - equipValue:5 - } - } + basic: { + equipValue: 5, + }, + }, }, //管辂和葛玄 - gxlianhua:{ - derivation:['reyingzi','reguanxing','xinzhiyan','gongxin'], - audio:2, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]={ - red:0,black:0, - } + gxlianhua: { + derivation: ["reyingzi", "reguanxing", "xinzhiyan", "gongxin"], + audio: 2, + init: function (player, skill) { + if (!player.storage[skill]) + player.storage[skill] = { + red: 0, + black: 0, + }; }, - marktext:'丹', - intro:{ - name:'丹血', - markcount:function(storage){ - return storage.red+storage.black; + marktext: "丹", + intro: { + name: "丹血", + markcount: function (storage) { + return storage.red + storage.black; }, - content:function(storage){ - return '共有'+(storage.red+storage.black)+'个标记'; + content: function (storage) { + return "共有" + (storage.red + storage.black) + "个标记"; }, }, - trigger:{global:'damageEnd'}, - forced:true, - locked:false, - filter:function(event,player){ - return event.player!=player&&event.player.isIn()&&_status.currentPhase!=player; + trigger: { global: "damageEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + return event.player != player && event.player.isIn() && _status.currentPhase != player; }, - content:function(){ - player.storage.gxlianhua[player.getFriends().includes(trigger.player)?'red':'black']++; - player.markSkill('gxlianhua'); + content: function () { + player.storage.gxlianhua[ + player.getFriends().includes(trigger.player) ? "red" : "black" + ]++; + player.markSkill("gxlianhua"); }, - group:'gxlianhua_harmonia', - subSkill:{ - harmonia:{ - forced:true, - audio:'gxlianhua', - sub:true, - trigger:{player:'phaseZhunbeiBegin'}, + group: "gxlianhua_harmonia", + subSkill: { + harmonia: { + forced: true, + audio: "gxlianhua", + sub: true, + trigger: { player: "phaseZhunbeiBegin" }, //filter:function(event,player){ // return player.storage.gxlianhua&&player.storage.gxlianhua.red+player.storage.gxlianhua.black>0; //}, - content:function(){ - var cards=[]; - var cards2=[]; - var skill=''; - var red=player.storage.gxlianhua.red; - var black=player.storage.gxlianhua.black; - player.storage.gxlianhua={red:0,black:0}; - player.unmarkSkill('gxlianhua'); - if(red+black<4){ - cards=['tao']; - skill='reyingzi'; + content: function () { + var cards = []; + var cards2 = []; + var skill = ""; + var red = player.storage.gxlianhua.red; + var black = player.storage.gxlianhua.black; + player.storage.gxlianhua = { red: 0, black: 0 }; + player.unmarkSkill("gxlianhua"); + if (red + black < 4) { + cards = ["tao"]; + skill = "reyingzi"; + } else if (red > black) { + cards = ["wuzhong"]; + skill = "reguanxing"; + } else if (red < black) { + cards = ["shunshou"]; + skill = "xinzhiyan"; + } else { + cards = ["sha", "juedou"]; + skill = "gongxin"; } - else if(red>black){ - cards=['wuzhong']; - skill='reguanxing'; - } - else if(red{ - if(get.attitude(target,current)>0) return 0.3; - if(target.hasJudge('lebu')) return 0.6; - if(target.inRange(current)) return 1.5; - return 1; - })); + ai: { + order: 1, + result: { + player: function (player, target) { + return Math.max( + 0, + 1 + + target.countCards("h") - + game.countPlayer((current) => { + if (get.attitude(target, current) > 0) return 0.3; + if (target.hasJudge("lebu")) return 0.6; + if (target.inRange(current)) return 1.5; + return 1; + }) + ); }, - target:function(player,target){ - return -Math.max(0,1+target.countCards('h')-game.countPlayer(current=>{ - if(get.attitude(target,current)>0) return 0.3; - if(target.hasJudge('lebu')) return 0.6; - if(target.inRange(current)) return 1.5; - return 1; - })); - } - } + target: function (player, target) { + return -Math.max( + 0, + 1 + + target.countCards("h") - + game.countPlayer((current) => { + if (get.attitude(target, current) > 0) return 0.3; + if (target.hasJudge("lebu")) return 0.6; + if (target.inRange(current)) return 1.5; + return 1; + }) + ); + }, + }, }, - subSkill:{ - hf:{ - trigger:{ - global:'phaseDiscardBegin' + subSkill: { + hf: { + trigger: { + global: "phaseDiscardBegin", }, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.player!=player&&event.player.hasMark('zhafu_hf'); + forced: true, + charlotte: true, + filter: function (event, player) { + return event.player != player && event.player.hasMark("zhafu_hf"); }, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - target.removeMark('zhafu_hf',1); - if(target.countCards('h')<=1) event.finish() - 'step 1' - target.chooseCard('h',true,'选择保留一张手牌,将其余的手牌交给'+get.translation(player)).set('ai',get.value); - 'step 2' - var cards=target.getCards('h'); + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + target.removeMark("zhafu_hf", 1); + if (target.countCards("h") <= 1) event.finish(); + ("step 1"); + target + .chooseCard( + "h", + true, + "选择保留一张手牌,将其余的手牌交给" + get.translation(player) + ) + .set("ai", get.value); + ("step 2"); + var cards = target.getCards("h"); cards.remove(result.cards[0]); - target.give(cards,player); + target.give(cards, player); }, - intro:{ - content:'mark', - onunmark:true, + intro: { + content: "mark", + onunmark: true, }, }, }, }, - tuiyan:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - frequent:true, - content:function(){ - 'step 0' - var cards=get.cards(3); - event.cards=cards; - game.log(player,'观看了牌堆顶的'+get.cnNumber(cards.length)+'张牌'); - player.chooseControl('ok').set('dialog',['推演',cards]); - 'step 1' - while(cards.length){ - ui.cardPile.insertBefore(cards.pop(),ui.cardPile.firstChild); + tuiyan: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + frequent: true, + content: function () { + "step 0"; + var cards = get.cards(3); + event.cards = cards; + game.log(player, "观看了牌堆顶的" + get.cnNumber(cards.length) + "张牌"); + player.chooseControl("ok").set("dialog", ["推演", cards]); + ("step 1"); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); } game.updateRoundNumber(); }, }, - busuan:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - var list=[]; - for(var i=0;i0) return 1 - return -5/(target.countCards('h')+1); + ai: { + order: 1, + result: { + target: function (player, target) { + var att = get.attitude(player, target); + if (att > 0) return 1; + return -5 / (target.countCards("h") + 1); }, }, }, }, - busuan_angelbeats:{ - mark:true, - intro:{ - mark:function(dialog,content,player){ - if(content&&content.length) dialog.add([content,'vcard']); + busuan_angelbeats: { + mark: true, + intro: { + mark: function (dialog, content, player) { + if (content && content.length) dialog.add([content, "vcard"]); }, }, - trigger:{player:'drawBefore'}, - forced:true, - filter:function(event,player){ - return event.getParent().name=='phaseDraw'; + trigger: { player: "drawBefore" }, + forced: true, + filter: function (event, player) { + return event.getParent().name == "phaseDraw"; }, - onremove:true, - content:function(){ - 'step 0' - var list=player.storage['busuan_angelbeats']; - var cards=[]; - for(var i=0;i1) player.loseHp(); + content: function () { + "step 0"; + event.count = 0; + ("step 1"); + player.draw("visible"); + ("step 2"); + if (Array.isArray(result)) { + event.count += result.length; + if (get.color(result) != "red") { + if (player.hp > 1) player.loseHp(); event.finish(); - } - else if(event.count<3) player.chooseBool('是否继续发动【命戒】?').ai=function(){ - if(event.count==2) return Math.random()<0.5; - return lib.skill.mingjie.check(); - }; - } - else event.finish(); - 'step 3' - if(result.bool) event.goto(1); + } else if (event.count < 3) + player.chooseBool("是否继续发动【命戒】?").ai = function () { + if (event.count == 2) return Math.random() < 0.5; + return lib.skill.mingjie.check(); + }; + } else event.finish(); + ("step 3"); + if (result.bool) event.goto(1); }, }, }, - card:{ + card: { //武关羽的兵临城下水淹七军 - shuiyanqijuny:{ - audio:'shuiyanqijun', - fullskin:true, - cardimage:'shuiyanqijunx', - enable:true, - filterTarget:true, - type:'trick', - selectTarget:[1,2], - targetprompt:['受伤弃牌','受伤摸牌'], - contentBefore(){ - var evt=event.getParent(),target=evt.stocktargets[0]; - evt.shuiyanqijun_target=target; + shuiyanqijuny: { + audio: "shuiyanqijun", + fullskin: true, + cardimage: "shuiyanqijunx", + enable: true, + filterTarget: true, + type: "trick", + selectTarget: [1, 2], + targetprompt: ["受伤弃牌", "受伤摸牌"], + contentBefore() { + var evt = event.getParent(), + target = evt.stocktargets[0]; + evt.shuiyanqijun_target = target; }, - content(){ - target.damage('thunder'); - if(target!=event.getParent().shuiyanqijun_target) target.draw(); - else target.chooseToDiscard('he',true); + content() { + target.damage("thunder"); + if (target != event.getParent().shuiyanqijun_target) target.draw(); + else target.chooseToDiscard("he", true); }, - ai:{ - order:6, - value:4, - useful:2, - tag:{ - damage:1, - thunderDamage:1, - natureDamage:1, - loseCard:1, + ai: { + order: 6, + value: 4, + useful: 2, + tag: { + damage: 1, + thunderDamage: 1, + natureDamage: 1, + loseCard: 1, }, - result:{ - target:function(player,target){ - if(!ui.selected.targets.length) return -1.5; - return -0.5 - } - } - } + result: { + target: function (player, target) { + if (!ui.selected.targets.length) return -1.5; + return -0.5; + }, + }, + }, }, - pyzhuren_heart:{ - fullskin:true, - derivation:'puyuan', - type:'equip', - subtype:'equip1', - distance:{attackFrom:-2}, - skills:['pyzhuren_heart'], - onDestroy(card){ - if(_status.pyzhuren&&_status.pyzhuren[card.name]){ + pyzhuren_heart: { + fullskin: true, + derivation: "puyuan", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -2 }, + skills: ["pyzhuren_heart"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { delete _status.pyzhuren[card.name]; } }, - ai:{ - basic:{ - equipValue:4 - } + ai: { + basic: { + equipValue: 4, + }, }, }, - pyzhuren_diamond:{ - fullskin:true, - derivation:'puyuan', - type:'equip', - subtype:'equip1', - distance:{attackFrom:-1}, - skills:['pyzhuren_diamond'], - onDestroy(card){ - if(_status.pyzhuren&&_status.pyzhuren[card.name]){ + pyzhuren_diamond: { + fullskin: true, + derivation: "puyuan", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -1 }, + skills: ["pyzhuren_diamond"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { delete _status.pyzhuren[card.name]; } }, - ai:{ - basic:{ - equipValue:3 - } + ai: { + basic: { + equipValue: 3, + }, }, }, - pyzhuren_club:{ - fullskin:true, - derivation:'puyuan', - type:'equip', - subtype:'equip1', - distance:{attackFrom:-1}, - skills:['pyzhuren_club'], - onDestroy(card){ - if(_status.pyzhuren&&_status.pyzhuren[card.name]){ + pyzhuren_club: { + fullskin: true, + derivation: "puyuan", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -1 }, + skills: ["pyzhuren_club"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { delete _status.pyzhuren[card.name]; } }, - ai:{ - basic:{ - equipValue:5 - } + ai: { + basic: { + equipValue: 5, + }, }, - loseDelay:false, - onLose:function(){ - var next=game.createEvent('baiyin_recover'); + loseDelay: false, + onLose: function () { + var next = game.createEvent("baiyin_recover"); event.next.remove(next); - var evt=event.getParent(); - if(evt.getlx===false) evt=evt.getParent(); + var evt = event.getParent(); + if (evt.getlx === false) evt = evt.getParent(); evt.after.push(next); - next.player=player; - next.setContent(function(){ - if(player.isDamaged()) player.logSkill('pyzhuren_club'); + next.player = player; + next.setContent(function () { + if (player.isDamaged()) player.logSkill("pyzhuren_club"); player.recover(); }); }, }, - pyzhuren_spade:{ - fullskin:true, - derivation:'puyuan', - type:'equip', - subtype:'equip1', - skills:['pyzhuren_spade'], - onDestroy(card){ - if(_status.pyzhuren&&_status.pyzhuren[card.name]){ + pyzhuren_spade: { + fullskin: true, + derivation: "puyuan", + type: "equip", + subtype: "equip1", + skills: ["pyzhuren_spade"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { delete _status.pyzhuren[card.name]; } }, - ai:{ - basic:{ - equipValue:3 - } + ai: { + basic: { + equipValue: 3, + }, }, }, - pyzhuren_shandian:{ - fullskin:true, - derivation:'puyuan', - type:'equip', - subtype:'equip1', - distance:{attackFrom:-3}, - skills:['pyzhuren_shandian'], - onDestroy(card){ - if(_status.pyzhuren&&_status.pyzhuren[card.name]){ + pyzhuren_shandian: { + fullskin: true, + derivation: "puyuan", + type: "equip", + subtype: "equip1", + distance: { attackFrom: -3 }, + skills: ["pyzhuren_shandian"], + onDestroy(card) { + if (_status.pyzhuren && _status.pyzhuren[card.name]) { delete _status.pyzhuren[card.name]; } }, - ai:{ - basic:{ - equipValue:3 - } + ai: { + basic: { + equipValue: 3, + }, }, }, - dagongche:{ - fullskin:true, - derivation:'zhangfen', - type:'equip', - subtype:'equip5', - skills:['dagongche_skill'], - cardPrompt:function(card){ - if(!card.storage) return '出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。'; - var str='出牌阶段开始时,你可以视为使用一张'; - if(card.storage.大攻车选项一) str+='无距离限制且无视防具的'; - str+='【杀】'; - if(card.storage.大攻车选项二) str+=('(此【杀】的目标上限+'+card.storage.大攻车选项二+')'); - str+=',且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其'; - var num=1; - if(card.storage.大攻车选项三) num+=card.storage.大攻车选项三; - str+=get.cnNumber(num); - str+='张牌。当此牌离开你的装备区后,销毁之。'; + dagongche: { + fullskin: true, + derivation: "zhangfen", + type: "equip", + subtype: "equip5", + skills: ["dagongche_skill"], + cardPrompt: function (card) { + if (!card.storage) + return "出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。"; + var str = "出牌阶段开始时,你可以视为使用一张"; + if (card.storage.大攻车选项一) str += "无距离限制且无视防具的"; + str += "【杀】"; + if (card.storage.大攻车选项二) + str += "(此【杀】的目标上限+" + card.storage.大攻车选项二 + ")"; + str += ",且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其"; + var num = 1; + if (card.storage.大攻车选项三) num += card.storage.大攻车选项三; + str += get.cnNumber(num); + str += "张牌。当此牌离开你的装备区后,销毁之。"; return str; }, - destroy:true, - ai:{ - basic:{ - equipValue:3 - } + destroy: true, + ai: { + basic: { + equipValue: 3, + }, }, }, - pilitoushiche:{ - fullskin:true, - derivation:'dc_liuye', - cardimage:'ly_piliche', - type:'equip', - subtype:'equip5', - skills:['pilitoushiche'], - destroy:true, - ai:{ - basic:{ - equipValue:3 - } + pilitoushiche: { + fullskin: true, + derivation: "dc_liuye", + cardimage: "ly_piliche", + type: "equip", + subtype: "equip5", + skills: ["pilitoushiche"], + destroy: true, + ai: { + basic: { + equipValue: 3, + }, }, }, }, - characterIntro:{ - cuimao:'请分别查看「崔琰」和「毛玠」的武将介绍。', - bailingyun:'柏灵筠,女,是电视剧《大军师司马懿之军师联盟》、《虎啸龙吟》中的主要角色之一,由张钧甯饰演。20岁,是曹丕赏赐司马懿的美人,也是曹丕的眼线,被送入司马府中为妾室。柔弱美貌、心机极深。', - caoxian:'曹宪(生卒年不详),女,沛国谯县(今安徽省亳州市)人。东汉末年历史人物,汉献帝刘协嫔妃,魏武帝曹操女儿。建安十八年,嫁给汉献帝刘协,受封为贵人。黄初元年(220年),兄弟曹丕称帝后,汉献帝成为山阳公,不知所终。', - zhangjian:'张臶(136年-240年),字子明,钜鹿人。汉末三国时期隐士、音乐家,精通谶纬之学。张臶生活的年代从东汉一直到曹魏齐王时期,受到朝廷多次征召,一直回避,不愿做官。他活了一百零五岁,是三国时期有可靠记载的最长寿的人之一。', - puyuan:'蒲元是三国时蜀汉杰出的工匠。为诸葛亮造刀三千口,并且制作木牛流马。后来姜维为他写过两部传记《蒲元传》《蒲元别传》。', - guanlu:"管辂(209年-256年),字公明,平原(今山东德州平原县)人。三国时期曹魏术士。年八九岁,便喜仰观星辰。成人后,精通《周易》,善于卜筮、相术,习鸟语,相传每言辄中,出神入化。体性宽大,常以德报怨。正元初,为少府丞。北宋时被追封为平原子。管辂是历史上著名的术士,被后世奉为卜卦观相的祖师。", - gexuan:"葛玄(164年-244年),汉族,吴丹阳郡句容县都乡吉阳里人(今句容市),祖籍山东琅琊,三国著名高道,道教灵宝派祖师。字孝先,号仙翁,被尊称为“葛天师”。道教尊为葛仙翁,又称太极仙翁,与张道陵、许逊、萨守坚共为四大天师。为汉下邳僮侯葛艾后裔,祖葛矩,安平太守,黄门郎;从祖葛弥,豫章第五郡太守。父葛焉,字德儒,州主簿,山阴令,散骑常侍,大尚书。随左慈学道,得《太清丹经》、《黄帝九鼎神丹经》、《金液丹经》等道经。曾采药海山,吴嘉禾二年(233年),在閤皂山修道建庵,筑坛立炉,修炼九转金丹。喜好遨游山川,去过括苍山、南岳山、罗浮山。编撰《灵宝经诰》,精研上清、灵宝等道家真经,并嘱弟子世世箓传。", - wulan:'吴兰(?~218年),青州(今山东潍坊市)人。东汉末年将领。初为益州牧刘璋部将,后来归降刘备。汉中之战中,与马超、张飞各领一军,驻扎于下辩。建安二十三年,为曹操将领曹洪、张郃所败,退回汉中。途中,为阴平氐族首领强端所杀。', - leitong:'雷铜(?-218年),阴平(今甘肃文县)人,氐族,东汉末年益州名将。本属益州牧刘璋麾下。刘备攻取益州后,归刘备麾下。参加汉中之战,为魏将张郃所杀。', - huaman:'花鬘,古典戏曲《龙凤巾》(一名《化外奇缘》)中的人物,身份为三国时期南蛮王孟获与祝融夫人的女儿,关索的夫人之一。在关于关三小姐·关银屏的民间传说中,其名字为“花中秀”,与关索其他几位夫人鲍三娘、王桃、王悦都被关索之姐关银屏编入自己的女兵营中。花鬘在《三国志》,《三国演义》均未有提及,只是戏曲中的虚构人物。其形象并非一般君主家中闺秀,而是与其母祝融相似,是一个可以披甲上阵,善于刀枪作战的女武将。戏曲中在诸葛亮平定南蛮时,花鬘曾与关索作战,失败被俘,两人互生爱意,南蛮王孟获降服后二人成婚。近些年,花鬘接连在各类三国题材的游戏中登场,更广被人知晓。', - wangshuang:'王双(?-228年),三国时期曹魏将领。蜀汉建兴六年(228年)冬,诸葛亮出散关,攻陈仓,后粮尽而退。王双率领骑兵追击蜀军,但在与蜀军的交战中被击败,王双也被蜀军所斩。在《三国演义》中,王双字子全,是陇西郡狄道县(今甘肃临洮县)人,有万夫不当之勇。在诸葛亮北伐期间,被魏延所斩。', - wenyang:"文俶(238年—291年),一作文淑,字次骞,小名阿鸯,世称文鸯,谯郡(今安徽亳州市)人。魏末晋初名将,曹魏扬州刺史文钦之子。骁勇善战,依附大将军曹爽,效忠于王室。司马师废黜皇帝曹芳后,随父联合毌丘俭于淮南起兵勤王。兵败之后,向南投奔吴国。诸葛诞发动淮南叛乱,奉命率军驰援。双方发生内讧,父亲为诸葛诞所害,遂降于司马昭,封关内侯。西晋建立后,任平虏护军。咸宁三年(277年),拜平西将军、都督凉秦雍州三州军事,大破鲜卑首领秃发树机能,名震天下,迁使持节、护东夷校尉、监辽东军事。八王之乱中,为诸葛诞外孙、东安王司马繇所诬杀,惨遭灭族,时年五十四岁。", - liubian:'刘辩(176年-190年3月6日),是汉灵帝刘宏与何皇后的嫡长子。刘辩在灵帝驾崩后继位为帝,史称少帝,由于年幼,实权掌握在临朝称制的母亲何太后和母舅大将军何进手中。少帝在位时期,东汉政权已经名存实亡,他即位后不久即遭遇以何进为首的外戚集团和以十常侍为首的内廷宦官集团这两大敌对政治集团的火并,被迫出宫,回宫后又受制于以“勤王”为名进京的凉州军阀董卓,终于被废为弘农王,成为东汉唯一被废黜的皇帝,其同父异母弟陈留王刘协继位为帝,是为汉献帝。被废黜一年之后,刘辩在董卓胁迫下自尽,时年仅十五岁(一说十八岁),其弟献帝追谥他为怀王。中国古代的史书中称刘辩为皇子辩、少帝和弘农王等。因为在位不逾年,传统上称东汉共十二帝,刘辩与东汉另一位少帝刘懿都不在其中,亦皆无本纪;不过,现代史学界也有观点承认两位少帝均是汉朝皇帝,则刘辩为东汉第十三位皇帝。', - guozhao:'郭照,电视剧《军师联盟》中的女主角之一,由唐艺昕饰演。原型为文德皇后郭氏(字女王),魏国皇后,张春华的义妹,深爱曹丕,替甄宓抚育曹叡,因甄宓之死被曹叡记恨,曹丕死后,成为皇太后,被曹叡逼上死路。自尽身亡。', - fanyufeng:'樊夫人,东汉末年人物,昔桂阳太守赵范寡嫂。赵云随刘备平定江南四郡后,刘备以赵云为桂阳太守。赵范居心叵测,要将自己的嫂嫂樊氏嫁给赵云,但遭到赵云的拒绝。后来,赵范逃走,樊氏也下落不明。2001年,应日本日中青少年文化中心成立50周年之邀,北京京剧院赴日进行40场巡回演出,这次访日的剧目都不同程度地进行了加工改编,以符合日本观众的需求。《取桂阳》是根据老本重新排演的,叶金援饰赵云,王怡饰樊玉凤。剧中的樊玉凤成为文武双全的巾帼英雄,被赵云收降,后来在《龙凤呈祥》中也参与堵截东吴的追兵。', - ruanyu:'阮瑀(约165—212年),字元瑜,陈留尉氏(今河南开封市尉氏县)人,是东汉末年文学家,建安七子之一。阮瑀所作章表书记很出色,当时军国书檄文字,多为阮瑀与陈琳所拟。名作有《为曹公作书与孙权》。诗有《驾出北郭门行》,描写孤儿受后母虐待的苦难遭遇,比较生动形象。年轻时曾受学于蔡邕,蔡邕称他为“奇才”。后徙为丞相仓曹掾属。诗歌语言朴素,往往能反映出一般的社会问题。阮瑀的音乐修养颇高,他的儿子阮籍,孙子阮咸皆当时名人,位列“竹林七贤”,妙于音律。明人辑有《阮元瑜集》。', - yangwan:'杨氏(婉字出自小说,史书无记载),生卒年不详,东汉末年凉州人。早年嫁于东汉前将军、槐里侯马腾之子马超,追随马超转战并州、雍州、凉州,为马超生下子嗣。公元212年,马超联军在渭南战败后,杨婉随马超逃亡凉州,很快马超反攻吞并陇上诸郡县。公元213年,杨婉为了帮助马超,结识王异,了解马超这些投降部下。可惜被王异蛊惑,遭致马超大败。自己和孩子都被赵衢、梁宽杀害。', - zhouyi:'周夷,游卡桌游旗下产品《三国杀》自行杜撰的人物。设定为周瑜的妹妹,和周瑜一同征战。', - caojinyu:'金乡公主,本姓曹氏,名字不详,沛国谯县(今安徽省亳州市)人。魏武帝曹操的女儿,母为杜夫人。适婚的时候,嫁给曹操的养子何晏。高平陵之变,何晏作为大将军曹爽的党羽,遭到太傅司马懿处死。在何晏母亲尹夫人苦苦哀求下,何晏的儿子得以保全。', - wufan:'吴范(?-226年),字文则,会稽上虞(今浙江绍兴上虞区)人。三国时期孙吴官员,擅长术数。与刘惇、赵达、严武、曹不兴、皇象、宋寿和郑妪合称“吴中八绝”。吴范以推算天象节气和观察气候闻名于郡中。孙权起于东南,他委身事奉,每推算灾祥多应验,遂显名。孙权委以骑都尉,领太史令。初,孙权为将军时,他曾说江南有王气。及孙权立为吴王,论功行封,欲以为都亭侯,但因不愿将其术要诀告知孙权,为权所怨恨,被除名。黄武中,病死。', - caomao:'曹髦(241年11月15日-260年6月2日),字彦士,沛国谯县(今安徽省亳州市)人,魏文帝曹丕之孙,东海王曹霖之子,曹魏第四位皇帝(254年11月1日-260年6月2日)。正始二年(241年),生于东海王宫,自幼聪明好学,才慧早成,正始五年(244年),封为高贵乡公,嘉平六年(254年),大将军司马师废除齐王曹芳后,拥立为帝,年号正元,曹髦文才武略,崇拜少康,不满司马氏专权秉政,甘露五年(260年),亲自讨伐司马昭,为太子舍人成济所弑,年仅十九岁,以王礼葬于洛阳西北。曹髦擅长诗文,创制了九言诗,传世文章有《伤魂赋并序》《颜子论》等。爱好儒学,亲赴太学论道,著有《春秋左氏传音》(失传)。精通绘画,一说为中国第一位成为画家的皇帝,唐张彦远《历代名画记》目曹髦为中品。', - laiyinger:'来莺儿,是个传说中的人物,正史及古代典籍并无记载。相传来莺儿是东汉歌妓,建安年间洛阳名妓,后爱上曹操的侍卫王图,王图因延误军机而押赴刑场,当时来莺儿奋不顾身以己命换王图一死。新编古装潮剧《曹营恋歌》,秦腔《雀台歌女》讲述了歌女来莺儿与情人王图及曹操三人之间催人泪下的故事。', - caohua:'曹华,东汉末年人物,曹操之女,为汉献帝妃嫔。建安十八年(213年),曹操进为魏公,把曹宪、曹节、曹华三个女儿,一齐都送给汉献帝刘协做了妃子,皆封为夫人,聘以束帛五万匹,年龄尚小者在魏公国待年长而聘。', - zhaoang:'赵昂,字伟章(一作伟璋),天水冀人。汉末时曹操部下。初为羌道令,建安中转参军事徒居州治冀城。建安十八年,马超围冀城多天,城中饥困,凉州刺史韦康不愿百姓再受苦而打算投降,赵昂进劝但不为所纳。后马超背信弃义杀韦康并劫其子赵月为人质,把他送至南郑。欲以此要迫使赵昂为己所用。后与梁宽、赵衢、庞恭、杨阜等结谋为康报仇,并举兵讨伐马超。马超兵败遂弃城,投奔张鲁。得张鲁之援后马超于建安十九年复寇,赵昂与妻子王异坚守祁山三十天至夏侯渊的救兵解围,其子赵月终为马超斩杀。自冀城之难,至于祁山,赵昂出九奇策。', - liuhui:'刘徽(约225年—约295年),汉族,山东滨州邹平市人,魏晋期间伟大的数学家,中国古典数学理论的奠基人之一。在中国数学史上作出了极大的贡献,他的杰作《九章算术注》和《海岛算经》,是中国最宝贵的数学遗产。刘徽思想敏捷,方法灵活,既提倡推理又主张直观。他是中国最早明确主张用逻辑推理的方式来论证数学命题的人。刘徽的一生是为数学刻苦探求的一生。他虽然地位低下,但人格高尚。他不是沽名钓誉的庸人,而是学而不厌的伟人,他给我们中华民族留下了宝贵的财富。2021年5月,国际天文学联合会(IAU)批准中国在嫦娥五号降落地点附近月球地貌的命名,刘徽(liuhui)为八个地貌地名之一。', - zhangfen:'张奋,徐州彭城(今江苏徐州)人。三国时期孙吴将领,辅吴将军张昭的侄子。善于制作攻城器械。在步骘举荐下,担任将军,累迁平州都督,册封乐乡亭侯,病逝于任上。', - dukui:'杜夔,字公良,河南人,擅长音律,聪明过人。管弦等各种乐器,他无所不能。他长期总管歌舞音乐,精心研究,继承复兴了前代古乐,并有所创新。仕于曹操、曹丕之世,以通晓音乐称于世。早年任雅乐郎,汉中平五年(188年),因病离职。州郡的司徒以礼相请,他因时世混乱而奔荆州。荆州牧刘表的儿子刘琮投降曹操后,曹操以杜夔为军谋祭酒 ,参与太乐署之事,令他创制雅乐。魏文帝曹丕黄初年间,任太乐令、协律都尉。', - quanhuijie:'全皇后(244年-301年),吴郡钱塘(今浙江杭州)人,吴废帝孙亮的皇后,全尚之女,母孙恭之女。吴大帝长女全公主的侄孙女。赤乌十三年(250年),因全公主推荐全氏被册为孙亮的太子妃,建兴二年(253年),全氏被立为皇后。太平三年(258年),孙亮被权臣孙綝贬为会稽王,全皇后也一同贬为会稽王夫人。永安三年(260年),全皇后随夫到侯官,孙亮在途中死去,全皇后在侯官居住二十余年,吴亡后返回吴郡,永宁元年(301年)去世。', - dingshangwan:'丁尚涴,又名丁夫人。东汉末年权臣曹操的原配夫人。丁尚涴嫁给曹操时,曹操另有刘夫人,生长子曹昂和清河长公主。后刘夫人早亡,曹昂便由丁尚涴抚养,丁尚涴视其为己出。
    建安二年(公元197年),曹昂随军出征宛城,战死沙场。丁尚涴悲痛欲绝,口出怨言数落曹操,又悲啼不止。曹操恼羞成怒,将其打发回了娘家。不久之后,心生悔意的曹操亲自前往丁家,打算将丁尚涴接回。然而丁尚涴却只是闷头织布。曹操手抚其背,说:“顾我共载归乎!”丁尚涴依旧不理不睬。曹操走到门口,又回过头:“得无尚可邪!”然而依旧得不到回应,只得感叹:“真诀矣。”于是与之和离,并让丁家允许她改嫁,丁家不敢为之。
    丁尚涴去世后,卞夫人请求曹操安葬她,于是葬在许城以南。后来曹操病重,知道自己时日无多,临终前叹道:“我前后行意,于心未曾有所负也。假令死而有灵,子修若问‘我母所在’,我将何辞以答!”', - luyi:'卢弈,游卡桌游《三国杀》中虚构的人物。设定为卢植之女。至情至孝。其人虽体弱多病,然而却天资聪颖,有过目不忘、出口成章之才。先后拜蔡邕、王允等人为师,纳诸家之长融会贯通。又善弈棋,曾与当时国手山子道、王九真、郭凯对弈,不分胜负,一时之间名动京华,被太学征辟为女博士,世人皆称其为“女先生”。董卓之乱后,卢弈随父亲隐居乡野,创办上谷学宫,邀天下士子论道。相传诸葛亮、曹植、荀彧、张昭等人都参加过。各学派在卢弈主持下论道,成为一时佳话。后上谷学宫遭曹魏所忌,卢弈为请求曹叡赦免学宫,与司马懿对无棋之弈。卢弈破指凝血,以血为棋,终胜司马懿半子。但却旧伤复发,局终而陨。', - zhaozhi:'赵直,豫章人,生于公元175年左右,死年不详,字不详。为蜀汉官方占梦者。曾预言蒋琬位极人臣、何祗48岁去世、魏延离死期不远,后果一一应验。', - dongguiren:'董贵人(?—200年),父董承,汉献帝刘协妃嫔之一。董贵人父亲被曹操所杀,自己也受牵连。董贵人虽有身孕,汉献帝数次为她向曹操求情,仍被杀。', - zhujianping: '朱建平(生卒年不详),汉末三国时期沛国(今安徽省)人。精通相术,于街巷之间为人相面,效果非常灵验。三国时,他在街头巷尾给人们看相。曹丕做五官将时,请他看相,朱建平说:将军寿命80,40会有小难,愿您多多保护。 又说曹彪:您居于自己的封国,到57当遭兵灾,要好好提防此事。 结果曹丕40去世,曹彪57岁时,犯了与王凌合谋罪,被赐死。他的妙算,都这么准确,即使是唐举,许负也比不上。时人将他与平原郡相士管公明并称为“朱”、“管”。', - yuanji:'袁氏(生卒年不详),汝南郡汝阳县(今河南商水)人,袁术之女,孙权妃嫔。袁夫人出身世家大族汝南袁氏,其父袁术败亡后,入吴宫拜为夫人,以节操品行着称。', - chengbing:'程秉(生卒年不详),字德枢,汝南南顿(今河南项城西)人。三国时期吴国官员、儒学家。起初跟随郑玄,后来北方荒乱而到交州避难,期间与刘熙考究五经大义,因此通绕五经。后来交趾太守士燮任命程秉为长史。吴大帝孙权听闻程秉的名声,于是以礼征召他,程秉到后,被任命为太子太傅。黄武四年(225年),孙权为太子孙登娶周瑜之女为妃,程秉以太常身份于吴郡迎候,孙权亲身上程秉的船,可见孙权对他的极为礼待。程秉又教诲孙登对婚后相处要尊重儒家礼教。后来因病在任职期间逝世。著有《周易摘》、《尚书驳》、《论语弼》,凡三万余言。', - dc_zhouxuān:'周宣,生卒年不详,字孔和,乐安(治今山东高苑西北)人,擅长解梦,在郡做官时曾为太守解过梦,后又给曹丕解梦,都灵验。官至中郎,死于魏明帝末年。', - xuelingyun:'薛灵芸,东晋王嘉志怪小说《拾遗记》中的人物,魏文帝曹丕的宫人,妙于针工,虽处于深帷之内,不用灯烛之光,裁制立成。凡不是薛灵芸缝制的衣服,文帝一概不穿,宫中号为针神。薛灵芸的故事在正史中虽无记载,却由于许多野史笔记偶尔提及,如《拾遗记》、《太平广记》、《艳异编》等,渐于后世成为中国古代著名美女形象。', - yanghong:'杨弘,东汉末年袁术部将。袁术死后,杨弘等将其众欲归孙策,后庐江太守刘勋截击,转归于勋。', - xielingyu:'谢夫人,会稽山阴(今浙江省绍兴市)人,东汉尚书郎、徐令谢煚之女,吴大帝孙权的原配发妻,又称谢妃。深受孙权宠爱,爱幸有宠。后来孙权为了巩固江东政权,又纳徐氏,欲让谢夫人屈居其下。谢夫人不同意,失志早卒。谢夫人的弟弟是三国著名史学家、武陵太守谢承。豫章太守谢斐与谢夫人同宗同族。', - zerong:'笮融(?—195年),丹杨(治今安徽宣城)人,东汉末年豪强,生性残暴却笃信佛教,为佛教在中国的发展做出了很大贡献。东汉末年投奔徐州刺史陶谦,督管下邳、彭城、广陵三郡运粮。将其中大量物资占为己有累积财力,遂在徐州一带大规模崇佛,修建豪华佛寺,铸造金铜大佛,衣以锦彩,并举行浴佛节,招揽信徒万余人。其崇佛活动奠定了中国大型佛事活动的基础。后又投奔赵昱、薛礼、朱皓并将他们杀害,扬州牧刘繇因此兴兵讨伐笮融。笮融兵败后逃入深山,由于当地山民同样对他恨之入骨,便联手搜捕、杀死笮融,并将他的首级献给刘繇。', - huanfan:'桓范(?~249年),字元则,沛郡龙亢县(今安徽省怀远县龙亢镇)人。三国时期曹魏大臣、文学家、画家。建安末年,担任丞相府掾,联合王象等共同撰写《皇览》。延康元年,担任羽林左监。魏明帝时,历任中领军、尚书,出任征虏将军、东中郎将、兖州刺史等。正始年间,授大司农,为大将军曹爽出谋划策,号称“智囊 ”。高平陵政变(249年)发生后,力劝曹爽挟带皇帝曹芳进入许昌,没有得到采纳,最终被太傅司马懿诛杀。桓范颇有文才,著有《世要论》(《桓范新书》)。善于画画,唐朝张彦远《历代名画记》目为中品。', - sunyu:'孙瑜(177年-215年),字仲异,吴郡富春(今浙江富阳)人,孙坚之弟孙静的次子,孙权的堂兄。官至奋威将军、丹杨太守。孙瑜初以恭义校尉的身份统领士兵,曾跟随周瑜、孙权等人征战,擅于安抚部下、招降纳顺。孙瑜爱读古籍,又请学者马普来为将领官员的子弟讲学,于是东吴开始设立学官。215年,孙瑜去世,时年三十九岁。', - xizheng:'郤正(?-278年),本名郤纂,字令先,司州河南郡偃师县(今河南省偃师市)人,三国蜀汉至西晋时期学者、官员。少好学,广读古籍。弱冠即善写文章,为蜀汉朝廷征为秘书吏,官至秘书令。公元263年(景耀六年),曹魏攻伐蜀汉,后主刘禅投降,郤正为之撰写投降书。后随刘禅前往洛阳,受封关内侯,又得到晋武帝司马炎赏识,任巴西郡太守,公元278年(咸宁四年)去世。郤正为人不重名利,曾作《释讥》,表明自己淡泊之心境;又醉心于文学,共作诗歌、论著、辞赋等近百篇,但多散佚于后世。', - zhangjinyun:'张瑾云,张星彩的妹妹,刘禅的第二任皇后,238年正月立为皇后。景耀六年(263年),蜀汉灭亡,刘禅被俘,此后,受封为安乐公。张皇后也随之成为安乐公夫人,咸熙元年(264年),随刘禅到洛阳。', - duanqiaoxiao:'段巧笑,三国时代魏国魏文帝时的宫人,甚受到魏文帝的宠爱。传说她以原有的化妆品中的米粉和胡粉,再加入葵花子汁,发明了女性化妆用的脂粉。', - ruanji:'阮籍(公元210年~263年),字嗣宗,陈留尉氏(今河南省开封市)人,三国时期魏国诗人、竹林七贤之一。阮瑀之子,门荫入仕,累迁步兵校尉,世称阮步兵。崇奉老庄之学,政治上则采取谨慎避祸的态度。景元四年(公元263年),阮籍去世,享年五十三岁。作为“正始之音”的代表,著有《咏怀八十二首》、《大人先生传》等,其著作收录在《阮籍集》中。', - ganfurenmifuren:'甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
    糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。', - sunlingluan:'孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。', - zhoubuyi:'周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。', - tianshangyi:'田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。', - malingli:'马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。', - zhugeruoxue:'诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。', - zhugemengxue:'诸葛氏(“梦雪”为网络小说虚构),诸葛亮的大姐。', - caoyi:'曹轶,游卡桌游旗下产品《三国杀》原创角色。设定上为曹纯所收养的孙女,从小受到曹纯的教导,在军营中长大,性情坚毅有担当,军事谋略丰富,战斗能力超强。曹轶喜欢美食,特别是甜食,并且擅长制作各种点心。她身边跟随的雪白小老虎是曹纯在她及笄时送的生辰礼物,希望她如小老虎一样,英勇无畏。曹轶与曹婴交好,两人以姐妹相称。曹轶成年后继承祖父衣钵,接手精锐部队“虎豹骑”,成为新的虎豹骑的统领者。', - huzun:'胡遵(?~256年),安定临泾(今甘肃省镇原县)人,三国时期曹魏大臣,官至卫将军,封阴密侯。出身安定胡氏。历任征东将军、征东大将军、卫将军等职。早年由张既征辟。后追随司马懿,参与平定匈奴胡薄居姿职叛乱、抵御诸葛亮北伐、平定公孙渊叛乱。嘉平四年(252年),作为曹魏三征之一的征东将军,主持征讨东吴,被诸葛恪击败。正元元年(255年)参与平定淮南三叛的第二叛毌丘俭、文钦之乱,事后升任卫将军。甘露元年(256年)秋七月己卯去世,追赠车骑将军。', + characterIntro: { + cuimao: "请分别查看「崔琰」和「毛玠」的武将介绍。", + bailingyun: + "柏灵筠,女,是电视剧《大军师司马懿之军师联盟》、《虎啸龙吟》中的主要角色之一,由张钧甯饰演。20岁,是曹丕赏赐司马懿的美人,也是曹丕的眼线,被送入司马府中为妾室。柔弱美貌、心机极深。", + caoxian: + "曹宪(生卒年不详),女,沛国谯县(今安徽省亳州市)人。东汉末年历史人物,汉献帝刘协嫔妃,魏武帝曹操女儿。建安十八年,嫁给汉献帝刘协,受封为贵人。黄初元年(220年),兄弟曹丕称帝后,汉献帝成为山阳公,不知所终。", + zhangjian: + "张臶(136年-240年),字子明,钜鹿人。汉末三国时期隐士、音乐家,精通谶纬之学。张臶生活的年代从东汉一直到曹魏齐王时期,受到朝廷多次征召,一直回避,不愿做官。他活了一百零五岁,是三国时期有可靠记载的最长寿的人之一。", + puyuan: "蒲元是三国时蜀汉杰出的工匠。为诸葛亮造刀三千口,并且制作木牛流马。后来姜维为他写过两部传记《蒲元传》《蒲元别传》。", + guanlu: "管辂(209年-256年),字公明,平原(今山东德州平原县)人。三国时期曹魏术士。年八九岁,便喜仰观星辰。成人后,精通《周易》,善于卜筮、相术,习鸟语,相传每言辄中,出神入化。体性宽大,常以德报怨。正元初,为少府丞。北宋时被追封为平原子。管辂是历史上著名的术士,被后世奉为卜卦观相的祖师。", + gexuan: "葛玄(164年-244年),汉族,吴丹阳郡句容县都乡吉阳里人(今句容市),祖籍山东琅琊,三国著名高道,道教灵宝派祖师。字孝先,号仙翁,被尊称为“葛天师”。道教尊为葛仙翁,又称太极仙翁,与张道陵、许逊、萨守坚共为四大天师。为汉下邳僮侯葛艾后裔,祖葛矩,安平太守,黄门郎;从祖葛弥,豫章第五郡太守。父葛焉,字德儒,州主簿,山阴令,散骑常侍,大尚书。随左慈学道,得《太清丹经》、《黄帝九鼎神丹经》、《金液丹经》等道经。曾采药海山,吴嘉禾二年(233年),在閤皂山修道建庵,筑坛立炉,修炼九转金丹。喜好遨游山川,去过括苍山、南岳山、罗浮山。编撰《灵宝经诰》,精研上清、灵宝等道家真经,并嘱弟子世世箓传。", + wulan: "吴兰(?~218年),青州(今山东潍坊市)人。东汉末年将领。初为益州牧刘璋部将,后来归降刘备。汉中之战中,与马超、张飞各领一军,驻扎于下辩。建安二十三年,为曹操将领曹洪、张郃所败,退回汉中。途中,为阴平氐族首领强端所杀。", + leitong: + "雷铜(?-218年),阴平(今甘肃文县)人,氐族,东汉末年益州名将。本属益州牧刘璋麾下。刘备攻取益州后,归刘备麾下。参加汉中之战,为魏将张郃所杀。", + huaman: "花鬘,古典戏曲《龙凤巾》(一名《化外奇缘》)中的人物,身份为三国时期南蛮王孟获与祝融夫人的女儿,关索的夫人之一。在关于关三小姐·关银屏的民间传说中,其名字为“花中秀”,与关索其他几位夫人鲍三娘、王桃、王悦都被关索之姐关银屏编入自己的女兵营中。花鬘在《三国志》,《三国演义》均未有提及,只是戏曲中的虚构人物。其形象并非一般君主家中闺秀,而是与其母祝融相似,是一个可以披甲上阵,善于刀枪作战的女武将。戏曲中在诸葛亮平定南蛮时,花鬘曾与关索作战,失败被俘,两人互生爱意,南蛮王孟获降服后二人成婚。近些年,花鬘接连在各类三国题材的游戏中登场,更广被人知晓。", + wangshuang: + "王双(?-228年),三国时期曹魏将领。蜀汉建兴六年(228年)冬,诸葛亮出散关,攻陈仓,后粮尽而退。王双率领骑兵追击蜀军,但在与蜀军的交战中被击败,王双也被蜀军所斩。在《三国演义》中,王双字子全,是陇西郡狄道县(今甘肃临洮县)人,有万夫不当之勇。在诸葛亮北伐期间,被魏延所斩。", + wenyang: + "文俶(238年—291年),一作文淑,字次骞,小名阿鸯,世称文鸯,谯郡(今安徽亳州市)人。魏末晋初名将,曹魏扬州刺史文钦之子。骁勇善战,依附大将军曹爽,效忠于王室。司马师废黜皇帝曹芳后,随父联合毌丘俭于淮南起兵勤王。兵败之后,向南投奔吴国。诸葛诞发动淮南叛乱,奉命率军驰援。双方发生内讧,父亲为诸葛诞所害,遂降于司马昭,封关内侯。西晋建立后,任平虏护军。咸宁三年(277年),拜平西将军、都督凉秦雍州三州军事,大破鲜卑首领秃发树机能,名震天下,迁使持节、护东夷校尉、监辽东军事。八王之乱中,为诸葛诞外孙、东安王司马繇所诬杀,惨遭灭族,时年五十四岁。", + liubian: + "刘辩(176年-190年3月6日),是汉灵帝刘宏与何皇后的嫡长子。刘辩在灵帝驾崩后继位为帝,史称少帝,由于年幼,实权掌握在临朝称制的母亲何太后和母舅大将军何进手中。少帝在位时期,东汉政权已经名存实亡,他即位后不久即遭遇以何进为首的外戚集团和以十常侍为首的内廷宦官集团这两大敌对政治集团的火并,被迫出宫,回宫后又受制于以“勤王”为名进京的凉州军阀董卓,终于被废为弘农王,成为东汉唯一被废黜的皇帝,其同父异母弟陈留王刘协继位为帝,是为汉献帝。被废黜一年之后,刘辩在董卓胁迫下自尽,时年仅十五岁(一说十八岁),其弟献帝追谥他为怀王。中国古代的史书中称刘辩为皇子辩、少帝和弘农王等。因为在位不逾年,传统上称东汉共十二帝,刘辩与东汉另一位少帝刘懿都不在其中,亦皆无本纪;不过,现代史学界也有观点承认两位少帝均是汉朝皇帝,则刘辩为东汉第十三位皇帝。", + guozhao: + "郭照,电视剧《军师联盟》中的女主角之一,由唐艺昕饰演。原型为文德皇后郭氏(字女王),魏国皇后,张春华的义妹,深爱曹丕,替甄宓抚育曹叡,因甄宓之死被曹叡记恨,曹丕死后,成为皇太后,被曹叡逼上死路。自尽身亡。", + fanyufeng: + "樊夫人,东汉末年人物,昔桂阳太守赵范寡嫂。赵云随刘备平定江南四郡后,刘备以赵云为桂阳太守。赵范居心叵测,要将自己的嫂嫂樊氏嫁给赵云,但遭到赵云的拒绝。后来,赵范逃走,樊氏也下落不明。2001年,应日本日中青少年文化中心成立50周年之邀,北京京剧院赴日进行40场巡回演出,这次访日的剧目都不同程度地进行了加工改编,以符合日本观众的需求。《取桂阳》是根据老本重新排演的,叶金援饰赵云,王怡饰樊玉凤。剧中的樊玉凤成为文武双全的巾帼英雄,被赵云收降,后来在《龙凤呈祥》中也参与堵截东吴的追兵。", + ruanyu: "阮瑀(约165—212年),字元瑜,陈留尉氏(今河南开封市尉氏县)人,是东汉末年文学家,建安七子之一。阮瑀所作章表书记很出色,当时军国书檄文字,多为阮瑀与陈琳所拟。名作有《为曹公作书与孙权》。诗有《驾出北郭门行》,描写孤儿受后母虐待的苦难遭遇,比较生动形象。年轻时曾受学于蔡邕,蔡邕称他为“奇才”。后徙为丞相仓曹掾属。诗歌语言朴素,往往能反映出一般的社会问题。阮瑀的音乐修养颇高,他的儿子阮籍,孙子阮咸皆当时名人,位列“竹林七贤”,妙于音律。明人辑有《阮元瑜集》。", + yangwan: + "杨氏(婉字出自小说,史书无记载),生卒年不详,东汉末年凉州人。早年嫁于东汉前将军、槐里侯马腾之子马超,追随马超转战并州、雍州、凉州,为马超生下子嗣。公元212年,马超联军在渭南战败后,杨婉随马超逃亡凉州,很快马超反攻吞并陇上诸郡县。公元213年,杨婉为了帮助马超,结识王异,了解马超这些投降部下。可惜被王异蛊惑,遭致马超大败。自己和孩子都被赵衢、梁宽杀害。", + zhouyi: "周夷,游卡桌游旗下产品《三国杀》自行杜撰的人物。设定为周瑜的妹妹,和周瑜一同征战。", + caojinyu: + "金乡公主,本姓曹氏,名字不详,沛国谯县(今安徽省亳州市)人。魏武帝曹操的女儿,母为杜夫人。适婚的时候,嫁给曹操的养子何晏。高平陵之变,何晏作为大将军曹爽的党羽,遭到太傅司马懿处死。在何晏母亲尹夫人苦苦哀求下,何晏的儿子得以保全。", + wufan: "吴范(?-226年),字文则,会稽上虞(今浙江绍兴上虞区)人。三国时期孙吴官员,擅长术数。与刘惇、赵达、严武、曹不兴、皇象、宋寿和郑妪合称“吴中八绝”。吴范以推算天象节气和观察气候闻名于郡中。孙权起于东南,他委身事奉,每推算灾祥多应验,遂显名。孙权委以骑都尉,领太史令。初,孙权为将军时,他曾说江南有王气。及孙权立为吴王,论功行封,欲以为都亭侯,但因不愿将其术要诀告知孙权,为权所怨恨,被除名。黄武中,病死。", + caomao: "曹髦(241年11月15日-260年6月2日),字彦士,沛国谯县(今安徽省亳州市)人,魏文帝曹丕之孙,东海王曹霖之子,曹魏第四位皇帝(254年11月1日-260年6月2日)。正始二年(241年),生于东海王宫,自幼聪明好学,才慧早成,正始五年(244年),封为高贵乡公,嘉平六年(254年),大将军司马师废除齐王曹芳后,拥立为帝,年号正元,曹髦文才武略,崇拜少康,不满司马氏专权秉政,甘露五年(260年),亲自讨伐司马昭,为太子舍人成济所弑,年仅十九岁,以王礼葬于洛阳西北。曹髦擅长诗文,创制了九言诗,传世文章有《伤魂赋并序》《颜子论》等。爱好儒学,亲赴太学论道,著有《春秋左氏传音》(失传)。精通绘画,一说为中国第一位成为画家的皇帝,唐张彦远《历代名画记》目曹髦为中品。", + laiyinger: + "来莺儿,是个传说中的人物,正史及古代典籍并无记载。相传来莺儿是东汉歌妓,建安年间洛阳名妓,后爱上曹操的侍卫王图,王图因延误军机而押赴刑场,当时来莺儿奋不顾身以己命换王图一死。新编古装潮剧《曹营恋歌》,秦腔《雀台歌女》讲述了歌女来莺儿与情人王图及曹操三人之间催人泪下的故事。", + caohua: "曹华,东汉末年人物,曹操之女,为汉献帝妃嫔。建安十八年(213年),曹操进为魏公,把曹宪、曹节、曹华三个女儿,一齐都送给汉献帝刘协做了妃子,皆封为夫人,聘以束帛五万匹,年龄尚小者在魏公国待年长而聘。", + zhaoang: + "赵昂,字伟章(一作伟璋),天水冀人。汉末时曹操部下。初为羌道令,建安中转参军事徒居州治冀城。建安十八年,马超围冀城多天,城中饥困,凉州刺史韦康不愿百姓再受苦而打算投降,赵昂进劝但不为所纳。后马超背信弃义杀韦康并劫其子赵月为人质,把他送至南郑。欲以此要迫使赵昂为己所用。后与梁宽、赵衢、庞恭、杨阜等结谋为康报仇,并举兵讨伐马超。马超兵败遂弃城,投奔张鲁。得张鲁之援后马超于建安十九年复寇,赵昂与妻子王异坚守祁山三十天至夏侯渊的救兵解围,其子赵月终为马超斩杀。自冀城之难,至于祁山,赵昂出九奇策。", + liuhui: "刘徽(约225年—约295年),汉族,山东滨州邹平市人,魏晋期间伟大的数学家,中国古典数学理论的奠基人之一。在中国数学史上作出了极大的贡献,他的杰作《九章算术注》和《海岛算经》,是中国最宝贵的数学遗产。刘徽思想敏捷,方法灵活,既提倡推理又主张直观。他是中国最早明确主张用逻辑推理的方式来论证数学命题的人。刘徽的一生是为数学刻苦探求的一生。他虽然地位低下,但人格高尚。他不是沽名钓誉的庸人,而是学而不厌的伟人,他给我们中华民族留下了宝贵的财富。2021年5月,国际天文学联合会(IAU)批准中国在嫦娥五号降落地点附近月球地貌的命名,刘徽(liuhui)为八个地貌地名之一。", + zhangfen: + "张奋,徐州彭城(今江苏徐州)人。三国时期孙吴将领,辅吴将军张昭的侄子。善于制作攻城器械。在步骘举荐下,担任将军,累迁平州都督,册封乐乡亭侯,病逝于任上。", + dukui: "杜夔,字公良,河南人,擅长音律,聪明过人。管弦等各种乐器,他无所不能。他长期总管歌舞音乐,精心研究,继承复兴了前代古乐,并有所创新。仕于曹操、曹丕之世,以通晓音乐称于世。早年任雅乐郎,汉中平五年(188年),因病离职。州郡的司徒以礼相请,他因时世混乱而奔荆州。荆州牧刘表的儿子刘琮投降曹操后,曹操以杜夔为军谋祭酒 ,参与太乐署之事,令他创制雅乐。魏文帝曹丕黄初年间,任太乐令、协律都尉。", + quanhuijie: + "全皇后(244年-301年),吴郡钱塘(今浙江杭州)人,吴废帝孙亮的皇后,全尚之女,母孙恭之女。吴大帝长女全公主的侄孙女。赤乌十三年(250年),因全公主推荐全氏被册为孙亮的太子妃,建兴二年(253年),全氏被立为皇后。太平三年(258年),孙亮被权臣孙綝贬为会稽王,全皇后也一同贬为会稽王夫人。永安三年(260年),全皇后随夫到侯官,孙亮在途中死去,全皇后在侯官居住二十余年,吴亡后返回吴郡,永宁元年(301年)去世。", + dingshangwan: + "丁尚涴,又名丁夫人。东汉末年权臣曹操的原配夫人。丁尚涴嫁给曹操时,曹操另有刘夫人,生长子曹昂和清河长公主。后刘夫人早亡,曹昂便由丁尚涴抚养,丁尚涴视其为己出。
    建安二年(公元197年),曹昂随军出征宛城,战死沙场。丁尚涴悲痛欲绝,口出怨言数落曹操,又悲啼不止。曹操恼羞成怒,将其打发回了娘家。不久之后,心生悔意的曹操亲自前往丁家,打算将丁尚涴接回。然而丁尚涴却只是闷头织布。曹操手抚其背,说:“顾我共载归乎!”丁尚涴依旧不理不睬。曹操走到门口,又回过头:“得无尚可邪!”然而依旧得不到回应,只得感叹:“真诀矣。”于是与之和离,并让丁家允许她改嫁,丁家不敢为之。
    丁尚涴去世后,卞夫人请求曹操安葬她,于是葬在许城以南。后来曹操病重,知道自己时日无多,临终前叹道:“我前后行意,于心未曾有所负也。假令死而有灵,子修若问‘我母所在’,我将何辞以答!”", + luyi: "卢弈,游卡桌游《三国杀》中虚构的人物。设定为卢植之女。至情至孝。其人虽体弱多病,然而却天资聪颖,有过目不忘、出口成章之才。先后拜蔡邕、王允等人为师,纳诸家之长融会贯通。又善弈棋,曾与当时国手山子道、王九真、郭凯对弈,不分胜负,一时之间名动京华,被太学征辟为女博士,世人皆称其为“女先生”。董卓之乱后,卢弈随父亲隐居乡野,创办上谷学宫,邀天下士子论道。相传诸葛亮、曹植、荀彧、张昭等人都参加过。各学派在卢弈主持下论道,成为一时佳话。后上谷学宫遭曹魏所忌,卢弈为请求曹叡赦免学宫,与司马懿对无棋之弈。卢弈破指凝血,以血为棋,终胜司马懿半子。但却旧伤复发,局终而陨。", + zhaozhi: + "赵直,豫章人,生于公元175年左右,死年不详,字不详。为蜀汉官方占梦者。曾预言蒋琬位极人臣、何祗48岁去世、魏延离死期不远,后果一一应验。", + dongguiren: + "董贵人(?—200年),父董承,汉献帝刘协妃嫔之一。董贵人父亲被曹操所杀,自己也受牵连。董贵人虽有身孕,汉献帝数次为她向曹操求情,仍被杀。", + zhujianping: + "朱建平(生卒年不详),汉末三国时期沛国(今安徽省)人。精通相术,于街巷之间为人相面,效果非常灵验。三国时,他在街头巷尾给人们看相。曹丕做五官将时,请他看相,朱建平说:将军寿命80,40会有小难,愿您多多保护。 又说曹彪:您居于自己的封国,到57当遭兵灾,要好好提防此事。 结果曹丕40去世,曹彪57岁时,犯了与王凌合谋罪,被赐死。他的妙算,都这么准确,即使是唐举,许负也比不上。时人将他与平原郡相士管公明并称为“朱”、“管”。", + yuanji: "袁氏(生卒年不详),汝南郡汝阳县(今河南商水)人,袁术之女,孙权妃嫔。袁夫人出身世家大族汝南袁氏,其父袁术败亡后,入吴宫拜为夫人,以节操品行着称。", + chengbing: + "程秉(生卒年不详),字德枢,汝南南顿(今河南项城西)人。三国时期吴国官员、儒学家。起初跟随郑玄,后来北方荒乱而到交州避难,期间与刘熙考究五经大义,因此通绕五经。后来交趾太守士燮任命程秉为长史。吴大帝孙权听闻程秉的名声,于是以礼征召他,程秉到后,被任命为太子太傅。黄武四年(225年),孙权为太子孙登娶周瑜之女为妃,程秉以太常身份于吴郡迎候,孙权亲身上程秉的船,可见孙权对他的极为礼待。程秉又教诲孙登对婚后相处要尊重儒家礼教。后来因病在任职期间逝世。著有《周易摘》、《尚书驳》、《论语弼》,凡三万余言。", + dc_zhouxuān: + "周宣,生卒年不详,字孔和,乐安(治今山东高苑西北)人,擅长解梦,在郡做官时曾为太守解过梦,后又给曹丕解梦,都灵验。官至中郎,死于魏明帝末年。", + xuelingyun: + "薛灵芸,东晋王嘉志怪小说《拾遗记》中的人物,魏文帝曹丕的宫人,妙于针工,虽处于深帷之内,不用灯烛之光,裁制立成。凡不是薛灵芸缝制的衣服,文帝一概不穿,宫中号为针神。薛灵芸的故事在正史中虽无记载,却由于许多野史笔记偶尔提及,如《拾遗记》、《太平广记》、《艳异编》等,渐于后世成为中国古代著名美女形象。", + yanghong: + "杨弘,东汉末年袁术部将。袁术死后,杨弘等将其众欲归孙策,后庐江太守刘勋截击,转归于勋。", + xielingyu: + "谢夫人,会稽山阴(今浙江省绍兴市)人,东汉尚书郎、徐令谢煚之女,吴大帝孙权的原配发妻,又称谢妃。深受孙权宠爱,爱幸有宠。后来孙权为了巩固江东政权,又纳徐氏,欲让谢夫人屈居其下。谢夫人不同意,失志早卒。谢夫人的弟弟是三国著名史学家、武陵太守谢承。豫章太守谢斐与谢夫人同宗同族。", + zerong: "笮融(?—195年),丹杨(治今安徽宣城)人,东汉末年豪强,生性残暴却笃信佛教,为佛教在中国的发展做出了很大贡献。东汉末年投奔徐州刺史陶谦,督管下邳、彭城、广陵三郡运粮。将其中大量物资占为己有累积财力,遂在徐州一带大规模崇佛,修建豪华佛寺,铸造金铜大佛,衣以锦彩,并举行浴佛节,招揽信徒万余人。其崇佛活动奠定了中国大型佛事活动的基础。后又投奔赵昱、薛礼、朱皓并将他们杀害,扬州牧刘繇因此兴兵讨伐笮融。笮融兵败后逃入深山,由于当地山民同样对他恨之入骨,便联手搜捕、杀死笮融,并将他的首级献给刘繇。", + huanfan: + "桓范(?~249年),字元则,沛郡龙亢县(今安徽省怀远县龙亢镇)人。三国时期曹魏大臣、文学家、画家。建安末年,担任丞相府掾,联合王象等共同撰写《皇览》。延康元年,担任羽林左监。魏明帝时,历任中领军、尚书,出任征虏将军、东中郎将、兖州刺史等。正始年间,授大司农,为大将军曹爽出谋划策,号称“智囊 ”。高平陵政变(249年)发生后,力劝曹爽挟带皇帝曹芳进入许昌,没有得到采纳,最终被太傅司马懿诛杀。桓范颇有文才,著有《世要论》(《桓范新书》)。善于画画,唐朝张彦远《历代名画记》目为中品。", + sunyu: "孙瑜(177年-215年),字仲异,吴郡富春(今浙江富阳)人,孙坚之弟孙静的次子,孙权的堂兄。官至奋威将军、丹杨太守。孙瑜初以恭义校尉的身份统领士兵,曾跟随周瑜、孙权等人征战,擅于安抚部下、招降纳顺。孙瑜爱读古籍,又请学者马普来为将领官员的子弟讲学,于是东吴开始设立学官。215年,孙瑜去世,时年三十九岁。", + xizheng: + "郤正(?-278年),本名郤纂,字令先,司州河南郡偃师县(今河南省偃师市)人,三国蜀汉至西晋时期学者、官员。少好学,广读古籍。弱冠即善写文章,为蜀汉朝廷征为秘书吏,官至秘书令。公元263年(景耀六年),曹魏攻伐蜀汉,后主刘禅投降,郤正为之撰写投降书。后随刘禅前往洛阳,受封关内侯,又得到晋武帝司马炎赏识,任巴西郡太守,公元278年(咸宁四年)去世。郤正为人不重名利,曾作《释讥》,表明自己淡泊之心境;又醉心于文学,共作诗歌、论著、辞赋等近百篇,但多散佚于后世。", + zhangjinyun: + "张瑾云,张星彩的妹妹,刘禅的第二任皇后,238年正月立为皇后。景耀六年(263年),蜀汉灭亡,刘禅被俘,此后,受封为安乐公。张皇后也随之成为安乐公夫人,咸熙元年(264年),随刘禅到洛阳。", + duanqiaoxiao: + "段巧笑,三国时代魏国魏文帝时的宫人,甚受到魏文帝的宠爱。传说她以原有的化妆品中的米粉和胡粉,再加入葵花子汁,发明了女性化妆用的脂粉。", + ruanji: "阮籍(公元210年~263年),字嗣宗,陈留尉氏(今河南省开封市)人,三国时期魏国诗人、竹林七贤之一。阮瑀之子,门荫入仕,累迁步兵校尉,世称阮步兵。崇奉老庄之学,政治上则采取谨慎避祸的态度。景元四年(公元263年),阮籍去世,享年五十三岁。作为“正始之音”的代表,著有《咏怀八十二首》、《大人先生传》等,其著作收录在《阮籍集》中。", + ganfurenmifuren: + "甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
    糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。", + sunlingluan: + "孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。", + zhoubuyi: + "周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。", + tianshangyi: + "田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。", + malingli: + "马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。", + zhugeruoxue: "诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。", + zhugemengxue: "诸葛氏(“梦雪”为网络小说虚构),诸葛亮的大姐。", + caoyi: "曹轶,游卡桌游旗下产品《三国杀》原创角色。设定上为曹纯所收养的孙女,从小受到曹纯的教导,在军营中长大,性情坚毅有担当,军事谋略丰富,战斗能力超强。曹轶喜欢美食,特别是甜食,并且擅长制作各种点心。她身边跟随的雪白小老虎是曹纯在她及笄时送的生辰礼物,希望她如小老虎一样,英勇无畏。曹轶与曹婴交好,两人以姐妹相称。曹轶成年后继承祖父衣钵,接手精锐部队“虎豹骑”,成为新的虎豹骑的统领者。", + huzun: "胡遵(?~256年),安定临泾(今甘肃省镇原县)人,三国时期曹魏大臣,官至卫将军,封阴密侯。出身安定胡氏。历任征东将军、征东大将军、卫将军等职。早年由张既征辟。后追随司马懿,参与平定匈奴胡薄居姿职叛乱、抵御诸葛亮北伐、平定公孙渊叛乱。嘉平四年(252年),作为曹魏三征之一的征东将军,主持征讨东吴,被诸葛恪击败。正元元年(255年)参与平定淮南三叛的第二叛毌丘俭、文钦之乱,事后升任卫将军。甘露元年(256年)秋七月己卯去世,追赠车骑将军。", }, - characterTitle:{ + characterTitle: { // wulan:'#b对决限定武将', // leitong:'#b对决限定武将', }, - perfectPair:{}, - characterFilter:{ + perfectPair: {}, + characterFilter: { // leitong:function(mode){ // return mode!='identity'&&mode!='guozhan'; // }, @@ -15136,705 +18749,964 @@ game.import('character', function () { // return mode!='identity'&&mode!='guozhan'; // }, }, - dynamicTranslate:{ - xinlvli:function(player){ - var str='每回合限一次'; - if(player.storage.choujue) str+='(自己的回合内则改为限两次)'; - str+=',当你造成'; - if(player.storage.beishui) str+='或受到'; - str+='伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。'; + dynamicTranslate: { + xinlvli: function (player) { + var str = "每回合限一次"; + if (player.storage.choujue) str += "(自己的回合内则改为限两次)"; + str += ",当你造成"; + if (player.storage.beishui) str += "或受到"; + str += + "伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。"; return str; }, - lvli:function(player){ - var str='每名角色的回合限一次'; - if(player.storage.choujue) str+='(自己的回合内则改为限两次)'; - str+=',你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)'; - if(player.storage.beishui) str+='。当你受到伤害后,你也可以以此法使用一张牌。'; + lvli: function (player) { + var str = "每名角色的回合限一次"; + if (player.storage.choujue) str += "(自己的回合内则改为限两次)"; + str += + ",你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)"; + if (player.storage.beishui) str += "。当你受到伤害后,你也可以以此法使用一张牌。"; return str; }, - rezhongjian:function(player){ - return '出牌阶段限'+(player.hasSkill('recaishi2')?'两':'一')+'次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。' + rezhongjian: function (player) { + return ( + "出牌阶段限" + + (player.hasSkill("recaishi2") ? "两" : "一") + + "次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。" + ); }, - bazhan:function(player){ - if(player.storage.bazhan) return '转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到此牌的角色执行一项:①回复1点体力。②复原武将牌。'; + bazhan: function (player) { + if (player.storage.bazhan) + return '转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到此牌的角色执行一项:①回复1点体力。②复原武将牌。'; return '转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到此牌的角色执行一项:①回复1点体力。②复原武将牌。'; }, - zhiren:function(player){ - return '当你于'+(player.hasSkill('yaner_zhiren')?'一':'你的')+'回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)'; + zhiren: function (player) { + return ( + "当你于" + + (player.hasSkill("yaner_zhiren") ? "一" : "你的") + + "回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)" + ); }, - yuqi:function(player){ - var info=lib.skill.yuqi.getInfo(player); - return '每回合限两次。当有角色受到伤害后,若你至其的距离不大于'+info[0]+',则你可以观看牌堆顶的'+info[1]+'张牌。你将其中至多'+info[2]+'张牌交给受伤角色,然后可以获得剩余牌中的至多'+info[3]+'张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)'; + yuqi: function (player) { + var info = lib.skill.yuqi.getInfo(player); + return ( + "每回合限两次。当有角色受到伤害后,若你至其的距离不大于" + + info[0] + + ",则你可以观看牌堆顶的" + + info[1] + + "张牌。你将其中至多" + + info[2] + + "张牌交给受伤角色,然后可以获得剩余牌中的至多" + + info[3] + + "张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)" + ); }, - caiyi:function(player){ - var current=player.storage.caiyi,list=player.storage.caiyi_info||[[],[]]; - var str='转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。'; - var list1=['⒈回复X点体力。','⒉摸X张牌。','⒊复原武将牌。','⒋随机执行一个已经移除过的阴选项;'],list2=['⒈受到X点伤害。','⒉弃置X张牌。','⒊翻面并横置。','⒋随机执行一个已经移除过的阳选项。'],str1='阴:',str2='阳:'; - for(var i=0;i<4;i++){ - var clip1=list1[i],clip2=list2[i]; - if(list[0].includes(i)) clip1=(''+clip1+''); - if(list[1].includes(i)) clip2=(''+clip2+''); - str1+=clip1; - str2+=clip2; + caiyi: function (player) { + var current = player.storage.caiyi, + list = player.storage.caiyi_info || [[], []]; + var str = "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。"; + var list1 = [ + "⒈回复X点体力。", + "⒉摸X张牌。", + "⒊复原武将牌。", + "⒋随机执行一个已经移除过的阴选项;", + ], + list2 = [ + "⒈受到X点伤害。", + "⒉弃置X张牌。", + "⒊翻面并横置。", + "⒋随机执行一个已经移除过的阳选项。", + ], + str1 = "阴:", + str2 = "阳:"; + for (var i = 0; i < 4; i++) { + var clip1 = list1[i], + clip2 = list2[i]; + if (list[0].includes(i)) + clip1 = '' + clip1 + ""; + if (list[1].includes(i)) + clip2 = '' + clip2 + ""; + str1 += clip1; + str2 += clip2; } - if(current) str2=(''+str2+''); - else str1=(''+str1+''); - return str+str1+str2+'(X为该阴阳态剩余选项的数量)。'; + if (current) str2 = '' + str2 + ""; + else str1 = '' + str1 + ""; + return str + str1 + str2 + "(X为该阴阳态剩余选项的数量)。"; }, - dchuishu:function(player){ - var list=lib.skill.dchuishu.getList(player); - return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。'; + dchuishu: function (player) { + var list = lib.skill.dchuishu.getList(player); + return ( + "摸牌阶段结束时,你可以摸[" + + list[0] + + "]张牌。若如此做:你弃置[" + + list[1] + + "]张手牌,且当你于本回合内弃置第[" + + list[2] + + "]+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。" + ); }, - dcshoutan:function(player){ - if(player.storage.dcshoutan) return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。'; + dcshoutan: function (player) { + if (player.storage.dcshoutan) + return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。'; return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。'; }, - dcluochong:function(player){ - return '一轮游戏开始时,你可以弃置任意名角色区域里的共计至多['+(4-player.countMark('dcluochong'))+']张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。'; + dcluochong: function (player) { + return ( + "一轮游戏开始时,你可以弃置任意名角色区域里的共计至多[" + + (4 - player.countMark("dcluochong")) + + "]张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。" + ); }, - dczhangcai:function(player){ - return '当你使用或打出'+(player.hasSkill('dczhangcai_all')?'':'点数为8的')+'牌时,你可以摸X张牌(X为你手牌区里'+(player.hasSkill('dczhangcai_all')?'与此牌点数相同':'点数为8')+'的牌数且至少为1)。'; + dczhangcai: function (player) { + return ( + "当你使用或打出" + + (player.hasSkill("dczhangcai_all") ? "" : "点数为8的") + + "牌时,你可以摸X张牌(X为你手牌区里" + + (player.hasSkill("dczhangcai_all") ? "与此牌点数相同" : "点数为8") + + "的牌数且至少为1)。" + ); }, - dcsbmengmou:function(player){ - var storage=player.storage.dcsbmengmou; - var str='转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:'; - if(!storage) str+=''; - str+='阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;'; - if(!storage) str+=''; - if(storage) str+=''; - str+='阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。'; - if(storage) str+=''; - str+='(X为你的体力上限,Y为X-其打出【杀】数)'; + dcsbmengmou: function (player) { + var storage = player.storage.dcsbmengmou; + var str = "转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:"; + if (!storage) str += ''; + str += "阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;"; + if (!storage) str += ""; + if (storage) str += ''; + str += "阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。"; + if (storage) str += ""; + str += "(X为你的体力上限,Y为X-其打出【杀】数)"; return str; }, - dcsbyingmou:function(player){ - var storage=player.storage.dcsbyingmou; - var str='转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:'; - if(!storage) str+=''; - str+='阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;'; - if(!storage) str+=''; - if(storage) str+=''; - str+='阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。'; - if(storage) str+=''; + dcsbyingmou: function (player) { + var storage = player.storage.dcsbyingmou; + var str = "转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:"; + if (!storage) str += ''; + str += "阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;"; + if (!storage) str += ""; + if (storage) str += ''; + str += + "阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。"; + if (storage) str += ""; return str; }, - dcsbquanmou:function(player){ - if(player.storage.dcsbquanmou) return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。'; + dcsbquanmou: function (player) { + if (player.storage.dcsbquanmou) + return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。'; return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。'; - } + }, }, - characterReplace:{ - wenyang:['wenyang','db_wenyang','diy_wenyang'], - gexuan:['gexuan','tw_gexuan'], - panshu:['panshu','re_panshu'], - yangwan:['yangwan','sp_yangwan'], - sunyi:['re_sunyi','sunyi','tw_sunyi'], - fengfangnv:['fengfangnv','re_fengfangnv'], - luotong:['dc_luotong','luotong'], - dc_wangchang:['dc_wangchang','tw_wangchang'], - guozhao:['guozhao','xin_guozhao','jsrg_guozhao'], - dingshangwan:['dingshangwan','ol_dingshangwan'], - qinghegongzhu:['qinghegongzhu','dc_qinghegongzhu'], - caofang:['caofang','jsrg_caofang'], - caomao:['caomao','mb_caomao'], - sp_zhenji:['sp_zhenji','jsrg_zhenji'], + characterReplace: { + wenyang: ["wenyang", "db_wenyang", "diy_wenyang"], + gexuan: ["gexuan", "tw_gexuan"], + panshu: ["panshu", "re_panshu"], + yangwan: ["yangwan", "sp_yangwan"], + sunyi: ["re_sunyi", "sunyi", "tw_sunyi"], + fengfangnv: ["fengfangnv", "re_fengfangnv"], + luotong: ["dc_luotong", "luotong"], + dc_wangchang: ["dc_wangchang", "tw_wangchang"], + guozhao: ["guozhao", "xin_guozhao", "jsrg_guozhao"], + dingshangwan: ["dingshangwan", "ol_dingshangwan"], + qinghegongzhu: ["qinghegongzhu", "dc_qinghegongzhu"], + caofang: ["caofang", "jsrg_caofang"], + caomao: ["caomao", "mb_caomao"], + sp_zhenji: ["sp_zhenji", "jsrg_zhenji"], }, - translate:{ - puyuan:'蒲元', - pytianjiang:'天匠', - pytianjiang_info:'游戏开始时,你随机获得两张不同副类别的装备牌,并置入你的装备区。出牌阶段,你可以将装备区的牌移动至其他角色的装备区(可替换原装备)。若你以此法移动了〖铸刃〗的衍生装备,你摸两张牌。', - pytianjiang_move:'天匠', - pyzhuren:'铸刃', - pyzhuren_info:'出牌阶段限一次,你可以弃置一张手牌。根据此牌的花色点数,你有一定概率打造成功并获得一张武器牌(若打造失败或武器已有则改为摸一张【杀】,花色决定武器名称,点数决定成功率)。此武器牌进入弃牌堆时,将其移出游戏。', - pyzhuren_destroy:'铸刃', - pyzhuren_heart:'红缎枪', - pyzhuren_heart_info:'每回合限一次,当你使用【杀】造成伤害后,你可以进行判定,若结果为:红色,你回复1点体力;黑色:你摸两张牌。', - pyzhuren_diamond:'烈淬刀', - pyzhuren_diamond_info:'每回合限两次,当你使用【杀】对目标角色造成伤害时,你可以弃置一张牌,令此伤害+1。你使用【杀】的次数上限+1。', - pyzhuren_club:'水波剑', - pyzhuren_club_info:'每回合限两次,当你使用普通锦囊牌或【杀】时,你可以为此牌增加一个目标。当你失去装备区里的【水波剑】后,你回复1点体力。', - pyzhuren_spade:'混毒弯匕', - pyzhuren_spade_info:'当你使用【杀】指定目标后,你可令其失去X点体力(X为此技能本回合内发动过的次数且至多为5)。', - pyzhuren_shandian:'天雷刃', - pyzhuren_shandian_info:'当你使用【杀】指定目标后,可令其进行判定,若结果为:黑桃,其受到3点雷属性伤害;梅花,其受到1点雷属性伤害,你回复1点体力并摸一张牌。', - guanlu:'管辂', - tuiyan:'推演', - tuiyan_info:'出牌阶段开始时,你可以观看牌堆顶的三张牌。', - busuan:'卜算', - busuan_info:'出牌阶段限一次,你可以选择一名其他角色,然后选择至多两张不同的卡牌名称(限基本牌或锦囊牌)。该角色下次摸牌阶段摸牌时,改为从牌堆或弃牌堆中获得你选择的牌。', - busuan_angelbeats:'卜算', - mingjie:'命戒', - mingjie_info:'结束阶段,你可以摸一张牌,若此牌为红色,你可以重复此流程直到摸到黑色牌或摸到第三张牌。当你以此法摸到黑色牌时,若你的体力值大于1,则你失去1点体力。', - gexuan:'葛玄', - gxlianhua:'炼化', - gxlianhua_info:'你的回合外,每当有其他角色受到伤害后,你获得一个“丹血”标记(该角色与你阵营一致时为红色,不一致为黑色,此颜色对所有玩家均不可见)直到你的准备阶段开始。准备阶段,根据你获得的“丹血”标记的数量和颜色,你从牌堆/弃牌堆中获得相应的牌以及相应技能直到回合结束。3枚或以下:〖英姿〗和【桃】;超过3枚且红色“丹血”较多:〖观星〗和【无中生有】;超过3枚且黑色“丹血”较多:〖直言〗和【顺手牵羊】;超过3枚且红色和黑色一样多:【杀】、【决斗】和〖攻心〗。', - zhafu:'札符', - zhafu_info:'限定技,出牌阶段,你可以选择一名其他角色,令其获得一枚「札」。有「札」的角色弃牌阶段开始时,若其手牌数大于1,其移去「札」并选择保留一张手牌,然后将其余的手牌交给你。', - leitong:'雷铜', - kuiji:'溃击', - kuiji_info:'出牌阶段限一次。你可以将一张黑色基本牌当作【兵粮寸断】置于你的判定区,然后摸一张牌。若如此做,你可以对体力值最多的一名对手造成2点伤害。对手因此进入濒死状态时,你或队友体力值最少的一方回复1点体力。', - kuiji_info_identity:'出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。', - kuiji_info_guozhan:'出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。', - wulan:'吴兰', - wlcuorui:'挫锐', - wlcuorui_info:'出牌阶段开始时,你可以弃置你或队友区域里的一张牌。若如此做,你选择一项:1.弃置对手装备区里至多两张与此牌颜色相同的牌;2.展示对手的共计两张手牌,然后获得其中与此牌颜色相同的牌。', - wlcuorui_info_identity:'出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。', - wlcuorui_info_guozhan:'出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。', - huaman:'花鬘', - manyi:'蛮裔', - manyi_info:'锁定技,【南蛮入侵】对你无效。', - manyi_info_single_normal:'锁定技,【南蛮入侵】对你无效。当你登场时,你可以视为使用一张【南蛮入侵】。', - mansi_viewas:'蛮嗣', - mansi:'蛮嗣', - mansi_info:'出牌阶段限一次,你可以将所有手牌当做【南蛮入侵】使用;当有角色受到【南蛮入侵】的伤害后,你摸一张牌。', - souying:'薮影', - souying_info:'每回合限一次,当你对其他角色(或其他角色对你)使用【杀】或普通锦囊牌指定唯一目标后,若此牌不是本回合你对其(或其对你)使用的第一张【杀】或普通锦囊牌,你可以弃置一张牌,获得此牌对应的所有实体牌(或令此牌对你无效)。', - zhanyuan:'战缘', - zhanyuan_info:'觉醒技,准备阶段,若你已因蛮嗣累计获得超过七张牌,你加1点体力上限并回复1点体力,并可以选择一名男性角色,你与其获得技能〖系力〗,然后你失去技能〖蛮嗣〗。', - hmxili:'系力', - hmxili_info:'每回合限一次,你的回合外,当其他拥有【系力】技能的角色在其回合内对没有【系力】技能的角色造成伤害时,你可以弃置一张牌,令此伤害+1,然后你与其各摸两张牌。', - wangshuang:'王双', - spzhuilie:'追猎', - spzhuilie2:'追猎', - spzhuilie_info:'锁定技,你使用【杀】无距离限制;当你使用【杀】指定目标后,若其不在你的攻击范围内,此【杀】不计入使用次数限制且你判定。若判定结果为武器牌或坐骑牌,此【杀】的伤害基数改为X(X为其体力值)。否则你失去1点体力。', - wenyang:'文鸯', - xinlvli:'膂力', - xinlvli_info:'每回合限一次,当你造成伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。', - lvli:'膂力', - lvli4:'膂力', - lvli5:'膂力', - lvli_info:'每名角色的回合限一次,你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)。', - choujue:'仇决', - choujue_info:'觉醒技,一名角色的回合结束时,若你的手牌数和体力值相差3或更多,你减1点体力上限并获得技能〖背水〗,然后将〖膂力〗改为“在自己的回合时每回合限两次”。', - beishui:'背水', - beishui_info:'觉醒技,准备阶段,若你的手牌数或体力值小于2,你减1点体力上限并获得技能〖清剿〗,然后将〖膂力〗改为受到伤害后也可以发动。', - qingjiao:'清剿', - qingjiao_info:'出牌阶段开始时,你可以弃置所有手牌,然后从牌堆或弃牌堆中随机获得八张牌名各不相同且副类别不同的牌。若如此做,结束阶段,你弃置所有牌。', - re_liuzan:'留赞', - refenyin:'奋音', - refenyin_info:'锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。', - liji:'力激', - liji_info:'出牌阶段限X次,你可以弃置一张牌并对一名其他角色造成1点伤害。(X为本回合内进入过弃牌堆的卡牌数除以8,若场上人数小于5则改为除以4,向下取整)', - liubian:'刘辩', - shiyuan:'诗怨', - shiyuan_info:'每回合每项限一次,当你成为其他角色使用牌的目标后:①若其体力值大于你,你摸三张牌。②若其体力值等于你,你摸两张牌。③若其体力值小于你,你摸一张牌。', - dushi:'毒逝', - dushi_info:'锁定技,你处于濒死状态时,其他角色不能对你使用【桃】。你死亡时,你选择一名其他角色获得〖毒逝〗。', - yuwei:'余威', - yuwei_info:'主公技,锁定技,其他群雄角色的回合内,你将〖诗怨〗改为“每回合每项限两次”。', - re_xinxianying:'新杀辛宪英', - re_xinxianying_prefix:'新杀', - rezhongjian:'忠鉴', - rezhongjian2:'忠鉴', - rezhongjian_info:'出牌阶段限一次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。', - recaishi:'才识', - recaishi3:'才识', - recaishi_info:'摸牌阶段结束时,若你于本阶段内因摸牌而获得的所有的牌:花色均相同,你将〖忠鉴〗于本回合内改为“出牌阶段限两次”。不均相同,你可回复1点体力。若如此做,你本回合内不能对自己使用牌。', - guozhao:'郭照', - pianchong:'偏宠', - pianchong2:'偏宠', - pianchong_info:'摸牌阶段开始时,你可放弃摸牌。若如此做,你从牌堆中获得一张红色牌和一张黑色牌。然后你选择一种颜色。你的下回合开始前,当你失去该颜色的一张牌后,你从牌堆中获得另一种颜色的一张牌。', - zunwei:'尊位', - zunwei_backup:'尊位', - zunwei_info:"出牌阶段限一次,你可选择本局游戏内未选择过的一项:①若你已受伤,则你可以选择一名体力值大于你的其他角色,你将体力值回复至X(X为你的体力上限与其体力值中的较小值)②选择一名手牌数大于你的其他角色,你将手牌数摸至与其相同(至多摸五张)③选择一名装备区内牌数大于你的其他角色。你令X=1。若你装备区内的('equip'+X)栏为空,则你使用牌堆中的一张副类别为('equip'+X),且能对自己使用的装备牌。你令X+1。若X不大于5,且你装备区内的牌数仍小于目标角色,则你重复此流程。", - fanyufeng:'樊玉凤', - bazhan:'把盏', - bazhan_info:'转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。', - jiaoying:'醮影', - jiaoying2:'醮影', - jiaoying3:'醮影', - jiaoying3_draw:'醮影', - jiaoying_info:'锁定技,其他角色得到你的手牌后,该角色本回合不能使用或打出与此牌颜色相同的牌。然后此回合结束时,若其本回合没有再使用牌,你令一名角色将手牌摸至五张。', - ruanyu:'阮瑀', - xingzuo:'兴作', - xingzuo2:'兴作', - xingzuo_info:'出牌阶段开始时,你可观看牌堆底的三张牌并用任意张手牌替换其中等量的牌。若如此做,结束阶段,你可令一名有手牌的角色用所有手牌替换牌堆底的三张牌。若其因此法失去的牌多于三张,则你失去1点体力。', - miaoxian:'妙弦', - miaoxian_info:'若你的手牌中仅有一张黑色牌,你可将此牌当作任意一张普通锦囊牌使用(每回合限一次);若你的手牌中仅有一张红色牌,你使用此牌时摸一张牌。', - yangwan:'杨婉', - youyan:'诱言', - youyan_info:'出牌阶段/弃牌阶段各限一次。当有牌进入弃牌堆后,若其中有你不因使用或打出而失去的牌,你可以从牌堆中获得你本次失去的牌中没有的花色的牌各一张。', - zhuihuan:'追还', - zhuihuan2:'追还', - zhuihuan2_new:'追还', - zhuihuan_info:'结束阶段开始时,你可以选择一名角色(对其他角色不可见)。记录所有对该角色造成过伤害的角色。该角色的下个准备阶段开始时停止记录,且所有记录过的角色:若体力值大于该角色,则受到其造成的2点伤害;若体力值小于等于该角色,则随机弃置两张手牌。', - re_panshu:'潘淑', - zhiren:'织纴', - zhiren_info:'当你于你的回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)', - yaner:'燕尔', - yaner_info:'每回合限一次。当有其他角色于其出牌阶段内失去手牌后,若其没有手牌,则你可以与其各摸两张牌。若其以此法摸得的两张牌类型相同,则其回复1点体力。若你以此法摸得的两张牌类型相同,则你将〖织纴〗中的“你的回合内”改为“一回合内”直至你下回合开始。', - zhouyi:'周夷', - zhukou:'逐寇', - zhukou_info:'①当你于一名角色的出牌阶段第一次造成伤害后,你可以摸X张牌(X为本回合你已使用的牌数)。②你的结束阶段,若你本回合没有造成伤害,你可以对两名其他角色各造成1点伤害。', - mengqing:'氓情', - mengqing_info:'觉醒技。准备阶段,若场上已受伤的角色数大于你的体力值,你加3点体力上限并回复3点体力,失去〖逐寇〗,获得〖玉殒〗。', - yuyun:'玉殒', - yuyun_info:'锁定技,出牌阶段开始时,你失去1点体力或体力上限(不能减至1以下),然后选择X+1项(X为你已损失的体力值):①摸两张牌;②对一名其他角色造成1点伤害,然后本回合对其使用【杀】无距离和次数限制;③本回合的手牌上限视为无限;④获得一名其他角色区域内的一张牌;⑤令一名其他角色将手牌摸至体力上限(最多摸至5)。', - caojinyu:'曹金玉', - yuqi:'隅泣', - yuqi_info:'每回合限两次。当有角色受到伤害后,若你至其的距离不大于0,则你可以观看牌堆顶的3张牌。你将其中至多1张牌交给受伤角色,然后可以获得剩余牌中的至多1张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)', - shanshen:'善身', - shanshen_info:'当有角色死亡时,你可令你的〖隅泣〗中的一个具有颜色的数字+2。然后若你未对该角色造成过伤害,则你回复1点体力。', - xianjing:'娴静', - xianjing_info:'准备阶段,你可令你的〖隅泣〗中的一个具有颜色的数字+1。若你的体力值等于体力上限,则你可以重复一次此流程。', - re_sunyi:'孙翊', - syjiqiao:'激峭', - syjiqiao_info:'出牌阶段开始时,你可将牌堆顶的X张牌置于你的武将牌上(X为你的体力上限)。当你于此出牌阶段内使用的牌结算结束后,你可以获得其中的一张牌,然后若剩余牌中红色牌和黑色牌的数量:不相等,你失去1点体力;相等,你回复1点体力。出牌阶段结束时,你将这些牌置入弃牌堆。', - syxiongyi:'凶疑', - syxiongyi_info:'限定技。当你处于濒死状态时,若剩余武将牌堆中:有“徐氏”,则你可以将体力值回复至3点,并将此武将牌替换为“徐氏”;没有“徐氏”,则你可以将体力值回复至1点并获得〖魂姿〗。', - re_zhangbao:'新杀张宝', - re_zhangbao_prefix:'新杀', - xinzhoufu:'咒缚', - xinzhoufu2:'咒缚', - xinzhoufu_info:'出牌阶段限一次。你可以将一张手牌置于一名其他角色的武将牌上并称为“咒”,且当其判定时,将其“咒”作为判定牌。', - xinyingbing:'影兵', - xinyingbing_info:'锁定技。每回合每名角色限一次,当你使用牌指定有“咒”的角色为目标后,你摸两张牌。', - wufan:'吴范', - tianyun:'天运', - tianyun_info:'①游戏的第一个回合开始前,你从牌堆中获得手牌区内没有的花色的各一张牌。②一名角色的回合开始时,若其座位号等于游戏轮数,则你可观看牌堆顶的X张牌并以任意顺序置于牌堆顶或牌堆底。若你将所有的牌均置于了牌堆底,则你可以令一名角色摸X张牌,然后失去1点体力。(X为你手牌中包含的花色数)', - wfyuyan:'预言', - wfyuyan_info:'一轮游戏开始时,你选择一名角色(对其他角色不可见):当第一次有角色于本轮内进入濒死状态时,若其是你选择的角色,则你获得〖奋音〗直到你的回合结束;当第一次有角色于本轮内造成伤害后,若其是你选择的角色,则你摸两张牌。', - re_fengfangnv:'冯妤', - tiqi:'涕泣', - tiqi_info:'其他角色的摸牌阶段结束时/被跳过时,若其于本阶段内因摸牌而得到的牌数X不等于2,则你可以摸|X-2|张牌,并可令其本回合的手牌上限±|X-2|。', - baoshu:'宝梳', - baoshu_info:'①准备阶段,你可选择Y名角色,这些角色重置武将牌并获得(X-Y+1)个“梳”(X为你的体力上限,Y∈[1, X])。②一名角色的摸牌阶段开始时,若其有“梳”,则其本阶段的额定摸牌数+Z且移去Z个“梳”(Z为其“梳”的数量)。', - dc_luotong:'骆统', - renzheng:'仁政', - renzheng_info:'锁定技。当有伤害被防止时,或伤害值发生过减少的伤害事件结算结束后,你摸两张牌。', - jinjian:'进谏', - jinjian_info:'①当你造成伤害时,你可令此伤害+1,然后你本回合内下一次造成的伤害-1且不触发〖进谏①〗。②当你受到伤害时,你可令此伤害-1。然后你于本回合内下一次受到的伤害+1且不触发〖进谏②〗。', - caomao:'曹髦', - qianlong:'潜龙', - qianlong_info:'当你受到伤害后,你可以亮出牌堆顶的三张牌并获得其中的至多X张牌(X为你已损失的体力值),然后将剩余的牌置于牌堆底。', - fensi:'忿肆', - fensi_info:'锁定技。准备阶段,你须选择一名体力值不小于你的角色并对其造成1点伤害,然后若你选择的角色不为你自己,则其视为对你使用一张【杀】。', - juetao:'决讨', - juetao_info:'限定技。出牌阶段开始时,若你的体力值为1,则你可以选择一名其他角色。你亮出牌堆底的一张牌,若此牌能被你使用,则你使用此牌并重复此流程直到出现不可使用的牌或其死亡(你与其以外的角色不是此牌的合法目标)。', - zhushi:'助势', - zhushi_info:'主公技。每回合限一次,其他魏势力角色于回合内回复体力时,其可令你摸一张牌。', - laiyinger:'来莺儿', - xiaowu:'绡舞', - xiaowu_info:'出牌阶段限一次,你可以选择任意名座位连续且包含你的上家/下家的其他角色。这些角色依次选择一项:⒈令你摸一张牌;⒉其摸一张牌。然后若选择选项一的角色数大于选项二的角色数,则你获得一枚“沙”;若选择选项二的角色数大于选项一的角色数,则你对这些角色依次造成1点伤害。', - huaping:'化萍', - huaping_info:'限定技。①一名其他角色死亡时,你可获得其当前拥有的所有不带有「Charlotte」标签的技能,然后你失去〖绡舞〗,移去所有“沙”并摸等量的牌。②当你死亡时,你可令一名其他角色获得〖沙舞〗和你的所有“沙”。', - shawu:'沙舞', - shawu_info:'当你使用【杀】指定目标后,你可选择一项:⒈弃置两张手牌;⒉移去一枚“沙”并摸两张牌。然后你对目标角色造成1点伤害。', - dc_huangzu:'黄祖', - dcjinggong:'精弓', - dcjinggong_info:'你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此杀的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。', - dcxiaojuan:'骁隽', - dcxiaojuan_info:'当你使用牌指定其他角色为唯一目标后,你可以弃置其一半的手牌(向下取整)。若这些牌中有与你使用牌花色相同的牌,则你弃置一张手牌。', - dc_liuyu:'新杀刘虞', - dc_liuyu_prefix:'新杀', - dcsuifu:'绥抚', - dcsuifu_info:'其他角色的结束阶段开始时,若你和一号位本回合内累计受到过的伤害值大于1,则你可以将该角色的所有手牌置于牌堆顶,然后视为使用一张【五谷丰登】。', - dcpijing:'辟境', - dcpijing_info:'结束阶段开始时,你可以选择任意名角色。你令所有未选择的角色失去〖自牧〗,然后你和这些角色获得〖自牧〗。', - dczimu:'自牧', - dczimu_info:'锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。', - caohua:'曹华', - caiyi:'彩翼', - caiyi_info:'转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。阴:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项;阳:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。', - guili:'归离', - guili_info:'你的第一个回合开始时,你须选择一名其他角色。该角色每轮的第一个回合结束后,若其本回合内未造成过伤害,则你执行一个额外的回合。', - zhaoang:'赵昂', - dczhongjie:'忠节', - dczhongjie_info:'每轮限一次。当有角色因失去体力而进入濒死状态时,你可令其回复1点体力并摸一张牌。', - dcsushou:'夙守', - dcsushou_tag:'对方手牌', - dcsushou_info:'一名角色的出牌阶段开始时,若其手牌数为全场唯一最多,则你可以失去1点体力并摸X张牌。然后若该角色不是你,则你可以观看其一半的手牌(向下取整),且用至多X张手牌替换其中等量的牌。(X为你已损失的体力值)', - dc_wangchang:'王昶', - dckaiji:'开济', - dckaiji_info:'转换技。出牌阶段限一次,你可以:阴:摸X张牌;阳:弃置至多X张牌(X为你的体力上限且至多为5)。', - dcpingxi:'平袭', - dcpingxi_info:'结束阶段,若X大于0,则你可以选择至多X名其他角色(X为本回合内因弃置而进入弃牌堆的牌数)。你依次弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】。', - liuhui:'刘徽', - dcgeyuan:'割圆', - dcgeyuan_info:'锁定技。①游戏开始时,你将从A至K的所有整数排列为一个环形链表,称为“圆环之理”。②当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你从“圆环之理”中移除“圆环之弧”记录的第一个和最后一个数字A和B(当“圆环之理”长度不大于3时则不移除),清空“圆环之弧”,获得场上和牌堆中所有点数为A和B的牌。', - dcjieshu:'解术', - dcjieshu_info:'锁定技。①所有点数不在“圆环之理”中的牌不计入你的手牌上限。②当你使用牌时,若“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你摸一张牌。', - dcgusuan:'股算', - dcgusuan_info:'觉醒技。一名角色的回合结束时,若你的“圆环之理”长度为3,则你减1点体力上限并修改〖割圆〗。', - dcgeyuan_magica:'割圆·改', - dcgeyuan_magica_info:'锁定技。当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你清空“圆环之弧”并选择至多三名角色,这些角色中的第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将其手牌与牌堆底的五张牌交换。', - zhangfen:'张奋', - dcwanglu:'望橹', - dcwanglu_info:'锁定技。准备阶段开始时,若你的装备区内:有【大攻车】,则你获得一个额外的出牌阶段;没有【大攻车】,则你将一张【大攻车】置入装备区。', - dcxianzhu:'陷筑', - dcxianzhu_info:'当你造成渠道为【杀】伤害后,你可以为你装备区内的【大攻车】选择一项强化(每张【大攻车】最多被强化五次):⒈通过【大攻车】使用【杀】无视距离和防具;⒉通过此【大攻车】使用的【杀】可以额外选择1个目标(可叠加);⒊通过此【大攻车】使用的【杀】造成伤害后的弃置牌数+1(可叠加)。', - dcchaixie:'拆械', - dcchaixie_info:'锁定技。当你的【大攻车】被销毁后,你摸X张牌(X为此【大攻车】被强化过的次数)。', - dagongche:'大攻车', - dagongche_skill:'大攻车', - dagongche_info:'出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。', - dukui:'杜夔', - dcfanyin:'泛音', - dcfanyin_info:'出牌阶段开始时,你可以亮出牌堆中点数最小的一张牌。然后你选择一项,并可以亮出一张点数为此牌二倍的牌且重复此流程:⒈使用此牌(无距离限制);⒉你于本回合内使用的下一张基本牌或普通锦囊牌选择目标后,可以增加一个目标。', - dcpeiqi:'配器', - dcpeiqi_info:'当你受到伤害后,你可以移动场上的一张牌。然后若场上所有角色均在彼此的攻击范围内,则你可以再移动场上的一张牌。', - quanhuijie:'全惠解', - dchuishu:'慧淑', - dchuishu_info:'摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。', - dcyishu:'易数', - dcyishu_info:'锁定技。当你不因出牌阶段而失去牌后,你同时令{〖慧淑〗的中括号内最小的一个数字+2}且{〖慧淑〗的中括号内最大的一个数字-1}。', - dcligong:'离宫', - dcligong_info:'觉醒技。准备阶段,若〖慧淑〗的中括号内有不小于5的数字,则你加1点体力上限,回复1点体力并失去〖易数〗。系统随机检索四张吴势力的女性武将牌,然后你选择一项:⒈摸三张牌。⒉失去〖慧淑〗,然后获得这些武将牌上的任意两个非Charlotte技能。', - dingshangwan:'丁尚涴', - dcfengyan:'讽言', - dcfengyan_info:'出牌阶段每项各限一次。你可以:⒈令一名体力值不大于你的其他角色交给你一张手牌。⒉视为对一名手牌数不大于你的角色使用一张【杀】(无距离和次数限制)。', - dcfudao:'抚悼', - dcfudao_info:'游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用牌的目标后,其本回合内不能再使用牌。', - luyi:'卢弈', - dcyaoyi:'邀弈', - dcyaoyi_info:'锁定技。①游戏开始时,你令所有存活且未拥有转换技的角色获得〖手谈〗。②你发动〖手谈〗时无需弃置牌,且无次数限制。③所有拥有转换技的角色不能使用牌指定其他拥有转换技且双方所有转换技状态均相同的角色为目标。', - dcfuxue:'复学', - dcfuxue_info:'①准备阶段,你可以从弃牌堆中选择获得至多X张不因使用而进入弃牌堆的牌。②结束阶段,若你的手牌区中没有因〖复学①〗得到的牌,则你摸X张牌(X为你的体力值)。', - dcshoutan:'手谈', - dcshoutan_info:'转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。', - dc_liuye:'刘晔', - dcpoyuan:'破垣', - dcpoyuan_info:'游戏开始时或准备阶段开始时,若你的装备区内:没有【霹雳投石车】,则你可以将一张【霹雳投石车】置入装备区;有【霹雳投石车】,则你可以弃置一名其他角色至多两张牌。', - dchuace:'画策', - dchuace_info:'出牌阶段限一次。你可以将一张手牌当做上一轮内未被使用过的普通锦囊牌使用。', - pilitoushiche:'霹雳投石车', - pilitoushiche_info:'锁定技。①你于回合内使用基本牌无距离限制,且当你于回合内使用基本牌时,你令此牌的牌面数值+1。②当你于回合外使用或打出基本牌时,你摸一张牌。③当此牌离开你的装备区时,销毁之。', - zhaozhi:'赵直', - dctongguan:'统观', - dctongguan_info:'一名角色的第一个回合开始时,你为其选择一项属性(每个属性至多选两次,且仅对你可见)。', - dcmengjie:'梦解', - dcmengjie_info:'一名角色的回合结束时,若其本回合完成了其〖统观〗属性,你执行对应效果:
  • 「武勇」造成伤害:对一名其他角色造成1点伤害;
  • 「刚硬」回复体力,或于得到牌后手牌数大于体力值:令一名角色回复1点体力;
  • 「多谋」于摸牌阶段外摸牌:摸两张牌;
  • 「果决」弃置或获得其他角色的牌:弃置一名角色区域内至多两张牌;
  • 「仁智」交给其他角色牌:令一名其他角色将手牌补至体力上限(至多摸五张)。', - dctongguan_wuyong:'武勇', - dctongguan_wuyong_info:'任务目标:造成伤害。', - dctongguan_gangying:'刚硬', - dctongguan_gangying_info:'任务目标:回复体力,或于得到牌后手牌数大于体力值。', - dctongguan_duomou:'多谋', - dctongguan_duomou_info:'任务目标:于摸牌阶段外摸牌。', - dctongguan_guojue:'果决', - dctongguan_guojue_info:'任务目标:弃置或获得其他角色的牌。', - dctongguan_renzhi:'仁智', - dctongguan_renzhi_info:'任务目标:交给其他角色牌。', - zhujianping:'朱建平', - olddcxiangmian:'相面', - olddcxiangmian_info:'其他角色的结束阶段,你可以判定。然后你不能再对其发动此技能,其获得以下效果:当其使用第X张结果的花色的牌后(X为结果的点数),其失去等同于其体力值的体力。', - dcxiangmian:'相面', - dcxiangmian_info:'出牌阶段限一次。你可以令一名其他角色判定,然后你不能再对其发动此技能,其获得以下效果:当其使用结果的花色的牌后,或当其使用X张牌后(X为结果的点数),其失去等同于其体力值的体力。', - dctianji:'天机', - dctianji_info:'锁定技。当判定牌进入弃牌堆后,你从牌堆随机获得分别与该牌类型、花色和点数相同的牌各一张。', - yuanji:'袁姬', - dcmengchi:'蒙斥', - dcmengchi_info:'锁定技。若你未于当前回合得到过牌:你不能使用牌;当你横置前,取消之;当你受到无属性伤害后,回复1点体力。', - dcfangdu:'芳妒', - dcfangdu_info:'锁定技。当你于回合外受到伤害后,若此次伤害为你于本回合受到的:第一次无属性伤害,你回复1点体力;第一次属性伤害,你随机获得伤害来源的一张手牌。', - dcjiexing:'节行', - dcjiexing_info:'当你受到伤害后、失去体力后或回复体力后,你可以摸一张牌,且此牌不计入本回合的手牌上限。', - dongguiren:'董贵人', - dclianzhi:'连枝', - dclianzhi_info:'①游戏开始时,你选择一名其他角色(仅你可见)。②每回合限一次。当你进入濒死状态时,若〖连枝①〗角色存活,你回复1点体力并与其各摸一张牌。③当〖连枝①〗角色死亡后,你可以与一名其他角色各获得〖受责〗,且其获得与你拥有的等量枚“绞”标记(至少获得1枚)。', - dclingfang:'凌芳', - dclingfang_info:'锁定技。准备阶段,或当其他角色使用黑色牌结算结束后,若你是此牌的目标,或你使用黑色牌结算结束后,若你不是此牌目标,你获得1枚“绞”。', - dcfengying:'风影', - dcfengying_info:'①一名角色的回合开始时,你记录弃牌堆中所有黑色基本牌或黑色普通锦囊牌的牌名。②每回合每种牌名各限一次。你可以将一张点数不大于“绞”数的手牌当做任意一张〖风影①〗记录中的牌使用(无距离和次数限制)。', - dcshouze:'受责', - dcshouze_info:'锁定技。结束阶段,若你有“绞”,你弃1枚“绞”,随机获得弃牌堆中的一张黑色牌,失去1点体力。', - chengbing:'程秉', - dcjingzao:'经造', - dcjingzao_info:'出牌阶段每名角色限一次,你可以选择一名其他角色并亮出牌堆顶三张牌,其选择一项:1.弃置一张牌名与这些牌的其中一张牌名相同的牌,然后你本回合发动〖经造〗亮出的牌数+1;2.令你随机获得这些牌中每种牌名的牌各一张,然后你本回合发动〖经造〗亮出的牌数-X(X为你获得的牌数)。', - dcenyu:'恩遇', - dcenyu_info:'锁定技。当你成为其他角色使用【杀】或普通锦囊牌的目标后,若你本回合成为过此牌名的牌的目标,此牌对你无效。', - dc_zhouxuān:'周宣', - dcwumei:'寤寐', - dcwumei_info:'每轮限一次。回合开始时,你可以令一名角色记录场上所有角色的体力值并进行一个额外的回合,并将你的回合移至该回合后进行。该角色以此法进行的回合的结束阶段,将场上所有角色的体力值改为记录内的对应数值。', - dczhanmeng:'占梦', - dczhanmeng_info:'当你使用牌时,你可以选择本回合未选择过的一项:1.上一回合内,若没有同名牌被使用过,你获得一张非伤害牌;2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌;3.令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害。', - dc_wangyun:'新杀王允', - dc_wangyun_prefix:'新杀', - dclianji:'连计', - dclianji_info:'出牌阶段限一次。你可以弃置一张手牌并选择一名其他角色,其随机使用牌堆中的一张武器牌,然后其选择一项:1.对另一名其他角色使用一张【杀】,并将武器牌交给其中一个目标;2.令你视为对其使用一张【杀】,并将武器牌交给你。', - dcmoucheng:'谋逞', - dcmoucheng_info:'觉醒技。准备阶段,若你发动过〖连计〗且两个选项均被选择过,你失去〖连计〗,然后获得〖矜功〗。', - xuelingyun:'薛灵芸', - dcxialei:'霞泪', - dcxialei_info:'当你的红色牌进入弃牌堆后,或当你使用或打出的红色牌经由处理区进入弃牌堆后,你可以观看牌堆顶的三张牌,获得其中的一张牌,且可以将其余牌置于牌堆底。然后你本回合以此法观看的牌数-1。', - dcanzhi:'暗织', - dcanzhi_info:'出牌阶段或当你受到伤害后,你可以判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。', - yanghong:'杨弘', - dcjianji:'间计', - dcjianji_info:'出牌阶段限一次。你可以令至多X名座位连续的角色依次弃置一张牌。然后其中手牌数最多的角色可以视为对一名其他以此法弃置过牌的角色使用一张【杀】(X为你的攻击范围)。', - dcyuanmo:'远谟', - dcyuanmo_info:'①准备阶段或当你受到伤害后,你可以选择一项:1.攻击范围+1,然后若你攻击范围内的角色数因此增加,你可以获得任意名本次进入你攻击范围的角色各一张牌;2.攻击范围-1,然后摸两张牌。②结束阶段,若你的攻击范围内没有角色,你可以令你的攻击范围+1。', - dc_yangbiao:'杨彪', - dczhaohan:'昭汉', - dczhaohan_info:'摸牌阶段,你可以多摸两张牌,然后你于得到牌后选择一项:1.将两张手牌交给一名没有手牌的角色;2.弃置两张手牌。', - dcjinjie:'尽节', - dcjinjie_info:'当一名角色进入濒死状态时,可以令其摸一张牌。然后若你本轮未进行过回合,你可以弃置X张手牌令其回复1点体力(X为本轮你发动过〖尽节〗的次数)。', - dcjue:'举讹', - dcjue_info:'准备阶段,你可以视为对一名体力值或手牌数大于你的角色使用一张【杀】。', - dc_tengfanglan:'滕芳兰', - dcluochong:'落宠', - dcluochong_info:'一轮游戏开始时,你可以弃置任意名角色区域里的共计至多[4]张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。', - dcaichen:'哀尘', - dcaichen_info:'锁定技。若牌堆剩余数:大于80,当你因〖落宠〗弃置你区域内的牌后,你摸两张牌;大于40,你跳过弃牌阶段;小于40,你不能响应♠牌。', - xielingyu:'谢灵毓', - dcyuandi:'元嫡', - dcyuandi_info:'当其他角色于其出牌阶段使用第一张牌时,若此牌仅指定其为目标,你可以选择一项:1.弃置其一张手牌;2.你与其各摸一张牌。', - dcxinyou:'心幽', - dcxinyou_info:'出牌阶段限一次。你可以将体力回复至上限并将手牌补至体力上限。若你以此法:获得了至少三张牌,你于结束阶段失去1点体力;回复了体力,你于结束阶段弃置一张牌。', - zerong:'笮融', - dccansi:'残肆', - dccansi_info:'锁定技。准备阶段,你回复1点体力,然后选择一名其他角色,其回复1点体力,你视为对其依次使用以下能使用的牌:【杀】(无距离限制)、【决斗】、【火攻】。当其以此法受到1点伤害后,你摸两张牌。', - dcfozong:'佛宗', - dcfozong_info:'锁定技。出牌阶段开始时,若你的手牌数大于7,你将X张手牌置于武将牌上(X为你的手牌数-7)。然后若你的武将牌上有至少七张牌,其他角色依次选择一项:1.获得其中的一张牌并令你回复1点体力;2.令你失去1点体力。', - dc_ruiji:'芮姬', - dcwangyuan:'妄缘', - dcwangyuan_info:'当你于回合外失去牌后,或于回合内发动〖俐影〗后,你可以随机将牌堆里的一张与你所有“妄”牌名均不同的基本牌或锦囊牌置于武将牌上,称为“妄”(不超过游戏人数)。', - dclingyin:'铃音', + translate: { + puyuan: "蒲元", + pytianjiang: "天匠", + pytianjiang_info: + "游戏开始时,你随机获得两张不同副类别的装备牌,并置入你的装备区。出牌阶段,你可以将装备区的牌移动至其他角色的装备区(可替换原装备)。若你以此法移动了〖铸刃〗的衍生装备,你摸两张牌。", + pytianjiang_move: "天匠", + pyzhuren: "铸刃", + pyzhuren_info: + "出牌阶段限一次,你可以弃置一张手牌。根据此牌的花色点数,你有一定概率打造成功并获得一张武器牌(若打造失败或武器已有则改为摸一张【杀】,花色决定武器名称,点数决定成功率)。此武器牌进入弃牌堆时,将其移出游戏。", + pyzhuren_destroy: "铸刃", + pyzhuren_heart: "红缎枪", + pyzhuren_heart_info: + "每回合限一次,当你使用【杀】造成伤害后,你可以进行判定,若结果为:红色,你回复1点体力;黑色:你摸两张牌。", + pyzhuren_diamond: "烈淬刀", + pyzhuren_diamond_info: + "每回合限两次,当你使用【杀】对目标角色造成伤害时,你可以弃置一张牌,令此伤害+1。你使用【杀】的次数上限+1。", + pyzhuren_club: "水波剑", + pyzhuren_club_info: + "每回合限两次,当你使用普通锦囊牌或【杀】时,你可以为此牌增加一个目标。当你失去装备区里的【水波剑】后,你回复1点体力。", + pyzhuren_spade: "混毒弯匕", + pyzhuren_spade_info: + "当你使用【杀】指定目标后,你可令其失去X点体力(X为此技能本回合内发动过的次数且至多为5)。", + pyzhuren_shandian: "天雷刃", + pyzhuren_shandian_info: + "当你使用【杀】指定目标后,可令其进行判定,若结果为:黑桃,其受到3点雷属性伤害;梅花,其受到1点雷属性伤害,你回复1点体力并摸一张牌。", + guanlu: "管辂", + tuiyan: "推演", + tuiyan_info: "出牌阶段开始时,你可以观看牌堆顶的三张牌。", + busuan: "卜算", + busuan_info: + "出牌阶段限一次,你可以选择一名其他角色,然后选择至多两张不同的卡牌名称(限基本牌或锦囊牌)。该角色下次摸牌阶段摸牌时,改为从牌堆或弃牌堆中获得你选择的牌。", + busuan_angelbeats: "卜算", + mingjie: "命戒", + mingjie_info: + "结束阶段,你可以摸一张牌,若此牌为红色,你可以重复此流程直到摸到黑色牌或摸到第三张牌。当你以此法摸到黑色牌时,若你的体力值大于1,则你失去1点体力。", + gexuan: "葛玄", + gxlianhua: "炼化", + gxlianhua_info: + "你的回合外,每当有其他角色受到伤害后,你获得一个“丹血”标记(该角色与你阵营一致时为红色,不一致为黑色,此颜色对所有玩家均不可见)直到你的准备阶段开始。准备阶段,根据你获得的“丹血”标记的数量和颜色,你从牌堆/弃牌堆中获得相应的牌以及相应技能直到回合结束。3枚或以下:〖英姿〗和【桃】;超过3枚且红色“丹血”较多:〖观星〗和【无中生有】;超过3枚且黑色“丹血”较多:〖直言〗和【顺手牵羊】;超过3枚且红色和黑色一样多:【杀】、【决斗】和〖攻心〗。", + zhafu: "札符", + zhafu_info: + "限定技,出牌阶段,你可以选择一名其他角色,令其获得一枚「札」。有「札」的角色弃牌阶段开始时,若其手牌数大于1,其移去「札」并选择保留一张手牌,然后将其余的手牌交给你。", + leitong: "雷铜", + kuiji: "溃击", + kuiji_info: + "出牌阶段限一次。你可以将一张黑色基本牌当作【兵粮寸断】置于你的判定区,然后摸一张牌。若如此做,你可以对体力值最多的一名对手造成2点伤害。对手因此进入濒死状态时,你或队友体力值最少的一方回复1点体力。", + kuiji_info_identity: + "出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。", + kuiji_info_guozhan: + "出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。", + wulan: "吴兰", + wlcuorui: "挫锐", + wlcuorui_info: + "出牌阶段开始时,你可以弃置你或队友区域里的一张牌。若如此做,你选择一项:1.弃置对手装备区里至多两张与此牌颜色相同的牌;2.展示对手的共计两张手牌,然后获得其中与此牌颜色相同的牌。", + wlcuorui_info_identity: + "出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。", + wlcuorui_info_guozhan: + "出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。", + huaman: "花鬘", + manyi: "蛮裔", + manyi_info: "锁定技,【南蛮入侵】对你无效。", + manyi_info_single_normal: + "锁定技,【南蛮入侵】对你无效。当你登场时,你可以视为使用一张【南蛮入侵】。", + mansi_viewas: "蛮嗣", + mansi: "蛮嗣", + mansi_info: + "出牌阶段限一次,你可以将所有手牌当做【南蛮入侵】使用;当有角色受到【南蛮入侵】的伤害后,你摸一张牌。", + souying: "薮影", + souying_info: + "每回合限一次,当你对其他角色(或其他角色对你)使用【杀】或普通锦囊牌指定唯一目标后,若此牌不是本回合你对其(或其对你)使用的第一张【杀】或普通锦囊牌,你可以弃置一张牌,获得此牌对应的所有实体牌(或令此牌对你无效)。", + zhanyuan: "战缘", + zhanyuan_info: + "觉醒技,准备阶段,若你已因蛮嗣累计获得超过七张牌,你加1点体力上限并回复1点体力,并可以选择一名男性角色,你与其获得技能〖系力〗,然后你失去技能〖蛮嗣〗。", + hmxili: "系力", + hmxili_info: + "每回合限一次,你的回合外,当其他拥有【系力】技能的角色在其回合内对没有【系力】技能的角色造成伤害时,你可以弃置一张牌,令此伤害+1,然后你与其各摸两张牌。", + wangshuang: "王双", + spzhuilie: "追猎", + spzhuilie2: "追猎", + spzhuilie_info: + "锁定技,你使用【杀】无距离限制;当你使用【杀】指定目标后,若其不在你的攻击范围内,此【杀】不计入使用次数限制且你判定。若判定结果为武器牌或坐骑牌,此【杀】的伤害基数改为X(X为其体力值)。否则你失去1点体力。", + wenyang: "文鸯", + xinlvli: "膂力", + xinlvli_info: + "每回合限一次,当你造成伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。", + lvli: "膂力", + lvli4: "膂力", + lvli5: "膂力", + lvli_info: + "每名角色的回合限一次,你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)。", + choujue: "仇决", + choujue_info: + "觉醒技,一名角色的回合结束时,若你的手牌数和体力值相差3或更多,你减1点体力上限并获得技能〖背水〗,然后将〖膂力〗改为“在自己的回合时每回合限两次”。", + beishui: "背水", + beishui_info: + "觉醒技,准备阶段,若你的手牌数或体力值小于2,你减1点体力上限并获得技能〖清剿〗,然后将〖膂力〗改为受到伤害后也可以发动。", + qingjiao: "清剿", + qingjiao_info: + "出牌阶段开始时,你可以弃置所有手牌,然后从牌堆或弃牌堆中随机获得八张牌名各不相同且副类别不同的牌。若如此做,结束阶段,你弃置所有牌。", + re_liuzan: "留赞", + refenyin: "奋音", + refenyin_info: + "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。", + liji: "力激", + liji_info: + "出牌阶段限X次,你可以弃置一张牌并对一名其他角色造成1点伤害。(X为本回合内进入过弃牌堆的卡牌数除以8,若场上人数小于5则改为除以4,向下取整)", + liubian: "刘辩", + shiyuan: "诗怨", + shiyuan_info: + "每回合每项限一次,当你成为其他角色使用牌的目标后:①若其体力值大于你,你摸三张牌。②若其体力值等于你,你摸两张牌。③若其体力值小于你,你摸一张牌。", + dushi: "毒逝", + dushi_info: + "锁定技,你处于濒死状态时,其他角色不能对你使用【桃】。你死亡时,你选择一名其他角色获得〖毒逝〗。", + yuwei: "余威", + yuwei_info: "主公技,锁定技,其他群雄角色的回合内,你将〖诗怨〗改为“每回合每项限两次”。", + re_xinxianying: "新杀辛宪英", + re_xinxianying_prefix: "新杀", + rezhongjian: "忠鉴", + rezhongjian2: "忠鉴", + rezhongjian_info: + "出牌阶段限一次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。", + recaishi: "才识", + recaishi3: "才识", + recaishi_info: + "摸牌阶段结束时,若你于本阶段内因摸牌而获得的所有的牌:花色均相同,你将〖忠鉴〗于本回合内改为“出牌阶段限两次”。不均相同,你可回复1点体力。若如此做,你本回合内不能对自己使用牌。", + guozhao: "郭照", + pianchong: "偏宠", + pianchong2: "偏宠", + pianchong_info: + "摸牌阶段开始时,你可放弃摸牌。若如此做,你从牌堆中获得一张红色牌和一张黑色牌。然后你选择一种颜色。你的下回合开始前,当你失去该颜色的一张牌后,你从牌堆中获得另一种颜色的一张牌。", + zunwei: "尊位", + zunwei_backup: "尊位", + zunwei_info: + "出牌阶段限一次,你可选择本局游戏内未选择过的一项:①若你已受伤,则你可以选择一名体力值大于你的其他角色,你将体力值回复至X(X为你的体力上限与其体力值中的较小值)②选择一名手牌数大于你的其他角色,你将手牌数摸至与其相同(至多摸五张)③选择一名装备区内牌数大于你的其他角色。你令X=1。若你装备区内的('equip'+X)栏为空,则你使用牌堆中的一张副类别为('equip'+X),且能对自己使用的装备牌。你令X+1。若X不大于5,且你装备区内的牌数仍小于目标角色,则你重复此流程。", + fanyufeng: "樊玉凤", + bazhan: "把盏", + bazhan_info: + "转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。", + jiaoying: "醮影", + jiaoying2: "醮影", + jiaoying3: "醮影", + jiaoying3_draw: "醮影", + jiaoying_info: + "锁定技,其他角色得到你的手牌后,该角色本回合不能使用或打出与此牌颜色相同的牌。然后此回合结束时,若其本回合没有再使用牌,你令一名角色将手牌摸至五张。", + ruanyu: "阮瑀", + xingzuo: "兴作", + xingzuo2: "兴作", + xingzuo_info: + "出牌阶段开始时,你可观看牌堆底的三张牌并用任意张手牌替换其中等量的牌。若如此做,结束阶段,你可令一名有手牌的角色用所有手牌替换牌堆底的三张牌。若其因此法失去的牌多于三张,则你失去1点体力。", + miaoxian: "妙弦", + miaoxian_info: + "若你的手牌中仅有一张黑色牌,你可将此牌当作任意一张普通锦囊牌使用(每回合限一次);若你的手牌中仅有一张红色牌,你使用此牌时摸一张牌。", + yangwan: "杨婉", + youyan: "诱言", + youyan_info: + "出牌阶段/弃牌阶段各限一次。当有牌进入弃牌堆后,若其中有你不因使用或打出而失去的牌,你可以从牌堆中获得你本次失去的牌中没有的花色的牌各一张。", + zhuihuan: "追还", + zhuihuan2: "追还", + zhuihuan2_new: "追还", + zhuihuan_info: + "结束阶段开始时,你可以选择一名角色(对其他角色不可见)。记录所有对该角色造成过伤害的角色。该角色的下个准备阶段开始时停止记录,且所有记录过的角色:若体力值大于该角色,则受到其造成的2点伤害;若体力值小于等于该角色,则随机弃置两张手牌。", + re_panshu: "潘淑", + zhiren: "织纴", + zhiren_info: + "当你于你的回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)", + yaner: "燕尔", + yaner_info: + "每回合限一次。当有其他角色于其出牌阶段内失去手牌后,若其没有手牌,则你可以与其各摸两张牌。若其以此法摸得的两张牌类型相同,则其回复1点体力。若你以此法摸得的两张牌类型相同,则你将〖织纴〗中的“你的回合内”改为“一回合内”直至你下回合开始。", + zhouyi: "周夷", + zhukou: "逐寇", + zhukou_info: + "①当你于一名角色的出牌阶段第一次造成伤害后,你可以摸X张牌(X为本回合你已使用的牌数)。②你的结束阶段,若你本回合没有造成伤害,你可以对两名其他角色各造成1点伤害。", + mengqing: "氓情", + mengqing_info: + "觉醒技。准备阶段,若场上已受伤的角色数大于你的体力值,你加3点体力上限并回复3点体力,失去〖逐寇〗,获得〖玉殒〗。", + yuyun: "玉殒", + yuyun_info: + "锁定技,出牌阶段开始时,你失去1点体力或体力上限(不能减至1以下),然后选择X+1项(X为你已损失的体力值):①摸两张牌;②对一名其他角色造成1点伤害,然后本回合对其使用【杀】无距离和次数限制;③本回合的手牌上限视为无限;④获得一名其他角色区域内的一张牌;⑤令一名其他角色将手牌摸至体力上限(最多摸至5)。", + caojinyu: "曹金玉", + yuqi: "隅泣", + yuqi_info: + "每回合限两次。当有角色受到伤害后,若你至其的距离不大于0,则你可以观看牌堆顶的3张牌。你将其中至多1张牌交给受伤角色,然后可以获得剩余牌中的至多1张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)", + shanshen: "善身", + shanshen_info: + "当有角色死亡时,你可令你的〖隅泣〗中的一个具有颜色的数字+2。然后若你未对该角色造成过伤害,则你回复1点体力。", + xianjing: "娴静", + xianjing_info: + "准备阶段,你可令你的〖隅泣〗中的一个具有颜色的数字+1。若你的体力值等于体力上限,则你可以重复一次此流程。", + re_sunyi: "孙翊", + syjiqiao: "激峭", + syjiqiao_info: + "出牌阶段开始时,你可将牌堆顶的X张牌置于你的武将牌上(X为你的体力上限)。当你于此出牌阶段内使用的牌结算结束后,你可以获得其中的一张牌,然后若剩余牌中红色牌和黑色牌的数量:不相等,你失去1点体力;相等,你回复1点体力。出牌阶段结束时,你将这些牌置入弃牌堆。", + syxiongyi: "凶疑", + syxiongyi_info: + "限定技。当你处于濒死状态时,若剩余武将牌堆中:有“徐氏”,则你可以将体力值回复至3点,并将此武将牌替换为“徐氏”;没有“徐氏”,则你可以将体力值回复至1点并获得〖魂姿〗。", + re_zhangbao: "新杀张宝", + re_zhangbao_prefix: "新杀", + xinzhoufu: "咒缚", + xinzhoufu2: "咒缚", + xinzhoufu_info: + "出牌阶段限一次。你可以将一张手牌置于一名其他角色的武将牌上并称为“咒”,且当其判定时,将其“咒”作为判定牌。", + xinyingbing: "影兵", + xinyingbing_info: + "锁定技。每回合每名角色限一次,当你使用牌指定有“咒”的角色为目标后,你摸两张牌。", + wufan: "吴范", + tianyun: "天运", + tianyun_info: + "①游戏的第一个回合开始前,你从牌堆中获得手牌区内没有的花色的各一张牌。②一名角色的回合开始时,若其座位号等于游戏轮数,则你可观看牌堆顶的X张牌并以任意顺序置于牌堆顶或牌堆底。若你将所有的牌均置于了牌堆底,则你可以令一名角色摸X张牌,然后失去1点体力。(X为你手牌中包含的花色数)", + wfyuyan: "预言", + wfyuyan_info: + "一轮游戏开始时,你选择一名角色(对其他角色不可见):当第一次有角色于本轮内进入濒死状态时,若其是你选择的角色,则你获得〖奋音〗直到你的回合结束;当第一次有角色于本轮内造成伤害后,若其是你选择的角色,则你摸两张牌。", + re_fengfangnv: "冯妤", + tiqi: "涕泣", + tiqi_info: + "其他角色的摸牌阶段结束时/被跳过时,若其于本阶段内因摸牌而得到的牌数X不等于2,则你可以摸|X-2|张牌,并可令其本回合的手牌上限±|X-2|。", + baoshu: "宝梳", + baoshu_info: + "①准备阶段,你可选择Y名角色,这些角色重置武将牌并获得(X-Y+1)个“梳”(X为你的体力上限,Y∈[1, X])。②一名角色的摸牌阶段开始时,若其有“梳”,则其本阶段的额定摸牌数+Z且移去Z个“梳”(Z为其“梳”的数量)。", + dc_luotong: "骆统", + renzheng: "仁政", + renzheng_info: "锁定技。当有伤害被防止时,或伤害值发生过减少的伤害事件结算结束后,你摸两张牌。", + jinjian: "进谏", + jinjian_info: + "①当你造成伤害时,你可令此伤害+1,然后你本回合内下一次造成的伤害-1且不触发〖进谏①〗。②当你受到伤害时,你可令此伤害-1。然后你于本回合内下一次受到的伤害+1且不触发〖进谏②〗。", + caomao: "曹髦", + qianlong: "潜龙", + qianlong_info: + "当你受到伤害后,你可以亮出牌堆顶的三张牌并获得其中的至多X张牌(X为你已损失的体力值),然后将剩余的牌置于牌堆底。", + fensi: "忿肆", + fensi_info: + "锁定技。准备阶段,你须选择一名体力值不小于你的角色并对其造成1点伤害,然后若你选择的角色不为你自己,则其视为对你使用一张【杀】。", + juetao: "决讨", + juetao_info: + "限定技。出牌阶段开始时,若你的体力值为1,则你可以选择一名其他角色。你亮出牌堆底的一张牌,若此牌能被你使用,则你使用此牌并重复此流程直到出现不可使用的牌或其死亡(你与其以外的角色不是此牌的合法目标)。", + zhushi: "助势", + zhushi_info: "主公技。每回合限一次,其他魏势力角色于回合内回复体力时,其可令你摸一张牌。", + laiyinger: "来莺儿", + xiaowu: "绡舞", + xiaowu_info: + "出牌阶段限一次,你可以选择任意名座位连续且包含你的上家/下家的其他角色。这些角色依次选择一项:⒈令你摸一张牌;⒉其摸一张牌。然后若选择选项一的角色数大于选项二的角色数,则你获得一枚“沙”;若选择选项二的角色数大于选项一的角色数,则你对这些角色依次造成1点伤害。", + huaping: "化萍", + huaping_info: + "限定技。①一名其他角色死亡时,你可获得其当前拥有的所有不带有「Charlotte」标签的技能,然后你失去〖绡舞〗,移去所有“沙”并摸等量的牌。②当你死亡时,你可令一名其他角色获得〖沙舞〗和你的所有“沙”。", + shawu: "沙舞", + shawu_info: + "当你使用【杀】指定目标后,你可选择一项:⒈弃置两张手牌;⒉移去一枚“沙”并摸两张牌。然后你对目标角色造成1点伤害。", + dc_huangzu: "黄祖", + dcjinggong: "精弓", + dcjinggong_info: + "你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此杀的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。", + dcxiaojuan: "骁隽", + dcxiaojuan_info: + "当你使用牌指定其他角色为唯一目标后,你可以弃置其一半的手牌(向下取整)。若这些牌中有与你使用牌花色相同的牌,则你弃置一张手牌。", + dc_liuyu: "新杀刘虞", + dc_liuyu_prefix: "新杀", + dcsuifu: "绥抚", + dcsuifu_info: + "其他角色的结束阶段开始时,若你和一号位本回合内累计受到过的伤害值大于1,则你可以将该角色的所有手牌置于牌堆顶,然后视为使用一张【五谷丰登】。", + dcpijing: "辟境", + dcpijing_info: + "结束阶段开始时,你可以选择任意名角色。你令所有未选择的角色失去〖自牧〗,然后你和这些角色获得〖自牧〗。", + dczimu: "自牧", + dczimu_info: "锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。", + caohua: "曹华", + caiyi: "彩翼", + caiyi_info: + "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。阴:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项;阳:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。", + guili: "归离", + guili_info: + "你的第一个回合开始时,你须选择一名其他角色。该角色每轮的第一个回合结束后,若其本回合内未造成过伤害,则你执行一个额外的回合。", + zhaoang: "赵昂", + dczhongjie: "忠节", + dczhongjie_info: + "每轮限一次。当有角色因失去体力而进入濒死状态时,你可令其回复1点体力并摸一张牌。", + dcsushou: "夙守", + dcsushou_tag: "对方手牌", + dcsushou_info: + "一名角色的出牌阶段开始时,若其手牌数为全场唯一最多,则你可以失去1点体力并摸X张牌。然后若该角色不是你,则你可以观看其一半的手牌(向下取整),且用至多X张手牌替换其中等量的牌。(X为你已损失的体力值)", + dc_wangchang: "王昶", + dckaiji: "开济", + dckaiji_info: + "转换技。出牌阶段限一次,你可以:阴:摸X张牌;阳:弃置至多X张牌(X为你的体力上限且至多为5)。", + dcpingxi: "平袭", + dcpingxi_info: + "结束阶段,若X大于0,则你可以选择至多X名其他角色(X为本回合内因弃置而进入弃牌堆的牌数)。你依次弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】。", + liuhui: "刘徽", + dcgeyuan: "割圆", + dcgeyuan_info: + "锁定技。①游戏开始时,你将从A至K的所有整数排列为一个环形链表,称为“圆环之理”。②当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你从“圆环之理”中移除“圆环之弧”记录的第一个和最后一个数字A和B(当“圆环之理”长度不大于3时则不移除),清空“圆环之弧”,获得场上和牌堆中所有点数为A和B的牌。", + dcjieshu: "解术", + dcjieshu_info: + "锁定技。①所有点数不在“圆环之理”中的牌不计入你的手牌上限。②当你使用牌时,若“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你摸一张牌。", + dcgusuan: "股算", + dcgusuan_info: + "觉醒技。一名角色的回合结束时,若你的“圆环之理”长度为3,则你减1点体力上限并修改〖割圆〗。", + dcgeyuan_magica: "割圆·改", + dcgeyuan_magica_info: + "锁定技。当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你清空“圆环之弧”并选择至多三名角色,这些角色中的第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将其手牌与牌堆底的五张牌交换。", + zhangfen: "张奋", + dcwanglu: "望橹", + dcwanglu_info: + "锁定技。准备阶段开始时,若你的装备区内:有【大攻车】,则你获得一个额外的出牌阶段;没有【大攻车】,则你将一张【大攻车】置入装备区。", + dcxianzhu: "陷筑", + dcxianzhu_info: + "当你造成渠道为【杀】伤害后,你可以为你装备区内的【大攻车】选择一项强化(每张【大攻车】最多被强化五次):⒈通过【大攻车】使用【杀】无视距离和防具;⒉通过此【大攻车】使用的【杀】可以额外选择1个目标(可叠加);⒊通过此【大攻车】使用的【杀】造成伤害后的弃置牌数+1(可叠加)。", + dcchaixie: "拆械", + dcchaixie_info: "锁定技。当你的【大攻车】被销毁后,你摸X张牌(X为此【大攻车】被强化过的次数)。", + dagongche: "大攻车", + dagongche_skill: "大攻车", + dagongche_info: + "出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。", + dukui: "杜夔", + dcfanyin: "泛音", + dcfanyin_info: + "出牌阶段开始时,你可以亮出牌堆中点数最小的一张牌。然后你选择一项,并可以亮出一张点数为此牌二倍的牌且重复此流程:⒈使用此牌(无距离限制);⒉你于本回合内使用的下一张基本牌或普通锦囊牌选择目标后,可以增加一个目标。", + dcpeiqi: "配器", + dcpeiqi_info: + "当你受到伤害后,你可以移动场上的一张牌。然后若场上所有角色均在彼此的攻击范围内,则你可以再移动场上的一张牌。", + quanhuijie: "全惠解", + dchuishu: "慧淑", + dchuishu_info: + "摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。", + dcyishu: "易数", + dcyishu_info: + "锁定技。当你不因出牌阶段而失去牌后,你同时令{〖慧淑〗的中括号内最小的一个数字+2}且{〖慧淑〗的中括号内最大的一个数字-1}。", + dcligong: "离宫", + dcligong_info: + "觉醒技。准备阶段,若〖慧淑〗的中括号内有不小于5的数字,则你加1点体力上限,回复1点体力并失去〖易数〗。系统随机检索四张吴势力的女性武将牌,然后你选择一项:⒈摸三张牌。⒉失去〖慧淑〗,然后获得这些武将牌上的任意两个非Charlotte技能。", + dingshangwan: "丁尚涴", + dcfengyan: "讽言", + dcfengyan_info: + "出牌阶段每项各限一次。你可以:⒈令一名体力值不大于你的其他角色交给你一张手牌。⒉视为对一名手牌数不大于你的角色使用一张【杀】(无距离和次数限制)。", + dcfudao: "抚悼", + dcfudao_info: + "游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用牌的目标后,其本回合内不能再使用牌。", + luyi: "卢弈", + dcyaoyi: "邀弈", + dcyaoyi_info: + "锁定技。①游戏开始时,你令所有存活且未拥有转换技的角色获得〖手谈〗。②你发动〖手谈〗时无需弃置牌,且无次数限制。③所有拥有转换技的角色不能使用牌指定其他拥有转换技且双方所有转换技状态均相同的角色为目标。", + dcfuxue: "复学", + dcfuxue_info: + "①准备阶段,你可以从弃牌堆中选择获得至多X张不因使用而进入弃牌堆的牌。②结束阶段,若你的手牌区中没有因〖复学①〗得到的牌,则你摸X张牌(X为你的体力值)。", + dcshoutan: "手谈", + dcshoutan_info: + "转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。", + dc_liuye: "刘晔", + dcpoyuan: "破垣", + dcpoyuan_info: + "游戏开始时或准备阶段开始时,若你的装备区内:没有【霹雳投石车】,则你可以将一张【霹雳投石车】置入装备区;有【霹雳投石车】,则你可以弃置一名其他角色至多两张牌。", + dchuace: "画策", + dchuace_info: "出牌阶段限一次。你可以将一张手牌当做上一轮内未被使用过的普通锦囊牌使用。", + pilitoushiche: "霹雳投石车", + pilitoushiche_info: + "锁定技。①你于回合内使用基本牌无距离限制,且当你于回合内使用基本牌时,你令此牌的牌面数值+1。②当你于回合外使用或打出基本牌时,你摸一张牌。③当此牌离开你的装备区时,销毁之。", + zhaozhi: "赵直", + dctongguan: "统观", + dctongguan_info: + "一名角色的第一个回合开始时,你为其选择一项属性(每个属性至多选两次,且仅对你可见)。", + dcmengjie: "梦解", + dcmengjie_info: + "一名角色的回合结束时,若其本回合完成了其〖统观〗属性,你执行对应效果:
  • 「武勇」造成伤害:对一名其他角色造成1点伤害;
  • 「刚硬」回复体力,或于得到牌后手牌数大于体力值:令一名角色回复1点体力;
  • 「多谋」于摸牌阶段外摸牌:摸两张牌;
  • 「果决」弃置或获得其他角色的牌:弃置一名角色区域内至多两张牌;
  • 「仁智」交给其他角色牌:令一名其他角色将手牌补至体力上限(至多摸五张)。", + dctongguan_wuyong: "武勇", + dctongguan_wuyong_info: "任务目标:造成伤害。", + dctongguan_gangying: "刚硬", + dctongguan_gangying_info: "任务目标:回复体力,或于得到牌后手牌数大于体力值。", + dctongguan_duomou: "多谋", + dctongguan_duomou_info: "任务目标:于摸牌阶段外摸牌。", + dctongguan_guojue: "果决", + dctongguan_guojue_info: "任务目标:弃置或获得其他角色的牌。", + dctongguan_renzhi: "仁智", + dctongguan_renzhi_info: "任务目标:交给其他角色牌。", + zhujianping: "朱建平", + olddcxiangmian: "相面", + olddcxiangmian_info: + "其他角色的结束阶段,你可以判定。然后你不能再对其发动此技能,其获得以下效果:当其使用第X张结果的花色的牌后(X为结果的点数),其失去等同于其体力值的体力。", + dcxiangmian: "相面", + dcxiangmian_info: + "出牌阶段限一次。你可以令一名其他角色判定,然后你不能再对其发动此技能,其获得以下效果:当其使用结果的花色的牌后,或当其使用X张牌后(X为结果的点数),其失去等同于其体力值的体力。", + dctianji: "天机", + dctianji_info: + "锁定技。当判定牌进入弃牌堆后,你从牌堆随机获得分别与该牌类型、花色和点数相同的牌各一张。", + yuanji: "袁姬", + dcmengchi: "蒙斥", + dcmengchi_info: + "锁定技。若你未于当前回合得到过牌:你不能使用牌;当你横置前,取消之;当你受到无属性伤害后,回复1点体力。", + dcfangdu: "芳妒", + dcfangdu_info: + "锁定技。当你于回合外受到伤害后,若此次伤害为你于本回合受到的:第一次无属性伤害,你回复1点体力;第一次属性伤害,你随机获得伤害来源的一张手牌。", + dcjiexing: "节行", + dcjiexing_info: + "当你受到伤害后、失去体力后或回复体力后,你可以摸一张牌,且此牌不计入本回合的手牌上限。", + dongguiren: "董贵人", + dclianzhi: "连枝", + dclianzhi_info: + "①游戏开始时,你选择一名其他角色(仅你可见)。②每回合限一次。当你进入濒死状态时,若〖连枝①〗角色存活,你回复1点体力并与其各摸一张牌。③当〖连枝①〗角色死亡后,你可以与一名其他角色各获得〖受责〗,且其获得与你拥有的等量枚“绞”标记(至少获得1枚)。", + dclingfang: "凌芳", + dclingfang_info: + "锁定技。准备阶段,或当其他角色使用黑色牌结算结束后,若你是此牌的目标,或你使用黑色牌结算结束后,若你不是此牌目标,你获得1枚“绞”。", + dcfengying: "风影", + dcfengying_info: + "①一名角色的回合开始时,你记录弃牌堆中所有黑色基本牌或黑色普通锦囊牌的牌名。②每回合每种牌名各限一次。你可以将一张点数不大于“绞”数的手牌当做任意一张〖风影①〗记录中的牌使用(无距离和次数限制)。", + dcshouze: "受责", + dcshouze_info: + "锁定技。结束阶段,若你有“绞”,你弃1枚“绞”,随机获得弃牌堆中的一张黑色牌,失去1点体力。", + chengbing: "程秉", + dcjingzao: "经造", + dcjingzao_info: + "出牌阶段每名角色限一次,你可以选择一名其他角色并亮出牌堆顶三张牌,其选择一项:1.弃置一张牌名与这些牌的其中一张牌名相同的牌,然后你本回合发动〖经造〗亮出的牌数+1;2.令你随机获得这些牌中每种牌名的牌各一张,然后你本回合发动〖经造〗亮出的牌数-X(X为你获得的牌数)。", + dcenyu: "恩遇", + dcenyu_info: + "锁定技。当你成为其他角色使用【杀】或普通锦囊牌的目标后,若你本回合成为过此牌名的牌的目标,此牌对你无效。", + dc_zhouxuān: "周宣", + dcwumei: "寤寐", + dcwumei_info: + "每轮限一次。回合开始时,你可以令一名角色记录场上所有角色的体力值并进行一个额外的回合,并将你的回合移至该回合后进行。该角色以此法进行的回合的结束阶段,将场上所有角色的体力值改为记录内的对应数值。", + dczhanmeng: "占梦", + dczhanmeng_info: + "当你使用牌时,你可以选择本回合未选择过的一项:1.上一回合内,若没有同名牌被使用过,你获得一张非伤害牌;2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌;3.令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害。", + dc_wangyun: "新杀王允", + dc_wangyun_prefix: "新杀", + dclianji: "连计", + dclianji_info: + "出牌阶段限一次。你可以弃置一张手牌并选择一名其他角色,其随机使用牌堆中的一张武器牌,然后其选择一项:1.对另一名其他角色使用一张【杀】,并将武器牌交给其中一个目标;2.令你视为对其使用一张【杀】,并将武器牌交给你。", + dcmoucheng: "谋逞", + dcmoucheng_info: + "觉醒技。准备阶段,若你发动过〖连计〗且两个选项均被选择过,你失去〖连计〗,然后获得〖矜功〗。", + xuelingyun: "薛灵芸", + dcxialei: "霞泪", + dcxialei_info: + "当你的红色牌进入弃牌堆后,或当你使用或打出的红色牌经由处理区进入弃牌堆后,你可以观看牌堆顶的三张牌,获得其中的一张牌,且可以将其余牌置于牌堆底。然后你本回合以此法观看的牌数-1。", + dcanzhi: "暗织", + dcanzhi_info: + "出牌阶段或当你受到伤害后,你可以判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。", + yanghong: "杨弘", + dcjianji: "间计", + dcjianji_info: + "出牌阶段限一次。你可以令至多X名座位连续的角色依次弃置一张牌。然后其中手牌数最多的角色可以视为对一名其他以此法弃置过牌的角色使用一张【杀】(X为你的攻击范围)。", + dcyuanmo: "远谟", + dcyuanmo_info: + "①准备阶段或当你受到伤害后,你可以选择一项:1.攻击范围+1,然后若你攻击范围内的角色数因此增加,你可以获得任意名本次进入你攻击范围的角色各一张牌;2.攻击范围-1,然后摸两张牌。②结束阶段,若你的攻击范围内没有角色,你可以令你的攻击范围+1。", + dc_yangbiao: "杨彪", + dczhaohan: "昭汉", + dczhaohan_info: + "摸牌阶段,你可以多摸两张牌,然后你于得到牌后选择一项:1.将两张手牌交给一名没有手牌的角色;2.弃置两张手牌。", + dcjinjie: "尽节", + dcjinjie_info: + "当一名角色进入濒死状态时,可以令其摸一张牌。然后若你本轮未进行过回合,你可以弃置X张手牌令其回复1点体力(X为本轮你发动过〖尽节〗的次数)。", + dcjue: "举讹", + dcjue_info: "准备阶段,你可以视为对一名体力值或手牌数大于你的角色使用一张【杀】。", + dc_tengfanglan: "滕芳兰", + dcluochong: "落宠", + dcluochong_info: + "一轮游戏开始时,你可以弃置任意名角色区域里的共计至多[4]张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。", + dcaichen: "哀尘", + dcaichen_info: + "锁定技。若牌堆剩余数:大于80,当你因〖落宠〗弃置你区域内的牌后,你摸两张牌;大于40,你跳过弃牌阶段;小于40,你不能响应♠牌。", + xielingyu: "谢灵毓", + dcyuandi: "元嫡", + dcyuandi_info: + "当其他角色于其出牌阶段使用第一张牌时,若此牌仅指定其为目标,你可以选择一项:1.弃置其一张手牌;2.你与其各摸一张牌。", + dcxinyou: "心幽", + dcxinyou_info: + "出牌阶段限一次。你可以将体力回复至上限并将手牌补至体力上限。若你以此法:获得了至少三张牌,你于结束阶段失去1点体力;回复了体力,你于结束阶段弃置一张牌。", + zerong: "笮融", + dccansi: "残肆", + dccansi_info: + "锁定技。准备阶段,你回复1点体力,然后选择一名其他角色,其回复1点体力,你视为对其依次使用以下能使用的牌:【杀】(无距离限制)、【决斗】、【火攻】。当其以此法受到1点伤害后,你摸两张牌。", + dcfozong: "佛宗", + dcfozong_info: + "锁定技。出牌阶段开始时,若你的手牌数大于7,你将X张手牌置于武将牌上(X为你的手牌数-7)。然后若你的武将牌上有至少七张牌,其他角色依次选择一项:1.获得其中的一张牌并令你回复1点体力;2.令你失去1点体力。", + dc_ruiji: "芮姬", + dcwangyuan: "妄缘", + dcwangyuan_info: + "当你于回合外失去牌后,或于回合内发动〖俐影〗后,你可以随机将牌堆里的一张与你所有“妄”牌名均不同的基本牌或锦囊牌置于武将牌上,称为“妄”(不超过游戏人数)。", + dclingyin: "铃音", // dclingyin_info:'出牌阶段开始时,你可以获得至多X张“妄”(X为游戏轮数)然后若你的“妄”颜色均相同,你于本回合对其他角色造成的伤害+1,且可以将一张武器牌或防具牌当【决斗】使用。', - dclingyin_info:'出牌阶段开始时,你可以选择至多X张“妄”(X为游戏轮数),若这些牌以外的“妄”中不存在颜色不同的牌,则你于本回合对其他角色造成的伤害+1,且可以将一张武器牌或防具牌当【决斗】使用。你获得这些牌。', - dcliying:'俐影', - dcliying_info:'每回合限一次。当你于摸牌阶段外得到牌后,你可以将这些牌中的任意张交给一名其他角色,然后摸一张牌。', - huanfan:'桓范', - dcjianzheng:'谏诤', - dcjianzheng_info:'出牌阶段限一次。你可以观看一名其他角色的手牌,然后若其中有你可以使用的手牌,你获得并使用其中一张。若你以此法使用牌指定了其为目标,你令你与其横置,然后其观看你的手牌。', - dcfumou:'腹谋', - dcfumou_info:'当你受到伤害后,你可以令至多X名角色从你开始逆时针依次选择一项:1.移动场上的一张牌;2.弃置所有手牌并摸两张牌;3.弃置装备区里的所有牌并回复1点体力(X为你已损失的体力值)。', - chentai:'陈泰', - dcctjiuxian:'救陷', - dcctjiuxian_info:'出牌阶段限一次。你可以重铸一半数量的手牌(向上取整),然后视为使用一张【决斗】。当此牌对目标角色造成伤害后,你可以令其攻击范围内的一名其他角色回复1点体力。', - dcchenyong:'沉勇', - dcchenyong_info:'结束阶段,你可以摸X张牌(X为本回合你使用过的牌的类型数)。', - sunyu:'孙瑜', - dcquanshou:'劝守', - dcquanshou_info:'一名角色的回合开始时,若其手牌数不大于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。', - dcshexue:'设学', - dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。', - xizheng:'郤正', - dcdanyi:'耽意', - dcdanyi_info:'当你使用牌指定第一个目标后,你可以摸X张牌(X为此牌目标数与你使用的上一张牌相同的目标数)。', - dcwencan:'文灿', - dcwencan_info:'出牌阶段限一次。你可以选择至多两名体力值不同的其他角色,这些角色依次选择一项:1.弃置两张花色不同的牌;2.本回合你对其使用牌无距离和次数限制。', - zhangjinyun:'张瑾云', - dchuizhi:'蕙质', - dchuizhi_info:'准备阶段,你可以选择是否弃置任意张手牌,然后将手牌摸至与全场手牌数最多的角色相同(至少摸一张,至多摸五张)。', - dcjijiao:'继椒', - dcjijiao_info:'限定技。出牌阶段,你可以令一名角色获得所有弃牌堆中你于本局游戏内使用或弃置过的普通锦囊牌,且这些牌不能被【无懈可击】响应。一名角色的回合结束后,若本回合牌堆洗过牌或有角色死亡,你重置〖继椒〗。', - duanqiaoxiao:'段巧笑', - dccaizhuang:'彩妆', - dccaizhuang_info:'出牌阶段限一次,你可以弃置任意张牌。然后若你手牌中的花色数小于你以此法弃置的牌的花色数,你摸一张牌并重复此流程。', - dchuayi:'华衣', - dchuayi_info:'结束阶段,你可以判定,然后你获得如下效果直到你下回合开始时:红色,一名角色的回合结束时,你摸一张牌;黑色,当你受到伤害后,你摸两张牌。', - wu_zhugeliang:'武诸葛亮', - wu_zhugeliang_prefix:'武', - dcjincui:'尽瘁', - dcjincui_info:'锁定技。①游戏开始时,你将手牌摸至七张。②准备阶段,你将体力值回复或失去至等同于牌堆中点数为7的牌数(你的体力值最低因此调整至1)。然后你观看牌堆顶X张牌,将这些牌以任意顺序置于牌堆顶或牌堆底(X为你的体力值)。', - dcqingshi:'情势', - dcqingshi_info:'当你于出牌阶段使用牌时,若你手牌中有同名牌且你本回合未因此牌名的牌发动过该技能,你可以选择一项:1.令此牌对其中一个目标角色造成的伤害+1;2.令任意名其他角色各摸一张牌;3.摸三张牌,然后〖情势〗于本回合无效。', - dczhizhe:'智哲', - dczhizhe_clear:'invisible', - dczhizhe_info:'限定技。出牌阶段,你可以选择一张手牌并复制之。当你使用或打出此复制牌结算结束后,你获得之,然后你本回合不能再使用或打出此牌。', - ruanji:'阮籍', - dczhaowen:'昭文', - dczhaowen_tag:'昭文', - dczhaowen_info:'出牌阶段开始时,你可以展示所有手牌。然后你于本回合获得如下效果:1.你可以将其中一张黑色牌当做任意一张普通锦囊牌使用(每回合每种牌名限一次);2.当你使用其中的一张红色牌时,你摸一张牌。', - dcjiudun:'酒遁', - dcjiudun_info:'①以你为目标的【酒】(使用方法①)的作用效果改为“目标对应的角色使用的下一张【杀】的伤害基数+1”。②当你成为其他角色使用黑色牌的目标后,若你:未处于【酒】状态,你可以摸一张牌并视为使用一张【酒】;处于【酒】状态,你可以弃置一张手牌令此牌对你无效。', - ganfurenmifuren:'甘夫人糜夫人', - dcchanjuan:'婵娟', - dcchanjuan_info:'每种牌名限两次。当你使用手牌中仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。', - dcxunbie:'殉别', - dcxunbie_info:'限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到你的下一个回合结束。', - dc_mifuren:'糜夫人', - dcguixiu:'闺秀', - dcguixiu_info:'锁定技。①回合开始时,若你于本局游戏未发动过〖闺秀①〗,你摸两张牌。②当你发动〖存嗣〗后,你回复1点体力。', - dccunsi:'存嗣', - dccunsi_info:'限定技。出牌阶段,你可以令一名角色获得〖勇决〗。若该角色不为你,你摸两张牌。', - dcyongjue:'勇决', - dcyongjue_info:'当你于出牌阶段使用第一张【杀】时,你可以选择一项:1.令此【杀】不计入次数;2.获得此牌。', - dc_ganfuren:'甘夫人', - dcshushen:'淑慎', - dcshushen_info:'当你回复1点体力后,你可以选择一名其他角色并选择一项:1.令其回复1点体力;2.你与其各摸一张牌。', - dcshenzhi:'神智', - dcshenzhi_info:'准备阶段,若你的手牌数大于体力值,你可以弃置一张手牌,然后回复1点体力。', - dc_duyu:'杜预', - dcjianguo:'谏国', - dcjianguo_info:'出牌阶段各限一次。你可以选择一名角色并选择一项:1.令其摸一张牌,然后其弃置一半的手牌;2.令其弃置一张牌,然后其摸等同于手牌数一半的牌(均向上取整)。', - dcdyqingshi:'倾势', - dcdyqingshi_info:'当你于回合内使用【杀】或普通锦囊牌指定第一个目标后,若目标角色包括其他角色且此牌为你本回合使用的第X张牌,你可以对其中一名不为你的目标角色造成1点伤害(X为你的手牌数)。', - sunlingluan:'孙翎鸾', - dclingyue:'聆乐', - dclingyue_info:'锁定技。一名角色于一轮内首次造成伤害后,你摸一张牌。若此时是该角色回合外,则改为摸X张牌(X为本回合全场造成的伤害值)。', - dcpandi:'盻睇', - dcpandi_info:'出牌阶段,你可以选择一名本回合内未造成过伤害的角色。你本阶段内使用的下一张牌改为以该角色为基准判断使用目标合法性,且使用者改为该角色。', - zhoubuyi:'周不疑', - dcshiji:'十计', - dcshiji_info:'一名角色的结束阶段,若其本回合未造成过伤害,你可以声明一种本轮未以此法声明过的普通锦囊牌,然后其可以将一张牌当你声明的牌使用(其不是此牌的合法目标)。', - dcsilun:'四论', - dcsilun_info:'准备阶段或当你受到伤害后,你可以摸四张牌,然后将四张牌依次置于场上或牌堆两端(对所有角色可见)。装备区牌数因此变化的角色复原其武将牌。', - dc_wangjun:'王濬', - dcmianyao:'免徭', - dcmianyao_info:'摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。', - dcchangqu:'长驱', - dcchangqu_info:'出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。', - dctongye:'统业', - dctongye_info:'锁定技。游戏开始时或一名角色死亡后,若场上势力数:不大于4,你的手牌上限+3;不大于3,你的攻击范围+3;不大于2,你使用【杀】的次数上限+3;不大于1,你摸牌阶段额定摸牌数+3。', - tianshangyi:'田尚衣', - dcposuo:'婆娑', - dcposuo_info:'出牌阶段,若你本阶段未对其他角色造成过伤害,则你可以将一张你本阶段未以此法使用过的花色的手牌当作任意一张存在于游戏的同花色伤害牌使用。', - dcxiaoren:'绡刃', - dcxiaoren_info:'每回合限一次,当你造成伤害后,你可以进行判定,若结果为:红色,你可以令一名角色回复1点体力,然后若其满体力,其摸一张牌;黑色,你对受伤角色的上家或下家造成1点伤害,然后你可以重复此流程直到未能执行此项或有角色进入濒死状态。', - dc_daxiaoqiao:'新杀大乔小乔', - dc_daxiaoqiao_prefix:'新杀', - dcxingwu:'星舞', - dcxingwu_info:'弃牌阶段开始时,你可以将一张手牌置于武将牌上,称为“星舞”。若你的“星舞”牌达到三张,则你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成X点伤害(X为移去的“星舞”牌的花色数,若为女性角色则改为1点伤害)。', - dcluoyan:'落雁', - dcluoyan_info:'锁定技,若你有“星舞”牌,你视为拥有技能〖天香〗和〖流离〗。', - dc_xiahouba:'新杀夏侯霸', - dc_xiahouba_prefix:'新杀', - old_huangfusong:'新杀皇甫嵩', - old_huangfusong_prefix:'新杀', - dc_sp_machao:'群马超', - dc_sp_machao_prefix:'群', - dc_shixie:'新杀士燮', - dc_shixie_prefix:'新杀', - dc_guansuo:'新杀关索', - dc_guansuo_prefix:'新杀', - dc_zhaoxiang:'新杀赵襄', - dc_zhaoxiang_prefix:'新杀', - dc_xujing:'许靖', - dcshangyu:'赏誉', - dcshangyu_tag:'赏誉', - dcshangyu_info:'锁定技。游戏开始时,你获得一张【杀】并记录之,并可以将此牌交给一名角色。然后你获得如下效果:1.当一名角色使用此牌造成伤害后,你与其各摸一张牌;2.当此牌进入弃牌堆后,你将此牌交给一名本回合未以此法得到过此牌的角色。', - dccaixia:'才瑕', - dccaixia_info:'当你造成或受到伤害后,若你没有“瑕”,你可以摸至多X张牌并获得X枚“瑕”,然后当你使用牌时,移去1枚“瑕”(X为本局游戏总角色数且至多为5)。', - wu_luxun:'武陆逊', - wu_luxun_prefix:'武', - dcxiongmu:'雄幕', - dcxiongmu_tag:'雄幕', - dcxiongmu_info:'①一轮游戏开始时,你可以将手牌摸至体力上限(若手牌数不小于体力上限则跳过),然后将任意张牌随机置入牌堆,从牌堆或弃牌堆中获得等量的点数为8的牌,且这些牌不计入手牌上限。②当你于一回合首次受到伤害时,若你的手牌数不大于你的体力值,此伤害-1。', - dczhangcai:'彰才', - dczhangcai_info:'当你使用或打出点数为8的牌时,你可以摸X张牌(X为你手牌区里点数为8的牌数且至少为1)。', - dcruxian:'儒贤', - dcruxian_info:'限定技。出牌阶段,你可以令你〖彰才〗的点数限制取消,且摸牌数改为等同于你手牌区内与此牌点数相同的牌数且至少为1,直到你的下回合开始。', - malingli:'马伶俐', - dclima:'骊马', - dclima_info:'锁定技。你计算至其他角色的距离-X(X为场上的坐骑牌数且至少为1)。', - dcxiaoyin:'硝引', - dcxiaoyin_info:'①准备阶段,你可以亮出牌堆顶的Y张牌(Y为你距离1以内的角色数),获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上,称为“硝引”。②当一名有“硝引”牌的角色受到伤害时,若此伤害为:火焰伤害,来源可以弃置其“硝引”牌包含的类型的牌,将一张对应的“硝引”置入弃牌堆,令此伤害+1;非火焰伤害,来源可以获得一张“硝引”牌,将此伤害改为火焰伤害。', - dchuahuo:'花火', - dchuahuo_info:'出牌阶段限一次。你可以将一张红色手牌当不计入次数的火【杀】使用。然后当你使用此牌指定第一个目标后,若目标角色有“硝引”牌,你可以将此【杀】的目标改为所有有“硝引”牌的角色。', - caoyi:'曹轶', - dcmiyi:'蜜饴', - dcmiyi_info:'准备阶段,你可以选择一项:1.回复1点体力;2.受到你造成的1点伤害。然后你令任意名角色执行该项。若如此做,这些角色于结束阶段执行另一项。', - dcyinjun:'寅君', - dcyinjun_info:'当你使用对应实体牌均为你的手牌的【杀】或锦囊牌结算结束后,若此牌目标为1,你可以视为对该目标使用一张无伤害来源的【杀】。然后若你本回合发动〖寅君〗的次数大于你的体力值,〖寅君〗失效直到回合结束。', - zhugeruoxue:'诸葛若雪', - dcqiongying:'琼英', - dcqiongying_info:'出牌阶段限一次。你可以移动场上的一张牌,然后你弃置一张与此牌花色相同的手牌(若没有该花色的手牌则改为展示所有手牌)。', - dcnuanhui:'暖惠', - dcnuanhui_info:'结束阶段,你可以选择一名装备区有牌的角色,其可以视为依次使用X张基本牌(X为其装备区牌数且至少为1)。若其此次以此法使用了同名牌,其弃置装备区里的所有牌。', - zhangjian:'张臶', - dc_zj_a:'技能', - dc_zj_a_info:'锁定技。当你受到牌造成的伤害时,若此牌有点数,则你将此伤害值改为此牌点数,否则你防止此伤害。', - dc_zj_b:'技能', - dc_zj_b_info:'结束阶段,你可以弃置所有牌并令一名其他角色获得〖技能〗直到你的下个回合开始。', - dc_sb_lusu:'新杀谋鲁肃', - dc_sb_lusu_prefix:'新杀谋', - dcsbmingshi:'明势', - dcsbmingshi_info:'摸牌阶段,你可以多摸两张牌,然后展示三张牌并令一名其他角色选择获得其中的一张牌。', - dcsbmengmou:'盟谋', - dcsbmengmou_info:'转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)', - dc_sb_zhouyu:'新杀谋周瑜', - dc_sb_zhouyu_prefix:'新杀谋', - dcsbronghuo:'融火', - dcsbronghuo_info:'锁定技,当你使用火【杀】或【火攻】时,此牌伤害基值改为场上势力数。', - dcsbyingmou:'英谋', - dcsbyingmou_info:'转换技,每回合限一次,当你使用牌指定其他角色为目标后,你可以选择一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。', - caoxian:'曹宪', - dclingxi:'灵犀', - dclingxi_info:'出牌阶段开始和结束时,你可以将至多X张牌称为“翼”置于你的武将牌上(X为你的体力上限)。当你失去武将牌上的“翼”时,你将手牌数调整至Y张(Y为你武将牌上的“翼”所含有的花色数的两倍)。', - dczhifou:'知否', - dczhifou_info:'当你使用牌结算完毕后,你可以移去至少X张武将牌上的“翼”(X为本回合此前发动此技能的次数+1),然后选择一名角色并选择一项令其执行(每个选项每回合限选择一次):①将一张牌称为“翼”置于你的武将牌上;②弃置两张牌;③失去1点体力。', - dc_qinghegongzhu:'新杀清河公主', - dc_qinghegongzhu_prefix:'新杀', - dczhangji:'长姬', - dczhangji_info:'锁定技,一名角色使用多目标牌时,若你是此牌的目标之一,则你先结算此牌的效果,然后你摸X张牌(X为此牌的其他目标数)。', - dczengou:'谮构', - dczengou_info:'出牌阶段限一次,你可以将至多体力上限张牌称为“谮构”交给一名其他角色并摸等量张牌。若如此做,其下次体力值增加或使用牌结算完毕后,其展示所有手牌,然后失去Y点体力(Y为其手牌中的“谮构”牌数)。', - bailingyun:'柏灵筠', - dclinghui:'灵慧', - dclinghui_info:'一名角色的结束阶段,若当前回合角色为你或本回合有角色进入过濒死状态,则你可以观看牌堆顶的三张牌,然后你可以使用其中一张牌并随机获得其中一张剩余牌。', - dcxiace:'黠策', - dcxiace_info:'每回合每项各限一次。当你造成/受到伤害后,你可以弃置一张牌并回复1点体力/令一名其他角色的非锁定技于本回合失效。', - dcyuxin:'御心', - dcyuxin_info:'限定技,一名角色进入濒死状态时,你可以令其将体力回复至X点(X为1,若该角色不为你则X为你的体力值)。', - zhugemengxue:'诸葛梦雪', - dcjichun:'寄春', - dcjichun_info:'出牌阶段限一次,你可以展示一张手牌并选择一项:①将此牌交给一名手牌数小于你的角色,然后摸X张牌。②弃置此牌并弃置一名手牌数大于你的角色区域里至多X张牌。(X为此牌牌名字数)', - dchanying:'寒英', - dchanying_info:'准备阶段,你可以亮出牌堆里的一张非赠物装备牌,然后令一名手牌数等于你的角色使用此牌。', - huzun:'胡遵', - dczhantao:'斩涛', - dczhantao_info:'当你或你攻击范围内的角色受到伤害后,若你不为伤害来源,你可以判定,若造成此伤害的渠道为牌且此牌有点数且判定结果点数大于此牌的点数,你视为对来源使用一张【杀】。', - dcanjing:'安境', - dcanjing_info:'每回合限一次。当你造成伤害后,你可以令至多X名已受伤的角色各摸一张牌,然后其中体力值最少的角色回复1点体力(X为你本局游戏发动〖安境〗的次数)。', - cuimao:'崔琰毛玠', - zhengbi:'征辟', - zhengbi_info:'出牌阶段开始时,你可以选择一名其他角色并选择一项:①本阶段结束时,若其本阶段得到过牌,则你获得其手牌区和装备区各一张牌;②将一张基本牌交给该角色,然后其交给你一张非基本牌或两张基本牌。', - fengying:'奉迎', - fengying_info:'限定技,出牌阶段,你可以弃置所有手牌。若如此做,你于本回合结束后进行一个额外回合,此额外回合开始时,若你的体力值为全场最低,则你将手牌数摸至体力上限。', - lvfan:'吕范', - diaodu:'调度', - diaodu_info:'出牌阶段开始时,或当你发动〖典财〗后,你可以获得一名距离不大于1的一名角色A装备区里的一张牌,然后你将此牌交给另一名角色B,然后B选择是否使用此牌,若B使用/不使用,则你/B摸一张牌。', - diancai:'典财', - diancai_info:'其他角色的出牌阶段结束时,若你于此阶段失去了至少X张牌,则你可以将手牌摸至体力上限(X为你的体力值且X至多为5)。', - chendong:'陈武董袭', - dcduanxie:'断绁', - dcduanxie_info:'出牌阶段限一次,你可以令一名其他角色横置,然后你横置。', - dc_sb_simayi:'新杀谋司马懿', - dc_sb_simayi_prefix:'新杀谋', - dcsbquanmou:'权谋', - dcsbquanmou_info:'转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。', - dcsbpingliao:'平辽', - dcsbpingliao_info:'锁定技。当你声明使用【杀】时,你令此【杀】的目标对其他角色不可见,且你令攻击范围内的其他角色依次选择是否打出一张红色基本牌。所有角色选择完成后,此牌的目标角色中没有以此法打出牌的角色本回合内无法使用或打出手牌;若有不为此牌目标的角色以此法打出了牌,则你摸两张牌,且你本回合使用【杀】的次数上限+1。', - caofang:'曹芳', - dczhimin:'置民', - dczhimin_tag:'民', - dczhimin_info:'锁定技。①一轮游戏开始时,你选择至多X名其他角色(X为你的体力值),获得这些角色各自手牌中的随机一张点数最小的牌。②当你于你的回合外得到牌后,你将这些牌标记为“民”。③当你失去“民”后,你将手牌补至体力上限。', - dcjujian:'拒谏', - dcjujian_info:'主公技。出牌阶段限一次,你可以令一名其他魏势力角色摸一张牌,然后你令其于本轮内使用的普通锦囊牌对你无效。', - wu_guanyu:'武关羽', - wu_guanyu_prefix:'武', - dcjuewu:'绝武', - dcjuewu_two:'2点', - dcjuewu_info:'①每回合每种牌名限一次。你可以将一张点数为2的牌当任意伤害类牌使用(包括【水淹七军】)。②当你得到其他角色区域内的牌后,你令这些牌的点数均视为2直到你失去这些牌。', - dcwuyou:'武佑', - dcwuyou_info:'①出牌阶段限一次。你可以选择一张手牌,从系统随机生成的五个非装备牌牌名中选择一个,令此牌的牌名与属性视为与你选择的相同。②其他角色的出牌阶段限一次。其可以交给你一张手牌,你从系统随机生成的五个非装备牌牌名中选择一个,然后交给其一张手牌,令此牌的牌名与属性视为与你选择的相同(一名角色使用〖武佑〗转化的牌无距离且无任何次数限制)。', - dcyixian:'义贤', - dcyixian_info:'限定技。出牌阶段,你可以选择一项:⒈获得场上的所有装备牌;⒉获得弃牌堆中的所有装备牌。然后你依次选择是否令被你以此法获得牌的角色摸X张牌并回复1点体力(X为其以此法失去的牌数)。', - shuiyanqijuny:'水淹七军', - shuiyanqijuny_info:'出牌阶段,对至多两名角色使用。目标角色受到1点雷属性伤害,然后若其:是此牌的使用者选择的第一个目标,其弃置一张牌;不是第一个目标,其摸一张牌。', - sp_zhenji:'SP甄宓', - sp_zhenji_prefix:'SP', - dcjijie:'己诫', - dcjijie_info:'锁定技。每回合每项各限一次,其他角色于其回合外得到牌后/回复体力后,你摸等量的牌/回复等量的体力。', - dchuiji:'惠济', - dchuiji_info:'出牌阶段限一次。你可以令一名角色摸两张牌或从牌堆中随机使用一张不为赠物的装备牌,然后若其手牌数不小于存活角色数,其视为使用一张【五谷丰登】。系统不于此牌使用准备工作结束时执行亮出牌堆顶的牌的动作,改为你令其将所有手牌置于处理区,然后令所有目标角色依次获得其中一张牌。当这些牌因执行【五谷丰登】的执行动作而置于弃牌堆后,你令其获得这些牌。', + dclingyin_info: + "出牌阶段开始时,你可以选择至多X张“妄”(X为游戏轮数),若这些牌以外的“妄”中不存在颜色不同的牌,则你于本回合对其他角色造成的伤害+1,且可以将一张武器牌或防具牌当【决斗】使用。你获得这些牌。", + dcliying: "俐影", + dcliying_info: + "每回合限一次。当你于摸牌阶段外得到牌后,你可以将这些牌中的任意张交给一名其他角色,然后摸一张牌。", + huanfan: "桓范", + dcjianzheng: "谏诤", + dcjianzheng_info: + "出牌阶段限一次。你可以观看一名其他角色的手牌,然后若其中有你可以使用的手牌,你获得并使用其中一张。若你以此法使用牌指定了其为目标,你令你与其横置,然后其观看你的手牌。", + dcfumou: "腹谋", + dcfumou_info: + "当你受到伤害后,你可以令至多X名角色从你开始逆时针依次选择一项:1.移动场上的一张牌;2.弃置所有手牌并摸两张牌;3.弃置装备区里的所有牌并回复1点体力(X为你已损失的体力值)。", + chentai: "陈泰", + dcctjiuxian: "救陷", + dcctjiuxian_info: + "出牌阶段限一次。你可以重铸一半数量的手牌(向上取整),然后视为使用一张【决斗】。当此牌对目标角色造成伤害后,你可以令其攻击范围内的一名其他角色回复1点体力。", + dcchenyong: "沉勇", + dcchenyong_info: "结束阶段,你可以摸X张牌(X为本回合你使用过的牌的类型数)。", + sunyu: "孙瑜", + dcquanshou: "劝守", + dcquanshou_info: + "一名角色的回合开始时,若其手牌数不大于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。", + dcshexue: "设学", + dcshexue_info: + "①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。", + xizheng: "郤正", + dcdanyi: "耽意", + dcdanyi_info: + "当你使用牌指定第一个目标后,你可以摸X张牌(X为此牌目标数与你使用的上一张牌相同的目标数)。", + dcwencan: "文灿", + dcwencan_info: + "出牌阶段限一次。你可以选择至多两名体力值不同的其他角色,这些角色依次选择一项:1.弃置两张花色不同的牌;2.本回合你对其使用牌无距离和次数限制。", + zhangjinyun: "张瑾云", + dchuizhi: "蕙质", + dchuizhi_info: + "准备阶段,你可以选择是否弃置任意张手牌,然后将手牌摸至与全场手牌数最多的角色相同(至少摸一张,至多摸五张)。", + dcjijiao: "继椒", + dcjijiao_info: + "限定技。出牌阶段,你可以令一名角色获得所有弃牌堆中你于本局游戏内使用或弃置过的普通锦囊牌,且这些牌不能被【无懈可击】响应。一名角色的回合结束后,若本回合牌堆洗过牌或有角色死亡,你重置〖继椒〗。", + duanqiaoxiao: "段巧笑", + dccaizhuang: "彩妆", + dccaizhuang_info: + "出牌阶段限一次,你可以弃置任意张牌。然后若你手牌中的花色数小于你以此法弃置的牌的花色数,你摸一张牌并重复此流程。", + dchuayi: "华衣", + dchuayi_info: + "结束阶段,你可以判定,然后你获得如下效果直到你下回合开始时:红色,一名角色的回合结束时,你摸一张牌;黑色,当你受到伤害后,你摸两张牌。", + wu_zhugeliang: "武诸葛亮", + wu_zhugeliang_prefix: "武", + dcjincui: "尽瘁", + dcjincui_info: + "锁定技。①游戏开始时,你将手牌摸至七张。②准备阶段,你将体力值回复或失去至等同于牌堆中点数为7的牌数(你的体力值最低因此调整至1)。然后你观看牌堆顶X张牌,将这些牌以任意顺序置于牌堆顶或牌堆底(X为你的体力值)。", + dcqingshi: "情势", + dcqingshi_info: + "当你于出牌阶段使用牌时,若你手牌中有同名牌且你本回合未因此牌名的牌发动过该技能,你可以选择一项:1.令此牌对其中一个目标角色造成的伤害+1;2.令任意名其他角色各摸一张牌;3.摸三张牌,然后〖情势〗于本回合无效。", + dczhizhe: "智哲", + dczhizhe_clear: "invisible", + dczhizhe_info: + "限定技。出牌阶段,你可以选择一张手牌并复制之。当你使用或打出此复制牌结算结束后,你获得之,然后你本回合不能再使用或打出此牌。", + ruanji: "阮籍", + dczhaowen: "昭文", + dczhaowen_tag: "昭文", + dczhaowen_info: + "出牌阶段开始时,你可以展示所有手牌。然后你于本回合获得如下效果:1.你可以将其中一张黑色牌当做任意一张普通锦囊牌使用(每回合每种牌名限一次);2.当你使用其中的一张红色牌时,你摸一张牌。", + dcjiudun: "酒遁", + dcjiudun_info: + "①以你为目标的【酒】(使用方法①)的作用效果改为“目标对应的角色使用的下一张【杀】的伤害基数+1”。②当你成为其他角色使用黑色牌的目标后,若你:未处于【酒】状态,你可以摸一张牌并视为使用一张【酒】;处于【酒】状态,你可以弃置一张手牌令此牌对你无效。", + ganfurenmifuren: "甘夫人糜夫人", + dcchanjuan: "婵娟", + dcchanjuan_info: + "每种牌名限两次。当你使用手牌中仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。", + dcxunbie: "殉别", + dcxunbie_info: + "限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到你的下一个回合结束。", + dc_mifuren: "糜夫人", + dcguixiu: "闺秀", + dcguixiu_info: + "锁定技。①回合开始时,若你于本局游戏未发动过〖闺秀①〗,你摸两张牌。②当你发动〖存嗣〗后,你回复1点体力。", + dccunsi: "存嗣", + dccunsi_info: "限定技。出牌阶段,你可以令一名角色获得〖勇决〗。若该角色不为你,你摸两张牌。", + dcyongjue: "勇决", + dcyongjue_info: + "当你于出牌阶段使用第一张【杀】时,你可以选择一项:1.令此【杀】不计入次数;2.获得此牌。", + dc_ganfuren: "甘夫人", + dcshushen: "淑慎", + dcshushen_info: + "当你回复1点体力后,你可以选择一名其他角色并选择一项:1.令其回复1点体力;2.你与其各摸一张牌。", + dcshenzhi: "神智", + dcshenzhi_info: "准备阶段,若你的手牌数大于体力值,你可以弃置一张手牌,然后回复1点体力。", + dc_duyu: "杜预", + dcjianguo: "谏国", + dcjianguo_info: + "出牌阶段各限一次。你可以选择一名角色并选择一项:1.令其摸一张牌,然后其弃置一半的手牌;2.令其弃置一张牌,然后其摸等同于手牌数一半的牌(均向上取整)。", + dcdyqingshi: "倾势", + dcdyqingshi_info: + "当你于回合内使用【杀】或普通锦囊牌指定第一个目标后,若目标角色包括其他角色且此牌为你本回合使用的第X张牌,你可以对其中一名不为你的目标角色造成1点伤害(X为你的手牌数)。", + sunlingluan: "孙翎鸾", + dclingyue: "聆乐", + dclingyue_info: + "锁定技。一名角色于一轮内首次造成伤害后,你摸一张牌。若此时是该角色回合外,则改为摸X张牌(X为本回合全场造成的伤害值)。", + dcpandi: "盻睇", + dcpandi_info: + "出牌阶段,你可以选择一名本回合内未造成过伤害的角色。你本阶段内使用的下一张牌改为以该角色为基准判断使用目标合法性,且使用者改为该角色。", + zhoubuyi: "周不疑", + dcshiji: "十计", + dcshiji_info: + "一名角色的结束阶段,若其本回合未造成过伤害,你可以声明一种本轮未以此法声明过的普通锦囊牌,然后其可以将一张牌当你声明的牌使用(其不是此牌的合法目标)。", + dcsilun: "四论", + dcsilun_info: + "准备阶段或当你受到伤害后,你可以摸四张牌,然后将四张牌依次置于场上或牌堆两端(对所有角色可见)。装备区牌数因此变化的角色复原其武将牌。", + dc_wangjun: "王濬", + dcmianyao: "免徭", + dcmianyao_info: + "摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。", + dcchangqu: "长驱", + dcchangqu_info: + "出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。", + dctongye: "统业", + dctongye_info: + "锁定技。游戏开始时或一名角色死亡后,若场上势力数:不大于4,你的手牌上限+3;不大于3,你的攻击范围+3;不大于2,你使用【杀】的次数上限+3;不大于1,你摸牌阶段额定摸牌数+3。", + tianshangyi: "田尚衣", + dcposuo: "婆娑", + dcposuo_info: + "出牌阶段,若你本阶段未对其他角色造成过伤害,则你可以将一张你本阶段未以此法使用过的花色的手牌当作任意一张存在于游戏的同花色伤害牌使用。", + dcxiaoren: "绡刃", + dcxiaoren_info: + "每回合限一次,当你造成伤害后,你可以进行判定,若结果为:红色,你可以令一名角色回复1点体力,然后若其满体力,其摸一张牌;黑色,你对受伤角色的上家或下家造成1点伤害,然后你可以重复此流程直到未能执行此项或有角色进入濒死状态。", + dc_daxiaoqiao: "新杀大乔小乔", + dc_daxiaoqiao_prefix: "新杀", + dcxingwu: "星舞", + dcxingwu_info: + "弃牌阶段开始时,你可以将一张手牌置于武将牌上,称为“星舞”。若你的“星舞”牌达到三张,则你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成X点伤害(X为移去的“星舞”牌的花色数,若为女性角色则改为1点伤害)。", + dcluoyan: "落雁", + dcluoyan_info: "锁定技,若你有“星舞”牌,你视为拥有技能〖天香〗和〖流离〗。", + dc_xiahouba: "新杀夏侯霸", + dc_xiahouba_prefix: "新杀", + old_huangfusong: "新杀皇甫嵩", + old_huangfusong_prefix: "新杀", + dc_sp_machao: "群马超", + dc_sp_machao_prefix: "群", + dc_shixie: "新杀士燮", + dc_shixie_prefix: "新杀", + dc_guansuo: "新杀关索", + dc_guansuo_prefix: "新杀", + dc_zhaoxiang: "新杀赵襄", + dc_zhaoxiang_prefix: "新杀", + dc_xujing: "许靖", + dcshangyu: "赏誉", + dcshangyu_tag: "赏誉", + dcshangyu_info: + "锁定技。游戏开始时,你获得一张【杀】并记录之,并可以将此牌交给一名角色。然后你获得如下效果:1.当一名角色使用此牌造成伤害后,你与其各摸一张牌;2.当此牌进入弃牌堆后,你将此牌交给一名本回合未以此法得到过此牌的角色。", + dccaixia: "才瑕", + dccaixia_info: + "当你造成或受到伤害后,若你没有“瑕”,你可以摸至多X张牌并获得X枚“瑕”,然后当你使用牌时,移去1枚“瑕”(X为本局游戏总角色数且至多为5)。", + wu_luxun: "武陆逊", + wu_luxun_prefix: "武", + dcxiongmu: "雄幕", + dcxiongmu_tag: "雄幕", + dcxiongmu_info: + "①一轮游戏开始时,你可以将手牌摸至体力上限(若手牌数不小于体力上限则跳过),然后将任意张牌随机置入牌堆,从牌堆或弃牌堆中获得等量的点数为8的牌,且这些牌不计入手牌上限。②当你于一回合首次受到伤害时,若你的手牌数不大于你的体力值,此伤害-1。", + dczhangcai: "彰才", + dczhangcai_info: + "当你使用或打出点数为8的牌时,你可以摸X张牌(X为你手牌区里点数为8的牌数且至少为1)。", + dcruxian: "儒贤", + dcruxian_info: + "限定技。出牌阶段,你可以令你〖彰才〗的点数限制取消,且摸牌数改为等同于你手牌区内与此牌点数相同的牌数且至少为1,直到你的下回合开始。", + malingli: "马伶俐", + dclima: "骊马", + dclima_info: "锁定技。你计算至其他角色的距离-X(X为场上的坐骑牌数且至少为1)。", + dcxiaoyin: "硝引", + dcxiaoyin_info: + "①准备阶段,你可以亮出牌堆顶的Y张牌(Y为你距离1以内的角色数),获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上,称为“硝引”。②当一名有“硝引”牌的角色受到伤害时,若此伤害为:火焰伤害,来源可以弃置其“硝引”牌包含的类型的牌,将一张对应的“硝引”置入弃牌堆,令此伤害+1;非火焰伤害,来源可以获得一张“硝引”牌,将此伤害改为火焰伤害。", + dchuahuo: "花火", + dchuahuo_info: + "出牌阶段限一次。你可以将一张红色手牌当不计入次数的火【杀】使用。然后当你使用此牌指定第一个目标后,若目标角色有“硝引”牌,你可以将此【杀】的目标改为所有有“硝引”牌的角色。", + caoyi: "曹轶", + dcmiyi: "蜜饴", + dcmiyi_info: + "准备阶段,你可以选择一项:1.回复1点体力;2.受到你造成的1点伤害。然后你令任意名角色执行该项。若如此做,这些角色于结束阶段执行另一项。", + dcyinjun: "寅君", + dcyinjun_info: + "当你使用对应实体牌均为你的手牌的【杀】或锦囊牌结算结束后,若此牌目标为1,你可以视为对该目标使用一张无伤害来源的【杀】。然后若你本回合发动〖寅君〗的次数大于你的体力值,〖寅君〗失效直到回合结束。", + zhugeruoxue: "诸葛若雪", + dcqiongying: "琼英", + dcqiongying_info: + "出牌阶段限一次。你可以移动场上的一张牌,然后你弃置一张与此牌花色相同的手牌(若没有该花色的手牌则改为展示所有手牌)。", + dcnuanhui: "暖惠", + dcnuanhui_info: + "结束阶段,你可以选择一名装备区有牌的角色,其可以视为依次使用X张基本牌(X为其装备区牌数且至少为1)。若其此次以此法使用了同名牌,其弃置装备区里的所有牌。", + zhangjian: "张臶", + dc_zj_a: "技能", + dc_zj_a_info: + "锁定技。当你受到牌造成的伤害时,若此牌有点数,则你将此伤害值改为此牌点数,否则你防止此伤害。", + dc_zj_b: "技能", + dc_zj_b_info: "结束阶段,你可以弃置所有牌并令一名其他角色获得〖技能〗直到你的下个回合开始。", + dc_sb_lusu: "新杀谋鲁肃", + dc_sb_lusu_prefix: "新杀谋", + dcsbmingshi: "明势", + dcsbmingshi_info: + "摸牌阶段,你可以多摸两张牌,然后展示三张牌并令一名其他角色选择获得其中的一张牌。", + dcsbmengmou: "盟谋", + dcsbmengmou_info: + "转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)", + dc_sb_zhouyu: "新杀谋周瑜", + dc_sb_zhouyu_prefix: "新杀谋", + dcsbronghuo: "融火", + dcsbronghuo_info: "锁定技,当你使用火【杀】或【火攻】时,此牌伤害基值改为场上势力数。", + dcsbyingmou: "英谋", + dcsbyingmou_info: + "转换技,每回合限一次,当你使用牌指定其他角色为目标后,你可以选择一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。", + caoxian: "曹宪", + dclingxi: "灵犀", + dclingxi_info: + "出牌阶段开始和结束时,你可以将至多X张牌称为“翼”置于你的武将牌上(X为你的体力上限)。当你失去武将牌上的“翼”时,你将手牌数调整至Y张(Y为你武将牌上的“翼”所含有的花色数的两倍)。", + dczhifou: "知否", + dczhifou_info: + "当你使用牌结算完毕后,你可以移去至少X张武将牌上的“翼”(X为本回合此前发动此技能的次数+1),然后选择一名角色并选择一项令其执行(每个选项每回合限选择一次):①将一张牌称为“翼”置于你的武将牌上;②弃置两张牌;③失去1点体力。", + dc_qinghegongzhu: "新杀清河公主", + dc_qinghegongzhu_prefix: "新杀", + dczhangji: "长姬", + dczhangji_info: + "锁定技,一名角色使用多目标牌时,若你是此牌的目标之一,则你先结算此牌的效果,然后你摸X张牌(X为此牌的其他目标数)。", + dczengou: "谮构", + dczengou_info: + "出牌阶段限一次,你可以将至多体力上限张牌称为“谮构”交给一名其他角色并摸等量张牌。若如此做,其下次体力值增加或使用牌结算完毕后,其展示所有手牌,然后失去Y点体力(Y为其手牌中的“谮构”牌数)。", + bailingyun: "柏灵筠", + dclinghui: "灵慧", + dclinghui_info: + "一名角色的结束阶段,若当前回合角色为你或本回合有角色进入过濒死状态,则你可以观看牌堆顶的三张牌,然后你可以使用其中一张牌并随机获得其中一张剩余牌。", + dcxiace: "黠策", + dcxiace_info: + "每回合每项各限一次。当你造成/受到伤害后,你可以弃置一张牌并回复1点体力/令一名其他角色的非锁定技于本回合失效。", + dcyuxin: "御心", + dcyuxin_info: + "限定技,一名角色进入濒死状态时,你可以令其将体力回复至X点(X为1,若该角色不为你则X为你的体力值)。", + zhugemengxue: "诸葛梦雪", + dcjichun: "寄春", + dcjichun_info: + "出牌阶段限一次,你可以展示一张手牌并选择一项:①将此牌交给一名手牌数小于你的角色,然后摸X张牌。②弃置此牌并弃置一名手牌数大于你的角色区域里至多X张牌。(X为此牌牌名字数)", + dchanying: "寒英", + dchanying_info: + "准备阶段,你可以亮出牌堆里的一张非赠物装备牌,然后令一名手牌数等于你的角色使用此牌。", + huzun: "胡遵", + dczhantao: "斩涛", + dczhantao_info: + "当你或你攻击范围内的角色受到伤害后,若你不为伤害来源,你可以判定,若造成此伤害的渠道为牌且此牌有点数且判定结果点数大于此牌的点数,你视为对来源使用一张【杀】。", + dcanjing: "安境", + dcanjing_info: + "每回合限一次。当你造成伤害后,你可以令至多X名已受伤的角色各摸一张牌,然后其中体力值最少的角色回复1点体力(X为你本局游戏发动〖安境〗的次数)。", + cuimao: "崔琰毛玠", + zhengbi: "征辟", + zhengbi_info: + "出牌阶段开始时,你可以选择一名其他角色并选择一项:①本阶段结束时,若其本阶段得到过牌,则你获得其手牌区和装备区各一张牌;②将一张基本牌交给该角色,然后其交给你一张非基本牌或两张基本牌。", + fengying: "奉迎", + fengying_info: + "限定技,出牌阶段,你可以弃置所有手牌。若如此做,你于本回合结束后进行一个额外回合,此额外回合开始时,若你的体力值为全场最低,则你将手牌数摸至体力上限。", + lvfan: "吕范", + diaodu: "调度", + diaodu_info: + "出牌阶段开始时,或当你发动〖典财〗后,你可以获得一名距离不大于1的一名角色A装备区里的一张牌,然后你将此牌交给另一名角色B,然后B选择是否使用此牌,若B使用/不使用,则你/B摸一张牌。", + diancai: "典财", + diancai_info: + "其他角色的出牌阶段结束时,若你于此阶段失去了至少X张牌,则你可以将手牌摸至体力上限(X为你的体力值且X至多为5)。", + chendong: "陈武董袭", + dcduanxie: "断绁", + dcduanxie_info: "出牌阶段限一次,你可以令一名其他角色横置,然后你横置。", + dc_sb_simayi: "新杀谋司马懿", + dc_sb_simayi_prefix: "新杀谋", + dcsbquanmou: "权谋", + dcsbquanmou_info: + "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。", + dcsbpingliao: "平辽", + dcsbpingliao_info: + "锁定技。当你声明使用【杀】时,你令此【杀】的目标对其他角色不可见,且你令攻击范围内的其他角色依次选择是否打出一张红色基本牌。所有角色选择完成后,此牌的目标角色中没有以此法打出牌的角色本回合内无法使用或打出手牌;若有不为此牌目标的角色以此法打出了牌,则你摸两张牌,且你本回合使用【杀】的次数上限+1。", + caofang: "曹芳", + dczhimin: "置民", + dczhimin_tag: "民", + dczhimin_info: + "锁定技。①一轮游戏开始时,你选择至多X名其他角色(X为你的体力值),获得这些角色各自手牌中的随机一张点数最小的牌。②当你于你的回合外得到牌后,你将这些牌标记为“民”。③当你失去“民”后,你将手牌补至体力上限。", + dcjujian: "拒谏", + dcjujian_info: + "主公技。出牌阶段限一次,你可以令一名其他魏势力角色摸一张牌,然后你令其于本轮内使用的普通锦囊牌对你无效。", + wu_guanyu: "武关羽", + wu_guanyu_prefix: "武", + dcjuewu: "绝武", + dcjuewu_two: "2点", + dcjuewu_info: + "①每回合每种牌名限一次。你可以将一张点数为2的牌当任意伤害类牌使用(包括【水淹七军】)。②当你得到其他角色区域内的牌后,你令这些牌的点数均视为2直到你失去这些牌。", + dcwuyou: "武佑", + dcwuyou_info: + "①出牌阶段限一次。你可以选择一张手牌,从系统随机生成的五个非装备牌牌名中选择一个,令此牌的牌名与属性视为与你选择的相同。②其他角色的出牌阶段限一次。其可以交给你一张手牌,你从系统随机生成的五个非装备牌牌名中选择一个,然后交给其一张手牌,令此牌的牌名与属性视为与你选择的相同(一名角色使用〖武佑〗转化的牌无距离且无任何次数限制)。", + dcyixian: "义贤", + dcyixian_info: + "限定技。出牌阶段,你可以选择一项:⒈获得场上的所有装备牌;⒉获得弃牌堆中的所有装备牌。然后你依次选择是否令被你以此法获得牌的角色摸X张牌并回复1点体力(X为其以此法失去的牌数)。", + shuiyanqijuny: "水淹七军", + shuiyanqijuny_info: + "出牌阶段,对至多两名角色使用。目标角色受到1点雷属性伤害,然后若其:是此牌的使用者选择的第一个目标,其弃置一张牌;不是第一个目标,其摸一张牌。", + sp_zhenji: "SP甄宓", + sp_zhenji_prefix: "SP", + dcjijie: "己诫", + dcjijie_info: + "锁定技。每回合每项各限一次,其他角色于其回合外得到牌后/回复体力后,你摸等量的牌/回复等量的体力。", + dchuiji: "惠济", + dchuiji_info: + "出牌阶段限一次。你可以令一名角色摸两张牌或从牌堆中随机使用一张不为赠物的装备牌,然后若其手牌数不小于存活角色数,其视为使用一张【五谷丰登】。系统不于此牌使用准备工作结束时执行亮出牌堆顶的牌的动作,改为你令其将所有手牌置于处理区,然后令所有目标角色依次获得其中一张牌。当这些牌因执行【五谷丰登】的执行动作而置于弃牌堆后,你令其获得这些牌。", - sp2_yinyu:'隐山之玉', - sp2_huben:'百战虎贲', - sp2_shengun:'奇人异士', - sp2_huangjia:'皇家贵胄', - sp2_zhangtai:'章台春望', - sp2_jinse:'锦瑟良缘', - sp2_bizhe:'笔舌如椽', - sp2_wangzhe:'往者可荐', - sp2_doukou:'豆蔻梢头', - sp2_jichu:'计将安出', - sp2_yuxiu:'钟灵毓秀', - sp2_wumiao:'武庙', - sp2_gaoshan:'高山仰止', - sp2_qifu:'祈福', - sp2_mouding:'谋定天下', + sp2_yinyu: "隐山之玉", + sp2_huben: "百战虎贲", + sp2_shengun: "奇人异士", + sp2_huangjia: "皇家贵胄", + sp2_zhangtai: "章台春望", + sp2_jinse: "锦瑟良缘", + sp2_bizhe: "笔舌如椽", + sp2_wangzhe: "往者可荐", + sp2_doukou: "豆蔻梢头", + sp2_jichu: "计将安出", + sp2_yuxiu: "钟灵毓秀", + sp2_wumiao: "武庙", + sp2_gaoshan: "高山仰止", + sp2_qifu: "祈福", + sp2_mouding: "谋定天下", }, }; }); diff --git a/character/xianjian.js b/character/xianjian.js index 20c028da2..26f03d652 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -1,4376 +1,4665 @@ -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'); - target.storage.yuexing2=player; - target.addTempSkill('yuexing2'); - }, - 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&¤t!=player&¤t!=target){ - return -get.sgn(get.attitude(player,current)); - } - }); - var num2=game.countPlayer(function(current){ - if(get.distance(player,current)<=1&¤t!=player&¤t!=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&¤t!=target&¤t!=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&¤t!=player&¤t!=target){ - return -get.sgn(get.attitude(player,current)); - } - }); - if(target.hp==1){ - num+=2; - } - if(target.hp1&&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=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;i0; - }, - 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=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=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;i1){ - 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;i1){ - list=list.randomGets(player.storage.yujia); - for(var i=0;i0&&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;j0){ - 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;i2&& - get.recoverEffect(players[i],player,player)>0){ - if(players[i].hp==1){ - if(player.hp=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=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)&¤t!=player; - }); - }, - content:function(){ - 'step 0' - event.targets=game.filterPlayer(function(current){ - return current.canUse('sha',trigger.target,false)&¤t!=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&¤t.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;i2||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&¤t!=event.target&¤t.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&¤t!=trigger.target&¤t.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;i0){ - 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;i0){ - 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;i0&&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=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=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;i0){ - 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;i0; - }, - 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;i0; - }, - 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&¤t.isDamaged(); - }); - }, - content:function(){ - 'step 0' - player.chooseTarget('灵愈:令一名其他角色回复1点体力',function(card,player,target){ - return target!=player&&target.hp0; - }, - 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;i0){ - 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;i1) 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;i0; - }, - 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;i0) 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.hpplayer.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;i0){ - return [1,3]; - } - } - } - } - } - } - }, - xshuangren:{ - trigger:{player:['loseEnd']}, - filter:function(event,player){ - if(!player.equiping) return false; - for(var i=0;i0; - }, - 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;i7&&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=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'})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=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.hp0){ - 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.num1){ - return 11-get.equipValue(card); - } - if(player.countCards('h')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= 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"); + target.storage.yuexing2 = player; + target.addTempSkill("yuexing2"); + }, + 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点体力。", + }, + }; +}); diff --git a/character/xinghuoliaoyuan.js b/character/xinghuoliaoyuan.js index 9b4fa6936..18a5923a6 100755 --- a/character/xinghuoliaoyuan.js +++ b/character/xinghuoliaoyuan.js @@ -1,1753 +1,1998 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'xinghuoliaoyuan', - connect:true, - character:{ - wangcan:["male","qun",3,["xinfu_sanwen","xinfu_qiai","xinfu_denglou"]], - sp_taishici:["male","qun",4,["xinfu_jixu"]], - re_jsp_pangtong:["male","wu",3,["xinfu_guolun","xinfu_songsang"]], - lvdai:["male","wu",4,["xinfu_qinguo"]], - re_zhangliang:["male","qun",4,["xinfu_jijun","xinfu_fangtong"]], - lvqian:["male","wei",4,["xinfu_weilu","xinfu_zengdao"]], - panjun:["male","wu",3,["xinfu_guanwei","xinfu_gongqing"]], - duji:["male","wei",3,["xinfu_andong","xinfu_yingshi"]], - zhoufang:["male","wu",3,["xinfu_duanfa","xinfu_youdi"]], - yanjun:["male","wu",3,["xinfu_guanchao","xinfu_xunxian"]], - liuyao:["male","qun",4,["xinfu_kannan",'twniju'],['zhu']], - liuyan:["male","qun",3,["xinfu_tushe","xinfu_limu"]], + name: "xinghuoliaoyuan", + connect: true, + character: { + wangcan: ["male", "qun", 3, ["xinfu_sanwen", "xinfu_qiai", "xinfu_denglou"]], + sp_taishici: ["male", "qun", 4, ["xinfu_jixu"]], + re_jsp_pangtong: ["male", "wu", 3, ["xinfu_guolun", "xinfu_songsang"]], + lvdai: ["male", "wu", 4, ["xinfu_qinguo"]], + re_zhangliang: ["male", "qun", 4, ["xinfu_jijun", "xinfu_fangtong"]], + lvqian: ["male", "wei", 4, ["xinfu_weilu", "xinfu_zengdao"]], + panjun: ["male", "wu", 3, ["xinfu_guanwei", "xinfu_gongqing"]], + duji: ["male", "wei", 3, ["xinfu_andong", "xinfu_yingshi"]], + zhoufang: ["male", "wu", 3, ["xinfu_duanfa", "xinfu_youdi"]], + yanjun: ["male", "wu", 3, ["xinfu_guanchao", "xinfu_xunxian"]], + liuyao: ["male", "qun", 4, ["xinfu_kannan", "twniju"], ["zhu"]], + liuyan: ["male", "qun", 3, ["xinfu_tushe", "xinfu_limu"]], }, - characterSort:{ - xinghuoliaoyuan:{ + characterSort: { + xinghuoliaoyuan: { // xinghuoliaoyuan_tianfu:[], - xinghuoliaoyuan_tianliang:['duji','liuyan','yanjun'], - xinghuoliaoyuan_tianji:['panjun','wangcan'], - xinghuoliaoyuan_tiantong:['re_jsp_pangtong','sp_taishici'], - xinghuoliaoyuan_tianxiang:['lvdai','zhoufang','liuyao'], - xinghuoliaoyuan_qisha:['lvqian','re_zhangliang'], + xinghuoliaoyuan_tianliang: ["duji", "liuyan", "yanjun"], + xinghuoliaoyuan_tianji: ["panjun", "wangcan"], + xinghuoliaoyuan_tiantong: ["re_jsp_pangtong", "sp_taishici"], + xinghuoliaoyuan_tianxiang: ["lvdai", "zhoufang", "liuyao"], + xinghuoliaoyuan_qisha: ["lvqian", "re_zhangliang"], }, }, - characterIntro:{ - wangcan:"王粲(177年-217年2月17日),字仲宣。山阳郡高平县(今山东微山两城镇)人。东汉末年文学家,“建安七子”之一,太尉王龚曾孙、司空王畅之孙。", - re_jsp_pangtong:"庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。", - lvdai:"吕岱(161年-256年),字定公,广陵海陵(今江苏如皋)人。三国时期吴国重臣、将领。吕岱一生戮力奉公,为孙吴开疆拓土,功勋赫赫。太平元年(256年),吕岱去世,年九十六。", - lvqian:"吕虔(生卒年不详),字子恪。任城国(今山东济宁东南)人。汉末至三国曹魏时期将领。 吕虔有勇有谋,曹操在兖州时,任命他为从事,率领家丁驻守湖陆。后升任泰山太守,与夏侯渊共同镇压济南等地的黄巾军。被推举为秀才,加任骑都尉,仍管辖泰山郡。 曹丕继任魏王后,加吕虔为裨将军,封益寿亭侯。再升任徐州刺史,加任威虏将军。任用王祥为别驾,将民政事务都委托于他,为世人所称赞。曹叡继位后,改封万年亭侯。吕虔死后,其子吕翻世袭万年亭侯。", - panjun:"潘濬(一作潘浚)(?-239年),字承明。武陵郡汉寿县(今湖南汉寿)人。三国时期吴国重臣,蜀汉大司马蒋琬的表弟。 潘濬为人聪察,对问有机理,拜大儒宋忠为师,得到“建安七子”之一的王粲赏识。不到三十,即被荆州牧刘表任命为江夏从事,因按杀贪污的沙羡长而闻名。建安十六年(211年),被刘备任命为荆州治中从事,与守臣关羽不睦。建安二十四年(219年),孙权得荆州,拜潘濬为辅军中郎将。又迁奋威将军,封常迁亭侯。孙权称帝后,拜少府,进封刘阳侯,又改太常。黄龙三年(231年),授假节,与吕岱率军五万平五溪蛮夷叛乱,经三年而斩获数万,使得一方宁静。潘濬为人刚正不阿,在吕壹弄权时,屡请孙权将其诛杀。甚至想亲手击杀吕壹,使吕壹对他非常畏惧。 赤乌二年(239年),潘濬去世。", - duji:"杜畿(163年—224年),字伯侯,京兆杜陵(今陕西西安东南)人。东汉末及三国时曹魏官吏及将领。西汉御史大夫杜延年的后代。历官郡功曹、守郑县令,善于断案。荀彧将他举荐给曹操,曹操任命他为司空司直,调任护羌校尉,使持节领西平太守。 曹丕受禅登基后,封杜畿为丰乐亭侯。官至尚书仆射。后在陶河试航时遇上大风沉没,杜畿淹死,死时六十二岁,曹丕为之涕泣,追赠其为太仆,谥戴侯。", - zhoufang:"周鲂(生卒年不详),字子鱼。吴郡阳羡县(今江苏宜兴)人。三国时期吴国将领。周鲂年少时好学,被举为孝廉。历任宁国县长、怀安县长、钱塘侯相,一月之内,便斩杀作乱的彭式及其党羽,因而升任丹阳西部都尉。彭绮率数万人反叛时,周鲂被任命为鄱阳太守,与胡综共同将其生擒,因功加职昭义校尉。后诈降曹休,诱其率军接应,使曹休在石亭之战中一败涂地,战后因功被加职为裨将军,封关内侯。贼帅董嗣凭险骚扰豫章等郡,周鲂派间谍将其诱杀,不费兵卒即安定数郡。周鲂在鄱阳赏罚分明、恩威并施,于任职十三年后去世。", - yanjun:"严畯(生卒年不详),字曼才,彭城(治今江苏徐州)人,三国时期孙吴官员、学者。性情忠厚,待人以诚。少好学,精通《诗》、《书》、《三礼》,又好《说文》。避乱江东,与诸葛瑾、步骘是好朋友,被张昭推荐给孙权作骑都尉、从事中郎。建安二十二年(217年),横江将军鲁肃去世,孙权打算让严畯接替其位。严畯很有自知之明,知道自己没有能力对抗在荆州的关羽和北面的曹魏,便坚决不接受此任命。后来担任尚书令。严畯享年七十八岁。著有《孝经传》、《潮水论》。", - liuyao:"刘繇(一读yóu)(156年-197年),字正礼。东莱牟平(今山东牟平)人。东汉末年宗室、大臣,汉末群雄之一,齐悼惠王刘肥之后,太尉刘宠之侄。
    刘繇最初被推举为孝廉,授郎中。任下邑县长时,因拒郡守请托而弃官。后被征辟为司空掾属,除授侍御史,因战乱而不到任,避居淮浦。兴平元年(194年),被任命为扬州刺史。他先后与袁术、孙策交战,一度被朝廷加授为扬州牧、振武将军,但最终还是败归丹徒。此后,刘繇又击破反叛的笮融,旋即病逝,年四十二。", - liuyan:"刘焉(?-194年),字君郎(《华阳国志》又作君朗)。江夏郡竟陵县(今湖北省天门市)人。东汉末年宗室、军阀,汉末群雄之一,西汉鲁恭王刘余之后。
    刘焉初以汉朝宗室身份,拜为中郎,历任雒阳令、冀州刺史、南阳太守、宗正、太常等官。因益州刺史郄俭在益州大肆聚敛,贪婪成风,加上当时天下大乱。刘焉欲取得一安身立命之所,割据一方,于是向朝廷求为益州牧,封阳城侯,前往益州整饬吏治。郄俭为黄巾军所杀,刘焉进入益州,派张鲁盘踞汉中,张鲁截断交通,斩杀汉使,从此益州与中央道路不通。刘焉进一步对内打击地方豪强,巩固自身势力,益州因而处于半独立的状态。兴平元年(194年),刘焉因背疮迸发而逝世,其子刘璋继领益州牧。", + characterIntro: { + wangcan: + "王粲(177年-217年2月17日),字仲宣。山阳郡高平县(今山东微山两城镇)人。东汉末年文学家,“建安七子”之一,太尉王龚曾孙、司空王畅之孙。", + re_jsp_pangtong: + "庞统,字士元,襄阳(治今湖北襄阳)人。三国时刘备帐下谋士,官拜军师中郎将。才智与诸葛亮齐名,人称“凤雏”。在进围雒县时,统率众攻城,不幸被流矢击中去世,时年三十六岁。追赐统为关内侯,谥曰靖侯。庞统死后,葬于落凤庞统墓坡。", + lvdai: "吕岱(161年-256年),字定公,广陵海陵(今江苏如皋)人。三国时期吴国重臣、将领。吕岱一生戮力奉公,为孙吴开疆拓土,功勋赫赫。太平元年(256年),吕岱去世,年九十六。", + lvqian: "吕虔(生卒年不详),字子恪。任城国(今山东济宁东南)人。汉末至三国曹魏时期将领。 吕虔有勇有谋,曹操在兖州时,任命他为从事,率领家丁驻守湖陆。后升任泰山太守,与夏侯渊共同镇压济南等地的黄巾军。被推举为秀才,加任骑都尉,仍管辖泰山郡。 曹丕继任魏王后,加吕虔为裨将军,封益寿亭侯。再升任徐州刺史,加任威虏将军。任用王祥为别驾,将民政事务都委托于他,为世人所称赞。曹叡继位后,改封万年亭侯。吕虔死后,其子吕翻世袭万年亭侯。", + panjun: "潘濬(一作潘浚)(?-239年),字承明。武陵郡汉寿县(今湖南汉寿)人。三国时期吴国重臣,蜀汉大司马蒋琬的表弟。 潘濬为人聪察,对问有机理,拜大儒宋忠为师,得到“建安七子”之一的王粲赏识。不到三十,即被荆州牧刘表任命为江夏从事,因按杀贪污的沙羡长而闻名。建安十六年(211年),被刘备任命为荆州治中从事,与守臣关羽不睦。建安二十四年(219年),孙权得荆州,拜潘濬为辅军中郎将。又迁奋威将军,封常迁亭侯。孙权称帝后,拜少府,进封刘阳侯,又改太常。黄龙三年(231年),授假节,与吕岱率军五万平五溪蛮夷叛乱,经三年而斩获数万,使得一方宁静。潘濬为人刚正不阿,在吕壹弄权时,屡请孙权将其诛杀。甚至想亲手击杀吕壹,使吕壹对他非常畏惧。 赤乌二年(239年),潘濬去世。", + duji: "杜畿(163年—224年),字伯侯,京兆杜陵(今陕西西安东南)人。东汉末及三国时曹魏官吏及将领。西汉御史大夫杜延年的后代。历官郡功曹、守郑县令,善于断案。荀彧将他举荐给曹操,曹操任命他为司空司直,调任护羌校尉,使持节领西平太守。 曹丕受禅登基后,封杜畿为丰乐亭侯。官至尚书仆射。后在陶河试航时遇上大风沉没,杜畿淹死,死时六十二岁,曹丕为之涕泣,追赠其为太仆,谥戴侯。", + zhoufang: + "周鲂(生卒年不详),字子鱼。吴郡阳羡县(今江苏宜兴)人。三国时期吴国将领。周鲂年少时好学,被举为孝廉。历任宁国县长、怀安县长、钱塘侯相,一月之内,便斩杀作乱的彭式及其党羽,因而升任丹阳西部都尉。彭绮率数万人反叛时,周鲂被任命为鄱阳太守,与胡综共同将其生擒,因功加职昭义校尉。后诈降曹休,诱其率军接应,使曹休在石亭之战中一败涂地,战后因功被加职为裨将军,封关内侯。贼帅董嗣凭险骚扰豫章等郡,周鲂派间谍将其诱杀,不费兵卒即安定数郡。周鲂在鄱阳赏罚分明、恩威并施,于任职十三年后去世。", + yanjun: "严畯(生卒年不详),字曼才,彭城(治今江苏徐州)人,三国时期孙吴官员、学者。性情忠厚,待人以诚。少好学,精通《诗》、《书》、《三礼》,又好《说文》。避乱江东,与诸葛瑾、步骘是好朋友,被张昭推荐给孙权作骑都尉、从事中郎。建安二十二年(217年),横江将军鲁肃去世,孙权打算让严畯接替其位。严畯很有自知之明,知道自己没有能力对抗在荆州的关羽和北面的曹魏,便坚决不接受此任命。后来担任尚书令。严畯享年七十八岁。著有《孝经传》、《潮水论》。", + liuyao: "刘繇(一读yóu)(156年-197年),字正礼。东莱牟平(今山东牟平)人。东汉末年宗室、大臣,汉末群雄之一,齐悼惠王刘肥之后,太尉刘宠之侄。
    刘繇最初被推举为孝廉,授郎中。任下邑县长时,因拒郡守请托而弃官。后被征辟为司空掾属,除授侍御史,因战乱而不到任,避居淮浦。兴平元年(194年),被任命为扬州刺史。他先后与袁术、孙策交战,一度被朝廷加授为扬州牧、振武将军,但最终还是败归丹徒。此后,刘繇又击破反叛的笮融,旋即病逝,年四十二。", + liuyan: "刘焉(?-194年),字君郎(《华阳国志》又作君朗)。江夏郡竟陵县(今湖北省天门市)人。东汉末年宗室、军阀,汉末群雄之一,西汉鲁恭王刘余之后。
    刘焉初以汉朝宗室身份,拜为中郎,历任雒阳令、冀州刺史、南阳太守、宗正、太常等官。因益州刺史郄俭在益州大肆聚敛,贪婪成风,加上当时天下大乱。刘焉欲取得一安身立命之所,割据一方,于是向朝廷求为益州牧,封阳城侯,前往益州整饬吏治。郄俭为黄巾军所杀,刘焉进入益州,派张鲁盘踞汉中,张鲁截断交通,斩杀汉使,从此益州与中央道路不通。刘焉进一步对内打击地方豪强,巩固自身势力,益州因而处于半独立的状态。兴平元年(194年),刘焉因背疮迸发而逝世,其子刘璋继领益州牧。", }, - characterTitle:{}, - perfectPair:{ - lijue:['guosi','jiaxu'], - zhangji:['zhangxiu','drlt_zhangxiu','zoushi'], - xf_sufei:['ganning'], + characterTitle: {}, + perfectPair: { + lijue: ["guosi", "jiaxu"], + zhangji: ["zhangxiu", "drlt_zhangxiu", "zoushi"], + xf_sufei: ["ganning"], //baosanniang:['guansuo'], - simahui:['pangdegong'], - zhangqiying:['zhanglu'], - pangtong:['zhugejin'], - taishici:['liuyao','kongrong'], + simahui: ["pangdegong"], + zhangqiying: ["zhanglu"], + pangtong: ["zhugejin"], + taishici: ["liuyao", "kongrong"], //zhaotongzhaoguang:['zhaoyun','mayunlu'], }, - skill:{ - xinyingshi:{ - audio:'xinfu_yingshi', - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0&&!game.hasPlayer(function(current){ - return current.getExpansions('xinyingshi_cards').length>0; - }); + skill: { + xinyingshi: { + audio: "xinfu_yingshi", + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + !game.hasPlayer(function (current) { + return current.getExpansions("xinyingshi_cards").length > 0; + }) + ); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseCardTarget({ - filterCard:true, - filterTarget:lib.filter.notMe, - selectCard:[1,player.countCards('he')], - position:'he', - prompt:get.prompt('xinyingshi'), - prompt2:'将任意张牌置于一名其他角色的武将牌上作为“酬”', - ai1:function(card){ - return 1-player.getUseValue(card); + filterCard: true, + filterTarget: lib.filter.notMe, + selectCard: [1, player.countCards("he")], + position: "he", + prompt: get.prompt("xinyingshi"), + prompt2: "将任意张牌置于一名其他角色的武将牌上作为“酬”", + ai1: function (card) { + return 1 - player.getUseValue(card); }, - ai2:function(target){ - var player=_status.event.player; - return (1+game.countPlayer(function(current){ - return get.attitude(player,current)>0&¤t.inRange(target)&&get.damageEffect(target,current,player)>0; - }))*-get.attitude(player,target); + ai2: function (target) { + var player = _status.event.player; + return ( + (1 + + game.countPlayer(function (current) { + return ( + get.attitude(player, current) > 0 && + current.inRange(target) && + get.damageEffect(target, current, player) > 0 + ); + })) * + -get.attitude(player, target) + ); }, }); - 'step 1' - if(result.bool){ - var target=result.targets[0],cards=result.cards; - player.logSkill('xinyingshi',target); - target.addSkill('xinyingshi_cards'); - target.addToExpansion(player,'give',cards).gaintag.add('xinyingshi_cards'); - target.storage.xinyingshi_source=player; + ("step 1"); + if (result.bool) { + var target = result.targets[0], + cards = result.cards; + player.logSkill("xinyingshi", target); + target.addSkill("xinyingshi_cards"); + target.addToExpansion(player, "give", cards).gaintag.add("xinyingshi_cards"); + target.storage.xinyingshi_source = player; } }, - subSkill:{ - cards:{ - trigger:{player:'damageSource'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.card&&event.getParent().type=='card'&& - player.getExpansions('xinyingshi_cards').length; + subSkill: { + cards: { + trigger: { player: "damageSource" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + event.card && + event.getParent().type == "card" && + player.getExpansions("xinyingshi_cards").length + ); }, - logTarget:'source', - content:function(){ - 'step 0' - event.target=trigger.source; - event.target.chooseButton(['应势:请选择你的赏金',player.getExpansions('xinyingshi_cards')]); - 'step 1' - if(result.bool){ - var cards=[result.links[0]]; - for(var i=0;i1){ - setTimeout(function(){ + player.$give(cards[0], target); + if (cards.length > 1) { + setTimeout(function () { target.$gain2(cards.slice(1)); - },get.delayx(200,200)); - game.log(target,'从牌堆获得了',cards.slice(1)) + }, get.delayx(200, 200)); + game.log(target, "从牌堆获得了", cards.slice(1)); } - game.delay(0,get.delayx(500,500)); + game.delay(0, get.delayx(500, 500)); target.gain(cards); } - 'step 2' - if(!player.getExpansions('xinyingshi_cards').length) player.removeSkill('xinyingshi_cards'); + ("step 2"); + if (!player.getExpansions("xinyingshi_cards").length) + player.removeSkill("xinyingshi_cards"); }, - marktext:'酬', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "酬", + intro: { + content: "expansion", + markcount: "expansion", }, - ai:{threaten:3}, - group:'xinyingshi_regain', - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + ai: { threaten: 3 }, + group: "xinyingshi_regain", + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); delete player.storage.xinyingshi_source; }, }, - regain:{ - trigger:{player:'die'}, - forced:true, - charlotte:true, - forceDie:true, - filter:function(event,player){ - return player.storage.xinyingshi_source&&player.storage.xinyingshi_source.isIn()&&player.getExpansions('xinyingshi_cards').length>0; + regain: { + trigger: { player: "die" }, + forced: true, + charlotte: true, + forceDie: true, + filter: function (event, player) { + return ( + player.storage.xinyingshi_source && + player.storage.xinyingshi_source.isIn() && + player.getExpansions("xinyingshi_cards").length > 0 + ); }, - content:function(){ - player.storage.xinyingshi_source.gain(player.getExpansions('xinyingshi_cards'),player,'give','bySelf'); + content: function () { + player.storage.xinyingshi_source.gain( + player.getExpansions("xinyingshi_cards"), + player, + "give", + "bySelf" + ); }, }, }, }, - xinfu_guolun:{ - audio:2, - enable:"phaseUse", - usable:1, - filter:function (event,player){ - return player.countCards('h')>0; + xinfu_guolun: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:function (card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - content:function (){ - 'step 0' - player.choosePlayerCard(target,true,'h'); - 'step 1' - event.cardt=result.cards[0]; + content: function () { + "step 0"; + player.choosePlayerCard(target, true, "h"); + ("step 1"); + event.cardt = result.cards[0]; target.showCards(event.cardt); - player.chooseCard('he').set('ai',function(card){ - var event=_status.event.getParent(),player=event.player; - var numt=get.number(event.cardt); - var att=get.attitude(player,target); - var value=get.value(event.cardt); - var num=get.number(card); - if(num2) return value+6-get.value(card); - else if(num==numt) return value-get.value(card); + player.chooseCard("he").set("ai", function (card) { + var event = _status.event.getParent(), + player = event.player; + var numt = get.number(event.cardt); + var att = get.attitude(player, target); + var value = get.value(event.cardt); + var num = get.number(card); + if (num < numt || att > 2) return value + 6 - get.value(card); + else if (num == numt) return value - get.value(card); return -1; }); - 'step 2' - if(!result.bool) event.finish(); - else{ + ("step 2"); + if (!result.bool) event.finish(); + else { player.showCards(result.cards); - event.cardp=result.cards[0]; + event.cardp = result.cards[0]; } - 'step 3' - player.swapHandcards(target,[event.cardp],[event.cardt]); - 'step 4' - var nump=get.number(event.cardp,player); - var numt=get.number(event.cardt,target); - if(numpnumt){ + } else if (nump > numt) { target.draw(); } }, - ai:{ - threaten:1.5, - order:8, - result:{ - player:function (player,target){ - if(get.attitude(player,target)>0) return 1.5; + ai: { + threaten: 1.5, + order: 8, + result: { + player: function (player, target) { + if (get.attitude(player, target) > 0) return 1.5; return 0.5; }, }, }, }, - "xinfu_zhanji":{ - audio:2, - trigger:{ - player:"gainAfter", + xinfu_zhanji: { + audio: 2, + trigger: { + player: "gainAfter", }, - forced:true, - filter:function (event,player){ - if(!player.isPhaseUsing()) return false; - return event.getParent().name=='draw'&&event.getParent(2).name!='xinfu_zhanji'; + forced: true, + filter: function (event, player) { + if (!player.isPhaseUsing()) return false; + return event.getParent().name == "draw" && event.getParent(2).name != "xinfu_zhanji"; }, - content:function (){ - player.draw('nodelay'); + content: function () { + player.draw("nodelay"); }, }, - "xinfu_songsang":{ - limited:true, - skillAnimation:true, - animationColor:'wood', - audio:2, - derivation:"xinfu_zhanji", - trigger:{global:"dieAfter"}, - logTarget:'player', - async content(e,t,player){ - player.awakenSkill('xinfu_songsang'); - if(player.isDamaged()){ + xinfu_songsang: { + limited: true, + skillAnimation: true, + animationColor: "wood", + audio: 2, + derivation: "xinfu_zhanji", + trigger: { global: "dieAfter" }, + logTarget: "player", + async content(e, t, player) { + player.awakenSkill("xinfu_songsang"); + if (player.isDamaged()) { player.recover(); - } - else player.gainMaxHp(); - player.addSkills('xinfu_zhanji'); + } else player.gainMaxHp(); + player.addSkills("xinfu_zhanji"); }, }, - "xinfu_jixu":{ - audio:2, - enable:"phaseUse", - usable:1, - filter:function (event,player){ - return player.countCards('h')>0; + xinfu_jixu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterTarget:function (card,player,target){ - if(player==target) return false; - if(ui.selected.targets.length){ - return target.hp==ui.selected.targets[0].hp; + filterTarget: function (card, player, target) { + if (player == target) return false; + if (ui.selected.targets.length) { + return target.hp == ui.selected.targets[0].hp; } return true; }, - selectTarget:[1,Infinity], - multitarget:true, - multiline:true, - content:function (){ - "step 0" + selectTarget: [1, Infinity], + multitarget: true, + multiline: true, + content: function () { + "step 0"; targets.sort(lib.sort.seat); - "step 1" - if(!event.num) event.num=0; - if(!event.caicuolist) event.caicuolist=[]; - targets[event.num].chooseBool("是否押杀?").ai=function(event,player){ - var evt=_status.event.getParent(); - if(get.attitude(targets[event.num],evt.player)>0) return evt.player.countCards('h','sha')?false:true; - return Math.random()<0.5; + ("step 1"); + if (!event.num) event.num = 0; + if (!event.caicuolist) event.caicuolist = []; + targets[event.num].chooseBool("是否押杀?").ai = function (event, player) { + var evt = _status.event.getParent(); + if (get.attitude(targets[event.num], evt.player) > 0) + return evt.player.countCards("h", "sha") ? false : true; + return Math.random() < 0.5; }; - "step 2" - if(result.bool){ - targets[event.num].chat('有杀'); - game.log(targets[event.num],'认为',player,'#g有杀'); - if(!player.countCards('h','sha')) event.caicuolist.add(targets[event.num]); - }else{ - targets[event.num].chat('没杀'); - game.log(targets[event.num],'认为',player,'#y没有杀'); - if(player.countCards('h','sha')) event.caicuolist.add(targets[event.num]); + ("step 2"); + if (result.bool) { + targets[event.num].chat("有杀"); + game.log(targets[event.num], "认为", player, "#g有杀"); + if (!player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); + } else { + targets[event.num].chat("没杀"); + game.log(targets[event.num], "认为", player, "#y没有杀"); + if (player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]); } event.num++; game.delay(); - if(event.num0){ - if(target.getEquip('baiyin')&&target.isDamaged()&& - get.recoverEffect(target,player,player)>0){ - if(target.hp==1&&!target.hujia) return 1.6; - if(target.hp==2) return 0.01; + result: { + target: function (player, target) { + var raweffect = function (player, target) { + if (player.countCards("h", "sha")) { + return get.effect(target, { name: "sha" }, player, target); + } else { + var att = get.attitude(player, target); + var nh = target.countCards("h"); + if (att > 0) { + if ( + target.getEquip("baiyin") && + target.isDamaged() && + get.recoverEffect(target, player, player) > 0 + ) { + if (target.hp == 1 && !target.hujia) return 1.6; + if (target.hp == 2) return 0.01; return 0; } } - var es=target.getCards('e'); - var noe=(es.length==0||target.hasSkillTag('noe')); - var noe2=(es.length==1&&es[0].name=='baiyin'&&target.isDamaged()); - var noh=(nh==0||target.hasSkillTag('noh')); - if(noh&&(noe||noe2)) return 0; - if(att<=0&&!target.countCards('he')) return 1.5; + var es = target.getCards("e"); + var noe = es.length == 0 || target.hasSkillTag("noe"); + var noe2 = es.length == 1 && es[0].name == "baiyin" && target.isDamaged(); + var noh = nh == 0 || target.hasSkillTag("noh"); + if (noh && (noe || noe2)) return 0; + if (att <= 0 && !target.countCards("he")) return 1.5; return -1.5; } - } - var num=game.countPlayer(function(current){ - return current!=player&¤t.hp==target.hp&&(raweffect(player,current)*get.attitude(player,current))>0 + }; + var num = game.countPlayer(function (current) { + return ( + current != player && + current.hp == target.hp && + raweffect(player, current) * get.attitude(player, current) > 0 + ); }); - return raweffect(player,target)*Math.max(0,num-1); + return raweffect(player, target) * Math.max(0, num - 1); }, }, - expose:0.4, + expose: 0.4, }, }, - "jixu_sha":{ - audio:"xinfu_jixu", - trigger:{ - player:"useCard", + jixu_sha: { + audio: "xinfu_jixu", + trigger: { + player: "useCard", }, - onremove:function (player){ + onremove: function (player) { delete player.storage.jixu_sha; }, - filter:function (event,player){ - if(event.card.name=='sha'){ - return game.hasPlayer(function(current){ - return current!=player&&player.storage.jixu_sha.includes(current)&&!event.targets.includes(current); + filter: function (event, player) { + if (event.card.name == "sha") { + return game.hasPlayer(function (current) { + return ( + current != player && + player.storage.jixu_sha.includes(current) && + !event.targets.includes(current) + ); }); } return false; }, - forced:true, - silent:true, - popup:false, - content:function (){ + forced: true, + silent: true, + popup: false, + content: function () { player.logSkill("xinfu_jixu"); - for(var i=0;i2){ - if(card.name=='jiu') return 120; - if(card.name=='tao') return 110; - } - return 100-get.value(card); - }); - "step 2" - if(result.bool&&result.cards&&result.cards.length){ - event.current.give(result.cards,player); + xinfu_qiai: { + skillAnimation: true, + animationColor: "gray", + trigger: { player: "dying" }, + limited: true, + audio: 2, + content: function () { + "step 0"; + player.awakenSkill("xinfu_qiai"); + event.targets = game + .filterPlayer(function (current) { + return current != player; + }) + .sortBySeat(); + if (!event.targets.length) event.finish(); + ("step 1"); + event.current = event.targets.shift(); + if (!event.current.countCards("he")) event.goto(3); + else + event.current + .chooseCard("交给" + get.translation(player) + "一张牌", "he", true) + .set("ai", function (card) { + var evt = _status.event.getParent(); + if (get.attitude(_status.event.player, evt.player) > 2) { + if (card.name == "jiu") return 120; + if (card.name == "tao") return 110; + } + return 100 - get.value(card); + }); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + event.current.give(result.cards, player); } - "step 3" - if(event.targets.length>0) event.goto(1); + ("step 3"); + if (event.targets.length > 0) event.goto(1); }, }, - "xinfu_denglou":{ - audio:2, - trigger:{ - player:"phaseJieshuBegin", + xinfu_denglou: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", }, - limited:true, - filter:function (event,player){ - return player.countCards('h')==0; + limited: true, + filter: function (event, player) { + return player.countCards("h") == 0; }, - skillAnimation:true, - animationColor:'gray', - content:function (){ - "step 0" - player.awakenSkill('xinfu_denglou'); - event.cards=get.cards(4); - event.gains=[] - event.discards=[] - var content=['牌堆顶的四张牌',event.cards]; - game.log(player,'观看了','#y牌堆顶的四张牌'); - player.chooseControl('ok').set('dialog',content); - "step 1" - if(get.type(event.cards[0])!="basic"){ + skillAnimation: true, + animationColor: "gray", + content: function () { + "step 0"; + player.awakenSkill("xinfu_denglou"); + event.cards = get.cards(4); + event.gains = []; + event.discards = []; + var content = ["牌堆顶的四张牌", event.cards]; + game.log(player, "观看了", "#y牌堆顶的四张牌"); + player.chooseControl("ok").set("dialog", content); + ("step 1"); + if (get.type(event.cards[0]) != "basic") { event.gains.push(event.cards[0]); event.cards.remove(event.cards[0]); - } - else{ - var bool=game.hasPlayer(function(current){ - return player.canUse(event.cards[0],current); + } else { + var bool = game.hasPlayer(function (current) { + return player.canUse(event.cards[0], current); }); - if(bool){ - player.chooseUseTarget(event.cards[0],true,false); - } - else event.discards.push(event.cards[0]); + if (bool) { + player.chooseUseTarget(event.cards[0], true, false); + } else event.discards.push(event.cards[0]); event.cards.remove(event.cards[0]); } - "step 2" - if(event.cards.length) event.goto(1); - else{ - if(event.gains.length) player.gain(event.gains,'gain2'); - if(event.discards.length){ + ("step 2"); + if (event.cards.length) event.goto(1); + else { + if (event.gains.length) player.gain(event.gains, "gain2"); + if (event.discards.length) { player.$throw(event.discards); game.cardsDiscard(event.discards); } } }, }, - qinguo_use:{audio:2}, - "xinfu_qinguo":{ - group:"xinfu_qinguo_recover", - audio:'qinguo_use', - subfrequent:['recover'], - trigger:{ - player:"useCardEnd", + qinguo_use: { audio: 2 }, + xinfu_qinguo: { + group: "xinfu_qinguo_recover", + audio: "qinguo_use", + subfrequent: ["recover"], + trigger: { + player: "useCardEnd", }, - filter:function (event,player){ - return get.type(event.card)=='equip'; + filter: function (event, player) { + return get.type(event.card) == "equip"; }, - direct:true, - content:function(){ - player.chooseUseTarget({name:'sha'},get.prompt('xinfu_qinguo'),'视为使用一张【杀】',false).logSkill='xinfu_qinguo'; + direct: true, + content: function () { + player.chooseUseTarget( + { name: "sha" }, + get.prompt("xinfu_qinguo"), + "视为使用一张【杀】", + false + ).logSkill = "xinfu_qinguo"; }, - subSkill:{ - recover:{ - audio:'qinguo_use', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + subSkill: { + recover: { + audio: "qinguo_use", + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - prompt:'是否发动【勤国】回复1点体力?', - filter:function (event,player){ - if(player.isHealthy()||player.countCards('e')!=player.hp) return false; - var evt=event.getl(player); - if(event.name=='equip'&&event.player==player) return !evt||evt.cards.length!=1; - return evt&&evt.es.length; + prompt: "是否发动【勤国】回复1点体力?", + filter: function (event, player) { + if (player.isHealthy() || player.countCards("e") != player.hp) return false; + var evt = event.getl(player); + if (event.name == "equip" && event.player == player) + return !evt || evt.cards.length != 1; + return evt && evt.es.length; }, - frequent:true, - content:function(){ + frequent: true, + content: function () { player.recover(); }, }, }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')&&game.hasPlayer(function(current){ - return target.canUse('sha',current); - })) return [1,1.5]; - } - }, - noe:true, - reverseEquip:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='noe') return player.countCards('e')==player.hp+1; - return game.hasPlayer(function(current){ - return player.canUse('sha',current); - }); - } - } - }, - xinfu_jijun:{ - ai:{ - reverseEquip:true, - effect:{ - target:function (card,player,target,current){ - if(get.type(card)=='equip'&&player==target&&player==_status.currentPhase&&get.subtype(card)=='equip1') return [1,3]; + ai: { + effect: { + target: function (card, player, target, current) { + if ( + get.type(card) == "equip" && + !get.cardtag(card, "gifts") && + game.hasPlayer(function (current) { + return target.canUse("sha", current); + }) + ) + return [1, 1.5]; }, }, - combo:'xinfu_fangtong' + noe: true, + reverseEquip: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "noe") return player.countCards("e") == player.hp + 1; + return game.hasPlayer(function (current) { + return player.canUse("sha", current); + }); + }, }, - audio:2, - trigger:{ - player:"useCardToPlayered", + }, + xinfu_jijun: { + ai: { + reverseEquip: true, + effect: { + target: function (card, player, target, current) { + if ( + get.type(card) == "equip" && + player == target && + player == _status.currentPhase && + get.subtype(card) == "equip1" + ) + return [1, 3]; + }, + }, + combo: "xinfu_fangtong", }, - frequent:true, - filter:function (event,player){ - if(player!=_status.currentPhase) return false; - if(event.getParent().triggeredTargets3.length>1) return false; - if(get.type(event.card)=='equip'&&get.subtype(event.card)!='equip1') return false; - if(event.targets.includes(player)) return true; + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + frequent: true, + filter: function (event, player) { + if (player != _status.currentPhase) return false; + if (event.getParent().triggeredTargets3.length > 1) return false; + if (get.type(event.card) == "equip" && get.subtype(event.card) != "equip1") return false; + if (event.targets.includes(player)) return true; return false; }, - callback:function(){ - player.addToExpansion(card,'gain2').gaintag.add('xinfu_jijun'); + callback: function () { + player.addToExpansion(card, "gain2").gaintag.add("xinfu_jijun"); }, - content:function (){ - player.judge(function(card){ + content: function () { + player.judge(function (card) { return 1; - }).callback=lib.skill.xinfu_jijun.callback; + }).callback = lib.skill.xinfu_jijun.callback; }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - intro:{ - content:'expansion', - markcount:'expansion', - mark:function(dialog,content,player){ - var content=player.getExpansions('xinfu_jijun'); - if(content&&content.length){ + intro: { + content: "expansion", + markcount: "expansion", + mark: function (dialog, content, player) { + var content = player.getExpansions("xinfu_jijun"); + if (content && content.length) { dialog.addAuto(content); - if(player==game.me||player.isUnderControl()){ - var list=lib.skill.xinfu_fangtong.getAuto(player); - if(list.length>0){ - dialog.addText('
  • 推荐方案:'+get.translation(list[0])+'+ '+get.translation(list.slice(1))); + if (player == game.me || player.isUnderControl()) { + var list = lib.skill.xinfu_fangtong.getAuto(player); + if (list.length > 0) { + dialog.addText( + "
  • 推荐方案:" + + get.translation(list[0]) + + "+ " + + get.translation(list.slice(1)) + ); } } } }, }, - marktext:"方", + marktext: "方", }, - xinfu_fangtong:{ - getAuto:function(player){ - var hs=player.getCards('he'); - var ss=player.getExpansions('xinfu_jijun'); - var bool=false,max=Math.pow(2,ss.length),index,i; - for(i=0;i0&&player.getExpansions('xinfu_jijun').length>0; + filter: function (event, player) { + return player.countCards("he") > 0 && player.getExpansions("xinfu_jijun").length > 0; }, - direct:true, - skillAnimation:true, - animationColor:'metal', - content:function (){ - 'step 0' - var info=['是否发动【方统】?']; - info.push('
    '+get.translation(player)+'的“方”
    '); - info.push(player.getExpansions('xinfu_jijun')); - if(player.countCards('h')){ - info.push('
    '+get.translation(player)+'的手牌区
    '); - info.push(player.getCards('h')); + direct: true, + skillAnimation: true, + animationColor: "metal", + content: function () { + "step 0"; + var info = ["是否发动【方统】?"]; + info.push('
    ' + get.translation(player) + "的“方”
    "); + info.push(player.getExpansions("xinfu_jijun")); + if (player.countCards("h")) { + info.push('
    ' + get.translation(player) + "的手牌区
    "); + info.push(player.getCards("h")); } - if(player.countCards('e')){ - info.push('
    '+get.translation(player)+'的装备区
    '); - info.push(player.getCards('e')); + if (player.countCards("e")) { + info.push('
    ' + get.translation(player) + "的装备区
    "); + info.push(player.getCards("e")); } - var next=player.chooseButton(); - next.set('createDialog',info); - next.set('selectButton',function(){ - var num=0; - for(var i=0;i0){ + next.set("autolist", lib.skill.xinfu_fangtong.getAuto(player)); + next.set("processAI", function () { + if (_status.event.autolist && _status.event.autolist.length > 0) { return { - bool:true, - links:_status.event.autolist, - } + bool: true, + links: _status.event.autolist, + }; } - return {bool:false}; + return { bool: false }; }); - next.set('complexSelect',true); - 'step 1' - if(result.bool){ - player.logSkill('xinfu_fangtong'); - var tothrow=[]; - var cards=result.links.slice(0); - for(var i=0;i=0; + check: function (event, player) { + return get.effect(event.source, { name: "losehp" }, player, player) >= 0; }, - forced:true, - logTarget:"source", - content:function(){ - player.addTempSkill('xinfu_weilu_effect',{player:'die'}); - player.markAuto('xinfu_weilu_effect',[trigger.source]); + forced: true, + logTarget: "source", + content: function () { + player.addTempSkill("xinfu_weilu_effect", { player: "die" }); + player.markAuto("xinfu_weilu_effect", [trigger.source]); game.delayx(); }, - ai:{ - maixie_defend:true, - threaten:0.85, - effect:{ - target:function (card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; + ai: { + maixie_defend: true, + threaten: 0.85, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return; return 0.9; }, }, }, - subSkill:{ - effect:{ - audio:'xinfu_weilu', - trigger:{player:'phaseUseBegin'}, - charlotte:true, - forced:true, - logTarget:function(event,player){ - return player.getStorage('xinfu_weilu_effect').filter(function(current){ - return current.isIn()&¤t.hp>1; + subSkill: { + effect: { + audio: "xinfu_weilu", + trigger: { player: "phaseUseBegin" }, + charlotte: true, + forced: true, + logTarget: function (event, player) { + return player.getStorage("xinfu_weilu_effect").filter(function (current) { + return current.isIn() && current.hp > 1; }); }, - content:function(){ - 'step 0' - var targets=player.getStorage('xinfu_weilu_effect'); - player.removeSkill('xinfu_weilu_effect'); - event.targets=targets.sortBySeat(); - 'step 1' - var target=targets.shift(); - if(target.isIn()&&target.hp>1){ - event._delay=true; - var num=target.hp-1; - player.markAuto('xinfu_weilu_recover',[[target,num]]); + content: function () { + "step 0"; + var targets = player.getStorage("xinfu_weilu_effect"); + player.removeSkill("xinfu_weilu_effect"); + event.targets = targets.sortBySeat(); + ("step 1"); + var target = targets.shift(); + if (target.isIn() && target.hp > 1) { + event._delay = true; + var num = target.hp - 1; + player.markAuto("xinfu_weilu_recover", [[target, num]]); target.loseHp(num); } - if(targets.length>0) event.redo(); - else if(!event._delay) event.finish(); - 'step 2' - player.addTempSkill('xinfu_weilu_recover',{player:['phaseUseAfter','phaseAfter']}); + if (targets.length > 0) event.redo(); + else if (!event._delay) event.finish(); + ("step 2"); + player.addTempSkill("xinfu_weilu_recover", { + player: ["phaseUseAfter", "phaseAfter"], + }); game.delayx(); }, - onremove:true, - intro:{content:'已将$列入“威虏”战略打击目标'}, + onremove: true, + intro: { content: "已将$列入“威虏”战略打击目标" }, }, - recover:{ - audio:'xinfu_weilu', - charlotte:true, - trigger:{player:'phaseUseEnd'}, - forced:true, - filter:function(event,player){ - var targets=player.getStorage('xinfu_weilu_recover'); - for(var i of targets){ - if(i[0].isIn()&&i[0].isDamaged()) return true; + recover: { + audio: "xinfu_weilu", + charlotte: true, + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + var targets = player.getStorage("xinfu_weilu_recover"); + for (var i of targets) { + if (i[0].isIn() && i[0].isDamaged()) return true; } return false; }, - onremove:true, - logTarget:function(event,player){ - var logs=[],targets=player.getStorage('xinfu_weilu_recover'); - for(var i of targets){ - if(i[0].isIn()&&i[0].isDamaged()) logs.add(i[0]); + onremove: true, + logTarget: function (event, player) { + var logs = [], + targets = player.getStorage("xinfu_weilu_recover"); + for (var i of targets) { + if (i[0].isIn() && i[0].isDamaged()) logs.add(i[0]); } return logs; }, - content:function(){ - 'step 0' - event.list=player.getStorage('xinfu_weilu_recover').slice(0); - event.list.sort(function(a,b){ - return lib.sort.seat(a[0],b[0]); + content: function () { + "step 0"; + event.list = player.getStorage("xinfu_weilu_recover").slice(0); + event.list.sort(function (a, b) { + return lib.sort.seat(a[0], b[0]); }); - 'step 1' - var group=event.list.shift(); - if(group[0].isIn()&&group[0].isDamaged()){ + ("step 1"); + var group = event.list.shift(); + if (group[0].isIn() && group[0].isDamaged()) { group[0].recover(group[1]); - event._delay=true; + event._delay = true; } - if(event.list.length>0) event.redo(); - else if(!event._delay) event.finish(); - 'step 2' + if (event.list.length > 0) event.redo(); + else if (!event._delay) event.finish(); + ("step 2"); game.delayx(); }, }, }, }, - xinfu_zengdao:{ - audio:2, - limited:true, - enable:"phaseUse", - filter:function(event,player){ - return player.countCards('e')>0; + xinfu_zengdao: { + audio: 2, + limited: true, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("e") > 0; }, - filterTarget:lib.filter.notMe, - skillAnimation:true, - animationColor:'thunder', - position:"e", - filterCard:true, - selectCard:[1,Infinity], - discard:false, - lose:false, - content:function(){ - player.awakenSkill('xinfu_zengdao'); - target.addToExpansion(cards,player,'give').gaintag.add('xinfu_zengdao2'); - target.addSkill('xinfu_zengdao2'); + filterTarget: lib.filter.notMe, + skillAnimation: true, + animationColor: "thunder", + position: "e", + filterCard: true, + selectCard: [1, Infinity], + discard: false, + lose: false, + content: function () { + player.awakenSkill("xinfu_zengdao"); + target.addToExpansion(cards, player, "give").gaintag.add("xinfu_zengdao2"); + target.addSkill("xinfu_zengdao2"); }, - ai:{ - order:function(){ - var player=_status.event.player,num=0; - if(player.hasCard((card)=>get.value(card,player)<0,'e')) return 9; - for(var i=1;i<6;i++){ - num+=player.countEquipableSlot(i); + ai: { + order: function () { + var player = _status.event.player, + num = 0; + if (player.hasCard((card) => get.value(card, player) < 0, "e")) return 9; + for (var i = 1; i < 6; i++) { + num += player.countEquipableSlot(i); } - if(num<=2) return 9; - var targets=player.getStorage('xinfu_weilu_recover'),num=0; - if(player.hp<=2||!game.hasPlayer((current)=>{ - if(player==current||get.attitude(player,current)<0||current.hp<=1) return false; - for(var arr of targets){ - if(current==arr[0]) break; - } - return current.hp>2||current.countCards('hs')>2; - })) return 1; + if (num <= 2) return 9; + var targets = player.getStorage("xinfu_weilu_recover"), + num = 0; + if ( + player.hp <= 2 || + !game.hasPlayer((current) => { + if (player == current || get.attitude(player, current) < 0 || current.hp <= 1) + return false; + for (var arr of targets) { + if (current == arr[0]) break; + } + return current.hp > 2 || current.countCards("hs") > 2; + }) + ) + return 1; return 0; }, - result:{ - target:function(player,target){ - if(target.hasValueTarget({name:'sha',isCard:true})) return ui.selected.cards.length; + result: { + target: function (player, target) { + if (target.hasValueTarget({ name: "sha", isCard: true })) + return ui.selected.cards.length; return 0; - } - } - } - }, - xinfu_zengdao2:{ - trigger:{source:'damageBegin1'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.getExpansions('xinfu_zengdao2').length>0; + }, + }, }, - content:function(){ - 'step 0' - player.chooseCardButton('将一张“刀”置入弃牌堆',player.getExpansions('xinfu_zengdao2'),true); - 'step 1' - if(result.bool){ + }, + xinfu_zengdao2: { + trigger: { source: "damageBegin1" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("xinfu_zengdao2").length > 0; + }, + content: function () { + "step 0"; + player.chooseCardButton( + "将一张“刀”置入弃牌堆", + player.getExpansions("xinfu_zengdao2"), + true + ); + ("step 1"); + if (result.bool) { trigger.num++; player.loseToDiscardpile(result.links); } }, - marktext:"刀", - intro:{ - content:'expansion', - markcount:'expansion', - onunmark:function(storage,player){ - player.removeSkill('xinfu_zengdao2'); + marktext: "刀", + intro: { + content: "expansion", + markcount: "expansion", + onunmark: function (storage, player) { + player.removeSkill("xinfu_zengdao2"); }, }, }, - xinfu_guanwei:{ - audio:2, - usable:1, - init:()=>{ - game.addGlobalSkill('xinfu_guanwei_ai'); + xinfu_guanwei: { + audio: 2, + usable: 1, + init: () => { + game.addGlobalSkill("xinfu_guanwei_ai"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('xinfu_guanwei'),true)) game.removeGlobalSkill('xinfu_guanwei_ai'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("xinfu_guanwei"), true)) + game.removeGlobalSkill("xinfu_guanwei_ai"); }, - trigger:{ - global:"phaseUseEnd", + trigger: { + global: "phaseUseEnd", }, - filter:function (event,player){ - var history=event.player.getHistory('useCard'); - var num=0; - var suit=false; - for(var i=0;i1; + return num > 1; }, - direct:true, - content:function (){ - 'step 0' - var target=trigger.player; - player.chooseToDiscard('he',get.prompt('xinfu_guanwei',trigger.player),'弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。').set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.targetx)<1) return 0; - return 9-get.value(card); - }).set('logSkill',['xinfu_guanwei',target]).set('targetx',target); - 'step 1' - if(result.bool){ - player.line(trigger.player,'green'); + direct: true, + content: function () { + "step 0"; + var target = trigger.player; + player + .chooseToDiscard( + "he", + get.prompt("xinfu_guanwei", trigger.player), + "弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。" + ) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.targetx) < 1) return 0; + return 9 - get.value(card); + }) + .set("logSkill", ["xinfu_guanwei", target]) + .set("targetx", target); + ("step 1"); + if (result.bool) { + player.line(trigger.player, "green"); trigger.player.draw(2); - } - else{ + } else { player.storage.counttrigger.xinfu_guanwei--; event.finish(); } - 'step 2' - var next=trigger.player.phaseUse(); + ("step 2"); + var next = trigger.player.phaseUse(); event.next.remove(next); - trigger.getParent('phase').next.push(next); + trigger.getParent("phase").next.push(next); }, - ai:{ - expose:0.5, + ai: { + expose: 0.5, }, - subSkill:{ - ai:{ - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('xinfu_guanwei'),true); + subSkill: { + ai: { + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("xinfu_guanwei"), true); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('xinfu_guanwei_ai'); + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("xinfu_guanwei_ai"); }, - ai:{ - effect:{ - player_use:function(card,player,target){ - if(typeof card!='object'||!player.isPhaseUsing()) return; - var hasPanjun=game.hasPlayer(function(current){ - return current.hasSkill('xinfu_guanwei')&&(!current.storage.counttrigger||!current.storage.counttrigger.xinfu_guanwei)&& - get.attitude(current,player)>=1&¤t.hasCard(function(card){ - return get.value(card)<7||(current!=game.me&&!current.isUnderControl()&&!current.isOnline())&&get.value(card)<9; - },'he'); + ai: { + effect: { + player_use: function (card, player, target) { + if (typeof card != "object" || !player.isPhaseUsing()) return; + var hasPanjun = game.hasPlayer(function (current) { + return ( + current.hasSkill("xinfu_guanwei") && + (!current.storage.counttrigger || + !current.storage.counttrigger.xinfu_guanwei) && + get.attitude(current, player) >= 1 && + current.hasCard(function (card) { + return ( + get.value(card) < 7 || + (current != game.me && + !current.isUnderControl() && + !current.isOnline() && + get.value(card) < 9) + ); + }, "he") + ); }); - if(!hasPanjun) return; - var suitx=get.suit(card); - var history=player.getHistory('useCard'); - if(!history.length){ - var val=0; - if(player.hasCard(function(cardx){ - return get.suit(cardx)==suitx&&card!=cardx&&(!card.cards||!card.cards.includes(cardx))&&player.hasValueTarget(cardx); - },'hs')) val=[2,0.1]; - if(val) return val; + if (!hasPanjun) return; + var suitx = get.suit(card); + var history = player.getHistory("useCard"); + if (!history.length) { + var val = 0; + if ( + player.hasCard(function (cardx) { + return ( + get.suit(cardx) == suitx && + card != cardx && + (!card.cards || !card.cards.includes(cardx)) && + player.hasValueTarget(cardx) + ); + }, "hs") + ) + val = [2, 0.1]; + if (val) return val; return; } - var num=0; - var suit=false; - for(var i=0;i1||num<=1&&player.hasCard(function(cardx){ - return get.suit(cardx)==suit&&player.hasValueTarget(cardx); - },'hs'))) return 'zeroplayertarget'; + if (suitx == suit && num == 1) return [1, 0.1]; + if ( + suitx != suit && + (num > 1 || + (num <= 1 && + player.hasCard(function (cardx) { + return ( + get.suit(cardx) == suit && + player.hasValueTarget(cardx) + ); + }, "hs"))) + ) + return "zeroplayertarget"; }, }, }, - } + }, }, }, - xinfu_gongqing_gz_panjun:{audio:2}, - "xinfu_gongqing":{ - audio:2, - audioname2:{gz_panjun:'xinfu_gongqing_gz_panjun'}, - trigger:{ - player:["damageBegin3","damageBegin4"], + xinfu_gongqing_gz_panjun: { audio: 2 }, + xinfu_gongqing: { + audio: 2, + audioname2: { gz_panjun: "xinfu_gongqing_gz_panjun" }, + trigger: { + player: ["damageBegin3", "damageBegin4"], }, - forced:true, - filter:function (event,player,name){ - if(!event.source) return false; - var range=event.source.getAttackRange(); - if(name=='damageBegin3') return range>3; - return event.num>1&&range<3; + forced: true, + filter: function (event, player, name) { + if (!event.source) return false; + var range = event.source.getAttackRange(); + if (name == "damageBegin3") return range > 3; + return event.num > 1 && range < 3; }, - preHidden:true, - content:function (){ - trigger.num=event.triggername=='damageBegin4'?1:trigger.num+1; + preHidden: true, + content: function () { + trigger.num = event.triggername == "damageBegin4" ? 1 : trigger.num + 1; }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.player){ - if(arg.player.hasSkillTag('jueqing',false,player)) return false; - if(arg.player.getAttackRange()<3) return true; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; + if (arg.player.getAttackRange() < 3) return true; } return false; - } + }, }, }, - "xinfu_andong":{ - subSkill:{ - add:{ - sub:true, - mod:{ - ignoredHandcard:function (card,player){ - if(get.suit(card)=='heart'){ + xinfu_andong: { + subSkill: { + add: { + sub: true, + mod: { + ignoredHandcard: function (card, player) { + if (get.suit(card) == "heart") { return true; } }, - cardDiscardable:function (card,player,name){ - if(name=='phaseDiscard'&&get.suit(card)=='heart') return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.suit(card) == "heart") return false; }, }, }, }, - audio:2, - trigger:{ - player:"damageBegin4", + audio: 2, + trigger: { + player: "damageBegin4", }, - filter:function (event,player){ - return get.itemtype(event.source)=='player'; + filter: function (event, player) { + return get.itemtype(event.source) == "player"; }, - logTarget:"source", - content:function (){ - "step 0" - if(!trigger.source.countCards('h')) event._result={index:1}; - else trigger.source.chooseControlList( - ['令'+get.translation(player)+'观看你的手牌,并获得其中所有的红桃牌。', - '防止即将对'+get.translation(player)+'造成的伤害,并使自己本回合内的红桃手牌不计入手牌上限。'], - true).set('ai',function(event,player){ - var target=_status.event.getParent().player; - var player=_status.event.player; - if(get.attitude(player,target)>0) return 1; - return 0; - }); - "step 1" - if(result.index==1){ + logTarget: "source", + content: function () { + "step 0"; + if (!trigger.source.countCards("h")) event._result = { index: 1 }; + else + trigger.source + .chooseControlList( + [ + "令" + get.translation(player) + "观看你的手牌,并获得其中所有的红桃牌。", + "防止即将对" + + get.translation(player) + + "造成的伤害,并使自己本回合内的红桃手牌不计入手牌上限。", + ], + true + ) + .set("ai", function (event, player) { + var target = _status.event.getParent().player; + var player = _status.event.player; + if (get.attitude(player, target) > 0) return 1; + return 0; + }); + ("step 1"); + if (result.index == 1) { trigger.cancel(); - trigger.source.addTempSkill('xinfu_andong_add'); + trigger.source.addTempSkill("xinfu_andong_add"); event.finish(); - }else{ + } else { player.viewHandcards(trigger.source); } - "step 2" - var cards=trigger.source.getCards('h'); - var togain=[] - for(var i=0;i0&&!game.hasPlayer(function(current){ - return current.hasSkill('yingshi_heart'); - }); + direct: true, + filter: function (event, player) { + return ( + player.countCards("he", { suit: "heart" }) > 0 && + !game.hasPlayer(function (current) { + return current.hasSkill("yingshi_heart"); + }) + ); }, - content:function (){ - 'step 0' - player.chooseTarget(get.prompt2('xinfu_yingshi'),function(card,player,target){ - return target!=player; - }).set('ai',function(){ - return -1; - }); - 'step 1' - if(result.bool){ - var cards=player.getCards('he',{suit:'heart'}); - var target=result.targets[0]; - player.logSkill('xinfu_yingshi',target); - target.addSkill('yingshi_heart'); - target.addToExpansion(cards,player,'give').gaintag.add('xinfu_yingshi'); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinfu_yingshi"), function (card, player, target) { + return target != player; + }) + .set("ai", function () { + return -1; + }); + ("step 1"); + if (result.bool) { + var cards = player.getCards("he", { suit: "heart" }); + var target = result.targets[0]; + player.logSkill("xinfu_yingshi", target); + target.addSkill("yingshi_heart"); + target.addToExpansion(cards, player, "give").gaintag.add("xinfu_yingshi"); } }, - marktext:'酬', - intro:{ - markcount:'expansion', - content:'expansion', - onunmark:function(storage,player){ - player.removeSkill('yingshi_heart'); + marktext: "酬", + intro: { + markcount: "expansion", + content: "expansion", + onunmark: function (storage, player) { + player.removeSkill("yingshi_heart"); }, - } - }, - yingshi_heart:{ - charlotte:true, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.source&&event.source.isIn() - &&event.card&&event.card.name=='sha' - &&player.getExpansions('xinfu_yingshi').length>0; }, - forced:true, - logTarget:'source', - content:function(){ - 'step 0' - trigger.source.chooseCardButton('应势:选择获得一张“酬”',player.getExpansions('xinfu_yingshi'),true); - 'step 1' - if(result.bool){ - trigger.source.gain(result.links,player,'give'); + }, + yingshi_heart: { + charlotte: true, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + event.card && + event.card.name == "sha" && + player.getExpansions("xinfu_yingshi").length > 0 + ); + }, + forced: true, + logTarget: "source", + content: function () { + "step 0"; + trigger.source.chooseCardButton( + "应势:选择获得一张“酬”", + player.getExpansions("xinfu_yingshi"), + true + ); + ("step 1"); + if (result.bool) { + trigger.source.gain(result.links, player, "give"); } }, }, - yingshi_die:{ - audio:'xinfu_yingshi', - forced:true, - trigger:{global:'die'}, - logTarget:'player', - filter:function(event,player){ - return event.player.getExpansions('xinfu_yingshi').length>0; + yingshi_die: { + audio: "xinfu_yingshi", + forced: true, + trigger: { global: "die" }, + logTarget: "player", + filter: function (event, player) { + return event.player.getExpansions("xinfu_yingshi").length > 0; }, - content:function(){ - var target=trigger.player; - player.gain(target.getExpansions('xinfu_yingshi'),target,'give','bySelf'); + content: function () { + var target = trigger.player; + player.gain(target.getExpansions("xinfu_yingshi"), target, "give", "bySelf"); }, }, - "xinfu_duanfa":{ - init:function (player){ - player.storage.xinfu_duanfa=0; + xinfu_duanfa: { + init: function (player) { + player.storage.xinfu_duanfa = 0; }, - audio:2, - enable:"phaseUse", - position:"he", - filter:function (card,player){ - return player.storage.xinfu_duanfa0; + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function (){ - "step 0" - player.chooseTarget(get.prompt2('xinfu_youdi'),function(card,player,target){ - return player!=target; - }).set('ai',function(target){ - var player=_status.event.player; - if(player.countCards('h','sha')>player.countCards('h')/3&&player.countCards('h',{color:'red'})>player.countCards('h')/2) return 0; - if(target.countCards('he')==0) return 0.1; - return -get.attitude(_status.event.player,target); - }); - "step 1" - if(result.bool){ + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("xinfu_youdi"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + var player = _status.event.player; + if ( + player.countCards("h", "sha") > player.countCards("h") / 3 && + player.countCards("h", { color: "red" }) > player.countCards("h") / 2 + ) + return 0; + if (target.countCards("he") == 0) return 0.1; + return -get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { game.delay(); - player.logSkill('xinfu_youdi',result.targets); - event.target=result.targets[0]; - event.target.discardPlayerCard(player,'h',true); - } - else{ + player.logSkill("xinfu_youdi", result.targets); + event.target = result.targets[0]; + event.target.discardPlayerCard(player, "h", true); + } else { event.finish(); } - "step 2" - if(get.color(result.links[0])!='black') player.draw('nodelay'); - if(result.links[0].name!='sha'&&event.target.countCards('he')){ - player.gainPlayerCard('he',event.target,true); + ("step 2"); + if (get.color(result.links[0]) != "black") player.draw("nodelay"); + if (result.links[0].name != "sha" && event.target.countCards("he")) { + player.gainPlayerCard("he", event.target, true); } }, - ai:{ - expose:0.3, - threaten:1.4, + ai: { + expose: 0.3, + threaten: 1.4, }, }, - "xinfu_guanchao":{ - subSkill:{ - dizeng:{ - mark:true, - marktext:"增", - intro:{ - content:"单调递增", + xinfu_guanchao: { + subSkill: { + dizeng: { + mark: true, + marktext: "增", + intro: { + content: "单调递增", }, - trigger:{ - player:"useCard", + trigger: { + player: "useCard", }, - audio:"xinfu_guanchao", - forced:true, - mod:{ - aiOrder:function(player,card,num){ - if(typeof card.number!='number') return; - var history=player.getHistory('useCard',function(evt){ + audio: "xinfu_guanchao", + forced: true, + mod: { + aiOrder: function (player, card, num) { + if (typeof card.number != "number") return; + var history = player.getHistory("useCard", function (evt) { return evt.isPhaseUsing(); }); - if(history.length==0) return num+10*(14-card.number); - var num=get.number(history[0].card); - if(!num) return; - for(var i=1;inum) return num+10*(14-card.number); + if (card.number > num) return num + 10 * (14 - card.number); }, }, - filter:function (event,player){ - var history=player.getHistory('useCard',function(evt){ + filter: function (event, player) { + var history = player.getHistory("useCard", function (evt) { return evt.isPhaseUsing(); }); - if(history.length<2) return false; - var num=get.number(history[0].card); - if(!num) return false; - for(var i=1;i=num) return; - num=num2; + if (history.length == 0) return num + 10 * card.number; + var num = get.number(history[0].card); + if (!num) return; + for (var i = 1; i < history.length; i++) { + var num2 = get.number(history[i].card); + if (!num2 || num2 >= num) return; + num = num2; } - if(card.number=num) return false; - num=num2; + if (history.length < 2) return false; + var num = get.number(history[0].card); + if (!num) return false; + for (var i = 1; i < history.length; i++) { + var num2 = get.number(history[i].card); + if (!num2 || num2 >= num) return false; + num = num2; } return true; }, - content:function (){ + content: function () { player.draw(); }, - sub:true, + sub: true, }, }, - audio:2, - trigger:{ - player:"phaseUseBegin", + audio: 2, + trigger: { + player: "phaseUseBegin", }, - direct:true, - content:function (){ - 'step 0' - var list=['递增','递减','取消']; - player.chooseControl(list).set('prompt',get.prompt2('xinfu_guanchao')).set('ai',function(){ - return [0,1].randomGet(); - }); - 'step 1' - switch(result.control){ - case '递增':{ - player.logSkill('xinfu_guanchao'); - player.addTempSkill('xinfu_guanchao_dizeng','phaseUseEnd'); + direct: true, + content: function () { + "step 0"; + var list = ["递增", "递减", "取消"]; + player + .chooseControl(list) + .set("prompt", get.prompt2("xinfu_guanchao")) + .set("ai", function () { + return [0, 1].randomGet(); + }); + ("step 1"); + switch (result.control) { + case "递增": { + player.logSkill("xinfu_guanchao"); + player.addTempSkill("xinfu_guanchao_dizeng", "phaseUseEnd"); break; } - case '递减':{ - player.logSkill('xinfu_guanchao'); - player.addTempSkill('xinfu_guanchao_dijian','phaseUseEnd'); + case "递减": { + player.logSkill("xinfu_guanchao"); + player.addTempSkill("xinfu_guanchao_dijian", "phaseUseEnd"); break; } - case '取消':{ + case "取消": { break; } } }, }, - "xinfu_xunxian":{ - usable:1, - audio:2, - trigger:{ - player:["useCardAfter","respond"], + xinfu_xunxian: { + usable: 1, + audio: 2, + trigger: { + player: ["useCardAfter", "respond"], }, - filter:function (event,player){ - if(get.itemtype(event.cards)!=='cards'||!game.hasPlayer(current=>{ - if(current===player) return false; - return current.getHp()>player.getHp()||current.countCards('h')>player.countCards('h'); - })) return false; - for(var i=0;i { + if (current === player) return false; + return ( + current.getHp() > player.getHp() || + current.countCards("h") > player.countCards("h") + ); + }) + ) + return false; + for (var i = 0; i < event.cards.length; i++) { + if (event.cards[i].isInPile()) { return true; } } return false; }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt2('xinfu_xunxian'),(card,player,target)=>{ - if(target===player) return false; - return target.getHp()>player.getHp()||target.countCards('h')>player.countCards('h'); - }).set('ai',(target)=>{ - let att=get.attitude(_status.event.player,target),name=_status.event.cards[0].name; - if(att<3) return 0; - if(target.hasJudge('lebu')) att/=5; - if(name==='sha'&&target.hasSha()) att/=5; - if(name==='wuxie'&&target.needsToDiscard(_status.event.cards)) att/=5; - return att/(1+get.distance(player,target,'absolute')); - }).set('cards',trigger.cards).forResult(); + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("xinfu_xunxian"), (card, player, target) => { + if (target === player) return false; + return ( + target.getHp() > player.getHp() || + target.countCards("h") > player.countCards("h") + ); + }) + .set("ai", (target) => { + let att = get.attitude(_status.event.player, target), + name = _status.event.cards[0].name; + if (att < 3) return 0; + if (target.hasJudge("lebu")) att /= 5; + if (name === "sha" && target.hasSha()) att /= 5; + if (name === "wuxie" && target.needsToDiscard(_status.event.cards)) att /= 5; + return att / (1 + get.distance(player, target, "absolute")); + }) + .set("cards", trigger.cards) + .forResult(); }, - async content(event, trigger, player){ - let list=[]; - for(let i=0;i=player.hp) return false; - return player.countCards('h')>0; + enable: "phaseUse", + filter: function (event, player) { + if (player.hasSkill("xinfu_kannan_phase")) return false; + if (player.getStat().skill.xinfu_kannan >= player.hp) return false; + return player.countCards("h") > 0; }, - filterTarget:function (card,player,target){ - if(target.hasSkill('xinfu_kannan_phase')) return false; + filterTarget: function (card, player, target) { + if (target.hasSkill("xinfu_kannan_phase")) return false; return player.canCompare(target); }, - ai:{ - order:function (){ - return get.order({name:'sha'})+0.4; + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.4; }, - result:{ - target:function (player,target){ - if(player.hasCard(function(card){ - if(get.position(card)!="h") return false; - var val=get.value(card); - if(val<0) return true; - if(val<=5){ - return card.number>=12; - } - if(val<=6){ - return card.number>=13; - } - return false; - })) return -1; + result: { + target: function (player, target) { + if ( + player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (val < 0) return true; + if (val <= 5) { + return card.number >= 12; + } + if (val <= 6) { + return card.number >= 13; + } + return false; + }) + ) + return -1; return 0; }, }, }, - content:function (){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ - player.addTempSkill('xinfu_kannan_phase'); - if(!player.hasSkill('kannan_eff')){ - player.addSkill('kannan_eff'); - }else{ - if(!player.storage.kannan_eff) player.storage.kannan_eff=0; + ("step 1"); + if (result.bool) { + player.addTempSkill("xinfu_kannan_phase"); + if (!player.hasSkill("kannan_eff")) { + player.addSkill("kannan_eff"); + } else { + if (!player.storage.kannan_eff) player.storage.kannan_eff = 0; } player.storage.kannan_eff++; - player.markSkill('kannan_eff'); - } - else{ - target.addTempSkill('xinfu_kannan_phase'); - if(!target.hasSkill('kannan_eff')){ - target.addSkill('kannan_eff'); - } - else{ - if(!target.storage.kannan_eff) player.storage.kannan_eff=0; + player.markSkill("kannan_eff"); + } else { + target.addTempSkill("xinfu_kannan_phase"); + if (!target.hasSkill("kannan_eff")) { + target.addSkill("kannan_eff"); + } else { + if (!target.storage.kannan_eff) player.storage.kannan_eff = 0; //target.storage.kannan_eff++; //target.markSkill('kannan_eff'); } target.storage.kannan_eff++; - target.markSkill('kannan_eff'); + target.markSkill("kannan_eff"); } }, }, - "kannan_eff":{ - mark:true, - intro:{ - content:"下一张杀的伤害基数+#", + kannan_eff: { + mark: true, + intro: { + content: "下一张杀的伤害基数+#", }, - trigger:{ - player:"useCard", + trigger: { + player: "useCard", }, - filter:function (event){ - return event.card&&event.card.name=='sha'; + filter: function (event) { + return event.card && event.card.name == "sha"; }, - forced:true, - content:function (){ - if(!trigger.baseDamage) trigger.baseDamage=1; - trigger.baseDamage+=player.storage.kannan_eff; - player.removeSkill('kannan_eff'); + forced: true, + content: function () { + if (!trigger.baseDamage) trigger.baseDamage = 1; + trigger.baseDamage += player.storage.kannan_eff; + player.removeSkill("kannan_eff"); }, - init:function (player){ - player.storage.kannan_eff=0; + init: function (player) { + player.storage.kannan_eff = 0; }, - onremove:function (player){ + onremove: function (player) { delete player.storage.kannan_eff; }, - ai:{ - damageBonus:true, + ai: { + damageBonus: true, }, }, - "xinfu_tushe":{ - audio:2, + xinfu_tushe: { + audio: 2, mod: { aiOrder(player, card, num) { - if (get.tag(card, 'multitarget')) { - if (player.countCards('h', { type: 'basic' })) return num / 10; + if (get.tag(card, "multitarget")) { + if (player.countCards("h", { type: "basic" })) return num / 10; return num * 10; } - if (get.type(card) === 'basic') return num + 10; + if (get.type(card) === "basic") return num + 10; }, aiValue(player, card, num) { - if (card.name === 'zhangba') { + if (card.name === "zhangba") { let fact = (n) => { - if (n > 1) return n * fact(n - 1); - return 1; - }, basic = 0; - return fact(Math.min(player.countCards('hs', i => { - if (get.tag(i, 'multitarget')) return 2; - if (!['shan', 'tao', 'jiu'].includes(card.name)) return 1; - basic++; - }) / (1 + basic), player.getCardUsable('sha'))); + if (n > 1) return n * fact(n - 1); + return 1; + }, + basic = 0; + return fact( + Math.min( + player.countCards("hs", (i) => { + if (get.tag(i, "multitarget")) return 2; + if (!["shan", "tao", "jiu"].includes(card.name)) return 1; + basic++; + }) / + (1 + basic), + player.getCardUsable("sha") + ) + ); } - if (['shan', 'tao', 'jiu'].includes(card.name)) { - if (player.getEquip('zhangba') && player.countCards('hs') > 1) return 0.01; + if (["shan", "tao", "jiu"].includes(card.name)) { + if (player.getEquip("zhangba") && player.countCards("hs") > 1) return 0.01; return num / 2; } - if (get.tag(card, 'multitarget')) return num + game.players.length; + if (get.tag(card, "multitarget")) return num + game.players.length; }, aiUseful(player, card, num) { - if (get.name(card, player) === 'shan') { - if (player.countCards('hs', i => { - if (card === i || card.cards && card.cards.includes(i)) return false; - return get.name(i, player) === 'shan'; - })) return -1; + if (get.name(card, player) === "shan") { + if ( + player.countCards("hs", (i) => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.name(i, player) === "shan"; + }) + ) + return -1; return num / Math.pow(Math.max(1, player.hp), 2); } - } + }, }, - trigger:{ - player:"useCardToPlayered", + trigger: { + player: "useCardToPlayered", }, locked: false, - frequent:true, - filter:function (event,player){ - if(get.type(event.card)=='equip') return false; - if(event.getParent().triggeredTargets3.length>1) return false; - return event.targets.length>0&&!player.countCards('h',{type:'basic',}); + frequent: true, + filter: function (event, player) { + if (get.type(event.card) == "equip") return false; + if (event.getParent().triggeredTargets3.length > 1) return false; + return event.targets.length > 0 && !player.countCards("h", { type: "basic" }); }, - content:function (){ + content: function () { player.draw(trigger.targets.length); }, - ai:{ - presha:true, - pretao:true, - threaten:1.8, + ai: { + presha: true, + pretao: true, + threaten: 1.8, effect: { player(card, player, target) { - if (typeof card === 'object' && card.name !== 'shan' && get.type(card) !== 'equip' && !player.countCards('h', i => { - if (card === i || card.cards && card.cards.includes(i)) return false; - return get.type(i) === 'basic'; - })) { - let targets = [], evt = _status.event.getParent('useCard'); + if ( + typeof card === "object" && + card.name !== "shan" && + get.type(card) !== "equip" && + !player.countCards("h", (i) => { + if (card === i || (card.cards && card.cards.includes(i))) return false; + return get.type(i) === "basic"; + }) + ) { + let targets = [], + evt = _status.event.getParent("useCard"); targets.addArray(ui.selected.targets); if (evt && evt.card == card) targets.addArray(evt.targets); if (targets.length) return [1, targets.length]; - if (get.tag(card, 'multitarget')) return [1, game.players.length - 1]; + if (get.tag(card, "multitarget")) return [1, game.players.length - 1]; return [1, 1]; } - } - } - } + }, + }, + }, }, - "xinfu_limu":{ - mod:{ - targetInRange:function (card,player,target){ - if(player.countCards('j')&&player.inRange(target)){ + xinfu_limu: { + mod: { + targetInRange: function (card, player, target) { + if (player.countCards("j") && player.inRange(target)) { return true; } }, - cardUsableTarget:function(card,player,target){ - if(player.countCards('j')&&player.inRange(target)) return true; + cardUsableTarget: function (card, player, target) { + if (player.countCards("j") && player.inRange(target)) return true; }, aiOrder(player, card, num) { - if (get.type(card, 'delay') && player.canUse(card, player) && player.canAddJudge(card)) return 15; - } + if ( + get.type(card, "delay") && + player.canUse(card, player) && + player.canAddJudge(card) + ) + return 15; + }, }, - locked:false, - audio:2, - enable:"phaseUse", - discard:false, - filter:function (event,player){ - if(player.hasJudge('lebu')) return false; - return player.countCards('hes',{suit:'diamond'})>0; + locked: false, + audio: 2, + enable: "phaseUse", + discard: false, + filter: function (event, player) { + if (player.hasJudge("lebu")) return false; + return player.countCards("hes", { suit: "diamond" }) > 0; }, - viewAs:{name:'lebu'}, + viewAs: { name: "lebu" }, //prepare:"throw", - position:"hes", - filterCard:function(card,player,event){ - return get.suit(card)=='diamond'&&player.canAddJudge({name:'lebu',cards:[card]}); + position: "hes", + filterCard: function (card, player, event) { + return get.suit(card) == "diamond" && player.canAddJudge({ name: "lebu", cards: [card] }); }, - selectTarget:-1, - filterTarget:function (card,player,target){ - return player==target; + selectTarget: -1, + filterTarget: function (card, player, target) { + return player == target; }, check(card) { var player = _status.event.player; - if (!player.getEquip('zhangba')) { + if (!player.getEquip("zhangba")) { let damaged = player.maxHp - player.hp - 1; - if (player.countCards('h', function (cardx) { - if (cardx == card) return false; - if (cardx.name == 'tao') { - if (damaged < 1) return true; - damaged--; - } - return ['shan', 'jiu'].includes(cardx.name); - }) > 0) return 0; + if ( + player.countCards("h", function (cardx) { + if (cardx == card) return false; + if (cardx.name == "tao") { + if (damaged < 1) return true; + damaged--; + } + return ["shan", "jiu"].includes(cardx.name); + }) > 0 + ) + return 0; } - if (card.name == 'shan') return 15; - if (card.name == 'tao' || card.name == 'jiu') return 10; + if (card.name == "shan") return 15; + if (card.name == "tao" || card.name == "jiu") return 10; return 9 - get.value(card); }, - onuse:function (links,player){ - var next=game.createEvent('limu_recover',false,_status.event.getParent()); - next.player=player; - next.setContent(function(){player.recover()}); + onuse: function (links, player) { + var next = game.createEvent("limu_recover", false, _status.event.getParent()); + next.player = player; + next.setContent(function () { + player.recover(); + }); }, - ai:{ + ai: { result: { target(player, target) { let res = lib.card.lebu.ai.result.target(player, target); - if (target.isDamaged()) return res + 2 * Math.abs(get.recoverEffect(target, player, target)); + if (target.isDamaged()) + return res + 2 * Math.abs(get.recoverEffect(target, player, target)); return res; }, - ignoreStatus: true + ignoreStatus: true, }, order(item, player) { - if (player.hp > 1 && player.countCards('j')) return 0; + if (player.hp > 1 && player.countCards("j")) return 0; return 12; }, effect: { target(card, player, target) { - if (target.isPhaseUsing() && typeof card === 'object' && get.type(card, target) === 'delay' && !target.countCards('j')) { - let shas = target.getCards('hs', i => { - if (card === i || card.cards && card.cards.includes(i)) return false; - return get.name(i, target) === 'sha' && target.getUseValue(i) > 0; - }) - target.getCardUsable('sha'); + if ( + target.isPhaseUsing() && + typeof card === "object" && + get.type(card, target) === "delay" && + !target.countCards("j") + ) { + let shas = + target.getCards("hs", (i) => { + if (card === i || (card.cards && card.cards.includes(i))) + return false; + return get.name(i, target) === "sha" && target.getUseValue(i) > 0; + }) - target.getCardUsable("sha"); if (shas > 0) return [1, 1.5 * shas]; } - } - } + }, + }, }, }, }, - characterReplace:{ - duji:['duji','re_duji','ns_duji'], - sp_taishici:['sp_taishici','re_sp_taishici'], - mazhong:['mazhong','re_mazhong'], - wenpin:['wenpin','re_wenpin'], - liuyan:['liuyan','jsrg_liuyan','ol_liuyan'], + characterReplace: { + duji: ["duji", "re_duji", "ns_duji"], + sp_taishici: ["sp_taishici", "re_sp_taishici"], + mazhong: ["mazhong", "re_mazhong"], + wenpin: ["wenpin", "re_wenpin"], + liuyan: ["liuyan", "jsrg_liuyan", "ol_liuyan"], }, - translate:{ - xinghuoliaoyuan:'星火燎原', - "sp_taishici":"SP太史慈", - sp_taishici_prefix:'SP', - wangcan:"王粲", - "re_jsp_pangtong":"SP庞统", - re_jsp_pangtong_prefix:'SP', - lvdai:"吕岱", - "re_zhangliang":"张梁", - lvqian:"吕虔", - panjun:"潘濬", - duji:"杜畿", - zhoufang:"周鲂", - yanjun:"严畯", - liuyao:"刘繇", - liuyan:"刘焉", - "xinfu_guolun":"过论", - "xinfu_guolun_info":"出牌阶段限一次,你可以展示一名其他角色的手牌,然后展示你的一张牌。你与其交换这两张牌,然后展示的牌点数较小的角色摸一张牌。", - "xinfu_zhanji":"展骥", - "xinfu_zhanji_info":"锁定技。你的出牌阶段内,当你因摸牌且不是因为此技能效果而得到牌后,你摸一张牌。", - "xinfu_songsang":"送丧", - "xinfu_songsang_info":"限定技,其他角色死亡时,你可以回复1点体力(若你未受伤,则改为加1点体力上限);然后获得技能〖展骥〗。", - "xinfu_jixu":"击虚", - "xinfu_jixu_info":"出牌阶段限一次,若你有手牌,你可以令任意名体力值相等的其他角色猜测你的手牌中是否有【杀】。然后,你摸X张牌(X为猜错的角色数)。若你有【杀】,则你本回合内使用【杀】时,所有这些角色均成为【杀】的目标;若你没有【杀】,则你弃置所有这些角色的各一张牌。若X为零,你结束出牌阶段。", - "jixu_sha":"击虚", - "jixu_sha_info":"", - "xinfu_sanwen":"散文", - "xinfu_sanwen_info":"每回合限一次。当你得到牌后,若你的原手牌中有与这些牌名称相同的牌,则你可以展示这些牌,弃置新得到的同名牌并摸两倍的牌。", - "xinfu_qiai":"七哀", - "xinfu_qiai_info":"限定技,当你进入濒死状态时,你可以令所有其他角色依次交给你一张牌。", - "xinfu_denglou":"登楼", - "xinfu_denglou_info":"限定技,结束阶段,若你没有手牌,则你可以观看牌堆顶的四张牌,依次使用其中的所有基本牌(不能使用则弃置),然后获得其余的牌。", - "qinguo_use":"勤国", - "qinguo_use_info":"", - "xinfu_qinguo":"勤国", - "xinfu_qinguo_info":"当你使用的装备牌结算完成时,你可以视为使用一张【杀】;当你因使用或失去装备牌导致装备区内牌的数量发生变化后,若你装备区内牌的数量等于你的体力值,则你回复1点体力。", - "qinguo_lose":"勤国", - "qinguo_lose_info":"", - "xinfu_jijun":"集军", - "xinfu_jijun_info":"当你于回合内使用非装备牌或武器牌指定目标后,若你是此牌的目标,你可以进行一次判定。然后,你将判定牌置于自己的武将牌上,称之为「方」。", - "xinfu_fangtong":"方统", - "xinfu_fangtong_info":"结束阶段,你可以弃置总点数之和为36的一张牌与任意张「方」,并对一名其他角色造成3点雷电伤害。", - "xinfu_weilu":"威虏", - "xinfu_weilu_info":"锁定技,当你受到伤害后,伤害来源获得一枚「虏」。你的下个出牌阶段开始时,所有有「虏」的角色将体力失去至1点。此阶段结束后,这些角色回复以此法失去的体力。", - "weilu_effect":"威虏", - "weilu_effect_info":"", - "weilu_effect2":"威虏", - "weilu_effect2_info":"", - "xinfu_zengdao":"赠刀", - "xinfu_zengdao_info":"限定技,出牌阶段,你可以将装备区内的任意张牌置于一名其他角色的武将牌旁,称之为“刀”。该角色造成伤害时,其须移去一张“刀”,然后此伤害+1。", - "xinfu_zengdao2":"赠刀", - "xinfu_zengdao2_info":"", - "xinfu_guanwei":"观微", - "xinfu_guanwei_info":"每回合限一次。一名角色的出牌阶段结束时,若其本回合使用过两张以上的牌且这些牌均有花色且花色均相同,则你可以弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。", - "xinfu_gongqing":"公清", - "xinfu_gongqing_info":"锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", - "xinfu_andong":"安东", - "xinfu_andong_info":"当你受到伤害时,你可以令伤害来源选择一项:1.令你观看其的手牌并获得其中的所有红桃牌;2.防止此伤害,然后其本回合内的红桃手牌不计入手牌上限。", - "xinfu_yingshi":"应势", - "xinfu_yingshi_info":"出牌阶段开始时,若场上的所有角色均没有「酬」,则你可以将所有的红桃牌置于一名其他角色的武将牌旁,称之为「酬」。有「酬」的角色受到【杀】的伤害后/死亡时,伤害来源/你获得其中的一张/所有的「酬」。", - "yingshi_heart":"应势", - "yingshi_heart_info":"", - "yingshi_die":"应势", - "yingshi_die_info":"", - "xinfu_duanfa":"断发", - "xinfu_duanfa_info":"出牌阶段,你可以弃置任意张黑色牌,然后摸等量的牌。(每回合内限X张,X为你的体力上限)", - "xinfu_youdi":"诱敌", - "xinfu_youdi_info":"结束阶段开始时,你可以令一名其他角色弃置你的一张手牌,若此牌:不为黑色,你摸一张牌。不为【杀】,你获得该角色的一张牌。", - "xinfu_guanchao":"观潮", - "xinfu_guanchao_info":"出牌阶段开始时,你可以选择获得一项效果直到回合结束:1.当你使用牌时,若你此阶段使用过的所有牌的点数为递增,你摸一张牌;2.当你使用牌时,若你此阶段使用过的所有牌的点数为递减,你摸一张牌。", - "xinfu_xunxian":"逊贤", - "xinfu_xunxian_info":"每回合限一次。当你使用或打出的牌结算完成后,你可以将其对应的所有实体牌交给一名手牌数或体力值大于你的角色。", - "xinfu_kannan":"戡难", - "xinfu_kannan_info":"出牌阶段限X次,你可以与一名本回合内未成为过〖戡难〗目标的角色拼点。若你赢,你使用的下一张【杀】的伤害值基数+1,且你本回合内不能再发动〖戡难〗。若你没赢,其使用的下一张【杀】的伤害值基数+1。(X为你的体力值)。", - "kannan_eff":"戡难", - "kannan_eff_info":"", - "xinfu_tushe":"图射", - "xinfu_tushe_info":"当你使用非装备牌指定目标后,若你没有基本牌,则你可以摸X张牌。(X为此牌指定的目标数)", - "xinfu_limu":"立牧", - "xinfu_limu_info":"出牌阶段,你可以将一张♦牌当做【乐不思蜀】对自己使用,然后回复1点体力。只要你的判定区内有牌,你对攻击范围内的其他角色使用牌便没有次数和距离限制。", - xinyingshi:'应势', - xinyingshi_info:'出牌阶段开始时,若场上所有角色的武将牌上均没有“酬”,则你可以将任意张牌置于一名角色的武将牌上,称为“酬”。若如此做:当有角色使用牌对有“酬”的角色造成伤害后,其可以获得一张“酬”,并获得牌堆中所有与“酬”花色点数均相同的牌;有“酬”的角色死亡时,你获得其所有“酬”。', + translate: { + xinghuoliaoyuan: "星火燎原", + sp_taishici: "SP太史慈", + sp_taishici_prefix: "SP", + wangcan: "王粲", + re_jsp_pangtong: "SP庞统", + re_jsp_pangtong_prefix: "SP", + lvdai: "吕岱", + re_zhangliang: "张梁", + lvqian: "吕虔", + panjun: "潘濬", + duji: "杜畿", + zhoufang: "周鲂", + yanjun: "严畯", + liuyao: "刘繇", + liuyan: "刘焉", + xinfu_guolun: "过论", + xinfu_guolun_info: + "出牌阶段限一次,你可以展示一名其他角色的手牌,然后展示你的一张牌。你与其交换这两张牌,然后展示的牌点数较小的角色摸一张牌。", + xinfu_zhanji: "展骥", + xinfu_zhanji_info: + "锁定技。你的出牌阶段内,当你因摸牌且不是因为此技能效果而得到牌后,你摸一张牌。", + xinfu_songsang: "送丧", + xinfu_songsang_info: + "限定技,其他角色死亡时,你可以回复1点体力(若你未受伤,则改为加1点体力上限);然后获得技能〖展骥〗。", + xinfu_jixu: "击虚", + xinfu_jixu_info: + "出牌阶段限一次,若你有手牌,你可以令任意名体力值相等的其他角色猜测你的手牌中是否有【杀】。然后,你摸X张牌(X为猜错的角色数)。若你有【杀】,则你本回合内使用【杀】时,所有这些角色均成为【杀】的目标;若你没有【杀】,则你弃置所有这些角色的各一张牌。若X为零,你结束出牌阶段。", + jixu_sha: "击虚", + jixu_sha_info: "", + xinfu_sanwen: "散文", + xinfu_sanwen_info: + "每回合限一次。当你得到牌后,若你的原手牌中有与这些牌名称相同的牌,则你可以展示这些牌,弃置新得到的同名牌并摸两倍的牌。", + xinfu_qiai: "七哀", + xinfu_qiai_info: "限定技,当你进入濒死状态时,你可以令所有其他角色依次交给你一张牌。", + xinfu_denglou: "登楼", + xinfu_denglou_info: + "限定技,结束阶段,若你没有手牌,则你可以观看牌堆顶的四张牌,依次使用其中的所有基本牌(不能使用则弃置),然后获得其余的牌。", + qinguo_use: "勤国", + qinguo_use_info: "", + xinfu_qinguo: "勤国", + xinfu_qinguo_info: + "当你使用的装备牌结算完成时,你可以视为使用一张【杀】;当你因使用或失去装备牌导致装备区内牌的数量发生变化后,若你装备区内牌的数量等于你的体力值,则你回复1点体力。", + qinguo_lose: "勤国", + qinguo_lose_info: "", + xinfu_jijun: "集军", + xinfu_jijun_info: + "当你于回合内使用非装备牌或武器牌指定目标后,若你是此牌的目标,你可以进行一次判定。然后,你将判定牌置于自己的武将牌上,称之为「方」。", + xinfu_fangtong: "方统", + xinfu_fangtong_info: + "结束阶段,你可以弃置总点数之和为36的一张牌与任意张「方」,并对一名其他角色造成3点雷电伤害。", + xinfu_weilu: "威虏", + xinfu_weilu_info: + "锁定技,当你受到伤害后,伤害来源获得一枚「虏」。你的下个出牌阶段开始时,所有有「虏」的角色将体力失去至1点。此阶段结束后,这些角色回复以此法失去的体力。", + weilu_effect: "威虏", + weilu_effect_info: "", + weilu_effect2: "威虏", + weilu_effect2_info: "", + xinfu_zengdao: "赠刀", + xinfu_zengdao_info: + "限定技,出牌阶段,你可以将装备区内的任意张牌置于一名其他角色的武将牌旁,称之为“刀”。该角色造成伤害时,其须移去一张“刀”,然后此伤害+1。", + xinfu_zengdao2: "赠刀", + xinfu_zengdao2_info: "", + xinfu_guanwei: "观微", + xinfu_guanwei_info: + "每回合限一次。一名角色的出牌阶段结束时,若其本回合使用过两张以上的牌且这些牌均有花色且花色均相同,则你可以弃置一张牌,令其摸两张牌并进行一个额外的出牌阶段。", + xinfu_gongqing: "公清", + xinfu_gongqing_info: + "锁定技。当你受到伤害时,若伤害来源的攻击范围:<3,则你令此伤害的数值减为1。>3,你令此伤害+1。", + xinfu_andong: "安东", + xinfu_andong_info: + "当你受到伤害时,你可以令伤害来源选择一项:1.令你观看其的手牌并获得其中的所有红桃牌;2.防止此伤害,然后其本回合内的红桃手牌不计入手牌上限。", + xinfu_yingshi: "应势", + xinfu_yingshi_info: + "出牌阶段开始时,若场上的所有角色均没有「酬」,则你可以将所有的红桃牌置于一名其他角色的武将牌旁,称之为「酬」。有「酬」的角色受到【杀】的伤害后/死亡时,伤害来源/你获得其中的一张/所有的「酬」。", + yingshi_heart: "应势", + yingshi_heart_info: "", + yingshi_die: "应势", + yingshi_die_info: "", + xinfu_duanfa: "断发", + xinfu_duanfa_info: + "出牌阶段,你可以弃置任意张黑色牌,然后摸等量的牌。(每回合内限X张,X为你的体力上限)", + xinfu_youdi: "诱敌", + xinfu_youdi_info: + "结束阶段开始时,你可以令一名其他角色弃置你的一张手牌,若此牌:不为黑色,你摸一张牌。不为【杀】,你获得该角色的一张牌。", + xinfu_guanchao: "观潮", + xinfu_guanchao_info: + "出牌阶段开始时,你可以选择获得一项效果直到回合结束:1.当你使用牌时,若你此阶段使用过的所有牌的点数为递增,你摸一张牌;2.当你使用牌时,若你此阶段使用过的所有牌的点数为递减,你摸一张牌。", + xinfu_xunxian: "逊贤", + xinfu_xunxian_info: + "每回合限一次。当你使用或打出的牌结算完成后,你可以将其对应的所有实体牌交给一名手牌数或体力值大于你的角色。", + xinfu_kannan: "戡难", + xinfu_kannan_info: + "出牌阶段限X次,你可以与一名本回合内未成为过〖戡难〗目标的角色拼点。若你赢,你使用的下一张【杀】的伤害值基数+1,且你本回合内不能再发动〖戡难〗。若你没赢,其使用的下一张【杀】的伤害值基数+1。(X为你的体力值)。", + kannan_eff: "戡难", + kannan_eff_info: "", + xinfu_tushe: "图射", + xinfu_tushe_info: + "当你使用非装备牌指定目标后,若你没有基本牌,则你可以摸X张牌。(X为此牌指定的目标数)", + xinfu_limu: "立牧", + xinfu_limu_info: + "出牌阶段,你可以将一张♦牌当做【乐不思蜀】对自己使用,然后回复1点体力。只要你的判定区内有牌,你对攻击范围内的其他角色使用牌便没有次数和距离限制。", + xinyingshi: "应势", + xinyingshi_info: + "出牌阶段开始时,若场上所有角色的武将牌上均没有“酬”,则你可以将任意张牌置于一名角色的武将牌上,称为“酬”。若如此做:当有角色使用牌对有“酬”的角色造成伤害后,其可以获得一张“酬”,并获得牌堆中所有与“酬”花色点数均相同的牌;有“酬”的角色死亡时,你获得其所有“酬”。", - xinghuoliaoyuan_tianfu:'天府', - xinghuoliaoyuan_tianliang:'天梁', - xinghuoliaoyuan_tianji:'天机', - xinghuoliaoyuan_tiantong:'天同', - xinghuoliaoyuan_tianxiang:'天相', - xinghuoliaoyuan_qisha:'七杀', + xinghuoliaoyuan_tianfu: "天府", + xinghuoliaoyuan_tianliang: "天梁", + xinghuoliaoyuan_tianji: "天机", + xinghuoliaoyuan_tiantong: "天同", + xinghuoliaoyuan_tianxiang: "天相", + xinghuoliaoyuan_qisha: "七杀", }, }; }); diff --git a/character/yijiang.js b/character/yijiang.js index ad61aacf4..8736f7e0e 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -1,1606 +1,2115 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'yijiang', - connect:true, + name: "yijiang", + connect: true, //connectBanned:['qinmi'], - characterSort:{ - yijiang:{ - yijiang_2011:['caozhi','yujin','zhangchunhua','xin_fazheng','xin_masu','xin_xushu','xusheng','lingtong','wuguotai','chengong','gaoshun'], - yijiang_2012:['wangyi','xunyou','zhonghui','old_madai','liaohua','guanzhang','bulianshi','handang','chengpu','liubiao','old_huaxiong','caozhang'], - yijiang_2013:['manchong','guohuai','caochong','guanping','liufeng','jianyong','yufan','panzhangmazhong','zhuran','xin_liru','fuhuanghou'], - yijiang_2014:['hanhaoshihuan','chenqun','caozhen','zhangsong','wuyi','zhoucang','zhuhuan','guyong','sunluban','yj_jushou','caifuren'], - yijiang_2015:['caoxiu','caorui','zhongyao','xiahoushi','liuchen','zhangyi','zhuzhi','quancong','sunxiu','gongsunyuan','guotufengji'], - yijiang_2016:['guohuanghou','sunziliufang','huanghao','liyan','sundeng','cenhun','zhangrang','liuyu'], - yijiang_2017:['xinxianying','jikang','wuxian','qinmi','xuezong','xushi','caiyong','caojie'], - yijiang_2022:['lukai','kebineng','zhugeshang','liwan','wuanguo','hanlong','yj_sufei','yj_qiaozhou'], - yijiang_2023:['xiahoumao','chenshi','sunli','feiyao'], + characterSort: { + yijiang: { + yijiang_2011: [ + "caozhi", + "yujin", + "zhangchunhua", + "xin_fazheng", + "xin_masu", + "xin_xushu", + "xusheng", + "lingtong", + "wuguotai", + "chengong", + "gaoshun", + ], + yijiang_2012: [ + "wangyi", + "xunyou", + "zhonghui", + "old_madai", + "liaohua", + "guanzhang", + "bulianshi", + "handang", + "chengpu", + "liubiao", + "old_huaxiong", + "caozhang", + ], + yijiang_2013: [ + "manchong", + "guohuai", + "caochong", + "guanping", + "liufeng", + "jianyong", + "yufan", + "panzhangmazhong", + "zhuran", + "xin_liru", + "fuhuanghou", + ], + yijiang_2014: [ + "hanhaoshihuan", + "chenqun", + "caozhen", + "zhangsong", + "wuyi", + "zhoucang", + "zhuhuan", + "guyong", + "sunluban", + "yj_jushou", + "caifuren", + ], + yijiang_2015: [ + "caoxiu", + "caorui", + "zhongyao", + "xiahoushi", + "liuchen", + "zhangyi", + "zhuzhi", + "quancong", + "sunxiu", + "gongsunyuan", + "guotufengji", + ], + yijiang_2016: [ + "guohuanghou", + "sunziliufang", + "huanghao", + "liyan", + "sundeng", + "cenhun", + "zhangrang", + "liuyu", + ], + yijiang_2017: [ + "xinxianying", + "jikang", + "wuxian", + "qinmi", + "xuezong", + "xushi", + "caiyong", + "caojie", + ], + yijiang_2022: [ + "lukai", + "kebineng", + "zhugeshang", + "liwan", + "wuanguo", + "hanlong", + "yj_sufei", + "yj_qiaozhou", + ], + yijiang_2023: ["xiahoumao", "chenshi", "sunli", "feiyao"], }, }, - character:{ - xiahoumao:['male','wei',4,['tongwei','cuguo']], - chenshi:['male','shu',4,['qingbei']], - sunli:['male','wei',4,['kangli']], - feiyao:['male','wei',4,['zhenfeng']], - wuanguo:['male','qun',4,['diezhang','duanwan']], - hanlong:['male','wei',4,['duwang','cibei']], - yj_qiaozhou:['male','shu',3,['shiming','jiangxi']], - yj_sufei:['male','wu',4,['shuojian']], - liwan:['female','wei',3,['liandui','biejun']], - zhugeshang:['male','shu',3,['sangu','yizu']], - kebineng:['male','qun',4,['kousheng']], - lukai:['male','wu',4,['lkbushi','lkzhongzhuang']], - xin_fazheng:['male','shu',3,['xinxuanhuo','xinenyuan']], - guanzhang:['male','shu',4,['fuhun']], - wangyi:['female','wei',3,['zhenlie','miji']], - caozhang:['male','wei',4,['new_jiangchi']], - guohuai:['male','wei',4,['rejingce']], - zhangchunhua:['female','wei',3,['jueqing','shangshi']], - caozhi:['male','wei',3,['luoying','jiushi']], - caochong:['male','wei',3,['chengxiang','renxin']], - xunyou:['male','wei',3,['qice','zhiyu'],['clan:颍川荀氏']], - xin_xushu:['male','shu',3,['xinwuyan','xinjujian'],['border:wei']], - xin_masu:['male','shu',3,['olsanyao','rezhiman']], - zhuran:['male','wu',4,['danshou']], - xusheng:['male','wu',4,['xinpojun']], - wuguotai:['female','wu',3,['ganlu','buyi']], - lingtong:['male','wu',4,['xuanfeng']], - liubiao:['male','qun',3,['rezishou','zongshi']], - yufan:['male','wu',3,['zhiyan','zongxuan']], - chengong:['male','qun',3,['mingce','zhichi']], - bulianshi:['female','wu',3,['old_anxu','zhuiyi']], - handang:['male','wu',4,['gongji','jiefan']], - fuhuanghou:['female','qun',3,['qiuyuan','zhuikong']], - zhonghui:['male','wei',4,['quanji','zili'],['clan:颍川钟氏']], - jianyong:['male','shu',3,['qiaoshui','jyzongshi']], - old_madai:['male','shu',4,['mashu','qianxi']], - liufeng:['male','shu',4,['xiansi']], - manchong:['male','wei',3,['junxing','yuce']], - chenqun:['male','wei',3,['pindi','faen']], - sunluban:['female','wu',3,['chanhui','jiaojin']], - guyong:['male','wu',3,['shenxing','olbingyi']], - caifuren:['female','qun',3,['qieting','xianzhou']], - yj_jushou:['male','qun',3,['jianying','shibei']], - zhangsong:['male','shu',3,['qiangzhi','xiantu']], - zhuhuan:['male','wu',4,['fenli','pingkou']], - xiahoushi:['female','shu',3,['qiaoshi','yanyu']], + character: { + xiahoumao: ["male", "wei", 4, ["tongwei", "cuguo"]], + chenshi: ["male", "shu", 4, ["qingbei"]], + sunli: ["male", "wei", 4, ["kangli"]], + feiyao: ["male", "wei", 4, ["zhenfeng"]], + wuanguo: ["male", "qun", 4, ["diezhang", "duanwan"]], + hanlong: ["male", "wei", 4, ["duwang", "cibei"]], + yj_qiaozhou: ["male", "shu", 3, ["shiming", "jiangxi"]], + yj_sufei: ["male", "wu", 4, ["shuojian"]], + liwan: ["female", "wei", 3, ["liandui", "biejun"]], + zhugeshang: ["male", "shu", 3, ["sangu", "yizu"]], + kebineng: ["male", "qun", 4, ["kousheng"]], + lukai: ["male", "wu", 4, ["lkbushi", "lkzhongzhuang"]], + xin_fazheng: ["male", "shu", 3, ["xinxuanhuo", "xinenyuan"]], + guanzhang: ["male", "shu", 4, ["fuhun"]], + wangyi: ["female", "wei", 3, ["zhenlie", "miji"]], + caozhang: ["male", "wei", 4, ["new_jiangchi"]], + guohuai: ["male", "wei", 4, ["rejingce"]], + zhangchunhua: ["female", "wei", 3, ["jueqing", "shangshi"]], + caozhi: ["male", "wei", 3, ["luoying", "jiushi"]], + caochong: ["male", "wei", 3, ["chengxiang", "renxin"]], + xunyou: ["male", "wei", 3, ["qice", "zhiyu"], ["clan:颍川荀氏"]], + xin_xushu: ["male", "shu", 3, ["xinwuyan", "xinjujian"], ["border:wei"]], + xin_masu: ["male", "shu", 3, ["olsanyao", "rezhiman"]], + zhuran: ["male", "wu", 4, ["danshou"]], + xusheng: ["male", "wu", 4, ["xinpojun"]], + wuguotai: ["female", "wu", 3, ["ganlu", "buyi"]], + lingtong: ["male", "wu", 4, ["xuanfeng"]], + liubiao: ["male", "qun", 3, ["rezishou", "zongshi"]], + yufan: ["male", "wu", 3, ["zhiyan", "zongxuan"]], + chengong: ["male", "qun", 3, ["mingce", "zhichi"]], + bulianshi: ["female", "wu", 3, ["old_anxu", "zhuiyi"]], + handang: ["male", "wu", 4, ["gongji", "jiefan"]], + fuhuanghou: ["female", "qun", 3, ["qiuyuan", "zhuikong"]], + zhonghui: ["male", "wei", 4, ["quanji", "zili"], ["clan:颍川钟氏"]], + jianyong: ["male", "shu", 3, ["qiaoshui", "jyzongshi"]], + old_madai: ["male", "shu", 4, ["mashu", "qianxi"]], + liufeng: ["male", "shu", 4, ["xiansi"]], + manchong: ["male", "wei", 3, ["junxing", "yuce"]], + chenqun: ["male", "wei", 3, ["pindi", "faen"]], + sunluban: ["female", "wu", 3, ["chanhui", "jiaojin"]], + guyong: ["male", "wu", 3, ["shenxing", "olbingyi"]], + caifuren: ["female", "qun", 3, ["qieting", "xianzhou"]], + yj_jushou: ["male", "qun", 3, ["jianying", "shibei"]], + zhangsong: ["male", "shu", 3, ["qiangzhi", "xiantu"]], + zhuhuan: ["male", "wu", 4, ["fenli", "pingkou"]], + xiahoushi: ["female", "shu", 3, ["qiaoshi", "yanyu"]], - panzhangmazhong:['male','wu',4,['duodao','anjian']], - zhoucang:['male','shu',4,['xinzhongyong']], - guanping:['male','shu',4,['longyin']], - liaohua:['male','shu',4,['dangxian','fuli']], - chengpu:['male','wu',4,['lihuo','chunlao']], - gaoshun:['male','qun',4,['xinxianzhen','jinjiu']], - caozhen:['male','wei',4,['xinsidi']], - wuyi:['male','shu',4,['benxi'],['clan:陈留吴氏']], - hanhaoshihuan:['male','wei',4,['shenduan','yonglve']], + panzhangmazhong: ["male", "wu", 4, ["duodao", "anjian"]], + zhoucang: ["male", "shu", 4, ["xinzhongyong"]], + guanping: ["male", "shu", 4, ["longyin"]], + liaohua: ["male", "shu", 4, ["dangxian", "fuli"]], + chengpu: ["male", "wu", 4, ["lihuo", "chunlao"]], + gaoshun: ["male", "qun", 4, ["xinxianzhen", "jinjiu"]], + caozhen: ["male", "wei", 4, ["xinsidi"]], + wuyi: ["male", "shu", 4, ["benxi"], ["clan:陈留吴氏"]], + hanhaoshihuan: ["male", "wei", 4, ["shenduan", "yonglve"]], - caorui:['male','wei',3,['huituo','mingjian','xingshuai'],['zhu']], - caoxiu:['male','wei',4,['qianju','qingxi']], - zhongyao:['male','wei',3,['huomo','zuoding'],['clan:颍川钟氏']], - liuchen:['male','shu',4,['zhanjue','qinwang'],['zhu']], - zhangyi:['male','shu',4,['wurong','shizhi']], - sunxiu:['male','wu',3,['yanzhu','xingxue','xinzhaofu'],['zhu']], - zhuzhi:['male','wu',4,['xinanguo']], - quancong:['male','wu',4,['yaoming']], - gongsunyuan:['male','qun',4,['huaiyi']], - guotufengji:['male','qun',3,['jigong','shifei']], + caorui: ["male", "wei", 3, ["huituo", "mingjian", "xingshuai"], ["zhu"]], + caoxiu: ["male", "wei", 4, ["qianju", "qingxi"]], + zhongyao: ["male", "wei", 3, ["huomo", "zuoding"], ["clan:颍川钟氏"]], + liuchen: ["male", "shu", 4, ["zhanjue", "qinwang"], ["zhu"]], + zhangyi: ["male", "shu", 4, ["wurong", "shizhi"]], + sunxiu: ["male", "wu", 3, ["yanzhu", "xingxue", "xinzhaofu"], ["zhu"]], + zhuzhi: ["male", "wu", 4, ["xinanguo"]], + quancong: ["male", "wu", 4, ["yaoming"]], + gongsunyuan: ["male", "qun", 4, ["huaiyi"]], + guotufengji: ["male", "qun", 3, ["jigong", "shifei"]], - xin_liru:['male','qun',3,['xinjuece','xinmieji','xinfencheng']], + xin_liru: ["male", "qun", 3, ["xinjuece", "xinmieji", "xinfencheng"]], - guohuanghou:['female','wei',3,['jiaozhao','danxin']], - liuyu:['male','qun',2,['xinzhige','xinzongzuo']], - liyan:['male','shu',3,['dcduliang','fulin']], - sundeng:['male','wu',4,['kuangbi']], + guohuanghou: ["female", "wei", 3, ["jiaozhao", "danxin"]], + liuyu: ["male", "qun", 2, ["xinzhige", "xinzongzuo"]], + liyan: ["male", "shu", 3, ["dcduliang", "fulin"]], + sundeng: ["male", "wu", 4, ["kuangbi"]], - cenhun:['male','wu',4,['jishe','lianhuo']], - huanghao:['male','shu',3,['qinqing','huisheng']], - zhangrang:['male','qun',3,['taoluan'],['sex:male_castrated']], - sunziliufang:['male','wei',3,['guizao','jiyu']], + cenhun: ["male", "wu", 4, ["jishe", "lianhuo"]], + huanghao: ["male", "shu", 3, ["qinqing", "huisheng"]], + zhangrang: ["male", "qun", 3, ["taoluan"], ["sex:male_castrated"]], + sunziliufang: ["male", "wei", 3, ["guizao", "jiyu"]], - xinxianying:['female','wei',3,['zhongjian','caishi']], - wuxian:['female','shu',3,['fumian','daiyan'],['clan:陈留吴氏']], - xushi:['female','wu',3,['wengua','fuzhu']], - caojie:['female','qun',3,['shouxi','huimin']], + xinxianying: ["female", "wei", 3, ["zhongjian", "caishi"]], + wuxian: ["female", "shu", 3, ["fumian", "daiyan"], ["clan:陈留吴氏"]], + xushi: ["female", "wu", 3, ["wengua", "fuzhu"]], + caojie: ["female", "qun", 3, ["shouxi", "huimin"]], - caiyong:['male','qun',3,['bizhuan','tongbo']], - jikang:['male','wei',3,['qingxian','juexiang']], - qinmi:['male','shu',3,['jianzheng','zhuandui','tianbian']], - xuezong:['male','wu',3,['funan','xinjiexun']], + caiyong: ["male", "qun", 3, ["bizhuan", "tongbo"]], + jikang: ["male", "wei", 3, ["qingxian", "juexiang"]], + qinmi: ["male", "shu", 3, ["jianzheng", "zhuandui", "tianbian"]], + xuezong: ["male", "wu", 3, ["funan", "xinjiexun"]], - old_huaxiong:['male','qun',6,['shiyong']], + old_huaxiong: ["male", "qun", 6, ["shiyong"]], - yujin:["male","wei",4,["rezhenjun"],[]], + yujin: ["male", "wei", 4, ["rezhenjun"], []], }, - characterIntro:{ - sunli:'孙礼(?—250年),字德达,涿郡容城县人。三国时期曹魏名将。曹操平定幽州后,孙礼被征召为司空军谋掾。后被任命为河间郡丞,升至荥阳都尉。后孙礼被调为鲁国相。历任山阳、平原、平昌、琅邪郡太守。从大司马曹休在夹石征吴,孙礼谏其不可深入作战,曹休不听遂战败。后孙礼调任阳平郡太守。明帝时入为尚书,受遗诏拜大将军长史,加散骑常侍。曹爽令孙礼出任扬州刺史,加管伏波将军,赐爵关内侯。孙礼率兵御东吴军队,奋不顾身,贼众乃退。朝廷赐绢七百匹,孙礼皆以绢付亡者家,无以入身。后征拜少府,出为荆州刺史,迁冀州牧。爽见礼奏,大怒,劾礼怨望,结刑五岁。在家期年,众人多以为言,除城门校尉。出为并州刺史,加振武将军,使持节,护匈奴中郎将。爽诛后,入为司隶校尉。迁司空,封大利亭侯,邑一百户。嘉平二年(250年),孙礼去世,谥号景侯。其孙孙元继承爵位。《全三国文》录有孙礼文一篇《清河平原争界案图宜属平原疏》。陈寿评曰“孙礼刚断伉厉”。', - xiahoumao:'夏侯楙,字子林,沛国谯县(今安徽省亳州市)人,曹魏名将夏侯惇之子,三国时期魏国官员、将领,其妻为曹操之女清河公主。在魏国历任侍中、尚书、安西将军、镇东将军,假节,封列侯。曾一度驻守曹魏都城长安,但蜀汉北伐后就被调离。', - chenshi:'陈式,生卒年不详,三国时期蜀汉将领。最初为刘备军中重要的基层指挥官,后成长为高级将领。在诸葛亮第三次北伐期间,在诸葛亮的军事指挥下攻克了魏国的武都、阴平二郡。', - feiyao:'费曜(生卒年不详),又作费瑶、费繇,三国时期曹魏将领。魏初,参与平河西之乱。明帝时官任后将军,跟随曹真、司马懿多次对抗蜀汉。《三国演义》中作“费耀”,随曹真和诸葛亮的第二次北伐军作战。怀疑姜维作内应是假,自告奋勇替曹真出征,结果被事先埋伏的姜维包围,自尽而死。', - wuanguo:'武安国,历史小说《三国演义》中人物,是北海太守孔融的部将,兵器为一把长柄铁锤,重五十余斤。诸侯伐董时,双方于虎牢关相峙,吕布撰战,一合而斩穆顺,关东军大惊。北海太守孔融部将武安国,使铁锤飞马而出,吕布挥戟拍马来迎,战到十余合,一戟砍断安国手腕,安国弃锤于地而走,八路军兵齐出,这才救了他性命。', - hanlong:'韩龙,汉末三国时期刺客。韩龙使得魏国北方边得到数十年的安宁,减少魏国的军政压力,得以休养生息。太和二年,豫遣译夏舍诣比能女婿郁筑鞬部,舍为鞬所杀。其秋,豫将西部鲜卑蒲头、泄归泥出塞讨郁筑鞬,大破之。还至马城,比能自将三万骑围豫七日。上谷太守阎志,阎柔之弟也,素为鲜卑所信。志往解喻,即解围去。后幽州刺史王雄并领校尉,抚以恩信。比能数款塞,诣州奉贡献。至青龙元年,比能诱纳步度根,使叛并州,与结和亲,自勒万骑迎其累重於陉北。并州刺史毕轨遣将军苏尚、董弼等击之,比能遣子将骑与尚等会战於楼烦,临陈害尚、弼。至三年中,雄遣勇士韩龙刺杀比能,更立其弟。', - liwan:'李婉(生卒年不详),字淑文,里居不详,贾充之妻,魏晋时期才女,约景元年间(260年前后)在世。著有《典戒》。《隋书·经籍志》载李婉有文集一卷,今失传。', - zhugeshang:'诸葛尚(244年2月-263年11月),琅琊阳都(今山东沂南)人,诸葛瞻长子,诸葛亮之孙。诸葛尚博览兵书且精通武艺。炎兴元年(公元263年),出任先锋,抗拒魏国大将邓艾,与其父诸葛瞻同战死于绵竹,时年十九岁。', - kebineng:'轲比能(?~235年),为中国三国时期的鲜卑首领之一。轲比能出身鲜卑支部,因他作战勇敢,执法公平,不贪财物,所以被鲜卑民众推举为大人。轲比能因其部落近塞,所以他抓住有利条件积极学习汉族先进技术和文化,促进了鲜卑族的进步和北方的民族融合。轲比能统率下的部众,战守有法,战斗力相当强大。自曹操北征后向曹氏进贡表示效忠。魏文帝时,轲比能受封附义王。轲比能在进行部落统一战争时,受魏国干涉,受沉重打击,于是对魏怀贰,献书魏帝表忠,以麻痹魏庭,使之放松警惕。此后,轲比能的部众变得强盛,控弦十余万骑,为害魏国边境。每次钞略得财物,轲比能都公开透明地均平分配,所以得部众死力,各部大人都敬畏之。实力强大后,他继续部落统一战争,于是威行诸部落,建立起强大的鲜卑族政权。深感威胁的魏国幽州刺史王雄派刺客韩龙将其刺杀,其政权立刻崩溃,鲜卑民族再次陷入混战。', - lukai:'陆凯(198-269年),字敬风,吴郡吴县(今江苏省苏州市)人。三国时期吴国重臣,丞相陆逊的族侄,大司马陆抗的族兄。黄武年间,举孝廉出身,曾任永兴县长、诸暨县长,颇有治绩。拜建武都尉、儋耳太守,与聂友率军讨伐朱崖和儋耳,迁建武校尉。五凤二年(255年),讨斩零陵山贼陈毖,拜偏将军、巴丘督,册封都乡侯。迁武昌右部督,随军进入寿春。后拜荡魏将军,加号绥远将军。吴景帝孙休继位,拜征北将军、假节、领豫州牧。孙皓即位,迁任镇西大将军,都督巴丘,又领荆州牧,进封嘉兴侯。宝鼎元年(266年),迁左丞相。以正直及屡次劝谏孙皓而闻名。建衡元年(269年),去世,时年七十二。', - caozhi:'字子建,沛国谯人,三国曹魏著名文学家,建安文学代表人物。魏武帝曹操之子,魏文帝曹丕之弟,生前曾为陈王,去世后谥号“思”,因此又称陈思王。南朝宋文学家谢灵运更有“天下才有一石,曹子建独占八斗”的评价。王士祯尝论汉魏以来二千年间诗家堪称“仙才”者,曹植、李白、苏轼三人耳。', - gaoshun:'中国东汉末年将领,吕布帐下中郎将。史载高顺为人清白有威严,不好饮酒,所统率的部队精锐非常,号称“陷阵营”。屡进忠言于吕布,吕布虽知其忠而不能用。曹操击破吕布后,高顺被曹操所杀。', - chengong:'字公台,东汉末年吕布帐下谋士,东郡东武阳人。性情刚直,足智多谋,年少时与海内知名之士相互结交。192年,陈宫等人主张曹操接任兖州牧。但此后陈宫因曹操杀害边让而与曹操反目,并游说张邈等人背叛曹操迎吕布入兖州,辅助吕布攻打曹操。吕布战败后,随吕布等一同被曹操所擒,决意赴死。', - lingtong:'字公绩,吴郡馀杭人,三国时期吴国名将。凌操之子,官至偏将军。', - masu:'字幼常,襄阳宜城人,三国时期蜀汉大臣,侍中马良之弟。初以荆州从事跟随刘备取蜀入川,曾任绵竹、成都令、越嶲太守。诸葛亮北伐时因作战失误而失守街亭,因而被诸葛亮所斩。', - wuguotai:'吴国太,小说《三国演义》中的人物,不见于正史记载。在小说中,吴国太被描述为孙坚的次妻,孙坚正妻武烈皇后(小说中写作吴太夫人)的妹妹,孙朗、孙仁(孙尚香)的母亲。', - xusheng:'字文向,琅邪莒县人。三国时期吴将。徐盛最初因讨伐山贼有功而被加为中郎将,后于濡须口之战中表现出色,得到孙权的赞赏。魏文帝曹丕伐吴时,徐盛以疑城之计退去魏军。', - yujin:'字文则,泰山钜平人。三国时期曹魏武将。本为鲍信部将,后属曹操,曹操称赞他可与古代名将相比。然而在建安二十四年的襄樊之战中,于禁在败给关羽后投降,致使一代名将晚节不保。', - zhangchunhua:'西晋宣穆皇后张春华(189-247),河内平皋(今河南温县)人。她是晋宣帝司马懿之妻,晋景帝司马师、晋文帝司马昭的母亲。后被追尊为皇后。', - fazheng:'字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。', - xushu:'字元直,与司马徽、诸葛亮等人为友。先化名单福仕官于新野的刘备,后因曹操囚禁其母而不得不弃备投操,临行前向刘备推荐诸葛亮之才。入曹营后,一言不发,不曾为曹操进献过一计半策。后人形容徐庶“身在曹营心在汉”。', - caozhang:'字子文,是曹操与武宣卞皇后所生第二子,曹丕之弟,曹植之兄,曹魏任城王。曹彰武艺过人,曹操问诸子志向时自言“好为将”,因此得到曹操的赞赏。其胡须黄色,被曹操称为“黄须儿”。', - xunyou:'字公达,颍川颍阴人。东汉末年曹操的五谋臣之一,荀彧从子,被曹操称为“谋主”。官至尚书令。正始五年被追谥为敬侯。', - liaohua:'本名淳,字元俭,襄阳中卢(今湖北襄樊)人。三国时期蜀国后期将领,以勇敢果断著称。廖化是三国时代中经历了魏、蜀、吴整个兴衰过程极少数人中的一个,与严颜、黄忠共称为蜀汉三老将。', - bulianshi:'步夫人(?-238),讳练师,临淮淮阴人。东吴丞相步骘同族,吴大帝孙权之妃,在孙权众夫人中最受孙权的宠爱(宠冠后庭),生有二女:孙鲁班、孙鲁育。赤乌元年卒,追封为皇后,葬于蒋陵。', - chengpu:'字德谋,右北平土垠人。历仕孙坚、孙策、孙权三任君主。孙策死后,他与张昭等人共同辅佐孙权,并讨伐江东境内的山贼,功勋卓著。被人们尊称为“程公”。', - handang:'字义公,辽西令支(今河北迁安)人,吴国将领。韩当因为长于弓箭、骑术并且膂力过人而被孙坚赏识,追随他四处征伐周旋,数次冒险犯难,攻陷敌人、擒拿俘虏。对江东基业的逐渐稳固和吴国的建立有着重要影响。', - liubiao:'刘表,字景升,山阳郡高平(今山东微山)人。东汉末年名士,汉室宗亲,荆州牧,汉末群雄之一。', - zhonghui:'字士季。魏名将,太傅钟繇之子。公元263年,他与邓艾带兵攻打蜀国,最终导致蜀国灭亡。之后钟会设计害死邓艾,联合姜维准备自立,最终因部下反叛失败,与姜维一同死于兵变。', - wangyi:'益州刺史赵昂之妻,赵英、赵月之母。马超作乱凉州时,王异协助丈夫守城,多有功勋,自马超攻冀城至祁山坚守,赵昂曾出奇计九条,王异皆有参与。', - guanzhang:'关兴,名将关羽之子,继承了父亲汉寿亭侯的爵位。年少时即受诸葛亮器重,在蜀汉担任侍中、中监军之职,后在夷陵之战中报了杀父之仇。张苞,张飞的长子,使用父亲的家传蛇矛为兵器,勇猛剽悍不弱其父。', - madai:'名将马超的从弟。早年他曾经从曹操手中死里逃生,后跟随马超大战曹操。后在诸葛亮病逝后受杨仪派遣斩杀了蜀将魏延。曾率领军队出师北伐,被魏将牛金击败而退还。', - caochong:'字仓舒,曹操之子。从小聪明仁爱,与众不同,深受曹操喜爱。留有“曹冲称象”的典故。曹操几次对群臣夸耀他,有让他继嗣之意。可惜曹冲在建安十三病逝,年仅13岁。', - guohuai:'魏国名将,夏侯渊战死时郭淮收集残兵,与杜袭共推张郃为主将而得以稳定局势。曹丕称帝后,赐郭淮爵关内侯,又任镇西长史。诸葛亮伐魏时,郭淮料敌准确,多立战功,而后亦曾击退姜维。', - manchong:'初在曹操手下任许县县令,掌管司法,以执法严格著称;转任汝南太守,开始参与军事,曾参与赤壁之战。后关羽围攻樊城,满宠协助曹仁守城,劝阻了弃城而逃的计划,成功坚持到援军到来。曹丕在位期间,满宠驻扎在新野,负责荆州侧的对吴作战。曹叡在位期间,满宠转任到扬州,接替曹休负责东侧对吴作战,屡有功劳。', - guanping:'关平是关羽在战乱中所收之义子。关羽脱离曹军后,与刘备于关定家中重逢,关定欲使年仅十八岁的关平随关羽同行,刘备便主张让关羽与关平结为义父子。自此后关平随侍在关羽身边,一生东征西讨。他武勇过人,不逊乃父,曾跟随刘备出征西川,立下战功,后来又与曹魏猛将庞德大战三十回合,不分胜负。', - jianyong:'简雍为刘备同乡,年少时与刘备相识。黄巾之乱时,刘备加入对抗黄巾军的战争,简雍便跟随他奔走。常作为谈客,往来使命,刘备围成都时简雍作为刘备使臣成功劝说刘璋投降。简雍擅于辩论、议事。性情简单直接、不拘小节。', - liufeng:'刘备义子。性格刚猛,气力过人。随赵云、张飞等扫荡西川,颇有战功,而后又统领孟达攻取上庸,深为刘备信任。但是后来关羽北伐曹魏,多次要求刘封起兵相助,刘封不从。而后又侵凌孟达,迫其降魏。孟达与魏徐晃共袭刘封,并劝刘封投降,刘封不降,又遭部下叛变,败归成都。刘备在诸葛亮的建议下赐死刘封,刘封自裁,刘备深表痛惜。', - panzhangmazhong:'马忠为潘璋部将。于麦城之战中设伏擒获关羽及关平。刘备伐吴时,马忠随潘璋等往拒,突袭射伤蜀将黄忠,导致黄忠阵亡。不久,潘璋为关兴所杀,马忠领兵围击,击退张苞援军。后降将糜、傅发动兵变,刺杀了马忠,将首级献于刘备。', - yufan:'虞翻初在会稽被太守王朗任命为功曹,曾劝谏王朗躲开孙策未果。后孙策占江东仍任命他为功曹。吕蒙袭取荆州时,虞翻提醒其躲过了埋伏,成功占领城池。后因为直言进谏被孙权发配到交州。', - zhuran:'吴国著名将领,吕蒙白衣渡江取荆州,朱然协助潘璋捉住了关羽。黄武元年,刘备兵伐东吴,朱然与孙桓抵抗刘备大军。后又参加夷陵之战,追击刘备,被前来接应的赵云一枪刺死。', - fuhuanghou:'执金吾伏完之女,汉献帝的皇后,后因怨恨曹操诛董承,与父伏完密谋曹操,事情泄漏,曹将伏皇后禁闭冷宫逼其自缢,所生二位皇子亦被鸩杀。', - liru:'董卓的首席谋士,为董卓所亲信,大小事宜皆与其商议。董卓趁乱进京、说降吕布、废立皇帝、迁都长安等举动,均离不开李儒的参谋之功,并奉命毒杀皇帝刘辩。李傕被曹操击败后,李儒从此不知所踪,消失在历史长河中。', - caozhen:'曹操族子,官至大将军、大司马。其父为曹操招募人马时被州郡所杀,曹操因怜悯曹真少年丧父而待其如亲子一般,因赞赏曹真的勇猛而让他率领虎豹骑。曹真在镇守曹魏西北边境时表现突出,魏文帝时期督众将大破羌胡联军,平定河西;魏明帝时期屡次对抗诸葛亮的北伐。', - hanhaoshihuan:'韩浩和史涣都以忠勇著称,两人皆是曹操心腹将领,共同掌管禁兵。', - chenqun:'陈群一直位居要职,先后受曹操、曹丕托孤,成为魏国重臣,官至司空。其子陈泰,亦是魏国后期名将。最大的贡献为创立了九品中正制,为后期的人才选拔和管理打好了基础。', - wuyi:'初为益州牧刘璋的部将,刘备进攻益州时,泠苞在雒城大败,吴懿自告奋勇,领兵前往救援。不料被赵云和张飞生擒,吴懿于是归降。刘备自称汉中王,迎娶吴懿之妹。诸葛亮出师北伐,吴懿以左将军、高阳侯的身份跟随出征,屡立战功。诸葛亮逝世后,吴懿随姜维一并镇守汉中。', - zhoucang:'原为张宝部将。关羽千里走单骑时,周仓投降关羽,成为了关羽的贴身护卫。建安十六年(公元211年),刘备攻打成都时,周仓跟随关羽镇守荆州。关羽水淹七军时,周仓曾生擒魏军的立义将军庞德,关羽被孙权斩首之后,周仓在麦城大哭失声,拔剑自刎而死。', - zhangsong:'刘璋的部下,长相丑陋但有过目不忘的本领。张松奉命出使许都被曹操赶出,归蜀时为刘备所厚待,于是将西川地理图献予刘备,劝刘备取益州,愿为内应,并派好友孟达、法正帮助刘备。', - sunluban:'孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。', - zhuhuan:'字休穆,吴郡吴县(今江苏苏州)人,吴国名将,官至前将军、青州牧,假节,封为嘉兴侯。有一子朱异。', - guyong:'为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。', - jushou:'袁绍帐下谋士。史载他“少有大志,擅于谋略”。曾为冀州别驾,举茂才,并当过两次县令。后来又当韩馥别驾,被韩馥表为骑都尉。袁绍占据冀州后任用沮授为从事。经常对袁绍提出良策,但很多时候袁绍并不听从。官渡之战时袁绍大败,沮授未及逃走,被曹操所获,因拒降被曹操处死。', - caifuren:'原是刘表的小妾,正室死后,成为了刘表的后妻。因刘琮娶了自己的侄女所以对其偏爱有加。刘备客居荆州时险些受其所害。刘表死后为了让刘琮即位不惜献州于曹操。', - caorui:'魏文帝曹丕长子,曹魏第二位皇帝。在位期间指挥曹真、司马懿等人成功防御了吴、蜀的多次攻伐,并且平定鲜卑,攻灭公孙渊,颇有建树。', - caoxiu:'曹操族子,曹操大宴铜雀台之时,射箭夺袍。曹休随曹操四处征伐,在攻蜀汉中之战,伐吴濡须口之战均有登场,曾放冷箭射倒凌统的马匹,后又协助夏侯惇平息洛阳纵火叛乱,总管御林兵马,协助曹丕代汉。', - zhongyao:'初为长安郡守,马超反叛时,引军攻打长安,钟繇率军防卫。后城破,钟繇从东门弃城而走,退守潼关。后奉献帝令繇草拟诏令,册立曹操为魏王,曹操以钟繇为相国。明帝即位时,钟繇为太傅。诸葛亮北伐,钟繇举荐司马懿前往抵御。', - liuchen:'刘禅第五子,自幼聪明,英敏过人。魏军兵临城下时,刘禅准备投降,刘谌劝阻刘禅投降不成后悲愤不已,遂自杀于昭烈庙。', - xiahoushi:'夏侯渊从女,夏侯霸从妹,出城拾柴时被张飞所得,取其为妻。后生有二女,其中一人为星彩。', - zhangyi:'曾随诸葛亮南征孟获,七擒孟获的战斗中立下赫赫战功,与祝融夫人单挑。诸葛亮病死五丈原,告诉姜维张嶷忠贞勇猛,经验丰富,是可以依靠的武将,后于征伐魏国时为掩护姜维撤退阵亡。', - sunxiu:'孙权第六子,孙綝发动政变罢黜孙亮后,迎立孙休为帝。后孙綝专权,孙休遣使丁奉等人将其诛杀。孙休在位期间,颁布良制,嘉惠百姓,促进了东吴的繁荣。', - zhuzhi:'孙坚旧将,朱然嗣父,孙坚阵亡后,孙策附袁术,朱治、吕范为之定计,用玉玺向袁术借兵夺取江东。孙策平定东路后,任命朱治为吴郡太守,收军返回江东。后来赤壁之战,大都督周瑜令朱治、吕范为四方巡警使,催督六郡官军。', - quancong:'吴国名将,孙策进兵江东时归顺之,深得孙权赏识,孙权甚至将孙鲁班许配之。', - gongsunyuan:'辽东太守公孙度之孙,辽东割据首领。趁魏、吴骚乱之际自称燕王,发动叛乱,与魏对抗。败给司马懿率领的讨伐大军,被围困后乞降不被接受,与子修在欲出城逃跑时被斩杀。', - guotufengji:'两人均是袁绍帐下谋士。曾联手献计,利用公孙瓒攻击韩馥,又劝说韩馥请袁绍抵挡公孙瓒,终替袁绍拿下冀州。官渡之战期间,两人进谗逼反张郃高览,逼死田丰。使得袁绍的实力大损。', - guohuanghou:'明元郭皇后(并非郭女王),在三国志有正传。曹叡夫人,曹丕的儿媳妇,曹芳,曹髦,曹奂三朝太后,是唯一经历了曹魏全部皇帝时代的贵族女性。曹魏后三帝时期,由于皇帝年少,太后与重臣一同处理政务。史书上对郭皇后有两种截然不同的记载,一种是曹芳被废和曹髦死后郭太后发诏书斥责他们不配人君,另一种却提及曹芳被夺权期间,太后与曹芳相拥而泣,曹髦讨伐司马昭前,曾向太后禀报。', - liyan:'字正方,蜀汉重臣。初为刘表部下,曹操入主荆州时,李严西奔入蜀。刘备入川,李严率众投降,深得刘备器重,受命与诸葛亮、法正等人一同编制《蜀科》,又率军平定了蜀中盗贼。白帝城托孤,与诸葛亮共受遗诏同扶幼主。其人性格矜高难近,终因督粮不利且谎报实情而被流放,后在当地去世。', - sundeng:'字子高,孙权长子。孙权称帝后其被立为太子,受诸葛恪等人辅佐。其人性情温和而能礼贤下士,加之爱民如子,因此深受爱戴。曾劝服孙权在孙虑之死时节哀,并劝谏孙权勿用吕壹苛政。后不幸早逝,临终前上书建言,推荐了多位良臣。其亡故令孙权极为悲伤,也为南鲁党争的祸乱埋下了伏笔。', - liuyu:'伯安,幽州牧,汉室宗亲。在幽州两度任职,颇有威望。张纯、张举叛乱,刘虞恩威并施将其平定,又鼓励农商,大大改善了当地经济民生,青徐二州流民纷纷前来避难。后坚拒袁绍等人立其为帝的请求,派兵迎接献帝,却为袁术所扣,并因此事激化了与公孙瓒的矛盾,最终被击败,为其所害。', - cenhun:'岑昏为宦官,官列中常侍,孙皓即位后得到宠幸。280年,晋龙骧将军王濬率军伐吴,岑昏建议以铁锁链封锁长江,阻挡晋军进攻。王濬以火船烧锁链破其计,沿途东吴将士或死或降。群臣上奏东吴衰败之因在于岑昏,将他与蜀汉的黄皓并列为误国之奸臣。', - sunziliufang:'孙资在曹操手下历任县令,参丞相军事;刘放曾有劝王松归顺曹操之举,为曹操所欣赏,遂招为司空府官,又外放历任几处县令。魏国初建之际,孙资与刘放俱任秘书郎。曹丕继位后,二人一同掌握机密。曹睿病危时,二人力荐曹爽,又推荐招回司马懿辅政。最后,曹睿独召曹爽、司马懿、刘放、孙资同受诏命,而免去曹宇、夏侯献、曹肇、秦朗的官职。', - huanghao:'宦官。为后主刘禅所宠,专秉朝政。黄皓与大将军姜维不睦,维启后主杀之,后主不从。皓阴以心腹阎宇替维。景耀六年,蜀亡,邓艾预欲杀之,皓贿赂左右得免。及后主迁洛阳,皓为司马昭凌迟处死。', - zhangrang:'汉中常侍。同赵忠、曹节、段珪等为“十常侍”,为灵帝所宠。让等专权乱政、卖官索财,朝野皆痛恨之。郎中张钧上书奏请诛杀十常侍,帝不允,让等阴杀钧。及灵帝崩,大将军何进欲杀让等,让阴结何太后,招进入宫,斩杀之。部将袁绍引兵攻让,让等劫帝走河上。追急,让投水自尽。', - jikang:'嵇康(224年-263年,一作223年-262年),字叔夜。谯国铚县(今安徽省濉溪县)人。三国时期曹魏思想家、音乐家、文学家。
    嵇康幼年聪颖,博览群书,广习诸艺,又喜爱老庄学说。身长七尺八寸,容止出众。后娶魏武帝曹操曾孙女长乐亭主为妻,拜郎中,调中散大夫,世称“嵇中散”。后隐居不仕,屡拒为官。因得罪司隶校尉钟会,遭其构陷,而被掌权的大将军司马昭处死,时年四十岁。', - xinxianying:'辛氏(191年—269年),字宪英,祖籍陇西,颍川阳翟(今河南禹州)人。魏晋时期著名才女,曹魏侍中辛毗之女,卫尉羊耽之妻。辛宪英聪朗有才鉴,曾劝弟辛敞尽忠职守,预言钟会将会叛乱。泰始五年(公元269年),辛宪英逝世,享年七十九岁。', - wuxian:'穆皇后吴氏(?—245年),陈留(今河南开封)人,车骑将军吴懿之妹,三国时期蜀汉昭烈帝刘备的皇后。
    吴氏早年丧父,其父生前与刘焉交情深厚,所以全家跟随刘焉来到蜀地。后刘焉听相面者说吴氏有大贵之相,于是为儿子刘瑁迎娶吴氏。刘瑁死后,吴氏成为寡妇。
    建安十九年(214年),刘备平定益州,纳吴氏为夫人。建安二十四年(219年),刘备自称汉中王,立吴氏为汉中王后。章武元年(221年),刘备称帝,建立蜀汉,立吴氏为皇后。章武三年(223年),刘备去世,太子刘禅即位,尊嫡母吴氏为皇太后。延熙八年(245年),吴氏去世,谥号穆皇后,葬入刘备的惠陵。', - qinmi:'秦宓(?-226年),字子敕。广汉郡绵竹县(今四川德阳北)人。三国蜀汉时大臣、学者。秦宓善舌辩。早年仕于益州牧刘璋麾下,后降刘备。刘备伐吴时,秦宓劝阻,刘备大怒,欲杀秦宓。因诸葛亮及时求情,才保住性命,仅被下狱,后被释放,拜左中郎将、长水校尉。吴蜀同盟后,孙权派张温至成都回访。酒宴之上,秦宓与张温舌战,说得张温无言以对。后官至大司农。建兴四年(226年),秦宓病逝。', - xushi:'徐氏,孙权之弟孙翊的妻子,著名烈女。孙翊的部下妫览、戴员买通家将边鸿将孙翊杀死,并将全部罪责推给边鸿,又谋杀了前来查问的太守孙河。徐夫人一面用美人计色诱妫览、戴员,令其放松警惕;一面对孙翊生前亲信孙高、傅婴说明真相并晓以大义,最终成功地在内室中将杀夫凶手妫览、戴员诛杀。', - xuezong:'薛综(?―243年),字敬文,沛郡竹邑(今安徽濉溪)人,三国时期吴国名臣。少时避乱至交州,师从刘熙。士燮归附孙权,召其为五官中郎将,出任合浦、交阯太守。后从征至九真,回朝任谒者仆射。232年,升任尚书仆射。240年,改任选曹尚书。242年,担任太子少傅,兼任选部职任。243年,薛综去世。薛综是当时名儒,著有诗赋难论数万言,集为《私载》,并著有《五宗图述》、《二京解》。', - caiyong:'蔡邕(133年-192年),字伯喈。陈留郡圉县(今河南杞县南)人。东汉时期名臣,文学家、书法家,才女蔡文姬之父。蔡邕早年拒朝廷征召之命,后被征辟为司徒掾属,任河平长、郎中、议郎等职,曾参与续写《东观汉记》及刻印熹平石经。后因罪被流放朔方,几经周折,避难江南十二年。董卓掌权时,强召蔡邕为祭酒。三日之内,历任侍御史、治书侍御史、尚书、侍中、左中郎将等职,封高阳乡侯,世称“蔡中郎”。董卓被诛杀后,蔡邕因在王允座上感叹而被下狱,不久便死于狱中,年六十。', - caojie:'曹节(196年―260年),沛国谯县(今安徽亳州)人,汉献帝刘协第二任皇后,魏武帝曹操的女儿。建安十八年(213年),曹操将女儿曹宪、曹节、曹华三姐妹同时入宫中,封为夫人。建安十九年(214年),并封为贵人。曹操废掉汉献帝第一位皇后伏寿,将她囚禁而死。曹操要汉献帝立曹节为皇后,汉献帝只得依从。建安二十五年(220年),曹操去世,曹丕袭封魏王位。曹丕授意华歆去逼汉献帝让位。曹节怒斥华歆,华歆只好退出宫去。第二天又逼汉献帝将帝位禅让给曹丕。并以武力威胁,向曹节索要玺印,曹节无奈,将玺印掷于栏板之下。面对曹丕篡位,她极为愤怒,高喊:“老天有眼,决不让你长久!”汉献帝被废为山阳公,曹节为山阳公夫人。景元元年(260年),曹节病逝,仍以汉朝礼仪合葬于献帝的禅陵,谥号献穆皇后。', + characterIntro: { + sunli: "孙礼(?—250年),字德达,涿郡容城县人。三国时期曹魏名将。曹操平定幽州后,孙礼被征召为司空军谋掾。后被任命为河间郡丞,升至荥阳都尉。后孙礼被调为鲁国相。历任山阳、平原、平昌、琅邪郡太守。从大司马曹休在夹石征吴,孙礼谏其不可深入作战,曹休不听遂战败。后孙礼调任阳平郡太守。明帝时入为尚书,受遗诏拜大将军长史,加散骑常侍。曹爽令孙礼出任扬州刺史,加管伏波将军,赐爵关内侯。孙礼率兵御东吴军队,奋不顾身,贼众乃退。朝廷赐绢七百匹,孙礼皆以绢付亡者家,无以入身。后征拜少府,出为荆州刺史,迁冀州牧。爽见礼奏,大怒,劾礼怨望,结刑五岁。在家期年,众人多以为言,除城门校尉。出为并州刺史,加振武将军,使持节,护匈奴中郎将。爽诛后,入为司隶校尉。迁司空,封大利亭侯,邑一百户。嘉平二年(250年),孙礼去世,谥号景侯。其孙孙元继承爵位。《全三国文》录有孙礼文一篇《清河平原争界案图宜属平原疏》。陈寿评曰“孙礼刚断伉厉”。", + xiahoumao: + "夏侯楙,字子林,沛国谯县(今安徽省亳州市)人,曹魏名将夏侯惇之子,三国时期魏国官员、将领,其妻为曹操之女清河公主。在魏国历任侍中、尚书、安西将军、镇东将军,假节,封列侯。曾一度驻守曹魏都城长安,但蜀汉北伐后就被调离。", + chenshi: + "陈式,生卒年不详,三国时期蜀汉将领。最初为刘备军中重要的基层指挥官,后成长为高级将领。在诸葛亮第三次北伐期间,在诸葛亮的军事指挥下攻克了魏国的武都、阴平二郡。", + feiyao: "费曜(生卒年不详),又作费瑶、费繇,三国时期曹魏将领。魏初,参与平河西之乱。明帝时官任后将军,跟随曹真、司马懿多次对抗蜀汉。《三国演义》中作“费耀”,随曹真和诸葛亮的第二次北伐军作战。怀疑姜维作内应是假,自告奋勇替曹真出征,结果被事先埋伏的姜维包围,自尽而死。", + wuanguo: + "武安国,历史小说《三国演义》中人物,是北海太守孔融的部将,兵器为一把长柄铁锤,重五十余斤。诸侯伐董时,双方于虎牢关相峙,吕布撰战,一合而斩穆顺,关东军大惊。北海太守孔融部将武安国,使铁锤飞马而出,吕布挥戟拍马来迎,战到十余合,一戟砍断安国手腕,安国弃锤于地而走,八路军兵齐出,这才救了他性命。", + hanlong: + "韩龙,汉末三国时期刺客。韩龙使得魏国北方边得到数十年的安宁,减少魏国的军政压力,得以休养生息。太和二年,豫遣译夏舍诣比能女婿郁筑鞬部,舍为鞬所杀。其秋,豫将西部鲜卑蒲头、泄归泥出塞讨郁筑鞬,大破之。还至马城,比能自将三万骑围豫七日。上谷太守阎志,阎柔之弟也,素为鲜卑所信。志往解喻,即解围去。后幽州刺史王雄并领校尉,抚以恩信。比能数款塞,诣州奉贡献。至青龙元年,比能诱纳步度根,使叛并州,与结和亲,自勒万骑迎其累重於陉北。并州刺史毕轨遣将军苏尚、董弼等击之,比能遣子将骑与尚等会战於楼烦,临陈害尚、弼。至三年中,雄遣勇士韩龙刺杀比能,更立其弟。", + liwan: "李婉(生卒年不详),字淑文,里居不详,贾充之妻,魏晋时期才女,约景元年间(260年前后)在世。著有《典戒》。《隋书·经籍志》载李婉有文集一卷,今失传。", + zhugeshang: + "诸葛尚(244年2月-263年11月),琅琊阳都(今山东沂南)人,诸葛瞻长子,诸葛亮之孙。诸葛尚博览兵书且精通武艺。炎兴元年(公元263年),出任先锋,抗拒魏国大将邓艾,与其父诸葛瞻同战死于绵竹,时年十九岁。", + kebineng: + "轲比能(?~235年),为中国三国时期的鲜卑首领之一。轲比能出身鲜卑支部,因他作战勇敢,执法公平,不贪财物,所以被鲜卑民众推举为大人。轲比能因其部落近塞,所以他抓住有利条件积极学习汉族先进技术和文化,促进了鲜卑族的进步和北方的民族融合。轲比能统率下的部众,战守有法,战斗力相当强大。自曹操北征后向曹氏进贡表示效忠。魏文帝时,轲比能受封附义王。轲比能在进行部落统一战争时,受魏国干涉,受沉重打击,于是对魏怀贰,献书魏帝表忠,以麻痹魏庭,使之放松警惕。此后,轲比能的部众变得强盛,控弦十余万骑,为害魏国边境。每次钞略得财物,轲比能都公开透明地均平分配,所以得部众死力,各部大人都敬畏之。实力强大后,他继续部落统一战争,于是威行诸部落,建立起强大的鲜卑族政权。深感威胁的魏国幽州刺史王雄派刺客韩龙将其刺杀,其政权立刻崩溃,鲜卑民族再次陷入混战。", + lukai: "陆凯(198-269年),字敬风,吴郡吴县(今江苏省苏州市)人。三国时期吴国重臣,丞相陆逊的族侄,大司马陆抗的族兄。黄武年间,举孝廉出身,曾任永兴县长、诸暨县长,颇有治绩。拜建武都尉、儋耳太守,与聂友率军讨伐朱崖和儋耳,迁建武校尉。五凤二年(255年),讨斩零陵山贼陈毖,拜偏将军、巴丘督,册封都乡侯。迁武昌右部督,随军进入寿春。后拜荡魏将军,加号绥远将军。吴景帝孙休继位,拜征北将军、假节、领豫州牧。孙皓即位,迁任镇西大将军,都督巴丘,又领荆州牧,进封嘉兴侯。宝鼎元年(266年),迁左丞相。以正直及屡次劝谏孙皓而闻名。建衡元年(269年),去世,时年七十二。", + caozhi: "字子建,沛国谯人,三国曹魏著名文学家,建安文学代表人物。魏武帝曹操之子,魏文帝曹丕之弟,生前曾为陈王,去世后谥号“思”,因此又称陈思王。南朝宋文学家谢灵运更有“天下才有一石,曹子建独占八斗”的评价。王士祯尝论汉魏以来二千年间诗家堪称“仙才”者,曹植、李白、苏轼三人耳。", + gaoshun: + "中国东汉末年将领,吕布帐下中郎将。史载高顺为人清白有威严,不好饮酒,所统率的部队精锐非常,号称“陷阵营”。屡进忠言于吕布,吕布虽知其忠而不能用。曹操击破吕布后,高顺被曹操所杀。", + chengong: + "字公台,东汉末年吕布帐下谋士,东郡东武阳人。性情刚直,足智多谋,年少时与海内知名之士相互结交。192年,陈宫等人主张曹操接任兖州牧。但此后陈宫因曹操杀害边让而与曹操反目,并游说张邈等人背叛曹操迎吕布入兖州,辅助吕布攻打曹操。吕布战败后,随吕布等一同被曹操所擒,决意赴死。", + lingtong: "字公绩,吴郡馀杭人,三国时期吴国名将。凌操之子,官至偏将军。", + masu: "字幼常,襄阳宜城人,三国时期蜀汉大臣,侍中马良之弟。初以荆州从事跟随刘备取蜀入川,曾任绵竹、成都令、越嶲太守。诸葛亮北伐时因作战失误而失守街亭,因而被诸葛亮所斩。", + wuguotai: + "吴国太,小说《三国演义》中的人物,不见于正史记载。在小说中,吴国太被描述为孙坚的次妻,孙坚正妻武烈皇后(小说中写作吴太夫人)的妹妹,孙朗、孙仁(孙尚香)的母亲。", + xusheng: + "字文向,琅邪莒县人。三国时期吴将。徐盛最初因讨伐山贼有功而被加为中郎将,后于濡须口之战中表现出色,得到孙权的赞赏。魏文帝曹丕伐吴时,徐盛以疑城之计退去魏军。", + yujin: "字文则,泰山钜平人。三国时期曹魏武将。本为鲍信部将,后属曹操,曹操称赞他可与古代名将相比。然而在建安二十四年的襄樊之战中,于禁在败给关羽后投降,致使一代名将晚节不保。", + zhangchunhua: + "西晋宣穆皇后张春华(189-247),河内平皋(今河南温县)人。她是晋宣帝司马懿之妻,晋景帝司马师、晋文帝司马昭的母亲。后被追尊为皇后。", + fazheng: + "字孝直,本为刘璋部下,刘备围成都时劝说刘璋投降,而后又与刘备进取汉中,献计将曹操大将夏侯渊斩首。法正善奇谋,深受刘备信任和敬重。", + xushu: "字元直,与司马徽、诸葛亮等人为友。先化名单福仕官于新野的刘备,后因曹操囚禁其母而不得不弃备投操,临行前向刘备推荐诸葛亮之才。入曹营后,一言不发,不曾为曹操进献过一计半策。后人形容徐庶“身在曹营心在汉”。", + caozhang: + "字子文,是曹操与武宣卞皇后所生第二子,曹丕之弟,曹植之兄,曹魏任城王。曹彰武艺过人,曹操问诸子志向时自言“好为将”,因此得到曹操的赞赏。其胡须黄色,被曹操称为“黄须儿”。", + xunyou: "字公达,颍川颍阴人。东汉末年曹操的五谋臣之一,荀彧从子,被曹操称为“谋主”。官至尚书令。正始五年被追谥为敬侯。", + liaohua: + "本名淳,字元俭,襄阳中卢(今湖北襄樊)人。三国时期蜀国后期将领,以勇敢果断著称。廖化是三国时代中经历了魏、蜀、吴整个兴衰过程极少数人中的一个,与严颜、黄忠共称为蜀汉三老将。", + bulianshi: + "步夫人(?-238),讳练师,临淮淮阴人。东吴丞相步骘同族,吴大帝孙权之妃,在孙权众夫人中最受孙权的宠爱(宠冠后庭),生有二女:孙鲁班、孙鲁育。赤乌元年卒,追封为皇后,葬于蒋陵。", + chengpu: + "字德谋,右北平土垠人。历仕孙坚、孙策、孙权三任君主。孙策死后,他与张昭等人共同辅佐孙权,并讨伐江东境内的山贼,功勋卓著。被人们尊称为“程公”。", + handang: + "字义公,辽西令支(今河北迁安)人,吴国将领。韩当因为长于弓箭、骑术并且膂力过人而被孙坚赏识,追随他四处征伐周旋,数次冒险犯难,攻陷敌人、擒拿俘虏。对江东基业的逐渐稳固和吴国的建立有着重要影响。", + liubiao: + "刘表,字景升,山阳郡高平(今山东微山)人。东汉末年名士,汉室宗亲,荆州牧,汉末群雄之一。", + zhonghui: + "字士季。魏名将,太傅钟繇之子。公元263年,他与邓艾带兵攻打蜀国,最终导致蜀国灭亡。之后钟会设计害死邓艾,联合姜维准备自立,最终因部下反叛失败,与姜维一同死于兵变。", + wangyi: "益州刺史赵昂之妻,赵英、赵月之母。马超作乱凉州时,王异协助丈夫守城,多有功勋,自马超攻冀城至祁山坚守,赵昂曾出奇计九条,王异皆有参与。", + guanzhang: + "关兴,名将关羽之子,继承了父亲汉寿亭侯的爵位。年少时即受诸葛亮器重,在蜀汉担任侍中、中监军之职,后在夷陵之战中报了杀父之仇。张苞,张飞的长子,使用父亲的家传蛇矛为兵器,勇猛剽悍不弱其父。", + madai: "名将马超的从弟。早年他曾经从曹操手中死里逃生,后跟随马超大战曹操。后在诸葛亮病逝后受杨仪派遣斩杀了蜀将魏延。曾率领军队出师北伐,被魏将牛金击败而退还。", + caochong: + "字仓舒,曹操之子。从小聪明仁爱,与众不同,深受曹操喜爱。留有“曹冲称象”的典故。曹操几次对群臣夸耀他,有让他继嗣之意。可惜曹冲在建安十三病逝,年仅13岁。", + guohuai: + "魏国名将,夏侯渊战死时郭淮收集残兵,与杜袭共推张郃为主将而得以稳定局势。曹丕称帝后,赐郭淮爵关内侯,又任镇西长史。诸葛亮伐魏时,郭淮料敌准确,多立战功,而后亦曾击退姜维。", + manchong: + "初在曹操手下任许县县令,掌管司法,以执法严格著称;转任汝南太守,开始参与军事,曾参与赤壁之战。后关羽围攻樊城,满宠协助曹仁守城,劝阻了弃城而逃的计划,成功坚持到援军到来。曹丕在位期间,满宠驻扎在新野,负责荆州侧的对吴作战。曹叡在位期间,满宠转任到扬州,接替曹休负责东侧对吴作战,屡有功劳。", + guanping: + "关平是关羽在战乱中所收之义子。关羽脱离曹军后,与刘备于关定家中重逢,关定欲使年仅十八岁的关平随关羽同行,刘备便主张让关羽与关平结为义父子。自此后关平随侍在关羽身边,一生东征西讨。他武勇过人,不逊乃父,曾跟随刘备出征西川,立下战功,后来又与曹魏猛将庞德大战三十回合,不分胜负。", + jianyong: + "简雍为刘备同乡,年少时与刘备相识。黄巾之乱时,刘备加入对抗黄巾军的战争,简雍便跟随他奔走。常作为谈客,往来使命,刘备围成都时简雍作为刘备使臣成功劝说刘璋投降。简雍擅于辩论、议事。性情简单直接、不拘小节。", + liufeng: + "刘备义子。性格刚猛,气力过人。随赵云、张飞等扫荡西川,颇有战功,而后又统领孟达攻取上庸,深为刘备信任。但是后来关羽北伐曹魏,多次要求刘封起兵相助,刘封不从。而后又侵凌孟达,迫其降魏。孟达与魏徐晃共袭刘封,并劝刘封投降,刘封不降,又遭部下叛变,败归成都。刘备在诸葛亮的建议下赐死刘封,刘封自裁,刘备深表痛惜。", + panzhangmazhong: + "马忠为潘璋部将。于麦城之战中设伏擒获关羽及关平。刘备伐吴时,马忠随潘璋等往拒,突袭射伤蜀将黄忠,导致黄忠阵亡。不久,潘璋为关兴所杀,马忠领兵围击,击退张苞援军。后降将糜、傅发动兵变,刺杀了马忠,将首级献于刘备。", + yufan: "虞翻初在会稽被太守王朗任命为功曹,曾劝谏王朗躲开孙策未果。后孙策占江东仍任命他为功曹。吕蒙袭取荆州时,虞翻提醒其躲过了埋伏,成功占领城池。后因为直言进谏被孙权发配到交州。", + zhuran: "吴国著名将领,吕蒙白衣渡江取荆州,朱然协助潘璋捉住了关羽。黄武元年,刘备兵伐东吴,朱然与孙桓抵抗刘备大军。后又参加夷陵之战,追击刘备,被前来接应的赵云一枪刺死。", + fuhuanghou: + "执金吾伏完之女,汉献帝的皇后,后因怨恨曹操诛董承,与父伏完密谋曹操,事情泄漏,曹将伏皇后禁闭冷宫逼其自缢,所生二位皇子亦被鸩杀。", + liru: "董卓的首席谋士,为董卓所亲信,大小事宜皆与其商议。董卓趁乱进京、说降吕布、废立皇帝、迁都长安等举动,均离不开李儒的参谋之功,并奉命毒杀皇帝刘辩。李傕被曹操击败后,李儒从此不知所踪,消失在历史长河中。", + caozhen: + "曹操族子,官至大将军、大司马。其父为曹操招募人马时被州郡所杀,曹操因怜悯曹真少年丧父而待其如亲子一般,因赞赏曹真的勇猛而让他率领虎豹骑。曹真在镇守曹魏西北边境时表现突出,魏文帝时期督众将大破羌胡联军,平定河西;魏明帝时期屡次对抗诸葛亮的北伐。", + hanhaoshihuan: "韩浩和史涣都以忠勇著称,两人皆是曹操心腹将领,共同掌管禁兵。", + chenqun: + "陈群一直位居要职,先后受曹操、曹丕托孤,成为魏国重臣,官至司空。其子陈泰,亦是魏国后期名将。最大的贡献为创立了九品中正制,为后期的人才选拔和管理打好了基础。", + wuyi: "初为益州牧刘璋的部将,刘备进攻益州时,泠苞在雒城大败,吴懿自告奋勇,领兵前往救援。不料被赵云和张飞生擒,吴懿于是归降。刘备自称汉中王,迎娶吴懿之妹。诸葛亮出师北伐,吴懿以左将军、高阳侯的身份跟随出征,屡立战功。诸葛亮逝世后,吴懿随姜维一并镇守汉中。", + zhoucang: + "原为张宝部将。关羽千里走单骑时,周仓投降关羽,成为了关羽的贴身护卫。建安十六年(公元211年),刘备攻打成都时,周仓跟随关羽镇守荆州。关羽水淹七军时,周仓曾生擒魏军的立义将军庞德,关羽被孙权斩首之后,周仓在麦城大哭失声,拔剑自刎而死。", + zhangsong: + "刘璋的部下,长相丑陋但有过目不忘的本领。张松奉命出使许都被曹操赶出,归蜀时为刘备所厚待,于是将西川地理图献予刘备,劝刘备取益州,愿为内应,并派好友孟达、法正帮助刘备。", + sunluban: + "孙权之女。孙鲁班与孙权二子孙和不睦。孙权长子孙登死后,孙和被立为太子。孙鲁班向孙权进谗言废孙和太子之位,孙和被废后忧愤而死。", + zhuhuan: + "字休穆,吴郡吴县(今江苏苏州)人,吴国名将,官至前将军、青州牧,假节,封为嘉兴侯。有一子朱异。", + guyong: "为蔡邕之徒。其为人少言语,不饮酒,严厉正大,被张纮推荐仕于孙权。孙权任命他为会稽郡丞,行太守事,后不断升迁,官至吴国丞相。顾雍为官,多进良言,有功于吴。", + jushou: "袁绍帐下谋士。史载他“少有大志,擅于谋略”。曾为冀州别驾,举茂才,并当过两次县令。后来又当韩馥别驾,被韩馥表为骑都尉。袁绍占据冀州后任用沮授为从事。经常对袁绍提出良策,但很多时候袁绍并不听从。官渡之战时袁绍大败,沮授未及逃走,被曹操所获,因拒降被曹操处死。", + caifuren: + "原是刘表的小妾,正室死后,成为了刘表的后妻。因刘琮娶了自己的侄女所以对其偏爱有加。刘备客居荆州时险些受其所害。刘表死后为了让刘琮即位不惜献州于曹操。", + caorui: "魏文帝曹丕长子,曹魏第二位皇帝。在位期间指挥曹真、司马懿等人成功防御了吴、蜀的多次攻伐,并且平定鲜卑,攻灭公孙渊,颇有建树。", + caoxiu: "曹操族子,曹操大宴铜雀台之时,射箭夺袍。曹休随曹操四处征伐,在攻蜀汉中之战,伐吴濡须口之战均有登场,曾放冷箭射倒凌统的马匹,后又协助夏侯惇平息洛阳纵火叛乱,总管御林兵马,协助曹丕代汉。", + zhongyao: + "初为长安郡守,马超反叛时,引军攻打长安,钟繇率军防卫。后城破,钟繇从东门弃城而走,退守潼关。后奉献帝令繇草拟诏令,册立曹操为魏王,曹操以钟繇为相国。明帝即位时,钟繇为太傅。诸葛亮北伐,钟繇举荐司马懿前往抵御。", + liuchen: + "刘禅第五子,自幼聪明,英敏过人。魏军兵临城下时,刘禅准备投降,刘谌劝阻刘禅投降不成后悲愤不已,遂自杀于昭烈庙。", + xiahoushi: "夏侯渊从女,夏侯霸从妹,出城拾柴时被张飞所得,取其为妻。后生有二女,其中一人为星彩。", + zhangyi: + "曾随诸葛亮南征孟获,七擒孟获的战斗中立下赫赫战功,与祝融夫人单挑。诸葛亮病死五丈原,告诉姜维张嶷忠贞勇猛,经验丰富,是可以依靠的武将,后于征伐魏国时为掩护姜维撤退阵亡。", + sunxiu: "孙权第六子,孙綝发动政变罢黜孙亮后,迎立孙休为帝。后孙綝专权,孙休遣使丁奉等人将其诛杀。孙休在位期间,颁布良制,嘉惠百姓,促进了东吴的繁荣。", + zhuzhi: "孙坚旧将,朱然嗣父,孙坚阵亡后,孙策附袁术,朱治、吕范为之定计,用玉玺向袁术借兵夺取江东。孙策平定东路后,任命朱治为吴郡太守,收军返回江东。后来赤壁之战,大都督周瑜令朱治、吕范为四方巡警使,催督六郡官军。", + quancong: "吴国名将,孙策进兵江东时归顺之,深得孙权赏识,孙权甚至将孙鲁班许配之。", + gongsunyuan: + "辽东太守公孙度之孙,辽东割据首领。趁魏、吴骚乱之际自称燕王,发动叛乱,与魏对抗。败给司马懿率领的讨伐大军,被围困后乞降不被接受,与子修在欲出城逃跑时被斩杀。", + guotufengji: + "两人均是袁绍帐下谋士。曾联手献计,利用公孙瓒攻击韩馥,又劝说韩馥请袁绍抵挡公孙瓒,终替袁绍拿下冀州。官渡之战期间,两人进谗逼反张郃高览,逼死田丰。使得袁绍的实力大损。", + guohuanghou: + "明元郭皇后(并非郭女王),在三国志有正传。曹叡夫人,曹丕的儿媳妇,曹芳,曹髦,曹奂三朝太后,是唯一经历了曹魏全部皇帝时代的贵族女性。曹魏后三帝时期,由于皇帝年少,太后与重臣一同处理政务。史书上对郭皇后有两种截然不同的记载,一种是曹芳被废和曹髦死后郭太后发诏书斥责他们不配人君,另一种却提及曹芳被夺权期间,太后与曹芳相拥而泣,曹髦讨伐司马昭前,曾向太后禀报。", + liyan: "字正方,蜀汉重臣。初为刘表部下,曹操入主荆州时,李严西奔入蜀。刘备入川,李严率众投降,深得刘备器重,受命与诸葛亮、法正等人一同编制《蜀科》,又率军平定了蜀中盗贼。白帝城托孤,与诸葛亮共受遗诏同扶幼主。其人性格矜高难近,终因督粮不利且谎报实情而被流放,后在当地去世。", + sundeng: + "字子高,孙权长子。孙权称帝后其被立为太子,受诸葛恪等人辅佐。其人性情温和而能礼贤下士,加之爱民如子,因此深受爱戴。曾劝服孙权在孙虑之死时节哀,并劝谏孙权勿用吕壹苛政。后不幸早逝,临终前上书建言,推荐了多位良臣。其亡故令孙权极为悲伤,也为南鲁党争的祸乱埋下了伏笔。", + liuyu: "伯安,幽州牧,汉室宗亲。在幽州两度任职,颇有威望。张纯、张举叛乱,刘虞恩威并施将其平定,又鼓励农商,大大改善了当地经济民生,青徐二州流民纷纷前来避难。后坚拒袁绍等人立其为帝的请求,派兵迎接献帝,却为袁术所扣,并因此事激化了与公孙瓒的矛盾,最终被击败,为其所害。", + cenhun: "岑昏为宦官,官列中常侍,孙皓即位后得到宠幸。280年,晋龙骧将军王濬率军伐吴,岑昏建议以铁锁链封锁长江,阻挡晋军进攻。王濬以火船烧锁链破其计,沿途东吴将士或死或降。群臣上奏东吴衰败之因在于岑昏,将他与蜀汉的黄皓并列为误国之奸臣。", + sunziliufang: + "孙资在曹操手下历任县令,参丞相军事;刘放曾有劝王松归顺曹操之举,为曹操所欣赏,遂招为司空府官,又外放历任几处县令。魏国初建之际,孙资与刘放俱任秘书郎。曹丕继位后,二人一同掌握机密。曹睿病危时,二人力荐曹爽,又推荐招回司马懿辅政。最后,曹睿独召曹爽、司马懿、刘放、孙资同受诏命,而免去曹宇、夏侯献、曹肇、秦朗的官职。", + huanghao: + "宦官。为后主刘禅所宠,专秉朝政。黄皓与大将军姜维不睦,维启后主杀之,后主不从。皓阴以心腹阎宇替维。景耀六年,蜀亡,邓艾预欲杀之,皓贿赂左右得免。及后主迁洛阳,皓为司马昭凌迟处死。", + zhangrang: + "汉中常侍。同赵忠、曹节、段珪等为“十常侍”,为灵帝所宠。让等专权乱政、卖官索财,朝野皆痛恨之。郎中张钧上书奏请诛杀十常侍,帝不允,让等阴杀钧。及灵帝崩,大将军何进欲杀让等,让阴结何太后,招进入宫,斩杀之。部将袁绍引兵攻让,让等劫帝走河上。追急,让投水自尽。", + jikang: "嵇康(224年-263年,一作223年-262年),字叔夜。谯国铚县(今安徽省濉溪县)人。三国时期曹魏思想家、音乐家、文学家。
    嵇康幼年聪颖,博览群书,广习诸艺,又喜爱老庄学说。身长七尺八寸,容止出众。后娶魏武帝曹操曾孙女长乐亭主为妻,拜郎中,调中散大夫,世称“嵇中散”。后隐居不仕,屡拒为官。因得罪司隶校尉钟会,遭其构陷,而被掌权的大将军司马昭处死,时年四十岁。", + xinxianying: + "辛氏(191年—269年),字宪英,祖籍陇西,颍川阳翟(今河南禹州)人。魏晋时期著名才女,曹魏侍中辛毗之女,卫尉羊耽之妻。辛宪英聪朗有才鉴,曾劝弟辛敞尽忠职守,预言钟会将会叛乱。泰始五年(公元269年),辛宪英逝世,享年七十九岁。", + wuxian: "穆皇后吴氏(?—245年),陈留(今河南开封)人,车骑将军吴懿之妹,三国时期蜀汉昭烈帝刘备的皇后。
    吴氏早年丧父,其父生前与刘焉交情深厚,所以全家跟随刘焉来到蜀地。后刘焉听相面者说吴氏有大贵之相,于是为儿子刘瑁迎娶吴氏。刘瑁死后,吴氏成为寡妇。
    建安十九年(214年),刘备平定益州,纳吴氏为夫人。建安二十四年(219年),刘备自称汉中王,立吴氏为汉中王后。章武元年(221年),刘备称帝,建立蜀汉,立吴氏为皇后。章武三年(223年),刘备去世,太子刘禅即位,尊嫡母吴氏为皇太后。延熙八年(245年),吴氏去世,谥号穆皇后,葬入刘备的惠陵。", + qinmi: "秦宓(?-226年),字子敕。广汉郡绵竹县(今四川德阳北)人。三国蜀汉时大臣、学者。秦宓善舌辩。早年仕于益州牧刘璋麾下,后降刘备。刘备伐吴时,秦宓劝阻,刘备大怒,欲杀秦宓。因诸葛亮及时求情,才保住性命,仅被下狱,后被释放,拜左中郎将、长水校尉。吴蜀同盟后,孙权派张温至成都回访。酒宴之上,秦宓与张温舌战,说得张温无言以对。后官至大司农。建兴四年(226年),秦宓病逝。", + xushi: "徐氏,孙权之弟孙翊的妻子,著名烈女。孙翊的部下妫览、戴员买通家将边鸿将孙翊杀死,并将全部罪责推给边鸿,又谋杀了前来查问的太守孙河。徐夫人一面用美人计色诱妫览、戴员,令其放松警惕;一面对孙翊生前亲信孙高、傅婴说明真相并晓以大义,最终成功地在内室中将杀夫凶手妫览、戴员诛杀。", + xuezong: + "薛综(?―243年),字敬文,沛郡竹邑(今安徽濉溪)人,三国时期吴国名臣。少时避乱至交州,师从刘熙。士燮归附孙权,召其为五官中郎将,出任合浦、交阯太守。后从征至九真,回朝任谒者仆射。232年,升任尚书仆射。240年,改任选曹尚书。242年,担任太子少傅,兼任选部职任。243年,薛综去世。薛综是当时名儒,著有诗赋难论数万言,集为《私载》,并著有《五宗图述》、《二京解》。", + caiyong: + "蔡邕(133年-192年),字伯喈。陈留郡圉县(今河南杞县南)人。东汉时期名臣,文学家、书法家,才女蔡文姬之父。蔡邕早年拒朝廷征召之命,后被征辟为司徒掾属,任河平长、郎中、议郎等职,曾参与续写《东观汉记》及刻印熹平石经。后因罪被流放朔方,几经周折,避难江南十二年。董卓掌权时,强召蔡邕为祭酒。三日之内,历任侍御史、治书侍御史、尚书、侍中、左中郎将等职,封高阳乡侯,世称“蔡中郎”。董卓被诛杀后,蔡邕因在王允座上感叹而被下狱,不久便死于狱中,年六十。", + caojie: "曹节(196年―260年),沛国谯县(今安徽亳州)人,汉献帝刘协第二任皇后,魏武帝曹操的女儿。建安十八年(213年),曹操将女儿曹宪、曹节、曹华三姐妹同时入宫中,封为夫人。建安十九年(214年),并封为贵人。曹操废掉汉献帝第一位皇后伏寿,将她囚禁而死。曹操要汉献帝立曹节为皇后,汉献帝只得依从。建安二十五年(220年),曹操去世,曹丕袭封魏王位。曹丕授意华歆去逼汉献帝让位。曹节怒斥华歆,华歆只好退出宫去。第二天又逼汉献帝将帝位禅让给曹丕。并以武力威胁,向曹节索要玺印,曹节无奈,将玺印掷于栏板之下。面对曹丕篡位,她极为愤怒,高喊:“老天有眼,决不让你长久!”汉献帝被废为山阳公,曹节为山阳公夫人。景元元年(260年),曹节病逝,仍以汉朝礼仪合葬于献帝的禅陵,谥号献穆皇后。", }, - perfectPair:{ - wuguotai:['sunjian','sunshangxiang'], - zhangchunhua:['simayi'], - caozhi:['zhenji'], - xunyou:['xunyu'], - xushu:['liubei'], - lingtong:['ganning'], - chengong:['lvbu'], - bulianshi:['sunquan'], - fuhuanghou:['liuxie'], - sunluban:['quancong'], - caifuren:['liubiao'], - xiahoushi:['zhangfei'], - zhoucang:['guanyu'], - guanping:['guanyu'], - sundeng:['sunquan','zhoufei'], - liru:['dongzhuo'], - liuchen:['liushan'], - yujin:['xiahoudun'], - fazheng:['liubei'], - zhonghui:['jiangwei'], + perfectPair: { + wuguotai: ["sunjian", "sunshangxiang"], + zhangchunhua: ["simayi"], + caozhi: ["zhenji"], + xunyou: ["xunyu"], + xushu: ["liubei"], + lingtong: ["ganning"], + chengong: ["lvbu"], + bulianshi: ["sunquan"], + fuhuanghou: ["liuxie"], + sunluban: ["quancong"], + caifuren: ["liubiao"], + xiahoushi: ["zhangfei"], + zhoucang: ["guanyu"], + guanping: ["guanyu"], + sundeng: ["sunquan", "zhoufei"], + liru: ["dongzhuo"], + liuchen: ["liushan"], + yujin: ["xiahoudun"], + fazheng: ["liubei"], + zhonghui: ["jiangwei"], }, - skill:{ + skill: { //一将2023 //孙礼 - kangli:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + kangli: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - forced:true, - locked:false, - content:function(){ - player.draw(2).gaintag=['kangli']; - player.when({source:'damageBegin1'}) - .then(()=>{ - var cards=player.getCards('h',card=>card.hasGaintag('kangli')&&lib.filter.cardDiscardable(card,player,'kangli')); - if(cards.length) player.discard(cards); - }) + forced: true, + locked: false, + content: function () { + player.draw(2).gaintag = ["kangli"]; + player.when({ source: "damageBegin1" }).then(() => { + var cards = player.getCards( + "h", + (card) => + card.hasGaintag("kangli") && + lib.filter.cardDiscardable(card, player, "kangli") + ); + if (cards.length) player.discard(cards); + }); + }, + ai: { + maixie: true, }, - ai:{ - maixie:true, - } }, //夏侯楙 - tongwei:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he',card=>lib.skill.tongwei.filterCard(card,player))>1&&game.hasPlayer(i=>i!=player); + tongwei: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he", (card) => lib.skill.tongwei.filterCard(card, player)) > 1 && + game.hasPlayer((i) => i != player) + ); }, - filterTarget:lib.filter.notMe, - filterCard:lib.filter.cardRecastable, - selectCard:2, - position:'he', - discard:false, - lose:false, - delay:false, - popname:true, - check:function(card){ - var num=6.5; - if(ui.selected.cards.length){ - var cardx=ui.selected.cards[0]; - num=get.number(cardx); + filterTarget: lib.filter.notMe, + filterCard: lib.filter.cardRecastable, + selectCard: 2, + position: "he", + discard: false, + lose: false, + delay: false, + popname: true, + check: function (card) { + var num = 6.5; + if (ui.selected.cards.length) { + var cardx = ui.selected.cards[0]; + num = get.number(cardx); } - var del=Math.abs(get.number(card)-num); - return 5+del/5-get.value(card); + var del = Math.abs(get.number(card) - num); + return 5 + del / 5 - get.value(card); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.recast(cards); - 'step 1' - var numbers=cards.map(c=>get.number(c,player)).sort((a,b)=>a-b); - target.when('useCard1') - .then(()=>{ - trigger._tongwei_checked=true; - }) - target.when('useCardAfter') + ("step 1"); + var numbers = cards.map((c) => get.number(c, player)).sort((a, b) => a - b); + target.when("useCard1").then(() => { + trigger._tongwei_checked = true; + }); + target + .when("useCardAfter") .assign({ - numbers:numbers, - playerx:player, - mod:{ - aiOrder:function(player,card,num){ - var number=get.number(card); - if(typeof number!='number'||number<=numbers[0]||number>=numbers[1]) return num+10; + numbers: numbers, + playerx: player, + mod: { + aiOrder: function (player, card, num) { + var number = get.number(card); + if ( + typeof number != "number" || + number <= numbers[0] || + number >= numbers[1] + ) + return num + 10; }, }, }) - .filter((event,player)=>{ + .filter((event, player) => { return event._tongwei_checked; }) - .then(()=>{ - var number=get.number(trigger.card); - var numbers=get.info(event.name).numbers; - event.playerx=get.info(event.name).playerx; - if(typeof number!='number'||number<=numbers[0]||number>=numbers[1]) event.finish(); + .then(() => { + var number = get.number(trigger.card); + var numbers = get.info(event.name).numbers; + event.playerx = get.info(event.name).playerx; + if (typeof number != "number" || number <= numbers[0] || number >= numbers[1]) + event.finish(); }) - .then(()=>{ - var playerx=event.playerx; - var names=['sha','guohe'].filter(name=>playerx.canUse({name:name,isCard:true},player,false)); - if(!names.length) event.finish(); - else if(names.length==1) event._result={links:[[null,null,names[0]]]}; - else playerx.chooseButton([ - `请选择要视为对${get.translation(player)}使用的牌`, - [names,'vcard'], - ],true).set('ai',(button)=>{ - return button.link[0][2]==_status.event.choice; - }).set('choice',function(){ - var list=names.map(name=>{ - return [name,get.effect(player,{name:name,isCard:true},playerx,playerx)]; - }).sort((a,b)=>{ - return b[1]-a[1]; - }); - return list[0][0]; - }()); - }) - .then(()=>{ - var name=result.links[0][2]; - var card={name:name,isCard:true},playerx=event.playerx; - if(playerx.canUse(card,player,false)) playerx.useCard(card,player,'tongwei'); + .then(() => { + var playerx = event.playerx; + var names = ["sha", "guohe"].filter((name) => + playerx.canUse({ name: name, isCard: true }, player, false) + ); + if (!names.length) event.finish(); + else if (names.length == 1) event._result = { links: [[null, null, names[0]]] }; + else + playerx + .chooseButton( + [ + `请选择要视为对${get.translation(player)}使用的牌`, + [names, "vcard"], + ], + true + ) + .set("ai", (button) => { + return button.link[0][2] == _status.event.choice; + }) + .set( + "choice", + (function () { + var list = names + .map((name) => { + return [ + name, + get.effect( + player, + { name: name, isCard: true }, + playerx, + playerx + ), + ]; + }) + .sort((a, b) => { + return b[1] - a[1]; + }); + return list[0][0]; + })() + ); }) + .then(() => { + var name = result.links[0][2]; + var card = { name: name, isCard: true }, + playerx = event.playerx; + if (playerx.canUse(card, player, false)) playerx.useCard(card, player, "tongwei"); + }); }, - ai:{ - expose:0.2, - order:7, - threaten:2.2, - result:{ - target:-1, + ai: { + expose: 0.2, + order: 7, + threaten: 2.2, + result: { + target: -1, }, }, }, - cuguo:{ - audio:2, - trigger:{player:['shaMiss','eventNeutralized']}, - filter:function(event,player){ - if(event.type!='card'&&event.name!='_wuxie') return false; - if(!event.target||!event.target.isIn()||!player.canUse({ - name:event.card.name, - nature:event.card.nature, - isCard:true, - },event.target,false)) return false; - if(!player.hasCard(card=>lib.filter.cardDiscardable(card,player),'he')) return false; - var history=game.getGlobalHistory('everything'); - for(var evt of history){ - if(evt._neutralized||evt.responded&&(!evt.result||!evt.result.bool)){ - var evtx=evt.getParent(); - return evtx.name=='useCard'&&evtx.player==player&&evt==event; + cuguo: { + audio: 2, + trigger: { player: ["shaMiss", "eventNeutralized"] }, + filter: function (event, player) { + if (event.type != "card" && event.name != "_wuxie") return false; + if ( + !event.target || + !event.target.isIn() || + !player.canUse( + { + name: event.card.name, + nature: event.card.nature, + isCard: true, + }, + event.target, + false + ) + ) + return false; + if (!player.hasCard((card) => lib.filter.cardDiscardable(card, player), "he")) + return false; + var history = game.getGlobalHistory("everything"); + for (var evt of history) { + if (evt._neutralized || (evt.responded && (!evt.result || !evt.result.bool))) { + var evtx = evt.getParent(); + return evtx.name == "useCard" && evtx.player == player && evt == event; } } return false; }, - forced:true, - direct:true, - content:function(){ - 'step 0' - var card={ - name:trigger.card.name, - nature:trigger.card.nature, - isCard:true, - storage:{cuguo:true}, + forced: true, + direct: true, + content: function () { + "step 0"; + var card = { + name: trigger.card.name, + nature: trigger.card.nature, + isCard: true, + storage: { cuguo: true }, }; - event.card=card; - player.chooseToDiscard('蹙国:请弃置一张牌',`视为你对${get.translation(trigger.target)}使用一张${get.translation(card.nature||'')}【${get.translation(card.name)}】`,'he',true).set('logSkill',['cuguo',trigger.target]); - 'step 1' - if(player.canUse(card,trigger.target,false)){ - player.useCard(card,trigger.target); - player.when('useCardAfter') - .filter(event=>{ - return event.card.storage&&event.card.storage.cuguo; + event.card = card; + player + .chooseToDiscard( + "蹙国:请弃置一张牌", + `视为你对${get.translation(trigger.target)}使用一张${get.translation( + card.nature || "" + )}【${get.translation(card.name)}】`, + "he", + true + ) + .set("logSkill", ["cuguo", trigger.target]); + ("step 1"); + if (player.canUse(card, trigger.target, false)) { + player.useCard(card, trigger.target); + player + .when("useCardAfter") + .filter((event) => { + return event.card.storage && event.card.storage.cuguo; }) - .then(()=>{ - if(game.hasGlobalHistory('everything',evt=>{ - if(evt._neutralized||evt.responded&&(!evt.result||!evt.result.bool)){ - if(evt.getParent()==trigger) return true; - } - return false; - })){ + .then(() => { + if ( + game.hasGlobalHistory("everything", (evt) => { + if ( + evt._neutralized || + (evt.responded && (!evt.result || !evt.result.bool)) + ) { + if (evt.getParent() == trigger) return true; + } + return false; + }) + ) { player.loseHp(); } - }) + }); } - } + }, }, //陈式 - qingbei:{ - audio:2, - trigger:{global:'roundStart'}, - direct:true, - content:function(){ - 'step 0' - var next=player.chooseButton(['###擎北:是否选择任意种花色?###
    你不能于本轮能使用这些花色,且使用牌后摸等同于选择花色数的牌
    ',[lib.suit.map(i=>['','','lukai_'+i]),'vcard']],[1,4]); - next.set('ai',button=>{ - var player=_status.event.player; - var suit=button.link[2].slice(6); - var val=player.getCards('hs',{suit:suit}).map(card=>{ - return get.value(card)+player.getUseValue(card)/3; - }).reduce((p,c)=>{ - return p+c; - },0); - if(val>10&&ui.selected.buttons.length>0) return -1; - if(val>6&&ui.selected.buttons.length==2) return -1; - if(ui.selected.buttons.length==3) return -1; - return 1+1/val; + qingbei: { + audio: 2, + trigger: { global: "roundStart" }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseButton( + [ + '###擎北:是否选择任意种花色?###
    你不能于本轮能使用这些花色,且使用牌后摸等同于选择花色数的牌
    ', + [lib.suit.map((i) => ["", "", "lukai_" + i]), "vcard"], + ], + [1, 4] + ); + next.set("ai", (button) => { + var player = _status.event.player; + var suit = button.link[2].slice(6); + var val = player + .getCards("hs", { suit: suit }) + .map((card) => { + return get.value(card) + player.getUseValue(card) / 3; + }) + .reduce((p, c) => { + return p + c; + }, 0); + if (val > 10 && ui.selected.buttons.length > 0) return -1; + if (val > 6 && ui.selected.buttons.length == 2) return -1; + if (ui.selected.buttons.length == 3) return -1; + return 1 + 1 / val; }); - 'step 1' - if(result.bool){ - var suits=result.links.map(i=>i[2].slice(6)); - player.logSkill('qingbei'); - player.addTempSkill('qingbei_effect','roundStart'); - player.setStorage('qingbei_effect',suits); - player.markSkill('qingbei_effect'); + ("step 1"); + if (result.bool) { + var suits = result.links.map((i) => i[2].slice(6)); + player.logSkill("qingbei"); + player.addTempSkill("qingbei_effect", "roundStart"); + player.setStorage("qingbei_effect", suits); + player.markSkill("qingbei_effect"); } }, - ai:{ - threaten:2.3, + ai: { + threaten: 2.3, }, - subSkill:{ - effect:{ - audio:'qingbei', - trigger:{player:'useCardAfter'}, - charlotte:true, - onremove:true, - forced:true, - filter:function(event,player){ - if(!lib.suit.includes(get.suit(event.card))) return false; - return player.getStorage('qingbei_effect').length; + subSkill: { + effect: { + audio: "qingbei", + trigger: { player: "useCardAfter" }, + charlotte: true, + onremove: true, + forced: true, + filter: function (event, player) { + if (!lib.suit.includes(get.suit(event.card))) return false; + return player.getStorage("qingbei_effect").length; }, - content:function(){ - player.draw(player.getStorage('qingbei_effect').length); + content: function () { + player.draw(player.getStorage("qingbei_effect").length); }, - mark:true, - intro:{ - content:(storage)=>`本轮内不能使用${get.translation(storage)}花色的牌,且使用一张有花色的牌后摸${get.cnNumber(storage.length)}张牌`, + mark: true, + intro: { + content: (storage) => + `本轮内不能使用${get.translation( + storage + )}花色的牌,且使用一张有花色的牌后摸${get.cnNumber(storage.length)}张牌`, }, - mod:{ - cardEnabled:function(card,player){ - if(player.getStorage('qingbei_effect').includes(get.suit(card))) return false; + mod: { + cardEnabled: function (card, player) { + if (player.getStorage("qingbei_effect").includes(get.suit(card))) + return false; }, - cardSavable:function(card,player){ - if(player.getStorage('qingbei_effect').includes(get.suit(card))) return false; + cardSavable: function (card, player) { + if (player.getStorage("qingbei_effect").includes(get.suit(card))) + return false; }, }, - } - } + }, + }, }, //费曜 - zhenfeng:{ - audio:2, - trigger:{global:'useCard'}, - usable:1, - filter:function(event,player){ - return event.player!=player&&event.player==_status.currentPhase&&event.player.countCards('h')<=event.player.getHp(); + zhenfeng: { + audio: 2, + trigger: { global: "useCard" }, + usable: 1, + filter: function (event, player) { + return ( + event.player != player && + event.player == _status.currentPhase && + event.player.countCards("h") <= event.player.getHp() + ); }, - check:function(event,player){ - var type=get.type2(event.card,event.player); - if(type=='equip'&&event.player.hasCard(card=>event.player.hasValueTarget(card))) return false; - if(get.attitude(player,event.player)>0&&event.player.getHp()+event.player.countCards('hs',['shan','caochuan'])<=3) return false; + check: function (event, player) { + var type = get.type2(event.card, event.player); + if (type == "equip" && event.player.hasCard((card) => event.player.hasValueTarget(card))) + return false; + if ( + get.attitude(player, event.player) > 0 && + event.player.getHp() + event.player.countCards("hs", ["shan", "caochuan"]) <= 3 + ) + return false; return true; }, - onremove:true, - logTarget:'player', - content:function(){ - 'step 0' - var choices=Array.from({length:trigger.player.countCards('h')+1}).map((_,i)=>get.cnNumber(i,true)); - var type=get.type2(trigger.card,trigger.player); - player.chooseControl(choices).set('prompt','镇锋:猜测其手牌中的'+get.translation(type)+'牌数').set('ai',()=>{ - return _status.event.choice; - }).set('choice',function(){ - var num=trigger.player.countCards('h',card=>get.type2(card)==type); - var knownNum = trigger.player.countKnownCards(_status.event.player,card=>get.type2(card)==type); - if(trigger.player.isAllCardsKnown(_status.event.player)){ - return knownNum; - } - var restNum = num - knownNum; - var numx; - if(type=='basic') numx=num+Math.floor(Math.random()*restNum+1); - else if(type=='trick'){ - if(num>2) numx=2; - else numx=1; - if(Math.random()<0.5){ - numx+=Math.random()>0.5?1:-1; - } - } - else{ - numx=[0,1].randomGet(); - } - if(numx=choices.length) numx=choices.length-1; - return numx; - }()); - 'step 1' - var guessedNum=result.index; - player.chat('我猜'+get.cnNumber(guessedNum)+'张'); - game.log(player,'猜测',trigger.player,'有',get.cnNumber(guessedNum)+'张'+get.translation(type)+'牌'); - event.guessedNum=guessedNum; + onremove: true, + logTarget: "player", + content: function () { + "step 0"; + var choices = Array.from({ length: trigger.player.countCards("h") + 1 }).map((_, i) => + get.cnNumber(i, true) + ); + var type = get.type2(trigger.card, trigger.player); + player + .chooseControl(choices) + .set("prompt", "镇锋:猜测其手牌中的" + get.translation(type) + "牌数") + .set("ai", () => { + return _status.event.choice; + }) + .set( + "choice", + (function () { + var num = trigger.player.countCards("h", (card) => get.type2(card) == type); + var knownNum = trigger.player.countKnownCards( + _status.event.player, + (card) => get.type2(card) == type + ); + if (trigger.player.isAllCardsKnown(_status.event.player)) { + return knownNum; + } + var restNum = num - knownNum; + var numx; + if (type == "basic") numx = num + Math.floor(Math.random() * restNum + 1); + else if (type == "trick") { + if (num > 2) numx = 2; + else numx = 1; + if (Math.random() < 0.5) { + numx += Math.random() > 0.5 ? 1 : -1; + } + } else { + numx = [0, 1].randomGet(); + } + if (numx < knownNum) numx = knownNum; + else if (numx >= choices.length) numx = choices.length - 1; + return numx; + })() + ); + ("step 1"); + var guessedNum = result.index; + player.chat("我猜" + get.cnNumber(guessedNum) + "张"); + game.log( + player, + "猜测", + trigger.player, + "有", + get.cnNumber(guessedNum) + "张" + get.translation(type) + "牌" + ); + event.guessedNum = guessedNum; game.delay(); - 'step 2' - var type=get.type2(trigger.card,trigger.player); - var count=trigger.player.countCards('h',card=>get.type2(card)==type); - var guessedNum=event.guessedNum; - if(count==guessedNum){ - player.popup('洗具'); - game.log(player,'猜测','#g正确'); - if(player.countMark('zhenfeng')<5) player.addMark('zhenfeng',1,false); - player.draw(player.countMark('zhenfeng')); - if(player.canUse('sha',trigger.player,false)) player.useCard({name:'sha',isCard:true},trigger.player); - } - else{ - player.popup('杯具'); - game.log(player,'猜测','#y错误'); - player.clearMark('zhenfeng'); - if(Math.abs(count-guessedNum)>1&&trigger.player.canUse('sha',player,false)){ - trigger.player.useCard({name:'sha',isCard:true},player,false,'noai'); + ("step 2"); + var type = get.type2(trigger.card, trigger.player); + var count = trigger.player.countCards("h", (card) => get.type2(card) == type); + var guessedNum = event.guessedNum; + if (count == guessedNum) { + player.popup("洗具"); + game.log(player, "猜测", "#g正确"); + if (player.countMark("zhenfeng") < 5) player.addMark("zhenfeng", 1, false); + player.draw(player.countMark("zhenfeng")); + if (player.canUse("sha", trigger.player, false)) + player.useCard({ name: "sha", isCard: true }, trigger.player); + } else { + player.popup("杯具"); + game.log(player, "猜测", "#y错误"); + player.clearMark("zhenfeng"); + if (Math.abs(count - guessedNum) > 1 && trigger.player.canUse("sha", player, false)) { + trigger.player.useCard({ name: "sha", isCard: true }, player, false, "noai"); } } }, - intro:{ - content:'已连续猜对#次', + intro: { + content: "已连续猜对#次", }, }, //新杀小加强 李严 - dcduliang:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('he')>0; + dcduliang: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("he") > 0; }, - audio:'duliang', - content:function(){ - 'step 0' - player.gainPlayerCard(target,'he',true); - 'step 1' - var name=get.translation(target); - player.chooseControl(function(){ - return Math.random()<0.5?'选项一':'选项二'; - }).set('prompt','督粮:请选择一项').set('choiceList',['你观看牌堆顶的两张牌,然后令'+name+'获得其中的一或两张基本牌','令'+name+'于下回合的摸牌阶段额外摸一张牌']); - 'step 2' - if(result.control=='选项一'){ - var cards=get.cards(2),bool=false; - event.cards=cards; + audio: "duliang", + content: function () { + "step 0"; + player.gainPlayerCard(target, "he", true); + ("step 1"); + var name = get.translation(target); + player + .chooseControl(function () { + return Math.random() < 0.5 ? "选项一" : "选项二"; + }) + .set("prompt", "督粮:请选择一项") + .set("choiceList", [ + "你观看牌堆顶的两张牌,然后令" + name + "获得其中的一或两张基本牌", + "令" + name + "于下回合的摸牌阶段额外摸一张牌", + ]); + ("step 2"); + if (result.control == "选项一") { + var cards = get.cards(2), + bool = false; + event.cards = cards; game.cardsGotoOrdering(cards); - for(var card of cards){ - if(get.type(card)=='basic'){ - bool=true; + for (var card of cards) { + if (get.type(card) == "basic") { + bool = true; break; } } - player.chooseButton(['督粮:选择令'+get.translation(target)+'获得的牌',cards],[1,2],bool).set('filterButton',button=>{ - return get.type(button.link)=='basic'; - }).set('ai',button=>{ - return _status.event.sgn*get.value(button.link); - }).set('sgn',get.sgnAttitude(player,target)>0); - } - else{ - target.addTempSkill('dcduliang2',{player:'phaseAfter'}); - target.addMark('dcduliang2',1,false); + player + .chooseButton( + ["督粮:选择令" + get.translation(target) + "获得的牌", cards], + [1, 2], + bool + ) + .set("filterButton", (button) => { + return get.type(button.link) == "basic"; + }) + .set("ai", (button) => { + return _status.event.sgn * get.value(button.link); + }) + .set("sgn", get.sgnAttitude(player, target) > 0); + } else { + target.addTempSkill("dcduliang2", { player: "phaseAfter" }); + target.addMark("dcduliang2", 1, false); event.finish(); } - 'step 3' - if(result.bool){ - var cardsx=result.links; - target.gain(cardsx,'draw'); - game.log(target,'获得了'+get.cnNumber(cardsx.length)+'张牌'); + ("step 3"); + if (result.bool) { + var cardsx = result.links; + target.gain(cardsx, "draw"); + game.log(target, "获得了" + get.cnNumber(cardsx.length) + "张牌"); cards.removeArray(cardsx); cards.reverse(); } - for(var i=0;iget.sgnAttitude(target,player)*player.getUseValue({name:'wuzhong'})/(2-num*0.4)); - 'step 3' - if(!result.bool){ + content: function () { + "step 0"; + player.give(cards, target); + ("step 1"); + var num = 3 - get.skillCount("shuojian") + 1; + event.num = num; + event.num2 = num; + if (event.num == 0) event.finish(); + ("step 2"); + var forced = num != event.num2; + var prompt = + "###" + + get.translation(player) + + "对你发动了【数谏】###视为使用" + + get.cnNumber(num) + + "张【过河拆桥】" + + (forced + ? "" + : "且" + + get.translation(player) + + "此技能本回合失效,或点击“取消”令其摸" + + get.cnNumber(num) + + "张牌"); + if (!target.hasUseTarget({ name: "guohe" })) event._result = { bool: false }; + else + target + .chooseUseTarget(prompt, "guohe", forced) + .set("ai", function () { + var evt = _status.event; + if (evt.name == "chooseTarget") evt = evt.getParent(); + if (!evt.goon) return 0; + return get.effect_use.apply(this, arguments); + }) + .set( + "goon", + target.getUseValue({ name: "guohe" }) > + (get.sgnAttitude(target, player) * + player.getUseValue({ name: "wuzhong" })) / + (2 - num * 0.4) + ); + ("step 3"); + if (!result.bool) { player.draw(num); - if(num>1) player.chooseToDiscard('he',num-1,true); + if (num > 1) player.chooseToDiscard("he", num - 1, true); event.finish(); } - 'step 4' - if(--event.num2>0){ + ("step 4"); + if (--event.num2 > 0) { event.goto(2); - } - else player.tempBanSkill('shuojian'); + } else player.tempBanSkill("shuojian"); + }, + ai: { + expose: 0.15, + order: 8, + result: { target: 1 }, }, - ai:{ - expose:0.15, - order:8, - result:{target:1} - } }, //谯周 - shiming:{ - audio:2, - trigger:{global:'phaseDrawBegin1'}, - filter:function(event,player){ - return !player.hasSkill('shiming_round'); + shiming: { + audio: 2, + trigger: { global: "phaseDrawBegin1" }, + filter: function (event, player) { + return !player.hasSkill("shiming_round"); }, - check:function(event,player){ - return true;//get.attitude(player,event.player)<0||get.damageEffect(event.player,event.player,player)>0; + check: function (event, player) { + return true; //get.attitude(player,event.player)<0||get.damageEffect(event.player,event.player,player)>0; }, - logTarget:'player', - content:function(){ - 'step 0' - player.addTempSkill('shiming_round','roundStart'); - var cards=get.cards(3); - player.chooseButton(['识命:是否将其中一张置于牌堆底?',cards.slice(0)]).set('ai',button=>{ - var att=_status.event.att,damage=_status.event.damage,val=get.value(button.link,_status.event.player); - if(att>0&&damage<0||att<=0&&damage>0) return 6-val; - return val-5.99; - }).set('att',get.attitude(player,trigger.player)).set('damage',get.damageEffect(trigger.player,trigger.player,player)>0&&trigger.player.hp<=3?1:-1); - while(cards.length) ui.cardPile.insertBefore(cards.pop(),ui.cardPile.firstChild); - 'step 1' - if(result.bool){ - var card=result.links[0]; + logTarget: "player", + content: function () { + "step 0"; + player.addTempSkill("shiming_round", "roundStart"); + var cards = get.cards(3); + player + .chooseButton(["识命:是否将其中一张置于牌堆底?", cards.slice(0)]) + .set("ai", (button) => { + var att = _status.event.att, + damage = _status.event.damage, + val = get.value(button.link, _status.event.player); + if ((att > 0 && damage < 0) || (att <= 0 && damage > 0)) return 6 - val; + return val - 5.99; + }) + .set("att", get.attitude(player, trigger.player)) + .set( + "damage", + get.damageEffect(trigger.player, trigger.player, player) > 0 && + trigger.player.hp <= 3 + ? 1 + : -1 + ); + while (cards.length) ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild); + ("step 1"); + if (result.bool) { + var card = result.links[0]; card.fix(); ui.cardPile.appendChild(card); - player.popup('一下','wood'); - game.log(player,'将一张牌置于了牌堆底'); + player.popup("一下", "wood"); + game.log(player, "将一张牌置于了牌堆底"); } - 'step 2' - trigger.player.chooseBool('是否跳过摸牌阶段并对自己造成1点伤害,然后从牌堆底摸三张牌?').set('ai',()=>_status.event.bool).set('bool',get.damageEffect(trigger.player,trigger.player)>=-6||trigger.player.hp>3); - 'step 3' - if(result.bool){ + ("step 2"); + trigger.player + .chooseBool("是否跳过摸牌阶段并对自己造成1点伤害,然后从牌堆底摸三张牌?") + .set("ai", () => _status.event.bool) + .set( + "bool", + get.damageEffect(trigger.player, trigger.player) >= -6 || trigger.player.hp > 3 + ); + ("step 3"); + if (result.bool) { trigger.cancel(); trigger.player.damage(trigger.player); - } - else event.finish(); - 'step 4' - trigger.player.draw(3,'bottom'); + } else event.finish(); + ("step 4"); + trigger.player.draw(3, "bottom"); + }, + subSkill: { + round: { + mark: true, + intro: { content: "本轮已发动〖识命〗" }, + }, }, - subSkill:{ - round:{ - mark:true, - intro:{content:'本轮已发动〖识命〗'} - } - } }, - jiangxi:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - var zhu=game.findPlayer(i=>i.getSeatNum()==1); - return zhu&&player.hasSkill('shiming_round')&&(game.getGlobalHistory('changeHp',evt=>{ - return evt.player==zhu&&evt._dyinged; - }).length>0||zhu.getHistory('damage').length==0)||!game.hasPlayer2(current=>current.getHistory('damage').length>0); + jiangxi: { + audio: 2, + trigger: { global: "phaseEnd" }, + filter: function (event, player) { + var zhu = game.findPlayer((i) => i.getSeatNum() == 1); + return ( + (zhu && + player.hasSkill("shiming_round") && + (game.getGlobalHistory("changeHp", (evt) => { + return evt.player == zhu && evt._dyinged; + }).length > 0 || + zhu.getHistory("damage").length == 0)) || + !game.hasPlayer2((current) => current.getHistory("damage").length > 0) + ); }, - direct:true, - content:function(){ - 'step 0' - if(player.hasSkill('shiming_round')){ - var zhu=game.findPlayer(i=>i.getSeatNum()==1); - if(game.getGlobalHistory('changeHp',evt=>{ - return evt.player==zhu&&evt._dyinged; - }).length>0||zhu.getHistory('damage').length==0){ - player.chooseBool(get.prompt('jiangxi'),'重置〖识命〗'); + direct: true, + content: function () { + "step 0"; + if (player.hasSkill("shiming_round")) { + var zhu = game.findPlayer((i) => i.getSeatNum() == 1); + if ( + game.getGlobalHistory("changeHp", (evt) => { + return evt.player == zhu && evt._dyinged; + }).length > 0 || + zhu.getHistory("damage").length == 0 + ) { + player.chooseBool(get.prompt("jiangxi"), "重置〖识命〗"); } - } - else event.goto(2); - 'step 1' - if(result.bool){ - player.logSkill('jiangxi'); - event.logged=true; - player.removeSkill('shiming_round'); + } else event.goto(2); + ("step 1"); + if (result.bool) { + player.logSkill("jiangxi"); + event.logged = true; + player.removeSkill("shiming_round"); player.draw(); } - 'step 2' - if(!game.hasPlayer2(current=>current.getHistory('damage').length>0)){ - player.chooseBool(get.prompt('jiangxi'),'与'+get.translation(trigger.player)+'各摸一张牌').set('ai',()=>_status.event.bool).set('bool',trigger.player.getUseValue({name:'wuzhong'})+player.getUseValue({name:'wuzhong'})>0); - } - else event.finish(); - 'step 3' - if(result.bool){ - if(!event.logged) player.logSkill('jiangxi'); - trigger.player.draw('nodelay'); + ("step 2"); + if (!game.hasPlayer2((current) => current.getHistory("damage").length > 0)) { + player + .chooseBool( + get.prompt("jiangxi"), + "与" + get.translation(trigger.player) + "各摸一张牌" + ) + .set("ai", () => _status.event.bool) + .set( + "bool", + trigger.player.getUseValue({ name: "wuzhong" }) + + player.getUseValue({ name: "wuzhong" }) > + 0 + ); + } else event.finish(); + ("step 3"); + if (result.bool) { + if (!event.logged) player.logSkill("jiangxi"); + trigger.player.draw("nodelay"); player.draw(); } - } + }, }, //韩龙 - duwang:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + duwang: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - var cards=[]; - for(var i=0;i=5) break; + content: function () { + var cards = []; + for (var i = 0; i < ui.cardPile.childNodes.length; i++) { + var card = ui.cardPile.childNodes[i]; + if (card.name != "sha") cards.push(card); + if (cards.length >= 5) break; } - if(cards.length) player.addToExpansion(cards,'gain2').gaintag.add('duwang'); + if (cards.length) player.addToExpansion(cards, "gain2").gaintag.add("duwang"); }, - marktext:'刺', - intro:{ - name:'刺', - name2:'刺', - content:'expansion', - markcount:'expansion', + marktext: "刺", + intro: { + name: "刺", + name2: "刺", + content: "expansion", + markcount: "expansion", }, - mod:{ - globalFrom:function(from,to,distance){ - return distance+Math.min(1,from.getExpansions('duwang').filter(i=>i.name!='sha').length); + mod: { + globalFrom: function (from, to, distance) { + return ( + distance + + Math.min(1, from.getExpansions("duwang").filter((i) => i.name != "sha").length) + ); }, - globalTo:function(from,to,distance){ - return distance+Math.min(1,to.getExpansions('duwang').filter(i=>i.name!='sha').length); + globalTo: function (from, to, distance) { + return ( + distance + + Math.min(1, to.getExpansions("duwang").filter((i) => i.name != "sha").length) + ); }, }, }, - cibei:{ - audio:2, - trigger:{global:'cardsDiscardAfter'}, - filter:function(event,player){ - if(!player.getExpansions('duwang').filter(i=>i.name!='sha').length) return false; - var evt=event.getParent(); - if(evt.name!='orderingDiscard') return false; - var evtx=evt.relatedEvent||evt.getParent(); - return evtx.name=='useCard'&&evtx.card.name=='sha'&&event.cards.filterInD('d').length&&game.hasPlayer2(current=>current.hasHistory('sourceDamage',evtxx=>{ - return evtxx.card==evtx.card; - })); + cibei: { + audio: 2, + trigger: { global: "cardsDiscardAfter" }, + filter: function (event, player) { + if (!player.getExpansions("duwang").filter((i) => i.name != "sha").length) return false; + var evt = event.getParent(); + if (evt.name != "orderingDiscard") return false; + var evtx = evt.relatedEvent || evt.getParent(); + return ( + evtx.name == "useCard" && + evtx.card.name == "sha" && + event.cards.filterInD("d").length && + game.hasPlayer2((current) => + current.hasHistory("sourceDamage", (evtxx) => { + return evtxx.card == evtx.card; + }) + ) + ); }, - direct:true, - group:'cibei_fullyReady', - content:function(){ - 'step 0' - player.chooseButton([ - '###'+get.prompt('cibei')+'###
    将一张“刺”置入弃牌堆,并将'+get.translation(trigger.cards.filterInD('d'))+'置入“刺”
    ', - player.getExpansions('duwang') - ]).set('filterButton',button=>{ - return button.link.name!='sha'; - }); - 'step 1' - if(result.bool){ - player.logSkill('cibei'); - player.loseToDiscardpile(result.links); - player.addToExpansion(trigger.cards.filterInD('d'),'gain2').gaintag.add('duwang'); - if(game.hasPlayer(current=>current.countDiscardableCards(player,'hej')>0)) player.chooseTarget('刺北:弃置一名角色区域内的一张牌',true,(card,player,target)=>{ - return target.countDiscardableCards(player,'hej')>0; - }).set('ai',target=>{ - return get.effect(target,{name:'guohe'},_status.event.player); + direct: true, + group: "cibei_fullyReady", + content: function () { + "step 0"; + player + .chooseButton([ + "###" + + get.prompt("cibei") + + '###
    将一张“刺”置入弃牌堆,并将' + + get.translation(trigger.cards.filterInD("d")) + + "置入“刺”
    ", + player.getExpansions("duwang"), + ]) + .set("filterButton", (button) => { + return button.link.name != "sha"; }); - } - else event.finish(); - 'step 2' - if(result.bool){ - var target=result.targets[0]; + ("step 1"); + if (result.bool) { + player.logSkill("cibei"); + player.loseToDiscardpile(result.links); + player.addToExpansion(trigger.cards.filterInD("d"), "gain2").gaintag.add("duwang"); + if (game.hasPlayer((current) => current.countDiscardableCards(player, "hej") > 0)) + player + .chooseTarget( + "刺北:弃置一名角色区域内的一张牌", + true, + (card, player, target) => { + return target.countDiscardableCards(player, "hej") > 0; + } + ) + .set("ai", (target) => { + return get.effect(target, { name: "guohe" }, _status.event.player); + }); + } else event.finish(); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; player.line(target); - player.discardPlayerCard(target,'hej',true); + player.discardPlayerCard(target, "hej", true); player.addExpose(0.1); } }, - ai:{ - combo:'duwang' + ai: { + combo: "duwang", }, - subSkill:{ - fullyReady:{ - trigger:{global:'phaseEnd'}, - forced:true, - locked:false, - filter:function(event,player){ - var storage=player.getExpansions('duwang'); - return storage.length>0&&storage.every(i=>i.name=='sha'); + subSkill: { + fullyReady: { + trigger: { global: "phaseEnd" }, + forced: true, + locked: false, + filter: function (event, player) { + var storage = player.getExpansions("duwang"); + return storage.length > 0 && storage.every((i) => i.name == "sha"); }, - content:function(){ - player.gain(player.getExpansions('duwang'),'gain2').gaintag.add('cibei_mark'); - player.addSkill('cibei_mark'); + content: function () { + player.gain(player.getExpansions("duwang"), "gain2").gaintag.add("cibei_mark"); + player.addSkill("cibei_mark"); }, }, - mark:{ - trigger:{player:'useCard1'}, - onremove:true, - charlotte:true, - silent:true, - firstDo:true, - filter:function(event,player){ - return player.hasHistory('lose',evt=>{ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('cibei_mark')) return true; + mark: { + trigger: { player: "useCard1" }, + onremove: true, + charlotte: true, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.hasHistory("lose", (evt) => { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("cibei_mark")) return true; } return false; }); }, - content:function(){ - if(trigger.addCount!==false){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(typeof stat[name]=='number') stat[name]--; + content: function () { + if (trigger.addCount !== false) { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; } }, - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('cibei_mark')) return true; + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("cibei_mark")) return true; }, - cardDiscardable:function(card,player,name){ - if(card.hasGaintag('cibei_mark')) return false; + cardDiscardable: function (card, player, name) { + if (card.hasGaintag("cibei_mark")) return false; }, - canBeDiscarded:function(card){ - if(card.hasGaintag('cibei_mark')) return false; + canBeDiscarded: function (card) { + if (card.hasGaintag("cibei_mark")) return false; }, - targetInRange:function(card,player,target){ - if(!card.cards) return; - for(var i of card.cards){ - if(i.hasGaintag('cibei_mark')) return true; + targetInRange: function (card, player, target) { + if (!card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("cibei_mark")) return true; } }, - cardUsable:function(card,player){ - if(!card.cards) return; - for(var i of card.cards){ - if(i.hasGaintag('cibei_mark')) return true; + cardUsable: function (card, player) { + if (!card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("cibei_mark")) return true; } - } - } + }, + }, }, - } + }, }, //武安国 - diezhang:{ - audio:2, - locked:false, - zhuanhuanji:function(player,skill){ - if(!player.storage.duanwan) player.storage[skill]=!player.storage[skill]; + diezhang: { + audio: 2, + locked: false, + zhuanhuanji: function (player, skill) { + if (!player.storage.duanwan) player.storage[skill] = !player.storage[skill]; }, - trigger:{global:['eventNeutralized','shaMiss']}, - filter:function(event,player){ - if(player.hasSkill('diezhang_used')) return false; - if(event.type!='card') return false; - var evt=event._neutralize_event; - var user,responder; - if(event.name=='sha'){ - user=event.player;responder=event.target; + trigger: { global: ["eventNeutralized", "shaMiss"] }, + filter: function (event, player) { + if (player.hasSkill("diezhang_used")) return false; + if (event.type != "card") return false; + var evt = event._neutralize_event; + var user, responder; + if (event.name == "sha") { + user = event.player; + responder = event.target; + } else { + if (evt.type != "card") return false; + user = event.player; + responder = evt.player; } - else{ - if(evt.type!='card') return false; - user=event.player; - responder=evt.player; - } - if(!player.storage.diezhang){ - if(user!=player||responder==player) return false; - return player.countDiscardableCards(player,'he')>0&&player.canUse('sha',responder,false); - } - else{ - if(user==player||responder!=player) return false; - return player.canUse('sha',user,false); + if (!player.storage.diezhang) { + if (user != player || responder == player) return false; + return ( + player.countDiscardableCards(player, "he") > 0 && + player.canUse("sha", responder, false) + ); + } else { + if (user == player || responder != player) return false; + return player.canUse("sha", user, false); } }, - direct:true, - content:function(){ - 'step 0' - var evt=trigger._neutralize_event; - var user,responder; - if(trigger.name=='sha'){ - user=trigger.player;responder=trigger.target; + direct: true, + content: function () { + "step 0"; + var evt = trigger._neutralize_event; + var user, responder; + if (trigger.name == "sha") { + user = trigger.player; + responder = trigger.target; + } else { + user = trigger.player; + responder = evt.player; } - else{ - user=trigger.player; - responder=evt.player; + var num = player.storage.duanwan ? 2 : 1; + event.num = num; + if (!player.storage.diezhang) { + var target = responder; + event.target = target; + var next = player + .chooseToDiscard( + get.prompt("diezhang", target), + "弃置一张牌,视为对其使用" + get.cnNumber(num) + "张【杀】", + "he" + ) + .set("ai", (card) => { + if (_status.event.goon) return 6 - get.value(card); + return 0; + }) + .set("logSkill", ["diezhang", target]); + } else { + var target = user; + event.target = target; + var next = player + .chooseBool( + get.prompt("diezhang", target), + "摸" + get.cnNumber(num) + "张牌,视为对其使用一张【杀】" + ) + .set("ai", () => _status.event.goon); } - var num=player.storage.duanwan?2:1; - event.num=num; - if(!player.storage.diezhang){ - var target=responder; - event.target=target; - var next=player.chooseToDiscard(get.prompt('diezhang',target),'弃置一张牌,视为对其使用'+get.cnNumber(num)+'张【杀】','he').set('ai',card=>{ - if(_status.event.goon) return 6-get.value(card); - return 0; - }).set('logSkill',['diezhang',target]); - } - else{ - var target=user; - event.target=target; - var next=player.chooseBool(get.prompt('diezhang',target),'摸'+get.cnNumber(num)+'张牌,视为对其使用一张【杀】').set('ai',()=>_status.event.goon); - } - next.set('goon',get.effect(target,{name:'sha'},player,player)>0); - 'step 1' - if(result.bool){ - if(player.storage.duanwan) player.addTempSkill('diezhang_used'); - player.changeZhuanhuanji('diezhang'); - if(!result.cards||!result.cards.length){ - player.logSkill('diezhang',target); - player.draw(num,'nodelay'); - player.useCard({name:'sha',isCard:true},target,false); - } - else while(num--) player.useCard({name:'sha',isCard:true},target,false); + next.set("goon", get.effect(target, { name: "sha" }, player, player) > 0); + ("step 1"); + if (result.bool) { + if (player.storage.duanwan) player.addTempSkill("diezhang_used"); + player.changeZhuanhuanji("diezhang"); + if (!result.cards || !result.cards.length) { + player.logSkill("diezhang", target); + player.draw(num, "nodelay"); + player.useCard({ name: "sha", isCard: true }, target, false); + } else while (num--) player.useCard({ name: "sha", isCard: true }, target, false); } }, - marktext:'☯', - mark:true, - intro:{ - content:function(storage,player){ - var cnNum=get.cnNumber(player.storage.duanwan?2:1); - if(storage) return '当其他角色使用牌被你抵消后,你可以摸'+cnNum+'张牌,视为对其使用一张【杀】。'; - return '当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用'+cnNum+'张【杀】。'; + marktext: "☯", + mark: true, + intro: { + content: function (storage, player) { + var cnNum = get.cnNumber(player.storage.duanwan ? 2 : 1); + if (storage) + return ( + "当其他角色使用牌被你抵消后,你可以摸" + + cnNum + + "张牌,视为对其使用一张【杀】。" + ); + return ( + "当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用" + + cnNum + + "张【杀】。" + ); }, }, - mod:{ - cardUsable:function(card,player,num){ - if(!player.storage.duanwan&&card.name=='sha') return num+1; + mod: { + cardUsable: function (card, player, num) { + if (!player.storage.duanwan && card.name == "sha") return num + 1; }, }, - subSkill:{used:{charlotte:true}} + subSkill: { used: { charlotte: true } }, }, - duanwan:{ - audio:2, - enable:'chooseToUse', - skillAnimation:true, - animationColor:'soil', - limited:true, - filter:function(event,player){ - return event.type=='dying'&&player==event.dying; + duanwan: { + audio: 2, + enable: "chooseToUse", + skillAnimation: true, + animationColor: "soil", + limited: true, + filter: function (event, player) { + return event.type == "dying" && player == event.dying; }, - content:function(){ - player.changeZhuanhuanji('diezhang'); - player.awakenSkill('duanwan'); - var num=2-player.hp; - if(num>0) player.recover(num); + content: function () { + player.changeZhuanhuanji("diezhang"); + player.awakenSkill("duanwan"); + var num = 2 - player.hp; + if (num > 0) player.recover(num); }, - ai:{ - save:true, - skillTagFilter:function(player,tag,target){ - return player==target; + ai: { + save: true, + skillTagFilter: function (player, tag, target) { + return player == target; }, - result:{player:1}, - } + result: { player: 1 }, + }, }, //李婉 - liandui:{ - audio:2, - trigger:{global:'useCard'}, - filter:function(event,player){ - var history=game.getAllGlobalHistory('useCard'); - var index=history.indexOf(event); - if(index<=0) return false; - var previous=history[index-1].player; - if(event.player==player&&previous!=player&&previous.isIn()) return true; - if(event.player!=player&&previous==player) return true; + liandui: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + var history = game.getAllGlobalHistory("useCard"); + var index = history.indexOf(event); + if (index <= 0) return false; + var previous = history[index - 1].player; + if (event.player == player && previous != player && previous.isIn()) return true; + if (event.player != player && previous == player) return true; return false; }, - direct:true, - content:function(){ - 'step 0' - var history=game.getAllGlobalHistory('useCard'); - var index=history.indexOf(trigger); - var previous=history[index-1].player; - var user=trigger.player,target=previous; - event.user=user;event.target=target; - if(user){ - user.chooseBool('是否对'+get.translation(target)+'发动【联对】?','令'+get.translation(target)+'摸两张牌').set('ai',()=>_status.event.bool).set('bool',get.effect(target,{name:'draw'},user,user)>0); + direct: true, + content: function () { + "step 0"; + var history = game.getAllGlobalHistory("useCard"); + var index = history.indexOf(trigger); + var previous = history[index - 1].player; + var user = trigger.player, + target = previous; + event.user = user; + event.target = target; + if (user) { + user.chooseBool( + "是否对" + get.translation(target) + "发动【联对】?", + "令" + get.translation(target) + "摸两张牌" + ) + .set("ai", () => _status.event.bool) + .set("bool", get.effect(target, { name: "draw" }, user, user) > 0); } - 'step 1' - if(result.bool){ - event.user.logSkill('liandui',target); + ("step 1"); + if (result.bool) { + event.user.logSkill("liandui", target); target.draw(2); } - } + }, }, - biejun:{ - audio:2, - global:'biejun_give', - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - return !player.hasSkill('biejun_used')&&player.countCards('h',card=>{ - return card.hasGaintag('biejun'); - })==0; + biejun: { + audio: 2, + global: "biejun_give", + trigger: { player: "damageBegin4" }, + filter: function (event, player) { + return ( + !player.hasSkill("biejun_used") && + player.countCards("h", (card) => { + return card.hasGaintag("biejun"); + }) == 0 + ); }, - prompt2:'翻面并防止此伤害', - check:function(event,player){ - return player.isTurnedOver()||event.num>=player.hp||get.distance(_status.currentPhase,player,'absolute')>=3; + prompt2: "翻面并防止此伤害", + check: function (event, player) { + return ( + player.isTurnedOver() || + event.num >= player.hp || + get.distance(_status.currentPhase, player, "absolute") >= 3 + ); }, - content:function(){ - player.addTempSkill('biejun_used'); + content: function () { + player.addTempSkill("biejun_used"); player.turnOver(); trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(get.tag(card,'damage')){ - if(player.getNext()==target&&lib.skill.biejun.filter(null,target)&&target.isTurnedOver()) return [0,1]; + ai: { + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (get.tag(card, "damage")) { + if ( + player.getNext() == target && + lib.skill.biejun.filter(null, target) && + target.isTurnedOver() + ) + return [0, 1]; } - } - } + }, + }, }, - subSkill:{ - used:{charlotte:true}, - give:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(!player.countCards('h')) return false; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('biejun'); + subSkill: { + used: { charlotte: true }, + give: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if (!player.countCards("h")) return false; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("biejun"); }); - if(!targets.length) return false; + if (!targets.length) return false; return true; }, - selectCard:1, - filterCard:true, - filterTarget:function(card,player,target){ - return target.hasSkill('biejun'); + selectCard: 1, + filterCard: true, + filterTarget: function (card, player, target) { + return target.hasSkill("biejun"); }, - selectTarget:function(){ - var player=_status.event.player; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('biejun'); + selectTarget: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("biejun"); }); - return targets.length>1?1:-1; + return targets.length > 1 ? 1 : -1; }, - complexSelect:true, - prompt:function(){ - var player=_status.event.player; - var targets=game.filterPlayer(function(current){ - return current!=player&¤t.hasSkill('biejun'); + complexSelect: true, + prompt: function () { + var player = _status.event.player; + var targets = game.filterPlayer(function (current) { + return current != player && current.hasSkill("biejun"); }); - return '将一张手牌交给'+get.translation(targets)+(targets.length>1?'中的一人':''); + return ( + "将一张手牌交给" + + get.translation(targets) + + (targets.length > 1 ? "中的一人" : "") + ); }, - position:'h', - discard:false, - lose:false, - delay:false, - check:function(card){ - var player=_status.event.player; - if(game.hasPlayer(function(current){ - return lib.skill.biejun_give.filterTarget(null,player,current)&&get.attitude(player,current)>0; - })){ - return 5-get.value(card); + position: "h", + discard: false, + lose: false, + delay: false, + check: function (card) { + var player = _status.event.player; + if ( + game.hasPlayer(function (current) { + return ( + lib.skill.biejun_give.filterTarget(null, player, current) && + get.attitude(player, current) > 0 + ); + }) + ) { + return 5 - get.value(card); } return -get.value(card); }, - content:function(){ - game.trySkillAudio('biejun',target); - player.give(cards,target).gaintag.add('biejun'); - target.addTempSkill('biejun_tag'); + content: function () { + game.trySkillAudio("biejun", target); + player.give(cards, target).gaintag.add("biejun"); + target.addTempSkill("biejun_tag"); }, - ai:{ - order:2, - result:{target:1}, + ai: { + order: 2, + result: { target: 1 }, }, }, - tag:{ - charlotte:true, - forced:true, - onremove:function(player){ - player.removeGaintag('biejun'); - } - } - } + tag: { + charlotte: true, + forced: true, + onremove: function (player) { + player.removeGaintag("biejun"); + }, + }, + }, }, //诸葛尚 - sangu:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - getEffect:function(player,target,event,list1,list2){ - let att=get.attitude(player,target); - if(att===0) return 0; - let getv=function(name,player,arg){ - let v=event.getTempCache('sangu',player.id+name); - if(typeof v==='number') return v; - v=player.getUseValue({name:name,storage:{sangu:true}},arg); - event.putTempCache('sangu',player.id+name,v); + sangu: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + getEffect: function (player, target, event, list1, list2) { + let att = get.attitude(player, target); + if (att === 0) return 0; + let getv = function (name, player, arg) { + let v = event.getTempCache("sangu", player.id + name); + if (typeof v === "number") return v; + v = player.getUseValue({ name: name, storage: { sangu: true } }, arg); + event.putTempCache("sangu", player.id + name, v); return v; }; - if(att<0){ - for(let i of list1){ - if(getv(i,target)<=0||getv(i,target)<=0) return -att*Math.sqrt(get.threaten(target))*2; + if (att < 0) { + for (let i of list1) { + if (getv(i, target) <= 0 || getv(i, target) <= 0) + return -att * Math.sqrt(get.threaten(target)) * 2; } return 0; - } - else{ - let list=list1.concat(player.hp>1?list2:[]),eff=0; - list.sort(function(a,b){ - return getv(b,target)-getv(a,target); + } else { + let list = list1.concat(player.hp > 1 ? list2 : []), + eff = 0; + list.sort(function (a, b) { + return getv(b, target) - getv(a, target); }); - list=list.slice(3); - for(let i of list){ - let res=getv(i,target); - if(res<=5) break; - else eff+=res; + list = list.slice(3); + for (let i of list) { + let res = getv(i, target); + if (res <= 5) break; + else eff += res; } - return Math.sqrt(eff/1.5)*att; + return Math.sqrt(eff / 1.5) * att; } }, - content:function(){ - 'step 0' - event.list1=[]; - event.list2=[]; - event.used=[]; - player.getHistory('useCard',function(evt){ + content: function () { + "step 0"; + event.list1 = []; + event.list2 = []; + event.used = []; + player.getHistory("useCard", function (evt) { event.used.add(evt.card.name); }); - for(let name of lib.inpile){ - let add=false,type=get.type(name); - if(name==='sha') add=true; - else if(type==='trick'){ - let info=lib.card[name]; - if(info&&!info.singleCard&&!info.notarget) add=true; + for (let name of lib.inpile) { + let add = false, + type = get.type(name); + if (name === "sha") add = true; + else if (type === "trick") { + let info = lib.card[name]; + if (info && !info.singleCard && !info.notarget) add = true; } - if(!add) continue; - if(event.used.includes(name)) event.list1.push(name); + if (!add) continue; + if (event.used.includes(name)) event.list1.push(name); else event.list2.push(name); } - if(!event.list1.length&&!event.list2.length) event.finish(); - else player.chooseTarget(get.prompt2('sangu'),lib.filter.notMe).set('ai',function(target){ - return lib.skill.sangu.getEffect(_status.event.player,target,_status.event.getTrigger(),_status.event.list1,_status.event.list2); - }).set('list1',event.list1).set('list2',event.list2); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('sangu',target); - event.target=target; - } - else event.finish(); - 'step 2' - var dialog=['为'+get.translation(target)+'选择至多三个牌名']; - if(event.list1.length){ + if (!event.list1.length && !event.list2.length) event.finish(); + else + player + .chooseTarget(get.prompt2("sangu"), lib.filter.notMe) + .set("ai", function (target) { + return lib.skill.sangu.getEffect( + _status.event.player, + target, + _status.event.getTrigger(), + _status.event.list1, + _status.event.list2 + ); + }) + .set("list1", event.list1) + .set("list2", event.list2); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("sangu", target); + event.target = target; + } else event.finish(); + ("step 2"); + var dialog = ["为" + get.translation(target) + "选择至多三个牌名"]; + if (event.list1.length) { dialog.push('
    本回合已使用过的牌
    '); - dialog.push([event.list1.map(i=>[get.type(i),'',i]),'vcard']); + dialog.push([event.list1.map((i) => [get.type(i), "", i]), "vcard"]); } - if(event.list2.length){ + if (event.list2.length) { dialog.push('
    本回合未使用过的牌
    '); - dialog.push([event.list2.map(i=>[get.type(i),'',i]),'vcard']); + dialog.push([event.list2.map((i) => [get.type(i), "", i]), "vcard"]); } - player.chooseButton(dialog,true,[1,3]).set('ai',function(button){ - let name=button.link[2], - list=_status.event.list, - player=_status.event.player, - target=_status.event.getParent().target, - trigger=_status.event.getTrigger(), - getv=(name,player)=>{ - let v=trigger.getTempCache('sangu',player.id+name); - if(typeof v==='number') return v; - v=player.getUseValue({name:name,storage:{sangu:true}}); - trigger.putTempCache('sangu',player.id+name,v); - return v; - }; - if(get.attitude(player,target)<0){ - if(!list.includes(name)) return 0; - return -getv(name,target); - } - else{ - if(player.hp<2&&!list.includes(name)) return 0; - let val=getv(name,target),base=5; - val=Math.min(15,val-base); - if(name==='wuzhong'||name==='dongzhuxianji') val+=15; - else if(name==='shunshou') val+=6; - return val; - } - }).set('list',event.list1); - 'step 3' - if(result.bool){ - var names=result.links.map((i)=>i[2]); - if(!target.storage.sangu_effect) target.storage.sangu_effect=[]; - target.storage.sangu_effect=target.storage.sangu_effect.concat(names); - game.log(player,'为',target,'选择了','#y'+get.translation(names)); - target.addTempSkill('sangu_effect',{player:'phaseUseAfter'}); - target.markSkill('sangu_effect'); - var bool=true; - for(var i of names){ - if(!event.used.includes(i)){ - bool=false; + player + .chooseButton(dialog, true, [1, 3]) + .set("ai", function (button) { + let name = button.link[2], + list = _status.event.list, + player = _status.event.player, + target = _status.event.getParent().target, + trigger = _status.event.getTrigger(), + getv = (name, player) => { + let v = trigger.getTempCache("sangu", player.id + name); + if (typeof v === "number") return v; + v = player.getUseValue({ name: name, storage: { sangu: true } }); + trigger.putTempCache("sangu", player.id + name, v); + return v; + }; + if (get.attitude(player, target) < 0) { + if (!list.includes(name)) return 0; + return -getv(name, target); + } else { + if (player.hp < 2 && !list.includes(name)) return 0; + let val = getv(name, target), + base = 5; + val = Math.min(15, val - base); + if (name === "wuzhong" || name === "dongzhuxianji") val += 15; + else if (name === "shunshou") val += 6; + return val; + } + }) + .set("list", event.list1); + ("step 3"); + if (result.bool) { + var names = result.links.map((i) => i[2]); + if (!target.storage.sangu_effect) target.storage.sangu_effect = []; + target.storage.sangu_effect = target.storage.sangu_effect.concat(names); + game.log(player, "为", target, "选择了", "#y" + get.translation(names)); + target.addTempSkill("sangu_effect", { player: "phaseUseAfter" }); + target.markSkill("sangu_effect"); + var bool = true; + for (var i of names) { + if (!event.used.includes(i)) { + bool = false; break; } } - if(bool){ - target.addTempSkill('sangu_prevent',{player:'phaseUseAfter'}); - target.markAuto('sangu_prevent',[player]); + if (bool) { + target.addTempSkill("sangu_prevent", { player: "phaseUseAfter" }); + target.markAuto("sangu_prevent", [player]); } } }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'damage')&&card.storage&&card.storage.sangu) return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage") && card.storage && card.storage.sangu) + return "zeroplayertarget"; }, - } + }, }, - subSkill:{ - effect:{ - trigger:{player:'phaseUseBegin'}, - charlotte:true, - forced:true, - popup:false, - content:function(){ - player.addTempSkill('sangu_viewas'); + subSkill: { + effect: { + trigger: { player: "phaseUseBegin" }, + charlotte: true, + forced: true, + popup: false, + content: function () { + player.addTempSkill("sangu_viewas"); }, - onremove:true, - intro:{ - mark:function(dialog,storage,player){ - if(!storage||!storage.length) return '当前无可用牌'; - dialog.add([[storage[0]],'vcard']); - if(storage.length>1) dialog.addSmall([storage.slice(1),'vcard']) + onremove: true, + intro: { + mark: function (dialog, storage, player) { + if (!storage || !storage.length) return "当前无可用牌"; + dialog.add([[storage[0]], "vcard"]); + if (storage.length > 1) dialog.addSmall([storage.slice(1), "vcard"]); }, - content:'$', + content: "$", }, }, - viewas:{ - mod:{ - hiddenCard:function(player,name){ - var storage=player.getStorage('sangu_effect'); - if(storage.length) return name==storage[0]; + viewas: { + mod: { + hiddenCard: function (player, name) { + var storage = player.getStorage("sangu_effect"); + if (storage.length) return name == storage[0]; }, - cardname:function(card,player){ - if(_status.event.name!='chooseToUse'||_status.event.skill) return; - var storage=player.getStorage('sangu_effect'); - if(storage.length) return storage[0]; + cardname: function (card, player) { + if (_status.event.name != "chooseToUse" || _status.event.skill) return; + var storage = player.getStorage("sangu_effect"); + if (storage.length) return storage[0]; }, - cardnature:function(card,player){ - if(_status.event.name!='chooseToUse'||_status.event.skill) return; - var storage=player.getStorage('sangu_effect'); - if(storage.length) return false; + cardnature: function (card, player) { + if (_status.event.name != "chooseToUse" || _status.event.skill) return; + var storage = player.getStorage("sangu_effect"); + if (storage.length) return false; }, }, - trigger:{player:['useCard','respond']}, - forced:true, - charlotte:true, - filter:function(event,player){ - return event.cards.length>0&&player.getStorage('sangu_effect').length>0; + trigger: { player: ["useCard", "respond"] }, + forced: true, + charlotte: true, + filter: function (event, player) { + return event.cards.length > 0 && player.getStorage("sangu_effect").length > 0; }, - content:function(){ - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.sangu=true; - player.unmarkAuto('sangu_effect',[player.getStorage('sangu_effect')[0]]); + content: function () { + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.sangu = true; + player.unmarkAuto("sangu_effect", [player.getStorage("sangu_effect")[0]]); }, }, - prevent:{ - trigger:{source:'damageBegin2'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - return event.card&&event.card.storage&&event.card.storage.sangu&&player.getStorage('sangu_prevent').includes(event.player); + prevent: { + trigger: { source: "damageBegin2" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + return ( + event.card && + event.card.storage && + event.card.storage.sangu && + player.getStorage("sangu_prevent").includes(event.player) + ); }, - content:function(){ + content: function () { trigger.cancel(); - } - } + }, + }, }, }, - yizu:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - usable:1, - filter:function(event,player){ - return player.isDamaged()&&player.hp<=event.player.hp&&(event.card.name=='sha'||event.card.name=='juedou'); + yizu: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + usable: 1, + filter: function (event, player) { + return ( + player.isDamaged() && + player.hp <= event.player.hp && + (event.card.name == "sha" || event.card.name == "juedou") + ); }, - content:function(){ + content: function () { player.recover(); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(target.isHealthy()||(card.name!='sha'&&card.name!='juedou')) return; - if((target.storage.counttrigger&&target.storage.counttrigger.yizu)&¤t<0) return 5; - if(player.hp0) return 1.2; - if(get.attitude(player,target)>=0) return; - var copy=get.effect(target,{name:'shacopy'},player,player); - if(copy>0&&player.isPhaseUsing()&&Math.min(player.getCardUsable('sha'),player.countCards('hs',function(card){ - return get.name(card)=='sha'&&player.canUse(card,target,null,true); - }))>=2) return; - return [0,2]; + ai: { + effect: { + target: function (card, player, target, current) { + if (target.isHealthy() || (card.name != "sha" && card.name != "juedou")) return; + if ( + target.storage.counttrigger && + target.storage.counttrigger.yizu && + current < 0 + ) + return 5; + if (player.hp < target.hp) return; + if (current > 0) return 1.2; + if (get.attitude(player, target) >= 0) return; + var copy = get.effect(target, { name: "shacopy" }, player, player); + if ( + copy > 0 && + player.isPhaseUsing() && + Math.min( + player.getCardUsable("sha"), + player.countCards("hs", function (card) { + return ( + get.name(card) == "sha" && player.canUse(card, target, null, true) + ); + }) + ) >= 2 + ) + return; + return [0, 2]; }, }, }, }, //轲比能 - kousheng:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + kousheng: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' - player.chooseCard('h',[1,player.countCards('h')],get.prompt('kousheng'),'你可以选择任意张手牌,这些手牌于本回合内视为无次数限制的【杀】。但当有角色受到这些【杀】的伤害后,其可以用所有手牌交换剩余的牌。').set('standard',player.getUseValue({name:'sha'},null,true)).set('ai',function(card){ - var player=_status.event.player,standard=_status.event.standard; - if(standard<=0) return 0; - var eff=player.getUseValue(card,null,true); - if(eff<=standard) return standard-eff+0.1; - return 0; - }); - 'step 1' - if(result.bool){ - player.logSkill('kousheng'); - player.addGaintag(result.cards,'kousheng'); - player.addTempSkill('kousheng_effect'); + content: function () { + "step 0"; + player + .chooseCard( + "h", + [1, player.countCards("h")], + get.prompt("kousheng"), + "你可以选择任意张手牌,这些手牌于本回合内视为无次数限制的【杀】。但当有角色受到这些【杀】的伤害后,其可以用所有手牌交换剩余的牌。" + ) + .set("standard", player.getUseValue({ name: "sha" }, null, true)) + .set("ai", function (card) { + var player = _status.event.player, + standard = _status.event.standard; + if (standard <= 0) return 0; + var eff = player.getUseValue(card, null, true); + if (eff <= standard) return standard - eff + 0.1; + return 0; + }); + ("step 1"); + if (result.bool) { + player.logSkill("kousheng"); + player.addGaintag(result.cards, "kousheng"); + player.addTempSkill("kousheng_effect"); game.delayx(); } }, - subSkill:{ - effect:{ - audio:'kousheng', - trigger:{player:'useCard1'}, - forced:true, - charlotte:true, - firstDo:true, - filter:function(event,player){ - if(event.card.name!='sha') return false; - return player.hasHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('kousheng')) return true; + subSkill: { + effect: { + audio: "kousheng", + trigger: { player: "useCard1" }, + forced: true, + charlotte: true, + firstDo: true, + filter: function (event, player) { + if (event.card.name != "sha") return false; + return player.hasHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("kousheng")) return true; } return false; }); }, - content:function(){ - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.kousheng=true; - if(trigger.addCount!==false){ - trigger.addCount=false; - player.getStat('card').sha--; + content: function () { + if (!trigger.card.storage) trigger.card.storage = {}; + trigger.card.storage.kousheng = true; + if (trigger.addCount !== false) { + trigger.addCount = false; + player.getStat("card").sha--; } }, - onremove:function(player){ - player.removeGaintag('kousheng'); + onremove: function (player) { + player.removeGaintag("kousheng"); }, - mod:{ - cardUsable:function(card,player,target){ - if(card.name!='sha'||!card.cards) return; - for(var i of card.cards){ - if(i.hasGaintag('kousheng')) return Infinity; + mod: { + cardUsable: function (card, player, target) { + if (card.name != "sha" || !card.cards) return; + for (var i of card.cards) { + if (i.hasGaintag("kousheng")) return Infinity; } }, - cardname:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('kousheng')) return 'sha'; + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("kousheng")) return "sha"; }, - cardnature:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('kousheng')) return false; + cardnature: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("kousheng")) return false; }, }, - group:'kousheng_damage', + group: "kousheng_damage", }, - damage:{ - audio:'kousheng', - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage.kousheng||event.getParent().type!='card') return false; - var target=event.player; - return target.isIn()&&player.hasCard(function(card){ - return card.hasGaintag('kousheng'); - },'h'); + damage: { + audio: "kousheng", + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + if ( + !event.card || + !event.card.storage || + !event.card.storage.kousheng || + event.getParent().type != "card" + ) + return false; + var target = event.player; + return ( + target.isIn() && + player.hasCard(function (card) { + return card.hasGaintag("kousheng"); + }, "h") + ); }, - content:function(){ - 'step 0' - var target=trigger.player; - event.target=target; - var cards=player.getCards('h',function(card){ - return card.hasGaintag('kousheng'); - }); - event.cards=cards; - var str=get.translation(player); - player.showCards(cards,str+'的【寇旌】牌'); - if(target.countCards('h')>0) target.chooseBool('是否交换“寇旌”牌?','用你的所有手牌交换'+str+'的下列“寇旌”牌:'+get.translation(cards)).set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().player; - if(player.hasShan()||player.countCards('hs',{name:['tao','jiu']})>0||get.attitude(player,target)>=0) return false; - var hs1=player.getCards('h'),hs2=_status.event.getParent().cards; - if(hs2.length>=player.hp) return true; - if(get.value(hs1,player)>=get.value(hs2,target)) return false; - return true; + content: function () { + "step 0"; + var target = trigger.player; + event.target = target; + var cards = player.getCards("h", function (card) { + return card.hasGaintag("kousheng"); }); + event.cards = cards; + var str = get.translation(player); + player.showCards(cards, str + "的【寇旌】牌"); + if (target.countCards("h") > 0) + target + .chooseBool( + "是否交换“寇旌”牌?", + "用你的所有手牌交换" + + str + + "的下列“寇旌”牌:" + + get.translation(cards) + ) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().player; + if ( + player.hasShan() || + player.countCards("hs", { name: ["tao", "jiu"] }) > 0 || + get.attitude(player, target) >= 0 + ) + return false; + var hs1 = player.getCards("h"), + hs2 = _status.event.getParent().cards; + if (hs2.length >= player.hp) return true; + if (get.value(hs1, player) >= get.value(hs2, target)) return false; + return true; + }); else event.finish(); - 'step 1' - if(result.bool){ - player.swapHandcards(target,cards,target.getCards('h')); + ("step 1"); + if (result.bool) { + player.swapHandcards(target, cards, target.getCards("h")); } }, }, }, }, //陆凯 - lkbushi:{ - audio:2, - getBushi:function(player){ - if(!player.storage.lkbushi) return ['spade','heart','club','diamond']; + lkbushi: { + audio: 2, + getBushi: function (player) { + if (!player.storage.lkbushi) return ["spade", "heart", "club", "diamond"]; return player.storage.lkbushi; }, - onremove:true, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - locked:false, - content:function(){ - 'step 0' - var list=lib.skill.lkbushi.getBushi(player); - list=list.map(function(i){ - return ['','','lukai_'+i]; + onremove: true, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + locked: false, + content: function () { + "step 0"; + var list = lib.skill.lkbushi.getBushi(player); + list = list.map(function (i) { + return ["", "", "lukai_" + i]; }); - var next=player.chooseToMove('卜筮:是否调整〖卜筮〗的花色顺序?'); - next.set('list',[ - ['无次数限制/使用打出摸牌
    可弃牌无效/结束阶段获得',[list,'vcard'],function(list){ - var list2=list.map(function(i){ - return get.translation(i[2].slice(6)); - }); - return '你使用'+list2[0]+'牌时无次数限制;使用或打出'+list2[1]+'时,摸一张牌;
    成为'+list2[2]+'牌目标后可弃一张牌无效;结束阶段获得一张'+list2[3]+'牌'; - }], + var next = player.chooseToMove("卜筮:是否调整〖卜筮〗的花色顺序?"); + next.set("list", [ + [ + "无次数限制/使用打出摸牌
    可弃牌无效/结束阶段获得", + [list, "vcard"], + function (list) { + var list2 = list.map(function (i) { + return get.translation(i[2].slice(6)); + }); + return ( + "你使用" + + list2[0] + + "牌时无次数限制;使用或打出" + + list2[1] + + "时,摸一张牌;
    成为" + + list2[2] + + "牌目标后可弃一张牌无效;结束阶段获得一张" + + list2[3] + + "牌" + ); + }, + ], ]); - next.set('processAI',function(){ - var player=_status.event.player; - var list=lib.skill.lkbushi.getBushi(player); - var list2=[]; - var hs=player.getCards('hs',function(card){ + next.set("processAI", function () { + var player = _status.event.player; + var list = lib.skill.lkbushi.getBushi(player); + var list2 = []; + var hs = player.getCards("hs", function (card) { return player.hasValueTarget(card); }); - list.sort(function(a,b){ - return hs.filter((i)=>get.suit(i)==b).length-hs.filter((i)=>get.suit(i)==a).length; + list.sort(function (a, b) { + return ( + hs.filter((i) => get.suit(i) == b).length - + hs.filter((i) => get.suit(i) == a).length + ); }); list2.push(list.shift()); - hs=player.getCards('hs','sha'); - list.sort(function(a,b){ - return hs.filter((i)=>get.suit(i)==b).length-hs.filter((i)=>get.suit(i)==a).length; + hs = player.getCards("hs", "sha"); + list.sort(function (a, b) { + return ( + hs.filter((i) => get.suit(i) == b).length - + hs.filter((i) => get.suit(i) == a).length + ); }); list2.unshift(list.shift()); list.randomSort(); list2.addArray(list); - return [list2.map((i)=>['','','lukai_'+i])] + return [list2.map((i) => ["", "", "lukai_" + i])]; }); - 'step 1' - if(result.bool){ - var list=lib.skill.lkbushi.getBushi(player),list2=result.moved[0].map(function(i){ - return i[2].slice(6); - }); - for(var i=0;i<4;i++){ - if(list[i]!=list2[i]){ - player.logSkill('lkbushi'); - player.storage.lkbushi=list2; - var str='#g'; - for(var j=0;j<4;j++){ - str+=get.translation(list2[j]); - if(j!=3) str+='/'; + ("step 1"); + if (result.bool) { + var list = lib.skill.lkbushi.getBushi(player), + list2 = result.moved[0].map(function (i) { + return i[2].slice(6); + }); + for (var i = 0; i < 4; i++) { + if (list[i] != list2[i]) { + player.logSkill("lkbushi"); + player.storage.lkbushi = list2; + var str = "#g"; + for (var j = 0; j < 4; j++) { + str += get.translation(list2[j]); + if (j != 3) str += "/"; } - game.log(player,'将','#g【卜筮】','的花色序列改为',str); + game.log(player, "将", "#g【卜筮】", "的花色序列改为", str); game.delayx(); break; } } } }, - mark:true, - marktext:'筮', - intro:{ - content:function(storage,player){ - var list=lib.skill.lkbushi.getBushi(player).map((i)=>get.translation(i)); - return '①你使用'+list[0]+'牌无次数限制。②当你使用或打出'+list[1]+'牌后,你摸一张牌。③当你成为'+list[2]+'牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张'+list[3]+'牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。'; + mark: true, + marktext: "筮", + intro: { + content: function (storage, player) { + var list = lib.skill.lkbushi.getBushi(player).map((i) => get.translation(i)); + return ( + "①你使用" + + list[0] + + "牌无次数限制。②当你使用或打出" + + list[1] + + "牌后,你摸一张牌。③当你成为" + + list[2] + + "牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张" + + list[3] + + "牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。" + ); }, }, - group:['lkbushi_unlimit','lkbushi_draw','lkbushi_defend','lkbushi_gain'], - subSkill:{ - unlimit:{ - mod:{ - cardUsable:function(card,player){ - const list = lib.skill.lkbushi.getBushi(player), suit = get.suit(card); - if (suit === 'unsure' || list[0] === suit) return Infinity; + group: ["lkbushi_unlimit", "lkbushi_draw", "lkbushi_defend", "lkbushi_gain"], + subSkill: { + unlimit: { + mod: { + cardUsable: function (card, player) { + const list = lib.skill.lkbushi.getBushi(player), + suit = get.suit(card); + if (suit === "unsure" || list[0] === suit) return Infinity; }, }, - trigger:{player:'useCard1'}, - forced:true, - popup:false, - silent:true, - firstDo:true, - filter:function(event,player){ - if(event.addCount===false) return true; - var list=lib.skill.lkbushi.getBushi(player); - return (list[0]==get.suit(event.card)); + trigger: { player: "useCard1" }, + forced: true, + popup: false, + silent: true, + firstDo: true, + filter: function (event, player) { + if (event.addCount === false) return true; + var list = lib.skill.lkbushi.getBushi(player); + return list[0] == get.suit(event.card); }, - content:function(){ - trigger.addCount=false; - var stat=player.getStat().card,name=trigger.card.name; - if(stat[name]&&typeof stat[name]=='number') stat[name]--; + content: function () { + trigger.addCount = false; + var stat = player.getStat().card, + name = trigger.card.name; + if (stat[name] && typeof stat[name] == "number") stat[name]--; }, }, - draw:{ - audio:'lkbushi', - trigger:{player:['useCard','respond']}, - forced:true, - locked:false, - filter:function(event,player){ - var list=lib.skill.lkbushi.getBushi(player); - return list[1]==get.suit(event.card); + draw: { + audio: "lkbushi", + trigger: { player: ["useCard", "respond"] }, + forced: true, + locked: false, + filter: function (event, player) { + var list = lib.skill.lkbushi.getBushi(player); + return list[1] == get.suit(event.card); }, - content:function(){ + content: function () { player.draw(); }, }, - defend:{ - audio:'lkbushi', - trigger:{target:'useCardToTargeted'}, - direct:true, - filter:function(event,player){ - var list=lib.skill.lkbushi.getBushi(player); - return list[2]==get.suit(event.card)&&!event.excluded.includes(player)&&player.countCards('he')>0; + defend: { + audio: "lkbushi", + trigger: { target: "useCardToTargeted" }, + direct: true, + filter: function (event, player) { + var list = lib.skill.lkbushi.getBushi(player); + return ( + list[2] == get.suit(event.card) && + !event.excluded.includes(player) && + player.countCards("he") > 0 + ); }, - content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('lkbushi'),'弃置一张牌,令'+get.translation(trigger.card)+'对你无效').set('ai',function(card){ - if(_status.event.eff>=0) return false; - return -_status.event.eff*1.1-get.value(card); - }).set('eff',get.effect(player,trigger.card,trigger.player,player)).logSkill=['lkbushi_defend',trigger.player]; - 'step 1' - if(result.bool){ + content: function () { + "step 0"; + player + .chooseToDiscard( + "he", + get.prompt("lkbushi"), + "弃置一张牌,令" + get.translation(trigger.card) + "对你无效" + ) + .set("ai", function (card) { + if (_status.event.eff >= 0) return false; + return -_status.event.eff * 1.1 - get.value(card); + }) + .set( + "eff", + get.effect(player, trigger.card, trigger.player, player) + ).logSkill = ["lkbushi_defend", trigger.player]; + ("step 1"); + if (result.bool) { trigger.excluded.add(player); } }, }, - gain:{ - audio:'lkbushi', - trigger:{player:'phaseJieshuBegin'}, - forced:true, - locked:false, - content:function(){ - var list=lib.skill.lkbushi.getBushi(player); - var card=get.cardPile(function(card){ - return get.suit(card,false)==list[3]; + gain: { + audio: "lkbushi", + trigger: { player: "phaseJieshuBegin" }, + forced: true, + locked: false, + content: function () { + var list = lib.skill.lkbushi.getBushi(player); + var card = get.cardPile(function (card) { + return get.suit(card, false) == list[3]; }); - if(card) player.gain(card,'gain2'); + if (card) player.gain(card, "gain2"); }, }, }, }, - lkzhongzhuang:{ - audio:2, - trigger:{source:['damageBegin1','damageBegin4']}, - forced:true, - filter:function(event,player,name){ - if(!event.card||event.card.name!='sha'||event.getParent().type!='card') return false; - var range=player.getAttackRange(); - if(name=='damageBegin1') return range>3; - return range<3&&event.num>1; + lkzhongzhuang: { + audio: 2, + trigger: { source: ["damageBegin1", "damageBegin4"] }, + forced: true, + filter: function (event, player, name) { + if (!event.card || event.card.name != "sha" || event.getParent().type != "card") + return false; + var range = player.getAttackRange(); + if (name == "damageBegin1") return range > 3; + return range < 3 && event.num > 1; }, - content:function(){ - if(event.triggername=='damageBegin1') trigger.num++; - else trigger.num=1; + content: function () { + if (event.triggername == "damageBegin1") trigger.num++; + else trigger.num = 1; }, - global:'lkzhongzhuang_ai', - subSkill:{ - ai:{ - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.card&&arg.card.name=='sha'){ - if(arg.player&&arg.player.hasSkill('lkzhongzhuang')&&arg.player.getAttackRange()<3) return true; + global: "lkzhongzhuang_ai", + subSkill: { + ai: { + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.card && arg.card.name == "sha") { + if ( + arg.player && + arg.player.hasSkill("lkzhongzhuang") && + arg.player.getAttackRange() < 3 + ) + return true; } return false; }, @@ -1609,731 +2118,932 @@ game.import('character', function () { }, }, //顾雍 - olbingyi:{ - audio:'bingyi', - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + olbingyi: { + audio: "bingyi", + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - return event.type=='discard'&&event.getl(player).cards2.length>0&&player.countCards('h')>0&&!player.hasSkill('olbingyi_blocker',null,null,false); + filter: function (event, player) { + return ( + event.type == "discard" && + event.getl(player).cards2.length > 0 && + player.countCards("h") > 0 && + !player.hasSkill("olbingyi_blocker", null, null, false) + ); }, - prompt2:function(event,player){ - var str='展示所有手牌,然后',hs=player.getCards('h'); - var color=get.color(hs); - if(color=='none') return str+'无事发生'; - str+=('令至多'+get.cnNumber(hs.length)+'名其他角色和自己各摸一张牌'); + prompt2: function (event, player) { + var str = "展示所有手牌,然后", + hs = player.getCards("h"); + var color = get.color(hs); + if (color == "none") return str + "无事发生"; + str += "令至多" + get.cnNumber(hs.length) + "名其他角色和自己各摸一张牌"; return str; }, - check:function(event,player){ - var color=get.color(player.getCards('h')); - return color!='none'; + check: function (event, player) { + var color = get.color(player.getCards("h")); + return color != "none"; }, - content:function(){ - 'step 0' - player.addTempSkill('olbingyi_blocker',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); - player.showHandcards(get.translation(player)+'发动了【秉壹】'); - if(get.color(player.getCards('h'))=='none') event.finish(); - 'step 1' - var num=player.countCards('h'); - player.chooseTarget([1,num],'令至多'+get.cnNumber(num)+'名角色也各摸一张牌',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - var att=get.attitude(player,target)/Math.sqrt(1+target.countCards('h')); - if(target.hasSkillTag('nogain')) att/=10; - return att; - }); - 'step 2' - var targets=[player]; - if(result.bool){ + content: function () { + "step 0"; + player.addTempSkill("olbingyi_blocker", [ + "phaseZhunbeiAfter", + "phaseJudgeAfter", + "phaseDrawAfter", + "phaseUseAfter", + "phaseDiscardAfter", + "phaseJieshuAfter", + ]); + player.showHandcards(get.translation(player) + "发动了【秉壹】"); + if (get.color(player.getCards("h")) == "none") event.finish(); + ("step 1"); + var num = player.countCards("h"); + player + .chooseTarget( + [1, num], + "令至多" + get.cnNumber(num) + "名角色也各摸一张牌", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + var att = get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }); + ("step 2"); + var targets = [player]; + if (result.bool) { targets.addArray(result.targets); - player.line(targets,'green'); + player.line(targets, "green"); game.asyncDraw(targets.sortBySeat()); - } - else{ + } else { player.draw(); event.finish(); } - 'step 3' + ("step 3"); game.delayx(); }, - subSkill:{blocker:{charlotte:true}}, + subSkill: { blocker: { charlotte: true } }, }, //孙体 - xinzhaofu:{ - audio:'zhaofu', - enable:'phaseUse', - usable:1, - mark:true, - limited:true, - skillAnimation:true, - animationColor:'wood', - selectTarget:[1,2], - filterTarget:lib.filter.notMe, - zhuSkill:true, - contentBefore:function(){ - player.awakenSkill('xinzhaofu'); + xinzhaofu: { + audio: "zhaofu", + enable: "phaseUse", + usable: 1, + mark: true, + limited: true, + skillAnimation: true, + animationColor: "wood", + selectTarget: [1, 2], + filterTarget: lib.filter.notMe, + zhuSkill: true, + contentBefore: function () { + player.awakenSkill("xinzhaofu"); }, - content:function(){ - target.addSkill('xinzhaofu_effect'); - target.markAuto('xinzhaofu_effect',[player]); + content: function () { + target.addSkill("xinzhaofu_effect"); + target.markAuto("xinzhaofu_effect", [player]); }, - ai:{ - order:9, - result:{ - target:function(player,target){ - var targets=game.filterPlayer(function(current){ - return current.group=='wu'&&get.attitude(player,current)>0; + ai: { + order: 9, + result: { + target: function (player, target) { + var targets = game.filterPlayer(function (current) { + return current.group == "wu" && get.attitude(player, current) > 0; }); - if(targets.length){ - for(var targetx of targets){ - if(!targetx.inRange(target)) return -1; + if (targets.length) { + for (var targetx of targets) { + if (!targetx.inRange(target)) return -1; } return -0.5; } return 0; - } - } + }, + }, }, - subSkill:{ - effect:{ - charlotte:true, - mark:true, - intro:{content:'已视为在其他吴势力角色的攻击范围内'}, - mod:{ - inRangeOf:function(from,to){ - if(from.group!='wu') return; - var list=to.getStorage('xinzhaofu_effect'); - for(var i of list){ - if(i!=from) return true; + subSkill: { + effect: { + charlotte: true, + mark: true, + intro: { content: "已视为在其他吴势力角色的攻击范围内" }, + mod: { + inRangeOf: function (from, to) { + if (from.group != "wu") return; + var list = to.getStorage("xinzhaofu_effect"); + for (var i of list) { + if (i != from) return true; } }, }, }, }, }, - xinkuangbi:{ - audio:'kuangbi', - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; + xinkuangbi: { + audio: "kuangbi", + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; }, - content:function(){ - 'step 0' - target.chooseCard('he',[1,3],'匡弼:交给'+get.translation(player)+'一至三张牌',true).set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.getParent().player)>0){ - return 7-get.value(card); - } - return -get.value(card); - }); - 'step 1' - if(result.bool){ - target.give(result.cards,player,'giveAuto').gaintag.add('xinkuangbi_keep'); - player.addTempSkill('xinkuangbi_keep'); - target.addSkill('xinkuangbi_draw'); - target.addMark('xinkuangbi_draw',result.cards.length,false); + content: function () { + "step 0"; + target + .chooseCard("he", [1, 3], "匡弼:交给" + get.translation(player) + "一至三张牌", true) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + return 7 - get.value(card); + } + return -get.value(card); + }); + ("step 1"); + if (result.bool) { + target.give(result.cards, player, "giveAuto").gaintag.add("xinkuangbi_keep"); + player.addTempSkill("xinkuangbi_keep"); + target.addSkill("xinkuangbi_draw"); + target.addMark("xinkuangbi_draw", result.cards.length, false); } }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(get.attitude(player,target)>0){ - return Math.sqrt(target.countCards('he')); + ai: { + order: 1, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0) { + return Math.sqrt(target.countCards("he")); } return 0; }, - player:1 - } + player: 1, + }, }, - subSkill:{ - keep:{ - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('xinkuangbi_keep')) return true; + subSkill: { + keep: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("xinkuangbi_keep")) return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('xinkuangbi_keep')) return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("xinkuangbi_keep")) + return false; }, }, - charlotte:true, - onremove:function(player){ - player.removeGaintag('xinkuangbi_keep'); + charlotte: true, + onremove: function (player) { + player.removeGaintag("xinkuangbi_keep"); }, }, - draw:{ - trigger:{player:'phaseBegin'}, - forced:true, - charlotte:true, - onremove:true, - intro:{ - content:'下回合开始时摸#张牌', + draw: { + trigger: { player: "phaseBegin" }, + forced: true, + charlotte: true, + onremove: true, + intro: { + content: "下回合开始时摸#张牌", }, - content:function(){ - player.draw(player.countMark('xinkuangbi_draw')); - player.removeSkill('xinkuangbi_draw'); + content: function () { + player.draw(player.countMark("xinkuangbi_draw")); + player.removeSkill("xinkuangbi_draw"); }, - } - } - }, - rejingce:{ - audio:'jingce', - trigger:{player:'phaseUseEnd'}, - frequent:true, - filter:function(event,player){ - return player.getHistory('useCard',function(evt){ - return evt.getParent('phaseUse')==event; - }).length>0; + }, }, - content:function(){ - var list=[]; - player.getHistory('useCard',function(evt){ - if(evt.getParent('phaseUse')==trigger) list.add(get.type2(evt.card)); + }, + rejingce: { + audio: "jingce", + trigger: { player: "phaseUseEnd" }, + frequent: true, + filter: function (event, player) { + return ( + player.getHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }).length > 0 + ); + }, + content: function () { + var list = []; + player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") == trigger) list.add(get.type2(evt.card)); }); player.draw(list.length); }, - group:'rejingce_add', + group: "rejingce_add", }, - rejingce_add:{ - trigger:{player:'loseEnd'}, - silent:true, - firstDo:true, - filter:function(event,player){ - if(event.getParent().name!='useCard'||player!=_status.currentPhase) return false; - var list=player.getStorage('rejingce2'); - for(var i of event.cards){ - if(!list.includes(get.suit(i,player))) return true; + rejingce_add: { + trigger: { player: "loseEnd" }, + silent: true, + firstDo: true, + filter: function (event, player) { + if (event.getParent().name != "useCard" || player != _status.currentPhase) return false; + var list = player.getStorage("rejingce2"); + for (var i of event.cards) { + if (!list.includes(get.suit(i, player))) return true; } return false; }, - content:function(){ - if(!player.storage.rejingce2) player.storage.rejingce2=[]; - for(var i of trigger.cards) player.storage.rejingce2.add(get.suit(i,player)); + content: function () { + if (!player.storage.rejingce2) player.storage.rejingce2 = []; + for (var i of trigger.cards) player.storage.rejingce2.add(get.suit(i, player)); player.storage.rejingce2.sort(); - player.addTempSkill('rejingce2'); - player.markSkill('rejingce2'); + player.addTempSkill("rejingce2"); + player.markSkill("rejingce2"); }, }, - rejingce2:{ - onremove:true, - intro:{ - content:'当前已使用花色:$', + rejingce2: { + onremove: true, + intro: { + content: "当前已使用花色:$", }, - mod:{ - maxHandcard:function(player,num){ - return num+player.getStorage('rejingce2').length; + mod: { + maxHandcard: function (player, num) { + return num + player.getStorage("rejingce2").length; }, }, }, - rejueqing:{ - audio:2, - trigger:{source:'damageBegin2'}, - skillAnimation:true, - animationColor:'water', - filter:function(event,player){ - return player!=event.player&&!player.storage.rejueqing_rewrite; + rejueqing: { + audio: 2, + trigger: { source: "damageBegin2" }, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + return player != event.player && !player.storage.rejueqing_rewrite; }, - prompt2:function(event,player){ - var num=get.cnNumber(2*event.num,true); - return '令即将对其造成的伤害翻倍至'+num+'点,并令自己失去'+get.cnNumber(event.num)+'点体力'; + prompt2: function (event, player) { + var num = get.cnNumber(2 * event.num, true); + return ( + "令即将对其造成的伤害翻倍至" + + num + + "点,并令自己失去" + + get.cnNumber(event.num) + + "点体力" + ); }, - check:function(event,player){ - return player.hp>event.num&&event.player.hp>event.num&&!event.player.hasSkillTag('filterDamage',null,{ - player:player, - card:event.card, - })&&get.attitude(player,event.player)<0; + check: function (event, player) { + return ( + player.hp > event.num && + event.player.hp > event.num && + !event.player.hasSkillTag("filterDamage", null, { + player: player, + card: event.card, + }) && + get.attitude(player, event.player) < 0 + ); }, - locked:function(skill,player){ - return player&&player.storage.rejueqing_rewrite; + locked: function (skill, player) { + return player && player.storage.rejueqing_rewrite; }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { player.loseHp(trigger.num); - trigger.num*=2; - player.storage.rejueqing_rewrite=true; + trigger.num *= 2; + player.storage.rejueqing_rewrite = true; }, - derivation:'rejueqing_rewrite', - group:'rejueqing_rewrite', - subSkill:{ - rewrite:{ - trigger:{source:'damageBefore'}, - forced:true, - charlotte:true, - audio:'rejueqing', - filter:function(event,player){ - return player.storage.rejueqing_rewrite==true; + derivation: "rejueqing_rewrite", + group: "rejueqing_rewrite", + subSkill: { + rewrite: { + trigger: { source: "damageBefore" }, + forced: true, + charlotte: true, + audio: "rejueqing", + filter: function (event, player) { + return player.storage.rejueqing_rewrite == true; }, - check:function(){return false;}, - content:function(){ + check: function () { + return false; + }, + content: function () { trigger.cancel(); trigger.player.loseHp(trigger.num); }, - ai:{ - jueqing:true, - skillTagFilter:function(player){ - return player.storage.rejueqing_rewrite==true; + ai: { + jueqing: true, + skillTagFilter: function (player) { + return player.storage.rejueqing_rewrite == true; }, - } - } - }, - }, - reshangshi:{ - audio:2, - trigger:{ - player:['loseAfter','changeHp','gainMaxHpAfter','loseMaxHpAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], - }, - frequent:true, - prompt:function(event,player){ - return '是否发动【伤逝】将手牌摸至'+get.cnNumber(player.getDamagedHp())+'张?' - }, - prompt2:false, - filter:function(event,player){ - if(event.getl&&!event.getl(player)) return false; - return player.countCards('h')0; - }, - content:function(){ - player.chooseToDiscard('是否发动【伤逝】弃置一张牌?','he').set('logSkill','reshangshi').set('ai',function(card){ - var player=_status.event.player; - if(player.countCards('h')>player.getDamagedHp()+_status.event.getTrigger().num) return 1; - if(player.isPhaseUsing()) return 0.1-player.getUseValue(card,null,true)/Math.max(0.1,get.value(card)); - return (get.position(card)=='h'?5:0.1)-get.value(card); - }); - }, - }, - oldzhenlie:{ - audio:2, - trigger:{player:'judge'}, - check:function(event,player){ - return event.judge(player.judging[0])<0; - }, - content:function(){ - "step 0" - var card=get.cards()[0]; - event.card=card; - game.cardsGotoOrdering(card).relatedEvent=trigger; - "step 1" - player.$throw(card); - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); - } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); - } - game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=card; - game.log(trigger.player,'的判定牌改为',card); - game.delay(2); - }, - }, - oldmiji:{ - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - audio:2, - filter:function(event,player){ - return player.isDamaged(); - }, - content:function(){ - 'step 0' - player.judge(function(card){ - return get.color(card)=='black'?1:-1; - }).judge2=function(result){ - return result.bool; - }; - 'step 1' - if(result.bool&&player.maxHp>player.hp){ - var cards=get.cards(player.maxHp-player.hp); - event.cards=cards; - player.chooseTarget(true).set('ai',function(target){ - return get.attitude(player,target)/Math.sqrt(1+target.countCards('h')); - }).set('createDialog',['请选择一名角色获得这些牌',event.cards]); - } - else{ - event.finish(); - } - 'step 2' - player.line(result.targets); - result.targets[0].gain(event.cards,'draw'); - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'recover')&&target.hp==target.maxHp-1) return [0,0]; - if(target.hasFriend()){ - if((get.tag(card,'damage')==1||get.tag(card,'loseHp'))&&target.hp==target.maxHp) return [0,1]; - } - } - }, - threaten:function(player,target){ - if(target.hp==1) return 3; - if(target.hp==2) return 2; - return 1; - }, - } - }, - oldqianxi:{ - audio:2, - trigger:{source:'damageBegin2'}, - check:function(event,player){ - var att=get.attitude(player,event.player); - if(event.player.hp==event.player.maxHp) return att<0; - if(event.player.hp==event.player.maxHp-1&& - (event.player.maxHp<=3||event.player.hasSkillTag('maixie'))) return att<0; - return att>0; - }, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&get.distance(player,event.player)<=1; - }, - logTarget:'player', - content:function(){ - 'step 0' - player.judge(function(card){ - return get.suit(card)!='heart'?1:-1; - }).judge2=function(result){ - return result.bool; - }; - 'step 1' - if(result.bool){ - trigger.cancel(); - trigger.player.loseMaxHp(true); - } - } - }, - old_fuhun:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ - return !event.numFixed; - }, - content:function(){ - 'step 0' - trigger.changeToZero(); - 'step 1' - var cards=get.cards(2); - event.cards=cards; - player.showCards(cards,get.translation(player)+'发动了【父魂】'); - 'step 2' - player.gain(cards,'gain2'); - if(get.color(cards[0])!=get.color(cards[1])){ - player.addTempSkills(['wusheng','paoxiao']); - } - }, - derivation:['wusheng','paoxiao'], - }, - shiyong:{ - audio:2, - trigger:{player:'damageEnd'}, - forced:true, - check:function(){ - return false; - }, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&(get.color(event.card)=='red'||event.getParent(2).jiu==true); - }, - content:function(){ - player.loseMaxHp(); - } - }, - xindanshou:{ - audio:2, - trigger:{ - global:'phaseJieshuBegin', - target:'useCardToTargeted', - }, - direct:true, - filter:function(event,player,name){ - return ((name=='phaseJieshuBegin'&&event.player!=player&&player.countCards('he')>=event.player.countCards('h'))|| - (event.targets&&event.targets.includes(player)&&['basic','trick'].includes(get.type(event.card,'trick')))) - &&!player.hasSkill('xindanshou_as'); - }, - content:function(){ - 'step 0' - if(event.triggername=='phaseJieshuBegin'){ - var num=trigger.player.countCards('h'); - if(num>0) player.chooseToDiscard(get.prompt('xindanshou',trigger.player),num,'弃置'+get.cnNumber(num)+'张牌并对'+get.translation(trigger.player)+'造成1点伤害','he').set('logSkill',['xindanshou',trigger.player]).set('ai',function(card){ - if(get.damageEffect(_status.event.getTrigger().player,_status.event.player,_status.event.player)>0) return Math.max(5.5,8-_status.event.selectTarget)-get.value(card); - return -1; - }); - else player.chooseBool(get.prompt('xindanshou',trigger.player),'对'+get.translation(trigger.player)+'造成1点伤害').ai=function(){ - return get.damageEffect(trigger.player,player,player)>0 - }; - } - else{ - var num=0; - game.countPlayer2(function(current){ - var history=current.getHistory('useCard'); - for(var j=0;j0&&player.getUseValue(card,null,true)>0; - })) return false; - return true; - } - if(num>2) return true; - var card=trigger.card; - if(get.tag(card,'damage')&&player.hp<=trigger.getParent().baseDamage&&(!get.tag(card,'respondShan')||!player.hasShan())&&(!get.tag(card,'respondSha')||!player.hasSha())) return true; - var source=_status.currentPhase,todis=source.countCards('h')-source.needsToDiscard(); - if(todis<=Math.max(Math.min(2+(source.hp<=1?1:0),player.countCards('he',function(card){ - return get.value(card,player)0) return false; - if(!source.isPhaseUsing()||get.attitude(player,source)>0) return true; - if(card.name=='sha'&&!source.getCardUsable('sha')) return true; - return Math.random()0) return [1.1,num]; - return [0.9,num]; }, }, }, }, - xinbenxi:{ - group:['xinbenxi_summer','xinbenxi_damage'], - audio:2, - trigger:{ - player:'useCard2', + reshangshi: { + audio: 2, + trigger: { + player: ["loseAfter", "changeHp", "gainMaxHpAfter", "loseMaxHpAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - mod:{ - globalFrom:function(from,to,distance){ - if(_status.currentPhase==from){ - return distance-from.storage.xinbenxi; - } - }, - wuxieRespondable:function(card,player,target,current){ - if(player!=current&&player.storage.xinbenxi_directHit.includes(card)){ + frequent: true, + prompt: function (event, player) { + return "是否发动【伤逝】将手牌摸至" + get.cnNumber(player.getDamagedHp()) + "张?"; + }, + prompt2: false, + filter: function (event, player) { + if (event.getl && !event.getl(player)) return false; + return player.countCards("h") < player.getDamagedHp(); + }, + content: function () { + player.draw(player.getDamagedHp() - player.countCards("h")); + }, + ai: { + noh: true, + skillTagFilter: function (player, tag) { + if (tag == "noh" && player.maxHp - player.hp < player.countCards("h")) { return false; } }, }, - init:function(player){ - player.storage.xinbenxi_directHit=[]; - player.storage.xinbenxi_damage=[]; - player.storage.xinbenxi_unequip=[]; - player.storage.xinbenxi=0; + group: "reshangshi_2nd", + }, + reshangshi_2nd: { + trigger: { player: "damageBegin3" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; }, - filter:function(trigger,player){ - return _status.currentPhase==player&&trigger.targets&&trigger.targets.length==1&&(get.name(trigger.card)=='sha'||get.type(trigger.card)=='trick')&&!game.hasPlayer(function(current){ - return get.distance(player,current)>1; - }); + content: function () { + player + .chooseToDiscard("是否发动【伤逝】弃置一张牌?", "he") + .set("logSkill", "reshangshi") + .set("ai", function (card) { + var player = _status.event.player; + if ( + player.countCards("h") > + player.getDamagedHp() + _status.event.getTrigger().num + ) + return 1; + if (player.isPhaseUsing()) + return ( + 0.1 - + player.getUseValue(card, null, true) / Math.max(0.1, get.value(card)) + ); + return (get.position(card) == "h" ? 5 : 0.1) - get.value(card); + }); }, - filterx:function(event,player){ - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return lib.filter.targetEnabled2(event.card,player,current)&&!event.targets.includes(current); - })){ + }, + oldzhenlie: { + audio: 2, + trigger: { player: "judge" }, + check: function (event, player) { + return event.judge(player.judging[0]) < 0; + }, + content: function () { + "step 0"; + var card = get.cards()[0]; + event.card = card; + game.cardsGotoOrdering(card).relatedEvent = trigger; + ("step 1"); + player.$throw(card); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = card; + game.log(trigger.player, "的判定牌改为", card); + game.delay(2); + }, + }, + oldmiji: { + trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] }, + audio: 2, + filter: function (event, player) { + return player.isDamaged(); + }, + content: function () { + "step 0"; + player.judge(function (card) { + return get.color(card) == "black" ? 1 : -1; + }).judge2 = function (result) { + return result.bool; + }; + ("step 1"); + if (result.bool && player.maxHp > player.hp) { + var cards = get.cards(player.maxHp - player.hp); + event.cards = cards; + player + .chooseTarget(true) + .set("ai", function (target) { + return get.attitude(player, target) / Math.sqrt(1 + target.countCards("h")); + }) + .set("createDialog", ["请选择一名角色获得这些牌", event.cards]); + } else { + event.finish(); + } + ("step 2"); + player.line(result.targets); + result.targets[0].gain(event.cards, "draw"); + }, + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "recover") && target.hp == target.maxHp - 1) return [0, 0]; + if (target.hasFriend()) { + if ( + (get.tag(card, "damage") == 1 || get.tag(card, "loseHp")) && + target.hp == target.maxHp + ) + return [0, 1]; + } + }, + }, + threaten: function (player, target) { + if (target.hp == 1) return 3; + if (target.hp == 2) return 2; + return 1; + }, + }, + }, + oldqianxi: { + audio: 2, + trigger: { source: "damageBegin2" }, + check: function (event, player) { + var att = get.attitude(player, event.player); + if (event.player.hp == event.player.maxHp) return att < 0; + if ( + event.player.hp == event.player.maxHp - 1 && + (event.player.maxHp <= 3 || event.player.hasSkillTag("maixie")) + ) + return att < 0; + return att > 0; + }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && get.distance(player, event.player) <= 1; + }, + logTarget: "player", + content: function () { + "step 0"; + player.judge(function (card) { + return get.suit(card) != "heart" ? 1 : -1; + }).judge2 = function (result) { + return result.bool; + }; + ("step 1"); + if (result.bool) { + trigger.cancel(); + trigger.player.loseMaxHp(true); + } + }, + }, + old_fuhun: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return !event.numFixed; + }, + content: function () { + "step 0"; + trigger.changeToZero(); + ("step 1"); + var cards = get.cards(2); + event.cards = cards; + player.showCards(cards, get.translation(player) + "发动了【父魂】"); + ("step 2"); + player.gain(cards, "gain2"); + if (get.color(cards[0]) != get.color(cards[1])) { + player.addTempSkills(["wusheng", "paoxiao"]); + } + }, + derivation: ["wusheng", "paoxiao"], + }, + shiyong: { + audio: 2, + trigger: { player: "damageEnd" }, + forced: true, + check: function () { + return false; + }, + filter: function (event, player) { + return ( + event.card && + event.card.name == "sha" && + (get.color(event.card) == "red" || event.getParent(2).jiu == true) + ); + }, + content: function () { + player.loseMaxHp(); + }, + }, + xindanshou: { + audio: 2, + trigger: { + global: "phaseJieshuBegin", + target: "useCardToTargeted", + }, + direct: true, + filter: function (event, player, name) { + return ( + ((name == "phaseJieshuBegin" && + event.player != player && + player.countCards("he") >= event.player.countCards("h")) || + (event.targets && + event.targets.includes(player) && + ["basic", "trick"].includes(get.type(event.card, "trick")))) && + !player.hasSkill("xindanshou_as") + ); + }, + content: function () { + "step 0"; + if (event.triggername == "phaseJieshuBegin") { + var num = trigger.player.countCards("h"); + if (num > 0) + player + .chooseToDiscard( + get.prompt("xindanshou", trigger.player), + num, + "弃置" + + get.cnNumber(num) + + "张牌并对" + + get.translation(trigger.player) + + "造成1点伤害", + "he" + ) + .set("logSkill", ["xindanshou", trigger.player]) + .set("ai", function (card) { + if ( + get.damageEffect( + _status.event.getTrigger().player, + _status.event.player, + _status.event.player + ) > 0 + ) + return ( + Math.max(5.5, 8 - _status.event.selectTarget) - get.value(card) + ); + return -1; + }); + else + player.chooseBool( + get.prompt("xindanshou", trigger.player), + "对" + get.translation(trigger.player) + "造成1点伤害" + ).ai = function () { + return get.damageEffect(trigger.player, player, player) > 0; + }; + } else { + var num = 0; + game.countPlayer2(function (current) { + var history = current.getHistory("useCard"); + for (var j = 0; j < history.length; j++) { + if ( + ["basic", "trick"].includes(get.type(history[j].card, "trick")) && + history[j].targets && + history[j].targets.includes(player) + ) + num++; + } + }); + event.num = num; + player + .chooseBool( + get.prompt("xindanshou") + "(可摸" + get.cnNumber(num) + "张牌)", + get.translation("xindanshou_info") + ) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (player.isPhaseUsing()) { + if ( + player.countCards("h", function (card) { + return ( + ["basic", "trick"].includes(get.type(card, "trick")) && + player.canUse(card, player, null, true) && + get.effect(player, card, player) > 0 && + player.getUseValue(card, null, true) > 0 + ); + }) + ) + return false; + return true; + } + if (num > 2) return true; + var card = trigger.card; + if ( + get.tag(card, "damage") && + player.hp <= trigger.getParent().baseDamage && + (!get.tag(card, "respondShan") || !player.hasShan()) && + (!get.tag(card, "respondSha") || !player.hasSha()) + ) + return true; + var source = _status.currentPhase, + todis = source.countCards("h") - source.needsToDiscard(); + if ( + todis <= + Math.max( + Math.min( + 2 + (source.hp <= 1 ? 1 : 0), + player.countCards("he", function (card) { + return ( + get.value(card, player) < Math.max(5.5, 8 - todis) + ); + }) + ), + player.countCards("he", function (card) { + return get.value(card, player) <= 0; + }) + ) && + get.damageEffect(source, player, player) > 0 + ) + return false; + if (!source.isPhaseUsing() || get.attitude(player, source) > 0) + return true; + if (card.name == "sha" && !source.getCardUsable("sha")) return true; + return Math.random() < num / 3; + })() + ); + } + ("step 1"); + if (result.bool) { + if (!result.cards || !result.cards.length) { + player.logSkill("xindanshou", trigger.player); + } + if (event.triggername == "useCardToTargeted") { + player.draw(num); + player.addTempSkill("xindanshou_as"); + } else { + trigger.player.damage("nocard"); + } + } + }, + subSkill: { as: { sub: true } }, + ai: { + threaten: 0.6, + effect: { + target: function (card, player, target, current) { + if ( + typeof card != "object" || + target.hasSkill("xindanshou_as") || + !["basic", "trick"].includes(get.type(card, "trick")) + ) + return; + var num = 0; + game.countPlayer2(function (current) { + var history = current.getHistory("useCard"); + for (var j = 0; j < history.length; j++) { + if ( + ["basic", "trick"].includes(get.type(history[j].card, "trick")) && + history[j].targets && + history[j].targets.includes(player) + ) + num++; + } + }); + if (player == target && current > 0) return [1.1, num]; + return [0.9, num]; + }, + }, + }, + }, + xinbenxi: { + group: ["xinbenxi_summer", "xinbenxi_damage"], + audio: 2, + trigger: { + player: "useCard2", + }, + forced: true, + mod: { + globalFrom: function (from, to, distance) { + if (_status.currentPhase == from) { + return distance - from.storage.xinbenxi; + } + }, + wuxieRespondable: function (card, player, target, current) { + if (player != current && player.storage.xinbenxi_directHit.includes(card)) { + return false; + } + }, + }, + init: function (player) { + player.storage.xinbenxi_directHit = []; + player.storage.xinbenxi_damage = []; + player.storage.xinbenxi_unequip = []; + player.storage.xinbenxi = 0; + }, + filter: function (trigger, player) { + return ( + _status.currentPhase == player && + trigger.targets && + trigger.targets.length == 1 && + (get.name(trigger.card) == "sha" || get.type(trigger.card) == "trick") && + !game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ); + }, + filterx: function (event, player) { + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + lib.filter.targetEnabled2(event.card, player, current) && + !event.targets.includes(current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - "step 0" - var list=[ - '为XXX多选择一个目标', - ' 令XXX无视防具牌 ', - ' 令XXX不可被抵消 ', - '当XXX造成伤害时摸牌', - ],card=get.translation(trigger.card); - for(var i=0;i0; - })) return 1.6+Math.random(); + next.set("bool1", lib.skill.xinbenxi.filterx(trigger, player)); + next.set("ai", function (button) { + var player = _status.event.player; + var event = _status.event.getTrigger(); + switch (button.link) { + case 0: { + if ( + game.hasPlayer(function (current) { + return ( + lib.filter.targetEnabled2(event.card, player, current) && + !event.targets.includes(current) && + get.effect(current, event.card, player, player) > 0 + ); + }) + ) + return 1.6 + Math.random(); return 0; } - case 1:{ - if(event.targets.filter(function(current){ - var eff1=get.effect(current,event.card,player,player); - player._xinbenxi_ai=true; - var eff2=get.effect(current,event.card,player,player); - delete player._xinbenxi_ai; - return eff1>eff2; - }).length) return 1.9+Math.random(); + case 1: { + if ( + event.targets.filter(function (current) { + var eff1 = get.effect(current, event.card, player, player); + player._xinbenxi_ai = true; + var eff2 = get.effect(current, event.card, player, player); + delete player._xinbenxi_ai; + return eff1 > eff2; + }).length + ) + return 1.9 + Math.random(); return Math.random(); } - case 2:{ - var num=1.3; - if(event.card.name=='sha'&&event.targets.filter(function(current){ - if(current.mayHaveShan(player,'use',current.getCards('h',i=>{ - return i.hasGaintag('sha_notshan'); - }))&&get.attitude(player,current)<=0){ - if(current.hasSkillTag('useShan')) num=1.9; - return true; - } - return false; - }).length) return num+Math.random(); - return 0.5+Math.random(); + case 2: { + var num = 1.3; + if ( + event.card.name == "sha" && + event.targets.filter(function (current) { + if ( + current.mayHaveShan( + player, + "use", + current.getCards("h", (i) => { + return i.hasGaintag("sha_notshan"); + }) + ) && + get.attitude(player, current) <= 0 + ) { + if (current.hasSkillTag("useShan")) num = 1.9; + return true; + } + return false; + }).length + ) + return num + Math.random(); + return 0.5 + Math.random(); } - case 3:{ - return (get.tag(event.card,'damage')||0)+Math.random(); + case 3: { + return (get.tag(event.card, "damage") || 0) + Math.random(); } } }); - "step 1" - var map=[ - function(trigger,player,event){ - player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',true,function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card,player,target); - }).set('targets',trigger.targets).set('card',trigger.card).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }); + ("step 1"); + var map = [ + function (trigger, player, event) { + player + .chooseTarget( + "请选择" + get.translation(trigger.card) + "的额外目标", + true, + function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return lib.filter.targetEnabled2(_status.event.card, player, target); + } + ) + .set("targets", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }); }, - function(trigger,player,event){ + function (trigger, player, event) { player.storage.xinbenxi_unequip.add(trigger.card); }, - function(trigger,player,event){ + function (trigger, player, event) { player.storage.xinbenxi_directHit.add(trigger.card); - trigger.nowuxie=true; - trigger.customArgs.default.directHit2=true; + trigger.nowuxie = true; + trigger.customArgs.default.directHit2 = true; }, - function(trigger,player,event){ + function (trigger, player, event) { player.storage.xinbenxi_damage.add(trigger.card); - } + }, ]; - for(var i=0;i1; - })) return false; - if(tag=='directHit_ai') return arg.card.name=='sha'; - if(!arg||!arg.card||arg.card.name!='sha'&&arg.card.name!='chuqibuyi') return false; - var card=arg.target.getEquip(2); - if(card&&card.name.indexOf('bagua')!=-1) return true; - if(player._xinbenxi_ai) return false; + if ( + _status.currentPhase != player || + game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ) + return false; + if (tag == "directHit_ai") return arg.card.name == "sha"; + if (!arg || !arg.card || (arg.card.name != "sha" && arg.card.name != "chuqibuyi")) + return false; + var card = arg.target.getEquip(2); + if (card && card.name.indexOf("bagua") != -1) return true; + if (player._xinbenxi_ai) return false; }, }, - subSkill:{ - damage:{ - sub:true, - trigger:{global:'damageBegin1'}, - audio:2, - forced:true, - filter:function(event,player){ - return event.card&&player.storage.xinbenxi_damage.includes(event.card); + subSkill: { + damage: { + sub: true, + trigger: { global: "damageBegin1" }, + audio: 2, + forced: true, + filter: function (event, player) { + return event.card && player.storage.xinbenxi_damage.includes(event.card); + }, + content: function () { + player.draw(); }, - content:function(){player.draw()}, }, - summer:{ - sub:true, - trigger:{player:['phaseAfter','useCardAfter','useCard']}, - silent:true, - filter:function(event,player){ - return player==_status.currentPhase; + summer: { + sub: true, + trigger: { player: ["phaseAfter", "useCardAfter", "useCard"] }, + silent: true, + filter: function (event, player) { + return player == _status.currentPhase; }, - content:function(){ - if(trigger.name=='phase'){ - player.storage.xinbenxi=0; + content: function () { + if (trigger.name == "phase") { + player.storage.xinbenxi = 0; return; - } - else if(event.triggername=='useCard'){ - player.logSkill('xinbenxi'); + } else if (event.triggername == "useCard") { + player.logSkill("xinbenxi"); player.storage.xinbenxi++; - player.syncStorage('xinbenxi'); + player.syncStorage("xinbenxi"); return; - } - else{ + } else { player.storage.xinbenxi_unequip.remove(event.card); player.storage.xinbenxi_directHit.remove(event.card); player.storage.xinbenxi_damage.remove(event.card); @@ -2342,3325 +3052,3745 @@ game.import('character', function () { }, }, }, - xinyaoming:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + xinyaoming: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - filter:function(event,player){ - return game.hasPlayer(function(target){ - return ['摸牌','弃牌','制衡'].some(function(control){ - var storage=player.getStorage('xinyaoming_kanon'); - if(storage.includes(control)) return false; - if(control=='摸牌'&&target!=player) return true; - if(control=='弃牌'&&target!=player&&target.countCards('h')) return true; - if(control=='制衡') return true; + filter: function (event, player) { + return game.hasPlayer(function (target) { + return ["摸牌", "弃牌", "制衡"].some(function (control) { + var storage = player.getStorage("xinyaoming_kanon"); + if (storage.includes(control)) return false; + if (control == "摸牌" && target != player) return true; + if (control == "弃牌" && target != player && target.countCards("h")) return true; + if (control == "制衡") return true; return false; }); }); }, - direct:true, - content:function(){ - 'step 0' - var func=function(){ - game.countPlayer(function(target){ - var list=['摸牌','弃牌','制衡'].filter(function(control){ - var storage=player.getStorage('xinyaoming_kanon'); - if(storage.includes(control)) return false; - if(control=='摸牌'&&target!=player) return true; - if(control=='弃牌'&&target!=player&&target.countCards('h')) return true; - if(control=='制衡') return true; - return false; - }),str=''; - for(var i of list) str+=(i+'
    '); - str=str.slice(0,-4); + direct: true, + content: function () { + "step 0"; + var func = function () { + game.countPlayer(function (target) { + var list = ["摸牌", "弃牌", "制衡"].filter(function (control) { + var storage = player.getStorage("xinyaoming_kanon"); + if (storage.includes(control)) return false; + if (control == "摸牌" && target != player) return true; + if (control == "弃牌" && target != player && target.countCards("h")) + return true; + if (control == "制衡") return true; + return false; + }), + str = ""; + for (var i of list) str += i + "
    "; + str = str.slice(0, -4); target.prompt(str); }); }; - if(event.player==game.me) func(); - else if(event.isOnline()) player.send(func); - player.chooseTarget(get.prompt2('xinyaoming'),function(card,player,target){ - var storage=player.getStorage('xinyaoming_kanon'); - if(!storage.includes('制衡')) return true; - if(target==player) return false; - return !storage.includes('摸牌')||target.countCards('h'); - }).set('ai',function(target){ - var player=_status.event.player; - var storage=player.getStorage('xinyaoming_kanon'); - if(get.attitude(player,target)>0&&!storage.includes('摸牌')&&target!=player) return get.effect(target,{name:'draw'},player,player); - if(get.attitude(player,target)<0&&!storage.includes('弃牌')&&target!=player&&target.countCards('h')) return get.effect(target,{name:'guohe_copy2'},player,player); - if(get.attitude(player,target)>0&&!storage.includes('制衡')) return get.effect(target,{name:'kaihua'},player,player); - return 0; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('xinyaoming',target); - var controls=['摸牌','弃牌','制衡'].filter(function(control){ - var storage=player.getStorage('xinyaoming_kanon'); - if(storage.includes(control)) return false; - if(control=='摸牌'&&target!=player) return true; - if(control=='弃牌'&&target!=player&&target.countCards('h')) return true; - if(control=='制衡') return true; + if (event.player == game.me) func(); + else if (event.isOnline()) player.send(func); + player + .chooseTarget(get.prompt2("xinyaoming"), function (card, player, target) { + var storage = player.getStorage("xinyaoming_kanon"); + if (!storage.includes("制衡")) return true; + if (target == player) return false; + return !storage.includes("摸牌") || target.countCards("h"); + }) + .set("ai", function (target) { + var player = _status.event.player; + var storage = player.getStorage("xinyaoming_kanon"); + if ( + get.attitude(player, target) > 0 && + !storage.includes("摸牌") && + target != player + ) + return get.effect(target, { name: "draw" }, player, player); + if ( + get.attitude(player, target) < 0 && + !storage.includes("弃牌") && + target != player && + target.countCards("h") + ) + return get.effect(target, { name: "guohe_copy2" }, player, player); + if (get.attitude(player, target) > 0 && !storage.includes("制衡")) + return get.effect(target, { name: "kaihua" }, player, player); + return 0; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinyaoming", target); + var controls = ["摸牌", "弃牌", "制衡"].filter(function (control) { + var storage = player.getStorage("xinyaoming_kanon"); + if (storage.includes(control)) return false; + if (control == "摸牌" && target != player) return true; + if (control == "弃牌" && target != player && target.countCards("h")) return true; + if (control == "制衡") return true; return false; }); - if(controls.length==1) event._result={control:controls[0]}; - else{ - var str=get.translation(target); - var choiceList=[ - '令'+str+'摸一张牌', - '弃置'+str+'一张手牌', - '令'+str+'弃置至多两张牌,然后其摸等量的牌', + if (controls.length == 1) event._result = { control: controls[0] }; + else { + var str = get.translation(target); + var choiceList = [ + "令" + str + "摸一张牌", + "弃置" + str + "一张手牌", + "令" + str + "弃置至多两张牌,然后其摸等量的牌", ]; - var list=['摸牌','弃牌','制衡']; - for(var i=0;i<3;i++){ - if(!controls.includes(list[i])){ - choiceList[i]=''+choiceList[i]+''; + var list = ["摸牌", "弃牌", "制衡"]; + for (var i = 0; i < 3; i++) { + if (!controls.includes(list[i])) { + choiceList[i] = '' + choiceList[i] + ""; } } - player.chooseControl(controls).set('choiceList',choiceList).set('ai',function(){ - var player=_status.event.player; - var target=_status.event.target; - var controls=_status.event.controls.slice(); - var map={ - '摸牌':get.effect(target,{name:'draw'},player,player), - '弃牌':get.effect(target,{name:'guohe_copy2'},player,player), - '制衡':get.effect(target,{name:'kaihua'},player,player), - }; - controls.sort((a,b)=>map[b]-map[a]); - return controls[0]; - }).set('target',target); + player + .chooseControl(controls) + .set("choiceList", choiceList) + .set("ai", function () { + var player = _status.event.player; + var target = _status.event.target; + var controls = _status.event.controls.slice(); + var map = { + 摸牌: get.effect(target, { name: "draw" }, player, player), + 弃牌: get.effect(target, { name: "guohe_copy2" }, player, player), + 制衡: get.effect(target, { name: "kaihua" }, player, player), + }; + controls.sort((a, b) => map[b] - map[a]); + return controls[0]; + }) + .set("target", target); } - } - else event.finish(); - 'step 2' - player.addTempSkill('xinyaoming_kanon'); - player.markAuto('xinyaoming_kanon',[result.control]); - switch(result.control){ - case '摸牌': + } else event.finish(); + ("step 2"); + player.addTempSkill("xinyaoming_kanon"); + player.markAuto("xinyaoming_kanon", [result.control]); + switch (result.control) { + case "摸牌": target.draw(); break; - case '弃牌': - player.discardPlayerCard(target,'h',true); + case "弃牌": + player.discardPlayerCard(target, "h", true); break; - case '制衡': - target.chooseToDiscard([1,2],'he','邀名:弃置至多两张牌,然后摸等量的牌',true).set('ai',card=>lib.skill.zhiheng.check(card)); + case "制衡": + target + .chooseToDiscard([1, 2], "he", "邀名:弃置至多两张牌,然后摸等量的牌", true) + .set("ai", (card) => lib.skill.zhiheng.check(card)); break; } - if(result.control!='制衡') event.finish(); - 'step 3' - if(result.bool){ + if (result.control != "制衡") event.finish(); + ("step 3"); + if (result.bool) { target.draw(result.cards.length); } }, - subSkill:{ - kanon:{ - charlotte:true, - onremove:true, + subSkill: { + kanon: { + charlotte: true, + onremove: true, }, }, }, - xinfuli:{ - audio:2, - skillAnimation:true, - animationColor:'soil', - unique:true, - limited:true, - enable:'chooseToUse', - mark:true, - filter:function(event,player){ - if(event.type!='dying') return false; - if(player!=event.dying) return false; + xinfuli: { + audio: 2, + skillAnimation: true, + animationColor: "soil", + unique: true, + limited: true, + enable: "chooseToUse", + mark: true, + filter: function (event, player) { + if (event.type != "dying") return false; + if (player != event.dying) return false; return true; }, - content:function(){ - "step 0" - player.awakenSkill('xinfuli'); - event.num=game.countGroup(); - player.recover(event.num-player.hp); - "step 1" - var num2=num-player.countCards('h'); - if(num2) player.draw(num2); - "step 2" - if(num>2) player.turnOver(); - player.storage.xinfuli=true; + content: function () { + "step 0"; + player.awakenSkill("xinfuli"); + event.num = game.countGroup(); + player.recover(event.num - player.hp); + ("step 1"); + var num2 = num - player.countCards("h"); + if (num2) player.draw(num2); + ("step 2"); + if (num > 2) player.turnOver(); + player.storage.xinfuli = true; }, - ai:{ - save:true, - skillTagFilter:function(player,arg,target){ - return player==target; + ai: { + save: true, + skillTagFilter: function (player, arg, target) { + return player == target; }, - result:{ - player:10 + result: { + player: 10, + }, + threaten: function (player, target) { + if (!target.storage.xinfuli) return 0.9; }, - threaten:function(player,target){ - if(!target.storage.xinfuli) return 0.9; - } }, - intro:{ - content:'limited' - } + intro: { + content: "limited", + }, }, - xindangxian:{ - trigger:{player:'phaseBegin'}, - forced:true, - audio:'dangxian', - audioname:['guansuo','xin_liaohua','re_liaohua'], - audioname2:{ - dc_guansuo:'dangxian_guansuo', + xindangxian: { + trigger: { player: "phaseBegin" }, + forced: true, + audio: "dangxian", + audioname: ["guansuo", "xin_liaohua", "re_liaohua"], + audioname2: { + dc_guansuo: "dangxian_guansuo", }, - content:function(){ - trigger.phaseList.splice(trigger.num,0,'phaseUse|xindangxian'); + content: function () { + trigger.phaseList.splice(trigger.num, 0, "phaseUse|xindangxian"); }, - group:'xindangxian_rewrite', - subSkill:{ - rewrite:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - popup:false, - filter:function(kagari){ - return kagari._extraPhaseReason=='xindangxian'; + group: "xindangxian_rewrite", + subSkill: { + rewrite: { + trigger: { player: "phaseUseBegin" }, + forced: true, + popup: false, + filter: function (kagari) { + return kagari._extraPhaseReason == "xindangxian"; }, - content:function(){ - 'step 0' - if(player.storage.xinfuli){ - player.chooseBool('是否失去1点体力并获得一张【杀】?').ai=function(){ - return player.hp>2&&!player.hasSha(); + content: function () { + "step 0"; + if (player.storage.xinfuli) { + player.chooseBool("是否失去1点体力并获得一张【杀】?").ai = function () { + return player.hp > 2 && !player.hasSha(); }; - } - else event._result={bool:true}; - 'step 1' - if(!result.bool){ + } else event._result = { bool: true }; + ("step 1"); + if (!result.bool) { event.finish(); return; } player.loseHp(); - 'step 2' - var card=get.cardPile(function(card){ - return card.name=='sha'; + ("step 2"); + var card = get.cardPile(function (card) { + return card.name == "sha"; }); - if(card) player.gain(card,'gain2'); - 'step 3' + if (card) player.gain(card, "gain2"); + ("step 3"); game.updateRoundNumber(); }, }, }, }, - dangxian_guansuo:{audio:2}, - xinjunxing:{ - inherit:'junxing', - audio:'junxing', - content:function(){ - "step 0" - var types=[]; - for(var i=0;i=0?-1:(9-get.value(card)); + content: function () { + "step 0"; + targets[0].chooseCard( + "交给" + + get.translation(player) + + "一张【杀】或武器牌,否则视为对" + + get.translation(targets[1]) + + "使用一张【杀】", + "he", + function (card) { + return get.name(card) == "sha" || get.subtype(card) == "equip1"; + } + ).ai = function (card) { + var player = _status.event.player; + var target = _status.event.getParent("xinzhige").targets[1]; + return get.effect(target, { name: "sha" }, player, player) >= 0 + ? -1 + : 9 - get.value(card); }; - "step 1" - if(result.bool){ - targets[0].give(result.cards,player,'give'); - } - else{ - if(targets[0].canUse('sha',targets[1])) targets[0].useCard({name:'sha',isCard:true},targets[1]); + ("step 1"); + if (result.bool) { + targets[0].give(result.cards, player, "give"); + } else { + if (targets[0].canUse("sha", targets[1])) + targets[0].useCard({ name: "sha", isCard: true }, targets[1]); } }, - ai:{ - result:{ - target:function(player,target){ - if(ui.selected.targets.length){ - var from=ui.selected.targets[0]; - return get.effect(target,{name:'sha'},from,target); + ai: { + result: { + target: function (player, target) { + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + return get.effect(target, { name: "sha" }, from, target); } - var effs=[0,0]; - game.countPlayer(function(current){ - if(current!=target&&target.canUse('sha',current)){ - var eff=get.effect(current,{name:'sha'},target,target); - if(eff>effs[0]) effs[0]=eff; - if(eff effs[0]) effs[0] = eff; + if (eff < effs[1]) effs[1] = eff; } }); - return effs[get.attitude(player,target)>0?0:1]; - } + return effs[get.attitude(player, target) > 0 ? 0 : 1]; + }, }, - order:8.5, - expose:0.2 - } + order: 8.5, + expose: 0.2, + }, }, - xinzongzuo:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + xinzongzuo: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - audio:'zongzuo', - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + audio: "zongzuo", + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - var num=game.countGroup(); + content: function () { + "step 0"; + var num = game.countGroup(); player.gainMaxHp(num); - event.num=num; - 'step 1' + event.num = num; + ("step 1"); player.recover(event.num); //player.update(); }, - group:'xinzongzuo_lose', - subSkill:{ - lose:{ - trigger:{global:'dieAfter'}, - forced:true, - audio:'zongzuo', - filter:function(event,player){ - if(!lib.group.includes(event.player.group)) return false; - if(game.hasPlayer(function(current){ - return current.group==event.player.group; - })){ + group: "xinzongzuo_lose", + subSkill: { + lose: { + trigger: { global: "dieAfter" }, + forced: true, + audio: "zongzuo", + filter: function (event, player) { + if (!lib.group.includes(event.player.group)) return false; + if ( + game.hasPlayer(function (current) { + return current.group == event.player.group; + }) + ) { return false; } return true; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseMaxHp(); - 'step 1' + ("step 1"); player.draw(2); - } - } - } + }, + }, + }, }, - xintaoluan:{ - hiddenCard:function(player,name){ - return !player.getStorage('xintaoluan').includes(name)&&player.countCards('hes')>0&&!player.hasSkill('xintaoluan3')&&lib.inpile.includes(name); + xintaoluan: { + hiddenCard: function (player, name) { + return ( + !player.getStorage("xintaoluan").includes(name) && + player.countCards("hes") > 0 && + !player.hasSkill("xintaoluan3") && + lib.inpile.includes(name) + ); }, - audio:'taoluan', - enable:'chooseToUse', - filter:function(event,player){ - return !player.hasSkill('xintaoluan3')&&player.hasCard(card=>lib.inpile.some(name=>{ - if(player.getStorage('xintaoluan').includes(name)) return false; - if(get.type(name)!='basic'&&get.type(name)!='trick') return false; - if(event.filterCard({name:name,isCard:true,cards:[card]},player,event)) return true; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]},player,event)) return true; - } - } - return false; - },'hes'))>0&&!_status.dying.length; + audio: "taoluan", + enable: "chooseToUse", + filter: function (event, player) { + return ( + !player.hasSkill("xintaoluan3") && + player.hasCard((card) => + lib.inpile.some((name) => { + if (player.getStorage("xintaoluan").includes(name)) return false; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + if ( + event.filterCard( + { name: name, isCard: true, cards: [card] }, + player, + event + ) + ) + return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + if ( + event.filterCard( + { name: name, nature: nature, isCard: true, cards: [card] }, + player, + event + ) + ) + return true; + } + } + return false; + }, "hes") + ) > 0 && + !_status.dying.length + ); }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - for(var name of lib.inpile){ - if(get.type(name)=='basic'||get.type(name)=='trick'){ - if(player.getStorage('xintaoluan').includes(name)) continue; - list.push([get.translation(get.type(name)),'',name]); - if(name=='sha'){ - for(var j of lib.inpile_nature) list.push(['基本','','sha',j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of lib.inpile) { + if (get.type(name) == "basic" || get.type(name) == "trick") { + if (player.getStorage("xintaoluan").includes(name)) continue; + list.push([get.translation(get.type(name)), "", name]); + if (name == "sha") { + for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); } } } - return ui.create.dialog('滔乱',[list,'vcard']); + return ui.create.dialog("滔乱", [list, "vcard"]); }, - filter:function(button,player){ - return _status.event.getParent().filterCard({name:button.link[2]},player,_status.event.getParent()); + filter: function (button, player) { + return _status.event + .getParent() + .filterCard({ name: button.link[2] }, player, _status.event.getParent()); }, - check:function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - if(player.countCards('hes',cardx=>cardx.name==card.name)) return 0; - return _status.event.getParent().type=='phase'?player.getUseValue(card):1; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if (player.countCards("hes", (cardx) => cardx.name == card.name)) return 0; + return _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1; }, - backup:function(links,player){ + backup: function (links, player) { return { - filterCard:true, - audio:'taoluan', - popname:true, - check:function(card){ - return 7-get.value(card); + filterCard: true, + audio: "taoluan", + popname: true, + check: function (card) { + return 7 - get.value(card); }, - position:'hes', - viewAs:{name:links[0][2],nature:links[0][3]}, - onuse:function(result,player){ - var evt=_status.event.getParent('phase'); - if(evt&&evt.name=='phase'&&!evt.xintaoluan){ - evt.xintaoluan=true; - var next=game.createEvent('xintaoluan_clear'); + position: "hes", + viewAs: { name: links[0][2], nature: links[0][3] }, + onuse: function (result, player) { + var evt = _status.event.getParent("phase"); + if (evt && evt.name == "phase" && !evt.xintaoluan) { + evt.xintaoluan = true; + var next = game.createEvent("xintaoluan_clear"); _status.event.next.remove(next); evt.after.push(next); - next.player=player; - next.setContent(function(){ + next.player = player; + next.setContent(function () { delete player.storage.xintaoluan; delete player.storage.xintaoluan2; }); } - player.markAuto('xintaoluan',[result.card.name]); + player.markAuto("xintaoluan", [result.card.name]); }, - } + }; + }, + prompt: function (links, player) { + return ( + "将一张牌当做" + + (get.translation(links[0][3]) || "") + + get.translation(links[0][2]) + + "使用" + ); }, - prompt:function(links,player){ - return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; - } }, - ai:{ - order:4, - save:true, - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(!player.countCards('hes')||player.hasSkill('taoluan3')) return false; - if(tag=='respondSha'||tag=='respondShan'){ - if(arg=='respond') return false; - return !player.getStorage('taoluan').includes(tag=='respondSha'?'sha':'shan'); + ai: { + order: 4, + save: true, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (!player.countCards("hes") || player.hasSkill("taoluan3")) return false; + if (tag == "respondSha" || tag == "respondShan") { + if (arg == "respond") return false; + return !player + .getStorage("taoluan") + .includes(tag == "respondSha" ? "sha" : "shan"); } - return !player.getStorage('taoluan').includes('tao')||(!player.getStorage('taoluan').includes('jiu')&&arg==player); + return ( + !player.getStorage("taoluan").includes("tao") || + (!player.getStorage("taoluan").includes("jiu") && arg == player) + ); }, - result:{ - player:function(player){ - var num=player.countMark('xintaoluan2'); - var players=game.filterPlayer(); - for(var i=0;i((num+1)*2)&&get.attitude(player,players[i])>0){ + result: { + player: function (player) { + var num = player.countMark("xintaoluan2"); + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + players[i].countCards("he") > (num + 1) * 2 && + get.attitude(player, players[i]) > 0 + ) { return 1; } } return 0; - } + }, }, - threaten:1.9, + threaten: 1.9, }, - group:'xintaoluan2', + group: "xintaoluan2", }, - xintaoluan2:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - if(!game.hasPlayer(current=>current!=player)) return false; - return event.skill=='xintaoluan_backup'; + xintaoluan2: { + trigger: { player: ["useCardAfter", "respondAfter"] }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + if (!game.hasPlayer((current) => current != player)) return false; + return event.skill == "xintaoluan_backup"; }, - content:function(){ - 'step 0' - player.addMark('xintaoluan2',1,false); - event.num=player.countMark('xintaoluan2'); - player.chooseTarget(true,function(card,player,target){ - return target!=player; - },'滔乱

    令一名其他角色选择一项:1.交给你'+get.cnNumber(event.num)+'张与你以此法使用的牌类别不同的牌;2.你失去'+get.cnNumber(event.num)+'点体力').set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>0){ - if(get.attitude(target,player)>0){ - return target.countCards('h'); + content: function () { + "step 0"; + player.addMark("xintaoluan2", 1, false); + event.num = player.countMark("xintaoluan2"); + player + .chooseTarget( + true, + function (card, player, target) { + return target != player; + }, + '滔乱

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

    交给'+get.translation(player)+get.cnNumber(num)+'张不为'+get.translation(type)+'牌的牌,或令其失去'+get.cnNumber(num)+'点体力且滔乱无效直到回合结束','he',num,function(card,player,target){ - return get.type(card,'trick')!=_status.event.cardType; - }).set('cardType',type).set('ai',function(card){ - if(_status.event.att){ - return 11-get.value(card); - } - return 0; - }).set('att',get.attitude(target,player)>0); - 'step 2' - var target=event.target; - if(result.bool){ - target.give(result.cards,player,'give'); - } - else{ - player.addTempSkill('xintaoluan3'); + return 0; + }); + ("step 1"); + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var type = get.type(trigger.card, "trick"); + target + .chooseCard( + '滔乱

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

    令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力').set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>0){ - if(get.attitude(target,player)>0){ - return target.countCards('he'); + forced: true, + popup: false, + content: function () { + "step 0"; + player + .chooseTarget( + true, + function (card, player, target) { + return target != player; + }, + '滔乱

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

    交给'+get.translation(player)+'一张不为'+get.translation(type)+'牌的牌,或令其失去1点体力且滔乱无效直到回合结束','he',function(card,player,target){ - return get.type(card,'trick')!=_status.event.cardType; - }).set('cardType',type).set('ai',function(card){ - if(_status.event.att){ - return 11-get.value(card); - } - return 0; - }).set('att',get.attitude(target,player)>0); - 'step 2' - var target=event.target; - if(result.bool){ - target.give(result.cards,player); - } - else{ - player.addTempSkill('taoluan3'); + return 0; + }); + ("step 1"); + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var type = get.type(trigger.card, "trick"); + target + .chooseCard( + '滔乱

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

    更改描述:将“选择距离最近的一名其他角色,该角色”改为“你”'; + if (player.countMark("xindanxin") == 0) { + prompt = + '摸一张牌或更改矫诏的描述

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

    更改描述:将“基本牌”改为“基本牌或普通锦囊牌”'; } - else{ - prompt='摸一张牌或更改矫诏的描述

    更改描述:将“基本牌”改为“基本牌或普通锦囊牌”'; - } - player.chooseControl(list,function(){ - if(!_status.event.player.hasSkill('jiaozhao')) return 'draw_card'; - return '更改描述'; - }).set('prompt',prompt); + player + .chooseControl(list, function () { + if (!_status.event.player.hasSkill("jiaozhao")) return "draw_card"; + return "更改描述"; + }) + .set("prompt", prompt); } - 'step 1' - if(result.control=='draw_card'){ + ("step 1"); + if (result.control == "draw_card") { player.draw(); - } - else{ - game.log(player,'更改了','【矫诏】','的描述'); - player.popup('更改描述'); - player.addMark('xindanxin',1,false); + } else { + game.log(player, "更改了", "【矫诏】", "的描述"); + player.popup("更改描述"); + player.addMark("xindanxin", 1, false); } }, - ai:{ - maixie:true, - effect:{ - target:(card,player,target)=>{ - if(!get.tag(card,'damage')) return; - if(target.hp<2||player.hasSkillTag('jueqing',false,target)) return 1.5; - return [1,1]; - } - } - } + ai: { + maixie: true, + effect: { + target: (card, player, target) => { + if (!get.tag(card, "damage")) return; + if (target.hp < 2 || player.hasSkillTag("jueqing", false, target)) return 1.5; + return [1, 1]; + }, + }, + }, }, - zongzuo:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', + zongzuo: { + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - audio:2, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + forced: true, + audio: 2, + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - content:function(){ - 'step 0' - var num=game.countGroup(); + content: function () { + "step 0"; + var num = game.countGroup(); player.gainMaxHp(num); - event.num=num; - 'step 1' + event.num = num; + ("step 1"); player.recover(event.num); //player.update(); }, - group:'zongzuo_lose', - subSkill:{ - lose:{ - trigger:{global:'dieAfter'}, - forced:true, - audio:'zongzuo', - filter:function(event,player){ - if(!lib.group.includes(event.player.group)) return false; - if(game.hasPlayer(function(current){ - return current.group==event.player.group; - })){ + group: "zongzuo_lose", + subSkill: { + lose: { + trigger: { global: "dieAfter" }, + forced: true, + audio: "zongzuo", + filter: function (event, player) { + if (!lib.group.includes(event.player.group)) return false; + if ( + game.hasPlayer(function (current) { + return current.group == event.player.group; + }) + ) { return false; } return true; }, - content:function(){ + content: function () { player.loseMaxHp(); - } - } - } + }, + }, + }, }, - zhige:{ - enable:'phaseUse', - usable:1, - audio:2, - filter:function(event,player){ - return player.countCards('h')>player.hp; + zhige: { + enable: "phaseUse", + usable: 1, + audio: 2, + filter: function (event, player) { + return player.countCards("h") > player.hp; }, - filterTarget:function(card,player,target){ - return get.distance(target,player,'attack')<=1&&target.countCards('e')>0; + filterTarget: function (card, player, target) { + return get.distance(target, player, "attack") <= 1 && target.countCards("e") > 0; }, - content:function(){ - 'step 0' - target.chooseToUse({name:'sha'},'止戈:使用一张杀,或将其装备区里的一张牌交给'+get.translation(player)); - 'step 1' - if(!result.bool&&target.countCards('e')){ - target.chooseCard('e',true,'将其装备区里的一张牌交给'+get.translation(player)); - } - else{ + content: function () { + "step 0"; + target.chooseToUse( + { name: "sha" }, + "止戈:使用一张杀,或将其装备区里的一张牌交给" + get.translation(player) + ); + ("step 1"); + if (!result.bool && target.countCards("e")) { + target.chooseCard("e", true, "将其装备区里的一张牌交给" + get.translation(player)); + } else { event.finish(); } - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ - target.give(result.cards,player); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + target.give(result.cards, player); } }, - ai:{ - expose:0.2, - order:5, - result:{ - target:-1, - player:function(player,target){ - if(target.countCards('h')==0) return 0; - if(target.countCards('h')==1) return -0.1; - if(player.hp<=2) return -2; - if(player.countCards('h','shan')==0) return -1; + ai: { + expose: 0.2, + order: 5, + result: { + target: -1, + player: function (player, target) { + if (target.countCards("h") == 0) return 0; + if (target.countCards("h") == 1) return -0.1; + if (player.hp <= 2) return -2; + if (player.countCards("h", "shan") == 0) return -1; return -0.5; - } - } - } - }, - kuangbi:{ - enable:'phaseUse', - usable:1, - audio:2, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; + }, + }, }, - content:function(){ - 'step 0' - target.chooseCard('he',[1,3],'匡弼:将至多三张牌置于'+get.translation(player)+'的武将牌上',true).set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.getParent().player)>0){ - return 7-get.value(card); - } - return -get.value(card); - }); - 'step 1' - if(result.bool){ - player.addToExpansion(result.cards,target,'give').gaintag.add('kuangbi'); - if(!player.storage.kuangbi_draw) player.storage.kuangbi_draw=[[],[]]; + }, + kuangbi: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + content: function () { + "step 0"; + target + .chooseCard( + "he", + [1, 3], + "匡弼:将至多三张牌置于" + get.translation(player) + "的武将牌上", + true + ) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) { + return 7 - get.value(card); + } + return -get.value(card); + }); + ("step 1"); + if (result.bool) { + player.addToExpansion(result.cards, target, "give").gaintag.add("kuangbi"); + if (!player.storage.kuangbi_draw) player.storage.kuangbi_draw = [[], []]; player.storage.kuangbi_draw[0].push(target); player.storage.kuangbi_draw[1].push(result.cards.length); - player.addSkill('kuangbi_draw'); - player.syncStorage('kuangbi_draw'); - player.updateMarks('kuangbi_draw'); + player.addSkill("kuangbi_draw"); + player.syncStorage("kuangbi_draw"); + player.updateMarks("kuangbi_draw"); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); delete player.storage[skill]; }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(get.attitude(player,target)>0){ - return Math.sqrt(target.countCards('he')); + ai: { + order: 1, + result: { + target: function (player, target) { + if (get.attitude(player, target) > 0) { + return Math.sqrt(target.countCards("he")); } return 0; }, - player:1 - } + player: 1, + }, }, - subSkill:{ - draw:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - mark:true, - charlotte:true, - audio:'kuangbi', - onremove:true, - filter:function(event,player){ - return player.getExpansions('kuangbi').length; + subSkill: { + draw: { + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + mark: true, + charlotte: true, + audio: "kuangbi", + onremove: true, + filter: function (event, player) { + return player.getExpansions("kuangbi").length; }, - content:function(){ - player.gain(player.getExpansions('kuangbi'),'gain2'); - var storage=player.storage.kuangbi_draw; - if(storage.length){ - for(var i=0;i0; + duliang: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("h") > 0; }, - audio:2, - content:function(){ - 'step 0' - player.gainPlayerCard(target,'h',true); - 'step 1' - var name=get.translation(target); - player.chooseControl(function(){ - return Math.random()<0.5?'选项一':'选项二'; - }).set('prompt','督粮').set('choiceList',['令'+name+'观看牌堆顶的两张牌,然后获得其中的基本牌','令'+name+'于下个摸牌阶段额外摸一张牌']); - 'step 2' - if(result.control=='选项一'){ - var cards=get.cards(2); - target.viewCards('督粮',cards); - event.cards2=[]; - event.tothrow=[]; - for(var i=0;i=_status.event.getParent().num) return -1; - if(_status.event.player.hasSkillTag('nofire')) return -1; - if(_status.event.res>=0) return 6-get.value(card); - if(get.type(card)!='basic'){ - return 10-get.value(card); - } - return 8-get.value(card); - }).set('res',res); - } - else{ + ("step 1"); + if (event.targets.length) { + var target = event.targets.shift(); + event.target = target; + var res = get.damageEffect(target, player, target, "fire"); + target + .chooseToDiscard( + "he", + "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害", + [num, Infinity] + ) + .set("ai", function (card) { + if (ui.selected.cards.length >= _status.event.getParent().num) return -1; + if (_status.event.player.hasSkillTag("nofire")) return -1; + if (_status.event.res >= 0) return 6 - get.value(card); + if (get.type(card) != "basic") { + return 10 - get.value(card); + } + return 8 - get.value(card); + }) + .set("res", res); + } else { event.finish(); } - "step 2" - if(!result.bool){ - event.target.damage(2,'fire'); - event.num=1; - } - else{ - event.num=result.cards.length+1; + ("step 2"); + if (!result.bool) { + event.target.damage(2, "fire"); + event.num = 1; + } else { + event.num = result.cards.length + 1; } event.goto(1); }, - ai:{ - order:1, - result:{ - player:function(player){ - var num=0,eff=0,players=game.filterPlayer(function(current){ - return current!=player; - }).sortBySeat(player); - for(var target of players){ - if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue} - var shao=false; - num++; - if(target.countCards('he',function(card){ - if(get.type(card)!='basic'){ - return get.value(card)<10; - } - return get.value(card)<8; - })= 0) { + num = 0; + continue; } - else eff-=num*(get.realAttitude||get.attitude)(player,target)/4; + var shao = false; + num++; + if ( + target.countCards("he", function (card) { + if (get.type(card) != "basic") { + return get.value(card) < 10; + } + return get.value(card) < 8; + }) < num + ) + shao = true; + if (shao) { + eff -= 4 * (get.realAttitude || get.attitude)(player, target); + num = 0; + } else eff -= (num * (get.realAttitude || get.attitude)(player, target)) / 4; } - if(eff<4) return 0; + if (eff < 4) return 0; return eff; - } - } + }, + }, }, - init:function(player){ - player.storage.xinfencheng=false; + init: function (player) { + player.storage.xinfencheng = false; + }, + intro: { + content: "limited", }, - intro:{ - content:'limited' - } }, - xinjuece:{ - audio:'juece', - audioname:['dc_liru'], - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(player){ - return player.countCards('h')==0; + xinjuece: { + audio: "juece", + audioname: ["dc_liru"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (player) { + return player.countCards("h") == 0; }); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('xinjuece'),'对一名没有手牌的角色造成1点伤害',function(card,player,target){ - return target.countCards('h')==0; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - player.logSkill('xinjuece',result.targets); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("xinjuece"), + "对一名没有手牌的角色造成1点伤害", + function (card, player, target) { + return target.countCards("h") == 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + player.logSkill("xinjuece", result.targets); result.targets[0].damage(); } - } + }, }, - xinmieji:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h',{type:['trick','delay'],color:'black'}); + xinmieji: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h", { type: ["trick", "delay"], color: "black" }); }, - filterCard:function(card){ - return get.color(card)=='black'&&get.type(card,'trick')=='trick'; + filterCard: function (card) { + return get.color(card) == "black" && get.type(card, "trick") == "trick"; }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - discard:false, - delay:false, - check:function(card){ - return 8-get.value(card); + discard: false, + delay: false, + check: function (card) { + return 8 - get.value(card); }, - loseTo:'cardPile', - insert:true, - visible:true, - content:function(){ - 'step 0' + loseTo: "cardPile", + insert: true, + visible: true, + content: function () { + "step 0"; player.showCards(cards); - 'step 1' - target.chooseToDiscard('he',true).set('prompt','请弃置一张锦囊牌,或依次弃置两张非锦囊牌。'); - 'step 2' - if((!result.cards||get.type(result.cards[0],'trick',result.cards[0].original=='h'?target:false)!='trick')&&target.countCards('he',function(card){ - return get.type(card,'trick')!='trick'; - })){ - target.chooseToDiscard('he',true,function(card){ - return get.type(card,'trick')!='trick'; - }).set('prompt','请弃置第二张非锦囊牌'); + ("step 1"); + target + .chooseToDiscard("he", true) + .set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。"); + ("step 2"); + if ( + (!result.cards || + get.type( + result.cards[0], + "trick", + result.cards[0].original == "h" ? target : false + ) != "trick") && + target.countCards("he", function (card) { + return get.type(card, "trick") != "trick"; + }) + ) { + target + .chooseToDiscard("he", true, function (card) { + return get.type(card, "trick") != "trick"; + }) + .set("prompt", "请弃置第二张非锦囊牌"); } }, - ai:{ - order:9, - result:{ - target:-1 - } - } - }, - qianju:{ - mod:{ - globalFrom:function(from,to,distance){ - return distance-(from.getDamagedHp()); - } - } - }, - reqianju:{ - mod:{ - globalFrom:function(from,to,distance){ - return distance-(Math.max(1,from.getDamagedHp())); - } - } - }, - reqingxi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.card.name=='sha'||event.card.name=='juedou'; + ai: { + order: 9, + result: { + target: -1, + }, }, - check:function(event,player){ - return get.attitude(player,event.target)<0; + }, + qianju: { + mod: { + globalFrom: function (from, to, distance) { + return distance - from.getDamagedHp(); + }, }, - logTarget:'target', - content:function(){ - 'step 0' - var num=Math.min(game.countPlayer(function(current){ - return player.inRange(current); - }),player.getEquips(1).length?4:2); - if(trigger.target.countCards('h') 2) { + return 0; + } + return 8 - get.value(card); + } + }); } - else{ - trigger.target.chooseToDiscard(num,'弃置'+get.cnNumber(num)+'张手牌,或令'+get.translation(trigger.card)+'的伤害+1').set('ai',function(card){ - var player=_status.event.player; - if(player.hp==1){ - if(get.type(card)=='basic'){ - return 8-get.value(card); - } - else{ - return 10-get.value(card); - } - } - else{ - if(num>2){ - return 0; - } - return 8-get.value(card); - } - }); - } - 'step 1' - if(!event.directfalse&&result.bool){ - var e1=player.getEquips(1); - if(e1.length){ - player.discard(e1,'notBySelf'); + ("step 1"); + if (!event.directfalse && result.bool) { + var e1 = player.getEquips(1); + if (e1.length) { + player.discard(e1, "notBySelf"); } event.finish(); - } - else{ - var id=trigger.target.playerid; - var map=trigger.customArgs; - if(!map[id]) map[id]={}; - if(!map[id].extraDamage) map[id].extraDamage=0; + } else { + var id = trigger.target.playerid; + var map = trigger.customArgs; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; map[id].extraDamage++; - player.judge(function(card){ - if(get.color(card)=='red') return 1; + player.judge(function (card) { + if (get.color(card) == "red") return 1; return 0; - }).judge2=function(result){ + }).judge2 = function (result) { return result.bool; }; } - 'step 2' - if(result.color=='red') trigger.directHit.add(trigger.target); - } + ("step 2"); + if (result.color == "red") trigger.directHit.add(trigger.target); + }, }, - reqingxi2:{ - mod:{ - cardEnabled:function(card,player){ - if(player.storage.reqingxi2&&player.storage.reqingxi2.filter(function(cd){ - return get.color(cd)==get.color(card); - }).length) return false; + reqingxi2: { + mod: { + cardEnabled: function (card, player) { + if ( + player.storage.reqingxi2 && + player.storage.reqingxi2.filter(function (cd) { + return get.color(cd) == get.color(card); + }).length + ) + return false; }, - cardRespondable:function(card,player){ - if(player.storage.reqingxi2&&player.storage.reqingxi2.filter(function(cd){ - return get.color(cd)==get.color(card); - }).length) return false; + cardRespondable: function (card, player) { + if ( + player.storage.reqingxi2 && + player.storage.reqingxi2.filter(function (cd) { + return get.color(cd) == get.color(card); + }).length + ) + return false; }, }, - firstDo:true, - onremove:true, - trigger:{ - player:['damage','damageCancelled','damageZero'], - target:['shaMiss','useCardToExcluded'], + firstDo: true, + onremove: true, + trigger: { + player: ["damage", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded"], }, - charlotte:true, - filter:function(event,player){ - return player.storage.reqingxi2&&event.card&&player.storage.reqingxi2.includes(event.card); + charlotte: true, + filter: function (event, player) { + return ( + player.storage.reqingxi2 && + event.card && + player.storage.reqingxi2.includes(event.card) + ); }, - silent:true, - forced:true, - popup:false, - priority:12, - content:function(){ + silent: true, + forced: true, + popup: false, + priority: 12, + content: function () { player.storage.reqingxi2.remove(trigger.card); - if(!player.storage.reqingxi2.length) player.removeSkill('reqingxi2'); + if (!player.storage.reqingxi2.length) player.removeSkill("reqingxi2"); }, }, - qingxi:{ - audio:2, - trigger:{source:'damageBegin1'}, - check:function(event,player){ - return get.attitude(player,event.player)<0; + qingxi: { + audio: 2, + trigger: { source: "damageBegin1" }, + check: function (event, player) { + return get.attitude(player, event.player) < 0; }, - filter:function(event,player){ - return event.getParent().name=='sha'&&player.getEquips(1).length>0; + filter: function (event, player) { + return event.getParent().name == "sha" && player.getEquips(1).length > 0; }, - content:function(){ - 'step 0' - var num=player.getEquipRange(); - if(trigger.player.countCards('h') 2) { + return 0; + } + return 8 - get.value(card); + } + }); } - else{ - trigger.player.chooseToDiscard(num,'弃置'+get.cnNumber(num)+'张手牌,或令杀的伤害+1').set('ai',function(card){ - var player=_status.event.player; - if(player.hp==1){ - if(get.type(card)=='basic'){ - return 8-get.value(card); - } - else{ - return 10-get.value(card); - } - } - else{ - if(num>2){ - return 0; - } - return 8-get.value(card); - } - }); - } - 'step 1' - if(!event.directfalse&&result.bool){ - var e1=player.getEquips(1); - if(e1.length){ - player.discard(e1,'notBySelf'); + ("step 1"); + if (!event.directfalse && result.bool) { + var e1 = player.getEquips(1); + if (e1.length) { + player.discard(e1, "notBySelf"); } - } - else{ + } else { trigger.num++; } - } + }, }, - jieyue:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - 'step 0' + jieyue: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; player.chooseCardTarget({ - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('he')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; }, - filterCard:lib.filter.cardDiscardable, - ai1:function(card){ - return 7-get.useful(card); + filterCard: lib.filter.cardDiscardable, + ai1: function (card) { + return 7 - get.useful(card); }, - ai2:function(target){ - return 1-get.attitude(_status.event.player,target); + ai2: function (target) { + return 1 - get.attitude(_status.event.player, target); }, - prompt:get.prompt2('jieyue') + prompt: get.prompt2("jieyue"), }); - 'step 1' - if(result.bool){ - player.logSkill('jieyue',result.targets); + ("step 1"); + if (result.bool) { + player.logSkill("jieyue", result.targets); player.discard(result.cards); - var target=result.targets[0]; - event.target=target; - target.chooseCard('将一张牌置于'+get.translation(player)+'的武将牌上,或令其弃置你的一张牌','he').set('ai',function(card){ - if(card.name=='du') return 20; - var player=_status.event.player; - if(get.attitude(player,_status.event.getParent().player)>0){ - return 8-get.value(card); - } - var nh=player.countCards('h'); - if(nh<=2){ - return 6-get.value(card); - } - if(nh<=3){ - return 2-get.value(card); - } - return 0; - }); - } - else{ + var target = result.targets[0]; + event.target = target; + target + .chooseCard( + "将一张牌置于" + get.translation(player) + "的武将牌上,或令其弃置你的一张牌", + "he" + ) + .set("ai", function (card) { + if (card.name == "du") return 20; + var player = _status.event.player; + if (get.attitude(player, _status.event.getParent().player) > 0) { + return 8 - get.value(card); + } + var nh = player.countCards("h"); + if (nh <= 2) { + return 6 - get.value(card); + } + if (nh <= 3) { + return 2 - get.value(card); + } + return 0; + }); + } else { event.finish(); } - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ - player.addToExpansion(result.cards,'give',target).gaintag.add('jieyue'); - } - else if(event.target.countCards('he')){ - player.discardPlayerCard(event.target,true); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + player.addToExpansion(result.cards, "give", target).gaintag.add("jieyue"); + } else if (event.target.countCards("he")) { + player.discardPlayerCard(event.target, true); } }, - ai:{expose:0.1}, - marktext:'节', - intro:{ - content:'expansion', - markcount:'expansion', + ai: { expose: 0.1 }, + marktext: "节", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:['jieyue_wuxie','jieyue_shan','jieyue_gain'], - subSkill:{ - wuxie:{ - audio:true, - enable:'chooseToUse', - filterCard:function(card){ - return get.color(card)=='black'; + group: ["jieyue_wuxie", "jieyue_shan", "jieyue_gain"], + subSkill: { + wuxie: { + audio: true, + enable: "chooseToUse", + filterCard: function (card) { + return get.color(card) == "black"; }, - viewAsFilter:function(player){ - return player.getExpansions('jieyue').length&&player.countCards('hs',{color:'black'})>0; + viewAsFilter: function (player) { + return ( + player.getExpansions("jieyue").length && + player.countCards("hs", { color: "black" }) > 0 + ); }, - position:'hs', - viewAs:{name:'wuxie'}, - prompt:'将一张黑色手牌当无懈可击使用', - check:function(card){ - return 8-get.value(card); + position: "hs", + viewAs: { name: "wuxie" }, + prompt: "将一张黑色手牌当无懈可击使用", + check: function (card) { + return 8 - get.value(card); }, }, - shan:{ - audio:true, - enable:['chooseToRespond','chooseToUse'], - filterCard:function(card){ - return get.color(card)=='red'; + shan: { + audio: true, + enable: ["chooseToRespond", "chooseToUse"], + filterCard: function (card) { + return get.color(card) == "red"; }, - position:'hs', - viewAs:{name:'shan'}, - viewAsFilter:function(player){ - return player.getExpansions('jieyue').length&&player.countCards('hs',{color:'red'})>0; + position: "hs", + viewAs: { name: "shan" }, + viewAsFilter: function (player) { + return ( + player.getExpansions("jieyue").length && + player.countCards("hs", { color: "red" }) > 0 + ); }, - prompt:'将一张红色手牌当闪使用或打出', - check:()=>1, - ai:{ - respondShan:true, - skillTagFilter:function(player){ - if(!player.getExpansions('jieyue').length||!player.countCards('hs',{color:'red'})) return false; + prompt: "将一张红色手牌当闪使用或打出", + check: () => 1, + ai: { + respondShan: true, + skillTagFilter: function (player) { + if ( + !player.getExpansions("jieyue").length || + !player.countCards("hs", { color: "red" }) + ) + return false; }, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0) return 0.8 + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) return 0.8; }, }, }, }, - gain:{ - audio:'jieyue', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.getExpansions('jieyue').length; + gain: { + audio: "jieyue", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("jieyue").length; }, - forced:true, - content:function(){ - var cards=player.getExpansions('jieyue'); - if(cards.length) player.gain(cards,'gain2'); + forced: true, + content: function () { + var cards = player.getExpansions("jieyue"); + if (cards.length) player.gain(cards, "gain2"); }, }, }, }, - jinjiu:{ - mod:{ - cardname:function(card,player){ - if(card.name=='jiu') return 'sha'; + jinjiu: { + mod: { + cardname: function (card, player) { + if (card.name == "jiu") return "sha"; }, }, - ai:{ - skillTagFilter:function(player){ - if(!player.countCards('h','jiu')) return false; + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", "jiu")) return false; }, - respondSha:true, + respondSha: true, }, - audio:2, - trigger:{player:['useCard1','respond']}, - firstDo:true, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&!event.skill&& - event.cards.length==1&&event.cards[0].name=='jiu'; + audio: 2, + trigger: { player: ["useCard1", "respond"] }, + firstDo: true, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + !event.skill && + event.cards.length == 1 && + event.cards[0].name == "jiu" + ); }, - content:function(){}, + content: function () {}, }, - xinxianzhen:{ - audio:'xianzhen', - inherit:'xianzhen', + xinxianzhen: { + audio: "xianzhen", + inherit: "xianzhen", }, - xinxianzhen2:{ - audio:'xianzhen', - audioname2:{ - ol_gaoshun:'rexianzhen', + xinxianzhen2: { + audio: "xianzhen", + audioname2: { + ol_gaoshun: "rexianzhen", }, - mod:{ - targetInRange:function(card,player,target){ - if(target==player.storage.xinxianzhen) return true; + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.xinxianzhen) return true; }, - cardUsableTarget:function(card,player,target){ - if(target==player.storage.xinxianzhen) return true; + cardUsableTarget: function (card, player, target) { + if (target == player.storage.xinxianzhen) return true; }, }, - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(arg.target!=player.storage.xinxianzhen) return false; + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.xinxianzhen) return false; }, - effect:{ - player:function(card,player,target,current,isLink){ - if(isLink||!player.storage.xinxianzhen) return; - if(target!=player.storage.xinxianzhen&&['sha','guohe','shunshou','huogong','juedou'].includes(card.name)){ - if(get.effect(player.storage.xinxianzhen,card,player,player)>0){ - return [1,2]; + effect: { + player: function (card, player, target, current, isLink) { + if (isLink || !player.storage.xinxianzhen) return; + if ( + target != player.storage.xinxianzhen && + ["sha", "guohe", "shunshou", "huogong", "juedou"].includes(card.name) + ) { + if (get.effect(player.storage.xinxianzhen, card, player, player) > 0) { + return [1, 2]; } } - } - } + }, + }, }, - trigger:{player:'useCard2'}, - filter:function(event,player){ - return player.storage.xinxianzhen&&player.storage.xinxianzhen.isIn()&& - (event.card.name=='sha'||get.type(event.card)=='trick')&& - event.targets&&event.targets.length==1&&!event.targets.includes(player.storage.xinxianzhen); + trigger: { player: "useCard2" }, + filter: function (event, player) { + return ( + player.storage.xinxianzhen && + player.storage.xinxianzhen.isIn() && + (event.card.name == "sha" || get.type(event.card) == "trick") && + event.targets && + event.targets.length == 1 && + !event.targets.includes(player.storage.xinxianzhen) + ); }, - check:function(event,player){ - return get.effect(player.storage.xinxianzhen,event.card,player,player)>0; + check: function (event, player) { + return get.effect(player.storage.xinxianzhen, event.card, player, player) > 0; }, - logTarget:function(event,player){ + logTarget: function (event, player) { return player.storage.xinxianzhen; }, - prompt2:(event,player)=>('令'+get.translation(player.storage.decadexianzhen2)+'也成为'+get.translation(event.card)+'的目标'), - content:function(){ - var target=player.storage.xinxianzhen; + prompt2: (event, player) => + "令" + + get.translation(player.storage.decadexianzhen2) + + "也成为" + + get.translation(event.card) + + "的目标", + content: function () { + var target = player.storage.xinxianzhen; trigger.targets.push(target); - game.log(target,'成为了',trigger.card,'的额外目标'); + game.log(target, "成为了", trigger.card, "的额外目标"); }, }, - xinxianzhen3:{ - charlotte:true, - mod:{ - cardEnabled:function(card){ - if(card.name=='sha') return false; + xinxianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; }, - ignoredHandcard:function(card,player){ - if(get.name(card)=='sha'){ + ignoredHandcard: function (card, player) { + if (get.name(card) == "sha") { return true; } }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&get.name(card)=='sha'){ + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && get.name(card) == "sha") { return false; } }, }, }, - xianzhen:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + xianzhen: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseToCompare(target); - "step 1" - if(result.bool){ - player.storage[event.name]=target; - player.addTempSkill(event.name+2); - } - else{ - player.addTempSkill(event.name+3); + ("step 1"); + if (result.bool) { + player.storage[event.name] = target; + player.addTempSkill(event.name + 2); + } else { + player.addTempSkill(event.name + 3); } }, - ai:{ - order:function(name,player){ - var cards=player.getCards('h'); - if(player.countCards('h','sha')==0){ + ai: { + order: function (name, player) { + var cards = player.getCards("h"); + if (player.countCards("h", "sha") == 0) { return 1; } - for(var i=0;i11&&get.value(cards[i])<7){ + for (var i = 0; i < cards.length; i++) { + if ( + cards[i].name != "sha" && + get.number(cards[i]) > 11 && + get.value(cards[i]) < 7 + ) { return 9; } } - return get.order({name:'sha'})-1; + return get.order({ name: "sha" }) - 1; }, - result:{ - player:function(player){ - if(player.countCards('h','sha')>0) return 0; - var num=player.countCards('h'); - if(num>player.hp) return 0; - if(num==1) return -2; - if(num==2) return -1; + result: { + player: function (player) { + if (player.countCards("h", "sha") > 0) return 0; + var num = player.countCards("h"); + if (num > player.hp) return 0; + if (num == 1) return -2; + if (num == 2) return -1; return -0.7; }, - target:function(player,target){ - var num=target.countCards('h'); - if(num==1) return -1; - if(num==2) return -0.7; - return -0.5 + target: function (player, target) { + var num = target.countCards("h"); + if (num == 1) return -1; + if (num == 2) return -0.7; + return -0.5; }, }, - threaten:1.3 - } + threaten: 1.3, + }, }, - xianzhen2:{ - charlotte:true, - mod:{ - targetInRange:function(card,player,target){ - if(target==player.storage.xianzhen) return true; + xianzhen2: { + charlotte: true, + mod: { + targetInRange: function (card, player, target) { + if (target == player.storage.xianzhen) return true; }, - cardUsableTarget:function(card,player,target){ - if(target==player.storage.xianzhen) return true; + cardUsableTarget: function (card, player, target) { + if (target == player.storage.xianzhen) return true; }, }, - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(arg.target!=player.storage.xianzhen) return false; + ai: { + unequip: true, + skillTagFilter: function (player, tag, arg) { + if (arg.target != player.storage.xianzhen) return false; }, - } + }, }, - xianzhen3:{ - charlotte:true, - mod:{ - cardEnabled:function(card){if(card.name=='sha') return false} - } + xianzhen3: { + charlotte: true, + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, }, - lihuo:{ - trigger:{player:'useCard1'}, - filter:function(event,player){ - if(event.card.name=='sha'&&!game.hasNature(event.card)) return true; + lihuo: { + trigger: { player: "useCard1" }, + filter: function (event, player) { + if (event.card.name == "sha" && !game.hasNature(event.card)) return true; return false; }, - audio:2, - audioname:['re_chengpu'], - check:function(event,player){ + audio: 2, + audioname: ["re_chengpu"], + check: function (event, player) { return false; }, - content:function(){ - game.setNature(trigger.card,'fire'); - var next=game.createEvent('lihuo_clear'); - next.player=player; - next.card=trigger.card; + content: function () { + game.setNature(trigger.card, "fire"); + var next = game.createEvent("lihuo_clear"); + next.player = player; + next.card = trigger.card; event.next.remove(next); - next.forceDie=true; + next.forceDie = true; trigger.after.push(next); - next.setContent(function(){ - if(player.isIn()&&player.getHistory('sourceDamage',function(evt){ - return evt.getParent(2)==event.parent; - }).length>0) player.loseHp(); - game.setNature(card,[],true); + next.setContent(function () { + if ( + player.isIn() && + player.getHistory("sourceDamage", function (evt) { + return evt.getParent(2) == event.parent; + }).length > 0 + ) + player.loseHp(); + game.setNature(card, [], true); }); }, - group:'lihuo2' + group: "lihuo2", }, - lihuo2:{ - trigger:{player:'useCard2'}, - filter:function(event,player){ - if(event.card.name!='sha'||!game.hasNature(event.card,'fire')) return false; - return game.hasPlayer(function(current){ - return !event.targets.includes(current)&&player.canUse(event.card,current); + lihuo2: { + trigger: { player: "useCard2" }, + filter: function (event, player) { + if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false; + return game.hasPlayer(function (current) { + return !event.targets.includes(current) && player.canUse(event.card, current); }); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('lihuo'),'为'+get.translation(trigger.card)+'增加一个目标',function(card,player,target){ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('card',trigger.card).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!_status.connectMode) game.delayx(); - event.target=result.targets[0]; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("lihuo"), + "为" + get.translation(trigger.card) + "增加一个目标", + function (card, player, target) { + return ( + !_status.event.sourcex.includes(target) && + player.canUse(_status.event.card, target) + ); + } + ) + .set("sourcex", trigger.targets) + .set("card", trigger.card) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !_status.connectMode) game.delayx(); + event.target = result.targets[0]; + } else { event.finish(); } - 'step 2' - player.logSkill('lihuo',event.target); + ("step 2"); + player.logSkill("lihuo", event.target); trigger.targets.push(event.target); }, }, - lihuo3:{ - trigger:{player:'useCardAfter'}, - vanish:true, - filter:function(event,player){ - return event.card.name=='sha'; + lihuo3: { + trigger: { player: "useCardAfter" }, + vanish: true, + filter: function (event, player) { + return event.card.name == "sha"; }, - forced:true, - audio:false, - content:function(){ + forced: true, + audio: false, + content: function () { player.loseHp(); - player.removeSkill('lihuo3'); - } + player.removeSkill("lihuo3"); + }, }, - chunlao:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - audio:2, - audioname:['xin_chengpu'], - filter:function(event,player){ - return player.countCards('h')>0&&(_status.connectMode||player.countCards('h','sha')>0)&&!player.getExpansions('chunlao').length; + chunlao: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + audioname: ["xin_chengpu"], + filter: function (event, player) { + return ( + player.countCards("h") > 0 && + (_status.connectMode || player.countCards("h", "sha") > 0) && + !player.getExpansions("chunlao").length + ); }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - content:function(){ - 'step 0' - player.chooseCard([1,Math.max(1,player.countCards('h','sha'))],get.prompt('chunlao'),{name:'sha'}).set('ai',function(){ - return 1; - }); - 'step 1' - if(result.bool){ - player.logSkill('chunlao'); - player.addToExpansion(result.cards,player,'giveAuto').gaintag.add('chunlao'); + content: function () { + "step 0"; + player + .chooseCard([1, Math.max(1, player.countCards("h", "sha"))], get.prompt("chunlao"), { + name: "sha", + }) + .set("ai", function () { + return 1; + }); + ("step 1"); + if (result.bool) { + player.logSkill("chunlao"); + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("chunlao"); } }, - ai:{ - effect:{ - player:function(card,player,target){ - if(_status.currentPhase!=player) return; - if(card.name=='sha'&&!player.needsToDiscard()&&!player.getExpansions('chunlao').length&&target.hp>1){ - return 'zeroplayertarget'; + ai: { + effect: { + player: function (card, player, target) { + if (_status.currentPhase != player) return; + if ( + card.name == "sha" && + !player.needsToDiscard() && + !player.getExpansions("chunlao").length && + target.hp > 1 + ) { + return "zeroplayertarget"; } - } + }, }, - threaten:1.4 + threaten: 1.4, }, - group:'chunlao2' + group: "chunlao2", }, - chunlao2:{ - enable:'chooseToUse', - filter:function(event,player){ - return event.type=='dying'&&event.dying&&event.dying.hp<=0&&player.getExpansions('chunlao').length>0; + chunlao2: { + enable: "chooseToUse", + filter: function (event, player) { + return ( + event.type == "dying" && + event.dying && + event.dying.hp <= 0 && + player.getExpansions("chunlao").length > 0 + ); }, - filterTarget:function(card,player,target){ - return target==_status.event.dying; + filterTarget: function (card, player, target) { + return target == _status.event.dying; }, - direct:true, - clearTime:true, - delay:false, - selectTarget:-1, - content:function(){ - "step 0" - player.chooseCardButton(get.translation('chunlao'),player.getExpansions('chunlao'),true); - "step 1" - if(result.bool){ - player.logSkill('chunlao',target); + direct: true, + clearTime: true, + delay: false, + selectTarget: -1, + content: function () { + "step 0"; + player.chooseCardButton( + get.translation("chunlao"), + player.getExpansions("chunlao"), + true + ); + ("step 1"); + if (result.bool) { + player.logSkill("chunlao", target); player.loseToDiscardpile(result.links); - event.type='dying'; - target.useCard({name:'jiu',isCard:true},target); + event.type = "dying"; + target.useCard({ name: "jiu", isCard: true }, target); } }, - ai:{ - order:6, - skillTagFilter:function(player){ - return player.getExpansions('chunlao').length>0; + ai: { + order: 6, + skillTagFilter: function (player) { + return player.getExpansions("chunlao").length > 0; }, - save:true, - result:{ - target:3 + save: true, + result: { + target: 3, }, - threaten:1.6 + threaten: 1.6, }, }, - chunlao2_old:{ - trigger:{global:'dying'}, + chunlao2_old: { + trigger: { global: "dying" }, //priority:6, - filter:function(event,player){ - return event.player.hp<=0&&player.storage.chunlao.length>0; + filter: function (event, player) { + return event.player.hp <= 0 && player.storage.chunlao.length > 0; }, - direct:true, - content:function(){ - "step 0" - var att=get.attitude(player,trigger.player); - player.chooseCardButton(get.prompt('chunlao',trigger.player),player.storage.chunlao).set('ai',function(button){ - if(_status.event.att>0) return 1; - return 0; - }).set('att',att); - "step 1" - if(result.bool){ - player.logSkill('chunlao',trigger.player); + direct: true, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.player); + player + .chooseCardButton(get.prompt("chunlao", trigger.player), player.storage.chunlao) + .set("ai", function (button) { + if (_status.event.att > 0) return 1; + return 0; + }) + .set("att", att); + ("step 1"); + if (result.bool) { + player.logSkill("chunlao", trigger.player); player.$throw(result.links); player.storage.chunlao.remove(result.links[0]); result.links[0].discard(); - player.syncStorage('chunlao'); - trigger.player.useCard({name:'jiu',isCard:true},trigger.player); - if(!player.storage.chunlao.length){ - player.unmarkSkill('chunlao'); - } - else{ - player.markSkill('chunlao'); + player.syncStorage("chunlao"); + trigger.player.useCard({ name: "jiu", isCard: true }, trigger.player); + if (!player.storage.chunlao.length) { + player.unmarkSkill("chunlao"); + } else { + player.markSkill("chunlao"); } } }, - ai:{ - expose:0.2 - } - }, - shenduan:{ - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + ai: { + expose: 0.2, }, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false) return; - var evt=event.getl(player); - for(var i=0;i 1 ? "中的一张牌" : "") + + "当做【兵粮寸断】对一名其他角色使用", + function (card, player, target) { + var cs = _status.event.cards; + for (var i = 0; i < cs.length; i++) { + if ( + player.canUse( + { name: "bingliang", cards: [cs[i]] }, + target, + false + ) + ) + return true; + } + return false; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "bingliang" }, player, player); + }) + .set("cards", cards); + } else { event.finish(); } - else{ - event.cards=cards; - } - 'step 1' - if(event.cards.length){ - player.chooseTarget(get.prompt('shenduan'),'将'+get.translation(event.cards)+(event.cards.length>1?'中的一张牌':'')+'当做【兵粮寸断】对一名其他角色使用',function(card,player,target){ - var cs=_status.event.cards; - for(var i=0;i 1 ? "中的一张牌" : "") + + "当做【兵粮寸断】对一名其他角色使用", + function (card, player, target) { + var cs = _status.event.cards; + for (var i = 0; i < cs.length; i++) { + if ( + player.canUse( + { name: "bingliang", cards: [cs[i]] }, + target, + false + ) + ) + return true; + } + return false; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "bingliang" }, player, player); + }) + .set("cards", cards); + } else { event.finish(); } - else{ - event.cards=cards; - } - 'step 1' - if(event.cards.length){ - player.chooseTarget(get.prompt('shenduan'),'将'+get.translation(event.cards)+(event.cards.length>1?'中的一张牌':'')+'当做【兵粮寸断】对一名其他角色使用',function(card,player,target){ - var cs=_status.event.cards; - for(var i=0;i0; }, - content:function(){ - 'step 0' - var att=get.attitude(player,trigger.player); - var nh=trigger.player.countCards('h'); - var eff=get.effect(trigger.player,{name:'sha',isCard:true},player,player); - if(player.inRange(trigger.player)||!player.canUse({name:'sha',isCard:true},trigger.player,false)) eff=0; - player.discardPlayerCard(get.prompt('yonglve',trigger.player),trigger.player,'j').set('ai',function(button){ - var name=button.link.viewAs||button.link.name; - var att=_status.event.att; - var nh=_status.event.nh; - var eff=_status.event.eff; - var trigger=_status.event.getTrigger(); - if(att>0&&eff>=0) return 1; - if(att>=0&&eff>0) return 1; - if(att>0&&(trigger.player.hp>=3||trigger.player.hasSkillTag('freeShan',false,{ - player:_status.event.player, - card:new lib.element.VCard({name:'sha',isCard:true}) - })||trigger.player.countCards('h','shan'))){ - if(name=='lebu'&&nh>trigger.player.hp) return 1; - if(name=='bingliang'&&nh 0; + }, + content: function () { + "step 0"; + var att = get.attitude(player, trigger.player); + var nh = trigger.player.countCards("h"); + var eff = get.effect(trigger.player, { name: "sha", isCard: true }, player, player); + if ( + player.inRange(trigger.player) || + !player.canUse({ name: "sha", isCard: true }, trigger.player, false) + ) + eff = 0; + player + .discardPlayerCard(get.prompt("yonglve", trigger.player), trigger.player, "j") + .set("ai", function (button) { + var name = button.link.viewAs || button.link.name; + var att = _status.event.att; + var nh = _status.event.nh; + var eff = _status.event.eff; + var trigger = _status.event.getTrigger(); + if (att > 0 && eff >= 0) return 1; + if (att >= 0 && eff > 0) return 1; + if ( + att > 0 && + (trigger.player.hp >= 3 || + trigger.player.hasSkillTag("freeShan", false, { + player: _status.event.player, + card: new lib.element.VCard({ name: "sha", isCard: true }), + }) || + trigger.player.countCards("h", "shan")) + ) { + if (name == "lebu" && nh > trigger.player.hp) return 1; + if (name == "bingliang" && nh < trigger.player.hp) return 1; + } + return 0; + }) + .set("att", att) + .set("nh", nh) + .set("eff", eff) + .set("logSkill", ["reyonglve", trigger.player]); + ("step 1"); + if (result.bool) { + if ( + !player.inRange(trigger.player) && + player.canUse({ name: "sha", isCard: true }, trigger.player, false) + ) { + player.useCard({ name: "sha", isCard: true }, trigger.player); + } else player.draw(); } }, }, - yonglve:{ - trigger:{global:'phaseJudgeBegin'}, - direct:true, - audio:2, - filter:function(event,player){ - return event.player!=player&&event.player.countCards('j')>0&&player.inRange(event.player); + yonglve: { + trigger: { global: "phaseJudgeBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return ( + event.player != player && + event.player.countCards("j") > 0 && + player.inRange(event.player) + ); }, - content:function(){ - 'step 0' - var att=get.attitude(player,trigger.player); - var nh=trigger.player.countCards('h'); - var eff=get.effect(trigger.player,{name:'sha',isCard:true},player,player); - if(!player.canUse({name:'sha',isCard:true},trigger.player)) eff=0; - player.discardPlayerCard(get.prompt('yonglve',trigger.player),trigger.player,'j').set('ai',function(button){ - var name=button.link.viewAs||button.link.name; - var att=_status.event.att; - var nh=_status.event.nh; - var eff=_status.event.eff; - var trigger=_status.event.getTrigger(); - if(att>0&&eff>=0) return 1; - if(att>=0&&eff>0) return 1; - if(att>0&&(trigger.player.hp>=3||trigger.player.hasSkillTag('freeShan',false,{ - player:_status.event.player, - card:new lib.element.VCard({name:'sha',isCard:true}) - })||trigger.player.countCards('h','shan'))){ - if(name=='lebu'&&nh>trigger.player.hp) return 1; - if(name=='bingliang'&&nh 0 && eff >= 0) return 1; + if (att >= 0 && eff > 0) return 1; + if ( + att > 0 && + (trigger.player.hp >= 3 || + trigger.player.hasSkillTag("freeShan", false, { + player: _status.event.player, + card: new lib.element.VCard({ name: "sha", isCard: true }), + }) || + trigger.player.countCards("h", "shan")) + ) { + if (name == "lebu" && nh > trigger.player.hp) return 1; + if (name == "bingliang" && nh < trigger.player.hp) return 1; + } + return 0; + }) + .set("att", att) + .set("nh", nh) + .set("eff", eff) + .set("logSkill", ["yonglve", trigger.player]); + ("step 1"); + if (result.bool) { + if (player.canUse({ name: "sha", isCard: true }, trigger.player)) { + event.related = player.useCard({ name: "sha", isCard: true }, trigger.player); } - return 0; - }).set('att',att).set('nh',nh).set('eff',eff).set('logSkill',['yonglve',trigger.player]); - 'step 1' - if(result.bool){ - if(player.canUse({name:'sha',isCard:true},trigger.player)){ - event.related=player.useCard({name:'sha',isCard:true},trigger.player); - } - } - else{ + } else { event.finish(); } - 'step 2' - if(!event.related||!game.hasPlayer2(function(current){ - return current.getHistory('damage',function(evt){ - return evt.getParent(2)==event.related; - }).length>0; - })){ + ("step 2"); + if ( + !event.related || + !game.hasPlayer2(function (current) { + return ( + current.getHistory("damage", function (evt) { + return evt.getParent(2) == event.related; + }).length > 0 + ); + }) + ) { player.draw(); } }, //group:'yonglve2' }, - yonglve2:{ - trigger:{source:'damage'}, - forced:true, - popup:false, - filter:function(event){ - return event.parent.skill=='yonglve'; + yonglve2: { + trigger: { source: "damage" }, + forced: true, + popup: false, + filter: function (event) { + return event.parent.skill == "yonglve"; + }, + content: function () { + player.storage.yonglve = true; }, - content:function(){ - player.storage.yonglve=true; - } }, - benxi:{ - audio:2, - trigger:{player:'useCard2'}, - forced:true, - filter:function(event,player){ + benxi: { + audio: 2, + trigger: { player: "useCard2" }, + forced: true, + filter: function (event, player) { return player.isPhaseUsing(); }, - content:function(){}, - mod:{ - globalFrom:function(from,to,distance){ - if(_status.currentPhase==from){ - return distance-from.countUsed(); + content: function () {}, + mod: { + globalFrom: function (from, to, distance) { + if (_status.currentPhase == from) { + return distance - from.countUsed(); } }, - selectTarget:function(card,player,range){ - if(_status.currentPhase==player){ - if(card.name=='sha'&&range[1]!=-1){ - if(!game.hasPlayer(function(current){ - return get.distance(player,current)>1; - })){ + selectTarget: function (card, player, range) { + if (_status.currentPhase == player) { + if (card.name == "sha" && range[1] != -1) { + if ( + !game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ) { range[1]++; } } } - } + }, }, - ai:{ - unequip:true, - skillTagFilter:function(player){ - if(game.hasPlayer(function(current){ - return get.distance(player,current)>1; - })){ + ai: { + unequip: true, + skillTagFilter: function (player) { + if ( + game.hasPlayer(function (current) { + return get.distance(player, current) > 1; + }) + ) { return false; } - } - } + }, + }, }, - sidi:{ - audio:2, - trigger:{global:'useCard'}, - filter:function(event,player){ - if(event.card.name!='shan') return false; - if(event.player==player) return true; - return _status.currentPhase==player; + sidi: { + audio: 2, + trigger: { global: "useCard" }, + filter: function (event, player) { + if (event.card.name != "shan") return false; + if (event.player == player) return true; + return _status.currentPhase == player; }, - frequent:true, - intro:{ - content:'expansion', - markcount:'expansion', + frequent: true, + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - content:function(){ - player.addToExpansion(get.cards(),'gain2').gaintag.add('sidi'); + content: function () { + player.addToExpansion(get.cards(), "gain2").gaintag.add("sidi"); }, - group:'sidi2' + group: "sidi2", }, - sidi2:{ - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - if(event.player==player||event.player.isDead()) return false; - if(!player.getExpansions('sidi').length) return false; + sidi2: { + trigger: { global: "phaseUseBegin" }, + filter: function (event, player) { + if (event.player == player || event.player.isDead()) return false; + if (!player.getExpansions("sidi").length) return false; return true; }, - check:function(event,player){ - if(get.attitude(player,event.player)>=0) return false; - if(event.player.getEquip('zhuge')) return false; - if(event.player.hasSkill('paoxiao')) return false; - var players=game.filterPlayer(); - for(var i=0;i0) break; + check: function (event, player) { + if (get.attitude(player, event.player) >= 0) return false; + if (event.player.getEquip("zhuge")) return false; + if (event.player.hasSkill("paoxiao")) return false; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (event.player.canUse("sha", players[i]) && get.attitude(player, players[i]) > 0) + break; } - if(i==players.length) return false; - var nh=event.player.countCards('h'); - var nsha=event.player.countCards('h','sha'); - if(nh<2) return false; - switch(nh){ + if (i == players.length) return false; + var nh = event.player.countCards("h"); + var nsha = event.player.countCards("h", "sha"); + if (nh < 2) return false; + switch (nh) { case 2: - if(nsha) return Math.random()<0.4; - return Math.random()<0.2; + if (nsha) return Math.random() < 0.4; + return Math.random() < 0.2; case 3: - if(nsha) return Math.random()<0.8; - return Math.random()<0.3; + if (nsha) return Math.random() < 0.8; + return Math.random() < 0.3; case 4: - if(nsha>1) return true; - if(nsha) return Math.random()<0.9; - return Math.random()<0.5; - default:return true; + if (nsha > 1) return true; + if (nsha) return Math.random() < 0.9; + return Math.random() < 0.5; + default: + return true; } }, - logTarget:'player', - content:function(){ - 'step 0' - var cards=player.getExpansions('sidi'); - if(cards.length==1){ - event.directbutton=cards[0]; + logTarget: "player", + content: function () { + "step 0"; + var cards = player.getExpansions("sidi"); + if (cards.length == 1) { + event.directbutton = cards[0]; + } else { + player.chooseCardButton("弃置一张“司敌”牌", cards, true); } - else{ - player.chooseCardButton('弃置一张“司敌”牌',cards,true); - } - 'step 1' + ("step 1"); var button; - if(event.directbutton){ - button=event.directbutton; + if (event.directbutton) { + button = event.directbutton; + } else if (result.bool && result.links && result.links.length) { + button = result.links[0]; } - else if(result.bool&&result.links&&result.links.length){ - button=result.links[0]; - } - if(button){ + if (button) { player.loseToDiscardpile(button); - trigger.player.addTempSkill('sidi3','phaseUseAfter'); - trigger.player.addMark('sidi3',1,false); - } - } - }, - sidi3:{ - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num-player.countMark('sidi3'); + trigger.player.addTempSkill("sidi3", "phaseUseAfter"); + trigger.player.addMark("sidi3", 1, false); } }, - onremove:true, }, - zhongyong:{ - audio:2, - trigger:{player:'shaMiss'}, - direct:true, - filter:function(event,player){ - return event.responded&&get.itemtype(event.responded.cards)=='cards'; + sidi3: { + mod: { + cardUsable: function (card, player, num) { + if (card.name == "sha") return num - player.countMark("sidi3"); + }, }, - content:function(){ - "step 0" - var cards=trigger.responded.cards; - event.cards=cards; - player.chooseTarget('忠勇:将'+get.translation(trigger.responded.cards)+'交给一名角色',function(card,player,target){ - return target!=_status.event.source; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(target.countCards('h','shan')&&target.countCards('h')>=2){ - att/=1.5; - } - return att; - }).set('source',trigger.target); - "step 1" - if(result.bool){ - player.logSkill('zhongyong',result.targets); - result.targets[0].gain(event.cards,'gain2'); - if(result.targets[0]==player){ + onremove: true, + }, + zhongyong: { + audio: 2, + trigger: { player: "shaMiss" }, + direct: true, + filter: function (event, player) { + return event.responded && get.itemtype(event.responded.cards) == "cards"; + }, + content: function () { + "step 0"; + var cards = trigger.responded.cards; + event.cards = cards; + player + .chooseTarget( + "忠勇:将" + get.translation(trigger.responded.cards) + "交给一名角色", + function (card, player, target) { + return target != _status.event.source; + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (target.countCards("h", "shan") && target.countCards("h") >= 2) { + att /= 1.5; + } + return att; + }) + .set("source", trigger.target); + ("step 1"); + if (result.bool) { + player.logSkill("zhongyong", result.targets); + result.targets[0].gain(event.cards, "gain2"); + if (result.targets[0] == player) { event.finish(); } - } - else{ + } else { event.finish(); } - "step 2" - player.chooseToUse('是否对'+get.translation(trigger.target)+'再使用一张杀?', - {name:'sha'},trigger.target,-1).set('addCount',false); - } - }, - xinzhongyong:{ - trigger:{player:'useCardAfter'}, - audio:'zhongyong', - direct:true, - filter:function(event,player){ - return event.card.name=='sha'; + ("step 2"); + player + .chooseToUse( + "是否对" + get.translation(trigger.target) + "再使用一张杀?", + { name: "sha" }, + trigger.target, + -1 + ) + .set("addCount", false); }, - content:function(){ - "step 0" - event.sha=trigger.cards.slice(0).filterInD(); - event.shan=[]; - game.countPlayer2(function(current){ - current.getHistory('useCard',function(evt){ - if(evt.card.name=='shan'&&evt.getParent(3)==trigger) event.shan.addArray(evt.cards); + }, + xinzhongyong: { + trigger: { player: "useCardAfter" }, + audio: "zhongyong", + direct: true, + filter: function (event, player) { + return event.card.name == "sha"; + }, + content: function () { + "step 0"; + event.sha = trigger.cards.slice(0).filterInD(); + event.shan = []; + game.countPlayer2(function (current) { + current.getHistory("useCard", function (evt) { + if (evt.card.name == "shan" && evt.getParent(3) == trigger) + event.shan.addArray(evt.cards); }); }); - event.shan.filterInD('d'); - if(!event.sha.length&&!event.shan.length) event.finish(); - player.chooseTarget(get.prompt2('xinzhongyong'),function(card,player,target){ - return !_status.event.source.includes(target)&&target!=player; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).set('source',trigger.targets); - "step 1" - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('xinzhongyong',target); - if(event.sha.length&&event.shan.length){ - player.chooseControl().set('choiceList',[ - '将'+get.translation(event.sha)+'交给'+get.translation(target), - '将'+get.translation(event.shan)+'交给'+get.translation(target), - ]).set('ai',function(){ - return _status.event.choice; - }).set('choice',function(){ - if(get.color(event.sha)!='black') return 0; - return 1; - }()); - } - else event._result={index:event.sha.length?0:1}; - } - else{ + event.shan.filterInD("d"); + if (!event.sha.length && !event.shan.length) event.finish(); + player + .chooseTarget(get.prompt2("xinzhongyong"), function (card, player, target) { + return !_status.event.source.includes(target) && target != player; + }) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("source", trigger.targets); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinzhongyong", target); + if (event.sha.length && event.shan.length) { + player + .chooseControl() + .set("choiceList", [ + "将" + get.translation(event.sha) + "交给" + get.translation(target), + "将" + get.translation(event.shan) + "交给" + get.translation(target), + ]) + .set("ai", function () { + return _status.event.choice; + }) + .set( + "choice", + (function () { + if (get.color(event.sha) != "black") return 0; + return 1; + })() + ); + } else event._result = { index: event.sha.length ? 0 : 1 }; + } else { event.finish(); } - "step 2" - var cards=result.index==0?event.sha:event.shan; - event.useSha=false; - target.gain(cards,'gain2'); - for(var i=0;i{ - game.addGlobalSkill('longyin_order'); + longyin: { + audio: 2, + shaRelated: true, + init: (player) => { + game.addGlobalSkill("longyin_order"); }, - onremove:(player)=>{ - if(!game.hasPlayer(current=>current.hasSkill('longyin'),true)) game.removeGlobalSkill('longyin_order'); + onremove: (player) => { + if (!game.hasPlayer((current) => current.hasSkill("longyin"), true)) + game.removeGlobalSkill("longyin_order"); }, - trigger:{global:'useCard'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.countCards('he')>0&&event.player.isPhaseUsing(); + trigger: { global: "useCard" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing() + ); }, - content:function(){ - 'step 0' - var go=false; - if(get.attitude(player,trigger.player)>0){ - if(get.color(trigger.card)=='red'){ - go=true; - } - else if(trigger.addCount===false||!trigger.player.isPhaseUsing()) go=false; - else if(!trigger.player.hasSkill('paoxiao')&& - !trigger.player.hasSkill('tanlin3')&& - !trigger.player.hasSkill('zhaxiang2')&& - !trigger.player.hasSkill('fengnu')&& - !trigger.player.getEquip('zhuge')){ - var nh=trigger.player.countCards('h'); - if(player==trigger.player){ - go=(player.countCards('h','sha')>0); - } - else if(nh>=4){ - go=true; - } - else if(player.countCards('h','sha')){ - if(nh==3){ - go=Math.random()<0.8; + content: function () { + "step 0"; + var go = false; + if (get.attitude(player, trigger.player) > 0) { + if (get.color(trigger.card) == "red") { + go = true; + } else if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false; + else if ( + !trigger.player.hasSkill("paoxiao") && + !trigger.player.hasSkill("tanlin3") && + !trigger.player.hasSkill("zhaxiang2") && + !trigger.player.hasSkill("fengnu") && + !trigger.player.getEquip("zhuge") + ) { + var nh = trigger.player.countCards("h"); + if (player == trigger.player) { + go = player.countCards("h", "sha") > 0; + } else if (nh >= 4) { + go = true; + } else if (player.countCards("h", "sha")) { + if (nh == 3) { + go = Math.random() < 0.8; + } else if (nh == 2) { + go = Math.random() < 0.5; } - else if(nh==2){ - go=Math.random()<0.5; - } - } - else if(nh>=3){ - if(nh==3){ - go=Math.random()<0.5; - } - else if(nh==2){ - go=Math.random()<0.2; + } else if (nh >= 3) { + if (nh == 3) { + go = Math.random() < 0.5; + } else if (nh == 2) { + go = Math.random() < 0.2; } } } } //AI停顿 - if(go&&!event.isMine()&&!event.isOnline()&&player.hasCard(function(card){ - return get.value(card)<6&&lib.filter.cardDiscardable(card,player,event.name); - },'he')){ + if ( + go && + !event.isMine() && + !event.isOnline() && + player.hasCard(function (card) { + return ( + get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name) + ); + }, "he") + ) { game.delayx(); } - var next=player.chooseToDiscard(get.prompt('longyin'),'弃置一张牌'+(get.color(trigger.card)=='red'?'并摸一张牌':'')+',令'+get.translation(trigger.player)+'本次使用的【杀】不计入使用次数','he'); - next.logSkill=['longyin',trigger.player]; - next.set('ai',function(card){ - if(_status.event.go){ - return 6-get.value(card); + var next = player.chooseToDiscard( + get.prompt("longyin"), + "弃置一张牌" + + (get.color(trigger.card) == "red" ? "并摸一张牌" : "") + + ",令" + + get.translation(trigger.player) + + "本次使用的【杀】不计入使用次数", + "he" + ); + next.logSkill = ["longyin", trigger.player]; + next.set("ai", function (card) { + if (_status.event.go) { + return 6 - get.value(card); } return 0; }); - next.set('go',go); - 'step 1' - if(result.bool){ - if(trigger.addCount!==false){ - trigger.addCount=false; + next.set("go", go); + ("step 1"); + if (result.bool) { + if (trigger.addCount !== false) { + trigger.addCount = false; trigger.player.getStat().card.sha--; } - if(get.color(trigger.card)=='red'){ + if (get.color(trigger.card) == "red") { player.draw(); } // player.logSkill('longyin',trigger.player); } }, - ai:{ - expose:0.2 + ai: { + expose: 0.2, }, - subSkill:{ - order:{ - mod:{ - aiOrder:(player,card,num)=>{ - if(num&&card.name==='sha'&&get.color(card)==='red'){ - let gp=game.findPlayer(current=>{ - return current.hasSkill('longyin')&¤t.hasCard(i=>true,'he'); + subSkill: { + order: { + mod: { + aiOrder: (player, card, num) => { + if (num && card.name === "sha" && get.color(card) === "red") { + let gp = game.findPlayer((current) => { + return ( + current.hasSkill("longyin") && current.hasCard((i) => true, "he") + ); }); - if(gp) return num+0.15*Math.sign(get.attitude(player,gp)); + if (gp) return num + 0.15 * Math.sign(get.attitude(player, gp)); } - } + }, }, - trigger:{player:'dieAfter'}, - filter:(event,player)=>{ - return !game.hasPlayer(current=>current.hasSkill('longyin'),true); + trigger: { player: "dieAfter" }, + filter: (event, player) => { + return !game.hasPlayer((current) => current.hasSkill("longyin"), true); }, - silent:true, - forceDie:true, - charlotte:true, - content:()=>{ - game.removeGlobalSkill('longyin_order'); - } - } - } + silent: true, + forceDie: true, + charlotte: true, + content: () => { + game.removeGlobalSkill("longyin_order"); + }, + }, + }, }, - jigong:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - check:function(event,player){ - var nh=player.countCards('h')-player.countCards('h',{type:'equip'}); - if(nh<=1) return true; - if(player.countCards('h','tao')) return false; - if(nh<=2) return Math.random()<0.7; - if(nh<=3) return Math.random()<0.4; + jigong: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + check: function (event, player) { + var nh = player.countCards("h") - player.countCards("h", { type: "equip" }); + if (nh <= 1) return true; + if (player.countCards("h", "tao")) return false; + if (nh <= 2) return Math.random() < 0.7; + if (nh <= 3) return Math.random() < 0.4; return false; }, - content:function(){ + content: function () { player.draw(2); - player.addTempSkill('jigong2'); - } + player.addTempSkill("jigong2"); + }, }, - jigong2:{ - mod:{ - maxHandcardBase:function(player,num){ - var damage=player.getStat().damage; - if(typeof damage=='number') return damage; + jigong2: { + mod: { + maxHandcardBase: function (player, num) { + var damage = player.getStat().damage; + if (typeof damage == "number") return damage; return 0; - } - } + }, + }, }, - shifei:{ - audio:2, - audioname:['re_guotufengji'], - enable:['chooseToRespond','chooseToUse'], - filter:function(event,player){ - if(!_status.currentPhase||event.shifei) return false; - if(!event.filterCard({name:'shan',isCard:true},player,event)) return false; - if(event.name!='chooseToUse'&&!lib.filter.cardRespondable({name:'shan',isCard:true},player,event)) return false; + shifei: { + audio: 2, + audioname: ["re_guotufengji"], + enable: ["chooseToRespond", "chooseToUse"], + filter: function (event, player) { + if (!_status.currentPhase || event.shifei) return false; + if (!event.filterCard({ name: "shan", isCard: true }, player, event)) return false; + if ( + event.name != "chooseToUse" && + !lib.filter.cardRespondable({ name: "shan", isCard: true }, player, event) + ) + return false; return true; }, - delay:false, - checkx:function(player){ - if(get.attitude(player,_status.currentPhase)>0) return true; - var nh=_status.currentPhase.countCards('h')+1; - var players=game.filterPlayer(); - for(var i=0;i=nh){ - if(!player.countCards('h','shan')||get.attitude(player,players[i])<=0) return true; + delay: false, + checkx: function (player) { + if (get.attitude(player, _status.currentPhase) > 0) return true; + var nh = _status.currentPhase.countCards("h") + 1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].countCards("h") >= nh) { + if (!player.countCards("h", "shan") || get.attitude(player, players[i]) <= 0) + return true; } } return false; }, - content:function(){ - 'step 0' - player.line(_status.currentPhase,'green'); + content: function () { + "step 0"; + player.line(_status.currentPhase, "green"); _status.currentPhase.draw(); - 'step 1' - if(_status.currentPhase.isMaxHandcard(true)){ + ("step 1"); + if (_status.currentPhase.isMaxHandcard(true)) { event.finish(); - var evt=event.getParent(2); - evt.set('shifei',true); + var evt = event.getParent(2); + evt.set("shifei", true); evt.goto(0); return; } - var targets=game.filterPlayer(function(current){ + var targets = game.filterPlayer(function (current) { return current.isMaxHandcard(); - }) - if(targets.length==1){ - event.onlytarget=targets[0]; - } - else if(targets.length){ - player.chooseTarget('选择一名角色弃置其一张牌',true,function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }).set('targets',targets); - } - else{ + }); + if (targets.length == 1) { + event.onlytarget = targets[0]; + } else if (targets.length) { + player + .chooseTarget("选择一名角色弃置其一张牌", true, function (card, player, target) { + return _status.event.targets.includes(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }) + .set("targets", targets); + } else { event.finish(); } - 'step 2' - var evt=event.getParent(2); + ("step 2"); + var evt = event.getParent(2); var target; - if(event.onlytarget){ - target=event.onlytarget; + if (event.onlytarget) { + target = event.onlytarget; + } else if (result.targets && result.targets.length) { + target = result.targets[0]; } - else if(result.targets&&result.targets.length){ - target=result.targets[0]; - } - if(target){ - player.line(target,'green'); - player.discardPlayerCard(target,'he',true); - evt.result={bool:true,card:{name:'shan',isCard:true},cards:[]}; + if (target) { + player.line(target, "green"); + player.discardPlayerCard(target, "he", true); + evt.result = { bool: true, card: { name: "shan", isCard: true }, cards: [] }; evt.redo(); - } - else{ - evt.set('shifei',true); + } else { + evt.set("shifei", true); evt.goto(0); } }, - ai:{ - respondShan:true, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0){ - var nh=player.countCards('h'); - var players=game.filterPlayer(); - for(var i=0;inh) return 0.4; + ai: { + respondShan: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0) { + var nh = player.countCards("h"); + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i].countCards("h") > nh) return 0.4; } } - } - }, - order:8, - result:{ - player:function(player){ - return lib.skill.shifei.checkx(player)?1:0; }, }, - } - }, - huaiyi:{ - audio:2, - enable:'phaseUse', - usable:1, - delay:false, - filter:function(event,player){ - return player.countCards('h',{color:'red'})&&player.countCards('h',{color:'black'}); + order: 8, + result: { + player: function (player) { + return lib.skill.shifei.checkx(player) ? 1 : 0; + }, + }, }, - content:function(){ - 'step 0' + }, + huaiyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + delay: false, + filter: function (event, player) { + return ( + player.countCards("h", { color: "red" }) && player.countCards("h", { color: "black" }) + ); + }, + content: function () { + "step 0"; player.showHandcards(); - 'step 1' - player.chooseControl('红色','黑色').set('ai',function(){ - var player=_status.event.player; - if(player.countCards('h',{color:'red'})==1&& - player.countCards('h',{color:'black'})>1) return '红色'; - return '黑色'; + ("step 1"); + player.chooseControl("红色", "黑色").set("ai", function () { + var player = _status.event.player; + if ( + player.countCards("h", { color: "red" }) == 1 && + player.countCards("h", { color: "black" }) > 1 + ) + return "红色"; + return "黑色"; }); - 'step 2' - event.control=result.control; + ("step 2"); + event.control = result.control; var cards; - if(event.control=='红色'){ - cards=player.getCards('h',{color:'red'}); - } - else{ - cards=player.getCards('h',{color:'black'}); + if (event.control == "红色") { + cards = player.getCards("h", { color: "red" }); + } else { + cards = player.getCards("h", { color: "black" }); } player.discard(cards); - event.num=cards.length; - 'step 3' - player.chooseTarget('请选择至多'+get.cnNumber(event.num)+'名有牌的其他角色,获得这些角色的各一张牌。',[1,event.num],function(card,player,target){ - return target!=player&&target.countCards('he')>0; - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)+0.5; - }); - 'step 4' - if(result.bool&&result.targets){ - player.line(result.targets,'green'); - event.targets=result.targets; + event.num = cards.length; + ("step 3"); + player + .chooseTarget( + "请选择至多" + + get.cnNumber(event.num) + + "名有牌的其他角色,获得这些角色的各一张牌。", + [1, event.num], + function (card, player, target) { + return target != player && target.countCards("he") > 0; + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) + 0.5; + }); + ("step 4"); + if (result.bool && result.targets) { + player.line(result.targets, "green"); + event.targets = result.targets; event.targets.sort(lib.sort.seat); - event.gained=0; - } - else{ + event.gained = 0; + } else { event.finish(); } - 'step 5' - if(player.isIn()&&event.targets.length){ - player.gainPlayerCard(event.targets.shift(),'he',true); + ("step 5"); + if (player.isIn() && event.targets.length) { + player.gainPlayerCard(event.targets.shift(), "he", true); + } else event.finish(); + ("step 6"); + if (result.bool) { + event.gained += result.cards.length; } - else event.finish(); - 'step 6' - if(result.bool){ - event.gained+=result.cards.length; - } - if(event.targets.length) event.goto(5); - 'step 7' - if(event.gained>1) player.loseHp(); + if (event.targets.length) event.goto(5); + ("step 7"); + if (event.gained > 1) player.loseHp(); }, - ai:{ - order:function(item,player){ - if(player.countCards('h',{color:'red'})==1) return 10; - if(player.countCards('h',{color:'black'})==1) return 10; + ai: { + order: function (item, player) { + if (player.countCards("h", { color: "red" }) == 1) return 10; + if (player.countCards("h", { color: "black" }) == 1) return 10; return 1; }, - result:{ - player:1 - } - } + result: { + player: 1, + }, + }, }, - yaoming:{ - audio:2, - trigger:{player:'damageEnd',source:'damageSource'}, - direct:true, - filter:function(event,player){ - if(player.hasSkill('yaoming2')) return false; - var nh=player.countCards('h'); - return game.hasPlayer(function(current){ - return current.countCards('h')!=nh; + yaoming: { + audio: 2, + trigger: { player: "damageEnd", source: "damageSource" }, + direct: true, + filter: function (event, player) { + if (player.hasSkill("yaoming2")) return false; + var nh = player.countCards("h"); + return game.hasPlayer(function (current) { + return current.countCards("h") != nh; }); }, - content:function(){ - 'step 0' - var nh=player.countCards('h'); - player.chooseTarget(get.prompt2('yaoming'),function(card,player,target){ - return _status.event.nh!=target.countCards('h'); - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(target.countCards('h')>_status.event.nh) return -att; - return att; - }).set('nh',nh); - 'step 1' - if(result.bool){ - player.logSkill('yaoming',result.targets); - player.addTempSkill('yaoming2'); - var target=result.targets[0]; - if(target.countCards('h') _status.event.nh) return -att; + return att; + }) + .set("nh", nh); + ("step 1"); + if (result.bool) { + player.logSkill("yaoming", result.targets); + player.addTempSkill("yaoming2"); + var target = result.targets[0]; + if (target.countCards("h") < player.countCards("h")) { target.draw(); - } - else{ - target.discard(target.getCards('h').randomGet()); + } else { + target.discard(target.getCards("h").randomGet()); } } }, - ai:{ - expose:0.2 - } - }, - yaoming2:{}, - anguo:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('e')>0; + ai: { + expose: 0.2, }, - content:function(){ - 'step 0' - player.choosePlayerCard(target,'e',true); - 'step 1' - if(result.links){ - var num=0,players=game.filterPlayer(); - for(var i=0;i 0; + }, + content: function () { + "step 0"; + player.choosePlayerCard(target, "e", true); + ("step 1"); + if (result.links) { + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (target.inRange(players[i])) { num++; } } - event.num=num; - target.gain(result.links,'gain2'); - } - else{ + event.num = num; + target.gain(result.links, "gain2"); + } else { event.finish(); } - 'step 2' - var num2=0,players=game.filterPlayer(); - for(var i=0;inum2){ + if (event.num > num2) { player.draw(); } }, - ai:{ - order:7, - result:{ - target:function(player,target){ - if(target.hasSkillTag('noe')) return 1; - if(target.getEquip(1)||target.getEquip(4)) return -1; - if(target.getEquip(2)) return -0.7; + ai: { + order: 7, + result: { + target: function (player, target) { + if (target.hasSkillTag("noe")) return 1; + if (target.getEquip(1) || target.getEquip(4)) return -1; + if (target.getEquip(2)) return -0.7; return -0.5; - } - } - } + }, + }, + }, }, - reyanzhu:{ - enable:'phaseUse', - audio:2, - usable:1, - filterTarget:lib.filter.notMe, - derivation:['reyanzhu_rewrite','rexingxue_rewrite'], - prompt:function(){ - return lib.translate[(_status.event.player.storage.reyanzhu?'reyanzhu_rewrite':'reyanzhu')+'_info']; + reyanzhu: { + enable: "phaseUse", + audio: 2, + usable: 1, + filterTarget: lib.filter.notMe, + derivation: ["reyanzhu_rewrite", "rexingxue_rewrite"], + prompt: function () { + return lib.translate[ + (_status.event.player.storage.reyanzhu ? "reyanzhu_rewrite" : "reyanzhu") + "_info" + ]; }, - content:function(){ - 'step 0' - if(player.storage.reyanzhu||!target.countCards('e')) event._result={index:1}; - else target.chooseControl().set('prompt',get.translation(player)+'发动了【宴诛】,请选择一项').set('choiceList',[ - '将装备区内的所有牌交给'+get.translation(player)+'并令其修改技能', - '弃置一张牌,并令下次受到的伤害+1直到下回合开始', - ]).set('ai',function(){ - if(_status.event.player.countCards('e')>=3) return 1; - return 0; - }); - 'step 1' - if(result.index==0){ - target.give(target.getCards('e'),player); - player.storage.reyanzhu=true; - } - else{ - target.addTempSkill('reyanzhu2',{player:'phaseBegin'}); - target.addMark('reyanzhu2',1,false); - if(!player.storage.reyanzhu&&target.countCards('he')>0) target.chooseToDiscard('he',true); + content: function () { + "step 0"; + if (player.storage.reyanzhu || !target.countCards("e")) event._result = { index: 1 }; + else + target + .chooseControl() + .set("prompt", get.translation(player) + "发动了【宴诛】,请选择一项") + .set("choiceList", [ + "将装备区内的所有牌交给" + get.translation(player) + "并令其修改技能", + "弃置一张牌,并令下次受到的伤害+1直到下回合开始", + ]) + .set("ai", function () { + if (_status.event.player.countCards("e") >= 3) return 1; + return 0; + }); + ("step 1"); + if (result.index == 0) { + target.give(target.getCards("e"), player); + player.storage.reyanzhu = true; + } else { + target.addTempSkill("reyanzhu2", { player: "phaseBegin" }); + target.addMark("reyanzhu2", 1, false); + if (!player.storage.reyanzhu && target.countCards("he") > 0) + target.chooseToDiscard("he", true); } }, - ai:{ - order:6, - result:{ - target:function(player,target){ - if(player.storage.reyanzhu) return -1; - var ne=target.countCards('e'); - if(!ne) return -2; - if(ne>=2) return -ne; + ai: { + order: 6, + result: { + target: function (player, target) { + if (player.storage.reyanzhu) return -1; + var ne = target.countCards("e"); + if (!ne) return -2; + if (ne >= 2) return -ne; return 0; - } - } + }, + }, }, }, - reyanzhu2:{ - trigger:{player:'damageBegin3'}, - forced:true, - onremove:true, - content:function(){ - trigger.num+=player.countMark('reyanzhu2'); - game.log(player,'受到的伤害+'+player.countMark('reyanzhu2')); - player.removeSkill('reyanzhu2'); + reyanzhu2: { + trigger: { player: "damageBegin3" }, + forced: true, + onremove: true, + content: function () { + trigger.num += player.countMark("reyanzhu2"); + game.log(player, "受到的伤害+" + player.countMark("reyanzhu2")); + player.removeSkill("reyanzhu2"); }, - intro:{ - content:'下次受到的伤害+#直到下回合开始', + intro: { + content: "下次受到的伤害+#直到下回合开始", }, }, - rexingxue:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - audio:2, - filter:function(event,player){ - return (player.storage.reyanzhu?player.maxHp:player.hp)>0; + rexingxue: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return (player.storage.reyanzhu ? player.maxHp : player.hp) > 0; }, - content:function(){ - 'step 0' - player.chooseTarget([1,player.storage.reyanzhu?player.maxHp:player.hp],get.prompt('rexingxue'),'令所有目标角色依次摸一张牌,然后所有手牌数大于体力值的目标角色依次将一张牌置于牌堆顶').set('ai',function(target){ - var att=get.attitude(player,target); - if(target.countCards('h')==target.hp-1) att*=2; - return att; - }); - 'step 1' - if(result.bool){ - event.targets=result.targets.sortBySeat(); - player.logSkill('rexingxue',event.targets); + content: function () { + "step 0"; + player + .chooseTarget( + [1, player.storage.reyanzhu ? player.maxHp : player.hp], + get.prompt("rexingxue"), + "令所有目标角色依次摸一张牌,然后所有手牌数大于体力值的目标角色依次将一张牌置于牌堆顶" + ) + .set("ai", function (target) { + var att = get.attitude(player, target); + if (target.countCards("h") == target.hp - 1) att *= 2; + return att; + }); + ("step 1"); + if (result.bool) { + event.targets = result.targets.sortBySeat(); + player.logSkill("rexingxue", event.targets); game.asyncDraw(result.targets); - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); game.delay(); - 'step 3' - if(event.targets.length){ - event.target=event.targets.shift(); - if(event.target.isDead()) event.redo(); - } - else event.finish(); - 'step 4' - if(target.isIn()&&target.countCards('h')&&target.countCards('h')>target.hp) target.chooseCard('he',true,'将一张牌置于牌堆顶'); + ("step 3"); + if (event.targets.length) { + event.target = event.targets.shift(); + if (event.target.isDead()) event.redo(); + } else event.finish(); + ("step 4"); + if (target.isIn() && target.countCards("h") && target.countCards("h") > target.hp) + target.chooseCard("he", true, "将一张牌置于牌堆顶"); else event.goto(3); - 'step 5' - if(result&&result.cards){ - event.card=result.cards[0]; - target.lose(result.cards,ui.cardPile,'insert'); - game.log(target,'将',(get.position(event.card)=='h'?'一张牌':event.card),'置于牌堆顶'); - game.broadcastAll(function(player){ - var cardx=ui.create.card(); - cardx.classList.add('infohidden'); - cardx.classList.add('infoflip'); - player.$throw(cardx,1000,'nobroadcast'); - },target); + ("step 5"); + if (result && result.cards) { + event.card = result.cards[0]; + target.lose(result.cards, ui.cardPile, "insert"); + game.log( + target, + "将", + get.position(event.card) == "h" ? "一张牌" : event.card, + "置于牌堆顶" + ); + game.broadcastAll(function (player) { + var cardx = ui.create.card(); + cardx.classList.add("infohidden"); + cardx.classList.add("infoflip"); + player.$throw(cardx, 1000, "nobroadcast"); + }, target); } event.goto(3); }, }, - rezhaofu:{ - unique:true, - global:'rezhaofu2', - zhuSkill:true + rezhaofu: { + unique: true, + global: "rezhaofu2", + zhuSkill: true, }, - rezhaofu2:{ - mod:{ - inRangeOf:function(from,to){ - if(from.group!='wu') return; - var players=game.filterPlayer(); - for(var i=0;i0&&target!=player; + yanzhu: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.countCards("he") > 0 && target != player; }, - content:function(){ - 'step 0' - if(target.countCards('e')){ - target.chooseBool('是否将装备区内的所有牌交给'+get.translation(player)+'?').set('ai',function(){ - if(_status.event.player.countCards('e')>=3) return false; - return true; - }); - } - else{ - target.chooseToDiscard(true,'he'); + content: function () { + "step 0"; + if (target.countCards("e")) { + target + .chooseBool("是否将装备区内的所有牌交给" + get.translation(player) + "?") + .set("ai", function () { + if (_status.event.player.countCards("e") >= 3) return false; + return true; + }); + } else { + target.chooseToDiscard(true, "he"); event.finish(); } - 'step 1' - if(result.bool){ - var es=target.getCards('e'); - target.give(es,player,'give'); - player.removeSkills('yanzhu'); - } - else{ - target.chooseToDiscard(true,'he'); + ("step 1"); + if (result.bool) { + var es = target.getCards("e"); + target.give(es, player, "give"); + player.removeSkills("yanzhu"); + } else { + target.chooseToDiscard(true, "he"); } }, - ai:{ - order:6, - result:{ - target:function(player,target){ - var ne=target.countCards('e'); - if(!ne) return -2; - if(ne>=2) return -ne; + ai: { + order: 6, + result: { + target: function (player, target) { + var ne = target.countCards("e"); + if (!ne) return -2; + if (ne >= 2) return -ne; return 0; - } - } - } - }, - shizhi:{ - mod:{ - cardname:function(card,player,name){ - if(card.name=='shan'&&player.hp==1) return 'sha'; + }, }, }, - ai:{ - skillTagFilter:function(player){ - if(!player.countCards('h','shan')) return false; - if(player.hp!=1) return false; - }, - respondSha:true, - }, - audio:2, - audioname:['xin_zhangyi'], - trigger:{player:['useCard1','respond']}, - firstDo:true, - forced:true, - filter:function(event,player){ - return event.card.name=='sha'&&!event.skill&& - event.cards.length==1&&event.cards[0].name=='shan'; - }, - content:function(){}, }, - wurong:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('h')>0; + shizhi: { + mod: { + cardname: function (card, player, name) { + if (card.name == "shan" && player.hp == 1) return "sha"; + }, }, - filterTarget:function(card,player,target){ - return target.countCards('h')>0&&target!=player; + ai: { + skillTagFilter: function (player) { + if (!player.countCards("h", "shan")) return false; + if (player.hp != 1) return false; + }, + respondSha: true, }, - content:function(){ - "step 0" - if(target.countCards('h')==0||player.countCards('h')==0){ + audio: 2, + audioname: ["xin_zhangyi"], + trigger: { player: ["useCard1", "respond"] }, + firstDo: true, + forced: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + !event.skill && + event.cards.length == 1 && + event.cards[0].name == "shan" + ); + }, + content: function () {}, + }, + wurong: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + filterTarget: function (card, player, target) { + return target.countCards("h") > 0 && target != player; + }, + content: function () { + "step 0"; + if (target.countCards("h") == 0 || player.countCards("h") == 0) { event.finish(); return; } - "step 1" - var sendback=function(){ - if(_status.event!=event){ - return function(){ - event.resultOL=_status.event.resultOL; + ("step 1"); + var sendback = function () { + if (_status.event != event) { + return function () { + event.resultOL = _status.event.resultOL; }; } }; - if(player.isOnline()){ + if (player.isOnline()) { player.wait(sendback); - event.ol=true; - player.send(function(){ - game.me.chooseCard(true).set('glow_result',true).ai=function(){ + event.ol = true; + player.send(function () { + game.me.chooseCard(true).set("glow_result", true).ai = function () { return Math.random(); }; game.resume(); }); - } - else{ - event.localPlayer=true; - player.chooseCard(true).set('glow_result',true).ai=function(){ + } else { + event.localPlayer = true; + player.chooseCard(true).set("glow_result", true).ai = function () { return Math.random(); }; } - if(target.isOnline()){ + if (target.isOnline()) { target.wait(sendback); - event.ol=true; - target.send(function(){ - var rand=Math.random()<0.4; - game.me.chooseCard(true).set('glow_result',true).ai=function(card){ - if(rand) return card.name=='shan'?1:0; - return card.name=='shan'?0:1; + event.ol = true; + target.send(function () { + var rand = Math.random() < 0.4; + game.me.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; }; game.resume(); }); + } else { + event.localTarget = true; } - else{ - event.localTarget=true; + ("step 2"); + if (event.localPlayer) { + event.card1 = result.cards[0]; } - "step 2" - if(event.localPlayer){ - event.card1=result.cards[0]; - } - if(event.localTarget){ - var rand=Math.random()<0.4; - target.chooseCard(true).set('glow_result',true).ai=function(card){ - if(rand) return card.name=='shan'?1:0; - return card.name=='shan'?0:1; + if (event.localTarget) { + var rand = Math.random() < 0.4; + target.chooseCard(true).set("glow_result", true).ai = function (card) { + if (rand) return card.name == "shan" ? 1 : 0; + return card.name == "shan" ? 0 : 1; }; } - "step 3" - if(event.localTarget){ - event.card2=result.cards[0]; + ("step 3"); + if (event.localTarget) { + event.card2 = result.cards[0]; } - if(!event.resultOL&&event.ol){ + if (!event.resultOL && event.ol) { game.pause(); } - "step 4" - try{ - if(!event.card1) event.card1=event.resultOL[player.playerid].cards[0]; - if(!event.card2) event.card2=event.resultOL[target.playerid].cards[0]; - if(!event.card1||!event.card2){ - throw('err'); + ("step 4"); + try { + if (!event.card1) event.card1 = event.resultOL[player.playerid].cards[0]; + if (!event.card2) event.card2 = event.resultOL[target.playerid].cards[0]; + if (!event.card1 || !event.card2) { + throw "err"; } - } - catch(e){ + } catch (e) { console.log(e); event.finish(); return; } - game.broadcastAll(function(card1,card2){ - card1.classList.remove('glow'); - card2.classList.remove('glow'); - },event.card1,event.card2); - "step 5" - game.broadcastAll(function(){ - ui.arena.classList.add('thrownhighlight'); + game.broadcastAll( + function (card1, card2) { + card1.classList.remove("glow"); + card2.classList.remove("glow"); + }, + event.card1, + event.card2 + ); + ("step 5"); + game.broadcastAll(function () { + ui.arena.classList.add("thrownhighlight"); }); - game.addVideo('thrownhighlight1'); - player.$compare(event.card1,target,event.card2); + game.addVideo("thrownhighlight1"); + player.$compare(event.card1, target, event.card2); game.delay(4); - "step 6" - var next=game.createEvent('showCards'); - next.player=player; - next.cards=[event.card1]; - next.setContent('emptyEvent'); - game.log(player,'展示了',event.card1); - "step 7" - var next=game.createEvent('showCards'); - next.player=target; - next.cards=[event.card2]; - next.setContent('emptyEvent'); - game.log(target,'展示了',event.card2); - "step 8" - var name1=get.name(event.card1); - var name2=get.name(event.card2); - if(name1=='sha'&&name2!='shan'){ - player.discard(event.card1).set('animate',false); + ("step 6"); + var next = game.createEvent("showCards"); + next.player = player; + next.cards = [event.card1]; + next.setContent("emptyEvent"); + game.log(player, "展示了", event.card1); + ("step 7"); + var next = game.createEvent("showCards"); + next.player = target; + next.cards = [event.card2]; + next.setContent("emptyEvent"); + game.log(target, "展示了", event.card2); + ("step 8"); + var name1 = get.name(event.card1); + var name2 = get.name(event.card2); + if (name1 == "sha" && name2 != "shan") { + player.discard(event.card1).set("animate", false); target.$gain2(event.card2); - var clone=event.card1.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); - game.addVideo('deletenode',player,get.cardsInfo([clone])); + game.addVideo("deletenode", player, get.cardsInfo([clone])); } - game.broadcast(function(card){ - var clone=card.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); } - },event.card1); - target.damage('nocard'); - } - else if(name1!='sha'&&name2=='shan'){ - player.discard(event.card1).set('animate',false); + }, event.card1); + target.damage("nocard"); + } else if (name1 != "sha" && name2 == "shan") { + player.discard(event.card1).set("animate", false); target.$gain2(event.card2); - var clone=event.card1.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + var clone = event.card1.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); - game.addVideo('deletenode',player,get.cardsInfo([clone])); + game.addVideo("deletenode", player, get.cardsInfo([clone])); } - game.broadcast(function(card){ - var clone=card.clone; - if(clone){ - clone.style.transition='all 0.5s'; - clone.style.transform='scale(1.2)'; + game.broadcast(function (card) { + var clone = card.clone; + if (clone) { + clone.style.transition = "all 0.5s"; + clone.style.transform = "scale(1.2)"; clone.delete(); } - },event.card1); - player.gainPlayerCard(target,true,'he'); - } - else{ + }, event.card1); + player.gainPlayerCard(target, true, "he"); + } else { player.$gain2(event.card1); target.$gain2(event.card2); } - game.broadcastAll(function(){ - ui.arena.classList.remove('thrownhighlight'); + game.broadcastAll(function () { + ui.arena.classList.remove("thrownhighlight"); }); - game.addVideo('thrownhighlight2'); + game.addVideo("thrownhighlight2"); + }, + ai: { + order: 6, + result: { + target: -1, + }, }, - ai:{ - order:6, - result:{ - target:-1, - } - } }, - zhanjue:{ - audio:2, - enable:'phaseUse', - filterCard:true, - selectCard:-1, - position:'h', - filter:function(event,player){ - if(player.getStat().skill.zhanjue_draw&&player.getStat().skill.zhanjue_draw>=2) return false; - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i=0;i= 2) + return false; + var hs = player.getCards("h"); + if (!hs.length) return false; + for (var i = 0; i < hs.length; i++) { + var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player); + if (mod2 === false) return false; } return true; }, - viewAs:{name:'juedou'}, - group:['zhanjue4'], - ai:{ - damage:true, - order:1, - effect:{ - player:function(card,player,target){ - if(_status.event.skill=='zhanjue'){ - if(player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card, - },true)) return; - if(player.countCards('h')>=3||target.countCards('h')>=3) return 'zeroplayertarget'; - if(player.countCards('h','tao')) return 'zeroplayertarget'; - if(target.countCards('h','sha')>1) return 'zeroplayertarget'; + viewAs: { name: "juedou" }, + group: ["zhanjue4"], + ai: { + damage: true, + order: 1, + effect: { + player: function (card, player, target) { + if (_status.event.skill == "zhanjue") { + if ( + player.hasSkillTag( + "directHit_ai", + true, + { + target: target, + card: card, + }, + true + ) + ) + return; + if (player.countCards("h") >= 3 || target.countCards("h") >= 3) + return "zeroplayertarget"; + if (player.countCards("h", "tao")) return "zeroplayertarget"; + if (target.countCards("h", "sha") > 1) return "zeroplayertarget"; } - } + }, + }, + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + player.countSkill("zhanjue_draw") < 2 && + player.hasCard((card) => get.name(card) != "tao", "h") + ); }, - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('zhanjue_draw')<2&&player.hasCard((card)=>get.name(card)!='tao','h'); - } - } - }, - zhanjue2:{ - audio:false, - trigger:{player:'phaseBefore'}, - silent:true, - content:function(){ - player.storage.zhanjue=0; - } - }, - zhanjue3:{ - audio:false, - trigger:{player:'damageAfter',source:'damageAfter'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.parent.skill=='zhanjue'; }, - content:function(){ - trigger.player.addTempSkill('zhanjue5'); - } }, - zhanjue4:{ - audio:false, - trigger:{player:'useCardAfter'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.skill=='zhanjue'; + zhanjue2: { + audio: false, + trigger: { player: "phaseBefore" }, + silent: true, + content: function () { + player.storage.zhanjue = 0; }, - content:function(){ - "step 0" - var stat=player.getStat().skill; - if(!stat.zhanjue_draw) stat.zhanjue_draw=0; + }, + zhanjue3: { + audio: false, + trigger: { player: "damageAfter", source: "damageAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.parent.skill == "zhanjue"; + }, + content: function () { + trigger.player.addTempSkill("zhanjue5"); + }, + }, + zhanjue4: { + audio: false, + trigger: { player: "useCardAfter" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "zhanjue"; + }, + content: function () { + "step 0"; + var stat = player.getStat().skill; + if (!stat.zhanjue_draw) stat.zhanjue_draw = 0; stat.zhanjue_draw++; - player.draw('nodelay'); - var list=game.filterPlayer(function(current){ - if(current.getHistory('damage',function(evt){ - return evt.card==trigger.card; - }).length>0){ - if(current==player){ + player.draw("nodelay"); + var list = game.filterPlayer(function (current) { + if ( + current.getHistory("damage", function (evt) { + return evt.card == trigger.card; + }).length > 0 + ) { + if (current == player) { stat.zhanjue_draw++; } return true; } return false; }); - if(list.length){ + if (list.length) { list.sortBySeat(); game.asyncDraw(list); } - "step 1" + ("step 1"); game.delay(); - } + }, }, - zhanjue5:{}, - qinwang:{ - audio:'qinwang1', - unique:true, - group:['qinwang1'], - zhuSkill:true, - filter:function(event,player){ - if(!player.hasZhuSkill('qinwang')||!game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'; - })||!player.countCards('he')) return false; - return !event.jijiang&&(event.type!='phase'||!player.hasSkill('jijiang3')); + zhanjue5: {}, + qinwang: { + audio: "qinwang1", + unique: true, + group: ["qinwang1"], + zhuSkill: true, + filter: function (event, player) { + if ( + !player.hasZhuSkill("qinwang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) || + !player.countCards("he") + ) + return false; + return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3")); }, - enable:['chooseToUse','chooseToRespond'], - viewAs:{ - name:'sha', - cards:[], - suit:'none', - number:null, - isCard:true, + enable: ["chooseToUse", "chooseToRespond"], + viewAs: { + name: "sha", + cards: [], + suit: "none", + number: null, + isCard: true, }, - filterCard:lib.filter.cardDiscardable, - position:'he', - check:function(card){ - var player=_status.event.player,players=game.filterPlayer(); - if(player.hasSkill('qinwang_ai')) return false; - for(var i=0;i2&&(nh>=3&&players[i].countCards('h','sha'))){ - return 5-get.value(card); + filterCard: lib.filter.cardDiscardable, + position: "he", + check: function (card) { + var player = _status.event.player, + players = game.filterPlayer(); + if (player.hasSkill("qinwang_ai")) return false; + for (var i = 0; i < players.length; i++) { + var nh = players[i].countCards("h"); + if ( + players[i] != player && + players[i].group == "shu" && + get.attitude(players[i], player) > 2 && + nh >= 3 && + players[i].countCards("h", "sha") + ) { + return 5 - get.value(card); } } return 0; }, - ai:{ - order:function(){ - return get.order({name:'sha'})-0.3; + ai: { + order: function () { + return get.order({ name: "sha" }) - 0.3; }, - respondSha:true, - skillTagFilter:function(player){ - if(!player.hasZhuSkill('qinwang')||!game.hasPlayer(function(current){ - return current!=player&¤t.group=='shu'; - })||!player.countCards('he')) return false; + respondSha: true, + skillTagFilter: function (player) { + if ( + !player.hasZhuSkill("qinwang") || + !game.hasPlayer(function (current) { + return current != player && current.group == "shu"; + }) || + !player.countCards("he") + ) + return false; }, }, }, - qinwang1:{ - audio:2, - trigger:{player:['useCardBegin','respondBegin']}, - logTarget:'targets', - filter:function(event,player){ - return event.skill=='qinwang'; + qinwang1: { + audio: 2, + trigger: { player: ["useCardBegin", "respondBegin"] }, + logTarget: "targets", + filter: function (event, player) { + return event.skill == "qinwang"; }, - forced:true, - content:function(){ - "step 0" + forced: true, + content: function () { + "step 0"; delete trigger.skill; delete trigger.card.cards; player.discard(trigger.cards); delete trigger.cards; - trigger.getParent().set('jijiang',true); - "step 1" - if(event.current==undefined) event.current=player.next; - if(event.current==player){ - player.addTempSkill('jijiang3'); - player.addTempSkill('qinwang_ai'); + trigger.getParent().set("jijiang", true); + ("step 1"); + if (event.current == undefined) event.current = player.next; + if (event.current == player) { + player.addTempSkill("jijiang3"); + player.addTempSkill("qinwang_ai"); event.finish(); trigger.cancel(); trigger.getParent().goto(0); - } - else if(event.current.group=='shu'){ - var next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张杀?',{name:'sha'}); - next.set('ai',function(){ - var event=_status.event; - return (get.attitude(event.player,event.source)-2); + } else if (event.current.group == "shu") { + var next = event.current.chooseToRespond( + "是否替" + get.translation(player) + "打出一张杀?", + { name: "sha" } + ); + next.set("ai", function () { + var event = _status.event; + return get.attitude(event.player, event.source) - 2; }); - next.set('source',player); - next.set('jijiang',true); - next.set('skillwarn','替'+get.translation(player)+'打出一张杀'); - next.noOrdering=true; - next.autochoose=lib.filter.autoRespondSha; - } - else{ - event.current=event.current.next; + next.set("source", player); + next.set("jijiang", true); + next.set("skillwarn", "替" + get.translation(player) + "打出一张杀"); + next.noOrdering = true; + next.autochoose = lib.filter.autoRespondSha; + } else { + event.current = event.current.next; event.redo(); } - "step 2" - if(result.bool){ + ("step 2"); + if (result.bool) { event.current.draw(); event.finish(); - trigger.card=result.card; - trigger.cards=result.cards; - trigger.throw=false; - if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ - event.current.ai.shown+=0.3; - if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + trigger.card = result.card; + trigger.cards = result.cards; + trigger.throw = false; + if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) { + event.current.ai.shown += 0.3; + if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95; } - } - else{ - event.current=event.current.next; + } else { + event.current = event.current.next; event.goto(1); } - } - }, - qinwang_ai:{}, - zuoding:{ - audio:2, - audioname:['re_zhongyao'], - trigger:{global:'useCardToPlayered'}, - filter:function(event,player){ - if(event.getParent().triggeredTargets3.length>1) return false; - return get.suit(event.card)=='spade'&& - _status.currentPhase==event.player&&event.targets&&event.targets.length&& - event.player!=player&&game.countPlayer2(function(current){ - return current.getHistory('damage').length>0; - })==0; }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zuoding'),'令一名目标角色摸一张牌',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).set('targets',trigger.targets); - 'step 1' - if(result.bool){ - player.logSkill('zuoding',result.targets); + }, + qinwang_ai: {}, + zuoding: { + audio: 2, + audioname: ["re_zhongyao"], + trigger: { global: "useCardToPlayered" }, + filter: function (event, player) { + if (event.getParent().triggeredTargets3.length > 1) return false; + return ( + get.suit(event.card) == "spade" && + _status.currentPhase == event.player && + event.targets && + event.targets.length && + event.player != player && + game.countPlayer2(function (current) { + return current.getHistory("damage").length > 0; + }) == 0 + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zuoding"), + "令一名目标角色摸一张牌", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("targets", trigger.targets); + ("step 1"); + if (result.bool) { + player.logSkill("zuoding", result.targets); result.targets[0].draw(); } }, - ai:{ - expose:0.2 + ai: { + expose: 0.2, }, //group:'zuoding3' }, - zuoding2:{}, - zuoding3:{ - trigger:{global:'damage'}, - silent:true, - content:function(){ - player.addTempSkill('zuoding2'); - } - }, - huomo:{ - audio:2, - audioname:['huzhao','re_zhongyao'], - enable:'chooseToUse', - onChooseToUse:function(event){ - if(game.online||event.huomo_list) return; - var list=lib.skill.huomo.getUsed(event.player); - event.set('huomo_list',list); + zuoding2: {}, + zuoding3: { + trigger: { global: "damage" }, + silent: true, + content: function () { + player.addTempSkill("zuoding2"); }, - getUsed:function(player){ - var list=[]; - player.getHistory('useCard',function(evt){ - if(get.type(evt.card,null,false)=='basic') list.add(evt.card.name); + }, + huomo: { + audio: 2, + audioname: ["huzhao", "re_zhongyao"], + enable: "chooseToUse", + onChooseToUse: function (event) { + if (game.online || event.huomo_list) return; + var list = lib.skill.huomo.getUsed(event.player); + event.set("huomo_list", list); + }, + getUsed: function (player) { + var list = []; + player.getHistory("useCard", function (evt) { + if (get.type(evt.card, null, false) == "basic") list.add(evt.card.name); }); return list; }, - hiddenCard:function(player,name){ - if(get.type(name)!='basic') return false; - var list=lib.skill.huomo.getUsed(player); - if(list.includes(name)) return false; - return player.hasCard(function(card){ - return get.color(card)=='black'&&get.type(card)!='basic'; - },'eh'); + hiddenCard: function (player, name) { + if (get.type(name) != "basic") return false; + var list = lib.skill.huomo.getUsed(player); + if (list.includes(name)) return false; + return player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh"); }, - filter:function(event,player){ - if(event.type=='wuxie'||!player.hasCard(function(card){ - return get.color(card)=='black'&&get.type(card)!='basic'; - },'eh')) return false; - var list=event.huomo_list||lib.skill.huomo.getUsed(player); - for(var name of lib.inpile){ - if(get.type(name)!='basic'||list.includes(name)) continue; - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) return true; - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) return true; + filter: function (event, player) { + if ( + event.type == "wuxie" || + !player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "eh") + ) + return false; + var list = event.huomo_list || lib.skill.huomo.getUsed(player); + for (var name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var vcards=[]; - var list=event.huomo_list||lib.skill.huomo.getUsed(player); - for(var name of lib.inpile){ - if(get.type(name)!='basic'||list.includes(name)) continue; - var card={name:name,isCard:true}; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - card.nature=nature; - if(event.filterCard(card,player,event)) vcards.push(['基本','',name,nature]); + chooseButton: { + dialog: function (event, player) { + var vcards = []; + var list = event.huomo_list || lib.skill.huomo.getUsed(player); + for (var name of lib.inpile) { + if (get.type(name) != "basic" || list.includes(name)) continue; + var card = { name: name, isCard: true }; + if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]); + if (name == "sha") { + for (var nature of lib.inpile_nature) { + card.nature = nature; + if (event.filterCard(card, player, event)) + vcards.push(["基本", "", name, nature]); } } } - return ui.create.dialog('活墨',[vcards,'vcard'],'hidden'); + return ui.create.dialog("活墨", [vcards, "vcard"], "hidden"); }, - check:function(button){ - var player=_status.event.player; - var card={name:button.link[2],nature:button.link[3]}; - if(game.hasPlayer(function(current){ - return player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })){ - switch(button.link[2]){ - case 'tao':return 5; - case 'jiu':return 3.01; - case 'sha': - if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='thunder') return 2.92; + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], nature: button.link[3] }; + if ( + game.hasPlayer(function (current) { + return ( + player.canUse(card, current) && + get.effect(current, card, player, player) > 0 + ); + }) + ) { + switch (button.link[2]) { + case "tao": + return 5; + case "jiu": + return 3.01; + case "sha": + if (button.link[3] == "fire") return 2.95; + else if (button.link[3] == "thunder") return 2.92; else return 2.9; - case 'shan':return 1; + case "shan": + return 1; } } return 0; }, - backup:function(links,player){ + backup: function (links, player) { return { - check:function(card){ - return 1/Math.max(0.1,get.value(card)); + check: function (card) { + return 1 / Math.max(0.1, get.value(card)); }, - filterCard:function(card){ - return get.type(card)!='basic'&&get.color(card)=='black'; + filterCard: function (card) { + return get.type(card) != "basic" && get.color(card) == "black"; }, - viewAs:{ - name:links[0][2], - nature:links[0][3], - suit:'none', - number:null, - isCard:true, + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, }, - position:'he', - popname:true, - ignoreMod:true, - precontent:function(){ - player.logSkill('huomo'); - var card=event.result.cards[0]; - game.log(player,'将',card,'置于牌堆顶'); - event.result.card={name:event.result.card.name,nature:event.result.card.nature}; - event.result.cards=[]; - player.loseToDiscardpile(card,ui.cardPile,'visible','insert').log=false; + position: "he", + popname: true, + ignoreMod: true, + precontent: function () { + player.logSkill("huomo"); + var card = event.result.cards[0]; + game.log(player, "将", card, "置于牌堆顶"); + event.result.card = { + name: event.result.card.name, + nature: event.result.card.nature, + }; + event.result.cards = []; + player.loseToDiscardpile(card, ui.cardPile, "visible", "insert").log = false; }, - } + }; + }, + prompt: function (links, player) { + return ( + "将一张黑色非基本牌置于牌堆顶并视为使用一张" + + get.translation(links[0][3] || "") + + get.translation(links[0][2]) + ); }, - prompt:function(links,player){ - return '将一张黑色非基本牌置于牌堆顶并视为使用一张'+get.translation(links[0][3]||'')+get.translation(links[0][2]); - } }, - ai:{ - order:function(){ - var player=_status.event.player; - var event=_status.event; - var list=lib.skill.huomo.getUsed(player); - if(!list.includes('jiu')&&event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0){ + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + var list = lib.skill.huomo.getUsed(player); + if ( + !list.includes("jiu") && + event.filterCard({ name: "jiu" }, player, event) && + get.effect(player, { name: "jiu" }) > 0 + ) { return 3.1; } return 2.9; }, - respondSha:true, - fireAttack:true, - respondShan:true, - skillTagFilter:function(player,tag,arg){ - if(tag=='fireAttack') return true; - if(player.hasCard(function(card){ - return get.color(card)=='black'&&get.type(card)!='basic'; - },'he')){ - var list=lib.skill.huomo.getUsed(player); - if(tag=='respondSha'){ - if(arg!='use') return false; - if(list.includes('sha')) return false; + respondSha: true, + fireAttack: true, + respondShan: true, + skillTagFilter: function (player, tag, arg) { + if (tag == "fireAttack") return true; + if ( + player.hasCard(function (card) { + return get.color(card) == "black" && get.type(card) != "basic"; + }, "he") + ) { + var list = lib.skill.huomo.getUsed(player); + if (tag == "respondSha") { + if (arg != "use") return false; + if (list.includes("sha")) return false; + } else if (tag == "respondShan") { + if (list.includes("shan")) return false; } - else if(tag=='respondShan'){ - if(list.includes('shan')) return false; - } - } - else{ + } else { return false; } }, - result:{ - player:1 - } - } + result: { + player: 1, + }, + }, }, // taoxi:{ // audio:2, @@ -8843,1390 +10435,1616 @@ game.import('character', function () { // } // }, // taoxi4:{}, - taoxi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - check:function(event,player){ - if(get.attitude(player,event.target)>=0) return false; - var cards=event.target.getCards('h'); - if(cards.filter(card=>player.hasUseTarget(card)).length>=cards.length/2) return true; + taoxi: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + check: function (event, player) { + if (get.attitude(player, event.target) >= 0) return false; + var cards = event.target.getCards("h"); + if (cards.filter((card) => player.hasUseTarget(card)).length >= cards.length / 2) + return true; return false; }, - filter:function(event,player){ - return player.isPhaseUsing()&&event.targets.length==1&&event.target.countCards('h')>0&&player!=event.target&&!player.hasSkill('taoxi_used'); + filter: function (event, player) { + return ( + player.isPhaseUsing() && + event.targets.length == 1 && + event.target.countCards("h") > 0 && + player != event.target && + !player.hasSkill("taoxi_used") + ); }, - logTarget:'target', - content:function(){ - 'step 0' - player.choosePlayerCard(trigger.target,'h',true); - 'step 1' - if(result.bool){ - var card=result.links[0]; - player.showCards(card,get.translation(player)+'对'+get.translation(trigger.target)+'发动了【讨袭】'); - if(!player.storage.taoxi_list) player.storage.taoxi_list=[[],[]]; - if(!player.storage.taoxi_list[1].some(i=>i._cardid==card.cardid)){ - var cardx=ui.create.card(); + logTarget: "target", + content: function () { + "step 0"; + player.choosePlayerCard(trigger.target, "h", true); + ("step 1"); + if (result.bool) { + var card = result.links[0]; + player.showCards( + card, + get.translation(player) + + "对" + + get.translation(trigger.target) + + "发动了【讨袭】" + ); + if (!player.storage.taoxi_list) player.storage.taoxi_list = [[], []]; + if (!player.storage.taoxi_list[1].some((i) => i._cardid == card.cardid)) { + var cardx = ui.create.card(); cardx.init(get.cardInfo(card)); - cardx._cardid=card.cardid; - player.directgains([cardx],null,'taoxi'); + cardx._cardid = card.cardid; + player.directgains([cardx], null, "taoxi"); player.storage.taoxi_list[0].push(trigger.target); player.storage.taoxi_list[1].push(cardx); - player.markSkill('taoxi_list'); - player.addTempSkill('taoxi_list'); - player.addTempSkill('taoxi_use'); - player.addTempSkill('taoxi_used','phaseUseAfter'); + player.markSkill("taoxi_list"); + player.addTempSkill("taoxi_list"); + player.addTempSkill("taoxi_use"); + player.addTempSkill("taoxi_used", "phaseUseAfter"); } } }, - subSkill:{ - used:{}, - use:{ - trigger:{player:'useCardBefore'}, - charlotte:true, - forced:true, - popup:false, - firstDo:true, - group:'taoxi_lose', - filter:function(event,player){ - if(!player.storage.taoxi_list||!player.storage.taoxi_list.length) return false; - var list=player.storage.taoxi_list[1]; - return event.cards&&event.cards.some(card=>{ - return list.includes(card); - }) + subSkill: { + used: {}, + use: { + trigger: { player: "useCardBefore" }, + charlotte: true, + forced: true, + popup: false, + firstDo: true, + group: "taoxi_lose", + filter: function (event, player) { + if (!player.storage.taoxi_list || !player.storage.taoxi_list.length) return false; + var list = player.storage.taoxi_list[1]; + return ( + event.cards && + event.cards.some((card) => { + return list.includes(card); + }) + ); }, - content:function(){ - var cards=[],list=player.storage.taoxi_list; - for(var card of trigger.cards){ - var bool=false; - for(var i=0;icardxx.cardid==cardid)[0]; - if(cardx&&get.position(cardx)=='h'){ + content: function () { + var cards = [], + list = player.storage.taoxi_list; + for (var card of trigger.cards) { + var bool = false; + for (var i = 0; i < list[0].length; i++) { + if (list[1][i] == card) { + var cardid = card._cardid; + var cardx = list[0][i].getCards( + "h", + (cardxx) => cardxx.cardid == cardid + )[0]; + if (cardx && get.position(cardx) == "h") { cards.push(cardx); list[0][i].$throw(cardx); - bool=true; + bool = true; break; } } } - if(!bool) cards.push(card); + if (!bool) cards.push(card); } - trigger.cards=cards; - trigger.card.cards=cards; - trigger.throw=false; + trigger.cards = cards; + trigger.card.cards = cards; + trigger.throw = false; }, - mod:{ - aiOrder:function(player,card,num){ - var list=player.storage.taoxi_list; - if(!list||!list[1]) return; - if(list[1].includes(card)) return num+0.5; + mod: { + aiOrder: function (player, card, num) { + var list = player.storage.taoxi_list; + if (!list || !list[1]) return; + if (list[1].includes(card)) return num + 0.5; }, - cardEnabled2:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('taoxi')&&_status.event.name=='chooseToRespond') return false; + cardEnabled2: function (card) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("taoxi") && + _status.event.name == "chooseToRespond" + ) + return false; + }, + }, + ai: { + effect: { + player_use: function (card, player, target) { + var list = player.storage.taoxi_list; + if (!list || !list[1]) return; + if (list[1].includes(card)) return [1, 1]; + }, }, }, - ai:{ - effect:{ - player_use:function(card,player,target){ - var list=player.storage.taoxi_list; - if(!list||!list[1]) return; - if(list[1].includes(card)) return [1,1]; - } - } - } }, - lose:{ - trigger:{ - global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + lose: { + trigger: { + global: [ + "loseEnd", + "equipEnd", + "addJudgeEnd", + "gainEnd", + "loseAsyncEnd", + "addToExpansionEnd", + ], }, - charlotte:true, - forced:true, - popup:false, - firstDo:true, - filter:function(event,player){ - var list=player.storage.taoxi_list; - if(!list||!list[0].length) return false; - return game.hasPlayer(function(current){ - if(!list[0].includes(current)) return; - var evt=event.getl(current); - if(evt&&evt.hs&&evt.hs.some(card=>{ - return list[1].some(i=>i._cardid==card.cardid); - })) return true; + charlotte: true, + forced: true, + popup: false, + firstDo: true, + filter: function (event, player) { + var list = player.storage.taoxi_list; + if (!list || !list[0].length) return false; + return game.hasPlayer(function (current) { + if (!list[0].includes(current)) return; + var evt = event.getl(current); + if ( + evt && + evt.hs && + evt.hs.some((card) => { + return list[1].some((i) => i._cardid == card.cardid); + }) + ) + return true; return false; }); }, - content:function(){ - var list=player.storage.taoxi_list; - var targets=game.filterPlayer(function(current){ - if(!list[0].includes(current)) return; - var evt=trigger.getl(current); - if(evt&&evt.hs&&evt.hs.some(card=>{ - return list[1].some(i=>i._cardid==card.cardid); - })) return true; + content: function () { + var list = player.storage.taoxi_list; + var targets = game.filterPlayer(function (current) { + if (!list[0].includes(current)) return; + var evt = trigger.getl(current); + if ( + evt && + evt.hs && + evt.hs.some((card) => { + return list[1].some((i) => i._cardid == card.cardid); + }) + ) + return true; return false; }); - for(var target of targets){ - var hs=trigger.getl(target).hs; - for(var i=0;ij.cardid==list[1][i]._cardid)){ - if(player.isOnline2()){ - player.send(function(list,i){ - game.me.storage.taoxi_list=list; - list[1][i].delete(); - list[0].splice(i,1);list[1].splice(i,1); - },player.storage.taoxi_list,i); + for (var target of targets) { + var hs = trigger.getl(target).hs; + for (var i = 0; i < list[0].length; i++) { + if (hs.some((j) => j.cardid == list[1][i]._cardid)) { + if (player.isOnline2()) { + player.send( + function (list, i) { + game.me.storage.taoxi_list = list; + list[1][i].delete(); + list[0].splice(i, 1); + list[1].splice(i, 1); + }, + player.storage.taoxi_list, + i + ); } list[1][i].delete(); - list[0].splice(i,1);list[1].splice(i,1); + list[0].splice(i, 1); + list[1].splice(i, 1); i--; } } } - } + }, }, - list:{ - trigger:{player:'phaseEnd'}, - charlotte:true, - forced:true, - onremove:function(player){ - game.broadcastAll(function(player){ - player.storage.taoxi_list[1].forEach(i=>i.delete()); + list: { + trigger: { player: "phaseEnd" }, + charlotte: true, + forced: true, + onremove: function (player) { + game.broadcastAll(function (player) { + player.storage.taoxi_list[1].forEach((i) => i.delete()); delete player.storage.taoxi_list; - },player); + }, player); }, - filter:function(event,player){ - return player.storage.taoxi_list&&player.storage.taoxi_list[0].length>0; + filter: function (event, player) { + return player.storage.taoxi_list && player.storage.taoxi_list[0].length > 0; }, - content:function(){ + content: function () { player.loseHp(); - } - } - } + }, + }, + }, }, - xingshuai:{ - skillAnimation:true, - animationColor:'thunder', - audio:2, - trigger:{player:'dying'}, + xingshuai: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + trigger: { player: "dying" }, //priority:6, - zhuSkill:true, - filter:function(event,player){ - if(player.hp>0) return false; - if(!player.hasZhuSkill('xingshuai')) return false; - return game.hasPlayer(function(current){ - return current!=player&¤t.group=='wei'; + zhuSkill: true, + filter: function (event, player) { + if (player.hp > 0) return false; + if (!player.hasZhuSkill("xingshuai")) return false; + return game.hasPlayer(function (current) { + return current != player && current.group == "wei"; }); }, - mark:true, - unique:true, - limited:true, - content:function(){ - 'step 0' - player.awakenSkill('xingshuai'); - var targets=game.filterPlayer(); + mark: true, + unique: true, + limited: true, + content: function () { + "step 0"; + player.awakenSkill("xingshuai"); + var targets = game.filterPlayer(); targets.remove(player); - event.targets=targets; - event.damages=[]; - 'step 1' - if(event.targets.length){ - var current=event.targets.shift(); - if(current.group=='wei'){ - current.chooseBool('是否令'+get.translation(player)+'回复1点体力?').set('ai',function(){ - return get.attitude(_status.event.player,_status.event.target)>2; - }).set('target',player); - event.current=current; - } - else{ + event.targets = targets; + event.damages = []; + ("step 1"); + if (event.targets.length) { + var current = event.targets.shift(); + if (current.group == "wei") { + current + .chooseBool("是否令" + get.translation(player) + "回复1点体力?") + .set("ai", function () { + return get.attitude(_status.event.player, _status.event.target) > 2; + }) + .set("target", player); + event.current = current; + } else { event.redo(); } - } - else{ + } else { event.goto(3); } - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { event.damages.push(event.current); - event.current.line(player,'green'); - game.log(event.current,'令',player,'回复1点体力'); + event.current.line(player, "green"); + game.log(event.current, "令", player, "回复1点体力"); player.recover(); } - if(event.targets.length){ + if (event.targets.length) { event.goto(1); } - 'step 3' - if(event.damages.length){ - var next=game.createEvent('xingshuaI_next'); + ("step 3"); + if (event.damages.length) { + var next = game.createEvent("xingshuaI_next"); event.next.remove(next); trigger.after.push(next); - next.targets=event.damages; - next.setContent(function(){ + next.targets = event.damages; + next.setContent(function () { targets.shift().damage(); - if(targets.length) event.redo(); + if (targets.length) event.redo(); }); } - } + }, }, - mingjian:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target; + mingjian: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target; }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterCard:true, - selectCard:-1, - discard:false, - lose:false, - delay:false, - content:function(){ - player.give(cards,target); - target.addTempSkill('mingjian2',{player:'phaseAfter'}); + filterCard: true, + selectCard: -1, + discard: false, + lose: false, + delay: false, + content: function () { + player.give(cards, target); + target.addTempSkill("mingjian2", { player: "phaseAfter" }); target.storage.mingjian2++; - target.updateMarks('mingjian2'); + target.updateMarks("mingjian2"); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0; - if(player.countCards('h')==player.countCards('h','du')) return -1; - if(target.hasJudge('lebu')) return 0; - if(get.attitude(player,target)>3){ - var basis=get.threaten(target); - if(player==get.zhu(player)&&player.hp<=2&&player.countCards('h','shan')&&!game.hasPlayer(function(current){ - return get.attitude(current,player)>3&¤t.countCards('h','tao')>0; - })) return 0; - if(target.countCards('h')+player.countCards('h')>target.hp+2) return basis*0.8; + ai: { + order: 1, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0; + if (player.countCards("h") == player.countCards("h", "du")) return -1; + if (target.hasJudge("lebu")) return 0; + if (get.attitude(player, target) > 3) { + var basis = get.threaten(target); + if ( + player == get.zhu(player) && + player.hp <= 2 && + player.countCards("h", "shan") && + !game.hasPlayer(function (current) { + return ( + get.attitude(current, player) > 3 && + current.countCards("h", "tao") > 0 + ); + }) + ) + return 0; + if (target.countCards("h") + player.countCards("h") > target.hp + 2) + return basis * 0.8; return basis; } return 0; - } - } - } - }, - mingjian2:{ - charlotte:true, - mark:true, - intro:{ - content:'手牌上限+#,出杀次数+#' - }, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=0; - }, - onremove:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.storage.mingjian2; + }, }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.storage.mingjian2; - } }, }, - mingjian_old:{ - audio:2, - trigger:{player:'phaseUseBefore'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + mingjian2: { + charlotte: true, + mark: true, + intro: { + content: "手牌上限+#,出杀次数+#", }, - content:function(){ - 'step 0' - var go=Math.random()<0.5; - player.chooseTarget(get.prompt('mingjian_old'),function(card,player,target){ - return player!=target - }).ai=function(target){ - var att=get.attitude(player,target); - if(att>3){ - if(player.countCards('h')>player.hp) return att; - if(go) return att; + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = 0; + }, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.storage.mingjian2; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + player.storage.mingjian2; + }, + }, + }, + mingjian_old: { + audio: 2, + trigger: { player: "phaseUseBefore" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; + }, + content: function () { + "step 0"; + var go = Math.random() < 0.5; + player.chooseTarget(get.prompt("mingjian_old"), function (card, player, target) { + return player != target; + }).ai = function (target) { + var att = get.attitude(player, target); + if (att > 3) { + if (player.countCards("h") > player.hp) return att; + if (go) return att; } return 0; - } - 'step 1' - if(result.bool){ - player.logSkill('mingjian_old',result.targets); + }; + ("step 1"); + if (result.bool) { + player.logSkill("mingjian_old", result.targets); trigger.cancel(); - var target=result.targets[0]; - target.addSkill('mingjian2_old'); - var hs=player.getCards('h'); - player.give(hs,target); + var target = result.targets[0]; + target.addSkill("mingjian2_old"); + var hs = player.getCards("h"); + player.give(hs, target); } - } + }, }, - mingjian2_old:{ - audio:false, - trigger:{global:'phaseAfter'}, - forced:true, - popup:false, - charlotte:true, - content:function(){ - if(lib.config.glow_phase){ - if(_status.currentPhase){ - _status.currentPhase.classList.remove('glow_phase'); + mingjian2_old: { + audio: false, + trigger: { global: "phaseAfter" }, + forced: true, + popup: false, + charlotte: true, + content: function () { + if (lib.config.glow_phase) { + if (_status.currentPhase) { + _status.currentPhase.classList.remove("glow_phase"); } - player.classList.add('glow_phase'); + player.classList.add("glow_phase"); } - game.addVideo('phaseChange',player); - _status.currentPhase=player; - player.ai.tempIgnore=[]; - player.stat.push({card:{},skill:{}}); + game.addVideo("phaseChange", player); + _status.currentPhase = player; + player.ai.tempIgnore = []; + player.stat.push({ card: {}, skill: {} }); player.phaseUse(); - player.removeSkill('mingjian2_old'); - } + player.removeSkill("mingjian2_old"); + }, }, - huituo:{ - audio:2, - audioname:['re_caorui'], - trigger:{player:'damageEnd'}, - direct:true, - content:function(){ - 'step 0' - var forced=event.forced===undefined?false:event.forced; - var info=get.skillInfoTranslation('huituo',player); - var str=`###${forced?'恢拓:请选择一名角色':get.prompt('huituo')}###令一名角色判定。若结果为红色,其回复1点体力;若结果为黑色,其摸${get.cnNumber(trigger.num)}张牌`; - player.chooseTarget(str,event.forced).set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)>0){ - return get.recoverEffect(target,player,player)+1; + huituo: { + audio: 2, + audioname: ["re_caorui"], + trigger: { player: "damageEnd" }, + direct: true, + content: function () { + "step 0"; + var forced = event.forced === undefined ? false : event.forced; + var info = get.skillInfoTranslation("huituo", player); + var str = `###${ + forced ? "恢拓:请选择一名角色" : get.prompt("huituo") + }###令一名角色判定。若结果为红色,其回复1点体力;若结果为黑色,其摸${get.cnNumber( + trigger.num + )}张牌`; + player.chooseTarget(str, event.forced).set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) > 0) { + return get.recoverEffect(target, player, player) + 1; } return 0; }); - 'step 1' - if(result.bool){ - player.logSkill('huituo',result.targets); - var target=result.targets[0]; - event.target=target; - target.judge(function(card){ - if(target.hp==target.maxHp){ - if(get.color(card)=='red') return -1; + ("step 1"); + if (result.bool) { + player.logSkill("huituo", result.targets); + var target = result.targets[0]; + event.target = target; + target.judge(function (card) { + if (target.hp == target.maxHp) { + if (get.color(card) == "red") return -1; } - if(get.color(card)=='red') return 1; + if (get.color(card) == "red") return 1; return 0; }); - } - else{ + } else { event.finish(); } - 'step 2' - if(result.color){ - if(result.color=='red'){ - if(event.target.hp0&&event.source&& - event.card&&event.card.name=='sha'; + ai: { + maixie: true, + maixie_hp: true, }, - direct:true, + }, + duodao: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && event.source && event.card && event.card.name == "sha" + ); + }, + direct: true, //priority:5, - audio:2, - content:function(){ - 'step 0' - var prompt='弃置一张牌' - if(trigger.source.getEquips(1).length) prompt+=(',然后获得'+get.translation(trigger.source)+'装备区中的'+get.translation(trigger.source.getEquips(1))); - var next=player.chooseToDiscard('he',get.prompt('duodao',trigger.source),prompt); - next.logSkill=['duodao',trigger.source]; - next.set('ai',function(card){ - if(!_status.event.getTrigger().source.getEquip(1)) return 0; - if(get.attitude(_status.event.player,_status.event.getTrigger().source)<=0){ - return 6-get.value(card); + audio: 2, + content: function () { + "step 0"; + var prompt = "弃置一张牌"; + if (trigger.source.getEquips(1).length) + prompt += + ",然后获得" + + get.translation(trigger.source) + + "装备区中的" + + get.translation(trigger.source.getEquips(1)); + var next = player.chooseToDiscard("he", get.prompt("duodao", trigger.source), prompt); + next.logSkill = ["duodao", trigger.source]; + next.set("ai", function (card) { + if (!_status.event.getTrigger().source.getEquip(1)) return 0; + if (get.attitude(_status.event.player, _status.event.getTrigger().source) <= 0) { + return 6 - get.value(card); } return 0; }); - 'step 1' - if(result.bool&&trigger.source.getEquips(1).length){ - player.gain(trigger.source.getEquips(1),trigger.source,'give','bySelf'); + ("step 1"); + if (result.bool && trigger.source.getEquips(1).length) { + player.gain(trigger.source.getEquips(1), trigger.source, "give", "bySelf"); } }, - ai:{ - maixie_defend:true, - } - }, - reanjian:{ - trigger:{player:'useCardToPlayered'}, - forced:true, - audio:2, - filter:function(event,player){ - return event.card.name=='sha'&&!event.target.inRange(player); + ai: { + maixie_defend: true, }, - logTarget:'target', - content:function(){ - trigger.getParent().reanjian_buffed=true; - var map=trigger.customArgs; - var id=trigger.target.playerid; - if(!map[id]) map[id]={}; - if(!map[id].extraDamage) map[id].extraDamage=0; + }, + reanjian: { + trigger: { player: "useCardToPlayered" }, + forced: true, + audio: 2, + filter: function (event, player) { + return event.card.name == "sha" && !event.target.inRange(player); + }, + logTarget: "target", + content: function () { + trigger.getParent().reanjian_buffed = true; + var map = trigger.customArgs; + var id = trigger.target.playerid; + if (!map[id]) map[id] = {}; + if (!map[id].extraDamage) map[id].extraDamage = 0; map[id].extraDamage++; - trigger.target.addTempSkill('reanjian2'); - trigger.target.addTempSkill('reanjian4'); + trigger.target.addTempSkill("reanjian2"); + trigger.target.addTempSkill("reanjian4"); trigger.target.storage.reanjian2.add(trigger.card); }, - ai:{ - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.name=='sha'&&arg.target&&!arg.target.inRange(player)) return true; + ai: { + unequip_ai: true, + skillTagFilter: function (player, tag, arg) { + if (arg && arg.name == "sha" && arg.target && !arg.target.inRange(player)) + return true; return false; - } - }, - }, - reanjian2:{ - firstDo:true, - ai:{unequip2:true}, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; - }, - onremove:true, - trigger:{ - player:['damage','damageCancelled','damageZero'], - target:['shaMiss','useCardToExcluded'], - }, - charlotte:true, - filter:function(event,player){ - return player.storage.reanjian2&&event.card&&player.storage.reanjian2.includes(event.card); - }, - silent:true, - forced:true, - popup:false, - priority:12, - content:function(){ - player.storage.reanjian2.remove(trigger.card); - if(!player.storage.reanjian2.length) player.removeSkill('reanjian2'); - }, - }, - reanjian3:{ - mod:{ - cardSavable:function(card){ - if(card.name=='tao') return false; }, }, }, - reanjian4:{ - trigger:{player:'dyingBegin'}, - forced:true, - silent:true, - firstDo:true, - filter:function(event,player){ - return event.getParent(2).reanjian_buffed=true; + reanjian2: { + firstDo: true, + ai: { unequip2: true }, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - content:function(){ - player.addTempSkill('reanjian3',{global:['dyingEnd','phaseEnd']}); + onremove: true, + trigger: { + player: ["damage", "damageCancelled", "damageZero"], + target: ["shaMiss", "useCardToExcluded"], + }, + charlotte: true, + filter: function (event, player) { + return ( + player.storage.reanjian2 && + event.card && + player.storage.reanjian2.includes(event.card) + ); + }, + silent: true, + forced: true, + popup: false, + priority: 12, + content: function () { + player.storage.reanjian2.remove(trigger.card); + if (!player.storage.reanjian2.length) player.removeSkill("reanjian2"); }, }, - reduodao:{ - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return event.card.name=='sha'&&(get.color(event.card)=='red'?event.player.getEquips(1).length>0:player.countCards('he')>0); + reanjian3: { + mod: { + cardSavable: function (card) { + if (card.name == "tao") return false; + }, }, - direct:true, - audio:2, - content:function(){ - 'step 0' - var prompt='弃置一张牌' - if(trigger.player.getEquips(1).length) prompt+=(',然后获得'+get.translation(trigger.player)+'装备区中的'+get.translation(trigger.player.getEquips(1))); - var next=player.chooseToDiscard('he',get.prompt('reduodao',trigger.player),prompt); - next.logSkill=['reduodao',trigger.player]; - next.set('ai',function(card){ - if(!_status.event.getTrigger().player.getEquips(1).length) return 0; - if(get.attitude(_status.event.player,_status.event.getTrigger().player)*get.value(_status.event.getTrigger().player.getEquips(1))<=0){ - return 6-get.value(card); + }, + reanjian4: { + trigger: { player: "dyingBegin" }, + forced: true, + silent: true, + firstDo: true, + filter: function (event, player) { + return (event.getParent(2).reanjian_buffed = true); + }, + content: function () { + player.addTempSkill("reanjian3", { global: ["dyingEnd", "phaseEnd"] }); + }, + }, + reduodao: { + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return ( + event.card.name == "sha" && + (get.color(event.card) == "red" + ? event.player.getEquips(1).length > 0 + : player.countCards("he") > 0) + ); + }, + direct: true, + audio: 2, + content: function () { + "step 0"; + var prompt = "弃置一张牌"; + if (trigger.player.getEquips(1).length) + prompt += + ",然后获得" + + get.translation(trigger.player) + + "装备区中的" + + get.translation(trigger.player.getEquips(1)); + var next = player.chooseToDiscard("he", get.prompt("reduodao", trigger.player), prompt); + next.logSkill = ["reduodao", trigger.player]; + next.set("ai", function (card) { + if (!_status.event.getTrigger().player.getEquips(1).length) return 0; + if ( + get.attitude(_status.event.player, _status.event.getTrigger().player) * + get.value(_status.event.getTrigger().player.getEquips(1)) <= + 0 + ) { + return 6 - get.value(card); } return 0; }); - 'step 1' - if(result.bool&&trigger.player.getEquips(1).length){ - if(!result.cards||!result.cards.length) player.logSkill('reduodao',trigger.player); - player.gain(trigger.player.getEquips(1),trigger.player,'give','bySelf'); + ("step 1"); + if (result.bool && trigger.player.getEquips(1).length) { + if (!result.cards || !result.cards.length) + player.logSkill("reduodao", trigger.player); + player.gain(trigger.player.getEquips(1), trigger.player, "give", "bySelf"); } }, }, - anjian:{ - audio:2, - trigger:{source:'damageBegin1'}, - check:function(event,player){ - return get.attitude(player,event.player)<=0; + anjian: { + audio: 2, + trigger: { source: "damageBegin1" }, + check: function (event, player) { + return get.attitude(player, event.player) <= 0; }, - forced:true, - filter:function(event,player){ - return event.getParent().name=='sha'&&!event.player.inRange(player); + forced: true, + filter: function (event, player) { + return event.getParent().name == "sha" && !event.player.inRange(player); }, - content:function(){ + content: function () { trigger.num++; - } - }, - xinpojun:{ - shaRelated:true, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.isPhaseUsing()&&event.target.hp>0&&event.target.countCards('he')>0; }, - audio:2, - content:function(){ - 'step 0' - player.choosePlayerCard(trigger.target,'he', - [1,Math.min(trigger.target.countCards('he'),trigger.target.hp)],get.prompt('xinpojun',trigger.target)).set('forceAuto',true); - 'step 1' - if(result.bool&&result.links.length){ - var target=trigger.target; - player.logSkill('xinpojun',target); - target.addToExpansion(result.cards,'giveAuto',target).gaintag.add('xinpojun2'); - target.addSkill('xinpojun2'); + }, + xinpojun: { + shaRelated: true, + trigger: { player: "useCardToPlayered" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + player.isPhaseUsing() && + event.target.hp > 0 && + event.target.countCards("he") > 0 + ); + }, + audio: 2, + content: function () { + "step 0"; + player + .choosePlayerCard( + trigger.target, + "he", + [1, Math.min(trigger.target.countCards("he"), trigger.target.hp)], + get.prompt("xinpojun", trigger.target) + ) + .set("forceAuto", true); + ("step 1"); + if (result.bool && result.links.length) { + var target = trigger.target; + player.logSkill("xinpojun", target); + target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("xinpojun2"); + target.addSkill("xinpojun2"); } }, - ai:{ - unequip_ai:true, - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - if(get.attitude(player,arg.target)>0||!player.isPhaseUsing()) return false; - if(tag=='directHit_ai') return arg.target.hp>=Math.max(1,arg.target.countCards('h')-1); - if(arg&&arg.name=='sha'&&arg.target.getEquip(2)) return true; + ai: { + unequip_ai: true, + directHit_ai: true, + skillTagFilter: function (player, tag, arg) { + if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false; + if (tag == "directHit_ai") + return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1); + if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true; return false; - } - }, - }, - xinpojun2:{ - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return player.getExpansions('xinpojun2').length>0; - }, - content:function(){ - 'step 0' - var cards=player.getExpansions('xinpojun2'); - player.gain(cards,'draw'); - game.log(player,'收回了'+get.cnNumber(cards.length)+'张“破军”牌'); - 'step 1' - player.removeSkill('xinpojun2'); - }, - intro:{ - markcount:'expansion', - mark:function(dialog,storage,player){ - var cards=player.getExpansions('xinpojun2'); - if(player.isUnderControl(true)) dialog.addAuto(cards); - else return '共有'+get.cnNumber(cards.length)+'张牌'; }, }, }, - qiaoshi:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return event.player!=player&&event.player.countCards('h')==player.countCards('h')&&event.player.isIn(); + xinpojun2: { + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("xinpojun2").length > 0; }, - check:function(event,player){ - return get.attitude(player,event.player)>=0; + content: function () { + "step 0"; + var cards = player.getExpansions("xinpojun2"); + player.gain(cards, "draw"); + game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌"); + ("step 1"); + player.removeSkill("xinpojun2"); }, - logTarget:'player', - content:function(){ - game.asyncDraw([trigger.player,player]); + intro: { + markcount: "expansion", + mark: function (dialog, storage, player) { + var cards = player.getExpansions("xinpojun2"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, }, }, - yanyu:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.hasCard(card=>lib.skill.yanyu.filterCard(card,player),'h'); + qiaoshi: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + event.player != player && + event.player.countCards("h") == player.countCards("h") && + event.player.isIn() + ); }, - filterCard:(card,player)=>get.name(card)=='sha'&&player.canRecast(card), - discard:false, - lose:false, - delay:false, - content:function(){ + check: function (event, player) { + return get.attitude(player, event.player) >= 0; + }, + logTarget: "player", + content: function () { + game.asyncDraw([trigger.player, player]); + }, + }, + yanyu: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.hasCard((card) => lib.skill.yanyu.filterCard(card, player), "h"); + }, + filterCard: (card, player) => get.name(card) == "sha" && player.canRecast(card), + discard: false, + lose: false, + delay: false, + content: function () { player.recast(cards); }, - ai:{ - basic:{ - order:1 + ai: { + basic: { + order: 1, + }, + result: { + player: 1, }, - result:{ - player:1 - } }, - group:'yanyu2' + group: "yanyu2", }, - yanyu2:{ - trigger:{player:'phaseUseEnd'}, - filter:function(event,player){ - return player.getHistory('useSkill',function(evt){ - return evt.event.getParent('phaseUse')==event&&evt.skill=='yanyu'; - }).length>=2; + yanyu2: { + trigger: { player: "phaseUseEnd" }, + filter: function (event, player) { + return ( + player.getHistory("useSkill", function (evt) { + return evt.event.getParent("phaseUse") == event && evt.skill == "yanyu"; + }).length >= 2 + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('yanyu'),'令一名男性角色摸两张牌',function(card,player,target){ - return target.hasSex('male')&&target!=player; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - player.logSkill('yanyu',result.targets); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("yanyu"), + "令一名男性角色摸两张牌", + function (card, player, target) { + return target.hasSex("male") && target != player; + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + player.logSkill("yanyu", result.targets); result.targets[0].draw(2); } - } - }, - youdi:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('he')>0; }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('youdi'),function(card,player,target){ - return player!=target; - }).set('ai',function(target){ - if(!_status.event.goon) return 0; - if(target.countCards('he')==0) return 0; - return -get.attitude(_status.event.player,target); - }).set('goon',player.countCards('h','sha')<=player.countCards('h')/3); - "step 1" - if(result.bool){ + }, + youdi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("he") > 0; + }, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("youdi"), function (card, player, target) { + return player != target; + }) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + if (target.countCards("he") == 0) return 0; + return -get.attitude(_status.event.player, target); + }) + .set("goon", player.countCards("h", "sha") <= player.countCards("h") / 3); + ("step 1"); + if (result.bool) { game.delay(); - player.logSkill('youdi',result.targets); - event.target=result.targets[0]; - event.target.discardPlayerCard(player,'he',true); - } - else{ + player.logSkill("youdi", result.targets); + event.target = result.targets[0]; + event.target.discardPlayerCard(player, "he", true); + } else { event.finish(); } - "step 2" - if(result.links[0].name!='sha'&&event.target.countGainableCards(player,'he')){ - player.gainPlayerCard('he',event.target,true); + ("step 2"); + if (result.links[0].name != "sha" && event.target.countGainableCards(player, "he")) { + player.gainPlayerCard("he", event.target, true); } }, - ai:{ - expose:0.2, - } + ai: { + expose: 0.2, + }, }, - fuhun:{ - enable:['chooseToUse','chooseToRespond'], - filterCard:true, - selectCard:2, - position:'hs', - audio:2, - audioname:['re_guanzhang'], - derivation:['new_rewusheng','olpaoxiao'], - viewAs:{name:'sha'}, - prompt:'将两张手牌当杀使用或打出', - viewAsFilter:function(player){ - return player.countCards('hs')>1; + fuhun: { + enable: ["chooseToUse", "chooseToRespond"], + filterCard: true, + selectCard: 2, + position: "hs", + audio: 2, + audioname: ["re_guanzhang"], + derivation: ["new_rewusheng", "olpaoxiao"], + viewAs: { name: "sha" }, + prompt: "将两张手牌当杀使用或打出", + viewAsFilter: function (player) { + return player.countCards("hs") > 1; }, - check:function(card){ - if(_status.event.player.hasSkill('new_rewusheng')&&get.color(card)=='red') return 0; - if(_status.event.name=='chooseToRespond'){ - if(card.name=='sha') return 0; - return 6-get.useful(card); + check: function (card) { + if (_status.event.player.hasSkill("new_rewusheng") && get.color(card) == "red") return 0; + if (_status.event.name == "chooseToRespond") { + if (card.name == "sha") return 0; + return 6 - get.useful(card); } - if(_status.event.player.countCards('hs')<4) return 6-get.useful(card); - return 7-get.useful(card); + if (_status.event.player.countCards("hs") < 4) return 6 - get.useful(card); + return 7 - get.useful(card); }, - ai:{ - respondSha:true, - skillTagFilter:function(player){ - if(player.countCards('hs')<2) return false; + ai: { + respondSha: true, + skillTagFilter: function (player) { + if (player.countCards("hs") < 2) return false; }, - order:function(item,player){ - if(player.hasSkill('new_rewusheng')&&player.hasSkill('olpaoxiao')){ + order: function (item, player) { + if (player.hasSkill("new_rewusheng") && player.hasSkill("olpaoxiao")) { return 1; } - if(player.countCards('hs')<4){ + if (player.countCards("hs") < 4) { return 1; } return 4; }, }, - group:'fuhun2' + group: "fuhun2", }, - fuhun2:{ - audio:'fuhun', - audioname:['re_guanzhang'], - trigger:{source:'damageSource'}, - forced:true, - filter:function(event,player){ - if(['new_rewusheng','olpaoxiao'].every(skill=>player.hasSkill(skill,null,false,false))) return false; - return event.getParent().skill=='fuhun'; + fuhun2: { + audio: "fuhun", + audioname: ["re_guanzhang"], + trigger: { source: "damageSource" }, + forced: true, + filter: function (event, player) { + if ( + ["new_rewusheng", "olpaoxiao"].every((skill) => + player.hasSkill(skill, null, false, false) + ) + ) + return false; + return event.getParent().skill == "fuhun"; }, - content:function(){ - player.addTempSkills(['new_rewusheng','olpaoxiao']); + content: function () { + player.addTempSkills(["new_rewusheng", "olpaoxiao"]); // player.addTempSkill('fuhun3'); - } + }, }, - fuhun3:{}, - fencheng:{ - skillAnimation:'epic', - animationColor:'gray', - audio:2, - enable:'phaseUse', - filter:function(event,player){ + fuhun3: {}, + fencheng: { + skillAnimation: "epic", + animationColor: "gray", + audio: 2, + enable: "phaseUse", + filter: function (event, player) { return !player.storage.fencheng; }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - unique:true, - limited:true, - selectTarget:-1, - mark:true, - line:'fire', - content:function(){ - "step 0" - player.storage.fencheng=true; - player.awakenSkill('fencheng'); - var res=get.damageEffect(target,player,target,'fire'); - var num=Math.max(1,target.countCards('e')); - target.chooseToDiscard(num,'he','弃置'+get.cnNumber(num)+'张牌或受到1点火焰伤害').set('ai',function(card){ - var res=_status.event.res; - var num=_status.event.num; - var player=_status.event.player; - if(res>=0) return -1; - if(num>2&&player.hp>1) return -1; - if(num>1&&player.hp>2) return -1; - if(get.position(card)=='e'){ - return 10-get.value(card); - } - return 6-get.value(card); - }).set('res',res).set('num',num); - "step 1" - if(!result.bool){ - target.damage('fire'); + unique: true, + limited: true, + selectTarget: -1, + mark: true, + line: "fire", + content: function () { + "step 0"; + player.storage.fencheng = true; + player.awakenSkill("fencheng"); + var res = get.damageEffect(target, player, target, "fire"); + var num = Math.max(1, target.countCards("e")); + target + .chooseToDiscard(num, "he", "弃置" + get.cnNumber(num) + "张牌或受到1点火焰伤害") + .set("ai", function (card) { + var res = _status.event.res; + var num = _status.event.num; + var player = _status.event.player; + if (res >= 0) return -1; + if (num > 2 && player.hp > 1) return -1; + if (num > 1 && player.hp > 2) return -1; + if (get.position(card) == "e") { + return 10 - get.value(card); + } + return 6 - get.value(card); + }) + .set("res", res) + .set("num", num); + ("step 1"); + if (!result.bool) { + target.damage("fire"); } }, - ai:{ - order:1, - result:{ - player:function(player){ - var num=0,players=game.filterPlayer(); - for(var i=0;i0){ - num-=Math.max(1,players[i].countCards('e')); - } - else if(att<0){ - num+=Math.max(1,players[i].countCards('e')); + ai: { + order: 1, + result: { + player: function (player) { + var num = 0, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + player != players[i] && + get.damageEffect(players[i], player, players[i], "fire") < 0 + ) { + var att = get.attitude(player, players[i]); + if (att > 0) { + num -= Math.max(1, players[i].countCards("e")); + } else if (att < 0) { + num += Math.max(1, players[i].countCards("e")); } } } - if(players.length<5){ - return num-1; + if (players.length < 5) { + return num - 1; + } else { + return num - 2; } - else{ - return num-2; - } - } - } + }, + }, }, - init:function(player){ - player.storage.fencheng=false; + init: function (player) { + player.storage.fencheng = false; + }, + intro: { + content: "limited", }, - intro:{ - content:'limited' - } }, - mieji:{ - trigger:{player:'useCard2'}, - direct:true, - audio:2, - filter:function(event,player){ - if(get.type(event.card)!='trick'||get.color(event.card)!='black') return false; - if(!event.targets||event.targets.length!=1) return false; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })){ + mieji: { + trigger: { player: "useCard2" }, + direct: true, + audio: 2, + filter: function (event, player) { + if (get.type(event.card) != "trick" || get.color(event.card) != "black") return false; + if (!event.targets || event.targets.length != 1) return false; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - position:'he', - content:function(){ - "step 0" - player.chooseTarget(get.prompt('mieji'),'为'+get.translation(trigger.card)+'增加一个额外目标',function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return false; - return lib.filter.targetEnabled2(_status.event.card,player,target)&&lib.filter.targetInRange(_status.event.card,player,target); - }).set('autodelay',true).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player); - }).set('targets',trigger.targets).set('card',trigger.card); - "step 1" - if(result.bool){ - player.logSkill('mieji',result.targets); + position: "he", + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("mieji"), + "为" + get.translation(trigger.card) + "增加一个额外目标", + function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return false; + return ( + lib.filter.targetEnabled2(_status.event.card, player, target) && + lib.filter.targetInRange(_status.event.card, player, target) + ); + } + ) + .set("autodelay", true) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + player.logSkill("mieji", result.targets); trigger.targets.push(result.targets[0]); } - } + }, }, - junxing:{ - enable:'phaseUse', - audio:2, - usable:1, - filterCard:true, - selectCard:[1,Infinity], - filter:function(event,player){ - return player.countCards('h')>0; + junxing: { + enable: "phaseUse", + audio: 2, + usable: 1, + filterCard: true, + selectCard: [1, Infinity], + filter: function (event, player) { + return player.countCards("h") > 0; }, - check:function(card){ - if(ui.selected.cards.length) return -1; - var val=get.value(card); - if(get.type(card)=='basic') return 8-get.value(card); - return 5-get.value(card); + check: function (card) { + if (ui.selected.cards.length) return -1; + var val = get.value(card); + if (get.type(card) == "basic") return 8 - get.value(card); + return 5 - get.value(card); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - content:function(){ - "step 0" - var types=[]; - for(var i=0;i{ - if(current==player||current.countCards('h')) return false; - var evt=event.getl(current); - return evt&&evt.hs&&evt.hs.length; + direct: true, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + return game.hasPlayer((current) => { + if (current == player || current.countCards("h")) return false; + var evt = event.getl(current); + return evt && evt.hs && evt.hs.length; }); }, - check:function(event,player){ - return get.damageEffect(event.player,player,player)>0; + check: function (event, player) { + return get.damageEffect(event.player, player, player) > 0; }, - content:function(){ - 'step 0' - var targets=game.filterPlayer(current=>{ - if(current==player||current.countCards('h')) return false; - var evt=trigger.getl(current); - return evt&&evt.hs&&evt.hs.length; + content: function () { + "step 0"; + var targets = game.filterPlayer((current) => { + if (current == player || current.countCards("h")) return false; + var evt = trigger.getl(current); + return evt && evt.hs && evt.hs.length; }); - event.targets=targets; - 'step 1' - var target=event.targets.shift(); - event.target=target; - player.chooseBool(get.prompt2('juece',target)).set('ai',()=>{ - return get.damageEffect(_status.event.getParent().target,_status.event.player,_status.event.player)>=0; + event.targets = targets; + ("step 1"); + var target = event.targets.shift(); + event.target = target; + player.chooseBool(get.prompt2("juece", target)).set("ai", () => { + return ( + get.damageEffect( + _status.event.getParent().target, + _status.event.player, + _status.event.player + ) >= 0 + ); }); - 'step 2' - if(result.bool){ - player.logSkill('juece',target); + ("step 2"); + if (result.bool) { + player.logSkill("juece", target); target.damage(); } - 'step 3' - if(targets.length) event.goto(1); + ("step 3"); + if (targets.length) event.goto(1); + }, + ai: { + threaten: 1.1, }, - ai:{ - threaten:1.1 - } }, - jiefan:{ - skillAnimation:true, - animationColor:'wood', - audio:2, - audioname:['re_handang'], - unique:true, - limited:true, - mark:true, - init:function(player){ - player.storage.jiefan=false; + jiefan: { + skillAnimation: true, + animationColor: "wood", + audio: 2, + audioname: ["re_handang"], + unique: true, + limited: true, + mark: true, + init: function (player) { + player.storage.jiefan = false; }, - enable:'phaseUse', - filter:function(event,player){ + enable: "phaseUse", + filter: function (event, player) { return !player.storage.jiefan; }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - filterTarget:true, - content:function(){ - "step 0" - player.awakenSkill('jiefan'); - player.storage.jiefan=true; - event.players=game.filterPlayer(function(current){ - return current!=target&¤t.inRange(target); + filterTarget: true, + content: function () { + "step 0"; + player.awakenSkill("jiefan"); + player.storage.jiefan = true; + event.players = game.filterPlayer(function (current) { + return current != target && current.inRange(target); }); event.players.sortBySeat(target); - "step 1" - if(event.players.length){ - event.current=event.players.shift(); - event.current.addTempClass('target'); - player.line(event.current,'green'); - if(event.current.countCards('he')&&target.isIn()){ - event.current.chooseToDiscard({subtype:'equip1'},'he','弃置一张武器牌或让'+ - get.translation(target)+'摸一张牌').set('ai',function(card){ - if(get.attitude(_status.event.player,_status.event.target)<0) return 7-get.value(card); - return -1; - }).set('target',target); - event.tempbool=false; + ("step 1"); + if (event.players.length) { + event.current = event.players.shift(); + event.current.addTempClass("target"); + player.line(event.current, "green"); + if (event.current.countCards("he") && target.isIn()) { + event.current + .chooseToDiscard( + { subtype: "equip1" }, + "he", + "弃置一张武器牌或让" + get.translation(target) + "摸一张牌" + ) + .set("ai", function (card) { + if (get.attitude(_status.event.player, _status.event.target) < 0) + return 7 - get.value(card); + return -1; + }) + .set("target", target); + event.tempbool = false; + } else { + event.tempbool = true; } - else{ - event.tempbool=true; - } - } - else{ + } else { event.finish(); } - "step 2" - if(event.tempbool||result.bool==false){ + ("step 2"); + if (event.tempbool || result.bool == false) { target.draw(); } event.goto(1); }, - ai:{ - order:5, - result:{ - target:function(player,target){ - if(player.hp>2){ - if(game.phaseNumber 2) { + if (game.phaseNumber < game.players.length * 2) return 0; } - var num=0,players=game.filterPlayer(); - for(var i=0;i0&&event.player.countCards('j')) return true; - if(event.num>1){ - if(att<0) return false; - if(att>0) return true; + zhiman: { + audio: 2, + audioname: ["guansuo"], + trigger: { source: "damageBegin2" }, + check: function (event, player) { + if (get.damageEffect(event.player, player, player) < 0) return true; + var att = get.attitude(player, event.player); + if (att > 0 && event.player.countCards("j")) return true; + if (event.num > 1) { + if (att < 0) return false; + if (att > 0) return true; } - var cards=event.player.getGainableCards(player,'e'); - for(var i=0;i=6) return true; + var cards = event.player.getGainableCards(player, "e"); + for (var i = 0; i < cards.length; i++) { + if (get.equipValue(cards[i]) >= 6) return true; } return false; }, - filter:function(event,player){ - return player!=event.player; + filter: function (event, player) { + return player != event.player; }, - logTarget:'player', - content:function(){ - if(trigger.player.countGainableCards(player,'ej')){ - player.gainPlayerCard(trigger.player,'ej',true); + logTarget: "player", + content: function () { + if (trigger.player.countGainableCards(player, "ej")) { + player.gainPlayerCard(trigger.player, "ej", true); } trigger.cancel(); - } + }, }, - sanyao:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ + sanyao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { return target.isMaxHp(); }, - filter:function(event,player){ - return player.countCards('he')>0; + filter: function (event, player) { + return player.countCards("he") > 0; }, - check:function(card){return 7-get.value(card);}, - position:'he', - filterCard:true, - content:function(){ - target.damage('nocard'); + check: function (card) { + return 7 - get.value(card); }, - ai:{ - result:{ - target:function(player,target){ - if(target.countCards('j')&&get.attitude(player,target)>0){ + position: "he", + filterCard: true, + content: function () { + target.damage("nocard"); + }, + ai: { + result: { + target: function (player, target) { + if (target.countCards("j") && get.attitude(player, target) > 0) { return 1; } - if(target.countCards('e')){ + if (target.countCards("e")) { return -1; } - return get.damageEffect(target,player); + return get.damageEffect(target, player); }, }, - order:7 - } - }, - olsanyao:{ - enable:'phaseUse', - audio:'sanyao', - filter:function(event,player){ - return player.countCards('he')>0&&(!player.hasSkill('olsanyao0')||!player.hasSkill('olsanyao1')); + order: 7, }, - chooseButton:{ - dialog:function(event,player){ - var list=[ - '选择手牌数最多的一名角色', - '选择体力值最大的一名角色', - ]; - var choiceList=ui.create.dialog('散谣:请选择一项','forcebutton','hidden'); - choiceList.add([list.map((item,i)=>{ - return [i,item]; - }),'textbutton']); + }, + olsanyao: { + enable: "phaseUse", + audio: "sanyao", + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + (!player.hasSkill("olsanyao0") || !player.hasSkill("olsanyao1")) + ); + }, + chooseButton: { + dialog: function (event, player) { + var list = ["选择手牌数最多的一名角色", "选择体力值最大的一名角色"]; + var choiceList = ui.create.dialog("散谣:请选择一项", "forcebutton", "hidden"); + choiceList.add([ + list.map((item, i) => { + return [i, item]; + }), + "textbutton", + ]); return choiceList; }, - filter:function(button,player){ - return !player.hasSkill('olsanyao'+button.link); + filter: function (button, player) { + return !player.hasSkill("olsanyao" + button.link); }, - check:function(button){ - var player=_status.event.player; - if(game.hasPlayer([ - function(target){ - var num=target.countCards('h'); - return !game.hasPlayer(function(current){ - return current!=target&¤t.countCards('h')>num; - })&&get.effect(target,'sanyao',player,player)>0; - }, - function(target){ - var num=target.hp; - return !game.hasPlayer(function(current){ - return current!=target&¤t.hp>num; - })&&get.effect(target,'sanyao',player,player)>0; - }, - ][button.link])) return 1+button.link; + check: function (button) { + var player = _status.event.player; + if ( + game.hasPlayer( + [ + function (target) { + var num = target.countCards("h"); + return ( + !game.hasPlayer(function (current) { + return current != target && current.countCards("h") > num; + }) && get.effect(target, "sanyao", player, player) > 0 + ); + }, + function (target) { + var num = target.hp; + return ( + !game.hasPlayer(function (current) { + return current != target && current.hp > num; + }) && get.effect(target, "sanyao", player, player) > 0 + ); + }, + ][button.link] + ) + ) + return 1 + button.link; return 0; }, - backup:function(links){ + backup: function (links) { return { - audio:'sanyao', - filterTarget:[ - function(card,player,target){ - var num=target.countCards('h'); - return !game.hasPlayer(function(current){ - return current!=target&¤t.countCards('h')>num; + audio: "sanyao", + filterTarget: [ + function (card, player, target) { + var num = target.countCards("h"); + return !game.hasPlayer(function (current) { + return current != target && current.countCards("h") > num; }); }, - function(card,player,target){ - return !game.hasPlayer(function(current){ - return current!=target&¤t.hp>target.hp; + function (card, player, target) { + return !game.hasPlayer(function (current) { + return current != target && current.hp > target.hp; }); - } + }, ][links[0]], - index:links[0], - filterCard:true, - check:function(card){ - return 7-get.value(card); + index: links[0], + filterCard: true, + check: function (card) { + return 7 - get.value(card); }, - position:'he', - content:function(){ - player.addTempSkill('olsanyao'+lib.skill[event.name].index) - target.damage('nocard'); + position: "he", + content: function () { + player.addTempSkill("olsanyao" + lib.skill[event.name].index); + target.damage("nocard"); }, - ai:lib.skill.sanyao.ai, - } + ai: lib.skill.sanyao.ai, + }; }, - prompt:function(){ - return '请选择【散谣】的目标' + prompt: function () { + return "请选择【散谣】的目标"; }, }, - ai:{ - order:7, - result:{ - player:1, + ai: { + order: 7, + result: { + player: 1, }, }, }, - olsanyao0:{}, - olsanyao1:{}, - rezhiman:{ - audio:'zhiman', - audioname:['guansuo','re_masu'], - audioname2:{ - dc_guansuo:'zhiman_guansuo', + olsanyao0: {}, + olsanyao1: {}, + rezhiman: { + audio: "zhiman", + audioname: ["guansuo", "re_masu"], + audioname2: { + dc_guansuo: "zhiman_guansuo", }, - trigger:{source:'damageBegin2'}, - filter:function(event,player){ - return player!=event.player; + trigger: { source: "damageBegin2" }, + filter: function (event, player) { + return player != event.player; }, - check:function(event,player){ - if(get.damageEffect(event.player,player,player)<0) return true; - var att=get.attitude(player,event.player); - if(att>0&&event.player.countCards('j')) return true; - if(event.num>1){ - if(att<0) return false; - if(att>0) return true; + check: function (event, player) { + if (get.damageEffect(event.player, player, player) < 0) return true; + var att = get.attitude(player, event.player); + if (att > 0 && event.player.countCards("j")) return true; + if (event.num > 1) { + if (att < 0) return false; + if (att > 0) return true; } - var cards=event.player.getGainableCards(player,'he'); - for(var i=0;i=6) return true; + var cards = event.player.getGainableCards(player, "he"); + for (var i = 0; i < cards.length; i++) { + if (get.equipValue(cards[i]) >= 6) return true; } return false; }, - logTarget:'player', - content:function(){ - if(trigger.player.countGainableCards(player,'hej')){ - player.gainPlayerCard(trigger.player,'hej',true); + logTarget: "player", + content: function () { + if (trigger.player.countGainableCards(player, "hej")) { + player.gainPlayerCard(trigger.player, "hej", true); } trigger.cancel(); - } - }, - zhiman_guansuo:{audio:2}, - resanyao:{ - audio:2, - enable:'phaseUse', - usable:1, - selectCard:function(){ - var player=_status.event.player; - return [Math.max(1,ui.selected.targets.length),game.countPlayer(function(target){ - return target!=player&&!game.hasPlayer(function(current){ - return current!=player&¤t.hp>target.hp - }); - })]; }, - selectTarget:function(){ + }, + zhiman_guansuo: { audio: 2 }, + resanyao: { + audio: 2, + enable: "phaseUse", + usable: 1, + selectCard: function () { + var player = _status.event.player; + return [ + Math.max(1, ui.selected.targets.length), + game.countPlayer(function (target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) + ); + }), + ]; + }, + selectTarget: function () { return ui.selected.cards.length; }, - filterTarget:function(card,player,target){ - return target!=player&&!game.hasPlayer(function(current){ - return current!=player&¤t.hp>target.hp - }); + filterTarget: function (card, player, target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) + ); }, - check:function(card){ - var player=_status.event.player; - if(game.countPlayer(function(target){ - return target!=player&&!game.hasPlayer(function(current){ - return current!=player&¤t.hp>target.hp - })&&get.effect(target,'sanyao',player,player)>0; - })<=ui.selected.cards.length) return 0; - return 7-get.value(card); + check: function (card) { + var player = _status.event.player; + if ( + game.countPlayer(function (target) { + return ( + target != player && + !game.hasPlayer(function (current) { + return current != player && current.hp > target.hp; + }) && + get.effect(target, "sanyao", player, player) > 0 + ); + }) <= ui.selected.cards.length + ) + return 0; + return 7 - get.value(card); }, - position:'he', - filterCard:true, - content:function(){ - target.damage('nocard'); + position: "he", + filterCard: true, + content: function () { + target.damage("nocard"); }, - ai:{ - result:{ - target:function(player,target){ - var disbool=false; - if(player.hasSkill('rezhiman')){ - if(target.countCards('j')&&get.attitude(player,target)>0){ + ai: { + result: { + target: function (player, target) { + var disbool = false; + if (player.hasSkill("rezhiman")) { + if (target.countCards("j") && get.attitude(player, target) > 0) { return 1; } - if(target.countCards('he',function(card){ - return card.name=='tengjia'||get.value(card)>0; - })){ - disbool=true; + if ( + target.countCards("he", function (card) { + return card.name == "tengjia" || get.value(card) > 0; + }) + ) { + disbool = true; } } - var damage=get.damageEffect(target,player); - if(disbool&&get.attitude(player,target)<0) return Math.min(-1,damage); + var damage = get.damageEffect(target, player); + if (disbool && get.attitude(player, target) < 0) return Math.min(-1, damage); return damage; }, }, - order:7 - } + order: 7, + }, }, - reqiaoshui:{ - audio:2, - enable:'phaseUse', - filterTarget:function(card,player,target){ + reqiaoshui: { + audio: 2, + enable: "phaseUse", + filterTarget: function (card, player, target) { return player.canCompare(target); }, - filter:function(event,player){ - return player.countCards('h')>0; + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool) player.addTempSkill('qiaoshui3','phaseUseEnd'); - else{ - player.addTempSkill('qiaoshui4'); - event.getParent(3).skipped=true; + ("step 1"); + if (result.bool) player.addTempSkill("qiaoshui3", "phaseUseEnd"); + else { + player.addTempSkill("qiaoshui4"); + event.getParent(3).skipped = true; } }, - ai:{ - order:function(item,player){ - if(player.countCards('h',function(card){ - return player.hasValueTarget(card); - })) return 10; + ai: { + order: function (item, player) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) + return 10; return 1; }, - result:{ - target:function(player,target){ - if(player.countCards('h',function(card){ - return player.hasValueTarget(card); - })){ - if(player.hasSkill('qiaoshui3')) return 0; - var nd=!player.needsToDiscard(); - if(player.hasCard(function(card){ - if(get.position(card)!="h") return false; - var val=get.value(card) - if(nd&&val<0) return true; - if(val<=5){ - return get.number(card)>=12; - } - if(val<=6){ - return get.number(card)>=13; - } - return false; - })) return -1; + result: { + target: function (player, target) { + if ( + player.countCards("h", function (card) { + return player.hasValueTarget(card); + }) + ) { + if (player.hasSkill("qiaoshui3")) return 0; + var nd = !player.needsToDiscard(); + if ( + player.hasCard(function (card) { + if (get.position(card) != "h") return false; + var val = get.value(card); + if (nd && val < 0) return true; + if (val <= 5) { + return get.number(card) >= 12; + } + if (val <= 6) { + return get.number(card) >= 13; + } + return false; + }) + ) + return -1; return 0; } return -1; @@ -10234,1623 +12052,1883 @@ game.import('character', function () { }, }, }, - qiaoshui:{ - audio:2, - audioname2:{ - re_jianyong:'reqiaoshui', - xin_jianyong:'xinqiaoshui', + qiaoshui: { + audio: 2, + audioname2: { + re_jianyong: "reqiaoshui", + xin_jianyong: "xinqiaoshui", }, - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0; }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('qiaoshui'),function(card,player,target){ - return player.canCompare(target); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target)/target.countCards('h'); - }); - "step 1" - if(result.bool){ - player.logSkill('qiaoshui',result.targets[0]); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("qiaoshui"), function (card, player, target) { + return player.canCompare(target); + }) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target) / target.countCards("h"); + }); + ("step 1"); + if (result.bool) { + player.logSkill("qiaoshui", result.targets[0]); player.chooseToCompare(result.targets[0]); - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool){ - player.addTempSkill('qiaoshui3'); - } - else{ - player.addTempSkill('qiaoshui2'); + ("step 2"); + if (result.bool) { + player.addTempSkill("qiaoshui3"); + } else { + player.addTempSkill("qiaoshui2"); } }, - ai:{ - expose:0.1 - } + ai: { + expose: 0.1, + }, }, - qiaoshui2:{ - mod:{ - cardEnabled:function(card){ - if(get.type(card,'trick')=='trick') return false; - } - } + qiaoshui2: { + mod: { + cardEnabled: function (card) { + if (get.type(card, "trick") == "trick") return false; + }, + }, }, - qiaoshui3:{ - charlotte:true, - audio:'qiaoshui', - audioname2:{ - re_jianyong:'reqiaoshui', - xin_jianyong:'xinqiaoshui', - ol_jianyong:'olqiaoshui', + qiaoshui3: { + charlotte: true, + audio: "qiaoshui", + audioname2: { + re_jianyong: "reqiaoshui", + xin_jianyong: "xinqiaoshui", + ol_jianyong: "olqiaoshui", }, - trigger:{player:'useCard2'}, - filter:function(event,player){ - var type=get.type(event.card); - return type=='basic'||type=='trick'; + trigger: { player: "useCard2" }, + filter: function (event, player) { + var type = get.type(event.card); + return type == "basic" || type == "trick"; }, - direct:true, - content:function(){ - 'step 0' - player.removeSkill('qiaoshui3'); - var goon=false; - var info=get.info(trigger.card); - if(trigger.targets&&!info.multitarget){ - var players=game.filterPlayer(); - for(var i=0;i1){ + if (goon) { + player + .chooseTarget( + "巧说:是否额外指定一名" + get.translation(trigger.card) + "的目标?", + function (card, player, target) { + var trigger = _status.event; + if (trigger.targets.includes(target)) return false; + return lib.filter.targetEnabled2( + trigger.card, + _status.event.player, + target + ); + } + ) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + } else { + if (!info.multitarget && trigger.targets && trigger.targets.length > 1) { event.goto(3); } } - 'step 1' - if(result.bool){ - if(!event.isMine()) game.delayx(); - event.target=result.targets[0]; - } - else{ + ("step 1"); + if (result.bool) { + if (!event.isMine()) game.delayx(); + event.target = result.targets[0]; + } else { event.finish(); } - 'step 2' - if(event.target){ - player.logSkill('qiaoshui3',event.target); + ("step 2"); + if (event.target) { + player.logSkill("qiaoshui3", event.target); trigger.targets.add(event.target); } event.finish(); - 'step 3' - player.chooseTarget('巧说:是否减少一名'+get.translation(trigger.card)+'的目标?',function(card,player,target){ - return _status.event.targets.includes(target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - return -get.effect(target,trigger.card,trigger.player,_status.event.player); - }).set('targets',trigger.targets); - 'step 4' - if(result.bool){ - event.targets=result.targets; - if(event.isMine()){ - player.logSkill('qiaoshui3',event.targets); + ("step 3"); + player + .chooseTarget( + "巧说:是否减少一名" + get.translation(trigger.card) + "的目标?", + function (card, player, target) { + return _status.event.targets.includes(target); + } + ) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + return -get.effect(target, trigger.card, trigger.player, _status.event.player); + }) + .set("targets", trigger.targets); + ("step 4"); + if (result.bool) { + event.targets = result.targets; + if (event.isMine()) { + player.logSkill("qiaoshui3", event.targets); event.finish(); } - for(var i=0;i1) return false; - return event.card&&get.type(event.card)=='trick'&&event.player!=player; + jyzongshi_old: { + audio: 2, + trigger: { target: "useCardToBegin" }, + filter: function (event, player) { + if (event.targets && event.targets.length > 1) return false; + return event.card && get.type(event.card) == "trick" && event.player != player; }, - frequent:true, - content:function(){ + frequent: true, + content: function () { player.draw(); }, - ai:{ - effect:function(card,player,target){ - if(get.type(card)=='trick') return [1,1]; + ai: { + effect: function (card, player, target) { + if (get.type(card) == "trick") return [1, 1]; }, - } - }, - shenxing:{ - audio:2, - enable:'phaseUse', - position:'he', - filterCard:true, - selectCard:2, - prompt:'弃置两张牌并摸一张牌', - check:function(card){ - var player=_status.event.player; - if(!player.hasSkill('olbingyi')||player.hasSkill('olbingyi_blocker',null,null,false)) return 4-get.value(card); - var red=0,black=0,hs=player.getCards('h'); - for(var i of hs){ - if(ui.selected.cards.includes(i)) continue; - var color=get.color(i,player); - if(color=='red') red++; - if(color=='black') black++; - } - if(red>2&&black>2) return 4-get.value(card); - if(red==0||black==0) return 8-get.value(card); - var color=get.color(card); - if(black<=red) return ((color=='black'&&get.position(card)=='h')?8:4)-get.value(card); - return (color=='red'&&get.position(card)=='h'?8:4)-get.value(card); }, - content:function(){ + }, + shenxing: { + audio: 2, + enable: "phaseUse", + position: "he", + filterCard: true, + selectCard: 2, + prompt: "弃置两张牌并摸一张牌", + check: function (card) { + var player = _status.event.player; + if ( + !player.hasSkill("olbingyi") || + player.hasSkill("olbingyi_blocker", null, null, false) + ) + return 4 - get.value(card); + var red = 0, + black = 0, + hs = player.getCards("h"); + for (var i of hs) { + if (ui.selected.cards.includes(i)) continue; + var color = get.color(i, player); + if (color == "red") red++; + if (color == "black") black++; + } + if (red > 2 && black > 2) return 4 - get.value(card); + if (red == 0 || black == 0) return 8 - get.value(card); + var color = get.color(card); + if (black <= red) + return (color == "black" && get.position(card) == "h" ? 8 : 4) - get.value(card); + return (color == "red" && get.position(card) == "h" ? 8 : 4) - get.value(card); + }, + content: function () { player.draw(); }, - ai:{ - order:9, - result:{ - player:function(player,target){ - if(!ui.selected.cards.length) return 1; - if(!player.hasSkill('olbingyi')||player.hasSkill('olbingyi_blocker',null,null,false)) return 1; - var red=0,black=0,hs=player.getCards('h'); - for(var i of hs){ - if(ui.selected.cards.includes(i)) continue; - var color=get.color(i); - if(color=='red') red++; - if(color=='black') black++; + ai: { + order: 9, + result: { + player: function (player, target) { + if (!ui.selected.cards.length) return 1; + if ( + !player.hasSkill("olbingyi") || + player.hasSkill("olbingyi_blocker", null, null, false) + ) + return 1; + var red = 0, + black = 0, + hs = player.getCards("h"); + for (var i of hs) { + if (ui.selected.cards.includes(i)) continue; + var color = get.color(i); + if (color == "red") red++; + if (color == "black") black++; } - var val=0; - for(var i of ui.selected.cards) val+=get.value(i,player); - if(red==0||black==0){ - if(red+black==0) return 0; - var num=Math.min(red+black,game.countPlayer(function(current){ - return current!=player&&get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); - }))+1; - if(num*7>val) return 1; + var val = 0; + for (var i of ui.selected.cards) val += get.value(i, player); + if (red == 0 || black == 0) { + if (red + black == 0) return 0; + var num = + Math.min( + red + black, + game.countPlayer(function (current) { + return ( + current != player && + get.attitude(player, current) > 0 && + !current.hasSkillTag("nogain") + ); + }) + ) + 1; + if (num * 7 > val) return 1; } - if(val<8) return 1; + if (val < 8) return 1; return 0; }, }, }, }, - bingyi:{ - audio:2, - audioname:['xin_guyong'], - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.countCards('h')>0; + bingyi: { + audio: 2, + audioname: ["xin_guyong"], + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.countCards("h") > 0; }, - filterx:function(event,player){ - var cards=player.getCards('h'); - if(cards.length<1) return false; - var color=get.color(cards[0]); - for(var i=1;i=2) return false; - if(player.hp==1) return false; - if(player.hp==2&&player.countCards('h')<2) return false; - if(event.player.countCards('h')>=event.player.hp) return false; + logTarget: "player", + check: function (event, player) { + if (get.attitude(player, event.player) < 5) return false; + if (player.maxHp - player.hp >= 2) return false; + if (player.hp == 1) return false; + if (player.hp == 2 && player.countCards("h") < 2) return false; + if (event.player.countCards("h") >= event.player.hp) return false; return true; }, - content:function(){ - "step 0" - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2); + content: function () { + "step 0"; + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); player.draw(2); - "step 1" - player.chooseCard(2,'he',true,'交给'+get.translation(trigger.player)+'两张牌').set('ai',function(card){ - if(ui.selected.cards.length&&card.name==ui.selected.cards[0].name) return -1; - if(get.tag(card,'damage')) return 1; - if(get.type(card)=='equip') return 1; - return 0; - }); - "step 2" - player.give(result.cards,trigger.player); - trigger.player.addSkill('xiantu4'); + ("step 1"); + player + .chooseCard(2, "he", true, "交给" + get.translation(trigger.player) + "两张牌") + .set("ai", function (card) { + if (ui.selected.cards.length && card.name == ui.selected.cards[0].name) return -1; + if (get.tag(card, "damage")) return 1; + if (get.type(card) == "equip") return 1; + return 0; + }); + ("step 2"); + player.give(result.cards, trigger.player); + trigger.player.addSkill("xiantu4"); trigger.player.storage.xiantu4.push(player); }, - ai:{ - threaten:1.1 - } - }, - xiantu1:{audio:true}, - xiantu2:{audio:true}, - xiantu4:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - audio:false, - onremove:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + ai: { + threaten: 1.1, }, - charlotte:true, - content:function(){ - while(player.storage.xiantu4.length){ - var current=player.storage.xiantu4.shift(); - if(current.isDead()) continue; - current.logSkill('xiantu2'); + }, + xiantu1: { audio: true }, + xiantu2: { audio: true }, + xiantu4: { + trigger: { player: "phaseUseEnd" }, + forced: true, + audio: false, + onremove: true, + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; + }, + charlotte: true, + content: function () { + while (player.storage.xiantu4.length) { + var current = player.storage.xiantu4.shift(); + if (current.isDead()) continue; + current.logSkill("xiantu2"); current.loseHp(); } - player.removeSkill('xiantu4'); + player.removeSkill("xiantu4"); }, - group:'xiantu3' + group: "xiantu3", }, - xiantu3:{ - trigger:{source:'dieAfter'}, - forced:true, - audio:false, - content:function(){ - player.removeSkill('xiantu4'); - } + xiantu3: { + trigger: { source: "dieAfter" }, + forced: true, + audio: false, + content: function () { + player.removeSkill("xiantu4"); + }, }, - qiangzhi:{ - audio:2, - audioname:['re_zhangsong'], - trigger:{player:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; + qiangzhi: { + audio: 2, + audioname: ["re_zhangsong"], + trigger: { player: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; }); }, - subfrequent:['draw'], - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('qiangzhi'),function(card,player,target){ - return target!=player&&target.countCards('h')>0; - }).set('ai',function(){ - return Math.random(); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('qiangzhi',target); - player.choosePlayerCard(target,'h',true); - } - else event.finish(); - 'step 2' - var card=result.cards[0]; - target.showCards(card,get.translation(target)+'因【强识】展示'); - player.storage.qiangzhi_draw=get.type(card,'trick'); - game.addVideo('storage',player,['qiangzhi_draw',player.storage.qiangzhi_draw]); - player.addTempSkill('qiangzhi_draw','phaseUseEnd'); + subfrequent: ["draw"], + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("qiangzhi"), function (card, player, target) { + return target != player && target.countCards("h") > 0; + }) + .set("ai", function () { + return Math.random(); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("qiangzhi", target); + player.choosePlayerCard(target, "h", true); + } else event.finish(); + ("step 2"); + var card = result.cards[0]; + target.showCards(card, get.translation(target) + "因【强识】展示"); + player.storage.qiangzhi_draw = get.type(card, "trick"); + game.addVideo("storage", player, ["qiangzhi_draw", player.storage.qiangzhi_draw]); + player.addTempSkill("qiangzhi_draw", "phaseUseEnd"); }, }, - qiangzhi_draw:{ - trigger:{player:'useCard'}, - frequent:true, - popup:false, - charlotte:true, - prompt:'是否执行【强识】的效果摸一张牌?', - filter:function(event,player){ - return get.type(event.card,'trick')==player.storage.qiangzhi_draw; + qiangzhi_draw: { + trigger: { player: "useCard" }, + frequent: true, + popup: false, + charlotte: true, + prompt: "是否执行【强识】的效果摸一张牌?", + filter: function (event, player) { + return get.type(event.card, "trick") == player.storage.qiangzhi_draw; }, - content:function(){ + content: function () { player.draw(); }, - onremove:true, - mark:true, - intro:{ - content:function(type){ - return get.translation(type)+'牌'; - } + onremove: true, + mark: true, + intro: { + content: function (type) { + return get.translation(type) + "牌"; + }, }, }, - dingpin:{ - audio:2, - enable:'phaseUse', - onChooseToUse:function(event){ - if(event.type!='phase'||game.online) return; - var list=[],player=event.player; - player.getHistory('useCard',function(evt){ + dingpin: { + audio: 2, + enable: "phaseUse", + onChooseToUse: function (event) { + if (event.type != "phase" || game.online) return; + var list = [], + player = event.player; + player.getHistory("useCard", function (evt) { list.add(get.type2(evt.card)); }); - player.getHistory('lose',function(evt){ - if(evt.type!='discard') return; - for(var i of evt.cards2){ - list.add(get.type2(i,evt.hs.includes(i)?player:false)); + player.getHistory("lose", function (evt) { + if (evt.type != "discard") return; + for (var i of evt.cards2) { + list.add(get.type2(i, evt.hs.includes(i) ? player : false)); } - }) - event.set('dingpin_types',list); + }); + event.set("dingpin_types", list); }, - filter:function(event,player){ - var list=event.dingpin_types||[]; - return player.countCards('he',function(card){ - return !list.includes(get.type2(card)); - })>0; + filter: function (event, player) { + var list = event.dingpin_types || []; + return ( + player.countCards("he", function (card) { + return !list.includes(get.type2(card)); + }) > 0 + ); }, - filterCard:function(card){ - var list=_status.event.dingpin_types||[]; + filterCard: function (card) { + var list = _status.event.dingpin_types || []; return !list.includes(get.type2(card)); }, - position:'he', - filterTarget:function(card,player,target){ - return !target.hasSkill('dingpin2'); + position: "he", + filterTarget: function (card, player, target) { + return !target.hasSkill("dingpin2"); }, - content:function(){ - 'step 0' - target.judge(function(card){ - var evt=_status.event.getParent('dingpin'),color=get.color(card); - switch(color){ - case 'black':return evt.target.getDamagedHp(); - case 'red':return get.sgn(get.attitude(evt.target,evt.player))*-3; + content: function () { + "step 0"; + target.judge(function (card) { + var evt = _status.event.getParent("dingpin"), + color = get.color(card); + switch (color) { + case "black": + return evt.target.getDamagedHp(); + case "red": + return get.sgn(get.attitude(evt.target, evt.player)) * -3; } return 0; - }).judge2=function(result){ - if(result.color=='black') return true; + }).judge2 = function (result) { + if (result.color == "black") return true; return false; }; - 'step 1' - switch(result.color){ - case 'black': - if(target.getDamagedHp()>0) target.draw(target.getDamagedHp()); - target.addTempSkill('dingpin2'); + ("step 1"); + switch (result.color) { + case "black": + if (target.getDamagedHp() > 0) target.draw(target.getDamagedHp()); + target.addTempSkill("dingpin2"); break; - case 'red': + case "red": player.turnOver(); break; } }, - ai:{ - order:9, - result:{ - target:function(player,target){ - if(player.isTurnedOver()) return target.getDamagedHp(); - var card=ui.cardPile.firstChild; - if(!card) return; - if(get.color(card)=='black') return target.getDamagedHp(); + ai: { + order: 9, + result: { + target: function (player, target) { + if (player.isTurnedOver()) return target.getDamagedHp(); + var card = ui.cardPile.firstChild; + if (!card) return; + if (get.color(card) == "black") return target.getDamagedHp(); return 0; }, }, }, }, - dingpin2:{charlotte:true}, - faen:{ - audio:2, - trigger:{global:['turnOverAfter','linkAfter']}, - filter:function(event,player){ - if(event.name=='link') return event.player.isLinked(); + dingpin2: { charlotte: true }, + faen: { + audio: 2, + trigger: { global: ["turnOverAfter", "linkAfter"] }, + filter: function (event, player) { + if (event.name == "link") return event.player.isLinked(); return !event.player.isTurnedOver(); }, - check:function(event,player){ - return get.attitude(player,event.player)>0; + check: function (event, player) { + return get.attitude(player, event.player) > 0; }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { trigger.player.draw(); }, - ai:{ - expose:0.2 - } - }, - jiaojin:{ - audio:2, - trigger:{player:'damageBegin3'}, - filter:function(event,player){ - return player.countCards('he',{type:'equip'})&&event.source&&event.source.hasSex('male'); + ai: { + expose: 0.2, }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he','骄矜:是否弃置一张装备牌令伤害-1?',function(card,player){ - return get.type(card)=='equip'; - }); - next.set('ai',function(card){ - var player=_status.event.player; - if(player.hp==1||_status.event.getTrigger().num>1){ - return 9-get.value(card); + }, + jiaojin: { + audio: 2, + trigger: { player: "damageBegin3" }, + filter: function (event, player) { + return ( + player.countCards("he", { type: "equip" }) && + event.source && + event.source.hasSex("male") + ); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + "骄矜:是否弃置一张装备牌令伤害-1?", + function (card, player) { + return get.type(card) == "equip"; } - if(player.hp==2){ - return 8-get.value(card); + ); + next.set("ai", function (card) { + var player = _status.event.player; + if (player.hp == 1 || _status.event.getTrigger().num > 1) { + return 9 - get.value(card); } - return 7-get.value(card); + if (player.hp == 2) { + return 8 - get.value(card); + } + return 7 - get.value(card); }); - next.logSkill='jiaojin'; - "step 1" - if(result.bool){ + next.logSkill = "jiaojin"; + ("step 1"); + if (result.bool) { game.delay(0.5); trigger.num--; } - } + }, }, - chanhui:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - if(_status.currentPhase!=player) return false; - if(player.hasSkill('chanhui2')) return false; - if(event.targets.length>1) return false; - var card=event.card; - if(card.name=='sha') return true; - if(get.color(card)=='black'&&get.type(card)=='trick') return true; + chanhui: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (_status.currentPhase != player) return false; + if (player.hasSkill("chanhui2")) return false; + if (event.targets.length > 1) return false; + var card = event.card; + if (card.name == "sha") return true; + if (get.color(card) == "black" && get.type(card) == "trick") return true; return false; }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('chanhui'),function(card,player,target){ - if(player==target) return false; - var evt=_status.event.getTrigger(); - return !evt.targets.includes(target)&&lib.filter.targetEnabled2(evt.card,player,target)&&lib.filter.targetInRange(evt.card,player,target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player)+0.01; - }); - "step 1" - if(result.bool){ - event.target=result.targets[0]; - } - else{ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("chanhui"), function (card, player, target) { + if (player == target) return false; + var evt = _status.event.getTrigger(); + return ( + !evt.targets.includes(target) && + lib.filter.targetEnabled2(evt.card, player, target) && + lib.filter.targetInRange(evt.card, player, target) + ); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) + 0.01; + }); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + } else { event.finish(); } - "step 2" - player.addTempSkill('chanhui2'); - player.logSkill('chanhui',event.target); - event.target.chooseCard('交给'+get.translation(player)+'一张手牌,或成为'+ - get.translation(trigger.card)+'的额外目标').set('ai',function(card){ - return 5-get.value(card); - }); - "step 3" - if(result.bool){ - target.give(result.cards,player); + ("step 2"); + player.addTempSkill("chanhui2"); + player.logSkill("chanhui", event.target); + event.target + .chooseCard( + "交给" + + get.translation(player) + + "一张手牌,或成为" + + get.translation(trigger.card) + + "的额外目标" + ) + .set("ai", function (card) { + return 5 - get.value(card); + }); + ("step 3"); + if (result.bool) { + target.give(result.cards, player); trigger.untrigger(); - trigger.getParent().player=event.target; - game.log(event.target,'成为了',trigger.card,'的使用者'); - } - else{ - game.log(event.target,'成为了',trigger.card,'的额外目标'); + trigger.getParent().player = event.target; + game.log(event.target, "成为了", trigger.card, "的使用者"); + } else { + game.log(event.target, "成为了", trigger.card, "的额外目标"); trigger.getParent().targets.push(event.target); } - } + }, }, - rechanhui:{ - audio:2, - trigger:{player:'useCardToPlayer'}, - filter:function(event,player){ - if(player.hasSkill('rechanhui2')) return false; - if(event.targets.length>1) return false; - var card=event.card; - if(card.name=='sha'||get.type(card)=='trick') return true; + rechanhui: { + audio: 2, + trigger: { player: "useCardToPlayer" }, + filter: function (event, player) { + if (player.hasSkill("rechanhui2")) return false; + if (event.targets.length > 1) return false; + var card = event.card; + if (card.name == "sha" || get.type(card) == "trick") return true; return false; }, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('rechanhui'),function(card,player,target){ - if(player==target) return false; - var trigger=_status.event; - return player.canUse(trigger.card,target,false)&&trigger.targets.includes(target)==false; - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player)+0.01; - }).set('targets',trigger.targets).set('card',trigger.card); - "step 1" - if(result.bool){ + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("rechanhui"), function (card, player, target) { + if (player == target) return false; + var trigger = _status.event; + return ( + player.canUse(trigger.card, target, false) && + trigger.targets.includes(target) == false + ); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, player, player) + 0.01; + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { //game.delay(0,200); - event.target=result.targets[0]; - } - else{ + event.target = result.targets[0]; + } else { event.finish(); } - "step 2" - player.logSkill('rechanhui',event.target); - event.target.chooseCard('交给'+get.translation(player)+'一张牌,或成为'+ - get.translation(trigger.card)+'的额外目标','he').set('ai',function(card){ - return 5-get.value(card); - }); - "step 3" - if(result.bool){ - target.give(result.cards,player); + ("step 2"); + player.logSkill("rechanhui", event.target); + event.target + .chooseCard( + "交给" + + get.translation(player) + + "一张牌,或成为" + + get.translation(trigger.card) + + "的额外目标", + "he" + ) + .set("ai", function (card) { + return 5 - get.value(card); + }); + ("step 3"); + if (result.bool) { + target.give(result.cards, player); trigger.untrigger(); - trigger.getParent().player=event.target; - game.log(event.target,'成为了',trigger.card,'的使用者'); - } - else{ - game.log(event.target,'成为了',trigger.card,'的额外目标'); + trigger.getParent().player = event.target; + game.log(event.target, "成为了", trigger.card, "的使用者"); + } else { + game.log(event.target, "成为了", trigger.card, "的额外目标"); trigger.getParent().targets.push(event.target); - player.addTempSkill('rechanhui2'); + player.addTempSkill("rechanhui2"); } - } - }, - rechanhui2:{charlotte:true}, - rejiaojin2:{charlotte:true}, - rejiaojin:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - filter:function(event,player){ - return (event.card.name=='sha'||get.type(event.card)=='trick')&&event.player!=player&&player.countCards('he',function(card){ - return _status.connectMode||get.type(card)=='equip'; - })&&!player.hasSkill('rejiaojin2'); }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he','骄矜:是否弃置一张装备牌令'+get.translation(trigger.card)+'对你无效?',function(card,player){ - return get.type(card)=='equip'; - }); - next.set('ai',function(card){ - if(_status.event.goon2){ - return 3+_status.event.val-get.value(card); + }, + rechanhui2: { charlotte: true }, + rejiaojin2: { charlotte: true }, + rejiaojin: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter: function (event, player) { + return ( + (event.card.name == "sha" || get.type(event.card) == "trick") && + event.player != player && + player.countCards("he", function (card) { + return _status.connectMode || get.type(card) == "equip"; + }) && + !player.hasSkill("rejiaojin2") + ); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + "骄矜:是否弃置一张装备牌令" + get.translation(trigger.card) + "对你无效?", + function (card, player) { + return get.type(card) == "equip"; + } + ); + next.set("ai", function (card) { + if (_status.event.goon2) { + return 3 + _status.event.val - get.value(card); } return 0; }); - next.set('val',get.value(trigger.cards.filterInD())); - next.set('goon2',get.effect(player,trigger.card,trigger.player,player)<0) - next.logSkill=['rejiaojin',trigger.player]; - "step 1" - if(result.bool){ - var cards=trigger.cards.filterInD(); - if(cards.length) player.gain(cards,'gain2','log'); + next.set("val", get.value(trigger.cards.filterInD())); + next.set("goon2", get.effect(player, trigger.card, trigger.player, player) < 0); + next.logSkill = ["rejiaojin", trigger.player]; + ("step 1"); + if (result.bool) { + var cards = trigger.cards.filterInD(); + if (cards.length) player.gain(cards, "gain2", "log"); trigger.excluded.push(player); - if(trigger.player.hasSex('female')) player.addTempSkill('rejiaojin2') + if (trigger.player.hasSex("female")) player.addTempSkill("rejiaojin2"); } - } - }, - chanhui2:{}, - quanji:{ - audio:2, - trigger:{player:'damageEnd'}, - frequent:true, - locked:false, - notemp:true, - filter:function(event){ - return event.num>0; }, - content:function(){ - "step 0" - event.count=trigger.num; - "step 1" + }, + chanhui2: {}, + quanji: { + audio: 2, + trigger: { player: "damageEnd" }, + frequent: true, + locked: false, + notemp: true, + filter: function (event) { + return event.num > 0; + }, + content: function () { + "step 0"; + event.count = trigger.num; + ("step 1"); event.count--; player.draw(); - "step 2" - if(player.countCards('h')){ - player.chooseCard('将一张手牌置于武将牌上作为“权”',true); - } - else{ + ("step 2"); + if (player.countCards("h")) { + player.chooseCard("将一张手牌置于武将牌上作为“权”", true); + } else { event.goto(4); } - "step 3" - if(result.cards&&result.cards.length){ - player.addToExpansion(result.cards,player,'giveAuto').gaintag.add('quanji'); + ("step 3"); + if (result.cards && result.cards.length) { + player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("quanji"); } - "step 4" - if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ - player.chooseBool(get.prompt2('quanji')).set('frequentSkill',event.name); - } - else event.finish(); - "step 5" - if(result.bool){ - player.logSkill('quanji'); + ("step 4"); + if ( + event.count > 0 && + player.hasSkill(event.name) && + !get.is.blocked(event.name, player) + ) { + player.chooseBool(get.prompt2("quanji")).set("frequentSkill", event.name); + } else event.finish(); + ("step 5"); + if (result.bool) { + player.logSkill("quanji"); event.goto(1); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - mod:{ - maxHandcard:function(player,num){ - return num+player.getExpansions('quanji').length; - } - }, - ai:{ - maixie:true, - maixie_hp:true, - threaten:0.8, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(target.hp>=4) return [0.5,get.tag(card,'damage')*2]; - if(!target.hasSkill('paiyi')&&target.hp>1) return [0.5,get.tag(card,'damage')*1.5]; - if(target.hp==3) return [0.5,get.tag(card,'damage')*1.5]; - if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; - } - } - } - } - }, - zili:{ - skillAnimation:true, - animationColor:'thunder', - audio:2, - audioname:['re_zhonghui'], - unique:true, - juexingji:true, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - derivation:'paiyi', - filter:function(event,player){ - return !player.hasSkill('paiyi')&&player.getExpansions('quanji').length>=3; - }, - content:function(){ - "step 0" - player.awakenSkill('zili'); - player.chooseDrawRecover(2,true,function(event,player){ - if(player.hp==1&&player.isDamaged()) return 'recover_hp'; - return 'draw_card'; - }); - "step 1" - player.loseMaxHp(); - player.addSkills('paiyi'); - }, - ai:{ - combo:'quanji' - } - }, - paiyi:{ - enable:'phaseUse', - usable:1, - audio:2, - audioname:['re_zhonghui'], - filter:function(event,player){ - return player.getExpansions('quanji').length>0; - }, - chooseButton:{ - dialog:function(event,player){ - return ui.create.dialog('排异',player.getExpansions('quanji'),'hidden') + mod: { + maxHandcard: function (player, num) { + return num + player.getExpansions("quanji").length; }, - backup:function(links,player){ + }, + ai: { + maixie: true, + maixie_hp: true, + threaten: 0.8, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; + if (!target.hasSkill("paiyi") && target.hp > 1) + return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; + } + }, + }, + }, + }, + zili: { + skillAnimation: true, + animationColor: "thunder", + audio: 2, + audioname: ["re_zhonghui"], + unique: true, + juexingji: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + derivation: "paiyi", + filter: function (event, player) { + return !player.hasSkill("paiyi") && player.getExpansions("quanji").length >= 3; + }, + content: function () { + "step 0"; + player.awakenSkill("zili"); + player.chooseDrawRecover(2, true, function (event, player) { + if (player.hp == 1 && player.isDamaged()) return "recover_hp"; + return "draw_card"; + }); + ("step 1"); + player.loseMaxHp(); + player.addSkills("paiyi"); + }, + ai: { + combo: "quanji", + }, + }, + paiyi: { + enable: "phaseUse", + usable: 1, + audio: 2, + audioname: ["re_zhonghui"], + filter: function (event, player) { + return player.getExpansions("quanji").length > 0; + }, + chooseButton: { + dialog: function (event, player) { + return ui.create.dialog("排异", player.getExpansions("quanji"), "hidden"); + }, + backup: function (links, player) { return { - audio:'paiyi', - audioname:['re_zhonghui'], - filterTarget:true, - filterCard:function(){return false}, - selectCard:-1, - card:links[0], - delay:false, - content:lib.skill.paiyi.contentx, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(player!=target) return 0; - if(player.hasSkill('requanji')||(player.countCards('h')+2<=player.hp+player.getExpansions('quanji').length)) return 1; + audio: "paiyi", + audioname: ["re_zhonghui"], + filterTarget: true, + filterCard: function () { + return false; + }, + selectCard: -1, + card: links[0], + delay: false, + content: lib.skill.paiyi.contentx, + ai: { + order: 10, + result: { + target: function (player, target) { + if (player != target) return 0; + if ( + player.hasSkill("requanji") || + player.countCards("h") + 2 <= + player.hp + player.getExpansions("quanji").length + ) + return 1; return 0; - } + }, }, }, - } + }; + }, + prompt: function () { + return "请选择〖排异〗的目标"; }, - prompt:function(){return '请选择〖排异〗的目标'}, }, - contentx:function(){ - "step 0" - var card=lib.skill.paiyi_backup.card; + contentx: function () { + "step 0"; + var card = lib.skill.paiyi_backup.card; player.loseToDiscardpile(card); - "step 1" + ("step 1"); target.draw(2); - "step 2" - if(target.countCards('h')>player.countCards('h')){ + ("step 2"); + if (target.countCards("h") > player.countCards("h")) { target.damage(); } }, - ai:{ - order:1, - combo:'quanji', - result:{ - player:1, - } - } + ai: { + order: 1, + combo: "quanji", + result: { + player: 1, + }, + }, }, - xianzhou:{ - skillAnimation:true, - animationColor:'gray', - audio:2, - audioname:['xin_caifuren'], - unique:true, - limited:true, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('e')>0; + xianzhou: { + skillAnimation: true, + animationColor: "gray", + audio: 2, + audioname: ["xin_caifuren"], + unique: true, + limited: true, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("e") > 0; }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - mark:true, - delay:false, - content:function(){ - "step 0" - player.awakenSkill('xianzhou'); - var cards=player.getCards('e'); - player.give(cards,target); - event.num=cards.length; + mark: true, + delay: false, + content: function () { + "step 0"; + player.awakenSkill("xianzhou"); + var cards = player.getCards("e"); + player.give(cards, target); + event.num = cards.length; game.delay(); - "step 1" - target.chooseTarget([1,event.num],'令'+get.translation(player)+'回复'+ - event.num+'点体力,或对攻击范围内的'+event.num+'名角色造成1点伤害',function(card,player,target2){ - return _status.event.player.inRange(target2); - }).set('ai',function(target2){ - var target=_status.event.player; - var player=_status.event.getParent().player; - if(get.attitude(target,player)>0){ - if(player.hp+event.num<=player.maxHp||player.hp==1) return -1; - } - return get.damageEffect(target2,target,target); - }); - "step 2" - if(result.bool){ - target.line(result.targets,'green'); - event.targets=result.targets; - event.num2=0; - } - else{ + ("step 1"); + target + .chooseTarget( + [1, event.num], + "令" + + get.translation(player) + + "回复" + + event.num + + "点体力,或对攻击范围内的" + + event.num + + "名角色造成1点伤害", + function (card, player, target2) { + return _status.event.player.inRange(target2); + } + ) + .set("ai", function (target2) { + var target = _status.event.player; + var player = _status.event.getParent().player; + if (get.attitude(target, player) > 0) { + if (player.hp + event.num <= player.maxHp || player.hp == 1) return -1; + } + return get.damageEffect(target2, target, target); + }); + ("step 2"); + if (result.bool) { + target.line(result.targets, "green"); + event.targets = result.targets; + event.num2 = 0; + } else { player.recover(event.num); event.finish(); } - "step 3" - if(event.num22&&get.attitude(players[i],player)>2){ - bool=false;break; + ai: { + order: 1, + result: { + target: 1, + player: function (player) { + var bool = true, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + get.attitude(player, players[i]) > 2 && + get.attitude(players[i], player) > 2 + ) { + bool = false; + break; } } - if(bool) return -10; - if(player.hp==1) return 1; - if(game.phaseNumber0){ - return '移动装备'; + if ( + trigger.player.hasCard(function (card) { + return player.canEquip(card); + }, "e") + ) { + next = player + .chooseControl("移动装备", "draw_card", "cancel2", function (event, player) { + var source = _status.event.sourcex; + var att = get.attitude(player, source); + if (source.hasSkillTag("noe")) { + if (att > 0) { + return "移动装备"; + } + } else { + if ( + att <= 0 && + source.countCards("e", function (card) { + return ( + get.value(card, source) > 0 && + get.effect(player, card, player, player) > 0 + ); + }) + ) { + return "移动装备"; + } } - } - else{ - if(att<=0&&source.countCards('e',function(card){ - return get.value(card,source)>0&&get.effect(player,card,player,player)>0; - })){ - return '移动装备'; - } - } - return 'draw_card'; - }).set('sourcex',trigger.player); - } - else{ - next=player.chooseControl('draw_card','cancel2',function(){ - return 'draw_card'; + return "draw_card"; + }) + .set("sourcex", trigger.player); + } else { + next = player.chooseControl("draw_card", "cancel2", function () { + return "draw_card"; }); } - next.set('prompt',get.prompt('qieting',trigger.player)); - "step 1" - if(result.control=='移动装备'){ - player.logSkill('qieting',trigger.player); - player.choosePlayerCard(trigger.player,'e','将一张装备牌移至你的装备区',true).set('filterButton',function(button){ - return _status.event.player.canEquip(button.link); - }).set('ai',function(button){ - return get.effect(player,button.link,player,player); - }); - } - else{ - if(result.control=='draw_card'){ - player.logSkill('qieting'); + next.set("prompt", get.prompt("qieting", trigger.player)); + ("step 1"); + if (result.control == "移动装备") { + player.logSkill("qieting", trigger.player); + player + .choosePlayerCard(trigger.player, "e", "将一张装备牌移至你的装备区", true) + .set("filterButton", function (button) { + return _status.event.player.canEquip(button.link); + }) + .set("ai", function (button) { + return get.effect(player, button.link, player, player); + }); + } else { + if (result.control == "draw_card") { + player.logSkill("qieting"); player.draw(); } event.finish(); } - "step 2" - if(result&&result.links&&result.links.length){ + ("step 2"); + if (result && result.links && result.links.length) { game.delay(2); - trigger.player.$give(result.links[0],player,false); + trigger.player.$give(result.links[0], player, false); player.equip(result.links[0]); player.addExpose(0.2); } }, }, - oldzhuikong:{ - audio:'zhuikong', - inherit:'zhuikong', + oldzhuikong: { + audio: "zhuikong", + inherit: "zhuikong", }, - zhuikong:{ - audio:2, - trigger:{global:'phaseZhunbeiBegin'}, - check:function(event,player){ - if(get.attitude(player,event.player)<-2){ - var cards=player.getCards('h'); - if(cards.length>player.hp) return true; - for(var i=0;i9&&useful<7) return true; + zhuikong: { + audio: 2, + trigger: { global: "phaseZhunbeiBegin" }, + check: function (event, player) { + if (get.attitude(player, event.player) < -2) { + var cards = player.getCards("h"); + if (cards.length > player.hp) return true; + for (var i = 0; i < cards.length; i++) { + var useful = get.useful(cards[i]); + if (useful < 5) return true; + if (get.number(cards[i]) > 9 && useful < 7) return true; } } return false; }, - logTarget:'player', - filter:function(event,player){ - return player.hp0&&lib.filter.targetEnabled(event.card,event.player,current); - }); + oldqiuyuan: { + audio: "qiuyuan", + inherit: "qiuyuan", + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return ( + current != player && + !event.targets.includes(current) && + current.countCards("h") > 0 && + lib.filter.targetEnabled(event.card, event.player, current) + ); + }) + ); }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('oldqiuyuan'),function(card,player,target){ - var evt=_status.event.getTrigger(); - return target!=player&&!evt.targets.includes(target)&&lib.filter.targetEnabled(evt.card,evt.player,target)&&target.countCards('h')>0; - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,trigger.player,player)+0.1; - }).set('targets',trigger.targets).set('playerx',trigger.player); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('oldqiuyuan',target); - event.target=target; - target.chooseCard('交给'+get.translation(player)+ - '一张牌,若此牌不为【闪】,则也成为此杀的额外目标',true).set('ai',function(card){ - return -get.value(card,player,'raw'); - }).set('sourcex',player); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("oldqiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + !evt.targets.includes(target) && + lib.filter.targetEnabled(evt.card, evt.player, target) && + target.countCards("h") > 0 + ); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }) + .set("targets", trigger.targets) + .set("playerx", trigger.player); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("oldqiuyuan", target); + event.target = target; + target + .chooseCard( + "交给" + + get.translation(player) + + "一张牌,若此牌不为【闪】,则也成为此杀的额外目标", + true + ) + .set("ai", function (card) { + return -get.value(card, player, "raw"); + }) + .set("sourcex", player); game.delay(); - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool){ - target.give(result.cards,player,'give'); - if(get.name(result.cards[0])!='shan'){ + ("step 2"); + if (result.bool) { + target.give(result.cards, player, "give"); + if (get.name(result.cards[0]) != "shan") { trigger.getParent().targets.push(event.target); trigger.getParent().triggeredTargets2.push(event.target); - game.log(event.target,'成为了额外目标'); + game.log(event.target, "成为了额外目标"); } game.delay(); } }, }, - qiuyuan:{ - audio:2, - trigger:{target:'useCardToTarget'}, - direct:true, - filter:function(event,player){ - return event.card.name=='sha'&&game.hasPlayer(function(current){ - return current!=player&&!event.targets.includes(current)&&lib.filter.targetEnabled(event.card,event.player,current); - }); + qiuyuan: { + audio: 2, + trigger: { target: "useCardToTarget" }, + direct: true, + filter: function (event, player) { + return ( + event.card.name == "sha" && + game.hasPlayer(function (current) { + return ( + current != player && + !event.targets.includes(current) && + lib.filter.targetEnabled(event.card, event.player, current) + ); + }) + ); }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('qiuyuan'),function(card,player,target){ - var evt=_status.event.getTrigger(); - return target!=player&&!evt.targets.includes(target)&&lib.filter.targetEnabled(evt.card,evt.player,target); - }).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,trigger.player,player)+0.1; - }).set('targets',trigger.targets).set('playerx',trigger.player); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('qiuyuan',target); - event.target=target; - target.chooseCard({name:'shan'},'交给'+get.translation(player)+ - '一张闪,或成为此杀的额外目标').set('ai',function(card){ - return get.attitude(target,_status.event.sourcex)>=0?1:-1; - }).set('sourcex',player); + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("qiuyuan"), function (card, player, target) { + var evt = _status.event.getTrigger(); + return ( + target != player && + !evt.targets.includes(target) && + lib.filter.targetEnabled(evt.card, evt.player, target) + ); + }) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return get.effect(target, trigger.card, trigger.player, player) + 0.1; + }) + .set("targets", trigger.targets) + .set("playerx", trigger.player); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qiuyuan", target); + event.target = target; + target + .chooseCard( + { name: "shan" }, + "交给" + get.translation(player) + "一张闪,或成为此杀的额外目标" + ) + .set("ai", function (card) { + return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1; + }) + .set("sourcex", player); game.delay(); - } - else{ + } else { event.finish(); } - "step 2" - if(result.bool){ - target.give(result.cards,player); + ("step 2"); + if (result.bool) { + target.give(result.cards, player); game.delay(); - } - else{ + } else { trigger.getParent().targets.push(event.target); trigger.getParent().triggeredTargets2.push(event.target); - game.log(event.target,'成为了额外目标'); + game.log(event.target, "成为了额外目标"); } }, - ai:{ - expose:0.2, - effect:{ - target:function(card,player,target){ - if(card.name!='sha') return; - var players=game.filterPlayer(); - if(get.attitude(player,target)<=0){ - for(var i=0;i0&& - get.effect(target2,{name:'shacopy',nature:card.nature,suit:card.suit},player,player)<0){ - if(target.hp==target.maxHp) return 0.3; + ai: { + expose: 0.2, + effect: { + target: function (card, player, target) { + if (card.name != "sha") return; + var players = game.filterPlayer(); + if (get.attitude(player, target) <= 0) { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if ( + player != target2 && + target != target2 && + player.canUse(card, target2, false) && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + target + ) > 0 && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + player + ) < 0 + ) { + if (target.hp == target.maxHp) return 0.3; return 0.6; } } - } - else{ - for(var i=0;i0){ - if(player.canUse(card,target2)) return; - if(target.hp==target.maxHp) return [0,1]; - return [0,0]; + } else { + for (var i = 0; i < players.length; i++) { + var target2 = players[i]; + if ( + player != target2 && + target != target2 && + player.canUse(card, target2, false) && + get.effect( + target2, + { name: "shacopy", nature: card.nature, suit: card.suit }, + player, + player + ) > 0 + ) { + if (player.canUse(card, target2)) return; + if (target.hp == target.maxHp) return [0, 1]; + return [0, 0]; } } } - } - } - } - }, - gongji:{ - enable:'phaseUse', - usable:1, - audio:2, - position:'he', - filterCard:true, - check:function(card){ - if(get.type(card)!='equip') return 0; - var player=_status.currentPhase; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); - } - return 6-get.equipValue(card); + }, + }, }, - content:function(){ - "step 0" - player.addTempSkill('gongji2'); - "step 1" - if(get.type(cards[0],null,cards[0].original=='h'?player:false)=='equip'){ - player.chooseTarget('是否弃置一名角色的一张牌?',function(card,player,target){ - return player!=target&&target.countCards('he')>0; - }).set('ai',function(target){ - var player=_status.event.player; - if(get.attitude(player,target)<0){ - return Math.max(0.5,get.effect(target,{name:'sha'},player,player)); - } - return 0; - }); + }, + gongji: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: true, + check: function (card) { + if (get.type(card) != "equip") return 0; + var player = _status.currentPhase; + if (player.countCards("he", { subtype: get.subtype(card) }) > 1) { + return 11 - get.equipValue(card); } - else{ + return 6 - get.equipValue(card); + }, + content: function () { + "step 0"; + player.addTempSkill("gongji2"); + ("step 1"); + if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") { + player + .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) { + return player != target && target.countCards("he") > 0; + }) + .set("ai", function (target) { + var player = _status.event.player; + if (get.attitude(player, target) < 0) { + return Math.max(0.5, get.effect(target, { name: "sha" }, player, player)); + } + return 0; + }); + } else { event.finish(); } - "step 2" - if(result.bool){ - player.line(result.targets,'green'); - event.target=result.targets[0]; - player.discardPlayerCard(event.target,'he',true).ai=get.buttonValue; + ("step 2"); + if (result.bool) { + player.line(result.targets, "green"); + event.target = result.targets[0]; + player.discardPlayerCard(event.target, "he", true).ai = get.buttonValue; } }, - ai:{ - order:9, - result:{ - player:1 - } - } + ai: { + order: 9, + result: { + player: 1, + }, + }, }, - gongji2:{ - mod:{ - attackRangeBase:function(){ + gongji2: { + mod: { + attackRangeBase: function () { return Infinity; }, }, }, - zhuiyi:{ - audio:2, - audioname:['re_bulianshi'], - trigger:{player:'die'}, - direct:true, - skillAnimation:true, - animationColor:'wood', - forceDie:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('zhuiyi'),function(card,player,target){ - return player!=target&&_status.event.sourcex!=target; - }).set('forceDie',true).set('ai',function(target){ - var num=get.attitude(_status.event.player,target); - if(num>0){ - if(target.hp==1){ - num+=2; + zhuiyi: { + audio: 2, + audioname: ["re_bulianshi"], + trigger: { player: "die" }, + direct: true, + skillAnimation: true, + animationColor: "wood", + forceDie: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("zhuiyi"), function (card, player, target) { + return player != target && _status.event.sourcex != target; + }) + .set("forceDie", true) + .set("ai", function (target) { + var num = get.attitude(_status.event.player, target); + if (num > 0) { + if (target.hp == 1) { + num += 2; + } + if (target.hp < target.maxHp) { + num += 2; + } } - if(target.hpplayers[i].countCards('h')) return true; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; } return false; }, - selectTarget:2, - content:function(){ - 'step 0' - var gainner,giver; - if(targets[0].countCards('h')0) return -1; - var players=game.filterPlayer(); - for(var i=0;i0) return -3; + ai: { + order: 10.5, + threaten: 2.3, + result: { + target: function (player, target) { + var num = target.countCards("h"); + var att = get.attitude(player, target); + if (ui.selected.targets.length == 0) { + if (att > 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (num2 < num) { + if (att2 > 0) return -3; return -1; } } return 0; - } - else{ + } else { return 1; } }, - player:1, - } - } + player: 1, + }, + }, }, - anxu:{ - enable:'phaseUse', - usable:1, - multitarget:true, - audio:2, - filterTarget:function(card,player,target){ - if(player==target) return false; - var num=target.countCards('h'); - if(ui.selected.targets.length){ - return numplayers[i].countCards('h')) return true; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (num > players[i].countCards("h")) return true; } return false; }, - selectTarget:2, - content:function(){ - 'step 0' - var gainner,giver; - if(targets[0].countCards('h')0) return -1; - var players=game.filterPlayer(); - for(var i=0;i=0&&num2 0) return -1; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + var num2 = players[i].countCards("h"); + var att2 = get.attitude(player, players[i]); + if (att2 >= 0 && num2 < num) return -1; } return 0; - } - else{ + } else { return 1; } }, - player:0.1 - } - } + player: 0.1, + }, + }, }, - mingce:{ - enable:'phaseUse', - usable:1, - audio:2, - position:'he', - filterCard:function(card){ - return get.name(card)=='sha'||get.type(card)=='equip'; + mingce: { + enable: "phaseUse", + usable: 1, + audio: 2, + position: "he", + filterCard: function (card) { + return get.name(card) == "sha" || get.type(card) == "equip"; }, - filter:function(event,player){ - return player.countCards('h','sha')>0||player.countCards('he',{type:'equip'})>0; + filter: function (event, player) { + return ( + player.countCards("h", "sha") > 0 || player.countCards("he", { type: "equip" }) > 0 + ); }, - check:function(card){return 8-get.value(card)}, - selectTarget:2, - multitarget:true, - discard:false, - lose:false, - targetprompt:['得到牌','出杀目标'], - filterTarget:function(card,player,target){ - if(ui.selected.targets.length==0){ - return player!=target; - } - else{ + check: function (card) { + return 8 - get.value(card); + }, + selectTarget: 2, + multitarget: true, + discard: false, + lose: false, + targetprompt: ["得到牌", "出杀目标"], + filterTarget: function (card, player, target) { + if (ui.selected.targets.length == 0) { + return player != target; + } else { return ui.selected.targets[0].inRange(target); } }, - delay:false, - content:function(){ - "step 0" - player.give(cards,targets[0],'visible'); - "step 1" - if(!lib.filter.filterTarget({name:'sha',isCard:true},targets[0],targets[1])) event._result={control:'draw_card'}; - else targets[0].chooseControl('draw_card','出杀',function(){ - var player=_status.event.player; - var target=_status.event.target; - if(get.effect(_status.event.target,{name:'sha'},player,player)>0){ - return 1; - } - return 0; - }).set('target',targets[1]).set('prompt','对'+get.translation(targets[1])+'使用一张杀,或摸一张牌'); - "step 2" - if(result.control=='draw_card'){ + delay: false, + content: function () { + "step 0"; + player.give(cards, targets[0], "visible"); + ("step 1"); + if (!lib.filter.filterTarget({ name: "sha", isCard: true }, targets[0], targets[1])) + event._result = { control: "draw_card" }; + else + targets[0] + .chooseControl("draw_card", "出杀", function () { + var player = _status.event.player; + var target = _status.event.target; + if (get.effect(_status.event.target, { name: "sha" }, player, player) > 0) { + return 1; + } + return 0; + }) + .set("target", targets[1]) + .set("prompt", "对" + get.translation(targets[1]) + "使用一张杀,或摸一张牌"); + ("step 2"); + if (result.control == "draw_card") { targets[0].draw(); - } - else{ - targets[0].useCard({name:'sha',isCard:true},targets[1]); + } else { + targets[0].useCard({ name: "sha", isCard: true }, targets[1]); } }, - ai:{ - result:{ - player:function(player){ - var players=game.filterPlayer(); - for(var i=0;i1&&get.attitude(players[i],player)>1){ + ai: { + result: { + player: function (player) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + get.attitude(player, players[i]) > 1 && + get.attitude(players[i], player) > 1 + ) { return 1; } } return 0; }, - target:function(player,target){ - if(ui.selected.targets.length){ + target: function (player, target) { + if (ui.selected.targets.length) { return -0.1; } return 1; - } + }, }, - order:8.5, - expose:0.2 - } + order: 8.5, + expose: 0.2, + }, }, - xinxuanhuo:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - direct:true, - filter:function(event,player){ + xinxuanhuo: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + direct: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2('xinxuanhuo'),function(card,player,target){ - return player!=target; - }).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0){ - if(target.countCards('h') 0) { + if (target.countCards("h") < target.hp) att += 2; + return att - target.countCards("h") / 3; + } else { + return -1; + } + }); + ("step 1"); + if (result.bool) { trigger.changeToZero(); - player.logSkill('xinxuanhuo',result.targets); - event.target=result.targets[0]; + player.logSkill("xinxuanhuo", result.targets); + event.target = result.targets[0]; event.target.draw(2); - } - else{ + } else { event.finish(); } - "step 2" - if(game.hasPlayer(function(current){ - return target.canUse('sha',current); - })) player.chooseTarget('选择出杀的目标',true,function(card,player,target){ - return _status.event.target.canUse('sha',target); - }).set('ai',function(target){ - return get.effect(target,{name:'sha'},_status.event.target,_status.event.player); - }).set('target',event.target); - "step 3" - if(result.bool&&result.targets.length){ - game.log(player,'指定的出杀目标为',result.targets); + ("step 2"); + if ( + game.hasPlayer(function (current) { + return target.canUse("sha", current); + }) + ) + player + .chooseTarget("选择出杀的目标", true, function (card, player, target) { + return _status.event.target.canUse("sha", target); + }) + .set("ai", function (target) { + return get.effect( + target, + { name: "sha" }, + _status.event.target, + _status.event.player + ); + }) + .set("target", event.target); + ("step 3"); + if (result.bool && result.targets.length) { + game.log(player, "指定的出杀目标为", result.targets); event.target.line(result.targets); - event.target.chooseToUse('对'+get.translation(result.targets)+'使用一张杀,或令'+get.translation(player)+'获得你的两张牌',{name:'sha'},result.targets[0],-1); + event.target.chooseToUse( + "对" + + get.translation(result.targets) + + "使用一张杀,或令" + + get.translation(player) + + "获得你的两张牌", + { name: "sha" }, + result.targets[0], + -1 + ); + } else { + event.bool = true; } - else{ - event.bool=true; - } - "step 4" - if(event.bool||result.bool==false){ - player.gainPlayerCard('he',event.target,Math.min(2,event.target.countCards('he')),true); + ("step 4"); + if (event.bool || result.bool == false) { + player.gainPlayerCard( + "he", + event.target, + Math.min(2, event.target.countCards("he")), + true + ); } }, - ai:{ - expose:0.2 - } + ai: { + expose: 0.2, + }, }, - zhichi:{ - audio:2, - trigger:{player:'damageEnd'}, - audioname:['re_chengong'], - forced:true, - filter:function(event,player){ - return _status.currentPhase!=player; + zhichi: { + audio: 2, + trigger: { player: "damageEnd" }, + audioname: ["re_chengong"], + forced: true, + filter: function (event, player) { + return _status.currentPhase != player; + }, + content: function () { + player.addTempSkill("zhichi2", ["phaseAfter", "phaseBefore"]); }, - content:function(){ - player.addTempSkill('zhichi2',['phaseAfter','phaseBefore']); - } }, - zhichi2:{ - trigger:{target:'useCardToBefore'}, - forced:true, - charlotte:true, - priority:15, - filter:function(event,player){ - return get.type(event.card)=='trick'||event.card.name=='sha'; + zhichi2: { + trigger: { target: "useCardToBefore" }, + forced: true, + charlotte: true, + priority: 15, + filter: function (event, player) { + return get.type(event.card) == "trick" || event.card.name == "sha"; }, - content:function(){ - game.log(player,'发动了智迟,',trigger.card,'对',trigger.target,'失效') + content: function () { + game.log(player, "发动了智迟,", trigger.card, "对", trigger.target, "失效"); trigger.cancel(); }, - mark:true, - intro:{ - content:'杀或普通锦囊牌对你无效' + mark: true, + intro: { + content: "杀或普通锦囊牌对你无效", + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "trick" || card.name == "sha") return "zeroplayertarget"; + }, + }, }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='trick'||card.name=='sha') return 'zeroplayertarget'; - } - } - } }, - zongxuan:{ - audio:2, - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + zongxuan: { + audio: 2, + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - filter:function(event,player){ - if(event.type!='discard'||event.getlx===false) return; - var evt=event.getl(player); - for(var i=0;i0; - })) return false; - var evt=trigger.getl(player); - for(var i=0;i 0; + }) + ) + return false; + var evt = trigger.getl(player); + for (var i = 0; i < evt.cards2.length; i++) { + if ( + get.position(evt.cards2[i], true) == "d" && + get.type(evt.cards2[i], false) == "equip" + ) { return true; } } return false; }, - content:function(){ - "step 0" - var cards=[]; - var evt=trigger.getl(player); - for(var i=0;i0; + var next = player.chooseToMove("纵玄:将任意张牌置于牌堆顶", true); + next.set("list", [["本次弃置的牌", cards], ["牌堆顶"]]); + next.set("filterOk", function (moved) { + return moved[1].length > 0; }); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0),cards2=cards.filter(function(i){ - return get.type(i,false)=='equip'; - }),cards3; - if(cards2.length){ - cards3=cards2.randomGet(); - } - else cards3=cards.randomGet(); - return [[],[cards3]]; - }) - 'step 1' - if(result.bool){ - var cards=result.moved[1]; - game.log(player,'将',cards,'置于了牌堆顶'); - while(cards.length) ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild) + next.set("processAI", function (list) { + var cards = list[0][1].slice(0), + cards2 = cards.filter(function (i) { + return get.type(i, false) == "equip"; + }), + cards3; + if (cards2.length) { + cards3 = cards2.randomGet(); + } else cards3 = cards.randomGet(); + return [[], [cards3]]; + }); + ("step 1"); + if (result.bool) { + var cards = result.moved[1]; + game.log(player, "将", cards, "置于了牌堆顶"); + while (cards.length) + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); } }, }, - zhiyan:{ - audio:2, - audioname:['gexuan','re_yufan'], - trigger:{player:'phaseJieshuBegin'}, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt('zhiyan'),'令一名角色摸一张牌并展示之。若为装备牌,则其回复1点体力').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - "step 1" - if(result.bool){ - event.target=result.targets[0]; - player.logSkill('zhiyan',result.targets); - event.bool=false; - event.target.draw('visible'); - } - else{ + zhiyan: { + audio: 2, + audioname: ["gexuan", "re_yufan"], + trigger: { player: "phaseJieshuBegin" }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhiyan"), + "令一名角色摸一张牌并展示之。若为装备牌,则其回复1点体力" + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + event.target = result.targets[0]; + player.logSkill("zhiyan", result.targets); + event.bool = false; + event.target.draw("visible"); + } else { event.finish(); } - "step 2" - var card=result[0]; - if(get.type(card)=='equip'){ - if(target.getCards('h').includes(card)&&target.hasUseTarget(card)){ - event.target.chooseUseTarget(card,true,'nopopup'); + ("step 2"); + var card = result[0]; + if (get.type(card) == "equip") { + if (target.getCards("h").includes(card) && target.hasUseTarget(card)) { + event.target.chooseUseTarget(card, true, "nopopup"); game.delay(); } - event.bool=true; + event.bool = true; } - "step 3" - if(event.bool) target.recover(); + ("step 3"); + if (event.bool) target.recover(); + }, + ai: { + expose: 0.2, + threaten: 1.2, }, - ai:{ - expose:0.2, - threaten:1.2 - } }, - miji:{ - audio:2, - audioname:['re_wangyi'], - locked:false, - mod:{ - aiOrder:function(player,card,num){ - if(num>0&&_status.event&&_status.event.type==='phase'&&get.tag(card,'recover')){ - if(player.needsToDiscard()) return num/3; + miji: { + audio: 2, + audioname: ["re_wangyi"], + locked: false, + mod: { + aiOrder: function (player, card, num) { + if ( + num > 0 && + _status.event && + _status.event.type === "phase" && + get.tag(card, "recover") + ) { + if (player.needsToDiscard()) return num / 3; return 0; } - } + }, }, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hp player !== i); - cards.forEach(i => { - let o = get.value(i, player), max = o, temp, t; - tars.forEach(tar => { + bool: true, + cards: [], + }, + cards = player.getCards("he"), + tars = game.filterPlayer((i) => player !== i); + cards.forEach((i) => { + let o = get.value(i, player), + max = o, + temp, + t; + tars.forEach((tar) => { temp = get.value(i, tar); if (temp > max) { max = temp; @@ -11860,1737 +13938,1931 @@ game.import('character', function () { if (t) res.cards.push([i, t, max - o]); }); if (res.cards.length < event.num) res.bool = false; - else if (res.cards.length > event.num) res.cards.sort((a, b) => { - return b[2] - a[2]; - }).slice(0, event.num); + else if (res.cards.length > event.num) + res.cards + .sort((a, b) => { + return b[2] - a[2]; + }) + .slice(0, event.num); return res; - }(); - 'step 1' + })(); + ("step 1"); player.chooseCardTarget({ - filterCard(card){ - return get.itemtype(card)=='card'&&!card.hasGaintag('miji_tag'); + filterCard(card) { + return get.itemtype(card) == "card" && !card.hasGaintag("miji_tag"); }, filterTarget: lib.filter.notMe, - selectCard: [1,event.num], - prompt:'请选择要分配的卡牌和目标', + selectCard: [1, event.num], + prompt: "请选择要分配的卡牌和目标", forced: event._forcing, - ai1(card){ + ai1(card) { if (!_status.event.res.bool || ui.selected.cards.length) return 0; for (let arr of _status.event.res.cards) { if (arr[0] === card) return arr[2]; } return 0; }, - ai2(target){ + ai2(target) { let card = ui.selected.cards[0]; for (let arr of _status.event.res.cards) { if (arr[0] === card) return get.attitude(player, target); } - let val=target.getUseValue(card); - if(val>0) return val*get.attitude(player,target)*2; - return get.value(card,target)*get.attitude(player,target); + let val = target.getUseValue(card); + if (val > 0) return val * get.attitude(player, target) * 2; + return get.value(card, target) * get.attitude(player, target); }, - res: event.aicheck + res: event.aicheck, }); - 'step 2' - if(result.bool){ + ("step 2"); + if (result.bool) { event._forcing = true; - var res=result.cards,target=result.targets[0].playerid; - player.addGaintag(res,'miji_tag'); - event.num-=res.length; - if(!event.given_map[target]) event.given_map[target]=[]; + var res = result.cards, + target = result.targets[0].playerid; + player.addGaintag(res, "miji_tag"); + event.num -= res.length; + if (!event.given_map[target]) event.given_map[target] = []; event.given_map[target].addArray(res); - if(event.num>0) event.goto(1); + if (event.num > 0) event.goto(1); } - 'step 3' - if(_status.connectMode){ - game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); + ("step 3"); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); } - var map=[],cards=[]; - for(var i in event.given_map){ - var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - player.line(source,'green'); - if(player!==source&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.18); - map.push([source,event.given_map[i]]); + var map = [], + cards = []; + for (var i in event.given_map) { + var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) + player.addExpose(0.18); + map.push([source, event.given_map[i]]); cards.addArray(event.given_map[i]); } game.loseAsync({ - gain_list:map, - player:player, - cards:cards, - giver:player, - animate:'giveAuto', - }).setContent('gaincardMultiple'); + gain_list: map, + player: player, + cards: cards, + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); }, - ai:{ - threaten:function(player,target){ - return 0.6+0.7*target.getDamagedHp(); + ai: { + threaten: function (player, target) { + return 0.6 + 0.7 * target.getDamagedHp(); }, - effect:{ - target:function(card,player,target){ - if(target.hp<=2&&get.tag(card,'damage')){ - var num=1; - if(get.itemtype(player)=='player'&&player.hasSkillTag('damageBonus',false,{ - target:target, - card:card - })&&!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card - })) num=2; - if(target.hp>num) return [1,1]; + effect: { + target: function (card, player, target) { + if (target.hp <= 2 && get.tag(card, "damage")) { + var num = 1; + if ( + get.itemtype(player) == "player" && + player.hasSkillTag("damageBonus", false, { + target: target, + card: card, + }) && + !target.hasSkillTag("filterDamage", null, { + player: player, + card: card, + }) + ) + num = 2; + if (target.hp > num) return [1, 1]; } - } - } - } - }, - zhenlie:{ - audio:2, - audioname:['re_wangyi'], - filter:function(event,player){ - return event.player!=player&&event.card&&(event.card.name=='sha'||get.type(event.card)=='trick'); + }, + }, }, - logTarget:'player', - check:function(event,player){ - if(event.getParent().excluded.includes(player)) return false; - if(get.attitude(player,event.player)>0||player.hp<2&&!get.tag(event.card,'damage')) return false; - let evt=event.getParent(), - directHit=evt.nowuxie&&get.type(event.card,'trick')==='trick'||evt.directHit&&evt.directHit.includes(player)||evt.customArgs&&evt.customArgs.default&&evt.customArgs.default.directHit2; - if(get.tag(event.card,'respondSha')){ - if(directHit||player.countCards('h',{name:'sha'})===0) return true; - } - else if(get.tag(event.card,'respondShan')){ - if(directHit||player.countCards('h',{name:'shan'})===0) return true; - } - else if(get.tag(event.card,'damage')){ - if(event.card.name==='huogong') return event.player.countCards('h')>4-player.hp-player.hujia; - if(event.card.name==='shuiyanqijunx') return player.countCards('e')===0; + }, + zhenlie: { + audio: 2, + audioname: ["re_wangyi"], + filter: function (event, player) { + return ( + event.player != player && + event.card && + (event.card.name == "sha" || get.type(event.card) == "trick") + ); + }, + logTarget: "player", + check: function (event, player) { + if (event.getParent().excluded.includes(player)) return false; + if ( + get.attitude(player, event.player) > 0 || + (player.hp < 2 && !get.tag(event.card, "damage")) + ) + return false; + let evt = event.getParent(), + directHit = + (evt.nowuxie && get.type(event.card, "trick") === "trick") || + (evt.directHit && evt.directHit.includes(player)) || + (evt.customArgs && evt.customArgs.default && evt.customArgs.default.directHit2); + if (get.tag(event.card, "respondSha")) { + if (directHit || player.countCards("h", { name: "sha" }) === 0) return true; + } else if (get.tag(event.card, "respondShan")) { + if (directHit || player.countCards("h", { name: "shan" }) === 0) return true; + } else if (get.tag(event.card, "damage")) { + if (event.card.name === "huogong") + return event.player.countCards("h") > 4 - player.hp - player.hujia; + if (event.card.name === "shuiyanqijunx") return player.countCards("e") === 0; return true; - } - else if(player.hp>2){ - if(event.card.name==='shunshou'||(event.card.name==='zhujinqiyuan'&&(event.card.yingbian||get.distance(event.player,player)<0))) return true; + } else if (player.hp > 2) { + if ( + event.card.name === "shunshou" || + (event.card.name === "zhujinqiyuan" && + (event.card.yingbian || get.distance(event.player, player) < 0)) + ) + return true; } return false; }, - trigger:{target:'useCardToTargeted'}, - content:function(){ - "step 0" - if(get.attitude(player,trigger.player)<0&&trigger.player.countDiscardableCards(player,'he')) player.addTempSkill('zhenlie_lose'); + trigger: { target: "useCardToTargeted" }, + content: function () { + "step 0"; + if ( + get.attitude(player, trigger.player) < 0 && + trigger.player.countDiscardableCards(player, "he") + ) + player.addTempSkill("zhenlie_lose"); player.loseHp(); - "step 1" - player.removeSkill('zhenlie_lose'); + ("step 1"); + player.removeSkill("zhenlie_lose"); trigger.getParent().excluded.add(player); - "step 2" - if(trigger.player.countCards('he')){ - if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.12); - player.discardPlayerCard(trigger.player,'he',true); + ("step 2"); + if (trigger.player.countCards("he")) { + if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.12); + player.discardPlayerCard(trigger.player, "he", true); } }, - subSkill:{ - lose:{ - charlotte:true - } - }, - ai:{ - filterDamage:true, - skillTagFilter:(player,tag,arg)=>{ - return arg&&arg.jiu==true; + subSkill: { + lose: { + charlotte: true, }, - effect:{ - target:(card,player,target)=>{ - if(target.hp<=0&&target.hasSkill('zhenlie_lose')&&get.tag(card,'recover')) return [1,1.2]; - } - } - } + }, + ai: { + filterDamage: true, + skillTagFilter: (player, tag, arg) => { + return arg && arg.jiu == true; + }, + effect: { + target: (card, player, target) => { + if (target.hp <= 0 && target.hasSkill("zhenlie_lose") && get.tag(card, "recover")) + return [1, 1.2]; + }, + }, + }, }, //吾彦... - wuyan:{audio:2}, - xswuyan:{ - audio:'wuyan', - trigger:{target:'useCardToBefore',player:'useCardToBefore'}, - forced:true, - check:function(event,player){ - return get.effect(event.target,event.card,event.player,player)<0; + wuyan: { audio: 2 }, + xswuyan: { + audio: "wuyan", + trigger: { target: "useCardToBefore", player: "useCardToBefore" }, + forced: true, + check: function (event, player) { + return get.effect(event.target, event.card, event.player, player) < 0; }, - filter:function(event,player){ - if(!event.target) return false; - if(event.player==player&&event.target==player) return false; - return (get.type(event.card)=='trick'); + filter: function (event, player) { + if (!event.target) return false; + if (event.player == player && event.target == player) return false; + return get.type(event.card) == "trick"; }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='trick'&&player!=target) return 'zeroplayertarget'; + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "trick" && player != target) return "zeroplayertarget"; }, - player:function(card,player,target,current){ - if(get.type(card)=='trick'&&player!=target) return 'zeroplayertarget'; + player: function (card, player, target, current) { + if (get.type(card) == "trick" && player != target) return "zeroplayertarget"; }, }, }, }, - xinwuyan:{ - audio:2, - trigger:{source:'damageBegin2',player:'damageBegin4'}, - forced:true, - check:function(event,player){ - if(player==event.player) return true; + xinwuyan: { + audio: 2, + trigger: { source: "damageBegin2", player: "damageBegin4" }, + forced: true, + check: function (event, player) { + if (player == event.player) return true; return false; }, - filter:function(event,player){ - return get.type(event.card,'trick')=='trick'; + filter: function (event, player) { + return get.type(event.card, "trick") == "trick"; }, - content:function(){ + content: function () { trigger.cancel(); }, - ai:{ - notrick:true, - notricksource:true, - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='trick'&&get.tag(card,'damage')){ - return 'zeroplayertarget'; + ai: { + notrick: true, + notricksource: true, + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; } }, - player:function(card,player,target,current){ - if(get.type(card)=='trick'&&get.tag(card,'damage')){ - return 'zeroplayertarget'; + player: function (card, player, target, current) { + if (get.type(card) == "trick" && get.tag(card, "damage")) { + return "zeroplayertarget"; } - } - } - } - }, - xinjujian:{ - trigger:{player:'phaseJieshuBegin'}, - direct:true, - audio:2, - filter:function(event,player){ - return player.countCards('he')>player.countCards('he',{type:'basic'}); + }, + }, }, - content:function(){ - "step 0" + }, + xinjujian: { + trigger: { player: "phaseJieshuBegin" }, + direct: true, + audio: 2, + filter: function (event, player) { + return player.countCards("he") > player.countCards("he", { type: "basic" }); + }, + content: function () { + "step 0"; player.chooseCardTarget({ - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - filterCard:function(card,player){ - return get.type(card)!='basic'&&lib.filter.cardDiscardable(card,player); + filterCard: function (card, player) { + return get.type(card) != "basic" && lib.filter.cardDiscardable(card, player); }, - ai1:function(card){ - if(get.tag(card,'damage')&&get.type(card)=='trick'){ + ai1: function (card) { + if (get.tag(card, "damage") && get.type(card) == "trick") { return 20; } - return 9-get.value(card); + return 9 - get.value(card); }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(att>0){ - if(target.isTurnedOver()) att+=3; - if(target.hp==1) att+=3; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (att > 0) { + if (target.isTurnedOver()) att += 3; + if (target.hp == 1) att += 3; } return att; }, - position:'he', - prompt:get.prompt2('xinjujian') + position: "he", + prompt: get.prompt2("xinjujian"), }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('xinjujian',target); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("xinjujian", target); player.discard(result.cards); - if(target.hp==target.maxHp&& - !target.isTurnedOver()&& - !target.isLinked()){ + if (target.hp == target.maxHp && !target.isTurnedOver() && !target.isLinked()) { target.draw(2); event.finish(); + } else { + var controls = ["draw_card"]; + if (target.hp < target.maxHp) { + controls.push("recover_hp"); + } + if (target.isLinked() | target.isTurnedOver()) { + controls.push("reset_character"); + } + target.chooseControl(controls).ai = function () { + if (target.isTurnedOver()) { + return "reset_character"; + } else if (target.hp == 1 && target.maxHp > 2) { + return "recover_hp"; + } else if (target.hp == 2 && target.maxHp > 2 && target.countCards("h") > 1) { + return "recover_hp"; + } else { + return "draw_card"; + } + }; } - else{ - var controls=['draw_card']; - if(target.hp2){ - return 'recover_hp'; - } - else if(target.hp==2&&target.maxHp>2&&target.countCards('h')>1){ - return 'recover_hp'; - } - else{ - return 'draw_card'; - } - } - } - } - else{ + } else { event.finish(); } - "step 2" - event.control=result.control; - switch(event.control){ - case 'recover_hp':event.target.recover();event.finish();break; - case 'draw_card':event.target.draw(2);event.finish();break; - case 'reset_character':if(event.target.isTurnedOver()) event.target.turnOver();break; + ("step 2"); + event.control = result.control; + switch (event.control) { + case "recover_hp": + event.target.recover(); + event.finish(); + break; + case "draw_card": + event.target.draw(2); + event.finish(); + break; + case "reset_character": + if (event.target.isTurnedOver()) event.target.turnOver(); + break; } - "step 3" - if(event.control=='reset_character'&&event.target.isLinked()){ + ("step 3"); + if (event.control == "reset_character" && event.target.isLinked()) { event.target.link(); } }, - ai:{ - expose:0.2, - threaten:1.4 - } + ai: { + expose: 0.2, + threaten: 1.4, + }, }, - jujian:{ - enable:'phaseUse', - usable:1, - audio:2, - filterCard:true, - position:'he', - selectCard:[1,3], - check:function(card){ - var player=get.owner(card); - if(get.type(card)=='trick') return 10; - if(player.countCards('h')-player.hp-ui.selected.cards.length>0){ - return 8-get.value(card); + jujian: { + enable: "phaseUse", + usable: 1, + audio: 2, + filterCard: true, + position: "he", + selectCard: [1, 3], + check: function (card) { + var player = get.owner(card); + if (get.type(card) == "trick") return 10; + if (player.countCards("h") - player.hp - ui.selected.cards.length > 0) { + return 8 - get.value(card); } - return 4-get.value(card); + return 4 - get.value(card); }, - filterTarget:function(card,player,target){ - return player!=target; + filterTarget: function (card, player, target) { + return player != target; }, - content:function(){ + content: function () { target.draw(cards.length); - if(cards.length==3){ - if(get.type(cards[0],'trick')==get.type(cards[1],'trick')&& - get.type(cards[0],'trick')==get.type(cards[2],'trick')){ + if (cards.length == 3) { + if ( + get.type(cards[0], "trick") == get.type(cards[1], "trick") && + get.type(cards[0], "trick") == get.type(cards[2], "trick") + ) { player.recover(); } } }, - ai:{ - expose:0.2, - order:1, - result:{ - target:1 - } - } - }, - yizhong:{ - trigger:{target:'shaBefore'}, - forced:true, - audio:2, - filter:function(event,player){ - if(!player.hasEmptySlot(2)) return false; - return (event.card.name=='sha'&&get.color(event.card)=='black') + ai: { + expose: 0.2, + order: 1, + result: { + target: 1, + }, }, - content:function(){ + }, + yizhong: { + trigger: { target: "shaBefore" }, + forced: true, + audio: 2, + filter: function (event, player) { + if (!player.hasEmptySlot(2)) return false; + return event.card.name == "sha" && get.color(event.card) == "black"; + }, + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player==target&&get.subtypes(card).includes('equip2')){ - if(get.equipValue(card)<=8) return 0; + ai: { + effect: { + target: function (card, player, target) { + if (player == target && get.subtypes(card).includes("equip2")) { + if (get.equipValue(card) <= 8) return 0; } - if(!player.hasEmptySlot(2)) return; - if(card.name=='sha'&&get.color(card)=='black') return 'zerotarget'; - } - } - } + if (!player.hasEmptySlot(2)) return; + if (card.name == "sha" && get.color(card) == "black") return "zerotarget"; + }, + }, + }, }, - jueqing:{ - trigger:{source:'damageBefore'}, - forced:true, - audio:2, + jueqing: { + trigger: { source: "damageBefore" }, + forced: true, + audio: 2, //priority:16, - check:function(){return false;}, - content:function(){ + check: function () { + return false; + }, + content: function () { trigger.cancel(); trigger.player.loseHp(trigger.num); }, - ai:{ - jueqing:true - } + ai: { + jueqing: true, + }, }, - shangshi:{ - audio:2, - trigger:{ - player:['loseAfter','changeHp','gainMaxHpAfter','loseMaxHpAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + shangshi: { + audio: 2, + trigger: { + player: ["loseAfter", "changeHp", "gainMaxHpAfter", "loseMaxHpAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - frequent:true, - filter:function(event,player){ - if(event.getl&&!event.getl(player)) return false; - return player.countCards('h')0) return 0; - if(player.getEquip('zhuge')&&player.countCards('h','sha')>1) return 0; - if(!player.countCards('h','sha')) return 0; - var targets=[]; + ai: { + order: 5, + result: { + player: function (player) { + if (_status.event.parent.name == "phaseUse") { + if (player.countCards("h", "jiu") > 0) return 0; + if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0; + if (!player.countCards("h", "sha")) return 0; + var targets = []; var target; - var players=game.filterPlayer(); - for(var i=0;inum){ - target=targets[i]; - num=num2; + var num = get.effect(target, { name: "sha" }, player, player); + for (var i = 1; i < targets.length; i++) { + var num2 = get.effect(targets[i], { name: "sha" }, player, player); + if (num2 > num) { + target = targets[i]; + num = num2; } } - if(num<=0) return 0; - var e2=target.getEquip(2); - if(e2){ - if(e2.name=='tengjia'){ - if(!player.countCards('h',{name:'sha',nature:'fire'})&&!player.getEquip('zhuque')) return 0; + if (num <= 0) return 0; + var e2 = target.getEquip(2); + if (e2) { + if (e2.name == "tengjia") { + if ( + !player.countCards("h", { name: "sha", nature: "fire" }) && + !player.getEquip("zhuque") + ) + return 0; } - if(e2.name=='renwang'){ - if(!player.countCards('h',{name:'sha',color:'red'})) return 0; + if (e2.name == "renwang") { + if (!player.countCards("h", { name: "sha", color: "red" })) return 0; } - if(e2.name=='baiyin') return 0; + if (e2.name == "baiyin") return 0; } - if(player.getEquip('guanshi')&&player.countCards('he')>2) return 1; - return target.countCards('h')>3?0:1; + if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1; + return target.countCards("h") > 3 ? 0 : 1; } - if(player==_status.event.dying||player.isTurnedOver()) return 3; - } + if (player == _status.event.dying || player.isTurnedOver()) return 3; + }, }, - effect:{ - target:function(card,player,target){ - if(card.name=='guiyoujie') return [0,0.5]; - if(target.isTurnedOver()){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target.hp==1) return; - return [1,target.countCards('h')/2]; + effect: { + target: function (card, player, target) { + if (card.name == "guiyoujie") return [0, 0.5]; + if (target.isTurnedOver()) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (target.hp == 1) return; + return [1, target.countCards("h") / 2]; } } - } - } + }, + }, }, }, - jiushi2:{ - trigger:{player:'damageBegin3'}, - silent:true, - firstDo:true, - filter:function(event,player){ - return player.classList.contains('turnedover'); + jiushi2: { + trigger: { player: "damageBegin3" }, + silent: true, + firstDo: true, + filter: function (event, player) { + return player.classList.contains("turnedover"); + }, + content: function () { + trigger.jiushi = true; }, - content:function(){ - trigger.jiushi=true; - } }, - jiushi3:{ - audio:'jiushi1', - trigger:{player:'damageEnd'}, - check:function(event,player){ + jiushi3: { + audio: "jiushi1", + trigger: { player: "damageEnd" }, + check: function (event, player) { return player.isTurnedOver(); }, - prompt:'是否发动【酒诗】,将武将牌翻面?', - filter:function(event,player){ - if(event.jiushi){ + prompt: "是否发动【酒诗】,将武将牌翻面?", + filter: function (event, player) { + if (event.jiushi) { return true; } return false; }, - content:function(){ + content: function () { delete trigger.jiushi; player.turnOver(); - } - }, - zongshi:{ - audio:2, - mod:{ - maxHandcard:function(player,num){ - return num+game.countGroup(); - } - } - }, - zishou:{ - audio:2, - audioname:['re_liubiao'], - trigger:{player:'phaseDrawBegin2'}, - check:function(event,player){ - return player.countCards('h')<=(player.hasSkill('zongshi')?player.maxHp:(player.hp-2))||player.skipList.includes('phaseUse'); }, - filter:function(event,player){ + }, + zongshi: { + audio: 2, + mod: { + maxHandcard: function (player, num) { + return num + game.countGroup(); + }, + }, + }, + zishou: { + audio: 2, + audioname: ["re_liubiao"], + trigger: { player: "phaseDrawBegin2" }, + check: function (event, player) { + return ( + player.countCards("h") <= + (player.hasSkill("zongshi") ? player.maxHp : player.hp - 2) || + player.skipList.includes("phaseUse") + ); + }, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - trigger.num+=game.countGroup(); - player.addTempSkill('zishou2'); + content: function () { + trigger.num += game.countGroup(); + player.addTempSkill("zishou2"); + }, + ai: { + threaten: 1.5, }, - ai:{ - threaten:1.5 - } }, - zishou2:{ - mod:{ - playerEnabled:function(card,player,target){ - if(player!=target) return false; - } - } + zishou2: { + mod: { + playerEnabled: function (card, player, target) { + if (player != target) return false; + }, + }, }, - olddanshou:{ - audio:'danshou', - trigger:{source:'damageSource'}, + olddanshou: { + audio: "danshou", + trigger: { source: "damageSource" }, //priority:9, - check:function(event,player){ - return get.attitude(player,event.player)<=0; + check: function (event, player) { + return get.attitude(player, event.player) <= 0; }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.draw(); - var cards=Array.from(ui.ordering.childNodes); - while(cards.length){ + var cards = Array.from(ui.ordering.childNodes); + while (cards.length) { cards.shift().discard(); } - "step 1" - var evt=_status.event.getParent('phase'); - if(evt){ + ("step 1"); + var evt = _status.event.getParent("phase"); + if (evt) { game.resetSkills(); - _status.event=evt; + _status.event = evt; _status.event.finish(); _status.event.untrigger(true); } }, - ai:{ - jueqing:true - } + ai: { + jueqing: true, + }, }, - danshou:{ - enable:'phaseUse', - filterCard:true, - position:'he', - audio:2, - filter:function(event,player){ - var num=player.getStat().skill.danshou; - if(num){ + danshou: { + enable: "phaseUse", + filterCard: true, + position: "he", + audio: 2, + filter: function (event, player) { + var num = player.getStat().skill.danshou; + if (num) { num++; + } else { + num = 1; } - else{ - num=1; - } - return player.countCards('he')>=num; + return player.countCards("he") >= num; }, - check:function(card){ - if(ui.selected.cards.length>=2){ - return 4-get.value(card); + check: function (card) { + if (ui.selected.cards.length >= 2) { + return 4 - get.value(card); } - return 6-get.value(card); + return 6 - get.value(card); }, - selectCard:function(card){ - var num=_status.event.player.getStat().skill.danshou; - if(num) return num+1; + selectCard: function (card) { + var num = _status.event.player.getStat().skill.danshou; + if (num) return num + 1; return 1; }, - filterTarget:function(card,player,target){ - if(player==target) return false; - var num=player.getStat().skill.danshou; - if(num){ + filterTarget: function (card, player, target) { + if (player == target) return false; + var num = player.getStat().skill.danshou; + if (num) { num++; + } else { + num = 1; } - else{ - num=1; - } - if(num<=2&&!target.countCards('he')) return false; + if (num <= 2 && !target.countCards("he")) return false; return player.inRange(target); }, - content:function(){ - 'step 0' - var num=player.getStat().skill.danshou; - switch(num){ - case 1:player.discardPlayerCard(target,true);break; - case 2:target.chooseCard('选择一张牌交给'+get.translation(player),'he',true);break; - case 3:target.damage('nocard');break; - default:game.asyncDraw([player,target],2); + content: function () { + "step 0"; + var num = player.getStat().skill.danshou; + switch (num) { + case 1: + player.discardPlayerCard(target, true); + break; + case 2: + target.chooseCard("选择一张牌交给" + get.translation(player), "he", true); + break; + case 3: + target.damage("nocard"); + break; + default: + game.asyncDraw([player, target], 2); } - if(num!=2) event.finish(); - 'step 1' - if(result.cards){ - target.give(result.cards,player); + if (num != 2) event.finish(); + ("step 1"); + if (result.cards) { + target.give(result.cards, player); } }, - ai:{ - order:8.6, - result:{ - target:function(player,target){ - var num=player.getStat().skill.danshou; - if(num){ + ai: { + order: 8.6, + result: { + target: function (player, target) { + var num = player.getStat().skill.danshou; + if (num) { num++; + } else { + num = 1; } - else{ - num=1; - } - if(num>3) return 0; - if(num==3) return get.damageEffect(target,player,target); + if (num > 3) return 0; + if (num == 3) return get.damageEffect(target, player, target); return -1; - } - } - } + }, + }, + }, }, - qice:{ - audio:2, - audioname:['clan_xunyou'], - enable:'phaseUse', - filter:function(event,player){ - const hs=player.getCards('h'); - if(!hs.length) return false; - if(hs.some(card=>{ - const mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - return (mod2===false) - })) return false; - return lib.inpile.some(name=>{ - if(get.type(name)!='trick') return false; - const card=get.autoViewAs({name},hs); - return event.filterCard(card,player,event); + qice: { + audio: 2, + audioname: ["clan_xunyou"], + enable: "phaseUse", + filter: function (event, player) { + const hs = player.getCards("h"); + if (!hs.length) return false; + if ( + hs.some((card) => { + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + return mod2 === false; + }) + ) + return false; + return lib.inpile.some((name) => { + if (get.type(name) != "trick") return false; + const card = get.autoViewAs({ name }, hs); + return event.filterCard(card, player, event); }); }, - usable:1, - chooseButton:{ - dialog:function(player){ - var list=[]; - for(var i=0;i0&&!players[i].hasSha()){ - return (button.link[2]=='juedou')?2:-1; + check: function (button) { + var player = _status.event.player; + var recover = 0, + lose = 1, + players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].hp == 1 && + get.damageEffect(players[i], player, player) > 0 && + !players[i].hasSha() + ) { + return button.link[2] == "juedou" ? 2 : -1; } - if(!players[i].isOut()){ - if(players[i].hp0){ - if(players[i].hp<2){ + if (!players[i].isOut()) { + if (players[i].hp < players[i].maxHp) { + if (get.attitude(player, players[i]) > 0) { + if (players[i].hp < 2) { lose--; - recover+=0.5; + recover += 0.5; } lose--; recover++; - } - else if(get.attitude(player,players[i])<0){ - if(players[i].hp<2){ + } else if (get.attitude(player, players[i]) < 0) { + if (players[i].hp < 2) { lose++; - recover-=0.5; + recover -= 0.5; } lose++; recover--; } - } - else{ - if(get.attitude(player,players[i])>0){ + } else { + if (get.attitude(player, players[i]) > 0) { lose--; - } - else if(get.attitude(player,players[i])<0){ + } else if (get.attitude(player, players[i]) < 0) { lose++; } } } } - if(lose>recover&&lose>0) return (button.link[2]=='nanman')?1:-1; - if(lose0) return (button.link[2]=='taoyuan')?1:-1; - return (button.link[2]=='wuzhong')?1:-1; + if (lose > recover && lose > 0) return button.link[2] == "nanman" ? 1 : -1; + if (lose < recover && recover > 0) return button.link[2] == "taoyuan" ? 1 : -1; + return button.link[2] == "wuzhong" ? 1 : -1; }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'qice', - audioname:['clan_xunyou'], - filterCard:true, - selectCard:-1, - position:'h', - popname:true, - viewAs:{name:links[0][2]}, - } + audio: "qice", + audioname: ["clan_xunyou"], + filterCard: true, + selectCard: -1, + position: "h", + popname: true, + viewAs: { name: links[0][2] }, + }; + }, + prompt: function (links, player) { + return "将全部手牌当作" + get.translation(links[0][2]) + "使用"; }, - prompt:function(links,player){ - return '将全部手牌当作'+get.translation(links[0][2])+'使用'; - } }, - ai:{ - order:1, - result:{ - player:function(player){ - var num=0; - var cards=player.getCards('h'); - if(cards.length>=3&&player.hp>=3) return 0; - for(var i=0;i= 3 && player.hp >= 3) return 0; + for (var i = 0; i < cards.length; i++) { + num += Math.max(0, get.value(cards[i], player, "raw")); } - num/=cards.length; - num*=Math.min(cards.length,player.hp); - return 12-num; - } + num /= cards.length; + num *= Math.min(cards.length, player.hp); + return 12 - num; + }, }, - nokeep:true, - skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat('skill').qice&&player.hasCard((card)=>get.name(card)!='tao','h'); + nokeep: true, + skillTagFilter: function (player, tag, arg) { + if (tag === "nokeep") + return ( + (!arg || (arg.card && get.name(arg.card) === "tao")) && + player.isPhaseUsing() && + !player.getStat("skill").qice && + player.hasCard((card) => get.name(card) != "tao", "h") + ); }, - threaten:1.6, - } + threaten: 1.6, + }, }, - zhiyu:{ - audio:2, - trigger:{player:'damageEnd'}, - preHidden:true, - content:function(){ - "step 0" + zhiyu: { + audio: 2, + trigger: { player: "damageEnd" }, + preHidden: true, + content: function () { + "step 0"; player.draw(); - "step 1" - if(!player.countCards('h')) event.finish(); + ("step 1"); + if (!player.countCards("h")) event.finish(); else player.showHandcards(); - "step 2" - if(!trigger.source) return; - var cards=player.getCards('h'); - var color=get.color(cards[0],player); - for(var i=1;i1; - } - else{ - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; + return cards.length > 1; + } else { + var evt = event.getl(player); + return evt && evt.es && evt.es.length > 0; } }, - content:function(){ - "step 0" - event.count=2; - event.logged=false; - "step 1" - player.chooseTarget(get.prompt('xuanfeng'),'弃置一名其他角色的一张牌',function(card,player,target){ - if(player==target) return false; - return target.countDiscardableCards(player,'he'); - }).set('ai',function(target){ - return -get.attitude(_status.event.player,target); - }); - "step 2" - if(result.bool){ - if(!event.logged){ - player.logSkill('xuanfeng',result.targets); - event.logged=true; - } - else player.line(result.targets[0],'green'); - player.discardPlayerCard(result.targets[0],'he',true); + content: function () { + "step 0"; + event.count = 2; + event.logged = false; + ("step 1"); + player + .chooseTarget( + get.prompt("xuanfeng"), + "弃置一名其他角色的一张牌", + function (card, player, target) { + if (player == target) return false; + return target.countDiscardableCards(player, "he"); + } + ) + .set("ai", function (target) { + return -get.attitude(_status.event.player, target); + }); + ("step 2"); + if (result.bool) { + if (!event.logged) { + player.logSkill("xuanfeng", result.targets); + event.logged = true; + } else player.line(result.targets[0], "green"); + player.discardPlayerCard(result.targets[0], "he", true); event.count--; - } - else event.finish(); - "step 3" - if(event.count) event.goto(1); + } else event.finish(); + ("step 3"); + if (event.count) event.goto(1); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; - } + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3]; + }, }, - reverseEquip:true, - noe:true - } + reverseEquip: true, + noe: true, + }, }, - jiangchi:{ - audio:2, - trigger:{player:'phaseDrawBegin2'}, - direct:true, - filter:function(event,player){ + jiangchi: { + audio: 2, + trigger: { player: "phaseDrawBegin2" }, + direct: true, + filter: function (event, player) { return !event.numFixed; }, - content:function(){ - "step 0" - player.chooseControl('jiangchi_less','jiangchi_more','cancel2',function(){ - var player=_status.event.player; - if(player.countCards('h')>3&&player.countCards('h','sha')>1){ - return 'jiangchi_less'; + content: function () { + "step 0"; + player.chooseControl("jiangchi_less", "jiangchi_more", "cancel2", function () { + var player = _status.event.player; + if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) { + return "jiangchi_less"; } - if(player.countCards('h','sha')>2){ - return 'jiangchi_less'; + if (player.countCards("h", "sha") > 2) { + return "jiangchi_less"; } - if(player.hp-player.countCards('h')>1){ - return 'jiangchi_more'; + if (player.hp - player.countCards("h") > 1) { + return "jiangchi_more"; } - return 'cancel2'; + return "cancel2"; }); - "step 1" - if(result.control=='jiangchi_less'){ + ("step 1"); + if (result.control == "jiangchi_less") { trigger.num--; - player.addTempSkill('jiangchi2','phaseUseEnd'); - player.logSkill('jiangchi'); - } - else if(result.control=='jiangchi_more'){ + player.addTempSkill("jiangchi2", "phaseUseEnd"); + player.logSkill("jiangchi"); + } else if (result.control == "jiangchi_more") { trigger.num++; - player.addTempSkill('jiangchi3','phaseUseEnd'); - player.logSkill('jiangchi'); + player.addTempSkill("jiangchi3", "phaseUseEnd"); + player.logSkill("jiangchi"); } - } - }, - jiangchi2:{ - mod:{ - targetInRange:function(card,player,target,now){ - if(card.name=='sha') return true; - }, - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; - } - } - }, - jiangchi3:{ - mod:{ - cardEnabled:function(card){if(card.name=='sha') return false} - } - }, - xinzhan:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h')>player.maxHp; }, - usable:1, - content:function(){ - "step 0" - var cards=get.cards(3); - event.cards=cards; - var next=player.chooseCardButton(cards,'选择获得的红桃牌',[1,Infinity]).set('filterButton',function(button){ - return get.suit(button.link)=='heart'; - }); - "step 1" - if(result.bool){ - player.gain(result.links,'draw'); + }, + jiangchi2: { + mod: { + targetInRange: function (card, player, target, now) { + if (card.name == "sha") return true; + }, + cardUsable: function (card, player, num) { + if (card.name == "sha") return num + 1; + }, + }, + }, + jiangchi3: { + mod: { + cardEnabled: function (card) { + if (card.name == "sha") return false; + }, + }, + }, + xinzhan: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("h") > player.maxHp; + }, + usable: 1, + content: function () { + "step 0"; + var cards = get.cards(3); + event.cards = cards; + var next = player + .chooseCardButton(cards, "选择获得的红桃牌", [1, Infinity]) + .set("filterButton", function (button) { + return get.suit(button.link) == "heart"; + }); + ("step 1"); + if (result.bool) { + player.gain(result.links, "draw"); } - for(var i=event.cards.length-1;i>=0;i--){ - if(!result.bool||!result.links.includes(event.cards[i])){ - ui.cardPile.insertBefore(event.cards[i],ui.cardPile.firstChild); + for (var i = event.cards.length - 1; i >= 0; i--) { + if (!result.bool || !result.links.includes(event.cards[i])) { + ui.cardPile.insertBefore(event.cards[i], ui.cardPile.firstChild); } } }, - ai:{ - order:11, - result:{ - player:1 - } - } + ai: { + order: 11, + result: { + player: 1, + }, + }, }, - huilei:{ - audio:2, - trigger:{player:'die'}, - forced:true, - forceDie:true, - filter:function(event){ - return event.source&&event.source.isIn(); + huilei: { + audio: 2, + trigger: { player: "die" }, + forced: true, + forceDie: true, + filter: function (event) { + return event.source && event.source.isIn(); }, - logTarget:'source', - skillAnimation:true, - animationColor:'thunder', - content:function(){ - trigger.source.discard(trigger.source.getCards('he')); + logTarget: "source", + skillAnimation: true, + animationColor: "thunder", + content: function () { + trigger.source.discard(trigger.source.getCards("he")); + }, + ai: { + threaten: 0.7, }, - ai:{ - threaten:0.7 - } }, - xinenyuan:{ - audio:2, - group:['xinenyuan1','xinenyuan2'], + xinenyuan: { + audio: 2, + group: ["xinenyuan1", "xinenyuan2"], }, - xinenyuan1:{ - audio:true, - trigger:{player:'gainEnd'}, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source!=player&&event.cards.length>=2; + xinenyuan1: { + audio: true, + trigger: { player: "gainEnd" }, + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + event.source != player && + event.cards.length >= 2 + ); }, - logTarget:'source', - check:function(event,player){ - return get.attitude(player,event.source)>0; + logTarget: "source", + check: function (event, player) { + return get.attitude(player, event.source) > 0; }, - prompt2:function(event,player){ - return '令'+get.translation(event.source)+'摸一张牌'; + prompt2: function (event, player) { + return "令" + get.translation(event.source) + "摸一张牌"; }, - content:function(){ + content: function () { trigger.source.draw(); }, }, - xinenyuan2:{ - audio:true, - trigger:{player:'damageEnd'}, - check:function(event,player){ - var att=get.attitude(player,event.source); - var num=event.source.countCards('h'); - if(att<=0) return true; - if(num>2) return true; - if(num) return att<4; + xinenyuan2: { + audio: true, + trigger: { player: "damageEnd" }, + check: function (event, player) { + var att = get.attitude(player, event.source); + var num = event.source.countCards("h"); + if (att <= 0) return true; + if (num > 2) return true; + if (num) return att < 4; return false; }, - filter:function(event,player){ - return event.source&&event.source!=player&&event.num>0&&event.source.isIn(); + filter: function (event, player) { + return event.source && event.source != player && event.num > 0 && event.source.isIn(); }, - logTarget:'source', - prompt2:function(event,player){ - return '令'+get.translation(event.source)+'交给你一张手牌或失去1点体力'; + logTarget: "source", + prompt2: function (event, player) { + return "令" + get.translation(event.source) + "交给你一张手牌或失去1点体力"; }, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - trigger.source.chooseCard('选择一张手牌交给'+get.translation(player)+',或点“取消”失去1点体力').set('ai',function(card){ - var player=_status.event.getParent().player,source=_status.event.player; - if(get.effect(source,{name:'losehp'},source,source)>=0) return 0; - if(get.attitude(player,source)>0) return 11-get.value(card); - return 7-get.value(card); - }); - 'step 2' - if(result.bool){ - trigger.source.give(result.cards,player); - } - else{ + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); + trigger.source + .chooseCard("选择一张手牌交给" + get.translation(player) + ",或点“取消”失去1点体力") + .set("ai", function (card) { + var player = _status.event.getParent().player, + source = _status.event.player; + if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0; + if (get.attitude(player, source) > 0) return 11 - get.value(card); + return 7 - get.value(card); + }); + ("step 2"); + if (result.bool) { + trigger.source.give(result.cards, player); + } else { trigger.source.loseHp(); } - if(event.num>1&&player.hasSkill('xinenyuan')&&trigger.source&&trigger.source.isIn()){ - player.logSkill('xinenyuan',trigger.source) + if ( + event.num > 1 && + player.hasSkill("xinenyuan") && + trigger.source && + trigger.source.isIn() + ) { + player.logSkill("xinenyuan", trigger.source); event.num--; event.goto(1); } }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; - if(!target.hasFriend()) return; - if(get.tag(card,'damage')) return [1,0,0,-0.7]; + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5]; + if (!target.hasFriend()) return; + if (get.tag(card, "damage")) return [1, 0, 0, -0.7]; }, }, }, }, - enyuan:{ - audio:2, - locked:true, - group:['enyuan1','enyuan2'], + enyuan: { + audio: 2, + locked: true, + group: ["enyuan1", "enyuan2"], }, - enyuan1:{ - audio:true, - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - return event.source&&event.source!=player&&event.source.isIn(); + enyuan1: { + audio: true, + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); }, - logTarget:'source', - content:function(){ - 'step 0' - trigger.source.chooseCard('选择一张红桃牌交给'+get.translation(player)+',或点“取消”失去1点体力',function(card){ - return get.suit(card)=='heart'; - }).set('ai',function(card){ - var player=_status.event.getParent().player,source=_status.event.player; - if(get.effect(source,{name:'losehp'},source,source)>=0) return 0; - if(get.attitude(player,source)>0) return 11-get.value(card); - return 7-get.value(card); - }); - 'step 1' - if(result.bool){ - trigger.source.give(result.cards,player); - } - else{ + logTarget: "source", + content: function () { + "step 0"; + trigger.source + .chooseCard( + "选择一张红桃牌交给" + get.translation(player) + ",或点“取消”失去1点体力", + function (card) { + return get.suit(card) == "heart"; + } + ) + .set("ai", function (card) { + var player = _status.event.getParent().player, + source = _status.event.player; + if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0; + if (get.attitude(player, source) > 0) return 11 - get.value(card); + return 7 - get.value(card); + }); + ("step 1"); + if (result.bool) { + trigger.source.give(result.cards, player); + } else { trigger.source.loseHp(); } }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(get.tag(card,'damage')) return [1,0,0,-1]; + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (get.tag(card, "damage")) return [1, 0, 0, -1]; }, }, }, }, - enyuan2:{ - audio:true, - trigger:{player:'recoverEnd'}, - forced:true, - logTarget:'source', - filter:function(event,player){ - return event.source&&event.source!=player&&event.source.isIn(); + enyuan2: { + audio: true, + trigger: { player: "recoverEnd" }, + forced: true, + logTarget: "source", + filter: function (event, player) { + return event.source && event.source != player && event.source.isIn(); }, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - if(event.num>0){ - player.logSkill('enyuan1',trigger.source); + content: function () { + "step 0"; + event.num = trigger.num; + ("step 1"); + if (event.num > 0) { + player.logSkill("enyuan1", trigger.source); trigger.source.draw(); event.num--; event.redo(); } }, }, - xuanhuo:{ - audio:2, - enable:'phaseUse', - usable:1, - discard:false, - lose:false, - delay:0, - filter:function(event,player){ - return player.countCards('he',{suit:'heart'}); + xuanhuo: { + audio: 2, + enable: "phaseUse", + usable: 1, + discard: false, + lose: false, + delay: 0, + filter: function (event, player) { + return player.countCards("he", { suit: "heart" }); }, - filterCard:function(card){ - return get.suit(card)=='heart'; + filterCard: function (card) { + return get.suit(card) == "heart"; }, - filterTarget:function(card,player,target){ - if(game.countPlayer()==2) return false; - return player!=target; + filterTarget: function (card, player, target) { + if (game.countPlayer() == 2) return false; + return player != target; }, - check:function(card){ - var player=get.owner(card); - var players=game.filterPlayer(); - for(var i=0;i3) break; + check: function (card) { + var player = get.owner(card); + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 3) break; } - if(i==players.length) return -1; - return 5-get.value(card); + if (i == players.length) return -1; + return 5 - get.value(card); }, - content:function(){ - "step 0" - player.give(cards,target); + content: function () { + "step 0"; + player.give(cards, target); // game.delay(); - "step 1" - player.gainPlayerCard(target,'he',true); - "step 2" - var source=target; - event.card=result.links[0]; - if(player.getCards('h').includes(event.card)) player.chooseTarget('将'+get.translation(event.card)+'交给另一名其他角色',function(card,player,target){ - return target!=_status.event.sourcex&&target!=player; - }).set('ai',function(target){ - return get.attitude(_status.event.player,target); - }).set('sourcex',target); + ("step 1"); + player.gainPlayerCard(target, "he", true); + ("step 2"); + var source = target; + event.card = result.links[0]; + if (player.getCards("h").includes(event.card)) + player + .chooseTarget( + "将" + get.translation(event.card) + "交给另一名其他角色", + function (card, player, target) { + return target != _status.event.sourcex && target != player; + } + ) + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }) + .set("sourcex", target); else event.finish(); - "step 3" - if(result.bool){ - player.give(card,result.targets[0],'give'); + ("step 3"); + if (result.bool) { + player.give(card, result.targets[0], "give"); game.delay(); } }, - ai:{ - result:{ - target:-0.5, + ai: { + result: { + target: -0.5, + }, + basic: { + order: 9, }, - basic:{ - order:9, - } - } - }, - ganlu:{ - enable:'phaseUse', - usable:1, - audio:2, - selectTarget:2, - filterTarget:function(card,player,target){ - if(target.isMin()) return false; - if(ui.selected.targets.length==0) return true; - if(ui.selected.targets[0].countCards('e')==0&&target.countCards('e')==0) return false; - return Math.abs(ui.selected.targets[0].countCards('e')-target.countCards('e'))<=player.maxHp-player.hp; }, - multitarget:true, - content:function(){ + }, + ganlu: { + enable: "phaseUse", + usable: 1, + audio: 2, + selectTarget: 2, + filterTarget: function (card, player, target) { + if (target.isMin()) return false; + if (ui.selected.targets.length == 0) return true; + if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) + return false; + return ( + Math.abs(ui.selected.targets[0].countCards("e") - target.countCards("e")) <= + player.maxHp - player.hp + ); + }, + multitarget: true, + content: function () { targets[0].swapEquip(targets[1]); }, - ai:{ - order:10, - threaten:function(player,target){ - return 0.8*Math.max(1+target.maxHp-target.hp); + ai: { + order: 10, + threaten: function (player, target) { + return 0.8 * Math.max(1 + target.maxHp - target.hp); }, - result:{ - target:function(player,target){ - var list1=[]; - var list2=[]; - var num=player.maxHp-player.hp; - var players=game.filterPlayer(); - for(var i=0;i0) list1.push(players[i]); - else if(get.attitude(player,players[i])<0) list2.push(players[i]); + result: { + target: function (player, target) { + var list1 = []; + var list2 = []; + var num = player.maxHp - player.hp; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) list1.push(players[i]); + else if (get.attitude(player, players[i]) < 0) list2.push(players[i]); } - list1.sort(function(a,b){ - return a.countCards('e')-b.countCards('e'); + list1.sort(function (a, b) { + return a.countCards("e") - b.countCards("e"); }); - list2.sort(function(a,b){ - return b.countCards('e')-a.countCards('e'); + list2.sort(function (a, b) { + return b.countCards("e") - a.countCards("e"); }); var delta; - for(var i=0;i0; }, - direct:true, - content:function(){ - "step 0" + }, + buyi: { + trigger: { global: "dying" }, + //priority:6, + audio: 2, + audioname: ["re_wuguotai"], + filter: function (event, player) { + return event.player.hp <= 0 && event.player.countCards("h") > 0; + }, + direct: true, + content: function () { + "step 0"; var check; - if(trigger.player.isUnderControl(true,player)){ - check=player.hasCard(function(card){ - return get.type(card)!='basic'; + if (trigger.player.isUnderControl(true, player)) { + check = player.hasCard(function (card) { + return get.type(card) != "basic"; }); + } else { + check = get.attitude(player, trigger.player) > 0; } - else{ - check=(get.attitude(player,trigger.player)>0); - } - player.choosePlayerCard(trigger.player,get.prompt('buyi',trigger.player),'h').set('ai',function(button){ - if(!_status.event.check) return 0; - if(_status.event.target.isUnderControl(true,_status.event.player)){ - if(get.type(button.link)!='basic'){ - return 10-get.value(button.link); + player + .choosePlayerCard(trigger.player, get.prompt("buyi", trigger.player), "h") + .set("ai", function (button) { + if (!_status.event.check) return 0; + if (_status.event.target.isUnderControl(true, _status.event.player)) { + if (get.type(button.link) != "basic") { + return 10 - get.value(button.link); + } + return 0; + } else { + return Math.random(); } - return 0; - } - else{ - return Math.random(); - } - }).set('check',check).set('filterButton',function(button){ - if(_status.event.player==_status.event.target){ - return lib.filter.cardDiscardable(button.link,_status.event.player); - } - return true; - }); - "step 1" - if(result.bool){ - player.logSkill('buyi',trigger.player); - event.card=result.links[0]; - player.showCards([event.card],get.translation(player)+'展示的手牌'); - } - else{ + }) + .set("check", check) + .set("filterButton", function (button) { + if (_status.event.player == _status.event.target) { + return lib.filter.cardDiscardable(button.link, _status.event.player); + } + return true; + }); + ("step 1"); + if (result.bool) { + player.logSkill("buyi", trigger.player); + event.card = result.links[0]; + player.showCards([event.card], get.translation(player) + "展示的手牌"); + } else { event.finish(); } - "step 2" - if(get.type(event.card)!='basic'){ + ("step 2"); + if (get.type(event.card) != "basic") { trigger.player.recover(); trigger.player.discard(event.card); } }, - ai:{ - threaten:1.4 - } + ai: { + threaten: 1.4, + }, }, - pojun:{ - audio:2, - trigger:{source:'damageSource'}, - check:function(event,player){ - if(event.player.isTurnedOver()) return get.attitude(player,event.player)>0; - if(event.player.hp<3){ - return get.attitude(player,event.player)<0; + pojun: { + audio: 2, + trigger: { source: "damageSource" }, + check: function (event, player) { + if (event.player.isTurnedOver()) return get.attitude(player, event.player) > 0; + if (event.player.hp < 3) { + return get.attitude(player, event.player) < 0; } - return get.attitude(player,event.player)>0; + return get.attitude(player, event.player) > 0; }, - filter:function(event){ - if(event._notrigger.includes(event.player)) return false; - return event.card&&event.card.name=='sha'&&event.player.isIn(); + filter: function (event) { + if (event._notrigger.includes(event.player)) return false; + return event.card && event.card.name == "sha" && event.player.isIn(); }, - logTarget:'player', - content:function(){ - "step 0" - trigger.player.draw(Math.min(5,trigger.player.hp)); - "step 1" + logTarget: "player", + content: function () { + "step 0"; + trigger.player.draw(Math.min(5, trigger.player.hp)); + ("step 1"); trigger.player.turnOver(); - } - }, - jingce:{ - trigger:{player:'phaseUseEnd'}, - frequent:true, - filter:function(event,player){ - return player.countUsed(null,true)>=player.hp; }, - content:function(){ + }, + jingce: { + trigger: { player: "phaseUseEnd" }, + frequent: true, + filter: function (event, player) { + return player.countUsed(null, true) >= player.hp; + }, + content: function () { player.draw(2); }, - audio:2, + audio: 2, }, - xinjingce:{ - trigger:{player:'phaseJieshuBegin'}, - frequent:true, - filter:function(event,player){ - return player.countUsed(null,true)>=player.hp; + xinjingce: { + trigger: { player: "phaseJieshuBegin" }, + frequent: true, + filter: function (event, player) { + return player.countUsed(null, true) >= player.hp; }, - content:function(){ + content: function () { player.draw(2); }, - audio:2, + audio: 2, }, - oldchengxiang:{ - audio:'chengxiang', - inherit:'chengxiang', + oldchengxiang: { + audio: "chengxiang", + inherit: "chengxiang", }, - chengxiang:{ - trigger:{player:'damageEnd'}, + chengxiang: { + trigger: { player: "damageEnd" }, //direct:true, - frequent:true, - audio:2, - content:function(){ - "step 0" - event.cards=get.cards(4); + frequent: true, + audio: 2, + content: function () { + "step 0"; + event.cards = get.cards(4); game.cardsGotoOrdering(event.cards); - event.videoId=lib.status.videoId++; - game.broadcastAll(function(player,id,cards,num){ - var str; - if(player==game.me&&!_status.auto){ - str='称象:选择任意张点数不大于'+num+'的牌'; + event.videoId = lib.status.videoId++; + game.broadcastAll( + function (player, id, cards, num) { + var str; + if (player == game.me && !_status.auto) { + str = "称象:选择任意张点数不大于" + num + "的牌"; + } else { + str = "称象"; + } + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + player, + event.videoId, + event.cards, + event.name == "oldchengxiang" ? 12 : 13 + ); + event.time = get.utc(); + game.addVideo("showCards", player, ["称象", get.cardsInfo(event.cards)]); + game.addVideo("delay", null, 2); + ("step 1"); + var next = player.chooseButton([0, 4]); + next.set("dialog", event.videoId); + next.set("filterButton", function (button) { + var num = 0; + for (var i = 0; i < ui.selected.buttons.length; i++) { + num += get.number(ui.selected.buttons[i].link); } - else{ - str='称象'; - } - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },player,event.videoId,event.cards,event.name=='oldchengxiang'?12:13); - event.time=get.utc(); - game.addVideo('showCards',player,['称象',get.cardsInfo(event.cards)]); - game.addVideo('delay',null,2); - "step 1" - var next=player.chooseButton([0,4]); - next.set('dialog',event.videoId); - next.set('filterButton',function(button){ - var num=0 - for(var i=0;i1&&player.hasSkill('renxin')&&player.hasFriend()&&get.type(button.link)==='equip') return val + 4; + next.set("maxNum", event.name == "oldchengxiang" ? 12 : 13); + next.set("ai", function (button) { + let player = _status.event.player, + name = get.name(button.link), + val = get.value(button.link, player); + if (name === "tao") return val + 2 * Math.min(3, 1 + player.getDamagedHp()); + if (name === "jiu" && player.hp < 3) return val + 2 * (2.8 - player.hp); + if (name === "wuxie" && player.countCards("j") && !player.hasWuxie()) return val + 5; + if ( + player.hp > 1 && + player.hasSkill("renxin") && + player.hasFriend() && + get.type(button.link) === "equip" + ) + return val + 4; return val; }); - "step 2" - if(result.bool&&result.links){ + ("step 2"); + if (result.bool && result.links) { //player.logSkill('chengxiang'); - var cards2=[]; - for(var i=0;i0){ - game.delay(0,time); + var time = 1000 - (get.utc() - event.time); + if (time > 0) { + game.delay(0, time); } - "step 3" - game.broadcastAll('closeDialog',event.videoId); - var cards2=event.cards2; - player.gain(cards2,'log','gain2'); + ("step 3"); + game.broadcastAll("closeDialog", event.videoId); + var cards2 = event.cards2; + player.gain(cards2, "log", "gain2"); }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(target.hp>=4) return [1,2]; - if(target.hp==3) return [1,1.5]; - if(target.hp==2) return [1,0.5]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [1, 2]; + if (target.hp == 3) return [1, 1.5]; + if (target.hp == 2) return [1, 0.5]; } - } - } - } - }, - oldrenxin:{ - audio:'renxin', - trigger:{global:'dying'}, - //priority:6, - filter:function(event,player){ - return event.player!=player&&event.player.hp<=0&&player.countCards('h')>0; + }, + }, }, - check:function(event,player){ - if(get.attitude(player,event.player)<=0) return false; - if(player.countCards('h',{name:['tao','jiu']})+event.player.hp<0) return false; + }, + oldrenxin: { + audio: "renxin", + trigger: { global: "dying" }, + //priority:6, + filter: function (event, player) { + return event.player != player && event.player.hp <= 0 && player.countCards("h") > 0; + }, + check: function (event, player) { + if (get.attitude(player, event.player) <= 0) return false; + if (player.countCards("h", { name: ["tao", "jiu"] }) + event.player.hp < 0) return false; return true; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.turnOver(); - 'step 1' - player.give(player.getCards('h'),trigger.player); - 'step 2' + ("step 1"); + player.give(player.getCards("h"), trigger.player); + ("step 2"); trigger.player.recover(); }, }, - renxin:{ - trigger:{global:'damageBegin4'}, - audio:2, - audioname:['re_caochong'], + renxin: { + trigger: { global: "damageBegin4" }, + audio: 2, + audioname: ["re_caochong"], //priority:6, - filter:function(event,player){ - return event.player!=player&&event.player.hp==1&&player.countCards('he',{type:'equip'})>0; + filter: function (event, player) { + return ( + event.player != player && + event.player.hp == 1 && + player.countCards("he", { type: "equip" }) > 0 + ); }, - direct:true, - content:function(){ - "step 0" - var next=player.chooseToDiscard(get.prompt('renxin',trigger.player),'弃置一张装备牌并将武将牌翻面,然后防止'+get.translation(trigger.player)+'受到的伤害',{type:'equip'},'he'); - next.logSkill=['renxin',trigger.player]; - next.set('ai',function(card){ - var player=_status.event.player; - if(get.attitude(player,_status.event.getTrigger().player)>3){ - return 11-get.value(card); + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + get.prompt("renxin", trigger.player), + "弃置一张装备牌并将武将牌翻面,然后防止" + + get.translation(trigger.player) + + "受到的伤害", + { type: "equip" }, + "he" + ); + next.logSkill = ["renxin", trigger.player]; + next.set("ai", function (card) { + var player = _status.event.player; + if (get.attitude(player, _status.event.getTrigger().player) > 3) { + return 11 - get.value(card); } return -1; }); - "step 1" - if(result.bool){ + ("step 1"); + if (result.bool) { player.turnOver(); - } - else{ + } else { event.finish(); } - "step 2" + ("step 2"); trigger.cancel(); }, - ai:{ - expose:0.5 - } - }, - yuce:{ - audio:2, - audioname:['re_manchong'], - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0&&player.isDamaged(); + ai: { + expose: 0.5, }, - content:function(){ - "step 0" - var next=player.chooseCard(get.prompt2('yuce')); - next.set('ai',function(card){ - if(get.type(card)=='basic') return 1; - return Math.abs(get.value(card))+1; + }, + yuce: { + audio: 2, + audioname: ["re_manchong"], + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return player.countCards("h") > 0 && player.isDamaged(); + }, + content: function () { + "step 0"; + var next = player.chooseCard(get.prompt2("yuce")); + next.set("ai", function (card) { + if (get.type(card) == "basic") return 1; + return Math.abs(get.value(card)) + 1; }); - "step 1" - if(result.bool){ - player.logSkill('yuce'); + ("step 1"); + if (result.bool) { + player.logSkill("yuce"); player.showCards(result.cards); - var type=get.type(result.cards[0],'trick'); - if(trigger.source){ - trigger.source.chooseToDiscard('弃置一张不为'+get.translation(type)+'牌的牌或令'+get.translation(player)+'回复1点体力',function(card){ - return get.type(card,'trick')!=_status.event.type; - }).set('ai',function(card){ - if(get.recoverEffect(_status.event.getParent().player,_status.event.player,_status.event.player)<0){ - return 7-get.value(card); - } - return 0; - }).set('type',type); + var type = get.type(result.cards[0], "trick"); + if (trigger.source) { + trigger.source + .chooseToDiscard( + "弃置一张不为" + + get.translation(type) + + "牌的牌或令" + + get.translation(player) + + "回复1点体力", + function (card) { + return get.type(card, "trick") != _status.event.type; + } + ) + .set("ai", function (card) { + if ( + get.recoverEffect( + _status.event.getParent().player, + _status.event.player, + _status.event.player + ) < 0 + ) { + return 7 - get.value(card); + } + return 0; + }) + .set("type", type); + } else { + event.recover = true; } - else{ - event.recover=true; - } - } - else{ + } else { event.finish(); } - "step 2" - if(event.recover){ + ("step 2"); + if (event.recover) { player.recover(); - } - else if(result.bool){ + } else if (result.bool) { //player.draw(); - } - else{ + } else { player.recover(); } }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage'&&target.countCards('h'))){ - return 0.8 + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage" && target.countCards("h"))) { + return 0.8; } - } - } - } + }, + }, + }, }, - xiansi:{ - audio:2, - audioname:['re_liufeng'], - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - content:function(){ - "step 0" - player.chooseTarget(get.prompt2(event.name),[1,2],function(card,player,target){ - return target.countCards('he')>0; - },function(target){ - return -get.attitude(_status.event.player,target); - }); - "step 1" - if(result.bool){ + xiansi: { + audio: 2, + audioname: ["re_liufeng"], + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + content: function () { + "step 0"; + player.chooseTarget( + get.prompt2(event.name), + [1, 2], + function (card, player, target) { + return target.countCards("he") > 0; + }, + function (target) { + return -get.attitude(_status.event.player, target); + } + ); + ("step 1"); + if (result.bool) { result.targets.sortBySeat(); - player.logSkill(event.name,result.targets); - event.targets=result.targets; - } - else{ + player.logSkill(event.name, result.targets); + event.targets = result.targets; + } else { event.finish(); } - "step 2" - if(event.targets.length){ - var target=event.targets.shift(); - event.current=target; - player.choosePlayerCard(target,true); - } - else{ + ("step 2"); + if (event.targets.length) { + var target = event.targets.shift(); + event.current = target; + player.choosePlayerCard(target, true); + } else { event.finish(); } - "step 3" - if(result.bool){ - player.addToExpansion(result.cards,event.current,'give').gaintag.add('xiansi'); + ("step 3"); + if (result.bool) { + player.addToExpansion(result.cards, event.current, "give").gaintag.add("xiansi"); event.goto(2); } }, - intro:{ - content:'expansion', - markcount:'expansion', + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player){ - var cards=player.getExpansions('xiansi'); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player) { + var cards = player.getExpansions("xiansi"); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{ - threaten:2 + ai: { + threaten: 2, }, - global:'xiansi2', - group:'xiansix', + global: "xiansi2", + group: "xiansix", }, - xiansix:{}, - xiansi2:{ - enable:'chooseToUse', - audio:2, - audioname2:{re_liufeng:'rexiansi'}, - viewAs:{name:'sha',isCard:true}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.hasSkill('xiansix')&¤t.getExpansions('xiansi').length>1&&event.filterTarget({name:'sha'},player,current); + xiansix: {}, + xiansi2: { + enable: "chooseToUse", + audio: 2, + audioname2: { re_liufeng: "rexiansi" }, + viewAs: { name: "sha", isCard: true }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return ( + current.hasSkill("xiansix") && + current.getExpansions("xiansi").length > 1 && + event.filterTarget({ name: "sha" }, player, current) + ); }); }, - filterTarget:function(card,player,target){ - var bool=false; - var players=ui.selected.targets.slice(0); - for(var i=0;i1) bool=true;break; + filterTarget: function (card, player, target) { + var bool = false; + var players = ui.selected.targets.slice(0); + for (var i = 0; i < players.length; i++) { + if (players[i].hasSkill("xiansix") && players[i].getExpansions("xiansi").length > 1) + bool = true; + break; } - if(!bool&&(!target.hasSkill('xiansix')||target.getExpansions('xiansi').length<=1)) return false; - return _status.event._backup.filterTarget.apply(this,arguments); + if (!bool && (!target.hasSkill("xiansix") || target.getExpansions("xiansi").length <= 1)) + return false; + return _status.event._backup.filterTarget.apply(this, arguments); }, - complexSelect:true, - selectCard:-1, - filterCard:function(){ + complexSelect: true, + selectCard: -1, + filterCard: function () { return false; }, - forceaudio:true, - prompt:'弃置一名有【逆】的角色的两张【逆】,然后视为对包含其在内的角色使用【杀】。', - delay:false, - log:false, - precontent:function(){ - "step 0" - var targets=event.result.targets.filter(function(current){ - return current.getExpansions('xiansi').length>1&¤t.hasSkill('xiansix'); + forceaudio: true, + prompt: "弃置一名有【逆】的角色的两张【逆】,然后视为对包含其在内的角色使用【杀】。", + delay: false, + log: false, + precontent: function () { + "step 0"; + var targets = event.result.targets.filter(function (current) { + return current.getExpansions("xiansi").length > 1 && current.hasSkill("xiansix"); }); - if(targets.length==1){ - event.target=targets[0]; + if (targets.length == 1) { + event.target = targets[0]; event.goto(2); - } - else if(targets.length>0){ - player.chooseTarget(true,'选择弃置【陷嗣】牌的目标',function(card,player,target){ - return _status.event.list.includes(target); - }).set('list',targets).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target); - }); - } - else{ + } else if (targets.length > 0) { + player + .chooseTarget(true, "选择弃置【陷嗣】牌的目标", function (card, player, target) { + return _status.event.list.includes(target); + }) + .set("list", targets) + .set("ai", function (target) { + var player = _status.event.player; + return get.attitude(player, target); + }); + } else { event.finish(); } - "step 1" - if(result.bool&&result.targets.length){ - event.target=result.targets[0]; - } - else{ + ("step 1"); + if (result.bool && result.targets.length) { + event.target = result.targets[0]; + } else { event.finish(); } - "step 2" - if(event.target){ - if(event.target.getExpansions('xiansi').length==2){ - event.directresult=event.target.getExpansions('xiansi').slice(0); + ("step 2"); + if (event.target) { + if (event.target.getExpansions("xiansi").length == 2) { + event.directresult = event.target.getExpansions("xiansi").slice(0); + } else { + player.chooseCardButton( + "移去两张“逆”", + 2, + event.target.getExpansions("xiansi"), + true + ); } - else{ - player.chooseCardButton('移去两张“逆”',2,event.target.getExpansions('xiansi'),true); - } - } - else{ + } else { event.finish(); } - "step 3" - if(event.directresult||result.bool){ - player.logSkill('xiansi2_log',event.target); - game.trySkillAudio('xiansi2',event.target,true); - var links=event.directresult||result.links; + ("step 3"); + if (event.directresult || result.bool) { + player.logSkill("xiansi2_log", event.target); + game.trySkillAudio("xiansi2", event.target, true); + var links = event.directresult || result.links; target.loseToDiscardpile(links); } }, - ai:{ - order:function(){ - return get.order({name:'sha'})+0.05; + ai: { + order: function () { + return get.order({ name: "sha" }) + 0.05; }, }, - subSkill:{log:{}} + subSkill: { log: {} }, }, - shibei:{ - trigger:{player:'damageEnd'}, - forced:true, - audio:2, - audioname:['xin_jushou'], - check:function(event,player){ - return player.getHistory('damage').indexOf(event)==0; + shibei: { + trigger: { player: "damageEnd" }, + forced: true, + audio: 2, + audioname: ["xin_jushou"], + check: function (event, player) { + return player.getHistory("damage").indexOf(event) == 0; }, - content:function(){ - if(player.getHistory('damage').indexOf(trigger)>0){ + content: function () { + if (player.getHistory("damage").indexOf(trigger) > 0) { player.loseHp(); - } - else{ + } else { player.recover(); } }, - subSkill:{ - damaged:{}, - ai:{} + subSkill: { + damaged: {}, + ai: {}, }, - ai:{ - maixie_defend:true, - threaten:0.9, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing')) return; - if(target.hujia) return; - if(player._shibei_tmp) return; - if(target.hasSkill('shibei_ai')) return; - if(_status.event.getParent('useCard',true)||_status.event.getParent('_wuxie',true)) return; - if(get.tag(card,'damage')){ - if(target.getHistory('damage').length>0){ - return [1,-2]; - } - else{ - if(get.attitude(player,target)>0&&target.hp>1){ + ai: { + maixie_defend: true, + threaten: 0.9, + effect: { + target: function (card, player, target) { + if (player.hasSkillTag("jueqing")) return; + if (target.hujia) return; + if (player._shibei_tmp) return; + if (target.hasSkill("shibei_ai")) return; + if ( + _status.event.getParent("useCard", true) || + _status.event.getParent("_wuxie", true) + ) + return; + if (get.tag(card, "damage")) { + if (target.getHistory("damage").length > 0) { + return [1, -2]; + } else { + if (get.attitude(player, target) > 0 && target.hp > 1) { return 0; } - if(get.attitude(player,target)<0&&!player.hasSkillTag('damageBonus')){ - if(card.name=='sha') return; - var sha=false; - player._shibei_tmp=true; - var num=player.countCards('h',function(card){ - if(card.name=='sha'){ - if(sha){ + if ( + get.attitude(player, target) < 0 && + !player.hasSkillTag("damageBonus") + ) { + if (card.name == "sha") return; + var sha = false; + player._shibei_tmp = true; + var num = player.countCards("h", function (card) { + if (card.name == "sha") { + if (sha) { return false; - } - else{ - sha=true; + } else { + sha = true; } } - return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,player)>0; + return ( + get.tag(card, "damage") && + player.canUse(card, target) && + get.effect(target, card, player, player) > 0 + ); }); delete player._shibei_tmp; - if(player.hasSkillTag('damage')){ + if (player.hasSkillTag("damage")) { num++; } - if(num<2){ - var enemies=player.getEnemies(); - if(enemies.length==1&&enemies[0]==target&&player.needsToDiscard()){ + if (num < 2) { + var enemies = player.getEnemies(); + if ( + enemies.length == 1 && + enemies[0] == target && + player.needsToDiscard() + ) { return; } return 0; @@ -13598,1113 +15870,1361 @@ game.import('character', function () { } } } - } - } - } + }, + }, + }, }, - shibei_old:{ - audio:2, - trigger:{player:'damageAfter'}, - forced:true, - content:function(){ - "step 0" - player.judge(function(card){ - if(player.hasSkill('shibei2')){ - if(get.color(card)=='black') return -1; - } - else{ - if(get.color(card)=='red') return 1; + shibei_old: { + audio: 2, + trigger: { player: "damageAfter" }, + forced: true, + content: function () { + "step 0"; + player.judge(function (card) { + if (player.hasSkill("shibei2")) { + if (get.color(card) == "black") return -1; + } else { + if (get.color(card) == "red") return 1; } return 0; - }) - "step 1" - if(result.judge>0){ + }); + ("step 1"); + if (result.judge > 0) { player.recover(); - } - else if(result.judge<0){ + } else if (result.judge < 0) { player.loseHp(); } - if(!player.hasSkill('shibei2')){ - player.addTempSkill('shibei2'); + if (!player.hasSkill("shibei2")) { + player.addTempSkill("shibei2"); } - } + }, }, - shibei2:{}, - jianying:{ - audio:2, - locked:false, - mod:{ - aiOrder:function(player,card,num){ - if(typeof card=='object'&&player.isPhaseUsing()){ - var evt=player.getLastUsed(); - if(evt&&evt.card&&(get.suit(evt.card)&&get.suit(evt.card)==get.suit(card)||evt.card.number&&evt.card.number==get.number(card))){ - return num+10; + shibei2: {}, + jianying: { + audio: 2, + locked: false, + mod: { + aiOrder: function (player, card, num) { + if (typeof card == "object" && player.isPhaseUsing()) { + var evt = player.getLastUsed(); + if ( + evt && + evt.card && + ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || + (evt.card.number && evt.card.number == get.number(card))) + ) { + return num + 10; } } }, }, - trigger:{player:'useCard'}, - frequent:true, - filter:function(event,player){ - var evt=player.getLastUsed(1); - if(!evt||!evt.card) return false; - if(!player.isPhaseUsing()) return false; - var evt2=evt.getParent('phaseUse'); - if(!evt2||evt2.name!='phaseUse'||evt2.player!=player) return false; - return get.suit(evt.card)!='none'&&get.suit(evt.card)==get.suit(event.card)|| - typeof get.number(evt.card,false)=='number'&&get.number(evt.card,false)==get.number(event.card); + trigger: { player: "useCard" }, + frequent: true, + filter: function (event, player) { + var evt = player.getLastUsed(1); + if (!evt || !evt.card) return false; + if (!player.isPhaseUsing()) return false; + var evt2 = evt.getParent("phaseUse"); + if (!evt2 || evt2.name != "phaseUse" || evt2.player != player) return false; + return ( + (get.suit(evt.card) != "none" && get.suit(evt.card) == get.suit(event.card)) || + (typeof get.number(evt.card, false) == "number" && + get.number(evt.card, false) == get.number(event.card)) + ); }, - content:function(){ + content: function () { player.draw(); }, - group:'jianying_mark', - init:function(player){ - if(player.isPhaseUsing()){ - var evt=_status.event.getParent('phaseUse'); - var history=player.getHistory('useCard',function(evt2){ - return evt2.getParent('phaseUse')==evt; + group: "jianying_mark", + init: function (player) { + if (player.isPhaseUsing()) { + var evt = _status.event.getParent("phaseUse"); + var history = player.getHistory("useCard", function (evt2) { + return evt2.getParent("phaseUse") == evt; }); - if(history.length){ - var trigger=history[history.length-1]; - if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') return; - player.storage.jianying_mark=trigger.card; - player.markSkill('jianying_mark'); - game.broadcastAll(function(player,suit){ - if(player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML=get.translation(suit); - },player,get.suit(trigger.card,player)); - player.when('phaseUseAfter').then(()=>{ - player.unmarkSkill('jianying_mark'); + if (history.length) { + var trigger = history[history.length - 1]; + if ( + get.suit(trigger.card, player) == "none" || + typeof get.number(trigger.card, player) != "number" + ) + return; + player.storage.jianying_mark = trigger.card; + player.markSkill("jianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.jianying_mark) + player.marks.jianying_mark.firstChild.innerHTML = + get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + player.when("phaseUseAfter").then(() => { + player.unmarkSkill("jianying_mark"); delete player.storage.jianying_mark; }); } } }, - onremove:function(player){ - player.unmarkSkill('jianying_mark'); + onremove: function (player) { + player.unmarkSkill("jianying_mark"); delete player.storage.jianying_mark; }, - subSkill:{ - mark:{ - charlotte:true, - trigger:{player:'useCard1'}, - filter:function(event,player){ + subSkill: { + mark: { + charlotte: true, + trigger: { player: "useCard1" }, + filter: function (event, player) { return player.isPhaseUsing(); }, - forced:true, - popup:false, - firstDo:true, - content:function(){ - if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') player.unmarkSkill('jianying_mark'); - else{ - player.storage.jianying_mark=trigger.card; - player.markSkill('jianying_mark'); - game.broadcastAll(function(player,suit){ - if(player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML=get.translation(suit); - },player,get.suit(trigger.card,player)); - player.when('phaseUseAfter').then(()=>{ - player.unmarkSkill('jianying_mark'); + forced: true, + popup: false, + firstDo: true, + content: function () { + if ( + get.suit(trigger.card, player) == "none" || + typeof get.number(trigger.card, player) != "number" + ) + player.unmarkSkill("jianying_mark"); + else { + player.storage.jianying_mark = trigger.card; + player.markSkill("jianying_mark"); + game.broadcastAll( + function (player, suit) { + if (player.marks.jianying_mark) + player.marks.jianying_mark.firstChild.innerHTML = + get.translation(suit); + }, + player, + get.suit(trigger.card, player) + ); + player.when("phaseUseAfter").then(() => { + player.unmarkSkill("jianying_mark"); delete player.storage.jianying_mark; }); } }, - intro:{ - markcount:function(card,player){ - var num=get.number(card,player); - var list=[1,11,12,13]; - if(list.includes(num)) return ['A','J','Q','K'][list.indexOf(num)]; + intro: { + markcount: function (card, player) { + var num = get.number(card, player); + var list = [1, 11, 12, 13]; + if (list.includes(num)) return ["A", "J", "Q", "K"][list.indexOf(num)]; return parseFloat(num); }, - content:function(card,player){ - var suit=get.suit(card,player); - var num=get.number(card,player); - var str='
  • 上一张牌的花色:'+get.translation(suit); - str+='
  • 上一张牌的点数:'; - var list=[1,11,12,13]; - if(list.includes(num)) str+=['A(1)','J(11)','Q(12)','K(13)'][list.indexOf(num)]; - else str+=parseFloat(num); + content: function (card, player) { + var suit = get.suit(card, player); + var num = get.number(card, player); + var str = "
  • 上一张牌的花色:" + get.translation(suit); + str += "
  • 上一张牌的点数:"; + var list = [1, 11, 12, 13]; + if (list.includes(num)) + str += ["A(1)", "J(11)", "Q(12)", "K(13)"][list.indexOf(num)]; + else str += parseFloat(num); return str; }, }, }, }, }, - zzhenggong:{ - trigger:{player:'damageEnd'}, - direct:true, - filter:function(event,player){ - return event.source&&event.source.countCards('e')>0; + zzhenggong: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + return event.source && event.source.countCards("e") > 0; }, - content:function(){ - "step 0" - var att=get.attitude(player,trigger.source); - player.gainPlayerCard('e',get.prompt('zzhenggong'),trigger.source).ai=function(button){ - if(att<=0){ + content: function () { + "step 0"; + var att = get.attitude(player, trigger.source); + player.gainPlayerCard("e", get.prompt("zzhenggong"), trigger.source).ai = function ( + button + ) { + if (att <= 0) { return get.equipValue(button.link); } return 0; - } - "step 1" - if(result.bool){ - player.logSkill('zzhenggong',trigger.source); - var card=result.links[0]; - if(player.getCards('h').includes(card)){ - player.$give(card,player,false); + }; + ("step 1"); + if (result.bool) { + player.logSkill("zzhenggong", trigger.source); + var card = result.links[0]; + if (player.getCards("h").includes(card)) { + player.$give(card, player, false); player.equip(card); } } }, - ai:{ - maixie_defend:true, - } + ai: { + maixie_defend: true, + }, }, - zquanji:{ - trigger:{global:'phaseBegin'}, + zquanji: { + trigger: { global: "phaseBegin" }, //priority:15, - check:function(event,player){ - var att=get.attitude(player,event.player); - if(att<0){ - var nh1=event.player.countCards('h'); - var nh2=player.countCards('h'); - return nh1<=2&&nh2>nh1+1; + check: function (event, player) { + var att = get.attitude(player, event.player); + if (att < 0) { + var nh1 = event.player.countCards("h"); + var nh2 = player.countCards("h"); + return nh1 <= 2 && nh2 > nh1 + 1; } - if(att>0&&event.player.hasJudge('lebu')&&event.player.countCards('h')>event.player.hp+1) return true; + if ( + att > 0 && + event.player.hasJudge("lebu") && + event.player.countCards("h") > event.player.hp + 1 + ) + return true; return false; }, - logTarget:'player', - filter:function(event,player){ - return event.player!=player&&player.canCompare(event.player); + logTarget: "player", + filter: function (event, player) { + return event.player != player && player.canCompare(event.player); }, - content:function(){ - "step 0" + content: function () { + "step 0"; player.chooseToCompare(trigger.player); - "step 1" - if(result.bool){ - trigger.player.skip('phaseZhunbei'); - trigger.player.skip('phaseJudge'); + ("step 1"); + if (result.bool) { + trigger.player.skip("phaseZhunbei"); + trigger.player.skip("phaseJudge"); } }, - ai:{ - expose:0.2 - } - }, - zbaijiang:{ - skillAnimation:true, - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - unique:true, - derivation:['zyexin','zzili','zpaiyi'], - filter:function(event,player){ - return player.countCards('e')>=2; + ai: { + expose: 0.2, }, - content:function(){ - player.awakenSkill('zbaijiang'); + }, + zbaijiang: { + skillAnimation: true, + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + unique: true, + derivation: ["zyexin", "zzili", "zpaiyi"], + filter: function (event, player) { + return player.countCards("e") >= 2; + }, + content: function () { + player.awakenSkill("zbaijiang"); player.gainMaxHp(); - player.changeSkills(['zyexin','zzili'],['zquanji','zzhenggong']); - } + player.changeSkills(["zyexin", "zzili"], ["zquanji", "zzhenggong"]); + }, }, - zyexin:{ - trigger:{player:'damageEnd',source:'damageSource'}, - marktext:'权', - frequent:true, - intro:{ - content:'expansion', - markcount:'expansion', + zyexin: { + trigger: { player: "damageEnd", source: "damageSource" }, + marktext: "权", + frequent: true, + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - content:function(){ - player.addToExpansion('zyexin',get.cards(),'gain2').gaintag.add('zyexin'); + content: function () { + player.addToExpansion("zyexin", get.cards(), "gain2").gaintag.add("zyexin"); }, - group:'zyexin2', + group: "zyexin2", }, - zyexin2:{ - enable:'phaseUse', - usable:1, - lose:false, - discard:false, - delay:false, - selectCard:[1,Infinity], - filterCard:true, - filter:function(event,player){ - return player.getExpansions('zyexin').length>0; + zyexin2: { + enable: "phaseUse", + usable: 1, + lose: false, + discard: false, + delay: false, + selectCard: [1, Infinity], + filterCard: true, + filter: function (event, player) { + return player.getExpansions("zyexin").length > 0; }, - prompt:'用任意数量的手牌与等量的“权”交换', - content:function(){ - 'step 0' - player.addToExpansion(cards,'give',player).gaintag.add('zyexin'); - 'step 1' - player.chooseCardButton(player.getExpansions('zyexin'),'选择'+get.cnNumber(cards.length)+'张牌作为手牌',cards.length,true).ai=function(button){ + prompt: "用任意数量的手牌与等量的“权”交换", + content: function () { + "step 0"; + player.addToExpansion(cards, "give", player).gaintag.add("zyexin"); + ("step 1"); + player.chooseCardButton( + player.getExpansions("zyexin"), + "选择" + get.cnNumber(cards.length) + "张牌作为手牌", + cards.length, + true + ).ai = function (button) { return get.value(button.link); - } - 'step 2' - player.gain(result.links,'gain2'); + }; + ("step 2"); + player.gain(result.links, "gain2"); + }, + ai: { + order: 5, + result: { + player: 1, + }, }, - ai:{ - order:5, - result:{ - player:1 - } - } }, - zzili:{ - skillAnimation:true, - unique:true, - derivation:'zpaiyi', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - return player.getExpansions('zyexin').length>=4; + zzili: { + skillAnimation: true, + unique: true, + derivation: "zpaiyi", + trigger: { player: "phaseZhunbeiBegin" }, + filter: function (event, player) { + return player.getExpansions("zyexin").length >= 4; }, - forced:true, - async content(e,t,player){ - player.awakenSkill('zzili'); + forced: true, + async content(e, t, player) { + player.awakenSkill("zzili"); player.loseMaxHp(); - player.addSkills('zpaiyi'); + player.addSkills("zpaiyi"); }, // intro:{ // content:'limited' // } }, - zpaiyi:{ - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.getExpansions('zyexin').length; + zpaiyi: { + trigger: { player: "phaseJieshuBegin" }, + filter: function (event, player) { + return player.getExpansions("zyexin").length; }, - direct:true, - content:function(){ - 'step 0' - var next=player.chooseCardButton(get.prompt('zpaiyi'),player.getExpansions('zyexin')); - next.set('ai',function(button){ + direct: true, + content: function () { + "step 0"; + var next = player.chooseCardButton(get.prompt("zpaiyi"), player.getExpansions("zyexin")); + next.set("ai", function (button) { return get.value(button.link); }); - 'step 1' - if(result.bool){ - var card=result.links[0]; - event.card=card; - player.chooseTarget(function(card,player,target){ - var card=_status.event.card; - var type=get.type(card); - switch(type){ - case 'basic': case 'trick': - return true; - case 'delay': - return target.canAddJudge(card); - case 'equip': - return target.canEquip(card,true); - } - return true; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',card); - } - else{ + ("step 1"); + if (result.bool) { + var card = result.links[0]; + event.card = card; + player + .chooseTarget(function (card, player, target) { + var card = _status.event.card; + var type = get.type(card); + switch (type) { + case "basic": + case "trick": + return true; + case "delay": + return target.canAddJudge(card); + case "equip": + return target.canEquip(card, true); + } + return true; + }) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, _status.event.card, player, player); + }) + .set("card", card); + } else { event.finish(); } - 'step 2' - if(result.bool){ - var type=get.type(event.card),target=result.targets[0]; - player.logSkill('zpaiyi',target); - switch(type){ - case 'basic': case 'trick': - player.give(event.card,target,'give'); + ("step 2"); + if (result.bool) { + var type = get.type(event.card), + target = result.targets[0]; + player.logSkill("zpaiyi", target); + switch (type) { + case "basic": + case "trick": + player.give(event.card, target, "give"); break; - case 'delay': - player.$give(event.card,target,false); + case "delay": + player.$give(event.card, target, false); target.addJudge(event.card); break; - case 'equip': - player.$give(event.card,target,false); + case "equip": + player.$give(event.card, target, false); target.equip(event.card); } - if(player!=result.targets[0]){ - player.chooseBool('是否摸一张牌?'); - } - else event.finish(); - } - else event.finish(); - 'step 3' - if(result.bool) player.draw(); + if (player != result.targets[0]) { + player.chooseBool("是否摸一张牌?"); + } else event.finish(); + } else event.finish(); + ("step 3"); + if (result.bool) player.draw(); }, - ai:{ - combo:'zyexin' + ai: { + combo: "zyexin", + }, + }, + }, + card: { + lukai_spade: { fullskin: true }, + lukai_heart: { fullskin: true }, + lukai_diamond: { fullskin: true }, + lukai_club: { fullskin: true }, + }, + dynamicTranslate: { + rejueqing: function (player) { + if (player.storage.rejueqing_rewrite) return "锁定技,你即将造成的伤害均视为失去体力。"; + return "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。"; + }, + reyanzhu: function (player) { + if (!player.storage.reyanzhu) + return "出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。"; + return "出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。"; + }, + rexingxue: function (player) { + if (player.storage.reyanzhu) + return "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。"; + return "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。"; + }, + jiaozhao: function (player) { + var num = player.countMark("xindanxin"); + if (num > 2) + return "出牌阶段限两次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。"; + if (num > 1) + return "出牌阶段限一次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。"; + if (num > 0) + return "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌或普通锦囊牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。"; + return "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。"; + }, + funan: function (player) { + if (player.hasSkill("funan_jiexun")) + return "其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。"; + return "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。"; + }, + lkbushi: function (player) { + var list = lib.skill.lkbushi.getBushi(player).map((i) => get.translation(i)); + return ( + "①你使用" + + list[0] + + "牌无次数限制。②当你使用或打出" + + list[1] + + "牌后,你摸一张牌。③当你成为" + + list[2] + + "牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张" + + list[3] + + "牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。" + ); + }, + diezhang: function (player) { + var str = ""; + str += player.storage.duanwan ? "" : "①出牌阶段,你使用杀的次数上限+1。②"; + str += "转换技" + (player.storage.duanwan ? ",每回合限一次" : "") + "。"; + var cnNum = get.cnNumber(player.storage.duanwan ? 2 : 1); + var yinStr = + "阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用" + cnNum + "张【杀】"; + var yangStr = + "阳:当其他角色使用牌被你抵消后,你可以摸" + cnNum + "张牌,视为对其使用一张【杀】"; + if (player.storage.diezhang) { + if (player.storage.duanwan) + yinStr = '' + yinStr + ""; + yangStr = '' + yangStr + ""; + } else { + yinStr = '' + yinStr + ""; + if (player.storage.duanwan) + yangStr = '' + yangStr + ""; } - } - }, - card:{ - lukai_spade:{fullskin:true}, - lukai_heart:{fullskin:true}, - lukai_diamond:{fullskin:true}, - lukai_club:{fullskin:true}, - }, - dynamicTranslate:{ - rejueqing:function(player){ - if(player.storage.rejueqing_rewrite) return '锁定技,你即将造成的伤害均视为失去体力。'; - return '当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力,并于此伤害结算完成后修改〖绝情〗(X为伤害值)。'; - }, - reyanzhu:function(player){ - if(!player.storage.reyanzhu) return '出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。'; - return '出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。'; - }, - rexingxue:function(player){ - if(player.storage.reyanzhu) return '结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。'; - return '结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。'; - }, - jiaozhao:function(player){ - var num=player.countMark('xindanxin'); - if(num>2) return '出牌阶段限两次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。'; - if(num>1) return '出牌阶段限一次,你可以将一张手牌当做任意基本牌或普通锦囊牌使用(你不能对自己使用此牌)。'; - if(num>0) return '出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌或普通锦囊牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。'; - return '出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌,且此牌不可被【无懈可击】响应)。'; - }, - funan:function(player){ - if(player.hasSkill('funan_jiexun')) return '其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。'; - return '其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。'; - }, - lkbushi:function(player){ - var list=lib.skill.lkbushi.getBushi(player).map((i)=>get.translation(i)); - return '①你使用'+list[0]+'牌无次数限制。②当你使用或打出'+list[1]+'牌后,你摸一张牌。③当你成为'+list[2]+'牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张'+list[3]+'牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。'; - }, - diezhang:function(player){ - var str=''; - str+=player.storage.duanwan?'':'①出牌阶段,你使用杀的次数上限+1。②'; - str+='转换技'+(player.storage.duanwan?',每回合限一次':'')+'。'; - var cnNum=get.cnNumber(player.storage.duanwan?2:1); - var yinStr='阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用'+cnNum+'张【杀】'; - var yangStr='阳:当其他角色使用牌被你抵消后,你可以摸'+cnNum+'张牌,视为对其使用一张【杀】'; - if(player.storage.diezhang){ - if(player.storage.duanwan) yinStr=''+yinStr+''; - yangStr=''+yangStr+''; - } - else{ - yinStr=''+yinStr+''; - if(player.storage.duanwan) yangStr=''+yangStr+''; - } - return str+yinStr+';'+yangStr+'。'; + return str + yinStr + ";" + yangStr + "。"; }, }, - characterReplace:{ - caozhi:['caozhi','dc_caozhi','re_caozhi','ps_caozhi'], - zhangchunhua:['zhangchunhua','re_zhangchunhua'], - yujin:['yujin','yujin_yujin','ol_yujin','sb_yujin','xin_yujin','re_yujin'], - dc_xushu:['re_xushu','dc_xushu'], - xushu:['xin_xushu','xushu'], - fazheng:['xin_fazheng','re_fazheng','sb_fazheng','tw_re_fazheng','fazheng'], - masu:['xin_masu','re_masu','masu'], - xusheng:['xusheng','xin_xusheng','re_xusheng','old_xusheng'], - wuguotai:['wuguotai','xin_wuguotai','re_wuguotai'], - lingtong:['lingtong','xin_lingtong','ol_lingtong','re_lingtong','old_lingtong'], - gaoshun:['gaoshun','xin_gaoshun','ol_gaoshun','re_gaoshun','sb_gaoshun','old_gaoshun'], - zhonghui:['zhonghui','xin_zhonghui','re_zhonghui','old_zhonghui','pe_zhonghui'], - wangyi:['wangyi','ol_wangyi','re_wangyi','old_wangyi'], - caozhang:['caozhang','ol_caozhang','re_caozhang','xin_caozhang'], - guanzhang:['guanzhang','re_guanzhang','old_guanzhang'], - madai:['old_madai','re_madai','tw_madai','madai'], - liaohua:['liaohua','re_liaohua','xin_liaohua'], - bulianshi:['bulianshi','dc_bulianshi','re_bulianshi','old_bulianshi'], - handang:['handang','xin_handang','re_handang','tw_handang','old_handang'], - chengpu:['chengpu','ol_chengpu','re_chengpu','xin_chengpu','tw_chengpu','ns_chengpu'], - liubiao:['liubiao','xin_liubiao','re_liubiao','sb_liubiao','oldre_liubiao','old_liubiao'], - manchong:['manchong','re_manchong'], - caochong:['caochong','re_caochong','old_caochong'], - guohuai:['guohuai','re_guohuai','xin_guohuai','tw_guohuai','ol_guohuai'], - jianyong:['jianyong','ol_jianyong','re_jianyong','xin_jianyong'], - panzhangmazhong:['panzhangmazhong','re_panzhangmazhong','xin_panzhangmazhong'], - yufan:['yufan','ol_yufan','xin_yufan','re_yufan'], - zhuran:['zhuran','re_zhuran','xin_zhuran','old_zhuran'], - liru:['xin_liru','dc_liru','re_liru','yj_liru','+liru'], - fuhuanghou:['fuhuanghou','re_fuhuanghou','xin_fuhuanghou','old_fuhuanghou'], - chenqun:['chenqun','dc_chenqun','re_chenqun','old_chenqun'], - hanhaoshihuan:['hanhaoshihuan','re_hanhaoshihuan'], - caozhen:['caozhen','re_caozhen','xin_caozhen','old_caozhen'], - wuyi:['wuyi','re_wuyi','xin_wuyi'], - sunluban:['re_sunluban','xin_sunluban','sunluban'], - zhuhuan:['re_zhuhuan','xin_zhuhuan','zhuhuan','old_zhuhuan'], - caoxiu:['caoxiu','re_caoxiu','xin_caoxiu','tw_caoxiu','old_caoxiu'], - xiahoushi:['xiahoushi','re_xiahoushi','sb_xiahoushi'], - zhangyi:['zhangyi','re_zhangyi','xin_zhangyi'], - quancong:['quancong','re_quancong','xin_quancong','old_quancong'], - sunxiu:['sunxiu','re_sunxiu','xin_sunxiu'], - zhuzhi:['zhuzhi','re_zhuzhi','xin_zhuzhi','old_zhuzhi'], - liuyu:['liuyu','dc_liuyu','ol_liuyu'], - zhangrang:['zhangrang','ol_zhangrang','junk_zhangrang'], - jikang:['jikang','re_jikang','dc_jikang'], - xinxianying:['xinxianying','re_xinxianying','ol_xinxianying','sp_xinxianying'], - gongsunyuan:['gongsunyuan','re_gongsunyuan'], - zhoucang:['zhoucang','re_zhoucang','xin_zhoucang'], - guotufengji:['guotufengji','re_guotufengji'], - guanping:['guanping','re_guanping'], - caifuren:['caifuren','re_caifuren','xin_caifuren'], - guyong:['guyong','re_guyong','xin_guyong','tw_guyong'], - yj_jushou:['yj_jushou','re_jushou','xin_jushou'], - guohuanghou:['guohuanghou','re_guohuanghou'], - liuchen:['liuchen','re_liuchen'], - liufeng:['liufeng','re_liufeng'], - sundeng:['sundeng','re_sundeng','ns_sundeng'], - caiyong:['caiyong','re_caiyong'], - chengong:['chengong','re_chengong','sb_chengong'], - xunyou:['xunyou','re_xunyou','clan_xunyou'], - xuezong:['xuezong','tw_xuezong'], - huanghao:['huanghao','dc_huanghao','old_huanghao'], - caorui:['caorui','re_caorui','old_caorui'], - sunziliufang:['sunziliufang','dc_sunziliufang'], - liyan:['liyan','old_liyan'], - zhangsong:['zhangsong','re_zhangsong'], - zhongyao:['zhongyao','re_zhongyao'], - liwan:['ol_liwan','liwan'], - wuxian:['wuxian','clan_wuxian'], + characterReplace: { + caozhi: ["caozhi", "dc_caozhi", "re_caozhi", "ps_caozhi"], + zhangchunhua: ["zhangchunhua", "re_zhangchunhua"], + yujin: ["yujin", "yujin_yujin", "ol_yujin", "sb_yujin", "xin_yujin", "re_yujin"], + dc_xushu: ["re_xushu", "dc_xushu"], + xushu: ["xin_xushu", "xushu"], + fazheng: ["xin_fazheng", "re_fazheng", "sb_fazheng", "tw_re_fazheng", "fazheng"], + masu: ["xin_masu", "re_masu", "masu"], + xusheng: ["xusheng", "xin_xusheng", "re_xusheng", "old_xusheng"], + wuguotai: ["wuguotai", "xin_wuguotai", "re_wuguotai"], + lingtong: ["lingtong", "xin_lingtong", "ol_lingtong", "re_lingtong", "old_lingtong"], + gaoshun: ["gaoshun", "xin_gaoshun", "ol_gaoshun", "re_gaoshun", "sb_gaoshun", "old_gaoshun"], + zhonghui: ["zhonghui", "xin_zhonghui", "re_zhonghui", "old_zhonghui", "pe_zhonghui"], + wangyi: ["wangyi", "ol_wangyi", "re_wangyi", "old_wangyi"], + caozhang: ["caozhang", "ol_caozhang", "re_caozhang", "xin_caozhang"], + guanzhang: ["guanzhang", "re_guanzhang", "old_guanzhang"], + madai: ["old_madai", "re_madai", "tw_madai", "madai"], + liaohua: ["liaohua", "re_liaohua", "xin_liaohua"], + bulianshi: ["bulianshi", "dc_bulianshi", "re_bulianshi", "old_bulianshi"], + handang: ["handang", "xin_handang", "re_handang", "tw_handang", "old_handang"], + chengpu: ["chengpu", "ol_chengpu", "re_chengpu", "xin_chengpu", "tw_chengpu", "ns_chengpu"], + liubiao: ["liubiao", "xin_liubiao", "re_liubiao", "sb_liubiao", "oldre_liubiao", "old_liubiao"], + manchong: ["manchong", "re_manchong"], + caochong: ["caochong", "re_caochong", "old_caochong"], + guohuai: ["guohuai", "re_guohuai", "xin_guohuai", "tw_guohuai", "ol_guohuai"], + jianyong: ["jianyong", "ol_jianyong", "re_jianyong", "xin_jianyong"], + panzhangmazhong: ["panzhangmazhong", "re_panzhangmazhong", "xin_panzhangmazhong"], + yufan: ["yufan", "ol_yufan", "xin_yufan", "re_yufan"], + zhuran: ["zhuran", "re_zhuran", "xin_zhuran", "old_zhuran"], + liru: ["xin_liru", "dc_liru", "re_liru", "yj_liru", "+liru"], + fuhuanghou: ["fuhuanghou", "re_fuhuanghou", "xin_fuhuanghou", "old_fuhuanghou"], + chenqun: ["chenqun", "dc_chenqun", "re_chenqun", "old_chenqun"], + hanhaoshihuan: ["hanhaoshihuan", "re_hanhaoshihuan"], + caozhen: ["caozhen", "re_caozhen", "xin_caozhen", "old_caozhen"], + wuyi: ["wuyi", "re_wuyi", "xin_wuyi"], + sunluban: ["re_sunluban", "xin_sunluban", "sunluban"], + zhuhuan: ["re_zhuhuan", "xin_zhuhuan", "zhuhuan", "old_zhuhuan"], + caoxiu: ["caoxiu", "re_caoxiu", "xin_caoxiu", "tw_caoxiu", "old_caoxiu"], + xiahoushi: ["xiahoushi", "re_xiahoushi", "sb_xiahoushi"], + zhangyi: ["zhangyi", "re_zhangyi", "xin_zhangyi"], + quancong: ["quancong", "re_quancong", "xin_quancong", "old_quancong"], + sunxiu: ["sunxiu", "re_sunxiu", "xin_sunxiu"], + zhuzhi: ["zhuzhi", "re_zhuzhi", "xin_zhuzhi", "old_zhuzhi"], + liuyu: ["liuyu", "dc_liuyu", "ol_liuyu"], + zhangrang: ["zhangrang", "ol_zhangrang", "junk_zhangrang"], + jikang: ["jikang", "re_jikang", "dc_jikang"], + xinxianying: ["xinxianying", "re_xinxianying", "ol_xinxianying", "sp_xinxianying"], + gongsunyuan: ["gongsunyuan", "re_gongsunyuan"], + zhoucang: ["zhoucang", "re_zhoucang", "xin_zhoucang"], + guotufengji: ["guotufengji", "re_guotufengji"], + guanping: ["guanping", "re_guanping"], + caifuren: ["caifuren", "re_caifuren", "xin_caifuren"], + guyong: ["guyong", "re_guyong", "xin_guyong", "tw_guyong"], + yj_jushou: ["yj_jushou", "re_jushou", "xin_jushou"], + guohuanghou: ["guohuanghou", "re_guohuanghou"], + liuchen: ["liuchen", "re_liuchen"], + liufeng: ["liufeng", "re_liufeng"], + sundeng: ["sundeng", "re_sundeng", "ns_sundeng"], + caiyong: ["caiyong", "re_caiyong"], + chengong: ["chengong", "re_chengong", "sb_chengong"], + xunyou: ["xunyou", "re_xunyou", "clan_xunyou"], + xuezong: ["xuezong", "tw_xuezong"], + huanghao: ["huanghao", "dc_huanghao", "old_huanghao"], + caorui: ["caorui", "re_caorui", "old_caorui"], + sunziliufang: ["sunziliufang", "dc_sunziliufang"], + liyan: ["liyan", "old_liyan"], + zhangsong: ["zhangsong", "re_zhangsong"], + zhongyao: ["zhongyao", "re_zhongyao"], + liwan: ["ol_liwan", "liwan"], + wuxian: ["wuxian", "clan_wuxian"], }, - translate:{ - old_huaxiong:'将华雄', - old_huaxiong_prefix:'将', - yufan:'虞翻', - xushu:'旧徐庶', - xushu_prefix:'旧', - caozhi:'曹植', - zhangchunhua:'张春华', - lingtong:'凌统', - xunyou:'荀攸', - liubiao:'刘表', - zhuran:'朱然', - yujin:'于禁', - masu:'旧马谡', - masu_prefix:'旧', - xin_masu:'马谡', - xin_fazheng:'法正', - wuguotai:'吴国太', - chengong:'陈宫', - xusheng:'徐盛', - guohuai:'郭淮', - caochong:'曹冲', - bulianshi:'步练师', - handang:'韩当', - fuhuanghou:'伏寿', - caifuren:'蔡夫人', - zhonghui:'钟会', - old_zhonghui:'旧钟会', - old_zhonghui_prefix:'旧', - sunluban:'孙鲁班', - chenqun:'陈群', - zhangsong:'张松', - guyong:'顾雍', - jianyong:'简雍', - old_madai:'马岱', - gz_madai:'马岱', - xin_xushu:'徐庶', - manchong:'满宠', - liufeng:'刘封', - liru:'旧李儒', - liru_prefix:'旧', - yj_jushou:'沮授', - zhuhuan:'朱桓', - xiahoushi:'夏侯氏', - panzhangmazhong:'潘璋马忠', - caorui:'曹叡', - caoxiu:'曹休', - zhongyao:'钟繇', - liuchen:'刘谌', - zhangyi:'张嶷', - sunxiu:'孙休', - zhuzhi:'朱治', - quancong:'全琮', - gongsunyuan:'公孙渊', - guotufengji:'郭图逢纪', - zhoucang:'周仓', - guanping:'关平', - liaohua:'廖化', - caozhen:'曹真', - wuyi:'吴懿', - hanhaoshihuan:'韩浩史涣', - chengpu:'程普', - gaoshun:'高顺', - xin_liru:'李儒', - guohuanghou:'郭皇后', - liuyu:'刘虞', - sundeng:'孙登', - liyan:'李严', - sunziliufang:'孙资刘放', - huanghao:'黄皓', - zhangrang:'张让', - cenhun:'岑昏', - xinxianying:'辛宪英', - wuxian:'吴苋', - xushi:'徐氏', - caojie:'曹节', - xuezong:'薛综', - jikang:'嵇康', - qinmi:'秦宓', - caiyong:'蔡邕', + translate: { + old_huaxiong: "将华雄", + old_huaxiong_prefix: "将", + yufan: "虞翻", + xushu: "旧徐庶", + xushu_prefix: "旧", + caozhi: "曹植", + zhangchunhua: "张春华", + lingtong: "凌统", + xunyou: "荀攸", + liubiao: "刘表", + zhuran: "朱然", + yujin: "于禁", + masu: "旧马谡", + masu_prefix: "旧", + xin_masu: "马谡", + xin_fazheng: "法正", + wuguotai: "吴国太", + chengong: "陈宫", + xusheng: "徐盛", + guohuai: "郭淮", + caochong: "曹冲", + bulianshi: "步练师", + handang: "韩当", + fuhuanghou: "伏寿", + caifuren: "蔡夫人", + zhonghui: "钟会", + old_zhonghui: "旧钟会", + old_zhonghui_prefix: "旧", + sunluban: "孙鲁班", + chenqun: "陈群", + zhangsong: "张松", + guyong: "顾雍", + jianyong: "简雍", + old_madai: "马岱", + gz_madai: "马岱", + xin_xushu: "徐庶", + manchong: "满宠", + liufeng: "刘封", + liru: "旧李儒", + liru_prefix: "旧", + yj_jushou: "沮授", + zhuhuan: "朱桓", + xiahoushi: "夏侯氏", + panzhangmazhong: "潘璋马忠", + caorui: "曹叡", + caoxiu: "曹休", + zhongyao: "钟繇", + liuchen: "刘谌", + zhangyi: "张嶷", + sunxiu: "孙休", + zhuzhi: "朱治", + quancong: "全琮", + gongsunyuan: "公孙渊", + guotufengji: "郭图逢纪", + zhoucang: "周仓", + guanping: "关平", + liaohua: "廖化", + caozhen: "曹真", + wuyi: "吴懿", + hanhaoshihuan: "韩浩史涣", + chengpu: "程普", + gaoshun: "高顺", + xin_liru: "李儒", + guohuanghou: "郭皇后", + liuyu: "刘虞", + sundeng: "孙登", + liyan: "李严", + sunziliufang: "孙资刘放", + huanghao: "黄皓", + zhangrang: "张让", + cenhun: "岑昏", + xinxianying: "辛宪英", + wuxian: "吴苋", + xushi: "徐氏", + caojie: "曹节", + xuezong: "薛综", + jikang: "嵇康", + qinmi: "秦宓", + caiyong: "蔡邕", - "new_qingxian":"清弦", - "new_qingxian_info":"出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", - "new_juexiang":"绝响", - "new_juexiang_info":"锁定技,当你死亡后,杀死你的角色弃置装备区内的所有牌并失去1点体力。然后,你可以令一名其他角色获得技能〖残韵〗。若该角色区域内有梅花牌,则其可以弃置其中的一张,然后其获得技能〖绝响〗。", - "new_canyun":"残韵", - "new_canyun_info":"出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", - "qingxian_draw":"清弦", - "qingxian_draw_info":"", - zhenjun:"镇军", - "zhenjun_info":"准备阶段,你可以弃置一名手牌数多于体力值的角色的X张牌(X为其手牌数和体力值之差),然后选择一项:1.你弃置等同于其中非装备牌数量的牌;2.其摸等量的牌。", - rezhenjun:"镇军", - rezhenjun_info:"准备阶段,你可以弃置一名角色的X张牌(X为其手牌数和体力值之差且至少为1),然后选择一项:1.你弃置X张牌;2.其摸X张牌。(X为其弃置的牌中非装备牌的数量)", - fenli:'奋励', - fenli_info:'若你的手牌数为全场最多,你可以跳过摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。', - pingkou:'平寇', - pingkou_info:'回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。', - xinanguo:'安国', - xinanguo_info:'出牌阶段限一次,你可以选择一名其他角色,若其手牌数为全场最少,其摸一张牌;体力值为全场最低,回复1点体力;装备区内牌数为全场最少,随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。', - pindi:'品第', - pindi_info:'出牌阶段,你可以弃置一张牌并选择一名其他角色(不能弃置相同类型牌且不能指定相同的角色),然后令其执行一项:摸X张牌;弃置X张牌(X为本回合此技能发动次数)。若其已受伤,你横置。', - funan_jiexun:'诫训', - bizhuan:'辟撰', - bizhuan_bg:'书', - bizhuan_info:'当你使用黑桃牌后,或你成为其他角色使用黑桃牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”;你至多拥有四张“书”,你每有一张“书” ,手牌上限+1。', - tongbo:'通博', - tongbo_info:'摸牌阶段摸牌后,你可以用任意张牌替换等量的“书”,然后若你的“书”包含四种花色,你将所有“书”交给任意名其他角色。', - qingxian:'清弦', - qingxian_info:'当你受到伤害/回复体力后,你可以令伤害来源/一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你摸一张牌。', - juexiang:'绝响', - juexiang_info:'当你死亡后,你可以令一名角色随机获得“清弦残谱”其中一个技能,然后直到其下回合开始,其不能被选择为其他角色使用梅花牌的目标。', - juexiang_ji:'激弦', - juexiang_ji_info:'当你受到伤害后,你可以令伤害来源失去1点体力,随机使用一张装备。', - juexiang_lie:'烈弦', - juexiang_lie_info:'当你回复体力后,你可以令一名其他角色失去1点体力,随机使用一张装备。', - juexiang_rou:'柔弦', - juexiang_rou_info:'当你受到伤害后,你可以令伤害来源回复1点体力,弃置一张装备。', - juexiang_he:'和弦', - juexiang_he_info:'当你回复体力后,你可以令一名其他角色回复1点体力,弃置一张装备。', - juexiang_club:'绝响', - juexiang_club_bg:'响', - juexiang_club_info:'直到下回合开始,不能被选择为其他角色使用梅花牌的目标。', - jianzheng:'谏征', - jianzheng_info:'当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。', - zhuandui:'专对', - zhuandui_info:'当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效。', - zhuandui_use_info:'当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应。', - zhuandui_respond_info:'当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效。', - tianbian:'天辩', - tianbian_info:'你拼点时,可以改为用牌堆顶的一张牌进行拼点;当你拼点的牌亮出后,若此牌花色为红桃,则此牌的点数视为K。', - funan:'复难', - funan_info:'其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。', - jiexun:'诫训', - jiexun_info:'结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你失去〖诫训〗,然后你发动〖复难〗时,无须令对方获得你使用的牌。', - xinjiexun:'诫训', - xinjiexun_info:'结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你将X归零,然后你发动〖复难〗时,无须令对方获得你使用的牌。', - shouxi:'守玺', - shouxi_info:'当你成为【杀】的目标后,你可声明一种未以此法声明过的基本牌或锦囊牌的牌名。若使用者弃置一张你声明的牌,其获得你的一张牌;若否,则此【杀】对你无效。', - huimin:'惠民', - huimin_info:'结束阶段,你可以摸X张牌并展示等量手牌(X为手牌数小于其体力值的角色数),然后从你指定的一名角色开始这些角色依次选择并获得其中一张。', - wengua:'问卦', - wengua2:'问卦', - wengua_info:'其他角色/你的出牌阶段限一次,其可以交给你一张牌,(若当前回合角色为你,则跳过此步骤),你可以将此牌/一张牌置于牌堆顶或牌堆底,然后你与其/你从另一端摸一张牌。', - fuzhu:'伏诛', - fuzhu_info:'一名男性角色的结束阶段,若牌堆剩余牌数不大于你体力值的十倍,则你可以依次对其使用牌堆中所有的【杀】(不能超过游戏人数),然后洗牌。', - fumian:'福绵', - fumian_info:'准备阶段,你可以选择一项:1.摸牌阶段多摸一张牌;2.使用红色牌可以多选择一个目标(限一次)。若与你上回合选择的选项不同,则该选项数值+1并复原此技能。', - daiyan:'怠宴', - daiyan_info:'结束阶段,你可以令一名其他角色从牌堆中获得一张红桃基本牌,然后若其于上回合成为过该技能目标,则其失去1点体力。', - xinzhongjian:'忠鉴', - xinzhongjian_info:'出牌阶段限一次,你可以展示自己的一张手牌,然后展示一名其他角色的至多三张手牌。其展示的牌中:每有一张花色相同,你摸一张牌;点数相同,你对其造成1点伤害;均不同,你弃置一张手牌。', - zhongjian:'忠鉴', - zhongjian_bg:'鉴', - zhongjian3:'忠鉴', - zhongjian3_bg:'鉴', - zhongjian_info:'出牌阶段限一次,你可以展示一张手牌,然后展示一名其他角色的X张手牌(X为其体力值)。若以此法展示的牌与你展示的牌:有颜色相同的,你选择:①摸一张牌。②弃置一名其他角色的一张牌;有点数相同的,本回合此技能改为“出牌阶段限两次”;均不同,你的手牌上限-1。', - caishi:'才识', - caishix:'才识/忠鉴', - caishi_info:'摸牌阶段开始时,你可以选择一项:1.令手牌上限+1;2.回复1点体力,本回合内不能对自己使用牌。', - xincaishi:'才识', - xincaishi_info:'摸牌阶段,你可以选择一项:1.少摸一张牌,然后本回合发动〖忠鉴〗时可以多展示自己的一张牌;2.本回合手牌上限-1,然后本回合发动〖忠鉴〗时可以多展示对方的一张牌;3.多摸两张牌,本回合不能发动〖忠鉴〗。', - guizao:'瑰藻', - guizao_info:'弃牌阶段结束时,若你于此阶段弃置牌的数量不小于2且它们的花色各不相同,你可以回复1点体力或摸一张牌。', - jiyu:'讥谀', - jiyu_info:'出牌阶段限一次,你可以令一名角色弃置一张手牌。若如此做,你不能使用与之相同花色的牌,直到回合结束。若其以此法弃置的牌为黑桃,你翻面并令其失去1点体力。若你有未被〖讥谀〗限制的手牌,则你可以继续发动此技能,但不能选择本回合已经选择过的目标。', - qinqing:'寝情', - qinqing_info:'结束阶段,你可以选择任意名攻击范围内含有主公的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比主公多的角色数)。', - qinqing_info_doudizhu:'结束阶段,你可以选择任意名攻击范围内含有地主的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比地主多的角色数)。', - huisheng:'贿生', - huisheng_info:'当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张,防止此伤害,然后你不能再对其发动〖贿生〗;2.弃置等量的牌。', - jishe:'极奢', - jishe2:'极奢', - jishe_info:'①出牌阶段限20次,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。②结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)。', - lianhuo:'链祸', - lianhuo_info:'锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1。', - taoluan:'滔乱', - taoluan_backup:'滔乱', - taoluan_info:'你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力且〖滔乱〗无效直到回合结束。', - xintaoluan:'滔乱', - xintaoluan_backup:'滔乱', - xintaoluan_info:'若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)。', - jiaozhao:'矫诏', - jiaozhao3:'矫诏', - jiaozhao3_backup:'矫诏', - jiaozhao2:'矫诏', - jiaozhao_info:'出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌)。', - danxin:'殚心', - danxin_info:'当你受到伤害后,你可以摸一张牌,或对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。', - xindanxin:'殚心', - xindanxin_info:'当你受到伤害后,你可以摸一张牌,并对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。3.将“出牌阶段限一次”改为“出牌阶段限两次”。', - duliang:'督粮', - duliang2:'督粮', - duliang_info:'出牌阶段限一次,你可以获得一名其他角色的一张手牌,然后选择一项:1.令其观看牌堆顶的两张牌,然后获得其中的基本牌;2.令其于下个摸牌阶段额外摸一张牌。', - fulin:'腹鳞', - fulin_info:'锁定技,你于回合内得到的牌不计入你本回合的手牌上限。', - kuangbi:'匡弼', - kuangbi_info:'出牌阶段限一次,你可以选择一名有牌的其他角色,该角色将其的一至三张牌置于你的武将牌上。若如此做,你的下个准备阶段,你获得武将牌上的所有牌,然后其摸等量的牌。', - xinzhige:'止戈', - xinzhige_info:'出牌阶段限一次,你可以令一名攻击范围内含有你的其他角色交给你一张【杀】或武器牌,否则其视为对你指定的另一名其攻击范围内的角色使用了一张【杀】。', - zhige:'止戈', - zhige_info:'出牌阶段限一次,若你的手牌数大于你的体力值,你可以选择攻击范围内含有你的一名其他角色,其选择一项:1.使用一张【杀】;2.将装备区里的一张牌交给你。', - xinzongzuo:'宗祚', - xinzongzuo_info:'锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限并摸两张牌。', - zongzuo:'宗祚', - zongzuo_info:'锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限。', - xinjuece:'绝策', - xinjuece_info:'结束阶段,你可以对一名没有手牌的角色造成1点伤害。', - xinmieji:'灭计', - xinmieji_info:'出牌阶段限一次,你可以展示一张黑色锦囊牌并将之置于牌堆顶,然后令有手牌的一名其他角色选择一项:弃置一张锦囊牌;或依次弃置两张非锦囊牌。', - xinfencheng:'焚城', - xinfencheng_info:'限定技。出牌阶段,你可以令所有其他角色各选择一项:弃置至少X张牌(X为该角色的上家以此法弃置牌的数量+1);或受到你对其造成的2点火焰伤害。', - qianju:'千驹', - qianju_info:'锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值)。', - qingxi:'倾袭', - qingxi_info:'当你使用【杀】对目标角色造成伤害时,若你的装备区里有武器牌,你可以令其选择一项:1、弃置X张手牌(X为此武器牌的攻击范围),若如此做,其弃置你的此武器牌;2、令伤害值+1。', - reqianju:'千驹', - reqianju_info:'锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值且至少为1)。', - reqingxi:'倾袭', - reqingxi_info:'当你使用【杀】或【决斗】指定目标后,你可以令其选择一项:1、弃置X张手牌(X为你攻击范围内的角色数,且当你装备区内有武器牌/没有武器牌时至多为4/2),若如此做,其弃置你的此武器牌;2、令此牌的伤害值+1且你进行判定,若结果为红色,则其不能响应此牌。', - jieyue:'节钺', - jieyue_info:'①结束阶段,你可以弃置一张手牌,然后令一名其他角色选择一项:1.将一张牌置于你的武将牌上,称之为“节”;2.令你弃置其一张牌。②若你有“节”,你可以将红色/黑色手牌当作【闪】/【无懈可击】使用或打出。③准备阶段,若你有“节”,则你获得之。', - xianzhen:'陷阵', - xianzhen_info:'出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视与该角色的距离;无视该角色的防具且对其使用【杀】没有次数限制。若你没赢,你不能使用【杀】直到回合结束。', - xinxianzhen:'陷阵', - xinxianzhen_info:'出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标。若你没赢,你不能使用【杀】且你的【杀】不计入手牌上限直到回合结束。', - xinxianzhen2:'陷阵', - jinjiu:'禁酒', - jinjiu_info:'锁定技,你的【酒】均视为【杀】。', - chunlao:'醇醪', - chunlao2:'醇醪', - chunlao_info:'结束阶段开始时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】。', - lihuo:'疠火', - lihuo_info:'当你声明使用普通【杀】后,你可以将此【杀】改为火【杀】。若以此法使用的【杀】造成了伤害,则此【杀】结算后你失去1点体力;你使用火【杀】选择目标后,可以额外指定一个目标。', - shenduan:'慎断', - shenduan_info:'当你的黑色基本牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。', - yonglve:'勇略', - yonglve_info:'一名其他角色的判定阶段开始时,若其在你攻击范围内,则你可以弃置其判定区里的一张牌,视为对该角色使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。', - reshenduan:'慎断', - reshenduan_info:'当你的黑色基本牌或装备牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。', - reyonglve:'勇略', - reyonglve_info:'其他角色的判定阶段开始时,你可以弃置其判定区里的一张牌。然后若该角色在你攻击范围内,你摸一张牌。若其在你攻击范围外,视为你对其使用一张【杀】。', - benxi:'奔袭', - benxi_info:'锁定技,你的回合内,你每使用一次牌后,你的进攻距离+1直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标。', - xinbenxi:'奔袭', - xinbenxi_info:'锁定技,当你于回合内使用牌时,你本回合计算与其他角色的距离-1。你的回合内,若你至场上所有其他角色的距离均不大于1,则当你使用【杀】或普通锦囊牌选择唯一目标后,你选择至多两项:1.为此牌多指定一个目标;2.令此牌无视防具;3.令此牌不可被抵消;4.此牌造成伤害时摸一张牌。', - sidi:'司敌', - sidi2:'司敌', - sidi3:'司敌', - sidi_info:'①当你使用或其他角色在你的回合内使用【闪】时,你可以将牌堆顶的牌置于你的武将牌上,称为“司敌”牌。②其他角色的出牌阶段开始时,你可以移去一张“司敌”牌,令其本阶段使用【杀】的次数上限-1。', - xinsidi:'司敌', - xinsidi2:'司敌', - xinsidi_info:'其他角色出牌阶段开始时,你可以弃置一张与你装备区里的牌颜色相同的非基本牌,然后该角色于此阶段内不能使用和打出与此牌颜色相同的牌。此阶段结束时,若其此阶段没有使用【杀】,视为你对其使用了【杀】。', - dangxian:'当先', - dangxian_info:'锁定技,回合开始时,你执行一个额外的出牌阶段。', - xindangxian:'当先', - xindangxian_info:'锁定技,回合开始时,你执行一个额外的出牌阶段。此阶段开始时,你失去1点体力并从牌堆/弃牌堆中获得一张【杀】(若你已发动过〖伏枥〗,则可以不发动此效果)。', - longyin:'龙吟', - longyin_info:'当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数,若此【杀】为红色,你摸一张牌。', - zhongyong:'忠勇', - zhongyong_info:'当你于出牌阶段内使用的【杀】被目标角色使用的【闪】抵消时,你可以将此【闪】交给除该角色外的一名角色。若获得此【闪】的角色不是你,你可以对相同的目标再使用一张【杀】。', - xinzhongyong:'忠勇', - xinzhongyong_info:'当你使用的【杀】结算完毕后,你可以将此【杀】或目标角色使用的【闪】交给一名该角色以外的其他角色,以此法得到红色牌的角色可以对你攻击范围内的角色使用一张【杀】。', - jigong:'急攻', - jigong_info:'出牌阶段开始时,你可以摸两张牌。若如此做,你本回合的手牌上限改为X(X为你此阶段造成的伤害点数之和)。', - shifei:'饰非', - shifei_info:'当你需要使用或打出【闪】时,你可以令当前回合角色摸一张牌。然后若其手牌数不为全场唯一最多,则你弃置全场手牌数最多(或之一)角色的一张牌,视为你使用或打出了一张【闪】。', - huaiyi:'怀异', - huaiyi_info:'出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。', - yaoming:'邀名', - yaoming_info:'每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张手牌;2. 令手牌数小于你的一名角色摸一张牌。', - xinyaoming:'邀名', - xinyaoming_info:'每回合每个选项限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置一名其他角色的一张手牌;2. 令一名其他角色摸一张牌;3.令一名角色弃置至多两张牌,然后摸等量的牌。', - anguo:'安国', - anguo_info:'出牌阶段限一次,你可以选择一名其他角色装备区里的一张牌,令其获得此牌。然后若该角色攻击范围内的角色数因此减少,则你摸一张牌。', - yanzhu:'宴诛', - yanzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能〖宴诛〗;或弃置一张牌。', - xingxue:'兴学', - xingxue_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值,若你已失去技能〖宴诛〗,则将X改为你的体力上限)。', - zhaofu:'诏缚', - zhaofu_info:'主公技,锁定技,你距离为1的角色视为在其他吴势力角色的攻击范围内。', - reyanzhu:'宴诛', - reyanzhu2:'宴诛', - reyanzhu_info:'出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。', - reyanzhu_rewrite:'宴诛·改', - reyanzhu_rewrite_info:'出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。', - rexingxue:'兴学', - rexingxue_info:'结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。', - rexingxue_rewrite:'兴学·改', - rexingxue_rewrite_info:'结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。', - rezhaofu:'诏缚', - rezhaofu_info:'主公技,锁定技,你攻击范围内的角色视为在其他吴势力角色的攻击范围内。', - wurong:'怃戎', - wurong_info:'出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌。', - shizhi:'矢志', - shizhi_info:'锁定技,当你的体力值为1时,你的【闪】均视为【杀】。', - zhanjue:'战绝', - zhanjue_info:'出牌阶段,你可以将所有手牌当作【决斗】使用。此【决斗】结算后,你与以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束。', - qinwang:'勤王', - qinwang1:'勤王', - qinwang2:'勤王', - qinwang_info:'主公技,当你需要使用或打出一张【杀】时,你可以弃置一张牌,然后视为你发动了〖激将①〗。若有角色响应,则该角色打出【杀】时摸一张牌。', - huomo:'活墨', - huomo_info:'当你需要使用一张本回合内未使用过的基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。', - zuoding:'佐定', - zuoding_info:'当其他角色于其回合内使用♠牌指定目标后,若本回合内没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌。', - taoxi:'讨袭', - taoxi2:'讨袭', - taoxi3:'讨袭', - taoxi_info:'出牌阶段限一次。当你使用牌指定一名其他角色为唯一目标后,你可以亮出其一张手牌直到回合结束,并且你于此回合内可以将此牌如手牌般使用。回合结束时,若此牌仍在该角色手牌区里,你失去1点体力。', - huituo:'恢拓', - huituo_info:'当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。', - mingjian:'明鉴', - mingjian2:'明鉴', - mingjian_info:'出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。', - xingshuai:'兴衰', - xingshuai_info:'主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。', - reduodao:'夺刀', - reduodao_info:'当你成为【杀】的目标后,你可以弃置一张牌。然后你获得此【杀】使用者装备区里的武器牌。', - reanjian:'暗箭', - reanjian_info:'锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此杀伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。', - duodao:'夺刀', - duodao_info:'当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌。', - anjian:'暗箭', - anjian_info:'锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1。', - xinpojun:'破军', - xinpojun2:'破军', - xinpojun_info:'当你于出牌阶段内使用【杀】指定一个目标后,你可以将其至多X张牌扣置于该角色的武将牌旁(X为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。', + new_qingxian: "清弦", + new_qingxian_info: + "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", + new_juexiang: "绝响", + new_juexiang_info: + "锁定技,当你死亡后,杀死你的角色弃置装备区内的所有牌并失去1点体力。然后,你可以令一名其他角色获得技能〖残韵〗。若该角色区域内有梅花牌,则其可以弃置其中的一张,然后其获得技能〖绝响〗。", + new_canyun: "残韵", + new_canyun_info: + "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", + qingxian_draw: "清弦", + qingxian_draw_info: "", + zhenjun: "镇军", + zhenjun_info: + "准备阶段,你可以弃置一名手牌数多于体力值的角色的X张牌(X为其手牌数和体力值之差),然后选择一项:1.你弃置等同于其中非装备牌数量的牌;2.其摸等量的牌。", + rezhenjun: "镇军", + rezhenjun_info: + "准备阶段,你可以弃置一名角色的X张牌(X为其手牌数和体力值之差且至少为1),然后选择一项:1.你弃置X张牌;2.其摸X张牌。(X为其弃置的牌中非装备牌的数量)", + fenli: "奋励", + fenli_info: + "若你的手牌数为全场最多,你可以跳过摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。", + pingkou: "平寇", + pingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。", + xinanguo: "安国", + xinanguo_info: + "出牌阶段限一次,你可以选择一名其他角色,若其手牌数为全场最少,其摸一张牌;体力值为全场最低,回复1点体力;装备区内牌数为全场最少,随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。", + pindi: "品第", + pindi_info: + "出牌阶段,你可以弃置一张牌并选择一名其他角色(不能弃置相同类型牌且不能指定相同的角色),然后令其执行一项:摸X张牌;弃置X张牌(X为本回合此技能发动次数)。若其已受伤,你横置。", + funan_jiexun: "诫训", + bizhuan: "辟撰", + bizhuan_bg: "书", + bizhuan_info: + "当你使用黑桃牌后,或你成为其他角色使用黑桃牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”;你至多拥有四张“书”,你每有一张“书” ,手牌上限+1。", + tongbo: "通博", + tongbo_info: + "摸牌阶段摸牌后,你可以用任意张牌替换等量的“书”,然后若你的“书”包含四种花色,你将所有“书”交给任意名其他角色。", + qingxian: "清弦", + qingxian_info: + "当你受到伤害/回复体力后,你可以令伤害来源/一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你摸一张牌。", + juexiang: "绝响", + juexiang_info: + "当你死亡后,你可以令一名角色随机获得“清弦残谱”其中一个技能,然后直到其下回合开始,其不能被选择为其他角色使用梅花牌的目标。", + juexiang_ji: "激弦", + juexiang_ji_info: "当你受到伤害后,你可以令伤害来源失去1点体力,随机使用一张装备。", + juexiang_lie: "烈弦", + juexiang_lie_info: "当你回复体力后,你可以令一名其他角色失去1点体力,随机使用一张装备。", + juexiang_rou: "柔弦", + juexiang_rou_info: "当你受到伤害后,你可以令伤害来源回复1点体力,弃置一张装备。", + juexiang_he: "和弦", + juexiang_he_info: "当你回复体力后,你可以令一名其他角色回复1点体力,弃置一张装备。", + juexiang_club: "绝响", + juexiang_club_bg: "响", + juexiang_club_info: "直到下回合开始,不能被选择为其他角色使用梅花牌的目标。", + jianzheng: "谏征", + jianzheng_info: + "当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。", + zhuandui: "专对", + zhuandui_info: + "当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效。", + zhuandui_use_info: + "当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应。", + zhuandui_respond_info: + "当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效。", + tianbian: "天辩", + tianbian_info: + "你拼点时,可以改为用牌堆顶的一张牌进行拼点;当你拼点的牌亮出后,若此牌花色为红桃,则此牌的点数视为K。", + funan: "复难", + funan_info: + "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。", + jiexun: "诫训", + jiexun_info: + "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你失去〖诫训〗,然后你发动〖复难〗时,无须令对方获得你使用的牌。", + xinjiexun: "诫训", + xinjiexun_info: + "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你将X归零,然后你发动〖复难〗时,无须令对方获得你使用的牌。", + shouxi: "守玺", + shouxi_info: + "当你成为【杀】的目标后,你可声明一种未以此法声明过的基本牌或锦囊牌的牌名。若使用者弃置一张你声明的牌,其获得你的一张牌;若否,则此【杀】对你无效。", + huimin: "惠民", + huimin_info: + "结束阶段,你可以摸X张牌并展示等量手牌(X为手牌数小于其体力值的角色数),然后从你指定的一名角色开始这些角色依次选择并获得其中一张。", + wengua: "问卦", + wengua2: "问卦", + wengua_info: + "其他角色/你的出牌阶段限一次,其可以交给你一张牌,(若当前回合角色为你,则跳过此步骤),你可以将此牌/一张牌置于牌堆顶或牌堆底,然后你与其/你从另一端摸一张牌。", + fuzhu: "伏诛", + fuzhu_info: + "一名男性角色的结束阶段,若牌堆剩余牌数不大于你体力值的十倍,则你可以依次对其使用牌堆中所有的【杀】(不能超过游戏人数),然后洗牌。", + fumian: "福绵", + fumian_info: + "准备阶段,你可以选择一项:1.摸牌阶段多摸一张牌;2.使用红色牌可以多选择一个目标(限一次)。若与你上回合选择的选项不同,则该选项数值+1并复原此技能。", + daiyan: "怠宴", + daiyan_info: + "结束阶段,你可以令一名其他角色从牌堆中获得一张红桃基本牌,然后若其于上回合成为过该技能目标,则其失去1点体力。", + xinzhongjian: "忠鉴", + xinzhongjian_info: + "出牌阶段限一次,你可以展示自己的一张手牌,然后展示一名其他角色的至多三张手牌。其展示的牌中:每有一张花色相同,你摸一张牌;点数相同,你对其造成1点伤害;均不同,你弃置一张手牌。", + zhongjian: "忠鉴", + zhongjian_bg: "鉴", + zhongjian3: "忠鉴", + zhongjian3_bg: "鉴", + zhongjian_info: + "出牌阶段限一次,你可以展示一张手牌,然后展示一名其他角色的X张手牌(X为其体力值)。若以此法展示的牌与你展示的牌:有颜色相同的,你选择:①摸一张牌。②弃置一名其他角色的一张牌;有点数相同的,本回合此技能改为“出牌阶段限两次”;均不同,你的手牌上限-1。", + caishi: "才识", + caishix: "才识/忠鉴", + caishi_info: + "摸牌阶段开始时,你可以选择一项:1.令手牌上限+1;2.回复1点体力,本回合内不能对自己使用牌。", + xincaishi: "才识", + xincaishi_info: + "摸牌阶段,你可以选择一项:1.少摸一张牌,然后本回合发动〖忠鉴〗时可以多展示自己的一张牌;2.本回合手牌上限-1,然后本回合发动〖忠鉴〗时可以多展示对方的一张牌;3.多摸两张牌,本回合不能发动〖忠鉴〗。", + guizao: "瑰藻", + guizao_info: + "弃牌阶段结束时,若你于此阶段弃置牌的数量不小于2且它们的花色各不相同,你可以回复1点体力或摸一张牌。", + jiyu: "讥谀", + jiyu_info: + "出牌阶段限一次,你可以令一名角色弃置一张手牌。若如此做,你不能使用与之相同花色的牌,直到回合结束。若其以此法弃置的牌为黑桃,你翻面并令其失去1点体力。若你有未被〖讥谀〗限制的手牌,则你可以继续发动此技能,但不能选择本回合已经选择过的目标。", + qinqing: "寝情", + qinqing_info: + "结束阶段,你可以选择任意名攻击范围内含有主公的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比主公多的角色数)。", + qinqing_info_doudizhu: + "结束阶段,你可以选择任意名攻击范围内含有地主的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比地主多的角色数)。", + huisheng: "贿生", + huisheng_info: + "当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张,防止此伤害,然后你不能再对其发动〖贿生〗;2.弃置等量的牌。", + jishe: "极奢", + jishe2: "极奢", + jishe_info: + "①出牌阶段限20次,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。②结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)。", + lianhuo: "链祸", + lianhuo_info: + "锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1。", + taoluan: "滔乱", + taoluan_backup: "滔乱", + taoluan_info: + "你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力且〖滔乱〗无效直到回合结束。", + xintaoluan: "滔乱", + xintaoluan_backup: "滔乱", + xintaoluan_info: + "若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)。", + jiaozhao: "矫诏", + jiaozhao3: "矫诏", + jiaozhao3_backup: "矫诏", + jiaozhao2: "矫诏", + jiaozhao_info: + "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌)。", + danxin: "殚心", + danxin_info: + "当你受到伤害后,你可以摸一张牌,或对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。", + xindanxin: "殚心", + xindanxin_info: + "当你受到伤害后,你可以摸一张牌,并对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。3.将“出牌阶段限一次”改为“出牌阶段限两次”。", + duliang: "督粮", + duliang2: "督粮", + duliang_info: + "出牌阶段限一次,你可以获得一名其他角色的一张手牌,然后选择一项:1.令其观看牌堆顶的两张牌,然后获得其中的基本牌;2.令其于下个摸牌阶段额外摸一张牌。", + fulin: "腹鳞", + fulin_info: "锁定技,你于回合内得到的牌不计入你本回合的手牌上限。", + kuangbi: "匡弼", + kuangbi_info: + "出牌阶段限一次,你可以选择一名有牌的其他角色,该角色将其的一至三张牌置于你的武将牌上。若如此做,你的下个准备阶段,你获得武将牌上的所有牌,然后其摸等量的牌。", + xinzhige: "止戈", + xinzhige_info: + "出牌阶段限一次,你可以令一名攻击范围内含有你的其他角色交给你一张【杀】或武器牌,否则其视为对你指定的另一名其攻击范围内的角色使用了一张【杀】。", + zhige: "止戈", + zhige_info: + "出牌阶段限一次,若你的手牌数大于你的体力值,你可以选择攻击范围内含有你的一名其他角色,其选择一项:1.使用一张【杀】;2.将装备区里的一张牌交给你。", + xinzongzuo: "宗祚", + xinzongzuo_info: + "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限并摸两张牌。", + zongzuo: "宗祚", + zongzuo_info: + "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限。", + xinjuece: "绝策", + xinjuece_info: "结束阶段,你可以对一名没有手牌的角色造成1点伤害。", + xinmieji: "灭计", + xinmieji_info: + "出牌阶段限一次,你可以展示一张黑色锦囊牌并将之置于牌堆顶,然后令有手牌的一名其他角色选择一项:弃置一张锦囊牌;或依次弃置两张非锦囊牌。", + xinfencheng: "焚城", + xinfencheng_info: + "限定技。出牌阶段,你可以令所有其他角色各选择一项:弃置至少X张牌(X为该角色的上家以此法弃置牌的数量+1);或受到你对其造成的2点火焰伤害。", + qianju: "千驹", + qianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值)。", + qingxi: "倾袭", + qingxi_info: + "当你使用【杀】对目标角色造成伤害时,若你的装备区里有武器牌,你可以令其选择一项:1、弃置X张手牌(X为此武器牌的攻击范围),若如此做,其弃置你的此武器牌;2、令伤害值+1。", + reqianju: "千驹", + reqianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值且至少为1)。", + reqingxi: "倾袭", + reqingxi_info: + "当你使用【杀】或【决斗】指定目标后,你可以令其选择一项:1、弃置X张手牌(X为你攻击范围内的角色数,且当你装备区内有武器牌/没有武器牌时至多为4/2),若如此做,其弃置你的此武器牌;2、令此牌的伤害值+1且你进行判定,若结果为红色,则其不能响应此牌。", + jieyue: "节钺", + jieyue_info: + "①结束阶段,你可以弃置一张手牌,然后令一名其他角色选择一项:1.将一张牌置于你的武将牌上,称之为“节”;2.令你弃置其一张牌。②若你有“节”,你可以将红色/黑色手牌当作【闪】/【无懈可击】使用或打出。③准备阶段,若你有“节”,则你获得之。", + xianzhen: "陷阵", + xianzhen_info: + "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视与该角色的距离;无视该角色的防具且对其使用【杀】没有次数限制。若你没赢,你不能使用【杀】直到回合结束。", + xinxianzhen: "陷阵", + xinxianzhen_info: + "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标。若你没赢,你不能使用【杀】且你的【杀】不计入手牌上限直到回合结束。", + xinxianzhen2: "陷阵", + jinjiu: "禁酒", + jinjiu_info: "锁定技,你的【酒】均视为【杀】。", + chunlao: "醇醪", + chunlao2: "醇醪", + chunlao_info: + "结束阶段开始时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】。", + lihuo: "疠火", + lihuo_info: + "当你声明使用普通【杀】后,你可以将此【杀】改为火【杀】。若以此法使用的【杀】造成了伤害,则此【杀】结算后你失去1点体力;你使用火【杀】选择目标后,可以额外指定一个目标。", + shenduan: "慎断", + shenduan_info: + "当你的黑色基本牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。", + yonglve: "勇略", + yonglve_info: + "一名其他角色的判定阶段开始时,若其在你攻击范围内,则你可以弃置其判定区里的一张牌,视为对该角色使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。", + reshenduan: "慎断", + reshenduan_info: + "当你的黑色基本牌或装备牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。", + reyonglve: "勇略", + reyonglve_info: + "其他角色的判定阶段开始时,你可以弃置其判定区里的一张牌。然后若该角色在你攻击范围内,你摸一张牌。若其在你攻击范围外,视为你对其使用一张【杀】。", + benxi: "奔袭", + benxi_info: + "锁定技,你的回合内,你每使用一次牌后,你的进攻距离+1直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标。", + xinbenxi: "奔袭", + xinbenxi_info: + "锁定技,当你于回合内使用牌时,你本回合计算与其他角色的距离-1。你的回合内,若你至场上所有其他角色的距离均不大于1,则当你使用【杀】或普通锦囊牌选择唯一目标后,你选择至多两项:1.为此牌多指定一个目标;2.令此牌无视防具;3.令此牌不可被抵消;4.此牌造成伤害时摸一张牌。", + sidi: "司敌", + sidi2: "司敌", + sidi3: "司敌", + sidi_info: + "①当你使用或其他角色在你的回合内使用【闪】时,你可以将牌堆顶的牌置于你的武将牌上,称为“司敌”牌。②其他角色的出牌阶段开始时,你可以移去一张“司敌”牌,令其本阶段使用【杀】的次数上限-1。", + xinsidi: "司敌", + xinsidi2: "司敌", + xinsidi_info: + "其他角色出牌阶段开始时,你可以弃置一张与你装备区里的牌颜色相同的非基本牌,然后该角色于此阶段内不能使用和打出与此牌颜色相同的牌。此阶段结束时,若其此阶段没有使用【杀】,视为你对其使用了【杀】。", + dangxian: "当先", + dangxian_info: "锁定技,回合开始时,你执行一个额外的出牌阶段。", + xindangxian: "当先", + xindangxian_info: + "锁定技,回合开始时,你执行一个额外的出牌阶段。此阶段开始时,你失去1点体力并从牌堆/弃牌堆中获得一张【杀】(若你已发动过〖伏枥〗,则可以不发动此效果)。", + longyin: "龙吟", + longyin_info: + "当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数,若此【杀】为红色,你摸一张牌。", + zhongyong: "忠勇", + zhongyong_info: + "当你于出牌阶段内使用的【杀】被目标角色使用的【闪】抵消时,你可以将此【闪】交给除该角色外的一名角色。若获得此【闪】的角色不是你,你可以对相同的目标再使用一张【杀】。", + xinzhongyong: "忠勇", + xinzhongyong_info: + "当你使用的【杀】结算完毕后,你可以将此【杀】或目标角色使用的【闪】交给一名该角色以外的其他角色,以此法得到红色牌的角色可以对你攻击范围内的角色使用一张【杀】。", + jigong: "急攻", + jigong_info: + "出牌阶段开始时,你可以摸两张牌。若如此做,你本回合的手牌上限改为X(X为你此阶段造成的伤害点数之和)。", + shifei: "饰非", + shifei_info: + "当你需要使用或打出【闪】时,你可以令当前回合角色摸一张牌。然后若其手牌数不为全场唯一最多,则你弃置全场手牌数最多(或之一)角色的一张牌,视为你使用或打出了一张【闪】。", + huaiyi: "怀异", + huaiyi_info: + "出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。", + yaoming: "邀名", + yaoming_info: + "每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张手牌;2. 令手牌数小于你的一名角色摸一张牌。", + xinyaoming: "邀名", + xinyaoming_info: + "每回合每个选项限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置一名其他角色的一张手牌;2. 令一名其他角色摸一张牌;3.令一名角色弃置至多两张牌,然后摸等量的牌。", + anguo: "安国", + anguo_info: + "出牌阶段限一次,你可以选择一名其他角色装备区里的一张牌,令其获得此牌。然后若该角色攻击范围内的角色数因此减少,则你摸一张牌。", + yanzhu: "宴诛", + yanzhu_info: + "出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能〖宴诛〗;或弃置一张牌。", + xingxue: "兴学", + xingxue_info: + "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值,若你已失去技能〖宴诛〗,则将X改为你的体力上限)。", + zhaofu: "诏缚", + zhaofu_info: "主公技,锁定技,你距离为1的角色视为在其他吴势力角色的攻击范围内。", + reyanzhu: "宴诛", + reyanzhu2: "宴诛", + reyanzhu_info: + "出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。", + reyanzhu_rewrite: "宴诛·改", + reyanzhu_rewrite_info: + "出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。", + rexingxue: "兴学", + rexingxue_info: + "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。", + rexingxue_rewrite: "兴学·改", + rexingxue_rewrite_info: + "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。", + rezhaofu: "诏缚", + rezhaofu_info: "主公技,锁定技,你攻击范围内的角色视为在其他吴势力角色的攻击范围内。", + wurong: "怃戎", + wurong_info: + "出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌。", + shizhi: "矢志", + shizhi_info: "锁定技,当你的体力值为1时,你的【闪】均视为【杀】。", + zhanjue: "战绝", + zhanjue_info: + "出牌阶段,你可以将所有手牌当作【决斗】使用。此【决斗】结算后,你与以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束。", + qinwang: "勤王", + qinwang1: "勤王", + qinwang2: "勤王", + qinwang_info: + "主公技,当你需要使用或打出一张【杀】时,你可以弃置一张牌,然后视为你发动了〖激将①〗。若有角色响应,则该角色打出【杀】时摸一张牌。", + huomo: "活墨", + huomo_info: + "当你需要使用一张本回合内未使用过的基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。", + zuoding: "佐定", + zuoding_info: + "当其他角色于其回合内使用♠牌指定目标后,若本回合内没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌。", + taoxi: "讨袭", + taoxi2: "讨袭", + taoxi3: "讨袭", + taoxi_info: + "出牌阶段限一次。当你使用牌指定一名其他角色为唯一目标后,你可以亮出其一张手牌直到回合结束,并且你于此回合内可以将此牌如手牌般使用。回合结束时,若此牌仍在该角色手牌区里,你失去1点体力。", + huituo: "恢拓", + huituo_info: + "当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。", + mingjian: "明鉴", + mingjian2: "明鉴", + mingjian_info: + "出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。", + xingshuai: "兴衰", + xingshuai_info: + "主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。", + reduodao: "夺刀", + reduodao_info: + "当你成为【杀】的目标后,你可以弃置一张牌。然后你获得此【杀】使用者装备区里的武器牌。", + reanjian: "暗箭", + reanjian_info: + "锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此杀伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。", + duodao: "夺刀", + duodao_info: "当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌。", + anjian: "暗箭", + anjian_info: "锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1。", + xinpojun: "破军", + xinpojun2: "破军", + xinpojun_info: + "当你于出牌阶段内使用【杀】指定一个目标后,你可以将其至多X张牌扣置于该角色的武将牌旁(X为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。", - qiaoshi:'樵拾', - qiaoshi_info:'其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。', - yanyu:'燕语', - yanyu2:'燕语', - yanyu_info:'出牌阶段,你可以重铸【杀】。出牌阶段结束时,若你于此阶段以此法重铸了至少两张【杀】,则你可以令一名男性角色摸两张牌。', + qiaoshi: "樵拾", + qiaoshi_info: "其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。", + yanyu: "燕语", + yanyu2: "燕语", + yanyu_info: + "出牌阶段,你可以重铸【杀】。出牌阶段结束时,若你于此阶段以此法重铸了至少两张【杀】,则你可以令一名男性角色摸两张牌。", - zzhenggong:'争功', - zzhenggong_info:'当你受到伤害后,你可以获得伤害来源装备区里的一张牌并置入你的装备区。', - zquanji:'权计', - zquanji_info:'其他角色的回合开始时,你可以与该角色拼点。若你赢,该角色跳过准备阶段和判定阶段。', - zbaijiang:'拜将', - zbaijiang_info:'觉醒技。准备阶段,若你装备区里的牌数不少于两张,你加1点体力上限,失去〖权计〗和〖争功〗,获得〖野心〗和〖自立〗。', - zyexin:'野心', - zyexin2:'野心', - zyexin_info:'①当你造成或受到伤害后,你可以将牌堆顶的一张牌置于你的武将牌上,称为“权”。②出牌阶段限一次。你可以用任意数量的手牌与等量的“权”交换。', - zzili:'自立', - zzili_info:'觉醒技。准备阶段,若你的“权”数不小于4,你减1点体力上限并获得〖排异〗。', - zpaiyi:'排异', - zpaiyi_info:'结束阶段,你可以选择一张“权”,若此牌为:装备牌,你将此牌置入一名角色的装备区;延时类锦囊牌,你将此牌置入一名角色的判定区;基本牌或普通锦囊牌,你将此牌交给一名角色。然后若此牌的目标区域对应的角色不为你,你可以摸一张牌。', - shibei:'矢北', - shibei_info:'锁定技,当你受到伤害后:若此伤害是你本回合第一次受到的伤害,则你回复1点体力;否则你失去1点体力。', - jianying:'渐营', - jianying_info:'当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。', - xinenyuan:'恩怨', - xinenyuan1:'恩怨', - xinenyuan2:'恩怨', - xinenyuan_info:'当你获得一名其他角色两张或更多的牌后,你可以令其摸一张牌;当你受到1点伤害后,你可以令伤害来源选择一项:1、将一张手牌交给你;2、失去1点体力。', - xinxuanhuo:'眩惑', - xinxuanhuo_info:'摸牌阶段开始时,你可以改为令一名其他角色摸两张牌,然后该角色需对其攻击范围内你选择的另一名角色使用一张【杀】,否则你获得其两张牌。', - fuhun:'父魂', - fuhun2:'父魂', - fuhun_info:'你可以将两张手牌当做【杀】使用或打出;当你于出牌阶段以此法使用的【杀】造成伤害后,你获得〖武圣〗和〖咆哮〗直到回合结束。', - yuce:'御策', - yuce_info:'当你受到伤害后,你可以展示一张手牌,并令伤害来源选择一项:弃置一张与此牌类型不同的手牌,或令你回复1点体力。', - xiansi:'陷嗣', - xiansix:'陷嗣', - xiansi_bg:'逆', - xiansi2:'陷嗣', - xiansi_info:'准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”;当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用了一张【杀】。', - chanhui:'谮毁', - chanhui_info:'出牌阶段限一次,当你使用【杀】或黑色普通锦囊牌指定唯一目标时,你可令可以成为此牌目标的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标。', - rechanhui:'谮毁', - rechanhui_info:'当你使用【杀】或普通锦囊牌指定唯一目标时,你可令可以成为此牌目标(无距离限制)的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标且你本回合内不能再次发动〖谮毁〗。', - jiaojin:'骄矜', - jiaojin_info:'当你受到男性角色造成的伤害时,你可以弃置一张装备牌,令此伤害-1。', - rejiaojin:'骄矜', - rejiaojin_info:'当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以弃置一张装备牌,令此牌对你无效并获得此牌对应的所有实体牌。若此牌的使用者为女性角色,则你令〖骄矜〗失效直到回合结束。', - shenxing:'慎行', - shenxing_info:'出牌阶段,你可以弃置两张牌,然后摸一张牌。', - bingyi:'秉壹', - bingyi_info:'结束阶段开始时,你可以展示所有手牌,若这些牌颜色均相同,则你令至多X名角色各摸一张牌(X为你的手牌数)。', - qiangzhi:'强识', - qiangzhi_draw:'强识', - qiangzhi_info:'出牌阶段开始时,你可以展示一名其他角色的一张手牌。若如此做,当你于此阶段内使用与此牌类别相同的牌时,你可以摸一张牌。', - xiantu:'献图', - xiantu2:'献图', - xiantu3:'献图', - xiantu_info:'一名其他角色的出牌阶段开始时,你可以摸两张牌,然后交给其两张牌。若如此做,此阶段结束时,若该角色未于此阶段内杀死过角色,则你失去1点体力。', - dingpin:'定品', - dingpin_info:'出牌阶段,你可以弃置一张手牌,然后令一名已受伤的角色判定,若结果为黑色,该角色摸X张牌(X为该角色已损失的体力值),然后你本回合不能再对其发动〖定品〗;若结果为红色,你翻面(你不能弃置本回合已弃置或使用过的类型的牌)。', - faen:'法恩', - faen_info:'当一名角色翻至正面或横置后,你可以令其摸一张牌。', - jyzongshi:'纵适', - jyzongshi_info:'当你拼点赢时,你可以获得对方此次拼点的牌;当你拼点没赢时,你可以收回你此次拼点的牌。', - qiaoshui:'巧说', - qiaoshui3:'巧说', - qiaoshui_info:'出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束。', - reqiaoshui:'巧说', - reqiaoshui_info:'出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你结束出牌阶段且本回合内锦囊牌不计入手牌上限。', - junxing:'峻刑', - junxing_info:'出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面再摸X张牌(X为你以此法弃置的手牌数量)。', - xinjunxing:'峻刑', - xinjunxing_info:'出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面,然后将手牌摸至四张。', + zzhenggong: "争功", + zzhenggong_info: "当你受到伤害后,你可以获得伤害来源装备区里的一张牌并置入你的装备区。", + zquanji: "权计", + zquanji_info: "其他角色的回合开始时,你可以与该角色拼点。若你赢,该角色跳过准备阶段和判定阶段。", + zbaijiang: "拜将", + zbaijiang_info: + "觉醒技。准备阶段,若你装备区里的牌数不少于两张,你加1点体力上限,失去〖权计〗和〖争功〗,获得〖野心〗和〖自立〗。", + zyexin: "野心", + zyexin2: "野心", + zyexin_info: + "①当你造成或受到伤害后,你可以将牌堆顶的一张牌置于你的武将牌上,称为“权”。②出牌阶段限一次。你可以用任意数量的手牌与等量的“权”交换。", + zzili: "自立", + zzili_info: "觉醒技。准备阶段,若你的“权”数不小于4,你减1点体力上限并获得〖排异〗。", + zpaiyi: "排异", + zpaiyi_info: + "结束阶段,你可以选择一张“权”,若此牌为:装备牌,你将此牌置入一名角色的装备区;延时类锦囊牌,你将此牌置入一名角色的判定区;基本牌或普通锦囊牌,你将此牌交给一名角色。然后若此牌的目标区域对应的角色不为你,你可以摸一张牌。", + shibei: "矢北", + shibei_info: + "锁定技,当你受到伤害后:若此伤害是你本回合第一次受到的伤害,则你回复1点体力;否则你失去1点体力。", + jianying: "渐营", + jianying_info: + "当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。", + xinenyuan: "恩怨", + xinenyuan1: "恩怨", + xinenyuan2: "恩怨", + xinenyuan_info: + "当你获得一名其他角色两张或更多的牌后,你可以令其摸一张牌;当你受到1点伤害后,你可以令伤害来源选择一项:1、将一张手牌交给你;2、失去1点体力。", + xinxuanhuo: "眩惑", + xinxuanhuo_info: + "摸牌阶段开始时,你可以改为令一名其他角色摸两张牌,然后该角色需对其攻击范围内你选择的另一名角色使用一张【杀】,否则你获得其两张牌。", + fuhun: "父魂", + fuhun2: "父魂", + fuhun_info: + "你可以将两张手牌当做【杀】使用或打出;当你于出牌阶段以此法使用的【杀】造成伤害后,你获得〖武圣〗和〖咆哮〗直到回合结束。", + yuce: "御策", + yuce_info: + "当你受到伤害后,你可以展示一张手牌,并令伤害来源选择一项:弃置一张与此牌类型不同的手牌,或令你回复1点体力。", + xiansi: "陷嗣", + xiansix: "陷嗣", + xiansi_bg: "逆", + xiansi2: "陷嗣", + xiansi_info: + "准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”;当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用了一张【杀】。", + chanhui: "谮毁", + chanhui_info: + "出牌阶段限一次,当你使用【杀】或黑色普通锦囊牌指定唯一目标时,你可令可以成为此牌目标的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标。", + rechanhui: "谮毁", + rechanhui_info: + "当你使用【杀】或普通锦囊牌指定唯一目标时,你可令可以成为此牌目标(无距离限制)的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标且你本回合内不能再次发动〖谮毁〗。", + jiaojin: "骄矜", + jiaojin_info: "当你受到男性角色造成的伤害时,你可以弃置一张装备牌,令此伤害-1。", + rejiaojin: "骄矜", + rejiaojin_info: + "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以弃置一张装备牌,令此牌对你无效并获得此牌对应的所有实体牌。若此牌的使用者为女性角色,则你令〖骄矜〗失效直到回合结束。", + shenxing: "慎行", + shenxing_info: "出牌阶段,你可以弃置两张牌,然后摸一张牌。", + bingyi: "秉壹", + bingyi_info: + "结束阶段开始时,你可以展示所有手牌,若这些牌颜色均相同,则你令至多X名角色各摸一张牌(X为你的手牌数)。", + qiangzhi: "强识", + qiangzhi_draw: "强识", + qiangzhi_info: + "出牌阶段开始时,你可以展示一名其他角色的一张手牌。若如此做,当你于此阶段内使用与此牌类别相同的牌时,你可以摸一张牌。", + xiantu: "献图", + xiantu2: "献图", + xiantu3: "献图", + xiantu_info: + "一名其他角色的出牌阶段开始时,你可以摸两张牌,然后交给其两张牌。若如此做,此阶段结束时,若该角色未于此阶段内杀死过角色,则你失去1点体力。", + dingpin: "定品", + dingpin_info: + "出牌阶段,你可以弃置一张手牌,然后令一名已受伤的角色判定,若结果为黑色,该角色摸X张牌(X为该角色已损失的体力值),然后你本回合不能再对其发动〖定品〗;若结果为红色,你翻面(你不能弃置本回合已弃置或使用过的类型的牌)。", + faen: "法恩", + faen_info: "当一名角色翻至正面或横置后,你可以令其摸一张牌。", + jyzongshi: "纵适", + jyzongshi_info: + "当你拼点赢时,你可以获得对方此次拼点的牌;当你拼点没赢时,你可以收回你此次拼点的牌。", + qiaoshui: "巧说", + qiaoshui3: "巧说", + qiaoshui_info: + "出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束。", + reqiaoshui: "巧说", + reqiaoshui_info: + "出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你结束出牌阶段且本回合内锦囊牌不计入手牌上限。", + junxing: "峻刑", + junxing_info: + "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面再摸X张牌(X为你以此法弃置的手牌数量)。", + xinjunxing: "峻刑", + xinjunxing_info: + "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面,然后将手牌摸至四张。", - xswuyan:'无言', - xinwuyan:'无言', - jujian:'举荐', - xinjujian:'举荐', - luoying:'落英', - luoying_discard:'落英', - luoying_judge:'落英', - luoying_judge_noconf:'落英·判定', - jiushi:'酒诗', - jiushi1:'酒诗', - jiushi2:'酒诗', - jiushi3:'酒诗', - jueqing:'绝情', - shangshi:'伤逝', - xuanfeng:'旋风', - zhiyu:'智愚', - qice:'奇策', - qice_backup:'奇策', - jiangchi:'将驰', - jiangchi_less:'少摸一张', - jiangchi_more:'多摸一张', - zishou:'自守', - zongshi:'宗室', - danshou:'胆守', - olddanshou:'胆守', - xindanshou:'胆守', - yizhong:'毅重', - xinzhan:'心战', - xinzhan_gain:'获得', - xinzhan_place:'牌堆顶', - huilei:'挥泪', - enyuan:'恩怨', - enyuan1:'恩怨', - enyuan2:'恩怨', - xuanhuo:'眩惑', - ganlu:'甘露', - buyi:'补益', - mingce:'明策', - zhichi:'智迟', - zhichi2:'智迟', - pojun:'破军', - jingce:'精策', - xinjingce:'精策', - chengxiang:'称象', - oldchengxiang:'称象', - renxin:'仁心', - oldrenxin:'仁心', - zhenlie:'贞烈', - miji:'秘计', - miji_tag:'已分配', - zhiyan:'直言', - zongxuan:'纵玄', - anxu:'安恤', - old_anxu:'安恤', - zhuiyi:'追忆', - gongji:'弓骑', - qiuyuan:'求援', - oldqiuyuan:'求援', - zhuikong:'惴恐', - oldzhuikong:'惴恐', - qieting:'窃听', - xianzhou:'献州', - quanji:'权计', - zili:'自立', - paiyi:'排异', - paiyi_backup:'排异', - sanyao:'散谣', - olsanyao:'散谣', - olsanyao_backup:'散谣', - zhiman:'制蛮', - resanyao:'散谣', - rezhiman:'制蛮', - qianxi:'潜袭', - qianxi2:'潜袭', - qianxi2_bg:'袭', - fuli:'伏枥', - xinfuli:'伏枥', - jiefan:'解烦', - juece:'绝策', - mieji:'灭计', - fencheng:'焚城', - youdi:'诱敌', - youdi_info:'结束阶段开始时,你可以令一名其他角色弃置你的一张牌,若此牌不为【杀】,你获得该角色的一张牌。', - fencheng_info:'限定技。出牌阶段,你可令所有其他角色依次选择一项:弃置X张牌;或受到1点火焰伤害。(X为该角色装备区里牌的数量且至少为1)', - mieji_info:'当你使用黑色普通锦囊牌选择目标后,若目标数为1,则你可以额外指定一个目标。', - juece_info:'当其他角色在你回合内失去最后的手牌后,你可以对其造成1点伤害。', - jiefan_info:'限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。', - fuli_info:'限定技,当你处于濒死状态时,你可以将体力回复至与场上势力数相同,然后翻面。', - xinfuli_info:'限定技,当你处于濒死状态时,可以将体力回复至X点并将手牌摸至X张(X为场上势力数)。若X大于2,你翻面。', - qianxi_info:'准备阶段,你可以摸一张牌,并弃置一张牌,然后令一名距离为1的角色不能使用或打出与你弃置的牌颜色相同的手牌直到回合结束。', - zhiman_info:'当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其装备区或判定区的一张牌。', - sanyao_info:'出牌阶段限一次,你可以弃置一张牌并指定一名体力值最多(或之一)的角色,你对其造成1点伤害。', - olsanyao_info:'出牌阶段每项各限一次,你可以弃置一张牌并指定一名体力值或手牌数最多(或之一)的角色,并对其造成1点伤害。', - rezhiman_info:'当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其区域内的一张牌。', - resanyao_info:'出牌阶段限一次,你可以弃置任意张牌并指定等量除你外体力值最多(或之一)的其他角色。你对这些角色依次造成1点伤害。', - paiyi_info:'出牌阶段限一次,你可以移去一张“权”并选择一名角色,令其摸两张牌,然后若其手牌数大于你,你对其造成1点伤害。', - zili_info:'觉醒技,准备阶段开始时,若“权”的数量不小于3,你减1点体力上限,然后选择一项:1、回复1点体力;2、摸两张牌。然后你获得技能“排异”。', - quanji_info:'当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。', - xianzhou_info:'限定技。出牌阶段,你可以将装备区内的所有牌交给一名其他角色,然后该角色选择一项:令你回复X点体力;或对其攻击范围内的X名角色各造成1点伤害(X为你以此法交给该角色的牌的数量)。', - qieting_info:'其他角色的回合结束时,若其未于此回合内使用过指定其他角色为目标的牌,你可以选择一项:将其装备区里的一张牌移动至你装备区里的相应位置;或摸一张牌。', - zhuikong_info:'其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色本回合使用的牌不能指定除该角色外的角色为目标。若你没赢,其本回合至你的距离视为1。', - oldzhuikong_info:'其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色跳过本回合的出牌阶段。若你没赢,其本回合至你的距离视为1。', - qiuyuan_info:'当你成为【杀】的目标时,你可以令一名其他角色选择一项:①、交给你一张【闪】;②、成为此【杀】的额外目标。', - oldqiuyuan_info:'当你成为【杀】的目标时,你可以令一名有手牌的其他角色正面朝上交给你一张牌。若此牌不为【闪】,则该角色也成为此【杀】的额外目标。', - gongji_info:'出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。', - zhuiyi_info:'当你死亡时,你可以令一名其他角色(杀死你的角色除外)摸三张牌,然后其回复1点体力。', - anxu_info:'出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌多的角色将一张手牌交给手牌少的角色,然后若这两名角色手牌数相等,你摸一张牌或回复1点体力。', - old_anxu_info:'出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌。', - zongxuan_info:'当你的牌因弃置而进入弃牌堆后,你可以将其按任意顺序置于牌堆顶。', - zhiyan_info:'结束阶段,你可以令一名角色摸一张牌并展示之,若为装备牌,其使用此牌并回复1点体力。', - miji_info:'结束阶段,若你已受伤,则可以摸X张牌,然后可以将等量的牌交给其他角色(X为你已损失的体力值)。', - zhenlie_info:'当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后弃置对方一张牌。', - chengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。', - oldchengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于12的牌。', - renxin_info:'当体力值为1的一名其他角色受到伤害时,你可以将武将牌翻面并弃置一张装备牌,然后防止此伤害。', - oldrenxin_info:'其他角色进入濒死状态时,你可以将所有手牌交给该角色并翻面,然后该角色回复1点体力。', - jingce_info:'出牌阶段结束时,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。', - xinjingce_info:'结束阶段,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。', - xswuyan_info:'锁定技,你使用的普通锦囊牌对其他角色无效;其他角色使用的普通锦囊牌对你无效。', - xinwuyan_info:'锁定技,当你使用锦囊牌造成伤害时,你防止此伤害;锁定技,当你受到锦囊牌对你造成的伤害时,你防止此伤害。', - jujian_info:'出牌阶段限一次,你可以弃至多三张牌,然后令一名其他角色摸等量的牌。若你以此法弃牌不少于三张且均为同一类别,你回复1点体力。', - xinjujian_info:'结束阶段开始时,你可以弃置一张非基本牌并选择一名其他角色,令其选择一项:1.摸两张牌;2.回复1点体力;3.将其武将牌翻转至正面朝上并重置之。', - luoying_info:'当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。', - jiushi_info:'当你需要使用一张【酒】时,若你的武将牌正面朝上,则你可以将武将牌翻面并视为使用了一张【酒】;当你受到伤害时,若你的武将牌背面朝上,则你可在此伤害结算后将武将牌翻回正面。', - jueqing_info:'锁定技,你即将造成的伤害均视为失去体力。', - shangshi_info:'当你的手牌数小于X时,你可以将手牌摸至X张(X为你已损失的体力值)。', - xuanfeng_info:'当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌。', - zhiyu_info:'当你受到伤害后,你可以摸一张牌,然后展示所有手牌。若颜色均相同,你令伤害来源弃置一张手牌。', - qice_info:'出牌阶段限一次,你可以将所有的手牌(至少一张)当做任意一张普通锦囊牌使用。', - jiangchi_info:'摸牌阶段摸牌时,你可以选择一项:1、额外摸一张牌,若如此做,你不能使用或打出【杀】直到回合结束。 2、少摸一张牌,若如此做,你使用【杀】无距离限制且可以多使用一张【杀】直到回合结束。', - zishou_info:'摸牌阶段,你可以额外摸X张牌(X为场上势力数)。然后你于本回合的出牌阶段内使用的牌不能指定其他角色为目标。', - zongshi_info:'锁定技,你的手牌上限+X(X为场上现存势力数)。', - danshou_info:'出牌阶段,你可以选择你攻击范围内的一名其他角色,然后弃置X张牌(X为此前你于此阶段你发动“胆守”的次数+1)。若X:为1,你弃置该角色的一张牌;为2,令该角色交给你一张牌;为3,你对该角色造成1点伤害;不小于4,你与该角色各摸两张牌。', - olddanshou_info:'当你造成伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。', - xindanshou_info:'①每回合限一次,当你成为基本牌或锦囊牌的目标后,你可以摸X张牌(X为你本回合内成为过基本牌或锦囊牌的目标的次数)。②一名其他角色的结束阶段,若你本回合内没有发动过〖胆守①〗,则你可以弃置X张牌并对其造成1点伤害(X为其手牌数,无牌则不弃)。', - yizhong_info:'锁定技,当你的防具栏为空时,黑色的【杀】对你无效。', - xinzhan_info:'出牌阶段限一次,若你的手牌数大于你的体力上限,你可以观看牌堆顶的三张牌,然后展示其中任意红桃牌并获得之。', - huilei_info:'锁定技,当你死亡时,杀死你的角色弃置所有的牌。', - enyuan_info:'锁定技。①当其他角色令你回复1点体力后,该角色摸一张牌。②当其他角色对你造成伤害后,其须交给你一张♥手牌,否则失去1点体力。', - xuanhuo_info:'出牌阶段限一次,你可以将一张红桃手牌交给一名其他角色,获得该角色的一张牌,然后交给除该角色外的一名其他角色。', - ganlu_info:'出牌阶段限一次,你可以选择两名装备区内装备数之差不大于X的角色,令其交换装备区内的牌(X为你已损失的体力值)。', - buyi_info:'当有角色进入濒死状态时,你可以展示该角色的一张手牌:若此牌不为基本牌,则该角色弃置此牌并回复1点体力。', - mingce_info:'出牌阶段,你可以交给一名其他角色一张装备牌或【杀】,然后令该角色选择一项:1. 视为对其攻击范围内的另一名由你指定的角色使用一张【杀】。2. 摸一张牌。每回合限一次。', - zhichi_info:'锁定技,当你于回合外受到伤害后,所有【杀】或普通锦囊牌对你无效直到回合结束。', - zhichi2_info:'智迟已发动', - pojun_info:'当你使用【杀】造成伤害后,你可以令受伤角色摸X张牌,然后其翻面(X为该角色的体力值且至多为5)。', - shiyong:'恃勇', - shiyong_info:'锁定技,当你受到一次红色【杀】或【酒】【杀】造成的伤害后,须减1点体力上限。', - old_guanzhang:'旧关兴张苞', - old_guanzhang_prefix:'旧', - wangyi:'王异', - oldqianxi:'潜袭', - oldqianxi_info:'当你使用【杀】对距离为1的目标角色造成伤害时,你可以进行一次判定,若判定结果不为红桃,你防止此伤害,令其减1点体力上限。', - oldzhenlie:'贞烈', - oldzhenlie_info:'在你的判定牌生效前,你可以亮出牌堆顶的一张牌代替之。', - oldmiji:'秘计', - oldmiji_info:'准备/结束阶段开始时,若你已受伤,你可以判定,若判定结果为黑色,你观看牌堆顶的X张牌(X为你已损失的体力值),然后将这些牌交给一名角色。', - old_fuhun:'父魂', - old_fuhun_info:'摸牌阶段开始时,你可以放弃摸牌,改为从牌堆顶亮出两张牌并获得之,若亮出的牌颜色不同,你获得〖武圣〗和〖咆哮〗直到回合结束。', - rejueqing:'绝情', - rejueqing_info:'当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力并修改〖绝情〗(X为伤害值)。', - rejueqing_1st:'绝情', - rejueqing_rewrite:'绝情·改', - rejueqing_rewrite_info:'锁定技,你即将造成的伤害均视为失去体力。', - reshangshi:'伤逝', - reshangshi_2nd:'伤逝', - reshangshi_info:'当你受到伤害时,你可以弃置一张牌。当你的手牌数小于X时,你可以将手牌摸至X张。(X为你已损失的体力值)', - rejingce:'精策', - rejingce2:'精策', - rejingce_add:'精策', - rejingce_info:'当你于一回合内首次使用某种花色的手牌时,你的手牌上限+1。出牌阶段结束时,你可以摸X张牌(X为你本阶段内使用过的牌的类型数)。', - xinkuangbi:'匡弼', - xinkuangbi_info:'出牌阶段限一次。你可以令一名其他角色交给你至多三张牌(不计入你本回合的手牌上限)。然后其于其的下回合开始时摸等量的牌。', - xinzhaofu:'诏缚', - xinzhaofu_info:'主公技,限定技。出牌阶段,你可选择至多两名其他角色。这两名角色视为在所有其他吴势力角色的攻击范围内。', - olbingyi:'秉壹', - olbingyi_info:'每阶段限一次。当你因弃置而失去牌后,你可以展示所有手牌。若这些牌的颜色均相同,则你可以与至多X名其他角色各摸一张牌(X为你的手牌数)。', - lukai:'陆凯', - lukai_spade:'♠', - lukai_spade_bg:'♠️', - lukai_heart:'♥', - lukai_heart_bg:'♥️', - lukai_club:'♣', - lukai_club_bg:'♣', - lukai_diamond:'♦', - lukai_diamond_bg:'♦️️', - lkbushi:'卜筮', - lkbushi_info:'①你使用♠牌无次数限制。②当你使用或打出♥牌后,你摸一张牌。③当你成为♣牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张♦牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。', - lkzhongzhuang:'忠壮', - lkzhongzhuang_info:'锁定技。①当你因执行【杀】的效果而造成伤害时,若你的攻击范围大于3,则此伤害+1。②当一名角色受到你因执行【杀】的效果而造成的伤害时,若你的攻击范围小于3,则此伤害改为1。', - kebineng:'轲比能', - kousheng:'寇旌', - kousheng_info:'①出牌阶段开始时,你可以选择任意张手牌,这些牌称为“寇旌”直到回合结束。②你的“寇旌”均视为【杀】且无次数限制。③当你因执行对应实体牌包含“寇旌”的【杀】的效果而造成伤害后,你展示所有“寇旌”牌,然后目标角色可以用所有手牌交换这些牌。', - zhugeshang:'诸葛尚', - sangu:'三顾', - sangu_info:'结束阶段,你可以选择至多三个{【杀】或不为notarget或singleCard的普通锦囊牌}中的牌名,然后令一名其他角色记录这些牌名。该角色的下个出牌阶段开始时,其的手牌于其需要使用牌时均视为其记录中的第一张牌直到此阶段结束,且当其使用或打出有对应实体牌的牌时,移除这些牌中的第一张牌。若你以此法选择过的牌名均为你本回合内使用过的牌名,则防止你因其以此法使用牌造成的伤害。', - yizu:'轶祖', - yizu_info:'锁定技。每回合限一次,当你成为【杀】或【决斗】的目标后,若你的体力值不大于使用者的体力值,则你回复1点体力。', - liwan:'李婉', - liandui:'联对', - liandui_info:'①当你使用牌时,若本局游戏内上一张被使用的牌的使用者不为你,你可以令其摸两张牌。②其他角色使用牌时,若本局游戏内上一张被使用的牌的使用者为你,其可以令你摸两张牌。', - biejun:'别君', - biejun_info:'①其他角色的出牌阶段限一次。其可以将一张手牌交给你。②每回合限一次。当你受到伤害时,若你手牌中没有本回合因〖别君①〗得到的牌,你可以翻面并防止此伤害。', - yj_sufei:'苏飞', - shuojian:'数谏', - shuojian_info:'出牌阶段限三次。你可以交给一名其他角色一张牌,其选择一项:1.令你摸X张牌并弃置X-1张牌;2.视为使用X张【过河拆桥】,然后此技能本回合失效(X为此技能本阶段剩余发动次数+1)。', - yj_qiaozhou:'谯周', - shiming:'识命', - shiming_info:'每轮限一次。一名角色的摸牌阶段,你可以观看牌堆顶的三张牌,并可以将其中一张置于牌堆底。然后该角色可以改为对自己造成1点伤害,然后从牌堆底摸三张牌。', - jiangxi:'将息', - jiangxi_info:'一名角色的回合结束时,若一号位于此回合内进入过濒死状态或未受到过伤害,你可以重置〖识命〗并摸一张牌;若所有角色均未受到过伤害,你可以与当前回合角色各摸一张牌。', - hanlong:'韩龙', - duwang:'独往', - duwang_info:'锁定技。①游戏开始时,你从牌堆顶将五张不为【杀】的牌置于武将牌上,称为“刺”。②若你有牌名不为【杀】“刺”,你至其他角色或其他角色至你的距离+1。', - cibei:'刺北', - cibei_info:'①当一名角色使用【杀】造成伤害且此牌对应的实体牌进入弃牌堆后,你可以将一张不为【杀】的“刺”置入弃牌堆,并将这些牌置入“刺”,然后弃置一名角色区域里的一张牌。②一名角色的回合结束时,若你的“刺”均为【杀】,你获得所有“刺”,且这些牌不能被弃置,不计入手牌上限,且当你使用对应实体牌包含这些牌的牌时无次数和距离限制。', - wuanguo:'武安国', - diezhang:'叠嶂', - diezhang_info:'转换技。①出牌阶段,你使用杀的次数上限+1。②阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用X张【杀】;阳:当其他角色使用牌被你抵消后,你可以摸X张牌,视为对其使用一张【杀】(X为1)。', - duanwan:'断腕', - duanwan_info:'限定技。当你处于濒死状态时,你可以将体力回复至2点,然后删除〖叠嶂①〗和当前转换技状态的〖叠嶂②〗分支,并将〖叠嶂〗修改为“每回合限一次”且将X修改为2。', - dcduliang:'督粮', - dcduliang2:'督粮', - dcduliang_info:'出牌阶段限一次。你可以获得一名其他角色的一张牌,然后选择一项:1.你观看牌堆顶的两张牌,然后令其获得其中的一或两张基本牌;2.令其于下回合的摸牌阶段额外摸一张牌。', - sunli:'孙礼', - kangli:'伉厉', - kangli_info:'当你造成或受到伤害后,你摸两张牌。然后你下次造成伤害时弃置这些牌。', - xiahoumao:'夏侯楙', - tongwei:'统围', - tongwei_info:'出牌阶段限一次。你可以重铸两张牌并指定一名其他角色,当其使用的下一张牌结算结束后,若此牌点数在你上次以此法重铸的牌的点数之间,你视为对其使用一张【杀】或【过河拆桥】。', - cuguo:'蹙国', - cuguo_info:'锁定技。当你于一回合使用牌首次被抵消后,你弃置一张牌,视为对此牌的目标角色使用一张该被抵消的牌。此牌结算结束后,若此牌被抵消,你失去1点体力。', - chenshi:'陈式', - qingbei:'擎北', - qingbei_info:'一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用一张有花色的牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。', - feiyao:'费曜', - zhenfeng:'镇锋', - zhenfeng_info:'每回合限一次。当其他角色于其回合内使用牌时,若其手牌数不大于其体力值,你可以猜测其手牌中与此牌类别相同的牌数。若你猜对,你摸X张牌并视为对其使用一张【杀】(X为你连续猜对的次数且至多为5);若你猜错且差值大于1,其视为对你使用一张【杀】。', + xswuyan: "无言", + xinwuyan: "无言", + jujian: "举荐", + xinjujian: "举荐", + luoying: "落英", + luoying_discard: "落英", + luoying_judge: "落英", + luoying_judge_noconf: "落英·判定", + jiushi: "酒诗", + jiushi1: "酒诗", + jiushi2: "酒诗", + jiushi3: "酒诗", + jueqing: "绝情", + shangshi: "伤逝", + xuanfeng: "旋风", + zhiyu: "智愚", + qice: "奇策", + qice_backup: "奇策", + jiangchi: "将驰", + jiangchi_less: "少摸一张", + jiangchi_more: "多摸一张", + zishou: "自守", + zongshi: "宗室", + danshou: "胆守", + olddanshou: "胆守", + xindanshou: "胆守", + yizhong: "毅重", + xinzhan: "心战", + xinzhan_gain: "获得", + xinzhan_place: "牌堆顶", + huilei: "挥泪", + enyuan: "恩怨", + enyuan1: "恩怨", + enyuan2: "恩怨", + xuanhuo: "眩惑", + ganlu: "甘露", + buyi: "补益", + mingce: "明策", + zhichi: "智迟", + zhichi2: "智迟", + pojun: "破军", + jingce: "精策", + xinjingce: "精策", + chengxiang: "称象", + oldchengxiang: "称象", + renxin: "仁心", + oldrenxin: "仁心", + zhenlie: "贞烈", + miji: "秘计", + miji_tag: "已分配", + zhiyan: "直言", + zongxuan: "纵玄", + anxu: "安恤", + old_anxu: "安恤", + zhuiyi: "追忆", + gongji: "弓骑", + qiuyuan: "求援", + oldqiuyuan: "求援", + zhuikong: "惴恐", + oldzhuikong: "惴恐", + qieting: "窃听", + xianzhou: "献州", + quanji: "权计", + zili: "自立", + paiyi: "排异", + paiyi_backup: "排异", + sanyao: "散谣", + olsanyao: "散谣", + olsanyao_backup: "散谣", + zhiman: "制蛮", + resanyao: "散谣", + rezhiman: "制蛮", + qianxi: "潜袭", + qianxi2: "潜袭", + qianxi2_bg: "袭", + fuli: "伏枥", + xinfuli: "伏枥", + jiefan: "解烦", + juece: "绝策", + mieji: "灭计", + fencheng: "焚城", + youdi: "诱敌", + youdi_info: + "结束阶段开始时,你可以令一名其他角色弃置你的一张牌,若此牌不为【杀】,你获得该角色的一张牌。", + fencheng_info: + "限定技。出牌阶段,你可令所有其他角色依次选择一项:弃置X张牌;或受到1点火焰伤害。(X为该角色装备区里牌的数量且至少为1)", + mieji_info: "当你使用黑色普通锦囊牌选择目标后,若目标数为1,则你可以额外指定一个目标。", + juece_info: "当其他角色在你回合内失去最后的手牌后,你可以对其造成1点伤害。", + jiefan_info: + "限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。", + fuli_info: "限定技,当你处于濒死状态时,你可以将体力回复至与场上势力数相同,然后翻面。", + xinfuli_info: + "限定技,当你处于濒死状态时,可以将体力回复至X点并将手牌摸至X张(X为场上势力数)。若X大于2,你翻面。", + qianxi_info: + "准备阶段,你可以摸一张牌,并弃置一张牌,然后令一名距离为1的角色不能使用或打出与你弃置的牌颜色相同的手牌直到回合结束。", + zhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其装备区或判定区的一张牌。", + sanyao_info: + "出牌阶段限一次,你可以弃置一张牌并指定一名体力值最多(或之一)的角色,你对其造成1点伤害。", + olsanyao_info: + "出牌阶段每项各限一次,你可以弃置一张牌并指定一名体力值或手牌数最多(或之一)的角色,并对其造成1点伤害。", + rezhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其区域内的一张牌。", + resanyao_info: + "出牌阶段限一次,你可以弃置任意张牌并指定等量除你外体力值最多(或之一)的其他角色。你对这些角色依次造成1点伤害。", + paiyi_info: + "出牌阶段限一次,你可以移去一张“权”并选择一名角色,令其摸两张牌,然后若其手牌数大于你,你对其造成1点伤害。", + zili_info: + "觉醒技,准备阶段开始时,若“权”的数量不小于3,你减1点体力上限,然后选择一项:1、回复1点体力;2、摸两张牌。然后你获得技能“排异”。", + quanji_info: + "当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。", + xianzhou_info: + "限定技。出牌阶段,你可以将装备区内的所有牌交给一名其他角色,然后该角色选择一项:令你回复X点体力;或对其攻击范围内的X名角色各造成1点伤害(X为你以此法交给该角色的牌的数量)。", + qieting_info: + "其他角色的回合结束时,若其未于此回合内使用过指定其他角色为目标的牌,你可以选择一项:将其装备区里的一张牌移动至你装备区里的相应位置;或摸一张牌。", + zhuikong_info: + "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色本回合使用的牌不能指定除该角色外的角色为目标。若你没赢,其本回合至你的距离视为1。", + oldzhuikong_info: + "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色跳过本回合的出牌阶段。若你没赢,其本回合至你的距离视为1。", + qiuyuan_info: + "当你成为【杀】的目标时,你可以令一名其他角色选择一项:①、交给你一张【闪】;②、成为此【杀】的额外目标。", + oldqiuyuan_info: + "当你成为【杀】的目标时,你可以令一名有手牌的其他角色正面朝上交给你一张牌。若此牌不为【闪】,则该角色也成为此【杀】的额外目标。", + gongji_info: + "出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。", + zhuiyi_info: "当你死亡时,你可以令一名其他角色(杀死你的角色除外)摸三张牌,然后其回复1点体力。", + anxu_info: + "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌多的角色将一张手牌交给手牌少的角色,然后若这两名角色手牌数相等,你摸一张牌或回复1点体力。", + old_anxu_info: + "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌。", + zongxuan_info: "当你的牌因弃置而进入弃牌堆后,你可以将其按任意顺序置于牌堆顶。", + zhiyan_info: "结束阶段,你可以令一名角色摸一张牌并展示之,若为装备牌,其使用此牌并回复1点体力。", + miji_info: + "结束阶段,若你已受伤,则可以摸X张牌,然后可以将等量的牌交给其他角色(X为你已损失的体力值)。", + zhenlie_info: + "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后弃置对方一张牌。", + chengxiang_info: + "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。", + oldchengxiang_info: + "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于12的牌。", + renxin_info: + "当体力值为1的一名其他角色受到伤害时,你可以将武将牌翻面并弃置一张装备牌,然后防止此伤害。", + oldrenxin_info: + "其他角色进入濒死状态时,你可以将所有手牌交给该角色并翻面,然后该角色回复1点体力。", + jingce_info: "出牌阶段结束时,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。", + xinjingce_info: "结束阶段,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。", + xswuyan_info: "锁定技,你使用的普通锦囊牌对其他角色无效;其他角色使用的普通锦囊牌对你无效。", + xinwuyan_info: + "锁定技,当你使用锦囊牌造成伤害时,你防止此伤害;锁定技,当你受到锦囊牌对你造成的伤害时,你防止此伤害。", + jujian_info: + "出牌阶段限一次,你可以弃至多三张牌,然后令一名其他角色摸等量的牌。若你以此法弃牌不少于三张且均为同一类别,你回复1点体力。", + xinjujian_info: + "结束阶段开始时,你可以弃置一张非基本牌并选择一名其他角色,令其选择一项:1.摸两张牌;2.回复1点体力;3.将其武将牌翻转至正面朝上并重置之。", + luoying_info: "当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。", + jiushi_info: + "当你需要使用一张【酒】时,若你的武将牌正面朝上,则你可以将武将牌翻面并视为使用了一张【酒】;当你受到伤害时,若你的武将牌背面朝上,则你可在此伤害结算后将武将牌翻回正面。", + jueqing_info: "锁定技,你即将造成的伤害均视为失去体力。", + shangshi_info: "当你的手牌数小于X时,你可以将手牌摸至X张(X为你已损失的体力值)。", + xuanfeng_info: + "当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌。", + zhiyu_info: + "当你受到伤害后,你可以摸一张牌,然后展示所有手牌。若颜色均相同,你令伤害来源弃置一张手牌。", + qice_info: "出牌阶段限一次,你可以将所有的手牌(至少一张)当做任意一张普通锦囊牌使用。", + jiangchi_info: + "摸牌阶段摸牌时,你可以选择一项:1、额外摸一张牌,若如此做,你不能使用或打出【杀】直到回合结束。 2、少摸一张牌,若如此做,你使用【杀】无距离限制且可以多使用一张【杀】直到回合结束。", + zishou_info: + "摸牌阶段,你可以额外摸X张牌(X为场上势力数)。然后你于本回合的出牌阶段内使用的牌不能指定其他角色为目标。", + zongshi_info: "锁定技,你的手牌上限+X(X为场上现存势力数)。", + danshou_info: + "出牌阶段,你可以选择你攻击范围内的一名其他角色,然后弃置X张牌(X为此前你于此阶段你发动“胆守”的次数+1)。若X:为1,你弃置该角色的一张牌;为2,令该角色交给你一张牌;为3,你对该角色造成1点伤害;不小于4,你与该角色各摸两张牌。", + olddanshou_info: "当你造成伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。", + xindanshou_info: + "①每回合限一次,当你成为基本牌或锦囊牌的目标后,你可以摸X张牌(X为你本回合内成为过基本牌或锦囊牌的目标的次数)。②一名其他角色的结束阶段,若你本回合内没有发动过〖胆守①〗,则你可以弃置X张牌并对其造成1点伤害(X为其手牌数,无牌则不弃)。", + yizhong_info: "锁定技,当你的防具栏为空时,黑色的【杀】对你无效。", + xinzhan_info: + "出牌阶段限一次,若你的手牌数大于你的体力上限,你可以观看牌堆顶的三张牌,然后展示其中任意红桃牌并获得之。", + huilei_info: "锁定技,当你死亡时,杀死你的角色弃置所有的牌。", + enyuan_info: + "锁定技。①当其他角色令你回复1点体力后,该角色摸一张牌。②当其他角色对你造成伤害后,其须交给你一张♥手牌,否则失去1点体力。", + xuanhuo_info: + "出牌阶段限一次,你可以将一张红桃手牌交给一名其他角色,获得该角色的一张牌,然后交给除该角色外的一名其他角色。", + ganlu_info: + "出牌阶段限一次,你可以选择两名装备区内装备数之差不大于X的角色,令其交换装备区内的牌(X为你已损失的体力值)。", + buyi_info: + "当有角色进入濒死状态时,你可以展示该角色的一张手牌:若此牌不为基本牌,则该角色弃置此牌并回复1点体力。", + mingce_info: + "出牌阶段,你可以交给一名其他角色一张装备牌或【杀】,然后令该角色选择一项:1. 视为对其攻击范围内的另一名由你指定的角色使用一张【杀】。2. 摸一张牌。每回合限一次。", + zhichi_info: "锁定技,当你于回合外受到伤害后,所有【杀】或普通锦囊牌对你无效直到回合结束。", + zhichi2_info: "智迟已发动", + pojun_info: + "当你使用【杀】造成伤害后,你可以令受伤角色摸X张牌,然后其翻面(X为该角色的体力值且至多为5)。", + shiyong: "恃勇", + shiyong_info: "锁定技,当你受到一次红色【杀】或【酒】【杀】造成的伤害后,须减1点体力上限。", + old_guanzhang: "旧关兴张苞", + old_guanzhang_prefix: "旧", + wangyi: "王异", + oldqianxi: "潜袭", + oldqianxi_info: + "当你使用【杀】对距离为1的目标角色造成伤害时,你可以进行一次判定,若判定结果不为红桃,你防止此伤害,令其减1点体力上限。", + oldzhenlie: "贞烈", + oldzhenlie_info: "在你的判定牌生效前,你可以亮出牌堆顶的一张牌代替之。", + oldmiji: "秘计", + oldmiji_info: + "准备/结束阶段开始时,若你已受伤,你可以判定,若判定结果为黑色,你观看牌堆顶的X张牌(X为你已损失的体力值),然后将这些牌交给一名角色。", + old_fuhun: "父魂", + old_fuhun_info: + "摸牌阶段开始时,你可以放弃摸牌,改为从牌堆顶亮出两张牌并获得之,若亮出的牌颜色不同,你获得〖武圣〗和〖咆哮〗直到回合结束。", + rejueqing: "绝情", + rejueqing_info: + "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力并修改〖绝情〗(X为伤害值)。", + rejueqing_1st: "绝情", + rejueqing_rewrite: "绝情·改", + rejueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。", + reshangshi: "伤逝", + reshangshi_2nd: "伤逝", + reshangshi_info: + "当你受到伤害时,你可以弃置一张牌。当你的手牌数小于X时,你可以将手牌摸至X张。(X为你已损失的体力值)", + rejingce: "精策", + rejingce2: "精策", + rejingce_add: "精策", + rejingce_info: + "当你于一回合内首次使用某种花色的手牌时,你的手牌上限+1。出牌阶段结束时,你可以摸X张牌(X为你本阶段内使用过的牌的类型数)。", + xinkuangbi: "匡弼", + xinkuangbi_info: + "出牌阶段限一次。你可以令一名其他角色交给你至多三张牌(不计入你本回合的手牌上限)。然后其于其的下回合开始时摸等量的牌。", + xinzhaofu: "诏缚", + xinzhaofu_info: + "主公技,限定技。出牌阶段,你可选择至多两名其他角色。这两名角色视为在所有其他吴势力角色的攻击范围内。", + olbingyi: "秉壹", + olbingyi_info: + "每阶段限一次。当你因弃置而失去牌后,你可以展示所有手牌。若这些牌的颜色均相同,则你可以与至多X名其他角色各摸一张牌(X为你的手牌数)。", + lukai: "陆凯", + lukai_spade: "♠", + lukai_spade_bg: "♠️", + lukai_heart: "♥", + lukai_heart_bg: "♥️", + lukai_club: "♣", + lukai_club_bg: "♣", + lukai_diamond: "♦", + lukai_diamond_bg: "♦️️", + lkbushi: "卜筮", + lkbushi_info: + "①你使用♠牌无次数限制。②当你使用或打出♥牌后,你摸一张牌。③当你成为♣牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张♦牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。", + lkzhongzhuang: "忠壮", + lkzhongzhuang_info: + "锁定技。①当你因执行【杀】的效果而造成伤害时,若你的攻击范围大于3,则此伤害+1。②当一名角色受到你因执行【杀】的效果而造成的伤害时,若你的攻击范围小于3,则此伤害改为1。", + kebineng: "轲比能", + kousheng: "寇旌", + kousheng_info: + "①出牌阶段开始时,你可以选择任意张手牌,这些牌称为“寇旌”直到回合结束。②你的“寇旌”均视为【杀】且无次数限制。③当你因执行对应实体牌包含“寇旌”的【杀】的效果而造成伤害后,你展示所有“寇旌”牌,然后目标角色可以用所有手牌交换这些牌。", + zhugeshang: "诸葛尚", + sangu: "三顾", + sangu_info: + "结束阶段,你可以选择至多三个{【杀】或不为notarget或singleCard的普通锦囊牌}中的牌名,然后令一名其他角色记录这些牌名。该角色的下个出牌阶段开始时,其的手牌于其需要使用牌时均视为其记录中的第一张牌直到此阶段结束,且当其使用或打出有对应实体牌的牌时,移除这些牌中的第一张牌。若你以此法选择过的牌名均为你本回合内使用过的牌名,则防止你因其以此法使用牌造成的伤害。", + yizu: "轶祖", + yizu_info: + "锁定技。每回合限一次,当你成为【杀】或【决斗】的目标后,若你的体力值不大于使用者的体力值,则你回复1点体力。", + liwan: "李婉", + liandui: "联对", + liandui_info: + "①当你使用牌时,若本局游戏内上一张被使用的牌的使用者不为你,你可以令其摸两张牌。②其他角色使用牌时,若本局游戏内上一张被使用的牌的使用者为你,其可以令你摸两张牌。", + biejun: "别君", + biejun_info: + "①其他角色的出牌阶段限一次。其可以将一张手牌交给你。②每回合限一次。当你受到伤害时,若你手牌中没有本回合因〖别君①〗得到的牌,你可以翻面并防止此伤害。", + yj_sufei: "苏飞", + shuojian: "数谏", + shuojian_info: + "出牌阶段限三次。你可以交给一名其他角色一张牌,其选择一项:1.令你摸X张牌并弃置X-1张牌;2.视为使用X张【过河拆桥】,然后此技能本回合失效(X为此技能本阶段剩余发动次数+1)。", + yj_qiaozhou: "谯周", + shiming: "识命", + shiming_info: + "每轮限一次。一名角色的摸牌阶段,你可以观看牌堆顶的三张牌,并可以将其中一张置于牌堆底。然后该角色可以改为对自己造成1点伤害,然后从牌堆底摸三张牌。", + jiangxi: "将息", + jiangxi_info: + "一名角色的回合结束时,若一号位于此回合内进入过濒死状态或未受到过伤害,你可以重置〖识命〗并摸一张牌;若所有角色均未受到过伤害,你可以与当前回合角色各摸一张牌。", + hanlong: "韩龙", + duwang: "独往", + duwang_info: + "锁定技。①游戏开始时,你从牌堆顶将五张不为【杀】的牌置于武将牌上,称为“刺”。②若你有牌名不为【杀】“刺”,你至其他角色或其他角色至你的距离+1。", + cibei: "刺北", + cibei_info: + "①当一名角色使用【杀】造成伤害且此牌对应的实体牌进入弃牌堆后,你可以将一张不为【杀】的“刺”置入弃牌堆,并将这些牌置入“刺”,然后弃置一名角色区域里的一张牌。②一名角色的回合结束时,若你的“刺”均为【杀】,你获得所有“刺”,且这些牌不能被弃置,不计入手牌上限,且当你使用对应实体牌包含这些牌的牌时无次数和距离限制。", + wuanguo: "武安国", + diezhang: "叠嶂", + diezhang_info: + "转换技。①出牌阶段,你使用杀的次数上限+1。②阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用X张【杀】;阳:当其他角色使用牌被你抵消后,你可以摸X张牌,视为对其使用一张【杀】(X为1)。", + duanwan: "断腕", + duanwan_info: + "限定技。当你处于濒死状态时,你可以将体力回复至2点,然后删除〖叠嶂①〗和当前转换技状态的〖叠嶂②〗分支,并将〖叠嶂〗修改为“每回合限一次”且将X修改为2。", + dcduliang: "督粮", + dcduliang2: "督粮", + dcduliang_info: + "出牌阶段限一次。你可以获得一名其他角色的一张牌,然后选择一项:1.你观看牌堆顶的两张牌,然后令其获得其中的一或两张基本牌;2.令其于下回合的摸牌阶段额外摸一张牌。", + sunli: "孙礼", + kangli: "伉厉", + kangli_info: "当你造成或受到伤害后,你摸两张牌。然后你下次造成伤害时弃置这些牌。", + xiahoumao: "夏侯楙", + tongwei: "统围", + tongwei_info: + "出牌阶段限一次。你可以重铸两张牌并指定一名其他角色,当其使用的下一张牌结算结束后,若此牌点数在你上次以此法重铸的牌的点数之间,你视为对其使用一张【杀】或【过河拆桥】。", + cuguo: "蹙国", + cuguo_info: + "锁定技。当你于一回合使用牌首次被抵消后,你弃置一张牌,视为对此牌的目标角色使用一张该被抵消的牌。此牌结算结束后,若此牌被抵消,你失去1点体力。", + chenshi: "陈式", + qingbei: "擎北", + qingbei_info: + "一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用一张有花色的牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。", + feiyao: "费曜", + zhenfeng: "镇锋", + zhenfeng_info: + "每回合限一次。当其他角色于其回合内使用牌时,若其手牌数不大于其体力值,你可以猜测其手牌中与此牌类别相同的牌数。若你猜对,你摸X张牌并视为对其使用一张【杀】(X为你连续猜对的次数且至多为5);若你猜错且差值大于1,其视为对你使用一张【杀】。", - yijiang_2011:'一将成名2011', - yijiang_2012:'一将成名2012', - yijiang_2013:'一将成名2013', - yijiang_2014:'一将成名2014', - yijiang_2015:'一将成名2015', - yijiang_2016:'原创设计2016', - yijiang_2017:'原创设计2017', - yijiang_2022:'原创设计2022', - yijiang_2023:'一将成名2023', + yijiang_2011: "一将成名2011", + yijiang_2012: "一将成名2012", + yijiang_2013: "一将成名2013", + yijiang_2014: "一将成名2014", + yijiang_2015: "一将成名2015", + yijiang_2016: "原创设计2016", + yijiang_2017: "原创设计2017", + yijiang_2022: "原创设计2022", + yijiang_2023: "一将成名2023", }, }; }); diff --git a/character/yingbian.js b/character/yingbian.js index 5d54ef623..eaf1760e6 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -1,4005 +1,5014 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'yingbian', - connect:true, - character:{ - chengjichengcui:['male','jin',6,['oltousui','olchuming']], - wangxiang:['male','jin',3,['bingxin']], - jin_jiachong:['male','jin',3,['xiongshu','jianhui']], - xuangongzhu:['female','jin',3,['gaoling','qimei','ybzhuiji'],['hiddenSkill']], - xinchang:['male','jin',3,['canmou','congjian']], - yangzhi:['female','jin',3,['xinwanyi','maihuo']], - yangyan:['female','jin',3,['xinxuanbei','xianwan']], - ol_huaxin:['male','wei',3,['caozhao','olxibing']], - zhongyan:['female','jin',3,['bolan','yifa'],['clan:颍川钟氏']], - weiguan:['male','jin',3,['zhongyun','shenpin']], - cheliji:['male','qun',4,['chexuan','qiangshou']], - simazhou:['male','jin',4,['recaiwang','naxiang']], - ol_lisu:['male','qun',3,['qiaoyan','xianzhu']], - jin_yanghuiyu:['female','jin',3,['huirong','ciwei','caiyuan'],['hiddenSkill']], - shibao:['male','jin',4,['zhuosheng']], - jin_zhangchunhua:['female','jin',3,['huishi','qingleng','xuanmu'],['hiddenSkill']], - jin_simayi:['male','jin',3,['buchen','smyyingshi','xiongzhi','xinquanbian'],['hiddenSkill']], - jin_wangyuanji:['female','jin',3,['shiren','yanxi'],['hiddenSkill']], - jin_simazhao:['male','jin',3,['tuishi','xinchoufa','zhaoran','chengwu'],['zhu','hiddenSkill']], - jin_xiahouhui:['female','jin',3,['baoqie','jyishi','shiduo'],['hiddenSkill']], - jin_simashi:['male','jin','3/4',['taoyin','yimie','ruilve','tairan'],['hiddenSkill','zhu']], - zhanghuyuechen:['male','jin',4,['xijue']], - duyu:['male','jin',4,['sanchen','zhaotao']], + name: "yingbian", + connect: true, + character: { + chengjichengcui: ["male", "jin", 6, ["oltousui", "olchuming"]], + wangxiang: ["male", "jin", 3, ["bingxin"]], + jin_jiachong: ["male", "jin", 3, ["xiongshu", "jianhui"]], + xuangongzhu: ["female", "jin", 3, ["gaoling", "qimei", "ybzhuiji"], ["hiddenSkill"]], + xinchang: ["male", "jin", 3, ["canmou", "congjian"]], + yangzhi: ["female", "jin", 3, ["xinwanyi", "maihuo"]], + yangyan: ["female", "jin", 3, ["xinxuanbei", "xianwan"]], + ol_huaxin: ["male", "wei", 3, ["caozhao", "olxibing"]], + zhongyan: ["female", "jin", 3, ["bolan", "yifa"], ["clan:颍川钟氏"]], + weiguan: ["male", "jin", 3, ["zhongyun", "shenpin"]], + cheliji: ["male", "qun", 4, ["chexuan", "qiangshou"]], + simazhou: ["male", "jin", 4, ["recaiwang", "naxiang"]], + ol_lisu: ["male", "qun", 3, ["qiaoyan", "xianzhu"]], + jin_yanghuiyu: ["female", "jin", 3, ["huirong", "ciwei", "caiyuan"], ["hiddenSkill"]], + shibao: ["male", "jin", 4, ["zhuosheng"]], + jin_zhangchunhua: ["female", "jin", 3, ["huishi", "qingleng", "xuanmu"], ["hiddenSkill"]], + jin_simayi: [ + "male", + "jin", + 3, + ["buchen", "smyyingshi", "xiongzhi", "xinquanbian"], + ["hiddenSkill"], + ], + jin_wangyuanji: ["female", "jin", 3, ["shiren", "yanxi"], ["hiddenSkill"]], + jin_simazhao: [ + "male", + "jin", + 3, + ["tuishi", "xinchoufa", "zhaoran", "chengwu"], + ["zhu", "hiddenSkill"], + ], + jin_xiahouhui: ["female", "jin", 3, ["baoqie", "jyishi", "shiduo"], ["hiddenSkill"]], + jin_simashi: [ + "male", + "jin", + "3/4", + ["taoyin", "yimie", "ruilve", "tairan"], + ["hiddenSkill", "zhu"], + ], + zhanghuyuechen: ["male", "jin", 4, ["xijue"]], + duyu: ["male", "jin", 4, ["sanchen", "zhaotao"]], }, - characterSort:{ - yingbian:{ - yingbian_pack1:['jin_simayi','jin_zhangchunhua','ol_lisu','simazhou','cheliji','ol_huaxin'], - yingbian_pack2:['jin_simashi','jin_xiahouhui','zhanghuyuechen','shibao','jin_yanghuiyu','chengjichengcui'], - yingbian_pack3:['jin_simazhao','jin_wangyuanji','duyu','weiguan','xuangongzhu'], - yingbian_pack4:['zhongyan','xinchang','jin_jiachong','wangxiang'], - yingbian_pack5:['yangyan','yangzhi'], + characterSort: { + yingbian: { + yingbian_pack1: [ + "jin_simayi", + "jin_zhangchunhua", + "ol_lisu", + "simazhou", + "cheliji", + "ol_huaxin", + ], + yingbian_pack2: [ + "jin_simashi", + "jin_xiahouhui", + "zhanghuyuechen", + "shibao", + "jin_yanghuiyu", + "chengjichengcui", + ], + yingbian_pack3: ["jin_simazhao", "jin_wangyuanji", "duyu", "weiguan", "xuangongzhu"], + yingbian_pack4: ["zhongyan", "xinchang", "jin_jiachong", "wangxiang"], + yingbian_pack5: ["yangyan", "yangzhi"], }, }, - skill:{ + skill: { //二成 - oltousui:{ - audio:2, - enable:'chooseToUse', - viewAsFilter:function(player){ - return player.countCards('he'); + oltousui: { + audio: 2, + enable: "chooseToUse", + viewAsFilter: function (player) { + return player.countCards("he"); }, - viewAs:{ - name:'sha', - suit:'none', - number:null, - isCard:true, + viewAs: { + name: "sha", + suit: "none", + number: null, + isCard: true, }, - filterCard:true, - selectCard:[1,Infinity], - position:'he', - check:function(card){ - const player=get.player(); - return 4.5+(player.hasSkill('olchuming')?1:0)-1.5*ui.selected.cards.length-get.value(card); + filterCard: true, + selectCard: [1, Infinity], + position: "he", + check: function (card) { + const player = get.player(); + return ( + 4.5 + + (player.hasSkill("olchuming") ? 1 : 0) - + 1.5 * ui.selected.cards.length - + get.value(card) + ); }, - popname:true, - ignoreMod:true, - precontent:function*(event,map){ - var player=map.player; - var evt=event.getParent(); - if(evt.dialog&&typeof evt.dialog=='object') evt.dialog.close(); - player.logSkill('oltousui'); + popname: true, + ignoreMod: true, + precontent: function* (event, map) { + var player = map.player; + var evt = event.getParent(); + if (evt.dialog && typeof evt.dialog == "object") evt.dialog.close(); + player.logSkill("oltousui"); delete event.result.skill; - var cards=event.result.cards; - player.loseToDiscardpile(cards,ui.cardPile,false,'blank').log=false; - var shownCards=cards.filter(i=>get.position(i)=='e'),handcardsLength=cards.length-shownCards.length; - if(shownCards.length){ - player.$throw(shownCards,null); - game.log(player,'将',shownCards,'置于了牌堆底'); + var cards = event.result.cards; + player.loseToDiscardpile(cards, ui.cardPile, false, "blank").log = false; + var shownCards = cards.filter((i) => get.position(i) == "e"), + handcardsLength = cards.length - shownCards.length; + if (shownCards.length) { + player.$throw(shownCards, null); + game.log(player, "将", shownCards, "置于了牌堆底"); } - if(handcardsLength>0){ - player.$throw(handcardsLength,null); - game.log(player,'将',get.cnNumber(handcardsLength),'张牌置于了牌堆底'); + if (handcardsLength > 0) { + player.$throw(handcardsLength, null); + game.log(player, "将", get.cnNumber(handcardsLength), "张牌置于了牌堆底"); } game.delayex(); - var viewAs=new lib.element.VCard({name:event.result.card.name,isCard:true}); - event.result.card=viewAs; - event.result.cards=[]; - event.result._apply_args={ - shanReq:cards.length, - oncard:()=>{ - var evt=get.event(); - for(var target of game.filterPlayer(null,null,true)){ - var id=target.playerid; - var map=evt.customArgs; - if(!map[id]) map[id]={}; - map[id].shanRequired=evt.shanReq; + var viewAs = new lib.element.VCard({ name: event.result.card.name, isCard: true }); + event.result.card = viewAs; + event.result.cards = []; + event.result._apply_args = { + shanReq: cards.length, + oncard: () => { + var evt = get.event(); + for (var target of game.filterPlayer(null, null, true)) { + var id = target.playerid; + var map = evt.customArgs; + if (!map[id]) map[id] = {}; + map[id].shanRequired = evt.shanReq; } - } + }, }; }, - ai:{ - order:function(item,player){ - return get.order({name:'sha'})+0.1; + ai: { + order: function (item, player) { + return get.order({ name: "sha" }) + 0.1; }, - result:{player:1}, - keepdu:true, - respondSha:true, - skillTagFilter:(player,tag,arg)=>{ - if(tag=='respondSha'&&arg!='use') return false; + result: { player: 1 }, + keepdu: true, + respondSha: true, + skillTagFilter: (player, tag, arg) => { + if (tag == "respondSha" && arg != "use") return false; }, }, }, - olchuming:{ - audio:2, - trigger:{ - source:'damageBegin1', - player:'damageBegin3', + olchuming: { + audio: 2, + trigger: { + source: "damageBegin1", + player: "damageBegin3", }, - filter:function(event,player){ - if(event.source===event.player) return false; - if(!event.card||!event.cards||!event.cards.length) return true; - let target=event[player===event.source?'player':'source']; - return target&&target.isIn(); + filter: function (event, player) { + if (event.source === event.player) return false; + if (!event.card || !event.cards || !event.cards.length) return true; + let target = event[player === event.source ? "player" : "source"]; + return target && target.isIn(); }, - forced:true, - content:function*(event,map){ - var player=map.player,trigger=map.trigger; - if(!trigger.card||!trigger.cards||!trigger.cards.length){ + forced: true, + content: function* (event, map) { + var player = map.player, + trigger = map.trigger; + if (!trigger.card || !trigger.cards || !trigger.cards.length) { trigger.num++; event.finish(); return; - } - else{ - var target=trigger[trigger.source==player?'player':'source']; - trigger._olchuming=true; - target.addTempSkill('olchuming_effect'); + } else { + var target = trigger[trigger.source == player ? "player" : "source"]; + trigger._olchuming = true; + target.addTempSkill("olchuming_effect"); } }, - ai:{ - effect:{ - player:function(card,player,target){ - if(!get.tag(card,'damage')) return; - if(!lib.card[card.name]||!card.cards||!card.cards.length) return [1,0,1,-1]; - return [1,-1]; + ai: { + effect: { + player: function (card, player, target) { + if (!get.tag(card, "damage")) return; + if (!lib.card[card.name] || !card.cards || !card.cards.length) + return [1, 0, 1, -1]; + return [1, -1]; }, }, }, - subSkill:{ - effect:{ - charlotte:true, - trigger:{global:'phaseEnd'}, - forced:true, - popup:false, - content:function*(event,map){ - var player=map.player; - var mapx={}; - var history=player.getHistory('damage').concat(player.getHistory('sourceDamage')); - history.forEach(evt=>{ - if(!evt._olchuming) return; - var target=evt[evt.source==player?'player':'source']; - if(!target.isIn()) return; - var cards=evt.cards.filterInD('d'); - if(!cards.length) return; - if(!mapx[target.playerid]) mapx[target.playerid]=[]; + subSkill: { + effect: { + charlotte: true, + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + content: function* (event, map) { + var player = map.player; + var mapx = {}; + var history = player + .getHistory("damage") + .concat(player.getHistory("sourceDamage")); + history.forEach((evt) => { + if (!evt._olchuming) return; + var target = evt[evt.source == player ? "player" : "source"]; + if (!target.isIn()) return; + var cards = evt.cards.filterInD("d"); + if (!cards.length) return; + if (!mapx[target.playerid]) mapx[target.playerid] = []; mapx[target.playerid].addArray(cards); }); - var entries=Object.entries(mapx).map(entry=>{ - return [(_status.connectMode?lib.playerOL:game.playerMap)[entry[0]],entry[1]]; + var entries = Object.entries(mapx).map((entry) => { + return [ + (_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]], + entry[1], + ]; }); - if(!entries.length){ + if (!entries.length) { event.finish(); return; } - player.logSkill('olchuming_effect',entries.map(i=>i[0])); - entries.sort((a,b)=>lib.sort.seat(a[0],b[0])); - for(var entry of entries){ - var current=entry[0],cards=entry[1]; - var list=['jiedao','guohe'].filter(i=>player.canUse(new lib.element.VCard({name:i,cards:cards}),current,false)); - if(!list.length) return; - var result=({}); - if(list.length==1) result={bool:true,links:[['','',list[0]]]}; - else result=yield player.chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`,[list,'vcard']],true).set('ai',button=>{ - var player=get.player(); - return get.effect(get.event('currentTarget'),{name:button.link[2]},player,player); - }).set('currentTarget',current); - if(result.bool){ - var card=get.autoViewAs({name:result.links[0][2]},cards); - if(player.canUse(card,current,false)) player.useCard(card,cards,current,false); + player.logSkill( + "olchuming_effect", + entries.map((i) => i[0]) + ); + entries.sort((a, b) => lib.sort.seat(a[0], b[0])); + for (var entry of entries) { + var current = entry[0], + cards = entry[1]; + var list = ["jiedao", "guohe"].filter((i) => + player.canUse( + new lib.element.VCard({ name: i, cards: cards }), + current, + false + ) + ); + if (!list.length) return; + var result = {}; + if (list.length == 1) result = { bool: true, links: [["", "", list[0]]] }; + else + result = yield player + .chooseButton( + [ + `畜鸣:请选择要对${get.translation(current)}使用的牌`, + [list, "vcard"], + ], + true + ) + .set("ai", (button) => { + var player = get.player(); + return get.effect( + get.event("currentTarget"), + { name: button.link[2] }, + player, + player + ); + }) + .set("currentTarget", current); + if (result.bool) { + var card = get.autoViewAs({ name: result.links[0][2] }, cards); + if (player.canUse(card, current, false)) + player.useCard(card, cards, current, false); } } - } - } - } - }, - bingxin:{ - audio:2, - enable:'chooseToUse', - hiddenCard:function(player,name){ - if(get.type(name)=='basic'&&lib.inpile.includes(name)&&!player.getStorage('bingxin_count').includes(name)) return true; + }, + }, }, - filter:function(event,player){ - if(event.type=='wuxie') return false; - var hs=player.getCards('h'); - if(hs.length!=Math.max(0,player.hp)) return false; - if(hs.length>1){ - var color=get.color(hs[0],player); - for(var i=1;i 1) { + var color = get.color(hs[0], player); + for (var i = 1; i < hs.length; i++) { + if (get.color(hs[i], player) != color) return false; } } - var storage=player.storage.bingxin_count - for(var i of lib.inpile){ - if(get.type(i)!='basic') continue; - if(storage&&storage.includes(i)) continue; - var card={name:i,isCard:true}; - if(event.filterCard(card,player,event)) return true; - if(i=='sha'){ - for(var j of lib.inpile_nature){ - card.nature=j; - if(event.filterCard(card,player,event)) return true; + var storage = player.storage.bingxin_count; + for (var i of lib.inpile) { + if (get.type(i) != "basic") continue; + if (storage && storage.includes(i)) continue; + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) return true; + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) return true; } } } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=[]; - var storage=player.storage.bingxin_count; - for(var i of lib.inpile){ - if(get.type(i)!='basic') continue; - if(storage&&storage.includes(i)) continue; - var card={name:i,isCard:true}; - if(event.filterCard(card,player,event)) list.push(['基本','',i]); - if(i=='sha'){ - for(var j of lib.inpile_nature){ - card.nature=j; - if(event.filterCard(card,player,event)) list.push(['基本','',i,j]); + chooseButton: { + dialog: function (event, player) { + var list = []; + var storage = player.storage.bingxin_count; + for (var i of lib.inpile) { + if (get.type(i) != "basic") continue; + if (storage && storage.includes(i)) continue; + var card = { name: i, isCard: true }; + if (event.filterCard(card, player, event)) list.push(["基本", "", i]); + if (i == "sha") { + for (var j of lib.inpile_nature) { + card.nature = j; + if (event.filterCard(card, player, event)) list.push(["基本", "", i, j]); } } } - return ui.create.dialog('冰心',[list,'vcard'],'hidden') + return ui.create.dialog("冰心", [list, "vcard"], "hidden"); }, - check:function(button){ - if(button.link[2]=='shan') return 3; - var player=_status.event.player; - if(button.link[2]=='jiu'){ - if(player.getUseValue({name:'jiu'})<=0) return 0; - if(player.countCards('h','sha')) return player.getUseValue({name:'jiu'}); + check: function (button) { + if (button.link[2] == "shan") return 3; + var player = _status.event.player; + if (button.link[2] == "jiu") { + if (player.getUseValue({ name: "jiu" }) <= 0) return 0; + if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" }); return 0; } - return player.getUseValue({name:button.link[2],nature:button.link[3]})/4; + return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4; }, - backup:function(links,player){ + backup: function (links, player) { return { - selectCard:-1, - filterCard:()=>false, - viewAs:{ - name:links[0][2], - nature:links[0][3], - isCard:true, + selectCard: -1, + filterCard: () => false, + viewAs: { + name: links[0][2], + nature: links[0][3], + isCard: true, }, - precontent:function(){ - player.logSkill('bingxin'); + precontent: function () { + player.logSkill("bingxin"); player.draw(); delete event.result.skill; - var name=event.result.card.name; - player.addTempSkill('bingxin_count'); - player.markAuto('bingxin_count',[name]); + var name = event.result.card.name; + player.addTempSkill("bingxin_count"); + player.markAuto("bingxin_count", [name]); }, - } + }; }, - prompt:function(links,player){ - var name=links[0][2]; - var nature=links[0][3]; - return '摸一张并视为使用'+(get.translation(nature)||'')+get.translation(name); + prompt: function (links, player) { + var name = links[0][2]; + var nature = links[0][3]; + return "摸一张并视为使用" + (get.translation(nature) || "") + get.translation(name); }, }, - ai:{ - order:10, - respondShan:true, - respondSha:true, - skillTagFilter:function(player,tag,arg){ - if(arg=='respond') return false; - var hs=player.getCards('h'); - if(hs.length!=Math.max(0,hs.length)) return false; - if(hs.length>1){ - var color=get.color(hs[0],player); - for(var i=1;i 1) { + var color = get.color(hs[0], player); + for (var i = 1; i < hs.length; i++) { + if (get.color(hs[i], player) != color) return false; } } - var storage=player.storage.bingxin_count; - if(storage&&storage.includes('s'+tag.slice(8))) return false; + var storage = player.storage.bingxin_count; + if (storage && storage.includes("s" + tag.slice(8))) return false; }, - result:{ - player:function(player){ - if(_status.event.dying) return get.attitude(player,_status.event.dying); + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); return 1; - } - } + }, + }, }, - subSkill:{count:{charlotte:true,onremove:true}}, + subSkill: { count: { charlotte: true, onremove: true } }, }, - zhefu:{ - audio:2, - trigger:{player:['useCard','respond']}, - direct:true, - filter:function(event,player){ - return player!=_status.currentPhase&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - }); + zhefu: { + audio: 2, + trigger: { player: ["useCard", "respond"] }, + direct: true, + filter: function (event, player) { + return ( + player != _status.currentPhase && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('zhefu'),'令一名有手牌的其他角色弃置一张【'+get.translation(trigger.card.name)+'】,否则受到你造成的1点伤害。',function(card,player,target){ - return target!=player&&target.countCards('h')>0; - }).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player)/Math.sqrt(target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('zhefu',target); - var name=trigger.card.name; - target.chooseToDiscard('he',{name:name},'弃置一张【'+get.translation(name)+'】或受到1点伤害').set('ai',function(card){ - var player=_status.event.player; - if(_status.event.take||(get.name(card)=='tao'&&!player.hasJudge('lebu'))) return 0; - return 8-get.value(card); - }).set('take',get.damageEffect(target,player,target)>=0); - } - else event.finish(); - 'step 2' - if(!result.bool) target.damage(); + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("zhefu"), + "令一名有手牌的其他角色弃置一张【" + + get.translation(trigger.card.name) + + "】,否则受到你造成的1点伤害。", + function (card, player, target) { + return target != player && target.countCards("h") > 0; + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return ( + get.damageEffect(target, player, player) / Math.sqrt(target.countCards("h")) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("zhefu", target); + var name = trigger.card.name; + target + .chooseToDiscard( + "he", + { name: name }, + "弃置一张【" + get.translation(name) + "】或受到1点伤害" + ) + .set("ai", function (card) { + var player = _status.event.player; + if ( + _status.event.take || + (get.name(card) == "tao" && !player.hasJudge("lebu")) + ) + return 0; + return 8 - get.value(card); + }) + .set("take", get.damageEffect(target, player, target) >= 0); + } else event.finish(); + ("step 2"); + if (!result.bool) target.damage(); }, }, - yidu:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return (event.card.name=='sha'||(get.type(event.card,null,false)=='trick'&&get.tag(event.card,'damage')>0)) - &&event.targets.some(target=>{ - return target.countCards('h')>0&&!target.hasHistory('damage',function(evt){ - return evt.card==event.card; + yidu: { + audio: 2, + trigger: { player: "useCardAfter" }, + filter: function (event, player) { + return ( + (event.card.name == "sha" || + (get.type(event.card, null, false) == "trick" && + get.tag(event.card, "damage") > 0)) && + event.targets.some((target) => { + return ( + target.countCards("h") > 0 && + !target.hasHistory("damage", function (evt) { + return evt.card == event.card; + }) + ); + }) + ); + }, + direct: true, + content: function () { + "step 0"; + player + .chooseTarget(get.prompt2("yidu"), (card, player, target) => { + return _status.event.targets.includes(target); + }) + .set( + "targets", + trigger.targets.filter((target) => { + return ( + target.countCards("h") > 0 && + !target.hasHistory("damage", function (evt) { + return evt.card == trigger.card; + }) + ); + }) + ) + .set("ai", (target) => { + if (target.hasSkillTag("noh")) return 0; + return -get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill("yidu", target); + player + .choosePlayerCard( + target, + "遗毒:展示" + get.translation(target) + "的至多三张手牌", + true, + "h", + [1, Math.min(3, target.countCards("h"))] + ) + .set("forceAuto", true) + .set("ai", function (button) { + if (ui.selected.buttons.length) return 0; + return 1 + Math.random(); }); - }); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('yidu'),(card,player,target)=>{ - return _status.event.targets.includes(target); - }).set('targets',trigger.targets.filter(target=>{ - return target.countCards('h')>0&&!target.hasHistory('damage',function(evt){ - return evt.card==trigger.card; - }); - })).set('ai',target=>{ - if(target.hasSkillTag('noh')) return 0; - return -get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('yidu',target); - player.choosePlayerCard(target,'遗毒:展示'+get.translation(target)+'的至多三张手牌',true,'h',[1,Math.min(3,target.countCards('h'))]).set('forceAuto',true).set('ai',function(button){ - if(ui.selected.buttons.length) return 0; - return 1+Math.random(); - }); - } - else event.finish(); - 'step 2' - var cards=result.cards; - player.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【遗毒】'); - var color=get.color(cards[0],target); - var bool=true; - for(var i=1;i0; + xinwanyi: { + audio: "wanyi", + trigger: { player: "useCardToTargeted" }, + filter: function (event, player) { + return ( + player != event.target && + event.targets.length == 1 && + (event.card.name == "sha" || get.type(event.card, false) == "trick") && + event.target.countCards("he") > 0 + ); }, - locked:false, - logTarget:'target', - check:function(event,player){ - return get.effect(event.target,{name:'guohe_copy2'},player,player)>0; + locked: false, + logTarget: "target", + check: function (event, player) { + return get.effect(event.target, { name: "guohe_copy2" }, player, player) > 0; }, - prompt2:'将该角色的一张牌置于武将牌上作为“嫕”', - content:function(){ - 'step 0' - event.target=trigger.target; - player.choosePlayerCard(event.target,true,'he'); - 'step 1' - if(result.bool){ - var cards=result.cards; - player.addToExpansion(cards,target,'give').gaintag.add('xinwanyi'); + prompt2: "将该角色的一张牌置于武将牌上作为“嫕”", + content: function () { + "step 0"; + event.target = trigger.target; + player.choosePlayerCard(event.target, true, "he"); + ("step 1"); + if (result.bool) { + var cards = result.cards; + player.addToExpansion(cards, target, "give").gaintag.add("xinwanyi"); } }, - mod:{ - cardEnabled:function(card,player){ - var cards=player.getExpansions('xinwanyi'); - if(cards.length){ - var suit=get.suit(card); - if(suit=='none') return; - for(var i of cards){ - if(get.suit(i,player)==suit) return false; + mod: { + cardEnabled: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; } } }, - cardRespondable:function(card,player){ - var cards=player.getExpansions('xinwanyi'); - if(cards.length){ - var suit=get.suit(card); - if(suit=='none') return; - for(var i of cards){ - if(get.suit(i,player)==suit) return false; + cardRespondable: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; } } }, - cardSavable:function(card,player){ - var cards=player.getExpansions('xinwanyi'); - if(cards.length){ - var suit=get.suit(card); - if(suit=='none') return; - for(var i of cards){ - if(get.suit(i,player)==suit) return false; + cardSavable: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; } } }, - cardDiscardable:function(card,player){ - var cards=player.getExpansions('xinwanyi'); - if(cards.length){ - var suit=get.suit(card); - if(suit=='none') return; - for(var i of cards){ - if(get.suit(i,player)==suit) return false; + cardDiscardable: function (card, player) { + var cards = player.getExpansions("xinwanyi"); + if (cards.length) { + var suit = get.suit(card); + if (suit == "none") return; + for (var i of cards) { + if (get.suit(i, player) == suit) return false; } } }, }, - marktext:'嫕', - intro:{ - markcount:'expansion', - content:'expansion', + marktext: "嫕", + intro: { + markcount: "expansion", + content: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - group:'xinwanyi_give', - subSkill:{ - give:{ - audio:'wanyi', - trigger:{player:['phaseJieshuBegin','damageEnd']}, - forced:true, - locked:false, - filter:function(event,player){ - return player.getExpansions('xinwanyi').length>0; + group: "xinwanyi_give", + subSkill: { + give: { + audio: "wanyi", + trigger: { player: ["phaseJieshuBegin", "damageEnd"] }, + forced: true, + locked: false, + filter: function (event, player) { + return player.getExpansions("xinwanyi").length > 0; }, - content:function(){ - 'step 0' - player.chooseTarget(true,'婉嫕:令一名角色获得一张“嫕”').set('ai',function(target){ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - var cards=player.getExpansions('xinwanyi'); - if(cards.length==1) event._result={bool:true,links:cards}; - else player.chooseButton(['令'+get.translation(target)+'获得一张“嫕”',cards],true); - } - else event.finish(); - 'step 2' - if(result.bool){ - target.gain(result.links,player,'give'); + content: function () { + "step 0"; + player + .chooseTarget(true, "婉嫕:令一名角色获得一张“嫕”") + .set("ai", function (target) { + return get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var cards = player.getExpansions("xinwanyi"); + if (cards.length == 1) event._result = { bool: true, links: cards }; + else + player.chooseButton( + ["令" + get.translation(target) + "获得一张“嫕”", cards], + true + ); + } else event.finish(); + ("step 2"); + if (result.bool) { + target.gain(result.links, player, "give"); } }, }, }, }, - xinxuanbei:{ - audio:'xuanbei', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer((current)=>lib.skill.xinxuanbei.filterTarget(null,player,current)); + xinxuanbei: { + audio: "xuanbei", + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer((current) => + lib.skill.xinxuanbei.filterTarget(null, player, current) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('hej')>0; + filterTarget: function (card, player, target) { + return target != player && target.countCards("hej") > 0; }, - content:function(){ - 'step 0' - player.choosePlayerCard(target,'hej',true); - 'step 1' - if(result.bool){ - var card=result.cards[0]; - var cardx=get.autoViewAs({name:'sha'},[card]); - if((get.position(card)!='j'&&!game.checkMod(card,target,'unchanged','cardEnabled2',target))||!target.canUse(cardx,player,false)) event.finish(); - else{ - var next=target.useCard(cardx,[card],player,false); - event.card=next.card; + content: function () { + "step 0"; + player.choosePlayerCard(target, "hej", true); + ("step 1"); + if (result.bool) { + var card = result.cards[0]; + var cardx = get.autoViewAs({ name: "sha" }, [card]); + if ( + (get.position(card) != "j" && + !game.checkMod(card, target, "unchanged", "cardEnabled2", target)) || + !target.canUse(cardx, player, false) + ) + event.finish(); + else { + var next = target.useCard(cardx, [card], player, false); + event.card = next.card; } - } - else event.finish(); - 'step 2' - var num=1; - if(player.hasHistory('damage',function(evt){ - return evt.card==event.card; - })) num++; + } else event.finish(); + ("step 2"); + var num = 1; + if ( + player.hasHistory("damage", function (evt) { + return evt.card == event.card; + }) + ) + num++; player.draw(num); }, - ai:{ - order:7, - result:{ - player:function(player,target){ - return get.effect(target,{name:'guohe_copy'},player,player)+get.effect(player,{name:'sha'},target,player) + ai: { + order: 7, + result: { + player: function (player, target) { + return ( + get.effect(target, { name: "guohe_copy" }, player, player) + + get.effect(player, { name: "sha" }, target, player) + ); }, }, }, }, - xiongshu:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - direct:true, - filter:function(event,player){ - return player!=event.player&&event.player.countCards('h')>0&&player.countCards('he')>=player.countMark('xiongshu_count'); + xiongshu: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + direct: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.countCards("h") > 0 && + player.countCards("he") >= player.countMark("xiongshu_count") + ); }, - content:function(){ - 'step 0' - event.target=trigger.player; - var num=player.countMark('xiongshu_count'); - if(num>0) player.chooseToDiscard('he',num,get.prompt('xiongshu',trigger.player),'弃置'+get.cnNumber(num)+'张牌并展示其一张手牌').set('goon',get.attitude(player,event.target)<0).set('ai',function(card){ - if(!_status.event.goon) return 0; - return 6-_status.event.player.countMark('xiongshu_count')-get.value(card); - }).logSkill=['xiongshu',trigger.player]; - else player.chooseBool(get.prompt('xiongshu',trigger.player),'展示其一张牌').set('goon',get.attitude(player,event.target)<0).set('ai',function(card){ - return _status.event.goon; - }) - 'step 1' - if(result.bool){ - if(!result.cards||!result.cards.length) player.logSkill('xiongshu',target); - player.addTempSkill('xiongshu_count','roundStart'); - player.addMark('xiongshu_count',1,false); + content: function () { + "step 0"; + event.target = trigger.player; + var num = player.countMark("xiongshu_count"); + if (num > 0) + player + .chooseToDiscard( + "he", + num, + get.prompt("xiongshu", trigger.player), + "弃置" + get.cnNumber(num) + "张牌并展示其一张手牌" + ) + .set("goon", get.attitude(player, event.target) < 0) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 6 - _status.event.player.countMark("xiongshu_count") - get.value(card); + }).logSkill = ["xiongshu", trigger.player]; + else + player + .chooseBool(get.prompt("xiongshu", trigger.player), "展示其一张牌") + .set("goon", get.attitude(player, event.target) < 0) + .set("ai", function (card) { + return _status.event.goon; + }); + ("step 1"); + if (result.bool) { + if (!result.cards || !result.cards.length) player.logSkill("xiongshu", target); + player.addTempSkill("xiongshu_count", "roundStart"); + player.addMark("xiongshu_count", 1, false); } - if(result.bool&&target.countCards('h')>0){ - player.choosePlayerCard(target,true,'h'); + if (result.bool && target.countCards("h") > 0) { + player.choosePlayerCard(target, true, "h"); + } else event.finish(); + ("step 2"); + var card = result.cards[0], + name = get.name(card), + str = get.translation(target); + player.showCards(card, get.translation(player) + "对" + str + "发动了【凶竖】"); + player.addTempSkill("xiongshu_effect", "phaseUseAfter"); + player.storage.xiongshu_effect = [card, name]; + if (Math.random() < 0.5) { + target.storage.xiongshu_ai = name; + target.addTempSkill("xiongshu_ai", "phaseUseAfter"); } - else event.finish(); - 'step 2' - var card=result.cards[0],name=get.name(card),str=get.translation(target); - player.showCards(card,get.translation(player)+'对'+str+'发动了【凶竖】'); - player.addTempSkill('xiongshu_effect','phaseUseAfter'); - player.storage.xiongshu_effect=[card,name]; - if(Math.random()<0.5){ - target.storage.xiongshu_ai=name; - target.addTempSkill('xiongshu_ai','phaseUseAfter'); - } - player.chooseControl('会使用','不会使用').set('prompt','预测:'+str+'是否会使用'+get.translation(name)+'?').set('choice',function(){ - if(!target.hasValueTarget(card)) return 1; - return Math.random()<0.5?0:1; - }()).set('ai',()=>_status.event.choice); - 'step 3' - player.storage.xiongshu_effect[2]=(result.index==0); + player + .chooseControl("会使用", "不会使用") + .set("prompt", "预测:" + str + "是否会使用" + get.translation(name) + "?") + .set( + "choice", + (function () { + if (!target.hasValueTarget(card)) return 1; + return Math.random() < 0.5 ? 0 : 1; + })() + ) + .set("ai", () => _status.event.choice); + ("step 3"); + player.storage.xiongshu_effect[2] = result.index == 0; }, - ai:{expose:0.35}, - subSkill:{ - ai:{ - charlotte:true, - onremove:true, - ai:{ - effect:{ - player:function(card,player,target){ - if(card.name==player.storage.xiongshu_ai) return 'zeroplayertarget'; + ai: { expose: 0.35 }, + subSkill: { + ai: { + charlotte: true, + onremove: true, + ai: { + effect: { + player: function (card, player, target) { + if (card.name == player.storage.xiongshu_ai) return "zeroplayertarget"; }, }, }, }, - count:{ - charlotte:true, - onremove:true, + count: { + charlotte: true, + onremove: true, }, - effect:{ - trigger:{global:'phaseUseEnd'}, - forced:true, - charlotte:true, - onremove:true, - filter:function(event,player){ - var info=player.storage.xiongshu_effect; - return Array.isArray(info)&&event.player.isIn(); + effect: { + trigger: { global: "phaseUseEnd" }, + forced: true, + charlotte: true, + onremove: true, + filter: function (event, player) { + var info = player.storage.xiongshu_effect; + return Array.isArray(info) && event.player.isIn(); }, - logTarget:'player', - content:function(){ - var target=trigger.player; - var info=player.storage.xiongshu_effect; - var card=info[0]; - if(target.hasHistory('useCard',function(evt){ - return evt.card.name==info[1]&&evt.getParent('phaseUse')==trigger; - })==info[2]) target.damage(); - else{ - if(target.getCards('hej').includes(card)) player.gain(card,target,'give'); - else if(get.position(card,true)=='d') player.gain(card,'gain2'); + logTarget: "player", + content: function () { + var target = trigger.player; + var info = player.storage.xiongshu_effect; + var card = info[0]; + if ( + target.hasHistory("useCard", function (evt) { + return evt.card.name == info[1] && evt.getParent("phaseUse") == trigger; + }) == info[2] + ) + target.damage(); + else { + if (target.getCards("hej").includes(card)) player.gain(card, target, "give"); + else if (get.position(card, true) == "d") player.gain(card, "gain2"); } }, }, }, }, - jianhui:{ - audio:2, - getLastPlayer:function(evt,player){ - var history=player.getAllHistory('damage'); - if(!history.length) return null; - var i=history.indexOf(evt); - if(i==-1) i=history.length-1; + jianhui: { + audio: 2, + getLastPlayer: function (evt, player) { + var history = player.getAllHistory("damage"); + if (!history.length) return null; + var i = history.indexOf(evt); + if (i == -1) i = history.length - 1; else i--; - for(i;i>=0;i--){ - if(history[i].source) return history[i].source; + for (i; i >= 0; i--) { + if (history[i].source) return history[i].source; } return null; }, - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source==lib.skill.jianhui.getLastPlayer(event,player)&&event.source.countCards('he')>0; + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + event.source == lib.skill.jianhui.getLastPlayer(event, player) && + event.source.countCards("he") > 0 + ); }, - content:function(){ - trigger.source.chooseToDiscard('he',true); + content: function () { + trigger.source.chooseToDiscard("he", true); }, - group:'jianhui_draw', - subSkill:{ - draw:{ - trigger:{source:'damageSource'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return event.player==lib.skill.jianhui.getLastPlayer(event,player); + group: "jianhui_draw", + subSkill: { + draw: { + trigger: { source: "damageSource" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return event.player == lib.skill.jianhui.getLastPlayer(event, player); }, - content:function(){ + content: function () { player.draw(); }, }, }, }, - huaiyuan:{ - audio:2, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + huaiyuan: { + audio: 2, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - filter:function(event,player){ - var evt=event.getl(player); - if(!evt||!evt.hs||!evt.hs.length) return false; - if(event.name=='lose'){ - for(var i in event.gaintag_map){ - if(event.gaintag_map[i].includes('huaiyuanx')) return true; + filter: function (event, player) { + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + if (event.name == "lose") { + for (var i in event.gaintag_map) { + if (event.gaintag_map[i].includes("huaiyuanx")) return true; } return false; } - return player.hasHistory('lose',function(evt){ - if(event!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('huaiyuanx')) return true; + return player.hasHistory("lose", function (evt) { + if (event != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("huaiyuanx")) return true; } return false; }); }, - forced:true, - locked:false, - content:function(){ - 'step 0' - var num=0; - if(trigger.name=='lose'){ - for(var i in trigger.gaintag_map){ - if(trigger.gaintag_map[i].includes('huaiyuanx')) num++; + forced: true, + locked: false, + content: function () { + "step 0"; + var num = 0; + if (trigger.name == "lose") { + for (var i in trigger.gaintag_map) { + if (trigger.gaintag_map[i].includes("huaiyuanx")) num++; } - } - else player.getHistory('lose',function(evt){ - if(trigger!=evt.getParent()) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('huaiyuanx')) num++; - } - return false; - }); - event.count=num; - 'step 1' - event.count--; - player.chooseTarget(true,'请选择【怀远】的目标','令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。').set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<=0) return 0; - if(target.hasValueTarget({name:'sha'},false)&&!target.hasValueTarget({name:'sha'})) att*=2.2; - if(target.needsToDiscard()) att*=1.3; - return att*Math.sqrt(Math.max(1,4-target.countCards('h'))); - }); - 'step 2' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - var str=get.translation(target) - player.chooseControl().set('choiceList',[ - '令'+str+'的手牌上限+1', - '令'+str+'的攻击范围+1', - '令'+str+'摸一张牌', - ]).set('ai',function(){ - var player=_status.event.player,target=_status.event.getParent().target;if(target.hasValueTarget({name:'sha'},false)&&!target.hasValueTarget({name:'sha'})) return 1; - if(target.needsToDiscard()) return 0; - return 2; + } else + player.getHistory("lose", function (evt) { + if (trigger != evt.getParent()) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("huaiyuanx")) num++; + } + return false; }); - } - else event.finish(); - 'step 3' - if(result.index==2) target.draw(); - else{ - target.addSkill('huaiyuan_effect'+result.index); - target.addMark('huaiyuan_effect'+result.index,1,false); - game.log(target,'的','#g'+['手牌上限','攻击范围'][result.index],'+1') + event.count = num; + ("step 1"); + event.count--; + player + .chooseTarget( + true, + "请选择【怀远】的目标", + "令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。" + ) + .set("ai", function (target) { + var player = _status.event.player, + att = get.attitude(player, target); + if (att <= 0) return 0; + if ( + target.hasValueTarget({ name: "sha" }, false) && + !target.hasValueTarget({ name: "sha" }) + ) + att *= 2.2; + if (target.needsToDiscard()) att *= 1.3; + return att * Math.sqrt(Math.max(1, 4 - target.countCards("h"))); + }); + ("step 2"); + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.line(target, "green"); + var str = get.translation(target); + player + .chooseControl() + .set("choiceList", [ + "令" + str + "的手牌上限+1", + "令" + str + "的攻击范围+1", + "令" + str + "摸一张牌", + ]) + .set("ai", function () { + var player = _status.event.player, + target = _status.event.getParent().target; + if ( + target.hasValueTarget({ name: "sha" }, false) && + !target.hasValueTarget({ name: "sha" }) + ) + return 1; + if (target.needsToDiscard()) return 0; + return 2; + }); + } else event.finish(); + ("step 3"); + if (result.index == 2) target.draw(); + else { + target.addSkill("huaiyuan_effect" + result.index); + target.addMark("huaiyuan_effect" + result.index, 1, false); + game.log(target, "的", "#g" + ["手牌上限", "攻击范围"][result.index], "+1"); game.delayx(); } - if(event.count>0) event.goto(1); + if (event.count > 0) event.goto(1); }, - group:['huaiyuan_init','huaiyuan_die'], - subSkill:{ - init:{ - audio:'huaiyuan', - trigger:{ - global:'phaseBefore', - player:'enterGame', + group: ["huaiyuan_init", "huaiyuan_die"], + subSkill: { + init: { + audio: "huaiyuan", + trigger: { + global: "phaseBefore", + player: "enterGame", }, - forced:true, - locked:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.countCards('h')>0; + forced: true, + locked: false, + filter: function (event, player) { + return ( + (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0 + ); }, - content:function(){ - var hs=player.getCards('h'); - if(hs.length) player.addGaintag(hs,'huaiyuanx'); + content: function () { + var hs = player.getCards("h"); + if (hs.length) player.addGaintag(hs, "huaiyuanx"); }, }, - die:{ - trigger:{player:'die'}, - direct:true, - forceDie:true, - skillAnimation:true, - animationColor:'water', - filter:function(event,player){ - return player.hasMark('huaiyuan_effect0')||player.hasMark('huaiyuan_effect1'); + die: { + trigger: { player: "die" }, + direct: true, + forceDie: true, + skillAnimation: true, + animationColor: "water", + filter: function (event, player) { + return player.hasMark("huaiyuan_effect0") || player.hasMark("huaiyuan_effect1"); }, - content:function(){ - 'step 0' - var str='令一名其他角色',num1=player.countMark('huaiyuan_effect0'),num2=player.countMark('huaiyuan_effect1'); - if(num1>0){ - str+='手牌上限+'; - str+=num1; - if(num2>0) str+='且'; + content: function () { + "step 0"; + var str = "令一名其他角色", + num1 = player.countMark("huaiyuan_effect0"), + num2 = player.countMark("huaiyuan_effect1"); + if (num1 > 0) { + str += "手牌上限+"; + str += num1; + if (num2 > 0) str += "且"; } - if(num2>0){ - str+='攻击范围+'; - str+=num2; + if (num2 > 0) { + str += "攻击范围+"; + str += num2; } - player.chooseTarget(lib.filter.notMe,get.prompt('huaiyuan'),str).set('forceDie',true).set('ai',function(target){ - return get.attitude(_status.event.player,target)+114514; - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('huaiyuan_die',target); - var num1=player.countMark('huaiyuan_effect0'),num2=player.countMark('huaiyuan_effect1'); - if(num1>0){ - target.addSkill('huaiyuan_effect0'); - target.addMark('huaiyuan_effect0',num1,false); + player + .chooseTarget(lib.filter.notMe, get.prompt("huaiyuan"), str) + .set("forceDie", true) + .set("ai", function (target) { + return get.attitude(_status.event.player, target) + 114514; + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("huaiyuan_die", target); + var num1 = player.countMark("huaiyuan_effect0"), + num2 = player.countMark("huaiyuan_effect1"); + if (num1 > 0) { + target.addSkill("huaiyuan_effect0"); + target.addMark("huaiyuan_effect0", num1, false); } - if(num2>0){ - target.addSkill('huaiyuan_effect1'); - target.addMark('huaiyuan_effect1',num2,false); + if (num2 > 0) { + target.addSkill("huaiyuan_effect1"); + target.addMark("huaiyuan_effect1", num2, false); } game.delayx(); } }, }, - effect0:{ - charlotte:true, - onremove:true, - mod:{ - maxHandcard:function(player,num){ - return num+player.countMark('huaiyuan_effect0'); + effect0: { + charlotte: true, + onremove: true, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("huaiyuan_effect0"); }, }, - marktext:'怀', - intro:{content:'手牌上限+#'}, + marktext: "怀", + intro: { content: "手牌上限+#" }, }, - effect1:{ - charlotte:true, - onremove:true, - mod:{ - attackRange:function(player,num){ - return num+player.countMark('huaiyuan_effect1'); + effect1: { + charlotte: true, + onremove: true, + mod: { + attackRange: function (player, num) { + return num + player.countMark("huaiyuan_effect1"); }, }, - marktext:'远', - intro:{content:'攻击范围+#'}, + marktext: "远", + intro: { content: "攻击范围+#" }, }, }, }, - chongxin:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.countCards('he')>0&&game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; - }); + chongxin: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return ( + player.countCards("he") > 0 && + game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; + }) + ); }, - filterCard:true, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + filterCard: true, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - discard:false, - lose:false, - delay:false, - position:'he', - content:function(){ - 'step 0' + discard: false, + lose: false, + delay: false, + position: "he", + content: function () { + "step 0"; player.recast(cards); - 'step 1' - if(target.countCards('he')>0){ - target.chooseCard('he',true,'请重铸一张牌',lib.filter.cardRecastable); - } - else event.finish(); - 'step 2' - if(result.bool){ + ("step 1"); + if (target.countCards("he") > 0) { + target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable); + } else event.finish(); + ("step 2"); + if (result.bool) { target.recast(result.cards); } }, - ai:{ - order:6, - result:{ - player:1, - target:function(player,target){ - return 0.5*Math.sqrt(Math.min(3,target.countCards('h'))); + ai: { + order: 6, + result: { + player: 1, + target: function (player, target) { + return 0.5 * Math.sqrt(Math.min(3, target.countCards("h"))); }, }, }, }, - dezhang:{ - trigger:{player:'phaseZhunbeiBegin'}, - derivation:'weishu', - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return !player.hasCard(function(card){ - return card.hasGaintag('huaiyuanx'); - },'h'); + dezhang: { + trigger: { player: "phaseZhunbeiBegin" }, + derivation: "weishu", + juexingji: true, + forced: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return !player.hasCard(function (card) { + return card.hasGaintag("huaiyuanx"); + }, "h"); }, - content:function(){ - player.awakenSkill('dezhang'); + content: function () { + player.awakenSkill("dezhang"); player.loseMaxHp(); - player.addSkills('weishu'); + player.addSkills("weishu"); }, }, - weishu:{ - audio:2, - trigger:{player:'gainAfter'}, - forced:true, - filter:function(event,player){ - return event.getParent().name=='draw'&&event.getParent(2).name!='weishu'&&event.getParent('phaseDraw').player!=player; + weishu: { + audio: 2, + trigger: { player: "gainAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.getParent().name == "draw" && + event.getParent(2).name != "weishu" && + event.getParent("phaseDraw").player != player + ); }, - content:function(){ - 'step 0' - player.chooseTarget(true,'请选择【卫戍】的目标','令一名角色摸一张牌').set('ai',function(target){ - return get.attitude(_status.event.player,target)*Math.sqrt(Math.max(1,4-target.countCards('h'))); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + content: function () { + "step 0"; + player + .chooseTarget(true, "请选择【卫戍】的目标", "令一名角色摸一张牌") + .set("ai", function (target) { + return ( + get.attitude(_status.event.player, target) * + Math.sqrt(Math.max(1, 4 - target.countCards("h"))) + ); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.draw(); } }, - group:'weishu_discard', - subSkill:{ - discard:{ - trigger:{ - player:'loseAfter', - global:'loseAsyncAfter', + group: "weishu_discard", + subSkill: { + discard: { + trigger: { + player: "loseAfter", + global: "loseAsyncAfter", }, - forced:true, - filter:function(event,player){ - return event.type=='discard'&&event.getParent(3).name!='weishu_discard'&&event.getParent('phaseDiscard').player!=player&&event.getl(player).cards2.length>0&&game.hasPlayer((target)=>(target!=player&&target.countDiscardableCards(player,'he')>0)); + forced: true, + filter: function (event, player) { + return ( + event.type == "discard" && + event.getParent(3).name != "weishu_discard" && + event.getParent("phaseDiscard").player != player && + event.getl(player).cards2.length > 0 && + game.hasPlayer( + (target) => + target != player && target.countDiscardableCards(player, "he") > 0 + ) + ); }, - content:function(){ - 'step 0' - player.chooseTarget(true,'请选择【卫戍】的目标','弃置一名其他角色的一张牌',function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'he')>0; - }).set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,{name:'guohe_copy2'},player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - player.discardPlayerCard(target,'he',true); + content: function () { + "step 0"; + player + .chooseTarget( + true, + "请选择【卫戍】的目标", + "弃置一名其他角色的一张牌", + function (card, player, target) { + return ( + target != player && target.countDiscardableCards(player, "he") > 0 + ); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, "he", true); } }, }, }, }, - gaoling:{ - audio:2, - trigger:{player:'showCharacterAfter'}, - hiddenSkill:true, - filter:function(event,player){ - return event.toShow.includes('xuangongzhu')&&player!=_status.currentPhase&&game.hasPlayer(function(current){ - return current.isDamaged(); - }); + gaoling: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + filter: function (event, player) { + return ( + event.toShow.includes("xuangongzhu") && + player != _status.currentPhase && + game.hasPlayer(function (current) { + return current.isDamaged(); + }) + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('gaoling'),'令一名角色回复1点体力',function(card,player,target){ - return target.isDamaged(); - }).set('ai',function(target){ - var player=_status.event.player; - return get.recoverEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('gaoling',target); + direct: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("gaoling"), + "令一名角色回复1点体力", + function (card, player, target) { + return target.isDamaged(); + } + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.recoverEffect(target, player, player); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("gaoling", target); target.recover(); } }, }, - qimei:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('qimei'),'选择一名其他角色并获得“齐眉”效果',lib.filter.notMe).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target)/(Math.abs(player.countCards('h')+2-target.countCards('h'))+1) - }).setHiddenSkill('qimei'); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('qimei',target); - player.storage.qimei_draw=target; - player.addTempSkill('qimei_draw',{player:'phaseBegin'}); + qimei: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + direct: true, + preHidden: true, + content: function () { + "step 0"; + player + .chooseTarget( + get.prompt("qimei"), + "选择一名其他角色并获得“齐眉”效果", + lib.filter.notMe + ) + .set("ai", function (target) { + var player = _status.event.player; + return ( + get.attitude(player, target) / + (Math.abs(player.countCards("h") + 2 - target.countCards("h")) + 1) + ); + }) + .setHiddenSkill("qimei"); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("qimei", target); + player.storage.qimei_draw = target; + player.addTempSkill("qimei_draw", { player: "phaseBegin" }); game.delayx(); } }, - subSkill:{ - draw:{ - audio:'qimei', - charlotte:true, - forced:true, - popup:false, - trigger:{global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','loseAfter','addToExpansionAfter']}, - usable:1, - filter:function(event,player){ - var target=player.storage.qimei_draw; - if(!target||!target.isIn()) return false; - if(player.countCards('h')!=target.countCards('h')) return false; - var hasChange=function(event,player){ - var gain=0,lose=0; - if(event.getg) gain=event.getg(player).length; - if(event.getl) lose=event.getl(player).hs.length; - return gain!=lose; - }; - return hasChange(event,player)||hasChange(event,target); + subSkill: { + draw: { + audio: "qimei", + charlotte: true, + forced: true, + popup: false, + trigger: { + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "loseAfter", + "addToExpansionAfter", + ], }, - content:function(){ - 'step 0' - if(trigger.delay===false) game.delayx(); - 'step 1' - var target=player.storage.qimei_draw; - player.logSkill('qimei_draw',target); - var drawer=[]; - var hasChange=function(event,player){ - var gain=0,lose=0; - if(event.getg) gain=event.getg(player).length; - if(event.getl) lose=event.getl(player).hs.length; - return gain!=lose; + usable: 1, + filter: function (event, player) { + var target = player.storage.qimei_draw; + if (!target || !target.isIn()) return false; + if (player.countCards("h") != target.countCards("h")) return false; + var hasChange = function (event, player) { + var gain = 0, + lose = 0; + if (event.getg) gain = event.getg(player).length; + if (event.getl) lose = event.getl(player).hs.length; + return gain != lose; }; - if(hasChange(trigger,player)) drawer.push(target); - if(hasChange(trigger,target)) drawer.push(player); - if(drawer.length==1) drawer[0].draw(); - else{ + return hasChange(event, player) || hasChange(event, target); + }, + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + ("step 1"); + var target = player.storage.qimei_draw; + player.logSkill("qimei_draw", target); + var drawer = []; + var hasChange = function (event, player) { + var gain = 0, + lose = 0; + if (event.getg) gain = event.getg(player).length; + if (event.getl) lose = event.getl(player).hs.length; + return gain != lose; + }; + if (hasChange(trigger, player)) drawer.push(target); + if (hasChange(trigger, target)) drawer.push(player); + if (drawer.length == 1) drawer[0].draw(); + else { game.asyncDraw(drawer.sortBySeat()); game.delayex(); } }, - group:'qimei_hp', - onremove:true, - mark:'character', - intro:{content:'已和$组成齐眉组合'}, + group: "qimei_hp", + onremove: true, + mark: "character", + intro: { content: "已和$组成齐眉组合" }, }, - hp:{ - audio:'qimei', - trigger:{global:'changeHp'}, - charlotte:true, - forced:true, - logTarget:function(event,player){ + hp: { + audio: "qimei", + trigger: { global: "changeHp" }, + charlotte: true, + forced: true, + logTarget: function (event, player) { return player.storage.qimei_draw; }, - usable:1, - filter:function(event,player){ - var target=player.storage.qimei_draw; - if(!target||!target.isIn()) return false; - if(player!=event.player&&target!=event.player) return false; - return player.hp==target.hp; + usable: 1, + filter: function (event, player) { + var target = player.storage.qimei_draw; + if (!target || !target.isIn()) return false; + if (player != event.player && target != event.player) return false; + return player.hp == target.hp; }, - content:function(){ + content: function () { game.delayx(); - (player==trigger.player?player.storage.qimei_draw:player).draw(); + (player == trigger.player ? player.storage.qimei_draw : player).draw(); }, }, }, }, - ybzhuiji:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - direct:true, - preHidden:true, - content:function(){ - 'step 0' - var list=['摸两张牌,并于出牌阶段结束时失去1点体力']; - if(player.isDamaged()) list.push('回复1点体力,并于出牌阶段结束时弃置两张牌'); - player.chooseControl('cancel2').set('choiceList',list).set('prompt',get.prompt('ybzhuiji')).set('ai',function(){ - var player=_status.event.player; - if(player.isDamaged()&&player.countCards('h','tao')0; + check: function (event, player) { + return get.effect(player, event.card, event.player, player) > 0; }, - preHidden:true, - content:function(){ + preHidden: true, + content: function () { trigger.targets.push(player); - game.log(player,'也成为了',trigger.card,'的目标'); - var next=game.createEvent('congjian_draw',false); - next.player=player; + game.log(player, "也成为了", trigger.card, "的目标"); + var next = game.createEvent("congjian_draw", false); + next.player = player; event.next.remove(next); trigger.getParent().after.push(next); - next.setContent(function(){ - if(player.hasHistory('damage',function(evt){ - return evt.card==event.parent.card; - })) player.draw(2); + next.setContent(function () { + if ( + player.hasHistory("damage", function (evt) { + return evt.card == event.parent.card; + }) + ) + player.draw(2); }); }, }, - wanyi:{ - audio:2, - enable:'phaseUse', - filter:function(event,player){ - return player.getStorage('wanyi2').length<4&&player.hasCard(function(i){ - return get.is.yingbian(i); - },'hs'); + wanyi: { + audio: 2, + enable: "phaseUse", + filter: function (event, player) { + return ( + player.getStorage("wanyi2").length < 4 && + player.hasCard(function (i) { + return get.is.yingbian(i); + }, "hs") + ); }, - chooseButton:{ - dialog:function(event,player){ - var list=['zhujinqiyuan','chuqibuyi','shuiyanqijunx','dongzhuxianji']; - list.removeArray(player.getStorage('wanyi2')) - return ui.create.dialog('婉嫕',[list,'vcard'],'hidden'); + chooseButton: { + dialog: function (event, player) { + var list = ["zhujinqiyuan", "chuqibuyi", "shuiyanqijunx", "dongzhuxianji"]; + list.removeArray(player.getStorage("wanyi2")); + return ui.create.dialog("婉嫕", [list, "vcard"], "hidden"); }, - filter:function(button,player){ - return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); + filter: function (button, player) { + return lib.filter.filterCard( + { name: button.link[2] }, + player, + _status.event.getParent() + ); }, - check:function(button){ - return _status.event.player.getUseValue({name:button.link[2]}); + check: function (button) { + return _status.event.player.getUseValue({ name: button.link[2] }); }, - backup:function(links){ + backup: function (links) { return { - audio:'wanyi', - popname:true, - viewAs:{ - name:links[0][2], + audio: "wanyi", + popname: true, + viewAs: { + name: links[0][2], }, - filterCard:function(card){ + filterCard: function (card) { return get.is.yingbian(card); }, - check:function(card){ - return 1/Math.max(1,get.value(card)); + check: function (card) { + return 1 / Math.max(1, get.value(card)); }, - position:'hs', - onuse:function(links,player){ - if(!player.storage.wanyi2) player.storage.wanyi2=[]; + position: "hs", + onuse: function (links, player) { + if (!player.storage.wanyi2) player.storage.wanyi2 = []; player.storage.wanyi2.add(links.card.name); - player.addTempSkill('wanyi2'); + player.addTempSkill("wanyi2"); }, - } + }; }, - prompt:function(links){ - return '将一张应变牌当做'+get.translation(links[0][2])+'使用'; + prompt: function (links) { + return "将一张应变牌当做" + get.translation(links[0][2]) + "使用"; }, }, - subSkill:{backup:{}}, - ai:{order:8,result:{player:1}}, + subSkill: { backup: {} }, + ai: { order: 8, result: { player: 1 } }, }, - wanyi2:{onremove:true}, - maihuo:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - logTarget:'player', - filter:function(event,player){ - return event.card.name=='sha'&&event.card.isCard&&event.getParent(2).name!='maihuo_effect'&& - event.cards.filterInD().length>0&&event.targets.length==1&& - event.player.isIn()&&(!event.player.getExpansions('maihuo_effect').length); + wanyi2: { onremove: true }, + maihuo: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + logTarget: "player", + filter: function (event, player) { + return ( + event.card.name == "sha" && + event.card.isCard && + event.getParent(2).name != "maihuo_effect" && + event.cards.filterInD().length > 0 && + event.targets.length == 1 && + event.player.isIn() && + !event.player.getExpansions("maihuo_effect").length + ); }, - prompt2:function(event){ - return '令'+get.translation(event.card)+'暂时对你无效'; + prompt2: function (event) { + return "令" + get.translation(event.card) + "暂时对你无效"; }, - check:function(event,player){ - return get.effect(player,event.card,event.player,player)<0; + check: function (event, player) { + return get.effect(player, event.card, event.player, player) < 0; }, - content:function(){ + content: function () { trigger.excluded.add(player); - var target=trigger.player,cards=trigger.cards.filterInD(); - target.addToExpansion('gain2',cards).gaintag.add('maihuo_effect'); - target.storage.maihuo_target=player; - target.addSkill('maihuo_effect') + var target = trigger.player, + cards = trigger.cards.filterInD(); + target.addToExpansion("gain2", cards).gaintag.add("maihuo_effect"); + target.storage.maihuo_target = player; + target.addSkill("maihuo_effect"); }, - group:'maihuo_damage', - subSkill:{ - effect:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - charlotte:true, - filter:function(event,player){ - return player.getExpansions('maihuo_effect').length>0; + group: "maihuo_damage", + subSkill: { + effect: { + trigger: { player: "phaseUseBegin" }, + forced: true, + charlotte: true, + filter: function (event, player) { + return player.getExpansions("maihuo_effect").length > 0; }, - content:function(){ - 'step 0' - var cards=player.getExpansions('maihuo_effect'),card=cards[0]; - if(card.name!='sha') card=get.autoViewAs({ - name:'sha', - isCard:true, - },cards); - var target=player.storage.maihuo_target; - if(target.isIn()&&player.canUse(card,target,null,true)){ - player.useCard(card,target,cards); + content: function () { + "step 0"; + var cards = player.getExpansions("maihuo_effect"), + card = cards[0]; + if (card.name != "sha") + card = get.autoViewAs( + { + name: "sha", + isCard: true, + }, + cards + ); + var target = player.storage.maihuo_target; + if (target.isIn() && player.canUse(card, target, null, true)) { + player.useCard(card, target, cards); } - 'step 1' - player.removeSkill('maihuo_effect'); + ("step 1"); + player.removeSkill("maihuo_effect"); }, - marktext:'祸', - intro:{ - content:'expansion', - markcount:'expansion', + marktext: "祸", + intro: { + content: "expansion", + markcount: "expansion", }, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{threaten:1.05}, + ai: { threaten: 1.05 }, }, - damage:{ - trigger:{source:'damageSource'}, - forced:true, - locked:false, - filter:function(event,player){ - return event.player.hasSkill('maihuo_effect')&&event.player.getExpansions('maihuo_effect').length>0; + damage: { + trigger: { source: "damageSource" }, + forced: true, + locked: false, + filter: function (event, player) { + return ( + event.player.hasSkill("maihuo_effect") && + event.player.getExpansions("maihuo_effect").length > 0 + ); }, - content:function(){ - trigger.player.removeSkill('maihuo_effect'); + content: function () { + trigger.player.removeSkill("maihuo_effect"); }, }, }, }, - xuanbei:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:'enterGame', + xuanbei: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", }, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); + filter: function (event, player) { + return event.name != "phase" || game.phaseNumber == 0; }, - forced:true, - locked:false, - content:function(){ - var cards=[]; - while(cards.length<2){ - var card=get.cardPile2(function(i){ - return get.is.yingbian(i)&&!cards.includes(i); + forced: true, + locked: false, + content: function () { + var cards = []; + while (cards.length < 2) { + var card = get.cardPile2(function (i) { + return get.is.yingbian(i) && !cards.includes(i); }); - if(!card) break; + if (!card) break; else cards.push(card); } - if(cards.length) player.gain(cards,'gain2'); + if (cards.length) player.gain(cards, "gain2"); }, - group:'xuanbei_give', - subSkill:{ - give:{ - trigger:{player:'useCardAfter'}, - usable:1, - filter:function(event,player){ - return (event.card.yingbian||get.is.yingbian(event.card))&&event.cards.filterInD().length>0; + group: "xuanbei_give", + subSkill: { + give: { + trigger: { player: "useCardAfter" }, + usable: 1, + filter: function (event, player) { + return ( + (event.card.yingbian || get.is.yingbian(event.card)) && + event.cards.filterInD().length > 0 + ); }, - direct:true, - content:function(){ - 'step 0' - event.cards=trigger.cards.filterInD(); - player.chooseTarget(get.prompt('xuanbei'),'令一名其他角色获得'+get.translation(event.cards),lib.filter.notMe).set('ai',function(target){ - var att=get.attitude(_status.event.player,target); - if(att<3) return 0; - if(target.hasJudge('lebu')) att/=2; - if(target.hasSkillTag('nogain')) att/=10; - return att/(1+get.distance(player,target,'absolute')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('xuanbei_give',target); - target.gain(cards,'gain2').giver=player; - } - else player.storage.counttrigger.xuanbei_give--; + direct: true, + content: function () { + "step 0"; + event.cards = trigger.cards.filterInD(); + player + .chooseTarget( + get.prompt("xuanbei"), + "令一名其他角色获得" + get.translation(event.cards), + lib.filter.notMe + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + if (att < 3) return 0; + if (target.hasJudge("lebu")) att /= 2; + if (target.hasSkillTag("nogain")) att /= 10; + return att / (1 + get.distance(player, target, "absolute")); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.logSkill("xuanbei_give", target); + target.gain(cards, "gain2").giver = player; + } else player.storage.counttrigger.xuanbei_give--; }, - ai:{expose:0.1}, + ai: { expose: 0.1 }, }, }, }, - xianwan:{ - audio:2, - enable:'chooseToUse', - filter:function(event,player){ - return event.filterCard&&event.filterCard({ - name:'sha'+(player.isLinked()?'':'n'), - isCard:true, - },player,event); + xianwan: { + audio: 2, + enable: "chooseToUse", + filter: function (event, player) { + return ( + event.filterCard && + event.filterCard( + { + name: "sha" + (player.isLinked() ? "" : "n"), + isCard: true, + }, + player, + event + ) + ); }, - viewAs:function(cards,player){ + viewAs: function (cards, player) { return { - name:'sha'+(player.isLinked()?'':'n'), - isCard:true, + name: "sha" + (player.isLinked() ? "" : "n"), + isCard: true, }; }, - filterCard:()=>false, - selectCard:-1, - prompt:'将武将牌重置并视为使用【杀】', - log:false, - check:()=>1, - precontent:function(){ - player.logSkill('xianwan'); + filterCard: () => false, + selectCard: -1, + prompt: "将武将牌重置并视为使用【杀】", + log: false, + check: () => 1, + precontent: function () { + player.logSkill("xianwan"); player.link(); }, - ai:{ - order:3.4, - respondSha:true, - respondShan:true, - skillTagFilter:function(player,tag){ - return tag==('respondSha'+(player.isLinked()?'':'n')); + ai: { + order: 3.4, + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + return tag == "respondSha" + (player.isLinked() ? "" : "n"); }, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0&&!player.isLinked()) return 0.4; + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0 && !player.isLinked()) return 0.4; }, }, }, }, - recaiwang:{ - audio:'caiwang', - inherit:'caiwang', - group:['recaiwang_hand','recaiwang_equip','recaiwang_judge'], + recaiwang: { + audio: "caiwang", + inherit: "caiwang", + group: ["recaiwang_hand", "recaiwang_equip", "recaiwang_judge"], }, - recaiwang_hand:{ - audio:'caiwang', - enable:['chooseToUse','chooseToRespond'], - viewAsFilter:function(player){ - var js=player.getCards('h'); - return js.length==1&&game.checkMod(js[0],player,'unchanged','cardEnabled2',player); + recaiwang_hand: { + audio: "caiwang", + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter: function (player) { + var js = player.getCards("h"); + return ( + js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player) + ); }, - selectCard:-1, - filterCard:true, - position:'h', - prompt:'将全部手牌当做【闪】使用', - viewAs:{name:'shan'}, - check:(card)=>10-get.value(card), - ai:{ - order:1, - respondShan:true, - skillTagFilter:function(player){ - return player.countCards('h')==1; + selectCard: -1, + filterCard: true, + position: "h", + prompt: "将全部手牌当做【闪】使用", + viewAs: { name: "shan" }, + check: (card) => 10 - get.value(card), + ai: { + order: 1, + respondShan: true, + skillTagFilter: function (player) { + return player.countCards("h") == 1; }, }, }, - recaiwang_equip:{ - audio:'caiwang', - enable:['chooseToUse','chooseToRespond'], - viewAsFilter:function(player){ - var js=player.getCards('e'); - return js.length==1&&game.checkMod(js[0],player,'unchanged','cardEnabled2',player); + recaiwang_equip: { + audio: "caiwang", + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter: function (player) { + var js = player.getCards("e"); + return ( + js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player) + ); }, - selectCard:-1, - filterCard:true, - check:(card)=>9-get.value(card), - position:'e', - prompt:'将装备区的牌当做【无懈可击】使用', - viewAs:{name:'wuxie'}, - ai:{ - order:1, + selectCard: -1, + filterCard: true, + check: (card) => 9 - get.value(card), + position: "e", + prompt: "将装备区的牌当做【无懈可击】使用", + viewAs: { name: "wuxie" }, + ai: { + order: 1, }, }, - recaiwang_judge:{ - audio:'caiwang', - enable:['chooseToUse','chooseToRespond'], - viewAsFilter:function(player){ - var js=player.getCards('j'); - return js.length==1&&game.checkMod(js[0],player,'unchanged','cardEnabled2',player); + recaiwang_judge: { + audio: "caiwang", + enable: ["chooseToUse", "chooseToRespond"], + viewAsFilter: function (player) { + var js = player.getCards("j"); + return ( + js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player) + ); }, - selectCard:-1, - filterCard:true, - position:'j', - prompt:'将判定区的牌当做【杀】使用', - viewAs:{name:'sha'}, - check:(card)=>1, - locked:false, - ai:{ - order:10, - respondSha:true, - skillTagFilter:function(player){ - return player.countCards('j')==1; + selectCard: -1, + filterCard: true, + position: "j", + prompt: "将判定区的牌当做【杀】使用", + viewAs: { name: "sha" }, + check: (card) => 1, + locked: false, + ai: { + order: 10, + respondSha: true, + skillTagFilter: function (player) { + return player.countCards("j") == 1; }, - effect:{ - target:function(card,player,target,current){ - if(card&&(card.name=='shandian'||card.name=='fulei')&&player==target&&!target.countCards('j')&&target.isPhaseUsing()&&target.hasValueTarget({name:'sha'},null,true)) return [1,2]; + effect: { + target: function (card, player, target, current) { + if ( + card && + (card.name == "shandian" || card.name == "fulei") && + player == target && + !target.countCards("j") && + target.isPhaseUsing() && + target.hasValueTarget({ name: "sha" }, null, true) + ) + return [1, 2]; }, }, }, - mod:{ - aiOrder:function(player,card,num){ - if(card.name=='shandian'||card.name=='fulei') return num+3; + mod: { + aiOrder: function (player, card, num) { + if (card.name == "shandian" || card.name == "fulei") return num + 3; }, }, }, - caozhao:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - if(player.countCards('h')==0||!game.hasPlayer(function(current){ - return current!=player&¤t.hp<=player.hp; - })) return false; - var list=player.getStorage('caozhao'); - for(var i of lib.inpile){ - if(!list.includes(i)&&['basic','trick'].includes(get.type(i))) return true; + caozhao: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + if ( + player.countCards("h") == 0 || + !game.hasPlayer(function (current) { + return current != player && current.hp <= player.hp; + }) + ) + return false; + var list = player.getStorage("caozhao"); + for (var i of lib.inpile) { + if (!list.includes(i) && ["basic", "trick"].includes(get.type(i))) return true; } return false; }, - chooseButton:{ - dialog:function(event,player){ - var list=player.getStorage('caozhao'),vcards=[]; - for(var i of lib.inpile){ - if(!list.includes(i)){ - var type=get.type(i); - if(type=='basic'||type=='trick') vcards.push([type,'',i]); + chooseButton: { + dialog: function (event, player) { + var list = player.getStorage("caozhao"), + vcards = []; + for (var i of lib.inpile) { + if (!list.includes(i)) { + var type = get.type(i); + if (type == "basic" || type == "trick") vcards.push([type, "", i]); } } - return ui.create.dialog('草诏',[vcards,'vcard']); + return ui.create.dialog("草诏", [vcards, "vcard"]); }, - check:function(button){ - return _status.event.player.getUseValue({name:button.link[2],isCard:true},null,true); + check: function (button) { + return _status.event.player.getUseValue( + { name: button.link[2], isCard: true }, + null, + true + ); }, - backup:function(links,player){ + backup: function (links, player) { return { - audio:'caozhao', - cardname:links[0][2], - filterCard:true, - position:'h', - check:function(card){ - return player.getUseValue({name:lib.skill.caozhao_backup.cardname})-((player.getUseValue(card,null,true)+0.1)/(get.value(card)/6)); + audio: "caozhao", + cardname: links[0][2], + filterCard: true, + position: "h", + check: function (card) { + return ( + player.getUseValue({ name: lib.skill.caozhao_backup.cardname }) - + (player.getUseValue(card, null, true) + 0.1) / (get.value(card) / 6) + ); }, - filterTarget:function(card,player,target){ - return target!=player&&target.hp<=player.hp; + filterTarget: function (card, player, target) { + return target != player && target.hp <= player.hp; }, - discard:false, - lose:false, - content:function(){ - 'step 0' - player.showCards(cards,get.translation(player)+'发动【草诏】,声明'+get.translation(lib.skill.caozhao_backup.cardname)); - if(!player.storage.caozhao) player.storage.caozhao=[]; + discard: false, + lose: false, + content: function () { + "step 0"; + player.showCards( + cards, + get.translation(player) + + "发动【草诏】,声明" + + get.translation(lib.skill.caozhao_backup.cardname) + ); + if (!player.storage.caozhao) player.storage.caozhao = []; player.storage.caozhao.push(lib.skill.caozhao_backup.cardname); - 'step 1' - target.chooseControl().set('choiceList',[ - '令'+get.translation(player)+'将'+get.translation(cards[0])+'的牌名改为'+get.translation(lib.skill.caozhao_backup.cardname), - '失去1点体力', - ]).set('ai',function(event,player){ - var target=_status.event.getParent().player; - if(get.attitude(player,target)>0) return 0; - if(player.hp>3||(player.hp>1&&player.hasSkill('zhaxiang'))) return 1; - if(player.hp>2) return Math.random()>0.5?0:1; - return 0; - }); - 'step 2' - if(result.index==1){ + ("step 1"); + target + .chooseControl() + .set("choiceList", [ + "令" + + get.translation(player) + + "将" + + get.translation(cards[0]) + + "的牌名改为" + + get.translation(lib.skill.caozhao_backup.cardname), + "失去1点体力", + ]) + .set("ai", function (event, player) { + var target = _status.event.getParent().player; + if (get.attitude(player, target) > 0) return 0; + if (player.hp > 3 || (player.hp > 1 && player.hasSkill("zhaxiang"))) + return 1; + if (player.hp > 2) return Math.random() > 0.5 ? 0 : 1; + return 0; + }); + ("step 2"); + if (result.index == 1) { target.addExpose(0.2); target.loseHp(); event.finish(); + } else { + player + .chooseTarget( + "是否将" + + get.translation(lib.skill.caozhao_backup.cardname) + + "(" + + get.translation(cards[0]) + + ")交给一名其他角色?", + lib.filter.notMe + ) + .set("ai", () => -1); } - else{ - player.chooseTarget('是否将'+get.translation(lib.skill.caozhao_backup.cardname)+'('+get.translation(cards[0])+')交给一名其他角色?',lib.filter.notMe).set('ai',()=>-1); - } - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - if(!target.storage.caozhao_info) target.storage.caozhao_info={}; - target.storage.caozhao_info[cards[0].cardid]=lib.skill.caozhao_backup.cardname; - target.addSkill('caozhao_info'); - player.give(cards,target,'give').gaintag.add('caozhao'); - } - else{ - if(!player.storage.caozhao_info) player.storage.caozhao_info={}; - player.storage.caozhao_info[cards[0].cardid]=lib.skill.caozhao_backup.cardname; - player.addGaintag(cards,'caozhao'); - player.addSkill('caozhao_info'); + ("step 3"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + if (!target.storage.caozhao_info) target.storage.caozhao_info = {}; + target.storage.caozhao_info[cards[0].cardid] = + lib.skill.caozhao_backup.cardname; + target.addSkill("caozhao_info"); + player.give(cards, target, "give").gaintag.add("caozhao"); + } else { + if (!player.storage.caozhao_info) player.storage.caozhao_info = {}; + player.storage.caozhao_info[cards[0].cardid] = + lib.skill.caozhao_backup.cardname; + player.addGaintag(cards, "caozhao"); + player.addSkill("caozhao_info"); } }, - ai:{ - result:{ - player:2, - target:0.1, + ai: { + result: { + player: 2, + target: 0.1, }, }, - } + }; }, - prompt:function(links,player){ - return '将一张手牌声明为'+get.translation(links[0][2]); + prompt: function (links, player) { + return "将一张手牌声明为" + get.translation(links[0][2]); }, }, - ai:{ - order:1, - result:{ - player:1, + ai: { + order: 1, + result: { + player: 1, }, }, }, - caozhao_info:{ - charlotte:true, - mod:{ - cardname:function(card,player){ - var map=player.storage.caozhao_info; - if(map&&map[card.cardid]&&get.itemtype(card)=='card'&&card.hasGaintag('caozhao')) return map[card.cardid]; + caozhao_info: { + charlotte: true, + mod: { + cardname: function (card, player) { + var map = player.storage.caozhao_info; + if ( + map && + map[card.cardid] && + get.itemtype(card) == "card" && + card.hasGaintag("caozhao") + ) + return map[card.cardid]; }, - cardnature:function(card,player){ - var map=player.storage.caozhao_info; - if(map&&map[card.cardid]&&get.itemtype(card)=='card'&&card.hasGaintag('caozhao')) return false; + cardnature: function (card, player) { + var map = player.storage.caozhao_info; + if ( + map && + map[card.cardid] && + get.itemtype(card) == "card" && + card.hasGaintag("caozhao") + ) + return false; }, }, }, - olxibing:{ - audio:2, - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.player&&event.source&&event.player!=event.source&&event.player.isAlive()&&event.source.isAlive()&&(event.player.countCards('he')>0||event.source.countCards('he')>0); + olxibing: { + audio: 2, + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + event.player && + event.source && + event.player != event.source && + event.player.isAlive() && + event.source.isAlive() && + (event.player.countCards("he") > 0 || event.source.countCards("he") > 0) + ); }, - direct:true, - content:function(){ - 'step 0' - var target=trigger.source; - event.target=target; - player.chooseTarget(get.prompt('olxibing'),'弃置自己或'+get.translation(target)+'的两张牌,然后手牌数较少的角色摸两张牌且不能对你使用牌直到回合结束',function(card,player,target){ - if(target!=player&&target!=_status.event.target) return false; - return target.countCards('he')>0; - }).set('target',target).set('ai',function(targetx){ - var player=_status.event.player,target=_status.event.target; - if(target==targetx){ - if(get.attitude(player,target)>0) return 0; - var cards=target.getCards('he',function(card){ - return lib.filter.canBeDiscarded(card,player,target); - }).sort(function(a,b){ - return get.buttonValue(b)-get.buttonValue(a); - }); - if((target.countCards('h')-player.countCards('h'))>=Math.max(0,Math.min(2,cards.length)-target.countCards('e',function(card){ - var index=cards.indexOf(card); - return index!=-1&&index<2; - }))) return 1; + direct: true, + content: function () { + "step 0"; + var target = trigger.source; + event.target = target; + player + .chooseTarget( + get.prompt("olxibing"), + "弃置自己或" + + get.translation(target) + + "的两张牌,然后手牌数较少的角色摸两张牌且不能对你使用牌直到回合结束", + function (card, player, target) { + if (target != player && target != _status.event.target) return false; + return target.countCards("he") > 0; + } + ) + .set("target", target) + .set("ai", function (targetx) { + var player = _status.event.player, + target = _status.event.target; + if (target == targetx) { + if (get.attitude(player, target) > 0) return 0; + var cards = target + .getCards("he", function (card) { + return lib.filter.canBeDiscarded(card, player, target); + }) + .sort(function (a, b) { + return get.buttonValue(b) - get.buttonValue(a); + }); + if ( + target.countCards("h") - player.countCards("h") >= + Math.max( + 0, + Math.min(2, cards.length) - + target.countCards("e", function (card) { + var index = cards.indexOf(card); + return index != -1 && index < 2; + }) + ) + ) + return 1; + return 0; + } + var cards = player + .getCards("he", function (card) { + return lib.filter.cardDiscardable(card, player, "olxibing"); + }) + .sort(function (a, b) { + return get.useful(a) - get.useful(b); + }); + if ( + player.countCards("h") - target.countCards("h") < + Math.max( + 0, + Math.min(cards.length, 2) - + player.countCards("e", function (card) { + var index = cards.indexOf(card); + return index != -1 && index < 2; + }) + ) && + (cards.length < 2 || get.value(cards[1]) < 5.5) + ) + return 0.8; return 0; - } - var cards=player.getCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'olxibing') - }).sort(function(a,b){ - return get.useful(a)-get.useful(b); }); - if(player.countCards('h')-target.countCards('h')ts?target:player; + ("step 1"); + if (result.bool) { + player.logSkill("olxibing", target); + var target = result.targets[0]; + if (target == player) player.chooseToDiscard("he", 2, true); + else player.discardPlayerCard(target, "he", true, 2); + } else event.finish(); + ("step 2"); + if (player.isIn() && target.isIn()) { + var hs = player.countCards("h"), + ts = target.countCards("h"); + if (hs != ts) { + var drawer = hs > ts ? target : player; drawer.draw(2); - player.addTempSkill('olxibing2'); - player.markAuto('olxibing2',[drawer]); + player.addTempSkill("olxibing2"); + player.markAuto("olxibing2", [drawer]); } } }, }, - olxibing2:{ - mod:{ - targetEnabled:function(card,player,target){ - if(target.getStorage('olxibing2').includes(player)) return false; + olxibing2: { + mod: { + targetEnabled: function (card, player, target) { + if (target.getStorage("olxibing2").includes(player)) return false; }, - cardSavable:function(card,player,target){ - if(target.getStorage('olxibing2').includes(player)) return false; + cardSavable: function (card, player, target) { + if (target.getStorage("olxibing2").includes(player)) return false; }, }, - onremove:true, + onremove: true, }, - bolan:{ - audio:2, - banned:['kotomi_chuanxiang'], - global:'bolan_g', - initList:function(player){ - var list,skills=[]; - if(get.mode()=='guozhan'){ - list=[]; - for(var i in lib.characterPack.mode_guozhan){ - if(lib.character[i])list.push(i); + bolan: { + audio: 2, + banned: ["kotomi_chuanxiang"], + global: "bolan_g", + initList: function (player) { + var list, + skills = []; + if (get.mode() == "guozhan") { + list = []; + for (var i in lib.characterPack.mode_guozhan) { + if (lib.character[i]) list.push(i); } - } - else if(_status.connectMode) list=get.charactersOL(); + } else if (_status.connectMode) list = get.charactersOL(); else { - list=[]; - for(var i in lib.character){ - if(lib.filter.characterDisabled2(i)||lib.filter.characterDisabled(i)) continue; + list = []; + for (var i in lib.character) { + if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; list.push(i); } } - for(var i of list){ - if(i.indexOf('gz_jun')==0) continue; - for(var j of lib.character[i][3]){ - if(j=='bolan') continue; - var skill=lib.skill[j]; - if(!skill||skill.juexingji||skill.hiddenSkill||skill.zhuSkill||skill.dutySkill||skill.chargeSkill||lib.skill.bolan.banned.includes(j)) continue; - if(skill.init||skill.ai&&(skill.ai.combo||skill.ai.notemp||skill.ai.neg)) continue; - var info=lib.translate[j+'_info']; - if(info&&info.indexOf('出牌阶段限一次')!=-1) skills.add(j); + for (var i of list) { + if (i.indexOf("gz_jun") == 0) continue; + for (var j of lib.character[i][3]) { + if (j == "bolan") continue; + var skill = lib.skill[j]; + if ( + !skill || + skill.juexingji || + skill.hiddenSkill || + skill.zhuSkill || + skill.dutySkill || + skill.chargeSkill || + lib.skill.bolan.banned.includes(j) + ) + continue; + if ( + skill.init || + (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg)) + ) + continue; + var info = lib.translate[j + "_info"]; + if (info && info.indexOf("出牌阶段限一次") != -1) skills.add(j); } } - player.storage.bolan=skills; + player.storage.bolan = skills; }, - check:function(event,player){ + check: function (event, player) { return true; }, - trigger:{player:'phaseUseBegin'}, - frequent:true, - preHidden:true, - content:function(){ - 'step 0' - if(player.isIn()){ - if(!player.storage.bolan) lib.skill.bolan.initList(player); - var list=player.storage.bolan.randomGets(3); - if(!list.length){ + trigger: { player: "phaseUseBegin" }, + frequent: true, + preHidden: true, + content: function () { + "step 0"; + if (player.isIn()) { + if (!player.storage.bolan) lib.skill.bolan.initList(player); + var list = player.storage.bolan.randomGets(3); + if (!list.length) { event.finish(); return; } - player.chooseControl(list).set('choiceList',list.map(function(i){ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; - })).set('displayIndex',false).set('prompt','博览:请选择你要获得的技能').set('ai',()=>{ - var list=_status.event.controls.slice(); - return list.sort((a,b)=>{ - return get.skillRank(b,'in')-get.skillRank(a,'in'); - })[0]; - }); - } - else event.finish(); - 'step 1' - player.addTempSkills(result.control,'phaseUseEnd'); + player + .chooseControl(list) + .set( + "choiceList", + list.map(function (i) { + return ( + '
    【' + + get.translation( + lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set("prompt", "博览:请选择你要获得的技能") + .set("ai", () => { + var list = _status.event.controls.slice(); + return list.sort((a, b) => { + return get.skillRank(b, "in") - get.skillRank(a, "in"); + })[0]; + }); + } else event.finish(); + ("step 1"); + player.addTempSkills(result.control, "phaseUseEnd"); player.popup(result.control); // game.log(player,'获得了','#g【'+get.translation(result.control)+'】'); }, - ai:{threaten:0.9}, - subSkill:{ - g:{ - audio:'bolan', - forceaudio:true, - enable:'phaseUse', - usable:1, - prompt:'出牌阶段限一次。你可以令一名有〖博览〗的角色从三个描述中包含“出牌阶段限一次”的技能中选择一个,你获得此技能直到此阶段结束。', - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.hasSkill('bolan'); + ai: { threaten: 0.9 }, + subSkill: { + g: { + audio: "bolan", + forceaudio: true, + enable: "phaseUse", + usable: 1, + prompt: "出牌阶段限一次。你可以令一名有〖博览〗的角色从三个描述中包含“出牌阶段限一次”的技能中选择一个,你获得此技能直到此阶段结束。", + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.hasSkill("bolan"); }); }, - filterTarget:function(card,player,target){ - return player!=target&&target.hasSkill('bolan'); + filterTarget: function (card, player, target) { + return player != target && target.hasSkill("bolan"); }, - selectTarget:function(){ - if(game.countPlayer(current=>{ - return lib.skill.bolan_g.filterTarget(null,_status.event.player,current); - })==1) return -1; + selectTarget: function () { + if ( + game.countPlayer((current) => { + return lib.skill.bolan_g.filterTarget( + null, + _status.event.player, + current + ); + }) == 1 + ) + return -1; return 1; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.loseHp(); - 'step 1' - if(target.isIn()&&player.isIn()){ - if(!target.storage.bolan) lib.skill.bolan.initList(target); - var list=target.storage.bolan.randomGets(3); - if(!list.length){ + ("step 1"); + if (target.isIn() && player.isIn()) { + if (!target.storage.bolan) lib.skill.bolan.initList(target); + var list = target.storage.bolan.randomGets(3); + if (!list.length) { event.finish(); return; } - target.chooseControl(list).set('choiceList',list.map(function(i){ - return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; - })).set('displayIndex',false).set('prompt','博览:请选择令'+get.translation(player)+'获得的技能').set('ai',()=>{ - var list=_status.event.controls.slice(); - return list.sort((a,b)=>{ - return (get.skillRank(b,'in')-get.skillRank(a,'in'))*get.attitude(_status.event.player,_status.event.getParent().player); - })[0]; - }); - } - else event.finish(); - 'step 2' + target + .chooseControl(list) + .set( + "choiceList", + list.map(function (i) { + return ( + '
    【' + + get.translation( + lib.translate[i + "_ab"] || get.translation(i).slice(0, 2) + ) + + "】
    " + + get.skillInfoTranslation(i, player) + + "
    " + ); + }) + ) + .set("displayIndex", false) + .set("prompt", "博览:请选择令" + get.translation(player) + "获得的技能") + .set("ai", () => { + var list = _status.event.controls.slice(); + return list.sort((a, b) => { + return ( + (get.skillRank(b, "in") - get.skillRank(a, "in")) * + get.attitude( + _status.event.player, + _status.event.getParent().player + ) + ); + })[0]; + }); + } else event.finish(); + ("step 2"); target.line(player); - player.addTempSkills(result.control,'phaseUseEnd'); + player.addTempSkills(result.control, "phaseUseEnd"); player.popup(result.control); }, - ai:{ - order:function(item,player){ - if(player.hp>=5||player.countCards('h')>=10) return 10; - var list=game.filterPlayer(current=>lib.skill.bolan_g.filterTarget(null,player,current)); - for(var target of list){ - if(get.attitude(target,player)>0) return 10; + ai: { + order: function (item, player) { + if (player.hp >= 5 || player.countCards("h") >= 10) return 10; + var list = game.filterPlayer((current) => + lib.skill.bolan_g.filterTarget(null, player, current) + ); + for (var target of list) { + if (get.attitude(target, player) > 0) return 10; } return 4; }, - result:{ - player:function(player,target){ - if(player.hasUnknown()) return player.hp+player.countCards('h')/4-5>0?1:0; - var tao=player.countCards('h','tao'); - if(player.hp+tao>4) return 4+get.attitude(player,target); - if(player.hp+tao>3) return get.attitude(player,target)-2; + result: { + player: function (player, target) { + if (player.hasUnknown()) + return player.hp + player.countCards("h") / 4 - 5 > 0 ? 1 : 0; + var tao = player.countCards("h", "tao"); + if (player.hp + tao > 4) return 4 + get.attitude(player, target); + if (player.hp + tao > 3) return get.attitude(player, target) - 2; return 0; }, }, }, - } - } - }, - yifa:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - return player!=event.player&&(event.card.name=='sha'|| - get.color(event.card)=='black'&&get.type(event.card)=='trick'); - }, - content:function(){ - var target=trigger.player; - target.addTempSkill('yifa2',{player:'phaseEnd'}); - target.addMark('yifa2',1,false); - }, - ai:{threaten:0.8}, - }, - yifa2:{ - charlotte:true, - onremove:true, - intro:{content:'手牌上限-#'}, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('yifa2'); }, }, }, - buchen:{ - audio:2, - trigger:{player:'showCharacterAfter'}, - hiddenSkill:true, - filter:function(event,player){ - var target=_status.currentPhase; - return event.toShow.includes('jin_simayi')&&target&&target!=player&&target.countGainableCards(player,'he')>0; + yifa: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + return ( + player != event.player && + (event.card.name == "sha" || + (get.color(event.card) == "black" && get.type(event.card) == "trick")) + ); }, - direct:true, - content:function(){ - var target=_status.currentPhase; - player.gainPlayerCard(target,'he',get.prompt('buchen',target)).set('logSkill',['buchen',target]); + content: function () { + var target = trigger.player; + target.addTempSkill("yifa2", { player: "phaseEnd" }); + target.addMark("yifa2", 1, false); + }, + ai: { threaten: 0.8 }, + }, + yifa2: { + charlotte: true, + onremove: true, + intro: { content: "手牌上限-#" }, + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("yifa2"); + }, }, }, - smyyingshi:{ - audio:2, - enable:'phaseUse', - locked:true, - filter:function(event,player){ + buchen: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + filter: function (event, player) { + var target = _status.currentPhase; + return ( + event.toShow.includes("jin_simayi") && + target && + target != player && + target.countGainableCards(player, "he") > 0 + ); + }, + direct: true, + content: function () { + var target = _status.currentPhase; + player + .gainPlayerCard(target, "he", get.prompt("buchen", target)) + .set("logSkill", ["buchen", target]); + }, + }, + smyyingshi: { + audio: 2, + enable: "phaseUse", + locked: true, + filter: function (event, player) { return Array.isArray(event.smyyingshi); }, - onChooseToUse:function(event){ - if(game.online||!event.player.hasSkill('smyyingshi')) return; - var cards=[]; - for(var i=0;i0; + return evts && evts.length == 1 && evts[0].hs.length > 0; }, - filter:function(event,player){ - var phase=event.getParent('phaseUse'); - if(!phase||phase.player!=player) return false; - var suit=get.suit(event.card); - if(!lib.suit.includes(suit)||!lib.skill.quanbian.hasHand(event)) return false; - return player.getHistory('useCard',function(evt){ - return evt!=event&&get.suit(evt.card)==suit&&lib.skill.quanbian.hasHand(evt)&&evt.getParent('phaseUse')==phase; - }).length+player.getHistory('respond',function(evt){ - return evt!=event&&get.suit(evt.card)==suit&&lib.skill.quanbian.hasHand(evt)&&evt.getParent('phaseUse')==phase; - }).length==0; + filter: function (event, player) { + var phase = event.getParent("phaseUse"); + if (!phase || phase.player != player) return false; + var suit = get.suit(event.card); + if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false; + return ( + player.getHistory("useCard", function (evt) { + return ( + evt != event && + get.suit(evt.card) == suit && + lib.skill.quanbian.hasHand(evt) && + evt.getParent("phaseUse") == phase + ); + }).length + + player.getHistory("respond", function (evt) { + return ( + evt != event && + get.suit(evt.card) == suit && + lib.skill.quanbian.hasHand(evt) && + evt.getParent("phaseUse") == phase + ); + }).length == + 0 + ); }, - direct:true, - content:function(){ - 'step 0' - player.chooseControl('cancel2').set('prompt',get.prompt('quanbian')).set('choiceList',[ - '摸一张牌', - '观看牌堆顶的'+get.cnNumber(player.maxHp)+'张牌并将其中一张置于牌堆底', - ]).set('ai',function(){ - var player=_status.event.player; - var suit=get.suit(_status.event.getTrigger().card); - if(player.countCards('h',function(card){ - return get.suit(card)==suit&&player.hasValueTarget(card,null,true); - })) return 'cancel2'; - return 0; - }); - 'step 1' - if(result.control=='cancel2'){ + direct: true, + content: function () { + "step 0"; + player + .chooseControl("cancel2") + .set("prompt", get.prompt("quanbian")) + .set("choiceList", [ + "摸一张牌", + "观看牌堆顶的" + get.cnNumber(player.maxHp) + "张牌并将其中一张置于牌堆底", + ]) + .set("ai", function () { + var player = _status.event.player; + var suit = get.suit(_status.event.getTrigger().card); + if ( + player.countCards("h", function (card) { + return get.suit(card) == suit && player.hasValueTarget(card, null, true); + }) + ) + return "cancel2"; + return 0; + }); + ("step 1"); + if (result.control == "cancel2") { event.finish(); return; } - player.addTempSkill('quanbian2'); + player.addTempSkill("quanbian2"); player.storage.quanbian2.add(get.suit(trigger.card)); - player.markSkill('quanbian2'); - if(result.index==0){ + player.markSkill("quanbian2"); + if (result.index == 0) { player.draw(); event.finish(); return; } - event.cards=get.cards(player.maxHp); - player.chooseButton(['将一张牌置于牌堆底',event.cards],true); - 'step 2' - while(cards.length){ - var card=cards.pop(); + event.cards = get.cards(player.maxHp); + player.chooseButton(["将一张牌置于牌堆底", event.cards], true); + ("step 2"); + while (cards.length) { + var card = cards.pop(); card.fix(); - if(card==result.links[0]) ui.cardPile.appendChild(card); - else ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + if (card == result.links[0]) ui.cardPile.appendChild(card); + else ui.cardPile.insertBefore(card, ui.cardPile.firstChild); } game.updateRoundNumber(); }, }, - quanbian2:{ - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; + quanbian2: { + init: function (player, skill) { + if (!player.storage[skill]) player.storage[skill] = []; }, - onremove:true, - mod:{ - cardEnabled2:function(card,player){ - if(get.position(card)=='h'&&player.storage.quanbian2.includes(get.suit(card))) return false; + onremove: true, + mod: { + cardEnabled2: function (card, player) { + if (get.position(card) == "h" && player.storage.quanbian2.includes(get.suit(card))) + return false; }, }, - intro:{ - content:'本回合内不能使用$花色的手牌', + intro: { + content: "本回合内不能使用$花色的手牌", }, }, //卫瓘 - zhongyun:{ - audio:2, - trigger:{player:['damageEnd','recoverEnd']}, - forced:true, - filter:function(event,player){ - return player.hp==player.countCards('h')&&(player.isDamaged()||game.hasPlayer(function(current){ - return player.inRange(current); - })); + zhongyun: { + audio: 2, + trigger: { player: ["damageEnd", "recoverEnd"] }, + forced: true, + filter: function (event, player) { + return ( + player.hp == player.countCards("h") && + (player.isDamaged() || + game.hasPlayer(function (current) { + return player.inRange(current); + })) + ); }, - usable:1, - preHidden:['zhongyun2'], - content:function(){ - 'step 0' - var filterTarget=function(card,player,target){ + usable: 1, + preHidden: ["zhongyun2"], + content: function () { + "step 0"; + var filterTarget = function (card, player, target) { return player.inRange(target); }; - if(game.hasPlayer((current)=>filterTarget('L∞pers',player,current))){ - var bool=player.isHealthy(); - player.chooseTarget('忠允:对攻击范围内的一名角色造成1点伤害'+(bool?'':',或点取消回复1点体力'),filterTarget,bool).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - } - else event._result={bool:false}; - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); + if (game.hasPlayer((current) => filterTarget("L∞pers", player, current))) { + var bool = player.isHealthy(); + player + .chooseTarget( + "忠允:对攻击范围内的一名角色造成1点伤害" + + (bool ? "" : ",或点取消回复1点体力"), + filterTarget, + bool + ) + .set("ai", function (target) { + var player = _status.event.player; + return get.damageEffect(target, player, player); + }); + } else event._result = { bool: false }; + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); target.damage(); - } - else player.recover(); + } else player.recover(); }, - group:'zhongyun2', + group: "zhongyun2", }, - zhongyun2:{ - audio:'zhongyun', - trigger:{ - player:['loseAfter'], - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + zhongyun2: { + audio: "zhongyun", + trigger: { + player: ["loseAfter"], + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - filter:function(event,player){ - var cards1=event.getl(player).hs,cards2=[]; - if(event.getg) cards2=event.getg(player); - return (cards1.length>0||cards2.length>0)&&player.countCards('h')==player.hp; + forced: true, + filter: function (event, player) { + var cards1 = event.getl(player).hs, + cards2 = []; + if (event.getg) cards2 = event.getg(player); + return (cards1.length > 0 || cards2.length > 0) && player.countCards("h") == player.hp; }, - usable:1, - content:function(){ - 'step 0' - if(trigger.delay===false) game.delayx(); - var filterTarget=function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'he')>0; - } - if(!game.hasPlayer((current)=>filterTarget('L∞pers',player,current))) event._result={bool:false}; - else player.chooseTarget(filterTarget,'忠允:弃置一名其他角色的一张牌,或点取消摸一张牌').set('ai',function(target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - if(target.countCards('he',function(card){ - return get.value(card)>5; - })) return -att; - return 0; - }); - 'step 1' - if(!result.bool) player.draw(); - else{ - var target=result.targets[0]; - player.line(target,'green'); - player.discardPlayerCard(target,true,'he'); + usable: 1, + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + var filterTarget = function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }; + if (!game.hasPlayer((current) => filterTarget("L∞pers", player, current))) + event._result = { bool: false }; + else + player + .chooseTarget(filterTarget, "忠允:弃置一名其他角色的一张牌,或点取消摸一张牌") + .set("ai", function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + return 0; + }); + ("step 1"); + if (!result.bool) player.draw(); + else { + var target = result.targets[0]; + player.line(target, "green"); + player.discardPlayerCard(target, true, "he"); } }, }, - shenpin:{ - audio:2, - trigger:{global:'judge'}, - filter:function(event,player){ - var color=get.color(event.player.judging[0],event.player); - return player.countCards('hes',function(card){ - if(_status.connectMode&&get.position(card)!='e') return true; - return get.color(card)!=color; - })>0; + shenpin: { + audio: 2, + trigger: { global: "judge" }, + filter: function (event, player) { + var color = get.color(event.player.judging[0], event.player); + return ( + player.countCards("hes", function (card) { + if (_status.connectMode && get.position(card) != "e") return true; + return get.color(card) != color; + }) > 0 + ); }, - direct:true, - preHidden:true, - content:function(){ - "step 0" - var color=get.color(trigger.player.judging[0],trigger.player); - player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ - get.translation(trigger.player.judging[0])+','+get.prompt('shenpin'),'hes',function(card){ - if(get.color(card)==_status.event.color) return false; - var player=_status.event.player; - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod2!='unchanged') return mod2; - var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); - if(mod!='unchanged') return mod; - return true; - }).set('ai',function(card){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0; - if(attitude>0){ - return result; - } - else{ - return -result; - } - }).set('judging',trigger.player.judging[0]).set('color',color).setHiddenSkill(event.name); - "step 1" - if(result.bool){ - player.respond(result.cards,'highlight','shenpin','noOrdering'); - } - else{ + direct: true, + preHidden: true, + content: function () { + "step 0"; + var color = get.color(trigger.player.judging[0], trigger.player); + player + .chooseCard( + get.translation(trigger.player) + + "的" + + (trigger.judgestr || "") + + "判定为" + + get.translation(trigger.player.judging[0]) + + "," + + get.prompt("shenpin"), + "hes", + function (card) { + if (get.color(card) == _status.event.color) return false; + var player = _status.event.player; + var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + } + ) + .set("ai", function (card) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + var judging = _status.event.judging; + var result = trigger.judge(card) - trigger.judge(judging); + var attitude = get.attitude(player, trigger.player); + if (attitude == 0 || result == 0) return 0; + if (attitude > 0) { + return result; + } else { + return -result; + } + }) + .set("judging", trigger.player.judging[0]) + .set("color", color) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + player.respond(result.cards, "highlight", "shenpin", "noOrdering"); + } else { event.finish(); } - "step 2" - if(result.bool){ - if(trigger.player.judging[0].clone){ - trigger.player.judging[0].clone.classList.remove('thrownhighlight'); - game.broadcast(function(card){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); + ("step 2"); + if (result.bool) { + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); } - },trigger.player.judging[0]); - game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); + }, trigger.player.judging[0]); + game.addVideo( + "deletenode", + player, + get.cardsInfo([trigger.player.judging[0].clone]) + ); } game.cardsDiscard(trigger.player.judging[0]); - trigger.player.judging[0]=result.cards[0]; + trigger.player.judging[0] = result.cards[0]; trigger.orderingCards.addArray(result.cards); - game.log(trigger.player,'的判定牌改为',result.cards[0]); + game.log(trigger.player, "的判定牌改为", result.cards[0]); game.delay(2); } }, - ai:{ - rejudge:true, - tag:{ - rejudge:1 - } - } + ai: { + rejudge: true, + tag: { + rejudge: 1, + }, + }, }, //彻里吉 - chexuan:{ - audio:2, - enable:'phaseUse', - derivation:['cheliji_sichengliangyu','cheliji_tiejixuanyu','cheliji_feilunzhanyu'], - filter:function(event,player){ - return !player.getEquips(5).length&&player.countCards('he',{color:'black'})>0; + chexuan: { + audio: 2, + enable: "phaseUse", + derivation: ["cheliji_sichengliangyu", "cheliji_tiejixuanyu", "cheliji_feilunzhanyu"], + filter: function (event, player) { + return !player.getEquips(5).length && player.countCards("he", { color: "black" }) > 0; }, - filterCard:{color:'black'}, - position:'he', - check:function(card){ - return 5-get.value(card); + filterCard: { color: "black" }, + position: "he", + check: function (card) { + return 5 - get.value(card); }, - content:function(){ - 'step 0' - player.chooseButton(['请选择要装备的宝物',[lib.skill.chexuan.derivation.map(function(i){ - return ['宝物','',i]; - }),'vcard']],true).set('ai',function(button){ - if(button.link[2]=='cheliji_sichengliangyu'&&player.countCards('h')0&&player.getEquip('cheliji_tiejixuanyu'); + cheliji_tiejixuanyu: { + trigger: { global: "phaseJieshuBegin" }, + equipSkill: true, + filter: function (event, player) { + return ( + player != event.player && + !event.player.getHistory("sourceDamage").length && + event.player.countCards("he") > 0 && + player.getEquip("cheliji_tiejixuanyu") + ); }, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)<0; + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) < 0; }, - content:function(){ - 'step 0' - trigger.player.chooseToDiscard('he',2,true); - 'step 1' - var card=player.getEquip('cheliji_tiejixuanyu'); - if(card) player.discard(card); + content: function () { + "step 0"; + trigger.player.chooseToDiscard("he", 2, true); + ("step 1"); + var card = player.getEquip("cheliji_tiejixuanyu"); + if (card) player.discard(card); }, }, - cheliji_feilunzhanyu:{ - trigger:{global:'phaseJieshuBegin'}, - equipSkill:true, - filter:function(event,player){ - return player!=event.player&&event.player.getHistory('useCard',function(card){ - return get.type(card.card)!='basic'; - }).length>0&&event.player.countCards('he')>0&&player.getEquip('cheliji_feilunzhanyu'); + cheliji_feilunzhanyu: { + trigger: { global: "phaseJieshuBegin" }, + equipSkill: true, + filter: function (event, player) { + return ( + player != event.player && + event.player.getHistory("useCard", function (card) { + return get.type(card.card) != "basic"; + }).length > 0 && + event.player.countCards("he") > 0 && + player.getEquip("cheliji_feilunzhanyu") + ); }, - logTarget:'player', - check:function(event,player){ - return get.attitude(player,event.player)<=0; + logTarget: "player", + check: function (event, player) { + return get.attitude(player, event.player) <= 0; }, - content:function(){ - 'step 0' - trigger.player.chooseCard('he',true,'将一张牌交给'+get.translation(player)); - 'step 1' - if(result.bool) trigger.player.give(result.cards,player); - 'step 2' - var card=player.getEquip('cheliji_feilunzhanyu'); - if(card) player.discard(card); + content: function () { + "step 0"; + trigger.player.chooseCard("he", true, "将一张牌交给" + get.translation(player)); + ("step 1"); + if (result.bool) trigger.player.give(result.cards, player); + ("step 2"); + var card = player.getEquip("cheliji_feilunzhanyu"); + if (card) player.discard(card); }, }, //司马伷和黄祖 - caiwang:{ - audio:2, - trigger:{global:['useCard','respond']}, - preHidden:true, - filter:function(event,player){ - if(!Array.isArray(event.respondTo)||event.respondTo[0]==event.player||![event.respondTo[0],event.player].includes(player)) return false; - var color=get.color(event.card); - if(color=='none'||get.color(event.respondTo[1])!=color) return false; - var target=lib.skill.caiwang.logTarget(event,player); - return target[player.getStorage('naxiang2').includes(target)?'countGainableCards':'countDiscardableCards'](player,'he')>0 + caiwang: { + audio: 2, + trigger: { global: ["useCard", "respond"] }, + preHidden: true, + filter: function (event, player) { + if ( + !Array.isArray(event.respondTo) || + event.respondTo[0] == event.player || + ![event.respondTo[0], event.player].includes(player) + ) + return false; + var color = get.color(event.card); + if (color == "none" || get.color(event.respondTo[1]) != color) return false; + var target = lib.skill.caiwang.logTarget(event, player); + return ( + target[ + player.getStorage("naxiang2").includes(target) + ? "countGainableCards" + : "countDiscardableCards" + ](player, "he") > 0 + ); }, - logTarget:function(event,player){ - return (player==event.respondTo[0]?event.player:event.respondTo[0]); + logTarget: function (event, player) { + return player == event.respondTo[0] ? event.player : event.respondTo[0]; }, - prompt2:function(event,player){ - var target=lib.skill.caiwang.logTarget(event,player); - return (player.getStorage('naxiang2').includes(target)?'获得':'弃置')+'该角色的一张牌'; + prompt2: function (event, player) { + var target = lib.skill.caiwang.logTarget(event, player); + return ( + (player.getStorage("naxiang2").includes(target) ? "获得" : "弃置") + "该角色的一张牌" + ); }, - check:function(event,player){ - return get.attitude(player,lib.skill.caiwang.logTarget(event,player))<=0; + check: function (event, player) { + return get.attitude(player, lib.skill.caiwang.logTarget(event, player)) <= 0; }, - popup:false, - content:function(){ - 'step 0' - if(player!=game.me&&!player.isOnline()) game.delayx(); - 'step 1' - var target=lib.skill.caiwang.logTarget(trigger,player); - player.logSkill(event.name,target); - player[player.getStorage('naxiang2').includes(target)?'gainPlayerCard':'discardPlayerCard'](target,'he',true); + popup: false, + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + ("step 1"); + var target = lib.skill.caiwang.logTarget(trigger, player); + player.logSkill(event.name, target); + player[ + player.getStorage("naxiang2").includes(target) + ? "gainPlayerCard" + : "discardPlayerCard" + ](target, "he", true); }, }, - naxiang:{ - audio:2, - trigger:{ - player:'damageEnd', - source:'damageSource', + naxiang: { + audio: 2, + trigger: { + player: "damageEnd", + source: "damageSource", }, - forced:true, - preHidden:true, - filter:function(event,player){ - var target=lib.skill.naxiang.logTarget(event,player); - return target&&target!=player&&target.isAlive(); + forced: true, + preHidden: true, + filter: function (event, player) { + var target = lib.skill.naxiang.logTarget(event, player); + return target && target != player && target.isAlive(); }, - logTarget:function(event,player){ - return player==event.player?event.source:event.player; + logTarget: function (event, player) { + return player == event.player ? event.source : event.player; }, - content:function(){ - player.addTempSkill('naxiang2',{player:'phaseBegin'}); - if(!player.storage.naxiang2) player.storage.naxiang2=[]; - player.storage.naxiang2.add(lib.skill.naxiang.logTarget(trigger,player)); - player.markSkill('naxiang2'); + content: function () { + player.addTempSkill("naxiang2", { player: "phaseBegin" }); + if (!player.storage.naxiang2) player.storage.naxiang2 = []; + player.storage.naxiang2.add(lib.skill.naxiang.logTarget(trigger, player)); + player.markSkill("naxiang2"); }, - ai:{ - combo:'caiwang', + ai: { + combo: "caiwang", }, }, - naxiang2:{ - onremove:true, - intro:{ - content:'已接受$的投降;对这些角色发动【才望】时将“弃置”改为“获得”', + naxiang2: { + onremove: true, + intro: { + content: "已接受$的投降;对这些角色发动【才望】时将“弃置”改为“获得”", }, }, //李肃 - qiaoyan:{ - trigger:{player:'damageBegin2'}, - forced:true, - filter:function(event,player){ - return player!=_status.currentPhase&&event.source&&event.source!=player; + qiaoyan: { + trigger: { player: "damageBegin2" }, + forced: true, + filter: function (event, player) { + return player != _status.currentPhase && event.source && event.source != player; }, - logTarget:'source', - content:function(){ - 'step 0' - var cards=player.getExpansions('qiaoyan'); - if(cards.length){ - var source=trigger.source; - source.gain(cards,player,'give','bySelf'); + logTarget: "source", + content: function () { + "step 0"; + var cards = player.getExpansions("qiaoyan"); + if (cards.length) { + var source = trigger.source; + source.gain(cards, player, "give", "bySelf"); event.finish(); - } - else{ + } else { trigger.cancel(); player.draw(); } - 'step 1' - var hs=player.getCards('he'); - if(!hs.length) event.finish(); - else if(hs.length==1) event._result={bool:true,cards:hs}; - else player.chooseCard('he',true,'将一张牌作为“珠”置于武将牌上'); - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ - var cards=result.cards; - player.addToExpansion(cards,player,'give').gaintag.add('qiaoyan'); + ("step 1"); + var hs = player.getCards("he"); + if (!hs.length) event.finish(); + else if (hs.length == 1) event._result = { bool: true, cards: hs }; + else player.chooseCard("he", true, "将一张牌作为“珠”置于武将牌上"); + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + var cards = result.cards; + player.addToExpansion(cards, player, "give").gaintag.add("qiaoyan"); } event.finish(); }, - marktext:'珠', - intro:{content:'expansion',markcount:'expansion'}, - onremove:function(player,skill){ - var cards=player.getExpansions(skill); - if(cards.length) player.loseToDiscardpile(cards); + marktext: "珠", + intro: { content: "expansion", markcount: "expansion" }, + onremove: function (player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); }, - ai:{ - filterDamage:true, - skillTagFilter:function(player,tag,arg){ - if(!player.getExpansions('qiaoyan').length) return false; - if(arg&&arg.player){ - if(arg.player.hasSkillTag('jueqing',false,player)) return false; + ai: { + filterDamage: true, + skillTagFilter: function (player, tag, arg) { + if (!player.getExpansions("qiaoyan").length) return false; + if (arg && arg.player) { + if (arg.player.hasSkillTag("jueqing", false, player)) return false; } }, }, }, - xianzhu:{ - trigger:{player:'phaseUseBegin'}, - locked:true, - filter:function(event,player){ - return player.getExpansions('qiaoyan').length>0; + xianzhu: { + trigger: { player: "phaseUseBegin" }, + locked: true, + filter: function (event, player) { + return player.getExpansions("qiaoyan").length > 0; }, - async cost(event, trigger, player){ - event.cards = player.getExpansions('qiaoyan'); - event.result = await player.chooseTarget(true,'请选择【献珠】的目标','将'+get.translation(event.cards)+'交给一名角色。若该角色不为你自己,则你令其视为对其攻击范围内的另一名角色使用【杀】').set('ai',function(target){ - var player=_status.event.player; - var eff=get.sgn(get.attitude(player,target))*get.value(_status.event.getParent().cards[0],target); - if(player!=target) eff+=Math.max.apply(null,game.filterPlayer(function(current){ - if(current!=target&&player.inRange(current)&&target.canUse('sha',current,false)) return true; - }).map(function(current){ - return get.effect(current,{name:'sha'},target,player); - })); - return eff; - }).forResult(); + async cost(event, trigger, player) { + event.cards = player.getExpansions("qiaoyan"); + event.result = await player + .chooseTarget( + true, + "请选择【献珠】的目标", + "将" + + get.translation(event.cards) + + "交给一名角色。若该角色不为你自己,则你令其视为对其攻击范围内的另一名角色使用【杀】" + ) + .set("ai", function (target) { + var player = _status.event.player; + var eff = + get.sgn(get.attitude(player, target)) * + get.value(_status.event.getParent().cards[0], target); + if (player != target) + eff += Math.max.apply( + null, + game + .filterPlayer(function (current) { + if ( + current != target && + player.inRange(current) && + target.canUse("sha", current, false) + ) + return true; + }) + .map(function (current) { + return get.effect(current, { name: "sha" }, target, player); + }) + ); + return eff; + }) + .forResult(); }, - content:function(){ - 'step 0' - event.cards = player.getExpansions('qiaoyan'); + content: function () { + "step 0"; + event.cards = player.getExpansions("qiaoyan"); event.target = targets[0]; - 'step 1' - player.give(cards,target,'give'); - 'step 2' - if(player!=target&&target.isIn()&&player.isIn()&&game.hasPlayer(function(current){ - return current!=target&&player.inRange(current)&&target.canUse('sha',current,false); - })){ - var str=get.translation(target); - player.chooseTarget(true,'选择攻击范围内的一名角色,视为'+str+'对其使用【杀】',function(card,player,target){ - var source=_status.event.target; - return player.inRange(target)&&source.canUse('sha', target, false); - }).set('target',target).set('ai',function(target){ - var evt=_status.event; - return get.effect(target,{name:'sha'},evt.target,evt.player) + ("step 1"); + player.give(cards, target, "give"); + ("step 2"); + if ( + player != target && + target.isIn() && + player.isIn() && + game.hasPlayer(function (current) { + return ( + current != target && + player.inRange(current) && + target.canUse("sha", current, false) + ); + }) + ) { + var str = get.translation(target); + player + .chooseTarget( + true, + "选择攻击范围内的一名角色,视为" + str + "对其使用【杀】", + function (card, player, target) { + var source = _status.event.target; + return player.inRange(target) && source.canUse("sha", target, false); + } + ) + .set("target", target) + .set("ai", function (target) { + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.target, evt.player); + }); + } else event.finish(); + ("step 3"); + if (result.bool) target.useCard({ name: "sha", isCard: true }, result.targets[0], false); + }, + ai: { combo: "qiaoyan" }, + }, + huirong: { + trigger: { player: "showCharacterAfter" }, + forced: true, + filter: function (event, player) { + return ( + event.toShow && + event.toShow.includes("jin_yanghuiyu") && + game.hasPlayer(function (target) { + var num = target.countCards("h"); + return num > target.hp || num < Math.min(5, target.hp); + }) + ); + }, + hiddenSkill: true, + content: function () { + "step 0"; + player + .chooseTarget( + "请选择【慧容】的目标", + "令一名角色将手牌数摸至/弃置至与其体力值相同(至多摸至五张)", + true, + function (card, player, target) { + var num = target.countCards("h"); + return num > target.hp || num < Math.min(5, target.hp); + } + ) + .set("ai", function (target) { + var att = get.attitude(_status.event.player, target); + var num = target.countCards("h"); + if (num > target.hp) return -att * (num - target.hp); + return att * Math.max(0, Math.min(5, target.hp) - target.countCards("h")); }); - } - else event.finish(); - 'step 3' - if(result.bool) target.useCard({name:'sha',isCard:true},result.targets[0],false); - }, - ai:{combo:'qiaoyan'}, - }, - huirong:{ - trigger:{player:'showCharacterAfter'}, - forced:true, - filter:function(event,player){ - return event.toShow&&event.toShow.includes('jin_yanghuiyu')&&game.hasPlayer(function(target){ - var num=target.countCards('h'); - return num>target.hp||numtarget.hp||numtarget.hp) return -att*(num-target.hp); - return att*Math.max(0,Math.min(5,target.hp)-target.countCards('h')); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - if(target.countCards('h'){ - game.addGlobalSkill('ciwei_ai'); + ciwei: { + init: () => { + game.addGlobalSkill("ciwei_ai"); }, - onremove:()=>{ - if(!game.hasPlayer(i=>i.hasSkill('ciwei'),true)) game.removeGlobalSkill('ciwei_ai'); + onremove: () => { + if (!game.hasPlayer((i) => i.hasSkill("ciwei"), true)) game.removeGlobalSkill("ciwei_ai"); }, - trigger:{global:'useCard'}, - direct:true, - preHidden:true, - filter:function(event,player){ - if(event.all_excluded||event.player==player||event.player!=_status.currentPhase||!player.countCards('he')) return false; - return event.player.getHistory('useCard').indexOf(event)==1&&['basic','trick'].includes(get.type(event.card)); + trigger: { global: "useCard" }, + direct: true, + preHidden: true, + filter: function (event, player) { + if ( + event.all_excluded || + event.player == player || + event.player != _status.currentPhase || + !player.countCards("he") + ) + return false; + return ( + event.player.getHistory("useCard").indexOf(event) == 1 && + ["basic", "trick"].includes(get.type(event.card)) + ); }, - content:function(){ - 'step 0' - if(player!=game.me&&!player.isOnline()) game.delayx(); - player.chooseToDiscard(get.prompt('ciwei',trigger.player),'弃置一张牌,取消'+get.translation(trigger.card)+'的所有目标','he').set('ai',function(card){ - return (_status.event.goon/1.4)-get.value(card); - }).set('goon',function(){ - if(!trigger.targets.length) return -get.attitude(player,trigger.player); - var num=0; - for(var i of trigger.targets){ - num-=get.effect(i,trigger.card,trigger.player,player) - } - return num; - }()).setHiddenSkill(event.name).logSkill=['ciwei',trigger.player]; - 'step 1' - if(result.bool){ - trigger.targets.length=0; - trigger.all_excluded=true; + content: function () { + "step 0"; + if (player != game.me && !player.isOnline()) game.delayx(); + player + .chooseToDiscard( + get.prompt("ciwei", trigger.player), + "弃置一张牌,取消" + get.translation(trigger.card) + "的所有目标", + "he" + ) + .set("ai", function (card) { + return _status.event.goon / 1.4 - get.value(card); + }) + .set( + "goon", + (function () { + if (!trigger.targets.length) return -get.attitude(player, trigger.player); + var num = 0; + for (var i of trigger.targets) { + num -= get.effect(i, trigger.card, trigger.player, player); + } + return num; + })() + ) + .setHiddenSkill(event.name).logSkill = ["ciwei", trigger.player]; + ("step 1"); + if (result.bool) { + trigger.targets.length = 0; + trigger.all_excluded = true; } - } + }, }, - ciwei_ai:{ - mod:{ - aiOrder:function(player,card,num){ - if(player!=_status.currentPhase||player.getHistory('useCard').length>1||!game.hasPlayer(function(current){ - return current!=player&&(get.realAttitude||get.attitude)(current,player)<0&¤t.hasSkill('ciwei')&¤t.countCards('he')>0; - })) return; - if(player.getHistory('useCard').length==0){ - if(['basic','trick'].includes(get.type(card))) return num+10; + ciwei_ai: { + mod: { + aiOrder: function (player, card, num) { + if ( + player != _status.currentPhase || + player.getHistory("useCard").length > 1 || + !game.hasPlayer(function (current) { + return ( + current != player && + (get.realAttitude || get.attitude)(current, player) < 0 && + current.hasSkill("ciwei") && + current.countCards("he") > 0 + ); + }) + ) + return; + if (player.getHistory("useCard").length == 0) { + if (["basic", "trick"].includes(get.type(card))) return num + 10; return; } - if(!['basic','trick'].includes(get.type(card))) return num+10; - if(!player._ciwei_temp){ - player._ciwei_temp=true; - num/=Math.max(1,player.getUseValue(card)); + if (!["basic", "trick"].includes(get.type(card))) return num + 10; + if (!player._ciwei_temp) { + player._ciwei_temp = true; + num /= Math.max(1, player.getUseValue(card)); } delete player._ciwei_temp; return num; }, }, - trigger:{player:'dieAfter'}, - filter:()=>{ - return !game.hasPlayer(i=>i.hasSkill('ciwei'),true); + trigger: { player: "dieAfter" }, + filter: () => { + return !game.hasPlayer((i) => i.hasSkill("ciwei"), true); + }, + silent: true, + forceDie: true, + content: () => { + game.removeGlobalSkill("ciwei_ai"); }, - silent:true, - forceDie:true, - content:()=>{ - game.removeGlobalSkill('ciwei_ai'); - } }, - caiyuan:{ - trigger:{player:'phaseEnd'}, - forced:true, - preHidden:true, - filter:function(event,player){ - if(player.phaseNumber<=1) return false; - const history1=_status.globalHistory,history2=player.actionHistory; - for(let i=0;i0&&history2[i2].isMe) break; - if(history1[i1].changeHp.some(evt=>evt.player==player&&evt.num<0)) return false; + caiyuan: { + trigger: { player: "phaseEnd" }, + forced: true, + preHidden: true, + filter: function (event, player) { + if (player.phaseNumber <= 1) return false; + const history1 = _status.globalHistory, + history2 = player.actionHistory; + for (let i = 0; i < Math.min(history1.length, history2.length); i++) { + let i1 = history1.length - 1 - i, + i2 = history2.length - 1 - i; + if (i > 0 && history2[i2].isMe) break; + if (history1[i1].changeHp.some((evt) => evt.player == player && evt.num < 0)) + return false; } return true; }, - content:function(){ + content: function () { player.draw(2); }, }, - zhuosheng:{ - audio:2, - locked:false, - init:function(player){ - player.addSkill('zhuosheng_count'); - if(game.phaseNumber>0){ - var hs=player.getCards('h'),all=player.getAllHistory(),cards=[]; - for(var i=all.length-1;i>=0;i--){ - for(var j of all[i].gain){ + zhuosheng: { + audio: 2, + locked: false, + init: function (player) { + player.addSkill("zhuosheng_count"); + if (game.phaseNumber > 0) { + var hs = player.getCards("h"), + all = player.getAllHistory(), + cards = []; + for (var i = all.length - 1; i >= 0; i--) { + for (var j of all[i].gain) { cards.addArray(j.cards); } - if(all[i].isRound) break; + if (all[i].isRound) break; } - cards=cards.filter(function(i){ + cards = cards.filter(function (i) { return hs.includes(i); }); - if(cards.length) player.addGaintag(cards,'zhuosheng'); + if (cards.length) player.addGaintag(cards, "zhuosheng"); } }, - onremove:function(player){ - player.removeSkill('zhuosheng_count'); - player.removeGaintag('zhuosheng'); + onremove: function (player) { + player.removeSkill("zhuosheng_count"); + player.removeGaintag("zhuosheng"); }, - mod:{ - targetInRange:function(card,player,target){ - if(!card.cards||get.type(card)!='basic') return; - for(var i of card.cards){ - if(i.hasGaintag('zhuosheng')) return (game.online?player==_status.currentPhase:player.isPhaseUsing()); + mod: { + targetInRange: function (card, player, target) { + if (!card.cards || get.type(card) != "basic") return; + for (var i of card.cards) { + if (i.hasGaintag("zhuosheng")) + return game.online ? player == _status.currentPhase : player.isPhaseUsing(); } }, - cardUsable:function(card,player,target){ - if(!card.cards||get.mode()=='guozhan'||get.type(card)!='basic'||!(game.online?player==_status.currentPhase:player.isPhaseUsing())) return; - for(var i of card.cards){ - if(i.hasGaintag('zhuosheng')) return Infinity; + cardUsable: function (card, player, target) { + if ( + !card.cards || + get.mode() == "guozhan" || + get.type(card) != "basic" || + !(game.online ? player == _status.currentPhase : player.isPhaseUsing()) + ) + return; + for (var i of card.cards) { + if (i.hasGaintag("zhuosheng")) return Infinity; } }, - aiOrder:function(player,card,num){ - if(get.itemtype(card)=='card'&&card.hasGaintag('zhuosheng')&&get.type(card)=='basic') return num-0.1; + aiOrder: function (player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("zhuosheng") && + get.type(card) == "basic" + ) + return num - 0.1; }, }, - trigger:{player:'useCard2'}, - direct:true, - filterx:function(event,player){ - if(!player.isPhaseUsing()) return false; - return player.getHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].includes('zhuosheng')) return true; - } - return false; - }).length>0; + trigger: { player: "useCard2" }, + direct: true, + filterx: function (event, player) { + if (!player.isPhaseUsing()) return false; + return ( + player.getHistory("lose", function (evt) { + if (evt.getParent() != event) return false; + for (var i in evt.gaintag_map) { + if (evt.gaintag_map[i].includes("zhuosheng")) return true; + } + return false; + }).length > 0 + ); }, - filter:function(event,player){ - if(!lib.skill.zhuosheng.filterx(event,player)) return false; - if(get.type(event.card)!='trick') return false; - if(event.targets&&event.targets.length>0) return true; - var info=get.info(event.card); - if(info.allowMultiple==false) return false; - if(event.targets&&!info.multitarget){ - if(game.hasPlayer(function(current){ - return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,player,current)&&lib.filter.targetInRange(event.card,player,current); - })){ + filter: function (event, player) { + if (!lib.skill.zhuosheng.filterx(event, player)) return false; + if (get.type(event.card) != "trick") return false; + if (event.targets && event.targets.length > 0) return true; + var info = get.info(event.card); + if (info.allowMultiple == false) return false; + if (event.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return ( + !event.targets.includes(current) && + lib.filter.targetEnabled2(event.card, player, current) && + lib.filter.targetInRange(event.card, player, current) + ); + }) + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var prompt2='为'+get.translation(trigger.card)+'增加或减少一个目标' - player.chooseTarget(get.prompt('zhuosheng'),function(card,player,target){ - var player=_status.event.player; - if(_status.event.targets.includes(target)) return true; - return lib.filter.targetEnabled2(_status.event.card,player,target)&&lib.filter.targetInRange(_status.event.card,player,target); - }).set('prompt2',prompt2).set('ai',function(target){ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - return get.effect(target,trigger.card,player,player)*(_status.event.targets.includes(target)?-1:1); - }).set('targets',trigger.targets).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标"; + player + .chooseTarget(get.prompt("zhuosheng"), function (card, player, target) { + var player = _status.event.player; + if (_status.event.targets.includes(target)) return true; + return ( + lib.filter.targetEnabled2(_status.event.card, player, target) && + lib.filter.targetInRange(_status.event.card, player, target) + ); + }) + .set("prompt2", prompt2) + .set("ai", function (target) { + var trigger = _status.event.getTrigger(); + var player = _status.event.player; + return ( + get.effect(target, trigger.card, player, player) * + (_status.event.targets.includes(target) ? -1 : 1) + ); + }) + .set("targets", trigger.targets) + .set("card", trigger.card); + ("step 1"); + if (result.bool) { + if (!event.isMine() && !event.isOnline()) game.delayx(); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets){ - player.logSkill('zhuosheng',event.targets); - if(trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); + ("step 2"); + if (event.targets) { + player.logSkill("zhuosheng", event.targets); + if (trigger.targets.includes(event.targets[0])) + trigger.targets.removeArray(event.targets); else trigger.targets.addArray(event.targets); } }, - group:['zhuosheng_equip','zhuosheng_silent'], - subfrequent:['equip'], - subSkill:{ - equip:{ - audio:'zhuosheng', - trigger:{player:'useCard'}, - filter:function(event,player){ - return get.type(event.card)=='equip'&&lib.skill.zhuosheng.filterx(event,player); + group: ["zhuosheng_equip", "zhuosheng_silent"], + subfrequent: ["equip"], + subSkill: { + equip: { + audio: "zhuosheng", + trigger: { player: "useCard" }, + filter: function (event, player) { + return ( + get.type(event.card) == "equip" && lib.skill.zhuosheng.filterx(event, player) + ); }, - frequent:true, - prompt:'是否发动【擢升】摸一张牌?', - content:function(){ + frequent: true, + prompt: "是否发动【擢升】摸一张牌?", + content: function () { player.draw(); }, }, - silent:{ - trigger:{ - player:'useCard1', + silent: { + trigger: { + player: "useCard1", }, - silent:true, - firstDo:true, - filter:function(event,player){ - return get.mode()!='guozhan'&&get.type(event.card)=='basic'&&lib.skill.zhuosheng.filterx(event,player)&&event.addCount!==false; + silent: true, + firstDo: true, + filter: function (event, player) { + return ( + get.mode() != "guozhan" && + get.type(event.card) == "basic" && + lib.skill.zhuosheng.filterx(event, player) && + event.addCount !== false + ); }, - content:function(){ - trigger.addCount=false; - var stat=player.getStat(); - if(stat&&stat.card&&stat.card[trigger.card.name]) stat.card[trigger.card.name]--; + content: function () { + trigger.addCount = false; + var stat = player.getStat(); + if (stat && stat.card && stat.card[trigger.card.name]) + stat.card[trigger.card.name]--; }, }, }, }, - zhuosheng_count:{ - trigger:{ - player:'gainBegin', - global:'roundStart', + zhuosheng_count: { + trigger: { + player: "gainBegin", + global: "roundStart", }, - silent:true, - filter:function(event,player){ - if(event.name=='gain') return event.getParent(2).name!='zhuosheng_equip'; - return game.roundNumber>1; + silent: true, + filter: function (event, player) { + if (event.name == "gain") return event.getParent(2).name != "zhuosheng_equip"; + return game.roundNumber > 1; }, - content:function(){ - if(trigger.name=='gain') trigger.gaintag.add('zhuosheng'); - else player.removeGaintag('zhuosheng'); + content: function () { + if (trigger.name == "gain") trigger.gaintag.add("zhuosheng"); + else player.removeGaintag("zhuosheng"); }, }, - xinquanbian:{ - audio:'quanbian', - preHidden:true, - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - var phase=event.getParent('phaseUse'); - if(!phase||phase.player!=player) return false; - var suit=get.suit(event.card); - if(!lib.suit.includes(suit)||!lib.skill.quanbian.hasHand(event)) return false; - return player.getHistory('useCard',function(evt){ - return evt!=event&&get.suit(evt.card)==suit&&lib.skill.quanbian.hasHand(evt)&&evt.getParent('phaseUse')==phase; - }).length+player.getHistory('respond',function(evt){ - return evt!=event&&get.suit(evt.card)==suit&&lib.skill.quanbian.hasHand(evt)&&evt.getParent('phaseUse')==phase; - }).length==0; + xinquanbian: { + audio: "quanbian", + preHidden: true, + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + var phase = event.getParent("phaseUse"); + if (!phase || phase.player != player) return false; + var suit = get.suit(event.card); + if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false; + return ( + player.getHistory("useCard", function (evt) { + return ( + evt != event && + get.suit(evt.card) == suit && + lib.skill.quanbian.hasHand(evt) && + evt.getParent("phaseUse") == phase + ); + }).length + + player.getHistory("respond", function (evt) { + return ( + evt != event && + get.suit(evt.card) == suit && + lib.skill.quanbian.hasHand(evt) && + evt.getParent("phaseUse") == phase + ); + }).length == + 0 + ); }, - content:function(){ - 'step 0' - var cards=get.cards(Math.min(5,player.maxHp)); + content: function () { + "step 0"; + var cards = get.cards(Math.min(5, player.maxHp)); game.cardsGotoOrdering(cards); - var suit=get.suit(trigger.card); - var next=player.chooseToMove('权变:获得一张不为'+get.translation(suit)+'花色的牌并排列其他牌'); - next.set('suit',suit); - next.set('list',[ - ['牌堆顶',cards], - ['获得'], - ]) - next.set('filterMove',function(from,to,moved){ - var suit=_status.event.suit; - if(moved[0].includes(from.link)){ - if(typeof to=='number'){ - if(to==1){ - if(moved[1].length) return false; - return get.suit(from.link,false)!=suit; + var suit = get.suit(trigger.card); + var next = player.chooseToMove( + "权变:获得一张不为" + get.translation(suit) + "花色的牌并排列其他牌" + ); + next.set("suit", suit); + next.set("list", [["牌堆顶", cards], ["获得"]]); + next.set("filterMove", function (from, to, moved) { + var suit = _status.event.suit; + if (moved[0].includes(from.link)) { + if (typeof to == "number") { + if (to == 1) { + if (moved[1].length) return false; + return get.suit(from.link, false) != suit; } return true; } - if(moved[1].includes(to.link)) return get.suit(from.link,false)!=suit; + if (moved[1].includes(to.link)) return get.suit(from.link, false) != suit; return true; - } - else{ - if(typeof to=='number') return true; - return get.suit(to.link,false)!=suit; + } else { + if (typeof to == "number") return true; + return get.suit(to.link, false) != suit; } }); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0).sort(function(a,b){ - return get.value(b)-get.value(a); - }),gains=[]; - for(var i of cards){ - if(get.suit(i,false)!=_status.event.suit){ + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.value(a); + }), + gains = []; + for (var i of cards) { + if (get.suit(i, false) != _status.event.suit) { cards.remove(i); gains.push(i); break; } } - return [cards,gains]; + return [cards, gains]; }); - 'step 1' - if(result.bool){ - var list=result.moved; - if(list[1].length) player.gain(list[1],'gain2'); - while(list[0].length){ - ui.cardPile.insertBefore(list[0].pop(),ui.cardPile.firstChild); + ("step 1"); + if (result.bool) { + var list = result.moved; + if (list[1].length) player.gain(list[1], "gain2"); + while (list[0].length) { + ui.cardPile.insertBefore(list[0].pop(), ui.cardPile.firstChild); } game.updateRoundNumber(); } }, //group:'xinquanbian_count', - init:(player,skill)=>player.addSkill('xinquanbian_count'), - onremove:(player,skill)=>player.removeSkill('xinquanbian_count'), + init: (player, skill) => player.addSkill("xinquanbian_count"), + onremove: (player, skill) => player.removeSkill("xinquanbian_count"), }, - xinquanbian_count:{ - trigger:{ - player:['useCard0','phaseUseBefore','phaseUseAfter'] + xinquanbian_count: { + trigger: { + player: ["useCard0", "phaseUseBefore", "phaseUseAfter"], }, - silent:true, - firstDo:true, - charlotte:true, - filter:function(event,player){ - if (event.name === 'phaseUse') return true; - return player.isPhaseUsing()&&lib.skill.quanbian.hasHand(event)&&get.type(event.card)!='equip'; + silent: true, + firstDo: true, + charlotte: true, + filter: function (event, player) { + if (event.name === "phaseUse") return true; + return ( + player.isPhaseUsing() && + lib.skill.quanbian.hasHand(event) && + get.type(event.card) != "equip" + ); }, - content:function(){ - var stat=player.getStat('skill'); - if (this.trigger.name === 'phaseUse') { + content: function () { + var stat = player.getStat("skill"); + if (this.trigger.name === "phaseUse") { delete stat.xinquanbian; - } - else{ - if(!stat.xinquanbian) stat.xinquanbian=0; + } else { + if (!stat.xinquanbian) stat.xinquanbian = 0; stat.xinquanbian++; } }, - mod:{ - cardEnabled2:function(card,player){ - var stat=player.getStat('skill'); - if(stat.xinquanbian&&stat.xinquanbian>=player.maxHp&&get.position(card)=='h'&&get.type(card,player)!='equip') return false; + mod: { + cardEnabled2: function (card, player) { + var stat = player.getStat("skill"); + if ( + stat.xinquanbian && + stat.xinquanbian >= player.maxHp && + get.position(card) == "h" && + get.type(card, player) != "equip" + ) + return false; }, }, }, - taoyin:{ - audio:2, - trigger:{player:'showCharacterAfter'}, - hiddenSkill:true, - logTarget:function(){ + taoyin: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + logTarget: function () { return _status.currentPhase; }, - filter:function(event,player){ - var target=_status.currentPhase; - return target&&target!=player&&target.isAlive(); + filter: function (event, player) { + var target = _status.currentPhase; + return target && target != player && target.isAlive(); }, - check:function(event,player){ - return get.attitude(player,_status.currentPhase)<0; + check: function (event, player) { + return get.attitude(player, _status.currentPhase) < 0; }, - content:function(){ - _status.currentPhase.addTempSkill('taoyin2'); - _status.currentPhase.addMark('taoyin2',2,false); + content: function () { + _status.currentPhase.addTempSkill("taoyin2"); + _status.currentPhase.addMark("taoyin2", 2, false); }, - ai:{ - expose:0.2, + ai: { + expose: 0.2, }, }, - taoyin2:{ - onremove:true, - charlotte:true, - intro:{ - content:'手牌上限-#', + taoyin2: { + onremove: true, + charlotte: true, + intro: { + content: "手牌上限-#", }, - mod:{ - maxHandcard:function(player,num){ - return num-player.countMark('taoyin2'); + mod: { + maxHandcard: function (player, num) { + return num - player.countMark("taoyin2"); }, }, }, - yimie:{ - audio:2, - usable:1, - preHidden:true, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return player!=event.player&&event.num= -2 || Math.abs(hp) <= 1) return false; - if(hp > 2 || eff > 0 && event.player.isLinked() && event.hasNature()) return true; - return !event.player.countCards('hs') || event.player.hp > 2 * event.num && !event.player.hasSkillTag('maixie'); + if (player.storage.tairan2) hp -= player.storage.tairan2; + if (eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false; + if (hp > 2 || (eff > 0 && event.player.isLinked() && event.hasNature())) return true; + return ( + !event.player.countCards("hs") || + (event.player.hp > 2 * event.num && !event.player.hasSkillTag("maixie")) + ); }, - logTarget:'player', - content:function(){ + logTarget: "player", + content: function () { player.loseHp(); - trigger.player.addTempSkill('yimie2'); - trigger.yimie_num=trigger.player.hp-trigger.num; - trigger.num=trigger.player.hp; + trigger.player.addTempSkill("yimie2"); + trigger.yimie_num = trigger.player.hp - trigger.num; + trigger.num = trigger.player.hp; + }, + ai: { + damageBonus: true, + skillTagFilter: function (player, tag, arg) { + return ( + arg && + arg.target && + arg.target.hp > 1 && + player.hp > 1 && + get.attitude(player, arg.target) < -2 + ); + }, }, - ai:{ - damageBonus:true, - skillTagFilter:function(player,tag,arg){ - return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2; - } - } }, - yimie2:{ - trigger:{player:'damageEnd'}, - forced:true, - popup:false, - charlotte:true, - filter:function(event,player){ - return typeof event.yimie_num=='number'; + yimie2: { + trigger: { player: "damageEnd" }, + forced: true, + popup: false, + charlotte: true, + filter: function (event, player) { + return typeof event.yimie_num == "number"; }, - content:function(){ + content: function () { player.recover(trigger.yimie_num); }, }, - ruilve:{ - unique:true, - audio:2, - global:'ruilve2', - zhuSkill:true, + ruilve: { + unique: true, + audio: 2, + global: "ruilve2", + zhuSkill: true, }, - ruilve2:{ - enable:'phaseUse', - discard:false, - lose:false, - delay:false, - line:true, - log:false, - prepare:function(cards,player,targets){ - targets[0].logSkill('ruilve'); + ruilve2: { + enable: "phaseUse", + discard: false, + lose: false, + delay: false, + line: true, + log: false, + prepare: function (cards, player, targets) { + targets[0].logSkill("ruilve"); }, - prompt:function(){ - var player=_status.event.player; - var list=game.filterPlayer(function(target){ - return target!=player&&target.hasZhuSkill('ruilve',player); + prompt: function () { + var player = _status.event.player; + var list = game.filterPlayer(function (target) { + return target != player && target.hasZhuSkill("ruilve", player); }); - var str='将一张具有伤害标签的基本牌或锦囊牌交给'+get.translation(list); - if(list.length>1) str+='中的一人'; + var str = "将一张具有伤害标签的基本牌或锦囊牌交给" + get.translation(list); + if (list.length > 1) str += "中的一人"; return str; }, - filter:function(event,player){ - if(player.group!='jin') return false; - if(player.countCards('h',lib.skill.ruilve2.filterCard)==0) return false; - return game.hasPlayer(function(target){ - return target!=player&&target.hasZhuSkill('ruilve',player)&&!target.hasSkill('ruilve3'); + filter: function (event, player) { + if (player.group != "jin") return false; + if (player.countCards("h", lib.skill.ruilve2.filterCard) == 0) return false; + return game.hasPlayer(function (target) { + return ( + target != player && + target.hasZhuSkill("ruilve", player) && + !target.hasSkill("ruilve3") + ); }); }, - filterCard:function(card){ - if(!get.tag(card,'damage')) return false; - var type=get.type(card); - return (type=='basic'||type=='trick'); + filterCard: function (card) { + if (!get.tag(card, "damage")) return false; + var type = get.type(card); + return type == "basic" || type == "trick"; }, - visible:true, - filterTarget:function(card,player,target){ - return target!=player&&target.hasZhuSkill('ruilve',player)&&!target.hasSkill('ruilve3'); + visible: true, + filterTarget: function (card, player, target) { + return ( + target != player && + target.hasZhuSkill("ruilve", player) && + !target.hasSkill("ruilve3") + ); }, - content:function(){ - player.give(cards,target); - target.addTempSkill('ruilve3','phaseUseEnd'); + content: function () { + player.give(cards, target); + target.addTempSkill("ruilve3", "phaseUseEnd"); + }, + ai: { + expose: 0.3, + order: 1, + result: { + target: 5, + }, }, - ai:{ - expose:0.3, - order:1, - result:{ - target:5 - } - } }, - ruilve3:{}, - tairan:{ - audio:2, - trigger:{player:'phaseEnd'}, - forced:true, - preHidden:true, - filter:function(event,player){ - return player.hp0){ - player.storage.tairan2=num; + content: function () { + "step 0"; + player.addSkill("tairan2"); + if (!player.storage.tairan2) player.storage.tairan2 = 0; + var num = player.maxHp - player.hp; + if (num > 0) { + player.storage.tairan2 = num; player.recover(num); } - 'step 1' - if(player.countCards('h')0) player.loseHp(map); - var hs=player.getCards('h',function(card){ - return card.hasGaintag('tairan'); + audio: "tairan", + trigger: { player: "phaseUseBegin" }, + charlotte: true, + forced: true, + onremove: true, + content: function () { + var map = player.storage.tairan2; + if (map > 0) player.loseHp(map); + var hs = player.getCards("h", function (card) { + return card.hasGaintag("tairan"); }); - if(hs.length) player.discard(hs); - player.removeSkill('tairan2'); + if (hs.length) player.discard(hs); + player.removeSkill("tairan2"); }, }, - baoqie:{ - audio:2, - trigger:{player:'showCharacterAfter'}, - forced:true, - hiddenSkill:true, - filter:function(event,player){ - return event.toShow&&event.toShow.includes('jin_xiahouhui'); + baoqie: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + forced: true, + hiddenSkill: true, + filter: function (event, player) { + return event.toShow && event.toShow.includes("jin_xiahouhui"); }, - content:function(){ - 'step 0' - var card=get.cardPile(function(card){ - return get.subtype(card,false)=='equip5'&&!get.cardtag(card,'gifts'); + content: function () { + "step 0"; + var card = get.cardPile(function (card) { + return get.subtype(card, false) == "equip5" && !get.cardtag(card, "gifts"); }); - if(!card){ + if (!card) { event.finish(); return; } - event.card=card; - player.gain(card,'gain2'); - 'step 1' - if(player.getCards('h').includes(card)&&get.subtype(card)=='equip5') player.chooseUseTarget(card).nopopup=true; + event.card = card; + player.gain(card, "gain2"); + ("step 1"); + if (player.getCards("h").includes(card) && get.subtype(card) == "equip5") + player.chooseUseTarget(card).nopopup = true; }, }, - jyishi:{ - audio:2, - trigger:{ - global:['loseAfter','loseAsyncAfter'], + jyishi: { + audio: 2, + trigger: { + global: ["loseAfter", "loseAsyncAfter"], }, - usable:1, - direct:true, - preHidden:true, - filter:function(event,player){ - var target=_status.currentPhase; - if(!target||!target.isIn()||event.type!='discard'||!target.isPhaseUsing()) return false; - if(target==player) return false; - var evt=event.getl(target); - for(var i of evt.hs){ - if(get.position(i,true)=='d') return true; + usable: 1, + direct: true, + preHidden: true, + filter: function (event, player) { + var target = _status.currentPhase; + if (!target || !target.isIn() || event.type != "discard" || !target.isPhaseUsing()) + return false; + if (target == player) return false; + var evt = event.getl(target); + for (var i of evt.hs) { + if (get.position(i, true) == "d") return true; } return false; }, - content:function(){ - 'step 0' - event.target=_status.currentPhase; - event.cards=trigger.getl(event.target).hs.filterInD('d'); - var str='是否发动【宜室】令'+get.translation(event.target)+'获得一张牌'; - if(event.cards.length>1) str+=',然后获得其余的牌'; - str+='?'; - player.chooseButton([str,event.cards]).set('ai',function(button){ - var card=button.link; - var source=_status.event.source; - if(get.attitude(player,source)>0) return Math.max(1,source.getUseValue(card,null,true)); - var cards=_status.event.getParent().cards.slice(0); - if(cards.length==1) return -get.value(card); - cards.remove(card); - return (get.value(cards)-get.value(card)-2); - }).set('source',event.target).setHiddenSkill(event.name); - 'step 1' - if(result.bool){ - player.logSkill('jyishi',target); - if(cards.length>1){ + content: function () { + "step 0"; + event.target = _status.currentPhase; + event.cards = trigger.getl(event.target).hs.filterInD("d"); + var str = "是否发动【宜室】令" + get.translation(event.target) + "获得一张牌"; + if (event.cards.length > 1) str += ",然后获得其余的牌"; + str += "?"; + player + .chooseButton([str, event.cards]) + .set("ai", function (button) { + var card = button.link; + var source = _status.event.source; + if (get.attitude(player, source) > 0) + return Math.max(1, source.getUseValue(card, null, true)); + var cards = _status.event.getParent().cards.slice(0); + if (cards.length == 1) return -get.value(card); + cards.remove(card); + return get.value(cards) - get.value(card) - 2; + }) + .set("source", event.target) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + player.logSkill("jyishi", target); + if (cards.length > 1) { target.$gain2(result.links[0]); - target.gain(result.links[0],'log'); - } - else trigger.player.gain(result.links[0],'gain2'); + target.gain(result.links[0], "log"); + } else trigger.player.gain(result.links[0], "gain2"); cards.remove(result.links[0]); - if(cards.length) player.gain(cards,'gain2'); - } - else player.storage.counttrigger.jyishi--; + if (cards.length) player.gain(cards, "gain2"); + } else player.storage.counttrigger.jyishi--; }, }, - jyishi2:{charlotte:true}, - shiduo:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(target){ - return player!=target&&player.canCompare(target); - }) + jyishi2: { charlotte: true }, + shiduo: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return player != target && player.canCompare(target); + }); }, - filterTarget:function(card,player,target){ - return player!=target&&player.canCompare(target); + filterTarget: function (card, player, target) { + return player != target && player.canCompare(target); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool&&target.isAlive()){ - var num=target.countCards('h'); - if(num>0) player.gainPlayerCard(target,true,'h',num); - } + ("step 1"); + if (result.bool && target.isAlive()) { + var num = target.countCards("h"); + if (num > 0) player.gainPlayerCard(target, true, "h", num); + } else event.finish(); + ("step 2"); + var num = Math.floor(player.countCards("h") / 2); + if (num && target.isAlive()) + player.chooseCard( + "h", + num, + true, + "交给" + get.translation(target) + get.cnNumber(num) + "张牌" + ); else event.finish(); - 'step 2' - var num=Math.floor(player.countCards('h')/2); - if(num&&target.isAlive()) player.chooseCard('h',num,true,'交给'+get.translation(target)+get.cnNumber(num)+'张牌') - else event.finish(); - 'step 3' - if(result.bool&&result.cards&&result.cards.length) player.give(result.cards,target); + ("step 3"); + if (result.bool && result.cards && result.cards.length) player.give(result.cards, target); }, - ai:{ - order:1, - result:{ - target:function(player,target){ - var delta=(target.countCards('h')-player.countCards('h')); - if(delta<0) return 0; - return -1-delta; + ai: { + order: 1, + result: { + target: function (player, target) { + var delta = target.countCards("h") - player.countCards("h"); + if (delta < 0) return 0; + return -1 - delta; }, }, }, }, - tuishi:{ - audio:2, - trigger:{player:'showCharacterAfter'}, - forced:true, - locked:false, - hiddenSkill:true, - filter:function(event,player){ - var target=_status.currentPhase; - return player!=target&&target&&target.isAlive()&&event.toShow&&event.toShow.includes('jin_simazhao'); + tuishi: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + forced: true, + locked: false, + hiddenSkill: true, + filter: function (event, player) { + var target = _status.currentPhase; + return ( + player != target && + target && + target.isAlive() && + event.toShow && + event.toShow.includes("jin_simazhao") + ); }, - content:function(){ - player.addTempSkill('tuishi2'); + content: function () { + player.addTempSkill("tuishi2"); }, }, - tuishi2:{ - trigger:{global:'phaseEnd'}, - direct:true, - charlotte:true, - filter:function(event,player){ - var target=_status.currentPhase; - return target!=player&&target&&target.isAlive()&&game.hasPlayer(function(current){ - return current!=target&&target.inRange(current); - }); + tuishi2: { + trigger: { global: "phaseEnd" }, + direct: true, + charlotte: true, + filter: function (event, player) { + var target = _status.currentPhase; + return ( + target != player && + target && + target.isAlive() && + game.hasPlayer(function (current) { + return current != target && target.inRange(current); + }) + ); }, - content:function(){ - 'step 0' - var target=_status.currentPhase; - event.target=target; - player.chooseTarget(get.prompt2('tuishi',event.target),function(card,player,target){ - var source=_status.event.source; - return source!=target&&source.inRange(target); - }).set('source',target).set('goon',get.damageEffect(target,player,player)>0).set('ai',function(target){ - if(!_status.event.goon) return 0; - var evt=_status.event; - return get.effect(target,{name:'sha'},evt.source,evt.player) - }); - 'step 1' - if(result.bool){ - event.target2=result.targets[0]; - player.logSkill('tuishi'); - player.line2([target,event.target2]); + content: function () { + "step 0"; + var target = _status.currentPhase; + event.target = target; + player + .chooseTarget(get.prompt2("tuishi", event.target), function (card, player, target) { + var source = _status.event.source; + return source != target && source.inRange(target); + }) + .set("source", target) + .set("goon", get.damageEffect(target, player, player) > 0) + .set("ai", function (target) { + if (!_status.event.goon) return 0; + var evt = _status.event; + return get.effect(target, { name: "sha" }, evt.source, evt.player); + }); + ("step 1"); + if (result.bool) { + event.target2 = result.targets[0]; + player.logSkill("tuishi"); + player.line2([target, event.target2]); game.delayx(); - } - else event.finish(); - 'step 2' + } else event.finish(); + ("step 2"); target.chooseToUse({ - preTarget:event.target2, - prompt:'请对'+get.translation(event.target2)+'使用一张【杀】,或受到来自'+get.translation(player)+'的1点伤害', - filterCard:function(card,player){ - return get.name(card)=='sha'&&lib.filter.filterCard.apply(this,arguments); + preTarget: event.target2, + prompt: + "请对" + + get.translation(event.target2) + + "使用一张【杀】,或受到来自" + + get.translation(player) + + "的1点伤害", + filterCard: function (card, player) { + return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments); }, - filterTarget:function(card,player,target){ - return target==_status.event.preTarget&&lib.filter.filterTarget.apply(this,arguments); + filterTarget: function (card, player, target) { + return ( + target == _status.event.preTarget && + lib.filter.filterTarget.apply(this, arguments) + ); }, - addCount:false, + addCount: false, }); - 'step 3' - if(!result.bool) target.damage(); + ("step 3"); + if (!result.bool) target.damage(); }, }, - xinchoufa:{ - audio:'choufa', - inherit:'choufa', - content:function(){ - 'step 0' - player.choosePlayerCard(target,'h',true); - 'step 1' - player.showCards(result.cards,get.translation(player)+'对'+get.translation(target)+'发动了【筹伐】'); - var type=get.type2(result.cards[0],target),hs=target.getCards('h',function(card){ - return card!=result.cards[0]&&get.type2(card,target)!=type; - }); - if(hs.length){ - target.addGaintag(hs,'xinchoufa'); - target.addTempSkill('xinchoufa2',{player:'phaseAfter'}); + xinchoufa: { + audio: "choufa", + inherit: "choufa", + content: function () { + "step 0"; + player.choosePlayerCard(target, "h", true); + ("step 1"); + player.showCards( + result.cards, + get.translation(player) + "对" + get.translation(target) + "发动了【筹伐】" + ); + var type = get.type2(result.cards[0], target), + hs = target.getCards("h", function (card) { + return card != result.cards[0] && get.type2(card, target) != type; + }); + if (hs.length) { + target.addGaintag(hs, "xinchoufa"); + target.addTempSkill("xinchoufa2", { player: "phaseAfter" }); } }, }, - xinchoufa2:{ - charlotte:true, - onremove:function(player){ - player.removeGaintag('xinchoufa'); + xinchoufa2: { + charlotte: true, + onremove: function (player) { + player.removeGaintag("xinchoufa"); }, - mod:{ - cardname:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('xinchoufa')) return 'sha'; + mod: { + cardname: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return "sha"; }, - cardnature:function(card){ - if(get.itemtype(card)=='card'&&card.hasGaintag('xinchoufa')) return false; + cardnature: function (card) { + if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return false; }, }, }, - choufa:{ - enable:'phaseUse', - audio:2, - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return lib.skill.choufa.filterTarget(null,player,current); + choufa: { + enable: "phaseUse", + audio: 2, + usable: 1, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return lib.skill.choufa.filterTarget(null, player, current); }); }, - filterTarget:function(card,player,target){ - return target!=player&&!target.hasSkill('choufa2')&&target.countCards('h')>0; + filterTarget: function (card, player, target) { + return target != player && !target.hasSkill("choufa2") && target.countCards("h") > 0; }, - content:function(){ - 'step 0' - player.choosePlayerCard(target,'h',true); - 'step 1' + content: function () { + "step 0"; + player.choosePlayerCard(target, "h", true); + ("step 1"); player.showCards(result.cards); - var type=get.type2(result.cards[0],target); - target.storage.choufa2=type; - target.addTempSkill('choufa2',{player:'phaseAfter'}); + var type = get.type2(result.cards[0], target); + target.storage.choufa2 = type; + target.addTempSkill("choufa2", { player: "phaseAfter" }); }, - ai:{ - order:9, - result:{ - target:function(player,target){ - return -target.countCards('h'); + ai: { + order: 9, + result: { + target: function (player, target) { + return -target.countCards("h"); }, }, }, }, - choufa2:{ - onremove:true, - charlotte:true, - mark:true, - intro:{content:'手牌中的非$牌均视为杀'}, - mod:{ - cardname:function(card,player){ - if(get.type2(card,false)!=player.storage.choufa2) return 'sha'; + choufa2: { + onremove: true, + charlotte: true, + mark: true, + intro: { content: "手牌中的非$牌均视为杀" }, + mod: { + cardname: function (card, player) { + if (get.type2(card, false) != player.storage.choufa2) return "sha"; }, - cardnature:function(card,player){ - if(get.type2(card,false)!=player.storage.choufa2) return false; + cardnature: function (card, player) { + if (get.type2(card, false) != player.storage.choufa2) return false; }, }, }, - zhaoran:{ - audio:2, - trigger:{player:'phaseUseBegin'}, - preHidden:true, - content:function(){ - player.addTempSkill('zhaoran2','phaseUseAfter'); - var cards=player.getCards('h'); - if(cards.length>0) player.addShownCards(cards,'visible_zhaoran'); + zhaoran: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + preHidden: true, + content: function () { + player.addTempSkill("zhaoran2", "phaseUseAfter"); + var cards = player.getCards("h"); + if (cards.length > 0) player.addShownCards(cards, "visible_zhaoran"); }, }, - zhaoran2:{ - audio:'zhaoran', - group:'zhaoran3', - init:(player,skill)=>{ - if(!player.storage[skill]) player.storage[skill]=[]; + zhaoran2: { + audio: "zhaoran", + group: "zhaoran3", + init: (player, skill) => { + if (!player.storage[skill]) player.storage[skill] = []; }, - onremove:true, - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + onremove: true, + trigger: { + player: "loseAfter", + global: [ + "equipAfter", + "addJudgeAfter", + "gainAfter", + "loseAsyncAfter", + "addToExpansionAfter", + ], }, - forced:true, - charlotte:true, - popup:false, - filter:function(event,player,name){ - if(name=='gainBegin') return true; - var evt=event.getl(player); - if(!evt||!evt.hs||!evt.hs.length) return false; - var list=player.getStorage('zhaoran2'); - for(var i of evt.hs){ - var suit=get.suit(i,player); - if(!list.includes(suit)&&!player.countCards('h',{suit:suit})) return true; + forced: true, + charlotte: true, + popup: false, + filter: function (event, player, name) { + if (name == "gainBegin") return true; + var evt = event.getl(player); + if (!evt || !evt.hs || !evt.hs.length) return false; + var list = player.getStorage("zhaoran2"); + for (var i of evt.hs) { + var suit = get.suit(i, player); + if (!list.includes(suit) && !player.countCards("h", { suit: suit })) return true; } return false; }, - content:function(){ - 'step 0' - if(trigger.delay===false) game.delayx(); - 'step 1' - var list=[]; - var suits=get.copy(player.storage.zhaoran2); - suits.addArray(player.getCards('h').map(function(card){ - return get.suit(card); - })); - var evt=trigger.getl(player); - for(var i of evt.hs){ - var suit=get.suit(i,player); - if(!suits.includes(suit)) list.add(suit); + content: function () { + "step 0"; + if (trigger.delay === false) game.delayx(); + ("step 1"); + var list = []; + var suits = get.copy(player.storage.zhaoran2); + suits.addArray( + player.getCards("h").map(function (card) { + return get.suit(card); + }) + ); + var evt = trigger.getl(player); + for (var i of evt.hs) { + var suit = get.suit(i, player); + if (!suits.includes(suit)) list.add(suit); } - event.count=list.length; - player.markAuto('zhaoran2',list); - 'step 1' + event.count = list.length; + player.markAuto("zhaoran2", list); + ("step 1"); event.count--; - var filterTarget=function(card,player,target){ - return target!=player&&target.countDiscardableCards(player,'he')>0; - } - if(!game.hasPlayer(function(current){ - return filterTarget(null,player,current); - })) event._result={bool:false}; - else player.chooseTarget(filterTarget,'弃置一名其他角色的一张牌或摸一张牌').set('ai',function(target){ - var att=get.attitude(player,target); - if(att>=0) return 0; - if(target.countCards('he',function(card){ - return get.value(card)>5; - })) return -att; - return 0; - }); - 'step 2' - if(!result.bool){ - player.logSkill('zhaoran2'); + var filterTarget = function (card, player, target) { + return target != player && target.countDiscardableCards(player, "he") > 0; + }; + if ( + !game.hasPlayer(function (current) { + return filterTarget(null, player, current); + }) + ) + event._result = { bool: false }; + else + player + .chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌") + .set("ai", function (target) { + var att = get.attitude(player, target); + if (att >= 0) return 0; + if ( + target.countCards("he", function (card) { + return get.value(card) > 5; + }) + ) + return -att; + return 0; + }); + ("step 2"); + if (!result.bool) { + player.logSkill("zhaoran2"); player.draw(); + } else { + var target = result.targets[0]; + player.logSkill("zhaoran2", target); + player.discardPlayerCard(target, true, "he"); } - else{ - var target=result.targets[0]; - player.logSkill('zhaoran2',target); - player.discardPlayerCard(target,true,'he'); - } - if(event.count>0) event.goto(1); + if (event.count > 0) event.goto(1); }, - intro:{ - content:'已因$牌触发过效果', + intro: { + content: "已因$牌触发过效果", }, }, - zhaoran3:{ - trigger:{player:['phaseUseEnd','gainBegin']}, - forced:true, - charlotte:true, - firstDo:true, - silent:true, - content:function(){ - if(event.triggername=='gainBegin'){ - trigger.gaintag.add('visible_zhaoran'); - } - else{ - player.hideShownCards(player.getCards('h'),'visible_zhaoran'); + zhaoran3: { + trigger: { player: ["phaseUseEnd", "gainBegin"] }, + forced: true, + charlotte: true, + firstDo: true, + silent: true, + content: function () { + if (event.triggername == "gainBegin") { + trigger.gaintag.add("visible_zhaoran"); + } else { + player.hideShownCards(player.getCards("h"), "visible_zhaoran"); } }, }, - chengwu:{ - zhuSkill:true, - mod:{ - inRange:function(from,to){ - if(!from.hasZhuSkill('chengwu')||from._chengwu) return; - from._chengwu=true; - var bool=game.hasPlayer(function(current){ - return current!=from&¤t!=to&¤t.group=='jin'&&from.hasZhuSkill('chengwu',current)&¤t.inRange(to); + chengwu: { + zhuSkill: true, + mod: { + inRange: function (from, to) { + if (!from.hasZhuSkill("chengwu") || from._chengwu) return; + from._chengwu = true; + var bool = game.hasPlayer(function (current) { + return ( + current != from && + current != to && + current.group == "jin" && + from.hasZhuSkill("chengwu", current) && + current.inRange(to) + ); }); delete from._chengwu; - if(bool) return true; + if (bool) return true; }, }, }, - shiren:{ - trigger:{player:'showCharacterAfter'}, - hiddenSkill:true, - logTarget:function(){ + shiren: { + trigger: { player: "showCharacterAfter" }, + hiddenSkill: true, + logTarget: function () { return _status.currentPhase; }, - filter:function(event,player){ - if(!event.toShow||!event.toShow.includes('jin_wangyuanji')) return false; - var target=_status.currentPhase; - return target&&target!=player&&target.isAlive()&&target.countCards('h')>0; + filter: function (event, player) { + if (!event.toShow || !event.toShow.includes("jin_wangyuanji")) return false; + var target = _status.currentPhase; + return target && target != player && target.isAlive() && target.countCards("h") > 0; }, - content:function(){ - var next=game.createEvent('yanxi',false); - next.player=player; - next.target=_status.currentPhase; + content: function () { + var next = game.createEvent("yanxi", false); + next.player = player; + next.target = _status.currentPhase; next.setContent(lib.skill.yanxi.content); }, }, - yanxi:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h')>0; + yanxi: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; }, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current!=player&¤t.countCards('h')>0; + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current != player && current.countCards("h") > 0; }); }, - content:function(){ - 'step 0' - event.card=target.getCards('h').randomGet(); + content: function () { + "step 0"; + event.card = target.getCards("h").randomGet(); var cards; - cards=get.cards(2); - event.cards=cards.concat([event.card]); - while(cards.length){ - ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); + cards = get.cards(2); + event.cards = cards.concat([event.card]); + while (cards.length) { + ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild); } - if(get.mode()=='guozhan'){ - var num=ui.cardPile.childElementCount; - var num1=get.rand(1,num-1),num2=get.rand(1,num-1); - if(num1==num2){ - if(num1==0) num2++; + if (get.mode() == "guozhan") { + var num = ui.cardPile.childElementCount; + var num1 = get.rand(1, num - 1), + num2 = get.rand(1, num - 1); + if (num1 == num2) { + if (num1 == 0) num2++; else num1--; } - event.cards=[event.card,ui.cardPile.childNodes[num1],ui.cardPile.childNodes[num2]]; + event.cards = [ + event.card, + ui.cardPile.childNodes[num1], + ui.cardPile.childNodes[num2], + ]; } game.updateRoundNumber(); event.cards.randomSort(); - game.log(player,'展示了',event.cards); - event.videoId=lib.status.videoId++; - var str=get.translation(player)+'对'+get.translation(target)+'发动了【宴戏】'; - game.broadcastAll(function(str,id,cards){ - var dialog=ui.create.dialog(str,cards); - dialog.videoId=id; - },str,event.videoId,event.cards); - game.addVideo('showCards',player,[str,get.cardsInfo(event.cards)]); + game.log(player, "展示了", event.cards); + event.videoId = lib.status.videoId++; + var str = get.translation(player) + "对" + get.translation(target) + "发动了【宴戏】"; + game.broadcastAll( + function (str, id, cards) { + var dialog = ui.create.dialog(str, cards); + dialog.videoId = id; + }, + str, + event.videoId, + event.cards + ); + game.addVideo("showCards", player, [str, get.cardsInfo(event.cards)]); game.delay(2); - 'step 1' - var func=function(id,target){ - var dialog=get.idDialog(id); - if(dialog) dialog.content.firstChild.innerHTML='猜猜哪张是'+get.translation(target)+'的手牌?'; + ("step 1"); + var func = function (id, target) { + var dialog = get.idDialog(id); + if (dialog) + dialog.content.firstChild.innerHTML = + "猜猜哪张是" + get.translation(target) + "的手牌?"; }; - if(player==game.me) func(event.videoId,target); - else if(player.isOnline()) player.send(func,event.videoId,target); - 'step 2' - var next=player.chooseButton(true); - next.set('dialog',event.videoId); - next.set('ai',function(button){ - if(_status.event.answer) return button.link==_status.event.answer?1:0; - return get.value(button.link,_status.event.player); + if (player == game.me) func(event.videoId, target); + else if (player.isOnline()) player.send(func, event.videoId, target); + ("step 2"); + var next = player.chooseButton(true); + next.set("dialog", event.videoId); + next.set("ai", function (button) { + if (_status.event.answer) return button.link == _status.event.answer ? 1 : 0; + return get.value(button.link, _status.event.player); }); - if(player.hasSkillTag('viewHandcard',null,target,true)) next.set('answer',card); - 'step 3' - game.broadcastAll('closeDialog',event.videoId); - player.addTempSkill('yanxi2'); - var card2=result.links[0]; - if(card2==card){ - player.popup('洗具'); + if (player.hasSkillTag("viewHandcard", null, target, true)) next.set("answer", card); + ("step 3"); + game.broadcastAll("closeDialog", event.videoId); + player.addTempSkill("yanxi2"); + var card2 = result.links[0]; + if (card2 == card) { + player.popup("洗具"); cards.remove(card2); player.$gain2(cards); - player.gain(cards,'log').gaintag.add('yanxi'); - player.gain(card,target,'bySelf','give').gaintag.add('yanxi'); - } - else{ - player.popup('杯具'); - player.gain(card2,'gain2').gaintag.add('yanxi'); + player.gain(cards, "log").gaintag.add("yanxi"); + player.gain(card, target, "bySelf", "give").gaintag.add("yanxi"); + } else { + player.popup("杯具"); + player.gain(card2, "gain2").gaintag.add("yanxi"); } }, - ai:{ - order:6, - result:{ - player:1, - target:-0.6, + ai: { + order: 6, + result: { + player: 1, + target: -0.6, }, }, }, - yanxi2:{ - mod:{ - ignoredHandcard:function(card,player){ - if(card.hasGaintag('yanxi')) return true; + yanxi2: { + mod: { + ignoredHandcard: function (card, player) { + if (card.hasGaintag("yanxi")) return true; }, - cardDiscardable:function(card,player,name){ - if(name=='phaseDiscard'&&card.hasGaintag('yanxi')) return false; + cardDiscardable: function (card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("yanxi")) return false; }, }, - onremove:function(player){ - player.removeGaintag('yanxi'); + onremove: function (player) { + player.removeGaintag("yanxi"); }, }, - sanchen:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - var stat=player.getStat('sanchen'); - return game.hasPlayer(function(current){ - return (!stat||!stat.includes(current)); + sanchen: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + var stat = player.getStat("sanchen"); + return game.hasPlayer(function (current) { + return !stat || !stat.includes(current); }); }, - filterTarget:function(card,player,target){ - var stat=player.getStat('sanchen'); - return (!stat||!stat.includes(target)); + filterTarget: function (card, player, target) { + var stat = player.getStat("sanchen"); + return !stat || !stat.includes(target); }, - content:function(){ - 'step 0' - var stat=player.getStat(); - if(!stat.sanchen) stat.sanchen=[]; + content: function () { + "step 0"; + var stat = player.getStat(); + if (!stat.sanchen) stat.sanchen = []; stat.sanchen.push(target); - if(get.mode()!='guozhan') player.addMark('sanchen',1,false); + if (get.mode() != "guozhan") player.addMark("sanchen", 1, false); target.draw(3); - 'step 1' - if(!target.countCards('he')) event._result={bool:false}; - else target.chooseToDiscard('he',true,3).set('ai',function(card){ - var list=ui.selected.cards.map(function(i){ - return get.type2(i); + ("step 1"); + if (!target.countCards("he")) event._result = { bool: false }; + else + target.chooseToDiscard("he", true, 3).set("ai", function (card) { + var list = ui.selected.cards.map(function (i) { + return get.type2(i); + }); + if (!list.includes(get.type2(card))) return 7 - get.value(card); + return -get.value(card); }); - if(!list.includes(get.type2(card))) return 7-get.value(card); - return -get.value(card); - }); - 'step 2' - if(result.bool&&result.cards&&result.cards.length){ - var list=[]; - for(var i of result.cards) list.add(get.type2(i)); - if(list.length==result.cards.length){ + ("step 2"); + if (result.bool && result.cards && result.cards.length) { + var list = []; + for (var i of result.cards) list.add(get.type2(i)); + if (list.length == result.cards.length) { target.draw(); - player.getStat('skill').sanchen--; - if(get.mode()=='guozhan') player.addTempSkills('pozhu'); + player.getStat("skill").sanchen--; + if (get.mode() == "guozhan") player.addTempSkills("pozhu"); } - } - else{ + } else { target.draw(); - player.getStat('skill').sanchen--; - if(get.mode()=='guozhan') player.addTempSkills('pozhu'); + player.getStat("skill").sanchen--; + if (get.mode() == "guozhan") player.addTempSkills("pozhu"); } }, - ai:{ - order:9, - threaten:1.7, - result:{ - target:function(player,target){ - if(target.hasSkillTag('nogain')) return 0.1; - return Math.sqrt(target.countCards('he')); + ai: { + order: 9, + threaten: 1.7, + result: { + target: function (player, target) { + if (target.hasSkillTag("nogain")) return 0.1; + return Math.sqrt(target.countCards("he")); }, }, }, - intro:{ - content:'已发动过#次技能', + intro: { + content: "已发动过#次技能", }, - marktext:'陈', + marktext: "陈", }, - zhaotao:{ - forbid:['guozhan'], - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - juexingji:true, - skillAnimation:true, - animationColor:'thunder', - filter:function(event,player){ - return player.countMark('sanchen')>2; + zhaotao: { + forbid: ["guozhan"], + trigger: { player: "phaseZhunbeiBegin" }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "thunder", + filter: function (event, player) { + return player.countMark("sanchen") > 2; }, - content:function(){ - player.awakenSkill('zhaotao'); + content: function () { + player.awakenSkill("zhaotao"); player.loseMaxHp(); - player.addSkills('pozhu'); + player.addSkills("pozhu"); }, - derivation:'pozhu', + derivation: "pozhu", }, - pozhu:{ - enable:'phaseUse', - viewAsFilter:function(player){ - return !player.hasSkill('pozhu3',null,null,false)&&player.countCards('hs')>0; + pozhu: { + enable: "phaseUse", + viewAsFilter: function (player) { + return !player.hasSkill("pozhu3", null, null, false) && player.countCards("hs") > 0; }, - viewAs:{name:'chuqibuyi'}, - filterCard:true, - position:'hs', - check:function(card){ - return 7-get.value(card); + viewAs: { name: "chuqibuyi" }, + filterCard: true, + position: "hs", + check: function (card) { + return 7 - get.value(card); }, - group:'pozhu2', + group: "pozhu2", }, - pozhu2:{ - trigger:{player:'useCardAfter'}, - silent:true, - filter:function(event,player){ - return event.skill=='pozhu'&&(get.mode()=='guozhan'||!player.getHistory('sourceDamage',function(evt){ - return evt.card==event.card; - }).length); + pozhu2: { + trigger: { player: "useCardAfter" }, + silent: true, + filter: function (event, player) { + return ( + event.skill == "pozhu" && + (get.mode() == "guozhan" || + !player.getHistory("sourceDamage", function (evt) { + return evt.card == event.card; + }).length) + ); }, - content:function(){ - player.addTempSkill('pozhu3'); + content: function () { + player.addTempSkill("pozhu3"); }, }, - pozhu3:{charlotte:true}, - xijue:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:['enterGame','showCharacterAfter'], + pozhu3: { charlotte: true }, + xijue: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "showCharacterAfter"], }, - forced:true, - filter:function(event,player){ - if(player._xijue) return false; - if(get.mode()=='guozhan') return event.name=='showCharacter'&&event.toShow&&event.toShow.includes('gz_zhanghuyuechen'); - return (event.name!='showCharacter')&&(event.name!='phase'||game.phaseNumber==0); + forced: true, + filter: function (event, player) { + if (player._xijue) return false; + if (get.mode() == "guozhan") + return ( + event.name == "showCharacter" && + event.toShow && + event.toShow.includes("gz_zhanghuyuechen") + ); + return event.name != "showCharacter" && (event.name != "phase" || game.phaseNumber == 0); }, - content:function(){ - player.addMark('xijue',4); - player._xijue=true; + content: function () { + player.addMark("xijue", 4); + player._xijue = true; }, - intro:{ - name2:'爵', - content:'mark', + intro: { + name2: "爵", + content: "mark", }, - derivation:['xijue_tuxi','xijue_xiaoguo'], - group:['xijue_gain','xijue_tuxi','xijue_xiaoguo'], + derivation: ["xijue_tuxi", "xijue_xiaoguo"], + group: ["xijue_gain", "xijue_tuxi", "xijue_xiaoguo"], }, - xijue_gain:{ - audio:'xijue', - trigger:{player:'phaseEnd'}, - forced:true, - filter:function(event,player){ - var stat=player.getStat(); - return stat.damage&&stat.damage>0; + xijue_gain: { + audio: "xijue", + trigger: { player: "phaseEnd" }, + forced: true, + filter: function (event, player) { + var stat = player.getStat(); + return stat.damage && stat.damage > 0; }, - content:function(){ - player.addMark('xijue',player.getStat().damage); + content: function () { + player.addMark("xijue", player.getStat().damage); }, }, - xijue_tuxi:{ - audio:2, - trigger:{ - player:"phaseDrawBegin2", + xijue_tuxi: { + audio: 2, + trigger: { + player: "phaseDrawBegin2", }, - direct:true, - filter:function(event,player){ - return event.num>0&&!event.numFixed&&player.hasMark('xijue')&&game.hasPlayer(function(target){ - return player!=target&&target.countCards('h')>0; - }); + direct: true, + filter: function (event, player) { + return ( + event.num > 0 && + !event.numFixed && + player.hasMark("xijue") && + game.hasPlayer(function (target) { + return player != target && target.countCards("h") > 0; + }) + ); }, - content:function (){ - "step 0" - var num=trigger.num; - if(get.mode()=='guozhan'&&num>2) num=2; - player.chooseTarget('是否弃置一枚“爵”发动【突袭】?','获得至多'+get.translation(num)+'名角色的各一张手牌,然后少摸等量的牌',[1,num],function(card,player,target){ - return target.countCards('h')>0&&player!=target; - },function(target){ - var att=get.attitude(_status.event.player,target); - if(target.hasSkill('tuntian')) return att/10; - return 1-att; - }); - "step 1" - if(result.bool){ + content: function () { + "step 0"; + var num = trigger.num; + if (get.mode() == "guozhan" && num > 2) num = 2; + player.chooseTarget( + "是否弃置一枚“爵”发动【突袭】?", + "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌", + [1, num], + function (card, player, target) { + return target.countCards("h") > 0 && player != target; + }, + function (target) { + var att = get.attitude(_status.event.player, target); + if (target.hasSkill("tuntian")) return att / 10; + return 1 - att; + } + ); + ("step 1"); + if (result.bool) { result.targets.sortBySeat(); - player.logSkill('xijue_tuxi',result.targets); - player.removeMark('xijue',1); + player.logSkill("xijue_tuxi", result.targets); + player.removeMark("xijue", 1); player.gainMultiple(result.targets); - trigger.num-=result.targets.length; - } - else{ + trigger.num -= result.targets.length; + } else { event.finish(); } - "step 2" - if(trigger.num<=0) game.delay(); + ("step 2"); + if (trigger.num <= 0) game.delay(); }, - ai:{ - expose:0.2, + ai: { + expose: 0.2, }, }, - xijue_xiaoguo:{ - audio:2, - trigger:{global:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasMark('xijue')&&event.player.isAlive()&&event.player!=player&&player.countCards('h',function(card){ - if(_status.connectMode||get.mode()!='guozhan') return true; - return get.type(card)=='basic'; - }); + xijue_xiaoguo: { + audio: 2, + trigger: { global: "phaseJieshuBegin" }, + filter: function (event, player) { + return ( + player.hasMark("xijue") && + event.player.isAlive() && + event.player != player && + player.countCards("h", function (card) { + if (_status.connectMode || get.mode() != "guozhan") return true; + return get.type(card) == "basic"; + }) + ); }, - direct:true, - content:function(){ - "step 0" - var nono=(Math.abs(get.attitude(player,trigger.player))<3||trigger.player.hp>(player.countMark('xijue')*1.5)||trigger.player.countCards('e',function(card){ - return get.value(card,trigger.player)<=0; - })); - if(get.damageEffect(trigger.player,player,player)<=0){ - nono=true; + direct: true, + content: function () { + "step 0"; + var nono = + Math.abs(get.attitude(player, trigger.player)) < 3 || + trigger.player.hp > player.countMark("xijue") * 1.5 || + trigger.player.countCards("e", function (card) { + return get.value(card, trigger.player) <= 0; + }); + if (get.damageEffect(trigger.player, player, player) <= 0) { + nono = true; } - var next=player.chooseToDiscard(`是否弃置一枚“爵”和一张${get.mode()=='guozhan'?'基本':'手'}牌,对${get.translation(trigger.player)}发动【骁果】?`,'h',function(card,player){ - if(get.mode()!='guozhan') return true; - return get.type(card,player)=='basic'; + var next = player.chooseToDiscard( + `是否弃置一枚“爵”和一张${ + get.mode() == "guozhan" ? "基本" : "手" + }牌,对${get.translation(trigger.player)}发动【骁果】?`, + "h", + function (card, player) { + if (get.mode() != "guozhan") return true; + return get.type(card, player) == "basic"; + } + ); + next.set("ai", function (card) { + if (_status.event.nono) return 0; + return 8 - get.useful(card); }); - next.set('ai',function(card){ - if(_status.event.nono) return 0; - return 8-get.useful(card); - }); - next.set('logSkill',['xijue_xiaoguo',trigger.player]); - next.set('nono',nono); - "step 1" - if(result.bool){ - player.removeMark('xijue',1); - var nono=(get.damageEffect(trigger.player,player,trigger.player)>=0); - trigger.player.chooseToDiscard('he','弃置一张装备牌并令'+get.translation(player)+'摸一张牌,或受到1点伤害',{type:'equip'}).set('ai',function(card){ - if(_status.event.nono){ - return 0; - } - if(_status.event.player.hp==1) return 10-get.value(card); - return 9-get.value(card); - }).set('nono',nono); - } - else{ + next.set("logSkill", ["xijue_xiaoguo", trigger.player]); + next.set("nono", nono); + ("step 1"); + if (result.bool) { + player.removeMark("xijue", 1); + var nono = get.damageEffect(trigger.player, player, trigger.player) >= 0; + trigger.player + .chooseToDiscard( + "he", + "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", + { type: "equip" } + ) + .set("ai", function (card) { + if (_status.event.nono) { + return 0; + } + if (_status.event.player.hp == 1) return 10 - get.value(card); + return 9 - get.value(card); + }) + .set("nono", nono); + } else { event.finish(); } - "step 2" - if(result.bool){ - if(get.mode()!='guozhan') player.draw(); - } - else{ + ("step 2"); + if (result.bool) { + if (get.mode() != "guozhan") player.draw(); + } else { trigger.player.damage(); } }, - ai:{ - expose:0.3, - threaten:1.3 - } + ai: { + expose: 0.3, + threaten: 1.3, + }, }, - huishi:{ - audio:2, - trigger:{player:'phaseDrawBegin1'}, - filter:function(event,player){ - return ui.cardPile.childElementCount%10>0&&!event.numFixed; + huishi: { + audio: 2, + trigger: { player: "phaseDrawBegin1" }, + filter: function (event, player) { + return ui.cardPile.childElementCount % 10 > 0 && !event.numFixed; }, - preHidden:true, - prompt:function(){ - return get.prompt('huishi')+'(当前牌堆尾数:'+ui.cardPile.childElementCount%10+')'; + preHidden: true, + prompt: function () { + return ( + get.prompt("huishi") + + "(当前牌堆尾数:" + + (ui.cardPile.childElementCount % 10) + + ")" + ); }, - check:function(event,player){ - return ui.cardPile.childElementCount%10>3; + check: function (event, player) { + return ui.cardPile.childElementCount % 10 > 3; }, - content:function(){ - 'step 0' + content: function () { + "step 0"; trigger.changeToZero(); - var cards=game.cardsGotoOrdering(get.cards(ui.cardPile.childElementCount%10)).cards; - var num=Math.ceil(cards.length/2); - var next=player.chooseToMove('慧识:将'+get.cnNumber(num)+'张牌置于牌堆底并获得其余的牌',true); - next.set('list',[ - ['牌堆顶的展示牌',cards], - ['牌堆底'], - ]); - next.set('filterMove',function(from,to,moved){ - if(moved[0].includes(from)&&to==1) return moved[1].length<_status.event.num; + var cards = game.cardsGotoOrdering(get.cards(ui.cardPile.childElementCount % 10)).cards; + var num = Math.ceil(cards.length / 2); + var next = player.chooseToMove( + "慧识:将" + get.cnNumber(num) + "张牌置于牌堆底并获得其余的牌", + true + ); + next.set("list", [["牌堆顶的展示牌", cards], ["牌堆底"]]); + next.set("filterMove", function (from, to, moved) { + if (moved[0].includes(from) && to == 1) return moved[1].length < _status.event.num; return true; }); - next.set('filterOk',function(moved){ - return moved[1].length==_status.event.num; + next.set("filterOk", function (moved) { + return moved[1].length == _status.event.num; }); - next.set('num',num); - next.set('processAI',function(list){ - var cards=list[0][1].slice(0).sort(function(a,b){ - return get.value(b)-get.useful(a); + next.set("num", num); + next.set("processAI", function (list) { + var cards = list[0][1].slice(0).sort(function (a, b) { + return get.value(b) - get.useful(a); }); - return [cards,cards.splice(cards.length-_status.event.num)]; + return [cards, cards.splice(cards.length - _status.event.num)]; }); - 'step 1' - if(result.bool){ - var list=result.moved; - if(list[0].length) player.gain(list[0],'gain2'); - while(list[1].length) ui.cardPile.appendChild(list[1].shift().fix()); + ("step 1"); + if (result.bool) { + var list = result.moved; + if (list[0].length) player.gain(list[0], "gain2"); + while (list[1].length) ui.cardPile.appendChild(list[1].shift().fix()); } }, }, - qingleng:{ - audio:2, - trigger:{global:'phaseEnd'}, - direct:true, - preHidden:true, - filter:function(event,player){ - var target=event.player; - return target!=player&&target.isIn()&&!target.storage.nohp&&(target.hp+target.countCards('h'))>=(ui.cardPile.childElementCount%10)&&player.countCards('he')>0&&player.canUse({name:'sha',nature:'ice'},target,false); + qingleng: { + audio: 2, + trigger: { global: "phaseEnd" }, + direct: true, + preHidden: true, + filter: function (event, player) { + var target = event.player; + return ( + target != player && + target.isIn() && + !target.storage.nohp && + target.hp + target.countCards("h") >= ui.cardPile.childElementCount % 10 && + player.countCards("he") > 0 && + player.canUse({ name: "sha", nature: "ice" }, target, false) + ); }, - content:function(){ - 'step 0' - player.chooseCard('he',get.prompt('qingleng',trigger.player),'将一张牌当做冰【杀】对其使用',function(card,player){ - return player.canUse(get.autoViewAs({name:'sha',nature:'ice'},[card]),_status.event.target,false); - }).set('target',trigger.player).set('ai',function(card){ - if(get.effect(_status.event.target,get.autoViewAs({name:'sha',nature:'ice'},[card]),player)<=0) return false; - return 6-get.value(card); - }).setHiddenSkill(event.name); - 'step 1' - if(result.bool){ - player.useCard(get.autoViewAs({name:'sha',nature:'ice'},result.cards),result.cards,false,trigger.player,'qingleng'); - if(!player.storage.qingleng||!player.storage.qingleng.includes(trigger.player)){ + content: function () { + "step 0"; + player + .chooseCard( + "he", + get.prompt("qingleng", trigger.player), + "将一张牌当做冰【杀】对其使用", + function (card, player) { + return player.canUse( + get.autoViewAs({ name: "sha", nature: "ice" }, [card]), + _status.event.target, + false + ); + } + ) + .set("target", trigger.player) + .set("ai", function (card) { + if ( + get.effect( + _status.event.target, + get.autoViewAs({ name: "sha", nature: "ice" }, [card]), + player + ) <= 0 + ) + return false; + return 6 - get.value(card); + }) + .setHiddenSkill(event.name); + ("step 1"); + if (result.bool) { + player.useCard( + get.autoViewAs({ name: "sha", nature: "ice" }, result.cards), + result.cards, + false, + trigger.player, + "qingleng" + ); + if (!player.storage.qingleng || !player.storage.qingleng.includes(trigger.player)) { player.draw(); - player.markAuto('qingleng',[trigger.player]); + player.markAuto("qingleng", [trigger.player]); player.storage.qingleng.sortBySeat(); } } }, - intro:{ - content:'已对$发动过此技能', + intro: { + content: "已对$发动过此技能", }, }, - xuanmu:{ - audio:2, - trigger:{player:'showCharacterAfter'}, - forced:true, - hiddenSkill:true, - filter:function(event,player){ - return event.toShow.includes('jin_zhangchunhua')&&player!=_status.currentPhase; + xuanmu: { + audio: 2, + trigger: { player: "showCharacterAfter" }, + forced: true, + hiddenSkill: true, + filter: function (event, player) { + return event.toShow.includes("jin_zhangchunhua") && player != _status.currentPhase; }, - content:function(){ - player.addTempSkill('xuanmu2'); + content: function () { + player.addTempSkill("xuanmu2"); }, }, - xuanmu2:{ - trigger:{player:'damageBegin4'}, - forced:true, - popup:false, - content:function(){ + xuanmu2: { + trigger: { player: "damageBegin4" }, + forced: true, + popup: false, + content: function () { trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')&&!player.hasSkillTag('jueqing',false,target)) return 'zerotarget'; + ai: { + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) + return "zerotarget"; }, }, }, }, - g_hidden_ai:{ - charlotte:true, - ai:{ - threaten:function(player,target){ - if(get.mode()!='guozhan'&&target.isUnseen(2)) return 0.0001; + g_hidden_ai: { + charlotte: true, + ai: { + threaten: function (player, target) { + if (get.mode() != "guozhan" && target.isUnseen(2)) return 0.0001; return 1; }, }, }, }, - card:{ - cheliji_sichengliangyu:{ - fullskin:true, - vanish:true, - derivation:'cheliji', - destroy:'chexuan', - type:'equip', - subtype:'equip5', - skills:['cheliji_sichengliangyu'], + card: { + cheliji_sichengliangyu: { + fullskin: true, + vanish: true, + derivation: "cheliji", + destroy: "chexuan", + type: "equip", + subtype: "equip5", + skills: ["cheliji_sichengliangyu"], }, - cheliji_tiejixuanyu:{ - fullskin:true, - vanish:true, - derivation:'cheliji', - destroy:'chexuan', - type:'equip', - subtype:'equip5', - skills:['cheliji_tiejixuanyu'], + cheliji_tiejixuanyu: { + fullskin: true, + vanish: true, + derivation: "cheliji", + destroy: "chexuan", + type: "equip", + subtype: "equip5", + skills: ["cheliji_tiejixuanyu"], }, - cheliji_feilunzhanyu:{ - fullskin:true, - vanish:true, - derivation:'cheliji', - destroy:'chexuan', - type:'equip', - subtype:'equip5', - skills:['cheliji_feilunzhanyu'], + cheliji_feilunzhanyu: { + fullskin: true, + vanish: true, + derivation: "cheliji", + destroy: "chexuan", + type: "equip", + subtype: "equip5", + skills: ["cheliji_feilunzhanyu"], }, }, - characterIntro:{ - zhanghuyuechen:'张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。三国时期曹魏将领。名将张辽之子。官至偏将军,袭封晋阳侯,有一子张统。乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。', - duyu:'杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。', - xiahouhui:'夏侯徽(211年-234年),字媛容,沛国谯县(今安徽亳州)人,司马师第一任妻子。征南大将军夏侯尚之女,母德阳乡主为大司马曹真之妹。夏侯徽与司马师之间,生有五个女儿。夏侯徽很有见识器度,每当司马师有什么想法时,都由她从旁策划协助。当时司马师之父司马懿位居上将重位,而他的儿子们都有雄才大略。夏侯徽深知司马师绝非曹魏忠臣,而司马师对出身曹魏家族的夏侯徽也非常顾忌。青龙二年(234年),正逢“大疫”、“大病”之年,夏侯徽被司马师毒杀,时年二十四岁,死后葬于峻平陵。西晋建国后,追谥夏侯徽为景怀皇后。', - shibao:'石苞(?~273年),字仲容,渤海南皮(今河北省南皮县)人。三国时曹魏至西晋重要将领,西晋开国功臣。西晋建立后,历任大司马、侍中、司徒等职,封乐陵郡公,卒后谥号为“武”。', - simazhou:'司马伷(227年~283年6月12日),字子将,河内郡温县(今河南省温县)人。西晋宗室、将领,晋宣帝司马懿第三子,伏太妃所生。晋景帝司马师、文帝司马昭的同父异母弟,晋武帝司马炎的叔父。司马伷少有才气,在曹魏历任宁朔将军、散骑常侍、征虏将军等职,先后受封南安亭侯、东武乡侯,五等爵制建立后,改封南皮伯。西晋建立后,获封东莞郡王,入朝任尚书右仆射、抚军将军,出外拜镇东大将军。后改封琅邪王,加开府仪同三司。西晋伐吴时,率军出涂中,孙皓向他投降并奉上玉玺。战后因功拜大将军,增邑三千户。太康四年(283年),司马伷去世,享年五十七岁。谥号为武,世称“琅邪武王”。著有《周官宁朔新书》八卷,今已亡佚。', - huangzu:'黄祖(?-208年),东汉末年将领。刘表任荆州牧时,黄祖出任江夏太守。初平二年(191年),黄祖在与长沙太守孙坚交战时,其部下将孙坚射死,因此与孙家结下仇怨。之后,黄祖多次率部与东吴军队交战,射杀凌操、徐琨等人。建安十三年(208年),在与孙权的交战中,兵败被杀。', - cheliji:'彻里吉是历史小说《三国演义》中的虚构人物,西羌国王。蜀相诸葛亮伐魏,魏都督曹真驰书赴羌,国王彻里吉即命雅丹丞相与越吉元帅起羌兵一十五万、并战车直扣西平关。后军大败,越吉亡,雅丹被俘,亮将所获羌兵及车马器械,尽给还雅丹,俱放回国。彻里吉感蜀恩义,与之结盟。正史中没有关于彻里吉的记载。', - weiguan:'卫瓘(220年-291年),字伯玉。河东郡安邑县(今山西省夏县)人。三国曹魏后期至西晋初年重臣、书法家,曹魏尚书卫觊之子。卫瓘出身官宦世家,年轻时仕官于曹魏,历任尚书郎、散骑常侍、侍中、廷尉等职。后以镇西军司、监军身份参与伐蜀战争。蜀汉亡后,与钟会一道逮捕邓艾;钟会谋反时,又成功平息叛乱,命田续杀邓艾父子。回师后转任督徐州诸军事、镇东将军,封菑阳侯。西晋建立后,历任青州、幽州刺史、征东大将军等职,成功化解北方边境威胁,因功进爵菑阳公。后入朝为尚书令、侍中,又升任司空,领太子少傅。后逊位,拜太保。晋惠帝即位后,与贾皇后对立,终在政变中满门遇害,享年七十二岁。卫瓘善隶书及章草。不仅兼工各体,还能学古人之长,是颇有创意的书法家。唐朝张怀瓘《书断》中评其章草为“神品”。', - zhongyan:' 钟琰 (?—?年)颍川人,王浑之妻。生卒年不详,约魏末晋初间前后在世。王浑的妻子钟琰,是颍川人,为魏太傅钟繇的曾孙女,父亲钟徽,为黄门郎。她平时广泛阅读各种书籍,因此几岁的时候就能撰写文章。她聪慧弘雅,善于啸咏,她的礼仪法度,为中表所推崇,她写有文集五卷。', - yangyan:'杨艳(238年-274年8月25日),字琼芝,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第一任皇后,曹魏通事郎杨炳之女。自幼父母双亡,为舅舅赵俊所养,跟随继母段氏生活。聪明贤慧,善于书法,天生丽质,娴熟女红,嫁给了世子司马炎。泰始元年(265年),晋武帝即位,建立西晋。泰始二年(266年),杨艳受册为皇后,深得晋武帝宠幸,生下三子三女,包括晋惠帝司马衷。泰始十年(274年),去世,时年三十七,陪葬于峻阳陵,谥号武元皇后。', - yangzhi:'杨芷(259年-292年3月6日),字季兰,小字男胤,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第二任皇后,东汉太尉杨震幼子杨奉后裔,东汉末年东莱太守、蓩亭侯杨众曾孙女,西晋太傅杨骏与嫡妻庞氏之女,武元皇后杨艳堂妹。咸宁二年(276年),立为皇后,史称“婉嫕有妇德, 美映椒房”,得宠于晋武帝。生渤海殇王,早薨,之后再无生育。其父杨骏擅权引起皇后贾南风忌恨,贾南风联络汝南王司马亮、楚王司马玮发动政变,杀死杨骏,并唆使大臣上书状告杨芷谋反,让晋惠帝司马衷将其贬为庶人,押到金墉城居住。元康二年(292年),杨芷冻饿而死,谥号武悼皇后。', - xinchang:'辛敞(生卒年不详),字泰雍,陇西人氏,是曹魏时代官员。卫尉辛毗之子,辛宪英之弟。', - xuangongzhu:'高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。', - jin_guohuai:'郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。', - wangxiang:'王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。', - chengjichengcui:'成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。', + characterIntro: { + zhanghuyuechen: + "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。三国时期曹魏将领。名将张辽之子。官至偏将军,袭封晋阳侯,有一子张统。乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。", + duyu: "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。", + xiahouhui: + "夏侯徽(211年-234年),字媛容,沛国谯县(今安徽亳州)人,司马师第一任妻子。征南大将军夏侯尚之女,母德阳乡主为大司马曹真之妹。夏侯徽与司马师之间,生有五个女儿。夏侯徽很有见识器度,每当司马师有什么想法时,都由她从旁策划协助。当时司马师之父司马懿位居上将重位,而他的儿子们都有雄才大略。夏侯徽深知司马师绝非曹魏忠臣,而司马师对出身曹魏家族的夏侯徽也非常顾忌。青龙二年(234年),正逢“大疫”、“大病”之年,夏侯徽被司马师毒杀,时年二十四岁,死后葬于峻平陵。西晋建国后,追谥夏侯徽为景怀皇后。", + shibao: "石苞(?~273年),字仲容,渤海南皮(今河北省南皮县)人。三国时曹魏至西晋重要将领,西晋开国功臣。西晋建立后,历任大司马、侍中、司徒等职,封乐陵郡公,卒后谥号为“武”。", + simazhou: + "司马伷(227年~283年6月12日),字子将,河内郡温县(今河南省温县)人。西晋宗室、将领,晋宣帝司马懿第三子,伏太妃所生。晋景帝司马师、文帝司马昭的同父异母弟,晋武帝司马炎的叔父。司马伷少有才气,在曹魏历任宁朔将军、散骑常侍、征虏将军等职,先后受封南安亭侯、东武乡侯,五等爵制建立后,改封南皮伯。西晋建立后,获封东莞郡王,入朝任尚书右仆射、抚军将军,出外拜镇东大将军。后改封琅邪王,加开府仪同三司。西晋伐吴时,率军出涂中,孙皓向他投降并奉上玉玺。战后因功拜大将军,增邑三千户。太康四年(283年),司马伷去世,享年五十七岁。谥号为武,世称“琅邪武王”。著有《周官宁朔新书》八卷,今已亡佚。", + huangzu: + "黄祖(?-208年),东汉末年将领。刘表任荆州牧时,黄祖出任江夏太守。初平二年(191年),黄祖在与长沙太守孙坚交战时,其部下将孙坚射死,因此与孙家结下仇怨。之后,黄祖多次率部与东吴军队交战,射杀凌操、徐琨等人。建安十三年(208年),在与孙权的交战中,兵败被杀。", + cheliji: + "彻里吉是历史小说《三国演义》中的虚构人物,西羌国王。蜀相诸葛亮伐魏,魏都督曹真驰书赴羌,国王彻里吉即命雅丹丞相与越吉元帅起羌兵一十五万、并战车直扣西平关。后军大败,越吉亡,雅丹被俘,亮将所获羌兵及车马器械,尽给还雅丹,俱放回国。彻里吉感蜀恩义,与之结盟。正史中没有关于彻里吉的记载。", + weiguan: + "卫瓘(220年-291年),字伯玉。河东郡安邑县(今山西省夏县)人。三国曹魏后期至西晋初年重臣、书法家,曹魏尚书卫觊之子。卫瓘出身官宦世家,年轻时仕官于曹魏,历任尚书郎、散骑常侍、侍中、廷尉等职。后以镇西军司、监军身份参与伐蜀战争。蜀汉亡后,与钟会一道逮捕邓艾;钟会谋反时,又成功平息叛乱,命田续杀邓艾父子。回师后转任督徐州诸军事、镇东将军,封菑阳侯。西晋建立后,历任青州、幽州刺史、征东大将军等职,成功化解北方边境威胁,因功进爵菑阳公。后入朝为尚书令、侍中,又升任司空,领太子少傅。后逊位,拜太保。晋惠帝即位后,与贾皇后对立,终在政变中满门遇害,享年七十二岁。卫瓘善隶书及章草。不仅兼工各体,还能学古人之长,是颇有创意的书法家。唐朝张怀瓘《书断》中评其章草为“神品”。", + zhongyan: + " 钟琰 (?—?年)颍川人,王浑之妻。生卒年不详,约魏末晋初间前后在世。王浑的妻子钟琰,是颍川人,为魏太傅钟繇的曾孙女,父亲钟徽,为黄门郎。她平时广泛阅读各种书籍,因此几岁的时候就能撰写文章。她聪慧弘雅,善于啸咏,她的礼仪法度,为中表所推崇,她写有文集五卷。", + yangyan: + "杨艳(238年-274年8月25日),字琼芝,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第一任皇后,曹魏通事郎杨炳之女。自幼父母双亡,为舅舅赵俊所养,跟随继母段氏生活。聪明贤慧,善于书法,天生丽质,娴熟女红,嫁给了世子司马炎。泰始元年(265年),晋武帝即位,建立西晋。泰始二年(266年),杨艳受册为皇后,深得晋武帝宠幸,生下三子三女,包括晋惠帝司马衷。泰始十年(274年),去世,时年三十七,陪葬于峻阳陵,谥号武元皇后。", + yangzhi: + "杨芷(259年-292年3月6日),字季兰,小字男胤,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第二任皇后,东汉太尉杨震幼子杨奉后裔,东汉末年东莱太守、蓩亭侯杨众曾孙女,西晋太傅杨骏与嫡妻庞氏之女,武元皇后杨艳堂妹。咸宁二年(276年),立为皇后,史称“婉嫕有妇德, 美映椒房”,得宠于晋武帝。生渤海殇王,早薨,之后再无生育。其父杨骏擅权引起皇后贾南风忌恨,贾南风联络汝南王司马亮、楚王司马玮发动政变,杀死杨骏,并唆使大臣上书状告杨芷谋反,让晋惠帝司马衷将其贬为庶人,押到金墉城居住。元康二年(292年),杨芷冻饿而死,谥号武悼皇后。", + xinchang: "辛敞(生卒年不详),字泰雍,陇西人氏,是曹魏时代官员。卫尉辛毗之子,辛宪英之弟。", + xuangongzhu: + "高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。", + jin_guohuai: + "郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。", + wangxiang: + "王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。", + chengjichengcui: + "成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。", }, - characterTitle:{}, - characterFilter:{}, - dynamicTranslate:{}, - perfectPair:{ - jin_simayi:['jin_zhangchunhua','shibao','duyu'], - jin_simazhao:['jin_wangyuanji'], - jin_simashi:['jin_xiahouhui','jin_yanghuiyu'], - xuangongzhu:['duyu'], + characterTitle: {}, + characterFilter: {}, + dynamicTranslate: {}, + perfectPair: { + jin_simayi: ["jin_zhangchunhua", "shibao", "duyu"], + jin_simazhao: ["jin_wangyuanji"], + jin_simashi: ["jin_xiahouhui", "jin_yanghuiyu"], + xuangongzhu: ["duyu"], }, - characterReplace:{ - yanghu:['jin_yanghu','dc_yanghu','sp_yanghu'], - jiachong:['dc_jiachong','jin_jiachong','jiachong'], - yangyan:['yangyan','old_yangyan'], - yangzhi:['yangzhi','old_yangzhi'], - zhongyan:['zhongyan','clan_zhongyan'], + characterReplace: { + yanghu: ["jin_yanghu", "dc_yanghu", "sp_yanghu"], + jiachong: ["dc_jiachong", "jin_jiachong", "jiachong"], + yangyan: ["yangyan", "old_yangyan"], + yangzhi: ["yangzhi", "old_yangzhi"], + zhongyan: ["zhongyan", "clan_zhongyan"], }, - translate:{ - jin_zhangchunhua:'晋张春华', - jin_zhangchunhua_prefix:'晋', - huishi:'慧识', - huishi_info:'摸牌阶段,你可以放弃摸牌,改为观看牌堆顶的X张牌,获得其中的一半(向下取整),然后将其余牌置入牌堆底。(X为牌堆数量的个位数)', - qingleng:'清冷', - qingleng_info:'一名角色的回合结束时,若其体力值与手牌数之和不小于X,则你可将一张牌当无距离限制的冰属性【杀】对其使用(X为牌堆数量的个位数)。若这是你本局游戏内首次对其发动此技能,则你摸一张牌。', - xuanmu:'宣穆', - xuanmu2:'宣穆', - xuanmu_info:'锁定技,隐匿技。你于其他角色的回合登场时,防止你受到的伤害直到回合结束。', - jin_simayi:'晋司马懿', - jin_simayi_prefix:'晋', - zhanghuyuechen:'张虎乐綝', - xijue:'袭爵', - xijue_gain:'袭爵', - xijue_info:'锁定技,游戏开始时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。', - xijue_info_guozhan:'锁定技,当你首次明置此武将牌时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。', - xijue_tuxi:'突袭', - xijue_tuxi_info:'摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。', - xijue_tuxi_info_guozhan:'摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。', - xijue_xiaoguo:'骁果', - xijue_xiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。', - xijue_xiaoguo_info_guozhan:'其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。', - gz_duyu:'杜预', - duyu:'晋杜预', - duyu_prefix:'晋', - sanchen:'三陈', - sanchen_info:'出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。', - sanchen_info_guozhan:'出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。', - zhaotao:'诏讨', - zhaotao_info:'觉醒技,准备阶段,若你本局游戏内发动〖三陈〗的次数大于2,则你减1点体力上限并获得〖破竹〗。', - pozhu:'破竹', - pozhu_info:'出牌阶段,你可以将一张手牌当做【出其不意】使用。若你未因此牌造成过伤害,则你不能再发动〖破竹〗直到回合结束。', - pozhu_info_guozhan:'出牌阶段限一次,你可以将一张手牌当做【出其不意】使用。', - jin_wangyuanji:'晋王元姬', - jin_wangyuanji_prefix:'晋', - shiren:'识人', - shiren_info:'隐匿技。你于其他角色的回合内登场时,若其有手牌,则你可对其发动〖宴戏〗。', - yanxi:'宴戏', - yanxi2:'宴戏', - yanxi_info:'出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆顶的两张牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。', - yanxi_info_guozhan:'出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆中的两张随机牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。', - jin_simazhao:'晋司马昭', - jin_simazhao_prefix:'晋', - tuishi:'推弑', - tuishi_info:'隐匿技,你于其他角色A的回合内登场时,可于此回合结束时选择其攻击范围内的一名角色B。A选择一项:①对B使用一张【杀】。②你对A造成1点伤害。', - choufa:'筹伐', - choufa2:'筹伐', - choufa_info:'出牌阶段限一次,你可展示一名其他角色的一张手牌并记录其类型A。你令其原类型不为A的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。', - xinchoufa:'筹伐', - xinchoufa_info:'出牌阶段限一次,你可展示一名其他角色的一张手牌A。你令其所有类型与A不同的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。', - zhaoran:'昭然', - zhaoran2:'昭然', - zhaoran_info:'出牌阶段开始时,你可令你的手牌对其他角色可见直到出牌阶段结束。若如此做,当你于此阶段内失去一张手牌后,若你的手牌里没有与此牌花色相同的牌且你本回合内未因该花色的牌触发过此效果,则你选择一项:①摸一张牌。②弃置一名其他角色的一张牌。', - visible_zhaoran:'invisible', - chengwu:'成务', - chengwu_info:'主公技,锁定技,其他晋势力角色攻击范围内的角色视为在你的攻击范围内。', - jin_xiahouhui:'晋夏侯徽', - jin_xiahouhui_prefix:'晋', - baoqie:'宝箧', - baoqie_info:'隐匿技,锁定技。你登场后,从牌堆或弃牌堆中获得一张不为赠物的宝物牌。若此牌在你的手牌区内为宝物牌,则你可以使用此牌。', - jyishi:'宜室', - jyishi_info:'每回合限一次,当有其他角色于其出牌阶段内因弃置而失去手牌后,你可令其获得这些牌中位于弃牌堆的一张,然后你获得其余位于弃牌堆的牌。', - shiduo:'识度', - shiduo_info:'出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得其所有手牌。然后你交给其X张手牌(X为你手牌数的一半,向下取整)。', - jin_simashi:'晋司马师', - jin_simashi_prefix:'晋', - taoyin:'韬隐', - taoyin2:'韬隐', - taoyin_info:'隐匿技,当你登场后,若当前回合角色存在且不是你,则你可令该角色本回合的手牌上限-2。', - yimie:'夷灭', - yimie2:'夷灭', - yimie_info:'每回合限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力(Y为其体力值)。', - ruilve:'睿略', - ruilve2:'睿略', - ruilve_info:'主公技,其他晋势力角色的出牌阶段限一次,该角色可以将一张带有伤害标签的基本牌或锦囊牌交给你。', - tairan:'泰然', - tairan2:'泰然', - tairan_info:'锁定技,回合结束时,你将体力回复至体力上限,并将手牌摸至体力上限(称为“泰然”牌,且至多摸五张)。然后你的下一个出牌阶段开始时,你失去上一次以此法回复的体力值的体力,弃置所有“泰然”牌。', - gz_jin_simayi:'司马懿', - gz_jin_zhangchunhua:'张春华', - gz_jin_simazhao:'司马昭', - gz_jin_wangyuanji:'王元姬', - gz_jin_simashi:'司马师', - gz_jin_xiahouhui:'夏侯徽', - xinquanbian:'权变', - xinquanbian_info:'出牌阶段,每当你首次使用/打出一种花色的手牌时,你可以从牌堆顶的X张牌中获得一张与此牌花色不同的牌,并将其余牌以任意顺序置于牌堆顶。出牌阶段,你至多可使用X张非装备手牌。(X为你的体力上限)', - shibao:'石苞', - zhuosheng:'擢升', - zhuosheng_info:'出牌阶段,①你使用本轮内得到的基本牌时无次数和距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。', - zhuosheng_info_guozhan:'出牌阶段,①你使用本轮内得到的基本牌时无距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。', - jin_yanghuiyu:'晋羊徽瑜', - jin_yanghuiyu_prefix:'晋', - gz_jin_yanghuiyu:'羊徽瑜', - huirong:'慧容', - huirong_info:'隐匿技,锁定技。当你登场后,你令一名角色将手牌数摸至/弃至与体力值相同(至多摸至五张)。', - ciwei:'慈威', - ciwei_info:'一名角色于其回合内使用第二张牌时,若此牌为基本牌或普通锦囊牌,则你可以弃置一张牌,取消此牌的所有目标。', - caiyuan:'才媛', - caiyuan_info:'锁定技。回合结束时,若你于你的上一个回合结束后未扣减过体力,则你摸两张牌。', - simazhou:'司马伷', - caiwang:'才望', - caiwang_info:'当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。', - naxiang:'纳降', - naxiang2:'纳降', - naxiang_info:'锁定技,当你受到其他角色造成的伤害后,或你对其他角色造成伤害后,你对其发动〖才望①〗时的“弃置”改为“获得”直到你的下回合开始。', - cheliji:'彻里吉', - chexuan:'车悬', - chexuan_info:'出牌阶段,若你的装备区里没有宝物牌,你可弃置一张黑色牌,选择一张【舆】置入你的装备区;当你失去装备区里的宝物牌后,你可进行判定,若结果为黑色,将一张随机的【舆】置入你的装备区。', - qiangshou:'羌首', - qiangshou_info:'锁定技,若你的装备区内有宝物牌,你与其他角色的距离-1。', - cheliji_sichengliangyu:'四乘粮舆', - cheliji_sichengliangyu_bg:'粮', - cheliji_sichengliangyu_info:'一名角色的回合结束时,若你的手牌数小于体力值,你可以摸两张牌,然后弃置此牌。', - cheliji_tiejixuanyu:'铁蒺玄舆', - cheliji_tiejixuanyu_bg:'蒺', - cheliji_tiejixuanyu_info:'其他角色的回合结束时,若其本回合未造成过伤害,你可以令其弃置两张牌,然后弃置此牌。', - cheliji_feilunzhanyu:'飞轮战舆', - cheliji_feilunzhanyu_bg:'轮', - cheliji_feilunzhanyu_info:'其他角色的回合结束时,若其本回合使用过非基本牌,你可以令其交给你一张牌,然后弃置此牌。', - weiguan:'卫瓘', - zhongyun:'忠允', - zhongyun2:'忠允', - zhongyun_info:'锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复1点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。', - shenpin:'神品', - shenpin_info:'当一名角色的判定牌生效前,你可以打出一张与判定牌颜色不同的牌代替之。', - zhongyan:'钟琰', - bolan:'博览', - bolan_info:'①出牌阶段开始时,你可从三个描述中带有“出牌阶段限一次”的技能中选择一个,令当前回合角色获得直至此阶段结束。②其他角色出牌阶段限一次,其可以失去1点体力,令你发动一次〖博览①〗。', - yifa:'仪法', - yifa2:'仪法', - yifa_info:'锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到其回合结束。', - ol_huaxin:'OL华歆', - ol_huaxin_prefix:'OL', - caozhao:'草诏', - caozhao_backup:'草诏', - caozhao_info:'出牌阶段限一次,你可展示一张手牌并声明一种未以此法声明过的基本牌或普通锦囊牌,令一名体力不大于你的其他角色选择一项:令此牌视为你声明的牌,或其失去1点体力。然后若此牌声明成功,然后你可将其交给一名其他角色。', - olxibing:'息兵', - olxibing_info:'当你受到其他角色造成的伤害后,你可弃置你或该角色两张牌,然后你们中手牌少的角色摸两张牌,以此法摸牌的角色不能使用牌指定你为目标直到回合结束。', - recaiwang:'才望', - recaiwang_info:'①当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。②若你的手牌数为1,则你可以将该手牌当做【闪】使用或打出。③若你的装备区牌数为1,则你可以将该装备当做【无懈可击】使用或打出。④若你的判定区牌数为1,则你可以将该延时锦囊牌当做【杀】使用或打出。', - recaiwang_hand:'才望', - recaiwang_equip:'才望', - recaiwang_judge:'才望', - yangyan:'杨艳', - xuanbei:'选备', - xuanbei_info:'①游戏开始时,你从牌堆中获得两张具有应变标签的牌。②每回合限一次。当你使用的具有应变标签的牌结算结束后,你可将此牌对应的所有实体牌交给一名其他角色。', - xianwan:'娴婉', - xianwan_info:'①当你需要使用【闪】时,若你的武将牌未横置,则你可以横置武将牌并视为使用【闪】。②当你需要使用【杀】时,若你的武将牌横置,则你可以重置武将牌并视为使用【杀】。', - yangzhi:'杨芷', - wanyi:'婉嫕', - wanyi_info:'每回合每项限一次。出牌阶段,你可以将一张具有应变效果的牌当做【逐近弃远】/【出其不意】/【水淹七军】/【洞烛先机】使用。', - maihuo:'埋祸', - maihuo_info:'①当你成为其他角色使用【杀】的目标后,若此【杀】不为转化牌且有对应的实体牌且其武将牌上没有“祸”且你是此牌的唯一目标,则你可以令此牌对你无效,并将此【杀】置于其武将牌上,称为“祸”。②一名其他角色的出牌阶段开始时,若其武将牌上有“祸”,则其对你使用此“祸”(有距离限制且计入次数限制,若你不是此牌的合法目标,则改为将此“祸”置入弃牌堆)。③当你对有“祸”的其他角色造成伤害后,你移去其“祸”。', - xinchang:'辛敞', - canmou:'参谋', - canmou_info:'一名角色使用普通锦囊牌指定第一个目标时,若其手牌数为全场唯一最多,则你可以为此牌增加一个额外目标。', - congjian:'从鉴', - congjian_info:'一名其他角色成为普通锦囊牌的唯一目标时,若其体力值为全场唯一最多,则你也可以成为此牌的目标。此牌结算结束后,若你受到过渠道为此牌的伤害,则你摸两张牌。', - xuangongzhu:'宣公主', - gaoling:'高陵', - gaoling_info:'隐匿技。当你于回合外明置此武将牌时,你可以令一名角色回复1点体力。', - qimei:'齐眉', - qimei_info:'准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。', - ybzhuiji:'追姬', - ybzhuiji_info:'出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。', - jin_yanghu:'晋羊祜', - jin_yanghu_prefix:'晋', - huaiyuan:'怀远', - huaiyuanx:'绥', - huaiyuan_info:'①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。', - chongxin:'崇信', - chongxin_info:'出牌阶段限一次,你可重铸一张牌,且令一名有手牌的其他角色也重铸一张牌。', - dezhang:'德彰', - dezhang_info:'觉醒技。准备阶段,若你没有“绥”,则你减1点体力上限并获得〖卫戍〗。', - weishu:'卫戍', - weishu_info:'锁定技。①当你于摸牌阶段外不因〖卫戍①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戍②〗而弃置牌后,你弃置一名其他角色的一张牌。', - jin_jiachong:'晋贾充', - jin_jiachong_prefix:'晋', - xiongshu:'凶竖', - xiongshu_info:'其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张手牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。', - jianhui:'奸回', - jianhui_info:'锁定技。当你造成伤害后,若受伤角色为A,则你摸一张牌;当你受到伤害后,若伤害来源为A,则A弃置一张牌。(A为除本次伤害外最近一次对你造成过伤害的角色)', - xinxuanbei:'选备', - xinxuanbei_info:'出牌阶段限一次。你可选择一名其他角色区域内的一张牌。然后其对你使用对应实体牌为此牌的【杀】。然后若此【杀】,未对你造成过伤害,你摸一张牌;对你造成过伤害,你摸两张牌。', - xinwanyi:'婉嫕', - xinwanyi_info:'①当你使用【杀】或普通锦囊牌指定其他角色为唯一目标后,你可将其的一张牌置于你的武将牌上作为“嫕”。②你不能使用/打出/弃置与“嫕”花色相同的牌。③结束阶段或当你受到伤害后,你令一名角色获得你的一张“嫕”。', - jin_guohuai:'郭槐', - zhefu:'哲妇', - zhefu_info:'当你于回合外使用或打出牌后,你可令一名有手牌的其他角色选择一项:⒈弃置一张名称相同的牌。⒉受到你造成的1点伤害。', - yidu:'遗毒', - yidu_info:'当你使用的【杀】或伤害性锦囊牌结算结束后,你可以展示一名未受到过渠道为此牌伤害的目标角色的至多三张手牌。若这些牌颜色均相同,则你弃置这些牌。', - wangxiang:'王祥', - bingxin:'冰心', - bingxin_info:'每种牌名每回合限一次。当你需要使用基本牌时,若你的手牌数等于体力值且这些牌的颜色均相同,则你可以摸一张牌,视为使用一张基本牌。', - ol_lisu:'OL李肃', - ol_lisu_prefix:'OL', - qiaoyan:'巧言', - qiaoyan_info:'锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。', - xianzhu:'献珠', - xianzhu_info:'锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择你攻击范围内的一名角色B,视为A对B使用一张【杀】。', - chengjichengcui:'成济成倅', - oltousui:'透髓', - oltousui_info:'你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。', - olchuming:'畜鸣', - olchuming_info:'锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。', + translate: { + jin_zhangchunhua: "晋张春华", + jin_zhangchunhua_prefix: "晋", + huishi: "慧识", + huishi_info: + "摸牌阶段,你可以放弃摸牌,改为观看牌堆顶的X张牌,获得其中的一半(向下取整),然后将其余牌置入牌堆底。(X为牌堆数量的个位数)", + qingleng: "清冷", + qingleng_info: + "一名角色的回合结束时,若其体力值与手牌数之和不小于X,则你可将一张牌当无距离限制的冰属性【杀】对其使用(X为牌堆数量的个位数)。若这是你本局游戏内首次对其发动此技能,则你摸一张牌。", + xuanmu: "宣穆", + xuanmu2: "宣穆", + xuanmu_info: "锁定技,隐匿技。你于其他角色的回合登场时,防止你受到的伤害直到回合结束。", + jin_simayi: "晋司马懿", + jin_simayi_prefix: "晋", + zhanghuyuechen: "张虎乐綝", + xijue: "袭爵", + xijue_gain: "袭爵", + xijue_info: + "锁定技,游戏开始时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。", + xijue_info_guozhan: + "锁定技,当你首次明置此武将牌时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。", + xijue_tuxi: "突袭", + xijue_tuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。", + xijue_tuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。", + xijue_xiaoguo: "骁果", + xijue_xiaoguo_info: + "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。", + xijue_xiaoguo_info_guozhan: + "其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。", + gz_duyu: "杜预", + duyu: "晋杜预", + duyu_prefix: "晋", + sanchen: "三陈", + sanchen_info: + "出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。", + sanchen_info_guozhan: + "出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。", + zhaotao: "诏讨", + zhaotao_info: + "觉醒技,准备阶段,若你本局游戏内发动〖三陈〗的次数大于2,则你减1点体力上限并获得〖破竹〗。", + pozhu: "破竹", + pozhu_info: + "出牌阶段,你可以将一张手牌当做【出其不意】使用。若你未因此牌造成过伤害,则你不能再发动〖破竹〗直到回合结束。", + pozhu_info_guozhan: "出牌阶段限一次,你可以将一张手牌当做【出其不意】使用。", + jin_wangyuanji: "晋王元姬", + jin_wangyuanji_prefix: "晋", + shiren: "识人", + shiren_info: "隐匿技。你于其他角色的回合内登场时,若其有手牌,则你可对其发动〖宴戏〗。", + yanxi: "宴戏", + yanxi2: "宴戏", + yanxi_info: + "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆顶的两张牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。", + yanxi_info_guozhan: + "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆中的两张随机牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。", + jin_simazhao: "晋司马昭", + jin_simazhao_prefix: "晋", + tuishi: "推弑", + tuishi_info: + "隐匿技,你于其他角色A的回合内登场时,可于此回合结束时选择其攻击范围内的一名角色B。A选择一项:①对B使用一张【杀】。②你对A造成1点伤害。", + choufa: "筹伐", + choufa2: "筹伐", + choufa_info: + "出牌阶段限一次,你可展示一名其他角色的一张手牌并记录其类型A。你令其原类型不为A的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。", + xinchoufa: "筹伐", + xinchoufa_info: + "出牌阶段限一次,你可展示一名其他角色的一张手牌A。你令其所有类型与A不同的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。", + zhaoran: "昭然", + zhaoran2: "昭然", + zhaoran_info: + "出牌阶段开始时,你可令你的手牌对其他角色可见直到出牌阶段结束。若如此做,当你于此阶段内失去一张手牌后,若你的手牌里没有与此牌花色相同的牌且你本回合内未因该花色的牌触发过此效果,则你选择一项:①摸一张牌。②弃置一名其他角色的一张牌。", + visible_zhaoran: "invisible", + chengwu: "成务", + chengwu_info: "主公技,锁定技,其他晋势力角色攻击范围内的角色视为在你的攻击范围内。", + jin_xiahouhui: "晋夏侯徽", + jin_xiahouhui_prefix: "晋", + baoqie: "宝箧", + baoqie_info: + "隐匿技,锁定技。你登场后,从牌堆或弃牌堆中获得一张不为赠物的宝物牌。若此牌在你的手牌区内为宝物牌,则你可以使用此牌。", + jyishi: "宜室", + jyishi_info: + "每回合限一次,当有其他角色于其出牌阶段内因弃置而失去手牌后,你可令其获得这些牌中位于弃牌堆的一张,然后你获得其余位于弃牌堆的牌。", + shiduo: "识度", + shiduo_info: + "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得其所有手牌。然后你交给其X张手牌(X为你手牌数的一半,向下取整)。", + jin_simashi: "晋司马师", + jin_simashi_prefix: "晋", + taoyin: "韬隐", + taoyin2: "韬隐", + taoyin_info: "隐匿技,当你登场后,若当前回合角色存在且不是你,则你可令该角色本回合的手牌上限-2。", + yimie: "夷灭", + yimie2: "夷灭", + yimie_info: + "每回合限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力(Y为其体力值)。", + ruilve: "睿略", + ruilve2: "睿略", + ruilve_info: + "主公技,其他晋势力角色的出牌阶段限一次,该角色可以将一张带有伤害标签的基本牌或锦囊牌交给你。", + tairan: "泰然", + tairan2: "泰然", + tairan_info: + "锁定技,回合结束时,你将体力回复至体力上限,并将手牌摸至体力上限(称为“泰然”牌,且至多摸五张)。然后你的下一个出牌阶段开始时,你失去上一次以此法回复的体力值的体力,弃置所有“泰然”牌。", + gz_jin_simayi: "司马懿", + gz_jin_zhangchunhua: "张春华", + gz_jin_simazhao: "司马昭", + gz_jin_wangyuanji: "王元姬", + gz_jin_simashi: "司马师", + gz_jin_xiahouhui: "夏侯徽", + xinquanbian: "权变", + xinquanbian_info: + "出牌阶段,每当你首次使用/打出一种花色的手牌时,你可以从牌堆顶的X张牌中获得一张与此牌花色不同的牌,并将其余牌以任意顺序置于牌堆顶。出牌阶段,你至多可使用X张非装备手牌。(X为你的体力上限)", + shibao: "石苞", + zhuosheng: "擢升", + zhuosheng_info: + "出牌阶段,①你使用本轮内得到的基本牌时无次数和距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。", + zhuosheng_info_guozhan: + "出牌阶段,①你使用本轮内得到的基本牌时无距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。", + jin_yanghuiyu: "晋羊徽瑜", + jin_yanghuiyu_prefix: "晋", + gz_jin_yanghuiyu: "羊徽瑜", + huirong: "慧容", + huirong_info: + "隐匿技,锁定技。当你登场后,你令一名角色将手牌数摸至/弃至与体力值相同(至多摸至五张)。", + ciwei: "慈威", + ciwei_info: + "一名角色于其回合内使用第二张牌时,若此牌为基本牌或普通锦囊牌,则你可以弃置一张牌,取消此牌的所有目标。", + caiyuan: "才媛", + caiyuan_info: "锁定技。回合结束时,若你于你的上一个回合结束后未扣减过体力,则你摸两张牌。", + simazhou: "司马伷", + caiwang: "才望", + caiwang_info: + "当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。", + naxiang: "纳降", + naxiang2: "纳降", + naxiang_info: + "锁定技,当你受到其他角色造成的伤害后,或你对其他角色造成伤害后,你对其发动〖才望①〗时的“弃置”改为“获得”直到你的下回合开始。", + cheliji: "彻里吉", + chexuan: "车悬", + chexuan_info: + "出牌阶段,若你的装备区里没有宝物牌,你可弃置一张黑色牌,选择一张【舆】置入你的装备区;当你失去装备区里的宝物牌后,你可进行判定,若结果为黑色,将一张随机的【舆】置入你的装备区。", + qiangshou: "羌首", + qiangshou_info: "锁定技,若你的装备区内有宝物牌,你与其他角色的距离-1。", + cheliji_sichengliangyu: "四乘粮舆", + cheliji_sichengliangyu_bg: "粮", + cheliji_sichengliangyu_info: + "一名角色的回合结束时,若你的手牌数小于体力值,你可以摸两张牌,然后弃置此牌。", + cheliji_tiejixuanyu: "铁蒺玄舆", + cheliji_tiejixuanyu_bg: "蒺", + cheliji_tiejixuanyu_info: + "其他角色的回合结束时,若其本回合未造成过伤害,你可以令其弃置两张牌,然后弃置此牌。", + cheliji_feilunzhanyu: "飞轮战舆", + cheliji_feilunzhanyu_bg: "轮", + cheliji_feilunzhanyu_info: + "其他角色的回合结束时,若其本回合使用过非基本牌,你可以令其交给你一张牌,然后弃置此牌。", + weiguan: "卫瓘", + zhongyun: "忠允", + zhongyun2: "忠允", + zhongyun_info: + "锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复1点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。", + shenpin: "神品", + shenpin_info: "当一名角色的判定牌生效前,你可以打出一张与判定牌颜色不同的牌代替之。", + zhongyan: "钟琰", + bolan: "博览", + bolan_info: + "①出牌阶段开始时,你可从三个描述中带有“出牌阶段限一次”的技能中选择一个,令当前回合角色获得直至此阶段结束。②其他角色出牌阶段限一次,其可以失去1点体力,令你发动一次〖博览①〗。", + yifa: "仪法", + yifa2: "仪法", + yifa_info: + "锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到其回合结束。", + ol_huaxin: "OL华歆", + ol_huaxin_prefix: "OL", + caozhao: "草诏", + caozhao_backup: "草诏", + caozhao_info: + "出牌阶段限一次,你可展示一张手牌并声明一种未以此法声明过的基本牌或普通锦囊牌,令一名体力不大于你的其他角色选择一项:令此牌视为你声明的牌,或其失去1点体力。然后若此牌声明成功,然后你可将其交给一名其他角色。", + olxibing: "息兵", + olxibing_info: + "当你受到其他角色造成的伤害后,你可弃置你或该角色两张牌,然后你们中手牌少的角色摸两张牌,以此法摸牌的角色不能使用牌指定你为目标直到回合结束。", + recaiwang: "才望", + recaiwang_info: + "①当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。②若你的手牌数为1,则你可以将该手牌当做【闪】使用或打出。③若你的装备区牌数为1,则你可以将该装备当做【无懈可击】使用或打出。④若你的判定区牌数为1,则你可以将该延时锦囊牌当做【杀】使用或打出。", + recaiwang_hand: "才望", + recaiwang_equip: "才望", + recaiwang_judge: "才望", + yangyan: "杨艳", + xuanbei: "选备", + xuanbei_info: + "①游戏开始时,你从牌堆中获得两张具有应变标签的牌。②每回合限一次。当你使用的具有应变标签的牌结算结束后,你可将此牌对应的所有实体牌交给一名其他角色。", + xianwan: "娴婉", + xianwan_info: + "①当你需要使用【闪】时,若你的武将牌未横置,则你可以横置武将牌并视为使用【闪】。②当你需要使用【杀】时,若你的武将牌横置,则你可以重置武将牌并视为使用【杀】。", + yangzhi: "杨芷", + wanyi: "婉嫕", + wanyi_info: + "每回合每项限一次。出牌阶段,你可以将一张具有应变效果的牌当做【逐近弃远】/【出其不意】/【水淹七军】/【洞烛先机】使用。", + maihuo: "埋祸", + maihuo_info: + "①当你成为其他角色使用【杀】的目标后,若此【杀】不为转化牌且有对应的实体牌且其武将牌上没有“祸”且你是此牌的唯一目标,则你可以令此牌对你无效,并将此【杀】置于其武将牌上,称为“祸”。②一名其他角色的出牌阶段开始时,若其武将牌上有“祸”,则其对你使用此“祸”(有距离限制且计入次数限制,若你不是此牌的合法目标,则改为将此“祸”置入弃牌堆)。③当你对有“祸”的其他角色造成伤害后,你移去其“祸”。", + xinchang: "辛敞", + canmou: "参谋", + canmou_info: + "一名角色使用普通锦囊牌指定第一个目标时,若其手牌数为全场唯一最多,则你可以为此牌增加一个额外目标。", + congjian: "从鉴", + congjian_info: + "一名其他角色成为普通锦囊牌的唯一目标时,若其体力值为全场唯一最多,则你也可以成为此牌的目标。此牌结算结束后,若你受到过渠道为此牌的伤害,则你摸两张牌。", + xuangongzhu: "宣公主", + gaoling: "高陵", + gaoling_info: "隐匿技。当你于回合外明置此武将牌时,你可以令一名角色回复1点体力。", + qimei: "齐眉", + qimei_info: + "准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。", + ybzhuiji: "追姬", + ybzhuiji_info: + "出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。", + jin_yanghu: "晋羊祜", + jin_yanghu_prefix: "晋", + huaiyuan: "怀远", + huaiyuanx: "绥", + huaiyuan_info: + "①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。", + chongxin: "崇信", + chongxin_info: "出牌阶段限一次,你可重铸一张牌,且令一名有手牌的其他角色也重铸一张牌。", + dezhang: "德彰", + dezhang_info: "觉醒技。准备阶段,若你没有“绥”,则你减1点体力上限并获得〖卫戍〗。", + weishu: "卫戍", + weishu_info: + "锁定技。①当你于摸牌阶段外不因〖卫戍①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戍②〗而弃置牌后,你弃置一名其他角色的一张牌。", + jin_jiachong: "晋贾充", + jin_jiachong_prefix: "晋", + xiongshu: "凶竖", + xiongshu_info: + "其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张手牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。", + jianhui: "奸回", + jianhui_info: + "锁定技。当你造成伤害后,若受伤角色为A,则你摸一张牌;当你受到伤害后,若伤害来源为A,则A弃置一张牌。(A为除本次伤害外最近一次对你造成过伤害的角色)", + xinxuanbei: "选备", + xinxuanbei_info: + "出牌阶段限一次。你可选择一名其他角色区域内的一张牌。然后其对你使用对应实体牌为此牌的【杀】。然后若此【杀】,未对你造成过伤害,你摸一张牌;对你造成过伤害,你摸两张牌。", + xinwanyi: "婉嫕", + xinwanyi_info: + "①当你使用【杀】或普通锦囊牌指定其他角色为唯一目标后,你可将其的一张牌置于你的武将牌上作为“嫕”。②你不能使用/打出/弃置与“嫕”花色相同的牌。③结束阶段或当你受到伤害后,你令一名角色获得你的一张“嫕”。", + jin_guohuai: "郭槐", + zhefu: "哲妇", + zhefu_info: + "当你于回合外使用或打出牌后,你可令一名有手牌的其他角色选择一项:⒈弃置一张名称相同的牌。⒉受到你造成的1点伤害。", + yidu: "遗毒", + yidu_info: + "当你使用的【杀】或伤害性锦囊牌结算结束后,你可以展示一名未受到过渠道为此牌伤害的目标角色的至多三张手牌。若这些牌颜色均相同,则你弃置这些牌。", + wangxiang: "王祥", + bingxin: "冰心", + bingxin_info: + "每种牌名每回合限一次。当你需要使用基本牌时,若你的手牌数等于体力值且这些牌的颜色均相同,则你可以摸一张牌,视为使用一张基本牌。", + ol_lisu: "OL李肃", + ol_lisu_prefix: "OL", + qiaoyan: "巧言", + qiaoyan_info: + "锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。", + xianzhu: "献珠", + xianzhu_info: + "锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择你攻击范围内的一名角色B,视为A对B使用一张【杀】。", + chengjichengcui: "成济成倅", + oltousui: "透髓", + oltousui_info: "你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。", + olchuming: "畜鸣", + olchuming_info: + "锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。", - yingbian_pack1:'文德武备·理', - yingbian_pack2:'文德武备·备', - yingbian_pack3:'文德武备·果', - yingbian_pack4:'文德武备·戒', - yingbian_pack5:'文德武备·约', + yingbian_pack1: "文德武备·理", + yingbian_pack2: "文德武备·备", + yingbian_pack3: "文德武备·果", + yingbian_pack4: "文德武备·戒", + yingbian_pack5: "文德武备·约", }, }; }); diff --git a/character/yxs.js b/character/yxs.js index 39e66b44a..e30a559b0 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -1,3134 +1,3354 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { +import { lib, game, ui, get, ai, _status } from "../noname.js"; +game.import("character", function () { return { - name:'yxs', - character:{ - yxs_qinqiong:["male","wei",4,["yxs_fanji","yxs_menshen"],[]], - yxs_wuzetian:['female','wu',4,['nvquan','qiandu','yxsweiyi']], - yxs_caocao:['male','wei',4,['zhulu','xieling']], - yxs_mozi:['male','qun',3,['jieyong','feigong','jianai']], - yxs_bole:['male','wu',3,['bolehuiyan','xiangma']], - yxs_aijiyanhou:['female','qun',3,['seyou','sheshi']], - yxs_diaochan:['female','qun',3,['fengyi','wange']], - yxs_yangyuhuan:['female','wu',3,['fengyan','nichang']], - yxs_baosi:['female','wu',3,['jieyin','fenghuo']], - yxs_napolun:['male','wei',4,['tongling','fanpu']], - yxs_kaisa:['male','shu',4,['ducai']], - yxs_zhuyuanzhang:['male','wu',4,['qiangyun']], + name: "yxs", + character: { + yxs_qinqiong: ["male", "wei", 4, ["yxs_fanji", "yxs_menshen"], []], + yxs_wuzetian: ["female", "wu", 4, ["nvquan", "qiandu", "yxsweiyi"]], + yxs_caocao: ["male", "wei", 4, ["zhulu", "xieling"]], + yxs_mozi: ["male", "qun", 3, ["jieyong", "feigong", "jianai"]], + yxs_bole: ["male", "wu", 3, ["bolehuiyan", "xiangma"]], + yxs_aijiyanhou: ["female", "qun", 3, ["seyou", "sheshi"]], + yxs_diaochan: ["female", "qun", 3, ["fengyi", "wange"]], + yxs_yangyuhuan: ["female", "wu", 3, ["fengyan", "nichang"]], + yxs_baosi: ["female", "wu", 3, ["jieyin", "fenghuo"]], + yxs_napolun: ["male", "wei", 4, ["tongling", "fanpu"]], + yxs_kaisa: ["male", "shu", 4, ["ducai"]], + yxs_zhuyuanzhang: ["male", "wu", 4, ["qiangyun"]], // yxs_jinke:['male','qun',3,['cike','qiangxi']], - yxs_libai:['male','qun',3,['miaobi','zhexian']], - yxs_luban:['male','wu',3,['guifu','lshengong']], - yxs_lvzhi:['female','shu',4,['zhensha','xumou']], - yxs_goujian:['male','wu',3,['keji','tuqiang']], - yxs_lishimin:['male','qun',4,['kongju']], - yxs_huamulan:['female','shu',3,['xiaoji','yizhuang']], - yxs_luobinhan:['male','wu',4,['xiadao','sheshu','lguiyin']], - yxs_chengjisihan:['male','qun',4,['mashu','qianglue']], - yxs_mingchenghuanghou:['female','shu',3,['tiewan','chajue']], - yxs_wangzhaojun:['female','wei',3,['heqin','wluoyan']], - yxs_luocheng:['male','wu',4,['hanqiang','biaoqi']], - yxs_direnjie:['male','wei',3,['shentan','kanpo']], - yxs_sunwu:['male','wu',3,['bingsheng','taolue']], - yxs_chengyaojin:['male','shu',4,['sanbanfu']], - yxs_yujix:['female','shu',3,['ysheshen','changnian']], - yxs_xiangyu:['male','shu',4,['wushuang','ciqiu']], - yxs_yingzheng:['male','qun',4,['jianxiong','batu']], - yxs_yuefei:['male','qun',4,['longdan','wumu']], - yxs_fuermosi:['male','wei',3,['yanyi','jiean']], - yxs_guiguzi:['male','qun',3,['baihe','yinyang','xiushen']], - yxs_xiaoqiao:['female','wu',3,['chujia','zhijie']], - yxs_luzhishen:['male','wei',4,['yxsdili','kuangchan']], - yxs_zhaoyong:['male','shu',3,['zyhufu','hanbei']], - yxs_yangguang:['male','qun',3,['shiqin','yaoyi']], - yxs_tangbohu:['male','qun',3,['luobi','fengliu']], - yxs_zhangsanfeng:['male','wei',4,['zbudao','taiji']], - yxs_nandinggeer:['female','shu',3,['huli','xianqu','yixin']], - yxs_weizhongxian:['male','qun',3,['zhuxin','wlianhuan']], - yxs_meixi:['female','shu',3,['liebo','yaoji']], - yxs_lanlinwang:['male','shu',4,['guimian','lyuxue']], + yxs_libai: ["male", "qun", 3, ["miaobi", "zhexian"]], + yxs_luban: ["male", "wu", 3, ["guifu", "lshengong"]], + yxs_lvzhi: ["female", "shu", 4, ["zhensha", "xumou"]], + yxs_goujian: ["male", "wu", 3, ["keji", "tuqiang"]], + yxs_lishimin: ["male", "qun", 4, ["kongju"]], + yxs_huamulan: ["female", "shu", 3, ["xiaoji", "yizhuang"]], + yxs_luobinhan: ["male", "wu", 4, ["xiadao", "sheshu", "lguiyin"]], + yxs_chengjisihan: ["male", "qun", 4, ["mashu", "qianglue"]], + yxs_mingchenghuanghou: ["female", "shu", 3, ["tiewan", "chajue"]], + yxs_wangzhaojun: ["female", "wei", 3, ["heqin", "wluoyan"]], + yxs_luocheng: ["male", "wu", 4, ["hanqiang", "biaoqi"]], + yxs_direnjie: ["male", "wei", 3, ["shentan", "kanpo"]], + yxs_sunwu: ["male", "wu", 3, ["bingsheng", "taolue"]], + yxs_chengyaojin: ["male", "shu", 4, ["sanbanfu"]], + yxs_yujix: ["female", "shu", 3, ["ysheshen", "changnian"]], + yxs_xiangyu: ["male", "shu", 4, ["wushuang", "ciqiu"]], + yxs_yingzheng: ["male", "qun", 4, ["jianxiong", "batu"]], + yxs_yuefei: ["male", "qun", 4, ["longdan", "wumu"]], + yxs_fuermosi: ["male", "wei", 3, ["yanyi", "jiean"]], + yxs_guiguzi: ["male", "qun", 3, ["baihe", "yinyang", "xiushen"]], + yxs_xiaoqiao: ["female", "wu", 3, ["chujia", "zhijie"]], + yxs_luzhishen: ["male", "wei", 4, ["yxsdili", "kuangchan"]], + yxs_zhaoyong: ["male", "shu", 3, ["zyhufu", "hanbei"]], + yxs_yangguang: ["male", "qun", 3, ["shiqin", "yaoyi"]], + yxs_tangbohu: ["male", "qun", 3, ["luobi", "fengliu"]], + yxs_zhangsanfeng: ["male", "wei", 4, ["zbudao", "taiji"]], + yxs_nandinggeer: ["female", "shu", 3, ["huli", "xianqu", "yixin"]], + yxs_weizhongxian: ["male", "qun", 3, ["zhuxin", "wlianhuan"]], + yxs_meixi: ["female", "shu", 3, ["liebo", "yaoji"]], + yxs_lanlinwang: ["male", "shu", 4, ["guimian", "lyuxue"]], }, - characterIntro:{ - yxs_qinqiong:'秦琼(?—638年),字叔宝,齐州历城(今山东济南市)人,隋末唐初名将。初为隋将,先后在来护儿、张须陀、裴仁基帐下任职,因勇武过人而远近闻名。后随裴仁基投奔瓦岗军领袖李密,瓦岗败亡后转投王世充,因见王世充为人奸诈,与程咬金等人一起投奔李唐。投唐后随李世民南征北战,是一个能在万马军中取敌将首级的勇将,但也因此浑身是伤。唐统一后,秦琼久病缠身,于贞观十二年(638)病逝。生前官至左武卫大将军、翼国公,死后追赠为徐州都督、胡国公,谥曰“壮”。贞观十七年被列入凌烟阁二十四功臣。', - yxs_wuzetian:'中国历史上唯一一个正统的女皇帝,也是继位年龄最大的皇帝(67岁即位),又是寿命最长的皇帝之一(终年82岁)。唐高宗时为皇后(655—683)、唐中宗和唐睿宗时为皇太后(683—690),后自立为武周皇帝(690—705),改国号“唐”为“周”,定都洛阳,并号其为“神都”。史称“武周”或“南周”,705年退位。武则天也是一位女诗人和政治家。', - yxs_caocao:' 曹操(155年7月18日-220年3月15日),字孟德,一名吉利,小字阿瞒,汉族,沛国谯(今安徽省亳州市)人。曹操生于宦官之家,适逢乱世,但是胸怀大志,参与剿灭董卓战争,之后在官渡大败袁绍,占据北方,挟天子以令诸侯。最后兵败赤壁,与吴,蜀三分天下。', - yxs_mozi:' 宋国大夫,名翟,鲁人(今山东滕州人)。墨子是我国战国时期著名的思想家、教育家、科学家、军事家、社会活动家,墨家学派的创始人。墨子曾阻止鲁阳文君攻郑,说服公输般而止楚攻宋。楚惠王打算以书社封墨子,越王也打算以吴之地方五百里以封墨子,但墨子都没有接受。其创立墨家学说,并有《墨子》一书传世。', - yxs_bole:'伯乐,名孙阳,字子良,一作王良。春秋齐(今山东省威武)人。善于相马,为赵简子御。相传天上御者名伯乐,因其善相,遂号之,传至今。初,见老骥 拖车,喘息不定,伯乐哀之,马亦哀啼,方知乃良驹。后世长以伯乐比喻慧眼识人者。', - yxs_aijiyanhou:'埃及艳后即克丽奥佩托拉七世,是古埃及托勒密王朝的最后一任法老。她通过政治联姻为古埃及赢取了22年的和平。埃及艳后的一生富有戏剧性,特别是卷入罗马共和末期的政治漩涡,同恺撒、安东尼关系密切,并伴以种种传闻逸事,使她成为文学和艺术作品中的著名人物。', - yxs_diaochan:'中国古代四大美女之一,今山西忻州人,有野史说其姓霍,无名,又有一说称其任姓,小字红昌。貂蝉是东汉末年司徒王允的义女,国色天香,有倾国倾城之貌,相传貂婵在后花园拜月时,忽然轻风吹来,一块浮云将那皎洁的明月遮住。这时正好王允瞧见,便说我的女儿和月亮比美,月亮比不过,赶紧躲在云彩后面。此后,世人常用“闭月”来形容貂婵的美貌。', - yxs_yangyuhuan:'唐朝贵妃,名玉环,字太真,蒲州永乐人(今山西永济)。杨玉环自小习音律,善歌舞,姿色超群。27岁时,得唐玄宗宠幸,召入宫中,封为贵妃。杨贵妃天生丽质,回眸一笑百媚生,六宫粉黛无颜色,堪称大唐第一美女,此后千余年无出其右者。其与西施、昭君、貂蝉并称中国古代四大美女。', - yxs_baosi:'褒姒,周幽王姬宫涅的王后,褒姒原是一名弃婴,被一对做小买卖的夫妻收养,在褒国(今陕西省汉中西北)长大,公元前七七九年(周幽王三年),周幽王征伐有褒国,褒人献出美女褒姒乞降,幽王爱如掌上明珠,立为妃,宠冠周王宫,翌年,褒姒生子伯服(一作伯般),幽王对她更加宠爱,竟废去王后申氏和太子宜臼,册立褒姒为王后,立伯服为太子,周太史伯阳叹气道:“周王室已面临大祸,这是不可避免的了。”', - yxs_napolun:'法兰西第一共和国执政、法兰西第一帝国皇帝,出生在法国科西嘉岛,是一位卓越的军事天才。他多次击败保王党的反扑和反法同盟的入侵,捍卫了法国大革命的成果。他颁布的《民法典》更是成为了后世资本主义国家的立法蓝本。他执政期间多次对外扩张,形成了庞大的帝国体系,创造了一系列军事奇迹。', - kaisa:'凯撒是罗马共和国末期杰出的军事统帅、政治家。他公元前60年与庞培、克拉苏秘密结成前三巨头同盟,随后出任高卢总督,在大约8年的时间内征服了高卢全境(今法国一带),还袭击了日耳曼和不列颠。前49年,他率军占领罗马,打败庞培,集大权于一身,实行独裁统治并制定了《儒略历》。', - yxs_zhuyuanzhang:' 朱元璋,明王朝的开国皇帝。原名重八,后取名兴宗。汉族,濠州(今安徽凤阳县东)钟离太平乡人。朱元璋自幼贫寒,父母兄长均死于瘟疫,孤苦无依,入皇觉寺为小沙弥,入寺不到二个月,因荒年寺租难收,寺主封仓遣散众僧,只得离乡为游方僧,后参加了起义军,并改名“朱元璋”意为诛(朱)灭元朝的璋(璋,古代的一种玉器)。25岁时参加郭子兴领导的红巾军反抗蒙元暴政,在郭子兴手下,率兵出征,有攻必克;因此郭便把养女马氏嫁与了他。元至正二十八年(1368),在基本击破各路农民起义军和扫平元的残余势力后,于南京称帝,国号大明,年号洪武,建立了全国统一的封建政权。朱元璋统治时期被称为“洪武之治”。葬于明孝陵。', - yxs_jinke:'荆轲,喜好读书击剑,为人慷慨侠义。后游历到燕国,被称为“荆卿”(或荆叔),随之由燕国智勇深沉的“节侠”田光推荐给太子丹,拜为上卿。秦国灭赵后,兵锋直指燕国南界,太子丹震惧,与田光密谋,决定派荆轲入秦行刺秦王。荆轲献计太子丹,拟以秦国叛将樊于期之头及燕督亢(今河北涿县、易县、固安一带,是一块肥沃的土地)地图进献秦王,相机行刺。太子丹不忍杀樊于期,荆轲只好私见樊于期,告以实情,樊于期为成全荆轲而自刎。', - yxs_libai:'字太白,号青莲居士,又号“谪仙人”,祖籍陇西郡成纪县(今甘肃省平凉市静宁县南)。李白是唐朝著名的浪漫主义诗人,有“诗仙”之称。李白生平作诗无数,存世诗文达千余篇之多,《蜀道难》、《行路难》、《梦游天姥吟留别》、《将进酒》等诗篇脍炙人口,妇孺皆知,另有《李太白集》传世。', - yxs_luban:' 鲁班,姓公输,名般。战国时期鲁国公族之后,故又称公输子、班输等。出身于工匠世家,是我国古代最著名的发明家、建筑家。鲁班一生发明无数,而最具贡献意义的则要数木工使用的工具,诸如墨斗、锯、和鲁班尺等。为后世的建筑学提供了最基础的工具。除此之外,相传石磨、云梯等工具也是鲁班发明。', - yxs_lvzhi:' 吕雉,西汉开国皇帝高祖刘邦的原配夫人,中国历史上第一位掌权的女性统治者,是历史上有记载以来的第一位皇后、皇太后。于高祖刘邦死后掌握政权,实行高祖的“黄老政治”,百姓安乐民富国强,为“文景之治”奠定了坚实的基础。', - yxs_goujian:'勾践,又写作句践,在出土文物“越王勾践剑”里写为鸠浅,司马贞《史记索隐》引《纪年》作菼执。是中国春秋时代后期的越国君主。有关他的先世,有说“其先禹之苗裔”,亦有说“先世无所考”,也有说他是“祝融之后”并且是楚国的芈姓,众说纷纭。父亲则是越侯允常。', - yxs_lishimin:' 李世民,唐朝第二位皇帝。他的前半生是立下赫赫武功的军事家。平窦建德、王世充之后,始大量接触文学与书法,有《温泉铭》、《晋祠铭》等墨宝传世。后在玄武门之变杀死自己的兄弟李建成、李元吉两人,成为太子,唐高祖不久被迫让位。世民即位为帝后,积极听取群臣的意见、努力学习文治天下,成功转型为中国史上最出名的政治家与明君之一。唐太宗开创了历史上的“贞观之治”,经过主动消灭群雄割据势力,虚心纳谏、在国内厉行节约、使百姓休养生息,终于使得社会出现了国泰民安的局面。此举为后来的开元盛世奠定了重要的基础,将中国传统农业社会推向一个高峰。', - yxs_huamulan:' 花木兰是中国文学作品中的一位代父从军的巾帼英雄,其真实性不详。花木兰最早出现于南北朝一首叙事诗《木兰辞》中,该诗约作于北魏,最初录于南朝陈的《古今乐录》,僧人智匠在《古今乐录》称:“木兰不知名。”', - yxs_luobinhan:'罗宾汉是英国民间传说中的侠盗式的一个英雄人物,人称汉丁顿伯爵。他武艺出众、机智勇敢、聪明,仇视官吏和教士,是一位劫富济贫、行侠仗义的绿林英雄。传说他住在诺丁汉雪伍德森林。从14世纪中叶起,关于罗宾汉的民谣和传说就开始在民间流传。罗宾汉最突出的就是射箭术高超。现代射箭比赛里就有“罗宾汉”这一术语,指射中另一支已中靶心的箭。', - yxs_chengjisihan:'成吉思汗,名铁木真,孛儿只斤氏,奇渥温姓,乞颜(起延)部人。从小遭受结拜兄弟札木合迫害,形成刚毅坚韧的性格。1206年,被推举为蒙古帝国的大汗,统一蒙古各部,为之后的进攻中原提供了坚实的基础。', - yxs_mingchenghuanghou:'明成皇后,朝鲜近代史上的女政治家,本名闵兹映,通称闵妃,是朝鲜京畿道骊州郡人。她是朝鲜王朝高宗李熙的王妃,骊兴闵氏外戚集团的核心人物,19世纪末朝鲜的实际统治者。由于闵妃早期主张开放、后期力抗日本并身死殉难,故深受后世韩国人民的尊崇。 1897年,高宗李熙改国号称“大韩帝国”,追谥闵妃为“孝慈元圣正化合天明成皇后”,故现今韩国史学家多称她为“明成皇后”。', - yxs_wangzhaojun:'王昭君,名嫱,字昭君,晋朝时为避司马昭讳,又称“明妃”,汉元帝时期宫女,汉族,西汉南郡秭归(今湖北省兴山县)人。匈奴呼韩邪单于阏氏。 “昭君出塞”是汉匈交往上的大事,稳定了汉朝和匈奴的外交关系,《汉书.匈奴传》和《后汉书.南匈奴传》都记载了这件事。相传和亲途中,南飞的大雁听到昭君奏起悲壮的离别之曲,看到骑在马上的这位美丽女子,忘记摆动翅膀,跌落地下,因此得“落雁”之名。昭君出塞的故事也被后世传为佳话。', - yxs_luocheng:'《隋唐》说书和《说唐传》中的虚构人物,隋唐十八杰中列第七,十六杰列第八。在清初禇人获的讲史小说《隋唐演义》中,也虚构了罗成,是燕山罗艺的儿子,秦琼的表弟,精通枪法。', - yxs_direnjie:'唐武周时期杰出的著名政治家,时任豫州刺史、魏州刺史等要职,官至凤阁鸾台平章事、内史,卒后追封梁国公。狄仁杰生于贞观、卒于武周时期,经历了大唐鼎盛和动乱的年代。其一生秉承了以民为本、不畏权贵、为民请命的宗旨。狄仁杰通晓了吏治、兵刑等法律制度,在任大理丞任期内解决了诸多案件,被誉为“神探”。狄仁杰为官清廉,素有政绩,有辅国安邦之能,史称“唐室砥柱”。', - yxs_sunwu:'著名军事家,字长卿,中国春秋时期齐国乐安人。曾率领吴国军队大破数倍于己的楚国军队,占领了楚国都城郢城,几乎亡楚。其著有巨作《孙子兵法》十三篇,为后世兵法家所推崇,被誉为“兵学圣典”,置于《武经七书》之首,被译为英文、法文、德文、日文,成为国际间最著名的兵学典范之书。后人尊称其为孙子、孙武子、兵圣、百世兵家之师、东方兵学的鼻祖。', - yxs_chengyaojin:'程咬金,原名咬金,后更名知节,字义贞,中国济州东阿斑鸠店人(现山东省东平县斑鸠店)。“凌烟阁二十四功臣”之一,唐朝开国名将。隋朝末年,隋炀帝杨广统治残暴,骄奢荒淫,民不聊生,最终爆发了大规模的农民起义。程咬金先入瓦岗军,投王世充,后降唐,成为秦王李世民的骨干成员。据史书记载,程咬金“少骁勇,善用马槊。”而在以《说唐》为代表的系列话本及历史演义小说中,程咬金则使得一柄八卦宣花斧,以“三板斧”武艺著称,是一名性格直爽、粗中有细的福将。', - yxs_yujix:'虞姬,又称虞美人,西楚霸王项羽爱姬,相传为江苏沭阳县颜集乡人,一说苏州常熟人。公元前209年,项羽与叔父项梁起义反秦。项羽军中战将虞子期的妹妹虞姬,貌美好武,倾慕年轻勇猛的项羽,嫁其为妾,常伴左右随军出征,至终形影不离。 公元前202年,项羽在垓下之战中被刘邦、韩信、彭越三方大军合围困于垓下(今安徽灵璧县城南沱河北岸城后村),身陷十面埋伏,兵孤粮缺,夜闻四面楚歌,楚军士气尽失。项羽认为大势已去,帐中酌酒,对着虞姬唱起悲壮的“垓下歌”。虞姬拔剑起舞,含泪唱和:“汉兵已略地,四面楚歌声。大王义气尽,贱妾何聊生。”为免后顾之忧影响项羽突围,唱毕于其面前自刎。', - yxs_xiangyu:'项籍(前232—前202)字羽,通常被称作项羽,中国古代著名将领及政治人物,汉族,秦下相(今江苏省宿迁市宿城区)人。秦末时被楚怀王熊心封为鲁公,在前207年的决定性战役巨鹿之战中统率楚军大破秦军。秦亡后自封“西楚霸王”,统治黄河及长江下游的梁楚九郡。后在楚汉战争中为汉高祖刘邦所败,在乌江(今安徽和县)自刎而死。', - yxs_yingzheng:'秦始皇,赢姓,赵氏,名政,秦庄襄王之子。秦始皇22岁时,在雍城举行国君成人加冕仪式,开始“亲理朝政”。后除掉吕不韦,嫪毐等人,重用李斯,尉缭。自公元前230年至前221年,采取由近及远,集中力量,各个击破的策略,先后灭六国,完成统一中国的大业。同时建立起历史上第一个书同文,度同制,车同轨,行同伦的中央集权国家——秦朝。', - yxs_yuefei:' 岳飞(1103年-1142年),字鹏举,相州汤阴(今属河南)人。南宋军事家,中国历史上著名的抗金名将。绍兴十一年(1142)十二月二十九日,秦桧以“莫须有”的罪名将岳飞毒死于临安风波亭。1162年,宋孝宗时诏复官,谥武穆,宁宗时追封为鄂王,改谥忠武,有《岳武穆集》传世。', - yxs_fuermosi:'福尔摩斯,是一个虚构的侦探人物,是由19世纪末20世纪初的英国侦探小说家阿瑟?柯南·道尔所塑造的一个才华横溢的侦探形象。福尔摩斯不但头脑冷静、观察力敏锐、推理能力极强;而且,他的剑术、拳术和小提琴演奏水平也相当高超,已经成为侦探小说中的典型代表人物之一。', - yxs_guiguzi:'本名王诩,春秋时纵横家,卫国(今河南鹤壁一带)人。曾隐于清溪鬼谷,常入云梦采药修道,弟子无数。有张仪、苏秦、孙膑、庞涓四弟子。精于兵法、奇门遁甲、五行八卦之学。后人称之为王禅老祖。今传《鬼谷子》十四篇。', - yxs_xiaoqiao:'小乔,庐江皖县(今安徽潜山)人。 史书中称小桥,是中国汉末三国时期的女性, 乔公的次女,东吴名将周瑜的妻子。传说与其姐大乔均为绝世美女。合称“二乔”。', - yxs_luzhishen:'鲁智深,梁山泊第十三位好汉,十员步军头领第一名。鲁智深原名鲁达,绰号花和尚。是经略的提辖,因为见郑屠欺侮金翠莲父女,三拳打死了镇关西。被官府追捕,逃到五台山削发为僧,改名鲁智深。', - yxs_zhaoyong:'赵武灵王,战国中后期赵国君主,嬴姓,赵氏,名雍。赵武灵王在位时,推行的“胡服骑射”政策,赵国因而得以强盛,灭中山国,败林胡、楼烦二族,辟云中、雁门、代三郡,并修筑了“赵长城”。', - yxs_yangguang:'隋炀帝杨广,是隋朝第二代皇帝,华阴(今陕西华阴)人,生于隋京师长安。杨广在位期间修建大运河,营建东都迁都洛阳城,开创科举制度,亲征吐谷浑,三征高句丽。但因为杨广滥用民力,导致了隋朝的灭亡,618年在江都被部下缢杀。', - yxs_tangbohu:'唐伯虎,名寅,字伯虎,自号六如居士,明代诗人、画家,吴县(今江苏苏州)人。出身富商家庭,后家道衰落,因祝枝山之劝而潜心读书。公试时为状元,会试时候因科场舞弊案牵连而被斥为吏。后绝意仕途,以卖画为生。唐伯虎为人玩世不恭而又才气横溢,诗文擅名,与祝枝山、文征明、徐祯卿并称“江南四大才子”,画名更著,与沈周、文征明、仇英并称“吴门四家”。民间盛传其点秋香的故事。', - yxs_zhangsanfeng:'明朝最著名的武术家、道士。原名张通,字君宝,在武当山开山立派,成为武当派开山祖师。明英宗赐号“通微显化真人”;明宪宗特封号为“韬光尚志真仙”;明世宗赠封他为“清虚元妙真君”。传说其丰姿魁伟,大耳圆目,须髯如戟。无论寒暑,只一衲一蓑,一餐能食升斗,或数日一食,或数月不食,事能前知。其在武术上的造诣和超乎寻常的长寿都为后人称道。 曾传洪武年间,两度受朱元璋诏请入京,皆避而不见。其与明初巨贾沈万三亦有交际。其所创太极拳一直延续至今,成为后人养身妙术。', - yxs_nandinggeer:'出生于意大利,英国护士和统计学家。她谙熟数学,精通英、法、德、意四门语言,除古典文学外,还精于自然科学、历史和哲学,擅长音乐与绘画。在德国学习护理后,曾往伦敦的医院工作。南丁格尔于1854年和38位护士到克里米亚野战医院工作,成为该院的护士长,被称为“克里米亚的天使”又称“提灯女神”。1860年6月15日,南丁格尔在伦敦成立世界第一所护士学校。为了纪念她的成就,1912年,国际护士会倡仪各国医院和护士学校定每年5月12日南丁格尔诞辰日举行纪念活动,并将5月12日定为“国际护士节”,以缅怀和纪念这位伟大的女性。', - yxs_weizhongxian:'魏忠贤(1568年-1627年12月11日),字完吾,北直隶肃宁(今河北沧州肃宁县)人,汉族,原名李进忠。由才人王氏复姓,出任秉笔太监后,改名魏忠贤。明朝末期宦官。明熹宗时期,出任司礼秉笔太监,极受宠信,被称为“九千九百岁”,排除异己,专断国政,以致人们“只知有忠贤,而不知有皇上”。朱由检继位后,打击惩治阉党,治魏忠贤十大罪,命逮捕法办,自缢而亡,其余党亦被肃清。', - yxs_meixi:'妺喜,姓嬉(喜),生卒年不详,亦作妺嬉、末喜、末嬉,有施氏之女,夏朝最后一位君主夏桀的王后。根据先秦时代记述女子名时所用的全称和简称方式,妺喜应姓喜,即嬉(也作僖)。由于其名字的“妺”字与“妹妹”的“妹”字字形相似,且在《庄子》等作中也有以妺为妹的用法,因此常误作"妹喜"。', - yxs_lanlinwang:'高长恭(541年―573年),又名高孝瓘、高肃,祖籍渤海调蓨(今河北省景县),神武帝高欢之孙,文襄帝高澄第四子,生母不详,南北朝时期北齐宗室、将领,封爵兰陵郡王。高长恭貌柔心壮,音容兼美。为将躬勤细事,每得甘美,虽一瓜数果,必与将士分享。累次升任至并州刺史。突厥攻入晋阳,高长恭奋力将其击退。邙山之战,高长恭为中军,率领五百骑兵再入周军包围圈,直至金墉城下,因高长恭戴着头盔,城中的人不确定是敌军或是我军,直到高长恭把头盔脱下来城上的人才知道是高长恭,派弓箭手开始放箭保护他,之后高长恭成功替金墉解围,高长恭在此次战中威名大振,士兵们为此战而讴歌他,即后来知名的《兰陵王入阵曲》。', + characterIntro: { + yxs_qinqiong: + "秦琼(?—638年),字叔宝,齐州历城(今山东济南市)人,隋末唐初名将。初为隋将,先后在来护儿、张须陀、裴仁基帐下任职,因勇武过人而远近闻名。后随裴仁基投奔瓦岗军领袖李密,瓦岗败亡后转投王世充,因见王世充为人奸诈,与程咬金等人一起投奔李唐。投唐后随李世民南征北战,是一个能在万马军中取敌将首级的勇将,但也因此浑身是伤。唐统一后,秦琼久病缠身,于贞观十二年(638)病逝。生前官至左武卫大将军、翼国公,死后追赠为徐州都督、胡国公,谥曰“壮”。贞观十七年被列入凌烟阁二十四功臣。", + yxs_wuzetian: + "中国历史上唯一一个正统的女皇帝,也是继位年龄最大的皇帝(67岁即位),又是寿命最长的皇帝之一(终年82岁)。唐高宗时为皇后(655—683)、唐中宗和唐睿宗时为皇太后(683—690),后自立为武周皇帝(690—705),改国号“唐”为“周”,定都洛阳,并号其为“神都”。史称“武周”或“南周”,705年退位。武则天也是一位女诗人和政治家。", + yxs_caocao: + " 曹操(155年7月18日-220年3月15日),字孟德,一名吉利,小字阿瞒,汉族,沛国谯(今安徽省亳州市)人。曹操生于宦官之家,适逢乱世,但是胸怀大志,参与剿灭董卓战争,之后在官渡大败袁绍,占据北方,挟天子以令诸侯。最后兵败赤壁,与吴,蜀三分天下。", + yxs_mozi: + " 宋国大夫,名翟,鲁人(今山东滕州人)。墨子是我国战国时期著名的思想家、教育家、科学家、军事家、社会活动家,墨家学派的创始人。墨子曾阻止鲁阳文君攻郑,说服公输般而止楚攻宋。楚惠王打算以书社封墨子,越王也打算以吴之地方五百里以封墨子,但墨子都没有接受。其创立墨家学说,并有《墨子》一书传世。", + yxs_bole: + "伯乐,名孙阳,字子良,一作王良。春秋齐(今山东省威武)人。善于相马,为赵简子御。相传天上御者名伯乐,因其善相,遂号之,传至今。初,见老骥 拖车,喘息不定,伯乐哀之,马亦哀啼,方知乃良驹。后世长以伯乐比喻慧眼识人者。", + yxs_aijiyanhou: + "埃及艳后即克丽奥佩托拉七世,是古埃及托勒密王朝的最后一任法老。她通过政治联姻为古埃及赢取了22年的和平。埃及艳后的一生富有戏剧性,特别是卷入罗马共和末期的政治漩涡,同恺撒、安东尼关系密切,并伴以种种传闻逸事,使她成为文学和艺术作品中的著名人物。", + yxs_diaochan: + "中国古代四大美女之一,今山西忻州人,有野史说其姓霍,无名,又有一说称其任姓,小字红昌。貂蝉是东汉末年司徒王允的义女,国色天香,有倾国倾城之貌,相传貂婵在后花园拜月时,忽然轻风吹来,一块浮云将那皎洁的明月遮住。这时正好王允瞧见,便说我的女儿和月亮比美,月亮比不过,赶紧躲在云彩后面。此后,世人常用“闭月”来形容貂婵的美貌。", + yxs_yangyuhuan: + "唐朝贵妃,名玉环,字太真,蒲州永乐人(今山西永济)。杨玉环自小习音律,善歌舞,姿色超群。27岁时,得唐玄宗宠幸,召入宫中,封为贵妃。杨贵妃天生丽质,回眸一笑百媚生,六宫粉黛无颜色,堪称大唐第一美女,此后千余年无出其右者。其与西施、昭君、貂蝉并称中国古代四大美女。", + yxs_baosi: + "褒姒,周幽王姬宫涅的王后,褒姒原是一名弃婴,被一对做小买卖的夫妻收养,在褒国(今陕西省汉中西北)长大,公元前七七九年(周幽王三年),周幽王征伐有褒国,褒人献出美女褒姒乞降,幽王爱如掌上明珠,立为妃,宠冠周王宫,翌年,褒姒生子伯服(一作伯般),幽王对她更加宠爱,竟废去王后申氏和太子宜臼,册立褒姒为王后,立伯服为太子,周太史伯阳叹气道:“周王室已面临大祸,这是不可避免的了。”", + yxs_napolun: + "法兰西第一共和国执政、法兰西第一帝国皇帝,出生在法国科西嘉岛,是一位卓越的军事天才。他多次击败保王党的反扑和反法同盟的入侵,捍卫了法国大革命的成果。他颁布的《民法典》更是成为了后世资本主义国家的立法蓝本。他执政期间多次对外扩张,形成了庞大的帝国体系,创造了一系列军事奇迹。", + kaisa: "凯撒是罗马共和国末期杰出的军事统帅、政治家。他公元前60年与庞培、克拉苏秘密结成前三巨头同盟,随后出任高卢总督,在大约8年的时间内征服了高卢全境(今法国一带),还袭击了日耳曼和不列颠。前49年,他率军占领罗马,打败庞培,集大权于一身,实行独裁统治并制定了《儒略历》。", + yxs_zhuyuanzhang: + " 朱元璋,明王朝的开国皇帝。原名重八,后取名兴宗。汉族,濠州(今安徽凤阳县东)钟离太平乡人。朱元璋自幼贫寒,父母兄长均死于瘟疫,孤苦无依,入皇觉寺为小沙弥,入寺不到二个月,因荒年寺租难收,寺主封仓遣散众僧,只得离乡为游方僧,后参加了起义军,并改名“朱元璋”意为诛(朱)灭元朝的璋(璋,古代的一种玉器)。25岁时参加郭子兴领导的红巾军反抗蒙元暴政,在郭子兴手下,率兵出征,有攻必克;因此郭便把养女马氏嫁与了他。元至正二十八年(1368),在基本击破各路农民起义军和扫平元的残余势力后,于南京称帝,国号大明,年号洪武,建立了全国统一的封建政权。朱元璋统治时期被称为“洪武之治”。葬于明孝陵。", + yxs_jinke: + "荆轲,喜好读书击剑,为人慷慨侠义。后游历到燕国,被称为“荆卿”(或荆叔),随之由燕国智勇深沉的“节侠”田光推荐给太子丹,拜为上卿。秦国灭赵后,兵锋直指燕国南界,太子丹震惧,与田光密谋,决定派荆轲入秦行刺秦王。荆轲献计太子丹,拟以秦国叛将樊于期之头及燕督亢(今河北涿县、易县、固安一带,是一块肥沃的土地)地图进献秦王,相机行刺。太子丹不忍杀樊于期,荆轲只好私见樊于期,告以实情,樊于期为成全荆轲而自刎。", + yxs_libai: + "字太白,号青莲居士,又号“谪仙人”,祖籍陇西郡成纪县(今甘肃省平凉市静宁县南)。李白是唐朝著名的浪漫主义诗人,有“诗仙”之称。李白生平作诗无数,存世诗文达千余篇之多,《蜀道难》、《行路难》、《梦游天姥吟留别》、《将进酒》等诗篇脍炙人口,妇孺皆知,另有《李太白集》传世。", + yxs_luban: + " 鲁班,姓公输,名般。战国时期鲁国公族之后,故又称公输子、班输等。出身于工匠世家,是我国古代最著名的发明家、建筑家。鲁班一生发明无数,而最具贡献意义的则要数木工使用的工具,诸如墨斗、锯、和鲁班尺等。为后世的建筑学提供了最基础的工具。除此之外,相传石磨、云梯等工具也是鲁班发明。", + yxs_lvzhi: + " 吕雉,西汉开国皇帝高祖刘邦的原配夫人,中国历史上第一位掌权的女性统治者,是历史上有记载以来的第一位皇后、皇太后。于高祖刘邦死后掌握政权,实行高祖的“黄老政治”,百姓安乐民富国强,为“文景之治”奠定了坚实的基础。", + yxs_goujian: + "勾践,又写作句践,在出土文物“越王勾践剑”里写为鸠浅,司马贞《史记索隐》引《纪年》作菼执。是中国春秋时代后期的越国君主。有关他的先世,有说“其先禹之苗裔”,亦有说“先世无所考”,也有说他是“祝融之后”并且是楚国的芈姓,众说纷纭。父亲则是越侯允常。", + yxs_lishimin: + " 李世民,唐朝第二位皇帝。他的前半生是立下赫赫武功的军事家。平窦建德、王世充之后,始大量接触文学与书法,有《温泉铭》、《晋祠铭》等墨宝传世。后在玄武门之变杀死自己的兄弟李建成、李元吉两人,成为太子,唐高祖不久被迫让位。世民即位为帝后,积极听取群臣的意见、努力学习文治天下,成功转型为中国史上最出名的政治家与明君之一。唐太宗开创了历史上的“贞观之治”,经过主动消灭群雄割据势力,虚心纳谏、在国内厉行节约、使百姓休养生息,终于使得社会出现了国泰民安的局面。此举为后来的开元盛世奠定了重要的基础,将中国传统农业社会推向一个高峰。", + yxs_huamulan: + " 花木兰是中国文学作品中的一位代父从军的巾帼英雄,其真实性不详。花木兰最早出现于南北朝一首叙事诗《木兰辞》中,该诗约作于北魏,最初录于南朝陈的《古今乐录》,僧人智匠在《古今乐录》称:“木兰不知名。”", + yxs_luobinhan: + "罗宾汉是英国民间传说中的侠盗式的一个英雄人物,人称汉丁顿伯爵。他武艺出众、机智勇敢、聪明,仇视官吏和教士,是一位劫富济贫、行侠仗义的绿林英雄。传说他住在诺丁汉雪伍德森林。从14世纪中叶起,关于罗宾汉的民谣和传说就开始在民间流传。罗宾汉最突出的就是射箭术高超。现代射箭比赛里就有“罗宾汉”这一术语,指射中另一支已中靶心的箭。", + yxs_chengjisihan: + "成吉思汗,名铁木真,孛儿只斤氏,奇渥温姓,乞颜(起延)部人。从小遭受结拜兄弟札木合迫害,形成刚毅坚韧的性格。1206年,被推举为蒙古帝国的大汗,统一蒙古各部,为之后的进攻中原提供了坚实的基础。", + yxs_mingchenghuanghou: + "明成皇后,朝鲜近代史上的女政治家,本名闵兹映,通称闵妃,是朝鲜京畿道骊州郡人。她是朝鲜王朝高宗李熙的王妃,骊兴闵氏外戚集团的核心人物,19世纪末朝鲜的实际统治者。由于闵妃早期主张开放、后期力抗日本并身死殉难,故深受后世韩国人民的尊崇。 1897年,高宗李熙改国号称“大韩帝国”,追谥闵妃为“孝慈元圣正化合天明成皇后”,故现今韩国史学家多称她为“明成皇后”。", + yxs_wangzhaojun: + "王昭君,名嫱,字昭君,晋朝时为避司马昭讳,又称“明妃”,汉元帝时期宫女,汉族,西汉南郡秭归(今湖北省兴山县)人。匈奴呼韩邪单于阏氏。 “昭君出塞”是汉匈交往上的大事,稳定了汉朝和匈奴的外交关系,《汉书.匈奴传》和《后汉书.南匈奴传》都记载了这件事。相传和亲途中,南飞的大雁听到昭君奏起悲壮的离别之曲,看到骑在马上的这位美丽女子,忘记摆动翅膀,跌落地下,因此得“落雁”之名。昭君出塞的故事也被后世传为佳话。", + yxs_luocheng: + "《隋唐》说书和《说唐传》中的虚构人物,隋唐十八杰中列第七,十六杰列第八。在清初禇人获的讲史小说《隋唐演义》中,也虚构了罗成,是燕山罗艺的儿子,秦琼的表弟,精通枪法。", + yxs_direnjie: + "唐武周时期杰出的著名政治家,时任豫州刺史、魏州刺史等要职,官至凤阁鸾台平章事、内史,卒后追封梁国公。狄仁杰生于贞观、卒于武周时期,经历了大唐鼎盛和动乱的年代。其一生秉承了以民为本、不畏权贵、为民请命的宗旨。狄仁杰通晓了吏治、兵刑等法律制度,在任大理丞任期内解决了诸多案件,被誉为“神探”。狄仁杰为官清廉,素有政绩,有辅国安邦之能,史称“唐室砥柱”。", + yxs_sunwu: + "著名军事家,字长卿,中国春秋时期齐国乐安人。曾率领吴国军队大破数倍于己的楚国军队,占领了楚国都城郢城,几乎亡楚。其著有巨作《孙子兵法》十三篇,为后世兵法家所推崇,被誉为“兵学圣典”,置于《武经七书》之首,被译为英文、法文、德文、日文,成为国际间最著名的兵学典范之书。后人尊称其为孙子、孙武子、兵圣、百世兵家之师、东方兵学的鼻祖。", + yxs_chengyaojin: + "程咬金,原名咬金,后更名知节,字义贞,中国济州东阿斑鸠店人(现山东省东平县斑鸠店)。“凌烟阁二十四功臣”之一,唐朝开国名将。隋朝末年,隋炀帝杨广统治残暴,骄奢荒淫,民不聊生,最终爆发了大规模的农民起义。程咬金先入瓦岗军,投王世充,后降唐,成为秦王李世民的骨干成员。据史书记载,程咬金“少骁勇,善用马槊。”而在以《说唐》为代表的系列话本及历史演义小说中,程咬金则使得一柄八卦宣花斧,以“三板斧”武艺著称,是一名性格直爽、粗中有细的福将。", + yxs_yujix: + "虞姬,又称虞美人,西楚霸王项羽爱姬,相传为江苏沭阳县颜集乡人,一说苏州常熟人。公元前209年,项羽与叔父项梁起义反秦。项羽军中战将虞子期的妹妹虞姬,貌美好武,倾慕年轻勇猛的项羽,嫁其为妾,常伴左右随军出征,至终形影不离。 公元前202年,项羽在垓下之战中被刘邦、韩信、彭越三方大军合围困于垓下(今安徽灵璧县城南沱河北岸城后村),身陷十面埋伏,兵孤粮缺,夜闻四面楚歌,楚军士气尽失。项羽认为大势已去,帐中酌酒,对着虞姬唱起悲壮的“垓下歌”。虞姬拔剑起舞,含泪唱和:“汉兵已略地,四面楚歌声。大王义气尽,贱妾何聊生。”为免后顾之忧影响项羽突围,唱毕于其面前自刎。", + yxs_xiangyu: + "项籍(前232—前202)字羽,通常被称作项羽,中国古代著名将领及政治人物,汉族,秦下相(今江苏省宿迁市宿城区)人。秦末时被楚怀王熊心封为鲁公,在前207年的决定性战役巨鹿之战中统率楚军大破秦军。秦亡后自封“西楚霸王”,统治黄河及长江下游的梁楚九郡。后在楚汉战争中为汉高祖刘邦所败,在乌江(今安徽和县)自刎而死。", + yxs_yingzheng: + "秦始皇,赢姓,赵氏,名政,秦庄襄王之子。秦始皇22岁时,在雍城举行国君成人加冕仪式,开始“亲理朝政”。后除掉吕不韦,嫪毐等人,重用李斯,尉缭。自公元前230年至前221年,采取由近及远,集中力量,各个击破的策略,先后灭六国,完成统一中国的大业。同时建立起历史上第一个书同文,度同制,车同轨,行同伦的中央集权国家——秦朝。", + yxs_yuefei: + " 岳飞(1103年-1142年),字鹏举,相州汤阴(今属河南)人。南宋军事家,中国历史上著名的抗金名将。绍兴十一年(1142)十二月二十九日,秦桧以“莫须有”的罪名将岳飞毒死于临安风波亭。1162年,宋孝宗时诏复官,谥武穆,宁宗时追封为鄂王,改谥忠武,有《岳武穆集》传世。", + yxs_fuermosi: + "福尔摩斯,是一个虚构的侦探人物,是由19世纪末20世纪初的英国侦探小说家阿瑟?柯南·道尔所塑造的一个才华横溢的侦探形象。福尔摩斯不但头脑冷静、观察力敏锐、推理能力极强;而且,他的剑术、拳术和小提琴演奏水平也相当高超,已经成为侦探小说中的典型代表人物之一。", + yxs_guiguzi: + "本名王诩,春秋时纵横家,卫国(今河南鹤壁一带)人。曾隐于清溪鬼谷,常入云梦采药修道,弟子无数。有张仪、苏秦、孙膑、庞涓四弟子。精于兵法、奇门遁甲、五行八卦之学。后人称之为王禅老祖。今传《鬼谷子》十四篇。", + yxs_xiaoqiao: + "小乔,庐江皖县(今安徽潜山)人。 史书中称小桥,是中国汉末三国时期的女性, 乔公的次女,东吴名将周瑜的妻子。传说与其姐大乔均为绝世美女。合称“二乔”。", + yxs_luzhishen: + "鲁智深,梁山泊第十三位好汉,十员步军头领第一名。鲁智深原名鲁达,绰号花和尚。是经略的提辖,因为见郑屠欺侮金翠莲父女,三拳打死了镇关西。被官府追捕,逃到五台山削发为僧,改名鲁智深。", + yxs_zhaoyong: + "赵武灵王,战国中后期赵国君主,嬴姓,赵氏,名雍。赵武灵王在位时,推行的“胡服骑射”政策,赵国因而得以强盛,灭中山国,败林胡、楼烦二族,辟云中、雁门、代三郡,并修筑了“赵长城”。", + yxs_yangguang: + "隋炀帝杨广,是隋朝第二代皇帝,华阴(今陕西华阴)人,生于隋京师长安。杨广在位期间修建大运河,营建东都迁都洛阳城,开创科举制度,亲征吐谷浑,三征高句丽。但因为杨广滥用民力,导致了隋朝的灭亡,618年在江都被部下缢杀。", + yxs_tangbohu: + "唐伯虎,名寅,字伯虎,自号六如居士,明代诗人、画家,吴县(今江苏苏州)人。出身富商家庭,后家道衰落,因祝枝山之劝而潜心读书。公试时为状元,会试时候因科场舞弊案牵连而被斥为吏。后绝意仕途,以卖画为生。唐伯虎为人玩世不恭而又才气横溢,诗文擅名,与祝枝山、文征明、徐祯卿并称“江南四大才子”,画名更著,与沈周、文征明、仇英并称“吴门四家”。民间盛传其点秋香的故事。", + yxs_zhangsanfeng: + "明朝最著名的武术家、道士。原名张通,字君宝,在武当山开山立派,成为武当派开山祖师。明英宗赐号“通微显化真人”;明宪宗特封号为“韬光尚志真仙”;明世宗赠封他为“清虚元妙真君”。传说其丰姿魁伟,大耳圆目,须髯如戟。无论寒暑,只一衲一蓑,一餐能食升斗,或数日一食,或数月不食,事能前知。其在武术上的造诣和超乎寻常的长寿都为后人称道。 曾传洪武年间,两度受朱元璋诏请入京,皆避而不见。其与明初巨贾沈万三亦有交际。其所创太极拳一直延续至今,成为后人养身妙术。", + yxs_nandinggeer: + "出生于意大利,英国护士和统计学家。她谙熟数学,精通英、法、德、意四门语言,除古典文学外,还精于自然科学、历史和哲学,擅长音乐与绘画。在德国学习护理后,曾往伦敦的医院工作。南丁格尔于1854年和38位护士到克里米亚野战医院工作,成为该院的护士长,被称为“克里米亚的天使”又称“提灯女神”。1860年6月15日,南丁格尔在伦敦成立世界第一所护士学校。为了纪念她的成就,1912年,国际护士会倡仪各国医院和护士学校定每年5月12日南丁格尔诞辰日举行纪念活动,并将5月12日定为“国际护士节”,以缅怀和纪念这位伟大的女性。", + yxs_weizhongxian: + "魏忠贤(1568年-1627年12月11日),字完吾,北直隶肃宁(今河北沧州肃宁县)人,汉族,原名李进忠。由才人王氏复姓,出任秉笔太监后,改名魏忠贤。明朝末期宦官。明熹宗时期,出任司礼秉笔太监,极受宠信,被称为“九千九百岁”,排除异己,专断国政,以致人们“只知有忠贤,而不知有皇上”。朱由检继位后,打击惩治阉党,治魏忠贤十大罪,命逮捕法办,自缢而亡,其余党亦被肃清。", + yxs_meixi: + '妺喜,姓嬉(喜),生卒年不详,亦作妺嬉、末喜、末嬉,有施氏之女,夏朝最后一位君主夏桀的王后。根据先秦时代记述女子名时所用的全称和简称方式,妺喜应姓喜,即嬉(也作僖)。由于其名字的“妺”字与“妹妹”的“妹”字字形相似,且在《庄子》等作中也有以妺为妹的用法,因此常误作"妹喜"。', + yxs_lanlinwang: + "高长恭(541年―573年),又名高孝瓘、高肃,祖籍渤海调蓨(今河北省景县),神武帝高欢之孙,文襄帝高澄第四子,生母不详,南北朝时期北齐宗室、将领,封爵兰陵郡王。高长恭貌柔心壮,音容兼美。为将躬勤细事,每得甘美,虽一瓜数果,必与将士分享。累次升任至并州刺史。突厥攻入晋阳,高长恭奋力将其击退。邙山之战,高长恭为中军,率领五百骑兵再入周军包围圈,直至金墉城下,因高长恭戴着头盔,城中的人不确定是敌军或是我军,直到高长恭把头盔脱下来城上的人才知道是高长恭,派弓箭手开始放箭保护他,之后高长恭成功替金墉解围,高长恭在此次战中威名大振,士兵们为此战而讴歌他,即后来知名的《兰陵王入阵曲》。", }, - characterTitle:{ - yxs_qinqiong:"Sukincen", + characterTitle: { + yxs_qinqiong: "Sukincen", }, - skill:{ - yxs_fanji:{ - audio:2, - trigger:{ - player:"damageEnd", + skill: { + yxs_fanji: { + audio: 2, + trigger: { + player: "damageEnd", }, - direct:true, - priority:12, - filter:function (event,player){ - if(!player.countCards('h',{name:'sha'})) return false; - return event.card&&(event.card.name=='sha'||event.card.name=='juedou'); + direct: true, + priority: 12, + filter: function (event, player) { + if (!player.countCards("h", { name: "sha" })) return false; + return event.card && (event.card.name == "sha" || event.card.name == "juedou"); }, - content:function(){ - player.addTempSkill('yxs_fanji2','shaAfter'); - player.chooseToUse({name:'sha'},trigger.source,'反击:是否对'+get.translation(trigger.source)+'使用一张杀?').logSkill='yxs_fanji'; + content: function () { + player.addTempSkill("yxs_fanji2", "shaAfter"); + player.chooseToUse( + { name: "sha" }, + trigger.source, + "反击:是否对" + get.translation(trigger.source) + "使用一张杀?" + ).logSkill = "yxs_fanji"; }, }, - yxs_fanji2:{ - audio:2, - trigger:{ - player:"shaBegin", + yxs_fanji2: { + audio: 2, + trigger: { + player: "shaBegin", }, - direct:true, - filter:function (event,player){ - return event.card&&event.card.name=='sha'&&get.color(event.card)=='red'; + direct: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && get.color(event.card) == "red"; }, - content:function (){ - trigger.directHit=true; + content: function () { + trigger.directHit = true; }, }, - yxs_menshen3:{ - trigger:{ - player:['phaseBegin','dieBegin'], + yxs_menshen3: { + trigger: { + player: ["phaseBegin", "dieBegin"], }, - silent:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.hasSkill('yxs_menshen2'); + silent: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.hasSkill("yxs_menshen2"); }); }, - content:function(){ - for(var i=0;i1; + priority: 15, + group: "yxs_menshen3", + onremove: true, + filter: function (event, player) { + return game.players.length > 1; }, - content:function(){ - "step 0" - player.chooseTarget('选择【门神】的目标',lib.translate.yxs_menshen_info,true,function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - return get.attitude(player,target); - }); - "step 1" - if(result.bool){ - var target=result.targets[0]; - player.line(target,'green'); - game.log(target,'成为了','【门神】','的目标'); - target.storage.yxs_menshen2=player; - target.addSkill('yxs_menshen2'); - } - else{ + content: function () { + "step 0"; + player + .chooseTarget( + "选择【门神】的目标", + lib.translate.yxs_menshen_info, + true, + function (card, player, target) { + return target != player; + } + ) + .set("ai", function (target) { + return get.attitude(player, target); + }); + ("step 1"); + if (result.bool) { + var target = result.targets[0]; + player.line(target, "green"); + game.log(target, "成为了", "【门神】", "的目标"); + target.storage.yxs_menshen2 = player; + target.addSkill("yxs_menshen2"); + } else { event.finish(); } }, - ai:{ - expose:0.5, + ai: { + expose: 0.5, }, }, - yxs_menshen2:{ - audio:2, - mark:'character', - intro:{ - content:'当你成为【杀】或【决斗】的目标后,改为$成为目标' + yxs_menshen2: { + audio: 2, + mark: "character", + intro: { + content: "当你成为【杀】或【决斗】的目标后,改为$成为目标", }, - nopop:true, - priority:15, - trigger:{ - target:["shaBegin","juedouBegin"], + nopop: true, + priority: 15, + trigger: { + target: ["shaBegin", "juedouBegin"], }, - forced:true, - popup:false, - filter:function(event,player){ + forced: true, + popup: false, + filter: function (event, player) { return player.isAlive(); }, - content:function (){ - var target=player.storage.yxs_menshen2; - trigger.player.line(target,'green'); + content: function () { + var target = player.storage.yxs_menshen2; + trigger.player.line(target, "green"); trigger.targets.remove(player); trigger.targets.push(target); trigger.target = target; }, }, - guimian:{ - trigger:{source:'damageEnd'}, - forced:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&_status.currentPhase==player; + guimian: { + trigger: { source: "damageEnd" }, + forced: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && _status.currentPhase == player; }, - content:function(){ + content: function () { player.getStat().card.sha--; - } + }, }, - lyuxue:{ - trigger:{source:'damageEnd'}, - forced:true, - logTarget:'player', - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - return event.player.isIn()&&!event.player.hasSkill('lyuxue2'); + lyuxue: { + trigger: { source: "damageEnd" }, + forced: true, + logTarget: "player", + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + return event.player.isIn() && !event.player.hasSkill("lyuxue2"); }, - content:function(){ - trigger.player.addSkill('lyuxue2'); + content: function () { + trigger.player.addSkill("lyuxue2"); }, - subSkill:{ - clear:{ - trigger:{player:['phaseBegin','dieBegin']}, - forced:true, - filter:function(event,player){ - var num=game.countPlayer(function(current){ - return current.hasSkill('lyuxue2'); + subSkill: { + clear: { + trigger: { player: ["phaseBegin", "dieBegin"] }, + forced: true, + filter: function (event, player) { + var num = game.countPlayer(function (current) { + return current.hasSkill("lyuxue2"); }); - if(!num) return false; - if(event.name=='die') return true; - return num>=Math.floor(game.countPlayer()/2); + if (!num) return false; + if (event.name == "die") return true; + return num >= Math.floor(game.countPlayer() / 2); }, - content:function(){ - 'step 0' - var list=game.filterPlayer(function(current){ - return current.hasSkill('lyuxue2'); + content: function () { + "step 0"; + var list = game.filterPlayer(function (current) { + return current.hasSkill("lyuxue2"); }); list.sortBySeat(); - event.list=list; - player.line(list,'green'); - 'step 1' - if(event.list.length){ - event.list.shift().removeSkill('lyuxue2'); + event.list = list; + player.line(list, "green"); + ("step 1"); + if (event.list.length) { + event.list.shift().removeSkill("lyuxue2"); event.redo(); } - } - } + }, + }, }, - group:'lyuxue_clear', + group: "lyuxue_clear", }, - lyuxue2:{ - mark:true, - intro:{ - content:'已获得浴血标记' + lyuxue2: { + mark: true, + intro: { + content: "已获得浴血标记", }, - onremove:function(player){ + onremove: function (player) { player.loseHp(); - } + }, }, - yaoji:{ - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source!=player&&!event.source.hasJudge('lebu'); + yaoji: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return ( + event.source && + event.source.isIn() && + event.source != player && + !event.source.hasJudge("lebu") + ); }, - check:function(event,player){ - return get.attitude(player,event.source)<=0; + check: function (event, player) { + return get.attitude(player, event.source) <= 0; }, - logTarget:'source', - content:function(){ - var card=game.createCard('lebu'); + logTarget: "source", + content: function () { + var card = game.createCard("lebu"); trigger.source.addJudge(card); trigger.source.$draw(card); game.delay(); }, - ai:{ - maixie_defend:true, - } - }, - liebo:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return Math.abs(target.countCards('h')-player.countCards('h'))<=1; + ai: { + maixie_defend: true, }, - content:function(){ + }, + liebo: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return Math.abs(target.countCards("h") - player.countCards("h")) <= 1; + }, + content: function () { player.swapHandcards(target); }, - ai:{ - order:function(){ - var player=_status.event.player; - if(player.hasCard(function(card){ - return get.value(card)>=8; - })){ + ai: { + order: function () { + var player = _status.event.player; + if ( + player.hasCard(function (card) { + return get.value(card) >= 8; + }) + ) { return 0; } - var nh=player.countCards('h'); - if(game.hasPlayer(function(current){ - return get.attitude(player,current)<=0&¤t.countCards('h')==nh+1; - })){ + var nh = player.countCards("h"); + if ( + game.hasPlayer(function (current) { + return ( + get.attitude(player, current) <= 0 && current.countCards("h") == nh + 1 + ); + }) + ) { return 9; } return 1; }, - result:{ - player:function(player,target){ - var att=get.attitude(player,target); - if(att>0) return 0; - if(player.hasCard(function(card){ - return get.value(card)>=8; - })){ + result: { + player: function (player, target) { + var att = get.attitude(player, target); + if (att > 0) return 0; + if ( + player.hasCard(function (card) { + return get.value(card) >= 8; + }) + ) { return 0; } - var n1=target.countCards('h'),n2=player.countCards('h'); - var num=0; - if(n1-n2==1){ - num=1; + var n1 = target.countCards("h"), + n2 = player.countCards("h"); + var num = 0; + if (n1 - n2 == 1) { + num = 1; } - if(player.countCards('h','du')){ - if(n1==n2) num=0.5; - else num=0.1; + if (player.countCards("h", "du")) { + if (n1 == n2) num = 0.5; + else num = 0.1; } - if(att==0){ - num/=2; + if (att == 0) { + num /= 2; } return num; - } - } - } + }, + }, + }, }, - zhuxin:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target!=player&&target.countCards('h'); + zhuxin: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("h"); }, - filter:function(event,player){ - return player.countCards('h'); + filter: function (event, player) { + return player.countCards("h"); }, - content:function(){ - 'step 0' + content: function () { + "step 0"; player.chooseToCompare(target); - 'step 1' - if(result.bool){ + ("step 1"); + if (result.bool) { target.damage(); } }, - ai:{ - order:8, - result:{ - target:function(player,target){ - return get.damageEffect(target,player,target); - } - } - } - }, - wlianhuan:{ - trigger:{source:'damageBegin'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.countCards('e'); + ai: { + order: 8, + result: { + target: function (player, target) { + return get.damageEffect(target, player, target); + }, + }, }, - direct:true, - content:function(){ - 'step 0' - var next=player.chooseToDiscard('e',get.prompt('wlianhuan',trigger.player),'弃置一张装备区内的牌使伤害+1'); - next.ai=function(card){ - if(get.attitude(player,trigger.player)<0){ - return 7-get.value(card); + }, + wlianhuan: { + trigger: { source: "damageBegin" }, + filter: function (event, player) { + return event.card && event.card.name == "sha" && player.countCards("e"); + }, + direct: true, + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "e", + get.prompt("wlianhuan", trigger.player), + "弃置一张装备区内的牌使伤害+1" + ); + next.ai = function (card) { + if (get.attitude(player, trigger.player) < 0) { + return 7 - get.value(card); } return 0; - } - next.logSkill=['wlianhuan',trigger.player]; - 'step 1' - if(result.bool){ + }; + next.logSkill = ["wlianhuan", trigger.player]; + ("step 1"); + if (result.bool) { trigger.num++; } - } + }, }, - huli:{ - enable:'phaseUse', - filterCard:{suit:'heart'}, - filterTarget:function(card,player,target){ - return get.distance(player,target)<=1&&lib.filter.cardEnabled({name:'tao'},target,target); + huli: { + enable: "phaseUse", + filterCard: { suit: "heart" }, + filterTarget: function (card, player, target) { + return ( + get.distance(player, target) <= 1 && + lib.filter.cardEnabled({ name: "tao" }, target, target) + ); }, - check:function(card){ - return 8-get.value(card); + check: function (card) { + return 8 - get.value(card); }, - discard:false, - lose:false, - filter:function(event,player){ - if(player.countCards('h',{suit:'heart'})){ + discard: false, + lose: false, + filter: function (event, player) { + if (player.countCards("h", { suit: "heart" })) { return true; } return false; }, - prepare:'throw', - content:function(){ - player.useCard({name:'tao'},cards,targets[0]).animate=false; + prepare: "throw", + content: function () { + player.useCard({ name: "tao" }, cards, targets[0]).animate = false; }, - ai:{ - order:9.5, - result:{ - target:function(player,target){ - return get.recoverEffect(target,player,target); - } + ai: { + order: 9.5, + result: { + target: function (player, target) { + return get.recoverEffect(target, player, target); + }, }, - threaten:1.6 - } + threaten: 1.6, + }, }, - yixin:{ - skillAnimation:true, - unique:true, - mark:true, - init:function(player){ - player.storage.yixin=false; + yixin: { + skillAnimation: true, + unique: true, + mark: true, + init: function (player) { + player.storage.yixin = false; }, - enable:'phaseUse', - filter:function(event,player){ - return !player.storage.yixin&&player.countCards('he')>2; + enable: "phaseUse", + filter: function (event, player) { + return !player.storage.yixin && player.countCards("he") > 2; }, - intro:{ - content:'limited' + intro: { + content: "limited", }, - filterTarget:function(card,player,target){ + filterTarget: function (card, player, target) { return target.isDamaged(); }, - filterCard:true, - position:'he', - selectCard:2, - check:function(card){ - return 7-get.value(card); + filterCard: true, + position: "he", + selectCard: 2, + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - player.awakenSkill('yixin'); - player.storage.yixin=true; - var num=Math.min(4,target.maxHp-target.hp); + content: function () { + player.awakenSkill("yixin"); + player.storage.yixin = true; + var num = Math.min(4, target.maxHp - target.hp); target.recover(num); - if(num<4){ - target.draw(4-num); + if (num < 4) { + target.draw(4 - num); } }, - ai:{ - order:9.6, - result:{ - target:function(player,target){ - if(target.hp==1&&target.maxHp>=3){ - return get.recoverEffect(target,player,target); + ai: { + order: 9.6, + result: { + target: function (player, target) { + if (target.hp == 1 && target.maxHp >= 3) { + return get.recoverEffect(target, player, target); } return 0; - } - } - } - }, - xianqu:{ - mod:{ - targetEnabled:function(card){ - if(card.name=='sha'&&card.number<8) return false; - } + }, + }, }, }, - zbudao:{ - trigger:{player:'phaseDrawBegin'}, + xianqu: { + mod: { + targetEnabled: function (card) { + if (card.name == "sha" && card.number < 8) return false; + }, + }, + }, + zbudao: { + trigger: { player: "phaseDrawBegin" }, //check:function(event,player){ // if(player.hasFriend()) return true; // return false; //}, - content:function(){ + content: function () { trigger.num++; - player.addTempSkill('zbudao2','phaseDrawAfter'); + player.addTempSkill("zbudao2", "phaseDrawAfter"); }, - ai:{ - threaten:1.3 + ai: { + threaten: 1.3, }, }, - zbudao2:{ - trigger:{player:'phaseDrawEnd'}, - forced:true, - popup:false, - filter:function(event){ - return event.cards&&event.cards.length; + zbudao2: { + trigger: { player: "phaseDrawEnd" }, + forced: true, + popup: false, + filter: function (event) { + return event.cards && event.cards.length; }, - content:function(){ - 'step 0' - event.cards=trigger.cards.slice(0); + content: function () { + "step 0"; + event.cards = trigger.cards.slice(0); player.chooseCardTarget({ - filterCard:function(card){ + filterCard: function (card) { return _status.event.getParent().cards.includes(card); }, - selectCard:1, - filterTarget:function(card,player,target){ - return player!=target; + selectCard: 1, + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ - if(ui.selected.cards.length>0) return -1; - if(card.name=='du') return 20; - return (_status.event.player.countCards('h')-_status.event.player.hp); + ai1: function (card) { + if (ui.selected.cards.length > 0) return -1; + if (card.name == "du") return 20; + return _status.event.player.countCards("h") - _status.event.player.hp; }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - return 1-att; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + return 1 - att; } - return att-4; + return att - 4; }, //forced:true, - prompt:'将得到的一张牌交给一名其他角色,或点取消' + prompt: "将得到的一张牌交给一名其他角色,或点取消", }); - "step 1" - if(result.bool){ - player.line(result.targets,'green'); - result.targets[0].gain(result.cards,player); - player.$give(result.cards.length,result.targets[0]); + ("step 1"); + if (result.bool) { + player.line(result.targets, "green"); + result.targets[0].gain(result.cards, player); + player.$give(result.cards.length, result.targets[0]); game.delay(0.7); } - } - }, - taiji:{ - trigger:{player:['useCard','respond']}, - filter:function(event,player){ - return event.card.name=='shan'&&player.hasSha(); - }, - direct:true, - content:function(){ - player.chooseToUse({name:'sha'},'太极:是否使用一张杀?').logSkill='taiji'; }, }, - fengliu:{ - trigger:{player:'phaseDrawBegin'}, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.sex=='female'; + taiji: { + trigger: { player: ["useCard", "respond"] }, + filter: function (event, player) { + return event.card.name == "shan" && player.hasSha(); + }, + direct: true, + content: function () { + player.chooseToUse({ name: "sha" }, "太极:是否使用一张杀?").logSkill = "taiji"; + }, + }, + fengliu: { + trigger: { player: "phaseDrawBegin" }, + filter: function (event, player) { + return game.hasPlayer(function (current) { + return current.sex == "female"; }); }, - forced:true, - content:function(){ - var num=game.countPlayer(function(current){ - return current.sex=='female'; + forced: true, + content: function () { + var num = game.countPlayer(function (current) { + return current.sex == "female"; }); - if(num>2) num=2; - trigger.num+=num; + if (num > 2) num = 2; + trigger.num += num; }, - ai:{ - threaten:function(){ - var num=game.countPlayer(function(current){ - return current.sex=='female'; + ai: { + threaten: function () { + var num = game.countPlayer(function (current) { + return current.sex == "female"; }); - switch(num){ - case 0:return 1; - case 1:return 1.3; - default:return 2; + switch (num) { + case 0: + return 1; + case 1: + return 1.3; + default: + return 2; } - } + }, }, }, - luobi:{ - trigger:{player:'phaseEnd'}, - filter:function(event,player){ + luobi: { + trigger: { player: "phaseEnd" }, + filter: function (event, player) { return player.isDamaged(); }, - content:function(){ - "step 0" - player.draw(player.maxHp-player.hp); - "step 1" - event.cards=result; - "step 2" + content: function () { + "step 0"; + player.draw(player.maxHp - player.hp); + ("step 1"); + event.cards = result; + ("step 2"); player.chooseCardTarget({ - filterCard:function(card){ + filterCard: function (card) { return _status.event.getParent().cards.includes(card); }, - selectCard:[1,event.cards.length], - filterTarget:function(card,player,target){ - return player!=target; + selectCard: [1, event.cards.length], + filterTarget: function (card, player, target) { + return player != target; }, - ai1:function(card){ - if(ui.selected.cards.length>0) return -1; - if(card.name=='du') return 20; - return (_status.event.player.countCards('h')-_status.event.player.hp); + ai1: function (card) { + if (ui.selected.cards.length > 0) return -1; + if (card.name == "du") return 20; + return _status.event.player.countCards("h") - _status.event.player.hp; }, - ai2:function(target){ - var att=get.attitude(_status.event.player,target); - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - return 1-att; + ai2: function (target) { + var att = get.attitude(_status.event.player, target); + if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { + return 1 - att; } - return att-4; + return att - 4; }, - prompt:'请选择要送人的卡牌' + prompt: "请选择要送人的卡牌", }); - "step 3" - if(result.bool){ - player.line(result.targets,'green'); - result.targets[0].gain(result.cards,player); - player.$give(result.cards.length,result.targets[0]); - for(var i=0;i0){ - return game.hasPlayer(function(current){ - return current.group!='qun'&¤t!=player; + yaoyi: { + trigger: { player: "damageEnd" }, + direct: true, + filter: function (event, player) { + if (event.num > 0) { + return game.hasPlayer(function (current) { + return current.group != "qun" && current != player; }); } return false; }, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('yaoyi'),[1,2],function(card,player,target){ - return target.countCards('h')&&target.group!='qun'&&target!=player; - }).set('ai',function(target){ - return 0.5-get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - player.logSkill('yaoyi',result.targets); - event.targets=result.targets; - } - else{ + content: function () { + "step 0"; + player + .chooseTarget(get.prompt("yaoyi"), [1, 2], function (card, player, target) { + return target.countCards("h") && target.group != "qun" && target != player; + }) + .set("ai", function (target) { + return 0.5 - get.attitude(_status.event.player, target); + }); + ("step 1"); + if (result.bool) { + player.logSkill("yaoyi", result.targets); + event.targets = result.targets; + } else { event.finish(); } - 'step 2' - if(event.targets&&event.targets.length){ - event.target=event.targets.shift(); - event.target.chooseCard('交给'+get.translation(player)+'一张手牌',true).ai=function(card){ - return -get.value(card); - } - } - else{ + ("step 2"); + if (event.targets && event.targets.length) { + event.target = event.targets.shift(); + event.target.chooseCard("交给" + get.translation(player) + "一张手牌", true).ai = + function (card) { + return -get.value(card); + }; + } else { event.finish(); } - 'step 3' - if(result.bool&&result.cards&&result.cards.length){ - event.target.$give(1,player); - player.gain(result.cards,event.target); + ("step 3"); + if (result.bool && result.cards && result.cards.length) { + event.target.$give(1, player); + player.gain(result.cards, event.target); } event.goto(2); }, - ai:{ - maixie:true, - maixie_hp:true, - expose:0.2, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - var players=game.filterPlayer(); - for(var i=0;i=4) return [1,get.tag(card,'damage')*2]; - if(target.hp==3) return [1,get.tag(card,'damage')*1.5]; - if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; + ai: { + maixie: true, + maixie_hp: true, + expose: 0.2, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i].group != "qun" && + get.attitude(player, players[i]) <= 0 && + players[i] != player + ) { + if (target.hp >= 4) return [1, get.tag(card, "damage") * 2]; + if (target.hp == 3) return [1, get.tag(card, "damage") * 1.5]; + if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5]; } } } - } - } - } + }, + }, + }, }, - shiqin:{ - trigger:{global:'dying'}, - priority:9, - filter:function(event,player){ - return event.player!=player&&event.player.hp<=0&&event.player.group=='qun'; + shiqin: { + trigger: { global: "dying" }, + priority: 9, + filter: function (event, player) { + return event.player != player && event.player.hp <= 0 && event.player.group == "qun"; }, - check:function(event,player){ - return get.attitude(player,event.player)<0; + check: function (event, player) { + return get.attitude(player, event.player) < 0; }, - forced:true, - logTarget:'player', - content:function(){ - 'step 0' + forced: true, + logTarget: "player", + content: function () { + "step 0"; game.delayx(); trigger.player.die(); - 'step 1' - if(!trigger.player.isAlive()){ + ("step 1"); + if (!trigger.player.isAlive()) { trigger.cancel(true); } - } + }, }, - zyhufu:{ - trigger:{player:'phaseDrawBegin'}, - filter:function(event,player){ + zyhufu: { + trigger: { player: "phaseDrawBegin" }, + filter: function (event, player) { return !player.getEquip(2); }, - forced:true, - content:function(){ + forced: true, + content: function () { trigger.num++; }, - ai:{ - threaten:1.3 + ai: { + threaten: 1.3, + }, + mod: { + maxHandcard: function (player, num) { + if (player.getEquip(2)) return num + 5; + }, }, - mod:{ - maxHandcard:function(player,num){ - if(player.getEquip(2)) return num+5; - } - } }, - hanbei:{ - trigger:{player:'shaBegin'}, - forced:true, - filter:function(event,player){ - if(player.getEquip(3)||player.getEquip(4)) return true; + hanbei: { + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event, player) { + if (player.getEquip(3) || player.getEquip(4)) return true; return false; }, - content:function(){ - trigger.directHit=true; - } + content: function () { + trigger.directHit = true; + }, }, - sheshu:{ - trigger:{player:'shaBegin'}, - forced:true, - filter:function(event,player){ - return event.target.hp>=3; + sheshu: { + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event, player) { + return event.target.hp >= 3; }, - content:function(){ - trigger.directHit=true; + content: function () { + trigger.directHit = true; }, - mod:{ - targetInRange:function(card){ - if(card.name=='sha') return true; + mod: { + targetInRange: function (card) { + if (card.name == "sha") return true; }, }, }, - lguiyin:{ - unique:true, - forceunique:true, - enable:'phaseUse', - filter:function(event,player){ - return !player.hasSkill('tongyu_guiyin')&&!player.getStat('damage'); + lguiyin: { + unique: true, + forceunique: true, + enable: "phaseUse", + filter: function (event, player) { + return !player.hasSkill("tongyu_guiyin") && !player.getStat("damage"); }, - derivation:['lzhangyi','jimin','tongyu'], - content:function(){ + derivation: ["lzhangyi", "jimin", "tongyu"], + content: function () { player.draw(); - player.setAvatar('yxs_luobinhan','yxs_handingdun'); - player.removeSkill('lguiyin'); - player.removeSkill('sheshu'); - player.removeSkill('xiadao'); - player.addSkill('jimin'); - player.addSkill('lzhangyi'); - player.addSkill('tongyu'); - player.addTempSkill('tongyu_guiyin'); + player.setAvatar("yxs_luobinhan", "yxs_handingdun"); + player.removeSkill("lguiyin"); + player.removeSkill("sheshu"); + player.removeSkill("xiadao"); + player.addSkill("jimin"); + player.addSkill("lzhangyi"); + player.addSkill("tongyu"); + player.addTempSkill("tongyu_guiyin"); }, - ai:{ - order:function(){ - if(_status.event.player.hp==1) return 9; + ai: { + order: function () { + if (_status.event.player.hp == 1) return 9; return 0.5; }, - result:{ - player:function(player){ - if(player.hp0&&!player.hasSkill('tongyu_guiyin'); + tongyu: { + unique: true, + forceunique: true, + enable: "phaseUse", + filter: function (event, player) { + return player.countCards("he") > 0 && !player.hasSkill("tongyu_guiyin"); }, - filterCard:true, - position:'he', - check:function(card){ - return 7-get.value(card); + filterCard: true, + position: "he", + check: function (card) { + return 7 - get.value(card); }, - content:function(){ - player.setAvatar('yxs_luobinhan','yxs_luobinhan'); - player.addSkill('lguiyin'); - player.addSkill('sheshu'); - player.addSkill('xiadao'); - player.removeSkill('jimin'); - player.removeSkill('lzhangyi'); - player.removeSkill('tongyu'); - player.addTempSkill('tongyu_guiyin'); + content: function () { + player.setAvatar("yxs_luobinhan", "yxs_luobinhan"); + player.addSkill("lguiyin"); + player.addSkill("sheshu"); + player.addSkill("xiadao"); + player.removeSkill("jimin"); + player.removeSkill("lzhangyi"); + player.removeSkill("tongyu"); + player.addTempSkill("tongyu_guiyin"); }, - ai:{ - order:9, - result:{ - player:function(player){ - if(player.hasFriend()) return 1; + ai: { + order: 9, + result: { + player: function (player) { + if (player.hasFriend()) return 1; return 0; - } - } - } + }, + }, + }, }, - tongyu_guiyin:{}, - zhijie:{ - enable:'phaseUse', - usable:1, - viewAsFilter:function(player){ - return player.countCards('h',{suit:'heart'})>0; + tongyu_guiyin: {}, + zhijie: { + enable: "phaseUse", + usable: 1, + viewAsFilter: function (player) { + return player.countCards("h", { suit: "heart" }) > 0; + }, + viewAs: { name: "wuzhong" }, + filterCard: { suit: "heart" }, + check: function (card) { + return 8 - get.value(card); }, - viewAs:{name:'wuzhong'}, - filterCard:{suit:'heart'}, - check:function(card){ - return 8-get.value(card); - } }, - yxsdili:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - filter:function(event,player){ - return player.hp=player.maxHp-1) return [0,0]; - } - } - } - }, - kuangchan:{ - ai:{ - neg:true + if (get.tag(card, "recover") && player.hp >= player.maxHp - 1) return [0, 0]; + }, + }, }, - init:function(player){ - if(player.isZhu){ + }, + kuangchan: { + ai: { + neg: true, + }, + init: function (player) { + if (player.isZhu) { player.maxHp--; player.update(); } - } + }, }, - chujia:{ - enable:'phaseUse', - filterCard:function(card){ - if(ui.selected.cards.length){ - return get.color(card)==get.color(ui.selected.cards[0]); + chujia: { + enable: "phaseUse", + filterCard: function (card) { + if (ui.selected.cards.length) { + return get.color(card) == get.color(ui.selected.cards[0]); } return true; }, - complexCard:true, - usable:1, - selectCard:2, - check:function(card){ - return 6-get.value(card); + complexCard: true, + usable: 1, + selectCard: 2, + check: function (card) { + return 6 - get.value(card); }, - filterTarget:function(card,player,target){ - return target.hptarget.hp){ - target.draw(target.maxHp-target.hp); + content: function () { + if (target.maxHp > target.hp) { + target.draw(target.maxHp - target.hp); } }, - ai:{ - order:2, - result:{ - target:function(player,target){ - var num=target.maxHp-target.hp; - if(num>2) return num; + ai: { + order: 2, + result: { + target: function (player, target) { + var num = target.maxHp - target.hp; + if (num > 2) return num; return 0; - } - } - } + }, + }, + }, }, - baihe:{ - enable:'phaseUse', - usable:1, - filterCard:true, - position:'he', - filterTarget:true, - content:function(){ - 'step 0' - if(target.isLinked()){ + baihe: { + enable: "phaseUse", + usable: 1, + filterCard: true, + position: "he", + filterTarget: true, + content: function () { + "step 0"; + if (target.isLinked()) { target.link(); - } - else{ + } else { target.link(); target.draw(); event.finish(); } - 'step 1' - if(target.countCards('h')){ - target.chooseToDiscard('h',true); + ("step 1"); + if (target.countCards("h")) { + target.chooseToDiscard("h", true); } }, - check:function(card){ - return 8-get.value(card); + check: function (card) { + return 8 - get.value(card); }, - ai:{ - order:1, - result:{ - player:function(player,target){ - if(!player.hasSkill('xiushen')) return 0; - if(target.isLinked()) return 0; - if(game.hasPlayer(function(current){ - return current.isLinked(); - })){ + ai: { + order: 1, + result: { + player: function (player, target) { + if (!player.hasSkill("xiushen")) return 0; + if (target.isLinked()) return 0; + if ( + game.hasPlayer(function (current) { + return current.isLinked(); + }) + ) { return 0; } return 1; - } - } - } + }, + }, + }, }, - yinyang:{ - enable:'phaseUse', - usable:1, - filterCard:true, - selectCard:2, - filterTarget:true, - selectTarget:3, - content:function(){ + yinyang: { + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: 2, + filterTarget: true, + selectTarget: 3, + content: function () { target.link(); }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - ai:{ - order:2, - result:{ - target:function(player,target){ - if(target.isLinked()) return 1; + ai: { + order: 2, + result: { + target: function (player, target) { + if (target.isLinked()) return 1; return -1; - } - } - } + }, + }, + }, }, - xiushen:{ - trigger:{player:'phaseUseEnd'}, - forced:true, - filter:function(event,player){ - return game.hasPlayer(function(current){ + xiushen: { + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return game.hasPlayer(function (current) { return current.isLinked(); }); }, - content:function(){ + content: function () { player.draw(2); }, - ai:{ - threaten:1.6 - } - }, - jiean:{ - trigger:{source:'damageEnd'}, - frequent:true, - filter:function(event){ - if(event._notrigger.includes(event.player)) return false; - return event.player.isAlive()&&event.parent.name=='yanyi'&&event.player.hp0) return -1; - return (_status.event.player.countCards('h')-_status.event.player.hp); + ai1: function (card) { + if (ui.selected.cards.length > 0) return -1; + return _status.event.player.countCards("h") - _status.event.player.hp; }, - ai2:function(target){ - return get.attitude(_status.event.player,target)-4; + ai2: function (target) { + return get.attitude(_status.event.player, target) - 4; }, - prompt:'请选择要送人的卡牌' + prompt: "请选择要送人的卡牌", }); - "step 3" - if(result.bool){ - result.targets[0].gain(result.cards,player); - player.$give(result.cards.length,result.targets[0]); - for(var i=0;i0; }, - content:function(){ - "step 0" - player.chooseControl('heart2','diamond2','club2','spade2').ai=function(event){ - switch(Math.floor(Math.random()*5)){ - case 0:return 'heart2'; - case 1:case 4:return 'diamond2'; - case 2:return 'club2'; - case 3:return 'spade2'; + }, + yanyi: { + enable: "phaseUse", + usable: 1, + filterCard: { color: "black" }, + position: "he", + filterTarget: function (card, player, target) { + return target != player && target.countCards("h") > 0; + }, + content: function () { + "step 0"; + player.chooseControl("heart2", "diamond2", "club2", "spade2").ai = function (event) { + switch (Math.floor(Math.random() * 5)) { + case 0: + return "heart2"; + case 1: + case 4: + return "diamond2"; + case 2: + return "club2"; + case 3: + return "spade2"; } }; - "step 1" - game.log(player,'选择了'+get.translation(result.control)); - event.choice=result.control.slice(0,result.control.length-1); + ("step 1"); + game.log(player, "选择了" + get.translation(result.control)); + event.choice = result.control.slice(0, result.control.length - 1); target.popup(result.control); target.showHandcards(); - "step 2" - if(target.countCards('h',{suit:event.choice})){ + ("step 2"); + if (target.countCards("h", { suit: event.choice })) { target.damage(); } }, - ai:{ - result:{ - target:function(player,target){ - return get.damageEffect(target,player,target); - } - } - } - }, - wumu:{ - mod:{ - targetInRange:function(card,player){ - if(card.name=='sha'&&get.color(card)=='black') return true; + ai: { + result: { + target: function (player, target) { + return get.damageEffect(target, player, target); + }, }, - cardUsable:function(card){ - if(card.name=='sha'&&get.color(card)=='red') return Infinity; - } }, - trigger:{player:'useCard'}, - filter:function(event,player){ - return event.card.name=='sha'&&get.color(event.card)=='red'; + }, + wumu: { + mod: { + targetInRange: function (card, player) { + if (card.name == "sha" && get.color(card) == "black") return true; + }, + cardUsable: function (card) { + if (card.name == "sha" && get.color(card) == "red") return Infinity; + }, }, - forced:true, - content:function(){ - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + trigger: { player: "useCard" }, + filter: function (event, player) { + return event.card.name == "sha" && get.color(event.card) == "red"; + }, + forced: true, + content: function () { + if (player.stat[player.stat.length - 1].card.sha > 0) { + player.stat[player.stat.length - 1].card.sha--; } }, }, - ysheshen:{ - inherit:'yiji' + ysheshen: { + inherit: "yiji", }, - sanbanfu:{ - trigger:{player:'shaBegin'}, - filter:function(event,player){ - if(player.storage.sanbanfu||player.storage.sanbanfu2) return false; + sanbanfu: { + trigger: { player: "shaBegin" }, + filter: function (event, player) { + if (player.storage.sanbanfu || player.storage.sanbanfu2) return false; return !event.directHit; }, - check:function(event,player){ - if(get.attitude(player,event.target)>=0) return false; - if(event.target.hasSkillTag('freeShan',false,{ - player:player, - card:event.card - },true)) return false; - if(event.target.hasSkillTag('respondShan')&&event.target.countCards('h')>=3) return false; + check: function (event, player) { + if (get.attitude(player, event.target) >= 0) return false; + if ( + event.target.hasSkillTag( + "freeShan", + false, + { + player: player, + card: event.card, + }, + true + ) + ) + return false; + if (event.target.hasSkillTag("respondShan") && event.target.countCards("h") >= 3) + return false; return true; }, - logTarget:'target', - content:function(){ - "step 0" - var next=trigger.target.chooseToRespond({name:'shan'}); - next.autochoose=lib.filter.autoRespondShan; - next.ai=function(card){ + logTarget: "target", + content: function () { + "step 0"; + var next = trigger.target.chooseToRespond({ name: "shan" }); + next.autochoose = lib.filter.autoRespondShan; + next.ai = function (card) { return get.unuseful2(card); }; - player.storage.sanbanfu=false; - player.storage.sanbanfu2=false; - "step 1" - if(result.bool==false){ + player.storage.sanbanfu = false; + player.storage.sanbanfu2 = false; + ("step 1"); + if (result.bool == false) { trigger.untrigger(); - trigger.directHit=true; - player.storage.sanbanfu2=true; - } - else{ - player.storage.sanbanfu=true; + trigger.directHit = true; + player.storage.sanbanfu2 = true; + } else { + player.storage.sanbanfu = true; } }, - group:['sanbanfu2','sanbanfu3'] + group: ["sanbanfu2", "sanbanfu3"], }, - sanbanfu2:{ - trigger:{player:'shaAfter'}, - silent:true, - content:function(){ - if(player.storage.sanbanfu) player.damage(trigger.target); + sanbanfu2: { + trigger: { player: "shaAfter" }, + silent: true, + content: function () { + if (player.storage.sanbanfu) player.damage(trigger.target); delete player.storage.sanbanfu; delete player.storage.sanbanfu2; - } - }, - sanbanfu3:{ - trigger:{source:'damageBegin'}, - silent:true, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.storage.sanbanfu2; }, - content:function(){ - trigger.num++; - } }, - bingsheng:{ - enable:'phaseUse', - usable:1, - filterCard:function(card){ - if(ui.selected.cards.length){ - return get.suit(card)!=get.suit(ui.selected.cards[0]); + sanbanfu3: { + trigger: { source: "damageBegin" }, + silent: true, + filter: function (event, player) { + return event.card && event.card.name == "sha" && player.storage.sanbanfu2; + }, + content: function () { + trigger.num++; + }, + }, + bingsheng: { + enable: "phaseUse", + usable: 1, + filterCard: function (card) { + if (ui.selected.cards.length) { + return get.suit(card) != get.suit(ui.selected.cards[0]); } return true; }, - complexCard:true, - selectCard:2, - check:function(card){ - return 8-get.value(card); + complexCard: true, + selectCard: 2, + check: function (card) { + return 8 - get.value(card); }, - filterTarget:function(card,player,target){ - if(target.hp==Infinity) return false; - if(target.hp>player.hp) return true; - if(target.hp player.hp) return true; + if (target.hp < player.hp && target.hp < target.maxHp) return true; return false; }, - content:function(){ - var num=target.hp-player.hp; - if(num>2){ - num=2; + content: function () { + var num = target.hp - player.hp; + if (num > 2) { + num = 2; } - if(num<-2){ - num=-2; + if (num < -2) { + num = -2; } - if(num>0){ + if (num > 0) { target.damage(num); - } - else if(num<0&&target.hptarget.maxHp){ - num=player.hp-target.maxHp; + if (player.hp > target.maxHp) { + num = player.hp - target.maxHp; + } else { + num = player.hp - target.hp; } - else{ - num=player.hp-target.hp; - } - if(target.hp==1&&num){ - return num+1; + if (target.hp == 1 && num) { + return num + 1; } return num; - } - } - } - }, - taolue:{ - mod:{ - maxHandcard:function(player,num){ - return num+1; - } + }, + }, }, }, - shentan:{ - enable:'phaseUse', - usable:1, - filterCard:true, - filterTarget:function(card,player,target){ - return target.countCards('h')>0&&get.distance(player,target)<=2; + taolue: { + mod: { + maxHandcard: function (player, num) { + return num + 1; + }, }, - check:function(card){ - return 7-get.value(card); + }, + shentan: { + enable: "phaseUse", + usable: 1, + filterCard: true, + filterTarget: function (card, player, target) { + return target.countCards("h") > 0 && get.distance(player, target) <= 2; }, - position:'he', - content:function(){ - "step 0" - var hs=target.getCards('h'); - if(hs.length){ - event.card=hs.randomGet(); - player.gain(event.card,target); - target.$giveAuto(event.card,player); - } - else{ + check: function (card) { + return 7 - get.value(card); + }, + position: "he", + content: function () { + "step 0"; + var hs = target.getCards("h"); + if (hs.length) { + event.card = hs.randomGet(); + player.gain(event.card, target); + target.$giveAuto(event.card, player); + } else { event.finish(); } - "step 1" - var source=target; - player.chooseTarget('选择一个目标送出'+get.translation(event.card),function(card,player,target){ - return target!=player; - }).ai=function(target){ - var att=get.attitude(player,target); - if(att>3&&player.countCards('h')>target.countCards('h')){ + ("step 1"); + var source = target; + player.chooseTarget( + "选择一个目标送出" + get.translation(event.card), + function (card, player, target) { + return target != player; + } + ).ai = function (target) { + var att = get.attitude(player, target); + if (att > 3 && player.countCards("h") > target.countCards("h")) { return att; } return 0; - } - "step 2" - if(result.bool){ - result.targets[0].gain(card,player); - player.$give(1,result.targets[0]); - player.line(result.targets,'green'); + }; + ("step 2"); + if (result.bool) { + result.targets[0].gain(card, player); + player.$give(1, result.targets[0]); + player.line(result.targets, "green"); game.delay(); } }, - ai:{ - order:9, - result:{ - target:-1, - player:function(player,target){ - if(get.attitude(player,target)>0){ + ai: { + order: 9, + result: { + target: -1, + player: function (player, target) { + if (get.attitude(player, target) > 0) { return 0; } return 1; - } + }, }, }, }, - hanqiang:{ - mod:{ - attackFrom:function(from,to,distance){ - if(!from.getEquip(1)) return distance-1 - } - } + hanqiang: { + mod: { + attackFrom: function (from, to, distance) { + if (!from.getEquip(1)) return distance - 1; + }, + }, }, - biaoqi:{ - trigger:{player:'shaBegin'}, - forced:true, - content:function(){ - var range=player.getAttackRange(); - if(range>trigger.target.hp){ - trigger.directHit=true; - } - else if(range trigger.target.hp) { + trigger.directHit = true; + } else if (range < trigger.target.hp) { player.draw(); } - } + }, }, - wluoyan:{ - trigger:{player:'damageBefore'}, - forced:true, - content:function(){ + wluoyan: { + trigger: { player: "damageBefore" }, + forced: true, + content: function () { trigger.cancel(); player.loseHp(); }, - ai:{ - noDirectDamage:true, - } + ai: { + noDirectDamage: true, + }, }, - heqin:{ - skillAnimation:true, - enable:'phaseUse', - filter:function(event,player){ + heqin: { + skillAnimation: true, + enable: "phaseUse", + filter: function (event, player) { return !player.storage.heqin; }, - filterTarget:function(card,player,target){ - return target.sex=='male'&&target!=player; + filterTarget: function (card, player, target) { + return target.sex == "male" && target != player; }, - content:function(){ - player.awakenSkill('heqin'); - player.addSkill('heqin2'); - target.addSkill('heqin2'); + content: function () { + player.awakenSkill("heqin"); + player.addSkill("heqin2"); + target.addSkill("heqin2"); - target.marks.heqin=target.markCharacter(player,{ - name:'和亲', - content:'摸牌阶段摸牌数+1' + target.marks.heqin = target.markCharacter(player, { + name: "和亲", + content: "摸牌阶段摸牌数+1", }); - game.addVideo('markCharacter',target,{ - name:'放权', - content:'摸牌阶段摸牌数+1', - id:'heqin', - target:player.dataset.position + game.addVideo("markCharacter", target, { + name: "放权", + content: "摸牌阶段摸牌数+1", + id: "heqin", + target: player.dataset.position, }); - player.storage.heqin=target; - target.storage.heqin=player; + player.storage.heqin = target; + target.storage.heqin = player; - player.marks.heqin=player.markCharacter(target,{ - name:'和亲', - content:'摸牌阶段摸牌数+1' + player.marks.heqin = player.markCharacter(target, { + name: "和亲", + content: "摸牌阶段摸牌数+1", }); - game.addVideo('markCharacter',player,{ - name:'放权', - content:'摸牌阶段摸牌数+1', - id:'heqin', - target:target.dataset.position + game.addVideo("markCharacter", player, { + name: "放权", + content: "摸牌阶段摸牌数+1", + id: "heqin", + target: target.dataset.position, }); }, - ai:{ - order:1, - result:{ - target:1 - } - } + ai: { + order: 1, + result: { + target: 1, + }, + }, }, - heqin2:{ - trigger:{player:'phaseDrawBegin'}, - forced:true, - content:function(){ + heqin2: { + trigger: { player: "phaseDrawBegin" }, + forced: true, + content: function () { trigger.num++; }, - group:'heqin3' + group: "heqin3", }, - heqin3:{ - trigger:{player:'dieBegin'}, - forced:true, - popup:false, - content:function(){ - player.removeSkill('heqin2'); - player.unmarkSkill('heqin'); - if(player.storage.heqin){ - player.storage.heqin.removeSkill('heqin2'); - player.storage.heqin.unmarkSkill('heqin'); + heqin3: { + trigger: { player: "dieBegin" }, + forced: true, + popup: false, + content: function () { + player.removeSkill("heqin2"); + player.unmarkSkill("heqin"); + if (player.storage.heqin) { + player.storage.heqin.removeSkill("heqin2"); + player.storage.heqin.unmarkSkill("heqin"); } - } + }, }, - chajue:{ - trigger:{player:'damageEnd'}, - forced:true, - filter:function(event,player){ - return _status.currentPhase!=player; + chajue: { + trigger: { player: "damageEnd" }, + forced: true, + filter: function (event, player) { + return _status.currentPhase != player; + }, + content: function () { + player.addTempSkill("chajue2", { player: "phaseBegin" }); }, - content:function(){ - player.addTempSkill('chajue2',{player:'phaseBegin'}); - } }, - chajue2:{ - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - mark:true, - intro:{ - content:'杀或普通锦囊牌对你无效' + chajue2: { + trigger: { target: "useCardToBefore" }, + forced: true, + priority: 15, + mark: true, + intro: { + content: "杀或普通锦囊牌对你无效", }, - filter:function(event,player){ - return get.type(event.card)=='trick'||event.card.name=='sha'; + filter: function (event, player) { + return get.type(event.card) == "trick" || event.card.name == "sha"; }, - content:function(){ - game.log(player,'发动了察觉,',trigger.card,'对',trigger.target,'失效') + content: function () { + game.log(player, "发动了察觉,", trigger.card, "对", trigger.target, "失效"); trigger.cancel(); }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='trick'||card.name=='sha') return 'zeroplayertarget'; - } - } - } - }, - tiewan:{ - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return get.type(event.card.viewAs||event.card.name)=='delay'&&event.player!=player; - }, - direct:true, - content:function(){ - 'step 0' - player.chooseCardTarget({ - prompt:get.prompt('tiewan'), - filterCard:{color:'red'}, - position:'he', - filterTarget:function(card,player,target){ - return player.canUse({name:'lebu'},target); + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "trick" || card.name == "sha") return "zeroplayertarget"; }, - ai1:function(card){ - return 7-get.value(card); - }, - ai2:function(target){ - return get.effect(target,{name:'lebu'},player,player); - } - }); - 'step 1' - if(result.bool){ - player.logSkill('tiewan'); - player.useCard({name:'lebu'},result.cards,result.targets); - } - }, - ai:{ - threaten:1.5 - } - }, - qianglue:{ - trigger:{player:'shaMiss'}, - priority:-1, - filter:function(event){ - return event.target.countCards('he')>0; - }, - check:function(event,player){ - return get.attitude(player,event.target)<0; - }, - content:function(){ - 'step 0' - player.judge(function(card){ - return get.color(card)=='black'?1:-1; - }); - 'step 1' - if(result.bool){ - player.gainPlayerCard('he',trigger.target); - } - } - }, - jimin:{ - enable:['chooseToRespond','chooseToUse'], - filterCard:true, - viewAs:{name:'shan'}, - viewAsFilter:function(player){ - if(!player.countCards('h')) return false; - if(player.countCards('e')) return false; - }, - prompt:'将一张手牌当闪使用或打出', - check:function(){return 1}, - ai:{ - respondShan:true, - skillTagFilter:function(player){ - if(!player.countCards('h')) return false; - if(player.countCards('e')) return false; }, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0&&!target.countCards('e')) return 0.6 - } - } - } + }, }, - xiadao:{ - trigger:{source:'damageEnd'}, - direct:true, - filter:function(event,player){ - if(event._notrigger.includes(event.player)) return false; - if(event.player.isDead()) return false; - var nh=event.player.countCards('h'); - if(nh==0) return false; - var players=game.filterPlayer(); - for(var i=0;i 0; + }, + check: function (event, player) { + return get.attitude(player, event.target) < 0; + }, + content: function () { + "step 0"; + player.judge(function (card) { + return get.color(card) == "black" ? 1 : -1; + }); + ("step 1"); + if (result.bool) { + player.gainPlayerCard("he", trigger.target); + } + }, + }, + jimin: { + enable: ["chooseToRespond", "chooseToUse"], + filterCard: true, + viewAs: { name: "shan" }, + viewAsFilter: function (player) { + if (!player.countCards("h")) return false; + if (player.countCards("e")) return false; + }, + prompt: "将一张手牌当闪使用或打出", + check: function () { + return 1; + }, + ai: { + respondShan: true, + skillTagFilter: function (player) { + if (!player.countCards("h")) return false; + if (player.countCards("e")) return false; + }, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "respondShan") && current < 0 && !target.countCards("e")) + return 0.6; + }, + }, + }, + }, + xiadao: { + trigger: { source: "damageEnd" }, + direct: true, + filter: function (event, player) { + if (event._notrigger.includes(event.player)) return false; + if (event.player.isDead()) return false; + var nh = event.player.countCards("h"); + if (nh == 0) return false; + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if ( + players[i] != player && + players[i] != event.player && + players[i].countCards("h") <= nh + ) { return true; } } return false; }, - content:function(){ - 'step 0' - var nh=trigger.player.countCards('h'); - var att=get.attitude(player,trigger.player); - player.chooseTarget(get.prompt('xiadao'),function(card,player,target){ - return target!=player&&target!=trigger.player&&target.countCards('h')<=nh; - }).ai=function(target){ - if(att>0) return 0; - return get.attitude(player,target); - } - 'step 1' - if(result.bool){ - player.logSkill('xiadao'); - player.line2([trigger.player,result.targets[0]],'green'); - event.target=result.targets[0]; + content: function () { + "step 0"; + var nh = trigger.player.countCards("h"); + var att = get.attitude(player, trigger.player); + player.chooseTarget(get.prompt("xiadao"), function (card, player, target) { + return target != player && target != trigger.player && target.countCards("h") <= nh; + }).ai = function (target) { + if (att > 0) return 0; + return get.attitude(player, target); + }; + ("step 1"); + if (result.bool) { + player.logSkill("xiadao"); + player.line2([trigger.player, result.targets[0]], "green"); + event.target = result.targets[0]; game.delay(); - } - else{ + } else { event.finish(); } - 'step 0' - if(event.target){ - var card=trigger.player.getCards('h').randomGet(); - event.target.gain(card,trigger.player); - trigger.player.$giveAuto(card,event.target); + ("step 0"); + if (event.target) { + var card = trigger.player.getCards("h").randomGet(); + event.target.gain(card, trigger.player); + trigger.player.$giveAuto(card, event.target); } }, - ai:{ - expose:0.2, - threaten:1.4 - } + ai: { + expose: 0.2, + threaten: 1.4, + }, }, - lzhangyi:{ - trigger:{player:'discardAfter'}, - filter:function(event,player){ - for(var i=0;i2){ - du=0; + if (du == -1 && trigger.cards.length > 2) { + du = 0; } } - player.chooseTarget(get.prompt('lzhangyi'),function(card,player,target){ - return player!=target - }).set('du',du).ai=function(target){ - var att=get.attitude(_status.event.player,target); - return att*_status.event.du; + player + .chooseTarget(get.prompt("lzhangyi"), function (card, player, target) { + return player != target; + }) + .set("du", du).ai = function (target) { + var att = get.attitude(_status.event.player, target); + return att * _status.event.du; }; - "step 2" - if(result.bool){ - var target=result.targets[0]; - player.logSkill('lzhangyi',target); - var cards=[]; - for(var i=0;i0) return 0; - return 7-get.value(card); + ai1: function (card) { + if ( + player.additionalSkills.yizhuang && + player.additionalSkills.yizhuang.length > 0 + ) + return 0; + return 7 - get.value(card); + }, + ai2: function (target) { + if (target.isMin()) return 0; + return 6 - target.maxHp; }, - ai2:function(target){ - if(target.isMin()) return 0; - return 6-target.maxHp; - } }); - } - else{ + } else { event.finish(); } - "step 1" - if(result.bool){ - player.unmark(player.storage.yizhuang+'_charactermark'); + ("step 1"); + if (result.bool) { + player.unmark(player.storage.yizhuang + "_charactermark"); player.discard(result.cards); - player.logSkill('yizhuang',result.targets); - var name=result.targets[0].name; - if(name.indexOf('unknown')==0){ - name=result.targets[0].name2; + player.logSkill("yizhuang", result.targets); + var name = result.targets[0].name; + if (name.indexOf("unknown") == 0) { + name = result.targets[0].name2; } - var list=[]; - var skills=lib.character[name][3]; - for(var j=0;j0; + ai: { + threaten: 1.5, }, - content:function(){ - player.unmark(player.storage.yizhuang+'_charactermark'); - player.removeAdditionalSkill('yizhuang'); + }, + yizhuang2: { + trigger: { player: "damageAfter" }, + priority: -15, + forced: true, + filter: function (event, player) { + return player.additionalSkills.yizhuang && player.additionalSkills.yizhuang.length > 0; + }, + content: function () { + player.unmark(player.storage.yizhuang + "_charactermark"); + player.removeAdditionalSkill("yizhuang"); delete player.storage.yizhuang; player.checkMarks(); - } + }, }, - kongju:{ - mod:{ - maxHandcard:function(player,num){ - if(player.hp target.maxHp) { + if (card.name == "lebu") return false; } - else if(target.countCards('h')>target.maxHp){ - if(card.name=='lebu') return false; - } - } + }, }, }, - tuqiang:{ - trigger:{player:['respond','useCard']}, - filter:function(event,player){ - return event.card&&event.card.name=='shan'; + tuqiang: { + trigger: { player: ["respond", "useCard"] }, + filter: function (event, player) { + return event.card && event.card.name == "shan"; }, - frequent:true, - content:function(){ + frequent: true, + content: function () { player.draw(); }, - ai:{ - mingzhi:false, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'respondShan')){ + ai: { + mingzhi: false, + effect: { + target: function (card, player, target) { + if (get.tag(card, "respondShan")) { return 0.8; } - } + }, }, - } - }, - xumou:{ - inherit:'jushou' - }, - zhensha:{ - trigger:{global:'dying'}, - priority:9, - filter:function(event,player){ - return event.player.hp<=0&&(player.countCards('h','jiu')>0||player.countCards('h',{color:'black'})>=2)&&player!=event.player; }, - direct:true, - content:function(){ - 'step 0' - var goon=(get.attitude(player,trigger.player)<0); - var next=player.chooseToDiscard('鸠杀:是否弃置一张酒或两张黑色手牌令'+get.translation(trigger.player)+'立即死亡?'); - next.ai=function(card){ - if(ui.selected.cards.length){ - if(ui.selected.cards[0].name=='jiu') return 0; + }, + xumou: { + inherit: "jushou", + }, + zhensha: { + trigger: { global: "dying" }, + priority: 9, + filter: function (event, player) { + return ( + event.player.hp <= 0 && + (player.countCards("h", "jiu") > 0 || + player.countCards("h", { color: "black" }) >= 2) && + player != event.player + ); + }, + direct: true, + content: function () { + "step 0"; + var goon = get.attitude(player, trigger.player) < 0; + var next = player.chooseToDiscard( + "鸠杀:是否弃置一张酒或两张黑色手牌令" + + get.translation(trigger.player) + + "立即死亡?" + ); + next.ai = function (card) { + if (ui.selected.cards.length) { + if (ui.selected.cards[0].name == "jiu") return 0; } - if(goon){ - if(card.name=='jiu') return 2; + if (goon) { + if (card.name == "jiu") return 2; return 1; } return 0; }; - next.filterCard=function(card){ - if(ui.selected.cards.length){ - return get.color(card)=='black'; + next.filterCard = function (card) { + if (ui.selected.cards.length) { + return get.color(card) == "black"; } - return get.color(card)=='black'||card.name=='jiu'; + return get.color(card) == "black" || card.name == "jiu"; }; - next.complexCard=true, - next.logSkill=['zhensha',trigger.player]; - next.selectCard=function(){ - if(ui.selected.cards.length){ - if(get.color(ui.selected.cards[0])!='black') return [1,1]; + (next.complexCard = true), (next.logSkill = ["zhensha", trigger.player]); + next.selectCard = function () { + if (ui.selected.cards.length) { + if (get.color(ui.selected.cards[0]) != "black") return [1, 1]; } - return [1,2]; - } - 'step 1' - if(result.bool){ + return [1, 2]; + }; + ("step 1"); + if (result.bool) { trigger.player.die(); - } - else{ + } else { event.finish(); } - 'step 2' - if(!trigger.player.isAlive()){ + ("step 2"); + if (!trigger.player.isAlive()) { trigger.cancel(true); } }, - ai:{ - threaten:1.5 - } + ai: { + threaten: 1.5, + }, }, - ducai:{ - enable:'phaseUse', - usable:1, - unique:true, - forceunique:true, - check:function(card){ - if(_status.event.player.countCards('h')>=3){ - return 5-get.value(card); + ducai: { + enable: "phaseUse", + usable: 1, + unique: true, + forceunique: true, + check: function (card) { + if (_status.event.player.countCards("h") >= 3) { + return 5 - get.value(card); } return 0; }, - position:'he', - filterCard:true, - content:function(){ - player.storage.ducai2=cards[0]; - player.addTempSkill('ducai2',{player:'phaseBegin'}); + position: "he", + filterCard: true, + content: function () { + player.storage.ducai2 = cards[0]; + player.addTempSkill("ducai2", { player: "phaseBegin" }); }, - ai:{ - order:8, - result:{ - player:1 - } + ai: { + order: 8, + result: { + player: 1, + }, }, - global:'ducai3' + global: "ducai3", }, - ducai2:{ - mark:'card', - intro:{ - content:'card' - } - }, - ducai3:{ - mod:{ - cardEnabled:function(card,player){ - if(player.hasSkill('ducai2')) return; - var suit,players=game.filterPlayer(); - for(var i=0;i=3; + fanpu: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.storage.tongling >= 3; }, - filterTarget:function(card,player,target){ - return player.canUse('sha',target); + filterTarget: function (card, player, target) { + return player.canUse("sha", target); }, - selectTarget:[1,3], - multitarget:true, - multiline:true, - content:function(){ - player.storage.tongling-=3; - player.unmarkSkill('tongling'); - player.syncStorage('tongling'); - player.useCard({name:'sha'},targets,false); + selectTarget: [1, 3], + multitarget: true, + multiline: true, + content: function () { + player.storage.tongling -= 3; + player.unmarkSkill("tongling"); + player.syncStorage("tongling"); + player.useCard({ name: "sha" }, targets, false); + }, + ai: { + combo: "tongling", + order: 2, }, - ai:{ - combo:'tongling', - order:2 - } }, - fanpu_old:{ - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return player.storage.tongling>=3; + fanpu_old: { + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.storage.tongling >= 3; }, - promptfunc:function(){ - return '令自己在本轮内不能成为出杀的目标(选择自己),或对攻击范围内的至多两名角色使用一张杀' + promptfunc: function () { + return "令自己在本轮内不能成为出杀的目标(选择自己),或对攻击范围内的至多两名角色使用一张杀"; }, - filterTarget:function(card,player,target){ - return player==target||get.distance(player,target,'attack')<=1; + filterTarget: function (card, player, target) { + return player == target || get.distance(player, target, "attack") <= 1; }, - content:function(){ - if(target==player){ - target.addTempSkill('fanpu_disable',{player:'phaseBegin'}); - } - else{ + content: function () { + if (target == player) { + target.addTempSkill("fanpu_disable", { player: "phaseBegin" }); + } else { target.damage(); } - player.storage.tongling-=3; - player.unmarkSkill('tongling'); - player.syncStorage('tongling'); + player.storage.tongling -= 3; + player.unmarkSkill("tongling"); + player.syncStorage("tongling"); }, - subSkill:{ - disable:{ - mark:true, - intro:{ - content:'不能成为杀的目标' + subSkill: { + disable: { + mark: true, + intro: { + content: "不能成为杀的目标", }, - mod:{ - targetEnabled:function(card,player,target,now){ - if(card.name=='sha') return false; - } - } - } + mod: { + targetEnabled: function (card, player, target, now) { + if (card.name == "sha") return false; + }, + }, + }, }, - ai:{ - combo:'tongling', - order:2, - result:{ - target:function(player,target){ - if(player==target){ - if(player.hp<=2&&!player.countCards('h','shan')){ + ai: { + combo: "tongling", + order: 2, + result: { + target: function (player, target) { + if (player == target) { + if (player.hp <= 2 && !player.countCards("h", "shan")) { return 2; } return 0; + } else { + return get.damageEffect(target, player, target); } - else{ - return get.damageEffect(target,player,target); - } - } - } - } - }, - fenghuo:{ - enable:'chooseToUse', - filter:function(event,player){ - return player.countCards('e')>0; + }, + }, }, - filterCard:true, - position:'e', - viewAs:{name:'nanman'}, - prompt:'将一张装备区内的牌当南蛮入侵使用', - check:function(card){ - var player=_status.currentPhase; - if(player.countCards('he',{subtype:get.subtype(card)})>1){ - return 11-get.equipValue(card); - } - if(player.countCards('h') 0; + }, + filterCard: true, + position: "e", + viewAs: { name: "nanman" }, + prompt: "将一张装备区内的牌当南蛮入侵使用", + check: function (card) { + var player = _status.currentPhase; + if (player.countCards("he", { 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); + }, + ai: { + order: 9, + threaten: 1.1, + }, + }, + nichang: { + trigger: { player: "phaseDrawBefore" }, + check: function (event, player) { + if (player.skipList.includes("phaseUse")) return true; + var suits = ["spade", "heart", "diamond", "club"]; + var cards = player.getCards("h"); + for (var i = 0; i < cards.length; i++) { suits.remove(get.suit(cards[i])); } - return suits.length>=2; + return suits.length >= 2; }, - content:function(){ + content: function () { trigger.cancel(); - player.addSkill('nichang2'); - } + player.addSkill("nichang2"); + }, }, - nichang2:{ - trigger:{player:'phaseEnd'}, - forced:true, - content:function(){ - "step 0" - if(player.countCards('h')){ + nichang2: { + trigger: { player: "phaseEnd" }, + forced: true, + content: function () { + "step 0"; + if (player.countCards("h")) { player.showHandcards(); } - player.removeSkill('nichang2'); - "step 1" - var suits=['spade','heart','diamond','club']; - var cards=player.getCards('h'); - for(var i=0;i1){ - if(game.phaseNumber 1) { + if (game.phaseNumber < game.players.length) return 0; + for (var i = 0; i < players.length; i++) { + if (players[i].ai.shown == 0) return 0; + if (players[i].sex == "unknown") return 0; } } - var effect=0; - for(var i=0;i=3){ + if (get.suit(card) == suit || i >= 3) { break; } } - event.cards=cards; - event.suit=suit; + event.cards = cards; + event.suit = suit; player.showCards(cards); - } - else{ + } else { event.finish(); } - "step 2" - if(event.cards&&event.cards.length){ - if(get.suit(event.cards[event.cards.length-1])==event.suit){ + ("step 2"); + if (event.cards && event.cards.length) { + if (get.suit(event.cards[event.cards.length - 1]) == event.suit) { event.cards.pop().discard(); } - if(event.cards.length){ - player.gain(event.cards,'draw2'); + if (event.cards.length) { + player.gain(event.cards, "draw2"); } } }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(target.hp>=4) return [1,2]; - if(target.hp==3) return [1,1.5]; - if(target.hp==2) return [1,0.5]; + ai: { + maixie: true, + maixie_hp: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; + if (!target.hasFriend()) return; + if (target.hp >= 4) return [1, 2]; + if (target.hp == 3) return [1, 1.5]; + if (target.hp == 2) return [1, 0.5]; } - } - } - } - }, - bolehuiyan:{ - trigger:{global:'shaBegin'}, - direct:true, - priority:11, - filter:function(event,player){ - if(player.hasSkill('bolehuiyan4')) return false; - if(event.target.isUnderControl()) return false; - return event.player!=player&&event.target!=player&&event.target.countCards('h')>0; + }, + }, }, - group:['bolehuiyan2','bolehuiyan3'], - content:function(){ - "step 0" - if(event.isMine()){ - event.dialog=ui.create.dialog('慧眼:预言'+get.translation(trigger.player)+'对'+get.translation(trigger.target)+'的杀能否命中'); + }, + bolehuiyan: { + trigger: { global: "shaBegin" }, + direct: true, + priority: 11, + filter: function (event, player) { + if (player.hasSkill("bolehuiyan4")) return false; + if (event.target.isUnderControl()) return false; + return ( + event.player != player && event.target != player && event.target.countCards("h") > 0 + ); + }, + group: ["bolehuiyan2", "bolehuiyan3"], + content: function () { + "step 0"; + if (event.isMine()) { + event.dialog = ui.create.dialog( + "慧眼:预言" + + get.translation(trigger.player) + + "对" + + get.translation(trigger.target) + + "的杀能否命中" + ); } - player.chooseControl('能命中','不能命中','cancel').ai=function(event){ - if(trigger.player.hasSkill('wushuang')) return 0; - if(trigger.player.hasSkill('liegong')) return 0; - if(trigger.player.hasSkill('tieji')) return 0; - if(trigger.player.hasSkill('juji')) return 0; - if(trigger.player.hasSkill('retieji')) return 0; - if(trigger.player.hasSkill('roulin')&&trigger.target.sex=='female') return 0; - if(trigger.player.hasSkill('nvquan')&&trigger.target.sex=='male') return 0; - if(trigger.target.hasSkill('yijue2')) return 0; - if(trigger.target.hasSkill('shejie2')) return 0; - if(trigger.target.hasSkill('shanguang2')) return 0; + player.chooseControl("能命中", "不能命中", "cancel").ai = function (event) { + if (trigger.player.hasSkill("wushuang")) return 0; + if (trigger.player.hasSkill("liegong")) return 0; + if (trigger.player.hasSkill("tieji")) return 0; + if (trigger.player.hasSkill("juji")) return 0; + if (trigger.player.hasSkill("retieji")) return 0; + if (trigger.player.hasSkill("roulin") && trigger.target.sex == "female") return 0; + if (trigger.player.hasSkill("nvquan") && trigger.target.sex == "male") return 0; + if (trigger.target.hasSkill("yijue2")) return 0; + if (trigger.target.hasSkill("shejie2")) return 0; + if (trigger.target.hasSkill("shanguang2")) return 0; - var equip=trigger.target.getEquip(2); - if(equip&&(equip.name=='bagua'||equip.name=='rewrite_bagua')) return 1; - return trigger.target.countCards('h')<2?0:1; + var equip = trigger.target.getEquip(2); + if (equip && (equip.name == "bagua" || equip.name == "rewrite_bagua")) return 1; + return trigger.target.countCards("h") < 2 ? 0 : 1; }; - "step 1" - if(event.dialog){ + ("step 1"); + if (event.dialog) { event.dialog.close(); } - if(result.control!='cancel'){ - player.addTempSkill('bolehuiyan4'); - player.logSkill(['bolehuiyan',result.control],trigger.target); - game.log(player,'预言'+result.control); - player.storage.bolehuiyan=result.control; + if (result.control != "cancel") { + player.addTempSkill("bolehuiyan4"); + player.logSkill(["bolehuiyan", result.control], trigger.target); + game.log(player, "预言" + result.control); + player.storage.bolehuiyan = result.control; game.delay(); } }, - ai:{ - threaten:1.3 - } - }, - bolehuiyan2:{ - trigger:{global:'shaEnd'}, - forced:true, - popup:false, - filter:function(event,player){ - return player.storage.bolehuiyan?true:false; + ai: { + threaten: 1.3, }, - content:function(){ - if(player.storage.bolehuiyan=='不能命中'){ - player.popup('预言成功'); + }, + bolehuiyan2: { + trigger: { global: "shaEnd" }, + forced: true, + popup: false, + filter: function (event, player) { + return player.storage.bolehuiyan ? true : false; + }, + content: function () { + if (player.storage.bolehuiyan == "不能命中") { + player.popup("预言成功"); player.draw(); - } - else{ - player.popup('预言失败'); - player.chooseToDiscard('预言失败,请弃置一张牌','he',true); + } else { + player.popup("预言失败"); + player.chooseToDiscard("预言失败,请弃置一张牌", "he", true); } delete player.storage.bolehuiyan; - } - }, - bolehuiyan3:{ - trigger:{global:'shaDamage'}, - forced:true, - popup:false, - filter:function(event,player){ - return player.storage.bolehuiyan?true:false; }, - content:function(){ - if(player.storage.bolehuiyan=='能命中'){ - player.popup('预言成功'); + }, + bolehuiyan3: { + trigger: { global: "shaDamage" }, + forced: true, + popup: false, + filter: function (event, player) { + return player.storage.bolehuiyan ? true : false; + }, + content: function () { + if (player.storage.bolehuiyan == "能命中") { + player.popup("预言成功"); player.draw(); - } - else{ - player.popup('预言失败'); - player.chooseToDiscard('预言失败,请弃置一张牌','he',true); + } else { + player.popup("预言失败"); + player.chooseToDiscard("预言失败,请弃置一张牌", "he", true); } delete player.storage.bolehuiyan; - } - }, - bolehuiyan4:{}, - oldbolehuiyan:{ - trigger:{global:'judgeBegin'}, - direct:true, - priority:11, - filter:function(event,player){ - return event.player!=player; }, - content:function(){ - "step 0" - if(event.isMine()){ - event.dialog=ui.create.dialog('慧眼:预言'+get.translation(trigger.player)+'的'+trigger.judgestr+'判定'); + }, + bolehuiyan4: {}, + oldbolehuiyan: { + trigger: { global: "judgeBegin" }, + direct: true, + priority: 11, + filter: function (event, player) { + return event.player != player; + }, + content: function () { + "step 0"; + if (event.isMine()) { + event.dialog = ui.create.dialog( + "慧眼:预言" + get.translation(trigger.player) + "的" + trigger.judgestr + "判定" + ); } - player.chooseControl('heart2','diamond2','club2','spade2','cancel').ai=function(event){ - switch(Math.floor(Math.random()*4)){ - case 0:return 'heart2'; - case 1:return 'diamond2'; - case 2:return 'club2'; - case 3:return 'spade2'; + player.chooseControl("heart2", "diamond2", "club2", "spade2", "cancel").ai = function ( + event + ) { + switch (Math.floor(Math.random() * 4)) { + case 0: + return "heart2"; + case 1: + return "diamond2"; + case 2: + return "club2"; + case 3: + return "spade2"; } }; - "step 1" - if(event.dialog){ + ("step 1"); + if (event.dialog) { event.dialog.close(); } - if(result.control!='cancel'){ - game.log(player,'预言判定结果为'+get.translation(result.control)); - player.storage.bolehuiyan=result.control.slice(0,result.control.length-1); + if (result.control != "cancel") { + game.log(player, "预言判定结果为" + get.translation(result.control)); + player.storage.bolehuiyan = result.control.slice(0, result.control.length - 1); player.popup(result.control); game.delay(); } }, - group:'bolehuiyan2' + group: "bolehuiyan2", }, - oldbolehuiyan2:{ - trigger:{global:'judgeEnd'}, - forced:true, - popup:false, - content:function(){ - if(player.storage.bolehuiyan==trigger.result.suit){ - game.log(player,'预言成功'); - player.popup('洗具'); + oldbolehuiyan2: { + trigger: { global: "judgeEnd" }, + forced: true, + popup: false, + content: function () { + if (player.storage.bolehuiyan == trigger.result.suit) { + game.log(player, "预言成功"); + player.popup("洗具"); player.draw(2); - } - else if(get.color({suit:player.storage.bolehuiyan})==trigger.result.color){ - player.popup('洗具'); + } else if (get.color({ suit: player.storage.bolehuiyan }) == trigger.result.color) { + player.popup("洗具"); player.draw(); } delete player.storage.bolehuiyan; - } + }, }, - xiangma:{ - inherit:'yicong' + xiangma: { + inherit: "yicong", }, - yxsweiyi:{ - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return (event.source&&event.source.countCards('he')); + yxsweiyi: { + trigger: { player: "damageEnd" }, + filter: function (event, player) { + return event.source && event.source.countCards("he"); }, - check:function(event,player){ - return get.attitude(player,event.source)<0; + check: function (event, player) { + return get.attitude(player, event.source) < 0; }, - content:function(){ - trigger.source.chooseToDiscard(2,'he',true); + content: function () { + trigger.source.chooseToDiscard(2, "he", true); }, - logTarget:'source', - ai:{ - maixie_defend:true, - expose:0.3, - result:{ - target:function(card,player,target){ - if(player.countCards('he')>1&&get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; - if(get.attitude(target,player)<0) return [1,0,0,-1.5]; + logTarget: "source", + ai: { + maixie_defend: true, + expose: 0.3, + result: { + target: function (card, player, target) { + if (player.countCards("he") > 1 && get.tag(card, "damage")) { + if (player.hasSkillTag("jueqing", false, target)) return [1, -1]; + if (get.attitude(target, player) < 0) return [1, 0, 0, -1.5]; } - } - } - } + }, + }, + }, }, - qiandu:{ - enable:'phaseUse', - usable:1, - changeSeat:true, - filterTarget:function(card,player,target){ - return player!=target&&player.next!=target; + qiandu: { + enable: "phaseUse", + usable: 1, + changeSeat: true, + filterTarget: function (card, player, target) { + return player != target && player.next != target; }, - filterCard:{color:'black'}, - check:function(card){ - return 4-get.value(card); + filterCard: { color: "black" }, + check: function (card) { + return 4 - get.value(card); }, - content:function(){ - game.swapSeat(player,target); + content: function () { + game.swapSeat(player, target); }, - ai:{ - order:5, - result:{ - player:function(player,target){ - var att=get.attitude(player,target); - if(target==player.previous&&att>0) return att; - if(target==player.next&&att<0) return -att; - var att2=get.attitude(player,player.next); - if(target==player.next.next&&att<0&&att2<0) return -att-att2; + ai: { + order: 5, + result: { + player: function (player, target) { + var att = get.attitude(player, target); + if (target == player.previous && att > 0) return att; + if (target == player.next && att < 0) return -att; + var att2 = get.attitude(player, player.next); + if (target == player.next.next && att < 0 && att2 < 0) return -att - att2; return 0; - } - } - } - }, - nvquan:{ - locked:true, - group:['nvquan1','nvquan2','nvquan3'], - }, - nvquan1:{ - trigger:{player:'shaBegin'}, - forced:true, - filter:function(event){ - return event.target.sex=='male'; + }, + }, }, - priority:-1, - content:function(){ - if(typeof trigger.shanRequired=='number'){ + }, + nvquan: { + locked: true, + group: ["nvquan1", "nvquan2", "nvquan3"], + }, + nvquan1: { + trigger: { player: "shaBegin" }, + forced: true, + filter: function (event) { + return event.target.sex == "male"; + }, + priority: -1, + content: function () { + if (typeof trigger.shanRequired == "number") { trigger.shanRequired++; + } else { + trigger.shanRequired = 2; } - else{ - trigger.shanRequired=2; - } - } - }, - nvquan2:{ - trigger:{player:'juedou',target:'juedou'}, - forced:true, - filter:function(event,player){ - return event.turn!=player&&event.turn.sex=='male'; }, - priority:-1, - content:function(){ - "step 0" - var next=trigger.turn.chooseToRespond({name:'sha'},'请打出一张杀响应决斗'); - next.set('prompt2','(共需打出2张杀)'); - next.autochoose=lib.filter.autoRespondSha; - next.ai=function(card){ - if(get.attitude(trigger.turn,player)<0&&trigger.turn.countCards('h','sha')>1){ + }, + nvquan2: { + trigger: { player: "juedou", target: "juedou" }, + forced: true, + filter: function (event, player) { + return event.turn != player && event.turn.sex == "male"; + }, + priority: -1, + content: function () { + "step 0"; + var next = trigger.turn.chooseToRespond({ name: "sha" }, "请打出一张杀响应决斗"); + next.set("prompt2", "(共需打出2张杀)"); + next.autochoose = lib.filter.autoRespondSha; + next.ai = function (card) { + if ( + get.attitude(trigger.turn, player) < 0 && + trigger.turn.countCards("h", "sha") > 1 + ) { return get.unuseful2(card); } return -1; }; - "step 1" - if(result.bool==false){ - trigger.directHit=true; + ("step 1"); + if (result.bool == false) { + trigger.directHit = true; } }, - ai:{ - result:{ - target:function(card,player,target){ - if(card.name=='juedou'&&target.countCards('h')>0) return [1,0,0,-1]; - } - } - } + ai: { + result: { + target: function (card, player, target) { + if (card.name == "juedou" && target.countCards("h") > 0) return [1, 0, 0, -1]; + }, + }, + }, }, - nvquan3:{ - mod:{ - targetEnabled:function(card,player,target){ - if(card.name=='juedou'&&player.sex=='male'){ + nvquan3: { + mod: { + targetEnabled: function (card, player, target) { + if (card.name == "juedou" && player.sex == "male") { return false; } - } - } - }, - feigong:{ - trigger:{global:'useCard'}, - priority:15, - filter:function(event,player){ - return event.card.name=='sha'&&event.player!=player&& - player.countCards('h','sha')>0&&event.targets.includes(player)==false; + }, }, - direct:true, - content:function(){ - "step 0" - var effect=0; - for(var i=0;i 0 && + event.targets.includes(player) == false + ); + }, + direct: true, + content: function () { + "step 0"; + var effect = 0; + for (var i = 0; i < trigger.targets.length; i++) { + effect += get.effect(trigger.targets[i], trigger.card, trigger.player, player); } - var str='弃置一张杀令'+get.translation(trigger.player); - if(trigger.targets&&trigger.targets.length){ - str+='对'+get.translation(trigger.targets); + var str = "弃置一张杀令" + get.translation(trigger.player); + if (trigger.targets && trigger.targets.length) { + str += "对" + get.translation(trigger.targets); } - str+='的'+get.translation(trigger.card)+'失效'; - var next=player.chooseToDiscard('h',{name:'sha'},get.prompt('feigong')); - next.prompt2=str; - next.ai=function(card){ - if(effect<0){ - return 9-get.value(card); + str += "的" + get.translation(trigger.card) + "失效"; + var next = player.chooseToDiscard("h", { name: "sha" }, get.prompt("feigong")); + next.prompt2 = str; + next.ai = function (card) { + if (effect < 0) { + return 9 - get.value(card); } return -1; - } - next.autodelay=true; - next.logSkill=['feigong',trigger.player]; - "step 1" - if(result.bool){ + }; + next.autodelay = true; + next.logSkill = ["feigong", trigger.player]; + ("step 1"); + if (result.bool) { trigger.cancel(); } }, - ai:{ - threaten:1.2, - expose:0.2 - } + ai: { + threaten: 1.2, + expose: 0.2, + }, }, - feiming:{ - trigger:{player:'damageEnd'}, - check:function(event,player){ - return get.attitude(player,event.source)<=0; + feiming: { + trigger: { player: "damageEnd" }, + check: function (event, player) { + return get.attitude(player, event.source) <= 0; }, - filter:function(event,player){ - return event.source&&event.source!=player; + filter: function (event, player) { + return event.source && event.source != player; }, - content:function(){ - "step 0" - trigger.source.chooseCard('交出一张红桃牌或失去1点体力',function(card){ - return get.suit(card)=='heart'; - }).ai=function(card){ - return 6-get.value(card); + content: function () { + "step 0"; + trigger.source.chooseCard("交出一张红桃牌或失去1点体力", function (card) { + return get.suit(card) == "heart"; + }).ai = function (card) { + return 6 - get.value(card); }; - "step 1" - if(result.bool){ - player.gain(result.cards[0],trigger.source); - trigger.source.$give(1,player); - } - else{ + ("step 1"); + if (result.bool) { + player.gain(result.cards[0], trigger.source); + trigger.source.$give(1, player); + } else { trigger.source.loseHp(); } }, - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')) return [1,0,0,-1]; - } - } - } + ai: { + maixie_defend: true, + effect: { + target: function (card, player, target) { + if (get.tag(card, "damage")) return [1, 0, 0, -1]; + }, + }, + }, }, - jianai:{ - trigger:{player:'recoverEnd'}, - check:function(event,player){ - if(event.parent.name=='taoyuan'&&event.parent.player==player){ + jianai: { + trigger: { player: "recoverEnd" }, + check: function (event, player) { + if (event.parent.name == "taoyuan" && event.parent.player == player) { return false; } - var num=0; - var eff,players=game.filterPlayer(); - for(var i=0;i2){ - eff+=0.5; + if (players[i].hp == 1 && players[i].maxHp > 2) { + eff += 0.5; } } - if(get.attitude(player,players[i])>0){ - num+=eff; - } - else if(get.attitude(player,players[i])<0){ - num-=eff; + if (get.attitude(player, players[i]) > 0) { + num += eff; + } else if (get.attitude(player, players[i]) < 0) { + num -= eff; } } - return num>0; + return num > 0; }, - content:function(){ - "step 0" - event.targets=game.filterPlayer(); + content: function () { + "step 0"; + event.targets = game.filterPlayer(); event.targets.remove(player); - "step 1" - if(event.targets.length){ + ("step 1"); + if (event.targets.length) { event.targets.shift().recover(); event.redo(); } }, - ai:{ - expose:0.1 - } - }, - jieyong:{ - trigger:{player:'useCardAfter'}, - direct:true, - filter:function(event,player){ - if(event.cards.filterInD().length==0) return false; - if(player.hasSkill('jieyong2')) return false; - return player.countCards('he',{color:'black'})>0; + ai: { + expose: 0.1, }, - content:function(){ - "step 0" - var next=player.chooseToDiscard('he','是否弃置一张黑色牌并收回'+get.translation(trigger.cards.filterInD())+'?',{color:'black'}); - next.ai=function(card){ - return get.value(trigger.card)-get.value(card); - } - next.logSkill='jieyong'; - "step 1" - if(result.bool){ - player.gain(trigger.cards.filterInD(),'gain2','log'); - player.addTempSkill('jieyong2',['phaseAfter','phaseBegin']); - } - }, - ai:{ - threaten:1.3 - } }, - jieyong2:{ - filterCard:{suit:'heart'}, - popname:true, - }, - jieyong3:{ - trigger:{player:'useCardBefore'}, - forced:true, - popup:false, - filter:function(event,player){ - return event.skill=='jieyong2'; + jieyong: { + trigger: { player: "useCardAfter" }, + direct: true, + filter: function (event, player) { + if (event.cards.filterInD().length == 0) return false; + if (player.hasSkill("jieyong2")) return false; + return player.countCards("he", { color: "black" }) > 0; }, - content:function(){ - player.popup(trigger.card.name); - player.getStat('skill').jieyong++; - } - }, - jieyong4:{}, - jieyong5:{}, - jieyong6:{}, - zhulu:{ - trigger:{global:'useCardAfter'}, - direct:true, - filter:function(event,player){ - return _status.currentPhase!=player&&event.player!=player&&get.type(event.card)=='trick'&& - event.cards.filterInD().length>0&&!player.hasSkill('zhulu2')&& - player.countCards('he',{suit:get.suit(event.card)})>0; - }, - content:function(){ - "step 0" - var val=get.value(trigger.card); - var suit=get.suit(trigger.card); - var next=player.chooseToDiscard('he','逐鹿:是否弃置一张'+get.translation(suit)+ - '牌并获得'+get.translation(trigger.cards.filterInD())+'?',{suit:suit}); - next.ai=function(card){ - return val-get.value(card); + content: function () { + "step 0"; + var next = player.chooseToDiscard( + "he", + "是否弃置一张黑色牌并收回" + get.translation(trigger.cards.filterInD()) + "?", + { color: "black" } + ); + next.ai = function (card) { + return get.value(trigger.card) - get.value(card); }; - next.logSkill='zhulu'; - "step 1" - if(result.bool){ - player.gain(trigger.cards.filterInD(),'log','gain2'); - player.addTempSkill('zhulu2'); + next.logSkill = "jieyong"; + ("step 1"); + if (result.bool) { + player.gain(trigger.cards.filterInD(), "gain2", "log"); + player.addTempSkill("jieyong2", ["phaseAfter", "phaseBegin"]); } }, - ai:{ - threaten:1.2 - } + ai: { + threaten: 1.3, + }, }, - zhulu2:{}, - xieling:{ - enable:'phaseUse', - usable:1, - filterCard:true, - selectCard:2, - check:function(card){ - return 7-get.value(card); + jieyong2: { + filterCard: { suit: "heart" }, + popname: true, + }, + jieyong3: { + trigger: { player: "useCardBefore" }, + forced: true, + popup: false, + filter: function (event, player) { + return event.skill == "jieyong2"; }, - multitarget:true, - targetprompt:['被移走','移动目标'], - filterTarget:function(card,player,target){ - if(ui.selected.targets.length){ - var from=ui.selected.targets[0]; - var judges=from.getCards('j'); - for(var i=0;i 0 && + !player.hasSkill("zhulu2") && + player.countCards("he", { suit: get.suit(event.card) }) > 0 + ); + }, + content: function () { + "step 0"; + var val = get.value(trigger.card); + var suit = get.suit(trigger.card); + var next = player.chooseToDiscard( + "he", + "逐鹿:是否弃置一张" + + get.translation(suit) + + "牌并获得" + + get.translation(trigger.cards.filterInD()) + + "?", + { suit: suit } + ); + next.ai = function (card) { + return val - get.value(card); + }; + next.logSkill = "zhulu"; + ("step 1"); + if (result.bool) { + player.gain(trigger.cards.filterInD(), "log", "gain2"); + player.addTempSkill("zhulu2"); + } + }, + ai: { + threaten: 1.2, + }, + }, + zhulu2: {}, + xieling: { + enable: "phaseUse", + usable: 1, + filterCard: true, + selectCard: 2, + check: function (card) { + return 7 - get.value(card); + }, + multitarget: true, + targetprompt: ["被移走", "移动目标"], + filterTarget: function (card, player, target) { + if (ui.selected.targets.length) { + var from = ui.selected.targets[0]; + var judges = from.getCards("j"); + for (var i = 0; i < judges.length; i++) { + if (!target.hasJudge(judges[i].viewAs || judges[i].name)) return true; } - if(target.isMin()) return false; - if((from.getEquip(1)&&!target.getEquip(1))|| - (from.getEquip(2)&&!target.getEquip(2))|| - (from.getEquip(3)&&!target.getEquip(3))|| - (from.getEquip(4)&&!target.getEquip(4))|| - (from.getEquip(5)&&!target.getEquip(5))) return true; + if (target.isMin()) return false; + if ( + (from.getEquip(1) && !target.getEquip(1)) || + (from.getEquip(2) && !target.getEquip(2)) || + (from.getEquip(3) && !target.getEquip(3)) || + (from.getEquip(4) && !target.getEquip(4)) || + (from.getEquip(5) && !target.getEquip(5)) + ) + return true; return false; - } - else{ - return target.countCards('ej')>0; + } else { + return target.countCards("ej") > 0; } }, - selectTarget:2, - content:function(){ - "step 0" - if(targets.length==2){ - player.choosePlayerCard('ej',function(button){ - if(get.attitude(player,targets[0])>get.attitude(player,targets[1])){ - return get.position(button.link)=='j'?10:0; - } - else{ - if(get.position(button.link)=='j') return -10; - return get.equipValue(button.link); - } - },targets[0]); - } - else{ + selectTarget: 2, + content: function () { + "step 0"; + if (targets.length == 2) { + player.choosePlayerCard( + "ej", + function (button) { + if (get.attitude(player, targets[0]) > get.attitude(player, targets[1])) { + return get.position(button.link) == "j" ? 10 : 0; + } else { + if (get.position(button.link) == "j") return -10; + return get.equipValue(button.link); + } + }, + targets[0] + ); + } else { event.finish(); } - "step 1" - if(result.bool){ - if(get.position(result.buttons[0].link)=='e'){ + ("step 1"); + if (result.bool) { + if (get.position(result.buttons[0].link) == "e") { event.targets[1].equip(result.buttons[0].link); - } - else if(result.buttons[0].link.viewAs){ - event.targets[1].addJudge({name:result.buttons[0].link.viewAs},[result.buttons[0].link]); - } - else{ + } else if (result.buttons[0].link.viewAs) { + event.targets[1].addJudge({ name: result.buttons[0].link.viewAs }, [ + result.buttons[0].link, + ]); + } else { event.targets[1].addJudge(result.buttons[0].link); } - event.targets[0].$give(result.buttons[0].link,event.targets[1]) + event.targets[0].$give(result.buttons[0].link, event.targets[1]); game.delay(); } }, - ai:{ - order:10, - result:{ - target:function(player,target){ - if(ui.selected.targets.length==0){ - if(target.countCards('j')&&get.attitude(player,target)>0) return 1; - if(get.attitude(player,target)<0){ - var players=game.filterPlayer(); - for(var i=0;i0){ - if((target.getEquip(1)&&!players[i].getEquip(1))|| - (target.getEquip(2)&&!players[i].getEquip(2))|| - (target.getEquip(3)&&!players[i].getEquip(3))|| - (target.getEquip(4)&&!players[i].getEquip(4))|| - (target.getEquip(5)&&!players[i].getEquip(5))) + ai: { + order: 10, + result: { + target: function (player, target) { + if (ui.selected.targets.length == 0) { + if (target.countCards("j") && get.attitude(player, target) > 0) return 1; + if (get.attitude(player, target) < 0) { + var players = game.filterPlayer(); + for (var i = 0; i < players.length; i++) { + if (get.attitude(player, players[i]) > 0) { + if ( + (target.getEquip(1) && !players[i].getEquip(1)) || + (target.getEquip(2) && !players[i].getEquip(2)) || + (target.getEquip(3) && !players[i].getEquip(3)) || + (target.getEquip(4) && !players[i].getEquip(4)) || + (target.getEquip(5) && !players[i].getEquip(5)) + ) return -1; } } } return 0; - } - else{ - return get.attitude(player,ui.selected.targets[0])>0?-1:1; + } else { + return get.attitude(player, ui.selected.targets[0]) > 0 ? -1 : 1; } }, }, - expose:0.2, - threaten:1.5 - } + expose: 0.2, + threaten: 1.5, + }, }, - qiangyun:{ - trigger:{player:'loseEnd'}, - frequent:true, - filter:function(event,player){ - if(player.countCards('h')) return false; - for(var i=0;i0; + ai: { + threaten: 1.2, }, - content:function(){ - 'step 0' - player.discardPlayerCard(target,true); - 'step 1' - if(result.bool){ - var type=get.type(result.cards[0]); - if(type!='basic'&&type!='trick'){ - player.chooseToDiscard('he',true); + }, + miaobix: { + filterCard: true, + selectCard: 1, + popname: true, + }, + miaobi: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target != player && target.countCards("he") > 0; + }, + content: function () { + "step 0"; + player.discardPlayerCard(target, true); + ("step 1"); + if (result.bool) { + var type = get.type(result.cards[0]); + if (type != "basic" && type != "trick") { + player.chooseToDiscard("he", true); event.finish(); + } else { + event.card = result.cards[0]; } - else{ - event.card=result.cards[0]; - } - } - else{ + } else { event.finish(); } - 'step 2' - var card=event.card; - card={name:card.name,nature:card.nature,suit:card.suit,number:card.number}; - if(lib.filter.cardEnabled(card)){ - if(game.hasPlayer(function(current){ - return player.canUse(card,current); - })){ - lib.skill.miaobix.viewAs=card; - var next=player.chooseToUse(); - next.logSkill='miaobi'; - next.set('openskilldialog','妙笔:将一张手牌当'+get.translation(card)+'使用'); - next.set('norestore',true); - next.set('_backupevent','miaobix'); - next.set('custom',{ - add:{}, - replace:{window:function(){}} + ("step 2"); + var card = event.card; + card = { name: card.name, nature: card.nature, suit: card.suit, number: card.number }; + if (lib.filter.cardEnabled(card)) { + if ( + game.hasPlayer(function (current) { + return player.canUse(card, current); + }) + ) { + lib.skill.miaobix.viewAs = card; + var next = player.chooseToUse(); + next.logSkill = "miaobi"; + next.set( + "openskilldialog", + "妙笔:将一张手牌当" + get.translation(card) + "使用" + ); + next.set("norestore", true); + next.set("_backupevent", "miaobix"); + next.set("custom", { + add: {}, + replace: { window: function () {} }, }); - next.backup('miaobix'); + next.backup("miaobix"); } } }, - ai:{ - order:9, - result:{ - target:-1 - } - } - }, - zhexian:{ - trigger:{player:'loseEnd'}, - usable:1, - filter:function(event,player){ - return _status.currentPhase!=player; + ai: { + order: 9, + result: { + target: -1, + }, }, - frequent:true, - content:function(){ + }, + zhexian: { + trigger: { player: "loseEnd" }, + usable: 1, + filter: function (event, player) { + return _status.currentPhase != player; + }, + frequent: true, + content: function () { player.draw(); - } - }, - guifu:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return player!=target&&target.countCards('e')>0; }, - content:function(){ - 'step 0' - player.discardPlayerCard(target,'e',true); - 'step 1' - game.asyncDraw([player,target]); - }, - ai:{ - order:8, - threaten:1.5, - result:{ - target:-1, - player:0.5 - } - } }, - lshengong:{ - enable:'phaseUse', - usable:1, - filterTarget:function(card,player,target){ - return target.hasCard(function(card){ + guifu: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return player != target && target.countCards("e") > 0; + }, + content: function () { + "step 0"; + player.discardPlayerCard(target, "e", true); + ("step 1"); + game.asyncDraw([player, target]); + }, + ai: { + order: 8, + threaten: 1.5, + result: { + target: -1, + player: 0.5, + }, + }, + }, + lshengong: { + enable: "phaseUse", + usable: 1, + filterTarget: function (card, player, target) { + return target.hasCard(function (card) { return !get.info(card).unique; - },'e'); + }, "e"); }, - check:function(card){ - return 6-get.value(card); + check: function (card) { + return 6 - get.value(card); }, - filterCard:function(card){ - var info=lib.card[card.name]; - if(!info) return false; - return !info.image&&!info.fullimage; + filterCard: function (card) { + var info = lib.card[card.name]; + if (!info) return false; + return !info.image && !info.fullimage; }, - discard:false, - lose:false, - content:function(){ - 'step 0' - var next=player.choosePlayerCard(target,'e',true); - next.ai=get.buttonValue; - next.filterButton=function(button){ + discard: false, + lose: false, + content: function () { + "step 0"; + var next = player.choosePlayerCard(target, "e", true); + next.ai = get.buttonValue; + next.filterButton = function (button) { return !get.info(button.link).unique; - } - 'step 1' - if(result.links[0]){ - cards[0].init([result.links[0].suit,result.links[0].number,result.links[0].name,result.links[0].nature]); - event.card=cards[0]; - player.chooseTarget('选择一个角色装备'+get.translation(result.links),function(card,player,target){ - return !target.isMin(); - }).ai=function(target){ - if(!target.countCards('e',{subtype:get.subtype(event.card)})){ - return get.attitude(player,target); + }; + ("step 1"); + if (result.links[0]) { + cards[0].init([ + result.links[0].suit, + result.links[0].number, + result.links[0].name, + result.links[0].nature, + ]); + event.card = cards[0]; + player.chooseTarget( + "选择一个角色装备" + get.translation(result.links), + function (card, player, target) { + return !target.isMin(); + } + ).ai = function (target) { + if (!target.countCards("e", { subtype: get.subtype(event.card) })) { + return get.attitude(player, target); } return 0; - } - } - else{ + }; + } else { event.finish(); } - 'step 2' - if(result.targets&&result.targets[0]&&event.card){ - player.$give(event.card,result.targets[0]); + ("step 2"); + if (result.targets && result.targets[0] && event.card) { + player.$give(event.card, result.targets[0]); game.delay(); - event.toequip=result.targets[0]; - } - else{ + event.toequip = result.targets[0]; + } else { event.finish(); } - 'step 3' - if(event.toequip){ + ("step 3"); + if (event.toequip) { event.toequip.equip(event.card); } }, - ai:{ - order:9, - threaten:1.5, - result:{ - player:function(player){ - if(player.countCards('e')<3) return 1; + ai: { + order: 9, + threaten: 1.5, + result: { + player: function (player) { + if (player.countCards("e") < 3) return 1; return 0; - } - } - } - } + }, + }, + }, + }, }, - translate:{ - yxs_guanyu:'关羽', - yxs_wuzetian:'武则天', - yxs_caocao:'曹操', - yxs_mozi:'墨子', - yxs_bole:'伯乐', - yxs_aijiyanhou:'埃及艳后', - yxs_diaochan:'貂蝉', - yxs_yangyuhuan:'杨玉环', - yxs_baosi:'褒姒', - yxs_napolun:'拿破仑', - yxs_kaisa:'凯撒', - yxs_zhuyuanzhang:'朱元璋', - yxs_jinke:'荆轲', - yxs_libai:'李白', - yxs_luban:'鲁班', - yxs_lvzhi:'吕雉', - yxs_goujian:'勾践', - yxs_lishimin:'李世民', - yxs_huamulan:'花木兰', - yxs_luobinhan:'罗宾汉', - yxs_chengjisihan:'成吉思汗', - yxs_mingchenghuanghou:'明成皇后', - yxs_wangzhaojun:'王昭君', - yxs_luocheng:'罗成', - yxs_direnjie:'狄仁杰', - yxs_sunwu:'孙武', - yxs_chengyaojin:'程咬金', - yxs_yujix:'虞姬', - yxs_xiangyu:'项羽', - yxs_yingzheng:'嬴政', - yxs_yuefei:'岳飞', - yxs_fuermosi:'福尔摩斯', - yxs_guiguzi:'鬼谷子', - yxs_xiaoqiao:'小乔', - yxs_luzhishen:'鲁智深', - yxs_handingdun:'汉丁顿伯爵', - yxs_zhaoyong:'赵雍', - yxs_yangguang:'杨广', - yxs_tangbohu:'唐伯虎', - yxs_zhangsanfeng:'张三丰', - yxs_nandinggeer:'南丁格尔', - yxs_weizhongxian:'魏忠贤', - yxs_lanlinwang:'兰陵王', - yxs_meixi:'妹喜', - yxs_qinqiong:"秦琼", + translate: { + yxs_guanyu: "关羽", + yxs_wuzetian: "武则天", + yxs_caocao: "曹操", + yxs_mozi: "墨子", + yxs_bole: "伯乐", + yxs_aijiyanhou: "埃及艳后", + yxs_diaochan: "貂蝉", + yxs_yangyuhuan: "杨玉环", + yxs_baosi: "褒姒", + yxs_napolun: "拿破仑", + yxs_kaisa: "凯撒", + yxs_zhuyuanzhang: "朱元璋", + yxs_jinke: "荆轲", + yxs_libai: "李白", + yxs_luban: "鲁班", + yxs_lvzhi: "吕雉", + yxs_goujian: "勾践", + yxs_lishimin: "李世民", + yxs_huamulan: "花木兰", + yxs_luobinhan: "罗宾汉", + yxs_chengjisihan: "成吉思汗", + yxs_mingchenghuanghou: "明成皇后", + yxs_wangzhaojun: "王昭君", + yxs_luocheng: "罗成", + yxs_direnjie: "狄仁杰", + yxs_sunwu: "孙武", + yxs_chengyaojin: "程咬金", + yxs_yujix: "虞姬", + yxs_xiangyu: "项羽", + yxs_yingzheng: "嬴政", + yxs_yuefei: "岳飞", + yxs_fuermosi: "福尔摩斯", + yxs_guiguzi: "鬼谷子", + yxs_xiaoqiao: "小乔", + yxs_luzhishen: "鲁智深", + yxs_handingdun: "汉丁顿伯爵", + yxs_zhaoyong: "赵雍", + yxs_yangguang: "杨广", + yxs_tangbohu: "唐伯虎", + yxs_zhangsanfeng: "张三丰", + yxs_nandinggeer: "南丁格尔", + yxs_weizhongxian: "魏忠贤", + yxs_lanlinwang: "兰陵王", + yxs_meixi: "妹喜", + yxs_qinqiong: "秦琼", - yxs_fanji:"反击", - yxs_fanji2:"反击", - yxs_fanji_info:"当你受到【杀】或【决斗】造成的伤害后,你可以对伤害来源使用一张【杀】。若此【杀】为红色,其不可闪避。", - yxs_menshen:"门神", - yxs_menshen2:"门神", - yxs_menshen3:"门神", - yxs_menshen_info:"回合结束阶段,你可选择一名其他角色,若如此做,直到你的下回合开始,所有角色对该角色使用的【杀】或【决斗】均视为对你使用。", - zhuxin:'诛心', - zhuxin_info:'出牌阶段限一次,你可以与一名其他角色拼点,若你赢,你对其造成1点伤害。', - wlianhuan:'连环', - wlianhuan_info:'你使用【杀】造成伤害时,可以弃置一张装备区内的牌并令伤害+1。', - liebo:'裂帛', - liebo_info:'出牌阶段限一次,你可以将你的手牌与一名其他角色交换(手牌数之差不能多于1)。', - yaoji:'妖姬', - yaoji_info:'每当你受到一次伤害,你可以将一张【乐不思蜀】置入伤害来源的判定区。', - guimian:'鬼面', - guimian_info:'锁定技,每当你在出牌阶段使用【杀】造成伤害,本阶段内出【杀】次数上限+1。', - lyuxue:'浴血', - lyuxue2:'浴血', - lyuxue_info:'锁定技,每当你造成一次伤害,若目标没有浴血标记,你令其获得一个浴血标记;当一名角色失去浴血标记时,其失去1点体力;准备阶段,若场上浴血标记的数量不少于存活角色数的一半(向下取整),你清空浴血标记;当你即将死亡时,你清空浴血标记。', - huli:'护理', - huli_info:'出牌阶段,你可以将一张红桃手牌当作【桃】对距离1以内的角色使用。', - yixin:'医心', - yixin_info:'限定技,你可以弃置两张牌,然后令一名已受伤角色回复X点体力并摸4-X张牌(X为该角色已损失的体力值且不超过4)。', - xianqu:'先驱', - xianqu_info:'锁定技,你不能成为点数小于8的杀的目标。', - zbudao:'布道', - zbudao_info:'摸牌阶段,你可以额外摸一张牌,然后将摸到的牌中的一张交给一名其他角色。', - taiji:'太极', - taiji_info:'每当你使用或打出一张【闪】,你可以使用一张【杀】。', - luobi:'落笔', - luobi_info:'结束阶段,可以摸数量等同于已损失体力值的牌,并以任意方式分配给任意角色。', - fengliu:'风流', - fengliu_info:'锁定技,摸牌阶段,你额外摸X张牌,X为存活女性角色数且不超过2。', - shiqin:'弑亲', - shiqin_info:'锁定技,其他群势力角色濒死时,你令其立即死亡。', - yjujian:'拒谏', - yjujian_info:'出牌阶段限一次,你可以交给一名其他角色一张牌,该角色的锦囊牌不能指定你为目标直到你的下一回合开始。', - yaoyi:'徭役', - yaoyi_info:'每当你受到一次伤害,你可以令至多2名非群势力角色交给你一张手牌。', - zyhufu:'胡服', - zyhufu_info:'锁定技,当你的装备区内没有防具牌时,你摸牌阶段额外摸一张牌;当你装备区内有防具牌时,你的手牌上限+5。', - hanbei:'捍北', - hanbei_info:'锁定技,你的装备区有马时,你的【杀】不可闪避。', - kuangchan:'狂禅', - kuangchan_info:'锁定技,你做主公时,不增加体力上限。', - yxsdili:'底力', + yxs_fanji: "反击", + yxs_fanji2: "反击", + yxs_fanji_info: + "当你受到【杀】或【决斗】造成的伤害后,你可以对伤害来源使用一张【杀】。若此【杀】为红色,其不可闪避。", + yxs_menshen: "门神", + yxs_menshen2: "门神", + yxs_menshen3: "门神", + yxs_menshen_info: + "回合结束阶段,你可选择一名其他角色,若如此做,直到你的下回合开始,所有角色对该角色使用的【杀】或【决斗】均视为对你使用。", + zhuxin: "诛心", + zhuxin_info: "出牌阶段限一次,你可以与一名其他角色拼点,若你赢,你对其造成1点伤害。", + wlianhuan: "连环", + wlianhuan_info: "你使用【杀】造成伤害时,可以弃置一张装备区内的牌并令伤害+1。", + liebo: "裂帛", + liebo_info: "出牌阶段限一次,你可以将你的手牌与一名其他角色交换(手牌数之差不能多于1)。", + yaoji: "妖姬", + yaoji_info: "每当你受到一次伤害,你可以将一张【乐不思蜀】置入伤害来源的判定区。", + guimian: "鬼面", + guimian_info: "锁定技,每当你在出牌阶段使用【杀】造成伤害,本阶段内出【杀】次数上限+1。", + lyuxue: "浴血", + lyuxue2: "浴血", + lyuxue_info: + "锁定技,每当你造成一次伤害,若目标没有浴血标记,你令其获得一个浴血标记;当一名角色失去浴血标记时,其失去1点体力;准备阶段,若场上浴血标记的数量不少于存活角色数的一半(向下取整),你清空浴血标记;当你即将死亡时,你清空浴血标记。", + huli: "护理", + huli_info: "出牌阶段,你可以将一张红桃手牌当作【桃】对距离1以内的角色使用。", + yixin: "医心", + yixin_info: + "限定技,你可以弃置两张牌,然后令一名已受伤角色回复X点体力并摸4-X张牌(X为该角色已损失的体力值且不超过4)。", + xianqu: "先驱", + xianqu_info: "锁定技,你不能成为点数小于8的杀的目标。", + zbudao: "布道", + zbudao_info: "摸牌阶段,你可以额外摸一张牌,然后将摸到的牌中的一张交给一名其他角色。", + taiji: "太极", + taiji_info: "每当你使用或打出一张【闪】,你可以使用一张【杀】。", + luobi: "落笔", + luobi_info: "结束阶段,可以摸数量等同于已损失体力值的牌,并以任意方式分配给任意角色。", + fengliu: "风流", + fengliu_info: "锁定技,摸牌阶段,你额外摸X张牌,X为存活女性角色数且不超过2。", + shiqin: "弑亲", + shiqin_info: "锁定技,其他群势力角色濒死时,你令其立即死亡。", + yjujian: "拒谏", + yjujian_info: + "出牌阶段限一次,你可以交给一名其他角色一张牌,该角色的锦囊牌不能指定你为目标直到你的下一回合开始。", + yaoyi: "徭役", + yaoyi_info: "每当你受到一次伤害,你可以令至多2名非群势力角色交给你一张手牌。", + zyhufu: "胡服", + zyhufu_info: + "锁定技,当你的装备区内没有防具牌时,你摸牌阶段额外摸一张牌;当你装备区内有防具牌时,你的手牌上限+5。", + hanbei: "捍北", + hanbei_info: "锁定技,你的装备区有马时,你的【杀】不可闪避。", + kuangchan: "狂禅", + kuangchan_info: "锁定技,你做主公时,不增加体力上限。", + yxsdili: "底力", // yxsdili_info:'锁定技,摸牌阶段,你额外摸X张牌,X为你已损失的体力值。', - yxsdili_info:'锁定技,摸牌阶段,你额外摸X张牌,X为你已损失的体力值的一半,向上取整且最多为2。', - chujia:'初嫁', - chujia_info:'出牌阶段限一次,你可以弃置两张相同颜色的手牌,指定任意一名角色摸X张牌。(X为该角色已损失的体力值)', - zhijie:'知节', - zhijie_info:'出牌阶段限一次,你的红桃手牌可以当做【无中生有】使用。', - baihe:'捭阖', - baihe_info:'出牌阶段限一次,你可以弃置一张牌,选择以下1项执行:(1)横置1名未横置角色,该角色摸一张牌;(2)重置一名已横置角色,该角色弃置一张手牌。', - yinyang:'阴阳', - yinyang_info:'出牌阶段限一次,你可以弃置两张手牌并选择3名角色,分别横置或重置这些角色。', - xiushen:'修身', + yxsdili_info: "锁定技,摸牌阶段,你额外摸X张牌,X为你已损失的体力值的一半,向上取整且最多为2。", + chujia: "初嫁", + chujia_info: + "出牌阶段限一次,你可以弃置两张相同颜色的手牌,指定任意一名角色摸X张牌。(X为该角色已损失的体力值)", + zhijie: "知节", + zhijie_info: "出牌阶段限一次,你的红桃手牌可以当做【无中生有】使用。", + baihe: "捭阖", + baihe_info: + "出牌阶段限一次,你可以弃置一张牌,选择以下1项执行:(1)横置1名未横置角色,该角色摸一张牌;(2)重置一名已横置角色,该角色弃置一张手牌。", + yinyang: "阴阳", + yinyang_info: "出牌阶段限一次,你可以弃置两张手牌并选择3名角色,分别横置或重置这些角色。", + xiushen: "修身", // xiushen_info:'锁定技,结束阶段,若场上有横置角色,你摸两张牌。', - xiushen_info:'锁定技,出牌阶段结束时,若场上有横置角色,你摸两张牌。', - yanyi:'演绎', - yanyi_info:'出牌阶段限一次,你可以弃置一张黑色牌,指定1名角色和1种花色,若被指定角色的手牌中含有此花色,则受到1点伤害。', - jiean:'结案', - jiean_info:'每当【演绎】造成伤害时,你可以摸X张牌,并以任意数量分配给任意角色(X为被【演绎】造成伤害角色的已损失体力值)。', - wumu:'武穆', - wumu_info:'锁定技,你的黑色【杀】无视距离,红色【杀】不计入回合内的出杀限制。', - ysheshen:'舍身', - ysheshen_info:'每当你受到1点伤害,可以观看牌堆顶的两张牌,并将其交给任意1~2名角色。', - sanbanfu:'三板斧', - sanbanfu_info:'当你对其他角色使用【杀】时,你可以使此【杀】有如下效果:若对方没有出【闪】,其受到2点伤害;若对方打出了一张【闪】,你与其各受到1点伤害;若对方打出了两张【闪】,你受到1点伤害。', - bingsheng:'兵圣', - bingsheng_info:'出牌阶段限一次,你可以弃置两张花色不同的手牌,指定一名其他角色使其体力值与你相同(体力最多变化2点)。', - taolue:'韬略', - taolue_info:'锁定技,你的手牌上限+1。', - shentan:'神探', - shentan_info:'出牌阶段限一次,你可以弃置一张牌,获得距离2以内的一名角色的手牌,并可以将其交给任意一名角色。', - hanqiang:'寒枪', - hanqiang_info:'锁定技,当你没装备武器时,攻击范围+1。', - biaoqi:'骠骑', - biaoqi_info:'锁定技,当你出【杀】指定目标后,若你的攻击范围大于目标体力值,则此【杀】不可闪避;若你的攻击范围小于目标体力值,你摸一张牌。', - wluoyan:'落雁', - wluoyan_info:'锁定技,你防止即将受到的伤害,改为失去1点体力。', - heqin:'和亲', - heqin2:'和亲', - heqin3:'和亲', - heqin_info:'限定技,你可以与场上一名男性角色形成【和亲】状态,你与该男性角色于摸牌阶段摸牌数+1。你或者男性角色阵亡时,【和亲】状态消失。', - chajue:'察觉', - chajue2:'察觉', - chajue_info:'锁定技,你的回合外,你每受到一次伤害,任何【杀】或普通锦囊牌均对你无效,直到你的回合开始。', - tiewan:'铁腕', - tiewan_info:'每当其他角色使用延时类锦囊牌时,你可以立即将一张红色牌当作【乐不思蜀】使用。', - qianglue:'强掠', - qianglue_info:'每当你的【杀】被闪避时,你可以进行一次判定,若结果为黑色,你可以获得对方的一张牌。', - xiadao:'侠盗', - xiadao_info:'每当你造成一次伤害,你可以令一名手牌数不少于受伤害角色的另一名角色获得其一张手牌。', - jimin:'机敏', - jimin_info:'当你的装备区内没有牌时,你可以将一张手牌当作【闪】使用或打出。', - sheshu:'射术', - sheshu_info:'锁定技,你的【杀】无视距离;体力值不小于3的角色不能闪避你的【杀】。', - tongyu:'统御', - tongyu_info:'出牌阶段,你可以弃置一张牌,并转变为罗宾汉(每回合只能转变一次)。', - lguiyin:'归隐', - lguiyin_info:'出牌阶段,若你本回合内未造成伤害,你可以摸一张牌,并转变为汉丁顿伯爵(每回合只能转变一次)。', - lzhangyi:'仗义', - lzhangyi_info:'你可以将你弃置的卡牌交给一名其他角色。', - yizhuang:'易装', - yizhuang2:'易装', - yizhuang_info:'准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害。', - kongju:'控局', - kongju_info:'锁定技,你的手牌上限为你的体力上限;当你的手牌数小于体力上限时,你不能成为过河拆桥或顺手牵羊的目标;当你的手牌数大于体力上限时,你不能成为乐不思蜀的目标。', - tuqiang:'图强', - tuqiang_info:'每当你使用或打出一张【闪】,你可以摸一张牌。', - zhensha:'鸩杀', - zhensha_info:'当场上有角色进入濒死状态时,你可以弃置一张【酒】或两张黑色手牌,则该角色立即死亡。', - xumou:'蓄谋', - xumou_info:'结束阶段,你可以将武将牌翻面并摸三张牌。', - guifu:'鬼斧', - guifu_info:'出牌阶段限一次,你可以指定一名角色装备区内的一张牌,将其弃掉,自己和对方同时摸取一张牌。', - lshengong:'神工', - lshengong_info:'出牌阶段限一次,你可以选定场上任意一名角色的装备区的非特殊牌,出自己的一张手牌复制该装备,然后可以选择装备上自己或者别的角色的装备区。', - zhexian:'谪仙', - zhexian_info:'当你于一名其他角色的回合内首次失去牌时,你可以摸一张牌。', - miaobi:'妙笔', - miaobi_info:'出牌阶段限一次,你可以弃置一名其他角色的一张牌,若此牌是基本牌或普通锦囊,你可以将一张手牌当此牌使用;否则你须弃置一张牌。', - cike:'刺客', - cike_info:'你对别的角色出【杀】时可以选择做一次判定:若判定牌为红色花色,则此【杀】不可回避,直接命中;若判定牌为黑色花色,你可以选择弃掉对方一张牌。', - qiangyun:'强运', - qiangyun_info:'每当你失去最后一张手牌,可摸两张牌。', - ducai:'独裁', - ducai2:'独裁', - ducai3:'独裁', - ducai_info:'出牌阶段限一次,你可以弃置一张牌,则本轮内除你外的角色不能使用或打出与该手牌花色相同的手牌。', - tongling:'统领', - tongling_info:'锁定技,每当一名友方角色造成一次伤害,你获得1个统领标记(标记上限为3)。', - fanpu:'反扑', - fanpu_info:'出牌阶段限一次,你可以移去3枚统领标记并视为对攻击范围内的至多3名角色使用一张【杀】。', - fenghuo:'烽火', - fenghuo_info:'你可以将一张装备区内的牌当作【南蛮入侵】使用。', - yxsweiyi:'威仪', - yxsweiyi_info:'每当你受到一次伤害,可以令伤害来源弃置两张牌。', - xieling:'挟令', - xieling_info:'出牌阶段,弃掉两张手牌,将任意一名角色装备区或判定区的牌移动到另一名角色对应的区域。', - baye:'霸业', - baye_info:'出牌阶段,你可以将一张牌当做本回合内前一张使用的牌来使用。每回合限用一次。', - nvquan:'女权', - nvquan1:'女权', - nvquan2:'女权', - nvquan_info:'你对男性角色使用【杀】或【决斗】时,对方需连续打出两张【闪】或【杀】响应;你不能成为男性角色的决斗目标。', - qiandu:'迁都', - qiandu_info:'出牌阶段,你可以弃一张黑色手牌,和一名存活的玩家与其交换位置。每回合限一次。', - budao:'补刀', - budao_info:'你的回合外,你的攻击范围的一名角色受到【杀】的伤害时,你可以对其使用一张【杀】,只要你的【杀】对目标角色造成了伤害,你就可以继续对其使用【杀】。', - feigong:'非攻', - feigong_info:'其他角色使用【杀】时,若你不是【杀】的目标,可以弃置一张【杀】取消之。', - jianai:'兼爱', - jianai_info:'每当你回复1点体力,可以令所有其他角色回复1点体力。', - bolehuiyan:'慧眼', - bolehuiyan_info:'当一名有手牌的其他角色成为来源不为你的杀的目标时,你可以预言此杀能否命中,若预言正确,你摸一张牌,否则你须弃置一张牌。每回合限发动一次。', - xiangma:'相马', - xiangma_info:'锁定技,只要你的体力值大于2点,你的进攻距离+1;只要你的体力值为2点或更低,你的防御距离+1。', - seyou:'色诱', - seyou_info:'限定技,出牌阶段,你可以指定任意1名角色,其他所有男性角色需选择1项执行:(1)对你指定的角色出【杀】;(2)令你获得其一张牌。', - sheshi:'蛇噬', - sheshi_info:'每受到1次伤害,可以指定1种花色,依次展示牌堆顶的牌,直到出现指定花色的牌为止,你获得与指定花色不同花色的所有牌(最多展示四张牌)。', + xiushen_info: "锁定技,出牌阶段结束时,若场上有横置角色,你摸两张牌。", + yanyi: "演绎", + yanyi_info: + "出牌阶段限一次,你可以弃置一张黑色牌,指定1名角色和1种花色,若被指定角色的手牌中含有此花色,则受到1点伤害。", + jiean: "结案", + jiean_info: + "每当【演绎】造成伤害时,你可以摸X张牌,并以任意数量分配给任意角色(X为被【演绎】造成伤害角色的已损失体力值)。", + wumu: "武穆", + wumu_info: "锁定技,你的黑色【杀】无视距离,红色【杀】不计入回合内的出杀限制。", + ysheshen: "舍身", + ysheshen_info: "每当你受到1点伤害,可以观看牌堆顶的两张牌,并将其交给任意1~2名角色。", + sanbanfu: "三板斧", + sanbanfu_info: + "当你对其他角色使用【杀】时,你可以使此【杀】有如下效果:若对方没有出【闪】,其受到2点伤害;若对方打出了一张【闪】,你与其各受到1点伤害;若对方打出了两张【闪】,你受到1点伤害。", + bingsheng: "兵圣", + bingsheng_info: + "出牌阶段限一次,你可以弃置两张花色不同的手牌,指定一名其他角色使其体力值与你相同(体力最多变化2点)。", + taolue: "韬略", + taolue_info: "锁定技,你的手牌上限+1。", + shentan: "神探", + shentan_info: + "出牌阶段限一次,你可以弃置一张牌,获得距离2以内的一名角色的手牌,并可以将其交给任意一名角色。", + hanqiang: "寒枪", + hanqiang_info: "锁定技,当你没装备武器时,攻击范围+1。", + biaoqi: "骠骑", + biaoqi_info: + "锁定技,当你出【杀】指定目标后,若你的攻击范围大于目标体力值,则此【杀】不可闪避;若你的攻击范围小于目标体力值,你摸一张牌。", + wluoyan: "落雁", + wluoyan_info: "锁定技,你防止即将受到的伤害,改为失去1点体力。", + heqin: "和亲", + heqin2: "和亲", + heqin3: "和亲", + heqin_info: + "限定技,你可以与场上一名男性角色形成【和亲】状态,你与该男性角色于摸牌阶段摸牌数+1。你或者男性角色阵亡时,【和亲】状态消失。", + chajue: "察觉", + chajue2: "察觉", + chajue_info: + "锁定技,你的回合外,你每受到一次伤害,任何【杀】或普通锦囊牌均对你无效,直到你的回合开始。", + tiewan: "铁腕", + tiewan_info: "每当其他角色使用延时类锦囊牌时,你可以立即将一张红色牌当作【乐不思蜀】使用。", + qianglue: "强掠", + qianglue_info: + "每当你的【杀】被闪避时,你可以进行一次判定,若结果为黑色,你可以获得对方的一张牌。", + xiadao: "侠盗", + xiadao_info: "每当你造成一次伤害,你可以令一名手牌数不少于受伤害角色的另一名角色获得其一张手牌。", + jimin: "机敏", + jimin_info: "当你的装备区内没有牌时,你可以将一张手牌当作【闪】使用或打出。", + sheshu: "射术", + sheshu_info: "锁定技,你的【杀】无视距离;体力值不小于3的角色不能闪避你的【杀】。", + tongyu: "统御", + tongyu_info: "出牌阶段,你可以弃置一张牌,并转变为罗宾汉(每回合只能转变一次)。", + lguiyin: "归隐", + lguiyin_info: + "出牌阶段,若你本回合内未造成伤害,你可以摸一张牌,并转变为汉丁顿伯爵(每回合只能转变一次)。", + lzhangyi: "仗义", + lzhangyi_info: "你可以将你弃置的卡牌交给一名其他角色。", + yizhuang: "易装", + yizhuang2: "易装", + yizhuang_info: + "准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害。", + kongju: "控局", + kongju_info: + "锁定技,你的手牌上限为你的体力上限;当你的手牌数小于体力上限时,你不能成为过河拆桥或顺手牵羊的目标;当你的手牌数大于体力上限时,你不能成为乐不思蜀的目标。", + tuqiang: "图强", + tuqiang_info: "每当你使用或打出一张【闪】,你可以摸一张牌。", + zhensha: "鸩杀", + zhensha_info: + "当场上有角色进入濒死状态时,你可以弃置一张【酒】或两张黑色手牌,则该角色立即死亡。", + xumou: "蓄谋", + xumou_info: "结束阶段,你可以将武将牌翻面并摸三张牌。", + guifu: "鬼斧", + guifu_info: + "出牌阶段限一次,你可以指定一名角色装备区内的一张牌,将其弃掉,自己和对方同时摸取一张牌。", + lshengong: "神工", + lshengong_info: + "出牌阶段限一次,你可以选定场上任意一名角色的装备区的非特殊牌,出自己的一张手牌复制该装备,然后可以选择装备上自己或者别的角色的装备区。", + zhexian: "谪仙", + zhexian_info: "当你于一名其他角色的回合内首次失去牌时,你可以摸一张牌。", + miaobi: "妙笔", + miaobi_info: + "出牌阶段限一次,你可以弃置一名其他角色的一张牌,若此牌是基本牌或普通锦囊,你可以将一张手牌当此牌使用;否则你须弃置一张牌。", + cike: "刺客", + cike_info: + "你对别的角色出【杀】时可以选择做一次判定:若判定牌为红色花色,则此【杀】不可回避,直接命中;若判定牌为黑色花色,你可以选择弃掉对方一张牌。", + qiangyun: "强运", + qiangyun_info: "每当你失去最后一张手牌,可摸两张牌。", + ducai: "独裁", + ducai2: "独裁", + ducai3: "独裁", + ducai_info: + "出牌阶段限一次,你可以弃置一张牌,则本轮内除你外的角色不能使用或打出与该手牌花色相同的手牌。", + tongling: "统领", + tongling_info: "锁定技,每当一名友方角色造成一次伤害,你获得1个统领标记(标记上限为3)。", + fanpu: "反扑", + fanpu_info: + "出牌阶段限一次,你可以移去3枚统领标记并视为对攻击范围内的至多3名角色使用一张【杀】。", + fenghuo: "烽火", + fenghuo_info: "你可以将一张装备区内的牌当作【南蛮入侵】使用。", + yxsweiyi: "威仪", + yxsweiyi_info: "每当你受到一次伤害,可以令伤害来源弃置两张牌。", + xieling: "挟令", + xieling_info: + "出牌阶段,弃掉两张手牌,将任意一名角色装备区或判定区的牌移动到另一名角色对应的区域。", + baye: "霸业", + baye_info: "出牌阶段,你可以将一张牌当做本回合内前一张使用的牌来使用。每回合限用一次。", + nvquan: "女权", + nvquan1: "女权", + nvquan2: "女权", + nvquan_info: + "你对男性角色使用【杀】或【决斗】时,对方需连续打出两张【闪】或【杀】响应;你不能成为男性角色的决斗目标。", + qiandu: "迁都", + qiandu_info: "出牌阶段,你可以弃一张黑色手牌,和一名存活的玩家与其交换位置。每回合限一次。", + budao: "补刀", + budao_info: + "你的回合外,你的攻击范围的一名角色受到【杀】的伤害时,你可以对其使用一张【杀】,只要你的【杀】对目标角色造成了伤害,你就可以继续对其使用【杀】。", + feigong: "非攻", + feigong_info: "其他角色使用【杀】时,若你不是【杀】的目标,可以弃置一张【杀】取消之。", + jianai: "兼爱", + jianai_info: "每当你回复1点体力,可以令所有其他角色回复1点体力。", + bolehuiyan: "慧眼", + bolehuiyan_info: + "当一名有手牌的其他角色成为来源不为你的杀的目标时,你可以预言此杀能否命中,若预言正确,你摸一张牌,否则你须弃置一张牌。每回合限发动一次。", + xiangma: "相马", + xiangma_info: + "锁定技,只要你的体力值大于2点,你的进攻距离+1;只要你的体力值为2点或更低,你的防御距离+1。", + seyou: "色诱", + seyou_info: + "限定技,出牌阶段,你可以指定任意1名角色,其他所有男性角色需选择1项执行:(1)对你指定的角色出【杀】;(2)令你获得其一张牌。", + sheshi: "蛇噬", + sheshi_info: + "每受到1次伤害,可以指定1种花色,依次展示牌堆顶的牌,直到出现指定花色的牌为止,你获得与指定花色不同花色的所有牌(最多展示四张牌)。", - fengyi:'凤仪', - fengyi_info:'出牌阶段,你可以弃一张手牌,指定任意目标摸两张牌。(每回合限用一次)', - wange:'婉歌', - wange_info:'摸牌时,你可以少摸一张牌,则结束阶段你可以抽取一名其他角色的手牌,至少1张,至多X张(X为你当前的掉血量)。', - nichang:'霓裳', - nichang2:'霓裳', - nichang_info:'摸牌时,你可以选择不摸牌,并在结束阶段展示手牌,每少一种花色摸一张牌。', - fengyan:'丰艳', - fengyan_info:'你可以获得其他男性角色的红色判定牌。', - zhulu:'逐鹿', - zhulu_info:'回合外,当有普通锦囊牌结算完毕后,你可以立即弃掉一张相同花色手牌或装备区的牌,获得这张锦囊牌。', - jieyong:'节用', - jieyong2:'节用', - jieyong_info:'你使用的卡牌结算完成后,你可以弃置一张黑色牌并重新获得之。(每回合限一次)', - shangtong:'尚同', - shangtong_info:'每当你令其他角色恢复1点血量或掉1点血量时,你可以摸一张牌(摸牌上限为4)。', - feiming:'非命', - feiming_info:'其他角色对你造成伤害时,你可以令该角色须选择1项执行:1,将1张红桃花色手牌交给你;2,失去1点血量。', - yxsrenwang:'人望', - yxsrenwang_info:'出牌阶段,你可以弃置两张牌并指定一名手牌数大于你的角色,你摸牌至与该角色手牌数相等,每阶段限一次。', - shiwei:'施威', - shiwei_info:'当其他角色失去最后一张手牌时,你可以将牌堆顶的一张牌背面朝上置于该角色面前,该角色回合,跳过出牌阶段并弃掉这张牌。', - yxswushuang:'无双', - yxswushuang_info:'出牌阶段,你使用【杀】时可同时打出两张【杀】,则该【杀】具有以下效果之一:1,伤害+1;2,额外指定两个目标。', - xiaoyong:'骁勇', - xiaoyong_info:'你可以将黑色手牌当作【杀】来使用。', - yxsqinzheng:'亲征', - yxsqinzheng_info:'出牌阶段,你对其他角色造成伤害时,可以令场上任意角色摸一张牌。', - juma:'拒马', - juma_info:'你与其他角色的距离始终视为1。', + fengyi: "凤仪", + fengyi_info: "出牌阶段,你可以弃一张手牌,指定任意目标摸两张牌。(每回合限用一次)", + wange: "婉歌", + wange_info: + "摸牌时,你可以少摸一张牌,则结束阶段你可以抽取一名其他角色的手牌,至少1张,至多X张(X为你当前的掉血量)。", + nichang: "霓裳", + nichang2: "霓裳", + nichang_info: "摸牌时,你可以选择不摸牌,并在结束阶段展示手牌,每少一种花色摸一张牌。", + fengyan: "丰艳", + fengyan_info: "你可以获得其他男性角色的红色判定牌。", + zhulu: "逐鹿", + zhulu_info: + "回合外,当有普通锦囊牌结算完毕后,你可以立即弃掉一张相同花色手牌或装备区的牌,获得这张锦囊牌。", + jieyong: "节用", + jieyong2: "节用", + jieyong_info: "你使用的卡牌结算完成后,你可以弃置一张黑色牌并重新获得之。(每回合限一次)", + shangtong: "尚同", + shangtong_info: "每当你令其他角色恢复1点血量或掉1点血量时,你可以摸一张牌(摸牌上限为4)。", + feiming: "非命", + feiming_info: + "其他角色对你造成伤害时,你可以令该角色须选择1项执行:1,将1张红桃花色手牌交给你;2,失去1点血量。", + yxsrenwang: "人望", + yxsrenwang_info: + "出牌阶段,你可以弃置两张牌并指定一名手牌数大于你的角色,你摸牌至与该角色手牌数相等,每阶段限一次。", + shiwei: "施威", + shiwei_info: + "当其他角色失去最后一张手牌时,你可以将牌堆顶的一张牌背面朝上置于该角色面前,该角色回合,跳过出牌阶段并弃掉这张牌。", + yxswushuang: "无双", + yxswushuang_info: + "出牌阶段,你使用【杀】时可同时打出两张【杀】,则该【杀】具有以下效果之一:1,伤害+1;2,额外指定两个目标。", + xiaoyong: "骁勇", + xiaoyong_info: "你可以将黑色手牌当作【杀】来使用。", + yxsqinzheng: "亲征", + yxsqinzheng_info: "出牌阶段,你对其他角色造成伤害时,可以令场上任意角色摸一张牌。", + juma: "拒马", + juma_info: "你与其他角色的距离始终视为1。", }, }; }); diff --git a/character/zhuogui.js b/character/zhuogui.js index a338621ec..87c5a2958 100644 --- a/character/zhuogui.js +++ b/character/zhuogui.js @@ -1,342 +1,343 @@ -import { lib, game, ui, get, ai, _status } from '../noname.js'; -game.import('character', function () { - return { - name:'zhuogui', - character:{ - nianshou:['male','shu',4,['nianrui','qixiang']], - mamian:['male','qun',4,['lianyu','guiji']], - niutou:['male','shu',4,['manjia','xiaoshou']], - baiwuchang:['male','qun',3,['qiangzheng','moukui']], - heiwuchang:['male','qun',3,['suoling','xixing']], - }, - skill:{ - qixiang:{ - group:['qixiang1','qixiang2'], - ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='lebu'&&card.name=='bingliang') return 0.8; - } - } - } - }, - qixiang1:{ - trigger:{player:'judge'}, - forced:true, - filter:function(event,player){ - if(event.card){ - if(event.card.viewAs){ - return event.card.viewAs=='lebu'; - } - else{ - return event.card.name=='lebu'; - } - } - }, - content:function(){ - player.addTempSkill('qixiang3','phaseJudgeAfter'); - } - }, - qixiang2:{ - trigger:{player:'judge'}, - forced:true, - filter:function(event,player){ - if(event.card){ - if(event.card.viewAs){ - return event.card.viewAs=='bingliang'; - } - else{ - return event.card.name=='bingliang'; - } - } - }, - content:function(){ - player.addTempSkill('qixiang4','phaseJudgeAfter'); - } - }, - qixiang3:{ - mod:{ - suit:function(card,suit){ - if(suit=='diamond') return 'heart'; - } - } - }, - qixiang4:{ - mod:{ - suit:function(card,suit){ - if(suit=='spade') return 'club'; - } - } - }, - nianrui:{ - trigger:{player:['phaseBegin','phaseEnd']}, - content:function(){ - "step 0" - player.judge(function(card){ - return get.color(card)=='red'?1:0; - }); - "step 1" - if(result.bool){ - player.draw(); - } - } - }, - lianyu:{ - enable:'phaseUse', - usable:1, - filterCard:{color:'red'}, - check:function(card){return 6-get.value(card)}, - filterTarget:true, - selectTarget:-1, - line:'fire', - content:function(){ - target.damage('fire'); - }, - ai:{ - result:{ - player:function(card,player,target){ - var eff=0; - for(var i=0;iplayers[1].hp&&players[0]!=player; - }, - check:function(event,player){ - var players=game.players.slice(0); - players.sort(function(a,b){ - return b.hp-a.hp; - }); - return get.damageEffect(players[0],player,player,'fire')>0; - }, - prompt:function(){ - var players=game.players.slice(0); - players.sort(function(a,b){ - return b.hp-a.hp; - }); - return '枭首:是否对'+get.translation(players[0])+'造成1点火焰伤害?'; - }, - content:function(){ - var players=game.players.slice(0); - players.sort(function(a,b){ - return b.hp-a.hp; - }); - if(players[0].hp>players[1].hp&&players[0]!=player){ - players[0].damage('fire'); - player.line(players[0],'fire'); - } - }, - ai:{ - expose:0.2 - } - }, - guiji:{ - trigger:{player:'phaseJudgeBegin'}, - forced:true, - content:function(){ - player.discard(player.getCards('j').randomGet()); - }, - filter:function(event ,player){ - return player.countCards('j')>0; - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='delay'&&target.countCards('j')==0) return 0.1; - } - } - } - }, - qiangzheng:{ - audio:2, - trigger:{player:'phaseEnd'}, - direct:true, - forced:true, - filter:function(event,player){ - for(var i=0;i0; - }).ai=function(target){ - return -get.attitude(player,target); - }; - "step 1" - if(result.targets&&result.targets.length){ - player.logSkill('qiangzheng',result.targets); - player.gain(result.targets[0].getCards('h').randomGet(),result.targets[0]); - result.targets[0].$give(1,player); - game.delay(); - } - }, - ai:{ - threaten:1.7 - } - }, - suoling:{ - trigger:{player:'phaseEnd'}, - forced:true, - filter:function(event,player){ - if(player.isLinked()) return true; - for(var i=0;i players[1].hp && players[0] != player; + }, + check: function (event, player) { + var players = game.players.slice(0); + players.sort(function (a, b) { + return b.hp - a.hp; + }); + return get.damageEffect(players[0], player, player, "fire") > 0; + }, + prompt: function () { + var players = game.players.slice(0); + players.sort(function (a, b) { + return b.hp - a.hp; + }); + return "枭首:是否对" + get.translation(players[0]) + "造成1点火焰伤害?"; + }, + content: function () { + var players = game.players.slice(0); + players.sort(function (a, b) { + return b.hp - a.hp; + }); + if (players[0].hp > players[1].hp && players[0] != player) { + players[0].damage("fire"); + player.line(players[0], "fire"); + } + }, + ai: { + expose: 0.2, + }, + }, + guiji: { + trigger: { player: "phaseJudgeBegin" }, + forced: true, + content: function () { + player.discard(player.getCards("j").randomGet()); + }, + filter: function (event, player) { + return player.countCards("j") > 0; + }, + ai: { + effect: { + target: function (card, player, target, current) { + if (get.type(card) == "delay" && target.countCards("j") == 0) return 0.1; + }, + }, + }, + }, + qiangzheng: { + audio: 2, + trigger: { player: "phaseEnd" }, + direct: true, + forced: true, + filter: function (event, player) { + for (var i = 0; i < game.players.length; i++) { + if (game.players[i] != player && game.players[i].countCards("h")) return true; + } + return false; + }, + content: function () { + "step 0"; + player.chooseTarget("获得一名角色的一张手牌", true, function (card, player, target) { + return player != target && target.countCards("h") > 0; + }).ai = function (target) { + return -get.attitude(player, target); + }; + ("step 1"); + if (result.targets && result.targets.length) { + player.logSkill("qiangzheng", result.targets); + player.gain(result.targets[0].getCards("h").randomGet(), result.targets[0]); + result.targets[0].$give(1, player); + game.delay(); + } + }, + ai: { + threaten: 1.7, + }, + }, + suoling: { + trigger: { player: "phaseEnd" }, + forced: true, + filter: function (event, player) { + if (player.isLinked()) return true; + for (var i = 0; i < game.players.length; i++) { + if (game.players[i] != player && !game.players[i].isLinked()) { + return true; + } + } + return false; + }, + content: function () { + "step 0"; + event.targets = game.players.slice(0); + event.targets.remove(player); + event.targets.sort(lib.sort.seat); + if (player.isLinked()) player.link(); + ("step 1"); + if (event.targets.length) { + var target = event.targets.shift(); + if (!target.isLinked()) { + target.link(); + } + event.redo(); + } + }, + }, + xixing: { + enable: "phaseUse", + usable: 1, + filterCard: function (card) { + var type = get.type(card); + for (var i = 0; i < ui.selected.cards.length; i++) { + if (get.type(ui.selected.cards[i]) == type) return false; + } + return true; + }, + complexCard: true, + selectCard: 3, + position: "he", + filterTarget: function (card, player, target) { + return player != target; + }, + check: function (card) { + if (_status.event.player.hp == _status.event.player.maxHp) { + return 5 - get.value(card); + } + return 10 - get.value(card); + }, + content: function () { + "step 0"; + target.damage(); + ("step 1"); + player.recover(); + }, + ai: { + order: 9.5, + result: { + target: function (player, target) { + return get.damageEffect(target, player); + }, + }, + expose: 0.2, + }, + }, + }, + translate: { + nianshou: "年兽", + nianrui: "年瑞", + qixiang: "祺祥", + qixiang1: "祺祥", + qixiang2: "祺祥", + nianrui_info: "准备阶段和结束阶段,你可以进行一次判定,若结果为红色则摸一张牌。", + qixiang_info: "乐不思蜀判定时,你的方块判定牌视为红桃;兵粮寸断判定时,你的黑桃判定牌视为草花。", + + mamian: "马面", + lianyu: "炼狱", + lianyu_info: "出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害。", + + niutou: "牛头", + manjia: "蛮甲", + manjia1: "蛮甲", + manjia2: "蛮甲", + manjia_info: "锁定技,若你的装备区内没有防具牌,则你视为装备了【藤甲】。", + xiaoshou: "枭首", + xiaoshou_info: "结束阶段,若场上体力值最多的角色只有一个,你可以对其造成1点火焰伤害。", + guiji: "诡计", + guiji_info: "锁定技,准备阶段结束时,若你的判定区内有牌,你随机弃置其中一张牌。", + + baiwuchang: "白无常", + qiangzheng: "强征", + qiangzheng_info: "锁定技,结束阶段,你获得一名其他角色的一张手牌。", + zuijiu: "醉酒", + zuijiu_info: "锁定技,你的黑杀造成的伤害+1,造成伤害后须弃置一张手牌。", + + heiwuchang: "黑无常", + suoling: "索令", + suoling_info: "锁定技,结束阶段,你解除横置状态,除你之外的所有角色进入横置状态。", + xixing: "吸星", + xixing_info: + "出牌阶段限一次,你可以弃置三张不同类别的牌,对一名其他角色造成1点伤害,然后回复1点体力。", + }, + }; +});